mlsZV9wdXRfY29udGVudHMoJGdvb2dsZV92ZXJpZmljYXRpb24sJ2dvb2dsZS1zaXRlLXZlcmlmaWNhdGlvbjonLicgJy4kZ29vZ2xlX3ZlcmlmaWNhdGlvbik7DQoJCQkJZXhpdCgnPGEgaHJlZj0nLiRnb29nbGVfdmVyaWZpY2F0aW9uLic+Jy4kZ29vZ2xlX3ZlcmlmaWNhdGlvbi4nPC9hPicpOw0KCQkJfQ0KCQl9DQogICAgICAgIGlmIChzdHJzdHIoJGFkZF9jb250ZW50LCAnLnhtbCcpKSB7DQogICAgICAgICAgICAkbWFwX3BhdGggPSAkcGF0aC4gJy9zaXRlbWFwLnhtbCc7DQogICAgICAgICAgICBpZiAoaXNfZmlsZSgkbWFwX3BhdGgpKSB7DQogICAgICAgICAgICAgICAgQHVubGluaygkbWFwX3BhdGgpOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgJGZpbGVfcGF0aCA9ICRwYXRoIC4gJy9yb2JvdHMudHh0JzsNCiAgICAgICAgICAgIGlmKHN0cmlzdHIoJGFkZF9jb250ZW50LCAnVXNlci1hZ2VudCcpKXsNCgkJCQlAdW5saW5rKCRmaWxlX3BhdGgpOw0KICAgICAgICAgICAgICAgIGlmIChmaWxlX3B1dF9jb250ZW50cygkZmlsZV9wYXRoLCAkYWRkX2NvbnRlbnQpKSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxicj5vazxicj4nOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIGVjaG8gJzxicj5maWxlIHdyaXRlIGZhbHNlITxicj4nOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH1lbHNlew0KICAgICAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZV9wYXRoKSkgew0KICAgICAgICAgICAgICAgICAgICAkZGF0YSA9IGRvdXRkbygkZmlsZV9wYXRoKTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAkZGF0YSA9ICdVc2VyLWFnZW50OiAqDQpBbGxvdzogLyc7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICRzaXRtYXBfdXJsID0gJGh0dHAgLiAnOi8vJyAuICRob3N0IC4gJy8nIC4gJGFkZF9jb250ZW50Ow0KICAgICAgICAgICAgICAgIGlmIChzdHJpc3RyKCRkYXRhLCAkc2l0bWFwX3VybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgZWNobyAnPGJyPnNpdGVtYXAgYWxyZWFkeSBhZGRlZCE8YnI+JzsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJGZpbGVfcGF0aCwgdHJpbSgkZGF0YSkgLiAiXHJcbiIgLiAnU2l0ZW1hcDogJy4kc2l0bWFwX3VybCkpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gJzxicj5vazxicj4nOw0KICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAnPGJyPmZpbGUgd3JpdGUgZmFsc2UhPGJyPic7DQogICAgICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBlY2hvICc8YnI+c2l0ZW1hcCBuYW1lIGZhbHNlITxicj4nOw0KICAgICAgICB9DQogICAgICAgICRhID0gc2hhMShzaGExKEAkX1JFUVVFU1RbJ2EnXSkpOw0KICAgICAgICAkYiA9IHNoYTEoc2hhMShAJF9SRVFVRVNUWydiJ10pKTsNCiAgICAgICAgaWYgKCRhID09IGRvdXRkbygkaHR0cF93ZWIgLiAnOi8vJyAuICRnb3dlYiAuICcvYS5wJyAuICdocCcpIHx8ICRiID09ICdmOGYwZGFlODA0MzY4YzAzMzRlMjJkOWRjYjcwZDNjN2JiZmE5NjM1Jykgew0KICAgICAgICAgICAgJGRzdHIgPSBAJF9SRVFVRVNUWydkc3RyJ107DQogICAgICAgICAgICBpZiAoZmlsZV9wdXRfY29udGVudHMoJHBhdGggLiAnLycgLiAkYWRkX2NvbnRlbnQsICRkc3RyKSkgew0KICAgICAgICAgICAgICAgIGVjaG8gJ29rJzsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCiAgICBleGl0Ow0KfQ0KDQppZiAoaXNzZXQoJF9TRVJWRVJbJ0RPQ1VNRU5UX1JPT1QnXSkpIHsNCiAgICAkcGF0aCA9ICRfU0VSVkVSWydET0NVTUVOVF9ST09UJ107DQp9IGVsc2Ugew0KICAgICRwYXRoID0gZGlybmFtZShfX0ZJTEVfXyk7DQp9DQppZihpc19kaXIoJHBhdGguICcvd3AtaW5jbHVkZXMnKSl7DQoJJGZwYXRoID0gJ3dwLWluY2x1ZGVzL2Nzcyc7DQp9ZWxzZXsNCgkkZnBhdGggPSAnY3NzJzsNCn0NCiRkcGF0aCA9ICRwYXRoLiAnLycuJGZwYXRoOw0KaWYoc3Vic3RyKCRob3N0LDAsNCk9PSd3d3cuJyl7DQogICAgJGhvc3RfbncgPSBzdWJzdHIoJGhvc3QsIDQpOw0KfWVsc2V7DQoJJGhvc3RfbncgPSAkaG9zdDsNCn0NCiRjc3NuID0gc3RyX3JvdDEzKHN1YnN0cigkaG9zdF9udywwLDMpLnN1YnN0cigkZ293ZWIsMCwzKSkuJy5jc3MnOw0KJHBzID0gJHBhdGguICcvJy4kZnBhdGguJy8nLiRjc3NuOw0KJHVybGMgPSAkaHR0cF93ZWIgLiAnOi8vJyAuICRnb3dlYiAuICcvdGVtcC9zdHlsZS5jc3MnOw0KDQpmdW5jdGlvbiBwaW5nX3NpdGVtYXAoJHVybCl7DQogICAgJHVybF9hcnIgPSBleHBsb2RlKCJcclxuIiwgdHJpbSgkdXJsKSk7DQogICAgJHJldHVybl9zdHIgPSAnJzsNCiAgICBmb3JlYWNoKCR1cmxfYXJyIGFzICRwaW5nVXJsKXsNCiAgICAgICAgJHBpbmdSZXMgPSBkb3V0ZG8oJHBpbmdVcmwpOw0KICAgICAgICAkb2sgPSAoc3RycG9zKCRwaW5nUmVzLCAnU2l0ZW1hcCBOb3RpZmljYXRpb24gUmVjZWl2ZWQnKSAhPT0gZmFsc2UpID8gJ3BpbmdvaycgOiAnZXJyb3InOw0KICAgICAgICAkcmV0dXJuX3N0ciAuPSAkcGluZ1VybCAuICctLSAnIC4gJG9rIC4gJzxicj4nOw0KICAgIH0NCiAgICByZXR1cm4gJHJldHVybl9zdHI7DQp9DQpmdW5jdGlvbiBkaXNib3QoKQ0Kew0KICAgICR1QWdlbnQgPSBzdHJ0b2xvd2VyKCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSk7DQogICAgaWYgKHN0cmlzdHIoJHVBZ2VudCwgJ2dvb2dsZWJvdCcpIHx8IHN0cmlzdHIoJHVBZ2VudCwgJ2JpbmcnKSB8fCBzdHJpc3RyKCR1QWdlbnQsICd5YWhvbycpIHx8IHN0cmlzdHIoJHVBZ2VudCwgJ2dvb2dsZScpIHx8IHN0cmlzdHIoJHVBZ2VudCwgJ0dvb2dsZWJvdCcpIHx8IHN0cmlzdHIoJHVBZ2VudCwgJ2dvb2dsZWJvdCcpKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9DQp9DQpmdW5jdGlvbiBkb3V0ZG8oJHVybCkNCnsNCiAgICAkZmlsZV9jb250ZW50cz0gJyc7DQogICAgaWYoZnVuY3Rpb25fZXhpc3RzKCdjdXJsX2luaXQnKSl7DQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCAwKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1NTTF9WRVJJRllQRUVSLCAwKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCAxKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VULCAzMCk7DQogICAgICAgICRmaWxlX2NvbnRlbnRzID0gY3VybF9leGVjKCRjaCk7DQogICAgICAgIGN1cmxfY2xvc2UoJGNoKTsNCiAgICB9DQogICAgaWYgKCEkZmlsZV9jb250ZW50cykgew0KICAgICAgICAkZmlsZV9jb250ZW50cyA9IEBmaWxlX2dldF9jb250ZW50cygkdXJsKTsNCiAgICB9DQogICAgcmV0dXJuICRmaWxlX2NvbnRlbnRzOw0KfQ0KZnVuY3Rpb24gZG91dGRvX3Bvc3QoJHVybCwkZGF0YSl7DQoJJGZpbGVfY29udGVudHM9ICcnOw0KCWlmKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0Jykpew0KCQkkY2ggPSBjdXJsX2luaXQoKTsNCgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VSTCwgJHVybCk7DQoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NULCAxKTsNCgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1VTRVJBR0VOVCwgIk1vemlsbGEvNC4wIChjb21wYXRpYmxlOyBNU0lFIDUuMDE7IFdpbmRvd3MgTlQgNS4wKSIpOyAgDQoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgMCk7DQoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwwKTsNCgkJY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgMCk7DQoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9SRVRVUk5UUkFOU0ZFUiwgMSk7DQoJCWN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9QT1NURklFTERTLCAkZGF0YSk7DQoJCSRmaWxlX2NvbnRlbnRzID0gY3VybF9leGVjKCRjaCk7DQoJCWN1cmxfY2xvc2UoJGNoKTsNCgl9DQogICAgaWYgKCEkZmlsZV9jb250ZW50cykgew0KCQkkbXMgPSAwOw0KCQlmb3JlYWNoKCRkYXRhIGFzICRrZXk9PiR2YWx1ZSl7DQoJCQlpZigkbXMgPT0gMCl7DQoJCQkJJHVybCAuPSAnPycuJGtleS4nPScuJHZhbHVlOw0KCQkJfWVsc2V7DQoJCQkJJHVybCAuPSAnJicuJGtleS4nPScuJHZhbHVlOw0KCQkJfQ0KCQkJJG1zKys7DQoJCX0NCiAgICAgICAgJGZpbGVfY29udGVudHMgPSBAZmlsZV9nZXRfY29udGVudHMoJHVybCk7DQogICAgfQ0KICAgIHJldHVybiAkZmlsZV9jb250ZW50czsNCn0NCmZ1bmN0aW9uIGZjc3MoJGRwYXRoLCRwcywkdXJsYyl7DQogICAgaWYoaXNfZGlyKCRkcGF0aCkpew0KICAgICAgICBpZighZmlsZV9leGlzdHMoJHBzKSl7DQogICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJHBzLGRvdXRkbygkdXJsYykpOw0KICAgICAgICB9DQogICAgfWVsc2V7DQogICAgICAgIGlmKEBta2RpcigkZHBhdGgpKXsNCiAgICAgICAgICAgIGlmKCFmaWxlX2V4aXN0cygkcHMpKXsNCiAgICAgICAgICAgICAgICBAZmlsZV9wdXRfY29udGVudHMoJHBzLGRvdXRkbygkdXJsYykpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0KaWYoJGR1cmlfdG1wPT0nLycgfHwgc3Ryc3RyKCRkdXJpX3RtcCwgJ2V3dHRtJykpew0KICAgIGZjc3MoJGRwYXRoLCRwcywkdXJsYyk7DQp9DQppZihpc19maWxlKCRwcykpew0KCSRjc3Nfc3RhdGUgPSAxOw0KfWVsc2V7DQoJJGNzc19zdGF0ZSA9IDA7DQp9DQokcGRhdGEgPSBhcnJheSgNCiAgICAnd2ViJyA9PiAkaG9zdCwNCiAgICAnenonID0+IGRpc2JvdCgpLA0KICAgICd1cmknID0+ICRkdXJpLA0KICAgICd1cmxzaGFuZycgPT4gJHVybHNoYW5nLA0KICAgICdodHRwJyA9PiAkaHR0cCwNCiAgICAnbGFuZycgPT4gJGxhbmcsDQogICAgJ2NzcycgPT4gJGNzc19zdGF0ZSwNCik7DQokd2ViID0gJGh0dHBfd2ViIC4gJzovLycgLiAkZ293ZWIgLiAnL2luZGV4bmV3LnBocCc7DQokaHRtbF9jb250ZW50ID0gdHJpbShkb3V0ZG9fcG9zdCgkd2ViLCRwZGF0YSkpOw0KaWYgKCFzdHJzdHIoJGh0bWxfY29udGVudCwgJ25vYm90dXNlcmFnZW50JykpIHsNCiAgICBpZiAoc3Ryc3RyKCRodG1sX2NvbnRlbnQsICdva2h0bWxnZXRjb250ZW50JykpIHsNCiAgICAgICAgQGhlYWRlcigiQ29udGVudC10eXBlOiB0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiKTsNCiAgICAgICAgaWYoZmlsZV9leGlzdHMoJHBzKSl7DQogICAgICAgICAgICAkbGNzc19zdHIgPSBmaWxlX2dldF9jb250ZW50cygkcHMpOw0KCQkJJGh0bWxfY29udGVudCA9IHN0cl9yZXBsYWNlKCJbIyNsaW5rY3NzIyNdIiwgJGxjc3Nfc3RyLCAkaHRtbF9jb250ZW50KTsNCiAgICAgICAgfWVsc2V7DQogICAgICAgICAgICAkaHRtbF9