LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCS50eXBlIHA2MyxAb2JqZWN0CnA2MzoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhlMCwgMHg0MwoJQVNNX1NJWkVfRElSRUNUSVZFKHA2MykKCS50eXBlIHAxMCxAb2JqZWN0CnAxMDoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHg5MCwgMHg0MAoJQVNNX1NJWkVfRElSRUNUSVZFKHAxMCkKCgkuc2VjdGlvbiAucm9kYXRhLmNzdDE2LCJhTSIsQHByb2diaXRzLDE2CgoJLnAyYWxpZ24gMwoJLnR5cGUgaW5maW5pdHksQG9iamVjdAppbmZfemVybzoKaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweDdmCglBU01fU0laRV9ESVJFQ1RJVkUoaW5maW5pdHkpCgkudHlwZSB6ZXJvLEBvYmplY3QKemVybzoJLmRvdWJsZSAwLjAKCUFTTV9TSVpFX0RJUkVDVElWRSh6ZXJvKQoJLnR5cGUgbWluZl9temVybyxAb2JqZWN0Cm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCiNpZmRlZiBQSUMKIyBkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlY3gpCiMgZGVmaW5lIE1PWChvcCx4LGYpIG9wIyNAR09UT0ZGKCVlY3gseCxmKQojZWxzZQojIGRlZmluZSBNTyhvcCkgb3AKIyBkZWZpbmUgTU9YKG9wLHgsZikgb3AoLHgsZikKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19pZWVlNzU0X3BvdykKCWZsZGwJMTIoJWVzcCkJLy8geQoJZnhhbQoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkbAk0KCVlc3ApCQkvLyB4IDogeQoKCXN1YmwJJDgsJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCgljbXBiCSQweDAxLCAlYWgKCWplCTMyZgkJLy8geCBpcyBOYU4KCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2My4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHA2MykJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogeAoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IHgKCWZ1Y29tcAklc3QoMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuZQkzZgoKCS8qIE9LLCB3ZSBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHkuICBJZiBsYXJnZSBlbm91Z2ggdGhhdAoJICAgZXJyb3JzIG1heSBwcm9wYWdhdGUgb3V0IG9mIHRoZSAxMSBiaXRzIGV4Y2VzcyBwcmVjaXNpb24sIHVzZQoJICAgdGhlIGFsZ29yaXRobSBmb3IgcmVhbCBleHBvbmVudCBpbnN0ZWFkLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDEwKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglvcmwJJDAsICVlZHgKCWZzdHAJJXN0KDApCQkvLyB4CglqbnMJNGYJCS8vIHkgPj0gMCwganVtcAoJZmRpdnJsCU1PKG9uZSkJCS8vIDEveAkJKG5vdyByZWZlcnJlZCB0byBhcyB4KQoJbmVnbAklZWF4CglhZGNsCSQwLCAlZWR4CgluZWdsCSVlZHgKNDoJZmxkbAlNTyhvbmUpCQkvLyAxIDogeAoJZnhjaAoKNjoJc2hyZGwJJDEsICVlZHgsICVlYXgKCWpuYwk1ZgoJZnhjaAoJZm11bAklc3QoMSkJCS8vIHggOiBTVCp4CglmeGNoCjU6CWZtdWwJJXN0KDApLCAlc3QJLy8geCp4IDogU1QqeAoJc2hybAkkMSwgJWVkeAoJbW92bAklZWF4LCAlZWN4CglvcmwJJWVkeCwgJWVjeAoJam56CTZiCglmc3RwCSVzdCgwKQkJLy8gU1QqeAoJcmV0CgoJLyogeSBpcyCxTkFOICovCjMwOglmbGRsCTQoJWVzcCkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmdWNvbXAJJXN0KDEpCQkvLyB4IDogeQoJZm5zdHN3CglzYWhmCglqZQkzMWYKCWZ4Y2gJCQkvLyB5IDogeAozMToJZnN0cAklc3QoMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMzI6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmc3RwCSVzdCgxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CS8vIHkgaXMgYSBsYXJnZSBpbnRlZ2VyIChhYnNvbHV0ZSB2YWx1ZSBhdCBsZWFzdCAxTDw8MTApLCBidXQKCS8vIG1heSBiZSBvZGQgdW5sZXNzIGF0IGxlYXN0IDFMPDw2NC4gIFNvIGl0IG1heSBiZSBuZWNlc3NhcnkKCS8vIHRvIGFkanVzdCB0aGUgc2lnbiBvZiBhIG5lZ2F0aXZlIHJlc3VsdCBhZnRlcndhcmRzLgoJZnhjaAkJCS8vIHggOiB5CglmYWJzCQkJLy8gfHh8IDogeQoJZnhjaAkJCS8vIHkgOiB4CgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCWZ4Y2gJCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZmxkbAlNTyhsaW1pdCkJLy8gMC4yOSA6IDEuMCA6IHggOiB5CglmbGQJJXN0KDIpCQkvLyB4IDogMC4yOSA6IDEuMCA6IHggOiB5Cglmc3ViCSVzdCgyKQkJLy8geC0xIDogMC4yOSA6IDEuMCA6IHggOiB5CglmYWJzCQkJLy8gfHgtMXwgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZ1Y29tcHAJCQkvLyAxLjAgOiB4IDogeQoJZm5zdHN3CglmeGNoCQkJLy8geCA6IDEuMCA6IHkKCXNhaGYKCWphCTdmCglmc3ViCSVzdCgxKQkJLy8geC0xIDogMS4wIDogeQoJZnlsMnhwMQkJCS8vIGxvZzIoeCkgOiB5CglqbXAJOGYKCjc6CWZ5bDJ4CQkJLy8gbG9nMih4KSA6IHkKODoJZm11bAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkKCWZzdAklc3QoMSkJCS8vIHkqbG9nMih4KSA6IHkqbG9nMih4KQoJZnJuZGludAkJCS8vIGludCh5KmxvZzIoeCkpIDogeSpsb2cyKHgpCglmc3Vicgklc3QsICVzdCgxKQkvLyBpbnQoeSpsb2cyKHgpKSA6IGZyYWN0KHkqbG9nMih4KSkKCWZ4Y2gJCQkvLyBmcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWYyeG0xCQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpLTEgOiBpbnQoeSpsb2cyKHgpKQoJZmFkZGwJTU8ob25lKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWZzY2FsZQkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSoyXmludCh5KmxvZzIoeCkpIDogaW50KHkqbG9nMih4KSkKCWZzdHAJJXN0KDEpCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKQoJdGVzdGIJJDIsICVkaAoJanoJMjkyZgoJLy8geCBpcyBuZWdhdGl2ZS4gIElmIHkgaXMgYW4gb2RkIGludGVnZXIsIG5lZ2F0ZSB0aGUgcmVzdWx0LgoJZmxkbAkyMCglZXNwKQkvLyB5IDogYWJzKHJlc3VsdCkKCWZsZAklc3QJCS8vIHkgOiB5IDogYWJzKHJlc3VsdCkKCWZhYnMJCQkvLyB8eXwgOiB5IDogYWJzKHJlc3VsdCkKCWZjb21wbAlNTyhwNjMpCQkvLyB5IDogYWJzKHJlc3VsdCkKCWZuc3RzdwoJc2FoZgoJam5jCTI5MWYKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5IDogYWJzKHJlc3VsdCkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogYWJzKHJlc3VsdCkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkgOiBhYnMocmVzdWx0KQoJZnVjb21wcAkJCS8vIGFicyhyZXN1bHQpCglmbnN0c3cKCXNhaGYKCWpuZQkyOTJmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyOTBmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglmY2hzCjI5MDoJcmV0CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjI5MToJZnN0cAklc3QoMCkJCS8vIGFicyhyZXN1bHQpCjI5MjoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKCXJldAoKCgkvLyBwb3coeCyxMCkgPSAxCgkuYWxpZ24gQUxJR05BUkcoNCkKMTE6CWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhvbmUpCglyZXQKCgkvLyB5ID09ILFpbmYKCS5hbGlnbiBBTElHTkFSRyg0KQoxMjoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkJCS8vIDEKCWZsZGwJNCglZXNwKQkJLy8geCA6IDEKCWZhYnMJCQkvLyBhYnMoeCkgOiAxCglmdWNvbXBwCQkJLy8gPCAxLCA9PSAxLCBvciA+IDEKCWZuc3RzdwoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQ1LCAlYWgKCWplCTEzZgkJLy8ganVtcCBpZiB4IGlzIE5hTgoKCWNtcGIJJDB4NDAsICVhaAoJamUJMTRmCQkvLyBqdW1wIGlmIHx4fCA9PSAxCgoJc2hsYgkkMSwgJWFoCgl4b3JiCSVhaCwgJWRsCglhbmRsCSQyLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgNCkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNDoJZmxkbAlNTyhvbmUpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTM6CWZsZGwJNCglZXNwKQkJLy8gbG9hZCB4ID09IE5hTgoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIHNvIHRlc3QKCS8vIHRoYXQgKGluIHdoaWNoIGNhc2UgeSBpcyBjZXJ0YWlubHkgZXZlbikgYmVmb3JlIHRlc3RpbmcKCS8vIHdoZXRoZXIgeSBpcyBvZGQuCglmbGQJJXN0CQkvLyB5IDogeQoJZmFicwkJCS8vIHx5fCA6IHkKCWZjb21wbAlNTyhwNjMpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkxNmYKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTE3ZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlci4KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMThmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1gobWluZl9temVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNjoJZmNvbXBsCU1PKHplcm8pCglhZGRsCSQ4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoJZm5zdHN3CglzaHJsCSQ1LCAlZWF4CglhbmRsCSQ4LCAlZWF4CglmbGRsCU1PWChpbmZfemVybywgJWVheCwgMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoxNzoJc2hsbAkkMzAsICVlZHgJLy8gc2lnbiBiaXQgZm9yIHkgaW4gcmlnaHQgcG9zaXRpb24KCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjE4OglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1goaW5mX3plcm8sICVlZHgsIDgpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAKMjA6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRsCglqegkyMWYJCS8vIHkgPiAwCgoJLy8geCBpcyCxMCBhbmQgeSBpcyA8IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCXRlc3RiCSQyLCAlZGgKCWp6CTI1ZgoKCS8vIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmxkCSVzdAkJLy8geSA6IHkKCWZhYnMJCQkvLyB8eXwgOiB5CglmY29tcGwJTU8ocDYzKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyN2YJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IG1pbnVzIGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJZmNocwoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyNToJZnN0cAklc3QoMCkKMjY6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI3OgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMCBhbmQgeSBpcyA+IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KMjE6CXRlc3RiCSQyLCAlZGgKCWp6CTIyZgoKCS8vIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLCBzbyB0ZXN0CgkvLyB0aGF0IChpbiB3aGljaCBjYXNlIHkgaXMgY2VydGFpbmx5IGV2ZW4pIGJlZm9yZSB0ZXN0aW5nCgkvLyB3aGV0aGVyIHkgaXMgb2RkLgoJZmNvbWwJTU8ocDYzKQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjJmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjNmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLgoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyNGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCWZsZGwJTU8obXplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjIyOglmc3RwCSVzdCgwKQoyMzoJYWRkbAkkOCwgJWVzcAkvLyBEb24ndCB1c2UgMiB4IHBvcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMjQ6CWZsZGwJTU8oemVybykKCXJldAoKRU5EKF9faWVlZTc1NF9wb3cpCnN0cm9uZ19hbGlhcyAoX19pZWVlNzU0X3BvdywgX19wb3dfZmluaXRlKQo=