<?php
// your code goes here<?php
class Worker
{
public $occupation; // профессия
public $ifChief;
public $rank; // ранг
public $coffeeAmount;
public $salary;
public $reportPages;
public function __construct($occupation, $ifChief, $rank)
{
$this->occupation = $occupation;
$this->ifChief = $ifChief;
$this->rank = $rank;
}
public function getSalary()
{
$salary = 0;
switch ($this->occupation) { // зависимость зарплаты от профессии
case 'me':
$salary += 500;
break;
case 'ma':
$salary += 400;
break;
case 'en':
$salary += 200;
break;
case 'an':
$salary += 800;
break;
}
switch ($this->rank) { // зависимость зарплаты от ранга
case 2:
$salary *= 1.25;
break;
case 3:
$salary *= 1.5;
break;
default:
break;
}
if ($this->ifChief) {
$salary *= 1.5;
}
return $salary;
}
public function getCoffeeAmount()
{
$coffeeAmount = 0;
switch ($this->occupation) {
case 'me':
$coffeeAmount += 20;
break;
case 'ma':
$coffeeAmount += 15;
break;
case 'en':
$coffeeAmount += 5;
break;
case 'an':
$coffeeAmount += 50;
break;
}
if ($this->ifChief) {
$coffeeAmount *= 2;
}
return $coffeeAmount;
}
public function getReportPages()
{
$reportPages = 0;
switch ($this->occupation) {
case 'me':
$reportPages += 200;
break;
case 'ma':
$reportPages += 150;
break;
case 'en':
$reportPages += 50;
break;
case 'an':
$reportPages += 5;
break;
}
if ($this->ifChief) {
$reportPages = 0;
}
return $reportPages;
}
}
function fillArrayWithWorkers($array, $number, $occupation, $ifChief, $rank)
{
for ($i = 0; $i < $number; $i++) {
$array[$last+$i] = new Worker($occupation, $ifChief, $rank);
}
return $array;
}
$procurementDept = array(); // департамент закупок $procurementDept = fillArrayWithWorkers($procurementDept, 9, 'me', false, 1);
$procurementDept = fillArrayWithWorkers($procurementDept, 3, 'me', false, 2);
$procurementDept = fillArrayWithWorkers($procurementDept, 2, 'me', false, 3);
$procurementDept = fillArrayWithWorkers($procurementDept, 2, 'ma', false, 1);
$procurementDept = fillArrayWithWorkers($procurementDept, 1, 'me', true, 2);
$sailsDept = fillArrayWithWorkers($sailsDept, 12, 'me', false, 1);
$sailsDept = fillArrayWithWorkers($sailsDept, 6, 'ma', false, 1);
$sailsDept = fillArrayWithWorkers($sailsDept, 3, 'an', false, 1);
$sailsDept = fillArrayWithWorkers($sailsDept, 2, 'an', false, 2);
$sailsDept = fillArrayWithWorkers($sailsDept, 1, 'ma', true, 2);
$adsDept = fillArrayWithWorkers($adsDept, 15, 'ma', false, 1);
$adsDept = fillArrayWithWorkers($adsDept, 10, 'ma', false, 2);
$adsDept = fillArrayWithWorkers($adsDept, 8, 'me', false, 1);
$adsDept = fillArrayWithWorkers($adsDept, 2, 'en', false, 1);
$adsDept = fillArrayWithWorkers($adsDept, 1, 'ma', true, 3);
$logisticDept = fillArrayWithWorkers($logisticDept, 13, 'me', false, 1);
$logisticDept = fillArrayWithWorkers($logisticDept, 5, 'me', false, 2);
$logisticDept = fillArrayWithWorkers($logisticDept, 5, 'en', false, 1);
$logisticDept = fillArrayWithWorkers($logisticDept, 1, 'me', true, 1);
function getDeptSalary ($dept)
{
$deptSalary = 0;
foreach ($dept as $worker) {
$deptSalary += $worker->getSalary();
}
return $deptSalary;
}
$procurementDeptSalary = getDeptSalary($procurementDept);
$sailsDeptSalary = getDeptSalary($sailsDept);
$adsDeptSalary = getDeptSalary($adsDept);
$logisticDeptSalary = getDeptSalary($logisticDept);
$totalSalary = $procurementDeptSalary + $sailsDeptSalary +
$adsDeptSalary + $logisticDeptSalary;
$averageSalary = $totalSalary / 4;
function getDeptCoffeeAmount ($dept)
{
$deptCoffee = 0;
foreach ($dept as $worker) {
$deptCoffee += $worker->getCoffeeAmount();
}
return $deptCoffee;
}
$procurementDeptCoffeeAmount = getDeptCoffeeAmount($procurementDept);
$sailsDeptCoffeeAmount = getDeptCoffeeAmount($sailsDept);
$adsDeptCoffeeAmount = getDeptCoffeeAmount($adsDept);
$logisticDeptCoffeeAmount = getDeptCoffeeAmount($logisticDept);
$totalCoffeeAmount = $procurementDeptCoffeeAmount + $sailsDeptCoffeeAmount +
$adsDeptCoffeeAmount + $logisticDeptCoffeeAmount;
$averageCoffeeAmount = $totalCoffeeAmount / 4;
function getDeptReportPages ($dept)
{
$deptReportPages = 0;
foreach ($dept as $worker) {
$deptReportPages += $worker->getReportPages();
}
return $deptReportPages;
}
$procurementDeptRP = getDeptReportPages($procurementDept);
$sailsDeptRP = getDeptReportPages($sailsDept);
$adsDeptRP = getDeptReportPages($adsDept);
$logisticDeptRP = getDeptReportPages($logisticDept);
$totalReportPages = $procurementDeptRP + $sailsDeptRP + $adsDeptRP + $logisticDeptRP;
$averageReportPages = $totalReportPages / 4;
function getSalaryPerPage ($dept)
{
$salary = getDeptSalary($dept);
$reportPages = getDeptReportPages($dept);
$salaryPerPage = $salary / $reportPages;
$salaryPerPage = round($salaryPerPage, 2);
return $salaryPerPage;
}
$procurementDeptSPP = getSalaryPerPage($procurementDept);
$sailsDeptSPP = getSalaryPerPage($sailsDept);
$adsDeptSPP = getSalaryPerPage($adsDept);
$logisticDeptSPP = getSalaryPerPage($logisticDept);
$totalSalaryPerPage = $procurementDeptSPP + $sailsDeptSPP + $adsDeptSPP + $logisticDeptSPP;
$averageSalaryPerPage = $totalSalaryPerPage / 4;
$totalWorkers = count($procurementDept) + count($sailsDept) + $averageWorkers = $totalWorkers / 4;
// Функции для генерирования таблиц
function padLeft($string, $length)
{
$spaces = 0;
if ($strLength < $length) {
$spaces = $length - $strLength;
}
for ($i = 0; $i < $spaces; $i++) {
echo " ";
}
echo $string;
}
function padRight($string, $length)
{
$spaces = 0;
if ($strLength < $length) {
$spaces = $length - $strLength;
}
echo $string;
for ($i = 0; $i < $spaces; $i++) {
echo " ";
}
}
// Ширина колонок
$col1 = 15;
$col2 = 10;
// заголовок таблицы
echo padRight("Департамент", $col1) .
padLeft("сотр.", $col2) .
padLeft("тугр.", $col2) .
padLeft("кофе", $col2) .
padLeft("стр.", $col2) .
padLeft("тугр./стр.", $col1) . "\n----------------------------------------------------------------------\n";
// таблица
function printDeptStats ($deptName, $dept)
{
$col1 = 15;
$col2 = 10;
echo padRight($deptName, $col1) .
padLeft
(count($dept), $col2) . // число сотрудников padLeft(getDeptSalary($dept), $col2) .
padLeft(getDeptCoffeeAmount($dept), $col2) .
padLeft(getDeptReportPages($dept), $col2) .
padLeft(getSalaryPerPage($dept), $col1) . "\n"; //
}
printDeptStats("Депт. закупок", $procurementDept);
printDeptStats("Депт. продаж", $sailsDept);
printDeptStats("Депт. рекламы", $adsDept);
printDeptStats("Депт. логистики", $logisticDept);
echo "-----------------\n";
// Среднее
echo padRight("Среднее", $col1) .
padLeft($averageWorkers, $col2) .
padLeft($averageSalary, $col2) .
padLeft($averageCoffeeAmount, $col2) .
padLeft($averageReportPages, $col2) .
padLeft($averageSalaryPerPage, $col1) . "\n-----------------\n";
// Всего
echo padRight("Всего", $col1) .
padLeft($totalWorkers, $col2) .
padLeft($totalSalary, $col2) .
padLeft($totalCoffeeAmount, $col2) .
padLeft($totalReportPages, $col2) .
padLeft($totalSalaryPerPage, $col1) . "\n-----------------\n";
PD9waHAKCi8vIHlvdXIgY29kZSBnb2VzIGhlcmU8P3BocAoKZXJyb3JfcmVwb3J0aW5nKC0xKTsKbWJfaW50ZXJuYWxfZW5jb2RpbmcoJ3V0Zi04Jyk7CgpjbGFzcyBXb3JrZXIKewoJcHVibGljICRvY2N1cGF0aW9uOyAvLyDQv9GA0L7RhNC10YHRgdC40Y8KCXB1YmxpYyAkaWZDaGllZjsKCXB1YmxpYyAkcmFuazsgLy8g0YDQsNC90LMKCglwdWJsaWMgJGNvZmZlZUFtb3VudDsKCXB1YmxpYyAkc2FsYXJ5OwoJcHVibGljICRyZXBvcnRQYWdlczsKCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9jY3VwYXRpb24sICRpZkNoaWVmLCAkcmFuaykKCXsKCQkkdGhpcy0+b2NjdXBhdGlvbiA9ICRvY2N1cGF0aW9uOwoJCSR0aGlzLT5pZkNoaWVmID0gJGlmQ2hpZWY7CgkJJHRoaXMtPnJhbmsgPSAkcmFuazsKCX0KCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2FsYXJ5KCkKCXsKCQkkc2FsYXJ5ID0gMDsKCgkJc3dpdGNoICgkdGhpcy0+b2NjdXBhdGlvbikgeyAvLyDQt9Cw0LLQuNGB0LjQvNC+0YHRgtGMINC30LDRgNC/0LvQsNGC0Ysg0L7RgiDQv9GA0L7RhNC10YHRgdC40LgKCQkJY2FzZSAnbWUnOgoJCQkJJHNhbGFyeSArPSA1MDA7CgkJCQlicmVhazsKCQkJY2FzZSAnbWEnOgoJCQkJJHNhbGFyeSArPSA0MDA7CgkJCQlicmVhazsKCQkJY2FzZSAnZW4nOgoJCQkJJHNhbGFyeSArPSAyMDA7CgkJCQlicmVhazsKCQkJY2FzZSAnYW4nOgoJCQkJJHNhbGFyeSArPSA4MDA7CgkJCQlicmVhazsKCQl9CgoJCXN3aXRjaCAoJHRoaXMtPnJhbmspIHsgLy8g0LfQsNCy0LjRgdC40LzQvtGB0YLRjCDQt9Cw0YDQv9C70LDRgtGLINC+0YIg0YDQsNC90LPQsAoJCQljYXNlIDI6CgkJCQkkc2FsYXJ5ICo9IDEuMjU7CgkJCQlicmVhazsKCQkJY2FzZSAzOgoJCQkJJHNhbGFyeSAqPSAxLjU7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCX0KCgkJaWYgKCR0aGlzLT5pZkNoaWVmKSB7CgkJCSRzYWxhcnkgKj0gMS41OwoJCX0KCgkJcmV0dXJuICRzYWxhcnk7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldENvZmZlZUFtb3VudCgpCgl7CgkJJGNvZmZlZUFtb3VudCA9IDA7CgoJCXN3aXRjaCAoJHRoaXMtPm9jY3VwYXRpb24pIHsKCQkJY2FzZSAnbWUnOgoJCQkJJGNvZmZlZUFtb3VudCArPSAyMDsKCQkJCWJyZWFrOwoJCQljYXNlICdtYSc6CgkJCQkkY29mZmVlQW1vdW50ICs9IDE1OwoJCQkJYnJlYWs7CgkJCWNhc2UgJ2VuJzoKCQkJCSRjb2ZmZWVBbW91bnQgKz0gNTsKCQkJCWJyZWFrOwoJCQljYXNlICdhbic6CgkJCQkkY29mZmVlQW1vdW50ICs9IDUwOwoJCQkJYnJlYWs7CgkJfQoKCQlpZiAoJHRoaXMtPmlmQ2hpZWYpIHsKCQkJJGNvZmZlZUFtb3VudCAqPSAyOwoJCX0KCgkJcmV0dXJuICRjb2ZmZWVBbW91bnQ7Cgl9CgoJcHVibGljIGZ1bmN0aW9uIGdldFJlcG9ydFBhZ2VzKCkKCXsKCQkkcmVwb3J0UGFnZXMgPSAwOwoKCQlzd2l0Y2ggKCR0aGlzLT5vY2N1cGF0aW9uKSB7CgkJCWNhc2UgJ21lJzoKCQkJCSRyZXBvcnRQYWdlcyArPSAyMDA7CgkJCQlicmVhazsKCQkJY2FzZSAnbWEnOgoJCQkJJHJlcG9ydFBhZ2VzICs9IDE1MDsKCQkJCWJyZWFrOwoJCQljYXNlICdlbic6CgkJCQkkcmVwb3J0UGFnZXMgKz0gNTA7CgkJCQlicmVhazsKCQkJY2FzZSAnYW4nOgoJCQkJJHJlcG9ydFBhZ2VzICs9IDU7CgkJCQlicmVhazsKCQl9CgoJCWlmICgkdGhpcy0+aWZDaGllZikgewoJCQkkcmVwb3J0UGFnZXMgPSAwOwoJCX0KCgkJcmV0dXJuICRyZXBvcnRQYWdlczsKCX0KfQoKZnVuY3Rpb24gZmlsbEFycmF5V2l0aFdvcmtlcnMoJGFycmF5LCAkbnVtYmVyLCAkb2NjdXBhdGlvbiwgJGlmQ2hpZWYsICRyYW5rKSAKewoJJGxhc3QgPSBjb3VudCgkYXJyYXkpOwoJZm9yICgkaSA9IDA7ICRpIDwgJG51bWJlcjsgJGkrKykgewoJCSRhcnJheVskbGFzdCskaV0gPSBuZXcgV29ya2VyKCRvY2N1cGF0aW9uLCAkaWZDaGllZiwgJHJhbmspOwoJfQoJcmV0dXJuICRhcnJheTsKfQoKJHByb2N1cmVtZW50RGVwdCA9IGFycmF5KCk7IC8vINC00LXQv9Cw0YDRgtCw0LzQtdC90YIg0LfQsNC60YPQv9C+0LoKJHByb2N1cmVtZW50RGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRwcm9jdXJlbWVudERlcHQsIDksICdtZScsIGZhbHNlLCAxKTsKJHByb2N1cmVtZW50RGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRwcm9jdXJlbWVudERlcHQsIDMsICdtZScsIGZhbHNlLCAyKTsKJHByb2N1cmVtZW50RGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRwcm9jdXJlbWVudERlcHQsIDIsICdtZScsIGZhbHNlLCAzKTsKJHByb2N1cmVtZW50RGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRwcm9jdXJlbWVudERlcHQsIDIsICdtYScsIGZhbHNlLCAxKTsKJHByb2N1cmVtZW50RGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRwcm9jdXJlbWVudERlcHQsIDEsICdtZScsIHRydWUsIDIpOwoKJHNhaWxzRGVwdCA9IGFycmF5KCk7CiRzYWlsc0RlcHQgPSBmaWxsQXJyYXlXaXRoV29ya2Vycygkc2FpbHNEZXB0LCAxMiwgJ21lJywgZmFsc2UsIDEpOwokc2FpbHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJHNhaWxzRGVwdCwgNiwgJ21hJywgZmFsc2UsIDEpOwokc2FpbHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJHNhaWxzRGVwdCwgMywgJ2FuJywgZmFsc2UsIDEpOwokc2FpbHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJHNhaWxzRGVwdCwgMiwgJ2FuJywgZmFsc2UsIDIpOwokc2FpbHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJHNhaWxzRGVwdCwgMSwgJ21hJywgdHJ1ZSwgMik7CgokYWRzRGVwdCA9IGFycmF5KCk7CiRhZHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJGFkc0RlcHQsIDE1LCAnbWEnLCBmYWxzZSwgMSk7CiRhZHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJGFkc0RlcHQsIDEwLCAnbWEnLCBmYWxzZSwgMik7CiRhZHNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJGFkc0RlcHQsIDgsICdtZScsIGZhbHNlLCAxKTsKJGFkc0RlcHQgPSBmaWxsQXJyYXlXaXRoV29ya2VycygkYWRzRGVwdCwgMiwgJ2VuJywgZmFsc2UsIDEpOwokYWRzRGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRhZHNEZXB0LCAxLCAnbWEnLCB0cnVlLCAzKTsKCiRsb2dpc3RpY0RlcHQgPSBhcnJheSgpOwokbG9naXN0aWNEZXB0ID0gZmlsbEFycmF5V2l0aFdvcmtlcnMoJGxvZ2lzdGljRGVwdCwgMTMsICdtZScsIGZhbHNlLCAxKTsKJGxvZ2lzdGljRGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRsb2dpc3RpY0RlcHQsIDUsICdtZScsIGZhbHNlLCAyKTsKJGxvZ2lzdGljRGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRsb2dpc3RpY0RlcHQsIDUsICdlbicsIGZhbHNlLCAxKTsKJGxvZ2lzdGljRGVwdCA9IGZpbGxBcnJheVdpdGhXb3JrZXJzKCRsb2dpc3RpY0RlcHQsIDEsICdtZScsIHRydWUsIDEpOwoKCmZ1bmN0aW9uIGdldERlcHRTYWxhcnkgKCRkZXB0KSAKewoJJGRlcHRTYWxhcnkgPSAwOwoKCWZvcmVhY2ggKCRkZXB0IGFzICR3b3JrZXIpIHsKCQkkZGVwdFNhbGFyeSArPSAkd29ya2VyLT5nZXRTYWxhcnkoKTsKCX0KCXJldHVybiAkZGVwdFNhbGFyeTsKfQokcHJvY3VyZW1lbnREZXB0U2FsYXJ5ID0gZ2V0RGVwdFNhbGFyeSgkcHJvY3VyZW1lbnREZXB0KTsKJHNhaWxzRGVwdFNhbGFyeSA9IGdldERlcHRTYWxhcnkoJHNhaWxzRGVwdCk7CiRhZHNEZXB0U2FsYXJ5ID0gZ2V0RGVwdFNhbGFyeSgkYWRzRGVwdCk7CiRsb2dpc3RpY0RlcHRTYWxhcnkgPSBnZXREZXB0U2FsYXJ5KCRsb2dpc3RpY0RlcHQpOwokdG90YWxTYWxhcnkgPSAkcHJvY3VyZW1lbnREZXB0U2FsYXJ5ICsgJHNhaWxzRGVwdFNhbGFyeSArCgkJCQkJJGFkc0RlcHRTYWxhcnkgKyAkbG9naXN0aWNEZXB0U2FsYXJ5OwokYXZlcmFnZVNhbGFyeSA9ICR0b3RhbFNhbGFyeSAvIDQ7CgpmdW5jdGlvbiBnZXREZXB0Q29mZmVlQW1vdW50ICgkZGVwdCkgCnsKCSRkZXB0Q29mZmVlID0gMDsKCWZvcmVhY2ggKCRkZXB0IGFzICR3b3JrZXIpIHsKCQkkZGVwdENvZmZlZSArPSAkd29ya2VyLT5nZXRDb2ZmZWVBbW91bnQoKTsKCX0KCXJldHVybiAkZGVwdENvZmZlZTsKfQokcHJvY3VyZW1lbnREZXB0Q29mZmVlQW1vdW50ID0gZ2V0RGVwdENvZmZlZUFtb3VudCgkcHJvY3VyZW1lbnREZXB0KTsKJHNhaWxzRGVwdENvZmZlZUFtb3VudCA9IGdldERlcHRDb2ZmZWVBbW91bnQoJHNhaWxzRGVwdCk7CiRhZHNEZXB0Q29mZmVlQW1vdW50ID0gZ2V0RGVwdENvZmZlZUFtb3VudCgkYWRzRGVwdCk7CiRsb2dpc3RpY0RlcHRDb2ZmZWVBbW91bnQgPSBnZXREZXB0Q29mZmVlQW1vdW50KCRsb2dpc3RpY0RlcHQpOwokdG90YWxDb2ZmZWVBbW91bnQgPSAkcHJvY3VyZW1lbnREZXB0Q29mZmVlQW1vdW50ICsgJHNhaWxzRGVwdENvZmZlZUFtb3VudCArCgkJCQkJICRhZHNEZXB0Q29mZmVlQW1vdW50ICsgJGxvZ2lzdGljRGVwdENvZmZlZUFtb3VudDsKJGF2ZXJhZ2VDb2ZmZWVBbW91bnQgPSAkdG90YWxDb2ZmZWVBbW91bnQgLyA0OwoKZnVuY3Rpb24gZ2V0RGVwdFJlcG9ydFBhZ2VzICgkZGVwdCkgCnsKCSRkZXB0UmVwb3J0UGFnZXMgPSAwOwoJZm9yZWFjaCAoJGRlcHQgYXMgJHdvcmtlcikgewoJCSRkZXB0UmVwb3J0UGFnZXMgKz0gJHdvcmtlci0+Z2V0UmVwb3J0UGFnZXMoKTsKCX0KCXJldHVybiAkZGVwdFJlcG9ydFBhZ2VzOwp9CiRwcm9jdXJlbWVudERlcHRSUCA9IGdldERlcHRSZXBvcnRQYWdlcygkcHJvY3VyZW1lbnREZXB0KTsKJHNhaWxzRGVwdFJQID0gZ2V0RGVwdFJlcG9ydFBhZ2VzKCRzYWlsc0RlcHQpOwokYWRzRGVwdFJQID0gZ2V0RGVwdFJlcG9ydFBhZ2VzKCRhZHNEZXB0KTsKJGxvZ2lzdGljRGVwdFJQID0gZ2V0RGVwdFJlcG9ydFBhZ2VzKCRsb2dpc3RpY0RlcHQpOwokdG90YWxSZXBvcnRQYWdlcyA9ICRwcm9jdXJlbWVudERlcHRSUCArICRzYWlsc0RlcHRSUCArICRhZHNEZXB0UlAgKyAkbG9naXN0aWNEZXB0UlA7CiRhdmVyYWdlUmVwb3J0UGFnZXMgPSAkdG90YWxSZXBvcnRQYWdlcyAvIDQ7CgpmdW5jdGlvbiBnZXRTYWxhcnlQZXJQYWdlICgkZGVwdCkKewoJJHNhbGFyeSA9IGdldERlcHRTYWxhcnkoJGRlcHQpOwoJJHJlcG9ydFBhZ2VzID0gZ2V0RGVwdFJlcG9ydFBhZ2VzKCRkZXB0KTsKCSRzYWxhcnlQZXJQYWdlID0gJHNhbGFyeSAvICRyZXBvcnRQYWdlczsKCSRzYWxhcnlQZXJQYWdlID0gcm91bmQoJHNhbGFyeVBlclBhZ2UsIDIpOwoKCXJldHVybiAkc2FsYXJ5UGVyUGFnZTsKfQokcHJvY3VyZW1lbnREZXB0U1BQID0gZ2V0U2FsYXJ5UGVyUGFnZSgkcHJvY3VyZW1lbnREZXB0KTsKJHNhaWxzRGVwdFNQUCA9IGdldFNhbGFyeVBlclBhZ2UoJHNhaWxzRGVwdCk7CiRhZHNEZXB0U1BQID0gZ2V0U2FsYXJ5UGVyUGFnZSgkYWRzRGVwdCk7CiRsb2dpc3RpY0RlcHRTUFAgPSBnZXRTYWxhcnlQZXJQYWdlKCRsb2dpc3RpY0RlcHQpOwokdG90YWxTYWxhcnlQZXJQYWdlID0gJHByb2N1cmVtZW50RGVwdFNQUCArICRzYWlsc0RlcHRTUFAgKyAkYWRzRGVwdFNQUCArICRsb2dpc3RpY0RlcHRTUFA7CiRhdmVyYWdlU2FsYXJ5UGVyUGFnZSA9ICR0b3RhbFNhbGFyeVBlclBhZ2UgLyA0OwoKJHRvdGFsV29ya2VycyA9IGNvdW50KCRwcm9jdXJlbWVudERlcHQpICsgY291bnQoJHNhaWxzRGVwdCkgKyAKCQkJCWNvdW50KCRhZHNEZXB0KSArIGNvdW50KCRsb2dpc3RpY0RlcHQpOwokYXZlcmFnZVdvcmtlcnMgPSAkdG90YWxXb3JrZXJzIC8gNDsKCi8vINCk0YPQvdC60YbQuNC4INC00LvRjyDQs9C10L3QtdGA0LjRgNC+0LLQsNC90LjRjyDRgtCw0LHQu9C40YYKZnVuY3Rpb24gcGFkTGVmdCgkc3RyaW5nLCAkbGVuZ3RoKQp7Cgkkc3RyTGVuZ3RoID0gbWJfc3RybGVuKCRzdHJpbmcpOwoJJHNwYWNlcyA9IDA7CgoJaWYgKCRzdHJMZW5ndGggPCAkbGVuZ3RoKSB7CgkJJHNwYWNlcyA9ICRsZW5ndGggLSAkc3RyTGVuZ3RoOwoJfQoKCWZvciAoJGkgPSAwOyAkaSA8ICRzcGFjZXM7ICRpKyspIHsKCQllY2hvICIgIjsKCX0KCgllY2hvICRzdHJpbmc7Cn0KZnVuY3Rpb24gcGFkUmlnaHQoJHN0cmluZywgJGxlbmd0aCkKewoJJHN0ckxlbmd0aCA9IG1iX3N0cmxlbigkc3RyaW5nKTsKCSRzcGFjZXMgPSAwOwoKCWlmICgkc3RyTGVuZ3RoIDwgJGxlbmd0aCkgewoJCSRzcGFjZXMgPSAkbGVuZ3RoIC0gJHN0ckxlbmd0aDsKCX0KCQoJZWNobyAkc3RyaW5nOwoKCWZvciAoJGkgPSAwOyAkaSA8ICRzcGFjZXM7ICRpKyspIHsKCQllY2hvICIgIjsKCX0KfQovLyDQqNC40YDQuNC90LAg0LrQvtC70L7QvdC+0LoKJGNvbDEgPSAxNTsKJGNvbDIgPSAxMDsKCi8vINC30LDQs9C+0LvQvtCy0L7QuiDRgtCw0LHQu9C40YbRiwplY2hvIHBhZFJpZ2h0KCLQlNC10L/QsNGA0YLQsNC80LXQvdGCIiwgJGNvbDEpIC4KICAgICBwYWRMZWZ0KCLRgdC+0YLRgC4iLCAkY29sMikgLiAKICAgICBwYWRMZWZ0KCLRgtGD0LPRgC4iLCAkY29sMikgLiAKICAgICBwYWRMZWZ0KCLQutC+0YTQtSIsICRjb2wyKSAuIAogICAgIHBhZExlZnQoItGB0YLRgC4iLCAkY29sMikgLiAKICAgICBwYWRMZWZ0KCLRgtGD0LPRgC4v0YHRgtGALiIsICRjb2wxKSAuICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7CgovLyDRgtCw0LHQu9C40YbQsApmdW5jdGlvbiBwcmludERlcHRTdGF0cyAoJGRlcHROYW1lLCAkZGVwdCkKewoJJGNvbDEgPSAxNTsKCSRjb2wyID0gMTA7CgoJZWNobyBwYWRSaWdodCgkZGVwdE5hbWUsICRjb2wxKSAuIAoJcGFkTGVmdChjb3VudCgkZGVwdCksICRjb2wyKSAuIC8vINGH0LjRgdC70L4g0YHQvtGC0YDRg9C00L3QuNC60L7QsgoJcGFkTGVmdChnZXREZXB0U2FsYXJ5KCRkZXB0KSwgJGNvbDIpIC4gCglwYWRMZWZ0KGdldERlcHRDb2ZmZWVBbW91bnQoJGRlcHQpLCAkY29sMikgLiAKCXBhZExlZnQoZ2V0RGVwdFJlcG9ydFBhZ2VzKCRkZXB0KSwgJGNvbDIpIC4gCglwYWRMZWZ0KGdldFNhbGFyeVBlclBhZ2UoJGRlcHQpLCAkY29sMSkgLiAiXG4iOyAvLyAKfQoKcHJpbnREZXB0U3RhdHMoItCU0LXQv9GCLiDQt9Cw0LrRg9C/0L7QuiIsICRwcm9jdXJlbWVudERlcHQpOwpwcmludERlcHRTdGF0cygi0JTQtdC/0YIuINC/0YDQvtC00LDQtiIsICRzYWlsc0RlcHQpOwpwcmludERlcHRTdGF0cygi0JTQtdC/0YIuINGA0LXQutC70LDQvNGLIiwgJGFkc0RlcHQpOwpwcmludERlcHRTdGF0cygi0JTQtdC/0YIuINC70L7Qs9C40YHRgtC40LrQuCIsICRsb2dpc3RpY0RlcHQpOwplY2hvICItLS0tLS0tLS0tLS0tLS0tLVxuIjsKCi8vINCh0YDQtdC00L3QtdC1CmVjaG8gcGFkUmlnaHQoItCh0YDQtdC00L3QtdC1IiwgJGNvbDEpIC4gCgkgcGFkTGVmdCgkYXZlcmFnZVdvcmtlcnMsICRjb2wyKSAuIAoJIHBhZExlZnQoJGF2ZXJhZ2VTYWxhcnksICRjb2wyKSAuIAoJIHBhZExlZnQoJGF2ZXJhZ2VDb2ZmZWVBbW91bnQsICRjb2wyKSAuIAoJIHBhZExlZnQoJGF2ZXJhZ2VSZXBvcnRQYWdlcywgJGNvbDIpIC4gCgkgcGFkTGVmdCgkYXZlcmFnZVNhbGFyeVBlclBhZ2UsICRjb2wxKSAuICJcbi0tLS0tLS0tLS0tLS0tLS0tXG4iOwoKLy8g0JLRgdC10LPQvgplY2hvIHBhZFJpZ2h0KCLQktGB0LXQs9C+IiwgJGNvbDEpIC4gCgkgcGFkTGVmdCgkdG90YWxXb3JrZXJzLCAkY29sMikgLiAKCSBwYWRMZWZ0KCR0b3RhbFNhbGFyeSwgJGNvbDIpIC4gCgkgcGFkTGVmdCgkdG90YWxDb2ZmZWVBbW91bnQsICRjb2wyKSAuIAoJIHBhZExlZnQoJHRvdGFsUmVwb3J0UGFnZXMsICRjb2wyKSAuIAoJIHBhZExlZnQoJHRvdGFsU2FsYXJ5UGVyUGFnZSwgJGNvbDEpIC4gIlxuLS0tLS0tLS0tLS0tLS0tLS1cbiI7