LyogQ29tcGFyZSBzdHJpbmdzIHdoaWxlIHRyZWF0aW5nIGRpZ2l0cyBjaGFyYWN0ZXJzIG51bWVyaWNhbGx5LgogICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IEplYW4tRnJhbudvaXMgQmlnbm9sbGVzIDxiaWdub2xsZUBlY29sZWRvYy5pYnAuZnI+LCAxOTk3LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKLyogc3RhdGVzOiBTX046IG5vcm1hbCwgU19JOiBjb21wYXJpbmcgaW50ZWdyYWwgcGFydCwgU19GOiBjb21wYXJpbmcKICAgICAgICAgICBmcmFjdGlvbm5hbCBwYXJ0cywgU19aOiBpZGVtIGJ1dCB3aXRoIGxlYWRpbmcgWmVyb2VzIG9ubHkgKi8KI2RlZmluZSAgU19OICAgIDB4MAojZGVmaW5lICBTX0kgICAgMHgzCiNkZWZpbmUgIFNfRiAgICAweDYKI2RlZmluZSAgU19aICAgIDB4OQoKLyogcmVzdWx0X3R5cGU6IENNUDogcmV0dXJuIGRpZmY7IExFTjogY29tcGFyZSB1c2luZyBsZW5fZGlmZi9kaWZmICovCiNkZWZpbmUgIENNUCAgICAyCiNkZWZpbmUgIExFTiAgICAzCgoKLyogQ29tcGFyZSBTMSBhbmQgUzIgYXMgc3RyaW5ncyBob2xkaW5nIGluZGljZXMvdmVyc2lvbiBudW1iZXJzLAogICByZXR1cm5pbmcgbGVzcyB0aGFuLCBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gemVybyBpZiBTMSBpcyBsZXNzIHRoYW4sCiAgIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiBTMiAoZm9yIG1vcmUgaW5mbywgc2VlIHRoZSB0ZXhpbmZvIGRvYykuCiovCgppbnQKX19zdHJ2ZXJzY21wIChzMSwgczIpCiAgICAgY29uc3QgY2hhciAqczE7CiAgICAgY29uc3QgY2hhciAqczI7CnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMxOwogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczI7CgogIC8qIFN5bWJvbChzKSAgICAwICAgICAgIFsxLTldICAgb3RoZXJzCiAgICAgVHJhbnNpdGlvbiAgICgxMCkgMCAgKDAxKSBkICAoMDApIHggICAqLwogIHN0YXRpYyBjb25zdCB1aW50OF90IG5leHRfc3RhdGVbXSA9CiAgewogICAgICAvKiBzdGF0ZSAgICB4ICAgIGQgICAgMCAgKi8KICAgICAgLyogU19OICovICBTX04sIFNfSSwgU19aLAogICAgICAvKiBTX0kgKi8gIFNfTiwgU19JLCBTX0ksCiAgICAgIC8qIFNfRiAqLyAgU19OLCBTX0YsIFNfRiwKICAgICAgLyogU19aICovICBTX04sIFNfRiwgU19aCiAgfTsKCiAgc3RhdGljIGNvbnN0IGludDhfdCByZXN1bHRfdHlwZVtdID0KICB7CiAgICAgIC8qIHN0YXRlICAgeC94ICB4L2QgIHgvMCAgZC94ICBkL2QgIGQvMCAgMC94ICAwL2QgIDAvMCAgKi8KCiAgICAgIC8qIFNfTiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBMRU4sIENNUCwgQ01QLCBDTVAsIENNUCwKICAgICAgLyogU19JICovICBDTVAsIC0xLCAgLTEsICArMSwgIExFTiwgTEVOLCArMSwgIExFTiwgTEVOLAogICAgICAvKiBTX0YgKi8gIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfWiAqLyAgQ01QLCArMSwgICsxLCAgLTEsICBDTVAsIENNUCwgLTEsICBDTVAsIENNUAogIH07CgogIGlmIChwMSA9PSBwMikKICAgIHJldHVybiAwOwoKICB1bnNpZ25lZCBjaGFyIGMxID0gKnAxKys7CiAgdW5zaWduZWQgY2hhciBjMiA9ICpwMisrOwogIC8qIEhpbnQ6ICcwJyBpcyBhIGRpZ2l0IHRvby4gICovCiAgaW50IHN0YXRlID0gU19OICsgKChjMSA9PSAnMCcpICsgKGlzZGlnaXQgKGMxKSAhPSAwKSk7CgogIGludCBkaWZmOwogIHdoaWxlICgoZGlmZiA9IGMxIC0gYzIpID09IDApCiAgICB7CiAgICAgIGlmIChjMSA9PSAnXDAnKQoJcmV0dXJuIGRpZmY7CgogICAgICBzdGF0ZSA9IG5leHRfc3RhdGVbc3RhdGVdOwogICAgICBjMSA9ICpwMSsrOwogICAgICBjMiA9ICpwMisrOwogICAgICBzdGF0ZSArPSAoYzEgPT0gJzAnKSArIChpc2RpZ2l0IChjMSkgIT0gMCk7CiAgICB9CgogIHN0YXRlID0gcmVzdWx0X3R5cGVbc3RhdGUgKiAzICsgKCgoYzIgPT0gJzAnKSArIChpc2RpZ2l0IChjMikgIT0gMCkpKV07CgogIHN3aXRjaCAoc3RhdGUpCiAgewogICAgY2FzZSBDTVA6CiAgICAgIHJldHVybiBkaWZmOwoKICAgIGNhc2UgTEVOOgogICAgICB3aGlsZSAoaXNkaWdpdCAoKnAxKyspKQoJaWYgKCFpc2RpZ2l0ICgqcDIrKykpCgkgIHJldHVybiAxOwoKICAgICAgcmV0dXJuIGlzZGlnaXQgKCpwMikgPyAtMSA6IGRpZmY7CgogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHN0YXRlOwogIH0KfQpsaWJjX2hpZGRlbl9kZWYgKF9fc3RydmVyc2NtcCkKd2Vha19hbGlhcyAoX19zdHJ2ZXJzY21wLCBzdHJ2ZXJzY21wKQo=