Upgraded to Kint 2

This commit is contained in:
Lonnie Ezell 2017-07-27 00:16:09 -05:00
parent efb0b47647
commit 45951eb089
No known key found for this signature in database
GPG Key ID: 8EB408F8D82F5002
43 changed files with 301 additions and 5321 deletions

View File

@ -6,6 +6,7 @@ class Home extends Controller
{
public function index()
{
dd($this);
return view('welcome_message');
}

View File

@ -18,7 +18,8 @@
"require": {
"php": ">=7.0",
"zendframework/zend-escaper": "^2.5",
"paragonie/sodium_compat": "^1.1"
"paragonie/sodium_compat": "^1.1",
"kint-php/kint": "^2.1"
},
"require-dev": {
"phpunit/phpunit": "^6.0",

View File

@ -165,7 +165,7 @@ class CodeIgniter
if (CI_DEBUG)
{
require_once BASEPATH . 'ThirdParty/Kint/Kint.class.php';
require_once BASEPATH . 'ThirdParty/Kint/kint.php';
}
}

View File

@ -961,3 +961,17 @@ if ( ! function_exists('function_usable'))
}
//--------------------------------------------------------------------
if (! function_exists('dd'))
{
/**
* Prints a Kint debug report and exits.
*
* @param array ...$vars
*/
function dd(...$vars)
{
Kint::dump(...$vars);
exit;
}
}

View File

@ -27,12 +27,12 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @package CodeIgniter
* @author CodeIgniter Dev Team
* @copyright 2014-2017 British Columbia Institute of Technology (https://bcit.ca/)
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 3.0.0
* @package CodeIgniter
* @author CodeIgniter Dev Team
* @copyright 2014-2017 British Columbia Institute of Technology (https://bcit.ca/)
* @license https://opensource.org/licenses/MIT MIT License
* @link https://codeigniter.com
* @since Version 3.0.0
* @filesource
*/
@ -49,6 +49,7 @@
*/
class ComposerScripts
{
protected static $basePath = 'system/ThirdParty/';
/**
* After composer install/update, this is called to move
@ -57,36 +58,8 @@ class ComposerScripts
*/
public static function postUpdate()
{
/*
* Zend/Escaper
*/
if (class_exists('\\Zend\\Escaper\\Escaper') && file_exists(self::getClassFilePath('\\Zend\\Escaper\\Escaper')))
{
$base = 'system/ThirdParty/ZendEscaper';
foreach ([$base, $base . '/Exception'] as $path)
{
if ( ! is_dir($path))
{
mkdir($path, 0755);
}
}
$files = [
self::getClassFilePath('\\Zend\\Escaper\\Exception\\ExceptionInterface') => $base . '/Exception/ExceptionInterface.php',
self::getClassFilePath('\\Zend\\Escaper\\Exception\\InvalidArgumentException') => $base . '/Exception/InvalidArgumentException.php',
self::getClassFilePath('\\Zend\\Escaper\\Exception\\RuntimeException') => $base . '/Exception/RuntimeException.php',
self::getClassFilePath('\\Zend\\Escaper\\Escaper') => $base . '/Escaper.php'
];
foreach ($files as $source => $dest)
{
if ( ! self::moveFile($source, $dest))
{
die('Error moving: ' . $source);
}
}
}
static::moveEscaper();
static::moveKint();
}
//--------------------------------------------------------------------
@ -96,6 +69,7 @@ class ComposerScripts
*
* @param string $source
* @param string $destination
*
* @return boolean
*/
protected static function moveFile(string $source, string $destination)
@ -107,12 +81,12 @@ class ComposerScripts
die('Cannot move file. Source path invalid.');
}
if ( ! is_file($source))
if (! is_file($source))
{
return false;
}
return rename($source, $destination);
return copy($source, $destination);
}
//--------------------------------------------------------------------
@ -121,13 +95,112 @@ class ComposerScripts
* Determine file path of a class.
*
* @param string $class
*
* @return string
*/
protected static function getClassFilePath(string $class)
{
$reflector = new \ReflectionClass($class);
return $reflector->getFileName();
}
//--------------------------------------------------------------------
/**
* A recursive remove directory method.
*
* @param $dir
*/
protected static function removeDir($dir)
{
if (is_dir($dir))
{
$objects = scandir($dir);
foreach ($objects as $object)
{
if ($object != "." && $object != "..")
{
if (filetype($dir."/".$object) == "dir")
{
static::removeDir($dir."/".$object);
}
else
{
unlink($dir."/".$object);
}
}
}
reset($objects);
rmdir($dir);
}
}
/**
* Moves the Zend Escaper files into our base repo so that it's
* available for packaged releases where the users don't user Composer.
*/
public static function moveEscaper()
{
if (class_exists('\\Zend\\Escaper\\Escaper') && file_exists(self::getClassFilePath('\\Zend\\Escaper\\Escaper')))
{
$base = static::$basePath.'ZendEscaper';
foreach ([$base, $base.'/Exception'] as $path)
{
if (! is_dir($path))
{
mkdir($path, 0755);
}
}
$files = [
self::getClassFilePath('\\Zend\\Escaper\\Exception\\ExceptionInterface') => $base.'/Exception/ExceptionInterface.php',
self::getClassFilePath('\\Zend\\Escaper\\Exception\\InvalidArgumentException') => $base.'/Exception/InvalidArgumentException.php',
self::getClassFilePath('\\Zend\\Escaper\\Exception\\RuntimeException') => $base.'/Exception/RuntimeException.php',
self::getClassFilePath('\\Zend\\Escaper\\Escaper') => $base.'/Escaper.php',
];
foreach ($files as $source => $dest)
{
if (! self::moveFile($source, $dest))
{
die('Error moving: '.$source);
}
}
}
}
//--------------------------------------------------------------------
/**
* Moves the Kint file into our base repo so that it's
* available for packaged releases where the users don't user Composer.
*/
public static function moveKint()
{
$filename = 'vendor/kint-php/kint/build/kint-aante-light.php';
if (file_exists($filename))
{
$base = static::$basePath.'Kint';
// Remove the contents of the previous Kint folder, if any.
if (is_dir($base))
{
static::removeDir($base);
}
// Create Kint if it doesn't exist already
if (! is_dir($base))
{
mkdir($base, 0755);
}
if (! self::moveFile($filename, $base.'/kint.php'))
{
die('Error moving: '.$filename);
}
}
}
}

View File

@ -1,3 +0,0 @@
/config.php
/.idea

View File

@ -1,842 +0,0 @@
<?php
/**
* Kint is a zero-setup debugging tool to output information about variables and stack traces prettily and comfortably.
*
* https://github.com/raveren/kint
*/
if ( defined( 'KINT_DIR' ) ) return;
define( 'KINT_DIR', dirname( __FILE__ ) . '/' );
define( 'KINT_PHP53', version_compare( PHP_VERSION, '5.3.0' ) >= 0 );
require KINT_DIR . 'config.default.php';
require KINT_DIR . 'inc/kintVariableData.class.php';
require KINT_DIR . 'inc/kintParser.class.php';
require KINT_DIR . 'inc/kintObject.class.php';
require KINT_DIR . 'decorators/rich.php';
require KINT_DIR . 'decorators/plain.php';
if ( is_readable( KINT_DIR . 'config.php' ) ) {
require KINT_DIR . 'config.php';
}
# init settings
if ( !empty( $GLOBALS['_kint_settings'] ) ) {
Kint::enabled( $GLOBALS['_kint_settings']['enabled'] );
foreach ( $GLOBALS['_kint_settings'] as $key => $val ) {
property_exists( 'Kint', $key ) and Kint::$$key = $val;
}
unset( $GLOBALS['_kint_settings'], $key, $val );
}
class Kint
{
// these are all public and 1:1 config array keys so you can switch them easily
private static $_enabledMode; # stores mode and active statuses
public static $returnOutput;
public static $fileLinkFormat;
public static $displayCalledFrom;
public static $charEncodings;
public static $maxStrLength;
public static $appRootDirs;
public static $maxLevels;
public static $theme;
public static $expandedByDefault;
public static $cliDetection;
public static $cliColors;
const MODE_RICH = 'r';
const MODE_WHITESPACE = 'w';
const MODE_CLI = 'c';
const MODE_PLAIN = 'p';
public static $aliases = array(
'methods' => array(
array( 'kint', 'dump' ),
array( 'kint', 'trace' ),
),
'functions' => array(
'd',
'dd',
'ddd',
's',
'sd',
)
);
private static $_firstRun = true;
/**
* Enables or disables Kint, can globally enforce the rendering mode. If called without parameters, returns the
* current mode.
*
* @param mixed $forceMode
* null or void - return current mode
* false - disable (no output)
* true - enable and detect cli automatically
* Kint::MODE_* - enable and force selected mode disregarding detection and function
* shorthand (s()/d()), note that you can still override this
* with the "~" modifier
*
* @return mixed previously set value if a new one is passed
*/
public static function enabled( $forceMode = null )
{
# act both as a setter...
if ( isset( $forceMode ) ) {
$before = self::$_enabledMode;
self::$_enabledMode = $forceMode;
return $before;
}
# ...and a getter
return self::$_enabledMode;
}
/**
* Prints a debug backtrace, same as Kint::dump(1)
*
* @param array $trace [OPTIONAL] you can pass your own trace, otherwise, `debug_backtrace` will be called
*
* @return mixed
*/
public static function trace( $trace = null )
{
if ( !self::enabled() ) return '';
return self::dump( isset( $trace ) ? $trace : debug_backtrace( true ) );
}
/**
* Dump information about variables, accepts any number of parameters, supports modifiers:
*
* clean up any output before kint and place the dump at the top of page:
* - Kint::dump()
* *****
* expand all nodes on display:
* ! Kint::dump()
* *****
* dump variables disregarding their depth:
* + Kint::dump()
* *****
* return output instead of displaying it:
* @ Kint::dump()
* *****
* force output as plain text
* ~ Kint::dump()
*
* Modifiers are supported by all dump wrapper functions, including Kint::trace(). Space is optional.
*
*
* You can also use the following shorthand to display debug_backtrace():
* Kint::dump( 1 );
*
* Passing the result from debug_backtrace() to kint::dump() as a single parameter will display it as trace too:
* $trace = debug_backtrace( true );
* Kint::dump( $trace );
* Or simply:
* Kint::dump( debug_backtrace() );
*
*
* @param mixed $data
*
* @return void|string
*/
public static function dump( $data = null )
{
if ( !self::enabled() ) return '';
list( $names, $modifiers, $callee, $previousCaller, $miniTrace ) = self::_getCalleeInfo(
defined( 'DEBUG_BACKTRACE_IGNORE_ARGS' )
? debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS )
: debug_backtrace()
);
$modeOldValue = self::enabled();
$firstRunOldValue = self::$_firstRun;
# process modifiers: @, +, !, ~ and -
if ( strpos( $modifiers, '-' ) !== false ) {
self::$_firstRun = true;
while ( ob_get_level() ) {
ob_end_clean();
}
}
if ( strpos( $modifiers, '!' ) !== false ) {
$expandedByDefaultOldValue = self::$expandedByDefault;
self::$expandedByDefault = true;
}
if ( strpos( $modifiers, '+' ) !== false ) {
$maxLevelsOldValue = self::$maxLevels;
self::$maxLevels = false;
}
if ( strpos( $modifiers, '@' ) !== false ) {
$returnOldValue = self::$returnOutput;
self::$returnOutput = true;
self::$_firstRun = true;
}
if ( strpos( $modifiers, '~' ) !== false ) {
self::enabled( self::MODE_WHITESPACE );
}
# set mode for current run
$mode = self::enabled();
if ( $mode === true ) {
$mode = PHP_SAPI === 'cli'
? self::MODE_CLI
: self::MODE_RICH;
}
self::enabled( $mode );
$decorator = self::enabled() === self::MODE_RICH
? 'Kint_Decorators_Rich'
: 'Kint_Decorators_Plain';
$output = '';
if ( self::$_firstRun ) {
$output .= call_user_func( array( $decorator, 'init' ) );
}
$trace = false;
if ( $names === array( null ) && func_num_args() === 1 && $data === 1 ) { # Kint::dump(1) shorthand
$trace = KINT_PHP53 ? debug_backtrace( true ) : debug_backtrace();
} elseif ( func_num_args() === 1 && is_array( $data ) ) {
$trace = $data; # test if the single parameter is result of debug_backtrace()
}
$trace and $trace = self::_parseTrace( $trace );
$output .= call_user_func( array( $decorator, 'wrapStart' ) );
if ( $trace ) {
$output .= call_user_func( array( $decorator, 'decorateTrace' ), $trace );
} else {
$data = func_num_args() === 0
? array( "[[no arguments passed]]" )
: func_get_args();
foreach ( $data as $k => $argument ) {
kintParser::reset();
# when the dump arguments take long to generate output, user might have changed the file and
# Kint might not parse the arguments correctly, so check if names are set and while the
# displayed names might be wrong, at least don't throw an error
$output .= call_user_func(
array( $decorator, 'decorate' ),
kintParser::factory( $argument, isset( $names[ $k ] ) ? $names[ $k ] : '' )
);
}
}
$output .= call_user_func( array( $decorator, 'wrapEnd' ), $callee, $miniTrace, $previousCaller );
self::enabled( $modeOldValue );
self::$_firstRun = false;
if ( strpos( $modifiers, '~' ) !== false ) {
self::$_firstRun = $firstRunOldValue;
} else {
self::enabled( $modeOldValue );
}
if ( strpos( $modifiers, '!' ) !== false ) {
self::$expandedByDefault = $expandedByDefaultOldValue;
}
if ( strpos( $modifiers, '+' ) !== false ) {
self::$maxLevels = $maxLevelsOldValue;
}
if ( strpos( $modifiers, '@' ) !== false ) {
self::$returnOutput = $returnOldValue;
self::$_firstRun = $firstRunOldValue;
return $output;
}
if ( self::$returnOutput ) return $output;
echo $output;
return '';
}
/**
* generic path display callback, can be configured in the settings; purpose is to show relevant path info and hide
* as much of the path as possible.
*
* @param string $file
*
* @return string
*/
public static function shortenPath( $file )
{
$file = str_replace( '\\', '/', $file );
$shortenedName = $file;
$replaced = false;
if ( is_array( self::$appRootDirs ) ) foreach ( self::$appRootDirs as $path => $replaceString ) {
if ( empty( $path ) ) continue;
$path = str_replace( '\\', '/', $path );
if ( strpos( $file, $path ) === 0 ) {
$shortenedName = $replaceString . substr( $file, strlen( $path ) );
$replaced = true;
break;
}
}
# fallback to find common path with Kint dir
if ( !$replaced ) {
$pathParts = explode( '/', str_replace( '\\', '/', KINT_DIR ) );
$fileParts = explode( '/', $file );
$i = 0;
foreach ( $fileParts as $i => $filePart ) {
if ( !isset( $pathParts[ $i ] ) || $pathParts[ $i ] !== $filePart ) break;
}
$shortenedName = ( $i ? '.../' : '' ) . implode( '/', array_slice( $fileParts, $i ) );
}
return $shortenedName;
}
public static function getIdeLink( $file, $line )
{
return str_replace( array( '%f', '%l' ), array( $file, $line ), self::$fileLinkFormat );
}
/**
* trace helper, shows the place in code inline
*
* @param string $file full path to file
* @param int $lineNumber the line to display
* @param int $padding surrounding lines to show besides the main one
*
* @return bool|string
*/
private static function _showSource( $file, $lineNumber, $padding = 7 )
{
if ( !$file OR !is_readable( $file ) ) {
# continuing will cause errors
return false;
}
# open the file and set the line position
$file = fopen( $file, 'r' );
$line = 0;
# Set the reading range
$range = array(
'start' => $lineNumber - $padding,
'end' => $lineNumber + $padding
);
# set the zero-padding amount for line numbers
$format = '% ' . strlen( $range['end'] ) . 'd';
$source = '';
while ( ( $row = fgets( $file ) ) !== false ) {
# increment the line number
if ( ++$line > $range['end'] ) {
break;
}
if ( $line >= $range['start'] ) {
# make the row safe for output
$row = htmlspecialchars( $row, ENT_NOQUOTES, 'UTF-8' );
# trim whitespace and sanitize the row
$row = '<span>' . sprintf( $format, $line ) . '</span> ' . $row;
if ( $line === $lineNumber ) {
# apply highlighting to this row
$row = '<div class="kint-highlight">' . $row . '</div>';
} else {
$row = '<div>' . $row . '</div>';
}
# add to the captured source
$source .= $row;
}
}
# close the file
fclose( $file );
return $source;
}
/**
* returns parameter names that the function was passed, as well as any predefined symbols before function
* call (modifiers)
*
* @param array $trace
*
* @return array( $parameters, $modifier, $callee, $previousCaller )
*/
private static function _getCalleeInfo( $trace )
{
$previousCaller = array();
$miniTrace = array();
$prevStep = array();
# go from back of trace to find first occurrence of call to Kint or its wrappers
while ( $step = array_pop( $trace ) ) {
if ( self::_stepIsInternal( $step ) ) {
$previousCaller = $prevStep;
break;
} elseif ( isset( $step['file'], $step['line'] ) ) {
unset( $step['object'], $step['args'] );
array_unshift( $miniTrace, $step );
}
$prevStep = $step;
}
$callee = $step;
if ( !isset( $callee['file'] ) || !is_readable( $callee['file'] ) ) return false;
# open the file and read it up to the position where the function call expression ended
$file = fopen( $callee['file'], 'r' );
$line = 0;
$source = '';
while ( ( $row = fgets( $file ) ) !== false ) {
if ( ++$line > $callee['line'] ) break;
$source .= $row;
}
fclose( $file );
$source = self::_removeAllButCode( $source );
if ( empty( $callee['class'] ) ) {
$codePattern = $callee['function'];
} else {
if ( $callee['type'] === '::' ) {
$codePattern = $callee['class'] . "\x07*" . $callee['type'] . "\x07*" . $callee['function'];;
} else /*if ( $callee['type'] === '->' )*/ {
$codePattern = ".*\x07*" . $callee['type'] . "\x07*" . $callee['function'];;
}
}
// todo if more than one call in one line - not possible to determine variable names
// todo does not recognize string concat
# get the position of the last call to the function
preg_match_all( "
[
# beginning of statement
[\x07{(]
# search for modifiers (group 1)
([-+!@~]*)?
# spaces
\x07*
# check if output is assigned to a variable (group 2) todo: does not detect concat
(
\\$[a-z0-9_]+ # variable
\x07*\\.?=\x07* # assignment
)?
# possibly a namespace symbol
\\\\?
# spaces again
\x07*
# main call to Kint
({$codePattern})
# spaces everywhere
\x07*
# find the character where kint's opening bracket resides (group 3)
(\\()
]ix",
$source,
$matches,
PREG_OFFSET_CAPTURE
);
$modifiers = end( $matches[1] );
$assignment = end( $matches[2] );
$callToKint = end( $matches[3] );
$bracket = end( $matches[4] );
if ( empty( $callToKint ) ) {
# if a wrapper is misconfigured, don't display the whole file as variable name
return array( array(), $modifiers, $callee, $previousCaller, $miniTrace );
}
$modifiers = $modifiers[0];
if ( $assignment[1] !== -1 ) {
$modifiers .= '@';
}
$paramsString = preg_replace( "[\x07+]", ' ', substr( $source, $bracket[1] + 1 ) );
# we now have a string like this:
# <parameters passed>); <the rest of the last read line>
# remove everything in brackets and quotes, we don't need nested statements nor literal strings which would
# only complicate separating individual arguments
$c = strlen( $paramsString );
$inString = $escaped = $openedBracket = $closingBracket = false;
$i = 0;
$inBrackets = 0;
$openedBrackets = array();
while ( $i < $c ) {
$letter = $paramsString[ $i ];
if ( !$inString ) {
if ( $letter === '\'' || $letter === '"' ) {
$inString = $letter;
} elseif ( $letter === '(' || $letter === '[' ) {
$inBrackets++;
$openedBrackets[] = $openedBracket = $letter;
$closingBracket = $openedBracket === '(' ? ')' : ']';
} elseif ( $inBrackets && $letter === $closingBracket ) {
$inBrackets--;
array_pop( $openedBrackets );
$openedBracket = end( $openedBrackets );
$closingBracket = $openedBracket === '(' ? ')' : ']';
} elseif ( !$inBrackets && $letter === ')' ) {
$paramsString = substr( $paramsString, 0, $i );
break;
}
} elseif ( $letter === $inString && !$escaped ) {
$inString = false;
}
# replace whatever was inside quotes or brackets with untypeable characters, we don't
# need that info. We'll later replace the whole string with '...'
if ( $inBrackets > 0 ) {
if ( $inBrackets > 1 || $letter !== $openedBracket ) {
$paramsString[ $i ] = "\x07";
}
}
if ( $inString ) {
if ( $letter !== $inString || $escaped ) {
$paramsString[ $i ] = "\x07";
}
}
$escaped = !$escaped && ( $letter === '\\' );
$i++;
}
# by now we have an un-nested arguments list, lets make it to an array for processing further
$arguments = explode( ',', preg_replace( "[\x07+]", '...', $paramsString ) );
# test each argument whether it was passed literary or was it an expression or a variable name
$parameters = array();
$blacklist = array( 'null', 'true', 'false', 'array(...)', 'array()', '"..."', '[...]', 'b"..."', );
foreach ( $arguments as $argument ) {
$argument = trim( $argument );
if ( is_numeric( $argument )
|| in_array( str_replace( "'", '"', strtolower( $argument ) ), $blacklist, true )
) {
$parameters[] = null;
} else {
$parameters[] = $argument;
}
}
return array( $parameters, $modifiers, $callee, $previousCaller, $miniTrace );
}
/**
* removes comments and zaps whitespace & <?php tags from php code, makes for easier further parsing
*
* @param string $source
*
* @return string
*/
private static function _removeAllButCode( $source )
{
$commentTokens = array(
T_COMMENT => true, T_INLINE_HTML => true, T_DOC_COMMENT => true
);
$whiteSpaceTokens = array(
T_WHITESPACE => true, T_CLOSE_TAG => true,
T_OPEN_TAG => true, T_OPEN_TAG_WITH_ECHO => true,
);
$cleanedSource = '';
foreach ( token_get_all( $source ) as $token ) {
if ( is_array( $token ) ) {
if ( isset( $commentTokens[ $token[0] ] ) ) continue;
if ( isset( $whiteSpaceTokens[ $token[0] ] ) ) {
$token = "\x07";
} else {
$token = $token[1];
}
} elseif ( $token === ';' ) {
$token = "\x07";
}
$cleanedSource .= $token;
}
return $cleanedSource;
}
/**
* returns whether current trace step belongs to Kint or its wrappers
*
* @param $step
*
* @return array
*/
private static function _stepIsInternal( $step )
{
if ( isset( $step['class'] ) ) {
foreach ( self::$aliases['methods'] as $alias ) {
if ( $alias[0] === strtolower( $step['class'] ) && $alias[1] === strtolower( $step['function'] ) ) {
return true;
}
}
return false;
} else {
return in_array( strtolower( $step['function'] ), self::$aliases['functions'], true );
}
}
private static function _parseTrace( array $data )
{
$trace = array();
$traceFields = array( 'file', 'line', 'args', 'class' );
$fileFound = false; # file element must exist in one of the steps
# validate whether a trace was indeed passed
while ( $step = array_pop( $data ) ) {
if ( !is_array( $step ) || !isset( $step['function'] ) ) return false;
if ( !$fileFound && isset( $step['file'] ) && file_exists( $step['file'] ) ) {
$fileFound = true;
}
$valid = false;
foreach ( $traceFields as $element ) {
if ( isset( $step[ $element ] ) ) {
$valid = true;
break;
}
}
if ( !$valid ) return false;
if ( self::_stepIsInternal( $step ) ) {
$step = array(
'file' => $step['file'],
'line' => $step['line'],
'function' => '',
);
array_unshift( $trace, $step );
break;
}
if ( $step['function'] !== 'spl_autoload_call' ) { # meaningless
array_unshift( $trace, $step );
}
}
if ( !$fileFound ) return false;
$output = array();
foreach ( $trace as $step ) {
if ( isset( $step['file'] ) ) {
$file = $step['file'];
if ( isset( $step['line'] ) ) {
$line = $step['line'];
# include the source of this step
if ( self::enabled() === self::MODE_RICH ) {
$source = self::_showSource( $file, $line );
}
}
}
$function = $step['function'];
if ( in_array( $function, array( 'include', 'include_once', 'require', 'require_once' ) ) ) {
if ( empty( $step['args'] ) ) {
# no arguments
$args = array();
} else {
# sanitize the included file path
$args = array( 'file' => self::shortenPath( $step['args'][0] ) );
}
} elseif ( isset( $step['args'] ) ) {
if ( empty( $step['class'] ) && !function_exists( $function ) ) {
# introspection on closures or language constructs in a stack trace is impossible before PHP 5.3
$params = null;
} else {
try {
if ( isset( $step['class'] ) ) {
if ( method_exists( $step['class'], $function ) ) {
$reflection = new ReflectionMethod( $step['class'], $function );
} else if ( isset( $step['type'] ) && $step['type'] == '::' ) {
$reflection = new ReflectionMethod( $step['class'], '__callStatic' );
} else {
$reflection = new ReflectionMethod( $step['class'], '__call' );
}
} else {
$reflection = new ReflectionFunction( $function );
}
# get the function parameters
$params = $reflection->getParameters();
} catch ( Exception $e ) { # avoid various PHP version incompatibilities
$params = null;
}
}
$args = array();
foreach ( $step['args'] as $i => $arg ) {
if ( isset( $params[ $i ] ) ) {
# assign the argument by the parameter name
$args[ $params[ $i ]->name ] = $arg;
} else {
# assign the argument by number
$args[ '#' . ( $i + 1 ) ] = $arg;
}
}
}
if ( isset( $step['class'] ) ) {
# Class->method() or Class::method()
$function = $step['class'] . $step['type'] . $function;
}
// todo it's possible to parse the object name out from the source!
$output[] = array(
'function' => $function,
'args' => isset( $args ) ? $args : null,
'file' => isset( $file ) ? $file : null,
'line' => isset( $line ) ? $line : null,
'source' => isset( $source ) ? $source : null,
'object' => isset( $step['object'] ) ? $step['object'] : null,
);
unset( $function, $args, $file, $line, $source );
}
return $output;
}
}
if ( !function_exists( 'd' ) ) {
/**
* Alias of Kint::dump()
*
* @return string
*/
function d()
{
if ( !Kint::enabled() ) return '';
$_ = func_get_args();
return call_user_func_array( array( 'Kint', 'dump' ), $_ );
}
}
if ( !function_exists( 'dd' ) ) {
/**
* Alias of Kint::dump()
* [!!!] IMPORTANT: execution will halt after call to this function
*
* @return string
* @deprecated
*/
function dd()
{
if ( !Kint::enabled() ) return '';
echo "<pre>Kint: dd() is being deprecated, please use ddd() instead</pre>\n";
$_ = func_get_args();
call_user_func_array( array( 'Kint', 'dump' ), $_ );
die;
}
}
if ( !function_exists( 'ddd' ) ) {
/**
* Alias of Kint::dump()
* [!!!] IMPORTANT: execution will halt after call to this function
*
* @return string
*/
function ddd()
{
if ( !Kint::enabled() ) return '';
$_ = func_get_args();
call_user_func_array( array( 'Kint', 'dump' ), $_ );
die;
}
}
if ( !function_exists( 's' ) ) {
/**
* Alias of Kint::dump(), however the output is in plain htmlescaped text and some minor visibility enhancements
* added. If run in CLI mode, output is pure whitespace.
*
* To force rendering mode without autodetecting anything:
*
* Kint::enabled( Kint::MODE_PLAIN );
* Kint::dump( $variable );
*
* [!!!] IMPORTANT: execution will halt after call to this function
*
* @return string
*/
function s()
{
$enabled = Kint::enabled();
if ( !$enabled ) return '';
if ( $enabled === Kint::MODE_WHITESPACE ) { # if already in whitespace, don't elevate to plain
$restoreMode = Kint::MODE_WHITESPACE;
} else {
$restoreMode = Kint::enabled( # remove cli colors in cli mode; remove rich interface in HTML mode
PHP_SAPI === 'cli' ? Kint::MODE_WHITESPACE : Kint::MODE_PLAIN
);
}
$params = func_get_args();
$dump = call_user_func_array( array( 'Kint', 'dump' ), $params );
Kint::enabled( $restoreMode );
return $dump;
}
}
if ( !function_exists( 'sd' ) ) {
/**
* @see s()
*
* [!!!] IMPORTANT: execution will halt after call to this function
*
* @return string
*/
function sd()
{
$enabled = Kint::enabled();
if ( !$enabled ) return '';
if ( $enabled !== Kint::MODE_WHITESPACE ) {
Kint::enabled(
PHP_SAPI === 'cli' ? Kint::MODE_WHITESPACE : Kint::MODE_PLAIN
);
}
$params = func_get_args();
call_user_func_array( array( 'Kint', 'dump' ), $params );
die;
}
}

View File

@ -1,20 +0,0 @@
The MIT License (MIT)
Copyright (c) 2013 Rokas Šleinius (raveren@gmail.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.

View File

@ -1,141 +0,0 @@
# Kint - debugging helper for PHP developers
[![Total Downloads](https://poser.pugx.org/raveren/kint/downloads.png)](https://packagist.org/packages/raveren/kint)
> **New version** v1.0.0 is released with more than two years of active development - changes are too numerous to list, but there's CLI output and literally hundreds of improvements and additions.
![Screenshot](http://raveren.github.com/kint/img/preview.png)
## What am I looking at?
At first glance Kint is just a pretty replacement for **[var_dump()](http://php.net/manual/en/function.var-dump.php)**, **[print_r()](http://php.net/manual/en/function.print-r.php)** and **[debug_backtrace()](http://php.net/manual/en/function.debug-backtrace.php)**.
However, it's much, *much* more than that. Even the excellent `xdebug` var_dump improvements don't come close - you will eventually wonder how you developed without it.
Just to list some of the most useful features:
* The **variable name and place in code** where Kint was called from is displayed;
* You can **disable all Kint output easily and on the fly** - so you can even debug live systems without anyone knowing (even though you know you shouldn't be doing that!:).
* **CLI is detected** and formatted for automatically (but everything can be overridden on the fly) - if your setup supports it, the output is colored too:
![Kint CLI output](http://i.imgur.com/6B9MCLw.png)
* **Debug backtraces** are finally fully readable, actually informative and a pleasure to the eye.
* Kint has been **in active development for more than six years** and is shipped with [Drupal 8](https://www.drupal.org/) by default as part of its devel suite. You can trust it not being abandoned or getting left behind in features.
* Variable content is **displayed in the most informative way** - and you *never, ever* miss anything! Kint guarantees you see every piece of physically available information about everything you are dumping*;
* <sup>in some cases, the content is truncated where it would otherwise be too large to view anyway - but the user is always made aware of that;</sup>
* Some variable content types have an alternative display - for example you will be able see `JSON` in its raw form - but also as an associative array:
![Kint displays data intelligently](http://i.imgur.com/9P57Ror.png)
There are more than ten custom variable type displays inbuilt and more are added periodically.
## Installation and Usage
One of the main goals of Kint is to be **zero setup**.
[Download the archive](https://github.com/raveren/kint/archive/master.zip) and simply
```php
<?php
require '/kint/Kint.class.php';
```
**Or, if you use Composer:**
```json
"require": {
"raveren/kint": "^1.0"
}
```
Or just run `composer require raveren/kint`
**That's it, you can now use Kint to debug your code:**
```php
########## DUMP VARIABLE ###########################
Kint::dump($GLOBALS, $_SERVER); // pass any number of parameters
// or simply use d() as a shorthand:
d($_SERVER);
########## DEBUG BACKTRACE #########################
Kint::trace();
// or via shorthand:
d(1);
############# BASIC OUTPUT #########################
# this will show a basic javascript-free display
s($GLOBALS);
######### WHITESPACE FORMATTED OUTPUT ##############
# this will be garbled if viewed in browser as it is whitespace-formatted only
~d($GLOBALS); // just prepend with the tilde
########## MISCELLANEOUS ###########################
# this will disable kint completely
Kint::enabled(false);
ddd('Get off my lawn!'); // no effect
Kint::enabled(true);
ddd( 'this line will stop the execution flow because Kint was just re-enabled above!' );
```
Note, that Kint *does* have configuration (like themes and IDE integration!), but it's in need of being rewritten, so I'm not documenting it yet.
## Tips & Tricks
* Kint is enabled by default, call `Kint::enabled(false);` to turn its funcionality completely off. The *best practice* is to enable Kint in DEVELOPMENT environment only (or for example `Kint::enabled($_SERVER['REMOTE_ADDR'] === '<your IP>');`) - so even if you accidentally leave a dump in production, no one will know.
* `sd()` and `ddd()` are shorthands for `s();die;` and `d();die;` respectively.
* **Important:** The older shorthand `dd()` is deprecated due to compatibility issues and will eventually be removed. Use the analogous `ddd()` instead.
* When looking at Kint output, press <kbd>D</kbd> on the keyboard and you will be able to traverse the tree with arrows and tab keys - and expand/collapse nodes with space or enter.
* Double clicking the `[+]` sign in the output will expand/collapse ALL nodes; triple clicking big blocks of text will select it all.
* Clicking the tiny arrows on the right of the output open it in a separate window where you can keep it for comparison.
* To catch output from Kint just assign it to a variable<sup>beta</sup>
```php
$o = Kint::dump($GLOBALS);
// yes, the assignment is automatically detected, and $o
// now holds whatever was going to be printed otherwise.
// it also supports modifiers (read on) for the variable:
~$o = Kint::dump($GLOBALS); // this output will be in whitespace
```
* There are a couple of real-time modifiers you can use:
* `~d($var)` this call will output in plain text format.
* `+d($var)` will disregard depth level limits and output everything (careful, this can hang your browser on huge objects)
* `!d($var)` will show expanded rich output.
* `-d($var)` will attempt to `ob_clean` the previous output so if you're dumping something inside a HTML page, you will still see Kint output.
You can combine modifiers too: `~+d($var)`
* To force a specific dump output type just pass it to the `Kint::enabled()` method. Available options are: `Kint::MODE_RICH` (default), `Kint::MODE_PLAIN`, `Kint::MODE_WHITESPACE` and `Kint::MODE_CLI`:
```php
Kint::enabled(Kint::MODE_WHITESPACE);
$kintOutput = Kint::dump($GLOBALS);
// now $kintOutput can be written to a text log file and
// be perfectly readable from there
```
* To change display theme, use `Kint::$theme = '<theme name>';` where available options are: `'original'` (default), `'solarized'`, `'solarized-dark'` and `'aante-light'`. Here's an (outdated) preview:
![Kint themes](http://raveren.github.io/kint/img/theme-preview.png)
* Kint also includes a naïve profiler you may find handy. It's for determining relatively which code blocks take longer than others:
```php
Kint::dump( microtime() ); // just pass microtime()
sleep( 1 );
Kint::dump( microtime(), 'after sleep(1)' );
sleep( 2 );
ddd( microtime(), 'final call, after sleep(2)' );
```
![Kint profiling feature](http://i.imgur.com/tmHUMW4.png)
----
[Visit the project page](http://raveren.github.com/kint/) for documentation, configuration, and more advanced usage examples.
### Author
**Rokas Šleinius** (Raveren)
### License
Licensed under the MIT License

View File

@ -1,29 +0,0 @@
{
"name": "raveren/kint",
"description": "Kint - debugging helper for PHP developers",
"keywords": ["kint", "php", "debug"],
"type": "library",
"homepage": "https://github.com/raveren/kint",
"license": "MIT",
"authors": [
{
"name": "Rokas Šleinius",
"homepage": "https://github.com/raveren"
},
{
"name": "Contributors",
"homepage": "https://github.com/raveren/kint/contributors"
}
],
"require": {
"php": ">=5.1.0"
},
"autoload": {
"files": ["Kint.class.php"]
},
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
}
}

View File

@ -1,94 +0,0 @@
<?php
isset( $GLOBALS['_kint_settings'] ) or $GLOBALS['_kint_settings'] = array();
$_kintSettings = &$GLOBALS['_kint_settings'];
/** @var bool if set to false, kint will become silent, same as Kint::enabled(false) or Kint::$enabled = false */
$_kintSettings['enabled'] = true;
/**
* @var bool whether to display where kint was called from
*/
$_kintSettings['displayCalledFrom'] = true;
/**
* @var string format of the link to the source file in trace entries. Use %f for file path, %l for line number.
* Defaults to xdebug.file_link_format if not set.
*
* [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
*
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
*
*/
$_kintSettings['fileLinkFormat'] = ini_get( 'xdebug.file_link_format' );
/**
* @var array base directories of your application that will be displayed instead of the full path. Keys are paths,
* values are replacement strings
*
* Defaults to array( $_SERVER['DOCUMENT_ROOT'] => '&lt;ROOT&gt;' )
*
* [!] EXAMPLE (for Kohana framework):
*
* $_kintSettings['appRootDirs'] = array(
* APPPATH => 'APPPATH', // make sure the constants are already defined at the time of including this config file
* SYSPATH => 'SYSPATH',
* MODPATH => 'MODPATH',
* DOCROOT => 'DOCROOT',
* );
*
* [!] EXAMPLE #2 (for a semi-universal approach)
*
* $_kintSettings['appRootDirs'] = array(
* realpath( __DIR__ . '/../../..' ) => 'ROOT', // go up as many levels as needed in the realpath() param
* );
*
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
*
*/
$_kintSettings['appRootDirs'] = isset( $_SERVER['DOCUMENT_ROOT'] )
? array( $_SERVER['DOCUMENT_ROOT'] => '&lt;ROOT&gt;' )
: array();
/** @var int max length of string before it is truncated and displayed separately in full. Zero or false to disable */
$_kintSettings['maxStrLength'] = 80;
/** @var array possible alternative char encodings in order of probability, eg. array('windows-1251') */
$_kintSettings['charEncodings'] = array(
'UTF-8',
'Windows-1252', # Western; includes iso-8859-1, replace this with windows-1251 if you have Russian code
'euc-jp', # Japanese
# all other charsets cannot be differentiated by PHP and/or are not supported by mb_* functions,
# I need a better means of detecting the codeset, no idea how though :(
// 'iso-8859-13', # Baltic
// 'windows-1251', # Cyrillic
// 'windows-1250', # Central European
// 'shift_jis', # Japanese
// 'iso-2022-jp', # Japanese
);
/** @var int max array/object levels to go deep, if zero no limits are applied */
$_kintSettings['maxLevels'] = 7;
/** @var string name of theme for rich view */
$_kintSettings['theme'] = 'original';
/** @var bool enable detection when Kint is command line. Formats output with whitespace only; does not HTML-escape it */
$_kintSettings['cliDetection'] = true;
/** @var bool in addition to above setting, enable detection when Kint is run in *UNIX* command line.
* Attempts to add coloring, but if seen as plain text, the color information is visible as gibberish
*/
$_kintSettings['cliColors'] = true;
unset( $_kintSettings );

View File

@ -1,98 +0,0 @@
<?php
isset( $GLOBALS['_kint_settings'] ) or $GLOBALS['_kint_settings'] = array();
$_kintSettings = &$GLOBALS['_kint_settings'];
/** @var bool if set to false, kint will become silent, same as Kint::enabled(false) or Kint::$enabled = false */
$_kintSettings['enabled'] = true;
/**
* @var bool whether to display where kint was called from
*/
$_kintSettings['displayCalledFrom'] = true;
/**
* @var string format of the link to the source file in trace entries. Use %f for file path, %l for line number.
* Defaults to xdebug.file_link_format if not set.
*
* [!] EXAMPLE (works with for phpStorm and RemoteCall Plugin):
*
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
*
*/
$_kintSettings['fileLinkFormat'] = ini_get( 'xdebug.file_link_format' );
/**
* @var array base directories of your application that will be displayed instead of the full path. Keys are paths,
* values are replacement strings
*
* Defaults to array( $_SERVER['DOCUMENT_ROOT'] => '&lt;ROOT&gt;' )
*
* [!] EXAMPLE (for Kohana framework):
*
* $_kintSettings['appRootDirs'] = array(
* APPPATH => 'APPPATH', // make sure the constants are already defined at the time of including this config file
* SYSPATH => 'SYSPATH',
* MODPATH => 'MODPATH',
* DOCROOT => 'DOCROOT',
* );
*
* [!] EXAMPLE #2 (for a semi-universal approach)
*
* $_kintSettings['appRootDirs'] = array(
* realpath( __DIR__ . '/../../..' ) => 'ROOT', // go up as many levels as needed in the realpath() param
* );
*
* $_kintSettings['fileLinkFormat'] = 'http://localhost:8091/?message=%f:%l';
*
*/
$_kintSettings['appRootDirs'] = [
APPPATH => 'APPPATH',
BASEPATH => 'BASEPATH',
FCPATH => 'FCPATH',
WRITEPATH => 'WRITEPATH',
TESTPATH => 'TESTPATH'
];
/** @var int max length of string before it is truncated and displayed separately in full. Zero or false to disable */
$_kintSettings['maxStrLength'] = 80;
/** @var array possible alternative char encodings in order of probability, eg. array('windows-1251') */
$_kintSettings['charEncodings'] = array(
'UTF-8',
'Windows-1252', # Western; includes iso-8859-1, replace this with windows-1251 if you have Russian code
'euc-jp', # Japanese
# all other charsets cannot be differentiated by PHP and/or are not supported by mb_* functions,
# I need a better means of detecting the codeset, no idea how though :(
// 'iso-8859-13', # Baltic
// 'windows-1251', # Cyrillic
// 'windows-1250', # Central European
// 'shift_jis', # Japanese
// 'iso-2022-jp', # Japanese
);
/** @var int max array/object levels to go deep, if zero no limits are applied */
$_kintSettings['maxLevels'] = 7;
/** @var string name of theme for rich view */
$_kintSettings['theme'] = 'aante-light';
/** @var bool enable detection when Kint is command line. Formats output with whitespace only; does not HTML-escape it */
$_kintSettings['cliDetection'] = true;
/** @var bool in addition to above setting, enable detection when Kint is run in *UNIX* command line.
* Attempts to add coloring, but if seen as plain text, the color information is visible as gibberish
*/
$_kintSettings['cliColors'] = true;
unset( $_kintSettings );

View File

@ -1,335 +0,0 @@
<?php
class Kint_Decorators_Plain
{
private static $_enableColors;
private static $_cliEffects = array(
# effects
'bold' => '1', 'dark' => '2',
'italic' => '3', 'underline' => '4',
'blink' => '5', 'reverse' => '7',
'concealed' => '8', 'default' => '39',
# colors
'black' => '30', 'red' => '31',
'green' => '32', 'yellow' => '33',
'blue' => '34', 'magenta' => '35',
'cyan' => '36', 'light_gray' => '37',
'dark_gray' => '90', 'light_red' => '91',
'light_green' => '92', 'light_yellow' => '93',
'light_blue' => '94', 'light_magenta' => '95',
'light_cyan' => '96', 'white' => '97',
# backgrounds
'bg_default' => '49', 'bg_black' => '40',
'bg_red' => '41', 'bg_green' => '42',
'bg_yellow' => '43', 'bg_blue' => '44',
'bg_magenta' => '45', 'bg_cyan' => '46',
'bg_light_gray' => '47', 'bg_dark_gray' => '100',
'bg_light_red' => '101', 'bg_light_green' => '102',
'bg_light_yellow' => '103', 'bg_light_blue' => '104',
'bg_light_magenta' => '105', 'bg_light_cyan' => '106',
'bg_white' => '107',
);
private static $_utfSymbols = array(
'┌', '═', '┐',
'│',
'└', '─', '┘',
);
private static $_winShellSymbols = array(
"\xda", "\xdc", "\xbf",
"\xb3",
"\xc0", "\xc4", "\xd9",
);
private static $_htmlSymbols = array(
"&#9484;", "&#9604;", "&#9488;",
"&#9474;",
"&#9492;", "&#9472;", "&#9496;",
);
public static function decorate( kintVariableData $kintVar, $level = 0 )
{
$output = '';
if ( $level === 0 ) {
$name = $kintVar->name ? $kintVar->name : 'literal';
$kintVar->name = null;
$output .= self::_title( $name );
}
$space = str_repeat( $s = ' ', $level );
$output .= $space . self::_drawHeader( $kintVar );
if ( $kintVar->extendedValue !== null ) {
$output .= ' ' . ( $kintVar->type === 'array' ? '[' : '(' ) . PHP_EOL;
if ( is_array( $kintVar->extendedValue ) ) {
foreach ( $kintVar->extendedValue as $v ) {
$output .= self::decorate( $v, $level + 1 );
}
} elseif ( is_string( $kintVar->extendedValue ) ) {
$output .= $space . $s . $kintVar->extendedValue . PHP_EOL; # "depth too great" or similar
} else {
$output .= self::decorate( $kintVar->extendedValue, $level + 1 ); //it's kintVariableData
}
$output .= $space . ( $kintVar->type === 'array' ? ']' : ')' ) . PHP_EOL;
} else {
$output .= PHP_EOL;
}
return $output;
}
public static function decorateTrace( $traceData )
{
$output = self::_title( 'TRACE' );
$lastStep = count( $traceData );
foreach ( $traceData as $stepNo => $step ) {
$title = str_pad( ++$stepNo . ': ', 4, ' ' );
$title .= self::_colorize(
( isset( $step['file'] ) ? self::_buildCalleeString( $step ) : 'PHP internal call' ),
'title'
);
if ( !empty( $step['function'] ) ) {
$title .= ' ' . $step['function'];
if ( isset( $step['args'] ) ) {
$title .= '(';
if ( empty( $step['args'] ) ) {
$title .= ')';
} else {
}
$title .= PHP_EOL;
}
}
$output .= $title;
if ( !empty( $step['args'] ) ) {
$appendDollar = $step['function'] === '{closure}' ? '' : '$';
$i = 0;
foreach ( $step['args'] as $name => $argument ) {
$argument = kintParser::factory(
$argument,
$name ? $appendDollar . $name : '#' . ++$i
);
$argument->operator = $name ? ' =' : ':';
$maxLevels = Kint::$maxLevels;
if ( $maxLevels ) {
Kint::$maxLevels = $maxLevels + 2;
}
$output .= self::decorate( $argument, 2 );
if ( $maxLevels ) {
Kint::$maxLevels = $maxLevels;
}
}
$output .= ' )' . PHP_EOL;
}
if ( !empty( $step['object'] ) ) {
$output .= self::_colorize(
' ' . self::_char( '─', 27 ) . ' Callee object ' . self::_char( '─', 34 ),
'title'
);
$maxLevels = Kint::$maxLevels;
if ( $maxLevels ) {
# in cli the terminal window is filled too quickly to display huge objects
Kint::$maxLevels = Kint::enabled() === Kint::MODE_CLI
? 1
: $maxLevels + 1;
}
$output .= self::decorate( kintParser::factory( $step['object'] ), 1 );
if ( $maxLevels ) {
Kint::$maxLevels = $maxLevels;
}
}
if ( $stepNo !== $lastStep ) {
$output .= self::_colorize( self::_char( '─', 80 ), 'title' );
}
}
return $output;
}
private static function _colorize( $text, $type, $nlAfter = true )
{
$nlAfter = $nlAfter ? PHP_EOL : '';
switch ( Kint::enabled() ) {
case Kint::MODE_PLAIN:
if ( !self::$_enableColors ) return $text . $nlAfter;
switch ( $type ) {
case 'value':
$text = "<i>{$text}</i>";
break;
case 'type':
$text = "<b>{$text}</b>";
break;
case 'title':
$text = "<u>{$text}</u>";
break;
}
return $text . $nlAfter;
break;
case Kint::MODE_CLI:
if ( !self::$_enableColors ) return $text . $nlAfter;
$optionsMap = array(
'title' => "\x1b[36m", # cyan
'type' => "\x1b[35;1m", # magenta bold
'value' => "\x1b[32m", # green
);
return $optionsMap[ $type ] . $text . "\x1b[0m" . $nlAfter;
break;
case Kint::MODE_WHITESPACE:
default:
return $text . $nlAfter;
break;
}
}
private static function _char( $char, $repeat = null )
{
switch ( Kint::enabled() ) {
case Kint::MODE_PLAIN:
$char = self::$_htmlSymbols[ array_search( $char, self::$_utfSymbols, true ) ];
break;
case Kint::MODE_CLI:
$inWindowsShell = PHP_SAPI === 'cli' && DIRECTORY_SEPARATOR !== '/';
if ( $inWindowsShell ) {
$char = self::$_winShellSymbols[ array_search( $char, self::$_utfSymbols, true ) ];
}
break;
case Kint::MODE_WHITESPACE:
default:
break;
}
return $repeat ? str_repeat( $char, $repeat ) : $char;
}
private static function _title( $text )
{
$escaped = kintParser::escape( $text );
$lengthDifference = strlen( $escaped ) - strlen( $text );
return
self::_colorize(
self::_char( '┌' ) . self::_char( '─', 78 ) . self::_char( '┐' ) . PHP_EOL
. self::_char( '│' ),
'title',
false
)
. self::_colorize( str_pad( $escaped, 78 + $lengthDifference, ' ', STR_PAD_BOTH ), 'title', false )
. self::_colorize( self::_char( '│' ) . PHP_EOL
. self::_char( '└' ) . self::_char( '─', 78 ) . self::_char( '┘' ),
'title'
);
}
public static function wrapStart()
{
if ( Kint::enabled() === Kint::MODE_PLAIN ) {
return '<pre class="-kint">';
}
return '';
}
public static function wrapEnd( $callee, $miniTrace, $prevCaller )
{
$lastLine = self::_colorize( self::_char( "", 80 ), 'title' );
$lastChar = Kint::enabled() === Kint::MODE_PLAIN ? '</pre>' : '';
if ( !Kint::$displayCalledFrom ) return $lastLine . $lastChar;
return $lastLine . self::_colorize( 'Called from ' . self::_buildCalleeString( $callee ), 'title' ) . $lastChar;
}
private static function _drawHeader( kintVariableData $kintVar )
{
$output = '';
if ( $kintVar->access ) {
$output .= ' ' . $kintVar->access;
}
if ( $kintVar->name !== null && $kintVar->name !== '' ) {
$output .= ' ' . kintParser::escape( $kintVar->name );
}
if ( $kintVar->operator ) {
$output .= ' ' . $kintVar->operator;
}
$output .= ' ' . self::_colorize( $kintVar->type, 'type', false );
if ( $kintVar->size !== null ) {
$output .= ' (' . $kintVar->size . ')';
}
if ( $kintVar->value !== null && $kintVar->value !== '' ) {
$output .= ' ' . self::_colorize(
$kintVar->value, # escape shell
'value',
false
);
}
return ltrim( $output );
}
private static function _buildCalleeString( $callee )
{
if ( Kint::enabled() === Kint::MODE_CLI ) { // todo win/nix
return "{$callee['file']}:{$callee['line']}";
}
$url = Kint::getIdeLink( $callee['file'], $callee['line'] );
$shortenedName = Kint::shortenPath( $callee['file'] ) . ':' . $callee['line'];
if ( Kint::enabled() === Kint::MODE_PLAIN ) {
if ( strpos( $url, 'http://' ) === 0 ) {
$calleeInfo = "<a href=\"#\"onclick=\""
. "X=new XMLHttpRequest;"
. "X.open('GET','{$url}');"
. "X.send();"
. "return!1\">{$shortenedName}</a>";
} else {
$calleeInfo = "<a href=\"{$url}\">{$shortenedName}</a>";
}
} else {
$calleeInfo = $shortenedName;
}
return $calleeInfo;
}
public static function init()
{
self::$_enableColors =
Kint::$cliColors
&& ( DIRECTORY_SEPARATOR === '/' || getenv( 'ANSICON' ) !== false || getenv( 'ConEmuANSI' ) === 'ON' );
return Kint::enabled() === Kint::MODE_PLAIN
? '<style>.-kint i{color:#d00;font-style:normal}.-kint u{color:#030;text-decoration:none;font-weight:bold}</style>'
: '';
}
}

View File

@ -1,319 +0,0 @@
<?php
class Kint_Decorators_Rich
{
# make calls to Kint::dump() from different places in source coloured differently.
private static $_usedColors = array();
public static function decorate( kintVariableData $kintVar )
{
$output = '<dl>';
$extendedPresent = $kintVar->extendedValue !== null || $kintVar->_alternatives !== null;
if ( $extendedPresent ) {
$class = 'kint-parent';
if ( Kint::$expandedByDefault ) {
$class .= ' kint-show';
}
$output .= '<dt class="' . $class . '">';
} else {
$output .= '<dt>';
}
if ( $extendedPresent ) {
$output .= '<span class="kint-popup-trigger" title="Open in new window">&rarr;</span><nav></nav>';
}
$output .= self::_drawHeader( $kintVar ) . $kintVar->value . '</dt>';
if ( $extendedPresent ) {
$output .= '<dd>';
}
if ( isset( $kintVar->extendedValue ) ) {
if ( is_array( $kintVar->extendedValue ) ) {
foreach ( $kintVar->extendedValue as $v ) {
$output .= self::decorate( $v );
}
} elseif ( is_string( $kintVar->extendedValue ) ) {
$output .= '<pre>' . $kintVar->extendedValue . '</pre>';
} else {
$output .= self::decorate( $kintVar->extendedValue ); //it's kint's container
}
} elseif ( isset( $kintVar->_alternatives ) ) {
$output .= "<ul class=\"kint-tabs\">";
foreach ( $kintVar->_alternatives as $k => $var ) {
$active = $k === 0 ? ' class="kint-active-tab"' : '';
$output .= "<li{$active}>" . self::_drawHeader( $var, false ) . '</li>';
}
$output .= "</ul><ul>";
foreach ( $kintVar->_alternatives as $var ) {
$output .= "<li>";
$var = $var->value;
if ( is_array( $var ) ) {
foreach ( $var as $v ) {
$output .= is_string( $v )
? '<pre>' . $v . '</pre>'
: self::decorate( $v );
}
} elseif ( is_string( $var ) ) {
$output .= '<pre>' . $var . '</pre>';
} elseif ( isset( $var ) ) {
throw new Exception(
'Kint has encountered an error, '
. 'please paste this report to https://github.com/raveren/kint/issues<br>'
. 'Error encountered at ' . basename( __FILE__ ) . ':' . __LINE__ . '<br>'
. ' variables: '
. htmlspecialchars( var_export( $kintVar->_alternatives, true ), ENT_QUOTES )
);
}
$output .= "</li>";
}
$output .= "</ul>";
}
if ( $extendedPresent ) {
$output .= '</dd>';
}
$output .= '</dl>';
return $output;
}
public static function decorateTrace( $traceData )
{
$output = '<dl class="kint-trace">';
foreach ( $traceData as $i => $step ) {
$class = 'kint-parent';
if ( Kint::$expandedByDefault ) {
$class .= ' kint-show';
}
$output .= '<dt class="' . $class . '">'
. '<b>' . ( $i + 1 ) . '</b> '
. '<nav></nav>'
. '<var>';
if ( isset( $step['file'] ) ) {
$output .= self::_ideLink( $step['file'], $step['line'] );
} else {
$output .= 'PHP internal call';
}
$output .= '</var>';
$output .= $step['function'];
if ( isset( $step['args'] ) ) {
$output .= '(' . implode( ', ', array_keys( $step['args'] ) ) . ')';
}
$output .= '</dt><dd>';
$firstTab = ' class="kint-active-tab"';
$output .= '<ul class="kint-tabs">';
if ( !empty( $step['source'] ) ) {
$output .= "<li{$firstTab}>Source</li>";
$firstTab = '';
}
if ( !empty( $step['args'] ) ) {
$output .= "<li{$firstTab}>Arguments</li>";
$firstTab = '';
}
if ( !empty( $step['object'] ) ) {
kintParser::reset();
$calleeDump = kintParser::factory( $step['object'] );
$output .= "<li{$firstTab}>Callee object [{$calleeDump->type}]</li>";
}
$output .= '</ul><ul>';
if ( !empty( $step['source'] ) ) {
$output .= "<li><pre class=\"kint-source\">{$step['source']}</pre></li>";
}
if ( !empty( $step['args'] ) ) {
$output .= "<li>";
foreach ( $step['args'] as $k => $arg ) {
kintParser::reset();
$output .= self::decorate( kintParser::factory( $arg, $k ) );
}
$output .= "</li>";
}
if ( !empty( $step['object'] ) ) {
$output .= "<li>" . self::decorate( $calleeDump ) . "</li>";
}
$output .= '</ul></dd>';
}
$output .= '</dl>';
return $output;
}
/**
* called for each dump, opens the html tag
*
* @param array $callee caller information taken from debug backtrace
*
* @return string
*/
public static function wrapStart()
{
return "<div class=\"kint\">";
}
/**
* closes Kint::_wrapStart() started html tags and displays callee information
*
* @param array $callee caller information taken from debug backtrace
* @param array $miniTrace full path to kint call
* @param array $prevCaller previous caller information taken from debug backtrace
*
* @return string
*/
public static function wrapEnd( $callee, $miniTrace, $prevCaller )
{
if ( !Kint::$displayCalledFrom ) {
return '</div>';
}
$callingFunction = '';
$calleeInfo = '';
$traceDisplay = '';
if ( isset( $prevCaller['class'] ) ) {
$callingFunction = $prevCaller['class'];
}
if ( isset( $prevCaller['type'] ) ) {
$callingFunction .= $prevCaller['type'];
}
if ( isset( $prevCaller['function'] )
&& !in_array( $prevCaller['function'], array( 'include', 'include_once', 'require', 'require_once' ) )
) {
$callingFunction .= $prevCaller['function'] . '()';
}
$callingFunction and $callingFunction = " [{$callingFunction}]";
if ( isset( $callee['file'] ) ) {
$calleeInfo .= 'Called from ' . self::_ideLink( $callee['file'], $callee['line'] );
}
if ( !empty( $miniTrace ) ) {
$traceDisplay = '<ol>';
foreach ( $miniTrace as $step ) {
$traceDisplay .= '<li>' . self::_ideLink( $step['file'], $step['line'] ); // closing tag not required
if ( isset( $step['function'] )
&& !in_array( $step['function'], array( 'include', 'include_once', 'require', 'require_once' ) )
) {
$classString = ' [';
if ( isset( $step['class'] ) ) {
$classString .= $step['class'];
}
if ( isset( $step['type'] ) ) {
$classString .= $step['type'];
}
$classString .= $step['function'] . '()]';
$traceDisplay .= $classString;
}
}
$traceDisplay .= '</ol>';
$calleeInfo = '<nav></nav>' . $calleeInfo;
}
return "<footer>"
. '<span class="kint-popup-trigger" title="Open in new window">&rarr;</span> '
. "{$calleeInfo}{$callingFunction}{$traceDisplay}"
. "</footer></div>";
}
private static function _drawHeader( kintVariableData $kintVar, $verbose = true )
{
$output = '';
if ( $verbose ) {
if ( $kintVar->access !== null ) {
$output .= "<var>" . $kintVar->access . "</var> ";
}
if ( $kintVar->name !== null && $kintVar->name !== '' ) {
$output .= "<dfn>" . kintParser::escape( $kintVar->name ) . "</dfn> ";
}
if ( $kintVar->operator !== null ) {
$output .= $kintVar->operator . " ";
}
}
if ( $kintVar->type !== null ) {
if ( $verbose ) {
$output .= "<var>";
}
$output .= $kintVar->type;
if ( $verbose ) {
$output .= "</var>";
} else {
$output .= " ";
}
}
if ( $kintVar->size !== null ) {
$output .= "(" . $kintVar->size . ") ";
}
return $output;
}
private static function _ideLink( $file, $line )
{
$shortenedPath = Kint::shortenPath( $file );
if ( !Kint::$fileLinkFormat ) return $shortenedPath . ':' . $line;
$ideLink = Kint::getIdeLink( $file, $line );
$class = ( strpos( $ideLink, 'http://' ) === 0 ) ? 'class="kint-ide-link" ' : '';
return "<a {$class}href=\"{$ideLink}\">{$shortenedPath}:{$line}</a>";
}
/**
* produces css and js required for display. May be called multiple times, will only produce output once per
* pageload or until `-` or `@` modifier is used
*
* @return string
*/
public static function init()
{
$baseDir = KINT_DIR . 'view/compiled/';
if ( !is_readable( $cssFile = $baseDir . Kint::$theme . '.css' ) ) {
$cssFile = $baseDir . 'original.css';
}
return
'<script class="-kint-js">' . file_get_contents( $baseDir . 'kint.js' ) . '</script>'
. '<style class="-kint-css">' . file_get_contents( $cssFile ) . "</style>\n";
}
}

View File

@ -1,176 +0,0 @@
<?php
require( '../Kint.class.php' );
$selectedTheme = isset( $_GET['theme'] ) ? $_GET['theme'] : 'original';
$allowedThemes = array();
$dh = opendir( '../view/compiled' );
while ( ( $filename = readdir( $dh ) ) !== false ) {
if ( strpos( $filename, '.css' ) !== false ) {
$allowedThemes[] = str_replace( '.css', '', $filename );
}
}
sort( $allowedThemes );
if ( in_array( $selectedTheme, $allowedThemes ) ) {
Kint::$theme = $selectedTheme;
}
class BaseUser
{
/**
* @return string
*/
public function getFullName() { }
}
class User extends BaseUser
{
CONST DEFAULT_PATH = 'some/default/path';
CONST ROLE_DISALLOWED = 1;
CONST ROLE_ALLOWED = 2;
CONST ROLE_FORBIDDEN = 3;
public $additionalData;
private $username = 'demo_username';
private $password = 'demo_password';
private $createdDate;
public function __construct() { }
/**
* Check is user is equal to another user
*/
public function isEqualTo( BaseUser $user ) { }
/**
* Get data from this demo class
*
* @param string $username
*
* @return array
*/
public function setUsername( $username ) { }
/**
* Set additional data
*
* @array $data
*/
public function setAdditionalData( array $data ) { $this->additionalData = $data; }
/**
* @return \DateTime date object
*/
public function getCreatedDate() { }
/**
* @param \DateTime $date
*/
public function setCreatedDate( DateTime $date ) { $this->createdDate = $date; }
/**
* Dummy method that triggers trace
*/
public function ensure() { Kint::trace(); }
}
class UserManager
{
private $user;
/**
* Get user from manager
*/
public function getUser() { return $this->user; }
/**
* Debug specific user
*
* @param \User $user
*/
public function debugUser( $user )
{
$this->user = $user;
d( $this->getUser() );
}
/**
* Ensure user (triggers ensure() method on \User object that trace)
*
* @void
*/
public function ensureUser() { $this->user->ensure(); }
}
$user = new User;
$user->setAdditionalData( array(
'last_login' => new DateTime(),
'current_unix_timestamp' => time(),
'random_rgb_color_code' => '#FF9900',
'impressions' => 60,
'nickname' => 'Someuser',
)
);
$user->setCreatedDate( new DateTime( '2013-10-10' ) );
$userManager = new UserManager();
for ( $i = 1; $i < 6; $i++ ) {
$tabularData[] = array(
'date' => "2013-01-0{$i}",
'allowed' => $i % 3 == 0,
'action' => "action {$i}",
'clicks' => rand( 100, 50000 ),
'impressions' => rand( 10000, 500000 ),
);
if ( $i % 2 == 0 ) {
unset( $tabularData[ $i - 1 ]['clicks'] );
}
}
$nestedArray = array();
for ( $i = 1; $i < 6; $i++ ) {
$nestedArray["user group {$i}"] = array(
"user {$i}" => array(
'name' => "Name {$i}",
'surname' => "Surname {$i}"
),
'data' => array(
'conversions' => rand( 100, 5000 ),
'spent' => array( 'currency' => 'EUR', 'amount' => rand( 10000, 500000 ) )
),
);
}
?>
<html>
<head>
<title>Kint PHP debugging tool - overview</title>
</head>
<body>
<div>
<label style="float: right">Switch theme:
<select onchange="window.location = '?theme=' + this.value">
<?php $chosen = isset( $_GET['theme'] ) ? $_GET['theme'] : 'original' ?>
<?php foreach ( $allowedThemes as $theme ) : ?>
<option value="<?php echo $theme ?>"<?php echo $theme === $chosen ? ' selected' : '' ?>>
<?php echo ucfirst( str_replace( '-', ' ', $theme ) ) ?>
</option>
<?php endforeach ?>
</select>
</label>
<h2>Kint PHP debugging tool - overview</h2>
</div>
<h3>Debug variables</h3>
<?php
$userManager->debugUser( $user );
d( $userManager, $tabularData );
d( $nestedArray );
?>
<h3>Trace</h3>
<?php $userManager->ensureUser(); ?>
</body>
</html>

View File

@ -1,19 +0,0 @@
<?php
abstract class KintObject
{
/** @var string type of variable, can be set in inherited object or in static::parse() method */
public $name = 'NOT SET';
/** @var string quick variable value displayed inline */
public $value;
/**
* returns false or associative array - each key represents a tab in default view, values may be anything
*
* @param $variable
*
* @return mixed
*/
abstract public function parse( & $variable );
}

View File

@ -1,608 +0,0 @@
<?php
abstract class kintParser extends kintVariableData
{
private static $_level = 0;
private static $_customDataTypes;
private static $_objectParsers;
private static $_objects;
private static $_marker;
private static $_skipAlternatives = false;
private static $_placeFullStringInValue = false;
private static function _init()
{
$fh = opendir( KINT_DIR . 'parsers/custom/' );
while ( $fileName = readdir( $fh ) ) {
if ( substr( $fileName, -4 ) !== '.php' ) continue;
require KINT_DIR . 'parsers/custom/' . $fileName;
self::$_customDataTypes[] = substr( $fileName, 0, -4 );
}
$fh = opendir( KINT_DIR . 'parsers/objects/' );
while ( $fileName = readdir( $fh ) ) {
if ( substr( $fileName, -4 ) !== '.php' ) continue;
require KINT_DIR . 'parsers/objects/' . $fileName;
self::$_objectParsers[] = substr( $fileName, 0, -4 );
}
}
public static function reset()
{
self::$_level = 0;
self::$_objects = self::$_marker = null;
}
/**
* main and usually single method a custom parser must implement
*
* @param mixed $variable
*
* @return mixed [!!!] false is returned if the variable is not of current type
*/
abstract protected function _parse( & $variable );
/**
* the only public entry point to return a parsed representation of a variable
*
* @static
*
* @param $variable
* @param null $name
*
* @throws Exception
* @return \kintParser
*/
public final static function factory( & $variable, $name = null )
{
isset( self::$_customDataTypes ) or self::_init();
# save internal data to revert after dumping to properly handle recursions etc
$revert = array(
'level' => self::$_level,
'objects' => self::$_objects,
);
self::$_level++;
$varData = new kintVariableData;
$varData->name = $name;
# first parse the variable based on its type
$varType = gettype( $variable );
$varType === 'unknown type' and $varType = 'unknown'; # PHP 5.4 inconsistency
$methodName = '_parse_' . $varType;
# objects can be presented in a different way altogether, INSTEAD, not ALONGSIDE the generic parser
if ( $varType === 'object' ) {
foreach ( self::$_objectParsers as $parserClass ) {
$className = 'Kint_Objects_' . $parserClass;
/** @var $object KintObject */
$object = new $className;
if ( ( $alternativeTabs = $object->parse( $variable ) ) !== false ) {
self::$_skipAlternatives = true;
$alternativeDisplay = new kintVariableData;
$alternativeDisplay->type = $object->name;
$alternativeDisplay->value = $object->value;
$alternativeDisplay->name = $name;
foreach ( $alternativeTabs as $name => $values ) {
$alternative = kintParser::factory( $values );
$alternative->type = $name;
if ( Kint::enabled() === Kint::MODE_RICH ) {
empty( $alternative->value ) and $alternative->value = $alternative->extendedValue;
$alternativeDisplay->_alternatives[] = $alternative;
} else {
$alternativeDisplay->extendedValue[] = $alternative;
}
}
self::$_skipAlternatives = false;
self::$_level = $revert['level'];
self::$_objects = $revert['objects'];
return $alternativeDisplay;
}
}
}
# base type parser returning false means "stop processing further": e.g. recursion
if ( self::$methodName( $variable, $varData ) === false ) {
self::$_level--;
return $varData;
}
if ( Kint::enabled() === Kint::MODE_RICH && !self::$_skipAlternatives ) {
# if an alternative returns something that can be represented in an alternative way, don't :)
self::$_skipAlternatives = true;
# now check whether the variable can be represented in a different way
foreach ( self::$_customDataTypes as $parserClass ) {
$className = 'Kint_Parsers_' . $parserClass;
/** @var $parser kintParser */
$parser = new $className;
$parser->name = $name; # the parser may overwrite the name value, so set it first
if ( $parser->_parse( $variable ) !== false ) {
$varData->_alternatives[] = $parser;
}
}
# if alternatives exist, push extendedValue to their front and display it as one of alternatives
if ( !empty( $varData->_alternatives ) && isset( $varData->extendedValue ) ) {
$_ = new kintVariableData;
$_->value = $varData->extendedValue;
$_->type = 'contents';
$_->size = null;
array_unshift( $varData->_alternatives, $_ );
$varData->extendedValue = null;
}
self::$_skipAlternatives = false;
}
self::$_level = $revert['level'];
self::$_objects = $revert['objects'];
if ( strlen( $varData->name ) > 80 ) {
$varData->name =
self::_substr( $varData->name, 0, 37 )
. '...'
. self::_substr( $varData->name, -38, null );
}
return $varData;
}
private static function _checkDepth()
{
return Kint::$maxLevels != 0 && self::$_level >= Kint::$maxLevels;
}
private static function _isArrayTabular( array $variable )
{
if ( Kint::enabled() !== Kint::MODE_RICH ) return false;
$arrayKeys = array();
$keys = null;
$closeEnough = false;
foreach ( $variable as $row ) {
if ( !is_array( $row ) || empty( $row ) ) return false;
foreach ( $row as $col ) {
if ( !empty( $col ) && !is_scalar( $col ) ) return false; // todo add tabular "tolerance"
}
if ( isset( $keys ) && !$closeEnough ) {
# let's just see if the first two rows have same keys, that's faster and has the
# positive side effect of easily spotting missing keys in later rows
if ( $keys !== array_keys( $row ) ) return false;
$closeEnough = true;
} else {
$keys = array_keys( $row );
}
$arrayKeys = array_unique( array_merge( $arrayKeys, $keys ) );
}
return $arrayKeys;
}
private static function _decorateCell( kintVariableData $kintVar )
{
if ( $kintVar->extendedValue !== null || !empty( $kintVar->_alternatives ) ) {
return '<td>' . Kint_Decorators_Rich::decorate( $kintVar ) . '</td>';
}
$output = '<td';
if ( $kintVar->value !== null ) {
$output .= ' title="' . $kintVar->type;
if ( $kintVar->size !== null ) {
$output .= " (" . $kintVar->size . ")";
}
$output .= '">' . $kintVar->value;
} else {
$output .= '>';
if ( $kintVar->type !== 'NULL' ) {
$output .= '<u>' . $kintVar->type;
if ( $kintVar->size !== null ) {
$output .= "(" . $kintVar->size . ")";
}
$output .= '</u>';
} else {
$output .= '<u>NULL</u>';
}
}
return $output . '</td>';
}
public static function escape( $value, $encoding = null )
{
if ( empty( $value ) ) return $value;
if ( Kint::enabled() === Kint::MODE_CLI ) {
$value = str_replace( "\x1b", "\\x1b", $value );
}
if ( Kint::enabled() === Kint::MODE_CLI || Kint::enabled() === Kint::MODE_WHITESPACE ) return $value;
$encoding or $encoding = self::_detectEncoding( $value );
$value = htmlspecialchars( $value, ENT_NOQUOTES, $encoding === 'ASCII' ? 'UTF-8' : $encoding );
if ( $encoding === 'UTF-8' ) {
// todo we could make the symbols hover-title show the code for the invisible symbol
# when possible force invisible characters to have some sort of display (experimental)
$value = preg_replace( '/[\x00-\x08\x0B\x0C\x0E-\x1F\x80-\x9F]/u', '?', $value );
}
# this call converts all non-ASCII characters into html chars of format
if ( function_exists( 'mb_encode_numericentity' ) ) {
$value = mb_encode_numericentity(
$value,
array( 0x80, 0xffff, 0, 0xffff, ),
$encoding
);
}
return $value;
}
private static $_dealingWithGlobals = false;
private static function _parse_array( &$variable, kintVariableData $variableData )
{
isset( self::$_marker ) or self::$_marker = "\x00" . uniqid();
# naturally, $GLOBALS variable is an intertwined recursion nightmare, use black magic
$globalsDetector = false;
if ( array_key_exists( 'GLOBALS', $variable ) && is_array( $variable['GLOBALS'] ) ) {
$globalsDetector = "\x01" . uniqid();
$variable['GLOBALS'][ $globalsDetector ] = true;
if ( isset( $variable[ $globalsDetector ] ) ) {
unset( $variable[ $globalsDetector ] );
self::$_dealingWithGlobals = true;
} else {
unset( $variable['GLOBALS'][ $globalsDetector ] );
$globalsDetector = false;
}
}
$variableData->type = 'array';
$variableData->size = count( $variable );
if ( $variableData->size === 0 ) {
return;
}
if ( isset( $variable[ self::$_marker ] ) ) { # recursion; todo mayhaps show from where
if ( self::$_dealingWithGlobals ) {
$variableData->value = '*RECURSION*';
} else {
unset( $variable[ self::$_marker ] );
$variableData->value = self::$_marker;
}
return false;
}
if ( self::_checkDepth() ) {
$variableData->extendedValue = "*DEPTH TOO GREAT*";
return false;
}
$isSequential = self::_isSequential( $variable );
if ( $variableData->size > 1 && ( $arrayKeys = self::_isArrayTabular( $variable ) ) !== false ) {
$variable[ self::$_marker ] = true; # this must be AFTER _isArrayTabular
$firstRow = true;
$extendedValue = '<table class="kint-report"><thead>';
foreach ( $variable as $rowIndex => & $row ) {
# display strings in their full length
self::$_placeFullStringInValue = true;
if ( $rowIndex === self::$_marker ) continue;
if ( isset( $row[ self::$_marker ] ) ) {
$variableData->value = "*RECURSION*";
return false;
}
$extendedValue .= '<tr>';
if ( $isSequential ) {
$output = '<td>' . '#' . ( $rowIndex + 1 ) . '</td>';
} else {
$output = self::_decorateCell( kintParser::factory( $rowIndex ) );
}
if ( $firstRow ) {
$extendedValue .= '<th>&nbsp;</th>';
}
# we iterate the known full set of keys from all rows in case some appeared at later rows,
# as we only check the first two to assume
foreach ( $arrayKeys as $key ) {
if ( $firstRow ) {
$extendedValue .= '<th>' . self::escape( $key ) . '</th>';
}
if ( !array_key_exists( $key, $row ) ) {
$output .= '<td class="kint-empty"></td>';
continue;
}
$var = kintParser::factory( $row[ $key ] );
if ( $var->value === self::$_marker ) {
$variableData->value = '*RECURSION*';
return false;
} elseif ( $var->value === '*RECURSION*' ) {
$output .= '<td class="kint-empty"><u>*RECURSION*</u></td>';
} else {
$output .= self::_decorateCell( $var );
}
unset( $var );
}
if ( $firstRow ) {
$extendedValue .= '</tr></thead><tr>';
$firstRow = false;
}
$extendedValue .= $output . '</tr>';
}
self::$_placeFullStringInValue = false;
$variableData->extendedValue = $extendedValue . '</table>';
} else {
$variable[ self::$_marker ] = true;
$extendedValue = array();
foreach ( $variable as $key => & $val ) {
if ( $key === self::$_marker ) continue;
$output = kintParser::factory( $val );
if ( $output->value === self::$_marker ) {
$variableData->value = "*RECURSION*"; // recursion occurred on a higher level, thus $this is recursion
return false;
}
if ( !$isSequential ) {
$output->operator = '=>';
}
$output->name = $isSequential ? null : "'" . $key . "'";
$extendedValue[] = $output;
}
$variableData->extendedValue = $extendedValue;
}
if ( $globalsDetector ) {
self::$_dealingWithGlobals = false;
}
unset( $variable[ self::$_marker ] );
}
private static function _parse_object( &$variable, kintVariableData $variableData )
{
if ( function_exists( 'spl_object_hash' ) ) {
$hash = spl_object_hash( $variable );
} else {
ob_start();
var_dump( $variable );
preg_match( '[#(\d+)]', ob_get_clean(), $match );
$hash = $match[1];
}
$castedArray = (array) $variable;
$variableData->type = get_class( $variable );
$variableData->size = count( $castedArray );
if ( isset( self::$_objects[ $hash ] ) ) {
$variableData->value = '*RECURSION*';
return false;
}
if ( self::_checkDepth() ) {
$variableData->extendedValue = "*DEPTH TOO GREAT*";
return false;
}
# ArrayObject (and maybe ArrayIterator, did not try yet) unsurprisingly consist of mainly dark magic.
# What bothers me most, var_dump sees no problem with it, and ArrayObject also uses a custom,
# undocumented serialize function, so you can see the properties in internal functions, but
# can never iterate some of them if the flags are not STD_PROP_LIST. Fun stuff.
if ( $variableData->type === 'ArrayObject' || is_subclass_of( $variable, 'ArrayObject' ) ) {
$arrayObjectFlags = $variable->getFlags();
$variable->setFlags( ArrayObject::STD_PROP_LIST );
}
self::$_objects[ $hash ] = true; // todo store reflectorObject here for alternatives cache
$reflector = new ReflectionObject( $variable );
# add link to definition of userland objects
if ( Kint::enabled() === Kint::MODE_RICH && Kint::$fileLinkFormat && $reflector->isUserDefined() ) {
$url = Kint::getIdeLink( $reflector->getFileName(), $reflector->getStartLine() );
$class = ( strpos( $url, 'http://' ) === 0 ) ? 'class="kint-ide-link" ' : '';
$variableData->type = "<a {$class}href=\"{$url}\">{$variableData->type}</a>";
}
$variableData->size = 0;
$extendedValue = array();
$encountered = array();
# copy the object as an array as it provides more info than Reflection (depends)
foreach ( $castedArray as $key => $value ) {
/* casting object to array:
* integer properties are inaccessible;
* private variables have the class name prepended to the variable name;
* protected variables have a '*' prepended to the variable name.
* These prepended values have null bytes on either side.
* http://www.php.net/manual/en/language.types.array.php#language.types.array.casting
*/
if ( $key{0} === "\x00" ) {
$access = $key{1} === "*" ? "protected" : "private";
// Remove the access level from the variable name
$key = substr( $key, strrpos( $key, "\x00" ) + 1 );
} else {
$access = "public";
}
$encountered[ $key ] = true;
$output = kintParser::factory( $value, self::escape( $key ) );
$output->access = $access;
$output->operator = '->';
$extendedValue[] = $output;
$variableData->size++;
}
foreach ( $reflector->getProperties() as $property ) {
$name = $property->name;
if ( $property->isStatic() || isset( $encountered[ $name ] ) ) continue;
if ( $property->isProtected() ) {
$property->setAccessible( true );
$access = "protected";
} elseif ( $property->isPrivate() ) {
$property->setAccessible( true );
$access = "private";
} else {
$access = "public";
}
$value = $property->getValue( $variable );
$output = kintParser::factory( $value, self::escape( $name ) );
$output->access = $access;
$output->operator = '->';
$extendedValue[] = $output;
$variableData->size++;
}
if ( isset( $arrayObjectFlags ) ) {
$variable->setFlags( $arrayObjectFlags );
}
if ( $variableData->size ) {
$variableData->extendedValue = $extendedValue;
}
}
private static function _parse_boolean( &$variable, kintVariableData $variableData )
{
$variableData->type = 'bool';
$variableData->value = $variable ? 'TRUE' : 'FALSE';
}
private static function _parse_double( &$variable, kintVariableData $variableData )
{
$variableData->type = 'float';
$variableData->value = $variable;
}
private static function _parse_integer( &$variable, kintVariableData $variableData )
{
$variableData->type = 'integer';
$variableData->value = $variable;
}
private static function _parse_null( &$variable, kintVariableData $variableData )
{
$variableData->type = 'NULL';
}
private static function _parse_resource( &$variable, kintVariableData $variableData )
{
$resourceType = get_resource_type( $variable );
$variableData->type = "resource ({$resourceType})";
if ( $resourceType === 'stream' && $meta = stream_get_meta_data( $variable ) ) {
if ( isset( $meta['uri'] ) ) {
$file = $meta['uri'];
if ( function_exists( 'stream_is_local' ) ) {
// Only exists on PHP >= 5.2.4
if ( stream_is_local( $file ) ) {
$file = Kint::shortenPath( $file );
}
}
$variableData->value = $file;
}
}
}
private static function _parse_string( &$variable, kintVariableData $variableData )
{
$variableData->type = 'string';
$encoding = self::_detectEncoding( $variable );
if ( $encoding !== 'ASCII' ) {
$variableData->type .= ' ' . $encoding;
}
$variableData->size = self::_strlen( $variable, $encoding );
if ( Kint::enabled() !== Kint::MODE_RICH ) {
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
return;
}
if ( !self::$_placeFullStringInValue ) {
$strippedString = preg_replace( '[\s+]', ' ', $variable );
if ( Kint::$maxStrLength && $variableData->size > Kint::$maxStrLength ) {
// encode and truncate
$variableData->value = '"'
. self::escape( self::_substr( $strippedString, 0, Kint::$maxStrLength, $encoding ), $encoding )
. '&hellip;"';
$variableData->extendedValue = self::escape( $variable, $encoding );
return;
} elseif ( $variable !== $strippedString ) { // omit no data from display
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
$variableData->extendedValue = self::escape( $variable, $encoding );
return;
}
}
$variableData->value = '"' . self::escape( $variable, $encoding ) . '"';
}
private static function _parse_unknown( &$variable, kintVariableData $variableData )
{
$type = gettype( $variable );
$variableData->type = "UNKNOWN" . ( !empty( $type ) ? " ({$type})" : '' );
$variableData->value = var_export( $variable, true );
}
}

View File

@ -1,87 +0,0 @@
<?php
class kintVariableData
{
/** @var string */
public $type;
/** @var string */
public $access;
/** @var string */
public $name;
/** @var string */
public $operator;
/** @var int */
public $size;
/**
* @var kintVariableData[] array of kintVariableData objects or strings; displayed collapsed, each element from
* the array is a separate possible representation of the dumped var
*/
public $extendedValue;
/** @var string inline value */
public $value;
/** @var kintVariableData[] array of alternative representations for same variable, don't use in custom parsers */
public $_alternatives;
/* *******************************************
* HELPERS
*/
protected static function _detectEncoding( $value )
{
$ret = null;
if ( function_exists( 'mb_detect_encoding' ) ) {
$mbDetected = mb_detect_encoding( $value );
if ( $mbDetected === 'ASCII' ) return 'ASCII';
}
if ( !function_exists( 'iconv' ) ) {
return !empty( $mbDetected ) ? $mbDetected : 'UTF-8';
}
$md5 = md5( $value );
foreach ( Kint::$charEncodings as $encoding ) {
# fuck knows why, //IGNORE and //TRANSLIT still throw notice
if ( md5( @iconv( $encoding, $encoding, $value ) ) === $md5 ) {
return $encoding;
}
}
return 'ASCII';
}
/**
* returns whether the array:
* 1) is numeric and
* 2) in sequence starting from zero
*
* @param array $array
*
* @return bool
*/
protected static function _isSequential( array $array )
{
return array_keys( $array ) === range( 0, count( $array ) - 1 );
}
protected static function _strlen( $string, $encoding = null )
{
if ( function_exists( 'mb_strlen' ) ) {
$encoding or $encoding = self::_detectEncoding( $string );
return mb_strlen( $string, $encoding );
} else {
return strlen( $string );
}
}
protected static function _substr( $string, $start, $end, $encoding = null )
{
if ( function_exists( 'mb_substr' ) ) {
$encoding or $encoding = self::_detectEncoding( $string );
return mb_substr( $string, $start, $end, $encoding );
} else {
return substr( $string, $start, $end );
}
}
}

172
system/ThirdParty/Kint/kint.php vendored Normal file
View File

@ -0,0 +1,172 @@
<?php
/**
* The MIT License (MIT).
*
* Copyright (c) 2013 Jonathan Vollebregt (jnvsor@gmail.com), Rokas Å leinius (raveren@gmail.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.
*/
if (defined('KINT_DIR')) {
return;
}
if (version_compare(PHP_VERSION, '5.1.2') < 0) {
throw new Exception('Kint 2.0 requires PHP 5.1.2 or higher');
}
define('KINT_DIR', dirname(__FILE__));
define('KINT_WIN', DIRECTORY_SEPARATOR !== '/');
define('KINT_PHP52', (version_compare(PHP_VERSION, '5.2') >= 0));
define('KINT_PHP522', (version_compare(PHP_VERSION, '5.2.2') >= 0));
define('KINT_PHP523', (version_compare(PHP_VERSION, '5.2.3') >= 0));
define('KINT_PHP524', (version_compare(PHP_VERSION, '5.2.4') >= 0));
define('KINT_PHP525', (version_compare(PHP_VERSION, '5.2.5') >= 0));
define('KINT_PHP53', (version_compare(PHP_VERSION, '5.3') >= 0));
define('KINT_PHP56', (version_compare(PHP_VERSION, '5.6') >= 0));
define('KINT_PHP70', (version_compare(PHP_VERSION, '7.0') >= 0));
define('KINT_PHP72', (version_compare(PHP_VERSION, '7.2') >= 0));
eval(gzuncompress('xœí½]w¹±(ú¾E[ѸÉ1ESŸ),kÆÚ-IN&GR¸šdSbL²™nÒ²ãÑYw<EFBFBD>çûpö]ëþ¾óK.ª
<EFBFBD>&)Û3™d\'Ûl P' . "\0" . '
…B¡P(tIQDè<EFBFBD>&Ñçh<mú<EFBFBD>¨˜$ñÏr:JÚƒ´ÛfÝ4Ú<EFBFBD>&ù4Ýqa ¯ÕM{Ét00E:è5¯O^¶N<EFBFBD>^Íou}»ÈÁñW"O\'Ó|ä%÷úƒ´<35>Þ·zY>L î8ö ºýb<H>µ:É' . "\0" . ':Ò˳aYGñ¸•gÙ¤Õíç…' . "\0" . 'Jò<ùT©ú=H>ŠŒ\'7fËËM?Ž“Q7íŠÌ^2(üjDŸEñIÚ™ô³Qi[ý¤HM+ä?1 S\\âît8Ž«57y\'<27>ÒýVç©hUž²ž¹CíîEˆ©u*a[§ýÎ<C3BD>ÀË' . "\0" . 'ßï½ @¾$ý‘ z~øÓy' . "\0" . 'ò<ý8±Å àý;ÒÉFÅ$bÍŒâ<¶’©&Ñ};ñFqÇN•=ˆâ±Ï-ãÁôº?b$¢6½MòB´è…­  ³•:H:ïýbâfÀÄz<C384>Nn²nÌ;ÃZyY1ÍS/9ø2™¤çý¡üCñ6™Ü¸©G“4O&>–ÿ,²öºßɳI' . "\0" . 'õY8¤?½>>¤Ãtäuûl<øALÍ£Q/ d<>´ÿ*8ÿL4"¹öQOò4º©ç ƒ¼Ä›<» fˆ&‹áÓÃÍÈúþèÚKÇ9ã$þ4ó<EFBFBD>óþAc‡CZã,ˆÞtD³»H\'QeQAÀhY}‹¢£é`PW!~Ÿ~â|\'' . "\0" . '´ËK<EFBFBD>`I¾<EFBFBD>ƒd.½ñ[Š&øíJOHÓ ?˜œv¿AnCš)ôb~ÉYD\\ΦN)Q]štn¢
õ8)°ë@ €¼€<EFBFBD>+½&,ÃçNtõ{¢€¦Þƒ]C¿åþH¡o‰<EFBFBD>ti‰b¾†¨­ºE!Y3Hžå <EFBFBD>…©Tà„T¨û.¢®!H(l¾•eü‡ 06]&îÚÉ8zsÞzûêíæÚ&vEí¦íéu«-ä
á„%¢
5§bA™X¥öJ0ÙlꬲåM<EFBFBD>fsœ0èÿ=Ý\'æ«HzH^„Á3h8,¥êöòd˜ê¾úõaþQq,dgÚ­¸Z0%ÕÞ9yÀ;„iÇ œM^<EFBFBD>ÞM&‰3˜d ùôªr7°U[q£ùXË áh:l%9
¨¬¥¾!ÖÊò8' . "\0" . '¨û½¾àiñ\'wª~ä<>Ûõ©º¢ëtr€p ~+?zý müòðÅ»[/öþp~ºpØ:úñÍÉéakÿôdz¸i|5jú|WcÝÝ' . "\0" . '2¨„' . "\0" . '™ÙL6GÅ”©\\Ú:1MZgûo<EFBFBD>ˆÀ8zøP<EFBFBD>;:Õ—Ô2<EFBFBD>fÔ&D¼T­þWÌÇ¡:§ÖG”Ôz@¢Iˆ”VúQŒn"Œæz-Q‰ïÕ§i²¸p•²+. æ´ê¿Úñú½â÷ûöF,Q%k·›µé‡tPÁ "°
¦ÉHÉ Ûƒr*}™4a·è£Ò¢\\—º¶[ø÷¥…ål5µrš<EFBFBD>Ò[ó]Qk²âð× õ ÎWJVs7ÖµR:Ê1MeJWÓšs˜5Å%õ)²”LÁ@>H *?Åj ÒÇUq¹ì¤Q Ãé·^Çè3¹“dÔI³žµŽ¼ÕÀ
ÉcúPü‰#T´
ÔÆ*º1!uÚî€nÜÊz*ËQͨ¸ªÅq¿ý¶ÛŽúÙ…ü¸¢¹4VãJ©Ðñe°Ùȼ\'3
×3òjþYÙcË©á…êV!•£1êG:Oi„«••mgt¨¸ ¥ÃñD¨=Ä<1Ò1¾ñË—Û^_·Ã£.ë_ÙKº]ê€15ÛÔHÖ¿h\\]Ä#±' . "\0" . 'CÕ?ÿùÉHðÕ‡œ­†"u“hÍ…Ï2EI®Êsõ¤8¥8”ê0XÑãðçзTfBJŒ¯¼,Ašà—HÎS$±ÒZèLjò àE¬Ô—øªWV«1-žr€œä€šUxòi £fZ¨@¬ûåꦌéS[ô[`@ÑÞ¯ÙlÑûŠ<C3BB>Œ;B±Ô"$OS¿Õ.¦LÝš3ô«bê\\Ù?G°-M*zêP hÈÄÒeñÊL¼j࿲šëbÕÖ¼ã¡~¥ÒïPˆ0·[nûßd“<1B><>T«ÚA¶•!BóV óžìBSÜâ*‰{J̯×ëUó…?—DÚühë_âÇþÀ¿u)¤Ð¤Á #º<û€#§•8XîÛbBÈ~!
Ò¼ß)Q˺X:Zy*ÆVŒâR¼Í‹Ò$ŸdƒìVŽ—tTM¢)ˆHyÉä@+Ί÷}TZÍð;4«œAI§“Š… \\<Fìð@²8ÏJ˜ðÎ㲸×yR=†™ÎÐ<EFBFBD>_ð¨ÞÎä³Èås5†µà¦¹Ë«m•!\\Ï8+&fmc»ÒÆŒz¦5Ò]0Ûƒ<EFBFBD>i^™vn2ÇweeVš,Ÿ¤˜UЬŒÚ²ð!LSiÆi‰œ‰è<E280B0>¤<>Ð<EFBFBD>+ñcb>Í’ñå%ÌH&t¤ŽåƒÔÙè:-&­a2éÀðˆÆ-«ß¢˜¯Ù¦i\\¡q`÷¤¥XÍ1ÍJ8ŸÁì)ˆ#õ[É _Ù!Âmwª&L… oJD¬E<C2AC>šhÀt4Ñ ™GÍË<ÏŠö¢à¸%ňf×Àd<EFBFBD>¥2שTê ‰2¤ÛÍwð¨¦<EFBFBD>0ïá(åkéŒÏË£S—ÔFÜbŸŒ¸3ÖµÐ(¤‡©/4ŸixÙ§Š@ó<Š…l MQ´¡Z·ú"P_-{‰' . "\0" . '¬—§tò‰Õñ¨÷A (º÷GÜ Â)$×µïz@§ïæÄ*«õ.×ÊIöÛ¤Ë[Âl\'z<>•d3´éËÌf°o;_ÄdöKèÁÊ¥qbaÄðB¡j%SXf“.š›SÚ•8Jì<4A>ÚáehGÛ<C39B>N6PÆ:4"µT3ˆÜ@ä b:²«»ò†6õÚäWóIéØ«PußÀsr<EFBFBD>öê#œW\\@HY8Ã5•£CÕZG½ÑS"ŧ•l%‰5S%Èv0°bN%]0¹%ªlîÑ°5 TKMª-w|)R¨ÕŽSL;à]·Þ¸pYÊ å<wÖBhOé…Ú{œeÓ¼“§£™ô S¾¨D()@S‡%Sh<…G<EFBFBD><EFBFBD><`emQú¢¤f;Â/:â(ZÓÑX¨®ÆÐe튷' . "\0" . 'ÊÆpAF©DÄŽ[¯IÏTœ-d«Ðɤò©ôÛ®1­× mûéã·\\„ý:ªÑ
mØECô_E[W=ªŸqAº=z´üWÍ
6 Úä ÂÃa÷ãz1m{ _¯Šv_e÷¯õw+¨i/€€4ò' . "\0" . '¦Š$<EFBFBD>´\\»r<—F 7»uñNdW:£ Õ*V<EFBFBD>ï¸ñ“O܇@}M,éØ3Îqd m îzO2IªYFl<EFBFBD>ZŸ½Šbyš/B"[çbî4
¶T&ëÕ>û2ÉÆO•_J©jÓɆbr¥ù<EFBFBD>éäð£XãŠ<YŒA‹±·)fð•™Öe5µ×™0À8@½lÐÅ•N)Šõøñ±³ÊrÚ>Ð|Å<EFBFBD> œr}y`*
ŸP#QX5ö±Î®ÿܨA(åù…A Œ¶f%1YÒxØyŸ\\£ kuÓè†ak
Ê­¹ešThh烊<EFBFBD>ô&Saj )ɪ<EFBFBD>•J€¡N™^‹Ê
ËeZ<EFBFBD>‡Ø¡Át¯È”j€~͉Ò>5Ë' . "\0" . 'IrÊ´ù´-)Íè¨@f² j1J&RjA£„Ù Òòéh&Çüéø²_' . "\0" . '…_¥ƒqš+M ¨ØÍ\']ÚŸÄf#¨L7Täü0' . "\0" . 'íÊ â]Q5m®£}í¤-…öèÅ$Ú?88<;k½9ys¨ÕW+çí»ÇGè·„Ý‹ÝüÓ“óÃó×gpšv}¨£?îŸ nƒ4ÄÉÛÃÓýó“ÓPtÞþééþŸ¡ôîž_ðäÅŠ@îJ ÷ì|ÿœ:ÐlÏ«e2«/°$/9®\'Ý2aöÉ¥GŽÔÀd·#±ÕÁqp ¢AŽÉYJã³dàò´—æét§A…ØjJªDubÙà(`9“5Av 8-£Þâẜ×<ßj!­òigÜ}çA$Ýî©U}…[ší,l)ˆÂŒ{01é1¹é`M´ºs¥Vö` ­½…ud+Ênr}ÀÊÀè2ØvFý ƒö¥ •qŒE¶î,Aê“h1IèjqC/¾\\;S "ÄB*¦$•:£vOÊÖo0€ßÃìƒÛ(S<10>¯Ðç=Ó>ÛjÄzÂ=u¹µ.i:q`ˆŽb½,C9Ÿ»=Æž î–×' . "\0" . 'ZŒf" u\\¦Ùl^)£Ê¹<C38A>Ç<EFBFBD><EFBFBD>˜x­tòŠ:Ö>¡b"{E­>
£t”Q¼.Z<bG:Ðz`Rš†$SiþX»àöUn€% š·ý ˆO1 êpœi-/rEmj([WÀræàl©ö àªÏ ÕÚ_Ò‡7 ùã¥Îd%Nä2W1¾ŠXÄ,»ÞˆZ' . "\0" . '«…´ãݱ' . "\0" . '
Ò8Ž•{ã <EFBFBD>ã@ÍBIÍŸ‰E9@"X«KJüÖž38$2DÉð5.Ný`Š<>¯Z;ËÀ1*æu¢0T:Þñ„ ïtD „A×à*V}7³MÁ+º´-<2D>' . "\0" . 'x æÓÇÒJulv2(˜š{©˜L:µÀ¨¢«K¦VK¥BŠsŠJH~îˆø<`§Íú14ÎÌ]€ëçË¢…tJœÞšæñYE9RÕ³˜‰rœ6¨Éá\\<10>_©Â(T¹J!æòTår”&*³ðSå1=Ù@Xʳ„3Z²3c×<>õ*$“ŒÖîØ|2åí%ëÑnézH,¥X*p²fÕ8;Y‰38»_œ¥ŠÊúÉ@¹óã?®µ\\=ŠÊƒ9)8K4Áœ†Ê,0—Î:•òæÅ\'¹(Y,™XÇñÑrß#€bÞg¹­ÖJ\\ó2å¦q/Z¯ù+Hß@“¨¢$¶áb9QL|%úªÛ:qnßq1ßs0ÄÁ&mwÀc;¡‰ ÞZßTöFcÑVG¹\\Ð…`PT)m™ü¼<C3BC><<3C>)˜»sÒtèî1µŸž¹S"Òò÷iÎè0¨u“7©½¯Sè˜ÑB Ûoê\\ß¹“DÃùéÑ<C3A9>?ê½}ÃM#^ŠZu3ÎÞá@¬57ëôðàÝéÙÑ ”Ûp3_¾=Õ:>z}<06>m7ûàäõÛãC4D¬nÌÞ¶ún¾`BŠ¼<C5A0>
S¤OGý¿õ»•%0²^6´•K G6<x' . "\0" . 'µc0˜Šøxù¹Ç<»òÜáÈL-ERì2§$±ÂBbJ)¯‰<EFBFBD>ǃOÚAÑ.gj®Yƒdm4p%Óʪ¬Uë©tä7<EFBFBD>¿O[TYSUêžZWiÊo©M¨O¥y¨oô/ âÿ1/[ƒ<ï ""úe„”Çã»p©S™ë—#ãp©3é~lÊÈ' . "\0" . 'Aèw£÷#±úqð;æJ`3†ê{9<39>öèºõ9[Ðø@ªl1<6C>.r<>o\'å*|.ú<>þ¤5HÚé@Ù FÜb³-ø"Œ\'…' . "\0" . '÷ÂÚ)í½$lyçiT  ÙL/̓¬<C692>.Ž²ÄÊžPÄî˺€Í&Ýÿ8” 4ËXY© ùåÔŽúîV%IÿkŒªúK†ŒÊÎ7+< ¤Þ”<C39E> åÏ@;„Õä—<10> 3­ˆ„ KŽ“Aee…—7ØPu»<EFBFBD>\'§<EFBFBD>iŽ\'¡3 ]úèŒQå}<EFBFBD>/ö²ñ•m/^ÚÔ˜î::<EFBFBD><EFBFBD>|¦Ô÷½]où2cdQ
óZƒþ°?ù=D-ÛKMžP<EFBFBD>?y^+4ôw>žô‡·nÔ|¹›£@Íon>TW7P˜¸»kkždç¦?èú#[PÌ3û<¼}ªµjÀÛ=B/ ¢÷p»¬u¡@ÙÆÉ<>,6Wð­äƒ]ׯoÔà}ZÁ$J¨Â…¨I52äQn­Vk_aÇQ"P¹t胄åvÂ,/ŠÇ`U<>I5M¡ s”ºUIWsÁУÑrI5fÕP¾5•“ËÈŠäÑ®%Ë/XeÒIZ©I”U:f§ë÷_FVK#v@$æ<>myÿÚ<ŒeKƒœ%¥«5^ë`RåÕÁ7z²-Ž<Ⱦ7eíL#)d³¶`ð$Çy
¼C÷s HˆÓkrÓ­Ä<EFBFBD>W¹ì>ª‚û©¼©(ï%Ö¤Ë0ÌsY\'%\\¬â^”ÎØ`öVä]®ÚÔªù
Ë‘¼G œ )P¨5â[«\'
J5èùN\'»Ë&4Ð^9¥Ñ…o/<<EFBFBD>×Ü{ɤ’‹¬™ɸ>Ô¤Ÿüòe-Ð<EFBFBD>×µp‡ì…Í:A
R5Ôm)nr~1U)â l9ûnõÉ5Èk-Ír<ùq”B¥°¢ÍæÙùK0×¼M>;¯JM¥7y™º&xJßb„َʘA$°ÐTŠwEš¿”—Äm~?µ ²"ÐJ œQaj"«R½‡^õ6‡rÒO ulAõBN£apå\'xHXD+Ð
€êt@p즞¸‡@G$ *dÚƒ]„P>1þ…' . "\0" . 'T –Ð B«ìº¤¦)œL•ë8 u¢rÎc¾l*¶0`kò.KZ•%¿<>}U£¬ÊYªS”Deé(ðV™kRœ§ž¬:¨õ\'…Äi“¥%Zð*¡³-w¤ŽP®ziv±Ž,‡À\'kÒ m”¬!3ÐÚ<1A>ZÜ„çC‡4;¨ßZ`ÿr¬ü}å.?>é­\\~ìõ®dJcå)Kü~ï€,ÒÈ:9 Õ9ðÍ’Š|¶I3b <0C>Ö,ïþ54K¶ø—¬)Df{ )…ÅkªáV{¬àbÒÊ Ñ' . "\0" . 'Jh¸ˆækÁÙœk³§ßs]k²Ú`8Ë@G ó•><3E>¬J' . "\0" . 'ú _-iÕÏJÓ*`9Qü|í]AwZY01ZÇSž£N-j&ô=Îd$?¬C´<Ö—nÐå÷õðE)*¥d ´Ïõ5E¸SEdJ¸' . "\0" . ' ®’ñ°§öµ,¬´eVç×läL•Ñ!D]<5D>ä¸\'rÎÁËžñAÒt;†)…±NcN~ÖáPñÿDGy<47>$Ëx`+Ió‡Š<¿!6†‰¢ÁuË|ÙÐuI±˜OGÇUÉåqAØÕj!ž¡œ ÞtAöÓÌ[è¨ÍÛ•iJÊ©uu¡Z b˜h!sKØCŽÖ1É?´lÓU÷puðúlåðcGh±è˜
i¥yžå•(Þ 5R<EFBFBD>:ÛšZ<EFBFBD>nE&<EFBFBD>€Vê]BE' . "\0" . 'î tmDÅJ?Ší(\\ᦤò8UŠƒ%«BÙÑz¼T<EFBFBD>¡}ÑP¨ÉuÚ4Ø_S
p÷aëÝ™`þ?퟾9zócTu”46®œÝ¬Ñæ\\²ã <09>»{*cûd@¨RÚˆÒõÌ<C2B5>!<02>ÝëûJ¡ÐŽŸÂ]ˆäšuvÈöˆHRãGø,…¼út=Ž"¿;käµê¼ö†Z<10>ôY€íLàÜ·$u:6oÁÕS«ïé¿óN?¾ \'Ê5#Ühf' . "\0" . 'N*<2A>üZ¨GR\'<>7J$ˆLÇÍðúuçÍ<C3A7><EFBFBD>ÙØâø)“q¢*~/`ù,»ÆÒOñ"<EFBFBD>rîþÒòÁ<EFBFBD>rVít3ëþ<~£RQŽ<07>&aß¡I­°½ê§ywn>¡÷Š=pm}i|¸Z˜ˆmÜW”#ª¼eˆ—ívL)ßãx8Šäl_¿-ódb´k7Ág$܉ªÕ^!¥O¹mw#˜ràÞ=yŠ±¤üB™Z‰ÍÅ&ŸÔηo"ÙaBm5<·šó€L
¢0¡Á˜×ke¡V\\XˉߌF6°Þö¯G^F}=oŸœ¶Î÷u¦ O^¿>|sΓ^ž<EFBFBD>Þ½9l½:}Ì“OÞ¾qª´ÖŸŽ„úzxðê„çþéÕÑùáÙÛýƒC“Zõ#ö2;îÂþ­ÃÿñnßjÁ““ãÃý7<C3BD>J>9å©x:×:Ø?;wa½DA¯7‡6­ÞìŸû xyx`}ý1' . "\0" . 's"ÈC¯Ž£7Îçñ»—‡<E28094>¤¨ÛI?;ßi\'?Ø©ç~g~sDÚ<44>§‡b¡=ô f½ãtॿ9 P@¦—•9{½|\\RÕñÉ<EFBFBD>=•l<E280A2>žJýÉN~}ôæ] “¯OÜòúݱŸøæðOÿ¢×#d¨ùo<C3B9>C5ŸŠ”£ÓÃ@7ŽgÇö—<C3B6>ììÔþ
@ˆý⛽ö¾{svè÷â\'¿ñƒ˜}|Ç?ò<>ïùÇ#þ±Â?êüã1ÿhò<68>güc—ìñ<C3AC>çüã/üãgþñ¿ØG@š€<C5A1>qlDI\\áe«üã\\ñ<>Ïüã.æD•£Î' . "\0" . 'B3ÿ䘶ú¦‰¥<E280B0>Ëʘ„Ar ÞˆÌæîÃÓÒÎ]”uA°Æ»Óã?£´¶||¼JBœ ^@,á3«ñú<C3B1>Ø?šš«¥Ä»ƒåu(' . "\0" . 'ÎbX â<EFBFBD>d1¬­{ž„wìeäß 1“…´9|»<EFBFBD>£pÙ±ií¸² ZfDÙ·\'2EÙ4qÊð>i„ñâZwöêè-/¸<ÉÞ§hBÀmp0P£<EFBFBD>ÇWÓ¼ÀõΩô¡¼
<EFBFBD>¢õ¢e¡]|hit<@‚ù[9ÔUpÍDdþG.:ÄF´Ò@~GC1çX¡©T(í¨š‹- ƒgÕŠ¨£ÒíØy¥]«õØ¿„‰Ì䧺Ké¾O‘ø‘¨#x´äñ‚‹ÖÖ¢¥ËÑ’Òú%ôž u¥/½ ?é_SãêÊ«\\!4|<a%¬AõÈØFd=¸ÉWKì9%U·ª Þ2ƒPE<EFBFBD>ÝœCÂPZeÖ$åkÑj•*¢\'ˆÌlÓíË«V/ñ„lÔ
R@ôL"5 }«©5±ÉàìTÁnÝÚ$yU¡žÙÈ>²ÆÕ¼Aq õèh+<2B>ÝArÜ!*á ¹rǺ¡¾œõz^¯' . "\0" . 'ÙÞ ÒwW™Aa@5ÏiÛ(z±d ÆXÄt[ä@
ùõP2Ƹ2£Roä¼|¤š£ìì<EFBFBD>¶Ó0WV™Ékw~þ´½ „šög&Z€dÓaAsg­M-+Ü9šŽÝ"0DÝ]q¨¦Æý˜yÉ”Z% áœ6êë&jwi×VVx¨néx¢ê 5CN%ÜNËt¦¥,—b]‰bÑùm*m€žäœœ÷è<>ËR<k<02>¯ÅfL +øUnWèó™ÀíŒV¬tŒ" -áu£é<EFBFBD>…fgŸYÝÁÝ-ì(ÅîNìrßž¾Tâ
žk<EFBFBD>¾öfýØÖÊ™“$hG¦Î“ø²7ƒ]Ø<³æÎ?ˆÎz•œEÅõÂfÉ£gF1à2DB+TÏMݺ%ñDÍÿÃ^b G:ŒZ‡j˜"f&¾©±ááW…ò£Bßç’ÕÂêÅ[¶¹ŒExãÍVo5É0 <Ž[ÌJÄþ²·8´ûÙ äÆک¹‰=„µh ù<>c?sU2bº|qа\\\\JÔ®&X±LU0‡dÌ!hlÕ9­M#^/4*?åÀ‡’|‡4§O\\Áe½{‰*šóhv—Ío ¼³pµÎÎÇ' . "\0" . ',ºÜ¼G<Šš™ÅÁ:ë`ÂÑ}¥ØÕ€—»ý<ÕÚ´>»,}Avœ¡¬øü¨z#)yWR±î¶Š¯ZÖ×Áj"å u}ïäÕƬ÷½Lј[£‘)@ï„·~”c—)˜d“1GÌ
S2_ÐÚñÐ=#˜Ýe^Oî³s]`+©<«l.*™Cöö²%v)=ˆ@­+¡í¯Ó8ë¾ß²yÄ6K¥Ï;Å8áñ½ ü…G×gÞv1
¼™¡ÍߘTÒÿŸ[™‰Î…·â;~ÝdÃŽ˜-O‰R' . "\0" . 'Õ­eX¡€ÆJÄš<EFBFBD>ò}KŒÚÆQ¼cŽ{TŒ™Úrô•Ò Óï•F¢+é¨ëûsß½ßUyÕ”.÷ÏŽŽÀ^ùîü‡•í˜Ûy—•“ž¼Ýl2ØõX\'<EFBFBD>\'N• Öò<EFBFBD>OÌUÆ`Þ•¸ù™b»?JòOàcG‡rØXHd­Á+ìe*b½ðjûÊÐ=ª3K±å[[º/
#*"Á¿!vd6jN/ M¢vUê°ÇªëÞ…¬!Ü©o (ò„Çšã”Ï):÷­å¾[ïht˜ËúãApìu;<EFBFBD>¨ZÒÝ?E†RÖÕÆM”¿ÖˆîK- ÖìΕ“¯¤œz
aŠJÍ^ÁëýŸf»¤ƒ3hI%´øcD¥€.>ˆi7-òB7ï©%Ä¥ÚyýOb5Ën•ÕµÍµ¸Zõý—TL%¬˜Ç­²úm»"t¡²nG\\\\~l4VÄ_ÛâÏ ñç@ü9 «?\\~Ü^^Š?â÷Ó†øóò
ïHHj…¼”mAh7ʘ9xî ö!æ(åbB{Ýî&<EFBFBD>¸»ÉXÑ}uÆY<EFBFBD>@=Ñ\\%
ük2,̘<EFBFBD>÷ }ë<§½t3ÜÇ\\NKNîó3Å<EFBFBD>>¯½Énáú ÖHM©¾Ãkìˆ<EFBFBD>õUÅ$\\.ƺ“€—T2êF·ýÁ j§2*e`щu½Þ¨GïŠ4ÒOã´#vÙúhHïã…Á4éÖÕ“/´ï~®|W_¾==<Ø₩J{sr~tp(Ívªs+¼4øLÅâ?à<>c&ÿ‰VJ×O™~‚ƒã#VÞz¹KL‰6<Þu ?Ø,ð…â— ×åL ¯ÐO-VŠñ]I=h+)SXxøœÒâÉp€ž `†WÅ¿9ùïNÎÏl!<EFBFBD> ñËV' . "\0" . 'XBraSõzD(|W«u<EFBFBD>Zi|ÜnÔ¢ÆÇžø´¥ŸUw=ñ¹!¤ˇìCª°qQ6q³,@/' . "\0" . '²£ÂJeùnªz¾C5ÆU;bV2ì¹æ…Ožû<EFBFBD>©­eA$ ”zçà¨ãm:ìé[4(Uªæ¡¶Y)ƒ¹
…Ý:Ö»@ã< µµ ûCzŽ˜x»€ÎÚdAs§B÷<EFBFBD>z2ÕÜx{ŽÞ>M4µPKåít ¤ •H!^«K¤êN±õ$ã… 3€º+í¥(¢Ÿ¡\\Q×' . "\0" . ',2)näüMÀ‹åž{Ê$pfÐLåc%½Fo»‡oT u¿ÿ·iz{ÓŸ¨¼$mwŸ`Þߦ ¥50ÍTÚ0Éá<C389>Ìy"Ò»˜ówàl…^·ÓþµJÜìmv;˜Ø/þ¦[ÒK7:Xß>TÕÁÿdâH¬› †Ù¨«‹´;]ÊUh' . "\0" . '^Ö(Ò>ô³AJGñv²ÖN×0î€È·V6×µ§ùàÓmIÜÝ´½½ý„¦­<C2A6>Ú¦ÍÞÓ4Á&<26>Äœäé´`hÈœLÐ>Q„ì®m=]¥iŸåÉ@5þIo³!G=<7µlm<ÝL»*·èÞ«R½m¢]\ yDw;«ë”ü)¹CÕMò÷6…¶Û*<2A>Ão·Mú5¼\\0Ê9&¢µýžÂ&=M5¶­ "†Ìx“¼ï˺í\'[º†ar w2åȵy³AÿCÊjÚÜÜj¯é~fÃRk»cÚ<63>å<EFBFBD>¾ìÎÓ§ëk<C3AB>ŽÊÉÓ®©È(<28>×(\'}útëI¢sÒ„5`»×îlë0î†ÚÛë]ÓvÌ4Ô[ëmˆÿœÌ4˜)äÇߦY¿ÐƒØI»«*“³ùSAöî:æ¤éxÜiÎYÝxªÓ÷Ÿ8G´§ô‡¦u[Oá?<3F>œúÉY÷š3íjúTν^?OÛbñ×à˜1€À…L¯—ô<E28094>ä Ý‹ £ëÚÚv[švnŠ~¢J¨~<7E>¥´<C2A5>噚ðfÜdÅ„W²­¤°µBÓ}Bcí°z7B<>24)¶ð¥1ß܉ŸÒ<C5B8>˜ÄË»½ñ¤¡Áq“<71>ÒOÝôÉH™>áãµõ´<C3B5>òPì£úÉH3i§»ÙÙ쨌kÙù ˜#H¬þ‡,ÿ¤‰+Q³‰Ök¤[ÛX~<7E>|@­_²øVºÕKxºYù0;`jô6)óvĈð¤Ó“sl ¶BD<44>®š40¶$Ÿýë&C“nw;ÝÒ\\*j"QŽf˜¡ÇŒS]pRÒ]30zøºëðËÐÍÚHÓòœp>.í­ÎªÎàBBt·AB²,)±Öh¯%,“OÀí\'<27>´Çòl)ñäÉööÓ§nnZ;IÓ<49>ÁÜnt6º©Îµ¨%þ—Ê®µ$PK¤±Ö qÙ]—¤©D˜¹4Œ¸6™"ζ^ʇi·?ºúÃÖV§Kô¡|{Á"6¢.ÈÛÉæ& å<>§ùx Ë=]Òè¶Mž=ë<>öú“UkËí\'í­í4eÙcØ@X³¿\'V2àè<>íî*­0”M"ÚLâ\'«Û8Ÿ†ýîÈž«OWŸ>!J ¯#tÞ¡VœzÄ&C±§ú”gÓ<>RêKÖé$EdÒÛXË(ù<>ü5³änWìæeÖ\'¦`ÅbvÁÎWv{¸ôiÖhèÄnž´å8¶·Ó5{)N6%8¦jBôz k7C‡UŽ“Aêè4M·‰S0“Mf±?ÝV΀$=Q.U™ÎpÝ£Aã8\'ŸA¨±&a¯$ÃÞc<œ­˜´ŸRF>U¢y{s9ŸËN£ƒ\\8Lå@v»I£Äg·]¾„¶©œRœ“·õÀˆe5#Ì3·¶Ö×I' . "\0" . '0¢ª¹&SwAQ!U%Ï>%LNl¬n=%*„p¤¬Ìv{csu<EFBFBD>²˜¬K¶(uÔåuô6<EFBFBD>-¬Ü€év{ó‰L/<EFBFBD>V„{áÀýt4B$il®­u)uðA­Q”â?LuågŠ4vfñV²)W
zÜwÅ©É1I™Ð¼ I¡Çc-x7¶¶×hùž¨%¬+<EFBFBD>¤j½kèõ¶†5¦Beìu“\'Ù0™dZ%@
ºÂFpM±pMPL“5"ìíMšL” ;uJäJ˜\\\\fïÙ^<5E>Ö}wé þ¢T>¹P”[Dp[ÊÎôhŸZjó°Bl#(»©ŠRÆ [ìM18ÏN¯Û•å¸<>±\\$‚†ó¯™</§' . "\0" . '@ôx7Zß·bHÓà&i¸a˜X¸ñÕ7é€B\'~]ƒð¸Z69À#«Â»,Ë‚W¡Û<
×vl»I”gÓQWZÊE×$†«àº´V£îŠD<EFBFBD>£õ*`ÙܬÖ)t/`xCÀ®AZ‡ÉGzí,7™Í=p´š©“ì2ÿˆÒÊQ…!Ÿ<EFBFBD>åsÓõfT¡Œ=ç¦ÅM*/ÍC<EFBFBD>ú}´%Š¯rÓ•‰GðB3Ѻ¨@µ<EFBFBD>˜¾×¼¢kĺ€Xƒ¼Ò¨oÁÿ EŽÃ·uWg̃üº}ž½*pvÕäÁ© ±åéòrg<EFBFBD>¿îƒ_P>@;|½0L7L+
»È>ÆÁ<EFBFBD><EFBFBD>TFUðÈæjƒè݈à FáÁƽÎþgô¯uËAL7¸¨rŒ€' . "\0" . '`šð8T·ßyࢪ¹¼áÆâ¯H€6¿®n\\…è' . "\0" . '%ˆ¢×,¡;b‰0x°¤Æ„ÓÇB¬g>UrM—%  D\\R”H-(÷JÖýh—ü¦!c\\|UÆŠÌ°=˜*Q…€€ø¤f5úþ-0JHJ"SK Á*¡ÔîùRÌõs±YÔ>ß<>,`<EFBFBD>ï
¤Øø̉ +hÙÂÓ Ûˆ<EFBFBD><Õ·ˆSœa™KG¢W¢3W%þóÊp¥½jö¡0tQhò!Àkê<EFBFBD>< #™ªGî©"<þèXBüÈô@á·ÑyÌÂW hÙˆh¢ÏtÒ@êlÅ7Q&õ@a õ¥zZOlRÜÎyc[~ÑÔGQ“15WÊD½"«ÚDÖDjL„j믶u./ÊóðªŒ4ô¢½@WÏ$ÃIIØ áe¸mµ£z²f[
Sie½ŠDSSÅx WVË
µU¡Ä+´ÊVªFhÚ|_%ËX©ŠŒô¬’PKÆ3ÆRr ?êW®LYýЕbа7ÔÏšx¯ñ4~ÁiGG÷ñ=g•@l\'Ì>îTaWx-£„=ý
O±äV
õY¶rÖ;±Ö‘©ìÍ=OLíz…ö;W |6šˆÄ¯%08vΆT·×Ï1Âç= yÝïîç×Ó¡`V¿¬«¤h8-&àŒ4æ(ˆz_R9&_ó¬ðµÍ:ttØÖ<C398>úA&3H¡¨Y»ýu<03>‡£®§Fžö‹#™Ê' . "\0" . '»YǼµÂP¾Ì:Ù(eÿ2<C3BF>·š9Åt¢W×Õ-#÷<>Ohݨ˜º¼¼‰£U"ûŽ»~È<>q.oÆ)f¨ÓfvìmJ”¡1¡`ÝLæ4å41¶4õc[^^¿§2—Å£Jýûêeþürôx×¼Â*è|j.ë¨WÃe:\\ƒ+§…†¡VK5y ö™ñ |:Ðp˦1^ñßñ“Åž—D§Ïy7ç¯N*Š”Õ
5ý¬©åqö}­<EFBFBD>àÎœ±S
T?Àx<EFBFBD>UýD#÷äˆfÐfô…Êߪ¨X>H÷ cí¡D9{„2¼5^Áà³zvõÖKZ ñ¥-Ëj¾ÈÂý¦*Pþ®<C3BE>ì<EFBFBD>ô×Ì Ðr]p‡™òl83„¡ãöBÒ”3¶é[Àvd<76><1F>(¤»¼
pÈÜZ¼g5ü¢e=¯wófñ¢-ÃVy¬^‡Çmë¬ûóš¹ Š9Háë©ÛE³˜÷½¹ôâ\'éí<%¬Á—26×<36>™\'¯Wö.Jwú5»cµlbü©/æét"ÈB¾å¸;Ö%÷(uQs:½5<C2BD>äöÚ@wBHз¾<C2BE>̪o/éÛb' . "\0" . 'TÇ»+3ß³ÎxÏÚy‰ÛºÝêÉåçQ¬~ƒït<E28093>ç2ù9øŒÀÂîd³§³kÞâË÷¹u¡2rbó€ ·Yn“‡åئ 9ŠP_Mªß÷ßoÑ¿ÏvßC˜º¼Z“ŠL4Å^R.)°°ŽáO]% ¦yn„Žç ïh¡»¿[`h8nÆBʼËžèRú7u œ>6ó(' . "\0" . 'É…º*«fÕáKÝôgÞÔq úá­üèé…5KÆYQÑh ÐJ¬äÅhð' . "\0" . 'Ö5Š&Cj;oƒ¼QbÀ׸p|3™ŒæãÇ<:”ÖÇ7ãú(<28><†§hMSš*\\¶?“‰Ž<08>ÝÙ厨íí|œz²À¶¿¨½]µai;]<5D>¯/ÃOÍ܆ë‰8ï&žCT¹4#ص<C398>eoµžµ<C5BE>7; C!³ýÃÃ%Teµ z ' . "\0" . 'ºhQص-c' . "\0" . 'ŒÉ¦
qb³œÞµ±ƒ …Fl#HÒ• ¯à²™EQÒÙ\\åà¬urQ×Mâº<C3A2>Œ­n(ãFY·ö—Åå³ËÛGÏ÷.‹ÊÅåíÕ£êãä“lK«5Q÷Ú«lC¹j¼ÉÅ6—pòf>¥D¥Í¤Þs²\'Ú5YߊާÝŸNU.Ûƒ)ë‡!2Ø&v®æ²iÁʽ•©s¤[ ×Ôæö?$}4ZÉá<C3A1> ' . "\0" . 'Bõ4²~zY­Hxmß~óîø8nêýY¥ðmc»Ä}Ùƒ× ëlŒpé»$.õ*³‡BŸÒ«æs [©×ëUÄ\'×tƒQ¿Yì!ãÏ+ÊTý6»4 z÷d[eC2ÕVÓ™µÍ£¸<EFBFBD>d¦Lwc9óö²åá Øuó ¦#å8/ˆ«êUû<55>õNSËÂ8…õêûøâ/ÉÊß+O¯Á…>\\<5C>ùBŒ(«!3c™L†— <>Ö?X” é¤A½G[ª
\\æäìÙ㬟Bw:j¸˜ÒSƒw°%qB¬ƒYGÅÏ' . "\0" . 'ÿØC]ÎFòõ<EFBFBD>Ù+³ûÄNéåžÐ•v«°ßP+[ÐJ?A¸iåýRG/ngCíôŽHBÄ ƒ‡¾šî†ÆB·Äªž,t cg0x\\îdç8$7’ó:°ìb\'¿ì®£‡é"žæý˜G·Á¹\'¹‰Ówׯ ©˜˜ƒ¬”ï0é¶#ÖJGôä@f<>HVbטs8â€yùøɧò…zÞ±ü2Bò»0£ŒQdàuó,š8ðºS Ÿâ„I¢ŽttSS¸}+6åɈµ)Ë£ÄTi<54>êHbÑà ' . "\0" . 'û±˜ÅùM‡°ãX­[ÖKZݹ&DpØód®¤sÌ4Á¡ lâ—i{z½H:ï©XIWõåC¾ÕUÏ<55>+\\8Ùb¶½cöBP&u°—?Àö`Þv ' . "\0" . 'KYs[=À꿨µ=Âjô#öÌuøœB¿˜èrw ŽR{Æ2&”h/UµÐ}?€' . "\0" . '­Â”b
‚ù=T3$ÛµbŠ)ˆ$”¤t«¨L2ea­Åd«˜ÊEB)I~]°oû”ImêÃÞ:Áj<EFBFBD>Ì"÷<EFBFBD>[:ôº7Â<37>Ò¬Àኪ€,o³¥Ýu¯kAÏÔQuyÙ¯ë„k”öp­Zƒ‰¹¡5Î3ý8Kâ‡1ÜSÆj“Ì@ž)ê¶\\AiåXÆó.šûî“7‡zWn1ò¯ß^LvZëÑF‡Îä+˳FWÓÙ~¯¸¤·Ò:ð,o Éj7¬vÛÖáòÐYûú;ýŸvªI“ÜÞðÁWðTçP€¹“QIHr $êâ?TÔ:/õNç…Ò+7÷i ‰îÓŽ|ÁrŒÙ5ï%k¥ã "bÓk784³NU¢¤mjj<EFBFBD>ÁžíJhŸqð“eÌN8> $]˜ [î\\Ô.Vôr°ÆzÝÖ)<«³„¦Z®=9Ã\\~—¿Ô4“Ó³ú¼¶?Ûö\'lPVÍç‡$ï\'ËpÉQù¼¨ÜF¬UÈ®ýׇTO}uøSkœ‘ýä-¼n\'ŸþøB$nx‰û"uÓÁ' . "\0" . 'ïǀû“ OüÊ6Dò¶Ÿ¼-’ŸÕR˜ŠC0 Ô#Mt*K[æèâƒ!\\€ÐˆÞšô*ñw<C3B1>µ<EFBFBD>ê<EFBFBD>q½ÉÍÁ¤þÕ6¸2Æs
¾ªÀh=G ±<EFBFBD>T<EFBFBD>‡êŽß…¦eMˆ¾WWÍ1ŠjCYFÛÊà!rT÷~÷ÝêOôÿX»u«ÚcÙª“~]ÞVé<EFBFBD>=©ìåV3ЬÆÚOêÏ|²{hÿùHóëvå»n-¢?Õ/Ä0ÄâO1¹C»¤mTƒLpvÜT¯z8ÈÜYˆ-?è&߈2ÔÚï¾£¿±Å¢¢ÃfðV$N34ñDe£~¬ªð˜È‚”òM§=U*«•w¡î1¿¾ås‰ ZÓøøÃýgÞöœ™·Àì 7å=& ‚›ŽÝÓè¶óŸó´ G:<EFBFBD>fÈÖ¨%Ω,<EFBFBD>ÒêR(”¡šob0¾IB
²•Næ†{«÷:˜' . "\0" . '5Üc² à±øj©D*™±e“b/<EFBFBD>¡O}ü‰Í+žÜÑΦ(Ñb0Mmwò“!K<EFBFBD>Ÿ¹>^P ©<EFBFBD>»tãfå3€%1ÎØ*9 Ä¿íÖÙ€«²YÝ´#îŠø#~é&Ók7N@W>¶Êt§àå¯7ËÚ<C38B>ë¼}z·5Þ˜ ¼aÞÞqCè+S<>u”ü—Jå9ÈüŸ…ü®&Ï«—Å÷—•ÊEcåéeý»Úeqõ¨zY]~Ü—bïìbÙj˜d”‰§ÈêÀT`<60>K*xÞ9í„x&ü¾S@´¼^L|~˜lŒrš±ôûdµXQ@,`¶õÊ2Ú“AžšIV¶Û°ÉgXÝ]·A<C2B7>ý…Ú†AÀÁ ö<C2A0>ÝÊV÷±iŠRºí΃i5xtj1ÑUYËYè;8€®s\\P¯jà²}\\¬nx#;ôzƒ¤ŽŠ!è oy™NU ×(V<>\\À-÷é¾YèªY |Íã§f§N¼™®]ì‰
U/ýœjƒ»Ð2$—
½' . "\0" . 'íF$¼X¿ª¢6òCùÖEk9nÙÆUÕ„ÕÕ£ƒ¹@«>Zc@|ÆöujV.´ÐÔã~ˆKz¶¢Š³ˆl<EFBFBD>‡š$P…¶šÖ
Ù*Äv~¢1¬=&HÀÙ”M²rZ:Áº§G»l“5è“Ùz?S¿Êª•ŒÅªÕ{¢²á4ñ"µÔB¤7Š_Òú;{S±‡cLïÞÈñ’Ú~R¢Ü&l5Q[y\\—y¦W2<EFBFBD>r!{•vd¿ŸÍ
—žÑI^³í—1K PÚù}îñ0¿?<EFBFBD>0<EFBFBD>ÉòŠJ·/yE/ˆN\pteR[œå•üÜKèö…v å>þα§ñŸñ<|MH]%Vì"µh½­ „Ð<E2809E>Ž§Ð_@)û^üõ¼ryöórï<>Å—&ÈD.Öú>,øìÍî¥OÊ.ö—òÔµXˆÇ>S%~Ú$ ¹ÁNM>\\ûvPÛz:L‡^Øü~êXÌg<0F>ÊPef2õPa.ScÏk¼¯5»“5Ù“R¾~ÍëR²FÒ“ÐÎÆJ .s°%«¢:Í=OHê+ÕŒ~ ¥e # ss' . "\0" . '‹¿³ü¾<U@σî<EFBFBD> «˜ +#ª†U^V¸ °<+u
íxÚCËòA„œ37Ç},…ò™Û¡t
8ÁAÙܘÉì2ž«ã¤+#<23>?aÁ/ ³;ôAÙ‰÷ùZ2#Ëàï<15>öÕæY Êdê†X>+1Ö(J<>' . "\0" . '^ òœ<C3B2>õÄ”ÓïSØ-‰ÅÞ¶x²]]Ý°noéG®™ã]à!ô™­S÷Y³"hR ½ý<C2BD>uD©r¯6&AéO
äÒãËürô3ü?,:pJ¨nr¤;.£ ¨a®c¨¿Šh³Ü\\J"€k¸yôÛ)+µÔOÀ³î¯°îka¯ ,¸òœ<C3B2>pþhÔËî7KÇi>ôµ”Þ ¹öSåÍD;¤L0Côð½èêuêÒ<>s“¿b­n´Y¤KEÅÏ€:ü ¼Öã᯲\\®½å.˜
>9Jª½½‰z<EFBFBD>bˆ +å­Wà«šsG>¨ÈžðKÏdaåÝ¢rå¥·É ECp}0iêª1wJA*÷ ¥A²<EFBFBD>”«™Z(Õ˜~ñ²ŸÛ0\\ÑT@Ð3J¦u,ÒÜ è^£N µXÿ-¨!•A©·¡ 4_MƒP¯ŒDÅ"ëC±§9h4ò^—ümÝcQ<$ˆŠ¬ó>…PB @qPa¿hlÑÓqªôYÓ§!€„«ÄþîÊÅÛv7Ÿ[åäx1¤ˆäëjb*l—PEp⽈ò_׺Ñ×QF£ ïÎ%Ï#ÏZ9yn¸#,ø>‰:‰ü*WY•«3ô臓hܧ3ª“[kH7gòiçê~{‰È2³°¨Ÿ†ÂVd”øðU5t/îX/J1wj²Ö*»e¦D…;5«Òº¢è¶Ø' . "\0" . '†8þ(l40hcœã£•x±Rk²Ôí½J­R©`#_<>ø>ÆU
Yv¦ª]¬^ ú(:ù}<EFBFBD> ÷qm±>®}i_ÒÇÆÚ—ô±±îãªjüdf5عßÇ€ÆÏ[TåO?âBÌp͵”²à$Ê¥“„g°7)ó<EFBFBD>"cD+{¦SÔ:ü´.(¡R<C2A1>žEv¦Î®Sö—†’07Íü»ÆäÕUBD­Î½N ^Í™Žú&*AüL^À¿_ãß?âßç/<2F>•ÒgT@{¿(o% Q¦7Ȳ¼2È®y®ØÒ6Ö6ª —å <09>i<EFBFBD>£qv[80ïTÁ¬_ÇV^,÷¯xª?bƒØÚò)M@\'„ø—•øÏÆ3U7µL ìsß;RÚ먊»Î#øU³w6lo“¼HóÖ¤H·6ìÍ™Ìz;˜^÷Ù¦L Ü°?jÑæ°%Öþ.ì·ÜX<C39C>¨Èz0Ð[‡¼žRpFóž¤ ö£Gú¬¬ñÍæùéÑ<C3A9>?ž¶ÎÞa̤š1€V<>Þòù.g@@ªÂ½ç# qnÒ“ˆ.1àÒ?€ÿî/•çÍý•ÿI—A=Þ½ú¼qW}´ü<1D>¸çî^HŒ#ª´q\\´ƒ' . "\0" . 'U ðŸÝÅÒP ¼Ï#ÏËU÷vǤïdê÷#ðYaJÛ²["æ|Fy4×é•:+,
r¿Áã3
¡³b A/ÜyŽÊļ(!ò<EFBFBD> 5p.ÿ%ÊÕLÓÌ<EFBFBD>¹×½À¸ÿR¤™ G²à<EFBFBD>¦£$¤÷’™„ÿ”SçÁrVÇ _TƒIcÎÔ3óà±~µÕyþZ£gú2P9<EFBFBD>O‡î×)jûgp˜x/©×Ö¥|3¯y[4<EFBFBD>­  qÀÿº|qøãѯ>÷ XÓ5ðKÑÑl”<EFBFBD>f“k«E…ê_ΪÌÍBË£g—¦å£‰÷ÈýíÛt lªFïAÎb<<EFBFBD>÷<EFBFBD>ZûVnðdP\\\'S z-L2x;¡¨eÀ¡;Ž<15>åçõ»Êe÷Q" ˆ"hA†¸&:ÈHˆW¹pQl(xZ Ø]sWöªëÆ2þ&Úñ©Vˆ<56>"¨¡TÅ2ö¯)¾0¤”߀¼õ¥’-;­©„‰' . "\0" . '5>)
û†@;î h“¦¢-Üže[ÊŒýòZ>Ò;[pد&,«PSÿHIðMD¹>Ò÷FšÞÉFßPõT4túJHWPõÂ1£Äí’×#÷ž#ÛYVa°Œ[œ)#¯l#Z–Ö„ÃѪ[<5B>è2-04Š,¥Wž2À·hD ܪ†:éP¤…òC<43>^ËI”ãÓÍsï<73>©È7êÑh¯”yÏv[ÍB*1E:¾þpÇO-ѹS„šD<C5A1>þ û*¡HwÈ3ª¬W týfTJb+d*øŠ>¾&ªò—ê<EFBFBD>l“Ðrp…˜/I FéµáE6¥x0€î7*I²6¬¦cu^YòÞ
rf <9Ö%c¬ýe(…Öš>¸ BxzztE\'¶u¢z]âË#|ËãKÄfÝ«¥@ÿ2Ö£Œò?RÎÊ¢ðñ‡¬a¨a{Ýèx¥ÂšBÿ[X{ËòâBw!¹Ž¦uK¬—Êêƒ Çz¢¤5i{t™IãrÙ Þ$~O<>—ðN*Àà,CPtX¦íke¶*ZÎî@ ^ ŠÄËCçJ07ün°ô¬º}ón°S”íC©ðVWг&a4ɤ<ÂßèÒ_²h°ôm£)4M¢É&§"\\ŽOóI?¥U<55><E28099>!<21>~[õP;$ë9ƒB¥åKÛ.oQ Þêªé\\¤” WH‰ŸšÍ£3IjbT´y:Wb^á±(Ê"•³Ÿ ¨2F¥\\¢]r7¥.̆–lþgÍ+ •n˜:ˆ ;•½xHuU·R}<4C>ê%©¾B¶[¢â`ì µç :$:<Ji`Ç\'¸{!w¡v)òh%«nKÒ¿GÞå,¡£&ê&éÛ¼iúJBù<42>7ôä¾ïMŽ+Ûë|æÀQ.]6¾¿l,æÝB¨Ê/)É¿4¯†;&:ÂÒYJ1 ŒbæaqÌÅrÓâ<C393>•o_¤Vdm_JS‰•ô™USW\'-WFiq²uQµ`ýK©¢Y1ÍÓofÜýM)™´tll²ÇÎÉD6ßÄ$ VKæé0ûànµb¦\\ j#é[&I£l/YYN¿Ó£—çÌy¤‡Z¯ôÕƒÌx(\'û²Wr± ˜j*cKÃzhW]:áÇt”ÁÔ>­ÒûažU¯ÉƒEŽÝ¹o1ïYþà<12><>TªlAâÑÜ 8m´$T>­Vÿ|ä ŽHþ#\\¸ëZQ©Z•´<E280A2>«»ámŠÂÈ÷$¹ÒGGj<47>] jyjg2ódÍnÇ*_º†8«Æä`ÐVR~±½2lƒYð°í]!gœsÔf×UÊ[ú˜¬DLúqzþ•NÀœCÆõ5G:µž!rgàþ}®nß?Xèú½ÄE1´ÜÛàÏì>øÅ_.«WŸ·jw—ÕŸw“•ÞþÊ×kÛwÕåÇqM·Ì=¦^ÄRÙ21~ £}Œ]e]hY ,`&µ0°Ó@=Ëìm³yñåÉ룉ÜiýÖ탓×o<C397>Ï£‡Ñÿ
œ¼;=;:ùÊs?ùpŸ³´ ÊÀ:Ù}“uÓ×bW$ "÷X¬.ÏdÆ{[ZÙ£óuãC@™úM‰¬ÌÚ:OR©ÁÓº­u`dØè <EFBFBD>-Ú°„q íy¢Z“ÇC™Ï… ¢—YaÑ"ÍdRœÆîìû¬5Éäy‰×-õë°È0§5èûxD¶ˆø7Dõ' . "\0" . 'ynßÖ³3h" €M~Oy<Ï“b`€`´ç“;L`͆‚a5(m² ÉŠ‹¡Ðø¤Ô®÷\'ÂÜ®²§¡ zhìûôª7ºÑßÞaq/1 ß 5 ÄE\'t<îÌ< ê½pW<70>i(˜”¿8 :.¯ñXòemPäžõ÷­w¦‡ÒÂó<C382>T§…vøÐ2ÛõhÆâÝÿJß”(&×w@…
u,ñÆb8/&`Òò²DsJrègÓâ¬/ªº•›? .ËÃ}òˬƒQ/u®NÀ(ÁN—„hg…½ê_c,iã¬<C3A3>xu«eö·l4a6£9ȉÖH(<28>Vœd"jkO\'ø¥|ÚȤ.‰ˆÓhr˜·8Œ¼"øÀ\'{j?yM` eñP€mNqÛï°
@‹†c!<EFBFBD>I„½þG¬bï«vÃÌ<EFBFBD>_®¨±|í~Ù´×r?0u;^ c)`d4 #É=2â_Ršs9 ŽŒéXú~î)ºéÀa1ªÓ!ï•.<ð‹É^ƒ› â¶HsÜra°`©I‡ù.,¢s§A­Zi㧘fû¢Àâç¹à ùSzˆÝˆHÓs"Ä"Œxœ[ *\'€¶Î * ÚO‡Ã$T¯=±3<
µ¿Áþ.!¦Y ?8}Å|<EFBFBD>¥<6ƒ‰‡Ä' . "\0" . 'öY¥€ 0"¸…ÑžƒàU+€’¥‰Â;<Zjªd½eÆÂþi®NâؼÑyÜs-f:Æ*©·PŒŸ…0ó_ Ÿ¤šŽº v<C2A0>êÔJ—×€Ý]ว*ƒÐ|ËH3ƒYd“qñI0¤ªNðò*«Ù<C2AB>ùŽõc­<63>ÔMå!§É.(/ó¼Ùá¼)ÃEç°ƒmàf#‘±{ Ä<C2AF>ÓÎÖ©…ÔÉhómuuç•K¯ N/ƒã3óŽ‚õ{Û®ž»ÈÙ¬­íÚï­.¨<>ïøO¤ÿÅ܃h]="ó’ÝÕêŒà<EFBFBD>Q|.2_¥§‚Ÿí}<EFBFBD><EFBFBD>DoîØó±ÒÚF¶
sàËŠÊ——ÔËp,w™ÑÚù"¹ªºÌÄ1.*àL2¿WÁE]IT
HZv7Q¹9Äs³5VŒxbõ½ä@TÜÞ4ÍÀËÛâ‰{×{©Ä¸\'¡! ~À\\ûŠËC^¥g¢ùlrõ T˜óõ"¦ 1©L/2k<32>ß.­ƒÕkœJàOk˜½…tv<74>_M<05>ñÄ2™Ñ,Wƒ§:˜ZpûœLÒs/ÔÕoÀpû n&e—ïàªJêC†0M@¿—¯´HÄø
b}Æ#UÿŒ9k<39><6B>m˜—Ö:wÑ|þloéûŸ¯«;~ÞµÀÇ——<E28094>//ëàôòèT¬Ô\'§n<7F>¾ÝÇÕ»;eo…UQÉVÒš\'Û½3ù\'6,6r ÿVL&/¶èÈ 1üù¬u¯sYæ®·/Oàü7Uf®ÑËOfØ´LNÿRÀ1œ—ßšú¢ÛRœnHo´oz¬!³{nXZз=Ú(¹×ÉoÍ=jø%/ñ~Á}Ü{X»¿˜ÞÊu±ÏÀ“[Buèáú¬¶;ÐÁ ¿UVÕ¦4…Ã=]l—™úxŽ³ÿMØ£â¿ØMàÿ,„$ørÕÅÔX¾œÚá´ñ³$„%áJ«™\'óì:ƒÐꉶ¯<16>f÷†1¬År©>p?ŽÉM‰%]Äî¯Þ<>ø|)<29>ª³ ›¸²½èV¥ï®éC»*ÿª³<EFBFBD>÷h¦¸]¿.<Ó¡rÿþýƒRc 5ï™Mð^â¡üÚÕ,½¤$dî¼ÛCpô¡<C3B4>Nn&zæBeí<EFBFBD>Ý,8îŸ<€†­' . "\0" . '7.ëàqtõyû.¢«<EFBFBD>;­ôÌòr\'H3UÇò­TÉbª5»Þ½qº×=-Rð§CœpýÞC›³T¯Òd x$C¡bèoñi<EFBFBD>¯áp[Æ1HiI42Îæt(_x&ãJŒ¨“ŠZ­&0ŒUT²eX`ĵÂïD<C3AF>I`d¾ÞðØÌꎼdºe*{Ç+Ž8RŒ@/&
1µ<EFBFBD>c\\H³2³HŒVV•u×±7ÖòùÅ5H‡÷U¡œäTÉ[|ßÀ±ŒÏ5×<$ïãÃ%
k£e%2É ‡^<EFBFBD>á•@ÔñDL:_Š19¥¬VË$“}IR¤t>¯0 œX<EFBFBD>‰s4G— •°,új¤”Ý×½g‰£<EFBFBD> Ä?KEÉÜg+Z´5¤ƒëIG<EFBFBD>á;äf+!oÛü³Êq樚÷TŒKæ¡„~³‡ýO/Nv¿¸j^v]4~îÂ/qY‡;Õn§üdÙ<EFBFBD>Þ#KâK’„`8Ag:†Û¤‡ ×jŸ4¸÷Ù泥B±‡®@ .9ÄèšUÐœÌÚ»@ —~C@ÕÑ€7óˆ¢ífc\'¶éÁÌܬ?Ĉ¿L4(Þ¡¯Žå#ó<0E>˜<11>q¶IÎöeR1Ÿy<64>•¢¢-ù\\5¹s_À¥ŒÀƒ²†q<E280A0>ö\'[@ëÖå»ê€žý솔ÚEìÅqèå÷6ï_¦oŸÁ¢œþôúøp€&¼{ ám_1—4¾S5ã<02>?­” å´¼—;Žsê®ïyÃÎqî¹ûoš_wƒ\\O«Dyt§<74>¤"C·Qš„(¡(µü9Evx ¶?ÕÓî@e[ËŠSD†þýF§²Éó]6à OeÝ*Ù†½™ÎMäu“§£H]\'P êº;Wý·§¹Gžµd
½A ÃÎß;gçÜqÆvÐ=YÙûÌñÜcÉ\'sno Xú¼"ªÔó/øVŽå¬¢«×‹Î®' . "\0" . '|=†7äûôHü<EFBFBD>y*,Ì~³ºí[ÕI“&“÷Œ•R±¡í<EFBFBD>2ŽXð!v®PÒwôÑ#z<>GùDÍòešïÉÄÎ u´ÅdÆ c Å/ùÌõo\'Oõp[}Ùùf"m67©÷N¿H”-$OÔX•œ
Ë,ACóØñ|¥ªìõ•ß€;„ºÇöK(L¦Û_w' . "\0" . '.]SÌýñr­ßmË­\'IJ‡†ê?ŠBrýÛsWùeÇÇî;ìß+88ËÙó<>KÃÜBêî©#Páñ&9×rîfõEmÔT":wÜMKFt"ô…á7ýÌØofgRÅ÷T¶V™âUë[¸Æ><3E> <C2AC>c¿ ´b‡' . "\0" . 'ÛÀà¥<EFBFBD>Ò½e%"{±(‰g²BuÇ¢LøþªÛ`g¸§ã”rÀt¯s5ŽÕ>Ysës@ïqº¦.Y/â‡FCE)wC;Ç<>—ßjá?¿¡ÙUî÷ép?6Üç °‘&£}××DJ1y&ý,rC¼O?™7ÕØÕ¬6:`I`§êJfR²˜ð²úöðk¯bª‡0Éši÷  /æeRÀOHpM¡swl¸{<EFBFBD>ˆn2æQB5 Η?È®ô~
ü²ç•ßBÇÌ9˜RîZ7¡£Žr³ÚùMžÝ~ÓióÛ·—~ì¤hSÅ+IŽýØwSò‚Ì[ºìÿYp±Ç_ë帶ºñdc{}kc»f~?<EFBFBD>·Mž¬?ÙX݆—Kôïõûú8Ê]p-ŠEëRAâßÐ( ±SÈKMèü
\'Kt¥©Û¿¦—ØCN÷t<EFBFBD> 5‰»øª³qÈ)*8êkUÇ©<EFBFBD>sY?!«G\\Î]ÿ•‚ ƒ(S)Õ5ÍÉ»@Z\\Ü
ßy“È(Ü•¸ÕšH*Å÷ww®Ä¦°w&âš$f;óF/OÜ·‰ïï4ï$S”t[<EFBFBD>d0¸§ÿüoMËy`e­' . "\0" . 'HI\'`©™§Õ`1Ò dJÉÅy' . "\0" . 'Ò/pXTÁ/<2F>ùX¼¼%¾œ º-ÝKuVΣ,âÉÝþ /ÔõÂsÊö®„GÁà\'¦&PlzÙ<>ŒÅtãT&q«<71>ò‡ÄRxu«qŒÉlÌ­Ôæ<C394>àLŸv%R•#rî¸Ë¬•óèýCNÏƺ´Q¨ÄÌ,Šþõˆàìö!￧0™VáRJ·p8' . "\0" . 'x6ëÍŠ±Ý}³¯ºÔmH1,©ãŠßåd²îqö³ôoS<6F>¯Ÿ |þ6Qki3iј=Q]¤Ð <0C>a:ŒN' . "\0" . 'á)Miøa<C3B8>º€( ÝD¹ò`ªü  ¶„™äײ4É.ÔbðíËVžl3§¼f6f³Yéè)' . "\0" . 'S<þw‰eê@x+<EFBFBD>ŒYÎ\'§é' . "\0" . '†±ªÍ<EFBFBD><EFBFBD>n@
¡Â<EFBFBD>M' . "\0" . 'à Ô0¯àH °H¥\\Aà?uƒÎ' . "\0" . 'Ìà;{ÊKîÃDéUI £¢qº¨ñbáb¡Yˆ;¼ñÓP<C393>vvv•ÓèƒT¶¦{¡ß9/¥ˆ\'º‰ ú†ž²í3%Úa' . "\0" . '$,Sjekd²¹/`h×èx\\ Eb<1b(€ö®tå¸ê˜' . "\0" . 'R¨Ë¹œ<C2B9>¬ü}å¶.?>é­\\~ìõ®d
\\×6‰ßÓ½mÄu±JA¿Ñ¥øŸ<EFBFBD> ¼ôý¾VøèÈçLÁ×0¬vÕáÝ4üE² 8MôÀ°åÁi`ÎfõŽƒè¦Fí«©Vµ:éµü Û< íŠ#ÝUN±o™ûÓpp/-~[&Öþ+ñ?¯Û#ªBÒ5¡µhSºå={þq8Ùµíp¹ìPqsÆ¢Üy×¥þÄéæ*¦t!³ZS =t<>fÿ=ñ’¯{Í ÖPµn©ˆòNȃ^¤b5Š þô<C3BE>ùUÆôÒ³g/&†ãS`)/´é^\\ôÎ
õ™ŸÏñn+€Ã¢gƒzhnŒqµôÑÁ$ÿÒ!Íó,‡V úmðæ£Þ½+%ƒeêÀýÄÆó ÷ŠÜZ²3 ‹¬Š¼¢Œîo,hË©³ºK`H]§{ØÌåÍNÛF<ûÙ(÷t%HxÁ ×g+Š¿¸õ>%†Êy~<EFBFBD>±f1îJF¹æÍ玠L' . "\0" . '^çõH†XÙ
(D†K(ÏÄkÛùäÿ=kH³©à‘Ÿ×
¸ò#a-\\§b­JsŒ½ß·—.<2E>á/ü¥«3è·0<C2B7>rQæÎ/¼NÚšNzÛž·©é¦À­Û~©"Ѹœ²,fÌ°sFªkaú¦Æ­X¿³Û¢•M\'ãéÄ«OóZ«…Ï&À¦A)êcˆõÎL04Í&—€ÊÈ&W ÓIvùÃk ÖÿDïòÒNÇÀR«@õRJ<EFBFBD>œRìbŒG™ôcÚ©ÄX­þ-\\å,Tºæ^2Ȫչ&M¸ð6{êëq' . "\0" . '<EFBFBD>ϧ¤Äk\'¢VPDBK†Œ­(=çÿü×ÿ ÛÞÿóÿþ?øÏÉþ7ýó_ôÏÿEÿüqUÝiXºüØMjüÛ¡Û=ùï:ýÛiÈ7$ÜÓ%Xÿ©UQP±Bæ§g_Xë9©Í°L4È Qëjûb}m¸}Q“Dfcx9ÒPºyÕºÊ]¢á ¶ô7Ïß°¡›;« 5áîÛØþdðm[»µP[·îÓÒ$5ÕŽ‡¦=]Câ€7šòÝÉ ¤¯@ ÜD/<EFBFBD> ·W(a$Óù>àí«·­Ã“ã ÊŸtˆcœÑîJZtÃÎbÈÔ#Ø‘%"²G]Œèn…Å<E280A6>ØŒuùºøv<C3B8>ôG÷Z<05>[4 -òìáñc“qO®7øêÛ\'i”`üA"»% ÜùAQ€ˆƒòyrkc¬z+íä&¥KIcÀRïEì¯Æ} ‰â.ÙÞrÜNÓQ+ŸŽB0ËC±<43>“”e£AmнoõÀFôk,ÕR§´X|LÄ<4C>ñÕEL U¦7b^«3Ké“Óò
ÜîÚUˆ± 9-ÊÖÉp' . "\0" . 'ömzë—[[ㇿ{º±½±âçææšú¹±½­>Ñ' . "\0" . 'O ÀóóéÖNüe ®ìRü¬¿‡oBz=~öX|"q×B<EFBFBD>£mãhÏÂá.QÉÔF2 #™¿z(ýÍÊrQËÆû[-¥6-ôºÀ#n¡ûòè´?V®<56>ÅãN6 ˜îcmjA<6A>dYüZh¤<68>á~˜üÞù½óÉe­ÁÇÎå0-ÁÉÁy[™üUìÝt±bOºß˨ÃÆÐÕòg' . "\0" . '†nÔ0Ã8غ¤kMÕFP÷ jÔ^ËsŒ»Œø(?­¨ÿÒãÃrúâ&Výî!t Aµð55Máªç3J¥…ww齘+”´´G¿b0<>(æP.<2E>.VH´<42>RJ¹Õ±°-w˜§2Ì„Üe ~ ¤æ,¡Uwû¬ö᪼=ìkEƒ¥ˆ%D{öâÅ42 ÜomÉÁÄ0ý |EDÇíÅM B¦Ý·ÒI­”ªˆÀfSÂÐÓ¡€@¿æT²bZ;' . "\0" . '^A=†‡>¡r´šÈVEÏ·Ùbá(ÔÐó4½‰~WTY±RÝL&ãæãÇqU½¼ó\\áÊQ<14>+и¥(Žš8wÕ&äY}&Ìw7yÚÛ½\\ú¬ðÞ].í}¶×üŒÍ¹{ö8Ù[
ñÄB
0&ƒGPãðîͧf“Œ ¤Â•äå,ï_ãöžaÐØvÊêD1i%ÇûgGG±Û˜øÝù+ÛdêÊÀn\\ŒÓN?tn¼0ý>+Ä“ÿñîäüðŒQAßjôûÀT æEPµxÅÃ6Á¦­Ñt˜æýÍœX½<EFBFBD>\'[TfFÚQããv£5>öÄÿð „~Ví¦Þ6±áÍÈi¿sÞ‹øÛr<1D>kNšóMˆ¹ÝŽÎ~x)Èõ¥ú@ K¾2Xô¨r@Ì­Ù0•¿˜´<1F>2!-ÔÛ*è72÷R<C3B7>i^hŽ' . "\0" . '𩆨…s¯¢£ø^´ðÔ½´œqâ ¾õ2IÚá!*OÊ^Œè/ÓIÒà#ݬ#K)¯!j,ÔT)¸BD<42>êâµ<C3A2>RRvMùv—Lñžq-Õ!âÞoçÞ¥C5f“þŸÛ*Í#¸YÀ®ð~VvBPjÆ\'…¯5LÀWn»QnYPÂ6l\\  /9_l\\ã9:œ.Z¾~ЕÅ1XôG}ò´«<C2AB>ñ v<C2A0>A 2b ±¢ß¶' . "\0" . '¹òrtO7ÁY‚ì\'ÜSë1ƒ¨"<22> ; Bõ{}x׶Eé;éD9L„Ó•’³s\'˜€¹9C¿Ò †ìÌÔn <20>ð°æ' . "\0" . 'û¯lèaî¡BbŸˆ<]±¼dC»v<C2BB>µoªÖ3Ps¦]ŸÍ·f—6q”ÙÆi.<>' . "\0" . <07>I:Ú<>£ÀÔL' . "\0" . 'í`¤v£zŸ.ѵJ¬ |“@€ò‡Å FH!ª¢c 1d™Î¹\\ W˜ú§<<19>±žZTigÙ ªïD(ìÕZ¨ 4Éh«Qw' . "\0" . '»Sªª®Ëâfk0Ëd7浨ø&óF"«™Í¬2n€Ü~ÖUo,h [j{³Š²F•ñxÂ.HÛoÁ<6F>¤Ó«ô%ûs/¶EZëõºè^ÔÀ„Dù“ ¶¡—ìqÓXµ*VˆöXM\'Ä+€xEú,-E0|í.<2E>‰FFòÝ' . "\0" . 'XÚ{˜„' . "\0" . 'ÜyöðÐ Ì&“_á8OÇ^U\'ã,Ñ#<23>I 2V׳QòaïÙcøÛ"³Fð¹Œ<E280BA>Ž3ûë2@¬m7”´6ôlž`úd>ï&¸o7;#3`¯ÕÚãeÅÑäVœThüŽô' . "\0" . 'XÈÈežnoä÷» n¬H12Ãy"_ 2ü¤¬AšÞÇÖ㈽‡caCs³ÓBÆì\\3¢]¦gY6<59>7Ñ•ñž<C3B1>ˆ£NªÁã‡B§Ýj)n¹/)Ã7h$¯¼BWKêDcþX>¼ñãËâ¾<C2BE>QhÕᎪ•T!|‹†’É<Dá•Ñ5*¿Å7ë>\\=®×ë±ÓË ä<"\\yNZ>‘ô‚˜J¡Ë-° ,»íð' . "\0" . '†z0à o“ÓÁÄ]ÐÄ6Š]¤‹|y¥¶e˜÷PŽlJ›‰ äòu8¶ˆˆ³´«Ö' . "\0" . 'u] Š˜ó¨Æ•¼9xTÉÞU/êñ#:Ê<Ó<>?Z`Ù]  2z¥£‰^|jí¥ÏßfH}g½™ô?¤€{ɲ¯:eöæð”(<28>Ãz ]—&Û@)8m쉎ÙÝ°.vËNx ¨CÎL¼îú0KDW.þa¤á+W/)w9Õ\\º˜hÙCT¼†ûêˆPc©>°/#ùk<C3B9>¡º}_
HN±ÁåDëªÎcZ¦<EFBFBD>ƒš@KPÑgòkÅ«z<ÀÚtd
ý„wj”ˆpQ)-_5Äòì¯4Ÿ_\\æ—£ËÉeïòÃÕÏÑçµ;
@#]Ì÷”èv åÒ½¤VZùy¦u+ºéëv•õ¥ËѳÇ' . "\0" . '¸dߊp8 Æ?¶aLé\\{3­óÎfÿÓòõ¿ïÉjÞïÜÔÿ*}ÿ} üïcàÿJÇÀ0ó?~´ïXòËl츮ÕËÄœÎ÷0à§×7Ú¼ª•ºEÍLæ$¾ƒu<C692>®R‡vÄ*ï€.7‚å+ÒÒZD‡ê¯EN2^Ù¥û_ËÚÎ:â˜#C×7s¶¶—<C2B6>;6Å`¼õ»0j^ 3»ô‰~ç,(ü¼ú@£?ê ¦ôȽüÙÊFyñ·i?ç?)«*ï-Î¯WªÆøBù.{D•²T|Ôû±Wæ(Íž•Äm1êQ@{¶™ ³Ñ§f26<°t4ÜüoA|n<E280BA>æX,Í„ •ëðåq†õ
þôóìá¾R!Þ­MH6mM¤4Ó²Îמÿí=ñßÌ{"°5;GuŠ†_…¾¢OF{ãÉŒ\\¸×! ^fõfU,ÓDG´¤±9Ǽ<C387>€Ö K(_^`“Ÿ£½ÙÛ‡PÑRoá;kýÎZaß¼,ð ûî@¶ïÎç,°°ó B/ê<ƒÀóŒ9V<0E>¢ãKØ-ƒ.ÑKξ½éORçE[~×Þê¾uÖM-¯Ör|ðý¬{qa×ÁFÐÞ<C390>' . "\0" . 'H\õî倱ìܯc,F<>µqO/‰YÎ ‰2W†_ÉUá[»,äPPvv>ë¸<|¯q…ïK:÷+•"i°K¹åç ¿á3÷̲£˜ƒ]nMgÛ~×Â:¬Ð×êì
= ðã~ƒ<EFBFBD>µ>DèvöÄh•ø»7<EFBFBD>»æžz¹¹ ÁJIðÑ
¼XË>,!eR?r…µ4j¦à~…åë»êfOšLäk<EFBFBD>ºñgN«yv ¸èê<C3A8>ƶ&ê†+B†Zúèùÿü×ÿŽ<)â¯ÇÜ\'
–ù¯ªûÿ⹃2ÿRMe™½ÓÀN<EFBFBD>­üê¯ÆEèݤž…Zfûæ[Í#Œÿ˜ú–É­|L(ZÈ^ƒ©µœc¨þF° ‚¦ëŒ}lƒ©Œ"RîѳÀ±¿^t¬InáÎ' . "\0" . 't¨Xðóoý¶iÔb½In)ÒNT/ø¹ÿbø—Mœû…ÏýËŽð<C5BD>ã{^»¶æV¯=æçs¼x4ï»D;Ë‚õ¿<C3B5>3x<33>NòŽ`<60>H#\'õ:ô}h®ÖÁÛ¼<C39B>û5úÖiîåeàQû  3ì0É*¡‚Ó:E*<EFBFBD>Ù,OÚ™«_{õCî愳$ªúbÃɶ§êòO8 ÈØЗ]7*k„q„³LÕ÷=.;fÖ¢«ûݼ•8ßì4ó+·^ÜãÎêÜb%×Tg”qßÌ^ø ëYk7Þ žµîy\'jöyJéqF@%dQb¦QÓ<EFBFBD> |žòM&>B%IÿAèñ­<EFBFBD>âvRˆl“tº®Æ§em²" ÊÔà)bÉŽÊë/WëgÐ6<C390>lÉQ6Qó¢5µ¾)¢…Ž¡ Ó1ŠONç
ýû\\çßç:³Ïuæ Ú2³¦=íç3m«ä¿MÊ!“òWÄeYè²£¼¸V!ÊbkÂÀµ„ÒxM/Ü}\\õís<C3AD>éè=‡Ùð<EFBFBD>Çr™G¿ ‰A†&mãAß~K믬1à—åm¹<EFBFBD>‰Ü¥&½Jü]cû\'X\\ öûöúRór²d6×âjZ ¿ÆI·Òî<C392>ÖnÒ<6E>²%ÕZ´Dn·UÝN¸*3«,‰ªëŽÛîÅ_.?®5V.?>9¼BÿÝ:ô€ªß©%ë"' . "\0" . 'yRù;ýY,¢Ÿ¸—xãËÞ¿Ó·1|+ÒqÖyaݳšô¬Ö•§]r¯Ž«üÎÆŒf«K³µÚ»\'\'#¦v¥\\©˜Ù?RŽÊ^&£w"ðiueâ[ÙËnG¢5ت“E
XdÈ&*™ƒ·ìÂAqu¡
ªÅÏìKîW\\,¸êÚ«Ò;:œôþ·uîÛªµŒ{\\ç)½}d]véž—*d¹¯¾T¡y*Ð`nD¨8S‡çú·h<GGæªîË4˜¼½¿Ì:ïòÁ¬VÄÏD<EFBFBD>¢x=^Š&I.Šï¶Úƒdôºªà¡Ç‰$=§ˆ¼ÂÁ0Éu! Œ.:´¹„mFŠ´3zÎÊ+ú‰½Å÷µ¾ÌÁPb™WŠYf4á×Z¾©Tº(<EFBFBD>š§¸ÆÒo8JRRD.½êªœ­d-"ªÌýo& n¶ebÕ' . "\0" . 'kÙ†ïQ·#VïWøÍ·”¥ÙýDã¬U“ÂG|ýR#2ƒOeË,É0‡„*Ø2Šü£|@,~;9onÛÝù-Ä3Mfeu6n9<><39>Àý[E' . "\0" . 'U±ÓbÐò‰ö1ùMó8Ø£þ~/®µ™ÅñcFÚ
nýÓÛ¥=ÌG/ëÝ¥¶Ð—¯sxQ¥é s&-ü²Nǜǧ Ù<89>9m<EFBFBD>þøbßiÓtÔn<EFBFBD>¿ý!—qW¾jäÙëayù Ä>%ù À=«ÇÑÁ~_0Doö_º—”IÄ Úúɹüúú^þÔZÿµ+ܺg…9¾Ï·?ß$í_ñõÍØøµû½ýkVˆ“ý×ìàÙñ=ê³"¾¶£¿r?ïÓMë<1A>(|½Ë½H\
HÏLÿv¬=Âêïi×ѱ¾‘¯,,ÈuÍÁ¡XÖ±¼gPéG²R`tnĤ»ãÚ5X£Áó"ºà.Ýq<C39D>J”éQ¢ÔY°R²N"wñ¶¯TLۺϊ\\ŽF7iÞŸx\'B¾ö©pI š!Þ$¿uoì^¦=Ñ…ÛMåØz§Ä®tN©tªzt#Te®\']×8FC4©Ž”<C5BD>”Ñ,~V 0³Cd]^l#ëv­W¥¹Èny „¯Àú¤6ˆêºòE§¸Ž~ö«O]spªÐNÓ"íÀÕ<C380>´<03>6©ùA¹u5W*J¿ï&ðç•áJ7zÕì7X¯Çâ?eL!¼kµhƒñü {¾:røŸµ÷ÎŽÞFÇûgçÑÁþñqBSGÏÚRç¾$¥[ß[È.—öê¨f+ôPµ.ê1Ÿ“l æV~v¾zNsÄX˜P;h“×3<C397>îÿñðtÿÇÃèå»Óýó£“7²Kì
¢×+<EFBFBD>Ðé•HQ½Â‡²ËÓQŸ½ ü]¾ñï×ø÷<EFBFBD>ø÷ùØ:¹€V½>|}rúçèÝ™hšê+T4L‡õ8jš¤:Ù@ø‡¨7ÈÄê:È®+_Ûàç!¦©";z<1C>³Û
ÀÀŽØE¬cÔ˜:¶÷b¹EÖÐ0ò<EFBFBD>Ó¿†8ª@†ÀbÕ…ÐV¨F Ê<EFBFBD>Óä½6%-Ua-Ô·‡ûˆ,@H„CMjé×T÷iqº2,-I#!"‡±a;<F6¨mðQ<C3B0>—BÚRÉkßêÎK7IßþŸ!¼å=<3D>o«œ=ëNöPÿz“‰é{<7B>Ïcþ…±¨¸€4M:“òÕ6ûöB ê®<' . "\0" . '¶—ATµË½' . "\0" . '-ÝÒ Í&GƶB4¶@°5
£6@LK*PNÐÿ•¡Ó¸UçÛGO<EFBFBD>þÄJûíM;6ßúÈx' . "\0" . '¯ðÁÌÂÑƾ€ŽA÷d†giý”=;²šNáÀx%ÆÊpl<¿Ê²(yÒÚçÊ hA÷y[è+
)f¯¾reÂÕté&ºœ-ôšd0Ä0IAõȇՄjÔ/¢.hÆBoÒzÞöźßNE‡ÙÚ
Òh½Þ¨GïŠ4 ÚPçßàØ<EFBFBD>«ÌÛWo7×£çÑaëÝÙáiëåáÛÓÃýó×QS¥½99?:8—õÑìUÿ-ÿ¥ä¡ý•q¯“ˆ³Zú‰³ÉøËÈÄò:ŠZU+×wf©šúñ?¨+¿§Ð}' . "\0" . 'àz ÷Ïq üßA3šÝÿ_^eR”å[üŽ©Å}ÿ[me€Tñ5-?' . "\0" . '6Ùèοš\'¦ß¸O½¥ñ«ÛY©Ú*°«<E28098> ‡”\'<27>°èƒûKËlu 1šÑwJ™ó¡uìDãæh¸Ý]Ëô/ƒ½éóºéˆÂa ªØ•\\Ý4*¶òôCŠoÞ¸¼Rúh×2ºµH ¿|Ó¿¾ˆ?:!ÅývøÀh¨3žÙ§%TLHÒÞÛú¶\\YŸì†yî":wæ& ‘…+Ã^z<>2a¢fÍ]èPµnÚWZ½ "eÈÊjU¯ì\\6V|î‚éÏ
DˆH)y2º:þïéc¤÷é\'<EFBFBD>Qt¿×e€d™&V·ßÿ^ ÇÞùê ™p¾¸û¹}oBts .èÛᘠð°®O<ÃG}Ä? ÑÄ?9üûñp.¾{Ÿ‹=^pì3ÃÏ
2|-U(8ûI¨faéF
´¤öXW ­<EFBFBD>U»ÛY÷“:. Úæ4€ú—Ä£°N2¡_Ø«7N•÷é~*¦[­$%
¡Z¨ßB§ñõEI“2…I⚯3I<¶Þ$k$ÍÉ´ Òëøá¨C¦1A•;CüyÓ
u˜Rs' . "\0" . ' ÷Û15¢Žˆë¡‡+t¨SÙ2;â),ñi2ÁIq°%œ;^Ï<EFBFBD>}<EFBFBD>aFÉMD¨²òpÅÔ.äV,T1<EFBFBD>Óë4Òw7¶upT¨¿¢N~KâàʲÒv; 3Ü cº‰1m£Ò^Ï0ÝØš ôiÈž™j¢¨nQEÚ©ý8ºŸ²8o2C[*Ñ%ô2êb®$/1 S\\ÞH/)?OÆáÊ ]y-꼨´<EFBFBD>
Àå+®_l:z?ÊnGn)yÍU]\\e!ÏjšØI=aK.dq Å ÍYd²¹H]@%<EFBFBD>µ¶' . "\0" . 'RßÅÈ]fº¡•ÇKÂHüKËéýïÏé7ñ¾~wà8<EFBFBD>"ø:¾¨§ˆyñ7èùo÷ÎÿÎU#Œ} /ƳKv,SÞmwgÂ^óvu®ë¼UŸm¦ð¯.`ýo_½<5F>`ÊGB¦Âõm×´ÁЪ{ö u$ïÕ›«ò: 9뤹!¿ðµ¶Pi¼¾nÝßøRLÌ€F·*J<>Ô…
P^t' . "\0" . '#sq®¤Ð/y—î·é~«;jf‰€A Ì=cÜ2”E»3$ºGÜ»<C39C>À©¯ã±À4ñãýƒ?<1F><>¾ŒË£áÍ ä\\¿Ýÿ.”|yøöüUt|ôúèüË(9ÛÃædô5l(</ÝbÄTñîbæ±câÿ8+<12>Er\'ú܌ʭ:,sj}<7D>C†ò<E280A0>íôG^vàÜÿæ“èôðàÝéÙÑÉ/B¨šý“°ÉCjêPÃnŒ4ÖèGÑjÕDJ3¨<33>˜iè4¹º3?ò>hNúüê
Uæ¡««H#Ë}ÑThÉQ&!(âé»®LˆŸ@ùZä$KM9 uìjbOo<4F>­A±Û$;q°;\\µ<>ݽ3"—{ÿ{`<60>…Õê|³É bLuvHìªÏ_Ð/†C(¼õz½jGÝ+ƒž4‡¸ô™eOœ‰Ð w1cv³PºnͶ†éW•ÉÊÇ·ÒnC#…ñ|n“¬{»ê¨<C3AA>ivøÉÊøöÇo¬¿¹#¸oÓ6<C393>DYÉáZ*Õ|!Eˬ¥qö9YPÖÍÃnŸ´9êÕ£GË}îæ£_²(,Þ8‡ÇsSVâ<56>Ý´=½®{ÏÛOá´ÎOÿxxz¿<9x÷\'9=99—rFÖ"¶†­<Ë&­nŸ=PZx¿¥äC3÷nI—fˆ^ü»¼PèšøŒ¢HF_zø®˜§ý¦š´J[ 4ß_˜Ç8 qa TGý¤HéÉÔ¸—·­pÚfžÛ{ Q¥#0ýu[ìˬ5väùpq©§4T´zuÝ.€-”þúäåaëüð§s6' . "\0" . '¨øöxÿè ¡Ö9Û{DaS;ƒ~¬Œô<lÐoÑ9hyØÝ•3wvËðÕRði|(#©²}É9¤"V=µ34<33>E¬r¼#ƒ±÷òß…z OG„‰*QYöCÖïF Aòð¬Ã1àyø°â¤ì*ƨT?/‰Žâ×ïLv>$y”î~.Ò<EFBFBD> 4î÷4dZý ¹ŽÒ ÑÔÝnÖÁMV½#ÄÚ$=…SiAÔ¤NØÞˆ¡8P÷JÒºPR&h1EÄä ÕE:ÌbF­Q­MêäR¼? >1J"-év {R½«<C2BD>e­¬MªŸ÷<C5B8>,uدex
W%=­Ã¨Vt#ÿ6MóOÔ<4F>,èEÿD…u!cÂÊD`¾IŠÐ¥ì4¢Œ<>{,fœ °&>|LÔ‰ýMv»T­1È:(Á ÄnœTE¢\'¡*E&ŠcK‰Hå<48><C3A5>EHˆÎZzWd××ƒÔ œÔâ<>l7…á×ïIu\'ã$HÄG"`¡¯µäyZgí´®ú5®ŠY-pÀ+E<>®ÌJ¿h\\Ù_Õ‡Y]Y<>û|/a&õDd%@túR­ý^%£Ì\\4FdJÍâÅ\'¬Õ?»âZ±Ë>ì¶rÉóÀ¦ÏN±²²SÕMÍ/Š+Ñœ;ÕZÁ¡¬¡ÕψP´†M»Å•í&²QµÜnC<6E>`€ªb<­Ö$ÙU-¤£Sëó¤m5"0Oê*pëY_lŒG×¢Šö<>#ŸÝPöøuGZåï.-‰©Ï>]ð<>l§J<4µ€>üðaþèQ ¸Çi×N²kµh$$<24>Ìb¬µ£ˆ\\ˆ^ÏÝvŠG<EFBFBD>ª…¨(.S\\Õ1HM]¾ã²»Ô†KÈΘæh\'ëk˜úÁjµÚ µd”<64>Ò¥»Úðý$¹¶9I…¥gK<67>ÒGK{$§££ÑôöO(ÜýÑUR' . "\0" . ' ×5ëQj<EFBFBD>¥ÜÂ<EFBFBD>{!αîÊ<\'·T}d¾Ó¤Ë¿ÑmB$,ᵑÊÒ£
ÜTx)–‘ªèçÑÙÉm+DuÉ{¬Ê©”Ëx˜NŸ¬K…œNz+ÛK—qõÑbÓD> ‹œ\'Vì4uþúxѲøN¬SÔ4Õí2œÀŠïËøYg2ÔRšÑj£ñÝR„áPo²<EFBFBD>Xÿw—Γ÷b¡Î†i4Ê&@†HòŸ½ŒYÜmZ³D~Ô :ƒ¬€½¬˜îY>A‡/w}B,ø"ëö‘]w.®ø2˳êyv[T뀫ÂÐY+„j*°tÒÁ ¸˜\\ÕáÅ©"ÔqÛƒœ Œéqvæ ´ɽËôÅH½¬ÿóÏôK,P½J~øð<EFBFBD>N—KæêŽÎOL~ªòWVïp‡”îb\\õY2"áßIuGbKŸ%ÏWVé^ò|µÙ¸ŸI±F]\\xD <0C>X¤Í£5`Âd‡<64>w<EFBFBD><77>ÌH«LH+ ´&(Í­+ºÓ°Fù L[pqȯ6+l!Ç¡S<E28099>Ȫ!FJN,’Œ­«;Bq±)1(|ý(v4½\'¬6²{†*õ~‚ëLdäÍ3;KÝîØ×Õf©;¿põ²:ÚAÕnYm!<Ï+På.V” ¢fVT)wä*%´`j¨t%UY ÈÄY@žOšDêjvZ¾F$x²}†9
+¤Ý„»[.D<´é”–´Ãôù®ö>ýÔÎ’¼û&ùÐüL\'ÅEóâªF?<EFBFBD>­çÍ«µ^Šš<EFBFBD>°ýJZgHêÇ®ÀÖa+PYªkž‰FɇZDßBC(öý¦<EFBFBD><EFBFBD>•º£:T—j|^¡ž\\Ïz=±„ü ÄñÇ<éU
>¿?ÿlH}<-' . "\0" . 'S÷Ó¨XIÃ[ÕîžÈ-R±R€øI` ­ù&‡QCÕìVPŸŒháE(õj‡MáÌ«Äë­X\'3!æ3PPéw`£èk퉆çÙøQE}Ð4x>qªÍì<EFBFBD>vA¬®Hõ£?Á9 Àãµ™H 8Ï* ИkH­i.ÖOZ†ºþhw²JÖ' . "\0" . '8x¦éñíÍ.¬kevgL»U€íÄLö»oÃòÉ%YI;ɳ™u&´œLvwKØ+¹ªêÁöów“Úƒ†`´<04>¡8@€P!ÞS»P.ÕLb(d¸<64>v' . "\0" . '>íBhnIo<49>U*C:ƒ4ɃP…@)•uÖmì0™J²”ú ¬+ÑX")PŒº .G[š<>]ÛmÜÕÖ6Å,¸»S2T¶CÌÕÃbŽÀ¦]t^H<>”²å˜Ò ˆò¸ó+Y”P?(ëÈ ’ö‡³°íŠ @M,ÃŒ{¤R Ï+j<>£7â _þѧÙ^h]nÌŒ<07>ðøb]bÈòl~+XS7,E>þ…ªÈOþ-8t«ÍÉ—¼VO5ÚòR·7Bõ¤jëwÕT…B(“ Ô°zgþ<>~Dï&¬q ÿ¬Š4ê¦]Ö4y˜-(šRéx¸¬Ð`·$ÐÞõtYô¥*¶¤H°Ú®Í²ÃžQâÐP0_´ ÛêR øå[öŠÈ‡Plpz™ØGæ^ŸÂ2âyykJy>±×ø¾ÂÛHXÖÀ„O¹™³Þ^Èf°÷ꬩ̜ýz^˜æלçÀ«Ê6fŸ^¿šLƧ©¥b¢$wNV¥Ï—wƒÛdµ :Žºô­ÕÜ…«±c:Ⱥ
¸8Àf@2]¼Y®1 \'/ê-…½¥*œMÃ7•¦uÇpT)ª¸-þîH(öEÕ¨ ö^×wÉÄ¢ñrZ®£NÞÅøÇ¥)$ÌjÖuºê,L çuñÛûëR<C3AB>™àƯ¥"NM‡Ùs' . "\0" . 'ùH(VVõâ<C3A2>¸ø1ÚåêhqJ+Û5»0 6˜Ô“ÁDnü)…8ÙÚFj Œ0.4Ò<EFBFBD>=H(qW ¢¡V(¿1{~7ÊÔN©ž†UO]¹Ñ=£<>î,gàƒ`¤ÎÚ' . "\0" . '.|j ˆÑìB•‹›~ˆ & UÅÊë!þùÉæ½°®hD Ñƽ[|ÇÜKkd™^‰Ì±¾f·nu=Ü:k]œ#äƒC‡4}ê<> Hxž8xÖ¾`lîPg±À­1v%Ÿw|<7C>^ÀÌcUÆ<55>g Å}Ög=<3D>çPÊŲ£V‡õ§ÜÇO¶ø”³ÍªõNoïÁX‰Í…èçŸçtW^fC¹ÊDµêotj4W5]|iÂécÈÀJQ¢K ]l\'G{j^¾sY\\§¬Š5ž7í.8<ò¢”Þ<E2809D>=ð?Ê<t„Ý£QÒOý¿§]ß{!%ô»Ò­ñ Kºlgpyèï~¾«Mv¿Èo`é¢4<çÕøìL|c¿Z~ƒ&@+&¯R÷Ò]<~ÚŸˆf·§“TlÆʪµæüb±j¤míüõ1ߧxòáÚ*¾£‡·‘^‰ñƒ…«µŠ•SöG?ÿ¬~íåU
_»¹<EFBFBD>|TÐÉÇg :ùÐø[4e7»5ýƒ¹$y©„GMŒ„{ö½à:cÀF\'ôȱ¯µý$¨uäÏþhǪñ~ƒ· çøxúÿtè1J•l/[ÀÝJ¶TWFâïÚDž7×Yv—nŠœÞn4V6ߧÕGK5<ʬE[ßU—`W·' . "\0" . 'âç<C3A2>f%Yɪd¥3Õ£í*0±ƒ,‰ñÙ-Û{êí <20>è…a÷)¨(à=E„CÉÏì½™üº<C3BC>TÖ67kêO£þ´ºƒO!¯㤓6E%;òȽ‰gÿ;½ ¬çÉ°?øÔ áîXQÿ3:e6×m4›Õ<1C>ãÀ<02>*ÐÆzcN;WÌœ&œðSù[4Š7ÛÙ {¤É,<2C>2—$ÿYDâ3µRÈÚæêúøãŽXÓóÞ »]ùØL¦“Ì¢È(»Í“ñÎ<*Þìà9\'}Éj<ue˜ý}¥$ë6m¿ïOL.µß%I²#é¶Ú]MWSVYd<59>´|ngÜ¢Û¢sÑšø“§]Vƪº<C2AA>뮕”ô„šÆR¢ï­<C3AF>@HÄRÔ€þßÅV\\ _.FfE¤ìÈŸyÒíOfÃîÍNÄô ?gù$M,Æ;ÈFE&ŒZô: 2ñO6J:âßãi§ßM"ÊOÅw¿<77>;ˆ' . "\0" . 'x™þ5ùã4:KF…LyÑŸˆå2M†Ñ(Ï9<ÔOóèMz[4¯Ãs˜y¿·>Á+7Ä™«k†B3³±3Ë4tX²´XįGÍAÚÐÛb4|üºNÇnöhz³m±Aoþ“´
D¢ÏbQù]÷ üç50Ù´Ú<EFBFBD>žzž
ÂgÓIÑï;˜„j>ÐlPÝÛ´Þ¼ÀÍ\'€Ïrôeû7s4ƒþ^w°×<C2B0>ÈÉ2ÕÊáÖ_Òml×ÔŸF}ÏQ<C38F>à¿Õ5·‡uf2ÚƒX†<58>v3<76>Ê+žæƒÊe ka³?L®ÓÇŇëG‡ƒ<E280A1>餷]{&¾"ñ5*Ä0™Œ<C592>ßÞÞÖo×ëY~ýx­Ñh' . "\0" . 'üR¯†½È>î.á$-Ûl,í=ƒÎFb1y½=¹Yݬ<„õ¹±IŸ+v®ü\\]¬nG«ÛÃñOCüÿ.A¸ôÁîÒwkëK<E280BA>­ºV׶B% äÐût}|v—ÖTG<02>Ù»Œ««Vè*VD‡@îÇ°' . "\0" . 'FÀaÑ$<EFBFBD>¨¼Ó¡ã¾q†·<EFBFBD>4÷G8ÿˆù,$#6!Åè@&ÈuÁ|“¾Ð’ä”ö»ÝAZ>ÂÄ®åã¬ØY<C398>¶àÖ¢<C396>kW#ZÛü®s]{<7B>„±Ûù%5l6ªaV/ìzföç‰ÕF…ÚÌòï¹ðO:,¡¸Ò³GÛ…,á#èY9Û>êv?«náÒ#×
X=q‰ë&ÅMª×¸EøŸ£DñBb?£Dë¤[½RõÕZñ\\,<]£³U®¨Û}ö<EFBFBD>‡•ër]O軟íU^é zýÒ«õ&×k?5oÄx§#EÞI6ÚJ©&Ð:luâV”\\Á b2ÍYÈË×e¹"è̳f[¥bG3]ž0sÏi”¯¾”6MJJµÏ™Ã!UÆÙrX…çë|ÖSÆp“ ø' . "\0" . '{+7£3_Ê\' I„ÏÁ‘è¦/Oí®ÈUbNÿ×B…À¿í³f Á²ÁçMPl¬ñ³¥<C2B3>öúœ8 5z¹£ÂšÜ]붟 <20>-,6ÃH\\zC4™dCnâ\'H7ªOŸ] ´<EFBFBD>N\'§æ ÇûU¡1^\\šË -ÙBÍ° øÏ¥¢ˆÊ6BR¥\\19UVã>û£ÅWÓµ ³¿ãBUvÌYKE+g´Ñ3€ëÁY¶kÚ .,s<EFBFBD>•SH.Lš¬ši
<¿ùwmÃe¸|Q?[å³=Ãɧqc6{ª:xÉn}Æ«P-ÝB9ØtZŒÜzj½ðüY
«-C@üä± &fI0” ¬Îªµ<EFBFBD>N‡§¢²ýKhßkÑšR½µŽüÃ?,¡r,' . "\0" . 'nV?¬Ý¬þqõUãï\\ååm£ÀÓ CD]Äz.¹\';5$¢*=$Nµ0<>á$ã"mª;nn/g@¸¸[5o`yEaàኾŸ±ÌDwÂg$—ëÍx¥º jñy(x„õL[j¤~‡«“N<4D>~0hú5Mº5?íæs)²f»,ÝIAª¸ù,…0Þµ<>Oç`{<KV@À•*Ъ<C2AA>Tœ¡;©b{Üdä€zP°å&,P' . "\0" . '#(GpÆtÚc9' . "\0" . '¡âR/Ýx†_®F³"†¤“ò°i oYÎÒžÜdÂÝ6>±ÙYGª`h©·D=,<3`¥½ÙVÚvdžf2™ä•`ñªªRãjÔ7Ó¡ÖJ¬D_5“ÌNÌ1£q kè[‡Pp—¿±ŽÞÜá[£ákouÒnÛZQ˜…™f™¥¡®Èqß^ºñt«&Az¹+,[*Ükë ³­êu{[éúW7€Ìã³6´±¶eœQI\\3Zmí|[Í\\ÛÔKgPg%#òœš>»ÆýEuK_.U]亮JŒ4<4¢òßûµÛ<C2B5>Y®Š7C+ÓR-õLªø3ôA¶õ ¥¯µËÍ™…-y8C\'œ-™˜(žcâèõü$ȇ^<5E>Û*l<>3‡Ú³ÿ`]66Áo{fÑñ{Y®ÏÖª§C gÒñQqG³ÔÖ^g^8`4Kævz<76>ù«¾MÌà¯Ík%<25>{AÁŸ£Ø„•¦c¹óMª‡<C2AA>r®x v4¬:<3A>ÂáPò?âÚTwþãÿÁˆÃm'));//

View File

@ -1,150 +0,0 @@
<?php
class Kint_Parsers_ClassMethods extends kintParser
{
private static $cache = array();
protected function _parse( &$variable )
{
if ( !KINT_PHP53 || !is_object( $variable ) ) return false;
$className = get_class( $variable );
# assuming class definition will not change inside one request
if ( !isset( self::$cache[ $className ] ) ) {
$reflection = new ReflectionClass( $variable );
$public = $private = $protected = array();
// Class methods
foreach ( $reflection->getMethods() as $method ) {
$params = array();
// Access type
$access = implode( ' ', Reflection::getModifierNames( $method->getModifiers() ) );
// Method parameters
foreach ( $method->getParameters() as $param ) {
$paramString = '';
if ( $param->isArray() ) {
$paramString .= 'array ';
} else {
try {
if ( $paramClassName = $param->getClass() ) {
$paramString .= $paramClassName->name . ' ';
}
} catch ( ReflectionException $e ) {
preg_match( '/\[\s\<\w+?>\s([\w]+)/s', $param->__toString(), $matches );
$paramClassName = isset( $matches[1] ) ? $matches[1] : '';
$paramString .= ' UNDEFINED CLASS (' . $paramClassName . ') ';
}
}
$paramString .= ( $param->isPassedByReference() ? '&' : '' ) . '$' . $param->getName();
if ( $param->isDefaultValueAvailable() ) {
if ( is_array( $param->getDefaultValue() ) ) {
$arrayValues = array();
foreach ( $param->getDefaultValue() as $key => $value ) {
$arrayValues[] = $key . ' => ' . $value;
}
$defaultValue = 'array(' . implode( ', ', $arrayValues ) . ')';
} elseif ( $param->getDefaultValue() === null ) {
$defaultValue = 'NULL';
} elseif ( $param->getDefaultValue() === false ) {
$defaultValue = 'false';
} elseif ( $param->getDefaultValue() === true ) {
$defaultValue = 'true';
} elseif ( $param->getDefaultValue() === '' ) {
$defaultValue = '""';
} else {
$defaultValue = $param->getDefaultValue();
}
$paramString .= ' = ' . $defaultValue;
}
$params[] = $paramString;
}
$output = new kintVariableData;
// Simple DocBlock parser, look for @return
if ( ( $docBlock = $method->getDocComment() ) ) {
$matches = array();
if ( preg_match_all( '/@(\w+)\s+(.*)\r?\n/m', $docBlock, $matches ) ) {
$lines = array_combine( $matches[1], $matches[2] );
if ( isset( $lines['return'] ) ) {
$output->operator = '->';
# since we're outputting code, assumption that the string is utf8 is most likely correct
# and saves resources
$output->type = self::escape( $lines['return'], 'UTF-8' );
}
}
}
$output->name = ( $method->returnsReference() ? '&' : '' ) . $method->getName() . '('
. implode( ', ', $params ) . ')';
$output->access = $access;
if ( is_string( $docBlock ) ) {
$lines = array();
foreach ( explode( "\n", $docBlock ) as $line ) {
$line = trim( $line );
if ( in_array( $line, array( '/**', '/*', '*/' ) ) ) {
continue;
} elseif ( strpos( $line, '*' ) === 0 ) {
$line = substr( $line, 1 );
}
$lines[] = self::escape( trim( $line ), 'UTF-8' );
}
$output->extendedValue = implode( "\n", $lines ) . "\n\n";
}
$declaringClass = $method->getDeclaringClass();
$declaringClassName = $declaringClass->getName();
if ( $declaringClassName !== $className ) {
$output->extendedValue .= "<small>Inherited from <i>{$declaringClassName}</i></small>\n";
}
$fileName = Kint::shortenPath( $method->getFileName() ) . ':' . $method->getStartLine();
$output->extendedValue .= "<small>Defined in {$fileName}</small>";
$sortName = $access . $method->getName();
if ( $method->isPrivate() ) {
$private[ $sortName ] = $output;
} elseif ( $method->isProtected() ) {
$protected[ $sortName ] = $output;
} else {
$public[ $sortName ] = $output;
}
}
if ( !$private && !$protected && !$public ) {
self::$cache[ $className ] = false;
}
ksort( $public );
ksort( $protected );
ksort( $private );
self::$cache[ $className ] = $public + $protected + $private;
}
if ( count( self::$cache[ $className ] ) === 0 ) {
return false;
}
$this->value = self::$cache[ $className ];
$this->type = 'Available methods';
$this->size = count( self::$cache[ $className ] );
}
}

View File

@ -1,49 +0,0 @@
<?php
class Kint_Parsers_ClassStatics extends kintParser
{
protected function _parse( & $variable )
{
if ( !KINT_PHP53 || !is_object( $variable ) ) return false;
$extendedValue = array();
$reflection = new ReflectionClass( $variable );
// first show static values
foreach ( $reflection->getProperties( ReflectionProperty::IS_STATIC ) as $property ) {
if ( $property->isPrivate() ) {
if ( !method_exists( $property, 'setAccessible' ) ) {
break;
}
$property->setAccessible( true );
$access = "private";
} elseif ( $property->isProtected() ) {
$property->setAccessible( true );
$access = "protected";
} else {
$access = 'public';
}
$_ = $property->getValue();
$output = kintParser::factory( $_, '$' . $property->getName() );
$output->access = $access;
$output->operator = '::';
$extendedValue[] = $output;
}
foreach ( $reflection->getConstants() as $constant => $val ) {
$output = kintParser::factory( $val, $constant );
$output->access = 'constant';
$output->operator = '::';
$extendedValue[] = $output;
}
if ( empty( $extendedValue ) ) return false;
$this->value = $extendedValue;
$this->type = 'Static class properties';
$this->size = count( $extendedValue );
}
}

View File

@ -1,400 +0,0 @@
<?php
class Kint_Parsers_Color extends kintParser
{
private static $_css3Named = array(
'aliceblue'=>'#f0f8ff','antiquewhite'=>'#faebd7','aqua'=>'#00ffff','aquamarine'=>'#7fffd4','azure'=>'#f0ffff',
'beige'=>'#f5f5dc','bisque'=>'#ffe4c4','black'=>'#000000','blanchedalmond'=>'#ffebcd','blue'=>'#0000ff',
'blueviolet'=>'#8a2be2','brown'=>'#a52a2a','burlywood'=>'#deb887','cadetblue'=>'#5f9ea0','chartreuse'=>'#7fff00',
'chocolate'=>'#d2691e','coral'=>'#ff7f50','cornflowerblue'=>'#6495ed','cornsilk'=>'#fff8dc','crimson'=>'#dc143c',
'cyan'=>'#00ffff','darkblue'=>'#00008b','darkcyan'=>'#008b8b','darkgoldenrod'=>'#b8860b','darkgray'=>'#a9a9a9',
'darkgrey'=>'#a9a9a9','darkgreen'=>'#006400','darkkhaki'=>'#bdb76b','darkmagenta'=>'#8b008b',
'darkolivegreen'=>'#556b2f','darkorange'=>'#ff8c00','darkorchid'=>'#9932cc','darkred'=>'#8b0000',
'darksalmon'=>'#e9967a','darkseagreen'=>'#8fbc8f','darkslateblue'=>'#483d8b','darkslategray'=>'#2f4f4f',
'darkslategrey'=>'#2f4f4f','darkturquoise'=>'#00ced1','darkviolet'=>'#9400d3','deeppink'=>'#ff1493',
'deepskyblue'=>'#00bfff','dimgray'=>'#696969','dimgrey'=>'#696969','dodgerblue'=>'#1e90ff',
'firebrick'=>'#b22222','floralwhite'=>'#fffaf0','forestgreen'=>'#228b22','fuchsia'=>'#ff00ff',
'gainsboro'=>'#dcdcdc','ghostwhite'=>'#f8f8ff','gold'=>'#ffd700','goldenrod'=>'#daa520','gray'=>'#808080',
'grey'=>'#808080','green'=>'#008000','greenyellow'=>'#adff2f','honeydew'=>'#f0fff0','hotpink'=>'#ff69b4',
'indianred'=>'#cd5c5c','indigo'=>'#4b0082','ivory'=>'#fffff0','khaki'=>'#f0e68c','lavender'=>'#e6e6fa',
'lavenderblush'=>'#fff0f5','lawngreen'=>'#7cfc00','lemonchiffon'=>'#fffacd','lightblue'=>'#add8e6',
'lightcoral'=>'#f08080','lightcyan'=>'#e0ffff','lightgoldenrodyellow'=>'#fafad2','lightgray'=>'#d3d3d3',
'lightgrey'=>'#d3d3d3','lightgreen'=>'#90ee90','lightpink'=>'#ffb6c1','lightsalmon'=>'#ffa07a',
'lightseagreen'=>'#20b2aa','lightskyblue'=>'#87cefa','lightslategray'=>'#778899','lightslategrey'=>'#778899',
'lightsteelblue'=>'#b0c4de','lightyellow'=>'#ffffe0','lime'=>'#00ff00','limegreen'=>'#32cd32','linen'=>'#faf0e6',
'magenta'=>'#ff00ff','maroon'=>'#800000','mediumaquamarine'=>'#66cdaa','mediumblue'=>'#0000cd',
'mediumorchid'=>'#ba55d3','mediumpurple'=>'#9370d8','mediumseagreen'=>'#3cb371','mediumslateblue'=>'#7b68ee',
'mediumspringgreen'=>'#00fa9a','mediumturquoise'=>'#48d1cc','mediumvioletred'=>'#c71585',
'midnightblue'=>'#191970','mintcream'=>'#f5fffa','mistyrose'=>'#ffe4e1','moccasin'=>'#ffe4b5',
'navajowhite'=>'#ffdead','navy'=>'#000080','oldlace'=>'#fdf5e6','olive'=>'#808000','olivedrab'=>'#6b8e23',
'orange'=>'#ffa500','orangered'=>'#ff4500','orchid'=>'#da70d6','palegoldenrod'=>'#eee8aa','palegreen'=>'#98fb98',
'paleturquoise'=>'#afeeee','palevioletred'=>'#d87093','papayawhip'=>'#ffefd5','peachpuff'=>'#ffdab9',
'peru'=>'#cd853f','pink'=>'#ffc0cb','plum'=>'#dda0dd','powderblue'=>'#b0e0e6','purple'=>'#800080',
'red'=>'#ff0000','rosybrown'=>'#bc8f8f','royalblue'=>'#4169e1','saddlebrown'=>'#8b4513','salmon'=>'#fa8072',
'sandybrown'=>'#f4a460','seagreen'=>'#2e8b57','seashell'=>'#fff5ee','sienna'=>'#a0522d','silver'=>'#c0c0c0',
'skyblue'=>'#87ceeb','slateblue'=>'#6a5acd','slategray'=>'#708090','slategrey'=>'#708090','snow'=>'#fffafa',
'springgreen'=>'#00ff7f','steelblue'=>'#4682b4','tan'=>'#d2b48c','teal'=>'#008080','thistle'=>'#d8bfd8',
'tomato'=>'#ff6347','turquoise'=>'#40e0d0','violet'=>'#ee82ee','wheat'=>'#f5deb3','white'=>'#ffffff',
'whitesmoke'=>'#f5f5f5','yellow'=>'#ffff00','yellowgreen'=>'#9acd32'
);
protected function _parse( & $variable )
{
if ( !self::_fits( $variable ) ) return false;
$this->type = 'CSS color';
$variants = self::_convert( $variable );
$this->value =
"<div style=\"background:{$variable}\" class=\"kint-color-preview\">{$variable}</div>"
. "<strong>hex :</strong> {$variants['hex']}\n"
. "<strong>rgb :</strong> {$variants['rgb']}\n"
. ( isset( $variants['name'] ) ? "<strong>name:</strong> {$variants['name']}\n" : '' )
. "<strong>hsl :</strong> {$variants['hsl']}";
}
private static function _fits( $variable )
{
if ( !is_string( $variable ) ) return false;
$var = strtolower( trim( $variable ) );
return isset( self::$_css3Named[$var] )
|| preg_match(
'/^(?:#[0-9A-Fa-f]{3}|#[0-9A-Fa-f]{6}|(?:rgb|hsl)a?\s*\((?:\s*[0-9.%]+\s*,?){3,4}\))$/',
$var
);
}
private static function _convert( $color )
{
$color = strtolower( $color );
$decimalColors = array();
$variants = array(
'hex' => null,
'rgb' => null,
'name' => null,
'hsl' => null,
);
if ( isset( self::$_css3Named[ $color ] ) ) {
$variants['name'] = $color;
$color = self::$_css3Named[ $color ];
}
if ( $color{0} === '#' ) {
$variants['hex'] = $color;
$color = substr( $color, 1 );
if ( strlen( $color ) === 6 ) {
$colors = str_split( $color, 2 );
} else {
$colors = array(
$color{0} . $color{0},
$color{1} . $color{1},
$color{2} . $color{2},
);
}
$decimalColors = array_map( 'hexdec', $colors );
} elseif ( substr( $color, 0, 3 ) === 'rgb' ) {
$variants['rgb'] = $color;
preg_match_all( '#([0-9.%]+)#', $color, $matches );
$decimalColors = $matches[1];
foreach ( $decimalColors as &$color ) {
if ( strpos( $color, '%' ) !== false ) {
$color = str_replace( '%', '', $color ) * 2.55;
}
}
} elseif ( substr( $color, 0, 3 ) === 'hsl' ) {
$variants['hsl'] = $color;
preg_match_all( '#([0-9.%]+)#', $color, $matches );
$colors = $matches[1];
$colors[0] /= 360;
$colors[1] = str_replace( '%', '', $colors[1] ) / 100;
$colors[2] = str_replace( '%', '', $colors[2] ) / 100;
$decimalColors = self::_HSLtoRGB( $colors );
if ( isset( $colors[3] ) ) {
$decimalColors[] = $colors[3];
}
}
if ( isset( $decimalColors[3] ) ) {
$alpha = $decimalColors[3];
unset( $decimalColors[3] );
} else {
$alpha = null;
}
foreach ( $variants as $type => &$variant ) {
if ( isset( $variant ) ) continue;
switch ( $type ) {
case 'hex':
$variant = '#';
foreach ( $decimalColors as &$color ) {
$variant .= str_pad( dechex( $color ), 2, "0", STR_PAD_LEFT );
}
$variant .= isset( $alpha ) ? ' (alpha omitted)' : '';
break;
case 'rgb':
$rgb = $decimalColors;
if ( isset( $alpha ) ) {
$rgb[] = $alpha;
$a = 'a';
} else {
$a = '';
}
$variant = "rgb{$a}( " . implode( ', ', $rgb ) . " )";
break;
case 'hsl':
$rgb = self::_RGBtoHSL( $decimalColors );
if ( $rgb === null ) {
unset( $variants[ $type ] );
break;
}
if ( isset( $alpha ) ) {
$rgb[] = $alpha;
$a = 'a';
} else {
$a = '';
}
$variant = "hsl{$a}( " . implode( ', ', $rgb ) . " )";
break;
case 'name':
// [!] name in initial variants array must go after hex
if ( ( $key = array_search( $variants['hex'], self::$_css3Named, true ) ) !== false ) {
$variant = $key;
} else {
unset( $variants[ $type ] );
}
break;
}
}
return $variants;
}
private static function _HSLtoRGB( array $hsl )
{
list( $h, $s, $l ) = $hsl;
$m2 = ( $l <= 0.5 ) ? $l * ( $s + 1 ) : $l + $s - $l * $s;
$m1 = $l * 2 - $m2;
return array(
round( self::_hue2rgb( $m1, $m2, $h + 0.33333 ) * 255 ),
round( self::_hue2rgb( $m1, $m2, $h ) * 255 ),
round( self::_hue2rgb( $m1, $m2, $h - 0.33333 ) * 255 ),
);
}
/**
* Helper function for _color_hsl2rgb().
*/
private static function _hue2rgb( $m1, $m2, $h )
{
$h = ( $h < 0 ) ? $h + 1 : ( ( $h > 1 ) ? $h - 1 : $h );
if ( $h * 6 < 1 ) return $m1 + ( $m2 - $m1 ) * $h * 6;
if ( $h * 2 < 1 ) return $m2;
if ( $h * 3 < 2 ) return $m1 + ( $m2 - $m1 ) * ( 0.66666 - $h ) * 6;
return $m1;
}
private static function _RGBtoHSL( array $rgb )
{
list( $clrR, $clrG, $clrB ) = $rgb;
$clrMin = min( $clrR, $clrG, $clrB );
$clrMax = max( $clrR, $clrG, $clrB );
$deltaMax = $clrMax - $clrMin;
$L = ( $clrMax + $clrMin ) / 510;
if ( 0 == $deltaMax ) {
$H = 0;
$S = 0;
} else {
if ( 0.5 > $L ) {
$S = $deltaMax / ( $clrMax + $clrMin );
} else {
$S = $deltaMax / ( 510 - $clrMax - $clrMin );
}
if ( $clrMax == $clrR ) {
$H = ( $clrG - $clrB ) / ( 6.0 * $deltaMax );
} else if ( $clrMax == $clrG ) {
$H = 1 / 3 + ( $clrB - $clrR ) / ( 6.0 * $deltaMax );
} else {
$H = 2 / 3 + ( $clrR - $clrG ) / ( 6.0 * $deltaMax );
}
if ( 0 > $H ) $H += 1;
if ( 1 < $H ) $H -= 1;
}
return array(
round( $H * 360 ),
round( $S * 100 ) . '%',
round( $L * 100 ) . '%'
);
}
}
/* *************
* TEST DATA
*
dd(array(
'hsl(0, 100%,50%)',
'hsl(30, 100%,50%)',
'hsl(60, 100%,50%)',
'hsl(90, 100%,50%)',
'hsl(120,100%,50%)',
'hsl(150,100%,50%)',
'hsl(180,100%,50%)',
'hsl(210,100%,50%)',
'hsl(240,100%,50%)',
'hsl(270,100%,50%)',
'hsl(300,100%,50%)',
'hsl(330,100%,50%)',
'hsl(360,100%,50%)',
'hsl(120,100%,25%)',
'hsl(120,100%,50%)',
'hsl(120,100%,75%)',
'hsl(120,100%,50%)',
'hsl(120, 67%,50%)',
'hsl(120, 33%,50%)',
'hsl(120, 0%,50%)',
'hsl(120, 60%,70%)',
'#f03',
'#F03',
'#ff0033',
'#FF0033',
'rgb(255,0,51)',
'rgb(255, 0, 51)',
'rgb(100%,0%,20%)',
'rgb(100%, 0%, 20%)',
'hsla(240,100%,50%,0.05)',
'hsla(240,100%,50%, 0.4)',
'hsla(240,100%,50%, 0.7)',
'hsla(240,100%,50%, 1)',
'rgba(255,0,0,0.1)',
'rgba(255,0,0,0.4)',
'rgba(255,0,0,0.7)',
'rgba(255,0,0, 1)',
'black',
'silver',
'gray',
'white',
'maroon',
'red',
'purple',
'fuchsia',
'green',
'lime',
'olive',
'yellow',
'navy',
'blue',
'teal',
'aqua',
'orange',
'aliceblue',
'antiquewhite',
'aquamarine',
'azure',
'beige',
'bisque',
'blanchedalmond',
'blueviolet',
'brown',
'burlywood',
'cadetblue',
'chartreuse',
'chocolate',
'coral',
'cornflowerblue',
'cornsilk',
'crimson',
'darkblue',
'darkcyan',
'darkgoldenrod',
'darkgray',
'darkgreen',
'darkgrey',
'darkkhaki',
'darkmagenta',
'darkolivegreen',
'darkorange',
'darkorchid',
'darkred',
'darksalmon',
'darkseagreen',
'darkslateblue',
'darkslategray',
'darkslategrey',
'darkturquoise',
'darkviolet',
'deeppink',
'deepskyblue',
'dimgray',
'dimgrey',
'dodgerblue',
'firebrick',
'floralwhite',
'forestgreen',
'gainsboro',
'ghostwhite',
'gold',
'goldenrod',
'greenyellow',
'grey',
'honeydew',
'hotpink',
'indianred',
'indigo',
'ivory',
'khaki',
'lavender',
'lavenderblush',
'lawngreen',
'lemonchiffon',
'lightblue',
'lightcoral',
'lightcyan',
'lightgoldenrodyellow',
'lightgray',
'lightgreen',
'lightgrey',
'lightpink',
'lightsalmon',
'lightseagreen',
'lightskyblue',
'lightslategray',
'lightslategrey',
'lightsteelblue',
'lightyellow',
'limegreen',
'linen',
'mediumaquamarine',
'mediumblue',
'mediumorchid',
'mediumpurple',
'mediumseagreen',
'mediumslateblue',
'mediumspringgreen',
'mediumturquoise',
'mediumvioletred',
'midnightblue',
'mintcream',
'mistyrose',
'moccasin',
'navajowhite',
'oldlace',
'olivedrab',
));*/

View File

@ -1,69 +0,0 @@
<?php
class Kint_Parsers_FsPath extends kintParser
{
protected function _parse( & $variable )
{
if ( !KINT_PHP53
|| !is_string( $variable )
|| strlen( $variable ) > 2048
|| preg_match( '[[:?<>"*|]]', $variable )
|| !@is_readable( $variable ) # f@#! PHP and its random warnings
) return false;
try {
$fileInfo = new SplFileInfo( $variable );
$flags = array();
$perms = $fileInfo->getPerms();
if ( ( $perms & 0xC000 ) === 0xC000 ) {
$type = 'File socket';
$flags[] = 's';
} elseif ( ( $perms & 0xA000 ) === 0xA000 ) {
$type = 'File symlink';
$flags[] = 'l';
} elseif ( ( $perms & 0x8000 ) === 0x8000 ) {
$type = 'File';
$flags[] = '-';
} elseif ( ( $perms & 0x6000 ) === 0x6000 ) {
$type = 'Block special file';
$flags[] = 'b';
} elseif ( ( $perms & 0x4000 ) === 0x4000 ) {
$type = 'Directory';
$flags[] = 'd';
} elseif ( ( $perms & 0x2000 ) === 0x2000 ) {
$type = 'Character special file';
$flags[] = 'c';
} elseif ( ( $perms & 0x1000 ) === 0x1000 ) {
$type = 'FIFO pipe file';
$flags[] = 'p';
} else {
$type = 'Unknown file';
$flags[] = 'u';
}
// owner
$flags[] = ( ( $perms & 0x0100 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0080 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0040 ) ? ( ( $perms & 0x0800 ) ? 's' : 'x' ) : ( ( $perms & 0x0800 ) ? 'S' : '-' ) );
// group
$flags[] = ( ( $perms & 0x0020 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0010 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0008 ) ? ( ( $perms & 0x0400 ) ? 's' : 'x' ) : ( ( $perms & 0x0400 ) ? 'S' : '-' ) );
// world
$flags[] = ( ( $perms & 0x0004 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0002 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0001 ) ? ( ( $perms & 0x0200 ) ? 't' : 'x' ) : ( ( $perms & 0x0200 ) ? 'T' : '-' ) );
$this->type = $type;
$this->size = sprintf( '%.2fK', $fileInfo->getSize() / 1024 );
$this->value = implode( $flags );
} catch ( Exception $e ) {
return false;
}
}
}

View File

@ -1,19 +0,0 @@
<?php
class Kint_Parsers_Json extends kintParser
{
protected function _parse( & $variable )
{
if ( !KINT_PHP53
|| !is_string( $variable )
|| !isset( $variable{0} ) || ( $variable{0} !== '{' && $variable{0} !== '[' )
|| ( $json = json_decode( $variable, true ) ) === null
) return false;
$val = (array) $json;
if ( empty( $val ) ) return false;
$this->value = kintParser::factory( $val )->extendedValue;
$this->type = 'JSON';
}
}

View File

@ -1,60 +0,0 @@
<?php
class Kint_Parsers_Microtime extends kintParser
{
private static $_times = array();
private static $_laps = array();
protected function _parse( & $variable )
{
if ( !is_string( $variable ) || !preg_match( '[0\.[0-9]{8} [0-9]{10}]', $variable ) ) {
return false;
}
list( $usec, $sec ) = explode( " ", $variable );
$time = (float) $usec + (float) $sec;
if ( KINT_PHP53 ) {
$size = memory_get_usage( true );
}
# '@' is used to prevent the dreaded timezone not set error
$this->value = @date( 'Y-m-d H:i:s', $sec ) . '.' . substr( $usec, 2, 4 );
$numberOfCalls = count( self::$_times );
if ( $numberOfCalls > 0 ) { # meh, faster than count($times) > 1
$lap = $time - end( self::$_times );
self::$_laps[] = $lap;
$this->value .= "\n<b>SINCE LAST CALL:</b> <b class=\"kint-microtime\">" . round( $lap, 4 ) . '</b>s.';
if ( $numberOfCalls > 1 ) {
$this->value .= "\n<b>SINCE START:</b> " . round( $time - self::$_times[0], 4 ) . 's.';
$this->value .= "\n<b>AVERAGE DURATION:</b> "
. round( array_sum( self::$_laps ) / $numberOfCalls, 4 ) . 's.';
}
}
$unit = array( 'B', 'KB', 'MB', 'GB', 'TB' );
if ( KINT_PHP53 ) {
$this->value .= "\n<b>MEMORY USAGE:</b> " . $size . " bytes ("
. round( $size / pow( 1024, ( $i = floor( log( $size, 1024 ) ) ) ), 3 ) . ' ' . $unit[ $i ] . ")";
}
self::$_times[] = $time;
$this->type = 'Stats';
}
/*
function test() {
d( 'start', microtime() );
for ( $i = 0; $i < 10; $i++ ) {
d(
$duration = mt_rand( 0, 200000 ), // the reported duration will be larger because of Kint overhead
usleep( $duration ),
microtime()
);
}
dd( );
}
*/
}

View File

@ -1,22 +0,0 @@
<?php
class Kint_Parsers_objectIterateable extends kintParser
{
protected function _parse( & $variable )
{
if ( !KINT_PHP53
|| !is_object( $variable )
|| !$variable instanceof Traversable
|| stripos( get_class( $variable ), 'zend' ) !== false // zf2 PDO wrapper does not play nice
) return false;
$arrayCopy = iterator_to_array( $variable, true );
if ( $arrayCopy === false ) return false;
$this->value = kintParser::factory( $arrayCopy )->extendedValue;
$this->type = 'Iterator contents';
$this->size = count( $arrayCopy );
}
}

View File

@ -1,24 +0,0 @@
<?php
class Kint_Parsers_SplObjectStorage extends kintParser
{
protected function _parse( & $variable )
{
if ( !is_object( $variable ) || !$variable instanceof SplObjectStorage ) return false;
/** @var $variable SplObjectStorage */
$count = $variable->count();
if ( $count === 0 ) return false;
$variable->rewind();
while ( $variable->valid() ) {
$current = $variable->current();
$this->value[] = kintParser::factory( $current );
$variable->next();
}
$this->type = 'Storage contents';
$this->size = $count;
}
}

View File

@ -1,29 +0,0 @@
<?php
class Kint_Parsers_Timestamp extends kintParser
{
private static function _fits( $variable )
{
if ( !is_string( $variable ) && !is_int( $variable ) ) return false;
$len = strlen( (int) $variable );
return
(
$len === 9 || $len === 10 # a little naive
|| ( $len === 13 && substr( $variable, -3 ) === '000' ) # also handles javascript micro timestamps
)
&& ( (string) (int) $variable == $variable );
}
protected function _parse( & $variable )
{
if ( !self::_fits( $variable ) ) return false;
$var = strlen( $variable ) === 13 ? substr( $variable, 0, -3 ) : $variable;
$this->type = 'timestamp';
# avoid dreaded "Timezone must be set" error
$this->value = @date( 'Y-m-d H:i:s', $var );
}
}

View File

@ -1,25 +0,0 @@
<?php
class Kint_Parsers_Xml extends kintParser
{
protected function _parse( & $variable )
{
try {
if ( is_string( $variable ) && substr( $variable, 0, 5 ) === '<?xml' ) {
$e = libxml_use_internal_errors( true );
$xml = simplexml_load_string( $variable );
libxml_use_internal_errors( $e );
if ( empty( $xml ) ) {
return false;
}
} else {
return false;
}
} catch ( Exception $e ) {
return false;
}
$this->value = kintParser::factory( $xml )->extendedValue;
$this->type = 'XML';
}
}

View File

@ -1,33 +0,0 @@
<?php
class Kint_Objects_Closure extends KintObject
{
public function parse( & $variable )
{
if ( !$variable instanceof Closure ) return false;
$this->name = 'Closure';
$reflection = new ReflectionFunction( $variable );
$ret = array(
'Parameters' => array()
);
if ( $val = $reflection->getParameters() ) {
foreach ( $val as $parameter ) {
// todo http://php.net/manual/en/class.reflectionparameter.php
$ret['Parameters'][] = $parameter->name;
}
}
if ( $val = $reflection->getStaticVariables() ) {
$ret['Uses'] = $val;
}
if ( method_exists($reflection, 'getClousureThis') && $val = $reflection->getClosureThis() ) {
$ret['Uses']['$this'] = $val;
}
if ( $val = $reflection->getFileName() ) {
$this->value = Kint::shortenPath( $val ) . ':' . $reflection->getStartLine();
}
return $ret;
}
}

View File

@ -1,35 +0,0 @@
<?php
class Kint_Objects_Smarty extends KintObject
{
public function parse( & $variable )
{
if ( !$variable instanceof Smarty
|| !defined( 'Smarty::SMARTY_VERSION' ) # lower than 3.x
) return false;
$this->name = 'object Smarty (v' . substr( Smarty::SMARTY_VERSION, 7 ) . ')'; # trim 'Smarty-'
$assigned = $globalAssigns = array();
foreach ( $variable->tpl_vars as $name => $var ) {
$assigned[ $name ] = $var->value;
}
foreach ( Smarty::$global_tpl_vars as $name => $var ) {
if ( $name === 'SCRIPT_NAME' ) continue;
$globalAssigns[ $name ] = $var->value;
}
return array(
'Assigned' => $assigned,
'Assigned globally' => $globalAssigns,
'Configuration' => array(
'Compiled files stored in' => isset($variable->compile_dir)
? $variable->compile_dir
: $variable->getCompileDir(),
)
);
}
}

View File

@ -1,70 +0,0 @@
<?php
class Kint_Objects_SplFileInfo extends KintObject
{
public function parse( & $variable )
{
if ( !KINT_PHP53 || !is_object( $variable ) || !$variable instanceof SplFileInfo ) return false;
$this->name = 'SplFileInfo';
$this->value = $variable->getBasename();
$flags = array();
$perms = $variable->getPerms();
if ( ( $perms & 0xC000 ) === 0xC000 ) {
$type = 'File socket';
$flags[] = 's';
} elseif ( ( $perms & 0xA000 ) === 0xA000 ) {
$type = 'File symlink';
$flags[] = 'l';
} elseif ( ( $perms & 0x8000 ) === 0x8000 ) {
$type = 'File';
$flags[] = '-';
} elseif ( ( $perms & 0x6000 ) === 0x6000 ) {
$type = 'Block special file';
$flags[] = 'b';
} elseif ( ( $perms & 0x4000 ) === 0x4000 ) {
$type = 'Directory';
$flags[] = 'd';
} elseif ( ( $perms & 0x2000 ) === 0x2000 ) {
$type = 'Character special file';
$flags[] = 'c';
} elseif ( ( $perms & 0x1000 ) === 0x1000 ) {
$type = 'FIFO pipe file';
$flags[] = 'p';
} else {
$type = 'Unknown file';
$flags[] = 'u';
}
// owner
$flags[] = ( ( $perms & 0x0100 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0080 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0040 ) ? ( ( $perms & 0x0800 ) ? 's' : 'x' ) : ( ( $perms & 0x0800 ) ? 'S' : '-' ) );
// group
$flags[] = ( ( $perms & 0x0020 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0010 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0008 ) ? ( ( $perms & 0x0400 ) ? 's' : 'x' ) : ( ( $perms & 0x0400 ) ? 'S' : '-' ) );
// world
$flags[] = ( ( $perms & 0x0004 ) ? 'r' : '-' );
$flags[] = ( ( $perms & 0x0002 ) ? 'w' : '-' );
$flags[] = ( ( $perms & 0x0001 ) ? ( ( $perms & 0x0200 ) ? 't' : 'x' ) : ( ( $perms & 0x0200 ) ? 'T' : '-' ) );
$size = sprintf( '%.2fK', $variable->getSize() / 1024 );
$flags = implode( $flags );
$path = $variable->getRealPath();
return array(
'File information' => array(
'Full path' => $path,
'Type' => $type,
'Size' => $size,
'Flags' => $flags
)
);
}
}

View File

@ -1,437 +0,0 @@
/**
java -jar compiler.jar --js $FileName$ --js_output_file compiled/kint.js --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})()"
*/
if ( typeof kintInitialized === 'undefined' ) {
kintInitialized = 1;
var kint = {
visiblePluses : [], // all visible toggle carets
currentPlus : -1, // currently selected caret
selectText : function( element ) {
var selection = window.getSelection(),
range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
},
each : function( selector, callback ) {
Array.prototype.slice.call(document.querySelectorAll(selector), 0).forEach(callback)
},
hasClass : function( target, className ) {
if ( !target.classList ) return false;
if ( typeof className === 'undefined' ) {
className = 'kint-show';
}
return target.classList.contains(className);
},
addClass : function( target, className ) {
if ( typeof className === 'undefined' ) {
className = 'kint-show';
}
target.classList.add(className);
},
removeClass : function( target, className ) {
if ( typeof className === 'undefined' ) {
className = 'kint-show';
}
target.classList.remove(className);
return target;
},
next : function( element ) {
do {
element = element.nextElementSibling;
} while ( element.nodeName.toLowerCase() !== 'dd' );
return element;
},
toggle : function( element, hide ) {
var parent = kint.next(element);
if ( typeof hide === 'undefined' ) {
hide = kint.hasClass(element);
}
if ( hide ) {
kint.removeClass(element);
} else {
kint.addClass(element);
}
if ( parent.childNodes.length === 1 ) {
parent = parent.childNodes[0].childNodes[0]; // reuse variable cause I can
// parent is checked in case of empty <pre> when array("\n") is dumped
if ( parent && kint.hasClass(parent, 'kint-parent') ) {
kint.toggle(parent, hide)
}
}
},
toggleChildren : function( element, hide ) {
var parent = kint.next(element)
, nodes = parent.getElementsByClassName('kint-parent')
, i = nodes.length;
if ( typeof hide === 'undefined' ) {
hide = kint.hasClass(element);
}
while ( i-- ) {
kint.toggle(nodes[i], hide);
}
kint.toggle(element, hide);
},
toggleAll : function( caret ) {
var elements = document.getElementsByClassName('kint-parent')
, i = elements.length
, visible = kint.hasClass(caret.parentNode);
while ( i-- ) {
kint.toggle(elements[i], visible);
}
},
switchTab : function( target ) {
var lis, el = target, index = 0;
target.parentNode.getElementsByClassName('kint-active-tab')[0].className = '';
target.className = 'kint-active-tab';
// take the index of clicked title tab and make the same n-th content tab visible
while ( el = el.previousSibling ) el.nodeType === 1 && index++;
lis = target.parentNode.nextSibling.childNodes;
for ( var i = 0; i < lis.length; i++ ) {
if ( i === index ) {
lis[i].style.display = 'block';
if ( lis[i].childNodes.length === 1 ) {
el = lis[i].childNodes[0].childNodes[0];
if ( kint.hasClass(el, 'kint-parent') ) {
kint.toggle(el, false)
}
}
} else {
lis[i].style.display = 'none';
}
}
},
isSibling : function( el ) {
for ( ; ; ) {
el = el.parentNode;
if ( !el || kint.hasClass(el, 'kint') ) break;
}
return !!el;
},
fetchVisiblePluses : function() {
kint.visiblePluses = [];
kint.each('.kint nav, .kint-tabs>li:not(.kint-active-tab)', function( el ) {
if ( el.offsetWidth !== 0 || el.offsetHeight !== 0 ) {
kint.visiblePluses.push(el)
}
});
},
openInNewWindow : function( kintContainer ) {
var newWindow;
if ( newWindow = window.open() ) {
newWindow.document.open();
newWindow.document.write(
'<html>'
+ '<head>'
+ '<title>Kint (' + new Date().toISOString() + ')</title>'
+ '<meta charset="utf-8">'
+ document.getElementsByClassName('-kint-js')[0].outerHTML
+ document.getElementsByClassName('-kint-css')[0].outerHTML
+ '</head>'
+ '<body>'
+ '<input style="width: 100%" placeholder="Take some notes!">'
+ '<div class="kint">'
+ kintContainer.parentNode.outerHTML
+ '</div></body>'
);
newWindow.document.close();
}
},
sortTable : function( table, column ) {
var tbody = table.tBodies[0];
var format = function( s ) {
var n = column === 1 ? s.replace(/^#/, '') : s;
if ( isNaN(n) ) {
return s.trim().toLocaleLowerCase();
} else {
n = parseFloat(n);
return isNaN(n) ? s.trim() : n;
}
};
[].slice.call(table.tBodies[0].rows)
.sort(function( a, b ) {
a = format(a.cells[column].textContent);
b = format(b.cells[column].textContent);
if ( a < b ) return -1;
if ( a > b ) return 1;
return 0;
})
.forEach(function( el ) {
tbody.appendChild(el);
});
},
keyCallBacks : {
cleanup : function( i ) {
var focusedClass = 'kint-focused';
var prevElement = document.querySelector('.' + focusedClass);
prevElement && kint.removeClass(prevElement, focusedClass);
if ( i !== -1 ) {
var el = kint.visiblePluses[i];
kint.addClass(el, focusedClass);
var offsetTop = function( el ) {
return el.offsetTop + ( el.offsetParent ? offsetTop(el.offsetParent) : 0 );
};
var top = offsetTop(el) - (window.innerHeight / 2 );
window.scrollTo(0, top);
}
kint.currentPlus = i;
},
moveCursor : function( up, i ) {
// todo make the first VISIBLE plus active
if ( up ) {
if ( --i < 0 ) {
i = kint.visiblePluses.length - 1;
}
} else {
if ( ++i >= kint.visiblePluses.length ) {
i = 0;
}
}
kint.keyCallBacks.cleanup(i);
return false;
}
}
};
window.addEventListener("click", function( e ) {
var target = e.target
, nodeName = target.nodeName.toLowerCase();
if ( !kint.isSibling(target) ) return;
// auto-select name of variable
if ( nodeName === 'dfn' ) {
kint.selectText(target);
target = target.parentNode;
} else if ( nodeName === 'var' ) { // stupid workaround for misc elements
target = target.parentNode; // to not stop event from further propagating
nodeName = target.nodeName.toLowerCase()
} else if ( nodeName === 'th' ) {
if ( !e.ctrlKey ) {
kint.sortTable(target.parentNode.parentNode.parentNode, target.cellIndex)
}
return false;
}
// switch tabs
if ( nodeName === 'li' && target.parentNode.className === 'kint-tabs' ) {
if ( target.className !== 'kint-active-tab' ) {
kint.switchTab(target);
if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
}
return false;
}
// handle clicks on the navigation caret
if ( nodeName === 'nav' ) {
// special case for nav in footer
if ( target.parentNode.nodeName.toLowerCase() === 'footer' ) {
target = target.parentNode;
if ( kint.hasClass(target) ) {
kint.removeClass(target)
} else {
kint.addClass(target)
}
} else {
// ensure doubleclick has different behaviour, see below
setTimeout(function() {
var timer = parseInt(target.kintTimer, 10);
if ( timer > 0 ) {
target.kintTimer--;
} else {
kint.toggleChildren(target.parentNode); // <dt>
if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
}
}, 300);
}
e.stopPropagation();
return false;
} else if ( kint.hasClass(target, 'kint-parent') ) {
kint.toggle(target);
if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
return false;
} else if ( kint.hasClass(target, 'kint-ide-link') ) {
e.preventDefault();
var ajax = new XMLHttpRequest(); // add ajax call to contact editor but prevent link default action
ajax.open('GET', target.href);
ajax.send(null);
return false;
} else if ( kint.hasClass(target, 'kint-popup-trigger') ) {
var kintContainer = target.parentNode;
if ( kintContainer.nodeName.toLowerCase() === 'footer' ) {
kintContainer = kintContainer.previousSibling;
} else {
while ( kintContainer && !kint.hasClass(kintContainer, 'kint-parent') ) {
kintContainer = kintContainer.parentNode;
}
}
kint.openInNewWindow(kintContainer);
} else if ( nodeName === 'pre' && e.detail === 3 ) { // triple click pre to select it all
kint.selectText(target);
}
}, false);
window.addEventListener("dblclick", function( e ) {
var target = e.target;
if ( !kint.isSibling(target) ) return;
if ( target.nodeName.toLowerCase() === 'nav' ) {
target.kintTimer = 2;
kint.toggleAll(target);
if ( kint.currentPlus !== -1 ) kint.fetchVisiblePluses();
e.stopPropagation();
}
}, false);
// keyboard navigation
window.onkeydown = function( e ) { // direct assignment is used to have priority over ex FAYT
// do nothing if alt/ctrl key is pressed or if we're actually typing somewhere
if ( e.target !== document.body || e.altKey || e.ctrlKey ) return;
var keyCode = e.keyCode
, shiftKey = e.shiftKey
, i = kint.currentPlus;
if ( keyCode === 68 ) { // 'd' : toggles navigation on/off
if ( i === -1 ) {
kint.fetchVisiblePluses();
return kint.keyCallBacks.moveCursor(false, i);
} else {
kint.keyCallBacks.cleanup(-1);
return false;
}
} else {
if ( i === -1 ) return;
if ( keyCode === 9 ) { // TAB : moves up/down depending on shift key
return kint.keyCallBacks.moveCursor(shiftKey, i);
} else if ( keyCode === 38 ) { // ARROW UP : moves up
return kint.keyCallBacks.moveCursor(true, i);
} else if ( keyCode === 40 ) { // ARROW DOWN : down
return kint.keyCallBacks.moveCursor(false, i);
}
}
var kintNode = kint.visiblePluses[i];
if ( kintNode.nodeName.toLowerCase() === 'li' ) { // we're on a trace tab
if ( keyCode === 32 || keyCode === 13 ) { // SPACE/ENTER
kint.switchTab(kintNode);
kint.fetchVisiblePluses();
return kint.keyCallBacks.moveCursor(true, i);
} else if ( keyCode === 39 ) { // arrows
return kint.keyCallBacks.moveCursor(false, i);
} else if ( keyCode === 37 ) {
return kint.keyCallBacks.moveCursor(true, i);
}
}
kintNode = kintNode.parentNode; // simple dump
if ( keyCode === 32 || keyCode === 13 ) { // SPACE/ENTER : toggles
kint.toggle(kintNode);
kint.fetchVisiblePluses();
return false;
} else if ( keyCode === 39 || keyCode === 37 ) { // ARROW LEFT/RIGHT : respectively hides/shows and traverses
var visible = kint.hasClass(kintNode);
var hide = keyCode === 37;
if ( visible ) {
kint.toggleChildren(kintNode, hide); // expand/collapse all children if immediate ones are showing
} else {
if ( hide ) { // LEFT
// traverse to parent and THEN hide
do {kintNode = kintNode.parentNode} while ( kintNode && kintNode.nodeName.toLowerCase() !== 'dd' );
if ( kintNode ) {
kintNode = kintNode.previousElementSibling;
i = -1;
var parentPlus = kintNode.querySelector('nav');
while ( parentPlus !== kint.visiblePluses[++i] ) {}
kint.keyCallBacks.cleanup(i)
} else { // we are at root
kintNode = kint.visiblePluses[i].parentNode;
}
}
kint.toggle(kintNode, hide);
}
kint.fetchVisiblePluses();
return false;
}
};
window.addEventListener("load", function( e ) { // colorize microtime results relative to others
var elements = Array.prototype.slice.call(document.querySelectorAll('.kint-microtime'), 0);
elements.forEach(function( el ) {
var value = parseFloat(el.innerHTML)
, min = Infinity
, max = -Infinity
, ratio;
elements.forEach(function( el ) {
var val = parseFloat(el.innerHTML);
if ( min > val ) min = val;
if ( max < val ) max = val;
});
ratio = 1 - (value - min) / (max - min);
el.style.background = 'hsl(' + Math.round(ratio * 120) + ',60%,70%)';
});
});
}
// debug purposes only, removed in minified source
function clg( i ) {
if ( !window.console )return;
var l = arguments.length, o = 0;
while ( o < l )console.log(arguments[o++])
}

View File

@ -1,413 +0,0 @@
//
// VARIABLES FOR THEMES TO OVERRIDE
// --------------------------------------------------
@spacing : 4;
// caret taken from solarized
@caret-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAA8CAMAAACO5hB7AAAA7VBMVEVYbnWToaH///9YbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnWToaGToaGToaGToaGToaGToaGToaGToaGToaFYbnWToaFYbnVYbnWToaGToaFYbnWToaFYbnWToaFYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnWToaGToaGToaGToaGToaGToaGToaGToaGToaGToaGToaGToaGToaGToaFYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnVYbnWToaGToaGToaGToaGToaGToaGToaGToaGToaFYbnWToaEeRtj1AAAATXRSTlMAAACLab0B7iP2R7CL9iPuaUewAb36F0/QnPoX0JxPYQaurepi6QV8FhV7MzFhM6586RYFMa3qYnsVBpNQ+ZGOGJ3PkM9QkZAY+Y6TnV7gnYsAAAEcSURBVHhebdHVbgMxEEBRu8sUZmqapBBoSuGUmWb+/3NayxtrLOe+Hck745XZgd6/eb3CVcKt7HmR+gKxlCGOETG5vFbOoahR6NxI5zHt6nuq+2dqnqfzzH3mfcz70vb8H6MJt5u6a96hS30E4PjEFgAEp2fKNojKUfVEOoS044ex7u3YPE/nmfvM+5j3pe17T9oe/77O41w+n4vnrbrwZxbTshVhvtx5Kb8vliRLRWmeSQSTjJq/El5x5fUXYmNN9hcQC5y4g/hGvVksNtT8451rns2IScb7mn567ll2GNpWr9YWfvQgzWsKs8HOA/m960g6rjTzA8HAV/NHwiOmPLwDKA/J/gggYsRVgFvqbr/fpWYv90zzZKKs9Qfx00Jx65oxLAAAAABJRU5ErkJggg==");
//
// SET UP HELPER VARIABLES
// --------------------------------------------------
@border: 1px solid @border-color;
.selection() {
background : @border-color-hover;
color : @text-color;
}
//
// BASE STYLES
// --------------------------------------------------
.kint::selection { .selection() }
.kint::-moz-selection { .selection() }
.kint::-webkit-selection { .selection() }
.kint,
.kint::before,
.kint::after,
.kint *,
.kint *::before,
.kint *::after {
box-sizing : border-box;
border-radius : 0;
color : @text-color;
float : none !important;
font-family : Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
line-height : 15px;
margin : 0;
padding : 0;
text-align : left;
}
.kint {
font-size : 13px;
margin : @spacing * 2px 0;
overflow-x : auto;
white-space : nowrap;
dt {
background : @main-background;
border : @border;
color : @text-color;
display : block;
font-weight : bold;
list-style : none outside none;
overflow : auto;
padding : @spacing * 1px;
&:hover {
border-color : @border-color-hover;
}
> var {
margin-right : 5px;
}
}
> dl dl {
padding : 0 0 0 @spacing * 3px;
}
//
// DROPDOWN CARET
// --------------------------------------------------
nav {
background : @caret-image no-repeat scroll 0 0 transparent;
cursor : pointer;
display : inline-block;
height : 15px;
width : 15px;
margin-right : 3px;
vertical-align : middle;
}
dt.kint-parent:hover nav {
background-position : 0 -15px;
}
dt.kint-parent.kint-show:hover > nav {
background-position : 0 -45px;
}
dt.kint-show > nav {
background-position : 0 -30px;
}
dt.kint-parent + dd {
display : none;
border-left : 1px dashed @border-color;
}
dt.kint-parent.kint-show + dd {
display : block;
}
//
// INDIVIDUAL ITEMS
// --------------------------------------------------
var,
var a {
color : @variable-type-color;
font-style : normal;
}
dt:hover var,
dt:hover var a {
color : @variable-type-color-hover;
}
dfn {
font-style : normal;
font-family : monospace;
color : @variable-name-color;
}
pre {
color : @text-color;
margin : 0 0 0 @spacing * 3px;
padding : 5px;
overflow-y : hidden;
border-top : 0;
border : @border;
background : @main-background;
display : block;
word-break : normal;
}
.kint-popup-trigger {
float : right !important;
cursor : pointer;
color : @border-color-hover;
&:hover {
color : @border-color;
}
}
dt.kint-parent > .kint-popup-trigger {
font-size : 13px;
}
footer {
padding : 0 3px 3px;
font-size : 9px;
> .kint-popup-trigger {
font-size : 12px;
}
nav {
background-size : 10px;
height : 10px;
width : 10px;
&:hover {
background-position : 0 -10px;
}
}
> ol {
display : none;
margin-left : 32px;
}
&.kint-show {
> ol {
display : block;
}
nav {
background-position : 0 -20px;
&:hover {
background-position : 0 -30px;
}
}
}
}
a {
color : @text-color;
text-shadow : none;
&:hover {
color : @variable-name-color;
border-bottom : 1px dotted @variable-name-color;
}
}
//
// TABS
// --------------------------------------------------
ul {
list-style : none;
padding-left : @spacing * 3px;
&:not(.kint-tabs) {
li {
border-left : 1px dashed @border-color;
> dl {
border-left : none;
}
}
}
&.kint-tabs {
margin : 0 0 0 @spacing * 3px;
padding-left : 0;
background : @main-background;
border : @border;
border-top : 0;
li {
background : @secondary-background;
border : @border;
cursor : pointer;
display : inline-block;
height : @spacing * 6px;
margin : round(@spacing / 2) * 1px;
padding : 0 2px + round(@spacing * 2.5px);
vertical-align : top;
&:hover,
&.kint-active-tab:hover {
border-color : @border-color-hover;
color : @variable-type-color-hover;
}
&.kint-active-tab {
background : @main-background;
border-top : 0;
margin-top : -1px;
height : 27px;
line-height : 24px;
}
&:not(.kint-active-tab) {
line-height : @spacing * 5px;
}
}
li + li {
margin-left : 0
}
}
&:not(.kint-tabs) > li:not(:first-child) {
display : none;
}
}
dt:hover + dd > ul > li.kint-active-tab {
border-color : @border-color-hover;
color : @variable-type-color-hover;
}
}
//
// REPORT
// --------------------------------------------------
.kint-report {
border-collapse : collapse;
empty-cells : show;
border-spacing : 0;
* {
font-size : 12px;
}
dt {
background : none;
padding : (@spacing/2) * 1px;
.kint-parent {
min-width : 100%;
overflow : hidden;
text-overflow : ellipsis;
white-space : nowrap;
}
}
td,
th {
border : @border;
padding : (@spacing/2) * 1px;
vertical-align : center;
}
th {
cursor : alias;
}
td:first-child,
th {
font-weight : bold;
background : @secondary-background;
color : @variable-name-color;
}
td {
background : @main-background;
white-space : pre;
> dl {
padding : 0;
}
}
pre {
border-top : 0;
border-right : 0;
}
th:first-child {
background : none;
border : 0;
}
td.kint-empty {
background : #d33682 !important;
}
tr:hover {
> td {
box-shadow : 0 0 1px 0 @border-color-hover inset;
}
var {
color : @variable-type-color-hover;
}
}
ul.kint-tabs li.kint-active-tab {
height : 20px;
line-height : 17px;
}
}
//
// TRACE
// --------------------------------------------------
.kint-trace {
.kint-source {
line-height : round(@spacing * 3.5) * 1px;
span {
padding-right : 1px;
border-right : 3px inset @variable-type-color;
}
.kint-highlight {
background : @secondary-background;
}
}
.kint-parent {
> b {
min-width : 18px;
display : inline-block;
text-align : right;
color : @variable-name-color;
}
> var {
> a {
color : @variable-type-color;
}
}
}
}
//
// MISC
// --------------------------------------------------
// keyboard navigation caret
.kint-focused {
.keyboard-caret
}
.kint-microtime,
.kint-color-preview {
box-shadow : 0 0 2px 0 #b6cedb;
height : 16px;
text-align : center;
text-shadow : -1px 0 #839496, 0 1px #839496, 1px 0 #839496, 0 -1px #839496;
width : 230px;
color : #fdf6e3;
}
// mini trace
.kint footer li {
color : #ddd;
}

View File

@ -1,397 +0,0 @@
/**
* @author Ante Aljinovic https://github.com/aljinovic
*/
.kint::selection {
background: #aaaaaa;
color: #1d1e1e;
}
.kint::-moz-selection {
background: #aaaaaa;
color: #1d1e1e;
}
.kint::-webkit-selection {
background: #aaaaaa;
color: #1d1e1e;
}
.kint,
.kint::before,
.kint::after,
.kint *,
.kint *::before,
.kint *::after {
box-sizing: border-box;
border-radius: 0;
color: #1d1e1e;
float: none !important;
font-family: Consolas, Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace, serif;
line-height: 15px;
margin: 0;
padding: 0;
text-align: left;
}
.kint {
font-size: 13px;
margin: 8px 0;
overflow-x: auto;
white-space: nowrap;
}
.kint dt {
background: #f8f8f8;
border: 1px solid #d7d7d7;
color: #1d1e1e;
display: block;
font-weight: bold;
list-style: none outside none;
overflow: auto;
padding: 4px;
}
.kint dt:hover {
border-color: #aaaaaa;
}
.kint dt > var {
margin-right: 5px;
}
.kint > dl dl {
padding: 0 0 0 12px;
}
.kint nav {
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAA8CAYAAAC5OOBJAAAAvklEQVR42mNgGMFAS0uLLSQk5HxoaOh/XDg4OLgdpwEBAQEGQAN+YtMIFH/i4ODAg9cFQNMbsWkOCgrKJMv5ID5Qipko/6M7PzAw0ImkAIQ5H0hvISv0gZpP+fn5qZAVfcBAkmEYBaNZcjRLjmbJUUCvqAIlDlAiASUWkjWDkiU0eTaSpBGUEZBy1E9QRiFWLzO2LEmU80GZHkcRhN/5oGIGVNzgKIbwOx9UwOErAIl2/igYzZKjWXI0S9IHAAASJijo0Ypj8AAAAABJRU5ErkJggg==") no-repeat scroll 0 0 transparent;
cursor: pointer;
display: inline-block;
height: 15px;
width: 15px;
margin-right: 3px;
vertical-align: middle;
}
.kint dt.kint-parent:hover nav {
background-position: 0 -15px;
}
.kint dt.kint-parent.kint-show:hover > nav {
background-position: 0 -45px;
}
.kint dt.kint-show > nav {
background-position: 0 -30px;
}
.kint dt.kint-parent + dd {
display: none;
border-left: 1px dashed #d7d7d7;
}
.kint dt.kint-parent.kint-show + dd {
display: block;
}
.kint var,
.kint var a {
color: #0066ff;
font-style: normal;
}
.kint dt:hover var,
.kint dt:hover var a {
color: #ff0000;
}
.kint dfn {
font-style: normal;
font-family: monospace;
color: #1d1e1e;
}
.kint pre {
color: #1d1e1e;
margin: 0 0 0 12px;
padding: 5px;
overflow-y: hidden;
border-top: 0;
border: 1px solid #d7d7d7;
background: #f8f8f8;
display: block;
word-break: normal;
}
.kint .kint-popup-trigger {
float: right !important;
cursor: pointer;
color: #aaaaaa;
}
.kint .kint-popup-trigger:hover {
color: #d7d7d7;
}
.kint dt.kint-parent > .kint-popup-trigger {
font-size: 13px;
}
.kint footer {
padding: 0 3px 3px;
font-size: 9px;
}
.kint footer > .kint-popup-trigger {
font-size: 12px;
}
.kint footer nav {
background-size: 10px;
height: 10px;
width: 10px;
}
.kint footer nav:hover {
background-position: 0 -10px;
}
.kint footer > ol {
display: none;
margin-left: 32px;
}
.kint footer.kint-show > ol {
display: block;
}
.kint footer.kint-show nav {
background-position: 0 -20px;
}
.kint footer.kint-show nav:hover {
background-position: 0 -30px;
}
.kint a {
color: #1d1e1e;
text-shadow: none;
}
.kint a:hover {
color: #1d1e1e;
border-bottom: 1px dotted #1d1e1e;
}
.kint ul {
list-style: none;
padding-left: 12px;
}
.kint ul:not(.kint-tabs) li {
border-left: 1px dashed #d7d7d7;
}
.kint ul:not(.kint-tabs) li > dl {
border-left: none;
}
.kint ul.kint-tabs {
margin: 0 0 0 12px;
padding-left: 0;
background: #f8f8f8;
border: 1px solid #d7d7d7;
border-top: 0;
}
.kint ul.kint-tabs li {
background: #f8f8f8;
border: 1px solid #d7d7d7;
cursor: pointer;
display: inline-block;
height: 24px;
margin: 2px;
padding: 0 12px;
vertical-align: top;
}
.kint ul.kint-tabs li:hover,
.kint ul.kint-tabs li.kint-active-tab:hover {
border-color: #aaaaaa;
color: #ff0000;
}
.kint ul.kint-tabs li.kint-active-tab {
background: #f8f8f8;
border-top: 0;
margin-top: -1px;
height: 27px;
line-height: 24px;
}
.kint ul.kint-tabs li:not(.kint-active-tab) {
line-height: 20px;
}
.kint ul.kint-tabs li + li {
margin-left: 0;
}
.kint ul:not(.kint-tabs) > li:not(:first-child) {
display: none;
}
.kint dt:hover + dd > ul > li.kint-active-tab {
border-color: #aaaaaa;
color: #ff0000;
}
.kint-report {
border-collapse: collapse;
empty-cells: show;
border-spacing: 0;
}
.kint-report * {
font-size: 12px;
}
.kint-report dt {
background: none;
padding: 2px;
}
.kint-report dt .kint-parent {
min-width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.kint-report td,
.kint-report th {
border: 1px solid #d7d7d7;
padding: 2px;
vertical-align: center;
}
.kint-report th {
cursor: alias;
}
.kint-report td:first-child,
.kint-report th {
font-weight: bold;
background: #f8f8f8;
color: #1d1e1e;
}
.kint-report td {
background: #f8f8f8;
white-space: pre;
}
.kint-report td > dl {
padding: 0;
}
.kint-report pre {
border-top: 0;
border-right: 0;
}
.kint-report th:first-child {
background: none;
border: 0;
}
.kint-report td.kint-empty {
background: #d33682 !important;
}
.kint-report tr:hover > td {
box-shadow: 0 0 1px 0 #aaaaaa inset;
}
.kint-report tr:hover var {
color: #ff0000;
}
.kint-report ul.kint-tabs li.kint-active-tab {
height: 20px;
line-height: 17px;
}
.kint-trace .kint-source {
line-height: 14px;
}
.kint-trace .kint-source span {
padding-right: 1px;
border-right: 3px inset #0066ff;
}
.kint-trace .kint-source .kint-highlight {
background: #f8f8f8;
}
.kint-trace .kint-parent > b {
min-width: 18px;
display: inline-block;
text-align: right;
color: #1d1e1e;
}
.kint-trace .kint-parent > var > a {
color: #0066ff;
}
.kint-focused {
box-shadow: 0 0 3px 2px #ff0000;
}
.kint-microtime,
.kint-color-preview {
box-shadow: 0 0 2px 0 #b6cedb;
height: 16px;
text-align: center;
text-shadow: -1px 0 #839496, 0 1px #839496, 1px 0 #839496, 0 -1px #839496;
width: 230px;
color: #fdf6e3;
}
.kint footer li {
color: #ddd;
}
.kint dt {
font-weight: normal;
}
.kint dt.kint-parent {
margin-top: 4px;
}
.kint > dl {
background: linear-gradient(90deg, rgba(255, 255, 255, 0) 0, #ffffff 15px);
}
.kint dl dl {
margin-top: 4px;
padding-left: 25px;
border-left: none;
}
.kint > dl > dt {
background: #f8f8f8;
}
.kint ul {
margin: 0;
padding-left: 0;
}
.kint ul:not(.kint-tabs) > li {
border-left: 0;
}
.kint ul.kint-tabs {
background: #f8f8f8;
border: 1px solid #d7d7d7;
border-width: 0 1px 1px 1px;
padding: 4px 0 0 12px;
margin-left: -1px;
margin-top: -1px;
}
.kint ul.kint-tabs li,
.kint ul.kint-tabs li + li {
margin: 0 0 0 4px;
}
.kint ul.kint-tabs li {
border-bottom-width: 0;
height: 25px;
}
.kint ul.kint-tabs li:first-child {
margin-left: 0;
}
.kint ul.kint-tabs li.kint-active-tab {
border-top: 1px solid #d7d7d7;
background: #fff;
font-weight: bold;
padding-top: 0;
border-bottom: 1px solid #fff !important;
margin-bottom: -1px;
}
.kint ul.kint-tabs li.kint-active-tab:hover {
border-bottom: 1px solid #fff;
}
.kint ul > li > pre {
border: 1px solid #d7d7d7;
}
.kint dt:hover + dd > ul {
border-color: #aaaaaa;
}
.kint pre {
background: #fff;
margin-top: 4px;
margin-left: 25px;
}
.kint .kint-popup-trigger:hover {
color: #ff0000;
}
.kint .kint-source .kint-highlight {
background: #cfc;
}
.kint-report td {
background: #fff;
}
.kint-report td > dl {
padding: 0;
margin: 0;
}
.kint-report td > dl > dt.kint-parent {
margin: 0;
}
.kint-report td:first-child,
.kint-report td,
.kint-report th {
padding: 2px 4px;
}
.kint-report td.kint-empty {
background: #d7d7d7 !important;
}
.kint-report dd,
.kint-report dt {
background: #fff;
}
.kint-report tr:hover > td {
box-shadow: none;
background: #cfc;
}

View File

@ -1,10 +0,0 @@
(function(){if("undefined"===typeof kintInitialized){kintInitialized=1;var e=[],f=-1,g=function(a){var b=window.getSelection(),c=document.createRange();c.selectNodeContents(a);b.removeAllRanges();b.addRange(c)},h=function(a){Array.prototype.slice.call(document.querySelectorAll(".kint nav, .kint-tabs>li:not(.kint-active-tab)"),0).forEach(a)},k=function(a,b){if(!a.classList)return!1;"undefined"===typeof b&&(b="kint-show");return a.classList.contains(b)},l=function(a,b){"undefined"===typeof b&&(b="kint-show");a.classList.add(b)},
m=function(a,b){"undefined"===typeof b&&(b="kint-show");a.classList.remove(b)},n=function(a){do a=a.nextElementSibling;while("dd"!==a.nodeName.toLowerCase());return a},q=function(a,b){var c=n(a);"undefined"===typeof b&&(b=k(a));b?m(a):l(a);1===c.childNodes.length&&(c=c.childNodes[0].childNodes[0])&&k(c,"kint-parent")&&q(c,b)},r=function(a,b){var c=n(a).getElementsByClassName("kint-parent"),d=c.length;for("undefined"===typeof b&&(b=k(a));d--;)q(c[d],b);q(a,b)},t=function(a){var b=a,c=0;a.parentNode.getElementsByClassName("kint-active-tab")[0].className=
"";for(a.className="kint-active-tab";b=b.previousSibling;)1===b.nodeType&&c++;a=a.parentNode.nextSibling.childNodes;for(var d=0;d<a.length;d++)d===c?(a[d].style.display="block",1===a[d].childNodes.length&&(b=a[d].childNodes[0].childNodes[0],k(b,"kint-parent")&&q(b,!1))):a[d].style.display="none"},u=function(a){for(;a=a.parentNode,a&&!k(a,"kint"););return!!a},v=function(){e=[];h(function(a){0===a.offsetWidth&&0===a.offsetHeight||e.push(a)})},w=function(a){var b;if(b=window.open())b.document.open(),
b.document.write("<html><head><title>Kint ("+(new Date).toISOString()+')</title><meta charset="utf-8">'+document.getElementsByClassName("-kint-js")[0].outerHTML+document.getElementsByClassName("-kint-css")[0].outerHTML+'</head><body><input style="width: 100%" placeholder="Take some notes!"><div class="kint">'+a.parentNode.outerHTML+"</div></body>"),b.document.close()},x=function(a,b){function c(a){var c=1===b?a.replace(/^#/,""):a;if(isNaN(c))return a.trim().toLocaleLowerCase();c=parseFloat(c);return isNaN(c)?
a.trim():c}var d=a.tBodies[0];[].slice.call(a.tBodies[0].rows).sort(function(a,d){a=c(a.cells[b].textContent);d=c(d.cells[b].textContent);return a<d?-1:a>d?1:0}).forEach(function(a){d.appendChild(a)})},y=function(a){var b=document.querySelector(".kint-focused");b&&m(b,"kint-focused");if(-1!==a){b=e[a];l(b,"kint-focused");var c=function(a){return a.offsetTop+(a.offsetParent?c(a.offsetParent):0)};window.scrollTo(0,c(b)-window.innerHeight/2)}f=a},z=function(a,b){a?0>--b&&(b=e.length-1):++b>=e.length&&
(b=0);y(b);return!1};window.addEventListener("click",function(a){var b=a.target,c=b.nodeName.toLowerCase();if(u(b)){if("dfn"===c)g(b),b=b.parentNode;else if("var"===c)b=b.parentNode,c=b.nodeName.toLowerCase();else if("th"===c)return a.ctrlKey||x(b.parentNode.parentNode.parentNode,b.cellIndex),!1;if("li"===c&&"kint-tabs"===b.parentNode.className)return"kint-active-tab"!==b.className&&(t(b),-1!==f&&v()),!1;if("nav"===c)return"footer"===b.parentNode.nodeName.toLowerCase()?(b=b.parentNode,k(b)?m(b):l(b)):
setTimeout(function(){0<parseInt(b.a,10)?b.a--:(r(b.parentNode),-1!==f&&v())},300),a.stopPropagation(),!1;if(k(b,"kint-parent"))return q(b),-1!==f&&v(),!1;if(k(b,"kint-ide-link"))return a.preventDefault(),a=new XMLHttpRequest,a.open("GET",b.href),a.send(null),!1;if(k(b,"kint-popup-trigger")){a=b.parentNode;if("footer"===a.nodeName.toLowerCase())a=a.previousSibling;else for(;a&&!k(a,"kint-parent");)a=a.parentNode;w(a)}else"pre"===c&&3===a.detail&&g(b)}},!1);window.addEventListener("dblclick",function(a){var b=
a.target;if(u(b)&&"nav"===b.nodeName.toLowerCase()){b.a=2;for(var c=document.getElementsByClassName("kint-parent"),d=c.length,b=k(b.parentNode);d--;)q(c[d],b);-1!==f&&v();a.stopPropagation()}},!1);window.onkeydown=function(a){if(a.target===document.body&&!a.altKey&&!a.ctrlKey){var b=a.keyCode,c=a.shiftKey;a=f;if(68===b){if(-1===a)return v(),z(!1,a);y(-1);return!1}if(-1!==a){if(9===b)return z(c,a);if(38===b)return z(!0,a);if(40===b)return z(!1,a);c=e[a];if("li"===c.nodeName.toLowerCase()){if(32===
b||13===b)return t(c),v(),z(!0,a);if(39===b)return z(!1,a);if(37===b)return z(!0,a)}c=c.parentNode;if(32===b||13===b)return q(c),v(),!1;if(39===b||37===b){var d=k(c),b=37===b;if(d)r(c,b);else{if(b){do c=c.parentNode;while(c&&"dd"!==c.nodeName.toLowerCase());if(c){c=c.previousElementSibling;a=-1;for(d=c.querySelector("nav");d!==e[++a];);y(a)}else c=e[a].parentNode}q(c,b)}v();return!1}}}};window.addEventListener("load",function(){var a=Array.prototype.slice.call(document.querySelectorAll(".kint-microtime"),
0);a.forEach(function(b){var c=parseFloat(b.innerHTML),d=Infinity,p=-Infinity;a.forEach(function(a){a=parseFloat(a.innerHTML);d>a&&(d=a);p<a&&(p=a)});b.style.background="hsl("+Math.round(120*(1-(c-d)/(p-d)))+",60%,70%)"})})};})()

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,154 +0,0 @@
/**
* @author Ante Aljinovic https://github.com/aljinovic
*/
@import "../base";
@main-background: #f8f8f8;
@secondary-background : #f8f8f8;
@text-color: #1d1e1e;
@variable-name-color: #1d1e1e;
@variable-type-color: #06f;
@variable-type-color-hover: #f00;
@border-color: #d7d7d7;
@border-color-hover: #aaa;
@caret-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAA8CAYAAAC5OOBJAAAAvklEQVR42mNgGMFAS0uLLSQk5HxoaOh/XDg4OLgdpwEBAQEGQAN+YtMIFH/i4ODAg9cFQNMbsWkOCgrKJMv5ID5Qipko/6M7PzAw0ImkAIQ5H0hvISv0gZpP+fn5qZAVfcBAkmEYBaNZcjRLjmbJUUCvqAIlDlAiASUWkjWDkiU0eTaSpBGUEZBy1E9QRiFWLzO2LEmU80GZHkcRhN/5oGIGVNzgKIbwOx9UwOErAIl2/igYzZKjWXI0S9IHAAASJijo0Ypj8AAAAABJRU5ErkJggg==");
.keyboard-caret() {
box-shadow : 0 0 3px 2px @variable-type-color-hover;
}
.kint {
dt {
font-weight : normal;
&.kint-parent {
margin-top : 4px;
}
}
> dl {
background : linear-gradient(90deg, rgba(255,255,255,0) 0, #fff 15px);
}
dl dl {
margin-top : 4px;
padding-left : 25px;
border-left : none;
}
> dl > dt {
background : @secondary-background;
}
//
// TABS
// --------------------------------------------------
ul {
margin : 0;
padding-left : 0;
&:not(.kint-tabs) > li {
border-left : 0;
}
&.kint-tabs {
background : @secondary-background;
border : @border;
border-width : 0 1px 1px 1px;
padding : 4px 0 0 12px;
margin-left : -1px;
margin-top : -1px;
li,
li + li {
margin : 0 0 0 4px;
}
li {
border-bottom-width : 0;
height : @spacing * 6px + 1px;
&:first-child {
margin-left : 0;
}
&.kint-active-tab {
border-top : @border;
background : #fff;
font-weight : bold;
padding-top : 0;
border-bottom : 1px solid #fff !important;
margin-bottom : -1px;
}
&.kint-active-tab:hover {
border-bottom : 1px solid #fff;
}
}
}
> li > pre {
border : @border;
}
}
dt:hover + dd > ul {
border-color : @border-color-hover;
}
pre {
background : #fff;
margin-top : 4px;
margin-left : 25px;
}
.kint-popup-trigger:hover {
color : @variable-type-color-hover;
}
.kint-source .kint-highlight {
background : #cfc;
}
}
//
// REPORT
// --------------------------------------------------
.kint-report {
td {
background : #fff;
> dl {
padding : 0;
margin : 0;
> dt.kint-parent {
margin: 0;
}
}
}
td:first-child,
td,
th {
padding : 2px 4px;
}
td.kint-empty {
background : @border-color !important;
}
dd, dt {
background: #fff;
}
tr:hover > td {
box-shadow : none;
background : #cfc;
}
}

View File

@ -1,43 +0,0 @@
@import "../base";
@main-background: #e0eaef;
@secondary-background: #c1d4df;
@text-color: #1d1e1e;
@variable-name-color: #1d1e1e;
@variable-type-color: #0092db;
@variable-type-color-hover: #5cb730;
@border-color: #b6cedb;
@border-color-hover: #0092db;
@caret-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAA8CAMAAACO5hB7AAAACVBMVEX///82b4tctzBls0NMAAAAQklEQVR42rWRIQ4AAAgCwf8/2qgER2BeuwJsgAqIzekMfMryPL9XQSkobE6vwKcsz/N7FfPvh09lnPf/b+7673+f0uHuAZ/EdkNQAAAAAElFTkSuQmCC");
.keyboard-caret() {
box-shadow : 0 0 3px 2px #5cb730;
}
.kint {
> dl > dt {
background : linear-gradient(to bottom, #e3ecf0 0, #c0d4df 100%);
}
ul.kint-tabs {
background : linear-gradient(to bottom, #9dbed0 0px, #b2ccda 100%);
}
& > dl:not(.kint-trace) > dd > ul.kint-tabs li {
background : @main-background;
&.kint-active-tab {
background : @secondary-background;
}
}
& > dl.kint-trace > dt {
background : linear-gradient(to bottom, #c0d4df 0px, #e3ecf0 100%);
}
.kint-source .kint-highlight {
background : #f0eb96;
}
}

View File

@ -1,39 +0,0 @@
@import "../base";
@spacing : 5;
@main-background: #002b36; // base 03
@secondary-background : #073642; // base 02
@text-color: #839496; // base 0
@variable-name-color: #93a1a1; // base 1
@variable-type-color: #268bd2; // blue
@variable-type-color-hover: #2aa198; // cyan
@border-color: #586e75; // base 01
@border-color-hover: #268bd2; // blue
.keyboard-caret() {
box-shadow : 0 0 3px 2px #859900 inset; // green
border-radius : 7px;
}
body {
background : @secondary-background;
color : #fff; // for non-kint elements to remain at least semi-readable
}
.kint {
background : @secondary-background;
box-shadow : 0 0 5px 3px @secondary-background;
> dl > dt,
ul.kint-tabs {
box-shadow : 4px 0 2px -3px @variable-type-color inset;
}
}
.kint ul.kint-tabs li.kint-active-tab {
padding-top: 7px;
height: 34px;
}

View File

@ -1,29 +0,0 @@
@import "../base";
@spacing : 5;
@main-background: #fdf6e3; // base 3
@secondary-background : #eee8d5; // base 2
@text-color: #657b83; // base 00
@variable-name-color: #586e75; // base 01
@variable-type-color: #268bd2; // blue
@variable-type-color-hover: #2aa198; // cyan
@border-color: #93a1a1; // base 1
@border-color-hover: #268bd2; // blue
.keyboard-caret() {
box-shadow : 0 0 3px 2px #859900 inset; // green
border-radius : 7px;
}
.kint > dl > dt,
.kint ul.kint-tabs {
box-shadow : 4px 0 2px -3px @variable-type-color inset;
}
.kint ul.kint-tabs li.kint-active-tab {
padding-top: 7px;
height: 34px;
}