LyogQm9vc3QgaW50ZXJ2YWwvbGltaXRzLmhwcCB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbiBmaWxlCiAqCiAqIENvcHlyaWdodCAyMDAwIEplbnMgTWF1cmVyCiAqIENvcHlyaWdodCAyMDAyLTIwMDMgSGVydukgQnL2bm5pbWFubiwgR3VpbGxhdW1lIE1lbHF1aW9uZCwgU3lsdmFpbiBQaW9uCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwoKI2lmbmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0xJTUlUU19IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0xJTUlUU19IUFAKCiNpZm5kZWYgQk9PU1RfTk9fVEVNUExBVEVfUEFSVElBTF9TUEVDSUFMSVpBVElPTgoKI2luY2x1ZGUgPGJvb3N0L2NvbmZpZy5ocHA+CiNpbmNsdWRlIDxib29zdC9saW1pdHMuaHBwPgojaW5jbHVkZSA8Ym9vc3QvbnVtZXJpYy9pbnRlcnZhbC9kZXRhaWwvaW50ZXJ2YWxfcHJvdG90eXBlLmhwcD4KCm5hbWVzcGFjZSBzdGQgewoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgUG9saWNpZXM+CmNsYXNzIG51bWVyaWNfbGltaXRzPGJvb3N0OjpudW1lcmljOjppbnRlcnZhbDxULCBQb2xpY2llcz4gPgogIDogcHVibGljIG51bWVyaWNfbGltaXRzPFQ+CnsKcHJpdmF0ZToKICB0eXBlZGVmIGJvb3N0OjpudW1lcmljOjppbnRlcnZhbDxULCBQb2xpY2llcz4gSTsKICB0eXBlZGVmIG51bWVyaWNfbGltaXRzPFQ+IGJsOwpwdWJsaWM6CiAgc3RhdGljIEkgbWluIEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OICgpIHRocm93KCkgeyByZXR1cm4gSSgoYmw6Om1pbikoKSwgKGJsOjptaW4pKCkpOyB9CiAgc3RhdGljIEkgbWF4IEJPT1NUX1BSRVZFTlRfTUFDUk9fU1VCU1RJVFVUSU9OICgpIHRocm93KCkgeyByZXR1cm4gSSgoYmw6Om1heCkoKSwgKGJsOjptYXgpKCkpOyB9CiAgc3RhdGljIEkgZXBzaWxvbigpIHRocm93KCkgeyByZXR1cm4gSShibDo6ZXBzaWxvbigpLCBibDo6ZXBzaWxvbigpKTsgfQoKICBCT09TVF9TVEFUSUNfQ09OU1RBTlQoZmxvYXRfcm91bmRfc3R5bGUsIHJvdW5kX3N0eWxlID0gcm91bmRfaW5kZXRlcm1pbmF0ZSk7CiAgQk9PU1RfU1RBVElDX0NPTlNUQU5UKGJvb2wsIGlzX2llYzU1OSA9IGZhbHNlKTsKCiAgc3RhdGljIEkgaW5maW5pdHkgKCkgdGhyb3coKSB7IHJldHVybiBJOjp3aG9sZSgpOyB9CiAgc3RhdGljIEkgcXVpZXRfTmFOKCkgdGhyb3coKSB7IHJldHVybiBJOjplbXB0eSgpOyB9CiAgc3RhdGljIEkgc2lnbmFsaW5nX05hTigpIHRocm93KCkKICB7IHJldHVybiBJKGJsOjpzaWduYWxpbmdfTmFOKCksIGJsOjpzaWduYWxpbmdfTmFuKCkpOyB9CiAgc3RhdGljIEkgZGVub3JtX21pbigpIHRocm93KCkKICB7IHJldHVybiBJKGJsOjpkZW5vcm1fbWluKCksIGJsOjpkZW5vcm1fbWluKCkpOyB9CnByaXZhdGU6CiAgc3RhdGljIEkgcm91bmRfZXJyb3IoKTsgICAgLy8gaGlkZSB0aGlzIG9uIHB1cnBvc2UsIG5vdCB5ZXQgaW1wbGVtZW50ZWQKfTsKCn0gLy8gbmFtZXNwYWNlIHN0ZAoKI2VuZGlmCgojZW5kaWYgLy8gQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9MSU1JVFNfSFBQCg==