Ly89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8KLy8gRnVuY3Rpb24uY2MKLy8KLy8gQ29weXJpZ2h0IDIwMDEtMjAwMyBHbHlwaCAmIENvZywgTExDCi8vCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLwovLyBNb2RpZmllZCB1bmRlciB0aGUgUG9wcGxlciBwcm9qZWN0IC0gaHR0cDovL3BvcHBsZXIuZnJlZWRlc2t0b3Aub3JnCi8vCi8vIEFsbCBjaGFuZ2VzIG1hZGUgdW5kZXIgdGhlIFBvcHBsZXIgcHJvamVjdCB0byB0aGlzIGZpbGUgYXJlIGxpY2Vuc2VkCi8vIHVuZGVyIEdQTCB2ZXJzaW9uIDIgb3IgbGF0ZXIKLy8KLy8gQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4LTIwMTAsIDIwMTMtMjAxNSwgMjAxNy0yMDE5IEFsYmVydCBBc3RhbHMgQ2lkIDxhYWNpZEBrZGUub3JnPgovLyBDb3B5cmlnaHQgKEMpIDIwMDYgSmVmZiBNdWl6ZWxhYXIgPGplZmZAaW5maWRpZ20ubmV0PgovLyBDb3B5cmlnaHQgKEMpIDIwMTAgQ2hyaXN0aWFuIEZldWVyc+RuZ2VyIDxjZmV1ZXJzYWVuZ2VyQGdvb2dsZW1haWwuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTEgQW5kcmVhIENhbmNpYW5pIDxyYW5tYTQyQGdtYWlsLmNvbT4KLy8gQ29weXJpZ2h0IChDKSAyMDEyIFRob21hcyBGcmVpdGFnIDxUaG9tYXMuRnJlaXRhZ0BhbGZhLmRlPgovLyBDb3B5cmlnaHQgKEMpIDIwMTIgQWRhbSBSZWljaG9sZCA8YWRhbXJlaWNob2xkQG15b3BlcmEuY29tPgovLyBDb3B5cmlnaHQgKEMpIDIwMTMgRmFiaW8gRCdVcnNvIDxmYWJpb2R1cnNvQGhvdG1haWwuaXQ+Ci8vCi8vIFRvIHNlZSBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjaGFuZ2VzIHBsZWFzZSBzZWUgdGhlIENoYW5nZWxvZyBmaWxlIHRoYXQKLy8gY2FtZSB3aXRoIHlvdXIgdGFyYmFsbCBvciB0eXBlIG1ha2UgQ2hhbmdlTG9nIGlmIHlvdSBhcmUgYnVpbGRpbmcgZnJvbSBnaXQKLy8KLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlIDxjb25maWcuaD4KCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgImdvby9nbWVtLmgiCiNpbmNsdWRlICJnb28vZ3N0cnRvZC5oIgojaW5jbHVkZSAiT2JqZWN0LmgiCiNpbmNsdWRlICJEaWN0LmgiCiNpbmNsdWRlICJTdHJlYW0uaCIKI2luY2x1ZGUgIkVycm9yLmgiCiNpbmNsdWRlICJGdW5jdGlvbi5oIgoKI2lmbmRlZiBNX1BJCiNkZWZpbmUgTV9QSSAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CiNlbmRpZgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZ1bmN0aW9uOjpGdW5jdGlvbigpIHsKfQoKRnVuY3Rpb246On5GdW5jdGlvbigpIHsKfQoKRnVuY3Rpb24gKkZ1bmN0aW9uOjpwYXJzZShPYmplY3QgKmZ1bmNPYmopIHsKICBzdGQ6OnNldDxpbnQ+IHVzZWRQYXJlbnRzOwogIHJldHVybiBwYXJzZShmdW5jT2JqLCAmdXNlZFBhcmVudHMpOwp9CgpGdW5jdGlvbiAqRnVuY3Rpb246OnBhcnNlKE9iamVjdCAqZnVuY09iaiwgc3RkOjpzZXQ8aW50PiAqdXNlZFBhcmVudHMpIHsKICBGdW5jdGlvbiAqZnVuYzsKICBEaWN0ICpkaWN0OwogIGludCBmdW5jVHlwZTsKCiAgaWYgKGZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGRpY3QgPSBmdW5jT2JqLT5zdHJlYW1HZXREaWN0KCk7CiAgfSBlbHNlIGlmIChmdW5jT2JqLT5pc0RpY3QoKSkgewogICAgZGljdCA9IGZ1bmNPYmotPmdldERpY3QoKTsKICB9IGVsc2UgaWYgKGZ1bmNPYmotPmlzTmFtZSgiSWRlbnRpdHkiKSkgewogICAgcmV0dXJuIG5ldyBJZGVudGl0eUZ1bmN0aW9uKCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cGVjdGVkIGZ1bmN0aW9uIGRpY3Rpb25hcnkgb3Igc3RyZWFtIik7CiAgICByZXR1cm4gbnVsbHB0cjsKICB9CgogIE9iamVjdCBvYmoxID0gZGljdC0+bG9va3VwKCJGdW5jdGlvblR5cGUiKTsKICBpZiAoIW9iajEuaXNJbnQoKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gdHlwZSBpcyBtaXNzaW5nIG9yIHdyb25nIHR5cGUiKTsKICAgIHJldHVybiBudWxscHRyOwogIH0KICBmdW5jVHlwZSA9IG9iajEuZ2V0SW50KCk7CgogIGlmIChmdW5jVHlwZSA9PSAwKSB7CiAgICBmdW5jID0gbmV3IFNhbXBsZWRGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDIpIHsKICAgIGZ1bmMgPSBuZXcgRXhwb25lbnRpYWxGdW5jdGlvbihmdW5jT2JqLCBkaWN0KTsKICB9IGVsc2UgaWYgKGZ1bmNUeXBlID09IDMpIHsKICAgIGZ1bmMgPSBuZXcgU3RpdGNoaW5nRnVuY3Rpb24oZnVuY09iaiwgZGljdCwgdXNlZFBhcmVudHMpOwogIH0gZWxzZSBpZiAoZnVuY1R5cGUgPT0gNCkgewogICAgZnVuYyA9IG5ldyBQb3N0U2NyaXB0RnVuY3Rpb24oZnVuY09iaiwgZGljdCk7CiAgfSBlbHNlIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gdHlwZSAoezA6ZH0pIiwgZnVuY1R5cGUpOwogICAgcmV0dXJuIG51bGxwdHI7CiAgfQogIGlmICghZnVuYy0+aXNPaygpKSB7CiAgICBkZWxldGUgZnVuYzsKICAgIHJldHVybiBudWxscHRyOwogIH0KCiAgcmV0dXJuIGZ1bmM7Cn0KCkZ1bmN0aW9uOjpGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAqZnVuYykgewogICAgbSA9IGZ1bmMtPm07CiAgICBuID0gZnVuYy0+bjsKCiAgICBtZW1jcHkoZG9tYWluLCBmdW5jLT5kb21haW4sIGZ1bmNNYXhJbnB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwogICAgbWVtY3B5KHJhbmdlLCBmdW5jLT5yYW5nZSwgZnVuY01heE91dHB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwoKICAgIGhhc1JhbmdlID0gZnVuYy0+aGFzUmFuZ2U7Cn0KCmJvb2wgRnVuY3Rpb246OmluaXQoRGljdCAqZGljdCkgewogIE9iamVjdCBvYmoxOwogIGludCBpOwoKICAvLy0tLS0tIERvbWFpbgogIG9iajEgPSBkaWN0LT5sb29rdXAoIkRvbWFpbiIpOwogIGlmICghb2JqMS5pc0FycmF5KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGlzIG1pc3NpbmcgZG9tYWluIik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIG0gPSBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgLyAyOwogIGlmIChtID4gZnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IGlucHV0cyBhcmUgdW5zdXBwb3J0ZWQiLAoJICBmdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRvbWFpbiBhcnJheSIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBkb21haW5baV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoMippKzEpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCB2YWx1ZSBpbiBmdW5jdGlvbiBkb21haW4gYXJyYXkiKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgZG9tYWluW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICB9CgogIC8vLS0tLS0gUmFuZ2UKICBoYXNSYW5nZSA9IGZhbHNlOwogIG4gPSAwOwogIG9iajEgPSBkaWN0LT5sb29rdXAoIlJhbmdlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpKSB7CiAgICBoYXNSYW5nZSA9IHRydWU7CiAgICBuID0gb2JqMS5hcnJheUdldExlbmd0aCgpIC8gMjsKICAgIGlmIChuID4gZnVuY01heE91dHB1dHMpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb25zIHdpdGggbW9yZSB0aGFuIHswOmR9IG91dHB1dHMgYXJlIHVuc3VwcG9ydGVkIiwKCSAgICBmdW5jTWF4T3V0cHV0cyk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMF0gPSBvYmoyLmdldE51bSgpOwogICAgICBvYmoyID0gb2JqMS5hcnJheUdldCgyKmkrMSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIHJhbmdlIGFycmF5Iik7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmFuZ2VbaV1bMV0gPSBvYmoyLmdldE51bSgpOwogICAgfQogIH0KCiAgcmV0dXJuIHRydWU7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIElkZW50aXR5RnVuY3Rpb24KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklkZW50aXR5RnVuY3Rpb246OklkZW50aXR5RnVuY3Rpb24oKSB7CiAgaW50IGk7CgogIC8vIGZpbGwgdGhlc2UgaW4gd2l0aCBhcmJpdHJhcnkgdmFsdWVzIGp1c3QgaW4gY2FzZSB0aGV5IGdldCB1c2VkCiAgLy8gc29tZXdoZXJlCiAgbSA9IGZ1bmNNYXhJbnB1dHM7CiAgbiA9IGZ1bmNNYXhPdXRwdXRzOwogIGZvciAoaSA9IDA7IGkgPCBmdW5jTWF4SW5wdXRzOyArK2kpIHsKICAgIGRvbWFpbltpXVswXSA9IDA7CiAgICBkb21haW5baV1bMV0gPSAxOwogIH0KICBoYXNSYW5nZSA9IGZhbHNlOwp9CgpJZGVudGl0eUZ1bmN0aW9uOjp+SWRlbnRpdHlGdW5jdGlvbigpIHsKfQoKdm9pZCBJZGVudGl0eUZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IGZ1bmNNYXhPdXRwdXRzOyArK2kpIHsKICAgIG91dFtpXSA9IGluW2ldOwogIH0KfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2FtcGxlZEZ1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBTdHJlYW0gKnN0cjsKICBpbnQgc2FtcGxlQml0czsKICBkb3VibGUgc2FtcGxlTXVsOwogIE9iamVjdCBvYmoxOwogIHVuc2lnbmVkIGludCBidWYsIGJpdE1hc2s7CiAgaW50IGJpdHM7CiAgdW5zaWduZWQgaW50IHM7CiAgZG91YmxlIGluW2Z1bmNNYXhJbnB1dHNdOwogIGludCBpLCBqLCB0LCBiaXQsIGlkeDsKCiAgaWR4T2Zmc2V0ID0gbnVsbHB0cjsKICBzYW1wbGVzID0gbnVsbHB0cjsKICBzQnVmID0gbnVsbHB0cjsKICBvayA9IGZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gPiBzYW1wbGVkRnVuY01heElucHV0cykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU2FtcGxlZCBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gezA6ZH0gaW5wdXRzIGFyZSB1bnN1cHBvcnRlZCIsCgkgIHNhbXBsZWRGdW5jTWF4SW5wdXRzKTsKICAgIHJldHVybjsKICB9CgogIC8vLS0tLS0gYnVmZmVyCiAgc0J1ZiA9IChkb3VibGUgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihkb3VibGUpKTsKCiAgLy8tLS0tLSBnZXQgdGhlIHN0cmVhbQogIGlmICghZnVuY09iai0+aXNTdHJlYW0oKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSAwIGZ1bmN0aW9uIGlzbid0IGEgc3RyZWFtIik7CiAgICByZXR1cm47CiAgfQogIHN0ciA9IGZ1bmNPYmotPmdldFN0cmVhbSgpOwoKICAvLy0tLS0tIFNpemUKICBvYmoxID0gZGljdC0+bG9va3VwKCJTaXplIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBzaXplIGFycmF5Iik7CiAgICByZXR1cm47CiAgfQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgIGlmICghb2JqMi5pc0ludCgpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBzYW1wbGVTaXplW2ldID0gb2JqMi5nZXRJbnQoKTsKICAgIGlmIChzYW1wbGVTaXplW2ldIDw9IDApIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSWxsZWdhbCBub24tcG9zaXRpdmUgdmFsdWUgaW4gZnVuY3Rpb24gc2l6ZSBhcnJheSIpOwogICAgICByZXR1cm47CiAgICB9CiAgfQogIGlkeE9mZnNldCA9IChpbnQgKilnbWFsbG9jbigxIDw8IG0sIHNpemVvZihpbnQpKTsKICBmb3IgKGkgPSAwOyBpIDwgKDE8PG0pOyArK2kpIHsKICAgIGlkeCA9IDA7CiAgICBmb3IgKGogPSBtIC0gMSwgdCA9IGk7IGogPj0gMTsgLS1qLCB0IDw8PSAxKSB7CiAgICAgIGlmIChzYW1wbGVTaXplW2pdID09IDEpIHsKCWJpdCA9IDA7CiAgICAgIH0gZWxzZSB7CgliaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICAgIH0KICAgICAgaWR4ID0gKGlkeCArIGJpdCkgKiBzYW1wbGVTaXplW2otMV07CiAgICB9CiAgICBpZiAobSA+IDAgJiYgc2FtcGxlU2l6ZVswXSA9PSAxKSB7CiAgICAgIGJpdCA9IDA7CiAgICB9IGVsc2UgewogICAgICBiaXQgPSAodCA+PiAobSAtIDEpKSAmIDE7CiAgICB9CiAgICBpZHhPZmZzZXRbaV0gPSAoaWR4ICsgYml0KSAqIG47CiAgfQoKICAvLy0tLS0tIEJpdHNQZXJTYW1wbGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJCaXRzUGVyU2FtcGxlIik7CiAgaWYgKCFvYmoxLmlzSW50KCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uIGhhcyBtaXNzaW5nIG9yIGludmFsaWQgQml0c1BlclNhbXBsZSIpOwogICAgcmV0dXJuOwogIH0KICBzYW1wbGVCaXRzID0gb2JqMS5nZXRJbnQoKTsKICBpZiAodW5saWtlbHkoc2FtcGxlQml0cyA8IDEgfHwgc2FtcGxlQml0cyA+IDMyKSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24gaW52YWxpZCBCaXRzUGVyU2FtcGxlIik7CiAgICByZXR1cm47CiAgfQogIHNhbXBsZU11bCA9IDEuMCAvIChwb3coMi4wLCAoZG91YmxlKXNhbXBsZUJpdHMpIC0gMSk7CgogIC8vLS0tLS0gRW5jb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRW5jb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm0pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGVuY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGVuY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZW5jb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZW5jb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgICBlbmNvZGVbaV1bMF0gPSAwOwogICAgICBlbmNvZGVbaV1bMV0gPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICB9CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKHVubGlrZWx5KChkb21haW5baV1bMV0gLSBkb21haW5baV1bMF0pID09IDApKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZG9tYWluIGFycmF5Iik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlucHV0TXVsW2ldID0gKGVuY29kZVtpXVsxXSAtIGVuY29kZVtpXVswXSkgLwogICAgICAgICAgICAgICAgICAoZG9tYWluW2ldWzFdIC0gZG9tYWluW2ldWzBdKTsKICB9CgogIC8vLS0tLS0gRGVjb2RlCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiRGVjb2RlIik7CiAgaWYgKG9iajEuaXNBcnJheSgpICYmCiAgICAgIG9iajEuYXJyYXlHZXRMZW5ndGgoKSA9PSAyKm4pIHsKICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIGRlY29kZSBhcnJheSIpOwoJcmV0dXJuOwogICAgICB9CiAgICAgIGRlY29kZVtpXVswXSA9IG9iajIuZ2V0TnVtKCk7CiAgICAgIG9iajIgPSBvYmoxLmFycmF5R2V0KDIqaSsxKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gZGVjb2RlIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgZGVjb2RlW2ldWzFdID0gb2JqMi5nZXROdW0oKTsKICAgIH0KICB9IGVsc2UgewogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICBkZWNvZGVbaV1bMF0gPSByYW5nZVtpXVswXTsKICAgICAgZGVjb2RlW2ldWzFdID0gcmFuZ2VbaV1bMV07CiAgICB9CiAgfQoKICAvLy0tLS0tIHNhbXBsZXMKICBuU2FtcGxlcyA9IG47CiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkKICAgIG5TYW1wbGVzICo9IHNhbXBsZVNpemVbaV07CiAgc2FtcGxlcyA9IChkb3VibGUgKilnbWFsbG9jbl9jaGVja292ZXJmbG93KG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgaWYgKCFzYW1wbGVzKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgaW52YWxpZCBudW1iZXIgb2Ygc2FtcGxlcyIpOwogICAgcmV0dXJuOwogIH0KICBidWYgPSAwOwogIGJpdHMgPSAwOwogIGJpdE1hc2sgPSAoMSA8PCBzYW1wbGVCaXRzKSAtIDE7CiAgc3RyLT5yZXNldCgpOwogIGZvciAoaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICBpZiAoc2FtcGxlQml0cyA9PSA4KSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSBpZiAoc2FtcGxlQml0cyA9PSAxNikgewogICAgICBzID0gc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgfSBlbHNlIGlmIChzYW1wbGVCaXRzID09IDMyKSB7CiAgICAgIHMgPSBzdHItPmdldENoYXIoKTsKICAgICAgcyA9IChzIDw8IDgpICsgc3RyLT5nZXRDaGFyKCk7CiAgICAgIHMgPSAocyA8PCA4KSArIHN0ci0+Z2V0Q2hhcigpOwogICAgICBzID0gKHMgPDwgOCkgKyBzdHItPmdldENoYXIoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdoaWxlIChiaXRzIDwgc2FtcGxlQml0cykgewoJYnVmID0gKGJ1ZiA8PCA4KSB8IChzdHItPmdldENoYXIoKSAmIDB4ZmYpOwoJYml0cyArPSA4OwogICAgICB9CiAgICAgIHMgPSAoYnVmID4+IChiaXRzIC0gc2FtcGxlQml0cykpICYgYml0TWFzazsKICAgICAgYml0cyAtPSBzYW1wbGVCaXRzOwogICAgfQogICAgc2FtcGxlc1tpXSA9IChkb3VibGUpcyAqIHNhbXBsZU11bDsKICB9CiAgc3RyLT5jbG9zZSgpOwoKICAvLyBzZXQgdXAgdGhlIGNhY2hlCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgaW5baV0gPSBkb21haW5baV1bMF07CiAgICBjYWNoZUluW2ldID0gaW5baV0gLSAxOwogIH0KICB0cmFuc2Zvcm0oaW4sIGNhY2hlT3V0KTsKCiAgb2sgPSB0cnVlOwp9CgpTYW1wbGVkRnVuY3Rpb246On5TYW1wbGVkRnVuY3Rpb24oKSB7CiAgaWYgKGlkeE9mZnNldCkgewogICAgZ2ZyZWUoaWR4T2Zmc2V0KTsKICB9CiAgaWYgKHNhbXBsZXMpIHsKICAgIGdmcmVlKHNhbXBsZXMpOwogIH0KICBpZiAoc0J1ZikgewogICAgZ2ZyZWUoc0J1Zik7CiAgfQp9CgpTYW1wbGVkRnVuY3Rpb246OlNhbXBsZWRGdW5jdGlvbihjb25zdCBTYW1wbGVkRnVuY3Rpb24gKmZ1bmMpIDogRnVuY3Rpb24oZnVuYykgewogIG1lbWNweShzYW1wbGVTaXplLCBmdW5jLT5zYW1wbGVTaXplLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGludCkpOwoKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIGZ1bmNNYXhJbnB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwogIG1lbWNweShkZWNvZGUsIGZ1bmMtPmRlY29kZSwgZnVuY01heE91dHB1dHMgKiAyICogc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoaW5wdXRNdWwsIGZ1bmMtPmlucHV0TXVsLCBmdW5jTWF4SW5wdXRzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBuU2FtcGxlcyA9IGZ1bmMtPm5TYW1wbGVzOwoKICBpZHhPZmZzZXQgPSAoaW50ICopZ21hbGxvY24oMSA8PCBtLCBzaXplb2YoaW50KSk7CiAgbWVtY3B5KGlkeE9mZnNldCwgZnVuYy0+aWR4T2Zmc2V0LCAoMSA8PCBtKSAqIChpbnQpc2l6ZW9mKGludCkpOwoKICBzYW1wbGVzID0gKGRvdWJsZSAqKWdtYWxsb2NuKG5TYW1wbGVzLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KHNhbXBsZXMsIGZ1bmMtPnNhbXBsZXMsIG5TYW1wbGVzICogc2l6ZW9mKGRvdWJsZSkpOwoKICBzQnVmID0gKGRvdWJsZSAqKWdtYWxsb2NuKDEgPDwgbSwgc2l6ZW9mKGRvdWJsZSkpOwoKICBtZW1jcHkoY2FjaGVJbiwgZnVuYy0+Y2FjaGVJbiwgZnVuY01heElucHV0cyAqIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoY2FjaGVPdXQsIGZ1bmMtPmNhY2hlT3V0LCBmdW5jTWF4T3V0cHV0cyAqIHNpemVvZihkb3VibGUpKTsKCiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBTYW1wbGVkRnVuY3Rpb246OnRyYW5zZm9ybShjb25zdCBkb3VibGUgKmluLCBkb3VibGUgKm91dCkgY29uc3QgewogIGRvdWJsZSB4OwogIGludCBlW2Z1bmNNYXhJbnB1dHNdOwogIGRvdWJsZSBlZnJhYzBbZnVuY01heElucHV0c107CiAgZG91YmxlIGVmcmFjMVtmdW5jTWF4SW5wdXRzXTsKCiAgLy8gY2hlY2sgdGhlIGNhY2hlCiAgYm9vbCBpbkNhY2hlID0gdHJ1ZTsKICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewogICAgaWYgKGluW2ldICE9IGNhY2hlSW5baV0pIHsKICAgICAgaW5DYWNoZSA9IGZhbHNlOwogICAgICBicmVhazsKICAgIH0KICB9CiAgaWYgKGluQ2FjaGUpIHsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgLy8gbWFwIGlucHV0IHZhbHVlcyBpbnRvIHNhbXBsZSBhcnJheQogIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICB4ID0gKGluW2ldIC0gZG9tYWluW2ldWzBdKSAqIGlucHV0TXVsW2ldICsgZW5jb2RlW2ldWzBdOwogICAgaWYgKHggPCAwIHx8IHggIT0geCkgeyAgLy8geCE9eCBpcyBhIG1vcmUgcG9ydGFibGUgdmVyc2lvbiBvZiBpc25hbih4KQogICAgICB4ID0gMDsKICAgIH0gZWxzZSBpZiAoeCA+IHNhbXBsZVNpemVbaV0gLSAxKSB7CiAgICAgIHggPSBzYW1wbGVTaXplW2ldIC0gMTsKICAgIH0KICAgIGVbaV0gPSAoaW50KXg7CiAgICBpZiAoZVtpXSA9PSBzYW1wbGVTaXplW2ldIC0gMSAmJiBzYW1wbGVTaXplW2ldID4gMSkgewogICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgaW5baV0gPSBkb21haW5baV1bMV0KICAgICAgZVtpXSA9IHNhbXBsZVNpemVbaV0gLSAyOwogICAgfQogICAgZWZyYWMxW2ldID0geCAtIGVbaV07CiAgICBlZnJhYzBbaV0gPSAxIC0gZWZyYWMxW2ldOwogIH0KCiAgLy8gY29tcHV0ZSBpbmRleCBmb3IgdGhlIGZpcnN0IHNhbXBsZSB0byBiZSB1c2VkCiAgaW50IGlkeDAgPSAwOwogIGZvciAoaW50IGsgPSBtIC0gMTsgayA+PSAxOyAtLWspIHsKICAgIGlkeDAgPSAoaWR4MCArIGVba10pICogc2FtcGxlU2l6ZVtrLTFdOwogIH0KICBpZHgwID0gKGlkeDAgKyBlWzBdKSAqIG47CgogIC8vIGZvciBlYWNoIG91dHB1dCwgZG8gbS1saW5lYXIgaW50ZXJwb2xhdGlvbgogIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CgogICAgLy8gcHVsbCAyXm0gdmFsdWVzIG91dCBvZiB0aGUgc2FtcGxlIGFycmF5CiAgICBmb3IgKGludCBqID0gMDsgaiA8ICgxPDxtKTsgKytqKSB7CiAgICAgIGludCBpZHggPSBpZHgwICsgaWR4T2Zmc2V0W2pdICsgaTsKICAgICAgaWYgKGxpa2VseShpZHggPj0gMCAmJiBpZHggPCBuU2FtcGxlcykpIHsKICAgICAgICBzQnVmW2pdID0gc2FtcGxlc1tpZHhdOwogICAgICB9IGVsc2UgewogICAgICAgIHNCdWZbal0gPSAwOyAvLyBUT0RPIEludmVzdGlnYXRlIGlmIHRoaXMgaXMgd2hhdCBBZG9iZSBkb2VzCiAgICAgIH0KICAgIH0KCiAgICAvLyBkbyBtIHNldHMgb2YgaW50ZXJwb2xhdGlvbnMKICAgIGZvciAoaW50IGogPSAwLCB0ID0gKDE8PG0pOyBqIDwgbTsgKytqLCB0ID4+PSAxKSB7CiAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdDsgayArPSAyKSB7CglzQnVmW2sgPj4gMV0gPSBlZnJhYzBbal0gKiBzQnVmW2tdICsgZWZyYWMxW2pdICogc0J1ZltrKzFdOwogICAgICB9CiAgICB9CgogICAgLy8gbWFwIG91dHB1dCB2YWx1ZSB0byByYW5nZQogICAgb3V0W2ldID0gc0J1ZlswXSAqIChkZWNvZGVbaV1bMV0gLSBkZWNvZGVbaV1bMF0pICsgZGVjb2RlW2ldWzBdOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CgogIC8vIHNhdmUgY3VycmVudCByZXN1bHQgaW4gdGhlIGNhY2hlCiAgZm9yIChpbnQgaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgIGNhY2hlT3V0W2ldID0gb3V0W2ldOwogIH0KfQoKYm9vbCBTYW1wbGVkRnVuY3Rpb246Omhhc0RpZmZlcmVudFJlc3VsdFNldChjb25zdCBGdW5jdGlvbiAqZnVuYykgY29uc3QgewogIGlmIChmdW5jLT5nZXRUeXBlKCkgPT0gMCkgewogICAgU2FtcGxlZEZ1bmN0aW9uICpjb21wVG8gPSAoU2FtcGxlZEZ1bmN0aW9uICopIGZ1bmM7CiAgICBpZiAoY29tcFRvLT5nZXRTYW1wbGVOdW1iZXIoKSAhPSBuU2FtcGxlcykKICAgICAgcmV0dXJuIHRydWU7CiAgICBjb25zdCBkb3VibGUgKmNvbXBTYW1wbGVzID0gY29tcFRvLT5nZXRTYW1wbGVzKCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TYW1wbGVzOyBpKyspIHsKICAgICAgaWYgKHNhbXBsZXNbaV0gIT0gY29tcFNhbXBsZXNbaV0pCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgfQogIHJldHVybiBmYWxzZTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gRXhwb25lbnRpYWxGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6RXhwb25lbnRpYWxGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBPYmplY3Qgb2JqMTsKCiAgb2sgPSBmYWxzZTsKCiAgLy8tLS0tLSBpbml0aWFsaXplIHRoZSBnZW5lcmljIHN0dWZmCiAgaWYgKCFpbml0KGRpY3QpKSB7CiAgICByZXR1cm47CiAgfQogIGlmIChtICE9IDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkV4cG9uZW50aWFsIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgcmV0dXJuOwogIH0KCiAgLy8tLS0tLSBDMAogIG9iajEgPSBkaWN0LT5sb29rdXAoIkMwIik7CiAgaWYgKG9iajEuaXNBcnJheSgpKSB7CiAgICBpZiAoaGFzUmFuZ2UgJiYgb2JqMS5hcnJheUdldExlbmd0aCgpICE9IG4pIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbiA9IG9iajEuYXJyYXlHZXRMZW5ndGgoKTsKICAgIGlmICh1bmxpa2VseShuID4gZnVuY01heE91dHB1dHMpKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzAgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIG4gPSBmdW5jTWF4T3V0cHV0czsKICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpKTsKICAgICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIklsbGVnYWwgdmFsdWUgaW4gZnVuY3Rpb24gQzAgYXJyYXkiKTsKCXJldHVybjsKICAgICAgfQogICAgICBjMFtpXSA9IG9iajIuZ2V0TnVtKCk7CiAgICB9CiAgfSBlbHNlIHsKICAgIGlmIChoYXNSYW5nZSAmJiBuICE9IDEpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiRnVuY3Rpb24ncyBDMCBhcnJheSBpcyB3cm9uZyBsZW5ndGgiKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgbiA9IDE7CiAgICBjMFswXSA9IDA7CiAgfQoKICAvLy0tLS0tIEMxCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiQzEiKTsKICBpZiAob2JqMS5pc0FycmF5KCkpIHsKICAgIGlmIChvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gbikgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbidzIEMxIGFycmF5IGlzIHdyb25nIGxlbmd0aCIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICBPYmplY3Qgb2JqMiA9IG9iajEuYXJyYXlHZXQoaSk7CiAgICAgIGlmICghb2JqMi5pc051bSgpKSB7CgllcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbGxlZ2FsIHZhbHVlIGluIGZ1bmN0aW9uIEMxIGFycmF5Iik7CglyZXR1cm47CiAgICAgIH0KICAgICAgYzFbaV0gPSBvYmoyLmdldE51bSgpOwogICAgfQogIH0gZWxzZSB7CiAgICBpZiAobiAhPSAxKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIkZ1bmN0aW9uJ3MgQzEgYXJyYXkgaXMgd3JvbmcgbGVuZ3RoIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGMxWzBdID0gMTsKICB9CgogIC8vLS0tLS0gTiAoZXhwb25lbnQpCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiTiIpOwogIGlmICghb2JqMS5pc051bSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJGdW5jdGlvbiBoYXMgbWlzc2luZyBvciBpbnZhbGlkIE4iKTsKICAgIHJldHVybjsKICB9CiAgZSA9IG9iajEuZ2V0TnVtKCk7CgogIGlzTGluZWFyID0gZmFicyhlLTEuKSA8IDFlLTEwOwogIG9rID0gdHJ1ZTsKfQoKRXhwb25lbnRpYWxGdW5jdGlvbjo6fkV4cG9uZW50aWFsRnVuY3Rpb24oKSB7Cn0KCkV4cG9uZW50aWFsRnVuY3Rpb246OkV4cG9uZW50aWFsRnVuY3Rpb24oY29uc3QgRXhwb25lbnRpYWxGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgbWVtY3B5KGMwLCBmdW5jLT5jMCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGMxLCBmdW5jLT5jMSwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIGUgPSBmdW5jLT5lOwogIGlzTGluZWFyID0gZnVuYy0+aXNMaW5lYXI7CiAgb2sgPSBmdW5jLT5vazsKfQoKdm9pZCBFeHBvbmVudGlhbEZ1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgb3V0W2ldID0gYzBbaV0gKyAoaXNMaW5lYXIgPyB4IDogcG93KHgsIGUpKSAqIChjMVtpXSAtIGMwW2ldKTsKICAgIGlmIChoYXNSYW5nZSkgewogICAgICBpZiAob3V0W2ldIDwgcmFuZ2VbaV1bMF0pIHsKCW91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgICB9IGVsc2UgaWYgKG91dFtpXSA+IHJhbmdlW2ldWzFdKSB7CglvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgICAgfQogICAgfQogIH0KICByZXR1cm47Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0aXRjaGluZ0Z1bmN0aW9uCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTdGl0Y2hpbmdGdW5jdGlvbjo6U3RpdGNoaW5nRnVuY3Rpb24oT2JqZWN0ICpmdW5jT2JqLCBEaWN0ICpkaWN0LCBzdGQ6OnNldDxpbnQ+ICp1c2VkUGFyZW50cykgewogIE9iamVjdCBvYmoxOwogIGludCBpOwoKICBvayA9IGZhbHNlOwogIGZ1bmNzID0gbnVsbHB0cjsKICBib3VuZHMgPSBudWxscHRyOwogIGVuY29kZSA9IG51bGxwdHI7CiAgc2NhbGUgPSBudWxscHRyOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKG0gIT0gMSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiU3RpdGNoaW5nIGZ1bmN0aW9uIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCIpOwogICAgcmV0dXJuOwogIH0KCiAgLy8tLS0tLSBGdW5jdGlvbnMKICBvYmoxID0gZGljdC0+bG9va3VwKCJGdW5jdGlvbnMiKTsKICBpZiAoIW9iajEuaXNBcnJheSgpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJNaXNzaW5nICdGdW5jdGlvbnMnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBrID0gb2JqMS5hcnJheUdldExlbmd0aCgpOwogIGZ1bmNzID0gKEZ1bmN0aW9uICoqKWdtYWxsb2NuKGssIHNpemVvZihGdW5jdGlvbiAqKSk7CiAgYm91bmRzID0gKGRvdWJsZSAqKWdtYWxsb2NuKGsgKyAxLCBzaXplb2YoZG91YmxlKSk7CiAgZW5jb2RlID0gKGRvdWJsZSAqKWdtYWxsb2NuKDIgKiBrLCBzaXplb2YoZG91YmxlKSk7CiAgc2NhbGUgPSAoZG91YmxlICopZ21hbGxvY24oaywgc2l6ZW9mKGRvdWJsZSkpOwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGZ1bmNzW2ldID0gbnVsbHB0cjsKICB9CiAgZm9yIChpID0gMDsgaSA8IGs7ICsraSkgewogICAgc3RkOjpzZXQ8aW50PiB1c2VkUGFyZW50c0F1eCA9ICp1c2VkUGFyZW50czsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldE5GKGkpOwogICAgaWYgKG9iajIuaXNSZWYoKSkgewogICAgICBjb25zdCBSZWYgcmVmID0gb2JqMi5nZXRSZWYoKTsKICAgICAgaWYgKHVzZWRQYXJlbnRzQXV4LmZpbmQocmVmLm51bSkgPT0gdXNlZFBhcmVudHNBdXguZW5kKCkpIHsKICAgICAgICB1c2VkUGFyZW50c0F1eC5pbnNlcnQocmVmLm51bSk7CiAgICAgICAgb2JqMiA9IG9iajEuYXJyYXlHZXQoaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgICBpZiAoIShmdW5jc1tpXSA9IEZ1bmN0aW9uOjpwYXJzZSgmb2JqMiwgJnVzZWRQYXJlbnRzQXV4KSkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGZ1bmNzW2ldLT5nZXRJbnB1dFNpemUoKSAhPSAxIHx8CgkoaSA+IDAgJiYgZnVuY3NbaV0tPmdldE91dHB1dFNpemUoKSAhPSBmdW5jc1swXS0+Z2V0T3V0cHV0U2l6ZSgpKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkgICAgIkluY29tcGF0aWJsZSBzdWJmdW5jdGlvbnMgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICB9CgogIC8vLS0tLS0gQm91bmRzCiAgb2JqMSA9IGRpY3QtPmxvb2t1cCgiQm91bmRzIik7CiAgaWYgKCFvYmoxLmlzQXJyYXkoKSB8fCBvYmoxLmFycmF5R2V0TGVuZ3RoKCkgIT0gayAtIDEpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIk1pc3Npbmcgb3IgaW52YWxpZCAnQm91bmRzJyBlbnRyeSBpbiBzdGl0Y2hpbmcgZnVuY3Rpb24iKTsKICAgIHJldHVybjsKICB9CiAgYm91bmRzWzBdID0gZG9tYWluWzBdWzBdOwogIGZvciAoaSA9IDE7IGkgPCBrOyArK2kpIHsKICAgIE9iamVjdCBvYmoyID0gb2JqMS5hcnJheUdldChpIC0gMSk7CiAgICBpZiAoIW9iajIuaXNOdW0oKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJJbnZhbGlkIHR5cGUgaW4gJ0JvdW5kcycgYXJyYXkgaW4gc3RpdGNoaW5nIGZ1bmN0aW9uIik7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGJvdW5kc1tpXSA9IG9iajIuZ2V0TnVtKCk7CiAgfQogIGJvdW5kc1trXSA9IGRvbWFpblswXVsxXTsKCiAgLy8tLS0tLSBFbmNvZGUKICBvYmoxID0gZGljdC0+bG9va3VwKCJFbmNvZGUiKTsKICBpZiAoIW9iajEuaXNBcnJheSgpIHx8IG9iajEuYXJyYXlHZXRMZW5ndGgoKSAhPSAyICogaykgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiTWlzc2luZyBvciBpbnZhbGlkICdFbmNvZGUnIGVudHJ5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBmb3IgKGkgPSAwOyBpIDwgMiAqIGs7ICsraSkgewogICAgT2JqZWN0IG9iajIgPSBvYmoxLmFycmF5R2V0KGkpOwogICAgaWYgKCFvYmoyLmlzTnVtKCkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW52YWxpZCB0eXBlIGluICdFbmNvZGUnIGFycmF5IGluIHN0aXRjaGluZyBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBlbmNvZGVbaV0gPSBvYmoyLmdldE51bSgpOwogIH0KCiAgLy8tLS0tLSBwcmUtY29tcHV0ZSB0aGUgc2NhbGUgZmFjdG9ycwogIGZvciAoaSA9IDA7IGkgPCBrOyArK2kpIHsKICAgIGlmIChib3VuZHNbaV0gPT0gYm91bmRzW2krMV0pIHsKICAgICAgLy8gYXZvaWQgYSBkaXZpZGUtYnktemVybyAtLSBpbiB0aGlzIHNpdHVhdGlvbiwgZnVuY3Rpb24gaSB3aWxsCiAgICAgIC8vIG5ldmVyIGJlIHVzZWQgYW55d2F5CiAgICAgIHNjYWxlW2ldID0gMDsKICAgIH0gZWxzZSB7CiAgICAgIHNjYWxlW2ldID0gKGVuY29kZVsyKmkrMV0gLSBlbmNvZGVbMippXSkgLyAoYm91bmRzW2krMV0gLSBib3VuZHNbaV0pOwogICAgfQogIH0KCiAgbiA9IGZ1bmNzWzBdLT5nZXRPdXRwdXRTaXplKCk7CiAgb2sgPSB0cnVlOwogIHJldHVybjsKfQoKU3RpdGNoaW5nRnVuY3Rpb246OlN0aXRjaGluZ0Z1bmN0aW9uKGNvbnN0IFN0aXRjaGluZ0Z1bmN0aW9uICpmdW5jKSA6IEZ1bmN0aW9uKGZ1bmMpIHsKICBrID0gZnVuYy0+azsKCiAgZnVuY3MgPSAoRnVuY3Rpb24gKiopZ21hbGxvY24oaywgc2l6ZW9mKEZ1bmN0aW9uICopKTsKICBmb3IgKGludCBpID0gMDsgaSA8IGs7ICsraSkgewogICAgZnVuY3NbaV0gPSBmdW5jLT5mdW5jc1tpXS0+Y29weSgpOwogIH0KCiAgYm91bmRzID0gKGRvdWJsZSAqKWdtYWxsb2NuKGsgKyAxLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGJvdW5kcywgZnVuYy0+Ym91bmRzLCAoayArIDEpICogc2l6ZW9mKGRvdWJsZSkpOwoKICBlbmNvZGUgPSAoZG91YmxlICopZ21hbGxvY24oMiAqIGssIHNpemVvZihkb3VibGUpKTsKICBtZW1jcHkoZW5jb2RlLCBmdW5jLT5lbmNvZGUsIDIgKiBrICogc2l6ZW9mKGRvdWJsZSkpOwoKICBzY2FsZSA9IChkb3VibGUgKilnbWFsbG9jbihrLCBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KHNjYWxlLCBmdW5jLT5zY2FsZSwgayAqIHNpemVvZihkb3VibGUpKTsKCiAgb2sgPSBmdW5jLT5vazsKfQoKU3RpdGNoaW5nRnVuY3Rpb246On5TdGl0Y2hpbmdGdW5jdGlvbigpIHsKICBpbnQgaTsKCiAgaWYgKGZ1bmNzKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgazsgKytpKSB7CiAgICAgIGlmIChmdW5jc1tpXSkgewoJZGVsZXRlIGZ1bmNzW2ldOwogICAgICB9CiAgICB9CiAgfQogIGdmcmVlKGZ1bmNzKTsKICBnZnJlZShib3VuZHMpOwogIGdmcmVlKGVuY29kZSk7CiAgZ2ZyZWUoc2NhbGUpOwp9Cgp2b2lkIFN0aXRjaGluZ0Z1bmN0aW9uOjp0cmFuc2Zvcm0oY29uc3QgZG91YmxlICppbiwgZG91YmxlICpvdXQpIGNvbnN0IHsKICBkb3VibGUgeDsKICBpbnQgaTsKCiAgaWYgKGluWzBdIDwgZG9tYWluWzBdWzBdKSB7CiAgICB4ID0gZG9tYWluWzBdWzBdOwogIH0gZWxzZSBpZiAoaW5bMF0gPiBkb21haW5bMF1bMV0pIHsKICAgIHggPSBkb21haW5bMF1bMV07CiAgfSBlbHNlIHsKICAgIHggPSBpblswXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IGsgLSAxOyArK2kpIHsKICAgIGlmICh4IDwgYm91bmRzW2krMV0pIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHggPSBlbmNvZGVbMippXSArICh4IC0gYm91bmRzW2ldKSAqIHNjYWxlW2ldOwogIGZ1bmNzW2ldLT50cmFuc2Zvcm0oJngsIG91dCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFBvc3RTY3JpcHRGdW5jdGlvbgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZW51bSBQU09wIHsKICBwc09wQWJzLAogIHBzT3BBZGQsCiAgcHNPcEFuZCwKICBwc09wQXRhbiwKICBwc09wQml0c2hpZnQsCiAgcHNPcENlaWxpbmcsCiAgcHNPcENvcHksCiAgcHNPcENvcywKICBwc09wQ3ZpLAogIHBzT3BDdnIsCiAgcHNPcERpdiwKICBwc09wRHVwLAogIHBzT3BFcSwKICBwc09wRXhjaCwKICBwc09wRXhwLAogIHBzT3BGYWxzZSwKICBwc09wRmxvb3IsCiAgcHNPcEdlLAogIHBzT3BHdCwKICBwc09wSWRpdiwKICBwc09wSW5kZXgsCiAgcHNPcExlLAogIHBzT3BMbiwKICBwc09wTG9nLAogIHBzT3BMdCwKICBwc09wTW9kLAogIHBzT3BNdWwsCiAgcHNPcE5lLAogIHBzT3BOZWcsCiAgcHNPcE5vdCwKICBwc09wT3IsCiAgcHNPcFBvcCwKICBwc09wUm9sbCwKICBwc09wUm91bmQsCiAgcHNPcFNpbiwKICBwc09wU3FydCwKICBwc09wU3ViLAogIHBzT3BUcnVlLAogIHBzT3BUcnVuY2F0ZSwKICBwc09wWG9yLAogIHBzT3BJZiwKICBwc09wSWZlbHNlLAogIHBzT3BSZXR1cm4KfTsKCi8vIE5vdGU6ICdpZicgYW5kICdpZmVsc2UnIGFyZSBwYXJzZWQgc2VwYXJhdGVseS4KLy8gVGhlIHJlc3QgYXJlIGxpc3RlZCBoZXJlIGluIGFscGhhYmV0aWNhbCBvcmRlci4KLy8gVGhlIGluZGV4IGluIHRoaXMgdGFibGUgaXMgZXF1aXZhbGVudCB0byB0aGUgZW50cnkgaW4gUFNPcC4Kc3RhdGljIGNvbnN0IGNoYXIgKnBzT3BOYW1lc1tdID0gewogICJhYnMiLAogICJhZGQiLAogICJhbmQiLAogICJhdGFuIiwKICAiYml0c2hpZnQiLAogICJjZWlsaW5nIiwKICAiY29weSIsCiAgImNvcyIsCiAgImN2aSIsCiAgImN2ciIsCiAgImRpdiIsCiAgImR1cCIsCiAgImVxIiwKICAiZXhjaCIsCiAgImV4cCIsCiAgImZhbHNlIiwKICAiZmxvb3IiLAogICJnZSIsCiAgImd0IiwKICAiaWRpdiIsCiAgImluZGV4IiwKICAibGUiLAogICJsbiIsCiAgImxvZyIsCiAgImx0IiwKICAibW9kIiwKICAibXVsIiwKICAibmUiLAogICJuZWciLAogICJub3QiLAogICJvciIsCiAgInBvcCIsCiAgInJvbGwiLAogICJyb3VuZCIsCiAgInNpbiIsCiAgInNxcnQiLAogICJzdWIiLAogICJ0cnVlIiwKICAidHJ1bmNhdGUiLAogICJ4b3IiCn07CgojZGVmaW5lIG5QU09wcyAoc2l6ZW9mKHBzT3BOYW1lcykgLyBzaXplb2YoY2hhciAqKSkKCmVudW0gUFNPYmplY3RUeXBlIHsKICBwc0Jvb2wsCiAgcHNJbnQsCiAgcHNSZWFsLAogIHBzT3BlcmF0b3IsCiAgcHNCbG9jawp9OwoKLy8gSW4gdGhlIGNvZGUgYXJyYXksICdpZicvJ2lmZWxzZScgb3BlcmF0b3JzIHRha2UgdXAgdGhyZWUgc2xvdHMKLy8gcGx1cyBzcGFjZSBmb3IgdGhlIGNvZGUgaW4gdGhlIHN1YmNsYXVzZShzKS4KLy8KLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcElmIC8gcHNPcElmZWxzZSB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgICAgICB8IHBzQmxvY2s6IHB0cj08QT4gICAgICAgICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICAgICAgfCBwc0Jsb2NrOiBwdHI9PEI+ICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwovLyAgICAgICAgIHwgaWYgY2xhdXNlICAgICAgICAgICAgICAgICAgICAgICB8Ci8vICAgICAgICAgfCAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IHBzT3BlcmF0b3I6IHBzT3BSZXR1cm4gICAgICAgICAgfAovLyAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCi8vICAgICA8QT4gfCBlbHNlIGNsYXVzZSAgICAgICAgICAgICAgICAgICAgIHwKLy8gICAgICAgICB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLyAgICAgICAgIHwgcHNPcGVyYXRvcjogcHNPcFJldHVybiAgICAgICAgICB8Ci8vICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKLy8gICAgIDxCPiB8IC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAovLwovLyBGb3IgJ2lmJywgcG9pbnRlciA8QT4gaXMgcHJlc2VudCBpbiB0aGUgY29kZSBzdHJlYW0gYnV0IHVudXNlZC4KCnN0cnVjdCBQU09iamVjdCB7CiAgUFNPYmplY3RUeXBlIHR5cGU7CiAgdW5pb24gewogICAgYm9vbCBib29sbjsJCS8vIGJvb2xlYW4gKHN0YWNrIG9ubHkpCiAgICBpbnQgaW50ZzsJCQkvLyBpbnRlZ2VyIChzdGFjayBhbmQgY29kZSkKICAgIGRvdWJsZSByZWFsOwkJLy8gcmVhbCAoc3RhY2sgYW5kIGNvZGUpCiAgICBQU09wIG9wOwkJCS8vIG9wZXJhdG9yIChjb2RlIG9ubHkpCiAgICBpbnQgYmxrOwkJCS8vIGlmL2lmZWxzZSBibG9jayBwb2ludGVyIChjb2RlIG9ubHkpCiAgfTsKfTsKCiNkZWZpbmUgcHNTdGFja1NpemUgMTAwCgpjbGFzcyBQU1N0YWNrIHsKcHVibGljOgoKICBQU1N0YWNrKCkge3NwID0gcHNTdGFja1NpemU7IH0KICB2b2lkIGNsZWFyKCkgeyBzcCA9IHBzU3RhY2tTaXplOyB9CiAgdm9pZCBwdXNoQm9vbChib29sIGJvb2xuKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzQm9vbDsKICAgICAgc3RhY2tbc3BdLmJvb2xuID0gYm9vbG47CiAgICB9CiAgfQogIHZvaWQgcHVzaEludChpbnQgaW50ZykKICB7CiAgICBpZiAoY2hlY2tPdmVyZmxvdygpKSB7CiAgICAgIHN0YWNrWy0tc3BdLnR5cGUgPSBwc0ludDsKICAgICAgc3RhY2tbc3BdLmludGcgPSBpbnRnOwogICAgfQogIH0KICB2b2lkIHB1c2hSZWFsKGRvdWJsZSByZWFsKQogIHsKICAgIGlmIChjaGVja092ZXJmbG93KCkpIHsKICAgICAgc3RhY2tbLS1zcF0udHlwZSA9IHBzUmVhbDsKICAgICAgc3RhY2tbc3BdLnJlYWwgPSByZWFsOwogICAgfQogIH0KICBib29sIHBvcEJvb2woKQogIHsKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0Jvb2wsIHBzQm9vbCkpIHsKICAgICAgcmV0dXJuIHN0YWNrW3NwKytdLmJvb2xuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpbnQgcG9wSW50KCkKICB7CiAgICBpZiAoY2hlY2tVbmRlcmZsb3coKSAmJiBjaGVja1R5cGUocHNJbnQsIHBzSW50KSkgewogICAgICByZXR1cm4gc3RhY2tbc3ArK10uaW50ZzsKICAgIH0KICAgIHJldHVybiAwOwogIH0KICBkb3VibGUgcG9wTnVtKCkKICB7CiAgICBkb3VibGUgcmV0OwoKICAgIGlmIChjaGVja1VuZGVyZmxvdygpICYmIGNoZWNrVHlwZShwc0ludCwgcHNSZWFsKSkgewogICAgICByZXQgPSAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQpID8gKGRvdWJsZSlzdGFja1tzcF0uaW50ZyA6IHN0YWNrW3NwXS5yZWFsOwogICAgICArK3NwOwogICAgICByZXR1cm4gcmV0OwogICAgfQogICAgcmV0dXJuIDA7CiAgfQogIGJvb2wgZW1wdHkoKSB7IHJldHVybiBzcCA9PSBwc1N0YWNrU2l6ZTsgfQogIGJvb2wgdG9wSXNJbnQoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzSW50OyB9CiAgYm9vbCB0b3BUd29BcmVJbnRzKCkKICAgIHsgcmV0dXJuIHNwIDwgcHNTdGFja1NpemUgLSAxICYmCgkgICAgIHN0YWNrW3NwXS50eXBlID09IHBzSW50ICYmCiAgICAgICAgICAgICBzdGFja1tzcCsxXS50eXBlID09IHBzSW50OyB9CiAgYm9vbCB0b3BJc1JlYWwoKSB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplICYmIHN0YWNrW3NwXS50eXBlID09IHBzUmVhbDsgfQogIGJvb2wgdG9wVHdvQXJlTnVtcygpCiAgICB7IHJldHVybiBzcCA8IHBzU3RhY2tTaXplIC0gMSAmJgoJICAgICAoc3RhY2tbc3BdLnR5cGUgPT0gcHNJbnQgfHwgc3RhY2tbc3BdLnR5cGUgPT0gcHNSZWFsKSAmJgoJICAgICAoc3RhY2tbc3ArMV0udHlwZSA9PSBwc0ludCB8fCBzdGFja1tzcCsxXS50eXBlID09IHBzUmVhbCk7IH0KICB2b2lkIGNvcHkoaW50IG4pOwogIHZvaWQgcm9sbChpbnQgbiwgaW50IGopOwogIHZvaWQgaW5kZXgoaW50IGkpCiAgewogICAgaWYgKCFjaGVja092ZXJmbG93KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLS1zcDsKICAgIGlmICh1bmxpa2VseShzcCArIGkgKyAxID49IHBzU3RhY2tTaXplKSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm47CiAgICB9CiAgICBpZiAodW5saWtlbHkoc3AgKyBpICsgMSA8IDApKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgc3RhY2tbc3BdID0gc3RhY2tbc3AgKyAxICsgaV07CiAgfQogIHZvaWQgcG9wKCkKICB7CiAgICBpZiAoIWNoZWNrVW5kZXJmbG93KCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgKytzcDsKICB9Cgpwcml2YXRlOgoKICBib29sIGNoZWNrT3ZlcmZsb3coaW50IG4gPSAxKQogIHsKICAgIGlmIChzcCAtIG4gPCAwKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlN0YWNrIG92ZXJmbG93IGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQogIGJvb2wgY2hlY2tVbmRlcmZsb3coKQogIHsKICAgIGlmIChzcCA9PSBwc1N0YWNrU2l6ZSkgewogICAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgYm9vbCBjaGVja1R5cGUoUFNPYmplY3RUeXBlIHQxLCBQU09iamVjdFR5cGUgdDIpCiAgewogICAgaWYgKHN0YWNrW3NwXS50eXBlICE9IHQxICYmIHN0YWNrW3NwXS50eXBlICE9IHQyKSB7CiAgICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgbWlzbWF0Y2ggaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgUFNPYmplY3Qgc3RhY2tbcHNTdGFja1NpemVdOwogIGludCBzcDsKfTsKCgp2b2lkIFBTU3RhY2s6OmNvcHkoaW50IG4pIHsKICBpbnQgaTsKCiAgaWYgKHNwICsgbiA+IHBzU3RhY2tTaXplKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBpZiAodW5saWtlbHkoc3AgLSBuID4gcHNTdGFja1NpemUpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJTdGFjayB1bmRlcmZsb3cgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIpOwogICAgcmV0dXJuOwogIH0KICBpZiAoIWNoZWNrT3ZlcmZsb3cobikpIHsKICAgIHJldHVybjsKICB9CiAgZm9yIChpID0gc3AgKyBuIC0gMTsgaSA+PSBzcDsgLS1pKSB7CiAgICBzdGFja1tpIC0gbl0gPSBzdGFja1tpXTsKICB9CiAgc3AgLT0gbjsKfQoKdm9pZCBQU1N0YWNrOjpyb2xsKGludCBuLCBpbnQgaikgewogIFBTT2JqZWN0IG9iajsKICBpbnQgaSwgazsKCiAgaWYgKHVubGlrZWx5KG4gPT0gMCkpIHsKICAgIHJldHVybjsKICB9CiAgaWYgKGogPj0gMCkgewogICAgaiAlPSBuOwogIH0gZWxzZSB7CiAgICBqID0gLWogJSBuOwogICAgaWYgKGogIT0gMCkgewogICAgICBqID0gbiAtIGo7CiAgICB9CiAgfQogIGlmIChuIDw9IDAgfHwgaiA9PSAwIHx8IG4gPiBwc1N0YWNrU2l6ZSB8fCBzcCArIG4gPiBwc1N0YWNrU2l6ZSkgewogICAgcmV0dXJuOwogIH0KICBpZiAoaiA8PSBuIC8gMikgewogICAgZm9yIChpID0gMDsgaSA8IGo7ICsraSkgewogICAgICBvYmogPSBzdGFja1tzcF07CiAgICAgIGZvciAoayA9IHNwOyBrIDwgc3AgKyBuIC0gMTsgKytrKSB7CiAgICAgICAgc3RhY2tba10gPSBzdGFja1trKzFdOwogICAgICB9CiAgICAgIHN0YWNrW3NwICsgbiAtIDFdID0gb2JqOwogICAgfQogIH0gZWxzZSB7CiAgICBqID0gbiAtIGo7CiAgICBmb3IgKGkgPSAwOyBpIDwgajsgKytpKSB7CiAgICAgIG9iaiA9IHN0YWNrW3NwICsgbiAtIDFdOwogICAgICBmb3IgKGsgPSBzcCArIG4gLSAxOyBrID4gc3A7IC0taykgewogICAgICAgIHN0YWNrW2tdID0gc3RhY2tbay0xXTsKICAgICAgfQogICAgICBzdGFja1tzcF0gPSBvYmo7CiAgICB9CiAgfQp9CgpQb3N0U2NyaXB0RnVuY3Rpb246OlBvc3RTY3JpcHRGdW5jdGlvbihPYmplY3QgKmZ1bmNPYmosIERpY3QgKmRpY3QpIHsKICBTdHJlYW0gKnN0cjsKICBpbnQgY29kZVB0cjsKICBHb29TdHJpbmcgKnRvazsKICBkb3VibGUgaW5bZnVuY01heElucHV0c107CiAgaW50IGk7CgogIGNvZGUgPSBudWxscHRyOwogIGNvZGVTdHJpbmcgPSBudWxscHRyOwogIGNvZGVTaXplID0gMDsKICBvayA9IGZhbHNlOwoKICAvLy0tLS0tIGluaXRpYWxpemUgdGhlIGdlbmVyaWMgc3R1ZmYKICBpZiAoIWluaXQoZGljdCkpIHsKICAgIGdvdG8gZXJyMTsKICB9CiAgaWYgKCFoYXNSYW5nZSkgewogICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVHlwZSA0IGZ1bmN0aW9uIGlzIG1pc3NpbmcgcmFuZ2UiKTsKICAgIGdvdG8gZXJyMTsKICB9CgogIC8vLS0tLS0gZ2V0IHRoZSBzdHJlYW0KICBpZiAoIWZ1bmNPYmotPmlzU3RyZWFtKCkpIHsKICAgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlR5cGUgNCBmdW5jdGlvbiBpc24ndCBhIHN0cmVhbSIpOwogICAgZ290byBlcnIxOwogIH0KICBzdHIgPSBmdW5jT2JqLT5nZXRTdHJlYW0oKTsKCiAgLy8tLS0tLSBwYXJzZSB0aGUgZnVuY3Rpb24KICBjb2RlU3RyaW5nID0gbmV3IEdvb1N0cmluZygpOwogIHN0ci0+cmVzZXQoKTsKICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSB8fCB0b2stPmNtcCgieyIpKSB7CiAgICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsICJFeHBlY3RlZCAne3snIGF0IHN0YXJ0IG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKICAgIGlmICh0b2spIHsKICAgICAgZGVsZXRlIHRvazsKICAgIH0KICAgIGdvdG8gZXJyMTsKICB9CiAgZGVsZXRlIHRvazsKICBjb2RlUHRyID0gMDsKICBpZiAoIXBhcnNlQ29kZShzdHIsICZjb2RlUHRyKSkgewogICAgZ290byBlcnIyOwogIH0KICBzdHItPmNsb3NlKCk7CgogIC8vLS0tLS0gc2V0IHVwIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGluW2ldID0gZG9tYWluW2ldWzBdOwogICAgY2FjaGVJbltpXSA9IGluW2ldIC0gMTsKICB9CiAgdHJhbnNmb3JtKGluLCBjYWNoZU91dCk7CgogIG9rID0gdHJ1ZTsKICAKIGVycjI6CiAgc3RyLT5jbG9zZSgpOwogZXJyMToKICByZXR1cm47Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6UG9zdFNjcmlwdEZ1bmN0aW9uKGNvbnN0IFBvc3RTY3JpcHRGdW5jdGlvbiAqZnVuYykgOiBGdW5jdGlvbihmdW5jKSB7CiAgY29kZVNpemUgPSBmdW5jLT5jb2RlU2l6ZTsKCiAgY29kZSA9IChQU09iamVjdCAqKWdtYWxsb2NuKGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICBtZW1jcHkoY29kZSwgZnVuYy0+Y29kZSwgY29kZVNpemUgKiBzaXplb2YoUFNPYmplY3QpKTsKCiAgY29kZVN0cmluZyA9IGZ1bmMtPmNvZGVTdHJpbmctPmNvcHkoKTsKCiAgbWVtY3B5KGNhY2hlSW4sIGZ1bmMtPmNhY2hlSW4sIGZ1bmNNYXhJbnB1dHMgKiBzaXplb2YoZG91YmxlKSk7CiAgbWVtY3B5KGNhY2hlT3V0LCBmdW5jLT5jYWNoZU91dCwgZnVuY01heE91dHB1dHMgKiBzaXplb2YoZG91YmxlKSk7CgogIG9rID0gZnVuYy0+b2s7Cn0KClBvc3RTY3JpcHRGdW5jdGlvbjo6flBvc3RTY3JpcHRGdW5jdGlvbigpIHsKICBnZnJlZShjb2RlKTsKICBkZWxldGUgY29kZVN0cmluZzsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnRyYW5zZm9ybShjb25zdCBkb3VibGUgKmluLCBkb3VibGUgKm91dCkgY29uc3QgewogIFBTU3RhY2sgc3RhY2s7CiAgaW50IGk7CgogIC8vIGNoZWNrIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGlmIChpbltpXSAhPSBjYWNoZUluW2ldKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoaSA9PSBtKSB7CiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgIG91dFtpXSA9IGNhY2hlT3V0W2ldOwogICAgfQogICAgcmV0dXJuOwogIH0KCiAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgewogICAgLy9+IG1heSBuZWVkIHRvIGNoZWNrIGZvciBpbnRlZ2VycyBoZXJlCiAgICBzdGFjay5wdXNoUmVhbChpbltpXSk7CiAgfQogIGV4ZWMoJnN0YWNrLCAwKTsKICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgIG91dFtpXSA9IHN0YWNrLnBvcE51bSgpOwogICAgaWYgKG91dFtpXSA8IHJhbmdlW2ldWzBdKSB7CiAgICAgIG91dFtpXSA9IHJhbmdlW2ldWzBdOwogICAgfSBlbHNlIGlmIChvdXRbaV0gPiByYW5nZVtpXVsxXSkgewogICAgICBvdXRbaV0gPSByYW5nZVtpXVsxXTsKICAgIH0KICB9CiAgc3RhY2suY2xlYXIoKTsKCiAgLy8gaWYgKCFzdGFjay0+ZW1wdHkoKSkgewogIC8vICAgZXJyb3IoZXJyU3ludGF4V2FybmluZywgLTEsCiAgLy8gICAgICAgICAiRXh0cmEgdmFsdWVzIG9uIHN0YWNrIGF0IGVuZCBvZiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CiAgLy8gfQoKICAvLyBzYXZlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBjYWNoZQogIGZvciAoaSA9IDA7IGkgPCBtOyArK2kpIHsKICAgIGNhY2hlSW5baV0gPSBpbltpXTsKICB9CiAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgY2FjaGVPdXRbaV0gPSBvdXRbaV07CiAgfQp9Cgpib29sIFBvc3RTY3JpcHRGdW5jdGlvbjo6cGFyc2VDb2RlKFN0cmVhbSAqc3RyLCBpbnQgKmNvZGVQdHIpIHsKICBHb29TdHJpbmcgKnRvazsKICBib29sIGlzUmVhbDsKICBpbnQgb3BQdHIsIGVsc2VQdHI7CiAgaW50IGEsIGIsIG1pZCwgY21wOwoKICB3aGlsZSAoMSkgewogICAgaWYgKCEodG9rID0gZ2V0VG9rZW4oc3RyKSkpIHsKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgY29uc3QgY2hhciAqcCA9IHRvay0+Y19zdHIoKTsKICAgIGlmIChpc2RpZ2l0KCpwKSB8fCAqcCA9PSAnLicgfHwgKnAgPT0gJy0nKSB7CiAgICAgIGlzUmVhbCA9IGZhbHNlOwogICAgICBmb3IgKDsgKnA7ICsrcCkgewoJaWYgKCpwID09ICcuJykgewoJICBpc1JlYWwgPSB0cnVlOwoJICBicmVhazsKCX0KICAgICAgfQogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgaWYgKGlzUmVhbCkgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzUmVhbDsKICAgICAgICAgIGNvZGVbKmNvZGVQdHJdLnJlYWwgPSBnYXRvZih0b2stPmNfc3RyKCkpOwogICAgICB9IGVsc2UgewoJY29kZVsqY29kZVB0cl0udHlwZSA9IHBzSW50OwoJY29kZVsqY29kZVB0cl0uaW50ZyA9IGF0b2kodG9rLT5jX3N0cigpKTsKICAgICAgfQogICAgICArKypjb2RlUHRyOwogICAgICBkZWxldGUgdG9rOwogICAgfSBlbHNlIGlmICghdG9rLT5jbXAoInsiKSkgewogICAgICBkZWxldGUgdG9rOwogICAgICBvcFB0ciA9ICpjb2RlUHRyOwogICAgICAqY29kZVB0ciArPSAzOwogICAgICByZXNpemVDb2RlKG9wUHRyICsgMik7CiAgICAgIGlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoISh0b2sgPSBnZXRUb2tlbihzdHIpKSkgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiVW5leHBlY3RlZCBlbmQgb2YgUG9zdFNjcmlwdCBmdW5jdGlvbiBzdHJlYW0iKTsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJ7IikpIHsKCWVsc2VQdHIgPSAqY29kZVB0cjsKCWlmICghcGFyc2VDb2RlKHN0ciwgY29kZVB0cikpIHsKCSAgZGVsZXRlIHRvazsKCSAgcmV0dXJuIGZhbHNlOwoJfQoJZGVsZXRlIHRvazsKCWlmICghKHRvayA9IGdldFRva2VuKHN0cikpKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwgIlVuZXhwZWN0ZWQgZW5kIG9mIFBvc3RTY3JpcHQgZnVuY3Rpb24gc3RyZWFtIik7CgkgIHJldHVybiBmYWxzZTsKCX0KICAgICAgfSBlbHNlIHsKCWVsc2VQdHIgPSAtMTsKICAgICAgfQogICAgICBpZiAoIXRvay0+Y21wKCJpZiIpKSB7CglpZiAoZWxzZVB0ciA+PSAwKSB7CgkgIGVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCQkiR290ICdpZicgb3BlcmF0b3Igd2l0aCB0d28gYmxvY2tzIGluIFBvc3RTY3JpcHQgZnVuY3Rpb24iKTsKCSAgcmV0dXJuIGZhbHNlOwoJfQoJY29kZVtvcFB0cl0udHlwZSA9IHBzT3BlcmF0b3I7Cgljb2RlW29wUHRyXS5vcCA9IHBzT3BJZjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgiaWZlbHNlIikpIHsKCWlmIChlbHNlUHRyIDwgMCkgewoJICBlcnJvcihlcnJTeW50YXhFcnJvciwgLTEsCgkJIkdvdCAnaWZlbHNlJyBvcGVyYXRvciB3aXRoIG9uZSBibG9jayBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CgkgIHJldHVybiBmYWxzZTsKCX0KCWNvZGVbb3BQdHJdLnR5cGUgPSBwc09wZXJhdG9yOwoJY29kZVtvcFB0cl0ub3AgPSBwc09wSWZlbHNlOwoJY29kZVtvcFB0cisxXS50eXBlID0gcHNCbG9jazsKCWNvZGVbb3BQdHIrMV0uYmxrID0gZWxzZVB0cjsKCWNvZGVbb3BQdHIrMl0udHlwZSA9IHBzQmxvY2s7Cgljb2RlW29wUHRyKzJdLmJsayA9ICpjb2RlUHRyOwogICAgICB9IGVsc2UgewoJZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLAoJICAgICAgIkV4cGVjdGVkIGlmL2lmZWxzZSBvcGVyYXRvciBpbiBQb3N0U2NyaXB0IGZ1bmN0aW9uIik7CglkZWxldGUgdG9rOwoJcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGRlbGV0ZSB0b2s7CiAgICB9IGVsc2UgaWYgKCF0b2stPmNtcCgifSIpKSB7CiAgICAgIGRlbGV0ZSB0b2s7CiAgICAgIHJlc2l6ZUNvZGUoKmNvZGVQdHIpOwogICAgICBjb2RlWypjb2RlUHRyXS50eXBlID0gcHNPcGVyYXRvcjsKICAgICAgY29kZVsqY29kZVB0cl0ub3AgPSBwc09wUmV0dXJuOwogICAgICArKypjb2RlUHRyOwogICAgICBicmVhazsKICAgIH0gZWxzZSB7CiAgICAgIGEgPSAtMTsKICAgICAgYiA9IG5QU09wczsKICAgICAgY21wID0gMDsgLy8gbWFrZSBnY2MgaGFwcHkKICAgICAgLy8gaW52YXJpYW50OiBwc09wTmFtZXNbYV0gPCB0b2sgPCBwc09wTmFtZXNbYl0KICAgICAgd2hpbGUgKGIgLSBhID4gMSkgewoJbWlkID0gKGEgKyBiKSAvIDI7CgljbXAgPSB0b2stPmNtcChwc09wTmFtZXNbbWlkXSk7CglpZiAoY21wID4gMCkgewoJICBhID0gbWlkOwoJfSBlbHNlIGlmIChjbXAgPCAwKSB7CgkgIGIgPSBtaWQ7Cgl9IGVsc2UgewoJICBhID0gYiA9IG1pZDsKCX0KICAgICAgfQogICAgICBpZiAoY21wICE9IDApIHsKCWVycm9yKGVyclN5bnRheEVycm9yLCAtMSwKCSAgICAgICJVbmtub3duIG9wZXJhdG9yICd7MDp0fScgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiIsCgkgICAgICB0b2spOwoJZGVsZXRlIHRvazsKCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBkZWxldGUgdG9rOwogICAgICByZXNpemVDb2RlKCpjb2RlUHRyKTsKICAgICAgY29kZVsqY29kZVB0cl0udHlwZSA9IHBzT3BlcmF0b3I7CiAgICAgIGNvZGVbKmNvZGVQdHJdLm9wID0gKFBTT3ApYTsKICAgICAgKysqY29kZVB0cjsKICAgIH0KICB9CiAgcmV0dXJuIHRydWU7Cn0KCkdvb1N0cmluZyAqUG9zdFNjcmlwdEZ1bmN0aW9uOjpnZXRUb2tlbihTdHJlYW0gKnN0cikgewogIEdvb1N0cmluZyAqczsKICBpbnQgYzsKICBib29sIGNvbW1lbnQ7CgogIHMgPSBuZXcgR29vU3RyaW5nKCk7CiAgY29tbWVudCA9IGZhbHNlOwogIHdoaWxlICgxKSB7CiAgICBpZiAoKGMgPSBzdHItPmdldENoYXIoKSkgPT0gRU9GKSB7CiAgICAgIGJyZWFrOwogICAgfQogICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgaWYgKGNvbW1lbnQpIHsKICAgICAgaWYgKGMgPT0gJ1x4MGEnIHx8IGMgPT0gJ1x4MGQnKSB7Cgljb21tZW50ID0gZmFsc2U7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoYyA9PSAnJScpIHsKICAgICAgY29tbWVudCA9IHRydWU7CiAgICB9IGVsc2UgaWYgKCFpc3NwYWNlKGMpKSB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnLicgfHwgYyA9PSAnLScpIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICEoaXNkaWdpdChjKSB8fCBjID09ICcuJyB8fCBjID09ICctJykpIHsKCWJyZWFrOwogICAgICB9CiAgICAgIHN0ci0+Z2V0Q2hhcigpOwogICAgICBjb2RlU3RyaW5nLT5hcHBlbmQoYyk7CiAgICB9CiAgfSBlbHNlIHsKICAgIHdoaWxlICgxKSB7CiAgICAgIHMtPmFwcGVuZCgoY2hhciljKTsKICAgICAgYyA9IHN0ci0+bG9va0NoYXIoKTsKICAgICAgaWYgKGMgPT0gRU9GIHx8ICFpc2FsbnVtKGMpKSB7CglicmVhazsKICAgICAgfQogICAgICBzdHItPmdldENoYXIoKTsKICAgICAgY29kZVN0cmluZy0+YXBwZW5kKGMpOwogICAgfQogIH0KICByZXR1cm4gczsKfQoKdm9pZCBQb3N0U2NyaXB0RnVuY3Rpb246OnJlc2l6ZUNvZGUoaW50IG5ld1NpemUpIHsKICBpZiAobmV3U2l6ZSA+PSBjb2RlU2l6ZSkgewogICAgY29kZVNpemUgKz0gNjQ7CiAgICBjb2RlID0gKFBTT2JqZWN0ICopZ3JlYWxsb2NuKGNvZGUsIGNvZGVTaXplLCBzaXplb2YoUFNPYmplY3QpKTsKICB9Cn0KCnZvaWQgUG9zdFNjcmlwdEZ1bmN0aW9uOjpleGVjKFBTU3RhY2sgKnN0YWNrLCBpbnQgY29kZVB0cikgY29uc3QgewogIGludCBpMSwgaTI7CiAgZG91YmxlIHIxLCByMiwgcmVzdWx0OwogIGJvb2wgYjEsIGIyOwoKICB3aGlsZSAoMSkgewogICAgc3dpdGNoIChjb2RlW2NvZGVQdHJdLnR5cGUpIHsKICAgIGNhc2UgcHNJbnQ6CiAgICAgIHN0YWNrLT5wdXNoSW50KGNvZGVbY29kZVB0cisrXS5pbnRnKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzUmVhbDoKICAgICAgc3RhY2stPnB1c2hSZWFsKGNvZGVbY29kZVB0cisrXS5yZWFsKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIHBzT3BlcmF0b3I6CiAgICAgIHN3aXRjaCAoY29kZVtjb2RlUHRyKytdLm9wKSB7CiAgICAgIGNhc2UgcHNPcEFiczoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludChhYnMoc3RhY2stPnBvcEludCgpKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaFJlYWwoZmFicyhzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BBZGQ6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxICsgaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgKyByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQW5kOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSAmIGkyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgJiYgYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEF0YW46CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJcmVzdWx0ID0gYXRhbjIocjEsIHIyKSAqIDE4MC4wIC8gTV9QSTsKCWlmIChyZXN1bHQgPCAwKSByZXN1bHQgKz0gMzYwLjA7CglzdGFjay0+cHVzaFJlYWwocmVzdWx0KTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BCaXRzaGlmdDoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAoaTIgPiAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxIDw8IGkyKTsKCX0gZWxzZSBpZiAoaTIgPCAwKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpKCh1bnNpZ25lZCBpbnQpaTEgPj4gLWkyKSk7Cgl9IGVsc2UgewoJICBzdGFjay0+cHVzaEludChpMSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ2VpbGluZzoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgc3RhY2stPnB1c2hSZWFsKGNlaWwoc3RhY2stPnBvcE51bSgpKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wQ29weToKCXN0YWNrLT5jb3B5KHN0YWNrLT5wb3BJbnQoKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wQ29zOgoJc3RhY2stPnB1c2hSZWFsKGNvcyhzdGFjay0+cG9wTnVtKCkgKiBNX1BJIC8gMTgwLjApKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdmk6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KChpbnQpc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BDdnI6CglpZiAoIXN0YWNrLT50b3BJc1JlYWwoKSkgewoJICBzdGFjay0+cHVzaFJlYWwoc3RhY2stPnBvcE51bSgpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BEaXY6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHIxIC8gcjIpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcER1cDoKCXN0YWNrLT5jb3B5KDEpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEVxOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEJvb2woaTEgPT0gaTIpOwoJfSBlbHNlIGlmIChzdGFjay0+dG9wVHdvQXJlTnVtcygpKSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID09IHIyKTsKCX0gZWxzZSB7CgkgIGIyID0gc3RhY2stPnBvcEJvb2woKTsKCSAgYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBzdGFjay0+cHVzaEJvb2woYjEgPT0gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEV4Y2g6CglzdGFjay0+cm9sbCgyLCAxKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BFeHA6CglyMiA9IHN0YWNrLT5wb3BOdW0oKTsKCXIxID0gc3RhY2stPnBvcE51bSgpOwoJc3RhY2stPnB1c2hSZWFsKHBvdyhyMSwgcjIpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BGYWxzZToKCXN0YWNrLT5wdXNoQm9vbChmYWxzZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wRmxvb3I6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoUmVhbChmbG9vcihzdGFjay0+cG9wTnVtKCkpKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHZToKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID49IGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hCb29sKHIxID49IHIyKTsKCX0KCWJyZWFrOwogICAgICBjYXNlIHBzT3BHdDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxID4gaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPiByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wSWRpdjoKCWkyID0gc3RhY2stPnBvcEludCgpOwoJaTEgPSBzdGFjay0+cG9wSW50KCk7CglpZiAobGlrZWx5KGkyICE9IDApKSB7CgkgIHN0YWNrLT5wdXNoSW50KGkxIC8gaTIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcEluZGV4OgoJc3RhY2stPmluZGV4KHN0YWNrLT5wb3BJbnQoKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wTGU6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSA8PSBpMik7Cgl9IGVsc2UgewoJICByMiA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChyMSA8PSByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTG46CglzdGFjay0+cHVzaFJlYWwobG9nKHN0YWNrLT5wb3BOdW0oKSkpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcExvZzoKCXN0YWNrLT5wdXNoUmVhbChsb2cxMChzdGFjay0+cG9wTnVtKCkpKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BMdDoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hCb29sKGkxIDwgaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgPCByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTW9kOgoJaTIgPSBzdGFjay0+cG9wSW50KCk7CglpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCWlmIChsaWtlbHkoaTIgIT0gMCkpIHsKCSAgc3RhY2stPnB1c2hJbnQoaTEgJSBpMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTXVsOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICAvL34gc2hvdWxkIGNoZWNrIGZvciBvdXQtb2YtcmFuZ2UsIGFuZCBwdXNoIGEgcmVhbCBpbnN0ZWFkCgkgIHN0YWNrLT5wdXNoSW50KGkxICogaTIpOwoJfSBlbHNlIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwocjEgKiByMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTmU6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoQm9vbChpMSAhPSBpMik7Cgl9IGVsc2UgaWYgKHN0YWNrLT50b3BUd29BcmVOdW1zKCkpIHsKCSAgcjIgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaEJvb2wocjEgIT0gcjIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSAhPSBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wTmVnOgoJaWYgKHN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHN0YWNrLT5wdXNoSW50KC1zdGFjay0+cG9wSW50KCkpOwoJfSBlbHNlIHsKCSAgc3RhY2stPnB1c2hSZWFsKC1zdGFjay0+cG9wTnVtKCkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcE5vdDoKCWlmIChzdGFjay0+dG9wSXNJbnQoKSkgewoJICBzdGFjay0+cHVzaEludCh+c3RhY2stPnBvcEludCgpKTsKCX0gZWxzZSB7CgkgIHN0YWNrLT5wdXNoQm9vbCghc3RhY2stPnBvcEJvb2woKSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wT3I6CglpZiAoc3RhY2stPnRvcFR3b0FyZUludHMoKSkgewoJICBpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgaTEgPSBzdGFjay0+cG9wSW50KCk7CgkgIHN0YWNrLT5wdXNoSW50KGkxIHwgaTIpOwoJfSBlbHNlIHsKCSAgYjIgPSBzdGFjay0+cG9wQm9vbCgpOwoJICBiMSA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIHN0YWNrLT5wdXNoQm9vbChiMSB8fCBiMik7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wUG9wOgoJc3RhY2stPnBvcCgpOwoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFJvbGw6CglpMiA9IHN0YWNrLT5wb3BJbnQoKTsKCWkxID0gc3RhY2stPnBvcEludCgpOwoJc3RhY2stPnJvbGwoaTEsIGkyKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BSb3VuZDoKCWlmICghc3RhY2stPnRvcElzSW50KCkpIHsKCSAgcjEgPSBzdGFjay0+cG9wTnVtKCk7CgkgIHN0YWNrLT5wdXNoUmVhbCgocjEgPj0gMCkgPyBmbG9vcihyMSArIDAuNSkgOiBjZWlsKHIxIC0gMC41KSk7Cgl9CglicmVhazsKICAgICAgY2FzZSBwc09wU2luOgoJc3RhY2stPnB1c2hSZWFsKHNpbihzdGFjay0+cG9wTnVtKCkgKiBNX1BJIC8gMTgwLjApKTsKCWJyZWFrOwogICAgICBjYXNlIHBzT3BTcXJ0OgoJc3RhY2stPnB1c2hSZWFsKHNxcnQoc3RhY2stPnBvcE51bSgpKSk7CglicmVhazsKICAgICAgY2FzZSBwc09wU3ViOgoJaWYgKHN0YWNrLT50b3BUd29BcmVJbnRzKCkpIHsKCSAgaTIgPSBzdGFjay0+cG9wSW50KCk7CgkgIGkxID0gc3RhY2stPnBvcEludCgpOwoJICBzdGFjay0+cHVzaEludChpMSAtIGkyKTsKCX0gZWxzZSB7CgkgIHIyID0gc3RhY2stPnBvcE51bSgpOwoJICByMSA9IHN0YWNrLT5wb3BOdW0oKTsKCSAgc3RhY2stPnB1c2hSZWFsKHIxIC0gcjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFRydWU6CglzdGFjay0+cHVzaEJvb2wodHJ1ZSk7CglicmVhazsKICAgICAgY2FzZSBwc09wVHJ1bmNhdGU6CglpZiAoIXN0YWNrLT50b3BJc0ludCgpKSB7CgkgIHIxID0gc3RhY2stPnBvcE51bSgpOwoJICBzdGFjay0+cHVzaFJlYWwoKHIxID49IDApID8gZmxvb3IocjEpIDogY2VpbChyMSkpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcFhvcjoKCWlmIChzdGFjay0+dG9wVHdvQXJlSW50cygpKSB7CgkgIGkyID0gc3RhY2stPnBvcEludCgpOwoJICBpMSA9IHN0YWNrLT5wb3BJbnQoKTsKCSAgc3RhY2stPnB1c2hJbnQoaTEgXiBpMik7Cgl9IGVsc2UgewoJICBiMiA9IHN0YWNrLT5wb3BCb29sKCk7CgkgIGIxID0gc3RhY2stPnBvcEJvb2woKTsKCSAgc3RhY2stPnB1c2hCb29sKGIxIF4gYjIpOwoJfQoJYnJlYWs7CiAgICAgIGNhc2UgcHNPcElmOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wSWZlbHNlOgoJYjEgPSBzdGFjay0+cG9wQm9vbCgpOwoJaWYgKGIxKSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVQdHIgKyAyKTsKCX0gZWxzZSB7CgkgIGV4ZWMoc3RhY2ssIGNvZGVbY29kZVB0cl0uYmxrKTsKCX0KCWNvZGVQdHIgPSBjb2RlW2NvZGVQdHIgKyAxXS5ibGs7CglicmVhazsKICAgICAgY2FzZSBwc09wUmV0dXJuOgoJcmV0dXJuOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgZXJyb3IoZXJyU3ludGF4RXJyb3IsIC0xLCAiSW50ZXJuYWw6IGJhZCBvYmplY3QgaW4gUG9zdFNjcmlwdCBmdW5jdGlvbiBjb2RlIik7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQo=