PD9waHAKCm5hbWVzcGFjZSBBcHBcRmlsYW1lbnRcQWRtaW5cUmVzb3VyY2VzOwoKdXNlIEFwcFxGaWxhbWVudFxBZG1pblxSZXNvdXJjZXNcU3Vic2NyaXB0aW9uUGxhblJlc291cmNlXFBhZ2VzOwp1c2UgQXBwXE1vZGVsc1xTdWJzY3JpcHRpb25QbGFuOwp1c2UgRmlsYW1lbnRcRm9ybXM7CnVzZSBGaWxhbWVudFxGb3Jtc1xGb3JtOwp1c2UgRmlsYW1lbnRcUmVzb3VyY2VzXFJlc291cmNlOwp1c2UgRmlsYW1lbnRcVGFibGVzOwp1c2UgRmlsYW1lbnRcVGFibGVzXFRhYmxlOwoKY2xhc3MgU3Vic2NyaXB0aW9uUGxhblJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UKewogICAgcHJvdGVjdGVkIHN0YXRpYyA/c3RyaW5nICRtb2RlbCA9IFN1YnNjcmlwdGlvblBsYW46OmNsYXNzOwoKICAgIHByb3RlY3RlZCBzdGF0aWMgP3N0cmluZyAkbmF2aWdhdGlvbkljb24gPSAnaGVyb2ljb24tby1jcmVkaXQtY2FyZCc7CiAgICBwcm90ZWN0ZWQgc3RhdGljID9zdHJpbmcgJG5hdmlnYXRpb25Hcm91cCA9ICfYp9mE2KXYr9in2LHYqSc7CiAgICBwcm90ZWN0ZWQgc3RhdGljID9zdHJpbmcgJG5hdmlnYXRpb25MYWJlbCA9ICfYrti32Lcg2KfZhNin2LTYqtix2KfZgyc7CiAgICBwcm90ZWN0ZWQgc3RhdGljID9zdHJpbmcgJG1vZGVsTGFiZWwgPSAn2K7Yt9iq2YMg2KfYtNiq2LHYp9mDJzsKICAgIHByb3RlY3RlZCBzdGF0aWMgP3N0cmluZyAkbW9kZWxMYWJlbFBsdXJhbCA9ICfYrti32Lcg2KfZhNin2LTYqtix2KfZgyc7CiAgICBwcm90ZWN0ZWQgc3RhdGljID9pbnQgJG5hdmlnYXRpb25Tb3J0ID0gMzsKCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm0oRm9ybSAkZm9ybSk6IEZvcm0KICAgIHsKICAgICAgICByZXR1cm4gJGZvcm0KICAgICAgICAgICAgLT5zY2hlbWEoWwogICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xTZWN0aW9uOjptYWtlKCfYqNmK2KfZhtin2Kog2KfZhNiu2LfYqScpCiAgICAgICAgICAgICAgICAgICAgLT5zY2hlbWEoWwogICAgICAgICAgICAgICAgICAgICAgICBGb3Jtc1xDb21wb25lbnRzXFRleHRJbnB1dDo6bWFrZSgnbmFtZV9hcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfYp9mE2KfYs9mFINio2KfZhNi52LHYqNmKJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cmVxdWlyZWQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5tYXhMZW5ndGgoMjU1KSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xUZXh0SW5wdXQ6Om1ha2UoJ25hbWVfZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2KfZhNin2LPZhSDYqNin2YTYpdmG2KzZhNmK2LLZiicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnJlcXVpcmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWF4TGVuZ3RoKDI1NSksCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1zXENvbXBvbmVudHNcVGV4dElucHV0OjptYWtlKCdzbHVnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9in2YTYsdin2KjYtycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnJlcXVpcmVkKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+dW5pcXVlKGlnbm9yZVJlY29yZDogdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bWF4TGVuZ3RoKDI1NSksCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1zXENvbXBvbmVudHNcVGV4dElucHV0OjptYWtlKCdwcmljZScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfYp9mE2LPYudixJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bnVtZXJpYygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByZWZpeCgn2Kwu2YUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5yZXF1aXJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBGb3Jtc1xDb21wb25lbnRzXFRleHRJbnB1dDo6bWFrZSgnZHVyYXRpb25fZGF5cycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfYp9mE2YXYr9ipICjYo9mK2KfZhSknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5udW1lcmljKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdCgzMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+cmVxdWlyZWQoKSwKICAgICAgICAgICAgICAgICAgICBdKS0+Y29sdW1ucygyKSwKCiAgICAgICAgICAgICAgICBGb3Jtc1xDb21wb25lbnRzXFNlY3Rpb246Om1ha2UoJ9in2YTZhdmF2YrYstin2KonKQogICAgICAgICAgICAgICAgICAgIC0+c2NoZW1hKFsKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xSZXBlYXRlcjo6bWFrZSgnZmVhdHVyZXNfYXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2KfZhNmF2YXZitiy2KfYqiDYqNin2YTYudix2KjZiicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNjaGVtYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xUZXh0SW5wdXQ6Om1ha2UoJ2ZlYXR1cmUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfYp9mE2YXZitiy2KknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnJlcXVpcmVkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5kZWZhdWx0SXRlbXMoMykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Y29sdW1uU3BhbkZ1bGwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xSZXBlYXRlcjo6bWFrZSgnZmVhdHVyZXNfZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2KfZhNmF2YXZitiy2KfYqiDYqNin2YTYpdmG2KzZhNmK2LLZiicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnNjaGVtYShbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xUZXh0SW5wdXQ6Om1ha2UoJ2ZlYXR1cmUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCdGZWF0dXJlJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5yZXF1aXJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdEl0ZW1zKDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmNvbHVtblNwYW5GdWxsKCksCiAgICAgICAgICAgICAgICAgICAgXSksCgogICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xTZWN0aW9uOjptYWtlKCfYp9mE2KXYudiv2KfYr9in2KonKQogICAgICAgICAgICAgICAgICAgIC0+c2NoZW1hKFsKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNcQ29tcG9uZW50c1xUZXh0SW5wdXQ6Om1ha2UoJ3F1ZXN0aW9ubmFpcmVfbGltaXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2K3YryDYp9mE2KfYs9iq2KjZitin2YbYp9iqINi02YfYsdmK2KfZiycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm51bWVyaWMoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5kZWZhdWx0KDUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmhlbHBlclRleHQoJ9i52K/YryDYp9mE2KfYs9iq2KjZitin2YbYp9iqINin2YTZhdiz2YXZiNitINio2YfYpyDZhNmE2K/Zg9iq2YjYsSDZgdmKINin2YTYtNmH2LEnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5yZXF1aXJlZCgpLAogICAgICAgICAgICAgICAgICAgICAgICBGb3Jtc1xDb21wb25lbnRzXFRleHRJbnB1dDo6bWFrZSgndmlzaWJpbGl0eV9ib29zdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfZgtmI2Kkg2KfZhNi42YfZiNixINmB2Yog2KfZhNi12YHYrdipINin2YTYsdim2YrYs9mK2KknKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5udW1lcmljKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdCgxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5taW5WYWx1ZSgxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5tYXhWYWx1ZSg1KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5oZWxwZXJUZXh0KCfYudiv2K8g2YXYsdin2Kog2LjZh9mI2LEg2KfZhNiv2YPYqtmI2LEg2YHZiiDYp9mE2LXZgdit2Kkg2KfZhNix2KbZitiz2YrYqSAoMSA9INi52KfYr9mK2IwgNSA9INij2YLYtdmJINi42YfZiNixKScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnJlcXVpcmVkKCksCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1zXENvbXBvbmVudHNcVGV4dElucHV0OjptYWtlKCdzb3J0X29yZGVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9in2YTYqtix2KrZitioJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+bnVtZXJpYygpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmRlZmF1bHQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1zXENvbXBvbmVudHNcVG9nZ2xlOjptYWtlKCdpc19hY3RpdmUnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2YbYtNi3JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ZGVmYXVsdCh0cnVlKSwKICAgICAgICAgICAgICAgICAgICBdKS0+Y29sdW1ucyg0KSwKICAgICAgICAgICAgXSk7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0YWJsZShUYWJsZSAkdGFibGUpOiBUYWJsZQogICAgewogICAgICAgIHJldHVybiAkdGFibGUKICAgICAgICAgICAgLT5jb2x1bW5zKFsKICAgICAgICAgICAgICAgIFRhYmxlc1xDb2x1bW5zXFRleHRDb2x1bW46Om1ha2UoJ25hbWVfYXInKQogICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9in2YTYp9iz2YUnKQogICAgICAgICAgICAgICAgICAgIC0+c2VhcmNoYWJsZSgpLAogICAgICAgICAgICAgICAgVGFibGVzXENvbHVtbnNcVGV4dENvbHVtbjo6bWFrZSgncHJpY2UnKQogICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9in2YTYs9i52LEnKQogICAgICAgICAgICAgICAgICAgIC0+bW9uZXkoJ0VHUCcpLAogICAgICAgICAgICAgICAgVGFibGVzXENvbHVtbnNcVGV4dENvbHVtbjo6bWFrZSgnZHVyYXRpb25fZGF5cycpCiAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2KfZhNmF2K/YqScpCiAgICAgICAgICAgICAgICAgICAgLT5zdWZmaXgoJyDZitmI2YUnKSwKICAgICAgICAgICAgICAgIFRhYmxlc1xDb2x1bW5zXFRleHRDb2x1bW46Om1ha2UoJ3F1ZXN0aW9ubmFpcmVfbGltaXQnKQogICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9it2K8g2KfZhNin2LPYqtio2YrYp9mG2KfYqicpCiAgICAgICAgICAgICAgICAgICAgLT5zdWZmaXgoJyAvINi02YfYsScpCiAgICAgICAgICAgICAgICAgICAgLT5zb3J0YWJsZSgpLAogICAgICAgICAgICAgICAgVGFibGVzXENvbHVtbnNcSWNvbkNvbHVtbjo6bWFrZSgnaXNfYWN0aXZlJykKICAgICAgICAgICAgICAgICAgICAtPmxhYmVsKCfZhti02LcnKQogICAgICAgICAgICAgICAgICAgIC0+Ym9vbGVhbigpLAogICAgICAgICAgICAgICAgVGFibGVzXENvbHVtbnNcVGV4dENvbHVtbjo6bWFrZSgnc29ydF9vcmRlcicpCiAgICAgICAgICAgICAgICAgICAgLT5sYWJlbCgn2KfZhNiq2LHYqtmK2KgnKQogICAgICAgICAgICAgICAgICAgIC0+c29ydGFibGUoKSwKICAgICAgICAgICAgICAgIFRhYmxlc1xDb2x1bW5zXFRleHRDb2x1bW46Om1ha2UoJ3Zpc2liaWxpdHlfYm9vc3QnKQogICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9mC2YjYqSDYp9mE2LjZh9mI2LEnKQogICAgICAgICAgICAgICAgICAgIC0+YmFkZ2UoKQogICAgICAgICAgICAgICAgICAgIC0+Y29sb3IoJ3N1Y2Nlc3MnKQogICAgICAgICAgICAgICAgICAgIC0+c29ydGFibGUoKSwKICAgICAgICAgICAgICAgIFRhYmxlc1xDb2x1bW5zXFRleHRDb2x1bW46Om1ha2UoJ3N1YnNjcmlwdGlvbnNfY291bnQnKQogICAgICAgICAgICAgICAgICAgIC0+bGFiZWwoJ9in2YTYp9i02KrYsdin2YPYp9iqJykKICAgICAgICAgICAgICAgICAgICAtPmNvdW50cygnc3Vic2NyaXB0aW9ucycpCiAgICAgICAgICAgICAgICAgICAgLT5zb3J0YWJsZSgpLAogICAgICAgICAgICBdKQogICAgICAgICAgICAtPmFjdGlvbnMoWwogICAgICAgICAgICAgICAgVGFibGVzXEFjdGlvbnNcRWRpdEFjdGlvbjo6bWFrZSgpLAogICAgICAgICAgICAgICAgVGFibGVzXEFjdGlvbnNcRGVsZXRlQWN0aW9uOjptYWtlKCksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgIC0+YnVsa0FjdGlvbnMoWwogICAgICAgICAgICAgICAgVGFibGVzXEFjdGlvbnNcQnVsa0FjdGlvbkdyb3VwOjptYWtlKFsKICAgICAgICAgICAgICAgICAgICBUYWJsZXNcQWN0aW9uc1xEZWxldGVCdWxrQWN0aW9uOjptYWtlKCksCiAgICAgICAgICAgICAgICBdKSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgLT5kZWZhdWx0U29ydCgnc29ydF9vcmRlcicpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFnZXMoKTogYXJyYXkKICAgIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAnaW5kZXgnID0+IFBhZ2VzXExpc3RTdWJzY3JpcHRpb25QbGFuczo6cm91dGUoJy8nKSwKICAgICAgICAgICAgJ2NyZWF0ZScgPT4gUGFnZXNcQ3JlYXRlU3Vic2NyaXB0aW9uUGxhbjo6cm91dGUoJy9jcmVhdGUnKSwKICAgICAgICAgICAgJ2VkaXQnID0+IFBhZ2VzXEVkaXRTdWJzY3JpcHRpb25QbGFuOjpyb3V0ZSgnL3tyZWNvcmR9L2VkaXQnKSwKICAgICAgICBdOwogICAgfQp9Cg==PD9waHAKbmFtZXNwYWNlIEFwcFxIdHRwXENvbnRyb2xsZXJzOwoKdXNlIEFwcFxNb2RlbHNcQXJ0aWNsZTsKdXNlIEFwcFxNb2RlbHNcUXVlc3Rpb247CnVzZSBBcHBcTW9kZWxzXFNwZWNpYWxpc3Q7CnVzZSBBcHBcTW9kZWxzXFNwZWNpYWxpemF0aW9uOwp1c2UgSWxsdW1pbmF0ZVxTdXBwb3J0XENvbGxlY3Rpb247CgpjbGFzcyBIb21lQ29udHJvbGxlciBleHRlbmRzIENvbnRyb2xsZXIKewogICAgcHVibGljIGZ1bmN0aW9uIF9faW52b2tlKCkKICAgIHsKICAgICAgICAkZmVhdHVyZWRTcGVjaWFsaXN0cyA9ICR0aGlzLT5nZXRCb29zdGVkU3BlY2lhbGlzdHMoCiAgICAgICAgICAgIGZlYXR1cmVkOiB0cnVlLAogICAgICAgICAgICBsaW1pdDogNgogICAgICAgICk7CgogICAgICAgICR0b3BTY29yZWREb2N0b3JzID0gJHRoaXMtPmdldEJvb3N0ZWRTcGVjaWFsaXN0cygKICAgICAgICAgICAgZmVhdHVyZWQ6IGZhbHNlLAogICAgICAgICAgICBsaW1pdDogOAogICAgICAgICk7CgogICAgICAgICRzcGVjaWFsaXphdGlvbnMgPSBTcGVjaWFsaXphdGlvbjo6d2hlcmUoJ2lzX2FjdGl2ZScsIHRydWUpCiAgICAgICAgICAgIC0+d2l0aENvdW50KCdzcGVjaWFsaXN0cycpCiAgICAgICAgICAgIC0+b3JkZXJCeSgnc29ydF9vcmRlcicpCiAgICAgICAgICAgIC0+bGltaXQoNikKICAgICAgICAgICAgLT5nZXQoKTsKCiAgICAgICAgJHF1ZXN0aW9ucyA9IFF1ZXN0aW9uOjp3aGVyZSgnaXNfYWN0aXZlJywgdHJ1ZSkKICAgICAgICAgICAgLT53aGVyZU5vdE51bGwoJ2Fuc3dlcicpCiAgICAgICAgICAgIC0+d2l0aCgnc3BlY2lhbGlzdCcpCiAgICAgICAgICAgIC0+b3JkZXJCeSgnc29ydF9vcmRlcicpCiAgICAgICAgICAgIC0+bGltaXQoOCkKICAgICAgICAgICAgLT5nZXQoKTsKCiAgICAgICAgJGZlYXR1cmVkQXJ0aWNsZXMgPSBBcnRpY2xlOjp3aGVyZSgnaXNfYWN0aXZlJywgdHJ1ZSkKICAgICAgICAgICAgLT53aGVyZSgnaXNfZmVhdHVyZWQnLCB0cnVlKQogICAgICAgICAgICAtPm9yZGVyQnkoJ2NyZWF0ZWRfYXQnLCAnZGVzYycpCiAgICAgICAgICAgIC0+bGltaXQoMykKICAgICAgICAgICAgLT5nZXQoKTsKCiAgICAgICAgJHNwZWNpYWxpc3RzQ291bnQgPSBTcGVjaWFsaXN0Ojp3aGVyZSgnaXNfYWN0aXZlJywgdHJ1ZSktPmNvdW50KCk7CiAgICAgICAgJGNvbnN1bHRhdGlvbnNDb3VudCA9IFxBcHBcTW9kZWxzXEFwcG9pbnRtZW50Ojp3aGVyZSgnYm9va2luZ19zdGF0dXMnLCAnY29uZmlybWVkJyktPmNvdW50KCk7CgogICAgICAgIHJldHVybiB2aWV3KCdwYWdlcy5ob21lJywgY29tcGFjdCgnZmVhdHVyZWRTcGVjaWFsaXN0cycsICd0b3BTY29yZWREb2N0b3JzJywgJ3NwZWNpYWxpemF0aW9ucycsICdxdWVzdGlvbnMnLCAnZmVhdHVyZWRBcnRpY2xlcycsICdzcGVjaWFsaXN0c0NvdW50JywgJ2NvbnN1bHRhdGlvbnNDb3VudCcpKTsKICAgIH0KCiAgICBwcml2YXRlIGZ1bmN0aW9uIGdldEJvb3N0ZWRTcGVjaWFsaXN0cyhib29sICRmZWF0dXJlZCwgaW50ICRsaW1pdCk6IENvbGxlY3Rpb24KICAgIHsKICAgICAgICAkcXVlcnkgPSBTcGVjaWFsaXN0Ojp3aXRoKFsndXNlcicsICdzcGVjaWFsaXphdGlvbnMnXSkKICAgICAgICAgICAgLT53aGVyZSgnaXNfYWN0aXZlJywgdHJ1ZSkKICAgICAgICAgICAgLT53aXRoQ291bnQoJ2FwcG9pbnRtZW50cycpCiAgICAgICAgICAgIC0+d2l0aCgnc3Vic2NyaXB0aW9uLnBsYW4nKTsKCiAgICAgICAgaWYgKCRmZWF0dXJlZCkgewogICAgICAgICAgICAkcXVlcnktPndoZXJlKCdpc19mZWF0dXJlZCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgJHNwZWNpYWxpc3RzID0gJHF1ZXJ5LT5nZXQoKTsKCiAgICAgICAgJGJvb3N0ZWQgPSBjb2xsZWN0KCk7CiAgICAgICAgZm9yZWFjaCAoJHNwZWNpYWxpc3RzIGFzICRzcGVjaWFsaXN0KSB7CiAgICAgICAgICAgICRib29zdCA9ICRzcGVjaWFsaXN0LT5zdWJzY3JpcHRpb24gJiYgJHNwZWNpYWxpc3QtPnN1YnNjcmlwdGlvbi0+cGxhbgogICAgICAgICAgICAgICAgPyAoJHNwZWNpYWxpc3QtPnN1YnNjcmlwdGlvbi0+cGxhbi0+dmlzaWJpbGl0eV9ib29zdCA/PyAxKQogICAgICAgICAgICAgICAgOiAxOwoKICAgICAgICAgICAgZm9yICgkaSA9IDA7ICRpIDwgJGJvb3N0OyAkaSsrKSB7CiAgICAgICAgICAgICAgICAkYm9vc3RlZC0+cHVzaCgkc3BlY2lhbGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAkYm9vc3RlZAogICAgICAgICAgICAtPnNvcnRCeURlc2MoZm4oJHMpID0+ICRzLT52aXNpYmlsaXR5X3Njb3JlID8/IDApCiAgICAgICAgICAgIC0+c29ydEJ5KCdzb3J0X29yZGVyJykKICAgICAgICAgICAgLT51bmlxdWUoJ2lkJykKICAgICAgICAgICAgLT50YWtlKCRsaW1pdCkKICAgICAgICAgICAgLT52YWx1ZXMoKTsKICAgIH0KfQo=