LS0gJElkOiB0ZXN0ZXMvZmlsZXMubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUgImRlYnVnIgoKbG9jYWwgbWF4aW50ID0gbWF0aC5tYXhpbnRlZ2VyCgphc3NlcnQodHlwZShvcy5nZXRlbnYiUEFUSCIpID09ICJzdHJpbmciKQoKYXNzZXJ0KGlvLmlucHV0KGlvLnN0ZGluKSA9PSBpby5zdGRpbikKYXNzZXJ0KG5vdCBwY2FsbChpby5pbnB1dCwgIm5vbi1leGlzdGVudC1maWxlIikpCmFzc2VydChpby5vdXRwdXQoaW8uc3Rkb3V0KSA9PSBpby5zdGRvdXQpCgoKbG9jYWwgZnVuY3Rpb24gdGVzdGVyciAobXNnLCBmLCAuLi4pCiAgbG9jYWwgc3RhdCwgZXJyID0gcGNhbGwoZiwgLi4uKQogIHJldHVybiAobm90IHN0YXQgYW5kIHN0cmluZy5maW5kKGVyciwgbXNnLCAxLCB0cnVlKSkKZW5kCgoKbG9jYWwgZnVuY3Rpb24gY2hlY2tlcnIgKG1zZywgZiwgLi4uKQogIGFzc2VydCh0ZXN0ZXJyKG1zZywgZiwgLi4uKSkKZW5kCgoKLS0gY2Fubm90IGNsb3NlIHN0YW5kYXJkIGZpbGVzCmFzc2VydChub3QgaW8uY2xvc2UoaW8uc3RkaW4pIGFuZAogICAgICAgbm90IGlvLnN0ZG91dDpjbG9zZSgpIGFuZAogICAgICAgbm90IGlvLnN0ZGVycjpjbG9zZSgpKQoKLS0gY2Fubm90IGNhbGwgY2xvc2UgbWV0aG9kIHdpdGhvdXQgYW4gYXJndW1lbnQgKG5ldyBpbiA1LjMuNSkKY2hlY2tlcnIoImdvdCBubyB2YWx1ZSIsIGlvLnN0ZGluLmNsb3NlKQoKCmFzc2VydCh0eXBlKGlvLmlucHV0KCkpID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8ub3V0cHV0KCkpID09ICJmaWxlIikKYXNzZXJ0KHR5cGUoaW8uc3RkaW4pID09ICJ1c2VyZGF0YSIgYW5kIGlvLnR5cGUoaW8uc3RkZXJyKSA9PSAiZmlsZSIpCmFzc2VydChub3QgaW8udHlwZSg4KSkKbG9jYWwgYSA9IHt9OyBzZXRtZXRhdGFibGUoYSwge30pCmFzc2VydChub3QgaW8udHlwZShhKSkKCmFzc2VydChnZXRtZXRhdGFibGUoaW8uaW5wdXQoKSkuX19uYW1lID09ICJGSUxFKiIpCgpsb2NhbCBhLGIsYyA9IGlvLm9wZW4oJ3h1eHVfbmFvX2V4aXN0ZScpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmEsYixjID0gaW8ub3BlbignL2EvYi9jL2QnLCAndycpCmFzc2VydChub3QgYSBhbmQgdHlwZShiKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjKSA9PSAibnVtYmVyIikKCmxvY2FsIGZpbGUgPSBvcy50bXBuYW1lKCkKbG9jYWwgZiwgbXNnID0gaW8ub3BlbihmaWxlLCAidyIpCmlmIG5vdCBmIHRoZW4KICAoTWVzc2FnZSBvciBwcmludCkoIidvcy50bXBuYW1lJyBmaWxlIGNhbm5vdCBiZSBvcGVuOyBza2lwcGluZyBmaWxlIHRlc3RzIikKCmVsc2UgIC0teyAgbW9zdCB0ZXN0cyBoZXJlIG5lZWQgdG1wbmFtZQpmOmNsb3NlKCkKCnByaW50KCd0ZXN0aW5nIGkvbycpCgpsb2NhbCBvdGhlcmZpbGUgPSBvcy50bXBuYW1lKCkKCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicnciKQpjaGVja2VycigiaW52YWxpZCBtb2RlIiwgaW8ub3BlbiwgZmlsZSwgInJiKyIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAicitiayIpCmNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5vcGVuLCBmaWxlLCAiIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICIrIikKY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLm9wZW4sIGZpbGUsICJiIikKYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInIrYiIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyKyIpKTpjbG9zZSgpCmFzc2VydChpby5vcGVuKGZpbGUsICJyYiIpKTpjbG9zZSgpCgphc3NlcnQob3Muc2V0bG9jYWxlKCdDJywgJ2FsbCcpKQoKaW8uaW5wdXQoaW8uc3RkaW4pOyBpby5vdXRwdXQoaW8uc3Rkb3V0KTsKCm9zLnJlbW92ZShmaWxlKQphc3NlcnQobm90IGxvYWRmaWxlKGZpbGUpKQpjaGVja2VycigiIiwgZG9maWxlLCBmaWxlKQphc3NlcnQobm90IGlvLm9wZW4oZmlsZSkpCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ub3V0cHV0KCkgfj0gaW8uc3Rkb3V0KQoKaWYgbm90IF9wb3J0IHRoZW4gICAtLSBpbnZhbGlkIHNlZWsKICBsb2NhbCBzdGF0dXMsIG1zZywgY29kZSA9IGlvLnN0ZGluOnNlZWsoInNldCIsIDEwMDApCiAgYXNzZXJ0KG5vdCBzdGF0dXMgYW5kIHR5cGUobXNnKSA9PSAic3RyaW5nIiBhbmQgdHlwZShjb2RlKSA9PSAibnVtYmVyIikKZW5kCgphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygpID09IDApCmFzc2VydChpby53cml0ZSgiYWxvIGFsbyIpOnNlZWsoKSA9PSBzdHJpbmcubGVuKCJhbG8gYWxvIikpCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJjdXIiLCAtMykgPT0gc3RyaW5nLmxlbigiYWxvIGFsbyIpLTMpCmFzc2VydChpby53cml0ZSgiam9hbyIpKQphc3NlcnQoaW8ub3V0cHV0KCk6c2VlaygiZW5kIikgPT0gc3RyaW5nLmxlbigiYWxvIGpvYW8iKSkKCmFzc2VydChpby5vdXRwdXQoKTpzZWVrKCJzZXQiKSA9PSAwKQoKYXNzZXJ0KGlvLndyaXRlKCci4WxvIicsICJ7YX1cbiIsICJzZWNvbmQgbGluZVxuIiwgInRoaXJkIGxpbmUgXG4iKSkKYXNzZXJ0KGlvLndyaXRlKCfnZm91cnRoX2xpbmUnKSkKaW8ub3V0cHV0KGlvLnN0ZG91dCkKY29sbGVjdGdhcmJhZ2UoKSAgLS0gZmlsZSBzaG91bGQgYmUgY2xvc2VkIGJ5IEdDCmFzc2VydChpby5pbnB1dCgpID09IGlvLnN0ZGluIGFuZCByYXdlcXVhbChpby5vdXRwdXQoKSwgaW8uc3Rkb3V0KSkKcHJpbnQoJysnKQoKLS0gdGVzdCBHQyBmb3IgZmlsZXMKY29sbGVjdGdhcmJhZ2UoKQpmb3IgaT0xLDEyMCBkbwogIGZvciBpPTEsNSBkbwogICAgaW8uaW5wdXQoZmlsZSkKICAgIGFzc2VydChpby5vcGVuKGZpbGUsICdyJykpCiAgICBpby5saW5lcyhmaWxlKQogIGVuZAogIGNvbGxlY3RnYXJiYWdlKCkKZW5kCgppby5pbnB1dCgpOmNsb3NlKCkKaW8uY2xvc2UoKQoKYXNzZXJ0KG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQphc3NlcnQobm90IG9zLnJlbmFtZShmaWxlLCBvdGhlcmZpbGUpKQoKaW8ub3V0cHV0KGlvLm9wZW4ob3RoZXJmaWxlLCAiYWIiKSkKYXNzZXJ0KGlvLndyaXRlKCJcblxuXHRcdCAgIiwgMzQ1MCwgIlxuIikpOwppby5jbG9zZSgpCgoKZG8KICAtLSBjbG9zaW5nIGZpbGUgYnkgc2NvcGUKICBsb2NhbCBGID0gbmlsCiAgZG8KICAgIGxvY2FsIGYgPGNsb3NlPiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCiAgICBGID0gZgogIGVuZAogIGFzc2VydCh0b3N0cmluZyhGKSA9PSAiZmlsZSAoY2xvc2VkKSIpCmVuZAphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCmRvCiAgLS0gdGVzdCB3cml0aW5nL3JlYWRpbmcgbnVtYmVycwogIGxvY2FsIGYgPGNsb3NlPiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJ3IikpCiAgZjp3cml0ZShtYXhpbnQsICdcbicpCiAgZjp3cml0ZShzdHJpbmcuZm9ybWF0KCIwWCV4XG4iLCBtYXhpbnQpKQogIGY6d3JpdGUoIjB4QUJDcC0zIiwgJ1xuJykKICBmOndyaXRlKDAsICdcbicpCiAgZjp3cml0ZSgtbWF4aW50LCAnXG4nKQogIGY6d3JpdGUoc3RyaW5nLmZvcm1hdCgiMHglWFxuIiwgLW1heGludCkpCiAgZjp3cml0ZSgiLTB4QUJDcC0zIiwgJ1xuJykKICBhc3NlcnQoZjpjbG9zZSgpKQogIGxvY2FsIGYgPGNsb3NlPiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgYXNzZXJ0KGY6cmVhZCgibiIpID09IG1heGludCkKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gbWF4aW50KQogIGFzc2VydChmOnJlYWQoIm4iKSA9PSAweEFCQ3AtMykKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gMCkKICBhc3NlcnQoZjpyZWFkKCIqbiIpID09IC1tYXhpbnQpICAgICAgICAgICAgLS0gdGVzdCBvbGQgZm9ybWF0ICh3aXRoICcqJykKICBhc3NlcnQoZjpyZWFkKCJuIikgPT0gLW1heGludCkKICBhc3NlcnQoZjpyZWFkKCIqbiIpID09IC0weEFCQ3AtMykgICAgICAgICAgICAtLSB0ZXN0IG9sZCBmb3JtYXQgKHdpdGggJyonKQplbmQKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgotLSB0ZXN0aW5nIG11bHRpcGxlIGFyZ3VtZW50cyB0byBpby5yZWFkCmRvCiAgbG9jYWwgZiA8Y2xvc2U+ID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICBmOndyaXRlW1sKYSBsaW5lCmFub3RoZXIgbGluZQoxMjM0CjMuNDUKb25lCnR3bwp0aHJlZQpdXQogIGxvY2FsIGwxLCBsMiwgbDMsIGw0LCBuMSwgbjIsIGMsIGR1bW15CiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICBsb2NhbCBmIDxjbG9zZT4gPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQogIGwxLCBsMiwgbjEsIG4yLCBkdW1teSA9IGY6cmVhZCgibCIsICJMIiwgIm4iLCAibiIpCiAgYXNzZXJ0KGwxID09ICJhIGxpbmUiIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lXG4iIGFuZAogICAgICAgICBuMSA9PSAxMjM0IGFuZCBuMiA9PSAzLjQ1IGFuZCBkdW1teSA9PSBuaWwpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICBsb2NhbCBmIDxjbG9zZT4gPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAiciIpKQogIGwxLCBsMiwgbjEsIG4yLCBjLCBsMywgbDQsIGR1bW15ID0gZjpyZWFkKDcsICJsIiwgIm4iLCAibiIsIDEsICJsIiwgImwiKQogIGFzc2VydChsMSA9PSAiYSBsaW5lXG4iIGFuZCBsMiA9PSAiYW5vdGhlciBsaW5lIiBhbmQgYyA9PSAnXG4nIGFuZAogICAgICAgICBuMSA9PSAxMjM0IGFuZCBuMiA9PSAzLjQ1IGFuZCBsMyA9PSAib25lIiBhbmQgbDQgPT0gInR3byIKICAgICAgICAgYW5kIGR1bW15ID09IG5pbCkKICBhc3NlcnQoZjpjbG9zZSgpKQogIGxvY2FsIGYgPGNsb3NlPiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgLS0gc2Vjb25kIGl0ZW0gZmFpbGluZwogIGwxLCBuMSwgbjIsIGR1bW15ID0gZjpyZWFkKCJsIiwgIm4iLCAibiIsICJsIikKICBhc3NlcnQobDEgPT0gImEgbGluZSIgYW5kIG5vdCBuMSkKZW5kCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKCi0tIHRlc3QgeWllbGRpbmcgZHVyaW5nICdkb2ZpbGUnCmYgPSBhc3NlcnQoaW8ub3BlbihmaWxlLCAidyIpKQpmOndyaXRlW1sKbG9jYWwgeCwgeiA9IGNvcm91dGluZS55aWVsZCgxMCkKbG9jYWwgeSA9IGNvcm91dGluZS55aWVsZCgyMCkKcmV0dXJuIHggKyB5ICogegpdXQphc3NlcnQoZjpjbG9zZSgpKQpmID0gY29yb3V0aW5lLndyYXAoZG9maWxlKQphc3NlcnQoZihmaWxlKSA9PSAxMCkKYXNzZXJ0KGYoMTAwLCAxMDEpID09IDIwKQphc3NlcnQoZigyMDApID09IDEwMCArIDIwMCAqIDEwMSkKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKCgpmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKLS0gdGVzdCBudW1iZXIgdGVybWluYXRpb24KZjp3cml0ZVtbCi0xMi4zLQktMHhmZmZmKyAgLjN8NS5FLTNYICArMjM0ZSsxM0UgMHhERUFEQkVFRkRFQURCRUVGeAoweDEuMTNBcCszZQpdXQotLSB2ZXJ5IGxvbmcgbnVtYmVyCmY6d3JpdGUoIjEyMzQiKTsgZm9yIGkgPSAxLCAxMDAwIGRvIGY6d3JpdGUoIjAiKSBlbmQ7ICBmOndyaXRlKCJcbiIpCi0tIGludmFsaWQgc2VxdWVuY2VzIChtdXN0IHJlYWQgYW5kIGRpc2NhcmQgdmFsaWQgcHJlZml4ZXMpCmY6d3JpdGVbWwouZSsJMC5lOwktLTsgIDB4WDsKXV0KYXNzZXJ0KGY6Y2xvc2UoKSkKZiA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAtMTIuMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gIi0iKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gLTB4ZmZmZik7IGFzc2VydChmOnJlYWQoMikgPT0gIisgIikKYXNzZXJ0KGY6cmVhZCgibiIpID09IDAuMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gInwiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gNWUtMyk7IGFzc2VydChmOnJlYWQoMSkgPT0gIlgiKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMjM0ZTEzKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiRSIpCmFzc2VydChmOnJlYWQoIm4iKSA9PSAwWGRlYWRiZWVmZGVhZGJlZWYpOyBhc3NlcnQoZjpyZWFkKDIpID09ICJ4XG4iKQphc3NlcnQoZjpyZWFkKCJuIikgPT0gMHgxLjEzYVAzKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiZSIpCgpkbyAgIC0tIGF0dGVtcHQgdG8gcmVhZCB0b28gbG9uZyBudW1iZXIKICBhc3NlcnQobm90IGY6cmVhZCgibiIpKSAgLS0gZmFpbHMKICBsb2NhbCBzID0gZjpyZWFkKCJMIikgICAtLSByZWFkIHJlc3Qgb2YgbGluZQogIGFzc2VydChzdHJpbmcuZmluZChzLCAiXjAwKlxuJCIpKSAgLS0gbG90cyBvZiAwJ3MgbGVmdAplbmQKCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDIpID09ICJlKyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQoZjpyZWFkKDEpID09ICI7IikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMikgPT0gIi07IikKYXNzZXJ0KG5vdCBmOnJlYWQoIm4iKSk7IGFzc2VydChmOnJlYWQoMSkgPT0gIlgiKQphc3NlcnQobm90IGY6cmVhZCgibiIpKTsgYXNzZXJ0KGY6cmVhZCgxKSA9PSAiOyIpCmFzc2VydChub3QgZjpyZWFkKCJuIikpOyBhc3NlcnQobm90IGY6cmVhZCgwKSkgICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoZjpjbG9zZSgpKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKCi0tIHRlc3QgbGluZSBnZW5lcmF0b3JzCmFzc2VydChub3QgcGNhbGwoaW8ubGluZXMsICJub24tZXhpc3RlbnQtZmlsZSIpKQphc3NlcnQob3MucmVuYW1lKG90aGVyZmlsZSwgZmlsZSkpCmlvLm91dHB1dChvdGhlcmZpbGUpCmxvY2FsIG4gPSAwCmxvY2FsIGYgPSBpby5saW5lcyhmaWxlKQp3aGlsZSBmKCkgZG8gbiA9IG4gKyAxIGVuZDsKYXNzZXJ0KG4gPT0gNikgICAtLSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGZpbGUKY2hlY2tlcnIoImZpbGUgaXMgYWxyZWFkeSBjbG9zZWQiLCBmKQpjaGVja2VycigiZmlsZSBpcyBhbHJlYWR5IGNsb3NlZCIsIGYpCi0tIGNvcHkgZnJvbSBmaWxlIHRvIG90aGVyZmlsZQpuID0gMApmb3IgbCBpbiBpby5saW5lcyhmaWxlKSBkbyBpby53cml0ZShsLCAiXG4iKTsgbiA9IG4gKyAxIGVuZAppby5jbG9zZSgpCmFzc2VydChuID09IDYpCi0tIGNvcHkgZnJvbSBvdGhlcmZpbGUgYmFjayB0byBmaWxlCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihvdGhlcmZpbGUpKQphc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCmlvLm91dHB1dChmaWxlKQphc3NlcnQobm90IGlvLm91dHB1dCgpOnJlYWQoKSkKbiA9IDAKZm9yIGwgaW4gZjpsaW5lcygpIGRvIGlvLndyaXRlKGwsICJcbiIpOyBuID0gbiArIDEgZW5kCmFzc2VydCh0b3N0cmluZyhmKTpzdWIoMSwgNSkgPT0gImZpbGUgIikKYXNzZXJ0KGY6Y2xvc2UoKSk7IGlvLmNsb3NlKCkKYXNzZXJ0KG4gPT0gNikKY2hlY2tlcnIoImNsb3NlZCBmaWxlIiwgaW8uY2xvc2UsIGYpCmFzc2VydCh0b3N0cmluZyhmKSA9PSAiZmlsZSAoY2xvc2VkKSIpCmFzc2VydChpby50eXBlKGYpID09ICJjbG9zZWQgZmlsZSIpCmlvLmlucHV0KGZpbGUpCmYgPSBpby5vcGVuKG90aGVyZmlsZSk6bGluZXMoKQpuID0gMApmb3IgbCBpbiBpby5saW5lcygpIGRvIGFzc2VydChsID09IGYoKSk7IG4gPSBuICsgMSBlbmQKZiA9IG5pbDsgY29sbGVjdGdhcmJhZ2UoKQphc3NlcnQobiA9PSA2KQphc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCgpkbyAgLS0gYnVnIGluIDUuMy4xCiAgaW8ub3V0cHV0KG90aGVyZmlsZSkKICBpby53cml0ZShzdHJpbmcucmVwKCJhIiwgMzAwKSwgIlxuIikKICBpby5jbG9zZSgpCiAgbG9jYWwgdCA9e307IGZvciBpID0gMSwgMjUwIGRvIHRbaV0gPSAxIGVuZAogIHQgPSB7aW8ubGluZXMob3RoZXJmaWxlLCB0YWJsZS51bnBhY2sodCkpKCl9CiAgLS0gZXZlcnl0aGluZyBvayBoZXJlCiAgYXNzZXJ0KCN0ID09IDI1MCBhbmQgdFsxXSA9PSAnYScgYW5kIHRbI3RdID09ICdhJykKICB0WyN0ICsgMV0gPSAxICAgIC0tIG9uZSB0b28gbWFueQogIGNoZWNrZXJyKCJ0b28gbWFueSBhcmd1bWVudHMiLCBpby5saW5lcywgb3RoZXJmaWxlLCB0YWJsZS51bnBhY2sodCkpCiAgY29sbGVjdGdhcmJhZ2UoKSAgIC0tIGVuc3VyZSAnb3RoZXJmaWxlJyBpcyBjbG9zZWQKICBhc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCmVuZAoKaW8uaW5wdXQoZmlsZSkKZG8gIC0tIHRlc3QgZXJyb3IgcmV0dXJucwogIGxvY2FsIGEsYixjID0gaW8uaW5wdXQoKTp3cml0ZSgieHV4dSIpCiAgYXNzZXJ0KG5vdCBhIGFuZCB0eXBlKGIpID09ICJzdHJpbmciIGFuZCB0eXBlKGMpID09ICJudW1iZXIiKQplbmQKY2hlY2tlcnIoImludmFsaWQgZm9ybWF0IiwgaW8ucmVhZCwgIngiKQphc3NlcnQoaW8ucmVhZCgwKSA9PSAiIikgICAtLSBub3QgZW9mCmFzc2VydChpby5yZWFkKDUsICdsJykgPT0gJyLhbG8iJykKYXNzZXJ0KGlvLnJlYWQoMCkgPT0gIiIpCmFzc2VydChpby5yZWFkKCkgPT0gInNlY29uZCBsaW5lIikKbG9jYWwgeCA9IGlvLmlucHV0KCk6c2VlaygpCmFzc2VydChpby5yZWFkKCkgPT0gInRoaXJkIGxpbmUgIikKYXNzZXJ0KGlvLmlucHV0KCk6c2Vlaygic2V0IiwgeCkpCmFzc2VydChpby5yZWFkKCdMJykgPT0gInRoaXJkIGxpbmUgXG4iKQphc3NlcnQoaW8ucmVhZCgxKSA9PSAi5yIpCmFzc2VydChpby5yZWFkKHN0cmluZy5sZW4iZm91cnRoX2xpbmUiKSA9PSAiZm91cnRoX2xpbmUiKQphc3NlcnQoaW8uaW5wdXQoKTpzZWVrKCJjdXIiLCAtc3RyaW5nLmxlbiJmb3VydGhfbGluZSIpKQphc3NlcnQoaW8ucmVhZCgpID09ICJmb3VydGhfbGluZSIpCmFzc2VydChpby5yZWFkKCkgPT0gIiIpICAtLSBlbXB0eSBsaW5lCmFzc2VydChpby5yZWFkKCduJykgPT0gMzQ1MCkKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJ1xuJykKYXNzZXJ0KG5vdCBpby5yZWFkKDApKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KG5vdCBpby5yZWFkKDEpKSAgLS0gZW5kIG9mIGZpbGUKYXNzZXJ0KG5vdCBpby5yZWFkKDMwMDAwKSkgIC0tIGVuZCBvZiBmaWxlCmFzc2VydCgoe2lvLnJlYWQoMSl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KG5vdCBpby5yZWFkKCkpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoKHtpby5yZWFkKCl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KG5vdCBpby5yZWFkKCduJykpICAtLSBlbmQgb2YgZmlsZQphc3NlcnQoKHtpby5yZWFkKCduJyl9KVsyXSA9PSB1bmRlZikKYXNzZXJ0KGlvLnJlYWQoJ2EnKSA9PSAnJykgIC0tIGVuZCBvZiBmaWxlIChPSyBmb3IgJ2EnKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICcnKSAgLS0gZW5kIG9mIGZpbGUgKE9LIGZvciAnYScpCmNvbGxlY3RnYXJiYWdlKCkKcHJpbnQoJysnKQppby5jbG9zZShpby5pbnB1dCgpKQpjaGVja2VycigiIGlucHV0IGZpbGUgaXMgY2xvc2VkIiwgaW8ucmVhZCkKCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgpsb2NhbCB0ID0gJzAxMjM0NTY3ODknCmZvciBpPTEsMTAgZG8gdCA9IHQuLnQ7IGVuZAphc3NlcnQoc3RyaW5nLmxlbih0KSA9PSAxMCoyXjEwKQoKaW8ub3V0cHV0KGZpbGUpCmlvLndyaXRlKCJhbG8iKTp3cml0ZSgiXG4iKQppby5jbG9zZSgpCmNoZWNrZXJyKCIgb3V0cHV0IGZpbGUgaXMgY2xvc2VkIiwgaW8ud3JpdGUpCmxvY2FsIGYgPSBpby5vcGVuKGZpbGUsICJhK2IiKQppby5vdXRwdXQoZikKY29sbGVjdGdhcmJhZ2UoKQoKYXNzZXJ0KGlvLndyaXRlKCcgJyAuLiB0IC4uICcgJykpCmFzc2VydChpby53cml0ZSgnOycsICdlbmQgb2YgZmlsZVxuJykpCmY6Zmx1c2goKTsgaW8uZmx1c2goKQpmOmNsb3NlKCkKcHJpbnQoJysnKQoKaW8uaW5wdXQoZmlsZSkKYXNzZXJ0KGlvLnJlYWQoKSA9PSAiYWxvIikKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gJyAnKQphc3NlcnQoaW8ucmVhZChzdHJpbmcubGVuKHQpKSA9PSB0KQphc3NlcnQoaW8ucmVhZCgxKSA9PSAnICcpCmFzc2VydChpby5yZWFkKDApKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICc7ZW5kIG9mIGZpbGVcbicpCmFzc2VydChub3QgaW8ucmVhZCgwKSkKYXNzZXJ0KGlvLmNsb3NlKGlvLmlucHV0KCkpKQoKCi0tIHRlc3QgZXJyb3JzIGluIHJlYWQvd3JpdGUKZG8KICBsb2NhbCBmdW5jdGlvbiBpc21zZyAobSkKICAgIC0tIGVycm9yIG1lc3NhZ2UgaXMgbm90IGEgY29kZSBudW1iZXIKICAgIHJldHVybiAodHlwZShtKSA9PSAic3RyaW5nIiBhbmQgbm90IHRvbnVtYmVyKG0pKQogIGVuZAoKICAtLSByZWFkCiAgbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgInciKQogIGxvY2FsIHIsIG0sIGMgPSBmOnJlYWQoKQogIGFzc2VydChub3QgciBhbmQgaXNtc2cobSkgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICAtLSB3cml0ZQogIGYgPSBpby5vcGVuKGZpbGUsICJyIikKICByLCBtLCBjID0gZjp3cml0ZSgid2hhdGV2ZXIiKQogIGFzc2VydChub3QgciBhbmQgaXNtc2cobSkgYW5kIHR5cGUoYykgPT0gIm51bWJlciIpCiAgYXNzZXJ0KGY6Y2xvc2UoKSkKICAtLSBsaW5lcwogIGYgPSBpby5vcGVuKGZpbGUsICJ3IikKICByLCBtID0gcGNhbGwoZjpsaW5lcygpKQogIGFzc2VydChyID09IGZhbHNlIGFuZCBpc21zZyhtKSkKICBhc3NlcnQoZjpjbG9zZSgpKQplbmQKCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgotLSB0ZXN0IGZvciBMIGZvcm1hdAppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlIlxuXG5saW5lXG5vdGhlciI6Y2xvc2UoKQppby5pbnB1dChmaWxlKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAiXG4iKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAiXG4iKQphc3NlcnQoaW8ucmVhZCJMIiA9PSAibGluZVxuIikKYXNzZXJ0KGlvLnJlYWQiTCIgPT0gIm90aGVyIikKYXNzZXJ0KG5vdCBpby5yZWFkIkwiKQppby5pbnB1dCgpOmNsb3NlKCkKCmxvY2FsIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlKSkKbG9jYWwgcyA9ICIiCmZvciBsIGluIGY6bGluZXMoIkwiKSBkbyBzID0gcyAuLiBsIGVuZAphc3NlcnQocyA9PSAiXG5cbmxpbmVcbm90aGVyIikKZjpjbG9zZSgpCgppby5pbnB1dChmaWxlKQpzID0gIiIKZm9yIGwgaW4gaW8ubGluZXMobmlsLCAiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQppby5pbnB1dCgpOmNsb3NlKCkKCnMgPSAiIgpmb3IgbCBpbiBpby5saW5lcyhmaWxlLCAiTCIpIGRvIHMgPSBzIC4uIGwgZW5kCmFzc2VydChzID09ICJcblxubGluZVxub3RoZXIiKQoKcyA9ICIiCmZvciBsIGluIGlvLmxpbmVzKGZpbGUsICJsIikgZG8gcyA9IHMgLi4gbCBlbmQKYXNzZXJ0KHMgPT0gImxpbmVvdGhlciIpCgppby5vdXRwdXQoZmlsZSk7IGlvLndyaXRlImEgPSAxMCArIDM0XG5hID0gMiphXG5hID0gLWFcbiI6Y2xvc2UoKQpsb2NhbCB0ID0ge30KYXNzZXJ0KGxvYWQoaW8ubGluZXMoZmlsZSwgIkwiKSwgbmlsLCBuaWwsIHQpKSgpCmFzc2VydCh0LmEgPT0gLSgoMTAgKyAzNCkgKiAyKSkKCgpkbyAgIC0tIHRlc3RpbmcgY2xvc2luZyBmaWxlIGluIGxpbmUgaXRlcmF0aW9uCgogIC0tIGdldCB0aGUgdG8tYmUtY2xvc2VkIHZhcmlhYmxlIGZyb20gYSBsb29wCiAgbG9jYWwgZnVuY3Rpb24gZ2V0dG9jbG9zZSAobHYpCiAgICBsdiA9IGx2ICsgMQogICAgbG9jYWwgc3R2YXIgPSAwICAgLS0gdG8tYmUtY2xvc2VkIGlzIDR0aCBzdGF0ZSB2YXJpYWJsZSBpbiB0aGUgbG9vcAogICAgZm9yIGkgPSAxLCAxMDAwIGRvCiAgICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbChsdiwgaSkKICAgICAgaWYgbiA9PSAiKGZvciBzdGF0ZSkiIHRoZW4KICAgICAgICBzdHZhciA9IHN0dmFyICsgMQogICAgICAgIGlmIHN0dmFyID09IDQgdGhlbiByZXR1cm4gdiBlbmQKICAgICAgZW5kCiAgICBlbmQKICBlbmQKCiAgbG9jYWwgZgogIGZvciBsIGluIGlvLmxpbmVzKGZpbGUpIGRvCiAgICBmID0gZ2V0dG9jbG9zZSgxKQogICAgYXNzZXJ0KGlvLnR5cGUoZikgPT0gImZpbGUiKQogICAgYnJlYWsKICBlbmQKICBhc3NlcnQoaW8udHlwZShmKSA9PSAiY2xvc2VkIGZpbGUiKQoKICBmID0gbmlsCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChuYW1lKQogICAgZm9yIGwgaW4gaW8ubGluZXMobmFtZSkgZG8KICAgICAgZiA9IGdldHRvY2xvc2UoMSkKICAgICAgYXNzZXJ0KGlvLnR5cGUoZikgPT0gImZpbGUiKQogICAgICBlcnJvcihmKSAgIC0tIGV4aXQgbG9vcCB3aXRoIGFuIGVycm9yCiAgICBlbmQKICBlbmQKICBsb2NhbCBzdCwgbXNnID0gcGNhbGwoZm9vLCBmaWxlKQogIGFzc2VydChzdCA9PSBmYWxzZSBhbmQgaW8udHlwZShtc2cpID09ICJjbG9zZWQgZmlsZSIpCgplbmQKCgotLSB0ZXN0IGZvciBtdWx0aXBlIGFyZ3VtZW50cyBpbiAnbGluZXMnCmlvLm91dHB1dChmaWxlKTsgaW8ud3JpdGUiMDEyMzQ1Njc4OVxuIjpjbG9zZSgpCmZvciBhLGIgaW4gaW8ubGluZXMoZmlsZSwgMSwgMSkgZG8KICBpZiBhID09ICJcbiIgdGhlbiBhc3NlcnQobm90IGIpCiAgZWxzZSBhc3NlcnQodG9udW1iZXIoYSkgPT0gdG9udW1iZXIoYikgLSAxKQogIGVuZAplbmQKCmZvciBhLGIsYyBpbiBpby5saW5lcyhmaWxlLCAxLCAyLCAiYSIpIGRvCiAgYXNzZXJ0KGEgPT0gIjAiIGFuZCBiID09ICIxMiIgYW5kIGMgPT0gIjM0NTY3ODlcbiIpCmVuZAoKZm9yIGEsYixjIGluIGlvLmxpbmVzKGZpbGUsICJhIiwgMCwgMSkgZG8KICBpZiBhID09ICIiIHRoZW4gYnJlYWsgZW5kCiAgYXNzZXJ0KGEgPT0gIjAxMjM0NTY3ODlcbiIgYW5kIG5vdCBiIGFuZCBub3QgYykKZW5kCmNvbGxlY3RnYXJiYWdlKCkgICAtLSB0byBjbG9zZSBmaWxlIGluIHByZXZpb3VzIGl0ZXJhdGlvbgoKaW8ub3V0cHV0KGZpbGUpOyBpby53cml0ZSIwMFxuMTBcbjIwXG4zMFxuNDBcbiI6Y2xvc2UoKQpmb3IgYSwgYiBpbiBpby5saW5lcyhmaWxlLCAibiIsICJuIikgZG8KICBpZiBhID09IDQwIHRoZW4gYXNzZXJ0KG5vdCBiKQogIGVsc2UgYXNzZXJ0KGEgPT0gYiAtIDEwKQogIGVuZAplbmQKCgotLSB0ZXN0IGxvYWQgeCBsaW5lcwppby5vdXRwdXQoZmlsZSk7CmlvLndyaXRlW1sKbG9jYWwgeQo9IFgKWCA9ClggKgoyICsKWDsKWCA9ClgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeTsKXV06Y2xvc2UoKQpfRy5YID0gMQphc3NlcnQobm90IGxvYWQoKGlvLmxpbmVzKGZpbGUpKSkpCmNvbGxlY3RnYXJiYWdlKCkgICAtLSB0byBjbG9zZSBmaWxlIGluIHByZXZpb3VzIGl0ZXJhdGlvbgpsb2FkKChpby5saW5lcyhmaWxlLCAiTCIpKSkoKQphc3NlcnQoX0cuWCA9PSAyKQpsb2FkKChpby5saW5lcyhmaWxlLCAxKSkpKCkKYXNzZXJ0KF9HLlggPT0gNCkKbG9hZCgoaW8ubGluZXMoZmlsZSwgMykpKSgpCmFzc2VydChfRy5YID09IDgpCl9HLlggPSBuaWwKCnByaW50KCcrJykKCmxvY2FsIHgxID0gInN0cmluZ1xuXG5cXGNvbSBcIlwiJydjb2lzYXMgW1tlc3RyYW5oYXNdXSBdXSciCmlvLm91dHB1dChmaWxlKQphc3NlcnQoaW8ud3JpdGUoc3RyaW5nLmZvcm1hdCgiWDIgPSAlcVxuLS0gY29tbWVudCB3aXRob3V0IGVuZGluZyBFT1MiLCB4MSkpKQppby5jbG9zZSgpCmFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoeDEgPT0gX0cuWDIpCl9HLlgyID0gbmlsCnByaW50KCcrJykKYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKYXNzZXJ0KG5vdCBvcy5yZW1vdmUoZmlsZSkpCmFzc2VydChub3Qgb3MucmVtb3ZlKG90aGVyZmlsZSkpCgotLSB0ZXN0aW5nIGxvYWRmaWxlCmxvY2FsIGZ1bmN0aW9uIHRlc3Rsb2FkZmlsZSAocywgZXhwcmVzKQogIGlvLm91dHB1dChmaWxlKQogIGlmIHMgdGhlbiBpby53cml0ZShzKSBlbmQKICBpby5jbG9zZSgpCiAgbG9jYWwgcmVzID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUpKSgpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKICBhc3NlcnQocmVzID09IGV4cHJlcykKZW5kCgotLSBsb2FkaW5nIGVtcHR5IGZpbGUKdGVzdGxvYWRmaWxlKG5pbCwgbmlsKQoKLS0gbG9hZGluZyBmaWxlIHdpdGggaW5pdGlhbCBjb21tZW50IHdpdGhvdXQgZW5kIG9mIGxpbmUKdGVzdGxvYWRmaWxlKCIjIGEgbm9uLWVuZGluZyBjb21tZW50IiwgbmlsKQoKCi0tIGNoZWNraW5nIFVuaWNvZGUgQk9NIGluIGZpbGVzCnRlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGIyBzb21lIGNvbW1lbnRcbnJldHVybiAyMzQiLCAyMzQpCnRlc3Rsb2FkZmlsZSgiXHhFRlx4QkJceEJGcmV0dXJuIDIzOSIsIDIzOSkKdGVzdGxvYWRmaWxlKCJceEVGXHhCQlx4QkYiLCBuaWwpICAgLS0gZW1wdHkgZmlsZSB3aXRoIGEgQk9NCgoKLS0gY2hlY2tpbmcgbGluZSBudW1iZXJzIGluIGZpbGVzIHdpdGggaW5pdGlhbCBjb21tZW50cwp0ZXN0bG9hZGZpbGUoIiMgYSBjb21tZW50XG5yZXR1cm4gcmVxdWlyZSdkZWJ1ZycuZ2V0aW5mbygxKS5jdXJyZW50bGluZSIsIDIpCgoKLS0gbG9hZGluZyBiaW5hcnkgZmlsZQppby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKYXNzZXJ0KGlvLndyaXRlKHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAxMCwgJ1wwYWxvXDI1NScsICdoaScgZW5kKSkpCmlvLmNsb3NlKCkKYSwgYiwgYyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoYSA9PSAxMCBhbmQgYiA9PSAiXDBhbG9cMjU1IiBhbmQgYyA9PSAiaGkiKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQoKLS0gYnVnIGluIDUuMi4xCmRvCiAgaW8ub3V0cHV0KGlvLm9wZW4oZmlsZSwgIndiIikpCiAgLS0gc2F2ZSBmdW5jdGlvbiB3aXRoIG5vIHVwdmFsdWVzCiAgYXNzZXJ0KGlvLndyaXRlKHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAxIGVuZCkpKQogIGlvLmNsb3NlKCkKICBmID0gYXNzZXJ0KGxvYWRmaWxlKGZpbGUsICJiIiwge30pKQogIGFzc2VydCh0eXBlKGYpID09ICJmdW5jdGlvbiIgYW5kIGYoKSA9PSAxKQogIGFzc2VydChvcy5yZW1vdmUoZmlsZSkpCmVuZAoKLS0gbG9hZGluZyBiaW5hcnkgZmlsZSB3aXRoIGluaXRpYWwgY29tbWVudAppby5vdXRwdXQoaW8ub3BlbihmaWxlLCAid2IiKSkKYXNzZXJ0KGlvLndyaXRlKCIjdGhpcyBpcyBhIGNvbW1lbnQgZm9yIGEgYmluYXJ5IGZpbGVcMFxuIiwKICAgICAgICAgICAgICAgIHN0cmluZy5kdW1wKGZ1bmN0aW9uICgpIHJldHVybiAyMCwgJ1wwXDBcMCcgZW5kKSkpCmlvLmNsb3NlKCkKYSwgYiwgYyA9IGFzc2VydChsb2FkZmlsZShmaWxlKSkoKQphc3NlcnQoYSA9PSAyMCBhbmQgYiA9PSAiXDBcMFwwIiBhbmQgYyA9PSBuaWwpCmFzc2VydChvcy5yZW1vdmUoZmlsZSkpCgoKLS0gJ2xvYWRmaWxlJyB3aXRoICdlbnYnCmRvCiAgbG9jYWwgZiA9IGlvLm9wZW4oZmlsZSwgJ3cnKQogIGY6d3JpdGVbWwogICAgaWYgKC4uLikgdGhlbiBhID0gMTU7IHJldHVybiBiLCBjLCBkCiAgICBlbHNlIHJldHVybiBfRU5WCiAgICBlbmQKICBdXQogIGY6Y2xvc2UoKQogIGxvY2FsIHQgPSB7YiA9IDEyLCBjID0gInh1eHUiLCBkID0gcHJpbnR9CiAgbG9jYWwgZiA9IGFzc2VydChsb2FkZmlsZShmaWxlLCAndCcsIHQpKQogIGxvY2FsIGIsIGMsIGQgPSBmKDEpCiAgYXNzZXJ0KHQuYSA9PSAxNSBhbmQgYiA9PSAxMiBhbmQgYyA9PSB0LmMgYW5kIGQgPT0gcHJpbnQpCiAgYXNzZXJ0KGYoKSA9PSB0KQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSwgJ3QnLCBuaWwpKQogIGFzc2VydChmKCkgPT0gbmlsKQogIGYgPSBhc3NlcnQobG9hZGZpbGUoZmlsZSkpCiAgYXNzZXJ0KGYoKSA9PSBfRykKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgotLSAnbG9hZGZpbGUnIHggbW9kZXMKZG8KICBpby5vcGVuKGZpbGUsICd3Jyk6d3JpdGUoInJldHVybiAxMCIpOmNsb3NlKCkKICBsb2NhbCBzLCBtID0gbG9hZGZpbGUoZmlsZSwgJ2InKQogIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgdGV4dCBjaHVuayIpKQogIGlvLm9wZW4oZmlsZSwgJ3cnKTp3cml0ZSgiXDI3IHJldHVybiAxMCIpOmNsb3NlKCkKICBsb2NhbCBzLCBtID0gbG9hZGZpbGUoZmlsZSwgJ3QnKQogIGFzc2VydChub3QgcyBhbmQgc3RyaW5nLmZpbmQobSwgImEgYmluYXJ5IGNodW5rIikpCiAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKZW5kCgoKaW8ub3V0cHV0KGZpbGUpCmFzc2VydChpby53cml0ZSgicXVhbHF1ZXIgY29pc2FcbiIpKQphc3NlcnQoaW8ud3JpdGUoIm1haXMgcXVhbHF1ZXIgY29pc2EiKSkKaW8uY2xvc2UoKQphc3NlcnQoaW8ub3V0cHV0KGFzc2VydChpby5vcGVuKG90aGVyZmlsZSwgJ3diJykpKQogICAgICAgOndyaXRlKCJvdXRyYSBjb2lzYVwwXDFcM1wwXDBcMFwwXDI1NVwwIikKICAgICAgIDpjbG9zZSgpKQoKbG9jYWwgZmlsZWhhbmRsZSA9IGFzc2VydChpby5vcGVuKGZpbGUsICdyKycpKQpsb2NhbCBvdGhlcmZpbGVoYW5kbGUgPSBhc3NlcnQoaW8ub3BlbihvdGhlcmZpbGUsICdyYicpKQphc3NlcnQoZmlsZWhhbmRsZSB+PSBvdGhlcmZpbGVoYW5kbGUpCmFzc2VydCh0eXBlKGZpbGVoYW5kbGUpID09ICJ1c2VyZGF0YSIpCmFzc2VydChmaWxlaGFuZGxlOnJlYWQoJ2wnKSA9PSAicXVhbHF1ZXIgY29pc2EiKQppby5pbnB1dChvdGhlcmZpbGVoYW5kbGUpCmFzc2VydChpby5yZWFkKHN0cmluZy5sZW4ib3V0cmEgY29pc2EiKSA9PSAib3V0cmEgY29pc2EiKQphc3NlcnQoZmlsZWhhbmRsZTpyZWFkKCdsJykgPT0gIm1haXMgcXVhbHF1ZXIgY29pc2EiKQpmaWxlaGFuZGxlOmNsb3NlKCk7CmFzc2VydCh0eXBlKGZpbGVoYW5kbGUpID09ICJ1c2VyZGF0YSIpCmlvLmlucHV0KG90aGVyZmlsZWhhbmRsZSkKYXNzZXJ0KGlvLnJlYWQoNCkgPT0gIlwwXDFcM1wwIikKYXNzZXJ0KGlvLnJlYWQoMykgPT0gIlwwXDBcMCIpCmFzc2VydChpby5yZWFkKDApID09ICIiKSAgICAgICAgLS0gMjU1IGlzIG5vdCBlb2YKYXNzZXJ0KGlvLnJlYWQoMSkgPT0gIlwyNTUiKQphc3NlcnQoaW8ucmVhZCgnYScpID09ICJcMCIpCmFzc2VydChub3QgaW8ucmVhZCgwKSkKYXNzZXJ0KG90aGVyZmlsZWhhbmRsZSA9PSBpby5pbnB1dCgpKQpvdGhlcmZpbGVoYW5kbGU6Y2xvc2UoKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQphc3NlcnQob3MucmVtb3ZlKG90aGVyZmlsZSkpCmNvbGxlY3RnYXJiYWdlKCkKCmlvLm91dHB1dChmaWxlKQogIDp3cml0ZVtbCiAxMjMuNAktNTZlLTIgIG5vdCBhIG51bWJlcgpzZWNvbmQgbGluZQp0aGlyZCBsaW5lCgphbmQgdGhlIHJlc3Qgb2YgdGhlIGZpbGUKXV0KICA6Y2xvc2UoKQppby5pbnB1dChmaWxlKQpsb2NhbCBfLGEsYixjLGQsZSxoLF9fID0gaW8ucmVhZCgxLCAnbicsICduJywgJ2wnLCAnbCcsICdsJywgJ2EnLCAxMCkKYXNzZXJ0KGlvLmNsb3NlKGlvLmlucHV0KCkpKQphc3NlcnQoXyA9PSAnICcgYW5kIG5vdCBfXykKYXNzZXJ0KHR5cGUoYSkgPT0gJ251bWJlcicgYW5kIGE9PTEyMy40IGFuZCBiPT0tNTZlLTIpCmFzc2VydChkPT0nc2Vjb25kIGxpbmUnIGFuZCBlPT0ndGhpcmQgbGluZScpCmFzc2VydChoPT1bWwoKYW5kIHRoZSByZXN0IG9mIHRoZSBmaWxlCl1dKQphc3NlcnQob3MucmVtb3ZlKGZpbGUpKQpjb2xsZWN0Z2FyYmFnZSgpCgotLSB0ZXN0aW5nIGJ1ZmZlcnMKZG8KICBsb2NhbCBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgInciKSkKICBsb2NhbCBmciA9IGFzc2VydChpby5vcGVuKGZpbGUsICJyIikpCiAgYXNzZXJ0KGY6c2V0dmJ1ZigiZnVsbCIsIDIwMDApKQogIGY6d3JpdGUoIngiKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAiIikgIC0tIGZ1bGwgYnVmZmVyOyBvdXRwdXQgbm90IHdyaXR0ZW4geWV0CiAgZjpjbG9zZSgpCiAgZnI6c2Vlaygic2V0IikKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIngiKSAgIC0tIGBjbG9zZScgZmx1c2hlcyBpdAogIGYgPSBhc3NlcnQoaW8ub3BlbihmaWxlKSwgInciKQogIGFzc2VydChmOnNldHZidWYoIm5vIikpCiAgZjp3cml0ZSgieCIpCiAgZnI6c2Vlaygic2V0IikKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIngiKSAgLS0gbm8gYnVmZmVyOyBvdXRwdXQgaXMgcmVhZHkKICBmOmNsb3NlKCkKICBmID0gYXNzZXJ0KGlvLm9wZW4oZmlsZSwgImEiKSkKICBhc3NlcnQoZjpzZXR2YnVmKCJsaW5lIikpCiAgZjp3cml0ZSgieCIpCiAgZnI6c2Vlaygic2V0IiwgMSkKICBhc3NlcnQoZnI6cmVhZCgiYWxsIikgPT0gIiIpICAgLS0gbGluZSBidWZmZXI7IG5vIG91dHB1dCB3aXRob3V0IGBcbicKICBmOndyaXRlKCJhXG4iKTpzZWVrKCJzZXQiLCAxKQogIGFzc2VydChmcjpyZWFkKCJhbGwiKSA9PSAieGFcbiIpICAtLSBub3cgd2UgaGF2ZSBhIHdob2xlIGxpbmUKICBmOmNsb3NlKCk7IGZyOmNsb3NlKCkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQplbmQKCgppZiBub3QgX3NvZnQgdGhlbgogIHByaW50KCJ0ZXN0aW5nIGxhcmdlIGZpbGVzICg+IEJVRlNJWikiKQogIGlvLm91dHB1dChmaWxlKQogIGZvciBpPTEsNTAwMSBkbyBpby53cml0ZSgnMDEyMzQ1Njc4OTEyMycpIGVuZAogIGlvLndyaXRlKCdcbjEyMzQ2Jyk6Y2xvc2UoKQogIGlvLmlucHV0KGZpbGUpCiAgbG9jYWwgeCA9IGlvLnJlYWQoJ2EnKQogIGlvLmlucHV0KCk6c2Vlaygnc2V0JywgMCkKICBsb2NhbCB5ID0gaW8ucmVhZCgzMDAwMSkuLmlvLnJlYWQoMTAwNSkuLmlvLnJlYWQoMCkuLgogICAgICAgICAgICBpby5yZWFkKDEpLi5pby5yZWFkKDEwMDAwMykKICBhc3NlcnQoeCA9PSB5IGFuZCBzdHJpbmcubGVuKHgpID09IDUwMDEqMTMgKyA2KQogIGlvLmlucHV0KCk6c2Vlaygnc2V0JywgMCkKICB5ID0gaW8ucmVhZCgpICAtLSBodWdlIGxpbmUKICBhc3NlcnQoeCA9PSB5Li4nXG4nLi5pby5yZWFkKCkpCiAgYXNzZXJ0KG5vdCBpby5yZWFkKCkpCiAgaW8uY2xvc2UoaW8uaW5wdXQoKSkKICBhc3NlcnQob3MucmVtb3ZlKGZpbGUpKQogIHggPSBuaWw7IHkgPSBuaWwKZW5kCgppZiBub3QgX3BvcnQgdGhlbgogIGxvY2FsIHByb2duYW1lCiAgZG8gIC0tIGdldCBuYW1lIG9mIHJ1bm5pbmcgZXhlY3V0YWJsZQogICAgbG9jYWwgYXJnID0gYXJnIG9yIEFSRwogICAgbG9jYWwgaSA9IDAKICAgIHdoaWxlIGFyZ1tpXSBkbyBpID0gaSAtIDEgZW5kCiAgICBwcm9nbmFtZSA9ICciJyAuLiBhcmdbaSArIDFdIC4uICciJwogIGVuZAogIHByaW50KCJ0ZXN0aW5nIHBvcGVuL3BjbG9zZSBhbmQgZXhlY3V0ZSIpCiAgLS0gaW52YWxpZCBtb2RlIGZvciBwb3BlbgogIGNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5wb3BlbiwgImNhdCIsICIiKQogIGNoZWNrZXJyKCJpbnZhbGlkIG1vZGUiLCBpby5wb3BlbiwgImNhdCIsICJyKyIpCiAgY2hlY2tlcnIoImludmFsaWQgbW9kZSIsIGlvLnBvcGVuLCAiY2F0IiwgInJ3IikKICBkbyAgLS0gYmFzaWMgdGVzdHMgZm9yIHBvcGVuCiAgICBsb2NhbCBmaWxlID0gb3MudG1wbmFtZSgpCiAgICBsb2NhbCBmID0gYXNzZXJ0KGlvLnBvcGVuKCJjYXQgLSA+ICIgLi4gZmlsZSwgInciKSkKICAgIGY6d3JpdGUoImEgbGluZSIpCiAgICBhc3NlcnQoZjpjbG9zZSgpKQogICAgbG9jYWwgZiA9IGFzc2VydChpby5wb3BlbigiY2F0IC0gPCAiIC4uIGZpbGUsICJyIikpCiAgICBhc3NlcnQoZjpyZWFkKCJhIikgPT0gImEgbGluZSIpCiAgICBhc3NlcnQoZjpjbG9zZSgpKQogICAgYXNzZXJ0KG9zLnJlbW92ZShmaWxlKSkKICBlbmQKCiAgbG9jYWwgdGVzdHMgPSB7CiAgICAtLSBjb21tYW5kLCAgIHdoYXQsICBjb2RlCiAgICB7ImxzID4gL2Rldi9udWxsIiwgIm9rIn0sCiAgICB7Im5vdC10by1iZS1mb3VuZC1jb21tYW5kIiwgImV4aXQifSwKICAgIHsiZXhpdCAzIiwgImV4aXQiLCAzfSwKICAgIHsiZXhpdCAxMjkiLCAiZXhpdCIsIDEyOX0sCiAgICB7ImtpbGwgLXMgSFVQICQkIiwgInNpZ25hbCIsIDF9LAogICAgeyJraWxsIC1zIEtJTEwgJCQiLCAic2lnbmFsIiwgOX0sCiAgICB7InNoIC1jICdraWxsIC1zIEhVUCAkJCciLCAiZXhpdCJ9LAogICAge3Byb2duYW1lIC4uICcgLWUgIiAiJywgIm9rIn0sCiAgICB7cHJvZ25hbWUgLi4gJyAtZSAib3MuZXhpdCgwLCB0cnVlKSInLCAib2sifSwKICAgIHtwcm9nbmFtZSAuLiAnIC1lICJvcy5leGl0KDIwLCB0cnVlKSInLCAiZXhpdCIsIDIwfSwKICB9CiAgcHJpbnQoIlxuKHNvbWUgZXJyb3IgbWVzc2FnZXMgYXJlIGV4cGVjdGVkIG5vdykiKQogIGZvciBfLCB2IGluIGlwYWlycyh0ZXN0cykgZG8KICAgIGxvY2FsIHgsIHksIHogPSBpby5wb3Blbih2WzFdKTpjbG9zZSgpCiAgICBsb2NhbCB4MSwgeTEsIHoxID0gb3MuZXhlY3V0ZSh2WzFdKQogICAgYXNzZXJ0KHggPT0geDEgYW5kIHkgPT0geTEgYW5kIHogPT0gejEpCiAgICBpZiB2WzJdID09ICJvayIgdGhlbgogICAgICBhc3NlcnQoeCBhbmQgeSA9PSAnZXhpdCcgYW5kIHogPT0gMCkKICAgIGVsc2UKICAgICAgYXNzZXJ0KG5vdCB4IGFuZCB5ID09IHZbMl0pICAgLS0gY29ycmVjdCBzdGF0dXMgYW5kICd3aGF0JwogICAgICAtLSBjb3JyZWN0IGNvZGUgaWYga25vd24gKGJ1dCBhbHdheXMgZGlmZmVyZW50IGZyb20gMCkKICAgICAgYXNzZXJ0KCh2WzNdID09IG5pbCBhbmQgeiA+IDApIG9yIHZbM10gPT0geikKICAgIGVuZAogIGVuZAplbmQKCgotLSB0ZXN0aW5nIHRtcGZpbGUKZiA9IGlvLnRtcGZpbGUoKQphc3NlcnQoaW8udHlwZShmKSA9PSAiZmlsZSIpCmY6d3JpdGUoImFsbyIpCmY6c2Vlaygic2V0IikKYXNzZXJ0KGY6cmVhZCJhIiA9PSAiYWxvIikKCmVuZCAtLX0KCnByaW50JysnCgpwcmludCgidGVzdGluZyBkYXRlL3RpbWUiKQoKYXNzZXJ0KG9zLmRhdGUoIiIpID09ICIiKQphc3NlcnQob3MuZGF0ZSgiISIpID09ICIiKQphc3NlcnQob3MuZGF0ZSgiXDBcMCIpID09ICJcMFwwIikKYXNzZXJ0KG9zLmRhdGUoIiFcMFwwIikgPT0gIlwwXDAiKQpsb2NhbCB4ID0gc3RyaW5nLnJlcCgiYSIsIDEwMDAwKQphc3NlcnQob3MuZGF0ZSh4KSA9PSB4KQpsb2NhbCB0ID0gb3MudGltZSgpCkQgPSBvcy5kYXRlKCIqdCIsIHQpCmFzc2VydChvcy5kYXRlKHN0cmluZy5yZXAoIiVkIiwgMTAwMCksIHQpID09CiAgICAgICBzdHJpbmcucmVwKG9zLmRhdGUoIiVkIiwgdCksIDEwMDApKQphc3NlcnQob3MuZGF0ZShzdHJpbmcucmVwKCIlIiwgMjAwKSkgPT0gc3RyaW5nLnJlcCgiJSIsIDEwMCkpCgpsb2NhbCBmdW5jdGlvbiBjaGVja0RhdGVUYWJsZSAodCkKICBfRy5EID0gb3MuZGF0ZSgiKnQiLCB0KQogIGFzc2VydChvcy50aW1lKEQpID09IHQpCiAgbG9hZChvcy5kYXRlKFtbYXNzZXJ0KEQueWVhcj09JVkgYW5kIEQubW9udGg9PSVtIGFuZCBELmRheT09JWQgYW5kCiAgICBELmhvdXI9PSVIIGFuZCBELm1pbj09JU0gYW5kIEQuc2VjPT0lUyBhbmQKICAgIEQud2RheT09JXcrMSBhbmQgRC55ZGF5PT0laildXSwgdCkpKCkKICBfRy5EID0gbmlsCmVuZAoKY2hlY2tEYXRlVGFibGUob3MudGltZSgpKQppZiBub3QgX3BvcnQgdGhlbgogIC0tIGFzc3VtZSB0aGF0IHRpbWVfdCBjYW4gcmVwcmVzZW50IHRoZXNlIHZhbHVlcwogIGNoZWNrRGF0ZVRhYmxlKDApCiAgY2hlY2tEYXRlVGFibGUoMSkKICBjaGVja0RhdGVUYWJsZSgxMDAwKQogIGNoZWNrRGF0ZVRhYmxlKDB4N2ZmZmZmZmYpCiAgY2hlY2tEYXRlVGFibGUoMHg4MDAwMDAwMCkKZW5kCgpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlIikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJTkiKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlIikKY2hlY2tlcnIoImludmFsaWQgY29udmVyc2lvbiBzcGVjaWZpZXIiLCBvcy5kYXRlLCAiJU8iKQpjaGVja2VycigiaW52YWxpZCBjb252ZXJzaW9uIHNwZWNpZmllciIsIG9zLmRhdGUsICIlRSIpCmNoZWNrZXJyKCJpbnZhbGlkIGNvbnZlcnNpb24gc3BlY2lmaWVyIiwgb3MuZGF0ZSwgIiVFYSIpCgpjaGVja2Vycigibm90IGFuIGludGVnZXIiLCBvcy50aW1lLCB7eWVhcj0xMDAwLCBtb250aD0xLCBkYXk9MSwgaG91cj0neCd9KQpjaGVja2Vycigibm90IGFuIGludGVnZXIiLCBvcy50aW1lLCB7eWVhcj0xMDAwLCBtb250aD0xLCBkYXk9MSwgaG91cj0xLjV9KQoKY2hlY2tlcnIoIm1pc3NpbmciLCBvcy50aW1lLCB7aG91ciA9IDEyfSkgICAtLSBtaXNzaW5nIGRhdGUKCgppZiBzdHJpbmcucGFja3NpemUoImkiKSA9PSA0IHRoZW4gICAtLSA0LWJ5dGUgaW50cwogIGNoZWNrZXJyKCJmaWVsZCAneWVhcicgaXMgb3V0LW9mLWJvdW5kIiwgb3MudGltZSwKICAgICAgICAgICAgICB7eWVhciA9IC0oMSA8PCAzMSkgKyAxODk5LCBtb250aCA9IDEsIGRheSA9IDF9KQoKICBjaGVja2VycigiZmllbGQgJ3llYXInIGlzIG91dC1vZi1ib3VuZCIsIG9zLnRpbWUsCiAgICAgICAgICAgICAge3llYXIgPSAtKDEgPDwgMzEpLCBtb250aCA9IDEsIGRheSA9IDF9KQoKICBpZiBtYXRoLm1heGludGVnZXIgPiAyXjMxIHRoZW4gICAtLSBsYXJnZXIgbHVhX2ludGVnZXI/CiAgICBjaGVja2VycigiZmllbGQgJ3llYXInIGlzIG91dC1vZi1ib3VuZCIsIG9zLnRpbWUsCiAgICAgICAgICAgICAgICB7eWVhciA9ICgxIDw8IDMxKSArIDE5MDAsIG1vbnRoID0gMSwgZGF5ID0gMX0pCiAgZW5kCmVuZAoKCmlmIG5vdCBfcG9ydCB0aGVuCiAgLS0gdGVzdCBQb3NpeC1zcGVjaWZpYyBtb2RpZmllcnMKICBhc3NlcnQodHlwZShvcy5kYXRlKCIlRXgiKSkgPT0gJ3N0cmluZycpCiAgYXNzZXJ0KHR5cGUob3MuZGF0ZSgiJU95IikpID09ICdzdHJpbmcnKQoKICAtLSB0ZXN0IGxhcmdlIGRhdGVzIChhc3N1bWUgYXQgbGVhc3QgNC1ieXRlIGludHMgYW5kIHRpbWVfdCkKICBsb2NhbCB0MCA9IG9zLnRpbWV7eWVhciA9IDE5NzAsIG1vbnRoID0gMSwgZGF5ID0gMH0KICBsb2NhbCB0MSA9IG9zLnRpbWV7eWVhciA9IDE5NzAsIG1vbnRoID0gMSwgZGF5ID0gMCwgc2VjID0gKDEgPDwgMzEpIC0gMX0KICBhc3NlcnQodDEgLSB0MCA9PSAoMSA8PCAzMSkgLSAxKQogIHQwID0gb3MudGltZXt5ZWFyID0gMTk3MCwgbW9udGggPSAxLCBkYXkgPSAxfQogIHQxID0gb3MudGltZXt5ZWFyID0gMTk3MCwgbW9udGggPSAxLCBkYXkgPSAxLCBzZWMgPSAtKDEgPDwgMzEpfQogIGFzc2VydCh0MSAtIHQwID09IC0oMSA8PCAzMSkpCgogIC0tIHRlc3Qgb3V0LW9mLXJhbmdlIGRhdGVzIChhdCBsZWFzdCBmb3IgVW5peCkKICBpZiBtYXhpbnQgPj0gMl42MiB0aGVuICAtLSBjYW5ub3QgZG8gdGhlc2UgdGVzdHMgaW4gU21hbGwgTHVhCiAgICAtLSBubyBhcml0aCBvdmVyZmxvd3MKICAgIGNoZWNrZXJyKCJvdXQtb2YtYm91bmQiLCBvcy50aW1lLCB7eWVhciA9IC1tYXhpbnQsIG1vbnRoID0gMSwgZGF5ID0gMX0pCiAgICBpZiBzdHJpbmcucGFja3NpemUoImkiKSA9PSA0IHRoZW4gICAtLSA0LWJ5dGUgaW50cwogICAgICBpZiB0ZXN0ZXJyKCJvdXQtb2YtYm91bmQiLCBvcy5kYXRlLCAiJVkiLCAyXjQwKSB0aGVuCiAgICAgICAgLS0gdGltZV90IGhhcyA0IGJ5dGVzIGFuZCB0aGVyZWZvcmUgY2Fubm90IHJlcHJlc2VudCB5ZWFyIDQwMDAKICAgICAgICBwcmludCgiICA0LWJ5dGUgdGltZV90IikKICAgICAgICBjaGVja2VycigiY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgb3MudGltZSwge3llYXI9NDAwMCwgbW9udGg9MSwgZGF5PTF9KQogICAgICBlbHNlCiAgICAgICAgLS0gdGltZV90IGhhcyA4IGJ5dGVzOyBhbiBpbnQgeWVhciBjYW5ub3QgcmVwcmVzZW50IGEgaHVnZSB0aW1lCiAgICAgICAgcHJpbnQoIiAgOC1ieXRlIHRpbWVfdCIpCiAgICAgICAgY2hlY2tlcnIoImNhbm5vdCBiZSByZXByZXNlbnRlZCIsIG9zLmRhdGUsICIlWSIsIDJeNjApCgogICAgICAgIC0tIHRoaXMgaXMgdGhlIG1heGltdW0geWVhcgogICAgICAgIGFzc2VydCh0b251bWJlcihvcy50aW1lCiAgICAgICAgICB7eWVhcj0oMSA8PCAzMSkgKyAxODk5LCBtb250aD0xMiwgZGF5PTMxLCBob3VyPTIzLCBtaW49NTksIHNlYz01OX0pKQoKICAgICAgICAtLSB0aGlzIGlzIHRvbyBtdWNoCiAgICAgICAgY2hlY2tlcnIoInJlcHJlc2VudGVkIiwgb3MudGltZSwKICAgICAgICAgIHt5ZWFyPSgxIDw8IDMxKSArIDE4OTksIG1vbnRoPTEyLCBkYXk9MzEsIGhvdXI9MjMsIG1pbj01OSwgc2VjPTYwfSkKICAgICAgZW5kCgogICAgICAtLSBpbnRlcm5hbCAnaW50JyBmaWVsZHMgY2Fubm90IGhvbGQgdGhlc2UgdmFsdWVzCiAgICAgIGNoZWNrZXJyKCJmaWVsZCAnZGF5JyBpcyBvdXQtb2YtYm91bmQiLCBvcy50aW1lLAogICAgICAgICAgICAgICAgICB7eWVhciA9IDAsIG1vbnRoID0gMSwgZGF5ID0gMl4zMn0pCgogICAgICBjaGVja2VycigiZmllbGQgJ21vbnRoJyBpcyBvdXQtb2YtYm91bmQiLCBvcy50aW1lLAogICAgICAgICAgICAgICAgICB7eWVhciA9IDAsIG1vbnRoID0gLSgoMSA8PCAzMSkgKyAxKSwgZGF5ID0gMX0pCgogICAgICBjaGVja2VycigiZmllbGQgJ3llYXInIGlzIG91dC1vZi1ib3VuZCIsIG9zLnRpbWUsCiAgICAgICAgICAgICAgICAgIHt5ZWFyID0gKDEgPDwgMzEpICsgMTkwMCwgbW9udGggPSAxLCBkYXkgPSAxfSkKCiAgICBlbHNlICAgIC0tIDgtYnl0ZSBpbnRzCiAgICAgIC0tIGFzc3VtZSB0aW1lX3QgaGFzIDggYnl0ZXMgdG9vCiAgICAgIHByaW50KCIgIDgtYnl0ZSB0aW1lX3QiKQogICAgICBhc3NlcnQodG9udW1iZXIob3MuZGF0ZSgiJVkiLCAyXjYwKSkpCgogICAgICAtLSBidXQgc3RpbGwgY2Fubm90IHJlcHJlc2VudCBhIGh1Z2UgeWVhcgogICAgICBjaGVja2VycigiY2Fubm90IGJlIHJlcHJlc2VudGVkIiwgb3MudGltZSwge3llYXI9Ml42MCwgbW9udGg9MSwgZGF5PTF9KQogICAgZW5kCiAgZW5kCmVuZAoKZG8KICBsb2NhbCBEID0gb3MuZGF0ZSgiKnQiKQogIGxvY2FsIHQgPSBvcy50aW1lKEQpCiAgaWYgRC5pc2RzdCA9PSBuaWwgdGhlbgogICAgcHJpbnQoIm5vIGRheWxpZ2h0IHNhdmluZyBpbmZvcm1hdGlvbiIpCiAgZWxzZQogICAgYXNzZXJ0KHR5cGUoRC5pc2RzdCkgPT0gJ2Jvb2xlYW4nKQogIGVuZAogIEQuaXNkc3QgPSBuaWwKICBsb2NhbCB0MSA9IG9zLnRpbWUoRCkKICBhc3NlcnQodCA9PSB0MSkgICAtLSBpZiBpc2RzdCBpcyBhYnNlbnQgdXNlcyBjb3JyZWN0IGRlZmF1bHQKZW5kCgpsb2NhbCBEID0gb3MuZGF0ZSgiKnQiKQp0ID0gb3MudGltZShEKQpELnllYXIgPSBELnllYXItMTsKbG9jYWwgdDEgPSBvcy50aW1lKEQpCi0tIGFsbG93IGZvciBsZWFwIHllYXJzCmFzc2VydChtYXRoLmFicyhvcy5kaWZmdGltZSh0LHQxKS8oMjQqMzYwMCkgLSAzNjUpIDwgMikKCi0tIHNob3VsZCBub3QgdGFrZSBtb3JlIHRoYW4gMSBzZWNvbmQgdG8gZXhlY3V0ZSB0aGVzZSB0d28gbGluZXMKdCA9IG9zLnRpbWUoKQp0MSA9IG9zLnRpbWUob3MuZGF0ZSgiKnQiKSkKbG9jYWwgZGlmZiA9IG9zLmRpZmZ0aW1lKHQxLHQpCmFzc2VydCgwIDw9IGRpZmYgYW5kIGRpZmYgPD0gMSkKZGlmZiA9IG9zLmRpZmZ0aW1lKHQsdDEpCmFzc2VydCgtMSA8PSBkaWZmIGFuZCBkaWZmIDw9IDApCgpsb2NhbCB0MSA9IG9zLnRpbWV7eWVhcj0yMDAwLCBtb250aD0xMCwgZGF5PTEsIGhvdXI9MjMsIG1pbj0xMn0KbG9jYWwgdDIgPSBvcy50aW1le3llYXI9MjAwMCwgbW9udGg9MTAsIGRheT0xLCBob3VyPTIzLCBtaW49MTAsIHNlYz0xOX0KYXNzZXJ0KG9zLmRpZmZ0aW1lKHQxLHQyKSA9PSA2MCoyLTE5KQoKLS0gc2luY2UgNS4zLjMsICdvcy50aW1lJyBub3JtYWxpemVzIHRhYmxlIGZpZWxkcwp0MSA9IHt5ZWFyID0gMjAwNSwgbW9udGggPSAxLCBkYXkgPSAxLCBob3VyID0gMSwgbWluID0gMCwgc2VjID0gLTM2MDJ9Cm9zLnRpbWUodDEpCmFzc2VydCh0MS5kYXkgPT0gMzEgYW5kIHQxLm1vbnRoID09IDEyIGFuZCB0MS55ZWFyID09IDIwMDQgYW5kCiAgICAgICB0MS5ob3VyID09IDIzIGFuZCB0MS5taW4gPT0gNTkgYW5kIHQxLnNlYyA9PSA1OCBhbmQKICAgICAgIHQxLnlkYXkgPT0gMzY2KQoKaW8ub3V0cHV0KGlvLnN0ZG91dCkKbG9jYWwgdCA9IG9zLmRhdGUoJyVkICVtICVZICVIICVNICVTJykKbG9jYWwgZCwgbSwgYSwgaCwgbWluLCBzID0gc3RyaW5nLm1hdGNoKHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiglZCspICglZCspICglZCspICglZCspICglZCspICglZCspIikKZCA9IHRvbnVtYmVyKGQpCm0gPSB0b251bWJlcihtKQphID0gdG9udW1iZXIoYSkKaCA9IHRvbnVtYmVyKGgpCm1pbiA9IHRvbnVtYmVyKG1pbikKcyA9IHRvbnVtYmVyKHMpCmlvLndyaXRlKHN0cmluZy5mb3JtYXQoJ3Rlc3QgZG9uZSBvbiAlMi4yZC8lMi4yZC8lZCcsIGQsIG0sIGEpKQppby53cml0ZShzdHJpbmcuZm9ybWF0KCcsIGF0ICUyLjJkOiUyLjJkOiUyLjJkXG4nLCBoLCBtaW4sIHMpKQppby53cml0ZShzdHJpbmcuZm9ybWF0KCclc1xuJywgX1ZFUlNJT04pKQoKCg==