LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbCmxvY2FsIGZ1bmN0aW9uIGZvbygpCmVuZApmb28oKQpBID0gMQpBID0gMgpBID0gMwpdXSwgezIsIDMsIDIsIDQsIDUsIDZ9KQoKCnRlc3QoW1stLQppZiBuaWwgdGhlbgogIGE9MQplbHNlCiAgYT0yCmVuZApdXSwgezIsNSw2fSkKCnRlc3QoW1thPTEKcmVwZWF0CiAgYT1hKzEKdW50aWwgYT09MwpdXSwgezEsMyw0LDMsNH0pCgp0ZXN0KFtbIGRvCiAgcmV0dXJuCmVuZApdXSwgezJ9KQoKdGVzdChbW2xvY2FsIGEKYT0xCndoaWxlIGE8PTMgZG8KICBhPWErMQplbmQKXV0sIHsxLDIsMyw0LDMsNCwzLDQsMyw1fSkKCnRlc3QoW1t3aGlsZSBtYXRoLnNpbigxKSBkbwogIGlmIG1hdGguc2luKDEpCiAgdGhlbiBicmVhawogIGVuZAplbmQKYT0xXV0sIHsxLDIsMyw2fSkKCnRlc3QoW1tmb3IgaT0xLDMgZG8KICBhPWkKZW5kCl1dLCB7MSwyLDEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaSx2IGluIHBhaXJzeydhJywnYid9IGRvCiAgYT10b3N0cmluZyhpKSAuLiB2CmVuZApdXSwgezEsMiwxLDIsMSwzfSkKCnRlc3QoW1tmb3IgaT0xLDQgZG8gYT0xIGVuZF1dLCB7MSwxLDEsMX0pCgoKZG8gICAtLSB0ZXN0aW5nIGxpbmUgaW5mby90cmFjZSB3aXRoIGxhcmdlIGdhcHMgaW4gc291cmNlCgogIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKICAgICAgICAgICAgIDI1NSwgMjU2LCAyNTcsIDUwMCwgMTAwMH0KICBsb2NhbCBzID0gW1sKICAgICBsb2NhbCBiID0gezEwfQogICAgIGEgPSBiWzFdIFggKyBZIGJbMV0KICAgICBiID0gNAogIF1dCiAgZm9yIF8sIGkgaW4gaXBhaXJzKGEpIGRvCiAgICBsb2NhbCBzdWJzID0ge1ggPSBzdHJpbmcucmVwKCJcbiIsIGkpfQogICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCiAgICAgIHN1YnMuWSA9IHN0cmluZy5yZXAoIlxuIiwgaikKICAgICAgbG9jYWwgcyA9IHN0cmluZy5nc3ViKHMsICJbWFldIiwgc3VicykKICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKICAgIGVuZAogIGVuZAplbmQKCnByaW50JysnCgotLSBpbnZhbGlkIGxldmVscyBpbiBbZ3NdZXRsb2NhbAphc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGxvY2FsLCAyMCwgMSkpCmFzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCgoKLS0gcGFyYW1ldGVyIG5hbWVzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSxiLC4uLikgbG9jYWwgZCwgZSBlbmQKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZvbykKCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCgphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKHByaW50LCAxKSkKCgpsb2NhbCBmdW5jdGlvbiBmb28gKCkgcmV0dXJuIChkZWJ1Zy5nZXRsb2NhbCgxLCAtMSkpIGVuZAphc3NlcnQobm90IGZvbygxMCkpCgoKLS0gdmFyYXJncwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikKICBsb2NhbCB0ID0gdGFibGUucGFjayguLi4pCiAgZm9yIGkgPSAxLCB0Lm4gZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAtaSkKICAgIGFzc2VydChuID09ICIodmFyYXJnKSIgYW5kIHYgPT0gdFtpXSkKICBlbmQKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDEsIC0odC5uICsgMSkpKQogIGFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoMSwgLSh0Lm4gKyAxKSwgMzApKQogIGlmIHQubiA+IDAgdGhlbgogICAgKGZ1bmN0aW9uICh4KQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLTEsIHgpID09ICIodmFyYXJnKSIpCiAgICAgIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCAtdC5uLCB4KSA9PSAiKHZhcmFyZykiKQogICAgIGVuZCkoNDMwKQogICAgIGFzc2VydCguLi4gPT0gNDMwKQogIGVuZAplbmQKCmZvbygpCmZvbyhwcmludCkKZm9vKDIwMCwgMywgNCkKbG9jYWwgYSA9IHt9CmZvciBpID0gMSwgKF9zb2Z0IGFuZCAxMDAgb3IgMTAwMCkgZG8gYVtpXSA9IGkgZW5kCmZvbyh0YWJsZS51bnBhY2soYSkpCmEgPSBuaWwKCgoKZG8gICAtLSB0ZXN0IGhvb2sgcHJlc2VuY2UgaW4gZGVidWcgaW5mbwogIGFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGZ1bmN0aW9uIGYgKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWV3aGF0ID09ICJob29rIikKICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc25kbGluZSwgImhvb2siKSkKICAgIGNvdW50ID0gY291bnQgKyAxCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCAibCIpCiAgbG9jYWwgYSA9IDAKICBfRU5WLmEgPSBhCiAgYSA9IDEKICBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoY291bnQgPT0gNCkKZW5kCgoKLS0gaG9vayB0YWJsZSBoYXMgd2VhayBrZXlzCmFzc2VydChnZXRtZXRhdGFibGUoZGVidWcuZ2V0cmVnaXN0cnkoKS5fSE9PS0tFWSkuX19tb2RlID09ICdrJykKCgphID0ge307IEwgPSBuaWwKbG9jYWwgZ2xvYiA9IDEKbG9jYWwgb2xkZ2xvYiA9IGdsb2IKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSxsKQogIGNvbGxlY3RnYXJiYWdlKCkgICAtLSBmb3JjZSBHQyBkdXJpbmcgYSBob29rCiAgbG9jYWwgZiwgbSwgYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydChtID09ICdjcmwnIGFuZCBjID09IDApCiAgaWYgZSA9PSAibGluZSIgdGhlbgogICAgaWYgZ2xvYiB+PSBvbGRnbG9iIHRoZW4KICAgICAgTCA9IGwtMSAgIC0tIGdldCB0aGUgZmlyc3QgbGluZSB3aGVyZSAiZ2xvYiIgaGFzIGNoYW5nZWQKICAgICAgb2xkZ2xvYiA9IGdsb2IKICAgIGVuZAogIGVsc2VpZiBlID09ICJjYWxsIiB0aGVuCiAgICAgIGxvY2FsIGYgPSBkZWJ1Zy5nZXRpbmZvKDIsICJmIikuZnVuYwogICAgICBhW2ZdID0gMQogIGVsc2UgYXNzZXJ0KGUgPT0gInJldHVybiIpCiAgZW5kCmVuZCwgImNybCIpCgoKZnVuY3Rpb24gZihhLGIpCiAgY29sbGVjdGdhcmJhZ2UoKQogIGxvY2FsIF8sIHggPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQogIGxvY2FsIF8sIHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQogIGFzc2VydCh4ID09IGEgYW5kIHkgPT0gYikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgMywgInBlcmEiKSA9PSAiQUEiLi4iQUEiKQogIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCA0LCAibWHn4yIpID09ICJCIikKICB4ID0gZGVidWcuZ2V0aW5mbygyKQogIGFzc2VydCh4LmZ1bmMgPT0gZyBhbmQgeC53aGF0ID09ICJMdWEiIGFuZCB4Lm5hbWUgPT0gJ2cnIGFuZAogICAgICAgICB4Lm51cHMgPT0gMiBhbmQgc3RyaW5nLmZpbmQoeC5zb3VyY2UsICJeQC4qZGIlLmx1YSQiKSkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzIpCmVuZAoKZnVuY3Rpb24gZm9vKCkKICBnbG9iID0gZ2xvYisxCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzEpCmVuZDsgZm9vKCkgIC0tIHNldCBMCi0tIGNoZWNrIGxpbmUgY291bnRpbmcgaW5zaWRlIHN0cmluZ3MgYW5kIGVtcHR5IGxpbmVzCgpfID0gJ2Fsb1wKYWxvJyAuLiBbWwoKXV0KLS1bWwpdXQphc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMTEpICAtLSBjaGVjayBjb3VudCBvZiBsaW5lcwoKCmZ1bmN0aW9uIGcgKC4uLikKICBsb2NhbCBhcmcgPSB7Li4ufQogIGRvIGxvY2FsIGEsYixjOyBhPW1hdGguc2luKDQwKTsgZW5kCiAgbG9jYWwgZmVpamFvCiAgbG9jYWwgQUFBQSxCID0gInh1eHUiLCAibWFt428iCiAgZihBQUFBLEIpCiAgYXNzZXJ0KEFBQUEgPT0gInBlcmEiIGFuZCBCID09ICJtYefjIikKICBkbwogICAgIGxvY2FsIEIgPSAxMwogICAgIGxvY2FsIHgseSA9IGRlYnVnLmdldGxvY2FsKDEsNSkKICAgICBhc3NlcnQoeCA9PSAnQicgYW5kIHkgPT0gMTMpCiAgZW5kCmVuZAoKZygpCgoKYXNzZXJ0KGFbZl0gYW5kIGFbZ10gYW5kIGFbYXNzZXJ0XSBhbmQgYVtkZWJ1Zy5nZXRsb2NhbF0gYW5kIG5vdCBhW3ByaW50XSkKCgotLSB0ZXN0cyBmb3IgbWFuaXB1bGF0aW5nIG5vbi1yZWdpc3RlcmVkIGxvY2FscyAoQyBhbmQgTHVhIHRlbXBvcmFyaWVzKQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDAsIDEpCmFzc2VydCh2ID09IDAgYW5kIG4gPT0gIihDIHRlbXBvcmFyeSkiKQpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKYXNzZXJ0KHYgPT0gMiBhbmQgbiA9PSAiKEMgdGVtcG9yYXJ5KSIpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMykpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoMCwgMCkpCgpmdW5jdGlvbiBmKCkKICBhc3NlcnQoc2VsZWN0KDIsIGRlYnVnLmdldGxvY2FsKDIsMykpID09IDEpCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgyLDQpKQogIGRlYnVnLnNldGxvY2FsKDIsIDMsIDEwKQogIHJldHVybiAyMAplbmQKCmZ1bmN0aW9uIGcoYSxiKSByZXR1cm4gKGErMSkgKyBmKCkgZW5kCgphc3NlcnQoZygwLDApID09IDMwKQogCgpkZWJ1Zy5zZXRob29rKG5pbCk7CmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQoKCi0tIG1pbmltYWwgdGVzdHMgZm9yIHNldHVzZXJ2YWx1ZS9nZXR1c2VydmFsdWUKZG8KICBhc3NlcnQobm90IGRlYnVnLnNldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApKQogIGxvY2FsIGEsIGIgPSBkZWJ1Zy5nZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKQogIGFzc2VydChhID09IG5pbCBhbmQgbm90IGIpCmVuZAoKLS0gdGVzdGluZyBpdGVyYWN0aW9uIGJldHdlZW4gbXVsdGlwbGUgdmFsdWVzIHggaG9va3MKZG8KICBsb2NhbCBmdW5jdGlvbiBmKC4uLikgcmV0dXJuIDMsIC4uLiBlbmQKICBsb2NhbCBjb3VudCA9IDAKICBsb2NhbCBhID0ge30KICBmb3IgaSA9IDEsIDEwMCBkbyBhW2ldID0gaSBlbmQKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uICgpIGNvdW50ID0gY291bnQgKyAxIGVuZCwgIiIsIDEpCiAgbG9jYWwgdCA9IHt0YWJsZS51bnBhY2soYSl9CiAgYXNzZXJ0KCN0ID09IDEwMCkKICB0ID0ge3RhYmxlLnVucGFjayhhLCAxLCAzKX0KICBhc3NlcnQoI3QgPT0gMykKICB0ID0ge2YodGFibGUudW5wYWNrKGEsIDEsIDMwKSl9CiAgYXNzZXJ0KCN0ID09IDMxKQplbmQKCgotLSB0ZXN0aW5nIGFjY2VzcyB0byBmdW5jdGlvbiBhcmd1bWVudHMKCmxvY2FsIGZ1bmN0aW9uIGNvbGxlY3Rsb2NhbHMgKGxldmVsKQogIGxvY2FsIHRhYiA9IHt9CiAgZm9yIGkgPSAxLCBtYXRoLmh1Z2UgZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbChsZXZlbCArIDEsIGkpCiAgICBpZiBub3QgKG4gYW5kIHN0cmluZy5maW5kKG4sICJeW2EtekEtWjAtOV9dKyQiKSkgdGhlbgogICAgICAgYnJlYWsgICAtLSBjb25zaWRlciBvbmx5IHJlYWwgdmFyaWFibGVzCiAgICBlbmQKICAgIHRhYltuXSA9IHYKICBlbmQKICByZXR1cm4gdGFiCmVuZAoKClggPSBuaWwKYSA9IHt9CmZ1bmN0aW9uIGE6ZiAoYSwgYiwgLi4uKSBsb2NhbCBhcmcgPSB7Li4ufTsgbG9jYWwgYyA9IDEzIGVuZApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKQogIGFzc2VydChlID09ICJjYWxsIikKICBkb3N0cmluZygiWFggPSAxMiIpICAtLSB0ZXN0IGRvc3RyaW5nIGluc2lkZSBob29rcwogIC0tIHRlc3RpbmcgZXJyb3JzIGluc2lkZSBob29rcwogIGFzc2VydChub3QgcGNhbGwobG9hZCgiYT0nam9hbycrMSIpKSkKICBkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLCBsKSAKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJsIikuY3VycmVudGxpbmUgPT0gbCkKICAgIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgICBhc3NlcnQoZSA9PSAibGluZSIpCiAgICBhc3NlcnQobSA9PSAnbCcgYW5kIGMgPT0gMCkKICAgIGRlYnVnLnNldGhvb2sobmlsKSAgLS0gaG9vayBpcyBjYWxsZWQgb25seSBvbmNlCiAgICBhc3NlcnQobm90IFgpICAgICAgIC0tIGNoZWNrIHRoYXQKICAgIFggPSBjb2xsZWN0bG9jYWxzKDIpCiAgZW5kLCAibCIpCmVuZCwgImMiKQoKYTpmKDEsMiwzLDQsNSkKYXNzZXJ0KFguc2VsZiA9PSBhIGFuZCBYLmEgPT0gMSAgIGFuZCBYLmIgPT0gMiBhbmQgWC5jID09IG5pbCkKYXNzZXJ0KFhYID09IDEyKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKCgotLSB0ZXN0aW5nIGFjY2VzcyB0byBsb2NhbCB2YXJpYWJsZXMgaW4gcmV0dXJuIGhvb2sgKGJ1ZyBpbiA1LjIpCmRvCiAgbG9jYWwgWCA9IGZhbHNlCgogIGxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgYiwgLi4uKQogICAgZG8gbG9jYWwgeCx5LHogZW5kCiAgICBsb2NhbCBjLCBkID0gMTAsIDIwCiAgICByZXR1cm4KICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gYXV4ICgpCiAgICBpZiBkZWJ1Zy5nZXRpbmZvKDIpLm5hbWUgPT0gImZvbyIgdGhlbgogICAgICBYID0gdHJ1ZSAgIC0tIHRvIHNpZ25hbCB0aGF0IGl0IGZvdW5kICdmb28nCiAgICAgIGxvY2FsIHRhYiA9IHthID0gMTAwLCBiID0gMjAwLCBjID0gMTAsIGQgPSAyMH0KICAgICAgZm9yIG4sIHYgaW4gcGFpcnMoY29sbGVjdGxvY2FscygyKSkgZG8KICAgICAgICBhc3NlcnQodGFiW25dID09IHYpCiAgICAgICAgdGFiW25dID0gdW5kZWYKICAgICAgZW5kCiAgICAgIGFzc2VydChuZXh0KHRhYikgPT0gbmlsKSAgICAtLSAndGFiJyBtdXN0IGJlIGVtcHR5CiAgICBlbmQKICBlbmQKCiAgZGVidWcuc2V0aG9vayhhdXgsICJyIik7IGZvbygxMDAsIDIwMCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydChYKQoKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZXFzZXEgKHQxLCB0MikKICBhc3NlcnQoI3QxID09ICN0MikKICBmb3IgaSA9IDEsICN0MSBkbwogICAgYXNzZXJ0KHQxW2ldID09IHQyW2ldKQogIGVuZAplbmQKCgpkbyAgcHJpbnQoInRlc3RpbmcgaW5zcGVjdGlvbiBvZiBwYXJhbWV0ZXJzL3JldHVybmVkIHZhbHVlcyIpCiAgbG9jYWwgb24gPSBmYWxzZQogIGxvY2FsIGlucCwgb3V0CgogIGxvY2FsIGZ1bmN0aW9uIGhvb2sgKGV2ZW50KQogICAgaWYgbm90IG9uIHRoZW4gcmV0dXJuIGVuZAogICAgbG9jYWwgYXIgPSBkZWJ1Zy5nZXRpbmZvKDIsICJydVMiKQogICAgbG9jYWwgdCA9IHt9CiAgICBmb3IgaSA9IGFyLmZ0cmFuc2ZlciwgYXIuZnRyYW5zZmVyICsgYXIubnRyYW5zZmVyIC0gMSBkbwogICAgICBsb2NhbCBfLCB2ID0gZGVidWcuZ2V0bG9jYWwoMiwgaSkKICAgICAgdFsjdCArIDFdID0gdiAKICAgIGVuZAogICAgaWYgZXZlbnQgPT0gInJldHVybiIgdGhlbgogICAgICBvdXQgPSB0CiAgICBlbHNlCiAgICAgIGlucCA9IHQKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGhvb2ssICJjciIpCgogIG9uID0gdHJ1ZTsgbWF0aC5zaW4oMyk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHszfSk7IGVxc2VxKG91dCwge21hdGguc2luKDMpfSkKCiAgb24gPSB0cnVlOyBzZWxlY3QoMiwgMTAsIDIwLCAzMCwgNDApOyBvbiA9IGZhbHNlCiAgZXFzZXEoaW5wLCB7MiwgMTAsIDIwLCAzMCwgNDB9KTsgZXFzZXEob3V0LCB7MjAsIDMwLCA0MH0pCgogIGxvY2FsIGZ1bmN0aW9uIGZvbyAoYSwgLi4uKSByZXR1cm4gLi4uIGVuZAogIGxvY2FsIGZ1bmN0aW9uIGZvbzEgKCkgb24gPSBub3Qgb247IHJldHVybiBmb28oMjAsIDEwLCAwKSBlbmQKICBmb28xKCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyMH0pOyBlcXNlcShvdXQsIHsxMCwgMH0pCgogIGRlYnVnLnNldGhvb2soKQplbmQKCgoKLS0gdGVzdGluZyB1cHZhbHVlIGFjY2Vzcwpsb2NhbCBmdW5jdGlvbiBnZXR1cHZhbHVlcyAoZikKICBsb2NhbCB0ID0ge30KICBsb2NhbCBpID0gMQogIHdoaWxlIHRydWUgZG8KICAgIGxvY2FsIG5hbWUsIHZhbHVlID0gZGVidWcuZ2V0dXB2YWx1ZShmLCBpKQogICAgaWYgbm90IG5hbWUgdGhlbiBicmVhayBlbmQKICAgIGFzc2VydChub3QgdFtuYW1lXSkKICAgIHRbbmFtZV0gPSB2YWx1ZQogICAgaSA9IGkgKyAxCiAgZW5kCiAgcmV0dXJuIHQKZW5kCgpsb2NhbCBhLGIsYyA9IDEsMiwzCmxvY2FsIGZ1bmN0aW9uIGZvbzEgKGEpIGIgPSBhOyByZXR1cm4gYyBlbmQKbG9jYWwgZnVuY3Rpb24gZm9vMiAoeCkgYSA9IHg7IHJldHVybiBjK2IgZW5kCmFzc2VydChub3QgZGVidWcuZ2V0dXB2YWx1ZShmb28xLCAzKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDApKQphc3NlcnQobm90IGRlYnVnLnNldHVwdmFsdWUoZm9vMSwgMywgInh1eHUiKSkKbG9jYWwgdCA9IGdldHVwdmFsdWVzKGZvbzEpCmFzc2VydCh0LmEgPT0gbmlsIGFuZCB0LmIgPT0gMiBhbmQgdC5jID09IDMpCnQgPSBnZXR1cHZhbHVlcyhmb28yKQphc3NlcnQodC5hID09IDEgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZm9vMSwgMSwgInh1eHUiKSA9PSAiYiIpCmFzc2VydCgoe2RlYnVnLmdldHVwdmFsdWUoZm9vMiwgMyl9KVsyXSA9PSAieHV4dSIpCi0tIHVwdmFsdWVzIG9mIEMgZnVuY3Rpb25zIGFyZSBhbGx3YXlzICJjYWxsZWQiICIiICh0aGUgZW1wdHkgc3RyaW5nKQphc3NlcnQoZGVidWcuZ2V0dXB2YWx1ZShzdHJpbmcuZ21hdGNoKCJ4IiwgIngiKSwgMSkgPT0gIiIpICAKCgotLSB0ZXN0aW5nIGNvdW50IGhvb2tzCmxvY2FsIGE9MApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSBhPWErMSBlbmQsICIiLCAxKQphPTA7IGZvciBpPTEsMTAwMCBkbyBlbmQ7IGFzc2VydCgxMDAwIDwgYSBhbmQgYSA8IDEwMTIpCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDQpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDI1MCA8IGEgYW5kIGEgPCAyNTUpCmxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCmFzc2VydChtID09ICIiIGFuZCBjID09IDQpCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDQwMDApCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KGEgPT0gMCkKCmRvCiAgZGVidWcuc2V0aG9vayhwcmludCwgIiIsIDJeMjQgLSAxKSAgIC0tIGNvdW50IHVwcGVyYm91bmQKICBsb2NhbCBmLG0sYyA9IGRlYnVnLmdldGhvb2soKQogIGFzc2VydCgoe2RlYnVnLmdldGhvb2soKX0pWzNdID09IDJeMjQgLSAxKQplbmQKCmRlYnVnLnNldGhvb2soKQoKCi0tIHRlc3RzIGZvciB0YWlsIGNhbGxzCmxvY2FsIGZ1bmN0aW9uIGYgKHgpCiAgaWYgeCB0aGVuCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAiUyIpLndoYXQgPT0gIkx1YSIpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAidCIpLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgIGxvY2FsIHRhaWwgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQodGFpbC5mdW5jID09IGcxIGFuZCB0YWlsLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDMsICJTIikud2hhdCA9PSAibWFpbiIpCiAgICBwcmludCIrIgogICAgZW5kCmVuZAoKZnVuY3Rpb24gZyh4KSByZXR1cm4gZih4KSBlbmQKCmZ1bmN0aW9uIGcxKHgpIGcoeCkgZW5kCgpsb2NhbCBmdW5jdGlvbiBoICh4KSBsb2NhbCBmPWcxOyByZXR1cm4gZih4KSBlbmQKCmgodHJ1ZSkKCmxvY2FsIGIgPSB7fQpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKSB0YWJsZS5pbnNlcnQoYiwgZSkgZW5kLCAiY3IiKQpoKGZhbHNlKQpkZWJ1Zy5zZXRob29rKCkKbG9jYWwgcmVzID0geyJyZXR1cm4iLCAgIC0tIGZpcnN0IHJldHVybiAoZnJvbSBzZXRob29rKQogICJjYWxsIiwgInRhaWwgY2FsbCIsICJjYWxsIiwgInRhaWwgY2FsbCIsCiAgInJldHVybiIsICJyZXR1cm4iLAogICJjYWxsIiwgICAgLS0gbGFzdCBjYWxsICh0byBzZXRob29rKQp9CmZvciBpID0gMSwgI3JlcyBkbyBhc3NlcnQocmVzW2ldID09IHRhYmxlLnJlbW92ZShiLCAxKSkgZW5kCgpiID0gMApkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlKQogICAgICAgICAgICAgICAgaWYgZSA9PSAidGFpbCBjYWxsIiB0aGVuCiAgICAgICAgICAgICAgICAgIGIgPSBiICsgMQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gdHJ1ZSkKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgInQiKS5pc3RhaWxjYWxsID09IGZhbHNlKQogICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgZW5kLCAiYyIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQphc3NlcnQoYiA9PSAyKSAgIC0tIHR3byB0YWlsIGNhbGxzCgpsaW0gPSBfc29mdCBhbmQgMzAwMCBvciAzMDAwMApsb2NhbCBmdW5jdGlvbiBmb28gKHgpCiAgaWYgeD09MCB0aGVuCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyKS53aGF0ID09ICJtYWluIikKICAgIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoaW5mby5pc3RhaWxjYWxsID09IHRydWUgYW5kIGluZm8uZnVuYyA9PSBmb28pCiAgZWxzZSByZXR1cm4gZm9vKHgtMSkKICBlbmQKZW5kCgpmb28obGltKQoKCnByaW50IisiCgoKLS0gdGVzdGluZyBsb2NhbCBmdW5jdGlvbiBpbmZvcm1hdGlvbgpjbyA9IGxvYWRbWwogIGxvY2FsIEEgPSBmdW5jdGlvbiAoKQogICAgcmV0dXJuIHgKICBlbmQKICByZXR1cm4KXV0KCmxvY2FsIGEgPSAwCi0tICdBJyBzaG91bGQgYmUgdmlzaWJsZSB0byBkZWJ1Z2dlciBvbmx5IGFmdGVyIGl0cyBjb21wbGV0ZSBkZWZpbml0aW9uCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpCiAgaWYgbCA9PSAzIHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIih0ZW1wb3JhcnkpIikKICBlbHNlaWYgbCA9PSA0IHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIkEiKQogIGVuZAplbmQsICJsIikKY28oKSAgLS0gcnVuIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb24KZGVidWcuc2V0aG9vaygpICAtLSB0dXJuIG9mZiBob29rCmFzc2VydChhID09IDIpICAgLS0gZW5zdXJlIGFsbCB0d28gbGluZXMgd2hlcmUgaG9va2VkCgotLSB0ZXN0aW5nIHRyYWNlYmFjawoKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCkgPT0gcHJpbnQpCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQsIDQpID09IHByaW50KQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDQpLCAiXmhpXG4iKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIl5oaVxuIikpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCAwKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soKSwgIl5zdGFjayB0cmFjZWJhY2s6XG4iKSkKCmRvICAtLSBDLWZ1bmN0aW9uIG5hbWVzIGluIHRyYWNlYmFjawogIGxvY2FsIHN0LCBtc2cgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIHBjYWxsIGVuZCkoKShkZWJ1Zy50cmFjZWJhY2spCiAgYXNzZXJ0KHN0ID09IHRydWUgYW5kIHN0cmluZy5maW5kKG1zZywgInBjYWxsIikpCmVuZAoKCi0tIHRlc3RpbmcgbnBhcmFtcywgbnVwcyBlIGlzdmFyYXJnCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsYykgZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IGZhbHNlIGFuZCB0Lm5wYXJhbXMgPT0gMyBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLC4uLikgcmV0dXJuIHRbYV0gZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAyIGFuZCB0Lm51cHMgPT0gMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gbWFpbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDEgYW5kCiAgICAgICBkZWJ1Zy5nZXR1cHZhbHVlKHQuZnVuYywgMSkgPT0gIl9FTlYiKQoKdCA9IGRlYnVnLmdldGluZm8obWF0aC5zaW4pICAgLS0gQyBmdW5jdGlvbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhzdHJpbmcuZ21hdGNoKCJhYmMiLCAiYSIpKSAgIC0tIEMgY2xvc3VyZQphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID4gMCkKCgoKLS0gdGVzdGluZyBkZWJ1Z2dpbmcgb2YgY29yb3V0aW5lcwoKbG9jYWwgZnVuY3Rpb24gY2hlY2t0cmFjZWJhY2sgKGNvLCBwLCBsZXZlbCkKICBsb2NhbCB0YiA9IGRlYnVnLnRyYWNlYmFjayhjbywgbmlsLCBsZXZlbCkKICBsb2NhbCBpID0gMAogIGZvciBsIGluIHN0cmluZy5nbWF0Y2godGIsICJbXlxuXStcbj8iKSBkbwogICAgYXNzZXJ0KGkgPT0gMCBvciBzdHJpbmcuZmluZChsLCBwW2ldKSkKICAgIGkgPSBpKzEKICBlbmQKICBhc3NlcnQocFtpXSA9PSB1bmRlZikKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZiAobikKICBpZiBuID4gMCB0aGVuIGYobi0xKQogIGVsc2UgY29yb3V0aW5lLnlpZWxkKCkgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGYpCmNvcm91dGluZS5yZXN1bWUoY28sIDMpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9KQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMikKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIn0sIDQpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSwgNDApCgoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogICAgICAgbG9jYWwgYSA9IDEKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikpCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lKQogICAgICAgcmV0dXJuIGEKICAgICBlbmQpCgpsb2NhbCB0ciA9IHt9CmxvY2FsIGZvbyA9IGZ1bmN0aW9uIChlLCBsKSBpZiBsIHRoZW4gdGFibGUuaW5zZXJ0KHRyLCBsKSBlbmQgZW5kCmRlYnVnLnNldGhvb2soY28sIGZvbywgImxjciIpCgpsb2NhbCBfLCBsID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmxvY2FsIHggPSBkZWJ1Zy5nZXRpbmZvKGNvLCAxLCAibGZMUyIpCmFzc2VydCh4LmN1cnJlbnRsaW5lID09IGwuY3VycmVudGxpbmUgYW5kIHguYWN0aXZlbGluZXNbeC5jdXJyZW50bGluZV0pCmFzc2VydCh0eXBlKHguZnVuYykgPT0gImZ1bmN0aW9uIikKZm9yIGk9eC5saW5lZGVmaW5lZCArIDEsIHgubGFzdGxpbmVkZWZpbmVkIGRvCiAgYXNzZXJ0KHguYWN0aXZlbGluZXNbaV0pCiAgeC5hY3RpdmVsaW5lc1tpXSA9IHVuZGVmCmVuZAphc3NlcnQobmV4dCh4LmFjdGl2ZWxpbmVzKSA9PSBuaWwpICAgLS0gbm8gJ2V4dHJhJyBlbGVtZW50cwphc3NlcnQobm90IGRlYnVnLmdldGluZm8oY28sIDIpKQpsb2NhbCBhLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMikKYXNzZXJ0KGEgPT0gImEiIGFuZCBiID09IDEpCmRlYnVnLnNldGxvY2FsKGNvLCAxLCAyLCAiaGkiKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQoI3RyID09IDIgYW5kCiAgICAgICB0clsxXSA9PSBsLmN1cnJlbnRsaW5lLTEgYW5kIHRyWzJdID09IGwuY3VycmVudGxpbmUpCgphLGIsYyA9IHBjYWxsKGNvcm91dGluZS5yZXN1bWUsIGNvKQphc3NlcnQoYSBhbmQgYiBhbmQgYyA9PSBsLmN1cnJlbnRsaW5lKzEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImluIGZ1bmN0aW9uIDwifSkKCmEsYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCmFzc2VydChhIGFuZCBiID09ICJoaSIpCmFzc2VydCgjdHIgPT0gNCBhbmQgdHJbNF0gPT0gbC5jdXJyZW50bGluZSsyKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKY2hlY2t0cmFjZWJhY2soY28sIHt9KQoKCi0tIGNoZWNrIGdldC9zZXRsb2NhbCBpbiBjb3JvdXRpbmVzCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICBsb2NhbCBhLCBiID0gY29yb3V0aW5lLnlpZWxkKHgpCiAgYXNzZXJ0KGEgPT0gMTAwIGFuZCBiID09IG5pbCkKICByZXR1cm4geAplbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMTApCmEsIGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCAxLCA1KSkKYXNzZXJ0KGRlYnVnLnNldGxvY2FsKGNvLCAxLCAxLCAzMCkgPT0gIngiKQphc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKGNvLCAxLCA1LCA0MCkpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMDApCmFzc2VydChhIGFuZCBiID09IDMwKQoKCi0tIGNoZWNrIHRyYWNlYmFjayBvZiBzdXNwZW5kZWQgKG9yIGRlYWQgd2l0aCBlcnJvcikgY29yb3V0aW5lcwoKZnVuY3Rpb24gZihpKQogIGlmIGkgPT0gMCB0aGVuIGVycm9yKGkpCiAgZWxzZSBjb3JvdXRpbmUueWllbGQoKTsgZihpLTEpCiAgZW5kCmVuZAoKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkgZih4KSBlbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQp0ID0geyInY29yb3V0aW5lLnlpZWxkJyIsICInZiciLCAiaW4gZnVuY3Rpb24gPCJ9CndoaWxlIGNvcm91dGluZS5zdGF0dXMoY28pID09ICJzdXNwZW5kZWQiIGRvCiAgY2hlY2t0cmFjZWJhY2soY28sIHQpCiAgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCiAgdGFibGUuaW5zZXJ0KHQsIDIsICInZiciKSAgIC0tIG9uZSBtb3JlIHJlY3Vyc2l2ZSBjYWxsIHRvICdmJwplbmQKdFsxXSA9ICInZXJyb3InIgpjaGVja3RyYWNlYmFjayhjbywgdCkKCgotLSB0ZXN0IGFjZXNzaW5nIGxpbmUgbnVtYmVycyBvZiBhIGNvcm91dGluZSBmcm9tIGEgcmVzdW1lIGluc2lkZQotLSBhIEMgZnVuY3Rpb24gKHRoaXMgaXMgYSBrbm93biBidWcgaW4gTHVhIDUuMCkKCmxvY2FsIGZ1bmN0aW9uIGcoeCkKICAgIGNvcm91dGluZS55aWVsZCh4KQplbmQKCmxvY2FsIGZ1bmN0aW9uIGYgKGkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBlbmQsICJsIikKICBmb3Igaj0xLDEwMDAgZG8KICAgIGcoaStqKQogIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZikKY28oMTApCnBjYWxsKGNvKQpwY2FsbChjbykKCgphc3NlcnQodHlwZShkZWJ1Zy5nZXRyZWdpc3RyeSgpKSA9PSAidGFibGUiKQoKCi0tIHRlc3QgdGFnbWV0aG9kIGluZm9ybWF0aW9uCmxvY2FsIGEgPSB7fQpsb2NhbCBmdW5jdGlvbiBmICh0KQogIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpOwogIGFzc2VydChpbmZvLm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICBhLm9wID0gaW5mby5uYW1lCiAgcmV0dXJuIGluZm8ubmFtZQplbmQKc2V0bWV0YXRhYmxlKGEsIHsKICBfX2luZGV4ID0gZjsgX19hZGQgPSBmOyBfX2RpdiA9IGY7IF9fbW9kID0gZjsgX19jb25jYXQgPSBmOyBfX3BvdyA9IGY7CiAgX19tdWwgPSBmOyBfX2lkaXYgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19zdWIgPSBmOwogIF9fc2hsID0gZjsgX19zaHIgPSBmOyBfX2JvciA9IGY7IF9fYnhvciA9IGY7CiAgX19lcSA9IGY7IF9fbGUgPSBmOyBfX2x0ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fYmFuZCA9IGY7CiAgX19ibm90ID0gZjsKfSkKCmxvY2FsIGIgPSBzZXRtZXRhdGFibGUoe30sIGdldG1ldGF0YWJsZShhKSkKCmFzc2VydChhWzNdID09ICJpbmRleCIgYW5kIGFeMyA9PSAicG93IiBhbmQgYS4uYSA9PSAiY29uY2F0IikKYXNzZXJ0KGEvMyA9PSAiZGl2IiBhbmQgMyVhID09ICJtb2QiKQphc3NlcnQoYSszID09ICJhZGQiIGFuZCAzLWEgPT0gInN1YiIgYW5kIGEqMyA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSYzID09ICJiYW5kIikKYXNzZXJ0KGEgKyAzMDAwMCA9PSAiYWRkIiBhbmQgYSAtIDMuMCA9PSAic3ViIiBhbmQgYSAqIDMuMCA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSAmIDMgPT0gImJhbmQiKQphc3NlcnQoYXwzID09ICJib3IiIGFuZCAzfmEgPT0gImJ4b3IiIGFuZCBhPDwzID09ICJzaGwiIGFuZCBhPj4xID09ICJzaHIiKQphc3NlcnQgKGE9PWIgYW5kIGEub3AgPT0gImVxIikKYXNzZXJ0IChhPj1iIGFuZCBhLm9wID09ICJvcmRlciIpCmFzc2VydCAoYT5iIGFuZCBhLm9wID09ICJvcmRlciIpCmFzc2VydCh+YSA9PSAiYm5vdCIpCgpkbyAgIC0tIHRlc3RpbmcgZm9yLWl0ZXJhdG9yIG5hbWUKICBsb2NhbCBmdW5jdGlvbiBmKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWUgPT0gImZvciBpdGVyYXRvciIpCiAgZW5kCgogIGZvciBpIGluIGYgZG8gZW5kCmVuZAoKCmRvICAgLS0gdGVzdGluZyBkZWJ1ZyBpbmZvIGZvciBmaW5hbGl6ZXJzCiAgbG9jYWwgbmFtZSA9IG5pbAoKICAtLSBjcmVhdGUgYSBwaWVjZSBvZiBnYXJiYWdlIHdpdGggYSBmaW5hbGl6ZXIKICBzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKDIpICAgLS0gZ2V0IGNhbGxlZSBpbmZvcm1hdGlvbgogICAgYXNzZXJ0KHQubmFtZXdoYXQgPT0gIm1ldGFtZXRob2QiKQogICAgbmFtZSA9IHQubmFtZQogIGVuZH0pCgogIC0tIHJlcGVhdCB1bnRpbCBwcmV2aW91cyBmaW5hbGl6ZXIgcnVucyAoc2V0dGluZyAnbmFtZScpCiAgcmVwZWF0IGxvY2FsIGEgPSB7fSB1bnRpbCBuYW1lCiAgYXNzZXJ0KG5hbWUgPT0gIl9fZ2MiKQplbmQKCgpkbwogIHByaW50KCJ0ZXN0aW5nIHRyYWNlYmFjayBzaXplcyIpCgogIGxvY2FsIGZ1bmN0aW9uIGNvdW50bGluZXMgKHMpCiAgICByZXR1cm4gc2VsZWN0KDIsIHN0cmluZy5nc3ViKHMsICJcbiIsICIiKSkKICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gZGVlcCAobHZsLCBuKQogICAgaWYgbHZsID09IDAgdGhlbgogICAgICByZXR1cm4gKGRlYnVnLnRyYWNlYmFjaygibWVzc2FnZSIsIG4pKQogICAgZWxzZQogICAgICByZXR1cm4gKGRlZXAobHZsLTEsIG4pKQogICAgZW5kCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGNoZWNrZGVlcCAodG90YWwsIHN0YXJ0KQogICAgbG9jYWwgcyA9IGRlZXAodG90YWwsIHN0YXJ0KQogICAgbG9jYWwgcmVzdCA9IHN0cmluZy5tYXRjaChzLCAiXm1lc3NhZ2VcbnN0YWNrIHRyYWNlYmFjazpcbiguKikkIikKICAgIGxvY2FsIGNsID0gY291bnRsaW5lcyhyZXN0KQogICAgLS0gYXQgbW9zdCAxMCBsaW5lcyBpbiBmaXJzdCBwYXJ0LCAxMSBpbiBzZWNvbmQsIHBsdXMgJy4uLicKICAgIGFzc2VydChjbCA8PSAxMCArIDExICsgMSkKICAgIGxvY2FsIGJyayA9IHN0cmluZy5maW5kKHJlc3QsICIlLiUuJS4iKQogICAgaWYgYnJrIHRoZW4gICAtLSBkb2VzIG1lc3NhZ2UgaGF2ZSAnLi4uJz8KICAgICAgbG9jYWwgcmVzdDEgPSBzdHJpbmcuc3ViKHJlc3QsIDEsIGJyaykKICAgICAgbG9jYWwgcmVzdDIgPSBzdHJpbmcuc3ViKHJlc3QsIGJyaywgI3Jlc3QpCiAgICAgIGFzc2VydChjb3VudGxpbmVzKHJlc3QxKSA9PSAxMCBhbmQgY291bnRsaW5lcyhyZXN0MikgPT0gMTEpCiAgICBlbHNlCiAgICAgIGFzc2VydChjbCA9PSB0b3RhbCAtIHN0YXJ0ICsgMikKICAgIGVuZAogIGVuZAoKICBmb3IgZCA9IDEsIDUxLCAxMCBkbwogICAgZm9yIGwgPSAxLCBkIGRvCiAgICAgIC0tIHVzZSBjb3JvdXRpbmVzIHRvIGVuc3VyZSBjb21wbGV0ZSBjb250cm9sIG9mIHRoZSBzdGFjawogICAgICBjb3JvdXRpbmUud3JhcChjaGVja2RlZXApKGQsIGwpCiAgICBlbmQKICBlbmQKCmVuZAoKCnByaW50KCJ0ZXN0aW5nIGRlYnVnIGZ1bmN0aW9ucyBvbiBjaHVuayB3aXRob3V0IGRlYnVnIGluZm8iKQpwcm9nID0gW1stLSBwcm9ncmFtIHRvIGJlIGxvYWRlZCB3aXRob3V0IGRlYnVnIGluZm9ybWF0aW9uIChzdHJpcCkKbG9jYWwgZGVidWcgPSByZXF1aXJlJ2RlYnVnJwpsb2NhbCBhID0gMTIgIC0tIGEgbG9jYWwgdmFyaWFibGUKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQphc3NlcnQobiA9PSAiKHRlbXBvcmFyeSkiIGFuZCB2ID09IGRlYnVnKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQpuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKYXNzZXJ0KG4gPT0gIih0ZW1wb3JhcnkpIiBhbmQgdiA9PSAxMikgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKCi0tIGEgZnVuY3Rpb24gd2l0aCBhbiB1cHZhbHVlCmxvY2FsIGYgPSBmdW5jdGlvbiAoKSBsb2NhbCB4OyByZXR1cm4gYSBlbmQKbiwgdiA9IGRlYnVnLmdldHVwdmFsdWUoZiwgMSkKYXNzZXJ0KG4gPT0gIihubyBuYW1lKSIgYW5kIHYgPT0gMTIpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGYsIDEsIDEzKSA9PSAiKG5vIG5hbWUpIikKYXNzZXJ0KGEgPT0gMTMpCgpsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYsICJMIikuYWN0aXZlbGluZXMKYXNzZXJ0KG5leHQodCkgPT0gbmlsKSAgICAtLSBhY3RpdmUgbGluZXMgYXJlIGVtcHR5CgotLSBkdW1wL2xvYWQgYSBmdW5jdGlvbiB3aXRob3V0IGRlYnVnIGluZm8KZiA9IGxvYWQoc3RyaW5nLmR1bXAoZikpCgp0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnJldHVybiBhCl1dCgoKLS0gbG9hZCAncHJvZycgd2l0aG91dCBkZWJ1ZyBpbmZvCmxvY2FsIGYgPSBhc3NlcnQobG9hZChzdHJpbmcuZHVtcChsb2FkKHByb2cpLCB0cnVlKSkpCgphc3NlcnQoZigpID09IDEzKQoKZG8gICAtLSBidWcgaW4gNS40LjA6IGxpbmUgaG9va3MgaW4gc3RyaXBwZWQgY29kZQogIGxvY2FsIGZ1bmN0aW9uIGZvbyAoKQogICAgbG9jYWwgYSA9IDEKICAgIGxvY2FsIGIgPSAyCiAgICByZXR1cm4gYgogIGVuZAoKICBsb2NhbCBzID0gbG9hZChzdHJpbmcuZHVtcChmb28sIHRydWUpKQogIGxvY2FsIGxpbmUgPSB0cnVlCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkKICAgIGFzc2VydChlID09ICJsaW5lIikKICAgIGxpbmUgPSBsCiAgZW5kLCAibCIpCiAgYXNzZXJ0KHMoKSA9PSAyKTsgZGVidWcuc2V0aG9vayhuaWwpCiAgYXNzZXJ0KGxpbmUgPT0gbmlsKSAgLS0gaG9vayBjYWxsZWQgd2l0aG91ZyBkZWJ1ZyBpbmZvIGZvciAxc3QgaW5zdHJ1Y3Rpb24KZW5kCgpkbyAgIC0tIHRlc3RzIGZvciAnc291cmNlJyBpbiBiaW5hcnkgZHVtcHMKICBsb2NhbCBwcm9nID0gW1sKICAgIHJldHVybiBmdW5jdGlvbiAoeCkKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh5KSAKICAgICAgICByZXR1cm4geCArIHkKICAgICAgZW5kCiAgICBlbmQKICBdXQogIGxvY2FsIG5hbWUgPSBzdHJpbmcucmVwKCJ4IiwgMTAwMCkKICBsb2NhbCBwID0gYXNzZXJ0KGxvYWQocHJvZywgbmFtZSkpCiAgLS0gbG9hZCAncCcgYXMgYSBiaW5hcnkgY2h1bmsgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbgogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwKQogIGFzc2VydCgjYyA+IDEwMDAgYW5kICNjIDwgMjAwMCkgICAtLSBubyByZXBldGl0aW9uIG9mICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMpCiAgYXNzZXJ0KGgoNSkgPT0gOCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gbmFtZSBhbmQgICAtLSBhbGwgZnVuY3Rpb25zIGhhdmUgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gbmFtZSBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09IG5hbWUpCiAgLS0gYWdhaW4sIHdpdGhvdXQgZGVidWcgaW5mbwogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwLCB0cnVlKQogIGFzc2VydCgjYyA8IDUwMCkgICAtLSBubyAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzMCkKICBhc3NlcnQoaCg1MCkgPT0gODApCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09ICc9PycgYW5kICAgLS0gbm8gZnVuY3Rpb24gaGFzICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09ICc9PycgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSAnPT8nKQplbmQKCnByaW50Ik9LIgoK