LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL3NwYXJjX3JvdW5kaW5nX2NvbnRyb2wuaHBwIGZpbGUKICoKICogQ29weXJpZ2h0IDIwMDAgSmVucyBNYXVyZXIKICogQ29weXJpZ2h0IDIwMDIgSGVydukgQnL2bm5pbWFubiwgR3VpbGxhdW1lIE1lbHF1aW9uZCwgU3lsdmFpbiBQaW9uCiAqCiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICogKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IKICogY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqCiAqIFRoZSBiYXNpYyBjb2RlIGluIHRoaXMgZmlsZSB3YXMga2luZGx5IHByb3ZpZGVkIGJ5IEplcmVteSBTaWVrLgogKi8KCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfU1BBUkNfUk9VTkRJTkdfQ09OVFJPTF9IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0RFVEFJTF9TUEFSQ19ST1VORElOR19DT05UUk9MX0hQUAoKI2lmICFkZWZpbmVkKHNwYXJjKSAmJiAhZGVmaW5lZChfX3NwYXJjX18pCiMgIGVycm9yIFRoaXMgaGVhZGVyIGlzIG9ubHkgaW50ZW5kZWQgZm9yIFNQQVJDIENQVXMuCiNlbmRpZgoKI2lmZGVmIF9fU1VOUFJPX0NDCiMgIGluY2x1ZGUgPGllZWVmcC5oPgojZW5kaWYKCgpuYW1lc3BhY2UgYm9vc3QgewpuYW1lc3BhY2UgbnVtZXJpYyB7Cm5hbWVzcGFjZSBpbnRlcnZhbF9saWIgewpuYW1lc3BhY2UgZGV0YWlsIHsKCnN0cnVjdCBzcGFyY19yb3VuZGluZ19jb250cm9sCnsKICB0eXBlZGVmIHVuc2lnbmVkIGludCByb3VuZGluZ19tb2RlOwoKICBzdGF0aWMgdm9pZCBzZXRfcm91bmRpbmdfbW9kZShjb25zdCByb3VuZGluZ19tb2RlJiBtb2RlKQogIHsKIyAgIGlmIGRlZmluZWQoX19HTlVDX18pCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGQgJTAsICUlZnNyIiA6IDogIm0iKG1vZGUpKTsKIyAgIGVsaWYgZGVmaW5lZCAoX19TVU5QUk9fQ0MpCiAgICBmcHNldHJvdW5kKGZwX3JuZChtb2RlKSk7CiMgICBlbGlmIGRlZmluZWQoX19LQ0MpCiAgICBhc20oInNldGhpICVoaShtb2RlKSwgJW8xIik7CiAgICBhc20oImxkIFslbzErJWxvKG1vZGUpXSwgJWZzciIpOwojICAgZWxzZQojICAgICBlcnJvciBVbnN1cHBvcnRlZCBjb21waWxlciBmb3IgU3BhcmMgcm91bmRpbmcgY29udHJvbC4KIyAgIGVuZGlmCiAgfQoKICBzdGF0aWMgdm9pZCBnZXRfcm91bmRpbmdfbW9kZShyb3VuZGluZ19tb2RlJiBtb2RlKQogIHsKIyAgIGlmIGRlZmluZWQoX19HTlVDX18pCiAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygic3QgJSVmc3IsICUwIiA6ICI9bSIobW9kZSkpOwojICAgZWxpZiBkZWZpbmVkIChfX1NVTlBST19DQykKICAgIG1vZGUgPSBmcGdldHJvdW5kKCk7CiMgICBlbGlmIGRlZmluZWQoX19LQ0MpCiMgICAgIGVycm9yIEtDQyBvbiBTdW4gU1BBUkMgZ2V0X3JvdW5kX21vZGU6IHBsZWFzZSBmaXggbWUKICAgIGFzbSgic3QgJWZzciwgW21vZGVdIik7CiMgICBlbHNlCiMgICAgIGVycm9yIFVuc3VwcG9ydGVkIGNvbXBpbGVyIGZvciBTcGFyYyByb3VuZGluZyBjb250cm9sLgojICAgZW5kaWYKICB9CgojaWYgZGVmaW5lZChfX1NVTlBST19DQykKICBzdGF0aWMgdm9pZCBkb3dud2FyZCgpICAgIHsgc2V0X3JvdW5kaW5nX21vZGUoRlBfUk0pOyB9CiAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKEZQX1JQKTsgfQogIHN0YXRpYyB2b2lkIHRvX25lYXJlc3QoKSAgeyBzZXRfcm91bmRpbmdfbW9kZShGUF9STik7IH0KICBzdGF0aWMgdm9pZCB0b3dhcmRfemVybygpIHsgc2V0X3JvdW5kaW5nX21vZGUoRlBfUlopOyB9CiNlbHNlCiAgc3RhdGljIHZvaWQgZG93bndhcmQoKSAgICB7IHNldF9yb3VuZGluZ19tb2RlKDB4YzAwMDAwMDApOyB9CiAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKDB4ODAwMDAwMDApOyB9CiAgc3RhdGljIHZvaWQgdG9fbmVhcmVzdCgpICB7IHNldF9yb3VuZGluZ19tb2RlKDB4MDAwMDAwMDApOyB9CiAgc3RhdGljIHZvaWQgdG93YXJkX3plcm8oKSB7IHNldF9yb3VuZGluZ19tb2RlKDB4NDAwMDAwMDApOyB9CiNlbmRpZgp9OwoKfSAvLyBuYW1lc3BhY2UgZGV0YWlsCgpleHRlcm4gIkMiIHsKICBmbG9hdCByaW50ZihmbG9hdCk7CiAgZG91YmxlIHJpbnQoZG91YmxlKTsKfQoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxmbG9hdD46CiAgZGV0YWlsOjpzcGFyY19yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgY29uc3QgZmxvYXQmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGZsb2F0JiB4KSB7IHJldHVybiB4OyB9CiAgc3RhdGljIGZsb2F0IHRvX2ludChjb25zdCBmbG9hdCYgeCkgeyByZXR1cm4gcmludGYoeCk7IH0KfTsKCnRlbXBsYXRlPD4Kc3RydWN0IHJvdW5kaW5nX2NvbnRyb2w8ZG91YmxlPjoKICBkZXRhaWw6OnNwYXJjX3JvdW5kaW5nX2NvbnRyb2wKewogIHN0YXRpYyBjb25zdCBkb3VibGUmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGRvdWJsZSYgeCkgeyByZXR1cm4geDsgfQogIHN0YXRpYyBkb3VibGUgdG9faW50KGNvbnN0IGRvdWJsZSYgeCkgeyByZXR1cm4gcmludCh4KTsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3Qgcm91bmRpbmdfY29udHJvbDxsb25nIGRvdWJsZT46CiAgZGV0YWlsOjpzcGFyY19yb3VuZGluZ19jb250cm9sCnsKICBzdGF0aWMgY29uc3QgbG9uZyBkb3VibGUmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGxvbmcgZG91YmxlJiB4KSB7IHJldHVybiB4OyB9CiAgc3RhdGljIGxvbmcgZG91YmxlIHRvX2ludChjb25zdCBsb25nIGRvdWJsZSYgeCkgeyByZXR1cm4gcmludCh4KTsgfQp9OwoKfSAvLyBuYW1lc3BhY2UgaW50ZXJ2YWxfbGliCn0gLy8gbmFtZXNwYWNlIG51bWVyaWMKfSAvLyBuYW1lc3BhY2UgYm9vc3QKCiN1bmRlZiBCT09TVF9OVU1FUklDX0lOVEVSVkFMX05PX0hBUkRXQVJFCgojZW5kaWYgLyogQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9ERVRBSUxfU1BBUkNfUk9VTkRJTkdfQ09OVFJPTF9IUFAgKi8K