";
- echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
";
- echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
";
- echo "Format=$format
";
- }
- */
-
+ if( 0 ) { // DEBUG
+ echo " Start =".date("Y-m-d H:i:s",$aStartTime)."
";
+ echo " End =".date("Y-m-d H:i:s",$aEndTime)."
";
+ echo "Adj Start =".date("Y-m-d H:i:s",$adjstart)."
";
+ echo "Adj End =".date("Y-m-d H:i:s",$adjend)."
";
+ echo "Major = $maj s, ".floor($maj/60)."min, ".floor($maj/3600)."h, ".floor($maj/86400)."day
";
+ echo "Min = $min s, ".floor($min/60)."min, ".floor($min/3600)."h, ".floor($min/86400)."day
";
+ echo "Format=$format
";
+ }
+ */
+
if ($this->iStartTimeAlign !== false && $this->iStartAlign !== false) {
JpGraphError::RaiseL(3001);
//('It is only possible to use either SetDateAlign() or SetTimeAlign() but not both');
@@ -485,7 +491,7 @@ class DateScale extends LinearScale
}
-
+
if ($this->iStartAlign !== false) {
if ($this->iStartAlign >= 30) {
$adjstart = $this->AdjStartDate($aStartTime, $this->iStartAlign-30);
diff --git a/onyx2/include/jpgraph/jpgraph_errhandler.inc.php b/onyx2/include/jpgraph/jpgraph_errhandler.inc.php
index 325b357..fbd867c 100644
--- a/onyx2/include/jpgraph/jpgraph_errhandler.inc.php
+++ b/onyx2/include/jpgraph/jpgraph_errhandler.inc.php
@@ -1,15 +1,22 @@
Raise($aMsg, $aHalt);
+ throw new JpGraphException($aMsg);
}
public static function SetErrLocale($aLoc)
{
@@ -112,12 +117,91 @@ class JpGraphError
}
public static function RaiseL($errnbr, $a1=null, $a2=null, $a3=null, $a4=null, $a5=null)
{
- $t = new ErrMsgText();
- $msg = $t->Get($errnbr, $a1, $a2, $a3, $a4, $a5);
- self::$__jpg_err->Raise($msg);
+ throw new JpGraphExceptionL($errnbr, $a1, $a2, $a3, $a4, $a5);
+ }
+ public static function SetImageFlag($aFlg=true)
+ {
+ self::$__iImgFlg = $aFlg;
+ }
+ public static function GetImageFlag()
+ {
+ return self::$__iImgFlg;
+ }
+ public static function SetLogFile($aFile)
+ {
+ self::$__iLogFile = $aFile;
+ }
+ public static function GetLogFile()
+ {
+ return self::$__iLogFile;
+ }
+ public static function SetTitle($aTitle)
+ {
+ self::$__iTitle = $aTitle;
+ }
+ public static function GetTitle()
+ {
+ return self::$__iTitle;
}
}
+class JpGraphException extends Exception
+{
+ // Redefine the exception so message isn't optional
+ public function __construct($message, $code = 0)
+ {
+ // make sure everything is assigned properly
+ parent::__construct($message, $code);
+ }
+ // custom string representation of object
+ public function _toString()
+ {
+ return __CLASS__ . ": [{$this->code}]: {$this->message} at " . basename($this->getFile()) . ":" . $this->getLine() . "\n" . $this->getTraceAsString() . "\n";
+ }
+ // custom representation of error as an image
+ public function Stroke()
+ {
+ if (JpGraphError::GetImageFlag()) {
+ $errobj = new JpGraphErrObjectImg();
+ $errobj->SetTitle(JpGraphError::GetTitle());
+ } else {
+ $errobj = new JpGraphErrObject();
+ $errobj->SetTitle(JpGraphError::GetTitle());
+ $errobj->SetStrokeDest(JpGraphError::GetLogFile());
+ }
+ $errobj->Raise($this->getMessage());
+ }
+ public static function defaultHandler(Throwable $exception)
+ {
+ global $__jpg_OldHandler;
+ if ($exception instanceof JpGraphException) {
+ $exception->Stroke();
+ } else {
+ // Restore old handler
+ if ($__jpg_OldHandler !== null) {
+ set_exception_handler($__jpg_OldHandler);
+ }
+ throw $exception;
+ }
+ }
+}
+
+class JpGraphExceptionL extends JpGraphException
+{
+ // Redefine the exception so message isn't optional
+ public function __construct($errcode, $a1=null, $a2=null, $a3=null, $a4=null, $a5=null)
+ {
+ // make sure everything is assigned properly
+ $errtxt = new ErrMsgText();
+ JpGraphError::SetTitle('JpGraph Error: '.$errcode);
+ parent::__construct($errtxt->Get($errcode, $a1, $a2, $a3, $a4, $a5), 0);
+ }
+}
+
+// Setup the default handler
+global $__jpg_OldHandler;
+$__jpg_OldHandler = set_exception_handler(array('JpGraphException','defaultHandler'));
+
//
// First of all set up a default error handler
//
@@ -127,11 +211,11 @@ class JpGraphError
//=============================================================
class JpGraphErrObject
{
- protected $iTitle = "JpGraph Error";
+ protected $iTitle = "JpGraph error: ";
protected $iDest = false;
- public function JpGraphErrObject()
+ public function __construct()
{
// Empty. Reserved for future use
}
@@ -147,20 +231,31 @@ class JpGraphErrObject
}
// If aHalt is true then execution can't continue. Typical used for fatal errors
- public function Raise($aMsg, $aHalt=true)
+ public function Raise($aMsg, $aHalt=false)
{
- $aMsg = $this->iTitle.' '.$aMsg;
- if ($this->iDest) {
- $f = @fopen($this->iDest, 'a');
- if ($f) {
- @fwrite($f, $aMsg);
- @fclose($f);
+ if ($this->iDest != '') {
+ if ($this->iDest == 'syslog') {
+ error_log($this->iTitle.$aMsg);
+ } else {
+ $str = '['.date('r').'] '.$this->iTitle.$aMsg."\n";
+ $f = @fopen($this->iDest, 'a');
+ if ($f) {
+ @fwrite($f, $str);
+ @fclose($f);
+ }
}
} else {
- echo $aMsg;
+ $aMsg = $this->iTitle.$aMsg;
+ // Check SAPI and if we are called from the command line
+ // send the error to STDERR instead
+ if (PHP_SAPI == 'cli') {
+ fwrite(STDERR, $aMsg);
+ } else {
+ echo $aMsg;
+ }
}
if ($aHalt) {
- die();
+ exit(1);
}
}
}
@@ -170,25 +265,32 @@ class JpGraphErrObject
//==============================================================
class JpGraphErrObjectImg extends JpGraphErrObject
{
+ public function __construct()
+ {
+ parent::__construct();
+ // Empty. Reserved for future use
+ }
+
public function Raise($aMsg, $aHalt=true)
{
$img_iconerror =
- 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
- 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
- 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
- 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
- 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
- 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
- '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
- 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
- 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
- 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
- '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
- 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
- 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
- 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
- 'qL72fwAAAABJRU5ErkJggg==' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaV'.
+ 'BMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
+ 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpY'.
+ 'iYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
+ 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACx'.
+ 'IAAAsSAdLdfvwAAAAHdElNRQfTBgISOCqusfs5AAABLUlEQVR4'.
+ '2tWV3XKCMBBGWfkranCIVClKLd/7P2Q3QsgCxjDTq+6FE2cPH+'.
+ 'xJ0Ogn2lQbsT+Wrs+buAZAV4W5T6Bs0YXBBwpKgEuIu+JERAX6'.
+ 'wM2rHjmDdEITmsQEEmWADgZm6rAjhXsoMGY9B/NZBwJzBvn+e3'.
+ 'wHntCAJdGu9SviwIwoZVDxPB9+Rc0TSEbQr0j3SA1gwdSn6Db0'.
+ '6Tm1KfV6yzWGQO7zdpvyKLKBDmRFjzeB3LYgK7r6A/noDAfjtS'.
+ 'IXaIzbJSv6WgUebTMV4EoRB8a2mQiQjgtF91HdKDKZ1gtFtQjk'.
+ 'YcWaR5OKOhkYt+ZsTFdJRfPAApOpQYJTNHvCRSJR6SJngQadfc'.
+ 'vd69OLMddVOPCGVnmrFD8bVYd3JXfxXPtLR/+mtv59/ALWiiMx'.
+ 'qL72fwAAAABJRU5ErkJggg==' ;
+
if (function_exists("imagetypes")) {
$supported = imagetypes();
} else {
@@ -198,7 +300,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject
if (!function_exists('imagecreatefromstring')) {
$supported = 0;
}
-
+
if (ob_get_length() || headers_sent() || !($supported & IMG_PNG)) {
// Special case for headers already sent or that the installation doesn't support
// the PNG format (which the error icon is encoded in).
@@ -224,7 +326,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject
$img->FilledRectangle(5, 5, $w-1, $h-1, 10);
$img->SetColor("gray:0.7");
$img->FilledRectangle(5, 5, $w-3, $h-3, 10);
-
+
// Window background
$img->SetColor("lightblue");
$img->FilledRectangle(1, 1, $w-5, $h-5);
@@ -234,7 +336,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject
$img->SetColor("black");
$img->Rectangle(1, 1, $w-5, $h-5);
$img->Rectangle(0, 0, $w-4, $h-4);
-
+
// Window top row
$img->SetColor("darkred");
for ($y=3; $y < 18; $y += 2) {
@@ -257,17 +359,18 @@ class JpGraphErrObjectImg extends JpGraphErrObject
// Window title
$m = floor($w/2-5);
- $l = 100;
+ $l = 110;
$img->SetColor("lightgray:1.3");
$img->FilledRectangle($m-$l, 2, $m+$l, 16);
// Stroke text
$img->SetColor("darkred");
$img->SetFont(FF_FONT2, FS_BOLD);
- $img->StrokeText($m-50, 15, $this->iTitle);
+ $img->StrokeText($m-90, 15, $this->iTitle);
$img->SetColor("black");
$img->SetFont(FF_FONT1, FS_NORMAL);
$txt = new Text($aMsg, 52, 25);
+ $txt->SetFont(FF_FONT1);
$txt->Align("left", "top");
$txt->Stroke($img);
if ($this->iDest) {
@@ -283,9 +386,7 @@ class JpGraphErrObjectImg extends JpGraphErrObject
}
-// Install the default error handler
-if (USE_IMAGE_ERROR_HANDLER) {
- JpGraphError::Install("JpGraphErrObjectImg");
-} else {
- JpGraphError::Install("JpGraphErrObject");
+
+if (! USE_IMAGE_ERROR_HANDLER) {
+ JpGraphError::SetImageFlag(false);
}
diff --git a/onyx2/include/jpgraph/jpgraph_error.php b/onyx2/include/jpgraph/jpgraph_error.php
index de9fcaa..daac8ef 100644
--- a/onyx2/include/jpgraph/jpgraph_error.php
+++ b/onyx2/include/jpgraph/jpgraph_error.php
@@ -1,14 +1,14 @@
Plot($datay, $datax);
+ parent::__construct($datay, $datax);
$this->numpoints /= 2;
}
//---------------
// PUBLIC METHODS
-
+
// Gets called before any axis are stroked
public function PreStrokeAdjust($graph)
{
@@ -42,7 +43,7 @@ class ErrorPlot extends Plot
$graph->SetTextScaleOff($b);
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
-
+
// Method description
public function Stroke($img, $xscale, $yscale)
{
@@ -70,7 +71,7 @@ class ErrorPlot extends Plot
}
if (!is_numeric($x) ||
- !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1])) {
+ !is_numeric($this->coords[0][$i*2]) || !is_numeric($this->coords[0][$i*2+1])) {
continue;
}
@@ -97,9 +98,9 @@ class ErrorLinePlot extends ErrorPlot
public $line=null;
//---------------
// CONSTRUCTOR
- public function ErrorLinePlot($datay, $datax=false)
+ public function __construct($datay, $datax=false)
{
- $this->ErrorPlot($datay, $datax);
+ parent::__construct($datay, $datax);
// Calculate line coordinates as the average of the error limits
$n = count($datay);
for ($i=0; $i < $n; $i+=2) {
@@ -117,7 +118,7 @@ class ErrorLinePlot extends ErrorPlot
}
$this->line->Legend($graph);
}
-
+
public function Stroke($img, $xscale, $yscale)
{
parent::Stroke($img, $xscale, $yscale);
@@ -136,7 +137,7 @@ class LineErrorPlot extends ErrorPlot
//---------------
// CONSTRUCTOR
// Data is (val, errdeltamin, errdeltamax)
- public function LineErrorPlot($datay, $datax=false)
+ public function __construct($datay, $datax=false)
{
$ly=array();
$ey=array();
@@ -150,7 +151,7 @@ class LineErrorPlot extends ErrorPlot
$ey[]=$datay[$i]+$datay[$i+1];
$ey[]=$datay[$i]+$datay[$i+2];
}
- $this->ErrorPlot($ey, $datax);
+ parent::__construct($ey, $datax);
$this->line=new LinePlot($ly, $datax);
}
@@ -163,7 +164,7 @@ class LineErrorPlot extends ErrorPlot
}
$this->line->Legend($graph);
}
-
+
public function Stroke($img, $xscale, $yscale)
{
parent::Stroke($img, $xscale, $yscale);
diff --git a/onyx2/include/jpgraph/jpgraph_flags.php b/onyx2/include/jpgraph/jpgraph_flags.php
index 383e55a..7f0e85d 100644
--- a/onyx2/include/jpgraph/jpgraph_flags.php
+++ b/onyx2/include/jpgraph/jpgraph_flags.php
@@ -1,11 +1,11 @@
iFlagSetMap[$aSize].'.dat';
- $fp = fopen($file, 'rb');
- $rawdata = fread($fp, filesize($file));
- $this->iFlagData = unserialize($rawdata);
- break;
- default:
- JpGraphError::RaiseL(5001, $aSize);
-//('Unknown flag size. ('.$aSize.')');
- }
+ case FLAGSIZE1:
+ case FLAGSIZE2:
+ case FLAGSIZE3:
+ case FLAGSIZE4:
+ $file = dirname(__FILE__).'/'.$this->iFlagSetMap[$aSize].'.dat';
+ $fp = fopen($file, 'rb');
+ $rawdata = fread($fp, filesize($file));
+ $this->iFlagData = unserialize($rawdata);
+ break;
+ default:
+ JpGraphError::RaiseL(5001, $aSize);
+ //('Unknown flag size. ('.$aSize.')');
+ }
$this->iFlagCount = count($this->iCountryNameMap);
}
@@ -304,7 +304,7 @@ class FlagImages
return Image::CreateFromString($d);
} else {
JpGraphError::RaiseL(5002, $aIdx);
- //("Flag index \"$aIdx\" does not exist.");
+ //("Flag index \"�$aIdx\" does not exist.");
}
}
@@ -313,10 +313,9 @@ class FlagImages
$aOrd--;
$n = count($this->iOrdIdx);
if ($n == 0) {
- reset($this->iCountryNameMap);
$this->iOrdIdx=array();
$i=0;
- while (list($key, $val) = each($this->iCountryNameMap)) {
+ foreach ($this->iCountryNameMap as $key => $val) {
$this->iOrdIdx[$i++] = array($val,$key);
}
$tmp=$this->iOrdIdx[$aOrd];
@@ -342,18 +341,16 @@ class FlagImages
$found=false;
$aName = strtolower($aName);
$nlen = strlen($aName);
- reset($this->iCountryNameMap);
// Start by trying to match exact index name
- while (list($key, $val) = each($this->iCountryNameMap)) {
+ foreach ($this->iCountryNameMap as $key => $val) {
if ($nlen == strlen($val) && $val == $aName) {
$found=true;
break;
}
}
if (!$found) {
- reset($this->iCountryNameMap);
// If the exact index doesn't work try a (partial) full name
- while (list($key, $val) = each($this->iCountryNameMap)) {
+ foreach ($this->iCountryNameMap as $key => $val) {
if (strpos(strtolower($key), $aName) !== false) {
$found=true;
break;
diff --git a/onyx2/include/jpgraph/jpgraph_gantt.php b/onyx2/include/jpgraph/jpgraph_gantt.php
index 00708cc..a6b098a 100644
--- a/onyx2/include/jpgraph/jpgraph_gantt.php
+++ b/onyx2/include/jpgraph/jpgraph_gantt.php
@@ -1,127 +1,127 @@
vgrid = new LineProperty();
}
@@ -180,8 +180,8 @@ class GanttActivityInfo
public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10)
{
$this->iFFamily = $aFFamily;
- $this->iFStyle = $aFStyle;
- $this->iFSize = $aFSize;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
}
public function SetStyle($aStyle)
@@ -253,7 +253,7 @@ class GanttActivityInfo
$txt='';
return $w;
}
-
+
public function GetColStart($aImg, &$aStart, $aAddLeftMargin=false)
{
$n = count($this->iTitles) ;
@@ -263,7 +263,7 @@ class GanttActivityInfo
$aStart[$i] = $aStart[$i-1]+$this->iLeftColMargin+$this->iWidth[$i-1];
}
}
-
+
// Adjust headers left, right or centered
public function SetHeaderAlign($aAlign)
{
@@ -285,7 +285,7 @@ class GanttActivityInfo
if ($n == 0) {
return;
}
-
+
$x = $aXLeft;
$h = $this->iHeight;
$yTop = $aUseTextHeight ? $aYBottom-$h-$this->iTopColMargin-$this->iBottomColMargin : $aYTop ;
@@ -303,14 +303,9 @@ class GanttActivityInfo
if ($this->iStyle == 1) {
// Make a 3D effect
$aImg->SetColor('white');
- $aImg->Line(
- $aXLeft,
- $yTop+1,
- $aXRight,
- $yTop+1
- );
+ $aImg->Line($aXLeft, $yTop+1, $aXRight, $yTop+1);
}
-
+
for ($i=0; $i < $n; ++$i) {
if ($this->iStyle == 1) {
// Make a 3D effect
@@ -319,7 +314,7 @@ class GanttActivityInfo
}
$x += $this->iLeftColMargin;
$txt->Set($this->iTitles[$i]);
-
+
// Adjust the text anchor position according to the choosen alignment
$xp = $x;
if ($this->iHeaderAlign == 'center') {
@@ -327,7 +322,7 @@ class GanttActivityInfo
} elseif ($this->iHeaderAlign == 'right') {
$xp = $x +$this->iWidth[$i]-$this->iRightColMargin;
}
-
+
$txt->Stroke($aImg, $xp, $yTop+$this->iTopHeaderMargin);
$x += $this->iWidth[$i];
if ($i < $n-1) {
@@ -362,12 +357,12 @@ class GanttActivityInfo
//===================================================
class GanttGraph extends Graph
{
- public $scale; // Public accessible
+ public $scale; // Public accessible
public $hgrid=null;
- private $iObj=array(); // Gantt objects
- private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels
- private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label
- private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN
+ private $iObj=array(); // Gantt objects
+ private $iLabelHMarginFactor=0.2; // 10% margin on each side of the labels
+ private $iLabelVMarginFactor=0.4; // 40% margin on top and bottom of label
+ private $iLayout=GANTT_FROMTOP; // Could also be GANTT_EVEN
private $iSimpleFont = FF_FONT1;
private $iSimpleFontSize=11;
private $iSimpleStyle=GANTT_RDIAG;
@@ -376,13 +371,14 @@ class GanttGraph extends Graph
private $iSimpleProgressBkgColor='gray';
private $iSimpleProgressColor='darkgreen';
private $iSimpleProgressStyle=GANTT_SOLID;
+ private $iZoomFactor = 1.0;
//---------------
// CONSTRUCTOR
// Create a new gantt graph
- public function GanttGraph($aWidth=0, $aHeight=0, $aCachedName="", $aTimeOut=0, $aInline=true)
+ public function __construct($aWidth=0, $aHeight=0, $aCachedName="", $aTimeOut=0, $aInline=true)
{
- // Backward compatibility
+ // Backward compatibility
if ($aWidth == -1) {
$aWidth=0;
}
@@ -394,18 +390,18 @@ class GanttGraph extends Graph
JpgraphError::RaiseL(6002);
//("You can't specify negative sizes for Gantt graph dimensions. Use 0 to indicate that you want the library to automatically determine a dimension.");
}
- Graph::Graph($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline);
+ parent::__construct($aWidth, $aHeight, $aCachedName, $aTimeOut, $aInline);
$this->scale = new GanttScale($this->img);
// Default margins
$this->img->SetMargin(15, 17, 25, 15);
$this->hgrid = new HorizontalGridLine();
-
+
$this->scale->ShowHeaders(GANTT_HWEEK|GANTT_HDAY);
$this->SetBox();
}
-
+
//---------------
// PUBLIC METHODS
@@ -430,80 +426,80 @@ class GanttGraph extends Graph
$num = count($data);
for ($i=0; $i < $num; ++$i) {
switch ($data[$i][1]) {
- case ACTYPE_GROUP:
- // Create a slightly smaller height bar since the
- // "wings" at the end will make it look taller
- $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 8);
- $a->title->SetFont($this->iSimpleFont, FS_BOLD, $this->iSimpleFontSize);
- $a->rightMark->Show();
- $a->rightMark->SetType(MARK_RIGHTTRIANGLE);
- $a->rightMark->SetWidth(8);
- $a->rightMark->SetColor('black');
- $a->rightMark->SetFillColor('black');
-
- $a->leftMark->Show();
- $a->leftMark->SetType(MARK_LEFTTRIANGLE);
- $a->leftMark->SetWidth(8);
- $a->leftMark->SetColor('black');
- $a->leftMark->SetFillColor('black');
-
- $a->SetPattern(BAND_SOLID, 'black');
- $csimpos = 6;
- break;
-
- case ACTYPE_NORMAL:
- $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 10);
- $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
- $a->SetPattern($this->iSimpleStyle, $this->iSimpleColor);
- $a->SetFillColor($this->iSimpleBkgColor);
- // Check if this activity should have a constrain line
- $n = count($constrains);
- for ($j=0; $j < $n; ++$j) {
- if (empty($constrains[$j]) || (count($constrains[$j]) != 3)) {
- JpGraphError::RaiseL(6003, $j);
- //("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)");
- }
- if ($constrains[$j][0]==$data[$i][0]) {
- $a->SetConstrain($constrains[$j][1], $constrains[$j][2], 'black', ARROW_S2, ARROWT_SOLID);
- }
- }
+ case ACTYPE_GROUP:
+ // Create a slightly smaller height bar since the
+ // "wings" at the end will make it look taller
+ $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 8);
+ $a->title->SetFont($this->iSimpleFont, FS_BOLD, $this->iSimpleFontSize);
+ $a->rightMark->Show();
+ $a->rightMark->SetType(MARK_RIGHTTRIANGLE);
+ $a->rightMark->SetWidth(8);
+ $a->rightMark->SetColor('black');
+ $a->rightMark->SetFillColor('black');
- // Check if this activity have a progress bar
- $n = count($progress);
- for ($j=0; $j < $n; ++$j) {
- if (empty($progress[$j]) || (count($progress[$j]) != 2)) {
- JpGraphError::RaiseL(6004, $j);
- //("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)");
- }
- if ($progress[$j][0]==$data[$i][0]) {
- $a->progress->Set($progress[$j][1]);
- $a->progress->SetPattern(
- $this->iSimpleProgressStyle,
- $this->iSimpleProgressColor
- );
- $a->progress->SetFillColor($this->iSimpleProgressBkgColor);
- //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]);
+ $a->leftMark->Show();
+ $a->leftMark->SetType(MARK_LEFTTRIANGLE);
+ $a->leftMark->SetWidth(8);
+ $a->leftMark->SetColor('black');
+ $a->leftMark->SetFillColor('black');
+
+ $a->SetPattern(BAND_SOLID, 'black');
+ $csimpos = 6;
break;
- }
- }
- $csimpos = 6;
- break;
- case ACTYPE_MILESTONE:
- $a = new MileStone($data[$i][0], $data[$i][2], $data[$i][3]);
- $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
- $a->caption->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
- $csimpos = 5;
- break;
- default:
- die('Unknown activity type');
- break;
- }
+ case ACTYPE_NORMAL:
+ $a = new GanttBar($data[$i][0], $data[$i][2], $data[$i][3], $data[$i][4], '', 10);
+ $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
+ $a->SetPattern($this->iSimpleStyle, $this->iSimpleColor);
+ $a->SetFillColor($this->iSimpleBkgColor);
+ // Check if this activity should have a constrain line
+ $n = count($constrains);
+ for ($j=0; $j < $n; ++$j) {
+ if (empty($constrains[$j]) || (count($constrains[$j]) != 3)) {
+ JpGraphError::RaiseL(6003, $j);
+ //("Invalid format for Constrain parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Constrain-To,Constrain-Type)");
+ }
+ if ($constrains[$j][0]==$data[$i][0]) {
+ $a->SetConstrain($constrains[$j][1], $constrains[$j][2], 'black', ARROW_S2, ARROWT_SOLID);
+ }
+ }
+
+ // Check if this activity have a progress bar
+ $n = count($progress);
+ for ($j=0; $j < $n; ++$j) {
+ if (empty($progress[$j]) || (count($progress[$j]) != 2)) {
+ JpGraphError::RaiseL(6004, $j);
+ //("Invalid format for Progress parameter at index=$j in CreateSimple(). Parameter must start with index 0 and contain arrays of (Row,Progress)");
+ }
+ if ($progress[$j][0]==$data[$i][0]) {
+ $a->progress->Set($progress[$j][1]);
+ $a->progress->SetPattern(
+ $this->iSimpleProgressStyle,
+ $this->iSimpleProgressColor
+ );
+ $a->progress->SetFillColor($this->iSimpleProgressBkgColor);
+ //$a->progress->SetPattern($progress[$j][2],$progress[$j][3]);
+ break;
+ }
+ }
+ $csimpos = 6;
+ break;
+
+ case ACTYPE_MILESTONE:
+ $a = new MileStone($data[$i][0], $data[$i][2], $data[$i][3]);
+ $a->title->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
+ $a->caption->SetFont($this->iSimpleFont, FS_NORMAL, $this->iSimpleFontSize);
+ $csimpos = 5;
+ break;
+ default:
+ die('Unknown activity type');
+ break;
+ }
// Setup caption
$a->caption->Set($data[$i][$csimpos-1]);
- // Check if this activity should have a CSIM target?
+ // Check if this activity should have a CSIM target�?
if (!empty($data[$i][$csimpos])) {
$a->SetCSIMTarget($data[$i][$csimpos]);
$a->SetCSIMAlt($data[$i][$csimpos+1]);
@@ -517,13 +513,19 @@ class GanttGraph extends Graph
}
}
-
+ // Set user specified scale zoom factor when auto sizing is used
+ public function SetZoomFactor($aZoom)
+ {
+ $this->iZoomFactor = $aZoom;
+ }
+
+
// Set what headers should be shown
public function ShowHeaders($aFlg)
{
$this->scale->ShowHeaders($aFlg);
}
-
+
// Specify the fraction of the font height that should be added
// as vertical margin
public function SetLabelVMarginFactor($aVal)
@@ -536,8 +538,8 @@ class GanttGraph extends Graph
{
$this->iLabelVMarginFactor = $aVal;
}
-
-
+
+
// Add a new Gantt object
public function Add($aObject)
{
@@ -545,6 +547,8 @@ class GanttGraph extends Graph
$cl = $aObject[0];
if (class_exists('IconPlot', false) && ($cl instanceof IconPlot)) {
$this->AddIcon($aObject);
+ } elseif (class_exists('Text', false) && ($cl instanceof Text)) {
+ $this->AddText($aObject);
} else {
$n = count($aObject);
for ($i=0; $i < $n; ++$i) {
@@ -554,12 +558,32 @@ class GanttGraph extends Graph
} else {
if (class_exists('IconPlot', false) && ($aObject instanceof IconPlot)) {
$this->AddIcon($aObject);
+ } elseif (class_exists('Text', false) && ($aObject instanceof Text)) {
+ $this->AddText($aObject);
} else {
$this->iObj[] = $aObject;
}
}
}
+ public function StrokeTexts()
+ {
+ // Stroke any user added text objects
+ if ($this->texts != null) {
+ $n = count($this->texts);
+ for ($i=0; $i < $n; ++$i) {
+ if ($this->texts[$i]->iScalePosX !== null && $this->texts[$i]->iScalePosY !== null) {
+ $x = $this->scale->TranslateDate($this->texts[$i]->iScalePosX);
+ $y = $this->scale->TranslateVertPos($this->texts[$i]->iScalePosY);
+ $y -= $this->scale->GetVertSpacing()/2;
+ } else {
+ $x = $y = null;
+ }
+ $this->texts[$i]->Stroke($this->img, $x, $y);
+ }
+ }
+ }
+
// Override inherit method from Graph and give a warning message
public function SetScale($aAxisType, $aYMin=1, $aYMax=1, $aXMin=1, $aXMax=1)
{
@@ -581,7 +605,7 @@ class GanttGraph extends Graph
}
$this->scale->SetRange($aStart, $aEnd);
}
-
+
// Get the maximum width of the activity titles columns for the bars
// The name is lightly misleading since we from now on can have
// multiple columns in the label section. When this was first written
@@ -605,15 +629,17 @@ class GanttGraph extends Graph
}
return $m;
}
-
+
// Get the maximum height of the titles for the bars
public function GetMaxLabelHeight()
{
$m=10;
if ($this->iObj != null) {
$n = count($this->iObj);
+ // We can not include the title of GnttVLine since that title is stroked at the bottom
+ // of the Gantt bar and not in the activity title columns
for ($i=0; $i < $n; ++$i) {
- if (!empty($this->iObj[$i]->title)) {
+ if (!empty($this->iObj[$i]->title) && !($this->iObj[$i] instanceof GanttVLine)) {
$m=max($m, $this->iObj[$i]->title->GetHeight($this->img));
}
}
@@ -633,7 +659,7 @@ class GanttGraph extends Graph
}
return $m;
}
-
+
// Get the maximum used line number (vertical position) for bars
public function GetBarMaxLineNumber()
{
@@ -647,7 +673,7 @@ class GanttGraph extends Graph
}
return $m;
}
-
+
// Get the minumum and maximum used dates for all bars
public function GetBarMinMax()
{
@@ -691,21 +717,33 @@ class GanttGraph extends Graph
// The predefined left, right, top, bottom margins.
// Note that the top margin might incease depending on
// the title.
+ $hadj = $vadj = 0;
+ if ($this->doshadow) {
+ $hadj = $this->shadow_width;
+ $vadj = $this->shadow_width+5;
+ }
+
$lm = $this->img->left_margin;
- $rm = $this->img->right_margin;
+ $rm = $this->img->right_margin +$hadj;
$rm += 2 ;
$tm = $this->img->top_margin;
- $bm = $this->img->bottom_margin;
- $bm += 1;
- if (BRAND_TIMING) {
- $bm += 10;
+ $bm = $this->img->bottom_margin + $vadj;
+ $bm += 2;
+
+ // If there are any added GanttVLine we must make sure that the
+ // bottom margin is wide enough to hold a title.
+ $n = count($this->iObj);
+ for ($i=0; $i < $n; ++$i) {
+ if ($this->iObj[$i] instanceof GanttVLine) {
+ $bm = max($bm, $this->iObj[$i]->title->GetHeight($this->img)+10);
+ }
}
-
+
// First find out the height
$n=$this->GetBarMaxLineNumber()+1;
$m=max($this->GetMaxLabelHeight(), $this->GetMaxBarAbsHeight());
$height=$n*((1+$this->iLabelVMarginFactor)*$m);
-
+
// Add the height of the scale titles
$h=$this->scale->GetHeaderHeight();
$height += $h;
@@ -743,50 +781,47 @@ class GanttGraph extends Graph
// If the days are displayed we also need to figure out
// how much space each day's title will require.
switch ($this->scale->day->iStyle) {
- case DAYSTYLE_LONG:
- $txt = "Monday";
- break;
- case DAYSTYLE_LONGDAYDATE1:
- $txt = "Monday 23 Jun";
- break;
- case DAYSTYLE_LONGDAYDATE2:
- $txt = "Monday 23 Jun 2003";
- break;
- case DAYSTYLE_SHORT:
- $txt = "Mon";
- break;
- case DAYSTYLE_SHORTDAYDATE1:
+ case DAYSTYLE_LONG:
+ $txt = "Monday";
+ break;
+ case DAYSTYLE_LONGDAYDATE1:
+ $txt = "Monday 23 Jun";
+ break;
+ case DAYSTYLE_LONGDAYDATE2:
+ $txt = "Monday 23 Jun 2003";
+ break;
+ case DAYSTYLE_SHORT:
+ $txt = "Mon";
+ break;
+ case DAYSTYLE_SHORTDAYDATE1:
$txt = "Mon 23/6";
- break;
- case DAYSTYLE_SHORTDAYDATE2:
- $txt = "Mon 23 Jun";
- break;
- case DAYSTYLE_SHORTDAYDATE3:
- $txt = "Mon 23";
- break;
- case DAYSTYLE_SHORTDATE1:
+ break;
+ case DAYSTYLE_SHORTDAYDATE2:
+ $txt = "Mon 23 Jun";
+ break;
+ case DAYSTYLE_SHORTDAYDATE3:
+ $txt = "Mon 23";
+ break;
+ case DAYSTYLE_SHORTDATE1:
$txt = "23/6";
- break;
- case DAYSTYLE_SHORTDATE2:
- $txt = "23 Jun";
- break;
- case DAYSTYLE_SHORTDATE3:
- $txt = "Mon 23";
- break;
- case DAYSTYLE_SHORTDATE4:
- $txt = "88";
- break;
- case DAYSTYLE_CUSTOM:
- $txt = date(
- $this->scale->day->iLabelFormStr,
- strtotime('2003-12-20 18:00')
- );
- break;
- case DAYSTYLE_ONELETTER:
- default:
- $txt = "M";
- break;
- }
+ break;
+ case DAYSTYLE_SHORTDATE2:
+ $txt = "23 Jun";
+ break;
+ case DAYSTYLE_SHORTDATE3:
+ $txt = "Mon 23";
+ break;
+ case DAYSTYLE_SHORTDATE4:
+ $txt = "88";
+ break;
+ case DAYSTYLE_CUSTOM:
+ $txt = date($this->scale->day->iLabelFormStr, strtotime('2003-12-20 18:00'));
+ break;
+ case DAYSTYLE_ONELETTER:
+ default:
+ $txt = "M";
+ break;
+ }
$fw = $this->scale->day->GetStrWidth($this->img, $txt)+6;
}
@@ -797,24 +832,24 @@ class GanttGraph extends Graph
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch ($this->scale->hour->iStyle) {
- case HOURSTYLE_HMAMPM:
- $txt = '12:00pm';
- break;
- case HOURSTYLE_H24:
- // 13
- $txt = '24';
- break;
- case HOURSTYLE_HAMPM:
- $txt = '12pm';
- break;
- case HOURSTYLE_CUSTOM:
- $txt = date($this->scale->hour->iLabelFormStr, strtotime('2003-12-20 18:00'));
- break;
- case HOURSTYLE_HM24:
- default:
- $txt = '24:00';
- break;
- }
+ case HOURSTYLE_HMAMPM:
+ $txt = '12:00pm';
+ break;
+ case HOURSTYLE_H24:
+ // 13
+ $txt = '24';
+ break;
+ case HOURSTYLE_HAMPM:
+ $txt = '12pm';
+ break;
+ case HOURSTYLE_CUSTOM:
+ $txt = date($this->scale->hour->iLabelFormStr, strtotime('2003-12-20 18:00'));
+ break;
+ case HOURSTYLE_HM24:
+ default:
+ $txt = '24:00';
+ break;
+ }
$hfw = $this->scale->hour->GetStrWidth($this->img, $txt)+6;
$mw = $hfw;
@@ -823,15 +858,15 @@ class GanttGraph extends Graph
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch ($this->scale->minute->iStyle) {
- case HOURSTYLE_CUSTOM:
- $txt2 = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55'));
- break;
- case MINUTESTYLE_MM:
- default:
- $txt2 = '15';
- break;
- }
-
+ case HOURSTYLE_CUSTOM:
+ $txt2 = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55'));
+ break;
+ case MINUTESTYLE_MM:
+ default:
+ $txt2 = '15';
+ break;
+ }
+
$mfw = $this->scale->minute->GetStrWidth($this->img, $txt2)+6;
$n2 = ceil(60 / $this->scale->minute->GetIntervall());
$mw = $n2 * $mfw;
@@ -852,15 +887,15 @@ class GanttGraph extends Graph
// of space. We therefore create a typical string for the choosen format
// and determine the length of that string.
switch ($this->scale->minute->iStyle) {
- case HOURSTYLE_CUSTOM:
- $txt = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55'));
- break;
- case MINUTESTYLE_MM:
- default:
- $txt = '15';
- break;
- }
-
+ case HOURSTYLE_CUSTOM:
+ $txt = date($this->scale->minute->iLabelFormStr, strtotime('2005-05-15 18:55'));
+ break;
+ case MINUTESTYLE_MM:
+ default:
+ $txt = '15';
+ break;
+ }
+
$mfw = $this->scale->minute->GetStrWidth($this->img, $txt)+6;
$n = ceil(60 / $this->scale->TimeToMinutes($this->scale->minute->GetIntervall()));
$mw = $n * $mfw;
@@ -880,7 +915,7 @@ class GanttGraph extends Graph
} else {
$fsw += 4;
}
-
+
$ww = $fsw*$this->scale->week->GetFontWidth($this->img);
if (7*$fw < $ww) {
$fw = ceil($ww/7);
@@ -888,8 +923,8 @@ class GanttGraph extends Graph
}
if (!$this->scale->IsDisplayDay() && !$this->scale->IsDisplayHour() &&
- !(($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
- $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek())) {
+ !(($this->scale->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
+ $this->scale->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) && $this->scale->IsDisplayWeek())) {
// If we don't display the individual days we can shrink the
// scale a little bit. This is a little bit pragmatic at the
// moment and should be re-written to take into account
@@ -919,6 +954,8 @@ class GanttGraph extends Graph
// Add the width of the vertivcal divider line
$titlewidth += $this->scale->divider->iWeight*2;
+ // Adjust the width by the user specified zoom factor
+ $fw *= $this->iZoomFactor;
// Now get the total width taking
// titlewidth, left and rigt margin, dayfont size
@@ -952,7 +989,7 @@ class GanttGraph extends Graph
}
$w = array();
$m = $this->scale->actinfo->iLeftColMargin + $this->scale->actinfo->iRightColMargin;
-
+
for ($i=0; $i < $n; ++$i) {
$tmp = $this->iObj[$i]->title->GetColWidth($this->img, $m);
$nn = count($tmp);
@@ -971,7 +1008,7 @@ class GanttGraph extends Graph
public function Stroke($aStrokeFileName="")
{
- // If the filename is the predefined value = '_csim_special_'
+ // If the filename is the predefined value = '_csim_special_'
// we assume that the call to stroke only needs to do enough
// to correctly generate the CSIM maps.
// We use this variable to skip things we don't strictly need
@@ -1003,7 +1040,7 @@ class GanttGraph extends Graph
if ($this->scale->iVertLines == -1) {
$this->scale->iVertLines = $this->GetBarMaxLineNumber()+1;
}
-
+
$maxwidth=max(
$this->scale->actinfo->GetWidth($this->img),
max(
@@ -1050,12 +1087,15 @@ class GanttGraph extends Graph
$this->StrokeIcons();
}
+ // Stroke all added user texts
+ $this->StrokeTexts();
+
// Should we do any final image transformation
if ($this->iImgTrans) {
if (!class_exists('ImgTrans', false)) {
require_once('jpgraph_imgtrans.php');
}
-
+
$tform = new ImgTrans($this->img->img);
$this->img->img = $tform->Skew3D(
$this->iImgTransHorizon,
@@ -1067,8 +1107,8 @@ class GanttGraph extends Graph
$this->iImgTransBorder
);
}
-
-
+
+
// If the filename is given as the special "__handle"
// then the image handler is returned and the image is NOT
// streamed back
@@ -1093,7 +1133,7 @@ class GanttGraph extends Graph
// Stroke all constrains
for ($i=0; $i < $n; ++$i) {
- // Some gantt objects may not have constraints associated with them
+ // Some gantt objects may not have constraints associated with them
// for example we can add IconPlots which doesn't have this property.
if (empty($this->iObj[$i]->constraints)) {
continue;
@@ -1120,50 +1160,50 @@ class GanttGraph extends Graph
$c2 = $this->iObj[$targetobj]->iConstrainPos;
if (count($c1) == 4 && count($c2) == 4) {
switch ($this->iObj[$i]->constraints[$k]->iConstrainType) {
- case CONSTRAIN_ENDSTART:
- if ($c1[1] < $c2[1]) {
- $link = new GanttLink($c1[2], $c1[3], $c2[0], $c2[1]);
- } else {
- $link = new GanttLink($c1[2], $c1[1], $c2[0], $c2[3]);
- }
- $link->SetPath(3);
- break;
- case CONSTRAIN_STARTEND:
- if ($c1[1] < $c2[1]) {
- $link = new GanttLink($c1[0], $c1[3], $c2[2], $c2[1]);
- } else {
- $link = new GanttLink($c1[0], $c1[1], $c2[2], $c2[3]);
- }
- $link->SetPath(0);
- break;
- case CONSTRAIN_ENDEND:
- if ($c1[1] < $c2[1]) {
- $link = new GanttLink($c1[2], $c1[3], $c2[2], $c2[1]);
- } else {
- $link = new GanttLink($c1[2], $c1[1], $c2[2], $c2[3]);
- }
- $link->SetPath(1);
- break;
- case CONSTRAIN_STARTSTART:
- if ($c1[1] < $c2[1]) {
- $link = new GanttLink($c1[0], $c1[3], $c2[0], $c2[1]);
- } else {
- $link = new GanttLink($c1[0], $c1[1], $c2[0], $c2[3]);
- }
- $link->SetPath(3);
- break;
- default:
- JpGraphError::RaiseL(6009, $this->iObj[$i]->iVPos, $vpos);
-//('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos);
- break;
- }
+ case CONSTRAIN_ENDSTART:
+ if ($c1[1] < $c2[1]) {
+ $link = new GanttLink($c1[2], $c1[3], $c2[0], $c2[1]);
+ } else {
+ $link = new GanttLink($c1[2], $c1[1], $c2[0], $c2[3]);
+ }
+ $link->SetPath(3);
+ break;
+ case CONSTRAIN_STARTEND:
+ if ($c1[1] < $c2[1]) {
+ $link = new GanttLink($c1[0], $c1[3], $c2[2], $c2[1]);
+ } else {
+ $link = new GanttLink($c1[0], $c1[1], $c2[2], $c2[3]);
+ }
+ $link->SetPath(0);
+ break;
+ case CONSTRAIN_ENDEND:
+ if ($c1[1] < $c2[1]) {
+ $link = new GanttLink($c1[2], $c1[3], $c2[2], $c2[1]);
+ } else {
+ $link = new GanttLink($c1[2], $c1[1], $c2[2], $c2[3]);
+ }
+ $link->SetPath(1);
+ break;
+ case CONSTRAIN_STARTSTART:
+ if ($c1[1] < $c2[1]) {
+ $link = new GanttLink($c1[0], $c1[3], $c2[0], $c2[1]);
+ } else {
+ $link = new GanttLink($c1[0], $c1[1], $c2[0], $c2[3]);
+ }
+ $link->SetPath(3);
+ break;
+ default:
+ JpGraphError::RaiseL(6009, $this->iObj[$i]->iVPos, $vpos);
+ //('Unknown constrain type specified from row='.$this->iObj[$i]->iVPos.' to row='.$vpos);
+ break;
+ }
$link->SetColor($this->iObj[$i]->constraints[$k]->iConstrainColor);
$link->SetArrow(
$this->iObj[$i]->constraints[$k]->iConstrainArrowSize,
$this->iObj[$i]->constraints[$k]->iConstrainArrowType
);
-
+
$link->Stroke($this->img);
}
}
@@ -1176,7 +1216,7 @@ class GanttGraph extends Graph
if (!$this->iHasStroked) {
$this->Stroke(_CSIM_SPECIALFILE);
}
-
+
$csim = $this->title->GetCSIMAreas();
$csim .= $this->subtitle->GetCSIMAreas();
$csim .= $this->subsubtitle->GetCSIMAreas();
@@ -1193,19 +1233,19 @@ class GanttGraph extends Graph
// CLASS PredefIcons
// Description: Predefined icons for use with Gantt charts
//===================================================
-DEFINE('GICON_WARNINGRED', 0);
-DEFINE('GICON_TEXT', 1);
-DEFINE('GICON_ENDCONS', 2);
-DEFINE('GICON_MAIL', 3);
-DEFINE('GICON_STARTCONS', 4);
-DEFINE('GICON_CALC', 5);
-DEFINE('GICON_MAGNIFIER', 6);
-DEFINE('GICON_LOCK', 7);
-DEFINE('GICON_STOP', 8);
-DEFINE('GICON_WARNINGYELLOW', 9);
-DEFINE('GICON_FOLDEROPEN', 10);
-DEFINE('GICON_FOLDER', 11);
-DEFINE('GICON_TEXTIMPORTANT', 12);
+define('GICON_WARNINGRED', 0);
+define('GICON_TEXT', 1);
+define('GICON_ENDCONS', 2);
+define('GICON_MAIL', 3);
+define('GICON_STARTCONS', 4);
+define('GICON_CALC', 5);
+define('GICON_MAGNIFIER', 6);
+define('GICON_LOCK', 7);
+define('GICON_STOP', 8);
+define('GICON_WARNINGYELLOW', 9);
+define('GICON_FOLDEROPEN', 10);
+define('GICON_FOLDER', 11);
+define('GICON_TEXTIMPORTANT', 12);
class PredefIcons
{
@@ -1226,283 +1266,283 @@ class PredefIcons
return Image::CreateFromString(base64_decode($this->iBuiltinIcon[$aIdx][1]));
}
- public function PredefIcons()
+ public function __construct()
{
//==========================================================
// warning.png
//==========================================================
$this->iBuiltinIcon[0][0]= 1043 ;
$this->iBuiltinIcon[0][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
- 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'.
- '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'.
- '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'.
- 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'.
- 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'.
- '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'.
- 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'.
- 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'.
- 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'.
- 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'.
- 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'.
- 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'.
- 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAA'.
+ 'B3RJTUUH0wgKFSgilWPhUQAAA6BJREFUeNrtl91rHFUYh5/3zMx+Z5JNUoOamCZNaqTZ6IWIkqRiQWmi1IDetHfeiCiltgXBP8AL'.
+ '0SIUxf/AvfRSBS9EKILFFqyIH9CEmFZtPqrBJLs7c+b1YneT3WTTbNsUFPLCcAbmzPt73o9zzgzs2Z793231UOdv3w9k9Z2uzOdA'.
+ '5+2+79yNeL7Hl7hw7oeixRMZ6PJM26W18DNAm/Vh7lR8fqh97NmMF11es1iFpMATqdirwMNA/J4DpIzkr5YsAF1PO6gIMYHRdPwl'.
+ 'oO2elmB+qH3sm7XozbkgYvy8SzYnZPtcblyM6I+5z3jQ+0vJfgpEu56BfI9vUkbyi2HZd1QJoeWRiAjBd4SDCW8SSAOy6wBHMzF7'.
+ 'YdV2A+ROuvRPLfHoiSU0EMY/cDAIhxJeGngKaN1VgHyPL7NBxI1K9P4QxBzw3K1zJ/zkG8B9uwaQ7/HNsRZv9kohBGD0o7JqMYS/'.
+ '/ynPidQw/LrBiPBcS/yFCT95DvB2BWAy4575PaQbQKW+tPd3GCItu2odKI++YxiKu0d26oWmAD7paZU/rLz37VqIijD2YbnzNBBE'.
+ 'IBHf8K8qjL7vYhCGErEU8CTg3xXAeMp96GrJEqkyXkm9Bhui1xfsunjdGhcYLq+IzjsGmBt5YH/cmJkFq6gIqlon3u4LxdKGuCIo'.
+ 'Qu41g0E41po+2R33Xt5uz9kRIB2UTle7PnfKrROP1HD4sRjZlq0lzhwoZ6rDNeTi3nEg1si/7FT7kYQbXS6E5E65tA5uRF9tutq0'.
+ 'K/VwAF+/FbIYWt6+tjQM/AqUms7A4Wy6d7YSfSNxgMmzi0ycWWworio4QJvj4LpuL5BqugTnXzzqJsJwurrlNhJXFaavW67NRw3F'.
+ 'q+aJcCQVe9fzvJGmAY7/dPH0gi0f64OveGxa+usCuQMeZ0+kt8BVrX+qPO9Bzx0MgqBvs+a2PfDdYIf+WAjXU1ub4tqNaPPzRs8A'.
+ 'blrli+WVn79cXn0cWKl+tGx7HLc7pu3CSmnfitL+l1UihAhwjFkPQev4K/fSABjBM8JCaFuurJU+rgW41SroA8aNMVNAFtgHJCsn'.
+ 'XGy/58QVxAC9MccJtZ5kIzNlW440WrJ2ea4YPA9cAooA7i0A/gS+iqLoOpB1HOegqrYB3UBmJrAtQAJwpwPr1Ry92wVlgZsiYlW1'.
+ 'uX1gU36dymgqYxJIJJNJT1W9QqHgNwFQBGYqo94OwHZQUuPD7ACglSvc+5n5T9m/wfJJX4U9qzEAAAAASUVORK5CYII=' ;
//==========================================================
// edit.png
//==========================================================
$this->iBuiltinIcon[1][0]= 959 ;
$this->iBuiltinIcon[1][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'.
- 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'.
- 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'.
- 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'.
- 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'.
- 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'.
- 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'.
- 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'.
- 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'.
- 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'.
- 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'.
- 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'.
- 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAFgAWABY9j+ZuwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDAwbIEXOA6AAAAM8SURBVHicpdRPaBxlHMbx76ZvsmOTmm1dsEqQSIIsEmGVBAQjivEQ'.
+ 'PAUJngpWsAWlBw8egpQepKwplN4ULEG9CjkEyUFKlSJrWTG0IU51pCsdYW2ncUPjdtp9Z+f3vuNhu8nKbmhaf5cZeGc+PO8zf1Lc'.
+ 'm0KhkACICCKCMeaBjiLC0tLSnjNvPmuOHRpH0TZTU1M8zBi9wakzn7OFTs5sw8YYACYmJrre7HkeuVyu69qPF77hlT1XmZ0eQ03O'.
+ 'wOLJTvhBx1rLz18VmJ0eY+jVd2FxDkKXnvYLHgb97OgLzE4ON9Hzc1B1QaQzsed5O0Lta3Ec89OnR5h5McfQ+Mw2qgQUnfBOPbZ3'.
+ 'bK3l+xOvMT0+3ERLp5FNF6UEjcL32+DdVmGt5WLhDYYPZrbRqreFumXwql0S3w9tnDvLWD5PZigPpdOwuYpSCo3C8wU3UHxQdHbf'.
+ 'cZIkNM6dxcnlUM4k1eUFMlUPpUADbpkttFarHe6oYqeOr6yt4RzMQHYUcUsQVtGicHDwKprViuLDkkOtVnsHCHZVRVy/zcj1i5Af'.
+ 'h8AjdIts+hUcGcYPK3iBtKM3gD/uAzf/AdY2mmmVgy6X8YNNKmGIvyloPcB8SUin07RQ4EZHFdsdG0wkJEnEaHAJxvKEpSLeaokV'.
+ 'r4zWmhUZYLlY4b1D03y5eIEWCtS7vsciAgiIxkQRabWOrlQor66y4pUphoJb1jiO4uO5o0S3q6RSqVbiOmC7VCEgAhLSaDQ48dH7'.
+ 'vD46REY0iysegSjKQciRt99ib7qXwX0O+pG4teM6YKHLB9JMq4mTmF9/+AKA4wvLZByH7OgYL7+UY2qvw/7Bfg5kHiXjJFyv3CGO'.
+ 'Y1rof+BW4t/XLiPG0DCGr79d4XzRxRnIMn98huXSTYyJ6et1UNYQhRvcinpJq86H3wGPPPM0iBDd+QffD1g4eZjLvuG7S1Wef26E'.
+ 'J7L7eSx7gAHVg7V3MSbi6m/r93baBd6qQjerAJg/9Ql/XrvG0ON1+vv7GH3qSfY5fahUnSTpwZgIEQesaVXRPbHRG/xyJSAxMYlp'.
+ 'EOm71HUINiY7mGb95l/8jZCyQmJjMDGJjUmsdCROtZ0n/P/Z8v4Fs2MTUUf7vYoAAAAASUVORK5CYII=' ;
//==========================================================
// endconstrain.png
//==========================================================
$this->iBuiltinIcon[2][0]= 666 ;
$this->iBuiltinIcon[2][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
- 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'.
- 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'.
- 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'.
- 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'.
- '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'.
- '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'.
- 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'.
- 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ALEREILkh0+eQAAAIXSURBVHictZU9aFNRFMd/N81HX77aptJUWmp1LHRpIcWhg5sIDlUQ'.
+ 'LAXB4t7RRUpwEhy7iQ46CCIoSHcl0CFaoVARU2MFMYktadLXJNok7x2HtCExvuYFmnO4w/3gx+Gc/z1HKRTdMEdXqHbB/sgc/sic'.
+ 'nDoYAI8XwDa8o1RMLT+2hAsigtTvbIGVqhX46szUifBGswUeCPgAGB7QeLk0X4Ork+HOxo1VgSqGASjMqkn8W4r4vVtEgI/RRQEL'.
+ 'vaoGD85cl5V3nySR/S1mxWxab7f35PnntNyMJeRr9kCMqiHTy09EoeToLwggx6ymiMOD/VwcD7Oa/MHkcIiQx026WGYto5P/U+ZZ'.
+ '7gD0QwDuT5z9N3LrVPi0Xs543eQPKkRzaS54eviJIp4tMFQFMllAWN2qcRZHBnixNM8NYD162xq8u7ePSQ+GX2Pjwxc2dB2cLtB8'.
+ '7GgamCb0anBYBeChMtl8855CarclxU1gvViiUK4w2OMkNDnGeJ8bt9fH90yOnOkCwLFTwhzykhvtYzOWoBBbY//R3dbaNTYhf2RO'.
+ 'QpeuUMzv188MlwuHy0H13HnE48UzMcL0WAtUHX8OxZHoG1URiFw7rnLLCswuSPD1ulze/iWjT2PSf+dBXRFtVVGIvzqph0pQL7VE'.
+ 'avXYaXXxPwsnt0imdttCocMmZBdK7YU9D8wuNOW0nXc6QWzPsSa5naZ1beb9BbGB6dxGtMnXAAAAAElFTkSuQmCC' ;
//==========================================================
// mail.png
//==========================================================
$this->iBuiltinIcon[3][0]= 1122 ;
$this->iBuiltinIcon[3][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
- 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'.
- 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'.
- 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'.
- 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'.
- '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'.
- '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'.
- 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'.
- 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'.
- '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'.
- 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'.
- 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'.
- 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'.
- 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'.
- 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AJHAMfFvL9OU8AAAPfSURBVHictZRdaBRXFMd/987H7tbNx8aYtGCrEexDsOBDaKHFxirb'.
+ 'h0qhsiY0ykppKq1osI99C4H2WSiFFMHWUhXBrjRi0uCmtSEUGgP1QWqhWjGkoW7M1kTX3WRn5p4+TJJNGolQ6IXDnDtz+N0z/3PP'.
+ 'UWBIpdpYa23b9g09PZ2kUrOrvmUyGVKp1Ao/mUyi56YnVgWfO/P1CihAd/dJMpmaNROIRq8BkM1m0bH6TasC3j6QXgFdXI+DR6PR'.
+ 'JX/Pno8B+KLnMKqlpUU8z8MYs2RBEDzWf9J+0RcRbMdxGBsbw/fmCXwPMUEYID4iAVp8wIRmDIHMo4yHSIBSASKC+CWE0C/PF9jU'.
+ '3B6Cp+4M07C5FUtKGNvGwQJctPgIsgD2wRhEIqAMGB+UQYkHJgYYZD7P1HwVlmWhHcfhyk83KeRGUW4t6CgoG5SNUS4KBWgQDUov'.
+ '7AGlwYASBVqH0Bk49dXpCviVV3dw/tI1Bvr7kMIIlh0NYUpjlF0BAYvcxSXmEVLKceHSCJm+PnbueBHbtkNwTXUNBzo6aGpq4sSZ'.
+ 'GwT5H7BsF6Wdf1GWHQAoM0upeI9PT1yioS7B7tdaSdSuw7KsUGMAy7HYsmUztTW1nMwM0txssX1rlHjjS5jy/Uq2YkK/eJuLl6/z'.
+ 'x+1xkslW6mrixGIODx8EFSlEBC0+tmXT0NhA2763iEUjnLv4C8XpUbSbAB1mKkGJ3J83Od77HW5EszvZSqK2iljMIeJaRGNuJePF'.
+ '6mspY7BJ1DXwQnCd2fxGRq5OUCz8xt72dyhMZcn++Cu3xu9SKhdp2b4ZHWnAtTSxmIWlhcIjlksR3lNBYzlxZsb7+f7ne+xtSzOd'.
+ 'u83szH1OnThOPp/n+a0beeP1l4mvq+PU2Qyd+5PY1RuwlAqLYFaBfbTbyPSdfgaH77A//QF4f1O/vpr6RJyq+C5Kc/M8FbFxXItY'.
+ 'xOHDrvfo/fxLDnbsJBp5BowBReVWYAzabeTh5ABDw7cWoNNL3YYYNtSv57lnn6Z+Qx01VeuIuBa2DV1HD3H63BAPZu4u1WGpeLHq'.
+ 'Rh7+NcjA0O+0p4+CNwXigwnbWlQQdpuEpli+n+PIkcOc//YKuckJJFh2K2anrjFw+QZt6S6kPImIF/b+cqAJD1LihWAxC61twBTo'.
+ 'fPcQF/oGsVW5ovHQlavs2/8+uYnRVSOUgHAmmAClBIOBwKC0gPjhIRgEIX2wg7NnwpZW3d3d4vs+vu8TBMGK51rvPM9b8hdteZxd'.
+ 'LBbVR8feJDs0Rlv6GFKeXJ21rNRXESxMPR+CBUl0nN7PjtO+dye7Up/8v1I88bf/ixT/AO1/hZsqW+C6AAAAAElFTkSuQmCC' ;
//==========================================================
// startconstrain.png
//==========================================================
$this->iBuiltinIcon[4][0]= 725 ;
$this->iBuiltinIcon[4][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
- 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'.
- 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'.
- 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'.
- 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'.
- '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'.
- 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'.
- 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'.
- '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'.
- 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDgAACw4BQL7hQQAAAAd0SU1FB9ALEREICJp5fBkAAAJSSURBVHic3dS9a1NRGMfx77kxtS+xqS9FG6p1ER3qVJpBQUUc3CRU'.
+ 'BwURVLB1EAuKIP0THJQiiNRJBK3iJl18AyeltRZa0bbaJMbUNmlNSm5e7s25j0NqpSSmyag/OMM9POdzDuflwn8djz8gClVRrVEV'.
+ 'ur4Bl1FTNSzLrSS6vbml0jUUwSXj8Qfk3PkLtLW2AeBIybmrgz3+gFzpucjlE4f4btuFTuWuCF5XDr3a3UPf6cM8GQvxzbsRAJdh'.
+ 'ScfxSywml5j7mVypN0eGEJ0tebIre+zxB6Tv7jPReS2hREpOvpmUXU+H5eC913JnNCSRVE60pUVbWoZjprR39Yq70bdqj4pW7PEH'.
+ '5FpvL9e79jOTTHM7ssDL6CJZ08LbvAGnrpZg2mI2Z/MlZfN8IkxuSwu4V9+WIrj7zFlOHfXzKrLIi2SGh5ECKjnNVNxkQEc55vOw'.
+ 'rb6O8JLFdHyJ+ayFElUeHvjwkfteL/V7fKTSkFvIQE4DoLI2Mz/muTkTApcBKIwaN8pwIUrKw+ajWwDknAO0d/r4zFaMuRS63sWm'.
+ 'RoOdm+vRIriUYjKexrQV+t1o0YEVwfZSVJmD/dIABJuO0LG3lRFx0GOfiAELE9OgCrfU0XnIp5FwGLEy5WEAOxlR5uN+ARhP7GN3'.
+ '5w7Gv4bQI2+xpt4jjv2nWBmIlcExE2vDAHYioszBZXw6CPE4ADoWVHmd/tuwlZR9eXYyoszBfpiNQqaAOU5+TXRN+DeeenADPT9b'.
+ 'EVgKVsutKPl0TGWGhwofoquaoKK4apsq/tH/e/kFwBMXLgAEKK4AAAAASUVORK5CYII=' ;
//==========================================================
// calc.png
//==========================================================
$this->iBuiltinIcon[5][0]= 589 ;
$this->iBuiltinIcon[5][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'.
- 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'.
- 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'.
- '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'.
- 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'.
- 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'.
- 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'.
- 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAA4AIwBbgMF12wAAAAlwSFlz'.
+ 'AAALEQAACxEBf2RfkQAAAAd0SU1FB9AHBxQeFsqn0wQAAAHKSURBVHicnZWff+RAGIef3U/gcOEgUAgUCgcLhYXCwsHBQeGgUDgs'.
+ 'FgMHB4VA/4Bg4XChWFgIFIqBwkJhsRAYeOGF+TQHmWSTTbKd9pU37/x45jvfTDITXEynAbdWKVQB0NazcVm0alcL4rJaRVzm+w/e'.
+ '3iwAkzbYRcnnYgI04GCvsxxSPabYaEdt2Ra6D0atcvvvDmyrMWBX1zPq2ircP/Tk98DiJtjV/fim6ziOCL6dDHZNhxQ3arIMsox4'.
+ 'vejleL2Ay9+jaw6A+4OSICG2cacGKhsGxg+CxeqAQS0Y7BYJvowq7iGMOhXHEfzpvpQkA9bLKgOgWKt+4Lo1mM9hs9m17QNsJ70P'.
+ 'Fjc/O52joogoX8MZKiBiAFxd9Z1vcj9wfSpUlDRNMcYQxzFpmnJ0FPH8nDe1MQaWSz9woQpWSZKEojDkeaWoKAyr1tlu+s48wfVx'.
+ 'u7n5i7jthmGIiEGcT+36PP+gFeJrxWLhb0UA/lb4ggGs1T0rZs0zwM/ZjNfilcIY5tutPxgOW3F6dUX464LrKILLiw+A7WErrl+2'.
+ 'rABG1EL/BilZP8DjU2uR4U+2E49P1Z8QJmNXUzl24A9GBT0IruCfi86d9x+D12RGzt+pNAAAAABJRU5ErkJggg==' ;
//==========================================================
// mag.png
//==========================================================
$this->iBuiltinIcon[6][0]= 1415 ;
$this->iBuiltinIcon[6][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
- 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'.
- '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'.
- 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'.
- 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'.
- 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'.
- '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'.
- 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'.
- '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'.
- 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'.
- 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'.
- 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'.
- 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'.
- 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'.
- 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'.
- 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'.
- 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'.
- 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'.
- 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlz'.
+ 'AAALDAAACwwBP0AiyAAAAAd0SU1FB9ALDxEWDY6Ul+UAAAUESURBVHicdZVrbFRFGIafsyyF0nalV1R6WiggaAptlzsr1OgEogmC'.
+ '0IgoBAsBgkIrBAPEhBj/AP6xRTCUFEwRI4jcgsitXMrFCJptJWvBNpXYbbXtbtttt6e7e86ec/yxadlCfZPJZDIz73zzzjfvR2VL'.
+ 'F7U+hf0HD2JduIzTFy6SlJRkPtkcDgdCCE65OxFC8NPV6wghyM7OptankJ2dzbSC5QghEEIgCSHog9PpNAF27dlN6miZuPgElB4/'.
+ 'nmY3O7ZtByA1NVUCkGWZweD1eklJScESTbqxuIjrd+/x6uIl5M19hSy7nfGOeUxf+g7VjU1sKi7C4/GYsiyz7tAJAD4/cRaA1tZW'.
+ 'AHIPnECUVGD1+/3U19ebG4uLeHf1akamjsIwoVnVCOvQEdLoVILYYmMo3PIxSBJflpSaDX5FAmju1QAYv/8k/s8+wLVxOU0jR2LZ'.
+ '8sMFAApWrCApbRRDrRZirBYSLBKaoRPQw3SFernf2sav7T0Ubt4KwL4FMwF4Vu8FoHBCKgCzDhwHwLIhZ7y5a89u4m2JhA0wTdDC'.
+ 'OrphEjJMNElCHxKDEjaobmvlfo/Krj27CQQCJsCGJW8C0KXqAMxMiosQA8hZWcTFx9OsaniDKh1qmG7VoFsL0x0K06kbeAMhWpRe'.
+ '/KpG+gwHAKUnz7Dz3BUMw6DK18nuw99wt0Nh6VdHI8RJicmETQgFg7SFwjSrGv+oKp6ghldV6dZ0ugJBlF6FmCESQ2w2AIqXLsan'.
+ 'BrFYLJTnTCBrdBqveeopWZiPFaBHUegJhegMqGgxEkHDwB/UaQ9rdIV06v0+TD2EEQjQFtAY0dsNgNvt5sialQAIIXh7wQKuVf6J'.
+ 'gTsSccPDWlQstClBGjr9eHpVWvUQncEwdYEedF8noQ4vmYmpZMTH0nTvDn25vLbrNmu7bvfnsYEbAMnhcPDgwQPzUo2LJusw/mhp'.
+ 'QwlHNO0KBAnoIfxtrcQMT2De1Mm891wyUzNlUlJSpIyMDBobGzlzr5rFM/Koq6vrP8ASGxsLwPmKcvIShjPGZiPOakE3VFB8hHwd'.
+ 'vJAxhrk5L7Ly+RQuH/sWgPdXrwFg/6HDFBUsIj09nehfbAWwPWOT9n5RYhqGwarNWxkRM5TRCfF4U1PQsDDJFk9uYhwXvzvKjm3b'.
+ 'KSsro3DJInNW5RXp7u2bAKSlpeH1esnPz6eqqgqLpmmcr3Fht9ulfaV7mZk1Bs+lM6T1djM9fhg5egDPpTNMy5TZsW07kydPYdWM'.
+ 'aXx96ixOp9O8cfUa80srmDpjOgAulytiQqZpMnvObLbt/JTtHxXj9/tRVdU0DGOAufRpevPDTeac0hJyc3NxOOawfv161lVWS6eX'.
+ 'z+9/UOCxu1VWVvaTRGv16NFfjB2bNeAQp9NpTpmSM4DcbrdL0WsGDKLRR+52uwe1yP8jb2lpYfikyY9t80n03UCWZeaXVjw1f+zs'.
+ 'Oen+/d+pqanhzp2fKSsrw+l0mi6XiyPl5ZGITdN8fAVJwjRNJEmi1qfw1kw7siyTnJxMe3s71dXV3GpoZO64DG41NPJylvxU5D/e'.
+ 'qJKsfWQD9IkaZ2RmUvr9aV4aGYcQgjfO3aWoYBF5eXm4ewIsu/CbdPz1aWb0/p1bNoOrQxlUiuiaFo3c3FyEEOx9+C9CCD6paaTW'.
+ 'p/TXyYkTJ0Xe59jf7QOyAKDWp/QXxcFQ61P4pT3ShBBcvnUHIQTjxmX19/8BCeVg+/GPpskAAAAASUVORK5CYII=' ;
//==========================================================
// lock.png
//==========================================================
$this->iBuiltinIcon[7][0]= 963 ;
$this->iBuiltinIcon[7][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
- 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'.
- 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'.
- 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'.
- 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'.
- 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'.
- 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'.
- 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'.
- 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'.
- 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'.
- 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'.
- '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'.
- 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALCwAACwsBbQSEtwAAAAd0SU1FB9AKAw0XDmwMOwIAAANASURBVHic7ZXfS1t3GMY/3+PprI7aisvo2YU6h6ATA8JW4rrlsF4U'.
+ 'qiAsF9mhl0N2cYTRy9G/wptAYWPD9iJtRy5asDe7cYFmyjaXOLaMImOrmkRrjL9yTmIS3120JybWQgfb3R74wuc8Lzw858vLOUpE'.
+ 'OK6pqSm2trbY39+nu7tbPHYch7m5OcLhMIA67kWj0aMQEWk6tm17rNm2LSIie3t7ksvlJJ1OSyqVkls3Z8SyLMnlcqTTaVKpFLdu'.
+ 'zmBZVj1HeY2VUti2TSQSQSml2bZdi0QirK2tMT09zerqKtlslqGhISYnJ4nHv2N+foFsNquOe9FotLlxOBwmk8lgWRbhcFgymYxY'.
+ 'liUi0mqaJoAuIi2macrdO7fFsizx3to0Te7euV1vrXtXEgqFmJmZYWVlhXK5LB4/U9kwDL784kYV0A3DYHd3m4sXRymXywKoRi8U'.
+ 'Ch01DgQCJBIJLMsiEAhIIpHw2uLz+eqtYrEYIqKZpimxWEyCwaCMjY01zYPBIJpXqVQqsby8TLVabWKA/v5+RkZGMAyDrq4ulFKH'.
+ 'HsfjcWZnZ+ns7KTRqwcnk0mKxSKFQqGJlVKtruuSTCYB6O3trW9UI/v9/iZPB/j8s2HOnX0FgHfeXpeffnzK+fWf+fijvhLs0PtG'.
+ 'D/n1OJ9+MsrlSwb3733DwMCAt1EyPj6uACYmJp56168NU6nUqFSE9nZdPE7+WqC/r4NKTagcCJVqDaUUB5VDAA4Pa9x7sMLlSwan'.
+ 'WjRmv13D7/erpaWlo604qOp88OF7LC48rPNosMq5Th+Dgxd4/XyA1rbzADi7j8jnf2P++wdcvSr8MJ/i8eomAKlUqn41OsDAQDeD'.
+ 'g++yuPCwzm/2vU8+n2a7sMFfj79mp7BBuVzioFSiXHJx3SKuW2Rzy0Up9dxnQVvODALQerqNRn4ZKe0Mvtc6TpzpmqbxalcY9Ato'.
+ '2v06t515C73YQftZB9GLnDrt4LoujuPgOA4Ui+C6yOpXJwZrJ7r/gv4P/u+D9W7fLxTz+1ScQxrZ3atRLaVxdjbY2d184R6/sLHe'.
+ 'opHP7/Do90Ua+WWUyezzZHObP/7cfX54/dowE1d66s8TV3oE+Mfn+L/zb4XmHPjRG9YjAAAAAElFTkSuQmCC' ;
//==========================================================
// stop.png
//==========================================================
$this->iBuiltinIcon[8][0]= 889 ;
$this->iBuiltinIcon[8][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
- 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'.
- 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'.
- 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'.
- 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'.
- 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'.
- 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'.
- 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'.
- 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'.
- 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'.
- 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'.
- 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9AJDwEvNyD6M/0AAAL2SURBVHic1ZTLaxVnGIefb2bO5OScHJN4oWrFNqcUJYoUEgU3/Qf6'.
+ 'F7gwCkIrvdBLUtqqiLhSg9bgBduFSHZdiG5ctkJ3xRDbUFwUmghNzBDanPGMkzOX79LFJGPMOSd204U/+Bbzvd/78F4H/ieJdoad'.
+ 'pZKxRFszAI/DcP0HazXY22v+HB01kee1PA/v3zfnjx4xgGnHcNZe7OvuNj+cOEF1ZATv5nUA4jhBSgmADCVWo8Ge2Of9wb18P/G7'.
+ 'oUXmYi30zqlTVEdGWLh1g2D6MYlKkXGE0Vl8aa2GEB149+4xXSzyoOIw/mimiZV/DPb25pFOj13A9gOMEChhUEqhVYqWKUk9QAUp'.
+ 'sT/P4s8PmKlUmNhQaIJbkDVqBbpw6wZ2zUc4Nm+ePku5p4eOrgpueQOFUoVCVxcD4+N07dpF9+5tVJeWGPBjhvr7WF1zC8ASgtcP'.
+ 'H8a7eZ1odh4sh50nzwCw9ZNh3M4Stutiu0X2nB/LyjZ6lcIbVTpdQU/jWVPzLADM8+ZGBRdtC7wrF/O7bR99iu26VL86iU4SAH4b'.
+ 'Po5d6AQhstMSvGyI4wS5FJBKSRwnzF8byx/u+PjzzMF1mfryQ1K/jnCahqp1xEopjFLoNEFJSRJHzF799gWHqa+/QKcSUXBI609f'.
+ 'Al5W4teQSiHDOipNUKnMI13RvnOXAIEKQixvGWya98SC560MFwPiqEG86JM8q79Q06lvhnOndy5/B6GPCUOMUu3BQgg8z0M3GmBZ'.
+ 'iGJn3v2VmsqnfzNx7FDueODuj8ROCFpjtG5TCmOYv32bJ09msP0ISydMfnAUgF8/O45RAA6WTPjlvXcB+Gn7FuRf/zAnNX6x3ARe'.
+ 'PSdmqL+P/YHkwMGDOGWDZTlQcNBRhPEComgB/YeHfq2InF1kLlXUOkpMbio1bd7aATRD/X0M1lPeSlM2vt2X1XBZjZnpLG2tmZO6'.
+ 'LbQVOIcP+HG2UauH3xgwBqOz9Cc3l1tC24Fz+MvUDroeGNb5if9H/1dM/wLPCYMw9fryKgAAAABJRU5ErkJggg==' ;
//==========================================================
// error.png
//==========================================================
$this->iBuiltinIcon[9][0]= 541 ;
$this->iBuiltinIcon[9][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
- 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
- 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'.
- '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'.
- 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'.
- 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'.
- 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'.
- 'iOsCHgAAAABJRU5ErkJggg==' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAMAAAC7IEhfAAAAaVBMVEX//////2Xy8mLl5V/Z2VvMzFi/v1WyslKlpU+ZmUyMjEh/'.
+ 'f0VyckJlZT9YWDxMTDjAwMDy8sLl5bnY2K/MzKW/v5yyspKlpYiYmH+MjHY/PzV/f2xycmJlZVlZWU9MTEXY2Ms/PzwyMjLFTjea'.
+ 'AAAAAXRSTlMAQObYZgAAAAFiS0dEAIgFHUgAAAAJcEhZcwAACxIAAAsSAdLdfvwAAAAHdElNRQfTCAkUMSj9wWSOAAABLUlEQVR4'.
+ '2s2U3ZKCMAxGjfzJanFAXFkUle/9H9JUKA1gKTN7Yy6YMjl+kNPK5rlZVSuxf1ZRnlZxFYAm93NnIKvR+MEHUgqBXx93wZGIUrSe'.
+ 'h+ctEgbpiMo3iQ4kioHCGxir/ZYUbr7AgPXs9bX0BCYM8vN/cPe8oQYzom3tVsSBMVHEoOJ5dm5F1RsIe9CtqGgRacCAkUvRtevT'.
+ 'e2pd6vOWF+gCuc/brcuhyARakBU9FgK5bUBWdHEH8tHpDsZnRTZQGzdLVvQ3CzyYZiTAmSIODEwzFCAdJopuvbpeZDisJ4pKEcjD'.
+ 'ijWPJhU1MjCo9dkYfiUVjQNTDKY6CVbR6A0niUSZjRwFanR0l9i/TyvGnFdqwStq5axMfDbyBksld/FUumvxS/Bd9VyJvQDWiiMx'.
+ 'iOsCHgAAAABJRU5ErkJggg==' ;
//==========================================================
// openfolder.png
//==========================================================
$this->iBuiltinIcon[10][0]= 2040 ;
$this->iBuiltinIcon[10][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'.
- 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'.
- 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'.
- 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'.
- 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'.
- 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'.
- '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'.
- 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'.
- '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'.
- 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'.
- 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'.
- 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'.
- 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'.
- 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'.
- 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'.
- 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'.
- 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'.
- 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'.
- 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'.
- 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'.
- 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'.
- 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'.
- 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'.
- 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'.
- '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'.
- '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'.
- 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'.
- 'dBntAAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABGdBTUEAALGPC/xhBQAAAAZiS0dEANAAtwClFht71AAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9AKDQ4RIXMeaLcAAAd1SURBVHicxZd7jBXVHcc/58zcvTNzH8vusqw8FsTsKiCUUh5WBZXG'.
+ 'GkOptmqwNWsWLKXFGlEpzZI0AWNKSy0WhDS22gJKtWlTsSRqzYIuLGB2WVvDIwQMZQMsy2OFfdzde+/OnHP6x907vJaFpjb9JZM5'.
+ 'c85Mfp/f9/s7Jxn4P4e41gtSyp78WGvtfdEAcqDFYUOH9HS0NhGk9tPb/ilSyp789UUB2AMuqhQy3Uzm7HGkE6W3dTNZMRI3EcWO'.
+ 'jf9ClLmWBT3dzW8jUsevWHCG3UpWl+IkHSxnbDh/Mcz12NevBcuWXTmf6TjnXvJ88gDmVB3pw3+nt3UzHa1NqMzBS2zqPLGFjtMN'.
+ 'ZNr3XdW+qyqwZcFk76HX/tHWfuQvyO4W7qhaHwL8efkMRlRUpPv7rqD0RrJ+FgAjLy1a20OIxZJEEuNCRfIApj+om4bGM3u2/sYU'.
+ '9J41d8973f3Dhg1pISTV1dXXBRNJxPGFCzhou+DCQrScZOkktNaeDZjamgeZ9MgiYmVDccvHhjAzJw0NTh8/alyZMaVJicp0iTHj'.
+ 'JpgNv38tjWUhhGROdbUL9W5/MH5XCkjlcibi+KIop5LVHLKEu8A/f4r286doa9pGrGwYAAsfqbbH3b8MgO/Nqgy6WvdbbXHMkEFJ'.
+ '4xUOMVEvaTZu3BgmvF4Yk4hz9rO/Ulr5cE9owae/rcGxohSOuiWkC2IjcIqKyPZm+OmCH7GhoZEF077EEzVVweAbJ+riEeO0Ey8y'.
+ 'UubqOHn0AOgMwvf59txnBrSp9dgxKmf/+kIP1NY8SFk0jh5ajmNHAWg5b2E5EexojGHjbiVRMoRMNs0LC+Yz46vTuH3enN7BI8fr'.
+ 'qFdo0BoVZNC9aVSQ4fNjBzEmQJiARxb+/AqYPMAVB5FsPU5v37g9OxgLhe14ZM5/ju052E6MNZvf5pmHHuLmmWOkEysxUtpGAtme'.
+ 'dtHTflJkezqQto3jFRnLssyf1jydxiiM7zNnye/c3ZsqLu2BN5fcMfzrv/hby1tPzmRUoihcTJ87CwQI2yLtDcIqsIjYUf51qBlf'.
+ 'OnScOSrdQUOMURkiXsLUzJnvbGhoBGDHH5cGyZLhOpYoNl5hqYnYEXOu5fDl9eYAHntx98n8hFHZcPHUuTSxSASAeK/CGIOxJJ0f'.
+ 'bOGNPU280dgkq6Y2yu8vfjCIlwwzr+/ZQ/PHO0gOLuO5qsftDQ2NbN+4OCgqG6WTxWVaq6zpF+DiSHWnicdylp3r6aZTWthIOrNp'.
+ 'ktHcvBu0sHX1Sm6ozB3B42d90zZA9bQp7PvgPSzXZfnqX/HS4DKKK2+x69Y/HURs26iBAN5ccsfw7774UcumF37C6f07KSt2OHji'.
+ 'DEUJD0tISjyPrrSPlAKvN0JP/U4O1NfjuhG2rvklN1SOpfXwftpbTqAyKRrff5fb7rs9V1R7m4wlz2ihA3HpmXflUWyOH2umpLiY'.
+ 'ui3v8M+6bWzfsRNbSgqkxaCkiy0simMuEWEhpcRzIhQWOIAh6tiAwS4owInFiTou5dOnMnl2NR++ujBwXEc9terD6M43nrj6LgAB'.
+ 'QnDPA9/irtkP8JRS7Hr/3T6YekDQ1pEiEXOwpUVJzCVlZZFS4mZtkpEo9ChAkDp/jtLMBACy6S4RiQghLyv5cgBRPnKUOX6smUGF'.
+ 'hSil0MYw9d77mPy1e5mnFE3batm3czvb6nYgEJztSFGU9LCRlMRdUjIH0+lnEMIwPNXD3NumoVJnrMCJaiciMUZfvQnz4QcBSvV1'.
+ 'vjE5GK358t0zmXDnDB79saLpo20c+aSRD+t25JTp7GZQwsEWFiVxl6hlUf/WO9z32CxmL1rOe6u/I2KuwGhzLQCB7/sYY9Bah3el'.
+ 'FKbvrrVm4vS7GH/7ncx+chEHGz7myCeNbPtoO0JI2jq78WIRLGkzsqs7V5SfFV5EovXACoiqqsfNpk2vo5VCWtYFBfoU0VoTBAFa'.
+ 'a7TRaK2p+MoURk+cxMzq+Rzbv49DDbuo27UTW9h0dedssPxuK+kIfN8XxhgDYPVXf2Fh4XKtFIl4AiklAlBKAYRKKK36wHIweTCt'.
+ 'NfHiEkaOn8j0+7/BmDFjaT30GbHywSxcuZkpFfFg+m1jjZ/NmnVvNfRvwd69e8WBA/uNFAIh4JVXXmHsmDHE4vEQQgjQ2lxQIm9N'.
+ 'nz35q3BEOZOHzaG2thaA4mRU+L29It+IV21CpbRQfeMFC35gRB/M2rVrubnyZmLxWJhECBEmz/eHyo/7lMlH3LFFujsthNFCCGOu'.
+ '+WNyeUgpjSVzMKtWraKyshLPdcPEeYWCIEBdpIxSivr6eta8vI7d6+cGnhdV06pe1QP+F/QXWmuRL+jZZ58LlVmxYgUVFRV4rhtu'.
+ '4TzMxXAA6XRaRAtsYUkx8I/JtSJQOlSwpmZpCLN8+fPcdNNoHMfB9/0QJgRoP295TlR7UVv8xxZcHMuWIZ9/Hn35vG3JEGZpzVJG'.
+ 'jx5N1IlitKahsZE1L69j69qHgx+urFX/lQL9JYdLlfnZihUhzOLFi8N3Ml1dthOxVH/f/8/CtqSJ2JaJ2JZ59J7RPsC/AViJsQS/'.
+ 'dBntAAAAAElFTkSuQmCC' ;
//==========================================================
// folder.png
//==========================================================
$this->iBuiltinIcon[11][0]= 1824 ;
$this->iBuiltinIcon[11][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
- 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'.
- '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'.
- 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'.
- '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'.
- 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'.
- 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'.
- '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'.
- 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'.
- 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'.
- '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'.
- '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'.
- 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'.
- 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'.
- 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'.
- 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'.
- 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'.
- 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'.
- 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'.
- 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'.
- 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'.
- 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'.
- 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'.
- 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'.
- 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALEAAACxABrSO9dQAAAAd0SU1FB9ECAQgFFyd9cRUAAAadSURBVHiczdhvbBP3Hcfx9/2xfefEOA5JoCNNnIT8AdtZmYBETJsI'.
+ '6+jQOlQihT1AYgytqzZpD1atfyYqlT1h0lRpT7aRJ4NQpRvZGELVuo5Ua9jEJDIETQsNQyPBsUJMWGPnj//e+e72wNg4xElMR6ed'.
+ 'ZNln3933dZ/f93f6yfB/sgmrHdDV1WXlPg8NDZUDScD8LFFFEZZlWYZhWMFg0Orq6sq/gDJAfFy1iiZy9OjrVnj4JzQ1rMWqfxm/'.
+ '309jYyNtbW0kEgnu3bvH4cOH88c/jqSKQl4/XGkd+eVtAN46up1LH92ktqYS++ZX8Pv9NDQ0sGnTJlKpFOFwmO7u7vy5IyMjeVRd'.
+ 'XV1+WEOh0IrY4pDnq6wXX/sTiCJaMkFZdRNqxefoe7VtCSqXVDqdZnZ2ltraWkzTpKqqijt3JpFlG7dvj7NzZ1f++qFQyA3EClHL'.
+ 'Ql743nFkhxPDtJAd5eTaYSVUfX09lZWVlJWVIUnSg7sVQMBCUcu4ceMGe/bsIRQK1QAzOcyykIM9P0KyudAyCWyqG8nhwqa4SkLt'.
+ '3r0bVVVxu924XC40TUOWZUQxe97CwgIdHR2LMHIxSCaVInVvFElxE0vMY1Pd2NUKJMWNTXHlUfF//4vETJCelwbpFm3MjP2dt37x'.
+ 'AlN+PzU1NViWRSwW4+7du3g8HjweD4qi5EFAJzAExIpCANbooxhplfB0FJvTg6xWIqsVRVF6MopkU3FXPcnkJxGU0VEAdF2noqKC'.
+ 'W3/8DpnqLjzep2lubsblcjE8PExHR8fboVDID9xYFpLBDpJF0jDQIncQpWlkm31FlFLtp9PfyuW/vYQj1kPSuRW/38+lj27S2Q7v'.
+ '/aWXUBVUffVNtm3blivVCEwsC5Eyc5iiApEpDEAXMqQdldhSiWVQHjJagud+8Fuexck/zv+K82dfoSbSCsDe75/km+4GVPd6+l5t'.
+ '4zJHcqVUYN2yEEtZQDCSJCueRAYsPY49HsFIZVG6p25JUumFafT4DKJN4amtT7Nz38sk5+5A70HMtEYyMkFiZhxzjQ/poXrLQrRU'.
+ 'DFGEeFpAlkQkm4pRiCpIKodKzk0T/2QMh+piPjxKZPwiSkUtu/b9mNnJEWS7E8nhAmvpM60oJDkXJxqNozxRRUxPIesispBBlsXV'.
+ 'UaKEFo8gzoaJhz8s2lOmrpUG+WBhJ9/60g+Z+fDXTAXfxllRjl1VkO0OFATsYhYliiK21ZKKhhHnFveUqSdKgwAEOp7F2v51vvw8'.
+ 'XH7/N1wd/BlTweuUV65BdtgfoLTSkipsdD3tRi0VYpommUwGwzDwdT5HYEc3giAwcvH3jLz3BlPB67jWeZBEKYsSBWwpHZtNKo4q'.
+ 'aHTDsJeeiGEYWJaFZVmYpommaRiGQdPnv0bb1m8gSRL/vPIOV979aR4lmAJ2p4qCgCxksNuKJ6VNpx4NYhgGpmkuQhmGQTqdxjAM'.
+ 'qr2d7HtxEEEQuH1tkKvvvkF44tqDnrIcKJKAPf1g+LAUElq8dIiu60sApmnm93Pfzc7OYhgGrie+wFe++ztcLhcT1wf54PzPCU9c'.
+ 'w7XWjWS3IdsdOAUBWZAxrRJnTQ6SG5bce2FCpmkughmGQSqVYm5uDtnj44sH38TtdhP6+Dwf//V4ttHXrkGURZJaic8RgHQ6jWma'.
+ 'SJKUL5RLKNfIOczDKF3XSSaTRCIRhLJWntp3nGfWrSMxc5OLf3iNP4+68T9Ub9nF76lTpxgfHycajZJKpdA0LZ9GbjYV7hcDWZaF'.
+ 'pmnMz88Ti8UYunSLmu1HFi2aVkxkaGjINTY2ttDb24vX6+XQoUNs3ryZ8vJyIDu1BUFYkkxhgxeiWlpaOHPmDE1NTdTX1xe98eWG'.
+ 'JnF/9dQZCoXUYDA4AOD1ejlw4ACtra2Ul5fniwmCkEcUJiUIAoFAgL6+Pnw+H21tbfT39z8SxCS7hHsfWH9/8dL4MKqnp4eWlhac'.
+ 'TmcekEvMNE2am5s5ceIEgUCA9vZ2Tp48ic/nY3j4UsmQHCYOjJHtpeBKqL1799Lc3IzT6UTXdRobGxkYGKC9vZ3W1tZ8Ko86NJ8a'.
+ 'tXHjRo4dO8bp06fZsmULGzZsoL+/n0AggNfr5ezZs/8VpGTU5OSkc//+/acBfD4f1dXV7Nq1i4aGBs6dO4fP5+Pq1SuPBbIiyjTN'.
+ 'RUnV1dUNXLhwAa/Xy44dO4jFYgBEo9FFF1r134BPuYlk16LrAYXsAlmtq6sbKDwoFAp9m+ykuP5ZQVZF3f8tCdwCov8LyHIoAANI'.
+ 'AXf/A1TI0XCDh7OWAAAAAElFTkSuQmCC' ;
//==========================================================
// file_important.png
//==========================================================
$this->iBuiltinIcon[12][0]= 1785 ;
$this->iBuiltinIcon[12][1]=
- 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
- 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'.
- 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'.
- 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'.
- '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'.
- 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'.
- 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'.
- 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'.
- 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'.
- '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'.
- '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'.
- 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'.
- 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'.
- 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'.
- 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'.
- 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'.
- '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'.
- 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'.
- 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'.
- 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'.
- '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'.
- 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'.
- 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'.
- '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ;
+ 'iVBORw0KGgoAAAANSUhEUgAAACIAAAAiCAYAAAA6RwvCAAAABGdBTUEAALGPC/xhBQAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlz'.
+ 'AAALDwAACw8BkvkDpQAAAAd0SU1FB9ECDAcjDeD3lKsAAAZ2SURBVHicrZhPaFzHHcc/897s7lutJCsr2VHsOHWMk0MPbsBUrcnF'.
+ 'OFRdSo6FNhdB6SGHlpDmYtJCDyoxyKe6EBxKQkt7KKL0T6ABo0NbciqigtC6PhWKI2NFqqxdSd7V2/dmftPDvPd212t55dCBYfbN'.
+ 'zpvfZ77z+/1mdhUjytWrV93Hf/24eD5z9gwiMlDjOKbb7dLtdhER2u02u7u73Lp1CxEZBw4AeZwdNQqkMd9wbziFGINJUt6rRbz5'.
+ '1ptUq1XK5TJBEAAUMHt7e+zu7gKwvLzMysoKwAng/uNg9CgQgFKlgg1DUJ67Vqtx6tQpZmdniaIIpRTOOZRSdDoddnZ2aLfbLC8v'.
+ 's7S0xJUrV7ZGwQSj1PhhfRodVdDlMrpc5vup5Z2fvMPdu3fZ29vDWjvwztjYGPV6nVqtRqVS4dKlSywtLQFsAdOH2XwsCEApg3jl'.
+ 'w98Rak2gvYjNZpNms0mSJDjnHgkDMDc3dySYQ0Ea8w139YUX0OUKulzyg7UmCEO+l1huvHuDra0t9vf3h1TJYSqVypFhHquIrlQI'.
+ 'S5qv/uIDAC7/4bcEQYAKvK+0Wq1DVQGIoog7d+4cCeaRII35hrt+8SsEOkRlUaEyR0UpFIrXHxyMVKVUKnHv3r0jwRwaNelBjBjL'.
+ 'Sz/7KYuLiwAsLi7y4z/9kY9e+TpkCuSqjI+Po7XuAWeKXLt2DWNMUZMkwRjDhQsXWFtbK6JpCCT3jfQgxomPtPX19YHWicM5x3c2'.
+ '73Pj3Ru8/aO3mZqaolKpoHVvyuvXr/Ppnf/Q7uzz380NPtu4y/qnG+ztd1hfX2dtbQ3gIvDnRyqSxl1UoPjyz98D4PTp0wPtq39Z'.
+ '4fdzLxegrVaLVqvF5OQkYRgWqpRKJZ77wvNsbW1RG5tgfKLOTH2G7Z1twqBQrgrMDvhInjfSOCY5iIv+hYWFgRZArEWsZWF941Bf'.
+ 'SdMUgMnJCWpjVU4cn+HUyePM1Gc4+fRUPkzBI5w1jbukcczLv/5l0XfmzJmBFuCba38r/CRXpT+CrDUoZ0jjB4RYonJAOYRobJKT'.
+ 'z5zgqfqxAbsFSH6mpHFM2qdGXh4VnoViD6mSJF2cTQeqDqBaKVHWmonJCWpZjhkC6anR5WsffTgwaHV1FaUUq6urA/2v3f5k4LnV'.
+ 'arG9tUn3oI2YBCcWHYAxMVYs1qZEZY2SFB2aYZDGfMN9d7uJiWPSeFiNo5Rclc3NTXZbO6RpF7EJVixYA9agwwDnUiqlEPdQ3imi'.
+ 'Jo27BGHIt/7x9yEjc3Nzh27Na7c/4TdffKl4bja3ae5MUIu0T/HOEIaOpJt4gwoSsVTK4SBIY77hFtY3ABBjBiZ90rKwvsH77/+K'.
+ 't37wOhO1iPpTk4SBw1mLsz6CnKQ4l3qV+kE+t9XHlNZOk+bUJLVIE1VCcIJWQmJ6qjj30NbcXLkZMt8YPig+Z3n1G5fZ39/j/vY2'.
+ '9ckqZT2Ochbn0p4qNkU/dDfUADdXbh4HXgRO4zNdEU0XL1784PLly5w9e7Z4SazFOfGrEotDcOKrcoJPmrYIXf/Zop3QNd1skuGt'.
+ 'cUAb2MgAxvHZTgFUq1Wmp6eZnZ0F8JlTjDduDThBnDeECEoJtbGIp6enqEblzCcEZ1PECU4yVRiOGgd0gc+AB0CZvkv1sWPHOHfu'.
+ 'HOfPn8da41cpkkltEBEPJhYnBkTQJcdYVKGkgRxCfBsq5xXNgAa2Bn+hjTOgHEKBP8pzRUxykIH4ifLJRTJAl+UMBJzPHQ6bfe/f'.
+ 'cWIzPxlUpD+zugzIZtVk1d8znBAqRxgoQuVQgSJQ3h9C5QhDRYgjUILCAzlnEdsHYTKfMTEBcP7F54YUGVmc2GLlIn6ve6v0ahSt'.
+ '8X25TzjJ+rIx1grKpQPWR4LkGVVsMgghvS0qjPdvm5OeceOTWA5Evo2mFzkjQfL7hZPUy5yvvF/uPFQL3+nbDmsLCEmT3sTmCTNr'.
+ 'rogT6yFsOix3ftw7OwQhkvSU6CuinhCk0+kAkFoBazEEICHaHHiPVmU0gnUp4EAc1mYrF0EBVpwPi34VrBkwPxKk3W5ju/e5/c+d'.
+ 'bGUHIAIuydTIE5zfc5Wr4lJcahHnHTP3CVGm78DrgY38N+DEibp7dmYKdAQmBh1hjEFjis+9CTWYGK21H6PxPyOI0DobYwzZF/z7'.
+ '7jadTvJtYG0kCD7lfwl49ijgT1gc0AH+dZSJA/xB+Mz/GSIvFoj/B7H1mAd8CO/zAAAAAElFTkSuQmCC' ;
$this->iLen = count($this->iBuiltinIcon);
}
@@ -1526,7 +1566,7 @@ class IconImage
private $iyalign='center';
private $iScale=1.0;
- public function IconImage($aIcon, $aScale=1)
+ public function __construct($aIcon, $aScale=1)
{
global $_gPredefIcons ;
if (is_string($aIcon)) {
@@ -1601,18 +1641,19 @@ class TextProperty
private $iFFamily=FF_FONT1;
private $iFStyle=FS_NORMAL;
private $iFSize=10;
+ private $iFontArray=array();
private $iColor="black";
private $iText="";
private $iHAlign="left";
private $iVAlign="bottom";
-
+
//---------------
// CONSTRUCTOR
- public function TextProperty($aTxt='')
+ public function __construct($aTxt='')
{
$this->iText = $aTxt;
}
-
+
//---------------
// PUBLIC METHODS
public function Set($aTxt)
@@ -1637,7 +1678,7 @@ class TextProperty
}
$this->csimalt=$aAltText;
}
-
+
public function SetCSIMAlt($aAltText)
{
if (is_string($aAltText)) {
@@ -1651,7 +1692,7 @@ class TextProperty
{
$this->iColor = $aColor;
}
-
+
public function HasTabs()
{
if (is_string($this->iText)) {
@@ -1660,7 +1701,7 @@ class TextProperty
return false;
}
}
-
+
// Get number of tabs in string
public function GetNbrTabs()
{
@@ -1670,34 +1711,44 @@ class TextProperty
return 0;
}
}
-
+
// Set alignment
public function Align($aHAlign, $aVAlign="bottom")
{
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
-
+
// Synonym
public function SetAlign($aHAlign, $aVAlign="bottom")
{
$this->iHAlign=$aHAlign;
$this->iVAlign=$aVAlign;
}
-
+
// Specify font
public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10)
{
$this->iFFamily = $aFFamily;
- $this->iFStyle = $aFStyle;
- $this->iFSize = $aFSize;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
}
+ public function SetColumnFonts($aFontArray)
+ {
+ if (!is_array($aFontArray) || count($aFontArray[0]) != 3) {
+ JpGraphError::RaiseL(6033);
+ // 'Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)'
+ }
+ $this->iFontArray = $aFontArray;
+ }
+
+
public function IsColumns()
{
return is_array($this->iText) ;
}
-
+
// Get width of text. If text contains several columns separated by
// tabs then return both the total width as well as an array with a
// width for each column.
@@ -1709,7 +1760,7 @@ class TextProperty
if (strlen($this->iText) == 0) {
return 0;
}
- $tmp = split("\t", $this->iText);
+ $tmp = preg_split('/\t/', $this->iText);
if (count($tmp) <= 1 || !$aUseTabs) {
$w = $aImg->GetTextWidth($this->iText);
return $w + 2*$extra_margin;
@@ -1729,7 +1780,13 @@ class TextProperty
// Must be an array of texts. In this case we return the sum of the
// length + a fixed margin of 4 pixels on each text string
$n = count($this->iText);
+ $nf = count($this->iFontArray);
for ($i=0, $w=0; $i < $n; ++$i) {
+ if ($i < $nf) {
+ $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]);
+ } else {
+ $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
+ }
$tmp = $this->iText[$i];
if (is_string($tmp)) {
$w += $aImg->GetTextWidth($tmp)+$extra_margin;
@@ -1754,10 +1811,16 @@ class TextProperty
$aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
if (is_array($this->iText)) {
$n = count($this->iText);
+ $nf = count($this->iFontArray);
for ($i=0, $w=array(); $i < $n; ++$i) {
$tmp = $this->iText[$i];
if (is_string($tmp)) {
- $w[$i] = $aImg->GetTextWidth($this->iText[$i])+$aMargin;
+ if ($i < $nf) {
+ $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]);
+ } else {
+ $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
+ }
+ $w[$i] = $aImg->GetTextWidth($tmp)+$aMargin;
} else {
if (is_object($tmp) === false) {
JpGraphError::RaiseL(6012);
@@ -1770,20 +1833,35 @@ class TextProperty
return array($this->GetWidth($aImg));
}
}
-
+
// Get total height of text
public function GetHeight($aImg)
{
+ $nf = count($this->iFontArray);
+ $maxheight = -1;
+
+ if ($nf > 0) {
+ // We have to find out the largest font and take that one as the
+ // height of the row
+ for ($i=0; $i < $nf; ++$i) {
+ $aImg->SetFont($this->iFontArray[$i][0], $this->iFontArray[$i][1], $this->iFontArray[$i][2]);
+ $height = $aImg->GetFontHeight();
+ $maxheight = max($height, $maxheight);
+ }
+ }
+
$aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
- return $aImg->GetFontHeight();
+ $height = $aImg->GetFontHeight();
+ $maxheight = max($height, $maxheight);
+ return $maxheight;
}
-
+
// Unhide/hide the text
public function Show($aShow=true)
{
$this->iShow=$aShow;
}
-
+
// Stroke text at (x,y) coordinates. If the text contains tabs then the
// x parameter should be an array of positions to be used for each successive
// tab mark. If no array is supplied then the tabs will be ignored.
@@ -1793,16 +1871,15 @@ class TextProperty
$aImg->SetColor($this->iColor);
$aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
$aImg->SetTextAlign($this->iHAlign, $this->iVAlign);
- if ($this->GetNbrTabs() <= 1) {
+ if ($this->GetNbrTabs() < 1) {
if (is_string($this->iText)) {
- // Get rid of any "\t" characters and stroke string
if (is_array($aX)) {
$aX=$aX[0];
}
if (is_array($aY)) {
$aY=$aY[0];
}
- $aImg->StrokeText($aX, $aY, str_replace("\t", " ", $this->iText));
+ $aImg->StrokeText($aX, $aY, $this->iText);
} elseif (is_array($this->iText) && ($n = count($this->iText)) > 0) {
$ax = is_array($aX) ;
$ay = is_array($aY) ;
@@ -1823,14 +1900,26 @@ class TextProperty
if (is_object($tmp)) {
$tmp->Stroke($aImg, $aX[$i], $aY[$i]);
} else {
+ if ($i < count($this->iFontArray)) {
+ $font = $this->iFontArray[$i];
+ $aImg->SetFont($font[0], $font[1], $font[2]);
+ } else {
+ $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
+ }
$aImg->StrokeText($aX[$i], $aY[$i], str_replace("\t", " ", $tmp));
}
}
}
} else {
- $tmp = split("\t", $this->iText);
+ $tmp = preg_split('/\t/', $this->iText);
$n = min(count($tmp), count($aX));
for ($i=0; $i < $n; ++$i) {
+ if ($i < count($this->iFontArray)) {
+ $font = $this->iFontArray[$i];
+ $aImg->SetFont($font[0], $font[1], $font[2]);
+ } else {
+ $aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
+ }
$aImg->StrokeText($aX[$i], $aY, $tmp[$i]);
}
}
@@ -1864,7 +1953,7 @@ class HeaderProperty
//---------------
// CONSTRUCTOR
- public function HeaderProperty()
+ public function __construct()
{
$this->grid = new LineProperty();
}
@@ -1881,23 +1970,28 @@ class HeaderProperty
$this->iIntervall = $aInt;
}
+ public function SetInterval($aInt)
+ {
+ $this->iIntervall = $aInt;
+ }
+
public function GetIntervall()
{
return $this->iIntervall ;
}
-
+
public function SetFont($aFFamily, $aFStyle=FS_NORMAL, $aFSize=10)
{
$this->iFFamily = $aFFamily;
- $this->iFStyle = $aFStyle;
- $this->iFSize = $aFSize;
+ $this->iFStyle = $aFStyle;
+ $this->iFSize = $aFSize;
}
public function SetFontColor($aColor)
{
$this->iTextColor = $aColor;
}
-
+
public function GetFontHeight($aImg)
{
$aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
@@ -1915,12 +2009,12 @@ class HeaderProperty
$aImg->SetFont($this->iFFamily, $this->iFStyle, $this->iFSize);
return $aImg->GetTextWidth($aStr);
}
-
+
public function SetStyle($aStyle)
{
$this->iStyle = $aStyle;
}
-
+
public function SetBackgroundColor($aColor)
{
$this->iBackgroundColor=$aColor;
@@ -1935,24 +2029,24 @@ class HeaderProperty
{
$this->iFrameColor=$aColor;
}
-
+
// Only used by day scale
public function SetWeekendColor($aColor)
{
$this->iWeekendBackgroundColor=$aColor;
}
-
+
// Only used by day scale
public function SetSundayFontColor($aColor)
{
$this->iSundayTextColor=$aColor;
}
-
+
public function SetTitleVertMargin($aMargin)
{
$this->iTitleVertMargin=$aMargin;
}
-
+
public function SetLabelFormatString($aStr)
{
$this->iLabelFormStr=$aStr;
@@ -1997,7 +2091,6 @@ class GanttScale
// Out image to stroke the scale to
private $iImg;
private $iTableHeaderBackgroundColor="white";
-
private $iTableHeaderFrameColor="black";
private $iTableHeaderFrameWeight=1;
private $iAvailableHeight=-1;
@@ -2005,11 +2098,11 @@ class GanttScale
private $iDateLocale;
private $iVertLayout=GANTT_EVEN;
private $iUsePlotWeekendBackground=true;
- private $iWeekStart = 1; // Default to have weekends start on Monday
-
+ private $iWeekStart = 1; // Default to have weekends start on Monday
+
//---------------
// CONSTRUCTOR
- public function GanttScale($aImg)
+ public function __construct($aImg)
{
$this->iImg = $aImg;
$this->iDateLocale = new DateLocale();
@@ -2040,7 +2133,7 @@ class GanttScale
$this->year = new HeaderProperty();
$this->year->SetFont(FF_FONT1, FS_BOLD);
-
+
$this->divider=new LineProperty();
$this->dividerh=new LineProperty();
$this->dividerh->SetWeight(2);
@@ -2052,7 +2145,7 @@ class GanttScale
$this->tableTitle->Show(false);
$this->actinfo = new GanttActivityInfo();
}
-
+
//---------------
// PUBLIC METHODS
// Specify what headers should be visible
@@ -2074,37 +2167,37 @@ class GanttScale
$this->day->grid->SetColor("black");
}
}
-
+
// Should the weekend background stretch all the way down in the plotarea
public function UseWeekendBackground($aShow)
{
$this->iUsePlotWeekendBackground = $aShow;
}
-
+
// Have a range been specified?
public function IsRangeSet()
{
return $this->iStartDate!=-1 && $this->iEndDate!=-1;
}
-
+
// Should the layout be from top or even?
public function SetVertLayout($aLayout)
{
$this->iVertLayout = $aLayout;
}
-
+
// Which locale should be used?
public function SetDateLocale($aLocale)
{
$this->iDateLocale->Set($aLocale);
}
-
+
// Number of days we are showing
public function GetNumberOfDays()
{
return round(($this->iEndDate-$this->iStartDate)/SECPERDAY);
}
-
+
// The width of the actual plot area
public function GetPlotWidth()
{
@@ -2125,7 +2218,7 @@ class GanttScale
public function SetWeekStart($aStartDay)
{
$this->iWeekStart = $aStartDay % 7;
-
+
//Recalculate the startday since this will change the week start
$this->SetRange($this->iStartDate, $this->iEndDate);
}
@@ -2142,25 +2235,25 @@ class GanttScale
return $this->hour->iShowLabels;
}
-
+
// Do we show day scale?
public function IsDisplayDay()
{
return $this->day->iShowLabels;
}
-
+
// Do we show week scale?
public function IsDisplayWeek()
{
return $this->week->iShowLabels;
}
-
+
// Do we show month scale?
public function IsDisplayMonth()
{
return $this->month->iShowLabels;
}
-
+
// Do we show year scale?
public function IsDisplayYear()
{
@@ -2194,7 +2287,7 @@ class GanttScale
// Get day in week for start and ending date (Sun==0)
$ds=strftime("%w", $this->iStartDate);
$de=strftime("%w", $this->iEndDate);
-
+
// We want to start on iWeekStart day. But first we subtract a week
// if the startdate is "behind" the day the week start at.
// This way we ensure that the given start date is always included
@@ -2207,7 +2300,7 @@ class GanttScale
}
$adjdate = strtotime(($this->iWeekStart-$ds).' day', $d /*$this->iStartDate*/);
$this->iStartDate = $adjdate;
-
+
// We want to end on the last day of the week
$preferredEndDay = ($this->iWeekStart+6)%7;
if ($preferredEndDay != $de) {
@@ -2226,7 +2319,7 @@ class GanttScale
///////////////////////////////////////
// PRIVATE Methods
-
+
// Determine the height of all the scale headers combined
public function GetHeaderHeight()
{
@@ -2258,7 +2351,7 @@ class GanttScale
}
return $height;
}
-
+
// Get width (in pixels) for a single day
public function GetDayWidth()
{
@@ -2285,7 +2378,7 @@ class GanttScale
return 365;
}
}
-
+
// Get week number
public function GetWeekNbr($aDate, $aSunStart=true)
{
@@ -2303,28 +2396,28 @@ class GanttScale
if ($aSunStart) {
$day += 60*60*24;
}
-
+
/*-------------------------------------------------------------------------
- According to ISO-8601 :
- "Week 01 of a year is per definition the first week that has the Thursday in this year,
- which is equivalent to the week that contains the fourth day of January.
- In other words, the first week of a new year is the week that has the majority of its
- days in the new year."
+ According to ISO-8601 :
+ "Week 01 of a year is per definition the first week that has the Thursday in this year,
+ which is equivalent to the week that contains the fourth day of January.
+ In other words, the first week of a new year is the week that has the majority of its
+ days in the new year."
- Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!!
+ Be carefull, with PHP, -3 % 7 = -3, instead of 4 !!!
+
+ day of year = date("z", $day) + 1
+ offset to thursday = 3 - (date("w", $day) + 6) % 7
+ first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7
+ week number = (thursday's day of year - first thursday's day of year) / 7 + 1
+ ---------------------------------------------------------------------------*/
- day of year = date("z", $day) + 1
- offset to thursday = 3 - (date("w", $day) + 6) % 7
- first thursday of year = 1 + (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $day)))) % 7
- week number = (thursday's day of year - first thursday's day of year) / 7 + 1
- ---------------------------------------------------------------------------*/
-
$thursday = $day + 60 * 60 * 24 * (3 - (date("w", $day) + 6) % 7); // take week's thursday
$week = 1 + (date("z", $thursday) - (11 - date("w", mktime(0, 0, 0, 1, 1, date("Y", $thursday)))) % 7) / 7;
-
+
return $week;
}
-
+
// Is year a leap year?
public function IsLeap($aYear)
{
@@ -2343,7 +2436,7 @@ class GanttScale
{
return 0+Date("Y", $aDate);
}
-
+
// Return number of days in a year
public function GetNumDaysInMonth($aMonth, $aYear)
{
@@ -2355,7 +2448,7 @@ class GanttScale
return $days[$aMonth];
}
}
-
+
// Get day in month
public function GetMonthDayNbr($aDate)
{
@@ -2367,14 +2460,14 @@ class GanttScale
{
return 0+strftime("%j", $aDate);
}
-
+
// Get month number
public function GetMonthNbr($aDate)
{
return 0+strftime("%m", $aDate);
}
-
- // Translate a date to screen coordinates (horizontal scale)
+
+ // Translate a date to screen coordinates (horizontal scale)
public function TranslateDate($aDate)
{
//
@@ -2404,29 +2497,34 @@ class GanttScale
}
// Get screen coordinatesz for the vertical position for a bar
- public function TranslateVertPos($aPos)
+ public function TranslateVertPos($aPos, $atTop=false)
{
$img=$this->iImg;
- $ph=$this->iAvailableHeight;
if ($aPos > $this->iVertLines) {
JpGraphError::RaiseL(6015, $aPos);
}
// 'Illegal vertical position %d'
if ($this->iVertLayout == GANTT_EVEN) {
// Position the top bar at 1 vert spacing from the scale
- return round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing);
+ $pos = round($img->top_margin + $this->iVertHeaderSize + ($aPos+1)*$this->iVertSpacing);
} else {
// position the top bar at 1/2 a vert spacing from the scale
- return round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing);
+ $pos = round($img->top_margin + $this->iVertHeaderSize + $this->iTopPlotMargin + ($aPos+1)*$this->iVertSpacing);
}
+
+ if ($atTop) {
+ $pos -= $this->iVertSpacing;
+ }
+
+ return $pos;
}
-
+
// What is the vertical spacing?
public function GetVertSpacing()
{
return $this->iVertSpacing;
}
-
+
// Convert a date to timestamp
public function NormalizeDate($aDate)
{
@@ -2448,7 +2546,7 @@ class GanttScale
//Unknown date format in GanttScale ($aDate).");
}
-
+
// Convert a time string to minutes
public function TimeToMinutes($aTimeString)
@@ -2476,7 +2574,7 @@ class GanttScale
if ($this->minute->iShowLabels) {
$img->SetFont($this->minute->iFFamily, $this->minute->iFStyle, $this->minute->iFSize);
$yb = $yt + $img->GetFontHeight() +
- $this->minute->iTitleVertMargin + $this->minute->iFrameWeight;
+ $this->minute->iTitleVertMargin + $this->minute->iFrameWeight;
if ($getHeight) {
return $yb - $img->top_margin;
}
@@ -2488,7 +2586,7 @@ class GanttScale
$img->SetTextAlign("center");
$day = date('w', $this->iStartDate);
$minint = $this->minute->GetIntervall() ;
-
+
if (60 % $minint !== 0) {
JpGraphError::RaiseL(6018, $minint);
//'Intervall for minutes must divide the hour evenly, e.g. 1,5,10,12,15,20,30 etc You have specified an intervall of '.$minint.' minutes.');
@@ -2528,19 +2626,17 @@ class GanttScale
}
switch ($this->minute->iStyle) {
- case MINUTESTYLE_CUSTOM:
- $txt = date($this->minute->iLabelFormStr, $datestamp);
- break;
- case MINUTESTYLE_MM:
- default:
- // 15
- $txt = date('i', $datestamp);
- break;
- }
+ case MINUTESTYLE_CUSTOM:
+ $txt = date($this->minute->iLabelFormStr, $datestamp);
+ break;
+ case MINUTESTYLE_MM:
+ default:
+ // 15
+ $txt = date('i', $datestamp);
+ break;
+ }
$img->StrokeText(round($x+$width/2), round($yb-$this->minute->iTitleVertMargin), $txt);
- // FIXME: The rounding problem needs to be solved properly ...
- //
// Fix a rounding problem the wrong way ..
// If we also have hour scale then don't draw the firsta or last
// gridline since that will be overwritten by the hour scale gridline if such exists.
@@ -2574,7 +2670,7 @@ class GanttScale
if ($this->hour->iShowLabels) {
$img->SetFont($this->hour->iFFamily, $this->hour->iFStyle, $this->hour->iFSize);
$yb = $yt + $img->GetFontHeight() +
- $this->hour->iTitleVertMargin + $this->hour->iFrameWeight;
+ $this->hour->iTitleVertMargin + $this->hour->iFrameWeight;
if ($getHeight) {
return $yb - $img->top_margin;
}
@@ -2615,25 +2711,25 @@ class GanttScale
}
switch ($this->hour->iStyle) {
- case HOURSTYLE_HMAMPM:
- // 1:35pm
- $txt = date('g:ia', $datestamp);
- break;
- case HOURSTYLE_H24:
- // 13
- $txt = date('H', $datestamp);
- break;
- case HOURSTYLE_HAMPM:
- $txt = date('ga', $datestamp);
- break;
- case HOURSTYLE_CUSTOM:
- $txt = date($this->hour->iLabelFormStr, $datestamp);
- break;
- case HOURSTYLE_HM24:
- default:
- $txt = date('H:i', $datestamp);
- break;
- }
+ case HOURSTYLE_HMAMPM:
+ // 1:35pm
+ $txt = date('g:ia', $datestamp);
+ break;
+ case HOURSTYLE_H24:
+ // 13
+ $txt = date('H', $datestamp);
+ break;
+ case HOURSTYLE_HAMPM:
+ $txt = date('ga', $datestamp);
+ break;
+ case HOURSTYLE_CUSTOM:
+ $txt = date($this->hour->iLabelFormStr, $datestamp);
+ break;
+ case HOURSTYLE_HM24:
+ default:
+ $txt = date('H:i', $datestamp);
+ break;
+ }
$img->StrokeText(round($x+$width/2), round($yb-$this->hour->iTitleVertMargin), $txt);
$img->SetColor($this->hour->grid->iColor);
$img->SetLineWeight($this->hour->grid->iWeight);
@@ -2680,11 +2776,11 @@ class GanttScale
$img->SetTextAlign("center");
$day = date('w', $this->iStartDate);
$datestamp = $this->iStartDate;
-
+
$doback = !($this->hour->iShowLabels || $this->minute->iShowLabels);
setlocale(LC_TIME, $this->iDateLocale->iLocale);
-
+
for ($i=0; $i < $this->GetNumberOfDays(); ++$i, $x+=$daywidth, $day += 1,$day %= 7) {
if ($day==6 || $day==0) {
$img->SetColor($this->day->iWeekendBackgroundColor);
@@ -2711,61 +2807,61 @@ class GanttScale
}
switch ($this->day->iStyle) {
- case DAYSTYLE_LONG:
- // "Monday"
- $txt = strftime('%A', $datestamp);
- break;
- case DAYSTYLE_SHORT:
- // "Mon"
- $txt = strftime('%a', $datestamp);
- break;
- case DAYSTYLE_SHORTDAYDATE1:
- // "Mon 23/6"
- $txt = strftime('%a %d/'.$mn, $datestamp);
- break;
- case DAYSTYLE_SHORTDAYDATE2:
- // "Mon 23 Jun"
- $txt = strftime('%a %d %b', $datestamp);
- break;
- case DAYSTYLE_SHORTDAYDATE3:
- // "Mon 23 Jun 2003"
- $txt = strftime('%a %d %b %Y', $datestamp);
- break;
- case DAYSTYLE_LONGDAYDATE1:
- // "Monday 23 Jun"
- $txt = strftime('%A %d %b', $datestamp);
- break;
- case DAYSTYLE_LONGDAYDATE2:
- // "Monday 23 Jun 2003"
- $txt = strftime('%A %d %b %Y', $datestamp);
- break;
- case DAYSTYLE_SHORTDATE1:
- // "23/6"
- $txt = strftime('%d/'.$mn, $datestamp);
- break;
- case DAYSTYLE_SHORTDATE2:
- // "23 Jun"
- $txt = strftime('%d %b', $datestamp);
- break;
- case DAYSTYLE_SHORTDATE3:
- // "Mon 23"
- $txt = strftime('%a %d', $datestamp);
- break;
- case DAYSTYLE_SHORTDATE4:
- // "23"
- $txt = strftime('%d', $datestamp);
- break;
- case DAYSTYLE_CUSTOM:
- // Custom format
- $txt = strftime($this->day->iLabelFormStr, $datestamp);
- break;
- case DAYSTYLE_ONELETTER:
- default:
- // "M"
- $txt = strftime('%A', $datestamp);
- $txt = strtoupper($txt[0]);
- break;
- }
+ case DAYSTYLE_LONG:
+ // "Monday"
+ $txt = strftime('%A', $datestamp);
+ break;
+ case DAYSTYLE_SHORT:
+ // "Mon"
+ $txt = strftime('%a', $datestamp);
+ break;
+ case DAYSTYLE_SHORTDAYDATE1:
+ // "Mon 23/6"
+ $txt = strftime('%a %d/'.$mn, $datestamp);
+ break;
+ case DAYSTYLE_SHORTDAYDATE2:
+ // "Mon 23 Jun"
+ $txt = strftime('%a %d %b', $datestamp);
+ break;
+ case DAYSTYLE_SHORTDAYDATE3:
+ // "Mon 23 Jun 2003"
+ $txt = strftime('%a %d %b %Y', $datestamp);
+ break;
+ case DAYSTYLE_LONGDAYDATE1:
+ // "Monday 23 Jun"
+ $txt = strftime('%A %d %b', $datestamp);
+ break;
+ case DAYSTYLE_LONGDAYDATE2:
+ // "Monday 23 Jun 2003"
+ $txt = strftime('%A %d %b %Y', $datestamp);
+ break;
+ case DAYSTYLE_SHORTDATE1:
+ // "23/6"
+ $txt = strftime('%d/'.$mn, $datestamp);
+ break;
+ case DAYSTYLE_SHORTDATE2:
+ // "23 Jun"
+ $txt = strftime('%d %b', $datestamp);
+ break;
+ case DAYSTYLE_SHORTDATE3:
+ // "Mon 23"
+ $txt = strftime('%a %d', $datestamp);
+ break;
+ case DAYSTYLE_SHORTDATE4:
+ // "23"
+ $txt = strftime('%d', $datestamp);
+ break;
+ case DAYSTYLE_CUSTOM:
+ // Custom format
+ $txt = strftime($this->day->iLabelFormStr, $datestamp);
+ break;
+ case DAYSTYLE_ONELETTER:
+ default:
+ // "M"
+ $txt = strftime('%A', $datestamp);
+ $txt = strtoupper($txt[0]);
+ break;
+ }
if ($day==0) {
$img->SetColor($this->day->iSundayTextColor);
@@ -2791,7 +2887,7 @@ class GanttScale
}
return $aYCoord;
}
-
+
// Stroke week header and grid
public function StrokeWeeks($aYCoord, $getHeight=false)
{
@@ -2819,43 +2915,43 @@ class GanttScale
$img->SetTextAlign("center");
$txtOffset = $weekwidth/2+1;
} elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
$img->SetTextAlign("left");
$txtOffset = 3;
} else {
JpGraphError::RaiseL(6021);
+ //("Unknown formatting style for week.");
}
- //("Unknown formatting style for week.");
-
+
for ($i=0; $i<$this->GetNumberOfDays()/7; ++$i, $x+=$weekwidth) {
$img->PushColor($this->week->iTextColor);
-
+
if ($this->week->iStyle==WEEKSTYLE_WNBR) {
$txt = sprintf($this->week->iLabelFormStr, $weeknbr);
} elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR) {
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR) {
$txt = date("j/n", $week);
} elseif ($this->week->iStyle==WEEKSTYLE_FIRSTDAY2 ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
$monthnbr = date("n", $week)-1;
$shortmonth = $this->iDateLocale->GetShortMonthName($monthnbr);
$txt = Date("j", $week)." ".$shortmonth;
}
if ($this->week->iStyle==WEEKSTYLE_FIRSTDAYWNBR ||
- $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
+ $this->week->iStyle==WEEKSTYLE_FIRSTDAY2WNBR) {
$w = sprintf($this->week->iLabelFormStr, $weeknbr);
$txt .= ' '.$w;
}
-
+
$img->StrokeText(
round($x+$txtOffset),
round($yb-$this->week->iTitleVertMargin),
$txt
);
-
+
$week = strtotime('+7 day', $week);
$weeknbr = $this->GetWeekNbr($week);
$img->PopColor();
@@ -2870,38 +2966,38 @@ class GanttScale
}
return $aYCoord;
}
-
+
// Format the mont scale header string
public function GetMonthLabel($aMonthNbr, $year)
{
$sn = $this->iDateLocale->GetShortMonthName($aMonthNbr);
$ln = $this->iDateLocale->GetLongMonthName($aMonthNbr);
switch ($this->month->iStyle) {
- case MONTHSTYLE_SHORTNAME:
- $m=$sn;
- break;
- case MONTHSTYLE_LONGNAME:
- $m=$ln;
- break;
- case MONTHSTYLE_SHORTNAMEYEAR2:
- $m=$sn." '".substr("".$year, 2);
- break;
- case MONTHSTYLE_SHORTNAMEYEAR4:
- $m=$sn." ".$year;
- break;
- case MONTHSTYLE_LONGNAMEYEAR2:
- $m=$ln." '".substr("".$year, 2);
- break;
- case MONTHSTYLE_LONGNAMEYEAR4:
- $m=$ln." ".$year;
- break;
- case MONTHSTYLE_FIRSTLETTER:
- $m=$sn[0];
- break;
- }
+ case MONTHSTYLE_SHORTNAME:
+ $m=$sn;
+ break;
+ case MONTHSTYLE_LONGNAME:
+ $m=$ln;
+ break;
+ case MONTHSTYLE_SHORTNAMEYEAR2:
+ $m=$sn." '".substr("".$year, 2);
+ break;
+ case MONTHSTYLE_SHORTNAMEYEAR4:
+ $m=$sn." ".$year;
+ break;
+ case MONTHSTYLE_LONGNAMEYEAR2:
+ $m=$ln." '".substr("".$year, 2);
+ break;
+ case MONTHSTYLE_LONGNAMEYEAR4:
+ $m=$ln." ".$year;
+ break;
+ case MONTHSTYLE_FIRSTLETTER:
+ $m=$sn[0];
+ break;
+ }
return $m;
}
-
+
// Stroke month scale and gridlines
public function StrokeMonths($aYCoord, $getHeight=false)
{
@@ -2916,7 +3012,7 @@ class GanttScale
$monthnbr = $this->GetMonthNbr($this->iStartDate)-1;
$xt=$img->left_margin+$this->iLabelWidth;
$xb=$img->width-$img->right_margin+1;
-
+
$img->SetColor($this->month->iBackgroundColor);
$img->FilledRectangle($xt, $yt, $xb, $yb);
@@ -2925,7 +3021,7 @@ class GanttScale
$year = 0+strftime("%Y", $this->iStartDate);
$img->SetTextAlign("center");
if ($this->GetMonthNbr($this->iStartDate) == $this->GetMonthNbr($this->iEndDate)
- && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate)) {
+ && $this->GetYear($this->iStartDate)==$this->GetYear($this->iEndDate)) {
$monthwidth=$this->GetDayWidth()*($this->GetMonthDayNbr($this->iEndDate) - $this->GetMonthDayNbr($this->iStartDate) + 1);
} else {
$monthwidth=$this->GetDayWidth()*($this->GetNumDaysInMonth($monthnbr, $year)-$this->GetMonthDayNbr($this->iStartDate)+1);
@@ -3000,7 +3096,7 @@ class GanttScale
} else {
$yearwidth=$this->GetDayWidth()*($this->GetNumDaysInYear($year)-$this->GetYearDayNbr($this->iStartDate)+1);
}
-
+
// The space for a year must be at least 20% bigger than the actual text
// so we allow 10% margin on each side
if ($yearwidth >= 1.20*$img->GetTextWidth("".$year)) {
@@ -3040,7 +3136,7 @@ class GanttScale
}
return $aYCoord;
}
-
+
// Stroke table title (upper left corner)
public function StrokeTableHeaders($aYBottom)
{
@@ -3065,7 +3161,7 @@ class GanttScale
// Draw the horizontal dividing line
$this->dividerh->Stroke($img, $xt, $yb, $img->width-$img->right_margin, $yb);
-
+
// Draw the vertical dividing line
// We do the width "manually" since we want the line only to grow
// to the left
@@ -3097,8 +3193,8 @@ class GanttScale
{
if (!$this->IsRangeSet()) {
JpGraphError::RaiseL(6022);
+ //("Gantt scale has not been specified.");
}
- //("Gantt scale has not been specified.");
$img=$this->iImg;
// If minutes are displayed then hour interval must be 1
@@ -3106,10 +3202,10 @@ class GanttScale
JpGraphError::RaiseL(6023);
//('If you display both hour and minutes the hour intervall must be 1 (Otherwise it doesn\' make sense to display minutes).');
}
-
+
// Stroke all headers. As argument we supply the offset from the
// top which depends on any previous headers
-
+
// First find out the height of each header
$offy=$this->StrokeYears(0, true);
$offm=$this->StrokeMonths($offy, true);
@@ -3131,9 +3227,10 @@ class GanttScale
// Now when we now the oaverall size of the scale headers
// we can stroke the overall table headers
$this->StrokeTableHeaders($offmin);
-
+
// Now we can calculate the correct scaling factor for each vertical position
$this->iAvailableHeight = $img->height - $img->top_margin - $img->bottom_margin - $offd;
+
$this->iVertHeaderSize = $offmin;
if ($this->iVertSpacing == -1) {
$this->iVertSpacing = $this->iAvailableHeight / $this->iVertLines;
@@ -3156,7 +3253,7 @@ class GanttConstraint
//---------------
// CONSTRUCTOR
- public function GanttConstraint($aRow, $aType, $aColor, $aArrowSize, $aArrowType)
+ public function __construct($aRow, $aType, $aColor, $aArrowSize, $aArrowType)
{
$this->iConstrainType = $aType;
$this->iConstrainRow = $aRow;
@@ -3182,14 +3279,14 @@ class GanttPlotObject
public $constraints = array();
public $iCaptionMargin=5;
public $iConstrainPos=array();
- protected $iStart=""; // Start date
- public $iVPos=0; // Vertical position
- protected $iLabelLeftMargin=2; // Title margin
-
- public function GanttPlotObject()
+ protected $iStart=""; // Start date
+ public $iVPos=0; // Vertical position
+ protected $iLabelLeftMargin=2; // Title margin
+
+ public function __construct()
{
$this->title = new TextProperty();
- $this->title->Align("left", "center");
+ $this->title->Align('left', 'center');
$this->caption = new TextProperty();
}
@@ -3215,7 +3312,7 @@ class GanttPlotObject
$this->csimwintarget=$aWinTarget;
$this->csimalt=$aAlt;
}
-
+
public function SetCSIMAlt($aAlt)
{
if (!is_string($aAlt)) {
@@ -3236,12 +3333,6 @@ class GanttPlotObject
$this->iConstrainPos = array($xt,$yt,$xb,$yb);
}
- /*
- function GetConstrain() {
- return array($this->iConstrainRow,$this->iConstrainType);
- }
- */
-
public function GetMinDate()
{
return $this->iStart;
@@ -3251,7 +3342,7 @@ class GanttPlotObject
{
return $this->iStart;
}
-
+
public function SetCaptionMargin($aMarg)
{
$this->iCaptionMargin=$aMarg;
@@ -3261,7 +3352,7 @@ class GanttPlotObject
{
return 0;
}
-
+
public function GetLineNbr()
{
return $this->iVPos;
@@ -3293,13 +3384,13 @@ class Progress
public $iFillColor='black';
public $iDensity=98;
public $iHeight=0.65;
-
+
public function Set($aProg)
{
if ($aProg < 0.0 || $aProg > 1.0) {
JpGraphError::RaiseL(6027);
+ //("Progress value must in range [0, 1]");
}
- //("Progress value must in range [0, 1]");
$this->iProgress = $aProg;
}
@@ -3314,15 +3405,15 @@ class Progress
{
$this->iFillColor = $aColor;
}
-
+
public function SetHeight($aHeight)
{
$this->iHeight = $aHeight;
}
}
-DEFINE('GANTT_HGRID1', 0);
-DEFINE('GANTT_HGRID2', 1);
+define('GANTT_HGRID1', 0);
+define('GANTT_HGRID2', 1);
//===================================================
// CLASS HorizontalGridLine
@@ -3337,13 +3428,13 @@ class HorizontalGridLine
private $line=null;
private $iStart=0; // 0=from left margin, 1=just along header
- public function HorizontalGridLine()
+ public function __construct()
{
$this->line = new LineProperty();
$this->line->SetColor('gray@0.4');
$this->line->SetStyle('dashed');
}
-
+
public function Show($aShow=true)
{
$this->iShow = $aShow;
@@ -3429,11 +3520,14 @@ class GanttBar extends GanttPlotObject
private $iPattern=GANTT_RDIAG;
private $iPatternColor="blue";
private $iPatternDensity=95;
+ private $iBreakStyle=false;
+ private $iBreakLineStyle='dotted';
+ private $iBreakLineWeight=1;
//---------------
// CONSTRUCTOR
- public function GanttBar($aPos, $aLabel, $aStart, $aEnd, $aCaption="", $aHeightFactor=0.6)
+ public function __construct($aPos, $aLabel, $aStart, $aEnd, $aCaption="", $aHeightFactor=0.6)
{
- parent::GanttPlotObject();
+ parent::__construct();
$this->iStart = $aStart;
// Is the end date given as a date or as number of days added to start date?
if (is_string($aEnd)) {
@@ -3458,7 +3552,7 @@ class GanttBar extends GanttPlotObject
$this->rightMark->Hide();
$this->progress = new Progress();
}
-
+
//---------------
// PUBLIC METHODS
public function SetShadow($aShadow=true, $aColor="gray")
@@ -3466,12 +3560,19 @@ class GanttBar extends GanttPlotObject
$this->iShadow=$aShadow;
$this->iShadowColor=$aColor;
}
-
+
+ public function SetBreakStyle($aFlg=true, $aLineStyle='dotted', $aLineWeight=1)
+ {
+ $this->iBreakStyle = $aFlg;
+ $this->iBreakLineStyle = $aLineStyle;
+ $this->iBreakLineWeight = $aLineWeight;
+ }
+
public function GetMaxDate()
{
return $this->iEnd;
}
-
+
public function SetHeight($aHeight)
{
$this->iHeightFactor = $aHeight;
@@ -3505,7 +3606,7 @@ class GanttBar extends GanttPlotObject
return -1;
}
}
-
+
public function SetPattern($aPattern, $aColor="blue", $aDensity=95)
{
$this->iPattern = $aPattern;
@@ -3528,17 +3629,16 @@ class GanttBar extends GanttPlotObject
$vs = $this->iHeightFactor;
} else {
JpGraphError::RaiseL(6028, $this->iHeightFactor);
+ // ("Specified height (".$this->iHeightFactor.") for gantt bar is out of range.");
}
- //("Specified height (".$this->iHeightFactor.") for gantt bar is out of range.");
-
+
// Clip date to min max dates to show
$st = $aScale->NormalizeDate($this->iStart);
$en = $aScale->NormalizeDate($this->iEnd);
-
$limst = max($st, $aScale->iStartDate);
$limen = min($en, $aScale->iEndDate);
-
+
$xt = round($aScale->TranslateDate($limst));
$xb = round($aScale->TranslateDate($limen));
$yt = round($aScale->TranslateVertPos($this->iVPos)-$vs-($aScale->GetVertSpacing()/2-$vs/2));
@@ -3559,11 +3659,11 @@ class GanttBar extends GanttPlotObject
if (! empty($this->title->csimtarget[$i])) {
$this->csimarea .= "title->csimtarget[$i]."\"";
-
+
if (! empty($this->title->csimwintarget[$i])) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\" ";
}
-
+
if (! empty($this->title->csimalt[$i])) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
@@ -3572,35 +3672,46 @@ class GanttBar extends GanttPlotObject
}
}
}
-
+
// Check if the bar is totally outside the current scale range
if ($en < $aScale->iStartDate || $st > $aScale->iEndDate) {
return;
}
-
+
// Remember the positions for the bar
$this->SetConstrainPos($xt, $yt, $xb, $yb);
-
+
+
+
$prect->ShowFrame(false);
$prect->SetBackground($this->iFillColor);
- if ($this->iShadow) {
+ if ($this->iBreakStyle) {
$aImg->SetColor($this->iFrameColor);
- $aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
- $prect->SetPos(new Rectangle($xt+1, $yt+1, $xb-$xt-$this->iShadowWidth-2, $yb-$yt-$this->iShadowWidth-2));
- $prect->Stroke($aImg);
+ $olds = $aImg->SetLineStyle($this->iBreakLineStyle);
+ $oldw = $aImg->SetLineWeight($this->iBreakLineWeight);
+ $aImg->StyleLine($xt, $yt, $xb, $yt);
+ $aImg->StyleLine($xt, $yb, $xb, $yb);
+ $aImg->SetLineStyle($olds);
+ $aImg->SetLineWeight($oldw);
} else {
- $prect->SetPos(new Rectangle($xt, $yt, $xb-$xt+1, $yb-$yt+1));
- $prect->Stroke($aImg);
- $aImg->SetColor($this->iFrameColor);
- $aImg->Rectangle($xt, $yt, $xb, $yb);
+ if ($this->iShadow) {
+ $aImg->SetColor($this->iFrameColor);
+ $aImg->ShadowRectangle($xt, $yt, $xb, $yb, $this->iFillColor, $this->iShadowWidth, $this->iShadowColor);
+ $prect->SetPos(new Rectangle($xt+1, $yt+1, $xb-$xt-$this->iShadowWidth-2, $yb-$yt-$this->iShadowWidth-2));
+ $prect->Stroke($aImg);
+ } else {
+ $prect->SetPos(new Rectangle($xt, $yt, $xb-$xt+1, $yb-$yt+1));
+ $prect->Stroke($aImg);
+ $aImg->SetColor($this->iFrameColor);
+ $aImg->Rectangle($xt, $yt, $xb, $yb);
+ }
}
-
// CSIM for bar
if (! empty($this->csimtarget)) {
$coords = "$xt,$yt,$xb,$yt,$xb,$yb,$xt,$yb";
$this->csimarea .= "csimtarget."\"";
-
+
if (!empty($this->csimwintarget)) {
$this->csimarea .= " target=\"".$this->csimwintarget."\" ";
}
@@ -3621,19 +3732,19 @@ class GanttBar extends GanttPlotObject
$endpos = $xtp+$len;
if ($endpos > $xt) {
- // Take away the length of the progress that is not visible (before the start date)
+ // Take away the length of the progress that is not visible (before the start date)
$len -= ($xt-$xtp);
// Is the the progress bar visible after the start date?
if ($xtp < $xt) {
$xtp = $xt;
}
-
+
// Make sure that the progess bar doesn't extend over the end date
if ($xtp+$len-1 > $xb) {
$len = $xb - $xtp ;
}
-
+
$prog = $factory->Create($this->progress->iPattern, $this->progress->iColor);
$prog->SetDensity($this->progress->iDensity);
$prog->SetBackground($this->progress->iFillColor);
@@ -3648,7 +3759,7 @@ class GanttBar extends GanttPlotObject
$prog->Stroke($aImg);
}
}
-
+
// We don't plot the end mark if the bar has been capped
if ($limst == $st) {
$y = $middle;
@@ -3669,7 +3780,7 @@ class GanttBar extends GanttPlotObject
$y = $yb ;
}
$this->rightMark->Stroke($aImg, $xb, $y);
-
+
$margin = $this->iCaptionMargin;
if ($this->rightMark->show) {
$margin += $this->rightMark->GetWidth();
@@ -3686,12 +3797,12 @@ class GanttBar extends GanttPlotObject
class MileStone extends GanttPlotObject
{
public $mark;
-
+
//---------------
// CONSTRUCTOR
- public function MileStone($aVPos, $aLabel, $aDate, $aCaption="")
+ public function __construct($aVPos, $aLabel, $aDate, $aCaption="")
{
- GanttPlotObject::GanttPlotObject();
+ GanttPlotObject::__construct();
$this->caption->Set($aCaption);
$this->caption->Align("left", "center");
$this->caption->SetFont(FF_FONT1, FS_BOLD);
@@ -3705,15 +3816,15 @@ class MileStone extends GanttPlotObject
$this->iVPos = $aVPos;
$this->iStart = $aDate;
}
-
+
//---------------
// PUBLIC METHODS
-
+
public function GetAbsHeight($aImg)
{
return max($this->title->GetHeight($aImg), $this->mark->GetWidth());
}
-
+
public function Stroke($aImg, $aScale)
{
// Put the mark in the middle at the middle of the day
@@ -3736,14 +3847,14 @@ class MileStone extends GanttPlotObject
$title_xt = $colstarts[$i];
$title_xb = $title_xt + $colwidth[$i];
$coords = "$title_xt,$yt,$title_xb,$yt,$title_xb,$yb,$title_xt,$yb";
-
+
if (!empty($this->title->csimtarget[$i])) {
$this->csimarea .= "title->csimtarget[$i]."\"";
-
+
if (!empty($this->title->csimwintarget[$i])) {
$this->csimarea .= "target=\"".$this->title->csimwintarget[$i]."\"";
}
-
+
if (! empty($this->title->csimalt[$i])) {
$tmp = $this->title->csimalt[$i];
$this->csimarea .= " title=\"$tmp\" alt=\"$tmp\" ";
@@ -3761,13 +3872,13 @@ class MileStone extends GanttPlotObject
// this milestone
$w = $this->mark->GetWidth()/2;
$this->SetConstrainPos($x, round($y-$w), $x, round($y+$w));
-
+
// Setup CSIM
if ($this->csimtarget != '') {
$this->mark->SetCSIMTarget($this->csimtarget);
$this->mark->SetCSIMAlt($this->csimalt);
}
-
+
$this->mark->Stroke($aImg, $x, $y);
$this->caption->Stroke($aImg, $x+$this->mark->width/2+$this->iCaptionMargin, $y);
@@ -3783,9 +3894,9 @@ class MileStone extends GanttPlotObject
class TextPropertyBelow extends TextProperty
{
- public function TextPropertyBelow($aTxt='')
+ public function __construct($aTxt='')
{
- parent::TextProperty($aTxt);
+ parent::__construct($aTxt);
}
public function GetColWidth($aImg, $aMargin=0)
@@ -3800,13 +3911,15 @@ class GanttVLine extends GanttPlotObject
{
private $iLine;
private $title_margin=3;
- private $iDayOffset=1;
-
+ private $iDayOffset=0.5;
+ private $iStartRow = -1;
+ private $iEndRow = -1;
+
//---------------
// CONSTRUCTOR
- public function GanttVLine($aDate, $aTitle="", $aColor="black", $aWeight=3, $aStyle="dashed")
+ public function __construct($aDate, $aTitle="", $aColor="darkred", $aWeight=2, $aStyle="solid")
{
- GanttPlotObject::GanttPlotObject();
+ GanttPlotObject::__construct();
$this->iLine = new LineProperty();
$this->iLine->SetColor($aColor);
$this->iLine->SetWeight($aWeight);
@@ -3819,20 +3932,33 @@ class GanttVLine extends GanttPlotObject
//---------------
// PUBLIC METHODS
+ // Set start and end rows for the VLine. By default the entire heigh of the
+ // Gantt chart is used
+ public function SetRowSpan($aStart, $aEnd=-1)
+ {
+ $this->iStartRow = $aStart;
+ $this->iEndRow = $aEnd;
+ }
+
public function SetDayOffset($aOff=0.5)
{
if ($aOff < 0.0 || $aOff > 1.0) {
JpGraphError::RaiseL(6029);
+ //("Offset for vertical line must be in range [0,1]");
}
- //("Offset for vertical line must be in range [0,1]");
$this->iDayOffset = $aOff;
}
-
+
public function SetTitleMargin($aMarg)
{
$this->title_margin = $aMarg;
}
-
+
+ public function SetWeight($aWeight)
+ {
+ $this->iLine->SetWeight($aWeight);
+ }
+
public function Stroke($aImg, $aScale)
{
$d = $aScale->NormalizeDate($this->iStart);
@@ -3842,9 +3968,20 @@ class GanttVLine extends GanttPlotObject
if ($this->iDayOffset != 0.0) {
$d += 24*60*60*$this->iDayOffset;
}
- $x = $aScale->TranslateDate($d);
- $y1 = $aScale->iVertHeaderSize+$aImg->top_margin;
- $y2 = $aImg->height - $aImg->bottom_margin;
+ $x = $aScale->TranslateDate($d);//d=1006858800,
+
+ if ($this->iStartRow > -1) {
+ $y1 = $aScale->TranslateVertPos($this->iStartRow, true) ;
+ } else {
+ $y1 = $aScale->iVertHeaderSize+$aImg->top_margin;
+ }
+
+ if ($this->iEndRow > -1) {
+ $y2 = $aScale->TranslateVertPos($this->iEndRow);
+ } else {
+ $y2 = $aImg->height - $aImg->bottom_margin;
+ }
+
$this->iLine->Stroke($aImg, $x, $y1, $x, $y2);
$this->title->Align("center", "top");
$this->title->Stroke($aImg, $x, $y2+$this->title_margin);
@@ -3866,7 +4003,7 @@ class LinkArrow
private $iSize=ARROW_S2;
private $iColor='black';
- public function LinkArrow($x, $y, $aDirection, $aType=ARROWT_SOLID, $aSize=ARROW_S2)
+ public function __construct($x, $y, $aDirection, $aType=ARROWT_SOLID, $aSize=ARROW_S2)
{
$this->iDirection = $aDirection;
$this->iType = $aType;
@@ -3874,7 +4011,7 @@ class LinkArrow
$this->ix = $x;
$this->iy = $y;
}
-
+
public function SetColor($aColor)
{
$this->iColor = $aColor;
@@ -3896,38 +4033,38 @@ class LinkArrow
$x = $this->ix;
$y = $this->iy;
switch ($this->iDirection) {
- case ARROW_DOWN:
- $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y);
- break;
- case ARROW_UP:
- $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y);
- break;
- case ARROW_LEFT:
- $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y);
- break;
- case ARROW_RIGHT:
- $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y);
- break;
- default:
- JpGraphError::RaiseL(6030);
-//('Unknown arrow direction for link.');
- die();
- break;
- }
+ case ARROW_DOWN:
+ $c = array($x,$y,$x-$dx,$y-$dy,$x+$dx,$y-$dy,$x,$y);
+ break;
+ case ARROW_UP:
+ $c = array($x,$y,$x-$dx,$y+$dy,$x+$dx,$y+$dy,$x,$y);
+ break;
+ case ARROW_LEFT:
+ $c = array($x,$y,$x+$dy,$y-$dx,$x+$dy,$y+$dx,$x,$y);
+ break;
+ case ARROW_RIGHT:
+ $c = array($x,$y,$x-$dy,$y-$dx,$x-$dy,$y+$dx,$x,$y);
+ break;
+ default:
+ JpGraphError::RaiseL(6030);
+ //('Unknown arrow direction for link.');
+ die();
+ break;
+ }
$aImg->SetColor($this->iColor);
switch ($this->iType) {
- case ARROWT_SOLID:
- $aImg->FilledPolygon($c);
- break;
- case ARROWT_OPEN:
- $aImg->Polygon($c);
- break;
- default:
- JpGraphError::RaiseL(6031);
-//('Unknown arrow type for link.');
- die();
- break;
- }
+ case ARROWT_SOLID:
+ $aImg->FilledPolygon($c);
+ break;
+ case ARROWT_OPEN:
+ $aImg->Polygon($c);
+ break;
+ default:
+ JpGraphError::RaiseL(6031);
+ //('Unknown arrow type for link.');
+ die();
+ break;
+ }
}
}
@@ -3949,7 +4086,7 @@ class GanttLink
private $iArrowSize=ARROW_S2;
private $iArrowType=ARROWT_SOLID;
- public function GanttLink($x1=0, $y1=0, $x2=0, $y2=0)
+ public function __construct($x1=0, $y1=0, $x2=0, $y2=0)
{
$this->ix1 = $x1;
$this->ix2 = $x2;
@@ -3980,7 +4117,7 @@ class GanttLink
$this->iArrowSize = $aSize;
$this->iArrowType = $aType;
}
-
+
public function SetWeight($aWeight)
{
$this->iWeight = $aWeight;
@@ -4014,52 +4151,52 @@ class GanttLink
$midy = round(($y2-$y1)/2+$y1);
if ($x2 > $x1) {
switch ($this->iPathType) {
- case 0:
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- break;
- case 1:
- case 2:
- case 3:
- $c = array($x1,$y1,$x2,$y1,$x2,$y2);
- break;
- default:
- JpGraphError::RaiseL(6032, $this->iPathType);
-//('Internal error: Unknown path type (='.$this->iPathType .') specified for link.');
- exit(1);
- break;
- }
+ case 0:
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ $c = array($x1,$y1,$x2,$y1,$x2,$y2);
+ break;
+ default:
+ JpGraphError::RaiseL(6032, $this->iPathType);
+ //('Internal error: Unknown path type (='.$this->iPathType .') specified for link.');
+ exit(1);
+ break;
+ }
} else {
switch ($this->iPathType) {
- case 0:
- case 1:
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- break;
- case 2:
- // Always extend out horizontally a bit from the first point
- // If we draw a link back in time (end to start) and the bars
- // are very close we also change the path so it comes in from
- // the left on the activity
- $c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
- $x1+$this->iPathExtend,$midy,
- $x2,$midy,$x2,$y2);
- break;
- case 3:
- if ($y2-$midy < 6) {
- $c = array($x1,$y1,$x1,$midy,
- $x2-$this->iPathExtend,$midy,
- $x2-$this->iPathExtend,$y2,
- $x2,$y2);
- $arrowtype = ARROW_RIGHT;
- } else {
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- }
- break;
- default:
- JpGraphError::RaiseL(6032, $this->iPathType);
-//('Internal error: Unknown path type specified for link.');
- exit(1);
- break;
- }
+ case 0:
+ case 1:
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ break;
+ case 2:
+ // Always extend out horizontally a bit from the first point
+ // If we draw a link back in time (end to start) and the bars
+ // are very close we also change the path so it comes in from
+ // the left on the activity
+ $c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
+ $x1+$this->iPathExtend,$midy,
+ $x2,$midy,$x2,$y2);
+ break;
+ case 3:
+ if ($y2-$midy < 6) {
+ $c = array($x1,$y1,$x1,$midy,
+ $x2-$this->iPathExtend,$midy,
+ $x2-$this->iPathExtend,$y2,
+ $x2,$y2);
+ $arrowtype = ARROW_RIGHT;
+ } else {
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ }
+ break;
+ default:
+ JpGraphError::RaiseL(6032, $this->iPathType);
+ //('Internal error: Unknown path type specified for link.');
+ exit(1);
+ break;
+ }
}
$arrow = new LinkArrow($x2, $y2, $arrowtype);
} else {
@@ -4068,50 +4205,50 @@ class GanttLink
$midy = round(($y1-$y2)/2+$y2);
if ($x2 > $x1) {
switch ($this->iPathType) {
- case 0:
- case 1:
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- break;
- case 3:
- if ($midy-$y2 < 8) {
- $arrowtype = ARROW_RIGHT;
- $c = array($x1,$y1,$x1,$y2,$x2,$y2);
- } else {
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- }
- break;
- default:
- JpGraphError::RaiseL(6032, $this->iPathType);
-//('Internal error: Unknown path type specified for link.');
- break;
- }
+ case 0:
+ case 1:
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ break;
+ case 3:
+ if ($midy-$y2 < 8) {
+ $arrowtype = ARROW_RIGHT;
+ $c = array($x1,$y1,$x1,$y2,$x2,$y2);
+ } else {
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ }
+ break;
+ default:
+ JpGraphError::RaiseL(6032, $this->iPathType);
+ //('Internal error: Unknown path type specified for link.');
+ break;
+ }
} else {
switch ($this->iPathType) {
- case 0:
- case 1:
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- break;
- case 2:
- // Always extend out horizontally a bit from the first point
- $c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
- $x1+$this->iPathExtend,$midy,
- $x2,$midy,$x2,$y2);
- break;
- case 3:
- if ($midy-$y2 < 16) {
- $arrowtype = ARROW_RIGHT;
- $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy,
- $x2-$this->iPathExtend,$y2,
- $x2,$y2);
- } else {
- $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
- }
- break;
- default:
- JpGraphError::RaiseL(6032, $this->iPathType);
-//('Internal error: Unknown path type specified for link.');
- break;
- }
+ case 0:
+ case 1:
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ break;
+ case 2:
+ // Always extend out horizontally a bit from the first point
+ $c = array($x1,$y1,$x1+$this->iPathExtend,$y1,
+ $x1+$this->iPathExtend,$midy,
+ $x2,$midy,$x2,$y2);
+ break;
+ case 3:
+ if ($midy-$y2 < 16) {
+ $arrowtype = ARROW_RIGHT;
+ $c = array($x1,$y1,$x1,$midy,$x2-$this->iPathExtend,$midy,
+ $x2-$this->iPathExtend,$y2,
+ $x2,$y2);
+ } else {
+ $c = array($x1,$y1,$x1,$midy,$x2,$midy,$x2,$y2);
+ }
+ break;
+ default:
+ JpGraphError::RaiseL(6032, $this->iPathType);
+ //('Internal error: Unknown path type specified for link.');
+ break;
+ }
}
$arrow = new LinkArrow($x2, $y2, $arrowtype);
}
diff --git a/onyx2/include/jpgraph/jpgraph_gb2312.php b/onyx2/include/jpgraph/jpgraph_gb2312.php
index 5e4fe4c..7eafce1 100644
--- a/onyx2/include/jpgraph/jpgraph_gb2312.php
+++ b/onyx2/include/jpgraph/jpgraph_gb2312.php
@@ -1,11 +1,11 @@
25745, 13126 => 31216, 13127 => 22478, 13128 => 27225, 13129 => 25104,
13130 => 21576, 13131 => 20056, 13132 => 31243, 13133 => 24809, 13134 => 28548,
13135 => 35802, 13136 => 25215, 13137 => 36894, 13138 => 39563, 13139 => 31204,
-13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744,
-13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831,
-13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021,
-13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815,
-13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364,
-13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504,
-13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986,
-13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607,
-13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648,
-13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571,
-13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337,
-13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162,
-13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810,
-13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943,
-13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850,
-13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913,
-13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789,
-13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874,
-13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995,
-13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419,
-13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828,
-13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140,
-13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923,
-13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169,
-13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171,
-13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140,
-13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955,
-13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285,
-13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966,
-13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129,
-13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377,
-13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443,
-13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548,
-13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423,
-13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783,
-13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011,
-13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932,
-13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265,
-13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532,
-13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072,
-13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856,
-13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008,
-13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583,
-13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993,
-13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300,
-13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853,
-13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025,
-13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746,
-13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026,
-13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923,
-13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497,
-13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563,
-13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581,
-13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922,
-13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701,
-13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534,
-13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544,
-13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045,
-13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810,
-13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346,
-13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558,
-13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769,
-13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943,
-13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799,
-13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108,
-14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240,
-14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281,
-14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718,
-14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453,
-14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277,
-14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938,
-14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775,
-14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857,
-14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536,
-14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452,
-14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439,
-14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859,
-14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016,
-14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155,
-14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911,
-14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315,
-14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413,
-14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679,
-14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014,
-14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995,
-14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023,
-14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212,
-14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613,
-14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127,
-14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538,
-14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913,
-14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178,
-14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925,
-14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195,
-14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923,
-14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705,
-14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957,
-14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733,
-14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011,
-14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684,
-14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010,
-14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789,
-14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831,
-14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685,
-14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467,
-14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129,
-14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503,
-14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815,
-14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272,
-14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476,
-14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925,
-14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916,
-14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054,
-14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448,
-14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592,
-14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191,
-14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789,
-14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740,
-14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330,
-14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829,
-14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065,
-14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023,
-14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219,
-14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085,
-14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752,
-14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717,
-14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477,
-14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627,
-14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009,
-14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680,
-14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418,
-14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203,
-14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657,
-14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756,
-14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720,
-14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946,
-14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399,
-14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518,
-14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774,
-14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946,
-14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252,
-15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719,
-15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010,
-15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576,
-15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707,
-15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796,
-15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462,
-15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970,
-15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822,
-15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854,
-15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674,
-15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935,
-15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229,
-15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826,
-15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746,
-15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249,
-15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669,
-15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522,
-15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637,
-15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749,
-15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513,
-15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598,
-15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363,
-15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034,
-15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395,
-15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982,
-15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082,
-15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426,
-15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478,
-15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002,
-15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550,
-15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362,
-15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860,
-15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575,
-15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315,
-15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943,
-15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145,
-15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581,
-15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293,
-15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558,
-15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728,
-15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477,
-15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014,
-15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047,
-15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389,
-15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564,
-15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735,
-15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509,
-15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130,
-15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463,
-15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299,
-15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028,
-15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626,
-15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170,
-15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165,
-15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105,
-15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170,
-15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230,
-15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923,
-15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048,
-15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452,
-15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928,
-15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416,
-15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061,
-15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276,
-15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816,
-15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545,
-15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030,
-15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040,
-15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465,
-15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424,
-15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367,
-15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496,
-15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776,
-15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891,
-15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994,
-16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345,
-16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975,
-16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350,
-16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968,
-16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771,
-16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499,
-16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185,
-16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811,
-16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827,
-16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354,
-16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475,
-16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391,
-16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840,
-16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359,
-16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454,
-16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719,
-16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420,
-16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745,
-16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372,
-16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193,
-16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895,
-16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713,
-16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639,
-16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572,
-16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518,
-16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436,
-16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438,
-16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013,
-16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048,
-16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047,
-16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867,
-16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400,
-16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432,
-16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324,
-16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519,
-16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782,
-16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432,
-16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582,
-16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852,
-16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604,
-16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142,
-16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937,
-16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742,
-16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769,
-16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525,
-16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243,
-16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872,
-16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967,
-16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107,
-16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618,
-16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278,
-16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725,
-16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705,
-16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016,
-16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857,
-16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534,
-16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044,
-16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446,
-16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523,
-16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860,
-16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510,
-16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540,
-16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653,
-16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459,
-16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371,
-16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504,
-16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177,
-16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746,
-16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585,
-16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476,
-17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434,
-17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475,
-17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033,
-17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067,
-17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426,
-17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725,
-17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683,
-17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125,
-17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522,
-17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809,
-17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654,
-17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376,
-17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308,
-17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391,
-17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855,
-17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269,
-17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825,
-17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193,
-17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551,
-17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217,
-17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279,
-17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126,
-17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629,
-17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169,
-17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273,
-17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819,
-17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279,
-17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982,
-17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215,
-17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287,
-17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048,
-17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035,
-17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007,
-17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700,
-17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869,
-17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522,
-17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311,
-17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288,
-17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565,
-17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423,
-17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221,
-17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957,
-17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197,
-17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892,
-17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899,
-17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062,
-17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485,
-17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812,
-17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597,
-17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472,
-17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424,
-17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467,
-17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982,
-17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957,
-17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521,
-17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329,
-17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256,
-17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842,
-17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527,
-17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713,
-17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607,
-17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305,
-17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687,
-17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418,
-17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340,
-17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050,
-17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973,
-17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900,
-17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843,
-17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166,
-17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484,
-18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889,
-18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646,
-18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422,
-18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855,
-18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784,
-18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215,
-18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865,
-18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323,
-18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688,
-18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085,
-18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878,
-18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069,
-18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545,
-18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595,
-18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378,
-18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708,
-18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039,
-18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431,
-18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623,
-18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206,
-18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165,
-18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682,
-18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228,
-18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198,
-18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041,
-18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845,
-18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527,
-18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094,
-18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079,
-18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154,
-18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570,
-18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063,
-18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982,
-18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756,
-18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200,
-18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161,
-18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748,
-18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173,
-18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635,
-18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466,
-18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593,
-18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785,
-18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719,
-18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384,
-18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922,
-18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187,
-18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705,
-18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195,
-18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862,
-18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049,
-18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022,
-18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441,
-18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378,
-18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892,
-18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260,
-18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578,
-18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903,
-18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736,
-18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503,
-18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556,
-18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775,
-18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145,
-18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457,
-18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183,
-18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319,
-18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988,
-18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045,
-18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313,
-18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135,
-18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690,
-19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335,
-19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107,
-19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159,
-19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365,
-19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643,
-19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163,
-19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806,
-19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530,
-19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460,
-19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174,
-19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329,
-19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646,
-19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101,
-19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465,
-19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928,
-19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684,
-19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561,
-19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308,
-19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031,
-19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496,
-19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987,
-19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051,
-19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865,
-19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368,
-19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439,
-19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609,
-19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240,
-19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543,
-19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319,
-19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439,
-19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553,
-19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604,
-19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549,
-19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492,
-19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826,
-19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138,
-19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192,
-19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631,
-19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845,
-19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848,
-19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538,
-19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059,
-19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867,
-19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305,
-19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799,
-19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064,
-19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159,
-19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825,
-19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684,
-19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834,
-19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086,
-19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311,
-19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351,
-19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516,
-19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413,
-19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237,
-19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361,
-19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648,
-19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242,
-19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114,
-19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302,
-19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534,
-19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822,
-19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043,
-19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916,
-19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024,
-19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202,
-19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975,
-19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505,
-19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536,
-19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361,
-20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807,
-20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479,
-20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614,
-20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031,
-20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205,
-20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239,
-20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441,
-20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985,
-20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065,
-20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569,
-20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044,
-20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436,
-20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494,
-20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237,
-20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212,
-20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823,
-20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802,
-20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177,
-20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713,
-20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911,
-20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989,
-20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115,
-20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454,
-20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758,
-20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979,
-20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184,
-20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688,
-20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046,
-20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616,
-20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673,
-20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456,
-20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140,
-20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814,
-20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055,
-20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831,
-20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179,
-20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195,
-20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880,
-20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463,
-20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658,
-20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889,
-20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844,
-20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455,
-20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571,
-20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125,
-20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411,
-20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184,
-20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982,
-20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066,
-20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957,
-20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687,
-20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035,
-20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465,
-20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110,
-20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927,
-20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873,
-20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203,
-20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195,
-20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547,
-20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757,
-20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276,
-20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469,
-20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079,
-20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937,
-20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416,
-20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310,
-20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839,
-20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436,
-20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746,
-20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476,
-20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495,
-20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113,
-20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208,
-20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992,
-20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591,
-21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676,
-21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928,
-21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918,
-21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494,
-21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968,
-21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381,
-21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951,
-21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778,
-21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433,
-21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197,
-21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673,
-21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900,
-21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589,
-21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811,
-21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764,
-21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240,
-21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535,
-21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609,
-21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185,
-21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721,
-21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814,
-21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828,
-21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219,
-21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553,
-21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703,
-21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736,
-21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080,
-21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377,
-21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825,
-21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110,
-21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286,
-21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841,
-21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089,
-21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431,
-21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419,
-21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786,
-21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946,
-21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044,
-21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900,
-21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588,
-21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503,
-21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895,
-21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234,
-21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376,
-21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095,
-21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164,
-21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277,
-21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798,
-21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681,
-21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039,
-21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299,
-21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481,
-21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157,
-21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156,
-21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192,
-21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711,
-21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048,
-21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688,
-21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528,
-21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838,
-21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637,
-21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449,
-21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432,
-21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454,
-21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960,
-21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214,
-21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806,
-21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746,
-21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071,
-21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495,
-21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024,
-21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663,
-21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379,
-21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596,
-21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103,
-22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525,
-22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930,
-22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844,
-22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540,
-22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286,
-22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370,
-22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092,
-22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258,
-22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835,
-22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047,
-22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325,
-22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030,
-22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920,
-22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172,
-22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417,
-22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481,
-22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065,
-22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496,
-22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880,
-22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341,
-22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186,
-22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918,
-22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181,
-22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846,
-22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700,
-22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528,
-22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164,
-22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043,
-22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258,
-22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394,
-22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049,
-22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275,
-22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459,
-22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257,
-22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152,
-22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316,
-22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800,
-22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120,
-22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008,
-22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829,
-22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996,
-22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022,
-22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115,
-22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164,
-22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422,
-22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286,
-22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347,
-22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043,
-22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089,
-22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121,
-22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155,
-22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193,
-22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258,
-22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233,
-22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314,
-22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285,
-22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355,
-22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348,
-22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458,
-22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433,
-22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467,
-22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478,
-22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606,
-22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588,
-22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666,
-22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710,
-22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709,
-22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718,
-22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320,
-22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335,
-22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128,
-22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149,
-22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819,
-22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924,
-23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744,
-23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765,
-23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791,
-23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798,
-23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808,
-23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824,
-23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839,
-23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852,
-23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861,
-23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869,
-23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879,
-23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890,
-23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370,
-23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442,
-23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484,
-23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516,
-23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015,
-23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025,
-23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048,
-23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072,
-23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090,
-23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103,
-23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155,
-23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190,
-23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165,
-23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232,
-23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981,
-23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042,
-23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654,
-23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316,
-23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319,
-23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405,
-23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376,
-23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436,
-23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452,
-23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490,
-23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511,
-23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541,
-23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553,
-23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657,
-23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729,
-23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423,
-23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425,
-23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470,
-23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432,
-23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473,
-23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439,
-23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545,
-23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500,
-23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531,
-23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556,
-23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617,
-23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596,
-23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583,
-23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600,
-23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587,
-23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641,
-23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712,
-23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706,
-23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718,
-23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688,
-23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729,
-23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816,
-23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820,
-23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759,
-23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770,
-23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761,
-23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907,
-23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912,
-23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932,
-23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997,
-23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994,
-23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977,
-23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060,
-23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079,
-23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044,
-24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142,
-24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171,
-24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169,
-24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231,
-24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303,
-24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364,
-24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823,
-24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586,
-24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194,
-24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303,
-24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419,
-24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466,
-24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482,
-24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592,
-24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550,
-24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665,
-24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638,
-24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750,
-24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786,
-24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826,
-24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530,
-24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501,
-24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526,
-24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588,
-24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593,
-24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623,
-24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636,
-24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677,
-24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670,
-24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717,
-24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722,
-24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725,
-24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792,
-24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795,
-24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863,
-24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825,
-24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815,
-24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811,
-24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891,
-24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919,
-24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983,
-24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994,
-24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995,
-24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956,
-24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964,
-24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756,
-24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052,
-24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061,
-24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093,
-24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100,
-24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139,
-24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228,
-24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251,
-24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281,
-24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081,
-24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132,
-24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692,
-24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688,
-24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708,
-24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723,
-24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748,
-24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810,
-24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844,
-24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870,
-24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919,
-24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913,
-24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955,
-24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450,
-24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473,
-24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508,
-24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364,
-24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390,
-24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417,
-24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427,
-24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459,
-25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461,
-25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496,
-25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536,
-25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821,
-25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271,
-25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276,
-25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300,
-25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313,
-25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209,
-25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249,
-25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274,
-25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210,
-25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579,
-25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574,
-25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568,
-25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591,
-25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639,
-25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698,
-25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730,
-25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716,
-25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797,
-25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864,
-25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832,
-25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004,
-25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077,
-25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385,
-25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398,
-25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410,
-25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418,
-25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426,
-25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732,
-25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792,
-25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764,
-25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860,
-25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863,
-25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883,
-25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902,
-25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976,
-25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947,
-25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983,
-25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015,
-25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052,
-25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186,
-25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095,
-25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121,
-25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203,
-25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255,
-25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197,
-25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384,
-25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349,
-25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367,
-25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486,
-25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463,
-25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425,
-25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536,
-25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617,
-25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641,
-25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698,
-25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751,
-25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443,
-25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652,
-25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423,
-25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837,
-25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851,
-25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902,
-25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917,
-25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945,
-25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962,
-25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994,
-25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407,
-25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632,
-25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700,
-25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380,
-25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925,
-25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986,
-26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962,
-26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046,
-26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033,
-26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057,
-26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114,
-26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004,
-26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230,
-26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224,
-26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270,
-26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318,
-26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580,
-26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379,
-26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546,
-26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557,
-26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571,
-26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581,
-26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589,
-26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421,
-26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446,
-26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459,
-26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475,
-26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494,
-26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502,
-26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514,
-26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524,
-26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537,
-26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546,
-26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551,
-26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559,
-26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565,
-26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013,
-26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599,
-26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619,
-26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657,
-26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662,
-26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787,
-26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742,
-26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788,
-26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805,
-26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825,
-26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865,
-26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890,
-26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462,
-26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474,
-26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536,
-26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492,
-26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601,
-26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586,
-26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552,
-26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674,
-26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722,
-26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709,
-26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686,
-26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767,
-26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818,
-26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873,
-26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967,
-26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976,
-26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008,
-26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015,
-26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979,
-26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051,
-26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082,
-26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135,
-26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237,
-26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216,
-26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197,
-26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280,
-26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522,
-26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538,
-26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553,
-26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722,
-26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727,
-26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737,
-27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749,
-27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558,
-27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122,
-27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255,
-27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969,
-27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096,
-27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133,
-27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164,
-27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207,
-27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209,
-27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279,
-27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342,
-27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155,
-27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168,
-27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185,
-27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278,
-27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343,
-27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311,
-27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330,
-27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816,
-27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637,
-27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661,
-27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681,
-27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909,
-27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270,
-27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924,
-27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945,
-27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999,
-27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962,
-27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384,
-27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005,
-27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389,
-27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068,
-27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107,
-27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120,
-27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127,
-27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169,
-27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406,
-27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428,
-27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481,
-27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129,
-27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315,
-27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054,
-27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066,
-27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829,
-27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849,
-27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950,
-27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032,
-27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050,
-27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088,
-27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213,
-27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113,
-27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161,
-27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067,
-27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063,
-27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109,
-27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529,
-27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679,
-27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838,
-27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035,
-27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795,
-27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720,
-27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027,
-27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778,
-27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764,
-27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806,
-27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796,
-27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855,
-27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905,
-27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956,
-28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012,
-28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699,
-28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457,
-28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489,
-28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544,
-28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568,
-28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589,
-28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624,
-28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016,
-28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066,
-28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607,
-28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633,
-28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866,
-28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026,
-28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036,
-28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044,
-28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061,
-28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068,
-28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074,
-28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088,
-28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093,
-28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101,
-28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107,
-28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116,
-28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121,
-28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132,
-28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141,
-28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151,
-28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159,
-28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166,
-28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175,
-28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188,
-28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199,
-28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210,
-28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217,
-28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227,
-28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233,
-28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241,
-28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247,
-28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252,
-28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202,
-28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213,
-28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235,
-28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287,
-28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344,
-28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918,
-28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488,
-28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498,
-28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505,
-28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516,
-28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523,
-28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535,
-28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547,
-28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554,
-28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563,
-28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109,
-28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136,
-28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146,
-28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182,
-28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193,
-28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213,
-28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232,
-28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242,
-28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271,
-28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285,
-28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315,
-28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353,
-28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398,
-28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411,
-28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943,
-28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004,
-29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045,
-29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070,
-29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099,
-29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137,
-29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386,
-29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790,
-29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806,
-29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779,
-29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850,
-29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040,
-29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055,
-29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071,
-29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381,
-29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426,
-29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443,
-29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474,
-29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485,
-29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479,
-29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545,
-29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579,
-29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513,
-29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570,
-29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590,
-29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632,
-29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623,
-29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683,
-29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699,
-29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649,
-29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770,
-29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711,
-29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741,
-29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769,
-29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784,
-29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826,
-29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566,
-29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482,
-29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509,
-29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544,
-29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520,
-29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518,
-29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564,
-29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586,
-29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655,
-29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621,
-29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668,
-29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706,
-29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742,
-29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775,
-29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808,
-29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260,
-29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325,
-29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339,
-29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353,
-29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384,
-29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039,
-29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687,
-29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889,
-29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922,
-29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948,
-29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976,
-29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725,
-29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750,
-29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174,
-29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211,
-29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199,
-29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200,
-29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217,
-29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246,
-29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253,
-29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283,
-30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301,
-30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280,
-30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277,
-30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310,
-30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303,
-30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344,
-30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361,
-30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396,
-30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416,
-30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425,
-30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426,
-30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468,
-30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508,
-30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973,
-30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294,
-30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311,
-30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643,
-30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671,
-30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718,
-30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839,
-30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702,
-30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589,
-30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518,
-30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834,
-30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066,
-30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267,
-30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082,
-30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094,
-30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099,
-30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105,
-30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113,
-30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118,
-30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125,
-30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138,
-30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143,
-30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151,
-30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159,
-30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802,
-30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834,
-30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536,
-30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616,
-30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633,
-30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752,
-30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214,
-30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654,
-30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673,
-30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715,
-30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583,
-30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605,
-30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672,
-30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677,
-30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751,
-30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772,
-0 => 0 );
+ 13140 => 21507, 13141 => 30196, 13142 => 25345, 13143 => 21273, 13144 => 27744,
+ 13145 => 36831, 13146 => 24347, 13147 => 39536, 13148 => 32827, 13149 => 40831,
+ 13150 => 20360, 13151 => 23610, 13152 => 36196, 13153 => 32709, 13154 => 26021,
+ 13155 => 28861, 13156 => 20805, 13157 => 20914, 13158 => 34411, 13159 => 23815,
+ 13160 => 23456, 13161 => 25277, 13162 => 37228, 13163 => 30068, 13164 => 36364,
+ 13165 => 31264, 13166 => 24833, 13167 => 31609, 13168 => 20167, 13169 => 32504,
+ 13170 => 30597, 13171 => 19985, 13172 => 33261, 13173 => 21021, 13174 => 20986,
+ 13175 => 27249, 13176 => 21416, 13177 => 36487, 13178 => 38148, 13179 => 38607,
+ 13180 => 28353, 13181 => 38500, 13182 => 26970, 13345 => 30784, 13346 => 20648,
+ 13347 => 30679, 13348 => 25616, 13349 => 35302, 13350 => 22788, 13351 => 25571,
+ 13352 => 24029, 13353 => 31359, 13354 => 26941, 13355 => 20256, 13356 => 33337,
+ 13357 => 21912, 13358 => 20018, 13359 => 30126, 13360 => 31383, 13361 => 24162,
+ 13362 => 24202, 13363 => 38383, 13364 => 21019, 13365 => 21561, 13366 => 28810,
+ 13367 => 25462, 13368 => 38180, 13369 => 22402, 13370 => 26149, 13371 => 26943,
+ 13372 => 37255, 13373 => 21767, 13374 => 28147, 13375 => 32431, 13376 => 34850,
+ 13377 => 25139, 13378 => 32496, 13379 => 30133, 13380 => 33576, 13381 => 30913,
+ 13382 => 38604, 13383 => 36766, 13384 => 24904, 13385 => 29943, 13386 => 35789,
+ 13387 => 27492, 13388 => 21050, 13389 => 36176, 13390 => 27425, 13391 => 32874,
+ 13392 => 33905, 13393 => 22257, 13394 => 21254, 13395 => 20174, 13396 => 19995,
+ 13397 => 20945, 13398 => 31895, 13399 => 37259, 13400 => 31751, 13401 => 20419,
+ 13402 => 36479, 13403 => 31713, 13404 => 31388, 13405 => 25703, 13406 => 23828,
+ 13407 => 20652, 13408 => 33030, 13409 => 30209, 13410 => 31929, 13411 => 28140,
+ 13412 => 32736, 13413 => 26449, 13414 => 23384, 13415 => 23544, 13416 => 30923,
+ 13417 => 25774, 13418 => 25619, 13419 => 25514, 13420 => 25387, 13421 => 38169,
+ 13422 => 25645, 13423 => 36798, 13424 => 31572, 13425 => 30249, 13426 => 25171,
+ 13427 => 22823, 13428 => 21574, 13429 => 27513, 13430 => 20643, 13431 => 25140,
+ 13432 => 24102, 13433 => 27526, 13434 => 20195, 13435 => 36151, 13436 => 34955,
+ 13437 => 24453, 13438 => 36910, 13601 => 24608, 13602 => 32829, 13603 => 25285,
+ 13604 => 20025, 13605 => 21333, 13606 => 37112, 13607 => 25528, 13608 => 32966,
+ 13609 => 26086, 13610 => 27694, 13611 => 20294, 13612 => 24814, 13613 => 28129,
+ 13614 => 35806, 13615 => 24377, 13616 => 34507, 13617 => 24403, 13618 => 25377,
+ 13619 => 20826, 13620 => 33633, 13621 => 26723, 13622 => 20992, 13623 => 25443,
+ 13624 => 36424, 13625 => 20498, 13626 => 23707, 13627 => 31095, 13628 => 23548,
+ 13629 => 21040, 13630 => 31291, 13631 => 24764, 13632 => 36947, 13633 => 30423,
+ 13634 => 24503, 13635 => 24471, 13636 => 30340, 13637 => 36460, 13638 => 28783,
+ 13639 => 30331, 13640 => 31561, 13641 => 30634, 13642 => 20979, 13643 => 37011,
+ 13644 => 22564, 13645 => 20302, 13646 => 28404, 13647 => 36842, 13648 => 25932,
+ 13649 => 31515, 13650 => 29380, 13651 => 28068, 13652 => 32735, 13653 => 23265,
+ 13654 => 25269, 13655 => 24213, 13656 => 22320, 13657 => 33922, 13658 => 31532,
+ 13659 => 24093, 13660 => 24351, 13661 => 36882, 13662 => 32532, 13663 => 39072,
+ 13664 => 25474, 13665 => 28359, 13666 => 30872, 13667 => 28857, 13668 => 20856,
+ 13669 => 38747, 13670 => 22443, 13671 => 30005, 13672 => 20291, 13673 => 30008,
+ 13674 => 24215, 13675 => 24806, 13676 => 22880, 13677 => 28096, 13678 => 27583,
+ 13679 => 30857, 13680 => 21500, 13681 => 38613, 13682 => 20939, 13683 => 20993,
+ 13684 => 25481, 13685 => 21514, 13686 => 38035, 13687 => 35843, 13688 => 36300,
+ 13689 => 29241, 13690 => 30879, 13691 => 34678, 13692 => 36845, 13693 => 35853,
+ 13694 => 21472, 13857 => 19969, 13858 => 30447, 13859 => 21486, 13860 => 38025,
+ 13861 => 39030, 13862 => 40718, 13863 => 38189, 13864 => 23450, 13865 => 35746,
+ 13866 => 20002, 13867 => 19996, 13868 => 20908, 13869 => 33891, 13870 => 25026,
+ 13871 => 21160, 13872 => 26635, 13873 => 20375, 13874 => 24683, 13875 => 20923,
+ 13876 => 27934, 13877 => 20828, 13878 => 25238, 13879 => 26007, 13880 => 38497,
+ 13881 => 35910, 13882 => 36887, 13883 => 30168, 13884 => 37117, 13885 => 30563,
+ 13886 => 27602, 13887 => 29322, 13888 => 29420, 13889 => 35835, 13890 => 22581,
+ 13891 => 30585, 13892 => 36172, 13893 => 26460, 13894 => 38208, 13895 => 32922,
+ 13896 => 24230, 13897 => 28193, 13898 => 22930, 13899 => 31471, 13900 => 30701,
+ 13901 => 38203, 13902 => 27573, 13903 => 26029, 13904 => 32526, 13905 => 22534,
+ 13906 => 20817, 13907 => 38431, 13908 => 23545, 13909 => 22697, 13910 => 21544,
+ 13911 => 36466, 13912 => 25958, 13913 => 39039, 13914 => 22244, 13915 => 38045,
+ 13916 => 30462, 13917 => 36929, 13918 => 25479, 13919 => 21702, 13920 => 22810,
+ 13921 => 22842, 13922 => 22427, 13923 => 36530, 13924 => 26421, 13925 => 36346,
+ 13926 => 33333, 13927 => 21057, 13928 => 24816, 13929 => 22549, 13930 => 34558,
+ 13931 => 23784, 13932 => 40517, 13933 => 20420, 13934 => 39069, 13935 => 35769,
+ 13936 => 23077, 13937 => 24694, 13938 => 21380, 13939 => 25212, 13940 => 36943,
+ 13941 => 37122, 13942 => 39295, 13943 => 24681, 13944 => 32780, 13945 => 20799,
+ 13946 => 32819, 13947 => 23572, 13948 => 39285, 13949 => 27953, 13950 => 20108,
+ 14113 => 36144, 14114 => 21457, 14115 => 32602, 14116 => 31567, 14117 => 20240,
+ 14118 => 20047, 14119 => 38400, 14120 => 27861, 14121 => 29648, 14122 => 34281,
+ 14123 => 24070, 14124 => 30058, 14125 => 32763, 14126 => 27146, 14127 => 30718,
+ 14128 => 38034, 14129 => 32321, 14130 => 20961, 14131 => 28902, 14132 => 21453,
+ 14133 => 36820, 14134 => 33539, 14135 => 36137, 14136 => 29359, 14137 => 39277,
+ 14138 => 27867, 14139 => 22346, 14140 => 33459, 14141 => 26041, 14142 => 32938,
+ 14143 => 25151, 14144 => 38450, 14145 => 22952, 14146 => 20223, 14147 => 35775,
+ 14148 => 32442, 14149 => 25918, 14150 => 33778, 14151 => 38750, 14152 => 21857,
+ 14153 => 39134, 14154 => 32933, 14155 => 21290, 14156 => 35837, 14157 => 21536,
+ 14158 => 32954, 14159 => 24223, 14160 => 27832, 14161 => 36153, 14162 => 33452,
+ 14163 => 37210, 14164 => 21545, 14165 => 27675, 14166 => 20998, 14167 => 32439,
+ 14168 => 22367, 14169 => 28954, 14170 => 27774, 14171 => 31881, 14172 => 22859,
+ 14173 => 20221, 14174 => 24575, 14175 => 24868, 14176 => 31914, 14177 => 20016,
+ 14178 => 23553, 14179 => 26539, 14180 => 34562, 14181 => 23792, 14182 => 38155,
+ 14183 => 39118, 14184 => 30127, 14185 => 28925, 14186 => 36898, 14187 => 20911,
+ 14188 => 32541, 14189 => 35773, 14190 => 22857, 14191 => 20964, 14192 => 20315,
+ 14193 => 21542, 14194 => 22827, 14195 => 25975, 14196 => 32932, 14197 => 23413,
+ 14198 => 25206, 14199 => 25282, 14200 => 36752, 14201 => 24133, 14202 => 27679,
+ 14203 => 31526, 14204 => 20239, 14205 => 20440, 14206 => 26381, 14369 => 28014,
+ 14370 => 28074, 14371 => 31119, 14372 => 34993, 14373 => 24343, 14374 => 29995,
+ 14375 => 25242, 14376 => 36741, 14377 => 20463, 14378 => 37340, 14379 => 26023,
+ 14380 => 33071, 14381 => 33105, 14382 => 24220, 14383 => 33104, 14384 => 36212,
+ 14385 => 21103, 14386 => 35206, 14387 => 36171, 14388 => 22797, 14389 => 20613,
+ 14390 => 20184, 14391 => 38428, 14392 => 29238, 14393 => 33145, 14394 => 36127,
+ 14395 => 23500, 14396 => 35747, 14397 => 38468, 14398 => 22919, 14399 => 32538,
+ 14400 => 21648, 14401 => 22134, 14402 => 22030, 14403 => 35813, 14404 => 25913,
+ 14405 => 27010, 14406 => 38041, 14407 => 30422, 14408 => 28297, 14409 => 24178,
+ 14410 => 29976, 14411 => 26438, 14412 => 26577, 14413 => 31487, 14414 => 32925,
+ 14415 => 36214, 14416 => 24863, 14417 => 31174, 14418 => 25954, 14419 => 36195,
+ 14420 => 20872, 14421 => 21018, 14422 => 38050, 14423 => 32568, 14424 => 32923,
+ 14425 => 32434, 14426 => 23703, 14427 => 28207, 14428 => 26464, 14429 => 31705,
+ 14430 => 30347, 14431 => 39640, 14432 => 33167, 14433 => 32660, 14434 => 31957,
+ 14435 => 25630, 14436 => 38224, 14437 => 31295, 14438 => 21578, 14439 => 21733,
+ 14440 => 27468, 14441 => 25601, 14442 => 25096, 14443 => 40509, 14444 => 33011,
+ 14445 => 30105, 14446 => 21106, 14447 => 38761, 14448 => 33883, 14449 => 26684,
+ 14450 => 34532, 14451 => 38401, 14452 => 38548, 14453 => 38124, 14454 => 20010,
+ 14455 => 21508, 14456 => 32473, 14457 => 26681, 14458 => 36319, 14459 => 32789,
+ 14460 => 26356, 14461 => 24218, 14462 => 32697, 14625 => 22466, 14626 => 32831,
+ 14627 => 26775, 14628 => 24037, 14629 => 25915, 14630 => 21151, 14631 => 24685,
+ 14632 => 40858, 14633 => 20379, 14634 => 36524, 14635 => 20844, 14636 => 23467,
+ 14637 => 24339, 14638 => 24041, 14639 => 27742, 14640 => 25329, 14641 => 36129,
+ 14642 => 20849, 14643 => 38057, 14644 => 21246, 14645 => 27807, 14646 => 33503,
+ 14647 => 29399, 14648 => 22434, 14649 => 26500, 14650 => 36141, 14651 => 22815,
+ 14652 => 36764, 14653 => 33735, 14654 => 21653, 14655 => 31629, 14656 => 20272,
+ 14657 => 27837, 14658 => 23396, 14659 => 22993, 14660 => 40723, 14661 => 21476,
+ 14662 => 34506, 14663 => 39592, 14664 => 35895, 14665 => 32929, 14666 => 25925,
+ 14667 => 39038, 14668 => 22266, 14669 => 38599, 14670 => 21038, 14671 => 29916,
+ 14672 => 21072, 14673 => 23521, 14674 => 25346, 14675 => 35074, 14676 => 20054,
+ 14677 => 25296, 14678 => 24618, 14679 => 26874, 14680 => 20851, 14681 => 23448,
+ 14682 => 20896, 14683 => 35266, 14684 => 31649, 14685 => 39302, 14686 => 32592,
+ 14687 => 24815, 14688 => 28748, 14689 => 36143, 14690 => 20809, 14691 => 24191,
+ 14692 => 36891, 14693 => 29808, 14694 => 35268, 14695 => 22317, 14696 => 30789,
+ 14697 => 24402, 14698 => 40863, 14699 => 38394, 14700 => 36712, 14701 => 39740,
+ 14702 => 35809, 14703 => 30328, 14704 => 26690, 14705 => 26588, 14706 => 36330,
+ 14707 => 36149, 14708 => 21053, 14709 => 36746, 14710 => 28378, 14711 => 26829,
+ 14712 => 38149, 14713 => 37101, 14714 => 22269, 14715 => 26524, 14716 => 35065,
+ 14717 => 36807, 14718 => 21704, 14881 => 39608, 14882 => 23401, 14883 => 28023,
+ 14884 => 27686, 14885 => 20133, 14886 => 23475, 14887 => 39559, 14888 => 37219,
+ 14889 => 25000, 14890 => 37039, 14891 => 38889, 14892 => 21547, 14893 => 28085,
+ 14894 => 23506, 14895 => 20989, 14896 => 21898, 14897 => 32597, 14898 => 32752,
+ 14899 => 25788, 14900 => 25421, 14901 => 26097, 14902 => 25022, 14903 => 24717,
+ 14904 => 28938, 14905 => 27735, 14906 => 27721, 14907 => 22831, 14908 => 26477,
+ 14909 => 33322, 14910 => 22741, 14911 => 22158, 14912 => 35946, 14913 => 27627,
+ 14914 => 37085, 14915 => 22909, 14916 => 32791, 14917 => 21495, 14918 => 28009,
+ 14919 => 21621, 14920 => 21917, 14921 => 33655, 14922 => 33743, 14923 => 26680,
+ 14924 => 31166, 14925 => 21644, 14926 => 20309, 14927 => 21512, 14928 => 30418,
+ 14929 => 35977, 14930 => 38402, 14931 => 27827, 14932 => 28088, 14933 => 36203,
+ 14934 => 35088, 14935 => 40548, 14936 => 36154, 14937 => 22079, 14938 => 40657,
+ 14939 => 30165, 14940 => 24456, 14941 => 29408, 14942 => 24680, 14943 => 21756,
+ 14944 => 20136, 14945 => 27178, 14946 => 34913, 14947 => 24658, 14948 => 36720,
+ 14949 => 21700, 14950 => 28888, 14951 => 34425, 14952 => 40511, 14953 => 27946,
+ 14954 => 23439, 14955 => 24344, 14956 => 32418, 14957 => 21897, 14958 => 20399,
+ 14959 => 29492, 14960 => 21564, 14961 => 21402, 14962 => 20505, 14963 => 21518,
+ 14964 => 21628, 14965 => 20046, 14966 => 24573, 14967 => 29786, 14968 => 22774,
+ 14969 => 33899, 14970 => 32993, 14971 => 34676, 14972 => 29392, 14973 => 31946,
+ 14974 => 28246, 15137 => 24359, 15138 => 34382, 15139 => 21804, 15140 => 25252,
+ 15141 => 20114, 15142 => 27818, 15143 => 25143, 15144 => 33457, 15145 => 21719,
+ 15146 => 21326, 15147 => 29502, 15148 => 28369, 15149 => 30011, 15150 => 21010,
+ 15151 => 21270, 15152 => 35805, 15153 => 27088, 15154 => 24458, 15155 => 24576,
+ 15156 => 28142, 15157 => 22351, 15158 => 27426, 15159 => 29615, 15160 => 26707,
+ 15161 => 36824, 15162 => 32531, 15163 => 25442, 15164 => 24739, 15165 => 21796,
+ 15166 => 30186, 15167 => 35938, 15168 => 28949, 15169 => 28067, 15170 => 23462,
+ 15171 => 24187, 15172 => 33618, 15173 => 24908, 15174 => 40644, 15175 => 30970,
+ 15176 => 34647, 15177 => 31783, 15178 => 30343, 15179 => 20976, 15180 => 24822,
+ 15181 => 29004, 15182 => 26179, 15183 => 24140, 15184 => 24653, 15185 => 35854,
+ 15186 => 28784, 15187 => 25381, 15188 => 36745, 15189 => 24509, 15190 => 24674,
+ 15191 => 34516, 15192 => 22238, 15193 => 27585, 15194 => 24724, 15195 => 24935,
+ 15196 => 21321, 15197 => 24800, 15198 => 26214, 15199 => 36159, 15200 => 31229,
+ 15201 => 20250, 15202 => 28905, 15203 => 27719, 15204 => 35763, 15205 => 35826,
+ 15206 => 32472, 15207 => 33636, 15208 => 26127, 15209 => 23130, 15210 => 39746,
+ 15211 => 27985, 15212 => 28151, 15213 => 35905, 15214 => 27963, 15215 => 20249,
+ 15216 => 28779, 15217 => 33719, 15218 => 25110, 15219 => 24785, 15220 => 38669,
+ 15221 => 36135, 15222 => 31096, 15223 => 20987, 15224 => 22334, 15225 => 22522,
+ 15226 => 26426, 15227 => 30072, 15228 => 31293, 15229 => 31215, 15230 => 31637,
+ 15393 => 32908, 15394 => 39269, 15395 => 36857, 15396 => 28608, 15397 => 35749,
+ 15398 => 40481, 15399 => 23020, 15400 => 32489, 15401 => 32521, 15402 => 21513,
+ 15403 => 26497, 15404 => 26840, 15405 => 36753, 15406 => 31821, 15407 => 38598,
+ 15408 => 21450, 15409 => 24613, 15410 => 30142, 15411 => 27762, 15412 => 21363,
+ 15413 => 23241, 15414 => 32423, 15415 => 25380, 15416 => 20960, 15417 => 33034,
+ 15418 => 24049, 15419 => 34015, 15420 => 25216, 15421 => 20864, 15422 => 23395,
+ 15423 => 20238, 15424 => 31085, 15425 => 21058, 15426 => 24760, 15427 => 27982,
+ 15428 => 23492, 15429 => 23490, 15430 => 35745, 15431 => 35760, 15432 => 26082,
+ 15433 => 24524, 15434 => 38469, 15435 => 22931, 15436 => 32487, 15437 => 32426,
+ 15438 => 22025, 15439 => 26551, 15440 => 22841, 15441 => 20339, 15442 => 23478,
+ 15443 => 21152, 15444 => 33626, 15445 => 39050, 15446 => 36158, 15447 => 30002,
+ 15448 => 38078, 15449 => 20551, 15450 => 31292, 15451 => 20215, 15452 => 26550,
+ 15453 => 39550, 15454 => 23233, 15455 => 27516, 15456 => 30417, 15457 => 22362,
+ 15458 => 23574, 15459 => 31546, 15460 => 38388, 15461 => 29006, 15462 => 20860,
+ 15463 => 32937, 15464 => 33392, 15465 => 22904, 15466 => 32516, 15467 => 33575,
+ 15468 => 26816, 15469 => 26604, 15470 => 30897, 15471 => 30839, 15472 => 25315,
+ 15473 => 25441, 15474 => 31616, 15475 => 20461, 15476 => 21098, 15477 => 20943,
+ 15478 => 33616, 15479 => 27099, 15480 => 37492, 15481 => 36341, 15482 => 36145,
+ 15483 => 35265, 15484 => 38190, 15485 => 31661, 15486 => 20214, 15649 => 20581,
+ 15650 => 33328, 15651 => 21073, 15652 => 39279, 15653 => 28176, 15654 => 28293,
+ 15655 => 28071, 15656 => 24314, 15657 => 20725, 15658 => 23004, 15659 => 23558,
+ 15660 => 27974, 15661 => 27743, 15662 => 30086, 15663 => 33931, 15664 => 26728,
+ 15665 => 22870, 15666 => 35762, 15667 => 21280, 15668 => 37233, 15669 => 38477,
+ 15670 => 34121, 15671 => 26898, 15672 => 30977, 15673 => 28966, 15674 => 33014,
+ 15675 => 20132, 15676 => 37066, 15677 => 27975, 15678 => 39556, 15679 => 23047,
+ 15680 => 22204, 15681 => 25605, 15682 => 38128, 15683 => 30699, 15684 => 20389,
+ 15685 => 33050, 15686 => 29409, 15687 => 35282, 15688 => 39290, 15689 => 32564,
+ 15690 => 32478, 15691 => 21119, 15692 => 25945, 15693 => 37237, 15694 => 36735,
+ 15695 => 36739, 15696 => 21483, 15697 => 31382, 15698 => 25581, 15699 => 25509,
+ 15700 => 30342, 15701 => 31224, 15702 => 34903, 15703 => 38454, 15704 => 25130,
+ 15705 => 21163, 15706 => 33410, 15707 => 26708, 15708 => 26480, 15709 => 25463,
+ 15710 => 30571, 15711 => 31469, 15712 => 27905, 15713 => 32467, 15714 => 35299,
+ 15715 => 22992, 15716 => 25106, 15717 => 34249, 15718 => 33445, 15719 => 30028,
+ 15720 => 20511, 15721 => 20171, 15722 => 30117, 15723 => 35819, 15724 => 23626,
+ 15725 => 24062, 15726 => 31563, 15727 => 26020, 15728 => 37329, 15729 => 20170,
+ 15730 => 27941, 15731 => 35167, 15732 => 32039, 15733 => 38182, 15734 => 20165,
+ 15735 => 35880, 15736 => 36827, 15737 => 38771, 15738 => 26187, 15739 => 31105,
+ 15740 => 36817, 15741 => 28908, 15742 => 28024, 15905 => 23613, 15906 => 21170,
+ 15907 => 33606, 15908 => 20834, 15909 => 33550, 15910 => 30555, 15911 => 26230,
+ 15912 => 40120, 15913 => 20140, 15914 => 24778, 15915 => 31934, 15916 => 31923,
+ 15917 => 32463, 15918 => 20117, 15919 => 35686, 15920 => 26223, 15921 => 39048,
+ 15922 => 38745, 15923 => 22659, 15924 => 25964, 15925 => 38236, 15926 => 24452,
+ 15927 => 30153, 15928 => 38742, 15929 => 31455, 15930 => 31454, 15931 => 20928,
+ 15932 => 28847, 15933 => 31384, 15934 => 25578, 15935 => 31350, 15936 => 32416,
+ 15937 => 29590, 15938 => 38893, 15939 => 20037, 15940 => 28792, 15941 => 20061,
+ 15942 => 37202, 15943 => 21417, 15944 => 25937, 15945 => 26087, 15946 => 33276,
+ 15947 => 33285, 15948 => 21646, 15949 => 23601, 15950 => 30106, 15951 => 38816,
+ 15952 => 25304, 15953 => 29401, 15954 => 30141, 15955 => 23621, 15956 => 39545,
+ 15957 => 33738, 15958 => 23616, 15959 => 21632, 15960 => 30697, 15961 => 20030,
+ 15962 => 27822, 15963 => 32858, 15964 => 25298, 15965 => 25454, 15966 => 24040,
+ 15967 => 20855, 15968 => 36317, 15969 => 36382, 15970 => 38191, 15971 => 20465,
+ 15972 => 21477, 15973 => 24807, 15974 => 28844, 15975 => 21095, 15976 => 25424,
+ 15977 => 40515, 15978 => 23071, 15979 => 20518, 15980 => 30519, 15981 => 21367,
+ 15982 => 32482, 15983 => 25733, 15984 => 25899, 15985 => 25225, 15986 => 25496,
+ 15987 => 20500, 15988 => 29237, 15989 => 35273, 15990 => 20915, 15991 => 35776,
+ 15992 => 32477, 15993 => 22343, 15994 => 33740, 15995 => 38055, 15996 => 20891,
+ 15997 => 21531, 15998 => 23803, 16161 => 20426, 16162 => 31459, 16163 => 27994,
+ 16164 => 37089, 16165 => 39567, 16166 => 21888, 16167 => 21654, 16168 => 21345,
+ 16169 => 21679, 16170 => 24320, 16171 => 25577, 16172 => 26999, 16173 => 20975,
+ 16174 => 24936, 16175 => 21002, 16176 => 22570, 16177 => 21208, 16178 => 22350,
+ 16179 => 30733, 16180 => 30475, 16181 => 24247, 16182 => 24951, 16183 => 31968,
+ 16184 => 25179, 16185 => 25239, 16186 => 20130, 16187 => 28821, 16188 => 32771,
+ 16189 => 25335, 16190 => 28900, 16191 => 38752, 16192 => 22391, 16193 => 33499,
+ 16194 => 26607, 16195 => 26869, 16196 => 30933, 16197 => 39063, 16198 => 31185,
+ 16199 => 22771, 16200 => 21683, 16201 => 21487, 16202 => 28212, 16203 => 20811,
+ 16204 => 21051, 16205 => 23458, 16206 => 35838, 16207 => 32943, 16208 => 21827,
+ 16209 => 22438, 16210 => 24691, 16211 => 22353, 16212 => 21549, 16213 => 31354,
+ 16214 => 24656, 16215 => 23380, 16216 => 25511, 16217 => 25248, 16218 => 21475,
+ 16219 => 25187, 16220 => 23495, 16221 => 26543, 16222 => 21741, 16223 => 31391,
+ 16224 => 33510, 16225 => 37239, 16226 => 24211, 16227 => 35044, 16228 => 22840,
+ 16229 => 22446, 16230 => 25358, 16231 => 36328, 16232 => 33007, 16233 => 22359,
+ 16234 => 31607, 16235 => 20393, 16236 => 24555, 16237 => 23485, 16238 => 27454,
+ 16239 => 21281, 16240 => 31568, 16241 => 29378, 16242 => 26694, 16243 => 30719,
+ 16244 => 30518, 16245 => 26103, 16246 => 20917, 16247 => 20111, 16248 => 30420,
+ 16249 => 23743, 16250 => 31397, 16251 => 33909, 16252 => 22862, 16253 => 39745,
+ 16254 => 20608, 16417 => 39304, 16418 => 24871, 16419 => 28291, 16420 => 22372,
+ 16421 => 26118, 16422 => 25414, 16423 => 22256, 16424 => 25324, 16425 => 25193,
+ 16426 => 24275, 16427 => 38420, 16428 => 22403, 16429 => 25289, 16430 => 21895,
+ 16431 => 34593, 16432 => 33098, 16433 => 36771, 16434 => 21862, 16435 => 33713,
+ 16436 => 26469, 16437 => 36182, 16438 => 34013, 16439 => 23146, 16440 => 26639,
+ 16441 => 25318, 16442 => 31726, 16443 => 38417, 16444 => 20848, 16445 => 28572,
+ 16446 => 35888, 16447 => 25597, 16448 => 35272, 16449 => 25042, 16450 => 32518,
+ 16451 => 28866, 16452 => 28389, 16453 => 29701, 16454 => 27028, 16455 => 29436,
+ 16456 => 24266, 16457 => 37070, 16458 => 26391, 16459 => 28010, 16460 => 25438,
+ 16461 => 21171, 16462 => 29282, 16463 => 32769, 16464 => 20332, 16465 => 23013,
+ 16466 => 37226, 16467 => 28889, 16468 => 28061, 16469 => 21202, 16470 => 20048,
+ 16471 => 38647, 16472 => 38253, 16473 => 34174, 16474 => 30922, 16475 => 32047,
+ 16476 => 20769, 16477 => 22418, 16478 => 25794, 16479 => 32907, 16480 => 31867,
+ 16481 => 27882, 16482 => 26865, 16483 => 26974, 16484 => 20919, 16485 => 21400,
+ 16486 => 26792, 16487 => 29313, 16488 => 40654, 16489 => 31729, 16490 => 29432,
+ 16491 => 31163, 16492 => 28435, 16493 => 29702, 16494 => 26446, 16495 => 37324,
+ 16496 => 40100, 16497 => 31036, 16498 => 33673, 16499 => 33620, 16500 => 21519,
+ 16501 => 26647, 16502 => 20029, 16503 => 21385, 16504 => 21169, 16505 => 30782,
+ 16506 => 21382, 16507 => 21033, 16508 => 20616, 16509 => 20363, 16510 => 20432,
+ 16673 => 30178, 16674 => 31435, 16675 => 31890, 16676 => 27813, 16677 => 38582,
+ 16678 => 21147, 16679 => 29827, 16680 => 21737, 16681 => 20457, 16682 => 32852,
+ 16683 => 33714, 16684 => 36830, 16685 => 38256, 16686 => 24265, 16687 => 24604,
+ 16688 => 28063, 16689 => 24088, 16690 => 25947, 16691 => 33080, 16692 => 38142,
+ 16693 => 24651, 16694 => 28860, 16695 => 32451, 16696 => 31918, 16697 => 20937,
+ 16698 => 26753, 16699 => 31921, 16700 => 33391, 16701 => 20004, 16702 => 36742,
+ 16703 => 37327, 16704 => 26238, 16705 => 20142, 16706 => 35845, 16707 => 25769,
+ 16708 => 32842, 16709 => 20698, 16710 => 30103, 16711 => 29134, 16712 => 23525,
+ 16713 => 36797, 16714 => 28518, 16715 => 20102, 16716 => 25730, 16717 => 38243,
+ 16718 => 24278, 16719 => 26009, 16720 => 21015, 16721 => 35010, 16722 => 28872,
+ 16723 => 21155, 16724 => 29454, 16725 => 29747, 16726 => 26519, 16727 => 30967,
+ 16728 => 38678, 16729 => 20020, 16730 => 37051, 16731 => 40158, 16732 => 28107,
+ 16733 => 20955, 16734 => 36161, 16735 => 21533, 16736 => 25294, 16737 => 29618,
+ 16738 => 33777, 16739 => 38646, 16740 => 40836, 16741 => 38083, 16742 => 20278,
+ 16743 => 32666, 16744 => 20940, 16745 => 28789, 16746 => 38517, 16747 => 23725,
+ 16748 => 39046, 16749 => 21478, 16750 => 20196, 16751 => 28316, 16752 => 29705,
+ 16753 => 27060, 16754 => 30827, 16755 => 39311, 16756 => 30041, 16757 => 21016,
+ 16758 => 30244, 16759 => 27969, 16760 => 26611, 16761 => 20845, 16762 => 40857,
+ 16763 => 32843, 16764 => 21657, 16765 => 31548, 16766 => 31423, 16929 => 38534,
+ 16930 => 22404, 16931 => 25314, 16932 => 38471, 16933 => 27004, 16934 => 23044,
+ 16935 => 25602, 16936 => 31699, 16937 => 28431, 16938 => 38475, 16939 => 33446,
+ 16940 => 21346, 16941 => 39045, 16942 => 24208, 16943 => 28809, 16944 => 25523,
+ 16945 => 21348, 16946 => 34383, 16947 => 40065, 16948 => 40595, 16949 => 30860,
+ 16950 => 38706, 16951 => 36335, 16952 => 36162, 16953 => 40575, 16954 => 28510,
+ 16955 => 31108, 16956 => 24405, 16957 => 38470, 16958 => 25134, 16959 => 39540,
+ 16960 => 21525, 16961 => 38109, 16962 => 20387, 16963 => 26053, 16964 => 23653,
+ 16965 => 23649, 16966 => 32533, 16967 => 34385, 16968 => 27695, 16969 => 24459,
+ 16970 => 29575, 16971 => 28388, 16972 => 32511, 16973 => 23782, 16974 => 25371,
+ 16975 => 23402, 16976 => 28390, 16977 => 21365, 16978 => 20081, 16979 => 25504,
+ 16980 => 30053, 16981 => 25249, 16982 => 36718, 16983 => 20262, 16984 => 20177,
+ 16985 => 27814, 16986 => 32438, 16987 => 35770, 16988 => 33821, 16989 => 34746,
+ 16990 => 32599, 16991 => 36923, 16992 => 38179, 16993 => 31657, 16994 => 39585,
+ 16995 => 35064, 16996 => 33853, 16997 => 27931, 16998 => 39558, 16999 => 32476,
+ 17000 => 22920, 17001 => 40635, 17002 => 29595, 17003 => 30721, 17004 => 34434,
+ 17005 => 39532, 17006 => 39554, 17007 => 22043, 17008 => 21527, 17009 => 22475,
+ 17010 => 20080, 17011 => 40614, 17012 => 21334, 17013 => 36808, 17014 => 33033,
+ 17015 => 30610, 17016 => 39314, 17017 => 34542, 17018 => 28385, 17019 => 34067,
+ 17020 => 26364, 17021 => 24930, 17022 => 28459, 17185 => 35881, 17186 => 33426,
+ 17187 => 33579, 17188 => 30450, 17189 => 27667, 17190 => 24537, 17191 => 33725,
+ 17192 => 29483, 17193 => 33541, 17194 => 38170, 17195 => 27611, 17196 => 30683,
+ 17197 => 38086, 17198 => 21359, 17199 => 33538, 17200 => 20882, 17201 => 24125,
+ 17202 => 35980, 17203 => 36152, 17204 => 20040, 17205 => 29611, 17206 => 26522,
+ 17207 => 26757, 17208 => 37238, 17209 => 38665, 17210 => 29028, 17211 => 27809,
+ 17212 => 30473, 17213 => 23186, 17214 => 38209, 17215 => 27599, 17216 => 32654,
+ 17217 => 26151, 17218 => 23504, 17219 => 22969, 17220 => 23194, 17221 => 38376,
+ 17222 => 38391, 17223 => 20204, 17224 => 33804, 17225 => 33945, 17226 => 27308,
+ 17227 => 30431, 17228 => 38192, 17229 => 29467, 17230 => 26790, 17231 => 23391,
+ 17232 => 30511, 17233 => 37274, 17234 => 38753, 17235 => 31964, 17236 => 36855,
+ 17237 => 35868, 17238 => 24357, 17239 => 31859, 17240 => 31192, 17241 => 35269,
+ 17242 => 27852, 17243 => 34588, 17244 => 23494, 17245 => 24130, 17246 => 26825,
+ 17247 => 30496, 17248 => 32501, 17249 => 20885, 17250 => 20813, 17251 => 21193,
+ 17252 => 23081, 17253 => 32517, 17254 => 38754, 17255 => 33495, 17256 => 25551,
+ 17257 => 30596, 17258 => 34256, 17259 => 31186, 17260 => 28218, 17261 => 24217,
+ 17262 => 22937, 17263 => 34065, 17264 => 28781, 17265 => 27665, 17266 => 25279,
+ 17267 => 30399, 17268 => 25935, 17269 => 24751, 17270 => 38397, 17271 => 26126,
+ 17272 => 34719, 17273 => 40483, 17274 => 38125, 17275 => 21517, 17276 => 21629,
+ 17277 => 35884, 17278 => 25720, 17441 => 25721, 17442 => 34321, 17443 => 27169,
+ 17444 => 33180, 17445 => 30952, 17446 => 25705, 17447 => 39764, 17448 => 25273,
+ 17449 => 26411, 17450 => 33707, 17451 => 22696, 17452 => 40664, 17453 => 27819,
+ 17454 => 28448, 17455 => 23518, 17456 => 38476, 17457 => 35851, 17458 => 29279,
+ 17459 => 26576, 17460 => 25287, 17461 => 29281, 17462 => 20137, 17463 => 22982,
+ 17464 => 27597, 17465 => 22675, 17466 => 26286, 17467 => 24149, 17468 => 21215,
+ 17469 => 24917, 17470 => 26408, 17471 => 30446, 17472 => 30566, 17473 => 29287,
+ 17474 => 31302, 17475 => 25343, 17476 => 21738, 17477 => 21584, 17478 => 38048,
+ 17479 => 37027, 17480 => 23068, 17481 => 32435, 17482 => 27670, 17483 => 20035,
+ 17484 => 22902, 17485 => 32784, 17486 => 22856, 17487 => 21335, 17488 => 30007,
+ 17489 => 38590, 17490 => 22218, 17491 => 25376, 17492 => 33041, 17493 => 24700,
+ 17494 => 38393, 17495 => 28118, 17496 => 21602, 17497 => 39297, 17498 => 20869,
+ 17499 => 23273, 17500 => 33021, 17501 => 22958, 17502 => 38675, 17503 => 20522,
+ 17504 => 27877, 17505 => 23612, 17506 => 25311, 17507 => 20320, 17508 => 21311,
+ 17509 => 33147, 17510 => 36870, 17511 => 28346, 17512 => 34091, 17513 => 25288,
+ 17514 => 24180, 17515 => 30910, 17516 => 25781, 17517 => 25467, 17518 => 24565,
+ 17519 => 23064, 17520 => 37247, 17521 => 40479, 17522 => 23615, 17523 => 25423,
+ 17524 => 32834, 17525 => 23421, 17526 => 21870, 17527 => 38218, 17528 => 38221,
+ 17529 => 28037, 17530 => 24744, 17531 => 26592, 17532 => 29406, 17533 => 20957,
+ 17534 => 23425, 17697 => 25319, 17698 => 27870, 17699 => 29275, 17700 => 25197,
+ 17701 => 38062, 17702 => 32445, 17703 => 33043, 17704 => 27987, 17705 => 20892,
+ 17706 => 24324, 17707 => 22900, 17708 => 21162, 17709 => 24594, 17710 => 22899,
+ 17711 => 26262, 17712 => 34384, 17713 => 30111, 17714 => 25386, 17715 => 25062,
+ 17716 => 31983, 17717 => 35834, 17718 => 21734, 17719 => 27431, 17720 => 40485,
+ 17721 => 27572, 17722 => 34261, 17723 => 21589, 17724 => 20598, 17725 => 27812,
+ 17726 => 21866, 17727 => 36276, 17728 => 29228, 17729 => 24085, 17730 => 24597,
+ 17731 => 29750, 17732 => 25293, 17733 => 25490, 17734 => 29260, 17735 => 24472,
+ 17736 => 28227, 17737 => 27966, 17738 => 25856, 17739 => 28504, 17740 => 30424,
+ 17741 => 30928, 17742 => 30460, 17743 => 30036, 17744 => 21028, 17745 => 21467,
+ 17746 => 20051, 17747 => 24222, 17748 => 26049, 17749 => 32810, 17750 => 32982,
+ 17751 => 25243, 17752 => 21638, 17753 => 21032, 17754 => 28846, 17755 => 34957,
+ 17756 => 36305, 17757 => 27873, 17758 => 21624, 17759 => 32986, 17760 => 22521,
+ 17761 => 35060, 17762 => 36180, 17763 => 38506, 17764 => 37197, 17765 => 20329,
+ 17766 => 27803, 17767 => 21943, 17768 => 30406, 17769 => 30768, 17770 => 25256,
+ 17771 => 28921, 17772 => 28558, 17773 => 24429, 17774 => 34028, 17775 => 26842,
+ 17776 => 30844, 17777 => 31735, 17778 => 33192, 17779 => 26379, 17780 => 40527,
+ 17781 => 25447, 17782 => 30896, 17783 => 22383, 17784 => 30738, 17785 => 38713,
+ 17786 => 25209, 17787 => 25259, 17788 => 21128, 17789 => 29749, 17790 => 27607,
+ 17953 => 21860, 17954 => 33086, 17955 => 30130, 17956 => 30382, 17957 => 21305,
+ 17958 => 30174, 17959 => 20731, 17960 => 23617, 17961 => 35692, 17962 => 31687,
+ 17963 => 20559, 17964 => 29255, 17965 => 39575, 17966 => 39128, 17967 => 28418,
+ 17968 => 29922, 17969 => 31080, 17970 => 25735, 17971 => 30629, 17972 => 25340,
+ 17973 => 39057, 17974 => 36139, 17975 => 21697, 17976 => 32856, 17977 => 20050,
+ 17978 => 22378, 17979 => 33529, 17980 => 33805, 17981 => 24179, 17982 => 20973,
+ 17983 => 29942, 17984 => 35780, 17985 => 23631, 17986 => 22369, 17987 => 27900,
+ 17988 => 39047, 17989 => 23110, 17990 => 30772, 17991 => 39748, 17992 => 36843,
+ 17993 => 31893, 17994 => 21078, 17995 => 25169, 17996 => 38138, 17997 => 20166,
+ 17998 => 33670, 17999 => 33889, 18000 => 33769, 18001 => 33970, 18002 => 22484,
+ 18003 => 26420, 18004 => 22275, 18005 => 26222, 18006 => 28006, 18007 => 35889,
+ 18008 => 26333, 18009 => 28689, 18010 => 26399, 18011 => 27450, 18012 => 26646,
+ 18013 => 25114, 18014 => 22971, 18015 => 19971, 18016 => 20932, 18017 => 28422,
+ 18018 => 26578, 18019 => 27791, 18020 => 20854, 18021 => 26827, 18022 => 22855,
+ 18023 => 27495, 18024 => 30054, 18025 => 23822, 18026 => 33040, 18027 => 40784,
+ 18028 => 26071, 18029 => 31048, 18030 => 31041, 18031 => 39569, 18032 => 36215,
+ 18033 => 23682, 18034 => 20062, 18035 => 20225, 18036 => 21551, 18037 => 22865,
+ 18038 => 30732, 18039 => 22120, 18040 => 27668, 18041 => 36804, 18042 => 24323,
+ 18043 => 27773, 18044 => 27875, 18045 => 35755, 18046 => 25488, 18209 => 24688,
+ 18210 => 27965, 18211 => 29301, 18212 => 25190, 18213 => 38030, 18214 => 38085,
+ 18215 => 21315, 18216 => 36801, 18217 => 31614, 18218 => 20191, 18219 => 35878,
+ 18220 => 20094, 18221 => 40660, 18222 => 38065, 18223 => 38067, 18224 => 21069,
+ 18225 => 28508, 18226 => 36963, 18227 => 27973, 18228 => 35892, 18229 => 22545,
+ 18230 => 23884, 18231 => 27424, 18232 => 27465, 18233 => 26538, 18234 => 21595,
+ 18235 => 33108, 18236 => 32652, 18237 => 22681, 18238 => 34103, 18239 => 24378,
+ 18240 => 25250, 18241 => 27207, 18242 => 38201, 18243 => 25970, 18244 => 24708,
+ 18245 => 26725, 18246 => 30631, 18247 => 20052, 18248 => 20392, 18249 => 24039,
+ 18250 => 38808, 18251 => 25772, 18252 => 32728, 18253 => 23789, 18254 => 20431,
+ 18255 => 31373, 18256 => 20999, 18257 => 33540, 18258 => 19988, 18259 => 24623,
+ 18260 => 31363, 18261 => 38054, 18262 => 20405, 18263 => 20146, 18264 => 31206,
+ 18265 => 29748, 18266 => 21220, 18267 => 33465, 18268 => 25810, 18269 => 31165,
+ 18270 => 23517, 18271 => 27777, 18272 => 38738, 18273 => 36731, 18274 => 27682,
+ 18275 => 20542, 18276 => 21375, 18277 => 28165, 18278 => 25806, 18279 => 26228,
+ 18280 => 27696, 18281 => 24773, 18282 => 39031, 18283 => 35831, 18284 => 24198,
+ 18285 => 29756, 18286 => 31351, 18287 => 31179, 18288 => 19992, 18289 => 37041,
+ 18290 => 29699, 18291 => 27714, 18292 => 22234, 18293 => 37195, 18294 => 27845,
+ 18295 => 36235, 18296 => 21306, 18297 => 34502, 18298 => 26354, 18299 => 36527,
+ 18300 => 23624, 18301 => 39537, 18302 => 28192, 18465 => 21462, 18466 => 23094,
+ 18467 => 40843, 18468 => 36259, 18469 => 21435, 18470 => 22280, 18471 => 39079,
+ 18472 => 26435, 18473 => 37275, 18474 => 27849, 18475 => 20840, 18476 => 30154,
+ 18477 => 25331, 18478 => 29356, 18479 => 21048, 18480 => 21149, 18481 => 32570,
+ 18482 => 28820, 18483 => 30264, 18484 => 21364, 18485 => 40522, 18486 => 27063,
+ 18487 => 30830, 18488 => 38592, 18489 => 35033, 18490 => 32676, 18491 => 28982,
+ 18492 => 29123, 18493 => 20873, 18494 => 26579, 18495 => 29924, 18496 => 22756,
+ 18497 => 25880, 18498 => 22199, 18499 => 35753, 18500 => 39286, 18501 => 25200,
+ 18502 => 32469, 18503 => 24825, 18504 => 28909, 18505 => 22764, 18506 => 20161,
+ 18507 => 20154, 18508 => 24525, 18509 => 38887, 18510 => 20219, 18511 => 35748,
+ 18512 => 20995, 18513 => 22922, 18514 => 32427, 18515 => 25172, 18516 => 20173,
+ 18517 => 26085, 18518 => 25102, 18519 => 33592, 18520 => 33993, 18521 => 33635,
+ 18522 => 34701, 18523 => 29076, 18524 => 28342, 18525 => 23481, 18526 => 32466,
+ 18527 => 20887, 18528 => 25545, 18529 => 26580, 18530 => 32905, 18531 => 33593,
+ 18532 => 34837, 18533 => 20754, 18534 => 23418, 18535 => 22914, 18536 => 36785,
+ 18537 => 20083, 18538 => 27741, 18539 => 20837, 18540 => 35109, 18541 => 36719,
+ 18542 => 38446, 18543 => 34122, 18544 => 29790, 18545 => 38160, 18546 => 38384,
+ 18547 => 28070, 18548 => 33509, 18549 => 24369, 18550 => 25746, 18551 => 27922,
+ 18552 => 33832, 18553 => 33134, 18554 => 40131, 18555 => 22622, 18556 => 36187,
+ 18557 => 19977, 18558 => 21441, 18721 => 20254, 18722 => 25955, 18723 => 26705,
+ 18724 => 21971, 18725 => 20007, 18726 => 25620, 18727 => 39578, 18728 => 25195,
+ 18729 => 23234, 18730 => 29791, 18731 => 33394, 18732 => 28073, 18733 => 26862,
+ 18734 => 20711, 18735 => 33678, 18736 => 30722, 18737 => 26432, 18738 => 21049,
+ 18739 => 27801, 18740 => 32433, 18741 => 20667, 18742 => 21861, 18743 => 29022,
+ 18744 => 31579, 18745 => 26194, 18746 => 29642, 18747 => 33515, 18748 => 26441,
+ 18749 => 23665, 18750 => 21024, 18751 => 29053, 18752 => 34923, 18753 => 38378,
+ 18754 => 38485, 18755 => 25797, 18756 => 36193, 18757 => 33203, 18758 => 21892,
+ 18759 => 27733, 18760 => 25159, 18761 => 32558, 18762 => 22674, 18763 => 20260,
+ 18764 => 21830, 18765 => 36175, 18766 => 26188, 18767 => 19978, 18768 => 23578,
+ 18769 => 35059, 18770 => 26786, 18771 => 25422, 18772 => 31245, 18773 => 28903,
+ 18774 => 33421, 18775 => 21242, 18776 => 38902, 18777 => 23569, 18778 => 21736,
+ 18779 => 37045, 18780 => 32461, 18781 => 22882, 18782 => 36170, 18783 => 34503,
+ 18784 => 33292, 18785 => 33293, 18786 => 36198, 18787 => 25668, 18788 => 23556,
+ 18789 => 24913, 18790 => 28041, 18791 => 31038, 18792 => 35774, 18793 => 30775,
+ 18794 => 30003, 18795 => 21627, 18796 => 20280, 18797 => 36523, 18798 => 28145,
+ 18799 => 23072, 18800 => 32453, 18801 => 31070, 18802 => 27784, 18803 => 23457,
+ 18804 => 23158, 18805 => 29978, 18806 => 32958, 18807 => 24910, 18808 => 28183,
+ 18809 => 22768, 18810 => 29983, 18811 => 29989, 18812 => 29298, 18813 => 21319,
+ 18814 => 32499, 18977 => 30465, 18978 => 30427, 18979 => 21097, 18980 => 32988,
+ 18981 => 22307, 18982 => 24072, 18983 => 22833, 18984 => 29422, 18985 => 26045,
+ 18986 => 28287, 18987 => 35799, 18988 => 23608, 18989 => 34417, 18990 => 21313,
+ 18991 => 30707, 18992 => 25342, 18993 => 26102, 18994 => 20160, 18995 => 39135,
+ 18996 => 34432, 18997 => 23454, 18998 => 35782, 18999 => 21490, 19000 => 30690,
+ 19001 => 20351, 19002 => 23630, 19003 => 39542, 19004 => 22987, 19005 => 24335,
+ 19006 => 31034, 19007 => 22763, 19008 => 19990, 19009 => 26623, 19010 => 20107,
+ 19011 => 25325, 19012 => 35475, 19013 => 36893, 19014 => 21183, 19015 => 26159,
+ 19016 => 21980, 19017 => 22124, 19018 => 36866, 19019 => 20181, 19020 => 20365,
+ 19021 => 37322, 19022 => 39280, 19023 => 27663, 19024 => 24066, 19025 => 24643,
+ 19026 => 23460, 19027 => 35270, 19028 => 35797, 19029 => 25910, 19030 => 25163,
+ 19031 => 39318, 19032 => 23432, 19033 => 23551, 19034 => 25480, 19035 => 21806,
+ 19036 => 21463, 19037 => 30246, 19038 => 20861, 19039 => 34092, 19040 => 26530,
+ 19041 => 26803, 19042 => 27530, 19043 => 25234, 19044 => 36755, 19045 => 21460,
+ 19046 => 33298, 19047 => 28113, 19048 => 30095, 19049 => 20070, 19050 => 36174,
+ 19051 => 23408, 19052 => 29087, 19053 => 34223, 19054 => 26257, 19055 => 26329,
+ 19056 => 32626, 19057 => 34560, 19058 => 40653, 19059 => 40736, 19060 => 23646,
+ 19061 => 26415, 19062 => 36848, 19063 => 26641, 19064 => 26463, 19065 => 25101,
+ 19066 => 31446, 19067 => 22661, 19068 => 24246, 19069 => 25968, 19070 => 28465,
+ 19233 => 24661, 19234 => 21047, 19235 => 32781, 19236 => 25684, 19237 => 34928,
+ 19238 => 29993, 19239 => 24069, 19240 => 26643, 19241 => 25332, 19242 => 38684,
+ 19243 => 21452, 19244 => 29245, 19245 => 35841, 19246 => 27700, 19247 => 30561,
+ 19248 => 31246, 19249 => 21550, 19250 => 30636, 19251 => 39034, 19252 => 33308,
+ 19253 => 35828, 19254 => 30805, 19255 => 26388, 19256 => 28865, 19257 => 26031,
+ 19258 => 25749, 19259 => 22070, 19260 => 24605, 19261 => 31169, 19262 => 21496,
+ 19263 => 19997, 19264 => 27515, 19265 => 32902, 19266 => 23546, 19267 => 21987,
+ 19268 => 22235, 19269 => 20282, 19270 => 20284, 19271 => 39282, 19272 => 24051,
+ 19273 => 26494, 19274 => 32824, 19275 => 24578, 19276 => 39042, 19277 => 36865,
+ 19278 => 23435, 19279 => 35772, 19280 => 35829, 19281 => 25628, 19282 => 33368,
+ 19283 => 25822, 19284 => 22013, 19285 => 33487, 19286 => 37221, 19287 => 20439,
+ 19288 => 32032, 19289 => 36895, 19290 => 31903, 19291 => 20723, 19292 => 22609,
+ 19293 => 28335, 19294 => 23487, 19295 => 35785, 19296 => 32899, 19297 => 37240,
+ 19298 => 33948, 19299 => 31639, 19300 => 34429, 19301 => 38539, 19302 => 38543,
+ 19303 => 32485, 19304 => 39635, 19305 => 30862, 19306 => 23681, 19307 => 31319,
+ 19308 => 36930, 19309 => 38567, 19310 => 31071, 19311 => 23385, 19312 => 25439,
+ 19313 => 31499, 19314 => 34001, 19315 => 26797, 19316 => 21766, 19317 => 32553,
+ 19318 => 29712, 19319 => 32034, 19320 => 38145, 19321 => 25152, 19322 => 22604,
+ 19323 => 20182, 19324 => 23427, 19325 => 22905, 19326 => 22612, 19489 => 29549,
+ 19490 => 25374, 19491 => 36427, 19492 => 36367, 19493 => 32974, 19494 => 33492,
+ 19495 => 25260, 19496 => 21488, 19497 => 27888, 19498 => 37214, 19499 => 22826,
+ 19500 => 24577, 19501 => 27760, 19502 => 22349, 19503 => 25674, 19504 => 36138,
+ 19505 => 30251, 19506 => 28393, 19507 => 22363, 19508 => 27264, 19509 => 30192,
+ 19510 => 28525, 19511 => 35885, 19512 => 35848, 19513 => 22374, 19514 => 27631,
+ 19515 => 34962, 19516 => 30899, 19517 => 25506, 19518 => 21497, 19519 => 28845,
+ 19520 => 27748, 19521 => 22616, 19522 => 25642, 19523 => 22530, 19524 => 26848,
+ 19525 => 33179, 19526 => 21776, 19527 => 31958, 19528 => 20504, 19529 => 36538,
+ 19530 => 28108, 19531 => 36255, 19532 => 28907, 19533 => 25487, 19534 => 28059,
+ 19535 => 28372, 19536 => 32486, 19537 => 33796, 19538 => 26691, 19539 => 36867,
+ 19540 => 28120, 19541 => 38518, 19542 => 35752, 19543 => 22871, 19544 => 29305,
+ 19545 => 34276, 19546 => 33150, 19547 => 30140, 19548 => 35466, 19549 => 26799,
+ 19550 => 21076, 19551 => 36386, 19552 => 38161, 19553 => 25552, 19554 => 39064,
+ 19555 => 36420, 19556 => 21884, 19557 => 20307, 19558 => 26367, 19559 => 22159,
+ 19560 => 24789, 19561 => 28053, 19562 => 21059, 19563 => 23625, 19564 => 22825,
+ 19565 => 28155, 19566 => 22635, 19567 => 30000, 19568 => 29980, 19569 => 24684,
+ 19570 => 33300, 19571 => 33094, 19572 => 25361, 19573 => 26465, 19574 => 36834,
+ 19575 => 30522, 19576 => 36339, 19577 => 36148, 19578 => 38081, 19579 => 24086,
+ 19580 => 21381, 19581 => 21548, 19582 => 28867, 19745 => 27712, 19746 => 24311,
+ 19747 => 20572, 19748 => 20141, 19749 => 24237, 19750 => 25402, 19751 => 33351,
+ 19752 => 36890, 19753 => 26704, 19754 => 37230, 19755 => 30643, 19756 => 21516,
+ 19757 => 38108, 19758 => 24420, 19759 => 31461, 19760 => 26742, 19761 => 25413,
+ 19762 => 31570, 19763 => 32479, 19764 => 30171, 19765 => 20599, 19766 => 25237,
+ 19767 => 22836, 19768 => 36879, 19769 => 20984, 19770 => 31171, 19771 => 31361,
+ 19772 => 22270, 19773 => 24466, 19774 => 36884, 19775 => 28034, 19776 => 23648,
+ 19777 => 22303, 19778 => 21520, 19779 => 20820, 19780 => 28237, 19781 => 22242,
+ 19782 => 25512, 19783 => 39059, 19784 => 33151, 19785 => 34581, 19786 => 35114,
+ 19787 => 36864, 19788 => 21534, 19789 => 23663, 19790 => 33216, 19791 => 25302,
+ 19792 => 25176, 19793 => 33073, 19794 => 40501, 19795 => 38464, 19796 => 39534,
+ 19797 => 39548, 19798 => 26925, 19799 => 22949, 19800 => 25299, 19801 => 21822,
+ 19802 => 25366, 19803 => 21703, 19804 => 34521, 19805 => 27964, 19806 => 23043,
+ 19807 => 29926, 19808 => 34972, 19809 => 27498, 19810 => 22806, 19811 => 35916,
+ 19812 => 24367, 19813 => 28286, 19814 => 29609, 19815 => 39037, 19816 => 20024,
+ 19817 => 28919, 19818 => 23436, 19819 => 30871, 19820 => 25405, 19821 => 26202,
+ 19822 => 30358, 19823 => 24779, 19824 => 23451, 19825 => 23113, 19826 => 19975,
+ 19827 => 33109, 19828 => 27754, 19829 => 29579, 19830 => 20129, 19831 => 26505,
+ 19832 => 32593, 19833 => 24448, 19834 => 26106, 19835 => 26395, 19836 => 24536,
+ 19837 => 22916, 19838 => 23041, 20001 => 24013, 20002 => 24494, 20003 => 21361,
+ 20004 => 38886, 20005 => 36829, 20006 => 26693, 20007 => 22260, 20008 => 21807,
+ 20009 => 24799, 20010 => 20026, 20011 => 28493, 20012 => 32500, 20013 => 33479,
+ 20014 => 33806, 20015 => 22996, 20016 => 20255, 20017 => 20266, 20018 => 23614,
+ 20019 => 32428, 20020 => 26410, 20021 => 34074, 20022 => 21619, 20023 => 30031,
+ 20024 => 32963, 20025 => 21890, 20026 => 39759, 20027 => 20301, 20028 => 28205,
+ 20029 => 35859, 20030 => 23561, 20031 => 24944, 20032 => 21355, 20033 => 30239,
+ 20034 => 28201, 20035 => 34442, 20036 => 25991, 20037 => 38395, 20038 => 32441,
+ 20039 => 21563, 20040 => 31283, 20041 => 32010, 20042 => 38382, 20043 => 21985,
+ 20044 => 32705, 20045 => 29934, 20046 => 25373, 20047 => 34583, 20048 => 28065,
+ 20049 => 31389, 20050 => 25105, 20051 => 26017, 20052 => 21351, 20053 => 25569,
+ 20054 => 27779, 20055 => 24043, 20056 => 21596, 20057 => 38056, 20058 => 20044,
+ 20059 => 27745, 20060 => 35820, 20061 => 23627, 20062 => 26080, 20063 => 33436,
+ 20064 => 26791, 20065 => 21566, 20066 => 21556, 20067 => 27595, 20068 => 27494,
+ 20069 => 20116, 20070 => 25410, 20071 => 21320, 20072 => 33310, 20073 => 20237,
+ 20074 => 20398, 20075 => 22366, 20076 => 25098, 20077 => 38654, 20078 => 26212,
+ 20079 => 29289, 20080 => 21247, 20081 => 21153, 20082 => 24735, 20083 => 35823,
+ 20084 => 26132, 20085 => 29081, 20086 => 26512, 20087 => 35199, 20088 => 30802,
+ 20089 => 30717, 20090 => 26224, 20091 => 22075, 20092 => 21560, 20093 => 38177,
+ 20094 => 29306, 20257 => 31232, 20258 => 24687, 20259 => 24076, 20260 => 24713,
+ 20261 => 33181, 20262 => 22805, 20263 => 24796, 20264 => 29060, 20265 => 28911,
+ 20266 => 28330, 20267 => 27728, 20268 => 29312, 20269 => 27268, 20270 => 34989,
+ 20271 => 24109, 20272 => 20064, 20273 => 23219, 20274 => 21916, 20275 => 38115,
+ 20276 => 27927, 20277 => 31995, 20278 => 38553, 20279 => 25103, 20280 => 32454,
+ 20281 => 30606, 20282 => 34430, 20283 => 21283, 20284 => 38686, 20285 => 36758,
+ 20286 => 26247, 20287 => 23777, 20288 => 20384, 20289 => 29421, 20290 => 19979,
+ 20291 => 21414, 20292 => 22799, 20293 => 21523, 20294 => 25472, 20295 => 38184,
+ 20296 => 20808, 20297 => 20185, 20298 => 40092, 20299 => 32420, 20300 => 21688,
+ 20301 => 36132, 20302 => 34900, 20303 => 33335, 20304 => 38386, 20305 => 28046,
+ 20306 => 24358, 20307 => 23244, 20308 => 26174, 20309 => 38505, 20310 => 29616,
+ 20311 => 29486, 20312 => 21439, 20313 => 33146, 20314 => 39301, 20315 => 32673,
+ 20316 => 23466, 20317 => 38519, 20318 => 38480, 20319 => 32447, 20320 => 30456,
+ 20321 => 21410, 20322 => 38262, 20323 => 39321, 20324 => 31665, 20325 => 35140,
+ 20326 => 28248, 20327 => 20065, 20328 => 32724, 20329 => 31077, 20330 => 35814,
+ 20331 => 24819, 20332 => 21709, 20333 => 20139, 20334 => 39033, 20335 => 24055,
+ 20336 => 27233, 20337 => 20687, 20338 => 21521, 20339 => 35937, 20340 => 33831,
+ 20341 => 30813, 20342 => 38660, 20343 => 21066, 20344 => 21742, 20345 => 22179,
+ 20346 => 38144, 20347 => 28040, 20348 => 23477, 20349 => 28102, 20350 => 26195,
+ 20513 => 23567, 20514 => 23389, 20515 => 26657, 20516 => 32918, 20517 => 21880,
+ 20518 => 31505, 20519 => 25928, 20520 => 26964, 20521 => 20123, 20522 => 27463,
+ 20523 => 34638, 20524 => 38795, 20525 => 21327, 20526 => 25375, 20527 => 25658,
+ 20528 => 37034, 20529 => 26012, 20530 => 32961, 20531 => 35856, 20532 => 20889,
+ 20533 => 26800, 20534 => 21368, 20535 => 34809, 20536 => 25032, 20537 => 27844,
+ 20538 => 27899, 20539 => 35874, 20540 => 23633, 20541 => 34218, 20542 => 33455,
+ 20543 => 38156, 20544 => 27427, 20545 => 36763, 20546 => 26032, 20547 => 24571,
+ 20548 => 24515, 20549 => 20449, 20550 => 34885, 20551 => 26143, 20552 => 33125,
+ 20553 => 29481, 20554 => 24826, 20555 => 20852, 20556 => 21009, 20557 => 22411,
+ 20558 => 24418, 20559 => 37026, 20560 => 34892, 20561 => 37266, 20562 => 24184,
+ 20563 => 26447, 20564 => 24615, 20565 => 22995, 20566 => 20804, 20567 => 20982,
+ 20568 => 33016, 20569 => 21256, 20570 => 27769, 20571 => 38596, 20572 => 29066,
+ 20573 => 20241, 20574 => 20462, 20575 => 32670, 20576 => 26429, 20577 => 21957,
+ 20578 => 38152, 20579 => 31168, 20580 => 34966, 20581 => 32483, 20582 => 22687,
+ 20583 => 25100, 20584 => 38656, 20585 => 34394, 20586 => 22040, 20587 => 39035,
+ 20588 => 24464, 20589 => 35768, 20590 => 33988, 20591 => 37207, 20592 => 21465,
+ 20593 => 26093, 20594 => 24207, 20595 => 30044, 20596 => 24676, 20597 => 32110,
+ 20598 => 23167, 20599 => 32490, 20600 => 32493, 20601 => 36713, 20602 => 21927,
+ 20603 => 23459, 20604 => 24748, 20605 => 26059, 20606 => 29572, 20769 => 36873,
+ 20770 => 30307, 20771 => 30505, 20772 => 32474, 20773 => 38772, 20774 => 34203,
+ 20775 => 23398, 20776 => 31348, 20777 => 38634, 20778 => 34880, 20779 => 21195,
+ 20780 => 29071, 20781 => 24490, 20782 => 26092, 20783 => 35810, 20784 => 23547,
+ 20785 => 39535, 20786 => 24033, 20787 => 27529, 20788 => 27739, 20789 => 35757,
+ 20790 => 35759, 20791 => 36874, 20792 => 36805, 20793 => 21387, 20794 => 25276,
+ 20795 => 40486, 20796 => 40493, 20797 => 21568, 20798 => 20011, 20799 => 33469,
+ 20800 => 29273, 20801 => 34460, 20802 => 23830, 20803 => 34905, 20804 => 28079,
+ 20805 => 38597, 20806 => 21713, 20807 => 20122, 20808 => 35766, 20809 => 28937,
+ 20810 => 21693, 20811 => 38409, 20812 => 28895, 20813 => 28153, 20814 => 30416,
+ 20815 => 20005, 20816 => 30740, 20817 => 34578, 20818 => 23721, 20819 => 24310,
+ 20820 => 35328, 20821 => 39068, 20822 => 38414, 20823 => 28814, 20824 => 27839,
+ 20825 => 22852, 20826 => 25513, 20827 => 30524, 20828 => 34893, 20829 => 28436,
+ 20830 => 33395, 20831 => 22576, 20832 => 29141, 20833 => 21388, 20834 => 30746,
+ 20835 => 38593, 20836 => 21761, 20837 => 24422, 20838 => 28976, 20839 => 23476,
+ 20840 => 35866, 20841 => 39564, 20842 => 27523, 20843 => 22830, 20844 => 40495,
+ 20845 => 31207, 20846 => 26472, 20847 => 25196, 20848 => 20335, 20849 => 30113,
+ 20850 => 32650, 20851 => 27915, 20852 => 38451, 20853 => 27687, 20854 => 20208,
+ 20855 => 30162, 20856 => 20859, 20857 => 26679, 20858 => 28478, 20859 => 36992,
+ 20860 => 33136, 20861 => 22934, 20862 => 29814, 21025 => 25671, 21026 => 23591,
+ 21027 => 36965, 21028 => 31377, 21029 => 35875, 21030 => 23002, 21031 => 21676,
+ 21032 => 33280, 21033 => 33647, 21034 => 35201, 21035 => 32768, 21036 => 26928,
+ 21037 => 22094, 21038 => 32822, 21039 => 29239, 21040 => 37326, 21041 => 20918,
+ 21042 => 20063, 21043 => 39029, 21044 => 25494, 21045 => 19994, 21046 => 21494,
+ 21047 => 26355, 21048 => 33099, 21049 => 22812, 21050 => 28082, 21051 => 19968,
+ 21052 => 22777, 21053 => 21307, 21054 => 25558, 21055 => 38129, 21056 => 20381,
+ 21057 => 20234, 21058 => 34915, 21059 => 39056, 21060 => 22839, 21061 => 36951,
+ 21062 => 31227, 21063 => 20202, 21064 => 33008, 21065 => 30097, 21066 => 27778,
+ 21067 => 23452, 21068 => 23016, 21069 => 24413, 21070 => 26885, 21071 => 34433,
+ 21072 => 20506, 21073 => 24050, 21074 => 20057, 21075 => 30691, 21076 => 20197,
+ 21077 => 33402, 21078 => 25233, 21079 => 26131, 21080 => 37009, 21081 => 23673,
+ 21082 => 20159, 21083 => 24441, 21084 => 33222, 21085 => 36920, 21086 => 32900,
+ 21087 => 30123, 21088 => 20134, 21089 => 35028, 21090 => 24847, 21091 => 27589,
+ 21092 => 24518, 21093 => 20041, 21094 => 30410, 21095 => 28322, 21096 => 35811,
+ 21097 => 35758, 21098 => 35850, 21099 => 35793, 21100 => 24322, 21101 => 32764,
+ 21102 => 32716, 21103 => 32462, 21104 => 33589, 21105 => 33643, 21106 => 22240,
+ 21107 => 27575, 21108 => 38899, 21109 => 38452, 21110 => 23035, 21111 => 21535,
+ 21112 => 38134, 21113 => 28139, 21114 => 23493, 21115 => 39278, 21116 => 23609,
+ 21117 => 24341, 21118 => 38544, 21281 => 21360, 21282 => 33521, 21283 => 27185,
+ 21284 => 23156, 21285 => 40560, 21286 => 24212, 21287 => 32552, 21288 => 33721,
+ 21289 => 33828, 21290 => 33829, 21291 => 33639, 21292 => 34631, 21293 => 36814,
+ 21294 => 36194, 21295 => 30408, 21296 => 24433, 21297 => 39062, 21298 => 30828,
+ 21299 => 26144, 21300 => 21727, 21301 => 25317, 21302 => 20323, 21303 => 33219,
+ 21304 => 30152, 21305 => 24248, 21306 => 38605, 21307 => 36362, 21308 => 34553,
+ 21309 => 21647, 21310 => 27891, 21311 => 28044, 21312 => 27704, 21313 => 24703,
+ 21314 => 21191, 21315 => 29992, 21316 => 24189, 21317 => 20248, 21318 => 24736,
+ 21319 => 24551, 21320 => 23588, 21321 => 30001, 21322 => 37038, 21323 => 38080,
+ 21324 => 29369, 21325 => 27833, 21326 => 28216, 21327 => 37193, 21328 => 26377,
+ 21329 => 21451, 21330 => 21491, 21331 => 20305, 21332 => 37321, 21333 => 35825,
+ 21334 => 21448, 21335 => 24188, 21336 => 36802, 21337 => 28132, 21338 => 20110,
+ 21339 => 30402, 21340 => 27014, 21341 => 34398, 21342 => 24858, 21343 => 33286,
+ 21344 => 20313, 21345 => 20446, 21346 => 36926, 21347 => 40060, 21348 => 24841,
+ 21349 => 28189, 21350 => 28180, 21351 => 38533, 21352 => 20104, 21353 => 23089,
+ 21354 => 38632, 21355 => 19982, 21356 => 23679, 21357 => 31161, 21358 => 23431,
+ 21359 => 35821, 21360 => 32701, 21361 => 29577, 21362 => 22495, 21363 => 33419,
+ 21364 => 37057, 21365 => 21505, 21366 => 36935, 21367 => 21947, 21368 => 23786,
+ 21369 => 24481, 21370 => 24840, 21371 => 27442, 21372 => 29425, 21373 => 32946,
+ 21374 => 35465, 21537 => 28020, 21538 => 23507, 21539 => 35029, 21540 => 39044,
+ 21541 => 35947, 21542 => 39533, 21543 => 40499, 21544 => 28170, 21545 => 20900,
+ 21546 => 20803, 21547 => 22435, 21548 => 34945, 21549 => 21407, 21550 => 25588,
+ 21551 => 36757, 21552 => 22253, 21553 => 21592, 21554 => 22278, 21555 => 29503,
+ 21556 => 28304, 21557 => 32536, 21558 => 36828, 21559 => 33489, 21560 => 24895,
+ 21561 => 24616, 21562 => 38498, 21563 => 26352, 21564 => 32422, 21565 => 36234,
+ 21566 => 36291, 21567 => 38053, 21568 => 23731, 21569 => 31908, 21570 => 26376,
+ 21571 => 24742, 21572 => 38405, 21573 => 32792, 21574 => 20113, 21575 => 37095,
+ 21576 => 21248, 21577 => 38504, 21578 => 20801, 21579 => 36816, 21580 => 34164,
+ 21581 => 37213, 21582 => 26197, 21583 => 38901, 21584 => 23381, 21585 => 21277,
+ 21586 => 30776, 21587 => 26434, 21588 => 26685, 21589 => 21705, 21590 => 28798,
+ 21591 => 23472, 21592 => 36733, 21593 => 20877, 21594 => 22312, 21595 => 21681,
+ 21596 => 25874, 21597 => 26242, 21598 => 36190, 21599 => 36163, 21600 => 33039,
+ 21601 => 33900, 21602 => 36973, 21603 => 31967, 21604 => 20991, 21605 => 34299,
+ 21606 => 26531, 21607 => 26089, 21608 => 28577, 21609 => 34468, 21610 => 36481,
+ 21611 => 22122, 21612 => 36896, 21613 => 30338, 21614 => 28790, 21615 => 29157,
+ 21616 => 36131, 21617 => 25321, 21618 => 21017, 21619 => 27901, 21620 => 36156,
+ 21621 => 24590, 21622 => 22686, 21623 => 24974, 21624 => 26366, 21625 => 36192,
+ 21626 => 25166, 21627 => 21939, 21628 => 28195, 21629 => 26413, 21630 => 36711,
+ 21793 => 38113, 21794 => 38392, 21795 => 30504, 21796 => 26629, 21797 => 27048,
+ 21798 => 21643, 21799 => 20045, 21800 => 28856, 21801 => 35784, 21802 => 25688,
+ 21803 => 25995, 21804 => 23429, 21805 => 31364, 21806 => 20538, 21807 => 23528,
+ 21808 => 30651, 21809 => 27617, 21810 => 35449, 21811 => 31896, 21812 => 27838,
+ 21813 => 30415, 21814 => 26025, 21815 => 36759, 21816 => 23853, 21817 => 23637,
+ 21818 => 34360, 21819 => 26632, 21820 => 21344, 21821 => 25112, 21822 => 31449,
+ 21823 => 28251, 21824 => 32509, 21825 => 27167, 21826 => 31456, 21827 => 24432,
+ 21828 => 28467, 21829 => 24352, 21830 => 25484, 21831 => 28072, 21832 => 26454,
+ 21833 => 19976, 21834 => 24080, 21835 => 36134, 21836 => 20183, 21837 => 32960,
+ 21838 => 30260, 21839 => 38556, 21840 => 25307, 21841 => 26157, 21842 => 25214,
+ 21843 => 27836, 21844 => 36213, 21845 => 29031, 21846 => 32617, 21847 => 20806,
+ 21848 => 32903, 21849 => 21484, 21850 => 36974, 21851 => 25240, 21852 => 21746,
+ 21853 => 34544, 21854 => 36761, 21855 => 32773, 21856 => 38167, 21857 => 34071,
+ 21858 => 36825, 21859 => 27993, 21860 => 29645, 21861 => 26015, 21862 => 30495,
+ 21863 => 29956, 21864 => 30759, 21865 => 33275, 21866 => 36126, 21867 => 38024,
+ 21868 => 20390, 21869 => 26517, 21870 => 30137, 21871 => 35786, 21872 => 38663,
+ 21873 => 25391, 21874 => 38215, 21875 => 38453, 21876 => 33976, 21877 => 25379,
+ 21878 => 30529, 21879 => 24449, 21880 => 29424, 21881 => 20105, 21882 => 24596,
+ 21883 => 25972, 21884 => 25327, 21885 => 27491, 21886 => 25919, 22049 => 24103,
+ 22050 => 30151, 22051 => 37073, 22052 => 35777, 22053 => 33437, 22054 => 26525,
+ 22055 => 25903, 22056 => 21553, 22057 => 34584, 22058 => 30693, 22059 => 32930,
+ 22060 => 33026, 22061 => 27713, 22062 => 20043, 22063 => 32455, 22064 => 32844,
+ 22065 => 30452, 22066 => 26893, 22067 => 27542, 22068 => 25191, 22069 => 20540,
+ 22070 => 20356, 22071 => 22336, 22072 => 25351, 22073 => 27490, 22074 => 36286,
+ 22075 => 21482, 22076 => 26088, 22077 => 32440, 22078 => 24535, 22079 => 25370,
+ 22080 => 25527, 22081 => 33267, 22082 => 33268, 22083 => 32622, 22084 => 24092,
+ 22085 => 23769, 22086 => 21046, 22087 => 26234, 22088 => 31209, 22089 => 31258,
+ 22090 => 36136, 22091 => 28825, 22092 => 30164, 22093 => 28382, 22094 => 27835,
+ 22095 => 31378, 22096 => 20013, 22097 => 30405, 22098 => 24544, 22099 => 38047,
+ 22100 => 34935, 22101 => 32456, 22102 => 31181, 22103 => 32959, 22104 => 37325,
+ 22105 => 20210, 22106 => 20247, 22107 => 33311, 22108 => 21608, 22109 => 24030,
+ 22110 => 27954, 22111 => 35788, 22112 => 31909, 22113 => 36724, 22114 => 32920,
+ 22115 => 24090, 22116 => 21650, 22117 => 30385, 22118 => 23449, 22119 => 26172,
+ 22120 => 39588, 22121 => 29664, 22122 => 26666, 22123 => 34523, 22124 => 26417,
+ 22125 => 29482, 22126 => 35832, 22127 => 35803, 22128 => 36880, 22129 => 31481,
+ 22130 => 28891, 22131 => 29038, 22132 => 25284, 22133 => 30633, 22134 => 22065,
+ 22135 => 20027, 22136 => 33879, 22137 => 26609, 22138 => 21161, 22139 => 34496,
+ 22140 => 36142, 22141 => 38136, 22142 => 31569, 22305 => 20303, 22306 => 27880,
+ 22307 => 31069, 22308 => 39547, 22309 => 25235, 22310 => 29226, 22311 => 25341,
+ 22312 => 19987, 22313 => 30742, 22314 => 36716, 22315 => 25776, 22316 => 36186,
+ 22317 => 31686, 22318 => 26729, 22319 => 24196, 22320 => 35013, 22321 => 22918,
+ 22322 => 25758, 22323 => 22766, 22324 => 29366, 22325 => 26894, 22326 => 38181,
+ 22327 => 36861, 22328 => 36184, 22329 => 22368, 22330 => 32512, 22331 => 35846,
+ 22332 => 20934, 22333 => 25417, 22334 => 25305, 22335 => 21331, 22336 => 26700,
+ 22337 => 29730, 22338 => 33537, 22339 => 37196, 22340 => 21828, 22341 => 30528,
+ 22342 => 28796, 22343 => 27978, 22344 => 20857, 22345 => 21672, 22346 => 36164,
+ 22347 => 23039, 22348 => 28363, 22349 => 28100, 22350 => 23388, 22351 => 32043,
+ 22352 => 20180, 22353 => 31869, 22354 => 28371, 22355 => 23376, 22356 => 33258,
+ 22357 => 28173, 22358 => 23383, 22359 => 39683, 22360 => 26837, 22361 => 36394,
+ 22362 => 23447, 22363 => 32508, 22364 => 24635, 22365 => 32437, 22366 => 37049,
+ 22367 => 36208, 22368 => 22863, 22369 => 25549, 22370 => 31199, 22371 => 36275,
+ 22372 => 21330, 22373 => 26063, 22374 => 31062, 22375 => 35781, 22376 => 38459,
+ 22377 => 32452, 22378 => 38075, 22379 => 32386, 22380 => 22068, 22381 => 37257,
+ 22382 => 26368, 22383 => 32618, 22384 => 23562, 22385 => 36981, 22386 => 26152,
+ 22387 => 24038, 22388 => 20304, 22389 => 26590, 22390 => 20570, 22391 => 20316,
+ 22392 => 22352, 22393 => 24231, 22561 => 20109, 22562 => 19980, 22563 => 20800,
+ 22564 => 19984, 22565 => 24319, 22566 => 21317, 22567 => 19989, 22568 => 20120,
+ 22569 => 19998, 22570 => 39730, 22571 => 23404, 22572 => 22121, 22573 => 20008,
+ 22574 => 31162, 22575 => 20031, 22576 => 21269, 22577 => 20039, 22578 => 22829,
+ 22579 => 29243, 22580 => 21358, 22581 => 27664, 22582 => 22239, 22583 => 32996,
+ 22584 => 39319, 22585 => 27603, 22586 => 30590, 22587 => 40727, 22588 => 20022,
+ 22589 => 20127, 22590 => 40720, 22591 => 20060, 22592 => 20073, 22593 => 20115,
+ 22594 => 33416, 22595 => 23387, 22596 => 21868, 22597 => 22031, 22598 => 20164,
+ 22599 => 21389, 22600 => 21405, 22601 => 21411, 22602 => 21413, 22603 => 21422,
+ 22604 => 38757, 22605 => 36189, 22606 => 21274, 22607 => 21493, 22608 => 21286,
+ 22609 => 21294, 22610 => 21310, 22611 => 36188, 22612 => 21350, 22613 => 21347,
+ 22614 => 20994, 22615 => 21000, 22616 => 21006, 22617 => 21037, 22618 => 21043,
+ 22619 => 21055, 22620 => 21056, 22621 => 21068, 22622 => 21086, 22623 => 21089,
+ 22624 => 21084, 22625 => 33967, 22626 => 21117, 22627 => 21122, 22628 => 21121,
+ 22629 => 21136, 22630 => 21139, 22631 => 20866, 22632 => 32596, 22633 => 20155,
+ 22634 => 20163, 22635 => 20169, 22636 => 20162, 22637 => 20200, 22638 => 20193,
+ 22639 => 20203, 22640 => 20190, 22641 => 20251, 22642 => 20211, 22643 => 20258,
+ 22644 => 20324, 22645 => 20213, 22646 => 20261, 22647 => 20263, 22648 => 20233,
+ 22649 => 20267, 22650 => 20318, 22651 => 20327, 22652 => 25912, 22653 => 20314,
+ 22654 => 20317, 22817 => 20319, 22818 => 20311, 22819 => 20274, 22820 => 20285,
+ 22821 => 20342, 22822 => 20340, 22823 => 20369, 22824 => 20361, 22825 => 20355,
+ 22826 => 20367, 22827 => 20350, 22828 => 20347, 22829 => 20394, 22830 => 20348,
+ 22831 => 20396, 22832 => 20372, 22833 => 20454, 22834 => 20456, 22835 => 20458,
+ 22836 => 20421, 22837 => 20442, 22838 => 20451, 22839 => 20444, 22840 => 20433,
+ 22841 => 20447, 22842 => 20472, 22843 => 20521, 22844 => 20556, 22845 => 20467,
+ 22846 => 20524, 22847 => 20495, 22848 => 20526, 22849 => 20525, 22850 => 20478,
+ 22851 => 20508, 22852 => 20492, 22853 => 20517, 22854 => 20520, 22855 => 20606,
+ 22856 => 20547, 22857 => 20565, 22858 => 20552, 22859 => 20558, 22860 => 20588,
+ 22861 => 20603, 22862 => 20645, 22863 => 20647, 22864 => 20649, 22865 => 20666,
+ 22866 => 20694, 22867 => 20742, 22868 => 20717, 22869 => 20716, 22870 => 20710,
+ 22871 => 20718, 22872 => 20743, 22873 => 20747, 22874 => 20189, 22875 => 27709,
+ 22876 => 20312, 22877 => 20325, 22878 => 20430, 22879 => 40864, 22880 => 27718,
+ 22881 => 31860, 22882 => 20846, 22883 => 24061, 22884 => 40649, 22885 => 39320,
+ 22886 => 20865, 22887 => 22804, 22888 => 21241, 22889 => 21261, 22890 => 35335,
+ 22891 => 21264, 22892 => 20971, 22893 => 22809, 22894 => 20821, 22895 => 20128,
+ 22896 => 20822, 22897 => 20147, 22898 => 34926, 22899 => 34980, 22900 => 20149,
+ 22901 => 33044, 22902 => 35026, 22903 => 31104, 22904 => 23348, 22905 => 34819,
+ 22906 => 32696, 22907 => 20907, 22908 => 20913, 22909 => 20925, 22910 => 20924,
+ 23073 => 20935, 23074 => 20886, 23075 => 20898, 23076 => 20901, 23077 => 35744,
+ 23078 => 35750, 23079 => 35751, 23080 => 35754, 23081 => 35764, 23082 => 35765,
+ 23083 => 35767, 23084 => 35778, 23085 => 35779, 23086 => 35787, 23087 => 35791,
+ 23088 => 35790, 23089 => 35794, 23090 => 35795, 23091 => 35796, 23092 => 35798,
+ 23093 => 35800, 23094 => 35801, 23095 => 35804, 23096 => 35807, 23097 => 35808,
+ 23098 => 35812, 23099 => 35816, 23100 => 35817, 23101 => 35822, 23102 => 35824,
+ 23103 => 35827, 23104 => 35830, 23105 => 35833, 23106 => 35836, 23107 => 35839,
+ 23108 => 35840, 23109 => 35842, 23110 => 35844, 23111 => 35847, 23112 => 35852,
+ 23113 => 35855, 23114 => 35857, 23115 => 35858, 23116 => 35860, 23117 => 35861,
+ 23118 => 35862, 23119 => 35865, 23120 => 35867, 23121 => 35864, 23122 => 35869,
+ 23123 => 35871, 23124 => 35872, 23125 => 35873, 23126 => 35877, 23127 => 35879,
+ 23128 => 35882, 23129 => 35883, 23130 => 35886, 23131 => 35887, 23132 => 35890,
+ 23133 => 35891, 23134 => 35893, 23135 => 35894, 23136 => 21353, 23137 => 21370,
+ 23138 => 38429, 23139 => 38434, 23140 => 38433, 23141 => 38449, 23142 => 38442,
+ 23143 => 38461, 23144 => 38460, 23145 => 38466, 23146 => 38473, 23147 => 38484,
+ 23148 => 38495, 23149 => 38503, 23150 => 38508, 23151 => 38514, 23152 => 38516,
+ 23153 => 38536, 23154 => 38541, 23155 => 38551, 23156 => 38576, 23157 => 37015,
+ 23158 => 37019, 23159 => 37021, 23160 => 37017, 23161 => 37036, 23162 => 37025,
+ 23163 => 37044, 23164 => 37043, 23165 => 37046, 23166 => 37050, 23329 => 37048,
+ 23330 => 37040, 23331 => 37071, 23332 => 37061, 23333 => 37054, 23334 => 37072,
+ 23335 => 37060, 23336 => 37063, 23337 => 37075, 23338 => 37094, 23339 => 37090,
+ 23340 => 37084, 23341 => 37079, 23342 => 37083, 23343 => 37099, 23344 => 37103,
+ 23345 => 37118, 23346 => 37124, 23347 => 37154, 23348 => 37150, 23349 => 37155,
+ 23350 => 37169, 23351 => 37167, 23352 => 37177, 23353 => 37187, 23354 => 37190,
+ 23355 => 21005, 23356 => 22850, 23357 => 21154, 23358 => 21164, 23359 => 21165,
+ 23360 => 21182, 23361 => 21759, 23362 => 21200, 23363 => 21206, 23364 => 21232,
+ 23365 => 21471, 23366 => 29166, 23367 => 30669, 23368 => 24308, 23369 => 20981,
+ 23370 => 20988, 23371 => 39727, 23372 => 21430, 23373 => 24321, 23374 => 30042,
+ 23375 => 24047, 23376 => 22348, 23377 => 22441, 23378 => 22433, 23379 => 22654,
+ 23380 => 22716, 23381 => 22725, 23382 => 22737, 23383 => 22313, 23384 => 22316,
+ 23385 => 22314, 23386 => 22323, 23387 => 22329, 23388 => 22318, 23389 => 22319,
+ 23390 => 22364, 23391 => 22331, 23392 => 22338, 23393 => 22377, 23394 => 22405,
+ 23395 => 22379, 23396 => 22406, 23397 => 22396, 23398 => 22395, 23399 => 22376,
+ 23400 => 22381, 23401 => 22390, 23402 => 22387, 23403 => 22445, 23404 => 22436,
+ 23405 => 22412, 23406 => 22450, 23407 => 22479, 23408 => 22439, 23409 => 22452,
+ 23410 => 22419, 23411 => 22432, 23412 => 22485, 23413 => 22488, 23414 => 22490,
+ 23415 => 22489, 23416 => 22482, 23417 => 22456, 23418 => 22516, 23419 => 22511,
+ 23420 => 22520, 23421 => 22500, 23422 => 22493, 23585 => 22539, 23586 => 22541,
+ 23587 => 22525, 23588 => 22509, 23589 => 22528, 23590 => 22558, 23591 => 22553,
+ 23592 => 22596, 23593 => 22560, 23594 => 22629, 23595 => 22636, 23596 => 22657,
+ 23597 => 22665, 23598 => 22682, 23599 => 22656, 23600 => 39336, 23601 => 40729,
+ 23602 => 25087, 23603 => 33401, 23604 => 33405, 23605 => 33407, 23606 => 33423,
+ 23607 => 33418, 23608 => 33448, 23609 => 33412, 23610 => 33422, 23611 => 33425,
+ 23612 => 33431, 23613 => 33433, 23614 => 33451, 23615 => 33464, 23616 => 33470,
+ 23617 => 33456, 23618 => 33480, 23619 => 33482, 23620 => 33507, 23621 => 33432,
+ 23622 => 33463, 23623 => 33454, 23624 => 33483, 23625 => 33484, 23626 => 33473,
+ 23627 => 33449, 23628 => 33460, 23629 => 33441, 23630 => 33450, 23631 => 33439,
+ 23632 => 33476, 23633 => 33486, 23634 => 33444, 23635 => 33505, 23636 => 33545,
+ 23637 => 33527, 23638 => 33508, 23639 => 33551, 23640 => 33543, 23641 => 33500,
+ 23642 => 33524, 23643 => 33490, 23644 => 33496, 23645 => 33548, 23646 => 33531,
+ 23647 => 33491, 23648 => 33553, 23649 => 33562, 23650 => 33542, 23651 => 33556,
+ 23652 => 33557, 23653 => 33504, 23654 => 33493, 23655 => 33564, 23656 => 33617,
+ 23657 => 33627, 23658 => 33628, 23659 => 33544, 23660 => 33682, 23661 => 33596,
+ 23662 => 33588, 23663 => 33585, 23664 => 33691, 23665 => 33630, 23666 => 33583,
+ 23667 => 33615, 23668 => 33607, 23669 => 33603, 23670 => 33631, 23671 => 33600,
+ 23672 => 33559, 23673 => 33632, 23674 => 33581, 23675 => 33594, 23676 => 33587,
+ 23677 => 33638, 23678 => 33637, 23841 => 33640, 23842 => 33563, 23843 => 33641,
+ 23844 => 33644, 23845 => 33642, 23846 => 33645, 23847 => 33646, 23848 => 33712,
+ 23849 => 33656, 23850 => 33715, 23851 => 33716, 23852 => 33696, 23853 => 33706,
+ 23854 => 33683, 23855 => 33692, 23856 => 33669, 23857 => 33660, 23858 => 33718,
+ 23859 => 33705, 23860 => 33661, 23861 => 33720, 23862 => 33659, 23863 => 33688,
+ 23864 => 33694, 23865 => 33704, 23866 => 33722, 23867 => 33724, 23868 => 33729,
+ 23869 => 33793, 23870 => 33765, 23871 => 33752, 23872 => 22535, 23873 => 33816,
+ 23874 => 33803, 23875 => 33757, 23876 => 33789, 23877 => 33750, 23878 => 33820,
+ 23879 => 33848, 23880 => 33809, 23881 => 33798, 23882 => 33748, 23883 => 33759,
+ 23884 => 33807, 23885 => 33795, 23886 => 33784, 23887 => 33785, 23888 => 33770,
+ 23889 => 33733, 23890 => 33728, 23891 => 33830, 23892 => 33776, 23893 => 33761,
+ 23894 => 33884, 23895 => 33873, 23896 => 33882, 23897 => 33881, 23898 => 33907,
+ 23899 => 33927, 23900 => 33928, 23901 => 33914, 23902 => 33929, 23903 => 33912,
+ 23904 => 33852, 23905 => 33862, 23906 => 33897, 23907 => 33910, 23908 => 33932,
+ 23909 => 33934, 23910 => 33841, 23911 => 33901, 23912 => 33985, 23913 => 33997,
+ 23914 => 34000, 23915 => 34022, 23916 => 33981, 23917 => 34003, 23918 => 33994,
+ 23919 => 33983, 23920 => 33978, 23921 => 34016, 23922 => 33953, 23923 => 33977,
+ 23924 => 33972, 23925 => 33943, 23926 => 34021, 23927 => 34019, 23928 => 34060,
+ 23929 => 29965, 23930 => 34104, 23931 => 34032, 23932 => 34105, 23933 => 34079,
+ 23934 => 34106, 24097 => 34134, 24098 => 34107, 24099 => 34047, 24100 => 34044,
+ 24101 => 34137, 24102 => 34120, 24103 => 34152, 24104 => 34148, 24105 => 34142,
+ 24106 => 34170, 24107 => 30626, 24108 => 34115, 24109 => 34162, 24110 => 34171,
+ 24111 => 34212, 24112 => 34216, 24113 => 34183, 24114 => 34191, 24115 => 34169,
+ 24116 => 34222, 24117 => 34204, 24118 => 34181, 24119 => 34233, 24120 => 34231,
+ 24121 => 34224, 24122 => 34259, 24123 => 34241, 24124 => 34268, 24125 => 34303,
+ 24126 => 34343, 24127 => 34309, 24128 => 34345, 24129 => 34326, 24130 => 34364,
+ 24131 => 24318, 24132 => 24328, 24133 => 22844, 24134 => 22849, 24135 => 32823,
+ 24136 => 22869, 24137 => 22874, 24138 => 22872, 24139 => 21263, 24140 => 23586,
+ 24141 => 23589, 24142 => 23596, 24143 => 23604, 24144 => 25164, 24145 => 25194,
+ 24146 => 25247, 24147 => 25275, 24148 => 25290, 24149 => 25306, 24150 => 25303,
+ 24151 => 25326, 24152 => 25378, 24153 => 25334, 24154 => 25401, 24155 => 25419,
+ 24156 => 25411, 24157 => 25517, 24158 => 25590, 24159 => 25457, 24160 => 25466,
+ 24161 => 25486, 24162 => 25524, 24163 => 25453, 24164 => 25516, 24165 => 25482,
+ 24166 => 25449, 24167 => 25518, 24168 => 25532, 24169 => 25586, 24170 => 25592,
+ 24171 => 25568, 24172 => 25599, 24173 => 25540, 24174 => 25566, 24175 => 25550,
+ 24176 => 25682, 24177 => 25542, 24178 => 25534, 24179 => 25669, 24180 => 25665,
+ 24181 => 25611, 24182 => 25627, 24183 => 25632, 24184 => 25612, 24185 => 25638,
+ 24186 => 25633, 24187 => 25694, 24188 => 25732, 24189 => 25709, 24190 => 25750,
+ 24353 => 25722, 24354 => 25783, 24355 => 25784, 24356 => 25753, 24357 => 25786,
+ 24358 => 25792, 24359 => 25808, 24360 => 25815, 24361 => 25828, 24362 => 25826,
+ 24363 => 25865, 24364 => 25893, 24365 => 25902, 24366 => 24331, 24367 => 24530,
+ 24368 => 29977, 24369 => 24337, 24370 => 21343, 24371 => 21489, 24372 => 21501,
+ 24373 => 21481, 24374 => 21480, 24375 => 21499, 24376 => 21522, 24377 => 21526,
+ 24378 => 21510, 24379 => 21579, 24380 => 21586, 24381 => 21587, 24382 => 21588,
+ 24383 => 21590, 24384 => 21571, 24385 => 21537, 24386 => 21591, 24387 => 21593,
+ 24388 => 21539, 24389 => 21554, 24390 => 21634, 24391 => 21652, 24392 => 21623,
+ 24393 => 21617, 24394 => 21604, 24395 => 21658, 24396 => 21659, 24397 => 21636,
+ 24398 => 21622, 24399 => 21606, 24400 => 21661, 24401 => 21712, 24402 => 21677,
+ 24403 => 21698, 24404 => 21684, 24405 => 21714, 24406 => 21671, 24407 => 21670,
+ 24408 => 21715, 24409 => 21716, 24410 => 21618, 24411 => 21667, 24412 => 21717,
+ 24413 => 21691, 24414 => 21695, 24415 => 21708, 24416 => 21721, 24417 => 21722,
+ 24418 => 21724, 24419 => 21673, 24420 => 21674, 24421 => 21668, 24422 => 21725,
+ 24423 => 21711, 24424 => 21726, 24425 => 21787, 24426 => 21735, 24427 => 21792,
+ 24428 => 21757, 24429 => 21780, 24430 => 21747, 24431 => 21794, 24432 => 21795,
+ 24433 => 21775, 24434 => 21777, 24435 => 21799, 24436 => 21802, 24437 => 21863,
+ 24438 => 21903, 24439 => 21941, 24440 => 21833, 24441 => 21869, 24442 => 21825,
+ 24443 => 21845, 24444 => 21823, 24445 => 21840, 24446 => 21820, 24609 => 21815,
+ 24610 => 21846, 24611 => 21877, 24612 => 21878, 24613 => 21879, 24614 => 21811,
+ 24615 => 21808, 24616 => 21852, 24617 => 21899, 24618 => 21970, 24619 => 21891,
+ 24620 => 21937, 24621 => 21945, 24622 => 21896, 24623 => 21889, 24624 => 21919,
+ 24625 => 21886, 24626 => 21974, 24627 => 21905, 24628 => 21883, 24629 => 21983,
+ 24630 => 21949, 24631 => 21950, 24632 => 21908, 24633 => 21913, 24634 => 21994,
+ 24635 => 22007, 24636 => 21961, 24637 => 22047, 24638 => 21969, 24639 => 21995,
+ 24640 => 21996, 24641 => 21972, 24642 => 21990, 24643 => 21981, 24644 => 21956,
+ 24645 => 21999, 24646 => 21989, 24647 => 22002, 24648 => 22003, 24649 => 21964,
+ 24650 => 21965, 24651 => 21992, 24652 => 22005, 24653 => 21988, 24654 => 36756,
+ 24655 => 22046, 24656 => 22024, 24657 => 22028, 24658 => 22017, 24659 => 22052,
+ 24660 => 22051, 24661 => 22014, 24662 => 22016, 24663 => 22055, 24664 => 22061,
+ 24665 => 22104, 24666 => 22073, 24667 => 22103, 24668 => 22060, 24669 => 22093,
+ 24670 => 22114, 24671 => 22105, 24672 => 22108, 24673 => 22092, 24674 => 22100,
+ 24675 => 22150, 24676 => 22116, 24677 => 22129, 24678 => 22123, 24679 => 22139,
+ 24680 => 22140, 24681 => 22149, 24682 => 22163, 24683 => 22191, 24684 => 22228,
+ 24685 => 22231, 24686 => 22237, 24687 => 22241, 24688 => 22261, 24689 => 22251,
+ 24690 => 22265, 24691 => 22271, 24692 => 22276, 24693 => 22282, 24694 => 22281,
+ 24695 => 22300, 24696 => 24079, 24697 => 24089, 24698 => 24084, 24699 => 24081,
+ 24700 => 24113, 24701 => 24123, 24702 => 24124, 24865 => 24119, 24866 => 24132,
+ 24867 => 24148, 24868 => 24155, 24869 => 24158, 24870 => 24161, 24871 => 23692,
+ 24872 => 23674, 24873 => 23693, 24874 => 23696, 24875 => 23702, 24876 => 23688,
+ 24877 => 23704, 24878 => 23705, 24879 => 23697, 24880 => 23706, 24881 => 23708,
+ 24882 => 23733, 24883 => 23714, 24884 => 23741, 24885 => 23724, 24886 => 23723,
+ 24887 => 23729, 24888 => 23715, 24889 => 23745, 24890 => 23735, 24891 => 23748,
+ 24892 => 23762, 24893 => 23780, 24894 => 23755, 24895 => 23781, 24896 => 23810,
+ 24897 => 23811, 24898 => 23847, 24899 => 23846, 24900 => 23854, 24901 => 23844,
+ 24902 => 23838, 24903 => 23814, 24904 => 23835, 24905 => 23896, 24906 => 23870,
+ 24907 => 23860, 24908 => 23869, 24909 => 23916, 24910 => 23899, 24911 => 23919,
+ 24912 => 23901, 24913 => 23915, 24914 => 23883, 24915 => 23882, 24916 => 23913,
+ 24917 => 23924, 24918 => 23938, 24919 => 23961, 24920 => 23965, 24921 => 35955,
+ 24922 => 23991, 24923 => 24005, 24924 => 24435, 24925 => 24439, 24926 => 24450,
+ 24927 => 24455, 24928 => 24457, 24929 => 24460, 24930 => 24469, 24931 => 24473,
+ 24932 => 24476, 24933 => 24488, 24934 => 24493, 24935 => 24501, 24936 => 24508,
+ 24937 => 34914, 24938 => 24417, 24939 => 29357, 24940 => 29360, 24941 => 29364,
+ 24942 => 29367, 24943 => 29368, 24944 => 29379, 24945 => 29377, 24946 => 29390,
+ 24947 => 29389, 24948 => 29394, 24949 => 29416, 24950 => 29423, 24951 => 29417,
+ 24952 => 29426, 24953 => 29428, 24954 => 29431, 24955 => 29441, 24956 => 29427,
+ 24957 => 29443, 24958 => 29434, 25121 => 29435, 25122 => 29463, 25123 => 29459,
+ 25124 => 29473, 25125 => 29450, 25126 => 29470, 25127 => 29469, 25128 => 29461,
+ 25129 => 29474, 25130 => 29497, 25131 => 29477, 25132 => 29484, 25133 => 29496,
+ 25134 => 29489, 25135 => 29520, 25136 => 29517, 25137 => 29527, 25138 => 29536,
+ 25139 => 29548, 25140 => 29551, 25141 => 29566, 25142 => 33307, 25143 => 22821,
+ 25144 => 39143, 25145 => 22820, 25146 => 22786, 25147 => 39267, 25148 => 39271,
+ 25149 => 39272, 25150 => 39273, 25151 => 39274, 25152 => 39275, 25153 => 39276,
+ 25154 => 39284, 25155 => 39287, 25156 => 39293, 25157 => 39296, 25158 => 39300,
+ 25159 => 39303, 25160 => 39306, 25161 => 39309, 25162 => 39312, 25163 => 39313,
+ 25164 => 39315, 25165 => 39316, 25166 => 39317, 25167 => 24192, 25168 => 24209,
+ 25169 => 24203, 25170 => 24214, 25171 => 24229, 25172 => 24224, 25173 => 24249,
+ 25174 => 24245, 25175 => 24254, 25176 => 24243, 25177 => 36179, 25178 => 24274,
+ 25179 => 24273, 25180 => 24283, 25181 => 24296, 25182 => 24298, 25183 => 33210,
+ 25184 => 24516, 25185 => 24521, 25186 => 24534, 25187 => 24527, 25188 => 24579,
+ 25189 => 24558, 25190 => 24580, 25191 => 24545, 25192 => 24548, 25193 => 24574,
+ 25194 => 24581, 25195 => 24582, 25196 => 24554, 25197 => 24557, 25198 => 24568,
+ 25199 => 24601, 25200 => 24629, 25201 => 24614, 25202 => 24603, 25203 => 24591,
+ 25204 => 24589, 25205 => 24617, 25206 => 24619, 25207 => 24586, 25208 => 24639,
+ 25209 => 24609, 25210 => 24696, 25211 => 24697, 25212 => 24699, 25213 => 24698,
+ 25214 => 24642, 25377 => 24682, 25378 => 24701, 25379 => 24726, 25380 => 24730,
+ 25381 => 24749, 25382 => 24733, 25383 => 24707, 25384 => 24722, 25385 => 24716,
+ 25386 => 24731, 25387 => 24812, 25388 => 24763, 25389 => 24753, 25390 => 24797,
+ 25391 => 24792, 25392 => 24774, 25393 => 24794, 25394 => 24756, 25395 => 24864,
+ 25396 => 24870, 25397 => 24853, 25398 => 24867, 25399 => 24820, 25400 => 24832,
+ 25401 => 24846, 25402 => 24875, 25403 => 24906, 25404 => 24949, 25405 => 25004,
+ 25406 => 24980, 25407 => 24999, 25408 => 25015, 25409 => 25044, 25410 => 25077,
+ 25411 => 24541, 25412 => 38579, 25413 => 38377, 25414 => 38379, 25415 => 38385,
+ 25416 => 38387, 25417 => 38389, 25418 => 38390, 25419 => 38396, 25420 => 38398,
+ 25421 => 38403, 25422 => 38404, 25423 => 38406, 25424 => 38408, 25425 => 38410,
+ 25426 => 38411, 25427 => 38412, 25428 => 38413, 25429 => 38415, 25430 => 38418,
+ 25431 => 38421, 25432 => 38422, 25433 => 38423, 25434 => 38425, 25435 => 38426,
+ 25436 => 20012, 25437 => 29247, 25438 => 25109, 25439 => 27701, 25440 => 27732,
+ 25441 => 27740, 25442 => 27722, 25443 => 27811, 25444 => 27781, 25445 => 27792,
+ 25446 => 27796, 25447 => 27788, 25448 => 27752, 25449 => 27753, 25450 => 27764,
+ 25451 => 27766, 25452 => 27782, 25453 => 27817, 25454 => 27856, 25455 => 27860,
+ 25456 => 27821, 25457 => 27895, 25458 => 27896, 25459 => 27889, 25460 => 27863,
+ 25461 => 27826, 25462 => 27872, 25463 => 27862, 25464 => 27898, 25465 => 27883,
+ 25466 => 27886, 25467 => 27825, 25468 => 27859, 25469 => 27887, 25470 => 27902,
+ 25633 => 27961, 25634 => 27943, 25635 => 27916, 25636 => 27971, 25637 => 27976,
+ 25638 => 27911, 25639 => 27908, 25640 => 27929, 25641 => 27918, 25642 => 27947,
+ 25643 => 27981, 25644 => 27950, 25645 => 27957, 25646 => 27930, 25647 => 27983,
+ 25648 => 27986, 25649 => 27988, 25650 => 27955, 25651 => 28049, 25652 => 28015,
+ 25653 => 28062, 25654 => 28064, 25655 => 27998, 25656 => 28051, 25657 => 28052,
+ 25658 => 27996, 25659 => 28000, 25660 => 28028, 25661 => 28003, 25662 => 28186,
+ 25663 => 28103, 25664 => 28101, 25665 => 28126, 25666 => 28174, 25667 => 28095,
+ 25668 => 28128, 25669 => 28177, 25670 => 28134, 25671 => 28125, 25672 => 28121,
+ 25673 => 28182, 25674 => 28075, 25675 => 28172, 25676 => 28078, 25677 => 28203,
+ 25678 => 28270, 25679 => 28238, 25680 => 28267, 25681 => 28338, 25682 => 28255,
+ 25683 => 28294, 25684 => 28243, 25685 => 28244, 25686 => 28210, 25687 => 28197,
+ 25688 => 28228, 25689 => 28383, 25690 => 28337, 25691 => 28312, 25692 => 28384,
+ 25693 => 28461, 25694 => 28386, 25695 => 28325, 25696 => 28327, 25697 => 28349,
+ 25698 => 28347, 25699 => 28343, 25700 => 28375, 25701 => 28340, 25702 => 28367,
+ 25703 => 28303, 25704 => 28354, 25705 => 28319, 25706 => 28514, 25707 => 28486,
+ 25708 => 28487, 25709 => 28452, 25710 => 28437, 25711 => 28409, 25712 => 28463,
+ 25713 => 28470, 25714 => 28491, 25715 => 28532, 25716 => 28458, 25717 => 28425,
+ 25718 => 28457, 25719 => 28553, 25720 => 28557, 25721 => 28556, 25722 => 28536,
+ 25723 => 28530, 25724 => 28540, 25725 => 28538, 25726 => 28625, 25889 => 28617,
+ 25890 => 28583, 25891 => 28601, 25892 => 28598, 25893 => 28610, 25894 => 28641,
+ 25895 => 28654, 25896 => 28638, 25897 => 28640, 25898 => 28655, 25899 => 28698,
+ 25900 => 28707, 25901 => 28699, 25902 => 28729, 25903 => 28725, 25904 => 28751,
+ 25905 => 28766, 25906 => 23424, 25907 => 23428, 25908 => 23445, 25909 => 23443,
+ 25910 => 23461, 25911 => 23480, 25912 => 29999, 25913 => 39582, 25914 => 25652,
+ 25915 => 23524, 25916 => 23534, 25917 => 35120, 25918 => 23536, 25919 => 36423,
+ 25920 => 35591, 25921 => 36790, 25922 => 36819, 25923 => 36821, 25924 => 36837,
+ 25925 => 36846, 25926 => 36836, 25927 => 36841, 25928 => 36838, 25929 => 36851,
+ 25930 => 36840, 25931 => 36869, 25932 => 36868, 25933 => 36875, 25934 => 36902,
+ 25935 => 36881, 25936 => 36877, 25937 => 36886, 25938 => 36897, 25939 => 36917,
+ 25940 => 36918, 25941 => 36909, 25942 => 36911, 25943 => 36932, 25944 => 36945,
+ 25945 => 36946, 25946 => 36944, 25947 => 36968, 25948 => 36952, 25949 => 36962,
+ 25950 => 36955, 25951 => 26297, 25952 => 36980, 25953 => 36989, 25954 => 36994,
+ 25955 => 37000, 25956 => 36995, 25957 => 37003, 25958 => 24400, 25959 => 24407,
+ 25960 => 24406, 25961 => 24408, 25962 => 23611, 25963 => 21675, 25964 => 23632,
+ 25965 => 23641, 25966 => 23409, 25967 => 23651, 25968 => 23654, 25969 => 32700,
+ 25970 => 24362, 25971 => 24361, 25972 => 24365, 25973 => 33396, 25974 => 24380,
+ 25975 => 39739, 25976 => 23662, 25977 => 22913, 25978 => 22915, 25979 => 22925,
+ 25980 => 22953, 25981 => 22954, 25982 => 22947, 26145 => 22935, 26146 => 22986,
+ 26147 => 22955, 26148 => 22942, 26149 => 22948, 26150 => 22994, 26151 => 22962,
+ 26152 => 22959, 26153 => 22999, 26154 => 22974, 26155 => 23045, 26156 => 23046,
+ 26157 => 23005, 26158 => 23048, 26159 => 23011, 26160 => 23000, 26161 => 23033,
+ 26162 => 23052, 26163 => 23049, 26164 => 23090, 26165 => 23092, 26166 => 23057,
+ 26167 => 23075, 26168 => 23059, 26169 => 23104, 26170 => 23143, 26171 => 23114,
+ 26172 => 23125, 26173 => 23100, 26174 => 23138, 26175 => 23157, 26176 => 33004,
+ 26177 => 23210, 26178 => 23195, 26179 => 23159, 26180 => 23162, 26181 => 23230,
+ 26182 => 23275, 26183 => 23218, 26184 => 23250, 26185 => 23252, 26186 => 23224,
+ 26187 => 23264, 26188 => 23267, 26189 => 23281, 26190 => 23254, 26191 => 23270,
+ 26192 => 23256, 26193 => 23260, 26194 => 23305, 26195 => 23319, 26196 => 23318,
+ 26197 => 23346, 26198 => 23351, 26199 => 23360, 26200 => 23573, 26201 => 23580,
+ 26202 => 23386, 26203 => 23397, 26204 => 23411, 26205 => 23377, 26206 => 23379,
+ 26207 => 23394, 26208 => 39541, 26209 => 39543, 26210 => 39544, 26211 => 39546,
+ 26212 => 39551, 26213 => 39549, 26214 => 39552, 26215 => 39553, 26216 => 39557,
+ 26217 => 39560, 26218 => 39562, 26219 => 39568, 26220 => 39570, 26221 => 39571,
+ 26222 => 39574, 26223 => 39576, 26224 => 39579, 26225 => 39580, 26226 => 39581,
+ 26227 => 39583, 26228 => 39584, 26229 => 39586, 26230 => 39587, 26231 => 39589,
+ 26232 => 39591, 26233 => 32415, 26234 => 32417, 26235 => 32419, 26236 => 32421,
+ 26237 => 32424, 26238 => 32425, 26401 => 32429, 26402 => 32432, 26403 => 32446,
+ 26404 => 32448, 26405 => 32449, 26406 => 32450, 26407 => 32457, 26408 => 32459,
+ 26409 => 32460, 26410 => 32464, 26411 => 32468, 26412 => 32471, 26413 => 32475,
+ 26414 => 32480, 26415 => 32481, 26416 => 32488, 26417 => 32491, 26418 => 32494,
+ 26419 => 32495, 26420 => 32497, 26421 => 32498, 26422 => 32525, 26423 => 32502,
+ 26424 => 32506, 26425 => 32507, 26426 => 32510, 26427 => 32513, 26428 => 32514,
+ 26429 => 32515, 26430 => 32519, 26431 => 32520, 26432 => 32523, 26433 => 32524,
+ 26434 => 32527, 26435 => 32529, 26436 => 32530, 26437 => 32535, 26438 => 32537,
+ 26439 => 32540, 26440 => 32539, 26441 => 32543, 26442 => 32545, 26443 => 32546,
+ 26444 => 32547, 26445 => 32548, 26446 => 32549, 26447 => 32550, 26448 => 32551,
+ 26449 => 32554, 26450 => 32555, 26451 => 32556, 26452 => 32557, 26453 => 32559,
+ 26454 => 32560, 26455 => 32561, 26456 => 32562, 26457 => 32563, 26458 => 32565,
+ 26459 => 24186, 26460 => 30079, 26461 => 24027, 26462 => 30014, 26463 => 37013,
+ 26464 => 29582, 26465 => 29585, 26466 => 29614, 26467 => 29602, 26468 => 29599,
+ 26469 => 29647, 26470 => 29634, 26471 => 29649, 26472 => 29623, 26473 => 29619,
+ 26474 => 29632, 26475 => 29641, 26476 => 29640, 26477 => 29669, 26478 => 29657,
+ 26479 => 39036, 26480 => 29706, 26481 => 29673, 26482 => 29671, 26483 => 29662,
+ 26484 => 29626, 26485 => 29682, 26486 => 29711, 26487 => 29738, 26488 => 29787,
+ 26489 => 29734, 26490 => 29733, 26491 => 29736, 26492 => 29744, 26493 => 29742,
+ 26494 => 29740, 26657 => 29723, 26658 => 29722, 26659 => 29761, 26660 => 29788,
+ 26661 => 29783, 26662 => 29781, 26663 => 29785, 26664 => 29815, 26665 => 29805,
+ 26666 => 29822, 26667 => 29852, 26668 => 29838, 26669 => 29824, 26670 => 29825,
+ 26671 => 29831, 26672 => 29835, 26673 => 29854, 26674 => 29864, 26675 => 29865,
+ 26676 => 29840, 26677 => 29863, 26678 => 29906, 26679 => 29882, 26680 => 38890,
+ 26681 => 38891, 26682 => 38892, 26683 => 26444, 26684 => 26451, 26685 => 26462,
+ 26686 => 26440, 26687 => 26473, 26688 => 26533, 26689 => 26503, 26690 => 26474,
+ 26691 => 26483, 26692 => 26520, 26693 => 26535, 26694 => 26485, 26695 => 26536,
+ 26696 => 26526, 26697 => 26541, 26698 => 26507, 26699 => 26487, 26700 => 26492,
+ 26701 => 26608, 26702 => 26633, 26703 => 26584, 26704 => 26634, 26705 => 26601,
+ 26706 => 26544, 26707 => 26636, 26708 => 26585, 26709 => 26549, 26710 => 26586,
+ 26711 => 26547, 26712 => 26589, 26713 => 26624, 26714 => 26563, 26715 => 26552,
+ 26716 => 26594, 26717 => 26638, 26718 => 26561, 26719 => 26621, 26720 => 26674,
+ 26721 => 26675, 26722 => 26720, 26723 => 26721, 26724 => 26702, 26725 => 26722,
+ 26726 => 26692, 26727 => 26724, 26728 => 26755, 26729 => 26653, 26730 => 26709,
+ 26731 => 26726, 26732 => 26689, 26733 => 26727, 26734 => 26688, 26735 => 26686,
+ 26736 => 26698, 26737 => 26697, 26738 => 26665, 26739 => 26805, 26740 => 26767,
+ 26741 => 26740, 26742 => 26743, 26743 => 26771, 26744 => 26731, 26745 => 26818,
+ 26746 => 26990, 26747 => 26876, 26748 => 26911, 26749 => 26912, 26750 => 26873,
+ 26913 => 26916, 26914 => 26864, 26915 => 26891, 26916 => 26881, 26917 => 26967,
+ 26918 => 26851, 26919 => 26896, 26920 => 26993, 26921 => 26937, 26922 => 26976,
+ 26923 => 26946, 26924 => 26973, 26925 => 27012, 26926 => 26987, 26927 => 27008,
+ 26928 => 27032, 26929 => 27000, 26930 => 26932, 26931 => 27084, 26932 => 27015,
+ 26933 => 27016, 26934 => 27086, 26935 => 27017, 26936 => 26982, 26937 => 26979,
+ 26938 => 27001, 26939 => 27035, 26940 => 27047, 26941 => 27067, 26942 => 27051,
+ 26943 => 27053, 26944 => 27092, 26945 => 27057, 26946 => 27073, 26947 => 27082,
+ 26948 => 27103, 26949 => 27029, 26950 => 27104, 26951 => 27021, 26952 => 27135,
+ 26953 => 27183, 26954 => 27117, 26955 => 27159, 26956 => 27160, 26957 => 27237,
+ 26958 => 27122, 26959 => 27204, 26960 => 27198, 26961 => 27296, 26962 => 27216,
+ 26963 => 27227, 26964 => 27189, 26965 => 27278, 26966 => 27257, 26967 => 27197,
+ 26968 => 27176, 26969 => 27224, 26970 => 27260, 26971 => 27281, 26972 => 27280,
+ 26973 => 27305, 26974 => 27287, 26975 => 27307, 26976 => 29495, 26977 => 29522,
+ 26978 => 27521, 26979 => 27522, 26980 => 27527, 26981 => 27524, 26982 => 27538,
+ 26983 => 27539, 26984 => 27533, 26985 => 27546, 26986 => 27547, 26987 => 27553,
+ 26988 => 27562, 26989 => 36715, 26990 => 36717, 26991 => 36721, 26992 => 36722,
+ 26993 => 36723, 26994 => 36725, 26995 => 36726, 26996 => 36728, 26997 => 36727,
+ 26998 => 36729, 26999 => 36730, 27000 => 36732, 27001 => 36734, 27002 => 36737,
+ 27003 => 36738, 27004 => 36740, 27005 => 36743, 27006 => 36747, 27169 => 36749,
+ 27170 => 36750, 27171 => 36751, 27172 => 36760, 27173 => 36762, 27174 => 36558,
+ 27175 => 25099, 27176 => 25111, 27177 => 25115, 27178 => 25119, 27179 => 25122,
+ 27180 => 25121, 27181 => 25125, 27182 => 25124, 27183 => 25132, 27184 => 33255,
+ 27185 => 29935, 27186 => 29940, 27187 => 29951, 27188 => 29967, 27189 => 29969,
+ 27190 => 29971, 27191 => 25908, 27192 => 26094, 27193 => 26095, 27194 => 26096,
+ 27195 => 26122, 27196 => 26137, 27197 => 26482, 27198 => 26115, 27199 => 26133,
+ 27200 => 26112, 27201 => 28805, 27202 => 26359, 27203 => 26141, 27204 => 26164,
+ 27205 => 26161, 27206 => 26166, 27207 => 26165, 27208 => 32774, 27209 => 26207,
+ 27210 => 26196, 27211 => 26177, 27212 => 26191, 27213 => 26198, 27214 => 26209,
+ 27215 => 26199, 27216 => 26231, 27217 => 26244, 27218 => 26252, 27219 => 26279,
+ 27220 => 26269, 27221 => 26302, 27222 => 26331, 27223 => 26332, 27224 => 26342,
+ 27225 => 26345, 27226 => 36146, 27227 => 36147, 27228 => 36150, 27229 => 36155,
+ 27230 => 36157, 27231 => 36160, 27232 => 36165, 27233 => 36166, 27234 => 36168,
+ 27235 => 36169, 27236 => 36167, 27237 => 36173, 27238 => 36181, 27239 => 36185,
+ 27240 => 35271, 27241 => 35274, 27242 => 35275, 27243 => 35276, 27244 => 35278,
+ 27245 => 35279, 27246 => 35280, 27247 => 35281, 27248 => 29294, 27249 => 29343,
+ 27250 => 29277, 27251 => 29286, 27252 => 29295, 27253 => 29310, 27254 => 29311,
+ 27255 => 29316, 27256 => 29323, 27257 => 29325, 27258 => 29327, 27259 => 29330,
+ 27260 => 25352, 27261 => 25394, 27262 => 25520, 27425 => 25663, 27426 => 25816,
+ 27427 => 32772, 27428 => 27626, 27429 => 27635, 27430 => 27645, 27431 => 27637,
+ 27432 => 27641, 27433 => 27653, 27434 => 27655, 27435 => 27654, 27436 => 27661,
+ 27437 => 27669, 27438 => 27672, 27439 => 27673, 27440 => 27674, 27441 => 27681,
+ 27442 => 27689, 27443 => 27684, 27444 => 27690, 27445 => 27698, 27446 => 25909,
+ 27447 => 25941, 27448 => 25963, 27449 => 29261, 27450 => 29266, 27451 => 29270,
+ 27452 => 29232, 27453 => 34402, 27454 => 21014, 27455 => 32927, 27456 => 32924,
+ 27457 => 32915, 27458 => 32956, 27459 => 26378, 27460 => 32957, 27461 => 32945,
+ 27462 => 32939, 27463 => 32941, 27464 => 32948, 27465 => 32951, 27466 => 32999,
+ 27467 => 33000, 27468 => 33001, 27469 => 33002, 27470 => 32987, 27471 => 32962,
+ 27472 => 32964, 27473 => 32985, 27474 => 32973, 27475 => 32983, 27476 => 26384,
+ 27477 => 32989, 27478 => 33003, 27479 => 33009, 27480 => 33012, 27481 => 33005,
+ 27482 => 33037, 27483 => 33038, 27484 => 33010, 27485 => 33020, 27486 => 26389,
+ 27487 => 33042, 27488 => 35930, 27489 => 33078, 27490 => 33054, 27491 => 33068,
+ 27492 => 33048, 27493 => 33074, 27494 => 33096, 27495 => 33100, 27496 => 33107,
+ 27497 => 33140, 27498 => 33113, 27499 => 33114, 27500 => 33137, 27501 => 33120,
+ 27502 => 33129, 27503 => 33148, 27504 => 33149, 27505 => 33133, 27506 => 33127,
+ 27507 => 22605, 27508 => 23221, 27509 => 33160, 27510 => 33154, 27511 => 33169,
+ 27512 => 28373, 27513 => 33187, 27514 => 33194, 27515 => 33228, 27516 => 26406,
+ 27517 => 33226, 27518 => 33211, 27681 => 33217, 27682 => 33190, 27683 => 27428,
+ 27684 => 27447, 27685 => 27449, 27686 => 27459, 27687 => 27462, 27688 => 27481,
+ 27689 => 39121, 27690 => 39122, 27691 => 39123, 27692 => 39125, 27693 => 39129,
+ 27694 => 39130, 27695 => 27571, 27696 => 24384, 27697 => 27586, 27698 => 35315,
+ 27699 => 26000, 27700 => 40785, 27701 => 26003, 27702 => 26044, 27703 => 26054,
+ 27704 => 26052, 27705 => 26051, 27706 => 26060, 27707 => 26062, 27708 => 26066,
+ 27709 => 26070, 27710 => 28800, 27711 => 28828, 27712 => 28822, 27713 => 28829,
+ 27714 => 28859, 27715 => 28864, 27716 => 28855, 27717 => 28843, 27718 => 28849,
+ 27719 => 28904, 27720 => 28874, 27721 => 28944, 27722 => 28947, 27723 => 28950,
+ 27724 => 28975, 27725 => 28977, 27726 => 29043, 27727 => 29020, 27728 => 29032,
+ 27729 => 28997, 27730 => 29042, 27731 => 29002, 27732 => 29048, 27733 => 29050,
+ 27734 => 29080, 27735 => 29107, 27736 => 29109, 27737 => 29096, 27738 => 29088,
+ 27739 => 29152, 27740 => 29140, 27741 => 29159, 27742 => 29177, 27743 => 29213,
+ 27744 => 29224, 27745 => 28780, 27746 => 28952, 27747 => 29030, 27748 => 29113,
+ 27749 => 25150, 27750 => 25149, 27751 => 25155, 27752 => 25160, 27753 => 25161,
+ 27754 => 31035, 27755 => 31040, 27756 => 31046, 27757 => 31049, 27758 => 31067,
+ 27759 => 31068, 27760 => 31059, 27761 => 31066, 27762 => 31074, 27763 => 31063,
+ 27764 => 31072, 27765 => 31087, 27766 => 31079, 27767 => 31098, 27768 => 31109,
+ 27769 => 31114, 27770 => 31130, 27771 => 31143, 27772 => 31155, 27773 => 24529,
+ 27774 => 24528, 27937 => 24636, 27938 => 24669, 27939 => 24666, 27940 => 24679,
+ 27941 => 24641, 27942 => 24665, 27943 => 24675, 27944 => 24747, 27945 => 24838,
+ 27946 => 24845, 27947 => 24925, 27948 => 25001, 27949 => 24989, 27950 => 25035,
+ 27951 => 25041, 27952 => 25094, 27953 => 32896, 27954 => 32895, 27955 => 27795,
+ 27956 => 27894, 27957 => 28156, 27958 => 30710, 27959 => 30712, 27960 => 30720,
+ 27961 => 30729, 27962 => 30743, 27963 => 30744, 27964 => 30737, 27965 => 26027,
+ 27966 => 30765, 27967 => 30748, 27968 => 30749, 27969 => 30777, 27970 => 30778,
+ 27971 => 30779, 27972 => 30751, 27973 => 30780, 27974 => 30757, 27975 => 30764,
+ 27976 => 30755, 27977 => 30761, 27978 => 30798, 27979 => 30829, 27980 => 30806,
+ 27981 => 30807, 27982 => 30758, 27983 => 30800, 27984 => 30791, 27985 => 30796,
+ 27986 => 30826, 27987 => 30875, 27988 => 30867, 27989 => 30874, 27990 => 30855,
+ 27991 => 30876, 27992 => 30881, 27993 => 30883, 27994 => 30898, 27995 => 30905,
+ 27996 => 30885, 27997 => 30932, 27998 => 30937, 27999 => 30921, 28000 => 30956,
+ 28001 => 30962, 28002 => 30981, 28003 => 30964, 28004 => 30995, 28005 => 31012,
+ 28006 => 31006, 28007 => 31028, 28008 => 40859, 28009 => 40697, 28010 => 40699,
+ 28011 => 40700, 28012 => 30449, 28013 => 30468, 28014 => 30477, 28015 => 30457,
+ 28016 => 30471, 28017 => 30472, 28018 => 30490, 28019 => 30498, 28020 => 30489,
+ 28021 => 30509, 28022 => 30502, 28023 => 30517, 28024 => 30520, 28025 => 30544,
+ 28026 => 30545, 28027 => 30535, 28028 => 30531, 28029 => 30554, 28030 => 30568,
+ 28193 => 30562, 28194 => 30565, 28195 => 30591, 28196 => 30605, 28197 => 30589,
+ 28198 => 30592, 28199 => 30604, 28200 => 30609, 28201 => 30623, 28202 => 30624,
+ 28203 => 30640, 28204 => 30645, 28205 => 30653, 28206 => 30010, 28207 => 30016,
+ 28208 => 30030, 28209 => 30027, 28210 => 30024, 28211 => 30043, 28212 => 30066,
+ 28213 => 30073, 28214 => 30083, 28215 => 32600, 28216 => 32609, 28217 => 32607,
+ 28218 => 35400, 28219 => 32616, 28220 => 32628, 28221 => 32625, 28222 => 32633,
+ 28223 => 32641, 28224 => 32638, 28225 => 30413, 28226 => 30437, 28227 => 34866,
+ 28228 => 38021, 28229 => 38022, 28230 => 38023, 28231 => 38027, 28232 => 38026,
+ 28233 => 38028, 28234 => 38029, 28235 => 38031, 28236 => 38032, 28237 => 38036,
+ 28238 => 38039, 28239 => 38037, 28240 => 38042, 28241 => 38043, 28242 => 38044,
+ 28243 => 38051, 28244 => 38052, 28245 => 38059, 28246 => 38058, 28247 => 38061,
+ 28248 => 38060, 28249 => 38063, 28250 => 38064, 28251 => 38066, 28252 => 38068,
+ 28253 => 38070, 28254 => 38071, 28255 => 38072, 28256 => 38073, 28257 => 38074,
+ 28258 => 38076, 28259 => 38077, 28260 => 38079, 28261 => 38084, 28262 => 38088,
+ 28263 => 38089, 28264 => 38090, 28265 => 38091, 28266 => 38092, 28267 => 38093,
+ 28268 => 38094, 28269 => 38096, 28270 => 38097, 28271 => 38098, 28272 => 38101,
+ 28273 => 38102, 28274 => 38103, 28275 => 38105, 28276 => 38104, 28277 => 38107,
+ 28278 => 38110, 28279 => 38111, 28280 => 38112, 28281 => 38114, 28282 => 38116,
+ 28283 => 38117, 28284 => 38119, 28285 => 38120, 28286 => 38122, 28449 => 38121,
+ 28450 => 38123, 28451 => 38126, 28452 => 38127, 28453 => 38131, 28454 => 38132,
+ 28455 => 38133, 28456 => 38135, 28457 => 38137, 28458 => 38140, 28459 => 38141,
+ 28460 => 38143, 28461 => 38147, 28462 => 38146, 28463 => 38150, 28464 => 38151,
+ 28465 => 38153, 28466 => 38154, 28467 => 38157, 28468 => 38158, 28469 => 38159,
+ 28470 => 38162, 28471 => 38163, 28472 => 38164, 28473 => 38165, 28474 => 38166,
+ 28475 => 38168, 28476 => 38171, 28477 => 38173, 28478 => 38174, 28479 => 38175,
+ 28480 => 38178, 28481 => 38186, 28482 => 38187, 28483 => 38185, 28484 => 38188,
+ 28485 => 38193, 28486 => 38194, 28487 => 38196, 28488 => 38198, 28489 => 38199,
+ 28490 => 38200, 28491 => 38204, 28492 => 38206, 28493 => 38207, 28494 => 38210,
+ 28495 => 38197, 28496 => 38212, 28497 => 38213, 28498 => 38214, 28499 => 38217,
+ 28500 => 38220, 28501 => 38222, 28502 => 38223, 28503 => 38226, 28504 => 38227,
+ 28505 => 38228, 28506 => 38230, 28507 => 38231, 28508 => 38232, 28509 => 38233,
+ 28510 => 38235, 28511 => 38238, 28512 => 38239, 28513 => 38237, 28514 => 38241,
+ 28515 => 38242, 28516 => 38244, 28517 => 38245, 28518 => 38246, 28519 => 38247,
+ 28520 => 38248, 28521 => 38249, 28522 => 38250, 28523 => 38251, 28524 => 38252,
+ 28525 => 38255, 28526 => 38257, 28527 => 38258, 28528 => 38259, 28529 => 38202,
+ 28530 => 30695, 28531 => 30700, 28532 => 38601, 28533 => 31189, 28534 => 31213,
+ 28535 => 31203, 28536 => 31211, 28537 => 31238, 28538 => 23879, 28539 => 31235,
+ 28540 => 31234, 28541 => 31262, 28542 => 31252, 28705 => 31289, 28706 => 31287,
+ 28707 => 31313, 28708 => 40655, 28709 => 39333, 28710 => 31344, 28711 => 30344,
+ 28712 => 30350, 28713 => 30355, 28714 => 30361, 28715 => 30372, 28716 => 29918,
+ 28717 => 29920, 28718 => 29996, 28719 => 40480, 28720 => 40482, 28721 => 40488,
+ 28722 => 40489, 28723 => 40490, 28724 => 40491, 28725 => 40492, 28726 => 40498,
+ 28727 => 40497, 28728 => 40502, 28729 => 40504, 28730 => 40503, 28731 => 40505,
+ 28732 => 40506, 28733 => 40510, 28734 => 40513, 28735 => 40514, 28736 => 40516,
+ 28737 => 40518, 28738 => 40519, 28739 => 40520, 28740 => 40521, 28741 => 40523,
+ 28742 => 40524, 28743 => 40526, 28744 => 40529, 28745 => 40533, 28746 => 40535,
+ 28747 => 40538, 28748 => 40539, 28749 => 40540, 28750 => 40542, 28751 => 40547,
+ 28752 => 40550, 28753 => 40551, 28754 => 40552, 28755 => 40553, 28756 => 40554,
+ 28757 => 40555, 28758 => 40556, 28759 => 40561, 28760 => 40557, 28761 => 40563,
+ 28762 => 30098, 28763 => 30100, 28764 => 30102, 28765 => 30112, 28766 => 30109,
+ 28767 => 30124, 28768 => 30115, 28769 => 30131, 28770 => 30132, 28771 => 30136,
+ 28772 => 30148, 28773 => 30129, 28774 => 30128, 28775 => 30147, 28776 => 30146,
+ 28777 => 30166, 28778 => 30157, 28779 => 30179, 28780 => 30184, 28781 => 30182,
+ 28782 => 30180, 28783 => 30187, 28784 => 30183, 28785 => 30211, 28786 => 30193,
+ 28787 => 30204, 28788 => 30207, 28789 => 30224, 28790 => 30208, 28791 => 30213,
+ 28792 => 30220, 28793 => 30231, 28794 => 30218, 28795 => 30245, 28796 => 30232,
+ 28797 => 30229, 28798 => 30233, 28961 => 30235, 28962 => 30268, 28963 => 30242,
+ 28964 => 30240, 28965 => 30272, 28966 => 30253, 28967 => 30256, 28968 => 30271,
+ 28969 => 30261, 28970 => 30275, 28971 => 30270, 28972 => 30259, 28973 => 30285,
+ 28974 => 30302, 28975 => 30292, 28976 => 30300, 28977 => 30294, 28978 => 30315,
+ 28979 => 30319, 28980 => 32714, 28981 => 31462, 28982 => 31352, 28983 => 31353,
+ 28984 => 31360, 28985 => 31366, 28986 => 31368, 28987 => 31381, 28988 => 31398,
+ 28989 => 31392, 28990 => 31404, 28991 => 31400, 28992 => 31405, 28993 => 31411,
+ 28994 => 34916, 28995 => 34921, 28996 => 34930, 28997 => 34941, 28998 => 34943,
+ 28999 => 34946, 29000 => 34978, 29001 => 35014, 29002 => 34999, 29003 => 35004,
+ 29004 => 35017, 29005 => 35042, 29006 => 35022, 29007 => 35043, 29008 => 35045,
+ 29009 => 35057, 29010 => 35098, 29011 => 35068, 29012 => 35048, 29013 => 35070,
+ 29014 => 35056, 29015 => 35105, 29016 => 35097, 29017 => 35091, 29018 => 35099,
+ 29019 => 35082, 29020 => 35124, 29021 => 35115, 29022 => 35126, 29023 => 35137,
+ 29024 => 35174, 29025 => 35195, 29026 => 30091, 29027 => 32997, 29028 => 30386,
+ 29029 => 30388, 29030 => 30684, 29031 => 32786, 29032 => 32788, 29033 => 32790,
+ 29034 => 32796, 29035 => 32800, 29036 => 32802, 29037 => 32805, 29038 => 32806,
+ 29039 => 32807, 29040 => 32809, 29041 => 32808, 29042 => 32817, 29043 => 32779,
+ 29044 => 32821, 29045 => 32835, 29046 => 32838, 29047 => 32845, 29048 => 32850,
+ 29049 => 32873, 29050 => 32881, 29051 => 35203, 29052 => 39032, 29053 => 39040,
+ 29054 => 39043, 29217 => 39049, 29218 => 39052, 29219 => 39053, 29220 => 39055,
+ 29221 => 39060, 29222 => 39066, 29223 => 39067, 29224 => 39070, 29225 => 39071,
+ 29226 => 39073, 29227 => 39074, 29228 => 39077, 29229 => 39078, 29230 => 34381,
+ 29231 => 34388, 29232 => 34412, 29233 => 34414, 29234 => 34431, 29235 => 34426,
+ 29236 => 34428, 29237 => 34427, 29238 => 34472, 29239 => 34445, 29240 => 34443,
+ 29241 => 34476, 29242 => 34461, 29243 => 34471, 29244 => 34467, 29245 => 34474,
+ 29246 => 34451, 29247 => 34473, 29248 => 34486, 29249 => 34500, 29250 => 34485,
+ 29251 => 34510, 29252 => 34480, 29253 => 34490, 29254 => 34481, 29255 => 34479,
+ 29256 => 34505, 29257 => 34511, 29258 => 34484, 29259 => 34537, 29260 => 34545,
+ 29261 => 34546, 29262 => 34541, 29263 => 34547, 29264 => 34512, 29265 => 34579,
+ 29266 => 34526, 29267 => 34548, 29268 => 34527, 29269 => 34520, 29270 => 34513,
+ 29271 => 34563, 29272 => 34567, 29273 => 34552, 29274 => 34568, 29275 => 34570,
+ 29276 => 34573, 29277 => 34569, 29278 => 34595, 29279 => 34619, 29280 => 34590,
+ 29281 => 34597, 29282 => 34606, 29283 => 34586, 29284 => 34622, 29285 => 34632,
+ 29286 => 34612, 29287 => 34609, 29288 => 34601, 29289 => 34615, 29290 => 34623,
+ 29291 => 34690, 29292 => 34594, 29293 => 34685, 29294 => 34686, 29295 => 34683,
+ 29296 => 34656, 29297 => 34672, 29298 => 34636, 29299 => 34670, 29300 => 34699,
+ 29301 => 34643, 29302 => 34659, 29303 => 34684, 29304 => 34660, 29305 => 34649,
+ 29306 => 34661, 29307 => 34707, 29308 => 34735, 29309 => 34728, 29310 => 34770,
+ 29473 => 34758, 29474 => 34696, 29475 => 34693, 29476 => 34733, 29477 => 34711,
+ 29478 => 34691, 29479 => 34731, 29480 => 34789, 29481 => 34732, 29482 => 34741,
+ 29483 => 34739, 29484 => 34763, 29485 => 34771, 29486 => 34749, 29487 => 34769,
+ 29488 => 34752, 29489 => 34762, 29490 => 34779, 29491 => 34794, 29492 => 34784,
+ 29493 => 34798, 29494 => 34838, 29495 => 34835, 29496 => 34814, 29497 => 34826,
+ 29498 => 34843, 29499 => 34849, 29500 => 34873, 29501 => 34876, 29502 => 32566,
+ 29503 => 32578, 29504 => 32580, 29505 => 32581, 29506 => 33296, 29507 => 31482,
+ 29508 => 31485, 29509 => 31496, 29510 => 31491, 29511 => 31492, 29512 => 31509,
+ 29513 => 31498, 29514 => 31531, 29515 => 31503, 29516 => 31559, 29517 => 31544,
+ 29518 => 31530, 29519 => 31513, 29520 => 31534, 29521 => 31537, 29522 => 31520,
+ 29523 => 31525, 29524 => 31524, 29525 => 31539, 29526 => 31550, 29527 => 31518,
+ 29528 => 31576, 29529 => 31578, 29530 => 31557, 29531 => 31605, 29532 => 31564,
+ 29533 => 31581, 29534 => 31584, 29535 => 31598, 29536 => 31611, 29537 => 31586,
+ 29538 => 31602, 29539 => 31601, 29540 => 31632, 29541 => 31654, 29542 => 31655,
+ 29543 => 31672, 29544 => 31660, 29545 => 31645, 29546 => 31656, 29547 => 31621,
+ 29548 => 31658, 29549 => 31644, 29550 => 31650, 29551 => 31659, 29552 => 31668,
+ 29553 => 31697, 29554 => 31681, 29555 => 31692, 29556 => 31709, 29557 => 31706,
+ 29558 => 31717, 29559 => 31718, 29560 => 31722, 29561 => 31756, 29562 => 31742,
+ 29563 => 31740, 29564 => 31759, 29565 => 31766, 29566 => 31755, 29729 => 31775,
+ 29730 => 31786, 29731 => 31782, 29732 => 31800, 29733 => 31809, 29734 => 31808,
+ 29735 => 33278, 29736 => 33281, 29737 => 33282, 29738 => 33284, 29739 => 33260,
+ 29740 => 34884, 29741 => 33313, 29742 => 33314, 29743 => 33315, 29744 => 33325,
+ 29745 => 33327, 29746 => 33320, 29747 => 33323, 29748 => 33336, 29749 => 33339,
+ 29750 => 33331, 29751 => 33332, 29752 => 33342, 29753 => 33348, 29754 => 33353,
+ 29755 => 33355, 29756 => 33359, 29757 => 33370, 29758 => 33375, 29759 => 33384,
+ 29760 => 34942, 29761 => 34949, 29762 => 34952, 29763 => 35032, 29764 => 35039,
+ 29765 => 35166, 29766 => 32669, 29767 => 32671, 29768 => 32679, 29769 => 32687,
+ 29770 => 32688, 29771 => 32690, 29772 => 31868, 29773 => 25929, 29774 => 31889,
+ 29775 => 31901, 29776 => 31900, 29777 => 31902, 29778 => 31906, 29779 => 31922,
+ 29780 => 31932, 29781 => 31933, 29782 => 31937, 29783 => 31943, 29784 => 31948,
+ 29785 => 31949, 29786 => 31944, 29787 => 31941, 29788 => 31959, 29789 => 31976,
+ 29790 => 33390, 29791 => 26280, 29792 => 32703, 29793 => 32718, 29794 => 32725,
+ 29795 => 32741, 29796 => 32737, 29797 => 32742, 29798 => 32745, 29799 => 32750,
+ 29800 => 32755, 29801 => 31992, 29802 => 32119, 29803 => 32166, 29804 => 32174,
+ 29805 => 32327, 29806 => 32411, 29807 => 40632, 29808 => 40628, 29809 => 36211,
+ 29810 => 36228, 29811 => 36244, 29812 => 36241, 29813 => 36273, 29814 => 36199,
+ 29815 => 36205, 29816 => 35911, 29817 => 35913, 29818 => 37194, 29819 => 37200,
+ 29820 => 37198, 29821 => 37199, 29822 => 37220, 29985 => 37218, 29986 => 37217,
+ 29987 => 37232, 29988 => 37225, 29989 => 37231, 29990 => 37245, 29991 => 37246,
+ 29992 => 37234, 29993 => 37236, 29994 => 37241, 29995 => 37260, 29996 => 37253,
+ 29997 => 37264, 29998 => 37261, 29999 => 37265, 30000 => 37282, 30001 => 37283,
+ 30002 => 37290, 30003 => 37293, 30004 => 37294, 30005 => 37295, 30006 => 37301,
+ 30007 => 37300, 30008 => 37306, 30009 => 35925, 30010 => 40574, 30011 => 36280,
+ 30012 => 36331, 30013 => 36357, 30014 => 36441, 30015 => 36457, 30016 => 36277,
+ 30017 => 36287, 30018 => 36284, 30019 => 36282, 30020 => 36292, 30021 => 36310,
+ 30022 => 36311, 30023 => 36314, 30024 => 36318, 30025 => 36302, 30026 => 36303,
+ 30027 => 36315, 30028 => 36294, 30029 => 36332, 30030 => 36343, 30031 => 36344,
+ 30032 => 36323, 30033 => 36345, 30034 => 36347, 30035 => 36324, 30036 => 36361,
+ 30037 => 36349, 30038 => 36372, 30039 => 36381, 30040 => 36383, 30041 => 36396,
+ 30042 => 36398, 30043 => 36387, 30044 => 36399, 30045 => 36410, 30046 => 36416,
+ 30047 => 36409, 30048 => 36405, 30049 => 36413, 30050 => 36401, 30051 => 36425,
+ 30052 => 36417, 30053 => 36418, 30054 => 36433, 30055 => 36434, 30056 => 36426,
+ 30057 => 36464, 30058 => 36470, 30059 => 36476, 30060 => 36463, 30061 => 36468,
+ 30062 => 36485, 30063 => 36495, 30064 => 36500, 30065 => 36496, 30066 => 36508,
+ 30067 => 36510, 30068 => 35960, 30069 => 35970, 30070 => 35978, 30071 => 35973,
+ 30072 => 35992, 30073 => 35988, 30074 => 26011, 30075 => 35286, 30076 => 35294,
+ 30077 => 35290, 30078 => 35292, 30241 => 35301, 30242 => 35307, 30243 => 35311,
+ 30244 => 35390, 30245 => 35622, 30246 => 38739, 30247 => 38633, 30248 => 38643,
+ 30249 => 38639, 30250 => 38662, 30251 => 38657, 30252 => 38664, 30253 => 38671,
+ 30254 => 38670, 30255 => 38698, 30256 => 38701, 30257 => 38704, 30258 => 38718,
+ 30259 => 40832, 30260 => 40835, 30261 => 40837, 30262 => 40838, 30263 => 40839,
+ 30264 => 40840, 30265 => 40841, 30266 => 40842, 30267 => 40844, 30268 => 40702,
+ 30269 => 40715, 30270 => 40717, 30271 => 38585, 30272 => 38588, 30273 => 38589,
+ 30274 => 38606, 30275 => 38610, 30276 => 30655, 30277 => 38624, 30278 => 37518,
+ 30279 => 37550, 30280 => 37576, 30281 => 37694, 30282 => 37738, 30283 => 37834,
+ 30284 => 37775, 30285 => 37950, 30286 => 37995, 30287 => 40063, 30288 => 40066,
+ 30289 => 40069, 30290 => 40070, 30291 => 40071, 30292 => 40072, 30293 => 31267,
+ 30294 => 40075, 30295 => 40078, 30296 => 40080, 30297 => 40081, 30298 => 40082,
+ 30299 => 40084, 30300 => 40085, 30301 => 40090, 30302 => 40091, 30303 => 40094,
+ 30304 => 40095, 30305 => 40096, 30306 => 40097, 30307 => 40098, 30308 => 40099,
+ 30309 => 40101, 30310 => 40102, 30311 => 40103, 30312 => 40104, 30313 => 40105,
+ 30314 => 40107, 30315 => 40109, 30316 => 40110, 30317 => 40112, 30318 => 40113,
+ 30319 => 40114, 30320 => 40115, 30321 => 40116, 30322 => 40117, 30323 => 40118,
+ 30324 => 40119, 30325 => 40122, 30326 => 40123, 30327 => 40124, 30328 => 40125,
+ 30329 => 40132, 30330 => 40133, 30331 => 40134, 30332 => 40135, 30333 => 40138,
+ 30334 => 40139, 30497 => 40140, 30498 => 40141, 30499 => 40142, 30500 => 40143,
+ 30501 => 40144, 30502 => 40147, 30503 => 40148, 30504 => 40149, 30505 => 40151,
+ 30506 => 40152, 30507 => 40153, 30508 => 40156, 30509 => 40157, 30510 => 40159,
+ 30511 => 40162, 30512 => 38780, 30513 => 38789, 30514 => 38801, 30515 => 38802,
+ 30516 => 38804, 30517 => 38831, 30518 => 38827, 30519 => 38819, 30520 => 38834,
+ 30521 => 38836, 30522 => 39601, 30523 => 39600, 30524 => 39607, 30525 => 40536,
+ 30526 => 39606, 30527 => 39610, 30528 => 39612, 30529 => 39617, 30530 => 39616,
+ 30531 => 39621, 30532 => 39618, 30533 => 39627, 30534 => 39628, 30535 => 39633,
+ 30536 => 39749, 30537 => 39747, 30538 => 39751, 30539 => 39753, 30540 => 39752,
+ 30541 => 39757, 30542 => 39761, 30543 => 39144, 30544 => 39181, 30545 => 39214,
+ 30546 => 39253, 30547 => 39252, 30548 => 39647, 30549 => 39649, 30550 => 39654,
+ 30551 => 39663, 30552 => 39659, 30553 => 39675, 30554 => 39661, 30555 => 39673,
+ 30556 => 39688, 30557 => 39695, 30558 => 39699, 30559 => 39711, 30560 => 39715,
+ 30561 => 40637, 30562 => 40638, 30563 => 32315, 30564 => 40578, 30565 => 40583,
+ 30566 => 40584, 30567 => 40587, 30568 => 40594, 30569 => 37846, 30570 => 40605,
+ 30571 => 40607, 30572 => 40667, 30573 => 40668, 30574 => 40669, 30575 => 40672,
+ 30576 => 40671, 30577 => 40674, 30578 => 40681, 30579 => 40679, 30580 => 40677,
+ 30581 => 40682, 30582 => 40687, 30583 => 40738, 30584 => 40748, 30585 => 40751,
+ 30586 => 40761, 30587 => 40759, 30588 => 40765, 30589 => 40766, 30590 => 40772,
+ 0 => 0 );
public function gb2utf8($gb)
{
@@ -1526,7 +1526,7 @@ class GB2312toUTF8
}
return $utf8;
}
-
+
public function u2utf8($c)
{
$str='';
diff --git a/onyx2/include/jpgraph/jpgraph_gradient.php b/onyx2/include/jpgraph/jpgraph_gradient.php
index 7afd4a2..4468f76 100644
--- a/onyx2/include/jpgraph/jpgraph_gradient.php
+++ b/onyx2/include/jpgraph/jpgraph_gradient.php
@@ -1,28 +1,28 @@
img = $img;
}
@@ -48,286 +48,287 @@ class Gradient
// PUBLIC METHODS
// Produce a gradient filled rectangle with a smooth transition between
// two colors.
- // ($xl,$yt) Top left corner
- // ($xr,$yb) Bottom right
- // $from_color Starting color in gradient
- // $to_color End color in the gradient
- // $style Which way is the gradient oriented?
+ // ($xl,$yt) Top left corner
+ // ($xr,$yb) Bottom right
+ // $from_color Starting color in gradient
+ // $to_color End color in the gradient
+ // $style Which way is the gradient oriented?
public function FilledRectangle($xl, $yt, $xr, $yb, $from_color, $to_color, $style=1)
{
+ $this->img->SetLineWeight(1);
switch ($style) {
- case GRAD_VER:
- $steps = ceil(abs($xr-$xl));
- $delta = $xr>=$xl ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
- for ($i=0, $x=$xl; $i < $steps; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yt, $x, $yb);
- $x += $delta;
- }
- break;
+ case GRAD_VER:
+ $steps = ceil(abs($xr-$xl)+1);
+ $delta = $xr>=$xl ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
+ for ($i=0, $x=$xl; $i < $steps; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yt, $x, $yb);
+ $x += $delta;
+ }
+ break;
- case GRAD_HOR:
- $steps = ceil(abs($yb-$yt));
- $delta = $yb>=$yt ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
- for ($i=0,$y=$yt; $i < $steps; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- break;
+ case GRAD_HOR:
+ $steps = ceil(abs($yb-$yt)+1);
+ $delta = $yb >= $yt ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
+ for ($i=0,$y=$yt; $i < $steps; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ break;
- case GRAD_MIDHOR:
- $steps = ceil(abs($yb-$yt)/2);
- $delta = $yb >= $yt ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
- for ($y=$yt, $i=0; $i < $steps; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- --$i;
- if (abs($yb-$yt) % 2 == 1) {
- --$steps;
- }
- for ($j=0; $j < $steps; ++$j, --$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- $this->img->Line($xl, $y, $xr, $y);
- break;
+ case GRAD_MIDHOR:
+ $steps = ceil(abs($yb-$yt)/2);
+ $delta = $yb >= $yt ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
+ for ($y=$yt, $i=0; $i < $steps; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ --$i;
+ if (abs($yb-$yt) % 2 == 1) {
+ --$steps;
+ }
+ for ($j=0; $j < $steps; ++$j, --$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ $this->img->Line($xl, $y, $xr, $y);
+ break;
- case GRAD_MIDVER:
- $steps = ceil(abs($xr-$xl)/2);
- $delta = $xr>=$xl ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
- for ($x=$xl, $i=0; $i < $steps; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- --$i;
- if (abs($xr-$xl) % 2 == 1) {
- --$steps;
- }
- for ($j=0; $j < $steps; ++$j, --$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- $this->img->Line($x, $yb, $x, $yt);
- break;
+ case GRAD_MIDVER:
+ $steps = ceil(abs($xr-$xl)/2);
+ $delta = $xr>=$xl ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
+ for ($x=$xl, $i=0; $i < $steps; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ --$i;
+ if (abs($xr-$xl) % 2 == 1) {
+ --$steps;
+ }
+ for ($j=0; $j < $steps; ++$j, --$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ $this->img->Line($x, $yb, $x, $yt);
+ break;
- case GRAD_WIDE_MIDVER:
- $diff = ceil(abs($xr-$xl));
- $steps = floor(abs($diff)/3);
- $firststep = $diff - 2*$steps ;
- $delta = $xr >= $xl ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors);
- for ($x=$xl, $i=0; $i < $firststep; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- --$i;
- $this->img->current_color = $colors[$i];
- for ($j=0; $j< $steps; ++$j) {
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
-
- for ($j=0; $j < $steps; ++$j, --$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- break;
-
- case GRAD_WIDE_MIDHOR:
- $diff = ceil(abs($yb-$yt));
- $steps = floor(abs($diff)/3);
- $firststep = $diff - 2*$steps ;
- $delta = $yb >= $yt? 1 : -1;
- $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors);
- for ($y=$yt, $i=0; $i < $firststep; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- --$i;
- $this->img->current_color = $colors[$i];
- for ($j=0; $j < $steps; ++$j) {
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- for ($j=0; $j < $steps; ++$j, --$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($xl, $y, $xr, $y);
- $y += $delta;
- }
- break;
-
- case GRAD_LEFT_REFLECTION:
- $steps1 = ceil(0.3*abs($xr-$xl));
- $delta = $xr>=$xl ? 1 : -1;
-
- $from_color = $this->img->rgb->Color($from_color);
- $adj = 1.4;
- $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2]))));
- $from_color2 = array(min(255, $from_color[0]+$m),
- min(255, $from_color[1]+$m), min(255, $from_color[2]+$m));
-
- $this->GetColArray($from_color2, $to_color, $steps1, $colors, $this->numcolors);
- $n = count($colors);
- for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- $steps2 = max(1, ceil(0.08*abs($xr-$xl)));
- $this->img->SetColor($to_color);
- for ($j=0; $j< $steps2; ++$j) {
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- $steps = abs($xr-$xl)-$steps1-$steps2;
- $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors);
- $n = count($colors);
- for ($i=0; $i < $steps && $i < $n; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- break;
-
- case GRAD_RIGHT_REFLECTION:
- $steps1 = ceil(0.7*abs($xr-$xl));
- $delta = $xr>=$xl ? 1 : -1;
-
- $this->GetColArray($from_color, $to_color, $steps1, $colors, $this->numcolors);
- $n = count($colors);
- for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- $steps2 = max(1, ceil(0.08*abs($xr-$xl)));
- $this->img->SetColor($to_color);
- for ($j=0; $j< $steps2; ++$j) {
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
-
- $from_color = $this->img->rgb->Color($from_color);
- $adj = 1.4;
- $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2]))));
- $from_color = array(min(255, $from_color[0]+$m),
- min(255, $from_color[1]+$m), min(255, $from_color[2]+$m));
-
- $steps = abs($xr-$xl)-$steps1-$steps2;
- $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors);
- $n = count($colors);
- for ($i=0; $i < $steps && $i < $n; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- break;
-
- case GRAD_CENTER:
- $steps = ceil(min(($yb-$yt)+1, ($xr-$xl)+1)/2);
- $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
- $dx = ($xr-$xl)/2;
- $dy = ($yb-$yt)/2;
- $x=$xl;$y=$yt;$x2=$xr;$y2=$yb;
- $n = count($colors);
- for ($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Rectangle($x, $y, $x2, $y2);
- }
- $this->img->Line($x, $y, $x2, $y2);
- break;
-
- case GRAD_RAISED_PANEL:
- // right to left
- $steps1 = $xr-$xl;
- $delta = $xr>=$xl ? 1 : -1;
- $this->GetColArray($to_color, $from_color, $steps1, $colors, $this->numcolors);
- $n = count($colors);
- for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
- $this->img->current_color = $colors[$i];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
-
- // left to right
- $xr -= 3;
- $xl += 3;
- $yb -= 3;
- $yt += 3;
- $steps2 = $xr-$xl;
- $delta = $xr>=$xl ? 1 : -1;
- for ($x=$xl, $j=$steps2; $j >= 0; --$j) {
- $this->img->current_color = $colors[$j];
- $this->img->Line($x, $yb, $x, $yt);
- $x += $delta;
- }
- break;
-
- case GRAD_DIAGONAL:
- // use the longer dimension to determine the required number of steps.
- // first loop draws from one corner to the mid-diagonal and the second
- // loop draws from the mid-diagonal to the opposing corner.
- if ($xr-$xl > $yb - $yt) {
- // width is greater than height -> use x-dimension for steps
- $steps = $xr-$xl;
- $delta = $xr>=$xl ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors);
- $n = count($colors);
-
- for ($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) {
+ case GRAD_WIDE_MIDVER:
+ $diff = ceil(abs($xr-$xl));
+ $steps = floor(abs($diff)/3);
+ $firststep = $diff - 2*$steps ;
+ $delta = $xr >= $xl ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors);
+ for ($x=$xl, $i=0; $i < $firststep; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ --$i;
$this->img->current_color = $colors[$i];
- $y = $yt+($i/$steps)*($yb-$yt)*$delta;
- $this->img->Line($x, $yt, $xl, $y);
- $x += $delta;
- }
+ for ($j=0; $j< $steps; ++$j) {
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
- for ($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) {
- $this->img->current_color = $colors[$steps+$i];
- $y = $yt+($i/$steps)*($yb-$yt)*$delta;
- $this->img->Line($x, $yb, $xr, $y);
- $x += $delta;
- }
- } else {
- // height is greater than width -> use y-dimension for steps
- $steps = $yb-$yt;
- $delta = $yb>=$yt ? 1 : -1;
- $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors);
- $n = count($colors);
-
- for ($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) {
+ for ($j=0; $j < $steps; ++$j, --$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ break;
+
+ case GRAD_WIDE_MIDHOR:
+ $diff = ceil(abs($yb-$yt));
+ $steps = floor(abs($diff)/3);
+ $firststep = $diff - 2*$steps ;
+ $delta = $yb >= $yt? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $firststep, $colors, $this->numcolors);
+ for ($y=$yt, $i=0; $i < $firststep; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ --$i;
$this->img->current_color = $colors[$i];
- $x = $xl+($i/$steps)*($xr-$xl)*$delta;
- $this->img->Line($x, $yt, $xl, $y);
- $y += $delta;
- }
+ for ($j=0; $j < $steps; ++$j) {
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ for ($j=0; $j < $steps; ++$j, --$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($xl, $y, $xr, $y);
+ $y += $delta;
+ }
+ break;
- for ($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) {
- $this->img->current_color = $colors[$steps+$i];
- $x = $xl+($i/$steps)*($xr-$xl)*$delta;
- $this->img->Line($x, $yb, $xr, $y);
- $x += $delta;
- }
+ case GRAD_LEFT_REFLECTION:
+ $steps1 = ceil(0.3*abs($xr-$xl));
+ $delta = $xr>=$xl ? 1 : -1;
+
+ $from_color = $this->img->rgb->Color($from_color);
+ $adj = 1.4;
+ $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2]))));
+ $from_color2 = array(min(255, $from_color[0]+$m),
+ min(255, $from_color[1]+$m), min(255, $from_color[2]+$m));
+
+ $this->GetColArray($from_color2, $to_color, $steps1, $colors, $this->numcolors);
+ $n = count($colors);
+ for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ $steps2 = max(1, ceil(0.08*abs($xr-$xl)));
+ $this->img->SetColor($to_color);
+ for ($j=0; $j< $steps2; ++$j) {
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ $steps = abs($xr-$xl)-$steps1-$steps2;
+ $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors);
+ $n = count($colors);
+ for ($i=0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ break;
+
+ case GRAD_RIGHT_REFLECTION:
+ $steps1 = ceil(0.7*abs($xr-$xl));
+ $delta = $xr>=$xl ? 1 : -1;
+
+ $this->GetColArray($from_color, $to_color, $steps1, $colors, $this->numcolors);
+ $n = count($colors);
+ for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ $steps2 = max(1, ceil(0.08*abs($xr-$xl)));
+ $this->img->SetColor($to_color);
+ for ($j=0; $j< $steps2; ++$j) {
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+
+ $from_color = $this->img->rgb->Color($from_color);
+ $adj = 1.4;
+ $m = ($adj-1.0)*(255-min(255, min($from_color[0], min($from_color[1], $from_color[2]))));
+ $from_color = array(min(255, $from_color[0]+$m),
+ min(255, $from_color[1]+$m), min(255, $from_color[2]+$m));
+
+ $steps = abs($xr-$xl)-$steps1-$steps2;
+ $this->GetColArray($to_color, $from_color, $steps, $colors, $this->numcolors);
+ $n = count($colors);
+ for ($i=0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ break;
+
+ case GRAD_CENTER:
+ $steps = ceil(min(($yb-$yt)+1, ($xr-$xl)+1)/2);
+ $this->GetColArray($from_color, $to_color, $steps, $colors, $this->numcolors);
+ $dx = ($xr-$xl)/2;
+ $dy = ($yb-$yt)/2;
+ $x=$xl;$y=$yt;$x2=$xr;$y2=$yb;
+ $n = count($colors);
+ for ($x=$xl, $i=0; $x < $xl+$dx && $y < $yt+$dy && $i < $n; ++$x, ++$y, --$x2, --$y2, ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Rectangle($x, $y, $x2, $y2);
+ }
+ $this->img->Line($x, $y, $x2, $y2);
+ break;
+
+ case GRAD_RAISED_PANEL:
+ // right to left
+ $steps1 = $xr-$xl;
+ $delta = $xr>=$xl ? 1 : -1;
+ $this->GetColArray($to_color, $from_color, $steps1, $colors, $this->numcolors);
+ $n = count($colors);
+ for ($x=$xl, $i=0; $i < $steps1 && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+
+ // left to right
+ $xr -= 3;
+ $xl += 3;
+ $yb -= 3;
+ $yt += 3;
+ $steps2 = $xr-$xl;
+ $delta = $xr>=$xl ? 1 : -1;
+ for ($x=$xl, $j=$steps2; $j >= 0; --$j) {
+ $this->img->current_color = $colors[$j];
+ $this->img->Line($x, $yb, $x, $yt);
+ $x += $delta;
+ }
+ break;
+
+ case GRAD_DIAGONAL:
+ // use the longer dimension to determine the required number of steps.
+ // first loop draws from one corner to the mid-diagonal and the second
+ // loop draws from the mid-diagonal to the opposing corner.
+ if ($xr-$xl > $yb - $yt) {
+ // width is greater than height -> use x-dimension for steps
+ $steps = $xr-$xl;
+ $delta = $xr>=$xl ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors);
+ $n = count($colors);
+
+ for ($x=$xl, $i=0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $y = $yt+($i/$steps)*($yb-$yt)*$delta;
+ $this->img->Line($x, $yt, $xl, $y);
+ $x += $delta;
+ }
+
+ for ($x=$xl, $i = 0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$steps+$i];
+ $y = $yt+($i/$steps)*($yb-$yt)*$delta;
+ $this->img->Line($x, $yb, $xr, $y);
+ $x += $delta;
+ }
+ } else {
+ // height is greater than width -> use y-dimension for steps
+ $steps = $yb-$yt;
+ $delta = $yb>=$yt ? 1 : -1;
+ $this->GetColArray($from_color, $to_color, $steps*2, $colors, $this->numcolors);
+ $n = count($colors);
+
+ for ($y=$yt, $i=0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$i];
+ $x = $xl+($i/$steps)*($xr-$xl)*$delta;
+ $this->img->Line($x, $yt, $xl, $y);
+ $y += $delta;
+ }
+
+ for ($y=$yt, $i = 0; $i < $steps && $i < $n; ++$i) {
+ $this->img->current_color = $colors[$steps+$i];
+ $x = $xl+($i/$steps)*($xr-$xl)*$delta;
+ $this->img->Line($x, $yb, $xr, $y);
+ $x += $delta;
+ }
+ }
+ break;
+
+ default:
+ JpGraphError::RaiseL(7001, $style);
+ //("Unknown gradient style (=$style).");
+ break;
}
- break;
-
- default:
- JpGraphError::RaiseL(7001, $style);
-//("Unknown gradient style (=$style).");
- break;
- }
}
// Fill a special case of a polygon with a flat bottom
@@ -340,7 +341,7 @@ class Gradient
if (count($pts) == 0) {
return;
}
-
+
$maxy=$pts[1];
$miny=$pts[1];
$n = count($pts) ;
@@ -350,7 +351,7 @@ class Gradient
$miny = min($miny, $y);
$maxy = max($maxy, $y);
}
-
+
$colors = array();
$this->GetColArray($from_color, $to_color, abs($maxy-$miny)+1, $colors, $this->numcolors);
for ($i=$miny, $idx=0; $i <= $maxy; ++$i) {
@@ -362,14 +363,14 @@ class Gradient
while ($idx < $n-1) {
$p1 = array(round($pts[$idx*2]),round($pts[$idx*2+1]));
$p2 = array(round($pts[++$idx*2]),round($pts[$idx*2+1]));
-
+
// Find the largest rectangle we can fill
$y = max($p1[1], $p2[1]) ;
for ($yy=$maxy; $yy > $y; --$yy) {
$this->img->current_color = $colmap[$yy];
$this->img->Line($p1[0], $yy, $p2[0]-1, $yy);
}
-
+
if ($p1[1] == $p2[1]) {
continue;
}
@@ -406,22 +407,23 @@ class Gradient
if ($arr_size==0) {
return;
}
+
// If color is given as text get it's corresponding r,g,b values
$from_color = $this->img->rgb->Color($from_color);
$to_color = $this->img->rgb->Color($to_color);
-
+
$rdelta=($to_color[0]-$from_color[0])/$numcols;
$gdelta=($to_color[1]-$from_color[1])/$numcols;
$bdelta=($to_color[2]-$from_color[2])/$numcols;
- $colorsperstep = $numcols/$arr_size;
- $prevcolnum = -1;
- $from_alpha = $from_color[3];
- $to_alpha = $to_color[3];
+ $colorsperstep = $numcols/$arr_size;
+ $prevcolnum = -1;
+ $from_alpha = floatval($from_color[3]);
+ $to_alpha = floatval($to_color[3]);
$adelta = ($to_alpha - $from_alpha) / $numcols ;
for ($i=0; $i < $arr_size; ++$i) {
$colnum = floor($colorsperstep*$i);
if ($colnum == $prevcolnum) {
- $colors[$i] = $colidx;
+ $colors[$i] = $colidx;
} else {
$r = floor($from_color[0] + $colnum*$rdelta);
$g = floor($from_color[1] + $colnum*$gdelta);
diff --git a/onyx2/include/jpgraph/jpgraph_iconplot.php b/onyx2/include/jpgraph/jpgraph_iconplot.php
index 4b66c21..8413741 100644
--- a/onyx2/include/jpgraph/jpgraph_iconplot.php
+++ b/onyx2/include/jpgraph/jpgraph_iconplot.php
@@ -1,11 +1,11 @@
iFile = $aFile;
$this->iX=$aX;
@@ -95,7 +95,7 @@ class IconPlot
$this->iHorAnchor=$aXAnchor;
$this->iVertAnchor=$aYAnchor;
}
-
+
public function PreStrokeAdjust($aGraph)
{
// Nothing to do ...
@@ -143,15 +143,15 @@ class IconPlot
return true;
}
- public function Stroke($aImg, $axscale, $ayscale)
+ public function Stroke($aImg, $axscale=null, $ayscale=null)
{
$this->StrokeWithScale($aImg, $axscale, $ayscale);
}
public function StrokeWithScale($aImg, $axscale, $ayscale)
{
- if ($this->iScalePosX === null ||
- $this->iScalePosY === null) {
+ if ($this->iScalePosX === null || $this->iScalePosY === null ||
+ $axscale === null || $ayscale === null) {
$this->_Stroke($aImg);
} else {
$this->_Stroke(
@@ -188,7 +188,7 @@ class IconPlot
$iconw = imagesx($gdimg);
$iconh = imagesy($gdimg);
-
+
if ($aReturnWidthHeight) {
return array(round($iconw*$this->iScale),round($iconh*$this->iScale));
}
diff --git a/onyx2/include/jpgraph/jpgraph_imgtrans.php b/onyx2/include/jpgraph/jpgraph_imgtrans.php
index 910aa82..ced8746 100644
--- a/onyx2/include/jpgraph/jpgraph_imgtrans.php
+++ b/onyx2/include/jpgraph/jpgraph_imgtrans.php
@@ -1,11 +1,11 @@
gdImg = $aGdImg;
@@ -30,7 +30,7 @@ class ImgTrans
{
- // Parameter check
+ // Parameter check
if ($aHorizonPos < 0 || $aHorizonPos > 1.0) {
JpGraphError::RaiseL(9001);
//("Value for image transformation out of bounds.\nVanishing point on horizon must be specified as a value between 0 and 1.");
@@ -46,7 +46,7 @@ class ImgTrans
} else {
$hh = $h;
}
-
+
$newgdh = imagecreatetruecolor($ww, $hh);
$crgb = new RGB($newgdh);
$fillColor = $crgb->Allocate($aFillColor);
@@ -58,7 +58,7 @@ class ImgTrans
}
$mid = round($w * $aHorizonPos);
-
+
$last=$h;
for ($y=0; $y < $h; ++$y) {
$yp = $h-$y-1;
@@ -127,7 +127,7 @@ class ImgTrans
} else {
$ww = $w;
}
-
+
$newgdh = imagecreatetruecolor($ww, $hh);
$crgb = new RGB($newgdh);
$fillColor = $crgb->Allocate($aFillColor);
diff --git a/onyx2/include/jpgraph/jpgraph_led.php b/onyx2/include/jpgraph/jpgraph_led.php
index 01e77cf..ac68d04 100644
--- a/onyx2/include/jpgraph/jpgraph_led.php
+++ b/onyx2/include/jpgraph/jpgraph_led.php
@@ -1,53 +1,16 @@
'L', Cyrilic, other symbols and special symbols for
-// simulation some latin and cyrilic chars.
-// Added: New Color schemas.
-// Deleted: Some minor bugs (StrokeNumber first parameter may be eq empty string,
-// false or null - added check see line 294;
-// change color schema check for easy maintenance: 291;
-// change check on key exist in chars array: moved from StrokeNumber
-// function to _GetLED: 251;
-//
//========================================================================
-// Samples for troubled chars: "ԡ \r \r | \r >\n< W\r"
-// W
-
-//----------------------------------------------------------------------------
-// Each character is encoded line by line with the "On"-LEDs corresponding to
-// a '1' in the bianry mask of 4 bits.
-//
-// 4-bit mask:
-//
-// 0 ____
-// 1 ___x
-// 2 __x_
-// 3 __xx
-// 4 _x__
-// 5 _x_x
-// 6 _xx_
-// 7 _xxx
-// 8 x___
-// 9 x__x
-// 10 x_x_
-// 11 x_xx
-// 12 xx__
-// 13 xx_x
-// 14 xxx_
-// 15 xxxx
-//----------------------------------------------------------------------------
-
-// Constants for color schema. See definition of iColorSchema below
+// Constants for color schema
DEFINE('LEDC_RED', 0);
DEFINE('LEDC_GREEN', 1);
DEFINE('LEDC_BLUE', 2);
@@ -64,7 +27,13 @@ DEFINE('LEDC_TEAL', 12);
DEFINE('LEDC_STEELBLUE', 13);
DEFINE('LEDC_NAVY', 14);
DEFINE('LEDC_INVERTGRAY', 15);
-// ! It correlate with two-dimensional array $iColorSchema
+
+// Check that mb_strlen() is available
+if (! function_exists('mb_strlen')) {
+ JpGraphError::RaiseL(25500);
+ //'Multibyte strings must be enabled in the PHP installation in order to run the LED module
+ // so that the function mb_strlen() is available. See PHP documentation for more information.'
+}
//========================================================================
// CLASS DigitalLED74
@@ -78,156 +47,171 @@ class DigitalLED74
private $iLED_Y=7;
// fg-up, fg-down, bg
private $iColorSchema = array(
- LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0
- LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1
- LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2
- LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3
- LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'),
- LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'),
- LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'),
- LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'),
- LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'),
- LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'),
- LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'),
- LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'),
- LEDC_TEAL => array('teal','teal:0.7','teal:0.5'),
- LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'),
- LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14
- LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15
- );
+ LEDC_RED => array('red','darkred:0.9','red:0.3'),// 0
+ LEDC_GREEN => array('green','darkgreen','green:0.3'),// 1
+ LEDC_BLUE => array('lightblue:0.9','darkblue:0.85','darkblue:0.7'),// 2
+ LEDC_YELLOW => array('yellow','yellow:0.4','yellow:0.3'),// 3
+ LEDC_GRAY => array('gray:1.4','darkgray:0.85','darkgray:0.7'),
+ LEDC_CHOCOLATE => array('chocolate','chocolate:0.7','chocolate:0.5'),
+ LEDC_PERU => array('peru:0.95','peru:0.6','peru:0.5'),
+ LEDC_GOLDENROD => array('goldenrod','goldenrod:0.6','goldenrod:0.5'),
+ LEDC_KHAKI => array('khaki:0.7','khaki:0.4','khaki:0.3'),
+ LEDC_OLIVE => array('#808000','#808000:0.7','#808000:0.6'),
+ LEDC_LIMEGREEN => array('limegreen:0.9','limegreen:0.5','limegreen:0.4'),
+ LEDC_FORESTGREEN => array('forestgreen','forestgreen:0.7','forestgreen:0.5'),
+ LEDC_TEAL => array('teal','teal:0.7','teal:0.5'),
+ LEDC_STEELBLUE => array('steelblue','steelblue:0.65','steelblue:0.5'),
+ LEDC_NAVY => array('navy:1.3','navy:0.95','navy:0.8'),//14
+ LEDC_INVERTGRAY => array('darkgray','lightgray:1.5','white')//15
+ );
+ /* Each line of the character is encoded as a 4 bit value
+ 0 ____
+ 1 ___x
+ 2 __x_
+ 3 __xx
+ 4 _x__
+ 5 _x_x
+ 6 _xx_
+ 7 _xxx
+ 8 x___
+ 9 x__x
+ 10 x_x_
+ 11 x_xx
+ 12 xx__
+ 13 xx_x
+ 14 xxx_
+ 15 xxxx
+ */
+
private $iLEDSpec = array(
- 0 => array(6,9,11,15,13,9,6),
- //0 => array(6,9,9,9,9,9,6),
- //0 => array(15,9,9,9,9,9,15),
- 1 => array(2,6,10,2,2,2,2),
- 2 => array(6,9,1,2,4,8,15),
- 3 => array(6,9,1,6,1,9,6),
- 4 => array(1,3,5,9,15,1,1),
- 5 => array(15,8,8,14,1,9,6),
- 6 => array(6,8,8,14,9,9,6),
- 7 => array(15,1,1,2,4,4,4),
- 8 => array(6,9,9,6,9,9,6),
- 9 => array(6,9,9,7,1,1,6),
- '!' => array(4,4,4,4,4,0,4),
- '?' => array(6,9,1,2,2,0,2),
- '#' => array(0,9,15,9,15,9,0),
- '@' => array(6,9,11,11,10,9,6),
- '-' => array(0,0,0,15,0,0,0),
- '_' => array(0,0,0,0,0,0,15),
- '=' => array(0,0,15,0,15,0,0),
- '+' => array(0,0,4,14,4,0,0),
- '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus ''
- ',' => array(0,0,0,0,0,12,4),
- '.' => array(0,0,0,0,0,12,12),
- ':' => array(12,12,0,0,0,12,12),
- ';' => array(12,12,0,0,0,12,4),
- '[' => array(3,2,2,2,2,2,3),
- ']' => array(12,4,4,4,4,4,12),
- '(' => array(1,2,2,2,2,2,1),
- ')' => array(8,4,4,4,4,4,8),
- '{' => array(3,2,2,6,2,2,3),
- '}' => array(12,4,4,6,4,4,12),
- '<' => array(1,2,4,8,4,2,1),
- '>' => array(8,4,2,1,2,4,8),
- '*' => array(9,6,15,6,9,0,0),
- '"' => array(10,10,0,0,0,0,0),
- '\'' => array(4,4,0,0,0,0,0),
- '`' => array(4,2,0,0,0,0,0),
- '~' => array(13,11,0,0,0,0,0),
- '^' => array(4,10,0,0,0,0,0),
- '\\' => array(8,8,4,6,2,1,1),
- '/' => array(1,1,2,6,4,8,8),
- '%' => array(1,9,2,6,4,9,8),
- '&' => array(0,4,10,4,11,10,5),
- '$' => array(2,7,8,6,1,14,4),
- ' ' => array(0,0,0,0,0,0,0),
- '' => array(0,0,6,6,0,0,0), //149
- '' => array(14,10,14,0,0,0,0), //176
- '' => array(4,4,14,4,4,4,4), //134
- '' => array(4,4,14,4,14,4,4), //135
- '' => array(0,4,14,4,0,14,0), //177
- '' => array(0,4,2,15,2,4,0), //137 show right arrow
- '' => array(0,2,4,15,4,2,0), //156 show left arrow
- '' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus ''
- "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus ''
- "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus '','' ,''
- "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus ''
- "" => array(10,5,10,5,10,5,10), //chess
- "" => array(15,0,15,0,15,0,15), //4 horizontal lines
-// latin
- 'A' => array(6,9,9,15,9,9,9),
- 'B' => array(14,9,9,14,9,9,14),
- 'C' => array(6,9,8,8,8,9,6),
- 'D' => array(14,9,9,9,9,9,14),
- 'E' => array(15,8,8,14,8,8,15),
- 'F' => array(15,8,8,14,8,8,8),
- 'G' => array(6,9,8,8,11,9,6),
- 'H' => array(9,9,9,15,9,9,9),
- 'I' => array(14,4,4,4,4,4,14),
- 'J' => array(15,1,1,1,1,9,6),
- 'K' => array(8,9,10,12,12,10,9),
- 'L' => array(8,8,8,8,8,8,15),
- 'M' => array(8,13,10,8,8,8,8),// need to add \r
- 'N' => array(9,9,13,11,9,9,9),
- //'O' => array(0,6,9,9,9,9,6),
- 'O' => array(6,9,9,9,9,9,6),
- 'P' => array(14,9,9,14,8,8,8),
- 'Q' => array(6,9,9,9,13,11,6),
- 'R' => array(14,9,9,14,12,10,9),
- 'S' => array(6,9,8,6,1,9,6),
- 'T' => array(14,4,4,4,4,4,4),
- 'U' => array(9,9,9,9,9,9,6),
- 'V' => array(0,0,0,10,10,10,4),
- 'W' => array(8,8,8,8,10,13,8),// need to add \r
- 'X' => array(9,9,6,6,6,9,9),
- //'Y' => array(9,9,9,9,6,6,6),
- 'Y' => array(10,10,10,10,4,4,4),
- 'Z' => array(15,1,2,6,4,8,15),
-// russian cp1251
- '' => array(6,9,9,15,9,9,9),
- '' => array(14,8,8,14,9,9,14),
- '' => array(14,9,9,14,9,9,14),
- '' => array(15,8,8,8,8,8,8),
- '' => array(14,9,9,9,9,9,14),
- '' => array(15,8,8,14,8,8,15),
- '' => array(6,15,8,14,8,8,15),
- // is combine: >\n<
- '' => array(6,9,1,2,1,9,6),
- '' => array(9,9,9,11,13,9,9),
- '' => array(13,9,9,11,13,9,9),
- '' => array(9,10,12,10,9,9,9),
- '' => array(7,9,9,9,9,9,9),
- '' => array(8,13,10,8,8,8,8),// need to add \r
- '' => array(9,9,9,15,9,9,9),
- '' => array(6,9,9,9,9,9,6),
- '' => array(15,9,9,9,9,9,9),
- '' => array(14,9,9,14,8,8,8),
- '' => array(6,9,8,8,8,9,6),
- '' => array(14,4,4,4,4,4,4),
- '' => array(9,9,9,7,1,9,6),
- '' => array(2,7,10,10,7,2,2),// need to add
- '' => array(9,9,6,6,6,9,9),
- '' => array(10,10,10,10,10,15,1),
- '' => array(9,9,9,7,1,1,1),
- '' => array(10,10,10,10,10,10,15),// \r
- '' => array(10,10,10,10,10,15,0),// need to add \r
- '' => array(12,4,4,6,5,5,6),
- '' => array(8,8,8,14,9,9,14),// need to add |
- '' => array(8,8,8,14,9,9,14),
- '' => array(6,9,1,7,1,9,6),
- '' => array(2,2,2,3,2,2,2),// need to add O
- '' => array(7,9,9,7,3,5,9)
- );
+ 0 => array(6,9,11,15,13,9,6),
+ 1 => array(2,6,10,2,2,2,2),
+ 2 => array(6,9,1,2,4,8,15),
+ 3 => array(6,9,1,6,1,9,6),
+ 4 => array(1,3,5,9,15,1,1),
+ 5 => array(15,8,8,14,1,9,6),
+ 6 => array(6,8,8,14,9,9,6),
+ 7 => array(15,1,1,2,4,4,4),
+ 8 => array(6,9,9,6,9,9,6),
+ 9 => array(6,9,9,7,1,1,6),
+ '!' => array(4,4,4,4,4,0,4),
+ '?' => array(6,9,1,2,2,0,2),
+ '#' => array(0,9,15,9,15,9,0),
+ '@' => array(6,9,11,11,10,9,6),
+ '-' => array(0,0,0,15,0,0,0),
+ '_' => array(0,0,0,0,0,0,15),
+ '=' => array(0,0,15,0,15,0,0),
+ '+' => array(0,0,4,14,4,0,0),
+ '|' => array(4,4,4,4,4,4,4), //vertical line, used for simulate rus 'Ы'
+ ',' => array(0,0,0,0,0,12,4),
+ '.' => array(0,0,0,0,0,12,12),
+ ':' => array(12,12,0,0,0,12,12),
+ ';' => array(12,12,0,0,0,12,4),
+ '[' => array(3,2,2,2,2,2,3),
+ ']' => array(12,4,4,4,4,4,12),
+ '(' => array(1,2,2,2,2,2,1),
+ ')' => array(8,4,4,4,4,4,8),
+ '{' => array(3,2,2,6,2,2,3),
+ '}' => array(12,4,4,6,4,4,12),
+ '<' => array(1,2,4,8,4,2,1),
+ '>' => array(8,4,2,1,2,4,8),
+ '*' => array(9,6,15,6,9,0,0),
+ '"' => array(10,10,0,0,0,0,0),
+ '\'' => array(4,4,0,0,0,0,0),
+ '`' => array(4,2,0,0,0,0,0),
+ '~' => array(13,11,0,0,0,0,0),
+ '^' => array(4,10,0,0,0,0,0),
+ '\\' => array(8,8,4,6,2,1,1),
+ '/' => array(1,1,2,6,4,8,8),
+ '%' => array(1,9,2,6,4,9,8),
+ '&' => array(0,4,10,4,11,10,5),
+ '$' => array(2,7,8,6,1,14,4),
+ ' ' => array(0,0,0,0,0,0,0),
+ '•' => array(0,0,6,6,0,0,0), //149
+ '°' => array(14,10,14,0,0,0,0), //176
+ '†' => array(4,4,14,4,4,4,4), //134
+ '‡' => array(4,4,14,4,14,4,4), //135
+ '±' => array(0,4,14,4,0,14,0), //177
+ '‰' => array(0,4,2,15,2,4,0), //137 show right arrow
+ '™' => array(0,2,4,15,4,2,0), //156 show left arrow
+ 'Ў' => array(0,0,8,8,0,0,0), //159 show small hi-stick - that need for simulate rus 'Ф'
+ "\t" => array(8,8,8,0,0,0,0), //show hi-stick - that need for simulate rus 'У'
+ "\r" => array(8,8,8,8,8,8,8), //vertical line - that need for simulate 'M', 'W' and rus 'М','Ш' ,'Щ'
+ "\n" => array(15,15,15,15,15,15,15), //fill up - that need for simulate rus 'Ж'
+ "Ґ" => array(10,5,10,5,10,5,10), //chess
+ "µ" => array(15,0,15,0,15,0,15), //4 horizontal lines
+ // latin
+ 'A' => array(6,9,9,15,9,9,9),
+ 'B' => array(14,9,9,14,9,9,14),
+ 'C' => array(6,9,8,8,8,9,6),
+ 'D' => array(14,9,9,9,9,9,14),
+ 'E' => array(15,8,8,14,8,8,15),
+ 'F' => array(15,8,8,14,8,8,8),
+ 'G' => array(6,9,8,8,11,9,6),
+ 'H' => array(9,9,9,15,9,9,9),
+ 'I' => array(14,4,4,4,4,4,14),
+ 'J' => array(15,1,1,1,1,9,6),
+ 'K' => array(8,9,10,12,12,10,9),
+ 'L' => array(8,8,8,8,8,8,15),
+ 'M' => array(8,13,10,8,8,8,8),// need to add \r
+ 'N' => array(9,9,13,11,9,9,9),
+ 'O' => array(6,9,9,9,9,9,6),
+ 'P' => array(14,9,9,14,8,8,8),
+ 'Q' => array(6,9,9,9,13,11,6),
+ 'R' => array(14,9,9,14,12,10,9),
+ 'S' => array(6,9,8,6,1,9,6),
+ 'T' => array(14,4,4,4,4,4,4),
+ 'U' => array(9,9,9,9,9,9,6),
+ 'V' => array(0,0,0,10,10,10,4),
+ 'W' => array(8,8,8,8,10,13,8),// need to add \r
+ 'X' => array(9,9,6,6,6,9,9),
+ 'Y' => array(10,10,10,10,4,4,4),
+ 'Z' => array(15,1,2,6,4,8,15),
+ // russian utf-8
+ 'А' => array(6,9,9,15,9,9,9),
+ 'Б' => array(14,8,8,14,9,9,14),
+ 'В' => array(14,9,9,14,9,9,14),
+ 'Г' => array(15,8,8,8,8,8,8),
+ 'Д' => array(14,9,9,9,9,9,14),
+ 'Е' => array(15,8,8,14,8,8,15),
+ 'Ё' => array(6,15,8,14,8,8,15),
+ //Ж is combine: >\n<
+ 'З' => array(6,9,1,2,1,9,6),
+ 'И' => array(9,9,9,11,13,9,9),
+ 'Й' => array(13,9,9,11,13,9,9),
+ 'К' => array(9,10,12,10,9,9,9),
+ 'Л' => array(7,9,9,9,9,9,9),
+ 'М' => array(8,13,10,8,8,8,8),// need to add \r
+ 'Н' => array(9,9,9,15,9,9,9),
+ 'О' => array(6,9,9,9,9,9,6),
+ 'П' => array(15,9,9,9,9,9,9),
+ 'Р' => array(14,9,9,14,8,8,8),
+ 'С' => array(6,9,8,8,8,9,6),
+ 'Т' => array(14,4,4,4,4,4,4),
+ 'У' => array(9,9,9,7,1,9,6),
+ 'Ф' => array(2,7,10,10,7,2,2),// need to add Ў
+ 'Х' => array(9,9,6,6,6,9,9),
+ 'Ц' => array(10,10,10,10,10,15,1),
+ 'Ч' => array(9,9,9,7,1,1,1),
+ 'Ш' => array(10,10,10,10,10,10,15),// \r
+ 'Щ' => array(10,10,10,10,10,15,0),// need to add \r
+ 'Ъ' => array(12,4,4,6,5,5,6),
+ 'Ы' => array(8,8,8,14,9,9,14),// need to add |
+ 'Ь' => array(8,8,8,14,9,9,14),
+ 'Э' => array(6,9,1,7,1,9,6),
+ 'Ю' => array(2,2,2,3,2,2,2),// need to add O
+ 'Я' => array(7,9,9,7,3,5,9)
+ );
private $iSuperSampling = 3;
private $iMarg = 1;
private $iRad = 4;
-
- public function DigitalLED74($aRadius = 2, $aMargin= 0.6)
+
+ public function __construct($aRadius = 2, $aMargin= 0.6)
{
$this->iRad = $aRadius;
$this->iMarg = $aMargin;
}
-
+
public function SetSupersampling($aSuperSampling = 2)
{
$this->iSuperSampling = $aSuperSampling;
@@ -243,7 +227,7 @@ class DigitalLED74
// Margin in between "Led" dots
$marg = $this->iMarg * $this->iSuperSampling;
-
+
$swidth = $width*$this->iSuperSampling;
$sheight = $height*$this->iSuperSampling;
@@ -281,20 +265,27 @@ class DigitalLED74
return $img;
}
- public function StrokeNumber($aValStr, $aColor = 0)
+
+ public function Stroke($aValStr, $aColor = 0, $aFileName = '')
+ {
+ $this->StrokeNumber($aValStr, $aColor, $aFileName);
+ }
+
+
+ public function StrokeNumber($aValStr, $aColor = 0, $aFileName = '')
{
if ($aColor < 0 || $aColor >= sizeof($this->iColorSchema)) {
$aColor = 0;
}
- if (($n = strlen($aValStr)) == 0) {
+ if (($n = mb_strlen($aValStr, 'utf8')) == 0) {
$aValStr = ' ';
$n = 1;
}
for ($i = 0; $i < $n; ++$i) {
- $d = substr($aValStr, $i, 1);
- if ($d >= '0' && $d <= '9') {
+ $d = mb_substr($aValStr, $i, 1, 'utf8');
+ if (ctype_digit($d)) {
$d = (int)$d;
} else {
$d = strtoupper($d);
@@ -311,7 +302,11 @@ class DigitalLED74
$number_img->Copy($digit_img[$i]->img, $i*$w, 0, 0, 0, $w, $h, $w, $h);
}
- $number_img->Headers();
- $number_img->Stream();
+ if ($aFileName != '') {
+ $number_img->Stream($aFileName);
+ } else {
+ $number_img->Headers();
+ $number_img->Stream();
+ }
}
}
diff --git a/onyx2/include/jpgraph/jpgraph_legend.inc.php b/onyx2/include/jpgraph/jpgraph_legend.inc.php
new file mode 100755
index 0000000..09ba7da
--- /dev/null
+++ b/onyx2/include/jpgraph/jpgraph_legend.inc.php
@@ -0,0 +1,557 @@
+hide=$aHide;
+ }
+
+ public function SetHColMargin($aXMarg)
+ {
+ $this->xmargin = $aXMarg;
+ }
+
+ public function SetVColMargin($aSpacing)
+ {
+ $this->ylinespacing = $aSpacing ;
+ }
+
+ public function SetLeftMargin($aXMarg)
+ {
+ $this->xlmargin = $aXMarg;
+ }
+
+ // Synonym
+ public function SetLineSpacing($aSpacing)
+ {
+ $this->ylinespacing = $aSpacing ;
+ }
+
+ public function SetShadow($aShow='gray', $aWidth=4)
+ {
+ if (is_string($aShow)) {
+ $this->shadow_color = $aShow;
+ $this->shadow=true;
+ } else {
+ $this->shadow = $aShow;
+ }
+ $this->shadow_width = $aWidth;
+ }
+
+ public function SetMarkAbsSize($aSize)
+ {
+ $this->mark_abs_vsize = $aSize ;
+ $this->mark_abs_hsize = $aSize ;
+ }
+
+ public function SetMarkAbsVSize($aSize)
+ {
+ $this->mark_abs_vsize = $aSize ;
+ }
+
+ public function SetMarkAbsHSize($aSize)
+ {
+ $this->mark_abs_hsize = $aSize ;
+ }
+
+ public function SetLineWeight($aWeight)
+ {
+ $this->weight = $aWeight;
+ }
+
+ public function SetFrameWeight($aWeight)
+ {
+ $this->frameweight = $aWeight;
+ }
+
+ public function SetLayout($aDirection=LEGEND_VERT)
+ {
+ $this->layout_n = $aDirection==LEGEND_VERT ? 1 : 99 ;
+ }
+
+ public function SetColumns($aCols)
+ {
+ $this->layout_n = $aCols ;
+ }
+
+ public function SetReverse($f=true)
+ {
+ $this->reverse = $f ;
+ }
+
+ // Set color on frame around box
+ public function SetColor($aFontColor, $aColor='black')
+ {
+ $this->font_color=$aFontColor;
+ $this->color=$aColor;
+ }
+
+ public function SetFont($aFamily, $aStyle=FS_NORMAL, $aSize=10)
+ {
+ $this->font_family = $aFamily;
+ $this->font_style = $aStyle;
+ $this->font_size = $aSize;
+ }
+
+ public function SetPos($aX, $aY, $aHAlign='right', $aVAlign='top')
+ {
+ $this->Pos($aX, $aY, $aHAlign, $aVAlign);
+ }
+
+ public function SetAbsPos($aX, $aY, $aHAlign='right', $aVAlign='top')
+ {
+ $this->xabspos=$aX;
+ $this->yabspos=$aY;
+ $this->halign=$aHAlign;
+ $this->valign=$aVAlign;
+ }
+
+ public function Pos($aX, $aY, $aHAlign='right', $aVAlign='top')
+ {
+ if (!($aX<1 && $aY<1)) {
+ JpGraphError::RaiseL(25120);//(" Position for legend must be given as percentage in range 0-1");
+ }
+ $this->xpos=$aX;
+ $this->ypos=$aY;
+ $this->halign=$aHAlign;
+ $this->valign=$aVAlign;
+ }
+
+ public function SetFillColor($aColor)
+ {
+ $this->fill_color=$aColor;
+ }
+
+ public function Clear()
+ {
+ $this->txtcol = array();
+ }
+
+ public function Add($aTxt, $aColor, $aPlotmark='', $aLinestyle=0, $csimtarget='', $csimalt='', $csimwintarget='')
+ {
+ $this->txtcol[]=array($aTxt,$aColor,$aPlotmark,$aLinestyle,$csimtarget,$csimalt,$csimwintarget);
+ }
+
+ public function GetCSIMAreas()
+ {
+ return $this->csimareas;
+ }
+
+ public function SetBackgroundGradient($aFrom='navy', $aTo='silver', $aGradType=2)
+ {
+ $this->bkg_gradtype=$aGradType;
+ $this->bkg_gradfrom = $aFrom;
+ $this->bkg_gradto = $aTo;
+ }
+
+ public function HasItems()
+ {
+ return (boolean)(count($this->txtcol));
+ }
+
+ public function Stroke($aImg)
+ {
+ // Constant
+ $fillBoxFrameWeight=1;
+
+ if ($this->hide) {
+ return;
+ }
+
+ $aImg->SetFont($this->font_family, $this->font_style, $this->font_size);
+
+ if ($this->reverse) {
+ $this->txtcol = array_reverse($this->txtcol);
+ }
+
+ $n=count($this->txtcol);
+ if ($n == 0) {
+ return;
+ }
+
+ // Find out the max width and height of each column to be able
+ // to size the legend box.
+ $numcolumns = ($n > $this->layout_n ? $this->layout_n : $n);
+ for ($i=0; $i < $numcolumns; ++$i) {
+ $colwidth[$i] = $aImg->GetTextWidth($this->txtcol[$i][0]) +
+ 2*$this->xmargin + 2*$this->mark_abs_hsize;
+ $colheight[$i] = 0;
+ }
+
+ // Find our maximum height in each row
+ $rows = 0 ;
+ $rowheight[0] = 0;
+ for ($i=0; $i < $n; ++$i) {
+ $h = max($this->mark_abs_vsize, $aImg->GetTextHeight($this->txtcol[$i][0]))+$this->ylinespacing;
+
+ // Makes sure we always have a minimum of 1/4 (1/2 on each side) of the mark as space
+ // between two vertical legend entries
+ //$h = round(max($h,$this->mark_abs_vsize+$this->ymargin));
+ //echo "Textheight #$i: tetxheight=".$aImg->GetTextHeight($this->txtcol[$i][0]).', ';
+ //echo "h=$h ({$this->mark_abs_vsize},{$this->ymargin})
";
+ if ($i % $numcolumns == 0) {
+ $rows++;
+ $rowheight[$rows-1] = 0;
+ }
+ $rowheight[$rows-1] = max($rowheight[$rows-1], $h)+1;
+ }
+
+ $abs_height = 0;
+ for ($i=0; $i < $rows; ++$i) {
+ $abs_height += $rowheight[$i] ;
+ }
+
+ // Make sure that the height is at least as high as mark size + ymargin
+ $abs_height = max($abs_height, $this->mark_abs_vsize);
+ $abs_height += $this->ybottom_margin;
+
+ // Find out the maximum width in each column
+ for ($i=$numcolumns; $i < $n; ++$i) {
+ $colwidth[$i % $numcolumns] = max(
+ $aImg->GetTextWidth($this->txtcol[$i][0])+2*$this->xmargin+2*$this->mark_abs_hsize,
+ $colwidth[$i % $numcolumns]
+ );
+ }
+
+ // Get the total width
+ $mtw = 0;
+ for ($i=0; $i < $numcolumns; ++$i) {
+ $mtw += $colwidth[$i] ;
+ }
+
+ // remove the last rows interpace margin (since there is no next row)
+ $abs_height -= $this->ylinespacing;
+
+
+ // Find out maximum width we need for legend box
+ $abs_width = $mtw+$this->xlmargin+($numcolumns-1)*$this->mark_abs_hsize;
+
+ if ($this->xabspos === -1 && $this->yabspos === -1) {
+ $this->xabspos = $this->xpos*$aImg->width ;
+ $this->yabspos = $this->ypos*$aImg->height ;
+ }
+
+ // Positioning of the legend box
+ if ($this->halign == 'left') {
+ $xp = $this->xabspos;
+ } elseif ($this->halign == 'center') {
+ $xp = $this->xabspos - $abs_width/2;
+ } else {
+ $xp = $aImg->width - $this->xabspos - $abs_width;
+ }
+
+ $yp=$this->yabspos;
+ if ($this->valign == 'center') {
+ $yp-=$abs_height/2;
+ } elseif ($this->valign == 'bottom') {
+ $yp-=$abs_height;
+ }
+
+ // Stroke legend box
+ $aImg->SetColor($this->color);
+ $aImg->SetLineWeight($this->frameweight);
+ $aImg->SetLineStyle('solid');
+
+ if ($this->shadow) {
+ $aImg->ShadowRectangle(
+ $xp,
+ $yp,
+ $xp+$abs_width+$this->shadow_width+2,
+ $yp+$abs_height+$this->shadow_width+2,
+ $this->fill_color,
+ $this->shadow_width+2,
+ $this->shadow_color
+ );
+ } else {
+ $aImg->SetColor($this->fill_color);
+ $aImg->FilledRectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height);
+ $aImg->SetColor($this->color);
+ $aImg->Rectangle($xp, $yp, $xp+$abs_width, $yp+$abs_height);
+ }
+
+ if ($this->bkg_gradtype >= 0) {
+ $grad = new Gradient($aImg);
+ $grad->FilledRectangle(
+ $xp+1,
+ $yp+1,
+ $xp+$abs_width-3,
+ $yp+$abs_height-3,
+ $this->bkg_gradfrom,
+ $this->bkg_gradto,
+ $this->bkg_gradtype
+ );
+ }
+
+ // x1,y1 is the position for the legend marker + text
+ // The vertical position is the baseline position for the text
+ // and every marker is adjusted acording to that.
+
+ // For multiline texts this get more complicated.
+
+ $x1 = $xp + $this->xlmargin;
+ $y1 = $yp + $rowheight[0] - $this->ylinespacing + 2 ; // The ymargin is included in rowheight
+
+ // Now, y1 is the bottom vertical position of the first legend, i.e if
+ // the legend has multiple lines it is the bottom line.
+
+ $grad = new Gradient($aImg);
+ $patternFactory = null;
+
+ // Now stroke each legend in turn
+ // Each plot has added the following information to the legend
+ // p[0] = Legend text
+ // p[1] = Color,
+ // p[2] = For markers a reference to the PlotMark object
+ // p[3] = For lines the line style, for gradient the negative gradient style
+ // p[4] = CSIM target
+ // p[5] = CSIM Alt text
+ $i = 1 ;
+ $row = 0;
+ foreach ($this->txtcol as $p) {
+
+ // STROKE DEBUG BOX
+ if (_JPG_DEBUG) {
+ $aImg->SetLineWeight(1);
+ $aImg->SetColor('red');
+ $aImg->SetLineStyle('solid');
+ $aImg->Rectangle($x1, $y1, $xp+$abs_width-1, $y1-$rowheight[$row]);
+ }
+
+ $aImg->SetLineWeight($this->weight);
+ $x1 = round($x1)+1; // We add one to not collide with the border
+ $y1=round($y1);
+
+ // This is the center offset up from the baseline which is
+ // considered the "center" of the marks. This gets slightly complicated since
+ // we need to consider if the text is a multiline paragraph or if it is only
+ // a single line. The reason is that for single line the y1 corresponds to the baseline
+ // and that is fine. However for a multiline paragraph there is no single baseline
+ // and in that case the y1 corresponds to the lowest y for the bounding box. In that
+ // case we center the mark in the middle of the paragraph
+ if (!preg_match('/\n/', $p[0])) {
+ // Single line
+ $marky = ceil($y1-$this->mark_abs_vsize/2)-1;
+ } else {
+ // Paragraph
+ $marky = $y1 - $aImg->GetTextHeight($p[0])/2;
+
+ // echo "y1=$y1, p[o]={$p[0]}, marky=$marky
";
+ }
+
+ //echo "
Mark #$i: marky=$marky
";
+
+ $x1 += $this->mark_abs_hsize;
+
+ if (!empty($p[2]) && $p[2]->GetType() > -1) {
+
+
+ // Make a plot mark legend. This is constructed with a mark which
+ // is run through with a line
+
+ // First construct a bit of the line that looks exactly like the
+ // line in the plot
+ $aImg->SetColor($p[1]);
+ if (is_string($p[3]) || $p[3]>0) {
+ $aImg->SetLineStyle($p[3]);
+ $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky, $x1+$this->mark_abs_hsize, $marky);
+ }
+
+ // Stroke a mark using image
+ if ($p[2]->GetType() == MARK_IMG) {
+ $p[2]->Stroke($aImg, $x1, $marky);
+ }
+
+ // Stroke a mark with the standard size
+ // (As long as it is not an image mark )
+ if ($p[2]->GetType() != MARK_IMG) {
+
+ // Clear any user callbacks since we ont want them called for
+ // the legend marks
+ $p[2]->iFormatCallback = '';
+ $p[2]->iFormatCallback2 = '';
+
+ // Since size for circles is specified as the radius
+ // this means that we must half the size to make the total
+ // width behave as the other marks
+ if ($p[2]->GetType() == MARK_FILLEDCIRCLE || $p[2]->GetType() == MARK_CIRCLE) {
+ $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize)/2);
+ $p[2]->Stroke($aImg, $x1, $marky);
+ } else {
+ $p[2]->SetSize(min($this->mark_abs_vsize, $this->mark_abs_hsize));
+ $p[2]->Stroke($aImg, $x1, $marky);
+ }
+ }
+ } elseif (!empty($p[2]) && (is_string($p[3]) || $p[3]>0)) {
+ // Draw a styled line
+ $aImg->SetColor($p[1]);
+ $aImg->SetLineStyle($p[3]);
+ $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky, $x1+$this->mark_abs_hsize, $marky);
+ $aImg->StyleLine($x1-$this->mark_abs_hsize, $marky+1, $x1+$this->mark_abs_hsize, $marky+1);
+ } else {
+ // Draw a colored box
+ $color = $p[1] ;
+
+ // We make boxes slightly larger to better show
+ $boxsize = max($this->mark_abs_vsize, $this->mark_abs_hsize) + 2 ;
+
+ $ym = $marky-ceil($boxsize/2) ; // Marker y-coordinate
+
+ // We either need to plot a gradient or a
+ // pattern. To differentiate we use a kludge.
+ // Patterns have a p[3] value of < -100
+ if ($p[3] < -100) {
+ // p[1][0] == iPattern, p[1][1] == iPatternColor, p[1][2] == iPatternDensity
+ if ($patternFactory == null) {
+ $patternFactory = new RectPatternFactory();
+ }
+ $prect = $patternFactory->Create($p[1][0], $p[1][1], 1);
+ $prect->SetBackground($p[1][3]);
+ $prect->SetDensity($p[1][2]+1);
+ $prect->SetPos(new Rectangle($x1, $ym, $boxsize, $boxsize));
+ $prect->Stroke($aImg);
+ $prect=null;
+ } else {
+ if (is_array($color) && count($color)==2) {
+ // The client want a gradient color
+ $grad->FilledRectangle(
+ $x1-$boxsize/2,
+ $ym,
+ $x1+$boxsize/2,
+ $ym+$boxsize,
+ $color[0],
+ $color[1],
+ -$p[3]
+ );
+ } else {
+ $aImg->SetColor($p[1]);
+ $aImg->FilledRectangle($x1-$boxsize/2, $ym, $x1+$boxsize/2, $ym+$boxsize);
+ }
+
+ // Draw a plot frame line
+ $aImg->SetColor($this->color);
+ $aImg->SetLineWeight($fillBoxFrameWeight);
+ $aImg->Rectangle(
+ $x1-$boxsize/2,
+ $ym,
+ $x1+$boxsize/2,
+ $ym+$boxsize
+ );
+ }
+ }
+ $aImg->SetColor($this->font_color);
+ $aImg->SetFont($this->font_family, $this->font_style, $this->font_size);
+ $aImg->SetTextAlign('left', 'baseline');
+
+ $debug=false;
+ $aImg->StrokeText(
+ $x1+$this->mark_abs_hsize+$this->xmargin,
+ $y1,
+ $p[0],
+ 0,
+ 'left',
+ $debug
+ );
+
+ // Add CSIM for Legend if defined
+ if (!empty($p[4])) {
+ $xs = $x1 - $this->mark_abs_hsize ;
+ $ys = $y1 + 1 ;
+ $xe = $x1 + $aImg->GetTextWidth($p[0]) + $this->mark_abs_hsize + $this->xmargin ;
+ $ye = $y1-$rowheight[$row]+1;
+ $coords = "$xs,$ys,$xe,$y1,$xe,$ye,$xs,$ye";
+ if (! empty($p[4])) {
+ $this->csimareas .= "csimareas .= " target=\"".$p[6]."\"";
+ }
+
+ if (!empty($p[5])) {
+ $tmp=sprintf($p[5], $p[0]);
+ $this->csimareas .= " title=\"$tmp\" alt=\"$tmp\" ";
+ }
+ $this->csimareas .= " />\n";
+ }
+ }
+
+ if ($i >= $this->layout_n) {
+ $x1 = $xp+$this->xlmargin;
+ $row++;
+ if (!empty($rowheight[$row])) {
+ $y1 += $rowheight[$row];
+ }
+ $i = 1;
+ } else {
+ $x1 += $colwidth[($i-1) % $numcolumns] ;
+ ++$i;
+ }
+ }
+ }
+} // Class
diff --git a/onyx2/include/jpgraph/jpgraph_line.php b/onyx2/include/jpgraph/jpgraph_line.php
index f09fe74..a05df1a 100644
--- a/onyx2/include/jpgraph/jpgraph_line.php
+++ b/onyx2/include/jpgraph/jpgraph_line.php
@@ -1,13 +1,13 @@
Plot($datay, $datax);
+ parent::__construct($datay, $datax);
$this->mark = new PlotMark() ;
+ $this->color = ColorFactory::getColor();
+ $this->fill_color = $this->color;
}
//---------------
// PUBLIC METHODS
- // Set style, filled or open
- public function SetFilled($aFlag=true)
+ public function SetFilled($aFlg=true)
{
- JpGraphError::RaiseL(10001);//('LinePlot::SetFilled() is deprecated. Use SetFillColor()');
+ $this->filled = $aFlg;
}
-
+
public function SetBarCenter($aFlag=true)
{
$this->barcenter=$aFlag;
@@ -63,24 +65,30 @@ class LinePlot extends Plot
{
$this->line_style=$aStyle;
}
-
+
public function SetStepStyle($aFlag=true)
{
$this->step_style = $aFlag;
}
-
+
public function SetColor($aColor)
{
parent::SetColor($aColor);
}
-
+
public function SetFillFromYMin($f=true)
{
$this->fillFromMin = $f ;
}
-
+
+ public function SetFillFromYMax($f=true)
+ {
+ $this->fillFromMax = $f ;
+ }
+
public function SetFillColor($aColor, $aFilled=true)
{
+ //$this->color = $aColor;
$this->fill_color=$aColor;
$this->filled=$aFilled;
}
@@ -93,7 +101,7 @@ class LinePlot extends Plot
$this->filled = $aFilled;
$this->fillgrad = true;
}
-
+
public function Legend($graph)
{
if ($this->legend!="") {
@@ -143,17 +151,16 @@ class LinePlot extends Plot
}
$this->filledAreas[] = array($aMin,$aMax,$aColor,$aFilled,$aBorder);
}
-
+
// Gets called before any axis are stroked
public function PreStrokeAdjust($graph)
{
- // If another plot type have already adjusted the
+ // If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
- if (empty($graph->xaxis->scale->ticks->xlabel_offset) ||
- $graph->xaxis->scale->ticks->xlabel_offset == 0) {
+ if (empty($graph->xaxis->scale->ticks->xlabel_offset) || $graph->xaxis->scale->ticks->xlabel_offset == 0) {
if ($this->center) {
++$this->numpoints;
$a=0.5;
@@ -167,7 +174,7 @@ class LinePlot extends Plot
//$graph->xaxis->scale->ticks->SupressMinorTickMarks();
}
}
-
+
public function SetFastStroke($aFlg=true)
{
$this->iFastStroke = $aFlg;
@@ -210,7 +217,7 @@ class LinePlot extends Plot
$img->Polygon($cord, false, true);
}
-
+
public function Stroke($img, $xscale, $yscale)
{
$idx=0;
@@ -218,9 +225,8 @@ class LinePlot extends Plot
if (isset($this->coords[1])) {
if (count($this->coords[1])!=$numpoints) {
JpGraphError::RaiseL(2003, count($this->coords[1]), $numpoints);
- }
//("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints");
- else {
+ } else {
$exist_x = true;
}
} else {
@@ -260,18 +266,22 @@ class LinePlot extends Plot
$yscale->Translate($this->coords[0][$startpoint])
);
-
if ($this->filled) {
- $min = $yscale->GetMinVal();
- if ($min > 0 || $this->fillFromMin) {
- $fillmin = $yscale->scale_abs[0];
- }//Translate($min);
- else {
- $fillmin = $yscale->Translate(0);
- }
+ if ($this->fillFromMax) {
+ //$max = $yscale->GetMaxVal();
+ $cord[$idx++] = $xscale->Translate($xs);
+ $cord[$idx++] = $yscale->scale_abs[1];
+ } else {
+ $min = $yscale->GetMinVal();
+ if ($min > 0 || $this->fillFromMin) {
+ $fillmin = $yscale->scale_abs[0];//Translate($min);
+ } else {
+ $fillmin = $yscale->Translate(0);
+ }
- $cord[$idx++] = $xscale->Translate($xs);
- $cord[$idx++] = $fillmin;
+ $cord[$idx++] = $xscale->Translate($xs);
+ $cord[$idx++] = $fillmin;
+ }
}
$xt = $xscale->Translate($xs);
$yt = $yscale->Translate($this->coords[0][$startpoint]);
@@ -298,7 +308,7 @@ class LinePlot extends Plot
}
$xt = $xscale->Translate($x);
$yt = $yscale->Translate($this->coords[0][$pnts]);
-
+
$y=$this->coords[0][$pnts];
if ($this->step_style) {
// To handle null values within step style we need to record the
@@ -373,10 +383,14 @@ class LinePlot extends Plot
if ($this->filled) {
$cord[$idx++] = $xt;
- if ($min > 0 || $this->fillFromMin) {
- $cord[$idx++] = $yscale->Translate($min);
+ if ($this->fillFromMax) {
+ $cord[$idx++] = $yscale->scale_abs[1];
} else {
- $cord[$idx++] = $yscale->Translate(0);
+ if ($min > 0 || $this->fillFromMin) {
+ $cord[$idx++] = $yscale->Translate($min);
+ } else {
+ $cord[$idx++] = $yscale->Translate(0);
+ }
}
if ($this->fillgrad) {
$img->SetLineWeight(1);
@@ -388,9 +402,13 @@ class LinePlot extends Plot
$img->SetColor($this->fill_color);
$img->FilledPolygon($cord);
}
- if ($this->line_weight > 0) {
+ if ($this->weight > 0) {
+ $img->SetLineWeight($this->weight);
$img->SetColor($this->color);
- $img->Polygon($cord);
+ // Remove first and last coordinate before drawing the line
+ // sine we otherwise get the vertical start and end lines which
+ // doesn't look appropriate
+ $img->Polygon(array_slice($cord, 2, count($cord)-4));
}
}
@@ -405,28 +423,26 @@ class LinePlot extends Plot
$areaCoords[] = $minY;
$areaCoords =
- array_merge(
- $areaCoords,
- array_slice(
- $cord,
- $this->filledAreas[$i][0] * $factor,
- ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor
- )
- );
+ array_merge(
+ $areaCoords,
+ array_slice(
+ $cord,
+ $this->filledAreas[$i][0] * $factor,
+ ($this->filledAreas[$i][1] - $this->filledAreas[$i][0] + ($this->step_style ? 0 : 1)) * $factor
+ )
+ );
$areaCoords[] = $areaCoords[sizeof($areaCoords)-2]; // last x
- $areaCoords[] = $minY; // last y
-
- if ($this->filledAreas[$i][3]) {
- $img->SetColor($this->filledAreas[$i][2]);
- $img->FilledPolygon($areaCoords);
- $img->SetColor($this->color);
- }
+ $areaCoords[] = $minY; // last y
+
+ if ($this->filledAreas[$i][3]) {
+ $img->SetColor($this->filledAreas[$i][2]);
+ $img->FilledPolygon($areaCoords);
+ $img->SetColor($this->color);
+ }
// Check if we should draw the frame.
// If not we still re-draw the line since it might have been
// partially overwritten by the filled area and it doesn't look
// very good.
- // TODO: The behaviour is undefined if the line does not have
- // any line at the position of the area.
if ($this->filledAreas[$i][4]) {
$img->Polygon($areaCoords);
} else {
@@ -484,7 +500,7 @@ class AccLinePlot extends Plot
private $iStartEndZero=true;
//---------------
// CONSTRUCTOR
- public function AccLinePlot($plots)
+ public function __construct($plots)
{
$this->plots = $plots;
$this->nbrplots = count($plots);
@@ -510,7 +526,7 @@ class AccLinePlot extends Plot
$p->DoLegend($graph);
}
}
-
+
public function Max()
{
list($xmax) = $this->plots[0]->Max();
@@ -570,11 +586,11 @@ class AccLinePlot extends Plot
public function PreStrokeAdjust($graph)
{
- // If another plot type have already adjusted the
+ // If another plot type have already adjusted the
// offset we don't touch it.
// (We check for empty in case the scale is a log scale
// and hence doesn't contain any xlabel_offset)
-
+
if (empty($graph->xaxis->scale->ticks->xlabel_offset) ||
$graph->xaxis->scale->ticks->xlabel_offset == 0) {
if ($this->center) {
@@ -603,7 +619,7 @@ class AccLinePlot extends Plot
{
$n=count($aData);
$i=0;
-
+
// If first point is undefined we will set it to the same as the first
// valid data
if ($aData[$i]==='-') {
@@ -661,8 +677,6 @@ class AccLinePlot extends Plot
return true;
}
-
-
// To avoid duplicate of line drawing code here we just
// change the y-values for each plot and then restore it
// after we have made the stroke. We must do this copy since
diff --git a/onyx2/include/jpgraph/jpgraph_log.php b/onyx2/include/jpgraph/jpgraph_log.php
index 4be33f5..c0eaa23 100644
--- a/onyx2/include/jpgraph/jpgraph_log.php
+++ b/onyx2/include/jpgraph/jpgraph_log.php
@@ -1,13 +1,13 @@
LinearScale($min, $max, $type);
+ parent::__construct($min, $max, $type);
$this->ticks = new LogTicks();
$this->name = 'log';
}
@@ -38,8 +38,8 @@ class LogScale extends LinearScale
if (!is_numeric($a)) {
if ($a != '' && $a != '-' && $a != 'x') {
JpGraphError::RaiseL(11001);
+ // ('Your data contains non-numeric values.');
}
- //('Your data contains non-numeric values.');
return 1;
}
if ($a < 0) {
@@ -61,8 +61,8 @@ class LogScale extends LinearScale
if (!is_numeric($a)) {
if ($a != '' && $a != '-' && $a != 'x') {
JpGraphError::RaiseL(11001);
+ //('Your data contains non-numeric values.');
}
- //('Your data contains non-numeric values.');
return 1;
}
if ($a==0) {
@@ -71,7 +71,7 @@ class LogScale extends LinearScale
$a=log10($a);
return round(($a*1.0 - $this->scale[0]) * $this->scale_factor);
}
-
+
// Use bcpow() for increased precision
public function GetMinVal()
{
@@ -81,7 +81,7 @@ class LogScale extends LinearScale
return round(pow(10, $this->scale[0]), 14);
}
}
-
+
public function GetMaxVal()
{
if (function_exists("bcpow")) {
@@ -90,7 +90,7 @@ class LogScale extends LinearScale
return round(pow(10, $this->scale[1]), 14);
}
}
-
+
// Logarithmic autoscaling is much simplier since we just
// set the min and max to logs of the min and max values.
// Note that for log autoscale the "maxstep" the fourth argument
@@ -101,7 +101,7 @@ class LogScale extends LinearScale
if ($min==0) {
$min=1;
}
-
+
if ($max <= 0) {
JpGraphError::RaiseL(11004);
//('Scale error for logarithmic scale. You have a problem with your data values. The max value must be greater than 0. It is mathematically impossible to have 0 in a logarithmic scale.');
@@ -127,7 +127,7 @@ class LogScale extends LinearScale
$this->Update($img, $smin, $smax);
}
//---------------
-// PRIVATE METHODS
+ // PRIVATE METHODS
} // Class
//===================================================
@@ -140,7 +140,7 @@ class LogTicks extends Ticks
private $ticklabels_pos = array();
//---------------
// CONSTRUCTOR
- public function LogTicks()
+ public function __construct()
{
}
//---------------
@@ -154,7 +154,7 @@ class LogTicks extends Ticks
{
$this->label_logtype = $aType;
}
-
+
// For log scale it's meaningless to speak about a major step
// We just return -1 to make the framework happy (specifically
// StrokeLabels() )
@@ -184,16 +184,16 @@ class LogTicks extends Ticks
$limit = $scale->GetMaxVal();
$nextMajor = 10*$start;
$step = $nextMajor / 10.0;
-
-
+
+
$img->SetLineWeight($this->weight);
-
+
if ($scale->type == "y") {
// member direction specified if the ticks should be on
// left or right side.
$a=$pos + $this->direction*$this->GetMinTickAbsSize();
$a2=$pos + $this->direction*$this->GetMajTickAbsSize();
-
+
$count=1;
$this->maj_ticks_pos[0]=$scale->Translate($start);
$this->maj_ticklabels_pos[0]=$scale->Translate($start);
@@ -227,7 +227,7 @@ class LogTicks extends Ticks
$this->maj_ticks_pos[$i]=$ys;
$this->maj_ticklabels_pos[$i]=$ys;
-
+
if ($this->label_formfunc != '') {
$f = $this->label_formfunc;
$this->maj_ticks_label[$i]=call_user_func($f, $nextMajor);
diff --git a/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php b/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php
new file mode 100755
index 0000000..1c8dc91
--- /dev/null
+++ b/onyx2/include/jpgraph/jpgraph_meshinterpolate.inc.php
@@ -0,0 +1,108 @@
+Linear($aData, $aFactor);
+}
+
+/**
+ * Utility class to interpolate a given data matrix
+ *
+ */
+class MeshInterpolate
+{
+ private $data = array();
+
+ /**
+ * Calculate the mid points of the given rectangle which has its top left
+ * corner at $row,$col. The $aFactordecides how many spliots should be done.
+ * i.e. how many more divisions should be done recursively
+ *
+ * @param $row Top left corner of square to work with
+ * @param $col Top left corner of square to work with
+ * $param $aFactor In how many subsquare should we split this square. A value of 1 indicates that no action
+ */
+ public function IntSquare($aRow, $aCol, $aFactor)
+ {
+ if ($aFactor <= 1) {
+ return;
+ }
+
+ $step = pow(2, $aFactor-1);
+
+ $v0 = $this->data[$aRow][$aCol];
+ $v1 = $this->data[$aRow][$aCol + $step];
+ $v2 = $this->data[$aRow + $step][$aCol];
+ $v3 = $this->data[$aRow + $step][$aCol + $step];
+
+ $this->data[$aRow][$aCol + $step / 2] = ($v0 + $v1) / 2;
+ $this->data[$aRow + $step / 2][$aCol] = ($v0 + $v2) / 2;
+ $this->data[$aRow + $step][$aCol + $step / 2] = ($v2 + $v3) / 2;
+ $this->data[$aRow + $step / 2][$aCol + $step] = ($v1 + $v3) / 2;
+ $this->data[$aRow + $step / 2][$aCol + $step / 2] = ($v0 + $v1 + $v2 + $v3) / 4;
+
+ $this->IntSquare($aRow, $aCol, $aFactor-1);
+ $this->IntSquare($aRow, $aCol + $step / 2, $aFactor-1);
+ $this->IntSquare($aRow + $step / 2, $aCol, $aFactor-1);
+ $this->IntSquare($aRow + $step / 2, $aCol + $step / 2, $aFactor-1);
+ }
+
+ /**
+ * Interpolate values in a matrice so that the total number of data points
+ * in vert and horizontal axis are $aIntNbr more. For example $aIntNbr=2 will
+ * make the data matrice have tiwce as many vertical and horizontal dta points.
+ *
+ * Note: This will blow up the matrcide in memory size in the order of $aInNbr^2
+ *
+ * @param $ &$aData The original data matricde
+ * @param $aInNbr Interpolation factor
+ * @return the interpolated matrice
+ */
+ public function Linear(&$aData, $aIntFactor)
+ {
+ $step = pow(2, $aIntFactor-1);
+
+ $orig_cols = count($aData[0]);
+ $orig_rows = count($aData);
+ // Number of new columns/rows
+ // N = (a-1) * 2^(f-1) + 1
+ $p = pow(2, $aIntFactor-1);
+ $new_cols = $p * ($orig_cols - 1) + 1;
+ $new_rows = $p * ($orig_rows - 1) + 1;
+
+ $this->data = array_fill(0, $new_rows, array_fill(0, $new_cols, 0));
+ // Initialize the new matrix with the values that we know
+ for ($i = 0; $i < $new_rows; $i++) {
+ for ($j = 0; $j < $new_cols; $j++) {
+ $v = 0 ;
+ if (($i % $step == 0) && ($j % $step == 0)) {
+ $v = $aData[$i / $step][$j / $step];
+ }
+ $this->data[$i][$j] = $v;
+ }
+ }
+
+ for ($i = 0; $i < $new_rows-1; $i += $step) {
+ for ($j = 0; $j < $new_cols-1; $j += $step) {
+ $this->IntSquare($i, $j, $aIntFactor);
+ }
+ }
+
+ return $this->data;
+ }
+}
diff --git a/onyx2/include/jpgraph/jpgraph_mgraph.php b/onyx2/include/jpgraph/jpgraph_mgraph.php
index e43a2d9..32b1c53 100644
--- a/onyx2/include/jpgraph/jpgraph_mgraph.php
+++ b/onyx2/include/jpgraph/jpgraph_mgraph.php
@@ -1,13 +1,13 @@
iWidth = $aWidth;
$this->iHeight = $aHeight;
+
+ // If the cached version exist just read it directly from the
+ // cache, stream it back to browser and exit
+ if ($aCachedName!='' && READ_CACHE && $aInline) {
+ $this->cache = new ImgStreamCache();
+ $this->cache->SetTimeOut($aTimeOut);
+ $image = new Image();
+ if ($this->cache->GetAndStream($image, $aCachedName)) {
+ exit();
+ }
+ }
+ $this->inline = $aInline;
+ $this->cache_name = $aCachedName;
+
+ $this->title = new Text();
+ $this->title->ParagraphAlign('center');
+ $this->title->SetFont(FF_FONT2, FS_BOLD);
+ $this->title->SetMargin(3);
+ $this->title->SetAlign('center');
+
+ $this->subtitle = new Text();
+ $this->subtitle->ParagraphAlign('center');
+ $this->subtitle->SetFont(FF_FONT1, FS_BOLD);
+ $this->subtitle->SetMargin(3);
+ $this->subtitle->SetAlign('center');
+
+ $this->subsubtitle = new Text();
+ $this->subsubtitle->ParagraphAlign('center');
+ $this->subsubtitle->SetFont(FF_FONT1, FS_NORMAL);
+ $this->subsubtitle->SetMargin(3);
+ $this->subsubtitle->SetAlign('center');
+
+ $this->footer = new Footer();
}
// Specify background fill color for the combined graph
@@ -75,10 +120,6 @@ class MGraph
$aCenter=true;
$aX=null;
- if ($GLOBALS['gd2'] && !USE_TRUECOLOR) {
- JpGraphError::RaiseL(12001);
- //("You are using GD 2.x and are trying to use a background images on a non truecolor image. To use background images with GD 2.x you must enable truecolor by setting the USE_TRUECOLOR constant to TRUE. Due to a bug in GD 2.0.1 using any truetype fonts with truecolor images will result in very poor quality fonts.");
- }
if (is_numeric($aCenter_aX)) {
$aX=$aCenter_aX;
}
@@ -89,7 +130,7 @@ class MGraph
JpGraphError::RaiseL(12002, $aFileName);
//('Incorrect file name for MGraph::SetBackgroundImage() : '.$aFileName.' Must have a valid image extension (jpg,gif,png) when using autodetection of image type');
}
-
+
$valid_formats = array('png', 'jpg', 'gif');
$aImgFormat = strtolower($e[count($e)-1]);
if ($aImgFormat == 'jpeg') {
@@ -106,62 +147,27 @@ class MGraph
$this->background_image_y = $aY;
}
-
- // Private helper function for backgound image
- public function _loadBkgImage($aFile='')
- {
- if ($aFile == '') {
- $aFile = $this->background_image;
- }
-
- // Remove case sensitivity and setup appropriate function to create image
- // Get file extension. This should be the LAST '.' separated part of the filename
- $e = explode('.', $aFile);
- $ext = strtolower($e[count($e)-1]);
- if ($ext == "jpeg") {
- $ext = "jpg";
- }
-
- if (trim($ext) == '') {
- $ext = 'png';
- } // Assume PNG if no extension specified
-
- $supported = imagetypes();
- if (($ext == 'jpg' && !($supported & IMG_JPG)) ||
- ($ext == 'gif' && !($supported & IMG_GIF)) ||
- ($ext == 'png' && !($supported & IMG_PNG))) {
- JpGraphError::RaiseL(12004, $aFile);//('The image format of your background image ('.$aFile.') is not supported in your system configuration. ');
- }
-
- if ($ext == "jpg" || $ext == "jpeg") {
- $f = "imagecreatefromjpeg";
- $ext = "jpg";
- } else {
- $f = "imagecreatefrom".$ext;
- }
-
- $img = @$f($aFile);
- if (!$img) {
- JpGraphError::RaiseL(12005, $aFile);
- //(" Can't read background image: '".$aFile."'");
- }
- return $img;
- }
-
public function _strokeBackgroundImage()
{
if ($this->background_image == '') {
return;
}
- $bkgimg = $this->_loadBkgImage();
+ $bkgimg = Graph::LoadBkgImage('', $this->background_image);
+
// Background width & Heoght
$bw = imagesx($bkgimg);
$bh = imagesy($bkgimg);
+
// Canvas width and height
$cw = imagesx($this->img);
$ch = imagesy($this->img);
+ if ($this->doshadow) {
+ $cw -= $this->shadow_width;
+ $ch -= $this->shadow_width;
+ }
+
if ($this->background_image_x === null || $this->background_image_y === null) {
if ($this->background_image_center) {
// Center original image in the plot area
@@ -176,87 +182,14 @@ class MGraph
$x = $this->background_image_x;
$y = $this->background_image_y;
}
- $this->_imageCp($bkgimg, $x, $y, 0, 0, $bw, $bh, $this->background_image_mix);
- }
-
- public function _imageCp($aSrcImg, $x, $y, $fx, $fy, $w, $h, $mix=100)
- {
- imagecopymerge($this->img, $aSrcImg, $x, $y, $fx, $fy, $w, $h, $mix);
- }
-
- public function _imageCreate($aWidth, $aHeight)
- {
- if ($aWidth <= 1 || $aHeight <= 1) {
- JpGraphError::RaiseL(12006, $aWidth, $aHeight);
- //("Illegal sizes specified for width or height when creating an image, (width=$aWidth, height=$aHeight)");
- }
- if (@$GLOBALS['gd2']==true && USE_TRUECOLOR) {
- $this->img = @imagecreatetruecolor($aWidth, $aHeight);
- if ($this->img < 1) {
- JpGraphError::RaiseL(12011);
- // die("JpGraph Error: Can't create truecolor image. Check that you really have GD2 library installed.");
- }
- ImageAlphaBlending($this->img, true);
- } else {
- $this->img = @imagecreate($aWidth, $aHeight);
- if ($this->img < 1) {
- JpGraphError::RaiseL(12012);
- // die("JpGraph Error: Can't create image. Check that you really have the GD library installed.");
- }
- }
- }
-
- public function _polygon($p, $closed=false)
- {
- if ($this->iLineWeight==0) {
- return;
- }
- $n=count($p);
- $oldx = $p[0];
- $oldy = $p[1];
- for ($i=2; $i < $n; $i+=2) {
- imageline($this->img, $oldx, $oldy, $p[$i], $p[$i+1], $this->iCurrentColor);
- $oldx = $p[$i];
- $oldy = $p[$i+1];
- }
- if ($closed) {
- imageline($this->img, $p[$n*2-2], $p[$n*2-1], $p[0], $p[1], $this->iCurrentColor);
- }
- }
-
- public function _filledPolygon($pts)
- {
- $n=count($pts);
- for ($i=0; $i < $n; ++$i) {
- $pts[$i] = round($pts[$i]);
- }
- imagefilledpolygon($this->img, $pts, count($pts)/2, $this->iCurrentColor);
- }
-
- public function _rectangle($xl, $yu, $xr, $yl)
- {
- for ($i=0; $i < $this->iLineWeight; ++$i) {
- $this->_polygon(array($xl+$i,$yu+$i,$xr-$i,$yu+$i,
- $xr-$i,$yl-$i,$xl+$i,$yl-$i,
- $xl+$i,$yu+$i));
- }
- }
-
- public function _filledRectangle($xl, $yu, $xr, $yl)
- {
- $this->_filledPolygon(array($xl,$yu,$xr,$yu,$xr,$yl,$xl,$yl));
- }
-
- public function _setColor($aColor)
- {
- $this->iCurrentColor = $this->iRGB->Allocate($aColor);
+ imagecopymerge($this->img, $bkgimg, $x, $y, 0, 0, $bw, $bh, $this->background_image_mix);
}
public function AddMix($aGraph, $x=0, $y=0, $mix=100, $fx=0, $fy=0, $w=0, $h=0)
{
$this->_gdImgHandle($aGraph->Stroke(_IMG_HANDLER), $x, $y, $fx=0, $fy=0, $w, $h, $mix);
}
-
+
public function Add($aGraph, $x=0, $y=0, $fx=0, $fy=0, $w=0, $h=0)
{
$this->_gdImgHandle($aGraph->Stroke(_IMG_HANDLER), $x, $y, $fx=0, $fy=0, $w, $h);
@@ -291,90 +224,72 @@ class MGraph
$this->expired = $aFlg;
}
- // Generate image header
- public function Headers()
- {
-
- // In case we are running from the command line with the client version of
- // PHP we can't send any headers.
- $sapi = php_sapi_name();
- if ($sapi == 'cli') {
- return;
- }
-
- if (headers_sent()) {
- echo "
| JpGraph Error: -HTTP headers have already been sent. |
| Explanation: HTTP headers have already been sent back to the browser indicating the data as text before the library got a chance to send it's image HTTP header to this browser. This makes it impossible for the library to send back image data to the browser (since that would be interpretated as text by the browser and show up as junk text). Most likely you have some text in your script before the call to Graph::Stroke(). If this texts gets sent back to the browser the browser will assume that all data is plain text. Look for any text, even spaces and newlines, that might have been sent back to the browser. For example it is a common mistake to leave a blank line before the opening \"<?php\". |
- If this is not the case you might have stumbled upon a bug in JpGraph. - Please report this and if possible include the data that caused the - problem."); + JpGraphError::RaiseL(25064); + //JpGraphError::Raise(" Minor or major step size is 0. Check that you haven't got an accidental SetTextTicks(0) in your code. If this is not the case you might have stumbled upon a bug in JpGraph. Please report this and if possible include the data that caused the problem."); } - + $this->major_step=$aMajStep; $this->minor_step=$aMinStep; $this->is_set = true; @@ -154,25 +150,26 @@ class RadarLinearTicks extends Ticks // Prepare to draw linear ticks $maj_step_abs = abs($aScale->scale_factor*$this->major_step); $min_step_abs = abs($aScale->scale_factor*$this->minor_step); - $nbrmaj = floor(($aScale->world_abs_size)/$maj_step_abs); - $nbrmin = floor(($aScale->world_abs_size)/$min_step_abs); - $skip = round($nbrmin/$nbrmaj); // Don't draw minor ontop of major + $nbrmaj = round($aScale->world_abs_size/$maj_step_abs); + $nbrmin = round($aScale->world_abs_size/$min_step_abs); + $skip = round($nbrmin/$nbrmaj); // Don't draw minor on top of major // Draw major ticks $ticklen2=$this->major_abs_size; $dx=round(sin($aAxisAngle)*$ticklen2); $dy=round(cos($aAxisAngle)*$ticklen2); $label=$aScale->scale[0]+$this->major_step; - + $aImg->SetLineWeight($this->weight); - // NEW + $aMajPos = array(); $aMajLabel = array(); + for ($i=1; $i<=$nbrmaj; ++$i) { $xt=round($i*$maj_step_abs*cos($aAxisAngle))+$aScale->scale_abs[0]; $yt=$aPos-round($i*$maj_step_abs*sin($aAxisAngle)); - if ($this->label_formfunc != "") { + if ($this->label_formfunc != '') { $f=$this->label_formfunc; $l = call_user_func($f, $label); } else { @@ -186,11 +183,11 @@ class RadarLinearTicks extends Ticks $aMajPos[($i-1)*2]=$xt+2*$dx; $aMajPos[($i-1)*2+1]=$yt-$aImg->GetFontheight()/2; if (!$this->supress_tickmarks) { - if ($this->majcolor!="") { + if ($this->majcolor != '') { $aImg->PushColor($this->majcolor); } $aImg->Line($xt+$dx, $yt+$dy, $xt-$dx, $yt-$dy); - if ($this->majcolor!="") { + if ($this->majcolor != '') { $aImg->PopColor(); } } @@ -201,7 +198,7 @@ class RadarLinearTicks extends Ticks $dx=round(sin($aAxisAngle)*$ticklen2); $dy=round(cos($aAxisAngle)*$ticklen2); if (!$this->supress_tickmarks && !$this->supress_minor_tickmarks) { - if ($this->mincolor!="") { + if ($this->mincolor != '') { $aImg->PushColor($this->mincolor); } for ($i=1; $i<=$nbrmin; ++$i) { @@ -212,14 +209,13 @@ class RadarLinearTicks extends Ticks $yt=$aPos-round($i*$min_step_abs*sin($aAxisAngle)); $aImg->Line($xt+$dx, $yt+$dy, $xt-$dx, $yt-$dy); } - if ($this->mincolor!="") { + if ($this->mincolor != '') { $aImg->PopColor(); } } } } - //=================================================== // CLASS RadarAxis @@ -228,59 +224,50 @@ class RadarLinearTicks extends Ticks class RadarAxis extends AxisPrototype { public $title=null; - private $title_color="navy"; + private $title_color='navy'; private $len=0; - //--------------- - // CONSTRUCTOR - public function RadarAxis($img, $aScale, $color=array(0,0,0)) + + public function __construct($img, $aScale, $color=array(0,0,0)) { - parent::Axis($img, $aScale, $color); - $this->len=$img->plotheight; + parent::__construct($img, $aScale, $color); + $this->len = $img->plotheight; $this->title = new Text(); $this->title->SetFont(FF_FONT1, FS_BOLD); $this->color = array(0,0,0); } - //--------------- - // PUBLIC METHODS - public function SetTickLabels($aLabelArray, $aLabelColorArray=null) - { - $this->ticks_label = $aLabelArray; - $this->ticks_label_colors = $aLabelColorArray; - } - - + // Stroke the axis - // $pos = Vertical position of axis + // $pos = Vertical position of axis // $aAxisAngle = Axis angle - // $grid = Returns an array with positions used to draw the grid - // $lf = Label flag, TRUE if the axis should have labels + // $grid = Returns an array with positions used to draw the grid + // $lf = Label flag, TRUE if the axis should have labels public function Stroke($pos, $aAxisAngle, &$grid, $title, $lf) { $this->img->SetColor($this->color); - + // Determine end points for the axis $x=round($this->scale->world_abs_size*cos($aAxisAngle)+$this->scale->scale_abs[0]); $y=round($pos-$this->scale->world_abs_size*sin($aAxisAngle)); - + // Draw axis $this->img->SetColor($this->color); $this->img->SetLineWeight($this->weight); if (!$this->hide) { $this->img->Line($this->scale->scale_abs[0], $pos, $x, $y); } - + $this->scale->ticks->Stroke($this->img, $grid, $pos, $aAxisAngle, $this->scale, $majpos, $majlabel); $ncolor=0; if (isset($this->ticks_label_colors)) { $ncolor=count($this->ticks_label_colors); } - + // Draw labels if ($lf && !$this->hide) { $this->img->SetFont($this->font_family, $this->font_style, $this->font_size); - $this->img->SetTextAlign("left", "top"); + $this->img->SetTextAlign('left', 'top'); $this->img->SetColor($this->label_color); - + // majpos contains (x,y) coordinates for labels if (! $this->hide_labels) { $n = floor(count($majpos)/2); @@ -289,7 +276,7 @@ class RadarAxis extends AxisPrototype if ($ncolor > 0) { $this->img->SetColor($this->ticks_label_colors[$i % $ncolor]); } - + if ($this->ticks_label != null && isset($this->ticks_label[$i])) { $this->img->StrokeText($majpos[$i*2], $majpos[$i*2+1], $this->ticks_label[$i]); } else { @@ -300,9 +287,7 @@ class RadarAxis extends AxisPrototype } $this->_StrokeAxisTitle($pos, $aAxisAngle, $title); } - //--------------- - // PRIVATE METHODS - + public function _StrokeAxisTitle($pos, $aAxisAngle, $title) { $this->title->Set($title); @@ -325,24 +310,27 @@ class RadarAxis extends AxisPrototype while ($aAxisAngle > 2*M_PI) { $aAxisAngle -= 2*M_PI; } - + // Around 3 a'clock if ($aAxisAngle>=7*M_PI/4 || $aAxisAngle <= M_PI/4) { $dx=-0.15; } // Small trimming to make the dist to the axis more even + // Around 12 a'clock if ($aAxisAngle>=M_PI/4 && $aAxisAngle <= 3*M_PI/4) { $dx=($aAxisAngle-M_PI/4)*2/M_PI; } + // Around 9 a'clock if ($aAxisAngle>=3*M_PI/4 && $aAxisAngle <= 5*M_PI/4) { $dx=1; } + // Around 6 a'clock if ($aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4) { $dx=(1-($aAxisAngle-M_PI*5/4)*2/M_PI); } - + if ($aAxisAngle>=7*M_PI/4) { $dy=(($aAxisAngle-M_PI)-3*M_PI/4)*2/M_PI; } @@ -361,7 +349,7 @@ class RadarAxis extends AxisPrototype if ($aAxisAngle>=5*M_PI/4 && $aAxisAngle <= 7*M_PI/4) { $dy=0; } - + if (!$this->hide) { $this->title->Stroke($this->img, $xt-$dx*$w, $yt-$dy*$h, $title); } @@ -380,46 +368,44 @@ class RadarGrid private $show=false; private $weight=1; - //------------ - // CONSTRUCTOR - public function RadarGrid() + public function __construct() { + // Empty } - // PUBLIC METHODS public function SetColor($aMajColor) { $this->grid_color = $aMajColor; } - + public function SetWeight($aWeight) { $this->weight=$aWeight; } - + // Specify if grid should be dashed, dotted or solid public function SetLineStyle($aType) { $this->type = $aType; } - + // Decide if both major and minor grid should be displayed public function Show($aShowMajor=true) { $this->show=$aShowMajor; } - - //---------------- - // PRIVATE METHODS + public function Stroke($img, $grid) { if (!$this->show) { return; } + $nbrticks = count($grid[0])/2; $nbrpnts = count($grid); $img->SetColor($this->grid_color); $img->SetLineWeight($this->weight); + for ($i=0; $i<$nbrticks; ++$i) { for ($j=0; $j<$nbrpnts; ++$j) { $pnts[$j*2]=$grid[$j][$i*2]; @@ -427,13 +413,13 @@ class RadarGrid } for ($k=0; $k<$nbrpnts; ++$k) { $l=($k+1)%$nbrpnts; - if ($this->type == "solid") { + if ($this->type == 'solid') { $img->Line($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1]); - } elseif ($this->type == "dotted") { + } elseif ($this->type == 'dotted') { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 1, 6); - } elseif ($this->type == "dashed") { + } elseif ($this->type == 'dashed') { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 2, 4); - } elseif ($this->type == "longdashed") { + } elseif ($this->type == 'longdashed') { $img->DashedLine($pnts[$k*2], $pnts[$k*2+1], $pnts[$l*2], $pnts[$l*2+1], 8, 6); } } @@ -450,33 +436,37 @@ class RadarGrid class RadarPlot { public $mark=null; - public $legend=""; + public $legend=''; + public $legendcsimtarget=''; + public $legendcsimalt=''; + public $csimtargets=array(); // Array of targets for CSIM + public $csimareas=""; // Resultant CSIM area tags + public $csimalts=null; // ALT:s for corresponding target private $data=array(); private $fill=false; private $fill_color=array(200,170,180); private $color=array(0,0,0); private $weight=1; private $linestyle='solid'; + //--------------- // CONSTRUCTOR - public function RadarPlot($data) + public function __construct($data) { $this->data = $data; $this->mark = new PlotMark(); } - //--------------- - // PUBLIC METHODS public function Min() { return Min($this->data); } - + public function Max() { return Max($this->data); } - + public function SetLegend($legend) { $this->legend=$legend; @@ -486,23 +476,23 @@ class RadarPlot { $this->linestyle=$aStyle; } - + public function SetLineWeight($w) { $this->weight=$w; } - + public function SetFillColor($aColor) { $this->fill_color = $aColor; $this->fill = true; } - + public function SetFill($f=true) { $this->fill = $f; } - + public function SetColor($aColor, $aFillColor=false) { $this->color = $aColor; @@ -511,64 +501,92 @@ class RadarPlot $this->fill = true; } } - + + // Set href targets for CSIM + public function SetCSIMTargets($aTargets, $aAlts=null) + { + $this->csimtargets=$aTargets; + $this->csimalts=$aAlts; + } + + // Get all created areas public function GetCSIMareas() { - JpGraphError::RaiseL(18001); - //("Client side image maps not supported for RadarPlots."); + return $this->csimareas; } - + public function Stroke($img, $pos, $scale, $startangle) { $nbrpnts = count($this->data); $astep=2*M_PI/$nbrpnts; $a=$startangle; - - // Rotate each point to the correct axis-angle - // TODO: Update for LogScale + for ($i=0; $i<$nbrpnts; ++$i) { - //$c=$this->data[$i]; + + // Rotate each non null point to the correct axis-angle $cs=$scale->RelTranslate($this->data[$i]); $x=round($cs*cos($a)+$scale->scale_abs[0]); $y=round($pos-$cs*sin($a)); - /* - $c=log10($c); - $x=round(($c-$scale->scale[0])*$scale->scale_factor*cos($a)+$scale->scale_abs[0]); - $y=round($pos-($c-$scale->scale[0])*$scale->scale_factor*sin($a)); - */ + $pnts[$i*2]=$x; $pnts[$i*2+1]=$y; + + // If the next point is null then we draw this polygon segment + // to the center, skip the next and draw the next segment from + // the center up to the point on the axis with the first non-null + // value and continues from that point. Some additoinal logic is necessary + // to handle the boundary conditions + if ($i < $nbrpnts-1) { + if (is_null($this->data[$i+1])) { + $cs = 0; + $x=round($cs*cos($a)+$scale->scale_abs[0]); + $y=round($pos-$cs*sin($a)); + $pnts[$i*2]=$x; + $pnts[$i*2+1]=$y; + $a += $astep; + } + } + $a += $astep; } + if ($this->fill) { $img->SetColor($this->fill_color); $img->FilledPolygon($pnts); } + $img->SetLineWeight($this->weight); $img->SetColor($this->color); $img->SetLineStyle($this->linestyle); - $pnts[]=$pnts[0]; - $pnts[]=$pnts[1]; + $pnts[] = $pnts[0]; + $pnts[] = $pnts[1]; $img->Polygon($pnts); $img->SetLineStyle('solid'); // Reset line style to default + // Add plotmarks on top if ($this->mark->show) { for ($i=0; $i < $nbrpnts; ++$i) { - $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); + if (isset($this->csimtargets[$i])) { + $this->mark->SetCSIMTarget($this->csimtargets[$i]); + $this->mark->SetCSIMAlt($this->csimalts[$i]); + $this->mark->SetCSIMAltVal($pnts[$i*2], $pnts[$i*2+1]); + $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); + $this->csimareas .= $this->mark->GetCSIMAreas(); + } else { + $this->mark->Stroke($img, $pnts[$i*2], $pnts[$i*2+1]); + } } } } - - //--------------- - // PRIVATE METHODS + public function GetCount() { return count($this->data); } - + public function Legend($graph) { - if ($this->legend=="") { + if ($this->legend == '') { return; } if ($this->fill) { @@ -591,56 +609,44 @@ class RadarGraph extends Graph private $posy; private $len; private $axis_title=null; - //--------------- - // CONSTRUCTOR - public function RadarGraph($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) + + public function __construct($width=300, $height=200, $cachedName="", $timeout=0, $inline=1) { - $this->Graph($width, $height, $cachedName, $timeout, $inline); - $this->posx=$width/2; - $this->posy=$height/2; - $this->len=min($width, $height)*0.35; + parent::__construct($width, $height, $cachedName, $timeout, $inline); + $this->posx = $width/2; + $this->posy = $height/2; + $this->len = min($width, $height)*0.35; $this->SetColor(array(255,255,255)); $this->SetTickDensity(TICKD_NORMAL); - $this->SetScale("lin"); + $this->SetScale('lin'); $this->SetGridDepth(DEPTH_FRONT); } - //--------------- - // PUBLIC METHODS - public function SupressTickMarks($f=true) - { - if (ERR_DEPRECATED) { - JpGraphError::RaiseL(18002); - } - //('RadarGraph::SupressTickMarks() is deprecated. Use HideTickMarks() instead.'); - $this->axis->scale->ticks->SupressTickMarks($f); - } - public function HideTickMarks($aFlag=true) { $this->axis->scale->ticks->SupressTickMarks($aFlag); } - + public function ShowMinorTickmarks($aFlag=true) { $this->yscale->ticks->SupressMinorTickMarks(!$aFlag); } - + public function SetScale($axtype, $ymin=1, $ymax=1, $dummy1=null, $dumy2=null) { - if ($axtype != "lin" && $axtype != "log") { + if ($axtype != 'lin' && $axtype != 'log') { JpGraphError::RaiseL(18003, $axtype); //("Illegal scale for radarplot ($axtype). Must be \"lin\" or \"log\""); } - if ($axtype=="lin") { + if ($axtype == 'lin') { $this->yscale = new LinearScale($ymin, $ymax); $this->yscale->ticks = new RadarLinearTicks(); $this->yscale->ticks->SupressMinorTickMarks(); - } elseif ($axtype=="log") { + } elseif ($axtype == 'log') { $this->yscale = new LogScale($ymin, $ymax); $this->yscale->ticks = new RadarLogTicks(); } - + $this->axis = new RadarAxis($this->img, $this->yscale); $this->grid = new RadarGrid(); } @@ -649,8 +655,8 @@ class RadarGraph extends Graph { if ($aSize < 0.1 || $aSize>1) { JpGraphError::RaiseL(18004, $aSize); + //("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); } - //("Radar Plot size must be between 0.1 and 1. (Your value=$s)"); $this->len=min($this->img->width, $this->img->height)*$aSize/2; } @@ -663,22 +669,22 @@ class RadarGraph extends Graph { $this->ytick_factor=25; switch ($densy) { - case TICKD_DENSE: - $this->ytick_factor=12; - break; - case TICKD_NORMAL: - $this->ytick_factor=25; - break; - case TICKD_SPARSE: - $this->ytick_factor=40; - break; - case TICKD_VERYSPARSE: - $this->ytick_factor=70; - break; - default: - JpGraphError::RaiseL(18005, $densy); -//("RadarPlot Unsupported Tick density: $densy"); - } + case TICKD_DENSE: + $this->ytick_factor=12; + break; + case TICKD_NORMAL: + $this->ytick_factor=25; + break; + case TICKD_SPARSE: + $this->ytick_factor=40; + break; + case TICKD_VERYSPARSE: + $this->ytick_factor=70; + break; + default: + JpGraphError::RaiseL(18005, $densy); + //("RadarPlot Unsupported Tick density: $densy"); + } } public function SetPos($px, $py=0.5) @@ -688,26 +694,48 @@ class RadarGraph extends Graph public function SetCenter($px, $py=0.5) { - assert($px > 0 && $py > 0); - $this->posx=$this->img->width*$px; - $this->posy=$this->img->height*$py; + if ($px >= 0 && $px <= 1) { + $this->posx = $this->img->width*$px; + } else { + $this->posx = $px; + } + if ($py >= 0 && $py <= 1) { + $this->posy = $this->img->height*$py; + } else { + $this->posy = $py; + } } - public function SetColor($c) + public function SetColor($aColor) { - $this->SetMarginColor($c); - } - - public function SetTitles($title) - { - $this->axis_title = $title; + $this->SetMarginColor($aColor); } - public function Add($splot) + public function SetTitles($aTitleArray) { - $this->plots[]=$splot; + $this->axis_title = $aTitleArray; } - + + public function Add($aPlot) + { + if ($aPlot == null) { + JpGraphError::RaiseL(25010);//("Graph::Add() You tried to add a null plot to the graph."); + } + if (is_array($aPlot) && count($aPlot) > 0) { + $cl = $aPlot[0]; + } else { + $cl = $aPlot; + } + + if ($cl instanceof Text) { + $this->AddText($aPlot); + } elseif (class_exists('IconPlot', false) && ($cl instanceof IconPlot)) { + $this->AddIcon($aPlot); + } else { + $this->plots[] = $aPlot; + } + } + public function GetPlotsYMinMax($aPlots) { $min=$aPlots[0]->Min(); @@ -718,21 +746,59 @@ class RadarGraph extends Graph } if ($min < 0) { JpGraphError::RaiseL(18006, $min); + //("Minimum data $min (Radar plots should only be used when all data points > 0)"); } - //("Minimum data $min (Radar plots should only be used when all data points > 0)"); return array($min,$max); } - // Stroke the Radar graph - public function Stroke($aStrokeFileName="") + public function StrokeIcons() { + if ($this->iIcons != null) { + $n = count($this->iIcons); + for ($i=0; $i < $n; ++$i) { + $this->iIcons[$i]->Stroke($this->img); + } + } + } + + public function StrokeTexts() + { + if ($this->texts != null) { + $n = count($this->texts); + for ($i=0; $i < $n; ++$i) { + $this->texts[$i]->Stroke($this->img); + } + } + } + + // Stroke the Radar graph + public function Stroke($aStrokeFileName='') + { + + // If the filename is the predefined value = '_csim_special_' + // we assume that the call to stroke only needs to do enough + // to correctly generate the CSIM maps. + // We use this variable to skip things we don't strictly need + // to do to generate the image map to improve performance + // a best we can. Therefor you will see a lot of tests !$_csim in the + // code below. + $_csim = ($aStrokeFileName === _CSIM_SPECIALFILE); + + // We need to know if we have stroked the plot in the + // GetCSIMareas. Otherwise the CSIM hasn't been generated + // and in the case of GetCSIM called before stroke to generate + // CSIM without storing an image to disk GetCSIM must call Stroke. + $this->iHasStroked = true; + $n = count($this->plots); // Set Y-scale - if (!$this->yscale->IsSpecified() && count($this->plots)>0) { + + if (!$this->yscale->IsSpecified() && count($this->plots) > 0) { list($min, $max) = $this->GetPlotsYMinMax($this->plots); $this->yscale->AutoScale($this->img, 0, $max, $this->len/$this->ytick_factor); } elseif ($this->yscale->IsSpecified() && - ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { + ($this->yscale->auto_ticks || !$this->yscale->ticks->IsSpecified())) { + // The tick calculation will use the user suplied min/max values to determine // the ticks. If auto_ticks is false the exact user specifed min and max // values will be used for the scale. @@ -751,75 +817,91 @@ class RadarGraph extends Graph // Set start position end length of scale (in absolute pixels) $this->yscale->SetConstants($this->posx, $this->len); - + // We need as many axis as there are data points $nbrpnts=$this->plots[0]->GetCount(); - + // If we have no titles just number the axis 1,2,3,... if ($this->axis_title==null) { for ($i=0; $i < $nbrpnts; ++$i) { $this->axis_title[$i] = $i+1; } - } elseif (count($this->axis_title)<$nbrpnts) { + } elseif (count($this->axis_title) < $nbrpnts) { JpGraphError::RaiseL(18007); + // ("Number of titles does not match number of points in plot."); } - //("Number of titles does not match number of points in plot."); for ($i=0; $i < $n; ++$i) { if ($nbrpnts != $this->plots[$i]->GetCount()) { JpGraphError::RaiseL(18008); + //("Each radar plot must have the same number of data points."); } } - //("Each radar plot must have the same number of data points."); - if ($this->background_image != "") { - $this->StrokeFrameBackground(); - } else { - $this->StrokeFrame(); + if (!$_csim) { + if ($this->background_image != '') { + $this->StrokeFrameBackground(); + } else { + $this->StrokeFrame(); + $this->StrokeBackgroundGrad(); + } } $astep=2*M_PI/$nbrpnts; - // Prepare legends - for ($i=0; $i < $n; ++$i) { - $this->plots[$i]->Legend($this); - } - $this->legend->Stroke($this->img); - $this->footer->Stroke($this->img); + if (!$_csim) { + if ($this->iIconDepth == DEPTH_BACK) { + $this->StrokeIcons(); + } - if ($this->grid_depth == DEPTH_BACK) { - // Draw axis and grid - for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { - $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); + + // Prepare legends + for ($i=0; $i < $n; ++$i) { + $this->plots[$i]->Legend($this); + } + $this->legend->Stroke($this->img); + $this->footer->Stroke($this->img); + } + + if (!$_csim) { + if ($this->grid_depth == DEPTH_BACK) { + // Draw axis and grid + for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { + $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); + } + $this->grid->Stroke($this->img, $grid); + } + if ($this->iIconDepth == DEPTH_BACK) { + $this->StrokeIcons(); } } - + // Plot points $a=M_PI/2; for ($i=0; $i < $n; ++$i) { $this->plots[$i]->Stroke($this->img, $this->posy, $this->yscale, $a); } - - if ($this->grid_depth != DEPTH_BACK) { - // Draw axis and grid - for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { - $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); + + if (!$_csim) { + if ($this->grid_depth != DEPTH_BACK) { + // Draw axis and grid + for ($i=0,$a=M_PI/2; $i < $nbrpnts; ++$i, $a += $astep) { + $this->axis->Stroke($this->posy, $a, $grid[$i], $this->axis_title[$i], $i==0); + } + $this->grid->Stroke($this->img, $grid); } - } - $this->grid->Stroke($this->img, $grid); - $this->StrokeTitles(); - - // Stroke texts - if ($this->texts != null) { - foreach ($this->texts as $t) { - $t->Stroke($this->img); + + $this->StrokeTitles(); + $this->StrokeTexts(); + if ($this->iIconDepth == DEPTH_FRONT) { + $this->StrokeIcons(); } } // Should we do any final image transformation - if ($this->iImgTrans) { + if ($this->iImgTrans && !$_csim) { if (!class_exists('ImgTrans', false)) { require_once('jpgraph_imgtrans.php'); } - + $tform = new ImgTrans($this->img->img); $this->img->img = $tform->Skew3D( $this->iImgTransHorizon, @@ -831,20 +913,17 @@ class RadarGraph extends Graph $this->iImgTransBorder ); } - - // If the filename is given as the special "__handle" - // then the image handler is returned and the image is NOT - // streamed back - if ($aStrokeFileName == _IMG_HANDLER) { - return $this->img->img; - } else { - // Finally stream the generated picture - $this->cache->PutAndStream( - $this->img, - $this->cache_name, - $this->inline, - $aStrokeFileName - ); + + if (!$_csim) { + // If the filename is given as the special "__handle" + // then the image handler is returned and the image is NOT + // streamed back + if ($aStrokeFileName == _IMG_HANDLER) { + return $this->img->img; + } else { + // Finally stream the generated picture + $this->cache->PutAndStream($this->img, $this->cache_name, $this->inline, $aStrokeFileName); + } } } } // Class diff --git a/onyx2/include/jpgraph/jpgraph_regstat.php b/onyx2/include/jpgraph/jpgraph_regstat.php index b5b9891..e15b061 100644 --- a/onyx2/include/jpgraph/jpgraph_regstat.php +++ b/onyx2/include/jpgraph/jpgraph_regstat.php @@ -1,13 +1,13 @@ y2 = array(); $this->xdata = $xdata; @@ -52,7 +52,7 @@ class Spline $p = $s*$this->y2[$i-1]+2.0; $this->y2[$i] = ($s-1.0)/$p; $delta[$i] = ($ydata[$i+1]-$ydata[$i])/($xdata[$i+1]-$xdata[$i]) - - ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); + ($ydata[$i]-$ydata[$i-1])/($xdata[$i]-$xdata[$i-1]); $delta[$i] = (6.0*$delta[$i]/($xdata[$i+1]-$xdata[$i-1])-$s*$delta[$i-1])/$p; } @@ -106,7 +106,7 @@ class Spline $a = ($this->xdata[$max]-$xpoint)/$h; $b = ($xpoint-$this->xdata[$min])/$h; return $a*$this->ydata[$min]+$b*$this->ydata[$max]+ - (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; + (($a*$a*$a-$a)*$this->y2[$min]+($b*$b*$b-$b)*$this->y2[$max])*($h*$h)/6.0; } } @@ -121,13 +121,13 @@ class Bezier * @license released under QPL * @abstract Bezier interoplated point generation, * computed from control points data sets, based on Paul Bourke algorithm : - * http://astronomy.swin.edu.au/~pbourke/curves/bezier/ + * http://local.wasp.uwa.edu.au/~pbourke/geometry/bezier/index2.html */ private $datax = array(); private $datay = array(); private $n=0; - - public function Bezier($datax, $datay, $attraction_factor = 1) + + public function __construct($datax, $datay, $attraction_factor = 1) { // Adding control point multiple time will raise their attraction power over the curve $this->n = count($datax); @@ -150,22 +150,35 @@ class Bezier $this->n *= $attraction_factor; } + /** + * Return a set of data points that specifies the bezier curve with $steps points + * @param $steps Number of new points to return + * @return array($datax, $datay) + */ public function Get($steps) { $datax = array(); $datay = array(); for ($i = 0; $i < $steps; $i++) { list($datumx, $datumy) = $this->GetPoint((double) $i / (double) $steps); - $datax[] = $datumx; - $datay[] = $datumy; + $datax[$i] = $datumx; + $datay[$i] = $datumy; } - + $datax[] = end($this->datax); $datay[] = end($this->datay); - + return array($datax, $datay); } - + + /** + * Return one point on the bezier curve. $mu is the position on the curve where $mu is in the + * range 0 $mu < 1 where 0 is tha start point and 1 is the end point. Note that every newly computed + * point depends on all the existing points + * + * @param $mu Position on the bezier curve + * @return array($x, $y) + */ public function GetPoint($mu) { $n = $this->n - 1; diff --git a/onyx2/include/jpgraph/jpgraph_rgb.inc.php b/onyx2/include/jpgraph/jpgraph_rgb.inc.php new file mode 100755 index 0000000..929b1c4 --- /dev/null +++ b/onyx2/include/jpgraph/jpgraph_rgb.inc.php @@ -0,0 +1,615 @@ +img = $aImg; + + // Conversion array between color names and RGB + $this->rgb_table = array( + 'aqua'=> array(0,255,255), + 'lime'=> array(0,255,0), + 'teal'=> array(0,128,128), + 'whitesmoke'=>array(245,245,245), + 'gainsboro'=>array(220,220,220), + 'oldlace'=>array(253,245,230), + 'linen'=>array(250,240,230), + 'antiquewhite'=>array(250,235,215), + 'papayawhip'=>array(255,239,213), + 'blanchedalmond'=>array(255,235,205), + 'bisque'=>array(255,228,196), + 'peachpuff'=>array(255,218,185), + 'navajowhite'=>array(255,222,173), + 'moccasin'=>array(255,228,181), + 'cornsilk'=>array(255,248,220), + 'ivory'=>array(255,255,240), + 'lemonchiffon'=>array(255,250,205), + 'seashell'=>array(255,245,238), + 'mintcream'=>array(245,255,250), + 'azure'=>array(240,255,255), + 'aliceblue'=>array(240,248,255), + 'lavender'=>array(230,230,250), + 'lavenderblush'=>array(255,240,245), + 'mistyrose'=>array(255,228,225), + 'white'=>array(255,255,255), + 'black'=>array(0,0,0), + 'darkslategray'=>array(47,79,79), + 'dimgray'=>array(105,105,105), + 'slategray'=>array(112,128,144), + 'lightslategray'=>array(119,136,153), + 'gray'=>array(190,190,190), + 'lightgray'=>array(211,211,211), + 'midnightblue'=>array(25,25,112), + 'navy'=>array(0,0,128), + 'indigo'=>array(75,0,130), + 'electricindigo'=>array(102,0,255), + 'deepindigo'=>array(138,43,226), + 'pigmentindigo'=>array(75,0,130), + 'indigodye'=>array(0,65,106), + 'cornflowerblue'=>array(100,149,237), + 'darkslateblue'=>array(72,61,139), + 'slateblue'=>array(106,90,205), + 'mediumslateblue'=>array(123,104,238), + 'lightslateblue'=>array(132,112,255), + 'mediumblue'=>array(0,0,205), + 'royalblue'=>array(65,105,225), + 'blue'=>array(0,0,255), + 'dodgerblue'=>array(30,144,255), + 'deepskyblue'=>array(0,191,255), + 'skyblue'=>array(135,206,235), + 'lightskyblue'=>array(135,206,250), + 'steelblue'=>array(70,130,180), + 'lightred'=>array(211,167,168), + 'lightsteelblue'=>array(176,196,222), + 'lightblue'=>array(173,216,230), + 'powderblue'=>array(176,224,230), + 'paleturquoise'=>array(175,238,238), + 'darkturquoise'=>array(0,206,209), + 'mediumturquoise'=>array(72,209,204), + 'turquoise'=>array(64,224,208), + 'cyan'=>array(0,255,255), + 'lightcyan'=>array(224,255,255), + 'cadetblue'=>array(95,158,160), + 'mediumaquamarine'=>array(102,205,170), + 'aquamarine'=>array(127,255,212), + 'darkgreen'=>array(0,100,0), + 'darkolivegreen'=>array(85,107,47), + 'darkseagreen'=>array(143,188,143), + 'seagreen'=>array(46,139,87), + 'mediumseagreen'=>array(60,179,113), + 'lightseagreen'=>array(32,178,170), + 'palegreen'=>array(152,251,152), + 'springgreen'=>array(0,255,127), + 'lawngreen'=>array(124,252,0), + 'green'=>array(0,255,0), + 'chartreuse'=>array(127,255,0), + 'mediumspringgreen'=>array(0,250,154), + 'greenyellow'=>array(173,255,47), + 'limegreen'=>array(50,205,50), + 'yellowgreen'=>array(154,205,50), + 'forestgreen'=>array(34,139,34), + 'olivedrab'=>array(107,142,35), + 'darkkhaki'=>array(189,183,107), + 'khaki'=>array(240,230,140), + 'palegoldenrod'=>array(238,232,170), + 'lightgoldenrodyellow'=>array(250,250,210), + 'lightyellow'=>array(255,255,200), + 'yellow'=>array(255,255,0), + 'gold'=>array(255,215,0), + 'lightgoldenrod'=>array(238,221,130), + 'goldenrod'=>array(218,165,32), + 'darkgoldenrod'=>array(184,134,11), + 'rosybrown'=>array(188,143,143), + 'indianred'=>array(205,92,92), + 'saddlebrown'=>array(139,69,19), + 'sienna'=>array(160,82,45), + 'peru'=>array(205,133,63), + 'burlywood'=>array(222,184,135), + 'beige'=>array(245,245,220), + 'wheat'=>array(245,222,179), + 'sandybrown'=>array(244,164,96), + 'tan'=>array(210,180,140), + 'chocolate'=>array(210,105,30), + 'firebrick'=>array(178,34,34), + 'brown'=>array(165,42,42), + 'darksalmon'=>array(233,150,122), + 'salmon'=>array(250,128,114), + 'lightsalmon'=>array(255,160,122), + 'orange'=>array(255,165,0), + 'darkorange'=>array(255,140,0), + 'coral'=>array(255,127,80), + 'lightcoral'=>array(240,128,128), + 'tomato'=>array(255,99,71), + 'orangered'=>array(255,69,0), + 'red'=>array(255,0,0), + 'hotpink'=>array(255,105,180), + 'deeppink'=>array(255,20,147), + 'pink'=>array(255,192,203), + 'lightpink'=>array(255,182,193), + 'palevioletred'=>array(219,112,147), + 'maroon'=>array(176,48,96), + 'mediumvioletred'=>array(199,21,133), + 'violetred'=>array(208,32,144), + 'magenta'=>array(255,0,255), + 'violet'=>array(238,130,238), + 'plum'=>array(221,160,221), + 'orchid'=>array(218,112,214), + 'mediumorchid'=>array(186,85,211), + 'darkorchid'=>array(153,50,204), + 'darkviolet'=>array(148,0,211), + 'blueviolet'=>array(138,43,226), + 'purple'=>array(160,32,240), + 'mediumpurple'=>array(147,112,219), + 'thistle'=>array(216,191,216), + 'snow1'=>array(255,250,250), + 'snow2'=>array(238,233,233), + 'snow3'=>array(205,201,201), + 'snow4'=>array(139,137,137), + 'seashell1'=>array(255,245,238), + 'seashell2'=>array(238,229,222), + 'seashell3'=>array(205,197,191), + 'seashell4'=>array(139,134,130), + 'AntiqueWhite1'=>array(255,239,219), + 'AntiqueWhite2'=>array(238,223,204), + 'AntiqueWhite3'=>array(205,192,176), + 'AntiqueWhite4'=>array(139,131,120), + 'bisque1'=>array(255,228,196), + 'bisque2'=>array(238,213,183), + 'bisque3'=>array(205,183,158), + 'bisque4'=>array(139,125,107), + 'peachPuff1'=>array(255,218,185), + 'peachpuff2'=>array(238,203,173), + 'peachpuff3'=>array(205,175,149), + 'peachpuff4'=>array(139,119,101), + 'navajowhite1'=>array(255,222,173), + 'navajowhite2'=>array(238,207,161), + 'navajowhite3'=>array(205,179,139), + 'navajowhite4'=>array(139,121,94), + 'lemonchiffon1'=>array(255,250,205), + 'lemonchiffon2'=>array(238,233,191), + 'lemonchiffon3'=>array(205,201,165), + 'lemonchiffon4'=>array(139,137,112), + 'ivory1'=>array(255,255,240), + 'ivory2'=>array(238,238,224), + 'ivory3'=>array(205,205,193), + 'ivory4'=>array(139,139,131), + 'honeydew'=>array(193,205,193), + 'lavenderblush1'=>array(255,240,245), + 'lavenderblush2'=>array(238,224,229), + 'lavenderblush3'=>array(205,193,197), + 'lavenderblush4'=>array(139,131,134), + 'mistyrose1'=>array(255,228,225), + 'mistyrose2'=>array(238,213,210), + 'mistyrose3'=>array(205,183,181), + 'mistyrose4'=>array(139,125,123), + 'azure1'=>array(240,255,255), + 'azure2'=>array(224,238,238), + 'azure3'=>array(193,205,205), + 'azure4'=>array(131,139,139), + 'slateblue1'=>array(131,111,255), + 'slateblue2'=>array(122,103,238), + 'slateblue3'=>array(105,89,205), + 'slateblue4'=>array(71,60,139), + 'royalblue1'=>array(72,118,255), + 'royalblue2'=>array(67,110,238), + 'royalblue3'=>array(58,95,205), + 'royalblue4'=>array(39,64,139), + 'dodgerblue1'=>array(30,144,255), + 'dodgerblue2'=>array(28,134,238), + 'dodgerblue3'=>array(24,116,205), + 'dodgerblue4'=>array(16,78,139), + 'steelblue1'=>array(99,184,255), + 'steelblue2'=>array(92,172,238), + 'steelblue3'=>array(79,148,205), + 'steelblue4'=>array(54,100,139), + 'deepskyblue1'=>array(0,191,255), + 'deepskyblue2'=>array(0,178,238), + 'deepskyblue3'=>array(0,154,205), + 'deepskyblue4'=>array(0,104,139), + 'skyblue1'=>array(135,206,255), + 'skyblue2'=>array(126,192,238), + 'skyblue3'=>array(108,166,205), + 'skyblue4'=>array(74,112,139), + 'lightskyblue1'=>array(176,226,255), + 'lightskyblue2'=>array(164,211,238), + 'lightskyblue3'=>array(141,182,205), + 'lightskyblue4'=>array(96,123,139), + 'slategray1'=>array(198,226,255), + 'slategray2'=>array(185,211,238), + 'slategray3'=>array(159,182,205), + 'slategray4'=>array(108,123,139), + 'lightsteelblue1'=>array(202,225,255), + 'lightsteelblue2'=>array(188,210,238), + 'lightsteelblue3'=>array(162,181,205), + 'lightsteelblue4'=>array(110,123,139), + 'lightblue1'=>array(191,239,255), + 'lightblue2'=>array(178,223,238), + 'lightblue3'=>array(154,192,205), + 'lightblue4'=>array(104,131,139), + 'lightcyan1'=>array(224,255,255), + 'lightcyan2'=>array(209,238,238), + 'lightcyan3'=>array(180,205,205), + 'lightcyan4'=>array(122,139,139), + 'paleturquoise1'=>array(187,255,255), + 'paleturquoise2'=>array(174,238,238), + 'paleturquoise3'=>array(150,205,205), + 'paleturquoise4'=>array(102,139,139), + 'cadetblue1'=>array(152,245,255), + 'cadetblue2'=>array(142,229,238), + 'cadetblue3'=>array(122,197,205), + 'cadetblue4'=>array(83,134,139), + 'turquoise1'=>array(0,245,255), + 'turquoise2'=>array(0,229,238), + 'turquoise3'=>array(0,197,205), + 'turquoise4'=>array(0,134,139), + 'cyan1'=>array(0,255,255), + 'cyan2'=>array(0,238,238), + 'cyan3'=>array(0,205,205), + 'cyan4'=>array(0,139,139), + 'darkslategray1'=>array(151,255,255), + 'darkslategray2'=>array(141,238,238), + 'darkslategray3'=>array(121,205,205), + 'darkslategray4'=>array(82,139,139), + 'aquamarine1'=>array(127,255,212), + 'aquamarine2'=>array(118,238,198), + 'aquamarine3'=>array(102,205,170), + 'aquamarine4'=>array(69,139,116), + 'darkseagreen1'=>array(193,255,193), + 'darkseagreen2'=>array(180,238,180), + 'darkseagreen3'=>array(155,205,155), + 'darkseagreen4'=>array(105,139,105), + 'seagreen1'=>array(84,255,159), + 'seagreen2'=>array(78,238,148), + 'seagreen3'=>array(67,205,128), + 'seagreen4'=>array(46,139,87), + 'palegreen1'=>array(154,255,154), + 'palegreen2'=>array(144,238,144), + 'palegreen3'=>array(124,205,124), + 'palegreen4'=>array(84,139,84), + 'springgreen1'=>array(0,255,127), + 'springgreen2'=>array(0,238,118), + 'springgreen3'=>array(0,205,102), + 'springgreen4'=>array(0,139,69), + 'chartreuse1'=>array(127,255,0), + 'chartreuse2'=>array(118,238,0), + 'chartreuse3'=>array(102,205,0), + 'chartreuse4'=>array(69,139,0), + 'olivedrab1'=>array(192,255,62), + 'olivedrab2'=>array(179,238,58), + 'olivedrab3'=>array(154,205,50), + 'olivedrab4'=>array(105,139,34), + 'darkolivegreen1'=>array(202,255,112), + 'darkolivegreen2'=>array(188,238,104), + 'darkolivegreen3'=>array(162,205,90), + 'darkolivegreen4'=>array(110,139,61), + 'khaki1'=>array(255,246,143), + 'khaki2'=>array(238,230,133), + 'khaki3'=>array(205,198,115), + 'khaki4'=>array(139,134,78), + 'lightgoldenrod1'=>array(255,236,139), + 'lightgoldenrod2'=>array(238,220,130), + 'lightgoldenrod3'=>array(205,190,112), + 'lightgoldenrod4'=>array(139,129,76), + 'yellow1'=>array(255,255,0), + 'yellow2'=>array(238,238,0), + 'yellow3'=>array(205,205,0), + 'yellow4'=>array(139,139,0), + 'gold1'=>array(255,215,0), + 'gold2'=>array(238,201,0), + 'gold3'=>array(205,173,0), + 'gold4'=>array(139,117,0), + 'goldenrod1'=>array(255,193,37), + 'goldenrod2'=>array(238,180,34), + 'goldenrod3'=>array(205,155,29), + 'goldenrod4'=>array(139,105,20), + 'darkgoldenrod1'=>array(255,185,15), + 'darkgoldenrod2'=>array(238,173,14), + 'darkgoldenrod3'=>array(205,149,12), + 'darkgoldenrod4'=>array(139,101,8), + 'rosybrown1'=>array(255,193,193), + 'rosybrown2'=>array(238,180,180), + 'rosybrown3'=>array(205,155,155), + 'rosybrown4'=>array(139,105,105), + 'indianred1'=>array(255,106,106), + 'indianred2'=>array(238,99,99), + 'indianred3'=>array(205,85,85), + 'indianred4'=>array(139,58,58), + 'sienna1'=>array(255,130,71), + 'sienna2'=>array(238,121,66), + 'sienna3'=>array(205,104,57), + 'sienna4'=>array(139,71,38), + 'burlywood1'=>array(255,211,155), + 'burlywood2'=>array(238,197,145), + 'burlywood3'=>array(205,170,125), + 'burlywood4'=>array(139,115,85), + 'wheat1'=>array(255,231,186), + 'wheat2'=>array(238,216,174), + 'wheat3'=>array(205,186,150), + 'wheat4'=>array(139,126,102), + 'tan1'=>array(255,165,79), + 'tan2'=>array(238,154,73), + 'tan3'=>array(205,133,63), + 'tan4'=>array(139,90,43), + 'chocolate1'=>array(255,127,36), + 'chocolate2'=>array(238,118,33), + 'chocolate3'=>array(205,102,29), + 'chocolate4'=>array(139,69,19), + 'firebrick1'=>array(255,48,48), + 'firebrick2'=>array(238,44,44), + 'firebrick3'=>array(205,38,38), + 'firebrick4'=>array(139,26,26), + 'brown1'=>array(255,64,64), + 'brown2'=>array(238,59,59), + 'brown3'=>array(205,51,51), + 'brown4'=>array(139,35,35), + 'salmon1'=>array(255,140,105), + 'salmon2'=>array(238,130,98), + 'salmon3'=>array(205,112,84), + 'salmon4'=>array(139,76,57), + 'lightsalmon1'=>array(255,160,122), + 'lightsalmon2'=>array(238,149,114), + 'lightsalmon3'=>array(205,129,98), + 'lightsalmon4'=>array(139,87,66), + 'orange1'=>array(255,165,0), + 'orange2'=>array(238,154,0), + 'orange3'=>array(205,133,0), + 'orange4'=>array(139,90,0), + 'darkorange1'=>array(255,127,0), + 'darkorange2'=>array(238,118,0), + 'darkorange3'=>array(205,102,0), + 'darkorange4'=>array(139,69,0), + 'coral1'=>array(255,114,86), + 'coral2'=>array(238,106,80), + 'coral3'=>array(205,91,69), + 'coral4'=>array(139,62,47), + 'tomato1'=>array(255,99,71), + 'tomato2'=>array(238,92,66), + 'tomato3'=>array(205,79,57), + 'tomato4'=>array(139,54,38), + 'orangered1'=>array(255,69,0), + 'orangered2'=>array(238,64,0), + 'orangered3'=>array(205,55,0), + 'orangered4'=>array(139,37,0), + 'deeppink1'=>array(255,20,147), + 'deeppink2'=>array(238,18,137), + 'deeppink3'=>array(205,16,118), + 'deeppink4'=>array(139,10,80), + 'hotpink1'=>array(255,110,180), + 'hotpink2'=>array(238,106,167), + 'hotpink3'=>array(205,96,144), + 'hotpink4'=>array(139,58,98), + 'pink1'=>array(255,181,197), + 'pink2'=>array(238,169,184), + 'pink3'=>array(205,145,158), + 'pink4'=>array(139,99,108), + 'lightpink1'=>array(255,174,185), + 'lightpink2'=>array(238,162,173), + 'lightpink3'=>array(205,140,149), + 'lightpink4'=>array(139,95,101), + 'palevioletred1'=>array(255,130,171), + 'palevioletred2'=>array(238,121,159), + 'palevioletred3'=>array(205,104,137), + 'palevioletred4'=>array(139,71,93), + 'maroon1'=>array(255,52,179), + 'maroon2'=>array(238,48,167), + 'maroon3'=>array(205,41,144), + 'maroon4'=>array(139,28,98), + 'violetred1'=>array(255,62,150), + 'violetred2'=>array(238,58,140), + 'violetred3'=>array(205,50,120), + 'violetred4'=>array(139,34,82), + 'magenta1'=>array(255,0,255), + 'magenta2'=>array(238,0,238), + 'magenta3'=>array(205,0,205), + 'magenta4'=>array(139,0,139), + 'mediumred'=>array(140,34,34), + 'orchid1'=>array(255,131,250), + 'orchid2'=>array(238,122,233), + 'orchid3'=>array(205,105,201), + 'orchid4'=>array(139,71,137), + 'plum1'=>array(255,187,255), + 'plum2'=>array(238,174,238), + 'plum3'=>array(205,150,205), + 'plum4'=>array(139,102,139), + 'mediumorchid1'=>array(224,102,255), + 'mediumorchid2'=>array(209,95,238), + 'mediumorchid3'=>array(180,82,205), + 'mediumorchid4'=>array(122,55,139), + 'darkorchid1'=>array(191,62,255), + 'darkorchid2'=>array(178,58,238), + 'darkorchid3'=>array(154,50,205), + 'darkorchid4'=>array(104,34,139), + 'purple1'=>array(155,48,255), + 'purple2'=>array(145,44,238), + 'purple3'=>array(125,38,205), + 'purple4'=>array(85,26,139), + 'mediumpurple1'=>array(171,130,255), + 'mediumpurple2'=>array(159,121,238), + 'mediumpurple3'=>array(137,104,205), + 'mediumpurple4'=>array(93,71,139), + 'thistle1'=>array(255,225,255), + 'thistle2'=>array(238,210,238), + 'thistle3'=>array(205,181,205), + 'thistle4'=>array(139,123,139), + 'gray1'=>array(10,10,10), + 'gray2'=>array(40,40,30), + 'gray3'=>array(70,70,70), + 'gray4'=>array(100,100,100), + 'gray5'=>array(130,130,130), + 'gray6'=>array(160,160,160), + 'gray7'=>array(190,190,190), + 'gray8'=>array(210,210,210), + 'gray9'=>array(240,240,240), + 'darkgray'=>array(100,100,100), + 'darkblue'=>array(0,0,139), + 'darkcyan'=>array(0,139,139), + 'darkmagenta'=>array(139,0,139), + 'darkred'=>array(139,0,0), + 'silver'=>array(192, 192, 192), + 'eggplant'=>array(144,176,168), + 'lightgreen'=>array(144,238,144)); + } + + + //---------------- + // PUBLIC METHODS + // Colors can be specified as either + // 1. #xxxxxx HTML style + // 2. "colorname" as a named color + // 3. array(r,g,b) RGB triple + // This function translates this to a native RGB format and returns an + // RGB triple. + + public function Color($aColor) + { + if (is_string($aColor)) { + $matches = array(); + // this regex will parse a color string and fill the $matches array as such: + // 0: the full match if any + // 1: a hex string preceded by a hash, can be 3 characters (#fff) or 6 (#ffffff) (4 or 5 also accepted but...) + // 2,3,4: r,g,b values in hex if the first character of the string is # + // 5: all alpha-numeric characters at the beginning of the string if string does not start with # + // 6: alpha value prefixed by @ if supplied + // 7: alpha value with @ stripped + // 8: adjust value prefixed with : if supplied + // 9: adjust value with : stripped + $regex = '/(#([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2})([0-9a-fA-F]{1,2}))?([\w]+)?(@([\d\.,]+))?(:([\d\.,]+))?/'; + if (!preg_match($regex, $aColor, $matches)) { + JpGraphError::RaiseL(25078, $aColor);//(" Unknown color: $aColor"); + } + if (empty($matches[5])) { + $r = strlen($matches[2]) == 1 ? $matches[2].$matches[2] : $matches[2]; + $g = strlen($matches[3]) == 1 ? $matches[3].$matches[3] : $matches[3]; + $b = strlen($matches[4]) == 1 ? $matches[4].$matches[4] : $matches[4]; + $r = hexdec($r); + $g = hexdec($g); + $b = hexdec($b); + } else { + if (!isset($this->rgb_table[$matches[5]])) { + JpGraphError::RaiseL(25078, $aColor);//(" Unknown color: $aColor"); + } + $r = $this->rgb_table[$matches[5]][0]; + $g = $this->rgb_table[$matches[5]][1]; + $b = $this->rgb_table[$matches[5]][2]; + } + $alpha = isset($matches[7]) ? str_replace(',', '.', $matches[7]) : 0; + $adj = isset($matches[9]) ? str_replace(',', '.', $matches[9]) : 1.0; + + if ($adj < 0) { + JpGraphError::RaiseL(25077);//('Adjustment factor for color must be > 0'); + } + + // Scale adj so that an adj=2 always + // makes the color 100% white (i.e. 255,255,255. + // and adj=1 neutral and adj=0 black. + if ($adj == 1) { + return array($r,$g,$b,$alpha); + } elseif ($adj > 1) { + $m = ($adj-1.0)*(255-min(255, min($r, min($g, $b)))); + return array(min(255, $r+$m), min(255, $g+$m), min(255, $b+$m),$alpha); + } elseif ($adj < 1) { + $m = ($adj-1.0)*max(255, max($r, max($g, $b))); + return array(max(0, $r+$m), max(0, $g+$m), max(0, $b+$m),$alpha); + } + } elseif (is_array($aColor)) { + if (!isset($aColor[3])) { + $aColor[3] = 0; + } + return $aColor; + } else { + JpGraphError::RaiseL(25079, $aColor, count($aColor));//(" Unknown color specification: $aColor , size=".count($aColor)); + } + } + + // Compare two colors + // return true if equal + public function Equal($aCol1, $aCol2) + { + $c1 = $this->Color($aCol1); + $c2 = $this->Color($aCol2); + return $c1[0]==$c2[0] && $c1[1]==$c2[1] && $c1[2]==$c2[2] ; + } + + // Allocate a new color in the current image + // Return new color index, -1 if no more colors could be allocated + public function Allocate($aColor, $aAlpha=0.0) + { + list($r, $g, $b, $a) = $this->color($aColor); + // If alpha is specified in the color string then this + // takes precedence over the second argument + if ($a > 0) { + $aAlpha = $a; + } + if ($aAlpha < 0 || $aAlpha > 1) { + JpGraphError::RaiseL(25080);//('Alpha parameter for color must be between 0.0 and 1.0'); + } + return imagecolorresolvealpha($this->img, $r, $g, $b, round($aAlpha * 127)); + } + + // Try to convert an array with three valid numbers to the corresponding hex array + // This is currenly only used in processing the colors for barplots in order to be able + // to handle the case where the color might be specified as an array of colros as well. + // In that case we must be able to find out if an array of values should be interpretated as + // a single color (specifeid as an RGB triple) + public static function tryHexConversion($aColor) + { + if (is_array($aColor)) { + if (count($aColor) == 3) { + if (is_numeric($aColor[0]) && is_numeric($aColor[1]) && is_numeric($aColor[2])) { + if (($aColor[0] >= 0 && $aColor[0] <= 255) && + ($aColor[1] >= 0 && $aColor[1] <= 255) && + ($aColor[2] >= 0 && $aColor[2] <= 255)) { + return sprintf('#%02x%02x%02x', $aColor[0], $aColor[1], $aColor[2]); + } + } + } + } + return $aColor; + } + + // Return a RGB tripple corresponding to a position in the normal light spectrum + // The argumen values is in the range [0, 1] where a value of 0 correponds to blue and + // a value of 1 corresponds to red. Values in betwen is mapped to a linear interpolation + // of the constituting colors in the visible color spectra. + // The $aDynamicRange specified how much of the dynamic range we shold use + // a value of 1.0 give the full dyanmic range and a lower value give more dark + // colors. In the extreme of 0.0 then all colors will be black. + public static function GetSpectrum($aVal, $aDynamicRange=1.0) + { + if ($aVal < 0 || $aVal > 1.0001) { + return array(0,0,0); // Invalid case - just return black + } + + $sat = round(255*$aDynamicRange); + $a = 0.25; + if ($aVal <= 0.25) { + return array(0, round($sat*$aVal/$a), $sat); + } elseif ($aVal <= 0.5) { + return array(0, $sat, round($sat-$sat*($aVal-0.25)/$a)); + } elseif ($aVal <= 0.75) { + return array(round($sat*($aVal-0.5)/$a), $sat, 0); + } else { + return array($sat, round($sat-$sat*($aVal-0.75)/$a), 0); + } + } +} // Class diff --git a/onyx2/include/jpgraph/jpgraph_scatter.php b/onyx2/include/jpgraph/jpgraph_scatter.php index eb0c6be..550338e 100644 --- a/onyx2/include/jpgraph/jpgraph_scatter.php +++ b/onyx2/include/jpgraph/jpgraph_scatter.php @@ -1,13 +1,13 @@ iAngles = $angles; - $this->Plot($datay, $datax); + parent::__construct($datay, $datax); $this->value->SetAlign('center', 'center'); $this->value->SetMargin(15); @@ -97,7 +99,7 @@ class FieldPlot extends Plot public function Stroke($img, $xscale, $yscale) { - // Remeber base color and size + // Remeber base color and size $bc = $this->arrow->iColor; $bs = $this->arrow->iSize; $bas = $this->arrow->iArrowSize; @@ -132,7 +134,7 @@ class FieldPlot extends Plot $this->value->Stroke($img, $this->coords[0][$i], $xt, $yt); } } - + // Framework function public function Legend($aGraph) { @@ -156,24 +158,24 @@ class FieldPlot extends Plot //=================================================== class ScatterPlot extends Plot { - public $mark = ''; + public $mark; + public $link; private $impuls = false; - private $linkpoints = false; - private $linkpointweight=1; - private $linkpointcolor="black"; //--------------- // CONSTRUCTOR - public function ScatterPlot($datay, $datax=false) + public function __construct($datay, $datax=false) { - if ((count($datax) != count($datay)) && is_array($datax)) { - JpGraphError::RaiseL(20003); - }//("Scatterplot must have equal number of X and Y points."); - $this->Plot($datay, $datax); + if (is_array($datax) && (count($datax) != count($datay))) { + JpGraphError::RaiseL(20003);//("Scatterplot must have equal number of X and Y points."); + } + parent::__construct($datay, $datax); $this->mark = new PlotMark(); $this->mark->SetType(MARK_SQUARE); $this->mark->SetColor($this->color); $this->value->SetAlign('center', 'center'); $this->value->SetMargin(0); + $this->link = new LineProperty(1, 'black', 'solid'); + $this->link->iShow = false; } //--------------- @@ -183,12 +185,18 @@ class ScatterPlot extends Plot $this->impuls = $f; } - // Combine the scatter plot points with a line - public function SetLinkPoints($aFlag=true, $aColor="black", $aWeight=1) + public function SetStem($f=true) { - $this->linkpoints=$aFlag; - $this->linkpointcolor=$aColor; - $this->linkpointweight=$aWeight; + $this->impuls = $f; + } + + // Combine the scatter plot points with a line + public function SetLinkPoints($aFlag=true, $aColor="black", $aWeight=1, $aStyle='solid') + { + $this->link->iShow = $aFlag; + $this->link->iColor = $aColor; + $this->link->iWeight = $aWeight; + $this->link->iStyle = $aStyle; } public function Stroke($img, $xscale, $yscale) @@ -199,11 +207,11 @@ class ScatterPlot extends Plot } else { $yzero=$yscale->scale_abs[0]; } - + $this->csimareas = ''; for ($i=0; $i<$this->numpoints; ++$i) { - // Skip null values + // Skip null values if ($this->coords[0][$i]==='' || $this->coords[0][$i]==='-' || $this->coords[0][$i]==='x') { continue; } @@ -216,10 +224,12 @@ class ScatterPlot extends Plot $yt = $yscale->Translate($this->coords[0][$i]); - if ($this->linkpoints && isset($yt_old)) { - $img->SetColor($this->linkpointcolor); - $img->SetLineWeight($this->linkpointweight); - $img->Line($xt_old, $yt_old, $xt, $yt); + if ($this->link->iShow && isset($yt_old)) { + $img->SetColor($this->link->iColor); + $img->SetLineWeight($this->link->iWeight); + $old = $img->SetLineStyle($this->link->iStyle); + $img->StyleLine($xt_old, $yt_old, $xt, $yt); + $img->SetLineStyle($old); } if ($this->impuls) { @@ -227,7 +237,7 @@ class ScatterPlot extends Plot $img->SetLineWeight($this->weight); $img->Line($xt, $yzero, $xt, $yt); } - + if (!empty($this->csimtargets[$i])) { if (!empty($this->csimwintargets[$i])) { $this->mark->SetCSIMTarget($this->csimtargets[$i], $this->csimwintargets[$i]); @@ -236,7 +246,7 @@ class ScatterPlot extends Plot } $this->mark->SetCSIMAlt($this->csimalts[$i]); } - + if (isset($this->coords[1])) { $this->mark->SetCSIMAltVal($this->coords[0][$i], $this->coords[1][$i]); } else { @@ -244,7 +254,7 @@ class ScatterPlot extends Plot } $this->mark->Stroke($img, $xt, $yt); - + $this->csimareas .= $this->mark->GetCSIMAreas(); $this->value->Stroke($img, $this->coords[0][$i], $xt, $yt); @@ -252,7 +262,7 @@ class ScatterPlot extends Plot $yt_old = $yt; } } - + // Framework function public function Legend($aGraph) { diff --git a/onyx2/include/jpgraph/jpgraph_stock.php b/onyx2/include/jpgraph/jpgraph_stock.php index 8943ad4..c5d6120 100644 --- a/onyx2/include/jpgraph/jpgraph_stock.php +++ b/onyx2/include/jpgraph/jpgraph_stock.php @@ -1,13 +1,13 @@ iTupleSize) { JpGraphError::RaiseL(21001, $this->iTupleSize); //('Data values for Stock charts must contain an even multiple of '.$this->iTupleSize.' data points.'); } - $this->Plot($datay, $datax); + parent::__construct($datay, $datax); $this->numpoints /= $this->iTupleSize; } //--------------- // PUBLIC METHODS - + public function SetColor($aColor, $aColor1='white', $aColor2='darkred', $aColor3='darkred') { $this->color = $aColor; @@ -67,7 +67,7 @@ class StockPlot extends Plot $graph->xaxis->scale->ticks->SetXLabelOffset($a); $graph->SetTextScaleOff($b); } - + // Method description public function Stroke($img, $xscale, $yscale) { @@ -78,9 +78,8 @@ class StockPlot extends Plot if (isset($this->coords[1])) { if (count($this->coords[1])!=$n) { JpGraphError::RaiseL(2003, count($this->coords[1]), $n); - } - //("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); - else { + // ("Number of X and Y points are not equal. Number of X-points:".count($this->coords[1])." Number of Y-points:$numpoints"); + } else { $exist_x = true; } } else { @@ -92,23 +91,26 @@ class StockPlot extends Plot } else { $xs=0; } - + $ts = $this->iTupleSize; $this->csimareas = ''; for ($i=0; $i<$n; ++$i) { - //If value is NULL, then don't draw a bar at all - if ($this->coords[0][$i] === null) { + //If value is NULL, then don't draw a bar at all + if ($this->coords[0][$i*$ts] === null) { continue; } if ($exist_x) { $x=$this->coords[1][$i]; + if ($x === null) { + continue; + } } else { $x=$i; } $xt = $xscale->Translate($x); - + $neg = $this->coords[0][$i*$ts] > $this->coords[0][$i*$ts+1] ; $yopen = $yscale->Translate($this->coords[0][$i*$ts]); $yclose = $yscale->Translate($this->coords[0][$i*$ts+1]); @@ -131,7 +133,7 @@ class StockPlot extends Plot } else { $img->SetColor($this->color); } - + $img->Rectangle($xl, $yopen, $xr, $yclose); if ($yopen < $yclose) { @@ -157,8 +159,8 @@ class StockPlot extends Plot // Setup image maps if (!empty($this->csimtargets[$i])) { $this->csimareas.= 'csimareas .= ' href="'.$this->csimtargets[$i].'"'; if (!empty($this->csimalts[$i])) { $sval=$this->csimalts[$i]; @@ -183,10 +185,11 @@ class BoxPlot extends StockPlot { private $iPColor='black'; private $iNColor='white'; - public function BoxPlot($datay, $datax=false) + + public function __construct($datay, $datax=false) { $this->iTupleSize=5; - parent::StockPlot($datay, $datax); + parent::__construct($datay, $datax); } public function SetMedianColor($aPos, $aNeg) @@ -202,7 +205,7 @@ class BoxPlot extends StockPlot } else { $img->SetColor($this->iPColor); } - + $y = $yscale->Translate($this->coords[0][$i*5+4]); $img->Line($xl, $y, $xr, $y); } diff --git a/onyx2/include/jpgraph/jpgraph_table.php b/onyx2/include/jpgraph/jpgraph_table.php new file mode 100755 index 0000000..b6d8de5 --- /dev/null +++ b/onyx2/include/jpgraph/jpgraph_table.php @@ -0,0 +1,1502 @@ +iVal = new Text($aVal); + $this->iRow = $aRow; + $this->iCol = $aCol; + $this->iPRow = $aRow; // Initialiy each cell is its own parent + $this->iPCol = $aCol; + $this->iIconConstrain = array(-1,-1); + } + + public function Init($aTable) + { + $this->iTable = $aTable; + } + + public function SetCSIMTarget($aTarget, $aAlt='', $aWinTarget='') + { + $this->iCSIMtarget = $aTarget; + $this->iCSIMwintarget = $aWinTarget; + $this->iCSIMalt = $aAlt; + } + + public function GetCSIMArea() + { + if ($this->iCSIMtarget !== '') { + return $this->iCSIMArea; + } else { + return ''; + } + } + + public function SetImageConstrain($aType, $aVal) + { + if (!in_array($aType, array(TIMG_WIDTH, TIMG_HEIGHT))) { + JpGraphError::RaiseL(27015); + } + $this->iIconConstrain = array($aType,$aVal); + } + + public function SetCountryFlag($aFlag, $aScale=1.0, $aMix=100, $aStdSize=3) + { + $this->iIcon = new IconPlot(); + $this->iIcon->SetCountryFlag($aFlag, 0, 0, $aScale, $aMix, $aStdSize); + } + + public function SetImage($aFile, $aScale=1.0, $aMix=100) + { + $this->iIcon = new IconPlot($aFile, 0, 0, $aScale, $aMix); + } + + public function SetImageFromString($aStr, $aScale=1.0, $aMix=100) + { + $this->iIcon = new IconPlot("", 0, 0, $aScale, $aMix); + $this->iIcon->CreateFromString($aStr); + } + + public function SetRowColSpan($aRowSpan, $aColSpan) + { + $this->iRowSpan = $aRowSpan; + $this->iColSpan = $aColSpan; + $this->iMerged = true; + } + + public function SetMerged($aPRow, $aPCol, $aFlg=true) + { + $this->iMerged = $aFlg; + $this->iPRow=$aPRow; + $this->iPCol=$aPCol; + } + + public function IsMerged() + { + return $this->iMerged; + } + + public function SetNumberFormat($aF) + { + $this->iNumberFormat = $aF; + } + + public function Set($aTxt) + { + $this->iVal->Set($aTxt); + } + + public function SetFont($aFF, $aFS, $aFSize) + { + $this->iFF = $aFF; + $this->iFS = $aFS; + $this->iFSize = $aFSize; + $this->iVal->SetFont($aFF, $aFS, $aFSize); + } + + public function SetFillColor($aColor) + { + $this->iBGColor=$aColor; + } + + public function SetFontColor($aColor) + { + $this->iFontColor=$aColor; + } + + public function SetGridColor($aLeft, $aTop=null, $aBottom=null, $aRight=null) + { + if ($aLeft !== null) { + $this->iGridColor[0] = $aLeft; + } + if ($aTop !== null) { + $this->iGridColor[1] = $aTop; + } + if ($aBottom !== null) { + $this->iGridColor[2] = $aBottom; + } + if ($aRight !== null) { + $this->iGridColor[3] = $aRight; + } + } + + public function SetGridStyle($aLeft, $aTop=null, $aBottom=null, $aRight=null) + { + if ($aLeft !== null) { + $this->iGridStyle[0] = $aLeft; + } + if ($aTop !== null) { + $this->iGridStyle[1] = $aTop; + } + if ($aBottom !== null) { + $this->iGridStyle[2] = $aBottom; + } + if ($aRight !== null) { + $this->iGridStyle[3] = $aRight; + } + } + + public function SetGridWeight($aLeft=null, $aTop=null, $aBottom=null, $aRight=null) + { + $weight_arr = array($aLeft, $aTop, $aBottom, $aRight); + for ($i = 0; $i < count($weight_arr); $i++) { + if ($weight_arr[$i] === "") { + $weight_arr[$i] = 0; + } + } + if ($aLeft !== null) { + $this->iGridWeight[0] = $weight_arr[0]; + } + if ($aTop !== null) { + $this->iGridWeight[1] = $weight_arr[1]; + } + if ($aBottom !== null) { + $this->iGridWeight[2] = $weight_arr[2]; + } + if ($aRight !== null) { + $this->iGridWeight[3] = $weight_arr[3]; + } + } + + public function SetMargin($aLeft, $aRight, $aTop, $aBottom) + { + $this->iMarginLeft=$aLeft; + $this->iMarginRight=$aRight; + $this->iMarginTop=$aTop; + $this->iMarginBottom=$aBottom; + } + + public function GetWidth($aImg) + { + if ($this->iIcon !== null) { + if ($this->iIconConstrain[0] == TIMG_WIDTH) { + $this->iIcon->SetScale(1); + $tmp = $this->iIcon->GetWidthHeight(); + $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[0]); + } elseif ($this->iIconConstrain[0] == TIMG_HEIGHT) { + $this->iIcon->SetScale(1); + $tmp = $this->iIcon->GetWidthHeight(); + $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[1]); + } + $tmp = $this->iIcon->GetWidthHeight(); + $iwidth = $tmp[0]; + } else { + $iwidth=0; + } + if ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 0) { + $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetWidth($aImg); + } elseif ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 90) { + $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetFontHeight($aImg)+2; + } else { + $pwidth = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetWidth($aImg)+2; + } + + $pcolspan = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iColSpan; + return round(max($iwidth, $pwidth)/$pcolspan) + $this->iMarginLeft + $this->iMarginRight; + } + + public function GetHeight($aImg) + { + if ($this->iIcon !== null) { + if ($this->iIconConstrain[0] == TIMG_WIDTH) { + $this->iIcon->SetScale(1); + $tmp = $this->iIcon->GetWidthHeight(); + $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[0]); + } elseif ($this->iIconConstrain[0] == TIMG_HEIGHT) { + $this->iIcon->SetScale(1); + $tmp = $this->iIcon->GetWidthHeight(); + $this->iIcon->SetScale($this->iIconConstrain[1]/$tmp[1]); + } + $tmp = $this->iIcon->GetWidthHeight(); + $iheight = $tmp[1]; + } else { + $iheight = 0; + } + if ($this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->dir == 0) { + $pheight = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetHeight($aImg); + } else { + $pheight = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iVal->GetHeight($aImg)+1; + } + $prowspan = $this->iTable->iCells[$this->iPRow][$this->iPCol]->iRowSpan; + return round(max($iheight, $pheight)/$prowspan) + $this->iMarginTop + $this->iMarginBottom; + } + + public function SetAlign($aHorAlign='left', $aVertAlign='bottom') + { + $aHorAlign = strtolower($aHorAlign); + $aVertAlign = strtolower($aVertAlign); + $chk = array('left','right','center','bottom','top','middle'); + if (!in_array($aHorAlign, $chk) || !in_array($aVertAlign, $chk)) { + JpGraphError::RaiseL(27011, $aHorAlign, $aVertAlign); + } + $this->iVertAlign = $aVertAlign; + $this->iHorAlign = $aHorAlign; + } + + public function AdjustMarginsForGrid() + { + if ($this->iCol > 0) { + switch ($this->iGridStyle[0]) { + case TGRID_SINGLE: $wf=1; break; + case TGRID_DOUBLE: $wf=3; break; + case TGRID_DOUBLE2: $wf=4; break; + } + $this->iMarginLeft += $this->iGridWeight[0]*$wf; + } + if ($this->iRow > 0) { + switch ($this->iGridStyle[1]) { + case TGRID_SINGLE: $wf=1; break; + case TGRID_DOUBLE: $wf=3; break; + case TGRID_DOUBLE2: $wf=4; break; + } + $this->iMarginTop += $this->iGridWeight[1]*$wf; + } + if ($this->iRow+$this->iRowSpan-1 < $this->iTable->iSize[0]-1) { + switch ($this->iGridStyle[2]) { + case TGRID_SINGLE: $wf=1; break; + case TGRID_DOUBLE: $wf=3; break; + case TGRID_DOUBLE2: $wf=4; break; + } + $this->iMarginBottom += $this->iGridWeight[2]*$wf; + } + if ($this->iCol+$this->iColSpan-1 < $this->iTable->iSize[1]-1) { + switch ($this->iGridStyle[3]) { + case TGRID_SINGLE: $wf=1; break; + case TGRID_DOUBLE: $wf=3; break; + case TGRID_DOUBLE2: $wf=4; break; + } + $this->iMarginRight += $this->iGridWeight[3]*$wf; + } + } + + public function StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight, $aDir=1) + { + // Left or right grid line + // For the right we increase the X-pos and for the right we decrease it. This is + // determined by the direction argument. + $idx = $aDir==1 ? 0 : 3; + + // We don't stroke the grid lines that are on the edge of the table since this is + // the place of the border. + if ((($this->iCol > 0 && $idx==0) || ($this->iCol+$this->iColSpan-1 < $this->iTable->iSize[1]-1 && $idx==3)) + && $this->iGridWeight[$idx] > 0) { + $x = $aDir==1 ? $aX : $aX + $aWidth-1; + $y = $aY+$aHeight-1; + $aImg->SetColor($this->iGridColor[$idx]); + switch ($this->iGridStyle[$idx]) { + case TGRID_SINGLE: + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); + } + break; + + case TGRID_DOUBLE: + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); + } + $x += $this->iGridWeight[$idx]*2; + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); + } + break; + + case TGRID_DOUBLE2: + for ($i=0; $i < $this->iGridWeight[$idx]*2; ++$i) { + $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); + } + $x += $this->iGridWeight[$idx]*3; + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($x+$i*$aDir, $aY, $x+$i*$aDir, $y); + } + break; + } + } + } + + public function StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight, $aDir=1) + { + // Top or bottom grid line + // For the left we increase the X-pos and for the right we decrease it. This is + // determined by the direction argument. + $idx = $aDir==1 ? 1 : 2; + + // We don't stroke the grid lines that are on the edge of the table since this is + // the place of the border. + if ((($this->iRow > 0 && $idx==1) || ($this->iRow+$this->iRowSpan-1 < $this->iTable->iSize[0]-1 && $idx==2)) + && $this->iGridWeight[$idx] > 0) { + $y = $aDir==1 ? $aY : $aY+$aHeight-1; + $x = $aX+$aWidth-1; + $aImg->SetColor($this->iGridColor[$idx]); + switch ($this->iGridStyle[$idx]) { + case TGRID_SINGLE: + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($aX, $y+$i, $x, $y+$i); + } + break; + + case TGRID_DOUBLE: + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($aX, $y+$i, $x, $y+$i); + } + $y += $this->iGridWeight[$idx]*2; + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($aX, $y+$i, $x, $y+$i); + } + break; + + case TGRID_DOUBLE2: + for ($i=0; $i < $this->iGridWeight[$idx]*2; ++$i) { + $aImg->Line($aX, $y+$i, $x, $y+$i); + } + $y += $this->iGridWeight[$idx]*3; + for ($i=0; $i < $this->iGridWeight[$idx]; ++$i) { + $aImg->Line($aX, $y+$i, $x, $y+$i); + } + break; + } + } + } + + public function Stroke($aImg, $aX, $aY, $aWidth, $aHeight) + { + // If this is a merged cell we only stroke if it is the parent cell. + // The parent cell holds the merged cell block + if ($this->iMerged && ($this->iRow != $this->iPRow || $this->iCol != $this->iPCol)) { + return; + } + + if ($this->iBGColor != '') { + $aImg->SetColor($this->iBGColor); + $aImg->FilledRectangle($aX, $aY, $aX+$aWidth-1, $aY+$aHeight-1); + } + + $coords = $aX.','.$aY.','.($aX+$aWidth-1).','.$aY.','.($aX+$aWidth-1).','.($aY+$aHeight-1).','.$aX.','.($aY+$aHeight-1); + if (! empty($this->iCSIMtarget)) { + $this->iCSIMArea = 'iCSIMwintarget)) { + $this->iCSIMArea .= " target=\"".$this->iCSIMwintarget."\""; + } + if (! empty($this->iCSIMalt)) { + $this->iCSIMArea .= ' alt="'.$this->iCSIMalt.'" title="'.$this->iCSIMalt."\" "; + } + $this->iCSIMArea .= " />\n"; + } + + $this->StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight); + $this->StrokeVGrid($aImg, $aX, $aY, $aWidth, $aHeight, -1); + $this->StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight); + $this->StrokeHGrid($aImg, $aX, $aY, $aWidth, $aHeight, -1); + + if ($this->iIcon !== null) { + switch ($this->iHorAlign) { + case 'left': + $x = $aX+$this->iMarginLeft; + $hanchor='left'; + break; + case 'center': + case 'middle': + $x = $aX+$this->iMarginLeft+round(($aWidth-$this->iMarginLeft-$this->iMarginRight)/2); + $hanchor='center'; + break; + case 'right': + $x = $aX+$aWidth-$this->iMarginRight-1; + $hanchor='right'; + break; + default: + JpGraphError::RaiseL(27012, $this->iHorAlign); + } + + switch ($this->iVertAlign) { + case 'top': + $y = $aY+$this->iMarginTop; + $vanchor='top'; + break; + case 'center': + case 'middle': + $y = $aY+$this->iMarginTop+round(($aHeight-$this->iMarginTop-$this->iMarginBottom)/2); + $vanchor='center'; + break; + case 'bottom': + $y = $aY+$aHeight-1-$this->iMarginBottom; + $vanchor='bottom'; + break; + default: + JpGraphError::RaiseL(27012, $this->iVertAlign); + } + $this->iIcon->SetAnchor($hanchor, $vanchor); + $this->iIcon->_Stroke($aImg, $x, $y); + } + $this->iVal->SetColor($this->iFontColor); + $this->iVal->SetFont($this->iFF, $this->iFS, $this->iFSize); + switch ($this->iHorAlign) { + case 'left': + $x = $aX+$this->iMarginLeft; + break; + case 'center': + case 'middle': + $x = $aX+$this->iMarginLeft+round(($aWidth-$this->iMarginLeft-$this->iMarginRight)/2); + break; + case 'right': + $x = $aX+$aWidth-$this->iMarginRight-1; + break; + default: + JpGraphError::RaiseL(27012, $this->iHorAlign); + } + // A workaround for the shortcomings in the TTF font handling in GD + // The anchor position for rotated text (=90) is to "short" so we add + // an offset based on the actual font size + if ($this->iVal->dir != 0 && $this->iVal->font_family >= 10) { + $aY += 4 + round($this->iVal->font_size*0.8); + } + switch ($this->iVertAlign) { + case 'top': + $y = $aY+$this->iMarginTop; + break; + case 'center': + case 'middle': + $y = $aY+$this->iMarginTop+round(($aHeight-$this->iMarginTop-$this->iMarginBottom)/2); + //$y -= round($this->iVal->GetFontHeight($aImg)/2); + $y -= round($this->iVal->GetHeight($aImg)/2); + break; + case 'bottom': + //$y = $aY+$aHeight-1-$this->iMarginBottom-$this->iVal->GetFontHeight($aImg); + $y = $aY+$aHeight-$this->iMarginBottom-$this->iVal->GetHeight($aImg); + break; + default: + JpGraphError::RaiseL(27012, $this->iVertAlign); + } + $this->iVal->SetAlign($this->iHorAlign, 'top'); + if ($this->iNumberFormat !== null && is_numeric($this->iVal->t)) { + $this->iVal->t = sprintf($this->iNumberFormat, $this->iVal->t); + } + $this->iVal->Stroke($aImg, $x, $y); + } +} + +//--------------------------------------------------------------------- +// CLASS GTextTable +// Description: +// Graphic text table +//--------------------------------------------------------------------- +class GTextTable +{ + public $iCells = array(); + public $iSize=array(0,0); // Need to be public since they are used by the cell + private $iWidth=0; + private $iHeight=0; + private $iColWidth=null; + private $iRowHeight=null; + private $iImg=null; + private $iXPos=0; + private $iYPos=0; + private $iScaleXPos=null; + private $iScaleYPos=null; + private $iBGColor=''; + private $iBorderColor='black'; + private $iBorderWeight=1; + private $iInit=false; + private $iYAnchor='top'; + private $iXAnchor='left'; + /*----------------------------------------------------------------- + * First and second phase constructors + *----------------------------------------------------------------- + */ + public function __construct() + { + // Empty + } + + public function Init($aRows=0, $aCols=0, $aFillText='') + { + $this->iSize[0] = $aRows; + $this->iSize[1] = $aCols; + for ($i=0; $i < $this->iSize[0]; ++$i) { + for ($j=0; $j < $this->iSize[1]; ++$j) { + $this->iCells[$i][$j] = new GTextTableCell($aFillText, $i, $j); + $this->iCells[$i][$j]->Init($this); + } + } + $this->iInit=true; + } + + /*----------------------------------------------------------------- + * Outer border of table + *----------------------------------------------------------------- + */ + public function SetBorder($aWeight=1, $aColor='black') + { + $this->iBorderColor=$aColor; + $this->iBorderWeight = $aWeight; + } + + + /*----------------------------------------------------------------- + * Position in graph of table + *----------------------------------------------------------------- + */ + public function SetPos($aX, $aY) + { + $this->iXPos = $aX; + $this->iYPos = $aY; + } + + public function SetScalePos($aX, $aY) + { + $this->iScaleXPos = $aX; + $this->iScaleYPos = $aY; + } + + public function SetAnchorPos($aXAnchor, $aYAnchor='top') + { + $this->iXAnchor = $aXAnchor; + $this->iYAnchor = $aYAnchor; + } + + /*----------------------------------------------------------------- + * Setup country flag in a cell + *----------------------------------------------------------------- + */ + public function SetCellCountryFlag($aRow, $aCol, $aFlag, $aScale=1.0, $aMix=100, $aStdSize=3) + { + $this->_chkR($aRow); + $this->_chkC($aCol); + $this->iCells[$aRow][$aCol]->SetCountryFlag($aFlag, $aScale, $aMix, $aStdSize); + } + + /*----------------------------------------------------------------- + * Setup image in a cell + *----------------------------------------------------------------- + */ + public function SetCellImage($aRow, $aCol, $aFile, $aScale=1.0, $aMix=100) + { + $this->_chkR($aRow); + $this->_chkC($aCol); + $this->iCells[$aRow][$aCol]->SetImage($aFile, $aScale, $aMix); + } + + public function SetRowImage($aRow, $aFile, $aScale=1.0, $aMix=100) + { + $this->_chkR($aRow); + for ($j=0; $j < $this->iSize[1]; ++$j) { + $this->iCells[$aRow][$j]->SetImage($aFile, $aScale, $aMix); + } + } + + public function SetColImage($aCol, $aFile, $aScale=1.0, $aMix=100) + { + $this->_chkC($aCol); + for ($j=0; $j < $this->iSize[0]; ++$j) { + $this->iCells[$j][$aCol]->SetImage($aFile, $aScale, $aMix); + } + } + + public function SetImage($aFileR1, $aScaleC1=null, $aMixR2=null, $aC2=null, $aFile=null, $aScale=1.0, $aMix=100) + { + if ($aScaleC1 !== null && $aMixR2!==null && $aC2!==null && $aFile!==null) { + $this->_chkR($aArgR1); + $this->_chkC($aC1); + $this->_chkR($aR2); + $this->_chkC($aC2); + } else { + if ($aScaleC1 !== null) { + $aScale = $aScaleC1; + } + if ($aMixR2 !== null) { + $aMix = $aMixR2; + } + $aFile = $aFileR1; + $aMixR2 = $this->iSize[0]-1; + $aFileR1 = 0; + $aC2 = $this->iSize[1]-1; + $aScaleC1 = 0; + } + for ($i=$aArgR1; $i <= $aR2; ++$i) { + for ($j=$aC1; $j <= $aC2; ++$j) { + $this->iCells[$i][$j]->SetImage($aFile, $aScale, $aMix); + } + } + } + + public function SetCellImageConstrain($aRow, $aCol, $aType, $aVal) + { + $this->_chkR($aRow); + $this->_chkC($aCol); + $this->iCells[$aRow][$aCol]->SetImageConstrain($aType, $aVal); + } + + /*----------------------------------------------------------------- + * Generate a HTML version of the table + *----------------------------------------------------------------- + */ + public function toString() + { + $t = '
| '; + if ($this->iCells[$i][$j]->iMerged) { + $t .= 'M '; + } + $t .= 'val='.$this->iCells[$i][$j]->iVal->t; + $t .= ' (cs='.$this->iCells[$i][$j]->iColSpan. + ', rs='.$this->iCells[$i][$j]->iRowSpan.')'; + $t .= ' | '; + } + $t .= '
| JpGraph Fehler:
-HTTP header wurden bereits gesendet. Fehler in der Datei %s in der Zeile %d. |
| Erklrung: HTTP header wurden bereits zum Browser gesendet, wobei die Daten als Text gekennzeichnet wurden, bevor die Bibliothek die Chance hatte, seinen Bild-HTTP-Header zum Browser zu schicken. Dies verhindert, dass die Bibliothek Bilddaten zum Browser schicken kann (weil sie vom Browser als Text interpretiert wrden und daher nur Mist dargestellt wrde). Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrchen, die eventuell bereits zum Browser gesendet wurden. Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php". |
Wahrscheinlich steht Text im Skript bevor Graph::Stroke() aufgerufen wird. Wenn dieser Text zum Browser gesendet wird, nimmt dieser an, dass die gesamten Daten aus Text bestehen. Such nach irgendwelchem Text, auch nach Leerzeichen und Zeilenumbrüchen, die eventuell bereits zum Browser gesendet wurden.
Zum Beispiel ist ein oft auftretender Fehler, eine Leerzeile am Anfang der Datei oder vor Graph::Stroke() zu lassen."<?php".
JpGraph Error:
+10 => array('
Caused by output from file %s at 2012 => array('One of the objects submitted to AccBar is not a BarPlot. Make sure that you create the AccBar plot from an array of BarPlot objects. (Class=%s)',1), 2013 => array('You have specified an empty array for shadow colors in the bar plot.',0), 2014 => array('Number of datapoints for each data set in accbarplot must be the same',0), +2015 => array('Individual bar plots in an AccBarPlot or GroupBarPlot can not have specified X-coordinates',0), /* @@ -101,6 +102,7 @@ HTTP headers have already been sent. Caused by output from file %s at 6030 => array('Unknown arrow direction for link.',0), 6031 => array('Unknown arrow type for link.',0), 6032 => array('Internal error: Unknown path type (=%d) specified for link.',1), +6033 => array('Array of fonts must contain arrays with 3 elements, i.e. (Family, Style, Size)',0), /* ** jpgraph_gradient @@ -185,6 +187,7 @@ HTTP headers have already been sent. Caused by output from file %s at 15009 => array('Illegal pie plot. Sum of all data is zero for Pie Plot',0), 15010 => array('Sum of all data is 0 for Pie.',0), 15011 => array('In order to use image transformation you must include the file jpgraph_imgtrans.php in your script.',0), +15012 => array('PiePlot::SetTheme() is no longer supported. Use PieGraph::SetTheme()',0), /* ** jpgraph_plotband @@ -255,6 +258,7 @@ HTTP headers have already been sent. Caused by output from file %s at 24001 => array('FuncGenerator : No function specified. ',0), 24002 => array('FuncGenerator : Syntax error in function specification ',0), 24003 => array('DateScaleUtils: Unknown tick type specified in call to GetTicks()',0), +24004 => array('ReadCSV2: Column count mismatch in %s line %d',2), /* ** jpgraph */ @@ -398,7 +402,17 @@ HTTP headers have already been sent. Caused by output from file %s at 25127 => array('The library has been configured for automatic encoding conversion of Japanese fonts. This requires that PHP has the mb_convert_encoding() function. Your PHP installation lacks this function (PHP needs the "--enable-mbstring" when compiled).',0), 25128 => array('The function imageantialias() is not available in your PHP installation. Use the GD version that comes with PHP and not the standalone version.',0), 25129 => array('Anti-alias can not be used with dashed lines. Please disable anti-alias or use solid lines.',0), +25130 => array('Too small plot area. (%d x %d). With the given image size and margins there is to little space left for the plot. Increase the plot size or reduce the margins.',2), +25131 => array('StrokeBoxedText2() only supports TTF fonts and not built-in bitmap fonts.',0), +25132 => array('Undefined property %s.',1), +25133 => array('Use Graph::SetTheme() after Graph::SetScale().',0), + +/* +** jpgraph_led +*/ + +25500 => array('Multibyte strings must be enabled in the PHP installation in order to run the LED module so that the function mb_strlen() is available. See PHP documentation for more information.',0), /* **--------------------------------------------------------------------------------------------- @@ -476,7 +490,7 @@ HTTP headers have already been sent. Caused by output from file %s at /* ** PDF417 */ - +26000 => array('PDF417: The PDF417 module requires that the PHP installation must support the function bcmod(). This is normally enabled at compile time. See documentation for more information.',0), 26001 => array('PDF417: Number of Columns must be >= 1 and <= 30',0), 26002 => array('PDF417: Error level must be between 0 and 8',0), 26003 => array('PDF417: Invalid format for input data to encode with PDF417',0), @@ -494,5 +508,36 @@ HTTP headers have already been sent. Caused by output from file %s at 26015 => array('PDF417: Internal error. State transition table entry 0 is NULL. Entry 1 = (%s)',1), 26016 => array('PDF417: Internal error: Unrecognized state transition mode in decode.',0), +/* +** jpgraph_contour +*/ + +28001 => array('Third argument to Contour must be an array of colors.',0), +28002 => array('Number of colors must equal the number of isobar lines specified',0), +28003 => array('ContourPlot Internal Error: isobarHCrossing: Coloumn index too large (%d)',1), +28004 => array('ContourPlot Internal Error: isobarHCrossing: Row index too large (%d)',1), +28005 => array('ContourPlot Internal Error: isobarVCrossing: Row index too large (%d)',1), +28006 => array('ContourPlot Internal Error: isobarVCrossing: Col index too large (%d)',1), +28007 => array('ContourPlot interpolation factor is too large (>5)',0), + +/* + * jpgraph_matrix and colormap +*/ +29201 => array('Min range value must be less or equal to max range value for colormaps',0), +29202 => array('The distance between min and max value is too small for numerical precision',0), +29203 => array('Number of color quantification level must be at least %d',1), +29204 => array('Number of colors (%d) is invalid for this colormap. It must be a number that can be written as: %d + k*%d',3), +29205 => array('Colormap specification out of range. Must be an integer in range [0,%d]',1), +29206 => array('Invalid object added to MatrixGraph',0), +29207 => array('Empty input data specified for MatrixPlot',0), +29208 => array('Unknown side specifiction for matrix labels "%s"',1), +29209 => array('CSIM Target matrix must be the same size as the data matrix (csim=%d x %d, data=%d x %d)',4), +29210 => array('CSIM Target for matrix labels does not match the number of labels (csim=%d, labels=%d)',2), + + +/* +* jpgraph_theme +*/ +30001 => array("Theme::%s() is not defined. \nPlease make %s(\$graph) function in your theme classs.",2), ); diff --git a/onyx2/include/jpgraph/lang/prod.inc.php b/onyx2/include/jpgraph/lang/prod.inc.php index f7d4569..ab7ea87 100644 --- a/onyx2/include/jpgraph/lang/prod.inc.php +++ b/onyx2/include/jpgraph/lang/prod.inc.php @@ -4,9 +4,9 @@ // Description: Special localization file with the same error messages // for all errors. // Created: 2006-02-18 -// Ver: $Id: prod.inc.php 993 2008-03-30 21:17:41Z ljp $ +// Ver: $Id: prod.inc.php 1886 2009-10-01 23:30:16Z ljp $ // -// Copyright (c) Aditus Consulting. All rights reserved. +// Copyright (c) Asial Corporation. All rights reserved. //======================================================================== */ @@ -19,7 +19,7 @@ $_jpg_messages = array( /* ** Headers already sent error. This is formatted as HTML different since this will be sent back directly as text */ -10 => array('
|