YWRkRXZlbnQod2luZG93LCAibG9hZCIsIHNvcnRhYmxlc19pbml0KTsKCnZhciBTT1JUX0NPTFVNTl9JTkRFWDsKCmZ1bmN0aW9uIHNvcnRhYmxlc19pbml0KCkgewogICAgLy8gRmluZCBhbGwgdGFibGVzIHdpdGggY2xhc3Mgc29ydGFibGUgYW5kIG1ha2UgdGhlbSBzb3J0YWJsZQogICAgaWYgKCFkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSkgcmV0dXJuOwogICAgdGJscyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJ0YWJsZSIpOwogICAgZm9yICh0aT0wO3RpPHRibHMubGVuZ3RoO3RpKyspIHsKICAgICAgICB0aGlzVGJsID0gdGJsc1t0aV07CiAgICAgICAgaWYgKCgoJyAnK3RoaXNUYmwuY2xhc3NOYW1lKycgJykuaW5kZXhPZigic29ydGFibGUiKSAhPSAtMSkgJiYgKHRoaXNUYmwuaWQpKSB7CiAgICAgICAgICAgIC8vaW5pdFRhYmxlKHRoaXNUYmwuaWQpOwogICAgICAgICAgICB0c19tYWtlU29ydGFibGUodGhpc1RibCk7CiAgICAgICAgfQogICAgfQp9CgpmdW5jdGlvbiB0c19tYWtlU29ydGFibGUodGFibGUpIHsKICAgIGlmICh0YWJsZS5yb3dzICYmIHRhYmxlLnJvd3MubGVuZ3RoID4gMCkgewogICAgICAgIHZhciBmaXJzdFJvdyA9IHRhYmxlLnJvd3NbMF07CiAgICB9CiAgICBpZiAoIWZpcnN0Um93KSByZXR1cm47CiAgICAKICAgIC8vIFdlIGhhdmUgYSBmaXJzdCByb3c6IGFzc3VtZSBpdCdzIHRoZSBoZWFkZXIsIGFuZCBtYWtlIGl0cyBjb250ZW50cyBjbGlja2FibGUgbGlua3MKICAgIGZvciAodmFyIGk9MDtpPGZpcnN0Um93LmNlbGxzLmxlbmd0aDtpKyspIHsKICAgICAgICB2YXIgY2VsbCA9IGZpcnN0Um93LmNlbGxzW2ldOwogICAgICAgIHZhciB0eHQgPSB0c19nZXRJbm5lclRleHQoY2VsbCk7CiAgICAgICAgY2VsbC5pbm5lckhUTUwgPSAnPGEgaHJlZj0iIyIgY2xhc3M9InNvcnRoZWFkZXIiICcrIAogICAgICAgICdvbmNsaWNrPSJ0c19yZXNvcnRUYWJsZSh0aGlzLCAnK2krJyk7cmV0dXJuIGZhbHNlOyI+JyArIAogICAgICAgIHR4dCsnPHNwYW4gY2xhc3M9InNvcnRhcnJvdyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7PC9zcGFuPjwvYT4nOwogICAgfQp9CgpmdW5jdGlvbiB0c19nZXRJbm5lclRleHQoZWwpIHsKCWlmICh0eXBlb2YgZWwgPT0gInN0cmluZyIpIHJldHVybiBlbDsKCWlmICh0eXBlb2YgZWwgPT0gInVuZGVmaW5lZCIpIHsgcmV0dXJuIGVsIH07CglpZiAoZWwuaW5uZXJUZXh0KSByZXR1cm4gZWwuaW5uZXJUZXh0OwkvL05vdCBuZWVkZWQgYnV0IGl0IGlzIGZhc3RlcgoJdmFyIHN0ciA9ICIiOwoJCgl2YXIgY3MgPSBlbC5jaGlsZE5vZGVzOwoJdmFyIGwgPSBjcy5sZW5ndGg7Cglmb3IgKHZhciBpID0gMDsgaSA8IGw7IGkrKykgewoJCXN3aXRjaCAoY3NbaV0ubm9kZVR5cGUpIHsKCQkJY2FzZSAxOiAvL0VMRU1FTlRfTk9ERQoJCQkJc3RyICs9IHRzX2dldElubmVyVGV4dChjc1tpXSk7CgkJCQlicmVhazsKCQkJY2FzZSAzOgkvL1RFWFRfTk9ERQoJCQkJc3RyICs9IGNzW2ldLm5vZGVWYWx1ZTsKCQkJCWJyZWFrOwoJCX0KCX0KCXJldHVybiBzdHI7Cn0KCmZ1bmN0aW9uIHRzX3Jlc29ydFRhYmxlKGxuayxjbGlkKSB7CiAgICAvLyBnZXQgdGhlIHNwYW4KICAgIHZhciBzcGFuOwogICAgZm9yICh2YXIgY2k9MDtjaTxsbmsuY2hpbGROb2Rlcy5sZW5ndGg7Y2krKykgewogICAgICAgIGlmIChsbmsuY2hpbGROb2Rlc1tjaV0udGFnTmFtZSAmJiBsbmsuY2hpbGROb2Rlc1tjaV0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09ICdzcGFuJykgc3BhbiA9IGxuay5jaGlsZE5vZGVzW2NpXTsKICAgIH0KICAgIHZhciBzcGFudGV4dCA9IHRzX2dldElubmVyVGV4dChzcGFuKTsKICAgIHZhciB0ZCA9IGxuay5wYXJlbnROb2RlOwogICAgdmFyIGNvbHVtbiA9IGNsaWQgfHwgdGQuY2VsbEluZGV4OwogICAgdmFyIHRhYmxlID0gZ2V0UGFyZW50KHRkLCdUQUJMRScpOwogICAgCiAgICAvLyBXb3JrIG91dCBhIHR5cGUgZm9yIHRoZSBjb2x1bW4KICAgIGlmICh0YWJsZS5yb3dzLmxlbmd0aCA8PSAxKSByZXR1cm47CiAgICB2YXIgaXRtID0gdHNfZ2V0SW5uZXJUZXh0KHRhYmxlLnJvd3NbMl0uY2VsbHNbY29sdW1uXSk7CiAgICBzb3J0Zm4gPSB0c19zb3J0X2Nhc2VpbnNlbnNpdGl2ZTsKICAgIGlmIChpdG0ubWF0Y2goL15cZFxkW1wvLV1cZFxkW1wvLV1cZFxkXGRcZCQvKSkgc29ydGZuID0gdHNfc29ydF9kYXRlOwogICAgaWYgKGl0bS5tYXRjaCgvXlxkXGRbXC8tXVxkXGRbXC8tXVxkXGQkLykpIHNvcnRmbiA9IHRzX3NvcnRfZGF0ZTsKICAgIGlmIChpdG0ubWF0Y2goL15boyRdLykpIHNvcnRmbiA9IHRzX3NvcnRfY3VycmVuY3k7CiAgICBpZiAoaXRtLm1hdGNoKC9eW1wtXGRcLl0rJC8pKSBzb3J0Zm4gPSB0c19zb3J0X251bWVyaWM7CiAgICBTT1JUX0NPTFVNTl9JTkRFWCA9IGNvbHVtbjsKICAgIHZhciBmaXJzdFJvdyA9IG5ldyBBcnJheSgpOwogICAgdmFyIHNlY29uZFJvdyA9IG5ldyBBcnJheSgpOwogICAgdmFyIG5ld1Jvd3MgPSBuZXcgQXJyYXkoKTsKICAgIGZvciAoaT0wO2k8dGFibGUucm93c1swXS5sZW5ndGg7aSsrKSB7IGZpcnN0Um93W2ldID0gdGFibGUucm93c1swXVtpXTsgfQogICAgZm9yIChpPTA7aTx0YWJsZS5yb3dzWzFdLmxlbmd0aDtpKyspIHsgc2Vjb25kUm93W2ldID0gdGFibGUucm93c1sxXVtpXTsgfQogICAgZm9yIChqPTI7ajx0YWJsZS5yb3dzLmxlbmd0aDtqKyspIHsgbmV3Um93c1tqLTJdID0gdGFibGUucm93c1tqXTsgfQoKICAgIG5ld1Jvd3Muc29ydChzb3J0Zm4pOwoKICAgIGlmIChzcGFuLmdldEF0dHJpYnV0ZSgic29ydGRpciIpID09ICdkb3duJykgewogICAgICAgIEFSUk9XID0gJyZuYnNwOyZuYnNwOyZ1YXJyOyc7CiAgICAgICAgbmV3Um93cy5yZXZlcnNlKCk7CiAgICAgICAgc3Bhbi5zZXRBdHRyaWJ1dGUoJ3NvcnRkaXInLCd1cCcpOwogICAgfSBlbHNlIHsKICAgICAgICBBUlJPVyA9ICcmbmJzcDsmbmJzcDsmZGFycjsnOyAgCglzcGFuLnNldEF0dHJpYnV0ZSgnc29ydGRpcicsJ2Rvd24nKTsKICAgIH0KICAgIAogICAgLy8gV2UgYXBwZW5kQ2hpbGQgcm93cyB0aGF0IGFscmVhZHkgZXhpc3QgdG8gdGhlIHRib2R5LCBzbyBpdCBtb3ZlcyB0aGVtIHJhdGhlciB0aGFuIGNyZWF0aW5nIG5ldyBvbmVzCiAgICAvLyBkb24ndCBkbyBzb3J0Ym90dG9tIHJvd3MKICAgIGZvciAoaT0wO2k8bmV3Um93cy5sZW5ndGg7aSsrKSB7IGlmICghbmV3Um93c1tpXS5jbGFzc05hbWUgfHwgKG5ld1Jvd3NbaV0uY2xhc3NOYW1lICYmIChuZXdSb3dzW2ldLmNsYXNzTmFtZS5pbmRleE9mKCdzb3J0Ym90dG9tJykgPT0gLTEpKSkgdGFibGUudEJvZGllc1swXS5hcHBlbmRDaGlsZChuZXdSb3dzW2ldKTt9CiAgICAvLyBkbyBzb3J0Ym90dG9tIHJvd3Mgb25seQogICAgZm9yIChpPTA7aTxuZXdSb3dzLmxlbmd0aDtpKyspIHsgaWYgKG5ld1Jvd3NbaV0uY2xhc3NOYW1lICYmIChuZXdSb3dzW2ldLmNsYXNzTmFtZS5pbmRleE9mKCdzb3J0Ym90dG9tJykgIT0gLTEpKSB0YWJsZS50Qm9kaWVzWzBdLmFwcGVuZENoaWxkKG5ld1Jvd3NbaV0pO30KICAgIAogICAgLy8gRGVsZXRlIGFueSBvdGhlciBhcnJvd3MgdGhlcmUgbWF5IGJlIHNob3dpbmcKICAgIHZhciBhbGxzcGFucyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7CiAgICBmb3IgKHZhciBjaT0wO2NpPGFsbHNwYW5zLmxlbmd0aDtjaSsrKSB7CiAgICAgICAgaWYgKGFsbHNwYW5zW2NpXS5jbGFzc05hbWUgPT0gJ3NvcnRhcnJvdycpIHsKICAgICAgICAgICAgaWYgKGdldFBhcmVudChhbGxzcGFuc1tjaV0sInRhYmxlIikgPT0gZ2V0UGFyZW50KGxuaywidGFibGUiKSkgeyAvLyBpbiB0aGUgc2FtZSB0YWJsZSBhcyB1cz8KICAgICAgICAgICAgICAgIGFsbHNwYW5zW2NpXS5pbm5lckhUTUwgPSAnJm5ic3A7Jm5ic3A7Jm5ic3A7JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICAgICAKICAgIHNwYW4uaW5uZXJIVE1MID0gQVJST1c7Cn0KCmZ1bmN0aW9uIGdldFBhcmVudChlbCwgcFRhZ05hbWUpIHsKCWlmIChlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKCWVsc2UgaWYgKGVsLm5vZGVUeXBlID09IDEgJiYgZWwudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09IHBUYWdOYW1lLnRvTG93ZXJDYXNlKCkpCS8vIEdlY2tvIGJ1Zywgc3VwcG9zZWQgdG8gYmUgdXBwZXJjYXNlCgkJcmV0dXJuIGVsOwoJZWxzZQoJCXJldHVybiBnZXRQYXJlbnQoZWwucGFyZW50Tm9kZSwgcFRhZ05hbWUpOwp9CmZ1bmN0aW9uIHRzX3NvcnRfZGF0ZShhLGIpIHsKICAgIC8vIHkyayBub3RlczogdHdvIGRpZ2l0IHllYXJzIGxlc3MgdGhhbiA1MCBhcmUgdHJlYXRlZCBhcyAyMFhYLCBncmVhdGVyIHRoYW4gNTAgYXJlIHRyZWF0ZWQgYXMgMTlYWAogICAgYWEgPSB0c19nZXRJbm5lclRleHQoYS5jZWxsc1tTT1JUX0NPTFVNTl9JTkRFWF0pOwogICAgYmIgPSB0c19nZXRJbm5lclRleHQoYi5jZWxsc1tTT1JUX0NPTFVNTl9JTkRFWF0pOwogICAgaWYgKGFhLmxlbmd0aCA9PSAxMCkgewogICAgICAgIGR0MSA9IGFhLnN1YnN0cig2LDQpK2FhLnN1YnN0cigzLDIpK2FhLnN1YnN0cigwLDIpOwogICAgfSBlbHNlIHsKICAgICAgICB5ciA9IGFhLnN1YnN0cig2LDIpOwogICAgICAgIGlmIChwYXJzZUludCh5cikgPCA1MCkgeyB5ciA9ICcyMCcreXI7IH0gZWxzZSB7IHlyID0gJzE5Jyt5cjsgfQogICAgICAgIGR0MSA9IHlyK2FhLnN1YnN0cigzLDIpK2FhLnN1YnN0cigwLDIpOwogICAgfQogICAgaWYgKGJiLmxlbmd0aCA9PSAxMCkgewogICAgICAgIGR0MiA9IGJiLnN1YnN0cig2LDQpK2JiLnN1YnN0cigzLDIpK2JiLnN1YnN0cigwLDIpOwogICAgfSBlbHNlIHsKICAgICAgICB5ciA9IGJiLnN1YnN0cig2LDIpOwogICAgICAgIGlmIChwYXJzZUludCh5cikgPCA1MCkgeyB5ciA9ICcyMCcreXI7IH0gZWxzZSB7IHlyID0gJzE5Jyt5cjsgfQogICAgICAgIGR0MiA9IHlyK2JiLnN1YnN0cigzLDIpK2JiLnN1YnN0cigwLDIpOwogICAgfQogICAgaWYgKGR0MT09ZHQyKSByZXR1cm4gMDsKICAgIGlmIChkdDE8ZHQyKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMTsKfQoKZnVuY3Rpb24gdHNfc29ydF9jdXJyZW5jeShhLGIpIHsgCiAgICBhYSA9IHRzX2dldElubmVyVGV4dChhLmNlbGxzW1NPUlRfQ09MVU1OX0lOREVYXSkucmVwbGFjZSgvW14wLTkuXS9nLCcnKTsKICAgIGJiID0gdHNfZ2V0SW5uZXJUZXh0KGIuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKS5yZXBsYWNlKC9bXjAtOS5dL2csJycpOwogICAgcmV0dXJuIHBhcnNlRmxvYXQoYWEpIC0gcGFyc2VGbG9hdChiYik7Cn0KCmZ1bmN0aW9uIHRzX3NvcnRfbnVtZXJpYyhhLGIpIHsgCiAgICBhYSA9IHBhcnNlRmxvYXQodHNfZ2V0SW5uZXJUZXh0KGEuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKSk7CiAgICBpZiAoaXNOYU4oYWEpKSBhYSA9IDA7CiAgICBiYiA9IHBhcnNlRmxvYXQodHNfZ2V0SW5uZXJUZXh0KGIuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKSk7IAogICAgaWYgKGlzTmFOKGJiKSkgYmIgPSAwOwogICAgcmV0dXJuIGFhLWJiOwp9CgpmdW5jdGlvbiB0c19zb3J0X2Nhc2VpbnNlbnNpdGl2ZShhLGIpIHsKICAgIGFhID0gdHNfZ2V0SW5uZXJUZXh0KGEuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKS50b0xvd2VyQ2FzZSgpOwogICAgYmIgPSB0c19nZXRJbm5lclRleHQoYi5jZWxsc1tTT1JUX0NPTFVNTl9JTkRFWF0pLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoYWE9PWJiKSByZXR1cm4gMDsKICAgIGlmIChhYTxiYikgcmV0dXJuIC0xOwogICAgcmV0dXJuIDE7Cn0KCmZ1bmN0aW9uIHRzX3NvcnRfZGVmYXVsdChhLGIpIHsKICAgIGFhID0gdHNfZ2V0SW5uZXJUZXh0KGEuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKTsKICAgIGJiID0gdHNfZ2V0SW5uZXJUZXh0KGIuY2VsbHNbU09SVF9DT0xVTU5fSU5ERVhdKTsKICAgIGlmIChhYT09YmIpIHJldHVybiAwOwogICAgaWYgKGFhPGJiKSByZXR1cm4gLTE7CiAgICByZXR1cm4gMTsKfQoKCmZ1bmN0aW9uIGFkZEV2ZW50KGVsbSwgZXZUeXBlLCBmbiwgdXNlQ2FwdHVyZSkKLy8gYWRkRXZlbnQgYW5kIHJlbW92ZUV2ZW50Ci8vIGNyb3NzLWJyb3dzZXIgZXZlbnQgaGFuZGxpbmcgZm9yIElFNSssICBOUzYgYW5kIE1vemlsbGEKLy8gQnkgU2NvdHQgQW5kcmV3CnsKICBpZiAoZWxtLmFkZEV2ZW50TGlzdGVuZXIpewogICAgZWxtLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBmbiwgdXNlQ2FwdHVyZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9IGVsc2UgaWYgKGVsbS5hdHRhY2hFdmVudCl7CiAgICB2YXIgciA9IGVsbS5hdHRhY2hFdmVudCgib24iK2V2VHlwZSwgZm4pOwogICAgcmV0dXJuIHI7CiAgfSBlbHNlIHsKICAgIGFsZXJ0KCJIYW5kbGVyIGNvdWxkIG5vdCBiZSByZW1vdmVkIik7CiAgfQp9IAo=