LyogQVBQTEUgTE9DQUwgYmVnaW4gbWFpbmxpbmUgMjAwNS0wOS0wMSAzNDQ5OTg2ICovCi8qIENvbXBhcmUgc3RyaW5ncyB3aGlsZSB0cmVhdGluZyBkaWdpdHMgY2hhcmFjdGVycyBudW1lcmljYWxseS4KICAgQ29weXJpZ2h0IChDKSAxOTk3LCAyMDAyLCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgbGliaWJlcnR5IGxpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IEplYW4tRnJhbudvaXMgQmlnbm9sbGVzIDxiaWdub2xsZUBlY29sZWRvYy5pYnAuZnI+LCAxOTk3LgoKICAgTGliaWJlcnR5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIExpYmliZXJ0eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKICAgMDIxMTEtMTMwNyBVU0EuICAqLwoKI2luY2x1ZGUgImxpYmliZXJ0eS5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgoKLyogCkBkZWZ0eXBlZnVuIGludCBzdHJ2ZXJzY21wIChjb25zdCBjaGFyICpAdmFye3MxfSwgY29uc3QgY2hhciAqQHZhcntzMn0pClRoZSBAY29kZXtzdHJ2ZXJzY21wfSBmdW5jdGlvbiBjb21wYXJlcyB0aGUgc3RyaW5nIEB2YXJ7czF9IGFnYWluc3QKQHZhcntzMn0sIGNvbnNpZGVyaW5nIHRoZW0gYXMgaG9sZGluZyBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycy4gIFJldHVybgp2YWx1ZSBmb2xsb3dzIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIGZvdW5kIGluIHRoZSBAY29kZXtzdHJ2ZXJzY21wfQpmdW5jdGlvbi4gIEluIGZhY3QsIGlmIEB2YXJ7czF9IGFuZCBAdmFye3MyfSBjb250YWluIG5vIGRpZ2l0cywKQGNvZGV7c3RydmVyc2NtcH0gYmVoYXZlcyBsaWtlIEBjb2Rle3N0cmNtcH0uCgpCYXNpY2FsbHksIHdlIGNvbXBhcmUgc3RyaW5ncyBub3JtYWxseSAoY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciksIHVudGlsCndlIGZpbmQgYSBkaWdpdCBpbiBlYWNoIHN0cmluZyAtIHRoZW4gd2UgZW50ZXIgYSBzcGVjaWFsIGNvbXBhcmlzb24KbW9kZSwgd2hlcmUgZWFjaCBzZXF1ZW5jZSBvZiBkaWdpdHMgaXMgdGFrZW4gYXMgYSB3aG9sZS4gIElmIHdlIHJlYWNoIHRoZQplbmQgb2YgdGhlc2UgdHdvIHBhcnRzIHdpdGhvdXQgbm90aWNpbmcgYSBkaWZmZXJlbmNlLCB3ZSByZXR1cm4gdG8gdGhlCnN0YW5kYXJkIGNvbXBhcmlzb24gbW9kZS4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbnVtZXJpYyBwYXJ0czoKImludGVncmFsIiBhbmQgImZyYWN0aW9uYWwiICh0aG9zZSAgYmVnaW4gd2l0aCBhICcwJykuIFRoZSB0eXBlcwpvZiB0aGUgbnVtZXJpYyBwYXJ0cyBhZmZlY3QgdGhlIHdheSB3ZSBzb3J0IHRoZW06CgpAaXRlbWl6ZSBAYnVsbGV0CkBpdGVtCmludGVncmFsL2ludGVncmFsOiB3ZSBjb21wYXJlIHZhbHVlcyBhcyB5b3Ugd291bGQgZXhwZWN0LgoKQGl0ZW0KZnJhY3Rpb25hbC9pbnRlZ3JhbDogdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBsZXNzIHRoYW4gdGhlIGludGVncmFsIG9uZS4KQWdhaW4sIG5vIHN1cnByaXNlLgoKQGl0ZW0KZnJhY3Rpb25hbC9mcmFjdGlvbmFsOiB0aGUgdGhpbmdzIGJlY29tZSBhIGJpdCBtb3JlIGNvbXBsZXguCklmIHRoZSBjb21tb24gcHJlZml4IGNvbnRhaW5zIG9ubHkgbGVhZGluZyB6ZXJvZXMsIHRoZSBsb25nZXN0IHBhcnQgaXMgbGVzcwp0aGFuIHRoZSBvdGhlciBvbmU7IGVsc2UgdGhlIGNvbXBhcmlzb24gYmVoYXZlcyBub3JtYWxseS4KQGVuZCBpdGVtaXplCgpAc21hbGxleGFtcGxlCnN0cnZlcnNjbXAgKCJubyBkaWdpdCIsICJubyBkaWdpdCIpCiAgICBAcmVzdWx0e30gMCAgICAvLyBAcntzYW1lIGJlaGF2aW9yIGFzIHN0cmNtcC59CnN0cnZlcnNjbXAgKCJpdGVtIzk5IiwgIml0ZW0jMTAwIikKICAgIEByZXN1bHR7fSA8MCAgIC8vIEBye3NhbWUgcHJlZml4LCBidXQgOTkgPCAxMDAufQpzdHJ2ZXJzY21wICgiYWxwaGExIiwgImFscGhhMDAxIikKICAgIEByZXN1bHR7fSA+MCAgIC8vIEBye2ZyYWN0aW9uYWwgcGFydCBpbmZlcmlvciB0byBpbnRlZ3JhbCBvbmUufQpzdHJ2ZXJzY21wICgicGFydDFfZjAxMiIsICJwYXJ0MV9mMDEiKQogICAgQHJlc3VsdHt9ID4wICAgLy8gQHJ7dHdvIGZyYWN0aW9uYWwgcGFydHMufQpzdHJ2ZXJzY21wICgiZm9vLjAwOSIsICJmb28uMCIpCiAgICBAcmVzdWx0e30gPDAgICAvLyBAcntpZGVtLCBidXQgd2l0aCBsZWFkaW5nIHplcm9lcyBvbmx5Ln0KQGVuZCBzbWFsbGV4YW1wbGUKClRoaXMgZnVuY3Rpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggZmlsZW5hbWUgc29ydGluZywKYmVjYXVzZSBmaWxlbmFtZXMgZnJlcXVlbnRseSBob2xkIGluZGljZXMvdmVyc2lvbiBudW1iZXJzLgpAZW5kIGRlZnR5cGVmdW4KCiovCgovKiBzdGF0ZXM6IFNfTjogbm9ybWFsLCBTX0k6IGNvbXBhcmluZyBpbnRlZ3JhbCBwYXJ0LCBTX0Y6IGNvbXBhcmluZwogICAgICAgICAgIGZyYWN0aW9uYWwgcGFydHMsIFNfWjogaWRlbSBidXQgd2l0aCBsZWFkaW5nIFplcm9lcyBvbmx5ICovCiNkZWZpbmUgIFNfTiAgICAweDAKI2RlZmluZSAgU19JICAgIDB4NAojZGVmaW5lICBTX0YgICAgMHg4CiNkZWZpbmUgIFNfWiAgICAweEMKCi8qIHJlc3VsdF90eXBlOiBDTVA6IHJldHVybiBkaWZmOyBMRU46IGNvbXBhcmUgdXNpbmcgbGVuX2RpZmYvZGlmZiAqLwojZGVmaW5lICBDTVAgICAgMgojZGVmaW5lICBMRU4gICAgMwoKCi8qIENvbXBhcmUgUzEgYW5kIFMyIGFzIHN0cmluZ3MgaG9sZGluZyBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycywKICAgcmV0dXJuaW5nIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8gaWYgUzEgaXMgbGVzcyB0aGFuLAogICBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gUzIgKGZvciBtb3JlIGluZm8sIHNlZSB0aGUgR2xpYmMgdGV4aW5mbyBkb2MpLiAgKi8KCmludApzdHJ2ZXJzY21wIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMxOwogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczI7CiAgdW5zaWduZWQgY2hhciBjMSwgYzI7CiAgaW50IHN0YXRlOwogIGludCBkaWZmOwoKICAvKiBTeW1ib2wocykgICAgMCAgICAgICBbMS05XSAgIG90aGVycyAgKHBhZGRpbmcpCiAgICAgVHJhbnNpdGlvbiAgICgxMCkgMCAgKDAxKSBkICAoMDApIHggICgxMSkgLSAgICovCiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuZXh0X3N0YXRlW10gPQogICAgewogICAgICAvKiBzdGF0ZSAgICB4ICAgIGQgICAgMCAgICAtICovCiAgICAgIC8qIFNfTiAqLyAgU19OLCBTX0ksIFNfWiwgU19OLAogICAgICAvKiBTX0kgKi8gIFNfTiwgU19JLCBTX0ksIFNfSSwKICAgICAgLyogU19GICovICBTX04sIFNfRiwgU19GLCBTX0YsCiAgICAgIC8qIFNfWiAqLyAgU19OLCBTX0YsIFNfWiwgU19aCiAgICB9OwoKICBzdGF0aWMgY29uc3QgaW50IHJlc3VsdF90eXBlW10gPQogICAgewogICAgICAvKiBzdGF0ZSAgIHgveCAgeC9kICB4LzAgIHgvLSAgZC94ICBkL2QgIGQvMCAgZC8tCiAgICAgICAgICAgICAgICAgMC94ICAwL2QgIDAvMCAgMC8tICAtL3ggIC0vZCAgLS8wICAtLy0gKi8KCiAgICAgIC8qIFNfTiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfSSAqLyAgQ01QLCAtMSwgIC0xLCAgQ01QLCArMSwgIExFTiwgTEVOLCBDTVAsCiAgICAgICAgICAgICAgICAgKzEsICBMRU4sIExFTiwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfRiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfWiAqLyAgQ01QLCArMSwgICsxLCAgQ01QLCAtMSwgIENNUCwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgLTEsICBDTVAsIENNUCwgQ01QCiAgICB9OwoKICBpZiAocDEgPT0gcDIpCiAgICByZXR1cm4gMDsKCiAgYzEgPSAqcDErKzsKICBjMiA9ICpwMisrOwogIC8qIEhpbnQ6ICcwJyBpcyBhIGRpZ2l0IHRvby4gICovCiAgc3RhdGUgPSBTX04gfCAoKGMxID09ICcwJykgKyAoSVNESUdJVCAoYzEpICE9IDApKTsKCiAgd2hpbGUgKChkaWZmID0gYzEgLSBjMikgPT0gMCAmJiBjMSAhPSAnXDAnKQogICAgewogICAgICBzdGF0ZSA9IG5leHRfc3RhdGVbc3RhdGVdOwogICAgICBjMSA9ICpwMSsrOwogICAgICBjMiA9ICpwMisrOwogICAgICBzdGF0ZSB8PSAoYzEgPT0gJzAnKSArIChJU0RJR0lUIChjMSkgIT0gMCk7CiAgICB9CgogIHN0YXRlID0gcmVzdWx0X3R5cGVbc3RhdGUgPDwgMiB8ICgoKGMyID09ICcwJykgKyAoSVNESUdJVCAoYzIpICE9IDApKSldOwoKICBzd2l0Y2ggKHN0YXRlKQogICAgewogICAgY2FzZSBDTVA6CiAgICAgIHJldHVybiBkaWZmOwogICAgICAKICAgIGNhc2UgTEVOOgogICAgICB3aGlsZSAoSVNESUdJVCAoKnAxKyspKQoJaWYgKCFJU0RJR0lUICgqcDIrKykpCgkgIHJldHVybiAxOwogICAgICAKICAgICAgcmV0dXJuIElTRElHSVQgKCpwMikgPyAtMSA6IGRpZmY7CiAgICAgIAogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQp9Ci8qIEFQUExFIExPQ0FMIGVuZCBtYWlubGluZSAyMDA1LTA5LTAxIDM0NDk5ODYgKi8K