<?php
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'chk' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gor' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'pet' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'spo' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'pet' => array ( 'time' => 3 , 'transport' => 'bus' ) ,
'kre' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'chk' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vas' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'spo' => array ( 'time' => 10 , 'transport' => 'bus' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'nov' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'gor' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'isa' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gos' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'let' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'nov' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'vas' => array ( 'time' => 11 , 'transport' => 'foot' ) ,
'isa' => array ( 'time' => 5 , 'transport' => 'foot' ) ,
'ras' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'nov' => array ( 'time' => 7 , 'transport' => 'bus' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'vas' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'dvo' => array ( 'time' => 6 , 'transport' => 'foot' ) ,
'gor' => array ( 'time' => 6 , 'transport' => 'sub' ) ,
'let' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vla' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'ras' => array ( 'time' => 3 , 'transport' => 'foot' ) ,
'spo' => array ( 'time' => 7 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'sen' => array ( 'time' => 4 , 'transport' => 'sub' ) ,
'gos' => array ( 'time' => 7 , 'transport' => 'foot' ) ,
'vit' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'sen' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'teh' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
'vla' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
)
) ,
'visited' => false ,
'shortest_path' => INF,
'from' => '' ,
'sen' => array ( 'time' => 3 , 'transport' => 'sub' ) ,
'vit' => array ( 'time' => 2 , 'transport' => 'sub' ) ,
)
)
) ;
$start_point = pet;
$end_point = nov;
function asd( $paths , $start_point , $end_point )
{
$constant_start_point = $start_point ;
$constant_end_point = $end_point ;
sub => 'Из неё едешь на метро' ,
foot => 'Из неё идешь пешком' ,
bus => 'Из неё едешь на автобусе'
) ;
$shortest_path = $paths [ $start_point ] [ 'shortest_path' ] ;
$paths [ $start_point ] [ 'shortest_path' ] = 0 ; // делаем длинну пути стартовой точки = 0
$paths [ $start_point ] [ 'from' ] = 'start' ;
while ( $paths [ $end_point ] [ 'visited' ] == false ) { // циклим пока точка до которой мы идем не станет true
$paths [ $start_point ] [ 'visited' ] = true ; // ставим посещение true
foreach ( $paths [ $start_point ] [ 'neighbors' ] as $name => $time_transport ) { // смотрим соседей вершины и длинну пути и присваем if длина пути+пройденый путь меньше чем есть
if ( $paths [ $name ] [ 'visited' ] == false ) {
$time = $time_transport [ 'time' ] ;
if ( $time + $paths [ $start_point ] [ 'shortest_path' ] < $paths [ $name ] [ 'shortest_path' ] ) {
$paths [ $name ] [ 'shortest_path' ] = $time + $paths [ $start_point ] [ 'shortest_path' ] ;
$paths [ $name ] [ 'from' ] = $start_point ;
}
}
}
$j = INF;
foreach ( $paths as $name => $value ) { // делаем старт поинт вершину с наименьшем пути
if ( $paths [ $name ] [ 'visited' ] == false ) {
if ( $paths [ $name ] [ 'shortest_path' ] < $j ) {
$j = $paths [ $name ] [ 'shortest_path' ] ;
$start_point = $name ;
}
}
}
}
while ( $paths [ $end_point ] [ 'from' ] != 'start' ) { // циклим пока не дойдем до начальной точки
$faster_paths [ ] = $end_point ;
$end_point = $paths [ $end_point ] [ 'from' ] ;
}
krsort ( $faster_paths ) ; // сортируем что бы по порядку шёл echo "Начальная точка: $constant_start_point \n " ;
foreach ( $faster_paths as $path ) {
echo $transportName [ $paths [ $paths [ $path ] [ 'from' ] ] [ 'neighbors' ] [ $path ] [ 'transport' ] ] . " до точки " . $path . " за " . $paths [ $paths [ $path ] [ 'from' ] ] [ 'neighbors' ] [ $path ] [ 'time' ] . " мин.\n " ;
}
echo "В итоге ты попадешь в точку $constant_end_point за " . $paths [ $constant_end_point ] [ 'shortest_path' ] . " минут." ;
}
asd( $paths , $start_point , $end_point ) ;
PD9waHAKCiRwYXRocyA9IGFycmF5KAogICAgJ3BldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSdmcm9tJyAJCSAgICA9PiAgJycsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAxMCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgICAgICAJCSdnb3InICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKCiAgICAnY2hrJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDEwLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2J1cycpLAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29yJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdwZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDMsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQkna3JlJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NwbycgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSdmcm9tJyAJCSAgICA9PiAgJycsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknY2hrJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2YXMnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NwbycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTAsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ25vdicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMTEsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdrcmUnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2dvcicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNSwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAJKQogICAgKSwKICAgIAogICAgJ2xldCcgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSdmcm9tJyAJCSAgICA9PiAgJycsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQknZHZvJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdkdm8nICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2lzYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdsZXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDYsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgCSkKICAgICksCiAgICAKICAgICdpc2EnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknbm92JyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA1LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnbm92JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDExLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdpc2EnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDUsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3JhcycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdidXMnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAncmFzJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdub3YnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnYnVzJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgIAkpCiAgICApLAogICAgCiAgICAnZ29zJyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSd2YXMnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknc2VuJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2R2bycgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNiwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQknZ29yJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA2LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ2xldCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdmb290JyksCiAgICAgICAgCQkndmxhJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiA3LAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwgICAgCiAgICAJKQogICAgKSwKICAgIAogICAgJ3NlbicgICA9PiAgYXJyYXkoCiAgICAJCSd2aXNpdGVkJyAJCT0+ICBmYWxzZSwKICAgIAkJJ3Nob3J0ZXN0X3BhdGgnID0+ICBJTkYsCiAgICAJCSdmcm9tJyAJCSAgICA9PiAgJycsCiAgICAJCSduZWlnaGJvcnMnICAgICA9PiAgYXJyYXkoCiAgICAgICAgCQkncmFzJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ2Zvb3QnKSwKICAgICAgICAJCSdzcG8nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQknZ29zJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAzLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgCSkKICAgICksCiAgICAKICAgICd2bGEnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gNCwKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSdnb3MnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDcsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnZm9vdCcpLAogICAgICAgIAkJJ3ZpdCcgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAogICAgCiAgICAndml0JyAgID0+ICBhcnJheSgKICAgIAkJJ3Zpc2l0ZWQnIAkJPT4gIGZhbHNlLAogICAgCQknc2hvcnRlc3RfcGF0aCcgPT4gIElORiwKICAgIAkJJ2Zyb20nIAkJICAgID0+ICAnJywKICAgIAkJJ25laWdoYm9ycycgICAgID0+ICBhcnJheSgKICAgICAgICAJCSdzZW4nICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksCiAgICAgICAgCQkndGVoJyAgID0+ICBhcnJheSgndGltZScgICAgICA9PiAyLAogICAgICAgIAkJCQkJCSAgJ3RyYW5zcG9ydCcgPT4gJ3N1YicpLAogICAgICAgIAkJJ3ZsYScgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgIAkpCiAgICApLAoKICAgICd0ZWgnICAgPT4gIGFycmF5KAogICAgCQkndmlzaXRlZCcgCQk9PiAgZmFsc2UsCiAgICAJCSdzaG9ydGVzdF9wYXRoJyA9PiAgSU5GLAogICAgCQknZnJvbScgCQkgICAgPT4gICcnLAogICAgCQknbmVpZ2hib3JzJyAgICAgPT4gIGFycmF5KAogICAgICAgIAkJJ3NlbicgICA9PiAgYXJyYXkoJ3RpbWUnICAgICAgPT4gMywKICAgICAgICAJCQkJCQkgICd0cmFuc3BvcnQnID0+ICdzdWInKSwKICAgICAgICAJCSd2aXQnICAgPT4gIGFycmF5KCd0aW1lJyAgICAgID0+IDIsCiAgICAgICAgCQkJCQkJICAndHJhbnNwb3J0JyA9PiAnc3ViJyksICAKICAgIAkpCiAgICApCik7Cgokc3RhcnRfcG9pbnQgPSBwZXQ7CiRlbmRfcG9pbnQgPSBub3Y7CiAKCiBmdW5jdGlvbiBhc2QoJHBhdGhzLCRzdGFydF9wb2ludCwkZW5kX3BvaW50KQogewkKIAkkY29uc3RhbnRfc3RhcnRfcG9pbnQgPSAkc3RhcnRfcG9pbnQ7CiAJJGNvbnN0YW50X2VuZF9wb2ludCAgID0gJGVuZF9wb2ludDsKIAkkdHJhbnNwb3J0TmFtZSA9IGFycmF5KAoJCQkJc3ViID0+ICfQmNC3INC90LXRkSDQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCgkJCQlmb290ID0+ICfQmNC3INC90LXRkSDQuNC00LXRiNGMINC/0LXRiNC60L7QvCcsCgkJCQlidXMgPT4gJ9CY0Lcg0L3QtdGRINC10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwoJKTsKIAkkc2hvcnRlc3RfcGF0aCA9ICRwYXRoc1skc3RhcnRfcG9pbnRdWydzaG9ydGVzdF9wYXRoJ107CiAJJHBhdGhzWyRzdGFydF9wb2ludF1bJ3Nob3J0ZXN0X3BhdGgnXSA9IDA7IC8vINC00LXQu9Cw0LXQvCDQtNC70LjQvdC90YMg0L/Rg9GC0Lgg0YHRgtCw0YDRgtC+0LLQvtC5INGC0L7Rh9C60LggPSAwCiAJJHBhdGhzWyRzdGFydF9wb2ludF1bJ2Zyb20nXSA9ICdzdGFydCc7CiAJd2hpbGUgKCRwYXRoc1skZW5kX3BvaW50XVsndmlzaXRlZCddID09IGZhbHNlKSB7IC8vINGG0LjQutC70LjQvCDQv9C+0LrQsCDRgtC+0YfQutCwINC00L4g0LrQvtGC0L7RgNC+0Lkg0LzRiyDQuNC00LXQvCDQvdC1INGB0YLQsNC90LXRgiB0cnVlCiAJCSRwYXRoc1skc3RhcnRfcG9pbnRdWyd2aXNpdGVkJ10gPSB0cnVlOyAvLyDRgdGC0LDQstC40Lwg0L/QvtGB0LXRidC10L3QuNC1IHRydWUgCiAJCWZvcmVhY2ggKCRwYXRoc1skc3RhcnRfcG9pbnRdWyduZWlnaGJvcnMnXSBhcyAkbmFtZSA9PiAkdGltZV90cmFuc3BvcnQpIHsgLy8g0YHQvNC+0YLRgNC40Lwg0YHQvtGB0LXQtNC10Lkg0LLQtdGA0YjQuNC90Ysg0Lgg0LTQu9C40L3QvdGDINC/0YPRgtC4INC4INC/0YDQuNGB0LLQsNC10LwgaWYg0LTQu9C40L3QsCDQv9GD0YLQuCvQv9GA0L7QudC00LXQvdGL0Lkg0L/Rg9GC0Ywg0LzQtdC90YzRiNC1INGH0LXQvCDQtdGB0YLRjAoJCQlpZiAoJHBhdGhzWyRuYW1lXVsndmlzaXRlZCddID09IGZhbHNlKSB7CgkJCQkkdGltZSA9ICR0aW1lX3RyYW5zcG9ydFsndGltZSddOwoJCQkJaWYgKCR0aW1lKyRwYXRoc1skc3RhcnRfcG9pbnRdWydzaG9ydGVzdF9wYXRoJ10gPCAkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ10pIHsKCQkJCQkkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ10gPSAkdGltZSskcGF0aHNbJHN0YXJ0X3BvaW50XVsnc2hvcnRlc3RfcGF0aCddOwoJCQkJCSRwYXRoc1skbmFtZV1bJ2Zyb20nXSA9ICRzdGFydF9wb2ludDsKCQkJCX0KCQkJfSAKCQl9CgkJJGogPSBJTkY7CgkJZm9yZWFjaCAoJHBhdGhzIGFzICAkbmFtZSA9PiAkdmFsdWUpIHsgLy8g0LTQtdC70LDQtdC8INGB0YLQsNGA0YIg0L/QvtC40L3RgiDQstC10YDRiNC40L3RgyDRgSDQvdCw0LjQvNC10L3RjNGI0LXQvCDQv9GD0YLQuAoJCQlpZiAoJHBhdGhzWyRuYW1lXVsndmlzaXRlZCddID09IGZhbHNlICkgewoJCQkJaWYgKCRwYXRoc1skbmFtZV1bJ3Nob3J0ZXN0X3BhdGgnXSA8ICRqKSB7CgkJCQkJJGogPSAkcGF0aHNbJG5hbWVdWydzaG9ydGVzdF9wYXRoJ107CgkJCQkJJHN0YXJ0X3BvaW50ID0gJG5hbWU7CgkJCQl9CgkJCX0KCQl9CiAJfQogICAgd2hpbGUgKCRwYXRoc1skZW5kX3BvaW50XVsnZnJvbSddICE9ICdzdGFydCcpIHsgIC8vINGG0LjQutC70LjQvCDQv9C+0LrQsCDQvdC1INC00L7QudC00LXQvCDQtNC+INC90LDRh9Cw0LvRjNC90L7QuSDRgtC+0YfQutC4CiAgICAJJGZhc3Rlcl9wYXRoc1tdID0gJGVuZF9wb2ludDsKICAgIAkkZW5kX3BvaW50ID0gJHBhdGhzWyRlbmRfcG9pbnRdWydmcm9tJ107CiAgICB9IAogCWtyc29ydCgkZmFzdGVyX3BhdGhzKTsgLy8g0YHQvtGA0YLQuNGA0YPQtdC8INGH0YLQviDQsdGLINC/0L4g0L/QvtGA0Y/QtNC60YMg0YjRkdC7CiAJZWNobyAi0J3QsNGH0LDQu9GM0L3QsNGPINGC0L7Rh9C60LA6ICRjb25zdGFudF9zdGFydF9wb2ludFxuIjsKCWZvcmVhY2ggKCRmYXN0ZXJfcGF0aHMgYXMgJHBhdGgpIHsKCQllY2hvICR0cmFuc3BvcnROYW1lWyRwYXRoc1skcGF0aHNbJHBhdGhdWydmcm9tJ11dWyduZWlnaGJvcnMnXVskcGF0aF1bJ3RyYW5zcG9ydCddXS4iINC00L4g0YLQvtGH0LrQuCAiLiRwYXRoLiIg0LfQsCAiLiRwYXRoc1skcGF0aHNbJHBhdGhdWydmcm9tJ11dWyduZWlnaGJvcnMnXVskcGF0aF1bJ3RpbWUnXS4iINC80LjQvS5cbiI7Cgl9CgllY2hvICLQkiDQuNGC0L7Qs9C1INGC0Ysg0L/QvtC/0LDQtNC10YjRjCDQsiDRgtC+0YfQutGDICRjb25zdGFudF9lbmRfcG9pbnQg0LfQsCAiLiRwYXRoc1skY29uc3RhbnRfZW5kX3BvaW50XVsnc2hvcnRlc3RfcGF0aCddLiIg0LzQuNC90YPRgi4iOwp9CQkKCgphc2QoJHBhdGhzLCRzdGFydF9wb2ludCwkZW5kX3BvaW50KTsKCgkJCgkJCgkJCgkJCiAKCQkKCQk=