panels[$id]));}$this->panels[$id]=$panel;return$this;}public function getPanel($id){return isset($this->panels[$id])?$this->panels[$id]:NULL;}public function render(){$obLevel=ob_get_level();$panels=array();foreach($this->panels as$id=>$panel){try{$panels[]=array('id'=>preg_replace('#[^a-z0-9]+#i','-',$id),'tab'=>$tab=(string)$panel->getTab(),'panel'=>$tab?(string)$panel->getPanel():NULL);}catch(Exception$e){$panels[]=array('id'=>"error-".preg_replace('#[^a-z0-9]+#i','-',$id),'tab'=>"Error in $id",'panel'=>'

Error: '.$id.'

'.nl2br(htmlSpecialChars($e)).'
');while(ob_get_level()>$obLevel){ob_end_clean();}}}@session_start();$session=&$_SESSION['__NF']['debuggerbar'];if(preg_match('#^Location:#im',implode("\n",headers_list()))){$session[]=$panels;return;}foreach(array_reverse((array)$session)as$reqId=>$oldpanels){$panels[]=array('tab'=>'previous','panel'=>NULL,'previous'=>TRUE);foreach($oldpanels as$panel){$panel['id'].='-'.$reqId;$panels[]=$panel;}}$session=NULL;?>   $panel):if(!$panel['panel'])continue;?>
¤ ×
panels,TRUE)){$this->panels[]=$panel;}return$this;}public function render(Exception$exception){$panels=$this->panels;static$errorTypes=array(E_ERROR=>'Fatal Error',E_USER_ERROR=>'User Error',E_RECOVERABLE_ERROR=>'Recoverable Error',E_CORE_ERROR=>'Core Error',E_COMPILE_ERROR=>'Compile Error',E_PARSE=>'Parse Error',E_WARNING=>'Warning',E_CORE_WARNING=>'Core Warning',E_COMPILE_WARNING=>'Compile Warning',E_USER_WARNING=>'User Warning',E_NOTICE=>'Notice',E_USER_NOTICE=>'User Notice',E_STRICT=>'Strict');if(PHP_VERSION_ID>=50300){$errorTypes+=array(E_DEPRECATED=>'Deprecated',E_USER_WARNING=>'User Deprecated');}$title=($exception instanceof FatalErrorException&&isset($errorTypes[$exception->getSeverity()]))?$errorTypes[$exception->getSeverity()]:get_class($exception);$counter=0;?> <?php echo htmlspecialchars($title)?>

getCode()?' #'.$exception->getCode():'')?>

getMessage())?> getMessage()))?>" id="netteBsSearch">search►

Caused by

getCode()?' #'.$ex->getCode():''))?>

getMessage())?>

getTrace();$expanded=NULL?> isCollapsed($ex->getFile())){foreach($stack as$key=>$row){if(isset($row['file'])&&!$this->isCollapsed($row['file'])){$expanded=$key;break;}}}?>

Source file

File: getFile(),$ex->getLine())?>

getFile())):?>getFile(),$ex->getLine(),15,isset($ex->context)?$ex->context:NULL)?>

Call stack

    $row):?>
  1. inner-code " class="nette-toggle-collapsed">source  (" class="nette-toggle-collapsed">arguments)

    "> getParameters();}catch(Exception$e){$params=array();}foreach($row['args']as$k=>$v){echo'\n";}?>
    ',htmlspecialchars(isset($params[$k])?'$'.$params[$k]->name:"#$k"),'';echo NDebugDumper::toHtml($v);echo"
    id="netteBsSrc">
context)&&is_array($ex->context)):?>

Variables

context as$k=>$v){echo'\n";}?>
$',htmlspecialchars($k),'',NDebugDumper::toHtml($v),"
getPrevious())||(isset($ex->previous)&&$ex=$ex->previous));?>
'?>

Environment

$_SERVER

$v)echo'\n";?>
',htmlspecialchars($k),'',NDebugDumper::toHtml($v),"

$_SESSION

empty

$v)echo'\n";?>
',htmlspecialchars($k),'',$k==='__NF'?'Nette Session':NDebugDumper::toHtml($v),"

Nette Session

$v)echo'\n";?>
',htmlspecialchars($k),'',NDebugDumper::toHtml($v),"

Constants

$v){echo'';echo'\n";}?>
',htmlspecialchars($k),'',NDebugDumper::toHtml($v),"

Included files ()

\n";}?>
',htmlspecialchars($v),"

Configuration options

|.+\z#s','',ob_get_clean())?>

HTTP request

Headers

$v)echo'\n";?>
',htmlspecialchars($k),'',htmlspecialchars($v),"

$

empty

$v)echo'\n";?>
',htmlspecialchars($k),'',NDebugDumper::toHtml($v),"

HTTP response

Headers

';?>

no headers

  • Report generated at
  • PHP
  • (revision )
',$source[1]);array_unshift($source,NULL);$start=$i=max(1,$line-floor($lines*2/3));while(--$i>=1){if(preg_match('#.*(]*>)#',$source[$i],$m)){if($m[1]!==''){$spans++;$out.=$m[1];}break;}}$source=array_slice($source,$start,$lines,TRUE);end($source);$numWidth=strlen((string)key($source));foreach($source as$n=>$s){$spans+=substr_count($s,']+>#',$s,$tags);if($n==$line){$out.=sprintf("%{$numWidth}s: %s\n%s",$n,strip_tags($s),implode('',$tags[0]));}else{$out.=sprintf("%{$numWidth}s: %s\n",$n,$s);}}$out.=str_repeat('',$spans).'';$out=preg_replace_callback('#">\$(\w+)( )?#',create_function('$m','extract($GLOBALS[0]['.array_push($GLOBALS[0],array('vars'=>$vars)).'-1], EXTR_REFS); return isset($vars[$m[1]]) ? \'" title="\' . str_replace(\'"\', \'"\', strip_tags(NDebugDumper::toHtml($vars[$m[1]]))) . $m[0] : $m[0]; '),$out);return"
$out
";}public function isCollapsed($file){foreach($this->collapsePaths as$path){if(strpos(strtr($file,'\\','/'),strtr("$path/",'\\','/'))===0){return TRUE;}}return FALSE;}}class NDebugDumper{const DEPTH='depth',TRUNCATE='truncate',COLLAPSE='collapse',COLLAPSE_COUNT='collapsecount',LOCATION='location';public static$terminalColors=array('bool'=>'1;33','null'=>'1;33','number'=>'1;32','string'=>'1;36','array'=>'1;31','key'=>'1;37','object'=>'1;31','visibility'=>'1;30','resource'=>'1;37','indent'=>'1;30');public static$resources=array('stream'=>'stream_get_meta_data','stream-context'=>'stream_context_get_options','curl'=>'curl_getinfo');public static function dump($var,array$options=NULL){if(preg_match('#^Content-Type: text/html#im',implode("\n",headers_list()))){echo self::toHtml($var,$options);}elseif(self::$terminalColors&&substr(getenv('TERM'),0,5)==='xterm'){echo self::toTerminal($var,$options);}else{echo self::toText($var,$options);}return$var;}public static function toHtml($var,array$options=NULL){list($file,$line,$code)=empty($options[self::LOCATION])?NULL:self::findLocation();return'
':'>').self::dumpVar($var,(array)$options+array(self::DEPTH=>4,self::TRUNCATE=>150,self::COLLAPSE=>FALSE,self::COLLAPSE_COUNT=>7)).($file?'in ".htmlspecialchars($file).":$line":'')."
\n";}public static function toText($var,array$options=NULL){return htmlspecialchars_decode(strip_tags(self::toHtml($var,$options)),ENT_QUOTES);}public static function toTerminal($var,array$options=NULL){return htmlspecialchars_decode(strip_tags(preg_replace_callback('#|#',create_function('$m',' return "\\033[" . (isset($m[1], NDebugDumper::$terminalColors[$m[1]]) ? NDebugDumper::$terminalColors[$m[1]] : \'0\') . "m"; '),self::toHtml($var,$options))),ENT_QUOTES);}private static function dumpVar(&$var,array$options,$level=0){if(method_exists(__CLASS__,$m='dump'.gettype($var))){return call_user_func_array(array(__CLASS__,$m),array(&$var,$options,$level));}else{return"unknown type\n";}}private static function dumpNull(){return"NULL\n";}private static function dumpBoolean(&$var){return''.($var?'TRUE':'FALSE')."\n";}private static function dumpInteger(&$var){return"$var\n";}private static function dumpDouble(&$var){$var=var_export($var,TRUE);return''.$var.(strpos($var,'.')===FALSE?'.0':'')."\n";}private static function dumpString(&$var,$options){return''.self::encodeString($options[self::TRUNCATE]&&strlen($var)>$options[self::TRUNCATE]?substr($var,0,$options[self::TRUNCATE]).' ... ':$var).''.(strlen($var)>1?' ('.strlen($var).')':'')."\n";}private static function dumpArray(&$var,$options,$level){static$marker;if($marker===NULL){$marker=uniqid("\x00",TRUE);}$out='array (';if(empty($var)){return$out."0)\n";}elseif(isset($var[$marker])){return$out.(count($var)-1).") [ RECURSION ]\n";}elseif(!$options[self::DEPTH]||$level<$options[self::DEPTH]){$collapsed=$level?count($var)>=$options[self::COLLAPSE_COUNT]:$options[self::COLLAPSE];$out='':'">').$out.count($var).")\n";$var[$marker]=TRUE;foreach($var as$k=>&$v){if($k!==$marker){$out.=' '.str_repeat('| ',$level).''.''.(preg_match('#^\w+\z#',$k)?$k:self::encodeString($k)).' => '.self::dumpVar($v,$options,$level+1);}}unset($var[$marker]);return$out.'
';}else{return$out.count($var).") [ ... ]\n";}}private static function dumpObject(&$var,$options,$level){if($var instanceof Closure){$rc=new ReflectionFunction($var);$fields=array();foreach($rc->getParameters()as$param){$fields[]='$'.$param->getName();}$fields=array('file'=>$rc->getFileName(),'line'=>$rc->getStartLine(),'parameters'=>implode(', ',$fields));}else{$fields=(array)$var;}static$list=array();$out=''.get_class($var)." (".count($fields).')';if(empty($fields)){return$out."\n";}elseif(in_array($var,$list,TRUE)){return$out." { RECURSION }\n";}elseif(!$options[self::DEPTH]||$level<$options[self::DEPTH]||$var instanceof Closure){$collapsed=$level?count($fields)>=$options[self::COLLAPSE_COUNT]:$options[self::COLLAPSE];$out='':'">').$out."\n";$list[]=$var;foreach($fields as$k=>&$v){$vis='';if($k[0]==="\x00"){$vis=' '.($k[1]==='*'?'protected':'private').'';$k=substr($k,strrpos($k,"\x00")+1);}$out.=' '.str_repeat('| ',$level).''.''.(preg_match('#^\w+\z#',$k)?$k:self::encodeString($k))."$vis => ".self::dumpVar($v,$options,$level+1);}array_pop($list);return$out.'';}else{return$out." { ... }\n";}}private static function dumpResource(&$var,$options,$level){$type=get_resource_type($var);$out=''.htmlSpecialChars($type).' resource';if(isset(self::$resources[$type])){$out="$out\n
";foreach(call_user_func(self::$resources[$type],$var)as$k=>$v){$out.=' '.str_repeat('| ',$level).''.''.htmlSpecialChars($k)." => ".self::dumpVar($v,$options,$level+1);}return$out.'
';}return"$out\n";}private static function encodeString($s){static$utf,$binary;if($utf===NULL){foreach(range("\x00","\xFF")as$ch){if(ord($ch)<32&&strpos("\r\n\t",$ch)===FALSE){$utf[$ch]=$binary[$ch]='\\x'.str_pad(dechex(ord($ch)),2,'0',STR_PAD_LEFT);}elseif(ord($ch)<127){$utf[$ch]=$binary[$ch]=$ch;}else{$utf[$ch]=$ch;$binary[$ch]='\\x'.dechex(ord($ch));}}$binary["\\"]='\\\\';$binary["\r"]='\\r';$binary["\n"]='\\n';$binary["\t"]='\\t';$utf['\\x']=$binary['\\x']='\\\\x';}$s=strtr($s,preg_match('#[^\x09\x0A\x0D\x20-\x7E\xA0-\x{10FFFF}]#u',$s)||preg_last_error()?$binary:$utf);return'"'.htmlSpecialChars($s,ENT_NOQUOTES).'"';}private static function findLocation(){foreach(PHP_VERSION_ID<50205?debug_backtrace():debug_backtrace(FALSE)as$item){if(isset($item['file'])&&strpos($item['file'],dirname(__FILE__))===0){continue;}elseif(!isset($item['file'],$item['line'])||!is_file($item['file'])){break;}else{$lines=file($item['file']);$line=$lines[$item['line']-1];return array($item['file'],$item['line'],preg_match('#\w*dump(er::\w+)?\(.*\)#i',$line,$m)?$m[0]:$line);}}}}final class NDefaultBarPanel implements IBarPanel{private$id;public$data;public function __construct($id){$this->id=$id;}public function getTab(){ob_start();$data=$this->data;if($this->id==='time'){?> ms id==='memory'){?> MB id==='dumps'&&$this->data){?> variables id==='errors'&&$this->data){?> errors data;if($this->id==='dumps'){?>

Dumped variables

$dump):?>
id==='errors'){?>

Errors

$count):list($message,$file,$line)=explode('|',$item)?>
array());public static function log($message,$priority=self::DEBUG){if(!isset($_SERVER['HTTP_X_FIRELOGGER'])||headers_sent()){return FALSE;}$item=array('name'=>'PHP','level'=>$priority,'order'=>count(self::$payload['logs']),'time'=>str_pad(number_format((microtime(TRUE)-NDebugger::$time)*1000,1,'.',' '),8,'0',STR_PAD_LEFT).' ms','template'=>'','message'=>'','style'=>'background:#767ab6');$args=func_get_args();if(isset($args[0])&&is_string($args[0])){$item['template']=array_shift($args);}if(isset($args[0])&&$args[0]instanceof Exception){$e=array_shift($args);$trace=$e->getTrace();if(isset($trace[0]['class'])&&$trace[0]['class']==='NDebugger'&&($trace[0]['function']==='_shutdownHandler'||$trace[0]['function']==='_errorHandler')){unset($trace[0]);}$file=str_replace(dirname(dirname(dirname($e->getFile()))),"\xE2\x80\xA6",$e->getFile());$item['template']=($e instanceof ErrorException?'':get_class($e).': ').$e->getMessage().($e->getCode()?' #'.$e->getCode():'').' in '.$file.':'.$e->getLine();$item['pathname']=$e->getFile();$item['lineno']=$e->getLine();}else{$trace=debug_backtrace();if(isset($trace[1]['class'])&&$trace[1]['class']==='NDebugger'&&($trace[1]['function']==='fireLog')){unset($trace[0]);}foreach($trace as$frame){if(isset($frame['file'])&&is_file($frame['file'])){$item['pathname']=$frame['file'];$item['lineno']=$frame['line'];break;}}}$item['exc_info']=array('','',array());$item['exc_frames']=array();foreach($trace as$frame){$frame+=array('file'=>NULL,'line'=>NULL,'class'=>NULL,'type'=>NULL,'function'=>NULL,'object'=>NULL,'args'=>NULL);$item['exc_info'][2][]=array($frame['file'],$frame['line'],"$frame[class]$frame[type]$frame[function]",$frame['object']);$item['exc_frames'][]=$frame['args'];}if(isset($args[0])&&in_array($args[0],array(self::DEBUG,self::INFO,self::WARNING,self::ERROR,self::CRITICAL),TRUE)){$item['level']=array_shift($args);}$item['args']=$args;self::$payload['logs'][]=self::jsonDump($item,-1);foreach(str_split(base64_encode(@json_encode(self::$payload)),4990)as$k=>$v){header("FireLogger-de11e-$k:$v");}return TRUE;}private static function jsonDump(&$var,$level=0){if(is_bool($var)||is_null($var)||is_int($var)||is_float($var)){return$var;}elseif(is_string($var)){if(NDebugger::$maxLen&&strlen($var)>NDebugger::$maxLen){$var=substr($var,0,NDebugger::$maxLen)." \xE2\x80\xA6 ";}return@iconv('UTF-16','UTF-8//IGNORE',iconv('UTF-8','UTF-16//IGNORE',$var));}elseif(is_array($var)){static$marker;if($marker===NULL){$marker=uniqid("\x00",TRUE);}if(isset($var[$marker])){return"\xE2\x80\xA6RECURSION\xE2\x80\xA6";}elseif($level&$v){if($k!==$marker){$res[self::jsonDump($k)]=self::jsonDump($v,$level+1);}}unset($var[$marker]);return$res;}else{return" \xE2\x80\xA6 ";}}elseif(is_object($var)){$arr=(array)$var;static$list=array();if(in_array($var,$list,TRUE)){return"\xE2\x80\xA6RECURSION\xE2\x80\xA6";}elseif($level'(object) '.get_class($var));foreach($arr as$k=>&$v){if($k[0]==="\x00"){$k=substr($k,strrpos($k,"\x00")+1);}$res[self::jsonDump($k)]=self::jsonDump($v,$level+1);}array_pop($list);return$res;}else{return" \xE2\x80\xA6 ";}}elseif(is_resource($var)){return"resource ".get_resource_type($var);}else{return"unknown type";}}}final class NDebugHelpers{public static function editorLink($file,$line){if(NDebugger::$editor&&is_file($file)){$dir=dirname(strtr($file,'/',DIRECTORY_SEPARATOR));$base=isset($_SERVER['SCRIPT_FILENAME'])?dirname(dirname(strtr($_SERVER['SCRIPT_FILENAME'],'/',DIRECTORY_SEPARATOR))):dirname($dir);if(substr($dir,0,strlen($base))===$base){$dir='...'.substr($dir,strlen($base));}return NHtml::el('a')->href(strtr(NDebugger::$editor,array('%file'=>rawurlencode($file),'%line'=>$line)))->title("$file:$line")->setHtml(htmlSpecialChars(rtrim($dir,DIRECTORY_SEPARATOR)).DIRECTORY_SEPARATOR.''.htmlSpecialChars(basename($file)).''.($line?":$line":''));}else{return NHtml::el('span')->setText($file.($line?":$line":''));}}public static function findTrace(array$trace,$method,&$index=NULL){$m=explode('::',$method);foreach($trace as$i=>$item){if(isset($item['function'])&&$item['function']===end($m)&&isset($item['class'])===isset($m[1])&&(!isset($item['class'])||$item['class']===$m[0]||$m[0]==='*'||is_subclass_of($item['class'],$m[0]))){$index=$i;return$item;}}}public static function htmlDump($var){trigger_error(__METHOD__.'() is deprecated; use NDebugDumper::toHtml() instead.',E_USER_WARNING);return NDebugDumper::toHtml($var);}public static function clickableDump($var){trigger_error(__METHOD__.'() is deprecated; use NDebugDumper::toHtml() instead.',E_USER_WARNING);return NDebugDumper::toHtml($var);}public static function textDump($var){trigger_error(__METHOD__.'() is deprecated; use NDebugDumper::toText() instead.',E_USER_WARNING);return NDebugDumper::toText($var);}}class NLogger{const DEBUG='debug',INFO='info',WARNING='warning',ERROR='error',CRITICAL='critical';public static$emailSnooze=172800;public$mailer=array(__CLASS__,'defaultMailer');public$directory;public$email;public function log($message,$priority=self::INFO){if(!is_dir($this->directory)){throw new DirectoryNotFoundException("Directory '$this->directory' is not found or is not directory.");}if(is_array($message)){$message=implode(' ',$message);}$res=error_log(trim($message).PHP_EOL,3,$this->directory.'/'.strtolower($priority).'.log');if(($priority===self::ERROR||$priority===self::CRITICAL)&&$this->email&&$this->mailer&&@filemtime($this->directory.'/email-sent')+self::$emailSnoozedirectory.'/email-sent','sent')){call_user_func($this->mailer,$message,$this->email);}return$res;}public static function defaultMailer($message,$email){$host=php_uname('n');foreach(array('HTTP_HOST','SERVER_NAME','HOSTNAME')as$item){if(isset($_SERVER[$item])){$host=$_SERVER[$item];break;}}$parts=str_replace(array("\r\n","\n"),array("\n",PHP_EOL),array('headers'=>implode("\n",array("From: noreply@$host",'X-Mailer: Nette Framework','Content-Type: text/plain; charset=UTF-8','Content-Transfer-Encoding: 8bit'))."\n",'subject'=>"PHP: An error occurred on the server $host",'body'=>"[".@date('Y-m-d H:i:s')."] $message"));mail($email,$parts['subject'],$parts['body'],$parts['headers']);}}class NHtml implements ArrayAccess,Countable{private$name;private$isEmpty;public$attrs=array();protected$children=array();public static$xhtml=TRUE;public static$emptyElements=array('img'=>1,'hr'=>1,'br'=>1,'input'=>1,'meta'=>1,'area'=>1,'embed'=>1,'keygen'=>1,'source'=>1,'base'=>1,'col'=>1,'link'=>1,'param'=>1,'basefont'=>1,'frame'=>1,'isindex'=>1,'wbr'=>1,'command'=>1);public static function el($name=NULL,$attrs=NULL){$el=new self;$parts=explode(' ',$name,2);$el->setName($parts[0]);if(is_array($attrs)){$el->attrs=$attrs;}elseif($attrs!==NULL){$el->setText($attrs);}return$el;}final public function setName($name,$isEmpty=NULL){if($name!==NULL&&!is_string($name)){throw new InvalidArgumentException("Name must be string or NULL, ".gettype($name)." given.");}$this->name=$name;$this->isEmpty=$isEmpty===NULL?isset(self::$emptyElements[$name]):(bool)$isEmpty;return$this;}final public function getName(){return$this->name;}final public function isEmpty(){return$this->isEmpty;}public function addAttributes(array$attrs){$this->attrs=$attrs+$this->attrs;return$this;}final public function __set($name,$value){$this->attrs[$name]=$value;}final public function&__get($name){return$this->attrs[$name];}final public function __unset($name){unset($this->attrs[$name]);}final public function __call($m,$args){$p=substr($m,0,3);if($p==='get'||$p==='set'||$p==='add'){$m=substr($m,3);$m[0]=$m[0]|"\x20";if($p==='get'){return isset($this->attrs[$m])?$this->attrs[$m]:NULL;}elseif($p==='add'){$args[]=TRUE;}}if(count($args)===0){}elseif(count($args)===1){$this->attrs[$m]=$args[0];}elseif((string)$args[0]===''){$tmp=&$this->attrs[$m];}elseif(!isset($this->attrs[$m])||is_array($this->attrs[$m])){$this->attrs[$m][$args[0]]=$args[1];}else{$this->attrs[$m]=array($this->attrs[$m],$args[0]=>$args[1]);}return$this;}final public function href($path,$query=NULL){if($query){$query=http_build_query($query,NULL,'&');if($query!==''){$path.='?'.$query;}}$this->attrs['href']=$path;return$this;}final public function setHtml($html){if($html===NULL){$html='';}elseif(is_array($html)){throw new InvalidArgumentException("Textual content must be a scalar, ".gettype($html)." given.");}else{$html=(string)$html;}$this->removeChildren();$this->children[]=$html;return$this;}final public function getHtml(){$s='';foreach($this->children as$child){if(is_object($child)){$s.=$child->render();}else{$s.=$child;}}return$s;}final public function setText($text){if(!is_array($text)){$text=htmlspecialchars((string)$text,ENT_NOQUOTES);}return$this->setHtml($text);}final public function getText(){return html_entity_decode(strip_tags($this->getHtml()),ENT_QUOTES,'UTF-8');}final public function add($child){return$this->insert(NULL,$child);}final public function create($name,$attrs=NULL){$this->insert(NULL,$child=self::el($name,$attrs));return$child;}public function insert($index,$child,$replace=FALSE){if($child instanceof NHtml||is_scalar($child)){if($index===NULL){$this->children[]=$child;}else{array_splice($this->children,(int)$index,$replace?1:0,array($child));}}else{throw new InvalidArgumentException("Child node must be scalar or Html object, ".(is_object($child)?get_class($child):gettype($child))." given.");}return$this;}final public function offsetSet($index,$child){$this->insert($index,$child,TRUE);}final public function offsetGet($index){return$this->children[$index];}final public function offsetExists($index){return isset($this->children[$index]);}public function offsetUnset($index){if(isset($this->children[$index])){array_splice($this->children,(int)$index,1);}}final public function count(){return count($this->children);}public function removeChildren(){$this->children=array();}final public function getChildren(){return$this->children;}final public function render($indent=NULL){$s=$this->startTag();if(!$this->isEmpty){if($indent!==NULL){$indent++;}foreach($this->children as$child){if(is_object($child)){$s.=$child->render($indent);}else{$s.=$child;}}$s.=$this->endTag();}if($indent!==NULL){return"\n".str_repeat("\t",$indent-1).$s."\n".str_repeat("\t",max(0,$indent-2));}return$s;}final public function __toString(){return$this->render();}final public function startTag(){if($this->name){return'<'.$this->name.$this->attributes().(self::$xhtml&&$this->isEmpty?' />':'>');}else{return'';}}final public function endTag(){return$this->name&&!$this->isEmpty?'name.'>':'';}final public function attributes(){if(!is_array($this->attrs)){return'';}$s='';foreach($this->attrs as$key=>$value){if($value===NULL||$value===FALSE){continue;}elseif($value===TRUE){if(self::$xhtml){$s.=' '.$key.'="'.$key.'"';}else{$s.=' '.$key;}continue;}elseif(is_array($value)){if($key==='data'){foreach($value as$k=>$v){if($v!==NULL&&$v!==FALSE){$s.=' data-'.$k.'="'.htmlspecialchars((string)$v).'"';}}continue;}$tmp=NULL;foreach($value as$k=>$v){if($v!=NULL){$tmp[]=$v===TRUE?$k:(is_string($k)?$k.':'.$v:$v);}}if($tmp===NULL){continue;}$value=implode($key==='style'||!strncmp($key,'on',2)?';':' ',$tmp);}else{$value=(string)$value;}$s.=' '.$key.'="'.htmlspecialchars($value).'"';}$s=str_replace('@','@',$s);return$s;}public function __clone(){foreach($this->children as$key=>$value){if(is_object($value)){$this->children[$key]=clone$value;}}}}function debug(){NDebugger::$strictMode=TRUE;NDebugger::enable(NDebugger::DEVELOPMENT);}function dump($var){foreach(func_get_args()as$arg){NDebugger::dump($arg);}return$var;}function dlog($var=NULL){if(func_num_args()===0){NDebugger::log(new Exception,'dlog');}foreach(func_get_args()as$arg){NDebugger::log($arg,'dlog');}return$var;}final class NDebugger{public static$productionMode;public static$consoleMode;public static$time;public static$source;public static$editor='editor://open/?file=%file&line=%line';public static$browser;public static$maxDepth=3;public static$maxLen=150;public static$showLocation=FALSE;public static$consoleColors;const DEVELOPMENT=FALSE,PRODUCTION=TRUE,DETECT=NULL;public static$blueScreen;public static$strictMode=FALSE;public static$scream=FALSE;public static$onFatalError=array();private static$enabled=FALSE;private static$lastError=FALSE;public static$logger;public static$fireLogger;public static$logDirectory;public static$email;public static$mailer;public static$emailSnooze;public static$bar;private static$errorPanel;private static$dumpPanel;const DEBUG='debug',INFO='info',WARNING='warning',ERROR='error',CRITICAL='critical';final public function __construct(){throw new NStaticClassException;}public static function _init(){self::$time=isset($_SERVER['REQUEST_TIME_FLOAT'])?$_SERVER['REQUEST_TIME_FLOAT']:microtime(TRUE);self::$productionMode=self::DETECT;if(isset($_SERVER['REQUEST_URI'])){self::$source=(isset($_SERVER['HTTPS'])&&strcasecmp($_SERVER['HTTPS'],'off')?'https://':'http://').(isset($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:(isset($_SERVER['SERVER_NAME'])?$_SERVER['SERVER_NAME']:'')).$_SERVER['REQUEST_URI'];}else{self::$source=empty($_SERVER['argv'])?'CLI':'CLI: '.implode(' ',$_SERVER['argv']);}self::$consoleColors=&NDebugDumper::$terminalColors;self::$logger=new NLogger;self::$logDirectory=&self::$logger->directory;self::$email=&self::$logger->email;self::$mailer=&self::$logger->mailer;self::$emailSnooze=&NLogger::$emailSnooze;self::$fireLogger=new NFireLogger;self::$blueScreen=new NDebugBlueScreen;self::$blueScreen->collapsePaths[]=NETTE_DIR;self::$blueScreen->addPanel(create_function('$e',' if ($e instanceof NTemplateException) { return array( \'tab\' => \'Template\', \'panel\' => \'

File: \' . NDebugHelpers::editorLink($e->sourceFile, $e->sourceLine) . \'

\' . ($e->sourceLine ? NDebugBlueScreen::highlightFile($e->sourceFile, $e->sourceLine) : \'\') ); } elseif ($e instanceof NNeonException && preg_match(\'#line (\\d+)#\', $e->getMessage(), $m)) { if ($item = NDebugHelpers::findTrace($e->getTrace(), \'NConfigNeonAdapter::load\')) { return array( \'tab\' => \'NEON\', \'panel\' => \'

File: \' . NDebugHelpers::editorLink($item[\'args\'][0], $m[1]) . \'

\' . NDebugBlueScreen::highlightFile($item[\'args\'][0], $m[1]) ); } elseif ($item = NDebugHelpers::findTrace($e->getTrace(), \'NNeon::decode\')) { return array( \'tab\' => \'NEON\', \'panel\' => NDebugBlueScreen::highlightPhp($item[\'args\'][0], $m[1]) ); } } '));self::$bar=new NDebugBar;self::$bar->addPanel(new NDefaultBarPanel('time'));self::$bar->addPanel(new NDefaultBarPanel('memory'));self::$bar->addPanel(self::$errorPanel=new NDefaultBarPanel('errors'));self::$bar->addPanel(self::$dumpPanel=new NDefaultBarPanel('dumps'));}public static function enable($mode=NULL,$logDirectory=NULL,$email=NULL){error_reporting(E_ALL|E_STRICT);if(is_bool($mode)){self::$productionMode=$mode;}elseif($mode!==self::DETECT||self::$productionMode===NULL){$list=is_string($mode)?preg_split('#[,\s]+#',$mode):(array)$mode;if(!isset($_SERVER['HTTP_X_FORWARDED_FOR'])){$list[]='127.0.0.1';$list[]='::1';}self::$productionMode=!in_array(isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:php_uname('n'),$list,TRUE);}if(is_string($logDirectory)){self::$logDirectory=realpath($logDirectory);if(self::$logDirectory===FALSE){echo __METHOD__."() error: Log directory is not found or is not directory.\n";exit(254);}}elseif($logDirectory===FALSE){self::$logDirectory=FALSE;}elseif(self::$logDirectory===NULL){self::$logDirectory=defined('APP_DIR')?APP_DIR.'/../log':getcwd().'/log';}if(self::$logDirectory){ini_set('error_log',self::$logDirectory.'/php_error.log');}if(function_exists('ini_set')){ini_set('display_errors',!self::$productionMode);ini_set('html_errors',FALSE);ini_set('log_errors',FALSE);}elseif(ini_get('display_errors')!=!self::$productionMode&&ini_get('display_errors')!==(self::$productionMode?'stderr':'stdout')){echo __METHOD__."() error: Unable to set 'display_errors' because function ini_set() is disabled.\n";exit(254);}if($email){if(!is_string($email)){echo __METHOD__."() error: Email address must be a string.\n";exit(254);}self::$email=$email;}if(!self::$enabled){register_shutdown_function(array(__CLASS__,'_shutdownHandler'));set_exception_handler(array(__CLASS__,'_exceptionHandler'));set_error_handler(array(__CLASS__,'_errorHandler'));self::$enabled=TRUE;}}public static function isEnabled(){return self::$enabled;}public static function log($message,$priority=self::INFO){if(self::$logDirectory===FALSE){return;}elseif(!self::$logDirectory){throw new InvalidStateException('Logging directory is not specified in NDebugger::$logDirectory.');}$exceptionFilename=NULL;if($message instanceof Exception){$exception=$message;$message=($message instanceof FatalErrorException?'Fatal error: '.$exception->getMessage():get_class($exception).": ".$exception->getMessage())." in ".$exception->getFile().":".$exception->getLine();$hash=md5($exception.(method_exists($exception,'getPrevious')?$exception->getPrevious():(isset($exception->previous)?$exception->previous:'')));$exceptionFilename="exception-".@date('Y-m-d-H-i-s')."-$hash.html";foreach(new DirectoryIterator(self::$logDirectory)as$entry){if(strpos($entry,$hash)){$exceptionFilename=$entry;$saved=TRUE;break;}}}elseif(!is_string($message)){$message=NDebugDumper::toText($message);}if($exceptionFilename){$exceptionFilename=self::$logDirectory.'/'.$exceptionFilename;if(empty($saved)&&$logHandle=@fopen($exceptionFilename,'w')){ob_start();ob_start(create_function('$buffer','extract($GLOBALS[0]['.array_push($GLOBALS[0],array('logHandle'=>$logHandle)).'-1], EXTR_REFS); fwrite($logHandle, $buffer); '),4096);self::$blueScreen->render($exception);ob_end_flush();ob_end_clean();fclose($logHandle);}}self::$logger->log(array(@date('[Y-m-d H-i-s]'),trim($message),self::$source?' @ '.self::$source:NULL,$exceptionFilename?' @@ '.basename($exceptionFilename):NULL),$priority);return$exceptionFilename?strtr($exceptionFilename,'\\/',DIRECTORY_SEPARATOR.DIRECTORY_SEPARATOR):NULL;}public static function _shutdownHandler(){if(!self::$enabled){return;}static$types=array(E_ERROR=>1,E_CORE_ERROR=>1,E_COMPILE_ERROR=>1,E_PARSE=>1);$error=error_get_last();if(isset($types[$error['type']])){self::_exceptionHandler(new FatalErrorException($error['message'],0,$error['type'],$error['file'],$error['line'],NULL));}if(!connection_aborted()&&self::$bar&&!self::$productionMode&&self::isHtmlMode()){self::$bar->render();}}public static function _exceptionHandler(Exception$exception){if(!headers_sent()){$protocol=isset($_SERVER['SERVER_PROTOCOL'])?$_SERVER['SERVER_PROTOCOL']:'HTTP/1.1';header($protocol.' 500',TRUE,500);}try{if(self::$productionMode){try{self::log($exception,self::ERROR);}catch(Exception$e){echo'FATAL ERROR: unable to log error';}if(self::isHtmlMode()){?> Server Error

Server Error

We're sorry! The server encountered an internal error and was unable to complete your request. Please try again later.

error 500

render($exception);if(self::$bar){self::$bar->render();}}elseif(connection_aborted()||!self::fireLog($exception)){$file=self::log($exception,self::ERROR);if(!headers_sent()){header("X-Nette-Error-Log: $file");}echo"$exception\n".($file?"(stored in $file)\n":'');if(self::$browser){exec(self::$browser.' '.escapeshellarg($file));}}}foreach(self::$onFatalError as$handler){call_user_func($handler,$exception);}}catch(Exception$e){if(self::$productionMode){echo self::isHtmlMode()?'FATAL ERROR':'FATAL ERROR';}else{echo"FATAL ERROR: thrown ",get_class($e),': ',$e->getMessage(),"\nwhile processing ",get_class($exception),': ',$exception->getMessage(),"\n";}}self::$enabled=FALSE;exit(254);}public static function _errorHandler($severity,$message,$file,$line,$context){if(self::$scream){error_reporting(E_ALL|E_STRICT);}if(self::$lastError!==FALSE&&($severity&error_reporting())===$severity){self::$lastError=new ErrorException($message,0,$severity,$file,$line);return NULL;}if($severity===E_RECOVERABLE_ERROR||$severity===E_USER_ERROR){if(NDebugHelpers::findTrace(PHP_VERSION_ID<50205?debug_backtrace():debug_backtrace(FALSE),'*::__toString')){$previous=isset($context['e'])&&$context['e']instanceof Exception?$context['e']:NULL;self::_exceptionHandler(new FatalErrorException($message,0,$severity,$file,$line,$context,$previous));}throw new FatalErrorException($message,0,$severity,$file,$line,$context);}elseif(($severity&error_reporting())!==$severity){return FALSE;}elseif(!self::$productionMode&&(is_bool(self::$strictMode)?self::$strictMode:((self::$strictMode&$severity)===$severity))){self::_exceptionHandler(new FatalErrorException($message,0,$severity,$file,$line,$context));}static$types=array(E_WARNING=>'Warning',E_COMPILE_WARNING=>'Warning',E_USER_WARNING=>'Warning',E_NOTICE=>'Notice',E_USER_NOTICE=>'Notice',E_STRICT=>'Strict standards');if(PHP_VERSION_ID>=50300){$types+=array(E_DEPRECATED=>'Deprecated',E_USER_WARNING=>'Deprecated');}$message='PHP '.(isset($types[$severity])?$types[$severity]:'Unknown error').": $message";$count=&self::$errorPanel->data["$message|$file|$line"];if($count++){return NULL;}elseif(self::$productionMode){self::log("$message in $file:$line",self::ERROR);return NULL;}else{$ok=self::fireLog(new ErrorException($message,0,$severity,$file,$line));return!self::isHtmlMode()||(!self::$bar&&!$ok)?FALSE:NULL;}return FALSE;}public static function toStringException(Exception$exception){if(self::$enabled){self::_exceptionHandler($exception);}else{trigger_error($exception->getMessage(),E_USER_ERROR);}}public static function tryError(){trigger_error(__METHOD__.'() is deprecated; use own error handler instead.',E_USER_WARNING);if(!self::$enabled&&self::$lastError===FALSE){set_error_handler(array(__CLASS__,'_errorHandler'));}self::$lastError=NULL;}public static function catchError(&$error){trigger_error(__METHOD__.'() is deprecated; use own error handler instead.',E_USER_WARNING);if(!self::$enabled&&self::$lastError!==FALSE){restore_error_handler();}$error=self::$lastError;self::$lastError=FALSE;return(bool)$error;}public static function dump($var,$return=FALSE){if($return){ob_start();NDebugDumper::dump($var,array(NDebugDumper::DEPTH=>self::$maxDepth,NDebugDumper::TRUNCATE=>self::$maxLen));return ob_get_clean();}elseif(!self::$productionMode){NDebugDumper::dump($var,array(NDebugDumper::DEPTH=>self::$maxDepth,NDebugDumper::TRUNCATE=>self::$maxLen,NDebugDumper::LOCATION=>self::$showLocation));}return$var;}public static function timer($name=NULL){static$time=array();$now=microtime(TRUE);$delta=isset($time[$name])?$now-$time[$name]:0;$time[$name]=$now;return$delta;}public static function barDump($var,$title=NULL){if(!self::$productionMode){$dump=array();foreach((is_array($var)?$var:array(''=>$var))as$key=>$val){$dump[$key]=NDebugDumper::toHtml($val);}self::$dumpPanel->data[]=array('title'=>$title,'dump'=>$dump);}return$var;}public static function fireLog($message){if(!self::$productionMode){return self::$fireLogger->log($message);}}private static function isHtmlMode(){return empty($_SERVER['HTTP_X_REQUESTED_WITH'])&&preg_match('#^Content-Type: text/html#im',implode("\n",headers_list()));}public static function addPanel(IBarPanel$panel,$id=NULL){return self::$bar->addPanel($panel,$id);}}class FatalErrorException extends Exception{private$severity;public function __construct($message,$code,$severity,$file,$line,$context){parent::__construct($message,$code);$this->severity=$severity;$this->file=$file;$this->line=$line;$this->context=$context;}public function getSeverity(){return$this->severity;}}$GLOBALS[0]=array();NDebugger::_init();