LyogQ29tcGFyZSBzdHJpbmdzIHdoaWxlIHRyZWF0aW5nIGRpZ2l0cyBjaGFyYWN0ZXJzIG51bWVyaWNhbGx5LgogICBDb3B5cmlnaHQgKEMpIDE5OTcsIDIwMDIsIDIwMDkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBKZWFuLUZyYW7nb2lzIEJpZ25vbGxlcyA8Ymlnbm9sbGVAZWNvbGVkb2MuaWJwLmZyPiwgMTk5Ny4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8c3RkaW50Lmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CgovKiBzdGF0ZXM6IFNfTjogbm9ybWFsLCBTX0k6IGNvbXBhcmluZyBpbnRlZ3JhbCBwYXJ0LCBTX0Y6IGNvbXBhcmluZwogICAgICAgICAgIGZyYWN0aW9ubmFsIHBhcnRzLCBTX1o6IGlkZW0gYnV0IHdpdGggbGVhZGluZyBaZXJvZXMgb25seSAqLwojZGVmaW5lICBTX04gICAgMHgwCiNkZWZpbmUgIFNfSSAgICAweDMKI2RlZmluZSAgU19GICAgIDB4NgojZGVmaW5lICBTX1ogICAgMHg5CgovKiByZXN1bHRfdHlwZTogQ01QOiByZXR1cm4gZGlmZjsgTEVOOiBjb21wYXJlIHVzaW5nIGxlbl9kaWZmL2RpZmYgKi8KI2RlZmluZSAgQ01QICAgIDIKI2RlZmluZSAgTEVOICAgIDMKCgovKiBDb21wYXJlIFMxIGFuZCBTMiBhcyBzdHJpbmdzIGhvbGRpbmcgaW5kaWNlcy92ZXJzaW9uIG51bWJlcnMsCiAgIHJldHVybmluZyBsZXNzIHRoYW4sIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB6ZXJvIGlmIFMxIGlzIGxlc3MgdGhhbiwKICAgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIFMyIChmb3IgbW9yZSBpbmZvLCBzZWUgdGhlIHRleGluZm8gZG9jKS4KKi8KCmludApfX3N0cnZlcnNjbXAgKHMxLCBzMikKICAgICBjb25zdCBjaGFyICpzMTsKICAgICBjb25zdCBjaGFyICpzMjsKewogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAxID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczE7CiAgY29uc3QgdW5zaWduZWQgY2hhciAqcDIgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKSBzMjsKCiAgLyogU3ltYm9sKHMpICAgIDAgICAgICAgWzEtOV0gICBvdGhlcnMKICAgICBUcmFuc2l0aW9uICAgKDEwKSAwICAoMDEpIGQgICgwMCkgeCAgICovCiAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgbmV4dF9zdGF0ZVtdID0KICB7CiAgICAgIC8qIHN0YXRlICAgIHggICAgZCAgICAwICAqLwogICAgICAvKiBTX04gKi8gIFNfTiwgU19JLCBTX1osCiAgICAgIC8qIFNfSSAqLyAgU19OLCBTX0ksIFNfSSwKICAgICAgLyogU19GICovICBTX04sIFNfRiwgU19GLAogICAgICAvKiBTX1ogKi8gIFNfTiwgU19GLCBTX1oKICB9OwoKICBzdGF0aWMgY29uc3QgaW50OF90IHJlc3VsdF90eXBlW10gPQogIHsKICAgICAgLyogc3RhdGUgICB4L3ggIHgvZCAgeC8wICBkL3ggIGQvZCAgZC8wICAwL3ggIDAvZCAgMC8wICAqLwoKICAgICAgLyogU19OICovICBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsIENNUCwgQ01QLAogICAgICAvKiBTX0kgKi8gIENNUCwgLTEsICAtMSwgICsxLCAgTEVOLCBMRU4sICsxLCAgTEVOLCBMRU4sCiAgICAgIC8qIFNfRiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwKICAgICAgLyogU19aICovICBDTVAsICsxLCAgKzEsICAtMSwgIENNUCwgQ01QLCAtMSwgIENNUCwgQ01QCiAgfTsKCiAgaWYgKHAxID09IHAyKQogICAgcmV0dXJuIDA7CgogIHVuc2lnbmVkIGNoYXIgYzEgPSAqcDErKzsKICB1bnNpZ25lZCBjaGFyIGMyID0gKnAyKys7CiAgLyogSGludDogJzAnIGlzIGEgZGlnaXQgdG9vLiAgKi8KICBpbnQgc3RhdGUgPSBTX04gKyAoKGMxID09ICcwJykgKyAoaXNkaWdpdCAoYzEpICE9IDApKTsKCiAgaW50IGRpZmY7CiAgd2hpbGUgKChkaWZmID0gYzEgLSBjMikgPT0gMCkKICAgIHsKICAgICAgaWYgKGMxID09ICdcMCcpCglyZXR1cm4gZGlmZjsKCiAgICAgIHN0YXRlID0gbmV4dF9zdGF0ZVtzdGF0ZV07CiAgICAgIGMxID0gKnAxKys7CiAgICAgIGMyID0gKnAyKys7CiAgICAgIHN0YXRlICs9IChjMSA9PSAnMCcpICsgKGlzZGlnaXQgKGMxKSAhPSAwKTsKICAgIH0KCiAgc3RhdGUgPSByZXN1bHRfdHlwZVtzdGF0ZSAqIDMgKyAoKChjMiA9PSAnMCcpICsgKGlzZGlnaXQgKGMyKSAhPSAwKSkpXTsKCiAgc3dpdGNoIChzdGF0ZSkKICB7CiAgICBjYXNlIENNUDoKICAgICAgcmV0dXJuIGRpZmY7CgogICAgY2FzZSBMRU46CiAgICAgIHdoaWxlIChpc2RpZ2l0ICgqcDErKykpCglpZiAoIWlzZGlnaXQgKCpwMisrKSkKCSAgcmV0dXJuIDE7CgogICAgICByZXR1cm4gaXNkaWdpdCAoKnAyKSA/IC0xIDogZGlmZjsKCiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gc3RhdGU7CiAgfQp9CmxpYmNfaGlkZGVuX2RlZiAoX19zdHJ2ZXJzY21wKQp3ZWFrX2FsaWFzIChfX3N0cnZlcnNjbXAsIHN0cnZlcnNjbXApCg==