LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCS50eXBlIHAzMSxAb2JqZWN0CnAzMToJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MQoJQVNNX1NJWkVfRElSRUNUSVZFKHAzMSkKCgkuc2VjdGlvbiAucm9kYXRhLmNzdDE2LCJhTSIsQHByb2diaXRzLDE2CgoJLnAyYWxpZ24gMwoJLnR5cGUgaW5maW5pdHksQG9iamVjdAppbmZfemVybzoKaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweDdmCglBU01fU0laRV9ESVJFQ1RJVkUoaW5maW5pdHkpCgkudHlwZSB6ZXJvLEBvYmplY3QKemVybzoJLmRvdWJsZSAwLjAKCUFTTV9TSVpFX0RJUkVDVElWRSh6ZXJvKQoJLnR5cGUgbWluZl9temVybyxAb2JqZWN0Cm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCiNpZmRlZiBQSUMKIyBkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlY3gpCiMgZGVmaW5lIE1PWChvcCx4LGYpIG9wIyNAR09UT0ZGKCVlY3gseCxmKQojZWxzZQojIGRlZmluZSBNTyhvcCkgb3AKIyBkZWZpbmUgTU9YKG9wLHgsZikgb3AoLHgsZikKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19pZWVlNzU0X3Bvd2YpCglmbGRzCTgoJWVzcCkJLy8geQoJZnhhbQoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkcwk0KCVlc3ApCQkvLyB4IDogeQoKCXN1YmwJJDQsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKCglmeGFtCglmbnN0c3cKCW1vdmIJJWFoLCAlZGgKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCglqZQkyMGYJCS8vIHggaXMgsTAKCgljbXBiCSQweDA1LCAlYWgKCWplCTE1ZgkJLy8geCBpcyCxaW5mCgoJY21wYgkkMHgwMSwgJWFoCglqZQkzMmYJCS8vIHggaXMgTmFOCgoJZnhjaAkJCS8vIHkgOiB4CgoJLyogZmlzdHBsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDwzMS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHAzMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbAkoJWVzcCkJCS8vIHkgOiB4CglmaWxkbAkoJWVzcCkJCS8vIGludCh5KSA6IHkgOiB4CglmdWNvbXAJJXN0KDEpCQkvLyB5IDogeAoJZm5zdHN3CglzYWhmCglqbmUJM2YKCgkvKiBPSywgd2UgaGF2ZSBhbiBpbnRlZ2VyIHZhbHVlIGZvciB5LiAgKi8KCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCW9ybAkkMCwgJWVkeAoJZnN0cAklc3QoMCkJCS8vIHgKCWpucwk0ZgkJLy8geSA+PSAwLCBqdW1wCglmZGl2cmwJTU8ob25lKQkJLy8gMS94CQkobm93IHJlZmVycmVkIHRvIGFzIHgpCgluZWdsCSVlZHgKNDoJZmxkbAlNTyhvbmUpCQkvLyAxIDogeAoJZnhjaAoKNjoJc2hybAkkMSwgJWVkeAoJam5jCTVmCglmeGNoCglmbXVsCSVzdCgxKQkJLy8geCA6IFNUKngKCWZ4Y2gKNToJZm11bAklc3QoMCksICVzdAkvLyB4KnggOiBTVCp4Cgl0ZXN0bAklZWR4LCAlZWR4CglqbnoJNmIKCWZzdHAJJXN0KDApCQkvLyBTVCp4CglyZXQKCgkvKiB5IGlzILFOQU4gKi8KMzA6CWZsZHMJNCglZXNwKQkJLy8geCA6IHkKCWZsZGwJTU8ob25lKQkJLy8gMS4wIDogeCA6IHkKCWZ1Y29tcAklc3QoMSkJCS8vIHggOiB5CglmbnN0c3cKCXNhaGYKCWplCTMxZgoJZnhjaAkJCS8vIHkgOiB4CjMxOglmc3RwCSVzdCgxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg0KQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CS8qIHkgaXMgYSBsYXJnZSBpbnRlZ2VyIChzbyBldmVuKS4gICovCglmeGNoCQkJLy8geCA6IHkKCWZhYnMJCQkvLyB8eHwgOiB5CglmeGNoCQkJLy8geSA6IHgKCS5hbGlnbiBBTElHTkFSRyg0KQozOgkvKiB5IGlzIGEgcmVhbCBudW1iZXIuICAqLwoJZnhjaAkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmbGRsCU1PKGxpbWl0KQkvLyAwLjI5IDogMS4wIDogeCA6IHkKCWZsZAklc3QoMikJCS8vIHggOiAwLjI5IDogMS4wIDogeCA6IHkKCWZzdWIJJXN0KDIpCQkvLyB4LTEgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZhYnMJCQkvLyB8eC0xfCA6IDAuMjkgOiAxLjAgOiB4IDogeQoJZnVjb21wcAkJCS8vIDEuMCA6IHggOiB5CglmbnN0c3cKCWZ4Y2gJCQkvLyB4IDogMS4wIDogeQoJc2FoZgoJamEJN2YKCWZzdWIJJXN0KDEpCQkvLyB4LTEgOiAxLjAgOiB5CglmeWwyeHAxCQkJLy8gbG9nMih4KSA6IHkKCWptcAk4ZgoKNzoJZnlsMngJCQkvLyBsb2cyKHgpIDogeQo4OglmbXVsCSVzdCgxKQkJLy8geSpsb2cyKHgpIDogeQoJZnN0CSVzdCgxKQkJLy8geSpsb2cyKHgpIDogeSpsb2cyKHgpCglmcm5kaW50CQkJLy8gaW50KHkqbG9nMih4KSkgOiB5KmxvZzIoeCkKCWZzdWJyCSVzdCwgJXN0KDEpCS8vIGludCh5KmxvZzIoeCkpIDogZnJhY3QoeSpsb2cyKHgpKQoJZnhjaAkJCS8vIGZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZjJ4bTEJCQkvLyAyXmZyYWN0KHkqbG9nMih4KSktMSA6IGludCh5KmxvZzIoeCkpCglmYWRkbAlNTyhvbmUpCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQoJZnNjYWxlCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkgOiBpbnQoeSpsb2cyKHgpKQozMjoJYWRkbAkkNCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWZzdHAJJXN0KDEpCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKQoJcmV0CgoKCS8vIHBvdyh4LLEwKSA9IDEKCS5hbGlnbiBBTElHTkFSRyg0KQoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkcwk0KCVlc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWR4LCA0KQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE0OglmbGRsCU1PKG9uZSkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxMzoJZmxkcwk0KCVlc3ApCQkvLyBsb2FkIHggPT0gTmFOCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsWluZgoxNToJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGgKCWp6CTE2ZgkJLy8ganVtcCBpZiB4ID09ICtpbmYKCgkvLyBmaXN0cGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDMxLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmxkCSVzdAkJLy8geSA6IHkKCWZhYnMJCQkvLyB8eXwgOiB5CglmY29tcGwJTU8ocDMxKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMTZmCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsCSglZXNwKQkJLy8geQoJZmlsZGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMTdmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJdGVzdGIJJDEsICVkbAoJanoJMThmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1gobWluZl9temVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNjoJZmNvbXBsCU1PKHplcm8pCglhZGRsCSQ0LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJZm5zdHN3CglzaHJsCSQ1LCAlZWF4CglhbmRsCSQ4LCAlZWF4CglmbGRsCU1PWChpbmZfemVybywgJWVheCwgMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNzoJc2hsbAkkMzAsICVlZHgJLy8gc2lnbiBiaXQgZm9yIHkgaW4gcmlnaHQgcG9zaXRpb24KCWFkZGwJJDQsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCjE4OglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1goaW5mX3plcm8sICVlZHgsIDgpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAKMjA6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRsCglqegkyMWYJCS8vIHkgPiAwCgoJLy8geCBpcyCxMCBhbmQgeSBpcyA8IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCXRlc3RiCSQyLCAlZGgKCWp6CTI1ZgoKCS8vIGZpc3RwbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8MzEsIHNvIHRlc3QKCS8vIHRoYXQgKGluIHdoaWNoIGNhc2UgeSBpcyBjZXJ0YWlubHkgZXZlbikgYmVmb3JlIHRlc3RpbmcKCS8vIHdoZXRoZXIgeSBpcyBvZGQuCglmbGQJJXN0CQkvLyB5IDogeQoJZmFicwkJCS8vIHx5fCA6IHkKCWZjb21wbAlNTyhwMzEpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkyNWYKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsCSglZXNwKQkJLy8geQoJZmlsZGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJdGVzdGIJJDEsICVkbAoJanoJMjdmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBtaW51cyBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCWZjaHMKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKMjU6CWZzdHAJJXN0KDApCjI2OglhZGRsCSQ0LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoyNzoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDQpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAgYW5kIHkgaXMgPiAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCjIxOgl0ZXN0YgkkMiwgJWRoCglqegkyMmYKCgkvLyBmaXN0cGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDMxLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmNvbWwJTU8ocDMxKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjJmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbAkoJWVzcCkJCS8vIHkKCWZpbGRsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTIzZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlci4KCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXRlc3RiCSQxLCAlZGwKCWp6CTI0ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkbAlNTyhtemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoNCkKMjI6CWZzdHAJJXN0KDApCjIzOglhZGRsCSQ0LCAlZXNwCS8vIERvbid0IHVzZSBwb3AuCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoyNDoJZmxkbAlNTyh6ZXJvKQoJcmV0CgpFTkQoX19pZWVlNzU0X3Bvd2YpCnN0cm9uZ19hbGlhcyAoX19pZWVlNzU0X3Bvd2YsIF9fcG93Zl9maW5pdGUpCg==