LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwNAogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKICAgMDIxMTAtMTMwMSBVU0EuICAqLwoKCiAgICAgICAgLmZpbGUgICAiZV9wb3cuUyIKICAgICAgICAudGV4dAoKCgkuYWxpZ24gNAppbmZfemVybzoKaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweDdmCnplcm86CS5kb3VibGUgMC4wCm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCm9uZToJLmRvdWJsZSAxLjAKbGltaXQ6CS5kb3VibGUgMC4yOQpwNjM6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZTAsIDB4NDMKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVjeCkKI2RlZmluZSBNT1gob3AseCxmKSBvcCMjQEdPVE9GRiglZWN4LHgsZikKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2RlZmluZSBNT1gob3AseCxmKSBvcCgseCxmKQojZW5kaWYKCgkudGV4dAogICAgICAgIC5hbGlnbiA0Ci5nbG9ibCBfcG93CgkuZGVmCV9wb3c7CS5zY2wJMjsJLnR5cGUJMzI7CS5lbmRlZgpfcG93OgoJZmxkbAkxMiglZXNwKQkvLyB5CglmeGFtCgojaWZkZWYJUElDCgljYWxsCTFmCjE6CXBvcGwJJWVjeAoJYWRkbAkkX0dMT0JBTF9PRkZTRVRfVEFCTEVfK1suLTFiXSwgJWVjeAojZW5kaWYKCglmbnN0c3cKCW1vdmIJJWFoLCAlZGwKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCS8vIGlzIHkgPT0gMCA/CglqZQkxMWYKCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSA9PSCxaW5mID8KCWplCTEyZgoKCWNtcGIJJDB4MDEsICVhaAkvLyBpcyB5ID09IE5hTiA/CglqZQkzMGYKCglmbGRsCTQoJWVzcCkJCS8vIHggOiB5CgoJc3VibAkkOCwlZXNwCgoJZnhhbQoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRoCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAoJamUJMjBmCQkvLyB4IGlzILEwCgoJY21wYgkkMHgwNSwgJWFoCglqZQkxNWYJCS8vIHggaXMgsWluZgoKCWZ4Y2gJCQkvLyB5IDogeAoKCS8qIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDYzKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCgoJLyogRmlyc3Qgc2VlIHdoZXRoZXIgYHknIGlzIGEgbmF0dXJhbCBudW1iZXIuICBJbiB0aGlzIGNhc2Ugd2UKCSAgIGNhbiB1c2UgYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmlzdHBsbAkoJWVzcCkJCS8vIHkgOiB4CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5IDogeAoJZnVjb21wCSVzdCgxKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5lCTJmCgoJLyogT0ssIHdlIGhhdmUgYW4gaW50ZWdlciB2YWx1ZSBmb3IgeS4gICovCglwb3BsCSVlYXgKCXBvcGwJJWVkeAoJb3JsCSQwLCAlZWR4Cglmc3RwCSVzdCgwKQkJLy8geAoJam5zCTRmCQkvLyB5ID49IDAsIGp1bXAKCWZkaXZybAlNTyhvbmUpCQkvLyAxL3gJCShub3cgcmVmZXJyZWQgdG8gYXMgeCkKCW5lZ2wJJWVheAoJYWRjbAkkMCwgJWVkeAoJbmVnbAklZWR4CjQ6CWZsZGwJTU8ob25lKQkJLy8gMSA6IHgKCWZ4Y2gKCjY6CXNocmRsCSQxLCAlZWR4LCAlZWF4CglqbmMJNWYKCWZ4Y2gKCWZtdWwJJXN0KDEpCQkvLyB4IDogU1QqeAoJZnhjaAo1OglmbXVsCSVzdCgwKSwgJXN0CS8vIHgqeCA6IFNUKngKCXNocmwJJDEsICVlZHgKCW1vdmwJJWVheCwgJWVjeAoJb3JsCSVlZHgsICVlY3gKCWpuegk2YgoJZnN0cAklc3QoMCkJCS8vIFNUKngKCXJldAoKCS8qIHkgaXMgsU5BTiAqLwozMDoJZmxkbAk0KCVlc3ApCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZnVjb21wCSVzdCgxKQkJLy8geCA6IHkKCWZuc3RzdwoJc2FoZgoJamUJMzFmCglmeGNoCQkJLy8geSA6IHgKMzE6CWZzdHAJJXN0KDEpCglyZXQKCgkuYWxpZ24gNAoyOgkvKiB5IGlzIGEgcmVhbCBudW1iZXIuICAqLwoJZnhjaAkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmbGQJJXN0KDEpCQkvLyB4IDogMS4wIDogeCA6IHkKCWZzdWIJJXN0KDEpCQkvLyB4LTEgOiAxLjAgOiB4IDogeQoJZmFicwkJCS8vIHx4LTF8IDogMS4wIDogeCA6IHkKCWZjb21wbAlNTyhsaW1pdCkJLy8gMS4wIDogeCA6IHkKCWZuc3RzdwoJZnhjaAkJCS8vIHggOiAxLjAgOiB5CglzYWhmCglqYQk3ZgoJZnN1Ygklc3QoMSkJCS8vIHgtMSA6IDEuMCA6IHkKCWZ5bDJ4cDEJCQkvLyBsb2cyKHgpIDogeQoJam1wCThmCgo3OglmeWwyeAkJCS8vIGxvZzIoeCkgOiB5Cjg6CWZtdWwJJXN0KDEpCQkvLyB5KmxvZzIoeCkgOiB5Cglmc3QJJXN0KDEpCQkvLyB5KmxvZzIoeCkgOiB5KmxvZzIoeCkKCWZybmRpbnQJCQkvLyBpbnQoeSpsb2cyKHgpKSA6IHkqbG9nMih4KQoJZnN1YnIJJXN0LCAlc3QoMSkJLy8gaW50KHkqbG9nMih4KSkgOiBmcmFjdCh5KmxvZzIoeCkpCglmeGNoCQkJLy8gZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmMnhtMQkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKS0xIDogaW50KHkqbG9nMih4KSkKCWZhZGRsCU1PKG9uZSkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmc2NhbGUJCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglhZGRsCSQ4LCAlZXNwCglmc3RwCSVzdCgxKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkKCXJldAoKCgkvLyBwb3coeCyxMCkgPSAxCgkuYWxpZ24gNAoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIDQKMTI6CWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAk0KCVlc3ApCQkvLyB4CglmYWJzCglmY29tcGwJTU8ob25lKQkJLy8gPCAxLCA9PSAxLCBvciA+IDEKCWZuc3RzdwoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQ1LCAlYWgKCWplCTEzZgkJLy8ganVtcCBpZiB4IGlzIE5hTgoKCWNtcGIJJDB4NDAsICVhaAoJamUJMTRmCQkvLyBqdW1wIGlmIHx4fCA9PSAxCgoJc2hsYgkkMSwgJWFoCgl4b3JiCSVhaCwgJWRsCglhbmRsCSQyLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgNCkKCXJldAoKCS5hbGlnbiA0CjE0OglmbGRsCU1PKG9uZSkKCXJldAoKCS5hbGlnbiA0CjEzOglmbGRsCTQoJWVzcCkJCS8vIGxvYWQgeCA9PSBOYU4KCXJldAoKCS5hbGlnbiA0CgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAkoJWVzcCkJCS8vIHkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkKCWZ1Y29tcHAJCQkvLyA8ZW1wdHk+CglmbnN0c3cKCXNhaGYKCWpuZQkxN2YKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc21hbGwKCS8vIGVub3VnaCBzbyB0aGF0IGFsbCBhcmUgY29taW5nIGZyb20gdGhlIG1hbnRpc3NhPwoJcG9wbAklZWF4Cglwb3BsCSVlZHgKCWFuZGIJJDEsICVhbAoJanoJMThmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCW1vdmwJJWVkeCwgJWVheAoJb3JsCSVlZHgsICVlZHgKCWpucwkxNTVmCgluZWdsCSVlYXgKMTU1OgljbXBsCSQweDAwMjAwMDAwLCAlZWF4CglqYQkxOGYJCS8vIGRvZXMgbm90IGZpdCBpbiBtYW50aXNzYSBiaXRzCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJc2hybAkkMzEsICVlZHgKCWZsZGwJTU9YKG1pbmZfbXplcm8sICVlZHgsIDgpCglyZXQKCgkuYWxpZ24gNAoxNjoJZmNvbXBsCU1PKHplcm8pCglhZGRsCSQ4LCAlZXNwCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWF4LCAxKQoJcmV0CgoJLmFsaWduIDQKMTc6CXNobGwJJDMwLCAlZWR4CS8vIHNpZ24gYml0IGZvciB5IGluIHJpZ2h0IHBvc2l0aW9uCglhZGRsCSQ4LCAlZXNwCjE4OglzaHJsCSQzMSwgJWVkeAoJZmxkbAlNT1goaW5mX3plcm8sICVlZHgsIDgpCglyZXQKCgkuYWxpZ24gNAoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgdGhlIG51bWJlciBvZiBiaXRzIHNtYWxsCgkvLyBlbm91Z2ggc28gdGhhdCBhbGwgYXJlIGNvbWluZyBmcm9tIHRoZSBtYW50aXNzYT8KCXBvcGwJJWVheAoJcG9wbAklZWR4CglhbmRiCSQxLCAlYWwKCWp6CTI3ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgljbXBsCSQweGZmZTAwMDAwLCAlZWR4CglqYmUJMjdmCQkvLyBkb2VzIG5vdCBmaXQgaW4gbWFudGlzc2EgYml0cwoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IG1pbnVzIGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJZmNocwoJcmV0CgoyNToJZnN0cAklc3QoMCkKMjY6CWFkZGwJJDgsICVlc3AKMjc6CS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJcmV0CgoJLmFsaWduIDQKCS8vIHggaXMgsTAgYW5kIHkgaXMgPiAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCjIxOgl0ZXN0YgkkMiwgJWRoCglqegkyMmYKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAkoJWVzcCkJCS8vIHkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkKCWZ1Y29tcHAJCQkvLyA8ZW1wdHk+CglmbnN0c3cKCXNhaGYKCWpuZQkyM2YKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc21hbGwKCS8vIGVub3VnaCBzbyB0aGF0IGFsbCBhcmUgY29taW5nIGZyb20gdGhlIG1hbnRpc3NhPwoJcG9wbAklZWF4Cglwb3BsCSVlZHgKCWFuZGIJJDEsICVhbAoJanoJMjRmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCWNtcGwJJDB4ZmZlMDAwMDAsICVlZHgKCWphZQkyNGYJCS8vIGRvZXMgbm90IGZpdCBpbiBtYW50aXNzYSBiaXRzCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkbAlNTyhtemVybykKCXJldAoKMjI6CWZzdHAJJXN0KDApCjIzOglhZGRsCSQ4LCAlZXNwCS8vIERvbid0IHVzZSAyIHggcG9wCjI0OglmbGRsCU1PKHplcm8pCglyZXQK