<?php 
 
 
 
    SUBWAY =>  'едешь на метро' , 
    FOOT =>  'идешь пешком' , 
    BUS =>  'едешь на автобусе' 
) ; 
 
$startPoint  =  'pet' ;  // Петроградская 
$endPoint  =  'nov' ;  // Новая Голландия 
 
    'pet'  =>  'ст. м. Петроградская' , 
    'chk'  =>  'ст. м. Чкаловская' , 
    'gor'  =>  'ст. м. Горьковская' , 
    'spo'  =>  'ст. м. Спортивная' , 
    'vas'  =>  'ст. м. Василеостровская' , 
    'kre'  =>  'Петропавловская крепость' , 
    'let'  =>  'Летний сад' , 
    'dvo'  =>  'Дворцовая площадь' , 
    'isa'  =>  'Исакиевский собор' , 
    'nov'  =>  'Новая Голландия' , 
    'ras'  =>  'Дом Раскольникова' , 
    'gos'  =>  'Гостиный Двор' , 
    'sen'  =>  'Сенная Площадь' , 
    'vla'  =>  'ст. м. Владимирская' , 
    'vit'  =>  'Витебский вокзал' , 
    'teh'  =>  'Технолоческий Институт' 
) ; 
 
        'chk'  =>  canGet( 10 ,  BUS) , 
        'gor'  =>  canGet( 3 ,  SUBWAY) 
    ) , 
 
        'pet'  =>  canGet( 10 ,  BUS) , 
        'spo'  =>  canGet( 3 ,  SUBWAY) 
    ) , 
 
        'pet'  =>  canGet( 3 ,  BUS) , 
        'kre'  =>  canGet( 5 ,  FOOT) , 
        'gos'  =>  canGet( 6 ,  SUBWAY) 
    ) , 
 
        'chk'  =>  canGet( 3 ,  SUBWAY) , 
        'vas'  =>  canGet( 10 ,  BUS) , 
        'sen'  =>  canGet( 7 ,  SUBWAY) 
    ) , 
 
        'spo'  =>  canGet( 10 ,  BUS) , 
        'gos'  =>  canGet( 7 ,  SUBWAY) , 
        'nov'  =>  canGet( 11 ,  FOOT) 
    ) , 
 
        'gor'  =>  canGet( 5 ,  FOOT) 
    ) , 
 
        'dvo'  =>  canGet( 6 ,  FOOT) , 
        'gos'  =>  canGet( 7 ,  FOOT) 
    ) , 
 
        'isa'  =>  canGet( 6 ,  FOOT) , 
        'gos'  =>  canGet( 6 ,  FOOT) , 
        'let'  =>  canGet( 6 ,  FOOT) 
    ) , 
 
        'dvo'  =>  canGet( 6 ,  FOOT) , 
        'nov'  =>  canGet( 5 ,  FOOT) 
    ) , 
 
        'vas'  =>  canGet( 11 ,  FOOT) , 
        'isa'  =>  canGet( 5 ,  FOOT) , 
        'ras'  =>  canGet( 7 ,  BUS) 
    ) , 
 
        'nov'  =>  canGet( 7 ,  BUS) , 
        'sen'  =>  canGet( 3 ,  FOOT) 
    ) , 
 
        'vas'  =>  canGet( 7 ,  SUBWAY) , 
        'sen'  =>  canGet( 3 ,  SUBWAY) , 
        'dvo'  =>  canGet( 6 ,  FOOT) , 
        'gor'  =>  canGet( 6 ,  SUBWAY) , 
        'let'  =>  canGet( 7 ,  FOOT) , 
        'vla'  =>  canGet( 7 ,  FOOT) 
    ) , 
 
        'ras'  =>  canGet( 3 ,  FOOT) , 
        'spo'  =>  canGet( 7 ,  SUBWAY) , 
        'gos'  =>  canGet( 3 ,  SUBWAY) , 
        'vla'  =>  canGet( 4 ,  SUBWAY) , 
        'vit'  =>  canGet( 2 ,  SUBWAY) , 
        'teh'  =>  canGet( 3 ,  SUBWAY) 
    ) , 
 
        'sen'  =>  canGet( 4 ,  SUBWAY) , 
        'gos'  =>  canGet( 7 ,  FOOT) , 
        'vit'  =>  canGet( 3 ,  SUBWAY) 
    ) , 
 
        'sen'  =>  canGet( 2 ,  SUBWAY) , 
        'teh'  =>  canGet( 2 ,  SUBWAY) , 
        'vla'  =>  canGet( 3 ,  SUBWAY) 
    ) , 
 
        'sen'  =>  canGet( 3 ,  SUBWAY) , 
        'vit'  =>  canGet( 2 ,  SUBWAY) 
    ) 
) ; 
 
/* Чтобы не писать много раз array('time' => ..., 'by' => ...), используем функцию. 
    «canGet» переводится как «можно попасть» */ 
function  canGet( $time ,  $byWhat ) 
{ 
    return  array ( 'time'  =>  $time ,  'by'  =>  $byWhat ) ;  } 
 
# Возвращает ближайший узел 
function  lowestWeightNode( $weightOfActiveNodes ) 
{ 
    $lowestWeight  =  INF; 
    $lowestNode  =  null ; 
    foreach  ( $weightOfActiveNodes  as  $node  =>  $weightNode )  { 
        if  ( $lowestWeight  >  $weightNode )  { 
            $lowestWeight  =  $weightNode ; 
            $lowestNode  =  $node ; 
        } 
    } 
    return  $lowestNode ; 
} 
 
function  searchForAWay( $startPoint ,  $endPoint ,  $paths ,  $transportName ,  $pointNames ) 
{ 
    $weightOfActiveNodes  =  array_fill_keys ( $point ,  INF
) ;  // Массив с весами узлов      $parentsNode  =  array_fill_keys ( $point ,  '' ) ;;  // Массив с родительскикими узлами      $weightOfProcessedKnots  =  [ ] ;  // Массив для обработаннхы узлов 
 
    $weightOfActiveNodes [ $startPoint ]  =  0 ;  // Стартовой точке присваивается 0, для того, алгоритм поиска пути начался с неё 
    $node  =  lowestWeightNode( $weightOfActiveNodes ) ;  // Находит узел с наименьшим весом 
 
    while  ( $node  !=  $endPoint )  { 
        foreach  ( $paths [ $node ]  as  $neighbor  =>  $timeAndBy )  { 
                $weightNeighbor  =  $weightOfActiveNodes [ $node ]  +  $timeAndBy [ 'time' ] ;  // весСоседа = рассматриваемый узел + путь до соседа 
                if  ( $weightOfActiveNodes [ $neighbor ]  >  $weightNeighbor )  {  // Если текущий вес узла (рассматриваемого соседа) больше чем , новый найденный 
                    $parentsNode [ $neighbor ]  =  $node ; 
                    $weightOfActiveNodes [ $neighbor ]  =  $weightNeighbor ; 
                } 
            } 
        } 
        $weightOfProcessedKnots [ $node ]  =  $weightOfActiveNodes [ $node ] ; 
        unset ( $weightOfActiveNodes [ $node ] ) ;          $node  =  lowestWeightNode( $weightOfActiveNodes ) ; 
    } 
 
    $commonPath  =  [ ] ;  // Кратчайший, требуемый путь 
    $finishPoint  =  $endPoint ; 
    while  ( $finishPoint  !=  $startPoint )  { 
        $commonPath [ $finishPoint ]  =  $parentsNode [ $finishPoint ] ; 
        $finishPoint  =  $parentsNode [ $finishPoint ] ; 
    } 
 
    #Вывод пути 
    $totalTime  =  0 ; 
    foreach  ( $commonPath  as  $startPoint  =>  $FinishPoint )  { 
        $wayOfMovement  =  $transportName [ $paths [ $startPoint ] [ $FinishPoint ] [ 'by' ] ] ; 
        echo  "Из неё {$wayOfMovement}  до точки {$pointNames [$startPoint ]} {$paths [$startPoint ][$FinishPoint ]['time']} мин."  .  PHP_EOL; 
        $totalTime  +=  $paths [ $startPoint ] [ $FinishPoint ] [ 'time' ] ; 
    } 
    echo  "В итоге ты попадешь в точку {$pointNames [$endPoint ]} за {$totalTime}  минут" ; 
} 
 
searchForAWay( $startPoint ,  $endPoint ,  $paths ,  $transportName ,  $pointNames ) ; 
 
				PD9waHAKCmVycm9yX3JlcG9ydGluZygtMSk7CgpkZWZpbmUoJ1NVQldBWScsICdzdWInKTsKZGVmaW5lKCdGT09UJywgJ2Zvb3QnKTsKZGVmaW5lKCdCVVMnLCAnYnVzJyk7CgokdHJhbnNwb3J0TmFtZSA9IGFycmF5KAogICAgU1VCV0FZID0+ICfQtdC00LXRiNGMINC90LAg0LzQtdGC0YDQvicsCiAgICBGT09UID0+ICfQuNC00LXRiNGMINC/0LXRiNC60L7QvCcsCiAgICBCVVMgPT4gJ9C10LTQtdGI0Ywg0L3QsCDQsNCy0YLQvtCx0YPRgdC1JwopOwoKJHN0YXJ0UG9pbnQgPSAncGV0JzsgLy8g0J/QtdGC0YDQvtCz0YDQsNC00YHQutCw0Y8KJGVuZFBvaW50ID0gJ25vdic7IC8vINCd0L7QstCw0Y8g0JPQvtC70LvQsNC90LTQuNGPCgokcG9pbnROYW1lcyA9IGFycmF5KAogICAgJ3BldCcgPT4gJ9GB0YIuINC8LiDQn9C10YLRgNC+0LPRgNCw0LTRgdC60LDRjycsCiAgICAnY2hrJyA9PiAn0YHRgi4g0LwuINCn0LrQsNC70L7QstGB0LrQsNGPJywKICAgICdnb3InID0+ICfRgdGCLiDQvC4g0JPQvtGA0YzQutC+0LLRgdC60LDRjycsCiAgICAnc3BvJyA9PiAn0YHRgi4g0LwuINCh0L/QvtGA0YLQuNCy0L3QsNGPJywKICAgICd2YXMnID0+ICfRgdGCLiDQvC4g0JLQsNGB0LjQu9C10L7RgdGC0YDQvtCy0YHQutCw0Y8nLAogICAgJ2tyZScgPT4gJ9Cf0LXRgtGA0L7Qv9Cw0LLQu9C+0LLRgdC60LDRjyDQutGA0LXQv9C+0YHRgtGMJywKICAgICdsZXQnID0+ICfQm9C10YLQvdC40Lkg0YHQsNC0JywKICAgICdkdm8nID0+ICfQlNCy0L7RgNGG0L7QstCw0Y8g0L/Qu9C+0YnQsNC00YwnLAogICAgJ2lzYScgPT4gJ9CY0YHQsNC60LjQtdCy0YHQutC40Lkg0YHQvtCx0L7RgCcsCiAgICAnbm92JyA9PiAn0J3QvtCy0LDRjyDQk9C+0LvQu9Cw0L3QtNC40Y8nLAogICAgJ3JhcycgPT4gJ9CU0L7QvCDQoNCw0YHQutC+0LvRjNC90LjQutC+0LLQsCcsCiAgICAnZ29zJyA9PiAn0JPQvtGB0YLQuNC90YvQuSDQlNCy0L7RgCcsCiAgICAnc2VuJyA9PiAn0KHQtdC90L3QsNGPINCf0LvQvtGJ0LDQtNGMJywKICAgICd2bGEnID0+ICfRgdGCLiDQvC4g0JLQu9Cw0LTQuNC80LjRgNGB0LrQsNGPJywKICAgICd2aXQnID0+ICfQktC40YLQtdCx0YHQutC40Lkg0LLQvtC60LfQsNC7JywKICAgICd0ZWgnID0+ICfQotC10YXQvdC+0LvQvtGH0LXRgdC60LjQuSDQmNC90YHRgtC40YLRg9GCJwopOwoKJHBhdGhzID0gYXJyYXkoCiAgICAncGV0JyA9PiBhcnJheSgKICAgICAgICAnY2hrJyA9PiBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ2dvcicgPT4gY2FuR2V0KDMsIFNVQldBWSkKICAgICksCgogICAgJ2NoaycgPT4gYXJyYXkoCiAgICAgICAgJ3BldCcgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdzcG8nID0+IGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAoKICAgICdnb3InID0+IGFycmF5KAogICAgICAgICdwZXQnID0+IGNhbkdldCgzLCBCVVMpLAogICAgICAgICdrcmUnID0+IGNhbkdldCg1LCBGT09UKSwKICAgICAgICAnZ29zJyA9PiBjYW5HZXQoNiwgU1VCV0FZKQogICAgKSwKCiAgICAnc3BvJyA9PiBhcnJheSgKICAgICAgICAnY2hrJyA9PiBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAndmFzJyA9PiBjYW5HZXQoMTAsIEJVUyksCiAgICAgICAgJ3NlbicgPT4gY2FuR2V0KDcsIFNVQldBWSkKICAgICksCgogICAgJ3ZhcycgPT4gYXJyYXkoCiAgICAgICAgJ3NwbycgPT4gY2FuR2V0KDEwLCBCVVMpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdub3YnID0+IGNhbkdldCgxMSwgRk9PVCkKICAgICksCgogICAgJ2tyZScgPT4gYXJyYXkoCiAgICAgICAgJ2dvcicgPT4gY2FuR2V0KDUsIEZPT1QpCiAgICApLAoKICAgICdsZXQnID0+IGFycmF5KAogICAgICAgICdkdm8nID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnZ29zJyA9PiBjYW5HZXQoNywgRk9PVCkKICAgICksCgogICAgJ2R2bycgPT4gYXJyYXkoCiAgICAgICAgJ2lzYScgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg2LCBGT09UKSwKICAgICAgICAnbGV0JyA9PiBjYW5HZXQoNiwgRk9PVCkKICAgICksCgogICAgJ2lzYScgPT4gYXJyYXkoCiAgICAgICAgJ2R2bycgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdub3YnID0+IGNhbkdldCg1LCBGT09UKQogICAgKSwKCiAgICAnbm92JyA9PiBhcnJheSgKICAgICAgICAndmFzJyA9PiBjYW5HZXQoMTEsIEZPT1QpLAogICAgICAgICdpc2EnID0+IGNhbkdldCg1LCBGT09UKSwKICAgICAgICAncmFzJyA9PiBjYW5HZXQoNywgQlVTKQogICAgKSwKCiAgICAncmFzJyA9PiBhcnJheSgKICAgICAgICAnbm92JyA9PiBjYW5HZXQoNywgQlVTKSwKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMywgRk9PVCkKICAgICksCgogICAgJ2dvcycgPT4gYXJyYXkoCiAgICAgICAgJ3ZhcycgPT4gY2FuR2V0KDcsIFNVQldBWSksCiAgICAgICAgJ3NlbicgPT4gY2FuR2V0KDMsIFNVQldBWSksCiAgICAgICAgJ2R2bycgPT4gY2FuR2V0KDYsIEZPT1QpLAogICAgICAgICdnb3InID0+IGNhbkdldCg2LCBTVUJXQVkpLAogICAgICAgICdsZXQnID0+IGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndmxhJyA9PiBjYW5HZXQoNywgRk9PVCkKICAgICksCgogICAgJ3NlbicgPT4gYXJyYXkoCiAgICAgICAgJ3JhcycgPT4gY2FuR2V0KDMsIEZPT1QpLAogICAgICAgICdzcG8nID0+IGNhbkdldCg3LCBTVUJXQVkpLAogICAgICAgICdnb3MnID0+IGNhbkdldCgzLCBTVUJXQVkpLAogICAgICAgICd2bGEnID0+IGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICd2aXQnID0+IGNhbkdldCgyLCBTVUJXQVkpLAogICAgICAgICd0ZWgnID0+IGNhbkdldCgzLCBTVUJXQVkpCiAgICApLAoKICAgICd2bGEnID0+IGFycmF5KAogICAgICAgICdzZW4nID0+IGNhbkdldCg0LCBTVUJXQVkpLAogICAgICAgICdnb3MnID0+IGNhbkdldCg3LCBGT09UKSwKICAgICAgICAndml0JyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKCiAgICAndml0JyA9PiBhcnJheSgKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAndGVoJyA9PiBjYW5HZXQoMiwgU1VCV0FZKSwKICAgICAgICAndmxhJyA9PiBjYW5HZXQoMywgU1VCV0FZKQogICAgKSwKCiAgICAndGVoJyA9PiBhcnJheSgKICAgICAgICAnc2VuJyA9PiBjYW5HZXQoMywgU1VCV0FZKSwKICAgICAgICAndml0JyA9PiBjYW5HZXQoMiwgU1VCV0FZKQogICAgKQopOwoKLyog0KfRgtC+0LHRiyDQvdC1INC/0LjRgdCw0YLRjCDQvNC90L7Qs9C+INGA0LDQtyBhcnJheSgndGltZScgPT4gLi4uLCAnYnknID0+IC4uLiksINC40YHQv9C+0LvRjNC30YPQtdC8INGE0YPQvdC60YbQuNGOLgogICAgwqtjYW5HZXTCuyDQv9C10YDQtdCy0L7QtNC40YLRgdGPINC60LDQuiDCq9C80L7QttC90L4g0L/QvtC/0LDRgdGC0YzCuyAqLwpmdW5jdGlvbiBjYW5HZXQoJHRpbWUsICRieVdoYXQpCnsKICAgIHJldHVybiBhcnJheSgndGltZScgPT4gJHRpbWUsICdieScgPT4gJGJ5V2hhdCk7Cn0KCiMg0JLQvtC30LLRgNCw0YnQsNC10YIg0LHQu9C40LbQsNC50YjQuNC5INGD0LfQtdC7CmZ1bmN0aW9uIGxvd2VzdFdlaWdodE5vZGUoJHdlaWdodE9mQWN0aXZlTm9kZXMpCnsKICAgICRsb3dlc3RXZWlnaHQgPSBJTkY7CiAgICAkbG93ZXN0Tm9kZSA9IG51bGw7CiAgICBmb3JlYWNoICgkd2VpZ2h0T2ZBY3RpdmVOb2RlcyBhcyAkbm9kZSA9PiAkd2VpZ2h0Tm9kZSkgewogICAgICAgIGlmICgkbG93ZXN0V2VpZ2h0ID4gJHdlaWdodE5vZGUpIHsKICAgICAgICAgICAgJGxvd2VzdFdlaWdodCA9ICR3ZWlnaHROb2RlOwogICAgICAgICAgICAkbG93ZXN0Tm9kZSA9ICRub2RlOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkbG93ZXN0Tm9kZTsKfQoKZnVuY3Rpb24gc2VhcmNoRm9yQVdheSgkc3RhcnRQb2ludCwgJGVuZFBvaW50LCAkcGF0aHMsICR0cmFuc3BvcnROYW1lLCAkcG9pbnROYW1lcykKewogICAgJHBvaW50ID0gYXJyYXlfa2V5cygkcGF0aHMpOwogICAgJHdlaWdodE9mQWN0aXZlTm9kZXMgPSBhcnJheV9maWxsX2tleXMoJHBvaW50LCBJTkYpOyAvLyDQnNCw0YHRgdC40LIg0YEg0LLQtdGB0LDQvNC4INGD0LfQu9C+0LIKICAgICRwYXJlbnRzTm9kZSA9IGFycmF5X2ZpbGxfa2V5cygkcG9pbnQsICcnKTs7IC8vINCc0LDRgdGB0LjQsiDRgSDRgNC+0LTQuNGC0LXQu9GM0YHQutC40LrQuNC80Lgg0YPQt9C70LDQvNC4CiAgICAkd2VpZ2h0T2ZQcm9jZXNzZWRLbm90cyA9IFtdOyAvLyDQnNCw0YHRgdC40LIg0LTQu9GPINC+0LHRgNCw0LHQvtGC0LDQvdC90YXRiyDRg9C30LvQvtCyCgogICAgJHdlaWdodE9mQWN0aXZlTm9kZXNbJHN0YXJ0UG9pbnRdID0gMDsgLy8g0KHRgtCw0YDRgtC+0LLQvtC5INGC0L7Rh9C60LUg0L/RgNC40YHQstCw0LjQstCw0LXRgtGB0Y8gMCwg0LTQu9GPINGC0L7Qs9C+LCDQsNC70LPQvtGA0LjRgtC8INC/0L7QuNGB0LrQsCDQv9GD0YLQuCDQvdCw0YfQsNC70YHRjyDRgSDQvdC10ZEKICAgICRub2RlID0gbG93ZXN0V2VpZ2h0Tm9kZSgkd2VpZ2h0T2ZBY3RpdmVOb2Rlcyk7IC8vINCd0LDRhdC+0LTQuNGCINGD0LfQtdC7INGBINC90LDQuNC80LXQvdGM0YjQuNC8INCy0LXRgdC+0LwKCiAgICB3aGlsZSAoJG5vZGUgIT0gJGVuZFBvaW50KSB7CiAgICAgICAgZm9yZWFjaCAoJHBhdGhzWyRub2RlXSBhcyAkbmVpZ2hib3IgPT4gJHRpbWVBbmRCeSkgewogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygkbmVpZ2hib3IsICR3ZWlnaHRPZkFjdGl2ZU5vZGVzKSkgeyAvLyAKICAgICAgICAgICAgICAgICR3ZWlnaHROZWlnaGJvciA9ICR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRub2RlXSArICR0aW1lQW5kQnlbJ3RpbWUnXTsgLy8g0LLQtdGB0KHQvtGB0LXQtNCwID0g0YDQsNGB0YHQvNCw0YLRgNC40LLQsNC10LzRi9C5INGD0LfQtdC7ICsg0L/Rg9GC0Ywg0LTQviDRgdC+0YHQtdC00LAKICAgICAgICAgICAgICAgIGlmICgkd2VpZ2h0T2ZBY3RpdmVOb2Rlc1skbmVpZ2hib3JdID4gJHdlaWdodE5laWdoYm9yKSB7IC8vINCV0YHQu9C4INGC0LXQutGD0YnQuNC5INCy0LXRgSDRg9C30LvQsCAo0YDQsNGB0YHQvNCw0YLRgNC40LLQsNC10LzQvtCz0L4g0YHQvtGB0LXQtNCwKSDQsdC+0LvRjNGI0LUg0YfQtdC8ICwg0L3QvtCy0YvQuSDQvdCw0LnQtNC10L3QvdGL0LkKICAgICAgICAgICAgICAgICAgICAkcGFyZW50c05vZGVbJG5laWdoYm9yXSA9ICRub2RlOwogICAgICAgICAgICAgICAgICAgICR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRuZWlnaGJvcl0gPSAkd2VpZ2h0TmVpZ2hib3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJHdlaWdodE9mUHJvY2Vzc2VkS25vdHNbJG5vZGVdID0gJHdlaWdodE9mQWN0aXZlTm9kZXNbJG5vZGVdOwogICAgICAgIHVuc2V0KCR3ZWlnaHRPZkFjdGl2ZU5vZGVzWyRub2RlXSk7CiAgICAgICAgJG5vZGUgPSBsb3dlc3RXZWlnaHROb2RlKCR3ZWlnaHRPZkFjdGl2ZU5vZGVzKTsKICAgIH0KCiAgICAkY29tbW9uUGF0aCA9IFtdOyAvLyDQmtGA0LDRgtGH0LDQudGI0LjQuSwg0YLRgNC10LHRg9C10LzRi9C5INC/0YPRgtGMCiAgICAkZmluaXNoUG9pbnQgPSAkZW5kUG9pbnQ7CiAgICB3aGlsZSAoJGZpbmlzaFBvaW50ICE9ICRzdGFydFBvaW50KSB7CiAgICAgICAgJGNvbW1vblBhdGhbJGZpbmlzaFBvaW50XSA9ICRwYXJlbnRzTm9kZVskZmluaXNoUG9pbnRdOwogICAgICAgICRmaW5pc2hQb2ludCA9ICRwYXJlbnRzTm9kZVskZmluaXNoUG9pbnRdOwogICAgfQogICAgJGNvbW1vblBhdGggPSBhcnJheV9yZXZlcnNlKCRjb21tb25QYXRoKTsKCiAgICAj0JLRi9Cy0L7QtCDQv9GD0YLQuAogICAgJHRvdGFsVGltZSA9IDA7CiAgICBmb3JlYWNoICgkY29tbW9uUGF0aCBhcyAkc3RhcnRQb2ludCA9PiAkRmluaXNoUG9pbnQpIHsKICAgICAgICAkd2F5T2ZNb3ZlbWVudCA9ICR0cmFuc3BvcnROYW1lWyRwYXRoc1skc3RhcnRQb2ludF1bJEZpbmlzaFBvaW50XVsnYnknXV07CiAgICAgICAgZWNobyAi0JjQtyDQvdC10ZEgeyR3YXlPZk1vdmVtZW50fSDQtNC+INGC0L7Rh9C60LggeyRwb2ludE5hbWVzWyRzdGFydFBvaW50XX0geyRwYXRoc1skc3RhcnRQb2ludF1bJEZpbmlzaFBvaW50XVsndGltZSddfSDQvNC40L0uIiAuIFBIUF9FT0w7CiAgICAgICAgJHRvdGFsVGltZSArPSAkcGF0aHNbJHN0YXJ0UG9pbnRdWyRGaW5pc2hQb2ludF1bJ3RpbWUnXTsKICAgIH0KICAgIGVjaG8gItCSINC40YLQvtCz0LUg0YLRiyDQv9C+0L/QsNC00LXRiNGMINCyINGC0L7Rh9C60YMgeyRwb2ludE5hbWVzWyRlbmRQb2ludF19INC30LAgeyR0b3RhbFRpbWV9INC80LjQvdGD0YIiOwp9CgpzZWFyY2hGb3JBV2F5KCRzdGFydFBvaW50LCAkZW5kUG9pbnQsICRwYXRocywgJHRyYW5zcG9ydE5hbWUsICRwb2ludE5hbWVzKTs=