LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OSwgMjAwMSwgMjAwNCwgMjAwNSwgMjAwNwogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAgIDAyMTExLTEzMDcgVVNBLiAgKi8KCiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgoKI2lmZGVmIF9fRUxGX18KCS5zZWN0aW9uIC5yb2RhdGEKI2Vsc2UKCS50ZXh0CiNlbmRpZgoKCS5hbGlnbiBBTElHTkFSRyg0KQoJQVNNX1RZUEVfRElSRUNUSVZFKGluZmluaXR5LEBvYmplY3QpCmluZl96ZXJvOgppbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YKCUFTTV9TSVpFX0RJUkVDVElWRShpbmZpbml0eSkKCUFTTV9UWVBFX0RJUkVDVElWRSh6ZXJvLEBvYmplY3QpCnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCUFTTV9UWVBFX0RJUkVDVElWRShtaW5mX216ZXJvLEBvYmplY3QpCm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCglBU01fVFlQRV9ESVJFQ1RJVkUocDMxLEBvYmplY3QpCnAzMToJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MQoJQVNNX1NJWkVfRElSRUNUSVZFKHAzMSkKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVjeCkKI2RlZmluZSBNT1gob3AseCxmKSBvcCMjQEdPVE9GRiglZWN4LHgsZikKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2RlZmluZSBNT1gob3AseCxmKSBvcCgseCxmKQojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfcG93ZikKCWZsZHMJOCglZXNwKQkvLyB5CglmeGFtCgojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGN4KQojZW5kaWYKCglmbnN0c3cKCW1vdmIJJWFoLCAlZGwKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCS8vIGlzIHkgPT0gMCA/CglqZQkxMWYKCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSA9PSCxaW5mID8KCWplCTEyZgoKCWNtcGIJJDB4MDEsICVhaAkvLyBpcyB5ID09IE5hTiA/CglqZQkzMGYKCglmbGRzCTQoJWVzcCkJCS8vIHggOiB5CgoJc3VibAkkNCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg0KQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDMxLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDMxKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCgoJLyogRmlyc3Qgc2VlIHdoZXRoZXIgYHknIGlzIGEgbmF0dXJhbCBudW1iZXIuICBJbiB0aGlzIGNhc2Ugd2UKCSAgIGNhbiB1c2UgYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmlzdHBsCSglZXNwKQkJLy8geSA6IHgKCWZpbGRsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IHgKCWZ1Y29tcAklc3QoMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuZQkyZgoKCS8qIE9LLCB3ZSBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHkuICAqLwoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJb3JsCSQwLCAlZWR4Cglmc3RwCSVzdCgwKQkJLy8geAoJam5zCTRmCQkvLyB5ID49IDAsIGp1bXAKCWZkaXZybAlNTyhvbmUpCQkvLyAxL3gJCShub3cgcmVmZXJyZWQgdG8gYXMgeCkKCW5lZ2wJJWVkeAo0OglmbGRsCU1PKG9uZSkJCS8vIDEgOiB4CglmeGNoCgo2OglzaHJsCSQxLCAlZWR4CglqbmMJNWYKCWZ4Y2gKCWZtdWwJJXN0KDEpCQkvLyB4IDogU1QqeAoJZnhjaAo1OglmbXVsCSVzdCgwKSwgJXN0CS8vIHgqeCA6IFNUKngKCXRlc3RsCSVlZHgsICVlZHgKCWpuegk2YgoJZnN0cAklc3QoMCkJCS8vIFNUKngKCXJldAoKCS8qIHkgaXMgsU5BTiAqLwozMDoJZmxkcwk0KCVlc3ApCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZnVjb21wCSVzdCgxKQkJLy8geCA6IHkKCWZuc3RzdwoJc2FoZgoJamUJMzFmCglmeGNoCQkJLy8geSA6IHgKMzE6CWZzdHAJJXN0KDEpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCWZ4Y2gJCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZmxkbAlNTyhsaW1pdCkJLy8gMC4yOSA6IDEuMCA6IHggOiB5CglmbGQJJXN0KDIpCQkvLyB4IDogMC4yOSA6IDEuMCA6IHggOiB5Cglmc3ViCSVzdCgyKQkJLy8geC0xIDogMC4yOSA6IDEuMCA6IHggOiB5CglmYWJzCQkJLy8gfHgtMXwgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZ1Y29tcHAJCQkvLyAxLjAgOiB4IDogeQoJZm5zdHN3CglmeGNoCQkJLy8geCA6IDEuMCA6IHkKCXNhaGYKCWphCTdmCglmc3ViCSVzdCgxKQkJLy8geC0xIDogMS4wIDogeQoJZnlsMnhwMQkJCS8vIGxvZzIoeCkgOiB5CglqbXAJOGYKCjc6CWZ5bDJ4CQkJLy8gbG9nMih4KSA6IHkKODoJZm11bAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkKCWZzdAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkqbG9nMih4KQoJZnJuZGludAkJCS8vIGludCh5KmxvZzIoeCkpIDogeSpsb2cyKHgpCglmc3Vicgklc3QsICVzdCgxKQkvLyBpbnQoeSpsb2cyKHgpKSA6IGZyYWN0KHkqbG9nMih4KSkKCWZ4Y2gJCQkvLyBmcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWYyeG0xCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpLTEgOiBpbnQoeSpsb2cyKHgpKQoJZmFkZGwJTU8ob25lKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWZzY2FsZQkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSoyXmludCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWFkZGwJJDQsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglmc3RwCSVzdCgxKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkKCXJldAoKCgkvLyBwb3coeCyxMCkgPSAxCgkuYWxpZ24gQUxJR05BUkcoNCkKMTE6CWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhvbmUpCglyZXQKCgkvLyB5ID09ILFpbmYKCS5hbGlnbiBBTElHTkFSRyg0KQoxMjoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkJCS8vIDEKCWZsZHMJNCglZXNwKQkJLy8geCA6IDEKCWZhYnMJCQkvLyBhYnMoeCkgOiAxCglmdWNvbXBwCQkJLy8gPCAxLCA9PSAxLCBvciA+IDEKCWZuc3RzdwoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQ1LCAlYWgKCWplCTEzZgkJLy8ganVtcCBpZiB4IGlzIE5hTgoKCWNtcGIJJDB4NDAsICVhaAoJamUJMTRmCQkvLyBqdW1wIGlmIHx4fCA9PSAxCgoJc2hsYgkkMSwgJWFoCgl4b3JiCSVhaCwgJWRsCglhbmRsCSQyLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgNCkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNDoJZmxkbAlNTyhvbmUpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTM6CWZsZHMJNCglZXNwKQkJLy8gbG9hZCB4ID09IE5hTgoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg0KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsCSglZXNwKQkJLy8geQoJZmlsZGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMTdmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHNtYWxsCgkvLyBlbm91Z2ggc28gdGhhdCBhbGwgYXJlIGNvbWluZyBmcm9tIHRoZSBtYW50aXNzYT8KCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXRlc3RiCSQxLCAlZGwKCWp6CTE4ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgltb3ZsCSVlZHgsICVlYXgKCW9ybAklZWR4LCAlZWR4CglqbnMJMTU1ZgoJbmVnbAklZWF4CjE1NToJY21wbAkkMHgwMTAwMDAwMCwgJWVheAoJamEJMThmCQkvLyBkb2VzIG5vdCBmaXQgaW4gbWFudGlzc2EgYml0cwoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChtaW5mX216ZXJvLCAlZWR4LCA4KQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg0KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE2OglmY29tcGwJTU8oemVybykKCWFkZGwJJDQsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWF4LCAxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg0KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE3OglzaGxsCSQzMCwgJWVkeAkvLyBzaWduIGJpdCBmb3IgeSBpbiByaWdodCBwb3NpdGlvbgoJYWRkbAkkNCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKMTg6CXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbAkoJWVzcCkJCS8vIHkKCWZpbGRsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTI2ZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIHRoZSBudW1iZXIgb2YgYml0cyBzbWFsbAoJLy8gZW5vdWdoIHNvIHRoYXQgYWxsIGFyZSBjb21pbmcgZnJvbSB0aGUgbWFudGlzc2E/Cglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCgl0ZXN0YgkkMSwgJWRsCglqegkyN2YJCS8vIGp1bXAgaWYgbm90IG9kZAoJY21wbAkkMHhmZjAwMDAwMCwgJWVkeAoJamJlCTI3ZgkJLy8gZG9lcyBub3QgZml0IGluIG1hbnRpc3NhIGJpdHMKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBtaW51cyBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCWZjaHMKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKMjU6CWZzdHAJJXN0KDApCjI2OglhZGRsCSQ0LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoyNzoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAgYW5kIHkgaXMgPiAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCjIxOgl0ZXN0YgkkMiwgJWRoCglqegkyMmYKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsCSglZXNwKQkJLy8geQoJZmlsZGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjNmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHNtYWxsCgkvLyBlbm91Z2ggc28gdGhhdCBhbGwgYXJlIGNvbWluZyBmcm9tIHRoZSBtYW50aXNzYT8KCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXRlc3RiCSQxLCAlZGwKCWp6CTI0ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgljbXBsCSQweGZmMDAwMDAwLCAlZWR4CglqYWUJMjRmCQkvLyBkb2VzIG5vdCBmaXQgaW4gbWFudGlzc2EgYml0cwoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCWZsZGwJTU8obXplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCjIyOglmc3RwCSVzdCgwKQoyMzoJYWRkbAkkNCwgJWVzcAkvLyBEb24ndCB1c2UgcG9wLgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKMjQ6CWZsZGwJTU8oemVybykKCXJldAoKRU5EKF9faWVlZTc1NF9wb3dmKQo=