ResourceLoaderContext instance is deprecated.
* ResourceLoader::getLessCompiler() now takes an optional parameter of
additional LESS variables to set for the compiler.
+* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly instead.
== Compatibility ==
--- /dev/null
+require 'bundler/setup'
+
+require 'rubocop/rake_task'
+RuboCop::RakeTask.new(:rubocop) do |task|
+ # if you use mediawiki-vagrant, rubocop will by default use it's .rubocop.yml
+ # the next line makes it explicit that you want .rubocop.yml from the directory
+ # where `bundle exec rake` is executed
+ task.options = ['-c', '.rubocop.yml']
+end
+
+task default: [:test]
+
+desc 'Run all build/tests commands (CI entry point)'
+task test: [:rubocop]
'BenchIfSwitch' => __DIR__ . '/maintenance/benchmarks/bench_if_switch.php',
'BenchStrtrStrReplace' => __DIR__ . '/maintenance/benchmarks/bench_strtr_str_replace.php',
'BenchUtf8TitleCheck' => __DIR__ . '/maintenance/benchmarks/bench_utf8_title_check.php',
- 'BenchWfBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_wfBaseConvert.php',
+ 'BenchWikimediaBaseConvert' => __DIR__ . '/maintenance/benchmarks/bench_Wikimedia_base_convert.php',
'BenchWfIsWindows' => __DIR__ . '/maintenance/benchmarks/bench_wfIsWindows.php',
'BenchmarkDeleteTruncate' => __DIR__ . '/maintenance/benchmarks/bench_delete_truncate.php',
'BenchmarkHooks' => __DIR__ . '/maintenance/benchmarks/benchmarkHooks.php',
"ext-iconv": "*",
"liuggio/statsd-php-client": "1.0.16",
"mediawiki/at-ease": "1.1.0",
- "oojs/oojs-ui": "0.13.3",
+ "oojs/oojs-ui": "0.14.0",
"oyejorge/less.php": "1.7.0.9",
"php": ">=5.3.3",
"psr/log": "1.0.0",
if ( $block->getType() == self::TYPE_RANGE ) {
# This is the number of bits that are allowed to vary in the block, give
# or take some floating point errors
- $end = wfBaseconvert( $block->getRangeEnd(), 16, 10 );
- $start = wfBaseconvert( $block->getRangeStart(), 16, 10 );
+ $end = Wikimedia\base_convert( $block->getRangeEnd(), 16, 10 );
+ $start = Wikimedia\base_convert( $block->getRangeStart(), 16, 10 );
$size = log( $end - $start + 1, 2 );
# This has the nice property that a /32 block is ranked equally with a
* Supports base 2 through 36; digit values 10-36 are represented
* as lowercase letters a-z. Input is case-insensitive.
*
+ * @deprecated 1.27 Use Wikimedia\base_convert() directly
+ *
* @param string $input Input number
* @param int $sourceBase Base of the input number
* @param int $destBase Desired base of the output
*/
function getSha1() {
if ( $this->sha1base36 ) {
- return wfBaseConvert( $this->sha1base36, 36, 16 );
+ return Wikimedia\base_convert( $this->sha1base36, 36, 16 );
}
return false;
}
* @return string
*/
public static function base36Sha1( $text ) {
- return wfBaseConvert( sha1( $text ), 16, 36, 31 );
+ return Wikimedia\base_convert( sha1( $text ), 16, 36, 31 );
}
/**
* @ingroup API
*/
abstract class ApiBase extends ContextSource {
- // These constants allow modules to specify exactly how to treat incoming parameters.
- // Default value of the parameter
+ /**
+ * @name Constants for ::getAllowedParams() arrays
+ * These constants are keys in the arrays returned by ::getAllowedParams()
+ * and accepted by ::getParameterFromSettings() that define how the
+ * parameters coming in from the request are to be interpreted.
+ * @{
+ */
+
+ /** (null|boolean|integer|string) Default value of the parameter. */
const PARAM_DFLT = 0;
- // Boolean, do we accept more than one item for this parameter (e.g.: titles)?
+
+ /** (boolean) Accept multiple pipe-separated values for this parameter (e.g. titles)? */
const PARAM_ISMULTI = 1;
- // Can be either a string type (e.g.: 'integer') or an array of allowed values
+
+ /**
+ * (string|string[]) Either an array of allowed value strings, or a string
+ * type as described below. If not specified, will be determined from the
+ * type of PARAM_DFLT.
+ *
+ * Supported string types are:
+ * - boolean: A boolean parameter, returned as false if the parameter is
+ * omitted and true if present (even with a falsey value, i.e. it works
+ * like HTML checkboxes). PARAM_DFLT must be boolean false, if specified.
+ * Cannot be used with PARAM_ISMULTI.
+ * - integer: An integer value. See also PARAM_MIN, PARAM_MAX, and
+ * PARAM_RANGE_ENFORCE.
+ * - limit: An integer or the string 'max'. Default lower limit is 0 (but
+ * see PARAM_MIN), and requires that PARAM_MAX and PARAM_MAX2 be
+ * specified. Cannot be used with PARAM_ISMULTI.
+ * - namespace: An integer representing a MediaWiki namespace.
+ * - NULL: Any string.
+ * - password: Any non-empty string. Input value is private or sensitive.
+ * <input type="password"> would be an appropriate HTML form field.
+ * - string: Any non-empty string, not expected to be very long or contain newlines.
+ * <input type="text"> would be an appropriate HTML form field.
+ * - submodule: The name of a submodule of this module, see PARAM_SUBMODULE_MAP.
+ * - text: Any non-empty string, expected to be very long or contain newlines.
+ * <textarea> would be an appropriate HTML form field.
+ * - timestamp: A timestamp in any format recognized by MWTimestamp, or the
+ * string 'now' representing the current timestamp. Will be returned in
+ * TS_MW format.
+ * - user: A MediaWiki username. Will be returned normalized but not canonicalized.
+ * - upload: An uploaded file. Will be returned as a WebRequestUpload object.
+ * Cannot be used with PARAM_ISMULTI.
+ */
const PARAM_TYPE = 2;
- // Max value allowed for a parameter. Only applies if TYPE='integer'
+
+ /** (integer) Max value allowed for the parameter, for PARAM_TYPE 'integer' and 'limit'. */
const PARAM_MAX = 3;
- // Max value allowed for a parameter for bots and sysops. Only applies if TYPE='integer'
+
+ /**
+ * (integer) Max value allowed for the parameter for users with the
+ * apihighlimits right, for PARAM_TYPE 'limit'.
+ */
const PARAM_MAX2 = 4;
- // Lowest value allowed for a parameter. Only applies if TYPE='integer'
+
+ /** (integer) Lowest value allowed for the parameter, for PARAM_TYPE 'integer' and 'limit'. */
const PARAM_MIN = 5;
- // Boolean, do we allow the same value to be set more than once when ISMULTI=true
+
+ /** (boolean) Allow the same value to be set more than once when PARAM_MULTI is true? */
const PARAM_ALLOW_DUPLICATES = 6;
- // Boolean, is the parameter deprecated (will show a warning)
+
+ /** (boolean) Is the parameter deprecated (will show a warning)? */
const PARAM_DEPRECATED = 7;
- /// @since 1.17
- const PARAM_REQUIRED = 8; // Boolean, is the parameter required?
- /// @since 1.17
- // Boolean, if MIN/MAX are set, enforce (die) these?
- // Only applies if TYPE='integer' Use with extreme caution
+
+ /**
+ * (boolean) Is the parameter required?
+ * @since 1.17
+ */
+ const PARAM_REQUIRED = 8;
+
+ /**
+ * (boolean) For PARAM_TYPE 'integer', enforce PARAM_MIN and PARAM_MAX?
+ * @since 1.17
+ */
const PARAM_RANGE_ENFORCE = 9;
- /// @since 1.25
- // Specify an alternative i18n message for this help parameter.
- // Value is $msg for ApiBase::makeMessage()
+
+ /**
+ * (string|array|Message) Specify an alternative i18n documentation message
+ * for this parameter. Default is apihelp-{$path}-param-{$param}.
+ * @since 1.25
+ */
const PARAM_HELP_MSG = 10;
- /// @since 1.25
- // Specify additional i18n messages to append to the normal message. Value
- // is an array of $msg for ApiBase::makeMessage()
+
+ /**
+ * ((string|array|Message)[]) Specify additional i18n messages to append to
+ * the normal message for this parameter.
+ * @since 1.25
+ */
const PARAM_HELP_MSG_APPEND = 11;
- /// @since 1.25
- // Specify additional information tags for the parameter. Value is an array
- // of arrays, with the first member being the 'tag' for the info and the
- // remaining members being the values. In the help, this is formatted using
- // apihelp-{$path}-paraminfo-{$tag}, which is passed $1 = count, $2 =
- // comma-joined list of values, $3 = module prefix.
+
+ /**
+ * (array) Specify additional information tags for the parameter. Value is
+ * an array of arrays, with the first member being the 'tag' for the info
+ * and the remaining members being the values. In the help, this is
+ * formatted using apihelp-{$path}-paraminfo-{$tag}, which is passed
+ * $1 = count, $2 = comma-joined list of values, $3 = module prefix.
+ * @since 1.25
+ */
const PARAM_HELP_MSG_INFO = 12;
- /// @since 1.25
- // When PARAM_TYPE is an array, this may be an array mapping those values
- // to page titles which will be linked in the help.
+
+ /**
+ * (string[]) When PARAM_TYPE is an array, this may be an array mapping
+ * those values to page titles which will be linked in the help.
+ * @since 1.25
+ */
const PARAM_VALUE_LINKS = 13;
- /// @since 1.25
- // When PARAM_TYPE is an array, this is an array mapping those values to
- // $msg for ApiBase::makeMessage(). Any value not having a mapping will use
- // apihelp-{$path}-paramvalue-{$param}-{$value} is used.
+
+ /**
+ * ((string|array|Message)[]) When PARAM_TYPE is an array, this is an array
+ * mapping those values to $msg for ApiBase::makeMessage(). Any value not
+ * having a mapping will use apihelp-{$path}-paramvalue-{$param}-{$value}.
+ * @since 1.25
+ */
const PARAM_HELP_MSG_PER_VALUE = 14;
- /// @since 1.26
- // When PARAM_TYPE is 'submodule', map parameter values to submodule paths.
- // Default is to use all modules in $this->getModuleManager() in the group
- // matching the parameter name.
+
+ /**
+ * (string[]) When PARAM_TYPE is 'submodule', map parameter values to
+ * submodule paths. Default is to use all modules in
+ * $this->getModuleManager() in the group matching the parameter name.
+ * @since 1.26
+ */
const PARAM_SUBMODULE_MAP = 15;
- /// @since 1.26
- // When PARAM_TYPE is 'submodule', used to indicate the 'g' prefix added by
- // ApiQueryGeneratorBase (and similar if anything else ever does that).
+
+ /**
+ * (string) When PARAM_TYPE is 'submodule', used to indicate the 'g' prefix
+ * added by ApiQueryGeneratorBase (and similar if anything else ever does that).
+ * @since 1.26
+ */
const PARAM_SUBMODULE_PARAM_PREFIX = 16;
- const LIMIT_BIG1 = 500; // Fast query, std user limit
- const LIMIT_BIG2 = 5000; // Fast query, bot/sysop limit
- const LIMIT_SML1 = 50; // Slow query, std user limit
- const LIMIT_SML2 = 500; // Slow query, bot/sysop limit
+ /**@}*/
+
+ /** Fast query, standard limit. */
+ const LIMIT_BIG1 = 500;
+ /** Fast query, apihighlimits limit. */
+ const LIMIT_BIG2 = 5000;
+ /** Slow query, standard limit. */
+ const LIMIT_SML1 = 50;
+ /** Slow query, apihighlimits limit. */
+ const LIMIT_SML2 = 500;
/**
* getAllowedParams() flag: When set, the result could take longer to generate,
if ( !$this->validateSha1Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
}
- $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
+ $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
} elseif ( isset( $params['sha1base36'] ) ) {
$sha1 = strtolower( $params['sha1base36'] );
if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
}
if ( Revision::userCanBitfield( $row->ar_deleted, Revision::DELETED_TEXT, $user ) ) {
if ( $row->ar_sha1 != '' ) {
- $rev['sha1'] = wfBaseConvert( $row->ar_sha1, 36, 16, 40 );
+ $rev['sha1'] = Wikimedia\base_convert( $row->ar_sha1, 36, 16, 40 );
} else {
$rev['sha1'] = '';
}
if ( !$this->validateSha1Hash( $sha1 ) ) {
$this->dieUsage( 'The SHA1 hash provided is not valid', 'invalidsha1hash' );
}
- $sha1 = wfBaseConvert( $sha1, 16, 36, 31 );
+ $sha1 = Wikimedia\base_convert( $sha1, 16, 36, 31 );
} elseif ( $sha1base36Set ) {
$sha1 = strtolower( $params['sha1base36'] );
if ( !$this->validateSha1Base36Hash( $sha1 ) ) {
$file['user'] = $row->fa_user_text;
}
if ( $fld_sha1 ) {
- $file['sha1'] = wfBaseConvert( $row->fa_sha1, 36, 16, 40 );
+ $file['sha1'] = Wikimedia\base_convert( $row->fa_sha1, 36, 16, 40 );
}
if ( $fld_timestamp ) {
$file['timestamp'] = wfTimestamp( TS_ISO_8601, $row->fa_timestamp );
}
if ( $sha1 ) {
- $vals['sha1'] = wfBaseConvert( $file->getSha1(), 36, 16, 40 );
+ $vals['sha1'] = Wikimedia\base_convert( $file->getSha1(), 36, 16, 40 );
}
if ( $meta ) {
}
if ( Revision::userCanBitfield( $row->rev_deleted, Revision::DELETED_TEXT, $user ) ) {
if ( $row->rev_sha1 !== '' ) {
- $vals['sha1'] = wfBaseConvert( $row->rev_sha1, 36, 16, 40 );
+ $vals['sha1'] = Wikimedia\base_convert( $row->rev_sha1, 36, 16, 40 );
} else {
$vals['sha1'] = '';
}
}
if ( $revision->userCan( Revision::DELETED_TEXT, $user ) ) {
if ( $revision->getSha1() != '' ) {
- $vals['sha1'] = wfBaseConvert( $revision->getSha1(), 36, 16, 40 );
+ $vals['sha1'] = Wikimedia\base_convert( $revision->getSha1(), 36, 16, 40 );
} else {
$vals['sha1'] = '';
}
* @return string Integer
*/
private function bigintFromLockName( $lockName ) {
- return wfBaseConvert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
+ return Wikimedia\base_convert( substr( sha1( $lockName ), 0, 15 ), 16, 10 );
}
} // end DatabasePostgres class
$be = FileBackendGroup::singleton()->get( $backend );
if ( $be instanceof FileBackend ) {
// Get three random base 36 characters to act as shard directories
- $rand = wfBaseConvert( mt_rand( 0, 46655 ), 10, 36, 3 );
+ $rand = Wikimedia\base_convert( mt_rand( 0, 46655 ), 10, 36, 3 );
// Make sure ID is roughly lexicographically increasing for performance
$id = str_pad( UIDGenerator::newTimestampedUID128( 32 ), 26, '0', STR_PAD_LEFT );
// Segregate items by wiki ID for the sake of bookkeeping
MediaWiki\restoreWarnings();
if ( $this->sha1Base36 !== false ) {
- $this->sha1Base36 = wfBaseConvert( $this->sha1Base36, 16, 36, 31 );
+ $this->sha1Base36 = Wikimedia\base_convert( $this->sha1Base36, 16, 36, 31 );
}
return $this->sha1Base36;
if ( $digits > 0 ) {
$numShards = pow( $base, $digits );
for ( $index = 0; $index < $numShards; $index++ ) {
- $shards[] = '.' . wfBaseConvert( $index, 10, $base, $digits );
+ $shards[] = '.' . Wikimedia\base_convert( $index, 10, $base, $digits );
}
}
}
protected function getSourceSha1Base36() {
- return wfBaseConvert( sha1( $this->params['content'] ), 16, 36, 31 );
+ return Wikimedia\base_convert( sha1( $this->params['content'] ), 16, 36, 31 );
}
public function storagePathsChanged() {
$hash = sha1_file( $this->params['src'] );
MediaWiki\restoreWarnings();
if ( $hash !== false ) {
- $hash = wfBaseConvert( $hash, 16, 36, 31 );
+ $hash = Wikimedia\base_convert( $hash, 16, 36, 31 );
}
return $hash;
return $status;
}
- $sha1Hash = wfBaseConvert( sha1( $params['content'] ), 16, 36, 31 );
+ $sha1Hash = Wikimedia\base_convert( sha1( $params['content'] ), 16, 36, 31 );
$contentType = isset( $params['headers']['content-type'] )
? $params['headers']['content-type']
: $this->getContentType( $params['dst'], $params['content'], null );
return $status;
}
- $sha1Hash = wfBaseConvert( $sha1Hash, 16, 36, 31 );
+ $sha1Hash = Wikimedia\base_convert( $sha1Hash, 16, 36, 31 );
$contentType = isset( $params['headers']['content-type'] )
? $params['headers']['content-type']
: $this->getContentType( $params['dst'], null, $params['src'] );
for ( $i = 0; $i < 5; $i++ ) {
$s .= mt_rand( 0, 2147483647 );
}
- $s = wfBaseConvert( sha1( $s ), 16, 36, 31 );
+ $s = Wikimedia\base_convert( sha1( $s ), 16, 36, 31 );
- return substr( wfBaseConvert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
+ return substr( Wikimedia\base_convert( wfTimestamp( TS_MW ), 10, 36, 9 ) . $s, 0, 31 );
}
/**
$db = $this->getConnection( $lockSrv ); // checked in isServerUp()
$bigints = array_unique( array_map(
function ( $key ) {
- return wfBaseConvert( substr( $key, 0, 15 ), 16, 10 );
+ return Wikimedia\base_convert( substr( $key, 0, 15 ), 16, 10 );
},
array_map( array( $this, 'sha1Base16Absolute' ), $paths )
) );
* @return string
*/
final protected function sha1Base36Absolute( $path ) {
- return wfBaseConvert( sha1( "{$this->domain}:{$path}" ), 16, 36, 31 );
+ return Wikimedia\base_convert( sha1( "{$this->domain}:{$path}" ), 16, 36, 31 );
}
/**
*/
function getSha1() {
return isset( $this->mInfo['sha1'] )
- ? wfBaseConvert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
+ ? Wikimedia\base_convert( strval( $this->mInfo['sha1'] ), 16, 36, 31 )
: null;
}
// Additional job metadata
'job_id' => $dbw->nextSequenceValue( 'job_job_id_seq' ),
'job_timestamp' => $dbw->timestamp(),
- 'job_sha1' => wfBaseConvert(
+ 'job_sha1' => Wikimedia\base_convert(
sha1( serialize( $job->getDeduplicationInfo() ) ),
16, 36, 31
),
// Additional job metadata
'uuid' => UIDGenerator::newRawUUIDv4( UIDGenerator::QUICK_RAND ),
'sha1' => $job->ignoreDuplicates()
- ? wfBaseConvert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
+ ? Wikimedia\base_convert( sha1( serialize( $job->getDeduplicationInfo() ) ), 16, 36, 31 )
: '',
'timestamp' => time() // UNIX timestamp
);
// Generate random hex chars
$hex = MWCryptRand::generateHex( $length );
// Convert from base 16 to base 32 to get a proper password like string
- return wfBaseConvert( $hex, 16, 32 );
+ return Wikimedia\base_convert( $hex, 16, 32 );
}
/**
// see: http://www.jwz.org/doc/mid.html
list( $usec, $sec ) = explode( ' ', microtime() );
$usec = substr( $usec, 2 );
- $key = wfBaseConvert( $sec . $usec, 10, 36 ) . '.' .
- wfBaseConvert( mt_rand(), 10, 36 ) . '.' .
+ $key = Wikimedia\base_convert( $sec . $usec, 10, 36 ) . '.' .
+ Wikimedia\base_convert( mt_rand(), 10, 36 ) . '.' .
$this->userId . '.' .
$extension;
}
}
if ( $n !== false ) {
- # Floating points can handle the conversion; faster than wfBaseConvert()
+ # Floating points can handle the conversion; faster than Wikimedia\base_convert()
$n = strtoupper( str_pad( base_convert( $n, 10, 16 ), 8, '0', STR_PAD_LEFT ) );
}
} else {
} else {
# Native 32 bit functions WONT work here!!!
# Convert to a padded binary number
- $network = wfBaseConvert( $network, 16, 2, 128 );
+ $network = Wikimedia\base_convert( $network, 16, 2, 128 );
# Truncate the last (128-$bits) bits and replace them with zeros
$network = str_pad( substr( $network, 0, $bits ), 128, 0, STR_PAD_RIGHT );
# Convert back to an integer
- $network = wfBaseConvert( $network, 2, 10 );
+ $network = Wikimedia\base_convert( $network, 2, 10 );
}
} else {
$network = false;
if ( $network === false ) {
$start = $end = false;
} else {
- $start = wfBaseConvert( $network, 10, 16, 32, false );
+ $start = Wikimedia\base_convert( $network, 10, 16, 32, false );
# Turn network to binary (again)
- $end = wfBaseConvert( $network, 10, 2, 128 );
+ $end = Wikimedia\base_convert( $network, 10, 2, 128 );
# Truncate the last (128-$bits) bits and replace them with ones
$end = str_pad( substr( $end, 0, $bits ), 128, 1, STR_PAD_RIGHT );
# Convert to hex
- $end = wfBaseConvert( $end, 2, 16, 32, false );
+ $end = Wikimedia\base_convert( $end, 2, 16, 32, false );
# see toHex() comment
$start = "v6-$start";
$end = "v6-$end";
}
file_put_contents( $this->nodeIdFile, $nodeId ); // cache
}
- $this->nodeId32 = wfBaseConvert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
- $this->nodeId48 = wfBaseConvert( $nodeId, 16, 2, 48 );
+ $this->nodeId32 = Wikimedia\base_convert( substr( sha1( $nodeId ), 0, 8 ), 16, 2, 32 );
+ $this->nodeId48 = Wikimedia\base_convert( $nodeId, 16, 2, 48 );
// If different processes run as different users, they may have different temp dirs.
// This is dealt with by initializing the clock sequence number and counters randomly.
$this->lockFile88 = wfTempDir() . '/mw-' . __CLASS__ . '-UID-88';
}
/**
+ * @todo: move to MW-specific factory class and inject temp dir
* @return UIDGenerator
*/
protected static function singleton() {
*
* @param int $base Specifies a base other than 10
* @return string Number
- * @throws MWException
+ * @throws RuntimeException
*/
public static function newTimestampedUID88( $base = 10 ) {
Assert::parameterType( 'integer', $base, '$base' );
$gen = self::singleton();
$time = $gen->getTimestampAndDelay( 'lockFile88', 1, 1024 );
- return wfBaseConvert( $gen->getTimestampedID88( $time ), 2, $base );
+ return Wikimedia\base_convert( $gen->getTimestampedID88( $time ), 2, $base );
}
/**
* @param array $info (UIDGenerator::millitime(), counter, clock sequence)
* @return string 88 bits
- * @throws MWException
+ * @throws RuntimeException
*/
protected function getTimestampedID88( array $info ) {
list( $time, $counter ) = $info;
$id_bin .= $this->nodeId32;
// Convert to a 1-27 digit integer string
if ( strlen( $id_bin ) !== 88 ) {
- throw new MWException( "Detected overflow for millisecond timestamp." );
+ throw new RuntimeException( "Detected overflow for millisecond timestamp." );
}
return $id_bin;
*
* @param int $base Specifies a base other than 10
* @return string Number
- * @throws MWException
+ * @throws RuntimeException
*/
public static function newTimestampedUID128( $base = 10 ) {
Assert::parameterType( 'integer', $base, '$base' );
$gen = self::singleton();
$time = $gen->getTimestampAndDelay( 'lockFile128', 16384, 1048576 );
- return wfBaseConvert( $gen->getTimestampedID128( $time ), 2, $base );
+ return Wikimedia\base_convert( $gen->getTimestampedID128( $time ), 2, $base );
}
/**
* @param array $info (UIDGenerator::millitime(), counter, clock sequence)
* @return string 128 bits
- * @throws MWException
+ * @throws RuntimeException
*/
protected function getTimestampedID128( array $info ) {
list( $time, $counter, $clkSeq ) = $info;
$id_bin .= $this->nodeId48;
// Convert to a 1-39 digit integer string
if ( strlen( $id_bin ) !== 128 ) {
- throw new MWException( "Detected overflow for millisecond timestamp." );
+ throw new RuntimeException( "Detected overflow for millisecond timestamp." );
}
return $id_bin;
*
* @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
* @return string
- * @throws MWException
+ * @throws RuntimeException
*/
public static function newUUIDv4( $flags = 0 ) {
$hex = ( $flags & self::QUICK_RAND )
*
* @param int $flags Bitfield (supports UIDGenerator::QUICK_RAND)
* @return string 32 hex characters with no hyphens
- * @throws MWException
+ * @throws RuntimeException
*/
public static function newRawUUIDv4( $flags = 0 ) {
return str_replace( '-', '', self::newUUIDv4( $flags ) );
* @param int $count Number of IDs to return (1 to 10000)
* @param int $flags (supports UIDGenerator::QUICK_VOLATILE)
* @return array Ordered list of float integer values
- * @throws MWException
+ * @throws RuntimeException
*/
protected function getSequentialPerNodeIDs( $bucket, $bits, $count, $flags ) {
if ( $count <= 0 ) {
return array(); // nothing to do
} elseif ( $count > 10000 ) {
- throw new MWException( "Number of requested IDs ($count) is too high." );
+ throw new RuntimeException( "Number of requested IDs ($count) is too high." );
} elseif ( $bits < 16 || $bits > 48 ) {
- throw new MWException( "Requested bit size ($bits) is out of range." );
+ throw new RuntimeException( "Requested bit size ($bits) is out of range." );
}
$counter = null; // post-increment persistent counter value
$counter = $cache->incr( $bucket, $count );
if ( $counter === false ) {
if ( !$cache->add( $bucket, (int)$count ) ) {
- throw new MWException( 'Unable to set value to ' . get_class( $cache ) );
+ throw new RuntimeException( 'Unable to set value to ' . get_class( $cache ) );
}
$counter = $count;
}
}
// Acquire the UID lock file
if ( $handle === false ) {
- throw new MWException( "Could not open '{$path}'." );
+ throw new RuntimeException( "Could not open '{$path}'." );
} elseif ( !flock( $handle, LOCK_EX ) ) {
fclose( $handle );
- throw new MWException( "Could not acquire '{$path}'." );
+ throw new RuntimeException( "Could not acquire '{$path}'." );
}
// Fetch the counter value and increment it...
rewind( $handle );
* @param int $clockSeqSize The number of possible clock sequence values
* @param int $counterSize The number of possible counter values
* @return array (result of UIDGenerator::millitime(), counter, clock sequence)
- * @throws MWException
+ * @throws RuntimeException
*/
protected function getTimestampAndDelay( $lockFile, $clockSeqSize, $counterSize ) {
// Get the UID lock file handle
}
// Acquire the UID lock file
if ( $handle === false ) {
- throw new MWException( "Could not open '{$this->$lockFile}'." );
+ throw new RuntimeException( "Could not open '{$this->$lockFile}'." );
} elseif ( !flock( $handle, LOCK_EX ) ) {
fclose( $handle );
- throw new MWException( "Could not acquire '{$this->$lockFile}'." );
+ throw new RuntimeException( "Could not acquire '{$this->$lockFile}'." );
}
// Get the current timestamp, clock sequence number, last time, and counter
rewind( $handle );
$counter = (int)$data[3] % $counterSize;
if ( ++$counter >= $counterSize ) { // sanity (starts at 0)
flock( $handle, LOCK_UN ); // abort
- throw new MWException( "Counter overflow for timestamp value." );
+ throw new RuntimeException( "Counter overflow for timestamp value." );
}
}
} else { // last UID info not initialized
// We don't want processes using too high or low timestamps to avoid duplicate
// UIDs and clock sequence number churn. This process should just be restarted.
flock( $handle, LOCK_UN ); // abort
- throw new MWException( "Process clock is outdated or drifted." );
+ throw new RuntimeException( "Process clock is outdated or drifted." );
}
// If microtime() is synced and a clock change was detected, then the clock went back
if ( $clockChanged ) {
/**
* @param array $time Result of UIDGenerator::millitime()
* @return string 46 MSBs of "milliseconds since epoch" in binary (rolls over in 4201)
- * @throws MWException
+ * @throws RuntimeException
*/
protected function millisecondsSinceEpochBinary( array $time ) {
list( $sec, $msec ) = $time;
$ts = 1000 * $sec + $msec;
if ( $ts > pow( 2, 52 ) ) {
- throw new MWException( __METHOD__ .
+ throw new RuntimeException( __METHOD__ .
': sorry, this function doesn\'t work after the year 144680' );
}
- return substr( wfBaseConvert( $ts, 10, 2, 46 ), -46 );
+ return substr( Wikimedia\base_convert( $ts, 10, 2, 46 ), -46 );
}
/**
--- /dev/null
+<?php
+/**
+ * Benchmark for Wikimedia\base_convert()
+ *
+ * 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 the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Benchmark
+ * @author Tyler Romeo
+ */
+
+require_once __DIR__ . '/Benchmarker.php';
+
+/**
+ * Maintenance script that benchmarks Wikimedia\base_convert().
+ *
+ * Code exists in vendor repository brought in via composer.
+ *
+ * @ingroup Benchmark
+ */
+class BenchWikimediaBaseConvert extends Benchmarker {
+ public function __construct() {
+ parent::__construct();
+ $this->mDescription = "Benchmark for Wikimedia\\base_convert.";
+ $this->addOption( "inbase", "Input base", false, true );
+ $this->addOption( "outbase", "Output base", false, true );
+ $this->addOption( "length", "Size in digits to generate for input", false, true );
+ }
+
+ public function execute() {
+ $inbase = $this->getOption( "inbase", 36 );
+ $outbase = $this->getOption( "outbase", 16 );
+ $length = $this->getOption( "length", 128 );
+ $number = self::makeRandomNumber( $inbase, $length );
+
+ $this->bench( array(
+ array(
+ 'function' => 'Wikimedia\base_convert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'php' )
+ ),
+ array(
+ 'function' => 'Wikimedia\base_convert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'bcmath' )
+ ),
+ array(
+ 'function' => 'Wikimedia\base_convert',
+ 'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
+ ),
+ ) );
+
+ $this->output( $this->getFormattedResults() );
+ }
+
+ protected static function makeRandomNumber( $base, $length ) {
+ $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
+ $res = "";
+ for ( $i = 0; $i < $length; $i++ ) {
+ $res .= $baseChars[mt_rand( 0, $base - 1 )];
+ }
+
+ return $res;
+ }
+}
+
+$maintClass = 'BenchWikimediaBaseConvert';
+require_once RUN_MAINTENANCE_IF_MAIN;
+++ /dev/null
-<?php
-/**
- * Benchmark for wfBaseConvert
- *
- * 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 the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- * http://www.gnu.org/copyleft/gpl.html
- *
- * @file
- * @ingroup Benchmark
- * @author Tyler Romeo
- */
-
-require_once __DIR__ . '/Benchmarker.php';
-
-/**
- * Maintenance script that benchmarks wfBaseConvert().
- *
- * @ingroup Benchmark
- */
-class BenchWfBaseConvert extends Benchmarker {
- public function __construct() {
- parent::__construct();
- $this->mDescription = "Benchmark for wfBaseConvert.";
- $this->addOption( "inbase", "Input base", false, true );
- $this->addOption( "outbase", "Output base", false, true );
- $this->addOption( "length", "Size in digits to generate for input", false, true );
- }
-
- public function execute() {
- $inbase = $this->getOption( "inbase", 36 );
- $outbase = $this->getOption( "outbase", 16 );
- $length = $this->getOption( "length", 128 );
- $number = self::makeRandomNumber( $inbase, $length );
-
- $this->bench( array(
- array(
- 'function' => 'wfBaseConvert',
- 'args' => array( $number, $inbase, $outbase, 0, true, 'php' )
- ),
- array(
- 'function' => 'wfBaseConvert',
- 'args' => array( $number, $inbase, $outbase, 0, true, 'bcmath' )
- ),
- array(
- 'function' => 'wfBaseConvert',
- 'args' => array( $number, $inbase, $outbase, 0, true, 'gmp' )
- ),
- ) );
-
- $this->output( $this->getFormattedResults() );
- }
-
- protected static function makeRandomNumber( $base, $length ) {
- $baseChars = "0123456789abcdefghijklmnopqrstuvwxyz";
- $res = "";
- for ( $i = 0; $i < $length; $i++ ) {
- $res .= $baseChars[mt_rand( 0, $base - 1 )];
- }
-
- return $res;
- }
-}
-
-$maintClass = 'BenchWfBaseConvert';
-require_once RUN_MAINTENANCE_IF_MAIN;
"ooui-toolgroup-expand": "Više",
"ooui-toolgroup-collapse": "Manje",
"ooui-dialog-message-accept": "U redu",
- "ooui-dialog-message-reject": "Otkaži",
+ "ooui-dialog-message-reject": "Odustani",
"ooui-dialog-process-error": "Nešto je pošlo naopako",
"ooui-dialog-process-dismiss": "Odbaci",
- "ooui-dialog-process-retry": "Pokušajte ponovo",
+ "ooui-dialog-process-retry": "Pokušaj ponovo",
"ooui-dialog-process-continue": "Nastavi",
"ooui-selectfile-button-select": "Izaberi datoteku",
- "ooui-selectfile-placeholder": "Nijedna datoteka nije izabrana"
+ "ooui-selectfile-not-supported": "Izbor datoteke nije podržan",
+ "ooui-selectfile-placeholder": "Nijedna datoteka nije izabrana",
+ "ooui-selectfile-dragdrop-placeholder": "Prevuci datoteku ovdje"
}
"ooui-dialog-message-reject": "Odustani",
"ooui-dialog-process-error": "Nešto je pošlo po zlu",
"ooui-dialog-process-dismiss": "Zatvori",
- "ooui-dialog-process-retry": "Pokušajte ponovo"
+ "ooui-dialog-process-retry": "Pokušajte ponovo",
+ "ooui-selectfile-button-select": "Odaberi datoteku",
+ "ooui-selectfile-placeholder": "Datoteka nije označena"
}
"The Polish"
]
},
- "ooui-outline-control-move-down": "Przenieś niżej",
- "ooui-outline-control-move-up": "Przenieś wyżej",
+ "ooui-outline-control-move-down": "Przesuń w dół",
+ "ooui-outline-control-move-up": "Przesuń w górę",
"ooui-outline-control-remove": "Usuń element",
"ooui-toolbar-more": "Więcej",
"ooui-toolgroup-expand": "Więcej",
"ooui-selectfile-button-select": "Wybierz plik",
"ooui-selectfile-not-supported": "Wybór pliku nie jest obsługiwany",
"ooui-selectfile-placeholder": "Nie wybrano pliku",
- "ooui-selectfile-dragdrop-placeholder": "Umieść plik tutaj"
+ "ooui-selectfile-dragdrop-placeholder": "Upuść plik tutaj"
}
/*!
- * OOjs UI v0.13.3
+ * OOjs UI v0.14.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2015 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2015-11-18T01:09:30Z
+ * Date: 2015-11-25T01:06:55Z
*/
@-webkit-keyframes oo-ui-progressBarWidget-slide {
from {
/*!
- * OOjs UI v0.13.3
+ * OOjs UI v0.14.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2015 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2015-11-18T01:09:23Z
+ * Date: 2015-11-25T01:06:47Z
*/
/**
* @class
/*!
- * OOjs UI v0.13.3
+ * OOjs UI v0.14.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2015 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2015-11-18T01:09:30Z
+ * Date: 2015-11-25T01:06:55Z
*/
@-webkit-keyframes oo-ui-progressBarWidget-slide {
from {
border-right: 1px solid #dddddd;
}
.oo-ui-bookletLayout-outlinePanel > .oo-ui-outlineControlsWidget {
- box-shadow: 0 0 0.25em rgba(0, 0, 0, 0.25);
+ box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
}
.oo-ui-indexLayout > .oo-ui-menuLayout-menu {
height: 3em;
.oo-ui-panelLayout-framed {
border: 1px solid #aaaaaa;
border-radius: 0.2em;
- box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
}
.oo-ui-panelLayout-padded.oo-ui-panelLayout-framed {
margin: 1em 0;
.oo-ui-windowManager-modal.oo-ui-windowManager-floating > .oo-ui-dialog > .oo-ui-window-frame {
border: 1px solid #aaaaaa;
border-radius: 0.2em;
- box-shadow: inset 0 -0.2em 0 0 rgba(0, 0, 0, 0.2);
+ box-shadow: 0 0.15em 0 0 rgba(0, 0, 0, 0.15);
}
/*!
- * OOjs UI v0.13.3
+ * OOjs UI v0.14.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2015 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2015-11-18T01:09:23Z
+ * Date: 2015-11-25T01:06:47Z
*/
/**
* @class
-/*
- * Local backports:
- *
- * - 4fbbc737c86b500c11bbb471ec1001c50ab8853c
- * SelectFileWidget: Use i18n string for button label
- * We totally forgot to use a localisation message we carefully introduced.
- */
-
/*!
- * OOjs UI v0.13.3
+ * OOjs UI v0.14.0
* https://www.mediawiki.org/wiki/OOjs_UI
*
* Copyright 2011–2015 OOjs UI Team and other contributors.
* Released under the MIT license
* http://oojs.mit-license.org
*
- * Date: 2015-11-18T01:09:23Z
+ * Date: 2015-11-25T01:06:47Z
*/
( function ( OO ) {
this.setLabel( this.placeholder );
}
}
-
- if ( this.$input ) {
- this.$input.attr( 'title', this.getLabel() );
- }
};
/**
this.$input = $( '<input type="file">' );
this.$input.on( 'change', this.onFileSelectedHandler );
this.$input.attr( {
- tabindex: -1,
- title: this.getLabel()
+ tabindex: -1
} );
if ( this.accept ) {
this.$input.attr( 'accept', this.accept.join( ', ' ) );
return this.selectRange( this.getInputLength() );
};
+/**
+ * Insert new content into the input.
+ *
+ * @param {string} content Content to be inserted
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.insertContent = function ( content ) {
+ var start, end,
+ range = this.getRange(),
+ value = this.getValue();
+
+ start = Math.min( range.from, range.to );
+ end = Math.max( range.from, range.to );
+
+ this.setValue( value.slice( 0, start ) + content + value.slice( end ) );
+ this.selectRange( start + content.length );
+ return this;
+};
+
+/**
+ * Insert new content either side of a selection.
+ *
+ * @param {string} pre Content to be inserted before the selection
+ * @param {string} post Content to be inserted after the selection
+ * @chainable
+ */
+OO.ui.TextInputWidget.prototype.encapsulateContent = function ( pre, post ) {
+ var start, end,
+ range = this.getRange(),
+ offset = pre.length;
+
+ start = Math.min( range.from, range.to );
+ end = Math.max( range.from, range.to );
+
+ this.selectRange( start ).insertContent( pre );
+ this.selectRange( offset + end ).insertContent( post );
+
+ this.selectRange( offset + start, offset + end );
+ return this;
+};
+
/**
* Set the validation pattern.
*
return this;
};
-/**
- * Deprecated alias of #setLabelPosition
- *
- * @deprecated Use setLabelPosition instead.
- */
-OO.ui.TextInputWidget.prototype.setPosition =
- OO.ui.TextInputWidget.prototype.setLabelPosition;
-
/**
* Update the position of the inline label.
*
--- /dev/null
+{
+ "prefix": "oo-ui-icon",
+ "intro": "@import '../../../../src/styles/common';",
+ "variants": {
+ "invert": {
+ "color": "#FFFFFF",
+ "global": true
+ }
+ },
+ "images": {
+ "beta": { "file": "images/icons/beta.svg" },
+ "betaLaunch": { "file": "images/icons/betaLaunch.svg" },
+ "bookmark": { "file": {
+ "ltr": "images/icons/bookmark-ltr.svg",
+ "rtl": "images/icons/bookmark-rtl.svg"
+ } },
+ "browser": { "file": {
+ "ltr": "images/icons/browser-ltr.svg",
+ "rtl": "images/icons/browser-rtl.svg"
+ } },
+ "clear": { "file": "images/icons/clear.svg" },
+ "clock": { "file": "images/icons/clock.svg" },
+ "funnel": { "file": {
+ "ltr": "images/icons/funnel-ltr.svg",
+ "rtl": "images/icons/funnel-rtl.svg"
+ } },
+ "heart": { "file": "images/icons/heart.svg" },
+ "key": { "file": {
+ "ltr": "images/icons/key-ltr.svg",
+ "rtl": "images/icons/key-rtl.svg"
+ } },
+ "keyboard": { "file": {
+ "ltr": "images/icons/keyboard-ltr.svg",
+ "rtl": "images/icons/keyboard-rtl.svg"
+ } },
+ "logOut": { "file": {
+ "ltr": "images/icons/logOut-ltr.svg",
+ "rtl": "images/icons/logOut-rtl.svg"
+ } },
+ "newWindow": { "file": {
+ "ltr": "images/icons/newWindow-ltr.svg",
+ "rtl": "images/icons/newWindow-rtl.svg"
+ } },
+ "printer": { "file": {
+ "ltr": "images/icons/printer-ltr.svg",
+ "rtl": "images/icons/printer-rtl.svg"
+ } },
+ "ribbonPrize": { "file": "images/icons/ribbonPrize.svg" },
+ "sun": { "file": {
+ "ltr": "images/icons/sun-ltr.svg",
+ "rtl": "images/icons/sun-rtl.svg"
+ } },
+ "watchlist": { "file": {
+ "ltr": "images/icons/watchlist-ltr.svg",
+ "rtl": "images/icons/watchlist-rtl.svg"
+ } }
+ }
+}
"ltr": "images/icons/arched-arrow-ltr.svg",
"rtl": "images/icons/arched-arrow-rtl.svg"
} },
- "remove": { "file": "images/icons/remove.svg" },
+ "remove": { "file": "images/icons/trash.svg" },
"search": { "file": "images/icons/search.svg" },
"settings": { "file": "images/icons/settings.svg" },
"tag": { "file": "images/icons/tag.svg" },
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M12 4c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 12l-3-2-1 4-1-4-3 2 2-3-4-1 4-1-2-3 3 2 1-4 1 4 3-2-2 3 4 1-4 1 2 3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M15.3 14.7C16.1 10.9 14.7 4 12 4c-2.7 0-4.2 6.7-3.4 10.5L7 18h2.7l.3 1h4c.2-.3.1-.5.3-1H17l-1.7-3.3zM12 10c-.8 0-1.5-.7-1.5-1.5S11.2 7 12 7s1.5.7 1.5 1.5S12.8 10 12 10zm2 10c0 1.1-2 2-2 2s-2-.9-2-2"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M15 5H8c-1.1 0-2 .9-2 2v3h3v11l4-3 4 3V7c0-1.1-.9-2-2-2zM9 9H7V7c0-.6.4-1 1-1h1v3z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z" id="path88"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M8 5h7c1.1 0 2 .9 2 2v3h-3v11l-4-3-4 3V7c0-1.1.9-2 2-2zm6 4h2V7c0-.6-.4-1-1-1h-1v3z" id="path88"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M3 6v11c0 1.7 1.3 3 3 3h15V6H3zm2.5 1C6.3 7 7 7.7 7 8.5S6.3 10 5.5 10 4 9.3 4 8.5 4.7 7 5.5 7zM20 19H6c-1.1 0-2-.9-2-2v-6h16v8z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z" id="path98"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M21 6v11c0 1.7-1.3 3-3 3H3V6h18zm-2.5 1c-.8 0-1.5.7-1.5 1.5s.7 1.5 1.5 1.5S20 9.3 20 8.5 19.3 7 18.5 7zM4 19h14c1.1 0 2-.9 2-2v-6H4v8z" id="path98"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="clear">
+ <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="clear">
+ <path id="circle-with-cross" d="M12 5c-4.4 0-8 3.6-8 8s3.6 8 8 8 8-3.6 8-8-3.6-8-8-8zm4 11l-1 1-3-3-3 3-1-1 3-3-3-3 1-1 3 3 3-3 1 1-3 3 3 3z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="clock">
+ <path id="circle" d="m 12,5 c -3.865993,0 -7,3.1340068 -7,7 0,3.865993 3.134007,7 7,7 3.865993,0 7,-3.134007 7,-7 0,-3.8659932 -3.134007,-7 -7,-7 z m 0,1.25 c 3.174708,0 5.75,2.5752917 5.75,5.75 0,3.174708 -2.575292,5.75 -5.75,5.75 C 8.825292,17.75 6.25,15.174708 6.25,12 6.25,8.8252917 8.825292,6.25 12,6.25 z" />
+ <path id="hands" d="m 15.605461,14.078994 c 0,0 -1.674293,-1.358389 -2.811549,-2.149554 0.505447,-1.682718 1.194821,-4.6044835 1.194821,-4.6044835 0,0 -3.053744,3.7648795 -3.423703,4.7027645 -0.32503,0.819947 1.024233,1.55074 1.646915,1.177972 1.333819,0.386808 3.393516,0.873301 3.393516,0.873301 z" />
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="clock">
+ <path id="circle" d="m 12,5 c -3.865993,0 -7,3.1340068 -7,7 0,3.865993 3.134007,7 7,7 3.865993,0 7,-3.134007 7,-7 0,-3.8659932 -3.134007,-7 -7,-7 z m 0,1.25 c 3.174708,0 5.75,2.5752917 5.75,5.75 0,3.174708 -2.575292,5.75 -5.75,5.75 C 8.825292,17.75 6.25,15.174708 6.25,12 6.25,8.8252917 8.825292,6.25 12,6.25 z" />
+ <path id="hands" d="m 15.605461,14.078994 c 0,0 -1.674293,-1.358389 -2.811549,-2.149554 0.505447,-1.682718 1.194821,-4.6044835 1.194821,-4.6044835 0,0 -3.053744,3.7648795 -3.423703,4.7027645 -0.32503,0.819947 1.024233,1.55074 1.646915,1.177972 1.333819,0.386808 3.393516,0.873301 3.393516,0.873301 z" />
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g>
+ <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g>
+ <path d="M11 13L5 6h15l-6 7v7c-1.7 0-3-1.3-3-3v-4z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g256">
+ <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z" id="path258"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g256">
+ <path d="M14 13l6-7H5l6 7v7c1.7 0 3-1.3 3-3v-4z" id="path258"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M15 7c-2 0-3 2-3 2s-1-2-3-2c-2.5 0-4 2-4 4 0 4 5 5 7 8 2-3 7-4 7-8 0-2-1.5-4-4-4z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M14.5 4C11.5 4 9 6.5 9 9.5c0 1 .3 1.9.7 2.8L4 18v2h4v-2h2v-2h2l1.2-1.2c.4.1.9.2 1.3.2 3 0 5.5-2.5 5.5-5.5S17.5 4 14.5 4zM16 9c-.8 0-1.5-.7-1.5-1.5S15.2 6 16 6s1.5.7 1.5 1.5S16.8 9 16 9z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z" id="path336"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M9.5 4c3 0 5.5 2.5 5.5 5.5 0 1-.3 1.9-.7 2.8L20 18v2h-4v-2h-2v-2h-2l-1.2-1.2c-.4.1-.9.2-1.3.2-3 0-5.5-2.5-5.5-5.5S6.5 4 9.5 4zM8 9c.8 0 1.5-.7 1.5-1.5S8.8 6 8 6s-1.5.7-1.5 1.5S7.2 9 8 9z" id="path336"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g>
+ <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g>
+ <path d="M3 7v9c0 1.7 1.3 3 3 3h15V7H3zm8 2h2v2h-2V9zm0 3h2v2h-2v-2zM8 9h2v2H8V9zm0 3h2v2H8v-2zm-1 5H6c-.6 0-1-.4-1-1v-1h2v2zm0-3H5v-2h2v2zm0-3H5V9h2v2zm9 6H8v-2h8v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2zm3 6h-2v-2h2v2zm0-3h-2v-2h2v2zm0-3h-2V9h2v2z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g346">
+ <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z" id="path348"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g346">
+ <path d="M21 7v9c0 1.7-1.3 3-3 3H3V7h18zm-8 2h-2v2h2V9zm0 3h-2v2h2v-2zm3-3h-2v2h2V9zm0 3h-2v2h2v-2zm1 5h1c.6 0 1-.4 1-1v-1h-2v2zm0-3h2v-2h-2v2zm0-3h2V9h-2v2zm-9 6h8v-2H8v2zm0-3h2v-2H8v2zm0-3h2V9H8v2zm-3 6h2v-2H5v2zm0-3h2v-2H5v2zm0-3h2V9H5v2z" id="path348"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g>
+ <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g>
+ <path d="M15 14v3l5-4.5L15 8v3H8c0 1.7 1.3 3 3 3h4zm-1-9H4v15h10v-2H6V7h8V5z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g402">
+ <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z" id="path404"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g402">
+ <path d="M9 14v3l-5-4.5L9 8v3h7c0 1.7-1.3 3-3 3H9zm1-9h10v15H10v-2h8V7h-8V5z" id="path404"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g4">
+ <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z" id="path6"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g4">
+ <path d="M12 5l2.5 2.5L11 11c-1.2 1.2-1.2 2.8 0 4l5.5-5.5L19 12V5h-7zm5 12H8c-.6 0-1-.4-1-1V7h3L8 5H5v11c0 1.7 1.3 3 3 3h11v-3l-2-2v3z" id="path6"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g462">
+ <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z" id="path464"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g462">
+ <path d="M12 5L9.5 7.5 13 11c1.2 1.2 1.2 2.8 0 4L7.5 9.5 5 12V5h7zM7 17h9c.6 0 1-.4 1-1V7h-3l2-2h3v11c0 1.7-1.3 3-3 3H5v-3l2-2v3z" id="path464"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M18 8h-1V4H7v4H3v6c0 1.7 1.3 3 3 3h1v3h10v-3h4v-6c0-1.7-1.3-3-3-3zM8 5h8v3H8V5zm8 14H8v-6h8v6z"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z" id="path532"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M6 8h1V4h10v4h4v6c0 1.7-1.3 3-3 3h-1v3H7v-3H3v-6c0-1.7 1.3-3 3-3zm10-3H8v3h8V5zM8 19h8v-6H8v6z" id="path532"/>
+</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="remove">
- <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
- </g>
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="Layer_1">
+ <g>
+ <circle cx="11.5" cy="8.5" r="2.5"/>
+ <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="Layer_1">
+ <g>
+ <circle cx="11.5" cy="8.5" r="2.5"/>
+ <path d="M16.3 8.7L17 8l-.8-.8.4-.8-1.1-.5.1-.9-1.2-.2-.1-.9-1.2.2-.4-.8-1.1.5L11 3l-.8.8-.9-.4-.5 1.1-.9-.2-.2 1.2-.9.2.2 1.2-.9.4.5 1.1L6 9l.8.8-.4.8 1.1.5-.1.9 1.2.2.1.9 1.2-.2.4.8 1.1-.5.6.8.8-.8.8.4.5-1.1.9.1.2-1.2.9-.1-.2-1.2.8-.4-.4-1zM11.5 12C9.6 12 8 10.4 8 8.5S9.6 5 11.5 5 15 6.6 15 8.5 13.4 12 11.5 12zm.5 3l-.7-.7-1.1.6-.4-.7-.8.3V23l2.5-3 2.5 3v-8.5l-1-.5z"/>
+ </g>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
+ <circle cx="12" cy="11" r="4"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M18.1 5.1c0 .3-.1.6-.3.9l-1.4 1.4-.9-.8 2.2-2.2c.3.1.4.4.4.7zm-.5 5.3h3.2c0 .3-.1.6-.4.9s-.5.4-.8.4h-2v-1.3zm-6.2-5V2.2c.3 0 .6.1.9.4s.4.5.4.8v2h-1.3zm6.4 11.7c-.3 0-.6-.1-.8-.3l-1.4-1.4.8-.8 2.2 2.2c-.2.2-.5.3-.8.3zM6.2 4.9c.3 0 .6.1.8.3l1.4 1.4-.8.9-2.2-2.3c.2-.2.5-.3.8-.3zm5.2 11.7h1.2v3.2c-.3 0-.6-.1-.9-.4s-.4-.5-.4-.8l.1-2zm-7-6.2h2v1.2H3.2c0-.3.1-.6.4-.9s.5-.3.8-.3zM6.2 16l1.4-1.4.8.8-2.2 2.2c-.2-.2-.3-.5-.3-.8s.1-.6.3-.8z"/>
+ <circle cx="12" cy="11" r="4"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z" id="path678"/>
+ <circle cx="12" cy="11" r="4" id="circle680" transform="matrix(-1 0 0 1 24 0)"/>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <path d="M5.9 5.1c0 .3.1.6.3.9l1.4 1.4.9-.8-2.2-2.2c-.3.1-.4.4-.4.7zm.5 5.3H3.2c0 .3.1.6.4.9.3.3.5.4.8.4h2v-1.3zm6.2-5V2.2c-.3 0-.6.1-.9.4-.3.3-.4.5-.4.8v2h1.3zM6.2 17.1c.3 0 .6-.1.8-.3l1.4-1.4-.8-.8-2.2 2.2c.2.2.5.3.8.3zM17.8 4.9c-.3 0-.6.1-.8.3l-1.4 1.4.8.9 2.2-2.3c-.2-.2-.5-.3-.8-.3zm-5.2 11.7h-1.2v3.2c.3 0 .6-.1.9-.4.3-.3.4-.5.4-.8l-.1-2zm7-6.2h-2v1.2h3.2c0-.3-.1-.6-.4-.9-.3-.3-.5-.3-.8-.3zM17.8 16l-1.4-1.4-.8.8 2.2 2.2c.2-.2.3-.5.3-.8 0-.3-.1-.6-.3-.8z" id="path678"/>
+ <circle cx="12" cy="11" r="4" id="circle680" transform="matrix(-1 0 0 1 24 0)"/>
+</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
+ <g id="trash-can">
+ <path d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
+ </g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g>
- <path d="M20.5 20.5L5 5 4 6l3 3 1 11h8l.2-1.8 3.3 3.3zM17 9h-6l5.5 5.5zm1-1c0-1.1-.9-2-2-2h-2l-1-1h-2l-1 1H8l2 2h8z"/>
+ <g id="trash-can-undo">
+ <path d="M4.5 3.5l-1 1L6 7v2h1v7.97L8 18h6.97l.03-.03 1-.97 2.5 2.5 1-1L16 15l-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1-1zM9 5v1l1 1h6v1h-5l1 1h3v3l1 1V9h1V6h-3V5zM8 9l1 1v6h1v-5l1 1v4h1v-3l1 1v2h1v-1l1 1v1H8zm5 1l1 1v-1z"/>
</g>
</svg>
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="g714">
- <path d="M4 20.5L19.5 5l1 1-3 3-1 11h-8l-.2-1.8L5 21.5zM7.5 9h6L8 14.5zm-1-1c0-1.1.9-2 2-2h2l1-1h2l1 1h2l-2 2h-8z" id="path716"/>
+ <g id="trash-can-undo">
+ <path d="M18.5 3.5l1 1L17 7v2h-1v7.97L15 18H8.03L8 17.97 7 17l-2.5 2.5-1-1L7 15l1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1 1-1zM14 5v1l-1 1H7v1h5l-1 1H8v3l-1 1V9H6V6h3V5zm1 4l-1 1v6h-1v-5l-1 1v4h-1v-3l-1 1v2H9v-1l-1 1v1h7zm-5 1l-1 1v-1z"/>
</g>
</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g>
+ <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g>
+ <path d="M13 14h5v1h-5v-1zm0 3h5v-1h-5v1zm0 1h5v1h-5v-1zm-1-5v3l-5 3 1-6-4-3 6-1 2-5s1.9 5 2 5l6 1-4 3h-4z"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
+ <g id="g780">
+ <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z" id="path782"/>
+ </g>
+</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
+ <g id="g780">
+ <path d="M11 14H6v1h5v-1zm0 3H6v-1h5v1zm0 1H6v1h5v-1zm1-5v3l5 3-1-6 4-3-6-1-2-5s-1.9 5-2 5l-6 1 4 3h4z" id="path782"/>
+ </g>
+</svg>
"ltr": "images/icons/arched-arrow-ltr.svg",
"rtl": "images/icons/arched-arrow-rtl.svg"
} },
- "remove": { "file": "images/icons/remove.svg", "variants": [ "destructive" ] },
+ "remove": { "file": "images/icons/trash.svg", "variants": [ "destructive" ] },
"search": { "file": {
"ltr": "images/icons/search-ltr.svg",
"rtl": "images/icons/search-rtl.svg"
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
- <g id="remove">
- <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #FFFFFF }</style>
- <g id="remove">
- <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
- </g>
-</svg>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
- <g id="remove">
- <path id="trash-can" d="M12 10h-1v6h1v-6zm-2 0H9v6h1v-6zm4 0h-1v6h1v-6zm0-4V5H9v1H6v3h1v7.966l1 1.03v-.073V18h6.984l.016-.018v.015l1-1.03V9h1V6h-3zm1 11H8V9h7v8zm1-9H7V7h9v1z"/>
- </g>
-</svg>
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><style>* { fill: #D11D13 }</style>
+ <path d="M6 8c0-1.1.9-2 2-2h2l1-1h2l1 1h2c1.1 0 2 .9 2 2H6zm1 1h10l-1 11H8z"/>
+</svg>
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '1', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/png',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '2', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20130225203040' ), $user );
'media_type' => MEDIATYPE_DRAWING,
'mime' => 'image/svg+xml',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '3', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
</OBJECT>
</BODY>
</DjVuXML>',
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123600' ), $user );
}
$this->assertEquals( strlen( $fileBContents ),
$this->backend->getFileSize( array( 'src' => $fileC ) ),
"Correct file size of $fileC" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+ $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
$this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
"Correct file SHA-1 of $fileC" );
}
$this->assertEquals( strlen( $fileBContents ),
$this->backend->getFileSize( array( 'src' => $fileC ) ),
"Correct file size of $fileC" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+ $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
$this->backend->getFileSha1Base36( array( 'src' => $fileC ) ),
"Correct file SHA-1 of $fileC" );
}
$this->assertEquals( strlen( $fileBContents ),
$this->backend->getFileSize( array( 'src' => $fileA ) ),
"Correct file size of $fileA" );
- $this->assertEquals( wfBaseConvert( sha1( $fileBContents ), 16, 36, 31 ),
+ $this->assertEquals( Wikimedia\base_convert( sha1( $fileBContents ), 16, 36, 31 ),
$this->backend->getFileSha1Base36( array( 'src' => $fileA ) ),
"Correct file SHA-1 of $fileA" );
}
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '1', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '1', 16, 36, 31 ),
'fileExists' => true ),
$this->db->timestamp( '20010115123500' ), $user
);
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/png',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '2', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '2', 16, 36, 31 ),
'fileExists' => true ),
$this->db->timestamp( '20130225203040' ), $user
);
'media_type' => MEDIATYPE_BITMAP,
'mime' => 'image/jpeg',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '3', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '3', 16, 36, 31 ),
'fileExists' => true ),
$this->db->timestamp( '20010115123500' ), $user
);
'media_type' => MEDIATYPE_DRAWING,
'mime' => 'image/svg+xml',
'metadata' => serialize( array() ),
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20010115123500' ), $user );
}
</OBJECT>
</BODY>
</DjVuXML>',
- 'sha1' => wfBaseConvert( '', 16, 36, 31 ),
+ 'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
'fileExists' => true
), $this->db->timestamp( '20140115123600' ), $user );
}
$this->assertEquals( true, ctype_digit( $id ), "UID made of digit characters" );
$this->assertLessThanOrEqual( $digitlen, strlen( $id ),
"UID has the right number of digits" );
- $this->assertLessThanOrEqual( $bits, strlen( wfBaseConvert( $id, 10, 2 ) ),
+ $this->assertLessThanOrEqual( $bits, strlen( Wikimedia\base_convert( $id, 10, 2 ) ),
"UID has the right number of bits" );
$ids = array();
$this->assertSame( array_unique( $ids ), $ids, "All generated IDs are unique." );
foreach ( $ids as $id ) {
- $id_bin = wfBaseConvert( $id, 10, 2 );
- $lastId_bin = wfBaseConvert( $lastId, 10, 2 );
+ $id_bin = Wikimedia\base_convert( $id, 10, 2 );
+ $lastId_bin = Wikimedia\base_convert( $lastId, 10, 2 );
$this->assertGreaterThanOrEqual(
substr( $lastId_bin, 0, $tbits ),