LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDEsMX0pCgoKZG8gICAtLSB0ZXN0aW5nIGxpbmUgaW5mby90cmFjZSB3aXRoIGxhcmdlIGdhcHMgaW4gc291cmNlCgogIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKICAgICAgICAgICAgIDI1NSwgMjU2LCAyNTcsIDUwMCwgMTAwMH0KICBsb2NhbCBzID0gW1sKICAgICBsb2NhbCBiID0gezEwfQogICAgIGEgPSBiWzFdIFggKyBZIGJbMV0KICAgICBiID0gNAogIF1dCiAgZm9yIF8sIGkgaW4gaXBhaXJzKGEpIGRvCiAgICBsb2NhbCBzdWJzID0ge1ggPSBzdHJpbmcucmVwKCJcbiIsIGkpfQogICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCiAgICAgIHN1YnMuWSA9IHN0cmluZy5yZXAoIlxuIiwgaikKICAgICAgbG9jYWwgcyA9IHN0cmluZy5nc3ViKHMsICJbWFldIiwgc3VicykKICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKICAgIGVuZAogIGVuZAplbmQKCnByaW50JysnCgotLSBpbnZhbGlkIGxldmVscyBpbiBbZ3NdZXRsb2NhbAphc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGxvY2FsLCAyMCwgMSkpCmFzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCgoKLS0gcGFyYW1ldGVyIG5hbWVzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSxiLC4uLikgbG9jYWwgZCwgZSBlbmQKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZvbykKCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCgphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKHByaW50LCAxKSkKCgpsb2NhbCBmdW5jdGlvbiBmb28gKCkgcmV0dXJuIChkZWJ1Zy5nZXRsb2NhbCgxLCAtMSkpIGVuZAphc3NlcnQobm90IGZvbygxMCkpCgoKLS0gdmFyYXJncwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikKICBsb2NhbCB0ID0gdGFibGUucGFjayguLi4pCiAgZm9yIGkgPSAxLCB0Lm4gZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAtaSkKICAgIGFzc2VydChuID09ICIoKnZhcmFyZykiIGFuZCB2ID09IHRbaV0pCiAgZW5kCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgxLCAtKHQubiArIDEpKSkKICBhc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKDEsIC0odC5uICsgMSksIDMwKSkKICBpZiB0Lm4gPiAwIHRoZW4KICAgIChmdW5jdGlvbiAoeCkKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC0xLCB4KSA9PSAiKCp2YXJhcmcpIikKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC10Lm4sIHgpID09ICIoKnZhcmFyZykiKQogICAgIGVuZCkoNDMwKQogICAgIGFzc2VydCguLi4gPT0gNDMwKQogIGVuZAplbmQKCmZvbygpCmZvbyhwcmludCkKZm9vKDIwMCwgMywgNCkKbG9jYWwgYSA9IHt9CmZvciBpID0gMSwgKF9zb2Z0IGFuZCAxMDAgb3IgMTAwMCkgZG8gYVtpXSA9IGkgZW5kCmZvbyh0YWJsZS51bnBhY2soYSkpCmEgPSBuaWwKCgoKZG8gICAtLSB0ZXN0IGhvb2sgcHJlc2VuY2UgaW4gZGVidWcgaW5mbwogIGFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGZ1bmN0aW9uIGYgKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWV3aGF0ID09ICJob29rIikKICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc25kbGluZSwgImhvb2siKSkKICAgIGNvdW50ID0gY291bnQgKyAxCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCAibCIpCiAgbG9jYWwgYSA9IDAKICBfRU5WLmEgPSBhCiAgYSA9IDEKICBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoY291bnQgPT0gNCkKZW5kCgoKYSA9IHt9OyBMID0gbmlsCmxvY2FsIGdsb2IgPSAxCmxvY2FsIG9sZGdsb2IgPSBnbG9iCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsbCkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gZm9yY2UgR0MgZHVyaW5nIGEgaG9vawogIGxvY2FsIGYsIG0sIGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQobSA9PSAnY3JsJyBhbmQgYyA9PSAwKQogIGlmIGUgPT0gImxpbmUiIHRoZW4KICAgIGlmIGdsb2Igfj0gb2xkZ2xvYiB0aGVuCiAgICAgIEwgPSBsLTEgICAtLSBnZXQgdGhlIGZpcnN0IGxpbmUgd2hlcmUgImdsb2IiIGhhcyBjaGFuZ2VkCiAgICAgIG9sZGdsb2IgPSBnbG9iCiAgICBlbmQKICBlbHNlaWYgZSA9PSAiY2FsbCIgdGhlbgogICAgICBsb2NhbCBmID0gZGVidWcuZ2V0aW5mbygyLCAiZiIpLmZ1bmMKICAgICAgYVtmXSA9IDEKICBlbHNlIGFzc2VydChlID09ICJyZXR1cm4iKQogIGVuZAplbmQsICJjcmwiKQoKCmZ1bmN0aW9uIGYoYSxiKQogIGNvbGxlY3RnYXJiYWdlKCkKICBsb2NhbCBfLCB4ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKICBsb2NhbCBfLCB5ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKICBhc3NlcnQoeCA9PSBhIGFuZCB5ID09IGIpCiAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIDMsICJwZXJhIikgPT0gIkFBIi4uIkFBIikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgNCwgIm1h5+MiKSA9PSAiQiIpCiAgeCA9IGRlYnVnLmdldGluZm8oMikKICBhc3NlcnQoeC5mdW5jID09IGcgYW5kIHgud2hhdCA9PSAiTHVhIiBhbmQgeC5uYW1lID09ICdnJyBhbmQKICAgICAgICAgeC5udXBzID09IDIgYW5kIHN0cmluZy5maW5kKHguc291cmNlLCAiXkAuKmRiJS5sdWEkIikpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsyKQplbmQKCmZ1bmN0aW9uIGZvbygpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQplbmQ7IGZvbygpICAtLSBzZXQgTAotLSBjaGVjayBsaW5lIGNvdW50aW5nIGluc2lkZSBzdHJpbmdzIGFuZCBlbXB0eSBsaW5lcwoKXyA9ICdhbG9cCmFsbycgLi4gW1sKCl1dCi0tW1sKXV0KYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzExKSAgLS0gY2hlY2sgY291bnQgb2YgbGluZXMKCgpmdW5jdGlvbiBnICguLi4pCiAgbG9jYWwgYXJnID0gey4uLn0KICBkbyBsb2NhbCBhLGIsYzsgYT1tYXRoLnNpbig0MCk7IGVuZAogIGxvY2FsIGZlaWphbwogIGxvY2FsIEFBQUEsQiA9ICJ4dXh1IiwgIm1hbeNvIgogIGYoQUFBQSxCKQogIGFzc2VydChBQUFBID09ICJwZXJhIiBhbmQgQiA9PSAibWHn4yIpCiAgZG8KICAgICBsb2NhbCBCID0gMTMKICAgICBsb2NhbCB4LHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLDUpCiAgICAgYXNzZXJ0KHggPT0gJ0InIGFuZCB5ID09IDEzKQogIGVuZAplbmQKCmcoKQoKCmFzc2VydChhW2ZdIGFuZCBhW2ddIGFuZCBhW2Fzc2VydF0gYW5kIGFbZGVidWcuZ2V0bG9jYWxdIGFuZCBub3QgYVtwcmludF0pCgoKLS0gdGVzdHMgZm9yIG1hbmlwdWxhdGluZyBub24tcmVnaXN0ZXJlZCBsb2NhbHMgKEMgYW5kIEx1YSB0ZW1wb3JhcmllcykKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAxKQphc3NlcnQodiA9PSAwIGFuZCBuID09ICIoKnRlbXBvcmFyeSkiKQpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKYXNzZXJ0KHYgPT0gMiBhbmQgbiA9PSAiKCp0ZW1wb3JhcnkpIikKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAzKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAwKSkKCmZ1bmN0aW9uIGYoKQogIGFzc2VydChzZWxlY3QoMiwgZGVidWcuZ2V0bG9jYWwoMiwzKSkgPT0gMSkKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDIsNCkpCiAgZGVidWcuc2V0bG9jYWwoMiwgMywgMTApCiAgcmV0dXJuIDIwCmVuZAoKZnVuY3Rpb24gZyhhLGIpIHJldHVybiAoYSsxKSArIGYoKSBlbmQKCmFzc2VydChnKDAsMCkgPT0gMzApCiAKCmRlYnVnLnNldGhvb2sobmlsKTsKYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCgoKLS0gbWluaW1hbCB0ZXN0cyBmb3Igc2V0dXNlcnZhbHVlL2dldHVzZXJ2YWx1ZQpkbwogIGFzc2VydChkZWJ1Zy5zZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKSA9PSBuaWwpCiAgbG9jYWwgYSwgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApCiAgYXNzZXJ0KGEgPT0gbmlsIGFuZCBub3QgYikKZW5kCgotLSB0ZXN0aW5nIGl0ZXJhY3Rpb24gYmV0d2VlbiBtdWx0aXBsZSB2YWx1ZXMgeCBob29rcwpkbwogIGxvY2FsIGZ1bmN0aW9uIGYoLi4uKSByZXR1cm4gMywgLi4uIGVuZAogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGEgPSB7fQogIGZvciBpID0gMSwgMTAwIGRvIGFbaV0gPSBpIGVuZAogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgY291bnQgPSBjb3VudCArIDEgZW5kLCAiIiwgMSkKICBsb2NhbCB0ID0ge3RhYmxlLnVucGFjayhhKX0KICBhc3NlcnQoI3QgPT0gMTAwKQogIHQgPSB7dGFibGUudW5wYWNrKGEsIDEsIDMpfQogIGFzc2VydCgjdCA9PSAzKQogIHQgPSB7Zih0YWJsZS51bnBhY2soYSwgMSwgMzApKX0KICBhc3NlcnQoI3QgPT0gMzEpCmVuZAoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cwoKbG9jYWwgZnVuY3Rpb24gY29sbGVjdGxvY2FscyAobGV2ZWwpCiAgbG9jYWwgdGFiID0ge30KICBmb3IgaSA9IDEsIG1hdGguaHVnZSBkbwogICAgbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKGxldmVsICsgMSwgaSkKICAgIGlmIG5vdCAobiBhbmQgc3RyaW5nLmZpbmQobiwgIl5bYS16QS1aMC05X10rJCIpKSB0aGVuCiAgICAgICBicmVhayAgIC0tIGNvbnNpZGVyIG9ubHkgcmVhbCB2YXJpYWJsZXMKICAgIGVuZAogICAgdGFiW25dID0gdgogIGVuZAogIHJldHVybiB0YWIKZW5kCgoKWCA9IG5pbAphID0ge30KZnVuY3Rpb24gYTpmIChhLCBiLCAuLi4pIGxvY2FsIGFyZyA9IHsuLi59OyBsb2NhbCBjID0gMTMgZW5kCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgYXNzZXJ0KGUgPT0gImNhbGwiKQogIGRvc3RyaW5nKCJYWCA9IDEyIikgIC0tIHRlc3QgZG9zdHJpbmcgaW5zaWRlIGhvb2tzCiAgLS0gdGVzdGluZyBlcnJvcnMgaW5zaWRlIGhvb2tzCiAgYXNzZXJ0KG5vdCBwY2FsbChsb2FkKCJhPSdqb2FvJysxIikpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpIAogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgImwiKS5jdXJyZW50bGluZSA9PSBsKQogICAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICAgIGFzc2VydChlID09ICJsaW5lIikKICAgIGFzc2VydChtID09ICdsJyBhbmQgYyA9PSAwKQogICAgZGVidWcuc2V0aG9vayhuaWwpICAtLSBob29rIGlzIGNhbGxlZCBvbmx5IG9uY2UKICAgIGFzc2VydChub3QgWCkgICAgICAgLS0gY2hlY2sgdGhhdAogICAgWCA9IGNvbGxlY3Rsb2NhbHMoMikKICBlbmQsICJsIikKZW5kLCAiYyIpCgphOmYoMSwyLDMsNCw1KQphc3NlcnQoWC5zZWxmID09IGEgYW5kIFguYSA9PSAxICAgYW5kIFguYiA9PSAyIGFuZCBYLmMgPT0gbmlsKQphc3NlcnQoWFggPT0gMTIpCmFzc2VydChkZWJ1Zy5nZXRob29rKCkgPT0gbmlsKQoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcyBpbiByZXR1cm4gaG9vayAoYnVnIGluIDUuMikKZG8KICBsb2NhbCBYID0gZmFsc2UKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCBiLCAuLi4pCiAgICBkbyBsb2NhbCB4LHkseiBlbmQKICAgIGxvY2FsIGMsIGQgPSAxMCwgMjAKICAgIHJldHVybgogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBhdXggKCkKICAgIGlmIGRlYnVnLmdldGluZm8oMikubmFtZSA9PSAiZm9vIiB0aGVuCiAgICAgIFggPSB0cnVlICAgLS0gdG8gc2lnbmFsIHRoYXQgaXQgZm91bmQgJ2ZvbycKICAgICAgbG9jYWwgdGFiID0ge2EgPSAxMDAsIGIgPSAyMDAsIGMgPSAxMCwgZCA9IDIwfQogICAgICBmb3IgbiwgdiBpbiBwYWlycyhjb2xsZWN0bG9jYWxzKDIpKSBkbwogICAgICAgIGFzc2VydCh0YWJbbl0gPT0gdikKICAgICAgICB0YWJbbl0gPSB1bmRlZgogICAgICBlbmQKICAgICAgYXNzZXJ0KG5leHQodGFiKSA9PSBuaWwpICAgIC0tICd0YWInIG11c3QgYmUgZW1wdHkKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGF1eCwgInIiKTsgZm9vKDEwMCwgMjAwKTsgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KFgpCgplbmQKCgpsb2NhbCBmdW5jdGlvbiBlcXNlcSAodDEsIHQyKQogIGFzc2VydCgjdDEgPT0gI3QyKQogIGZvciBpID0gMSwgI3QxIGRvCiAgICBhc3NlcnQodDFbaV0gPT0gdDJbaV0pCiAgZW5kCmVuZAoKCmRvICBwcmludCgidGVzdGluZyBpbnNwZWN0aW9uIG9mIHBhcmFtZXRlcnMvcmV0dXJuZWQgdmFsdWVzIikKICBsb2NhbCBvbiA9IGZhbHNlCiAgbG9jYWwgaW5wLCBvdXQKCiAgbG9jYWwgZnVuY3Rpb24gaG9vayAoZXZlbnQpCiAgICBpZiBub3Qgb24gdGhlbiByZXR1cm4gZW5kCiAgICBsb2NhbCBhciA9IGRlYnVnLmdldGluZm8oMiwgInJ1UyIpCiAgICBsb2NhbCB0ID0ge30KICAgIGZvciBpID0gYXIuZnRyYW5zZmVyLCBhci5mdHJhbnNmZXIgKyBhci5udHJhbnNmZXIgLSAxIGRvCiAgICAgIGxvY2FsIF8sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgyLCBpKQogICAgICB0WyN0ICsgMV0gPSB2IAogICAgZW5kCiAgICBpZiBldmVudCA9PSAicmV0dXJuIiB0aGVuCiAgICAgIG91dCA9IHQKICAgIGVsc2UKICAgICAgaW5wID0gdAogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soaG9vaywgImNyIikKCiAgb24gPSB0cnVlOyBtYXRoLnNpbigzKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezN9KTsgZXFzZXEob3V0LCB7bWF0aC5zaW4oMyl9KQoKICBvbiA9IHRydWU7IHNlbGVjdCgyLCAxMCwgMjAsIDMwLCA0MCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyLCAxMCwgMjAsIDMwLCA0MH0pOyBlcXNlcShvdXQsIHsyMCwgMzAsIDQwfSkKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pIHJldHVybiAuLi4gZW5kCiAgbG9jYWwgZnVuY3Rpb24gZm9vMSAoKSBvbiA9IG5vdCBvbjsgcmV0dXJuIGZvbygyMCwgMTAsIDApIGVuZAogIGZvbzEoKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIwfSk7IGVxc2VxKG91dCwgezEwLCAwfSkKCiAgZGVidWcuc2V0aG9vaygpCmVuZAoKCgotLSB0ZXN0aW5nIHVwdmFsdWUgYWNjZXNzCmxvY2FsIGZ1bmN0aW9uIGdldHVwdmFsdWVzIChmKQogIGxvY2FsIHQgPSB7fQogIGxvY2FsIGkgPSAxCiAgd2hpbGUgdHJ1ZSBkbwogICAgbG9jYWwgbmFtZSwgdmFsdWUgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIGkpCiAgICBpZiBub3QgbmFtZSB0aGVuIGJyZWFrIGVuZAogICAgYXNzZXJ0KG5vdCB0W25hbWVdKQogICAgdFtuYW1lXSA9IHZhbHVlCiAgICBpID0gaSArIDEKICBlbmQKICByZXR1cm4gdAplbmQKCmxvY2FsIGEsYixjID0gMSwyLDMKbG9jYWwgZnVuY3Rpb24gZm9vMSAoYSkgYiA9IGE7IHJldHVybiBjIGVuZApsb2NhbCBmdW5jdGlvbiBmb28yICh4KSBhID0geDsgcmV0dXJuIGMrYiBlbmQKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMCkpCmFzc2VydChub3QgZGVidWcuc2V0dXB2YWx1ZShmb28xLCAzLCAieHV4dSIpKQpsb2NhbCB0ID0gZ2V0dXB2YWx1ZXMoZm9vMSkKYXNzZXJ0KHQuYSA9PSBuaWwgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKdCA9IGdldHVwdmFsdWVzKGZvbzIpCmFzc2VydCh0LmEgPT0gMSBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmb28xLCAxLCAieHV4dSIpID09ICJiIikKYXNzZXJ0KCh7ZGVidWcuZ2V0dXB2YWx1ZShmb28yLCAzKX0pWzJdID09ICJ4dXh1IikKLS0gdXB2YWx1ZXMgb2YgQyBmdW5jdGlvbnMgYXJlIGFsbHdheXMgImNhbGxlZCIgIiIgKHRoZSBlbXB0eSBzdHJpbmcpCmFzc2VydChkZWJ1Zy5nZXR1cHZhbHVlKHN0cmluZy5nbWF0Y2goIngiLCAieCIpLCAxKSA9PSAiIikgIAoKCi0tIHRlc3RpbmcgY291bnQgaG9va3MKbG9jYWwgYT0wCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDEpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDEwMDAgPCBhIGFuZCBhIDwgMTAxMikKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMjUwIDwgYSBhbmQgYSA8IDI1NSkKbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKYXNzZXJ0KG0gPT0gIiIgYW5kIGMgPT0gNCkKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNDAwMCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoYSA9PSAwKQoKZG8KICBkZWJ1Zy5zZXRob29rKHByaW50LCAiIiwgMl4yNCAtIDEpICAgLS0gY291bnQgdXBwZXJib3VuZAogIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgYXNzZXJ0KCh7ZGVidWcuZ2V0aG9vaygpfSlbM10gPT0gMl4yNCAtIDEpCmVuZAoKZGVidWcuc2V0aG9vaygpCgoKLS0gdGVzdHMgZm9yIHRhaWwgY2FsbHMKbG9jYWwgZnVuY3Rpb24gZiAoeCkKICBpZiB4IHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJTIikud2hhdCA9PSAiTHVhIikKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgbG9jYWwgdGFpbCA9IGRlYnVnLmdldGluZm8oMikKICAgIGFzc2VydCh0YWlsLmZ1bmMgPT0gZzEgYW5kIHRhaWwuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMywgIlMiKS53aGF0ID09ICJtYWluIikKICAgIHByaW50IisiCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBnKHgpIHJldHVybiBmKHgpIGVuZAoKZnVuY3Rpb24gZzEoeCkgZyh4KSBlbmQKCmxvY2FsIGZ1bmN0aW9uIGggKHgpIGxvY2FsIGY9ZzE7IHJldHVybiBmKHgpIGVuZAoKaCh0cnVlKQoKbG9jYWwgYiA9IHt9CmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIHRhYmxlLmluc2VydChiLCBlKSBlbmQsICJjciIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQpsb2NhbCByZXMgPSB7InJldHVybiIsICAgLS0gZmlyc3QgcmV0dXJuIChmcm9tIHNldGhvb2spCiAgImNhbGwiLCAidGFpbCBjYWxsIiwgImNhbGwiLCAidGFpbCBjYWxsIiwKICAicmV0dXJuIiwgInJldHVybiIsCiAgImNhbGwiLCAgICAtLSBsYXN0IGNhbGwgKHRvIHNldGhvb2spCn0KZm9yIGkgPSAxLCAjcmVzIGRvIGFzc2VydChyZXNbaV0gPT0gdGFibGUucmVtb3ZlKGIsIDEpKSBlbmQKCmIgPSAwCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgICAgICAgICAgICAgICBpZiBlID09ICJ0YWlsIGNhbGwiIHRoZW4KICAgICAgICAgICAgICAgICAgYiA9IGIgKyAxCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICBlbmQsICJjIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmFzc2VydChiID09IDIpICAgLS0gdHdvIHRhaWwgY2FsbHMKCmxpbSA9IF9zb2Z0IGFuZCAzMDAwIG9yIDMwMDAwCmxvY2FsIGZ1bmN0aW9uIGZvbyAoeCkKICBpZiB4PT0wIHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIpLndoYXQgPT0gIm1haW4iKQogICAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChpbmZvLmlzdGFpbGNhbGwgPT0gdHJ1ZSBhbmQgaW5mby5mdW5jID09IGZvbykKICBlbHNlIHJldHVybiBmb28oeC0xKQogIGVuZAplbmQKCmZvbyhsaW0pCgoKcHJpbnQiKyIKCgotLSB0ZXN0aW5nIGxvY2FsIGZ1bmN0aW9uIGluZm9ybWF0aW9uCmNvID0gbG9hZFtbCiAgbG9jYWwgQSA9IGZ1bmN0aW9uICgpCiAgICByZXR1cm4geAogIGVuZAogIHJldHVybgpdXQoKbG9jYWwgYSA9IDAKLS0gJ0EnIHNob3VsZCBiZSB2aXNpYmxlIHRvIGRlYnVnZ2VyIG9ubHkgYWZ0ZXIgaXRzIGNvbXBsZXRlIGRlZmluaXRpb24KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkKICBpZiBsID09IDMgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiKCp0ZW1wb3JhcnkpIikKICBlbHNlaWYgbCA9PSA0IHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIkEiKQogIGVuZAplbmQsICJsIikKY28oKSAgLS0gcnVuIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb24KZGVidWcuc2V0aG9vaygpICAtLSB0dXJuIG9mZiBob29rCmFzc2VydChhID09IDIpICAgLS0gZW5zdXJlIGFsbCB0d28gbGluZXMgd2hlcmUgaG9va2VkCgotLSB0ZXN0aW5nIHRyYWNlYmFjawoKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCkgPT0gcHJpbnQpCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQsIDQpID09IHByaW50KQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDQpLCAiXmhpXG4iKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIl5oaVxuIikpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCAwKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soKSwgIl5zdGFjayB0cmFjZWJhY2s6XG4iKSkKCmRvICAtLSBDLWZ1bmN0aW9uIG5hbWVzIGluIHRyYWNlYmFjawogIGxvY2FsIHN0LCBtc2cgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIHBjYWxsIGVuZCkoKShkZWJ1Zy50cmFjZWJhY2spCiAgYXNzZXJ0KHN0ID09IHRydWUgYW5kIHN0cmluZy5maW5kKG1zZywgInBjYWxsIikpCmVuZAoKCi0tIHRlc3RpbmcgbnBhcmFtcywgbnVwcyBlIGlzdmFyYXJnCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsYykgZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IGZhbHNlIGFuZCB0Lm5wYXJhbXMgPT0gMyBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLC4uLikgcmV0dXJuIHRbYV0gZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAyIGFuZCB0Lm51cHMgPT0gMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gbWFpbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDEgYW5kCiAgICAgICBkZWJ1Zy5nZXR1cHZhbHVlKHQuZnVuYywgMSkgPT0gIl9FTlYiKQoKCgoKLS0gdGVzdGluZyBkZWJ1Z2dpbmcgb2YgY29yb3V0aW5lcwoKbG9jYWwgZnVuY3Rpb24gY2hlY2t0cmFjZWJhY2sgKGNvLCBwLCBsZXZlbCkKICBsb2NhbCB0YiA9IGRlYnVnLnRyYWNlYmFjayhjbywgbmlsLCBsZXZlbCkKICBsb2NhbCBpID0gMAogIGZvciBsIGluIHN0cmluZy5nbWF0Y2godGIsICJbXlxuXStcbj8iKSBkbwogICAgYXNzZXJ0KGkgPT0gMCBvciBzdHJpbmcuZmluZChsLCBwW2ldKSkKICAgIGkgPSBpKzEKICBlbmQKICBhc3NlcnQocFtpXSA9PSB1bmRlZikKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZiAobikKICBpZiBuID4gMCB0aGVuIGYobi0xKQogIGVsc2UgY29yb3V0aW5lLnlpZWxkKCkgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGYpCmNvcm91dGluZS5yZXN1bWUoY28sIDMpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9KQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMikKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIn0sIDQpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSwgNDApCgoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogICAgICAgbG9jYWwgYSA9IDEKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikpCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lKQogICAgICAgcmV0dXJuIGEKICAgICBlbmQpCgpsb2NhbCB0ciA9IHt9CmxvY2FsIGZvbyA9IGZ1bmN0aW9uIChlLCBsKSBpZiBsIHRoZW4gdGFibGUuaW5zZXJ0KHRyLCBsKSBlbmQgZW5kCmRlYnVnLnNldGhvb2soY28sIGZvbywgImxjciIpCgpsb2NhbCBfLCBsID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmxvY2FsIHggPSBkZWJ1Zy5nZXRpbmZvKGNvLCAxLCAibGZMUyIpCmFzc2VydCh4LmN1cnJlbnRsaW5lID09IGwuY3VycmVudGxpbmUgYW5kIHguYWN0aXZlbGluZXNbeC5jdXJyZW50bGluZV0pCmFzc2VydCh0eXBlKHguZnVuYykgPT0gImZ1bmN0aW9uIikKZm9yIGk9eC5saW5lZGVmaW5lZCArIDEsIHgubGFzdGxpbmVkZWZpbmVkIGRvCiAgYXNzZXJ0KHguYWN0aXZlbGluZXNbaV0pCiAgeC5hY3RpdmVsaW5lc1tpXSA9IHVuZGVmCmVuZAphc3NlcnQobmV4dCh4LmFjdGl2ZWxpbmVzKSA9PSBuaWwpICAgLS0gbm8gJ2V4dHJhJyBlbGVtZW50cwphc3NlcnQobm90IGRlYnVnLmdldGluZm8oY28sIDIpKQpsb2NhbCBhLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMikKYXNzZXJ0KGEgPT0gImEiIGFuZCBiID09IDEpCmRlYnVnLnNldGxvY2FsKGNvLCAxLCAyLCAiaGkiKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQoI3RyID09IDIgYW5kCiAgICAgICB0clsxXSA9PSBsLmN1cnJlbnRsaW5lLTEgYW5kIHRyWzJdID09IGwuY3VycmVudGxpbmUpCgphLGIsYyA9IHBjYWxsKGNvcm91dGluZS5yZXN1bWUsIGNvKQphc3NlcnQoYSBhbmQgYiBhbmQgYyA9PSBsLmN1cnJlbnRsaW5lKzEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImluIGZ1bmN0aW9uIDwifSkKCmEsYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCmFzc2VydChhIGFuZCBiID09ICJoaSIpCmFzc2VydCgjdHIgPT0gNCBhbmQgdHJbNF0gPT0gbC5jdXJyZW50bGluZSsyKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKY2hlY2t0cmFjZWJhY2soY28sIHt9KQoKCi0tIGNoZWNrIGdldC9zZXRsb2NhbCBpbiBjb3JvdXRpbmVzCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICBsb2NhbCBhLCBiID0gY29yb3V0aW5lLnlpZWxkKHgpCiAgYXNzZXJ0KGEgPT0gMTAwIGFuZCBiID09IG5pbCkKICByZXR1cm4geAplbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMTApCmEsIGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCAxLCA1KSkKYXNzZXJ0KGRlYnVnLnNldGxvY2FsKGNvLCAxLCAxLCAzMCkgPT0gIngiKQphc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKGNvLCAxLCA1LCA0MCkpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMDApCmFzc2VydChhIGFuZCBiID09IDMwKQoKCi0tIGNoZWNrIHRyYWNlYmFjayBvZiBzdXNwZW5kZWQgKG9yIGRlYWQgd2l0aCBlcnJvcikgY29yb3V0aW5lcwoKZnVuY3Rpb24gZihpKSBpZiBpPT0wIHRoZW4gZXJyb3IoaSkgZWxzZSBjb3JvdXRpbmUueWllbGQoKTsgZihpLTEpIGVuZCBlbmQKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkgZih4KSBlbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQp0ID0geyInY29yb3V0aW5lLnlpZWxkJyIsICInZiciLCAiaW4gZnVuY3Rpb24gPCJ9CndoaWxlIGNvcm91dGluZS5zdGF0dXMoY28pID09ICJzdXNwZW5kZWQiIGRvCiAgY2hlY2t0cmFjZWJhY2soY28sIHQpCiAgYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCiAgdGFibGUuaW5zZXJ0KHQsIDIsICInZiciKSAgIC0tIG9uZSBtb3JlIHJlY3Vyc2l2ZSBjYWxsIHRvICdmJwplbmQKdFsxXSA9ICInZXJyb3InIgpjaGVja3RyYWNlYmFjayhjbywgdCkKCgotLSB0ZXN0IGFjZXNzaW5nIGxpbmUgbnVtYmVycyBvZiBhIGNvcm91dGluZSBmcm9tIGEgcmVzdW1lIGluc2lkZQotLSBhIEMgZnVuY3Rpb24gKHRoaXMgaXMgYSBrbm93biBidWcgaW4gTHVhIDUuMCkKCmxvY2FsIGZ1bmN0aW9uIGcoeCkKICAgIGNvcm91dGluZS55aWVsZCh4KQplbmQKCmxvY2FsIGZ1bmN0aW9uIGYgKGkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBlbmQsICJsIikKICBmb3Igaj0xLDEwMDAgZG8KICAgIGcoaStqKQogIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZikKY28oMTApCnBjYWxsKGNvKQpwY2FsbChjbykKCgphc3NlcnQodHlwZShkZWJ1Zy5nZXRyZWdpc3RyeSgpKSA9PSAidGFibGUiKQoKCi0tIHRlc3QgdGFnbWV0aG9kIGluZm9ybWF0aW9uCmxvY2FsIGEgPSB7fQpsb2NhbCBmdW5jdGlvbiBmICh0KQogIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpOwogIGFzc2VydChpbmZvLm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICBhLm9wID0gaW5mby5uYW1lCiAgcmV0dXJuIGluZm8ubmFtZQplbmQKc2V0bWV0YXRhYmxlKGEsIHsKICBfX2luZGV4ID0gZjsgX19hZGQgPSBmOyBfX2RpdiA9IGY7IF9fbW9kID0gZjsgX19jb25jYXQgPSBmOyBfX3BvdyA9IGY7CiAgX19tdWwgPSBmOyBfX2lkaXYgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19zdWIgPSBmOwogIF9fc2hsID0gZjsgX19zaHIgPSBmOyBfX2JvciA9IGY7IF9fYnhvciA9IGY7CiAgX19lcSA9IGY7IF9fbGUgPSBmOyBfX2x0ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fYmFuZCA9IGY7CiAgX19ibm90ID0gZjsKfSkKCmxvY2FsIGIgPSBzZXRtZXRhdGFibGUoe30sIGdldG1ldGF0YWJsZShhKSkKCmFzc2VydChhWzNdID09ICJpbmRleCIgYW5kIGFeMyA9PSAicG93IiBhbmQgYS4uYSA9PSAiY29uY2F0IikKYXNzZXJ0KGEvMyA9PSAiZGl2IiBhbmQgMyVhID09ICJtb2QiKQphc3NlcnQoYSszID09ICJhZGQiIGFuZCAzLWEgPT0gInN1YiIgYW5kIGEqMyA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSYzID09ICJiYW5kIikKYXNzZXJ0KGF8MyA9PSAiYm9yIiBhbmQgM35hID09ICJieG9yIiBhbmQgYTw8MyA9PSAic2hpZnQiIGFuZAogICAgICAgYT4+MSA9PSAic2hpZnQiKQphc3NlcnQgKGE9PWIgYW5kIGEub3AgPT0gImVxIikKYXNzZXJ0IChhPj1iIGFuZCBhLm9wID09ICJvcmRlciIpCmFzc2VydCAoYT5iIGFuZCBhLm9wID09ICJvcmRlciIpCmFzc2VydCh+YSA9PSAiYm5vdCIpCgpkbyAgIC0tIHRlc3RpbmcgZm9yLWl0ZXJhdG9yIG5hbWUKICBsb2NhbCBmdW5jdGlvbiBmKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWUgPT0gImZvciBpdGVyYXRvciIpCiAgZW5kCgogIGZvciBpIGluIGYgZG8gZW5kCmVuZAoKCmRvICAgLS0gdGVzdGluZyBkZWJ1ZyBpbmZvIGZvciBmaW5hbGl6ZXJzCiAgbG9jYWwgbmFtZSA9IG5pbAoKICAtLSBjcmVhdGUgYSBwaWVjZSBvZiBnYXJiYWdlIHdpdGggYSBmaW5hbGl6ZXIKICBzZXRtZXRhdGFibGUoe30sIHtfX2djID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKDIpICAgLS0gZ2V0IGNhbGxlZSBpbmZvcm1hdGlvbgogICAgYXNzZXJ0KHQubmFtZXdoYXQgPT0gIm1ldGFtZXRob2QiKQogICAgbmFtZSA9IHQubmFtZQogIGVuZH0pCgogIC0tIHJlcGVhdCB1bnRpbCBwcmV2aW91cyBmaW5hbGl6ZXIgcnVucyAoc2V0dGluZyAnbmFtZScpCiAgcmVwZWF0IGxvY2FsIGEgPSB7fSB1bnRpbCBuYW1lCiAgYXNzZXJ0KG5hbWUgPT0gIl9fZ2MiKQplbmQKCgpkbwogIHByaW50KCJ0ZXN0aW5nIHRyYWNlYmFjayBzaXplcyIpCgogIGxvY2FsIGZ1bmN0aW9uIGNvdW50bGluZXMgKHMpCiAgICByZXR1cm4gc2VsZWN0KDIsIHN0cmluZy5nc3ViKHMsICJcbiIsICIiKSkKICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gZGVlcCAobHZsLCBuKQogICAgaWYgbHZsID09IDAgdGhlbgogICAgICByZXR1cm4gKGRlYnVnLnRyYWNlYmFjaygibWVzc2FnZSIsIG4pKQogICAgZWxzZQogICAgICByZXR1cm4gKGRlZXAobHZsLTEsIG4pKQogICAgZW5kCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGNoZWNrZGVlcCAodG90YWwsIHN0YXJ0KQogICAgbG9jYWwgcyA9IGRlZXAodG90YWwsIHN0YXJ0KQogICAgbG9jYWwgcmVzdCA9IHN0cmluZy5tYXRjaChzLCAiXm1lc3NhZ2VcbnN0YWNrIHRyYWNlYmFjazpcbiguKikkIikKICAgIGxvY2FsIGNsID0gY291bnRsaW5lcyhyZXN0KQogICAgLS0gYXQgbW9zdCAxMCBsaW5lcyBpbiBmaXJzdCBwYXJ0LCAxMSBpbiBzZWNvbmQsIHBsdXMgJy4uLicKICAgIGFzc2VydChjbCA8PSAxMCArIDExICsgMSkKICAgIGxvY2FsIGJyayA9IHN0cmluZy5maW5kKHJlc3QsICIlLiUuJS4iKQogICAgaWYgYnJrIHRoZW4gICAtLSBkb2VzIG1lc3NhZ2UgaGF2ZSAnLi4uJz8KICAgICAgbG9jYWwgcmVzdDEgPSBzdHJpbmcuc3ViKHJlc3QsIDEsIGJyaykKICAgICAgbG9jYWwgcmVzdDIgPSBzdHJpbmcuc3ViKHJlc3QsIGJyaywgI3Jlc3QpCiAgICAgIGFzc2VydChjb3VudGxpbmVzKHJlc3QxKSA9PSAxMCBhbmQgY291bnRsaW5lcyhyZXN0MikgPT0gMTEpCiAgICBlbHNlCiAgICAgIGFzc2VydChjbCA9PSB0b3RhbCAtIHN0YXJ0ICsgMikKICAgIGVuZAogIGVuZAoKICBmb3IgZCA9IDEsIDUxLCAxMCBkbwogICAgZm9yIGwgPSAxLCBkIGRvCiAgICAgIC0tIHVzZSBjb3JvdXRpbmVzIHRvIGVuc3VyZSBjb21wbGV0ZSBjb250cm9sIG9mIHRoZSBzdGFjawogICAgICBjb3JvdXRpbmUud3JhcChjaGVja2RlZXApKGQsIGwpCiAgICBlbmQKICBlbmQKCmVuZAoKCnByaW50KCJ0ZXN0aW5nIGRlYnVnIGZ1bmN0aW9ucyBvbiBjaHVuayB3aXRob3V0IGRlYnVnIGluZm8iKQpwcm9nID0gW1stLSBwcm9ncmFtIHRvIGJlIGxvYWRlZCB3aXRob3V0IGRlYnVnIGluZm9ybWF0aW9uCmxvY2FsIGRlYnVnID0gcmVxdWlyZSdkZWJ1ZycKbG9jYWwgYSA9IDEyICAtLSBhIGxvY2FsIHZhcmlhYmxlCgpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKYXNzZXJ0KG4gPT0gIigqdGVtcG9yYXJ5KSIgYW5kIHYgPT0gZGVidWcpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCm4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAyKQphc3NlcnQobiA9PSAiKCp0ZW1wb3JhcnkpIiBhbmQgdiA9PSAxMikgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKCi0tIGEgZnVuY3Rpb24gd2l0aCBhbiB1cHZhbHVlCmxvY2FsIGYgPSBmdW5jdGlvbiAoKSBsb2NhbCB4OyByZXR1cm4gYSBlbmQKbiwgdiA9IGRlYnVnLmdldHVwdmFsdWUoZiwgMSkKYXNzZXJ0KG4gPT0gIigqbm8gbmFtZSkiIGFuZCB2ID09IDEyKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmLCAxLCAxMykgPT0gIigqbm8gbmFtZSkiKQphc3NlcnQoYSA9PSAxMykKCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKdCA9IGRlYnVnLmdldGluZm8oZiwgIkwiKS5hY3RpdmVsaW5lcwphc3NlcnQobmV4dCh0KSA9PSBuaWwpICAgIC0tIGFjdGl2ZSBsaW5lcyBhcmUgZW1wdHkKCi0tIGR1bXAvbG9hZCBhIGZ1bmN0aW9uIHdpdGhvdXQgZGVidWcgaW5mbwpmID0gbG9hZChzdHJpbmcuZHVtcChmKSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYpCmFzc2VydCh0Lm5hbWUgPT0gbmlsIGFuZCB0LmxpbmVkZWZpbmVkID4gMCBhbmQKICAgICAgIHQubGFzdGxpbmVkZWZpbmVkID09IHQubGluZWRlZmluZWQgYW5kCiAgICAgICB0LnNob3J0X3NyYyA9PSAiPyIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLmN1cnJlbnRsaW5lID09IC0xKQoKcmV0dXJuIGEKXV0KCgotLSBsb2FkICdwcm9nJyB3aXRob3V0IGRlYnVnIGluZm8KbG9jYWwgZiA9IGFzc2VydChsb2FkKHN0cmluZy5kdW1wKGxvYWQocHJvZyksIHRydWUpKSkKCmFzc2VydChmKCkgPT0gMTMpCgpkbyAgIC0tIHRlc3RzIGZvciAnc291cmNlJyBpbiBiaW5hcnkgZHVtcHMKICBsb2NhbCBwcm9nID0gW1sKICAgIHJldHVybiBmdW5jdGlvbiAoeCkKICAgICAgcmV0dXJuIGZ1bmN0aW9uICh5KSAKICAgICAgICByZXR1cm4geCArIHkKICAgICAgZW5kCiAgICBlbmQKICBdXQogIGxvY2FsIG5hbWUgPSBzdHJpbmcucmVwKCJ4IiwgMTAwMCkKICBsb2NhbCBwID0gYXNzZXJ0KGxvYWQocHJvZywgbmFtZSkpCiAgLS0gbG9hZCAncCcgYXMgYSBiaW5hcnkgY2h1bmsgd2l0aCBkZWJ1ZyBpbmZvcm1hdGlvbgogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwKQogIGFzc2VydCgjYyA+IDEwMDAgYW5kICNjIDwgMjAwMCkgICAtLSBubyByZXBldGl0aW9uIG9mICdzb3VyY2UnIGluIGR1bXAKICBsb2NhbCBmID0gYXNzZXJ0KGxvYWQoYykpCiAgbG9jYWwgZyA9IGYoKQogIGxvY2FsIGggPSBnKDMpCiAgYXNzZXJ0KGgoNSkgPT0gOCkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zb3VyY2UgPT0gbmFtZSBhbmQgICAtLSBhbGwgZnVuY3Rpb25zIGhhdmUgJ3NvdXJjZScKICAgICAgICAgZGVidWcuZ2V0aW5mbyhnKS5zb3VyY2UgPT0gbmFtZSBhbmQgCiAgICAgICAgIGRlYnVnLmdldGluZm8oaCkuc291cmNlID09IG5hbWUpCiAgLS0gYWdhaW4sIHdpdGhvdXQgZGVidWcgaW5mbwogIGxvY2FsIGMgPSBzdHJpbmcuZHVtcChwLCB0cnVlKQogIGFzc2VydCgjYyA8IDUwMCkgICAtLSBubyAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzMCkKICBhc3NlcnQoaCg1MCkgPT0gODApCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09ICc9PycgYW5kICAgLS0gbm8gZnVuY3Rpb24gaGFzICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09ICc9PycgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSAnPT8nKQplbmQKCnByaW50Ik9LIgoK