<?php
 abstract class Worker{
 
    protected $payment;
    protected $drink;
    protected $produce;
   protected $grade;
  protected $description;
 
 
   protected function getPayment($grade) {
       if ($grade==1){
           return $this->payment;
       }
       else if($grade ==2)
       {
           return $this->payment*(1/4)+($this->payment);
       }
       else if($grade==3){
           return $this->payment*(1/2)+($this->payment);
       }
       else if($grade ==4){ return $this->payment*(1/2)+($this->payment);}
} 
protected function getProduce($grade){
     if ($grade!=4)
     return $this->produce;
     else return $this->produce*0;
 }
protected function getDrink($grade){
    if ($grade==4) return $this->drink+((1/2)*$this->drink);
   else  return $this->drink;
}
}
 
class Manager extends Worker{
 
    public $payment = 500;
      public $drink = 20;
   public $produce = 200;
  public function __construct($grade) {
      $this->payment = $this->getPayment($grade);
      $this->drink = $this ->getDrink($grade);
      $this ->produce = $this->getProduce($grade);
      $this->grade = $grade;
      $this->description = "me" . $grade;
 
   }
   public function getInfo(){
       $arr=[];
       $wrk = new Manager($this->grade);
       foreach($wrk as  $value){
           $arr[]=$value;
       }
       return $arr;
   }
}
 
class Marketer extends Worker{
 
    public $payment = 400;
      public $drink = 15;
   public $produce = 150;
  public function __construct($grade) {
        $this->payment = $this->getPayment($grade);
      $this->drink = $this ->getDrink($grade);
      $this ->produce = $this->getProduce($grade);
      $this->grade = $grade;
      $this->description = "ma" . $grade;
 
   }
 
   public function getInfo(){
       $arr=[];
       $wrk = new Marketer($this->grade);
       foreach($wrk as  $value){
           $arr[]=$value;
       }
       return $arr;
   }
}
class Engineer extends Worker{
   public $payment = 200;
      public $drink = 5;
   public $produce = 50;
 
  public function __construct($grade) {
      $this->payment = $this->getPayment($grade);
      $this->drink = $this ->getDrink($grade);
      $this ->produce = $this->getProduce($grade);
      $this->grade = $grade;
      $this->description = "en" . $grade;
 
   }
   public function getInfo(){
       $arr=[];
       $wrk = new Engineer($this->grade);
       foreach($wrk as  $value){
           $arr[]=$value;
       }
       return $arr;
   }
 
}
class Analyst extends Worker{
 
    public $payment = 800;
      public $drink = 50;
   public $produce = 5;
  public function __construct($grade) {
       $this->payment = $this->getPayment($grade);
      $this->drink = $this ->getDrink($grade);
      $this ->produce = $this->getProduce($grade);
      $this->grade = $grade;
      $this->description = "an" . $grade;
 
   }
public function getInfo(){
       $arr=[];
       $wrk = new Analyst($this->grade);
       foreach($wrk as  $value){
           $arr[]=$value;
       }
       return $arr;
   }
}
 
 
class Department{
 
    public function FirstDep(){
       $dep1 = [];
        for ($i=0;$i<9;$i++){
        $a=new Manager(1);
      $dep1[] = $a->getInfo();
 
        }
        for ($i=0;$i<3;$i++){
        $a=new Manager(2);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<2;$i++){
        $a=new Manager(3);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<2;$i++){
        $a=new Marketer(1);
      $dep1[] = $a->getInfo();
      }
        return $dep1;
    }
     public function SecondDep(){
       $dep1 = [];
        for ($i=0;$i<12;$i++){
        $a=new Manager(1);
      $dep1[] = $a->getInfo();
 
        }
        for ($i=0;$i<6;$i++){
        $a=new Marketer(1);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<3;$i++){
        $a=new Analyst(1);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<2;$i++){
        $a=new Analyst(2);
      $dep1[] = $a->getInfo();
      }
        return $dep1;
    }
     public function ThirdDep(){
       $dep1 = [];
        for ($i=0;$i<15;$i++){
        $a=new Marketer(1);
      $dep1[] = $a->getInfo();
 
        }
        for ($i=0;$i<10;$i++){
        $a=new Marketer(2);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<8;$i++){
        $a=new Manager(1);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<2;$i++){
        $a=new Engineer(1);
      $dep1[] = $a->getInfo();
      }
        return $dep1;
    }
     public function FourthDep(){
       $dep1 = [];
        for ($i=0;$i<13;$i++){
        $a=new Manager(1);
      $dep1[] = $a->getInfo();
 
        }
        for ($i=0;$i<5;$i++){
        $a=new Manager(2);
      $dep1[] = $a->getInfo();
      }
       for ($i=0;$i<5;$i++){
        $a=new Engineer(1);
      $dep1[] = $a->getInfo();
      } 
      return $dep1;
    }
 
 
    public function arraysum($var, $array){
        $sum=[];
 
 
 
foreach ($array as $value ){
for ($i=0;$i<count($value[$var]);$i++){     $sum[] =$value[$var];
}
    }
    }
 
    public function ArrayMiddle($number){
 
 
       $middle = new Department();
       $a= $middle->arraysum($number,$middle->FirstDep());
       $b= $middle->arraysum($number,$middle->SecondDep());
       $c= $middle->arraysum($number,$middle->ThirdDep());
       $d= $middle->arraysum($number,$middle->FourthDep());
       $sum = $a+$b+$c+$d;
    return $sum;
 
 
    }
 
}
 
  function padRight($string, $length){
 
      }
             function padLeft($string, $length){
              return $string;
        }
 
$firstdep = new Department();
 
 
$col1 = 30;
$col2 = 10;
echo"<pre>";
  echo   padRight("Департамент", $col1).
            padLeft("сотр", $col2).
          padLeft("тугр.", $col2).
            padLeft("кофе", $col2).
            padLeft("стр.", $col2). 
            padLeft("тугр./стр", $col2). " <br>";
 
for ($i=0;$i<50;$i++){
    echo "_ ";
}  
echo"<br>";
echo"<br>";
    echo padRight("Закупок", $col1).
            padLeft
(count($firstdep->FirstDep()), $col2).          padLeft($firstdep->arraysum(0,$firstdep->FirstDep()), $col2).
            padLeft($firstdep->arraysum(1,$firstdep->FirstDep()), $col2).
            padLeft($firstdep->arraysum(2,$firstdep->FirstDep()), $col2). 
            padLeft
(round($firstdep->arraysum(0,$firstdep->FirstDep())/$firstdep->arraysum(2,$firstdep->FirstDep())), $col2). " <br>"; 
echo"<br>";
    echo padRight("Продаж", $col1).
            padLeft
(count($firstdep->SecondDep()), $col2).          padLeft($firstdep->arraysum(0,$firstdep->SecondDep()), $col2).
            padLeft($firstdep->arraysum(1,$firstdep->SecondDep()), $col2).
            padLeft($firstdep->arraysum(2,$firstdep->SecondDep()), $col2). 
            padLeft
(round($firstdep->arraysum(0,$firstdep->SecondDep())/$firstdep->arraysum(2,$firstdep->SecondDep())), $col2). " <br>"; 
    echo"<br>";
    echo padRight("Рекламы", $col1).
            padLeft
(count($firstdep->ThirdDep()), $col2).          padLeft($firstdep->arraysum(0,$firstdep->ThirdDep()), $col2).
            padLeft($firstdep->arraysum(1,$firstdep->ThirdDep()), $col2).
            padLeft($firstdep->arraysum(2,$firstdep->ThirdDep()), $col2). 
            padLeft
(round($firstdep->arraysum(0,$firstdep->ThirdDep())/$firstdep->arraysum(2,$firstdep->ThirdDep())), $col2). " <br>"; 
     echo"<br>";
    echo padRight("Логистики", $col1).
            padLeft
(count($firstdep->FourthDep()), $col2).          padLeft($firstdep->arraysum(0,$firstdep->FourthDep()), $col2).
            padLeft($firstdep->arraysum(1,$firstdep->FourthDep()), $col2).
            padLeft($firstdep->arraysum(2,$firstdep->FourthDep()), $col2). 
            padLeft
(round($firstdep->arraysum(0,$firstdep->FourthDep())/$firstdep->arraysum(2,$firstdep->FourthDep())), $col2). " <br>"; 
     echo"<br>";
     $a =    (count($firstdep->FirstDep())+count($firstdep->SecondDep()) +count($firstdep->ThirdDep())+count($firstdep->FourthDep()));             echo padRight("Cреднее", $col1).
            padLeft($a/4, $col2).
          padLeft($firstdep->ArrayMiddle(0)/4, $col2).
            padLeft($firstdep->ArrayMiddle(1)/4, $col2).
            padLeft($firstdep->ArrayMiddle(2)/4, $col2). 
            padLeft
((round($firstdep->ArrayMiddle(0)/$firstdep->ArrayMiddle(2))), $col2). " <br>"; 
    echo padRight("Общее", $col1).
            padLeft($a, $col2).
          padLeft($firstdep->ArrayMiddle(0), $col2).
            padLeft($firstdep->ArrayMiddle(1), $col2).
            padLeft($firstdep->ArrayMiddle(2), $col2). 
            padLeft(12, $col2). " <br>";
 
 
 
				PD9waHAKIGFic3RyYWN0IGNsYXNzIFdvcmtlcnsKICAgIAogICAgcHJvdGVjdGVkICRwYXltZW50OwogICAgcHJvdGVjdGVkICRkcmluazsKICAgIHByb3RlY3RlZCAkcHJvZHVjZTsKICAgcHJvdGVjdGVkICRncmFkZTsKICBwcm90ZWN0ZWQgJGRlc2NyaXB0aW9uOwogCiAgICAgIAogICBwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGF5bWVudCgkZ3JhZGUpIHsKICAgICAgIGlmICgkZ3JhZGU9PTEpewogICAgICAgICAgIHJldHVybiAkdGhpcy0+cGF5bWVudDsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlID09MikKICAgICAgIHsKICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBheW1lbnQqKDEvNCkrKCR0aGlzLT5wYXltZW50KTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlPT0zKXsKICAgICAgICAgICByZXR1cm4gJHRoaXMtPnBheW1lbnQqKDEvMikrKCR0aGlzLT5wYXltZW50KTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYoJGdyYWRlID09NCl7IHJldHVybiAkdGhpcy0+cGF5bWVudCooMS8yKSsoJHRoaXMtPnBheW1lbnQpO30KfSAKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByb2R1Y2UoJGdyYWRlKXsKICAgICBpZiAoJGdyYWRlIT00KQogICAgIHJldHVybiAkdGhpcy0+cHJvZHVjZTsKICAgICBlbHNlIHJldHVybiAkdGhpcy0+cHJvZHVjZSowOwogfQpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RHJpbmsoJGdyYWRlKXsKICAgIGlmICgkZ3JhZGU9PTQpIHJldHVybiAkdGhpcy0+ZHJpbmsrKCgxLzIpKiR0aGlzLT5kcmluayk7CiAgIGVsc2UgIHJldHVybiAkdGhpcy0+ZHJpbms7Cn0KfQoKY2xhc3MgTWFuYWdlciBleHRlbmRzIFdvcmtlcnsKICAgCiAgICBwdWJsaWMgJHBheW1lbnQgPSA1MDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSAyMDsKICAgcHVibGljICRwcm9kdWNlID0gMjAwOwogIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkZ3JhZGUpIHsKICAgICAgJHRoaXMtPnBheW1lbnQgPSAkdGhpcy0+Z2V0UGF5bWVudCgkZ3JhZGUpOwogICAgICAkdGhpcy0+ZHJpbmsgPSAkdGhpcyAtPmdldERyaW5rKCRncmFkZSk7CiAgICAgICR0aGlzIC0+cHJvZHVjZSA9ICR0aGlzLT5nZXRQcm9kdWNlKCRncmFkZSk7CiAgICAgICR0aGlzLT5ncmFkZSA9ICRncmFkZTsKICAgICAgJHRoaXMtPmRlc2NyaXB0aW9uID0gIm1lIiAuICRncmFkZTsKICAgICAgCiAgIH0KICAgcHVibGljIGZ1bmN0aW9uIGdldEluZm8oKXsKICAgICAgICRhcnI9W107CiAgICAgICAkd3JrID0gbmV3IE1hbmFnZXIoJHRoaXMtPmdyYWRlKTsKICAgICAgIGZvcmVhY2goJHdyayBhcyAgJHZhbHVlKXsKICAgICAgICAgICAkYXJyW109JHZhbHVlOwogICAgICAgfQogICAgICAgcmV0dXJuICRhcnI7CiAgIH0KfQoKY2xhc3MgTWFya2V0ZXIgZXh0ZW5kcyBXb3JrZXJ7CiAgIAogICAgcHVibGljICRwYXltZW50ID0gNDAwOwogICAgICBwdWJsaWMgJGRyaW5rID0gMTU7CiAgIHB1YmxpYyAkcHJvZHVjZSA9IDE1MDsKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGdyYWRlKSB7CiAgICAgICAgJHRoaXMtPnBheW1lbnQgPSAkdGhpcy0+Z2V0UGF5bWVudCgkZ3JhZGUpOwogICAgICAkdGhpcy0+ZHJpbmsgPSAkdGhpcyAtPmdldERyaW5rKCRncmFkZSk7CiAgICAgICR0aGlzIC0+cHJvZHVjZSA9ICR0aGlzLT5nZXRQcm9kdWNlKCRncmFkZSk7CiAgICAgICR0aGlzLT5ncmFkZSA9ICRncmFkZTsKICAgICAgJHRoaXMtPmRlc2NyaXB0aW9uID0gIm1hIiAuICRncmFkZTsKICAgICAgCiAgIH0KICAgCiAgIHB1YmxpYyBmdW5jdGlvbiBnZXRJbmZvKCl7CiAgICAgICAkYXJyPVtdOwogICAgICAgJHdyayA9IG5ldyBNYXJrZXRlcigkdGhpcy0+Z3JhZGUpOwogICAgICAgZm9yZWFjaCgkd3JrIGFzICAkdmFsdWUpewogICAgICAgICAgICRhcnJbXT0kdmFsdWU7CiAgICAgICB9CiAgICAgICByZXR1cm4gJGFycjsKICAgfQp9CmNsYXNzIEVuZ2luZWVyIGV4dGVuZHMgV29ya2VyewogICBwdWJsaWMgJHBheW1lbnQgPSAyMDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSA1OwogICBwdWJsaWMgJHByb2R1Y2UgPSA1MDsKCiAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRncmFkZSkgewogICAgICAkdGhpcy0+cGF5bWVudCA9ICR0aGlzLT5nZXRQYXltZW50KCRncmFkZSk7CiAgICAgICR0aGlzLT5kcmluayA9ICR0aGlzIC0+Z2V0RHJpbmsoJGdyYWRlKTsKICAgICAgJHRoaXMgLT5wcm9kdWNlID0gJHRoaXMtPmdldFByb2R1Y2UoJGdyYWRlKTsKICAgICAgJHRoaXMtPmdyYWRlID0gJGdyYWRlOwogICAgICAkdGhpcy0+ZGVzY3JpcHRpb24gPSAiZW4iIC4gJGdyYWRlOwogICAgICAKICAgfQogICBwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygpewogICAgICAgJGFycj1bXTsKICAgICAgICR3cmsgPSBuZXcgRW5naW5lZXIoJHRoaXMtPmdyYWRlKTsKICAgICAgIGZvcmVhY2goJHdyayBhcyAgJHZhbHVlKXsKICAgICAgICAgICAkYXJyW109JHZhbHVlOwogICAgICAgfQogICAgICAgcmV0dXJuICRhcnI7CiAgIH0KICAgCn0KY2xhc3MgQW5hbHlzdCBleHRlbmRzIFdvcmtlcnsKICAgCiAgICBwdWJsaWMgJHBheW1lbnQgPSA4MDA7CiAgICAgIHB1YmxpYyAkZHJpbmsgPSA1MDsKICAgcHVibGljICRwcm9kdWNlID0gNTsKICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGdyYWRlKSB7CiAgICAgICAkdGhpcy0+cGF5bWVudCA9ICR0aGlzLT5nZXRQYXltZW50KCRncmFkZSk7CiAgICAgICR0aGlzLT5kcmluayA9ICR0aGlzIC0+Z2V0RHJpbmsoJGdyYWRlKTsKICAgICAgJHRoaXMgLT5wcm9kdWNlID0gJHRoaXMtPmdldFByb2R1Y2UoJGdyYWRlKTsKICAgICAgJHRoaXMtPmdyYWRlID0gJGdyYWRlOwogICAgICAkdGhpcy0+ZGVzY3JpcHRpb24gPSAiYW4iIC4gJGdyYWRlOwogICAgICAKICAgfQpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5mbygpewogICAgICAgJGFycj1bXTsKICAgICAgICR3cmsgPSBuZXcgQW5hbHlzdCgkdGhpcy0+Z3JhZGUpOwogICAgICAgZm9yZWFjaCgkd3JrIGFzICAkdmFsdWUpewogICAgICAgICAgICRhcnJbXT0kdmFsdWU7CiAgICAgICB9CiAgICAgICByZXR1cm4gJGFycjsKICAgfQp9CgoKY2xhc3MgRGVwYXJ0bWVudHsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIEZpcnN0RGVwKCl7CiAgICAgICAkZGVwMSA9IFtdOwogICAgICAgIGZvciAoJGk9MDskaTw5OyRpKyspewogICAgICAgICRhPW5ldyBNYW5hZ2VyKDEpOwogICAgICAkZGVwMVtdID0gJGEtPmdldEluZm8oKTsKICAgICAgICAKICAgICAgICB9CiAgICAgICAgZm9yICgkaT0wOyRpPDM7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMik7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8MjskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigzKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBNYXJrZXRlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgICByZXR1cm4gJGRlcDE7CiAgICB9CiAgICAgcHVibGljIGZ1bmN0aW9uIFNlY29uZERlcCgpewogICAgICAgJGRlcDEgPSBbXTsKICAgICAgICBmb3IgKCRpPTA7JGk8MTI7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBmb3IgKCRpPTA7JGk8NjskaSsrKXsKICAgICAgICAkYT1uZXcgTWFya2V0ZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8MzskaSsrKXsKICAgICAgICAkYT1uZXcgQW5hbHlzdCgxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBBbmFseXN0KDIpOwogICAgICAkZGVwMVtdID0gJGEtPmdldEluZm8oKTsKICAgICAgfQogICAgICAgIHJldHVybiAkZGVwMTsKICAgIH0KICAgICBwdWJsaWMgZnVuY3Rpb24gVGhpcmREZXAoKXsKICAgICAgICRkZXAxID0gW107CiAgICAgICAgZm9yICgkaT0wOyRpPDE1OyRpKyspewogICAgICAgICRhPW5ldyBNYXJrZXRlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgICAgCiAgICAgICAgfQogICAgICAgIGZvciAoJGk9MDskaTwxMDskaSsrKXsKICAgICAgICAkYT1uZXcgTWFya2V0ZXIoMik7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICB9CiAgICAgICBmb3IgKCRpPTA7JGk8ODskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTwyOyRpKyspewogICAgICAgICRhPW5ldyBFbmdpbmVlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgICByZXR1cm4gJGRlcDE7CiAgICB9CiAgICAgcHVibGljIGZ1bmN0aW9uIEZvdXJ0aERlcCgpewogICAgICAgJGRlcDEgPSBbXTsKICAgICAgICBmb3IgKCRpPTA7JGk8MTM7JGkrKyl7CiAgICAgICAgJGE9bmV3IE1hbmFnZXIoMSk7CiAgICAgICRkZXAxW10gPSAkYS0+Z2V0SW5mbygpOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBmb3IgKCRpPTA7JGk8NTskaSsrKXsKICAgICAgICAkYT1uZXcgTWFuYWdlcigyKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0KICAgICAgIGZvciAoJGk9MDskaTw1OyRpKyspewogICAgICAgICRhPW5ldyBFbmdpbmVlcigxKTsKICAgICAgJGRlcDFbXSA9ICRhLT5nZXRJbmZvKCk7CiAgICAgIH0gCiAgICAgIHJldHVybiAkZGVwMTsKICAgIH0KICAgIAogICAgCiAgICBwdWJsaWMgZnVuY3Rpb24gYXJyYXlzdW0oJHZhciwgJGFycmF5KXsKICAgICAgICAkc3VtPVtdOwogICAgICAKICAgICAgIAogICAgICAgIApmb3JlYWNoICgkYXJyYXkgYXMgJHZhbHVlICl7CmZvciAoJGk9MDskaTxjb3VudCgkdmFsdWVbJHZhcl0pOyRpKyspewogICAgJHN1bVtdID0kdmFsdWVbJHZhcl07Cn0KICAgIH0KICAgIHJldHVybiBhcnJheV9zdW0oJHN1bSk7CiAgICB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBBcnJheU1pZGRsZSgkbnVtYmVyKXsKICAgICAgICAgCiAgICAgIAogICAgICAgJG1pZGRsZSA9IG5ldyBEZXBhcnRtZW50KCk7CiAgICAgICAkYT0gJG1pZGRsZS0+YXJyYXlzdW0oJG51bWJlciwkbWlkZGxlLT5GaXJzdERlcCgpKTsKICAgICAgICRiPSAkbWlkZGxlLT5hcnJheXN1bSgkbnVtYmVyLCRtaWRkbGUtPlNlY29uZERlcCgpKTsKICAgICAgICRjPSAkbWlkZGxlLT5hcnJheXN1bSgkbnVtYmVyLCRtaWRkbGUtPlRoaXJkRGVwKCkpOwogICAgICAgJGQ9ICRtaWRkbGUtPmFycmF5c3VtKCRudW1iZXIsJG1pZGRsZS0+Rm91cnRoRGVwKCkpOwogICAgICAgJHN1bSA9ICRhKyRiKyRjKyRkOwogICAgcmV0dXJuICRzdW07CiAgICAKICAgICAgICAKICAgIH0KICAgIAp9CgogIGZ1bmN0aW9uIHBhZFJpZ2h0KCRzdHJpbmcsICRsZW5ndGgpewogICAgICAgICAgICByZXR1cm4gJHN0cmluZy49IHN0cl9yZXBlYXQoIiAiLCAkbGVuZ3RoLW1iX3N0cmxlbigkc3RyaW5nKSk7CiAgICAgICAgICAgICAKICAgICAgfQogICAgICAgICAgICAgZnVuY3Rpb24gcGFkTGVmdCgkc3RyaW5nLCAkbGVuZ3RoKXsKJHN0cmluZyA9IHN0cl9yZXBlYXQoIiAiLCAkbGVuZ3RoLW1iX3N0cmxlbigkc3RyaW5nKSkgLiRzdHJpbmc7CiAgICAgICAgICAgICAgcmV0dXJuICRzdHJpbmc7CiAgICAgICAgfQoKJGZpcnN0ZGVwID0gbmV3IERlcGFydG1lbnQoKTsKCgokY29sMSA9IDMwOwokY29sMiA9IDEwOwplY2hvIjxwcmU+IjsKICBlY2hvICAgcGFkUmlnaHQoItCU0LXQv9Cw0YDRgtCw0LzQtdC90YIiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoItGB0L7RgtGAIiwgJGNvbDIpLgogICAgICAgICAgcGFkTGVmdCgi0YLRg9Cz0YAuIiwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCLQutC+0YTQtSIsICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgi0YHRgtGALiIsICRjb2wyKS4gCiAgICAgICAgICAgIHBhZExlZnQoItGC0YPQs9GALi/RgdGC0YAiLCAkY29sMikuICIgPGJyPiI7CiAgICAgICAgICAgICAKZm9yICgkaT0wOyRpPDUwOyRpKyspewogICAgZWNobyAiXyAiOwp9ICAKZWNobyI8YnI+IjsKZWNobyI8YnI+IjsKICAgIGVjaG8gcGFkUmlnaHQoItCX0LDQutGD0L/QvtC6IiwgJGNvbDEpLgogICAgICAgICAgICBwYWRMZWZ0KGNvdW50KCRmaXJzdGRlcC0+Rmlyc3REZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+Rmlyc3REZXAoKSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPmFycmF5c3VtKDEsJGZpcnN0ZGVwLT5GaXJzdERlcCgpKSwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+YXJyYXlzdW0oMiwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpLyRmaXJzdGRlcC0+YXJyYXlzdW0oMiwkZmlyc3RkZXAtPkZpcnN0RGVwKCkpKSwgJGNvbDIpLiAiIDxicj4iOwogICAgCmVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQn9GA0L7QtNCw0LYiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoY291bnQoJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgyLCRmaXJzdGRlcC0+U2Vjb25kRGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPlNlY29uZERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSkpLCAkY29sMikuICIgPGJyPiI7CiAgICAKICAgIGVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQoNC10LrQu9Cw0LzRiyIsICRjb2wxKS4KICAgICAgICAgICAgcGFkTGVmdChjb3VudCgkZmlyc3RkZXAtPlRoaXJkRGVwKCkpLCAkY29sMikuCiAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPlRoaXJkRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+VGhpcmREZXAoKSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKSwgJGNvbDIpLiAKICAgICAgICAgICAgcGFkTGVmdChyb3VuZCgkZmlyc3RkZXAtPmFycmF5c3VtKDAsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5UaGlyZERlcCgpKSksICRjb2wyKS4gIiA8YnI+IjsKICAgIAogICAgIGVjaG8iPGJyPiI7CiAgICBlY2hvIHBhZFJpZ2h0KCLQm9C+0LPQuNGB0YLQuNC60LgiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoY291bnQoJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSksICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgwLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgxLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5hcnJheXN1bSgyLCRmaXJzdGRlcC0+Rm91cnRoRGVwKCkpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KHJvdW5kKCRmaXJzdGRlcC0+YXJyYXlzdW0oMCwkZmlyc3RkZXAtPkZvdXJ0aERlcCgpKS8kZmlyc3RkZXAtPmFycmF5c3VtKDIsJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSkpLCAkY29sMikuICIgPGJyPiI7CiAgICAKICAgICBlY2hvIjxicj4iOwogICAgICRhID0gICAgKGNvdW50KCRmaXJzdGRlcC0+Rmlyc3REZXAoKSkrY291bnQoJGZpcnN0ZGVwLT5TZWNvbmREZXAoKSkgK2NvdW50KCRmaXJzdGRlcC0+VGhpcmREZXAoKSkrY291bnQoJGZpcnN0ZGVwLT5Gb3VydGhEZXAoKSkpOwogICAgICAgICAgICBlY2hvIHBhZFJpZ2h0KCJD0YDQtdC00L3QtdC1IiwgJGNvbDEpLgogICAgICAgICAgICBwYWRMZWZ0KCRhLzQsICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgwKS80LCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgxKS80LCAkY29sMikuCiAgICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgyKS80LCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KChyb3VuZCgkZmlyc3RkZXAtPkFycmF5TWlkZGxlKDApLyRmaXJzdGRlcC0+QXJyYXlNaWRkbGUoMikpKSwgJGNvbDIpLiAiIDxicj4iOwoKICAgIGVjaG8gcGFkUmlnaHQoItCe0LHRidC10LUiLCAkY29sMSkuCiAgICAgICAgICAgIHBhZExlZnQoJGEsICRjb2wyKS4KICAgICAgICAgIHBhZExlZnQoJGZpcnN0ZGVwLT5BcnJheU1pZGRsZSgwKSwgJGNvbDIpLgogICAgICAgICAgICBwYWRMZWZ0KCRmaXJzdGRlcC0+QXJyYXlNaWRkbGUoMSksICRjb2wyKS4KICAgICAgICAgICAgcGFkTGVmdCgkZmlyc3RkZXAtPkFycmF5TWlkZGxlKDIpLCAkY29sMikuIAogICAgICAgICAgICBwYWRMZWZ0KDEyLCAkY29sMikuICIgPGJyPiI7CgogICAgCg==