Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHANCi8qDQpMaWNlbmNlIEZvciBkZXNpZ25zaG93LmlyDQpodHRwOi8..
Decoded Output download
?>b'<?php
/*
Licence For designshow.ir
http://designshow.ir/ */
if($_SERVER[\'HTTP_HOST\']!="www.icdst.org" && $_SERVER[\'HTTP_HOST\']!="icdst.org")
{
echo "{\'errors\':\' \'}";
di();
}
//Class Name : Persian Calendar Class
//Published Date: 2017/02/27
//Author Email : [email protected]
class Calendar
{
public $OutputText = "";
// ghamari month name show
function monthName($i) // $i = 1..12
{
static $month = array(
"", "", " ", " ",
" ", " ", "", "",
"", "", " ", " "
);
return $month[$i-1];
}
function GregorianToHijri($time = null)
{
if ($time === null) $time = time();
$m = date(\'m\', $time);
$d = date(\'d\', $time);
$y = date(\'Y\', $time);
return $this->JDToHijri(cal_to_jd(CAL_GREGORIAN, $m, $d, $y));
}
# Julian Day Count To Hijri
function JDToHijri($jd)
{
$jd = $jd - 1948440 + 10632;
$n = (int)(($jd - 1) / 10631);
$jd = $jd - 10631 * $n + 354;
$j = ((int)((10985 - $jd) / 5316)) *
((int)(50 * $jd / 17719)) +
((int)($jd / 5670)) *
((int)(43 * $jd / 15238));
$jd = $jd - ((int)((30 - $j) / 15)) *
((int)((17719 * $j) / 50)) -
((int)($j / 16)) *
((int)((15238 * $j) / 43)) + 29;
$m = (int)(24 * $jd / 709);
$d = $jd - (int)(709 * $m / 24);
$y = 30*$n + $j - 29;
return array($m, $d, $y);
}
# Hijri To Julian Day Count
function HijriToJD($m, $d, $y)
{
return (int)((11 * $y + 3) / 30) +
354 * $y + 30 * $m -
(int)(($m - 1) / 2) + $d + 1948440 - 385;
}
// ghamri end
function ReturnMonthName($monname)
{
switch ($monname)
{
case 1:
return "";
break;
case 2:
return "";
break;
case 3:
return "";
break;
case 4:
return "";
break;
case 5:
return "";
break;
case 6:
return "";
break;
case 7:
return "";
break;
case 8:
return "";
break;
case 9:
return "";
break;
case 10:
return "";
break;
case 11:
return "";
break;
case 12:
return "";
break;
}
}
function div($a,$b)
{
return (int) ($a / $b);
}
function gregorian_to_jalali ($g_y, $g_m, $g_d)
{
$g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$gy = $g_y-1600;
$gm = $g_m-1;
$gd = $g_d-1;
$g_day_no = 365*$gy+$this->div($gy+3,4)-$this->div($gy+99,100)+$this->div($gy+399,400);
for ($i=0; $i < $gm; ++$i)
$g_day_no += $g_days_in_month[$i];
if ($gm>1 && (($gy%4==0 && $gy%100!=0) || ($gy%400==0)))
/* leap and after Feb */
$g_day_no++;
$g_day_no += $gd;
$j_day_no = $g_day_no-79;
$j_np = $this->div($j_day_no, 12053); /* 12053 = 365*33 + 32/4 */
$j_day_no = $j_day_no % 12053;
$jy = 979+33*$j_np+4*$this->div($j_day_no,1461); /* 1461 = 365*4 + 4/4 */
$j_day_no %= 1461;
if ($j_day_no >= 366) {
$jy += $this->div($j_day_no-1, 365);
$j_day_no = ($j_day_no-1)%365;
}
for ($i = 0; $i < 11 && $j_day_no >= $j_days_in_month[$i]; ++$i)
$j_day_no -= $j_days_in_month[$i];
$jm = $i+1;
$jd = $j_day_no+1;
return array($jy, $jm, $jd);
}
function jalali_to_gregorian($j_y, $j_m, $j_d)
{
$g_days_in_month = array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
$j_days_in_month = array(31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29);
$jy = $j_y-979;
$jm = $j_m-1;
$jd = $j_d-1;
$j_day_no = 365*$jy + $this->div($jy, 33)*8 + $this->div($jy%33+3, 4);
for ($i=0; $i < $jm; ++$i)
$j_day_no += $j_days_in_month[$i];
$j_day_no += $jd;
$g_day_no = $j_day_no+79;
$gy = 1600 + 400*$this->div($g_day_no, 146097); /* 146097 = 365*400 + 400/4 - 400/100 + 400/400 */
$g_day_no = $g_day_no % 146097;
$leap = true;
if ($g_day_no >= 36525) /* 36525 = 365*100 + 100/4 */
{
$g_day_no--;
$gy += 100*$this->div($g_day_no, 36524); /* 36524 = 365*100 + 100/4 - 100/100 */
$g_day_no = $g_day_no % 36524;
if ($g_day_no >= 365)
$g_day_no++;
else
$leap = false;
}
$gy += 4*$this->div($g_day_no, 1461); /* 1461 = 365*4 + 4/4 */
$g_day_no %= 1461;
if ($g_day_no >= 366) {
$leap = false;
$g_day_no--;
$gy += $this->div($g_day_no, 365);
$g_day_no = $g_day_no % 365;
}
for ($i = 0; $g_day_no >= $g_days_in_month[$i] + ($i == 1 && $leap); $i++)
$g_day_no -= $g_days_in_month[$i] + ($i == 1 && $leap);
$gm = $i+1;
$gd = $g_day_no+1;
return array($gy, $gm, $gd);
}
function EvaluateLeap($jyear)
{
list( $gyear, $gmonth, $gday1 ) = jalali_to_gregorian($jyear, 12, 29);
list( $gyear, $gmonth, $gday2 ) = jalali_to_gregorian($jyear+1, 1, 1);
if ($gday2 - $gday1 > 1) return true; else return false;
}
function CalculateTotalDays($jyear,$jmonth)
{
switch ($jmonth)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
$TotalDays = 31;
break;
case 7:
case 8:
case 9:
case 10:
case 11:
$TotalDays = 30;
break;
case 12:
if (sLeapYear($jyear)=="false") $TotalDays = 30; else $TotalDays = 29;
$TotalDays = 29;
break;
}
return $TotalDays;
}
// action : \'next\'=>\'xml\' , \'preview\'=>\'xml\' ,\'now\'=>\'xml\' , \'simpleNow\'=>\'text/html\'
function ShowJalaliMonth($jyear,$jmonth,$action)
{
if ($action=="simpleNow")
{
$todaygyear = date("Y");
$todaygmonth = date("m");
$todaygday = date("d");
list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
$FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
$FirstDayArray = getdate($FirstDay);
$DayOfWeek = $FirstDayArray[\'wday\'];
switch ($DayOfWeek)
{
case 0:
$Difference = -1;
break;
case 1:
$Difference = -2;
break;
case 2:
$Difference = -3;
break;
case 3:
$Difference = -4;
break;
case 4:
$Difference = -5;
break;
case 5:
$Difference = -6;
break;
case 6:
$Difference = 0;
break;
}
for ($i=0;$i<6;$i++)
{
$Const = 7 * $i + $Difference;
$DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
$leap = $this->EvaluateLeap($jyear);
if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;
$Output = $Const + 7;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
$this->OutputText .= "><div>";
$this->OutputText .= $Output;
$this->OutputText .= "</div>";
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= "</div>";
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
// miladi
$this->OutputText .= $miladi[2];
$this->OutputText .= "</div>";
$this->OutputText .= "</div>";
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 6;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\' calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\' calColumn day holiday\'";
}
else
{
$this->OutputText .= "class=\' calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 5;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\' calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\' calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\' calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 4;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= "class=\' calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 3;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 2;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 1;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\' calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
}
echo $this->OutputText;
}
if ($action == "preview")
{
$previewShamsiDate = shamsi_preview_month($jyear,$jmonth);
$jyear = $previewShamsiDate[\'year\'];
$jmonth = $previewShamsiDate[\'month\'];
$calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
$miladitop = $calendar_top_items[\'miladi\'];
$ghamaritop = $calendar_top_items[\'ghamari\'];
$todaygyear = date("Y");
$todaygmonth = date("m");
$todaygday = date("d");
list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
$FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
$FirstDayArray = getdate($FirstDay);
$DayOfWeek = $FirstDayArray[\'wday\'];
switch ($DayOfWeek)
{
case 0:
$Difference = -1;
break;
case 1:
$Difference = -2;
break;
case 2:
$Difference = -3;
break;
case 3:
$Difference = -4;
break;
case 4:
$Difference = -5;
break;
case 5:
$Difference = -6;
break;
case 6:
$Difference = 0;
break;
}
for ($i=0;$i<6;$i++)
{
$Const = 7 * $i + $Difference;
$DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
$leap = $this->EvaluateLeap($jyear);
if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;
$Output = $Const + 7;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi =jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 6;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 5;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 4;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 3;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 2;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 1;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
}
// header("Content-type: text/xml; charset=UTF-8");
$_SESSION[\'sal\'] = $jyear;
$_SESSION[\'mah\'] = $jmonth;
$newsXML = new SimpleXMLElement("<calendar></calendar>");
$newsXML->addChild(\'tbl\', $this->OutputText);
$newsXML->addChild(\'miladitop\',$miladitop);
$newsXML->addChild(\'ghamaritop\',$ghamaritop);
$newsXML->addChild(\'topsal\',$jyear);
$newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
$newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));
echo $newsXML->asXML();
}
if ($action == "next")
{
$nextShamsiDate = shamsi_next_month($jyear,$jmonth);
$jyear = $nextShamsiDate[\'year\'];
$jmonth = $nextShamsiDate[\'month\'];
$calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
$miladitop = $calendar_top_items[\'miladi\'];
$ghamaritop = $calendar_top_items[\'ghamari\'];
$todaygyear = date("Y");
$todaygmonth = date("m");
$todaygday = date("d");
list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
$FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
$FirstDayArray = getdate($FirstDay);
$DayOfWeek = $FirstDayArray[\'wday\'];
switch ($DayOfWeek)
{
case 0:
$Difference = -1;
break;
case 1:
$Difference = -2;
break;
case 2:
$Difference = -3;
break;
case 3:
$Difference = -4;
break;
case 4:
$Difference = -5;
break;
case 5:
$Difference = -6;
break;
case 6:
$Difference = 0;
break;
}
for ($i=0;$i<6;$i++)
{
$Const = 7 * $i + $Difference;
$DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
$leap = $this->EvaluateLeap($jyear);
if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;
$Output = $Const + 7;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\' ";
if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 6;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 5;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 4;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 3;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 2;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 1;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\' ";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= "><div>";
$this->OutputText .= $Output;
$this->OutputText .= "</div>";
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= "</div>";
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= "</div>";
$this->OutputText .= "</div>";
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
}
// header("Content-type: text/xml; charset=UTF-8");
$_SESSION[\'sal\'] = $jyear;
$_SESSION[\'mah\'] = $jmonth;
$newsXML = new SimpleXMLElement("<calendar></calendar>");
$newsXML->addChild(\'tbl\', $this->OutputText);
$newsXML->addChild(\'miladitop\',$miladitop);
$newsXML->addChild(\'ghamaritop\',$ghamaritop);
$newsXML->addChild(\'topsal\',$jyear);
$newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
$newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));
echo $newsXML->asXML();
}
// today xml output start
if ($action=="now")
{
$calendar_top_items = get_top_miladi_and_ghamari($jyear,$jmonth);
$miladitop = $calendar_top_items[\'miladi\'];
$ghamaritop = $calendar_top_items[\'ghamari\'];
$todaygyear = date("Y");
$todaygmonth = date("m");
$todaygday = date("d");
list( $todayjyear, $todayjmonth, $todayjday ) = $this->gregorian_to_jalali($todaygyear, $todaygmonth, $todaygday);
list( $gyear, $gmonth, $gday ) = jalali_to_gregorian($jyear, $jmonth, 1);
$FirstDay = mktime(0,0,0,$gmonth,$gday,$gyear);
$FirstDayArray = getdate($FirstDay);
$DayOfWeek = $FirstDayArray[\'wday\'];
switch ($DayOfWeek)
{
case 0:
$Difference = -1;
break;
case 1:
$Difference = -2;
break;
case 2:
$Difference = -3;
break;
case 3:
$Difference = -4;
break;
case 4:
$Difference = -5;
break;
case 5:
$Difference = -6;
break;
case 6:
$Difference = 0;
break;
}
for ($i=0;$i<6;$i++)
{
$Const = 7 * $i + $Difference;
$DaysInMonth = $this->CalculateTotalDays($jyear,$jmonth);
$leap = $this->EvaluateLeap($jyear);
if (($jmonth == 12) && ($leap == true)) $DaysInMonth++;
$Output = $Const + 7;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2]) \'";
if (($Const + 7 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .= "<div class=\'calColumn\'></div>";
$Output = $Const + 6;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 6 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
$Output = $Const + 5;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .="<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 5 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
$Output = $Const + 4;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .="<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 4 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
$Output = $Const + 3;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .="<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 3 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
$Output = $Const + 2;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 2 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= " class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
$Output = $Const + 1;
if (($Output > 0) && ($Output <= $DaysInMonth)) {
$miladi = jalali_to_gregorian($jyear, $jmonth, $Output);
$hijri = gregorian_to_ghamari($miladi[0],$miladi[1],$miladi[2]);
$this->OutputText .= "<div onclick=\'showDay(this,$jyear,$jmonth,$Output,$miladi[0],$miladi[1],$miladi[2],$hijri[0],$hijri[1],$hijri[2])\'";
$holidayStatus = is_holiday($jyear,$jmonth,$Output);
if (($Const + 1 == $todayjday) && ($jmonth == $todayjmonth) && ($jyear == $todayjyear))
{
if ($holidayStatus=="yes")
{
$this->OutputText .= "class=\'calColumn today holiday\' ";
}
else
{
$this->OutputText .= "class=\'calColumn today\' ";
}
}
else
{
if ($holidayStatus=="yes")
{
$this->OutputText .= " class=\'calColumn day holiday\'";
}
else
{
$this->OutputText .= " class=\'calColumn day\'";
}
}
$this->OutputText .= \'><div>\';
$this->OutputText .= $Output;
$this->OutputText .= \'</div>\';
$this->OutputText .= "<div class=\'ghamari-date\'>";
// ghamari
$this->OutputText .= $hijri[2];
// ghamari
$this->OutputText .= \'</div>\';
// miladi
$this->OutputText .= "<div class=\'miladi-date\'>";
$miladiDay = jalali_to_gregorian($jyear, $jmonth, $Output);
// miladi
$this->OutputText .= $miladiDay[2];
$this->OutputText .= \'</div>\';
$this->OutputText .= \'</div>\';
}
else $this->OutputText .="<div class=\'calColumn\'></div>";
}
// header("Content-type: text/xml; charset=UTF-8");
$_SESSION[\'sal\'] = $jyear;
$_SESSION[\'mah\'] = $jmonth;
$newsXML = new SimpleXMLElement("<calendar></calendar>");
$newsXML->addChild(\'tbl\', $this->OutputText);
$newsXML->addChild(\'miladitop\',$miladitop);
$newsXML->addChild(\'ghamaritop\',$ghamaritop);
$newsXML->addChild(\'topsal\',$jyear);
$newsXML->addChild(\'topmah\',$this->ReturnMonthName($jmonth));
$newsXML->addChild(\'events\',get_month_events($jyear,$jmonth));
echo $newsXML->asXML();
}
// today xml output end
}
}
'
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCi8qDQpMaWNlbmNlIEZvciBkZXNpZ25zaG93LmlyDQpodHRwOi8vZGVzaWduc2hvdy5pci8gKi8NCg0KaWYoJF9TRVJWRVJbJ0hUVFBfSE9TVCddIT0id3d3LmljZHN0Lm9yZyIgICYmICAkX1NFUlZFUlsnSFRUUF9IT1NUJ10hPSJpY2RzdC5vcmciKQ0KICAgIHsNCiAgICAgICAgZWNobyAieydlcnJvcnMnOifZhNin24zYs9mG2LPbjCDYqNix2KfbjCDYp9uM2YYg2K/Yp9mF2YbZhyDbjNin2YHYqid9IjsNCiAgICAgICAgZGkoKTsNCiAgICB9DQovL0NsYXNzIE5hbWUgOiBQZXJzaWFuIENhbGVuZGFyIENsYXNzDQovL1B1Ymxpc2hlZCBEYXRlOiAyMDE3LzAyLzI3DQovL0F1dGhvciBFbWFpbCA6IGhlc2FtaTEzQHlhaG9vLmNvbQ0KDQoNCmNsYXNzIENhbGVuZGFyDQp7DQoNCiAgICBwdWJsaWMgJE91dHB1dFRleHQgPSAiIjsNCg0KLy8gZ2hhbWFyaSBtb250aCBuYW1lIHNob3cNCiAgICBmdW5jdGlvbiBtb250aE5hbWUoJGkpIC8vICRpID0gMS4uMTINCiAgICB7DQogICAgICAgIHN0YXRpYyAkbW9udGggID0gYXJyYXkoDQogICAgICAgICAgICAi2YXYrdix2YUiLCAi2LXZgdixIiwgItix2KjbjNi5INin2YTYp9mI2YQiLCAi2LHYqNuM2Lkg2KfZhNir2KfZhtuMIiwNCiAgICAgICAgICAgICLYrNmF2KfYr9mKINin2YTYp9mI2YTZiiIsICLYrNmF2KfYr9mKINin2YTYq9in2YbZitmHIiwgItix2KzYqCIsICLYtNi52KjYp9mGIiwNCiAgICAgICAgICAgICLYsdmF2LbYp9mGIiwgIti02YjYp9mEIiwgItiw24wg2KfZhNmC2LnYr9mHIiwgItiw24wg2KfZhNit2KzZhyINCiAgICAgICAgKTsNCiAgICAgICAgcmV0dXJuICRtb250aFskaS0xXTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBHcmVnb3JpYW5Ub0hpanJpKCR0aW1lID0gbnVsbCkNCiAgICB7DQogICAgICAgIGlmICgkdGltZSA9PT0gbnVsbCkgJHRpbWUgPSB0aW1lKCk7DQogICAgICAgICRtID0gZGF0ZSgnbScsICR0aW1lKTsNCiAgICAgICAgJGQgPSBkYXRlKCdkJywgJHRpbWUpOw0KICAgICAgICAkeSA9IGRhdGUoJ1knLCAkdGltZSk7DQoNCiAgICAgICAgcmV0dXJuICR0aGlzLT5KRFRvSGlqcmkoY2FsX3RvX2pkKENBTF9HUkVHT1JJQU4sICRtLCAkZCwgJHkpKTsNCiAgICB9DQoNCiAgICAjIEp1bGlhbiBEYXkgQ291bnQgVG8gSGlqcmkNCiAgICBmdW5jdGlvbiBKRFRvSGlqcmkoJGpkKQ0KICAgIHsNCiAgICAgICAgJGpkID0gJGpkIC0gMTk0ODQ0MCArIDEwNjMyOw0KICAgICAgICAkbiAgPSAoaW50KSgoJGpkIC0gMSkgLyAxMDYzMSk7DQogICAgICAgICRqZCA9ICRqZCAtIDEwNjMxICogJG4gKyAzNTQ7DQoNCiAgICAgICAgJGogID0gKChpbnQpKCgxMDk4NSAtICRqZCkgLyA1MzE2KSkgKg0KICAgICAgICAgICAgKChpbnQpKDUwICogJGpkIC8gMTc3MTkpKSArDQogICAgICAgICAgICAoKGludCkoJGpkIC8gNTY3MCkpICoNCiAgICAgICAgICAgICgoaW50KSg0MyAqICRqZCAvIDE1MjM4KSk7DQogICAgICAgICRqZCA9ICRqZCAtICgoaW50KSgoMzAgLSAkaikgLyAxNSkpICoNCiAgICAgICAgICAgICgoaW50KSgoMTc3MTkgKiAkaikgLyA1MCkpIC0NCiAgICAgICAgICAgICgoaW50KSgkaiAvIDE2KSkgKg0KICAgICAgICAgICAgKChpbnQpKCgxNTIzOCAqICRqKSAvIDQzKSkgKyAyOTsNCiAgICAgICAgJG0gID0gKGludCkoMjQgKiAkamQgLyA3MDkpOw0KICAgICAgICAkZCAgPSAkamQgLSAoaW50KSg3MDkgKiAkbSAvIDI0KTsNCiAgICAgICAgJHkgID0gMzAqJG4gKyAkaiAtIDI5Ow0KDQogICAgICAgIHJldHVybiBhcnJheSgkbSwgJGQsICR5KTsNCiAgICB9DQoNCiAgICAjIEhpanJpIFRvIEp1bGlhbiBEYXkgQ291bnQNCiAgICBmdW5jdGlvbiBIaWpyaVRvSkQoJG0sICRkLCAkeSkNCiAgICB7DQogICAgICAgIHJldHVybiAoaW50KSgoMTEgKiAkeSArIDMpIC8gMzApICsNCiAgICAgICAgMzU0ICogJHkgKyAzMCAqICRtIC0NCiAgICAgICAgKGludCkoKCRtIC0gMSkgLyAyKSArICRkICsgMTk0ODQ0MCAtIDM4NTsNCiAgICB9DQovLyBnaGFtcmkgZW5kDQogICAgDQogICAgZnVuY3Rpb24gUmV0dXJuTW9udGhOYW1lKCRtb25uYW1lKQ0KICAgIHsNCiAgICAgICAgICAgIHN3aXRjaCAoJG1vbm5hbWUpDQogICAgICAgICAgICB7DQogICAgICAgICAgICBjYXNlIDE6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2YHYsdmI2LHYr9mK2YYiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAyOiANCiAgICAgICAgICAgICAgICByZXR1cm4gItin2LHYr9mK2KjZh9i02KoiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAzOiANCiAgICAgICAgICAgICAgICByZXR1cm4gItiu2LHYr9in2K8iOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSA0OiANCiAgICAgICAgICAgICAgICByZXR1cm4gItiq2YrYsSI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDU6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2YXYsdiv2KfYryI7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDY6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2LTZh9ix2YrZiNixIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgNzogDQogICAgICAgICAgICAgICAgcmV0dXJuICLZhdmH2LEiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSA4OiANCiAgICAgICAgICAgICAgICByZXR1cm4gItii2KjYp9mGIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgOTogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYotiw2LEiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAxMDogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYr9mJIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgMTE6IA0KICAgICAgICAgICAgICAgIHJldHVybiAi2KjZh9mF2YYiOw0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgY2FzZSAxMjogDQogICAgICAgICAgICAgICAgcmV0dXJuICLYp9iz2YHZhtivIjsNCiAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkaXYoJGEsJGIpIA0KICAgIHsNCiAgICAgICAgcmV0dXJuIChpbnQpICgkYSAvICRiKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBncmVnb3JpYW5fdG9famFsYWxpICgkZ195LCAkZ19tLCAkZ19kKQ0KICAgIHsNCiAgICAgICAgJGdfZGF5c19pbl9tb250aCA9IGFycmF5KDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEpOw0KICAgICAgICAkal9kYXlzX2luX21vbnRoID0gYXJyYXkoMzEsIDMxLCAzMSwgMzEsIDMxLCAzMSwgMzAsIDMwLCAzMCwgMzAsIDMwLCAyOSk7ICAgICANCiAgICANCiAgICAgICAkZ3kgPSAkZ195LTE2MDA7DQogICAgICAgJGdtID0gJGdfbS0xOw0KICAgICAgICRnZCA9ICRnX2QtMTsNCiAgICANCiAgICAgICAkZ19kYXlfbm8gPSAzNjUqJGd5KyR0aGlzLT5kaXYoJGd5KzMsNCktJHRoaXMtPmRpdigkZ3krOTksMTAwKSskdGhpcy0+ZGl2KCRneSszOTksNDAwKTsNCiAgICANCiAgICAgICBmb3IgKCRpPTA7ICRpIDwgJGdtOyArKyRpKQ0KICAgICAgICAgICRnX2RheV9ubyArPSAkZ19kYXlzX2luX21vbnRoWyRpXTsNCiAgICAgICBpZiAoJGdtPjEgJiYgKCgkZ3klND09MCAmJiAkZ3klMTAwIT0wKSB8fCAoJGd5JTQwMD09MCkpKQ0KICAgICAgICAgIC8qIGxlYXAgYW5kIGFmdGVyIEZlYiAqLw0KICAgICAgICAgICRnX2RheV9ubysrOw0KICAgICAgICRnX2RheV9ubyArPSAkZ2Q7DQogICAgDQogICAgICAgJGpfZGF5X25vID0gJGdfZGF5X25vLTc5Ow0KICAgIA0KICAgICAgICRqX25wID0gJHRoaXMtPmRpdigkal9kYXlfbm8sIDEyMDUzKTsgLyogMTIwNTMgPSAzNjUqMzMgKyAzMi80ICovDQogICAgICAgJGpfZGF5X25vID0gJGpfZGF5X25vICUgMTIwNTM7DQogICAgDQogICAgICAgJGp5ID0gOTc5KzMzKiRqX25wKzQqJHRoaXMtPmRpdigkal9kYXlfbm8sMTQ2MSk7IC8qIDE0NjEgPSAzNjUqNCArIDQvNCAqLw0KICAgIA0KICAgICAgICRqX2RheV9ubyAlPSAxNDYxOw0KICAgIA0KICAgICAgIGlmICgkal9kYXlfbm8gPj0gMzY2KSB7DQogICAgICAgICAgJGp5ICs9ICR0aGlzLT5kaXYoJGpfZGF5X25vLTEsIDM2NSk7DQogICAgICAgICAgJGpfZGF5X25vID0gKCRqX2RheV9uby0xKSUzNjU7DQogICAgICAgfQ0KICAgIA0KICAgICAgIGZvciAoJGkgPSAwOyAkaSA8IDExICYmICRqX2RheV9ubyA+PSAkal9kYXlzX2luX21vbnRoWyRpXTsgKyskaSkNCiAgICAgICAgICAkal9kYXlfbm8gLT0gJGpfZGF5c19pbl9tb250aFskaV07DQogICAgICAgJGptID0gJGkrMTsNCiAgICAgICAkamQgPSAkal9kYXlfbm8rMTsNCiAgICANCiAgICAgICByZXR1cm4gYXJyYXkoJGp5LCAkam0sICRqZCk7DQogICAgfQ0KICAgIA0KICAgIGZ1bmN0aW9uIGphbGFsaV90b19ncmVnb3JpYW4oJGpfeSwgJGpfbSwgJGpfZCkNCiAgICB7DQogICAgICAgICRnX2RheXNfaW5fbW9udGggPSBhcnJheSgzMSwgMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxKTsNCiAgICAgICAgJGpfZGF5c19pbl9tb250aCA9IGFycmF5KDMxLCAzMSwgMzEsIDMxLCAzMSwgMzEsIDMwLCAzMCwgMzAsIDMwLCAzMCwgMjkpOw0KICAgICAgICANCiAgICAgICAkankgPSAkal95LTk3OTsNCiAgICAgICAkam0gPSAkal9tLTE7DQogICAgICAgJGpkID0gJGpfZC0xOw0KICAgIA0KICAgICAgICRqX2RheV9ubyA9IDM2NSokankgKyAkdGhpcy0+ZGl2KCRqeSwgMzMpKjggKyAkdGhpcy0+ZGl2KCRqeSUzMyszLCA0KTsNCiAgICAgICBmb3IgKCRpPTA7ICRpIDwgJGptOyArKyRpKQ0KICAgICAgICAgICRqX2RheV9ubyArPSAkal9kYXlzX2luX21vbnRoWyRpXTsNCiAgICANCiAgICAgICAkal9kYXlfbm8gKz0gJGpkOw0KICAgIA0KICAgICAgICRnX2RheV9ubyA9ICRqX2RheV9ubys3OTsNCiAgICANCiAgICAgICAkZ3kgPSAxNjAwICsgNDAwKiR0aGlzLT5kaXYoJGdfZGF5X25vLCAxNDYwOTcpOyAvKiAxNDYwOTcgPSAzNjUqNDAwICsgNDAwLzQgLSA0MDAvMTAwICsgNDAwLzQwMCAqLw0KICAgICAgICRnX2RheV9ubyA9ICRnX2RheV9ubyAlIDE0NjA5NzsNCiAgICANCiAgICAgICAkbGVhcCA9IHRydWU7DQogICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjUyNSkgLyogMzY1MjUgPSAzNjUqMTAwICsgMTAwLzQgKi8NCiAgICAgICB7DQogICAgICAgICAgJGdfZGF5X25vLS07DQogICAgICAgICAgJGd5ICs9IDEwMCokdGhpcy0+ZGl2KCRnX2RheV9ubywgIDM2NTI0KTsgLyogMzY1MjQgPSAzNjUqMTAwICsgMTAwLzQgLSAxMDAvMTAwICovDQogICAgICAgICAgJGdfZGF5X25vID0gJGdfZGF5X25vICUgMzY1MjQ7DQogICAgDQogICAgICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjUpDQogICAgICAgICAgICAgJGdfZGF5X25vKys7DQogICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICRsZWFwID0gZmFsc2U7DQogICAgICAgfQ0KICAgIA0KICAgICAgICRneSArPSA0KiR0aGlzLT5kaXYoJGdfZGF5X25vLCAxNDYxKTsgLyogMTQ2MSA9IDM2NSo0ICsgNC80ICovDQogICAgICAgJGdfZGF5X25vICU9IDE0NjE7DQogICAgDQogICAgICAgaWYgKCRnX2RheV9ubyA+PSAzNjYpIHsNCiAgICAgICAgICAkbGVhcCA9IGZhbHNlOw0KICAgIA0KICAgICAgICAgICRnX2RheV9uby0tOw0KICAgICAgICAgICRneSArPSAkdGhpcy0+ZGl2KCRnX2RheV9ubywgMzY1KTsNCiAgICAgICAgICAkZ19kYXlfbm8gPSAkZ19kYXlfbm8gJSAzNjU7DQogICAgICAgfQ0KICAgIA0KICAgICAgIGZvciAoJGkgPSAwOyAkZ19kYXlfbm8gPj0gJGdfZGF5c19pbl9tb250aFskaV0gKyAoJGkgPT0gMSAmJiAkbGVhcCk7ICRpKyspDQogICAgICAgICAgJGdfZGF5X25vIC09ICRnX2RheXNfaW5fbW9udGhbJGldICsgKCRpID09IDEgJiYgJGxlYXApOw0KICAgICAgICRnbSA9ICRpKzE7DQogICAgICAgJGdkID0gJGdfZGF5X25vKzE7DQogICAgDQogICAgICAgcmV0dXJuIGFycmF5KCRneSwgJGdtLCAkZ2QpOw0KICAgIH0NCiAgICANCiAgICBmdW5jdGlvbiBFdmFsdWF0ZUxlYXAoJGp5ZWFyKQ0KICAgIHsNCiAgICAgICAgbGlzdCggJGd5ZWFyLCAkZ21vbnRoLCAkZ2RheTEgKSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAxMiwgMjkpOw0KICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5MiApID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIrMSwgMSwgMSk7DQogICAgICAgIGlmICgkZ2RheTIgLSAkZ2RheTEgPiAxKSByZXR1cm4gdHJ1ZTsgZWxzZSByZXR1cm4gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gQ2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKQ0KICAgIHsNCiAgICAgICAgc3dpdGNoICgkam1vbnRoKQ0KICAgICAgICB7DQogICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICBjYXNlIDM6DQogICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICBjYXNlIDU6DQogICAgICAgICAgICBjYXNlIDY6DQogICAgICAgICAgICAkVG90YWxEYXlzID0gMzE7DQogICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIGNhc2UgNzoNCiAgICAgICAgICAgIGNhc2UgODoNCiAgICAgICAgICAgIGNhc2UgOToNCiAgICAgICAgICAgIGNhc2UgMTA6DQogICAgICAgICAgICBjYXNlIDExOg0KICAgICAgICAgICAgJFRvdGFsRGF5cyA9IDMwOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICBjYXNlIDEyOg0KICAgICAgICAgICAgaWYgKHNMZWFwWWVhcigkanllYXIpPT0iZmFsc2UiKSAkVG90YWxEYXlzID0gMzA7ICBlbHNlICRUb3RhbERheXMgPSAyOTsNCiAgICAgICAgICAgICRUb3RhbERheXMgPSAyOTsNCiAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQogICAgICAgIHJldHVybiAkVG90YWxEYXlzOw0KICAgIH0NCg0KDQoNCg0KDQogICAgLy8gYWN0aW9uIDogJ25leHQnPT4neG1sJyAgLCAgJ3ByZXZpZXcnPT4neG1sJyAgLCdub3cnPT4neG1sJyAsICdzaW1wbGVOb3cnPT4ndGV4dC9odG1sJw0KICAgIGZ1bmN0aW9uIFNob3dKYWxhbGlNb250aCgkanllYXIsJGptb250aCwkYWN0aW9uKQ0KICAgIHsNCg0KDQoNCg0KDQoNCiAgICAgICAgaWYgKCRhY3Rpb249PSJzaW1wbGVOb3ciKQ0KICAgICAgICB7DQogICAgICAgICAgICAkdG9kYXlneWVhciA9IGRhdGUoIlkiKTsNCiAgICAgICAgICAgICR0b2RheWdtb250aCA9IGRhdGUoIm0iKTsNCiAgICAgICAgICAgICR0b2RheWdkYXkgPSBkYXRlKCJkIik7DQogICAgICAgICAgICBsaXN0KCAkdG9kYXlqeWVhciwgJHRvZGF5am1vbnRoLCAkdG9kYXlqZGF5ICkgPSAkdGhpcy0+Z3JlZ29yaWFuX3RvX2phbGFsaSgkdG9kYXlneWVhciwgJHRvZGF5Z21vbnRoLCAkdG9kYXlnZGF5KTsNCiAgICAgICAgICAgIGxpc3QoICRneWVhciwgJGdtb250aCwgJGdkYXkgKSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAxKTsNCiAgICAgICAgICAgICRGaXJzdERheSA9IG1rdGltZSgwLDAsMCwkZ21vbnRoLCRnZGF5LCRneWVhcik7DQogICAgICAgICAgICAkRmlyc3REYXlBcnJheSA9IGdldGRhdGUoJEZpcnN0RGF5KTsNCiAgICAgICAgICAgICREYXlPZldlZWsgPSAkRmlyc3REYXlBcnJheVsnd2RheSddOw0KDQogICAgICAgICAgICBzd2l0Y2ggKCREYXlPZldlZWspDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0xOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTI7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMzsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC00Ow0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgNToNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNjsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSA2Og0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IDA7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgZm9yICgkaT0wOyRpPDY7JGkrKykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAkQ29uc3QgPSA3ICogJGkgKyAkRGlmZmVyZW5jZTsNCiAgICAgICAgICAgICAgICAkRGF5c0luTW9udGggPSAkdGhpcy0+Q2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAgICAkbGVhcCA9ICR0aGlzLT5FdmFsdWF0ZUxlYXAoJGp5ZWFyKTsNCiAgICAgICAgICAgICAgICBpZiAoKCRqbW9udGggPT0gMTIpICYmICgkbGVhcCA9PSB0cnVlKSkgJERheXNJbk1vbnRoKys7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2ICBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIj48ZGl2PiI7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjwvZGl2PiI7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNiA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9JyBjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nIGNhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nIGNhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNTsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDUgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPScgY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9JyBjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPScgY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDQ7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA0ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nIGNhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAxID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nIGNhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgZWNobyAkdGhpcy0+T3V0cHV0VGV4dDsNCiAgICAgICAgfQ0KDQoNCg0KICAgICAgICBpZiAoJGFjdGlvbiA9PSAicHJldmlldyIpDQogICAgICAgICB7DQoNCiAgICAgICAgICAgICAkcHJldmlld1NoYW1zaURhdGUgPSBzaGFtc2lfcHJldmlld19tb250aCgkanllYXIsJGptb250aCk7DQogICAgICAgICAgICAgJGp5ZWFyICAgPSAgJHByZXZpZXdTaGFtc2lEYXRlWyd5ZWFyJ107DQogICAgICAgICAgICAgJGptb250aCAgPSAgJHByZXZpZXdTaGFtc2lEYXRlWydtb250aCddOw0KDQogICAgICAgICAgICAgJGNhbGVuZGFyX3RvcF9pdGVtcyA9IGdldF90b3BfbWlsYWRpX2FuZF9naGFtYXJpKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAkbWlsYWRpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snbWlsYWRpJ107DQogICAgICAgICAgICAgJGdoYW1hcml0b3AgPSAkY2FsZW5kYXJfdG9wX2l0ZW1zWydnaGFtYXJpJ107DQoNCiAgICAgICAgICAgICAkdG9kYXlneWVhciA9IGRhdGUoIlkiKTsNCiAgICAgICAgICAgICAkdG9kYXlnbW9udGggPSBkYXRlKCJtIik7DQogICAgICAgICAgICAgJHRvZGF5Z2RheSA9IGRhdGUoImQiKTsNCiAgICAgICAgICAgICBsaXN0KCAkdG9kYXlqeWVhciwgJHRvZGF5am1vbnRoLCAkdG9kYXlqZGF5ICkgPSAkdGhpcy0+Z3JlZ29yaWFuX3RvX2phbGFsaSgkdG9kYXlneWVhciwgJHRvZGF5Z21vbnRoLCAkdG9kYXlnZGF5KTsNCiAgICAgICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5ICkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgMSk7DQogICAgICAgICAgICAgJEZpcnN0RGF5ID0gbWt0aW1lKDAsMCwwLCRnbW9udGgsJGdkYXksJGd5ZWFyKTsNCiAgICAgICAgICAgICAkRmlyc3REYXlBcnJheSA9IGdldGRhdGUoJEZpcnN0RGF5KTsNCiAgICAgICAgICAgICAkRGF5T2ZXZWVrID0gJEZpcnN0RGF5QXJyYXlbJ3dkYXknXTsNCg0KICAgICAgICAgICAgIHN3aXRjaCAoJERheU9mV2VlaykNCiAgICAgICAgICAgICB7DQoNCiAgICAgICAgICAgICAgICAgY2FzZSAwOg0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMTsNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBjYXNlIDE6DQogICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0yOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgMjoNCiAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTM7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgY2FzZSAzOg0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNDsNCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICBjYXNlIDQ6DQogICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC01Ow0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgIGNhc2UgNToNCiAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTY7DQogICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgY2FzZSA2Og0KICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAwOw0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgfQ0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgIGZvciAoJGk9MDskaTw2OyRpKyspDQogICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAkQ29uc3QgPSA3ICogJGkgKyAkRGlmZmVyZW5jZTsNCiAgICAgICAgICAgICAgICAgJERheXNJbk1vbnRoID0gJHRoaXMtPkNhbGN1bGF0ZVRvdGFsRGF5cygkanllYXIsJGptb250aCk7DQogICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgICBpZiAoKCRqbW9udGggPT0gMTIpICYmICgkbGVhcCA9PSB0cnVlKSkgJERheXNJbk1vbnRoKys7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDc7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPWphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQoNCg0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA1Ow0KICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNDsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDQgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAxID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkaGlqcmlbMl07DQogICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KICAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgIH0NCg0KDQoNCg0KDQovLyAgICAgICAgICAgICBoZWFkZXIoIkNvbnRlbnQtdHlwZTogdGV4dC94bWw7IGNoYXJzZXQ9VVRGLTgiKTsNCiAgICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgICRfU0VTU0lPTlsnbWFoJ10gPSAkam1vbnRoOw0KICAgICAgICAgICAgICRuZXdzWE1MID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoIjxjYWxlbmRhcj48L2NhbGVuZGFyPiIpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnbWlsYWRpdG9wJywkbWlsYWRpdG9wKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2doYW1hcml0b3AnLCRnaGFtYXJpdG9wKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2V2ZW50cycsZ2V0X21vbnRoX2V2ZW50cygkanllYXIsJGptb250aCkpOw0KICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndG9wbWFoJywkdGhpcy0+UmV0dXJuTW9udGhOYW1lKCRqbW9udGgpKTsNCiAgICAgICAgICAgICBlY2hvICRuZXdzWE1MLT5hc1hNTCgpOw0KDQoNCg0KDQogICAgICAgICB9DQoNCg0KDQoNCg0KICAgICAgICBpZiAoJGFjdGlvbiA9PSAibmV4dCIpDQogICAgICAgIHsNCg0KDQogICAgICAgICAgICAkbmV4dFNoYW1zaURhdGUgPSBzaGFtc2lfbmV4dF9tb250aCgkanllYXIsJGptb250aCk7DQoNCiAgICAgICAgICAgICRqeWVhciAgID0gICRuZXh0U2hhbXNpRGF0ZVsneWVhciddOw0KICAgICAgICAgICAgJGptb250aCAgPSAgJG5leHRTaGFtc2lEYXRlWydtb250aCddOw0KDQogICAgICAgICAgICAkY2FsZW5kYXJfdG9wX2l0ZW1zID0gZ2V0X3RvcF9taWxhZGlfYW5kX2doYW1hcmkoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgJG1pbGFkaXRvcCA9ICRjYWxlbmRhcl90b3BfaXRlbXNbJ21pbGFkaSddOw0KICAgICAgICAgICAgJGdoYW1hcml0b3AgPSAkY2FsZW5kYXJfdG9wX2l0ZW1zWydnaGFtYXJpJ107DQoNCiAgICAgICAgICAgICR0b2RheWd5ZWFyID0gZGF0ZSgiWSIpOw0KICAgICAgICAgICAgJHRvZGF5Z21vbnRoID0gZGF0ZSgibSIpOw0KICAgICAgICAgICAgJHRvZGF5Z2RheSA9IGRhdGUoImQiKTsNCiAgICAgICAgICAgIGxpc3QoICR0b2RheWp5ZWFyLCAkdG9kYXlqbW9udGgsICR0b2RheWpkYXkgKSA9ICR0aGlzLT5ncmVnb3JpYW5fdG9famFsYWxpKCR0b2RheWd5ZWFyLCAkdG9kYXlnbW9udGgsICR0b2RheWdkYXkpOw0KICAgICAgICAgICAgbGlzdCggJGd5ZWFyLCAkZ21vbnRoLCAkZ2RheSApID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsIDEpOw0KICAgICAgICAgICAgJEZpcnN0RGF5ID0gbWt0aW1lKDAsMCwwLCRnbW9udGgsJGdkYXksJGd5ZWFyKTsNCiAgICAgICAgICAgICRGaXJzdERheUFycmF5ID0gZ2V0ZGF0ZSgkRmlyc3REYXkpOw0KICAgICAgICAgICAgJERheU9mV2VlayA9ICRGaXJzdERheUFycmF5Wyd3ZGF5J107DQoNCiAgICAgICAgICAgIHN3aXRjaCAoJERheU9mV2VlaykNCiAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICBjYXNlIDA6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTE7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgMToNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMjsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSAyOg0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0zOw0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDM6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTQ7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIGNhc2UgNDoNCiAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgY2FzZSA1Og0KICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC02Ow0KICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICBjYXNlIDY6DQogICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gMDsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgICAgICBmb3IgKCRpPTA7JGk8NjskaSsrKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICRDb25zdCA9IDcgKiAkaSArICREaWZmZXJlbmNlOw0KICAgICAgICAgICAgICAgICREYXlzSW5Nb250aCA9ICR0aGlzLT5DYWxjdWxhdGVUb3RhbERheXMoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgIGlmICgoJGptb250aCA9PSAxMikgJiYgKCRsZWFwID09IHRydWUpKSAkRGF5c0luTW9udGgrKzsNCg0KDQoNCg0KICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA3Ow0KICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKScgIjsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDY7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICRob2xpZGF5U3RhdHVzID0gaXNfaG9saWRheSgkanllYXIsJGptb250aCwkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA1Ow0KICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNDsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDQgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDMgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMjsNCiAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICBpZiAoKCRDb25zdCArIDIgPT0gJHRvZGF5amRheSkgJiYgKCRqbW9udGggPT0gJHRvZGF5am1vbnRoKSAmJiAoJGp5ZWFyID09ICR0b2RheWp5ZWFyKSkNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KDQogICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyAiOw0KICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheSBob2xpZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPjxkaXY+IjsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjwvZGl2PiI7DQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8L2Rpdj4iOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCg0KICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPC9kaXY+IjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCiAgICAgICAgICAgICAgICANCg0KICAgICAgICAgICAgfQ0KDQoNCg0KDQoNCi8vICAgICAgICAgICAgaGVhZGVyKCJDb250ZW50LXR5cGU6IHRleHQveG1sOyBjaGFyc2V0PVVURi04Iik7DQogICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgJF9TRVNTSU9OWydtYWgnXSA9ICRqbW9udGg7DQogICAgICAgICAgICAkbmV3c1hNTCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCI8Y2FsZW5kYXI+PC9jYWxlbmRhcj4iKTsNCiAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCdtaWxhZGl0b3AnLCRtaWxhZGl0b3ApOw0KICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCdnaGFtYXJpdG9wJywkZ2hhbWFyaXRvcCk7DQogICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnZXZlbnRzJyxnZXRfbW9udGhfZXZlbnRzKCRqeWVhciwkam1vbnRoKSk7DQogICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcG1haCcsJHRoaXMtPlJldHVybk1vbnRoTmFtZSgkam1vbnRoKSk7DQoNCiAgICAgICAgICAgIGVjaG8gJG5ld3NYTUwtPmFzWE1MKCk7DQoNCg0KDQoNCg0KDQoNCg0KICAgICAgICB9DQoNCg0KDQoNCg0KDQogICAgICAgIC8vIHRvZGF5IHhtbCBvdXRwdXQgc3RhcnQNCiAgICAgICAgICBpZiAoJGFjdGlvbj09Im5vdyIpDQogICAgICAgICAgew0KDQoNCg0KICAgICAgICAgICAgICAkY2FsZW5kYXJfdG9wX2l0ZW1zID0gZ2V0X3RvcF9taWxhZGlfYW5kX2doYW1hcmkoJGp5ZWFyLCRqbW9udGgpOw0KICAgICAgICAgICAgICAkbWlsYWRpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snbWlsYWRpJ107DQogICAgICAgICAgICAgICRnaGFtYXJpdG9wID0gJGNhbGVuZGFyX3RvcF9pdGVtc1snZ2hhbWFyaSddOw0KDQogICAgICAgICAgICAgICR0b2RheWd5ZWFyID0gZGF0ZSgiWSIpOw0KICAgICAgICAgICAgICAkdG9kYXlnbW9udGggPSBkYXRlKCJtIik7DQogICAgICAgICAgICAgICR0b2RheWdkYXkgPSBkYXRlKCJkIik7DQogICAgICAgICAgICAgIGxpc3QoICR0b2RheWp5ZWFyLCAkdG9kYXlqbW9udGgsICR0b2RheWpkYXkgKSA9ICR0aGlzLT5ncmVnb3JpYW5fdG9famFsYWxpKCR0b2RheWd5ZWFyLCAkdG9kYXlnbW9udGgsICR0b2RheWdkYXkpOw0KICAgICAgICAgICAgICBsaXN0KCAkZ3llYXIsICRnbW9udGgsICRnZGF5ICkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgMSk7DQogICAgICAgICAgICAgICRGaXJzdERheSA9IG1rdGltZSgwLDAsMCwkZ21vbnRoLCRnZGF5LCRneWVhcik7DQogICAgICAgICAgICAgICRGaXJzdERheUFycmF5ID0gZ2V0ZGF0ZSgkRmlyc3REYXkpOw0KICAgICAgICAgICAgICAkRGF5T2ZXZWVrID0gJEZpcnN0RGF5QXJyYXlbJ3dkYXknXTsNCg0KICAgICAgICAgICAgICBzd2l0Y2ggKCREYXlPZldlZWspDQogICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgIGNhc2UgMDoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC0xOw0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgY2FzZSAxOg0KICAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTI7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIDI6DQogICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtMzsNCiAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGNhc2UgMzoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IC00Ow0KICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgICAgY2FzZSA0Og0KICAgICAgICAgICAgICAgICAgICAgICREaWZmZXJlbmNlID0gLTU7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgICBjYXNlIDU6DQogICAgICAgICAgICAgICAgICAgICAgJERpZmZlcmVuY2UgPSAtNjsNCiAgICAgICAgICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgICAgICAgIGNhc2UgNjoNCiAgICAgICAgICAgICAgICAgICAgICAkRGlmZmVyZW5jZSA9IDA7DQogICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgIH0NCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgZm9yICgkaT0wOyRpPDY7JGkrKykNCiAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgJENvbnN0ID0gNyAqICRpICsgJERpZmZlcmVuY2U7DQogICAgICAgICAgICAgICAgICAkRGF5c0luTW9udGggPSAkdGhpcy0+Q2FsY3VsYXRlVG90YWxEYXlzKCRqeWVhciwkam1vbnRoKTsNCiAgICAgICAgICAgICAgICAgICRsZWFwID0gJHRoaXMtPkV2YWx1YXRlTGVhcCgkanllYXIpOw0KICAgICAgICAgICAgICAgICAgaWYgKCgkam1vbnRoID09IDEyKSAmJiAoJGxlYXAgPT0gdHJ1ZSkpICREYXlzSW5Nb250aCsrOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNzsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSkgJyI7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA3ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KDQoNCg0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgNjsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyA2ID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCg0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgZWxzZSAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2IGNsYXNzPSdjYWxDb2x1bW4nPjwvZGl2PiI7DQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDU7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2IG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KDQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPjxkaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkT3V0cHV0Ow0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdnaGFtYXJpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRoaWpyaVsyXTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J21pbGFkaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGlEYXkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgLy8gbWlsYWRpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJG1pbGFkaURheVsyXTsNCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgICRPdXRwdXQgPSAkQ29uc3QgKyA0Ow0KICAgICAgICAgICAgICAgICAgaWYgKCgkT3V0cHV0ID4gMCkgJiYgKCRPdXRwdXQgPD0gJERheXNJbk1vbnRoKSkgew0KICAgICAgICAgICAgICAgICAgICAgICRtaWxhZGkgPSBqYWxhbGlfdG9fZ3JlZ29yaWFuKCRqeWVhciwgJGptb250aCwgJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgJGhpanJpID0gZ3JlZ29yaWFuX3RvX2doYW1hcmkoJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0pOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgNCA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQogICAgICAgICAgICAgICAgICAkT3V0cHV0ID0gJENvbnN0ICsgMzsNCiAgICAgICAgICAgICAgICAgIGlmICgoJE91dHB1dCA+IDApICYmICgkT3V0cHV0IDw9ICREYXlzSW5Nb250aCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgICRoaWpyaSA9IGdyZWdvcmlhbl90b19naGFtYXJpKCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdKTsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSI8ZGl2ICBvbmNsaWNrPSdzaG93RGF5KHRoaXMsJGp5ZWFyLCRqbW9udGgsJE91dHB1dCwkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSwkaGlqcmlbMF0sJGhpanJpWzFdLCRoaWpyaVsyXSknIjsNCiAgICAgICAgICAgICAgICAgICAgICAkaG9saWRheVN0YXR1cyA9IGlzX2hvbGlkYXkoJGp5ZWFyLCRqbW9udGgsJE91dHB1dCk7DQogICAgICAgICAgICAgICAgICAgICAgaWYgKCgkQ29uc3QgKyAzID09ICR0b2RheWpkYXkpICYmICgkam1vbnRoID09ICR0b2RheWptb250aCkgJiYgKCRqeWVhciA9PSAkdG9kYXlqeWVhcikpDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiB0b2RheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkaG9saWRheVN0YXR1cz09InllcyIpDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXkgaG9saWRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSciOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJz48ZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJE91dHB1dDsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nZ2hhbWFyaS1kYXRlJz4iOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkaGlqcmlbMl07DQogICAgICAgICAgICAgICAgICAgICAgLy8gZ2hhbWFyaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc8L2Rpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICI8ZGl2IGNsYXNzPSdtaWxhZGktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAkbWlsYWRpRGF5ID0gamFsYWxpX3RvX2dyZWdvcmlhbigkanllYXIsICRqbW9udGgsICRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIG1pbGFkaQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRtaWxhZGlEYXlbMl07DQoNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCg0KDQogICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICBlbHNlICR0aGlzLT5PdXRwdXRUZXh0IC49IjxkaXYgY2xhc3M9J2NhbENvbHVtbic+PC9kaXY+IjsNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDI7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgb25jbGljaz0nc2hvd0RheSh0aGlzLCRqeWVhciwkam1vbnRoLCRPdXRwdXQsJG1pbGFkaVswXSwkbWlsYWRpWzFdLCRtaWxhZGlbMl0sJGhpanJpWzBdLCRoaWpyaVsxXSwkaGlqcmlbMl0pJyI7DQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMiA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIHRvZGF5IGhvbGlkYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gdG9kYXknICI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGhvbGlkYXlTdGF0dXM9PSJ5ZXMiKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5IGhvbGlkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICIgY2xhc3M9J2NhbENvbHVtbiBkYXknIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgICAgICAgJE91dHB1dCA9ICRDb25zdCArIDE7DQogICAgICAgICAgICAgICAgICBpZiAoKCRPdXRwdXQgPiAwKSAmJiAoJE91dHB1dCA8PSAkRGF5c0luTW9udGgpKSB7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAkaGlqcmkgPSBncmVnb3JpYW5fdG9fZ2hhbWFyaSgkbWlsYWRpWzBdLCRtaWxhZGlbMV0sJG1pbGFkaVsyXSk7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgIG9uY2xpY2s9J3Nob3dEYXkodGhpcywkanllYXIsJGptb250aCwkT3V0cHV0LCRtaWxhZGlbMF0sJG1pbGFkaVsxXSwkbWlsYWRpWzJdLCRoaWpyaVswXSwkaGlqcmlbMV0sJGhpanJpWzJdKSciOw0KDQogICAgICAgICAgICAgICAgICAgICAgJGhvbGlkYXlTdGF0dXMgPSBpc19ob2xpZGF5KCRqeWVhciwkam1vbnRoLCRPdXRwdXQpOw0KICAgICAgICAgICAgICAgICAgICAgIGlmICgoJENvbnN0ICsgMSA9PSAkdG9kYXlqZGF5KSAmJiAoJGptb250aCA9PSAkdG9kYXlqbW9udGgpICYmICgkanllYXIgPT0gJHRvZGF5anllYXIpKQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gImNsYXNzPSdjYWxDb2x1bW4gdG9kYXkgaG9saWRheScgIjsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICJjbGFzcz0nY2FsQ29sdW1uIHRvZGF5JyAiOw0KICAgICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRob2xpZGF5U3RhdHVzPT0ieWVzIikNCiAgICAgICAgICAgICAgICAgICAgICAgICAgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIiBjbGFzcz0nY2FsQ29sdW1uIGRheSBob2xpZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiIGNsYXNzPSdjYWxDb2x1bW4gZGF5JyI7DQogICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICc+PGRpdj4nOw0KICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5PdXRwdXRUZXh0IC49ICRPdXRwdXQ7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gIjxkaXYgY2xhc3M9J2doYW1hcmktZGF0ZSc+IjsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBnaGFtYXJpDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJGhpanJpWzJdOw0KICAgICAgICAgICAgICAgICAgICAgIC8vIGdoYW1hcmkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAnPC9kaXY+JzsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAiPGRpdiBjbGFzcz0nbWlsYWRpLWRhdGUnPiI7DQogICAgICAgICAgICAgICAgICAgICAgJG1pbGFkaURheSA9IGphbGFsaV90b19ncmVnb3JpYW4oJGp5ZWFyLCAkam1vbnRoLCAkT3V0cHV0KTsNCiAgICAgICAgICAgICAgICAgICAgICAvLyBtaWxhZGkNCiAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+T3V0cHV0VGV4dCAuPSAkbWlsYWRpRGF5WzJdOw0KDQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQogICAgICAgICAgICAgICAgICAgICAgJHRoaXMtPk91dHB1dFRleHQgLj0gJzwvZGl2Pic7DQoNCiAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICAgIGVsc2UgJHRoaXMtPk91dHB1dFRleHQgLj0iPGRpdiBjbGFzcz0nY2FsQ29sdW1uJz48L2Rpdj4iOw0KDQoNCg0KDQoNCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICB9DQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KICAgICAgICAgICAgLy8gIGhlYWRlcigiQ29udGVudC10eXBlOiB0ZXh0L3htbDsgY2hhcnNldD1VVEYtOCIpOw0KICAgICAgICAgICAgICAkX1NFU1NJT05bJ3NhbCddID0gJGp5ZWFyOw0KICAgICAgICAgICAgICAkX1NFU1NJT05bJ21haCddID0gJGptb250aDsNCiAgICAgICAgICAgICAgJG5ld3NYTUwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgiPGNhbGVuZGFyPjwvY2FsZW5kYXI+Iik7DQogICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgndGJsJywgJHRoaXMtPk91dHB1dFRleHQpOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ21pbGFkaXRvcCcsJG1pbGFkaXRvcCk7DQogICAgICAgICAgICAgICRuZXdzWE1MLT5hZGRDaGlsZCgnZ2hhbWFyaXRvcCcsJGdoYW1hcml0b3ApOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ3RvcHNhbCcsJGp5ZWFyKTsNCiAgICAgICAgICAgICAgJG5ld3NYTUwtPmFkZENoaWxkKCd0b3BtYWgnLCR0aGlzLT5SZXR1cm5Nb250aE5hbWUoJGptb250aCkpOw0KICAgICAgICAgICAgICAkbmV3c1hNTC0+YWRkQ2hpbGQoJ2V2ZW50cycsZ2V0X21vbnRoX2V2ZW50cygkanllYXIsJGptb250aCkpOw0KICAgICAgICAgICAgICBlY2hvICRuZXdzWE1MLT5hc1hNTCgpOw0KDQoNCiAgICAgICAgICB9DQogICAgICAgICAgLy8gdG9kYXkgeG1sIG91dHB1dCBlbmQNCg0KDQoNCg0KDQoNCg0KDQogICAgfQ0KfQ0KDQo=")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 9015b1fc6cb12136b50986101ff2eff2 |
Eval Count | 1 |
Decode Time | 139 ms |