ZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwLy5tYWlsbWFwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvLm1haWxtYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQyNDJhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwLy5tYWlsbWFwCkBAIC0wLDAgKzEsMTIgQEAKKzxqb2hhbm4ua29lbmlnQGR1Y2suY29tPiA8am9oYW5ua29lbmlnQGdvb2dsZS5jb20+CitNaWtvxYJhaiBaYWxld3NraSA8bWlrb2xhanpAZ29vZ2xlLmNvbT4KK1Bhc2NhbCBNYXNzaW1pbm8gPHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tPgorPHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tPiA8c2thbEBnb29nbGUuY29tPgorVmlrYXMgQXJvcmEgPHZpa2FzYUBnb29nbGUuY29tPgorPHZpa2FzYUBnb29nbGUuY29tPiA8dmlrYXNhQGdtYWlsLmNvbT4KKzx2aWthc2FAZ29vZ2xlLmNvbT4gPHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20+Cis8c2xvYm9kYW4ucHJpamljQGltZ3RlYy5jb20+IDxTbG9ib2Rhbi5QcmlqaWNAaW1ndGVjLmNvbT4KKzx2cmFiYXVkQGdvb2dsZS5jb20+IDx2aW5jZW50LnJhYmF1ZEBnbWFpbC5jb20+CitUYW1hciBMZXZ5IDx0YW1hci5sZXZ5QGludGVsLmNvbT4KKzxxcmN6YWtAZ29vZ2xlLmNvbT4gPHFyY3phaz4KK0h1aSBTdSA8aHVpc3VAZ29vZ2xlLmNvbT4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0FVVEhPUlMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzdiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BVVRIT1JTCkBAIC0wLDAgKzEsMzkgQEAKK0NvbnRyaWJ1dG9yczoKKy0gQ2hhcmxlcyBNdW5nZXIgKGNsbSBhdCBnb29nbGUgZG90IGNvbSkKKy0gQ2hyaXN0aWFuIER1dml2aWVyIChjZHV2aXZpZXIgYXQgZ29vZ2xlIGRvdCBjb20pCistIERqb3JkamUgUGVzdXQgKGRqb3JkamUgZG90IHBlc3V0IGF0IGltZ3RlYyBkb3QgY29tKQorLSBIdWkgU3UgKGh1aXN1IGF0IGdvb2dsZSBkb3QgY29tKQorLSBKYW1lcyBaZXJuIChqemVybiBhdCBnb29nbGUgZG90IGNvbSkKKy0gSmFuIEVuZ2VsaGFyZHQgKGplbmdlbGggYXQgbWVkb3phcyBkb3QgZGUpCistIEplaGFuIChqZWhhbiBhdCBnaXJpbnN0dWQgZG90IGlvKQorLSBKb2hhbm4gKGpvaGFubiBkb3Qga29lbmlnIGF0IGR1Y2sgZG90IGNvbSkKKy0gSm92YW4gWmVsaW5jZXZpYyAoam92YW4gZG90IHplbGluY2V2aWMgYXQgaW1ndGVjIGRvdCBjb20pCistIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpIGF0IGdvb2dsZSBkb3QgY29tKQorLSBMb2RlIFZhbmRldmVubmUgKGxvZGUgYXQgZ29vZ2xlIGRvdCBjb20pCistIExvdSBRdWlsbGlvIChsb3VxdWlsbGlvIGF0IGdvb2dsZSBkb3QgY29tKQorLSBNYW5zIFJ1bGxnYXJkIChtYW5zIGF0IG1hbnNyIGRvdCBjb20pCistIE1hcmNpbiBLb3dhbGN6eWsgKHFyY3phayBhdCBnb29nbGUgZG90IGNvbSkKKy0gTWFydGluIE9sc3NvbiAobW5lbW8gYXQgbWluaW11bSBkb3Qgc2UpCistIE1pa2/FgmFqIFphbGV3c2tpIChtaWtvbGFqeiBhdCBnb29nbGUgZG90IGNvbSkKKy0gTWlzbGF2IEJyYWRhYyAobWlzbGF2bSBhdCBnb29nbGUgZG90IGNvbSkKKy0gTmljbyBXZWJlciAodGhha2lzIGF0IGNocm9taXVtIGRvdCBvcmcpCistIE5vZWwgQ2hyb21pdW0gKG5vZWwgYXQgY2hyb21pdW0gZG90IG9yZykKKy0gT3dlbiBSb2RsZXkgKG9yb2RsZXkgYXQgZ29vZ2xlIGRvdCBjb20pCistIFBhcmFnIFNhbGFzYWthciAoaW1nIGRvdCBtaXBzMSBhdCBnbWFpbCBkb3QgY29tKQorLSBQYXNjYWwgTWFzc2ltaW5vIChwYXNjYWwgZG90IG1hc3NpbWlubyBhdCBnbWFpbCBkb3QgY29tKQorLSBQYXdlxYIgSGFqZGFuLCBKciAocGhhamRhbiBkb3QganIgYXQgY2hyb21pdW0gZG90IG9yZykKKy0gUGllcnJlIEpveWUgKHBpZXJyZSBkb3QgcGhwIGF0IGdtYWlsIGRvdCBjb20pCistIFNhbSBDbGVnZyAoc2JjIGF0IGNocm9taXVtIGRvdCBvcmcpCistIFNjb3R0IEhhbmNoZXIgKHNlaCBhdCBnb29nbGUgZG90IGNvbSkKKy0gU2NvdHQgTGFWYXJud2F5IChzbGF2YXJud2F5IGF0IGdvb2dsZSBkb3QgY29tKQorLSBTY290dCBUYWxib3QgKHMgYXQgY2hpa2FjaG93IGRvdCBvcmcpCistIFNsb2JvZGFuIFByaWppYyAoc2xvYm9kYW4gZG90IHByaWppYyBhdCBpbWd0ZWMgZG90IGNvbSkKKy0gU29tbmF0aCBCYW5lcmplZSAoc29tbmF0aCBkb3QgYmFuZXJqZWUgYXQgZ21haWwgZG90IGNvbSkKKy0gU3JpcmFtYW4gVGFsbGFtICh0bXNyaXJhbSBhdCBnb29nbGUgZG90IGNvbSkKKy0gVGFtYXIgTGV2eSAodGFtYXIgZG90IGxldnkgYXQgaW50ZWwgZG90IGNvbSkKKy0gVGltb3RoeSBHdSAodGltb3RoeWd1OTkgYXQgZ21haWwgZG90IGNvbSkKKy0gVXJ2YW5nIEpvc2hpICh1cnZhbmcgYXQgZ29vZ2xlIGRvdCBjb20pCistIFZpa2FzIEFyb3JhICh2aWthc2EgYXQgZ29vZ2xlIGRvdCBjb20pCistIFZpbmNlbnQgUmFiYXVkICh2cmFiYXVkIGF0IGdvb2dsZSBkb3QgY29tKQorLSBWbGFkIFRzeXJrbGV2aWNoICh2dHN5cmtsZXZpY2ggYXQgY2hyb21pdW0gZG90IG9yZykKKy0gWWFuZyBaaGFuZyAoeWFuZyBkb3QgemhhbmcgYXQgYXJtIGRvdCBjb20pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9BbmRyb2lkLm1rIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzUyZjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI4MCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitXRUJQX0NGTEFHUyA6PSAtV2FsbCAtREFORFJPSUQgLURIQVZFX01BTExPQ19IIC1ESEFWRV9QVEhSRUFEIC1EV0VCUF9VU0VfVEhSRUFECitXRUJQX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCisKK2lmZXEgKCQoQVBQX09QVElNKSxyZWxlYXNlKQorICBXRUJQX0NGTEFHUyArPSAtZmlubGluZS1mdW5jdGlvbnMgLWZmYXN0LW1hdGggXAorICAgICAgICAgICAgICAgICAtZmZ1bmN0aW9uLXNlY3Rpb25zIC1mZGF0YS1zZWN0aW9ucworICBpZmVxICgkKGZpbmRzdHJpbmcgY2xhbmcsJChOREtfVE9PTENIQUlOX1ZFUlNJT04pKSwpCisgICAgV0VCUF9DRkxBR1MgKz0gLWZyZW5hbWUtcmVnaXN0ZXJzIC1zCisgIGVuZGlmCitlbmRpZgorCisjIG1pcHMzMiBmYWlscyB0byBidWlsZCB3aXRoIGNsYW5nIGZyb20gcjE0YgorIyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicC9pc3N1ZXMvZGV0YWlsP2lkPTM0MworaWZlcSAoJChmaW5kc3RyaW5nIGNsYW5nLCQoTkRLX1RPT0xDSEFJTl9WRVJTSU9OKSksY2xhbmcpCisgIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLG1pcHMpCisgICAgY2xhbmdfdmVyc2lvbiA6PSAkKHNoZWxsICQoVEFSR0VUX0NDKSAtLXZlcnNpb24pCisgICAgaWZuZXEgKCQoZmluZHN0cmluZyBjbGFuZyB2ZXJzaW9uIDMsJChjbGFuZ192ZXJzaW9uKSksKQorICAgICAgV0VCUF9DRkxBR1MgKz0gLW5vLWludGVncmF0ZWQtYXMKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKworaWZuZXEgKCQoZmluZHN0cmluZyBhcm1lYWJpLXY3YSwgJChUQVJHRVRfQVJDSF9BQkkpKSwpCisgICMgU2V0dGluZyBMT0NBTF9BUk1fTkVPTiB3aWxsIGVuYWJsZSAtbWZwdT1uZW9uIHdoaWNoIG1heSBjYXVzZSBpbGxlZ2FsCisgICMgaW5zdHJ1Y3Rpb25zIHRvIGJlIGdlbmVyYXRlZCBmb3IgYXJtdjdhIGNvZGUuIEluc3RlYWQgdGFyZ2V0IHRoZSBuZW9uIGNvZGUKKyAgIyBzcGVjaWZpY2FsbHkuCisgIE5FT04gOj0gYy5uZW9uCisgIFVTRV9DUFVGRUFUVVJFUyA6PSB5ZXMKKyAgV0VCUF9DRkxBR1MgKz0gLURIQVZFX0NQVV9GRUFUVVJFU19ICitlbHNlCisgIE5FT04gOj0gYworZW5kaWYKKworZGVjX3NyY3MgOj0gXAorICAgIHNyYy9kZWMvYWxwaGFfZGVjLmMgXAorICAgIHNyYy9kZWMvYnVmZmVyX2RlYy5jIFwKKyAgICBzcmMvZGVjL2ZyYW1lX2RlYy5jIFwKKyAgICBzcmMvZGVjL2lkZWNfZGVjLmMgXAorICAgIHNyYy9kZWMvaW9fZGVjLmMgXAorICAgIHNyYy9kZWMvcXVhbnRfZGVjLmMgXAorICAgIHNyYy9kZWMvdHJlZV9kZWMuYyBcCisgICAgc3JjL2RlYy92cDhfZGVjLmMgXAorICAgIHNyYy9kZWMvdnA4bF9kZWMuYyBcCisgICAgc3JjL2RlYy93ZWJwX2RlYy5jIFwKKworZGVtdXhfc3JjcyA6PSBcCisgICAgc3JjL2RlbXV4L2FuaW1fZGVjb2RlLmMgXAorICAgIHNyYy9kZW11eC9kZW11eC5jIFwKKworZHNwX2RlY19zcmNzIDo9IFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMgXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jIFwKKyAgICBzcmMvZHNwL2NwdS5jIFwKKyAgICBzcmMvZHNwL2RlYy5jIFwKKyAgICBzcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5jIFwKKyAgICBzcmMvZHNwL2RlY19taXBzMzIuYyBcCisgICAgc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC9kZWNfbXNhLmMgXAorICAgIHNyYy9kc3AvZGVjX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9kZWNfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2RlY19zc2U0MS5jIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnMuYyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvZmlsdGVyc19tc2EuYyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX25lb24uJChORU9OKSBcCisgICAgc3JjL2RzcC9maWx0ZXJzX3NzZTIuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzcy5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbXNhLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX3NzZTIuYyBcCisgICAgc3JjL2RzcC9yZXNjYWxlci5jIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX21pcHNfZHNwX3IyLmMgXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbXNhLmMgXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyX3NzZTIuYyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nLmMgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLmMgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19uZW9uLiQoTkVPTikgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19zc2UyLmMgXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19zc2U0MS5jIFwKKyAgICBzcmMvZHNwL3l1di5jIFwKKyAgICBzcmMvZHNwL3l1dl9taXBzMzIuYyBcCisgICAgc3JjL2RzcC95dXZfbWlwc19kc3BfcjIuYyBcCisgICAgc3JjL2RzcC95dXZfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL3l1dl9zc2UyLmMgXAorICAgIHNyYy9kc3AveXV2X3NzZTQxLmMgXAorCitkc3BfZW5jX3NyY3MgOj0gXAorICAgIHNyYy9kc3AvY29zdC5jIFwKKyAgICBzcmMvZHNwL2Nvc3RfbWlwczMyLmMgXAorICAgIHNyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2Nvc3Rfc3NlMi5jIFwKKyAgICBzcmMvZHNwL2VuYy5jIFwKKyAgICBzcmMvZHNwL2VuY19hdngyLmMgXAorICAgIHNyYy9kc3AvZW5jX21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL2VuY19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2VuY19tc2EuYyBcCisgICAgc3JjL2RzcC9lbmNfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2VuY19zc2UyLmMgXAorICAgIHNyYy9kc3AvZW5jX3NzZTQxLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EuYyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi4kKE5FT04pIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMgXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMgXAorICAgIHNyYy9kc3Avc3NpbS5jIFwKKyAgICBzcmMvZHNwL3NzaW1fc3NlMi5jIFwKKworZW5jX3NyY3MgOj0gXAorICAgIHNyYy9lbmMvYWxwaGFfZW5jLmMgXAorICAgIHNyYy9lbmMvYW5hbHlzaXNfZW5jLmMgXAorICAgIHNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jIFwKKyAgICBzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmMgXAorICAgIHNyYy9lbmMvY29uZmlnX2VuYy5jIFwKKyAgICBzcmMvZW5jL2Nvc3RfZW5jLmMgXAorICAgIHNyYy9lbmMvZmlsdGVyX2VuYy5jIFwKKyAgICBzcmMvZW5jL2ZyYW1lX2VuYy5jIFwKKyAgICBzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYyBcCisgICAgc3JjL2VuYy9pdGVyYXRvcl9lbmMuYyBcCisgICAgc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfZW5jLmMgXAorICAgIHNyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMgXAorICAgIHNyYy9lbmMvcGljdHVyZV9wc25yX2VuYy5jIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3Rvb2xzX2VuYy5jIFwKKyAgICBzcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYyBcCisgICAgc3JjL2VuYy9xdWFudF9lbmMuYyBcCisgICAgc3JjL2VuYy9zeW50YXhfZW5jLmMgXAorICAgIHNyYy9lbmMvdG9rZW5fZW5jLmMgXAorICAgIHNyYy9lbmMvdHJlZV9lbmMuYyBcCisgICAgc3JjL2VuYy92cDhsX2VuYy5jIFwKKyAgICBzcmMvZW5jL3dlYnBfZW5jLmMgXAorCittdXhfc3JjcyA6PSBcCisgICAgc3JjL211eC9hbmltX2VuY29kZS5jIFwKKyAgICBzcmMvbXV4L211eGVkaXQuYyBcCisgICAgc3JjL211eC9tdXhpbnRlcm5hbC5jIFwKKyAgICBzcmMvbXV4L211eHJlYWQuYyBcCisKK3V0aWxzX2RlY19zcmNzIDo9IFwKKyAgICBzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3JhbmRvbV91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3RocmVhZF91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvdXRpbHMuYyBcCisKK3V0aWxzX2VuY19zcmNzIDo9IFwKKyAgICBzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5jIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuYyBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jIFwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGlid2VicGRlY29kZXIKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgJChkZWNfc3JjcykgXAorICAgICQoZHNwX2RlY19zcmNzKSBcCisgICAgJCh1dGlsc19kZWNfc3JjcykgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChMT0NBTF9QQVRIKS9zcmMKKworIyBwcmVmZXIgYXJtIG92ZXIgdGh1bWIgbW9kZSBmb3IgcGVyZm9ybWFuY2UgZ2FpbnMKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitpZmVxICgkKFVTRV9DUFVGRUFUVVJFUykseWVzKQorICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGNwdWZlYXR1cmVzCitlbmRpZgorCitMT0NBTF9NT0RVTEUgOj0gd2VicGRlY29kZXJfc3RhdGljCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaWZlcSAoJChFTkFCTEVfU0hBUkVEKSwxKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gd2VicGRlY29kZXJfc3RhdGljCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwZGVjb2RlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCitlbmRpZiAgIyBFTkFCTEVfU0hBUkVEPTEKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGlid2VicAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAkKGRzcF9lbmNfc3JjcykgXAorICAgICQoZW5jX3NyY3MpIFwKKyAgICAkKHV0aWxzX2VuY19zcmNzKSBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYworCisjIHByZWZlciBhcm0gb3ZlciB0aHVtYiBtb2RlIGZvciBwZXJmb3JtYW5jZSBnYWlucworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1dIT0xFX1NUQVRJQ19MSUJSQVJJRVMgOj0gd2VicGRlY29kZXJfc3RhdGljCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwCisKK2lmZXEgKCQoRU5BQkxFX1NIQVJFRCksMSkKKyAgaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorZWxzZQorICBpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCitlbmRpZgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJ3ZWJwZGVtdXgKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKGRlbXV4X3NyY3MpCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYworCisjIHByZWZlciBhcm0gb3ZlciB0aHVtYiBtb2RlIGZvciBwZXJmb3JtYW5jZSBnYWlucworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwZGVtdXgKKworaWZlcSAoJChFTkFCTEVfU0hBUkVEKSwxKQorICBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IHdlYnAKKyAgaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorZWxzZQorICBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IHdlYnAKKyAgaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorZW5kaWYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGlid2VicG11eAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9ICQobXV4X3NyY3MpCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyArPSAkKExPQ0FMX1BBVEgpL3NyYworCisjIHByZWZlciBhcm0gb3ZlciB0aHVtYiBtb2RlIGZvciBwZXJmb3JtYW5jZSBnYWlucworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwbXV4CisKK2lmZXEgKCQoRU5BQkxFX1NIQVJFRCksMSkKKyAgTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSB3ZWJwCisgIGluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKK2Vsc2UKKyAgTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSB3ZWJwCisgIGluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKK2VuZGlmCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK1dFQlBfU1JDX1BBVEggOj0gJChMT0NBTF9QQVRIKQoraW5jbHVkZSAkKFdFQlBfU1JDX1BBVEgpL2ltYWdlaW8vQW5kcm9pZC5taworaW5jbHVkZSAkKFdFQlBfU1JDX1BBVEgpL2V4YW1wbGVzL0FuZHJvaWQubWsKKworaWZlcSAoJChVU0VfQ1BVRkVBVFVSRVMpLHllcykKKyAgJChjYWxsIGltcG9ydC1tb2R1bGUsYW5kcm9pZC9jcHVmZWF0dXJlcykKK2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DTWFrZUxpc3RzLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NNYWtlTGlzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjYzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDM3MSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOC43KQorCitwcm9qZWN0KGxpYndlYnAgQykKKworIyBPcHRpb25zIGZvciBjb2RlciAvIGRlY29kZXIgZXhlY3V0YWJsZXMuCitvcHRpb24oV0VCUF9FTkFCTEVfU0lNRCAiRW5hYmxlIGFueSBTSU1EIG9wdGltaXphdGlvbi4iIE9OKQorb3B0aW9uKFdFQlBfQlVJTERfQ1dFQlAgIkJ1aWxkIHRoZSBjd2VicCBjb21tYW5kIGxpbmUgdG9vbC4iIE9GRikKK29wdGlvbihXRUJQX0JVSUxEX0RXRUJQICJCdWlsZCB0aGUgZHdlYnAgY29tbWFuZCBsaW5lIHRvb2wuIiBPRkYpCitvcHRpb24oV0VCUF9CVUlMRF9HSUYyV0VCUCAiQnVpbGQgdGhlIGdpZjJ3ZWJwIGNvbnZlcnNpb24gdG9vbC4iIE9GRikKK29wdGlvbihXRUJQX0JVSUxEX0lNRzJXRUJQICJCdWlsZCB0aGUgaW1nMndlYnAgYW5pbWF0aW9uIHRvb2wuIiBPRkYpCitvcHRpb24oV0VCUF9CVUlMRF9XRUJQSU5GTyAiQnVpbGQgdGhlIHdlYnBpbmZvIGNvbW1hbmQgbGluZSB0b29sLiIgT0ZGKQorb3B0aW9uKFdFQlBfQlVJTERfV0VCUF9KUyAiRW1zY3JpcHRlbiBidWlsZCBvZiB3ZWJwLmpzLiIgT0ZGKQorb3B0aW9uKFdFQlBfTkVBUl9MT1NTTEVTUyAiRW5hYmxlIG5lYXItbG9zc2xlc3MgZW5jb2RpbmciIE9OKQorb3B0aW9uKFdFQlBfRU5BQkxFX1NXQVBfMTZCSVRfQ1NQICJFbmFibGUgYnl0ZSBzd2FwIGZvciAxNiBiaXQgY29sb3JzcGFjZXMuIiBPRkYpCisKK2lmKFdFQlBfQlVJTERfV0VCUF9KUykKKyAgc2V0KFdFQlBfRU5BQkxFX1NJTUQgT0ZGKQorZW5kaWYoKQorCitzZXQoV0VCUF9ERVBfTElCUkFSSUVTKQorc2V0KFdFQlBfREVQX0lOQ0xVREVfRElSUykKKworaWYoTk9UIENNQUtFX0JVSUxEX1RZUEUpCisgIHNldChDTUFLRV9CVUlMRF9UWVBFICJSZWxlYXNlIiBDQUNIRQorICAgICJCdWlsZCB0eXBlOiBSZWxlYXNlLCBEZWJ1ZyBvciBSZWxXaXRoRGViSW5mbyIgU1RSSU5HIEZPUkNFCisgICkKK2VuZGlmKCkKKworIyBJbmNsdWRlIGRlcGVuZGVuY2llcy4KK2luY2x1ZGUoY21ha2UvZGVwcy5jbWFrZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgT3B0aW9ucy4KK2lmKFdFQlBfRU5BQkxFX1NXQVBfMTZCSVRfQ1NQKQorICBhZGRfZGVmaW5pdGlvbnMoLURXRUJQX1NXQVBfMTZCSVRfQ1NQPTEpCitlbmRpZigpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFuZHJvaWQgb25seS4KK2lmKEFORFJPSUQpCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtBTkRST0lEX05ES30vc291cmNlcy9hbmRyb2lkL2NwdWZlYXR1cmVzKQorICBhZGRfbGlicmFyeShjcHVmZWF0dXJlcyBTVEFUSUMKKyAgICAke0FORFJPSURfTkRLfS9zb3VyY2VzL2FuZHJvaWQvY3B1ZmVhdHVyZXMvY3B1LWZlYXR1cmVzLmMKKyAgKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoY3B1ZmVhdHVyZXMgZGwpCisgIHNldChXRUJQX0RFUF9MSUJSQVJJRVMgJHtXRUJQX0RFUF9MSUJSQVJJRVN9IGNwdWZlYXR1cmVzKQorICBzZXQoV0VCUF9ERVBfSU5DTFVERV9ESVJTICR7V0VCUF9ERVBfSU5DTFVERV9ESVJTfQorICAgICR7QU5EUk9JRF9OREt9L3NvdXJjZXMvYW5kcm9pZC9jcHVmZWF0dXJlcworICApCisgIGFkZF9kZWZpbml0aW9ucygtREhBVkVfQ1BVX0ZFQVRVUkVTX0g9MSkKKyAgc2V0KEhBVkVfQ1BVX0ZFQVRVUkVTX0ggMSkKK2Vsc2UoKQorICBzZXQoSEFWRV9DUFVfRkVBVFVSRVNfSCAwKQorZW5kaWYoKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBXZWJQIHNvdXJjZSBmaWxlcy4KKyMgUmVhZCB0aGUgTWFrZWZpbGUuYW0gdG8gZ2V0IHRoZSBzb3VyY2UgZmlsZXMuCisKKyMgV2UgZXhwZWN0IHRoZSBNYWtlZmlsZXMgdG8gZGVmaW5lIHRoZSBzb3VyY2VzIGFzIGRlZmluZWQgaW4KKyMgdGhlIGZpcnN0IHJlZ2V4LiBFLmcuOgorIyBsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICA9IGltYWdlX2RlYy5jIGltYWdlX2RlYy5oCitmdW5jdGlvbihwYXJzZV9NYWtlZmlsZV9hbSBGT0xERVIgVkFSIFNSQ19SRUdFWCkKKyAgZmlsZShSRUFEICR7Rk9MREVSfS9NYWtlZmlsZS5hbSBNQUtFRklMRV9BTSkKKyAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICIke1NSQ19SRUdFWH1fU09VUkNFU1sgXSpcXCs/PVsgXStbMC05YS16XFwuXyBdKiIKKyAgICBGSUxFU19QRVJfTElORSAke01BS0VGSUxFX0FNfQorICApCisgIHNldChTUkNTICR7JHtWQVJ9fSkKKyAgZm9yZWFjaChGSUxFUyAke0ZJTEVTX1BFUl9MSU5FfSkKKyAgICBzdHJpbmcoRklORCAke0ZJTEVTfSAiPSIgT0ZGU0VUKQorICAgIG1hdGgoRVhQUiBPRkZTRVQgIiR7T0ZGU0VUfSArIDIiKQorICAgIHN0cmluZyhTVUJTVFJJTkcgJHtGSUxFU30gJHtPRkZTRVR9IC0xIEZJTEVTKQorICAgIGlmKEZJTEVTKQorICAgICAgc3RyaW5nKFJFR0VYIE1BVENIQUxMICJbMC05YS16XFwuX10rIgorICAgICAgICBGSUxFUyAke0ZJTEVTfQorICAgICAgKQorICAgICAgZm9yZWFjaChGSUxFICR7RklMRVN9KQorICAgICAgICBsaXN0KEFQUEVORCBTUkNTICR7Rk9MREVSfS8ke0ZJTEV9KQorICAgICAgZW5kZm9yZWFjaCgpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgc2V0KCR7VkFSfSAke1NSQ1N9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworc2V0KFdFQlBfU1JDX0RJUiAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L2RlYyAiV0VCUF9ERUNfU1JDUyIgIiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZGVtdXggIldFQlBfREVNVVhfU1JDUyIgIiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZHNwICJXRUJQX0RTUF9DT01NT05fU1JDUyIgIkNPTU1PTiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZHNwICJXRUJQX0RTUF9FTkNfU1JDUyIgIkVOQyIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZHNwICJXRUJQX0RTUF9FTkNfU1JDUyIgImRzcF9bXiBdKiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZHNwICJXRUJQX0RTUF9ERUNfU1JDUyIgImRlY29kZV9bXiBdKiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vZW5jICJXRUJQX0VOQ19TUkNTIiAiIikKK3BhcnNlX01ha2VmaWxlX2FtKCR7V0VCUF9TUkNfRElSfS91dGlscyAiV0VCUF9VVElMU19DT01NT05fU1JDUyIgIkNPTU1PTiIpCitwYXJzZV9NYWtlZmlsZV9hbSgke1dFQlBfU1JDX0RJUn0vdXRpbHMgIldFQlBfVVRJTFNfRU5DX1NSQ1MiICJFTkMiKQorcGFyc2VfTWFrZWZpbGVfYW0oJHtXRUJQX1NSQ19ESVJ9L3V0aWxzICJXRUJQX1VUSUxTX0RFQ19TUkNTIiAiZGVjb2RlX1teIF0qIikKKworIyBSZW1vdmUgdGhlIGZpbGVzIHNwZWNpZmljIHRvIFNJTUQgd2UgZG9uJ3QgdXNlLgorZm9yZWFjaChGSUxFICR7V0VCUF9TSU1EX0ZJTEVTX05PVF9UT19JTkNMVURFfSkKKyAgbGlzdChSRU1PVkVfSVRFTSBXRUJQX0RTUF9FTkNfU1JDUyAke0ZJTEV9KQorICBsaXN0KFJFTU9WRV9JVEVNIFdFQlBfRFNQX0RFQ19TUkNTICR7RklMRX0pCitlbmRmb3JlYWNoKCkKKworIyMjIERlZmluZSB0aGUgbWFuZGF0b3J5IGxpYnJhcmllcy4KKyMgQnVpbGQgdGhlIHdlYnBkZWNvZGVyIGxpYnJhcnkuCitpZihNU1ZDKQorICAjIGF2b2lkIHNlY3VyaXR5IHdhcm5pbmdzIGZvciBlLmcuLCBmb3BlbigpIHVzZWQgaW4gdGhlIGV4YW1wbGVzLgorICBhZGRfZGVmaW5pdGlvbnMoLURfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUykKK2Vsc2UoKQorICBhZGRfZGVmaW5pdGlvbnMoLVdhbGwpCitlbmRpZigpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSAke1dFQlBfREVQX0lOQ0xVREVfRElSU30pCithZGRfbGlicmFyeSh3ZWJwZGVjb2RlIE9CSkVDVCAke1dFQlBfREVDX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicGRzcGRlY29kZSBPQkpFQ1QgJHtXRUJQX0RTUF9DT01NT05fU1JDU30gJHtXRUJQX0RTUF9ERUNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwdXRpbHNkZWNvZGUgT0JKRUNUICR7V0VCUF9VVElMU19DT01NT05fU1JDU30KKyAgJHtXRUJQX1VUSUxTX0RFQ19TUkNTfSkKK2FkZF9saWJyYXJ5KHdlYnBkZWNvZGVyICQ8VEFSR0VUX09CSkVDVFM6d2VicGRlY29kZT4KKyAgJDxUQVJHRVRfT0JKRUNUUzp3ZWJwZHNwZGVjb2RlPiAkPFRBUkdFVF9PQkpFQ1RTOndlYnB1dGlsc2RlY29kZT4pCit0YXJnZXRfbGlua19saWJyYXJpZXMod2VicGRlY29kZXIgJHtXRUJQX0RFUF9MSUJSQVJJRVN9KQorCisjIEJ1aWxkIHRoZSB3ZWJwIGxpYnJhcnkuCithZGRfbGlicmFyeSh3ZWJwZW5jb2RlIE9CSkVDVCAke1dFQlBfRU5DX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicGRzcCBPQkpFQ1QgJHtXRUJQX0RTUF9DT01NT05fU1JDU30gJHtXRUJQX0RTUF9ERUNfU1JDU30KKyAgJHtXRUJQX0RTUF9FTkNfU1JDU30pCithZGRfbGlicmFyeSh3ZWJwdXRpbHMgT0JKRUNUICR7V0VCUF9VVElMU19DT01NT05fU1JDU30gJHtXRUJQX1VUSUxTX0RFQ19TUkNTfQorICAke1dFQlBfVVRJTFNfRU5DX1NSQ1N9KQorYWRkX2xpYnJhcnkod2VicCAkPFRBUkdFVF9PQkpFQ1RTOndlYnBkZWNvZGU+ICQ8VEFSR0VUX09CSkVDVFM6d2VicGRzcD4KKyAgJDxUQVJHRVRfT0JKRUNUUzp3ZWJwZW5jb2RlPiAkPFRBUkdFVF9PQkpFQ1RTOndlYnB1dGlscz4pCit0YXJnZXRfbGlua19saWJyYXJpZXMod2VicCAke1dFQlBfREVQX0xJQlJBUklFU30pCisKKyMgTWFrZSBzdXJlIHRoZSBPQkpFQ1QgbGlicmFyaWVzIGFyZSBidWlsdCB3aXRoIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUKKyMgKGl0IGlzIG5vdCBPTiBieSBkZWZhdWx0KS4KK3NldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwZGVjb2RlIHdlYnBkc3BkZWNvZGUgd2VicHV0aWxzZGVjb2RlCisgIHdlYnBlbmNvZGUgd2VicGRzcCB3ZWJwdXRpbHMgUFJPUEVSVElFUyBQT1NJVElPTl9JTkRFUEVOREVOVF9DT0RFIE9OKQorCisjIEJ1aWxkIHRoZSB3ZWJwIGRlbXV4IGxpYnJhcnkuCithZGRfbGlicmFyeSh3ZWJwZGVtdXggJHtXRUJQX0RFTVVYX1NSQ1N9KQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBkZW11eCB3ZWJwKQorCisjIFNldCB0aGUgdmVyc2lvbiBudW1iZXJzLgorZnVuY3Rpb24ocGFyc2VfdmVyc2lvbiBGSUxFIE5BTUUgVkFSKQorICBmaWxlKFJFQUQgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy8ke0ZJTEV9IFNPVVJDRV9GSUxFKQorICBzdHJpbmcoUkVHRVggTUFUQ0ggIiR7TkFNRX1fbGFfTERGTEFHU1teXG5dKiAtdmVyc2lvbi1pbmZvIFswLTk6XSsiIFRNUAorICAgICR7U09VUkNFX0ZJTEV9KQorICBzdHJpbmcoUkVHRVggTUFUQ0ggIlswLTk6XSsiIFRNUCAke1RNUH0pCisgIHN0cmluZyhSRUdFWCBSRVBMQUNFICI6IiAiLiIgVkVSU0lPTiAke1RNUH0pCisgIHNldCgke1ZBUn0gIiR7VkVSU0lPTn0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKK3BhcnNlX3ZlcnNpb24oTWFrZWZpbGUuYW0gd2VicCBXRUJQX1dFQlBfU09WRVJTSU9OKQorc2V0X3RhcmdldF9wcm9wZXJ0aWVzKHdlYnAgUFJPUEVSVElFUyBWRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfQorICBTT1ZFUlNJT04gJHtXRUJQX1dFQlBfU09WRVJTSU9OfSkKK3BhcnNlX3ZlcnNpb24oTWFrZWZpbGUuYW0gd2VicGRlY29kZXIgV0VCUF9ERUNPREVSX1NPVkVSU0lPTikKK3NldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwZGVjb2RlciBQUk9QRVJUSUVTIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059CisgIFNPVkVSU0lPTiAke1dFQlBfREVDT0RFUl9TT1ZFUlNJT059KQorcGFyc2VfdmVyc2lvbihkZW11eC9NYWtlZmlsZS5hbSB3ZWJwZGVtdXggV0VCUF9ERU1VWF9TT1ZFUlNJT04pCitzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicGRlbXV4IFBST1BFUlRJRVMgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0KKyAgU09WRVJTSU9OICR7V0VCUF9ERU1VWF9TT1ZFUlNJT059KQorCisjIERlZmluZSB0aGUgbGlicmFyaWVzIHRvIGluc3RhbGwuCitzZXQoSU5TVEFMTEVEX0xJQlJBUklFUyB3ZWJwZGVjb2RlciB3ZWJwIHdlYnBkZW11eCkKKworIyMjIERlYWwgd2l0aCBTSU1ELgorIyBDaGFuZ2UgdGhlIGNvbXBpbGUgZmxhZ3MgZm9yIFNJTUQgZmlsZXMgd2UgdXNlLgorbGlzdChMRU5HVEggV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREUgV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREVfTEVOR1RIKQorbWF0aChFWFBSIFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFX1JBTkdFCisgICIke1dFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFX0xFTkdUSH0tMSIKKykKKworZm9yZWFjaChJX0ZJTEUgUkFOR0UgJHtXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERV9SQU5HRX0pCisgIGxpc3QoR0VUIFdFQlBfU0lNRF9GSUxFU19UT19JTkNMVURFICR7SV9GSUxFfSBGSUxFKQorICBsaXN0KEdFVCBXRUJQX1NJTURfRkxBR1NfVE9fSU5DTFVERSAke0lfRklMRX0gU0lNRF9DT01QSUxFX0ZMQUcpCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0ZJTEV9IFBST1BFUlRJRVMKKyAgICBDT01QSUxFX0ZMQUdTICR7U0lNRF9DT01QSUxFX0ZMQUd9CisgICkKK2VuZGZvcmVhY2goKQorCisjIEJ1aWxkIHRoZSBleGVjdXRhYmxlcyBpZiBhc2tlZCBmb3IuCitpZihXRUJQX0JVSUxEX0NXRUJQIE9SIFdFQlBfQlVJTERfRFdFQlAgT1IKKyAgIFdFQlBfQlVJTERfR0lGMldFQlAgT1IgV0VCUF9CVUlMRF9JTUcyV0VCUCBPUiBXRUJQX0JVSUxEX1dFQlBfSlMpCisgICMgRXhhbXBsZSB1dGlsaXR5IGxpYnJhcnkuCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiRVhBTVBMRVVUSUxfU1JDUyIKKyAgICAiZXhhbXBsZV91dGlsX1teIF0qIikKKyAgbGlzdChBUFBFTkQgRVhBTVBMRVVUSUxfU1JDUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcy9zdG9wd2F0Y2guaCkKKyAgYWRkX2xpYnJhcnkoZXhhbXBsZXV0aWwgJHtFWEFNUExFVVRJTF9TUkNTfSkKKworICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vaW1hZ2VpbyAiSU1BR0VJT1VUSUxTX1NSQ1MiCisgICAgImltYWdlaW9fdXRpbF9bXiBdKiIpCisgIGFkZF9saWJyYXJ5KGltYWdlaW91dGlsICR7SU1BR0VJT1VUSUxTX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoaW1hZ2Vpb3V0aWwgd2VicCkKKworICAjIEltYWdlLWRlY29kaW5nIHV0aWxpdHkgbGlicmFyeS4KKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2ltYWdlaW8gIklNQUdFREVDX1NSQ1MiCisgICAgImltYWdlZGVjX1teIF0qIikKKyAgYWRkX2xpYnJhcnkoaW1hZ2VkZWMgJHtJTUFHRURFQ19TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGltYWdlZGVjIGltYWdlaW91dGlsIHdlYnBkZW11eCB3ZWJwCisgICAgJHtXRUJQX0RFUF9JTUdfTElCUkFSSUVTfSkKKworICAjIEltYWdlLWVuY29kaW5nIHV0aWxpdHkgbGlicmFyeS4KKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2ltYWdlaW8gIklNQUdFRU5DX1NSQ1MiCisgICAgImltYWdlZW5jX1teIF0qIikKKyAgYWRkX2xpYnJhcnkoaW1hZ2VlbmMgJHtJTUFHRUVOQ19TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGltYWdlZW5jIHdlYnApCisKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCBleGFtcGxldXRpbCBpbWFnZWlvdXRpbCBpbWFnZWRlYyBpbWFnZWVuYworICAgIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfRFdFQlApCisgICMgZHdlYnAKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1dFQlBfREVQX0lNR19JTkNMVURFX0RJUlN9KQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIkRXRUJQX1NSQ1MiCisgICAgImR3ZWJwIikKKyAgYWRkX2V4ZWN1dGFibGUoZHdlYnAgJHtEV0VCUF9TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGR3ZWJwIGV4YW1wbGV1dGlsIGltYWdlZGVjIGltYWdlZW5jIHdlYnBkZWNvZGVyKQorICBpbnN0YWxsKFRBUkdFVFMgZHdlYnAgUlVOVElNRSBERVNUSU5BVElPTiBiaW4pCisgIHNldF9wcm9wZXJ0eShUQVJHRVQgZHdlYnAgUFJPUEVSVFkgSU5DTFVERV9ESVJFQ1RPUklFUworICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3NyYykKK2VuZGlmKCkKKworaWYoV0VCUF9CVUlMRF9DV0VCUCkKKyAgIyBjd2VicAorICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSU30pCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiQ1dFQlBfU1JDUyIKKyAgICAiY3dlYnAiKQorICBhZGRfZXhlY3V0YWJsZShjd2VicCAke0NXRUJQX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMoY3dlYnAgZXhhbXBsZXV0aWwgaW1hZ2VkZWMgd2VicCkKKyAgaW5zdGFsbChUQVJHRVRTIGN3ZWJwIFJVTlRJTUUgREVTVElOQVRJT04gYmluKQorICBzZXRfcHJvcGVydHkoVEFSR0VUIGN3ZWJwIFBST1BFUlRZIElOQ0xVREVfRElSRUNUT1JJRVMKKyAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9zcmMpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfR0lGMldFQlAgQU5EIE5PVCBHSUZfRk9VTkQpCisgIHVuc2V0KFdFQlBfQlVJTERfR0lGMldFQlAgQ0FDSEUpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfR0lGMldFQlAgT1IgV0VCUF9CVUlMRF9JTUcyV0VCUCkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy9tdXggIldFQlBfTVVYX1NSQ1MiCisgICAgIiIpCisgIGFkZF9saWJyYXJ5KHdlYnBtdXggJHtXRUJQX01VWF9TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKHdlYnBtdXggd2VicCkKKyAgcGFyc2VfdmVyc2lvbihtdXgvTWFrZWZpbGUuYW0gd2VicG11eCBXRUJQX01VWF9TT1ZFUlNJT04pCisgIHNldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwbXV4IFBST1BFUlRJRVMgVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0KKyAgICBTT1ZFUlNJT04gJHtXRUJQX01VWF9TT1ZFUlNJT059KQorICBsaXN0KEFQUEVORCBJTlNUQUxMRURfTElCUkFSSUVTIHdlYnBtdXgpCitlbmRpZigpCisKK2lmKFdFQlBfQlVJTERfR0lGMldFQlApCisgICMgZ2lmMndlYnAKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke1dFQlBfREVQX0dJRl9JTkNMVURFX0RJUlN9KQorICBwYXJzZV9NYWtlZmlsZV9hbSgke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXhhbXBsZXMgIkdJRjJXRUJQX1NSQ1MiCisgICAgImdpZjJ3ZWJwIikKKyAgYWRkX2V4ZWN1dGFibGUoZ2lmMndlYnAgJHtHSUYyV0VCUF9TUkNTfSkKKyAgdGFyZ2V0X2xpbmtfbGlicmFyaWVzKGdpZjJ3ZWJwIGV4YW1wbGV1dGlsIGltYWdlaW91dGlsIHdlYnAgd2VicG11eAorICAgICR7V0VCUF9ERVBfR0lGX0xJQlJBUklFU30pCisgIGluc3RhbGwoVEFSR0VUUyBnaWYyd2VicCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCBnaWYyd2VicCBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX0lNRzJXRUJQKQorICAjIGltZzJ3ZWJwCisgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtXRUJQX0RFUF9JTUdfSU5DTFVERV9ESVJTfSkKKyAgcGFyc2VfTWFrZWZpbGVfYW0oJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4YW1wbGVzICJJTUcyV0VCUF9TUkNTIgorICAgICJpbWcyd2VicCIpCisgIGFkZF9leGVjdXRhYmxlKGltZzJ3ZWJwICR7SU1HMldFQlBfU1JDU30pCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyhpbWcyd2VicCBleGFtcGxldXRpbCBpbWFnZWRlYyBpbWFnZWlvdXRpbCB3ZWJwIHdlYnBtdXgpCisgIGluc3RhbGwoVEFSR0VUUyBpbWcyd2VicCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCBpbWcyd2VicCBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZiAoV0VCUF9CVUlMRF9XRUJQSU5GTykKKyAgIyB3ZWJwaW5mbworICBpbmNsdWRlX2RpcmVjdG9yaWVzKCR7V0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSU30pCisgIHBhcnNlX01ha2VmaWxlX2FtKCR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9leGFtcGxlcyAiV0VCUElORk9fU1JDUyIKKyAgICAid2VicGluZm8iKQorICBhZGRfZXhlY3V0YWJsZSh3ZWJwaW5mbyAke1dFQlBJTkZPX1NSQ1N9KQorICB0YXJnZXRfbGlua19saWJyYXJpZXMod2VicGluZm8gZXhhbXBsZXV0aWwgaW1hZ2Vpb3V0aWwpCisgIGluc3RhbGwoVEFSR0VUUyB3ZWJwaW5mbyBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgc2V0X3Byb3BlcnR5KFRBUkdFVCB3ZWJwaW5mbyBQUk9QRVJUWSBJTkNMVURFX0RJUkVDVE9SSUVTCisgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYyAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjKQorZW5kaWYoKQorCitpZihXRUJQX0JVSUxEX1dFQlBfSlMpCisgICMgSmF2YVNjcmlwdCB2ZXJzaW9uCisgIGFkZF9leGVjdXRhYmxlKHdlYnBfanMKKyAgICAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2V4dHJhcy93ZWJwX3RvX3NkbC5jKQorICB0YXJnZXRfbGlua19saWJyYXJpZXMod2VicF9qcyB3ZWJwZGVjb2RlciBTREwpCisgIHNldChXRUJQX0hBVkVfU0RMIDEpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwX2pzIFBST1BFUlRJRVMgTElOS19GTEFHUworICAgICAgIi1zIEVYUE9SVEVEX0ZVTkNUSU9OUz0nW1wiX1dlYnBUb1NETFwiXScgLXMgSU5WT0tFX1JVTj0wIFwKKyAgICAgICAtcyBFWFRSQV9FWFBPUlRFRF9SVU5USU1FX01FVEhPRFM9J1tcImN3cmFwXCJdJyIpCisgIHNldF90YXJnZXRfcHJvcGVydGllcyh3ZWJwX2pzIFBST1BFUlRJRVMgT1VUUFVUX05BTUUgd2VicCkKKyAgdGFyZ2V0X2NvbXBpbGVfZGVmaW5pdGlvbnMod2VicF9qcyBQVUJMSUMgRU1TQ1JJUFRFTiBXRUJQX0hBVkVfU0RMKQorCisgICMgV0FTTSB2ZXJzaW9uCisgIGFkZF9leGVjdXRhYmxlKHdlYnBfd2FzbQorICAgICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZXh0cmFzL3dlYnBfdG9fc2RsLmMpCisgIHRhcmdldF9saW5rX2xpYnJhcmllcyh3ZWJwX3dhc20gd2VicGRlY29kZXIgU0RMKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMod2VicF93YXNtIFBST1BFUlRJRVMgTElOS19GTEFHUworICAgICAgIi1zIFdBU009MSAtcyAnQklOQVJZRU5fTUVUSE9EPVwibmF0aXZlLXdhc21cIicgXAorICAgICAgIC1zIEVYUE9SVEVEX0ZVTkNUSU9OUz0nW1wiX1dlYnBUb1NETFwiXScgLXMgSU5WT0tFX1JVTj0wIFwKKyAgICAgICAtcyBFWFRSQV9FWFBPUlRFRF9SVU5USU1FX01FVEhPRFM9J1tcImN3cmFwXCJdJyIpCisgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKHdlYnBfd2FzbSBQVUJMSUMgRU1TQ1JJUFRFTiBXRUJQX0hBVkVfU0RMKQorCisgIHRhcmdldF9jb21waWxlX2RlZmluaXRpb25zKHdlYnBkZWNvZGVyIFBVQkxJQyBFTVNDUklQVEVOKQorZW5kaWYoKQorCisjIEdlbmVyYXRlIHRoZSBjb25maWcuaCBmaWxlLgorY29uZmlndXJlX2ZpbGUoJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS9jbWFrZS9jb25maWcuaC5pbgorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vc3JjL3dlYnAvY29uZmlnLmgpCithZGRfZGVmaW5pdGlvbnMoLURIQVZFX0NPTkZJR19IKQorIyBUaGUgd2VicCBmb2xkZXIgaXMgaW5jbHVkZWQgYXMgd2UgcmVmZXJlbmNlIGNvbmZpZy5oIGFzCisjIC4uL3dlYnAvY29uZmlnLmggb3Igd2VicC9jb25maWcuaAoraW5jbHVkZV9kaXJlY3Rvcmllcygke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisKKyMgSW5zdGFsbCB0aGUgZGlmZmVyZW50IGhlYWRlcnMgYW5kIGxpYnJhcmllcy4KK2luc3RhbGwoRklMRVMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL2RlY29kZS5oCisgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC9kZW11eC5oCisgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC9lbmNvZGUuaAorICAgICAgICAgICAgICAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vc3JjL3dlYnAvbXV4LmgKKyAgICAgICAgICAgICAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L3NyYy93ZWJwL211eF90eXBlcy5oCisgICAgICAgICAgICAgICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9zcmMvd2VicC90eXBlcy5oCisgICAgICAgIERFU1RJTkFUSU9OIGluY2x1ZGUvd2VicCkKK2luc3RhbGwoVEFSR0VUUyAke0lOU1RBTExFRF9MSUJSQVJJRVN9CisgICAgICAgIExJQlJBUlkgREVTVElOQVRJT04gbGliCisgICAgICAgIEFSQ0hJVkUgREVTVElOQVRJT04gbGliKQorCisjIENyZWF0ZSB0aGUgQ01ha2UgdmVyc2lvbiBmaWxlLgoraW5jbHVkZShDTWFrZVBhY2thZ2VDb25maWdIZWxwZXJzKQord3JpdGVfYmFzaWNfcGFja2FnZV92ZXJzaW9uX2ZpbGUoCisgICIke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vV2ViUENvbmZpZ1ZlcnNpb24uY21ha2UiCisgIFZFUlNJT04gJHtQQUNLQUdFX1ZFUlNJT059CisgIENPTVBBVElCSUxJVFkgQW55TmV3ZXJWZXJzaW9uCispCisKKyMgQ3JlYXRlIHRoZSBDb25maWcgZmlsZS4KK2luY2x1ZGUoQ01ha2VQYWNrYWdlQ29uZmlnSGVscGVycykKK3NldChDb25maWdQYWNrYWdlTG9jYXRpb24gc2hhcmUvV2ViUC9jbWFrZS8pCitjb25maWd1cmVfcGFja2FnZV9jb25maWdfZmlsZSgKKyAgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlL1dlYlBDb25maWcuY21ha2UuaW4KKyAgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1dlYlBDb25maWcuY21ha2UKKyAgSU5TVEFMTF9ERVNUSU5BVElPTiAke0NvbmZpZ1BhY2thZ2VMb2NhdGlvbn0KKykKKworIyBJbnN0YWxsIHRoZSBnZW5lcmF0ZWQgQ01ha2UgZmlsZXMuCitpbnN0YWxsKAorICBGSUxFUyAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1dlYlBDb25maWdWZXJzaW9uLmNtYWtlIgorICAgICAgICAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L1dlYlBDb25maWcuY21ha2UiCisgIERFU1RJTkFUSU9OICR7Q29uZmlnUGFja2FnZUxvY2F0aW9ufQorKQorCisjIEluc3RhbGwgdGhlIG1hbiBwYWdlcy4KK3NldChNQU5fUEFHRVMgY3dlYnAuMSBkd2VicC4xIGdpZjJ3ZWJwLjEgaW1nMndlYnAuMSB2d2VicC4xIHdlYnBtdXguMQorICB3ZWJwaW5mby4xKQorc2V0KEVYRUNfQlVJTERTICJDV0VCUCIgIkRXRUJQIiAiR0lGMldFQlAiICJJTUcyV0VCUCIgIlZXRUJQIiAiV0VCUE1VWCIKKyAgIldFQlBJTkZPIikKK2xpc3QoTEVOR1RIIE1BTl9QQUdFUyBNQU5fUEFHRVNfTEVOR1RIKQorbWF0aChFWFBSIE1BTl9QQUdFU19SQU5HRSAiJHtNQU5fUEFHRVNfTEVOR1RIfSAtIDEiKQorCitmb3JlYWNoKElfTUFOIFJBTkdFICR7TUFOX1BBR0VTX1JBTkdFfSkKKyAgbGlzdChHRVQgRVhFQ19CVUlMRFMgJHtJX01BTn0gRVhFQ19CVUlMRCkKKyAgaWYoV0VCUF9CVUlMRF8ke0VYRUNfQlVJTER9KQorICAgIGxpc3QoR0VUIE1BTl9QQUdFUyAke0lfTUFOfSBNQU5fUEFHRSkKKyAgICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9tYW4vJHtNQU5fUEFHRX0KKyAgICAgIERFU1RJTkFUSU9OICR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L3NoYXJlL21hbi9tYW4xCisgICAgICBDT01QT05FTlQgZG9jCisgICAgKQorICBlbmRpZigpCitlbmRmb3JlYWNoKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL0NPUFlJTkcgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DT1BZSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmY5OTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DT1BZSU5HCkBAIC0wLDAgKzEsMzAgQEAKK0NvcHlyaWdodCAoYykgMjAxMCwgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCittZXQ6CisKKyAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCisgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICAgIGRpc3RyaWJ1dGlvbi4KKworICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkKKyAgICBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCitBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCitEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKK1RIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyhJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ2hhbmdlTG9nIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvQ2hhbmdlTG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZDlhY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9DaGFuZ2VMb2cKQEAgLTAsMCArMSwzODUyIEBACis4ZDUxMDc1MSB3ZWJwLWNvbnRhaW5lci1zcGVjOiBjb3JyZWN0IGZyYW1lIGR1cmF0aW9uPTAgbm90ZQorZTZiMjE2NGUgdndlYnA6IENvcHkgQ2hyb21lJ3MgYmVoYXZpb3Igdy9mcmFtZSBkdXJhdGlvbiA9PSAwCitkMjBiNzcwNyB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYxLjAuMC1yYzMpCiswZDVmYWQ0NiBhZGQgV0VCUF9EU1BfSU5JVCAvIFdFQlBfRFNQX0lOSVRfRlVOQworYzFjYjg2YWYgZml4IDE2YiBvdmVyZmxvdyBpbiBTU0UyCitlNTc3ZmViNyBtYWtlZmlsZS51bml4OiBhZGQgREVCVUcgZmxhZyBmb3IgY29tcGlsaW5nIHcvIGRlYnVnLXN5bWJvbAorOTliZTM0YjMgY3dlYnAsZ2V0X2Rpc3RvOiBmaXggYnBwIG91dHB1dAorZjU1NjVjYTggY21ha2U6IE1ha2Ugc3VyZSB3ZSB1c2UgbmVhci1sb3NzbGVzcyBieSBkZWZhdWx0LgorZDg5OGRjMTQgZml4IGJ1ZyBpbiBXZWJQSW1wb3J0NTY1OiBhbHBoYSB2YWx1ZSB3YXMgbm90IHNldAorODgyNzg0YjAgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MS4wLjAtcmMyKQorMmY5MzBlMDggUmV2ZXJ0ICJVc2UgcHJvcGVyIHRhcmdldHMgZm9yIENNYWtlLiIKKzgxNjVlOGZiIFVzZSBwcm9wZXIgdGFyZ2V0cyBmb3IgQ01ha2UuCiszZjE1N2RkNSBSZW1vdmUgc29tZSB2ZXJ5IGhhcmQgVE9ET3MuCitjZDc1OGExNyB7ZGUsfW11eC9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgaGVhZGVycworYjg5MmI4YmEgbWFrZWZpbGUudW5peCxkaXN0OiB1c2UgYXNjaWkgZm9yIHRleHQgb3V0cHV0Cis2NGE1N2QwNSBhZGQgLXZlcnNpb24gb3B0aW9uIHRvIGFuaW1fZHVtcCxhbmltX2RpZmYgYW5kIGltZzJ3ZWJwCitmYzFiOGUzYSB3ZWJwX2pzOiBmaXggd2VicF9qcyBkZW1vIGh0bWwKKzE1YWE0OGQ5IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjEuMC4wLXJjMSkKK2U2MDdkYWJjIHVwZGF0ZSBBVVRIT1JTCiszODQxMGMwOCBbQ0ZJXSBSZW1vdmUgZnVuY3Rpb24gcG9pbnRlciBjYXN0cworYzU3YjI3MzYgYnVtcCB2ZXJzaW9uIHRvIDEuMC4wCitjYmEyODg1MyB1cGRhdGUgTkVXUworYzkwOWQ1MzEgTWVyZ2UgInJlbW92ZSBzb21lIGRlcHJlY2F0aW9uIHdhcm5pbmcgb24gTWFjT1NYIgorMjE3NDQzYzcgcmVtb3ZlIHNvbWUgZGVwcmVjYXRpb24gd2FybmluZyBvbiBNYWNPU1gKK2I2NzJiZGZhIGNvbmZpZ3VyZTogcXVpZXQgZ2x1dCBkZXByZWNhdGlvbiB3YXJuaW5ncyBvbiBPUyBYCitkYWE5ZmNhZiBjb25maWd1cmU6IHVzZSBzZGwtY29uZmlnIGlmIGF2YWlsYWJsZQorZGQxNzRjYWUgTWVyZ2UgImltYWdlZGVjOiBzdXBwb3J0IG1ldGFkYXRhIHJlYWRpbmcgZm9yIFdlYlAgaW1hZ2UgZGVjb2RpbmciCis2NDFjZWRjYyBpbWFnZWRlYzogc3VwcG9ydCBtZXRhZGF0YSByZWFkaW5nIGZvciBXZWJQIGltYWdlIGRlY29kaW5nCiswNjViMmNlMSBhbmltX2RpZmY6IGFkZCBhIGNvdXBsZSBtaXNzaW5nIG5ld2xpbmVzIGluIEhlbHAoKQorYzRjYzExNDcgTWVyZ2UgImdpZjJ3ZWJwOiBmb3JjZSBsb3cgZHVyYXRpb24gZnJhbWVzIHRvIDEwMG1zIgorMDkzMzMwOTcgZ2lmMndlYnA6IGZvcmNlIGxvdyBkdXJhdGlvbiBmcmFtZXMgdG8gMTAwbXMKK2UwM2YwZWMzIHNoYXJwX3l1djogdXNlIDE0YiBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIGdhbW1hCitiMmRiMzYxYyBpbWFnZV9lbmMsV2ViUFdyaXRlUE5HOiBtb3ZlIGxvY2FscyBhZnRlciBzZXRqbXAKKzc0ZTgyZWM2IE1lcmdlICJXZWJQUGljdHVyZURpc3RvcnRpb246IGZpeCBiaWctZW5kaWFuIHJlc3VsdHMgb3JkZXIiCis2NDVkMDRjYSBNZXJnZSAiY3dlYnAsZ2V0X2Rpc3RvOiByZXBvcnQgYnBwIgorMTIwZjU4YzMgTWVyZ2UgImxvc3NsZXNzKnNzZTI6IGltcHJvdmUgbm9uLWNvbnN0IDE2LWJpdCB2ZWN0b3IgY3JlYXRpb24iCithN2ZlOTQxMiBXZWJQUGljdHVyZURpc3RvcnRpb246IGZpeCBiaWctZW5kaWFuIHJlc3VsdHMgb3JkZXIKK2UyNmZlMDY2IGN3ZWJwLGdldF9kaXN0bzogcmVwb3J0IGJwcAorOWRmNjRlMjggTWVyZ2UgY2hhbmdlcyBJZDViNGExYTQsSWEyMGNlODQ0Cis4MDQzNTA0ZiBsb3NzbGVzcypzc2UyOiBpbXByb3ZlIG5vbi1jb25zdCAxNi1iaXQgdmVjdG9yIGNyZWF0aW9uCisxZTNkZmM0OCBJbXBvcnQ6IGV4dHJhY3QgY29uZGl0aW9uIGZyb20gbG9vcAorM2IwN2QzMjcgSW1wb3J0LFJHQkE6IGZpeCBmb3IgQmlnRW5kaWFuIGltcG9ydAorNTUxOTQ4ZTQgUmVtb3ZlIHVudXNlZCBhcmd1bWVudCBpbiBWUDhMQml0c0VudHJvcHkuCiszMDA1MjM3YSBSZWFkV2ViUDogZml4IGZvciBiaWctZW5kaWFuCis0OTljMzk1YSBNZXJnZSAiYW5pbV9kaWZmOiBleHBvc2UgdGhlIC1tYXhfZGlmZiBvcHRpb24iCitmNjlkY2Q2OSBNZXJnZSAicmVtb3ZlIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTIgorMDdkODg0ZDUgYW5pbV9kaWZmOiBleHBvc2UgdGhlIC1tYXhfZGlmZiBvcHRpb24KK2Y0ZGQ5MjU2IHJlbW92ZSBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUworOTRhODM3N2IgZXh0cmFjdCB0aGUgY29tbWFuZC1saW5lIHBhcnNpbmcgaGVscGVycyB0byBleGFtcGxlX3V0aWwKK2ZjMDllNmUyIFBOTSBkZWNvZGVyOiBwcmV2ZW50IHVuc3VwcG9ydGVkIGRlcHRoPTIgUEFNIGNhc2UuCis2ZGU1ODYwMyBNSVBTNjQ6IEZpeCBkZWZpbmVkLWJ1dC1ub3QtdXNlZCBlcnJvcnMgd2l0aCBXRUJQX1JFRFVDRV9DU1AKK2NiZGU1NzI4IGdpZjJ3ZWJwOiBhZGQgc3VwcG9ydCBmb3IgcmVhZGluZyBmcm9tIHN0ZGluCitjZjFjNTA1NCBBZGQgYW4gU1NFNCB2ZXJzaW9uIG9mIHNvbWUgbG9zc2xlc3MgY29sb3IgdHJhbnNmb3Jtcy4KKzQ1YThiNWViIEZpeCBsaW50IGVycm9yIHdpdGggbWFuIHBhZ2UuCitjZmYzOGU4ZiBNZXJnZSAiUE5HIGRlY29kZXI6IGhhbmRsZSBnQU1BIGNodW5rIgorNTljYjFhNDggTWVyZ2UgImVuYWJsZSBkYyBlcnJvci1kaWZmdXNpb24gYWx3YXlzIgorNzgzMThiMzAgUE5HIGRlY29kZXI6IGhhbmRsZSBnQU1BIGNodW5rCis2NjRjMjFkZCBNZXJnZSAicmVtb3ZlIHNvbWUgVE9ET3MiCis4MTU2NTJkZSBlbmFibGUgZGMgZXJyb3ItZGlmZnVzaW9uIGFsd2F5cworYWVjNDVjZWMgcmVtb3ZlIHNvbWUgVE9ET3MKKzU3MTVkZmNlIGZpeCBibG9jay1jb3VudFtdIGluY3JlbWVudCBpbiBjYXNlIG9mIGxhcmdlIGltYWdlCitjMmQwNGYzZSBlbmFibGUgREMgZXJyb3ItZGlmZnVzaW9uIGFsd2F5cyBmb3IgbXVsdGktcGFzcworOTZiZjA3YzUgdXNlIERDIGVycm9yIGRpZmZ1c2lvbiBmb3IgVS9WIGF0IGxvdy1xdWFsaXR5CisxYzU5MDIwYiBmaXggbWlzc2luZyBzc2U0MSB0YXJnZXRzIGluIG1ha2VmaWxlLnVuaXgKKzdhOGU4MTRiIGNvc21ldGljczogcy9jb2xvcl9zcGFjZS9jb2xvcnNwYWNlLworMDVmNmZlMjQgdXBzYW1wbGluZzogcm0gYXNzZXJ0cyB3L1JFRFVDRV9DU1ArT01JVF9DX0NPREUKK2I0Y2Y1NTk3IE1lcmdlICJVcHNhbXBsaW5nIFNTRTIvU1NFNCBzcGVlZHVwLiIKK2NjYmViMzJjIE1ha2VmaWxlLnZjOiBhZGQgbWlzc2luZyBzc2U0MSBmaWxlcworNTU0MDNhOWEgVXBzYW1wbGluZyBTU0UyL1NTRTQgc3BlZWR1cC4KKzgwN2I1M2M0IEltcGxlbWVudCB0aGUgdXBzYW1wbGluZy95dXYgZnVuY3Rpb25zIGluIFNTRTQxCis4NDEwMWE4MSBGaXggd2FzbSBXZWJQIGNvbXBpbGF0aW9uCis4YmViZDJhMyBmaXggd2FybmluZyBvbiBNU1ZDCithN2Y5M2ZlMyB3ZWJwbXV4OiBhbGxvdyByZWFkaW5nIGFyZ3VtZW50IGZyb20gYSBmaWxlCitiNjlmMThhNyBnaWYyd2VicC4xOiBmaXggLWxvb3BfY29tcGF0aWJpbGl0eSBsYXlvdXQKKzcyZDUzMGMwIE1lcmdlICJmaXggbG9zc2xlc3MgZGVjb2Rpbmcgdy9XRUJQX1JFRFVDRV9TSVpFIgorMjk2YzdkYzQgZml4IGxvc3NsZXNzIGRlY29kaW5nIHcvV0VCUF9SRURVQ0VfU0laRQorMGQ1ZDAyOWMgTWVyZ2UgIkltZ0lvVXRpbFJlYWRGaWxlOiBmaXggZmlsZSBsZWFrIHVwb24gZXJyb3IiCithZTU2OGNlNyBJbWdJb1V0aWxSZWFkRmlsZTogZml4IGZpbGUgbGVhayB1cG9uIGVycm9yCis3OTZiNWE4YSBNZXJnZSB0YWcgJ3YwLjYuMScKKzZiN2E5NWZkIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNi4xKQorZjY2OTU1ZGUgV0VCUF9SRURVQ0VfQ1NQOiByZXN0cmljdCBjb2xvcnNwYWNlIHN1cHBvcnQKKzFhZjBkZjc2IE1lcmdlICJXRUJQX1JFRFVDRV9DU1A6IHJlc3RyaWN0IGNvbG9yc3BhY2Ugc3VwcG9ydCIKKzZkZTIwZGYwIFdFQlBfUkVEVUNFX0NTUDogcmVzdHJpY3QgY29sb3JzcGFjZSBzdXBwb3J0CithMjg5ZDhlNyB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjYuMS1yYzIpCitjMTBhNDkzYyB2d2VicDogZGlzYWJsZSBkb3VibGUgYnVmZmVyaW5nIG9uIHdpbmRvd3MgJiBtYWMKKzBkNDQ2NmMyIHdlYnBfdG9fc2RsLmM6IGZpeCBmaWxlIG1vZGUKKzFiMjdiZjhiIFdFQlBfUkVEVUNFX1NJWkU6IGRpc2FibGUgYWxsIHJlc2NhbGVyIGNvZGUKKzEyNmJlMTA5IHdlYnBpbmZvOiBhZGQgLXZlcnNpb24gb3B0aW9uCiswZGYyMmI5ZSBXRUJQX1JFRFVDRV9TSVpFOiBkaXNhYmxlIGFsbCByZXNjYWxlciBjb2RlCis5YWRkNjJiNSBidW1wIHZlcnNpb24gdG8gMC42LjEKK2QzZTI2MTQ0IHVwZGF0ZSBORVdTCisyZWRkYTYzOSBSRUFETUU6IGFkZCB3ZWJwaW5mbyBzZWN0aW9uCis5Y2E1NjhlZiBNZXJnZSAicmlnaHQtc2l6ZSBzb21lIHRhYmxlcyIKKzMxZjE5OTVjIE1lcmdlICJTU0UyIGltcGxlbWVudGF0aW9uIG9mIEhhc0FscGhhWFhYIgorYTgwYzQ2YmQgU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBIYXNBbHBoYVhYWAorMDgzNTA3ZjIgcmlnaHQtc2l6ZSBzb21lIHRhYmxlcworMmU1Nzg1YjIgYW5pbV91dGlscy5jOiByZW1vdmUgd2FybmluZyB3aGVuICFkZWZpbmVkKFdFQlBfSEFWRV9HSUYpCitiMjk5YzQ3ZSBhZGQgV0VCUF9SRURVQ0VfU0laRQorZjU5M2Q3MWEgZW5jOiBkaXNhYmxlIHBpYy0+c3RhdHMvZXh0cmFfaW5mbyB3L1dFQlBfRElTQUJMRV9TVEFUUworNTQxMTc5YTkgTWVyZ2UgInByZWRpY3Rvcl9lbmM6IGZpeCBidWlsZCB3Ly0tZGlzYWJsZS1uZWFyLWxvc3NsZXNzIgorNTc1NWE3ZWMgcHJlZGljdG9yX2VuYzogZml4IGJ1aWxkIHcvLS1kaXNhYmxlLW5lYXItbG9zc2xlc3MKK2VhYjViYWI3IGFkZCBXRUJQX0RJU0FCTEVfU1RBVFMKKzgwNTJjNTg1IHJlbW92ZSBzb21lIHBldHR5IFRPRE9zIGZyb20gdndlYnAuCitjMjQ1MzQzZCBtb3ZlIExPQUQ4eDQgYW5kIFNUT1JFOHgyIGNsb3NlciB0byB0aGVpciB1c2UgbG9jYXRpb24KK2I5ZTczNGZkIGRlYyxjb3NtZXRpY3M6IG5vcm1hbGl6ZSBmdW5jdGlvbiBuYW1pbmcgc3R5bGUKK2MxODhkNTQ2IGRlYzogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCisyOGM1YWM4MSBkZWNfc3NlNDE6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworZTY1YjcyYTMgTWVyZ2UgImludHJvZHVjZSBXZWJQSGFzQWxwaGE4YiBhbmQgV2ViUEhhc0FscGhhMzJiIgorYjk0Y2VlOTggZGVjX3NzZTI6IHJlbW92ZSBIRTh1dl9TU0UyCis0NGEwZWUzZiBpbnRyb2R1Y2UgV2ViUEhhc0FscGhhOGIgYW5kIFdlYlBIYXNBbHBoYTMyYgorYWViZjU5YWMgTWVyZ2UgIldlYlBQaWN0dXJlQWxsb2NBUkdCOiBhbGlnbiBhcmdiIGFsbG9jYXRpb24iCitjMTg0NjY1ZSBXZWJQUGljdHVyZUFsbG9jQVJHQjogYWxpZ24gYXJnYiBhbGxvY2F0aW9uCiszZGFmNzUwOSBXZWJQUGFyc2VIZWFkZXJzOiByZW1vdmUgb2Jzb2xldGUgYW5pbWF0aW9uIFRPRE8KKzgwMjg1ZDk3IGNtYWtlOiBhdm9pZCBzZWN1cml0eSB3YXJuaW5ncyB1bmRlciBtc3ZjCis2NTBlYWM1NSBjbWFrZTogZG9uJ3Qgc2V0IC1XYWxsIHdpdGggTVNWQworYzQ2MmNkMDAgUmVtb3ZlIHVzZWxlc3MgY29kZS4KKzAxYTk4MjE3IE1lcmdlICJyZW1vdmUgV2ViUFdvcmtlckltcGwgZGVjbGFyYXRpb24gZnJvbSB0aGUgaGVhZGVyIgorM2M0OWZjNDcgTWVyZ2UgInRocmVhZF91dGlsczogZml4IHBvdGVudGlhbGx5IGJhZCBjYWxsIHRvIEV4ZWN1dGUiCitmZGUyNzgyZSB0aHJlYWRfdXRpbHM6IGZpeCBwb3RlbnRpYWxseSBiYWQgY2FsbCB0byBFeGVjdXRlCisyYTI3MGMxZCByZW1vdmUgV2ViUFdvcmtlckltcGwgZGVjbGFyYXRpb24gZnJvbSB0aGUgaGVhZGVyCitmMWY0MzdjYyByZW1vdmUgbWVudGlvbiBvZiAnbG9zc3ktb25seSBwYXJhbWV0ZXJzJyBmcm9tIHRoZSBkb2MKKzM4NzkwNzRkIE1lcmdlICJXZWJQTWVtVG9VaW50MzI6IHJlbW92ZSBwdHIgY2FzdCB0byBpbnQiCiswNGIwMjlkMiBXZWJQTWVtVG9VaW50MzI6IHJlbW92ZSBwdHIgY2FzdCB0byBpbnQKK2I3OTcxZDBlIGRzcDogYXZvaWQgZGVmaW5pbmcgX0MgZnVuY3Rpb25zIHcvTkVPTiBidWlsZHMKKzZiYTk4NzY0IHdlYnBkZWM6IGNvcnJlY3QgYWxsb2Mgc2l6ZSBjaGVjayB3L3VzZV9hcmdiCis1Y2ZiM2IwZiBub3JtYWxpemUgaW5jbHVkZSBndWFyZHMKK2Y0MzMyMDVlIE1lcmdlIGNoYW5nZXMgSWExN2M3ZGZjLEk3NTQyM2FiYixJYTJmNzE2YjQsSTE2MWNhYTE0LEk0MjEwMDgxYSwgLi4uCis4ZDAzM2IxNCB7ZGVjLGVuY31fbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzIHgyCiswMjk1ZTk4MSB1cHNhbXBsaW5nX25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworZDU3MmM0ZTUgeXV2X25lb246IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworYWI5YzI1MDAgcmVzY2FsZXJfbmVvbjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCis5M2UwY2UyNyBsb3NzbGVzc19uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzIyZmJjNTBlIGxvc3NsZXNzX2VuY19uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzQ0Nzg3NWI0IGZpbHRlcnNfbmVvbixjb3NtZXRpY3M6IGZpeCBpbmRlbnQKK2U1MWJkZDQzIHJlbW92ZSB1bnVzZWQgVlA4VG9rZW5Ub1N0YXRzKCkgZnVuY3Rpb24KKzc4NWRhN2VhIGVuY19uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKK2JjMWEyNTFmIGRlY19uZW9uOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzYxZTUzNWYxIGRzcC9sb3NzbGVzczogd29ya2Fyb3VuZCBnY2MtNC44IGJ1ZyBvbiBhcm0KKzY4YjJlYWI3IGN3ZWJwOiBmaXggYWxwaGEgcmVwb3J0aW5nIHcvbG9zc2xlc3MgJiBtZXRhZGF0YQorMzAwNDJmYWEgV2ViUERlbXV4R2V0STogYWRkIGRvYyBkZXRhaWxzIGFyb3VuZCBXZWJQRm9ybWF0RmVhdHVyZQorMGExN2Y0NzEgTWVyZ2UgIldJUDogbGlzdCBpbmNsdWRlcyBhcyBkZXNjZW5kYW50cyBvZiB0aGUgcHJvamVjdCBkaXIiCithNDM5OTcyMSBXSVA6IGxpc3QgaW5jbHVkZXMgYXMgZGVzY2VuZGFudHMgb2YgdGhlIHByb2plY3QgZGlyCiswODI3NTcwOCBNZXJnZSAiTWFrZSBzdXJlIHdlIHJlYWNoIHRoZSBmdWxsIHJhbmdlIGZvciBhbHBoYSBibGVuZGluZy4iCitkMzYxYTZhNyB5dXZfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCis2OTIxYWE2ZiB1cHNhbXBsaW5nX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworMDhjNjdkM2Ugc3NpbV9zc2UyOiBoYXJtb25pemUgZnVuY3Rpb24gc3VmZml4ZXMKKzU4MmExYjU3IHJlc2NhbGVyX3NzZTI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworMmMxYjE4YmEgbG9zc2xlc3Nfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCiswYWM0NmU4MSBsb3NzbGVzc19lbmNfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitiYzYzNGQ1NyBlbmNfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitiY2I3MzQ3YyBkZWNfc3NlMjogaGFybW9uaXplIGZ1bmN0aW9uIHN1ZmZpeGVzCitlMTRhZDkzYyBNYWtlIHN1cmUgd2UgcmVhY2ggdGhlIGZ1bGwgcmFuZ2UgZm9yIGFscGhhIGJsZW5kaW5nLgorNzAzOGNhOGQgZGVtdXgsU3RvcmVGcmFtZTogcmVzdG9yZSBoZHIgc2l6ZSBjaGVjayB0byBtaW4gcmVxCitmYjNkYWFkNiBjcHU6IGZpeCBzc3NlMyBjaGVjaworYmU1OTBlMDYgTWVyZ2UgIkZpeCBDTWFrZSByZWRlZmluaXRpb24gZm9yIEhBVkVfQ1BVX0ZFQVRVUkVTX0giCiszNWY3MzZlMSBGaXggQ01ha2UgcmVkZWZpbml0aW9uIGZvciBIQVZFX0NQVV9GRUFUVVJFU19ICithNTIxNmVmYyBGaXggaW50ZWdlciBvdmVyZmxvdyB3YXJuaW5nLgorYTljODkxNmIgZGVjb2RlLmgsV2ViUElEZWNHZXRSR0I6IGNsYXJpZnkgb3V0cHV0IHB0ciB2YWxpZGl0eQorM2M3NGM2NDUgZ2lmMndlYnA6IGhhbmRsZSAxLWZyYW1lIGNhc2UgcHJvcGVybHkgKyBmaXggYW5pbV9kaWZmCitjN2YyOTVkMyBNZXJnZSAiZ2lmMndlYnA6IGludHJvZHVjZSAtbG9vcF9jb21wYXRpYmlsaXR5IG9wdGlvbiIKK2I0ZTA0Njc3IGdpZjJ3ZWJwOiBpbnRyb2R1Y2UgLWxvb3BfY29tcGF0aWJpbGl0eSBvcHRpb24KK2Y3OGRhM2RlIGFkZCBMT0NBTF9DTEFOR19QUkVSRVEgYW5kIGF2b2lkIFdPUktfQVJPVU5EX0dDQyB3LzMuOCsKKzAxYzQyNmYxIGRlZmluZSBXRUJQX1VTRV9JTlRSSU5TSUNTIHcvZ2NjLTQuOSsKKzg2MzU5NzNkIHVzZSBzZGwtY29uZmlnIChpZiBhdmFpbGFibGUpIHRvIGRldGVybWluZSB0aGUgbGluayBmbGFncworZTk0NTkzODIgdXNlIENQUEZMQUdTIGJlZm9yZSBDRkxBR1MKKzRhOWQ3ODhlIE1lcmdlICJBbmRyb2lkLm1rLG1pcHM6IGZpeCBjbGFuZyBidWlsZCB3aXRoIHIxNSIKKzRmYmRjOWZiIEFuZHJvaWQubWssbWlwczogZml4IGNsYW5nIGJ1aWxkIHdpdGggcjE1CithODBmY2M0YSBpZmRlZiBjb2RlIG5vdCB1c2VkIGJ5IENocm9tZS9BbmRyb2lkLgorMzk5M2FmMTIgRml4IHNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93cy4KK2Y2NmY5NGVmIGFuaW1fZHVtcDogc21hbGwgdG9vbCB0byBkdW1wIGZyYW1lcyBmcm9tIGFuaW1hdGVkIFdlYlAKKzZlYmE4NTdiIE1lcmdlICJyYXRpb25hbGl6ZSB0aGUgTWFrZWZpbGUuYW0iCitjNWUzNGZiYSBmdW5jdGlvbiBkZWZpbml0aW9uIGNsZWFudXAKKzM4MjI3NjJhIHJhdGlvbmFsaXplIHRoZSBNYWtlZmlsZS5hbQorNTAxZWY2ZTQgY29uZmlndXJlIHN0eWxlIGZpeDogYW5pbWRpZmYgLT4gYW5pbV9kaWZmCitmOGJkYzI2OCBNZXJnZSAicHJvdGVjdCBhZ2FpbnN0IE5VTEwgZHVtcF9mb2xkZXJbXSB2YWx1ZSBpbiBSZWFkQW5pbWF0ZWRJbWFnZSgpIgorMjNiZmM2NTIgcHJvdGVjdCBhZ2FpbnN0IE5VTEwgZHVtcF9mb2xkZXJbXSB2YWx1ZSBpbiBSZWFkQW5pbWF0ZWRJbWFnZSgpCis4ZGMzZDcxYiBjb3NtZXRpY3MsUmVhZEFuaW1hdGVkV2ViUDogY29ycmVjdCBmdW5jdGlvbiBjb21tZW50Cis1YmQ0MDA2NiBNZXJnZSBjaGFuZ2VzIEk2NmE2NGEwYSxJNGQyZTUyMGYKKzc5NDU1NzVjIGNvc21ldGljcyx3ZWJwaW5mbzogcmVtb3ZlIGFuIGVsc2UgYWZ0ZXIgYSByZXR1cm4KKzg3MjlmYTExIGNvc21ldGljcyxjd2VicDogcmVtb3ZlIGFuIGVsc2UgYWZ0ZXIgYSByZXR1cm4KK2YzMjRiN2Y5IGNvc21ldGljczogbm9ybWFsaXplIGZuIHByb3RvICYgZGVjbCBwYXJhbSBuYW1lcworODY5ZWIzNjkgQ01ha2UgY2xlYW51cHMuCisyODllNjJhMyBSZW1vdmUgZGVjbGFyYXRpb24gb2YgdW5pbXBsZW1lbnRlZCBWUDhBcHBseU5lYXJMb3NzbGVzc1ByZWRpY3QKKzIwYTk0MTg2IHBubWRlYyxQQU06IHZhbGlkYXRlIGRlcHRoIGJlZm9yZSBjYWxjdWxhdGluZyBieXRlc19wZXJfcHgKKzM0MTMwYWZlIGFuaW1fZW5jb2RlOiBmaXggaW50ZWdlciBvdmVyZmxvdworNDJjNzlhYTYgTWVyZ2UgIkVuY29kZXI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcyIKK2IwOTMwN2RjIEVuY29kZXI6IGhhcm1vbml6ZSBmdW5jdGlvbiBzdWZmaXhlcworYmVkMDQ1NmQgTWVyZ2UgIlNTSU06IGhhcm1vbml6ZSB0aGUgZnVuY3Rpb24gc3VmZml4IgorNTRmNmEzY2YgbG9zc2xlc3Nfc3NlMi5jOiBmaXggc29tZSBtaXNzZWQgc3VmZml4IGNoYW5nZXMKKzA4OGYxZGNjIFNTSU06IGhhcm1vbml6ZSB0aGUgZnVuY3Rpb24gc3VmZml4Cis4NmZjNGRkOSB3ZWJwZGVjOiB1c2UgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3cKKzA4ZWE5ZWNkIGltYWdlaW86IGFkZCBhYmlsaXR5IHJlc3RyaWN0IG1heCBpbWFnZSBzaXplCis2ZjlkYWE0YSBqcGVnZGVjLFJlYWRFcnJvcjogZml4IGxlYWtzIG9uIGVycm9yCithMGY3MmE0ZiBWUDhMVHJhbnNmb3JtQ29sb3JGdW5jOiBkcm9wIGFuIG5vbi1yZXNwZWN0ZWQgJ2NvbnN0JyBmcm9tIHRoZSBzaWduYXR1cmUuCis4YzkzNDkwMiBNZXJnZSAiTG9zc2VzcyBkZWM6IGhhcm1vbml6ZSB0aGUgZnVuY3Rpb24gc3VmZml4ZXMiCis2MjIyNDJhYSBMb3NzZXNzIGRlYzogaGFybW9uaXplIHRoZSBmdW5jdGlvbiBzdWZmaXhlcworMTQxMWYwMjcgTG9zc2xlc3MgRW5jOiBoYXJtb25pemUgdGhlIGZ1bmN0aW9uIHN1ZmZpeGVzCisyNGFkMmUzYyBhZGQgY29uc3QgdG8gdHdvIHZhcmlhYmxlcworNDZlZmUwNjIgTWVyZ2UgIkFsbG93IHRoZSBsb3NzbGVzcyBjcnVuY2hlciB0byB3b3JrIGZvciBhbHBoYS4iCis4YzNmOWE0NyBTcGVlZC11cCBMWjc3LgorMWFlZjRjNzEgQWxsb3cgdGhlIGxvc3NsZXNzIGNydW5jaGVyIHRvIHdvcmsgZm9yIGFscGhhLgorYjg4MjFkYmQgSW1wcm92ZSB0aGUgYm94IExaNzcgc3BlZWQuCis3YmVlZDI4MCBhZGQgbWlzc2luZyAoKXMgdG8gbWFjcm8gcGFyYW1ldGVycworNjQ3M2QyMGIgTWVyZ2UgImZpeCBBbmRyb2lkIHN0YW5kYWxvbmUgdG9vbGNoYWluIGJ1aWxkIgorZGNlZmVkOTUgTWVyZ2UgImJ1aWxkLmdyYWRsZTogZml4IGFybTY0IGJ1aWxkIgorMGM4M2E4YmMgTWVyZ2UgInl1djogaGFybW9uaXplIHN1ZmZpeCBuYW1pbmciCitjNmQxZGI0YiBmaXggQW5kcm9pZCBzdGFuZGFsb25lIHRvb2xjaGFpbiBidWlsZAorNjYzYTZkOWQgdW5pZnkgdGhlIEFMVEVSTkFURV9DT0RFIGZsYWcgdXNhZ2UKKzczZWE5ZjI3IHl1djogaGFybW9uaXplIHN1ZmZpeCBuYW1pbmcKK2M3MWI2OGFjIGJ1aWxkLmdyYWRsZTogZml4IGFybTY0IGJ1aWxkCitjNDU2OGI0NyBSZXNjYWxlcjogaGFybW9uaXplIHRoZSBzdWZmaXggbmFtaW5nCis2Y2IxM2IwNSBNZXJnZSAiYWxwaGFfcHJvY2Vzc2luZzogaGFybW9uaXplIHRoZSBuYW1pbmcgc3VmZml4ZXMgdG8gYmUgX0MoKSIKKzgzYTNlNjlhIE1lcmdlICJzaW1wbGlmeSBXRUJQX0VYVEVSTiBtYWNybyIKKzcyOTVmZGUyIE1lcmdlICJmaWx0ZXJzOiBoYXJtb25pemUgdGhlIHN1ZmZpeGVzIG5hbWluZyB0byBfU1NFMigpLCBfQygpLCBldGMuIgorOGU0MmJhNGMgc2ltcGxpZnkgV0VCUF9FWFRFUk4gbWFjcm8KKzMzMWFiMzRiIGNvc3QqLmM6IGhhcm1vbml6ZSB0aGUgc3VmZml4IG5hbWluZ3MKK2IxNjFmNjcwIGZpbHRlcnM6IGhhcm1vbml6ZSB0aGUgc3VmZml4ZXMgbmFtaW5nIHRvIF9TU0UyKCksIF9DKCksIGV0Yy4KK2RlYzVlNGQzIGFscGhhX3Byb2Nlc3Npbmc6IGhhcm1vbml6ZSB0aGUgbmFtaW5nIHN1ZmZpeGVzIHRvIGJlIF9DKCkKKzY4NzhkNDI3IGZpeCBtZW1vcnkgbGVhayBpbiBTRExfSW5pdCgpCis0NjFhZTU1NSBNZXJnZSAiY29uZmlndXJlOiBmaXggd2FybmluZ3MgaW4gc2RsIGNoZWNrIgorNjI0ODZhMjIgY29uZmlndXJlOiB0ZXN0IGZvciAtV3VuZGVmCis5Mjk4MjYwOSBkc3AuaDogZml4IC1XdW5kZWYgdy9fX21pcHNfZHNwX3JldgorMDI2NWNlZGUgY29uZmlndXJlOiBmaXggd2FybmluZ3MgaW4gc2RsIGNoZWNrCis4OGM3M2Q4YSBiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oOiBmaXggV0lORE9XX1NJWkVfQklUUyBjaGVjaworNGVhNDlmNmIgcmVzY2FsZXJfc3NlMi5jOiBmaXggV0VCUF9SRVNDQUxFUl9GSVggLT4gX1JGSVggdHlwbworMWI1MjY2MzggQ2xlYW4tdXAgc29tZSBDTWFrZQorODdmNTdhNGIgTWVyZ2UgImNtYWtlOiBmaXggZ2lmIGxpYiBkZXRlY3Rpb24gd2hlbiBjcm9zcyBjb21waWxpbmciCitiMzRhOWRiMSBjb3NtZXRpY3MsZGVjX3NzZTI6IHJlbW92ZSBzb21lIHJlZHVuZGFudCBjb21tZW50cworNDcxYzU3NTUgY21ha2U6IGZpeCBnaWYgbGliIGRldGVjdGlvbiB3aGVuIGNyb3NzIGNvbXBpbGluZworYzc5MzQxN2EgY21ha2U6IGRpc2FibGUgZ2lmMndlYnAgaWYgZ2lmIGxpYiBpc24ndCBmb3VuZAorZGNiYzFjODggY21ha2U6IHNwbGl0IGdpZiBkZXRlY3Rpb24gZnJvbSBJTUcgZGVwcworNjZhZDg0ZjAgTWVyZ2UgIm11eHJlYWQ6IHJlbW92ZSB1bnJlYWNoYWJsZSBjb2RlIgorNTBlYzNhYjcgbXV4cmVhZDogcmVtb3ZlIHVucmVhY2hhYmxlIGNvZGUKKzdkNjdhMTY0IExvc3N5IGVuY29kaW5nOiBzbW9vdGhlbiB0cmFuc3BhcmVudCBhcmVhcyB0byBpbXByb3ZlIGNvbXByZXNzaW9uCitlNTA2NTBjNyBNZXJnZSAiZml4IHNpZ25hdHVyZSBmb3IgRElTQUJMRV9UT0tFTl9CVUZGRVIgY29tcGlsYXRpb24iCis2NzFkMjU2NyBmaXggc2lnbmF0dXJlIGZvciBESVNBQkxFX1RPS0VOX0JVRkZFUiBjb21waWxhdGlvbgorZDY3NTU1ODAgY3B1LmNtYWtlOiB1c2UgdW5pcXVlIGZsYWcgdG8gdGVzdCBzaW1kIGRpc2FibGUgZmxhZ3MKKzI4OTE0NTI4IE1lcmdlICJSZW1vdmUgdGhlIGFyZ2IqIGZpbGVzLiIKKzhhY2I0OTQyIFJlbW92ZSB0aGUgYXJnYiogZmlsZXMuCiszYjYyMzQ3YiBSRUFETUU6IGNvcnJlY3QgY21ha2UgaW52b2NhdGlvbiBub3RlCis3Y2EwZGYxMyBIYXZlIHRoZSBTU0UyIHZlcnNpb24gb2YgUGFja0FSR0IgdXNlIGNvbW1vbiBjb2RlLgorN2IyNTA0NTkgTWVyZ2UgIlJlLXVzZSB0aGUgdHJhbnNmb3JtZWQgaW1hZ2Ugd2hlbiB0cnlpbmcgc2V2ZXJhbCBMWjc3IGluIGxvc3NsZXNzLiIKK2UxMzIwNzJmIFJlLXVzZSB0aGUgdHJhbnNmb3JtZWQgaW1hZ2Ugd2hlbiB0cnlpbmcgc2V2ZXJhbCBMWjc3IGluIGxvc3NsZXNzLgorNWQ3YTUwZWYgR2V0IGNvZGUgdG8gY29tcGlsZSBpbiBDKysuCis3YjAxMjk4NyBjb25maWd1cmU6IHRlc3QgZm9yIC1XcGFyZW50aGVzZXMtZXF1YWxpdHkKK2YwNTY5YWRiIEZpeCBtYW4gcGFnZXMgZm9yIG11bHRpLXRocmVhZGluZy4KK2YxZDVhMzk3IG11bHRpdGhyZWFkIGNydW5jaGVyOiBvbmx5IGNvcHkgc3RhdHMgd2hlbiBwaWN0dXJlLT5zdGF0cyAhPSBOVUxMCitmOGMyYWMxNSBNdWx0aS10aHJlYWQgdGhlIGxvc3NsZXNzIGNydW5jaGVyLgorYTg4YzY1MjIgTWVyZ2UgIkludGVncmF0ZSBhIG5ldyBMWjc3IGxvb2tpbmcgZm9yIG1hdGNoZXMgaW4gdGhlIG5laWdoYm9yaG9vZCBvZiBhIHBpeGVsIG9ubHkuIgorOGY2ZGYxZDAgVW5yb2xsIFByZWRpY3RvcnMgMTAsIDExIGFuZCAxMi4KKzM1NWMzZDFiIEludGVncmF0ZSBhIG5ldyBMWjc3IGxvb2tpbmcgZm9yIG1hdGNoZXMgaW4gdGhlIG5laWdoYm9yaG9vZCBvZiBhIHBpeGVsIG9ubHkuCithMTc3OWEwMSBSZWZhY3RvciBMWjc3IGhhbmRsaW5nIGluIHByZXBhcmF0aW9uIGZvciBhIG5ldyBtZXRob2QuCis2N2RlNjhiNSBBbmRyb2lkLm1rL2J1aWxkLmdyYWRsZTogZml4IG1pcHMgYnVpbGQgd2l0aCBjbGFuZyBmcm9tIHIxNGIKK2YyMDlhNTQ4IFVzZSB0aGUgcGxhbmUgY29kZSBhbmQgbm90IHRoZSBkaXN0YW5jZSB3aGVuIGNvbXB1dGluZyBzdGF0aXN0aWNzLgorYjkwM2I4MGMgU3BsaXQgY29zdC1iYXNlZCBiYWNrd2FyZCByZWZlcmVuY2VzIGluIGl0cyBvd24gZmlsZS4KKzQ5OGNhZDM0IENvc21ldGljIGNoYW5nZXMgaW4gYmFja3dhcmQgcmVmZXJlbmNlLgorZTRlYjQ1ODcgbG9zc2xlc3MsIFZQOExUcmFuc2Zvcm1Db2xvcl9DOiBtYWtlIHN1cmUgbm8gb3ZlcmZsb3cgaGFwcGVucyB3aXRoIGNvbG9ycy4KK2FmNmRlYWZmIHdlYnBpbmZvOiBoYW5kbGUgYWxwaGEgZmxhZyBtaXNtYXRjaAorN2NhZWYyOWIgRml4IHR5cG8gdGhhdCBjcmVlcGVkIGluLgorMzllMTlmOTIgTWVyZ2UgIm5lYXIgbG9zc2xlc3M6IGZpeCB1bnNpZ25lZCBpbnQgb3ZlcmZsb3cgd2FybmluZ3MuIgorOWJiYzA4OTEgbmVhciBsb3NzbGVzczogZml4IHVuc2lnbmVkIGludCBvdmVyZmxvdyB3YXJuaW5ncy4KK2UxMTE4ZDYyIE1lcmdlICJjb3NtZXRpY3MsRmluZENsb3Nlc3REaXNjcmV0aXplZDogdXNlIHVpbnQgaW4gbWFzayBjcmVhdGlvbiIKKzE4NmJjOWI3IE1lcmdlICJ3ZWJwaW5mbzogdG9sZXJhdGUgQUxQSCtWUDhMIgorYjU4ODcyOTcgY29zbWV0aWNzLEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQ6IHVzZSB1aW50IGluIG1hc2sgY3JlYXRpb24KK2YxNzg0YWVlIG5lYXJfbG9zc2xlc3MsRmluZENsb3Nlc3REaXNjcmV0aXplZDogdXNlIHVuc2lnbmVkIG9wcworMGQyMGFiYjMgd2VicGluZm86IHRvbGVyYXRlIEFMUEgrVlA4TAorOTcyMTA0YjMgd2VicG11eDogdG9sZXJhdGUgZmFsc2UgcG9zaXRpdmUgQWxwaGEgZmxhZworZGQ3ZTgzY2MgdGlmZmRlYyxSZWFkVElGRjogZW5zdXJlIGRhdGFfc2l6ZSBpcyA8IHRzaXplX3QgbWF4CitkOTg4ZWI3YiB0aWZmZGVjLE15UmVhZDogcXVpZXQgLVdzaG9ydGVuLTY0LXRvLTMyIHdhcm5pbmcKK2RhYmRhNzA3IHdlYnBpbmZvOiBhZGQgc3VwcG9ydCB0byBwYXJzZSBBbHBoYSBiaXRzdHJlYW0KKzRjMTE3NjQzIHdlYnBpbmZvOiBjb3JyZWN0IGJhY2tncm91bmQgY29sb3Igb3V0cHV0LCBCR1JBLT5BUkdCCitkZWZjOThkNyBEb2M6IGNsYXJpZnkgdGhlIHJvbGUgb2YgcXVhbGl0eSBpbiBXZWJQQ29uZmlnLgorZDc4ZmY3ODAgTWVyZ2UgIkZpeCBjb2RlIHRvIGNvbXBpbGUgd2l0aCBDKysuIgorYzhmMTQwOTMgRml4IGNvZGUgdG8gY29tcGlsZSB3aXRoIEMrKy4KKzQ5N2RjNmE3IHBubWRlYzogc2FuaXRpemUgaW52YWxpZCBoZWFkZXIgb3V0cHV0CitkNzhlNTg2NyBNZXJnZSAiY29uZmlndXJlOiB0ZXN0IGZvciAtV2NvbnN0YW50LWNvbnZlcnNpb24iCis0ODFlOTFlYiBNZXJnZSAicG5tZGVjLFBBTTogc2V0IGJ5dGVzX3Blcl9weCBiYXNlZCBvbiBkZXB0aCB3aGVuIG1pc3NpbmciCis5M2IxMjc1MyBjb25maWd1cmU6IHRlc3QgZm9yIC1XY29uc3RhbnQtY29udmVyc2lvbgorNjQ1ZjBjNTMgcG5tZGVjLFBBTTogc2V0IGJ5dGVzX3Blcl9weCBiYXNlZCBvbiBkZXB0aCB3aGVuIG1pc3NpbmcKK2U5MTU0NjA1IE1lcmdlICJ2d2VicDogYWN0aXZhdGUgR0xVVCBkb3VibGUtYnVmZmVyaW5nIgorODE4ZDc5NWIgdndlYnA6IGFjdGl2YXRlIEdMVVQgZG91YmxlLWJ1ZmZlcmluZworZDYzZTZmNGIgQWRkIGEgbWFuIHBhZ2UgZm9yIHdlYnBpbmZvCis0ZDcwODQzNSBNZXJnZSAiTkVPTjogaW1wbGVtZW50IENvbnZlcnRSR0IyNFRvWS9CR1IyNC9BUkdCL1JHQkEzMlRvVVYvQVJHQlRvVVYiCitmYWY0MjIxMyBORU9OOiBpbXBsZW1lbnQgQ29udmVydFJHQjI0VG9ZL0JHUjI0L0FSR0IvUkdCQTMyVG9VVi9BUkdCVG9VVgorYjRkNTc2ZmEgSW5zdGFsbCBtYW4gcGFnZXMgd2l0aCBDTWFrZS4KK2NiYzFiOTIxIHdlYnBpbmZvOiBhZGQgZmVhdHVyZXMgdG8gcGFyc2UgYml0c3RyZWFtIGhlYWRlcgorZTY0NGM1NTYgRml4IGJhZCBiaXQgd3JpdGVyIGluaXRpYWxpemF0aW9uLgorYjYyY2RhZDIgTWVyZ2UgIkltcGxlbWVudCBhIGNydW5jaGVyIGZvciBsb3NzbGVzcyBhdCBtZXRob2QgNi4iCitkYTNlNGRmYiB1c2UgdGhlIGV4YWN0IGNvbnN0YW50IGZvciB0aGUgZ2FtbWEgdHJhbnNmZXIgZnVuY3Rpb24KK2E5YzcwMWUwIE1lcmdlICJ0aWZmZGVjOiBmaXggRVhUUkFTQU1QTEVTIGNoZWNrIgorYWRhYjhjZTAgSW1wbGVtZW50IGEgY3J1bmNoZXIgZm9yIGxvc3NsZXNzIGF0IG1ldGhvZCA2LgorMWI5MmIyMzcgTWVyZ2UgIkZpeCBWUDhBcHBseU5lYXJMb3NzbGVzcyB0byByZXNwZWN0IGNvbnN0IGFuZCBzdHJpZGUuIgorMTkyM2ZmMDIgdGlmZmRlYzogZml4IEVYVFJBU0FNUExFUyBjaGVjaworOTdjY2U1YmEgdGlmZmRlYzogb25seSByZXF1ZXN0IEVYVFJBU0FNUExFUyB3Lz4gMyBzYW1wbGVzL3B4CiswZGNkODViNiBGaXggVlA4QXBwbHlOZWFyTG9zc2xlc3MgdG8gcmVzcGVjdCBjb25zdCBhbmQgc3RyaWRlLgorZjc2ODIxODkgeXV2OiByYXRpb25hbGl6ZSB0aGUgQy9TU0UyIGZ1bmN0aW9uIG5hbWluZworNTIyNDU0MjQgTkVPTiBpbXBsZW1lbnRhdGlvbiBvZiBzb21lIFNoYXJwLVlVVjQyMCBmdW5jdGlvbnMKKzY5MGVmZDgyIEF2b2lkIHNldmVyYWwgYmFja3dhcmQgcmVmZXJlbmNlIGNvcGllcy4KKzRiYjFmNjA3IHNyYy9kZWMvdnA4X2RlYy5oLCBjb3NtZXRpY3M6IGZpeCBjb21tZW50cworMjg1NzQ4YmUgY21ha2U6IGJ1aWxkL2luc3RhbGwgd2VicGluZm8KKzc4ZmQxOTljIGJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmM6IGNsZWFyIC1Xc2hhZG93IHdhcm5pbmdzCithZTgzNjQxMCBXZWJQTG9nMkZsb29yQzogY2xlYXIgLVdzaGFkb3cgd2FybmluZworZDBiNzQwNGUgTWVyZ2UgIldBU00gc3VwcG9ydCIKKzEzNGUzMTRmIFdBU00gc3VwcG9ydAorYzA4YWRiNmYgTWVyZ2UgIlZQOExFbmM6IHJlbW92ZSB1c2Ugb2YgQml0c0xvZzJDZWlsaW5nKCkiCisyOGMzN2ViZCBWUDhMRW5jOiByZW1vdmUgdXNlIG9mIEJpdHNMb2cyQ2VpbGluZygpCisyY2I1OGFiMiB3ZWJwaW5mbzogb3V0cHV0IGZvcm1hdCBhcyBhIGh1bWFuIHJlYWRhYmxlIHN0cmluZworYmIxNzVhOTMgTWVyZ2UgInJlbmFtZSBzb21lIHN5bWJvbHMgY2xhc2hpbmcgd2l0aCBNU1ZDIGhlYWRlcnMiCiszOWVkYTY1OCBSZW1vdmUgYSBkdXBsaWNhdGVkIHBpeGVsIGhhc2ggaW1wbGVtZW50YXRpb24uCiszNmI4Mjc0ZCByZW5hbWUgc29tZSBzeW1ib2xzIGNsYXNoaW5nIHdpdGggTVNWQyBoZWFkZXJzCisyNzRkYWY1NCBBZGQgd2VicGluZm8gdG9vbC4KK2VjNTAzNmU0IGFkZCBleHBsaWNpdCByZWZlcmVuY2UgdG8gL3Vzci9sb2NhbC97bGliLGluY30KKzE4ZjBkZmFjIE1lcmdlICJmaXggVElGRiBlbmNvZGVyIHJlZ2FyZGluZyByZ2JBL1JHQkEiCis0ZTJiMGI1MCBNZXJnZSAid2VicGRlYy5oOiBmaXggYSBkb2MgdHlwbyIKK2UyZWVhYmZmIE1lcmdlICJJbnN0YWxsIGJpbmFyaWVzLCBsaWJyYXJpZXMgYW5kIGhlYWRlcnMgaW4gQ01ha2UuIgorODM2NjA3ZTYgd2VicGRlYy5oOiBmaXggYSBkb2MgdHlwbworOTI3M2U0NDEgZml4IFRJRkYgZW5jb2RlciByZWdhcmRpbmcgcmdiQS9SR0JBCisxN2UzYzExZiBBZGQgbGltaXRlZCBQQU0gZGVjb2Rpbmcgc3VwcG9ydAorNWY2MjQ4NzEgSW5zdGFsbCBiaW5hcmllcywgbGlicmFyaWVzIGFuZCBoZWFkZXJzIGluIENNYWtlLgorOTc2YWRhYzEgTWVyZ2UgImxvc3NsZXNzIGluY3JlbWVudGFsIGRlY29kaW5nOiBmaXggbWlzc2luZyBlb3NfIHRlc3QiCitmOGZhZDRmYSBsb3NzbGVzcyBpbmNyZW1lbnRhbCBkZWNvZGluZzogZml4IG1pc3NpbmcgZW9zXyB0ZXN0CisyNzQxNWQ0MSBNZXJnZSAidndlYnBfc2RsOiBmaXggdGhlIG1ha2VmaWxlLnVuaXgiCis0OTU2NjE4MiBNZXJnZSAiSW1nSW9VdGlsV3JpdGVGaWxlKCk6IHVzZSBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlIgorNmY3NWE1MWIgQW5hbHl6ZSB0aGUgdHJhbnNmb3JtIGVudHJvcHkgb24gdGhlIHdob2xlIGltYWdlLgorYTVlNGUzYWYgVXNlIHBhbGV0dGUgb25seSBpZiB3ZSBjYW4gaW4gZW50cm9weSBhbmFseXNpcy4KKzc1YTljM2M0IEltcHJvdmUgY29tcHJlc3Npb24gYnkgYmV0dGVyIGVudHJvcHkgYW5hbHlzaXMuCiszOWNmNmY0ZiB2d2VicF9zZGw6IGZpeCB0aGUgbWFrZWZpbGUudW5peAorNjk5YjA0MTYgSW1nSW9VdGlsV3JpdGVGaWxlKCk6IHVzZSBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlCis3ZDk4NWJkMSBGaXggc21hbGwgZW50cm9weSBhbmFseXNpcyBidWcuCis2ZTdjYWYwNiBPcHRpbWl6ZSB0aGUgY29sb3IgY2FjaGUgc2l6ZS4KKzgzM2M5MjE5IE1vcmUgZWZmaWNpZW50IHN0b2NoYXN0aWMgaGlzdG9ncmFtIG1lcmdlLgorNTE4MzMyNmIgUmVmYWN0b3IgdGhlIGdyZWVkeSBoaXN0b2dyYW0gbWVyZ2UuCis5OWY2ZjQ2MiBNZXJnZSAiaGlzdG9ncmFtX2VuYy5jLE15UmFuZDogcy91bC91LyBmb3IgdW5zaWduZWQgY29uc3RhbnRzIgorODBhMjIxODYgc3NpbS5jOiByZW1vdmUgZGVhZCBpbmNsdWRlCithMTI4ZGZmZiBoaXN0b2dyYW1fZW5jLmMsTXlSYW5kOiBzL3VsL3UvIGZvciB1bnNpZ25lZCBjb25zdGFudHMKKzY5M2JmNzRlIG1vdmUgdGhlIFNTSU0gY2FsY3VsYXRpb24gY29kZSBpbiBzc2ltLmMgLyBzc2ltX3NzZTIuYworMTBkNzkxY2EgTWVyZ2UgIkZpeCB0aGUgcmFuZG9tIGdlbmVyYXRvciBpbiBIaXN0b2dyYW1Db21iaW5lU3RvY2hhc3RpYy4iCitmYTYzYTk2NiBGaXggdGhlIHJhbmRvbSBnZW5lcmF0b3IgaW4gSGlzdG9ncmFtQ29tYmluZVN0b2NoYXN0aWMuCisxNmJlMTkyZiBWUDhMU2V0Qml0UG9zOiByZW1vdmUgdGhlIGVvc18gc2V0dGluZworMDI3MTUxY2EgZG9uJ3QgZXJhc2UgdGhlIHN1cmZhY2UgYmVmb3JlIGJsaXR0aW5nLgorNDEwNWQ1NjUgZGlzYWJsZSBXRUJQX1VTRV9YWFggb3B0aW1pc2F0aW9ucyB3aGVuIEVNU0NSSVBURU4gaXMgZGVmaW5lZAorOWVlMzJhNzUgTWVyZ2UgIldlYlAtSlM6IGVtc2NyaXB0ZW4tYmFzZWQgSmF2YXNjcmlwdCBkZWNvZGVyIgorY2E5ZjdiN2QgV2ViUC1KUzogZW1zY3JpcHRlbi1iYXNlZCBKYXZhc2NyaXB0IGRlY29kZXIKKzg2OGFhNjkwIFBlcmZvcm0gZ3JlZWR5IGhpc3RvZ3JhbSBtZXJnZSBpbiBhIHVuaWZpZWQgd2F5LgorNWIzOTNmMmQgTWVyZ2UgImZpeCBwYXRoIHR5cG8gZm9yIHZ3ZWJwX3NkbCBpbiBNYWtlZmlsZS52YyIKK2UwMDEyYmVhIENNYWtlOiBvbmx5IHVzZSBsaWJ3ZWJwZGVjb2RlciBmb3IgYnVpbGRpbmcgZHdlYnAKKzg0YzJhN2IwIGZpeCBwYXRoIHR5cG8gZm9yIHZ3ZWJwX3NkbCBpbiBNYWtlZmlsZS52YworMWIwZTRhYmYgTWVyZ2UgIkFkZCBhIGZsYWcgdG8gZGlzYWJsZSBTSU1EIG9wdGltaXphdGlvbnMuIgorMzIyNjMyNTAgQWRkIGEgZmxhZyB0byBkaXNhYmxlIFNJTUQgb3B0aW1pemF0aW9ucy4KK2I0OTRmZGVjIG9wdGltaXplIHRoZSBBUkdCLT5BUkdCIEltcG9ydCB0byB1c2UgbWVtY3B5CitmMTUzNjAzOSBNZXJnZSAiUmVhZFdlYlA6IGRlY29kZSBkaXJlY3RseSBpbnRvIGEgcHJlLWFsbG9jYXRlZCBidWZmZXIiCitlNjllZDI5MSBSZWFkV2ViUDogZGVjb2RlIGRpcmVjdGx5IGludG8gYSBwcmUtYWxsb2NhdGVkIGJ1ZmZlcgorNTdkOGRlOGEgTWVyZ2UgInZ3ZWJwX3NkbDogc2ltcGxlIHZpZXdlciBiYXNlZCBvbiBTREwiCis1Y2ZkNGViYyBMWjc3IGludGVydmFsIHNwZWVkdXBzLiBGYXN0ZXIsIHNtYWxsZXIsIHNpbXBsZXIuCisxZTdhZDg4YiBQTk0gaGVhZGVyIGRlY29kZXI6IGFkZCBzb21lIGJhc2ljIG51bWVyaWNhbCB2YWxpZGF0aW9uCisxN2M3ODkwYyBNZXJnZSAiQWRkIGEgZGVjb2RlciBvbmx5IGxpYnJhcnkgZm9yIFdlYlAgaW4gQ01ha2UuIgorYmU3MzM3ODYgTWVyZ2UgIkFkZCBjbGFuZyBidWlsZCBmaXggZm9yIE1TQSIKKzAzY2RhMGU0IEFkZCBhIGRlY29kZXIgb25seSBsaWJyYXJ5IGZvciBXZWJQIGluIENNYWtlLgorYWE4OTM5MTQgQWRkIGNsYW5nIGJ1aWxkIGZpeCBmb3IgTVNBCiszMWE5MmU5NyBNZXJnZSAiaW1hZ2VpbzogYWRkIGxpbWl0ZWQgUE5NIHN1cHBvcnQgZm9yIHJlYWRpbmciCitkY2Y5ZDgyYSBpbWFnZWlvOiBhZGQgbGltaXRlZCBQTk0gc3VwcG9ydCBmb3IgcmVhZGluZworNjUyNGZjZDYgdndlYnBfc2RsOiBzaW1wbGUgdmlld2VyIGJhc2VkIG9uIFNETAorNmNmMjRhMjQgZ2V0X2Rpc3RvOiBmaXggcmVmZXJlbmNlIGZpbGUgcmVhZAorNDNkNDcyYWEgTWVyZ2UgdGFnICd2MC42LjAnCis1MGQxYTg0OCB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjYuMCwgb3JpZ2luLzAuNi4wLCAwLjYuMCkKKzIwYTdmZWEwIGV4dHJhcy9NYWtlZmlsZS5hbTogZml4IGxpYndlYnBleHRyYXMubGEgcmVmZXJlbmNlCis0MTVmM2ZmZSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjYuMC1yYzMpCiszYzZkMTIyNCB1cGRhdGUgTkVXUworZWU0YTQxNDEgdXBkYXRlIEFVVEhPUlMKKzMyZWQ4NTZmIEZpeCAiYWxsfG5vIGZyYW1lcyBhcmUga2V5ZnJhbWVzIiBzZXR0aW5ncy4KKzFjMzE5MGI2IE1lcmdlICJGaXggImFsbHxubyBmcmFtZXMgYXJlIGtleWZyYW1lcyIgc2V0dGluZ3MuIgorZjRkYzU2ZmQgZGlzYWJsZSBHcmFkaWVudFVuZmlsdGVyX05FT04KKzRmM2UzYmJkIGRpc2FibGUgR3JhZGllbnRVbmZpbHRlcl9ORU9OCisyZGMwYmRjYSBGaXggImFsbHxubyBmcmFtZXMgYXJlIGtleWZyYW1lcyIgc2V0dGluZ3MuCiswZDhlMDU4OCBpbWcyd2VicDogdHJlYXQgLWxvb3AgYXMgYSBuby1vcCB3L3NpbmdsZSBpbWFnZXMKK2IwNDUwMTM5IFJlYWRJbWFnZSgpOiByZXN0b3JlIHNpemUgcmVwb3J0aW5nCiswYWQzYjRlZiB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjYuMC1yYzIpCis2NDUxNzA5ZSBpbWcyd2VicCxnZXRfZGlzdG86IGZpeCBpbWFnZSBkZWNvZGUgdy9XSUMgYnVpbGRzCis5MjUwNGQyMSBnZXRfZGlzdG86IG1ha2UgUmVhZFBpY3R1cmUoKSByZXR1cm4gYSBib29sCitjM2U0YjNhOSB1cGRhdGUgTkVXUworMzM2M2ViNmQgbWFuL2ltZzJ3ZWJwLjE6IGZpeCBmb3JtYXR0aW5nIHdhcm5pbmcKKzRkMTMxMmYyIHVwZGF0ZSBORVdTCiszNmM0MmVhNCBidW1wIHZlcnNpb24gdG8gMC42LjAKK2JiNDk4YTUxIHVwZGF0ZSBBVVRIT1JTCis4NGNlZjE2ZiBNYWtlZmlsZS52YzogZml4IENGRz1kZWJ1Zy1keW5hbWljIGJ1aWxkCis5MTlmOWUyZiBNZXJnZSAiYWRkIC5yYyBmaWxlcyBmb3Igd2luZG93cyBkbGwgdmVyc2lvbmluZyIKK2YxYWU4YWY0IE1lcmdlICIuZ2l0aWdub3JlOiBhZGQgaW1nMndlYnAiCis0Njg5Y2UxNiBjd2VicDogYWRkIGEgLXNoYXJwX3l1diBvcHRpb24gZm9yICdzaGFycCcgUkdCLT5ZVVYgY29udmVyc2lvbgorNzliZjQ2ZjEgcmVuYW1lIHRoZSBwcmV0ZW50aW91cyBTbWFydFlVViBpbnRvIFNoYXJwWVVWCitlYjFkYzg5YSBzaWxlbnRseSBleHBvc2UgdXNlX2RlbHRhX3BhbGV0dGUgaW4gdGhlIFdlYlBDb25maWcgQVBJCitjODViMGRkZSAuZ2l0aWdub3JlOiBhZGQgaW1nMndlYnAKKzQzZDNmMDFhIGFkZCAucmMgZmlsZXMgZm9yIHdpbmRvd3MgZGxsIHZlcnNpb25pbmcKKzY2OGUxZGQ0IHNyYy97ZGVjLGVuYyx1dGlsc306IGdpdmUgZmlsZW5hbWVzIGEgdW5pcXVlIHN1ZmZpeAorMGU2YjdmMzMgTWVyZ2UgImlvc2J1aWxkLnNoOiBvbmx5IGFkZCByZXF1aXJlZCBoZWFkZXJzIHRvIGZyYW1ld29yayIKKzI5ZWQ2ZjlhIGlvc2J1aWxkLnNoOiBvbmx5IGFkZCByZXF1aXJlZCBoZWFkZXJzIHRvIGZyYW1ld29yaworNzFjNTNmMWEgTkVPTjogc3BlZWQtdXAgc3Ryb25nIGZpbHRlcmluZworNzNmNTY3ZWEgTWVyZ2UgImdldF9kaXN0bzogcmVtb3ZlIHJlZHVuZGFudCByZWFkZXIgY2hlY2siCis5ZTE0Mjc2ZiBNZXJnZSAibWFrZWZpbGVzOiBwcnVuZSBnZXRfZGlzdG8gJiB3ZWJwX3F1YWxpdHkgZGVwcyIKKzk5OTY1YmFjIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIGdldF9kaXN0by5leGUsIHdlYnBfcXVhbGl0eS5leGUiCitkNDkxMjIzOCBnZXRfZGlzdG86IHJlbW92ZSByZWR1bmRhbnQgcmVhZGVyIGNoZWNrCitlYTQ4MjQwOSBtYWtlZmlsZXM6IHBydW5lIGdldF9kaXN0byAmIHdlYnBfcXVhbGl0eSBkZXBzCisyZWRlNWExOSBNYWtlZmlsZS52YzogYWRkIGdldF9kaXN0by5leGUsIHdlYnBfcXVhbGl0eS5leGUKK2EzNDUwNjhhIEFSTTogc3BlZWQgdXAgYml0cmVhZGVyIGJ5IGF2b2lkaW5nIHRhYmxlcworMWRjODJhNmIgTWVyZ2UgImludHJvZHVjZSBhIGdlbmVyaWMgR2V0Q29lZmZzKCkgZnVuY3Rpb24gcG9pbnRlciIKKzgwNzRiODllIGludHJvZHVjZSBhIGdlbmVyaWMgR2V0Q29lZmZzKCkgZnVuY3Rpb24gcG9pbnRlcgorNzQ5YTQ1YTUgTWVyZ2UgIk5FT046IGltcGxlbWVudCBhbHBoYS1maWx0ZXJzIChob3Jpem9udGFsL3ZlcnRpY2FsL2dyYWRpZW50KSIKKzc0YzA1M2I1IE1lcmdlICJORU9OOiBmaXggb3ZlcmZsb3cgaW4gU1NFIE54TiBjYWxjdWxhdGlvbiIKKzBhM2FlZmY3IE1lcmdlICJkc3A6IFdlYlBFeHRyYWN0R3JlZW4gZnVuY3Rpb24gZm9yIGFscGhhIGRlY29tcHJlc3Npb24iCisxZGU5MzFjNiBORU9OOiBpbXBsZW1lbnQgYWxwaGEtZmlsdGVycyAoaG9yaXpvbnRhbC92ZXJ0aWNhbC9ncmFkaWVudCkKKzliM2FjYTQwIE5FT046IGZpeCBvdmVyZmxvdyBpbiBTU0UgTnhOIGNhbGN1bGF0aW9uCisxYzA3YTNjNiBkc3A6IFdlYlBFeHRyYWN0R3JlZW4gZnVuY3Rpb24gZm9yIGFscGhhIGRlY29tcHJlc3Npb24KKzllZDVlM2U1IHVzZSBwb2ludGVycyBmb3IgV2ViUFJlc2NhbGVyJ3MgaW4gV2ViUERlY1BhcmFtcworZGIwMTNhOGQgTWVyZ2UgIkFSTTogZG9uJ3QgdXNlIFVTRV9HRU5FUklDX1RSRUUiCitmY2Q0Nzg0ZCB1c2UgYSA4YiB0YWJsZSBmb3IgQy12ZXJzaW9uIGZvciBjbHooKQorZmJiNWM0NzMgQVJNOiBkb24ndCB1c2UgVVNFX0dFTkVSSUNfVFJFRQorOGZkYTU2MTIgTWVyZ2UgImFkZCBhIGtTbG93U1NTRTMgZmVhdHVyZSBmb3IgQ1BVSW5mbyIKKzg2YmJkMjQ1IGFkZCBhIGtTbG93U1NTRTMgZmVhdHVyZSBmb3IgQ1BVSW5mbworN2MyNzc5ZTkgR2V0IGNvZGUgdG8gZnVsbHkgY29tcGlsZSBpbiBDKysuCisyNTBjMzU4NiBNZXJnZSAiV2hlbiBjb21waWxpbmcgYXMgQysrLCBhdm9pZCBuYXJyb3dpbmcgd2FybmluZ3MuIgorYzA2NDhhYzIgV2hlbiBjb21waWxpbmcgYXMgQysrLCBhdm9pZCBuYXJyb3dpbmcgd2FybmluZ3MuCiswZDU1ZjYwYyA0MCUgZmFzdGVyIEFwcGx5QWxwaGFNdWx0aXBseV9TU0UyCis0OWQwMjgwZCBORU9OOiBpbXBsZW1lbnQgc2V2ZXJhbCBhbHBoYS1wcm9jZXNzaW5nIGZ1bmN0aW9ucworNDhiMWU4NWYgU1NFMjogMTUlIGZhc3RlciBhbHBoYS1wcm9jZXNzaW5nIGZ1bmN0aW9ucworZTNiOGFiYmMgZml4IHdhcm5pbmcgZnJvbSBzdGF0aWMgYW5hbHlzaXMuCisyOGZlMDU0ZSBTU0UyOiAzMCUgZmFzdGVyIEFwcGx5QWxwaGFNdWx0aXBseSgpCitmNDRhY2QyNSBNZXJnZSAiUHJvcGVybHkgY29tcHV0ZSB0aGUgb3B0aW1hbCBjb2xvciBjYWNoZSBzaXplLiIKKzUyNzg0NGZlIFByb3Blcmx5IGNvbXB1dGUgdGhlIG9wdGltYWwgY29sb3IgY2FjaGUgc2l6ZS4KK2JlMGVmNjM5IGZpeCBhIGNvbW1lbnQgdHlwbworODg3NGIxNjIgRml4IGEgbm9uLWRldGVybWluaXN0aWMgY29sb3IgY2FjaGUgc2l6ZSBjb21wdXRhdGlvbi4KK2Q3MTJlMjBkIERvIG5vdCBhbGxvdyBhIGNvbG9yIGNhY2hlIHNpemUgYmlnZ2VyIHRoYW4gdGhlIG51bWJlciBvZiBjb2xvcnMuCitlY2ZmMDRmNiByZS1pbnRyb2R1Y2Ugc29tZSBjb21tZW50cyBpbiBIdWZmbWFuIENvc3QuCisyNTllOTgyOCByZXBsYWNlICdwdHIgKyB5ICogc3RyaWRlJyBieSAncHRyICs9IHN0cmlkZScKKzAwYjA4Yzg4IE1lcmdlICJORU9OOiA1JSBmYXN0ZXIgY29udmVyc2lvbiB0byBSR0I1NjUgYW5kIFJHQkE0NDQ0IgorMGU3ZjQ0NDcgTWVyZ2UgIk5FT046IGZhc3RlciBmYW5jeSB1cHNhbXBsaW5nIgorYjAxNmNiOTEgTkVPTjogZmFzdGVyIGZhbmN5IHVwc2FtcGxpbmcKKzFjYjYzODAxIENhbGwgdGhlIEMgZnVuY3Rpb24gdG8gZmluaXNoIG9mZiBsb3NzbGVzcyBTU0UgbG9vcHMgb25seSB3aGVuIG5lY2Vzc2FyeS4KKzg3NWZhZmMxIEltcGxlbWVudCBCdW5kbGVDb2xvck1hcCBpbiBTU0UyLgorMzY3NGQ0OWUgTWVyZ2UgInJlbW92ZSBDbGFuZyB3YXJuaW5ncyB3aXRoIHVudXNlZCBhcmNoIGFyZ3VtZW50cy4iCitmMDRlYjM3NiBNZXJnZSB0YWcgJ3YwLjUuMicKKzM0MWQ3MTFjIE5FT046IDUlIGZhc3RlciBjb252ZXJzaW9uIHRvIFJHQjU2NSBhbmQgUkdCQTQ0NDQKK2FiYjU0ODI3IHJlbW92ZSBDbGFuZyB3YXJuaW5ncyB3aXRoIHVudXNlZCBhcmNoIGFyZ3VtZW50cy4KK2VjZTk2ODRmIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNS4yLXJjMiwgdGFnOiB2MC41LjIsIG9yaWdpbi8wLjUuMiwgMC41LjIpCithYTc3NDRjYSBhbmltX3V0aWw6IHF1aWV0IGltcGxpY2l0IGNvbnYgd2FybmluZ3MgaW4gMzItYml0CitkOTEyMDI3MSBqcGVnZGVjOiBjb3JyZWN0IENvbnRleHRGaWxsIHNpZ25hdHVyZQorMjRlYjM5NDAgUmVtb3ZlIHNvbWUgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHRoZSBjb2RlIGFzIEMrKy4KK2E0YThlNWYzIHZ3ZWJwOiBjbGVhciBjYW52YXMgZHVyaW5nIHJlc2l6ZSB3L28gYW5pbWF0aW9uCis2N2MyNWFkNSB2d2VicDogY2xlYXIgY2FudmFzIGR1cmluZyByZXNpemUgdy9vIGFuaW1hdGlvbgorYTRiYmU0YjMgZml4IGluZGVudGF0aW9uCiszMWNhMmE4MCB0aWZmZGVjOiByZXN0b3JlIGxpYnRpZmYgMy45LnggY29tcGF0aWJpbGl0eQorYjJmNzdiNTcgdXBkYXRlIE5FV1MKKzVhYjZkOWRlIEFuaW1FbmNvZGVyOiBhdm9pZCBmcmVlaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHBvaW50ZXIuCitmMjliZjU4MiBXZWJQQW5pbUVuY29kZXI6IElmICdtaW5pbWl6ZV9zaXplJyBhbmQgJ2FsbG93X21peGVkJyBvbiwgdHJ5IGxvc3N5ICsgbG9zc2xlc3MuCiszZWJlMWMwMCBBbmltRW5jb2RlcjogYXZvaWQgZnJlZWluZyB1bmluaXRpYWxpemVkIG1lbW9yeSBwb2ludGVyLgorZGY3ODBlMGUgZml4IGEgcG90ZW50aWFsIG92ZXJmbG93IHdpdGggTUFMTE9DX0xJTUlUCis1OGZjNTA3OCBNZXJnZSAiUHJlZGljdG9yU3ViOiBpbXBsZW1lbnQgZnVsbHktU1NFMiB2ZXJzaW9uIgorOWNjNDIxNjcgUHJlZGljdG9yU3ViOiBpbXBsZW1lbnQgZnVsbHktU1NFMiB2ZXJzaW9uCiswYWExZjM1YyByZW1vdmUgZGVwZW5kZW5jeSBvZiBpbWFnZWlvLyB0byBzdG9wd2F0Y2guaAorY2I5ZWM4NGIgTWVyZ2UgInJlbW92ZSB0aGUgZGVwZW5kZW5jeSB0byBzdG9wX3dhdGNoLltjaF0gaW4gaW1hZ2VpbyIKK2RjMGMwMWZiIE1lcmdlICJhbmltX3V0aWw6IHF1aWV0IGltcGxpY2l0IGNvbnYgd2FybmluZ3MgaW4gMzItYml0IgorODI3ZDNjNTAgTWVyZ2UgImZpeCBhIHBvdGVudGlhbCBvdmVyZmxvdyB3aXRoIE1BTExPQ19MSU1JVCIKKzFlMmUyNWIwIGFuaW1fdXRpbDogcXVpZXQgaW1wbGljaXQgY29udiB3YXJuaW5ncyBpbiAzMi1iaXQKKzIxODQ2MGNkIGJ1bXAgdmVyc2lvbiB0byAwLjUuMgorZGU3ZDY1NGQgdXBkYXRlIEFVVEhPUlMgJiAubWFpbG1hcAorMjczMzY3YzEgTWVyZ2UgImRzcC9sb3NzbGVzcy5jLGNvc21ldGljczogZml4IGluZGVudCIKKzc2YmJjZjJlIGZpeCBhIHBvdGVudGlhbCBvdmVyZmxvdyB3aXRoIE1BTExPQ19MSU1JVAorOGFjMWFiZmUgTWVyZ2UgImpwZWdkZWM6IGNvcnJlY3QgQ29udGV4dEZpbGwgc2lnbmF0dXJlIgorY2IyMTVhZWQgcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IHRvIHN0b3Bfd2F0Y2guW2NoXSBpbiBpbWFnZWlvCisyNDIzMDE3YSBkc3AvbG9zc2xlc3MuYyxjb3NtZXRpY3M6IGZpeCBpbmRlbnQKKzc0YTEyYjEwIGlvc2J1aWxkLnNoOiBhZGQgV2ViUERlY29kZXIuZnJhbWV3b3JrICsgZW5jb2RlcgorYTljYzc2MjEgTWVyZ2UgImlvc2J1aWxkLnNoOiBhZGQgV2ViUERlY29kZXIuZnJhbWV3b3JrICsgZW5jb2RlciIKK2ZiYmE1YmMyIG9wdGltaXplIHByZWRpY3RvciAjMSBpbiBwbGFpbi1DIEZvciBzb21lIHJlYXNvbiwgZ2NjIGhhcyBoYXJkIHRpbWUgaW5saW5pbmcgdGhpcyBvbmUuLi4KKzlhZTBiM2Y2IE1lcmdlICJTU0UyOiBzbGlnaHRseSAofjIlKSBmYXN0ZXIgUHJlZGljdG9yICMxIgorYzFmOTdiZDcgU1NFMjogc2xpZ2h0bHkgKH4yJSkgZmFzdGVyIFByZWRpY3RvciAjMQorZWE2NjRiODkgU1NFMjogMTAlIGZhc3RlciBQcmVkaWN0b3IgIzExCitiZTdkY2MwOCBBbmltRW5jb2RlcjogQ29ycmVjdGx5IHNraXAgYSBmcmFtZSB3aGVuIHN1Yi1yZWN0YW5nbGUgaXMgZW1wdHkuCis0MDg4NTgzMCBGaXggYXNzZXJ0aW9ucyBpbiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coKQorMWQ1MDQ2ZDEgaW9zYnVpbGQuc2g6IGFkZCBXZWJQRGVjb2Rlci5mcmFtZXdvcmsgKyBlbmNvZGVyCitjZWM3MjAxNCBqcGVnZGVjOiBjb3JyZWN0IENvbnRleHRGaWxsIHNpZ25hdHVyZQorOGYzOGM3MmUgZml4IGEgdHlwbyBpbiBXZWJQUGljdHVyZVlVVkFUb0FSR0IncyBkb2MKKzMzY2E5M2Y5IHN5c3RlbWF0aWNhbGx5IGNhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgb24gZGVjLT5wcmV2X2l0ZXJfCis3NmUxOTA3MyBkb2M6IHVzZSB0d28ncyBjb21wbGVtZW50IGV4cGxpY2l0bHkgZm9yIHVpbnQ4LT5pbnQ4IGNvbnZlcnNpb24KK2Y5MWJhOTYzIEFuaW1fZW5jb2RlcjogY29ycmVjdGx5IGhhbmRsZSBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8KKzI1ZDc0ZTY1IFdlYlBQaWN0dXJlRGlzdG9ydGlvbigpOiBmcmVlKCkgLT4gV2ViUFNhZmVGcmVlKCkKKzAzZjFjMDA4IG11eC9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgLWxtCis1ODQxMGNkNiBmaXggYnVnIGluIFJlZmluZVVzaW5nRGlzdG9ydGlvbigpCitlMTY4YWY4YyBmaXggZmlsdGVyaW5nIGF1dG8tYWRqdXN0bWVudAorZWQ5ZGVjNDEgZml4IGRvYyBhbmQgY29kZSBzbmlwcGV0IGZvciBXZWJQSU5ld0RlY29kZXIoKSBkb2MKKzNjNDkxNzhmIHByZXZlbnQgMzJiIG92ZXJmbG93IGZvciB2ZXJ5IGxhcmdlIGNhbnZhc193aWR0aCAvIGhlaWdodAorOTU5NWYyOTAgZml4IGFuaW1fdXRpbC5jIGNvbXBpbGF0aW9uIHdoZW4gSEFWRV9HSUYgaXMgbm90IGRlZmluZWQuCis3ZWM5NTUyYyBNYWtlIGdpZiB0cmFuc3BhcmVudCBjb2xvciB0byBiZSB0cmFuc3BhcmVudCBibGFjaworYjNmYjhiYjYgc2xpZ2h0bHkgZmFzdGVyIFByZWRpY3RvciAjMTEgaW4gTkVPTgorOTg3MTMzNWYgQWRkIGEgQ01ha2Ugb3B0aW9uIGZvciBXRUJQX1NXQVBfMTZCSVRfQ1NQLgorMGFlMzIyMjYgRml4IG1pc3NpbmcgY3B1LWZlYXR1cmVzIGZvciBBbmRyb2lkLgorYWI0YzgwNTYgY3B1LmNtYWtlOiBpbXByb3ZlIHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZyBvdXRwdXQKK2VlYzVmYTNhIFByb3ZpZGUgc3VwcG9ydCBmb3IgQ01ha2Ugb24gQW5kcm9pZCBzdHVkaW8gMi4yLgorMDA0ZDU2OTAgU3BsaXQgdGhlIG1haW4gQ01ha2UgZmlsZS4KKzRmZTVkNTg4IEFuZHJvaWQubWs6IHVzZSAtZnZpc2liaWxpdHk9aGlkZGVuCitiZDYzYTMxYSB2d2VicDogZW5zdXJlIHNldGVudigpIGlzIGF2YWlsYWJsZSBpbiBzdGRsaWIuaAorMzYzYTU2ODEgdndlYnA6IGhhbmRsZSB3aW5kb3cgcmVzaXppbmcgcHJvcGVybHkKK2EwZDI3NTNmIGxvd2VyIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgZGVmYXVsdAorMzFmZTExYTUgIGZpeCBpbmZpbml0ZSBsb29wIGluIGNhc2Ugb2YgUEFSVElUSU9OMCBvdmVyZmxvdworNTMyMjE1ZGQgQ2hhbmdlIHRoZSBydWxlIG9mIHBpY2tpbmcgVVYgbW9kZSBpbiBNQkFuYWx5emVCZXN0VVZNb2RlKCkKKzljNzVkYmQzIGN3ZWJwLjE6IGltcHJvdmUgc29tZSBncmFtbWFyCithZjJlMDVjYiB2d2VicDogQ2xlYXIgcHJldmlvdXMgZnJhbWUgd2hlbiBhIGtleSB0cmlnZ2VycyBhIHJlZHJhdworMjZmZmEyOTYgQWRkIGRlc2NyaXB0aW9ucyBvZiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gaW4gaGVscCBpbmZvLgorNzQxNjI4MGQgRml4IGFuIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgZXJyb3IgaW4gZW5jL2Nvc3QuaAorMTNjZjFkMmUgRG8gdG9rZW4gcmVjb3JkaW5nIGFuZCBjb3VudGluZyBpbiBhIHNpbmdsZSBsb29wCitlYjlhNGI5NyBSZXNldCBzZWdtZW50IGlkIGlmIHdlIGRlY2lkZSBub3QgdG8gdXBkYXRlIHNlZ21lbnQgbWFwCis0MmViZTNiNyBjb25maWd1cmU6IGZpeCBORU9OIGZsYWcgZGV0ZWN0aW9uIHVuZGVyIGdjYyA2Cis3NmViYmZmZiBORU9OOiBpbXBsZW1lbnQgcHJlZGljdG9yICMxMworOTViMTJhMDggTWVyZ2UgIlJldmVydCBBdmVyYWdlMyBhbmQgQXZlcmFnZTQiCis1NGFiMmU3NSBSZXZlcnQgQXZlcmFnZTMgYW5kIEF2ZXJhZ2U0CitmZTEyMzMwYyAzLTUlIGZhc3RlciBQcmVkaWN0b3IgIzUsICM2LCAjNyBhbmQgIzEwIGZvciBORU9OCitmYmZiM2JlZiB+MiUgZmFzdGVyIHByZWRpY3RvciAjMTAgZm9yIE5FT04KK2Q0YjdkODAxIGxvc3NsZXNzX3NzZTI6IHVzZSB0aGUgbG9jYWwgZnVuY3Rpb25zCithNWUzYjIyNSBMb3NzbGVzcyBkZWNvZGVyIFNTRTIgaW1wcm92ZW1lbnRzLgorNThhMWYxMjQgfjIlIGZhc3RlciBwcmVkaWN0b3IgIzEyIGluIE5FT04uCis5MDZjM2I2MyBNZXJnZSAiSW1wbGVtZW50IGxvc3NsZXNzIHRyYW5zZm9ybXMgaW4gTkVPTi4iCitkMjNhYmU0ZSBJbXBsZW1lbnQgbG9zc2xlc3MgdHJhbnNmb3JtcyBpbiBORU9OLgorMmU2Y2I2ZjMgR2l2ZSBtb3JlIGZsZXhpYmlsaXR5IHRvIHRoZSBwcmVkaWN0b3IgZ2VuZXJhdGluZyBtYWNyby4KKzI4ZTBiYjcwIE1lcmdlICJGaXggcmFjZSBjb25kaXRpb24gaW4gbXVsdGktdGhyZWFkaW5nIGluaXRpYWxpemF0aW9uLiIKKzY0NzA0NTMwIEZpeCByYWNlIGNvbmRpdGlvbiBpbiBtdWx0aS10aHJlYWRpbmcgaW5pdGlhbGl6YXRpb24uCitiZGVkNzg0OCBpbWcyd2VicDogZml4IGRlZmF1bHQgLWxvc3NsZXNzIHZhbHVlIGFuZCB1c2UgcGljLmFyZ2I9MQorMGU2MWE1MTMgTWVyZ2UgImltZzJ3ZWJwOiBjb252ZXJ0IGEgc2VxdWVuY2Ugb2YgaW1hZ2VzIHRvIGFuIGFuaW1hdGVkIHdlYnAiCisxY2M3OWU5MiBBbmltRW5jb2RlcjogQ29ycmVjdGx5IHNraXAgYSBmcmFtZSB3aGVuIHN1Yi1yZWN0YW5nbGUgaXMgZW1wdHkuCiswM2Y0MDk1NSBpbWcyd2VicDogY29udmVydCBhIHNlcXVlbmNlIG9mIGltYWdlcyB0byBhbiBhbmltYXRlZCB3ZWJwCitlYTcyY2Q2MCBhZGQgbWlzc2luZyAnZXh0ZXJuJyBrZXl3b3JkIGZvciBwcmVkaWN0b3IgZGNsCis2Nzg3OWU2ZCBTU0UgaW1wbGVtZW50YXRpb24gb2YgZGVjb2RpbmcgcHJlZGljdG9ycy4KKzM0YWVlOTkwIE1lcmdlICJ2d2VicDogbWFrZSAnZCcga2V5IHRvZ2dsZSB0aGUgZGVidWdnaW5nIG9mIGZyYWdtZW50cyIKK2E0MTI5NmFlIEZpeCBwb3RlbnRpYWxseSB1bmluaXRpYWxpemVkIHZhbHVlLgorYzg1YWRiMzMgdndlYnA6IG1ha2UgJ2QnIGtleSB0b2dnbGUgdGhlIGRlYnVnZ2luZyBvZiBmcmFnbWVudHMKKzQyMzlhMTQ4IE1ha2UgdGhlIGxvc3NsZXNzIHByZWRpY3RvcnMgd29yayBvbiBhIGJhdGNoIG9mIHBpeGVscy4KK2JjMThlYmFkIGZpeCBleHRyYSAnY29uc3QncyBpbiBzaWduYXR1cmVzCis3MWUyZjVjYSBSZW1vdmUgbWVtY3B5IGluIGxvc3NsZXNzIGRlY29kaW5nLgorNzQ3NGQ0NmUgRG8gbm90IHVzZSBhIHJlZ2lzdGVyIGFycmF5IGluIFNTRS4KKzY3NzQ4YjQxIEltcHJvdmUgbGF0ZW5jeSBvZiBGVHJhbnNmb3JtMi4KKzE2OTUxYjE5IE1lcmdlICJQcm92aWRlIGFuIFNTRSBpbXBsZW1lbnRhdGlvbiBvZiBDb252ZXJ0QkdSQVRvUkdCIgorNjU0MGNkMGUgUHJvdmlkZSBhbiBTU0UgaW1wbGVtZW50YXRpb24gb2YgQ29udmVydEJHUkFUb1JHQgorZGU1NjhhYmYgQW5kcm9pZC5tazogdXNlIC1mdmlzaWJpbGl0eT1oaWRkZW4KKzNjMmE2MWIwIHJlbW92ZSBzb21lIHVubmVlZGVkIGNhc3RzCis5YWMwNjNjMyBhZGQgZHNwIGZ1bmN0aW9ucyBmb3IgU21hcnRZVVYKKzIyZWZhYmRkIE1lcmdlICJzbWFydF95dXY6IHN3aXRjaCB0byBwbGFuYXIgaW5zdGVhZCBvZiBwYWNrZWQgci9nL2IgcHJvY2Vzc2luZyIKKzFkNmU3YmYzIHNtYXJ0X3l1djogc3dpdGNoIHRvIHBsYW5hciBpbnN0ZWFkIG9mIHBhY2tlZCByL2cvYiBwcm9jZXNzaW5nCiswYTM4MzhjYSBmaXggYnVnIGluIFJlZmluZVVzaW5nRGlzdG9ydGlvbigpCitjMDY5OTUxNSB3ZWJwbXV4IC1kdXJhdGlvbjogc2V0IGRlZmF1bHQgJ2VuZCcgdmFsdWUgZXF1YWwgdG8gJ3N0YXJ0JworODNjYmZhMDkgSW1wb3J0OiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCithMWFkZTQwZSBQcmVwcm9jZXNzQVJHQjogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworZmQ0ZDA5MGYgQ29udmVydFdSR0JUb1lVVjogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworOWRhYWQ0NTkgSW1wb3J0WVVWQUZyb21SR0JBOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCitmOTBjNjBkMSBNZXJnZSAiYWRkIGEgIi1kdXJhdGlvbiBkdXJhdGlvbixzdGFydCxlbmQiIG9wdGlvbiB0byB3ZWJwbXV4IgorM2YxODJkMzYgYWRkIGEgIi1kdXJhdGlvbiBkdXJhdGlvbixzdGFydCxlbmQiIG9wdGlvbiB0byB3ZWJwbXV4CiszNDJlMTVmMCBJbXBvcnQ6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKKzExNDdhYjRlIFByZXByb2Nlc3NBUkdCOiB1c2UgcmVsYXRpdmUgcG9pbnRlciBvZmZzZXRzCitlNGNkNGRhZiBmaXggZmlsdGVyaW5nIGF1dG8tYWRqdXN0bWVudAorZTcxNTI4NTYgZml4IGRvYyBhbmQgY29kZSBzbmlwcGV0IGZvciBXZWJQSU5ld0RlY29kZXIoKSBkb2MKK2RlOWZhNTA3IENvbnZlcnRXUkdCVG9ZVVY6IHVzZSByZWxhdGl2ZSBwb2ludGVyIG9mZnNldHMKK2RlYjFiODMxIEltcG9ydFlVVkFGcm9tUkdCQTogdXNlIHJlbGF0aXZlIHBvaW50ZXIgb2Zmc2V0cworYzI4NDc4MGYgaW1hZ2Vpb191dGlsOiBhZGQgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3cKK2UzNzUwODBkIGdpZmRlYyxSZW1hcDogYXZvaWQgb3V0IG9mIGJvdW5kcyBjb2xvcm1hcCByZWFkCitjMjIyYTA1MyBhZGRpdGlvbmFsIGZpeCBmb3Igc3RyaWRlIHR5cGUgYXMgc2l6ZV90CitiYjIzMzYxNyBmaXggcG90ZW50aWFsIG92ZXJmbG93IHdoZW4gd2lkdGggKiBoZWlnaHQgKiA0ID49ICgxPDwzMikKKzg4M2Q0MWZiIGdpZjJ3ZWJwOiBmaXggY3Jhc2ggd2l0aCBOVUxMIGV4dGVuc2lvbiBkYXRhCitjYWM5YTM2YSBnaWZkZWMsUmVtYXA6IGF2b2lkIG91dCBvZiBib3VuZHMgY29sb3JtYXAgcmVhZAorNDU5NWUwMWYgUmV2ZXJ0ICJnaWZkZWMsUmVtYXA6IGF2b2lkIG91dCBvZiBib3VuZHMgY29sb3JtYXAgcmVhZCIKK2ZiNTJkNDQzIGdpZmRlYzogbWFrZSBzb21lIGNvbnN0YW50cyB1bnNpZ25lZAorZjA0OGQzOGQgZ2lmZGVjLFJlbWFwOiBhdm9pZCBvdXQgb2YgYm91bmRzIGNvbG9ybWFwIHJlYWQKKzMxYjFlMzQzIGZpeCBTU0lNIG1ldHJpYyAuLi4gYnkgaWdub3JpbmcgdG9vLWRhcmsgYXJlYQorMmY1MWI2MTQgaW50cm9kdWNlIFdlYlBQbGFuZURpc3RvcnRpb24gdG8gY29tcHV0ZSBwbGFuZSBkaXN0b3J0aW9uCiswMTA0ZDczMCBjb25maWd1cmU6IGZpeCBORU9OIGZsYWcgZGV0ZWN0aW9uIHVuZGVyIGdjYyA2CisyNjVhYmJlOSBNZXJnZSAiYWRkaXRpb25hbCBmaXggZm9yIHN0cmlkZSB0eXBlIGFzIHNpemVfdCIKK2Y3NjAxYWE2IE1lcmdlICJJbnRyb2R1Y2UgYSBnZW5lcmljIFdlYlBHZXRJbWFnZVJlYWRlcih0eXBlKSBmdW5jdGlvbiIKK2NlODczMzIwIEludHJvZHVjZSBhIGdlbmVyaWMgV2ViUEdldEltYWdlUmVhZGVyKHR5cGUpIGZ1bmN0aW9uCisyYTI3NzNlYSBpbWFnZWlvLypkZWMsUmVhZCo6IGFkZCBpbnB1dCBwYXJhbWV0ZXIgY2hlY2tzCis5ZjVjOGVjYSBhZGRpdGlvbmFsIGZpeCBmb3Igc3RyaWRlIHR5cGUgYXMgc2l6ZV90Cis0ZWI1ZGYyOCByZW1vdmUgdW51c2VkIHN0cmlkZSBmaWVsZHMgZnJvbSBWUDhJdGVyYXRvcgorMTFiYzQyM2EgTUlOX0xFTkdUSCBjbGVhbnVwcy4KKzI3M2QwMzVhIE1lcmdlICJmaXggYSB0eXBvIGluIFdlYlBQaWN0dXJlWVVWQVRvQVJHQidzIGRvYyIKKzRkYjgyYTE3IE1lcmdlICJmaXggcG90ZW50aWFsIG92ZXJmbG93IHdoZW4gd2lkdGggKiBoZWlnaHQgKiA0ID49ICgxPDwzMikiCitlMmFmZmFjYyBmaXggcG90ZW50aWFsIG92ZXJmbG93IHdoZW4gd2lkdGggKiBoZWlnaHQgKiA0ID49ICgxPDwzMikKK2RjNzg5YWRhIGZpeCBhIHR5cG8gaW4gV2ViUFBpY3R1cmVZVVZBVG9BUkdCJ3MgZG9jCis1MzlmNWE2OCBGaXggbm9uLWluY2x1ZGVkIGhlYWRlciBpbiBjb25maWcuYy4KK2FhZjJhNmE2IHN5c3RlbWF0aWNhbGx5IGNhbGwgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCkgb24gZGVjLT5wcmV2X2l0ZXJfCisyMGVmOTkxNSBNZXJnZSAiaW1hZ2Vpb191dGlsOiBhZGQgSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3ciCitiYzg2YjdhOCBpbWFnZWlvX3V0aWw6IGFkZCBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdworODA2ZjYyNzkgZ2lmMndlYnA6IGZpeCBjcmFzaCB3aXRoIE5VTEwgZXh0ZW5zaW9uIGRhdGEKKzY4YWU1YjY3IEFkZCBsaWJ3ZWJwL3NyYy9tdXgvYW5pbWkuaAorMjhjZTMwNDMgUmVtb3ZlIHNvbWUgZXJyb3JzIHdoZW4gY29tcGlsaW5nIHRoZSBjb2RlIGFzIEMrKy4KK2IzNGFiY2I4IEZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhciBpbiBzcGF0aWFsIHByZWRpY3Rpb24gbW9kZSBzZWxlY3Rpb24KK2JhODQzYTkyIGZpeCBzb21lIFNTSU0gY2FsY3VsYXRpb25zCis1MWI3MWZkMiBNZXJnZSAidndlYnA6IGVuc3VyZSBzZXRlbnYoKSBpcyBhdmFpbGFibGUgaW4gc3RkbGliLmgiCitmYjAxNzQzYSBnZXRfZGlzdG86IGZpeCB0aGUgci9nL2Igb3JkZXIgZm9yIGx1bWEgY2FsY3VsYXRpb24KK2JmYWI4OTQ3IHZ3ZWJwOiBlbnN1cmUgc2V0ZW52KCkgaXMgYXZhaWxhYmxlIGluIHN0ZGxpYi5oCis5MzEwZDE5MiB2d2VicDogaGFuZGxlIHdpbmRvdyByZXNpemluZyBwcm9wZXJseQorZjc5NDUwY2EgU3BlZWR1cCBBcHBseU1hcC4KK2NmZGRhN2M2IE1lcmdlICJwcmV2ZW50IDMyYiBvdmVyZmxvdyBmb3IgdmVyeSBsYXJnZSBjYW52YXNfd2lkdGggLyBoZWlnaHQiCitlMzYzOTZiYSBNZXJnZSAiZ2V0X2Rpc3RvOiBuZXcgb3B0aW9uIHRvIGNvbXB1dGUgU1NJTSBtYXAgYW5kIGNvbnZlcnQgdG8gZ3JheSIKKzE4YTlhMGFiIEFkZCBhbiBBUEkgdG8gaW1wb3J0IGEgY29sb3ItbWFwcGVkIGltYWdlLgorMzBkNDM3MDYgU3BlZWQtdXAgQ29tYmluZWQgZW50cm9weSBmb3IgcGFsZXR0aXplZCBoaXN0b2dyYW1zLgorMzZhYTA4N2IgZ2V0X2Rpc3RvOiBuZXcgb3B0aW9uIHRvIGNvbXB1dGUgU1NJTSBtYXAgYW5kIGNvbnZlcnQgdG8gZ3JheQorODZhODRiMzUgMnggZmFzdGVyIFNTRTIgaW1wbGVtZW50YXRpb24gb2YgU1NJTUdldAorYjgzODRiNTMgbG93ZXIgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSBkZWZhdWx0CisxYzM2NDQwMCBwcmV2ZW50IDMyYiBvdmVyZmxvdyBmb3IgdmVyeSBsYXJnZSBjYW52YXNfd2lkdGggLyBoZWlnaHQKK2VlZTBjY2UxIE1lcmdlICJTbWFsbCBMWjc3IHNwZWVkdXBzLiIKKzVmMWNhZjI5IFNtYWxsIExaNzcgc3BlZWR1cHMuCisxZWZmZGU3YiBmaXggYW5pbV91dGlsLmMgY29tcGlsYXRpb24gd2hlbiBIQVZFX0dJRiBpcyBub3QgZGVmaW5lZC4KK2EyZmU5YmY0IFNwZWVkdXAgVHJlbGxpc1F1YW50aXplQmxvY2soKS4KKzU3M2NjZTI3IHNtYXJ0WVVWIGltcHJvdmVtZW50cworMjFlNzUzN2EgIGZpeCBpbmZpbml0ZSBsb29wIGluIGNhc2Ugb2YgUEFSVElUSU9OMCBvdmVyZmxvdworMDUzYTE1NjUgTWVyZ2UgIkNoYW5nZSB0aGUgcnVsZSBvZiBwaWNraW5nIFVWIG1vZGUgaW4gTUJBbmFseXplQmVzdFVWTW9kZSgpIgorMTM3N2FjMmUgQ2hhbmdlIHRoZSBydWxlIG9mIHBpY2tpbmcgVVYgbW9kZSBpbiBNQkFuYWx5emVCZXN0VVZNb2RlKCkKKzdjMWZiN2QwIGZpeCB1aW50MzJfdCBpbml0aWFsaXphdGlvbiAoMC4gLT4gMCkKK2JmZmYwYmYzIHNwZWVkLXVwIFNTSU0gY2FsY3VsYXRpb24KKzY0NTc3ZGU4IERlLVZQOEwtaXplIEdldEVudHJvcFVucmVmaW5lZEhlbHBlci4KK2E3YmU3MzI4IE1lcmdlICJyZWZhY3RvciB0aGUgUFNOUiAvIFNTSU0gY2FsY3VsYXRpb24gY29kZSIKKzUwYzNkN2RhIHJlZmFjdG9yIHRoZSBQU05SIC8gU1NJTSBjYWxjdWxhdGlvbiBjb2RlCitkNjIyOGFlZCBpbmRlbnRhdGlvbiBmaXggYWZ0ZXIgSTcwNTVkM2VlM2JkN2VkNWU3OGU5NGFlODJjYjg1OGZhN2RiM2RkYzAKK2RkNTM4YjE5IFJlbW92ZSB1bnVzZWQgZGVjbGFyYXRpb24uCis2Y2M0OGIxNyBNb3ZlIHNvbWUgbG9zc2xlc3MgbG9naWMgb3V0IG9mIGRzcC4KKzc4MzYzZTllIE1lcmdlICJSZW1vdmUgYSByZWR1bmRhbnQgY2FsbCB0byBJbml0TGVmdCgpIGluIFZQOEl0ZXJhdG9yUmVzZXQoKSIKK2ZmZDAxOTI5IFJlZmFjdG9yIFZQOEl0ZXJhdG9yTmV4dCgpLgorYzRmNmQ5YzkgUmVtb3ZlIGEgcmVkdW5kYW50IGNhbGwgdG8gSW5pdExlZnQoKSBpbiBWUDhJdGVyYXRvclJlc2V0KCkKK2MyN2Q4MjEwIE1lcmdlICJzbWFydFlVVjogc2ltcGxpZnkgbWFpbiBsb29wIgorMDc3OTUyOTYgc21hcnRZVVY6IHNpbXBsaWZ5IG1haW4gbG9vcAorYzliNDU4NjMgU3BsaXQgb2ZmIGNvbW1vbiBsb3NzbGVzcyBkc3AgaW5saW5lIGZ1bmN0aW9ucy4KKzQ5MGFlNWIxIHNtYXJ0WVVWOiBpbXByb3ZlIGluaXRpYWwgc3RhdGUgZm9yIGZhc3RlciBjb252ZXJnZW5jZQorODk0MjMyYmUgc21hcnRZVVY6IGZpeCBhbmQgc2ltcGxpZnkgdGhlIG92ZXItemVhbG91cyBzdG9wIGNyaXRlcmlvbgorOGRlMDg0ODMgUmVtb3ZlIHVudXNlZCBjb2RlIGluIHdlYnBpLmgKKzQxY2FiN2ZlIGltYWdlaW8vQW5kcm9pZC5tazogY29ycmVjdCBpbWFnZWRlYyBkZXBlbmRlbmNpZXMKKzgyYzkxYzcwIE1lcmdlICJsaWJpbWFnZWVuYy5hOiBleHRyYWN0IGltYWdlLXNhdmluZyBjb2RlIGZyb20gZHdlYnAiCithZjFhZDNlMiBsaWJpbWFnZWVuYy5hOiBleHRyYWN0IGltYWdlLXNhdmluZyBjb2RlIGZyb20gZHdlYnAKK2RkNzMwOWUzIE1lcmdlICJkb2M6IHVzZSB0d28ncyBjb21wbGVtZW50IGV4cGxpY2l0bHkgZm9yIHVpbnQ4LT5pbnQ4IGNvbnZlcnNpb24iCis2MTA1Nzc3ZSBNZXJnZSAiYWRkIGdpZjJ3ZWJwIHRvIENNYWtlIgorMTNhZTAxMWUgZG9jOiB1c2UgdHdvJ3MgY29tcGxlbWVudCBleHBsaWNpdGx5IGZvciB1aW50OC0+aW50OCBjb252ZXJzaW9uCis0YmRhMGNmYiBhZGQgZ2lmMndlYnAgdG8gQ01ha2UKKzYwMjljN2ZlIE1lcmdlICJyZW1vdmUgbWVudGlvbiBvZiBmcmFnbWVudCwgZnJnbSwgRlJHTSwgZXRjLiIKKzU0NWMxNDdmIHJlbW92ZSBtZW50aW9uIG9mIGZyYWdtZW50LCBmcmdtLCBGUkdNLCBldGMuCis1YjQ2ZjdmYyBjd2VicC4xOiBpbXByb3ZlIHNvbWUgZ3JhbW1hcgorOWU0NzhmODAgZGVjL3ZwOGwuYzogYWRkIGFzc2VydGlvbnMgaW4gRW1pdFJlc2NhbGVkUm93c1JHQkEvWVVWQQorNDNiZDg5NTggTWFrZSBnaWYgdHJhbnNwYXJlbnQgY29sb3IgdG8gYmUgdHJhbnNwYXJlbnQgYmxhY2sKKzA4ODdmYzJkIE1lcmdlICJnZXRfZGlzdG86IGFkZCBhICctbyBmaWxlJyBvcHRpb24gdG8gc2F2ZSBhIGRpZmYgbWFwIgorMGRlNDhlMTggZ2V0X2Rpc3RvOiBhZGQgYSAnLW8gZmlsZScgb3B0aW9uIHRvIHNhdmUgYSBkaWZmIG1hcAorMGE1N2FkMGQgY29zbWV0aWNzOiBXZWJQU2FmZUFsbG9jIC0+IFdlYlBTYWZlTWFsbG9jCiswYTQ2OTliYyBNZXJnZSAiV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCk6IGZyZWUoKSAtPiBXZWJQU2FmZUZyZWUoKSIKKzI5ZmVkYmY1IEFuaW1fZW5jb2RlcjogY29ycmVjdGx5IGhhbmRsZSBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8KKzMyZGVhZDRlIFdlYlBQaWN0dXJlRGlzdG9ydGlvbigpOiBmcmVlKCkgLT4gV2ViUFNhZmVGcmVlKCkKKzg1Y2Q1ZDA2IFNtYXJ0ZXIgTFo3NyBmb3IgdW5pZm9ybSByZWdpb25zLgorNjU4NTA3NWYgQ2hhbmdlIFBpeGVsc0FyZVNpbWlsYXIoKSB0byBoYW5kbGUgYmxhY2sgcGl4ZWxzIGNvcnJlY3RseS4KK2MwYTI3ZmQyIHZ3ZWJwOiBDbGVhciBwcmV2aW91cyBmcmFtZSB3aGVuIGEga2V5IHRyaWdnZXJzIGEgcmVkcmF3Cis1N2E1ZTNiNiB3ZWJwX3F1YWxpdHkgc2hvdWxkIHJldHVybiAnMCcgaW4gY2FzZSBvZiBzdWNjZXNzLgorN2YxYjg5N2IgRmFzdGVyIHN0b2NoYXN0aWMgaGlzdG9ncmFtIG1lcmdpbmcuCis0OGM4MTBiOCBNZXJnZSAicmVtb3ZlIFdFQlBfRk9SQ0VfQUxJR05FRCBhbmQgdXNlIG1lbWNweSgpIGluc3RlYWQuIgorMzg4NDk3MmUgcmVtb3ZlIFdFQlBfRk9SQ0VfQUxJR05FRCBhbmQgdXNlIG1lbWNweSgpIGluc3RlYWQuCis0ODVjYWMxYSBzd2l0Y2ggbGliaW1hZ2VkZWMuYSBhbmQgbGliaW1hZ2Vpb191dGlsLmEgdG8gYXZvaWQgdW5kZWZpbmVkIHN5bWJvbAorMDA1ZTE1YjEgTWVyZ2UgIntleHRyYXMsbXV4fS9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgLWxtIgorNmFiNDk2ZWQgZml4IHNvbWUgJ3Vuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cnIHdhcm5pbmdzIGluIHVic2FuCis4YTRlYmM2YSBSZXZlcnQgImZpeCAndW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdycgd2FybmluZ3MgaW4gdWJzYW4iCis5ZDRmMjA5ZiBNZXJnZSBjaGFuZ2VzIEkyNTcxMWRkNSxJNDMxODhmYWIKK2U0NGY1MjQ4IGZpeCAndW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdycgd2FybmluZ3MgaW4gdWJzYW4KKzI3YjVkOTkxIEZpeCBhc3NlcnRpb25zIGluIFdlYlBSZXNjYWxlckV4cG9ydFJvdygpCis3NGY2ZjllNyBBZGQgZGVzY3JpcHRpb25zIG9mIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpbiBoZWxwIGluZm8uCithYWYyNTMwYyB7ZXh0cmFzLG11eH0vTWFrZWZpbGUuYW06IGFkZCBtaXNzaW5nIC1sbQorMTI2OWRjN2MgUmVmYWN0b3IgVlA4TENvbG9yQ2FjaGVDb250YWlucygpCis0MDg3MmZiMiBkZWNfbmVvbixOZWVkc0hldjogbWljcm8gb3B0aW1pemF0aW9uCis3YjU0ZTI2YiBBZGQgYSBDTWFrZSBvcHRpb24gZm9yIFdFQlBfU1dBUF8xNkJJVF9DU1AuCitkMjIyM2Q4ZCBGaXggbWlzc2luZyBjcHUtZmVhdHVyZXMgZm9yIEFuZHJvaWQuCitiZjE2YTRiNCBNZXJnZSAiY3B1LmNtYWtlOiBpbXByb3ZlIHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZyBvdXRwdXQiCitlZTEwNTdlMyBjcHUuY21ha2U6IGltcHJvdmUgd2VicF9jaGVja19jb21waWxlcl9mbGFnIG91dHB1dAorYjU1MWU1ODcgY29zbWV0aWNzOiBhZGQge31zIG9uIGNvbnRpbnVlZCBjb250cm9sIHN0YXRlbWVudHMKK2QyZTQ0ODRlIGRzcC9NYWtlZmlsZS5hbTogcHV0IG1zYSBzb3VyY2UgaW4gY29ycmVjdCBsaWIKK2M3ZjY2YzgyIE1lcmdlICJ1dGlscy90aHJlYWQuYyxjb3NtZXRpY3M6IGpvaW4gYSBmZXcgbGluZXMiCis5OGQ4ZjI5NSBNZXJnZSAiZXhhbXBsZXMvTWFrZWZpbGUuYW0sY29zbWV0aWNzOiBzb3J0IGJpbmFyeSB0YXJnZXRzIgorMzlmNGZmYmMgdXRpbHMvdGhyZWFkLmMsY29zbWV0aWNzOiBqb2luIGEgZmV3IGxpbmVzCithODZjZTJiMSBNZXJnZSAiZXh0cmFzL01ha2VmaWxlLmFtOiBkb24ndCBpbnN0YWxsIGxpYndlYnBleHRyYXMiCis2ZmE5ZmUyNCBleHRyYXMvTWFrZWZpbGUuYW06IGRvbid0IGluc3RhbGwgbGlid2VicGV4dHJhcworMGIyYzU4YTkgRml4IGFuIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgZXJyb3IgaW4gZW5jL2Nvc3QuaAorZDdjZTRhMmUgZXhhbXBsZXMvTWFrZWZpbGUuYW0sY29zbWV0aWNzOiBzb3J0IGJpbmFyeSB0YXJnZXRzCiszODZlNGJhMiBSZXNldCBzZWdtZW50IGlkIGlmIHdlIGRlY2lkZSBub3QgdG8gdXBkYXRlIHNlZ21lbnQgbWFwCis3Yjg3ZTg0OCBNZXJnZSAiQWRkIE1TQSBvcHRpbWl6ZWQgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucyIKK2QzZGRhY2I2IEFkZCBNU0Egb3B0aW1pemVkIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMKK2ViOThkOGQ4IHdlYnBfcXVhbGl0eTogZGV0ZWN0IGxvc3NsZXNzIGZvcm1hdCBhbmQgZmVhdHVyZXMKK2ViZWU1N2Y0IG1vdmUgaW1hZ2Vpby9leGFtcGxlX3V0aWwuW2hjXSAoYmFjayB0bykgZXhhbXBsZXMvCis5OTU0MmJiZiB3ZWJwZGVjOiBzL0V4VXRpbC8vCitkYTU3M2NmNCBpbWFnZWlvX3V0aWw6IHMvRXhVdGlsL0ltZ0lvVXRpbC8KK2JkZGE1YmQ0IHNwbGl0IGV4YW1wbGVfdXRpbC5oCisxNWVkNDYyYiAuZ2l0aWdub3JlOiBhZGQgZXh0cmFzL3tnZXRfZGlzdG8sd2VicF9xdWFsaXR5fQorN2JlNTc0ODkgTWVyZ2UgIlZQOEVzdGltYXRlUXVhbGl0eSgpOiByb3VnaHR5IGVzdGltYXRlIHdlYnAgYml0c3RyZWFtIHF1YWxpdHkgZmFjdG9yIgorNTcwMjA1MjUgTWFrZWZpbGUudmM6IGFkZCBtaXNzaW5nIGltYWdlaW8gdGFyZ2V0CitlOGFiNmE4MiBWUDhFc3RpbWF0ZVF1YWxpdHkoKTogcm91Z2h0eSBlc3RpbWF0ZSB3ZWJwIGJpdHN0cmVhbSBxdWFsaXR5IGZhY3RvcgorZmVlN2IzZDYgTWVyZ2UgIidleHRyYXMvZ2V0X2Rpc3RvJyBleGFtcGxlOiBjb21wdXRlIFBTTlIgYmV0d2VlbiB0d28gZmlsZXMiCisxZTdkNDQwMSAnZXh0cmFzL2dldF9kaXN0bycgZXhhbXBsZTogY29tcHV0ZSBQU05SIGJldHdlZW4gdHdvIGZpbGVzCis0Y2VjYWI2MyBwbmdkZWMuYyxqcGVnZGVjLltoY106IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbmNsdWRlcworMjU5ZjA0MzQgbWFrZWZpbGUudW5peDogbm9ybWFsaXplIGltYWdlIGRlY29kZSBsaWIgbmFtZQorZWQzNGMzOWIgZml4OiBleGFtcGxlcy9saWJleGFtcGxlX2RlYy5hID0+IGltYWdlaW8vbGliZXhhbXBsZV9kZWMuYQorMzNkOGQwZDQgTWVyZ2UgIm1vdmUgZXhhbXBsZXMve2V4YW1wbGVfdXRpbCxpbWFnZV9kZWN9IHRvIGltYWdlaW8vIgorYzk2MGI4MmUgTWVyZ2UgImV4dHJhcy5oOiBjb3JyZWN0IGluY2x1ZGUgZ3VhcmQiCitmZTNjZDI4YSBNZXJnZSAiLmdpdGlnbm9yZTogYWRkIC5ncmFkbGUsIC9idWlsZCIKKzQ1ZmJlYmE1IE1lcmdlICJEbyB0b2tlbiByZWNvcmRpbmcgYW5kIGNvdW50aW5nIGluIGEgc2luZ2xlIGxvb3AiCis0ZjMzYzgyMCAuZ2l0aWdub3JlOiBhZGQgLmdyYWRsZSwgL2J1aWxkCitjMzc5YjU1YSBtb3ZlIGV4YW1wbGVzL3tleGFtcGxlX3V0aWwsaW1hZ2VfZGVjfSB0byBpbWFnZWlvLworNTEwOGQ5YWEgZXh0cmFzLmg6IGNvcnJlY3QgaW5jbHVkZSBndWFyZAorYWQ0OTdmYmMgbW92ZSBzcmMvZXh0cmFzIHRvIHRoZSB0b3AtbGV2ZWwKKzBjMGZiODMyIERvIHRva2VuIHJlY29yZGluZyBhbmQgY291bnRpbmcgaW4gYSBzaW5nbGUgbG9vcAorOWFjNzRmOTIgQWRkIE1TQSBvcHRpbWl6ZWQgcmVzY2FsaW5nIGZ1bmN0aW9ucworY2IxOWRiYzEgQWRkIE1TQSBvcHRpbWl6ZWQgY29sb3IgdHJhbnNmb3JtIGZ1bmN0aW9ucworM2Y0MDQyYjUgV2ViUEFuaW1FbmNvZGVyOiBJZiAnbWluaW1pemVfc2l6ZScgYW5kICdhbGxvd19taXhlZCcgb24sIHRyeSBsb3NzeSArIGxvc3NsZXNzLgorNWUyZWI4OWUgY29zbWV0aWNzLGRzcC8qbXNhLmM6IGFzc29jaWF0ZSAnKicgd2l0aCB0aGUgdHlwZQorNWI2MGRiNWMgRmFzdE1CQW5hbHl6ZSgpIGZvciBxdWljayBpMTYvaTQgZGVjaXNpb24KKzU2N2U2OTc3IEFkZCBNU0Egb3B0aW1pemVkIENvbGxlY3RIaXN0b2dyYW0gZnVuY3Rpb24KK2M1NGFiOGRkIEFkZCBNU0Egb3B0aW1pemVkIHF1YW50aXphdGlvbiBmdW5jdGlvbnMKK2VjNmY2OGM1IE1lcmdlICJSZW1vdmUgUXVhbnRpemVCbG9ja1dIVCgpIGluIGVuYy5jIgorMmE1YzQxN2MgQXBwbHkgdGhlIFJMRSBoZXVyaXN0aWMgdG8gTFo3Ny4KKzkxYjU5ZTg4IFJlbW92ZSBRdWFudGl6ZUJsb2NrV0hUKCkgaW4gZW5jLmMKK2ZlNTcyNzM3IEFkZCBNU0Egb3B0aW1pemVkIFNTRSBmdW5jdGlvbnMKKzZiNTNjYTg3IGNvc21ldGljcywoZGVjfGVuYylfc3NlMi5jOiBmaXggaW5kZW50CitiMTVkMDBkOSBNZXJnZSAiQWRkIE1TQSBvcHRpbWl6ZWQgZW5jb2RlciBJbnRyYUNocm9tYVByZWRzIGZ1bmN0aW9uIgorYWZlM2NlYzggQWRkIE1TQSBvcHRpbWl6ZWQgZW5jb2RlciBJbnRyYUNocm9tYVByZWRzIGZ1bmN0aW9uCitmYzhjYWQ5ZiByZWR1Y2UgdGhlIG51bWJlciBvZiBtYWxsb2MvZnJlZSBjeWNsZXMgaW4gaHVmZm1hbi5jCis3YjRiMDVlMCBBZGQgTVNBIG9wdGltaXplZCBlbmNvZGVyIEludHJhMTZQcmVkcyBmdW5jdGlvbgorYzE4Nzg3YTAgQWRkIE1TQSBvcHRpbWl6ZWQgZW5jb2RlciBJbnRyYTRQcmVkcyBmdW5jdGlvbgorNDc5ZDE5MDggd2VicG11eDogQWxzbyBwcmludCBjb21wcmVzc2lvbiBpbmZvIHBlciBmcmFtZS4KK2E4MGU4Y2ZkIFByb3ZpZGUgc3VwcG9ydCBmb3IgQ01ha2Ugb24gQW5kcm9pZCBzdHVkaW8gMi4yLgorNmM2Mjg0MTAgU3BsaXQgdGhlIG1haW4gQ01ha2UgZmlsZS4KK2JiYjZlY2Q5IE1lcmdlICJBZGQgTVNBIG9wdGltaXplZCBkaXN0b3J0aW9uIGZ1bmN0aW9ucyIKKzc5MTUzOTZmIEFkZCBNU0Egb3B0aW1pemVkIGRpc3RvcnRpb24gZnVuY3Rpb25zCis2NTJlOTQ0ZiBNZXJnZSAiYnVpbGQuZ3JhZGxlOiByZW1vdmUgdGFiIgorYzA5OTFhMTQgaW8sRW1pdFJlc2NhbGVkQWxwaGFZVVY6IGZhY3RvciBvdXQgYSBjb21tb24gZXhwcgorNDhiZjVlZDEgYnVpbGQuZ3JhZGxlOiByZW1vdmUgdGFiCitiZmVmNmM5ZiBNZXJnZSB0YWcgJ3YwLjUuMScKKzNkOTdiYjc1IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNS4xLCBvcmlnaW4vMC41LjEsIDAuNS4xKQorZGViNTRkOTEgQ2xhcmlmeSB0aGUgZXhwZWN0ZWQgJ2NvbmZpZycgbGlmZXNwYW4gaW4gV2ViUElEZWNvZGUoKQorNDM1MzA4ZTAgQWRkIE1TQSBvcHRpbWl6ZWQgZW5jb2RlciB0cmFuc2Zvcm0gZnVuY3Rpb25zCitkY2U2NGJmYSBBZGQgTVNBIG9wdGltaXplZCBhbHBoYSBmaWx0ZXIgZnVuY3Rpb25zCis0MjkxMjBkMCBBZGQgTVNBIG9wdGltaXplZCBjb2xvciB0cmFuc2Zvcm0gZnVuY3Rpb25zCitjN2UyZDI0NSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjUuMS1yYzUpCis1NWIyZmVkZSBub3JtYWxpemUgdGhlIG1hY3JvcycgImRvIHsuLi59IHdoaWxlICgwKSIgY29uc3RydWN0cworNzAxYzc3MmUgQWRkIE1TQSBvcHRpbWl6ZWQgY29sb3JzcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworYzdlYjA2ZjcgRml4IGNvcm5lciBjYXNlIGluIENvc3RNYW5hZ2VySW5pdC4KK2Y5MThjYjEwIGZpeCByZXNjYWxpbmcgYnVnOiBhbHBoYSBwbGFuZSB3YXNuJ3QgZmlsbGVkIHdpdGggMHhmZgorYWI3OTM3YTUgZ2lmMndlYnA6IG5vcm1hbGl6ZSB0aGUgbnVtYmVyIG9mIC4ncyBpbiB0aGUgaGVscCBtZXNzYWdlCiszY2RlYzg0NyB2d2VicDogbm9ybWFsaXplIHRoZSBudW1iZXIgb2YgLidzIGluIHRoZSBoZWxwIG1lc3NhZ2UKK2JkZjYyNDFlIGN3ZWJwOiBub3JtYWxpemUgdGhlIG51bWJlciBvZiAuJ3MgaW4gdGhlIGhlbHAgbWVzc2FnZQorMDZhMzhjN2IgZml4IHJlc2NhbGluZyBidWc6IGFscGhhIHBsYW5lIHdhc24ndCBmaWxsZWQgd2l0aCAweGZmCiszMTllMzdiZSBJbXByb3ZlIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorNmExOTc5MzcgQWRkIE1TQSBvcHRpbWl6ZWQgaW50cmEgcHJlZCBjaHJvbWEgZnVuY3Rpb25zCis0NDdhZGJjZSAnb3VyIGJ1ZyB0cmFja2VyJyAtPiAndGhlIGJ1ZyB0cmFja2VyJworOTdiOWU2NDQgbm9ybWFsaXplIHRoZSBudW1iZXIgb2YgLidzIGluIHRoZSBoZWxwIG1lc3NhZ2UKKzI5M2Q3ODZmIEFkZGVkIE1TQSBvcHRpbWl6ZWQgaW50cmEgcHJlZGljdGlvbiAxNngxNiBmdW5jdGlvbnMKKzBhZmEwY2UyIEFkZGVkIE1TQSBvcHRpbWl6ZWQgaW50cmEgcHJlZGljdGlvbiA0eDQgZnVuY3Rpb25zCithNjYyMWJhYyBBZGRlZCBNU0Egb3B0aW1pemVkIHNpbXBsZSBlZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKK2JiNTBiZjQyIHBuZ2RlYyxSZWFkRnVuYzogdGhyb3cgYW4gZXJyb3Igb24gaW52YWxpZCByZWFkCiszODA2M2FmMSBkZWNvZGUuaCxXZWJQR2V0SW5mbzogbm9ybWFsaXplIGZ1bmN0aW9uIGNvbW1lbnQKKzFlYmYxOTNjIEFkZGVkIE1TQSBvcHRpbWl6ZWQgY2hyb21hIGVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworOWFkMjM1MmQgTWVyZ2UgIkFkZGVkIE1TQSBvcHRpbWl6ZWQgZWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zIgorNjA3NTEwOTYgQWRkZWQgTVNBIG9wdGltaXplZCBlZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKzllOGUxYjdiIElubGluZSBHZXRSZXNpZHVhbCBmb3Igc3BlZWQuCis3ZDU4ZDFiNyBTcGVlZC11cCB1bmlmb3JtLXJlZ2lvbiBwcm9jZXNzaW5nLgorOGVjNzAzMmIgc2ltcGxpZnkgSGlzdG9ncmFtQ29tYmluZUVudHJvcHlCaW4oKQorMjNlMjljYjEgTWVyZ2UgIkZpeCBhIGJvdW5kYXJ5IGNhc2UgaW4gQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5LiIgaW50byAwLjUuMQorNDcyYTA0OWIgcmVtb3ZlIGJpbl9tYXBbXSBhbGxvY2F0aW9uIGFsdG9nZXRoZXIKKzBiYjIzYjJjIGZyZWUgLT4gV2ViUFNhZmVGcmVlKCkKK2E5NzdiNGI1IE1lcmdlICJyZXdyaXRlIHRoZSBiaW5fbWFwIGNsdXN0ZXJpbmcgdG8gdXNlIGxlc3MgbWVtb3J5IgorMzU5MWJhNjYgcmV3cml0ZSB0aGUgYmluX21hcCBjbHVzdGVyaW5nIHRvIHVzZSBsZXNzIG1lbW9yeQorZTZhYzQ1MGMgdXRpbHMuW2hjXTogcy9NQVhfQ09MT1JfQ09VTlQvTUFYX1BBTEVUVEVfU0laRS8KK2U3YjkxNzcyIE1lcmdlICJEZWNvZGVJbWFnZURhdGEoKTogY2hhbmdlIHRoZSBpbmNvcnJlY3QgYXNzZXJ0IiBpbnRvIDAuNS4xCisyYWJmYTU0ZiBEZWNvZGVJbWFnZURhdGEoKTogY2hhbmdlIHRoZSBpbmNvcnJlY3QgYXNzZXJ0Cis1YTQ4ZmNkOCBNZXJnZSAiY29uZmlndXJlOiB0ZXN0IGZvciAtV2Zsb2F0LWNvbnZlcnNpb24iCiswMTc0ZDE4ZCBGaXggYSBib3VuZGFyeSBjYXNlIGluIEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seS4KKzZhOWMyNjJhIE1lcmdlICJBZGRlZCBNU0Egb3B0aW1pemVkIHRyYW5zZm9ybSBmdW5jdGlvbnMiCitjZmJjYzVlYyBNYWtlIHN1cmUgdG8gY29uc2lkZXIgc21hbGwgZGlzdGFuY2VzIGluIExaNzcuCis1ZTYwYzQyYSBBZGRlZCBNU0Egb3B0aW1pemVkIHRyYW5zZm9ybSBmdW5jdGlvbnMKKzNkYzI4ZDc2IGNvbmZpZ3VyZTogdGVzdCBmb3IgLVdmbG9hdC1jb252ZXJzaW9uCitmMmEwOTQ2YSBhZGQgc29tZSBhc3NlcnRzIHRvIGRlbGltaXQgdGhlIHBlcmltZXRlciBvZiBDb3N0TWFuYWdlcidzIG9wZXJhdGlvbgorOWE1ODNjNjYgZml4IGludmFsaWQtd3JpdGUgYnVnIGZvciBhbHBoYS1kZWNvZGluZworZjY2NTEyZGIgbWFrZSBncmFkbGV3IGV4ZWN1dGFibGUKKzZmZGE1OGYxIGJhY2t3YXJkX3JlZmVyZW5jZXM6IHF1aWV0IGRvdWJsZS0+aW50IHdhcm5pbmcKK2E0OGNjOWQyIE1lcmdlICJGaXggYSBjb21wcmVzc2lvbiByZWdyZXNzaW9uIGZvciBpbWFnZXMgd2l0aCBsb25nIHVuaWZvcm0gcmVnaW9ucy4iIGludG8gMC41LjEKK2NjMjcyMGMxIE1lcmdlICJSZXZlcnQgYW4gTFo3NyBib3VuZGFyeSBjb25zdGFudC4iIGludG8gMC41LjEKKzA1OWFhYjRmIEZpeCBhIGNvbXByZXNzaW9uIHJlZ3Jlc3Npb24gZm9yIGltYWdlcyB3aXRoIGxvbmcgdW5pZm9ybSByZWdpb25zLgorYjBjN2U0OWUgQ2hlY2sgbW9yZSBiYWNrd2FyZCBtYXRjaGVzIHdpdGggaGlnaGVyIHF1YWxpdHkuCithMzYxMTUxMyBSZXZlcnQgYW4gTFo3NyBib3VuZGFyeSBjb25zdGFudC4KKzgxOTAzNzRjIFJFQURNRTogZml4IHR5cG8KKzc1NTFkYjQ0IHVwZGF0ZSBORVdTCiswZmIyMjY5YyBidW1wIHZlcnNpb24gdG8gMC41LjEKK2Y0NTM3NjEwIHVwZGF0ZSBBVVRIT1JTICYgLm1haWxtYXAKKzMyNTk1NzFlIFJlZmFjdG9yIEdldENvbG9yUGFsZXR0ZSBtZXRob2QuCisxZGY1ZTI2MCBhdm9pZCB1c2luZyB0bXAgaGlzdG9ncmFtIGluIFByZXBhcmVQYWlyKCkKKzc2ODUxMjNhIGZpeCBjb21tZW50IHR5cG9zCithMjQ2YjkyMSBTcGVlZHVwIGJhY2t3YXJkIHJlZmVyZW5jZXMuCis3NmQ3M2YxOCBNZXJnZSAiQ29zdE1hbmFnZXI6IGludHJvZHVjZSBhIGZyZWUtbGlzdCBvZiB+MTAgaW50ZXJ2YWxzIgorZWFiMzlkODEgQ29zdE1hbmFnZXI6IGludHJvZHVjZSBhIGZyZWUtbGlzdCBvZiB+MTAgaW50ZXJ2YWxzCis0YzU5YWFjMCBNZXJnZSAibWlwcyBtc2Egd2VicCBjb25maWd1cmF0aW9uIgorMDQzYzMzZjEgTWVyZ2UgIkltcHJvdmUgc3BlZWQgYW5kIGNvbXByZXNzaW9uIGluIGJhY2t3YXJkIHJlZmVyZW5jZSBmb3IgbG9zc2xlc3MuIgorNzFiZTliOGMgTWVyZ2UgImNsYXJpZnkgdmFyaWFibGUgbmFtZXMgaW4gSGlzdG9ncmFtUmVtYXAoKSIKKzBiYTdmZDcwIEltcHJvdmUgc3BlZWQgYW5kIGNvbXByZXNzaW9uIGluIGJhY2t3YXJkIHJlZmVyZW5jZSBmb3IgbG9zc2xlc3MuCiswNDgxZDQyYSBDb3N0TWFuYWdlcjogY2FjaGUgb25lIGludGVydmFsIGFuZCByZS11c2UgaXQgd2hlbiBwb3NzaWJsZQorNDFiN2U2YjUgTWVyZ2UgImhpc3RvZ3JhbTogZml4IGJpbiBjYWxjdWxhdGlvbiIKKzk2YzNkNjI0IGhpc3RvZ3JhbTogZml4IGJpbiBjYWxjdWxhdGlvbgorZmU5ZTMxZWYgY2xhcmlmeSB2YXJpYWJsZSBuYW1lcyBpbiBIaXN0b2dyYW1SZW1hcCgpCitjZTNjODI0NyBkaXNhYmxlIG5lYXItbG9zc2xlc3MgcXVhbnRpemF0aW9uIGlmIHBhbGV0dGUgaXMgdXNlZAorZTExZGEwODEgbWlwcyBtc2Egd2VicCBjb25maWd1cmF0aW9uCis1ZjhmOTk4ZCBtdXg6IFByZXNlbmNlIG9mIHVua25vd24gY2h1bmtzIHNob3VsZCB0cmlnZ2VyIFZQOFggY2h1bmsgb3V0cHV0LgorY2FkZWMwYjEgTWVyZ2UgIlN5bmMgbWlwczMyIGFuZCBkc3BfcjIgWVVWLT5SR0IgY29kZSB3aXRoIEMgdmVyaXNvbiIKK2Q5NjM3NzU4IENvbXB1dGUgdGhlIGhhc2ggY2hhaW4gb25jZSBhbmQgZm9yIGFsbCBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24uCis1MGE0ODY2NSBTeW5jIG1pcHMzMiBhbmQgZHNwX3IyIFlVVi0+UkdCIGNvZGUgd2l0aCBDIHZlcmlzb24KK2VlZTc4OGUyIE1lcmdlICJpbnRyb2R1Y2UgYSBjb21tb24gc2lnbmF0dXJlIGZvciBhbGwgaW1hZ2UgcmVhZGVyIGZ1bmN0aW9uIgorZDc3Yjg3N2MgaW50cm9kdWNlIGEgY29tbW9uIHNpZ25hdHVyZSBmb3IgYWxsIGltYWdlIHJlYWRlciBmdW5jdGlvbgorY2E4ZDk1MTkgcmVtb3ZlIHNvbWUgb2Jzb2xldGUgVE9ET3MKK2FlMmE3MjIyIGNvbGxlY3QgYWxsIGRlY29kaW5nIHV0aWxpdGllcyBmcm9tIGV4YW1wbGVzLyBpbiBsaWJleGFtcGxlZGVjLmEKKzBiOGFlODUyIE1lcmdlICJNb3ZlIERpdGhlckNvbWJpbmU4eDggdG8gZHNwL2RlYy5jIgorNzdjYWQ4ODUgTWVyZ2UgIlJlYWRXZWJQOiBhdm9pZCBjb252ZXJzaW9uIHRvIEFSR0IgaWYgZmluYWwgZm9ybWF0IGlzIFlVVkEiCithYjhkNjY5OCBSZWFkV2ViUDogYXZvaWQgY29udmVyc2lvbiB0byBBUkdCIGlmIGZpbmFsIGZvcm1hdCBpcyBZVVZBCitmOGI3Y2U5ZSBNZXJnZSAidGVzdCBwb2ludGVyIHRvIE5VTEwgZXhwbGljaXRseSIKKzVkZjZmMjE0IHRlc3QgcG9pbnRlciB0byBOVUxMIGV4cGxpY2l0bHkKKzc3ZjIxYzljIE1vdmUgRGl0aGVyQ29tYmluZTh4OCB0byBkc3AvZGVjLmMKK2M5ZTZkODY1IEFkZCBncmFkbGUgc3VwcG9ydAorYzY1ZjQxZTggUmV2ZXJ0ICJBZGQgZ3JhZGxlIHN1cHBvcnQiCitiZjczMWVkZSBBZGQgZ3JhZGxlIHN1cHBvcnQKKzA4MzMzYjg1IFdlYlBBbmltRW5jb2RlcjogRGV0ZWN0IHdoZW4gY2FudmFzIGlzIG1vZGlmaWVkLCByZXN0b3JlIG9ubHkgd2hlbiBuZWVkZWQuCiswMjA5ZDdlNiBNZXJnZSAic3BlZWQtdXAgTWFwVG9QYWxldHRlKCkgd2l0aCBiaW5hcnkgc2VhcmNoIgorZmRkMjlhM2Qgc3BlZWQtdXAgTWFwVG9QYWxldHRlKCkgd2l0aCBiaW5hcnkgc2VhcmNoCitjZjRhNjUxYiBSZXZlcnQgIlJlZmFjdG9yIEdldENvbG9yUGFsZXR0ZSBtZXRob2QuIgorMGEyN2FjYTMgTWVyZ2UgY2hhbmdlcyBJZGZhOGNlODMsSTE5YWRjOWM0CitmMjVjNDQwNiBXZWJQQW5pbUVuY29kZXI6IFJlc3RvcmUgb3JpZ2luYWwgY2FudmFzIGJldHdlZW4gbXVsdGlwbGUgZW5jb2Rlcy4KKzE2OTAwNGIxIFJlZmFjdG9yIEdldENvbG9yUGFsZXR0ZSBtZXRob2QuCis1NzYzNjJhYiBWUDhMRG9GaWxsQml0V2luZG93OiBzdXBwb3J0IGJpZy1lbmRpYW4gaW4gZmFzdCBwYXRoCithYzQ5ZTRlNCBiaXRfcmVhZGVyLmM6IHMvVlA4TF9VU0VfVU5BTElHTkVEX0xPQUQvVlA4TF9VU0VfRkFTVF9MT0FELworZDM5Y2ViNTggVlA4TERvRmlsbEJpdFdpbmRvdzogcmVtb3ZlIHN0YWxlIFRPRE8KKzJlYzJkZTE0IE1lcmdlICJTcGVlZC11cCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkuIgorM2UwMjNjMTcgU3BlZWQtdXAgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5LgorZjJlMWVmYmUgSW1wcm92ZSBuZWFyIGxvc3NsZXNzIGNvbXByZXNzaW9uIHdoZW4gYSBwcmVkaWN0aW9uIGZpbHRlciBpcyB1c2VkLgorZTE1YWZiY2UgZHNwLmg6IGZpeCB1YnNhbiBtYWNybyBuYW1lCitlNTNjOWNjYiBkc3AuaDogYWRkIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XCithZjgxZmRiNyB1dGlscy5oOiBxdWlldCAtZnNhbml0aXplPXVuZGVmaW5lZCB3YXJuaW5ncworZWEwYmUzNTQgZHNwLmg6IHJlbW92ZSB1dGlscy5oIGluY2x1ZGUKK2NkMjc2YWVjIHV0aWxzLyouYzogLi4vdXRpbHMvdXRpbHMuaCAtPiAuL3V0aWxzLmgKK2M4OTI3MTMxIHV0aWxzL01ha2VmaWxlLmFtOiBhZGQgc29tZSBtaXNzaW5nIGhlYWRlcnMKK2VhMjRlMDI2IE1lcmdlICJkc3AuaDogYWRkIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGIgorMzY5ZTI2NGUgZHNwLmg6IGFkZCBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRgorMGQwMjBhNzggTWVyZ2UgImFkZCBydW50aW1lIE5FT04gZGV0ZWN0aW9uIgorNWVlMjEzNmEgTWVyZ2UgImFkZCBWUDhMQWRkUGl4ZWxzKCkgdG8gbG9zc2xlc3MuaCIKKzQ3NDM1YTYxIGFkZCBWUDhMQWRkUGl4ZWxzKCkgdG8gbG9zc2xlc3MuaAorOGZhNmFjNjggcmVtb3ZlIHR3byB1YnNhbiB3YXJuaW5ncworNzRmYjU2ZmIgYWRkIHJ1bnRpbWUgTkVPTiBkZXRlY3Rpb24KKzQxNTRhODM5IE1JUFMgdXBkYXRlIHRvIG5ldyBVbmZpbHRlciBBUEkKK2M4MGI5ZmM4IE1lcmdlICJjaGVycnktcGljayBkZWNvZGVyIGZpeCBmb3IgNjQtYml0IGFuZHJvaWQgZGV2aWNlcyIKKzYyMzUxNDdlIGNoZXJyeS1waWNrIGRlY29kZXIgZml4IGZvciA2NC1iaXQgYW5kcm9pZCBkZXZpY2VzCitkNDFiOGM0MyBjb25maWd1cmU6IHRlc3QgZm9yIC1XZm9ybWF0LSogdy8tV2Zvcm1hdCBwcmVzZW50Cis1Zjk1NTg5ZiBGaXggV0VCUF9BTElHTiBpbiBjYXNlIHRoZSBhcmd1bWVudCBpcyBhIHBvaW50ZXIgdG8gYSB0eXBlIGxhcmdlciB0aGFuIGEgYnl0ZS4KKzIzMDlmZDVjIHJlcGxhY2UgbnVtX3BhcnRzXyBieSBudW1fcGFydHNfbWludXNfb25lXyAodW5zaWduZWQpCis5NjI5ZjRiYyBTaW1wbGlmeVNlZ21lbnRzOiBxdWlldCAtV2FycmF5LWJvdW5kcyB3YXJuaW5nCitkZTQ3NDkyZSBNZXJnZSAidXBkYXRlIHRoZSBVbmZpbHRlciBBUEkgaW4gZHNwIHRvIHByb2Nlc3Mgb25lIHJvdyBpbmRlcGVuZGVudGx5IgorMjEwMmNjZDAgdXBkYXRlIHRoZSBVbmZpbHRlciBBUEkgaW4gZHNwIHRvIHByb2Nlc3Mgb25lIHJvdyBpbmRlcGVuZGVudGx5CitlMzkxMmQ1NiBXZWJQQW5pbUVuY29kZXI6IFJlc3RvcmUgY2FudmFzIGJlZm9yZSBldmFsdWF0aW5nIGJsZW5kaW5nIHBvc3NpYmlsaXR5LgorNmUxMmUxZTMgV2ViUEFuaW1FbmNvZGVyOiBGaXggZm9yIHNpbmdsZS1mcmFtZSBvcHRpbWl6YXRpb24uCis2MDJmMzQ0YSBNZXJnZSBjaGFuZ2VzIEkxZDAzYWNhYyxJZmNiNjQyMTkKKzk1ZWNjY2Y2IG9ubHkgYXBwbHkgY29sb3ItbWFwcGluZyBmb3IgYWxwaGEgb24gdGhlIGNyb3BwZWQgYXJlYQorNDdkZDA3MDggYW5pbV9kaWZmOiBBZGQgYW4gZXhwZXJpbWVudGFsIG9wdGlvbiBmb3IgbWF4IGludGVyLWZyYW1lIGRpZmYuCithYTgwOWNmZSBvbmx5IGFsbG9jYXRlIGFscGhhX3BsYW5lXyB1cCB0byBjcm9wX2JvdHRvbSByb3cKKzMxZjJiOGQ4IFdlYlBBbmltRW5jb2RlcjogRmxhdHRlblNpbWlsYXJQaXhlbHMoKTogbG9vayBmb3Igc2ltaWxhcgorNzc0ZGZiZGMgcGVyZm9ybSBhbHBoYSBmaWx0ZXJpbmcgd2l0aGluIHRoZSBkZWNvZGluZyBsb29wCithNGNhZTY4ZCBsb3NzbGVzcyBkZWNvZGluZzogb25seSBwcm9jZXNzIGRlY29kZWQgcm93IHVwIHRvIGxhc3Rfcm93CisyMzhjZGNkYiBPbmx5IGNhbGwgV2ViUERlcXVhbnRpemVMZXZlbHMoKSBvbiBjcm9wcGVkIGFyZWEKK2NmNmM3MTNhIGFscGhhOiBwcmVwYXJhdG9yeSBjbGVhbnVwCitiOTVhYzBhMiBNZXJnZSAiVlA4R2V0SGVhZGVycygpOiBpbml0aWFsaXplIFZQOElvIHdpdGggc2FuZSB2YWx1ZSBmb3IgY3JvcC9zY2FsZSBkaW1lbnNpb25zIgorODkyMzEzOTQgVlA4R2V0SGVhZGVycygpOiBpbml0aWFsaXplIFZQOElvIHdpdGggc2FuZSB2YWx1ZSBmb3IgY3JvcC9zY2FsZSBkaW1lbnNpb25zCis1ODI4ZTE5OSB1c2VfOGJfZGVjb2RlIC0+IHVzZV84Yl9kZWNvZGVfCis4ZGNhMDI0NyBmaXggYnVnIGluIGFscGhhLmMgdGhhdCB3YXMgdHJpZ2dlcmluZyBhIG1lbW9yeSBlcnJvciBpbiBpbmNyZW1lbnRhbCBtb2RlCis5YTk1MGM1MyBXZWJQQW5pbUVuY29kZXI6IERpc2FibGUgZmlsdGVyaW5nIHdoZW4gYmxlbmRpbmcgaXMgdXNlZCB3aXRoIGxvc3N5IGVuY29kaW5nLgorZWI0MjM5MDMgV2ViUEFuaW1FbmNvZGVyOiBjaG9vc2UgbWF4IGRpZmYgZm9yIGZyYW1lcmVjdCBiYXNlZCBvbiBxdWFsaXR5LgorZmYwYTk0YmUgV2ViUEFuaW1FbmNvZGVyIGxvc3N5OiBpZ25vcmUgc21hbGwgcGl4ZWwgZGlmZmVyZW5jZXMgZm9yIGZyYW1lIHJlY3RhbmdsZXMuCitmODA0MDA4NCBnaWYyd2VicDogUmVtb3ZlIHRoZSAncHJldl90b19wcmV2X2NhbnZhcycgYnVmZmVyLgorNmQ4YzA3ZDMgTWVyZ2UgIldlYlBEZXF1YW50aXplTGV2ZWxzKCk6IHVzZSBzdHJpZGUgaW4gQ291bnRMZXZlbHMoKSIKK2Q5NmZlNWUwIFdlYlBEZXF1YW50aXplTGV2ZWxzKCk6IHVzZSBzdHJpZGUgaW4gQ291bnRMZXZlbHMoKQorZWMxYjI0MDcgV2ViUFBpY3R1cmVJbXBvcnQqOiBjaGVjayBvdXRwdXQgcG9pbnRlcgorYzA3Njg3NjkgTWVyZ2UgIlJldmVydCAiUmUtZW5hYmxlIGVuY29kaW5nIG9mIGFscGhhIHBsYW5lIHdpdGggY29sb3IgY2FjaGUgZm9yIG5leHQgcmVsZWFzZS4iIgorNDFmMTRiY2IgV2ViUFBpY3R1cmVJbXBvcnQqOiBjaGVjayBzcmMgcG9pbnRlcgorNjRlZWQzODcgUGFzcyBzdHJpZGUgcGFyYW1ldGVyIHRvIFdlYlBEZXF1YW50aXplTGV2ZWxzKCkKKzk3OTM0ZTI0IFJldmVydCAiUmUtZW5hYmxlIGVuY29kaW5nIG9mIGFscGhhIHBsYW5lIHdpdGggY29sb3IgY2FjaGUgZm9yIG5leHQgcmVsZWFzZS4iCitlODhjNGNhMCBmaXggLW0gMiBtb2RlLWNvc3QgZXZhbHVhdGlvbiAoY2F1c2luZyBwYXJ0aXRpb24wIG92ZXJmbG93KQorNDU2MmU4M2QgTWVyZ2UgImFkZCBleHRyYSBtZWFuaW5nIHRvIFdlYlBEZWNCdWZmZXI6OmlzX2V4dGVybmFsX21lbW9yeSIKK2FiZGIxMDlmIGFkZCBleHRyYSBtZWFuaW5nIHRvIFdlYlBEZWNCdWZmZXI6OmlzX2V4dGVybmFsX21lbW9yeQorODc1YWVjNzAgZW5jX25lb24sY29zbWV0aWNzOiBicmVhayBsb25nIGNvbW1lbnQKKzcxZTg1NmNmIEdldE1CU1NJTSxjb3NtZXRpY3M6IGZpeCBhbGlnbm1lbnQKK2E5MGVkZmZiIGZpeCBtaXNzaW5nICdleHRlcm4nIGZvciBTU0lNIGZ1bmN0aW9uIGluIGRzcC8KKzQyM2VjYWY0IG1vdmUgc29tZSBTU0lNLWFjY3VtdWxhdGlvbiBmdW5jdGlvbiBmb3IgZHNwLworZjA4ZTY2MjQgTWVyZ2UgIkZpeCBGaW5kQ2xvc2VzdERpc2NyZXRpemVkIGluIG5lYXIgbG9zc2xlc3M6IgorMGQ0MGNjNWUgZW5jX25lb24sRGlzdG80eDQ6IHJlbW92ZSBhbiB1bm5lY2Vzc2FyeSB0cmFuc3Bvc2UKK2U4ZmViMjBlIEZpeCBGaW5kQ2xvc2VzdERpc2NyZXRpemVkIGluIG5lYXIgbG9zc2xlc3M6Cis4MjAwNjQzMCBhbmltX3V0aWw6IHF1aWV0IHN0YXRpYyBhbmFseXNpcyB3YXJuaW5nCithNmYyM2M0OSBNZXJnZSAiQW5pbUVuY29kZXI6IFN1cHBvcnQgcHJvZ3Jlc3MgaG9vayBhbmQgdXNlciBkYXRhLiIKK2E1MTkzNzc0IE1lcmdlICJOZWFyIGxvc3NsZXNzIGZlYXR1cmU6IGZpeCBzb21lIGNvbW1lbnRzLiIKK2RhOThkMzFjIEFuaW1FbmNvZGVyOiBTdXBwb3J0IHByb2dyZXNzIGhvb2sgYW5kIHVzZXIgZGF0YS4KKzMzMzU3MTMxIE5lYXIgbG9zc2xlc3MgZmVhdHVyZTogZml4IHNvbWUgY29tbWVudHMuCiswYmVlZDAxYSBjb3NtZXRpY3M6IGZpeCBpbmRlbnQgYWZ0ZXIgMmY1ZTg5OAorNjc1M2YzNWMgTWVyZ2UgIkZUcmFuc2Zvcm1XSFQgb3B0aW1pemF0aW9uLiIKKzY1ODNiYjFhIEltcHJvdmUgU1NFNC4xIGltcGxlbWVudGF0aW9uIG9mIFRUcmFuc2Zvcm0uCis3NTYxZDBjMyBGVHJhbnNmb3JtV0hUIG9wdGltaXphdGlvbi4KKzdjY2RiNzM0IGZpeCBpbmRlbnRhdGlvbiBhZnRlciBwYXRjaCAjMzI4MjIwCis2ZWMwZDJhOSBjbGFyaWZ5IHRoZSBsb2dpYyBvZiB0aGUgZXJyb3IgcGF0aCB3aGVuIGRlY29kaW5nIGZhaWxzLgorOGFhMzUyYjIgTWVyZ2UgIlJlbW92ZSBhbiB1bm5lY2Vzc2FyeSB0cmFuc3Bvc2l0aW9uIGluIFRUcmFuc2Zvcm0uIgorZGI4NjA4ODQgTWVyZ2UgInJlbW92ZSB1c2VsZXNzICNpbmNsdWRlIgorOTk2MGMzMTYgUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IHRyYW5zcG9zaXRpb24gaW4gVFRyYW5zZm9ybS4KKzZlMzZiNTExIFNtYWxsIHNwZWVkdXAgaW4gRlRyYW5zZm9ybS4KKzlkYmQ0YWFkIE1lcmdlICJmaXggQyBhbmQgU0lNRCBmbGFncyBjb21wbGV0aW9uLiIKK2U2MDg1M2VhIEFkZCBtaXNzaW5nIGNvbW1vbl9zc2UyLmggZmlsZSB0byBtYWtlZmlsZS51bml4Cis2OTZlYjJiMCBmaXggQyBhbmQgU0lNRCBmbGFncyBjb21wbGV0aW9uLgorMmI0ZmUzM2UgTWVyZ2UgImZpeCBtdWx0aXBsZSBhbGxvY2F0aW9uIGZvciB0cmFuc2Zvcm0gYnVmZmVyIgorMmY1ZTg5ODYgZml4IG11bHRpcGxlIGFsbG9jYXRpb24gZm9yIHRyYW5zZm9ybSBidWZmZXIKK2JmMmI0ZjExIFJlZ3JvdXAgY29tbW9uIFNTRSBjb2RlICsgb3B0aW1pemF0aW9uLgorNGVkNjUwYTEgZm9yY2UgIi1wYXNzIDYiIGlmIC1wc25yIG9yIC1zaXplIGlzIHVzZWQgYnV0IC1wYXNzIGlzbid0LgorM2VmMWNlOTggeXV2X3NzZTI6IGZpeCAtV2NvbnN0YW50LWNvbnZlcnNpb24gd2FybmluZworYTdhMDNlOWYgTWVyZ2UgY2hhbmdlcyBJNDg1MmQxOGYsSTUxY2NiODVkCis1ZTEyMmJkNiBnaWYyd2VicDogc2V0IGVuY19vcHRpb25zLnZlcmJvc2UgPSAwIHcvLXF1aWV0CithYjNjMjU4MyBhbmltX2VuY29kZSxEZWZhdWx0RW5jb2Rlck9wdGlvbnM6IGluaXQgdmVyYm9zZQorOGYwZGVlNzcgTWVyZ2UgImNvbmZpZ3VyZTogZml4IGJ1aWx0aW4gZGV0ZWN0aW9uIHcvLVdlcnJvciIKKzRhN2I4NWE5IGNtYWtlOiBmaXggYnVpbHRpbiBkZXRlY3Rpb24gdy8tV2Vycm9yCitiNzQ2NTdmYiBjb25maWd1cmU6IGZpeCBidWlsdGluIGRldGVjdGlvbiB3Ly1XZXJyb3IKKzM2NjFiOTgwIEFkZCBhIENNYWtlTGlzdHMudHh0Cis3NWY0YWY0ZCByZW1vdmUgdXNlbGVzcyAjaW5jbHVkZQorNmMxZDc2MzEgYXZvaWQgWW9kYSBzdHlsZSBmb3IgY29tcGFyaXNvbgorOGNlOTc1YWMgU1NFIG9wdGltaXphdGlvbiBmb3IgdmVjdG9yIG1pc21hdGNoLgorN2RiNTM4MzEgTWVyZ2UgdGFnICd2MC41LjAnCiszN2YwNDk0OSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjUuMC1yYzEsIHRhZzogdjAuNS4wLCBvcmlnaW4vMC41LjAsIDAuNS4wKQorN2U3YjZjY2MgZmFzdGVyIHJnYjU2NS9yZ2I0NDQ0L2FyZ2Igb3V0cHV0Cis0YzdmNTY1ZiB1cGRhdGUgTkVXUworMWY2MmI2YjIgdXBkYXRlIEFVVEhPUlMKK2UyMjRmZGM4IHVwZGF0ZSBtYWlsbWFwCis3MTEwMDUwMCBidW1wIHZlcnNpb24gdG8gMC41LjAKKzIzMGE2ODVlIFJFQURNRTogdXBkYXRlIGhlbHAgdGV4dCwgcmVwbyBsaW5rCitkNDhlNDI3YiBNZXJnZSAiZGVtdXg6IGFjY2VwdCByYXcgYml0c3RyZWFtcyIKKzk5YTAxZjRmIE1lcmdlICJVbmlmeSBzb21lIGVudHJvcHkgZnVuY3Rpb25zLiIKKzRiMDI1ZjEwIE1lcmdlICJjb25maWd1cmU6IGRpc2FibGUgYXNzZXJ0cyBieSBkZWZhdWx0IgorOTJjYmRkZjggTWVyZ2UgImZpeCBQcmludEJsb2NrSW5mbygpIgorY2E1MDlhMzMgVW5pZnkgc29tZSBlbnRyb3B5IGZ1bmN0aW9ucy4KKzM2N2JmOTAzIGZpeCBQcmludEJsb2NrSW5mbygpCitiMDU0N2ZmMCBtb3ZlIGJhY2sgY29tbW9uIGNvbnN0YW50cyBmb3IgbG9zc2xlc3NfZW5jKi5jIGludG8gdGhlIC5oCitmYjRjNzgzMiBsb3NzbGVzczogc2ltcGxlciBhbHBoYSBjbGVhbnVwIHByZXByb2Nlc3NpbmcKK2JhN2Y0YjY4IE1lcmdlICJhbmltX2RpZmY6IGFkZCBicmllZiBkZXNjcmlwdGlvbiBvZiBvcHRpb25zIgorNDdkZGQ1YTQgTW92ZSBzb21lIGNvZGVjIGxvZ2ljIG91dCBvZiAuL2RzcCAuCitiNDEwNmM0NCBhbmltX2RpZmY6IGFkZCBicmllZiBkZXNjcmlwdGlvbiBvZiBvcHRpb25zCiszNTdmNDU1ZCB5dXZfc3NlMjogZml4IDMyLWJpdCB2aXN1YWwgc3R1ZGlvIGJ1aWxkCitiOWQ4MGZhNCBjb25maWd1cmU6IGRpc2FibGUgYXNzZXJ0cyBieSBkZWZhdWx0Cis3YmFkZDNkYSBjb3NtZXRpYyBmaXg6IHNpemVvZih0eXBlKSAtPiBzaXplb2YoKnZhcikKKzgwY2UyN2QzIFNwZWVkIHVwIDI0LWJpdCBwYWNraW5nIC8gdW5wYWNraW5nIGluIFlVViAvIFJHQiBjb252ZXJzaW9ucy4KKzY4ZWViY2IwIHJlbW92ZSBhIFRPRE8gYWJvdXQgcm90YXRpb24KKzJkZWUyOTY2IHJlbW92ZSBmZXcgb2Jzb2xldGUgVE9ETyBhYm91dCBhbGlnbmVkIGxvYWRzIGluIFNTRTIKK2UwYzBiYjM0IHJlbW92ZSBUT0RPIGFib3V0IHVudXNlZCByZWZfbGZfZGVsdGFbXQorOWNmMWNjMmIgcmVtb3ZlIGZldyBUT0RPOiAgICogMjU2IC0+IFJEX0RJU1RPX01VTFQgICAqIGRvbid0IHVzZSBURGlzdG8gZm9yIFVWIG1vZGUgcGlja2luZworNzkxODk2NDUgTWVyZ2UgY2hhbmdlcyBmcm9tIHRvcGljICdkZW11eC1mcmFnbWVudC1jbGVhbnVwJworNDczOTlmOTIgZGVtdXg6IHJlbW92ZSBHZXRGcmFnbWVudCgpCitkM2NmYjc5YSBkZW11eDogcmVtb3ZlIGRlYWQgZnJhZ21lbnQgcmVsYXRlZCBUT0RPCithYjcxNGI4YSBkZW11eCwgRnJhbWU6IHJlbW92ZSBpc19mcmFnbWVudF8gZmllbGQKK2IxMDU5MjFjIHl1dl9zc2UyLCBjb3NtZXRpY3M6IGZpeCBpbmRlbnQKKzQ2NmM5MmU4IGRlbXV4LFdlYlBJdGVyYXRvcjogcmVtb3ZlIGZyYWdtZW50X251bS9udW1fZnJhZ21lbnRzCisxMTcxNGZmMSBkZW11eDogcmVtb3ZlIFdlYlBEZW11eFNlbGVjdEZyYWdtZW50CitjMGY3Y2M0NyBmaXggZm9yIGJ1ZyAjMjgwOiBVTVIgaW4gbmV4dC0+Yml0cworNTc4YmVlYjggTWVyZ2UgImVuYy9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgaGVhZGVycyIKKzFhODE5ZjAwIG1ha2VmaWxlLnVuaXg6IG1ha2UgdmlzaWJpbGl0eT1oaWRkZW4gdGhlIGRlZmF1bHQKK2Q0ZjljMmVmIGVuYy9NYWtlZmlsZS5hbTogYWRkIG1pc3NpbmcgaGVhZGVycworODQ2Y2FmZjQgY29uZmlndXJlOiBjaGVjayBmb3IgLWZ2aXNpYmlsaXR5PWhpZGRlbgorM2YzZWEyYzUgZGVtdXg6IGFjY2VwdCByYXcgYml0c3RyZWFtcworZDZkYWQ1ZDAgbWFuIGN3ZWJwOiBhZGQgcHJlY2lzaW9uIGFib3V0IGV4YWN0bmVzcyBvZiB0aGUgJ2xvc3NsZXNzJyBtb2RlCis0NmJiMWUzNCBNZXJnZSAiZ2lmZGVjOiByZW1vdmUgdXRpbHMuaCBpbmNsdWRlIgorMmI4ODJlOTQgTWVyZ2UgIk1ha2VmaWxlLnZjOiBkZWZpbmUgV0VCUF9IQVZFX0dJRiBmb3IgZ2lmZGVjLmMiCis4OTJiOTIzOCBNZXJnZSAibWFuLyosIEFVVEhPUlM6IGNsYXJpZnkgb3JpZ2luIG9mIHRoZSB0b29sIgorZTU2ODdhMTggTWVyZ2UgImZpeCBvcHRpbWl6ZWQgYnVpbGQgd2l0aCAtbWNtb2RlbD1tZWRpdW0iCitlNTZlNjg1OSBNYWtlZmlsZS52YzogZGVmaW5lIFdFQlBfSEFWRV9HSUYgZm9yIGdpZmRlYy5jCis0MDc3ZDk0NCBnaWZkZWM6IHJlbW92ZSB1dGlscy5oIGluY2x1ZGUKK2I1ZTMwZGFjIG1hbi8qLCBBVVRIT1JTOiBjbGFyaWZ5IG9yaWdpbiBvZiB0aGUgdG9vbAorYjI3NWU1OTggZml4IG9wdGltaXplZCBidWlsZCB3aXRoIC1tY21vZGVsPW1lZGl1bQorNjRkYTQ1YTkgY29zbWV0aWNzLCBjd2VicDogZml4IGluZGVudAorMDM4YTA2MGQgTWVyZ2UgImFkZCBkaXN0by1iYXNlZCByZWZpbmVtZW50IGZvciBVViBtb2RlIChpZiBtZXRob2QgPSAxIG9yIDIpIgorMjgzNTA4OWQgUHJvdmlkZSBhbiBTU0UyIGltcGxlbWVudGF0aW9uIG9mIENvbWJpbmVkU2hhbm5vbkVudHJvcHkuCitlNmM5MzUxOSBhZGQgZGlzdG8tYmFzZWQgcmVmaW5lbWVudCBmb3IgVVYgbW9kZSAoaWYgbWV0aG9kID0gMSBvciAyKQorMDQ1MDdkYzkgTWVyZ2UgImZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGR1cmluZyBzaGlmdCwgdXNpbmcgYSBjYXN0IgorNzkzYzUyNjEgTWVyZ2UgIndpY2RlYzogYWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgZnJvbSBzdGRpbiIKK2QzZDE2Mzk3IE9wdGltaXplIHRoZSBoZWFwIHVzYWdlIGluIEhpc3RvZ3JhbUNvbWJpbmVHcmVlZHkuCisyMDJhNzEwYiBmaXggdW5kZWZpbmVkIGJlaGF2aW91ciBkdXJpbmcgc2hpZnQsIHVzaW5nIGEgY2FzdAorMTRkMjdhNDYgaW1wcm92ZSBtZXRob2QgIzIgYnkgbWVyZ2luZyBEaXN0b1JlZmluZSgpIGFuZCAgU2ltcGxlUXVhbnRpemUoKQorY2IxY2U5OTYgTWVyZ2UgIjEwJSBmYXN0ZXIgdGFibGUtbGVzcyBTU0UyL05FT04gdmVyc2lvbiBvZiBZVVYtPlJHQiBjb252ZXJzaW9uIgorYWM3NjFhMzcgMTAlIGZhc3RlciB0YWJsZS1sZXNzIFNTRTIvTkVPTiB2ZXJzaW9uIG9mIFlVVi0+UkdCIGNvbnZlcnNpb24KKzc5ZmNmMjlhIHdpY2RlYzogYWRkIHN1cHBvcnQgZm9yIHJlYWRpbmcgZnJvbSBzdGRpbgorMDE1ZjE3M2YgTWVyZ2UgImN3ZWJwOiBhZGQgc3VwcG9ydCBmb3Igc3RkaW4gaW5wdXQiCithOTk0N2MzMiBjd2VicDogYWRkIHN1cHBvcnQgZm9yIHN0ZGluIGlucHV0Cis3ZWIwMWZmMyBNZXJnZSAiSW1wcm92ZWQgYWxwaGEgY2xlYW51cCBmb3IgdGhlIHdlYnAgZW5jb2RlciB3aGVuIHByZWRpY3Rpb24gdHJhbnNmb3JtIGlzIHVzZWQuIgorZmI4YzkxMDYgTWVyZ2UgImludHJvZHVjZSBXZWJQTWVtVG9VaW50MzIgYW5kIFdlYlBVaW50MzJUb01lbSBmb3IgbWVtb3J5IGFjY2VzcyIKK2JkOTFhZjIwIE1lcmdlICJiaXRfcmVhZGVyOiByZW1vdmUgYWFyY2g2NCBCSVRTIFRPRE8iCis2YzcwMmI4MSBTcGVlZCB1cCBoYXNoIGNoYWluIGluaXRpYWxpemF0aW9uIHVzaW5nIG1lbXNldC4KKzRjNjBmNjNjIG1ha2UgUmVhZFBORyBhbmQgUmVhZEpQRUcgdGFrZSBhIGZpbGVuYW1lIGluc3RlYWQgb2YgYSBGSUxFCis0NjRlZDEwZiBiaXRfcmVhZGVyOiByZW1vdmUgYWFyY2g2NCBCSVRTIFRPRE8KK2Q0NzhlNTg5IE1lcmdlICJjb25maWd1cmU6IHVwZGF0ZSBpc3N1ZSB0cmFja2VyIgorNjkzODExMTMgSW1wcm92ZWQgYWxwaGEgY2xlYW51cCBmb3IgdGhlIHdlYnAgZW5jb2RlciB3aGVuIHByZWRpY3Rpb24gdHJhbnNmb3JtIGlzIHVzZWQuCisyYzA4YWFjOCBpbnRyb2R1Y2UgV2ViUE1lbVRvVWludDMyIGFuZCBXZWJQVWludDMyVG9NZW0gZm9yIG1lbW9yeSBhY2Nlc3MKKzAxMGNhM2QxIEZpeCBGaW5kTWF0Y2hMZW5ndGggd2l0aCBub24tYWxpZ25lZCBidWZmZXJzLgorYTkwZTFlM2YgUkVBRE1FOiBhZGQgcHJlcmVxdWlzaXRlcyBmb3IgYW4gYXV0b2NvbmYgYnVpbGQKKzQ1OGYwODY2IGNvbmZpZ3VyZTogdXBkYXRlIGlzc3VlIHRyYWNrZXIKKzMzOTE0NTk1IHZ3ZWJwOiB3b3JrIGFyb3VuZCB0aGUgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCB3aXRoIEdMVVQgYnVnCitlNGE3ZWVkNCBjb3NtZXRpY3M6IGZpeCBpbmRlbnQKKzA4Mzc1MTI5IE1lcmdlICJNYWtlIGEgc2VwYXJhdGUgY2FzZSBmb3IgbG93X2VmZm9ydCBpbiBDb3B5SW1hZ2VXaXRoUHJlZGljdGlvbiIKK2FhMmViMmQ0IE1lcmdlICJjb3NtZXRpY3M6IGZpeCBpbmRlbnQiCitiNzU1MWU5MCBjb3NtZXRpY3M6IGZpeCBpbmRlbnQKKzViZGE1MmQ0IE1ha2UgYSBzZXBhcmF0ZSBjYXNlIGZvciBsb3dfZWZmb3J0IGluIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uCis2NmZhNTk4YSBNZXJnZSAiY29uZmlndXJlOiBmaXggaW50cmluc2ljcyBidWlsZCB3L29sZGVyIGdjYyIKKzVhZTIyMGJlIGJhY2t3YXJkX3JlZmVyZW5jZXMuYzogRml4ZWQgY29tcGlsZXIgd2FybmluZworMTU1NmRhMDkgTWVyZ2UgImNvbmZpZ3VyZTogcmVzdG9yZSAyIHdhcm5pbmdzIgorNzFhMTdlNTggY29uZmlndXJlOiByZXN0b3JlIDIgd2FybmluZ3MKKzllZWFiYzA3IGNvbmZpZ3VyZTogZml4IGludHJpbnNpY3MgYnVpbGQgdy9vbGRlciBnY2MKKzM2M2JhYmUyIE1lcmdlICJmaXggc29tZSB3YXJuaW5nIGFib3V0IHVuYWxpZ25lZCAzMmIgcmVhZHMiCithMTQxMTc4MiBPcHRpbWl6YXRpb24gaW4gaGFzaCBjaGFpbiBjb21wYXJpc29uIGZvciA2NCBiaXQgQXJyYXlzIHdlcmUgY29tcGFyZWQgMzIgYml0cyBhdCBhIHRpbWUsIGl0IGlzIG5vdyBkb25lIDY0IGJpdHMgYXQgYSB0aW1lLiBPdmVyYWxsIGVuY29kaW5nIHNwZWVkLXVwIGlzIG9ubHkgb2YgMC4yJSBvbiBAc2thbCdzIHNtYWxsIFBORyBjb3JwdXMuIEl0IGlzIG9mIDMlIG9uIG15IGluaXRpYWwgMS4zIE1wIGRlc2t0b3Agc2NyZWVuc2hvdCBpbWFnZS4KKzgyOWJkMTQxIENvbWJpbmUgSHVmZm1hbiBjb3N0IGFuZCBiaXQgZW50cm9weSBpbnRvIG9uZSBsb29wCithN2E5NTRjOCBNZXJnZSAibG9zc2xlc3M6IG1ha2UgcHJlZGljdGlvbiBpbiBlbmNvZGVyIHdvcmsgcGVyIHNjYW5saW5lIgorNjFiNjA1YjQgTWVyZ2UgImZpeCBvZiB1bmRlZmluZWQgbXVsdGlwbHkgKGludDMyIG92ZXJmbG93KSIKKzIzOTQyMWM1IGxvc3NsZXNzOiBtYWtlIHByZWRpY3Rpb24gaW4gZW5jb2RlciB3b3JrIHBlciBzY2FubGluZQorZjVjYTQwZTAgZml4IG9mIHVuZGVmaW5lZCBtdWx0aXBseSAoaW50MzIgb3ZlcmZsb3cpCis1Y2QyZWY0YyBNZXJnZSBjaGFuZ2VzIGZyb20gdG9waWMgJ3dpbi10aHJlYWRpbmctY29tcGF0JworNzZjZTkxODcgTWFrZWZpbGUudmM6IGVuYWJsZSBXRUJQX1VTRV9USFJFQUQgZm9yIHdpbmRvd3MgcGhvbmUKK2QyYWZlOTc0IHRocmVhZDogdXNlIENyZWF0ZVRocmVhZCBmb3Igd2luZG93cyBwaG9uZQorMGZkMGUxMmIgdGhyZWFkOiB1c2UgV2FpdEZvclNpbmdsZU9iamVjdEV4IGlmIGF2YWlsYWJsZQorNjNmYWRjOWYgdGhyZWFkOiB1c2UgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbkV4IGlmIGF2YWlsYWJsZQorMTEwYWQ1ODMgdGhyZWFkOiB1c2UgbmF0aXZlIHdpbmRvd3MgY29uZCB2YXIgaWYgYXZhaWxhYmxlCis5MTJjOWZkZiBkZWMvd2VicDogdXNlIEdldExFKDI0fDMyKSBmcm9tIHV0aWxzCitmMTY5NDQ4MSB1dGlscy9HZXRMRTMyOiBjb3JyZWN0IHVpbnQzMiBwcm9tb3Rpb24KKzE1ODc2M2RlIE1lcmdlICJhbHdheXMgY2FsbCBXZWJQSW5pdFNhbXBsZXJzKCksIGRvbid0IHRyeSB0byBiZSBzbWFydCIKKzM3NzBmM2JiIE1lcmdlICJjbGVhbnVwIHRoZSBZRklYL1RGSVggZGlmZmVyZW5jZSBieSByZW1vdmluZyBzb21lIGNvZGUgYW5kICNkZWZpbmUiCithNDBmNjBhOSBNZXJnZSAiMyUgc3BlZWQgaW1wcm92ZW1lbnQgZm9yIGxvc3NsZXNzIHdlYnAgZW5jb2RlciBmb3IgbG93IGVmZm9ydCBtb2RlOiIKK2VkMWMyYmM2IGFsd2F5cyBjYWxsIFdlYlBJbml0U2FtcGxlcnMoKSwgZG9uJ3QgdHJ5IHRvIGJlIHNtYXJ0CitiOGM0NGYxYSAzJSBzcGVlZCBpbXByb3ZlbWVudCBmb3IgbG9zc2xlc3Mgd2VicCBlbmNvZGVyIGZvciBsb3cgZWZmb3J0IG1vZGU6Cis5OTdlMTAzOCBjbGVhbnVwIHRoZSBZRklYL1RGSVggZGlmZmVyZW5jZSBieSByZW1vdmluZyBzb21lIGNvZGUgYW5kICNkZWZpbmUKK2Q3M2QxYzhiIE1lcmdlICJNYWtlIGRpc2NhcmRpbmcgaW52aXNpYmxlIFJHQiB2YWx1ZXMgKGNsZWFudXAgYWxwaGEpIHRoZSBkZWZhdWx0LiIKKzFmOWJlOTdjIE1ha2UgZGlzY2FyZGluZyBpbnZpc2libGUgUkdCIHZhbHVlcyAoY2xlYW51cCBhbHBoYSkgdGhlIGRlZmF1bHQuCitmMjQwMTE3YiBNYWtlIGR3ZWJwIGxpc3RlbiBtb3JlIHRvIHRoZSAtcXVpZXQgZmxhZworYjM3YjAxNzkgZml4IGZvciBpc3N1ZSAjMjc1OiBkb24ndCBjb21wYXJlIHRvIG91dC1vZi1ib3VuZCBwb2ludGVycworMjE3MzVlMDYgc3BlZWQtdXAgdHJpdmlhbCBvbmUtc3ltYm9sIGRlY29kaW5nIGNhc2UgZm9yIGxvc3NsZXNzCiszOTc4NjNiZCBSZWZhY3RvciBDb3B5UGxhbmUoKSBhbmQgQ29weVBpeGVscygpIG1ldGhvZHM6IHB1dCB0aGVtIGluIHV0aWxzLgorNmVjZDcyZjggUmUtZW5hYmxlIGVuY29kaW5nIG9mIGFscGhhIHBsYW5lIHdpdGggY29sb3IgY2FjaGUgZm9yIG5leHQgcmVsZWFzZS4KKzFmNzE0OGE0IE1lcmdlICJyZW1vdmUgdW51c2VkIGZpZWxkcyBmcm9tIFdlYlBEZWNvZGVyT3B0aW9ucyBhbmQgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIgorNmFlMzk1ZmEgTWVyZ2UgInVzZSBFeFJlYWRGaWxlKCkgZm9yIFJlYWRZVVYoKSIKKzgwNzZhMDBlIGdpdGlnbm9yZSBsaXN0OiBhZGQgYW5pbV9kaWZmLgorMWMxNzAyZDggdXNlIEV4UmVhZEZpbGUoKSBmb3IgUmVhZFlVVigpCis3NzVkM2EzNyByZW1vdmUgdW51c2VkIGZpZWxkcyBmcm9tIFdlYlBEZWNvZGVyT3B0aW9ucyBhbmQgV2ViUEJpdHN0cmVhbUZlYXR1cmVzCitjMTMyNDVjNyBBbmltRW5jb2RlcjogQWRkIGEgR2V0RXJyb3IoKSBtZXRob2QuCis2ODhiMjY1ZCBBbmltRGVjb2RlciBBUEk6IEFkZCBhIEdldERlbXV4ZXIoKSBtZXRob2QuCisxYWE0ZTNkNiBXZWJQQW5pbURlY29kZXI6IGFkZCBhbiBvcHRpb24gdG8gZW5hYmxlIG11bHRpLXRocmVhZGVkIGRlY29kaW5nLgorMzU4NGFiY2EgQW5pbURlY29kZXI6IG9wdGlvbiB0byBkZWNvZGUgdG8gY29tbW9uIGNvbG9yIG1vZGVzLgorYWZkNWE2MmMgTWVyZ2UgIm11eC5oIGRvZXMgTk9UIG5lZWQgdG8gaW5jbHVkZSBlbmNvZGUuaCIKKzg1NTBkNDQzIE1lcmdlICJtaWdyYXRlIGFuaW1fZGlmZiB0b29sIGZyb20gQysrIHRvIEM4OSIKKzk2MjAxZTUwIG1pZ3JhdGUgYW5pbV9kaWZmIHRvb2wgZnJvbSBDKysgdG8gQzg5Cis5NDVjZmEzYiBtdXguaCBkb2VzIE5PVCBuZWVkIHRvIGluY2x1ZGUgZW5jb2RlLmgKKzhkYTA3ZThkIE1lcmdlICJ+MnggZmFzdGVyIFNTRTIgUkdCMjR0b1ksIEJHUjI0dG9ZLCBBUkdCVG9ZfFVWIgorYmZkM2ZjMDIgfjJ4IGZhc3RlciBTU0UyIFJHQjI0dG9ZLCBCR1IyNHRvWSwgQVJHQlRvWXxVVgorMDI0MzI0MjcgbWFuL2N3ZWJwLjEsIGNvc21ldGljczogZXNjYXBlICctJ3MKKzk2ZjViNDIzIG1hbi9jd2VicDogZ3JvdXAgbG9zc3ktb25seSBvcHRpb25zCis1MmZkYmRmZSBleHRyYWN0IHNvbWUgUkdCMjQgdG8gTHVtYSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gZW5jLyB0byBkc3AvCithYjhjMjMwMCBhZGQgbWlzc2luZyBcbgorODMwNDE3OWEgc3luYyBORVdTIHdpdGggMC40LjQKKzViZDA0YTA4IHN5bmMgdmVyc2lvbnMgd2l0aCAwLjQuNAorOGYxZmNjMTUgTWVyZ2UgIk1vdmUgQVJHQi0+WVVWIGZ1bmN0aW9ucyBmcm9tIGRlYy92cDhsLmMgdG8gZHNwL3l1di5jIgorMjViZjJjZTUgZml4IHNvbWUgd2FybmluZyBhYm91dCB1bmFsaWduZWQgMzJiIHJlYWRzCis5MjIyNjhmZCBzL1RJRkYvV2ViUAorZmE4OTI3ZWYgTW92ZSBBUkdCLT5ZVVYgZnVuY3Rpb25zIGZyb20gZGVjL3ZwOGwuYyB0byBkc3AveXV2LmMKKzliMzczNTk4IE1lcmdlICJmb3IgUmVhZFhYWFgoKSBpbWFnZS1yZWFkZXJzLCB1c2UgdGhlIHZhbHVlIG9mIHBpYy0+dXNlX2FyZ2IiCitmN2M1MDdhNSBNZXJnZSAicmVtb3ZlIHVubmVjZXNzYXJ5ICNpbmNsdWRlICJ5dXYuaCIiCis3ODYxNTc4YiBmb3IgUmVhZFhYWFgoKSBpbWFnZS1yZWFkZXJzLCB1c2UgdGhlIHZhbHVlIG9mIHBpYy0+dXNlX2FyZ2IKKzE0ZTQwNDNiIHJlbW92ZSB1bm5lY2Vzc2FyeSAjaW5jbHVkZSAieXV2LmgiCis0NjliYTJjZCB2d2VicDogZml4IGluY29ycmVjdCBjbGlwcGluZyB3L05PX0JMRU5ECis0YjkxODZiMiB1cGRhdGUgaXNzdWUgdHJhY2tlciB1cmwKK2Q2NGQzNzZjIGNoYW5nZSBXRUJQX0FMSUdOX0NTVCB2YWx1ZSB0byAzMQorZjcxN2I4MjggdnA4bC5jLCBjb3NtZXRpY3M6IGZpeCBpbmRlbnQgYWZ0ZXIgOTU1MDlmOQorOTI3Y2NkYzQgTWVyZ2UgImZpeCBhbGlnbm1lbnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBpbiBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlciIKK2ZlYTk0YjJiIGZpeCBhbGlnbm1lbnQgb2YgYWxsb2NhdGVkIG1lbW9yeSBpbiBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcgorNWFhOGQ2MWYgTWVyZ2UgIk1JUFM6IHJlc2NhbGVyIGNvZGUgc3luY2VkIHdpdGggQyBpbXBsZW1lbnRhdGlvbiIKK2U3ZmIyNjdkIE1JUFM6IHJlc2NhbGVyIGNvZGUgc3luY2VkIHdpdGggQyBpbXBsZW1lbnRhdGlvbgorOTNjODZlZDUgTWVyZ2UgImZvcm1hdF9jb25zdGFudHMuaDogTUtGT1VSQ0MsIGNvcnJlY3QgY2FzdCIKKzVkNzkxZDI2IGZvcm1hdF9jb25zdGFudHMuaDogTUtGT1VSQ0MsIGNvcnJlY3QgY2FzdAorNjU3MjZjZDMgZHNwL2xvc3NsZXNzOiBBdmVyYWdlMiwgbWFrZSBhIGNvbnN0YW50IHVuc2lnbmVkCitkMjZkOWRlZiBVc2UgX19oYXNfYnVpbHRpbiB0byBjaGVjayBjbGFuZyBzdXBwb3J0CisxMmVjMjA0ZSBtb3ZlZCBBTElHTl9DU1QgaW50byB1dGlsL3V0aWxzLmggYW5kIHJlbmFtZWQgV0VCUF9BTElHTl94eHgKK2EyNjQwODM4IE1lcmdlICJyZXNjYWxlcjogfjIwJSBmYXN0ZXIgU1NFMiBpbXBsZW1lbnRhdGlvbiBmb3IgbG9zc2xlc3MgSW1wb3J0Um93RXhwYW5kIgorM2ZiNjAwZDUgTWVyZ2UgIndpY2RlYzogZml4IGFscGhhIGRldGVjdGlvbiB3LzY0YnBwIEJHUkEvUkdCQSIKKzY3YzU0N2ZkIHJlc2NhbGVyOiB+MjAlIGZhc3RlciBTU0UyIGltcGxlbWVudGF0aW9uIGZvciBsb3NzbGVzcyBJbXBvcnRSb3dFeHBhbmQKKzk5ZTNmODEyIE1lcmdlICJsYXJnZSByZS1vcmdhbml6YXRpb24gb2YgdGhlIGRlbHRhLXBhbGV0dGl6YXRpb24gY29kZSIKKzk1NTA5Zjk5IGxhcmdlIHJlLW9yZ2FuaXphdGlvbiBvZiB0aGUgZGVsdGEtcGFsZXR0aXphdGlvbiBjb2RlCis3NGZiNDU4YiBmaXggZm9yIHdlaXJkIG1zdmMgd2FybmluZyBtZXNzYWdlCithZTQ5YWQ4NiBNZXJnZSAiU1NFMiBpbXBsZW1lbnRhdGlvbiBvZiBJbXBvcnRSb3dTaHJpbmsiCis5MzJmZDRkZiBTU0UyIGltcGxlbWVudGF0aW9uIG9mIEltcG9ydFJvd1NocmluaworYmFkZmNiYWEgd2ljZGVjOiBmaXggYWxwaGEgZGV0ZWN0aW9uIHcvNjRicHAgQkdSQS9SR0JBCiszNWNhZmE2YyBNZXJnZSAiaW9zYnVpbGQ6IGZpeCBsaW5raW5nIHdpdGggWGNvZGUgNyAvIGlPUyBTREsgOSIKK2IwYzlkOGFmIGxhYmVsIHJlbmFtZTogTk9fQ0hBTkdFIC0+IE5vQ2hhbmdlCitiNGU3MzFjZCBuZW9uLWltcGxlbWVudGF0aW9uIGZvciByZXNjYWxlciBjb2RlCitkYjEzMjFhNiBpb3NidWlsZDogZml4IGxpbmtpbmcgd2l0aCBYY29kZSA3IC8gaU9TIFNESyA5Cis2ZGZhNWUzZSByZXNjYWxlcjogYmV0dGVyIGhhbmRsaW5nIG9mIHRoZSBmeHlfc2NhbGU9MCBzcGVjaWFsIGNhc2UuCis1NWMwNTI5MyBSZXZlcnQgInJlc2NhbGVyOiBiZXR0ZXIgaGFuZGxpbmcgb2YgdGhlIGZ4eV9zY2FsZT0wIHNwZWNpYWwgY2FzZS4iCis5ZjIyNmJmOCByZXNjYWxlcjogYmV0dGVyIGhhbmRsaW5nIG9mIHRoZSBmeHlfc2NhbGU9MCBzcGVjaWFsIGNhc2UuCitmN2I4ZjkwNyBkZWx0YV9wYWxldHRpemF0aW9uLio6IGFkZCBjb3B5cmlnaHQKK2MxZTFiNzEwIENoYW5nZWQgZGVsdGEgcGFsZXR0ZSB0byBjb21wcmVzcyBiZXR0ZXIKKzBkZDI4MjY3IE1lcmdlICJBZGQgZGVsdGFfcGFsZXR0aXphdGlvbiBmZWF0dXJlIHRvIFdlYlAiCis0OGY2NmI2NiBBZGQgZGVsdGFfcGFsZXR0aXphdGlvbiBmZWF0dXJlIHRvIFdlYlAKKzI3OTMzZTJhIGFuaW1fZW5jb2RlcjogZHJvcCBhIGZyYW1lIGlmIGl0IGhhcyBzYW1lIHBpeGVscyBhcyB0aGUgcHJldiBmcmFtZS4KK2RmOWY2ZWM4IE1lcmdlICJ3ZWJwbXV4L0Rpc3BsYXlJbmZvOiBzZW5kIG5vbi1lcnJvciBvdXRwdXQgdG8gc3Rkb3V0IgorOGFmNDk5M2IgTWVyZ2UgInJlc2NhbGVyX21pcHNfZHNwX3IyOiBjb3NtZXRpY3MsIGZpeCBpbmRlbnQiCisyYjlkMjQ5NSBNZXJnZSAicmVzY2FsZXI6IGNvc21ldGljcywgam9pbiB0d28gbGluZXMiCitjYzAyMGE4YyB3ZWJwbXV4L0Rpc3BsYXlJbmZvOiBzZW5kIG5vbi1lcnJvciBvdXRwdXQgdG8gc3Rkb3V0CithMjg4ZTc0NiBjb25maWd1cmU6IGFkZCAtV3Nob3J0ZW4tNjQtdG8tMzIKK2M0YzNjZjJkIHBuZ2RlYzogZml4IHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncworYmVmOGU5N2Qgd2VicG11eDogZml4IHR5cGUgY29udmVyc2lvbiB3YXJuaW5nCis1YTg0NDYwZCByZXNjYWxlcl9taXBzX2RzcF9yMjogY29zbWV0aWNzLCBmaXggaW5kZW50CithY2RlMGFhZSByZXNjYWxlcjogY29zbWV0aWNzLCBqb2luIHR3byBsaW5lcworMzA2Y2U0ZmQgcmVzY2FsZXI6IG1vdmUgdGhlIDF4MSBvciAyeDEgaGFuZGxpbmcgb25lIGxldmVsIHVwCitjY2VkOTc0YiByZW1vdmUgX21tX3NldF9lcGk2NHgoKSwgd2hpY2ggaXMgdG9vIHNwZWNpZmljCis1NjY2OGM5ZiBmaXggd2FybmluZ3MgYWJvdXQgdWludDY0X3QgLT4gdWludDMyX3QgY29udmVyc2lvbgorNzZhN2RjMzkgcmVzY2FsZXI6IGFkZCBzb21lIFNTRTIgY29kZQorMWRmMWQwZWUgcmVzY2FsZXI6IGhhcm1vbml6ZSBmdW5jdGlvbiBwcm90b3MKKzliYTE4OTRiIHJlc2NhbGVyOiBzaW1wbGlmeSBJbXBvcnRSb3cgbG9naWMKKzVmZjAwNzllIGZpeCByZXNjYWxlciB2ZXJ0aWNhbCBpbnRlcnBvbGF0aW9uCitjZDgyNDQwZSBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQ6IGFsaWduIGhpc3RvZ3JhbVtdIGVudHJpZXMKK2E0MDZiMWRkIE1lcmdlICJmaXggbWVtb3J5IG92ZXItYWxsb2NhdGlvbiBpbiBsb3NzbGVzcyByZXNjYWxlciBpbml0IgorMGZkZTMzZTMgYWRkIG1pc3NpbmcgY29uc3QgaW4gVlA4SW5pdEZyYW1lIHNpZ25hdHVyZQorYWM3ZDVlOGQgZml4IG1lbW9yeSBvdmVyLWFsbG9jYXRpb24gaW4gbG9zc2xlc3MgcmVzY2FsZXIgaW5pdAorMDE3ZjhjY2MgTG9vc2VuIHRoZSBidWZmZXIgc2l6ZSBjaGVja3MgZm9yIFkvVS9WL0EgdG9vLgorMTVjYTUwMTQgbG9vc2VuIHRoZSBwYWRkaW5nIGNoZWNrIG9uIGJ1ZmZlciBzaXplCitkNjIzYTg3MCBkZWNfbmVvbjogYWRkIHdoaXRlc3BhY2UgYXJvdW5kIHN0cmluZ2l6aW5nIG9wZXJhdG9yCisyOTM3N2Q1NSBkc3AvbWlwczogY29zbWV0aWNzOiBhZGQgd2hpdGVzcGFjZSBhcm91bmQgWFNUUiBtYWNybworZWViYWY5N2YgZHNwL21pcHM6IGFkZCB3aGl0ZXNwYWNlIGFyb3VuZCBzdHJpbmdpemluZyBvcGVyYXRvcgorZDM5ZGM4ZjMgQ3JlYXRlIGEgV2ViUEFuaW1EZWNvZGVyIEFQSS4KKzAzZmI3NTIyIGdpZjJ3ZWJwOiBwcmludCBvdXRwdXQgZmlsZSBzaXplCisxNGVmYWJiZiBBbmRyb2lkOiBsaW1pdCB1c2Ugb2YgY3B1ZmVhdHVyZXMKKzdiODNhZGJlIHByZXBhcmF0b3J5IGNvc21ldGljcyBmb3IgUmVzY2FsZXIgY29kZSBmaXggYW5kIGNsZWFuLXVwCis3N2ZiNDFjMiBkZWMvdnA4bC9EZWNvZGVBbHBoYURhdGE6IHJlbW92ZSByZWR1bmRhbnQgY2FzdAorOTBmY2ZjZDkgSW5zZXJ0IGxlc3MgaGFzaCBjaGFpbiBlbnRyaWVzIGZyb20gdGhlIGJlZ2lubmluZ3Mgb2YgbG9uZyBjb3BpZXMuCitiZDU1NjA0ZCBTU0UyOiBhZGQgeXV2NDQ0IGNvbnZlcnRlcnMsIHJlLXVzaW5nIHl1dl9zc2UyLmMKKzQxYTVkOTlkIGFkZCBhIC1xdWlldCBvcHRpb24gdG8gJ2R3ZWJwJworODBhYjNlZGIgTWVyZ2UgIlJFQURNRTogdXBkYXRlIGR3ZWJwIGhlbHAgb3V0cHV0IGFmdGVyIDFlNTk1ZmUiCiszMmI3MWIyZSBSRUFETUU6IHVwZGF0ZSBkd2VicCBoZWxwIG91dHB1dCBhZnRlciAxZTU5NWZlCiszZWMxMTgyNyB1c2UgdGhlIERpc3BhdGNoQWxwaGEoKSBjYWxsIGZyb20gZHNwCitjNWYwMDYyMSBpbmNvcnBvcmF0ZSBiemVybygpIGludG8gV2ViUFJlc2NhbGVySW5pdCgpIGluc3RlYWQgb2YgY2FsbCBzaXRlCiszZWJjZGQ0MSByZW1vdmUgZHVwbGljYXRlICIjaW5jbHVkZSA8c3RkbGliLmg+IgorMWU1OTVmZTEgZHdlYnA6IGFkZCAtcmVzaXplIGFzIGEgc3lub255bSBmb3IgLXNjYWxlCisyNGE5NjkzMiBkZWM6IGFsbG93IDAgYXMgYSBzY2FsaW5nIGRpbWVuc2lvbgorYjkxODcyNDIgdXRpbHMvcmVzY2FsZXI6IGFkZCBXZWJQUmVzY2FsZXJHZXRTY2FsZWREaW1lbnNpb25zCis5MjNlOGVkYSBNZXJnZSAidXBkYXRlIE5FV1MiCiswMjBmZDA5OSBNZXJnZSAiV2ViUFBpY3R1cmVEaXN0b3J0aW9uOiBzdXBwb3J0IEFSR0IgZm9ybWF0IGZvciAncGljJyB3aGVuIGNvbXB1dGluZyBkaXN0b3J0aW9uLiIKKzZhNTI5MmY2IHVwZGF0ZSBORVdTCis1NmEyZTlmNSBXZWJQUGljdHVyZURpc3RvcnRpb246IHN1cHBvcnQgQVJHQiBmb3JtYXQgZm9yICdwaWMnIHdoZW4gY29tcHV0aW5nIGRpc3RvcnRpb24uCiswYWU1ODJlNCBjb25maWd1cmU6IHRlc3QgYW5kIGFkZCAtV3VucmVhY2hhYmxlLWNvZGUKK2MyZjlkYzA2IGJpdF93cml0ZXI6IGNvbnZlcnQgVlA4TCBtYWNybyB2YWx1ZXMgdG8gaW1tZWRpYXRlcworYjk2OWY4ODggUmVkdWNlIG1hZ2ljIGluIHBhbGV0dGUgcmVvcmRlcmluZworYWNiMjk3ZTkgYW5pbV9kaWZmOiBhZGQgYSAtcmF3X2NvbXBhcmlzb24gZmxhZworMTU1YzFiMjIgTWVyZ2UgY2hhbmdlcyBJNzZmNGQ2ZmUsSTQ1NDM0NjM5Cis3MTdlNGQ1YSBtaXBzMzIvbWlwc0RTUHIyOiBmdW5jdGlvbiBJbXBvcnRSb3cgcmViYXNlZAorN2RmOTM4OTMgZml4IHJlc2NhbGluZyBidWcgKHVuaW5pdGlhbGl6ZWQgcmVhZCwgc2VlIGJ1ZyAjMjU0KS4KKzVjZGNkNTYxIGxvc3NsZXNzX2VuY19uZW9uOiBhZGQgVlA4TFRyYW5zZm9ybUNvbG9yCithNTNjMzM2OSBsb3NzbGVzc19uZW9uOiBhZGQgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZQorOTkxMzFlN2YgTWVyZ2UgY2hhbmdlcyBJOWZiMjVhODksSWJjNjQ4ZTllCitjNDU1Njc2NiBzaW1wbGlmeSB0aGUgbWFpbiBsb29wIGZvciBkb3duc2NhbGluZworMmEwMTBmOTkgbG9zc2xlc3NfbmVvbjogcmVtb3ZlIHByZWRpY3RvcnMgNS0xMworY2EyMjFiYmMgbGxfZW5jX25lb246IGVuYWJsZSBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkCis1ODVkOTNkYiBDb250YWluZXIgc3BlYzogY2xhcmlmeSBvcmRlcmluZyBvZiBBTFBIIGNodW5rLgorMDFkNjFmZDkgbG9zc2xlc3M6IH4yMCAlIHNwZWVkdXAKK2Y3MjJjOGYwIGxvc3NsZXNzOiBTcGVlZCB1cCBDb21wdXRlQ2FjaGVFbnRyb3B5IGJ5IDQwICUKKzFjZWVjZGM4IGFkZCBhIFZQOExDb2xvckNhY2hlU2V0KCkgbWV0aG9kIGZvciBjb2xvciBjYWNoZQorMTdlYjYwOTkgbG9zc2xlc3M6IEFsbG93IGNvcHlpbmcgZnJvbSBwcmV2IHJvdyBpbiBybGUtbW9kZS4KK2YzYTdhNWJmIGxvc3NsZXNzOiBiaXQgd3JpdGVyIG9wdGltaXphdGlvbgorZDk3YjlmZjcgTWVyZ2UgY2hhbmdlcyBmcm9tIHRvcGljICdsb3NzbGVzcy1lbmMtaW1wcm92ZW1lbnRzJworMDI1MGRmY2MgbXN2YzogZml4IHBvaW50ZXIgdHlwZSB3YXJuaW5nIGluIEJpdHNMb2cyRmxvb3IKKzUyOTMxZmQ1IGxvc3NsZXNzOiBjb21iaW5lIHRoZSBIdWZmbWFuIGNvZGUgd2l0aCBleHRyYSBiaXRzCitjNDg1NWNhMiBsb3NzbGVzczogSW5saW5pbmcgYWRkIGxpdGVyYWwKKzhlOWM5NGRlIGxvc3NsZXNzOiBzaW1wbGlmeSBIYXNoQ2hhaW5GaW5kQ29weSBoZXVyaXN0aWNzCis4ODg0MjlmNCBsb3NzbGVzczogMC41ICUgY29tcHJlc3Npb24gZGVuc2l0eSBpbXByb3ZlbWVudAorN2IyM2IxOTggbG9zc2xlc3M6IEFkZCB6ZXJvZXMgaW50byB0aGUgcHJlZGljdGVkIGhpc3RvZ3JhbXMuCis4NWI0NGQ4YSBsb3NzbGVzczogZW5jb2RpbmcsIGRvbid0IGNvbXB1dGUgdW5uZWNlc3NhcnkgaGlzdG8KK2Q5MjQ1M2YzIGxvc3NsZXNzOiBSZW1vdmUgYWJvdXQgMjUgJSBvZiB0aGUgc3BlZWQgZGVncmFkYXRpb24KKzJjY2UwMzE3IEZhc3RlciBhbHBoYSBjb2RpbmcgZm9yIHdlYnAKKzVlNzU2NDJlIGxvc3NsZXNzOiBybGUgbW9kZSBub3QgdG8gYWNjZXB0IGxlbmd0aHMgc21hbGxlciB0aGFuIDQuCis4NDMyNmU0YSBsb3NzbGVzczogTGVzcyBjb2RlIGZvciB0aGUgZW50cm9weSBzZWxlY3Rpb24KKzE2YWI5NTFhIGxvc3NsZXNzOiAwLjM3ICUgY29tcHJlc3Npb24gZGVuc2l0eSBpbXByb3ZlbWVudAorODIyZjExM2UgYWRkIFdlYlBGcmVlKCkgdG8gdGhlIEFQSQorMGFlMmMyZTQgU1NFMi9TU0U0MTogb3B0aW1pemUgU1NFXzE2eE4gbG9vcHMKKzM5MjE2ZTU5IGNvc21ldGljczogZml4IGluZGVudCBhZnRlciAzMjQ2MmEwNworNTU5ZTU0Y2EgTWVyZ2UgIlNTRTI6IHNsaWdodGx5IGZhc3RlciBGVHJhbnNmb3JtV0hUIgorOGVmOWE2M2IgU1NFMjogc2xpZ2h0bHkgZmFzdGVyIEZUcmFuc2Zvcm1XSFQKK2YyN2Y3NzM1IGxvc3NsZXNzX25lb246IGVuYWJsZSBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQKKzM2ZTljNGJjIFNTRTI6IG1pbm9yIGNvc21ldHJpY3Mgb24gaW4tbG9vcCBmaWx0ZXIgY29kZQorNDc0MWZhYzQgZHNwL2xvc3NsZXNzXypzc2UyOiByZW1vdmUgc29tZSB1bm5lY2Vzc2FyeSBpbmxpbmVzCisxODE5OTY1ZSBmaXggd2FybmluZyAoImxlZnQgc2hpZnQgb2YgbmVnYXRpdmUgdmFsdWUiKSB1c2luZyBhIGNhc3QKKzcwMTcwMDE0IFNTRTI6IHNwZWVkLXVwIHNvbWUgbG9zc2xlc3MtZW5jb2RpbmcgZnVuY3Rpb25zCithYmNiMDEyOCBNZXJnZSAiU1NFMjogc2xpZ2h0bHkgZmFzdGVyICh+NSUpIEFkZEdyZWVuVG9CbHVlQW5kUmVkKCkiCisyZGY1YmQzMCBNZXJnZSAiU3BlZWR1cCB0byBIdWZmbWFuQ29zdENvbWJpbmVkQ291bnQiCis5ZTM1NmQ2YiBTU0UyOiBzbGlnaHRseSBmYXN0ZXIgKH41JSkgQWRkR3JlZW5Ub0JsdWVBbmRSZWQoKQorZmM2Yzc1YTIgU1NFMjogNTMlIGZhc3RlciBUcmFuc2Zvcm1Db2xvcltJbnZlcnNlXQorNDkwNzNkYTYgU1NFMjogNDYlIHNwZWVkLXVwIG9mIFRyYW5zZm9ybUNvbG9yW0ludmVyc2VdCiszMjQ2MmEwNyBTcGVlZHVwIHRvIEh1ZmZtYW5Db3N0Q29tYmluZWRDb3VudAorZjNkNjg3ZTMgU1NFNC4xIGltcGxlbWVudGF0aW9uIG9mIHNvbWUgbG9zc2xlc3MgZW5jb2RpbmcgZnVuY3Rpb25zCitiZmMzMDBjNyBTU0U0LjEgaW1wbGVtZW50YXRpb24gb2Ygc29tZSBhbHBoYS1wcm9jZXNzaW5nIGZ1bmN0aW9ucworN2Y5Yzk4ZjIgTWVyZ2UgInNzZTIgaW4tbG9vcDogc2ltcGxpZnkgU2lnbmVkU2hpZnQ4YigpIGEgYml0IgorZWYzMTRhNWQgZGVjX3NzZTIvR2V0Tm90SEVWOiBtaWNybyBvcHRpbWl6YXRpb24KK2E3MjljZmY5IHNzZTIgaW4tbG9vcDogc2ltcGxpZnkgU2lnbmVkU2hpZnQ4YigpIGEgYml0Cis0MjJlYzlmYiBzaW1wbGlmeSBMb2FkOHg0KCkgYSBiaXQKKzhkZjIzOGVjIE1lcmdlICJyZW1vdmUgc29tZSBkdXBsaWNhdGUgRmxpcFNpZ24oKSIKKzc1MTUwNmM0IHJlbW92ZSBzb21lIGR1cGxpY2F0ZSBGbGlwU2lnbigpCis2NWVmNWFmYyBNZXJnZSAibG9zc2xlc3M6IDAuMTMlIGNvbXByZXNzaW9uIGRlbnNpdHkgZ2FpbiIKKzJiZWVmMmYyIGxvc3NsZXNzOiAwLjEzJSBjb21wcmVzc2lvbiBkZW5zaXR5IGdhaW4KKzMwMzNmMjRjIGxvc3NsZXNzOiAwLjA2ICUgY29tcHJlc3Npb24gZGVuc2l0eSBpbXByb3ZlbWVudAorNjQ5NjBkYTkgZGVjX25lb246IGFkZCBWRTh1diAvIFZFMTYKKzE0ZGJkODdiIGRlY19uZW9uOiBhZGQgSEU4dXYgLyBIRTE2CithYzc2ODAxMSBpbnRyb2R1Y2UgRlRyYW5zZm9ybTIgdG8gcGVyZm9ybSB0d28gdHJhbnNmb3JtcyBhdCBhIHRpbWUuCithYTYwNjVhZSBkZWNfbmVvbjogdXNlIHZsZDFfZHVwKG1lbSkgcmF0aGVyIHRoYW4gdmR1cChtZW1bMF0pCis4YjYzYWM3OCBNZXJnZSAiZGVjX25lb246IGFkZCBUTTE2IgorZjUxYmUwOWUgTWVyZ2UgImRlY19uZW9uL1RydWVNb3Rpb246IHNpbXBseSBsZWZ0IGJvcmRlciBsb2FkIgorZGM0ODE5NmIgZGVjX25lb246IGFkZCBUTTE2CitlYTk1YjMwNSBkZWNfbmVvbi9UcnVlTW90aW9uOiBzaW1wbHkgbGVmdCBib3JkZXIgbG9hZAorZjI2MmQ2MTIgc3BlZWQtdXAgU2V0UmVzaWR1YWxTU0UyCitiZjQ2ZDBhYyBmaXggbWlwczIgYnVpbGQgdGFyZ2V0Cis5MjlhMGZkYyBlbmNfc3NlMi9UVHJhbnNmb3JtOiBzaW1wbGlmeSBhYnMgY2FsY3VsYXRpb24KKzE3ZGJkMDU4IGVuY19zc2UyL0NvbGxlY3RIaXN0b2dyYW06IHNpbXBsaWZ5IGFicyBjYWxjdWxhdGlvbgorYTZjMTU5MzYgZGVjX25lb246IGFkZCBEQzE2IGludHJhIHByZWRpY3RvcnMKKzAzYjRmNTBkIE1ha2VmaWxlLnZjOiBhZGQgYW5pbV9kaWZmIGJ1aWxkIHN1cHBvcnQuCisxYjk4OTg3NCBNZXJnZSBjaGFuZ2VzIEk5Y2Q4NDEyNSxJZWU3ZTM4N2YsSTc1NDhiZTcyCithY2Q3YjVhZiBJbnRyb2R1Y2UgYSB0ZXN0IHRvb2wgYW5pbV9kaWZmLgorZjI3NGE5NmMgZHNwL2VuY19zc2UyOiBhZGQgbHVtYTQgaW50cmEgcHJlZGljdG9ycworMDQwYjExYmQgZHNwL2VuY19zc2UyOiBhZGQgY2hyb21hIGludHJhIHByZWRpY3RvcnMKK2FlZTAyMWJiIGRzcC9lbmNfc3NlMjogYWRkIGx1bWExNiBpbnRyYSBwcmVkaWN0b3JzCis5ZTAwYTQ5OSBtYWtlZmlsZS51bml4OiByZW1vdmUgc3VwZXJjbGVhbiB0YXJnZXQKK2NlZmM5YzA5IG1ha2VmaWxlLnVuaXg6IGNsZWFuIHVwIGFmdGVyIGV4dHJhcyB0YXJnZXQKKzRjOWFmMDIzIGRlY19uZW9uOiBhZGQgREM4dXZOb1RvcExlZnQKK2RkNTViODczIE1lcmdlICJkb2Mvd2VicC1jb250YWluZXItc3BlYzogdXBkYXRlIHJlcG8gYnJvd3NlciBsaW5rIgorZjA0ODY5NjggZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IHVwZGF0ZSByZXBvIGJyb3dzZXIgbGluaworOTI4Nzc2MWQgTWVyZ2UgIkdldFJlc2lkdWFsQ29zdFNTRTI6IHNpbXBsaWZ5IGFicyBjYWxjdWxhdGlvbiIKKzBlMDA5MzY2IGRzcC9jcHUuYyh4ODYpOiBjaGVjayBtYXhpbXVtIHN1cHBvcnRlZCBjcHVpZCBmZWF0dXJlCitiMjQzYTRiYyBHZXRSZXNpZHVhbENvc3RTU0UyOiBzaW1wbGlmeSBhYnMgY2FsY3VsYXRpb24KKzZkNDYwMmI4IE1lcmdlICJmaXggdHlwbzogY29uc3RpdHV0ZXMgLT4gY29uc3RpdHV0ZSIKKzVmZTFmZTM3IGZpeCB0eXBvOiBjb25zdGl0dXRlcyAtPiBjb25zdGl0dXRlCitiODNiZDdjNCBNZXJnZSAicG9wdWxhdGUgJ2xpYndlYnBleHRyYXMnIHdpdGg6IGltcG9ydCBncmF5LCByZ2I1NjUgYW5kIHJnYjQ0NDQgZnVuY3Rpb25zIgorYjAxMTRhMzIgTWVyZ2UgImhpc3RvZ3JhbS5oOiBjb3NtZXRpY3M6IHJlbW92ZSB1bm5lY2Vzc2FyeSBpbmNsdWRlcyIKK2ZlYWI0NWVmIGdpZmRlYzogTW92ZSBpbmNsdXNpb24gb2Ygd2VicC9jb25maWcuaCB0byBoZWFkZXIuCitkYmJhNjdkMSBoaXN0b2dyYW0uaDogY29zbWV0aWNzOiByZW1vdmUgdW5uZWNlc3NhcnkgaW5jbHVkZXMKK2U5NzhmZWM2IE1lcmdlICJWUDhMQml0UmVhZGVyOiBmaXggcmVtYWluaW5nIHVic2FuIGVycm9yIHdpdGggbGFyZ2Ugc2hpZnRzIgorZDZmZTU4ODQgTWVyZ2UgIlJlY29uc3RydWN0Um93OiBtb3ZlIHNvbWUgb25lLXRpbWUgaW5pdHMgb3V0IG9mIHRoZSBtYWluIGxvb3AiCithMjFkNjQ3YyBSZWNvbnN0cnVjdFJvdzogbW92ZSBzb21lIG9uZS10aW1lIGluaXRzIG91dCBvZiB0aGUgbWFpbiBsb29wCis3YTAxYzNjMyBWUDhMQml0UmVhZGVyOiBmaXggcmVtYWluaW5nIHVic2FuIGVycm9yIHdpdGggbGFyZ2Ugc2hpZnRzCis3ZmE2N2M5YiBjaGFuZ2UgR2V0UGl4UGFpckhhc2g2NCgpIHJldHVybiB0eXBlIHRvIHVpbnQzMl90CitlYzFmYjlmOCBNZXJnZSAiZHNwL2VuYy5jOiBjb3NtZXRpY3M6IG1vdmUgRFNUKCkgZGVmIGNsb3NlciB0byB1c2UiCis3MDczYmZiMyBNZXJnZSAic3BsaXQgNjQtbXVsdCBoYXNoaW5nIGludG8gdHdvIDMyLWJpdCBtdWx0aXBsaWVzIgorMDc2OGIyNTIgZHNwL2VuYy5jOiBjb3NtZXRpY3M6IG1vdmUgRFNUKCkgZGVmIGNsb3NlciB0byB1c2UKKzZhNDhiOGYwIE1lcmdlICJmaXggTVNWQyBzaXplX3QtPmludCBjb252ZXJzaW9uIHdhcm5pbmciCisxZGIwN2NkZSBNZXJnZSAiYW5pbV9lbmNvZGU6IGNvc21ldGljczogZml4IGFsaWdubWVudCIKK2UyODI3MWEzIGFuaW1fZW5jb2RlOiBjb3NtZXRpY3M6IGZpeCBhbGlnbm1lbnQKKzdmZTM1N2I4IHNwbGl0IDY0LW11bHQgaGFzaGluZyBpbnRvIHR3byAzMi1iaXQgbXVsdGlwbGllcworYWY3NGMxNDUgcG9wdWxhdGUgJ2xpYndlYnBleHRyYXMnIHdpdGg6IGltcG9ydCBncmF5LCByZ2I1NjUgYW5kIHJnYjQ0NDQgZnVuY3Rpb25zCis2MTIxNDEzNCByZW1vdmUgVlA4UmVzaWR1YWw6OmNvc3QgdW51c2VkIGZpZWxkCitlMjU0NDgyMyBmaXggTVNWQyBzaXplX3QtPmludCBjb252ZXJzaW9uIHdhcm5pbmcKK2I2OWE2YzM1IHZ3ZWJwOiBkb24ndCByZWRlZmluZSBzbnByaW50ZiB3aXRoIFZTMjAxNSsKKzBhYzI5YzUxIEFuaW1FbmNvZGVyIEFQSTogQ29uc2lzdGVudCB1c2Ugb2YgdHJhaWxpbmcgdW5kZXJzY29yZXMgaW4gc3RydWN0LgorZDQ4NDU1NTAgQW5pbUVuY29kZXIgQVBJOiBVc2UgdGltZXN0YW1wIGluc3RlYWQgb2YgZHVyYXRpb24gYXMgaW5wdXQgdG8gQWRkKCkuCis5OTA0ZTM2NSBkc3AvZGVjX3NzZTI6IERDOHV2IC8gREM4dXZOb0xlZnQgc3BlZWR1cAorN2RmMjA0OTcgZHNwL2RlY19zc2UyOiBEQzE2IC8gREMxNk5vTGVmdCBzcGVlZHVwCis4ZTUxNWRmZSBNZXJnZSAibWFrZWZpbGUudW5peDogYWRkIHNvbWUgbWlzc2luZyBoZWFkZXJzIgorZGIxMjI1MGYgY29zbWV0aWNzOiB2cDhlbmNpLmg6IGJyZWFrIGxvbmcgbGluZQorYmY1MTZhODcgbWFrZWZpbGUudW5peDogYWRkIHNvbWUgbWlzc2luZyBoZWFkZXJzCitiNDRlZGEzZiBkc3A6IGFkZCBEU1BfSU5JVF9TVFVCCiswM2U3NmU5NiBjbGFyaWZ5IHRoZSBjb21tZW50IGFib3V0IGRvdWJsZS1zZXR0aW5nIHRoZSBzdGF0dXMgaW4gU2V0RXJyb3IoKQorOWZlY2RkNzEgcmVtb3ZlIHVudXNlZCBFbWl0UkdCKCkKKzQzZjAxMGRkIG1vdmUgUmVjb25zdHJ1Y3RSb3cgdG8gdG9wCis4MmQ5ODAyMCBhZGQgYSBkZWMvY29tbW9uLmggaGVhZGVyIHRvIGNvbGxlY3QgY29tbW9uIGVuYy9kZWMgI2RlZmluZXMKKzVkNDc0NGEyIE1lcmdlICJlbmNfc3NlNDE6IGFkZCBEaXN0bzR4NCAvIERpc3RvMTZ4MTYiCitlMzg4ODZhNyBtdXguaDogQnVtcCB1cCBBQkkgdmVyc2lvbgorNDYzMDVjYTYgY29uZmlndXJlOiBhZGQgLS1kaXNhYmxlLTxhdngyfHNzZTQuMXxzc2UyPgorMmZjOGI2NTggQ1BQRkxBR1MtPkNGTEFHUyBmb3IgZGV0ZWN0aW5nIHNzZTQuMSBpbiBwcmVwcm9jZXNzb3IKKzFhMzM4ZmIzIGVuY19zc2U0MTogYWRkIERpc3RvNHg0IC8gRGlzdG8xNngxNgorOTQwNTU1MDMgZW5jb2RpbmcgU1NFNC4xIHN0dWIgZm9yIFN0b3JlSGlzdG9ncmFtICsgUXVhbnRpemUgKyBTU0VfMTZ4TgorYzY0NjU5ZTEgcmVtb3ZlIGR1cGxpY2F0ZSB2YXJpYWJsZXMgYWZ0ZXIgdGhlIGxvc3NsZXNze19lbmN9LmMgc3BsaXQKKzY3YmE3YzdhIGVuY19zc2UyOiBjYWxsIGxvY2FsIEZUcmFuc2Zvcm0gaW4gQ29sbGVjdEhpc3RvZ3JhbQorMTgyNDk3OTkgZHNwOiBzL1ZQOExTZXRIaXN0b2dyYW1EYXRhL1ZQOFNldEhpc3RvZ3JhbURhdGEvCitlZGU1ZTE1OCBjb3NtZXRpY3M6IGRzcC9sb3NzbGVzcy5oOiByZW9yZGVyIHByb3RvdHlwZXMKKzU1MzA1MWY3IGRzcC9sb3NzbGVzczogc3BsaXQgZW5jL2RlYyBmdW5jdGlvbnMKKzkwNjRhZGM4IE1lcmdlICJjb25kaXRpb25hbGx5IGFkZCAtbXNzZTQuMSBpbiBNYWtlZmlsZS51bml4IgorY2VjZjUwOTYgZHNwL3l1diouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorNjU4NGQzOTggZHNwL3Vwc2FtcGxpbmcqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzgwODA5NDIyIGRzcC9yZXNjYWxlciouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorMWQ5M2RkZWMgZHNwL2xvc3NsZXNzKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis3MzgwNWZmMiBkc3AvZmlsdGVycyouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorZmJkY2VmMjQgZHNwL2VuYyouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorNjZkZTY5YzEgZHNwL2RlYyouYzogcmV3b3JrIFdFQlBfVVNFXzxhcmNoPiBpZmRlZgorNDhlNGZmZDEgZHNwL2Nvc3QqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKKzI5ZmQ2ZjkwIGRzcC9hcmdiKi5jOiByZXdvcmsgV0VCUF9VU0VfPGFyY2g+IGlmZGVmCis4MGZmMzgxMyBkc3AvYWxwaGEqLmM6IHJld29yayBXRUJQX1VTRV88YXJjaD4gaWZkZWYKK2JmMDljZjFlIGNvbmRpdGlvbmFsbHkgYWRkIC1tc3NlNC4xIGluIE1ha2VmaWxlLnVuaXgKK2U5NTcwZGQ5IHN0dWIgZm9yIFNTRTQuMSBzdXBwb3J0LgorNGE5NTM4NGIgTWVyZ2UgImRzcDogYWRkIHNzZTQuMSBkZXRlY3Rpb24iCitjYWJmNGJkMiBkc3A6IGFkZCBzc2U0LjEgZGV0ZWN0aW9uCis0ZWNiYTFhYiB0aHJlYWQuaDogcmVuYW1lIGludGVyZmFjZSBwYXJhbQorYjhkNzA2YzggTWVyZ2UgInN5bmMgdmVyc2lvbnMgd2l0aCAwLjQuMyIKK2FlNjRhNzExIE1lcmdlICJhZGQgc2hlbGwgZm9yIGxpYndlYnBleHRyYXMiCis5MmE1ZGE5YyBzeW5jIHZlcnNpb25zIHdpdGggMC40LjMKKzlkNGUyZDE2IE1lcmdlICJ+MzAlIGZhc3RlciBzbWFydC15dXYgKC1wcmUgNCkgd2l0aCBlYXJseS1vdXQgY3JpdGVyaW9uIgorYjFiZGJiYWIgfjMwJSBmYXN0ZXIgc21hcnQteXV2ICgtcHJlIDQpIHdpdGggZWFybHktb3V0IGNyaXRlcmlvbgorN2VmYjk3NDggTWVyZ2UgIkRpc2FibGUgTkVPTiBjb2RlIG9uIE5hdGl2ZSBDbGllbnQiCithYzRmNTc4NCBEaXNhYmxlIE5FT04gY29kZSBvbiBOYXRpdmUgQ2xpZW50CiswODczZjg1YiBBbmltRW5jb2RlciBBUEk6IFN1cHBvcnQgaW5wdXQgZnJhbWVzIGluIFlVVihBKSBmb3JtYXQuCis1YzE3NmQyZCBhZGQgc2hlbGwgZm9yIGxpYndlYnBleHRyYXMKKzQ0YmQ5NTYxIGZpeCBzaWduYXR1cmUgZm9yIFZQOFJlY29yZENvZWZmVG9rZW5zKCkKK2M5YjhlYTBlIHNtYWxsIGNvc21ldGljcyBvbiBUb2tlbkJ1ZmZlci4KKzc2Mzk0YzA5IE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBUcnVlTW90aW9uIgorMGY3NzM2OTMgV2ViUFBpY3R1cmVSZXNjYWxlOiBhZGQgYSBub3RlIGFib3V0IDAgd2lkdGgvaGVpZ2h0CisyNDFiYjVkOSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBUcnVlTW90aW9uCis2Y2VmMGU0ZiBleGFtcGxlcy9BbmRyb2lkLm1rOiBhZGQgd2VicG11eF9leGFtcGxlIHRhcmdldAorNTNjMTZmZjAgQW5kcm9pZC5tazogYWRkIHdlYnBtdXggdGFyZ2V0CisyMTg1MmEwMCBBbmRyb2lkLm1rOiBhZGQgd2VicGRlbXV4IHRhcmdldAorODY5N2EzYmMgQW5kcm9pZC5tazogYWRkIHdlYnBkZWNvZGVyeyxfc3RhdGljfSB0YXJnZXRzCis0YTY3MDQ5MSBBbmRyb2lkLm1rOiBzcGxpdCBzb3VyY2UgbGlzdHMgcGVyLWRpcmVjdG9yeQorYjVlNzk0MjIgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3Igc29tZSBjb252ZXJ0IGZ1bmN0aW9ucworMGY1OTVkYjYgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3Igc29tZSBjb252ZXJ0IGZ1bmN0aW9ucworOGEyMThiNGEgTUlQUzogW21pcHMzMnxkc3ByMl06IEdldFJlc2lkdWFsQ29zdCByZWJhc2VkCitlZjk4NzUwMCBTcGVlZHVwIG1ldGhvZCBTdG9yZUltYWdlVG9CaXRNYXNrIGJ5IDUlLgorNjAyYTAwZjkgZml4IGlPUyBhcm02NCBidWlsZCB3aXRoIFhjb2RlIDYuMworMjM4MjA1MDcgMS0yJSBmYXN0ZXIgZW5jb2RpbmcgYnkgcmVtb3ZpbmcgYW4gaW5kaXJlY3Rpb24gaW4gR2V0UmVzaWR1YWxDb3N0KCkKK2VkZGI3ZTcwIE1JUFM6IGRzcHIyOiBhZGRlZCBvdHBpbWl6YXRpb24gZm9yIERDOHV2LCBEQzh1dk5vVG9wIGFuZCBEQzh1dk5vTGVmdAorNzNiYTI5MTUgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb25zIFJENCBhbmQgTEQ0CitjNzEyOWRhNSBNZXJnZSAiNC01JSBmYXN0ZXIgZW5jb2RpbmcgdXNpbmcgU1NFMiBmb3IgR2V0UmVzaWR1YWxDb3N0IgorOTQzODBkMDAgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdG9uIGZvciBmdW5jdGlvbnMgVkU0IGFuZCBEQzQKKzJhNDA3MDkyIDQtNSUgZmFzdGVyIGVuY29kaW5nIHVzaW5nIFNTRTIgZm9yIEdldFJlc2lkdWFsQ29zdAorMTdlMTk4NjIgTWVyZ2UgIk1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIHNpbXBsZSBmaWx0ZXJpbmcgZnVuY3Rpb25zIgorM2VjNDA0YzQgTWVyZ2UgImRzcDogbm9ybWFsaXplIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdXNhZ2UiCitiOTY5ZjVkZiBkc3A6IG5vcm1hbGl6ZSBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHVzYWdlCitkN2I4ZTcxMSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBzaW1wbGUgZmlsdGVyaW5nIGZ1bmN0aW9ucworMjM1Zjc3NGUgTWVyZ2UgIk1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQyIKKzQyYThhNjI4IE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQworYjQ0MmJlZjMgTWVyZ2UgIkFwcGx5RmlsdGVyc0FuZEVuY29kZTogb25seSBjb3B5IGxvc3NsZXNzIHN0YXRzIgorYjUxMGZiZmUgZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IG5vdGUgTVNCIG9yZGVyIGZvciBjaHVuayBkaWFncmFtcworOWJjMGY5MjIgQXBwbHlGaWx0ZXJzQW5kRW5jb2RlOiBvbmx5IGNvcHkgbG9zc2xlc3Mgc3RhdHMKKzMwMzBmMTE1IE1lcmdlICJkc3AvbWlwczogYWRkIHNvbWUgbWlzc2luZyBUU2FuIGFubm90YXRpb25zIgorZGZjZjQ1OTMgTWVyZ2UgIk1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZF9DIgorNTVjNzVhMjUgZHNwL21pcHM6IGFkZCBzb21lIG1pc3NpbmcgVFNhbiBhbm5vdGF0aW9ucworMmNiODc5ZjAgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0MKK2UxNTU2MDEwIG1vdmUgc29tZSBjb3N0IHRhYmxlcyBmcm9tIGVuYy8gdG8gZHNwLworYzNhMDMxNjggTWVyZ2UgInBpY3R1cmVfY3NwOiBmaXggYnVpbGQgdy9VU0VfR0FNTUFfQ09NUFJFU1NJT04gdW5kZWZpbmVkIgorMzk1MzdkN2MgTWVyZ2UgIlZQOExEc3BJbml0TUlQU2RzcFIyOiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb24iCisxZGQ0MTljZSBwaWN0dXJlX2NzcDogZml4IGJ1aWxkIHcvVVNFX0dBTU1BX0NPTVBSRVNTSU9OIHVuZGVmaW5lZAorNDNmZDM1NDMgVlA4TERzcEluaXRNSVBTZHNwUjI6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbgorYzcyMzNkZmMgTWVyZ2UgIlZQOExEc3BJbml0OiByZW1vdmUgbWVtY3B5IgorMGVjNGRhOTYgcGljdHVyZV9jc3A6OkluaXRHYW1tYVRhYmxlcyo6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbnMKKzM1NTc5YTQ5IFZQOExEc3BJbml0OiByZW1vdmUgbWVtY3B5Cis5N2Y2YWZmOCBWUDhZVVZJbml0OiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb24KK2Y5MDE2ZDY2IGRzcC9lbmM6OkluaXRUYWJsZXM6IGFkZCBtaXNzaW5nIFRTYW4gYW5ub3RhdGlvbgorZTNkOTc3MWEgVlA4RW5jRHNwQ29zdEluaXQqOiBhZGQgbWlzc2luZyBUU2FuIGFubm90YXRpb25zCitkOTdjMTQzZCBNZXJnZSAiZG9jL3dlYnAtY29udGFpbmVyLXNwZWM6IGNvc21ldGljcyIKKzMwOWI3OTA4IE1JUFM6IG1pcHMzMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBTZXRSZXNpZHVhbENvZWZmcworYTk4N2ZhZWQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gR2V0UmVzaWR1YWxDb3N0CitlN2QzZGYyMyBkb2Mvd2VicC1jb250YWluZXItc3BlYzogY29zbWV0aWNzCitiZTY2MzVlOSBNZXJnZSAiVlA4VEJ1ZmZlckNsZWFyOiByZW1vdmUgc29tZSBtaXNsZWFkaW5nIGNvbnN0J3MiCiswMjk3MWU3MiBNZXJnZSAiVlA4RW1pdFRva2VuczogcmVtb3ZlIHVubmVjZXNzYXJ5IHBhcmFtIHZvaWQgY2FzdCIKKzNiNzdlNWE3IFZQOFRCdWZmZXJDbGVhcjogcmVtb3ZlIHNvbWUgbWlzbGVhZGluZyBjb25zdCdzCithYTEzOWM4ZiBWUDhFbWl0VG9rZW5zOiByZW1vdmUgdW5uZWNlc3NhcnkgcGFyYW0gdm9pZCBjYXN0CitjMjRkOGYxNCBjb3NtZXRpY3M6IHVwc2FtcGxpbmdfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzE4MjljNDJjIGNvc21ldGljczogbG9zc2xlc3Nfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzE4MzE2OGYzIGNvc21ldGljczogZW5jX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCis4NjBiYWRjYSBjb3NtZXRpY3M6IGRlY19zc2UyOiBhZGQgY29uc3QgdG8gc29tZSBjYXN0cworMDI1NGRiOTcgY29zbWV0aWNzOiBhcmdiX3NzZTI6IGFkZCBjb25zdCB0byBzb21lIGNhc3RzCisxYWFkZjg1NiBjb3NtZXRpY3M6IGFscGhhX3Byb2Nlc3Npbmdfc3NlMjogYWRkIGNvbnN0IHRvIHNvbWUgY2FzdHMKKzE1NzlkZTNjIHZ3ZWJwOiBjbGVhciBjYW52YXMgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxvb3AKKzRiOWZhNWQwIE1lcmdlICJ3ZWJwLWNvbnRhaW5lci1zcGVjOiBjbGFyaWZ5IGJhY2tncm91bmQgY2xlYXIgb24gbG9vcCIKKzRjODIyODRkIFVwZGF0ZWQgdGhlIG5lYXItbG9zc2xlc3MgbGV2ZWwgbWFwcGluZy4KKzU2MDM5NDc5IHdlYnAtY29udGFpbmVyLXNwZWM6IGNsYXJpZnkgYmFja2dyb3VuZCBjbGVhciBvbiBsb29wCisxOWYwYmEwZSBJbXBsZW1lbnQgdHJ1ZS1tb3Rpb24gcHJlZGljdGlvbiBpbiBTU0UyCis3NzRkNGNiNyBtYWtlIFZQOFByZWRMdW1hMTZbXSBhcnJheSBub24tY29uc3QKK2Q3ZWFiYjgwIE1lcmdlICJNSVBTOiBkc3ByMjogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBDb2xsZWN0SGlzdG9ncmFtIgorZmU0MjczOWMgVXNlIGludGVnZXJzIGZvciBrbWluL2ttYXggZm9yIHNpbXBsaWNpdHkuCitiOWRmMzVmNyBBbmltRW5jb2RlIEFQSToga21heD0wIHNob3VsZCBpbXBseSBhbGwga2V5ZnJhbWVzLgorNmNlMjk2ZGEgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gQ29sbGVjdEhpc3RvZ3JhbQorMmM5MDZjNDAgdndlYnA6IHJlbW92ZSB1bm5lY2Vzc2FyeSBzdGF0aWMgSGVscCgpIHByb3RvdHlwZQorYmUwZmQxZDUgTWVyZ2UgImRlYy92cDg6IGNsZWFyICdkaXRoZXJfJyBvbiBza2lwcGVkIGJsb2NrcyIKK2U5NjE3MGZlIE1lcmdlICJ2d2VicC9hbmltYXRpb246IGRpc3BsYXkgbGFzdCBmcmFtZSBvbiBlbmQtb2YtbG9vcCIKKzBmMDE3YjU2IHZ3ZWJwL2FuaW1hdGlvbjogZGlzcGxheSBsYXN0IGZyYW1lIG9uIGVuZC1vZi1sb29wCitjODZiNDBjYyBlbmMvbmVhcl9sb3NzbGVzcy5jOiBmaXggYWxpZ25tZW50Cis2NjkzNWZiOSBkZWMvdnA4OiBjbGVhciAnZGl0aGVyXycgb24gc2tpcHBlZCBibG9ja3MKK2I3ZGU3OTQ2IE1lcmdlICJsb3NzbGVzc19uZW9uOiBlbmFibGUgc3VidHJhY3QgZ3JlZW4gZm9yIGFhcmNoNjQiCis3NzcyNGY3MCBTU0UyIHZlcnNpb24gb2YgR3JhZGllbnRVbmZpbHRlcgorNDE2ZTFjZWEgbG9zc2xlc3NfbmVvbjogZW5hYmxlIHN1YnRyYWN0IGdyZWVuIGZvciBhYXJjaDY0Cis3MjgzMWY2YiBTcGVlZHVwIEFuYWx5emVBbmRJbml0IGZvciBsb3cgZWZmb3J0IGNvbXByZXNzaW9uLgorYTY1OTc0ODMgU3BlZWR1cCBBbmFseXplIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorOThjODEzODYgRW5hYmxlIE5lYXItbG9zc2xlc3MgZmVhdHVyZS4KK2M2YjI0NTQzIEFuaW1FbmNvZGVyIEFQSTogRml4IGZvciBrbWF4PTEgYW5kIGRlZmF1bHQga21pbiBjYXNlLgorMDIyZDJmODggYWRkIFNTRTIgdmFyaWFudHMgZm9yIGFscGhhIGZpbHRlcmluZyBmdW5jdGlvbnMKKzJkYjE1YTk1IFRlbXBvcmFyaWx5IGRpc2FibGUgZW5jb2Rpbmcgb2YgYWxwaGEgcGxhbmUgd2l0aCBjb2xvciBjYWNoZS4KKzFkNTc1Y2NkIE1lcmdlICJMb3NzbGVzcyBkZWNvZGluZzogUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGlmIGNvbmRpdGlvbi4iCitjYWZhMWQ4OCBNZXJnZSAiU2ltcGxpZnkgYmFja3dhcmQgcmVmcyBjYWxjdWxhdGlvbiBmb3IgbG93LWVmZm9ydC4iCis3YWZkYWY4NCBBbHBoYSBjb2Rpbmc6IHJlb3JnYW5pemUgdGhlIGZpbHRlci91bmZpbHRlcmluZyBjb2RlCis0ZDZkNzI4NSBTaW1wbGlmeSBiYWNrd2FyZCByZWZzIGNhbGN1bGF0aW9uIGZvciBsb3ctZWZmb3J0LgorZWMwZDFiZTUgQ2xlYXVwIE5lYXItbG9zc2xlc3MgY29kZS4KKzk4MTRkZGI2IFJlbW92ZSB0aGUgcG9zdC10cmFuc2Zvcm0gbmVhci1sb3NzbGVzcyBoZXVyaXN0aWMuCis0NTA5ZTMyZSBMb3NzbGVzcyBkZWNvZGluZzogUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGlmIGNvbmRpdGlvbi4KK2YyZWJjNGE4IE1lcmdlICJSZWdyZXNzaW9uIGZpeCBmb3IgbG9zc2xlc3MgZGVjb2RpbmciCis3ODNhOGNkYSBSZWdyZXNzaW9uIGZpeCBmb3IgbG9zc2xlc3MgZGVjb2RpbmcKKzlhMDYyYjhlIEFuaW1FbmNvZGVyOiBCdWdmaXggZm9yIGttaW4gPSAxIGFuZCBrbWF4ID0gMi4KKzBmMDI3YTcyIHNpbXBsaWZ5IHNtYXJ0IFJHQi0+WVVWIGNvbnZlcnNpb24gY29kZQorMGQ1YjMzNGUgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRm9sbG93Q2hvc2VuUGF0aDogcmVtb3ZlIHVudXNlZCB2YXJpYWJsZQorZjQ4MGQxYTcgRml4IHRvIG5lYXIgbG9zc2xlc3MgYXJ0ZWZhY3RzIG9uIHBhbGV0dGl6ZWQgaW1hZ2VzLgorZDQ2MTVkMDggTWVyZ2UgY2hhbmdlcyBJYTE2ODY4MjgsSTM5OWZkYTQwCitjYjRhMThhNyByZW5hbWUgSGFzaENoYWluSW5pdCBpbnRvIEhhc2hDaGFpblJlc2V0CitmMDc5ZTQ4NyB1c2UgdWludDE2X3QgZm9yIGNob3Nlbl9wYXRoW10KK2RhMDkxMjEyIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEZUcmFuc2Zvcm1XSFQKK2I4YzIwMTM1IE1lcmdlICJ3aWNkZWM6IChtc3ZzKSBxdWlldCBzb21lIC9hbmFseXplIHdhcm5pbmdzIgorOWIyMjhiNTQgd2ljZGVjOiAobXN2cykgcXVpZXQgc29tZSAvYW5hbHl6ZSB3YXJuaW5ncworZGFlYjI3NmEgTWVyZ2UgIk1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIE11bHRBUkdCUm93IGZ1bmN0aW9uIgorY2MwODc0MjQgTWVyZ2UgImRzcC9jcHU6IChtc3ZzKSBhZGQgaW5jbHVkZSBmb3IgX19jcHVpZGV4IgorNGE4MmFhYjUgTWVyZ2UgY2hhbmdlcyBJODc1NDRlOTIsSTBiYjZjZGE1Cis3YTE5MTM5OCBkd2VicC9Xcml0ZVBORzogbWFyayBwbmcgdmFyaWFibGVzIHZvbGF0aWxlCis3NzVkZmFkMiBkd2VicDogaW5jbHVkZSBzZXRqbXAuaCB3L1dFQlBfSEFWRV9QTkcKKzQ3ZDI2YmU3IGR3ZWJwOiBjb3JyZWN0IHNpZ24gaW4gZm9ybWF0IHN0cmluZ3MKK2YwZTA2NzdiIFZQOExFbmNvZGVTdHJlYW06IGFkZCBhbiBhc3NlcnQKK2M1Zjc3NDdmIFZQOExDb2xvckNhY2hlQ29weTogcHJvbW90ZSBhbiBpbnQgYmVmb3JlIHNoaWZ0aW5nCiswZGU1ZjMzZSBkc3AvY3B1OiAobXN2cykgYWRkIGluY2x1ZGUgZm9yIF9fY3B1aWRleAorN2Q4NTBmN2IgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgTXVsdEFSR0JSb3cgZnVuY3Rpb24KKzU0ODc1MjkzIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFF1YW50aXplQmxvY2sKKzRmYmU5Y2YyIGRzcC9jcHU6IChtc3ZzKSBhdm9pZCBpbW1pbnRyaW4uaCBvbiBfTV9BUk0KKzNmZDU5MDM5IHNpbXBsaWZ5L3Jlb3JnYW5pemUgYXJndW1lbnRzIGZvciBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcworYjllMzU2YjkgRGlzYWJsZSBjb3N0bHkgVHJhY2VCYWNrd2FyZHMgZm9yIG1ldGhvZD0wLgorYTdlN2NhYTQgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gVHJhbnNmb3JtQ29sb3JSZWQKKzJjYjM5MTgwIE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBUcmFuc2Zvcm1Db2xvckJsdWUiCisyNzllNjYxMyBNZXJnZSAiZHNwL2NwdTogYWRkIGluY2x1ZGUgZm9yIF94Z2V0YnYoKSB3L01TVlMiCitiNmMwNDI4ZSBkc3AvY3B1OiBhZGQgaW5jbHVkZSBmb3IgX3hnZXRidigpIHcvTVNWUworZDFjNGZmYWUgZ2lmMndlYnA6IE1vdmUgR0lGIGRlY29kaW5nIHJlbGF0ZWQgY29kZSB0byBhIHN1cHBvcnQgbGlicmFyeS4KKzA3YzM5NTU5IE1lcmdlICJBbmltRW5jb2RlciBBUEk6IEFkZCBpbmZvIGluIFJFQURNRS5tdXgiCis3YjE2MTk3MyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBUcmFuc2Zvcm1Db2xvckJsdWUKK2Q3YzRiMDJhIGNwdTogZml4IEFWWDIgZGV0ZWN0aW9uIGZvciBnY2MvY2xhbmcgdGFyZ2V0cworOWQyOTk0NjkgQW5pbUVuY29kZXIgQVBJOiBBZGQgaW5mbyBpbiBSRUFETUUubXV4CitkNTgxYmE0MCBmb2xsb3ctdXA6IGNsZWFuIHVwIFdlYlBSZXNjYWxlclhYWCBkc3AgZnVuY3Rpb24KK2Y4NzQwZjBkIGRzcDogcy9VU0VfSU5UUklOU0lDUy9XRUJQX1VTRV9JTlRSSU5TSUNTLworY2U3M2FiZTAgTWVyZ2UgImludHJvZHVjZSBhIHNlcGFyYXRlIFdlYlBSZXNjYWxlckRzcEluaXQgdG8gaW5pdGlhbGl6ZSBwb2ludGVycyIKK2FiNjZiZWNhIGludHJvZHVjZSBhIHNlcGFyYXRlIFdlYlBSZXNjYWxlckRzcEluaXQgdG8gaW5pdGlhbGl6ZSBwb2ludGVycworMjA1YzdmMjYgZml4IGhhbmRsaW5nIG9mIHplcm8tc2l6ZWQgcGFydGl0aW9uICMwIGNvcm5lciBjYXNlCitjYmNkZDVmZiBNZXJnZSAibW92ZSByZXNjYWxlciBmdW5jdGlvbnMgdG8gcmVzY2FsZXIqIGZpbGVzIGluIHNyYy9kc3AvIgorYmY1ODZlODggTWVyZ2UgY2hhbmdlcyBJMjMwYjM1MzIsSWRmMzA1N2E3Cis2ZGM3OWRjMiBNZXJnZSAiYW5pbV9lbmNvZGU6IGZpeCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MiCisxMWZjZTI1YSBNZXJnZSAiZGVjX25lb246IHJlbW92ZSByZXR1cm5zIGZyb20gdm9pZCBmdW5jdGlvbnMiCitjNGU2M2Y5OSBNYWtlZmlsZS52YzogYWRkIGdpZjJ3ZWJwIHRhcmdldAorNGY0M2QzOGMgZW5hYmxlIE5FT04gZm9yIFdpbmRvd3MgQVJNIGJ1aWxkcworM2Y2NjE1YWMgTWFrZWZpbGUudmM6IGFkZCBydWRpbWVudGFyeSBXaW5kb3dzIEFSTSBzdXBwb3J0CitlN2M1OTU0YyBkZWNfbmVvbjogcmVtb3ZlIHJldHVybnMgZnJvbSB2b2lkIGZ1bmN0aW9ucworZjc5YzE2M2IgYW5pbV9lbmNvZGU6IGZpeCB0eXBlIGNvbnZlcnNpb24gd2FybmluZ3MKKzBmNTRmMWVjIFJlbW92ZSBnaWYyd2VicF91dGlsIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQuCitjYmNiZWRkMCBtb3ZlIHJlc2NhbGVyIGZ1bmN0aW9ucyB0byByZXNjYWxlciogZmlsZXMgaW4gc3JjL2RzcC8KK2FjNzllZDE5IHdlYnBtdXg6IHJlbW92ZSBleHBlcmltZW50YWwgZnJhZ21lbnQgaGFuZGxpbmcKK2U4Njk0ZDRkIG11eDogcmVtb3ZlIGV4cGVyaW1lbnRhbCBGUkdNIHBhcnNpbmcKKzllOTJiNmVhIEFuaW1FbmNvZGVyIEFQSTogT3B0aW1pemUgc2luZ2xlLWZyYW1lIGFuaW1hdGVkIGltYWdlcworYWJiYWUyNzkgTWVyZ2UgIk1vdmUgb3ZlciBnaWYyd2VicCB0byB0aGUgbmV3IEFuaW1FbmNvZGVyIEFQSS4iCithMjhjNGIzNiBNSVBTOiBtb3ZlIFdPUktfQVJPVU5EX0dDQyBkZWZpbmUgdG8gYXBwcm9wcmlhdGUgcGxhY2UKKzAxMmQyYzYwIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9ucyBTU0VBeEIKKzY3NzIwYzhiIE1vdmUgb3ZlciBnaWYyd2VicCB0byB0aGUgbmV3IEFuaW1FbmNvZGVyIEFQSS4KKzkyNDFlY2Y0IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEF2ZXJhZ2UKKzk0MjIyMTFkIE1lcmdlICJUdW5lIEJhY2t3YXJkUmVmZXJlbmNlc0x6NzcgZm9yIGxvd19lZmZvcnQgKG09MCkuIgorZGY0MDA1N2IgTWVyZ2UgIlNwZWVkdXAgVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzIGZvciBsb3cgZWZmb3J0IChtPTApIG1vZGUuIgorZWEwODQ2NmQgVHVuZSBCYWNrd2FyZFJlZmVyZW5jZXNMejc3IGZvciBsb3dfZWZmb3J0IChtPTApLgorYjBiOTczYzMgU3BlZWR1cCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMgZm9yIGxvdyBlZmZvcnQgKG09MCkgbW9kZS4KK2M2ZDMyOTI3IGFyZ2Jfc3NlMjogY29zbWV0aWNzCis2N2Y2MDFjZCBtYWtlIHRoZSAnbGFzdF9jcHVpbmZvX3VzZWQnIHZhcmlhYmxlIG5hbWVzIHVuaXF1ZQorYjk0ODk4NjEgQW5pbUVuY29kZXIgQVBJOiBJbml0IG1ldGhvZCBmb3IgZGVmYXVsdCBvcHRpb25zLgorODU2ZjhlYzEgTWVyZ2UgIkFuaW1FbmNvZGVyIEFQSTogUmVtb3ZlIEFuaW1FbmNvZGVyRnJhbWVPcHRpb25zLiIKK2M1Mzc1MTRkIE1lcmdlICJBbmltRW5jb2RlciBBUEk6IEdlbmVyYXRlQ2FuZGlkYXRlcyBidWdmaXguIgorZGMwY2UwMzkgTWVyZ2UgIkFuaW1FbmNvZGVyIEFQSTogQ29tcHV0ZSBjaGFuZ2UgcmVjdGFuZ2xlIGZvciBmaXJzdCBmcmFtZSB0b28uIgorZjAwYjYzOWIgTWVyZ2UgIkFuaW1FbmNvZGVyIEFQSTogSW4gQXNzZW1ibGUoKSwgYWx3YXlzIHNldCBhbmltYXRpb24gcGFyYW1ldGVycy4iCisyOWVkNzk2YyBNZXJnZSAiQW5pbUVuY29kZXIgbGliIGNsZWFudXA6IHByZXYgdG8gcHJldiBjYW52YXMgbm90IG5lZWRlZC4iCis5ZjBkZDZlNSBNZXJnZSAiV2ViUEFuaW1FbmNvZGVyIEFQSTogSGVhZGVyIGFuZCBpbXBsZW1lbnRhdGlvbiIKKzVlNTZiYmUwIEFuaW1FbmNvZGVyIEFQSTogUmVtb3ZlIEFuaW1FbmNvZGVyRnJhbWVPcHRpb25zLgorYjkwMmMzZWEgQW5pbUVuY29kZXIgQVBJOiBHZW5lcmF0ZUNhbmRpZGF0ZXMgYnVnZml4LgorZWYzYzM5YmIgQW5pbUVuY29kZXIgQVBJOiBDb21wdXRlIGNoYW5nZSByZWN0YW5nbGUgZm9yIGZpcnN0IGZyYW1lIHRvby4KK2VlYzQyM2FiIEFuaW1FbmNvZGVyIEFQSTogSW4gQXNzZW1ibGUoKSwgYWx3YXlzIHNldCBhbmltYXRpb24gcGFyYW1ldGVycy4KK2FlMWMwNDZlIEFuaW1FbmNvZGVyIGxpYiBjbGVhbnVwOiBwcmV2IHRvIHByZXYgY2FudmFzIG5vdCBuZWVkZWQuCis0Yjk5N2FlNCBXZWJQQW5pbUVuY29kZXIgQVBJOiBIZWFkZXIgYW5kIGltcGxlbWVudGF0aW9uCis3MjIwOGJlYyBtb3ZlIGFyZ2JfKi5vIGJ1aWxkIHRhcmdldCB0byBlbmNvZGVyIGxpc3QKKzk1OTIwNTM4IE1lcmdlICJtdWx0aS10aHJlYWQgZml4OiBsb2NrIGVhY2ggZW50cnkgcG9pbnRzIHdpdGggYSBzdGF0aWMgdmFyIgorNGMxYjMwMGEgTWVyZ2UgIlNTRTIgaW1wbGVtZW50YXRpb24gb2YgVlA4UGFja0FSR0IiCitmYmNjMjAwNCBNZXJnZSAiYWRkIC1XZm9ybWF0LW5vbmxpdGVyYWwgYW5kIC1XZm9ybWF0LXNlY3VyaXR5IgorODBkOTUwZDkgYWRkIC1XZm9ybWF0LW5vbmxpdGVyYWwgYW5kIC1XZm9ybWF0LXNlY3VyaXR5CiswNGMyMGU3NSBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gSW50cmE0UHJlZHMiCithNDM3Njk0YSBtdWx0aS10aHJlYWQgZml4OiBsb2NrIGVhY2ggZW50cnkgcG9pbnRzIHdpdGggYSBzdGF0aWMgdmFyCitjYTdmNjBkYiBTU0UyIGltcGxlbWVudGF0aW9uIG9mIFZQOFBhY2tBUkdCCis3MmQ1NzNmNiBzaW1wbGlmeSB0aGUgUGFja0FSR0Igc2lnbmF0dXJlCis0ZTI1ODlmZiBkZW11eDogcmVzdG9yZSBzdHJpY3QgZnJhZ21lbnQgZmxhZyBjaGVjaworNGJhOGUwNzQgTWVyZ2UgIndlYnAtY29udGFpbmVyLXNwZWM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIGZyYWdtZW50cyIKK2U3NTJmMGE2IE1lcmdlICJkZW11eDogcmVtb3ZlIGV4cGVyaW1lbnRhbCBGUkdNIHBhcnNpbmciCitmOGFiYjExMiBNZXJnZSBjaGFuZ2VzIEkxMDllYzRkOSxJNzNmZTc3NDMKK2FlMjE4OGE0IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEludHJhNFByZWRzCisxZjRiODY0MiBtb3ZlIFZQOEVuY0RzcEFSR0JJbml0KCkgY2FsbCBjbG9zZXIgdG8gd2hlcmUgaXQncyBuZWVkZWQKKzE0MTA4ZDc4IGRlY19uZW9uOiBhZGQgREM4dXZOb1RvcCAvIERDOHV2Tm9MZWZ0CitkODM0MGRhNyBkZWNfbmVvbjogYWRkIERDOHV2CithNjZlNjZjNyB3ZWJwLWNvbnRhaW5lci1zcGVjOiByZW1vdmUgcmVmZXJlbmNlcyB0byBmcmFnbWVudHMKKzdjZTg3ODhiIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIE1ha2VBUkdCMzIKKzAxMmU2MjNkIGRlbXV4OiByZW1vdmUgZXhwZXJpbWVudGFsIEZSR00gcGFyc2luZworODdjM2Q1MzEgbWV0aG9kPTA6IERvbid0IGV2YWx1YXRlIGFueSBwcmVkaWN0b3IKKzZmNGZjYjk4IE1lcmdlICJNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBJbXBvcnRSb3ciCisyNDI4NDQ1OSByZXBsYWNlIHVubmVlZGVkIGNhbGxzIHRvIEhpc3RvZ3JhbUNvcHkoKSBieSBzd2FwcworYmRmN2I0MGMgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gSW1wb3J0Um93CitlNjZhOTIyNSBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRXhwb3J0Um93QyIKK2MyNzlmZWMxIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEV4cG9ydFJvd0MKKzMxYTljZjY0IFNwZWVkdXAgV2ViUCBsb3NzbGVzcyBjb21wcmVzc2lvbiBmb3IgbG93IGVmZm9ydCAobT0wKSBtb2RlIHdpdGggZm9sbG93aW5nOiAtIERpc2FibGUgQ3Jvc3MtQ29sb3IgdHJhbnNmb3JtLiAtIEV2YWx1YXRlIHByZWRpY3RvcnMgIzExIChwYWV0aCksICMxMiBhbmQgIzEzIG9ubHkuCis5Mjc1ZDkxYyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBUcnVlTW90aW9uCisyNjEwNmQ2NiBNZXJnZSAiZW5jX25lb246IGZpeCBidWlsZGluZyB3aXRoIG5vbi1YY29kZSBjbGFuZyAoaU9TKSIKKzFjNGUzZWZlIHVucm9sbCB0aGUga0JhbmRzW10gaW5kaXJlY3Rpb24gdG8gcmVtb3ZlIGEgZGVyZWZlcmVuY2UgaW4gR2V0Q29lZmZzKCkKK2EzOTQ2Yjg5IGVuY19uZW9uOiBmaXggYnVpbGRpbmcgd2l0aCBub24tWGNvZGUgY2xhbmcgKGlPUykKKzhlZDljMDBkIE1lcmdlICJzaW1wbGlmeSB0aGUgSGlzdG9ncmFtIHN0cnVjdCwgdG8gb25seSBzdG9yZSBtYXhfdmFsdWUgYW5kIGxhc3RfbnoiCitiYWQ3NzU3MSBzaW1wbGlmeSB0aGUgSGlzdG9ncmFtIHN0cnVjdCwgdG8gb25seSBzdG9yZSBtYXhfdmFsdWUgYW5kIGxhc3RfbnoKKzNjY2EwZGM3IE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIERDTW9kZSBmdW5jdGlvbgorMzdlMzk1ZmQgTUlQUzogZml4IGZ1bmN0aW9ucyB0byB1c2UgZ2VuZXJpYyBCUFMgaXN0ZWFkIG9mIGhhcmRjb2RlZCB2YWx1ZQorOTQ3NWJlZjQgUGlja0Jlc3RVVjogZml4IFZQOENvcHkxNng4IGludm9jYXRpb24KKzQ0MWYyNzNmIE1lcmdlIGNoYW5nZXMgSTU1ZjhkYTUyLElkNzNhMWU5NgorNGEyNzlhNjggY29zbWV0aWNzOiBhZGQgc29tZSBtaXNzaW5nICE9IE5VTEwgY29tcGFyaXNvbnMKKzY2YWQzNzI1IGZhY3Rvcml6ZSBCUFMgZGVmaW5pdGlvbiBpbiBkc3AuaCBhbmQgYWRkIFZQOENvcHkxNng4Cis0MzJlNWI1NSBtYWtlIEFMSUdOX3h4eCBuYW1pbmcgY29uc2lzdGVudAorNTc2MDYwNDcgZW5jb2Rlcjogc3dpdGNoIEJQUyB0byAzMiBpbnN0ZWFkIG9mIDE2CisxYjY2YmJlOSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBmdW5jdGlvbiBUcmFuc2Zvcm1Db2xvcl9DCitjNmQwZjllNyBoaXN0b2dyYW06IGNvc21ldGljcworZjM5OWQzMDcgTWVyZ2UgY2hhbmdlcyBJNmVhYzE3ZTUsSTMyZDJiNTE0Cis5ZGU5MDc0YyBkZWNfbmVvbjogYWRkIFRNOHV2Cis4ZTUxN2VjYSBiaXRfcmVhZGVyL2tWUDhOZXdSYW5nZTogcmFuZ2VfdCAtPiB1aW50OF90CitlMTg1NzEzOSBkc3A6IGluaXRpYWxpemUgVlA4UHJlZENocm9tYTggaW4gVlA4RHNwSW5pdCgpCitlMGM4MDlhZCBNb3ZlIEVudHJvcHkgbWV0aG9kcyB0byBsb3NzbGVzcy5jCithOTZjY2Y4ZiBpb3NidWlsZDogYWRkIHg2NF82NCBzaW11bGF0b3Igc3VwcG9ydAorYTBkZjU1MTAgUmVtb3ZlIGhhbmRsaW5nIGZvciBXRUJQX0hJTlRfR1JBUEgKKzQxM2RmYzBjIE1vdmUgc3RhdGljIG1ldGhvZCBkZWZpbml0aW9uIGJlZm9yZSBpdHMgdXNhZ2UuCiswZjIzNTY2NSBVcGRhdGUgQmFja3dhcmRSZWZzV2l0aExvY2FsQ2FjaGUuCitkNjllMzZlYyBSZW1vdmUgVE9ET3MgZnJvbSBsb3NzbGVzcyBlbmNvZGVyIGNvZGUuCitmZGFhYzhlMCBPcHRtaXplIFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMgTFo3NyByZWZlcmVuY2VzLgorMmYwZTJiYTggTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gU2VsZWN0CithM2U3OWE0NiBNZXJnZSAiV2ViUEVuY29kZTogU3VwcG9ydCBlbmNvZGluZyBzYW1lIHBpYyB0d2ljZSAoZXZlbiBpZiBtb2RpZmllZCkiCitlNGY0ZGRkYiBXZWJQRW5jb2RlOiBTdXBwb3J0IGVuY29kaW5nIHNhbWUgcGljIHR3aWNlIChldmVuIGlmIG1vZGlmaWVkKQorY2JjM2ZiYjQgTWVyZ2UgIlVwZGF0ZWQgVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyBhbmQgY29sb3IgY2FjaGUuIgorOTVhOWJkODUgVXBkYXRlZCBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzIGFuZCBjb2xvciBjYWNoZS4KKzU0ZjJjMTRjIE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEZUcmFuc2Zvcm0KK2FhNDJmNDIzIE1JUFM6IGRzcHIyOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQKKzExYTI1Zjc1IE1lcmdlICJGbGF0dGVuU2ltaWxhckJsb2NrcyBzaG91bGQgb25seSBiZSB0cmllZCB3aGVuIGJsZW5kaW5nIGlzIHBvc3NpYmxlLiIKKzVjY2NkYWRmIEZsYXR0ZW5TaW1pbGFyQmxvY2tzIHNob3VsZCBvbmx5IGJlIHRyaWVkIHdoZW4gYmxlbmRpbmcgaXMgcG9zc2libGUuCis5NWNhNDRhNyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBEaXN0bzR4NAorNDE3MWI2NzIgYmFja3dhcmRfcmVmZXJlbmNlcy5jOiByZWluZGVudCBhZnRlciBjODU4MWIwCitjODU4MWIwNiBPcHRpbWl6ZSBCYWNrd2FyZFJlZmVyZW5jZXMgZm9yIFJMRSBlbmNvZGluZy4KKzU3OThlZWU2IE1JUFM6IGRzcHIyOiB1bmZpbHRlcnMgYnVnZml4IChJZTdiNzM4NzQ3OGE2YjVjM2YwODY5MTYyOGFlMDBmMDU5Y2Y2ZDg5OSkKKzQxNjdhM2Y1IE9wdGltaXplIGJhY2t3YXJkcmVmZXJlbmNlcworZDE4NTU0YzMgTWVyZ2UgIndlYnAvdHlwZXMuaDogdXNlIGlubGluZSBmb3IgY2xhbmcrKy8tc3RkPWMrKzExIgorNzQ4OWIwZTcgZ2lmMndlYnA6IEFkZCAnLW1pbi1zaXplJyBvcHRpb24gdG8gZ2V0IGJlc3QgY29tcHJlc3Npb24uCis3N2JkZGRmMCBTcGVlZCB1cCBCYWNrd2FyZFJlZmVyZW5jZXMKKzY2Mzg3MTBiIHdlYnAvdHlwZXMuaDogdXNlIGlubGluZSBmb3IgY2xhbmcrKy8tc3RkPWMrKzExCithYmYwNDIwNSBFbmFibGUgZW50cm9weSBiYXNlZCBtZXJnZSBoaXN0byBmb3IgKHE8MTAwKQorNTcyMDIyYTMgZmlsdGVyc19taXBzX2RzcF9yMi5jOiBkaXNhYmxlIHVuZmlsdGVycworYTI4ZTIxYjEgTUlQUzogZHNwcjI6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbAorMThkNWExZWYgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZgorODI5YThjMTkgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgSVRyYW5zZm9ybQorYzk0ZWQ0OWUgZ2lmMndlYnA6IFVzZSB0aGUgZGVmYXVsdCBoaW50IGluc3RlYWQgb2YgV0VCUF9ISU5UX0dSQVBILgorNjUzYWNlNTUgSW5jcmVhc2UgdGhlIE1BWF9DT0xPUl9DQUNIRV9CSVRTIGZyb20gOSB0byAxMC4KKzkxOTIyMGM3IENoYW5nZSB0aGUgbG9naWMgYWRqdXN0aW5nIHRoZSBIaXN0b2dyYW0gYml0cy4KKzUzYjA5NmMwIE1lcmdlICJGaXggYnVnIGluIFZQOExDYWxjdWxhdGVFc3RpbWF0ZUZvckNhY2hlU2l6ZS4iCitlOTEyYmQ1NSBGaXggYnVnIGluIFZQOExDYWxjdWxhdGVFc3RpbWF0ZUZvckNhY2hlU2l6ZS4KKzU0MWQ3ODM5IE1lcmdlICJkZWNfbmVvbjogYWRkIFJENCBpbnRyYSBwcmVkaWN0b3IiCitmOGNkMDY3MiBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBhICdsZWdhY3knIFJUTElCQ0ZHIG9wdGlvbiIKKzIyODgxYzk5IGRlY19uZW9uOiBhZGQgUkQ0IGludHJhIHByZWRpY3RvcgorNjEzZDI4MWUgdXBkYXRlIE5FV1MKKzEzMDRlYjM0IE1lcmdlICJkZWNfbmVvbjogREM0OiB1c2UgcGFpci13aXNlIGFkZHMgZm9yIHRvcCByb3ciCiszNGMyMGMwNiBNYWtlZmlsZS52YzogYWRkIGEgJ2xlZ2FjeScgUlRMSUJDRkcgb3B0aW9uCis3MDgzMDA2YiBNZXJnZSAiZHNwL2RlY197bmVvbixzc2UyfTogVkU0OiBub3JtYWxpemUgdmFyaWFibGUgbmFtZXMiCiswZGI5MDMxYyBkc3AvZGVjX3tuZW9uLHNzZTJ9OiBWRTQ6IG5vcm1hbGl6ZSB2YXJpYWJsZSBuYW1lcworYjViYzE1MzAgZGVjX25lb246IERDNDogdXNlIHBhaXItd2lzZSBhZGRzIGZvciB0b3Agcm93Cis1YjkwZDhmZSBVbmlmeSB0aGUgQVBJIGJldHdlZW4gVlA4Qml0V3JpdGVyIGFuZCBWUDhMQml0V3JpdGVyCitmN2FkYTU2MCBNZXJnZSBjaGFuZ2VzIEkyZTA2OTA3YixJYTllZDRjYTYsSTc4MjI4MmZmCis1YmViNmJmMCBNZXJnZSAiZGVjX25lb246IGFkZCBWRTQgaW50cmEgcHJlZGljdG9yIgorZWJhNmNlMDYgZGVjX25lb246IGFkZCBEQzQgaW50cmEgcHJlZGljdG9yCis3OWFiZmJkOSBkZWNfbmVvbjogYWRkIFRNNCBpbnRyYSBwcmVkaWN0b3IKK2ZlMzk1ZjBlIGRlY19uZW9uOiBhZGQgTEQ0IGludHJhIHByZWRpY3RvcgorMzJkZTM4NWUgZGVjX25lb246IGFkZCBWRTQgaW50cmEgcHJlZGljdG9yCis3MjM5NWJhOSBNZXJnZSAiTW9kaWZ5IENvc3RNb2RlbCB0byBhbGxvY2F0ZSBvcHRpbWFsIG1lbW9yeS4iCis2NWU1ZWI4YSBnaWYyd2VicDogU3VwcG9ydCBHSUZfRElTUE9TRV9SRVNUT1JFX1BSRVZJT1VTCitlNGM4MjllZiBnaWYyd2VicDogSGFuZGxlIGZyYW1lcyB3aXRoIG9kZCBvZmZzZXRzICsgZGlzcG9zYWwgdG8gYmFja2dyb3VuZC4KK2MyYjVhMDM5IE1vZGlmeSBDb3N0TW9kZWwgdG8gYWxsb2NhdGUgb3B0aW1hbCBtZW1vcnkuCitiN2EzM2Q3ZSBpbXBsZW1lbnQgVkU0L0hFNC9SRDQvLi4uIGluIFNTRTIKKzk3Yzc2ZjFmIG1ha2UgVlA4UHJlZEx1bWE0W10gbm9uLWNvbnN0IGFuZCBpbml0aWFsaXplIGFycmF5IGluIFZQOERzcEluaXQoKQorMGVhOGM2YzIgTWVyZ2UgIlByaW50UmVnOiBvdXRwdXQgdG8gc3RkZXJyIgorZDdmZjJmOTcgTWVyZ2UgInN0b3B3YXRjaC5oOiBmaXggaW5jbHVkZXMiCitmODVlYzcxMiBQcmludFJlZzogb3V0cHV0IHRvIHN0ZGVycgorNTRlZGJmNjUgc3RvcHdhdGNoLmg6IGZpeCBpbmNsdWRlcworMTM5MTQyZTQgT3B0aW1pemUgQmFja3dhcmRSZWZlcmVuY2VIYXNoQ2hhaW5Gb2xsb3dQYXRoLgorNWYzNmI2OGQgZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuYzogZml4IGluZGVudAorZTBlOTk2MGQgTWVyZ2UgInN5bmMgdmVyc2lvbiBudW1iZXJzIHRvIDAuNC4yIHJlbGVhc2UiCis2NGFjNTE0NCBzeW5jIHZlcnNpb24gbnVtYmVycyB0byAwLjQuMiByZWxlYXNlCitjMjRmODk1NCBTaW1wbGlmeSBhbmQgc3BlZWR1cCBCYWNrd2FyZCByZWZzIGNvbXB1dGF0aW9uLgorZDFjMzU5ZWYgZml4IHNoYXJlZCBvYmplY3QgYnVpbGQgd2l0aCAtZnZpc2liaWxpdHk9aGlkZGVuCithNGMzYTMxYiBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OOiBmaXggZ2NjIGNvbXBhdCB3YXJuaW5nCitmMzU4ZWViOCBhZGQgY29kZSBmb3IgdGVzdGluZyByYW5kb20gaW5jcmVtZW50YWwgZGVjb2RpbmcgaW4gZHdlYnAKKzgwMjQ3MjkxIG1hcmsgc29tZSBpbml0IGZ1bmN0aW9uIGFzIGJlaW5nIHNhZmUgZm9yIHRocmVhZF9zYW5pdGl6ZXIuCis3OWI1YmRiZiBiaXRfcmVhZGVyLmg6IGNvc21ldGljczogZml4IGEgdHlwbworNmM2NzM2ODEgSW1wcm92ZWQgbmVhci1sb3NzbGVzcyBtb2RlLgorMGNlMjdlNzEgZW5jX21pcHMzMjogd29ya2Fyb3VuZCBnY2MtNC45IGJ1ZworYWNhMWI5OGYgZW5jL3ZwOGwuYzogZml4IGluZGVudAorY2EwMDUwMjcgRXZhbHVhdGUgbm9uLXBhbGV0dGUgY29tcHJlc3Npb24gZm9yIHBhbGV0dGUgaW1hZ2UKK2M4YTg3YmI2IEFzc2lnblNlZ21lbnRzOiBxdWlldCAtV2FycmF5LWJvdW5kcyB3YXJuaW5nCiszMmY2N2UzMCBNZXJnZSAiZW5jX25lb246IGluaXRpYWxpemUgdmVjdG9ycyB3L3ZkdXBfbl91MzIiCitmYWJjNjVkYSAxLTMlIGZhc3RlciBlbmNvZGluZyBvcHRpbWl6aW5nIFNTRV9OeE4gZnVuY3Rpb25zCis3NTM0ZDcxNiBlbmNfbmVvbjogaW5pdGlhbGl6ZSB2ZWN0b3JzIHcvdmR1cF9uX3UzMgorNWY4MTM5MTIgTWVyZ2UgIkZpeCByZXR1cm4gY29kZSBvZiBFbmNvZGVJbWFnZUludGVybmFsKCkiCitlMzIxYWJlNCBGaXggcmV0dXJuIGNvZGUgb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpCitmODJjYjA2YSBvcHRpbWl6ZSBwYWxldHRlIG9yZGVyaW5nCitmNTQ1ZmVlZSBkb24ndCBzZXQgdGhlIGFscGhhIHZhbHVlIGZvciBoaXN0b2dyYW0gaW5kZXggaW1hZ2UKKzJkOWIwYTQ0IGFkZCBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4oKSB0byBkc3AKKzFiZDRjMmFkIE1lcmdlICJDaGFuZ2UgRW50cm9weSBiYXNlZCBIaXN0b2dyYW0gQ29tYmluZSBoZXVyaXN0aWMuIgorZTI5NWI4ZjEgTWVyZ2UgImlvc2J1aWxkOiBjbGVhbnVwIgorMWJlNGU3NjAgTWVyZ2UgImlvc2J1aWxkOiBvdXRwdXQgYXV0b2NvbmYgcmVxLiBvbiBmYWlsdXJlIgorZDVlNDk4ZDQgQ2hhbmdlIEVudHJvcHkgYmFzZWQgSGlzdG9ncmFtIENvbWJpbmUgaGV1cmlzdGljLgorNDdhMmQ4ZTEgZml4IE1TVkMgZmxvYXQtPmludCBjb252ZXJzaW9uIHdhcm5pbmcKKzA0MTk1NmY2IGlvc2J1aWxkOiBjbGVhbnVwCis3NjdlYjQwMiBpb3NidWlsZDogb3V0cHV0IGF1dG9jb25mIHJlcS4gb24gZmFpbHVyZQorMzVhZDQ4YjggSGlzdG9IZWFwSW5pdDogY29ycmVjdCBwb3NpdGlvbnMgYWxsb2NhdGlvbiBzaXplCis0NWQ5NjM1ZiBsb3NzbGVzczogZW50cm9weSBjbHVzdGVyaW5nIGZvciBoaWdoIHF1YWxpdGllcy4KK2RjMzdkZjhjIGZpeCB0eXBlIHdhcm5pbmcgZm9yIFZTOV94NjQKKzlmN2Q5ZTZkIGlvc2J1aWxkOiBtYWtlIGlPUyA2IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50CitmZGQ2NTI4YiBSZW1vdmUgdW51c2VkIFZQOExEZWNvZGVyIG1lbWJlciB2YXJpYWJsZQorZWEzYmJhNWEgTWVyZ2UgInJld3JpdGUgRGlzdG80eDQgaW4gZW5jX25lb24uYyB3aXRoIGludHJpbnNpYyIKK2YwNjBkZmM0IGFkZCBsb3NzbGVzcyBpbmNyZW1lbnRhbCBkZWNvZGluZyBzdXBwb3J0CithYjcwNzk0ZCByZXdyaXRlIERpc3RvNHg0IGluIGVuY19uZW9uLmMgd2l0aCBpbnRyaW5zaWMKK2Q0NDcxNjM3IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEZpbHRlckxvb3AyNAorMmFlZjU0ZDQgTWVyZ2UgInByZXBhcmUgVlA4TERlY29kZUltYWdlIGZvciBpbmNyZW1lbnRhbCBkZWNvZGUiCithZWQwZjVhMiBNZXJnZSAiTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgZnVuY3Rpb24gRmlsdGVyTG9vcDI2IgorMjg2MzA2ODUgcHJlcGFyZSBWUDhMRGVjb2RlSW1hZ2UgZm9yIGluY3JlbWVudGFsIGRlY29kZQorMjQ4ZjNhZWQgcmVtb3ZlIGJyLT5lcnJvcl8gZmllbGQKKzQ5ZTE1MDQ0IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIGZ1bmN0aW9uIEZpbHRlckxvb3AyNgorMzgxMjhjYjkgaW9idWlsZC5zaDogb25seSBpbnN0YWxsIC5oIGZpbGVzIGluIEhlYWRlcnMKK2M3OTJkNDEyIFByZW11bHRpcGx5IHdpdGggYWxwaGEgZHVyaW5nIFUvViBkb3duc2FtcGxpbmcKKzBjYzgxMWQ3IGdpZjJ3ZWJwOiBCYWNrZ3JvdW5kIGNvbG9yIGNvcnJlY3Rpb24KK2Q3MTY3ZmY3IEFtZW5kIHRoZSBsb3NzbGVzcyBzcGVjIGFjY29yZGluZyB0byBpc3N1ZSAjMjA1LCAjMjA2IGFuZCAjMjI0CitiOTAxNDE2YiBSZWNvcmQgdGhlIGxvc3NsZXNzIHNpemUgc3RhdHMuCitjZGRkMzM0MCBBZGQgYSBXZWJQRXh0cmFjdEFscGhhIGZ1bmN0aW9uIHRvIGRzcAorMDcxNmE5OGUgZml4IGluZGVudCBhZnRlciBJMDIwNDk0OTkxNzgzNmY3NGMwZWI0YmE1YTdmNDA1MmE0Nzk3ODMzYgorZjljZWQ5NWEgT3B0aW1pemUgbG9zc2xlc3MgZGVjb2RpbmcgZm9yIHRyaXZpYWwoQVJCKSBjb2Rlcy4KKzkyNGZjZmQ5IE1lcmdlICJ3ZWJwbXV4OiBzaW1wbGlmeSBJbml0aWFsaXplQ29uZmlnKCkiCitjMGE0NjJjYSB3ZWJwbXV4OiBzaW1wbGlmeSBJbml0aWFsaXplQ29uZmlnKCkKKzY5ODZiYjVlIHdlYnBtdXg6IGZpeCBpbmRlbnQKK2Y4OWUxNjkwIHdlYnBtdXg6IGZpeCBleGl0IHN0YXR1cyBvbiBudW1lcmljIHZhbHVlIHBhcnNlIGVycm9yCisyMTcyY2I2MiBNZXJnZSAid2VicG11eDogZml4IGxvb3BfY291bnQgcmFuZ2UgY2hlY2siCitlM2IzNDNlYyBNZXJnZSAiZXhhbXBsZXM6IHdhcm4gb24gaW52YWxpZCBudW1lcmljIHBhcmFtZXRlcnMiCiswZTIzYzQ4NyB3ZWJwbXV4OiBmaXggbG9vcF9jb3VudCByYW5nZSBjaGVjaworNjIwODMzOGEgTWVyZ2UgImZpeCBsb29wIGJ1ZyBpbiBEaXNwYXRjaEFscGhhKCkiCitkNTFmM2U0MCBnaWYyd2VicDogSGFuZGxlIGZyYW1lcyB3aXRoIG1pc3NpbmcgIGdyYXBoaWMgY29udHJvbCBleHRlbnNpb24KKzY5MGI0OTFhIGZpeCBsb29wIGJ1ZyBpbiBEaXNwYXRjaEFscGhhKCkKKzk2ZDQzYTg3IGV4YW1wbGVzOiB3YXJuIG9uIGludmFsaWQgbnVtZXJpYyBwYXJhbWV0ZXJzCiszMTAxZjUzNyBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBUcmFuc2Zvcm1PbmUKK2E2YmI5YjE3IFNTRTIgZm9yIGludmVyc2UgTXVsdChBUkdCKVJvdyBhbmQgQXBwbHlBbHBoYU11bHRpcGx5CitkODRhOGZmZCBSZW1vdmUgZGVmYXVsdCBpbml0aWFsaXphdGlvbiBvZiBkZWNvZGVyIHN0YXR1cy4KK2JlNzBiODZjIGNvbmZpZ3VyZTogc2ltcGxpZnkgbGlicG5nLWNvbmZpZyBpbnZvY2F0aW9uCitlMGE5OTMyMSBSZWN0aWZ5IGJ1ZyBpbiBsb3NzbGVzcyBpbmNyZW1lbnRhbCBkZWNvZGluZy4KK2UyNTAyYTk3IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb24gZm9yIFRyYW5zZm9ybUFDMworMjRlMTA3MmEgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgVHJhbnNmb3JtREMKK2MwZTg0ZGY4IE1lcmdlICJTbGlnaHRseSBmYXN0ZXIgbG9zc2xlc3MgZGVjb2RpbmcgKDElKSIKKzhkZDI4YmI1IFNsaWdodGx5IGZhc3RlciBsb3NzbGVzcyBkZWNvZGluZyAoMSUpCitmMDEwMzU5NSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybXMKK2QzMjQyYWVlIG1ha2UgVlA4TFNldEJpdFBvcygpIHNldCBici0+ZW9zXyBmbGFnCithOWRlY2I1NSBMb3NzbGVzcyBkZWNvZGluZzogZml4IGVvc18gZmxhZyBjb25kaXRpb24KKzNmZWE2YTI4IGZpeCBlcnJvbmVvdXMgZGVjLT5zdGF0dXNfIHNldHRpbmcKKzgwYjgwOTlmIE1JUFM6IGRzcHIyOiBhZGQgc29tZSBzcGVjaWZpYyBtaXBzIGNvZGUgdG8gY29tbWl0IEkyYzNmMmIxMmY4ZGYxNWI3ODVmYWQ1YTljNTYzMTZlOTU0YWUwYzUzCitlNTY0MDYyNSBNZXJnZSAiZnVydGhlciByZWZpbmUgdGhlIENPUFlfUEFUVEVSTiBvcHRpbSBmb3IgRGVjb2RlQWxwaGEiCis4NTQ1MDlmZSBlbmMvaGlzdG9ncmFtLmM6IHJlaW5kZW50IGFmdGVyIGY0MDU5ZDAKKzM0NDIxOTY0IE1lcmdlICJ+My01JSBmYXN0ZXIgZW5jb2Rpbmcgb3B0aW1pemluZyBQaWNrQmVzdEludHJhKigpIgorODY1MDY5YzEgZnVydGhlciByZWZpbmUgdGhlIENPUFlfUEFUVEVSTiBvcHRpbSBmb3IgRGVjb2RlQWxwaGEKK2E1OTU2MjI4IGFkZGVkIEMtbGV2ZWwgb3B0aW1pemF0aW9uIGZvciBEZWNvZGVBbHBoYURhdGEgZnVuY3Rpb24KKzE4N2QzNzlkIGFkZCBhIGZhbGxiYWNrIHRvIEFMUEhBX05PX0NPTVBSRVNTSU9OCithNDhhMmQ3NiB+My01JSBmYXN0ZXIgZW5jb2Rpbmcgb3B0aW1pemluZyBQaWNrQmVzdEludHJhKigpCithNjE0MDE5NCBFeFV0aWxSZWFkRnJvbVN0ZGluOiAod2luZG93cykgb3BlbiBzdGRpbiBpbiBiaW4gbW9kZQorZTgwZWFiMWYgd2VicG11eDogKHdpbmRvd3MpIG9wZW4gc3Rkb3V0IGluIGJpbmFyeSBtb2RlCitlOWJmYjExNiBjd2VicDogKHdpbmRvd3MpIG9wZW4gc3Rkb3V0IGluIGJpbmFyeSBtb2RlCis1OTI3ZTE1YiBleGFtcGxlX3V0aWw6IGFkZCBFeFV0aWxTZXRCaW5hcnlNb2RlCiszMGYzYjc1YiB3ZWJwbXV4IG1hbiBwYWdlOiBDbGFyaWZ5IHNvbWUgdGl0bGUsIGRlc2NyaXB0aW9ucyBhbmQgZXhhbXBsZXMKKzc3ZDRjN2UzIGFkZHJlc3MgY29zbWV0aWMgY29tbWVudHMgZnJvbSBwYXRjaCAjNzEzODAKK2Y3NWRmYmYyIFNwZWVkIHVwIEh1ZmZtYW4gZGVjb2RpbmcgZm9yIGxvc3NsZXNzCis2MzdiMzg4OCBkc3AvbG9zc2xlc3M6IHdvcmthcm91bmQgZ2NjLTQuOSBidWcgb24gYXJtCis4MzIzYTkwMyBkc3AuaDogY29sbGVjdCBnY2MvY2xhbmcgdmVyc2lvbiB0ZXN0IG1hY3JvcworZTZjNGI1MmYgbW92ZSBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgV2ViUFlVVjQ0NENvbnZlcnRlcnNbXSB0byB0aGUgSW5pdCBmdW5jdGlvbi4KKzQ5OTExZDRkIE1lcmdlICJmaXggaW5kZW50YXRpb24iCitmNDA1OWQwYyBDb2RlIGNsZWFudXAgZm9yIEhpc3RvZ3JhbVJlbWFwLgorZTYzMmIwOTIgZml4IGluZGVudGF0aW9uCitmNWMwNGQ2NCBNZXJnZSAiYWRkIGEgRGlzcGF0Y2hBbHBoYSgpIGZvciBTU0UyIHRoYXQgaGFuZGxlcyA4IHBpeGVscyBhdCBhIHRpbWUiCitmYzk4ZWRkOSBhZGQgYSBEaXNwYXRjaEFscGhhKCkgZm9yIFNTRTIgdGhhdCBoYW5kbGVzIDggcGl4ZWxzIGF0IGEgdGltZQorNzNkMzYxZGQgaW50cm9kdWNlIFZQOEVuY1F1YW50aXplMkJsb2NrcyB0byBxdWFudGl6ZSB0d28gYmxvY2tzIGF0IGEgdGltZQorMGIyMWMzMGIgTUlQUzogZHNwcjI6IGFkZGVkIG9wdGltaXphdGlvbiBmb3IgRW1pdEFscGhhUkdCCis5NTNhY2Q1NiBlbmNfbmVvbjogZW5hYmxlIFF1YW50aXplQmxvY2sgZm9yIGFhcmNoNjQKK2Y0YWUxNDM3IE1JUFM6IG1pcHMzMjogY29kZSByZWJhc2UKKzU2OTc3MTU0IE1JUFM6IGRzcHIyOiBhZGRlZCBvcHRpbWl6YXRpb25zIGZvciBWUDhZdXZUbyoKKzI1MjNhYTczIFNtYXJ0UkdCWVVWOiBmaXggb2RkLXdpZHRoIHByb2JsZW0gd2l0aCBwaXhlbCByZXBsaWNhdGlvbgorZWU1MmRjNGUgZml4IHNvbWUgTVNWQzY0IHdhcm5pbmcgYWJvdXQgZmxvYXQgY29udmVyc2lvbgorM2ZjYTg1MWEgY3B1OiBjaGVjayBmb3IgX01TQ19WRVIgYmVmb3JlIHVzaW5nIG1zdmMgaW5saW5lIGFzbQorZTJhODNkNzEgZmFzdGVyIFJHQi0+WVVWIGNvbnZlcnNpb24gZnVuY3Rpb24gKH43JSBzcGVlZHVwKQorZGUyZDAzZTEgTWVyZ2UgIkFkZCBzbWFydCBSR0ItPllVViBjb252ZXJzaW9uIG9wdGlvbiAtcHJlIDQiCiszZmM0YzUzOSBBZGQgc21hcnQgUkdCLT5ZVVYgY29udmVyc2lvbiBvcHRpb24gLXByZSA0CitiNGRjNDA2OSBNSVBTOiBkc3ByMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciAodW4pZmlsdGVycworMTM3ZTYwOTAgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIHdvcmsgYXJvdW5kIGZvciBnY2MtNC45IGFhcmNoNjQgYnVnIgorYjYxYzljZWMgTUlQUzogZHNwcjI6IE9wdGltaXphdGlvbiBvZiBzb21lIHNpbXBsZSBwb2ludC1zYW1wbGluZyBmdW5jdGlvbnMKK2UyYjhjZWMwIGNvbmZpZ3VyZTogYWRkIHdvcmsgYXJvdW5kIGZvciBnY2MtNC45IGFhcmNoNjQgYnVnCis5OGM1NDEwNyBNSVBTOiBtaXBzMzJyMjogYWRkZWQgb3B0aW1pemF0aW9uIGZvciBCU3dhcDMyCitkYWI3MDJiMyBVcGRhdGUgUEFURU5UUyB0byByZWZsZWN0IHMvVlA4L1dlYk0vZworYjU2NGY3YzcgTWVyZ2UgIk1JUFM6IGRldGVjdCBtaXBzMzJyNiBhbmQgZGlzYWJsZSBtaXBzMzJyMSBjb2RlIgorYjdlNWE1YzQgTUlQUzogZGV0ZWN0IG1pcHMzMnI2IGFuZCBkaXNhYmxlIG1pcHMzMnIxIGNvZGUKKzYzYzJmYzAyIENvcnJlY3RseSB1c2UgdGhlIEFDX0NBTk9OSUNBTF8qIG1hY3JvcworYmIwNzAyMmIgTWVyZ2UgImNvc21ldGljcyIKK2UzMDBjOWQ4IGNvc21ldGljcworMGU1MTllZWEgTWVyZ2UgImNvc21ldGljczogcmVtb3ZlIHNvbWUgZXh0cmFuZW91cyAnZXh0ZXJuJ3MiCiszZWYwZjA4YSBNZXJnZSAidnA4ZW5jaS5oOiBjb3NtZXRpY3M6IGZpeCAnKicgcGxhY2VtZW50IgorNGM2ZGRlMzcgYml0X3dyaXRlcjogY29zbWV0aWNzOiByZW5hbWUga0ZsdXNoKCkgLT4gRmx1c2goKQorZjdiNGM0OGIgY29zbWV0aWNzOiByZW1vdmUgc29tZSBleHRyYW5lb3VzICdleHRlcm4ncworYjQ3ZmIwMGEgdnA4ZW5jaS5oOiBjb3NtZXRpY3M6IGZpeCAnKicgcGxhY2VtZW50CitiNWEzNmNjOSBhZGQgLW5lYXJfbG9zc2xlc3MgWzAuLjEwMF0gZXhwZXJpbWVudGFsIG9wdGlvbgorMDUyNGQ5ZTUgZHNwOiBkZXRlY3QgbWlwczY0ICYgZGlzYWJsZSBtaXBzMzIgY29kZQorZDM0ODVkOTYgY3dlYnAuMTogZml4IHF1YWxpdHkgZGVzY3JpcHRpb24gcGxhY2VtZW50CisyOWE5ZmUyMiBNZXJnZSB0YWcgJ3YwLjQuMScKKzhhZjI3NzE4IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNC4xLCBvcmlnaW4vMC40LjEsIDAuNC4xKQorZTA5ZTlmZjYgUmVjb3JkICYgbG9nIHRoZSBpbWFnZSBwcmUtcHJvY2Vzc2luZyB0aW1lLgorZjU5YzBiNGIgaW9zYnVpbGQuc2g6IHNwZWNpZnkgb3B0aW1pemF0aW9uIGZsYWdzCis4ZDM0ZWEzZSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjQuMS1yYzEpCitkYmMzZGE2NiBtYWtlZmlsZS51bml4OiBhZGQgdndlYnAuMSB0byB0aGUgZGlzdCB0YXJnZXQKKzg5YTdjODNjIHVwZGF0ZSBDaGFuZ2VMb2cKK2ZmZTY3ZWU5IE1lcmdlICJ1cGRhdGUgTkVXUyBmb3IgdGhlIG5leHQgcmVsZWFzZSIgaW50byAwLjQuMQorMmRlZjFmZTYgZ2lmMndlYnA6IGR1c3QgdXAgdGhlIGhlbHAgbWVzc2FnZQorZmI2NjhkNzggcmVtb3ZlIC1ub2FscGhhZGl0aGVyIG9wdGlvbiBmcm9tIFJFQURNRS92d2VicC4xCitlNDlmNjkzYiB1cGRhdGUgTkVXUyBmb3IgdGhlIG5leHQgcmVsZWFzZQorY2QwMTM1ODAgTWVyZ2UgInVwZGF0ZSBBVVRIT1JTIiBpbnRvIDAuNC4xCisyNjhkMDFlYiB1cGRhdGUgQVVUSE9SUworODUyMTNiOWIgYnVtcCB2ZXJzaW9uIHRvIDAuNC4xCis2OTVmODBhZSBNZXJnZSAicmVzdG9yZSBtdXggQVBJIGNvbXBhdGliaWxpdHkiIGludG8gMC40LjEKKzg2MmQyOTZjIHJlc3RvcmUgbXV4IEFQSSBjb21wYXRpYmlsaXR5Cis4ZjZmOGM1ZCByZW1vdmUgdGhlICFXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTiB0d2VhayBpbiBQdXQ4eDh1dgorZDcxM2E2OTYgTWVyZ2UgY2hhbmdlcyBJZjRkZWJjMTUsSTQzN2E1ZDVmIGludG8gMC40LjEKK2MyZmM1MmU0IHJlc3RvcmUgZW5jb2RlIEFQSSBjb21wYXRpYmlsaXR5Cis3OTMzNjhlOCByZXN0b3JlIGRlY29kZSBBUEkgY29tcGF0aWJpbGl0eQorYjg5ODRmMzEgZ2lmMndlYnA6IGZpeCBjb21waWxlIHdpdGggZ2lmbGliIDUuMS4wCisyMjJmOWIxYSBnaWYyd2VicDogc2ltcGxpZnkgZ2lmbGliIHZlcnNpb24gY2hlY2tpbmcKK2QyY2M2MWI3IEV4dGVuZCBNYWtlQVJHQjMyKCkgdG8gYWNjZXB0IEFscGhhIGNoYW5uZWwuCis0NTk1YjYyYiBNZXJnZSAidXNlIGV4cGxpY2l0IHNpemUgb2Yga0Vycm9yTWVzc2FnZXNbXSBhcnJheXMiCisxNTdkZTAxNSBNZXJnZSAiQWN0dWF0ZSBtZW1vcnkgc3RhdHMgZm9yIFBSSU5UX01FTU9SWV9JTkZPIgorZmJkYTJmNDkgSlBFRyBkZWNvZGVyOiBkZWxheSBjb252ZXJzaW9uIHRvIFlVViB0byBXZWJQRW5jb2RlKCkgY2FsbAorMGI3NDdiMWIgdXNlIGV4cGxpY2l0IHNpemUgb2Yga0Vycm9yTWVzc2FnZXNbXSBhcnJheXMKKzMzOThkODFhIEFjdHVhdGUgbWVtb3J5IHN0YXRzIGZvciBQUklOVF9NRU1PUllfSU5GTworNmYzMjAyYmUgTWVyZ2UgIm1vdmUgV2ViUFBpY3R1cmVJbml0IHRvIHBpY3R1cmUuYyIKKzZjMzQ3YmJiIG1vdmUgV2ViUFBpY3R1cmVJbml0IHRvIHBpY3R1cmUuYworZmIzYWNmMTkgZml4IGNvbmZpZ3VyZSBtZXNzYWdlIGZvciBtdWx0aS10aHJlYWQKKzQwYjA4NmY3IGNvbmZpZ3VyZTogY2hlY2sgZm9yIF9iZWdpbnRocmVhZGV4CisxNTQ5ZDYyMCByZW9yZGVyIHRoZSBZVVZBLT5BUkdCIGFuZCBBUkdCLT5ZVVZBIGZ1bmN0aW9ucyBjb3JyZWN0bHkKK2M2NDYxYmZkIE1lcmdlICJleHRyYWN0IGNvbG9yc3BhY2UgY29kZSBmcm9tIHBpY3R1cmUuYyBpbnRvIHBpY3R1cmVfY3NwLmMiCis3MzZmMmExNyBleHRyYWN0IGNvbG9yc3BhY2UgY29kZSBmcm9tIHBpY3R1cmUuYyBpbnRvIHBpY3R1cmVfY3NwLmMKKzY0NWRhYTAzIE1lcmdlICJjb25maWd1cmU6IGNoZWNrIGZvciAtV2Zvcm1hdC1zZWN1cml0eSIKK2FiYWZlZDg2IGNvbmZpZ3VyZTogY2hlY2sgZm9yIC1XZm9ybWF0LXNlY3VyaXR5CitmYmFkYjQ4MCBzcGxpdCBtb25vbGl0aGljIHBpY3R1cmUuYyBpbnRvIHBpY3R1cmVfe3Rvb2xzLHBzbnIscmVzY2FsZX0uYworYzc2ZjA3ZWMgZGVjX25lb24vVHJhbnNmb3JtQUMzOiBpbml0aWFsaXplIHZlY3RvciB3L3ZjcmVhdGUKK2JiNGZjMDUxIGdpZjJ3ZWJwOiBBbGxvdyBzaW5nbGUtZnJhbWUgYW5pbWF0aW9ucworNDZmZDQ0YzEgdGhyZWFkOiByZW1vdmUgaGFybWxlc3MgcmFjZSBvbiBzdGF0dXNfIGluIEVuZCgpCis1YTFhNzI2NCBNZXJnZSAiY29uZmlndXJlOiBjaGVjayBmb3IgX19idWlsdGluX2Jzd2FwWFgoKSIKKzY3ODE0MjNiIGNvbmZpZ3VyZTogY2hlY2sgZm9yIF9fYnVpbHRpbl9ic3dhcFhYKCkKKzY0NTBjNDhkIGNvbmZpZ3VyZTogZml4IGlPUyBidWlsZHMKKzY0MjJlNjgzIFZQOExGaWxsQml0V2luZG93OiBlbmFibGUgZmFzdCBwYXRoIGZvciAzMi1iaXQgYnVpbGRzCis0ZjdmNTJiMiBWUDhMRmlsbEJpdFdpbmRvdzogcmVzcGVjdCBXRUJQX0ZPUkNFX0FMSUdORUQKK2U0NThiYWRjIGVuZGlhbl9pbmwuaDogaW1wbGVtZW50IGh0b2xlWFggd2l0aCBCU3dhcFhYCitmMjY2NGQxYSBlbmRpYW5faW5sLmg6IGFkZCBCU3dhcDE2Cis2ZmJmNTM0NSBNZXJnZSAiY29uZmlndXJlOiBhZGQgLS1lbmFibGUtYWxpZ25lZCIKK2RjMGY0NzlkIGNvbmZpZ3VyZTogYWRkIC0tZW5hYmxlLWFsaWduZWQKKzljYzY5ZTJiIE1lcmdlICJjb25maWd1cmU6IHN1cHBvcnQgV0lDICsgT3BlbkdMIHVuZGVyIG1pbmd3NjQiCisyNTdhZGZiMCByZW1vdmUgZXhwZXJpbWVudGFsIFlVVjQ0NCBZVVY0MjIgYW5kIFlVVjQwMCBjb2RlCisxMGY0MjU3YyBjb25maWd1cmU6IHN1cHBvcnQgV0lDICsgT3BlbkdMIHVuZGVyIG1pbmd3NjQKKzM4MGNjYTRmIGNvbmZpZ3VyZS5hYzogYWRkIEFDX0NfQklHRU5ESUFOCitlZTcwYTkwMSBlbmRpYW5faW5sLmg6IGFkZCBCU3dhcDY0Cis0Nzc3OWQ0NiBlbmRpYW5faW5sLmg6IGFkZCBCU3dhcDMyCitkNTEwNGIxZiB1dGlsczogYWRkIGVuZGlhbl9pbmwuaAorNThhYjYyMjQgTWVyZ2UgIm1ha2UgYWxwaGEtZGV0ZWN0aW9uIGxvb3AgaW4gSXNLZXlGcmFtZSgpIGluIGdvb2QgeC95IG9yZGVyIgorOWQ1NjI5MDIgbWFrZSBhbHBoYS1kZXRlY3Rpb24gbG9vcCBpbiBJc0tleUZyYW1lKCkgaW4gZ29vZCB4L3kgb3JkZXIKKzUxNjk3MWIxIGxvc3NsZXNzOiBSZW1vdmUgdW5hbGlnbmVkIHJlYWQgd2FybmluZworYjhiNTk2ZjYgTWVyZ2UgImNvbmZpZ3VyZS5hYzogYWRkIGFuIGF1dG9jb25mIHZlcnNpb24gcHJlcmVxdWlzaXRlIgorMzRiMDJmOGMgY29uZmlndXJlLmFjOiBhZGQgYW4gYXV0b2NvbmYgdmVyc2lvbiBwcmVyZXF1aXNpdGUKK2U1OWY1MzYwIG5lb246IG5vcm1hbGl6ZSB2ZHVwX25fKiB1c2FnZQorNmVlNzE2MGQgTWVyZ2UgY2hhbmdlcyBJMGRhN2IzZDMsSWRhZDJmMjc4LEk0YWNjYzMwNQorYWJjMDJmMjQgTWVyZ2UgImZpeCAodW5jb21waWxlZCkgdHlwbyIKK2JjMDM2NzBmIG5lb246IGFkZCBJTklUX1ZFQ1RPUjQKKzZjMWM2MzJiIG5lb246IGFkZCBJTklUX1ZFQ1RPUjMKK2RjNzY4N2U1IG5lb246IGFkZCBJTklUX1ZFQ1RPUjIKKzQ1MzZlN2M0IGFkZCBXZWJQTXV4U2V0Q2FudmFzU2l6ZSgpIHRvIHRoZSBtdXggQVBJCis4MjRlYWIxMCBmaXggKHVuY29tcGlsZWQpIHR5cG8KKzFmM2U1ZjFlIHJlbW92ZSB1bnVzZWQgJ3NoaWZ0JyBhcmd1bWVudCBhbmQgUUZJWDIgZGVmaW5lCis4ZTg2NzA1MSBNZXJnZSAiVlA4TG9hZE5ld0J5dGVzOiB1c2UgX19idWlsdGluX2Jzd2FwMzIgaWYgYXZhaWxhYmxlIgorMWI2YTI2MzUgTWVyZ2UgIkZpeCBoYW5kbGluZyBvZiB3ZWlyZCBHSUYgd2l0aCBjYW52YXMgZGltZW5zaW9uIDB4MCIKKzFkYTNkNDYxIFZQOExvYWROZXdCeXRlczogdXNlIF9fYnVpbHRpbl9ic3dhcDMyIGlmIGF2YWlsYWJsZQorMTU4MmU0MDIgRml4IGhhbmRsaW5nIG9mIHdlaXJkIEdJRiB3aXRoIGNhbnZhcyBkaW1lbnNpb24gMHgwCitiODgxMWRhYyBNZXJnZSAicmVuYW1lIGludGVyZmFjZSAtPiB3aW50ZXJmYWNlIgorZGI4YjhiNWYgRml4IGxvZ2ljIGluIHRoZSBHSUYgTE9PUC1kZXRlY3Rpb24gcGFyc2luZworMjVhYWRkYzggcmVuYW1lIGludGVyZmFjZSAtPiB3aW50ZXJmYWNlCis1NTg0ZDlkMiBtYWtlIFdlYlBTZXRXb3JrZXJJbnRlcmZhY2UoKSBjaGVjayBpdHMgYXJndW1lbnRzCithOWVmN2VmOSBNZXJnZSAiY29zbWV0aWNzOiB1cGRhdGUgdGhyZWFkLmggY29tbWVudHMiCitjNmFmOTk5MSBNZXJnZSAiZHVzdCB1cCB0aGUgaGVscCBtZXNzYWdlIgorMGE4Yjg4NjMgZHVzdCB1cCB0aGUgaGVscCBtZXNzYWdlCithOWNmMzE5MSBjb3NtZXRpY3M6IHVwZGF0ZSB0aHJlYWQuaCBjb21tZW50cworMjdiZmVlZTQgUXVhbnRpemVCbG9jayBTU0UyIE9wdGltaXphdGlvbjoKKzJiYzBkYzNlIE1lcmdlICJ3ZWJwbXV4OiB3YXJuIHdoZW4gb2RkIGZyYW1lIG9mZnNldHMgYXJlIHVzZWQiCiszMTE0ZWJlNCBNZXJnZSBjaGFuZ2VzIElkOGVkZDNjMSxJZDQxOGViOTYsSWRlMDVlM2JlCitjMDcyNjYzNCB3ZWJwbXV4OiB3YXJuIHdoZW4gb2RkIGZyYW1lIG9mZnNldHMgYXJlIHVzZWQKK2M1YzZiNDA4IE1lcmdlICJhZGQgYWxwaGEgZGl0aGVyaW5nIGZvciBsb3NzeSIKK2Q1MTQ2Nzg0IGV4YW1wbGVzL0FuZHJvaWQubWs6IGFkZCBjd2VicAorY2EwZmE3YzcgQW5kcm9pZC5tazogbW92ZSBkd2VicCB0byBleGFtcGxlcy9BbmRyb2lkLm1rCis3M2Q4ZmNhMCBBbmRyb2lkLm1rOiBhZGQgRU5BQkxFX1NIQVJFRCBmbGFnCis2ZTkzMzE3ZiBtdXhyZWFkOiBmaXggb3V0IG9mIGJvdW5kcyByZWFkCis4YjBmNmE0OCBNYWtlZmlsZS52YzogZml4IENGTEFHUyBhc3NpZ25tZW50IHcvSEFWRV9BVlgyPTEKK2JiZTMyZGYxIGFkZCBhbHBoYSBkaXRoZXJpbmcgZm9yIGxvc3N5Cis3OTAyMDc2NyBNZXJnZSAibWFrZSBlcnJvci1jb2RlIHJlcG9ydGluZyBjb25zaXN0ZW50IHVwb24gbWFsbG9jIGZhaWx1cmUiCis3N2JmNDQxMCBtYWtlIGVycm9yLWNvZGUgcmVwb3J0aW5nIGNvbnNpc3RlbnQgdXBvbiBtYWxsb2MgZmFpbHVyZQorN2E5M2MwMDAgKiovTWFrZWZpbGUuYW06IHJlbW92ZSB1bnVzZWQgQU1fQ1BQRkxBR1MKKzI0ZTMwODA1IEFkZCBhbiBpbnRlcmZhY2UgYWJzdHJhY3Rpb24gdG8gdGhlIFdlYlAgd29ya2VyIHRocmVhZCBpbXBsZW1lbnRhdGlvbgorZDZjZDYzNTggTWVyZ2UgImZpeCBvcmlnX3JlY3Q9PU5VTEwgY2FzZSIKKzJiZmQxZmZhIGZpeCBvcmlnX3JlY3Q9PU5VTEwgY2FzZQorMDU5ZTIxYzEgTWVyZ2UgImNvbmZpZ3VyZTogbW92ZSBjb25maWcuaCB0byBzcmMvd2VicC9jb25maWcuaCIKK2YwNWZlMDA2IHByb3Blcmx5IHJlcG9ydCBiYWNrIGVuY29kaW5nIGVycm9yIGNvZGUgaW4gV2ViUEZyYW1lQ2FjaGVBZGRGcmFtZSgpCiszMmIzMTM3OSBjb25maWd1cmU6IG1vdmUgY29uZmlnLmggdG8gc3JjL3dlYnAvY29uZmlnLmgKKzkwMDkwZDk5IE1lcmdlIGNoYW5nZXMgSTdjNjc1ZTUxLEk4NGY3ZDc4NQorYWU3NjYxYjMgbWFrZWZpbGVzOiBkZWZpbmUgV0VCUF9IQVZFX0FWWDIgd2hlbiBhcHByb3ByaWF0ZQorNjlmY2UyZWEgcmVtb3ZlIHRoZSBzcGVjaWFsIGNhc2luZyBmb3IgcmVzLT5maXJzdCBpbiBWUDhTZXRSZXNpZHVhbENvZWZmcworNmU2MWEzYTkgY29uZmlndXJlOiB0ZXN0IGZvciAtbXNzZTIKK2I5ZDJlZmM2IHJlbmFtZSB1cHNhbXBsaW5nX21pcHMzMi5jIHRvIHl1dl9taXBzMzIuYworYmRmZWViYWEgZHNwL3l1djogbW92ZSBzc2UyIGZ1bmN0aW9ucyB0byB5dXZfc3NlMi5jCis0NmIzMmU4NiBNZXJnZSAiY29uZmlndXJlOiBzZXQgV0VCUF9IQVZFX0FWWDIgd2hlbiBhdmFpbGFibGUiCis4ODMwNWRiNCBNZXJnZSAiVlA4UmFuZG9tQml0czI6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyIKKzczZmVlODhjIFZQOFJhbmRvbUJpdHMyOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cKK2RiNDg2MGIzIGVuY19zc2UyOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cKKzNmZGFmNGQyIE1lcmdlICJyZWFsIGZpeCBmb3IgbG9uZ2ptcCB3YXJuaW5nIgorMzg1ZTMzNDAgcmVhbCBmaXggZm9yIGxvbmdqbXAgd2FybmluZworMjMwYTA1NTUgY29uZmlndXJlOiBzZXQgV0VCUF9IQVZFX0FWWDIgd2hlbiBhdmFpbGFibGUKK2EyYWM4YTQyIHJlc3RvcmUgb3JpZ2luYWwgdmFsdWVfL3JhbmdlXyBmaWVsZCBvcmRlcgorNWUyZWU1NmYgTWVyZ2UgInJlbW92ZSBsaWJ3ZWJwZHNwZGVjb2RlIGRlcCBvbiBsaWJ3ZWJwZHNwX2F2eDIiCis2MTM2MmRiNSByZW1vdmUgbGlid2VicGRzcGRlY29kZSBkZXAgb24gbGlid2VicGRzcF9hdngyCis0MmM0NDdhZSBNZXJnZSAibG9zc3kgYml0LXJlYWRlciBjbGVhbi11cDoiCis0NzlmZmQ4YiBNZXJnZSAicmVtb3ZlIHVudXNlZCAjaW5jbHVkZSdzIgorOTc1NGQzOWEgTWVyZ2UgInN0cm9uZyBmaWx0ZXJpbmcgc3BlZWQtdXAgKH4yLTMlIHg4NiwgfjEtMiUgZm9yIE5FT04pIgorMTU4YWZmOWIgcmVtb3ZlIHVudXNlZCAjaW5jbHVkZSdzCiswOTU0NWVlYSBsb3NzeSBiaXQtcmVhZGVyIGNsZWFuLXVwOgorZWE4YjBhMTcgc3Ryb25nIGZpbHRlcmluZyBzcGVlZC11cCAofjItMyUgeDg2LCB+MS0yJSBmb3IgTkVPTikKKzY2NzlmODk5IE9wdGltaXplIFZQOFNldFJlc2lkdWFsQ29lZmZzLgorYWM1OTFjZjIgZml4IGZvciBnY2MtNC45IHdhcm5pbmdzIGFib3V0IGxvbmdqbXAgKyBsb2NhbCB2YXJpYWJsZXMKKzRkZmE4NmIyIGRzcC9jcHU6IE5hQ2wgaGFzIG5vIHN1cHBvcnQgZm9yIHhnZXRidgorNGMzOTg2OTkgTWVyZ2UgImN3ZWJwOiBmYWxsYmFjayB0byBuYXRpdmUgd2VicCBkZWNvZGUgaW4gV0lDIGJ1aWxkcyIKKzMzYWE0OTdlIE1lcmdlICJjd2VicDogYWRkIHNvbWUgbWlzc2luZyBuZXdsaW5lcyBpbiBsb25naGVscCBvdXRwdXQiCitjOWIzNDBhMiBmaXggbWlzc2luZyBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZyBjYWxsIGZvciBwcmVtdWx0aXBsaWVkIGNvbG9yc3BhY2Ugb3V0cHV0Cis1Nzg5N2JhZSBNZXJnZSAibG9zc2xlc3NfbmVvbjogdXNlIHZjcmVhdGVfKigpIHdoZXJlIGFwcHJvcHJpYXRlIgorNmFhNDc3N2IgTWVyZ2UgIihlbmN8ZGVjKV9uZW9uOiB1c2UgdmNyZWF0ZV8qKCkgd2hlcmUgYXBwcm9wcmlhdGUiCiswZDM0NmU0MSBBbHdheXMgcmVpbml0IFZQOFRyYW5zZm9ybVdIVCBpbnN0ZWFkIG9mIGhhcmQtY29kaW5nCis3ZDAzOWZjMyBjd2VicDogZmFsbGJhY2sgdG8gbmF0aXZlIHdlYnAgZGVjb2RlIGluIFdJQyBidWlsZHMKK2Q0NzFmNDI0IGN3ZWJwOiBhZGQgc29tZSBtaXNzaW5nIG5ld2xpbmVzIGluIGxvbmdoZWxwIG91dHB1dAorYmYwZTAwMzAgbG9zc2xlc3NfbmVvbjogdXNlIHZjcmVhdGVfKigpIHdoZXJlIGFwcHJvcHJpYXRlCis5MjUxYzJmNiAoZW5jfGRlYylfbmVvbjogdXNlIHZjcmVhdGVfKigpIHdoZXJlIGFwcHJvcHJpYXRlCiszOTliOTE2ZCBsb3NzeSBkZWNvZGluZzogY29ycmVjdCBhbHBoYS1yZXNjYWxpbmcgZm9yIFlVVkEgZm9ybWF0Cis3OGMxMmVkOCBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBydWRpbWVudGFyeSBhdngyIHN1cHBvcnQiCitkYzViMTIyZiB0cnkgdG8gcmVtb3ZlIHRoZSBzcHVyaW91cyB3YXJuaW5nIGZvciBzdGF0aWMgYW5hbHlzaXMKK2RkZmVmZDYyIE1ha2VmaWxlLnZjOiBhZGQgcnVkaW1lbnRhcnkgYXZ4MiBzdXBwb3J0CithODkxMTY0MyBNZXJnZSAic2ltcGxpZnkgVlA4TEluaXRCaXRSZWFkZXIoKSIKK2ZkYmNkNDRkIHNpbXBsaWZ5IFZQOExJbml0Qml0UmVhZGVyKCkKKzdjMDA0Mjg3IG1ha2VmaWxlLnVuaXg6IGFkZCBydWRpbWVudGFyeSBhdngyIHN1cHBvcnQKKzUxNWUzNWNmIE1lcmdlICJhZGQgc3R1YiBkc3AvZW5jX2F2eDIuYyIKK2EwNWRjMTQwIFNTRTI6IHl1di0+cmdiIHNwZWVkLXVwIGZvciBwb2ludC1zYW1wbGluZworMTc4ZTlhNjkgYWRkIHN0dWIgZHNwL2VuY19hdngyLmMKKzFiOTljMDljIE1lcmdlICJjb25maWd1cmU6IGFkZCBhIHRlc3QgZm9yIC1tYXZ4MiIKK2ZlNzI4MDcxIGNvbmZpZ3VyZTogYWRkIGEgdGVzdCBmb3IgLW1hdngyCitlNDZhMjQ3YyBjcHU6IGZpeCBjaGVjayBmb3IgX19jcHVpZGV4IGF2YWlsYWJpbGl0eQorMTc2ZmRhMjYgZml4IHRoZSBiaXQtd3JpdGVyIGZvciBsb3NzbGVzcyBpbiAzMmJpdCBtb2RlCis1NDE3ODRjNyBkc3AuaDogYWRkIGEgY2hlY2sgZm9yIEFWWDIgLyBkZWZpbmUgV0VCUF9VU0VfQVZYMgorYmRiMTUxZWUgZHNwL2NwdTogYWRkIEFWWDIgZGV0ZWN0aW9uCithYjlmMmY4NiBNZXJnZSAicmV2YW1wIHRoZSBwb2ludC1zYW1wbGluZyBmdW5jdGlvbnMgYnkgcHJvY2Vzc2luZyBhIGZ1bGwgcGxhbmUiCithMmY4YjI4OSByZXZhbXAgdGhlIHBvaW50LXNhbXBsaW5nIGZ1bmN0aW9ucyBieSBwcm9jZXNzaW5nIGEgZnVsbCBwbGFuZQorZWYwNzYwMjYgdXNlIGRlY29kZXIncyBEU1AgZnVuY3Rpb25zIGZvciBhdXRvZmlsdGVyCisyYjVjYjMyNiBNZXJnZSAiZHNwL2NwdTogYWRkIEFWWCBkZXRlY3Rpb24iCitkZjA4ZTY3ZSBkc3AvY3B1OiBhZGQgQVZYIGRldGVjdGlvbgorZTJmNDA1YzkgTWVyZ2UgImNsZWFuLXVwIGFuZCBzbGlnaHQgc3BlZWQtdXAgaW4tbG9vcCBmaWx0ZXJpbmcgU1NFMiIKK2Y2MDk1N2JmIGNsZWFuLXVwIGFuZCBzbGlnaHQgc3BlZWQtdXAgaW4tbG9vcCBmaWx0ZXJpbmcgU1NFMgorOWZjM2FlNDYgLmdpdGF0dHJpYnV0ZXM6IHRyZWF0IC5wcG0gYXMgYmluYXJ5CiszZGE5MjRiNSBNZXJnZSAiZHNwL1dFQlBfVVNFX05FT046IHRlc3QgZm9yIF9fYWFyY2g2NF9fIgorYzcxNjQ0OTAgQW5kcm9pZC5tazogYWx3YXlzIGluY2x1ZGUgKl9uZW9uLmMgaW4gdGhlIGJ1aWxkCithNTc3YjIzYSBkc3AvV0VCUF9VU0VfTkVPTjogdGVzdCBmb3IgX19hYXJjaDY0X18KKzU0YmZmZmNhIG1vdmUgUmVtYXBCaXRSZWFkZXIoKSBmcm9tIGlkZWMuYyB0byBiaXRfcmVhZGVyIGNvZGUKKzM0MTY4ZWNiIE1lcmdlICJyZW1vdmUgYWxsIHVudXNlZCBsYXllciBjb2RlIgorZjFlNzcxNzMgcmVtb3ZlIGFsbCB1bnVzZWQgbGF5ZXIgY29kZQorYjA3NTdkYjcgQ29kZSBjbGVhbnVwIGZvciBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMuCis1ZmU2MjhkMyBtYWtlIHRoZSB0b2tlbiBwYWdlIHNpemUgYmUgdmFyaWFibGUgaW5zdGVhZCBvZiBmaXhlZCA4MTkyCitmOTQ4ZDA4YyBtZW1vcnkgZGVidWc6IGFsbG93IHNldHRpbmcgcHJlLWRlZmluZWQgbWFsbG9jIGZhaWx1cmUgcG9pbnRzCitjYTNkNzQ2ZSB1c2UgYmxvY2stYmFzZWQgYWxsb2NhdGlvbiBmb3IgYmFja3dhcmQgcmVmcyBzdG9yYWdlLCBhbmQgZnJlZS1saXN0cworMWJhNjFiMDkgZW5hYmxlIE5FT04gaW50cmluc2ljcyBpbiBhYXJjaDY0IGJ1aWxkcworYjlkMmJiNjcgZHNwL25lb24uaDogY29hbGVzY2UgaW50cmluc2ljcy1yZWxhdGVkIGRlZmluZXMKK2I1Yzc1MjU4IGlvc2J1aWxkOiBhZGQgc3VwcG9ydCBmb3IgaU9TdjcvYWFyY2g2NAorOTM4M2FmZDUgUmVkdWNlIG51bWJlciBvZiBtZW1vcnkgYWxsb2NhdGlvbnMgd2hpbGUgZGVjb2RpbmcgbG9zc2xlc3MuCis4ODhlNjNlZCBNZXJnZSAiZHNwL2xvc3NsZXNzOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMiCis4MTM3ZjNlZCBNZXJnZSAiaW5zdHJ1bWVudCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBmb3IgZGVidWdnaW5nIgorMmFhMTg3MzYgaW5zdHJ1bWVudCBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcyBmb3IgZGVidWdnaW5nCitkM2JjZjcyYiBEb24ndCBhbGxvY2F0ZSBWUDhMSGFzaENoYWluLCBidXQgdHJlYXQgbGlrZSBhdXRvbWF0aWMgb2JqZWN0CitiZDZiODYxOSBkc3AvbG9zc2xlc3M6IHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcworYjdmMTliODMgTWVyZ2UgImRlYy92cDhsOiBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMiCisyOTA1OWQ1MSBNZXJnZSAicmVtb3ZlIHNvbWUgdWludDY0X3QgY2FzdHMgYW5kIHVzZS4iCitlNjlhMWRmNCBkZWMvdnA4bDogcHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzCitjZjVlYjhhZCByZW1vdmUgc29tZSB1aW50NjRfdCBjYXN0cyBhbmQgdXNlLgorMzhlMmRiM2UgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgSGlzdG9ncmFtQWRkLgorZTA2MDlhZGUgZHdlYnA6IGZpeCBleGl0IGNvZGUgb24gd2VicCBsb2FkIGZhaWx1cmUKK2JiZDM1OGE4IE1lcmdlICJleGFtcGxlX3V0aWwuaDogYXZvaWQgZm9yd2FyZCBkZWNsYXJpbmcgZW51bXMiCis4OTU1ZGEyMSBleGFtcGxlX3V0aWwuaDogYXZvaWQgZm9yd2FyZCBkZWNsYXJpbmcgZW51bXMKKzZkNjg2NWYwIEFkZGVkIFNTRTIgdmFyaWFudHMgZm9yIEF2ZXJhZ2UyLzMvNAorYjNhNjE2YjMgbWFrZSBIaXN0b2dyYW1BZGQoKSBhIHBvaW50ZXIgaW4gZHNwCitjOGJiYjYzNiBkZWNfbmVvbjogcmVsb2NhdGUgc29tZSBpbmxpbmUtYXNtIGRlZmluZXMKKzRlMzkzYmI5IGRlY19uZW9uOiBlbmFibGUgaW50cmluc2ljcy1vbmx5IGZ1bmN0aW9ucworYmE5OWE5MjIgZGVjX25lb246IHVzZSBwb3NpdGl2ZSB0ZXN0cyBmb3IgVVNFX0lOVFJJTlNJQ1MKKzY5MDU4ZmY4IE1lcmdlICJleGFtcGxlX3V0aWw6IGFkZCBFeFV0aWxEZWNvZGVXZWJQSW5jcmVtZW50YWwiCithNzgyOGU4YiBkZWNfbmVvbjogbWFrZSBXT1JLX0FST1VORF9HQ0MgY29uZGl0aW9uYWwgb24gdmVyc2lvbgorM2YzZDcxN2EgTWVyZ2UgImVuY19uZW9uOiBlbmFibGUgaW50cmluc2ljcy1vbmx5IGZ1bmN0aW9ucyIKK2RlM2NiNmM4IE1lcmdlICJtb3ZlIExPQ0FMX0dDQ19WRVJTSU9OIGRlZiB0byBkc3AuaCIKKzFiMmZlMTRkIGV4YW1wbGVfdXRpbDogYWRkIEV4VXRpbERlY29kZVdlYlBJbmNyZW1lbnRhbAorY2E0OWU3YWQgTWVyZ2UgImVuY19uZW9uOiBtb3ZlIFRyYW5zcG9zZTR4NCB0byBkc3AvbmVvbi5oIgorYWQ5MDBhYmQgTWVyZ2UgImZpeCB3YXJuaW5nIGFib3V0IHNpemVfdCAtPiBpbnQgY29udmVyc2lvbiIKKzQ4MjViNDM2IGZpeCB3YXJuaW5nIGFib3V0IHNpemVfdCAtPiBpbnQgY29udmVyc2lvbgorNDJiMzVlMDggZW5jX25lb246IGVuYWJsZSBpbnRyaW5zaWNzLW9ubHkgZnVuY3Rpb25zCitmOTM3ZTAxMiBtb3ZlIExPQ0FMX0dDQ19WRVJTSU9OIGRlZiB0byBkc3AuaAorNWUxYTE3ZWYgZW5jX25lb246IG1vdmUgVHJhbnNwb3NlNHg0IHRvIGRzcC9uZW9uLmgKK2M3YjkyYTVhIGRlY19uZW9uOiAoV09SS19BUk9VTkRfR0NDKSBkZWxldGUgdW51c2VkIExvYWQ0eDgKKzhlNWY5MGIwIE1lcmdlICJtYWtlIEV4VXRpbExvYWRXZWJQKCkgYWNjZXB0IE5VTEwgYml0c3RyZWFtIHBhcmFtLiIKKzA1ZDRjMWI3IE1lcmdlICJjd2VicDogYWRkIHdlYnBkZWMiCitkZGViNmFjOCBjd2VicDogYWRkIHdlYnBkZWMKKzM1ZDdkMDk1IE1lcmdlICJSZWR1Y2UgbWVtb3J5IGZvb3RwcmludCBmb3IgZW5jb2RpbmcgV2ViUCBsb3NzbGVzcy4iCiswYjg5NjEwMSBSZWR1Y2UgbWVtb3J5IGZvb3RwcmludCBmb3IgZW5jb2RpbmcgV2ViUCBsb3NzbGVzcy4KK2YwYjY1YzlhIG1ha2UgRXhVdGlsTG9hZFdlYlAoKSBhY2NlcHQgTlVMTCBiaXRzdHJlYW0gcGFyYW0uCis5YzBhNjBjYyBNZXJnZSAiZHdlYnA6IG1vdmUgd2VicCBkZWNvZGluZyB0byBleGFtcGxlX3V0aWwiCisxZDYyYWNmNiBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBIdWZmbWFuQ29zdCBmdW5jdGlvbnMuCis0YTBlNzM5MCBkd2VicDogbW92ZSB3ZWJwIGRlY29kaW5nIHRvIGV4YW1wbGVfdXRpbAorYzAyMjA0NjAgTWVyZ2UgIkJ1Z2ZpeDogSW5jcmVtZW50YWwgZGVjb2RlIG9mIGxvc3N5LWFscGhhIgorOGM3Y2Q3MjIgQnVnZml4OiBJbmNyZW1lbnRhbCBkZWNvZGUgb2YgbG9zc3ktYWxwaGEKKzc5NTUxNTJkIE1JUFM6IGZpeCBlcnJvciB3aXRoIG51bWJlciBvZiByZWdpc3RlcnMuCitiMWRhYmUzNyBNZXJnZSAiTW92ZSB0aGUgSHVmZm1hbkNvc3QoKSBmdW5jdGlvbiB0byBkc3AgbGliIgorNzViMTIwMDYgTW92ZSB0aGUgSHVmZm1hbkNvc3QoKSBmdW5jdGlvbiB0byBkc3AgbGliCisyNzcyYjhiZCBNSVBTOiBmaXggYXNzZW1ibGVyIGVycm9yIHJldmVhbGVkIGJ5IGNsYW5nJ3MgZGVidWcgYnVpbGQKKzY2NTNiNjAxIGVuY19taXBzMzI6IGZpeCB1bnVzZWQgc3ltYm9sIHdhcm5pbmcgaW4gZGVidWcKKzhkZWMxMjA5IGVuY19taXBzMzI6IGRpc2FibGUgSVRyYW5zZm9ybShPbmUpIGluIGRlYnVnIGJ1aWxkcworOTg1MTlkZDUgZW5jX25lb246IGNvbnZlcnQgRGlzdG80eDQgdG8gaW50cmluc2ljcworZmU5MzE3YzkgY29zbWV0aWNzOgorOTUzYjA3NDYgZW5jX25lb246IGNvc21ldGljcworYTlmYzY5N2MgTWVyZ2UgIldJUDogZXh0cmFjdCB0aGUgZmxvYXQtY2FsY3VsYXRpb24gb2YgSHVmZm1hbkNvc3QgZnJvbSBsb29wIgorM2Y4NGI1MjEgTWVyZ2UgInJlcGxhY2Ugc29tZSBtdWx0LWxvbmcgKHZtdWxsX3U4KSB3aXRoIG11bHQtbG9uZy1hY2N1bXVsYXRlICh2bWxhbF91OCkiCis0YWUwNTMzZiBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9ucyBmb3IgRXh0cmFDb3N0IGZ1bmN0aW9ucy4KK2IzMGEwNGNmIFdJUDogZXh0cmFjdCB0aGUgZmxvYXQtY2FsY3VsYXRpb24gb2YgSHVmZm1hbkNvc3QgZnJvbSBsb29wCithOGZlOGNlMiBNZXJnZSAiTkVPTiBpbnRyaW5zaWNzIHZlcnNpb24gb2YgQ29sbGVjdEhpc3RvZ3JhbSIKKzk1MjAzZDJkIE5FT04gaW50cmluc2ljcyB2ZXJzaW9uIG9mIENvbGxlY3RIaXN0b2dyYW0KKzdjYTJlNzRiIHJlcGxhY2Ugc29tZSBtdWx0LWxvbmcgKHZtdWxsX3U4KSB3aXRoIG11bHQtbG9uZy1hY2N1bXVsYXRlICh2bWxhbF91OCkKKzQxYzZlZmJkIGZpeCBsb3NzbGVzc19uZW9uLmMKKzhmZjk2YTAyIE5FT04gaW50cmluc2ljcyB2ZXJzaW9uIG9mIEZUcmFuc2Zvcm0KKzAyMTRmNGE5IE1lcmdlICJNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9ucyBmb3IgRmFzdExvZzIiCitiYWFiZjFlYSBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9ucyBmb3IgRmFzdExvZzIKKzNkNDk4NzFkIE5FT04gZnVuY3Rpb25zIGZvciBsb3NzbGVzcyBjb2RpbmcKKzNmZTAyOTE1IE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb25zIGZvciBTU0UgZnVuY3Rpb25zLgorYzUwM2I0ODUgTWVyZ2UgImZpeCB0aGUgZ2NjLTQuNi4wIGJ1ZyBieSBpbXBsZW1lbnRpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIgorYWJlNmY0ODcgZml4IHRoZSBnY2MtNC42LjAgYnVnIGJ5IGltcGxlbWVudGluZyBhbHRlcm5hdGl2ZSBtZXRob2QKKzU1OThiZGVjIGVuY19taXBzMzIuYzogZml4IGZpbGUgbW9kZQorMmIxYjRkNWEgTUlQUzogTUlQUzMycjE6IEFkZCBvcHRpbWl6YXRpb24gZm9yIEdldFJlc2lkdWFsQ29zdAorZjBhMWYzY2QgTWVyZ2UgIk1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIEZUcmFuc2Zvcm0iCis3MjMxZjYxMCBNSVBTOiBNSVBTMzJyMTogQWRkZWQgb3B0aW1pemF0aW9uIGZvciBGVHJhbnNmb3JtCis4NjllYWY2YyAgfjMwJSBlbmNvZGluZyBzcGVlZHVwOiB1c2UgTkVPTiBmb3IgUXVhbnRpemVCbG9jaygpCitmNzU4YWY2YiBlbmNfbmVvbjogY29udmVydCBGVHJhbnNmb3JtV0hUIHRvIGludHJpbnNpY3MKKzdkYWQwOTViIE1JUFM6IE1JUFMzMnIxOiBBZGRlZCBvcHRpbWl6YXRpb24gZm9yIERpc3RvNHg0IChUVHJhbnNmb3JtKQorMjI5OGQ1ZjMgTUlQUzogTUlQUzMycjE6IEFkZGVkIG9wdGltaXphdGlvbiBmb3IgUXVhbnRpemVCbG9jaworZTg4MTUwYzkgTWVyZ2UgIk1JUFM6IE1JUFMzMnIxOiBBZGQgb3B0aW1pemF0aW9uIGZvciBJVHJhbnNmb3JtIgorZGU2OTNmMjUgbG9zc2xlc3NfbmVvbjogZGlzYWJsZSBWUDhMQ29udmVydCogZnVuY3Rpb25zCis0MTQzMzMyYiBORU9OIGludHJpbnNpY3MgZm9yIGVuY29kaW5nCiswY2EyOTE0YiBNSVBTOiBNSVBTMzJyMTogQWRkIG9wdGltaXphdGlvbiBmb3IgSVRyYW5zZm9ybQorNzFiY2E1ZWMgZGVjX25lb246IHVzZSB2c3RfbGFuZSBpbnN0ZWFkIG9mIHZnZXRfbGFuZQorYmYwNjEwNTIgSW50cmluc2ljcyBORU9OIHZlcnNpb24gb2YgVHJhbnNmb3JtT25lCisxOWM2ZjFiYSBNZXJnZSAiZGVjX25lb246IHVzZSB2bGQ/X2xhbmUgaW5zdGVhZCBvZiB2c2V0P19sYW5lIgorN2E5NGMwY2YgdXBzYW1wbGluZ19uZW9uOiBkcm9wIE5FT04gc3VmZml4IGZyb20gbG9jYWwgZnVuY3Rpb25zCitkMTQ2NjljOCB1cHNhbXBsaW5nX3NzZTI6IGRyb3AgU1NFMiBzdWZmaXggZnJvbSBsb2NhbCBmdW5jdGlvbnMKKzJjYTQyYTRmIGVuY19zc2UyOiBkcm9wIFNTRTIgc3VmZml4IGZyb20gbG9jYWwgZnVuY3Rpb25zCitkMDM4ZTYxOSBkZWNfc3NlMjogZHJvcCBTU0UyIHN1ZmZpeCBmcm9tIGxvY2FsIGZ1bmN0aW9ucworZmE1MmQ3NTIgZGVjX25lb246IHVzZSB2bGQ/X2xhbmUgaW5zdGVhZCBvZiB2c2V0P19sYW5lCitjNTIwZTc3ZCBjb3NtZXRpYzogZml4IGxvbmcgbGluZQorNGIwZjJkYWUgTWVyZ2UgImFkZCBpbnRyaW5zaWNzIE5FT04gY29kZSBmb3IgY2hyb21hIHN0cm9uZy1maWx0ZXJpbmciCitlMzUxZWMwNyBhZGQgaW50cmluc2ljcyBORU9OIGNvZGUgZm9yIGNocm9tYSBzdHJvbmctZmlsdGVyaW5nCithYWY3MzRiOCBNZXJnZSAiQWRkIFNTRTIgdmVyc2lvbiBvZiBmb3J3YXJkIGNyb3NzLWNvbG9yIHRyYW5zZm9ybSIKK2M5MGE5MDJlIEFkZCBTU0UyIHZlcnNpb24gb2YgZm9yd2FyZCBjcm9zcy1jb2xvciB0cmFuc2Zvcm0KK2JjMzc0ZmYzIFVzZSBoaXN0b2dyYW1fYml0cyB0byBpbml0YWxpemUgdHJhbnNmb3JtX2JpdHMuCisyMTMyOTkyZCBNZXJnZSAiQWRkIHN0cm9uZyBmaWx0ZXJpbmcgaW50cmluc2ljcyAoaW5uZXIgYW5kIG91dGVyIGVkZ2VzKSIKKzVmYmZmM2E2IEFkZCBzdHJvbmcgZmlsdGVyaW5nIGludHJpbnNpY3MgKGlubmVyIGFuZCBvdXRlciBlZGdlcykKK2Q0ODEzZjBjIEFkZCBTU0UyIGZ1bmN0aW9uIGZvciBJbnZlcnNlIENyb3NzLWNvbG9yIFRyYW5zZm9ybQorMjYwMjk1NjggZGVjX25lb246IGFkZCBzdHJvbmcgbG9vcGZpbHRlciBpbnRyaW5zaWNzCitjY2E3ZDdlZiBNZXJnZSAiYWRkIGludHJpbnNpY3MgdmVyc2lvbiBvZiBTaW1wbGVIRmlsdGVyMTZORU9OKCkiCisxYTA1ZGZhNyB3aW5kb3dzOiBmaXggZGxsIGJ1aWxkcworZDZjNTBkOGEgTWVyZ2UgImFkZCBzb21lIGNvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMgaW4gTkVPTiIKKzRmZDdjODJlIFNTRTIgdmFyaWFudHMgb2YgU3VidHJhY3QtR3JlZW46IFJlY3RpZnkgbG9vcCBjb25kaXRpb24KKzk3ZTVmYWMzIGFkZCBzb21lIGNvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMgaW4gTkVPTgorYjlhN2E0NWYgYWRkIGludHJpbnNpY3MgdmVyc2lvbiBvZiBTaW1wbGVIRmlsdGVyMTZORU9OKCkKK2RhY2NiZjQwIGFkZCBsaWdodCBmaWx0ZXJpbmcgTkVPTiBpbnRyaW5zaWNzCithZjQ0NDYwOCBmaXggdHlwbyBpbiBTVE9SRV9XSFQKKzZhZjZiOGUxIFR1bmUgSGlzdG9ncmFtQ29tYmluZUJpbiBmb3IgbGFyZ2UgaW1hZ2VzLgorYWY5M2JkZDYgdXNlIFdlYlBTYWZlW0NNXWFsbG9jL1dlYlBTYWZlRnJlZSBpbnN0ZWFkIG9mIFtjbV1hbGxvYy9mcmVlCis1MWY0MDZhNSBsb3NzbGVzc19zc2UyOiByZWxvY2F0ZSBWUDhMRHNwSW5pdFNTRTIgcHJvdG8KKzBmNGY3MjFiIHNlcGFyYXRlIFNTRTIgbG9zc2xlc3MgZnVuY3Rpb25zIGludG8gaXRzIG93biBmaWxlCis1MTRmYzI1MSBWUDhMQ29udmVydEZyb21CR1JBOiB1c2UgY29udmVyc2lvbiBmdW5jdGlvbiBwb2ludGVycworNmQyZjM1MjcgZHNwL2RlYzogVHJhbnNmb3JtRENVVjogdXNlIFZQOFRyYW5zZm9ybURDCitkZWZjOGUxYiBNZXJnZSAiZml4IG91dC1vZi1ib3VuZCByZWFkIGR1cmluZyBhbHBoYS1wbGFuZSBkZWNvZGluZyIKK2ZiZWQzNjQzIE1lcmdlICJkc3A6IHJldXNlIHdodCB0cmFuc2Zvcm0gZnJvbSBkZWMgaW4gZW5jb2RlciIKK2Q4NDY3MDg0IE1lcmdlICJBZGQgU1NFMiB2ZXJzaW9uIG9mIEFSR0IgLT4gQkdSL1JHQi8uLi4gY29udmVyc2lvbiBmdW5jdGlvbnMiCisyMDdkMDNiNCBmaXggb3V0LW9mLWJvdW5kIHJlYWQgZHVyaW5nIGFscGhhLXBsYW5lIGRlY29kaW5nCitkMWIzM2FkNSAyLTUlIGZhc3RlciB0cmVsbGlzIHdpdGggY2xhbmcvTWFjT1MgKGFuZCB+Mi0zJSBvbiBBUk0pCiszNjljMjZkZCBBZGQgU1NFMiB2ZXJzaW9uIG9mIEFSR0IgLT4gQkdSL1JHQi8uLi4gY29udmVyc2lvbiBmdW5jdGlvbnMKK2RmMjMwZjI3IGRzcDogcmV1c2Ugd2h0IHRyYW5zZm9ybSBmcm9tIGRlYyBpbiBlbmNvZGVyCis4MGUyMThkNCBBbmRyb2lkLm1rOiBmaXggYnVpbGQgd2l0aCBBUFBfQUJJPWFybWVhYmktdjdhLWhhcmQKKzU5ZGFmMDgzIE1lcmdlICJjb3NtZXRpY3M6IgorNTM2MjIwMDggY29zbWV0aWNzOgorM2U3ZjM0YTMgQXNzaWduU2VnbWVudHM6IHF1aWV0IGFycmF5LWJvdW5kcyB3YXJuaW5nCiszYzJlYmY1OCBNZXJnZSAiVXBkYXRlSGlzdG9ncmFtQ29zdDogYXZvaWQgaW1wbGljaXQgZG91YmxlLT5mbG9hdCIKK2NmODIxYzgyIFVwZGF0ZUhpc3RvZ3JhbUNvc3Q6IGF2b2lkIGltcGxpY2l0IGRvdWJsZS0+ZmxvYXQKKzMxMmU2MzhmIEV4dGVuZCB0aGUgc2VhcmNoIHNwYWNlIGZvciBHZXRCZXN0R3JlZW5SZWRUb0JsdWUKKzFjNTg1MjZmIEZpeCBmZXcgbml0cworZmVmMjI3MDQgT3B0aW1pemUgYW5kIHJlLXN0cnVjdHVyZSBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMKKzA2OGIxNGFjIE9wdGltaXplIGxvc3NsZXNzIGRlY29kaW5nLgorNWYwY2ZhODAgRG8gYSBiaW5hcnkgc2VhcmNoIHRvIGdldCB0aGUgb3B0aW11bSBjYWNoZSBiaXRzLgorMjRjYTM2NzggTWVyZ2UgImFsbG93ICdjd2VicCAtbyAtJyB0byBlbWl0IG91dHB1dCB0byBzdGRvdXQiCitlMTJmODc0ZSBhbGxvdyAnY3dlYnAgLW8gLScgdG8gZW1pdCBvdXRwdXQgdG8gc3Rkb3V0CisyYmNhZDg5YiBhbGxvdyBzb21lIG1vcmUgc3RkaW4vc3RvdXQgSS9PCis4NGVkNGIzYSBmaXggY3dlYnAuMSB0eXBvcyBhZnRlciBwYXRjaCAjNjkxOTkKKzY1Yjk5ZjFjIGFkZCBhIC16IG9wdGlvbiB0byBjd2VicCwgYW5kIFdlYlBDb25maWdMb3NzbGVzc1ByZXNldCgpIGZ1bmN0aW9uCiszMDE3NjYxOSA0LTUlIGZhc3RlciB0cmVsbGlzIGJ5IHJlbW92aW5nIHNvbWUgdW5uZWVkZWQgY2FsY3VsYXRpb25zLgorNjg3YTU4ZWMgaGlzdG9ncmFtLmM6IHJlaW5kZW50IGFmdGVyIGIzM2U4YTAKKzA2ZDQ1NmY2IE1lcmdlICJ+My00JSBmYXN0ZXIgbG9zc2xlc3MgZW5jb2RpbmciCitjNjBkZTI2MCB+My00JSBmYXN0ZXIgbG9zc2xlc3MgZW5jb2RpbmcKKzQyZWIwNmZjIE1lcmdlICJmZXcgY29zbWV0aWNzIGFmdGVyIHBhdGNoICM2OTA3OSIKKzgyYWY4MjY0IGZldyBjb3NtZXRpY3MgYWZ0ZXIgcGF0Y2ggIzY5MDc5CitiMzNlOGEwNSBSZWZhY3RvciBjb2RlIGZvciBIaXN0b2dyYW1Db21iaW5lLgorY2ExYmZmZjUgTWVyZ2UgIjUtMTAlIGVuY29kaW5nIHNwZWVkdXAgd2l0aCBmYXN0ZXIgdHJlbGxpcyAoLW0gNikiCis1YWVlYjA4NyA1LTEwJSBlbmNvZGluZyBzcGVlZHVwIHdpdGggZmFzdGVyIHRyZWxsaXMgKC1tIDYpCis4MmFlMWJmMiBjb3NtZXRpY3M6IG5vcm1hbGl6ZSBWUDhHZXRDUFVJbmZvIGNoZWNrcworZTNkZDkyNDMgTWVyZ2UgIlJlZmFjdG9yIEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlIGZvciBmdXR1cmUgdHVuaW5nLiIKKzIwNmNjMWJlIFJlZmFjdG9yIEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlIGZvciBmdXR1cmUgdHVuaW5nLgorM2NiODQwNjIgTWVyZ2UgInNwZWVkLXVwIHRyZWxsaXMgcXVhbnQgKH41LTEwJSBvdmVyYWxsIHNwZWVkLXVwKSIKK2I2NmYyMjI3IE1lcmdlICJsb3NzeSBlbmNvZGluZzogfjMlIHNwZWVkLXVwIgorNDI4N2QwZDQgc3BlZWQtdXAgdHJlbGxpcyBxdWFudCAofjUtMTAlIG92ZXJhbGwgc3BlZWQtdXApCiszOTBjOGIzMSBsb3NzeSBlbmNvZGluZzogfjMlIHNwZWVkLXVwCis5YTQ2M2M0YSBNZXJnZSAiZGVjX25lb246IGNvbnZlcnQgVHJhbnNmb3JtV0hUIHRvIGludHJpbnNpY3MiCitlODYwNWU5NiBNZXJnZSAiZGVjX25lb246IGFkZCBDb252ZXJ0VThUb1MxNiIKKzRhYTNlNDEyIE1JUFM6IE1JUFMzMnIxOiByZXNjYWxlciBidWdmaXgKK2MxNmNkOTlhIFNwZWVkIHVwIGxvc3NsZXNzIGVuY29kZXIuCis5ZDZiNWZmMSBkZWNfbmVvbjogY29udmVydCBUcmFuc2Zvcm1XSFQgdG8gaW50cmluc2ljcworMmZmMGFhZTIgZGVjX25lb246IGFkZCBDb252ZXJ0VThUb1MxNgorNzdhOGY5MTkgZml4IGNvbXBpbGF0aW9uIHdpdGggVVNFX1lVVmogZmxhZworNGFjYmVjMWIgTWVyZ2UgY2hhbmdlcyBJM2IyNDBmZmIsSWE5MzcwMjgzLElhMmQyODcyOAorMjcxOWJiN2UgZGVjX25lb246IFRyYW5zZm9ybUFDMzogd29yayBvbiBwYWNrZWQgdmVjdG9ycworYjdiNjBjYTEgZGVjX25lb246IGFkZCBTYXR1cmF0ZUFuZFN0b3JlNHg0CitiNzY4NWQ3MyBSZXNjYWxlOiBsZXQgSW1wb3J0Um93IC8gRXhwb3J0Um93IGJlIHBvaW50ZXItdG8tZnVuY3Rpb24KK2UwMmYxNmVmIGRlY19uZW9uLmM6IGNvbnZlcnQgVHJhbnNmb3JtREMgdG8gaW50cmluc2ljcworOWNiYTk2M2YgYWRkIG1pc3NpbmcgZmlsZQorODk5MmRkYjcgdXNlIHN0YXRpYyBjbGlwcGluZyB0YWJsZXMKKzAyMzVkNWU0IDEtMiUgZmFzdGVyIHF1YW50aXphdGlvbiBpbiBTU0UyCitiMmZiYzM2YyBmaXggVkMxMi14NjQgd2FybmluZworNmUzN2NiOTQgTWVyZ2UgImNvc21ldGljczogYmFja3dhcmRfcmVmZXJlbmNlcy5jOiByZWluZGVudCBhZnRlciBhN2QyZWUzIgorYTQyZWE5NzQgY29zbWV0aWNzOiBiYWNrd2FyZF9yZWZlcmVuY2VzLmM6IHJlaW5kZW50IGFmdGVyIGE3ZDJlZTMKKzZjMzI3NDQyIE1lcmdlICJmaXggbWlzc2luZyBfX0JJR19FTkRJQU5fXyBkZWZpbml0aW9uIG9uIHNvbWUgcGxhdGZvcm0iCithOGI2YWFkMSBmaXggbWlzc2luZyBfX0JJR19FTkRJQU5fXyBkZWZpbml0aW9uIG9uIHNvbWUgcGxhdGZvcm0KK2ZkZTI5MDRiIEluY3JlYXNlIGluaXRpYWwgYnVmZmVyIHNpemUgZm9yIFZQOEwgQml0IFdyaXRlci4KK2E3ZDJlZTM5IE9wdGltaXplIGNhY2hlIGVzdGltYXRlIGxvZ2ljLgorN2ZiNjA5NWIgTWVyZ2UgImRlY19uZW9uLmM6IGFkZCBUcmFuc2Zvcm1BQzMiCitiZjE4MmU4MyBWUDhMQml0V3JpdGVyOiB1c2UgYSBiaXQtYWNjdW11bGF0b3IKKzNmNDBiNGE1IE1lcmdlICJNSVBTOiBNSVBTMzJyMTogY2xhbmcgbWFjcm8gd2FybmluZyByZXNvbHZlZCIKKzE2ODRmNGVlIFdlYlAgRGVjb2RlcjogTWFyayBzb21lIHRydW5jYXRlZCBiaXRzdHJlYW1zIGFzIGludmFsaWQKK2FjYmVkYWM0IE1JUFM6IE1JUFMzMnIxOiBjbGFuZyBtYWNybyB3YXJuaW5nIHJlc29sdmVkCisyMjhlNDg3NyBkZWNfbmVvbi5jOiBhZGQgVHJhbnNmb3JtQUMzCiszOTNmODliNyBBbmRyb2lkLm1rOiBhdm9pZCBnY2Mtc3BlY2lmaWMgZmxhZ3Mgd2l0aCBjbGFuZworMzJhZWFmMTEgcmV2YW1wIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKCkgYSBiaXQKKzBjN2NjNGNhIE1lcmdlICJEb24ndCBkZXJlZmVyZW5jZSBOVUxMLCBlbnN1cmUgSGFzaENoYWluIGZ1bGx5IGluaXRpYWxpemVkIgorMzkxMzE2ZmUgRG9uJ3QgZGVyZWZlcmVuY2UgTlVMTCwgZW5zdXJlIEhhc2hDaGFpbiBmdWxseSBpbml0aWFsaXplZAorOTI2ZmY0MDIgV0VCUF9TV0FQXzE2QklUX0NTUDogcmVtb3ZlIGNvZGUgZHVwCisxZDFjZDNiYiBGaXggZGVjb2RlIGJ1ZyBmb3IgcmdiQV80NDQ0L1JHQkFfNDQ0NCBjb2xvci1tb2Rlcy4KKzkzOWU3MGU3IHVwZGF0ZSBBVVRIT1JTIGZpbGUKKzg5MzRhNjIyIGNvc21ldGljczogKl9taXBzMzIuYworZGQ0MzhjOWEgTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBzb21lIHNpbXBsZSBwb2ludC1zYW1wbGluZyBmdW5jdGlvbnMuIFBBVENIIFs2LzZdCis1MzUyMDkxMSBBZGRlZCBzdXBwb3J0IGZvciBjYWxsaW5nIHNhbXBsaW5nIGZ1bmN0aW9ucyB2aWEgcG9pbnRlcnMuCitkMTZjNjk3NCBNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIGZpbHRlciBmdW5jdGlvbnMuIFBBVENIIFs1LzZdCiswNDMzNmZjNyBNSVBTOiBNSVBTMzJyMTogT3B0aW1pemF0aW9uIG9mIGZ1bmN0aW9uIFRyYW5zZm9ybU9uZS4gUEFUQ0ggWzQvNl0KKzkyZDhmYzdkIE1JUFM6IE1JUFMzMnIxOiBPcHRpbWl6YXRpb24gb2YgZnVuY3Rpb24gV2ViUFJlc2NhbGVySW1wb3J0Um93LiBQQVRDSCBbMy82XQorYmJjMjNmZjMgcGFyc2Ugb25lIHJvdyBvZiBpbnRyYSBtb2RlcyBhbHRvZ2V0aGVyCithMmY2MDhmOSBNZXJnZSAiTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBXZWJQUmVzY2FsZXJFeHBvcnRSb3cuIFsyLzZdIgorODgyMzA4NTQgTUlQUzogTUlQUzMycjE6IE9wdGltaXphdGlvbiBvZiBmdW5jdGlvbiBXZWJQUmVzY2FsZXJFeHBvcnRSb3cuIFsyLzZdCitjNWE1YjAyOCBkZWNvZGUgbXQraW5jcmVtZW50YWw6IGZpeCBzZWdmYXVsdCBpbiBkZWJ1ZyBidWlsZHMKKzk4ODJiMmY5IGFsd2F5cyB1c2UgZmFzdC1hbmFseXNpcyBmb3IgYWxsIG1ldGhvZHMuCiswMDBhZGFjMCBNZXJnZSAiYXV0b2NvbmY6IHVwZGF0ZSBheF9wdGhyZWFkLm00IgorMmQyZmMzN2QgdXBkYXRlIC5naXRpZ25vcmUKKzViZjQyNTVhIE1lcmdlICJNYWtlIGl0IHBvc3NpYmxlIHRvIGF2b2lkIGF1dG9tYWdpYyBkZXBlbmRlbmNpZXMiCitjMWNiMTkzMyBkaXNhYmxlIE5FT04gZm9yIGFybTY0IHBsYXRmb3JtCis3M2EzMDRlOSBNYWtlIGl0IHBvc3NpYmxlIHRvIGF2b2lkIGF1dG9tYWdpYyBkZXBlbmRlbmNpZXMKKzRkNDkzZjhkIE1JUFM6IE1JUFMzMnIxOiBEZWNvZGVyIGJpdCByZWFkZXIgZnVuY3Rpb24gb3B0aW1pemVkLiBQQVRDSCBbMS82XQorYzc0MTE4M2MgbWFrZSBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYSB3b3JrIHdpdGggYXJnYiBwaWN0dXJlCis1ZGExODU1MiBhZGQgYSBkZWNvZGluZyBvcHRpb24gdG8gZmxpcCBpbWFnZSB2ZXJ0aWNhbGx5CiswMGMzYzRlMSBNZXJnZSAiYWRkIG1hbi92d2VicC4xIgorMmM2YmI0MjggYWRkIG1hbi92d2VicC4xCitlYTU5YThlOSBNZXJnZSAiTWVyZ2UgdGFnICd2MC40LjAnIgorNzU3NGJlZDQgZml4IGNvbW1lbnRzIHJlbGF0ZWQgdG8gYXJyYXkgc2l6ZXMKKzBiNWE5MGZkIGR3ZWJwLjE6IGZpeCBvcHRpb24gZm9ybWF0dGluZworZWZmY2IwZmQgTWVyZ2UgdGFnICd2MC40LjAnCis3Yzc2MjU1ZCBhdXRvY29uZjogdXBkYXRlIGF4X3B0aHJlYWQubTQKK2ZmZjJhMTFiIG1ha2UgLXNob3J0IHdvcmsgd2l0aCAtcHJpbnRfc3NpbSwgLXByaW50X3BzbnIsIGV0Yy4KKzY4ZTc5MDFkIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuNC4wLXJjMSwgdGFnOiB2MC40LjAsIG9yaWdpbi8wLjQuMCwgMC40LjApCisyNTZlNDMzMyB1cGRhdGUgTkVXUyBkZXNjcmlwdGlvbiB3aXRoIG5ldyBnZW5lcmFsIGZlYXR1cmVzCisyOTYyNTM0MCBNZXJnZSAiZ2lmMndlYnA6IGRvbid0IHVzZSBDOTkgJXp1IiBpbnRvIDAuNC4wCiszYjlmOWRkMCBnaWYyd2VicDogZG9uJ3QgdXNlIEM5OSAlenUKK2I1YjJlM2M3IGN3ZWJwOiBmaXggbWV0YWRhdGEgb3V0cHV0IHcvbG9zc3krYWxwaGEKK2FkMjZkZjFhIG1ha2VmaWxlLnVuaXg6IGNsZWFuIHVwIGxpYmdpZjJ3ZWJwX3V0aWwuYQorYzNiNDU1NzAgdXBkYXRlIENoYW5nZWxvZworY2E4NDExMjEgTWVyZ2UgImJ1bXAgdmVyc2lvbiB0byAwLjQuMCIgaW50byAwLjQuMAorOGM1MjRkYjggYnVtcCB2ZXJzaW9uIHRvIDAuNC4wCitlZWMyMzk4YyB1cGRhdGUgQVVUSE9SUyAmIC5tYWlsbWFwCitiOWJiZjZhMSB1cGRhdGUgTkVXUyBmb3IgMC40LjAKK2M3MmUwODExIE1lcmdlICJkZWMvd2VicC5jOiBkb24ndCB3YWl0IGZvciBkYXRhIGJlZm9yZSByZXBvcnRpbmcgdy9oIgorNWFkNjUzMTQgZGVjL2ZyYW1lLmM6IGZpeCBmb3JtYXR0aW5nCitmN2ZjNGJjOCBkZWMvd2VicC5jOiBkb24ndCB3YWl0IGZvciBkYXRhIGJlZm9yZSByZXBvcnRpbmcgdy9oCis2NmEzMmFmNSBNZXJnZSAiTkVPTiBzcGVlZCB1cCIKKzI2ZDg0MmViIE5FT04gc3BlZWQgdXAKK2YzMDdmOThiIE1lcmdlICJ3ZWJwbXV4OiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZyIKK2ZlMDUxZGE3IE1lcmdlICJSRUFETUU6IGFkZCBhIHNlY3Rpb24gb24gZ2lmMndlYnAiCis2ZmQyYmQ2MiBNZXJnZSAibWFucGFnZSBwZWRhbnRyeSIKKzRhZjE5MDA3IFJFQURNRTogYWRkIGEgc2VjdGlvbiBvbiBnaWYyd2VicAorNmYzNmFkZTkgbWFucGFnZSBwZWRhbnRyeQorZjkwMTZjYjkgUkVBRE1FOiB1cGRhdGUgZHdlYnAgb3B0aW9ucworYjRmYTBhNDcgd2VicG11eDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmcKK2E5YTIwYWNmIGdpZjJ3ZWJwOiBBZGQgYSBtdWx0aS10aHJlYWRlZCBlbmNvZGUgb3B0aW9uCis0OTViZWY0MSBmaXggYnVnIGluIFRyZWxsaXNRdWFudGl6ZQorNjA1YTcxMjcgc2ltcGxpZnkgX19jcGx1c3BsdXMgaWZkZWYKKzMzMTA5Zjk5IE1lcmdlICJkcm9wOiBpZmRlZiBfX2NwbHVzcGx1cyBjaGVja3MgZnJvbSBDIGZpbGVzIgorN2Y5ZGUwYjkgTWVyZ2UgY2hhbmdlcyBJOTk0YTU1ODcsSTg0NjdiYjcxLEkxM2I1MDY4OCxJMWUyYzljN2IKKzU0NTkwMzBiIGdpZjJ3ZWJwOiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZworYTRiMGFhMDYgdndlYnA6IGxldCAtLSBzdG9wIHBhcmFtZXRlciBwYXJzaW5nCis5OGFmNjhmZSBjd2VicDogbGV0IC0tIHN0b3AgcGFyYW1ldGVyIHBhcnNpbmcKK2EzMzgzMWUyIGR3ZWJwOiBsZXQgLS0gc3RvcCBwYXJhbWV0ZXIgcGFyc2luZworMzYzMDEyNDkgYWRkIHNvbWUgY2hlY2tzIG9uIGVycm9yIHBhdGhzCitjZTRjNzEzOSBNZXJnZSAiYXV0b2NvbmY6IGFkZCAtLWRpc2FibGUtd2ljIgorNTIyN2Q5OTEgZHJvcDogaWZkZWYgX19jcGx1c3BsdXMgY2hlY2tzIGZyb20gQyBmaWxlcworZjY0NTM1NTkgZHdlYnAuMTogZml4IHR5cG8KK2Y5MTAzNGYyIE1lcmdlICJjd2VicDogcHJpbnQgbWV0YWRhdGEgc3RhdHMgd2hlbiBubyBvdXRwdXQgZmlsZSBpcyBnaXZlbiIKK2Q0OTM0NTUzIGdpZjJ3ZWJwOiBCYWNrd2FyZCBjb21wYXRpYmlsaXR5IGZvciBnaWZsaWIgdmVyc2lvbiA8PSA0LjEuMworNGM2MTdkMzIgZ2lmMndlYnA6IERpc2FibGUgb3V0cHV0IG9mIElDQyBwcm9maWxlIGJ5IGRlZmF1bHQKKzczYjczMWZiIGludHJvZHVjZSBhIHNwZWNpYWwgcXVhbnRpemF0aW9uIGZ1bmN0aW9uIGZvciBXSFQKKzQxYzBjYzRiIE1ha2UgRm9yd2FyZCBXSFQgdHJhbnNmb3JtIHVzZSAzMmJpdCBmaXhlZC1wb2ludCBjYWxjdWxhdGlvbgorYTMzNTlmNWQgT25seSBjb21wdXRlIHF1YW50aXphdGlvbiBwYXJhbXMgb25jZQorNzA0OTA0MzcgY3dlYnA6IHByaW50IG1ldGFkYXRhIHN0YXRzIHdoZW4gbm8gb3V0cHV0IGZpbGUgaXMgZ2l2ZW4KK2Q1MTNiYjYyICogZml4IG9mZi1ieS1vbmUgenRocmVzaCBjYWxjdWxhdGlvbiAqIHJlbW92ZSB0aGUgc2hhcnBlbmluZyBmb3Igbm9uIGx1bWEtQUMgY29lZmZzICogYWRqdXN0IHRoZSBiaWFzIGEgbGl0dGxlIGJpdCB0byBjb21wZW5zYXRlIGZvciB0aGlzCithZDlkZWMwYyBNZXJnZSAiY29zbWV0aWNzOiBkd2VicDogZml4IGxvY2FsIGZ1bmN0aW9uIG5hbWUgZm9ybWF0IgorZjczN2YwMzcgTWVyZ2UgImR3ZWJwOiByZW1vdmUgYSBkZWFkIHN0b3JlIgorM2MzYTcwZGEgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IGluc3RhbGwgYmluYXJpZXMgaW4gJChERVNURElSKS9iaW4vIgorMTUwYjY1NWYgTWVyZ2UgIkFuZHJvaWQubWs6IGFkZCBzb21lIHJlbGVhc2UgY29tcGlsZSBmbGFncyIKK2RiZWJkMzNiIGNvc21ldGljczogZHdlYnA6IGZpeCBsb2NhbCBmdW5jdGlvbiBuYW1lIGZvcm1hdAorMjc3NDk5NTEgZHdlYnA6IHJlbW92ZSBhIGRlYWQgc3RvcmUKK2EwMWUwNGZlIGF1dG9jb25mOiBhZGQgLS1kaXNhYmxlLXdpYworNTAwOWIyMjcgbWFrZWZpbGUudW5peDogaW5zdGFsbCBiaW5hcmllcyBpbiAkKERFU1RESVIpL2Jpbi8KK2JhYjMwZmNhIE1lcmdlICJmaXggLXByaW50X3BzbnIgLyBzc2ltIG9wdGlvbnMiCitlYmVmN2ZiMyBmaXggLXByaW50X3BzbnIgLyBzc2ltIG9wdGlvbnMKK2NiNjM3ODU1IE1lcmdlICJmaXggYnVnIGR1ZSB0byBvdmVyemVhbG91cyBjaGVjayBpbiBXZWJQUGljdHVyZVlVVkFUb0FSR0IoKSIKKzgxODk4ODViIE1lcmdlICJFc3RpbWF0ZUJlc3RGaWx0ZXI6IHVzZSBhbiBpbnQgdG8gaXRlcmF0ZSBXRUJQX0ZJTFRFUl9UWVBFIgorNGFkN2QzMzUgQW5kcm9pZC5tazogYWRkIHNvbWUgcmVsZWFzZSBjb21waWxlIGZsYWdzCitjMTJlMjM2OSBjb3NtZXRpY3M6IGZpeCBhIGZldyB0eXBvcworNmYxMDQwMzQgZml4IGJ1ZyBkdWUgdG8gb3ZlcnplYWxvdXMgY2hlY2sgaW4gV2ViUFBpY3R1cmVZVVZBVG9BUkdCKCkKKzNmNmMzNWM2IEVzdGltYXRlQmVzdEZpbHRlcjogdXNlIGFuIGludCB0byBpdGVyYXRlIFdFQlBfRklMVEVSX1RZUEUKK2NjNTU3OTBlIE1lcmdlIGNoYW5nZXMgSThiYjdhNGRjLEkyYzE4MDA1MSxJMDIxYTAxNGYsSThhMjI0YTYyCitjNTM2YWZiNSBNZXJnZSAiY29zbWV0aWNzOiBmaXggc29tZSB0eXBvcyIKK2NiZGQzZTZlIGFkZCBhIC1kaXRoZXIgZGl0aGVyaW5nIG9wdGlvbiB0byB0aGUgZGVjb2RlcgorZTgxMjQwMTIgVXBkYXRlZCBpb3NidWlsZC5zaCBmb3IgWENvZGUgNS54Cis0OTMxYzMyOSBjb3NtZXRpY3M6IGZpeCBzb21lIHR5cG9zCiswNWFhY2Y3NyBtdXg6IGFkZCBzb21lIG1pc3NpbmcgY2FzdHMKKzYxN2Q5MzQ4IGVuYy92cDhsOiBhZGQgYSBtaXNzaW5nIGNhc3QKKzQ2ZGIyODY1IGlkZWM6IGFkZCBzb21lIG1pc3NpbmcgY2FzdHMKK2I1MjRlMzM2IEVycm9yU3RhdHVzTG9zc2xlc3M6IGNvcnJlY3QgcmV0dXJuIHR5cGUKK2NiMjYxZjc5IGZpeCBhIGRlc2NhbGluZyBidWcgZm9yIHZlcnRpY2FsL2hvcml6b250YWwgVS9WIGludGVycG9sYXRpb24KK2JjYjM5NTVjIE1lcmdlIGNoYW5nZXMgSTQ4OTY4NDY4LEkxODFiYzczNgorNzNmNTIxMzMgZ2lmMndlYnA6IEFkZCBhIG1peGVkIGNvbXByZXNzaW9uIG1vZGUKKzYxOTg3MTVlIGRlbXV4OiBzcGxpdCBjaHVuayBwYXJzaW5nIGZyb20gUGFyc2VWUDhYCitkMmUzZjRlNiBkZW11eDogYWRkIGEgdGFpbCBwb2ludGVyIGZvciBjaHVua3MKKzg3Y2ZmY2MzIGRlbXV4OiBjb3NtZXRpY3M6IHMvaGFzX2ZyYW1lcy9pc19hbmltYXRpb24vCitlMThlNjY3NyBkZW11eDogc3RyaWN0bHkgZW5mb3JjZSB0aGUgYW5pbWF0aW9uIGZsYWcKK2M0ZjM5ZjRhIGRlbXV4OiBjb3NtZXRpY3M6IHJlbW92ZSBhIHVzZWxlc3MgYnJlYWsKKzYxY2I4ODRkIGRlbXV4OiAobm9uLWV4cCkgZmFpbCBpZiB0aGUgZnJhZ21lbnRlZCBmbGFnIGlzIHNldAorZmYzNzlkYjMgZmV3ICUgc3BlZWR1cCBvZiBsb3NzbGVzcyBlbmNvZGluZworZGYzNjQ5YTIgcmVtb3ZlIGFsbCBkaXNhYmxlZCBjb2RlIHJlbGF0ZWQgdG8gUC1mcmFtZXMKKzZkMGNiM2RlIE1lcmdlICJnaWYyd2VicDoga21pbiA9IDAgc2hvdWxkIHN1cHByZXNzIGtleS1mcmFtZSBhZGRpdGlvbi4iCiszNjU1NTk4MyBnaWYyd2VicDoga21pbiA9IDAgc2hvdWxkIHN1cHByZXNzIGtleS1mcmFtZSBhZGRpdGlvbi4KKzc3MDhlNjA5IE1lcmdlICJkZXRlY3QgZmxhdG5lc3MgaW4gYmxvY2tzIGFuZCBmYXZvciBEQyBwcmVkaWN0aW9uIgorMDZiMTUwM2UgTWVyZ2UgImFkZCBjb21tZW50IGFib3V0IHRoZSBrTGV2ZWxzRnJvbURlbHRhW11bXSBMVVQgZ2VuZXJhdGlvbiIKKzU5MzUyNTljIGFkZCBjb21tZW50IGFib3V0IHRoZSBrTGV2ZWxzRnJvbURlbHRhW11bXSBMVVQgZ2VuZXJhdGlvbgorZTMzMTJlYTYgZGV0ZWN0IGZsYXRuZXNzIGluIGJsb2NrcyBhbmQgZmF2b3IgREMgcHJlZGljdGlvbgorZWJjOWIxZWUgTWVyZ2UgIlZQTEJpdFJlYWRlciBidWdmaXg6IENhdGNoIGVycm9yIGlmIGJpdF9wb3MgPiBMQklUUyB0b28uIgorOTZhZDBlMGEgVlBMQml0UmVhZGVyIGJ1Z2ZpeDogQ2F0Y2ggZXJyb3IgaWYgYml0X3BvcyA+IExCSVRTIHRvby4KK2EwMTRlOWM5IHR1bmUgcXVhbnRpemF0aW9uIGJpYXNlcyB0b3dhcmQgaGlnaGVyIHByZWNpc2lvbgorMWU4OTg2MTkgYWRkIGhlbHBmdWwgUHJpbnRCbG9ja0luZm8oKSBmdW5jdGlvbgorNTk2YTZkNzMgbWFrZSB1c2Ugb2YgJ2V4dGVybicgY29uc2lzdGVudCBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKK2M4ZDQ4YzZlIE1lcmdlICJleHRyYWN0IHJhbmRvbSB1dGlscyB0byB0aGVpciBvd24gZmlsZSB1dGlsL3JhbmRvbS5bY2hdIgorOThhYTMzY2YgZXh0cmFjdCByYW5kb20gdXRpbHMgdG8gdGhlaXIgb3duIGZpbGUgdXRpbC9yYW5kb20uW2NoXQorNDMyYTcyM2UgTWVyZ2UgInN3aWc6IGFkZCBiYXNpYyBnbyBiaW5kaW5ncyIKK2ZhYjYxOGI1IE1lcmdlICJyZW5hbWUgbGlid2VicC5pIC0+IGxpYndlYnAuc3dpZyIKK2U0ZTdmY2Q2IHN3aWc6IGFkZCBiYXNpYyBnbyBiaW5kaW5ncworZDM0MDg3MjAgTWVyZ2UgImZhc3QgYXV0by1kZXRlcm1pbmVkIGZpbHRlcmluZyBzdHJlbmd0aCIKK2Y4YmZkNWNkIGZhc3QgYXV0by1kZXRlcm1pbmVkIGZpbHRlcmluZyBzdHJlbmd0aAorYWMwYmY5NTEgc21hbGwgY2xlYW4tdXAgaW4gRXhwYW5kTWF0cml4KCkKKzE5Mzk2MDdlIHJlbmFtZSBsaWJ3ZWJwLmkgLT4gbGlid2VicC5zd2lnCis0MzE0OGI2YyBmaWx0ZXJpbmc6IHByZWNvbXB1dGUgaWxpbWl0IGFuZCBoZXZfdGhyZXNob2xkCisxOGY5OTJlYyBzaW1wbGlmeSBmX2lubmVyIGNhbGN1bGF0aW9uIGEgbGl0dGxlCisyNDFkMTFmMSBhZGQgbWlzc2luZyBjb25zdAorODZjMDAzMWUgYWRkIGEgJ2Zvcm1hdCcgZmllbGQgdG8gV2ViUEJpdHN0cmVhbUZlYXR1cmVzCitkZGU5MWZkZSBEZW11eDogQ29ycmVjdCB0aGUgZXh0ZW5kZWQgZm9ybWF0IHZhbGlkYXRpb24KKzVkNmM1YmQyIGFkZCBlbnRyeSBmb3IgJy1yZXNpemUnIG9wdGlvbiBpbiBjd2VicCdzIG1hbgorN2MwOThkMTggVXNlIHNvbWUgZ2FtbWEtY3VydmUgcmFuZ2UgY29tcHJlc3Npb24gd2hlbiBjb21wdXRpbmcgVS9WIGF2ZXJhZ2UKKzBiMmIwNTA0IFVzZSBkZXRlcm1pbmlzdGljIHJhbmRvbS1kaXRoZXJpbmcgZHVyaW5nIFJHQi0+WVVWIGNvbnZlcnNpb24KKzhhMmZhMDk5IEFkZCBhIHNlY29uZCBtdWx0aS10aHJlYWQgbWV0aG9kCis3ZDZmMmRhMCBNZXJnZSAidXAgdG8gMjAlIGZhc3RlciBtdWx0aS10aHJlYWRlZCBkZWNvZGluZyIKKzI2NmY2M2VhIE1lcmdlICJsaWJ3ZWJwLmphcjogYnVpbGQgdy9KYXZhIDEuNiBmb3IgQW5kcm9pZCBjb21wYXQiCiswNTMyMTQ5YyB1cCB0byAyMCUgZmFzdGVyIG11bHRpLXRocmVhZGVkIGRlY29kaW5nCiszOGVmZGMyZSBTaW1wbGlmeSB0aGUgZ2lmMndlYnAgdG9vbDogbW92ZSB0aGUgb3B0aW1pemF0aW9uIGRldGFpbHMgdG8gdXRpbAorZGU4OTk1MTYgbGlid2VicC5qYXI6IGJ1aWxkIHcvSmF2YSAxLjYgZm9yIEFuZHJvaWQgY29tcGF0CitjYjIyMTU1MiBEZWNvZGUgYSBmdWxsIHJvdyBvZiBiaXRzdHJlYW0gYmVmb3JlIHJlY29uc3RydWN0aW5nCitkY2E4YTRkMyBNZXJnZSAiTkVPTi9zaW1wbGUgbG9vcGZpbHRlcjogYXZvaWQgcTQtcTcgcmVnaXN0ZXJzIgorOWU4NGQ5MDEgTWVyZ2UgIk5FT04vVHJhbnNmb3JtV0hUOiBhdm9pZCBxNC1xNyByZWdpc3RlcnMiCitmYzEwMjQ5YiBORU9OL3NpbXBsZSBsb29wZmlsdGVyOiBhdm9pZCBxNC1xNyByZWdpc3RlcnMKKzJmMDlkNjNlIE5FT04vVHJhbnNmb3JtV0hUOiBhdm9pZCBxNC1xNyByZWdpc3RlcnMKKzc3NTg1YTJiIE1lcmdlICJ1c2UgYSBtYWNyb2Z1bmMgZm9yIHNldHRpbmcgTnpDb2VmZnMgYml0cyIKK2QxNTU1MDdjIE1lcmdlICJ1c2UgSElOVF9HUkFQSCBhcyBpbWFnZV9oaW50IGZvciBnaWYgc291cmNlIgorOWM1NjE2NDYgTWVyZ2UgIm9ubHkgcHJpbnQgR0lGX0RJU1BPU0VfV0FSTklORyBvbmNlIgorMDU4Nzk4NjUgdXNlIEhJTlRfR1JBUEggYXMgaW1hZ2VfaGludCBmb3IgZ2lmIHNvdXJjZQorMGIyOGQ3YWIgdXNlIGEgbWFjcm9mdW5jIGZvciBzZXR0aW5nIE56Q29lZmZzIGJpdHMKK2Y5YmJjMmEwIFNwZWNpYWwtY2FzZSBzcGFyc2UgdHJhbnNmb3JtCiswMDEyNTE5NiBnaWYyd2VicDogZGV0ZWN0IGFuZCBmbGF0dGVuIHVuaWZvcm1seSBzaW1pbGFyIGJsb2NrcworMGRlYWYwZmEgb25seSBwcmludCBHSUZfRElTUE9TRV9XQVJOSU5HIG9uY2UKKzZhOGMwZWI3IE1lcmdlICJzbWFsbCBvcHRpbWl6YXRpb24gaW4gc2VnbWVudC1zbW9vdGhpbmcgbG9vcCIKK2Y3MTQ2YmMxIHNtYWxsIG9wdGltaXphdGlvbiBpbiBzZWdtZW50LXNtb290aGluZyBsb29wCis1YTc1MzNjZSBzbWFsbCBnaWYyd2VicCBmaXgKKzRkZjBjODllIE1lcmdlIGNoYW5nZXMgSWM2OTc2NjBjLEkyNzI4NTUyMQorNWIyZTZiZDMgQW5kcm9pZC5tazogYWRkIGEgZHdlYnAgdGFyZ2V0CitmOTEwYTg0ZSBBbmRyb2lkLm1rOiB1cGRhdGUgYnVpbGQgZmxhZ3MKKzYzZjlhYmE0IHNwZWNpYWwtY2FzZSBXSFQgdHJhbnNmb3JtIHdoZW4gdGhlcmUncyBvbmx5IERDCis4MDkxMWFlZiBNZXJnZSAiNy04JSBmYXN0ZXIgZGVjb2RpbmcgYnkgcmV3cml0aW5nIEdldENvZWZmcygpIgorNjA2YzQzMDQgZ2lmMndlYnA6IEltcHJvdmVkIGNvbXByZXNzaW9uIGZvciBsb3NzeSBhbmltYXRlZCBXZWJQCitmYjg4N2Y3ZiBnaWYyd2VicDogRGlmZmVyZW50IGttaW4va21heCBkZWZhdWx0cyBmb3IgbG9zc3kgYW5kIGxvc3NsZXNzCisyYTk4MTM2NiA3LTglIGZhc3RlciBkZWNvZGluZyBieSByZXdyaXRpbmcgR2V0Q29lZmZzKCkKKzkyZDQ3ZTRjIGltcHJvdmUgVlA4TCBzaWduYXR1cmUgZGV0ZWN0aW9uIGJ5IGNoZWNraW5nIHRoZSB2ZXJzaW9uIGJpdHMgdG9vCis1Y2Q0M2U0MyBBZGQgLWluY3JlbWVudGFsIG9wdGlvbiB0byBkd2VicAorNTRiOGUzZjYgd2VicG11eDogRGlzcGxheUluZm8oKTogcmVtb3ZlIHVubmVjZXNzYXJ5IGVycm9yIGNoZWNrcy4KKzQwYWUzNTIwIGZpeCBtZW1sZWFrIGluIFdlYlBJRGVsZXRlKCkKK2Q5NjYyNjU4IG11eC5oIGRvYzogV2ViUE11eEdldEZyYW1lKCkgY2FuIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1IgdG9vLgorMGU2NzQ3Zjggd2VicG11eCAtaW5mbzogZGlzcGxheSBkaW1lbnNpb25zIGFuZCBoYXNfYWxwaGEgcGVyIGZyYW1lCitkNzhhODJjNCBTYW5pdHkgY2hlY2sgZm9yIHVuZGVyZmxvdworODQ5OGY0YmYgTWVyZ2UgInJlbW92ZSAtV3NoYWRvdyB3YXJuaW5ncyIKK2U4OWM2ZmM4IEF2b2lkIGEgcG90ZW50aWFsIG1lbWxlYWsKKzNlYmUxNzU3IE1lcmdlICJicmVhayBkb3duIHRoZSBwcm9iYSA0RC1hcnJheSBpbnRvIHNvbWUgaGFuZHkgc3RydWN0cyIKKzZhNDQ1NTBhIGJyZWFrIGRvd24gdGhlIHByb2JhIDRELWFycmF5IGludG8gc29tZSBoYW5keSBzdHJ1Y3RzCisyZjVlODkzNCByZW1vdmUgLVdzaGFkb3cgd2FybmluZ3MKK2JmM2EyOWIzIE1lcmdlICJhZGQgcHJvcGVyIFdFQlBfSEFWRV9HSUYgYW5kIFdFQlBfSEFWRV9HTCBmbGFncyIKKzJiMGE3NTkzIE1lcmdlICJmaXggc29tZSB3YXJuaW5ncyBmcm9tIHN0YXRpYyBhbmFseXNpcyIKKzIyZGQwN2NlIG11eC5oOiBTb21lIGRvYyBjb3JyZWN0aW9ucworNzlmZjAzNDYgYWRkIHByb3BlciBXRUJQX0hBVkVfR0lGIGFuZCBXRUJQX0hBVkVfR0wgZmxhZ3MKK2Q1MWY0NWYwIGZpeCBzb21lIHdhcm5pbmdzIGZyb20gc3RhdGljIGFuYWx5c2lzCitkMTM0MzA3YiBmaXggY29udmVyc2lvbiB3YXJuaW5nIG9uIE1TVkMKK2Q1MzhjZWE4IGdpZjJ3ZWJwOiBTdXBwb3J0IGEgJ21pbicgYW5kICdtYXgnICBrZXkgZnJhbWUgaW50ZXJ2YWwKKzgwYjU0ZTFjIGFsbG93IHNlYXJjaCB3aXRoIHRva2VuIGJ1ZmZlciBsb29wIGFuZCBmaXggUEFSVElUSU9OMCBwcm9ibGVtCitiN2Q0ZTA0MiBhZGQgVlA4RXN0aW1hdGVUb2tlblNpemUoKQorMTBmZGRmNTMgZW5jL3F1YW50LmM6IHNpbGVuY2UgYSB3YXJuaW5nCiszOTljZDQ1NiBNZXJnZSAiZml4IGNvbXBpbGUgZXJyb3Igb24gQVJNL2djYyIKKzlmMjQ1MTllIGVuY29kZXI6IG1pc2MgcmF0ZS1yZWxhdGVkIGZpeGVzCitjNjYzYmIyMSBNZXJnZSAic2ltcGxpZnkgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoKSBhcmcgcGFzc2luZyIKK2ZhNDZiMzEyIERlbXV4Lmg6IENvcnJlY3QgYSBtZXRob2QgbmFtZSByZWZlcmVuY2UKK2Y4Mzk4YzlkIGZpeCBjb21waWxlIGVycm9yIG9uIEFSTS9nY2MKK2Y2OTFmMGU0IHNpbXBsaWZ5IFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCkgYXJnIHBhc3NpbmcKKzQyNTQyYmU4IHVwIHRvIDYlIGZhc3RlciBlbmNvZGluZyB3aXRoIGNsYW5nIGNvbXBpbGVyCis5MzQwMmYwMiBtdWx0aS10aHJlYWRlZCBzZWdtZW50IGFuYWx5c2lzCis3ZTJkNjU5NSBNZXJnZSAicmVtb3ZlIHRoZSBQQUNLKCkgYml0LXBhY2tpbmcgdHJpY2tzIgorYzEzZmVjZjkgcmVtb3ZlIHRoZSBQQUNLKCkgYml0LXBhY2tpbmcgdHJpY2tzCisyZmQwOTFjOSBNZXJnZSAidXNlIE5VTEwgZm9yIGxmX3N0YXRzXyB0ZXN0aW5nLCBub3QgYm9vbCIKK2IxMWM5ZDYyIGR3ZWJwOiB1c2UgZGVmYXVsdCBkY3RfbWV0aG9kCis0YmI4NDY1ZiBNZXJnZSAiKGRlKW11eC5oOiB3cmFwIHBzZXVkby1jb2RlIGluIC8qICovIgorY2ZiNTZiMTcgbWFrZSAtcGFzcyBvcHRpb24gd29yayB3aXRoIHRva2VuIGJ1ZmZlcnMKKzU0MTZhYWI0IChkZSltdXguaDogd3JhcCBwc2V1ZG8tY29kZSBpbiAvKiAqLworMzVkYmEzMzcgdXNlIE5VTEwgZm9yIGxmX3N0YXRzXyB0ZXN0aW5nLCBub3QgYm9vbAorNzMzYTdmYWEgZW5jLT5JdGVyYXRvciBtZW1vcnkgY2xlYW51cAorZTgxZmFjODYgQWRkIHN1cHBvcnQgZm9yICJubyBibGVuZCIgaW4gd2VicG11eCBiaW5hcnkKKzNiODBiYzQ4IGdpZjJ3ZWJwOiBTZXBhcmF0ZSBvdXQgZWFjaCBzdGVwIGludG8gYSBtZXRob2QKK2JlZjdlOWNjIEFkZCBkb2MgcHJlY2lzaW9uIGFib3V0IGRlbXV4IG9iamVjdCBrZWVwaW5nIHBvaW50ZXJzIHRvIGRhdGEuCis2MTQwNWExNCBkd2VicDogZW5hYmxlIHN0ZG91dCBvdXRwdXQgd2l0aCBXSUMKKzZlYWJiODg2IE1lcmdlICJBbmltYXRlZCBXZWJQOiBhZGQgImRvIG5vIGJsZW5kIiBvcHRpb24gdG8gc3BlYyIKK2JlMjBkZWNiIGZpeCBjb21waWxhdGlvbiBmb3IgQklUUyAyNAorZTU4Y2MxMzcgTWVyZ2UgImR3ZWJwOiBzL3Vuc2lnbmVkIGNoYXIvdWludDhfdC8iCis3MjUwMWQ0MyBkd2VicDogcy91bnNpZ25lZCBjaGFyL3VpbnQ4X3QvCisyYzk2MzNlOCBNZXJnZSAiZ2lmMndlYnA6IEluc2VydCBpbmRlcGVuZGVudCBmcmFtZXMgYXQgcmVndWxhciBpbnRlcnZhbHMuIgorZjBkNmExNGIgZ2lmMndlYnA6IEluc2VydCBpbmRlcGVuZGVudCBmcmFtZXMgYXQgcmVndWxhciBpbnRlcnZhbHMuCitiMjVhNmZiZiB5dXYuaDogZml4IGluZGVudAorZWRlMzYwMmUgTWVyZ2UgImNvc21ldGljczogZml4IGluZGVudCIKKzNhNjUxMjJhIGR3ZWJwOiBmaXggc3Rkb3V0IHJlbGF0ZWQgb3V0cHV0CiszODhhNzI0OSBjb3NtZXRpY3M6IGZpeCBpbmRlbnQKKzRjNzMyMmM4IE1lcmdlICJkc3A6IG1zdmMgY29tcGF0aWJpbGl0eSIKK2Q1MGM3ZTMyIE1lcmdlICI1LTclIGZhc3RlciBTU0UyIHZlcnNpb25zIG9mIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zIgorYjhhYjc4NDcgTWVyZ2UgInNpbXBsaWZ5IHVwc2FtcGxlciBjYWxsczogb25seSBhbGxvdyAnYm90dG9tJyB0byBiZSBOVUxMIgorZGY2Y2ViZmEgNS03JSBmYXN0ZXIgU1NFMiB2ZXJzaW9ucyBvZiBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworYWQ2YWMzMmQgc2ltcGxpZnkgdXBzYW1wbGVyIGNhbGxzOiBvbmx5IGFsbG93ICdib3R0b20nIHRvIGJlIE5VTEwKK2E1ZThhZmFmIG91dHB1dCB0byBzdGRvdXQgaWYgZmlsZSBuYW1lIGlzICItIgorZjM1ODQ1MGYgZHNwOiBtc3ZjIGNvbXBhdGliaWxpdHkKKzQzYTdjOGViIE1lcmdlICJjb3NtZXRpY3MiCis0YzVmMTljMSBNZXJnZSAiYml0X3JlYWRlci5oOiBjb3NtZXRpY3MiCitmNzJmYWI3MCBjb3NtZXRpY3MKKzE0ZGQ1ZTc4IGZpeCBjb25zdC1uZXNzCitiMjBhZWM0OSBNZXJnZSAiU3VwcG9ydCBmb3IgJ2RvIG5vdCBibGVuZCcgb3B0aW9uIGluIHZ3ZWJwIgorZGNmNjUyMjIgU3VwcG9ydCBmb3IgJ2RvIG5vdCBibGVuZCcgb3B0aW9uIGluIHZ3ZWJwCitkNWJhZDAzMyBBbmltYXRlZCBXZWJQOiBhZGQgImRvIG5vIGJsZW5kIiBvcHRpb24gdG8gc3BlYworYTJmNWY3M2QgTWVyZ2UgIlN1cHBvcnQgZm9yICJEbyBub3QgYmxlbmQiIGluIG11eCBhbmQgZGVtdXggbGlicmFyaWVzIgorZTA4MWYyZjMgUGFjayBjb2RlICYgZXh0cmFfYml0cyB0byBTdHJ1Y3QgKFZQOExQcmVmaXhDb2RlKS4KKzYyODQ4NTRiIFN1cHBvcnQgZm9yICJEbyBub3QgYmxlbmQiIGluIG11eCBhbmQgZGVtdXggbGlicmFyaWVzCitmNDg2YWFhOSBNZXJnZSAic2xpZ2h0bHkgZmFzdGVyIFBhcnNlSW50cmFNb2RlIgorZDE3MTg2MzIgc2xpZ2h0bHkgZmFzdGVyIFBhcnNlSW50cmFNb2RlCiszY2VjYThhZCBiaXRfcmVhZGVyLmg6IGNvc21ldGljcworNjkyNTdmNzAgQ3JlYXRlIExVVCBmb3IgUHJlZml4RW5jb2RlLgorOTg4YjcwODQgYWRkIFdlYlBXb3JrZXJFeGVjdXRlKCkgZm9yIGNvbnZlbmllbnQgYnlwYXNzCiswNmUyNDk4NyBNZXJnZSAiVlA4RW5jSXRlcmF0b3IgY2xlYW4tdXAiCitkZTRkNGFkNSBWUDhFbmNJdGVyYXRvciBjbGVhbi11cAorN2JiZTk1MjkgTWVyZ2UgImNvc21ldGljczogdGhyZWFkLmM6IGRyb3AgYSByZWR1bmRhbnQgY29tbWVudCIKK2RhNDExNDg1IGNvc21ldGljczogdGhyZWFkLmM6IGRyb3AgYSByZWR1bmRhbnQgY29tbWVudAorZmViNGI2ZTYgdGhyZWFkLmg6ICNpZmRlZiB3aGVuIGNoZWNraW5nIFdFQlBfVVNFX1RIUkVBRAorODkyNGEzYTcgdGhyZWFkLmM6IGRyb3AgV2ViUFdvcmtlciBwcmVmaXggZnJvbSBzdGF0aWMgZnVuY3MKKzFhZWQ4ZjJhIE1lcmdlICJmaXggaW5kZW50IgorNDAzOGVkMTUgZml4IGluZGVudAorMTY5M2ZkOWIgRGVtdXg6IEEgbmV3IHN0YXRlIFdFQlBfREVNVVhfUEFSU0VfRVJST1IKKzhkY2FlOGIzIGZpeCByZXNjYWxpbmctd2l0aC1hbHBoYSBpbmFjY3VyYWN5CisxMTI0OWFiZiBNZXJnZSBjaGFuZ2VzIEk5YjRkYzM2YyxJNGUwZWVmNGQKKzUyNTA4YTFmIE11eDogc3VwcG9ydCBwYXJzaW5nIHVua25vd24gY2h1bmtzIHdpdGhpbiBhIGZyYW1lL2ZyYWdtZW50LgorMDVkYjA1NzIgV2ViUE11eFNldENodW5rOiByZW1vdmUgdW51c2VkIHZhcmlhYmxlCis4YmExYmY2MSBTdHJpY3RlciBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgYWxwaGEgd2hlbiB3cml0aW5nIGxvc3NsZXNzIGltYWdlcworYTAzYzM1MTYgRGVtdXg6IFdlYlBJdGVyYXRvciBub3cgYWxzbyBkZW5vdGVzIGlmIHRoZSBmcmFtZSBoYXMgYWxwaGEuCis2ZGY3NDNhMyBEZWNvZGVyOiBoYW5kbGUgZnJhZ21lbnRzIGNhc2UgY29ycmVjdGx5IHRvby4KK2ZhYTRiMDdlIFN1cHBvcnQgZm9yIHVua25vd24gY2h1bmtzIGluIG11eCBsaWJyYXJ5Cis3ZDYwYmJjNiBTcGVlZCB1cCBIYXNoQ2hhaW5GaW5kQ29weSBmdW5jdGlvbi4KKzY2NzQwMTQwIFNwZWVkdXAgQWxwaGEgcGxhbmUgZW5jb2RpbmcuCitiNzM0NmExZSAwLjEgJSBzcGVlZHVwIHRvIGRlY29kaW5nCitjNjA2MTgyZSB3ZWJwLWNvbnRhaW5lci1zcGVjOiBUaWdodGVuIGxhbmd1YWdlIGFkZGVkIGJ5IGxhc3QKK2EzNGE1MDI5IHBuZ2RlYzogb3V0cHV0IGVycm9yIG1lc3NhZ2VzIGZyb20gbGlicG5nCitlODRjNjI1ZCBNZXJnZSAiRGV0ZWN0IGNhbnZhcyBhbmQgaW1hZ2Ugc2l6ZSBtaXNtYXRjaCBpbiBkZWNvZGVyLiIKK2Y2MjZmZTJlIERldGVjdCBjYW52YXMgYW5kIGltYWdlIHNpemUgbWlzbWF0Y2ggaW4gZGVjb2Rlci4KK2Y1ZmJkZWUwIGRlbXV4OiBzdHJpY3RlciBpbWFnZSBib3VuZHMgY2hlY2sKKzMwYzgxNThhIGFkZCBleHRyYSBhc3NlcnQgaW4gSHVmZm1hbiBkZWNvZGUgY29kZQorODk2N2I5ZjMgU1NFMiBmb3IgbG9zc2xlc3MgZGVjb2RpbmcgKGNyaXRpY2FsKSBmdW5jdGlvbnMuCis2OTlkODBlYSBKdW1wLWxvb2t1cCBmb3IgSHVmZm1hbiBjb2RpbmcKK2MzNDMwN2FiIGZpeCBzb21lIFZTOSB3YXJuaW5ncyBhYm91dCB0eXBlIGNvbnZlcnNpb24KK2VlYWRhMzVjIHBuZ2RlYzogYWRkIG1pc3NpbmcgaW5jbHVkZQorNTRiNjUxMDggZ2lmMndlYnA6IElmIGFsaWduaW5nIHRvIGV2ZW4gb2Zmc2V0cywgZXh0cmEgcGl4ZWxzIHNob3VsZCBiZSB0cmFuc3BhcmVudAorMGJjZjVjZTMgTWVyZ2UgInJlbW92ZSBhIG1hbGxvYygpIGluIGNhc2Ugd2UncmUgdXNpbmcgb25seSBGSUxURVJfTk9ORSBmb3IgYWxwaGEiCisyYzA3MTQzYiByZW1vdmUgYSBtYWxsb2MoKSBpbiBjYXNlIHdlJ3JlIHVzaW5nIG9ubHkgRklMVEVSX05PTkUgZm9yIGFscGhhCithNGQ1ZjU5ZCBGYXN0ZXIgbG9zc2xlc3MgZGVjb2RpbmcKK2ZkNTNiYjc1IE1lcmdlICJhbHRlcm5hdGUgTFVULWJhc2UgcmV2ZXJzZS1iaXRzIGNvZGUiCitkMWMxNjZlZiBNZXJnZSAiQ29udGFpbmVyIHNwZWM6IGEgY2xhcmlmaWNhdGlvbiBvbiBiYWNrZ3JvdW5kIGNvbG9yLiIKK2ZkYjkxNzc5IFJlbmFtZSBhIG1ldGhvZAorNWU5Njc1MzIgQ29udGFpbmVyIHNwZWM6IGEgY2xhcmlmaWNhdGlvbiBvbiBiYWNrZ3JvdW5kIGNvbG9yLgorMzBlNzdkMGYgTWVyZ2UgYnJhbmNoICcwLjMuMCcKKzFiNjMxZTI5IGFsdGVybmF0ZSBMVVQtYmFzZSByZXZlcnNlLWJpdHMgY29kZQorMjRjYzMwN2EgfjIwJSBmYXN0ZXIgbG9zc2xlc3MgZGVjb2RpbmcKKzMxM2Q4NTNmIFNwZWVkdXAgZm9yIGRlY29kaW5nIGxvc3NsZXNzIFdlYlAgcGhvdG9ncmFwaHM6CisyNGVlMDk4YSBjaGFuZ2UgdGhlIGJ5dGVzX3Blcl9waXhlbHNfIGZpZWxkIGludG8gbW9yZSBldm9jYXRpdmUgdXNlXzhiX2RlY29kZQorMmEwNGIwMzQgdXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4zLjEtcmMyLCB0YWc6IHYwLjMuMSkKKzcyODg5NTBiIFJlZ3Jlc3Npb24gZml4IGZvciBhbHBoYSBjaGFubmVscyB1c2luZyBjb2xvciBjYWNoZToKKzJlMzc3YjUzIHdpY2RlYzogc2lsZW5jZSBhIGZvcm1hdCB3YXJuaW5nCithZDllNDJhNiBtdXhlZGl0OiBzaWxlbmNlIHNvbWUgdW5pbml0aWFsaXplZCB3YXJuaW5ncworMzMwN2MxNjMgRG9uJ3Qgc2V0IGFscGhhLWNoYW5uZWwgdG8gMHhmZiBmb3IgYWxwaGEtPmdyZWVuIHVwbGlmdAorNTEzMDc3MGMgTWVyZ2UgIndpY2RlYzogc2lsZW5jZSBhIGZvcm1hdCB3YXJuaW5nIgorYTM3ZWZmNDcgUmVncmVzc2lvbiBmaXggZm9yIGFscGhhIGNoYW5uZWxzIHVzaW5nIGNvbG9yIGNhY2hlOgorMjQxY2Y5OWIgTWVyZ2UgIm11eGVkaXQ6IHNpbGVuY2Ugc29tZSB1bmluaXRpYWxpemVkIHdhcm5pbmdzIgorYzhmOWM4NGQgUmVncmVzc2lvbiBmaXggZm9yIGFscGhhIHVuZmlsdGVyaW5nOgorMTRjZDVjNmMgbXV4ZWRpdDogc2lsZW5jZSBzb21lIHVuaW5pdGlhbGl6ZWQgd2FybmluZ3MKK2EzNjhkYjgxIGRlYy92cDhsOiBxdWlldCB2czkgeDY0IHR5cGUgY29udmVyc2lvbiB3YXJuaW5nCitmZmFlOWYzMSB3aWNkZWM6IHNpbGVuY2UgYSBmb3JtYXQgd2FybmluZworOGNmMDcwMWUgQWxwaGEgZW5jb2Rpbmc6IG5ldmVyIGZpbHRlciBpbiBjYXNlIG9mIE5PX0NPTVBSRVNTSU9OCis4MjVlNzNiMSB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjMuMS1yYzEpCithYmY2ZjY5MSB1cGRhdGUgTkVXUworNWE5MmMxYTUgYnVtcCB2ZXJzaW9uIHRvIDAuMy4xCis4NmRhZjc3YyBzdG9yZSB0b3AgWS9VL1Ygc2FtcGxlcyBpbiBwYWNrZWQgZmFzaGlvbgorNjdiYzM1M2UgUmV2ZXJ0ICJhZGQgV2ViUEJsZW5kQWxwaGEoKSBmdW5jdGlvbiB0byBibGVuZCBjb2xvcnMgYWdhaW5zdCBiYWNrZ3JvdW5kIgorMDY4ZGI1OWUgSW50ZXJ0d2luZWQgZGVjb2Rpbmcgb2YgYWxwaGEgYW5kIFJHQgorMzhjYzAxMTQgU2ltcGxpZnkgZm9yd2FyZC1XSFQgKyBTU0UyIHZlcnNpb24KKzNmYTU5NWE1IFN1cHBvcnQgZGVjb2RpbmcgdXB0byBnaXZlbiByb3cgaW4gREVDT0RFX0RBVEFfRlVOQworNTIwZjAwNWYgRGVxdWFudGl6ZUxldmVscygpOiBBZGQgJ3JvdycgYW5kICdudW1fcm93cycgYXJncworNDczNzRiODIgQWxwaGEgdW5maWx0ZXIgZm9yIGdpdmVuIHNldCBvZiByb3dzCitmMzIwOTdlMCBwcm9iZSBpbnB1dCBmaWxlIGFuZCBxdWljay1jaGVjayBmb3IgV2ViUCBmb3JtYXQuCithMmFlZDFkMCBjb25maWd1cmU6IGltcHJvdmUgZ2wvZ2x1dCBsaWJyYXJ5IHRlc3QKK2M3ZTg5Y2JiIHVwZGF0ZSBjb3B5cmlnaHQgdGV4dAorYTAwMzgwZDIgY29uZmlndXJlOiByZW1vdmUgdXNlIG9mIEFTX1ZBUl9BUFBFTkQKK2E5NGE4OGRkIGZpeCBFWElGIHBhcnNpbmcgaW4gUE5HCithNzFlNWQ4NCBhZGQgZG9jIHByZWNpc2lvbiBmb3IgV2ViUFBpY3R1cmVDb3B5KCkgYW5kIFdlYlBQaWN0dXJlVmlldygpCis4Mjg3MDEyZSByZW1vdmUgZGF0YXR5cGUgcXVhbGlmaWVyIGZvciB2bW52CitlMTkwODQzMCBmaXggYSBtZW1vcnkgbGVhayBpbiBnaWYyd2VicAorMGIxOGI5ZWUgZml4IHR3byBtaW5vciBtZW1vcnkgbGVha3MgaW4gd2VicG11eAorZGI1MDk1ZDUgcmVtb3ZlIHNvbWUgY3J1ZnQgZnJvbSBzd2lnL2xpYndlYnAuamFyCis4NTBlOTU2ZiBSRUFETUU6IHVwZGF0ZSBzd2lnIG5vdGVzCitiZGRkOWIwYSBzd2lnL3B5dGhvbjogYWRkIG1pbmltYWwgZG9jdW1lbnRhdGlvbgorZDU3M2E4ZDUgc3dpZzogYWRkIHB5dGhvbiBlbmNvZGUgc3VwcG9ydAorNmI5MzE4NzUgc3dpZy9qYXZhOiByZWR1Y2Ugd3JhcHBlciBmdW5jdGlvbiBjb2RlIGR1cGxpY2F0aW9uCis2ZmU1MzZmNCBzd2lnL2phdmE6IHJld29yayB1aW50OF90IHR5cGVtYXAKK2EyZWE0NjQzIEZpeCB0aGUgYnVnIGluIEFwcGx5UGFsZXR0ZS4KKzdiYjI4ZDJhIHdlYnAvbG9zc2xlc3M6IGZpeCBiaWcgZW5kaWFuIEJHUkEgb3V0cHV0CitmMDM2ZDRiZiBTcGVlZCB1cCBBcHBseVBhbGV0dGUgZm9yIEFSR0IgcGl4ZWxzLgorODExMmM4Y2YgcmVtb3ZlIHNvbWUgd2FybmluZ3M6CitjYzEyOGUwYiBGdXJ0aGVyIHJlZHVjZSBtZW1vcnkgdG8gZGVjb2RlIGxvc3N5K2FscGhhIGltYWdlcworMDdkYjcwZDIgZml4IGZvciBiaWctZW5kaWFuCitlZGE4YTdkZSBnaWYyd2VicDogRml4IHNpZ25lZC91bnNpZ25lZCBjb21wYXJpc29uIG1pc21hdGNoCiszMWYzNDZmZSBNYWtlZmlsZS52YzogZml4IGxpYndlYnBkZW11eCBkbGwgdmFyaWFibGUgdHlwbworNmM3NmQyOGUgc3dpZzogYWRkIHB5dGhvbiAoZGVjb2RlKSBzdXBwb3J0CitiNGY1YmI2YyBzd2lnOiBjb3NtZXRpY3MKKzQ5OGQ0ZGQ2IFdlYlAtTG9zc2xlc3MgZW5jb2RpbmcgaW1wcm92ZW1lbnRzLgorMjZlNzI0NDIgc3dpZzogaWZkZWYgc29tZSBKYXZhIHNwZWNpZmljIGNvZGUKKzhlY2VjNjg2IGNvbmZpZ3VyZTogYWRkIHdhcm5pbmcgcmVsYXRlZCBmbGFncworZTY3NmIwNDMgY29uZmlndXJlOiBhZGQgR0xVVCBkZXRlY3Rpb247IGJ1aWxkIHZ3ZWJwCitiMGZmYzQzNyBBbHBoYSBkZWNvZGluZzogc2lnbmlmaWNhbnRseSByZWR1Y2UgbWVtb3J5IHVzYWdlCisyMGFhN2E4ZCBjb25maWd1cmU6IGFkZCAtLWVuYWJsZS1ldmVyeXRoaW5nCitiODMwN2NjMCBjb25maWd1cmUuYWM6IGFkZCBzb21lIGhlbHBlciBtYWNyb3MKKzk4MGU3YWU5IFJlbW92ZSB0aGUgZ2NjIGNvbXBpbGF0aW9uIGNvbW1lbnRzCis3ZjI1ZmY5OSBnaWYyd2VicDogRml4IElDQyBhbmQgWE1QIHN1cHBvcnQKK2Q4ZTUzMjExIEFkZCBtaXNzaW5nIG5hbWUgdG8gQVVUSE9SUworMTFlZGY1ZTIgRGVtdXg6IEZpeCBhIHBvdGVudGlhbCBtZW1sZWFrCitjN2I5MjE4NCBkb24ndCBmb3J3YXJkIGRlY2xhcmUgZW51bXMKKzdhNjUwYzZhIHByZXZlbnQgc2lnbmVkIGludCBvdmVyZmxvdyBpbiBsZWZ0IHNoaWZ0IG9wcworMzFiZWEzMjQgYWRkIHByZWNpc2lvbiBhYm91dCBkeW5hbWljIG91dHB1dCByZWFsbG9jYXRpb24gd2l0aCBJRGVjb2RlcgorYzIyODc3ZjcgQWRkIGluY3JlbWVudGFsIHN1cHBvcnQgZm9yIGV4dGVuZGVkIGZvcm1hdCBmaWxlcworNTA1MTI0NWYgTWFrZWZpbGUudmM6IGhhdmUgJ2FsbCcgdGFyZ2V0IGJ1aWxkIGV2ZXJ5dGhpbmcKKzgxOTFkZWNhIE1ha2VmaWxlLnZjOiBmbGFncyBjbGVhbnVwCitiOWQ3NDczNSBNYWtlZmlsZS52YzogZHJvcCAvRkQgZmxhZworNTU2OGRiY2YgdXBkYXRlIGdpdGlnbm9yZQorZjRjN2I2NTQgV2ViUEVuY29kZTogQW4gYWRkaXRpb25hbCBjaGVjay4gU3RhcnQgVlA4RW5jTG9vcC9WUDhFbmNUb2tlbkxvb3Agb25seSBpZiBWUDhFbmNTdGFydEFscGhhIHN1Y2NlZWRlZC4KKzFmYjA0YmVjIHBuZ2RlYzogQXZvaWQgYSBkb3VibGUtZnJlZS4KK2RjYmIxY2E1IGFkZCBXZWJQQmxlbmRBbHBoYSgpIGZ1bmN0aW9uIHRvIGJsZW5kIGNvbG9ycyBhZ2FpbnN0IGJhY2tncm91bmQKK2JjOWY1ZmJlIGNvbmZpZ3VyZS5hYzogYWRkIEFNX1BST0dfQVIgZm9yIGF1dG9tYWtlID49IDEuMTIKK2JmODY3YmYyIFR1bmVkIGNyb3NzX2NvbG9yIHBhcmFtZXRlciAoc3RlcCkgZm9yIGxvd2VyIHF1YWwKKzkwZTJlYzVhIE1lcmdlICJwcm9iZSBpbnB1dCBmaWxlIGFuZCBxdWljay1jaGVjayBmb3IgV2ViUCBmb3JtYXQuIgorNzE4MGQ3ZmYgTWVyZ2UgInVwZGF0ZSBjb3B5cmlnaHQgdGV4dCIKKzgzMGY3MmI3IHByb2JlIGlucHV0IGZpbGUgYW5kIHF1aWNrLWNoZWNrIGZvciBXZWJQIGZvcm1hdC4KKzJjY2Y1OGQ2IGNvbmZpZ3VyZTogaW1wcm92ZSBnbC9nbHV0IGxpYnJhcnkgdGVzdAorZDY0MDYxNGQgdXBkYXRlIGNvcHlyaWdodCB0ZXh0CitjMjExM2FkNCBNZXJnZSAiY29uZmlndXJlOiByZW1vdmUgdXNlIG9mIEFTX1ZBUl9BUFBFTkQiCis5MzI2YTU2ZiBjb25maWd1cmU6IHJlbW92ZSB1c2Ugb2YgQVNfVkFSX0FQUEVORAorZWE2M2Q2MTkgZml4IGEgdHlwZSB3YXJuaW5nIG9uIFZTOSB4ODYKK2JlYzExMDkyIGZpeCBFWElGIHBhcnNpbmcgaW4gUE5HCitiNmU2NWYzZCBNZXJnZSAiZml4IHdhcm5pbmdzIGZvciB2czkgeDY0IgorNDM4OTQ2ZGMgZml4IHdhcm5pbmdzIGZvciB2czkgeDY0CitmNDcxMGUzYiBjb2xsZWN0IG1hY3JvYmxvY2sgcmVjb25zdHJ1Y3Rpb24gZGF0YSBpbiBWUDhNQkRhdGEgc3RydWN0CisyM2QyOGUyMSBhZGQgZG9jIHByZWNpc2lvbiBmb3IgV2ViUFBpY3R1cmVDb3B5KCkgYW5kIFdlYlBQaWN0dXJlVmlldygpCis1MThmMmNkNyBjb3NtZXRpY3M6IGdpZjJ3ZWJwOiBmaXggaW5kZW50CithZjM1OGU2OCBNZXJnZSAicmVtb3ZlIGRhdGF0eXBlIHF1YWxpZmllciBmb3Igdm1udiIKKzNmZTkxNjM1IHJlbW92ZSBkYXRhdHlwZSBxdWFsaWZpZXIgZm9yIHZtbnYKKzc2NGZkZmZhIGZpeCBhIG1lbW9yeSBsZWFrIGluIGdpZjJ3ZWJwCiszZTU5YTc0ZCBmaXggdHdvIG1pbm9yIG1lbW9yeSBsZWFrcyBpbiB3ZWJwbXV4Cis0N2I5ODYyZiBNZXJnZSAiUkVBRE1FOiB1cGRhdGUgc3dpZyBub3RlcyIKKzMyNWQxNWZmIHJlbW92ZSBzb21lIGNydWZ0IGZyb20gc3dpZy9saWJ3ZWJwLmphcgorNGE3NjI3YzIgUkVBRE1FOiB1cGRhdGUgc3dpZyBub3RlcworNWRhODFlMzMgTWVyZ2UgInN3aWcvcHl0aG9uOiBhZGQgbWluaW1hbCBkb2N1bWVudGF0aW9uIgorZjM5ZTA4ZjIgTWVyZ2UgInN3aWc6IGFkZCBweXRob24gZW5jb2RlIHN1cHBvcnQiCis2Y2E0YTNlMyBNZXJnZSAic3dpZy9qYXZhOiByZWR1Y2Ugd3JhcHBlciBmdW5jdGlvbiBjb2RlIGR1cGxpY2F0aW9uIgorOGY4NzAyYjAgTWVyZ2UgInN3aWcvamF2YTogcmV3b3JrIHVpbnQ4X3QgdHlwZW1hcCIKKzkxNDEzYmUyIHJlZHVjZSBtZW1vcnkgZm9yIFZQOE1CIGFuZCByZW1vdmUgYml0ZmllbGRzIHVzZQorNzQxMzM5NGUgRml4IHRoZSBtZW1vcnkgbGVhayBpbiBBcHBseUZpbHRlcnMuCisyMDUzYzJjZiBzaW1wbGlmeSB0aGUgYWxwaGEtZmlsdGVyIHRlc3RpbmcgbG9vcAorODI1YjY0ZGIgc3dpZy9weXRob246IGFkZCBtaW5pbWFsIGRvY3VtZW50YXRpb24KKzE0Njc3ZTExIHN3aWc6IGFkZCBweXRob24gZW5jb2RlIHN1cHBvcnQKK2E1YzI5N2M4IHN3aWcvamF2YTogcmVkdWNlIHdyYXBwZXIgZnVuY3Rpb24gY29kZSBkdXBsaWNhdGlvbgorYWQ0YTM2N2Qgc3dpZy9qYXZhOiByZXdvcmsgdWludDhfdCB0eXBlbWFwCiswZDI1ODc2YiB1c2UgdWludDhfdCBmb3IgaW52X3BhbGV0dGVbXQorYWZhMzQ1MGMgRml4IHRoZSBidWcgaW4gQXBwbHlQYWxldHRlLgorMmQ2YWM0MjIgTWVyZ2UgIndlYnAvbG9zc2xlc3M6IGZpeCBiaWcgZW5kaWFuIEJHUkEgb3V0cHV0IgorMmNhODM5Njggd2VicC9sb3NzbGVzczogZml4IGJpZyBlbmRpYW4gQkdSQSBvdXRwdXQKKzc0MjExMGNjIFNwZWVkIHVwIEFwcGx5UGFsZXR0ZSBmb3IgQVJHQiBwaXhlbHMuCisyNDUxZTQ3ZCBtaXNjIGNvZGUgY2xlYW51cAorODNkYjQwNDMgTWVyZ2UgInN3aWc6IGFkZCBweXRob24gKGRlY29kZSkgc3VwcG9ydCIKK2VlZWVhOGI1IE1lcmdlICJzd2lnOiBjb3NtZXRpY3MiCitkNWY5YjhmMyBNZXJnZSAibGlid2VicDogZml4IHZwOCBlbmNvZGVyIG1lbSBhbGxvYyBvZmZzZXR0aW5nIgorZDhlZGQ4MzUgbGlid2VicDogZml4IHZwOCBlbmNvZGVyIG1lbSBhbGxvYyBvZmZzZXR0aW5nCis4OTgzYjgzZSByZW1vdmUgdXNlIG9mIGJpdC1maWVsZHMgaW4gVlA4RkluZm8KKzg3YTRmY2EyIHJlbW92ZSBzb21lIHdhcm5pbmdzOgorYmE4Zjc0ZTIgTWVyZ2UgImZpeCBmb3IgYmlnLWVuZGlhbiIKK2E2NTA2N2ZhIE1lcmdlICJGdXJ0aGVyIHJlZHVjZSBtZW1vcnkgdG8gZGVjb2RlIGxvc3N5K2FscGhhIGltYWdlcyIKKzY0Yzg0NDg2IEZ1cnRoZXIgcmVkdWNlIG1lbW9yeSB0byBkZWNvZGUgbG9zc3krYWxwaGEgaW1hZ2VzCiszMzIxMzBiOSBNdXg6IG1ha2UgYSBmZXcgbWV0aG9kcyBzdGF0aWMKKzQ0MzcwNjE3IGZpeCBmb3IgYmlnLWVuZGlhbgorNTE5OWVhYjUgTWVyZ2UgImFkZCB1bmNvbXByZXNzZWQgVElGRiBvdXRwdXQgc3VwcG9ydCIKK2EzYWVkZTk3IGFkZCB1bmNvbXByZXNzZWQgVElGRiBvdXRwdXQgc3VwcG9ydAorZjk3NWI2N2YgTWVyZ2UgImdpZjJ3ZWJwOiBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gbWlzbWF0Y2giCis1ZmJjNzM0YiBNZXJnZSAiR2V0RmVhdHVyZXM6IERldGVjdCBpbnZhbGlkIFZQOFgvVlA4L1ZQOEwgZGF0YSIKK2Q1MDYwYzg3IE1lcmdlICJtdXguaDogQSBjb21tZW50IGZpeCArIHNvbWUgY29uc2lzdGVuY3kgZml4ZXMiCiszNTJkMGRlZSBHZXRGZWF0dXJlczogRGV0ZWN0IGludmFsaWQgVlA4WC9WUDgvVlA4TCBkYXRhCiszZWY3OWZlZiBDb3NtZXRpYzogIndpZHRoICogaGVpZ2h0IgorMDQzZTFhZTQgZ2lmMndlYnA6IEZpeCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiBtaXNtYXRjaAorNTgxOGNmZjcgbXV4Lmg6IEEgY29tbWVudCBmaXggKyBzb21lIGNvbnNpc3RlbmN5IGZpeGVzCisxMTUzZjg4OCBNZXJnZSAic3dpZzogaWZkZWYgc29tZSBKYXZhIHNwZWNpZmljIGNvZGUiCiszZWVlZGFlMSBNYWtlZmlsZS52YzogZml4IGxpYndlYnBkZW11eCBkbGwgdmFyaWFibGUgdHlwbworZjk4MGZhZjQgc3dpZzogYWRkIHB5dGhvbiAoZGVjb2RlKSBzdXBwb3J0Cis3ZjVmNDJiYiBzd2lnOiBjb3NtZXRpY3MKKzhlYWUxODhhIFdlYlAtTG9zc2xlc3MgZW5jb2RpbmcgaW1wcm92ZW1lbnRzLgorYzcyNDdjNGMgc3dpZzogaWZkZWYgc29tZSBKYXZhIHNwZWNpZmljIGNvZGUKKzRjYjIzNGQ1IE1lcmdlICJNdXg6IG1ha2UgVmFsaWRhdGVGb3JTaW5nbGVJbWFnZSgpIG1ldGhvZCBzdGF0aWMiCitlZDZmNTMwOCBNZXJnZSAiQWRkIEdldENhbnZhc1NpemUoKSBtZXRob2QgdG8gbXV4IgorMWQ1MzBjOWEgTXV4OiBtYWtlIFZhbGlkYXRlRm9yU2luZ2xlSW1hZ2UoKSBtZXRob2Qgc3RhdGljCitiYmE0YzJiMiBjb25maWd1cmU6IGFkZCB3YXJuaW5nIHJlbGF0ZWQgZmxhZ3MKK2ZmZmVmZDE4IEFkZCBHZXRDYW52YXNTaXplKCkgbWV0aG9kIHRvIG11eAorNzMyZGE4ZDAgTWVyZ2UgImNvbmZpZ3VyZTogYWRkIEdMVVQgZGV0ZWN0aW9uOyBidWlsZCB2d2VicCIKKzBlNTEzZjdhIGNvbmZpZ3VyZTogYWRkIEdMVVQgZGV0ZWN0aW9uOyBidWlsZCB2d2VicAorNTVkMWMxNTAgTWVyZ2UgIkFscGhhIGRlY29kaW5nOiBzaWduaWZpY2FudGx5IHJlZHVjZSBtZW1vcnkgdXNhZ2UiCisxM2Q5OWZiNSBNZXJnZSAiY29uZmlndXJlOiBhZGQgLS1lbmFibGUtZXZlcnl0aGluZyIKKzJiZjY5OGZlIE1lcmdlICJjb25maWd1cmUuYWM6IGFkZCBzb21lIGhlbHBlciBtYWNyb3MiCitlZGNjZDE5NCBBbHBoYSBkZWNvZGluZzogc2lnbmlmaWNhbnRseSByZWR1Y2UgbWVtb3J5IHVzYWdlCiszY2FmY2M5YSBjb25maWd1cmU6IGFkZCAtLWVuYWJsZS1ldmVyeXRoaW5nCis0ZWYxNDQ3NyBjb25maWd1cmUuYWM6IGFkZCBzb21lIGhlbHBlciBtYWNyb3MKK2E0ZTFjZGJiIFJlbW92ZSB0aGUgZ2NjIGNvbXBpbGF0aW9uIGNvbW1lbnRzCis2MzkzZmU0YiBDb3NtZXRpYyBmaXhlcworOWM0Y2U5NzEgU2ltcGxpZnkgZm9yd2FyZC1XSFQgKyBTU0UyIHZlcnNpb24KKzg3OGI5ZGE1IGZpeCBtaXNzZWQgb3B0aW0KKzAwMDQ2MTcxIFZQOEdldEluZm8oKTogQ2hlY2sgZm9yIHplcm8gd2lkdGggb3IgaGVpZ2h0LgorOWJmMzEyOTMgYWxpZ24gVlA4RW5jb2Rlcjo6bnpfIGFsbG9jYXRpb24KKzVkYTE2NWNmIGZpeCBDaGVja01vZGUoKSBzaWduYXR1cmUKKzBlY2UwN2RjIE1lcmdlICJleHBsaWNpdGx5IHBhZCBiaXRmaWVsZHMgdG8gMzItYml0cyIKKzlkYmM5ZDE5IGV4cGxpY2l0bHkgcGFkIGJpdGZpZWxkcyB0byAzMi1iaXRzCis1MzY5YTgwZiBNZXJnZSAicHJldmVudCBzaWduZWQgaW50IG92ZXJmbG93IGluIGxlZnQgc2hpZnQgb3BzIgorNzBlMzk3MTIgTWVyZ2UgImNvc21ldGljczogcmVtb3ZlIHVubmVjZXNzYXJ5ICc7J3MiCitkMzEzNmNlMiBNZXJnZSAiZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIGVudW1zIgorYjI2ZTVhZDUgZ2lmMndlYnA6IEZpeCBJQ0MgYW5kIFhNUCBzdXBwb3J0Cis0NjA4OWIyMCBBZGQgbWlzc2luZyBuYW1lIHRvIEFVVEhPUlMKKzk0MzI4ZDY0IERlbXV4OiBGaXggYSBwb3RlbnRpYWwgbWVtbGVhaworOTZlOTQ4ZDcgZG9uJ3QgZm9yd2FyZCBkZWNsYXJlIGVudW1zCitmNGY5MDg4MCBwcmV2ZW50IHNpZ25lZCBpbnQgb3ZlcmZsb3cgaW4gbGVmdCBzaGlmdCBvcHMKKzAyNjE1NDVlIGNvc21ldGljczogcmVtb3ZlIHVubmVjZXNzYXJ5ICc7J3MKKzdlYmRmMTEwIE1lcmdlICJGaXggZmV3IG1pc3NpbmcgY29tcGFyaXNvbnMgdG8gTlVMTCIKKzE1Nzk5ODllIEZpeCBmZXcgbWlzc2luZyBjb21wYXJpc29ucyB0byBOVUxMCitlYTFiMjFjZiBDbGVhbmVkIHVwIFZQOEdldEhlYWRlcnMoKSBzbyB0aGF0IGl0IHBhcnNlcyBvbmx5IGZyYW1lIGhlYWRlcgorYjY2Y2FlZTQgZHdlYnA6IGFkZCBzdXBwb3J0IGZvciBCTVAgb3V0cHV0CitmZjg4NWJmZSBhZGQgcHJlY2lzaW9uIGFib3V0IGR5bmFtaWMgb3V0cHV0IHJlYWxsb2NhdGlvbiB3aXRoIElEZWNvZGVyCis3OTI0MWQ1YSBNZXJnZSAiTWFrZWZpbGUudmM6IGhhdmUgJ2FsbCcgdGFyZ2V0IGJ1aWxkIGV2ZXJ5dGhpbmciCithYzFjNzI5YiBNZXJnZSAiTWFrZWZpbGUudmM6IGZsYWdzIGNsZWFudXAiCisxMThhMDU1YyBNZXJnZSAiTWFrZWZpbGUudmM6IGRyb3AgL0ZEIGZsYWciCitlY2FkMDEwOSBNZXJnZSAidXBkYXRlIGdpdGlnbm9yZSIKK2E2ODFiNGY0IFJlbmFtZSBQUkVfVlA4IHN0YXRlIHRvIFdFQlBfSEVBREVSCitlYWQ0ZDQ3OCBBZGQgaW5jcmVtZW50YWwgc3VwcG9ydCBmb3IgZXh0ZW5kZWQgZm9ybWF0IGZpbGVzCis2OWQwZjkyNiBNYWtlZmlsZS52YzogaGF2ZSAnYWxsJyB0YXJnZXQgYnVpbGQgZXZlcnl0aGluZworNTI5Njc0OTggTWFrZWZpbGUudmM6IGZsYWdzIGNsZWFudXAKK2M2MWJhZjBjIE1ha2VmaWxlLnZjOiBkcm9wIC9GRCBmbGFnCiszYTE1MTI1ZCB1cGRhdGUgZ2l0aWdub3JlCis1MTY3Y2E0NyBNZXJnZSAiV2ViUEVuY29kZTogQW4gYWRkaXRpb25hbCBjaGVjay4gU3RhcnQgVlA4RW5jTG9vcC9WUDhFbmNUb2tlbkxvb3Agb25seSBpZiBWUDhFbmNTdGFydEFscGhhIHN1Y2NlZWRlZC4iCis2NzcwOGQ2NyBXZWJQRW5jb2RlOiBBbiBhZGRpdGlvbmFsIGNoZWNrLiBTdGFydCBWUDhFbmNMb29wL1ZQOEVuY1Rva2VuTG9vcCBvbmx5IGlmIFZQOEVuY1N0YXJ0QWxwaGEgc3VjY2VlZGVkLgorYjY4OTEyYWYgcG5nZGVjOiBBdm9pZCBhIGRvdWJsZS1mcmVlLgorODJhYmJlMTIgTWVyZ2UgImNvbmZpZ3VyZS5hYzogYWRkIEFNX1BST0dfQVIgZm9yIGF1dG9tYWtlID49IDEuMTIiCitlN2Q5NTQ4YyBhZGQgV2ViUEJsZW5kQWxwaGEoKSBmdW5jdGlvbiB0byBibGVuZCBjb2xvcnMgYWdhaW5zdCBiYWNrZ3JvdW5kCitlZDRkYzcxNyBjb25maWd1cmUuYWM6IGFkZCBBTV9QUk9HX0FSIGZvciBhdXRvbWFrZSA+PSAxLjEyCitkZjRhNDA2ZCBNZXJnZSBicmFuY2ggJzAuMy4wJworMWUwZDRiOGMgVXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4zLjAtcmM3LCB0YWc6IHYwLjMuMCkKK2Q1MmI0MDVkIENvc21ldGljIGZpeGVzCis2Y2I0YTYxOCBtaXNjIHN0eWxlIGZpeAorNjgxMTFhYjAgYWRkIG1pc3NpbmcgWVVWQS0+QVJHQiBhdXRvbWF0aWMgY29udmVyc2lvbiBpbiBXZWJQRW5jb2RlKCkKK2U5YTc5OTBiIENvc21ldGljIGZpeGVzCis0MDNiZmU4MiBDb250YWluZXIgc3BlYzogQ2xhcmlmeSBmcmFtZSBkaXNwb3NhbAorMmFhYTQyM2IgTWVyZ2UgImFkZCBtaXNzaW5nIFlVVkEtPkFSR0IgYXV0b21hdGljIGNvbnZlcnNpb24gaW4gV2ViUEVuY29kZSgpIgorMDdkODdiZGEgYWRkIG1pc3NpbmcgWVVWQS0+QVJHQiBhdXRvbWF0aWMgY29udmVyc2lvbiBpbiBXZWJQRW5jb2RlKCkKKzE0MmM0NjI5IG1pc2Mgc3R5bGUgZml4CiszZTdhMTNhMCBNZXJnZSAiQ29udGFpbmVyIHNwZWM6IGNsYXJpZnkgdGhlIGJhY2tncm91bmQgY29sb3IgZmllbGQiIGludG8gMC4zLjAKKzE0YWY3NzQ1IGNvbnRhaW5lciBkb2M6IGFkZCBhIG5vdGUgYWJvdXQgdGhlICdBTk1GJyBwYXlsb2FkCitjYzYzNWVmYSBDb250YWluZXIgc3BlYzogY2xhcmlmeSB0aGUgYmFja2dyb3VuZCBjb2xvciBmaWVsZAorZTNlMzM5NDkgY29udGFpbmVyIGRvYzogbW92ZSBSSUZGIGRlc2NyaXB0aW9uIHRvIG93biBzZWN0aW9uCis0Mjk5ZjM5OCBsaWJ3ZWJwL211eDogZml4IGRvdWJsZSBmcmVlCiszM2Y5YTY5MiBNZXJnZSAiZGVtdXg6IGtlZXAgYSBmcmFtZSB0YWlsIHBvaW50ZXI7IHVzZWQgaW4gQWRkRnJhbWUiIGludG8gMC4zLjAKK2EyYTdiOTU5IHVzZSBXZWJQRGF0YUNvcHkoKSBpbnN0ZWFkIG9mIHJlLWNvZGluZyBpdC4KKzZmMThmMTJmIGRlbXV4OiBrZWVwIGEgZnJhbWUgdGFpbCBwb2ludGVyOyB1c2VkIGluIEFkZEZyYW1lCitlNWFmNDllOSBhZGQgZG9jIHByZWNpc2lvbiBhYm91dCBXZWJQUGFyc2VIZWFkZXJzKCkgcmV0dXJuIGNvZGVzCitkYjQ2ZGFhYiBNZXJnZSAiTWFrZWZpbGUudmM6IGZpeCBkeW5hbWljIGJ1aWxkcyIgaW50byAwLjMuMAorNTNjNzdhZmMgTWVyZ2UgImdpZjJ3ZWJwOiBCZ2NvbG9yIGZpeCBmb3IgYSBzcGVjaWFsIGNhc2UiIGludG8gMC4zLjAKK2E1ZWJkMTQzIGdpZjJ3ZWJwOiBCZ2NvbG9yIGZpeCBmb3IgYSBzcGVjaWFsIGNhc2UKKzYzNzhmMjM4IE1lcmdlICJ2d2VicC9hbmltYXRpb246IGZpeCBiYWNrZ3JvdW5kIGRpc3Bvc2UiIGludG8gMC4zLjAKKzNjOGViOWE4IGZpeCBiYWQgc2F0dXJhdGlvbiBvcmRlciBpbiBRdWFudGl6ZUJsb2NrCiswNGM3YTJlYyB2d2VicC9hbmltYXRpb246IGZpeCBiYWNrZ3JvdW5kIGRpc3Bvc2UKKzgxYTUwNjk1IE1ha2VmaWxlLnZjOiBmaXggZHluYW1pYyBidWlsZHMKKzVmMjVjMzk2IHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMy4wLXJjNikKKzE0ZDQyYWYyIGV4YW1wbGVzOiBkb24ndCB1c2UgQzk5ICV6dQorNWNjZjFmZTUgdXBkYXRlIENoYW5nZUxvZworMjU2MGMyNDMgdXBkYXRlIE5FV1MKK2Y0M2JhZmMzIE1lcmdlIGNoYW5nZXMgSWVjY2NiMDljLElmNWVlOWZkMixJM2UxODFjZTQgaW50byAwLjMuMAorYTc4ODY0NGYgZHdlYnA6IHdhcm4gd2hlbiBkZWNvZGluZyBhbmltYXRlZCB3ZWJwJ3MKKzMwMmVmY2RiIERlY29kZTogcmV0dXJuIG1vcmUgbWVhbmluZ2Z1bCBlcnJvciBmb3IgYW5pbWF0aW9uCithZDQ1MjczNSBXZWJQQml0c3RyZWFtRmVhdHVyZXM6IGFkZCBoYXNfYW5pbWF0aW9uIGZpZWxkCis3ODNkZmE0OSBkaXNhYmxlIEZSR00gZGVjb2RpbmcgZm9yIGdvb2QgaW4gbGlid2VicG11eAorNGI5NTZiZTAgVXBkYXRlIENoYW5nZUxvZworYWQ4Yjg2ZDcgdXBkYXRlIE5FV1MKKzNlMDg0ZjYzIE1lcmdlICJkZW11eCBjb3NtZXRpY3M6IGNvbW1lbnRzL3JlbmFtZSBpbnRlcm5hbCBmdW5jdGlvbiIgaW50byAwLjMuMAorZDNmOGM2MjEgTWVyZ2UgIm1vdmUgV2ViUEZlYXR1cmVGbGFncyBkZWNsYXJhdGlvbiIgaW50byAwLjMuMAorNzM4NmZlNTAgTWVyZ2UgImxpYndlYnB7ZGVtdXgsbXV4fTogaW5zdGFsbCBtdXhfdHlwZXMuaCIgaW50byAwLjMuMAorZDZjZDRlOTAgTWVyZ2UgImJ1bXAgZGVjb2RlIGFiaSIgaW50byAwLjMuMAorMTdmOGRhNWMgYnVtcCBkZWNvZGUgYWJpCis5NzY4NGFlMiBNZXJnZSAiYWRkIGRvYyBwcmVjaXNpb24gYWJvdXQgV2ViUERlbXV4UGFydGlhbCgpIiBpbnRvIDAuMy4wCitmOTMzZmQyYSBtb3ZlIFdlYlBGZWF0dXJlRmxhZ3MgZGVjbGFyYXRpb24KKzI4OWJjNDdiIGxpYndlYnB7ZGVtdXgsbXV4fTogaW5zdGFsbCBtdXhfdHlwZXMuaAorMjI0ZThkNDYgYWRkIGRvYyBwcmVjaXNpb24gYWJvdXQgV2ViUERlbXV4UGFydGlhbCgpCis0YzE4ZTgwYyBkZW11eCBjb3NtZXRpY3M6IGNvbW1lbnRzL3JlbmFtZSBpbnRlcm5hbCBmdW5jdGlvbgorN2NmZDFiZjEgdXBkYXRlIEFVVEhPUlMKKzQwMWY3Yjg1IE1lcmdlICJzcGVlZC11cCBsb3NzbGVzcyAofjMlKSB3aXRoIGFkLWhvYyBoaXN0b2dyYW0gY29zdCBldmFsdWF0aW9uIiBpbnRvIDAuMy4wCisxZmM4ZmZjYSBNZXJnZSAibWFrZWZpbGUudW5peDogZGlzdCByZWxhdGVkIGNoYW5nZXMiIGludG8gMC4zLjAKKzhhODljNmVkIE1lcmdlIGNoYW5nZXMgSTQ2NmMzNzdmLEliNzYxZWJkMyxJNjk0ODU3ZmMgaW50byAwLjMuMAorZjRmZmIyZDUgc3BlZWQtdXAgbG9zc2xlc3MgKH4zJSkgd2l0aCBhZC1ob2MgaGlzdG9ncmFtIGNvc3QgZXZhbHVhdGlvbgorNzIzODQ3ZDUgZ2lmMndlYnA6IG9ubHkgd3JpdGUgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyCis3MDFiOWUyYSBtYWtlZmlsZS51bml4OiBkaXN0IHJlbGF0ZWQgY2hhbmdlcworYmI4NWI0MzcgTWVyZ2UgInVwZGF0ZSBORVdTIiBpbnRvIDAuMy4wCis1OTQyM2EyNCBnaWYyd2VicDogZml4IGNyYXNoIG9uIG9wZW4gZmFpbHVyZSB3aXRoIGxpYmdpZjUKKzlhY2IxN2RlIGdpZjJ3ZWJwOiBzaWxlbmNlIGEgdW51c2VkIHBhcmFtIHdhcm5pbmcKKzdkOWZkYzIzIE1lcmdlICJSRUFETUUgdXBkYXRlcyIgaW50byAwLjMuMAorNTYyMTkzNGUgTWVyZ2UgImJ1aWxkOiBmaXggaW5zdGFsbCByYWNlIG9uIHNoYXJlZCBoZWFkZXJzIiBpbnRvIDAuMy4wCis3MDgwOWQ4OSBNZXJnZSAiYnVtcCB2ZXJzaW9uIHRvIDAuMy4wIiBpbnRvIDAuMy4wCitkODUxY2QxZCBkZW11eDogbWFrZSB0aGUgcGFyc2UgYSBiaXQgbW9yZSBzdHJpY3QKKzI4YmI0MTA3IHVwZGF0ZSBORVdTCitjZWY5Mzg4MiBidW1wIHZlcnNpb24gdG8gMC4zLjAKKzkwNDg0OTRkIGJ1aWxkOiBmaXggaW5zdGFsbCByYWNlIG9uIHNoYXJlZCBoZWFkZXJzCisxZTY3ZThlZiBSRUFETUUgdXBkYXRlcworNDJiNjExYTQgTWVyZ2UgImNvbmZpZ3VyZTogZHJvcCBleHBlcmltZW50YWwgZnJvbSBtdXgvZGVtdXgiIGludG8gMC4zLjAKKzA5NmE4ZTMyIE1lcmdlICJ2d2VicDogYWRkIGNvbG9yIHByb2ZpbGUgc3VwcG9ydCIgaW50byAwLjMuMAorZGRmZWU1ZGMgdndlYnA6IGFkZCBjb2xvciBwcm9maWxlIHN1cHBvcnQKKzBkNjkyN2QzIE1lcmdlICJNYXJrIGZyYWdtZW50IG9wdGlvbnMgYXMgZXhwZXJpbWVudGFsIGluIHdlYnBtdXgiIGludG8gMC4zLjAKKzVkYmQ0MDMwIE1hcmsgZnJhZ21lbnQgb3B0aW9ucyBhcyBleHBlcmltZW50YWwgaW4gd2VicG11eAorYTBhNjY0OGMgY29uZmlndXJlOiBkcm9wIGV4cGVyaW1lbnRhbCBmcm9tIG11eC9kZW11eAorZWU2NWJhZDggTWVyZ2UgImFkZCBzdXBwb3J0IGZvciBCSVRTID4gMzIiIGludG8gMC4zLjAKKzc0NDkzMGRiIGFkZCBzdXBwb3J0IGZvciBCSVRTID4gMzIKKzdkZDI4OGYwIGN3ZWJwOiBmaXggYnVpbGQKKzE5YThkZDAxIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIHZ3ZWJwLmV4ZSB0YXJnZXQiIGludG8gMC4zLjAKKzUwZWVkZGFkIE1lcmdlICJleGFtcGxlczogbm9ybWFsaXplIGljYyByZWxhdGVkIHByb2dyYW0gYXJndW1lbnRzIiBpbnRvIDAuMy4wCis3NTdmNjM3ZiBNZXJnZSAiTWFrZWZpbGUudmM6IGFkZCBsaWJ3ZWJwZGVjb2RlciB0YXJnZXQiIGludG8gMC4zLjAKK2I2NWM0YjdjIE1ha2VmaWxlLnZjOiBhZGQgbGlid2VicGRlY29kZXIgdGFyZ2V0CitmOGRiN2I0YSBNZXJnZSAidndlYnA6IHJlcGxhY2UgZG91YmxlcyB3L2Zsb2F0cyB3aGVyZSBhcHByb3ByaWF0ZSIgaW50byAwLjMuMAorZDk5YWE1NmYgTWFrZWZpbGUudmM6IGFkZCB2d2VicC5leGUgdGFyZ2V0CiswMTMwMjNlNyB2d2VicDogcmVwbGFjZSBkb3VibGVzIHcvZmxvYXRzIHdoZXJlIGFwcHJvcHJpYXRlCis5YjNkYjg5NCBSRUFETUUubXV4OiBhZGQgdmVyc2lvbiByZWZlcmVuY2UKKzdiNmEyNmNmIE1lcmdlICJjd2VicDogb3V0cHV0IG1ldGFkYXRhIHN0YXRpc3RpY3MiIGludG8gMC4zLjAKK2Q4ZGM3MmEwIGV4YW1wbGVzOiBub3JtYWxpemUgaWNjIHJlbGF0ZWQgcHJvZ3JhbSBhcmd1bWVudHMKKzdiZmM5MDU2IE1lcmdlICJtYWtlIGFscGhhIHVuZmlsdGVyIHdvcmsgaW4tcGxhY2UiIGludG8gMC4zLjAKKzAwMzdiMmQyIE1lcmdlICJhZGQgTFVULWZyZWUgcmVmZXJlbmNlIGNvZGUgZm9yIFlVVi0+UkdCIGNvbnZlcnNpb24uIiBpbnRvIDAuMy4wCisxNjZiZjc0NCBNZXJnZSAiZGVtdXg6IGRpc2FibGUgZnJhZ21lbnQgcGFyc2luZyIgaW50byAwLjMuMAorMTI2OTc0YjQgYWRkIExVVC1mcmVlIHJlZmVyZW5jZSBjb2RlIGZvciBZVVYtPlJHQiBjb252ZXJzaW9uLgorMGFlZjNlYmQgbWFrZSBhbHBoYSB1bmZpbHRlciB3b3JrIGluLXBsYWNlCisxNGVmNTAwNSBNZXJnZSAiUmVtb3ZlICdzdGF0dXM6IGV4cGVyaW1lbnRhbCcgZnJvbSBjb250YWluZXIgc3BlYyIgaW50byAwLjMuMAorZDQwYzk4ZTEgTWVyZ2UgIndlYnBtdXggYmluYXJ5OiB0aW55IHN0eWxlIGZpeCIgaW50byAwLjMuMAorMGJjNDI2ODkgY3dlYnA6IG91dHB1dCBtZXRhZGF0YSBzdGF0aXN0aWNzCitiYzAzOTgwMyBNZXJnZSAiYXV0b2NvbmY6IG5vcm1hbGl6ZSBleHBlcmltZW50YWwgZGVmaW5lIiBpbnRvIDAuMy4wCitkMWUyMWIxMyBSZW1vdmUgJ3N0YXR1czogZXhwZXJpbWVudGFsJyBmcm9tIGNvbnRhaW5lciBzcGVjCis3NjgxYmI5NiB3ZWJwbXV4IGJpbmFyeTogdGlueSBzdHlsZSBmaXgKK2EzZGQzZDBmIGF2b2lkIGluc3RhbGxpbmcgZXhhbXBsZV91dGlsLmgKKzI1MjMyMGUyIGRlbXV4OiBkaXNhYmxlIGZyYWdtZW50IHBhcnNpbmcKKzUzN2JkZTA1IGF1dG9jb25mOiBub3JtYWxpemUgZXhwZXJpbWVudGFsIGRlZmluZQorNWUzMzhlMGIgTWVyZ2UgY2hhbmdlcyBJMzNlOGE2MTMsSThlOGE3YjQ0IGludG8gMC4zLjAKK2Q5ZDBlYTFiIE1lcmdlIGNoYW5nZXMgSWYyMWUzZWM3LEk5OTFmYzMwYiBpbnRvIDAuMy4wCis2MjdmNWNhNiBhdXRvbWFrZTogYWRkIHJlZmVyZW5jZSB0byBsaWJ3ZWJwIGZvciBtdXgvZGVtdXgKK2VlZjczZDA3IGRvbid0IGNvbnNvbGlkYXRlIHByb2JhIHN0YXRzIHRvbyBvZnRlbgorMDVlYzRjYzIgbGlid2VicHssZGVjb2Rlcn0ucGM6IGFkZCBwdGhyZWFkIGZsYWdzCisxYmZjZjViZiBhZGQgbGlid2VicG11eC5wYworMjZjYTg0M2QgYWRkIGxpYndlYnBkZW11eC5wYworNjllMjU5MDYgTWVyZ2UgIlR1bmUgTG9zc2xlc3MgY29tcHJlc3Npb24gZm9yIGxvd2VyIHF1YWxpdGllcy4iCiswNDc4YjVkMiBUdW5lIExvc3NsZXNzIGNvbXByZXNzaW9uIGZvciBsb3dlciBxdWFsaXRpZXMuCiszOWY3NTg2ZiBhZGQgYSBtZW50aW9uIG9mIHBhcmFsbGVsIGFscGhhIGVuY29kaW5nIGluIHRoZSBORVdTCis1YTIxZDk2NyBNZXJnZSAiMS41eC0yeCBmYXN0ZXIgZW5jb2RpbmcgZm9yIG1ldGhvZCAzIGFuZCB1cCIKKzliZmJkZDE0IDEuNXgtMnggZmFzdGVyIGVuY29kaW5nIGZvciBtZXRob2QgMyBhbmQgdXAKKzI3ZGM3NDFiIENvcnJlY3QgZnJhbWUgb3B0aW9ucyBvcmRlciBpbiBSRUFETUUubXV4CitiZTJmZDE3MyBNdXg6IGZpeCBhIHNjZW5hcmlvIHdpdGggYmFkIEFOTUYvRlJHTSBzaXplCisxOWViMDEyYyBNZXJnZSAiRGVtdXg6IEFkZCBvcHRpb24gdG8gZ2V0IGZyYW1lIGNvdW50IHVzaW5nIEdldEkoKSIKKzczNjhiOGNiIE1lcmdlICJXZWJQR2V0RmVhdHVyZXMoKSBvdXQgb2YgaWYgY29uZGl0aW9uIGZvciBjbGFyaXR5LiIKK2Y2MDRjOWE0IE1lcmdlICJmaXggd2luZG93cyBidWlsZCIKKzE1M2Y5NGU4IGZpeCB3aW5kb3dzIGJ1aWxkCis4NDdiNDkyNCBNZXJnZSAidndlYnA6IHVzZSBtYWdlbnRhIGZvciAnaSduZm8gZGlzcGxheSIKKzI1ZWE0NmJkIE1lcmdlICJ2d2VicDogYWRkIGtleWJvYXJkIHNob3J0Y3V0cyB0byBoZWxwIG91dHB1dCIKK2JlYTdjY2FmIHZ3ZWJwOiB1c2UgbWFnZW50YSBmb3IgJ2knbmZvIGRpc3BsYXkKKzhmYWIxNjFhIHdlYnBtdXg6IGNvcnJlY3QgLWZyYW1lIHBhcmFtIG9yZGVyIGluIGhlbHAgb3V0cHV0CiswM2NjMjNkNiB2d2VicDogYWRkIGtleWJvYXJkIHNob3J0Y3V0cyB0byBoZWxwIG91dHB1dAorMDY4ZWJhOGQgRGVtdXg6IEFkZCBvcHRpb24gdG8gZ2V0IGZyYW1lIGNvdW50IHVzaW5nIEdldEkoKQorOTg4YjhmNTYgV2ViUEdldEZlYXR1cmVzKCkgb3V0IG9mIGlmIGNvbmRpdGlvbiBmb3IgY2xhcml0eS4KKzY5MzNkOTEwIE1lcmdlICJnaWYyd2VicDogQmUgbGVuaWVudCBhYm91dCBiYWNrZ3JvdW5kIGNvbG9yIGluZGV4LiIKKzRkMGY3YzU1IE1lcmdlICJXZWJQR2V0RmVhdHVyZXMoKSBiZWhhdmlvciBjaGFuZ2U6IgorZmRlZWIwMWQgZ2lmMndlYnA6IEJlIGxlbmllbnQgYWJvdXQgYmFja2dyb3VuZCBjb2xvciBpbmRleC4KK2FkMjUwMzIwIE1lcmdlICJtdWx0aS10aHJlYWRlZCBhbHBoYSBlbmNvZGluZyBmb3IgbG9zc3kiCis0ZTMyZDNlMSBNZXJnZSAiZml4IGNvbXBpbGF0aW9uIG9mIHRva2VuLmMiCitmODE3OTMwYSBtdWx0aS10aHJlYWRlZCBhbHBoYSBlbmNvZGluZyBmb3IgbG9zc3kKKzg4MDUwMzUxIGZpeCBjb21waWxhdGlvbiBvZiB0b2tlbi5jCitmYzgxNjIxOSBjb2RlIHVzaW5nIHRoZSBhY3R1YWwgdmFsdWVzIGZvciBudW1fcGFydHNfLCBub3QgdGhlIG9uZXMgZnJvbSBjb25maWcKKzcyNjU1MzUwIE1lcmdlICJtb3ZlIHRoZSBjb25maWcgY2hlY2sgZnJvbSAuYyB0byAuaCIKK2RkOWU3NmY3IG1vdmUgdGhlIGNvbmZpZyBjaGVjayBmcm9tIC5jIHRvIC5oCis5NTZiMjE3YSBXZWJQR2V0RmVhdHVyZXMoKSBiZWhhdmlvciBjaGFuZ2U6CitkZjAyZTRjZSBXZWJQRGVtdXhHZXRJIGJlaGF2aW9yIGNoYW5nZToKKzYzM2MwMDRkIE1lcmdlICJyZWJhbGFuY2UgbWV0aG9kIHRvb2xzICgtbSkgZm9yIG1ldGhvZHMgWzAuLjRdIgorNThjYTZmNjUgcmViYWxhbmNlIG1ldGhvZCB0b29scyAoLW0pIGZvciBtZXRob2RzIFswLi40XQorNzY0OGMzY2MgTWVyZ2UgImRlc2NyaWJlIHJkLW9wdCBsZXZlbHMgaW50cm9kdWNlIFZQOFJETGV2ZWwgZW51bSIKKzY3ZmIxMDAzIE1lcmdlICJhdXRvY29uZjogZW5hYmxlIHNpbGVudC1ydWxlcyBieSBkZWZhdWx0IgorYTUwNDJhMzIgR2V0VmVyc2lvbigpIG1ldGhvZHMgZm9yIG11eCBhbmQgZGVtdXgKKzUxODk5NTdlIGRlc2NyaWJlIHJkLW9wdCBsZXZlbHMgaW50cm9kdWNlIFZQOFJETGV2ZWwgZW51bQorNGUwOTRhY2UgYXV0b2NvbmY6IGVuYWJsZSBzaWxlbnQtcnVsZXMgYnkgZGVmYXVsdAorYjdlYWE4NWQgaW5saW5lIFZQOExGYXN0TG9nMigpIGFuZCBWUDhMRmFzdFNMb2cyIGZvciBzbWFsbCB2YWx1ZXMKKzVjZjc3OTJlIHNwbGl0IHF1YW50X2xldmVscy5jIGludG8gZGVjb2RlciBhbmQgZW5jb2RlciB2ZXJzaW9uCitlNWQzZmZlMiBNZXJnZSAiVXBkYXRlIGNvZGUgZXhhbXBsZSBpbiBSRUFETUUubXV4IgorYWM1YTkxNTYgVXBkYXRlIGNvZGUgZXhhbXBsZSBpbiBSRUFETUUubXV4CiszOGE5MWU5OSBBZGQgZXhhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIGRlbXV4IEFQSQorNWY1NTdmM2MgUkVBRE1FLm11eDogYWRkIGluZm8gYWJvdXQgRGVtdXggQVBJIGFuZCB2d2VicAorYzBiYTA5MDMgYmFja3dhcmRfcmVmZXJlbmNlczogYXZvaWQgc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cKKzk0MzM4NmRiIGRpc2FibGUgU1NFMiBmb3Igbm93Cis5NDc5ZmI3ZCBsb3NzbGVzcyBlbmNvZGluZyBzcGVlZHVwCitlYzIwMzBhOCBtZXJnZSB0d28gbGluZXMgdG9nZXRoZXIKK2I2Nzk1NmMwIE1lcmdlICJSZW1vdmUgUmVhZE9uZUJpdCgpIGFuZCBSZWFkU3ltYm9sVW5zYWZlKCkiCisxNjY3YmRlZCBSZW1vdmUgUmVhZE9uZUJpdCgpIGFuZCBSZWFkU3ltYm9sVW5zYWZlKCkKKzMxNTE2NjliIHdpY2RlYyArIGR3ZWJwIGNvc21ldGljczogbm9ybWFsaXplIGZvcm1hdHRpbmcKKzkyNjY4ZGE2IGNoYW5nZSBkZWZhdWx0IGZpbHRlcmluZyBwYXJhbWV0ZXJzOiAgICogdHlwZSBpcyBub3cgJ3N0cm9uZycgICAqIHN0cmVuZ3RoIGlzIG5vdyAnNjAnCitiNzQ5MGY4NSBpbnRyb2R1Y2UgV0VCUF9SRUZFUkVOQ0VfSU1QTEVNRU5UQVRJT04gY29tcGlsZSBvcHRpb24KKzMzODM4ODU3IGZhc3RlciBkZWNvZGluZyAoMyUtNiUpCis1YzNlMzgxYiBNZXJnZSAiYWRkIGEgLWpwZWdfbGlrZSBvcHRpb24iCitjMjMxMTA0NiByZW1vdmUgdW51c2VkIGRlY2xhcmF0aW9uIG9mIFZQOFppZ3phZworMzYxNTI5NTcgTWVyZ2UgIndpY2RlYzogYWRkIGFscGhhIHN1cHBvcnQgZm9yIHBhbGV0dGVkIGZvcm1hdHMiCitjOWYxNjQ5MCB3aWNkZWM6IGFkZCBhbHBoYSBzdXBwb3J0IGZvciBwYWxldHRlZCBmb3JtYXRzCisxMjYyZjgxZSBNZXJnZSAid2ljZGVjOiBzaWxlbmNlIHNvbWUgd2FybmluZ3MiCitlN2VhNjFlYiB3aWNkZWM6IHNpbGVuY2Ugc29tZSB3YXJuaW5ncworMjNjMGYzNTQgZml4IG1pc3NpbmcgaW50cHRyX3QtPmludCBjYXN0IGZvciBNU1ZDCitlODk1MDU5YSBhZGQgYSAtanBlZ19saWtlIG9wdGlvbgorMWY4MDNmNjQgTWVyZ2UgIlR1bmUgYWxwaGEgcXVhbGl0eSBtYXBwaW5nIHRvIG1vcmUgcmVhc29uYWJsZSB2YWx1ZXMuIgorMTI2N2Q0OTggVHVuZSBhbHBoYSBxdWFsaXR5IG1hcHBpbmcgdG8gbW9yZSByZWFzb25hYmxlIHZhbHVlcy4KKzA0MzA3NmUyIE1lcmdlICJzcGVlZC11cCBsb3NzbGVzcyBpbiBCYWNrd2FyZFRyYWNlIgorZjNhNDRkY2QgcmVtb3ZlIG9uZSBtYWxsb2MgZnJvbSBUcmFjZUJhY2t3YXJkcygpCiswZmMxYTNhMCBzcGVlZC11cCBsb3NzbGVzcyBpbiBCYWNrd2FyZFRyYWNlCis3YzczMmU1OSBjd2VicDogY2VudHJhbGl6ZSBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYSgpCis3MzgxMjU0ZSBNZXJnZSAid2ljZGVjOiBhZGQgSUNDIHByb2ZpbGUgZXh0cmFjdGlvbiIKK2U4M2ZmN2RlIHdpY2RlYzogYWRkIElDQyBwcm9maWxlIGV4dHJhY3Rpb24KKzE0NmM2ZTNiIE1lcmdlICJjb3NtZXRpY3M6IHBuZ2RlYzogbm9ybWFsaXplIGRlZmF1bHQgbGFiZWwgbG9jYXRpb24iCithOGY1NDlkNyBNZXJnZSAibWFucGFnZXM6IGl0YWxpY2l6ZSBvcHRpb24gcGFyYW1ldGVycyIKK2UxMThkYjgzIE1lcmdlICJlbmNvZGUuaDogbm90ZSB0aGUgbmVlZCB0byBmcmVlKCkgV2ViUE1lbW9yeVdyaXRlciIKKzFkZmVlNmRiIGNvc21ldGljczogcG5nZGVjOiBub3JtYWxpemUgZGVmYXVsdCBsYWJlbCBsb2NhdGlvbgorMTRjMzgyMDAgbWFucGFnZXM6IGl0YWxpY2l6ZSBvcHRpb24gcGFyYW1ldGVycworN2RlZmJmYWQgZW5jb2RlLmg6IG5vdGUgdGhlIG5lZWQgdG8gZnJlZSgpIFdlYlBNZW1vcnlXcml0ZXIKKzg4ZDM4MmEwIGN3ZWJwOiBjbGVhbnVwIGFmdGVyIG1lbW9yeV93cml0ZXIKKzEyZDZjZWNmIGZpeCBleHRyYSBzcGFjZSBpbiBkd2VicC4xIG1hbgorYjAxNjgxYTkgRml4IGZvciBkZW11eGVyIGZyYW1lIGl0ZXJhdGlvbjoKKzU2YzEyYWE2IERlbXV4ZXIgY3JlYXRpb24gZml4OgorNjZjODEwYmMgYWRkIGEgLXl1diBvcHRpb24gdG8gZHdlYnAgKHZlcnkgc2ltaWxhciB0byAtcGdtKQorODQxYTNiYTUgTWVyZ2UgIlJlbW92ZSAtV3NoYWRvdyB3YXJuaW5ncy4iCis4ZmQwMjUyNyBNZXJnZSAidXBzYW1wbGluZ19uZW9uLmM6IGZpeCBidWlsZCIKKzZlZmVkMjY4IFJlbW92ZSAtV3NoYWRvdyB3YXJuaW5ncy4KKzYwOTA0YWE2IE1lcmdlICJhbGxvdyBXZWJQSU5ld1JHQi9ZVVZBIHRvIGJlIHBhc3NlZCBhIE5VTEwgb3V0cHV0IGJ1ZmZlci4iCitiN2FkZjM3NiBhbGxvdyBXZWJQSU5ld1JHQi9ZVVZBIHRvIGJlIHBhc3NlZCBhIE5VTEwgb3V0cHV0IGJ1ZmZlci4KKzI3ZjhmNzQyIHVwc2FtcGxpbmdfbmVvbi5jOiBmaXggYnVpbGQKKzA2YjljZGYxIGdpdGlnbm9yZTogYWRkIElPUyByZWxhdGVkIGRpcmVjdG9yaWVzCitmMTEyMjIxZSBNZXJnZSAiRml4IG1vcmUgY29tbWVudHMgZm9yIGlvYnVpbGQuc2giCitmZTRkMjVkZCBGaXggbW9yZSBjb21tZW50cyBmb3IgaW9idWlsZC5zaAorMWRlM2UyNTIgTWVyZ2UgIk5FT04gb3B0aW1pc2VkIHl1diB0byByZ2IgY29udmVyc2lvbiIKKzA5MGI3MDhhIE5FT04gb3B0aW1pc2VkIHl1diB0byByZ2IgY29udmVyc2lvbgorZGFhMDY0NzYgTWVyZ2UgIkFkZCBpb3MgYnVpbGQgc2NyaXB0IGZvciBidWlsZGluZyBpT1MgbGlicmFyeS4iCis3OWZlMzllMiBBZGQgaW9zIGJ1aWxkIHNjcmlwdCBmb3IgYnVpbGRpbmcgaU9TIGxpYnJhcnkuCisxMjZjMDM1ZiByZW1vdmUgc29tZSBtb3JlIC1Xc2hhZG93IHdhcm5pbmdzCis1MjJlOWQ2MSBNZXJnZSAiY3dlYnA6IGVuYWJsZSAnLW1ldGFkYXRhJyIKKzc2ZWM1ZmExIGN3ZWJwOiBlbmFibGUgJy1tZXRhZGF0YScKK2FlYjkxYTlkIE1lcmdlICJjb3NtZXRpY3M6IGJyZWFrIGEgZmV3IGxvbmcgbGluZXMiCitiZTdjOTZiMCBjb3NtZXRpY3M6IGJyZWFrIGEgZmV3IGxvbmcgbGluZXMKK2NmZjhkZGI2IE1lcmdlICJhZGQgbGlid2VicGRlY29kZXIucGMiCis5MzE0OGFiOCBNZXJnZSAibGlid2VicC5wYy5pbjogZGV0YWIiCis2NDc3Zjk1NSBNZXJnZSAiTWFrZWZpbGUudmM6IG5vcm1hbGl6ZSBwYXRoIHNlcGFyYXRvciIKK2JlZDFlZDdjIGFkZCBsaWJ3ZWJwZGVjb2Rlci5wYworNDYxNjhiMmQgbGlid2VicC5wYy5pbjogZGV0YWIKK2E5NDFhMzQ2IEZpeGVkIGZldyBuaXRzIGluIHRoZSBidWlsZCBmaWxlcy4KK2RkN2E0OWIyIE1ha2VmaWxlLnZjOiBub3JtYWxpemUgcGF0aCBzZXBhcmF0b3IKKzkxNjFiZTg2IE1lcmdlICJjd2VicDogZXh0cmFjdCBXSUMgZGVjb2RpbmcgdG8gaXRzIG93biBtb2R1bGUiCiswOGU3YzU4ZSBNZXJnZSAiUHJvdmlkZSBhbiBvcHRpb24gdG8gYnVpbGQgZGVjb2RlciBsaWJyYXJ5LiIKKzBhZWJhNTI4IFByb3ZpZGUgYW4gb3B0aW9uIHRvIGJ1aWxkIGRlY29kZXIgbGlicmFyeS4KKzc1N2ViY2IxIGNhdGNoIG1hbGxvYygwKS9jYWxsb2MoMCkgd2l0aCBhbiBhc3NlcnQKKzE1MmVjM2QyIE1lcmdlICJoYW5kbGUgbWFsbG9jKDApIGFuZCBjYWxsb2MoMCkgdW5pZm9ybWx5IG9uIGFsbCBwbGF0Zm9ybXMiCithNDUyYTU1NSBjd2VicDogZXh0cmFjdCBXSUMgZGVjb2RpbmcgdG8gaXRzIG93biBtb2R1bGUKKzJiMjUyYTUzIE1lcmdlICJQcm92aWRlIG9wdGlvbiB0byBzd2FwIGJ5dGVzIGZvciAxNiBiaXQgY29sb3Jtb2RlcyIKKzk0YTQ4YjRiIFByb3ZpZGUgb3B0aW9uIHRvIHN3YXAgYnl0ZXMgZm9yIDE2IGJpdCBjb2xvcm1vZGVzCis0MmY4ZjkzNCBoYW5kbGUgbWFsbG9jKDApIGFuZCBjYWxsb2MoMCkgdW5pZm9ybWx5IG9uIGFsbCBwbGF0Zm9ybXMKKzhiMjE1MmM1IE1lcmdlICJhZGQgYW4gZXh0cmEgYXNzZXJ0IHRvIGNoZWNrIG1lbW9yeSBib3VuZHMiCiswZDE5ZmJmZiByZW1vdmUgc29tZSAtV3NoYWRvdyB3YXJuaW5ncworY2QyMmY2NTUgYWRkIGFuIGV4dHJhIGFzc2VydCB0byBjaGVjayBtZW1vcnkgYm91bmRzCis4MTg5ZmVkYSBNZXJnZSAiQWRkIGRldGFpbHMgYW5kIHJlZmVyZW5jZSBhYm91dCB0aGUgWVVWLT5SR0IgY29udmVyc2lvbiIKKzFkMjcwMmIxIE1lcmdlICJGb3JtYXR0aW5nIGZpeGVzIGluIGxvc3NsZXNzIGJpdHN0cmVhbSBzcGVjIgorODQyNWFhZWUgRm9ybWF0dGluZyBmaXhlcyBpbiBsb3NzbGVzcyBiaXRzdHJlYW0gc3BlYworYTU1NmNiMWEgQWRkIGRldGFpbHMgYW5kIHJlZmVyZW5jZSBhYm91dCB0aGUgWVVWLT5SR0IgY29udmVyc2lvbgorZDhmMjFlMGIgYWRkIGxpbmsgdG8gU1NJTSBkZXNjcmlwdGlvbiBvbiBXaWtpcGVkaWEKKzE4ZTkxNjdlIE1lcmdlICJXZWJQLWxvc3NsZXNzIHNwZWMgY2xhcmlmaWNhdGlvbnM6IgorOThlMjViOWIgTWVyZ2UgImN3ZWJwOiBhZGQgLW1ldGFkYXRhIG9wdGlvbiIKK2YwMWMyYTUzIFdlYlAtbG9zc2xlc3Mgc3BlYyBjbGFyaWZpY2F0aW9uczoKK2Y0YTk3OTcwIE1lcmdlICJEaXN0bzR4NCBhbmQgRGlzdG8xNngxNiBpbiBORU9OIgorNDdiN2IwYmEgRGlzdG80eDQgYW5kIERpc3RvMTZ4MTYgaW4gTkVPTgorN2VhZWU5ZjEgY3dlYnA6IGFkZCAtbWV0YWRhdGEgb3B0aW9uCiszNmM1MmMyYyB0aWZmZGVjOiB1c2UgdG9mZl90IGZvciBleGlmIGlmZCBvZmZzZXQKKzdjODExMWU0IE1lcmdlICJjd2VicC90aWZmZGVjOiBhZGQgVElGRiBtZXRhZGF0YSBleHRyYWN0aW9uIgorZTY0MDlhZGMgUmVtb3ZlIHJlZHVuZGFudCBpbmNsdWRlIGZyb20gZHNwL2xvc3NsZXNzIGNvZGUuCisxYWI1YjNhNyBNZXJnZSAiY29uZmlndXJlOiBmaXggLS13aXRoLWdpZmluY2x1ZGVkaXIiCiswM2M3NDllYiBjb25maWd1cmU6IGZpeCAtLXdpdGgtZ2lmaW5jbHVkZWRpcgorOGI2NTA2MzUgbXVsdGlwbGUgbGliZ2lmIHZlcnNpb25zIHN1cHBvcnQgZm9yIGdpZjJ3ZWJwCis0NzZlMjkzZiBnaWYyd2VicDogVXNlIERHaWZPcGVuRmlsZU5hbWUoKQorYjUwZjI3N2IgdGlmZmRlYzogY29ycmVjdCBmb3JtYXQgc3RyaW5nCisyYjkwNDhlMyBNZXJnZSAidGlmZmRlYzogY2hlY2sgZXJyb3IgcmV0dXJucyBmb3Igd2lkdGgvaGVpZ2h0IgorYTFiNWE5YTMgTWVyZ2UgImN3ZWJwL3RpZmY6IHVzZSB0aGUgZmlyc3QgaW1hZ2UgZGlyZWN0b3J5IgorMDc5NDIzZjUgdGlmZmRlYzogY2hlY2sgZXJyb3IgcmV0dXJucyBmb3Igd2lkdGgvaGVpZ2h0CitkNjI4MjRhZiBNZXJnZSAiY3dlYnAvanBlZ2RlYzogYWRkIEpQRUcgbWV0YWRhdGEgZXh0cmFjdGlvbiIKKzAzYWZhY2E0IE1lcmdlICJjd2VicDogYWRkIFBORyBtZXRhZGF0YSBleHRyYWN0aW9uIgorMmM3MjQ5NjggY3dlYnAvanBlZ2RlYzogYWRkIEpQRUcgbWV0YWRhdGEgZXh0cmFjdGlvbgorZGJhNjRkOTEgY3dlYnA6IGFkZCBQTkcgbWV0YWRhdGEgZXh0cmFjdGlvbgorMWYwNzVmODkgTG9zc2xlc3Mgc3BlYyBjb3JyZWN0aW9ucy9yZXdvcmRpbmcvY2xhcmlmaWNhdGlvbnMKKzI5MTRlY2ZkIGN3ZWJwL3RpZmZkZWM6IGFkZCBUSUZGIG1ldGFkYXRhIGV4dHJhY3Rpb24KK2Q4MmEzZTMzIE1vcmUgY29ycmVjdGlvbnMvY2xhcmlmaWNhdGlvbnMgaW4gbG9zc2xlc3Mgc3BlYzoKK2JkMDAyNTU3IGN3ZWJwL3RpZmY6IHVzZSB0aGUgZmlyc3QgaW1hZ2UgZGlyZWN0b3J5CitkZjdhYTA3NiBNZXJnZSAiQ2xlYW51cCBhcm91bmQganBlZ2RlYyIKKzBmNTdkY2MzIGRlY29kaW5nIHNwZWVkLXVwICh+MSUpCitiY2VjMzM5YiBMb3NzbGVzcyBiaXRzdHJlYW0gY2xhcmlmaWNhdGlvbjoKKzZiZjIwODc0IGFkZCBleGFtcGxlcy9tZXRhZGF0YS5jCisyMDdmODljMCBNZXJnZSAiY29uZmlndXJlOiBhZGQgbGlid2VicGRlbXV4IHN0YXR1cyB0byBzdW1tYXJ5IgorMWJkMjg3YTYgQ2xlYW51cCBhcm91bmQganBlZ2RlYworOTE0NTU2NzkgTWVyZ2UgImNvc21ldGljczogdXNlICc9PSAwJyBpbiBzaXplIGNoZWNrcyIKK2Q2Yjg4Yjc2IGNvc21ldGljczogdXNlICc9PSAwJyBpbiBzaXplIGNoZWNrcworZDNkYWNlMmYgY29zbWV0aWNzOiBqcGVnZGVjCisyZjY5YWY3MyBjb25maWd1cmU6IGFkZCBsaWJ3ZWJwZGVtdXggc3RhdHVzIHRvIHN1bW1hcnkKKzFjMWM1NjQ2IGN3ZWJwOiBleHRyYWN0IHRpZmYgZGVjb2RpbmcgdG8gaXRzIG93biBtb2R1bGUKKzZhODcxZDY2IGN3ZWJwOiBleHRyYWN0IGpwZWcgZGVjb2RpbmcgdG8gaXRzIG93biBtb2R1bGUKKzJlZTIyOGY5IGN3ZWJwOiBleHRyYWN0IHBuZyBkZWNvZGluZyB0byBpdHMgb3duIG1vZHVsZQorNDY3OWRiMDAgTWVyZ2UgImN3ZWJwOiBhZGQgbWV0YWRhdGEgZnJhbWV3b3JrIgorNjNhYmEzYWUgY3dlYnA6IGFkZCBtZXRhZGF0YSBmcmFtZXdvcmsKKzkzMWJkNTE2IGxvc3NsZXNzIGJpdHN0cmVhbTogYmxvY2sgc2l6ZSBiaXRzIGNvcnJlY3Rpb24KK2U0ZmM0YzFjIGxvc3NsZXNzIGJpdHN0cmVhbTogYmxvY2sgc2l6ZSBiaXRzIGNvcnJlY3Rpb24KK2Q2NWVjNjc4IGZpeCBidWlsZCwgbW92ZSB0b2tlbi5jIHRvIHNyYy9lbmMvCis2NTdmNWM5MSBtb3ZlIHRva2VuIGJ1ZmZlciB0byBpdHMgb3duIGZpbGUgKHRva2VuLmMpCitjMzRhMzc1OCBpbnRyb2R1Y2UgR2V0TGFyZ2VWYWx1ZSgpIHRvIHNsaW0tZmFzdCBHZXRDb2VmZnMoKS4KK2Q1ODM4Y2Q1IGZhc3RlciBub24tdHJhbnNwb3NpbmcgU1NFMiA0eDQgRlRyYW5zZm9ybQorZjc2MTkxZjkgc3BlZWQgdXAgR2V0UmVzaWR1YWxDb3N0KCkKK2JhMmFhMGZkIEFkZCBzdXBwb3J0IGZvciBCSVRTPTI0IGNhc2UKKzJlN2Y2ZThlIG1ha2VmaWxlLnVuaXg6IERlcGVuZGVuY3kgb24gbGlicmFyaWVzCitkY2E4NDIxOSBNZXJnZSAiU2VwYXJhdGUgb3V0IG11eCBhbmQgZGVtdXggY29kZSBhbmQgbGlicmFyaWVzOiIKKzIzNzgyZjk1IFNlcGFyYXRlIG91dCBtdXggYW5kIGRlbXV4IGNvZGUgYW5kIGxpYnJhcmllczoKK2JkNTZhMDFmIGNvbmZpZ3VyZTogYWRkIHN1bW1hcnkgb3V0cHV0Cis5MGU1ZTMxOSBkd2VicCBtYW51YWw6IHBvaW50IHRvIHdlYnBtdXgsIGdpZjJ3ZWJwLgorNTQwNzkwY2EgZ2lmMndlYnAuYzogYWRkIGEgbm90ZSBhYm91dCBwcmVyZXF1aXNpdGVzCitkMWVkZjY5NyBjd2VicCBtYW4gcGFnZTogbWVhbmluZyBvZiAnLXEnIGZvciBsb3NzeS9sb3NzbGVzcworNzllZmExZDAgQWRkIG1hbiBwYWdlIGZvciBnaWYyd2VicCB1dGlsaXR5CisyMjQzZTQwYyBNZXJnZSAiZ2lmMndlYnAgYnVpbGQgc3VwcG9ydCB3aXRoIGF1dG9jb25mIHRvb2xzIgorYzQwZWZjYTEgZ2lmMndlYnAgYnVpbGQgc3VwcG9ydCB3aXRoIGF1dG9jb25mIHRvb2xzCis2NTIzZTJkNCBXZWJQIENvbnRhaW5lcjoKKzRkYTc4OGRhIE1lcmdlICJzaW1wbGlmeSB0aGUgZndkIHRyYW5zZm9ybSIKKzQyYzNiNTUwIHNpbXBsaWZ5IHRoZSBmd2QgdHJhbnNmb3JtCis0MWE2Y2VkOSB1c2VyIEdMZmxvYXQgaW5zdGVhZCBvZiBmbG9hdAorYjU0MjYxMTkgZml4IGluZGVudGF0aW9uCis2OGYyODJmNyAqIGhhbmRsZSBvZmZzZXQgaW4gYW5pbSB2aWV3ZXIgJ3Z3ZWJwJyAqIGZpeCBnaWYyd2VicCB0byBoYW5kbGUgZGlzcG9zYWwgbWV0aG9kIGFuZCBvZGQgb2Zmc2V0IGNvcnJlY3RseQorMTE4Y2IzMTIgTWVyZ2UgImFkZCBTU0UyIHZlcnNpb24gb2YgU3VtIG9mIFNxdWFyZSBlcnJvciBmb3IgMTZ4MTYsIDE2eDggYW5kIDh4OCBjYXNlIgorOGE3YzNjYzggTWVyZ2UgIkNoYW5nZSB0aGUgb3JkZXIgb2YgLWZyYW1lIGFyZ3VtZW50IHRvIGJlIG1vcmUgbmF0dXJhbCIKKzk5ZTBhNzA3IE1lcmdlICJTaW1wbGlmeSB0aGUgdGV4dHVyZSBldmFsdWF0aW9uIERpc3RvNHg0KCkiCiswZjkyM2MzZiBtYWtlIHRoZSBidW5kbGluZyB3b3JrIGluIGEgdG1wIGJ1ZmZlcgorZTVjM2IzZjUgU2ltcGxpZnkgdGhlIHRleHR1cmUgZXZhbHVhdGlvbiBEaXN0bzR4NCgpCis0ODYwMDA4NCBDaGFuZ2UgdGhlIG9yZGVyIG9mIC1mcmFtZSBhcmd1bWVudCB0byBiZSBtb3JlIG5hdHVyYWwKKzM1YmZkNGMwIGFkZCBTU0UyIHZlcnNpb24gb2YgU3VtIG9mIFNxdWFyZSBlcnJvciBmb3IgMTZ4MTYsIDE2eDggYW5kIDh4OCBjYXNlCithNzMwNWMyZSBDbGFyaWZpY2F0aW9uIGZvciB1bmtub3duIGNodW5rcworNGM0Mzk4ZTIgUmVmaW5lIFdlYlAgQ29udGFpbmVyIFNwZWMgd3J0IHVua25vd24gY2h1bmtzLgorMmNhNjQyZTAgUmVjdGlmeSBXZWJQTXV4R2V0RmVhdHVyZXM6Cis3Y2FhYjFkOCBTb21lIGNvc21ldGljL2NvbW1lbnQgZml4ZXMuCis2MGIyNjUxYSBNZXJnZSAiV3JpdGUgYSBHSUYgdG8gV2ViUCBjb252ZXJ0ZXIgYmFzZWQgb24gbGliZ2lmLiIKK2M3MTI3YTRkIE1lcmdlICJBZGQgTkVPTiB2ZXJzaW9uIG9mIEZUcmFuc2Zvcm1XSFQiCisxMWIyNzIxMiBXcml0ZSBhIEdJRiB0byBXZWJQIGNvbnZlcnRlciBiYXNlZCBvbiBsaWJnaWYuCitlOWExNWEzNyBFeFV0aWxXcml0ZUZpbGUoKSB0byB3cml0ZSBtZW1vcnkgc2VnbWVudCB0byBmaWxlCis3NDM1NmViNSBBZGQgYSBzaW1wbGUgY2xlYW51cCBzdGVwIGluIG11eCBhc3NlbWJseToKKzUxYmIxZTVkIG11eC5oOiBjb3JyZWN0IFdlYlBEZW11eFNlbGVjdEZyYWdtZW50KCkgcHJvdG90eXBlCisyMmEwZmQ5ZCBBZGQgTkVPTiB2ZXJzaW9uIG9mIEZUcmFuc2Zvcm1XSFQKK2ZhMzBjODYzIFVwZGF0ZSBtdXggY29kZSB0byBtYXRjaCB0aGUgc3BlYyB3cnQgYW5pbWF0aW9uCitkOWM1ZmJlZiBieS1wYXNzIEFuYWx5c2lzIHBhc3MgaW4gY2FzZSBzZWdtZW50cz0xCitkMmFkNDQ1MCBNZXJnZSBjaGFuZ2VzIEliZWNjZmZjMyxJZDE1ODViMTYKKzVjOGJlMjUxIE1lcmdlICJDaHVuayBmb3VyQ0NzIGZvciBYTVAvRVhJRiIKK2EwMGEzZGFmIFVzZSAnZnJnbScgaW5zdGVhZCBvZiAndGlsZScgaW4gd2VicG11eCBwYXJhbWV0ZXJzCis4MWI4YTc0MSBEZXNpZ24gY2hhbmdlIGluIEFOTUYgYW5kIEZSR00gY2h1bmtzOgorZjkwM2NiYWIgQ2h1bmsgZm91ckNDcyBmb3IgWE1QL0VYSUYKKzgxMjkzM2Q2IFR1bmUgcGVyZm9ybWFuY2Ugb2YgSGlzdG9ncmFtQ29tYmluZQorNTJhZDE5NzkgQW5pbWF0aW9uIHNwZWNpZmljYXRpb24gaW4gY29udGFpbmVyIHNwZWMKKzAwMWI5MzAyIEltYWdlIGZyYWdtZW50IHNwZWNpZmljYXRpb24gaW4gY29udGFpbmVyIHNwZWMKKzM5MWY5ZGI5IE9yZGVyaW5nIG9mIGRlc2NyaXB0aW9uIG9mIGJpdHMgaW4gY29udGFpbmVyIHNwZWMKK2Q1NzM1Nzc2IE1ldGFkYXRhIHNwZWNpZmljYXRpb24gaW4gY29udGFpbmVyIHNwZWMKKzFjNDYwOWIxIE1lcmdlIGNvbW1pdCAndjAuMi4xJworMGNhNTg0Y2IgTWVyZ2UgIkNvbG9yIHByb2ZpbGUgc3BlY2lmaWNhdGlvbiBpbiBjb250YWluZXIgc3BlYyIKK2U4YjQxYWQxIGFkZCBORU9OIGFzbSB2ZXJzaW9uIGZvciBXSFQgaW52ZXJzZSB0cmFuc2Zvcm0KK2FmNmYwZGIyIENvbG9yIHByb2ZpbGUgc3BlY2lmaWNhdGlvbiBpbiBjb250YWluZXIgc3BlYworYTYxYTgyNGIgTWVyZ2UgIkFkZCBOVUxMIGNoZWNrIGluIGNodW5rIEFQSXMiCiswZThiN2VlZCBmaXggV2ViUFBpY3R1cmVWaWV3KCkgdW5hc3NpZ25lZCBzdHJpZGVzCis3NWU1ZjE3ZSBBUk0vTkVPTjogMzAlIGVuY29kaW5nIHNwZWVkLXVwCiswMmI0MzU2OCBBZGQgTlVMTCBjaGVjayBpbiBjaHVuayBBUElzCithMDc3MDcyNyBtdXggc3RydWN0IG5hbWluZworNmM2NmRkZTggTWVyZ2UgIlR1bmUgTG9zc2xlc3MgZW5jb2RlciIKK2FiNWVhMjE3IFR1bmUgTG9zc2xlc3MgZW5jb2RlcgorNzRmZWZjOGMgVXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4yLjEsIG9yaWdpbi8wLjIuMCwgMC4yLjApCis5MmY4MDU5YyBSZW5hbWUgc29tZSBjaHVua3M6CiszYmI0YmJlYiBNZXJnZSAiTXV4IEFQSSBjaGFuZ2U6IgorZDBjNzlmMDUgTXV4IEFQSSBjaGFuZ2U6CithYmMwNjA0NCBNZXJnZSAidXBkYXRlIE5FV1MiIGludG8gMC4yLjAKKzU3Y2YzMTNiIHVwZGF0ZSBORVdTCisyNWY1ODVjNCBidW1wIHZlcnNpb24gdG8gMC4yLjEKK2ZlZDdjMDQ4IGxpYndlYnA6IHZhbGlkYXRlIGNodW5rIHNpemUgaW4gUGFyc2VPcHRpb25hbENodW5rcworNTUyY2Q5YmMgY3dlYnAgKHdpbmRvd3MpOiBmaXggYWxwaGEgaW1hZ2UgaW1wb3J0IG9uIFhQCitiMTRmZWE5OSBhdXRvY29uZi9saWJ3ZWJwOiBlbmFibGUgZGxsIGJ1aWxkcyBmb3IgbWluZ3cKKzRhOGZiMjcyIFtjZF13ZWJwOiBhbHdheXMgb3V0cHV0IHdpbmRvd3MgZXJyb3JzCitkNjYyMTU4MCBmaXggZG91YmxlIHRvIGZsb2F0IGNvbnZlcnNpb24gd2FybmluZworNzJiOTZhNjkgY3dlYnA6IGZpeCBqcGcgZW5jb2RlcyBvbiBYUAorNzM0Zjc2MmEgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0OiBmaXggb3ZlcmZsb3cgaW4gc2l6ZSBjYWxjdWxhdGlvbgorZjljYjU4ZmIgR2V0SGlzdG9CaXRzOiBmaXggaW50ZWdlciBvdmVyZmxvdworYjMwYWRkMjAgRW5jb2RlSW1hZ2VJbnRlcm5hbDogZml4IHVuaW5pdGlhbGl6ZWQgZnJlZQorM2RlNThkNzcgZml4IHRoZSAtZy9PMyBkaXNjcmVwYW5jeSBmb3IgMzJiaXQgY29tcGlsZQorNzdhYTdkNTAgZml4IHRoZSBCSVRTPTggY2FzZQorZTU5NzBiZGEgTWFrZSAqSW5pdFNTRTIoKSBmdW5jdGlvbnMgYmUgZW1wdHkgb24gbm9uLVNTRTIgcGxhdGZvcm0KK2VmNWNjNDdlIG1ha2UgKkluaXRTU0UyKCkgZnVuY3Rpb25zIGJlIGVtcHR5IG9uIG5vbi1TU0UyIHBsYXRmb3JtCitjNGVhMjU5ZCBtYWtlIFZQOERzcEluaXRORU9OKCkgcHVibGljCis4MzQ0ZWFkZiBNZXJnZSAibGlid2VicDogdmFsaWRhdGUgY2h1bmsgc2l6ZSBpbiBQYXJzZU9wdGlvbmFsQ2h1bmtzIgorNDgyOGJiOTMgTWVyZ2UgImN3ZWJwICh3aW5kb3dzKTogZml4IGFscGhhIGltYWdlIGltcG9ydCBvbiBYUCIKKzMwNzYzMzMzIGxpYndlYnA6IHZhbGlkYXRlIGNodW5rIHNpemUgaW4gUGFyc2VPcHRpb25hbENodW5rcworNzA0ODE4OTggQWNjdW11bGF0ZUxTSU06IGZpeCBkb3VibGUgLT4gZmxvYXQgd2FybmluZ3MKK2VkYThlZTRiIGN3ZWJwICh3aW5kb3dzKTogZml4IGFscGhhIGltYWdlIGltcG9ydCBvbiBYUAorYzZlOTg2NTggTWVyZ2UgImFkZCBFWFBFUklNRU5UQUwgY29kZSBmb3IgWVVWLUpQRUcgY29sb3JzcGFjZSIKK2YwMzYwYjRmIGFkZCBFWFBFUklNRU5UQUwgY29kZSBmb3IgWVVWLUpQRUcgY29sb3JzcGFjZQorZjg2ZTZhYmUgYWRkIExTSU0gbWV0cmljIHRvIFdlYlBQaWN0dXJlRGlzdG9ydGlvbigpCitjM2FhMjE1YSBTcGVlZCB1cCBIaXN0b2dyYW1Db21iaW5lIGZvciBsb3dlciBxdWFsaXRpZXMuCisxNzY1Y2IxYyBNZXJnZSAiYXV0b2NvbmYvbGlid2VicDogZW5hYmxlIGRsbCBidWlsZHMgZm9yIG1pbmd3IgorYTEzNTYyZTggYXV0b2NvbmYvbGlid2VicDogZW5hYmxlIGRsbCBidWlsZHMgZm9yIG1pbmd3Cis5ZjQ2OWI1NyB0eXBvOiBub19mYW5jeSAtPiBub19mYW5jeV91cHNhbXBsaW5nCisxYTI3ZjJmOCBNZXJnZSAiZml4IGRvdWJsZSB0byBmbG9hdCBjb252ZXJzaW9uIHdhcm5pbmciCitjZjFlOTBkZSBNZXJnZSAiY3dlYnA6IGZpeCBqcGcgZW5jb2RlcyBvbiBYUCIKK2YyYjVkMTliIFtjZF13ZWJwOiBhbHdheXMgb3V0cHV0IHdpbmRvd3MgZXJyb3JzCitlODU1MjA4YyBmaXggZG91YmxlIHRvIGZsb2F0IGNvbnZlcnNpb24gd2FybmluZworZWNkNjZmNzcgY3dlYnA6IGZpeCBqcGcgZW5jb2RlcyBvbiBYUAorN2IzZWIzNzIgVHVuZSBsb3NzbGVzcyBjb21wcmVzc2lvbiB0byBnZXQgYmV0dGVyIGdhaW5zLgorY2U4YmZmNDUgTWVyZ2UgIlZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldDogZml4IG92ZXJmbG93IGluIHNpemUgY2FsY3VsYXRpb24iCithYjViNjdhMSBNZXJnZSAiRW5jb2RlSW1hZ2VJbnRlcm5hbDogZml4IHVuaW5pdGlhbGl6ZWQgZnJlZSIKKzdmZWU1ZDEyIE1lcmdlICJHZXRIaXN0b0JpdHM6IGZpeCBpbnRlZ2VyIG92ZXJmbG93IgorYTZhZTA0ZDQgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0OiBmaXggb3ZlcmZsb3cgaW4gc2l6ZSBjYWxjdWxhdGlvbgorODAyMzdjNDMgR2V0SGlzdG9CaXRzOiBmaXggaW50ZWdlciBvdmVyZmxvdworOGE5OTcyMzUgRW5jb2RlSW1hZ2VJbnRlcm5hbDogZml4IHVuaW5pdGlhbGl6ZWQgZnJlZQorMGI5ZTY4MjkgbWlub3IgY29zbWV0aWNzCithNzkyYjkxMyBmaXggdGhlIC1nL08zIGRpc2NyZXBhbmN5IGZvciAzMmJpdCBjb21waWxlCis3M2JhNDM1NyBNZXJnZSAiZGV0ZWN0IGFuZCBtZXJnZSBzaW1pbGFyIHNlZ21lbnRzIgorZmVlNjYyNzUgZGV0ZWN0IGFuZCBtZXJnZSBzaW1pbGFyIHNlZ21lbnRzCiswYzQ0ZjQxNSBzcmMvd2VicC8qLmg6IGRvbid0IGZvcndhcmQgZGVjbGFyZSBlbnVtcyBpbiBDKysKK2Q3YTVhYzg2IHZ3ZWJwOiB1c2UgZGVtdXggaW50ZXJmYWNlCis5MzFlMGVhMSBNZXJnZSAicmVwbGFjZSAndHlwZWRlZiBzdHJ1Y3Qge30gWDsiIGJ5ICJ0eXBlZGVmIHN0cnVjdCBYIFg7IHN0cnVjdCBYIHt9OyIiCis4ZjIxNmY3ZSByZW1vdmUgY2FzZXMgb2YgZXF1YWwgY29tcGFyaXNvbiBmb3IgcXNvcnQoKQorMjhkMjVjODIgcmVwbGFjZSAndHlwZWRlZiBzdHJ1Y3Qge30gWDsiIGJ5ICJ0eXBlZGVmIHN0cnVjdCBYIFg7IHN0cnVjdCBYIHt9OyIKKzJhZmVlNjBhIHNwZWVkIHVwIGZvciBBUk0gdXNpbmcgOGJpdCBmb3IgYm9vbGVhbiBkZWNvZGVyCis1NzI1Y2FiYSBuZXcgc2VnbWVudGF0aW9uIGFsZ29yaXRobQorMmNmMWY4MTUgTWVyZ2UgImZpeCB0aGUgQklUUz04IGNhc2UiCisxMmY3OGFlYyBmaXggdGhlIEJJVFM9OCBjYXNlCis2OTIwYzcxZiBmaXggTVNWQyB3YXJuaW5ncyByZWdhcmRpbmcgaW1wbGljaXQgdWludDY0IHRvIHVpbnQzMiBjb252ZXJzaW9ucworZjZjMDk2YWEgd2VicG11eCBiaW5hcnk6IFJlbmFtZSAneG1wJyBvcHRpb24gdG8gJ21ldGEnCitkZGZlODcxYSB3ZWJwbXV4IGhlbHAgY29ycmVjdGlvbgorYjdjNTU0NDIgTWVyZ2UgIk1ha2UgKkluaXRTU0UyKCkgZnVuY3Rpb25zIGJlIGVtcHR5IG9uIG5vbi1TU0UyIHBsYXRmb3JtIgorMWMwNGEwZDQgQ29tbW9uIEFQSXMgZm9yIGNodW5rcyBtZXRhZGF0YSBhbmQgY29sb3IgcHJvZmlsZS4KKzJhMzExN2ExIE1lcmdlICJDcmVhdGUgV2ViUE11eEZyYW1lSW5mbyBzdHJ1Y3QgZm9yIE11eCBBUElzIgorNWMzYTcyMzEgTWFrZSAqSW5pdFNTRTIoKSBmdW5jdGlvbnMgYmUgZW1wdHkgb24gbm9uLVNTRTIgcGxhdGZvcm0KKzdjNmU2MGY0IG1ha2UgKkluaXRTU0UyKCkgZnVuY3Rpb25zIGJlIGVtcHR5IG9uIG5vbi1TU0UyIHBsYXRmb3JtCitjN2ViNDU3NiBtYWtlIFZQOERzcEluaXRORU9OKCkgcHVibGljCithYjMyMzRhZSBDcmVhdGUgV2ViUE11eEZyYW1lSW5mbyBzdHJ1Y3QgZm9yIE11eCBBUElzCitlMzk5MGZkOCBBbGlnbm1lbnQgZml4ZXMKK2U1NWZiZDZkIE1lcmdlIGJyYW5jaCAnMC4yLjAnCis0MjM4YmMwYSBVcGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjIuMCkKK2M2NTUzODBjIGRlYy9pby5jOiBjb3NtZXRpY3MKK2ZlMTk1OGYxIFJHQkE0NDQ0OiBoYXJtb25pemUgbG9zc2xlc3MvbG9zc3kgYWxwaGEgdmFsdWVzCis2ODFjYjMwYSBmaXggUkdCQTQ0NDQgb3V0cHV0IHcvZmFuY3kgdXBzYW1wbGluZworZjA2YzFkOGYgTWVyZ2UgIkFsaWdubWVudCBmaXgiIGludG8gMC4yLjAKK2Y1NmU5OGZkIEFsaWdubWVudCBmaXgKKzZmZTg0M2JhIGF2b2lkIHJnYi1wcmVtdWx0aXBseSBpZiB0aGVyZSdzIG9ubHkgdHJpdmlhbCBhbHBoYSB2YWx1ZXMKKzUyOGExMWFmIGZpeCB0aGUgQVJHQjQ0NDQgcHJlbXVsdGlwbHkgYXJpdGhtZXRpYworYTBhNDg4NTUgTG9zc2xlc3MgZGVjb2RlciBmaXggZm9yIGEgc3BlY2lhbCB0cmFuc2Zvcm0gb3JkZXIKKzYyZGQ5YmIyIFVwZGF0ZSBlbmNvZGluZyBoZXVyaXN0aWMgdy5yLnQgcGFsZXR0ZSBjb2xvcnMuCis2ZjQyNzJiMCByZW1vdmUgdW51c2VkIEFwcGx5SW52ZXJzZVRyYW5zZm9ybSgpCis5M2JmMGZhYSBVcGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjIuMC1yYzEpCis1OTM0ZmM1OSB1cGRhdGUgQVVUSE9SUworMDE0YTcxMWQgdXBkYXRlIE5FV1MKKzQzYjBkNjEwIGFkZCBzdXBwb3J0IGZvciBBUkdCIC0+IFlVVkEgY29udmVyc2lvbiBmb3IgbG9zc2xlc3MgZGVjb2RlcgorMzM3MDVjYTAgYnVtcCB2ZXJzaW9uIHRvIDAuMi4wCitjNDBkN2VmMSBmaXggYWxwaGEtcGxhbmUgY2hlY2sgKyBhZGQgZXh0cmEgY2hlY2tzCithMDZmODAyMyBNT0RFX1lVVkE6IHNldCBhbHBoYSB0byBvcGFxdWUgaWYgdGhlIGltYWdlIGhhcyBub25lCis1MmE4N2RkNyBNZXJnZSAic2lsZW5jZSBvbmUgbW9yZSB3YXJuaW5nIiBpbnRvIDAuMi4wCiszYjAyMzA5MyBzaWxlbmNlIG9uZSBtb3JlIHdhcm5pbmcKK2Y5NGIwNGYwIG1vdmUgc29tZSBSR0ItPllVViBmdW5jdGlvbnMgdG8geXV2LmgKKzRiNzFiYTAzIFJFQURNRTogc3luYyBbY2Rdd2VicCBoZWxwIG91dHB1dAorYzlhZTU3ZjUgbWFuL2R3ZWJwLjE6IGFkZCBsaW5rcyB0byBvdXRwdXQgZmlsZSBmb3JtYXQgZGV0YWlscworMjkyZWM1Y2MgcXVpZXQgYSBmZXcgJ3VuaW5pdGlhbGl6ZWQnIHdhcm5pbmdzCis0YWYzZjZjNCBmaXggaW5kZW50YXRpb24KKzliMjYxYmY1IHJlbW92ZSB0aGUgbGFzdCBOT1RfSEFWRV9MT0cyIGluc3RhbmNlcworMzIzZGM0ZDkgcmVtb3ZlIHVzZSBvZiBsb2cyKCkuIFVzZSBWUDhMRmFzdExvZzIoKSBpbnN0ZWFkLgorOGM1MTVkNTQgTWVyZ2UgImhhcm5lc3Mgc29tZSBtYWxsb2MvY2FsbG9jIHRvIHVzZSBXZWJQU2FmZU1hbGxvYyBhbmQgV2ViUFNhZmVDYWxsb2MiIGludG8gMC4yLjAKK2Q0YjRiYjAyIE1lcmdlIGNoYW5nZXMgSTQ2MDkwNjI4LEkxYTQxYjJjZSBpbnRvIDAuMi4wCitiZmYzNGFjMSBoYXJuZXNzIHNvbWUgbWFsbG9jL2NhbGxvYyB0byB1c2UgV2ViUFNhZmVNYWxsb2MgYW5kIFdlYlBTYWZlQ2FsbG9jCithM2MwNjNjNyBNZXJnZSAiZXh0cmEgc2l6ZSBjaGVjayBmb3Igc2VjdXJpdHkiIGludG8gMC4yLjAKKzVlNzk2MzAwIE1lcmdlICJXZWJQRW5jb2RlOiBjbGVhciBzdGF0cyBhdCB0aGUgc3RhcnQgb2YgZW5jb2RlIiBpbnRvIDAuMi4wCitmMWVkZjYyZiBNZXJnZSAicmF0aW9uYWxpemUgdXNlIG9mIGNvbG9yLWNhY2hlIiBpbnRvIDAuMi4wCitjMTkzMzMxNyBleHRyYSBzaXplIGNoZWNrIGZvciBzZWN1cml0eQorOTA2YmU2NTcgcmF0aW9uYWxpemUgdXNlIG9mIGNvbG9yLWNhY2hlCitkZDFjMzg3MyBBZGQgaW1hZ2UtaGludCBmb3IgbG93LWNvbG9yIGltYWdlcy4KKzRlYjdhYTY0IE1lcmdlICJXZWJQQ2hlY2tNYWxsb2MoKSBhbmQgV2ViUENoZWNrQ2FsbG9jKCk6IiBpbnRvIDAuMi4wCis4MGNjNzMwMyBXZWJQQ2hlY2tNYWxsb2MoKSBhbmQgV2ViUENoZWNrQ2FsbG9jKCk6CisxODNjYmE4MyBjaGVjayBWUDhMQml0V3JpdGVySW5pdCByZXR1cm4KK2NiZmE5ZWVjIGxvc3NsZXNzOiBmaXggY3Jhc2ggb24gdXNlciBhYm9ydAorMjU2YWZlZmEgY3dlYnA6IGV4aXQgaW1tZWRpYXRlbHkgb24gdmVyc2lvbiBtaXNtYXRjaAorNDc1ZDg3ZDcgV2ViUEVuY29kZTogY2xlYXIgc3RhdHMgYXQgdGhlIHN0YXJ0IG9mIGVuY29kZQorYTdjYzcyOTEgZml4IHR5cGUgYW5kIGNvbnZlcnNpb24gd2FybmluZ3MKKzdkODUzZDc5IGFkZCBzdGF0cyBmb3IgbG9zc2xlc3MKK2QzOTE3N2I3IG1ha2UgUXVhbnRpemVMZXZlbHMoKSBzdG9yZSB0aGUgc3VtIG9mIHNxdWFyZWQgZXJyb3IKKzU5NTVjZjVlIHJlcGxhY2UgeCoxNTUvMTAwIGJ5IHgqMTAxNTgxPj4xNgorN2Q3MzJmOTAgbWFrZSBRdWFudGl6ZUxldmVscygpIHN0b3JlIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvcgorZTQ1YTQ0NmEgcmVwbGFjZSB4KjE1NS8xMDAgYnkgeCoxMDE1ODE+PjE2CisxNTliNzVkMyBjd2VicCBvdXRwdXQgc2l6ZSBjb25zaXN0ZW5jeToKK2NiZWU1OWViIE1lcmdlIGNvbW1pdCAndjAuMS45OScKKzE4ODllOWI2IGR3ZWJwOiByZXBvcnQgLWFscGhhIG9wdGlvbgorM2JjM2Y3YzAgTWVyZ2UgImR3ZWJwOiBhZGQgUEFNIG91dHB1dCBzdXBwb3J0IiBpbnRvIDAuMi4wCitkOTE5ZWQwNiBkd2VicDogYWRkIFBBTSBvdXRwdXQgc3VwcG9ydAorODVlMjE1ZDMgUkVBRE1FL21hbnBhZ2VzL2NvbmZpZ3VyZTogdXBkYXRlIHdlYnNpdGUgbGluaworYzNhMjA3YjkgVXBkYXRlIENoYW5nZUxvZyAodGFnOiB2MC4xLjk5KQorZDFmZDc4MjYgTWVyZ2UgImFkZCBleHRyYSBwcmVjaXNpb24gYWJvdXQgZGVmYXVsdCB2YWx1ZXMgYW5kIGJlaGF2aW91ciIgaW50byAwLjIuMAorZWZjODI2ZTAgYWRkIGV4dHJhIHByZWNpc2lvbiBhYm91dCBkZWZhdWx0IHZhbHVlcyBhbmQgYmVoYXZpb3VyCis5ZjI5NjM1ZCBoZWFkZXIvZG9jIGNsZWFuIHVwCitmZjlmZDFiYSBNYWtlZmlsZS52YzogZml4IHdlYnBtdXguZXhlICotZHluYW1pYyBidWlsZHMKKzhhYWNjN2IwIHJlbW92ZSBJTkFNLCBJQ09QLCAuLi4gY2h1bmtzIGZyb20gdGhlIHRlc3Qgd2VicCBmaWxlLgorMmZjMTMwMTUgaGFybW9uaXplIGF1dGhvcnMgYXMgIk5hbWUgKG1haWxAYWRkcmVzcykiCis0YTlmMzdiNyBNZXJnZSAidXBkYXRlIE5FV1MiIGludG8gMC4yLjAKKzc0MTVhZTEzIG1ha2VmaWxlLnVuaXg6IHByb3ZpZGUgZXhhbXBsZXMvd2VicG11eCB0YXJnZXQKK2NlODJjZWRjIHVwZGF0ZSBORVdTCis2NDFlMjhlOCBNZXJnZSAibWFuL2N3ZWJwLjE6IHdvcmRpbmcsIGNoYW5nZSB0aGUgZGF0ZSIgaW50byAwLjIuMAorYzM3YzIzZTUgUkVBRE1FOiBjb3NtZXRpY3MKKzM5NzZkY2Q1IG1hbi9jd2VicC4xOiB3b3JkaW5nLCBjaGFuZ2UgdGhlIGRhdGUKKzNlNWJiZTFjIE1lcmdlICJyZW5hbWUgJ3VzZV9hcmdiX2lucHV0JyB0byAndXNlX2FyZ2InIiBpbnRvIDAuMi4wCitjZTkwODQ3YSBNZXJnZSAiYWRkIHNvbWUgcGFkZGluZyBieXRlcyBhcmVhcyBmb3IgbGF0ZXIgdXNlIiBpbnRvIDAuMi4wCisyMzkwZGFiYyBNZXJnZSAiZml4aW5nIHRoZSBmaW5kaW5ncyBieSBGcmVkZXJpYyBLYXlzZXIgdG8gdGhlIGJpdHN0cmVhbSBzcGVjIiBpbnRvIDAuMi4wCiswMjc1MTU5MSBhZGQgYSB2ZXJ5IGNydWRlIHByb2dyZXNzIHJlcG9ydCBmb3IgbG9zc2xlc3MKK2E0YjliMWM2IFJlbW92ZSBzb21lIHVudXNlZCBlbnVtIHZhbHVlcy4KK2RkMTA4MTc2IHJlbmFtZSAndXNlX2FyZ2JfaW5wdXQnIHRvICd1c2VfYXJnYicKKzkwNTE2YWU4IGFkZCBzb21lIHBhZGRpbmcgYnl0ZXMgYXJlYXMgZm9yIGxhdGVyIHVzZQorZDAzYjI1MDMgZml4aW5nIHRoZSBmaW5kaW5ncyBieSBGcmVkZXJpYyBLYXlzZXIgdG8gdGhlIGJpdHN0cmVhbSBzcGVjCitjZTE1NmFmYyBhZGQgbWlzc2luZyBBQkkgY29tcGF0aWJpbGl0eSBjaGVja3MKKzlkNDU0MTZhIE1lcmdlICJEb2M6IGNvbnRhaW5lciBzcGVjIHRleHQgdHdlYWtzIiBpbnRvIDAuMi4wCis0ZTJlMGE4YyBEb2M6IGNvbnRhaW5lciBzcGVjIHRleHQgdHdlYWtzCitmN2YxNmEyOSBhZGQgQUJJIGNvbXBhdGliaWxpdHkgY2hlY2sKKzJhNzc1NTcwIE1lcmdlICJzd2lnOiBhZGQgV2ViUEVuY29kZUxvc3NsZXNzKiB3cmFwcGVycyIgaW50byAwLjIuMAorYTNlYzYyMjUgbXV4Lmg6IHJlbW92ZSAnKiBjb25zdCcgZnJvbSBmdW5jdGlvbiBwYXJhbWV0ZXJzCiszMTQyNmViYSBlbmNvZGUuaDogcmVtb3ZlICcqIGNvbnN0JyBmcm9tIGZ1bmN0aW9uIHBhcmFtZXRlcnMKKzk4MzhlNWQ1IGRlY29kZS5oOiByZW1vdmUgJyogY29uc3QnIGZyb20gZnVuY3Rpb24gcGFyYW1ldGVycworNDk3MjMwMmQgc3dpZzogYWRkIFdlYlBFbmNvZGVMb3NzbGVzcyogd3JhcHBlcnMKKzlmZjAwY2FlIGJ1bXAgZW5jb2Rlci9kZWNvZGVyIHZlcnNpb25zCitjMjQxNmM5YiBhZGQgbG9zc2xlc3MgcXVpY2sgZW5jb2RpbmcgZnVuY3Rpb25zIHRvIHRoZSBwdWJsaWMgQVBJCis0YzFmNWQ2NCBNZXJnZSAiTkVXUzogbWVudGlvbiBkZWNvZGVfdnA4LmggaXMgbm8gbG9uZ2VyIGluc3RhbGxlZCIgaW50byAwLjIuMAorNmNiMjI3N2QgTkVXUzogbWVudGlvbiBkZWNvZGVfdnA4LmggaXMgbm8gbG9uZ2VyIGluc3RhbGxlZAorZDVlNWFkNjMgbW92ZSBkZWNvZGVfdnA4LmggZnJvbSB3ZWJwLyB0byBkZWMvCis4ZDNiMDRhMiBNZXJnZSAiaGVhZGVyIGNsZWFuLXVwIiBpbnRvIDAuMi4wCiswMjIwMWMzNSBNZXJnZSAicmVtb3ZlIG9uZSBtYWxsb2MoKSBieSBtYWtpbmcgY29sb3JfY2FjaGUgbm9uIGR5bmFtaWMiIGludG8gMC4yLjAKK2Q3MDhlYzE0IE1lcmdlICJtb3ZlIE1JTi9NQVhfSElTVE9fQklUUyB0byBmb3JtYXRfY29uc3RhbnRzLmgiIGludG8gMC4yLjAKK2FiMmRhM2U5IE1lcmdlICJhZGQgYSBtYWxsb2MoKSBjaGVjayIgaW50byAwLjIuMAorMmQ1NzFiZDggYWRkIGEgbWFsbG9jKCkgY2hlY2sKKzdmMGMxNzhlIHJlbW92ZSBvbmUgbWFsbG9jKCkgYnkgbWFraW5nIGNvbG9yX2NhY2hlIG5vbiBkeW5hbWljCis2NTY5Y2Q3YyBNZXJnZSAiVlA4TEZpbGxCaXRXaW5kb3c6IHVzZSA2NC1iaXQgcGF0aCBmb3IgbXN2YyB4NjQgYnVpbGRzIiBpbnRvIDAuMi4wCisyM2QzNGYzMSBoZWFkZXIgY2xlYW4tdXAKKzJhM2FiNmY5IG1vdmUgTUlOL01BWF9ISVNUT19CSVRTIHRvIGZvcm1hdF9jb25zdGFudHMuaAorOTg1ZDNkYTYgTWVyZ2UgInNodWZmbGUgdmFyaWFibGVzIGluIEhhc2hDaGFpbkZpbmRDb3B5IiBpbnRvIDAuMi4wCitjZGY4ODVjNiBzaHVmZmxlIHZhcmlhYmxlcyBpbiBIYXNoQ2hhaW5GaW5kQ29weQorYzNiMDE0ZGIgQW5kcm9pZC5tazogYWRkIG1pc3NpbmcgbG9zc2xlc3MgZmlsZXMKKzhjMWNjNmI1IG1ha2VmaWxlLnVuaXggZGlzdDogZXhwbGljaXRseSBuYW1lIGluc3RhbGxlZCBpbmNsdWRlcworN2Y0NjQ3ZWUgTWVyZ2UgImNsYXJpZnkgdGhlIGNvbG9yc3BhY2UgbmFtaW5nIGFuZCBieXRlIG9yZGVyaW5nIG9mIGRlY29kZWQgc2FtcGxlcyIgaW50byAwLjIuMAorY2JmNjk3MjQgY2xhcmlmeSB0aGUgY29sb3JzcGFjZSBuYW1pbmcgYW5kIGJ5dGUgb3JkZXJpbmcgb2YgZGVjb2RlZCBzYW1wbGVzCis4NTc2NTBjOCBNdXg6IEFkZCBXZWJQRGF0YUluaXQoKSBhbmQgcmVtb3ZlIFdlYlBJbWFnZUluZm8KK2ZmNzcxZTc3IGRvbid0IGluc3RhbGwgd2VicC9kZWNvZGVfdnA4LmgKKzU5NmRmZjc4IFZQOExGaWxsQml0V2luZG93OiB1c2UgNjQtYml0IHBhdGggZm9yIG1zdmMgeDY0IGJ1aWxkcworM2NhN2NlOTggTWVyZ2UgImRvYzogcmVtb3ZlIG5vbi1maW5hbGl6ZWQgY2h1bmsgcmVmZXJlbmNlcyIgaW50byAwLjIuMAorMWVmYWE1YTMgTWVyZ2UgImJ1bXAgdmVyc2lvbnMiIGludG8gMC4yLjAKKzUxZmExM2UxIE1lcmdlICJSRUFETUU6IHVwZGF0ZSBjd2VicCBoZWxwIG91dHB1dCIgaW50byAwLjIuMAorMTJmOWFlZGUgUkVBRE1FOiB1cGRhdGUgY3dlYnAgaGVscCBvdXRwdXQKK2YwYjVkZWZiIGJ1bXAgdmVyc2lvbnMKKzRjNDJhNjFiIHVwZGF0ZSBBVVRIT1JTCis2NDMxYTFjZSBkb2M6IHJlbW92ZSBub24tZmluYWxpemVkIGNodW5rIHJlZmVyZW5jZXMKKzgxMzBjNGNjIE1lcmdlICJidWlsZDogcmVtb3ZlIGxpYndlYnBtdXggZnJvbSBkZWZhdWx0IHRhcmdldHMvY29uZmlnIgorMjNiNDQ0MzggTWVyZ2UgImNvbmZpZ3VyZTogYnJvYWRlbiB0ZXN0IGZvciBsaWJwbmctY29uZmlnIgorODViZmYyY2QgTWVyZ2UgImRvYzogY29ycmVjdCBsb3NzbGVzcyBwcmVmaXggY29kaW5nIHRhYmxlICYgY29kZSIKKzA1MTA4ZjZlIE1lcmdlICJNb3JlIHNwZWMvY29kZSBtYXRjaGluZyBpbiBtdXg6IgorNjgwOGU2OWQgTW9yZSBzcGVjL2NvZGUgbWF0Y2hpbmcgaW4gbXV4OgorYmQyYjQ2ZjUgTWVyZ2UgImRvYy93ZWJwLWNvbnRhaW5lci1zcGVjOiBsaWdodCBjb3NtZXRpY3MiCisyMGVhZDMyOSBkb2Mvd2VicC1jb250YWluZXItc3BlYzogbGlnaHQgY29zbWV0aWNzCisxZDQwYThiYyBjb25maWd1cmU6IGFkZCBwdGhyZWFkIGRldGVjdGlvbgorYjVlOTA2N2EgZml4IHNvbWUgaW50IDwtPiBzaXplX3QgbWl4IGZvciBidWZmZXIgc2l6ZXMKK2U0MWE3NTk2IGJ1aWxkOiByZW1vdmUgbGlid2VicG11eCBmcm9tIGRlZmF1bHQgdGFyZ2V0cy9jb25maWcKKzBmYzJiYWFlIGNvbmZpZ3VyZTogYnJvYWRlbiB0ZXN0IGZvciBsaWJwbmctY29uZmlnCis0NWI4MjcyYyBNZXJnZSAicmVzdG9yZSBhdXRob3JzaGlwIHRvIGxvc3NsZXNzIGJpdHN0cmVhbSBkb2MiCiswNmJhMDU5MCByZXN0b3JlIGF1dGhvcnNoaXAgdG8gbG9zc2xlc3MgYml0c3RyZWFtIGRvYworNDRhMDlhM2MgYWRkIG1pc3NpbmcgZGVzY3JpcHRpb24gb2YgdGhlIGFscGhhIGZpbHRlcmluZyBtZXRob2RzCis2M2RiODdkZCBNZXJnZSAidndlYnA6IGFkZCBjaGVja2JvYXJkIGJhY2tncm91bmQgZm9yIGFscGhhIGRpc3BsYXkiCithNzNiODk3OCB2d2VicDogYWRkIGNoZWNrYm9hcmQgYmFja2dyb3VuZCBmb3IgYWxwaGEgZGlzcGxheQorOTM5MTU4Y2UgTWVyZ2UgInZ3ZWJwOiBmaXggaW5mbyBkaXNwbGF5IgorYjM1YzA3ZDkgdndlYnA6IGZpeCBpbmZvIGRpc3BsYXkKKzQ4YjM5ZWIxIGZpeCB1bmRlcmZsb3cgZm9yIHZlcnkgc2hvcnQgYml0c3RyZWFtcworN2U2MjI5ODQgY29zbWV0aWNzOiBwYXJhbSBhbGlnbm1lbnQsIG1hbnBhZ2Ugd29yZGluZworMWJkN2RkNTAgTWVyZ2UgY2hhbmdlcyBJN2IwYWZiMGQsSTdlY2M5NzA4CithYzY5ZTYzZSBNZXJnZSAiVXBkYXRlZCBjd2VicCBtYW4ncyBoZWxwIGZvciBBbHBoYSAmIExvc3NsZXNzLiIKK2MwZTg4NTlkIEdldCByaWQgb2YgaW1hZ2VfaW5mb18gZnJvbSBXZWJQQ2h1bmsgc3RydWN0LgorMTM1Y2E2OWUgV2ViUCBDb250YWluZXIgU3BlYzoKK2ViNmY5YjhhIFVwZGF0ZWQgY3dlYnAgbWFuJ3MgaGVscCBmb3IgQWxwaGEgJiBMb3NzbGVzcy4KKzBmYTg0NGZiIGNvc21ldGljIGZpeGVzIG9uIGFzc2VydCBhbmQgJ2NvbnN0JyB3aGVyZSBhcHBsaWNhYmxlCis3ZjIyYmQyNSBjaGVjayBsaW1pdCBvZiB3aWR0aCAqIGhlaWdodCBpcyAzMiBiaXRzCisxNmM0NmU4MyBhdXRvY29uZi9tYWtlOiBjb3NtZXRpY3M6IGJyZWFrIGxvbmcgbGluZXMKK2FiMjJhMDdhIGNvbmZpZ3VyZTogYWRkIGhlbHBlciBtYWNybyB0byBkZWZpbmUgLS13aXRoLSoKK2MxNzY5OWIzIGNvbmZpZ3VyZTogYWRkIGxpYnRpZmYgdGVzdAorMGUwOTczMmMgTWVyZ2UgImN3ZWJwOiBmaXggY3Jhc2ggd2l0aCB5dXYgaW5wdXQgKyBsb3NzbGVzcyIKKzg4YTUxMGZmIE1lcmdlICJmaXggYmlnLWVuZGlhbiBWUDhMV3JpdGVCaXRzIgorZGE5OWUzYmYgTWVyZ2UgIk1ha2VmaWxlLnZjOiBzcGxpdCBtdXggaW50byBzZXBhcmF0ZSBsaWIiCis3YmRhMzkyYiBjd2VicDogZml4IGNyYXNoIHdpdGggeXV2IGlucHV0ICsgbG9zc2xlc3MKK2Y1NmEzNjlhIGZpeCBiaWctZW5kaWFuIFZQOExXcml0ZUJpdHMKKzU0MTY5ZDZjIE1lcmdlICJjd2VicDogbmFtZSBJbnB1dEZpbGVGb3JtYXQgbWVtYmVycyBjb25zaXN0ZW50bHkiCitlMmZlZWZhOSBNYWtlZmlsZS52Yzogc3BsaXQgbXV4IGludG8gc2VwYXJhdGUgbGliCisyN2NhYTVhYSBNZXJnZSAiY3dlYnA6IGFkZCBiYXNpYyBUSUZGIHN1cHBvcnQiCitkODkyMWRkNCBjd2VicDogbmFtZSBJbnB1dEZpbGVGb3JtYXQgbWVtYmVycyBjb25zaXN0ZW50bHkKKzZmNzZkMjQ2IGN3ZWJwOiBhZGQgYmFzaWMgVElGRiBzdXBwb3J0Cis0NjkxNDA3YiBNZXJnZSBjaGFuZ2VzIElmMzlhYjdmNSxJMzY1OGI1YWUKK2NjYTdjN2I4IEZpeGVkIG5pdDogMTAgLT4gMTAuZgorNWQwOWEyNDQgV2ViUE11eENyZWF0ZSgpIGVycm9yIGhhbmRsaW5nOgorNzc3MzQxYzMgRml4IGEgbWVtbGVhayBpbiBXZWJQTXV4Q3JlYXRlKCkKKzYxYzlkMTYxIGRvYzogY29ycmVjdCBsb3NzbGVzcyBwcmVmaXggY29kaW5nIHRhYmxlICYgY29kZQorNGMzOTc1NzkgTWVyZ2UgIm1hcmsgVlA4eyxMfXtHZXRJbmZvLENoZWNrU2lnbmF0dXJlfSBhcyBXRUJQX0VYVEVSTiIKK2U0ZTM2Y2M2IE1lcmdlICJNdXg6IEFsbG93IG9ubHkgc29tZSBmcmFtZXMvdGlsZXMgdG8gaGF2ZSBhbHBoYS4iCithZDJhYWQzYyBNZXJnZSAiV2ViUCBEZWNvZGluZyBlcnJvciBoYW5kbGluZzoiCis5NzY0OWM4ZiBNdXg6IEFsbG93IG9ubHkgc29tZSBmcmFtZXMvdGlsZXMgdG8gaGF2ZSBhbHBoYS4KK2Y4NjRiZTNiIExvd2VyIHRoZSBxdWFsaXR5IHNldHRpbmdzIGZvciBBbHBoYSBlbmNvZGluZy4KKzNiYTgxYmJlIFdlYlAgRGVjb2RpbmcgZXJyb3IgaGFuZGxpbmc6CitmY2M2OTkyMyBhZGQgYXV0b21hdGljIFlVVkEvQVJHQiBjb252ZXJzaW9uIGR1cmluZyBXZWJQRW5jb2RlKCkKKzgwMmUwMTJhIGZpeCBjb21waWxhdGlvbiBpbiBub24tRkFOQ1lfVVBTQU1QTElORyBtb2RlCitlMDEyZGZkOSBtYWtlIHdpZHRoL2hlaWdodCBjb2RpbmcgbWF0Y2ggdGhlIHNwZWMKKzIyOGQ5NmE1IG1hcmsgVlA4eyxMfXtHZXRJbmZvLENoZWNrU2lnbmF0dXJlfSBhcyBXRUJQX0VYVEVSTgorNjM3YTMxNGYgcmVtb3ZlIHRoZSBub3cgdW51c2VkICpLZWVwQSB2YXJpYW50cworZDExZjZmY2Mgd2VicG11eCByZXR1cm5zIGVycm9yIHN0cmluZ3MgcmF0aGVyIHRoYW4gbnVtYmVycworZmNlYzA1OTMgbWFrZWZpbGUudW5peDogY3dlYnA6IGZpeCBPU1ggbGluaworNmI4MTFmMWIgTWVyZ2UgImRvYzogcmVtb3ZlIGxvc3NsZXNzIHBkZiIKK2M5NjM0ODIxIGRvYzogcmVtb3ZlIGxvc3NsZXNzIHBkZgorYjlhZTRmMGQgY29zbWV0aWNzIGFmdGVyIG11eCBjaGFuZ2VzIGI3NGVkNmUsIGI0OTRhZDUKK2I0OTRhZDUwIE11eDogb25seSBhbGxvdyBhZGRpbmcgZnJhbWUvdGlsZXMgYXQgdGhlIGVuZC4KKzJjMzQxYjBlIE1lcmdlICJBZGRlZCBpbWFnZSBjaGFyYWN0ZXJpc3RpYyBoaW50IGZvciB0aGUgY29kZWMuIgorZDM3MzA3NmEgQWRkZWQgaW1hZ2UgY2hhcmFjdGVyaXN0aWMgaGludCBmb3IgdGhlIGNvZGVjLgorMmVkMmFkYjUgTWVyZ2UgIm1zdmM6IGFkZCBpbnRyaW5zaWMgYmFzZWQgQml0c0xvZzJGbG9vciIKK2U1OTVlN2M1IE1lcmdlICJhZGQgZGVtdXguYyB0byB0aGUgbWFrZWZpbGVzIgorZGE0N2I1YmQgTWVyZ2UgImRlbXV4OiBhZGQge05leHQsUHJldn1DaHVuayIKK2U1ZjQ2NzQyIGFkZCBkZW11eC5jIHRvIHRoZSBtYWtlZmlsZXMKKzQ3MDgzOTNjIGRlbXV4OiBhZGQge05leHQsUHJldn1DaHVuaworZThhMGE4MjEgZGVtdXg6IHF1aWV0IG1zdmMgd2FybmluZ3MKKzdmODQ3MmE2IFVwZGF0ZSB0aGUgV2ViUCBDb250YWluZXIgU3BlYy4KKzMxYjY4ZmU2IGNsZWFudXAgV2ViUFBpY3R1cmUgc3RydWN0IGFuZCBBUEkKKzkxNDRhMTg2IGFkZCBvdmVyZmxvdyBjaGVjayBiZWZvcmUgY2FsbGluZyBtYWxsb2MoKQorODE3MjBjOTEgY29uc2lzdGVuY3kgY29zbWV0aWNzCisyZWJlODM5NCBNZXJnZSAiQWRkIGtyYW1kb3duIHZlcnNpb24gaW5mb3JtYXRpb24gdG8gUkVBRE1FIgorNzE0NDMwODQgZW5jL3ZwOGwuYzogZml4IGJ1aWxkCitiN2FjMTlmZSBBZGQga3JhbWRvd24gdmVyc2lvbiBpbmZvcm1hdGlvbiB0byBSRUFETUUKK2VmZGNiNjY3IE1lcmdlICJFZGl0IGZvciBjb25zaXN0ZW5jeSwgdXNhZ2UgYW5kIGdyYW1tYXIuIgorMDgyMjAxMDIgRW5hYmxlIGFscGhhIGluIHZ2d2VicAorOGRlOWEwODQgTWVyZ2UgIk11eCBBUEkgY2hhbmdlOiIKK2I3NGVkNmU3IE11eCBBUEkgY2hhbmdlOgorMjMzYTU4OWUgdGFrZSBwaWN0dXJlLT5hcmdiX3N0cmlkZSBpbnRvIGFjY291bnQgZm9yIGxvc3NsZXNzIGNvZGluZworMDRlMzNmMTcgRWRpdCBmb3IgY29uc2lzdGVuY3ksIHVzYWdlIGFuZCBncmFtbWFyLgorYTU3NWI0YmMgTWVyZ2UgImNvc21ldGljczogYWRkIG1pc3NpbmcgY29uc3QiCis4ZDk5YjBmNCBNZXJnZSAiY29zbWV0aWNzOiByZW1vdmUgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBwcm90byIKKzY5ZDAyMjE3IGNvc21ldGljczogYWRkIG1pc3NpbmcgY29uc3QKKzViMDgzMThiIGNvc21ldGljczogcmVtb3ZlIHVuaW1wbGVtZW50ZWQgZnVuY3Rpb24gcHJvdG8KK2I3ZmIwZWQ1IExvZyB3YXJuaW5nIGZvciB1bnN1cHBvcnRlZCBvcHRpb25zIGZvciBsb3NzbGVzcy4KK2UxZjc2OWZlIG1zdmM6IGFkZCBpbnRyaW5zaWMgYmFzZWQgQml0c0xvZzJGbG9vcgorOGE2OWM3ZDggQnVnLWZpeDogQ2xhbXAgYmFja3dhcmQgZGlzdCB0byAxLgorYjViNmFjOTcgTWVyZ2UgIkJyaW5nIHRoZSBzcGVjaWFsIHdyaXRlciAnV2ViUE1lbW9yeVdyaXRlcicgdG8gcHVibGljIEFQSSIKK2E2YTE5MDlmIE1lcmdlICJGaXggZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9uIHdpdGggY3dlYnAgLXByb2dyZXNzIgorZjJjZWUwNjcgRml4IGZsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbiB3aXRoIGN3ZWJwIC1wcm9ncmVzcworOTFiN2E4YzcgQnJpbmcgdGhlIHNwZWNpYWwgd3JpdGVyICdXZWJQTWVtb3J5V3JpdGVyJyB0byBwdWJsaWMgQVBJCiszMTBlMjk3MiBzdXBwb3J0IHJlc2l6ZSBhbmQgY3JvcCBmb3IgUkdCQSBpbnB1dAorYTg5ODM1ZDMgTWVyZ2UgY2hhbmdlcyBJY2U2NjI5NjAsSWU4ZDdhYTkwLEkyZDk5NmQ1ZSxJMDFjMDQ3NzIKK2NlNjE0YzBjIE1lcmdlICJkZWMvdnA4OiBhdm9pZCBzZXR0aW5nIGRlY29kZXIgc3RhdHVzIHR3aWNlIgorOTAwMjg1ZGEgZGVjL3ZwODogYXZvaWQgc2V0dGluZyBkZWNvZGVyIHN0YXR1cyB0d2ljZQorODIyN2FkYzggTWVyZ2UgY2hhbmdlcyBJNmYwMmIwZDAsSTVjYmM5YzBhLEk5ZGQ5ZDRlZCxJZDY4NGQyYTEKK2RjZGE1OWMxIE1lcmdlICJkZW11eDogcmVuYW1lIFNldFRpbGUgdG8gU2VsZWN0VGlsZSIKKzYyMmVmMTJlIGRlbXV4OiByZW5hbWUgU2V0VGlsZSB0byBTZWxlY3RUaWxlCis4MWViZDM3NSBNZXJnZSAiZGVtdXg6IGFkZCB7TmV4dCxQcmV2fUZyYW1lIgorMDJkZDM3YTIgZGVtdXg6IGFkZCB7TmV4dCxQcmV2fUZyYW1lCis0Yjc5ZmE1OSBNZXJnZSAiTGltaXQgdGhlIG1heGltdW0gc2l6ZSBvZiBodWZmbWFuIEltYWdlIHRvIDE2TUIuIgorOWFhMzRiMzQgTWFudWFsbHkgbnVtYmVyICJjaGFwdGVycywiIGFzIGNoYXB0ZXIgbnVtYmVycyBhcmUgdXNlZCBpbiB0aGUgbmFycmF0aXZlLgorMmE0YzZjMjkgUmUtd3JhcCBhdCA8PSA3MiBjb2x1bW5zCithNDVhZGMxOSBBcHBseSBpbmxpbmUgZW1waGFzaXMgYW5kIG1vbm9zcGFjaW5nLCBwZXIgZ2RvYyAvIFBERgorOTEwMTEyMDYgSW5jb3Jwb3JhdGUgZ2RvYyBjaGFuZ2VzIHRocm91Z2ggMjAxMi0wNi0wOAorN2ExODI0ODcgUmVtb3ZlZCBDb2RlUmF5IHN5bnRheCBkZWNsYXJhdGlvbnMgLi4uCitiM2VjMThjNSBQcm92aWRlIGZvciBjb2RlLWJsb2NrIHN5bnRheCBoaWdobGlnaHRpbmcuCis3MDlkNzcwMiBSZXBsYWNlIGhpZ2ggQVNDSUkgYXJ0aWZhY3RzIChjdXJseSBxdW90ZXMsIGV0Yy4pLgorOTMwZThhYmIgTG9zc2xlc3MgV2ViUCBkb2MgbGFyZ2VseSBwb3J0ZWQgdG8gbWFya2Rvd24gdGV4dC4KKzE4Y2FlMzdiIG1zdmM6IHNpbGVuY2Ugc29tZSBidWlsZCB3YXJuaW5ncworYjM5MjMwODQgTGltaXQgdGhlIG1heGltdW0gc2l6ZSBvZiBodWZmbWFuIEltYWdlIHRvIDE2TUIuCitmMTgwZGYyYSBNZXJnZSAibGlid2VicC9kZW11eDogYWRkIEZyYW1lL0NodW5rIGl0ZXJhdGlvbiIKKzJiYmUxYzlhIE1lcmdlICJFbmFibGUgbG9zc2xlc3MgZW5jb2RlciBjb2RlIgorZDA2MDFiMDEgTWVyZ2UgY2hhbmdlcyBJMWQ5N2E2MzMsSTgxYzU5MDkzCis3OGYzZTM0NSBFbmFibGUgbG9zc2xlc3MgZW5jb2RlciBjb2RlCitkOTc0YTljYyBNZXJnZSAibGlid2VicC9kZW11eDogYWRkIHNpbXBsZSBmb3JtYXQgcGFyc2luZyIKKzI2YmYyMjMyIE1lcmdlICJsaWJ3ZWJwOiBhZGQgV2ViUERlbXV4IHN0dWIgZnVuY3Rpb25zIgorMmY2NjY2ODggTWVyZ2UgIm1vZGlmeSBXZWJQUGFyc2VIZWFkZXJzIHRvIGFsbG93IHJldXNlIGJ5IEdldEZlYXR1cmVzIgorYjQwMmIxZmIgbGlid2VicC9kZW11eDogYWRkIEZyYW1lL0NodW5rIGl0ZXJhdGlvbgorYWQ5YWRhM2IgbGlid2VicC9kZW11eDogYWRkIFdlYlBEZW11eEdldEkKKzJmMmQ0ZDU4IGxpYndlYnAvZGVtdXg6IGFkZCBleHRlbmRlZCBmb3JtYXQgcGFyc2luZworOTYyZGNlZjYgbGlid2VicC9kZW11eDogYWRkIHNpbXBsZSBmb3JtYXQgcGFyc2luZworZjhmOTQwODEgbGlid2VicDogYWRkIFdlYlBEZW11eCBzdHViIGZ1bmN0aW9ucworZmI0N2JiNWMgTWVyZ2UgIk51bU5hbWVkRWxlbWVudHMoKSBzaG91bGQgdGFrZSBhbiBlbnVtIHBhcmFtLiIKKzdjNjg5ODA1IEZpeCBhc3NlcnRzIGluIFBhbGV0dGUgYW5kIEJhY2t3YXJkUmVmZXJlbmNlIGNvZGUuCitmYmRjYjdlYSBOdW1OYW1lZEVsZW1lbnRzKCkgc2hvdWxkIHRha2UgYW4gZW51bSBwYXJhbS4KK2ZiNDk0M2JkIG1vZGlmeSBXZWJQUGFyc2VIZWFkZXJzIHRvIGFsbG93IHJldXNlIGJ5IEdldEZlYXR1cmVzCiszNjk3YjVjZSB3cml0ZSBhbiBhZC1ob2MgRW5jb2RlSW1hZ2VJbnRlcm5hbCB2YXJpYW50CitlYWVlOWU3OSBCdWctRml4OiBEZWNvZGUgc21hbGwgKGxlc3MgdGhhbiAzMiBieXRlcykgaW1hZ2VzLgorMGJjZWFlNDggTWVyZ2UgImN3ZWJwOiBmaXggYWxwaGEgcmVwb3J0aW5nIGluIHN0YXRzIG91dHB1dCIKKzA0MjRiMWVmIFJlYmFzZSBkZWZhdWx0IGVuY29kaW5nIHNldHRpbmdzLgorYzcxZmY5ZTMgY3dlYnA6IGZpeCBhbHBoYSByZXBvcnRpbmcgaW4gc3RhdHMgb3V0cHV0CitlMmZmZTQ0NiBNZXJnZSAiU3RvcCBpbmRlZmluaXRlIHJlY3Vyc2lvbiBmb3IgSHVmZm1hbiBJbWFnZS4iCis3MGViMmJkNiBTdG9wIGluZGVmaW5pdGUgcmVjdXJzaW9uIGZvciBIdWZmbWFuIEltYWdlLgorZjNiYWI4ZWIgVXBkYXRlIHZ3ZWJwCis2ZDVjNzk3YyBSZW1vdmUgc3VwcG9ydCBmb3IgcGFydGlhbCBmaWxlcyBpbiBNdXguCitmMWRmNTU4NyBXZWJQTXV4QXNzZW1ibGUoKSByZXR1cm5zIFdlYlBEYXRhKi4KKzgxNGEwNjM5IFJlbmFtZSAnQWRkJyBBUElzIHRvICdTZXQnLgorYmJiMDIxOGYgVXBkYXRlIE11eCBwc3VlZG8tY29kZSBleGFtcGxlcy4KKzRmYzRhNDdmIFVzZSBXZWJQRGF0YSBpbiBNVVggc2V0IEFQSXMKK2M2N2JjOTc5IE1lcmdlICJhZGQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKCkgYW5kIFdlYlBQaWN0dXJlSW1wb3J0QkdSWCgpIgorMjc1MTliYzIgYWRkIFdlYlBQaWN0dXJlSW1wb3J0UkdCWCgpIGFuZCBXZWJQUGljdHVyZUltcG9ydEJHUlgoKQorZjgwY2QyN2UgZmFjdG9yaXplIGNvZGUgaW4gSW1wb3J0KCkKKzliNzE1MDI2IGhpc3RvZ3JhbTogYWRkIGxvZzIgd3JhcHBlcgorOGMzNDM3OGYgTWVyZ2UgImZpeCBzb21lIGltcGxpY2l0IHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncyIKKzQyZjZkZjlkIGZpeCBzb21lIGltcGxpY2l0IHR5cGUgY29udmVyc2lvbiB3YXJuaW5ncworMjUwYzE2ZTMgTWVyZ2UgImRvYzogdXBkYXRlIGxvc3NsZXNzIHBkZiIKKzlkOWRhYmE0IE1lcmdlICJhZGQgYSBQREYgb2YgdGhlIGxvc3NsZXNzIHNwZWMiCis4ZmJiOTE4OCBwcmVmZXIgd2VicC90eXBlcy5oIG92ZXIgc3RkaW50LmgKKzBjYTE3MGMyIGRvYzogdXBkYXRlIGxvc3NsZXNzIHBkZgorMDg2MmFjNmUgYWRkIGEgUERGIG9mIHRoZSBsb3NzbGVzcyBzcGVjCis0Mzc5OTlmYiBpbnRyb2R1Y2UgYSBnZW5lcmljIFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KCkgZnVuY3Rpb24KK2QyYjZjNmMwIGNvc21ldGljIGZpeGVzIGFmdGVyIElkYWJhMjgxYQorYjRlNjY0NWMgTWVyZ2UgImFkZCBjb2xvcnNwYWNlIGZvciBwcmVtdWx0aXBsaWVkIGFscGhhIgorNDhmODI3NTcgYWRkIGNvbG9yc3BhY2UgZm9yIHByZW11bHRpcGxpZWQgYWxwaGEKKzA2OWY5MDNhIENoYW5nZSBpbiBsb3NzbGVzcyBiaXQtc3RyZWFtLgorNWY3YmIzZjUgTWVyZ2UgIldlYlBSZXBvcnRQcm9ncmVzczogdXNlIG5vbi1lbmNvZGVyIHNwZWNpZmljIHBhcmFtcyIKK2YxODI4MWZmIFdlYlBSZXBvcnRQcm9ncmVzczogdXNlIG5vbi1lbmNvZGVyIHNwZWNpZmljIHBhcmFtcworOWVmMzIyODMgQWRkIHN1cHBvcnQgZm9yIHJhdyBsb3NzbGVzcyBiaXRzdHJlYW0gaW4gZGVjb2Rlci4KKzdjYmVlMjlhIEZpeCBidWc6IEluaXRJbyByZXNldGluZyBmYW5jeV91cHNhbXBsaW5nIGZsYWcuCis4ODBmZDk4YyB2d2VicDogZml4IGV4aXQgdy9mcmVlZ2x1dAorMTg3NWQ5MjYgdHJhcCB0d28gdW5jaGVja2VkIGVycm9yIGNvbmRpdGlvbnMKKzg3YjRhOTA4IG5vIG5lZWQgdG8gaGF2ZSBtdXguaCBhcyBub2luc3QgY2xhdXNlIGluIGVuYy8KKzg4ZjQxZWM2IGRvYzogZml4IGJpdCBhbGlnbm1lbnQgaW4gVlA4WCBjaHVuaworNTJmNWE0ZWYgTWVyZ2UgImZpeCBidWcgd2l0aCBsb3NzeS1hbHBoYSBvdXRwdXQgc3RyaWRlIgorM2JkZTIyZDcgZml4IGJ1ZyB3aXRoIGxvc3N5LWFscGhhIG91dHB1dCBzdHJpZGUKKzQyZDYxYjZkIHVwZGF0ZSB0aGUgc3BlYyBmb3IgdGhlIGxvc3N5LWFscGhhIGNvbXByZXNzaW9uIG1ldGhvZHMuCitlNzVkYzgwNSBNb3ZlIHNvbWUgbW9yZSBkZWZpbmVzIHRvIGZvcm1hdF9jb25zdGFudHMuaAorYzEzZjY2MzIgTW92ZSBjb25zdHMgdG8gaW50ZXJuYWwgaGVhZGVyIGZvcm1hdF9jb25zdGFudHMuaAorN2YyZGZjOTIgdXNlIGEgYml0LXNldCB0cmFuc2Zvcm1zX3NlZW5fIGluc3RlYWQgb2YgbG9vcGluZworMThkYTFmNTMgbW9kdWxhdGUgYWxwaGEtY29tcHJlc3Npb24gZWZmb3J0IGFjY29yZGluZyB0byBjb25maWcubWV0aG9kCitmNWYyZmZmNiBNZXJnZSAiQWxwaGEgZmxhZyBmaXggZm9yIGxvc3NsZXNzLiIKK2M5NzVjNDRlIEFscGhhIGZsYWcgZml4IGZvciBsb3NzbGVzcy4KKzRmMDY3ZmIyIE1lcmdlICJBbmRyb2lkOiBvbmx5IGJ1aWxkIGRlY19uZW9uIHdpdGggTkVPTiBzdXBwb3J0IgorMjU1YzY2YjQgQW5kcm9pZDogb25seSBidWlsZCBkZWNfbmVvbiB3aXRoIE5FT04gc3VwcG9ydAorOGY5MTE3YTkgY29zbWV0aWNzOiBzaWduYXR1cmUgZml4ZXMKKzM5YmY1ZDY0IHVzZSBoZWFkZXItbGVzcyBsb3NzbGVzcyBiaXRzdHJlYW0gZm9yIGFscGhhIGNoYW5uZWwKKzc1ZDdmM2IyIE1lcmdlICJtYWtlIGlucHV0IGRhdGEgYmUgJ2NvbnN0JyBmb3IgVlA4TEludmVyc2VUcmFuc2Zvcm0oKSIKKzlhNzIxYzZkIG1ha2UgaW5wdXQgZGF0YSBiZSAnY29uc3QnIGZvciBWUDhMSW52ZXJzZVRyYW5zZm9ybSgpCis5ZmM2NGVkYyBEaXNhbGxvdyByZS11c2Ugb2Ygc2FtZSB0cmFuc2Zvcm1hdGlvbi4KKzk4ZWM3MTdmICB1c2UgYSBmdW5jdGlvbiBwb2ludGVyIGZvciBQcm9jZXNzUm93cygpCitmN2FlNWUzNyBjb3NtZXRpY3M6IGpvaW4gbGluZQorMTQwYjg5YTMgZmFjdG9yIG91dCBidWZmZXIgYWxsb2MgaW4gQWxsb2NhdGVBUkdCQnVmZmVycygpCithMTA3ZGZhOCBSZWN0aWZ5IFdlYlBQYXJzZU9wdGlvbmFsQ2h1bmtzKCkuCisyMzdlYWI2NyBBZGQgdHdvIG1vcmUgY29sb3Itc3BhY2VzIGZvciBsb3NzbGVzcyBkZWNvZGluZy4KKzI3ZjQxN2FiIGZpeCBvcnRob2dyYXBoaWMgdHlwbworNDg5ZWMzMzUgYWRkIFZQOExFbmNvZGVTdHJlYW0oKSB0byBjb21wcmVzcyBsb3NzbGVzcyBpbWFnZSBzdHJlYW0KK2ZhOGJjM2RiIG1ha2UgV2ViUEVuY29kaW5nU2V0RXJyb3IoKSB0YWtlIGEgY29uc3QgcGljdHVyZQorNjM4NTI4Y2QgYml0c3RyZWFtIHVwZGF0ZSBmb3IgbG9zc3kgYWxwaGEgY29tcHJlc3Npb24KK2Q3M2U2M2E3IGFkZCBEZXF1YW50aXplTGV2ZWxzKCkgcGxhY2Vob2xkZXIKK2VjMTIyZTA5IHJlbW92ZSBhcmNoLWRlcGVuZGVudCByYW5kKCkKK2Q0MGU3NjUzIGZpeCBhbGlnbm1lbnQKKzFkZDZhOGI2IE1lcmdlICJyZW1vdmUgdGNvZGVyLCBzd2l0Y2ggYWxwaGEtcGxhbmUgY29tcHJlc3Npb24gdG8gbG9zc2xlc3MiCiszZTg2M2RkYSByZW1vdmUgdGNvZGVyLCBzd2l0Y2ggYWxwaGEtcGxhbmUgY29tcHJlc3Npb24gdG8gbG9zc2xlc3MKKzhkNzdkYzI5IEFkZCBzdXBwb3J0IGZvciBsb3NzbGVzcyBpbiBtdXg6Cis4MzFiZDEzMSBNYWtlIHRpbGUgc2l6ZSBhIGZ1bmN0aW9uIG9mIGVuY29kaW5nIG1ldGhvZC4KKzc3OGM1MjI4IE1lcmdlICJyZW1vdmUgc29tZSB2YXJpYWJsZSBzaGFkb3dpbmciCis4MTdjOWRjZSBGZXcgbW9yZSBIdWZmbWFuVHJlZVRva2VuIGNvbnZlcnNpb25zLgorMzdhNzdhNmIgcmVtb3ZlIHNvbWUgdmFyaWFibGUgc2hhZG93aW5nCis4OWMwN2M5NiBNZXJnZSAibm9ybWFsaXplIGV4YW1wbGUgaGVhZGVyIGluY2x1ZGVzIgorNGFmZjQxMWYgTWVyZ2UgImFkZCBleGFtcGxlX3V0aWwuW2hjXSIKKzAwYjI5ZTI4IG5vcm1hbGl6ZSBleGFtcGxlIGhlYWRlciBpbmNsdWRlcworMDYxMjYzYTcgYWRkIGV4YW1wbGVfdXRpbC5baGNdCitjNjg4MmM0OSBtZXJnZSBhbGwgdHJlZSBwcm9jZXNzaW5nIGludG8gYSBzaW5nbGUgVlA4TFByb2Nlc3NUcmVlKCkKKzljN2EzY2Y1IGZpeCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMgdG8gaGFuZGxlIHRoZSBjYXNlIHBhbGV0dGVfY29kZV9iaXRzID09IDAKK2I1NTUxZDJlIE1lcmdlICJBZGRlZCBIdWZmbWFuVHJlZUNvZGUgU3RydWN0IGZvciB0cmVlIGNvZGVzLiIKKzhiODVkMDFjIEFkZGVkIEh1ZmZtYW5UcmVlQ29kZSBTdHJ1Y3QgZm9yIHRyZWUgY29kZXMuCiswOTNmNzZkOCBNZXJnZSAiQWxsb2NhdGUgc2luZ2xlIG1lbW9yeSBpbiBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzLiIKKzQxZDgwNDk0IEFsbG9jYXRlIHNpbmdsZSBtZW1vcnkgaW4gR2V0SHVmZkJpdExlbmd0aHNBbmRDb2Rlcy4KKzFiMDRmNmQyIENvcnJlY3Qgc2l6ZSBpbiBWUDhMIGhlYWRlci4KKzI5MjRhNWFlIE1ha2VmaWxlLnZjOiBzcGxpdCBvYmplY3QgbGlzdHMgYmFzZWQgb24gZGlyZWN0b3J5CitjOGYyNDE2NSBNZXJnZSAiYWRkIGFzc2VydCh0b2tlbnMpIgorNDMyMzk5NDcgYWRkIGFzc2VydCh0b2tlbnMpCis5ZjU0NzQ1MCBDYXRjaCBhbiBlcnJvciBpbiBEZWNvZGVJbWFnZURhdGEoKS4KK2FjOGU1ZTQyIG1pbm9yIHR5cG8gYW5kIHN0eWxlIGZpeAorOWY1NjZkMWQgY2xlYW4tdXAgYXJvdW5kIEh1ZmZtYW4tZW5jb2RlCitjNTc5YTcxMCBJbnRyb2R1Y2UgQ0hVTktfU0laRV9CWVRFUyBpbiBtdXhpLmguCisxNDc1N2Y4YSBNYWtlIHN1cmUgaHVmZm1hbiB0cmVlcyBhbHdheXMgaGF2ZSB2YWxpZCBzeW1ib2xzCis0MTA1MDYxOCBtYWtlZmlsZS51bml4OiBhZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgdndlYnAKKzQ4YjM3NzIxIE1lcmdlICJmaXhlZCBzaWduZWQvdW5zaWduZWQgY29tcGFyaXNvbiB3YXJuaW5nIgorNTdmNjk2ZGEgTWVyZ2UgIkVuY29kZUltYWdlSW50ZXJuYWw6IGZpeCBwb3RlbnRpYWwgbGVhayIKK2Q5NzJjZGYyIEVuY29kZUltYWdlSW50ZXJuYWw6IGZpeCBwb3RlbnRpYWwgbGVhaworNWNkMTJjM2QgZml4ZWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZworY2RjYTMwZDAgTWVyZ2UgImNvc21ldGljczogc2hvcnRlbiBsb25nIGxpbmUiCitlMDI1ZmI1NSBjb3NtZXRpY3M6IHNob3J0ZW4gbG9uZyBsaW5lCisyMjY3MWVkNiBNZXJnZSAiZW5jL3ZwOGw6IGZpeCBkb3VibGUgZnJlZSBvbiBlcnJvciIKK2UxYjliMDUyIE1lcmdlICJjb3NtZXRpY3M6IFZQOExDcmVhdGVIdWZmbWFuVHJlZTogZml4IGluZGVudCIKK2E4ZTcyNWY4IGVuYy92cDhsOiBmaXggZG91YmxlIGZyZWUgb24gZXJyb3IKKzI3NTQxZmJkIGNvc21ldGljczogVlA4TENyZWF0ZUh1ZmZtYW5UcmVlOiBmaXggaW5kZW50CisxZDM4YjI1OCBjd2VicC93aW5kb3dzOiB1c2UgTUFLRV9SRUZHVUlEIHdoZXJlIGFwcHJvcHJpYXRlCis4MTdlZjZlOSBNZXJnZSAiY3dlYnA6IGZpeCBXSUMvTWljcm9zb2Z0IFNESyBjb21wYXRpYmlsaXR5IGlzc3VlIgorOTAyZDNlM2IgY3dlYnA6IGZpeCBXSUMvTWljcm9zb2Z0IFNESyBjb21wYXRpYmlsaXR5IGlzc3VlCis4OWQ4MDNjNCBNZXJnZSAiRml4IGEgY3Jhc2ggZHVlIHRvIHdyb25nIHBvaW50ZXItaW50ZWdlciBhcml0aG1ldGljLiIKK2NiMWJkNzQxIE1lcmdlICJGaXggYSBjcmFzaCBpbiBsb3NzbGVzcyBkZWNvZGVyLiIKK2RlMmZlMjAyIE1lcmdlICJTb21lIGNsZWFudXAgaW4gVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKCkgKGFuZCByZWxhdGVkIGZ1bmN0aW9ucyBDb21wYXJlSHVmZm1hblRyZWVzKCkgYW5kIFNldEJpdERlcHRocygpKTogLSBNb3ZlICd0cmVlX3NpemUnIGluaXRpYWxpemF0aW9uIGFuZCBtYWxsb2MgZm9yICd0cmVlICsgdHJlZV9wb29sJyAgIG91dHNpZGUgdGhlIGxvb3AuIC0gU29tZSByZW5hbWVzL3R3ZWFrcyBmb3IgcmVhZGFiaWxpdHkuIgorY2U2OTE3N2EgRml4IGEgY3Jhc2ggZHVlIHRvIHdyb25nIHBvaW50ZXItaW50ZWdlciBhcml0aG1ldGljLgorZTQwYTM2ODQgRml4IGEgY3Jhc2ggaW4gbG9zc2xlc3MgZGVjb2Rlci4KKzM5MjdmZjNhIHJlbW92ZSB1bm5lZWRlZCBlcnJvciBjb25kaXRpb24gZm9yIFdlYlBNdXhOdW1OYW1lZEVsZW1lbnRzKCkKKzJjMTQwZTExIFNvbWUgY2xlYW51cCBpbiBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoKSAoYW5kIHJlbGF0ZWQgZnVuY3Rpb25zIENvbXBhcmVIdWZmbWFuVHJlZXMoKSBhbmQgU2V0Qml0RGVwdGhzKCkpOiAtIE1vdmUgJ3RyZWVfc2l6ZScgaW5pdGlhbGl6YXRpb24gYW5kIG1hbGxvYyBmb3IgJ3RyZWUgKyB0cmVlX3Bvb2wnICAgb3V0c2lkZSB0aGUgbG9vcC4gLSBTb21lIHJlbmFtZXMvdHdlYWtzIGZvciByZWFkYWJpbGl0eS4KKzg2MWE1YjdiIGFkZCBzdXBwb3J0IGZvciBhbmltYXRpb24KK2ViNWMxNmNjIE1lcmdlICJTZXQgY29ycmVjdCBlbmNvZGUgc2l6ZSBpbiBlbmNvZGVyJ3Mgc3RhdHMuIgorNGFiZTA0YTIgZml4IHRoZSByZXR1cm4gdmFsdWUgYW5kIGhhbmRsZSBtaXNzaW5nIGlucHV0IGZpbGUgY2FzZS4KKzJmYWZiODU1IFNldCBjb3JyZWN0IGVuY29kZSBzaXplIGluIGVuY29kZXIncyBzdGF0cy4KK2U3MTY3YTJiIFByb3ZpZGUgb25lIGVudHJ5IHBvaW50IGZvciBiYWNrd2FyZCByZWZlcmVuY2VzLgorYzRjY2FiNjQgUHJpbnQgcmVsZXZhbnQgbG9zc2xlc3MgZW5jb2Rpbmcgc3RhdHMgaW4gY3dlYnAuCitlMzMwMmNmZCBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzOiByZWR1Y2UgbGV2ZWwgb2YgaW5kaXJlY3Rpb24KK2I1ZjJhOWVkIGVuYy92cDhsOiBmaXggdW5pbml0aWFsaXplZCB2YXJpYWJsZSB3YXJuaW5nCis3ODg1ZjhiMiBtYWtlZmlsZS51bml4OiBhZGQgbG9zc2xlc3MgZW5jb2RlciBmaWxlcworMTI2MWE0YzggTWVyZ2UgImNvc21ldGljcyIKKzM5MjZiNWJlIE1lcmdlICJkc3AvY3B1LmM6IEFuZHJvaWQ6IGZpeCBjcmFzaCBvbiBub24tbmVvbiBhcm0gYnVpbGRzIgorODM0ZjkzN2YgZHNwL2NwdS5jOiBBbmRyb2lkOiBmaXggY3Jhc2ggb24gbm9uLW5lb24gYXJtIGJ1aWxkcworMTI2ZTE2MDYgY29zbWV0aWNzCitlMzg2MDJkMiBNZXJnZSBicmFuY2ggJ2xvc3NsZXNzX2VuY29kZXInCitlOGQzZDZhMCBzcGxpdCBTdG9yZUh1ZmZtYW5Db2RlKCkgaW50byBzbWFsbGVyIGZ1bmN0aW9ucworZDBkODg5OTAgbW9yZSBjb25zb2xpZGF0aW9uOiBpbnRyb2R1Y2UgVlA4TEhpc3RvZ3JhbVNldAorMWEyMTBlZjEgYmlnIGNvZGUgY2xlYW4tdXAgYW5kIHJlZmFjdG9yaW5nIGFuZCBvcHRpbWl6YXRpb24KKzQxYjVjOGZmIFNvbWUgY29zbWV0aWNzIGluIGhpc3RvZ3JhbS5jCithZGE2ZmY3NyBBcHByb3hpbWF0ZSBGYXN0TG9nIGJldHdlZW4gdmFsdWUgcmFuZ2UgWzI1NiwgODE5Ml0KK2VjMTIzY2EzIEZvcmdvdCB0byB1cGRhdGUgb3V0X2JpdF9jb3N0cyB0byBzeW1ib2xfYml0X2Nvc3RzIGF0IG9uZSBpbnN0YW5jZS4KK2NmMzNjY2QxIEV2YWx1YXRlIG91dHB1dCBjbHVzdGVyJ3MgYml0X2Nvc3RzIG9uY2UgaW4gSGlzdG9ncmFtUmVmaW5lLgorNzgxYzAxZjQgU2ltcGxlIEh1ZmZtYW4gY29kZSBjaGFuZ2VzLgorYTI4NDliYzUgTG9zc2xlc3MgZGVjb2RlcjogcmVtb3ZlIGFuIHVubmVlZGVkIHBhcmFtIGluIFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoKS4KK2IzOWU3NDg3IFJlZHVjaW5nIGVtZXJnaW5nIHBhbGV0dGUgc2l6ZSBmcm9tIDExIHRvIDkgYml0cy4KK2JmYzczZGI0IE1vdmUgR2V0SGlzdEltYWdlU3ltYm9scyB0byBoaXN0b2dyYW0uYworODg5YTU3ODYgSW1wcm92ZSBwcmVkaWN0IHZzIG5vLXByZWRpY3QgaGV1cmlzdGljLgorMDFmNTA2NjMgY29kZS1tb3ZpbmcgYW5kIGNsZWFuLXVwCiszMTAzNWYzYiByZWR1Y2UgbWVtb3J5IHVzYWdlIGJ5IGFsbG9jYXRpbmcgb25seSBvbmUgaGlzdG8KK2ZiYjUwMWI4IFJlc3RyaWN0IGhpc3RvX2JpdHMgdG8gZW5zdXJlIGhpc3RvX2ltYWdlIHNpemUgaXMgdW5kZXIgMzJNQgorODQxNWRkZjMgZnVydGhlciBzaW1wbGlmaWNhdGlvbiBmb3IgdGhlIG1ldGEtSHVmZm1hbiBjb2RpbmcKK2U0OTE3Mjk5IEEgcXVpY2sgcGFzcyBvZiBjbGVhbnVwIGluIGJhY2t3YXJkIHJlZmVyZW5jZSBjb2RlCis4MzMzMmIzYyBNYWtlIHRyYW5zZm9ybSBiaXRzIGEgZnVuY3Rpb24gb2YgZW5jb2RlIG1ldGhvZCAoLW0pLgorNzI5MjBjYWEgaW50cm9kdWNlIC1sb3NzbGVzcyBvcHRpb24sIHByb3RlY3RlZCBieSBVU0VfTE9TU0xFU1NfRU5DT0RFUgorYzZhYzRkZmIgUnVuIFRyYWNlQmFja3dhcmRzIGZvciBoaWdoZXIgcXVhbGl0aWVzLgorNDEyMjIyYzggTWFrZSBoaXN0b19iaXRzIGFuZCB0cmFuc2Zvcm1fYml0cyBmdW5jdGlvbiBvZiBxdWFsaXR5LgorMTQ5YjUwOTggVXBkYXRlIGxvc3NsZXNzIGVuY29kZXIgc3RyYXRlZ3k6CiswZTZmYTA2NSBjYWNoZV9iaXRzIHBhc3NlZCB0byBFbmNvZGVJbWFnZUludGVybmFsKCkKK2UzOGI0MGE5IEZhY3Rvcml6ZSBjb2RlIGZvciBjbGVhcmluZyBIdHJlZUdyb3VwLgorNmY0YTE2ZWEgUmVtb3ZpbmcgdGhlIGluZGlyZWN0aW9uIG9mIG1ldGEtaHVmZm1hbiB0YWJsZXMuCiszZDMzZWNkMSBTb21lIHJlbmFtaW5nL2NvbW1lbnRzIHJlbGF0ZWQgdG8gcGFsZXR0ZSBpbiBsb3NzbGVzcyBlbmNvZGVyLgorNGQwMmQ1ODYgTG9zc2xlc3MgZW5jb2RlcjogY29ycmVjdGlvbiBpbiBQYWxldHRlIHN0b3JhZ2UKKzRhNjM2MjM1IGZpeCBhIG1lbWxlYWsgaW4gRW5jb2RlSW1hZ2VJbnRlcm5hbCgpCiswOTkzYTYxMSBGdWxsIGFuZCBmaW5hbCBmaXggZm9yIHByZWRpY3Rpb24gdHJhbnNmb3JtCithZmQyMTAyZiBGaXggY3Jvc3MtY29sb3IgdHJhbnNmb3JtIGluIGxvc3NsZXNzIGVuY29kZXIKK2I5NmQ4NzQwIE5lZWQgdG8gd3JpdGUgYSAnMCcgYml0IGF0IHRoZSBlbmQgb2YgdHJhbnNmb3Jtcy4KKzU0ZGFkN2U1IENvbG9yIGNhY2hlIHNpemUgc2hvdWxkIGJlIGNvdW50ZWQgYXMgMCB3aGVuIGNhY2hlIGJpdHMgPSAwCis0ZjBjNWNhZiBGaXggcHJlZGljdGlvbiB0cmFuc2Zvcm0gaW4gbG9zc2xlc3MgZW5jb2Rlci4KKzM2ZGFiZGFkIEZpeCBtZW1vcnkgbGVhayBpbiBtZXRob2QgRW5jb2RlSW1hZ2VJbnRlcm5hbCBmb3IgaGlzdG9ncmFtX2ltYWdlLgorMzUyYTRmNDkgR2V0IHJpZCBvZiBQYWNrTGl0ZXJhbEJpdExlbmd0aHMoKQorZDY3M2I2YjkgQ2hhbmdlIHRoZSBwcmVkaWN0b3IgZnVuY3Rpb24gdG8gcGFzcyBsZWZ0IHBpeGVsCitiMmY5OTQ2NSBGaXggQ29weVRpbGVXaXRoUHJlZGljdGlvbigpCis4NDU0N2Y1NCBBZGQgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIG1ldGhvZC4KKzZiMzgzNzhhIEd1YXJkIHRoZSBsb3NzbGVzcyBlbmNvZGVyIChpbiBmbHV4KSB1bmRlciBhIGZsYWcKKzA5Zjc1MzJjIEZpeCBmZXcgbml0cyAoY29uc3QgcXVhbGlmaWVycykKKzY0OGJlMzkzIEFkZGVkIGltcGxlbWVudGF0aW9uIGZvciB2YXJpb3VzIGxvc3NsZXNzIGZ1bmN0aW9ucworMzI3MTRjZTMgQWRkIFZQOEwgcHJlZml4IHRvIGJhY2t3YXJkIHJlZiAmIGhpc3RvZ3JhbSBtZXRob2RzLgorZmNiYTdiZTIgRml4ZWQgaGVhZGVyIGZpbGUgdGFnIChXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX0hfKQorYmM3MDM3NDYgQWRkIGJhY2t3YXJkX3JlZiwgaGlzdG9ncmFtICYgaHVmZm1hbiBlbmNvZGUgbW9kdWxlcyBmcm9tIGxvc3NsZXNzLgorZmRjY2FhZGQgRml4aW5nIG5pdHMKKzIyNzExMGM0IGxpYndlYnAgaW50ZXJmYWNlIGNoYW5nZXMgZm9yIGxvc3NsZXNzIGVuY29kaW5nLgorNTA2NzlhY2YgbWlub3Igc3R5bGUgZml4ZXMKK2IzOGRmY2NmIHJlbW92ZSB1bm5lZWRlZCByZWZlcmVuY2UgdG8gTlVNX0xJVEVSQUxfQ09ERVMKKzg5Nzk2NzViIGhhcm1vbml6ZSBoZWFkZXIgZGVzY3JpcHRpb24KK2MwNGViN2JlIHRjb2Rlci5jOiBkZWZpbmUgTk9UX0hBVkVfTE9HMiBmb3IgTVNWQyBidWlsZHMKKzlhMjE0ZmExIE1lcmdlICJWUDhbTF1HZXRJbmZvOiBjaGVjayBpbnB1dCBwb2ludGVycyIKKzVjNWJlOGJhIFZQOFtMXUdldEluZm86IGNoZWNrIGlucHV0IHBvaW50ZXJzCiswYzE4OGZlYyBNZXJnZSBjaGFuZ2VzIEk0MzFhY2RmZSxJNzEzNjU5YjcKK2IzNTE1YzYyIG11eDogZHJvcCAnY2h1bmsnIGZyb20gQ2h1bmtJbmZvIG1lbWJlciBuYW1lcworYWVhNzkyM2MgbXV4aS5oOiByZW1vdmUgc29tZSB1bnVzZWQgZGVmaW5lcworMDE0MjI0OTIgdXBkYXRlIE5FV1MgZmlsZSBmb3IgbmV4dCByZWxlYXNlCisyOWUzZjdlYyBNZXJnZSAiZGVjOiByZW1vdmUgZGVwcmVjYXRlZCBXZWJQSU5ldygpIgorNDcxOGU0NDkgTWVyZ2UgIm11eGVkaXQ6IGEgZmV3IG1vcmUgc2l6ZV90IGNoYW5nZXMiCis4MjY1NGY5NiBNZXJnZSAibXV4ZWRpdDogcmVtb3ZlIGEgZmV3IHJlZHVuZGFudCBOVUxMIGNoZWNrcyIKKzAyZjI3ZmJkIGRlYzogcmVtb3ZlIGRlcHJlY2F0ZWQgV2ViUElOZXcoKQorY2NkZGIzZmMgbXV4ZWRpdDogcmVtb3ZlIGEgZmV3IHJlZHVuZGFudCBOVUxMIGNoZWNrcworYTZjZGY3MTAgbXV4ZWRpdDogYSBmZXcgbW9yZSBzaXplX3QgY2hhbmdlcworYTM4NDY4OTIgTWVyZ2UgIm11eDogcmVtb3ZlIHVudXNlZCBMSVNUX0lEIgorMTFhZTQ2YWUgYWxwaGEuYzogcXVpZXQgc29tZSBzaXplX3QgLT4gaW50IGNvbnZlcnNpb24gd2FybmluZ3MKK2RlZTQ2NjkyIG11eDogcmVtb3ZlIHVudXNlZCBMSVNUX0lECiswM2YxZjQ5MyBtdXg6IGFkZCB2ZXJzaW9uIGNoZWNrZWQgZW50cnkgcG9pbnRzCis2YTBhYmRhYSBNZXJnZSAiZG9jOiB0aWxlL2FscGhhIGNvcnJlY3Rpb25zIgorYzgxMzlmYmUgTWVyZ2UgImZldyBjb3NtZXRpY3MiCis2ODMzODczNyBNZXJnZSAibG9zc2xlc3M6IHJlbW92ZSBzb21lIHNpemVfdCAtPiBpbnQgY29udmVyc2lvbnMiCis1MjQ5ZTk0YSBkb2M6IHRpbGUvYWxwaGEgY29ycmVjdGlvbnMKK2Q5NmU3MjJiIGh1ZmZtYW46IHF1aWV0IGludDY0IC0+IGludCBjb252ZXJzaW9uIHdhcm5pbmcKKzUzMjAyMGYyIGxvc3NsZXNzOiByZW1vdmUgc29tZSBzaXplX3QgLT4gaW50IGNvbnZlcnNpb25zCisyM2JlNmVkZiBmZXcgY29zbWV0aWNzCisxMzQ5ZWRhZCBNZXJnZSAiY29uZmlndXJlOiBBQ19BUkdfKiB1c2UgQVNfSEVMUF9TVFJJTkciCitiZmJjYzYwYSBjb25maWd1cmU6IEFDX0FSR18qIHVzZSBBU19IRUxQX1NUUklORworMTQyN2NhOGUgTWVyZ2UgIk1ha2VmaWxlLmFtOiBoZWFkZXIgZmlsZSBtYWludGVuYW5jZSIKKzA4NzMzMmUzIE1lcmdlICJyZW1vdmUgdW51c2VkIHBhcmFtZXRlciAncm91bmQnIGZyb20gQ2FsY1Byb2JhKCkiCis5NjMwZTE2OCByZW1vdmUgdW51c2VkIHBhcmFtZXRlciAncm91bmQnIGZyb20gQ2FsY1Byb2JhKCkKKzkyMDkyZWFhIE1lcmdlICJiaXRfcmVhZGVyLmg6IGNvcnJlY3QgaW5jbHVkZSIKK2E4N2ZjM2Y2IE1lcmdlICJtdXg6IGVuc3VyZSAjIGltYWdlcyA9ICMgdGlsZXMiCis1M2FmOTliMSBNZXJnZSAibXV4OiB1c2Ugc2l6ZV90IGNvbnNpc3RlbnRseSIKKzM5YTU3ZGFlIE1ha2VmaWxlLmFtOiBoZWFkZXIgZmlsZSBtYWludGVuYW5jZQorMWJkMGJkMGQgYml0X3JlYWRlci5oOiBjb3JyZWN0IGluY2x1ZGUKKzMyNmEzYzZiIG11eDogZW5zdXJlICMgaW1hZ2VzID0gIyB0aWxlcworOTU2NjdiOGQgbXV4OiB1c2Ugc2l6ZV90IGNvbnNpc3RlbnRseQorMjMxZWMxZmIgUmVtb3ZpbmcgdGhlIGluZGlyZWN0aW9uIG9mIG1ldGEtaHVmZm1hbiB0YWJsZXMuCisxNWViY2JhYSBjaGVjayByZXR1cm4gcG9pbnRlciBmcm9tIE11eEltYWdlR2V0TGlzdEZyb21JZAorYjBkNmM0YTcgTWVyZ2UgImNvbmZpZ3VyZTogcmVtb3ZlIHRlc3QgZm9yIHpsaWIuaCIKKzhjY2NhYzUwIE1lcmdlICJkc3AvbG9zc2xlc3M6IHNpbGVuY2Ugc29tZSBidWlsZCB3YXJuaW5ncyIKK2IwODgxOWE2IGRzcC9sb3NzbGVzczogc2lsZW5jZSBzb21lIGJ1aWxkIHdhcm5pbmdzCis3YWUyMjUyMSBBbmRyb2lkLm1rOiBTU0UyICYgTkVPTiB1cGRhdGVzCiswYTQ5ZTNmMyBNZXJnZSAibWFrZWZpbGUudW5peCBhZGQgbWlzc2luZyBoZWFkZXIgZmlsZXMiCisyZTc1YTlhMSBNZXJnZSAiZGVjb2RlLmg6IHVzZSBzaXplX3QgY29uc2lzdGVudGx5IgorZmExMzAzNWUgY29uZmlndXJlOiByZW1vdmUgdGVzdCBmb3IgemxpYi5oCitkM2FkYzgxZCBtYWtlZmlsZS51bml4IGFkZCBtaXNzaW5nIGhlYWRlciBmaWxlcworMjYyZmUwMWIgTWVyZ2UgIm1ha2VmaWxlLnVuaXggJiBBbmRyb2lkLm1rOiBjb3NtZXRpY3MiCis0Y2NlMTM3ZSBNZXJnZSAiZW5jX3NzZTIgYWRkIG1pc3Npbmcgc3RkbGliLmggaW5jbHVkZSIKKzgwMjU2Yjg1IGVuY19zc2UyIGFkZCBtaXNzaW5nIHN0ZGxpYi5oIGluY2x1ZGUKKzliM2QxZjNhIGRlY29kZS5oOiB1c2Ugc2l6ZV90IGNvbnNpc3RlbnRseQorNjQwODNkM2MgTWVyZ2UgIk1ha2VmaWxlLmFtOiBjb3NtZXRpY3MiCitkY2ViOGI0ZCBNZXJnZSBjaGFuZ2VzIElmMTMzMWQzYyxJODZmZTM4NDcKKzBlMzNkN2JmIE1lcmdlICJ3ZWJwL2RlY29kZS5oOiBmaXggcHJvdG90eXBlcyIKK2ZhYzBmMTJlIHJlbmFtZSBCaXRSZWFkZXIgdG8gVlA4TEJpdFJlYWRlcgorZmJkODJiNWEgdHlwZXMuaDogY2VudHJhbGl6ZSB1c2Ugb2Ygc3RkZGVmLmgKKzIxNTQ4MzVmIE1ha2VmaWxlLmFtOiBjb3NtZXRpY3MKKzFjOTJiZDM3IHZwOGlvOiB1c2Ugc2l6ZV90IGZvciBidWZmZXIgc2l6ZQorOTBlYWQ3MTAgZml4IHNvbWUgbW9yZSB1aW50MzJfdCAtPiBzaXplX3QgdHlwaW5nCitjYmU3MDVjNyB3ZWJwL2RlY29kZS5oOiBmaXggcHJvdG90eXBlcworM2Y4ZWMxYzIgbWFrZWZpbGUudW5peCAmIEFuZHJvaWQubWs6IGNvc21ldGljcworMjE3ZWM3ZjQgUmVtb3ZlIHRhYnMgaW4gY29uZmlndXJlLmFjCitiM2QzNWZjMSBNZXJnZSAiQW5kcm9pZC5tayAmIE1ha2VmaWxlLnZjOiBhZGQgbmV3IGZpbGVzIgorMGRmMDRiOWUgQW5kcm9pZC5tayAmIE1ha2VmaWxlLnZjOiBhZGQgbmV3IGZpbGVzCitlNGYyMGM1YiBNZXJnZSAiYXV0b21ha2U6IHJlcGxhY2UgJ3NpbGVudC1ydWxlcycgdy9BTV9TSUxFTlRfUlVMRVMiCis4ZDI1NGEwOSBjb3NtZXRpY3MKKzY4NjBjMmVhIGZpeCBzb21lIHVpbnQzMl90IC0+IHNpemVfdCB0eXBpbmcKKzRhZjE4NThhIEZpeCBhIGNyYXNoIGR1ZSB0byBtYXggc3ltYm9sIGluIGEgdHJlZSA+PSBhbHBoYWJldCBzaXplCis2ZjAxYjgzMCBzcGxpdCB0aGUgVlA4IGFuZCBWUDhMIGRlY29kaW5nIHByb3Blcmx5CitmMjYyM2RiZSBlbmFibGUgbG9zc2xlc3MgZGVjb2RlcgorYjk2ZWZkN2QgYWRkIGRlYy92cDhpLmggY2hhbmdlcyBmcm9tIGV4cGVyaW1lbnRhbAorMTlmNjM5OGUgYWRkIGRlYy92cDhse2kuaCwuY30gZnJvbSBleHBlcmltZW50YWwKK2M0YWU1M2M4IGFkZCB1dGlscy9iaXRfcmVhZGVyLltoY10gY2hhbmdlcyBmcm9tIGV4cGVyaW1lbnRhbAorNTE0ZDAwODkgYWRkIGRzcC9sb3NzbGVzcy5baGNdIGZyb20gZXhwZXJpbWVudGFsCis5YzY3MjkxZCBhZGQgdXRpbHMvaHVmZm1hbi5baGNdIGZyb20gZXhwZXJpbWVudGFsCiszMzc5MTRhMCBhZGQgdXRpbHMvY29sb3JfY2FjaGUuW2hjXSBmcm9tIGV4cGVyaW1lbnRhbAorYjNiZjhmZTcgdGhlIHJlYWQtb3ZlcmZsb3cgY29kZS1wYXRoIHdhc24ndCByZXBvcnRpbmcgYXMgYW4gZXJyb3IKKzFkYjg4OGJhIHRha2UgY29sb3JzcGFjZSBpbnRvIGFjY291bnQgd2hlbiBjcm9wcGluZworNjFjMmQ1MWYgbW92ZSB0aGUgcmVzY2FsaW5nIGNvZGUgaW50byBpdHMgb3duIGZpbGUgYW5kIG1ha2UgZW5jLyBhbmQgZGVjLyB1c2UgaXQuCitlZmMyMDE2YSBNYWtlIHJlc2NhbGVyIG1ldGhvZHMgZ2VuZXJpYworM2VhY2VlODEgTW92ZSByZXNjYWxlciBtZXRob2RzIG91dCBvZiBpby5jLgorYTY5Yjg5M2QgYXV0b21ha2U6IHJlcGxhY2UgJ3NpbGVudC1ydWxlcycgdy9BTV9TSUxFTlRfUlVMRVMKKzZmN2JmNjQ1IGlzc3VlIDExMTogZml4IGxpdHRsZS1lbmRpYW4gcHJvYmxlbSBpbiBiaXQtcmVhZGVyCitlZDI3OGUyMiBSZW1vdmVkIHVubmVjZXNzYXJ5IGxvb2t1cAorY2Q4YzNiYTcgZml4IHNvbWUgd2FybmluZ3M6IGRvd24tY2FzdCBhbmQgcG9zc2libHktdW5pbml0aWFsaXplZCB2YXJpYWJsZQorMGE3MTAyYmEgfjElIGltcHJvdmVtZW50IG9mIGFscGhhIGNvbXByZXNzaW9uCiszYmMxYjE0MSBNZXJnZSAiUmVmb3JtYXQgY29udGFpbmVyIGRvYyIKK2RjMTdhYmRjIG11eDogY29zbWV0aWNzCitjYjU4MTBkZiBNZXJnZSAiV2ViUE11eEdldEltYWdlOiBhbGxvdyBpbWFnZSBwYXJhbSB0byBiZSBOVUxMIgorNTA2YTRhZjIgbXV4OiBjb3NtZXRpY3MKKzEzNWU4YjE5IFdlYlBNdXhHZXRJbWFnZTogYWxsb3cgaW1hZ2UgcGFyYW0gdG8gYmUgTlVMTAorZGU1NTZiNjggTWVyZ2UgIlJFQURNRS5tdXg6IHJld29yZCBzb21lIGRlc2NyaXB0aW9ucyIKKzBlZTJhZWI5IE1ha2VmaWxlLnZjOiB1c2UgYmF0Y2ggbW9kZSBydWxlcworZDlhY2RkYzAgbXN2YzogbW92ZSB7aSxwfWRiIGNyZWF0aW9uIHRvIG9iamVjdCBkaXJlY3RvcnkKKzIzN2M5YWE3IE1lcmdlICJleHBvc2UgV2ViUEZyZWUgZnVuY3Rpb24gZm9yIERMTCBidWlsZHMiCitiM2U0MDU0ZiBzaWxlbmNlIG1zdmMgZGVidWcgYnVpbGQgd2FybmluZworNDVmZWI1NWQgZXhwb3NlIFdlYlBGcmVlIGZ1bmN0aW9uIGZvciBETEwgYnVpbGRzCisxMTMxNmQ4NCBSRUFETUUubXV4OiByZXdvcmQgc29tZSBkZXNjcmlwdGlvbnMKKzRiZTUyZjRhIGZhY3Rvcml6ZSBXZWJQTXV4VmFsaWRhdGUKKzE0ZjZiOWY2IG11eDogbGlnaHQgY2xlYW51cAorNWU5NmE1ZGIgYWRkIG1vcmUgcGFyYW0gY2hlY2tzIHRvIFdlYlBQaWN0dXJlRGlzdG9ydGlvbigpCis4YWJhZjgyMCBNZXJnZSAic2lsZW5jZSBzb21lIHR5cGUgc2l6ZSByZWxhdGVkIHdhcm5pbmdzIgorMTYwMWEzOWIgc2lsZW5jZSBzb21lIHR5cGUgc2l6ZSByZWxhdGVkIHdhcm5pbmdzCitmM2FiZTUyMCBNZXJnZSAiaWRlYzogc2ltcGxpZnkgYnVmZmVyIHNpemUgY2FsY3VsYXRpb24iCithOWM1Y2Q0YyBpZGVjOiBzaW1wbGlmeSBidWZmZXIgc2l6ZSBjYWxjdWxhdGlvbgorN2IwNmJkN2YgTWVyZ2UgImNvbmZpZ3VyZS9hdXRvbWFrZTogYWRkIHNpbGVudC1ydWxlcyBvcHRpb24iCitlOWE3ZDE0NSBSZWZvcm1hdCBjb250YWluZXIgZG9jCitkNGU1YzdmMyBjb25maWd1cmUvYXV0b21ha2U6IGFkZCBzaWxlbnQtcnVsZXMgb3B0aW9uCis1MDgxZGI3OCBjb25maWd1cmUvYXV0b21ha2U6IG5vIC12ZXJzaW9uLWluZm8gZm9yIGNvbnZlbmllbmNlIGxpYnMKKzg1YjZmZjY4IE1lcmdlICJpZGVjOiBmaXggV2ViUElVcGRhdGUgZmFpbHVyZSIKKzdiYjZhOWNjIGlkZWM6IGZpeCBpbnRlcm5hbCBzdGF0ZSBjb3JydXB0aW9uCis4OWNkMWJiOCBpZGVjOiBmaXggV2ViUElVcGRhdGUgZmFpbHVyZQorMDFiNjM4MDYgNC01JSBmYXN0ZXIgZGVjb2RpbmcsIG9wdGltaXplZCBieXRlIGxvYWRzIGluIGFyaXRobWV0aWMgZGVjb2Rlci4KKzYzMTExN2VhIE1lcmdlICJjb3NtZXRpY3MgJiB3YXJuaW5ncyIKK2EwYjI3MzZkIGNvc21ldGljcyAmIHdhcm5pbmdzCitmNzM5NDdmNCB1c2UgMzJiaXQgZm9yIHN0b3JpbmcgZGVxdWFudCBjb2VmZnMsIGluc3RlYWQgb2YgMTZiLgorYjk2MDAzMDggTWVyZ2UgInN0b3JlIHByZWRpY3Rpb24gbW9kZSBhcnJheSBhcyB1aW50OF90WzE2XSwgbm90IGludFsxNl0uIgorN2I2Nzg4MWEgc3RvcmUgcHJlZGljdGlvbiBtb2RlIGFycmF5IGFzIHVpbnQ4X3RbMTZdLCBub3QgaW50WzE2XS4KK2NhYjhkNGRjIE1lcmdlICJORU9OIFRyYW5zZm9ybU9uZSIKK2JhNTAzZmRhIE5FT04gVHJhbnNmb3JtT25lCis5Zjc0MGUzYiBNZXJnZSAiZ2NjIHdhcm5pbmcgZml4OiByZW1vdmUgdGhlICdjb25zdCcgcXVhbGlmaWVyLiIKK2Y3NmQzNTg3IGdjYyB3YXJuaW5nIGZpeDogcmVtb3ZlIHRoZSAnY29uc3QnIHF1YWxpZmllci4KK2U3ODQ3OGQ2IE1lcmdlICJ3ZWJwbXV4OiBtYWtlIG1vcmUgdXNlIG9mIFdlYlBEYXRhIgorZjg1YmJhM2QgTWVyZ2UgIm1hbnBhZ2VzOiBhZGQgQlVHUyBzZWN0aW9uIgorNDhhNDNiYmYgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IHZhcmlhYmxlIGNvc21ldGljcyIKK2MyNzRkYzk2IG1ha2VmaWxlLnVuaXg6IHZhcmlhYmxlIGNvc21ldGljcworMWY3Yjg1OTUgcmUtb3JnYW5pemUgdGhlIGVycm9yLWhhbmRsaW5nIGluIHRoZSBtYWluIGxvb3AgYSBiaXQKKzEzMzZmYTcxIE9ubHkgcmVjb21wdXRlIGxldmVsX2Nvc3RfW10gd2hlbiBuZWVkZWQKKzc3MWVlNDQ5IG1hbnBhZ2VzOiBhZGQgQlVHUyBzZWN0aW9uCiswZjc4MjBlNiB3ZWJwbXV4OiBtYWtlIG1vcmUgdXNlIG9mIFdlYlBEYXRhCis5NzRhYWZmMyBleGFtcGxlczogbG9nZ2luZyB1cGRhdGVzCis2YzE0YWFkZCBNZXJnZSAiYmV0dGVyIHRva2VuIGJ1ZmZlciBjb2RlIgorZjQwNTQyNTAgYmV0dGVyIHRva2VuIGJ1ZmZlciBjb2RlCisxOGQ5NTlmYSBNZXJnZSAibXV4OiBhZGQgV2ViUERhdGEgdHlwZSIKK2VlYzRiODc3IG11eDogYWRkIFdlYlBEYXRhIHR5cGUKKzBkZTMwOTZiIHVzZSAxNmJpdCBjb3VudGVycyBmb3IgcmVjb3JkaW5nIHByb2JhIGNvdW50cworN2YyMzY3OGQgZml4IGZvciBMZXZlbENvc3QgKyBsaXR0bGUgc3BlZWQtdXAKKzcxMDdkNTQ0IGZ1cnRoZXIgc3BlZWQtdXAvY2xlYW51cCBvZiBSZWNvcmRDb2VmZnMoKSBhbmQgR2V0UmVzaWR1YWxDb3N0KCkKK2ZkMjIxMDQwIEludHJvZHVjZSBUb2tlbiBidWZmZXIgKHVudXNlZCBmb3Igbm93KQorNWZhMTQ4ZjQgTWVyZ2UgInNwZWVkLXVwIEdldFJlc2lkdWFsQ29zdCgpIgorMjhhOWQ5YjQgc3BlZWQtdXAgR2V0UmVzaWR1YWxDb3N0KCkKKzExZTdkYWRkIE1lcmdlICJtaXNjIGNvc21ldGljcyIKKzM3ODA4NmJkIG1pc2MgY29zbWV0aWNzCitkNjE0NzlmOSBhZGQgLXByaW50X3BzbnIgYW5kIC1wcmludF9zc2ltIG9wdGlvbnMgdG8gY3dlYnAuCisyZTNlOGIyZSBhZGQgYSBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYSgpIG1ldGhvZAorNTUyYzEyMTcgTWVyZ2UgIm11eDogcGx1ZyBzb21lIG1lbW9yeSBsZWFrcyBvbiBlcnJvciIKK2EyYTgxZjdkIE1lcmdlICJmaXggTWFjaC1PIHNoYXJlZCBsaWJyYXJ5IGJ1aWxkIgorYjM0ODJjNDMgTWVyZ2UgImZpeCBnY2MtNC4wIGFwcGxlIDMyLWJpdCBidWlsZCIKK2U0ZTNlYzE5IGZpeCBnY2MtNC4wIGFwcGxlIDMyLWJpdCBidWlsZAorYjBkMmZlY2YgbXV4OiBwbHVnIHNvbWUgbWVtb3J5IGxlYWtzIG9uIGVycm9yCitmMGQyYzdhNyBwYXNzIG9mIGNvc21ldGljcworYjMwOWE2ZjkgZml4IE1hY2gtTyBzaGFyZWQgbGlicmFyeSBidWlsZAorMjQxZGRkMzggZG9jOiBkZWxldGUgbXV4IGNvbnRhaW5lciBwZGYKKzhiMWJhMjcyIGRvYzogdXBkYXRlIFZQOCBkZWNvZGUgZ3VpZGUgbGluaworN2U0MzcxYzUgV2ViUE11eENyZWF0ZTogZml4IHVuY2hlY2tlZCBtYWxsb2MKK2ViNDI1NTg2IE1lcmdlICJoYXZlIG1ha2VmaWxlLnVuaXggY2xlYW4gdXAgc3JjL3dlYnAvKn4gdG9vIgorYTg1YzM2MzEgTWVyZ2UgImNvcnJlY3QgRW5jb2RlQWxwaGEgZG9jdW1lbnRhdGlvbiIKK2EzMzg0MmZkIE1lcmdlICJVcGRhdGUgd2VicCBjb250YWluZXIgc3BlYyB3aXRoIGFscGhhIGZpbHRlciBvcHRpb25zLiIKKzhkNjQ5MGRhIEluY3JlbWVudGFsIHN1cHBvcnQgZm9yIHNvbWUgb2YgdGhlIG11eCBBUElzLgorYjgzNzVhYmQgaGF2ZSBtYWtlZmlsZS51bml4IGNsZWFuIHVwIHNyYy93ZWJwLyp+IHRvbworYjU4NTVmYzcgY29ycmVjdCBFbmNvZGVBbHBoYSBkb2N1bWVudGF0aW9uCitkYmEzN2ZlYSBVcGRhdGUgd2VicCBjb250YWluZXIgc3BlYyB3aXRoIGFscGhhIGZpbHRlciBvcHRpb25zLgorMmU3NGVjOGIgZml4IGNvbXBpbGUgdW5kZXIgTUlOR1cKKzcxNmQxZDdmIGZpeCBzdWJvcHRpbWFsIE1BWF9MRU4gY3V0LW9mZiBsaW1pdAorNTdjYWI3YjggSGFybW9uaXplIHRoZSBhbHBoYS1maWx0ZXIgcHJlZGljdGlvbnMgYXQgYm91bmRhcnkKKzNhOTg5NTM0IE1lcmdlICJGaXggYnVnIGZvciBBbHBoYSBpbiBSR0JBXzQ0NDQgY29sb3ItbW9kZS4iCis4Y2EyMDc2ZCBJbnRyb2R1Y2UgYSAnZmFzdCcgYWxwaGEgbW9kZQorMjIxYTA2YmIgRml4IGJ1ZyBmb3IgQWxwaGEgaW4gUkdCQV80NDQ0IGNvbG9yLW1vZGUuCithZDFlMTYzYSBjb3NtZXRpY3M6IG5vcm1hbGl6ZSBjb3B5cmlnaHQgaGVhZGVycworYzc3NDI0ZDcgY29zbWV0aWNzOiBsaWdodCBpbmNsdWRlIGNsZWFudXAKKzlkMGUxN2M5IGZpeCBtc3ZjIGJ1aWxkIGJyZWFrYWdlIGFmdGVyIDI1MjAyOGEKKzdjNGMxNzdjIFNvbWUgcmVhZGFiaWxpdHkgZml4ZXMgZm9yIG11eCBsaWJyYXJ5CitkOGE0N2U2NiBNZXJnZSAiQWRkIHByZWRpY3RpdmUgZmlsdGVyaW5nIG9wdGlvbiBmb3IgQWxwaGEuIgorMjUyMDI4YWEgQWRkIHByZWRpY3RpdmUgZmlsdGVyaW5nIG9wdGlvbiBmb3IgQWxwaGEuCis5YjY5YmUxYyBNZXJnZSAiU2ltcGxpZnkgbXV4IGxpYnJhcnkgY29kZSIKK2EwNTYxNzBlIFNpbXBsaWZ5IG11eCBsaWJyYXJ5IGNvZGUKKzk5MjE4N2EzIGltcHJvdmUgbG9nMiB0ZXN0CitlODUyZjgzMiB1cGRhdGUgQW5kcm9pZC5tayBmaWxlIGxpc3QKK2E5MGNiMmJlIHJlZHVjZSBudW1iZXIgb2YgY29waWVzIGFuZCBtYWxsb2NzIGluIGFscGhhIHBsYW5lIGVuYy9kZWMKK2IxNjYyYjA1IGZpeCBzb21lIG1vcmUgdHlwZSBjb252ZXJzaW9uIHdhcm5pbmdzIHcvTVNWQworMjIzZDhjNjAgZml4IHNvbWUgdWludDY0X3QgLT4gaW50IGNvbnZlcnNpb24gd2FybmluZ3Mgd2l0aCBNU0MKK2MxYTA0MzdiIE1lcmdlICJzaW1wbGlmeSBjaGVja3MgZm9yIGVuYWJsaW5nIFNTRTIgY29kZSIKK2YwNjgxN2FhIHNpbXBsaWZ5IGNoZWNrcyBmb3IgZW5hYmxpbmcgU1NFMiBjb2RlCis5NDhkNGZlOSBzaWxlbmNlIGEgbXN2YyBidWlsZCB3YXJuaW5nCis5MTE3OTU0OSB2d2VicDogbXN2YyBidWlsZCB0d2Vha3MKKzc5MzdiNDA5IHNpbXBsZSBXZWJQIHZpZXdlciwgYmFzZWQgb24gT3BlbkdMCis2YWFjMWRmMSBhZGQgYSBidW5jaCBvZiBtaXNzaW5nICdleHRlcm4gIkMiJworNDIxZWI5OWQgTWVyZ2UgIlJlbW92ZSBhc3NpZ25lZC1idXQtbm90LXVzZWQgdmFyaWFibGUgImJyIiIKKzkxZTI3ZjQ1IGJldHRlciBmaXR0aW5nIG5hbWVzIGZvciB1cHNhbXBsaW5nIGZ1bmN0aW9ucworYTVkN2VkNWMgUmVtb3ZlIGFzc2lnbmVkLWJ1dC1ub3QtdXNlZCB2YXJpYWJsZSAiYnIiCitmNjJkMmM5NCByZW1vdmUgdW51c2VkICdoYXNfYWxwaGEnIGZyb20gVlA4R2V0SW5mbygpIHNpZ25hdHVyZQorMDhlODY1ODIgdHJhcCBhbHBoYS1kZWNvZGluZyBlcnJvcgorYjM2MWVjYTEgYWRkIGN1dC1vZmYgdG8gYXJpdGggY29kZXIgcHJvYmFiaWxpdHkgdXBkYXRlLgorODY2NmE5M2EgU29tZSBidWctZml4ZXMgZm9yIGltYWdlcyB3aXRoIGFscGhhLgorMjczYTEyYTAgZml4IG9mZi1ieS0xIGRpZmYgaW4gY2FzZSBjcm9wcGluZyBhbmQgc2ltcGxlIGZpbHRlcmluZworMmY3NDFkMWUgd2VicG11eDogUmVhZEltYWdlOiBmaXggcHRyIGZyZWUgaW4gZXJyb3IgY2FzZQorNzIxZjNmNDggZml4IGFscGhhIGRlY29kZQorNjA5NDJjOGMgZml4IHRoZSBoYXNfYWxwaGFfIG9yZGVyCiszMDk3MWM5ZSBJbXBsZW1lbnQgcHJvZ3Jlc3MgcmVwb3J0IChhbmQgdXNlciBhYm9ydCkKK2VkYTUyMGE5IGNvc21ldGljcyBhZnRlciA5NTIzZjJhCiszOGJkNWJiNSBNZXJnZSAiQmV0dGVyIGFscGhhIHN1cHBvcnQgaW4gd2VicG11eCBiaW5hcnkiCitjY2JhZWJmZSBNZXJnZSAiVXBkYXRlZCB0aGUgaW5jbHVkZXMgdG8gcmVsYXRpdmUgcGF0aHMuIgorZDcxZmJkY2MgZml4IHNtYWxsIHR5cG8gaW4gZXJyb3IgbWVzc2FnZSBhcnJheQorY2RmOTdhYTIgQmV0dGVyIGFscGhhIHN1cHBvcnQgaW4gd2VicG11eCBiaW5hcnkKKzg4NWYyNWJjIFVwZGF0ZWQgdGhlIGluY2x1ZGVzIHRvIHJlbGF0aXZlIHBhdGhzLgorYTBlYzlhYWMgVXBkYXRlIFdlYlAgZW5jb2RlciAoY3dlYnApIHRvIHN1cHBvcnQgQWxwaGEuCis2NjdiNzY5YSBGaXhlZCB0aGUgaW5jbHVkZSBmb3IgdHlwZXMuaCB3aXRoaW4gbXV4LmgKKzk1MjNmMmE1IEFkZCBBbHBoYSBFbmNvZGUgc3VwcG9ydCBmcm9tIFdlYlBFbmNvZGUuCisxNjYxMmRkZCBNZXJnZSAiQWRkIEFscGhhIERlY29kZSBzdXBwb3J0IGZyb20gV2ViUERlY29kZS4iCitkMTE3YTk0MCBBZGQgQWxwaGEgRGVjb2RlIHN1cHBvcnQgZnJvbSBXZWJQRGVjb2RlLgorNjcyMjg3MzQgY29zbWV0aWNzIGFmdGVyIGUxOTQ3YTkKK2UxOTQ3YTkyIEFkZCBBbHBoYSBlbmNvZGUvZGVjb2RlIGNvZGUuCithZmM0YzVkNiBzaW1wbGlmeSBjb2RlIGJ5IGludHJvZHVjaW5nIGEgQ29weVBsYW5lKCkgaGVscGVyIGZ1bmMKKzExM2IzMTI4IE1lcmdlICJNVVggQVBJIFVwZGF0ZXMiCitjMzk4ZjU5NSBNVVggQVBJIFVwZGF0ZXMKKzVhY2YwNGVmIHJlbW92ZSBvcnBoYW4gc291cmNlIGZpbGUKKzA1OWYwM2VmIE1lcmdlICJkZWM6IHZhbGlkYXRlIGNvbG9yc3BhY2UgYmVmb3JlIHVzaW5nIGFzIGFycmF5IGluZGV4IgorNzBhMDM5ODkgTWVyZ2UgImZhY3Rvcml6ZSBzb21lIGNvZGUiCis5YjI0M2IzZCBmYWN0b3JpemUgc29tZSBjb2RlCiszNzJlMmI0NiBDb3JyZWN0IGEgYnVnIGluIFJlYWRQTkcoKSB3aXRoIEdSQVlfQUxQSEEgaW1hZ2VzCis0NjlkNmViOSBNZXJnZSAiTWFrZWZpbGUuYW06IHJlbW92ZSByZWR1bmRhbnQgbm9pbnN0X0hFQURFUlMiCis5ZmUzMzcyZiBkZWM6IHZhbGlkYXRlIGNvbG9yc3BhY2UgYmVmb3JlIHVzaW5nIGFzIGFycmF5IGluZGV4Cis4OTYyMDMwZiByZW1vdmUgb3JwaGFuIHNvdXJjZSBmaWxlCitjZWQzZTNmNCBNYWtlZmlsZS5hbTogcmVtb3ZlIHJlZHVuZGFudCBub2luc3RfSEVBREVSUworOTY0Mzg3ZWQgdXNlIFdFQlBfSU5MSU5FIGZvciBpbmxpbmUgZnVuY3Rpb24gZGVjbGFyYXRpb25zCis5MDg4MGExMSBNZXJnZSAibWFucGFnZXM6IGJyZWFrIGxvbmcgbGluZXMiCitiNTkxMDg5NSBNZXJnZSAibWFucGFnZXM6IG1pbm9yIGZvcm1hdHRpbmcgdXBkYXRlcyIKKzRjNDUxZTRhIE1lcmdlICJSZWN0aWZ5IHRoZSBDaHVuayBwYXJzaW5nIGxvZ2ljLiIKKzA0ZTg0Y2YxIGV4YW1wbGVzOiBzbGlnaHQgY2xlYW51cAorMDk5NzE3Y2UgbWFucGFnZXM6IGJyZWFrIGxvbmcgbGluZXMKKzFkYWYzOWJiIG1hbnBhZ2VzOiBtaW5vciBmb3JtYXR0aW5nIHVwZGF0ZXMKK2FiZDAzMGI1IGZpeCBtaXNzaW5nICIodm9pZCkiIGluIGZ1bmN0aW9uIHNpZ25hdHVyZQorZjZhN2Q3NTggcmVtb3ZlIHVzZWxlc3MgdGVzdAorZjA3YjIxMzggUmVjdGlmeSB0aGUgQ2h1bmsgcGFyc2luZyBsb2dpYy4KK2I4NjM0ZjdkIHdlYnBtdXg6IGZpeCBsaWIgbGluayBvcmRlcgorNDJjMmU2ODIgRml4IG1pc3NpbmcgY29tYSAob24gdW5jb21waWxlZCBjb2RlKQorZDgzMjlkNDEgQW5kcm9pZC5tazogYWRkIG1pc3Npbmcgc291cmNlIGZpbGVzCisxM2E1NGRmNSBNZXJnZSAiTW9yZSBhZ2dyZXNzaXZlIGNvcHktZWRpdDsgYWRkIFRPRE87IHZhbGlkYXRlIEhUTUw1IgorODY4Yjk2YWUgTW9yZSBhZ2dyZXNzaXZlIGNvcHktZWRpdDsgYWRkIFRPRE87IHZhbGlkYXRlIEhUTUw1Cis3NjdhZmVhMiBjb25maWd1cmU6IGNoZWNrIGZvciBhIHN5bWJvbCBjb250YWluZWQgaW4gbGlicG5nCis0MDhiODkxOCBNZXJnZSAiTGluZXdyYXAgYXQgNzIgY29scy4gQ2FzdWFsIGNvcHktZWRpdC4iCiszYWUzMThjNyBNZXJnZSAiUmVzdG9yZSAobW9zdCkgZW1waGFzaXM7IGFkZCBlbXBoYXNpcyB0byBub3JtYXRpdmUgUkZDIDIxMTkgdGVybXMgKE1VU1QsIGV0Yy4pIgorOTE4ZWIyZDggTWVyZ2UgIkJhc2ljIGNvbnRhaW5lciBkb2Mgc291cmNlIGNsZWFuLXVwOyBmaXggbGlzdHMgYW5kIHBzZXVkb2NvZGUgYmxvY2tzLiIKKzAzYmVjOWUwIExpbmV3cmFwIGF0IDcyIGNvbHMuIENhc3VhbCBjb3B5LWVkaXQuCisyNjc4ZDgxOSBSZXN0b3JlIChtb3N0KSBlbXBoYXNpczsgYWRkIGVtcGhhc2lzIHRvIG5vcm1hdGl2ZSBSRkMgMjExOSB0ZXJtcyAoTVVTVCwgZXRjLikKKzQyODY3NGRhIEJhc2ljIGNvbnRhaW5lciBkb2Mgc291cmNlIGNsZWFuLXVwOyBmaXggbGlzdHMgYW5kIHBzZXVkb2NvZGUgYmxvY2tzLgorNmE3N2Q5MjggTWVyZ2UgIk1ha2VmaWxlLnZjOiBjb3NtZXRpY3MiCisyOGMzOGU4YyBNZXJnZSAiTWFrZWZpbGUudmM6IGNvbmRlbnNlIGRpcmVjdG9yeSBjcmVhdGlvbiBydWxlcyIKKzU1YmUyY2Y4IEluaXRpYWwgaW1wb3J0IG9mIGNvbnRhaW5lciBzcGVjIGRvY3VtZW50LCBmcm9tIHBkZnRvdGV4dCB0cmFuc2Zvcm0uCithODJhNzg4YiBNYWtlZmlsZS52YzogY29zbWV0aWNzCitjOGY0MWNlNSBNYWtlZmlsZS52YzogY29uZGVuc2UgZGlyZWN0b3J5IGNyZWF0aW9uIHJ1bGVzCisyYjg3N2NkMCBTb21lIGZpeGVzIHRvIE1ha2VmaWxlLnZjIHRvIHN1cHBvcnQgdGhlIHNyY1xtdXggZGlyZWN0b3J5LgorM2ViOTY5YjMgTWVyZ2UgIkFkZCBNYWtlZmlsZS52YyBmb3IgTXV4IGxpYnJhcnkgJiBiaW5hcnkuIgorZTc4ZTk3MWUgQWRkIE1ha2VmaWxlLnZjIGZvciBNdXggbGlicmFyeSAmIGJpbmFyeS4KKzZhZWRkZTU4IEFkZCBtYW51YWwgZm9yIFdlYlBNdXggdG9vbC4KKzhhMzYwZDBhIE1lcmdlICJBZGRlZCBXZWJQTXV4IEJpbmFyeS4iCithNGYzMmNhZSBBZGRlZCBXZWJQTXV4IEJpbmFyeS4KK2YzYmY0Yzc2IEFkZGVkIE11eCBDb250YWluZXIgU3BlYyAmIFJFQURNRSBmb3IgTVVYLUFQSS4KKzlmNzYxY2ZhIENoYW5nZWQgZnVuY3Rpb24gc2lnbmF0dXJlIGZvciBXZWJQTXV4Q3JlYXRlCis1ZjMxYjVlYyBNZXJnZSAiQWRkIE11eCBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgV2ViUCBjb250YWluZXIuIgorMjMxNTc4NWYgQWRkIE11eCBsaWJyYXJ5IGZvciBtYW5pcHVsYXRpbmcgV2ViUCBjb250YWluZXIuCis3ZTE5OGFiYiB1cGRhdGUgQ2hhbmdlTG9nICh0YWc6IHYwLjEuMykKK2RmYzljMWVhIEhhcm1vbml6ZSB0aGUgZGF0ZXMKKzI4YWQ3MGM1IEZpeCBQTkcgZGVjb2RpbmcgYnVnCis4NDZlOTNjNSBVcGRhdGUgQVVUSE9SUyAmIGFkZCAubWFpbG1hcAorNTYzZTUyZDYgY29zbWV0aWNzIGFmdGVyICc3NjAzNmY1IFJlZmFjdG9yIGRlY29kZXIgbGlicmFyeScKKzc2MDM2ZjU0IFJlZmFjdG9yIGRlY29kZXIgbGlicmFyeQorMzc3ZWY0M2MgY29uZmlndXJlLmFjOiB1cGRhdGUgQUNfSU5JVCBwYXJhbXMKKzdhOGQ4NzYyIHVzZSBhIHVzZXItdmlzaWJsZSBNQUNSTyBmb3IgbWF4IHdpZHRoL2hlaWdodC4KK2Q0ZTlmNTU5IE5FT04gZGVjb2RlIHN1cHBvcnQgaW4gV2ViUAorMGVlNjgzYjUgdXBkYXRlIGxpYnRvb2wgdmVyc2lvbi1pbmZvCitmZGJlMDJjNSB3aW5kb3dzOiBtYXRjaCBfY29uZF9kZXN0cm95IGxvZ2ljIHcvcmV0dXJuIHZhcmlhYmxlIG5hbWUKKzIwNmI2ODZiIFJFQURNRTogY29ycmVjdCBhZHZhbmNlZCBkZWNvZGUgYXBpIHBzZXVkby1jb2RlCis2YTMyYTBmNSBtYWtlIFZQOEJpdFJlYWRlciBhIHR5cGVkZWYsIGZvciBiZXR0ZXIgcmUtdXNlCitiMTEyZTgzNiBjcmVhdGUgYSBsaWJ3ZWJwdXRpbHMgdW5kZXIgc3JjL3V0aWxzCitlZTY5N2Q5ZiBoYXJtb25pemUgdGhlIGluY2x1ZGUgZ3VhcmRzIGFuZCAjZW5kaWYgY29tbWVudHMKK2ExZWMwN2E2IEZpeGluZyBjb21waWxlciBlcnJvciBpbiBub24geDg2IGFyY2guCitkY2ZhNTA5YSBGaXhlZCByZWN1cnNpdmUgaW5jbHVzaW9uIG9mIGJpdF93cml0ZXIuaCBhbmQgdnA4ZW5jaS5oLgorZTA2YWMwODggY3JlYXRlIGEgc2VwYXJhdGUgbGlid2VicGRzcCB1bmRlciBzcmMvZHNwCitlYmViNDEyYSB1c2UgdW5zaWduZWQgaW50IGZvciBiaXRmaWVsZHMKKzM0MWNjNTZhIG1ha2Uga05ld1JhbmdlIGEgc3RhdGljIGFycmF5CisyMjdhOTFlNSBSRUFETUU6IG1pbm9yIHdvcmRpbmcgdXBkYXRlCiswNWJkOGU2YSBhZGQgbWFuIHBhZ2VzIHRvIGRpc3QKKzgxMmRmYTFhIGJ1bXAgdXAgdmVyc2lvbnMgaW4gcHJlcGFyYXRpb25zIGZvciAwLjEuMworYTViNzhjODEgd3JhcCBhbHBoYS1yZWxhdGVkIG9wdGlvbnMgdW5kZXIgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMgZmxhZworMzRkYzc5MDcgcmVnZW4gQ2hhbmdlTG9nIGZvciAwLjEuMy1yYzIKKzdjNDM2NjMwIFNpbGVuY2Ugc29tZSAobW9yZSkgVmlzdWFsIFN0dWRpbyB3YXJuaW5ncy4KKzYwMzA2ZThjIGFkZCB0b3AtbGV2ZWwgZ2l0YXR0cmlidXRlcworMmFhNmI4MGUgU2xpZW5jZSBzb21lIFZpc3VhbCBTdHVkaW8gd2FybmluZ3MuCis0Y2JiYjI5MCBNZXJnZSAiYnVtcCB1cCB2ZXJzaW9uIGZvciBuZXh0IGZyZWV6ZSIKK2EzMjkxNjc0IGJ1bXAgdXAgdmVyc2lvbiBmb3IgbmV4dCBmcmVlemUKK2M3ZTg2YWJhIGNvc21ldGljczogZml4IGNvbW1lbnQgbGluZSBsZW5ndGhzCitjOWUwMzdhYiBtYWtlZmlsZS51bml4OiBhZGQgc2ltcGxlIGRpc3QgdGFyZ2V0Cis4N2Q1OGNlOSBtYWtlZmlsZS51bml4OiBydWxlIG1haW50ZW5hbmNlCitkNDc3ZGU3NyBtZW5kCitmYWMxNWVjNyBVcGRhdGUgTkVXUyAmIFJFQURNRSBmb3IgbmV4dCByZWxlYXNlIFYwLjEuMworNjIxNTU5NWMgTWVyZ2UgImFkZCBhIC1wYXJ0aXRpb25fbGltaXQgb3B0aW9uIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IGludHJhNHg0IgorMzgxNGI3NmMgTWVyZ2UgInJlb3JnYW5pemUgY2h1bmstcGFyc2luZyBjb2RlIgorOTAwMjg2ZTAgYWRkIGEgLXBhcnRpdGlvbl9saW1pdCBvcHRpb24gdG8gbGltaXQgdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYnkgaW50cmE0eDQKK2NkMTJiNGIwIGFkZCB0aGUgbWlzc2luZyBjb3N0IGZvciBJNC9JMTYgbW9kZSBzZWxlY3Rpb24KK2RmY2MyMTM2IHJlb3JnYW5pemUgY2h1bmstcGFyc2luZyBjb2RlCiszY2YyMDMwNiBpbml0aWFsaXplIHBvaW50ZXJzIHRvIGZ1bmN0aW9uIHdpdGhpbiBWUDhEc3BJbml0KCkKK2QyMWI0Nzk1IE1lcmdlICJ3aW5kb3dzOiBhZGQgZGVjb2RlIHRocmVhZGluZyBzdXBwb3J0IgorNDczYWU5NTMgZml4IGhhbmcgb24gdGhyZWFkIGNyZWF0aW9uIGZhaWx1cmUKK2ZjY2NhNDIwIHdpbmRvd3M6IGFkZCBkZWNvZGUgdGhyZWFkaW5nIHN1cHBvcnQKK2EzMWY4NDNhIFVzZSB0aGUgZXhhY3QgUE5HX0lOQ0xVREVTL1BOR19MSUJTIHdoZW4gdGVzdGluZyBmb3IgLWxwbmcKK2FkOWI0NWYxIE1lcmdlICJNYWtlZmlsZS52YzogcnVsZSBtYWludGVuYW5jZSIKKzU2NWEyY2FiIE1ha2VmaWxlLnZjOiBydWxlIG1haW50ZW5hbmNlCisyZDBkYTY4MSBtYWtlZmlsZS51bml4OiBkaXNhYmxlIFd2bGEgYnkgZGVmYXVsdAorZmM3ODE1ZDYgbXVsdGktdGhyZWFkIGRlY29kaW5nOiB+MjUtMzAlIGZhc3RlcgorYWNkOGJhNDIgaW8tPnRlYXJkb3duKCkgd2FzIG5vdCBhbHdheXMgY2FsbGVkIHVwb24gZXJyb3IKK2M4NTUyN2IxIE1lcmdlICJNYWtlZmlsZS52YzogYWRkIERMTCBjb25maWdzIgorZTFlOWJlMzUgY29zbWV0aWNzOiBzcGVsbGluZy9ncmFtbWFyIGluIFJFQURNRSBhbmQgbGliIGhlYWRlcnMKK2I0ZDBlZjhmIE1ha2VmaWxlLnZjOiBhZGQgRExMIGNvbmZpZ3MKKzk5ODc1NGE3IHJlbW92ZSB1bnVzZWQgbmJfaTRfIGFuZCBuYl9pMTZfIGZpZWxkcy4KKzlmMDFjZTNhIHJlbmFtZSBXZWJQRGVjQnVmZmVyOjptZW1vcnkgLT4gcHJpdmF0ZV9tZW1vcnkKK2ZiNWQ2NTliIGZpeCBhbiBvdmVyZmxvdyBidWcgaW4gTFVUIGNhbGN1bGF0aW9uCitkNjQ2ZDVjNyBzd2lnOiBhZGQgV2ViUERlY29kZUFSR0IKKzc4YWVlZDQwIGFkZCBtaXNzaW5nIFdlYlBEZWNvZGVBUkdCSW50bygpIGFuZCBzd2l0Y2ggQVJHQjQ0NDQgdG8gUkdCQTQ0NDQgYXMgd2FzIGludGVuZGVkCitjZDdjNTI5MiBleHBsaWNpdGx5IG1hcmsgbGlicmFyeSBmdW5jdGlvbnMgYXMgZXh0ZXJuCisxOWRiNTlmOCBhZGQgc3VwcG9ydCBmb3IgUkdCNTY1LCBBUkdCNDQ0NCBhbmQgQVJHQiBjb2xvcnNwYWNlIChkZWNvZGVyKQorYzkxNWZiMmEgZW5jb2RlciBzcGVlZC11cDogaGFyZGNvZGUgc3BlY2lhbCBsZXZlbCB2YWx1ZXMKK2M1NThiZGFkIFJlbmFtZSBhbmQgaW1wcm92ZSB0aGUgQVBJIHRvIHJldHJpZXZlIGRlY29kZWQgYXJlYQorYmY1OTlkNzQgTWVyZ2UgIm1ha2VmaWxlLnVuaXg6IGRpc2FibGUgLVd2bGEgYnkgZGVmYXVsdCIKK2M5ZWEwM2Q3IFNTRTIgdmVyc2lvbiBvZiBzdHJvbmcgZmlsdGVyaW5nCis5OTNhZjNlMiBtYWtlZmlsZS51bml4OiBkaXNhYmxlIC1XdmxhIGJ5IGRlZmF1bHQKKzM4MjdlMWJjIE1lcmdlICJleGFtcGxlczogKHdpbmRvd3MvV0lDKSBhZGQgYWxwaGEgc3VwcG9ydCIKK2UyOTFmYWUwIFNTRTIgZnVuY3Rpb25zIGZvciB0aGUgZmFuY3kgdXBzYW1wbGVyLgorYTA2YmJlMmUgYWRkIFdlYlBJU2V0SU9Ib29rcygpIHRvIHNldCBzb21lIGN1c3RvbSBob29rcyBvbiB0aGUgaW5jcmVtZW50YWwgZGVjb2RlciBvYmplY3QuCis3NjQzYTZmMiBNZXJnZSAibWFrZWZpbGUudW5peDogdXNlIHVuYW1lIHRvIGRldGVjdCBPU1ggZW52aXJvbm1lbnQiCis1MTQyYTBiZSBleHBvcnQgYWxwaGEgY2hhbm5lbCAoaWYgcHJlc2VudCkgd2hlbiBkdW1waW5nIHRvIFBHTSBmb3JtYXQKKzE0ZDU3MzFjIG1ha2VmaWxlLnVuaXg6IHVzZSB1bmFtZSB0byBkZXRlY3QgT1NYIGVudmlyb25tZW50CiswODA1NzA2MiBleGFtcGxlczogcXVpZXQgd2FybmluZ3MKKzNjZmUwODg4IGV4YW1wbGVzOiAod2luZG93cy9XSUMpIGFkZCBhbHBoYSBzdXBwb3J0CisxM2VkOTRiOCBhZGQgY29tcGlsZSB3YXJuaW5nIGZvciB2YXJpYWJsZS1sZW5ndGgtYXJyYXkKKzVhMThlYjFhIE1lcmdlICJhZGQgQWR2YW5jZWQgRGVjb2RpbmcgSW50ZXJmYWNlIgorNWM0ZjI3ZjkgYWRkIG1pc3NpbmcgXG4KK2Y0YzRlNDE2IDgwIGNvbHMgZml4CitkMjYwMzEwNSBhZGQgQWR2YW5jZWQgRGVjb2RpbmcgSW50ZXJmYWNlCitiZDJmNjVmNiBzc2UyIHZlcnNpb24gb2YgdGhlIGNvbXBsZXggZmlsdGVyCis5NmVkOWNlMCBwZXJmb3JtIHR3byBpZGN0IHRyYW5zZm9ybXMgYXQgYSB0aW1lIHdoZW4gcG9zc2libGUKKzAxYWY3YjY5IHVzZSBhbGlnbmVkIHN0b3JlZAorMGUxZDFmZGYgTWVyZ2UgIk1ha2VmaWxlLnZjOiBhZGQgZXhwZXJpbWVudGFsIHRhcmdldCIKKzJhMTI5MmE2IE1ha2VmaWxlLnZjOiBhZGQgZXhwZXJpbWVudGFsIHRhcmdldAorMjNiZjM1MWUgRW5hYmxlIGRlY29kZSBTU0UyIGZvciBWaXN1YWwgU3R1ZGlvCisxMzFhNGI3YiBkZWMvZHNwX3NzZTI6IGZpeCB2aXN1YWwgc3R1ZGlvIGNvbXBpbGUKKzAwZDlkNjgwIHN3aWc6IGZpbGUgcmVvcmdhbml6YXRpb24KKzdmYzdlMGQ5IE1lcmdlICJzd2lnL2phdmE6IGJhc2ljIGVuY29kZSBzdXBwb3J0IgorM2JlNTdiMTYgZml4IE1TVkMgY29tcGlsZSBmb3IgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKKzQwYTdlMzQ3IGRlYy9kc3A6IGRpc2FibGUgc3NlMiBmb3IgVmlzdWFsIFN0dWRpbyBidWlsZHMKK2U0ZDU0MGM4IGFkZCBTU0UyIGNvZGUgZm9yIHRyYW5zZm9ybQorNTRmMjE3MGEgc3dpZy9qYXZhOiBiYXNpYyBlbmNvZGUgc3VwcG9ydAorYzVkNDU4NGIgY2FsbCBmdW5jdGlvbiBwb2ludGVycyBpbnN0ZWFkIG9mIEMtdmVyc2lvbgorZWE0M2YwNDUgTWVyZ2UgImNvbmZpZ3VyZTogbWluZ3czMiB0YXJnZXRzOiB0ZXN0IGZvciBXSUMgc3VwcG9ydCIKK2ExMTAwOWQ3IFNTRTIgdmVyc2lvbiBvZiBzaW1wbGUgaW4tbG9vcCBmaWx0ZXJpbmcKKzQyNTQ4ZGE5IHNoYXZlIG9uZSB1bm5lZWRlZCBmaWx0ZXItY2FjaGUgbGluZQorMzFmOWRjNmYgY29uZmlndXJlOiBtaW5ndzMyIHRhcmdldHM6IHRlc3QgZm9yIFdJQyBzdXBwb3J0CisxOTU1OTY5OSBNZXJnZSAic3BsaXQgZXhwcmVzc2lvbiBpbiB0d28uIgorNDE1ZGJlNDYgc3BsaXQgZXhwcmVzc2lvbiBpbiB0d28uCitlMjkwNzJhOCBjb25maWd1cmU6IHRlc3QgZm9yIHpsaWIgb25seSB3Ly0tZW5hYmxlLWV4cGVyaW1lbnRhbAorYjJiMDA5MGIgU2ltcGxpZnkgVmlzdWFsIFN0dWRpbyBpZmRlZnMKK2NhN2EyZmQ2IEFkZCBlcnJvciByZXBvcnRpbmcgZnJvbSBlbmNvZGluZyBmYWlsdXJlcy4KKzZjOTQwNWRiIE1lcmdlICJNYWtlZmlsZS52YzogcmVxdWlyZSBDRkcgd2l0aCBjbGVhbiB0YXJnZXQiCiswNDI0ZWNkOSBNYWtlZmlsZS52YzogcmVxdWlyZSBDRkcgd2l0aCBjbGVhbiB0YXJnZXQKKzAwMzQxN2M3IEVuYWJsZSBTU0UyIGZvciBWaXN1YWwgU3R1ZGlvIGJ1aWxkcworYWYxMGRiNGEgbGl0dGxlIHNwZWVkIHVwIGZvciBWUDhCaXRVcGRhdGUoKQorZTcxNDE4ZjggbW9yZSBNU1ZDIGZpbGVzIHRvIGlnbm9yZQorNDZkOTAzNjMgY29zbWV0aWNzCitlZGY1OWFiMyB0eXBvIGZpeAorNzIyMjlmNWYgQWRkIHN1cHBvcnQgZm9yIHg2NCBhbmQgU1NFMiBidWlsZHMgdW5kZXIgV2luZG93cy4KKzkyZTVjNmUxIFZQOEdldEluZm8oKSArIFdlYlBSZXNldERlY1BhcmFtcygpCis0MTZiN2E2YiByYWlzZSB0aGUgZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciB0aGUgcmVzY2FsZXIKK2FhODdlNGUwIGZpeCBhbGlnbm1lbnQKK2ViNjY2NzBjIGRpc2FibGUgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKK2M1YWU3ZjY1IHR5cG8gZml4OiBVU0VfID0+IFdFQlBfCitkMDQxZWZhZSBzd2lnOiBhZGQgbGlid2VicC5qYXIvbGlid2VicF9qYXZhX3dyYXAuYworZjZmYjM4NzcgYWRkIHN3aWcgaW50ZXJmYWNlCitlOTI3MzkwMiBhbGlnbiBidWZmZXIgZm9yIGRvdWJsZSB0b28KKzg0MmMwMDliIGZpeCAtc3Ryb25nIG9wdGlvbgorZDBhNzAzODcgTWVyZ2UgImNvc21ldGljcyIKK2ZjMGEwMmU1IGZpeCB0aGUgZGljaG90b215IGxvb3AKKzM4MzY5YzAzIGNvc21ldGljcworOGRmYzRjNmYgZmFjdG9yaXplIGFuZCB1bmlmeSBHZXRBbHBoYSgpIGJldHdlZW4gdGhlIEMgYW5kIFNTRTIgdmVyc2lvbgorNmQwZTY2YzIgcHJlcGFyZSBleHBlcmltZW50YXRpb24gd2l0aCB5dXY0NDQgLyA0MjIKKzc5Y2M0OWY1IGFkZCBhIC0tZW5hYmxlLWV4cGVyaW1lbnRhbCBvcHRpb24gdG8gJy4vY29uZmlndXJlJworZDc1NzUyMzggc3NlMiB2ZXJzaW9uIG9mIENvbGxlY3RIaXN0b2dyYW0oKQorYzFjNzI4ZDYgYWRkIGFuIGV4dHJhICNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUyB0byBhdm9pZCAndW51c2VkIHZhcmlhYmxlJyB3YXJuaW5nCis2MGM2MWQyZCBhbHdheXMgY2FsbCBWUCpFbmNEZWxldGVBbHBoYSgpIHVuY29uZGl0aW9ubmFsbHksIGZvciBzaW1wbGljaXR5CiswZjhjNjM4NCBzaW1wbHkgZG9uJ3QgY2FsbCBXcml0ZUV4dGVuc2lvbnMoKSBpZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUyBpcyBub3QgZGVmaW5lZAorNDdjNjYxZDUgcmVuYW1lIHN3YXAgLT4gc3dhcF9yYgorMTBkNTViYmIgbW92ZSBjaHVua1tdIGRlY2xhcmF0aW9uIG91dCBvZiB0aGUgZm9yKCkgbG9vcAorNTE3Y2VjMjEgZml4IGluZGVudGF0aW9uCitmN2Q5ZTI2MSBmaXggbWVyZ2UgcHJvYmxlbXMKKzhmZDQyYjNhIGFkZCBhIHN0cmlkZSAnYV9zdHJpZGUnIGZvciB0aGUgYWxwaGEgcGxhbmUKK2I4ZGNiZjJmIGZpeCBhbHBoYS1wbGFuZSBjb3B5IGFuZCBjcm9wIG1ldGhvZHMKK2NkZWY4OWRlIGZpeCBzb21lICd1bnVzZWQgdmFyaWFibGUnIHdhcm5pbmcKK2ZiMjljMjYyIFNTRTIgdmVyc2lvbiBvZiB0aGUgZndkIHRyYW5zZm9ybSBhbmQgdGhlIHNxdWFyZWQgc3VtIG1ldHJpYworMmFiNGI3MmYgRVhQRVJJTUVOVEFMOiBhZGQgc3VwcG9ydCBmb3IgYWxwaGEgY2hhbm5lbAorY2ZiZjg4YTYgYWRkIFNTRTIgZnVuY3Rpb25zLiB+MnggZmFzdGVyIGVuY29kaW5nIG9uIGF2ZXJhZ2UuCitlN2ZmM2Y5YSBtZXJnZSB0d28gSVRyYW5zZm9ybXMgdG9nZXRoZXIgd2hlbiBhcHBsaWNhYmxlIGFuZCBjaGFuZ2UgdGhlIFRUcmFuc2Zvcm0gdG8gcmV0dXJuIHRoZSBzdW0gZGlyZWN0bHkuCitjYTU1NDEzNyBmaXggV2ViUElEZWNHZXRSR0IoKSB0byBhY2NlcHQgYW55IFJHQihBKSBtb2RlLCBub3QganVzdCBNT0RFX1JHQgorOGFhNTBlZmQgZml4IHNvbWUgJ21hbicgdHlwb3MKK2QzZjNiZGRhIHVwZGF0ZSBDaGFuZ2VMb2cgKHRhZzogdjAuMS4yKQorZDdlOWE2OWMgdXBkYXRlIGNvbnRyaWJ1dG9yIGxpc3QKKzI2MWFiYjhlIGFkZCBhICdzdXBlcmNsZWFuJyBzZWN0aW9uCisyNzZhZTgyNSBSZW1vdmUgZmlsZXMgbm90IG1lYW4gdG8gYmUgaW4gZ2l0LCBhbmQgdXBkYXRlIC5naXRpZ25vcmUKKzI0ODY4NDU1IGJ1aWxkOiBwcmVwYXJlIGxpYndlYnAucGMKKzE0Y2ViNmU4IGFkZCAiLXZlcnNpb24iIGRlc2NyaXB0aW9uIHRvIG1hbiBwYWdlcworYjI0N2EzYjIgQ3JlYXRlIHRoZSBtNCBkaXJlY3RvcnksIGFuZCBhbHNvIHBsYWNlIC5naXRpZ25vcmUgaW4gdGhlcmUgZm9yIGxpYnRvb2wuCitjZGQ3MzRjOSBSZXNvbHZlIGF1dG9tYWtlIHdhcm5pbmdzCitjNWZhNzI2ZSBidWlsZDogYWRkIHBrZ2NvbmZpZyBmaWxlcworYjIwYWFjYTIgYnVpbGQ6IGp1c3QgdXNlIGF1dG9yZWNvbmYsIGF2b2lkIGNhbGxpbmcgdG9vbHMgbWFudWFsbHkKKzRiMGIwZDY2IGN3ZWJwOiB1c2UgbW9kZXJuIGZ1bmN0aW9ucworZWZiYzZjNDEgdXBkYXRlIEFuZHJvaWQubWsKKzc3Nzc1NzBiIGJldHRlciB2ZXJzaW9uIG9mIENoYW5nZUxvZworZmE3MGQyYjcgdXBkYXRlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBET0MKK2Y4ZGI1ZDVkIG1vcmUgQzg5LWZpeGVzCiswZGUwMTNiMyBmaXggdHlwb3MKKzY1MGZmYTNiIGFkZCB2ZXJzaW9uIGdldHRlcnMgZm9yIGRlY29kZXIgYW5kIGVuY29kZXIKK2JlNDg2N2QyIGRvYyBmb3IgaW5jcmVtZW50YWwgZGVjb2RpbmcKKzU2NzMyYTFiIGFkZCBpZGVjLm9iaiBpbiBNU1ZDIG1ha2VmaWxlCisyMDhhZmI1ZSBhZGQgYysrIGd1YXJkcworOGJmNzZmZTAgYWRkIGluY3JlbWVudGFsIGRlY29kaW5nCisxZjI4ODMyOCAnaW5saW5lJyBpc24ndCBkZWZpbmVkIGluIHN0cmljdCBhbnNpIGM4OQorOGI3N2M2MzIgbW92ZSB0aGUgcXVhbnRpemF0aW9uIGZ1bmN0aW9uIHRvIGRzcC5jCitiMmMzNTc1YyBhZGQgYSAnbGFzdF95JyBmaWVsZCB0byBXZWJQRGVjUGFyYW1zCisyNjU0YzNkYSBjb3JyZWN0bHkgcGFzcyBhbG9uZyB0aGUgZXhhY3Qgc2FtZSBzdGF0dXMgcmV0dXJuZWQgZnJvbSBQYXJzZVBhcnRpdGlvbnMKKzQ3MDQxNDZhIGFkZCBtaXNzaW5nIHByZWNpc2lvbiBpbiB0aGUgbWFuCis2ZDk3OGE2YyBhZGQgZXJyb3IgbWVzc2FnZXMKKzY0NjNlNmFiIGFkZCBzb21lIGluc3RhbGwgaW5zdHJ1Y3Rpb25zLCBhbmQgZml4IGludGVsLW1hYyBmbGFncworMDVmYjdiZmMgTWVyZ2UgIi5naXRpZ25vcmU6IGluaXRpYWwgdmVyc2lvbiIKK2MzM2YwMTk1IC5naXRpZ25vcmU6IGluaXRpYWwgdmVyc2lvbgorZTUzMmI5YWIgTWFrZWZpbGU6IGFsbG93IG91dCBvZiB0cmVlIGJ1aWxkcworNGMwZGE3YWEgZW5hYmxlIHNwYXJzZSBkYy9hYyB0cmFuc2Zvcm1zCiswN2RiYjhkNSBjbGFyaWZ5IHRoZSByZXR1cm4gbG9naWMKKzVjNjllMWJiIGZpeCBiaWdnZXItYnktMSBhcnJheQorN2M1MjY3ZTMgZml4IGEgKGhhcm1sZXNzKSB0eXBvOiBub25femVyb18gLT4gbm9uX3plcm9fYWNfCitiYzc1MjEzNSBmaXggbWlzc2luZyBmcmVlKCkKK2FmM2UyYWFhIHJlbW92ZSB0cmFpbGluZyBzcGFjZXMKKzEzZTUwZGE2IG1ha2UgdGhlIGJpdHJlYWRlciBwcmVsb2FkIGF0IGxlYXN0IDhiaXRzLCBpbnN0ZWFkIG9mIHBvc3QtbG9hZCB0aGVtICh0aGlzIG1ha2VzIGluaXRpYWxpemF0aW9uIGVhc2llciBhbmQgd2lsbCBiZSBoZWxwZnVsIGZvciBpbmNyZW1lbnRhbCBkZWNvZGluZykuIE1vZGlmeSBQYXJzZVBhcnRpdGlvbnMoKSB0byBhY2NvbW1vZGF0ZSBmb3IgdHJ1bmNhdGVkIGlucHV0LgorZjQ4ODhmNzcgZW1pdCA5IC0gbmJfYml0cyB0cmFpbGluZyB6ZXJvcyBpbnN0ZWFkIG9mIDgKKzNkYjY1MjU1IHNlcGFyYXRlIGJsb2NrLXBhcnNpbmcgaW50byBhIHZpc2libGUgVlA4RGVjb2RlTUIoKQorYTg3MWRlMDIgYWRkIG1pc3NpbmcgZXh0ZXJuICJDIgorYjNjZThjNTIgcmVtb3ZlIGEgZ2NjIHdhcm5pbmcgYWJvdXQgdHlwZSBwdW4gYnkgdXNpbmcgYSBwcm9wZXIgdW5pb24nZCB0eXBlCitlMTg2MzcxNSB1cGRhdGUgYWZ0ZXIgYWRkaXRpb24gb2Ygd2VicGkuaAorM2U4NTZlMmQgRXh0cmFjdCBzb21lIHVzZWZ1bCBmdW5jdGlvbnMgYXJvdW5kIGRlY29kaW5nIGJ1ZmZlciBXZWJQRGVjUGFyYW1zLgorZDViYzA1YTQgbWFrZSB0aGUgZmlsdGVyaW5nIHByb2Nlc3MgbWF0Y2ggbGlidnB4IGFuZCBmZnZwOAorZGQ2MDEzOGQgYWRkIG1hbiBwYWdlcyBmb3IgY3dlYnAoMSkgYW5kIGR3ZWJwKDEpCitjNGZhMzY0NCBmaXggaGVhZGVyCis1YjcwYjM3OCAqIGFkZCBhbiBvcHRpb24gdG8gYnlwYXNzX2ZpbHRlcmluZyBpbiBWUDhJby4KK2I5N2E0MDAzIHNpbXBsaWZ5IFF1YW50aXplQmxvY2sgY29kZSBhIGJpdAorODRiNThlYmIgYWRkIG1vcmUgY2hlY2tzIGFyb3VuZCBwaWN0dXJlIGFsbG9jYXRpb24KK2I2NWEzZTEwICAgICByZW1vdmUgYWJzb2x1dGVfZGVsdGFfIGZpZWxkIGFuZCBzeW50YXggY29kZQorMDc0NGU4NDIgRG9udCcgb3BlbiBvdXRwdXQgZmlsZSB1bnRpbCB3ZSdyZSBzdXJlIHRoZSBpbnB1dCBmaWxlIGlzIHZhbGlkCitkNWJkNTRjNyBmaXggdHlwbyBhbmQgYnVnZ3kgbGluZQorZjdhOTU0OWQgQWRkIGEgc2ltcGxlIHRvcC1sZXZlbCBtYWtlZmlsZS51bml4IGZvciBxdWljayAmIGVhc3kgYnVpbGQuCis1ZjM2Yjk0NCB1cGRhdGUgdGhlIGRvYyBmb3IgdGhlIC1mIG9wdGlvbgorZjYxZDE0YWEgYSBXZWJQIGVuY29kZXIgY29udmVydHMgUE5HICYgSlBFRyB0byBXZWJQCis4MWM5NjYyMSBvb3BzOiBmb3Jnb3R0ZW4gY2FsbCB0byBJbml0aWFsaXplKCkgKyBtb3ZlIHRoZSBlcnJvciBtZXNzYWdlIHRvIGEgbW9yZSB1c2VmdWwgcGxhY2UKKzg3ZmZhMDA1IHR5cG86IGZpeCBhIG1pc3NpbmcgJ1InLCB3YXMgY29uZnVzaW5nLgorYjA0Yjg1N2EgKiBhZGQgZGVjb2RpbmcgbWVhc3VyZW1lbnQgdXNpbmcgc3RvcHdhdGNoLmggKHVzZSAtdiBvcHRpb24pICogc3VwcG9ydCBQTkcgb3V0cHV0IHRocm91Z2ggV0lDIG9uIFdpbjMyCis3NDZhNDgyMCAqIG1ha2UgKCpwdXQpKCkgaG9vayByZXR1cm4gYSBib29sIGZvciBhYm9ydCByZXF1ZXN0LiAqIGFkZCBhbiBlbnVtIGZvciBWUDhTdGF0dXMoKSB0byBtYWtlIHRoaW5ncyBjbGVhcmVyCis3M2M5NzNlNiAqIHN0cmVuZ3RoZW4gcmlmZi9jaHVuayBzaXplIGNoZWNrcyAqIGRvbid0IGNvbnNpZGVyIG9kZC1zaXplZCBjaHVua3MgYmVpbmcgYW4gZXJyb3IKKzFkYzQ2MTFhIGFkZCBzdXBwb3J0IGZvciBQTkcgb3V0cHV0IChkZWZhdWx0KSByZWd1bGFyaXplIGluY2x1ZGUgZ3VhcmRzCis4NjA2NDFkZiBmaXggYSB0eXBvOiBzaXplb2Yoa1lNb2RlUHJvYmFJbnRlcjApID0+IHNpemVvZihrVVZNb2RlUHJvYmFJbnRlcjApCiszMjU0ZmM1MiBmaXggc29tZSBwZXR0eSBjb25zdG5lc3MgZml4IHRoZSAuL2NvbmZpZ3VyZSBmaWxlIHRvbworNTA0ZDMzOTMgZml4IGVvZl8gbWlzLWluaXRpYWxpemF0aW9uCisyYmMwNzc4ZiBsZWZ0b3ZlciBNYWtlZmlsZS4qIGZyb20gcHJldmlvdXMgY29tbWl0CitkMmNmMDRlNCBtb3ZlIE1ha2VmaWxlLmFtIG9uZSBsZXZlbCBiZWxvdywgdG8gc3JjL2RlYyBmaXggdHlwb3MgaGVyZSBhbmQgdGhlcmUgZHdlYnAgaXMgbm93IGFuIGluc3RhbGxlZCBwcm9ncmFtCithZGU5MmRlOCB0eXBvOiB2cDguaCAtPiBkZWNvZGVfdnA4LmgKK2Q3MjQxMjQxIGZvcmdvdCB0byBkZWNsYXJlIHR5cGVzLmggdG8gYmUgaW5zdGFsbGVkCis2NDIxYTdhNCBtb3ZlIHRoZSBkZWNvZGVyIHNvdXJjZXRyZWUgdG8gYSBzdWItbG9jYXRpb24gc3JjL2RlYyB0byBtYWtlIHJvb20gZm9yIGZ1dHVyZSBsaWJzIHNvdXJjZXMKK2E5YjNlYWI2IGNvcnJlY3QgbGF5b3V0IG5hbWUgaXMgSU1DNC4KKzIzMzA1MjJjIGhhbmRsZSBjb3JuZXIgY2FzZSBvZiB6ZXJvLWRpbWVuc2lvbnMKKzI4MGMzNjU4IG1ha2UgVlA4SW5pdCgpIGhhbmRsZSBzaG9ydCBidWZmZXJzICg8IDIgYnl0ZXMpIGNvcnJlY3RseQorYjFjOWU4YjQgaGFuZGxlIGVycm9yIGNhc2VzIG1vcmUgcm9idXN0bHkKKzBlOTQ5MzVjIE1lcmdlICJ0YWJsZS1sZXNzIHZlcnNpb24gb2YgY2xpcF84YigpIgorMWUwYTJkMjUgdGFibGUtbGVzcyB2ZXJzaW9uIG9mIGNsaXBfOGIoKQorZTEyMTA5ZWUgZHdlYnA6IGNoYW5nZSAteXV2IG9wdGlvbiB0byAtcmF3IGNoYW5nZSB0aGUgbGF5b3V0IHRvIElNQzIKK2Q3MjE4MGE0IHNwZWVkLXVwIGZhbmN5IHVwc2NhbGVyCis5MTQ1ZjNiYyByZXNldCBlb2ZfIGF0IGNvbnN0cnVjdGlvbiB0aW1lCithN2VlMDU1OSBzaW1wbGlmeSB0aGUgbG9naWMgb2YgR2V0Q29lZmZzKCkKK2Y2N2I1OTM5IGxvdCBvZiBjb3NtZXRpY3MKK2VhMjdkN2M2IGZpeCBlbmRpYW4gcHJvYmxlbSBvbiBQb3dlclBDCitiZWIwYTFiYSBmaXggc2lnbmF0dXJlIG9mIFZQOFN0b3JlQmxvY2sKK2IxMjhjNWUyIE1lcmdlICJmYW5jeSBjaHJvbWEgdXBzY2FsaW5nIgorNmEzN2EyYWEgZmFuY3kgY2hyb21hIHVwc2NhbGluZworZmY1NjVlZGMgZml4IHR3byBudW1lcmljIHR5cG9zCis1YTkzNmEwYSB1c2UgdWludHB0cl90IGZvciBjYXN0aW5nIHBvaW50ZXJzIHRvIGludHMKK2UxNGEwMzAxIGZvciBjcm9zc19jb21waWxpbmc9eWVzIHRvIHByZXZlbnQgZXhlY3V0aW5nIGFueSBiaW5hcnkKKzgzYjU0NWVlIGFkZCB2YzkrIG1ha2VmaWxlCisyOTZmNjkxNCBmaXggb3V0cHV0IGxvb3AgZm9yIHNtYWxsIGhlaWdodAorY2JmYmI1YzMgY29udmVydCB0byBwbGFpbi1DCitmMDlmOTZlZSBGaXggZGVjbGFyYXRpb24gYWZ0ZXIgc3RhdGVtZW50IHdhcm5pbmcKKzU5ODFlZTU1IEZpeCBVViBwbGFuZSBhYy9kYyBxdWFudGl6ZXIgdHJhbnNwb3NpdGlvbgorYzhkMTVlZmEgY29udmVydCB0byBBTlNJLUMKK2MzZjQxY2I0IEluaXRpYWwgY29tbWl0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9MSUNFTlNFIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTElDRU5TRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMzOTVjOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9MSUNFTlNFCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotQ29weXJpZ2h0IChjKSAyMDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotCi1SZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLW1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLW1ldDoKLQotICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0gICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gICAgZGlzdHJpYnV0aW9uLgotCi0gICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heQotICAgIGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCi0gICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0KLVRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLUEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi1IT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi1TUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi1MSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLURBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi1PRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1BZGRpdGlvbmFsIElQIFJpZ2h0cyBHcmFudCAoUGF0ZW50cykKLQotIlRoaXMgaW1wbGVtZW50YXRpb24iIG1lYW5zIHRoZSBjb3B5cmlnaHRhYmxlIHdvcmtzIGRpc3RyaWJ1dGVkIGJ5Ci1Hb29nbGUgYXMgcGFydCBvZiB0aGUgV2ViTSBQcm9qZWN0LgotCi1Hb29nbGUgaGVyZWJ5IGdyYW50cyB0byB5b3UgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwKLW5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pCi1wYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LAotdHJhbnNmZXIsIGFuZCBvdGhlcndpc2UgcnVuLCBtb2RpZnkgYW5kIHByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgdGhpcwotaW1wbGVtZW50YXRpb24gb2YgVlA4LCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudAotY2xhaW1zLCBib3RoIGN1cnJlbnRseSBvd25lZCBieSBHb29nbGUgYW5kIGFjcXVpcmVkIGluIHRoZSBmdXR1cmUsCi1saWNlbnNhYmxlIGJ5IEdvb2dsZSB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhpcwotaW1wbGVtZW50YXRpb24gb2YgVlA4LiBUaGlzIGdyYW50IGRvZXMgbm90IGluY2x1ZGUgY2xhaW1zIHRoYXQgd291bGQgYmUKLWluZnJpbmdlZCBvbmx5IGFzIGEgY29uc2VxdWVuY2Ugb2YgZnVydGhlciBtb2RpZmljYXRpb24gb2YgdGhpcwotaW1wbGVtZW50YXRpb24uIElmIHlvdSBvciB5b3VyIGFnZW50IG9yIGV4Y2x1c2l2ZSBsaWNlbnNlZSBpbnN0aXR1dGUgb3IKLW9yZGVyIG9yIGFncmVlIHRvIHRoZSBpbnN0aXR1dGlvbiBvZiBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueQotZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZwotdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIG9mIFZQOCBvciBhbnkgY29kZSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoaXMKLWltcGxlbWVudGF0aW9uIG9mIFZQOCBjb25zdGl0dXRlcyBkaXJlY3Qgb3IgY29udHJpYnV0b3J5IHBhdGVudAotaW5mcmluZ2VtZW50LCBvciBpbmR1Y2VtZW50IG9mIHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudAotcmlnaHRzIGdyYW50ZWQgdG8geW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBWUDgKLXNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNzNiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDkgQEAKK0FDTE9DQUxfQU1GTEFHUyA9IC1JIG00CitTVUJESVJTID0gc3JjIGltYWdlaW8gbWFuCitFWFRSQV9ESVNUID0gQ09QWUlORyBhdXRvZ2VuLnNoCisKK2lmIFdBTlRfRVhUUkFTCisgIFNVQkRJUlMgKz0gZXh0cmFzCitlbmRpZgorCitTVUJESVJTICs9IGV4YW1wbGVzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS52YyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL01ha2VmaWxlLnZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWJmODYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9NYWtlZmlsZS52YwpAQCAtMCwwICsxLDUxNyBAQAorIworIyBTdGVtIGZvciBzdGF0aWMgbGlicyBhbmQgRExMcworIworTElCV0VCUERFQ09ERVJfQkFTRU5BTUUgPSBsaWJ3ZWJwZGVjb2RlcgorTElCV0VCUF9CQVNFTkFNRSA9IGxpYndlYnAKK0xJQldFQlBNVVhfQkFTRU5BTUUgPSBsaWJ3ZWJwbXV4CitMSUJXRUJQREVNVVhfQkFTRU5BTUUgPSBsaWJ3ZWJwZGVtdXgKKworIUlGTkRFRiBBUkNICishSUYgISBbIGNsIDI+JjEgfCBmaW5kICJ4ODYiID4gTlVMIF0KK0FSQ0ggPSB4ODYKKyFFTFNFIElGICEgWyBjbCAyPiYxIHwgZmluZCAieDY0IiA+IE5VTCBdCitBUkNIID0geDY0CishRUxTRSBJRiAhIFsgY2wgMj4mMSB8IGZpbmQgIkFSTSIgPiBOVUwgXQorQVJDSCA9IEFSTQorIUVMU0UKKyFFUlJPUiBVbmFibGUgdG8gYXV0by1kZXRlY3QgdG9vbGNoYWluIGFyY2hpdGVjdHVyZSEgXAorSWYgY2wuZXhlIGlzIGluIHlvdXIgUEFUSCByZXJ1biBubWFrZSB3aXRoIEFSQ0g9PGFyY2g+LgorIUVORElGCishRU5ESUYKKworIUlGICIkKEFSQ0gpIiA9PSAieDg2IgorUExBVEZPUk1fTERGTEFHUyA9IC9TQUZFU0VICishRU5ESUYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMgTm90aGluZyBtb3JlIHRvIGRvIGJlbG93IHRoaXMgbGluZSEKKworTk9MT0dPICAgICA9IC9ub2xvZ28KK0NDTk9EQkcgICAgPSBjbC5leGUgJChOT0xPR08pIC9PMiAvRE5ERUJVRworQ0NERUJVRyAgICA9IGNsLmV4ZSAkKE5PTE9HTykgL09kIC9HbSAvWmkgL0RfREVCVUcgL1JUQzEKK0NGTEFHUyAgICAgPSAvSS4gL0lzcmMgJChOT0xPR08pIC9XMyAvRUhzYyAvYworQ0ZMQUdTICAgICA9ICQoQ0ZMQUdTKSAvRFdJTjMyIC9EX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MgL0RXSU4zMl9MRUFOX0FORF9NRUFOCitMREZMQUdTICAgID0gL0xBUkdFQUREUkVTU0FXQVJFIC9NQU5JRkVTVCAvTlhDT01QQVQgL0RZTkFNSUNCQVNFCitMREZMQUdTICAgID0gJChMREZMQUdTKSAkKFBMQVRGT1JNX0xERkxBR1MpCitMTktETEwgICAgID0gbGluay5leGUgL0RMTCAkKE5PTE9HTykKK0xOS0VYRSAgICAgPSBsaW5rLmV4ZSAkKE5PTE9HTykKK0xOS0xJQiAgICAgPSBsaWIuZXhlICQoTk9MT0dPKQorTVQgICAgICAgICA9IG10LmV4ZSAkKE5PTE9HTykKK1JDTk9EQkcgICAgPSByYy5leGUgJChOT0xPR08pIC9sIjB4MDQwOSIgICMgMHg0MDkgPSBVLlMuIEVuZ2xpc2gKK1JDREVCVUcgICAgPSAkKFJDTk9EQkcpIC9EX0RFQlVHCisKKyFJRiAiJChBUkNIKSIgPT0gIkFSTSIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAvRFdJTkFQSV9GQU1JTFk9V0lOQVBJX0ZBTUlMWV9QSE9ORV9BUFAgL0RXRUJQX1VTRV9USFJFQUQKKyFFTFNFCitDRkxBR1MgPSAkKENGTEFHUykgL0RIQVZFX1dJTkNPREVDX0ggL0RXRUJQX1VTRV9USFJFQUQKKyFFTkRJRgorCitDRkdTRVQgICAgID0gRkFMU0UKKyFJRiAiJChPQkpESVIpIiA9PSAiIgorT1VURElSID0gLi5cb2JqXAorIUVMU0UKK09VVERJUiA9ICQoT0JKRElSKQorIUVORElGCisKKyFJRiAiJChIQVZFX0FWWDIpIiA9PSAiMSIKK0NGTEFHUyA9ICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9BVlgyCitBVlgyX0ZMQUdTID0gL2FyY2g6QVZYMgorIUVORElGCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJ1bnRpbWUgbGlicmFyeSBjb25maWd1cmF0aW9uCishSUYgIiQoUlRMSUJDRkcpIiA9PSAic3RhdGljIgorUlRMSUIgID0gL01UCitSVExJQkQgPSAvTVRkCishRUxTRSBJRiAiJChSVExJQkNGRykiID09ICJsZWdhY3kiCitSVExJQkNGRyA9IHN0YXRpYworUlRMSUIgID0gL01UCitSVExJQkQgPSAvTVRkCitDRkxBR1MgPSAkKENGTEFHUykgL0dTLSAvYXJjaDpJQTMyCishRUxTRQorUlRMSUIgICA9IC9NRAorUlRMSUJEICA9IC9NRGQKKyFFTkRJRgorRElSQkFTRSA9ICQoT1VURElSKVwkKENGRylcJChBUkNIKQorRElST0JKID0gJChESVJCQVNFKVxvYmoKK0RJUkxJQiA9ICQoRElSQkFTRSlcbGliCitESVJJTkMgPSAkKERJUkJBU0UpXGluY2x1ZGUKK0RJUkJJTiA9ICQoRElSQkFTRSlcYmluCitMSUJXRUJQX1BEQk5BTUUgPSAkKERJUk9CSilcJChMSUJXRUJQX0JBU0VOQU1FKS5wZGIKK09VVFBVVF9ESVJTID0gJChESVJCSU4pICQoRElSSU5DKSAkKERJUkxJQikgXAorICAgICAgICAgICAgICAkKERJUk9CSilcZGVjIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGRlbXV4IFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGRzcCBcCisgICAgICAgICAgICAgICQoRElST0JKKVxlbmMgXAorICAgICAgICAgICAgICAkKERJUk9CSilcZXhhbXBsZXMgXAorICAgICAgICAgICAgICAkKERJUk9CSilcZXh0cmFzIFwKKyAgICAgICAgICAgICAgJChESVJPQkopXGltYWdlaW8gXAorICAgICAgICAgICAgICAkKERJUk9CSilcbXV4IFwKKyAgICAgICAgICAgICAgJChESVJPQkopXHV0aWxzIFwKKworIyBUYXJnZXQgY29uZmlndXJhdGlvbgorIUlGICIkKENGRykiID09ICJyZWxlYXNlLXN0YXRpYyIKK0NDICAgICAgICAgICAgID0gJChDQ05PREJHKQorU1RBVElDTElCQlVJTEQgPSBUUlVFCishRUxTRSBJRiAiJChDRkcpIiA9PSAiZGVidWctc3RhdGljIgorQ0MgICAgICAgICAgICAgPSAkKENDREVCVUcpCitSVExJQiAgICAgICAgICA9ICQoUlRMSUJEKQorU1RBVElDTElCQlVJTEQgPSBUUlVFCitMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSA9ICQoTElCV0VCUERFQ09ERVJfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQX0JBU0VOQU1FID0gJChMSUJXRUJQX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUE1VWF9CQVNFTkFNRSA9ICQoTElCV0VCUE1VWF9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBERU1VWF9CQVNFTkFNRSA9ICQoTElCV0VCUERFTVVYX0JBU0VOQU1FKV9kZWJ1ZworIUVMU0UgSUYgIiQoQ0ZHKSIgPT0gInJlbGVhc2UtZHluYW1pYyIKK0NDICAgICAgICA9ICQoQ0NOT0RCRykKK1JDICAgICAgICA9ICQoUkNOT0RCRykKK0RMTEJVSUxEICA9IFRSVUUKKyFFTFNFIElGICIkKENGRykiID09ICJkZWJ1Zy1keW5hbWljIgorQ0MgICAgICAgID0gJChDQ0RFQlVHKQorUkMgICAgICAgID0gJChSQ0RFQlVHKQorUlRMSUIgICAgID0gJChSVExJQkQpCitETExCVUlMRCAgPSBUUlVFCitMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSA9ICQoTElCV0VCUERFQ09ERVJfQkFTRU5BTUUpX2RlYnVnCitMSUJXRUJQX0JBU0VOQU1FID0gJChMSUJXRUJQX0JBU0VOQU1FKV9kZWJ1ZworTElCV0VCUE1VWF9CQVNFTkFNRSA9ICQoTElCV0VCUE1VWF9CQVNFTkFNRSlfZGVidWcKK0xJQldFQlBERU1VWF9CQVNFTkFNRSA9ICQoTElCV0VCUERFTVVYX0JBU0VOQU1FKV9kZWJ1ZworIUVORElGCisKKyFJRiAiJChTVEFUSUNMSUJCVUlMRCkiID09ICJUUlVFIgorQ0MgICAgID0gJChDQykgJChSVExJQikKK0NGR1NFVCA9IFRSVUUKK0xJQldFQlBERUNPREVSID0gJChESVJMSUIpXCQoTElCV0VCUERFQ09ERVJfQkFTRU5BTUUpLmxpYgorTElCV0VCUCA9ICQoRElSTElCKVwkKExJQldFQlBfQkFTRU5BTUUpLmxpYgorTElCV0VCUE1VWCA9ICQoRElSTElCKVwkKExJQldFQlBNVVhfQkFTRU5BTUUpLmxpYgorTElCV0VCUERFTVVYID0gJChESVJMSUIpXCQoTElCV0VCUERFTVVYX0JBU0VOQU1FKS5saWIKKyFFTFNFIElGICIkKERMTEJVSUxEKSIgPT0gIlRSVUUiCitETExJTkMgPSB3ZWJwX2RsbC5oCitDQyAgICAgPSAkKENDKSAvSSQoRElST0JKKSAvRkkkKERMTElOQykgJChSVExJQikgL0RXRUJQX0RMTAorTElCV0VCUERFQ09ERVIgPSAkKERJUkxJQilcJChMSUJXRUJQREVDT0RFUl9CQVNFTkFNRSlfZGxsLmxpYgorTElCV0VCUCA9ICQoRElSTElCKVwkKExJQldFQlBfQkFTRU5BTUUpX2RsbC5saWIKK0xJQldFQlBNVVggPSAkKERJUkxJQilcJChMSUJXRUJQTVVYX0JBU0VOQU1FKV9kbGwubGliCitMSUJXRUJQREVNVVggPSAkKERJUkxJQilcJChMSUJXRUJQREVNVVhfQkFTRU5BTUUpX2RsbC5saWIKK0xJQldFQlBfUERCTkFNRSA9ICQoRElST0JKKVwkKExJQldFQlBfQkFTRU5BTUUpX2RsbC5wZGIKK0NGR1NFVCA9IFRSVUUKKyFFTkRJRgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBVc2FnZQorIworIUlGICIkKENGR1NFVCkiID09ICJGQUxTRSIKKyFNRVNTQUdFIFVzYWdlOiBubWFrZSAvZiBNYWtlZmlsZS52YyBbQ0ZHPTxjb25maWc+XQorIU1FU1NBR0UgLiAgICAgICAgICBbT0JKRElSPTxwYXRoPl0gW1JUTElCQ0ZHPTxydGxpYj5dIFs8dGFyZ2V0Pl0KKyFNRVNTQUdFCishTUVTU0FHRSB3aGVyZSA8Y29uZmlnPiBpcyBvbmUgb2Y6CishTUVTU0FHRSAtICByZWxlYXNlLXN0YXRpYyAgICAgICAgICAgICAgICAtIHJlbGVhc2Ugc3RhdGljIGxpYnJhcnkKKyFNRVNTQUdFIC0gIGRlYnVnLXN0YXRpYyAgICAgICAgICAgICAgICAgIC0gZGVidWcgc3RhdGljIGxpYnJhcnkKKyFNRVNTQUdFIC0gIHJlbGVhc2UtZHluYW1pYyAgICAgICAgICAgICAgIC0gcmVsZWFzZSBkeW5hbWljIGxpbmsgbGlicmFyeSAoRExMKQorIU1FU1NBR0UgLSAgZGVidWctZHluYW1pYyAgICAgICAgICAgICAgICAgLSBkZWJ1ZyBkeW5hbWljIGxpbmsgbGlicmFyeSAoRExMKQorIU1FU1NBR0UKKyFNRVNTQUdFIDx0YXJnZXQ+IG1heSBiZToKKyFNRVNTQUdFIC0gIGNsZWFuICAgICAgICAgICAgICAgICAgICAgICAgIC0gcGVyZm9ybSBhIGNsZWFuIGZvciBDRkcKKyFNRVNTQUdFIC0gIGV4cGVyaW1lbnRhbCAgICAgICAgICAgICAgICAgIC0gYnVpbGQgQ0ZHIHdpdGggZXhwZXJpbWVudGFsCishTUVTU0FHRSAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzIGVuYWJsZWQuCishTUVTU0FHRSAtIChlbXB0eSkgICAgICAgICAgICAgICAgICAgICAgICAtIGJ1aWxkIGxpYndlYnAtYmFzZWQgdGFyZ2V0cyBmb3IgQ0ZHCishTUVTU0FHRSAtIGFsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGJ1aWxkIChkZSltdXgtYmFzZWQgdGFyZ2V0cyBmb3IgQ0ZHCishTUVTU0FHRSAtIGdpZjJ3ZWJwICAgICAgICAgICAgICAgICAgICAgICAtIHJlcXVpcmVzIGxpYmdpZiAmID49IFZTMjAxMworIU1FU1NBR0UgLSBhbmltX2RpZmYgICAgICAgICAgICAgICAgICAgICAgLSByZXF1aXJlcyBsaWJnaWYgJiA+PSBWUzIwMTMKKyFNRVNTQUdFIC0gYW5pbV9kdW1wCishTUVTU0FHRQorIU1FU1NBR0UgUlRMSUJDRkcgY29udHJvbHMgdGhlIHJ1bnRpbWUgbGlicmFyeSBsaW5rYWdlIC0gJ3N0YXRpYycgb3IgJ2R5bmFtaWMnLgorIU1FU1NBR0UgICAnbGVnYWN5JyB3aWxsIHByb2R1Y2UgYSBXaW5kb3dzIDIwMDAgY29tcGF0aWJsZSBsaWJyYXJ5LgorIU1FU1NBR0UgT0JKRElSIGlzIHRoZSBwYXRoIHdoZXJlIHlvdSBsaWtlIHRvIGJ1aWxkIChvYmosIGJpbnMsIGV0Yy4pLAorIU1FU1NBR0UgICBkZWZhdWx0cyB0byAuLlxvYmoKKworIUlGICIkKENGRykiICE9ICIiCishTUVTU0FHRQorIUVSUk9SIHBsZWFzZSBjaG9vc2UgYSB2YWxpZCBjb25maWd1cmF0aW9uIGluc3RlYWQgb2YgIiQoQ0ZHKSIKKyFFTkRJRgorIUVORElGCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJ1bGVzCisjCishSUYgIiQoQ0ZHU0VUKSIgPT0gIlRSVUUiCisjIEEgY29uZmlnIHdhcyBwcm92aWRlZCwgc28gdGhlIGxpYnJhcnkgY2FuIGJlIGJ1aWx0LgorIworCitERUNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZGVjXGFscGhhX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcYnVmZmVyX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcZnJhbWVfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1xpZGVjX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcaW9fZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1xxdWFudF9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcZGVjXHRyZWVfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1x2cDhfZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRlY1x2cDhsX2RlYy5vYmogXAorICAgICQoRElST0JKKVxkZWNcd2VicF9kZWMub2JqIFwKKworREVNVVhfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZGVtdXhcYW5pbV9kZWNvZGUub2JqIFwKKyAgICAkKERJUk9CSilcZGVtdXhcZGVtdXgub2JqIFwKKworRFNQX0RFQ19PQkpTID0gXAorICAgICQoRElST0JKKVxkc3BcYWxwaGFfcHJvY2Vzc2luZy5vYmogXAorICAgICQoRElST0JKKVxkc3BcYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcYWxwaGFfcHJvY2Vzc2luZ19uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxhbHBoYV9wcm9jZXNzaW5nX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGFscGhhX3Byb2Nlc3Npbmdfc3NlNDEub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGNwdS5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfY2xpcF90YWJsZXMub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcZGVjX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGRlY19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxkZWNfc3NlNDEub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGZpbHRlcnMub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGZpbHRlcnNfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGZpbHRlcnNfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxmaWx0ZXJzX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGZpbHRlcnNfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3Mub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlcl9taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxyZXNjYWxlcl9tc2Eub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHJlc2NhbGVyX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmcub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmdfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmdfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx1cHNhbXBsaW5nX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHVwc2FtcGxpbmdfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcdXBzYW1wbGluZ19zc2U0MS5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2Lm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXZfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXZfbWlwc19kc3BfcjIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXHl1dl9uZW9uLm9iaiBcCisgICAgJChESVJPQkopXGRzcFx5dXZfc3NlMi5vYmogXAorICAgICQoRElST0JKKVxkc3BceXV2X3NzZTQxLm9iaiBcCisKK0RTUF9FTkNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZHNwXGNvc3Qub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGNvc3RfbWlwczMyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxjb3N0X21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxjb3N0X3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuYy5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX2F2eDIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19taXBzMzIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19taXBzX2RzcF9yMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX21zYS5vYmogXAorICAgICQoRElST0JKKVxkc3BcZW5jX25lb24ub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGVuY19zc2UyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxlbmNfc3NlNDEub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuYy5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX21pcHMzMi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfbXNhLm9iaiBcCisgICAgJChESVJPQkopXGRzcFxsb3NzbGVzc19lbmNfbmVvbi5vYmogXAorICAgICQoRElST0JKKVxkc3BcbG9zc2xlc3NfZW5jX3NzZTIub2JqIFwKKyAgICAkKERJUk9CSilcZHNwXGxvc3NsZXNzX2VuY19zc2U0MS5vYmogXAorICAgICQoRElST0JKKVxkc3Bcc3NpbS5vYmogXAorICAgICQoRElST0JKKVxkc3Bcc3NpbV9zc2UyLm9iaiBcCisKK0VYX0FOSU1fVVRJTF9PQkpTID0gXAorICAgICQoRElST0JKKVxleGFtcGxlc1xhbmltX3V0aWwub2JqIFwKKworSU1BR0VJT19ERUNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xpbWFnZV9kZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xqcGVnZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9cbWV0YWRhdGEub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xwbmdkZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1xwbm1kZWMub2JqIFwKKyAgICAkKERJUk9CSilcaW1hZ2Vpb1x0aWZmZGVjLm9iaiBcCisgICAgJChESVJPQkopXGltYWdlaW9cd2VicGRlYy5vYmogXAorICAgICQoRElST0JKKVxpbWFnZWlvXHdpY2RlYy5vYmogXAorCitJTUFHRUlPX0VOQ19PQkpTID0gXAorICAgICQoRElST0JKKVxpbWFnZWlvXGltYWdlX2VuYy5vYmogXAorCitFWF9HSUZfREVDX09CSlMgPSBcCisgICAgJChESVJPQkopXGV4YW1wbGVzXGdpZmRlYy5vYmogXAorCitFWF9VVElMX09CSlMgPSBcCisgICAgJChESVJPQkopXGV4YW1wbGVzXGV4YW1wbGVfdXRpbC5vYmogXAorCitFTkNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcZW5jXGFscGhhX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcYW5hbHlzaXNfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xiYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcY29uZmlnX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcY29zdF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGZpbHRlcl9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXGZyYW1lX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcaGlzdG9ncmFtX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcaXRlcmF0b3JfZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1xuZWFyX2xvc3NsZXNzX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccGljdHVyZV9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHBpY3R1cmVfY3NwX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccGljdHVyZV9wc25yX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccGljdHVyZV9yZXNjYWxlX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNccGljdHVyZV90b29sc19lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHByZWRpY3Rvcl9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHF1YW50X2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcc3ludGF4X2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcdG9rZW5fZW5jLm9iaiBcCisgICAgJChESVJPQkopXGVuY1x0cmVlX2VuYy5vYmogXAorICAgICQoRElST0JKKVxlbmNcdnA4bF9lbmMub2JqIFwKKyAgICAkKERJUk9CSilcZW5jXHdlYnBfZW5jLm9iaiBcCisKK0VYVFJBU19PQkpTID0gXAorICAgICQoRElST0JKKVxleHRyYXNcZXh0cmFzLm9iaiBcCisgICAgJChESVJPQkopXGV4dHJhc1xxdWFsaXR5X2VzdGltYXRlLm9iaiBcCisKK0lNQUdFSU9fVVRJTF9PQkpTID0gXAorICAgICQoRElST0JKKVxpbWFnZWlvXGltYWdlaW9fdXRpbC5vYmogXAorCitNVVhfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcbXV4XGFuaW1fZW5jb2RlLm9iaiBcCisgICAgJChESVJPQkopXG11eFxtdXhlZGl0Lm9iaiBcCisgICAgJChESVJPQkopXG11eFxtdXhpbnRlcm5hbC5vYmogXAorICAgICQoRElST0JKKVxtdXhcbXV4cmVhZC5vYmogXAorCitVVElMU19ERUNfT0JKUyA9IFwKKyAgICAkKERJUk9CSilcdXRpbHNcYml0X3JlYWRlcl91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xjb2xvcl9jYWNoZV91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xmaWx0ZXJzX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXGh1ZmZtYW5fdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNccXVhbnRfbGV2ZWxzX2RlY191dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xyZXNjYWxlcl91dGlscy5vYmogXAorICAgICQoRElST0JKKVx1dGlsc1xyYW5kb21fdXRpbHMub2JqIFwKKyAgICAkKERJUk9CSilcdXRpbHNcdGhyZWFkX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHV0aWxzLm9iaiBcCisKK1VUSUxTX0VOQ19PQkpTID0gXAorICAgICQoRElST0JKKVx1dGlsc1xiaXRfd3JpdGVyX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXGh1ZmZtYW5fZW5jb2RlX3V0aWxzLm9iaiBcCisgICAgJChESVJPQkopXHV0aWxzXHF1YW50X2xldmVsc191dGlscy5vYmogXAorCitMSUJXRUJQREVDT0RFUl9PQkpTID0gJChERUNfT0JKUykgJChEU1BfREVDX09CSlMpICQoVVRJTFNfREVDX09CSlMpCitMSUJXRUJQX09CSlMgPSAkKExJQldFQlBERUNPREVSX09CSlMpICQoRU5DX09CSlMpICQoRFNQX0VOQ19PQkpTKSBcCisgICAgICAgICAgICAgICAkKFVUSUxTX0VOQ19PQkpTKSAkKERMTF9PQkpTKQorTElCV0VCUE1VWF9PQkpTID0gJChNVVhfT0JKUykgJChMSUJXRUJQTVVYX09CSlMpCitMSUJXRUJQREVNVVhfT0JKUyA9ICQoREVNVVhfT0JKUykgJChMSUJXRUJQREVNVVhfT0JKUykKKworT1VUX0xJQlMgPSAkKExJQldFQlBERUNPREVSKSAkKExJQldFQlApCishSUYgIiQoQVJDSCkiID09ICJBUk0iCitleDogJChPVVRfTElCUykKK2FsbDogZXgKKyFFTFNFCitPVVRfRVhBTVBMRVMgPSAkKERJUkJJTilcY3dlYnAuZXhlICQoRElSQklOKVxkd2VicC5leGUKK0VYVFJBX0VYQU1QTEVTID0gJChESVJCSU4pXHZ3ZWJwLmV4ZSAkKERJUkJJTilcd2VicG11eC5leGUgXAorICAgICAgICAgICAgICAgICAkKERJUkJJTilcaW1nMndlYnAuZXhlICQoRElSQklOKVxnZXRfZGlzdG8uZXhlIFwKKyAgICAgICAgICAgICAgICAgJChESVJCSU4pXHdlYnBfcXVhbGl0eS5leGUgJChESVJCSU4pXHZ3ZWJwX3NkbC5leGUgXAorICAgICAgICAgICAgICAgICAkKERJUkJJTilcd2VicGluZm8uZXhlCisKK2V4OiAkKE9VVF9MSUJTKSAkKE9VVF9FWEFNUExFUykKK2FsbDogZXggJChFWFRSQV9FWEFNUExFUykKKyMgTkI6IGdpZjJ3ZWJwLmV4ZSBhbmQgYW5pbV9kaWZmLmV4ZSBhcmUgZXhjbHVkZWQgZnJvbSAnYWxsJyBhcyBsaWJnaWYgcmVxdWlyZXMKKyMgQzk5IHN1cHBvcnQgd2hpY2ggaXMgb25seSBhdmFpbGFibGUgZnJvbSBWUzIwMTMgb253YXJkLgorZ2lmMndlYnA6ICQoRElSQklOKVxnaWYyd2VicC5leGUKK2FuaW1fZGlmZjogJChESVJCSU4pXGFuaW1fZGlmZi5leGUKK2FuaW1fZHVtcDogJChESVJCSU4pXGFuaW1fZHVtcC5leGUKKworJChESVJCSU4pXGFuaW1fZGlmZi5leGU6ICQoRElST0JKKVxleGFtcGxlc1xhbmltX2RpZmYub2JqICQoRVhfQU5JTV9VVElMX09CSlMpCiskKERJUkJJTilcYW5pbV9kaWZmLmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcYW5pbV9kaWZmLmV4ZTogJChFWF9HSUZfREVDX09CSlMpICQoTElCV0VCUERFTVVYKSAkKExJQldFQlApCiskKERJUkJJTilcYW5pbV9kdW1wLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGFuaW1fZHVtcC5vYmogJChFWF9BTklNX1VUSUxfT0JKUykKKyQoRElSQklOKVxhbmltX2R1bXAuZXhlOiAkKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxhbmltX2R1bXAuZXhlOiAkKEVYX0dJRl9ERUNfT0JKUykgJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKyQoRElSQklOKVxhbmltX2R1bXAuZXhlOiAkKElNQUdFSU9fRU5DX09CSlMpCiskKERJUkJJTilcY3dlYnAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcY3dlYnAub2JqICQoSU1BR0VJT19ERUNfT0JKUykKKyQoRElSQklOKVxjd2VicC5leGU6ICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcY3dlYnAuZXhlOiAkKExJQldFQlBERU1VWCkKKyQoRElSQklOKVxkd2VicC5leGU6ICQoRElST0JKKVxleGFtcGxlc1xkd2VicC5vYmogJChJTUFHRUlPX0RFQ19PQkpTKQorJChESVJCSU4pXGR3ZWJwLmV4ZTogJChJTUFHRUlPX0VOQ19PQkpTKQorJChESVJCSU4pXGR3ZWJwLmV4ZTogJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxkd2VicC5leGU6ICQoTElCV0VCUERFTVVYKQorJChESVJCSU4pXGdpZjJ3ZWJwLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXGdpZjJ3ZWJwLm9iaiAkKEVYX0dJRl9ERUNfT0JKUykKKyQoRElSQklOKVxnaWYyd2VicC5leGU6ICQoRVhfVVRJTF9PQkpTKSAkKElNQUdFSU9fVVRJTF9PQkpTKSAkKExJQldFQlBNVVgpCiskKERJUkJJTilcZ2lmMndlYnAuZXhlOiAkKExJQldFQlApCiskKERJUkJJTilcdndlYnAuZXhlOiAkKERJUk9CSilcZXhhbXBsZXNcdndlYnAub2JqICQoRVhfVVRJTF9PQkpTKQorJChESVJCSU4pXHZ3ZWJwLmV4ZTogJChJTUFHRUlPX1VUSUxfT0JKUykgJChMSUJXRUJQREVNVVgpICQoTElCV0VCUCkKKyQoRElSQklOKVx2d2VicF9zZGwuZXhlOiAkKERJUk9CSilcZXh0cmFzXHZ3ZWJwX3NkbC5vYmoKKyQoRElSQklOKVx2d2VicF9zZGwuZXhlOiAkKERJUk9CSilcZXh0cmFzXHdlYnBfdG9fc2RsLm9iagorJChESVJCSU4pXHZ3ZWJwX3NkbC5leGU6ICQoSU1BR0VJT19VVElMX09CSlMpICQoTElCV0VCUCkKKyQoRElSQklOKVx3ZWJwbXV4LmV4ZTogJChESVJPQkopXGV4YW1wbGVzXHdlYnBtdXgub2JqICQoTElCV0VCUE1VWCkKKyQoRElSQklOKVx3ZWJwbXV4LmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpICQoTElCV0VCUCkKKyQoRElSQklOKVxpbWcyd2VicC5leGU6ICQoRElST0JKKVxleGFtcGxlc1xpbWcyd2VicC5vYmogJChMSUJXRUJQTVVYKQorJChESVJCSU4pXGltZzJ3ZWJwLmV4ZTogJChJTUFHRUlPX0RFQ19PQkpTKQorJChESVJCSU4pXGltZzJ3ZWJwLmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcaW1nMndlYnAuZXhlOiAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorJChESVJCSU4pXGdldF9kaXN0by5leGU6ICQoRElST0JKKVxleHRyYXNcZ2V0X2Rpc3RvLm9iagorJChESVJCSU4pXGdldF9kaXN0by5leGU6ICQoSU1BR0VJT19ERUNfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUykKKyQoRElSQklOKVxnZXRfZGlzdG8uZXhlOiAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorJChESVJCSU4pXHdlYnBfcXVhbGl0eS5leGU6ICQoRElST0JKKVxleHRyYXNcd2VicF9xdWFsaXR5Lm9iagorJChESVJCSU4pXHdlYnBfcXVhbGl0eS5leGU6ICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcd2VicF9xdWFsaXR5LmV4ZTogJChFWFRSQVNfT0JKUykgJChMSUJXRUJQKQorJChESVJCSU4pXHdlYnBpbmZvLmV4ZTogJChESVJPQkopXGV4YW1wbGVzXHdlYnBpbmZvLm9iagorJChESVJCSU4pXHdlYnBpbmZvLmV4ZTogJChJTUFHRUlPX0RFQ19PQkpTKQorJChESVJCSU4pXHdlYnBpbmZvLmV4ZTogJChFWF9VVElMX09CSlMpICQoSU1BR0VJT19VVElMX09CSlMpCiskKERJUkJJTilcd2VicGluZm8uZXhlOiAkKExJQldFQlBERU1VWCkgJChMSUJXRUJQKQorCiskKE9VVF9FWEFNUExFUyk6ICQoRVhfVVRJTF9PQkpTKSAkKExJQldFQlApCiskKEVYX1VUSUxfT0JKUykgJChJTUFHRUlPX1VUSUxfT0JKUyk6ICQoT1VUUFVUX0RJUlMpCiskKElNQUdFSU9fREVDX09CSlMpICQoSU1BR0VJT19FTkNfT0JKUykgJChFWFRSQVNfT0JKUyk6ICQoT1VUUFVUX0RJUlMpCishRU5ESUYgICMgQVJDSCA9PSBBUk0KKworJChMSUJXRUJQREVDT0RFUik6ICQoTElCV0VCUERFQ09ERVJfT0JKUykKKyQoTElCV0VCUCk6ICQoTElCV0VCUF9PQkpTKQorJChMSUJXRUJQTVVYKTogJChMSUJXRUJQTVVYX09CSlMpCiskKExJQldFQlBERU1VWCk6ICQoTElCV0VCUERFTVVYX09CSlMpCisKKyQoTElCV0VCUF9PQkpTKSAkKExJQldFQlBNVVhfT0JKUykgJChMSUJXRUJQREVNVVhfT0JKUyk6ICQoT1VUUFVUX0RJUlMpCisKKyFJRiAiJChETExCVUlMRCkiID09ICJUUlVFIgorJChMSUJXRUJQX09CSlMpICQoTElCV0VCUE1VWF9PQkpTKSAkKExJQldFQlBERU1VWF9PQkpTKTogXAorICAgICQoRElST0JKKVwkKERMTElOQykKKworeyQoRElST0JKKX0uY3skKERJUk9CSil9Lm9iajoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyRAICAkPAorCit7c3JjfS5yY3skKERJUk9CSil9LnJlczoKKwkkKFJDKSAvZm8kQCAkPAore3NyY1xkZW11eH0ucmN7JChESVJPQkopXGRlbXV4fS5yZXM6CisJJChSQykgL2ZvJEAgJDwKK3tzcmNcbXV4fS5yY3skKERJUk9CSilcbXV4fS5yZXM6CisJJChSQykgL2ZvJEAgJDwKKworJChMSUJXRUJQKTogJChESVJPQkopXCQoTElCV0VCUF9CQVNFTkFNRTpfZGVidWc9KS5yZXMKKyQoTElCV0VCUERFQ09ERVIpOiAkKERJUk9CSilcJChMSUJXRUJQREVDT0RFUl9CQVNFTkFNRTpfZGVidWc9KS5yZXMKKyQoTElCV0VCUE1VWCk6ICQoTElCV0VCUCkgJChESVJPQkopXG11eFwkKExJQldFQlBNVVhfQkFTRU5BTUU6X2RlYnVnPSkucmVzCiskKExJQldFQlBERU1VWCk6ICQoTElCV0VCUCkgJChESVJPQkopXGRlbXV4XCQoTElCV0VCUERFTVVYX0JBU0VOQU1FOl9kZWJ1Zz0pLnJlcworCiskKExJQldFQlBERUNPREVSKSAkKExJQldFQlApICQoTElCV0VCUE1VWCkgJChMSUJXRUJQREVNVVgpOgorCSQoTE5LRExMKSAvb3V0OiQoRElSQklOKVwkKEBCOl9kbGw9LmRsbCkgL2ltcGxpYjokQCAkKExGTEFHUykgJCoqCisJLXhjb3B5ICQoRElST0JKKVwqLnBkYiAkKERJUkxJQikgL3kKKworY2xlYW46OgorCUAtZXJhc2UgL3MgJChESVJPQkopXCQoRExMSU5DKSAyPiBOVUwKKyFFTFNFCiskKExJQldFQlBERUNPREVSKSAkKExJQldFQlApICQoTElCV0VCUE1VWCkgJChMSUJXRUJQREVNVVgpOgorCSQoTE5LTElCKSAvb3V0OiRAICQqKgorCS14Y29weSAkKERJUk9CSilcKi5wZGIgJChESVJMSUIpIC95CishRU5ESUYKKworJChPVVRQVVRfRElSUyk6CisJQGlmIG5vdCBleGlzdCAiJChAKSIgbWtkaXIgIiQoQCkiCisKKyMgZ2VuZXJhdGUgYSBoZWxwZXIgaW5jbHVkZSB0byBkZWZpbmUgV0VCUF9FWFRFUk4gc3VpdGFibGUgZm9yIHRoZSBETEwgYnVpbGQKKyQoRElST0JKKVwkKERMTElOQyk6CisJQGVjaG8gI2lmbmRlZiBXRUJQX0RMTF9IXyA+ICRACisJQGVjaG8gI2RlZmluZSBXRUJQX0RMTF9IXyA+PiAkQAorCUBlY2hvICNkZWZpbmUgV0VCUF9FWFRFUk4gX19kZWNsc3BlYyhkbGxleHBvcnQpID4+ICRACisJQGVjaG8gI2VuZGlmICAvKiBXRUJQX0RMTF9IXyAqLyA+PiAkQAorCisuU1VGRklYRVM6IC5jIC5vYmogLnJlcyAuZXhlCisjIEZpbGUtc3BlY2lmaWMgZmxhZyBidWlsZHMuIE5vdGUgYmF0Y2ggcnVsZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgd2lsZGNhcmRzLAorIyBzbyBmb3Igbm93IG5hbWUgZWFjaCBmaWxlIGluZGl2aWR1YWxseS4KKyQoRElST0JKKVxkc3BcZW5jX2F2eDIub2JqOiBzcmNcZHNwXGVuY19hdngyLmMKKwkkKENDKSAkKENGTEFHUykgJChBVlgyX0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXGRzcFwgXAorCSAgc3JjXGRzcFwkKEBCKS5jCiskKERJUk9CSilcZXhhbXBsZXNcYW5pbV9kaWZmLm9iajogZXhhbXBsZXNcYW5pbV9kaWZmLmMKKwkkKENDKSAkKENGTEFHUykgL0RXRUJQX0hBVkVfR0lGIC9GZCQoTElCV0VCUF9QREJOQU1FKSBcCisJICAvRm8kKERJUk9CSilcZXhhbXBsZXNcIGV4YW1wbGVzXCQoQEIpLmMKKyQoRElST0JKKVxleGFtcGxlc1xhbmltX2R1bXAub2JqOiBleGFtcGxlc1xhbmltX2R1bXAuYworCSQoQ0MpICQoQ0ZMQUdTKSAvRFdFQlBfSEFWRV9HSUYgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIFwKKwkgIC9GbyQoRElST0JKKVxleGFtcGxlc1wgZXhhbXBsZXNcJChAQikuYworJChESVJPQkopXGV4YW1wbGVzXGFuaW1fdXRpbC5vYmo6IGV4YW1wbGVzXGFuaW1fdXRpbC5jCisJJChDQykgJChDRkxBR1MpIC9EV0VCUF9IQVZFX0dJRiAvRmQkKExJQldFQlBfUERCTkFNRSkgXAorCSAgL0ZvJChESVJPQkopXGV4YW1wbGVzXCBleGFtcGxlc1wkKEBCKS5jCiskKERJUk9CSilcZXhhbXBsZXNcZ2lmMndlYnAub2JqOiBleGFtcGxlc1xnaWYyd2VicC5jCisJJChDQykgJChDRkxBR1MpIC9EV0VCUF9IQVZFX0dJRiAvRmQkKExJQldFQlBfUERCTkFNRSkgXAorCSAgL0ZvJChESVJPQkopXGV4YW1wbGVzXCBleGFtcGxlc1wkKEBCKS5jCiskKERJUk9CSilcZXhhbXBsZXNcZ2lmZGVjLm9iajogZXhhbXBsZXNcZ2lmZGVjLmMKKwkkKENDKSAkKENGTEFHUykgL0RXRUJQX0hBVkVfR0lGIC9GZCQoTElCV0VCUF9QREJOQU1FKSBcCisJICAvRm8kKERJUk9CSilcZXhhbXBsZXNcIGV4YW1wbGVzXCQoQEIpLmMKKyMgQmF0Y2ggcnVsZXMKK3tleGFtcGxlc30uY3skKERJUk9CSilcZXhhbXBsZXN9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoRElST0JKKVxleGFtcGxlc1wgL0ZvJChESVJPQkopXGV4YW1wbGVzXCAkPAore2V4dHJhc30uY3skKERJUk9CSilcZXh0cmFzfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKERJUk9CSilcZXh0cmFzXCAvRm8kKERJUk9CSilcZXh0cmFzXCAkPAore2ltYWdlaW99LmN7JChESVJPQkopXGltYWdlaW99Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoRElST0JKKVxpbWFnZWlvXCAvRm8kKERJUk9CSilcaW1hZ2Vpb1wgJDwKK3tzcmNcZGVjfS5jeyQoRElST0JKKVxkZWN9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcZGVjXCAkPAore3NyY1xkZW11eH0uY3skKERJUk9CSilcZGVtdXh9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcZGVtdXhcICQ8Cit7c3JjXGRzcH0uY3skKERJUk9CSilcZHNwfS5vYmo6OgorCSQoQ0MpICQoQ0ZMQUdTKSAvRmQkKExJQldFQlBfUERCTkFNRSkgL0ZvJChESVJPQkopXGRzcFwgJDwKK3tzcmNcZW5jfS5jeyQoRElST0JKKVxlbmN9Lm9iajo6CisJJChDQykgJChDRkxBR1MpIC9GZCQoTElCV0VCUF9QREJOQU1FKSAvRm8kKERJUk9CSilcZW5jXCAkPAore3NyY1xtdXh9LmN7JChESVJPQkopXG11eH0ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVxtdXhcICQ8Cit7c3JjXHV0aWxzfS5jeyQoRElST0JKKVx1dGlsc30ub2JqOjoKKwkkKENDKSAkKENGTEFHUykgL0ZkJChMSUJXRUJQX1BEQk5BTUUpIC9GbyQoRElST0JKKVx1dGlsc1wgJDwKKworeyQoRElST0JKKVxleGFtcGxlc30ub2JqeyQoRElSQklOKX0uZXhlOgorCSQoTE5LRVhFKSAkKExERkxBR1MpIC9PVVQ6JEAgJCoqIFwKKwkgICAgb2xlMzIubGliIHdpbmRvd3Njb2RlY3MubGliIHNobHdhcGkubGliCisJJChNVCkgLW1hbmlmZXN0ICRALm1hbmlmZXN0IC1vdXRwdXRyZXNvdXJjZTokQDsxCisJZGVsICRALm1hbmlmZXN0CisKK3skKERJUk9CSilcZXh0cmFzfS5vYmp7JChESVJCSU4pfS5leGU6CisJJChMTktFWEUpICQoTERGTEFHUykgL09VVDokQCAkKiogXAorCSAgICBvbGUzMi5saWIgd2luZG93c2NvZGVjcy5saWIgc2hsd2FwaS5saWIKKwkkKE1UKSAtbWFuaWZlc3QgJEAubWFuaWZlc3QgLW91dHB1dHJlc291cmNlOiRAOzEKKwlkZWwgJEAubWFuaWZlc3QKKworY2xlYW46OgorCUAtZXJhc2UgL3MgJChESVJPQkopXCouZGxsIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCouZXhwIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCouaWRiIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCoubGliIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCoub2JqIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCoucGNoIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCoucGRiIDI+IE5VTAorCUAtZXJhc2UgL3MgJChESVJPQkopXCoucmVzIDI+IE5VTAorCishRU5ESUYgICMgRW5kIG9mIGNhc2Ugd2hlcmUgYSBjb25maWcgd2FzIHByb3ZpZGVkLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvTkVXUyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL05FV1MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgwY2I3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL05FV1MKQEAgLTAsMCArMSwxOTkgQEAKKy0gNC8yLzIwMTg6IHZlcnNpb24gMS4wLjAKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogbG9zc3kgZW5jb2RlciBpbXByb3ZlbWVudHMgdG8gYXZvaWQgY2hyb21hIHNoaWZ0cyBpbiB2YXJpb3VzIGNpcmN1bXN0YW5jZXMKKyAgICAoaXNzdWVzICMzMDgsICMzNDApCisgICogYmlnLWVuZGlhbiBmaXhlcyBmb3IgZGVjb2RlLCBSR0JBIGltcG9ydCBhbmQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uCisgIFRvb2wgdXBkYXRlczoKKyAgICBnaWZ3ZWJwLCBhbmltX2RpZmYgLSBkZWZhdWx0IGR1cmF0aW9uIGJlaGF2aW9yICg8PSAxMG1zKSBjaGFuZ2VkIHRvIG1hdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgd2ViIGJyb3dzZXJzLCB0cmFuc2NvZGluZyB0b29scyAoaXNzdWUgIzM3OSkKKyAgICBpbWcyd2VicCwgd2VicG11eCAtIGFsbG93IG9wdGlvbnMgdG8gYmUgcGFzc2VkIGluIHZpYSBhIGZpbGUgKGlzc3VlICMzNTUpCisKKy0gMTEvMjQvMjAxNzogdmVyc2lvbiAwLjYuMQorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBsb3NzbGVzcyBwZXJmb3JtYW5jZSBhbmQgY29tcHJlc3Npb24gaW1wcm92ZW1lbnRzICsgYSBuZXcgJ2NydW5jaGVyJyBtb2RlCisgICAgKC1tIDYgLXEgMTAwKQorICAqIEFSTSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgd2l0aCBjbGFuZyAoMTUtMjAlIHcvbmRrIHIxNWMsIGlzc3VlICMzMzkpCisgICogd2VicC1qczogZW1zY3JpcHRlbi93ZWJhc3NlbWJseSBiYXNlZCBqYXZhc2NyaXB0IGRlY29kZXIKKyAgKiBtaXNjZWxsYW5lb3VzIGJ1ZyAmIGJ1aWxkIGZpeGVzIChpc3N1ZSAjMzI5LCAjMzMyLCAjMzQzLCAjMzUzLCAjMzYwLCAjMzYxLAorICAgICMzNjMpCisgIFRvb2wgdXBkYXRlcyAvIGFkZGl0aW9uczoKKyAgICBhZGRlZCB3ZWJwaW5mbyAtIHByaW50cyBmaWxlIGZvcm1hdCBpbmZvcm1hdGlvbiAoaXNzdWUgIzMzMCkKKyAgICBnaWYyd2VicCAtIGxvb3AgYmVoYXZpb3IgbW9kaWZpZWQgdG8gbWF0Y2ggQ2hyb21lIE02MysgKGNyYnVnLmNvbS82NDkyNjQpOworICAgICAgICAgICAgICAgJy1sb29wX2NvbXBhdGliaWxpdHknIGNhbiBiZSB1c2VkIGZvciB0aGUgb2xkIGJlaGF2aW9yCisKKy0gMS8yNi8yMDE3OiB2ZXJzaW9uIDAuNi4wCisgICogbG9zc2xlc3MgcGVyZm9ybWFuY2UgYW5kIGNvbXByZXNzaW9uIGltcHJvdmVtZW50cworICAqIG1pc2NlbGxhbmVvdXMgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIChTU0UyLCBORU9OLCBNU0EpCisgICogd2VicG11eCBnYWluZWQgYSAtZHVyYXRpb24gb3B0aW9uIGFsbG93aW5nIGZvciBmcmFtZSB0aW1pbmcgbW9kaWZpY2F0aW9uCisgICogbmV3IGltZzJ3ZWJwIHV0aWxpdHkgYWxsb3dpbmcgYSBzZXF1ZW5jZSBvZiBpbWFnZXMgdG8gYmUgY29udmVydGVkIHRvCisgICAgYW5pbWF0ZWQgd2VicAorICAqIEFQSSBjaGFuZ2VzOgorICAgIC0gbGlid2VicDoKKyAgICAgIFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBCisgICAgICBXZWJQUGxhbmVEaXN0b3J0aW9uCisgICAgLSBsaWJ3ZWJwbXV4IC8gZ2lmMndlYnA6CisgICAgICBXZWJQQW5pbUVuY29kZXJPcHRpb25zOiBrbWF4IDw9IDAgbm93IGRpc2FibGVzIGtleWZyYW1lcywga21heCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZXMgYWxsIGtleWZyYW1lcy4gU2VlIG11eC5oIGFuZCB0aGUgZ2lmMndlYnAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnBhZ2UgZm9yIGRldGFpbHMuCisKKy0gMTIvMTMvMjAxNjogdmVyc2lvbiAwLjUuMgorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgVGhpcyByZWxlYXNlIGNvdmVycyBDVkUtMjAxNi04ODg4IGFuZCBDVkUtMjAxNi05MDg1LgorICAqIGZ1cnRoZXIgc2VjdXJpdHkgcmVsYXRlZCBoYXJkZW5pbmcgaW4gdGhlIHRvb2xzOyBmaXhlcyB0bworICAgIGdpZjJ3ZWJwL0FuaW1FbmNvZGVyIChpc3N1ZXMgIzMxMCwgIzMxNCwgIzMxNiwgIzMyMiksIGN3ZWJwL2xpYndlYnAgKGlzc3VlCisgICAgIzMxMikKKyAgKiBmdWxsIGxpYndlYnAgKGVuY29kZXIgJiBkZWNvZGVyKSBpT1MgZnJhbWV3b3JrOyBsaWJ3ZWJwZGVjb2RlcgorICAgIFdlYlAuZnJhbWV3b3JrIHJlbmFtZWQgdG8gV2ViUERlY29kZXIuZnJhbWV3b3JrIChpc3N1ZSAjMzA3KQorICAqIENNYWtlIHN1cHBvcnQgZm9yIEFuZHJvaWQgU3R1ZGlvICgyLjIpCisgICogbWlzY2VsbGFuZW91cyBidWlsZCByZWxhdGVkIGZpeGVzIChpc3N1ZSAjMzA2LCAjMzEzKQorICAqIG1pc2NlbGxhbmVvdXMgZG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgKGlzc3VlICMyMjUpCisgICogbWlub3IgbG9zc3kgZW5jb2RlciBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCisKKy0gNi8xNC8yMDE2OiB2ZXJzaW9uIDAuNS4xCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIG1pc2NlbGxhbmVvdXMgYnVnIGZpeGVzIChpc3N1ZXMgIzI4MCwgIzI4OSkKKyAgKiByZXZlcnRlZCBhbHBoYSBwbGFuZSBlbmNvZGluZyB3aXRoIGNvbG9yIGNhY2hlIGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgICBsaWJ3ZWJwIDAuNC4wLT4wLjQuMyAoaXNzdWVzICMyOTEsICMyOTgpCisgICogbG9zc2xlc3MgZW5jb2RpbmcgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzCisgICogbWVtb3J5IHJlZHVjdGlvbiBpbiBib3RoIGxvc3NsZXNzIGVuY29kaW5nIGFuZCBkZWNvZGluZworICAqIGZvcmNlIG11eCBvdXRwdXQgdG8gYmUgaW4gdGhlIGV4dGVuZGVkIGZvcm1hdCAoVlA4WCkgd2hlbiB1bmRlZmluZWQgY2h1bmtzCisgICAgYXJlIHByZXNlbnQgKGlzc3VlICMyOTQpCisgICogZ3JhZGxlLCBjbWFrZSBidWlsZCBzdXBwb3J0CisgICogd29ya2Fyb3VuZCBmb3IgY29tcGlsZXIgYnVnIGNhdXNpbmcgNjQtYml0IGRlY29kZSBmYWlsdXJlcyBvbiBhbmRyb2lkCisgICAgZGV2aWNlcyB1c2luZyBjbGFuZy0zLjggaW4gdGhlIHIxMWMgTkRLCisgICogdmFyaW91cyBXZWJQQW5pbUVuY29kZXIgaW1wcm92ZW1lbnRzCisKKy0gMTIvMTcvMjAxNTogdmVyc2lvbiAwLjUuMAorICAqIG1pc2NlbGxhbmVvdXMgYnVnICYgYnVpbGQgZml4ZXMgKGlzc3VlcyAjMjM0LCAjMjU4LCAjMjc0LCAjMjc1LCAjMjc4KQorICAqIGVuY29kZXIgJiBkZWNvZGVyIHNwZWVkLXVwcyBvbiB4ODYvQVJNL01JUFMgZm9yIGxvc3N5ICYgbG9zc2xlc3MKKyAgICAtIG5vdGUhIFlVVi0+UkdCIGNvbnZlcnNpb24gd2FzIHNwZWQtdXAsIGJ1dCB0aGUgcmVzdWx0cyB3aWxsIGJlIHNsaWdodGx5CisgICAgICBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyByZWxlYXNlcworICAqIHZhcmlvdXMgbG9zc2xlc3MgZW5jb2RlciBpbXByb3ZlbWVudHMKKyAgKiBnaWYyd2VicCBpbXByb3ZlbWVudHMsIC1taW5fc2l6ZSBvcHRpb24gYWRkZWQKKyAgKiB0b29scyBmdWxseSBzdXBwb3J0IGlucHV0IGZyb20gc3RkaW4gYW5kIG91dHB1dCB0byBzdGRvdXQgKGlzc3VlICMxNjgpCisgICogTmV3IFdlYlBBbmltRW5jb2RlciBBUEkgZm9yIGNyZWF0aW5nIGFuaW1hdGlvbnMKKyAgKiBOZXcgV2ViUEFuaW1EZWNvZGVyIEFQSSBmb3IgZGVjb2RpbmcgYW5pbWF0aW9ucworICAqIG90aGVyIEFQSSBjaGFuZ2VzOgorICAgIC0gbGlid2VicDoKKyAgICAgIFdlYlBQaWN0dXJlU21hcnRBUkdCVG9ZVVZBKCkgKC1wcmUgNCBpbiBjd2VicCkKKyAgICAgIFdlYlBDb25maWc6OmV4YWN0ICgtZXhhY3QgaW4gY3dlYnA7IC1hbHBoYV9jbGVhbnVwIGlzIG5vdyB0aGUgZGVmYXVsdCkKKyAgICAgIFdlYlBDb25maWc6Om5lYXJfbG9zc2xlc3MgKC1uZWFyX2xvc3NsZXNzIGluIGN3ZWJwKQorICAgICAgV2ViUEZyZWUoKSAoZnJlZSdpbmcgd2VicCBhbGxvY2F0ZWQgbWVtb3J5IGluIG90aGVyIGxhbmd1YWdlcykKKyAgICAgIFdlYlBDb25maWdMb3NzbGVzc1ByZXNldCgpCisgICAgICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoKQorICAgIC0gbGlid2VicGRlbXV4OiByZW1vdmVkIGV4cGVyaW1lbnRhbCBmcmFnbWVudCByZWxhdGVkIGZpZWxkcyBhbmQgZnVuY3Rpb25zCisgICAgLSBsaWJ3ZWJwbXV4OiBXZWJQTXV4U2V0Q2FudmFzU2l6ZSgpCisgICogbmV3IGxpYndlYnBleHRyYXMgbGlicmFyeSB3aXRoIHNvbWUgdW5jb21tb24gaW1wb3J0IGZ1bmN0aW9uczoKKyAgICBXZWJQSW1wb3J0R3JheS9XZWJQSW1wb3J0UkdCNTY1L1dlYlBJbXBvcnRSR0I0NDQ0CisKKy0gMTAvMTUvMTU6IHZlcnNpb24gMC40LjQKKyAgVGhpcyBpcyBhIGJpbmFyeSBjb21wYXRpYmxlIHJlbGVhc2UuCisgICogcmVzY2FsaW5nIG91dC1vZi1ib3VuZHMgcmVhZCBmaXggKGlzc3VlICMyNTQpCisgICogdmFyaW91cyBidWlsZCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIChpc3N1ZXMgIzI1MywgIzI1OSwgIzI2MiwgIzI2NywgIzI2OCkKKyAgKiBjb250YWluZXIgZG9jdW1lbnRhdGlvbiB1cGRhdGUKKyAgKiBnaWYyd2VicCB0cmFuc3BhcmVuY3kgZml4IChpc3N1ZSAjMjQ1KQorCistIDMvMy8xNTogdmVyc2lvbiAwLjQuMworICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBBbmRyb2lkIC8gZ2NjIC8gaU9TIC8gTVNWUyBidWlsZCBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzCisgICogbG9zc2xlc3MgZGVjb2RlIGZpeCAoaXNzdWUgIzIzOSAtLSBzaW5jZSAwLjQuMCkKKyAgKiBkb2N1bWVudGF0aW9uIC8gdndlYnAgdXBkYXRlcyBmb3IgYW5pbWF0aW9uCisgICogbXVsdGktdGhyZWFkaW5nIGZpeCAoaXNzdWUgIzIzNCkKKworLSAxMC8xMy8xNDogdmVyc2lvbiAwLjQuMgorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBBbmRyb2lkIC8gZ2NjIGJ1aWxkIGZpeGVzCisgICogKFdpbmRvd3MpIGZpeCByZWFkaW5nIGZyb20gc3RkaW4gYW5kIHdyaXRpbmcgdG8gc3Rkb3V0CisgICogZ2lmMndlYnA6IG1pc2NlbGxhbmVvdXMgZml4ZXMKKyAgKiBmaXggJ2FscGhhLWxlYWsnIHdpdGggbG9zc3kgY29tcHJlc3Npb24gKGlzc3VlICMyMjApCisgICogdGhlIGxvc3NsZXNzIGJpdHN0cmVhbSBzcGVjIGhhcyBiZWVuIGFtZW5kZWQgdG8gcmVmbGVjdCB0aGUgY3VycmVudCBjb2RlCisKKy0gNy8yNC8xNDogdmVyc2lvbiAwLjQuMQorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBBQXJjaDY0IChhcm02NCkgJiBNSVBTIHN1cHBvcnQvb3B0aW1pemF0aW9ucworICAqIE5FT04gYXNzZW1ibHkgYWRkaXRpb25zOgorICAgIC0gfjI1JSBmYXN0ZXIgbG9zc3kgZGVjb2RlIC8gZW5jb2RlICgtbSA0KQorICAgIC0gfjEwJSBmYXN0ZXIgbG9zc2xlc3MgZGVjb2RlCisgICAgLSB+NS0xMCUgZmFzdGVyIGxvc3NsZXNzIGVuY29kZSAoLW0gMy80KQorICAqIGR3ZWJwL3Z3ZWJwIGNhbiByZWFkIGZyb20gc3RkaW4KKyAgKiBjd2VicC9naWYyd2VicCBjYW4gd3JpdGUgdG8gc3Rkb3V0CisgICogY3dlYnAgY2FuIHJlYWQgd2VicCBmaWxlczsgdXNlZnVsIGlmIHN0b3Jpbmcgc291cmNlcyBhcyB3ZWJwIGxvc3NsZXNzCisKKy0gMTIvMTkvMTM6IHZlcnNpb24gMC40LjAKKyAgKiBpbXByb3ZlZCBnaWYyd2VicCB0b29sCisgICogbnVtZXJvdXMgZml4ZXMsIGNvbXByZXNzaW9uIGltcHJvdmVtZW50IGFuZCBzcGVlZC11cAorICAqIGRpdGhlciBvcHRpb24gYWRkZWQgdG8gZGVjb2RlciAoZHdlYnAgLWRpdGhlciA1MCAuLi4pCisgICogaW1wcm92ZWQgbXVsdGktdGhyZWFkZWQgbW9kZXMgKC1tdCBvcHRpb24pCisgICogaW1wcm92ZWQgZmlsdGVyaW5nIHN0cmVuZ3RoIGRldGVybWluYXRpb24KKyAgKiBOZXcgZnVuY3Rpb246IFdlYlBNdXhHZXRDYW52YXNTaXplCisgICogQk1QIGFuZCBUSUZGIGZvcm1hdCBvdXRwdXQgYWRkZWQgdG8gJ2R3ZWJwJworICAqIFNpZ25pZmljYW50IG1lbW9yeSByZWR1Y3Rpb24gZm9yIGRlY29kaW5nIGxvc3N5IGltYWdlcyB3aXRoIGFscGhhLgorICAqIEludGVydHdpbmVkIGRlY29kaW5nIG9mIFJHQiBhbmQgYWxwaGEgZm9yIGEgc2hvcnRlcgorICAgIHRpbWUtdG8tZmlyc3QtZGVjb2RlZC1waXhlbC4KKyAgKiBXZWJQSXRlcmF0b3IgaGFzIGEgbmV3IG1lbWJlciAnaGFzX2FscGhhJyBkZW5vdGluZyB3aGV0aGVyIHRoZSBmcmFtZQorICAgIGNvbnRhaW5zIHRyYW5zcGFyZW5jeS4KKyAgKiBDb250YWluZXIgc3BlYyBhbWVuZGVkIHdpdGggbmV3ICdibGVuZGluZyBtZXRob2QnIGZvciBhbmltYXRpb24uCisKKy0gNi8xMy8xMzogdmVyc2lvbiAwLjMuMQorICBUaGlzIGlzIGEgYmluYXJ5IGNvbXBhdGlibGUgcmVsZWFzZS4KKyAgKiBBZGQgaW5jcmVtZW50YWwgZGVjb2Rpbmcgc3VwcG9ydCBmb3IgaW1hZ2VzIGNvbnRhaW5pbmcgQUxQSCBhbmQgSUNDUCBjaHVua3MuCisgICogUHl0aG9uIGJpbmRpbmdzIHZpYSBzd2lnIGZvciB0aGUgc2ltcGxlIGVuY29kZS9kZWNvZGUgaW50ZXJmYWNlcyBzaW1pbGFyIHRvCisgICAgSmF2YS4KKworLSAzLzIwLzEzOiB2ZXJzaW9uIDAuMy4wCisgIFRoaXMgaXMgYSBiaW5hcnkgY29tcGF0aWJsZSByZWxlYXNlLgorICAqIFdlYlBJTmV3UkdCL1dlYlBJTmV3WVVWQSBhY2NlcHQgYmVpbmcgcGFzc2VkIGEgTlVMTCBvdXRwdXQgYnVmZmVyCisgICAgYW5kIHdpbGwgcGVyZm9ybSBhdXRvLWFsbG9jYXRpb24uCisgICogZGVmYXVsdCBmaWx0ZXIgb3B0aW9uIGlzIG5vdyAnLXN0cm9uZyAtZiA2MCcKKyAgKiBlbmNvZGluZyBzcGVlZC11cCBmb3IgbG9zc3kgbWV0aG9kcyAzIHRvIDYKKyAgKiBhbHBoYSBlbmNvZGluZyBjYW4gYmUgZG9uZSBpbiBwYXJhbGxlbCB0byBsb3NzeSB1c2luZyAnY3dlYnAgLW10IC4uLicKKyAgKiBjb2xvciBwcm9maWxlLCBtZXRhZGF0YSAoWE1QL0VYSUYpIGFuZCBhbmltYXRpb24gc3VwcG9ydCBmaW5hbGl6ZWQgaW4gdGhlCisgICAgY29udGFpbmVyLgorICAqIHZhcmlvdXMgTkVPTiBhc3NlbWJseSBhZGRpdGlvbnMKKyAgVG9vbCB1cGRhdGVzIC8gYWRkaXRpb25zOgorICAgICogZ2lmMndlYnAgYWRkZWQKKyAgICAqIHZ3ZWJwIGdpdmVuIGNvbG9yIHByb2ZpbGUgJiBhbmltYXRpb24gc3VwcG9ydAorICAgICogY3dlYnAgY2FuIHByZXNlcnZlIGNvbG9yIHByb2ZpbGUgLyBtZXRhZGF0YSB3aXRoICctbWV0YWRhdGEnCisKKy0gMTAvMzAvMTI6IHZlcnNpb24gMC4yLjEKKyAgKiBWYXJpb3VzIHNlY3VyaXR5IHJlbGF0ZWQgZml4ZXMKKyAgKiBjd2VicC5leGU6IGZpeCBpbXBvcnQgZXJyb3JzIG9uIFdpbmRvd3MgWFAKKyAgKiBlbmFibGUgRExMIGJ1aWxkcyBmb3IgbWluZ3cgdGFyZ2V0cworCistIDgvMy8xMjogdmVyc2lvbiAwLjIuMAorICAqIEFkZCBzdXBwb3J0IGZvciBBUkdCIC0+IFlVVkEgY29udmVyc2lvbiBmb3IgbG9zc2xlc3MgZGVjb2RlcgorICAgIE5ldyBmdW5jdGlvbnM6IFdlYlBJTmV3WVVWQSwgV2ViUElEZWNHZXRZVVZBCisgICogQWRkIHN0YXRzIGZvciBsb3NzbGVzcyBhbmQgYWxwaGEgZW5jb2RpbmcKKyAgKiBTZWN1cml0eSByZWxhdGVkIGhhcmRlbmluZzogYWxsb2NhdGlvbiBhbmQgc2l6ZSBjaGVja3MKKyAgKiBBZGQgUEFNIG91dHB1dCBzdXBwb3J0IHRvIGR3ZWJwCisKKy0gNy8xOS8xMjogdmVyc2lvbiAwLjEuOTkKKyAgKiBUaGlzIGlzIGEgcHJlLXJlbGVhc2Ugb2YgMC4yLjAsIG5vdCBhbiByYyB0byBhbGxvdyBmb3IgZnVydGhlcgorICAgIGluY29tcGF0aWJsZSBjaGFuZ2VzIGJhc2VkIG9uIHVzZXIgZmVlZGJhY2suCisgICogQWxwaGEgY2hhbm5lbCBlbmNvZGUvZGVjb2RlIHN1cHBvcnQuCisgICogTG9zc2xlc3MgZW5jb2Rlci9kZWNvZGVyLgorICAqIEFkZCBUSUZGIGlucHV0IHN1cHBvcnQgdG8gY3dlYnAuCisgIEluY29tcGF0aWJsZSBjaGFuZ2VzOgorICAgICogVGhlIGVuY29kZSBBQkkgaGFzIGJlZW4gbW9kaWZpZWQgdG8gc3VwcG9ydCBhbHBoYSBlbmNvZGluZy4KKyAgICAqIERlcHJlY2F0ZWQgZnVuY3Rpb24gV2ViUElOZXcoKSBoYXMgYmVlbiByZW1vdmVkLgorICAgICogRGVjb2RlIGZ1bmN0aW9uIHNpZ25hdHVyZXMgaGF2ZSBjaGFuZ2VkIHRvIGNvbnNpc3RlbnRseSB1c2Ugc2l6ZV90IG92ZXIKKyAgICAgIGludC91aW50MzJfdC4KKyAgICAqIGRlY29kZV92cDguaCBpcyBubyBsb25nZXIgaW5zdGFsbGVkIHN5c3RlbS13aWRlLgorICAgICogY3dlYnAgd2lsbCBlbmNvZGUgdGhlIGFscGhhIGNoYW5uZWwgaWYgcHJlc2VudC4KKworLSA5LzE5LzExOiB2ZXJzaW9uIDAuMS4zCisgICogQWR2YW5jZWQgZGVjb2RpbmcgQVBJcy4KKyAgKiBPbi10aGUtZmx5IGNyb3BwaW5nIGFuZCByZXNjYWxpbmcgb2YgaW1hZ2VzLgorICAqIFNTRTIgaW5zdHJ1Y3Rpb25zIGZvciBkZWNvZGluZyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIG9uIHg4NiBiYXNlZAorICAgIHBsYXRmb3Jtcy4KKyAgKiBTdXBwb3J0IE11bHRpLXRocmVhZGVkIGRlY29kaW5nLgorICAqIDQwJSBpbXByb3ZlbWVudCBpbiBEZWNvZGluZyBwZXJmb3JtYW5jZS4KKyAgKiBBZGQgc3VwcG9ydCBmb3IgUkdCNTY1LCBSR0JBNDQ0NCAmIEFSR0IgaW1hZ2UgY29sb3JzcGFjZS4KKyAgKiBCZXR0ZXIgaGFuZGxpbmcgb2YgbGFyZ2UgcGljdHVyZSBlbmNvZGluZy4KKworLSAzLzI1LzExOiB2ZXJzaW9uIDAuMS4yCisgICogSW5jcmVtZW50YWwgZGVjb2Rpbmc6IHBpY3R1cmUgY2FuIGJlIGRlY29kZWQgYnl0ZS1ieS1ieXRlIGlmIG5lZWRzIGJlLgorICAqIGxvdCBvZiBidWctZml4ZXMsIGNvbnNvbGlkYXRpb24gYW5kIHN0YWJpbGl6YXRpb24KKworLSAyLzIzLzExOiBpbml0aWFsIHJlbGVhc2Ugb2YgdmVyc2lvbiAwLjEsIHdpdGggdGhlIG5ldyBlbmNvZGVyCistIDkvMzAvMTA6IGluaXRpYWwgcmVsZWFzZSB2ZXJzaW9uIHdpdGggb25seSB0aGUgbGlnaHR3ZWlnaHQgZGVjb2RlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUEFURU5UUyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1BBVEVOVFMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FlZGY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1BBVEVOVFMKQEAgLTAsMCArMSwyMyBAQAorQWRkaXRpb25hbCBJUCBSaWdodHMgR3JhbnQgKFBhdGVudHMpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIlRoZXNlIGltcGxlbWVudGF0aW9ucyIgbWVhbnMgdGhlIGNvcHlyaWdodGFibGUgd29ya3MgdGhhdCBpbXBsZW1lbnQgdGhlIFdlYk0KK2NvZGVjcyBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgV2ViTSBQcm9qZWN0LgorCitHb29nbGUgaGVyZWJ5IGdyYW50cyB0byB5b3UgYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvCittYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCB0cmFuc2ZlciwgYW5kIG90aGVyd2lzZQorcnVuLCBtb2RpZnkgYW5kIHByb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0sIHdoZXJlCitzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMsIGJvdGggY3VycmVudGx5IG93bmVkIGJ5CitHb29nbGUgYW5kIGFjcXVpcmVkIGluIHRoZSBmdXR1cmUsIGxpY2Vuc2FibGUgYnkgR29vZ2xlIHRoYXQgYXJlIG5lY2Vzc2FyaWx5CitpbmZyaW5nZWQgYnkgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0uIFRoaXMgZ3JhbnQgZG9lcyBub3QgaW5jbHVkZSBjbGFpbXMKK3RoYXQgd291bGQgYmUgaW5mcmluZ2VkIG9ubHkgYXMgYSBjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGVzZQoraW1wbGVtZW50YXRpb25zLiBJZiB5b3Ugb3IgeW91ciBhZ2VudCBvciBleGNsdXNpdmUgbGljZW5zZWUgaW5zdGl0dXRlIG9yIG9yZGVyCitvciBhZ3JlZSB0byB0aGUgaW5zdGl0dXRpb24gb2YgcGF0ZW50IGxpdGlnYXRpb24gb3IgYW55IG90aGVyIHBhdGVudAorZW5mb3JjZW1lbnQgYWN0aXZpdHkgYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvcgorY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCBhbnkgb2YgdGhlc2UgaW1wbGVtZW50YXRpb25zIG9mIFdlYk0KK29yIGFueSBjb2RlIGluY29ycG9yYXRlZCB3aXRoaW4gYW55IG9mIHRoZXNlIGltcGxlbWVudGF0aW9ucyBvZiBXZWJNCitjb25zdGl0dXRlIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgb3IgaW5kdWNlbWVudCBvZgorcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IHJpZ2h0cyBncmFudGVkIHRvIHlvdSB1bmRlciB0aGlzIExpY2Vuc2UKK2ZvciB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgb2YgV2ViTSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZiMzc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FCkBAIC0wLDAgKzEsNzgyIEBACisgICAgICAgICAgX18gICBfXyAgX19fXyAgX19fXyAgX19fXworICAgICAgICAgLyAgXFwvICBcLyAgXyBcLyAgXyApLyAgXyBcCisgICAgICAgICBcICAgICAgIC8gICBfXy8gIF8gIFwgICBfXy8KKyAgICAgICAgICBcX19cX18vXF9fX18vXF9fX19fL19fLyBfX19fICBfX18KKyAgICAgICAgICAgICAgICAvIF8vIC8gICAgXCAgICBcIC8gIF8gXC8gXy8KKyAgICAgICAgICAgICAgIC8gIFxfLyAgIC8gLyAgIFwgXCAgIF9fLyAgXF9fCisgICAgICAgICAgICAgICBcX19fXy9fX19fL1xfX19fXy9fX19fXy9fX19fL3YxLjAuMAorCitEZXNjcmlwdGlvbjoKKz09PT09PT09PT09PQorCitXZWJQIGNvZGVjOiBsaWJyYXJ5IHRvIGVuY29kZSBhbmQgZGVjb2RlIGltYWdlcyBpbiBXZWJQIGZvcm1hdC4gVGhpcyBwYWNrYWdlCitjb250YWlucyB0aGUgbGlicmFyeSB0aGF0IGNhbiBiZSB1c2VkIGluIG90aGVyIHByb2dyYW1zIHRvIGFkZCBXZWJQIHN1cHBvcnQsCithcyB3ZWxsIGFzIHRoZSBjb21tYW5kIGxpbmUgdG9vbHMgJ2N3ZWJwJyBhbmQgJ2R3ZWJwJy4KKworU2VlIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicAorCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorCitJdCBpcyByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBXZWJNIHByb2plY3QuCitTZWUgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvbGljZW5zZS9zb2Z0d2FyZS8gb3IgdGhlCisiQ09QWUlORyIgZmlsZSBmb3IgZGV0YWlscy4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUgUEFURU5UUy4KKworQnVpbGRpbmc6Cis9PT09PT09PT0KKworV2luZG93cyBidWlsZDoKKy0tLS0tLS0tLS0tLS0tCisKK0J5IHJ1bm5pbmc6CisKKyAgbm1ha2UgL2YgTWFrZWZpbGUudmMgQ0ZHPXJlbGVhc2Utc3RhdGljIFJUTElCQ0ZHPXN0YXRpYyBPQkpESVI9b3V0cHV0CisKK3RoZSBkaXJlY3Rvcnkgb3V0cHV0XHJlbGVhc2Utc3RhdGljXCh4NjR8eDg2KVxiaW4gd2lsbCBjb250YWluIHRoZSB0b29scworY3dlYnAuZXhlIGFuZCBkd2VicC5leGUuIFRoZSBkaXJlY3Rvcnkgb3V0cHV0XHJlbGVhc2Utc3RhdGljXCh4NjR8eDg2KVxsaWIgd2lsbAorY29udGFpbiB0aGUgbGlid2VicCBzdGF0aWMgbGlicmFyeS4KK1RoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlICh4ODYveDY0KSBpcyBkZXRlY3RlZCBieSBNYWtlZmlsZS52YyBmcm9tIHRoZSBWaXN1YWwKK1N0dWRpbyBjb21waWxlciAoY2wuZXhlKSBhdmFpbGFibGUgaW4gdGhlIHN5c3RlbSBwYXRoLgorCitVbml4IGJ1aWxkIHVzaW5nIG1ha2VmaWxlLnVuaXg6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK09uIHBsYXRmb3JtcyB3aXRoIEdOVSB0b29scyBpbnN0YWxsZWQgKGdjYyBhbmQgbWFrZSksIHJ1bm5pbmcKKworICBtYWtlIC1mIG1ha2VmaWxlLnVuaXgKKword2lsbCBidWlsZCB0aGUgYmluYXJpZXMgZXhhbXBsZXMvY3dlYnAgYW5kIGV4YW1wbGVzL2R3ZWJwLCBhbG9uZword2l0aCB0aGUgc3RhdGljIGxpYnJhcnkgc3JjL2xpYndlYnAuYS4gTm8gc3lzdGVtLXdpZGUgaW5zdGFsbGF0aW9uCitpcyBzdXBwbGllZCwgYXMgdGhpcyBpcyBhIHNpbXBsZSBhbHRlcm5hdGl2ZSB0byB0aGUgZnVsbCBpbnN0YWxsYXRpb24KK3N5c3RlbSBiYXNlZCBvbiB0aGUgYXV0b2NvbmYgdG9vbHMgKHNlZSBiZWxvdykuCitQbGVhc2UgcmVmZXIgdG8gbWFrZWZpbGUudW5peCBmb3IgYWRkaXRpb25hbCBkZXRhaWxzIGFuZCBjdXN0b21pemF0aW9ucy4KKworVXNpbmcgYXV0b2NvbmYgdG9vbHM6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1ByZXJlcXVpc2l0ZXM6CitBIGNvbXBpbGVyIChlLmcuLCBnY2MpLCBtYWtlLCBhdXRvY29uZiwgYXV0b21ha2UsIGxpYnRvb2wuCitPbiBhIERlYmlhbi1saWtlIHN5c3RlbSB0aGUgZm9sbG93aW5nIHNob3VsZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIGEKK21pbmltYWwgYnVpbGQ6CiskIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGdjYyBtYWtlIGF1dG9jb25mIGF1dG9tYWtlIGxpYnRvb2wKKworV2hlbiBidWlsZGluZyBmcm9tIGdpdCBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBhdXRvZ2VuLnNoIHRvIGdlbmVyYXRlIHRoZQorY29uZmlndXJlIHNjcmlwdC4KKworLi9jb25maWd1cmUKK21ha2UKK21ha2UgaW5zdGFsbAorCitzaG91bGQgYmUgYWxsIHlvdSBuZWVkIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBmaWxlcworCisvdXNyL2xvY2FsL2luY2x1ZGUvd2VicC9kZWNvZGUuaAorL3Vzci9sb2NhbC9pbmNsdWRlL3dlYnAvZW5jb2RlLmgKKy91c3IvbG9jYWwvaW5jbHVkZS93ZWJwL3R5cGVzLmgKKy91c3IvbG9jYWwvbGliL2xpYndlYnAuKgorL3Vzci9sb2NhbC9iaW4vY3dlYnAKKy91c3IvbG9jYWwvYmluL2R3ZWJwCisKK2luc3RhbGxlZC4KKworTm90ZTogQSBkZWNvZGUtb25seSBsaWJyYXJ5LCBsaWJ3ZWJwZGVjb2RlciwgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZQorJy0tZW5hYmxlLWxpYndlYnBkZWNvZGVyJyBmbGFnLiBUaGUgZW5jb2RlIGxpYnJhcnkgaXMgYnVpbHQgc2VwYXJhdGVseSBhbmQgY2FuCitiZSBpbnN0YWxsZWQgaW5kZXBlbmRlbnRseSB1c2luZyBhIG1pbm9yIG1vZGlmaWNhdGlvbiBpbiB0aGUgY29ycmVzcG9uZGluZworTWFrZWZpbGUuYW0gY29uZmlndXJlIGZpbGVzIChzZWUgY29tbWVudHMgdGhlcmUpLiBTZWUgJy4vY29uZmlndXJlIC0taGVscCcgZm9yCittb3JlIG9wdGlvbnMuCisKK0J1aWxkaW5nIGZvciBNSVBTIExpbnV4OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNSVBTIExpbnV4IHRvb2xjaGFpbiBzdGFibGUgYXZhaWxhYmxlIHJlbGVhc2VzIGNhbiBiZSBmb3VuZCBhdDoKK2h0dHBzOi8vY29tbXVuaXR5LmltZ3RlYy5jb20vZGV2ZWxvcGVycy9taXBzL3Rvb2xzL2NvZGVzY2FwZS1taXBzLXNkay9hdmFpbGFibGUtcmVsZWFzZXMvCisKKyMgQWRkIHRvb2xjaGFpbiB0byBQQVRICitleHBvcnQgUEFUSD0kUEFUSDovcGF0aC90by90b29sY2hhaW4vYmluCisKKyMgMzItYml0IGJ1aWxkIGZvciBtaXBzMzJyNSAocDU2MDApCitIT1NUPW1pcHMtbXRpLWxpbnV4LWdudQorTUlQU19DRkxBR1M9Ii1PMyAtbWlwczMycjUgLW1hYmk9MzIgLW10dW5lPXA1NjAwIC1tbXNhIC1tZnA2NCBcCisgIC1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycyAtZlBJRSIKK01JUFNfTERGTEFHUz0iLW1pcHMzMnI1IC1tYWJpPTMyIC1tbXNhIC1tZnA2NCAtcGllIgorCisjIDY0LWJpdCBidWlsZCBmb3IgbWlwczY0cjYgKGk2NDAwKQorSE9TVD1taXBzLWltZy1saW51eC1nbnUKK01JUFNfQ0ZMQUdTPSItTzMgLW1pcHM2NHI2IC1tYWJpPTY0IC1tdHVuZT1pNjQwMCAtbW1zYSAtbWZwNjQgXAorICAtbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMgLWZQSUUiCitNSVBTX0xERkxBR1M9Ii1taXBzNjRyNiAtbWFiaT02NCAtbW1zYSAtbWZwNjQgLXBpZSIKKworLi9jb25maWd1cmUgLS1ob3N0PSR7SE9TVH0gLS1idWlsZD1gY29uZmlnLmd1ZXNzYCBcCisgIENDPSIke0hPU1R9LWdjYyAtRUwiIFwKKyAgQ0ZMQUdTPSIkTUlQU19DRkxBR1MiIFwKKyAgTERGTEFHUz0iJE1JUFNfTERGTEFHUyIKK21ha2UKK21ha2UgaW5zdGFsbAorCitDTWFrZToKKy0tLS0tLQorV2l0aCBDTWFrZSwgeW91IGNhbiBjb21waWxlIGxpYndlYnAsIGN3ZWJwLCBkd2VicCwgZ2lmMndlYiwgaW1nMndlYnAsIHdlYnBpbmZvCithbmQgdGhlIEpTIGJpbmRpbmdzLgorCitQcmVyZXF1aXNpdGVzOgorQSBjb21waWxlciAoZS5nLiwgZ2NjIHdpdGggYXV0b3Rvb2xzKSBhbmQgQ01ha2UuCitPbiBhIERlYmlhbi1saWtlIHN5c3RlbSB0aGUgZm9sbG93aW5nIHNob3VsZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIGEKK21pbmltYWwgYnVpbGQ6CiskIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCBjbWFrZQorCitXaGVuIGJ1aWxkaW5nIGZyb20gZ2l0IHNvdXJjZXMsIHlvdSB3aWxsIG5lZWQgdG8gcnVuIGNtYWtlIHRvIGdlbmVyYXRlIHRoZQorbWFrZWZpbGVzLgorCitta2RpciBidWlsZCAmJiBjZCBidWlsZCAmJiBjbWFrZSAuLi8KK21ha2UKK21ha2UgaW5zdGFsbAorCitJZiB5b3UgYWxzbyB3YW50IGFueSBvZiB0aGUgZXhlY3V0YWJsZXMsIHlvdSB3aWxsIG5lZWQgdG8gZW5hYmxlIHRoZW0gdGhyb3VnaAorQ01ha2UsIGUuZy46CisKK2NtYWtlIC1EV0VCUF9CVUlMRF9DV0VCUD1PTiAtRFdFQlBfQlVJTERfRFdFQlA9T04gLi4vCisKK29yIHRocm91Z2ggeW91ciBmYXZvcml0ZSBpbnRlcmZhY2UgKGxpa2UgY2NtYWtlIG9yIGNtYWtlLXF0LWd1aSkuCisKK0ZpbmFsbHksIG9uY2UgaW5zdGFsbGVkLCB5b3UgY2FuIGFsc28gdXNlIFdlYlAgaW4geW91ciBDTWFrZSBwcm9qZWN0IGJ5IGRvaW5nOgorCitmaW5kX3BhY2thZ2UoV2ViUCkKKword2hpY2ggd2lsbCBkZWZpbmUgdGhlIENNYWtlIHZhcmlhYmxlcyBXZWJQX0lOQ0xVREVfRElSUyBhbmQgV2ViUF9MSUJSQVJJRVMuCisKK0dyYWRsZToKKy0tLS0tLS0KK1RoZSBzdXBwb3J0IGZvciBHcmFkbGUgaXMgbWluaW1hbDogaXQgb25seSBoZWxwcyB5b3UgY29tcGlsZSBsaWJ3ZWJwLCBjd2VicCBhbmQKK2R3ZWJwIGFuZCB3ZWJwbXV4X2V4YW1wbGUuCisKK1ByZXJlcXVpc2l0ZXM6CitBIGNvbXBpbGVyIChlLmcuLCBnY2Mgd2l0aCBhdXRvdG9vbHMpIGFuZCBncmFkbGUuCitPbiBhIERlYmlhbi1saWtlIHN5c3RlbSB0aGUgZm9sbG93aW5nIHNob3VsZCBpbnN0YWxsIGV2ZXJ5dGhpbmcgeW91IG5lZWQgZm9yIGEKK21pbmltYWwgYnVpbGQ6CiskIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCBncmFkbGUKKworV2hlbiBidWlsZGluZyBmcm9tIGdpdCBzb3VyY2VzLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biB0aGUgR3JhZGxlIHdyYXBwZXIgd2l0aCB0aGUKK2FwcHJvcHJpYXRlIHRhcmdldCwgZS5nLiA6CisKKy4vZ3JhZGxldyBidWlsZEFsbEV4ZWN1dGFibGVzCisKK1NXSUcgYmluZGluZ3M6CistLS0tLS0tLS0tLS0tLQorCitUbyBnZW5lcmF0ZSBsYW5ndWFnZSBiaW5kaW5ncyBmcm9tIHN3aWcvbGlid2VicC5zd2lnIGF0IGxlYXN0IHN3aWctMS4zCisoaHR0cDovL3d3dy5zd2lnLm9yZykgaXMgcmVxdWlyZWQuCisKK0N1cnJlbnRseSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgbWFwcGVkOgorRGVjb2RlOgorICBXZWJQR2V0RGVjb2RlclZlcnNpb24KKyAgV2ViUEdldEluZm8KKyAgV2ViUERlY29kZVJHQkEKKyAgV2ViUERlY29kZUFSR0IKKyAgV2ViUERlY29kZUJHUkEKKyAgV2ViUERlY29kZUJHUgorICBXZWJQRGVjb2RlUkdCCisKK0VuY29kZToKKyAgV2ViUEdldEVuY29kZXJWZXJzaW9uCisgIFdlYlBFbmNvZGVSR0JBCisgIFdlYlBFbmNvZGVCR1JBCisgIFdlYlBFbmNvZGVSR0IKKyAgV2ViUEVuY29kZUJHUgorICBXZWJQRW5jb2RlTG9zc2xlc3NSR0JBCisgIFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEKKyAgV2ViUEVuY29kZUxvc3NsZXNzUkdCCisgIFdlYlBFbmNvZGVMb3NzbGVzc0JHUgorCitTZWUgc3dpZy9SRUFETUUgZm9yIG1vcmUgZGV0YWlsZWQgYnVpbGQgaW5zdHJ1Y3Rpb25zLgorCitKYXZhIGJpbmRpbmdzOgorCitUbyBidWlsZCB0aGUgc3dpZy1nZW5lcmF0ZWQgSk5JIHdyYXBwZXIgY29kZSBhdCBsZWFzdCBKREstMS41IChvciBlcXVpdmFsZW50KQoraXMgbmVjZXNzYXJ5IGZvciBlbnVtIHN1cHBvcnQuIFRoZSBvdXRwdXQgaXMgaW50ZW5kZWQgdG8gYmUgYSBzaGFyZWQgb2JqZWN0IC8KK0RMTCB0aGF0IGNhbiBiZSBsb2FkZWQgdmlhIFN5c3RlbS5sb2FkTGlicmFyeSgid2VicF9qbmkiKS4KKworUHl0aG9uIGJpbmRpbmdzOgorCitUbyBidWlsZCB0aGUgc3dpZy1nZW5lcmF0ZWQgUHl0aG9uIGV4dGVuc2lvbiBjb2RlIGF0IGxlYXN0IFB5dGhvbiAyLjYgaXMKK3JlcXVpcmVkLiBQeXRob24gPCAyLjYgbWF5IGJ1aWxkIHdpdGggc29tZSBtaW5vciBjaGFuZ2VzIHRvIGxpYndlYnAuc3dpZyBvciB0aGUKK2dlbmVyYXRlZCBjb2RlLCBidXQgaXMgdW50ZXN0ZWQuCisKK0VuY29kaW5nIHRvb2w6Cis9PT09PT09PT09PT09PQorCitUaGUgZXhhbXBsZXMvIGRpcmVjdG9yeSBjb250YWlucyB0b29scyBmb3IgZW5jb2RpbmcgKGN3ZWJwKSBhbmQKK2RlY29kaW5nIChkd2VicCkgaW1hZ2VzLgorCitUaGUgZWFzaWVzdCB1c2Ugc2hvdWxkIGxvb2sgbGlrZToKKyAgY3dlYnAgaW5wdXQucG5nIC1xIDgwIC1vIG91dHB1dC53ZWJwCit3aGljaCB3aWxsIGNvbnZlcnQgdGhlIGlucHV0IGZpbGUgdG8gYSBXZWJQIGZpbGUgdXNpbmcgYSBxdWFsaXR5IGZhY3RvciBvZiA4MAorb24gYSAwLT4xMDAgc2NhbGUgKDAgYmVpbmcgdGhlIGxvd2VzdCBxdWFsaXR5LCAxMDAgYmVpbmcgdGhlIGJlc3QuIERlZmF1bHQKK3ZhbHVlIGlzIDc1KS4KK1lvdSBtaWdodCB3YW50IHRvIHRyeSB0aGUgLWxvc3NsZXNzIGZsYWcgdG9vLCB3aGljaCB3aWxsIGNvbXByZXNzIHRoZSBzb3VyY2UKKyhpbiBSR0JBIGZvcm1hdCkgd2l0aG91dCBhbnkgbG9zcy4gVGhlIC1xIHF1YWxpdHkgcGFyYW1ldGVyIHdpbGwgaW4gdGhpcyBjYXNlCitjb250cm9sIHRoZSBhbW91bnQgb2YgcHJvY2Vzc2luZyB0aW1lIHNwZW50IHRyeWluZyB0byBtYWtlIHRoZSBvdXRwdXQgZmlsZSBhcworc21hbGwgYXMgcG9zc2libGUuCisKK0EgbG9uZ2VyIGxpc3Qgb2Ygb3B0aW9ucyBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIC1sb25naGVscCBjb21tYW5kIGxpbmUgZmxhZzoKKworPiBjd2VicCAtbG9uZ2hlbHAKK1VzYWdlOgorIGN3ZWJwIFstcHJlc2V0IDwuLi4+XSBbb3B0aW9uc10gaW5fZmlsZSBbLW8gb3V0X2ZpbGVdCisKK0lmIGlucHV0IHNpemUgKC1zKSBmb3IgYW4gaW1hZ2UgaXMgbm90IHNwZWNpZmllZCwgaXQgaXMKK2Fzc3VtZWQgdG8gYmUgYSBQTkcsIEpQRUcsIFRJRkYgb3IgV2ViUCBmaWxlLgorCitPcHRpb25zOgorICAtaCAvIC1oZWxwIC4uLi4uLi4uLi4uLi4gc2hvcnQgaGVscAorICAtSCAvIC1sb25naGVscCAuLi4uLi4uLi4gbG9uZyBoZWxwCisgIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4uLiBxdWFsaXR5IGZhY3RvciAoMDpzbWFsbC4uMTAwOmJpZyksIGRlZmF1bHQ9NzUKKyAgLWFscGhhX3EgPGludD4gLi4uLi4uLi4uIHRyYW5zcGFyZW5jeS1jb21wcmVzc2lvbiBxdWFsaXR5ICgwLi4xMDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0xMDAKKyAgLXByZXNldCA8c3RyaW5nPiAuLi4uLi4uIHByZXNldCBzZXR0aW5nLCBvbmUgb2Y6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCwgcGhvdG8sIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJhd2luZywgaWNvbiwgdGV4dAorICAgICAtcHJlc2V0IG11c3QgY29tZSBmaXJzdCwgYXMgaXQgb3ZlcndyaXRlcyBvdGhlciBwYXJhbWV0ZXJzCisgIC16IDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBhY3RpdmF0ZXMgbG9zc2xlc3MgcHJlc2V0IHdpdGggZ2l2ZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGluIFswOmZhc3QsIC4uLiwgOTpzbG93ZXN0XQorCisgIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBjb21wcmVzc2lvbiBtZXRob2QgKDA9ZmFzdCwgNj1zbG93ZXN0KSwgZGVmYXVsdD00CisgIC1zZWdtZW50cyA8aW50PiAuLi4uLi4uLiBudW1iZXIgb2Ygc2VnbWVudHMgdG8gdXNlICgxLi40KSwgZGVmYXVsdD00CisgIC1zaXplIDxpbnQ+IC4uLi4uLi4uLi4uLiB0YXJnZXQgc2l6ZSAoaW4gYnl0ZXMpCisgIC1wc25yIDxmbG9hdD4gLi4uLi4uLi4uLiB0YXJnZXQgUFNOUiAoaW4gZEIuIHR5cGljYWxseTogNDIpCisKKyAgLXMgPGludD4gPGludD4gLi4uLi4uLi4uIGlucHV0IHNpemUgKHdpZHRoIHggaGVpZ2h0KSBmb3IgWVVWCisgIC1zbnMgPGludD4gLi4uLi4uLi4uLi4uLiBzcGF0aWFsIG5vaXNlIHNoYXBpbmcgKDA6b2ZmLCAxMDA6bWF4KSwgZGVmYXVsdD01MAorICAtZiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gZmlsdGVyIHN0cmVuZ3RoICgwPW9mZi4uMTAwKSwgZGVmYXVsdD02MAorICAtc2hhcnBuZXNzIDxpbnQ+IC4uLi4uLi4gZmlsdGVyIHNoYXJwbmVzcyAoMDptb3N0IC4uIDc6bGVhc3Qgc2hhcnApLCBkZWZhdWx0PTAKKyAgLXN0cm9uZyAuLi4uLi4uLi4uLi4uLi4uIHVzZSBzdHJvbmcgZmlsdGVyIGluc3RlYWQgb2Ygc2ltcGxlIChkZWZhdWx0KQorICAtbm9zdHJvbmcgLi4uLi4uLi4uLi4uLi4gdXNlIHNpbXBsZSBmaWx0ZXIgaW5zdGVhZCBvZiBzdHJvbmcKKyAgLXNoYXJwX3l1diAuLi4uLi4uLi4uLi4uIHVzZSBzaGFycGVyIChhbmQgc2xvd2VyKSBSR0ItPllVViBjb252ZXJzaW9uCisgIC1wYXJ0aXRpb25fbGltaXQgPGludD4gLiBsaW1pdCBxdWFsaXR5IHRvIGZpdCB0aGUgNTEyayBsaW1pdCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IHBhcnRpdGlvbiAoMD1ubyBkZWdyYWRhdGlvbiAuLi4gMTAwPWZ1bGwpCisgIC1wYXNzIDxpbnQ+IC4uLi4uLi4uLi4uLiBhbmFseXNpcyBwYXNzIG51bWJlciAoMS4uMTApCisgIC1jcm9wIDx4PiA8eT4gPHc+IDxoPiAuLiBjcm9wIHBpY3R1cmUgd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlCisgIC1yZXNpemUgPHc+IDxoPiAuLi4uLi4uLiByZXNpemUgcGljdHVyZSAoYWZ0ZXIgYW55IGNyb3BwaW5nKQorICAtbXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZyBpZiBhdmFpbGFibGUKKyAgLWxvd19tZW1vcnkgLi4uLi4uLi4uLi4uIHJlZHVjZSBtZW1vcnkgdXNhZ2UgKHNsb3dlciBlbmNvZGluZykKKyAgLW1hcCA8aW50PiAuLi4uLi4uLi4uLi4uIHByaW50IG1hcCBvZiBleHRyYSBpbmZvCisgIC1wcmludF9wc25yIC4uLi4uLi4uLi4uLiBwcmludHMgYXZlcmFnZWQgUFNOUiBkaXN0b3J0aW9uCisgIC1wcmludF9zc2ltIC4uLi4uLi4uLi4uLiBwcmludHMgYXZlcmFnZWQgU1NJTSBkaXN0b3J0aW9uCisgIC1wcmludF9sc2ltIC4uLi4uLi4uLi4uLiBwcmludHMgbG9jYWwtc2ltaWxhcml0eSBkaXN0b3J0aW9uCisgIC1kIDxmaWxlLnBnbT4gLi4uLi4uLi4uLiBkdW1wIHRoZSBjb21wcmVzc2VkIG91dHB1dCAoUEdNIGZpbGUpCisgIC1hbHBoYV9tZXRob2QgPGludD4gLi4uLiB0cmFuc3BhcmVuY3ktY29tcHJlc3Npb24gbWV0aG9kICgwLi4xKSwgZGVmYXVsdD0xCisgIC1hbHBoYV9maWx0ZXIgPHN0cmluZz4gLiBwcmVkaWN0aXZlIGZpbHRlcmluZyBmb3IgYWxwaGEgcGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgb2Y6IG5vbmUsIGZhc3QgKGRlZmF1bHQpIG9yIGJlc3QKKyAgLWV4YWN0IC4uLi4uLi4uLi4uLi4uLi4uIHByZXNlcnZlIFJHQiB2YWx1ZXMgaW4gdHJhbnNwYXJlbnQgYXJlYSwgZGVmYXVsdD1vZmYKKyAgLWJsZW5kX2FscGhhIDxoZXg+IC4uLi4uIGJsZW5kIGNvbG9ycyBhZ2FpbnN0IGJhY2tncm91bmQgY29sb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cHJlc3NlZCBhcyBSR0IgdmFsdWVzIHdyaXR0ZW4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhleGFkZWNpbWFsLCBlLmcuIDB4YzBlMGQwIGZvciByZWQ9MHhjMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW49MHhlMCBhbmQgYmx1ZT0weGQwCisgIC1ub2FscGhhIC4uLi4uLi4uLi4uLi4uLiBkaXNjYXJkIGFueSB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24KKyAgLWxvc3NsZXNzIC4uLi4uLi4uLi4uLi4uIGVuY29kZSBpbWFnZSBsb3NzbGVzc2x5LCBkZWZhdWx0PW9mZgorICAtbmVhcl9sb3NzbGVzcyA8aW50PiAuLi4gdXNlIG5lYXItbG9zc2xlc3MgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXByb2Nlc3NpbmcgKDAuLjEwMD1vZmYpLCBkZWZhdWx0PTEwMAorICAtaGludCA8c3RyaW5nPiAuLi4uLi4uLi4gc3BlY2lmeSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MgaGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZjogcGhvdG8sIHBpY3R1cmUgb3IgZ3JhcGgKKworICAtbWV0YWRhdGEgPHN0cmluZz4gLi4uLi4gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZiBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgdmFsdWVzOiBhbGwsIG5vbmUgKGRlZmF1bHQpLCBleGlmLCBpY2MsIHhtcAorCisgIC1zaG9ydCAuLi4uLi4uLi4uLi4uLi4uLiBjb25kZW5zZSBwcmludGVkIG1lc3NhZ2UKKyAgLXF1aWV0IC4uLi4uLi4uLi4uLi4uLi4uIGRvbid0IHByaW50IGFueXRoaW5nCisgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAtbm9hc20gLi4uLi4uLi4uLi4uLi4uLi4gZGlzYWJsZSBhbGwgYXNzZW1ibHkgb3B0aW1pemF0aW9ucworICAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZSwgZS5nLiBwcmludCBlbmNvZGluZy9kZWNvZGluZyB0aW1lcworICAtcHJvZ3Jlc3MgLi4uLi4uLi4uLi4uLi4gcmVwb3J0IGVuY29kaW5nIHByb2dyZXNzCisKK0V4cGVyaW1lbnRhbCBPcHRpb25zOgorICAtanBlZ19saWtlIC4uLi4uLi4uLi4uLi4gcm91Z2hseSBtYXRjaCBleHBlY3RlZCBKUEVHIHNpemUKKyAgLWFmIC4uLi4uLi4uLi4uLi4uLi4uLi4uIGF1dG8tYWRqdXN0IGZpbHRlciBzdHJlbmd0aAorICAtcHJlIDxpbnQ+IC4uLi4uLi4uLi4uLi4gcHJlLXByb2Nlc3NpbmcgZmlsdGVyCisKK1RoZSBtYWluIG9wdGlvbnMgeW91IG1pZ2h0IHdhbnQgdG8gdHJ5IGluIG9yZGVyIHRvIGZ1cnRoZXIgdHVuZSB0aGUKK3Zpc3VhbCBxdWFsaXR5IGFyZToKKyAtcHJlc2V0CisgLXNucworIC1mCisgLW0KKworTmFtZWx5OgorICAqICdwcmVzZXQnIHdpbGwgc2V0IHVwIGEgZGVmYXVsdCBlbmNvZGluZyBjb25maWd1cmF0aW9uIHRhcmdldGluZyBhCisgICAgIHBhcnRpY3VsYXIgdHlwZSBvZiBpbnB1dC4gSXQgc2hvdWxkIGFwcGVhciBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zLAorICAgICBzbyB0aGF0IHN1YnNlcXVlbnQgb3B0aW9ucyBjYW4gdGFrZSBlZmZlY3Qgb24gdG9wIG9mIHRoaXMgcHJlc2V0LgorICAgICBEZWZhdWx0IHZhbHVlIGlzICdkZWZhdWx0Jy4KKyAgKiAnc25zJyB3aWxsIHByb2dyZXNzaXZlbHkgdHVybiBvbiAod2hlbiBnb2luZyBmcm9tIDAgdG8gMTAwKSBzb21lIGFkZGl0aW9uYWwKKyAgICAgdmlzdWFsIG9wdGltaXphdGlvbnMgKGxpa2U6IHNlZ21lbnRhdGlvbiBtYXAgcmUtZW5mb3JjZW1lbnQpLiBUaGlzIG9wdGlvbgorICAgICB3aWxsIGJhbGFuY2UgdGhlIGJpdCBhbGxvY2F0aW9uIGRpZmZlcmVudGx5LiBJdCB0cmllcyB0byB0YWtlIGJpdHMgZnJvbSB0aGUKKyAgICAgImVhc3kiIHBhcnRzIG9mIHRoZSBwaWN0dXJlIGFuZCB1c2UgdGhlbSBpbiB0aGUgImRpZmZpY3VsdCIgb25lcyBpbnN0ZWFkLgorICAgICBVc3VhbGx5LCByYWlzaW5nIHRoZSBzbnMgdmFsdWUgKGF0IGZpeGVkIC1xIHZhbHVlKSBsZWFkcyB0byBsYXJnZXIgZmlsZXMsCisgICAgIGJ1dCB3aXRoIGJldHRlciBxdWFsaXR5LgorICAgICBUeXBpY2FsIHZhbHVlIGlzIGFyb3VuZCAnNzUnLgorICAqICdmJyBvcHRpb24gZGlyZWN0bHkgbGlua3MgdG8gdGhlIGZpbHRlcmluZyBzdHJlbmd0aCB1c2VkIGJ5IHRoZSBjb2RlYydzCisgICAgIGluLWxvb3AgcHJvY2Vzc2luZy4gVGhlIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBzbW9vdGhlciB0aGUKKyAgICAgaGlnaGx5LWNvbXByZXNzZWQgYXJlYSB3aWxsIGxvb2suIFRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCB3aGVuIGFpbWluZworICAgICBhdCB2ZXJ5IHNtYWxsIGZpbGVzLiBUeXBpY2FsIHZhbHVlcyBhcmUgYXJvdW5kIDIwLTMwLiBOb3RlIHRoYXQgdXNpbmcgdGhlCisgICAgIG9wdGlvbiAtc3Ryb25nLy1ub3N0cm9uZyB3aWxsIGNoYW5nZSB0aGUgdHlwZSBvZiBmaWx0ZXJpbmcuIFVzZSAiLWYgMCIgdG8KKyAgICAgdHVybiBmaWx0ZXJpbmcgb2ZmLgorICAqICdtJyBjb250cm9scyB0aGUgdHJhZGUtb2ZmIGJldHdlZW4gZW5jb2Rpbmcgc3BlZWQgYW5kIHF1YWxpdHkuIERlZmF1bHQgaXMgNC4KKyAgICAgWW91IGNhbiB0cnkgLW0gNSBvciAtbSA2IHRvIGV4cGxvcmUgbW9yZSAodGltZS1jb25zdW1pbmcpIGVuY29kaW5nCisgICAgIHBvc3NpYmlsaXRpZXMuIEEgbG93ZXIgdmFsdWUgd2lsbCByZXN1bHQgaW4gZmFzdGVyIGVuY29kaW5nIGF0IHRoZSBleHBlbnNlCisgICAgIG9mIHF1YWxpdHkuCisKK0RlY29kaW5nIHRvb2w6Cis9PT09PT09PT09PT09PQorCitUaGVyZSBpcyBhIGRlY29kaW5nIHNhbXBsZSBpbiBleGFtcGxlcy9kd2VicC5jIHdoaWNoIHdpbGwgdGFrZQorYSAud2VicCBmaWxlIGFuZCBkZWNvZGUgaXQgdG8gYSBQTkcgaW1hZ2UgZmlsZSAoYW1vbmdzdCBvdGhlciBmb3JtYXRzKS4KK1RoaXMgaXMgc2ltcGx5IHRvIGRlbW9uc3RyYXRlIHRoZSB1c2Ugb2YgdGhlIEFQSS4gWW91IGNhbiB2ZXJpZnkgdGhlCitmaWxlIHRlc3Qud2VicCBkZWNvZGVzIHRvIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGVzdF9yZWYucHBtIGJ5IHVzaW5nOgorCisgY2QgZXhhbXBsZXMKKyAuL2R3ZWJwIHRlc3Qud2VicCAtcHBtIC1vIHRlc3QucHBtCisgZGlmZiB0ZXN0LnBwbSB0ZXN0X3JlZi5wcG0KKworVGhlIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGlzIGF2YWlsYWJsZSB1c2luZyAtaDoKKworPiBkd2VicCAtaAorVXNhZ2U6IGR3ZWJwIGluX2ZpbGUgW29wdGlvbnNdIFstbyBvdXRfZmlsZV0KKworRGVjb2RlcyB0aGUgV2ViUCBpbWFnZSBmaWxlIHRvIFBORyBmb3JtYXQgW0RlZmF1bHRdCitVc2UgZm9sbG93aW5nIG9wdGlvbnMgdG8gY29udmVydCBpbnRvIGFsdGVybmF0ZSBpbWFnZSBmb3JtYXRzOgorICAtcGFtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgUkdCQSBzYW1wbGVzIGFzIGEgY29sb3IgUEFNCisgIC1wcG0gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBSR0Igc2FtcGxlcyBhcyBhIGNvbG9yIFBQTQorICAtYm1wIC4uLi4uLi4uLiBzYXZlIGFzIHVuY29tcHJlc3NlZCBCTVAgZm9ybWF0CisgIC10aWZmIC4uLi4uLi4uIHNhdmUgYXMgdW5jb21wcmVzc2VkIFRJRkYgZm9ybWF0CisgIC1wZ20gLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBZVVYgc2FtcGxlcyBhcyBhIGdyYXlzY2FsZSBQR00KKyAgICAgICAgICAgICAgICAgZmlsZSB3aXRoIElNQzQgbGF5b3V0CisgIC15dXYgLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBZVVYgc2FtcGxlcyBpbiBmbGF0IGxheW91dAorCisgT3RoZXIgb3B0aW9ucyBhcmU6CisgIC12ZXJzaW9uIC4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisgIC1ub2ZhbmN5IC4uLi4uIGRvbid0IHVzZSB0aGUgZmFuY3kgWVVWNDIwIHVwc2NhbGVyCisgIC1ub2ZpbHRlciAuLi4uIGRpc2FibGUgaW4tbG9vcCBmaWx0ZXJpbmcKKyAgLW5vZGl0aGVyIC4uLi4gZGlzYWJsZSBkaXRoZXJpbmcKKyAgLWRpdGhlciA8ZD4gLi4gZGl0aGVyaW5nIHN0cmVuZ3RoIChpbiAwLi4xMDApCisgIC1hbHBoYV9kaXRoZXIgIHVzZSBhbHBoYS1wbGFuZSBkaXRoZXJpbmcgaWYgbmVlZGVkCisgIC1tdCAuLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcKKyAgLWNyb3AgPHg+IDx5PiA8dz4gPGg+IC4uLiBjcm9wIG91dHB1dCB3aXRoIHRoZSBnaXZlbiByZWN0YW5nbGUKKyAgLXJlc2l6ZSA8dz4gPGg+IC4uLi4uLi4uLiBzY2FsZSB0aGUgb3V0cHV0ICgqYWZ0ZXIqIGFueSBjcm9wcGluZykKKyAgLWZsaXAgLi4uLi4uLi4gZmxpcCB0aGUgb3V0cHV0IHZlcnRpY2FsbHkKKyAgLWFscGhhIC4uLi4uLi4gb25seSBzYXZlIHRoZSBhbHBoYSBwbGFuZQorICAtaW5jcmVtZW50YWwgLiB1c2UgaW5jcmVtZW50YWwgZGVjb2RpbmcgKHVzZWZ1bCBmb3IgdGVzdHMpCisgIC1oIC4uLi4uLi4uLi4uIHRoaXMgaGVscCBtZXNzYWdlCisgIC12IC4uLi4uLi4uLi4uIHZlcmJvc2UgKGUuZy4gcHJpbnQgZW5jb2RpbmcvZGVjb2RpbmcgdGltZXMpCisgIC1xdWlldCAuLi4uLi4uIHF1aWV0IG1vZGUsIGRvbid0IHByaW50IGFueXRoaW5nCisgIC1ub2FzbSAuLi4uLi4uIGRpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnMKKworV2ViUCBmaWxlIGFuYWx5c2lzIHRvb2w6Cis9PT09PT09PT09PT09PT09PT09PT09PT0KKworJ3dlYnBpbmZvJyBjYW4gYmUgdXNlZCB0byBwcmludCBvdXQgdGhlIGNodW5rIGxldmVsIHN0cnVjdHVyZSBhbmQgYml0c3RyZWFtCitoZWFkZXIgaW5mb3JtYXRpb24gb2YgV2ViUCBmaWxlcy4gSXQgY2FuIGFsc28gY2hlY2sgaWYgdGhlIGZpbGVzIGFyZSBvZiB2YWxpZAorV2ViUCBmb3JtYXQuCisKK1VzYWdlOiB3ZWJwaW5mbyBbb3B0aW9uc10gaW5fZmlsZXMKK05vdGU6IHRoZXJlIGNvdWxkIGJlIG11bHRpcGxlIGlucHV0IGZpbGVzOworICAgICAgb3B0aW9ucyBtdXN0IGNvbWUgYmVmb3JlIGlucHV0IGZpbGVzLgorT3B0aW9uczoKKyAgLXZlcnNpb24gLi4uLi4uLi4uLi4gUHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQuCisgIC1xdWlldCAuLi4uLi4uLi4uLi4uIERvIG5vdCBzaG93IGNodW5rIHBhcnNpbmcgaW5mb3JtYXRpb24uCisgIC1kaWFnIC4uLi4uLi4uLi4uLi4uIFNob3cgcGFyc2luZyBlcnJvciBkaWFnbm9zaXMuCisgIC1zdW1tYXJ5IC4uLi4uLi4uLi4uIFNob3cgY2h1bmsgc3RhdHMgc3VtbWFyeS4KKyAgLWJpdHN0cmVhbV9pbmZvIC4uLi4gUGFyc2UgYml0c3RyZWFtIGhlYWRlci4KKworVmlzdWFsaXphdGlvbiB0b29sOgorPT09PT09PT09PT09PT09PT09PQorCitUaGVyZSdzIGEgbGl0dGxlIHNlbGYtc2VydmUgdmlzdWFsaXphdGlvbiB0b29sIGNhbGxlZCAndndlYnAnIHVuZGVyIHRoZQorZXhhbXBsZXMvIGRpcmVjdG9yeS4gSXQgdXNlcyBPcGVuR0wgdG8gb3BlbiBhIHNpbXBsZSBkcmF3aW5nIHdpbmRvdyBhbmQgc2hvdworYSBkZWNvZGVkIFdlYlAgZmlsZS4gSXQncyBub3QgeWV0IGludGVncmF0ZWQgaW4gdGhlIGF1dG9tYWtlIGJ1aWxkIHN5c3RlbSwgYnV0Cit5b3UgY2FuIHRyeSB0byBtYW51YWxseSBjb21waWxlIGl0IHVzaW5nIHRoZSByZWNvbW1lbmRhdGlvbnMgYmVsb3cuCisKK1VzYWdlOiB2d2VicCBpbl9maWxlIFtvcHRpb25zXQorCitEZWNvZGVzIHRoZSBXZWJQIGltYWdlIGZpbGUgYW5kIHZpc3VhbGl6ZSBpdCB1c2luZyBPcGVuR0wKK09wdGlvbnMgYXJlOgorICAtdmVyc2lvbiAuLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAtbm9pY2MgLi4uLi4uLiBkb24ndCB1c2UgdGhlIGljYyBwcm9maWxlIGlmIHByZXNlbnQKKyAgLW5vZmFuY3kgLi4uLi4gZG9uJ3QgdXNlIHRoZSBmYW5jeSBZVVY0MjAgdXBzY2FsZXIKKyAgLW5vZmlsdGVyIC4uLi4gZGlzYWJsZSBpbi1sb29wIGZpbHRlcmluZworICAtZGl0aGVyIDxpbnQ+ICBkaXRoZXJpbmcgc3RyZW5ndGggKDAuLjEwMCksIGRlZmF1bHQ9NTAKKyAgLW5vYWxwaGFkaXRoZXIgZGlzYWJsZSBhbHBoYSBwbGFuZSBkaXRoZXJpbmcKKyAgLW10IC4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZworICAtaW5mbyAuLi4uLi4uLiBwcmludCBpbmZvCisgIC1oIC4uLi4uLi4uLi4uIHRoaXMgaGVscCBtZXNzYWdlCisKK0tleWJvYXJkIHNob3J0Y3V0czoKKyAgJ2MnIC4uLi4uLi4uLi4uLi4uLi4gdG9nZ2xlIHVzZSBvZiBjb2xvciBwcm9maWxlCisgICdpJyAuLi4uLi4uLi4uLi4uLi4uIG92ZXJsYXkgZmlsZSBpbmZvcm1hdGlvbgorICAnZCcgLi4uLi4uLi4uLi4uLi4uLiBkaXNhYmxlIGJsZW5kaW5nICYgZGlzcG9zYWwgKGRlYnVnKQorICAncScgLyAnUScgLyBFU0MgLi4uLiBxdWl0CisKK0J1aWxkaW5nOgorLS0tLS0tLS0tCisKK1ByZXJlcXVpc2l0ZXM6CisxKSBPcGVuR0wgJiBPcGVuR0wgVXRpbGl0eSBUb29sa2l0IChHTFVUKQorICBMaW51eDoKKyAgICAkIHN1ZG8gYXB0LWdldCBpbnN0YWxsIGZyZWVnbHV0My1kZXYgbWVzYS1jb21tb24tZGV2CisgIE1hYyArIFhDb2RlOgorICAgIC0gVGhlc2UgbGlicmFyaWVzIHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIE9wZW5HTCAvIEdMVVQgZnJhbWV3b3Jrcy4KKyAgV2luZG93czoKKyAgICBodHRwOi8vZnJlZWdsdXQuc291cmNlZm9yZ2UubmV0L2luZGV4LnBocCNkb3dubG9hZAorCisyKSAoT3B0aW9uYWwpIHFjbXMgKFF1aWNrIENvbG9yIE1hbmFnZW1lbnQgU3lzdGVtKQorICBpLiBEb3dubG9hZCBxY21zIGZyb20gTW96aWxsYSAvIENocm9taXVtOgorICAgIGh0dHA6Ly9oZy5tb3ppbGxhLm9yZy9tb3ppbGxhLWNlbnRyYWwvZmlsZS8wZTc2MzllM2JkZmIvZ2Z4L3FjbXMKKyAgICBodHRwOi8vc3JjLmNocm9taXVtLm9yZy92aWV3dmMvY2hyb21lL3RydW5rL3NyYy90aGlyZF9wYXJ0eS9xY21zCisgIGlpLiBCdWlsZCBhbmQgYXJjaGl2ZSB0aGUgc291cmNlIGZpbGVzIGFzIGxpYnFjbXMuYSAvIHFjbXMubGliCisgIGlpaS4gVXBkYXRlIG1ha2VmaWxlLnVuaXggLyBNYWtlZmlsZS52YworICAgIGEpIERlZmluZSBXRUJQX0hBVkVfUUNNUworICAgIGIpIFVwZGF0ZSBpbmNsdWRlIC8gbGlicmFyeSBwYXRocyB0byByZWZlcmVuY2UgdGhlIHFjbXMgZGlyZWN0b3J5LgorCitCdWlsZCB1c2luZyBtYWtlZmlsZS51bml4IC8gTWFrZWZpbGUudmM6CiskIG1ha2UgLWYgbWFrZWZpbGUudW5peCBleGFtcGxlcy92d2VicAorPiBubWFrZSAvZiBNYWtlZmlsZS52YyBDRkc9cmVsZWFzZS1zdGF0aWMgXAorICAgIC4uL29iai94NjQvcmVsZWFzZS1zdGF0aWMvYmluL3Z3ZWJwLmV4ZQorCitBbmltYXRpb24gY3JlYXRpb24gdG9vbDoKKz09PT09PT09PT09PT09PT09PT09PT09PQorVGhlIHV0aWxpdHkgJ2ltZzJ3ZWJwJyBjYW4gdHVybiBhIHNlcXVlbmNlIG9mIGlucHV0IGltYWdlcyAoUE5HLCBKUEVHLCAuLi4pCitpbnRvIGFuIGFuaW1hdGVkIFdlYlAgZmlsZS4gSXQgb2ZmZXJzIGZpbmUgY29udHJvbCBvdmVyIGR1cmF0aW9uLCBlbmNvZGluZworbW9kZXMsIGV0Yy4KKworVXNhZ2U6CisKKyAgaW1nMndlYnAgW2ZpbGUtbGV2ZWwgb3B0aW9uc10gW2ltYWdlIGZpbGVzLi4uXSBbcGVyLWZyYW1lIG9wdGlvbnMuLi5dCisKK0ZpbGUtbGV2ZWwgb3B0aW9ucyAob25seSB1c2VkIGF0IHRoZSBzdGFydCBvZiBjb21wcmVzc2lvbik6CisgLW1pbl9zaXplIC4uLi4uLi4uLi4uLiBtaW5pbWl6ZSBzaXplCisgLWxvb3AgPGludD4gLi4uLi4uLi4uLiBsb29wIGNvdW50IChkZWZhdWx0OiAwLCA9IGluZmluaXRlIGxvb3ApCisgLWttYXggPGludD4gLi4uLi4uLi4uLiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZSBiZXR3ZWVuIGtleS1mcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICgwPW9ubHkga2V5ZnJhbWVzKQorIC1rbWluIDxpbnQ+IC4uLi4uLi4uLi4gbWluaW11bSBudW1iZXIgb2YgZnJhbWUgYmV0d2VlbiBrZXktZnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAoMD1kaXNhYmxlIGtleS1mcmFtZXMgYWx0b2dldGhlcikKKyAtbWl4ZWQgLi4uLi4uLi4uLi4uLi4uIHVzZSBtaXhlZCBsb3NzeS9sb3NzbGVzcyBhdXRvbWF0aWMgbW9kZQorIC12IC4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZSBtb2RlCisgLWggLi4uLi4uLi4uLi4uLi4uLi4uLiB0aGlzIGhlbHAKKyAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0CisKK1Blci1mcmFtZSBvcHRpb25zIChvbmx5IHVzZWQgZm9yIHN1YnNlcXVlbnQgaW1hZ2VzIGlucHV0KToKKyAtZCA8aW50PiAuLi4uLi4uLi4uLi4uIGZyYW1lIGR1cmF0aW9uIGluIG1zIChkZWZhdWx0OiAxMDApCisgLWxvc3NsZXNzICAuLi4uLi4uLi4uLiB1c2UgbG9zc2xlc3MgbW9kZSAoZGVmYXVsdCkKKyAtbG9zc3kgLi4uIC4uLi4uLi4uLi4uIHVzZSBsb3NzeSBtb2RlCisgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLiBxdWFsaXR5CisgLW0gPGludD4gLi4uLi4uLi4uLi4uLiBtZXRob2QgdG8gdXNlCisKK2V4YW1wbGU6IGltZzJ3ZWJwIC1sb29wIDIgaW4wLnBuZyAtbG9zc3kgaW4xLmpwZworICAgICAgICAgICAgICAgICAgLWQgODAgaW4yLnRpZmYgLW8gb3V0LndlYnAKKworQW5pbWF0ZWQgR0lGIGNvbnZlcnNpb246Cis9PT09PT09PT09PT09PT09PT09PT09PT0KK0FuaW1hdGVkIEdJRiBmaWxlcyBjYW4gYmUgY29udmVydGVkIHRvIFdlYlAgZmlsZXMgd2l0aCBhbmltYXRpb24gdXNpbmcgdGhlCitnaWYyd2VicCB1dGlsaXR5IGF2YWlsYWJsZSB1bmRlciBleGFtcGxlcy8uIFRoZSBmaWxlcyBjYW4gdGhlbiBiZSB2aWV3ZWQgdXNpbmcKK3Z3ZWJwLgorCitVc2FnZToKKyBnaWYyd2VicCBbb3B0aW9uc10gZ2lmX2ZpbGUgLW8gd2VicF9maWxlCitPcHRpb25zOgorICAtaCAvIC1oZWxwIC4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwCisgIC1sb3NzeSAuLi4uLi4uLi4uLi4uLi4uLiBlbmNvZGUgaW1hZ2UgdXNpbmcgbG9zc3kgY29tcHJlc3Npb24KKyAgLW1peGVkIC4uLi4uLi4uLi4uLi4uLi4uIGZvciBlYWNoIGZyYW1lIGluIHRoZSBpbWFnZSwgcGljayBsb3NzeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbG9zc2xlc3MgY29tcHJlc3Npb24gaGV1cmlzdGljYWxseQorICAtcSA8ZmxvYXQ+IC4uLi4uLi4uLi4uLi4gcXVhbGl0eSBmYWN0b3IgKDA6c21hbGwuLjEwMDpiaWcpCisgIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBjb21wcmVzc2lvbiBtZXRob2QgKDA9ZmFzdCwgNj1zbG93ZXN0KQorICAtbWluX3NpemUgLi4uLi4uLi4uLi4uLi4gbWluaW1pemUgb3V0cHV0IHNpemUgKGRlZmF1bHQ6b2ZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9zc2xlc3MgY29tcHJlc3Npb24gYnkgZGVmYXVsdDsgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCB3aXRoIC1xLCAtbSwgLWxvc3N5IG9yIC1taXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucworICAta21pbiA8aW50PiAuLi4uLi4uLi4uLi4gbWluIGRpc3RhbmNlIGJldHdlZW4ga2V5IGZyYW1lcworICAta21heCA8aW50PiAuLi4uLi4uLi4uLi4gbWF4IGRpc3RhbmNlIGJldHdlZW4ga2V5IGZyYW1lcworICAtZiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gZmlsdGVyIHN0cmVuZ3RoICgwPW9mZi4uMTAwKQorICAtbWV0YWRhdGEgPHN0cmluZz4gLi4uLi4gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHkgZnJvbSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dCBpZiBwcmVzZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCB2YWx1ZXM6IGFsbCwgbm9uZSwgaWNjLCB4bXAgKGRlZmF1bHQpCisgIC1sb29wX2NvbXBhdGliaWxpdHkgLi4uLiB1c2UgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBDaHJvbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gcHJpb3IgdG8gTTYyIChpbmNsdXNpdmUpCisgIC1tdCAuLi4uLi4uLi4uLi4uLi4uLi4uLiB1c2UgbXVsdGktdGhyZWFkaW5nIGlmIGF2YWlsYWJsZQorCisgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorICAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZQorICAtcXVpZXQgLi4uLi4uLi4uLi4uLi4uLi4gZG9uJ3QgcHJpbnQgYW55dGhpbmcKKworQnVpbGRpbmc6CistLS0tLS0tLS0KK1dpdGggdGhlIGxpYmdpZiBkZXZlbG9wbWVudCBmaWxlcyBpbnN0YWxsZWQsIGdpZjJ3ZWJwIGNhbiBiZSBidWlsdCB1c2luZworbWFrZWZpbGUudW5peDoKKyQgbWFrZSAtZiBtYWtlZmlsZS51bml4IGV4YW1wbGVzL2dpZjJ3ZWJwCisKK29yIHVzaW5nIGF1dG9jb25mOgorJCAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1ldmVyeXRoaW5nCiskIG1ha2UKKworQ29tcGFyaXNvbiBvZiBhbmltYXRlZCBpbWFnZXM6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK1Rlc3QgdXRpbGl0eSBhbmltX2RpZmYgdW5kZXIgZXhhbXBsZXMvIGNhbiBiZSB1c2VkIHRvIGNvbXBhcmUgdHdvIGFuaW1hdGVkCitpbWFnZXMgKGVhY2ggY2FuIGJlIEdJRiBvciBXZWJQKS4KKworVXNhZ2U6IGFuaW1fZGlmZiA8aW1hZ2UxPiA8aW1hZ2UyPiBbb3B0aW9uc10KKworT3B0aW9uczoKKyAgLWR1bXBfZnJhbWVzIDxmb2xkZXI+IGR1bXAgZGVjb2RlZCBmcmFtZXMgaW4gUEFNIGZvcm1hdAorICAtbWluX3BzbnIgPGZsb2F0PiAuLi4gbWluaW11bSBwZXItZnJhbWUgUFNOUgorICAtcmF3X2NvbXBhcmlzb24gLi4uLi4gaWYgdGhpcyBmbGFnIGlzIG5vdCB1c2VkLCBSR0IgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZW11bHRpcGxpZWQgYmVmb3JlIGNvbXBhcmlzb24KKyAgLW1heF9kaWZmIDxpbnQ+IC4uLi4uIG1heGltdW0gYWxsb3dlZCBkaWZmZXJlbmNlIHBlciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGNvcnJlc3BvbmRpbmcgcGl4ZWxzIGluIHN1YnNlcXVlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lcworICAtaCAuLi4uLi4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwCisgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdAorCitCdWlsZGluZzoKKy0tLS0tLS0tLQorV2l0aCB0aGUgbGliZ2lmIGRldmVsb3BtZW50IGZpbGVzIGFuZCBhIEMrKyBjb21waWxlciBpbnN0YWxsZWQsIGFuaW1fZGlmZiBjYW4KK2JlIGJ1aWx0IHVzaW5nIG1ha2VmaWxlLnVuaXg6CiskIG1ha2UgLWYgbWFrZWZpbGUudW5peCBleGFtcGxlcy9hbmltX2RpZmYKKworb3IgdXNpbmcgYXV0b2NvbmY6CiskIC4vY29uZmlndXJlIC0tZW5hYmxlLWV2ZXJ5dGhpbmcKKyQgbWFrZQorCitFbmNvZGluZyBBUEk6Cis9PT09PT09PT09PT09CisKK1RoZSBtYWluIGVuY29kaW5nIGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGluIHRoZSBoZWFkZXIgc3JjL3dlYnAvZW5jb2RlLmgKK1RoZSByZWFkeS10by11c2Ugb25lcyBhcmU6CitzaXplX3QgV2ViUEVuY29kZVJHQihjb25zdCB1aW50OF90KiByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZUJHUkEoY29uc3QgdWludDhfdCogYmdyYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKKworVGhleSB3aWxsIGNvbnZlcnQgcmF3IFJHQiBzYW1wbGVzIHRvIGEgV2ViUCBkYXRhLiBUaGUgb25seSBjb250cm9sIHN1cHBsaWVkCitpcyB0aGUgcXVhbGl0eSBmYWN0b3IuCisKK1RoZXJlIGFyZSBzb21lIHZhcmlhbnRzIGZvciB1c2luZyB0aGUgbG9zc2xlc3MgZm9ybWF0OgorCitzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzUkdCKGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90Kiogb3V0cHV0KTsKK3NpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NCR1IoY29uc3QgdWludDhfdCogYmdyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqKiBvdXRwdXQpOworc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCoqIG91dHB1dCk7CitzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90Kiogb3V0cHV0KTsKKworT2YgY291cnNlIGluIHRoaXMgY2FzZSwgbm8gcXVhbGl0eSBmYWN0b3IgaXMgbmVlZGVkIHNpbmNlIHRoZSBjb21wcmVzc2lvbgorb2NjdXJzIHdpdGhvdXQgbG9zcyBvZiB0aGUgaW5wdXQgdmFsdWVzLCBhdCB0aGUgZXhwZW5zZSBvZiBsYXJnZXIgb3V0cHV0IHNpemVzLgorCitBZHZhbmNlZCBlbmNvZGluZyBBUEk6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgbW9yZSBhZHZhbmNlZCBBUEkgaXMgYmFzZWQgb24gdGhlIFdlYlBDb25maWcgYW5kIFdlYlBQaWN0dXJlIHN0cnVjdHVyZXMuCisKK1dlYlBDb25maWcgY29udGFpbnMgdGhlIGVuY29kaW5nIHNldHRpbmdzIGFuZCBpcyBub3QgdGllZCB0byBhIHBhcnRpY3VsYXIKK3BpY3R1cmUuCitXZWJQUGljdHVyZSBjb250YWlucyBpbnB1dCBkYXRhLCBvbiB3aGljaCBzb21lIFdlYlBDb25maWcgd2lsbCBiZSB1c2VkIGZvcgorY29tcHJlc3Npb24uCitUaGUgZW5jb2RpbmcgZmxvdyBsb29rcyBsaWtlOgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTiBQU0VVRE8gRVhBTVBMRQorCisjaW5jbHVkZSA8d2VicC9lbmNvZGUuaD4KKworICAvLyBTZXR1cCBhIGNvbmZpZywgc3RhcnRpbmcgZm9ybSBhIHByZXNldCBhbmQgdHVuaW5nIHNvbWUgYWRkaXRpb25hbAorICAvLyBwYXJhbWV0ZXJzCisgIFdlYlBDb25maWcgY29uZmlnOworICBpZiAoIVdlYlBDb25maWdQcmVzZXQoJmNvbmZpZywgV0VCUF9QUkVTRVRfUEhPVE8sIHF1YWxpdHlfZmFjdG9yKSkKKyAgICByZXR1cm4gMDsgICAvLyB2ZXJzaW9uIGVycm9yCisgIH0KKyAgLy8gLi4uIGFkZGl0aW9uYWwgdHVuaW5nCisgIGNvbmZpZy5zbnNfc3RyZW5ndGggPSA5MDsKKyAgY29uZmlnLmZpbHRlcl9zaGFycG5lc3MgPSA2OworICBjb25maWdfZXJyb3IgPSBXZWJQVmFsaWRhdGVDb25maWcoJmNvbmZpZyk7ICAvLyBub3QgbWFuZGF0b3J5LCBidXQgdXNlZnVsCisKKyAgLy8gU2V0dXAgdGhlIGlucHV0IGRhdGEKKyAgV2ViUFBpY3R1cmUgcGljOworICBpZiAoIVdlYlBQaWN0dXJlSW5pdCgmcGljKSkgeworICAgIHJldHVybiAwOyAgLy8gdmVyc2lvbiBlcnJvcgorICB9CisgIHBpYy53aWR0aCA9IHdpZHRoOworICBwaWMuaGVpZ2h0ID0gaGVpZ2h0OworICAvLyBhbGxvY2F0ZWQgcGljdHVyZSBvZiBkaW1lbnNpb24gd2lkdGggeCBoZWlnaHQKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jYXRlKCZwaWMpKSB7CisgICAgcmV0dXJuIDA7ICAgLy8gbWVtb3J5IGVycm9yCisgIH0KKyAgLy8gYXQgdGhpcyBwb2ludCwgJ3BpYycgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYXMgYSBjb250YWluZXIsCisgIC8vIGFuZCBjYW4gcmVjZWl2ZSB0aGUgWS9VL1Ygc2FtcGxlcy4KKyAgLy8gQWx0ZXJuYXRpdmVseSwgb25lIGNvdWxkIHVzZSByZWFkeS1tYWRlIGltcG9ydCBmdW5jdGlvbnMgbGlrZQorICAvLyBXZWJQUGljdHVyZUltcG9ydFJHQigpLCB3aGljaCB3aWxsIHRha2UgY2FyZSBvZiBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgLy8gSW4gYW55IGNhc2UsIHBhc3QgdGhpcyBwb2ludCwgb25lIHdpbGwgaGF2ZSB0byBjYWxsCisgIC8vIFdlYlBQaWN0dXJlRnJlZSgmcGljKSB0byByZWNsYWltIG1lbW9yeS4KKworICAvLyBTZXQgdXAgYSBieXRlLW91dHB1dCB3cml0ZSBtZXRob2QuIFdlYlBNZW1vcnlXcml0ZXIsIGZvciBpbnN0YW5jZS4KKyAgV2ViUE1lbW9yeVdyaXRlciB3cnQ7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZ3cnQpOyAgICAgLy8gaW5pdGlhbGl6ZSAnd3J0JworCisgIHBpYy53cml0ZXIgPSBNeUZpbGVXcml0ZXI7CisgIHBpYy5jdXN0b21fcHRyID0gbXlfb3BhcXVlX3N0cnVjdHVyZV90b19tYWtlX015RmlsZVdyaXRlcl93b3JrOworCisgIC8vIENvbXByZXNzIQorICBpbnQgb2sgPSBXZWJQRW5jb2RlKCZjb25maWcsICZwaWMpOyAgIC8vIG9rID0gMCA9PiBlcnJvciBvY2N1cnJlZCEKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWMpOyAgLy8gbXVzdCBiZSBjYWxsZWQgaW5kZXBlbmRlbnRseSBvZiB0aGUgJ29rJyByZXN1bHQuCisKKyAgLy8gb3V0cHV0IGRhdGEgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGJ5IHRoZSB3cml0ZXIgYXQgdGhhdCBwb2ludC4KKyAgLy8gLT4gY29tcHJlc3NlZCBkYXRhIGlzIHRoZSBtZW1vcnkgYnVmZmVyIGRlc2NyaWJlZCBieSB3cnQubWVtIC8gd3J0LnNpemUKKworICAvLyBkZWFsbG9jYXRlIHRoZSBtZW1vcnkgdXNlZCBieSBjb21wcmVzc2VkIGRhdGEKKyAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZ3cnQpOworCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKKworRGVjb2RpbmcgQVBJOgorPT09PT09PT09PT09PQorCitUaGlzIGlzIG1haW5seSBqdXN0IG9uZSBmdW5jdGlvbiB0byBjYWxsOgorCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKK3VpbnQ4X3QqIFdlYlBEZWNvZGVSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCitQbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIGZpbGUgc3JjL3dlYnAvZGVjb2RlLmggZm9yIHRoZSBkZXRhaWxzLgorVGhlcmUgYXJlIHZhcmlhbnRzIGZvciBkZWNvZGluZyBpbiBCR1IvUkdCQS9BUkdCL0JHUkEgb3JkZXIsIGFsb25nIHdpdGgKK2RlY29kaW5nIHRvIHJhdyBZJ0NiQ3Igc2FtcGxlcy4gT25lIGNhbiBhbHNvIGRlY29kZSB0aGUgaW1hZ2UgZGlyZWN0bHkgaW50byBhCitwcmUtYWxsb2NhdGVkIGJ1ZmZlci4KKworVG8gZGV0ZWN0IGEgV2ViUCBmaWxlIGFuZCBnYXRoZXIgdGhlIHBpY3R1cmUncyBkaW1lbnNpb25zLCB0aGUgZnVuY3Rpb246CisgIGludCBXZWJQR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworaXMgc3VwcGxpZWQuIE5vIGRlY29kaW5nIGlzIGludm9sdmVkIHdoZW4gdXNpbmcgaXQuCisKK0luY3JlbWVudGFsIGRlY29kaW5nIEFQSToKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworSW4gdGhlIGNhc2Ugd2hlbiBkYXRhIGlzIGJlaW5nIHByb2dyZXNzaXZlbHkgdHJhbnNtaXR0ZWQsIHBpY3R1cmVzIGNhbiBzdGlsbAorYmUgaW5jcmVtZW50YWxseSBkZWNvZGVkIHVzaW5nIGEgc2xpZ2h0bHkgbW9yZSBjb21wbGljYXRlZCBBUEkuIERlY29kZXIgc3RhdGUKK2lzIHN0b3JlZCBpbnRvIGFuIGluc3RhbmNlIG9mIHRoZSBXZWJQSURlY29kZXIgb2JqZWN0LiBUaGlzIG9iamVjdCBjYW4gYmUKK2NyZWF0ZWQgd2l0aCB0aGUgcHVycG9zZSBvZiBkZWNvZGluZyBlaXRoZXIgUkdCIG9yIFknQ2JDciBzYW1wbGVzLgorRm9yIGluc3RhbmNlOgorCisgIFdlYlBEZWNCdWZmZXIgYnVmZmVyOworICBXZWJQSW5pdERlY0J1ZmZlcigmYnVmZmVyKTsKKyAgYnVmZmVyLmNvbG9yc3BhY2UgPSBNT0RFX0JHUjsKKyAgLi4uCisgIFdlYlBJRGVjb2RlciogaWRlYyA9IFdlYlBJTmV3RGVjb2RlcigmYnVmZmVyKTsKKworQXMgZGF0YSBpcyBtYWRlIHByb2dyZXNzaXZlbHkgYXZhaWxhYmxlLCB0aGlzIGluY3JlbWVudGFsLWRlY29kZXIgb2JqZWN0CitjYW4gYmUgdXNlZCB0byBkZWNvZGUgdGhlIHBpY3R1cmUgZnVydGhlci4gVGhlcmUgYXJlIHR3byAobXV0dWFsbHkgZXhjbHVzaXZlKQord2F5cyB0byBwYXNzIGZyZXNobHkgYXJyaXZlZCBkYXRhOgorCitlaXRoZXIgYnkgYXBwZW5kaW5nIHRoZSBmcmVzaCBieXRlczoKKworICBXZWJQSUFwcGVuZChpZGVjLCBmcmVzaF9kYXRhLCBzaXplX29mX2ZyZXNoX2RhdGEpOworCitvciBieSBqdXN0IG1lbnRpb25pbmcgdGhlIG5ldyBzaXplIG9mIHRoZSB0cmFuc21pdHRlZCBkYXRhOgorCisgIFdlYlBJVXBkYXRlKGlkZWMsIGJ1ZmZlciwgc2l6ZV9vZl90cmFuc21pdHRlZF9idWZmZXIpOworCitOb3RlIHRoYXQgJ2J1ZmZlcicgY2FuIGJlIG1vZGlmaWVkIGJldHdlZW4gZWFjaCBjYWxsIHRvIFdlYlBJVXBkYXRlLCBpbgorcGFydGljdWxhciB3aGVuIHRoZSBidWZmZXIgaXMgcmVzaXplZCB0byBhY2NvbW1vZGF0ZSBsYXJnZXIgZGF0YS4KKworVGhlc2UgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIHRoZSBkZWNvZGluZyBzdGF0dXM6IGVpdGhlciBWUDhfU1RBVFVTX1NVU1BFTkRFRCBpZgorZGVjb2RpbmcgaXMgbm90IGZpbmlzaGVkIHlldCBvciBWUDhfU1RBVFVTX09LIHdoZW4gZGVjb2RpbmcgaXMgZG9uZS4gQW55IG90aGVyCitzdGF0dXMgaXMgYW4gZXJyb3IgY29uZGl0aW9uLgorCitUaGUgJ2lkZWMnIG9iamVjdCBtdXN0IGFsd2F5cyBiZSByZWxlYXNlZCAoZXZlbiB1cG9uIGFuIGVycm9yIGNvbmRpdGlvbikgYnkKK2NhbGxpbmc6IFdlYlBEZWxldGUoaWRlYykuCisKK1RvIHJldHJpZXZlIHBhcnRpYWxseSBkZWNvZGVkIHBpY3R1cmUgc2FtcGxlcywgb25lIG11c3QgdXNlIHRoZSBjb3JyZXNwb25kaW5nCittZXRob2Q6IFdlYlBJRGVjR2V0UkdCIG9yIFdlYlBJRGVjR2V0WVVWQS4KK0l0IHdpbGwgcmV0dXJuIHRoZSBsYXN0IGRpc3BsYXlhYmxlIHBpeGVsIHJvdy4KKworTGFzdGx5LCBub3RlIHRoYXQgZGVjb2RpbmcgY2FuIGFsc28gYmUgcGVyZm9ybWVkIGludG8gYSBwcmUtYWxsb2NhdGVkIHBpeGVsCitidWZmZXIuIFRoaXMgYnVmZmVyIG11c3QgYmUgcGFzc2VkIHdoZW4gY3JlYXRpbmcgYSBXZWJQSURlY29kZXIsIGNhbGxpbmcKK1dlYlBJTmV3UkdCKCkgb3IgV2ViUElOZXdZVVZBKCkuCisKK1BsZWFzZSBoYXZlIGEgbG9vayBhdCB0aGUgc3JjL3dlYnAvZGVjb2RlLmggaGVhZGVyIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKK0FkdmFuY2VkIERlY29kaW5nIEFQSToKKz09PT09PT09PT09PT09PT09PT09PT0KKworV2ViUCBkZWNvZGluZyBzdXBwb3J0cyBhbiBhZHZhbmNlZCBBUEkgd2hpY2ggcHJvdmlkZXMgb24tdGhlLWZseSBjcm9wcGluZyBhbmQKK3Jlc2NhbGluZywgc29tZXRoaW5nIG9mIGdyZWF0IHVzZWZ1bG5lc3Mgb24gbWVtb3J5LWNvbnN0cmFpbmVkIGVudmlyb25tZW50cyBsaWtlCittb2JpbGUgcGhvbmVzLiBCYXNpY2FsbHksIHRoZSBtZW1vcnkgdXNhZ2Ugd2lsbCBzY2FsZSB3aXRoIHRoZSBvdXRwdXQncyBzaXplLAorbm90IHRoZSBpbnB1dCdzLCB3aGVuIG9uZSBvbmx5IG5lZWRzIGEgcXVpY2sgcHJldmlldyBvciBhIHpvb21lZCBpbiBwb3J0aW9uIG9mCithbiBvdGhlcndpc2UgdG9vLWxhcmdlIHBpY3R1cmUuIFNvbWUgQ1BVIGNhbiBiZSBzYXZlZCB0b28sIGluY2lkZW50YWxseS4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQkVHSU4gUFNFVURPIEVYQU1QTEUKKyAgICAgLy8gQSkgSW5pdCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0CisgICAgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgICAgQ0hFQ0soV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpKTsKKworICAgICAvLyBCKSBvcHRpb25hbDogcmV0cmlldmUgdGhlIGJpdHN0cmVhbSdzIGZlYXR1cmVzLgorICAgICBDSEVDSyhXZWJQR2V0RmVhdHVyZXMoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnLmlucHV0KSA9PSBWUDhfU1RBVFVTX09LKTsKKworICAgICAvLyBDKSBBZGp1c3QgJ2NvbmZpZycgb3B0aW9ucywgaWYgbmVlZGVkCisgICAgIGNvbmZpZy5vcHRpb25zLm5vX2ZhbmN5X3Vwc2FtcGxpbmcgPSAxOworICAgICBjb25maWcub3B0aW9ucy51c2Vfc2NhbGluZyA9IDE7CisgICAgIGNvbmZpZy5vcHRpb25zLnNjYWxlZF93aWR0aCA9IHNjYWxlZFdpZHRoKCk7CisgICAgIGNvbmZpZy5vcHRpb25zLnNjYWxlZF9oZWlnaHQgPSBzY2FsZWRIZWlnaHQoKTsKKyAgICAgLy8gZXRjLgorCisgICAgIC8vIEQpIFNwZWNpZnkgJ2NvbmZpZycgb3V0cHV0IG9wdGlvbnMgZm9yIHNwZWNpZnlpbmcgb3V0cHV0IGNvbG9yc3BhY2UuCisgICAgIC8vIE9wdGlvbmFsbHkgdGhlIGV4dGVybmFsIGltYWdlIGRlY29kZSBidWZmZXIgY2FuIGFsc28gYmUgc3BlY2lmaWVkLgorICAgICBjb25maWcub3V0cHV0LmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7CisgICAgIC8vIE9wdGlvbmFsbHksIHRoZSBjb25maWcub3V0cHV0IGNhbiBiZSBwb2ludGVkIHRvIGFuIGV4dGVybmFsIGJ1ZmZlciBhcworICAgICAvLyB3ZWxsIGZvciBkZWNvZGluZyB0aGUgaW1hZ2UuIFRoaXMgZXh0ZXJuYWxseSBzdXBwbGllZCBtZW1vcnkgYnVmZmVyCisgICAgIC8vIHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIHN0b3JlIHRoZSBkZWNvZGVkIHBpY3R1cmUuCisgICAgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnJnYmEgPSAodWludDhfdCopIG1lbW9yeV9idWZmZXI7CisgICAgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnN0cmlkZSA9IHNjYW5saW5lX3N0cmlkZTsKKyAgICAgY29uZmlnLm91dHB1dC51LlJHQkEuc2l6ZSA9IHRvdGFsX3NpemVfb2ZfdGhlX21lbW9yeV9idWZmZXI7CisgICAgIGNvbmZpZy5vdXRwdXQuaXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKworICAgICAvLyBFKSBEZWNvZGUgdGhlIFdlYlAgaW1hZ2UuIFRoZXJlIGFyZSB0d28gdmFyaWFudHMgdy5yLnQgZGVjb2RpbmcgaW1hZ2UuCisgICAgIC8vIFRoZSBmaXJzdCBvbmUgKEUuMSkgZGVjb2RlcyB0aGUgZnVsbCBpbWFnZSBhbmQgdGhlIHNlY29uZCBvbmUgKEUuMikgaXMKKyAgICAgLy8gdXNlZCB0byBpbmNyZW1lbnRhbGx5IGRlY29kZSB0aGUgaW1hZ2UgdXNpbmcgc21hbGwgaW5wdXQgYnVmZmVycy4KKyAgICAgLy8gQW55IG9uZSBvZiB0aGVzZSBzdGVwcyBjYW4gYmUgdXNlZCB0byBkZWNvZGUgdGhlIFdlYlAgaW1hZ2UuCisKKyAgICAgLy8gRS4xKSBEZWNvZGUgZnVsbCBpbWFnZS4KKyAgICAgQ0hFQ0soV2ViUERlY29kZShkYXRhLCBkYXRhX3NpemUsICZjb25maWcpID09IFZQOF9TVEFUVVNfT0spOworCisgICAgIC8vIEUuMikgRGVjb2RlIGltYWdlIGluY3JlbWVudGFsbHkuCisgICAgIFdlYlBJRGVjb2RlciogY29uc3QgaWRlYyA9IFdlYlBJRGVjb2RlKE5VTEwsIE5VTEwsICZjb25maWcpOworICAgICBDSEVDSyhpZGVjICE9IE5VTEwpOworICAgICB3aGlsZSAoYnl0ZXNfcmVtYWluaW5nID4gMCkgeworICAgICAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gV2ViUElBcHBlbmQoaWRlYywgaW5wdXQsIGJ5dGVzX3JlYWQpOworICAgICAgIGlmIChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyB8fCBzdGF0dXMgPT0gVlA4X1NUQVRVU19TVVNQRU5ERUQpIHsKKyAgICAgICAgIGJ5dGVzX3JlbWFpbmluZyAtPSBieXRlc19yZWFkOworICAgICAgIH0gZWxzZSB7CisgICAgICAgICBicmVhazsKKyAgICAgICB9CisgICAgIH0KKyAgICAgV2ViUElEZWxldGUoaWRlYyk7CisKKyAgICAgLy8gRikgRGVjb2RlZCBpbWFnZSBpcyBub3cgaW4gY29uZmlnLm91dHB1dCAoYW5kIGNvbmZpZy5vdXRwdXQudS5SR0JBKS4KKyAgICAgLy8gSXQgY2FuIGJlIHNhdmVkLCBkaXNwbGF5ZWQgb3Igb3RoZXJ3aXNlIHByb2Nlc3NlZC4KKworICAgICAvLyBHKSBSZWNsYWltIG1lbW9yeSBhbGxvY2F0ZWQgaW4gY29uZmlnJ3Mgb2JqZWN0LiBJdCdzIHNhZmUgdG8gY2FsbAorICAgICAvLyB0aGlzIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlIG1lbW9yeSBpcyBleHRlcm5hbCBhbmQgd2Fzbid0IGFsbG9jYXRlZAorICAgICAvLyBieSBXZWJQRGVjb2RlKCkuCisgICAgIFdlYlBGcmVlRGVjQnVmZmVyKCZjb25maWcub3V0cHV0KTsKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRU5EIFBTRVVETyBFWEFNUExFCisKK0J1Z3M6Cis9PT09PQorCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgorICAgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CisgICAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmctcGF0Y2hlcy8KKworRGlzY3VzczoKKz09PT09PT09CisKK0VtYWlsOiB3ZWJwLWRpc2N1c3NAd2VibXByb2plY3Qub3JnCitXZWI6IGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9hL3dlYm1wcm9qZWN0Lm9yZy9ncm91cC93ZWJwLWRpc2N1c3MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5jaHJvbWl1bSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS5jaHJvbWl1bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjYTFjZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUuY2hyb21pdW0KKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1OYW1lOiBXZWJQIGltYWdlIGVuY29kZXIvZGVjb2RlcgotU2hvcnQgTmFtZTogbGlid2VicAotVVJMOiBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAKLVZlcnNpb246IHYwLjMuMQotTGljZW5zZTogQlNECi1MaWNlbnNlIEZpbGU6IExJQ0VOU0UKLVNlY3VyaXR5IENyaXRpY2FsOiBZZXMKLQotRGVzY3JpcHRpb246Ci1Tb3VyY2UgYXJjaGl2ZToKLSAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3dlYnAvZG93bmxvYWRzL2RldGFpbD9uYW1lPWxpYndlYnAtMC4zLjEudGFyLmd6Ci0KLVdlYlAgaXMgYW4gaW1hZ2UgZm9ybWF0IHRoYXQgZG9lcyBib3RoIGxvc3N5IGFuZCBsb3NzbGVzcyBjb21wcmVzc2lvbiBvZgotZGlnaXRhbCBwaG90b2dyYXBoaWMgaW1hZ2VzLiBXZWJQIGNvbnNpc3RzIG9mIGEgY29kZWMgYmFzZWQgb24gVlA4LCB0aGF0IEdvb2dsZQotb3Blbi1zb3VyY2VkIGluIE1heSAyMDEwIGFuZCBhIGNvbnRhaW5lciBiYXNlZCBvbiBSSUZGLiBXZWJtYXN0ZXJzLCB3ZWIKLWRldmVsb3BlcnMgYW5kIGJyb3dzZXIgZGV2ZWxvcGVycyBjYW4gdXNlIFdlYlAgdG8gY29tcHJlc3MsIGFyY2hpdmUgYW5kCi1kaXN0cmlidXRlIGRpZ2l0YWwgaW1hZ2VzIG1vcmUgZWZmaWNpZW50bHkuCi0KLUxvY2FsIGNoYW5nZXM6Ci0gKiBSZW1vdmVkIGV4YW1wbGVzLywgZG9jdW1lbnRhdGlvbiBhbmQgYnVpbGQgcmVsYXRlZCBmaWxlcywga2VlcGluZyBvbmx5Ci0gICB0aGUgY29udGVudHMgb2Ygc3JjLyBsZXNzIG11eC8gd2hpY2ggaXMgdW51c2VkLgotICogTWVyZ2VkIENPUFlJTkcvUEFURU5UUyB0byBMSUNFTlNFCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9SRUFETUUubXV4IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLm11eApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDRmOTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLm11eApAQCAtMCwwICsxLDIyNyBAQAor77u/ICAgICAgICAgIF9fICAgX18gIF9fX18gIF9fX18gIF9fX18gIF9fIF9fICBfICAgICBfXyBfXworICAgICAgICAgLyAgXFwvICBcLyAgXyBcLyAgXyBcLyAgXyBcLyAgXCAgXC8gXF9fXy9fIC8gX1wKKyAgICAgICAgIFwgICAgICAgLyAgIF9fLyAgXyAgXCAgIF9fLyAgICAgIC8gIC8gIChfLyAgL19fCisgICAgICAgICAgXF9fXF9fL1xfX19fXy9fX19fXy9fXy8gIFxfXy8vXy9cX19fX18vX18vX19fL3YxLjAuMAorCisKK0Rlc2NyaXB0aW9uOgorPT09PT09PT09PT09CisKK1dlYlBNdXg6IHNldCBvZiB0d28gbGlicmFyaWVzICdNdXgnIGFuZCAnRGVtdXgnIGZvciBjcmVhdGlvbiwgZXh0cmFjdGlvbiBhbmQKK21hbmlwdWxhdGlvbiBvZiBhbiBleHRlbmRlZCBmb3JtYXQgV2ViUCBmaWxlLCB3aGljaCBjYW4gaGF2ZSBmZWF0dXJlcyBsaWtlCitjb2xvciBwcm9maWxlLCBtZXRhZGF0YSBhbmQgYW5pbWF0aW9uLiBSZWZlcmVuY2UgY29tbWFuZC1saW5lIHRvb2xzICd3ZWJwbXV4JworYW5kICd2d2VicCcgYXMgd2VsbCBhcyB0aGUgV2ViUCBjb250YWluZXIgc3BlY2lmaWNhdGlvbgorJ2RvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dCcgYXJlIGFsc28gcHJvdmlkZWQgaW4gdGhpcyBwYWNrYWdlLgorCitXZWJQIE11eCB0b29sOgorPT09PT09PT09PT09PT0KKworVGhlIGV4YW1wbGVzLyBkaXJlY3RvcnkgY29udGFpbnMgYSB0b29sICh3ZWJwbXV4KSBmb3IgbWFuaXB1bGF0aW5nIFdlYlAKK2ZpbGVzLiBUaGUgd2VicG11eCB0b29sIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBleHRlbmRlZCBmb3JtYXQgV2ViUCBmaWxlIGFuZAorYWxzbyB0byBleHRyYWN0IG9yIHN0cmlwIHJlbGV2YW50IGRhdGEgZnJvbSBzdWNoIGEgZmlsZS4KKworQSBsaXN0IG9mIG9wdGlvbnMgaXMgYXZhaWxhYmxlIHVzaW5nIHRoZSAtaGVscCBjb21tYW5kIGxpbmUgZmxhZzoKKworPiB3ZWJwbXV4IC1oZWxwCitVc2FnZTogd2VicG11eCAtZ2V0IEdFVF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVAorICAgICAgIHdlYnBtdXggLXNldCBTRVRfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVQKKyAgICAgICB3ZWJwbXV4IC1kdXJhdGlvbiBEVVJBVElPTl9PUFRJT05TIFstZHVyYXRpb24gLi4uXQorICAgICAgICAgICAgICAgSU5QVVQgLW8gT1VUUFVUCisgICAgICAgd2VicG11eCAtc3RyaXAgU1RSSVBfT1BUSU9OUyBJTlBVVCAtbyBPVVRQVVQKKyAgICAgICB3ZWJwbXV4IC1mcmFtZSBGUkFNRV9PUFRJT05TIFstZnJhbWUuLi5dIFstbG9vcCBMT09QX0NPVU5UXQorICAgICAgICAgICAgICAgWy1iZ2NvbG9yIEJBQ0tHUk9VTkRfQ09MT1JdIC1vIE9VVFBVVAorICAgICAgIHdlYnBtdXggLWluZm8gSU5QVVQKKyAgICAgICB3ZWJwbXV4IFstaHwtaGVscF0KKyAgICAgICB3ZWJwbXV4IC12ZXJzaW9uCisgICAgICAgd2VicG11eCBhcmd1bWVudF9maWxlX25hbWUKKworR0VUX09QVElPTlM6CisgRXh0cmFjdCByZWxldmFudCBkYXRhOgorICAgaWNjICAgICAgIGdldCBJQ0MgcHJvZmlsZQorICAgZXhpZiAgICAgIGdldCBFWElGIG1ldGFkYXRhCisgICB4bXAgICAgICAgZ2V0IFhNUCBtZXRhZGF0YQorICAgZnJhbWUgbiAgIGdldCBudGggZnJhbWUKKworU0VUX09QVElPTlM6CisgU2V0IGNvbG9yIHByb2ZpbGUvbWV0YWRhdGE6CisgICBpY2MgIGZpbGUuaWNjICAgICBzZXQgSUNDIHByb2ZpbGUKKyAgIGV4aWYgZmlsZS5leGlmICAgIHNldCBFWElGIG1ldGFkYXRhCisgICB4bXAgIGZpbGUueG1wICAgICBzZXQgWE1QIG1ldGFkYXRhCisgICB3aGVyZTogICAgJ2ZpbGUuaWNjJyBjb250YWlucyB0aGUgSUNDIHByb2ZpbGUgdG8gYmUgc2V0LAorICAgICAgICAgICAgICdmaWxlLmV4aWYnIGNvbnRhaW5zIHRoZSBFWElGIG1ldGFkYXRhIHRvIGJlIHNldAorICAgICAgICAgICAgICdmaWxlLnhtcCcgY29udGFpbnMgdGhlIFhNUCBtZXRhZGF0YSB0byBiZSBzZXQKKworRFVSQVRJT05fT1BUSU9OUzoKKyBTZXQgZHVyYXRpb24gb2Ygc2VsZWN0ZWQgZnJhbWVzOgorICAgZHVyYXRpb24gICAgICAgICAgICBzZXQgZHVyYXRpb24gZm9yIGVhY2ggZnJhbWVzCisgICBkdXJhdGlvbixmcmFtZSAgICAgIHNldCBkdXJhdGlvbiBvZiBhIHBhcnRpY3VsYXIgZnJhbWUKKyAgIGR1cmF0aW9uLHN0YXJ0LGVuZCAgc2V0IGR1cmF0aW9uIG9mIGZyYW1lcyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsIFtzdGFydCxlbmRdKQorICAgd2hlcmU6ICdkdXJhdGlvbicgaXMgdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgICdzdGFydCcgaXMgdGhlIHN0YXJ0IGZyYW1lIGluZGV4CisgICAgICAgICAgJ2VuZCcgaXMgdGhlIGluY2x1c2l2ZSBlbmQgZnJhbWUgaW5kZXgKKyAgICAgICAgICAgVGhlIHNwZWNpYWwgJ2VuZCcgdmFsdWUgJzAnIG1lYW5zOiBsYXN0IGZyYW1lLgorCitTVFJJUF9PUFRJT05TOgorIFN0cmlwIGNvbG9yIHByb2ZpbGUvbWV0YWRhdGE6CisgICBpY2MgICAgICAgc3RyaXAgSUNDIHByb2ZpbGUKKyAgIGV4aWYgICAgICBzdHJpcCBFWElGIG1ldGFkYXRhCisgICB4bXAgICAgICAgc3RyaXAgWE1QIG1ldGFkYXRhCisKK0ZSQU1FX09QVElPTlMoaSk6CisgQ3JlYXRlIGFuaW1hdGlvbjoKKyAgIGZpbGVfaSArZGkrW3hpK3lpWyttaVtiaV1dXQorICAgd2hlcmU6ICAgICdmaWxlX2knIGlzIHRoZSBpJ3RoIGFuaW1hdGlvbiBmcmFtZSAoV2ViUCBmb3JtYXQpLAorICAgICAgICAgICAgICdkaScgaXMgdGhlIHBhdXNlIGR1cmF0aW9uIGJlZm9yZSBuZXh0IGZyYW1lLAorICAgICAgICAgICAgICd4aScsJ3lpJyBzcGVjaWZ5IHRoZSBpbWFnZSBvZmZzZXQgZm9yIHRoaXMgZnJhbWUsCisgICAgICAgICAgICAgJ21pJyBpcyB0aGUgZGlzcG9zZSBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKDAgb3IgMSksCisgICAgICAgICAgICAgJ2JpJyBpcyB0aGUgYmxlbmRpbmcgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgrYiBvciAtYikKKworTE9PUF9DT1VOVDoKKyBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBhbmltYXRpb24uCisgVmFsaWQgcmFuZ2UgaXMgMCB0byA2NTUzNSBbRGVmYXVsdDogMCAoaW5maW5pdGUpXS4KKworQkFDS0dST1VORF9DT0xPUjoKKyBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMuCisgIEEsUixHLEIKKyAgd2hlcmU6ICAgICdBJywgJ1InLCAnRycgYW5kICdCJyBhcmUgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1IHNwZWNpZnlpbmcKKyAgICAgICAgICAgIHRoZSBBbHBoYSwgUmVkLCBHcmVlbiBhbmQgQmx1ZSBjb21wb25lbnQgdmFsdWVzIHJlc3BlY3RpdmVseQorICAgICAgICAgICAgW0RlZmF1bHQ6IDI1NSwyNTUsMjU1LDI1NV0KKworSU5QVVQgJiBPVVRQVVQgYXJlIGluIFdlYlAgZm9ybWF0LgorCitOb3RlOiBUaGUgbmF0dXJlIG9mIEVYSUYsIFhNUCBhbmQgSUNDIGRhdGEgaXMgbm90IGNoZWNrZWQgYW5kIGlzIGFzc3VtZWQgdG8gYmUKK3ZhbGlkLgorCitOb3RlOiBpZiBhIHNpbmdsZSBmaWxlIG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBhcmd1bWVudCwgdGhlIGFyZ3VtZW50cyB3aWxsIGJlCit0b2tlbml6ZWQgZnJvbSB0aGlzIGZpbGUuIFRoZSBmaWxlIG5hbWUgbXVzdCBub3Qgc3RhcnQgd2l0aCB0aGUgY2hhcmFjdGVyICctJy4KKworVmlzdWFsaXphdGlvbiB0b29sOgorPT09PT09PT09PT09PT09PT09PQorCitUaGUgZXhhbXBsZXMvIGRpcmVjdG9yeSBhbHNvIGNvbnRhaW5zIGEgdG9vbCAodndlYnApIGZvciB2aWV3aW5nIFdlYlAgZmlsZXMuCitJdCBkZWNvZGVzIHRoZSBpbWFnZSBhbmQgdmlzdWFsaXplcyBpdCB1c2luZyBPcGVuR0wuIFNlZSB0aGUgbGlid2VicCBSRUFETUUKK2ZvciBkZXRhaWxzIG9uIGJ1aWxkaW5nIGFuZCBydW5uaW5nIHRoaXMgcHJvZ3JhbS4KKworTXV4IEFQSToKKz09PT09PT09CitUaGUgTXV4IEFQSSBjb250YWlucyBtZXRob2RzIGZvciBhZGRpbmcgZGF0YSB0byBhbmQgcmVhZGluZyBkYXRhIGZyb20gV2ViUAorZmlsZXMuIFRoaXMgQVBJIGN1cnJlbnRseSBzdXBwb3J0cyBYTVAvRVhJRiBtZXRhZGF0YSwgSUNDIHByb2ZpbGUgYW5kIGFuaW1hdGlvbi4KK090aGVyIGZlYXR1cmVzIG1heSBiZSBhZGRlZCBpbiBzdWJzZXF1ZW50IHJlbGVhc2VzLgorCitFeGFtcGxlIzEgKHBzZXVkbyBjb2RlKTogQ3JlYXRpbmcgYSBXZWJQTXV4IG9iamVjdCB3aXRoIGltYWdlIGRhdGEsIGNvbG9yCitwcm9maWxlIGFuZCBYTVAgbWV0YWRhdGEuCisKKyAgaW50IGNvcHlfZGF0YSA9IDA7CisgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhOZXcoKTsKKyAgLy8gLi4uIChQcmVwYXJlIGltYWdlIGRhdGEpLgorICBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmaW1hZ2UsIGNvcHlfZGF0YSk7CisgIC8vIC4uLiAoUHJlcGFyZSBJQ0MgcHJvZmlsZSBkYXRhKS4KKyAgV2ViUE11eFNldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUsIGNvcHlfZGF0YSk7CisgIC8vIC4uLiAoUHJlcGFyZSBYTVAgbWV0YWRhdGEpLgorICBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiWE1QICIsICZ4bXAsIGNvcHlfZGF0YSk7CisgIC8vIEdldCBkYXRhIGZyb20gbXV4IGluIFdlYlAgUklGRiBmb3JtYXQuCisgIFdlYlBNdXhBc3NlbWJsZShtdXgsICZvdXRwdXRfZGF0YSk7CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgLy8gLi4uIChDb25zdW1lIG91dHB1dF9kYXRhOyBlLmcuIHdyaXRlIG91dHB1dF9kYXRhLmJ5dGVzIHRvIGZpbGUpLgorICBXZWJQRGF0YUNsZWFyKCZvdXRwdXRfZGF0YSk7CisKKworRXhhbXBsZSMyIChwc2V1ZG8gY29kZSk6IEdldCBpbWFnZSBhbmQgY29sb3IgcHJvZmlsZSBkYXRhIGZyb20gYSBXZWJQIGZpbGUuCisKKyAgaW50IGNvcHlfZGF0YSA9IDA7CisgIC8vIC4uLiAoUmVhZCBkYXRhIGZyb20gZmlsZSkuCisgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhDcmVhdGUoJmRhdGEsIGNvcHlfZGF0YSk7CisgIFdlYlBNdXhHZXRGcmFtZShtdXgsIDEsICZpbWFnZSk7CisgIC8vIC4uLiAoQ29uc3VtZSBpbWFnZTsgZS5nLiBjYWxsIFdlYlBEZWNvZGUoKSB0byBkZWNvZGUgdGhlIGRhdGEpLgorICBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSk7CisgIC8vIC4uLiAoQ29uc3VtZSBpY2NfcHJvZmlsZSkuCisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgZnJlZShkYXRhKTsKKworCitGb3IgYSBkZXRhaWxlZCBNdXggQVBJIHJlZmVyZW5jZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBoZWFkZXIgZmlsZQorKHNyYy93ZWJwL211eC5oKS4KKworRGVtdXggQVBJOgorPT09PT09PT09PQorVGhlIERlbXV4IEFQSSBlbmFibGVzIGV4dHJhY3Rpb24gb2YgaW1hZ2VzIGFuZCBleHRlbmRlZCBmb3JtYXQgZGF0YSBmcm9tCitXZWJQIGZpbGVzLiBUaGlzIEFQSSBjdXJyZW50bHkgc3VwcG9ydHMgcmVhZGluZyBvZiBYTVAvRVhJRiBtZXRhZGF0YSwgSUNDCitwcm9maWxlIGFuZCBhbmltYXRlZCBpbWFnZXMuIE90aGVyIGZlYXR1cmVzIG1heSBiZSBhZGRlZCBpbiBzdWJzZXF1ZW50CityZWxlYXNlcy4KKworQ29kZSBleGFtcGxlOiBEZW11eGluZyBXZWJQIGRhdGEgdG8gZXh0cmFjdCBhbGwgdGhlIGZyYW1lcywgSUNDIHByb2ZpbGUKK2FuZCBFWElGL1hNUCBtZXRhZGF0YS4KKworICBXZWJQRGVtdXhlciogZGVtdXggPSBXZWJQRGVtdXgoJndlYnBfZGF0YSk7CisgIHVpbnQzMl90IHdpZHRoID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOworICB1aW50MzJfdCBoZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOworICAvLyAuLi4gKEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmVhdHVyZXMgcHJlc2VudCBpbiB0aGUgV2ViUCBmaWxlKS4KKyAgdWludDMyX3QgZmxhZ3MgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUyk7CisKKyAgLy8gLi4uIChJdGVyYXRlIG92ZXIgYWxsIGZyYW1lcykuCisgIFdlYlBJdGVyYXRvciBpdGVyOworICBpZiAoV2ViUERlbXV4R2V0RnJhbWUoZGVtdXgsIDEsICZpdGVyKSkgeworICAgIGRvIHsKKyAgICAgIC8vIC4uLiAoQ29uc3VtZSAnaXRlcic7IGUuZy4gRGVjb2RlICdpdGVyLmZyYWdtZW50JyB3aXRoIFdlYlBEZWNvZGUoKSwKKyAgICAgIC8vIC4uLiBhbmQgZ2V0IG90aGVyIGZyYW1lIHByb3BlcnRpZXMgbGlrZSB3aWR0aCwgaGVpZ2h0LCBvZmZzZXRzIGV0Yy4KKyAgICAgIC8vIC4uLiBzZWUgJ3N0cnVjdCBXZWJQSXRlcmF0b3InIGJlbG93IGZvciBtb3JlIGluZm8pLgorICAgIH0gd2hpbGUgKFdlYlBEZW11eE5leHRGcmFtZSgmaXRlcikpOworICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7CisgIH0KKworICAvLyAuLi4gKEV4dHJhY3QgbWV0YWRhdGEpLgorICBXZWJQQ2h1bmtJdGVyYXRvciBjaHVua19pdGVyOworICBpZiAoZmxhZ3MgJiBJQ0NQX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiSUNDUCIsIDEsICZjaHVua19pdGVyKTsKKyAgLy8gLi4uIChDb25zdW1lIHRoZSBJQ0MgcHJvZmlsZSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIGlmIChmbGFncyAmIEVYSUZfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJFWElGIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIEVYSUYgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICBpZiAoZmxhZ3MgJiBYTVBfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJYTVAgIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIFhNUCBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIFdlYlBEZW11eERlbGV0ZShkZW11eCk7CisKKworRm9yIGEgZGV0YWlsZWQgRGVtdXggQVBJIHJlZmVyZW5jZSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBoZWFkZXIgZmlsZQorKHNyYy93ZWJwL2RlbXV4LmgpLgorCitBbmltRW5jb2RlciBBUEk6Cis9PT09PT09PT09PT09PT09CitUaGUgQW5pbUVuY29kZXIgQVBJIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbmltYXRlZCBXZWJQIGltYWdlcy4KKworQ29kZSBleGFtcGxlOgorCisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgZW5jX29wdGlvbnM7CisgIFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZlbmNfb3B0aW9ucyk7CisgIC8vIC4uLiAoVHVuZSAnZW5jX29wdGlvbnMnIGFzIG5lZWRlZCkuCisgIFdlYlBBbmltRW5jb2RlciogZW5jID0gV2ViUEFuaW1FbmNvZGVyTmV3KHdpZHRoLCBoZWlnaHQsICZlbmNfb3B0aW9ucyk7CisgIHdoaWxlKDx0aGVyZSBhcmUgbW9yZSBmcmFtZXM+KSB7CisgICAgV2ViUENvbmZpZyBjb25maWc7CisgICAgV2ViUENvbmZpZ0luaXQoJmNvbmZpZyk7CisgICAgLy8gLi4uIChUdW5lICdjb25maWcnIGFzIG5lZWRlZCkuCisgICAgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgZnJhbWUsIGR1cmF0aW9uLCAmY29uZmlnKTsKKyAgfQorICBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShlbmMsIHdlYnBfZGF0YSk7CisgIFdlYlBBbmltRW5jb2RlckRlbGV0ZShlbmMpOworICAvLyAuLi4gKFdyaXRlIHRoZSAnd2VicF9kYXRhJyB0byBhIGZpbGUsIG9yIHJlLW11eCBpdCBmdXJ0aGVyKS4KKworCitGb3IgYSBkZXRhaWxlZCBBbmltRW5jb2RlciBBUEkgcmVmZXJlbmNlLCBwbGVhc2UgcmVmZXIgdG8gdGhlIGhlYWRlciBmaWxlCisoc3JjL3dlYnAvbXV4LmgpLgorCisKK0J1Z3M6Cis9PT09PQorCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgorICAgIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CisgICAgaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmctcGF0Y2hlcy8KKworRGlzY3VzczoKKz09PT09PT09CisKK0VtYWlsOiB3ZWJwLWRpc2N1c3NAd2VibXByb2plY3Qub3JnCitXZWI6IGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9hL3dlYm1wcm9qZWN0Lm9yZy9ncm91cC93ZWJwLWRpc2N1c3MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS53ZWJwX2pzIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvUkVBRE1FLndlYnBfanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgwNTM1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL1JFQURNRS53ZWJwX2pzCkBAIC0wLDAgKzEsNzYgQEAKKyAgICAgX18gICBfXyBfX19fIF9fX18gX19fXyAgICAgX18gIF9fX18KKyAgICAvICBcXC8gIFwgIF8gXCAgXyBcICBfIFwgICAoX18pLyAgX19cCisgICAgXCAgICAgICAvICBfXy8gXyAgXCAgX18vICAgXykgIFxfICAgXAorICAgICBcX19cX18vX19fX18vX19fXy9fLyAgICAgL19fX18vX19fXy8KKworRGVzY3JpcHRpb246Cis9PT09PT09PT09PT0KKworVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgY29tcGlsYXRpb24gb2YgbGlid2VicCBpbnRvIGEgSmF2YVNjcmlwdCBkZWNvZGVyCit1c2luZyBFbXNjcmlwdGVuIGFuZCBDTWFrZS4KKworIC0gaW5zdGFsbCB0aGUgRW1zY3JpcHRlbiBTREsgZm9sbG93aW5nIHRoZSBwcm9jZWR1cmUgZGVzY3JpYmVkIGF0OgorICAgaHR0cHM6Ly9rcmlwa2VuLmdpdGh1Yi5pby9lbXNjcmlwdGVuLXNpdGUvZG9jcy9nZXR0aW5nX3N0YXJ0ZWQvZG93bmxvYWRzLmh0bWwKKyAgIEFmdGVyIGluc3RhbGxhdGlvbiwgeW91IHNob3VsZCBoYXZlIHNvbWUgZ2xvYmFsIHZhcmlhYmxlIHBvc2l0aW9uZWQgdG8gdGhlCisgICBsb2NhdGlvbiBvZiB0aGUgU0RLLiBJbiBwYXJ0aWN1bGFyLCAkRU1TQ1JJUFRFTiBzaG91bGQgcG9pbnQgdG8gdGhlCisgICB0b3AtbGV2ZWwgZGlyZWN0b3J5IGNvbnRhaW5pbmcgRW1zY3JpcHRlbiB0b29scy4KKworIC0gbWFrZSBzdXJlIHRoZSBmaWxlICRFTVNDUklQVEVOL2NtYWtlL01vZHVsZXMvUGxhdGZvcm0vRW1zY3JpcHRlbi5jbWFrZSBpcworICAgYWNjZXNzaWJsZS4gVGhpcyBpcyB0aGUgdG9vbGNoYWluIGZpbGUgdXNlZCBieSBDTWFrZSB0byBpbnZva2UgRW1zY3JpcHRlbi4KKworIC0gY29uZmlndXJlIHRoZSBwcm9qZWN0ICdXRUJQX0pTJyB3aXRoIENNYWtlIHVzaW5nOgorCisgY2Qgd2VicF9qcyAmJiBcCisgY21ha2UgLURXRUJQX0JVSUxEX1dFQlBfSlM9T04gXAorICAgICAgIC1ERU1TQ1JJUFRFTl9HRU5FUkFURV9CSVRDT0RFX1NUQVRJQ19MSUJSQVJJRVM9MSBcCisgICAgICAgLURDTUFLRV9UT09MQ0hBSU5fRklMRT0kRU1TQ1JJUFRFTi9jbWFrZS9Nb2R1bGVzL1BsYXRmb3JtL0Vtc2NyaXB0ZW4uY21ha2UgXAorICAgICAgIC4uLworCisgLSBjb21waWxlIHdlYnAuanMgdXNpbmcgJ21ha2UnLgorCisgLSB0aGF0J3MgaXQhIFVwb24gY29tcGxldGlvbiwgeW91IHNob3VsZCBoYXZlIHRoZSB3ZWJwLmpzIGFuZAorICAgd2VicC5qcy5tZW0gZmlsZXMgZ2VuZXJhdGVkLgorCitUaGUgY2FsbGFibGUgSmF2YVNjcmlwdCBmdW5jdGlvbiBpcyBXZWJQVG9TREwoKSwgd2hpY2ggZGVjb2RlcyBhIHJhdyBXZWJQCitiaXRzdHJlYW0gaW50byBhIGNhbnZhcy4gU2VlIHdlYnBfanMvaW5kZXguaHRtbCBmb3IgYSBzaW1wbGUgdXNhZ2Ugc2FtcGxlCisoc2VlIGJlbG93IGZvciBpbnN0cnVjdGlvbnMpLgorCitEZW1vIEhUTUwgcGFnZToKKz09PT09PT09PT09PT09PQorCisgICBUaGUgSFRNTCBwYWdlIHdlYnBfanMvaW5kZXguaHRtbCByZXF1aXJlcyBhbiBIVFRQIHNlcnZlciB0byBzZXJ2ZSB0aGUgV2ViUAorICAgaW1hZ2UgZXhhbXBsZS4gSXQncyBlYXN5IHRvIGp1c3QgdXNlIFB5dGhvbiBmb3IgdGhhdC4KKworY2Qgd2VicF9qcyAmJiBweXRob24gLW0gU2ltcGxlSFRUUFNlcnZlciA4MDgwCisKK2FuZCB0aGVuIG5hdmlnYXRlIHRvIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCBpbiB5b3VyIGZhdm9yaXRlIGJyb3dzZXIuCisKKworV2ViLUFzc2VtYmx5IChXQVNNKSB2ZXJzaW9uOgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgIENNYWtlTGlzdHMudHh0IGlzIGNvbmZpZ3VyZWQgdG8gYnVpbGQgdGhlIFdBU00gdmVyc2lvbiB3aGVuIHVzaW5nCisgIHRoZSBvcHRpb24gV0VCUF9CVUlMRF9XRUJQX0pTPU9OLiBUaGUgY29tcGlsYXRpb24gc3RlcCB3aWxsIGFzc2VtYmxlCisgIHRoZSBmaWxlcyAnd2VicF93YXNtLmpzJywgJ3dlYnBfd2FzbS53YXNtJyBpbiB0aGUgd2VicF9qcy8gZGlyZWN0b3J5LgorICBTZWUgd2VicF9qcy9pbmRleF93YXNtLmh0bWwgZm9yIGEgc2ltcGxlIGRlbW8gcGFnZSB1c2luZyB0aGUgV0FTTSB2ZXJzaW9uCisgIG9mIHRoZSBsaWJyYXJ5LgorCisgIFlvdSB3aWxsIG5lZWQgYSBmYWlybHkgcmVjZW50IHZlcnNpb24gb2YgRW1zY3JpcHRlbiAoYXQgbGVhc3QgMS4zNy44KSBhbmQgb2YKKyAgeW91ciBXQVNNLWVuYWJsZWQgYnJvd3NlciB0byBydW4gdGhpcyB2ZXJzaW9uLiBDb25zaWRlciBpdCB2ZXJ5IGV4cGVyaW1lbnRhbCEKKworQ2F2ZWF0OgorPT09PT09PQorCisgIC0gRmlyc3QgZGVjb2RpbmcgdXNpbmcgdGhlIGxpYnJhcnkgaXMgdXN1YWxseSBzbG93ZXIsIGR1ZSB0byBqdXN0LWluLXRpbWUKKyAgICBjb21waWxhdGlvbi4KKworICAtIFNvbWUgdmVyc2lvbnMgb2YgbGx2bSBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgY29tcGlsZSBlcnJvciB3aGVuIFNTRTIgaXMKKyAgICBlbmFibGVkLgorCisiVW5zdXBwb3J0ZWQ6ICAgJTUxNiA9IGJpdGNhc3QgPDggeCBpMTY+ICU0ODEgdG8gaTEyOAorIExMVk0gRVJST1I6IEJpdENhc3QgSW5zdHJ1Y3Rpb24gbm90IHlldCBzdXBwb3J0ZWQgZm9yIGludGVnZXIgdHlwZXMgbGFyZ2VyIHRoYW4gNjQgYml0cyIKKworICAgIFRoZSBjb3JyZXNwb25kaW5nIEVtc2NyaXB0ZW4gYnVnIGlzIGF0OgorICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlwa2VuL2Vtc2NyaXB0ZW4vaXNzdWVzLzM3ODgKKworICAgIFRoZXJlZm9yZSwgU1NFMiBvcHRpbWl6YXRpb24gaXMgY3VycmVudGx5IGRpc2FibGVkIGluIENNYWtlTGlzdHMudHh0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvYXV0b2dlbi5zaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2F1dG9nZW4uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGVmOWJhYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2F1dG9nZW4uc2gKQEAgLTAsMCArMSwyIEBACisjISAvYmluL3NoIC1lCitleGVjIGF1dG9yZWNvbmYgLWZpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9idWlsZC5ncmFkbGUgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9idWlsZC5ncmFkbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhZDEyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDQzOSBAQAorLy8gRGVmaW5lIGRlcGVuZGVuY2llcy4KK2J1aWxkc2NyaXB0IHsKKyAgcmVwb3NpdG9yaWVzIHsKKyAgICBtYXZlbiB7CisgICAgICB1cmwgImh0dHBzOi8vamNlbnRlci5iaW50cmF5LmNvbSIKKyAgICB9CisgIH0KKyAgZGVwZW5kZW5jaWVzIHsKKyAgICBjbGFzc3BhdGggImNvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZToke0FORFJPSURfR1JBRExFX1BMVUdJTl9WRVJTSU9OfSIKKyAgfQorfQorCisvLyBEZWZpbmUgdmVyc2lvbnMgaW4gdGhlIHByb2plY3QuCitwcm9qZWN0LmV4dCB7CisgIGJ1aWxkVG9vbHNWZXJzaW9uID0gIiR7QlVJTERfVE9PTFNfVkVSU0lPTn0iCisgIGNvbXBpbGVTZGtWZXJzaW9uID0gQ09NUElMRV9TREtfVkVSU0lPTi50b0ludGVnZXIoKQorfQorCisvLyBDb3JlIGxpYnJhcmllcyBhbmQgZXhlY3V0YWJsZXMuCithcHBseSBwbHVnaW46ICJjIgorZGVmIE5FT04KK21vZGVsIHsKKyAgYnVpbGRUeXBlcyB7CisgICAgZGVidWcKKyAgICByZWxlYXNlCisgIH0KKyAgcGxhdGZvcm1zIHsKKyAgICBhcm0geworICAgICAgYXJjaGl0ZWN0dXJlICJhcm0iCisgICAgfQorICAgIGFybTY0IHsKKyAgICAgIGFyY2hpdGVjdHVyZSAiYXJtNjQiCisgICAgfQorICAgIHg4NiB7CisgICAgICBhcmNoaXRlY3R1cmUgIng4NiIKKyAgICB9CisgICAgeDY0IHsKKyAgICAgIGFyY2hpdGVjdHVyZSAieDg2XzY0IgorICAgIH0KKyAgICBtaXBzMzJyMgorICAgIG1pcHMzMnI1CisgICAgbWlwczY0cjYKKyAgfQorICB0b29sQ2hhaW5zIHsKKyAgICBnY2MoR2NjKSB7CisgICAgICB0YXJnZXQoIm1pcHMzMnIyIikgeworICAgICAgICBjQ29tcGlsZXIuYXJncyAiLW1pcHMzMnIyIgorICAgICAgfQorICAgICAgdGFyZ2V0KCJtaXBzMzJyNSIpIHsKKyAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1taXBzMzJyNSIKKyAgICAgIH0KKyAgICAgIHRhcmdldCgibWlwczY0cjYiKSB7CisgICAgICAgIGNDb21waWxlci5hcmdzICItbWlwczY0cjYiCisgICAgICB9CisgICAgfQorICB9CisgIGJpbmFyaWVzIHsKKyAgICBhbGwgeworICAgICAgaWYgKHRvb2xDaGFpbiBpbiBHY2MpIHsKKyAgICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1mUElDIgorICAgICAgICBjQ29tcGlsZXIuYXJncyAiLVdhbGwiCisgICAgICAgIGNDb21waWxlci5kZWZpbmUgIkFORFJPSUQiCisgICAgICAgIGNDb21waWxlci5kZWZpbmUgIkhBVkVfTUFMTE9DX0giCisgICAgICB9CisgICAgICAvLyBPcHRpbWl6YXRpb25zLgorICAgICAgaWYgKGJ1aWxkVHlwZSA9PSBidWlsZFR5cGVzLnJlbGVhc2UpIHsKKyAgICAgICAgaWYgKHRvb2xDaGFpbiBpbiBHY2MpIHsKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZpbmxpbmUtZnVuY3Rpb25zIgorICAgICAgICAgIGNDb21waWxlci5hcmdzICItZmZhc3QtbWF0aCIKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZmdW5jdGlvbi1zZWN0aW9ucyIKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZkYXRhLXNlY3Rpb25zIgorICAgICAgICB9CisgICAgICAgIGlmICh0b29sQ2hhaW4gaW4gQ2xhbmcpIHsKKyAgICAgICAgICBjQ29tcGlsZXIuYXJncyAiLWZyZW5hbWUtcmVnaXN0ZXJzIC1zIgorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBtaXBzMzIgZmFpbHMgdG8gYnVpbGQgd2l0aCBjbGFuZyBmcm9tIHIxNGIKKyAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwL2lzc3Vlcy9kZXRhaWw/aWQ9MzQzCisgICAgICBpZiAodG9vbENoYWluIGluIENsYW5nKSB7CisgICAgICAgIGlmIChnZXRUYXJnZXRQbGF0Zm9ybSgpID09ICJtaXBzIikgeworICAgICAgICAgIGNDb21waWxlci5hcmdzICItbm8taW50ZWdyYXRlZC1hcyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gQ2hlY2sgZm9yIE5FT04gdXNhZ2UuCisgICAgICBpZiAoZ2V0VGFyZ2V0UGxhdGZvcm0oKSA9PSAiYXJtIikgeworICAgICAgICBORU9OID0gImMubmVvbiIKKyAgICAgICAgY0NvbXBpbGVyLmRlZmluZSAiSEFWRV9DUFVfRkVBVFVSRVNfSCIKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE5FT04gPSAiYyIKKyAgICAgIH0KKworICAgICAgY0NvbXBpbGVyLmFyZ3MgIi1JIiArIGZpbGUoIi4iKS5hYnNvbHV0ZVBhdGgKKyAgICB9CisgICAgLy8gTGluayB0byBwdGhyZWFkIGZvciBzaGFyZWQgbGlicmFyaWVzLgorICAgIHdpdGhUeXBlKFNoYXJlZExpYnJhcnlCaW5hcnlTcGVjKSB7CisgICAgICBpZiAodG9vbENoYWluIGluIEdjYykgeworICAgICAgICBjQ29tcGlsZXIuZGVmaW5lICJIQVZFX1BUSFJFQUQiCisgICAgICAgIGNDb21waWxlci5kZWZpbmUgIldFQlBfVVNFX1RIUkVBRCIKKyAgICAgICAgbGlua2VyLmFyZ3MgIi1wdGhyZWFkIgorICAgICAgfQorICAgIH0KKyAgfQorICBjb21wb25lbnRzIHsKKyAgICB3ZWJwKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAic3JjL2RlYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYnVmZmVyX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZnJhbWVfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJpZGVjX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaW9fZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJxdWFudF9kZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInRyZWVfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ2cDhfZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ2cDhsX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAid2VicF9kZWMuYyIKKyAgICAgICAgICAgIHNyY0RpciAic3JjL2RzcCIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX3Byb2Nlc3NpbmcuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX3Byb2Nlc3NpbmdfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX3Byb2Nlc3Npbmdfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY3B1LmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19jbGlwX3RhYmxlcy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZGVjX21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgImRlY19zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZWNfc3NlNDEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnNfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnNfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJmaWx0ZXJzX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19uZW9uLiRORU9OIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3Nfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgInJlc2NhbGVyX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmcuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmdfbWlwc19kc3BfcjIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmdfbXNhLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJ1cHNhbXBsaW5nX3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInVwc2FtcGxpbmdfc3NlNDEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1di5jIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2X21pcHMzMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAieXV2X21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ5dXZfbmVvbi4kTkVPTiIKKyAgICAgICAgICAgIGluY2x1ZGUgInl1dl9zc2UyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ5dXZfc3NlNDEuYyIKKyAgICAgICAgICAgIHNyY0RpciAic3JjL3V0aWxzIgorICAgICAgICAgICAgaW5jbHVkZSAiYml0X3JlYWRlcl91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29sb3JfY2FjaGVfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcnNfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImh1ZmZtYW5fdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInF1YW50X2xldmVsc19kZWNfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInJhbmRvbV91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicmVzY2FsZXJfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInRocmVhZF91dGlscy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidXRpbHMuYyIKKyAgICAgICAgICAgIHNyY0RpciAic3JjL2RzcCIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvc3QuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImNvc3RfbWlwczMyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb3N0X21pcHNfZHNwX3IyLmMiCisgICAgICAgICAgICBpbmNsdWRlICJjb3N0X3NzZTIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX2F2eDIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImVuY19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJlbmNfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAiZW5jX3NzZTQxLmMiCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19taXBzMzIuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImxvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX21zYS5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX25lb24uJE5FT04iCisgICAgICAgICAgICBpbmNsdWRlICJsb3NzbGVzc19lbmNfc3NlMi5jIgorICAgICAgICAgICAgaW5jbHVkZSAibG9zc2xlc3NfZW5jX3NzZTQxLmMiCisgICAgICAgICAgICBpbmNsdWRlICJzc2ltLmMiCisgICAgICAgICAgICBpbmNsdWRlICJzc2ltX3NzZTIuYyIKKyAgICAgICAgICAgIHNyY0RpciAic3JjL2VuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFscGhhX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiYW5hbHlzaXNfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJiYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJiYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiY29zdF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZpbHRlcl9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImZyYW1lX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaGlzdG9ncmFtX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAiaXRlcmF0b3JfZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJuZWFyX2xvc3NsZXNzX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicGljdHVyZV9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBpY3R1cmVfY3NwX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicGljdHVyZV9wc25yX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicGljdHVyZV9yZXNjYWxlX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicGljdHVyZV90b29sc19lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInByZWRpY3Rvcl9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInF1YW50X2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAic3ludGF4X2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidG9rZW5fZW5jLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ0cmVlX2VuYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAidnA4bF9lbmMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgIndlYnBfZW5jLmMiCisgICAgICAgICAgICBzcmNEaXIgInNyYy91dGlscyIKKyAgICAgICAgICAgIGluY2x1ZGUgImJpdF93cml0ZXJfdXRpbHMuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgImh1ZmZtYW5fZW5jb2RlX3V0aWxzLmMiCisgICAgICAgICAgICBpbmNsdWRlICJxdWFudF9sZXZlbHNfdXRpbHMuYyIKKyAgICAgICAgICB9CisgICAgICAgICAgZXhwb3J0ZWRIZWFkZXJzIHsKKyAgICAgICAgICAgIHNyY0RpciAic3JjIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHdlYnBkZW11eChOYXRpdmVMaWJyYXJ5U3BlYykgeworICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgInNyYy9kZW11eCIKKyAgICAgICAgICAgIGluY2x1ZGUgImFuaW1fZGVjb2RlLmMiCisgICAgICAgICAgICBpbmNsdWRlICJkZW11eC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHdlYnBtdXgoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICJzcmMvbXV4LyIKKyAgICAgICAgICAgIGluY2x1ZGUgImFuaW1fZW5jb2RlLmMiCisgICAgICAgICAgICBpbmNsdWRlICJtdXhlZGl0LmMiCisgICAgICAgICAgICBpbmNsdWRlICJtdXhpbnRlcm5hbC5jIgorICAgICAgICAgICAgaW5jbHVkZSAibXV4cmVhZC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIEV4ZWN1dGFibGVzIGZyb20gZXhhbXBsZXMuCisgICAgZXhhbXBsZV91dGlsKE5hdGl2ZUxpYnJhcnlTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICBpbmNsdWRlICJleGFtcGxlX3V0aWwuYyIKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICBpbWFnZWlvX3V0aWwoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgIHNyY0RpciAiLi9pbWFnZWlvIgorICAgICAgICAgICAgaW5jbHVkZSAiaW1hZ2Vpb191dGlsLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW1hZ2VkZWMoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBkZW11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vaW1hZ2VpbyIKKyAgICAgICAgICAgIGluY2x1ZGUgImltYWdlX2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAianBlZ2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAibWV0YWRhdGEuYyIKKyAgICAgICAgICAgIGluY2x1ZGUgInBuZ2RlYy5jIgorICAgICAgICAgICAgaW5jbHVkZSAicG5tZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ0aWZmZGVjLmMiCisgICAgICAgICAgICBpbmNsdWRlICJ3ZWJwZGVjLmMiCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaW1hZ2VlbmMoTmF0aXZlTGlicmFyeVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vaW1hZ2VpbyIKKyAgICAgICAgICAgIGluY2x1ZGUgImltYWdlX2VuYy5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGN3ZWJwKE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJleGFtcGxlX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2VkZWMiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBkZW11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICBpbmNsdWRlICJjd2VicC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGR3ZWJwKE5hdGl2ZUV4ZWN1dGFibGVTcGVjKSB7CisgICAgICBiaW5hcmllcyB7CisgICAgICAgIGFsbCB7CisgICAgICAgICAgbGliIGxpYnJhcnk6ICJleGFtcGxlX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2VkZWMiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2VlbmMiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiaW1hZ2Vpb191dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnBkZW11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwIgorICAgICAgICB9CisgICAgICB9CisgICAgICBzb3VyY2VzIHsKKyAgICAgICAgYyB7CisgICAgICAgICAgc291cmNlIHsKKyAgICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgICBpbmNsdWRlICJkd2VicC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHdlYnBtdXhfZXhhbXBsZShOYXRpdmVFeGVjdXRhYmxlU3BlYykgeworICAgICAgYmluYXJpZXMgeworICAgICAgICBhbGwgeworICAgICAgICAgIGxpYiBsaWJyYXJ5OiAiZXhhbXBsZV91dGlsIiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogImltYWdlaW9fdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwbXV4IiwgbGlua2FnZTogInN0YXRpYyIKKyAgICAgICAgICBsaWIgbGlicmFyeTogIndlYnAiCisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHNvdXJjZXMgeworICAgICAgICBjIHsKKyAgICAgICAgICBzb3VyY2UgeworICAgICAgICAgICAgc3JjRGlyICIuL2V4YW1wbGVzIgorICAgICAgICAgICAgaW5jbHVkZSAid2VicG11eC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIGltZzJ3ZWJwX2V4YW1wbGUoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogImV4YW1wbGVfdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWRlYyIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicG11eCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJ3ZWJwZGVtdXgiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICBpbmNsdWRlICJpbWcyd2VicC5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHdlYnBpbmZvX2V4YW1wbGUoTmF0aXZlRXhlY3V0YWJsZVNwZWMpIHsKKyAgICAgIGJpbmFyaWVzIHsKKyAgICAgICAgYWxsIHsKKyAgICAgICAgICBsaWIgbGlicmFyeTogImV4YW1wbGVfdXRpbCIsIGxpbmthZ2U6ICJzdGF0aWMiCisgICAgICAgICAgbGliIGxpYnJhcnk6ICJpbWFnZWlvX3V0aWwiLCBsaW5rYWdlOiAic3RhdGljIgorICAgICAgICAgIGxpYiBsaWJyYXJ5OiAid2VicCIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc291cmNlcyB7CisgICAgICAgIGMgeworICAgICAgICAgIHNvdXJjZSB7CisgICAgICAgICAgICBzcmNEaXIgIi4vZXhhbXBsZXMiCisgICAgICAgICAgICBpbmNsdWRlICJ3ZWJwaW5mby5jIgorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICB0YXNrcyB7CisgICAgLy8gVGFzayB0byB0ZXN0IGFsbCBwb3NzaWJsZSBjb25maWd1cmF0aW9ucy4KKyAgICBidWlsZEFsbEV4ZWN1dGFibGVzKFRhc2spIHsKKyAgICAgIGRlcGVuZHNPbiAkLmJpbmFyaWVzLmZpbmRBbGwgeyBpdC5idWlsZGFibGUgfQorICAgIH0KKyAgfQorfQorCisvLyBUYXNrIHRvIGdlbmVyYXRlIHRoZSB3cmFwcGVyLgordGFzayB3cmFwcGVyKHR5cGU6IFdyYXBwZXIpIHsKKyAgZ3JhZGxlVmVyc2lvbiA9ICcyLjEzJworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvV2ViUENvbmZpZy5jbWFrZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL1dlYlBDb25maWcuY21ha2UuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzZGYyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL1dlYlBDb25maWcuY21ha2UuaW4KQEAgLTAsMCArMSw2IEBACitAUEFDS0FHRV9JTklUQAorCitzZXQoV2ViUF9JTkNMVURFX0RJUlMgIndlYnAiKQorc2V0KFdFQlBfSU5DTFVERV9ESVJTICR7V2ViUF9JTkNMVURFX0RJUlN9KQorc2V0KFdlYlBfTElCUkFSSUVTICJASU5TVEFMTEVEX0xJQlJBUklFU0AiKQorc2V0KFdFQlBfTElCUkFSSUVTICIke1dlYlBfTElCUkFSSUVTfSIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jb25maWcuaC5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NvbmZpZy5oLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODRhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jb25maWcuaC5pbgpAQCAtMCwwICsxLDE1NiBAQAorLyogQWRhcHRlZCBmcm9tIHRoZSBhdXRvdG9vbHMgc3JjL3dlYnAvY29uZmlnLmguaW4uICAqLworCisvKiBEZWZpbmUgaWYgYnVpbGRpbmcgdW5pdmVyc2FsIChpbnRlcm5hbCBoZWxwZXIgbWFjcm8pICovCisvKiBUT0RPOiBoYW5kbGUgcHJvcGVybHkgaW4gQ01ha2UgKi8KKyNjbWFrZWRlZmluZSBBQ19BUFBMRV9VTklWRVJTQUxfQlVJTEQgMQorCisvKiBTZXQgdG8gMSBpZiBfX2J1aWx0aW5fYnN3YXAxNiBpcyBhdmFpbGFibGUgKi8KKyNjbWFrZWRlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVAxNiAxCisKKy8qIFNldCB0byAxIGlmIF9fYnVpbHRpbl9ic3dhcDMyIGlzIGF2YWlsYWJsZSAqLworI2NtYWtlZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDMyIDEKKworLyogU2V0IHRvIDEgaWYgX19idWlsdGluX2Jzd2FwNjQgaXMgYXZhaWxhYmxlICovCisjY21ha2VkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQNjQgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNwdS1mZWF0dXJlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0NQVV9GRUFUVVJFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0RMRkNOX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPEdMVVQvZ2x1dC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0dMVVRfR0xVVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxHTC9nbHV0Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfR0xfR0xVVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX0lOVFRZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX01FTU9SWV9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxPcGVuR0wvZ2x1dC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX09QRU5HTF9HTFVUX0ggMQorCisvKiBIYXZlIFBUSFJFQURfUFJJT19JTkhFUklULiAqLworI2NtYWtlZGVmaW5lIEhBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVQgQEhBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVRACisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2hsd2FwaS5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NITFdBUElfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RESU5UX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGxpYi5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TVFJJTkdfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjY21ha2VkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8dW5pc3RkLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfVU5JU1REX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHdpbmNvZGVjLmg+IGhlYWRlciBmaWxlLiAqLworI2NtYWtlZGVmaW5lIEhBVkVfV0lOQ09ERUNfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8d2luZG93cy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNjbWFrZWRlZmluZSBIQVZFX1dJTkRPV1NfSCAxCisKKy8qIERlZmluZSB0byB0aGUgc3ViLWRpcmVjdG9yeSBpbiB3aGljaCBsaWJ0b29sIHN0b3JlcyB1bmluc3RhbGxlZCBsaWJyYXJpZXMuCisgICAqLworLyogVE9ETzogaGFuZGxlIHByb3Blcmx5IGluIENNYWtlICovCisjY21ha2VkZWZpbmUgTFRfT0JKRElSICJATFRfT0JKRElSQCIKKworLyogTmFtZSBvZiBwYWNrYWdlICovCisjY21ha2VkZWZpbmUgUEFDS0FHRSAiQFBST0pFQ1RfTkFNRUAiCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfQlVHUkVQT1JUICJAUEFDS0FHRV9CVUdSRVBPUlRAIgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9OQU1FICJAUEFDS0FHRV9OQU1FQCIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlLiAqLworI2NtYWtlZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJAUEFDS0FHRV9TVFJJTkdAIgorCisvKiBEZWZpbmUgdG8gdGhlIG9uZSBzeW1ib2wgc2hvcnQgbmFtZSBvZiB0aGlzIHBhY2thZ2UuICovCisjY21ha2VkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJAUEFDS0FHRV9UQVJOQU1FQCIKKworLyogRGVmaW5lIHRvIHRoZSBob21lIHBhZ2UgZm9yIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1VSTCAiQFBBQ0tBR0VfVVJMQCIKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNjbWFrZWRlZmluZSBQQUNLQUdFX1ZFUlNJT04gIkBQQUNLQUdFX1ZFUlNJT05AIgorCisvKiBEZWZpbmUgdG8gbmVjZXNzYXJ5IHN5bWJvbCBpZiB0aGlzIGNvbnN0YW50IHVzZXMgYSBub24tc3RhbmRhcmQgbmFtZSBvbgorICAgeW91ciBzeXN0ZW0uICovCisjY21ha2VkZWZpbmUgUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgQU5TSSBDIGhlYWRlciBmaWxlcy4gKi8KKyNjbWFrZWRlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCisjY21ha2VkZWZpbmUgVkVSU0lPTiAiQFZFUlNJT05AIgorCisvKiBTZXQgdG8gMSBpZiBBVlgyIGlzIHN1cHBvcnRlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9BVlgyIDEKKworLyogU2V0IHRvIDEgaWYgR0lGIGxpYnJhcnkgaXMgaW5zdGFsbGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX0dJRiAxCisKKy8qIFNldCB0byAxIGlmIE9wZW5HTCBpcyBzdXBwb3J0ZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfR0wgMQorCisvKiBTZXQgdG8gMSBpZiBKUEVHIGxpYnJhcnkgaXMgaW5zdGFsbGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX0pQRUcgMQorCisvKiBTZXQgdG8gMSBpZiBORU9OIGlzIHN1cHBvcnRlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9ORU9OCisKKy8qIFNldCB0byAxIGlmIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIE5FT04gaXMgZW5hYmxlZCAqLworLyogVE9ETzogaGFuZGxlIHByb3Blcmx5IGluIENNYWtlICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX05FT05fUlRDRAorCisvKiBTZXQgdG8gMSBpZiBQTkcgbGlicmFyeSBpcyBpbnN0YWxsZWQgKi8KKyNjbWFrZWRlZmluZSBXRUJQX0hBVkVfUE5HIDEKKworLyogU2V0IHRvIDEgaWYgU0RMIGxpYnJhcnkgaXMgaW5zdGFsbGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX1NETCAxCisKKy8qIFNldCB0byAxIGlmIFNTRTIgaXMgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX1NTRTIgMQorCisvKiBTZXQgdG8gMSBpZiBTU0U0LjEgaXMgc3VwcG9ydGVkICovCisjY21ha2VkZWZpbmUgV0VCUF9IQVZFX1NTRTQxIDEKKworLyogU2V0IHRvIDEgaWYgVElGRiBsaWJyYXJ5IGlzIGluc3RhbGxlZCAqLworI2NtYWtlZGVmaW5lIFdFQlBfSEFWRV9USUZGIDEKKworLyogRW5hYmxlIG5lYXIgbG9zc2xlc3MgZW5jb2RpbmcgKi8KKyNjbWFrZWRlZmluZSBXRUJQX05FQVJfTE9TU0xFU1MgMQorCisvKiBVbmRlZmluZSB0aGlzIHRvIGRpc2FibGUgdGhyZWFkIHN1cHBvcnQuICovCisjY21ha2VkZWZpbmUgV0VCUF9VU0VfVEhSRUFEIDEKKworLyogRGVmaW5lIFdPUkRTX0JJR0VORElBTiB0byAxIGlmIHlvdXIgcHJvY2Vzc29yIHN0b3JlcyB3b3JkcyB3aXRoIHRoZSBtb3N0CisgICBzaWduaWZpY2FudCBieXRlIGZpcnN0IChsaWtlIE1vdG9yb2xhIGFuZCBTUEFSQywgdW5saWtlIEludGVsKS4gKi8KKyNpZiBkZWZpbmVkIEFDX0FQUExFX1VOSVZFUlNBTF9CVUlMRAorIyBpZiBkZWZpbmVkIF9fQklHX0VORElBTl9fCisjICBkZWZpbmUgV09SRFNfQklHRU5ESUFOIDEKKyMgZW5kaWYKKyNlbHNlCisjIGlmbmRlZiBXT1JEU19CSUdFTkRJQU4KKyMgIHVuZGVmIFdPUkRTX0JJR0VORElBTgorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jcHUuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9jcHUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhMWJmZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NtYWtlL2NwdS5jbWFrZQpAQCAtMCwwICsxLDEyNSBAQAorIyMgQ2hlY2sgZm9yIFNJTUQgZXh0ZW5zaW9ucy4KK2luY2x1ZGUoQ01ha2VQdXNoQ2hlY2tTdGF0ZSkKKworZnVuY3Rpb24od2VicF9jaGVja19jb21waWxlcl9mbGFnIFdFQlBfU0lNRF9GTEFHIEVOQUJMRV9TSU1EKQorICBpZihOT1QgRU5BQkxFX1NJTUQpCisgICAgbWVzc2FnZShTVEFUVVMgIkRpc2FibGluZyAke1dFQlBfU0lNRF9GTEFHfSBvcHRpbWl6YXRpb24uIikKKyAgICBzZXQoV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9IDAgUEFSRU5UX1NDT1BFKQorICAgIHJldHVybigpCisgIGVuZGlmKCkKKyAgdW5zZXQoV0VCUF9IQVZFX0ZMQUdfJHtXRUJQX1NJTURfRkxBR30gQ0FDSEUpCisgIGNtYWtlX3B1c2hfY2hlY2tfc3RhdGUoKQorICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMgJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9KQorICBjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgICAjaW5jbHVkZSBcIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vLi4vc3JjL2RzcC9kc3AuaFwiCisgICAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAgICNpZiAhZGVmaW5lZChXRUJQX1VTRV8ke1dFQlBfU0lNRF9GTEFHfSkKKyAgICAgICAgdGhpcyBpcyBub3QgdmFsaWQgY29kZQorICAgICAgICAjZW5kaWYKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgIiBXRUJQX0hBVkVfRkxBR18ke1dFQlBfU0lNRF9GTEFHfQorICApCisgIGNtYWtlX3BvcF9jaGVja19zdGF0ZSgpCisgIGlmKFdFQlBfSEFWRV9GTEFHXyR7V0VCUF9TSU1EX0ZMQUd9KQorICAgIHNldChXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30gMSBQQVJFTlRfU0NPUEUpCisgIGVsc2UoKQorICAgIHNldChXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30gMCBQQVJFTlRfU0NPUEUpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB0aG9zZSBhcmUgaW5jbHVkZWQgaW4gdGhlIG5hbWVzIG9mIFdFQlBfVVNFXyogaW4gYysrIGNvZGUuCitzZXQoV0VCUF9TSU1EX0ZMQUdTICJTU0UyO1NTRTQxO0FWWDI7TUlQUzMyO01JUFNfRFNQX1IyO05FT047TVNBIikKK3NldChXRUJQX1NJTURfRklMRV9FWFRFTlNJT05TICJfc3NlMi5jO19zc2U0MS5jO19hdngyLmM7X21pcHMzMi5jO19taXBzX2RzcF9yMi5jO19uZW9uLmM7X21zYS5jIikKK2lmKE1TVkMpCisgICMgTVNWQyBkb2VzIG5vdCBoYXZlIGEgU1NFNCBmbGFnIGJ1dCBBVlgyIHN1cHBvcnQgaW1wbGllcworICAjIFNTRTQgc3VwcG9ydC4KKyAgc2V0KFNJTURfRU5BQkxFX0ZMQUdTICIvYXJjaDpTU0UyOy9hcmNoOkFWWDI7L2FyY2g6QVZYMjs7OzsiKQorICBzZXQoU0lNRF9ESVNBQkxFX0ZMQUdTKQorZWxzZSgpCisgIHNldChTSU1EX0VOQUJMRV9GTEFHUyAiLW1zc2UyOy1tc3NlNC4xOy1tYXZ4MjstbWlwczMyOy1tZHNwcjI7LW1mcHU9bmVvbjstbW1zYSIpCisgIHNldChTSU1EX0RJU0FCTEVfRkxBR1MgIi1tbm8tc3NlMjstbW5vLXNzZTQuMTstbW5vLWF2eDI7Oy1tbm8tZHNwcjI7Oy1tbm8tbXNhIikKK2VuZGlmKCkKKworc2V0KFdFQlBfU0lNRF9GSUxFU19UT19OT1RfSU5DTFVERSkKK3NldChXRUJQX1NJTURfRklMRVNfVE9fSU5DTFVERSkKK3NldChXRUJQX1NJTURfRkxBR1NfVE9fSU5DTFVERSkKKworaWYoJHtBTkRST0lEfSkKKyAgaWYoJHtBTkRST0lEX0FCSX0gU1RSRVFVQUwgImFybWVhYmktdjdhIikKKyAgICAjIFRoaXMgaXMgYmVjYXVzZSBBbmRyb2lkIHN0dWRpbyB1c2VzIHRoZSBjb25maWd1cmF0aW9uCisgICAgIyAiLW1hcmNoPWFybXY3LWEgLW1mbG9hdC1hYmk9c29mdGZwIC1tZnB1PXZmcHYzLWQxNiIKKyAgICAjIHRoYXQgZG9lcyBub3QgdHJpZ2dlciBuZW9uIG9wdGltaXphdGlvbnMgYnV0IHNob3VsZAorICAgICMgKGFzIHRoaXMgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBleGlzdCBhbnltb3JlKS4KKyAgICBzZXQoQ01BS0VfQ19GTEFHUyAiJHtDTUFLRV9DX0ZMQUdTfSAtbWZwdT1uZW9uICIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworbGlzdChMRU5HVEggV0VCUF9TSU1EX0ZMQUdTIFdFQlBfU0lNRF9GTEFHU19MRU5HVEgpCittYXRoKEVYUFIgV0VCUF9TSU1EX0ZMQUdTX1JBTkdFICIke1dFQlBfU0lNRF9GTEFHU19MRU5HVEh9IC0gMSIpCisKK2ZvcmVhY2goSV9TSU1EIFJBTkdFICR7V0VCUF9TSU1EX0ZMQUdTX1JBTkdFfSkKKyAgbGlzdChHRVQgV0VCUF9TSU1EX0ZMQUdTICR7SV9TSU1EfSBXRUJQX1NJTURfRkxBRykKKworICAjIEZpcnN0IHRyeSB3aXRoIG5vIGV4dHJhIGZsYWcgYWRkZWQgYXMgdGhlIGNvbXBpbGVyIG1pZ2h0IGhhdmUgZGVmYXVsdCBmbGFncworICAjIChlc3BlY2lhbGx5IG9uIEFuZHJvaWQpLgorICB1bnNldChXRUJQX0hBVkVfJHtXRUJQX1NJTURfRkxBR30gQ0FDSEUpCisgIGNtYWtlX3B1c2hfY2hlY2tfc3RhdGUoKQorICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MpCisgIHdlYnBfY2hlY2tfY29tcGlsZXJfZmxhZygke1dFQlBfU0lNRF9GTEFHfSAke1dFQlBfRU5BQkxFX1NJTUR9KQorICBpZihOT1QgV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9KQorICAgIGxpc3QoR0VUIFNJTURfRU5BQkxFX0ZMQUdTICR7SV9TSU1EfSBTSU1EX0NPTVBJTEVfRkxBRykKKyAgICBzZXQoQ01BS0VfUkVRVUlSRURfRkxBR1MgJHtTSU1EX0NPTVBJTEVfRkxBR30pCisgICAgd2VicF9jaGVja19jb21waWxlcl9mbGFnKCR7V0VCUF9TSU1EX0ZMQUd9ICR7V0VCUF9FTkFCTEVfU0lNRH0pCisgIGVsc2UoKQorICAgIHNldChTSU1EX0NPTVBJTEVfRkxBRyAiICIpCisgIGVuZGlmKCkKKyAgIyBDaGVjayB3aGljaCBmaWxlcyB3ZSBzaG91bGQgaW5jbHVkZSBvciBub3QuCisgIGxpc3QoR0VUIFdFQlBfU0lNRF9GSUxFX0VYVEVOU0lPTlMgJHtJX1NJTUR9IFdFQlBfU0lNRF9GSUxFX0VYVEVOU0lPTikKKyAgZmlsZShHTE9CIFNJTURfRklMRVMgIiR7Q01BS0VfQ1VSUkVOVF9MSVNUX0RJUn0vLi4vIgorICAgICJzcmMvZHNwLyoke1dFQlBfU0lNRF9GSUxFX0VYVEVOU0lPTn0iCisgICkKKyAgaWYoV0VCUF9IQVZFXyR7V0VCUF9TSU1EX0ZMQUd9KQorICAgICMgTWVtb3JpemUgdGhlIGZpbGUgYW5kIGZsYWdzLgorICAgIGZvcmVhY2goRklMRSAke1NJTURfRklMRVN9KQorICAgICAgbGlzdChBUFBFTkQgV0VCUF9TSU1EX0ZJTEVTX1RPX0lOQ0xVREUgJHtGSUxFfSkKKyAgICAgIGxpc3QoQVBQRU5EIFdFQlBfU0lNRF9GTEFHU19UT19JTkNMVURFICR7U0lNRF9DT01QSUxFX0ZMQUd9KQorICAgIGVuZGZvcmVhY2goKQorICBlbHNlKCkKKyAgICAjIFJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBsaXN0LgorICAgIGZvcmVhY2goRklMRSAke1NJTURfRklMRVN9KQorICAgICAgbGlzdChBUFBFTkQgV0VCUF9TSU1EX0ZJTEVTX05PVF9UT19JTkNMVURFICR7RklMRX0pCisgICAgZW5kZm9yZWFjaCgpCisgICAgIyBFeHBsaWNpdGx5IGRpc2FibGUgU0lNRC4KKyAgICBpZihTSU1EX0RJU0FCTEVfRkxBR1MpCisgICAgICBsaXN0KEdFVCBTSU1EX0RJU0FCTEVfRkxBR1MgJHtJX1NJTUR9IFNJTURfQ09NUElMRV9GTEFHKQorICAgICAgaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCisgICAgICBpZihTSU1EX0NPTVBJTEVfRkxBRykKKyAgICAgICAgdW5zZXQoSEFTX0NPTVBJTEVfRkxBRyBDQUNIRSkKKyAgICAgICAgY2hlY2tfY19jb21waWxlcl9mbGFnKCR7U0lNRF9DT01QSUxFX0ZMQUd9IEhBU19DT01QSUxFX0ZMQUcpCisgICAgICAgIGlmKEhBU19DT01QSUxFX0ZMQUcpCisgICAgICAgICAgIyBEbyBvbmUgbW9yZSBjaGVjayBmb3IgQ2xhbmcgdG8gY2lyY3VtdmVudCBDTWFrZSBpc3N1ZSAxMzE5NC4KKyAgICAgICAgICBpZihDT01NQU5EIGNoZWNrX2NvbXBpbGVyX2ZsYWdfY29tbW9uX3BhdHRlcm5zKQorICAgICAgICAgICAgIyBPbmx5IGluIENNYWtlIDMuMCBhbmQgYWJvdmUuCisgICAgICAgICAgICBjaGVja19jb21waWxlcl9mbGFnX2NvbW1vbl9wYXR0ZXJucyhDT01NT05fUEFUVEVSTlMpCisgICAgICAgICAgZWxzZSgpCisgICAgICAgICAgICBzZXQoQ09NTU9OX1BBVFRFUk5TKQorICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgICBzZXQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgJHtTSU1EX0NPTVBJTEVfRkxBR30pCisgICAgICAgICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoImludCBtYWluKHZvaWQpIHtyZXR1cm4gMDt9IgorICAgICAgICAgICAgRkxBR18ke1NJTURfQ09NUElMRV9GTEFHfQorICAgICAgICAgICAgRkFJTF9SRUdFWCAid2FybmluZzogYXJndW1lbnQgdW51c2VkIGR1cmluZyBjb21waWxhdGlvbjoiCisgICAgICAgICAgICAke0NPTU1PTl9QQVRURVJOU30KKyAgICAgICAgICApCisgICAgICAgICAgaWYoTk9UIEZMQUdfJHtTSU1EX0NPTVBJTEVfRkxBR30pCisgICAgICAgICAgICB1bnNldChIQVNfQ09NUElMRV9GTEFHIENBQ0hFKQorICAgICAgICAgIGVuZGlmKCkKKyAgICAgICAgZW5kaWYoKQorICAgICAgICBpZihIQVNfQ09NUElMRV9GTEFHKQorICAgICAgICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9ICR7U0lNRF9DT01QSUxFX0ZMQUd9IikKKyAgICAgICAgZW5kaWYoKQorICAgICAgZW5kaWYoKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBjbWFrZV9wb3BfY2hlY2tfc3RhdGUoKQorZW5kZm9yZWFjaCgpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jbWFrZS9kZXBzLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvZGVwcy5jbWFrZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDVkMTBhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvY21ha2UvZGVwcy5jbWFrZQpAQCAtMCwwICsxLDE2NiBAQAorIyBHZW5lcmF0ZSB0aGUgY29uZmlnLmggdG8gY29tcGlsZSB3aXRoIHNwZWNpZmljIGludHJpbnNpY3MgLyBsaWJzLgorCisjIyBDaGVjayBmb3IgY29tcGlsZXIgb3B0aW9ucy4KK2luY2x1ZGUoQ2hlY2tDU291cmNlQ29tcGlsZXMpCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiCisgICAgaW50IG1haW4odm9pZCkgeworICAgICAgKHZvaWQpX19idWlsdGluX2Jzd2FwMTYoMCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICIKKyAgSEFWRV9CVUlMVElOX0JTV0FQMTYKKykKK2NoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIKKyAgICBpbnQgbWFpbih2b2lkKSB7CisgICAgICAodm9pZClfX2J1aWx0aW5fYnN3YXAzMigwKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgIgorICBIQVZFX0JVSUxUSU5fQlNXQVAzMgorKQorY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICh2b2lkKV9fYnVpbHRpbl9ic3dhcDY0KDApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAiCisgIEhBVkVfQlVJTFRJTl9CU1dBUDY0CispCisKKyMjIENoZWNrIGZvciBsaWJyYXJpZXMuCitmaW5kX3BhY2thZ2UoVGhyZWFkcykKK2lmKFRocmVhZHNfRk9VTkQpCisgIGlmKENNQUtFX1VTRV9QVEhSRUFEU19JTklUKQorICAgIHNldChDTUFLRV9DX0ZMQUdTICIke0NNQUtFX0NfRkxBR1N9IC1wdGhyZWFkIikKKyAgZW5kaWYoKQorICBmb3JlYWNoKFBUSFJFQURfVEVTVCBIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQpCisgICAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgICAgICAjaW5jbHVkZSA8cHRocmVhZC5oPgorICAgICAgICBpbnQgbWFpbiAodm9pZCkgeworICAgICAgICAgIGludCBhdHRyID0gJHtQVEhSRUFEX1RFU1R9OworICAgICAgICAgIHJldHVybiBhdHRyOworICAgICAgICB9CisgICAgICAiICR7UFRIUkVBRF9URVNUfQorICAgICkKKyAgZW5kZm9yZWFjaCgpCisgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0xJQlJBUklFUyAke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9KQorZW5kaWYoKQorc2V0KFdFQlBfVVNFX1RIUkVBRCAke1RocmVhZHNfRk9VTkR9KQorCisjIFRPRE86IHRoaXMgc2VlbXMgdW51c2VkLCBjaGVjayB3aXRoIGF1dG90b29scy4KK3NldChMVF9PQkpESVIgIi5saWJzLyIpCisKKyMgT25seSB1c2VmdWwgZm9yIHZ3ZWJwLCBzbyB1c2VsZXNzIGZvciBub3cuCisjIGZpbmRfcGFja2FnZShPcGVuR0wpCisjIHNldChXRUJQX0hBVkVfR0wgJHtPUEVOR0xfRk9VTkR9KQorIyBzZXQoV0VCUF9ERVBfSU5DTFVERV9ESVJTICR7V0VCUF9ERVBfSU5DTFVERV9ESVJTfSAke09QRU5HTF9JTkNMVURFX0RJUlN9KQorIyBzZXQoV0VCUF9ERVBfTElCUkFSSUVTICR7V0VCUF9ERVBfTElCUkFSSUVTfSAke09QRU5HTF9MSUJSQVJJRVN9KQorCisjIEZpbmQgdGhlIHN0YW5kYXJkIEMgbWF0aCBsaWJyYXJ5LgorZmluZF9saWJyYXJ5KE1BVEhfTElCUkFSWSBOQU1FUyBtKQoraWYoTUFUSF9MSUJSQVJZKQorICBsaXN0KEFQUEVORCBXRUJQX0RFUF9MSUJSQVJJRVMgJHtNQVRIX0xJQlJBUll9KQorZW5kaWYoKQorCisjIEZpbmQgdGhlIHN0YW5kYXJkIGltYWdlIGxpYnJhcmllcy4KK3NldChXRUJQX0RFUF9JTUdfTElCUkFSSUVTKQorc2V0KFdFQlBfREVQX0lNR19JTkNMVURFX0RJUlMpCitmb3JlYWNoKElfTElCIFBORyBKUEVHIFRJRkYpCisgIGZpbmRfcGFja2FnZSgke0lfTElCfSkKKyAgc2V0KFdFQlBfSEFWRV8ke0lfTElCfSAkeyR7SV9MSUJ9X0ZPVU5EfSkKKyAgaWYoJHtJX0xJQn1fRk9VTkQpCisgICAgbGlzdChBUFBFTkQgV0VCUF9ERVBfSU1HX0xJQlJBUklFUyAkeyR7SV9MSUJ9X0xJQlJBUklFU30pCisgICAgbGlzdChBUFBFTkQgV0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSUworICAgICAgICAgJHske0lfTElCfV9JTkNMVURFX0RJUn0gJHske0lfTElCfV9JTkNMVURFX0RJUlN9KQorICBlbmRpZigpCitlbmRmb3JlYWNoKCkKK2lmKFdFQlBfREVQX0lNR19JTkNMVURFX0RJUlMpCisgIGxpc3QoUkVNT1ZFX0RVUExJQ0FURVMgV0VCUF9ERVBfSU1HX0lOQ0xVREVfRElSUykKK2VuZGlmKCkKKworIyBHSUYgZGV0ZWN0aW9uLCBnaWZkZWMgaXNuJ3QgcGFydCBvZiB0aGUgaW1hZ2VpbyBsaWIuCitpbmNsdWRlKENNYWtlUHVzaENoZWNrU3RhdGUpCitzZXQoV0VCUF9ERVBfR0lGX0xJQlJBUklFUykKK3NldChXRUJQX0RFUF9HSUZfSU5DTFVERV9ESVJTKQorZmluZF9wYWNrYWdlKEdJRikKK3NldChXRUJQX0hBVkVfR0lGICR7R0lGX0ZPVU5EfSkKK2lmKEdJRl9GT1VORCkKKyAgIyBHSUYgZmluZF9wYWNrYWdlIG9ubHkgbG9jYXRlcyB0aGUgaGVhZGVyIGFuZCBsaWJyYXJ5LCBpdCBkb2Vzbid0IGZhaWwKKyAgIyBjb21waWxlIHRlc3RzIHdoZW4gZGV0ZWN0aW5nIHRoZSB2ZXJzaW9uLCBidXQgZmFsbHMgYmFjayB0byAzIChhcyBvZiBhdAorICAjIGxlYXN0IGNtYWtlIDMuNy4yKS4gTWFrZSBzdXJlIHRoZSBsaWJyYXJ5IGxpbmtzIHRvIGF2b2lkIGluY29ycmVjdAorICAjIGRldGVjdGlvbiB3aGVuIGNyb3NzIGNvbXBpbGluZy4KKyAgY21ha2VfcHVzaF9jaGVja19zdGF0ZSgpCisgIHNldChDTUFLRV9SRVFVSVJFRF9MSUJSQVJJRVMgJHtHSUZfTElCUkFSSUVTfSkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7R0lGX0lOQ0xVREVfRElSfSkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoIgorICAgICAgI2luY2x1ZGUgPGdpZl9saWIuaD4KKyAgICAgIGludCBtYWluKHZvaWQpIHsKKyAgICAgICAgKHZvaWQpREdpZk9wZW5GaWxlSGFuZGxlOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgICIgR0lGX0NPTVBJTEVTCisgICkKKyAgY21ha2VfcG9wX2NoZWNrX3N0YXRlKCkKKyAgaWYoR0lGX0NPTVBJTEVTKQorICAgIGxpc3QoQVBQRU5EIFdFQlBfREVQX0dJRl9MSUJSQVJJRVMgJHtHSUZfTElCUkFSSUVTfSkKKyAgICBsaXN0KEFQUEVORCBXRUJQX0RFUF9HSUZfSU5DTFVERV9ESVJTICR7R0lGX0lOQ0xVREVfRElSfSkKKyAgZWxzZSgpCisgICAgdW5zZXQoR0lGX0ZPVU5EKQorICBlbmRpZigpCitlbmRpZigpCisKKyMjIENoZWNrIGZvciBzcGVjaWZpYyBoZWFkZXJzLgoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2NoZWNrX2luY2x1ZGVfZmlsZXMoInN0ZGxpYi5oO3N0ZGFyZy5oO3N0cmluZy5oO2Zsb2F0LmgiIFNURENfSEVBREVSUykKK2NoZWNrX2luY2x1ZGVfZmlsZXMoZGxmY24uaCBIQVZFX0RMRkNOX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKEdMVVQvZ2x1dC5oIEhBVkVfR0xVVF9HTFVUX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKEdML2dsdXQuaCBIQVZFX0dMX0dMVVRfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoaW50dHlwZXMuaCBIQVZFX0lOVFRZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKG1lbW9yeS5oIEhBVkVfTUVNT1JZX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKE9wZW5HTC9nbHV0LmggSEFWRV9PUEVOR0xfR0xVVF9IKQorY2hlY2tfaW5jbHVkZV9maWxlcyhzaGx3YXBpLmggSEFWRV9TSExXQVBJX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN0ZGludC5oIEhBVkVfU1RESU5UX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN0ZGxpYi5oIEhBVkVfU1RETElCX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN0cmluZ3MuaCBIQVZFX1NUUklOR1NfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3RyaW5nLmggSEFWRV9TVFJJTkdfSCkKK2NoZWNrX2luY2x1ZGVfZmlsZXMoc3lzL3N0YXQuaCBIQVZFX1NZU19TVEFUX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHN5cy90eXBlcy5oIEhBVkVfU1lTX1RZUEVTX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHVuaXN0ZC5oIEhBVkVfVU5JU1REX0gpCitjaGVja19pbmNsdWRlX2ZpbGVzKHdpbmNvZGVjLmggSEFWRV9XSU5DT0RFQ19IKQorY2hlY2tfaW5jbHVkZV9maWxlcyh3aW5kb3dzLmggSEFWRV9XSU5ET1dTX0gpCisKKyMgV2luZG93cyBzcGVjaWZpY3MKK2lmKEhBVkVfV0lOQ09ERUNfSCkKKyAgbGlzdChBUFBFTkQgV0VCUF9ERVBfTElCUkFSSUVTIHNobHdhcGkgb2xlMzIgd2luZG93c2NvZGVjcykKK2VuZGlmKCkKKworIyMgQ2hlY2sgZm9yIFNJTUQgZXh0ZW5zaW9ucy4KK2luY2x1ZGUoJHtDTUFLRV9DVVJSRU5UX0xJU1RfRElSfS9jcHUuY21ha2UpCisKKyMjIERlZmluZSBleHRyYSBpbmZvLgorc2V0KFBBQ0tBR0UgJHtQUk9KRUNUX05BTUV9KQorc2V0KFBBQ0tBR0VfTkFNRSAke1BST0pFQ1RfTkFNRX0pCisKKyMgUmVhZCBmcm9tIGNvbmZpZ3VyZS5hYy4KK2ZpbGUoUkVBRCAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vY29uZmlndXJlLmFjIENPTkZJR1VSRV9BQykKK3N0cmluZyhSRUdFWCBNQVRDSEFMTCAiXFxbKFswLTlhLXpcXC46L10qKVxcXSIKKyAgQ09ORklHVVJFX0FDX1BBQ0tBR0VfSU5GTyAke0NPTkZJR1VSRV9BQ30KKykKK2Z1bmN0aW9uKHN0cmlwX2JyYWNrZXQgVkFSKQorICBzdHJpbmcoTEVOR1RIICR7JHtWQVJ9fSBUTVBfTEVOKQorICBtYXRoKEVYUFIgVE1QX0xFTiAke1RNUF9MRU59LTIpCisgIHN0cmluZyhTVUJTVFJJTkcgJHske1ZBUn19IDEgJHtUTVBfTEVOfSBUTVBfU1VCKQorICBzZXQoJHtWQVJ9ICR7VE1QX1NVQn0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCitsaXN0KEdFVCBDT05GSUdVUkVfQUNfUEFDS0FHRV9JTkZPIDEgUEFDS0FHRV9WRVJTSU9OKQorc3RyaXBfYnJhY2tldChQQUNLQUdFX1ZFUlNJT04pCitsaXN0KEdFVCBDT05GSUdVUkVfQUNfUEFDS0FHRV9JTkZPIDIgUEFDS0FHRV9CVUdSRVBPUlQpCitzdHJpcF9icmFja2V0KFBBQ0tBR0VfQlVHUkVQT1JUKQorbGlzdChHRVQgQ09ORklHVVJFX0FDX1BBQ0tBR0VfSU5GTyAzIFBBQ0tBR0VfVVJMKQorc3RyaXBfYnJhY2tldChQQUNLQUdFX1VSTCkKKworIyBCdWlsZCBtb3JlIGluZm8uCitzZXQoUEFDS0FHRV9TVFJJTkcgIiR7UEFDS0FHRV9OQU1FfSAke1BBQ0tBR0VfVkVSU0lPTn0iKQorc2V0KFBBQ0tBR0VfVEFSTkFNRSAke1BBQ0tBR0VfTkFNRX0pCitzZXQoVkVSU0lPTiAke1BBQ0tBR0VfVkVSU0lPTn0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jb25maWd1cmUuYWMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9jb25maWd1cmUuYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2ZTVmZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2NvbmZpZ3VyZS5hYwpAQCAtMCwwICsxLDgwMiBAQAorQUNfSU5JVChbbGlid2VicF0sIFsxLjAuMF0sCisgICAgICAgIFtodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicF0sLAorICAgICAgICBbaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwXSkKK0FDX0NBTk9OSUNBTF9IT1NUCitBQ19QUkVSRVEoWzIuNjBdKQorQU1fSU5JVF9BVVRPTUFLRShbLVdhbGwgZm9yZWlnbiBzdWJkaXItb2JqZWN0c10pCisKK2RubCA9PT0gYXV0b21ha2UgPj0gMS4xMiByZXF1aXJlcyB0aGlzIGZvciAndW51c3VhbCBhcmNoaXZlcnMnIHN1cHBvcnQuCitkbmwgPT09IGl0IG11c3Qgb2NjdXIgYmVmb3JlIExUX0lOSVQgKEFDX1BST0dfTElCVE9PTCkuCittNF9pZmRlZihbQU1fUFJPR19BUl0sIFtBTV9QUk9HX0FSXSkKKworQUNfUFJPR19MSUJUT09MCitBQ19QUk9HX1NFRAorQU1fUFJPR19DQ19DX08KKworZG5sID09PSBFbmFibGUgbGVzcyB2ZXJib3NlIG91dHB1dCB3aGVuIGJ1aWxkaW5nLgorbTRfaWZkZWYoW0FNX1NJTEVOVF9SVUxFU10sIFtBTV9TSUxFTlRfUlVMRVMoW3llc10pXSkKKworZG5sID09IHRlc3QgZW5kaWFubmVzcworQUNfQ19CSUdFTkRJQU4KKworZG5sID09PSBTRVRfSUZfVU5TRVQoc2hlbGxfdmFyLCB2YWx1ZSkKK2RubCA9PT0gICBTZXQgdGhlIHNoZWxsIHZhcmlhYmxlICdzaGVsbF92YXInIHRvICd2YWx1ZScgaWYgaXQgaXMgdW5zZXQuCitBQ19ERUZVTihbU0VUX0lGX1VOU0VUXSwgW3Rlc3QgIiR7JDErc2V0fSIgPSAic2V0IiB8fCAkMT0kMl0pCisKK0FDX0FSR19FTkFCTEUoW2V2ZXJ5dGhpbmddLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtZXZlcnl0aGluZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFbmFibGUgYWxsIG9wdGlvbmFsIHRhcmdldHMuIFRoZXNlIGNhbiBzdGlsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQgd2l0aCAtLWRpc2FibGUtdGFyZ2V0XSksCisgICAgICAgICAgICAgIFtTRVRfSUZfVU5TRVQoW2VuYWJsZV9saWJ3ZWJwZGVjb2Rlcl0sIFskZW5hYmxldmFsXSkKKyAgICAgICAgICAgICAgIFNFVF9JRl9VTlNFVChbZW5hYmxlX2xpYndlYnBkZW11eF0sIFskZW5hYmxldmFsXSkKKyAgICAgICAgICAgICAgIFNFVF9JRl9VTlNFVChbZW5hYmxlX2xpYndlYnBleHRyYXNdLCBbJGVuYWJsZXZhbF0pCisgICAgICAgICAgICAgICBTRVRfSUZfVU5TRVQoW2VuYWJsZV9saWJ3ZWJwbXV4XSwgWyRlbmFibGV2YWxdKV0pCisKK2RubCA9PT0gSWYgLS1lbmFibGUtYXNzZXJ0cyBpcyBub3QgZGVmaW5lZCwgZGVmaW5lIE5ERUJVRworCitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBhc3NlcnRzIGFyZSBlbmFibGVkKQorQUNfQVJHX0VOQUJMRShbYXNzZXJ0c10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1hc3NlcnRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0VuYWJsZSBhc3NlcnQgY2hlY2tzXSkpCitpZiB0ZXN0ICJ4JHtlbmFibGVfYXNzZXJ0cy1ub30iID0gInhubyI7IHRoZW4KKyAgQU1fQ1BQRkxBR1M9IiR7QU1fQ1BQRkxBR1N9IC1ETkRFQlVHIgorZmkKK0FDX01TR19SRVNVTFQoJHtlbmFibGVfYXNzZXJ0cy1ub30pCitBQ19TVUJTVChbQU1fQ1BQRkxBR1NdKQorCitBQ19BUkdfV0lUSChbcGtnY29uZmlnZGlyXSwgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC1wa2djb25maWdkaXI9RElSXSwKKyAgICAgICAgICAgIFtQYXRoIHRvIHRoZSBwa2djb25maWcgZGlyZWN0b3J5IEA8OkBMSUJESVIvcGtnY29uZmlnQDo+QF0pLAorICAgICAgICAgICAgW3BrZ2NvbmZpZ2Rpcj0iJHdpdGh2YWwiXSwgW3BrZ2NvbmZpZ2Rpcj0nJHtsaWJkaXJ9L3BrZ2NvbmZpZyddKQorQUNfU1VCU1QoW3BrZ2NvbmZpZ2Rpcl0pCisKK2RubCA9PT0gVEVTVF9BTkRfQUREX0NGTEFHUyh2YXIsIGZsYWcpCitkbmwgPT09ICAgQ2hlY2tzIHdoZXRoZXIgJENDIHN1cHBvcnRzICdmbGFnJyBhbmQgYWRkcyBpdCB0byAndmFyJworZG5sID09PSAgIG9uIHN1Y2Nlc3MuCitBQ19ERUZVTihbVEVTVF9BTkRfQUREX0NGTEFHU10sCisgICAgICAgICBbU0FWRURfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICAgIENGTEFHUz0iLVdlcnJvciAkMiIKKyAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgJENDIHN1cHBvcnRzICQyXSkKKyAgICAgICAgICBkbmwgTm90ZSBBQ19MQU5HX1BST0dSQU0oW10pIHVzZXMgYW4gb2xkLXN0eWxlIG1haW4gZGVmaW5pdGlvbi4KKyAgICAgICAgICBBQ19DT01QSUxFX0lGRUxTRShbQUNfTEFOR19TT1VSQ0UoW2ludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH1dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRubCBTaW1wbHkgYXBwZW5kIHRoZSB2YXJpYWJsZSBhdm9pZGluZyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG5sIGNvbXBhdGliaWxpdHkgaWZkZWYgZm9yIEFTX1ZBUl9BUFBFTkQgYXMgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRubCB2YXJpYWJsZSBzaG91bGRuJ3QgZ3JvdyBhbGwgdGhhdCBsYXJnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJDE9IiR7JDF9ICQyIl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW25vXSldKQorICAgICAgICAgIENGTEFHUz0iJFNBVkVEX0NGTEFHUyJdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1mdmlzaWJpbGl0eT1oaWRkZW5dKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XYWxsXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2NvbnN0YW50LWNvbnZlcnNpb25dKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50XSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2V4dHJhXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV2Zsb2F0LWNvbnZlcnNpb25dKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XZm9ybWF0IC1XZm9ybWF0LW5vbmxpdGVyYWxdKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1XZm9ybWF0IC1XZm9ybWF0LXNlY3VyaXR5XSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV21pc3NpbmctZGVjbGFyYXRpb25zXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV21pc3NpbmctcHJvdG90eXBlc10pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdvbGQtc3R5bGUtZGVmaW5pdGlvbl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdwYXJlbnRoZXNlcy1lcXVhbGl0eV0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVdzaGFkb3ddKQorVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1Xc2hvcnRlbi02NC10by0zMl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVd1bmRlZl0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVd1bnJlYWNoYWJsZS1jb2RlXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlXSkKK1RFU1RfQU5EX0FERF9DRkxBR1MoW0FNX0NGTEFHU10sIFstV3VudXNlZF0pCitURVNUX0FORF9BRERfQ0ZMQUdTKFtBTV9DRkxBR1NdLCBbLVd2bGFdKQorIyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02MjA0MAorIyBodHRwczovL2djYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD02MTYyMgorQVNfSUYoW3Rlc3QgIiRHQ0MiID0gInllcyIgXSwgWworICAgICAgIGdjY192ZXJzaW9uPWAkQ0MgLWR1bXB2ZXJzaW9uYAorICAgICAgIGdjY193aHRfYnVnPSIiCisgICAgICAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgICAgICAgYWFyY2g2NHxhcm02NCkKKyAgICAgICAgICBjYXNlICIkZ2NjX3ZlcnNpb24iIGluCisgICAgICAgICAgICA0Ljl8NC45LjB8NC45LjEpIGdjY193aHRfYnVnPXllcyA7OworICAgICAgICAgIGVzYWMKKyAgICAgICBlc2FjCisgICAgICAgQVNfSUYoW3Rlc3QgIiRnY2Nfd2h0X2J1ZyIgPSAieWVzIl0sIFsKKyAgICAgICAgICAgICAgVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1mcmVuYW1lLXJlZ2lzdGVyc10pXSldKQorIyBVc2UgLWZsYXgtdmVjdG9yLWNvbnZlcnNpb25zLCBpZiBhdmFpbGFibGUsIHdoZW4gYnVpbGRpbmcgaW50cmluc2ljcyB3aXRoCisjIG9sZGVyIHZlcnNpb25zIG9mIGdjYy4gVGhlIGZsYWcgYXBwZWFyZWQgaW4gNC4zLngsIGJ1dCBpZiBiYWNrcG9ydGVkLCBhbmQKKyMgLWZuby1sYXgtdmVjdG9yLWNvbnZlcnNpb25zIGlzIHNldCwgZXJyb3JzIG1heSBvY2N1ciB3aXRoIHRoZSBpbnRyaW5zaWNzCisjIGZpbGVzIGFsb25nIHdpdGggdGhlIG9sZGVyIHN5c3RlbSBpbmNsdWRlcywgZS5nLiwgZW1taW50cmluLmguCisjIE9yaWdpbmFsbHkgb2JzZXJ2ZWQgd2l0aCBjYyAoR0NDKSA0LjIuMSAyMDA3MDgzMSBwYXRjaGVkIFtGcmVlQlNEXSAoOS4zKS4KKyMgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAvaXNzdWVzL2RldGFpbD9pZD0yNzQKK0FTX0lGKFt0ZXN0ICIkR0NDIiA9ICJ5ZXMiIF0sIFsKKyAgICAgICBjYXNlICIkaG9zdF9jcHUiIGluCisgICAgICAgICBhbWQ2NHxpPzg2fHg4Nl82NCkKKyAgICAgICAgICAgQUNfQ09NUElMRV9JRkVMU0UoCisgICAgICAgICAgICAgZG5sIG9ubHkgY2hlY2sgZm9yIC1mbGF4LXZlY3Rvci1jb252ZXJzaW9ucyB3aXRoIG9sZGVyIGdjYywgc2tpcAorICAgICAgICAgICAgIGRubCBjbGFuZyBhcyBpdCByZXBvcnRzIGl0c2VsZiBhcyA0LjIuMSwgYnV0IHRoZSBmbGFnIGlzbid0IG5lZWRlZC4KKyAgICAgICAgICAgICBbQUNfTEFOR19TT1VSQ0UoWyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKF9fR05VQ19fIDw8IDgpIHwgX19HTlVDX01JTk9SX18pIDwgMHg0MDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlcnJvciBvbGQgZ2NjCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYWluKHZvaWQpIHsgcmV0dXJuIDA7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSldLCwKKyAgICAgICAgICAgICAgW1RFU1RfQU5EX0FERF9DRkxBR1MoW0lOVFJJTlNJQ1NfQ0ZMQUdTXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWy1mbGF4LXZlY3Rvci1jb252ZXJzaW9uc10pXSkKKyAgICAgICAgICAgOzsKKyAgICAgICBlc2FjXSkKK0FDX1NVQlNUKFtBTV9DRkxBR1NdKQorCitkbmwgPT09IENoZWNrIGZvciBtYWNoaW5lIHNwZWNpZmljIGZsYWdzCitBQ19BUkdfRU5BQkxFKFthdngyXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1hdngyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIEFWWDIgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKKworQVNfSUYoW3Rlc3QgIngkZW5hYmxlX2F2eDIiICE9ICJ4bm8iIC1hICJ4JGVuYWJsZV9zc2U0XzEiICE9ICJ4bm8iIFwKKyAgICAgICAgIC1hICJ4JGVuYWJsZV9zc2UyIiAhPSAieG5vIl0sIFsKKyAgQVZYMl9DRkxBR1M9IiRJTlRSSU5TSUNTX0NGTEFHUyAkQVZYMl9GTEFHUyIKKyAgVEVTVF9BTkRfQUREX0NGTEFHUyhbQVZYMl9GTEFHU10sIFstbWF2eDJdKQorICBBU19JRihbdGVzdCAtbiAiJEFWWDJfRkxBR1MiXSwgWworICAgIFNBVkVEX0NGTEFHUz0kQ0ZMQUdTCisgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRBVlgyX0ZMQUdTIgorICAgIEFDX0NIRUNLX0hFQURFUihbaW1taW50cmluLmhdLAorICAgICAgICAgICAgICAgICAgICBbQUNfREVGSU5FKFdFQlBfSEFWRV9BVlgyLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgQVZYMiBpcyBzdXBwb3J0ZWRdKV0sCisgICAgICAgICAgICAgICAgICAgIFtBVlgyX0ZMQUdTPSIiXSwKKyAgICAgICAgICAgICAgICAgICAgZG5sIGl0J3MgaWxsZWdhbCB0byBkaXJlY3RseSBpbmNsdWRlIGF2eDJpbnRyaW4uaCwgYnV0IGl0J3MKKyAgICAgICAgICAgICAgICAgICAgZG5sIGluY2x1ZGVkIGNvbmRpdGlvbmFsbHkgaW4gaW1taW50cmluLmgsIHRyaWNreSEKKyAgICAgICAgICAgICAgICAgICAgWyNpZm5kZWYgX19BVlgyX18KKyAgICAgICAgICAgICAgICAgICAgICNlcnJvciBhdngyIGlzIG5vdCBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgXSkKKyAgICBDRkxBR1M9JFNBVkVEX0NGTEFHU10pCisgIEFDX1NVQlNUKFtBVlgyX0ZMQUdTXSldKQorCitBQ19BUkdfRU5BQkxFKFtzc2U0LjFdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXNzZTQuMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBTU0U0LjEgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKKworQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3NzZTRfMSIgIT0gInhubyIgLWEgIngkZW5hYmxlX3NzZTIiICE9ICJ4bm8iXSwgWworICBTU0U0MV9GTEFHUz0iJElOVFJJTlNJQ1NfQ0ZMQUdTICRTU0U0MV9GTEFHUyIKKyAgVEVTVF9BTkRfQUREX0NGTEFHUyhbU1NFNDFfRkxBR1NdLCBbLW1zc2U0LjFdKQorICBBU19JRihbdGVzdCAtbiAiJFNTRTQxX0ZMQUdTIl0sIFsKKyAgICBTQVZFRF9DRkxBR1M9JENGTEFHUworICAgIENGTEFHUz0iJENGTEFHUyAkU1NFNDFfRkxBR1MiCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtzbW1pbnRyaW4uaF0sCisgICAgICAgICAgICAgICAgICAgIFtBQ19ERUZJTkUoV0VCUF9IQVZFX1NTRTQxLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgU1NFNC4xIGlzIHN1cHBvcnRlZF0pXSwKKyAgICAgICAgICAgICAgICAgICAgW1NTRTQxX0ZMQUdTPSIiXSkKKyAgICBDRkxBR1M9JFNBVkVEX0NGTEFHU10pCisgIEFDX1NVQlNUKFtTU0U0MV9GTEFHU10pXSkKKworQUNfQVJHX0VOQUJMRShbc3NlMl0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtc3NlMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBTU0UyIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCisKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9zc2UyIiAhPSAieG5vIl0sIFsKKyAgU1NFMl9GTEFHUz0iJElOVFJJTlNJQ1NfQ0ZMQUdTICRTU0UyX0ZMQUdTIgorICBURVNUX0FORF9BRERfQ0ZMQUdTKFtTU0UyX0ZMQUdTXSwgWy1tc3NlMl0pCisgIEFTX0lGKFt0ZXN0IC1uICIkU1NFMl9GTEFHUyJdLCBbCisgICAgU0FWRURfQ0ZMQUdTPSRDRkxBR1MKKyAgICBDRkxBR1M9IiRDRkxBR1MgJFNTRTJfRkxBR1MiCisgICAgQUNfQ0hFQ0tfSEVBREVSKFtlbW1pbnRyaW4uaF0sCisgICAgICAgICAgICAgICAgICAgIFtBQ19ERUZJTkUoV0VCUF9IQVZFX1NTRTIsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBTU0UyIGlzIHN1cHBvcnRlZF0pXSwKKyAgICAgICAgICAgICAgICAgICAgW1NTRTJfRkxBR1M9IiJdKQorICAgIENGTEFHUz0kU0FWRURfQ0ZMQUdTXSkKKyAgQUNfU1VCU1QoW1NTRTJfRkxBR1NdKV0pCisKK0FDX0FSR19FTkFCTEUoW25lb25dLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW5lb25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgTkVPTiBzdXBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorCitBQ19BUkdfRU5BQkxFKFtuZW9uX3J0Y2RdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW5lb24tcnRjZF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIHJ1bnRpbWUgZGV0ZWN0aW9uIG9mIE5FT04gc3VwcG9ydCB2aWEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9wcm9jL2NwdWluZm8gb24gTGludXggaG9zdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCisjIEZvciBBUk0oNykgaG9zdHM6CisjIEJvdGggTkVPTiBmbGFncyB1bnNldCBhbmQgTkVPTiBzdXBwb3J0IGRldGVjdGVkID0gYnVpbGQgYWxsIG1vZHVsZXMgd2l0aCBORU9OCisjIE5FT04gZGV0ZWN0ZWQgd2l0aCB0aGUgdXNlIG9mIC1tZnB1PW5lb24gPSBidWlsZCBvbmx5IE5FT04gbW9kdWxlcyB3aXRoIE5FT04KK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9uZW9uIiAhPSAieG5vIl0sIFsKKyAgY2FzZSAiJGhvc3RfY3B1IiBpbgorICAgIGFybXxhcm12NyopCisgICAgICAjIFRlc3QgZm9yIE5FT04gc3VwcG9ydCB3aXRob3V0IGZsYWdzIGJlZm9yZSBmYWxsaW5nIGJhY2sgdG8gLW1mcHU9bmVvbgorICAgICAgZm9yIGZsYWcgaW4gJycgJy1tZnB1PW5lb24nOyBkbworICAgICAgICBMT0NBTF9ORU9OX0ZMQUdTPSIkSU5UUklOU0lDU19DRkxBR1MgJE5FT05fRkxBR1MiCisgICAgICAgIFRFU1RfQU5EX0FERF9DRkxBR1MoW0xPQ0FMX05FT05fRkxBR1NdLCBbJGZsYWddKQorICAgICAgICBTQVZFRF9DRkxBR1M9JENGTEFHUworICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJExPQ0FMX05FT05fRkxBR1MiCisKKyAgICAgICAgZG5sIE5vdGUgQUNfTEFOR19QUk9HUkFNKFtdKSB1c2VzIGFuIG9sZC1zdHlsZSBtYWluIGRlZmluaXRpb24uCisgICAgICAgIEFDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1NPVVJDRShbCisgICAgICAgICAgI2luY2x1ZGUgPGFybV9uZW9uLmg+CisgICAgICAgICAgaW50IG1haW4odm9pZCkgeworICAgICAgICAgICAgaW50OHg4X3QgdiA9IHZkdXBfbl9zOCgwKTsKKyAgICAgICAgICAgICh2b2lkKXY7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9XSldLAorICAgICAgICAgIFtORU9OX0ZMQUdTPSIkKGVjaG8gJExPQ0FMX05FT05fRkxBR1MgfCAkU0VEICdzL14gKi8vJykiCisgICAgICAgICAgIEFTX0lGKFt0ZXN0IC1uICIkTkVPTl9GTEFHUyJdLCBbCisgICAgICAgICAgICAgQVNfSUYoW3Rlc3QgIiR7aG9zdF9vcyUlLSp9IiA9ICJsaW51eCIgLW8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICJ4JGVuYWJsZV9uZW9uX3J0Y2QiID0gInhubyJdLCBbCisgICAgICAgICAgICAgICBDRkxBR1M9JFNBVkVEX0NGTEFHUworICAgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9ORU9OLCBbMV0sIFtTZXQgdG8gMSBpZiBORU9OIGlzIHN1cHBvcnRlZF0pCisgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgIF0sWworICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4obTRfbm9ybWFsaXplKFtORU9OIHJ1bnRpbWUgY3B1LWRldGVjdGlvbiBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmF2YWlsYWJsZSBmb3IgJHtob3N0X29zJSUtKn0uIEZvcmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggQ0ZMQUdTPS1tZnB1PW5lb24gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1kaXNhYmxlLW5lb24tcnRjZC5dKSkKKyAgICAgICAgICAgICAgIGVuYWJsZV9uZW9uX3J0Y2Q9bm8KKyAgICAgICAgICAgICAgIE5FT05fRkxBR1M9IiIKKyAgICAgICAgICAgICBdKQorICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICBDRkxBR1M9JFNBVkVEX0NGTEFHUworICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfTkVPTiwgWzFdLCBbU2V0IHRvIDEgaWYgTkVPTiBpcyBzdXBwb3J0ZWRdKQorICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgIF0pXSkKKyAgICAgICAgQ0ZMQUdTPSRTQVZFRF9DRkxBR1MKKyAgICAgIGRvbmUKKworICAgICAgQVNfSUYoW3Rlc3QgLW4gIiRORU9OX0ZMQUdTIl0sIFsKKyAgICAgICAgIyBJZiBORU9OIGlzIGF2YWlsYWJsZSBhbmQgcnRjZCBpcyBkaXNhYmxlZCBhcHBseSBORU9OX0ZMQUdTIGdsb2JhbGx5LgorICAgICAgICBBU19JRihbdGVzdCAieCRlbmFibGVfbmVvbl9ydGNkIiA9ICJ4bm8iXSwgWworICAgICAgICAgIEFNX0NGTEFHUz0iJEFNX0NGTEFHUyAkTkVPTl9GTEFHUyIKKyAgICAgICAgICBORU9OX0ZMQUdTPSIiXSwKKyAgICAgICAgICBbQUNfREVGSU5FKFdFQlBfSEFWRV9ORU9OX1JUQ0QsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBydW50aW1lIGRldGVjdGlvbiBvZiBORU9OIGlzIGVuYWJsZWRdKV0pXSkKKworICAgICAgY2FzZSAiJGhvc3Rfb3MiIGluCisgICAgICAgICphbmRyb2lkKikgQUNfQ0hFQ0tfSEVBREVSUyhbY3B1LWZlYXR1cmVzLmhdKSA7OworICAgICAgZXNhYworICAgICAgOzsKKyAgZXNhYworICBBQ19TVUJTVChbTkVPTl9GTEFHU10pXSkKKworZG5sID09PSBDTEVBUl9MSUJWQVJTKFt2YXJfcGZ4XSkKK2RubCA9PT0gICBDbGVhcnMgPHZhcl9wZng+X3tJTkNMVURFUyxMSUJTfS4KK0FDX0RFRlVOKFtDTEVBUl9MSUJWQVJTXSwgWyQxX0lOQ0xVREVTPSIiOyAkMV9MSUJTPSIiXSkKKworZG5sID09PSBXSVRITElCX09QVElPTihbb3B0X3BmeF0sIFtvdXR2YXJfcGZ4XSkKK2RubCA9PT0gICBEZWZpbmVzIC0td2l0aC08b3B0X3BmeD57aW5jbHVkZSxsaWJ9ZGlyIG9wdGlvbnMgd2hpY2ggc2V0CitkbmwgPT09ICAgdGhlIHZhcmlhYmxlcyA8b3V0dmFyX3BmeD5fe0lOQ0xVREVTLExJQlN9LgorQUNfREVGVU4oW1dJVEhMSUJfT1BUSU9OXSwKKyAgW0FDX0FSR19XSVRIKFskMWluY2x1ZGVkaXJdLAorICAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0td2l0aC0kMWluY2x1ZGVkaXI9RElSXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2UgJDIgaW5jbHVkZXMgZnJvbSBESVJdKSwKKyAgICAgICAgICAgICAgICQyX0lOQ0xVREVTPSItSSR3aXRodmFsIikKKyAgIEFDX0FSR19XSVRIKFskMWxpYmRpcl0sCisgICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS13aXRoLSQxbGliZGlyPURJUl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlICQyIGxpYnJhcmllcyBmcm9tIERJUl0pLAorICAgICAgICAgICAgICAgWyQyX0xJQlM9Ii1MJHdpdGh2YWwiXSldKQorCitkbmwgPT09IExJQkNIRUNLX1BST0xPR1VFKFt2YXJfcGZ4XSkKK2RubCA9PT0gICBDYWNoZXMgdGhlIGN1cnJlbnQgdmFsdWVzIG9mIENQUEZMQUdTL0xJQlMgaW4gU0FWRURfKiB0aGVuCitkbmwgPT09ICAgcHJlcGVuZHMgdGhlIGN1cnJlbnQgdmFsdWVzIHdpdGggPHZhcl9wZng+X3tJTkNMVURFUyxMSUJTfS4KK0FDX0RFRlVOKFtMSUJDSEVDS19QUk9MT0dVRV0sCisgICAgICAgICBbU0FWRURfQ1BQRkxBR1M9JENQUEZMQUdTCisgICAgICAgICAgU0FWRURfTElCUz0kTElCUworICAgICAgICAgIENQUEZMQUdTPSIkJDFfSU5DTFVERVMgJENQUEZMQUdTIgorICAgICAgICAgIExJQlM9IiQkMV9MSUJTICRMSUJTIl0pCisKK2RubCA9PT0gTElCQ0hFQ0tfRVBJTE9HVUUoW3Zhcl9wZnhdKQorZG5sID09PSAgIFJlc3RvcmVzIHRoZSB2YWx1ZXMgb2YgQ1BQRkxBR1MvTElCUyBmcm9tIFNBVkVEXyogYW5kIGV4cG9ydHMKK2RubCA9PT0gICA8dmFyX3BmeD5fe0lOQ0xVREVTLExJQlN9IHdpdGggQUNfU1VCU1QuCitBQ19ERUZVTihbTElCQ0hFQ0tfRVBJTE9HVUVdLAorICAgICAgICAgW0FDX1NVQlNUKCQxX0xJQlMpCisgICAgICAgICAgQUNfU1VCU1QoJDFfSU5DTFVERVMpCisgICAgICAgICAgQ1BQRkxBR1M9JFNBVkVEX0NQUEZMQUdTCisgICAgICAgICAgTElCUz0kU0FWRURfTElCU10pCisKK2RubCA9PT0gQ2hlY2sgZm9yIGdjYyBidWlsdGlucworCitkbmwgPT09IENIRUNLX0ZPUl9CVUlMVElOKFtidWlsdGluXSwgW3BhcmFtXSwgW2RlZmluZV0pCitkbmwgPT09ICAgbGlua3MgYSBDIEFDX0xBTkdfUFJPR1JBTSwgd2l0aCA8YnVpbHRpbj4oPHBhcmFtPikKK2RubCA9PT0gICBBQ19ERUZJTkUnaW5nIDxkZWZpbmU+IGlmIHN1Y2Nlc3NmdWwuCitBQ19ERUZVTihbQ0hFQ0tfRk9SX0JVSUxUSU5dLAorICAgICAgICAgW0FDX0xBTkdfUFVTSChbQ10pCisgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtmb3IgJDFdKQorICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW10sIFsodm9pZCkkMSgkMildKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW0FDX01TR19SRVNVTFQoW3llc10pCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFDX0RFRklORShbJDNdLCBbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgJDEgaXMgYXZhaWxhYmxlXSldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19NU0dfUkVTVUxUKFtub10pXSksCisgICAgICAgICAgQUNfTEFOR19QT1BdKQorCitkbmwgQUNfQ0hFQ0tfRlVOQyBkb2Vzbid0IHdvcmsgd2l0aCBidWlsdGluJ3MuCitDSEVDS19GT1JfQlVJTFRJTihbX19idWlsdGluX2Jzd2FwMTZdLCBbMXUgPDwgMTVdLCBbSEFWRV9CVUlMVElOX0JTV0FQMTZdKQorQ0hFQ0tfRk9SX0JVSUxUSU4oW19fYnVpbHRpbl9ic3dhcDMyXSwgWzF1IDw8IDMxXSwgW0hBVkVfQlVJTFRJTl9CU1dBUDMyXSkKK0NIRUNLX0ZPUl9CVUlMVElOKFtfX2J1aWx0aW5fYnN3YXA2NF0sIFsxdWxsIDw8IDYzXSwgW0hBVkVfQlVJTFRJTl9CU1dBUDY0XSkKKworZG5sID09PSBDaGVjayBmb3IgcHRocmVhZCBzdXBwb3J0CitBQ19BUkdfRU5BQkxFKFt0aHJlYWRpbmddLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLXRocmVhZGluZ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiB0aHJlYWQgc3VwcG9ydF0pLCwKKyAgICAgICAgICAgICAgW2VuYWJsZV90aHJlYWRpbmc9eWVzXSkKK2lmIHRlc3QgIiRlbmFibGVfdGhyZWFkaW5nIiA9ICJ5ZXMiOyB0aGVuCisgIEFDX01TR19OT1RJQ0UoW2NoZWNraW5nIGZvciB0aHJlYWRpbmcgc3VwcG9ydC4uLl0pCisgIEFYX1BUSFJFQUQoW0FDX0RFRklORShbV0VCUF9VU0VfVEhSRUFEXSwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgW1VuZGVmaW5lIHRoaXMgdG8gZGlzYWJsZSB0aHJlYWQgc3VwcG9ydC5dKQorICAgICAgICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICAgICAgICBDQz0iJFBUSFJFQURfQ0MiCisgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICBbQUNfQ0hFQ0tfRlVOQyhbX2JlZ2ludGhyZWFkZXhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtBQ19ERUZJTkUoW1dFQlBfVVNFX1RIUkVBRF0sIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtVbmRlZmluZSB0aGlzIHRvIGRpc2FibGUgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydC5dKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZV90aHJlYWRpbmc9bm9dKV0pCitmaQorQUNfTVNHX05PVElDRShbY2hlY2tpbmcgaWYgdGhyZWFkaW5nIGlzIGVuYWJsZWQuLi4gJHtlbmFibGVfdGhyZWFkaW5nLW5vfV0pCisKK2RubCA9PT0gY2hlY2sgZm9yIE9wZW5HTC9HTFVUIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW2dsXSwgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1nbF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBPcGVuR0wgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9nbCIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW0dMXSkKKyAgV0lUSExJQl9PUFRJT04oW2dsXSwgW0dMXSkKKworICBMSUJDSEVDS19QUk9MT0dVRShbR0xdKQorCisgIGdsdXRfY2ZsYWdzPSJub25lIgorICBnbHV0X2xkZmxhZ3M9Im5vbmUiCisgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICBkYXJ3aW4qKQorICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIE9TWCBidWlsZHMuIEFwcGVuZCB0aGVzZSB0byBnaXZlIHRoZSB1c2VyIGEgY2hhbmNlIHRvCisgICAgICAjIG92ZXJyaWRlIHdpdGggLS13aXRoLWdsKgorICAgICAgZ2x1dF9jZmxhZ3M9IiRnbHV0X2NmbGFnc3wtZnJhbWV3b3JrIEdMVVQgLWZyYW1ld29yayBPcGVuR0wiCisgICAgICBnbHV0X2xkZmxhZ3M9IiRnbHV0X2xkZmxhZ3N8LWZyYW1ld29yayBHTFVUIC1mcmFtZXdvcmsgT3BlbkdMIgorICAgICAgIyBxdWlldCBkZXByZWNhdGlvbiB3YXJuaW5ncyBmb3IgZ2x1dAorICAgICAgVEVTVF9BTkRfQUREX0NGTEFHUyhbQU1fQ0ZMQUdTXSwgWy1Xbm8tZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnNdKQorICAgICAgOzsKKyAgZXNhYworCisgIEdMVVRfU0FWRURfQ1BQRkxBR1M9IiRDUFBGTEFHUyIKKyAgU0FWRURfSUZTPSIkSUZTIgorICBJRlM9InwiCisgIGZvciBmbGFnIGluICRnbHV0X2NmbGFnczsgZG8KKyAgICAjIHJlc3RvcmUgSUZTIGltbWVkaWF0ZWx5IGFzIHRoZSBhdXRvY29uZiBtYWNyb3MgbWF5IG5lZWQgdGhlIGRlZmF1bHQuCisgICAgSUZTPSIkU0FWRURfSUZTIgorICAgIHVuc2V0IGFjX2N2X2hlYWRlcl9HTF9nbHV0X2gKKyAgICB1bnNldCBhY19jdl9oZWFkZXJfT3BlbkdMX2dsdXRfaAorCisgICAgY2FzZSAkZmxhZyBpbgorICAgICAgbm9uZSkgOzsKKyAgICAgICopIENQUEZMQUdTPSIkZmxhZyAkQ1BQRkxBR1MiOzsKKyAgICBlc2FjCisgICAgQUNfQ0hFQ0tfSEVBREVSUyhbR0wvZ2x1dC5oIEdMVVQvZ2x1dC5oIE9wZW5HTC9nbHV0LmhdLAorICAgICAgICAgICAgICAgICAgICAgW2dsdXRfaGVhZGVycz15ZXM7CisgICAgICAgICAgICAgICAgICAgICAgdGVzdCAiJGZsYWciID0gIm5vbmUiIHx8IEdMX0lOQ0xVREVTPSIkQ1BQRkxBR1MiOworICAgICAgICAgICAgICAgICAgICAgIGJyZWFrXSkKKyAgICBDUFBGTEFHUz0iJEdMVVRfU0FWRURfQ1BQRkxBR1MiCisgICAgdGVzdCAiJGdsdXRfaGVhZGVycyIgPSAieWVzIiAmJiBicmVhaworICBkb25lCisgIElGUz0iJFNBVkVEX0lGUyIKKworICBpZiB0ZXN0ICIkZ2x1dF9oZWFkZXJzIiA9ICJ5ZXMiOyB0aGVuCisgICAgQUNfTEFOR19QVVNIKFtDXSkKKyAgICBHTFVUX1NBVkVEX0xERkxBR1M9IiRMREZMQUdTIgorICAgIFNBVkVEX0lGUz0iJElGUyIKKyAgICBJRlM9InwiCisgICAgZm9yIGZsYWcgaW4gJGdsdXRfbGRmbGFnczsgZG8KKyAgICAgICMgcmVzdG9yZSBJRlMgaW1tZWRpYXRlbHkgYXMgdGhlIGF1dG9jb25mIG1hY3JvcyBtYXkgbmVlZCB0aGUgZGVmYXVsdC4KKyAgICAgIElGUz0iJFNBVkVEX0lGUyIKKyAgICAgIHVuc2V0IGFjX2N2X3NlYXJjaF9nbEJlZ2luCisKKyAgICAgIGNhc2UgJGZsYWcgaW4KKyAgICAgICAgbm9uZSkgOzsKKyAgICAgICAgKikgTERGTEFHUz0iJGZsYWcgJExERkxBR1MiOzsKKyAgICAgIGVzYWMKKworICAgICAgIyBmaW5kIGxpYkdMCisgICAgICBHTF9TQVZFRF9MSUJTPSIkTElCUyIKKyAgICAgIEFDX1NFQVJDSF9MSUJTKFtnbEJlZ2luXSwgW0dMIE9wZW5HTCBvcGVuZ2wzMl0pCisgICAgICBMSUJTPSIkR0xfU0FWRURfTElCUyIKKworICAgICAgIyBBIGRpcmVjdCBsaW5rIHRvIGxpYkdMIG1heSBub3QgYmUgbmVjZXNzYXJ5IG9uIGUuZy4sIGxpbnV4LgorICAgICAgR0xVVF9TQVZFRF9MSUJTPSIkTElCUyIKKyAgICAgIGZvciBsaWIgaW4gIiIgIi1sZ2x1dCIgIi1sZ2x1dCAkYWNfY3Zfc2VhcmNoX2dsQmVnaW4iOyBkbworICAgICAgICBMSUJTPSIkbGliIgorICAgICAgICBBQ19MSU5LX0lGRUxTRSgKKyAgICAgICAgICBbQUNfTEFOR19QUk9HUkFNKFsKKyAgICAgICAgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICAgICAgICAjIGRlZmluZSBFWFRFUk5fQyBleHRlcm4gIkMiCisgICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAjIGRlZmluZSBFWFRFUk5fQworICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgIEVYVEVSTl9DIGNoYXIgZ2xPcnRobygpOworICAgICAgICAgICAgIEVYVEVSTl9DIGNoYXIgZ2x1dE1haW5Mb29wKCk7CisgICAgICAgICAgICBdLFsKKyAgICAgICAgICAgICBnbE9ydGhvKCk7CisgICAgICAgICAgICAgZ2x1dE1haW5Mb29wKCk7CisgICAgICAgICAgICBdKQorICAgICAgICAgIF0sCisgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9HTCwgWzFdLAorICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgT3BlbkdMIGlzIHN1cHBvcnRlZF0pCisgICAgICAgICAgW2dsdXRfc3VwcG9ydD15ZXNdLCBbXQorICAgICAgICApCisgICAgICAgIGlmIHRlc3QgIiRnbHV0X3N1cHBvcnQiID0gInllcyI7IHRoZW4KKyAgICAgICAgICBHTF9MSUJTPSIkTERGTEFHUyAkbGliIgorICAgICAgICAgIGJyZWFrCisgICAgICAgIGZpCisgICAgICBkb25lCisgICAgICBMSUJTPSIkR0xVVF9TQVZFRF9MSUJTIgorICAgICAgTERGTEFHUz0iJEdMVVRfU0FWRURfTERGTEFHUyIKKyAgICAgIHRlc3QgIiRnbHV0X3N1cHBvcnQiID0gInllcyIgJiYgYnJlYWsKKyAgICBkb25lCisgICAgSUZTPSIkU0FWRURfSUZTIgorICAgIEFDX0xBTkdfUE9QCisgIGZpCisKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW0dMXSkKKworICBpZiB0ZXN0ICIkZ2x1dF9zdXBwb3J0IiA9ICJ5ZXMiIC1hICIkZW5hYmxlX2xpYndlYnBkZW11eCIgPSAieWVzIjsgdGhlbgorICAgIGJ1aWxkX3Z3ZWJwPXllcworICBmaQorXSkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9WV0VCUF0sIFt0ZXN0ICIkYnVpbGRfdndlYnAiID0gInllcyJdKQorCitkbmwgPT09IGNoZWNrIGZvciBTREwgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbc2RsXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1zZGxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgU0RMIHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfc2RsIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbU0RMXSkKKyAgQUNfUEFUSF9QUk9HUyhbTElCU0RMX0NPTkZJR10sIFtzZGwtY29uZmlnXSkKKyAgaWYgdGVzdCAtbiAiJExJQlNETF9DT05GSUciOyB0aGVuCisgICAgU0RMX0lOQ0xVREVTPWAkTElCU0RMX0NPTkZJRyAtLWNmbGFnc2AKKyAgICBTRExfTElCUz0iYCRMSUJTRExfQ09ORklHIC0tbGlic2AiCisgIGZpCisKKyAgV0lUSExJQl9PUFRJT04oW3NkbF0sIFtTRExdKQorCisgIHNkbF9oZWFkZXI9Im5vIgorICBMSUJDSEVDS19QUk9MT0dVRShbU0RMXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKFtTREwvU0RMLmhdLCBbc2RsX2hlYWRlcj0iU0RML1NETC5oIl0sCisgICAgICAgICAgICAgICAgICBbQUNfQ0hFQ0tfSEVBREVSKFtTREwuaF0sIFtzZGxfaGVhZGVyPSJTREwuaCJdLAorICAgICAgICAgICAgICAgICAgW0FDX01TR19XQVJOKFNETCBsaWJyYXJ5IG5vdCBhdmFpbGFibGUgLSBubyBzZGwuaCldKV0pCisgIGlmIHRlc3QgeCIkc2RsX2hlYWRlciIgIT0gInhubyI7IHRoZW4KKyAgICBBQ19MQU5HX1BVU0goQykKKyAgICBTRExfU0FWRURfTElCUz0iJExJQlMiCisgICAgZm9yIGxpYiBpbiAiIiAiLWxTREwiICItbFNETG1haW4gLWxTREwiOyBkbworICAgICAgTElCUz0iJFNETF9TQVZFRF9MSUJTICRsaWIiCisgICAgICAjIFBlcmZvcm0gYSBmdWxsIGxpbmsgdG8gZW5zdXJlIFNETF9tYWluIGlzIHJlc29sdmVkIGlmIG5lZWRlZC4KKyAgICAgIEFDX0xJTktfSUZFTFNFKAorICAgICAgICBbQUNfTEFOR19TT1VSQ0UoWworICAgICAgICAgICAjaW5jbHVkZSA8JHNkbF9oZWFkZXI+CisgICAgICAgICAgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgICAgICAgICAgIFNETF9Jbml0KDApOworICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICB9XSldLAorICAgICAgICBbU0RMX0xJQlM9IiRMREZMQUdTICRMSUJTIgorICAgICAgICAgU0RMX0lOQ0xVREVTPSIkU0RMX0lOQ0xVREVTIC1EV0VCUF9IQVZFX1NETCIKKyAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfU0RMLCBbMV0sCisgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIFNETCBsaWJyYXJ5IGlzIGluc3RhbGxlZF0pCisgICAgICAgICBzZGxfc3VwcG9ydD15ZXNdCisgICAgICApCisgICAgICBpZiB0ZXN0IHgiJHNkbF9zdXBwb3J0IiA9ICJ4eWVzIjsgdGhlbgorICAgICAgICBicmVhaworICAgICAgZmkKKyAgICBkb25lCisgICAgIyBMSUJTIGlzIHJlc3RvcmVkIGJ5IExJQkNIRUNLX0VQSUxPR1VFCisgICAgQUNfTEFOR19QT1AKKyAgICBpZiB0ZXN0IHgiJHNkbF9oZWFkZXIiID0gInhTREwuaCI7IHRoZW4KKyAgICAgIFNETF9JTkNMVURFUz0iJFNETF9JTkNMVURFUyAtRFdFQlBfSEFWRV9KVVNUX1NETF9IIgorICAgIGZpCisgIGZpCisgIExJQkNIRUNLX0VQSUxPR1VFKFtTRExdKQorCisgIGlmIHRlc3QgeCIkc2RsX3N1cHBvcnQiID0gInh5ZXMiOyB0aGVuCisgICAgYnVpbGRfdndlYnBfc2RsPXllcworICBlbHNlCisgICAgQUNfTVNHX1dBUk4oT3B0aW9uYWwgU0RMIGxpYnJhcnkgbm90IGZvdW5kKQorICBmaQorXSkKKworQU1fQ09ORElUSU9OQUwoW0JVSUxEX1ZXRUJQX1NETF0sIFt0ZXN0ICIkYnVpbGRfdndlYnBfc2RsIiA9ICJ5ZXMiXSkKKworZG5sID09PSBjaGVjayBmb3IgUE5HIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW3BuZ10sIEFTX0hFTFBfU1RSSU5HKFstLWRpc2FibGUtcG5nXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGRldGVjdGlvbiBvZiBQTkcgZm9ybWF0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAPDpAZGVmYXVsdD1hdXRvQDo+QF0pKQorQVNfSUYoW3Rlc3QgIngkZW5hYmxlX3BuZyIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW1BOR10pCisgIEFDX1BBVEhfUFJPR1MoW0xJQlBOR19DT05GSUddLAorICAgICAgICAgICAgICAgIFtsaWJwbmctY29uZmlnIGxpYnBuZzE2LWNvbmZpZyBsaWJwbmcxNS1jb25maWcgbGlicG5nMTQtY29uZmlnIFwKKyAgICAgICAgICAgICAgICAgbGlicG5nMTItY29uZmlnXSkKKyAgaWYgdGVzdCAtbiAiJExJQlBOR19DT05GSUciOyB0aGVuCisgICAgUE5HX0lOQ0xVREVTPWAkTElCUE5HX0NPTkZJRyAtLWNmbGFnc2AKKyAgICBQTkdfTElCUz0iYCRMSUJQTkdfQ09ORklHIC0tbGRmbGFnc2AiCisgIGZpCisKKyAgV0lUSExJQl9PUFRJT04oW3BuZ10sIFtQTkddKQorCisgIExJQkNIRUNLX1BST0xPR1VFKFtQTkddKQorICBBQ19DSEVDS19IRUFERVIocG5nLmgsCisgICAgQUNfU0VBUkNIX0xJQlMocG5nX2dldF9saWJwbmdfdmVyLCBbcG5nXSwKKyAgICAgICAgICAgICAgICAgICBbdGVzdCAiJGFjX2N2X3NlYXJjaF9wbmdfZ2V0X2xpYnBuZ192ZXIiID0gIm5vbmUgcmVxdWlyZWQiIFwKKyAgICAgICAgICAgICAgICAgICAgICB8fCBQTkdfTElCUz0iJFBOR19MSUJTICRhY19jdl9zZWFyY2hfcG5nX2dldF9saWJwbmdfdmVyIgorICAgICAgICAgICAgICAgICAgICBQTkdfSU5DTFVERVM9IiRQTkdfSU5DTFVERVMgLURXRUJQX0hBVkVfUE5HIgorICAgICAgICAgICAgICAgICAgICBBQ19ERUZJTkUoV0VCUF9IQVZFX1BORywgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NldCB0byAxIGlmIFBORyBsaWJyYXJ5IGlzIGluc3RhbGxlZF0pCisgICAgICAgICAgICAgICAgICAgIHBuZ19zdXBwb3J0PXllcworICAgICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgICAgW0FDX01TR19XQVJOKE9wdGlvbmFsIHBuZyBsaWJyYXJ5IG5vdCBmb3VuZCkKKyAgICAgICAgICAgICAgICAgICAgUE5HX0xJQlM9IiIKKyAgICAgICAgICAgICAgICAgICAgUE5HX0lOQ0xVREVTPSIiCisgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICBbJE1BVEhfTElCU10pLAorICAgIFtBQ19NU0dfV0FSTihwbmcgbGlicmFyeSBub3QgYXZhaWxhYmxlIC0gbm8gcG5nLmgpCisgICAgIFBOR19MSUJTPSIiCisgICAgIFBOR19JTkNMVURFUz0iIgorICAgIF0sCisgICkKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW1BOR10pCitdKQorCitkbmwgPT09IGNoZWNrIGZvciBKUEVHIHN1cHBvcnQgPT09CisKK0FDX0FSR19FTkFCTEUoW2pwZWddLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWpwZWddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBkZXRlY3Rpb24gb2YgSlBFRyBmb3JtYXQgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQDw6QGRlZmF1bHQ9YXV0b0A6PkBdKSkKK0FTX0lGKFt0ZXN0ICJ4JGVuYWJsZV9qcGVnIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbSlBFR10pCisgIFdJVEhMSUJfT1BUSU9OKFtqcGVnXSwgW0pQRUddKQorCisgIExJQkNIRUNLX1BST0xPR1VFKFtKUEVHXSkKKyAgQUNfQ0hFQ0tfSEVBREVSKGpwZWdsaWIuaCwKKyAgICBBQ19DSEVDS19MSUIoanBlZywganBlZ19zZXRfZGVmYXVsdHMsCisgICAgICAgICAgICAgICAgIFtKUEVHX0xJQlM9IiRKUEVHX0xJQlMgLWxqcGVnIgorICAgICAgICAgICAgICAgICAgSlBFR19JTkNMVURFUz0iJEpQRUdfSU5DTFVERVMgLURXRUJQX0hBVkVfSlBFRyIKKyAgICAgICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfSlBFRywgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBKUEVHIGxpYnJhcnkgaXMgaW5zdGFsbGVkXSkKKyAgICAgICAgICAgICAgICAgIGpwZWdfc3VwcG9ydD15ZXMKKyAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oT3B0aW9uYWwganBlZyBsaWJyYXJ5IG5vdCBmb3VuZCksCisgICAgICAgICAgICAgICAgIFskTUFUSF9MSUJTXSksCisgICAgQUNfTVNHX1dBUk4oanBlZyBsaWJyYXJ5IG5vdCBhdmFpbGFibGUgLSBubyBqcGVnbGliLmgpCisgICkKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW0pQRUddKQorXSkKKworZG5sID09PSBjaGVjayBmb3IgVElGRiBzdXBwb3J0ID09PQorCitBQ19BUkdfRU5BQkxFKFt0aWZmXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS10aWZmXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIFRJRkYgZm9ybWF0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfdGlmZiIgIT0gInhubyJdLCBbCisgIENMRUFSX0xJQlZBUlMoW1RJRkZdKQorICBXSVRITElCX09QVElPTihbdGlmZl0sIFtUSUZGXSkKKworICBMSUJDSEVDS19QUk9MT0dVRShbVElGRl0pCisgIEFDX0NIRUNLX0hFQURFUih0aWZmaW8uaCwKKyAgICBBQ19DSEVDS19MSUIodGlmZiwgVElGRkdldFZlcnNpb24sCisgICAgICAgICAgICAgICAgIFtUSUZGX0xJQlM9IiRUSUZGX0xJQlMgLWx0aWZmIgorICAgICAgICAgICAgICAgICAgVElGRl9JTkNMVURFUz0iJFRJRkZfSU5DTFVERVMgLURXRUJQX0hBVkVfVElGRiIKKyAgICAgICAgICAgICAgICAgIEFDX0RFRklORShXRUJQX0hBVkVfVElGRiwgWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTZXQgdG8gMSBpZiBUSUZGIGxpYnJhcnkgaXMgaW5zdGFsbGVkXSkKKyAgICAgICAgICAgICAgICAgIHRpZmZfc3VwcG9ydD15ZXMKKyAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgQUNfTVNHX1dBUk4oT3B0aW9uYWwgdGlmZiBsaWJyYXJ5IG5vdCBmb3VuZCksCisgICAgICAgICAgICAgICAgIFskTUFUSF9MSUJTXSksCisgICAgQUNfTVNHX1dBUk4odGlmZiBsaWJyYXJ5IG5vdCBhdmFpbGFibGUgLSBubyB0aWZmaW8uaCkKKyAgKQorICBMSUJDSEVDS19FUElMT0dVRShbVElGRl0pCitdKQorCitkbmwgPT09IGNoZWNrIGZvciBHSUYgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbZ2lmXSwgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS1naWZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0Rpc2FibGUgZGV0ZWN0aW9uIG9mIEdJRiBmb3JtYXQgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSkpCitBU19JRihbdGVzdCAieCRlbmFibGVfZ2lmIiAhPSAieG5vIl0sIFsKKyAgQ0xFQVJfTElCVkFSUyhbR0lGXSkKKyAgV0lUSExJQl9PUFRJT04oW2dpZl0sIFtHSUZdKQorCisgIExJQkNIRUNLX1BST0xPR1VFKFtHSUZdKQorICBBQ19DSEVDS19IRUFERVIoZ2lmX2xpYi5oLAorICAgIEFDX0NIRUNLX0xJQihbZ2lmXSwgW0RHaWZPcGVuRmlsZUhhbmRsZV0sCisgICAgICAgICAgICAgICAgIFtHSUZfTElCUz0iJEdJRl9MSUJTIC1sZ2lmIgorICAgICAgICAgICAgICAgICAgQUNfREVGSU5FKFdFQlBfSEFWRV9HSUYsIFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU2V0IHRvIDEgaWYgR0lGIGxpYnJhcnkgaXMgaW5zdGFsbGVkXSkKKyAgICAgICAgICAgICAgICAgIGdpZl9zdXBwb3J0PXllcworICAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgICBBQ19NU0dfV0FSTihPcHRpb25hbCBnaWYgbGlicmFyeSBub3QgZm91bmQpLAorICAgICAgICAgICAgICAgICBbJE1BVEhfTElCU10pLAorICAgIEFDX01TR19XQVJOKGdpZiBsaWJyYXJ5IG5vdCBhdmFpbGFibGUgLSBubyBnaWZfbGliLmgpCisgICkKKyAgTElCQ0hFQ0tfRVBJTE9HVUUoW0dJRl0pCisKKyAgaWYgdGVzdCAiJGdpZl9zdXBwb3J0IiA9ICJ5ZXMiIC1hIFwKKyAgICAgICAgICAiJGVuYWJsZV9saWJ3ZWJwZGVtdXgiID0gInllcyI7IHRoZW4KKyAgICBidWlsZF9hbmltX2RpZmY9eWVzCisgIGZpCisKKyAgaWYgdGVzdCAiJGdpZl9zdXBwb3J0IiA9ICJ5ZXMiIC1hIFwKKyAgICAgICAgICAiJGVuYWJsZV9saWJ3ZWJwbXV4IiA9ICJ5ZXMiOyB0aGVuCisgICAgYnVpbGRfZ2lmMndlYnA9eWVzCisgIGZpCitdKQorQU1fQ09ORElUSU9OQUwoW0JVSUxEX0FOSU1ESUZGXSwgW3Rlc3QgIiR7YnVpbGRfYW5pbV9kaWZmfSIgPSAieWVzIl0pCitBTV9DT05ESVRJT05BTChbQlVJTERfR0lGMldFQlBdLCBbdGVzdCAiJHtidWlsZF9naWYyd2VicH0iID0gInllcyJdKQorCitpZiB0ZXN0ICIkZW5hYmxlX2xpYndlYnBkZW11eCIgPSAieWVzIiAtYSAiJGVuYWJsZV9saWJ3ZWJwbXV4IiA9ICJ5ZXMiOyB0aGVuCisgIGJ1aWxkX2ltZzJ3ZWJwPXllcworZmkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9JTUcyV0VCUF0sIFt0ZXN0ICIke2J1aWxkX2ltZzJ3ZWJwfSIgPSAieWVzIl0pCisKK2lmIHRlc3QgIiRlbmFibGVfbGlid2VicG11eCIgPSAieWVzIjsgdGhlbgorICBidWlsZF93ZWJwaW5mbz15ZXMKK2ZpCitBTV9DT05ESVRJT05BTChbQlVJTERfV0VCUElORk9dLCBbdGVzdCAiJHtidWlsZF93ZWJwaW5mb30iID0gInllcyJdKQorCitkbmwgPT09IGNoZWNrIGZvciBXSUMgc3VwcG9ydCA9PT0KKworQUNfQVJHX0VOQUJMRShbd2ljXSwKKyAgICAgICAgICAgICAgQVNfSEVMUF9TVFJJTkcoWy0tZGlzYWJsZS13aWNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChXSUMpIGRldGVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEA8OkBkZWZhdWx0PWF1dG9AOj5AXSksLAorICAgICAgICAgICAgICBbZW5hYmxlX3dpYz15ZXNdKQorCitjYXNlICRob3N0X29zIGluCittaW5ndyopCitpZiB0ZXN0ICIkZW5hYmxlX3dpYyIgPSAieWVzIjsgdGhlbgorICBBQ19DSEVDS19IRUFERVJTKFt3aW5jb2RlYy5oIHNobHdhcGkuaCB3aW5kb3dzLmhdKQorICBpZiB0ZXN0ICIkYWNfY3ZfaGVhZGVyX3dpbmNvZGVjX2giID0gInllcyI7IHRoZW4KKyAgICBBQ19NU0dfQ0hFQ0tJTkcoZm9yIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgc3VwcG9ydCkKKyAgICBTQVZFRF9MSUJTPSRMSUJTCisgICAgTElCUz0iLWxzaGx3YXBpIC1sb2xlMzIgJExJQlMiCisgICAgIyBtYXRjaCBpbmNsdWRlIHN0cnVjdHVyZSBmcm9tIFtjZF13ZWJwLmMKKyAgICB3aWNfaGVhZGVycz0iCisgICAgICAjZGVmaW5lIElOSVRHVUlECisgICAgICAjZGVmaW5lIENJTlRFUkZBQ0UKKyAgICAgICNkZWZpbmUgQ09CSk1BQ1JPUworICAgICAgI2RlZmluZSBfV0lOMzJfSUUgMHg1MDAKKworICAgICAgI2luY2x1ZGUgPHNobHdhcGkuaD4KKyAgICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+CisgICAgICAjaW5jbHVkZSA8d2luY29kZWMuaD4KKyAgICAgICIKKyAgICAjIHRlc3QgZm9yIGZ1bmN0aW9ucyBmcm9tIGVhY2ggbGliIGFuZCB0aGUgR1VJRCBpcyBjcmVhdGVkIHByb3Blcmx5CisgICAgd2ljX21haW49IgorICAgICAgaW50IG1haW4odm9pZCkgeworICAgICAgICBDTFNJRF9XSUNJbWFnaW5nRmFjdG9yeTsKKyAgICAgICAgQ29Jbml0aWFsaXplKE5VTEwpOworICAgICAgICBTSENyZWF0ZVN0cmVhbU9uRmlsZShOVUxMLCAwLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICAiCisgICAgQUNfTEFOR19QVVNIKEMpCisgICAgQUNfTElOS19JRkVMU0UoCisgICAgICBbQUNfTEFOR19TT1VSQ0UoWworICAgICAgICAgJHdpY19oZWFkZXJzCisgICAgICAgICAkd2ljX21haW5dKV0sCisgICAgICBbd2ljX3N1cHBvcnQ9eWVzXSwKKyAgICAgIFt3aWNfc3VwcG9ydD1ub10KKyAgICApCisgICAgQUNfTEFOR19QT1AKKworICAgIHRlc3QgIiR3aWNfc3VwcG9ydCIgPSAieWVzIiB8fCBMSUJTPSRTQVZFRF9MSUJTCisgICAgQUNfTVNHX1JFU1VMVCgke3dpY19zdXBwb3J0LW5vfSkKKyAgZmkKK2ZpCitlc2FjCisKK2RubCA9PT0gSWYgLS1lbmFibGUtc3dhcC0xNmJpdC1jc3AgaXMgZGVmaW5lZCwgYWRkIC1EV0VCUF9TV0FQXzE2QklUX0NTUD0xCisKK1VTRV9TV0FQXzE2QklUX0NTUD0iIgorQUNfTVNHX0NIRUNLSU5HKGlmIC0tZW5hYmxlLXN3YXAtMTZiaXQtY3NwIG9wdGlvbiBpcyBzcGVjaWZpZWQpCitBQ19BUkdfRU5BQkxFKFtzd2FwLTE2Yml0LWNzcF0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1zd2FwLTE2Yml0LWNzcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtFbmFibGUgYnl0ZSBzd2FwIGZvciAxNiBiaXQgY29sb3JzcGFjZXNdKSkKK2lmIHRlc3QgIiRlbmFibGVfc3dhcF8xNmJpdF9jc3AiID0gInllcyI7IHRoZW4KKyAgVVNFX1NXQVBfMTZCSVRfQ1NQPSItRFdFQlBfU1dBUF8xNkJJVF9DU1A9MSIKK2ZpCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX3N3YXBfMTZiaXRfY3NwLW5vfSkKK0FDX1NVQlNUKFVTRV9TV0FQXzE2QklUX0NTUCkKKworZG5sID09PSBJZiAtLWRpc2FibGUtbmVhci1sb3NzbGVzcyBpcyBkZWZpbmVkLCBhZGQgLURXRUJQX05FQVJfTE9TU0xFU1M9MAorCitBQ19ERUZJTkUoV0VCUF9ORUFSX0xPU1NMRVNTLCBbMV0sIFtFbmFibGUgbmVhciBsb3NzbGVzcyBlbmNvZGluZ10pCitBQ19NU0dfQ0hFQ0tJTkcoaWYgLS1kaXNhYmxlLW5lYXItbG9zc2xlc3Mgb3B0aW9uIGlzIHNwZWNpZmllZCkKK0FDX0FSR19FTkFCTEUoW25lYXJfbG9zc2xlc3NdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLW5lYXItbG9zc2xlc3NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbRGlzYWJsZSBuZWFyIGxvc3NsZXNzIGVuY29kaW5nXSksCisgICAgICAgICAgICAgIFtdLCBbZW5hYmxlX25lYXJfbG9zc2xlc3M9eWVzXSkKK2lmIHRlc3QgIiRlbmFibGVfbmVhcl9sb3NzbGVzcyIgPSAibm8iOyB0aGVuCisgIEFDX0RFRklORShXRUJQX05FQVJfTE9TU0xFU1MsIFswXSwgW0VuYWJsZSBuZWFyIGxvc3NsZXNzIGVuY29kaW5nXSkKKyAgQUNfTVNHX1JFU1VMVChbeWVzXSkKK2Vsc2UKKyAgQUNfTVNHX1JFU1VMVChbbm9dKQorZmkKKworZG5sID09PSBDaGVjayB3aGV0aGVyIGxpYndlYnBtdXggc2hvdWxkIGJlIGJ1aWx0CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBsaWJ3ZWJwbXV4IGlzIHRvIGJlIGJ1aWx0KQorQUNfQVJHX0VOQUJMRShbbGlid2VicG11eF0sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJ3ZWJwbXV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0J1aWxkIGxpYndlYnBtdXggQDw6QGRlZmF1bHQ9bm9AOj5AXSkpCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX2xpYndlYnBtdXgtbm99KQorQU1fQ09ORElUSU9OQUwoW1dBTlRfTVVYXSwgW3Rlc3QgIiRlbmFibGVfbGlid2VicG11eCIgPSAieWVzIl0pCisKK2RubCA9PT0gQ2hlY2sgd2hldGhlciBsaWJ3ZWJwZGVtdXggc2hvdWxkIGJlIGJ1aWx0CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBsaWJ3ZWJwZGVtdXggaXMgdG8gYmUgYnVpbHQpCitBQ19BUkdfRU5BQkxFKFtsaWJ3ZWJwZGVtdXhdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1kaXNhYmxlLWxpYndlYnBkZW11eF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtEaXNhYmxlIGxpYndlYnBkZW11eCBAPDpAZGVmYXVsdD1ub0A6PkBdKSwKKyAgICAgICAgICAgICAgW10sIFtlbmFibGVfbGlid2VicGRlbXV4PXllc10pCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX2xpYndlYnBkZW11eC1ub30pCitBTV9DT05ESVRJT05BTChbV0FOVF9ERU1VWF0sIFt0ZXN0ICIkZW5hYmxlX2xpYndlYnBkZW11eCIgPSAieWVzIl0pCisKK2RubCA9PT0gQ2hlY2sgd2hldGhlciBkZWNvZGVyIGxpYnJhcnkgc2hvdWxkIGJlIGJ1aWx0LgorQUNfTVNHX0NIRUNLSU5HKHdoZXRoZXIgZGVjb2RlciBsaWJyYXJ5IGlzIHRvIGJlIGJ1aWx0KQorQUNfQVJHX0VOQUJMRShbbGlid2VicGRlY29kZXJdLAorICAgICAgICAgICAgICBBU19IRUxQX1NUUklORyhbLS1lbmFibGUtbGlid2VicGRlY29kZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbQnVpbGQgbGlid2VicGRlY29kZXIgQDw6QGRlZmF1bHQ9bm9AOj5AXSkpCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX2xpYndlYnBkZWNvZGVyLW5vfSkKK0FNX0NPTkRJVElPTkFMKFtCVUlMRF9MSUJXRUJQREVDT0RFUl0sIFt0ZXN0ICIkZW5hYmxlX2xpYndlYnBkZWNvZGVyIiA9ICJ5ZXMiXSkKKworZG5sID09PSBDaGVjayB3aGV0aGVyIGxpYndlYnBleHRyYXMgc2hvdWxkIGJlIGJ1aWx0CitBQ19NU0dfQ0hFQ0tJTkcod2hldGhlciBsaWJ3ZWJwZXh0cmFzIGlzIHRvIGJlIGJ1aWx0KQorQUNfQVJHX0VOQUJMRShbbGlid2VicGV4dHJhc10sCisgICAgICAgICAgICAgIEFTX0hFTFBfU1RSSU5HKFstLWVuYWJsZS1saWJ3ZWJwZXh0cmFzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0J1aWxkIGxpYndlYnBleHRyYXMgQDw6QGRlZmF1bHQ9bm9AOj5AXSkpCitBQ19NU0dfUkVTVUxUKCR7ZW5hYmxlX2xpYndlYnBleHRyYXMtbm99KQorQU1fQ09ORElUSU9OQUwoW1dBTlRfRVhUUkFTXSwgW3Rlc3QgIiRlbmFibGVfbGlid2VicGV4dHJhcyIgPSAieWVzIl0pCisKK2RubCA9PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FDX0NPTkZJR19NQUNST19ESVIoW200XSkKK0FDX0NPTkZJR19IRUFERVJTKFtzcmMvd2VicC9jb25maWcuaF0pCitBQ19DT05GSUdfRklMRVMoW01ha2VmaWxlIHNyYy9NYWtlZmlsZSBtYW4vTWFrZWZpbGUgXAorICAgICAgICAgICAgICAgICBleGFtcGxlcy9NYWtlZmlsZSBleHRyYXMvTWFrZWZpbGUgaW1hZ2Vpby9NYWtlZmlsZSBcCisgICAgICAgICAgICAgICAgIHNyYy9kZWMvTWFrZWZpbGUgc3JjL2VuYy9NYWtlZmlsZSBzcmMvZHNwL01ha2VmaWxlIFwKKyAgICAgICAgICAgICAgICAgc3JjL2RlbXV4L01ha2VmaWxlIHNyYy9tdXgvTWFrZWZpbGUgXAorICAgICAgICAgICAgICAgICBzcmMvdXRpbHMvTWFrZWZpbGUgXAorICAgICAgICAgICAgICAgICBzcmMvbGlid2VicC5wYyBzcmMvbGlid2VicGRlY29kZXIucGMgXAorICAgICAgICAgICAgICAgICBzcmMvZGVtdXgvbGlid2VicGRlbXV4LnBjIHNyYy9tdXgvbGlid2VicG11eC5wY10pCisKKworQUNfT1VUUFVUCisKK0FDX01TR19OT1RJQ0UoWworV2ViUCBDb25maWd1cmF0aW9uIFN1bW1hcnkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NoYXJlZCBsaWJyYXJpZXM6ICR7ZW5hYmxlX3NoYXJlZH0KK1N0YXRpYyBsaWJyYXJpZXM6ICR7ZW5hYmxlX3N0YXRpY30KK1RocmVhZGluZyBzdXBwb3J0OiAke2VuYWJsZV90aHJlYWRpbmctbm99CitsaWJ3ZWJwOiB5ZXMKK2xpYndlYnBkZWNvZGVyOiAke2VuYWJsZV9saWJ3ZWJwZGVjb2Rlci1ub30KK2xpYndlYnBkZW11eDogJHtlbmFibGVfbGlid2VicGRlbXV4LW5vfQorbGlid2VicG11eDogJHtlbmFibGVfbGlid2VicG11eC1ub30KK2xpYndlYnBleHRyYXM6ICR7ZW5hYmxlX2xpYndlYnBleHRyYXMtbm99CisKK1Rvb2xzOgorY3dlYnAgOiAke2VuYWJsZV9saWJ3ZWJwZGVtdXgtbm99CisgIElucHV0IGZvcm1hdCBzdXBwb3J0CisgID09PT09PT09PT09PT09PT09PT09CisgIEpQRUcgOiAke2pwZWdfc3VwcG9ydC1ub30KKyAgUE5HICA6ICR7cG5nX3N1cHBvcnQtbm99CisgIFRJRkYgOiAke3RpZmZfc3VwcG9ydC1ub30KKyAgV0lDICA6ICR7d2ljX3N1cHBvcnQtbm99Citkd2VicCA6ICR7ZW5hYmxlX2xpYndlYnBkZW11eC1ub30KKyAgT3V0cHV0IGZvcm1hdCBzdXBwb3J0CisgID09PT09PT09PT09PT09PT09PT09PQorICBQTkcgIDogJHtwbmdfc3VwcG9ydC1ub30KKyAgV0lDICA6ICR7d2ljX3N1cHBvcnQtbm99CitHSUYgc3VwcG9ydCA6ICR7Z2lmX3N1cHBvcnQtbm99CithbmltX2RpZmYgICA6ICR7YnVpbGRfYW5pbV9kaWZmLW5vfQorZ2lmMndlYnAgICAgOiAke2J1aWxkX2dpZjJ3ZWJwLW5vfQoraW1nMndlYnAgICAgOiAke2J1aWxkX2ltZzJ3ZWJwLW5vfQord2VicG11eCAgICAgOiAke2VuYWJsZV9saWJ3ZWJwbXV4LW5vfQordndlYnAgICAgICAgOiAke2J1aWxkX3Z3ZWJwLW5vfQord2VicGluZm8gICAgOiAke2J1aWxkX3dlYnBpbmZvLW5vfQorU0RMIHN1cHBvcnQgOiAke3NkbF9zdXBwb3J0LW5vfQordndlYnBfc2RsICAgOiAke2J1aWxkX3Z3ZWJwX3NkbC1ub30KK10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYWxwaGEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9hbHBoYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODFjNDgxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9hbHBoYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBbHBoYS1wbGFuZSBkZWNvbXByZXNzaW9uLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4vdnA4aS5oIgotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9maWx0ZXJzLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlY29kZXMgdGhlIGNvbXByZXNzZWQgZGF0YSAnZGF0YScgb2Ygc2l6ZSAnZGF0YV9zaXplJyBpbnRvIHRoZSAnb3V0cHV0Jy4KLS8vIFRoZSAnb3V0cHV0JyBidWZmZXIgc2hvdWxkIGJlIHByZS1hbGxvY2F0ZWQgYW5kIG11c3QgYmUgb2YgdGhlIHNhbWUKLS8vIGRpbWVuc2lvbiAnaGVpZ2h0J3gnd2lkdGgnLCBhcyB0aGF0IG9mIHRoZSBpbWFnZS4KLS8vCi0vLyBSZXR1cm5zIDEgb24gc3VjY2Vzc2Z1bGx5IGRlY29kaW5nIHRoZSBjb21wcmVzc2VkIGFscGhhIGFuZAotLy8gICAgICAgICAwIGlmIGVpdGhlcjoKLS8vICAgICAgICAgICBlcnJvciBpbiBiaXQtc3RyZWFtIGhlYWRlciAoaW52YWxpZCBjb21wcmVzc2lvbiBtb2RlIG9yIGZpbHRlciksIG9yCi0vLyAgICAgICAgICAgZXJyb3IgcmV0dXJuZWQgYnkgYXBwcm9wcmlhdGUgY29tcHJlc3Npb24gbWV0aG9kLgotCi1zdGF0aWMgaW50IERlY29kZUFscGhhKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgdWludDhfdCogb3V0cHV0KSB7Ci0gIFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyOwotICBpbnQgcHJlX3Byb2Nlc3Npbmc7Ci0gIGludCByc3J2OwotICBpbnQgb2sgPSAwOwotICBpbnQgbWV0aG9kOwotICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYV9kYXRhID0gZGF0YSArIEFMUEhBX0hFQURFUl9MRU47Ci0gIGNvbnN0IHNpemVfdCBhbHBoYV9kYXRhX3NpemUgPSBkYXRhX3NpemUgLSBBTFBIQV9IRUFERVJfTEVOOwotCi0gIFNCX0RDSEVDSyh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7Ci0gIFNCX0RDSEVDSyhkYXRhICE9IE5VTEwgJiYgb3V0cHV0ICE9IE5VTEwpOwotCi0gIGlmIChkYXRhX3NpemUgPD0gQUxQSEFfSEVBREVSX0xFTikgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgbWV0aG9kID0gKGRhdGFbMF0gPj4gMCkgJiAweDAzOwotICBmaWx0ZXIgPSAoZGF0YVswXSA+PiAyKSAmIDB4MDM7Ci0gIHByZV9wcm9jZXNzaW5nID0gKGRhdGFbMF0gPj4gNCkgJiAweDAzOwotICByc3J2ID0gKGRhdGFbMF0gPj4gNikgJiAweDAzOwotICBpZiAobWV0aG9kIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwKLSAgICAgIG1ldGhvZCA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OIHx8Ci0gICAgICBmaWx0ZXIgPj0gV0VCUF9GSUxURVJfTEFTVCB8fAotICAgICAgcHJlX3Byb2Nlc3NpbmcgPiBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIHx8Ci0gICAgICByc3J2ICE9IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlmIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKLSAgICBjb25zdCBzaXplX3QgYWxwaGFfZGVjb2RlZF9zaXplID0gaGVpZ2h0ICogd2lkdGg7Ci0gICAgb2sgPSAoYWxwaGFfZGF0YV9zaXplID49IGFscGhhX2RlY29kZWRfc2l6ZSk7Ci0gICAgaWYgKG9rKSBTYk1lbW9yeUNvcHkob3V0cHV0LCBhbHBoYV9kYXRhLCBhbHBoYV9kZWNvZGVkX3NpemUpOwotICB9IGVsc2UgewotICAgIG9rID0gVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgYWxwaGFfZGF0YSwgYWxwaGFfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChvaykgewotICAgIFdlYlBVbmZpbHRlckZ1bmMgdW5maWx0ZXJfZnVuYyA9IFdlYlBVbmZpbHRlcnNbZmlsdGVyXTsKLSAgICBpZiAodW5maWx0ZXJfZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAvLyBUT0RPKHZpa2FzKTogSW1wbGVtZW50IG9uLXRoZS1mbHkgZGVjb2RpbmcgJiBmaWx0ZXIgbWVjaGFuaXNtIHRvIGRlY29kZQotICAgICAgLy8gYW5kIGFwcGx5IGZpbHRlciBwZXIgaW1hZ2Utcm93LgotICAgICAgdW5maWx0ZXJfZnVuYyh3aWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0cHV0KTsKLSAgICB9Ci0gICAgaWYgKHByZV9wcm9jZXNzaW5nID09IEFMUEhBX1BSRVBST0NFU1NFRF9MRVZFTFMpIHsKLSAgICAgIG9rID0gRGVxdWFudGl6ZUxldmVscyhvdXRwdXQsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cykgewotICBjb25zdCBpbnQgd2lkdGggPSBkZWMtPnBpY19oZHJfLndpZHRoXzsKLSAgY29uc3QgaW50IGhlaWdodCA9IGRlYy0+cGljX2hkcl8uaGVpZ2h0XzsKLQotICBpZiAocm93IDwgMCB8fCBudW1fcm93cyA8IDAgfHwgcm93ICsgbnVtX3Jvd3MgPiBoZWlnaHQpIHsKLSAgICByZXR1cm4gTlVMTDsgICAgLy8gc2FuaXR5IGNoZWNrLgotICB9Ci0KLSAgaWYgKHJvdyA9PSAwKSB7Ci0gICAgLy8gRGVjb2RlIGV2ZXJ5dGhpbmcgZHVyaW5nIHRoZSBmaXJzdCBjYWxsLgotICAgIFNCX0RDSEVDSyghZGVjLT5pc19hbHBoYV9kZWNvZGVkXyk7Ci0gICAgaWYgKCFEZWNvZGVBbHBoYShkZWMtPmFscGhhX2RhdGFfLCAoc2l6ZV90KWRlYy0+YWxwaGFfZGF0YV9zaXplXywKLSAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGRlYy0+YWxwaGFfcGxhbmVfKSkgewotICAgICAgcmV0dXJuIE5VTEw7ICAvLyBFcnJvci4KLSAgICB9Ci0gICAgZGVjLT5pc19hbHBoYV9kZWNvZGVkXyA9IDE7Ci0gIH0KLQotICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGRlY29kZWQgcm93LgotICByZXR1cm4gZGVjLT5hbHBoYV9wbGFuZV8gKyByb3cgKiB3aWR0aDsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYnVmZmVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvYnVmZmVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ZThhYmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2J1ZmZlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBFdmVyeXRoaW5nIGFib3V0IFdlYlBEZWNCdWZmZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3dlYnBpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlBEZWNCdWZmZXIKLQotLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgdGhlIGRpZmZlcmVudCBjb2xvci1zcGFjZXMuCi1zdGF0aWMgY29uc3QgaW50IGtNb2RlQnBwW01PREVfTEFTVF0gPSB7Ci0gIDMsIDQsIDMsIDQsIDQsIDIsIDIsCi0gIDQsIDQsIDQsIDIsICAgIC8vIHByZS1tdWx0aXBsaWVkIG1vZGVzCi0gIDEsIDEgfTsKLQotLy8gQ2hlY2sgdGhhdCB3ZWJwX2NzcF9tb2RlIGlzIHdpdGhpbiB0aGUgYm91bmRzIG9mIFdFQlBfQ1NQX01PREUuCi0vLyBDb252ZXJ0IHRvIGFuIGludGVnZXIgdG8gaGFuZGxlIGJvdGggdGhlIHVuc2lnbmVkL3NpZ25lZCBlbnVtIGNhc2VzCi0vLyB3aXRob3V0IHRoZSBuZWVkIGZvciBjYXN0aW5nIHRvIHJlbW92ZSB0eXBlIGxpbWl0IHdhcm5pbmdzLgotc3RhdGljIGludCBJc1ZhbGlkQ29sb3JzcGFjZShpbnQgd2VicF9jc3BfbW9kZSkgewotICByZXR1cm4gKHdlYnBfY3NwX21vZGUgPj0gTU9ERV9SR0IgJiYgd2VicF9jc3BfbW9kZSA8IE1PREVfTEFTVCk7Ci19Ci0KLXN0YXRpYyBWUDhTdGF0dXNDb2RlIENoZWNrRGVjQnVmZmVyKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgewotICBpbnQgb2sgPSAxOwotICBjb25zdCBXRUJQX0NTUF9NT0RFIG1vZGUgPSBidWZmZXItPmNvbG9yc3BhY2U7Ci0gIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKLSAgaWYgKCFJc1ZhbGlkQ29sb3JzcGFjZShtb2RlKSkgewotICAgIG9rID0gMDsKLSAgfSBlbHNlIGlmICghV2ViUElzUkdCTW9kZShtb2RlKSkgeyAgIC8vIFlVViBjaGVja3MKLSAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOwotICAgIGNvbnN0IHVpbnQ2NF90IHlfc2l6ZSA9ICh1aW50NjRfdClidWYtPnlfc3RyaWRlICogaGVpZ2h0OwotICAgIGNvbnN0IHVpbnQ2NF90IHVfc2l6ZSA9ICh1aW50NjRfdClidWYtPnVfc3RyaWRlICogKChoZWlnaHQgKyAxKSAvIDIpOwotICAgIGNvbnN0IHVpbnQ2NF90IHZfc2l6ZSA9ICh1aW50NjRfdClidWYtPnZfc3RyaWRlICogKChoZWlnaHQgKyAxKSAvIDIpOwotICAgIGNvbnN0IHVpbnQ2NF90IGFfc2l6ZSA9ICh1aW50NjRfdClidWYtPmFfc3RyaWRlICogaGVpZ2h0OwotICAgIG9rICY9ICh5X3NpemUgPD0gYnVmLT55X3NpemUpOwotICAgIG9rICY9ICh1X3NpemUgPD0gYnVmLT51X3NpemUpOwotICAgIG9rICY9ICh2X3NpemUgPD0gYnVmLT52X3NpemUpOwotICAgIG9rICY9IChidWYtPnlfc3RyaWRlID49IHdpZHRoKTsKLSAgICBvayAmPSAoYnVmLT51X3N0cmlkZSA+PSAod2lkdGggKyAxKSAvIDIpOwotICAgIG9rICY9IChidWYtPnZfc3RyaWRlID49ICh3aWR0aCArIDEpIC8gMik7Ci0gICAgb2sgJj0gKGJ1Zi0+eSAhPSBOVUxMKTsKLSAgICBvayAmPSAoYnVmLT51ICE9IE5VTEwpOwotICAgIG9rICY9IChidWYtPnYgIT0gTlVMTCk7Ci0gICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7Ci0gICAgICBvayAmPSAoYnVmLT5hX3N0cmlkZSA+PSB3aWR0aCk7Ci0gICAgICBvayAmPSAoYV9zaXplIDw9IGJ1Zi0+YV9zaXplKTsKLSAgICAgIG9rICY9IChidWYtPmEgIT0gTlVMTCk7Ci0gICAgfQotICB9IGVsc2UgeyAgICAvLyBSR0IgY2hlY2tzCi0gICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuUkdCQTsKLSAgICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KWJ1Zi0+c3RyaWRlICogaGVpZ2h0OwotICAgIG9rICY9IChzaXplIDw9IGJ1Zi0+c2l6ZSk7Ci0gICAgb2sgJj0gKGJ1Zi0+c3RyaWRlID49IHdpZHRoICoga01vZGVCcHBbbW9kZV0pOwotICAgIG9rICY9IChidWYtPnJnYmEgIT0gTlVMTCk7Ci0gIH0KLSAgcmV0dXJuIG9rID8gVlA4X1NUQVRVU19PSyA6IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLX0KLQotc3RhdGljIFZQOFN0YXR1c0NvZGUgQWxsb2NhdGVCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7Ci0gIGNvbnN0IGludCB3ID0gYnVmZmVyLT53aWR0aDsKLSAgY29uc3QgaW50IGggPSBidWZmZXItPmhlaWdodDsKLSAgY29uc3QgV0VCUF9DU1BfTU9ERSBtb2RlID0gYnVmZmVyLT5jb2xvcnNwYWNlOwotCi0gIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8ICFJc1ZhbGlkQ29sb3JzcGFjZShtb2RlKSkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gIH0KLQotICBpZiAoIWJ1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5ICYmIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPT0gTlVMTCkgewotICAgIHVpbnQ4X3QqIG91dHB1dDsKLSAgICBpbnQgdXZfc3RyaWRlID0gMCwgYV9zdHJpZGUgPSAwOwotICAgIHVpbnQ2NF90IHV2X3NpemUgPSAwLCBhX3NpemUgPSAwLCB0b3RhbF9zaXplOwotICAgIC8vIFdlIG5lZWQgbWVtb3J5IGFuZCBpdCBoYXNuJ3QgYmVlbiBhbGxvY2F0ZWQgeWV0LgotICAgIC8vID0+IGluaXRpYWxpemUgb3V0cHV0IGJ1ZmZlciwgbm93IHRoYXQgZGltZW5zaW9ucyBhcmUga25vd24uCi0gICAgY29uc3QgaW50IHN0cmlkZSA9IHcgKiBrTW9kZUJwcFttb2RlXTsKLSAgICBjb25zdCB1aW50NjRfdCBzaXplID0gKHVpbnQ2NF90KXN0cmlkZSAqIGg7Ci0KLSAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsKLSAgICAgIHV2X3N0cmlkZSA9ICh3ICsgMSkgLyAyOwotICAgICAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiAoKGggKyAxKSAvIDIpOwotICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7Ci0gICAgICAgIGFfc3RyaWRlID0gdzsKLSAgICAgICAgYV9zaXplID0gKHVpbnQ2NF90KWFfc3RyaWRlICogaDsKLSAgICAgIH0KLSAgICB9Ci0gICAgdG90YWxfc2l6ZSA9IHNpemUgKyAyICogdXZfc2l6ZSArIGFfc2l6ZTsKLQotICAgIC8vIFNlY3VyaXR5L3Nhbml0eSBjaGVja3MKLSAgICBvdXRwdXQgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpvdXRwdXQpKTsKLSAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgfQotICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBvdXRwdXQ7Ci0KLSAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsgICAvLyBZVVZBIGluaXRpYWxpemF0aW9uCi0gICAgICBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOwotICAgICAgYnVmLT55ID0gb3V0cHV0OwotICAgICAgYnVmLT55X3N0cmlkZSA9IHN0cmlkZTsKLSAgICAgIGJ1Zi0+eV9zaXplID0gKHNpemVfdClzaXplOwotICAgICAgYnVmLT51ID0gb3V0cHV0ICsgc2l6ZTsKLSAgICAgIGJ1Zi0+dV9zdHJpZGUgPSB1dl9zdHJpZGU7Ci0gICAgICBidWYtPnVfc2l6ZSA9IChzaXplX3QpdXZfc2l6ZTsKLSAgICAgIGJ1Zi0+diA9IG91dHB1dCArIHNpemUgKyB1dl9zaXplOwotICAgICAgYnVmLT52X3N0cmlkZSA9IHV2X3N0cmlkZTsKLSAgICAgIGJ1Zi0+dl9zaXplID0gKHNpemVfdCl1dl9zaXplOwotICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7Ci0gICAgICAgIGJ1Zi0+YSA9IG91dHB1dCArIHNpemUgKyAyICogdXZfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGJ1Zi0+YV9zaXplID0gKHNpemVfdClhX3NpemU7Ci0gICAgICBidWYtPmFfc3RyaWRlID0gYV9zdHJpZGU7Ci0gICAgfSBlbHNlIHsgIC8vIFJHQkEgaW5pdGlhbGl6YXRpb24KLSAgICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7Ci0gICAgICBidWYtPnJnYmEgPSBvdXRwdXQ7Ci0gICAgICBidWYtPnN0cmlkZSA9IHN0cmlkZTsKLSAgICAgIGJ1Zi0+c2l6ZSA9IChzaXplX3Qpc2l6ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIENoZWNrRGVjQnVmZmVyKGJ1ZmZlcik7Ci19Ci0KLVZQOFN0YXR1c0NvZGUgV2ViUEFsbG9jYXRlRGVjQnVmZmVyKGludCB3LCBpbnQgaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dCkgewotICBpZiAob3V0ID09IE5VTEwgfHwgdyA8PSAwIHx8IGggPD0gMCkgewotICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gIH0KLSAgaWYgKG9wdGlvbnMgIT0gTlVMTCkgeyAgICAvLyBGaXJzdCwgYXBwbHkgb3B0aW9ucyBpZiB0aGVyZSBpcyBhbnkuCi0gICAgaWYgKG9wdGlvbnMtPnVzZV9jcm9wcGluZykgewotICAgICAgY29uc3QgaW50IGN3ID0gb3B0aW9ucy0+Y3JvcF93aWR0aDsKLSAgICAgIGNvbnN0IGludCBjaCA9IG9wdGlvbnMtPmNyb3BfaGVpZ2h0OwotICAgICAgY29uc3QgaW50IHggPSBvcHRpb25zLT5jcm9wX2xlZnQgJiB+MTsKLSAgICAgIGNvbnN0IGludCB5ID0gb3B0aW9ucy0+Y3JvcF90b3AgJiB+MTsKLSAgICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCBjdyA8PSAwIHx8IGNoIDw9IDAgfHwgeCArIGN3ID4gdyB8fCB5ICsgY2ggPiBoKSB7Ci0gICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07ICAgLy8gb3V0IG9mIGZyYW1lIGJvdW5kYXJ5LgotICAgICAgfQotICAgICAgdyA9IGN3OwotICAgICAgaCA9IGNoOwotICAgIH0KLSAgICBpZiAob3B0aW9ucy0+dXNlX3NjYWxpbmcpIHsKLSAgICAgIGlmIChvcHRpb25zLT5zY2FsZWRfd2lkdGggPD0gMCB8fCBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0IDw9IDApIHsKLSAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgICAgIH0KLSAgICAgIHcgPSBvcHRpb25zLT5zY2FsZWRfd2lkdGg7Ci0gICAgICBoID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKLSAgICB9Ci0gIH0KLSAgb3V0LT53aWR0aCA9IHc7Ci0gIG91dC0+aGVpZ2h0ID0gaDsKLQotICAvLyBUaGVuLCBhbGxvY2F0ZSBidWZmZXIgZm9yIHJlYWwKLSAgcmV0dXJuIEFsbG9jYXRlQnVmZmVyKG91dCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBjb25zdHJ1Y3RvcnMgLyBkZXN0cnVjdG9ycwotCi1pbnQgV2ViUEluaXREZWNCdWZmZXJJbnRlcm5hbChXZWJQRGVjQnVmZmVyKiBidWZmZXIsIGludCB2ZXJzaW9uKSB7Ci0gIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKSkgewotICAgIHJldHVybiAwOyAgLy8gdmVyc2lvbiBtaXNtYXRjaAotICB9Ci0gIGlmIChidWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIFNiTWVtb3J5U2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKSB7Ci0gIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgIGlmICghYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkpCi0gICAgICBTYk1lbW9yeURlYWxsb2NhdGUoYnVmZmVyLT5wcml2YXRlX21lbW9yeSk7Ci0gICAgYnVmZmVyLT5wcml2YXRlX21lbW9yeSA9IE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBXZWJQQ29weURlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCkgewotICBpZiAoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpIHsKLSAgICAqZHN0ID0gKnNyYzsKLSAgICBpZiAoc3JjLT5wcml2YXRlX21lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICBkc3QtPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7ICAgLy8gZHN0IGJ1ZmZlciBkb2Vzbid0IG93biB0aGUgbWVtb3J5LgotICAgICAgZHN0LT5wcml2YXRlX21lbW9yeSA9IE5VTEw7Ci0gICAgfQotICB9Ci19Ci0KLS8vIENvcHkgYW5kIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHNyYyB0byBkc3QgKGJld2FyZSBvZiBwYXJhbWV0ZXIgb3JkZXIhKQotdm9pZCBXZWJQR3JhYkRlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCkgewotICBpZiAoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpIHsKLSAgICAqZHN0ID0gKnNyYzsKLSAgICBpZiAoc3JjLT5wcml2YXRlX21lbW9yeSAhPSBOVUxMKSB7Ci0gICAgICBzcmMtPmlzX2V4dGVybmFsX21lbW9yeSA9IDE7ICAgLy8gc3JjIHJlbGlucXVpc2hlcyBvd25lcnNoaXAKLSAgICAgIHNyYy0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9mcmFtZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2ZyYW1lLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3MzUyOGEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2ZyYW1lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEZyYW1lLXJlY29uc3RydWN0aW9uIGZ1bmN0aW9uLiBNZW1vcnkgYWxsb2NhdGlvbi4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBBTElHTl9NQVNLICgzMiAtIDEpCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaWx0ZXJpbmcKLQotLy8ga0ZpbHRlckV4dHJhUm93c1tdID0gSG93IG1hbnkgZXh0cmEgbGluZXMgYXJlIG5lZWRlZCBvbiB0aGUgTUIgYm91bmRhcnkKLS8vIGZvciBjYWNoaW5nLCBnaXZlbiBhIGZpbHRlcmluZyBsZXZlbC4KLS8vIFNpbXBsZSBmaWx0ZXI6ICB1cCB0byAyIGx1bWEgc2FtcGxlcyBhcmUgcmVhZCBhbmQgMSBpcyB3cml0dGVuLgotLy8gQ29tcGxleCBmaWx0ZXI6IHVwIHRvIDQgbHVtYSBzYW1wbGVzIGFyZSByZWFkIGFuZCAzIGFyZSB3cml0dGVuLiBTYW1lIGZvcgotLy8gICAgICAgICAgICAgICAgIFUvViwgc28gaXQncyA4IHNhbXBsZXMgdG90YWwgKGJlY2F1c2Ugb2YgdGhlIDJ4IHVwc2FtcGxpbmcpLgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZpbHRlckV4dHJhUm93c1szXSA9IHsgMCwgMiwgOCB9OwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IGhldl90aHJlc2hfZnJvbV9sZXZlbChpbnQgbGV2ZWwsIGludCBrZXlmcmFtZSkgewotICBpZiAoa2V5ZnJhbWUpIHsKLSAgICByZXR1cm4gKGxldmVsID49IDQwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChsZXZlbCA+PSA0MCkgPyAzIDogKGxldmVsID49IDIwKSA/IDIgOiAobGV2ZWwgPj0gMTUpID8gMSA6IDA7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgRG9GaWx0ZXIoY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjLCBpbnQgbWJfeCwgaW50IG1iX3kpIHsKLSAgY29uc3QgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87Ci0gIGNvbnN0IGludCB5X2JwcyA9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICBWUDhGSW5mbyogY29uc3QgZl9pbmZvID0gY3R4LT5mX2luZm9fICsgbWJfeDsKLSAgdWludDhfdCogY29uc3QgeV9kc3QgPSBkZWMtPmNhY2hlX3lfICsgY3R4LT5pZF8gKiAxNiAqIHlfYnBzICsgbWJfeCAqIDE2OwotICBjb25zdCBpbnQgbGV2ZWwgPSBmX2luZm8tPmZfbGV2ZWxfOwotICBjb25zdCBpbnQgaWxldmVsID0gZl9pbmZvLT5mX2lsZXZlbF87Ci0gIGNvbnN0IGludCBsaW1pdCA9IDIgKiBsZXZlbCArIGlsZXZlbDsKLSAgaWYgKGxldmVsID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID09IDEpIHsgICAvLyBzaW1wbGUKLSAgICBpZiAobWJfeCA+IDApIHsKLSAgICAgIFZQOFNpbXBsZUhGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCk7Ci0gICAgfQotICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7Ci0gICAgICBWUDhTaW1wbGVIRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQpOwotICAgIH0KLSAgICBpZiAobWJfeSA+IDApIHsKLSAgICAgIFZQOFNpbXBsZVZGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCk7Ci0gICAgfQotICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7Ci0gICAgICBWUDhTaW1wbGVWRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQpOwotICAgIH0KLSAgfSBlbHNlIHsgICAgLy8gY29tcGxleAotICAgIGNvbnN0IGludCB1dl9icHMgPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gICAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPmNhY2hlX3VfICsgY3R4LT5pZF8gKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7Ci0gICAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBkZWMtPmNhY2hlX3ZfICsgY3R4LT5pZF8gKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7Ci0gICAgY29uc3QgaW50IGhldl90aHJlc2ggPQotICAgICAgICBoZXZfdGhyZXNoX2Zyb21fbGV2ZWwobGV2ZWwsIGRlYy0+ZnJtX2hkcl8ua2V5X2ZyYW1lXyk7Ci0gICAgaWYgKG1iX3ggPiAwKSB7Ci0gICAgICBWUDhIRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgICBWUDhIRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIH0KLSAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgewotICAgICAgVlA4SEZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgICAgVlA4SEZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICB9Ci0gICAgaWYgKG1iX3kgPiAwKSB7Ci0gICAgICBWUDhWRmlsdGVyMTYoeV9kc3QsIHlfYnBzLCBsaW1pdCArIDQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgICBWUDhWRmlsdGVyOCh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIH0KLSAgICBpZiAoZl9pbmZvLT5mX2lubmVyXykgewotICAgICAgVlA4VkZpbHRlcjE2aSh5X2RzdCwgeV9icHMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgICAgVlA4VkZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgdXZfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRmlsdGVyIHRoZSBkZWNvZGVkIG1hY3JvYmxvY2sgcm93IChpZiBuZWVkZWQpCi1zdGF0aWMgdm9pZCBGaWx0ZXJSb3coY29uc3QgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGludCBtYl94OwotICBjb25zdCBpbnQgbWJfeSA9IGRlYy0+dGhyZWFkX2N0eF8ubWJfeV87Ci0gIFNCX0RDSEVDSyhkZWMtPnRocmVhZF9jdHhfLmZpbHRlcl9yb3dfKTsKLSAgZm9yIChtYl94ID0gZGVjLT50bF9tYl94XzsgbWJfeCA8IGRlYy0+YnJfbWJfeF87ICsrbWJfeCkgewotICAgIERvRmlsdGVyKGRlYywgbWJfeCwgbWJfeSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByZWNvbXB1dGUgdGhlIGZpbHRlcmluZyBzdHJlbmd0aCBmb3IgZWFjaCBzZWdtZW50IGFuZCBlYWNoIGk0eDQvaTE2eDE2IG1vZGUuCi0KLXN0YXRpYyB2b2lkIFByZWNvbXB1dGVGaWx0ZXJTdHJlbmd0aHMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmIChkZWMtPmZpbHRlcl90eXBlXyA+IDApIHsKLSAgICBpbnQgczsKLSAgICBjb25zdCBWUDhGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkciA9ICZkZWMtPmZpbHRlcl9oZHJfOwotICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgaW50IGk0eDQ7Ci0gICAgICAvLyBGaXJzdCwgY29tcHV0ZSB0aGUgaW5pdGlhbCBsZXZlbAotICAgICAgaW50IGJhc2VfbGV2ZWw7Ci0gICAgICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXNlX3NlZ21lbnRfKSB7Ci0gICAgICAgIGJhc2VfbGV2ZWwgPSBkZWMtPnNlZ21lbnRfaGRyXy5maWx0ZXJfc3RyZW5ndGhfW3NdOwotICAgICAgICBpZiAoIWRlYy0+c2VnbWVudF9oZHJfLmFic29sdXRlX2RlbHRhXykgewotICAgICAgICAgIGJhc2VfbGV2ZWwgKz0gaGRyLT5sZXZlbF87Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJhc2VfbGV2ZWwgPSBoZHItPmxldmVsXzsKLSAgICAgIH0KLSAgICAgIGZvciAoaTR4NCA9IDA7IGk0eDQgPD0gMTsgKytpNHg0KSB7Ci0gICAgICAgIFZQOEZJbmZvKiBjb25zdCBpbmZvID0gJmRlYy0+ZnN0cmVuZ3Roc19bc11baTR4NF07Ci0gICAgICAgIGludCBsZXZlbCA9IGJhc2VfbGV2ZWw7Ci0gICAgICAgIGlmIChoZHItPnVzZV9sZl9kZWx0YV8pIHsKLSAgICAgICAgICAvLyBUT0RPKHNrYWwpOiBvbmx5IENVUlJFTlQgaXMgaGFuZGxlZCBmb3Igbm93LgotICAgICAgICAgIGxldmVsICs9IGhkci0+cmVmX2xmX2RlbHRhX1swXTsKLSAgICAgICAgICBpZiAoaTR4NCkgewotICAgICAgICAgICAgbGV2ZWwgKz0gaGRyLT5tb2RlX2xmX2RlbHRhX1swXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbGV2ZWwgPSAobGV2ZWwgPCAwKSA/IDAgOiAobGV2ZWwgPiA2MykgPyA2MyA6IGxldmVsOwotICAgICAgICBpbmZvLT5mX2xldmVsXyA9IGxldmVsOwotCi0gICAgICAgIGlmIChoZHItPnNoYXJwbmVzc18gPiAwKSB7Ci0gICAgICAgICAgaWYgKGhkci0+c2hhcnBuZXNzXyA+IDQpIHsKLSAgICAgICAgICAgIGxldmVsID4+PSAyOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXZlbCA+Pj0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGxldmVsID4gOSAtIGhkci0+c2hhcnBuZXNzXykgewotICAgICAgICAgICAgbGV2ZWwgPSA5IC0gaGRyLT5zaGFycG5lc3NfOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbmZvLT5mX2lsZXZlbF8gPSAobGV2ZWwgPCAxKSA/IDEgOiBsZXZlbDsKLSAgICAgICAgaW5mby0+Zl9pbm5lcl8gPSAwOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSByb3cgb2YgbWFjcm9ibG9ja3MgaXMgZmluaXNoZWQgZGVjb2RpbmcuCi0vLyBJdCBhbHNvIHRha2VzIGludG8gYWNjb3VudCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKLS8vICAqIEluIGNhc2Ugb2YgaW4tbG9vcCBmaWx0ZXJpbmcsIHdlIG11c3QgaG9sZCBvZmYgc2VuZGluZyBzb21lIG9mIHRoZSBib3R0b20KLS8vICAgIHBpeGVscyBhcyB0aGV5IGFyZSB5ZXQgdW5maWx0ZXJlZC4gVGhleSB3aWxsIGJlIHdoZW4gdGhlIG5leHQgbWFjcm9ibG9jawotLy8gICAgcm93IGlzIGRlY29kZWQuIE1lYW53aGlsZSwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGVtIGJ5IHJvdGF0aW5nIHRoZW0gaW4gdGhlCi0vLyAgICBjYWNoZSBhcmVhLiBUaGlzIGRvZXNuJ3QgaG9sZCBmb3IgdGhlIHZlcnkgYm90dG9tIHJvdyBvZiB0aGUgdW5jcm9wcGVkCi0vLyAgICBwaWN0dXJlIG9mIGNvdXJzZS4KLS8vICAqIHdlIG11c3QgY2xpcCB0aGUgcmVtYWluaW5nIHBpeGVscyBhZ2FpbnN0IHRoZSBjcm9wcGluZyBhcmVhLiBUaGUgVlA4SW8KLS8vICAgIHN0cnVjdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgc2V0IGNvcnJlY3RseSBiZWZvcmUgY2FsbGluZyBwdXQoKToKLQotI2RlZmluZSBNQUNST0JMT0NLX1ZQT1MobWJfeSkgICgobWJfeSkgKiAxNikgICAgLy8gdmVydGljYWwgcG9zaXRpb24gb2YgYSBNQgotCi0vLyBGaW5hbGl6ZSBhbmQgdHJhbnNtaXQgYSBjb21wbGV0ZSByb3cuIFJldHVybiBmYWxzZSBpbiBjYXNlIG9mIHVzZXItYWJvcnQuCi1zdGF0aWMgaW50IEZpbmlzaFJvdyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgewotICBpbnQgb2sgPSAxOwotICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKLSAgY29uc3QgaW50IGV4dHJhX3lfcm93cyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOwotICBjb25zdCBpbnQgeXNpemUgPSBleHRyYV95X3Jvd3MgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKLSAgY29uc3QgaW50IHV2c2l6ZSA9IChleHRyYV95X3Jvd3MgLyAyKSAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKLSAgY29uc3QgaW50IHlfb2Zmc2V0ID0gY3R4LT5pZF8gKiAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gY3R4LT5pZF8gKiA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICB1aW50OF90KiBjb25zdCB5ZHN0ID0gZGVjLT5jYWNoZV95XyAtIHlzaXplICsgeV9vZmZzZXQ7Ci0gIHVpbnQ4X3QqIGNvbnN0IHVkc3QgPSBkZWMtPmNhY2hlX3VfIC0gdXZzaXplICsgdXZfb2Zmc2V0OwotICB1aW50OF90KiBjb25zdCB2ZHN0ID0gZGVjLT5jYWNoZV92XyAtIHV2c2l6ZSArIHV2X29mZnNldDsKLSAgY29uc3QgaW50IGZpcnN0X3JvdyA9IChjdHgtPm1iX3lfID09IDApOwotICBjb25zdCBpbnQgbGFzdF9yb3cgPSAoY3R4LT5tYl95XyA+PSBkZWMtPmJyX21iX3lfIC0gMSk7Ci0gIGludCB5X3N0YXJ0ID0gTUFDUk9CTE9DS19WUE9TKGN0eC0+bWJfeV8pOwotICBpbnQgeV9lbmQgPSBNQUNST0JMT0NLX1ZQT1MoY3R4LT5tYl95XyArIDEpOwotCi0gIGlmIChjdHgtPmZpbHRlcl9yb3dfKSB7Ci0gICAgRmlsdGVyUm93KGRlYyk7Ci0gIH0KLQotICBpZiAoaW8tPnB1dCkgewotICAgIGlmICghZmlyc3Rfcm93KSB7Ci0gICAgICB5X3N0YXJ0IC09IGV4dHJhX3lfcm93czsKLSAgICAgIGlvLT55ID0geWRzdDsKLSAgICAgIGlvLT51ID0gdWRzdDsKLSAgICAgIGlvLT52ID0gdmRzdDsKLSAgICB9IGVsc2UgewotICAgICAgaW8tPnkgPSBkZWMtPmNhY2hlX3lfICsgeV9vZmZzZXQ7Ci0gICAgICBpby0+dSA9IGRlYy0+Y2FjaGVfdV8gKyB1dl9vZmZzZXQ7Ci0gICAgICBpby0+diA9IGRlYy0+Y2FjaGVfdl8gKyB1dl9vZmZzZXQ7Ci0gICAgfQotCi0gICAgaWYgKCFsYXN0X3JvdykgewotICAgICAgeV9lbmQgLT0gZXh0cmFfeV9yb3dzOwotICAgIH0KLSAgICBpZiAoeV9lbmQgPiBpby0+Y3JvcF9ib3R0b20pIHsKLSAgICAgIHlfZW5kID0gaW8tPmNyb3BfYm90dG9tOyAgICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgb24gbGFzdCByb3cuCi0gICAgfQotICAgIGlvLT5hID0gTlVMTDsKLSAgICBpZiAoZGVjLT5hbHBoYV9kYXRhXyAhPSBOVUxMICYmIHlfc3RhcnQgPCB5X2VuZCkgewotICAgICAgLy8gVE9ETyhza2FsKTogc2V2ZXJhbCB0aGluZ3MgdG8gY29ycmVjdCBoZXJlOgotICAgICAgLy8gKiB0ZXN0aW5nIHByZXNlbmNlIG9mIGFscGhhIHdpdGggZGVjLT5hbHBoYV9kYXRhXyBpcyBub3QgYSBnb29kIGlkZWEKLSAgICAgIC8vICogd2UncmUgYWN0dWFsbHkgZGVjb21wcmVzc2luZyB0aGUgZnVsbCBwbGFuZSBvbmx5IG9uY2UuIEl0IHNob3VsZCBiZQotICAgICAgLy8gICBtb3JlIG9idmlvdXMgZnJvbSBzaWduYXR1cmUuCi0gICAgICAvLyAqIHdlIGNvdWxkIGZyZWUgYWxwaGFfZGF0YV8gcmlnaHQgYWZ0ZXIgdGhpcyBjYWxsLCBidXQgd2UgZG9uJ3Qgb3duLgotICAgICAgaW8tPmEgPSBWUDhEZWNvbXByZXNzQWxwaGFSb3dzKGRlYywgeV9zdGFydCwgeV9lbmQgLSB5X3N0YXJ0KTsKLSAgICAgIGlmIChpby0+YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWNvZGUgYWxwaGEgZGF0YS4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKLSAgICAgIGNvbnN0IGludCBkZWx0YV95ID0gaW8tPmNyb3BfdG9wIC0geV9zdGFydDsKLSAgICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7Ci0gICAgICBTQl9EQ0hFQ0soIShkZWx0YV95ICYgMSkpOwotICAgICAgaW8tPnkgKz0gZGVjLT5jYWNoZV95X3N0cmlkZV8gKiBkZWx0YV95OwotICAgICAgaW8tPnUgKz0gZGVjLT5jYWNoZV91dl9zdHJpZGVfICogKGRlbHRhX3kgPj4gMSk7Ci0gICAgICBpby0+diArPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKiAoZGVsdGFfeSA+PiAxKTsKLSAgICAgIGlmIChpby0+YSAhPSBOVUxMKSB7Ci0gICAgICAgIGlvLT5hICs9IGlvLT53aWR0aCAqIGRlbHRhX3k7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh5X3N0YXJ0IDwgeV9lbmQpIHsKLSAgICAgIGlvLT55ICs9IGlvLT5jcm9wX2xlZnQ7Ci0gICAgICBpby0+dSArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7Ci0gICAgICBpby0+diArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7Ci0gICAgICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgICAgICBpby0+YSArPSBpby0+Y3JvcF9sZWZ0OwotICAgICAgfQotICAgICAgaW8tPm1iX3kgPSB5X3N0YXJ0IC0gaW8tPmNyb3BfdG9wOwotICAgICAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7Ci0gICAgICBpby0+bWJfaCA9IHlfZW5kIC0geV9zdGFydDsKLSAgICAgIG9rID0gaW8tPnB1dChpbyk7Ci0gICAgfQotICB9Ci0gIC8vIHJvdGF0ZSB0b3Agc2FtcGxlcyBpZiBuZWVkZWQKLSAgaWYgKGN0eC0+aWRfICsgMSA9PSBkZWMtPm51bV9jYWNoZXNfKSB7Ci0gICAgaWYgKCFsYXN0X3JvdykgewotICAgICAgU2JNZW1vcnlDb3B5KGRlYy0+Y2FjaGVfeV8gLSB5c2l6ZSwgeWRzdCArIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV8sIHlzaXplKTsKLSAgICAgIFNiTWVtb3J5Q29weShkZWMtPmNhY2hlX3VfIC0gdXZzaXplLCB1ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKLSAgICAgIFNiTWVtb3J5Q29weShkZWMtPmNhY2hlX3ZfIC0gdXZzaXplLCB2ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gb2s7Ci19Ci0KLSN1bmRlZiBNQUNST0JMT0NLX1ZQT1MKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgaW50IG9rID0gMTsKLSAgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87Ci0gIGlmICghZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICAvLyBjdHgtPmlkXyBhbmQgY3R4LT5mX2luZm9fIGFyZSBhbHJlYWR5IHNldAotICAgIGN0eC0+bWJfeV8gPSBkZWMtPm1iX3lfOwotICAgIGN0eC0+ZmlsdGVyX3Jvd18gPSBkZWMtPmZpbHRlcl9yb3dfOwotICAgIG9rID0gRmluaXNoUm93KGRlYywgaW8pOwotICB9IGVsc2UgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZkZWMtPndvcmtlcl87Ci0gICAgLy8gRmluaXNoIHByZXZpb3VzIGpvYiAqYmVmb3JlKiB1cGRhdGluZyBjb250ZXh0Ci0gICAgb2sgJj0gV2ViUFdvcmtlclN5bmMod29ya2VyKTsKLSAgICBTQl9EQ0hFQ0sod29ya2VyLT5zdGF0dXNfID09IE9LKTsKLSAgICBpZiAob2spIHsgICAvLyBzcGF3biBhIG5ldyBkZWJsb2NraW5nL291dHB1dCBqb2IKLSAgICAgIGN0eC0+aW9fID0gKmlvOwotICAgICAgY3R4LT5pZF8gPSBkZWMtPmNhY2hlX2lkXzsKLSAgICAgIGN0eC0+bWJfeV8gPSBkZWMtPm1iX3lfOwotICAgICAgY3R4LT5maWx0ZXJfcm93XyA9IGRlYy0+ZmlsdGVyX3Jvd187Ci0gICAgICBpZiAoY3R4LT5maWx0ZXJfcm93XykgeyAgICAvLyBqdXN0IHN3YXAgZmlsdGVyIGluZm8KLSAgICAgICAgVlA4RkluZm8qIGNvbnN0IHRtcCA9IGN0eC0+Zl9pbmZvXzsKLSAgICAgICAgY3R4LT5mX2luZm9fID0gZGVjLT5mX2luZm9fOwotICAgICAgICBkZWMtPmZfaW5mb18gPSB0bXA7Ci0gICAgICB9Ci0gICAgICBXZWJQV29ya2VyTGF1bmNoKHdvcmtlcik7Ci0gICAgICBpZiAoKytkZWMtPmNhY2hlX2lkXyA9PSBkZWMtPm51bV9jYWNoZXNfKSB7Ci0gICAgICAgIGRlYy0+Y2FjaGVfaWRfID0gMDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmluaXNoIHNldHRpbmcgdXAgdGhlIGRlY29kaW5nIHBhcmFtZXRlciBvbmNlIHVzZXIncyBzZXR1cCgpIGlzIGNhbGxlZC4KLQotVlA4U3RhdHVzQ29kZSBWUDhFbnRlckNyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIC8vIENhbGwgc2V0dXAoKSBmaXJzdC4gVGhpcyBtYXkgdHJpZ2dlciBhZGRpdGlvbmFsIGRlY29kaW5nIGZlYXR1cmVzIG9uICdpbycuCi0gIC8vIE5vdGU6IEFmdGVyd2FyZCwgd2UgbXVzdCBjYWxsIHRlYXJkb3duKCkgbm90IG1hdHRlciB3aGF0LgotICBpZiAoaW8tPnNldHVwICYmICFpby0+c2V0dXAoaW8pKSB7Ci0gICAgVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VTRVJfQUJPUlQsICJGcmFtZSBzZXR1cCBmYWlsZWQiKTsKLSAgICByZXR1cm4gZGVjLT5zdGF0dXNfOwotICB9Ci0KLSAgLy8gRGlzYWJsZSBmaWx0ZXJpbmcgcGVyIHVzZXIgcmVxdWVzdAotICBpZiAoaW8tPmJ5cGFzc19maWx0ZXJpbmcpIHsKLSAgICBkZWMtPmZpbHRlcl90eXBlXyA9IDA7Ci0gIH0KLSAgLy8gVE9ETyhza2FsKTogZmlsdGVyIHR5cGUgLyBzdHJlbmd0aCAvIHNoYXJwbmVzcyBmb3JjaW5nCi0KLSAgLy8gRGVmaW5lIHRoZSBhcmVhIHdoZXJlIHdlIGNhbiBza2lwIGluLWxvb3AgZmlsdGVyaW5nLCBpbiBjYXNlIG9mIGNyb3BwaW5nLgotICAvLwotICAvLyAnU2ltcGxlJyBmaWx0ZXIgcmVhZHMgdHdvIGx1bWEgc2FtcGxlcyBvdXRzaWRlIG9mIHRoZSBtYWNyb2Jsb2NrIGFuZAotICAvLyBhbmQgZmlsdGVycyBvbmUuIEl0IGRvZXNuJ3QgZmlsdGVyIHRoZSBjaHJvbWEgc2FtcGxlcy4gSGVuY2UsIHdlIGNhbgotICAvLyBhdm9pZCBkb2luZyB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcgYmVmb3JlIGNyb3BfdG9wL2Nyb3BfbGVmdCBwb3NpdGlvbi4KLSAgLy8gRm9yIHRoZSAnQ29tcGxleCcgZmlsdGVyLCAzIHNhbXBsZXMgYXJlIHJlYWQgYW5kIHVwIHRvIDMgYXJlIGZpbHRlcmVkLgotICAvLyBNZWFuczogdGhlcmUncyBhIGRlcGVuZGVuY3kgY2hhaW4gdGhhdCBnb2VzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZQotICAvLyB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBpY3R1cmUgKE1CICMwKS4gV2UgbXVzdCBmaWx0ZXIgYWxsIHRoZSBwcmV2aW91cwotICAvLyBtYWNyb2Jsb2Nrcy4KLSAgLy8gVE9ETyhza2FsKTogYWRkIGFuICdhcHByb3hpbWF0ZV9kZWNvZGluZycgb3B0aW9uLCB0aGF0IHdvbid0IHByb2R1Y2UKLSAgLy8gYSAxOjEgYml0LWV4YWN0bmVzcyBmb3IgY29tcGxleCBmaWx0ZXJpbmc/Ci0gIHsKLSAgICBjb25zdCBpbnQgZXh0cmFfcGl4ZWxzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107Ci0gICAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID09IDIpIHsKLSAgICAgIC8vIEZvciBjb21wbGV4IGZpbHRlciwgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZGVwZW5kZW5jeSBjaGFpbi4KLSAgICAgIGRlYy0+dGxfbWJfeF8gPSAwOwotICAgICAgZGVjLT50bF9tYl95XyA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEZvciBzaW1wbGUgZmlsdGVyLCB3ZSBjYW4gZmlsdGVyIG9ubHkgdGhlIGNyb3BwZWQgcmVnaW9uLgotICAgICAgLy8gV2UgaW5jbHVkZSAnZXh0cmFfcGl4ZWxzJyBvbiB0aGUgb3RoZXIgc2lkZSBvZiB0aGUgYm91bmRhcnksIHNpbmNlCi0gICAgICAvLyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsIGZpbHRlcmluZyBvZiB0aGUgcHJldmlvdXMgbWFjcm9ibG9jayBjYW4KLSAgICAgIC8vIG1vZGlmeSBzb21lIGFidXR0aW5nIHBpeGVscy4KLSAgICAgIGRlYy0+dGxfbWJfeF8gPSAoaW8tPmNyb3BfbGVmdCAtIGV4dHJhX3BpeGVscykgPj4gNDsKLSAgICAgIGRlYy0+dGxfbWJfeV8gPSAoaW8tPmNyb3BfdG9wIC0gZXh0cmFfcGl4ZWxzKSA+PiA0OwotICAgICAgaWYgKGRlYy0+dGxfbWJfeF8gPCAwKSBkZWMtPnRsX21iX3hfID0gMDsKLSAgICAgIGlmIChkZWMtPnRsX21iX3lfIDwgMCkgZGVjLT50bF9tYl95XyA9IDA7Ci0gICAgfQotICAgIC8vIFdlIG5lZWQgc29tZSAnZXh0cmEnIHBpeGVscyBvbiB0aGUgcmlnaHQvYm90dG9tLgotICAgIGRlYy0+YnJfbWJfeV8gPSAoaW8tPmNyb3BfYm90dG9tICsgMTUgKyBleHRyYV9waXhlbHMpID4+IDQ7Ci0gICAgZGVjLT5icl9tYl94XyA9IChpby0+Y3JvcF9yaWdodCArIDE1ICsgZXh0cmFfcGl4ZWxzKSA+PiA0OwotICAgIGlmIChkZWMtPmJyX21iX3hfID4gZGVjLT5tYl93XykgewotICAgICAgZGVjLT5icl9tYl94XyA9IGRlYy0+bWJfd187Ci0gICAgfQotICAgIGlmIChkZWMtPmJyX21iX3lfID4gZGVjLT5tYl9oXykgewotICAgICAgZGVjLT5icl9tYl95XyA9IGRlYy0+bWJfaF87Ci0gICAgfQotICB9Ci0gIFByZWNvbXB1dGVGaWx0ZXJTdHJlbmd0aHMoZGVjKTsKLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Ci19Ci0KLWludCBWUDhFeGl0Q3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgaW50IG9rID0gMTsKLSAgaWYgKGRlYy0+dXNlX3RocmVhZHNfKSB7Ci0gICAgb2sgPSBXZWJQV29ya2VyU3luYygmZGVjLT53b3JrZXJfKTsKLSAgfQotCi0gIGlmIChpby0+dGVhcmRvd24pIHsKLSAgICBpby0+dGVhcmRvd24oaW8pOwotICB9Ci0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZvciBtdWx0aS10aHJlYWRlZCBkZWNvZGluZyB3ZSBuZWVkIHRvIHVzZSAzIHJvd3Mgb2YgMTYgcGl4ZWxzIGFzIGRlbGF5IGxpbmUuCi0vLwotLy8gUmVhc29uIGlzOiB0aGUgZGVibG9ja2luZyBmaWx0ZXIgY2Fubm90IGRlYmxvY2sgdGhlIGJvdHRvbSBob3Jpem9udGFsIGVkZ2VzCi0vLyBpbW1lZGlhdGVseSwgYW5kIG5lZWRzIHRvIHdhaXQgZm9yIGZpcnN0IGZldyByb3dzIG9mIHRoZSBuZXh0IG1hY3JvYmxvY2sgdG8KLS8vIGJlIGRlY29kZWQuIEhlbmNlLCBkZWJsb2NraW5nIGlzIGxhZ2dpbmcgYmVoaW5kIGJ5IDQgb3IgOCBwaXhlbHMgKGRlcGVuZGluZwotLy8gb24gc3RyZW5ndGgpLgotLy8gV2l0aCB0d28gdGhyZWFkcywgdGhlIHZlcnRpY2FsIHBvc2l0aW9ucyBvZiB0aGUgcm93cyBiZWluZyBkZWNvZGVkIGFyZToKLS8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVs0OC4uNjNdWzY0Li43OV1bLi4uCi0vLyBEZWJsb2NrOiAgICAgICAgIFsgMC4uMTFdWzEyLi4yN11bMjguLjQzXVs0NC4uNTldWy4uLgotLy8gSWYgd2UgdXNlIHR3byB0aHJlYWRzIGFuZCB0d28gY2FjaGVzIG9mIDE2IHBpeGVscywgdGhlIHNlcXVlbmNlIHdvdWxkIGJlOgotLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTUhIV1bMTYuLjMxXVsgMC4uMTVdWy4uLgotLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjchIV1bLTQuLjExXVsxMi4uMjddWy4uLgotLy8gVGhlIHByb2JsZW0gb2NjdXJzIGR1cmluZyByb3cgWzEyLi4xNSEhXSB0aGF0IGJvdGggdGhlIGRlY29kaW5nIGFuZAotLy8gZGVibG9ja2luZyB0aHJlYWRzIGFyZSB3cml0aW5nIHNpbXVsdGFuZW91c2x5LgotLy8gV2l0aCAzIGNhY2hlIGxpbmVzLCBvbmUgZ2V0IGEgc2FmZSB3cml0ZSBwYXR0ZXJuOgotLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWyAwLi4xNV1bMTYuLjMxXVszMi4uNDddWzAuLgotLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjddWzI4Li40M11bLTQuLjExXVsxMi4uMjddWzI4Li4uCi0vLyBOb3RlIHRoYXQgbXVsdGktdGhyZWFkZWQgb3V0cHV0IF93aXRob3V0XyBkZWJsb2NraW5nIGNhbiBtYWtlIHVzZSBvZiB0d28KLS8vIGNhY2hlIGxpbmVzIG9mIDE2IHBpeGVscyBvbmx5LCBzaW5jZSB0aGVyZSdzIG5vIGxhZ2dpbmcgYmVoaW5kLiBUaGUgZGVjb2RpbmcKLS8vIGFuZCBvdXRwdXQgcHJvY2VzcyBoYXZlIG5vbi1jb25jdXJyZW50IHdyaXRpbmc6Ci0vLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWyAwLi4xNV1bMTYuLjMxXVsuLi4KLS8vIGlvLT5wdXQ6ICAgICAgICAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTVdWy4uLgotCi0jZGVmaW5lIE1UX0NBQ0hFX0xJTkVTIDMKLSNkZWZpbmUgU1RfQ0FDSEVfTElORVMgMSAgIC8vIDEgY2FjaGUgcm93IG9ubHkgZm9yIHNpbmdsZS10aHJlYWRlZCBjYXNlCi0KLS8vIEluaXRpYWxpemUgbXVsdGkvc2luZ2xlLXRocmVhZCB3b3JrZXIKLXN0YXRpYyBpbnQgSW5pdFRocmVhZENvbnRleHQoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGRlYy0+Y2FjaGVfaWRfID0gMDsKLSAgaWYgKGRlYy0+dXNlX3RocmVhZHNfKSB7Ci0gICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmRlYy0+d29ya2VyXzsKLSAgICBpZiAoIVdlYlBXb3JrZXJSZXNldCh3b3JrZXIpKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCi0gICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCBpbml0aWFsaXphdGlvbiBmYWlsZWQuIik7Ci0gICAgfQotICAgIHdvcmtlci0+ZGF0YTEgPSBkZWM7Ci0gICAgd29ya2VyLT5kYXRhMiA9ICh2b2lkKikmZGVjLT50aHJlYWRfY3R4Xy5pb187Ci0gICAgd29ya2VyLT5ob29rID0gKFdlYlBXb3JrZXJIb29rKUZpbmlzaFJvdzsKLSAgICBkZWMtPm51bV9jYWNoZXNfID0KLSAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApID8gTVRfQ0FDSEVfTElORVMgOiBNVF9DQUNIRV9MSU5FUyAtIDE7Ci0gIH0gZWxzZSB7Ci0gICAgZGVjLT5udW1fY2FjaGVzXyA9IFNUX0NBQ0hFX0xJTkVTOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0jdW5kZWYgTVRfQ0FDSEVfTElORVMKLSN1bmRlZiBTVF9DQUNIRV9MSU5FUwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVtb3J5IHNldHVwCi0KLXN0YXRpYyBpbnQgQWxsb2NhdGVNZW1vcnkoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGNvbnN0IGludCBudW1fY2FjaGVzID0gZGVjLT5udW1fY2FjaGVzXzsKLSAgY29uc3QgaW50IG1iX3cgPSBkZWMtPm1iX3dfOwotICAvLyBOb3RlOiB3ZSB1c2UgJ3NpemVfdCcgd2hlbiB0aGVyZSdzIG5vIG92ZXJmbG93IHJpc2ssIHVpbnQ2NF90IG90aGVyd2lzZS4KLSAgY29uc3Qgc2l6ZV90IGludHJhX3ByZWRfbW9kZV9zaXplID0gNCAqIG1iX3cgKiBzaXplb2YodWludDhfdCk7Ci0gIGNvbnN0IHNpemVfdCB0b3Bfc2l6ZSA9ICgxNiArIDggKyA4KSAqIG1iX3c7Ci0gIGNvbnN0IHNpemVfdCBtYl9pbmZvX3NpemUgPSAobWJfdyArIDEpICogc2l6ZW9mKFZQOE1CKTsKLSAgY29uc3Qgc2l6ZV90IGZfaW5mb19zaXplID0KLSAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApID8KLSAgICAgICAgICBtYl93ICogKGRlYy0+dXNlX3RocmVhZHNfID8gMiA6IDEpICogc2l6ZW9mKFZQOEZJbmZvKQotICAgICAgICA6IDA7Ci0gIGNvbnN0IHNpemVfdCB5dXZfc2l6ZSA9IFlVVl9TSVpFICogc2l6ZW9mKCpkZWMtPnl1dl9iXyk7Ci0gIGNvbnN0IHNpemVfdCBjb2VmZnNfc2l6ZSA9IDM4NCAqIHNpemVvZigqZGVjLT5jb2VmZnNfKTsKLSAgY29uc3Qgc2l6ZV90IGNhY2hlX2hlaWdodCA9ICgxNiAqIG51bV9jYWNoZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dKSAqIDMgLyAyOwotICBjb25zdCBzaXplX3QgY2FjaGVfc2l6ZSA9IHRvcF9zaXplICogY2FjaGVfaGVpZ2h0OwotICAvLyBhbHBoYV9zaXplIGlzIHRoZSBvbmx5IG9uZSB0aGF0IHNjYWxlcyBhcyB3aWR0aCB4IGhlaWdodC4KLSAgY29uc3QgdWludDY0X3QgYWxwaGFfc2l6ZSA9IChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwpID8KLSAgICAgICh1aW50NjRfdClkZWMtPnBpY19oZHJfLndpZHRoXyAqIGRlYy0+cGljX2hkcl8uaGVpZ2h0XyA6IDBVTEw7Ci0gIGNvbnN0IHVpbnQ2NF90IG5lZWRlZCA9ICh1aW50NjRfdClpbnRyYV9wcmVkX21vZGVfc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyB0b3Bfc2l6ZSArIG1iX2luZm9fc2l6ZSArIGZfaW5mb19zaXplCi0gICAgICAgICAgICAgICAgICAgICAgICArIHl1dl9zaXplICsgY29lZmZzX3NpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVfc2l6ZSArIGFscGhhX3NpemUgKyBBTElHTl9NQVNLOwotICB1aW50OF90KiBtZW07Ci0KLSAgaWYgKG5lZWRlZCAhPSAoc2l6ZV90KW5lZWRlZCkgcmV0dXJuIDA7ICAvLyBjaGVjayBmb3Igb3ZlcmZsb3cKLSAgaWYgKG5lZWRlZCA+IGRlYy0+bWVtX3NpemVfKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYy0+bWVtXyk7Ci0gICAgZGVjLT5tZW1fc2l6ZV8gPSAwOwotICAgIGRlYy0+bWVtXyA9IFdlYlBTYWZlTWFsbG9jKG5lZWRlZCwgc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICBpZiAoZGVjLT5tZW1fID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAibm8gbWVtb3J5IGR1cmluZyBmcmFtZSBpbml0aWFsaXphdGlvbi4iKTsKLSAgICB9Ci0gICAgLy8gZG93bi1jYXN0IGlzIG9rLCB0aGFua3MgdG8gV2ViUFNhZmVBbGxvYygpIGFib3ZlLgotICAgIGRlYy0+bWVtX3NpemVfID0gKHNpemVfdCluZWVkZWQ7Ci0gIH0KLQotICBtZW0gPSAodWludDhfdCopZGVjLT5tZW1fOwotICBkZWMtPmludHJhX3RfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IGludHJhX3ByZWRfbW9kZV9zaXplOwotCi0gIGRlYy0+eV90XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSAxNiAqIG1iX3c7Ci0gIGRlYy0+dV90XyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSA4ICogbWJfdzsKLSAgZGVjLT52X3RfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDggKiBtYl93OwotCi0gIGRlYy0+bWJfaW5mb18gPSAoKFZQOE1CKiltZW0pICsgMTsKLSAgbWVtICs9IG1iX2luZm9fc2l6ZTsKLQotICBkZWMtPmZfaW5mb18gPSBmX2luZm9fc2l6ZSA/IChWUDhGSW5mbyopbWVtIDogTlVMTDsKLSAgbWVtICs9IGZfaW5mb19zaXplOwotICBkZWMtPnRocmVhZF9jdHhfLmlkXyA9IDA7Ci0gIGRlYy0+dGhyZWFkX2N0eF8uZl9pbmZvXyA9IGRlYy0+Zl9pbmZvXzsKLSAgaWYgKGRlYy0+dXNlX3RocmVhZHNfKSB7Ci0gICAgLy8gc2Vjb25kYXJ5IGNhY2hlIGxpbmUuIFRoZSBkZWJsb2NraW5nIHByb2Nlc3MgbmVlZCB0byBtYWtlIHVzZSBvZiB0aGUKLSAgICAvLyBmaWx0ZXJpbmcgc3RyZW5ndGggZnJvbSBwcmV2aW91cyBtYWNyb2Jsb2NrIHJvdywgd2hpbGUgdGhlIG5ldyBvbmVzCi0gICAgLy8gYXJlIGJlaW5nIGRlY29kZWQgaW4gcGFyYWxsZWwuIFdlJ2xsIGp1c3Qgc3dhcCB0aGUgcG9pbnRlcnMuCi0gICAgZGVjLT50aHJlYWRfY3R4Xy5mX2luZm9fICs9IG1iX3c7Ci0gIH0KLQotICBtZW0gPSAodWludDhfdCopKCh1aW50cHRyX3QpKG1lbSArIEFMSUdOX01BU0spICYgfkFMSUdOX01BU0spOwotICBTQl9EQ0hFQ0soKHl1dl9zaXplICYgQUxJR05fTUFTSykgPT0gMCk7Ci0gIGRlYy0+eXV2X2JfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IHl1dl9zaXplOwotCi0gIGRlYy0+Y29lZmZzXyA9IChpbnQxNl90KiltZW07Ci0gIG1lbSArPSBjb2VmZnNfc2l6ZTsKLQotICBkZWMtPmNhY2hlX3lfc3RyaWRlXyA9IDE2ICogbWJfdzsKLSAgZGVjLT5jYWNoZV91dl9zdHJpZGVfID0gOCAqIG1iX3c7Ci0gIHsKLSAgICBjb25zdCBpbnQgZXh0cmFfcm93cyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOwotICAgIGNvbnN0IGludCBleHRyYV95ID0gZXh0cmFfcm93cyAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICAgIGNvbnN0IGludCBleHRyYV91diA9IChleHRyYV9yb3dzIC8gMikgKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gICAgZGVjLT5jYWNoZV95XyA9ICgodWludDhfdCopbWVtKSArIGV4dHJhX3k7Ci0gICAgZGVjLT5jYWNoZV91XyA9IGRlYy0+Y2FjaGVfeV8KLSAgICAgICAgICAgICAgICAgICsgMTYgKiBudW1fY2FjaGVzICogZGVjLT5jYWNoZV95X3N0cmlkZV8gKyBleHRyYV91djsKLSAgICBkZWMtPmNhY2hlX3ZfID0gZGVjLT5jYWNoZV91XwotICAgICAgICAgICAgICAgICAgKyA4ICogbnVtX2NhY2hlcyAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXyArIGV4dHJhX3V2OwotICAgIGRlYy0+Y2FjaGVfaWRfID0gMDsKLSAgfQotICBtZW0gKz0gY2FjaGVfc2l6ZTsKLQotICAvLyBhbHBoYSBwbGFuZQotICBkZWMtPmFscGhhX3BsYW5lXyA9IGFscGhhX3NpemUgPyAodWludDhfdCopbWVtIDogTlVMTDsKLSAgbWVtICs9IGFscGhhX3NpemU7Ci0gIFNCX0RDSEVDSyhtZW0gPD0gKHVpbnQ4X3QqKWRlYy0+bWVtXyArIGRlYy0+bWVtX3NpemVfKTsKLQotICAvLyBub3RlOiBsZWZ0LWluZm8gaXMgaW5pdGlhbGl6ZWQgb25jZSBmb3IgYWxsLgotICBTYk1lbW9yeVNldChkZWMtPm1iX2luZm9fIC0gMSwgMCwgbWJfaW5mb19zaXplKTsKLQotICAvLyBpbml0aWFsaXplIHRvcAotICBTYk1lbW9yeVNldChkZWMtPmludHJhX3RfLCBCX0RDX1BSRUQsIGludHJhX3ByZWRfbW9kZV9zaXplKTsKLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgSW5pdElvKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7Ci0gIC8vIHByZXBhcmUgJ2lvJwotICBpby0+bWJfeSA9IDA7Ci0gIGlvLT55ID0gZGVjLT5jYWNoZV95XzsKLSAgaW8tPnUgPSBkZWMtPmNhY2hlX3VfOwotICBpby0+diA9IGRlYy0+Y2FjaGVfdl87Ci0gIGlvLT55X3N0cmlkZSA9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICBpby0+dXZfc3RyaWRlID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOwotICBpby0+YSA9IE5VTEw7Ci19Ci0KLWludCBWUDhJbml0RnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKLSAgaWYgKCFJbml0VGhyZWFkQ29udGV4dChkZWMpKSByZXR1cm4gMDsgIC8vIGNhbGwgZmlyc3QuIFNldHMgZGVjLT5udW1fY2FjaGVzXy4KLSAgaWYgKCFBbGxvY2F0ZU1lbW9yeShkZWMpKSByZXR1cm4gMDsKLSAgSW5pdElvKGRlYywgaW8pOwotICBWUDhEc3BJbml0KCk7ICAvLyBJbml0IGNyaXRpY2FsIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBsb29rLXVwIHRhYmxlcy4KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIHJlY29uc3RydWN0aW9uIGZ1bmN0aW9uLgotCi1zdGF0aWMgY29uc3QgaW50IGtTY2FuWzE2XSA9IHsKLSAgMCArICAwICogQlBTLCAgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMsCi0gIDAgKyAgNCAqIEJQUywgIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTLAotICAwICsgIDggKiBCUFMsICA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUywKLSAgMCArIDEyICogQlBTLCAgNCArIDEyICogQlBTLCA4ICsgMTIgKiBCUFMsIDEyICsgMTIgKiBCUFMKLX07Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQ2hlY2tNb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IG1vZGUpIHsKLSAgaWYgKG1vZGUgPT0gQl9EQ19QUkVEKSB7Ci0gICAgaWYgKGRlYy0+bWJfeF8gPT0gMCkgewotICAgICAgcmV0dXJuIChkZWMtPm1iX3lfID09IDApID8gQl9EQ19QUkVEX05PVE9QTEVGVCA6IEJfRENfUFJFRF9OT0xFRlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoZGVjLT5tYl95XyA9PSAwKSA/IEJfRENfUFJFRF9OT1RPUCA6IEJfRENfUFJFRDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1vZGU7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHkzMmIodWludDhfdCogZHN0LCB1aW50OF90KiBzcmMpIHsKLSAgKih1aW50MzJfdCopZHN0ID0gKih1aW50MzJfdCopc3JjOwotfQotCi12b2lkIFZQOFJlY29uc3RydWN0QmxvY2soVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGludCBqOwotICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGRlYy0+eXV2X2JfICsgWV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gZGVjLT55dXZfYl8gKyBVX09GRjsKLSAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBkZWMtPnl1dl9iXyArIFZfT0ZGOwotCi0gIC8vIFJvdGF0ZSBpbiB0aGUgbGVmdCBzYW1wbGVzIGZyb20gcHJldmlvdXNseSBkZWNvZGVkIGJsb2NrLiBXZSBtb3ZlIGZvdXIKLSAgLy8gcGl4ZWxzIGF0IGEgdGltZSBmb3IgYWxpZ25tZW50IHJlYXNvbiwgYW5kIGJlY2F1c2Ugb2YgaW4tbG9vcCBmaWx0ZXIuCi0gIGlmIChkZWMtPm1iX3hfID4gMCkgewotICAgIGZvciAoaiA9IC0xOyBqIDwgMTY7ICsraikgewotICAgICAgQ29weTMyYigmeV9kc3RbaiAqIEJQUyAtIDRdLCAmeV9kc3RbaiAqIEJQUyArIDEyXSk7Ci0gICAgfQotICAgIGZvciAoaiA9IC0xOyBqIDwgODsgKytqKSB7Ci0gICAgICBDb3B5MzJiKCZ1X2RzdFtqICogQlBTIC0gNF0sICZ1X2RzdFtqICogQlBTICsgNF0pOwotICAgICAgQ29weTMyYigmdl9kc3RbaiAqIEJQUyAtIDRdLCAmdl9kc3RbaiAqIEJQUyArIDRdKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICAgIHlfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKLSAgICB9Ci0gICAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgewotICAgICAgdV9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OwotICAgICAgdl9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OwotICAgIH0KLSAgICAvLyBJbml0IHRvcC1sZWZ0IHNhbXBsZSBvbiBsZWZ0IGNvbHVtbiB0b28KLSAgICBpZiAoZGVjLT5tYl95XyA+IDApIHsKLSAgICAgIHlfZHN0Wy0xIC0gQlBTXSA9IHVfZHN0Wy0xIC0gQlBTXSA9IHZfZHN0Wy0xIC0gQlBTXSA9IDEyOTsKLSAgICB9Ci0gIH0KLSAgewotICAgIC8vIGJyaW5nIHRvcCBzYW1wbGVzIGludG8gdGhlIGNhY2hlCi0gICAgdWludDhfdCogY29uc3QgdG9wX3kgPSBkZWMtPnlfdF8gKyBkZWMtPm1iX3hfICogMTY7Ci0gICAgdWludDhfdCogY29uc3QgdG9wX3UgPSBkZWMtPnVfdF8gKyBkZWMtPm1iX3hfICogODsKLSAgICB1aW50OF90KiBjb25zdCB0b3BfdiA9IGRlYy0+dl90XyArIGRlYy0+bWJfeF8gKiA4OwotICAgIGNvbnN0IGludDE2X3QqIGNvZWZmcyA9IGRlYy0+Y29lZmZzXzsKLSAgICBpbnQgbjsKLQotICAgIGlmIChkZWMtPm1iX3lfID4gMCkgewotICAgICAgU2JNZW1vcnlDb3B5KHlfZHN0IC0gQlBTLCB0b3BfeSwgMTYpOwotICAgICAgU2JNZW1vcnlDb3B5KHVfZHN0IC0gQlBTLCB0b3BfdSwgOCk7Ci0gICAgICBTYk1lbW9yeUNvcHkodl9kc3QgLSBCUFMsIHRvcF92LCA4KTsKLSAgICB9IGVsc2UgaWYgKGRlYy0+bWJfeF8gPT0gMCkgewotICAgICAgLy8gd2Ugb25seSBuZWVkIHRvIGRvIHRoaXMgaW5pdCBvbmNlIGF0IGJsb2NrICgwLDApLgotICAgICAgLy8gQWZ0ZXJ3YXJkLCBpdCByZW1haW5zIHZhbGlkIGZvciB0aGUgd2hvbGUgdG9wbW9zdCByb3cuCi0gICAgICBTYk1lbW9yeVNldCh5X2RzdCAtIEJQUyAtIDEsIDEyNywgMTYgKyA0ICsgMSk7Ci0gICAgICBTYk1lbW9yeVNldCh1X2RzdCAtIEJQUyAtIDEsIDEyNywgOCArIDEpOwotICAgICAgU2JNZW1vcnlTZXQodl9kc3QgLSBCUFMgLSAxLCAxMjcsIDggKyAxKTsKLSAgICB9Ci0KLSAgICAvLyBwcmVkaWN0IGFuZCBhZGQgcmVzaWR1YWxzCi0KLSAgICBpZiAoZGVjLT5pc19pNHg0XykgeyAgIC8vIDR4NAotICAgICAgdWludDMyX3QqIGNvbnN0IHRvcF9yaWdodCA9ICh1aW50MzJfdCopKHlfZHN0IC0gQlBTICsgMTYpOwotCi0gICAgICBpZiAoZGVjLT5tYl95XyA+IDApIHsKLSAgICAgICAgaWYgKGRlYy0+bWJfeF8gPj0gZGVjLT5tYl93XyAtIDEpIHsgICAgLy8gb24gcmlnaHRtb3N0IGJvcmRlcgotICAgICAgICAgIHRvcF9yaWdodFswXSA9IHRvcF95WzE1XSAqIDB4MDEwMTAxMDF1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNiTWVtb3J5Q29weSh0b3BfcmlnaHQsIHRvcF95ICsgMTYsIHNpemVvZigqdG9wX3JpZ2h0KSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIHJlcGxpY2F0ZSB0aGUgdG9wLXJpZ2h0IHBpeGVscyBiZWxvdwotICAgICAgdG9wX3JpZ2h0W0JQU10gPSB0b3BfcmlnaHRbMiAqIEJQU10gPSB0b3BfcmlnaHRbMyAqIEJQU10gPSB0b3BfcmlnaHRbMF07Ci0KLSAgICAgIC8vIHByZWRpY3QgYW5kIGFkZCByZXNpZHVlcyBmb3IgYWxsIDR4NCBibG9ja3MgaW4gdHVybi4KLSAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbisrKSB7Ci0gICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHlfZHN0ICsga1NjYW5bbl07Ci0gICAgICAgIFZQOFByZWRMdW1hNFtkZWMtPmltb2Rlc19bbl1dKGRzdCk7Ci0gICAgICAgIGlmIChkZWMtPm5vbl96ZXJvX2FjXyAmICgxIDw8IG4pKSB7Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtKGNvZWZmcyArIG4gKiAxNiwgZHN0LCAwKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZWMtPm5vbl96ZXJvXyAmICgxIDw8IG4pKSB7ICAvLyBvbmx5IERDIGlzIHByZXNlbnQKLSAgICAgICAgICBWUDhUcmFuc2Zvcm1EQyhjb2VmZnMgKyBuICogMTYsIGRzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgeyAgICAvLyAxNngxNgotICAgICAgY29uc3QgaW50IHByZWRfZnVuYyA9IENoZWNrTW9kZShkZWMsIGRlYy0+aW1vZGVzX1swXSk7Ci0gICAgICBWUDhQcmVkTHVtYTE2W3ByZWRfZnVuY10oeV9kc3QpOwotICAgICAgaWYgKGRlYy0+bm9uX3plcm9fKSB7Ci0gICAgICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbisrKSB7Ci0gICAgICAgICAgdWludDhfdCogY29uc3QgZHN0ID0geV9kc3QgKyBrU2NhbltuXTsKLSAgICAgICAgICBpZiAoZGVjLT5ub25femVyb19hY18gJiAoMSA8PCBuKSkgewotICAgICAgICAgICAgVlA4VHJhbnNmb3JtKGNvZWZmcyArIG4gKiAxNiwgZHN0LCAwKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGRlYy0+bm9uX3plcm9fICYgKDEgPDwgbikpIHsgIC8vIG9ubHkgREMgaXMgcHJlc2VudAotICAgICAgICAgICAgVlA4VHJhbnNmb3JtREMoY29lZmZzICsgbiAqIDE2LCBkc3QpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICAvLyBDaHJvbWEKLSAgICAgIGNvbnN0IGludCBwcmVkX2Z1bmMgPSBDaGVja01vZGUoZGVjLCBkZWMtPnV2bW9kZV8pOwotICAgICAgVlA4UHJlZENocm9tYThbcHJlZF9mdW5jXSh1X2RzdCk7Ci0gICAgICBWUDhQcmVkQ2hyb21hOFtwcmVkX2Z1bmNdKHZfZHN0KTsKLQotICAgICAgaWYgKGRlYy0+bm9uX3plcm9fICYgMHgwZjAwMDApIHsgICAvLyBjaHJvbWEtVQotICAgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCB1X2NvZWZmcyA9IGRlYy0+Y29lZmZzXyArIDE2ICogMTY7Ci0gICAgICAgIGlmIChkZWMtPm5vbl96ZXJvX2FjXyAmIDB4MGYwMDAwKSB7Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtVVYodV9jb2VmZnMsIHVfZHN0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWUDhUcmFuc2Zvcm1EQ1VWKHVfY29lZmZzLCB1X2RzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChkZWMtPm5vbl96ZXJvXyAmIDB4ZjAwMDAwKSB7ICAgLy8gY2hyb21hLVYKLSAgICAgICAgY29uc3QgaW50MTZfdCogY29uc3Qgdl9jb2VmZnMgPSBkZWMtPmNvZWZmc18gKyAyMCAqIDE2OwotICAgICAgICBpZiAoZGVjLT5ub25femVyb19hY18gJiAweGYwMDAwMCkgewotICAgICAgICAgIFZQOFRyYW5zZm9ybVVWKHZfY29lZmZzLCB2X2RzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4VHJhbnNmb3JtRENVVih2X2NvZWZmcywgdl9kc3QpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0YXNoIGF3YXkgdG9wIHNhbXBsZXMgZm9yIG5leHQgYmxvY2sKLSAgICAgIGlmIChkZWMtPm1iX3lfIDwgZGVjLT5tYl9oXyAtIDEpIHsKLSAgICAgICAgU2JNZW1vcnlDb3B5KHRvcF95LCB5X2RzdCArIDE1ICogQlBTLCAxNik7Ci0gICAgICAgIFNiTWVtb3J5Q29weSh0b3BfdSwgdV9kc3QgKyAgNyAqIEJQUywgIDgpOwotICAgICAgICBTYk1lbW9yeUNvcHkodG9wX3YsIHZfZHN0ICsgIDcgKiBCUFMsICA4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gVHJhbnNmZXIgcmVjb25zdHJ1Y3RlZCBzYW1wbGVzIGZyb20geXV2X2JfIGNhY2hlIHRvIGZpbmFsIGRlc3RpbmF0aW9uLgotICB7Ci0gICAgY29uc3QgaW50IHlfb2Zmc2V0ID0gZGVjLT5jYWNoZV9pZF8gKiAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOwotICAgIGNvbnN0IGludCB1dl9vZmZzZXQgPSBkZWMtPmNhY2hlX2lkXyAqIDggKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV87Ci0gICAgdWludDhfdCogY29uc3QgeV9vdXQgPSBkZWMtPmNhY2hlX3lfICsgZGVjLT5tYl94XyAqIDE2ICsgeV9vZmZzZXQ7Ci0gICAgdWludDhfdCogY29uc3QgdV9vdXQgPSBkZWMtPmNhY2hlX3VfICsgZGVjLT5tYl94XyAqIDggKyB1dl9vZmZzZXQ7Ci0gICAgdWludDhfdCogY29uc3Qgdl9vdXQgPSBkZWMtPmNhY2hlX3ZfICsgZGVjLT5tYl94XyAqIDggKyB1dl9vZmZzZXQ7Ci0gICAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICAgIFNiTWVtb3J5Q29weSh5X291dCArIGogKiBkZWMtPmNhY2hlX3lfc3RyaWRlXywgeV9kc3QgKyBqICogQlBTLCAxNik7Ci0gICAgfQotICAgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKLSAgICAgIFNiTWVtb3J5Q29weSh1X291dCArIGogKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHVfZHN0ICsgaiAqIEJQUywgOCk7Ci0gICAgICBTYk1lbW9yeUNvcHkodl9vdXQgKyBqICogZGVjLT5jYWNoZV91dl9zdHJpZGVfLCB2X2RzdCArIGogKiBCUFMsIDgpOwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy9sYXllci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2xheWVyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNzA0MmYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2xheWVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gRW5oYW5jZW1lbnQgbGF5ZXIgKGZvciBZVVY0NDQvNDIyKQotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGkuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhEZWNvZGVMYXllcihWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgU0JfRENIRUNLKGRlYyk7Ci0gIFNCX0RDSEVDSyhkZWMtPmxheWVyX2RhdGFfc2l6ZV8gPiAwKTsKLSAgKHZvaWQpZGVjOwotCi0gIC8vIFRPRE86IGhhbmRsZSBlbmhhbmNlbWVudCBsYXllciBoZXJlLgotCi0gIHJldHVybiAxOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzYWUyOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3ODkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGkuaCIKLSNpbmNsdWRlICIuL3ZwOGxpLmgiCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF9yZWFkZXIuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQR2V0RGVjb2RlclZlcnNpb24odm9pZCkgewotICByZXR1cm4gKERFQ19NQUpfVkVSU0lPTiA8PCAxNikgfCAoREVDX01JTl9WRVJTSU9OIDw8IDgpIHwgREVDX1JFVl9WRVJTSU9OOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4RGVjb2RlcgotCi1zdGF0aWMgdm9pZCBTZXRPayhWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgZGVjLT5lcnJvcl9tc2dfID0gIk9LIjsKLX0KLQotaW50IFZQOEluaXRJb0ludGVybmFsKFZQOElvKiBjb25zdCBpbywgaW50IHZlcnNpb24pIHsKLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7Ci0gICAgcmV0dXJuIDA7ICAvLyBtaXNtYXRjaCBlcnJvcgotICB9Ci0gIGlmIChpbyAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlTZXQoaW8sIDAsIHNpemVvZigqaW8pKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotVlA4RGVjb2RlciogVlA4TmV3KHZvaWQpIHsKLSAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZGVjKSk7Ci0gIGlmIChkZWMgIT0gTlVMTCkgewotICAgIFNldE9rKGRlYyk7Ci0gICAgV2ViUFdvcmtlckluaXQoJmRlYy0+d29ya2VyXyk7Ci0gICAgZGVjLT5yZWFkeV8gPSAwOwotICAgIGRlYy0+bnVtX3BhcnRzXyA9IDE7Ci0gIH0KLSAgcmV0dXJuIGRlYzsKLX0KLQotVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmICghZGVjKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOwotICByZXR1cm4gZGVjLT5zdGF0dXNfOwotfQotCi1jb25zdCBjaGFyKiBWUDhTdGF0dXNNZXNzYWdlKFZQOERlY29kZXIqIGNvbnN0IGRlYykgewotICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAibm8gb2JqZWN0IjsKLSAgaWYgKCFkZWMtPmVycm9yX21zZ18pIHJldHVybiAiT0siOwotICByZXR1cm4gZGVjLT5lcnJvcl9tc2dfOwotfQotCi12b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYyAhPSBOVUxMKSB7Ci0gICAgVlA4Q2xlYXIoZGVjKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjKTsKLSAgfQotfQotCi1pbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZykgewotICAvLyBUT0RPIFRoaXMgY2hlY2sgd291bGQgYmUgdW5uZWNlc3NhcnkgaWYgYWxwaGEgZGVjb21wcmVzc2lvbiB3YXMgc2VwYXJhdGVkCi0gIC8vIGZyb20gVlA4UHJvY2Vzc1Jvdy9GaW5pc2hSb3cuIFRoaXMgYXZvaWRzIHNldHRpbmcgJ2RlYy0+c3RhdHVzXycgdG8KLSAgLy8gc29tZXRoaW5nIG90aGVyIHRoYW4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1Igb24gYWxwaGEgZGVjb21wcmVzc2lvbgotICAvLyBmYWlsdXJlLgotICBpZiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfT0spIHsKLSAgICBkZWMtPnN0YXR1c18gPSBlcnJvcjsKLSAgICBkZWMtPmVycm9yX21zZ18gPSBtc2c7Ci0gICAgZGVjLT5yZWFkeV8gPSAwOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgVlA4Q2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgewotICByZXR1cm4gKGRhdGFfc2l6ZSA+PSAzICYmCi0gICAgICAgICAgZGF0YVswXSA9PSAweDlkICYmIGRhdGFbMV0gPT0gMHgwMSAmJiBkYXRhWzJdID09IDB4MmEpOwotfQotCi1pbnQgVlA4R2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KSB7Ci0gIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgLy8gbm90IGVub3VnaCBkYXRhCi0gIH0KLSAgLy8gY2hlY2sgc2lnbmF0dXJlCi0gIGlmICghVlA4Q2hlY2tTaWduYXR1cmUoZGF0YSArIDMsIGRhdGFfc2l6ZSAtIDMpKSB7Ci0gICAgcmV0dXJuIDA7ICAgICAgICAgLy8gV3Jvbmcgc2lnbmF0dXJlLgotICB9IGVsc2UgewotICAgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNik7Ci0gICAgY29uc3QgaW50IGtleV9mcmFtZSA9ICEoYml0cyAmIDEpOwotICAgIGNvbnN0IGludCB3ID0gKChkYXRhWzddIDw8IDgpIHwgZGF0YVs2XSkgJiAweDNmZmY7Ci0gICAgY29uc3QgaW50IGggPSAoKGRhdGFbOV0gPDwgOCkgfCBkYXRhWzhdKSAmIDB4M2ZmZjsKLQotICAgIGlmICgha2V5X2ZyYW1lKSB7ICAgLy8gTm90IGEga2V5ZnJhbWUuCi0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBpZiAoKChiaXRzID4+IDEpICYgNykgPiAzKSB7Ci0gICAgICByZXR1cm4gMDsgICAgICAgICAvLyB1bmtub3duIHByb2ZpbGUKLSAgICB9Ci0gICAgaWYgKCEoKGJpdHMgPj4gNCkgJiAxKSkgewotICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gZmlyc3QgZnJhbWUgaXMgaW52aXNpYmxlIQotICAgIH0KLSAgICBpZiAoKChiaXRzID4+IDUpKSA+PSBjaHVua19zaXplKSB7ICAvLyBwYXJ0aXRpb25fbGVuZ3RoCi0gICAgICByZXR1cm4gMDsgICAgICAgICAvLyBpbmNvbnNpc3RlbnQgc2l6ZSBpbmZvcm1hdGlvbi4KLSAgICB9Ci0KLSAgICBpZiAod2lkdGgpIHsKLSAgICAgICp3aWR0aCA9IHc7Ci0gICAgfQotICAgIGlmIChoZWlnaHQpIHsKLSAgICAgICpoZWlnaHQgPSBoOwotICAgIH0KLQotICAgIHJldHVybiAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIZWFkZXIgcGFyc2luZwotCi1zdGF0aWMgdm9pZCBSZXNldFNlZ21lbnRIZWFkZXIoVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyKSB7Ci0gIFNCX0RDSEVDSyhoZHIgIT0gTlVMTCk7Ci0gIGhkci0+dXNlX3NlZ21lbnRfID0gMDsKLSAgaGRyLT51cGRhdGVfbWFwXyA9IDA7Ci0gIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gMTsKLSAgU2JNZW1vcnlTZXQoaGRyLT5xdWFudGl6ZXJfLCAwLCBzaXplb2YoaGRyLT5xdWFudGl6ZXJfKSk7Ci0gIFNiTWVtb3J5U2V0KGhkci0+ZmlsdGVyX3N0cmVuZ3RoXywgMCwgc2l6ZW9mKGhkci0+ZmlsdGVyX3N0cmVuZ3RoXykpOwotfQotCi0vLyBQYXJhZ3JhcGggOS4zCi1zdGF0aWMgaW50IFBhcnNlU2VnbWVudEhlYWRlcihWUDhCaXRSZWFkZXIqIGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4U2VnbWVudEhlYWRlciogaGRyLCBWUDhQcm9iYSogcHJvYmEpIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soaGRyICE9IE5VTEwpOwotICBoZHItPnVzZV9zZWdtZW50XyA9IFZQOEdldChicik7Ci0gIGlmIChoZHItPnVzZV9zZWdtZW50XykgewotICAgIGhkci0+dXBkYXRlX21hcF8gPSBWUDhHZXQoYnIpOwotICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIGRhdGEKLSAgICAgIGludCBzOwotICAgICAgaGRyLT5hYnNvbHV0ZV9kZWx0YV8gPSBWUDhHZXQoYnIpOwotICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIGhkci0+cXVhbnRpemVyX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRTaWduZWRWYWx1ZShiciwgNykgOiAwOwotICAgICAgfQotICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIGhkci0+ZmlsdGVyX3N0cmVuZ3RoX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRTaWduZWRWYWx1ZShiciwgNikgOiAwOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoaGRyLT51cGRhdGVfbWFwXykgewotICAgICAgaW50IHM7Ci0gICAgICBmb3IgKHMgPSAwOyBzIDwgTUJfRkVBVFVSRV9UUkVFX1BST0JTOyArK3MpIHsKLSAgICAgICAgcHJvYmEtPnNlZ21lbnRzX1tzXSA9IFZQOEdldChicikgPyBWUDhHZXRWYWx1ZShiciwgOCkgOiAyNTV1OwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBoZHItPnVwZGF0ZV9tYXBfID0gMDsKLSAgfQotICByZXR1cm4gIWJyLT5lb2ZfOwotfQotCi0vLyBQYXJhZ3JhcGggOS41Ci0vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVlA4X1NUQVRVU19TVVNQRU5ERUQgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlCi0vLyBuZWNlc3NhcnkgZGF0YSBpbiAnYnVmJy4KLS8vIFRoaXMgY2FzZSBpcyBub3QgbmVjZXNzYXJpbHkgYW4gZXJyb3IgKGZvciBpbmNyZW1lbnRhbCBkZWNvZGluZykuCi0vLyBTdGlsbCwgbm8gYml0cmVhZGVyIGlzIGV2ZXIgaW5pdGlhbGl6ZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byByZWFkCi0vLyB1bmF2YWlsYWJsZSBtZW1vcnkuCi0vLyBJZiB3ZSBkb24ndCBldmVuIGhhdmUgdGhlIHBhcnRpdGlvbnMnIHNpemVzLCB0aGFuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBCi0vLyBpcyByZXR1cm5lZCwgYW5kIHRoaXMgaXMgYW4gdW5yZWNvdmVyYWJsZSBlcnJvci4KLS8vIElmIHRoZSBwYXJ0aXRpb25zIHdlcmUgcG9zaXRpb25lZCBvaywgVlA4X1NUQVRVU19PSyBpcyByZXR1cm5lZC4KLXN0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlUGFydGl0aW9ucyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLCBzaXplX3Qgc2l6ZSkgewotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBjb25zdCB1aW50OF90KiBzeiA9IGJ1ZjsKLSAgY29uc3QgdWludDhfdCogYnVmX2VuZCA9IGJ1ZiArIHNpemU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHBhcnRfc3RhcnQ7Ci0gIGludCBsYXN0X3BhcnQ7Ci0gIGludCBwOwotCi0gIGRlYy0+bnVtX3BhcnRzXyA9IDEgPDwgVlA4R2V0VmFsdWUoYnIsIDIpOwotICBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c18gLSAxOwotICBwYXJ0X3N0YXJ0ID0gYnVmICsgbGFzdF9wYXJ0ICogMzsKLSAgaWYgKGJ1Zl9lbmQgPCBwYXJ0X3N0YXJ0KSB7Ci0gICAgLy8gd2UgY2FuJ3QgZXZlbiByZWFkIHRoZSBzaXplcyB3aXRoIHN6W10hIFRoYXQncyBhIGZhaWx1cmUuCi0gICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwotICB9Ci0gIGZvciAocCA9IDA7IHAgPCBsYXN0X3BhcnQ7ICsrcCkgewotICAgIGNvbnN0IHVpbnQzMl90IHBzaXplID0gc3pbMF0gfCAoc3pbMV0gPDwgOCkgfCAoc3pbMl0gPDwgMTYpOwotICAgIGNvbnN0IHVpbnQ4X3QqIHBhcnRfZW5kID0gcGFydF9zdGFydCArIHBzaXplOwotICAgIGlmIChwYXJ0X2VuZCA+IGJ1Zl9lbmQpIHBhcnRfZW5kID0gYnVmX2VuZDsKLSAgICBWUDhJbml0Qml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgcGFydF9zdGFydCwgcGFydF9lbmQpOwotICAgIHBhcnRfc3RhcnQgPSBwYXJ0X2VuZDsKLSAgICBzeiArPSAzOwotICB9Ci0gIFZQOEluaXRCaXRSZWFkZXIoZGVjLT5wYXJ0c18gKyBsYXN0X3BhcnQsIHBhcnRfc3RhcnQsIGJ1Zl9lbmQpOwotICByZXR1cm4gKHBhcnRfc3RhcnQgPCBidWZfZW5kKSA/IFZQOF9TVEFUVVNfT0sgOgotICAgICAgICAgICBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgICAvLyBJbml0IGlzIG9rLCBidXQgdGhlcmUncyBub3QgZW5vdWdoIGRhdGEKLX0KLQotLy8gUGFyYWdyYXBoIDkuNAotc3RhdGljIGludCBQYXJzZUZpbHRlckhlYWRlcihWUDhCaXRSZWFkZXIqIGJyLCBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZGVjLT5maWx0ZXJfaGRyXzsKLSAgaGRyLT5zaW1wbGVfICAgID0gVlA4R2V0KGJyKTsKLSAgaGRyLT5sZXZlbF8gICAgID0gVlA4R2V0VmFsdWUoYnIsIDYpOwotICBoZHItPnNoYXJwbmVzc18gPSBWUDhHZXRWYWx1ZShiciwgMyk7Ci0gIGhkci0+dXNlX2xmX2RlbHRhXyA9IFZQOEdldChicik7Ci0gIGlmIChoZHItPnVzZV9sZl9kZWx0YV8pIHsKLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSBsZi1kZWx0YT8KLSAgICAgIGludCBpOwotICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9SRUZfTEZfREVMVEFTOyArK2kpIHsKLSAgICAgICAgaWYgKFZQOEdldChicikpIHsKLSAgICAgICAgICBoZHItPnJlZl9sZl9kZWx0YV9baV0gPSBWUDhHZXRTaWduZWRWYWx1ZShiciwgNik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTU9ERV9MRl9ERUxUQVM7ICsraSkgewotICAgICAgICBpZiAoVlA4R2V0KGJyKSkgewotICAgICAgICAgIGhkci0+bW9kZV9sZl9kZWx0YV9baV0gPSBWUDhHZXRTaWduZWRWYWx1ZShiciwgNik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZGVjLT5maWx0ZXJfdHlwZV8gPSAoaGRyLT5sZXZlbF8gPT0gMCkgPyAwIDogaGRyLT5zaW1wbGVfID8gMSA6IDI7Ci0gIHJldHVybiAhYnItPmVvZl87Ci19Ci0KLS8vIFRvcG1vc3QgY2FsbAotaW50IFZQOEdldEhlYWRlcnMoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgY29uc3QgdWludDhfdCogYnVmOwotICBzaXplX3QgYnVmX3NpemU7Ci0gIFZQOEZyYW1lSGVhZGVyKiBmcm1faGRyOwotICBWUDhQaWN0dXJlSGVhZGVyKiBwaWNfaGRyOwotICBWUDhCaXRSZWFkZXIqIGJyOwotICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKLSAgV2ViUEhlYWRlclN0cnVjdHVyZSBoZWFkZXJzOwotCi0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIFNldE9rKGRlYyk7Ci0gIGlmIChpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBWUDhJbyBwYXNzZWQgdG8gVlA4R2V0SGVhZGVycygpIik7Ci0gIH0KLQotICAvLyBQcm9jZXNzIFByZS1WUDggY2h1bmtzLgotICBoZWFkZXJzLmRhdGEgPSBpby0+ZGF0YTsKLSAgaGVhZGVycy5kYXRhX3NpemUgPSBpby0+ZGF0YV9zaXplOwotICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsKLSAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgc3RhdHVzLCAiSW5jb3JyZWN0L2luY29tcGxldGUgaGVhZGVyLiIpOwotICB9Ci0gIGlmIChoZWFkZXJzLmlzX2xvc3NsZXNzKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJVbmV4cGVjdGVkIGxvc3NsZXNzIGZvcm1hdCBlbmNvdW50ZXJlZC4iKTsKLSAgfQotCi0gIGlmIChkZWMtPmFscGhhX2RhdGFfID09IE5VTEwpIHsKLSAgICBTQl9EQ0hFQ0soZGVjLT5hbHBoYV9kYXRhX3NpemVfID09IDApOwotICAgIC8vIFdlIGhhdmUgTk9UIHNldCBhbHBoYSBkYXRhIHlldC4gU2V0IGl0IG5vdy4KLSAgICAvLyAoVGhpcyBpcyB0byBlbnN1cmUgdGhhdCBkZWMtPmFscGhhX2RhdGFfIGlzIE5PVCByZXNldCB0byBOVUxMIGlmCi0gICAgLy8gV2ViUFBhcnNlSGVhZGVycygpIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSwgYXMgaW4gaW5jcmVtZW50YWwgZGVjb2RpbmcKLSAgICAvLyBjYXNlLikKLSAgICBkZWMtPmFscGhhX2RhdGFfID0gaGVhZGVycy5hbHBoYV9kYXRhOwotICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyA9IGhlYWRlcnMuYWxwaGFfZGF0YV9zaXplOwotICB9Ci0KLSAgLy8gUHJvY2VzcyB0aGUgVlA4IGZyYW1lIGhlYWRlci4KLSAgYnVmID0gaGVhZGVycy5kYXRhICsgaGVhZGVycy5vZmZzZXQ7Ci0gIGJ1Zl9zaXplID0gaGVhZGVycy5kYXRhX3NpemUgLSBoZWFkZXJzLm9mZnNldDsKLSAgU0JfRENIRUNLKGhlYWRlcnMuZGF0YV9zaXplID49IGhlYWRlcnMub2Zmc2V0KTsgIC8vIFdlYlBQYXJzZUhlYWRlcnMnIGd1YXJhbnRlZQotICBpZiAoYnVmX3NpemUgPCA0KSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgaGVhZGVyLiIpOwotICB9Ci0KLSAgLy8gUGFyYWdyYXBoIDkuMQotICB7Ci0gICAgY29uc3QgdWludDMyX3QgYml0cyA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdIDw8IDE2KTsKLSAgICBmcm1faGRyID0gJmRlYy0+ZnJtX2hkcl87Ci0gICAgZnJtX2hkci0+a2V5X2ZyYW1lXyA9ICEoYml0cyAmIDEpOwotICAgIGZybV9oZHItPnByb2ZpbGVfID0gKGJpdHMgPj4gMSkgJiA3OwotICAgIGZybV9oZHItPnNob3dfID0gKGJpdHMgPj4gNCkgJiAxOwotICAgIGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID0gKGJpdHMgPj4gNSk7Ci0gICAgaWYgKGZybV9oZHItPnByb2ZpbGVfID4gMykKLSAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgICJJbmNvcnJlY3Qga2V5ZnJhbWUgcGFyYW1ldGVycy4iKTsKLSAgICBpZiAoIWZybV9oZHItPnNob3dfKQotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAotICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBub3QgZGlzcGxheWFibGUuIik7Ci0gICAgYnVmICs9IDM7Ci0gICAgYnVmX3NpemUgLT0gMzsKLSAgfQotCi0gIHBpY19oZHIgPSAmZGVjLT5waWNfaGRyXzsKLSAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKLSAgICAvLyBQYXJhZ3JhcGggOS4yCi0gICAgaWYgKGJ1Zl9zaXplIDwgNykgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBwaWN0dXJlIGhlYWRlciIpOwotICAgIH0KLSAgICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGJ1ZiwgYnVmX3NpemUpKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNvZGUgd29yZCIpOwotICAgIH0KLSAgICBwaWNfaGRyLT53aWR0aF8gPSAoKGJ1Zls0XSA8PCA4KSB8IGJ1ZlszXSkgJiAweDNmZmY7Ci0gICAgcGljX2hkci0+eHNjYWxlXyA9IGJ1Zls0XSA+PiA2OyAgIC8vIHJhdGlvOiAxLCA1LzQgNS8zIG9yIDIKLSAgICBwaWNfaGRyLT5oZWlnaHRfID0gKChidWZbNl0gPDwgOCkgfCBidWZbNV0pICYgMHgzZmZmOwotICAgIHBpY19oZHItPnlzY2FsZV8gPSBidWZbNl0gPj4gNjsKLSAgICBidWYgKz0gNzsKLSAgICBidWZfc2l6ZSAtPSA3OwotCi0gICAgZGVjLT5tYl93XyA9IChwaWNfaGRyLT53aWR0aF8gKyAxNSkgPj4gNDsKLSAgICBkZWMtPm1iX2hfID0gKHBpY19oZHItPmhlaWdodF8gKyAxNSkgPj4gNDsKLSAgICAvLyBTZXR1cCBkZWZhdWx0IG91dHB1dCBhcmVhIChjYW4gYmUgbGF0ZXIgbW9kaWZpZWQgZHVyaW5nIGlvLT5zZXR1cCgpKQotICAgIGlvLT53aWR0aCA9IHBpY19oZHItPndpZHRoXzsKLSAgICBpby0+aGVpZ2h0ID0gcGljX2hkci0+aGVpZ2h0XzsKLSAgICBpby0+dXNlX3NjYWxpbmcgID0gMDsKLSAgICBpby0+dXNlX2Nyb3BwaW5nID0gMDsKLSAgICBpby0+Y3JvcF90b3AgID0gMDsKLSAgICBpby0+Y3JvcF9sZWZ0ID0gMDsKLSAgICBpby0+Y3JvcF9yaWdodCAgPSBpby0+d2lkdGg7Ci0gICAgaW8tPmNyb3BfYm90dG9tID0gaW8tPmhlaWdodDsKLSAgICBpby0+bWJfdyA9IGlvLT53aWR0aDsgICAvLyBzYW5pdHkgY2hlY2sKLSAgICBpby0+bWJfaCA9IGlvLT5oZWlnaHQ7ICAvLyBkaXR0bwotCi0gICAgVlA4UmVzZXRQcm9iYSgmZGVjLT5wcm9iYV8pOwotICAgIFJlc2V0U2VnbWVudEhlYWRlcigmZGVjLT5zZWdtZW50X2hkcl8pOwotICAgIGRlYy0+c2VnbWVudF8gPSAwOyAgICAvLyBkZWZhdWx0IGZvciBpbnRyYQotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIHBhcnRpdGlvbiAjMCBhdmFpbGFibGUsIGFuZCBpbml0aWFsaXplIGRlYy0+YnJfCi0gIC8vIHRvIHJlYWQgdGhpcyBwYXJ0aXRpb24gKGFuZCB0aGlzIHBhcnRpdGlvbiBvbmx5KS4KLSAgaWYgKGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID4gYnVmX3NpemUpIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKLSAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJ0aXRpb24gbGVuZ3RoIik7Ci0gIH0KLQotICBiciA9ICZkZWMtPmJyXzsKLSAgVlA4SW5pdEJpdFJlYWRlcihiciwgYnVmLCBidWYgKyBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyk7Ci0gIGJ1ZiArPSBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXzsKLSAgYnVmX3NpemUgLT0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87Ci0KLSAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKLSAgICBwaWNfaGRyLT5jb2xvcnNwYWNlXyA9IFZQOEdldChicik7Ci0gICAgcGljX2hkci0+Y2xhbXBfdHlwZV8gPSBWUDhHZXQoYnIpOwotICB9Ci0gIGlmICghUGFyc2VTZWdtZW50SGVhZGVyKGJyLCAmZGVjLT5zZWdtZW50X2hkcl8sICZkZWMtPnByb2JhXykpIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBzZWdtZW50IGhlYWRlciIpOwotICB9Ci0gIC8vIEZpbHRlciBzcGVjcwotICBpZiAoIVBhcnNlRmlsdGVySGVhZGVyKGJyLCBkZWMpKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgZmlsdGVyIGhlYWRlciIpOwotICB9Ci0gIHN0YXR1cyA9IFBhcnNlUGFydGl0aW9ucyhkZWMsIGJ1ZiwgYnVmX3NpemUpOwotICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBzdGF0dXMsICJjYW5ub3QgcGFyc2UgcGFydGl0aW9ucyIpOwotICB9Ci0KLSAgLy8gcXVhbnRpemVyIGNoYW5nZQotICBWUDhQYXJzZVF1YW50KGRlYyk7Ci0KLSAgLy8gRnJhbWUgYnVmZmVyIG1hcmtpbmcKLSAgaWYgKCFmcm1faGRyLT5rZXlfZnJhbWVfKSB7Ci0gICAgLy8gUGFyYWdyYXBoIDkuNwotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gPSBWUDhHZXQoYnIpIDw8IDA7ICAgLy8gdXBkYXRlIGdvbGRlbgotICAgIGRlYy0+YnVmZmVyX2ZsYWdzXyB8PSBWUDhHZXQoYnIpIDw8IDE7ICAvLyB1cGRhdGUgYWx0IHJlZgotICAgIGlmICghKGRlYy0+YnVmZmVyX2ZsYWdzXyAmIDEpKSB7Ci0gICAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0VmFsdWUoYnIsIDIpIDw8IDI7Ci0gICAgfQotICAgIGlmICghKGRlYy0+YnVmZmVyX2ZsYWdzXyAmIDIpKSB7Ci0gICAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0VmFsdWUoYnIsIDIpIDw8IDQ7Ci0gICAgfQotICAgIGRlYy0+YnVmZmVyX2ZsYWdzXyB8PSBWUDhHZXQoYnIpIDw8IDY7ICAgIC8vIHNpZ24gYmlhcyBnb2xkZW4KLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gfD0gVlA4R2V0KGJyKSA8PCA3OyAgICAvLyBzaWduIGJpYXMgYWx0IHJlZgotI2Vsc2UKLSAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkUsCi0gICAgICAgICAgICAgICAgICAgICAgICJOb3QgYSBrZXkgZnJhbWUuIik7Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBkZWMtPmJ1ZmZlcl9mbGFnc18gPSAweDAwMyB8IDB4MTAwOwotICB9Ci0KLSAgLy8gUGFyYWdyYXBoIDkuOAotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgZGVjLT51cGRhdGVfcHJvYmFfID0gVlA4R2V0KGJyKTsKLSAgaWYgKCFkZWMtPnVwZGF0ZV9wcm9iYV8pIHsgICAgLy8gc2F2ZSBmb3IgbGF0ZXIgcmVzdG9yZQotICAgIGRlYy0+cHJvYmFfc2F2ZWRfID0gZGVjLT5wcm9iYV87Ci0gIH0KLSAgZGVjLT5idWZmZXJfZmxhZ3NfICY9IDEgPDwgODsKLSAgZGVjLT5idWZmZXJfZmxhZ3NfIHw9Ci0gICAgICAoZnJtX2hkci0+a2V5X2ZyYW1lXyB8fCBWUDhHZXQoYnIpKSA8PCA4OyAgICAvLyByZWZyZXNoIGxhc3QgZnJhbWUKLSNlbHNlCi0gIFZQOEdldChicik7ICAgLy8ganVzdCBpZ25vcmUgdGhlIHZhbHVlIG9mIHVwZGF0ZV9wcm9iYV8KLSNlbmRpZgotCi0gIFZQOFBhcnNlUHJvYmEoYnIsIGRlYyk7Ci0KLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAvLyBFeHRlbnNpb25zCi0gIGlmIChkZWMtPnBpY19oZHJfLmNvbG9yc3BhY2VfKSB7Ci0gICAgY29uc3Qgc2l6ZV90IGtUcmFpbGVyU2l6ZSA9IDg7Ci0gICAgY29uc3QgdWludDhfdCBrVHJhaWxlck1hcmtlciA9IDB4MDE7Ci0gICAgY29uc3QgdWludDhfdCogZXh0X2J1ZiA9IGJ1ZiAtIGtUcmFpbGVyU2l6ZTsKLSAgICBzaXplX3Qgc2l6ZTsKLQotICAgIGlmIChmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyA8IGtUcmFpbGVyU2l6ZSB8fAotICAgICAgICBleHRfYnVmW2tUcmFpbGVyU2l6ZSAtIDFdICE9IGtUcmFpbGVyTWFya2VyKSB7Ci0gICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiUklGRjogSW5jb25zaXN0ZW50IGV4dHJhIGluZm9ybWF0aW9uLiIpOwotICAgIH0KLQotICAgIC8vIExheWVyCi0gICAgc2l6ZSA9IChleHRfYnVmWzBdIDw8IDApIHwgKGV4dF9idWZbMV0gPDwgOCkgfCAoZXh0X2J1ZlsyXSA8PCAxNik7Ci0gICAgZGVjLT5sYXllcl9kYXRhX3NpemVfID0gc2l6ZTsKLSAgICBkZWMtPmxheWVyX2RhdGFfID0gTlVMTDsgIC8vIHdpbGwgYmUgc2V0IGxhdGVyCi0gICAgZGVjLT5sYXllcl9jb2xvcnNwYWNlXyA9IGV4dF9idWZbM107Ci0gIH0KLSNlbmRpZgotCi0gIC8vIHNhbml0aXplZCBzdGF0ZQotICBkZWMtPnJlYWR5XyA9IDE7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmVzaWR1YWwgZGVjb2RpbmcgKFBhcmFncmFwaCAxMy4yIC8gMTMuMykKLQotc3RhdGljIGNvbnN0IGludCBrQmFuZHNbMTYgKyAxXSA9IHsKLSAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKLSAgMCAgLy8gZXh0cmEgZW50cnkgYXMgc2VudGluZWwKLX07Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ0W10gPSB7IDE3NiwgMTU1LCAxNDAsIDEzNSwgMCB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAsIDAgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtDYXQ2W10gPQotICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5LCAwIH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCogY29uc3Qga0NhdDM0NTZbXSA9IHsga0NhdDMsIGtDYXQ0LCBrQ2F0NSwga0NhdDYgfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0gewotICAwLCAxLCA0LCA4LCAgNSwgMiwgMywgNiwgIDksIDEyLCAxMywgMTAsICA3LCAxMSwgMTQsIDE1Ci19OwotCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCpQcm9iYUFycmF5KVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsgIC8vIGZvciBjb25zdC1jYXN0aW5nCi10eXBlZGVmIGNvbnN0IHVpbnQ4X3QgKCpQcm9iYUN0eEFycmF5KVtOVU1fUFJPQkFTXTsKLQotLy8gU2VlIHNlY3Rpb24gMTMtMjogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjM4NiNzZWN0aW9uLTEzLjIKLXN0YXRpYyBpbnQgR2V0TGFyZ2VWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBjb25zdCB1aW50OF90KiBjb25zdCBwKSB7Ci0gIGludCB2OwotICBpZiAoIVZQOEdldEJpdChiciwgcFszXSkpIHsKLSAgICBpZiAoIVZQOEdldEJpdChiciwgcFs0XSkpIHsKLSAgICAgIHYgPSAyOwotICAgIH0gZWxzZSB7Ci0gICAgICB2ID0gMyArIFZQOEdldEJpdChiciwgcFs1XSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzZdKSkgewotICAgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbN10pKSB7Ci0gICAgICAgIHYgPSA1ICsgVlA4R2V0Qml0KGJyLCAxNTkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdiA9IDcgKyAyICogVlA4R2V0Qml0KGJyLCAxNjUpOwotICAgICAgICB2ICs9IFZQOEdldEJpdChiciwgMTQ1KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgdWludDhfdCogdGFiOwotICAgICAgY29uc3QgaW50IGJpdDEgPSBWUDhHZXRCaXQoYnIsIHBbOF0pOwotICAgICAgY29uc3QgaW50IGJpdDAgPSBWUDhHZXRCaXQoYnIsIHBbOSArIGJpdDFdKTsKLSAgICAgIGNvbnN0IGludCBjYXQgPSAyICogYml0MSArIGJpdDA7Ci0gICAgICB2ID0gMDsKLSAgICAgIGZvciAodGFiID0ga0NhdDM0NTZbY2F0XTsgKnRhYjsgKyt0YWIpIHsKLSAgICAgICAgdiArPSB2ICsgVlA4R2V0Qml0KGJyLCAqdGFiKTsKLSAgICAgIH0KLSAgICAgIHYgKz0gMyArICg4IDw8IGNhdCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiB2OwotfQotCi0vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBub24temVybyBjb2VmZiBwbHVzIG9uZQotLy8gKGFuZCAwIGlmIHRoZXJlJ3Mgbm8gY29lZmYgYXQgYWxsKQotc3RhdGljIGludCBHZXRDb2VmZnMoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgUHJvYmFBcnJheSBwcm9iLAotICAgICAgICAgICAgICAgICAgICAgaW50IGN0eCwgY29uc3QgcXVhbnRfdCBkcSwgaW50IG4sIGludDE2X3QqIG91dCkgewotICAvLyBuIGlzIGVpdGhlciAwIG9yIDEgaGVyZS4ga0JhbmRzW25dIGlzIG5vdCBuZWNlc3NhcnkgZm9yIGV4dHJhY3RpbmcgJypwJy4KLSAgY29uc3QgdWludDhfdCogcCA9IHByb2Jbbl1bY3R4XTsKLSAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbMF0pKSB7ICAgLy8gZmlyc3QgRU9CIGlzIG1vcmUgYSAnQ0JQJyBiaXQuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZm9yICg7IG4gPCAxNjsgKytuKSB7Ci0gICAgY29uc3QgUHJvYmFDdHhBcnJheSBwX2N0eCA9IHByb2Jba0JhbmRzW24gKyAxXV07Ci0gICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbMV0pKSB7Ci0gICAgICBwID0gcF9jdHhbMF07Ci0gICAgfSBlbHNlIHsgIC8vIG5vbiB6ZXJvIGNvZWZmCi0gICAgICBpbnQgdjsKLSAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkgewotICAgICAgICB2ID0gMTsKLSAgICAgICAgcCA9IHBfY3R4WzFdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOwotICAgICAgICBwID0gcF9jdHhbMl07Ci0gICAgICB9Ci0gICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOwotICAgICAgaWYgKG4gPCAxNSAmJiAhVlA4R2V0Qml0KGJyLCBwWzBdKSkgeyAgIC8vIEVPQgotICAgICAgICByZXR1cm4gbiArIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxNjsKLX0KLQotLy8gQWxpYXMtc2FmZSB3YXkgb2YgY29udmVydGluZyA0Ynl0ZXMgdG8gMzJiaXRzLgotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnQ4X3QgIGk4WzRdOwotICB1aW50MzJfdCBpMzI7Ci19IFBhY2tlZE56OwotCi0vLyBUYWJsZSB0byB1bnBhY2sgZm91ciBiaXRzIGludG8gZm91ciBieXRlcwotc3RhdGljIGNvbnN0IFBhY2tlZE56IGtVbnBhY2tUYWJbMTZdID0gewotICB7ezAsIDAsIDAsIDB9fSwgIHt7MSwgMCwgMCwgMH19LCAge3swLCAxLCAwLCAwfX0sICB7ezEsIDEsIDAsIDB9fSwKLSAge3swLCAwLCAxLCAwfX0sICB7ezEsIDAsIDEsIDB9fSwgIHt7MCwgMSwgMSwgMH19LCAge3sxLCAxLCAxLCAwfX0sCi0gIHt7MCwgMCwgMCwgMX19LCAge3sxLCAwLCAwLCAxfX0sICB7ezAsIDEsIDAsIDF9fSwgIHt7MSwgMSwgMCwgMX19LAotICB7ezAsIDAsIDEsIDF9fSwgIHt7MSwgMCwgMSwgMX19LCAge3swLCAxLCAxLCAxfX0sICB7ezEsIDEsIDEsIDF9fSB9OwotCi0vLyBNYWNybyB0byBwYWNrIGZvdXIgTFNCIG9mIGZvdXIgYnl0ZXMgaW50byBmb3VyIGJpdHMuCi0jaWYgZGVmaW5lZChfX1BQQ19fKSB8fCBkZWZpbmVkKF9NX1BQQykgfHwgZGVmaW5lZChfQVJDSF9QUEMpIHx8IFwKLSAgICBkZWZpbmVkKF9fQklHX0VORElBTl9fKQotI2RlZmluZSBQQUNLX0NTVCAweDA4MDQwMjAxVQotI2Vsc2UKLSNkZWZpbmUgUEFDS19DU1QgMHgwMTAyMDQwOFUKLSNlbmRpZgotI2RlZmluZSBQQUNLKFgsIFMpICgoKChYKS5pMzIgKiBQQUNLX0NTVCkgJiAweGZmMDAwMDAwKSA+PiAoUykpCi0KLXN0YXRpYyB2b2lkIFBhcnNlUmVzaWR1YWxzKFZQOERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1CKiBjb25zdCBtYiwgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgewotICBpbnQgb3V0X3RfbnosIG91dF9sX256LCBmaXJzdDsKLSAgUHJvYmFBcnJheSBhY19wcm9iOwotICBjb25zdCBWUDhRdWFudE1hdHJpeCogcSA9ICZkZWMtPmRxbV9bZGVjLT5zZWdtZW50X107Ci0gIGludDE2X3QqIGRzdCA9IGRlYy0+Y29lZmZzXzsKLSAgVlA4TUIqIGNvbnN0IGxlZnRfbWIgPSBkZWMtPm1iX2luZm9fIC0gMTsKLSAgUGFja2VkTnogbnpfYWMsIG56X2RjOwotICBQYWNrZWROeiB0bnosIGxuejsKLSAgdWludDMyX3Qgbm9uX3plcm9fYWMgPSAwOwotICB1aW50MzJfdCBub25femVyb19kYyA9IDA7Ci0gIGludCB4LCB5LCBjaDsKLQotICBuel9kYy5pMzIgPSBuel9hYy5pMzIgPSAwOwotICBTYk1lbW9yeVNldChkc3QsIDAsIDM4NCAqIHNpemVvZigqZHN0KSk7Ci0gIGlmICghZGVjLT5pc19pNHg0XykgeyAgICAvLyBwYXJzZSBEQwotICAgIGludDE2X3QgZGNbMTZdID0geyAwIH07Ci0gICAgY29uc3QgaW50IGN0eCA9IG1iLT5kY19uel8gKyBsZWZ0X21iLT5kY19uel87Ci0gICAgbWItPmRjX256XyA9IGxlZnRfbWItPmRjX256XyA9Ci0gICAgICAgIChHZXRDb2VmZnModG9rZW5fYnIsIChQcm9iYUFycmF5KWRlYy0+cHJvYmFfLmNvZWZmc19bMV0sCi0gICAgICAgICAgICAgICAgICAgY3R4LCBxLT55Ml9tYXRfLCAwLCBkYykgPiAwKTsKLSAgICBmaXJzdCA9IDE7Ci0gICAgYWNfcHJvYiA9IChQcm9iYUFycmF5KWRlYy0+cHJvYmFfLmNvZWZmc19bMF07Ci0gICAgVlA4VHJhbnNmb3JtV0hUKGRjLCBkc3QpOwotICB9IGVsc2UgewotICAgIGZpcnN0ID0gMDsKLSAgICBhY19wcm9iID0gKFByb2JhQXJyYXkpZGVjLT5wcm9iYV8uY29lZmZzX1szXTsKLSAgfQotCi0gIHRueiA9IGtVbnBhY2tUYWJbbWItPm56XyAmIDB4Zl07Ci0gIGxueiA9IGtVbnBhY2tUYWJbbGVmdF9tYi0+bnpfICYgMHhmXTsKLSAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgewotICAgIGludCBsID0gbG56Lmk4W3ldOwotICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSBsICsgdG56Lmk4W3hdOwotICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBhY19wcm9iLCBjdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcS0+eTFfbWF0XywgZmlyc3QsIGRzdCk7Ci0gICAgICB0bnouaThbeF0gPSBsID0gKG56ID4gMCk7Ci0gICAgICBuel9kYy5pOFt4XSA9IChkc3RbMF0gIT0gMCk7Ci0gICAgICBuel9hYy5pOFt4XSA9IChueiA+IDEpOwotICAgICAgZHN0ICs9IDE2OwotICAgIH0KLSAgICBsbnouaThbeV0gPSBsOwotICAgIG5vbl96ZXJvX2RjIHw9IFBBQ0sobnpfZGMsIDI0IC0geSAqIDQpOwotICAgIG5vbl96ZXJvX2FjIHw9IFBBQ0sobnpfYWMsIDI0IC0geSAqIDQpOwotICB9Ci0gIG91dF90X256ID0gUEFDSyh0bnosIDI0KTsKLSAgb3V0X2xfbnogPSBQQUNLKGxueiwgMjQpOwotCi0gIHRueiA9IGtVbnBhY2tUYWJbbWItPm56XyA+PiA0XTsKLSAgbG56ID0ga1VucGFja1RhYltsZWZ0X21iLT5uel8gPj4gNF07Ci0gIGZvciAoY2ggPSAwOyBjaCA8IDQ7IGNoICs9IDIpIHsKLSAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7Ci0gICAgICBpbnQgbCA9IGxuei5pOFtjaCArIHldOwotICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgY3R4ID0gbCArIHRuei5pOFtjaCArIHhdOwotICAgICAgICBjb25zdCBpbnQgbnogPQotICAgICAgICAgICAgR2V0Q29lZmZzKHRva2VuX2JyLCAoUHJvYmFBcnJheSlkZWMtPnByb2JhXy5jb2VmZnNfWzJdLAotICAgICAgICAgICAgICAgICAgICAgIGN0eCwgcS0+dXZfbWF0XywgMCwgZHN0KTsKLSAgICAgICAgdG56Lmk4W2NoICsgeF0gPSBsID0gKG56ID4gMCk7Ci0gICAgICAgIG56X2RjLmk4W3kgKiAyICsgeF0gPSAoZHN0WzBdICE9IDApOwotICAgICAgICBuel9hYy5pOFt5ICogMiArIHhdID0gKG56ID4gMSk7Ci0gICAgICAgIGRzdCArPSAxNjsKLSAgICAgIH0KLSAgICAgIGxuei5pOFtjaCArIHldID0gbDsKLSAgICB9Ci0gICAgbm9uX3plcm9fZGMgfD0gUEFDSyhuel9kYywgOCAtIGNoICogMik7Ci0gICAgbm9uX3plcm9fYWMgfD0gUEFDSyhuel9hYywgOCAtIGNoICogMik7Ci0gIH0KLSAgb3V0X3RfbnogfD0gUEFDSyh0bnosIDIwKTsKLSAgb3V0X2xfbnogfD0gUEFDSyhsbnosIDIwKTsKLSAgbWItPm56XyA9IG91dF90X256OwotICBsZWZ0X21iLT5uel8gPSBvdXRfbF9uejsKLQotICBkZWMtPm5vbl96ZXJvX2FjXyA9IG5vbl96ZXJvX2FjOwotICBkZWMtPm5vbl96ZXJvXyA9IG5vbl96ZXJvX2FjIHwgbm9uX3plcm9fZGM7Ci0gIG1iLT5za2lwXyA9ICFkZWMtPm5vbl96ZXJvXzsKLX0KLSN1bmRlZiBQQUNLCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGxvb3AKLQotaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgewotICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOwotICBWUDhNQiogY29uc3QgaW5mbyA9IGRlYy0+bWJfaW5mb18gKyBkZWMtPm1iX3hfOwotCi0gIC8vIE5vdGU6IHdlIGRvbid0IHNhdmUgc2VnbWVudCBtYXAgKHlldCksIGFzIHdlIGRvbid0IGV4cGVjdAotICAvLyB0byBkZWNvZGUgbW9yZSB0aGFuIDEga2V5ZnJhbWUuCi0gIGlmIChkZWMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXykgewotICAgIC8vIEhhcmRjb2RlZCB0cmVlIHBhcnNpbmcKLSAgICBkZWMtPnNlZ21lbnRfID0gIVZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzBdKSA/Ci0gICAgICAgIFZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzFdKSA6Ci0gICAgICAgIDIgKyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1syXSk7Ci0gIH0KLSAgaW5mby0+c2tpcF8gPSBkZWMtPnVzZV9za2lwX3Byb2JhXyA/IFZQOEdldEJpdChiciwgZGVjLT5za2lwX3BfKSA6IDA7Ci0KLSAgVlA4UGFyc2VJbnRyYU1vZGUoYnIsIGRlYyk7Ci0gIGlmIChici0+ZW9mXykgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaWYgKCFpbmZvLT5za2lwXykgewotICAgIFBhcnNlUmVzaWR1YWxzKGRlYywgaW5mbywgdG9rZW5fYnIpOwotICB9IGVsc2UgewotICAgIGxlZnQtPm56XyA9IGluZm8tPm56XyA9IDA7Ci0gICAgaWYgKCFkZWMtPmlzX2k0eDRfKSB7Ci0gICAgICBsZWZ0LT5kY19uel8gPSBpbmZvLT5kY19uel8gPSAwOwotICAgIH0KLSAgICBkZWMtPm5vbl96ZXJvXyA9IDA7Ci0gICAgZGVjLT5ub25femVyb19hY18gPSAwOwotICB9Ci0KLSAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgeyAgLy8gc3RvcmUgZmlsdGVyIGluZm8KLSAgICBWUDhGSW5mbyogY29uc3QgZmluZm8gPSBkZWMtPmZfaW5mb18gKyBkZWMtPm1iX3hfOwotICAgICpmaW5mbyA9IGRlYy0+ZnN0cmVuZ3Roc19bZGVjLT5zZWdtZW50X11bZGVjLT5pc19pNHg0X107Ci0gICAgZmluZm8tPmZfaW5uZXJfID0gKCFpbmZvLT5za2lwXyB8fCBkZWMtPmlzX2k0eDRfKTsKLSAgfQotCi0gIHJldHVybiAoIXRva2VuX2JyLT5lb2ZfKTsKLX0KLQotdm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7Ci0gIGxlZnQtPm56XyA9IDA7Ci0gIGxlZnQtPmRjX256XyA9IDA7Ci0gIFNiTWVtb3J5U2V0KGRlYy0+aW50cmFfbF8sIEJfRENfUFJFRCwgc2l6ZW9mKGRlYy0+aW50cmFfbF8pKTsKLSAgZGVjLT5maWx0ZXJfcm93XyA9Ci0gICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgJiYKLSAgICAoZGVjLT5tYl95XyA+PSBkZWMtPnRsX21iX3lfKSAmJiAoZGVjLT5tYl95XyA8PSBkZWMtPmJyX21iX3lfKTsKLX0KLQotc3RhdGljIGludCBQYXJzZUZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKSB7Ci0gIGZvciAoZGVjLT5tYl95XyA9IDA7IGRlYy0+bWJfeV8gPCBkZWMtPmJyX21iX3lfOyArK2RlYy0+bWJfeV8pIHsKLSAgICBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyID0KLSAgICAgICAgJmRlYy0+cGFydHNfW2RlYy0+bWJfeV8gJiAoZGVjLT5udW1fcGFydHNfIC0gMSldOwotICAgIFZQOEluaXRTY2FubGluZShkZWMpOwotICAgIGZvciAoZGVjLT5tYl94XyA9IDA7IGRlYy0+bWJfeF8gPCBkZWMtPm1iX3dfOyAgZGVjLT5tYl94XysrKSB7Ci0gICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7Ci0gICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZC4iKTsKLSAgICAgIH0KLSAgICAgIC8vIFJlY29uc3RydWN0IGFuZCBlbWl0IHNhbXBsZXMuCi0gICAgICBWUDhSZWNvbnN0cnVjdEJsb2NrKGRlYyk7Ci0gICAgfQotICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgewotICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiT3V0cHV0IGFib3J0ZWQuIik7Ci0gICAgfQotICB9Ci0gIGlmIChkZWMtPnVzZV90aHJlYWRzXyAmJiAhV2ViUFdvcmtlclN5bmMoJmRlYy0+d29ya2VyXykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIEZpbmlzaAotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgaWYgKCFkZWMtPnVwZGF0ZV9wcm9iYV8pIHsKLSAgICBkZWMtPnByb2JhXyA9IGRlYy0+cHJvYmFfc2F2ZWRfOwotICB9Ci0jZW5kaWYKLQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIGlmIChkZWMtPmxheWVyX2RhdGFfc2l6ZV8gPiAwKSB7Ci0gICAgaWYgKCFWUDhEZWNvZGVMYXllcihkZWMpKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSNlbmRpZgotCi0gIHJldHVybiAxOwotfQotCi0vLyBNYWluIGVudHJ5IHBvaW50Ci1pbnQgVlA4RGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCBvayA9IDA7Ci0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybiAwOwotICB9Ci0gIGlmIChpbyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNLAotICAgICAgICAgICAgICAgICAgICAgICAiTlVMTCBWUDhJbyBwYXJhbWV0ZXIgaW4gVlA4RGVjb2RlKCkuIik7Ci0gIH0KLQotICBpZiAoIWRlYy0+cmVhZHlfKSB7Ci0gICAgaWYgKCFWUDhHZXRIZWFkZXJzKGRlYywgaW8pKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSAgU0JfRENIRUNLKGRlYy0+cmVhZHlfKTsKLQotICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgZGVjb2RpbmcgcGFyYW1ldGVyLiBXaWxsIGNhbGwgaW8tPnNldHVwKCkuCi0gIG9rID0gKFZQOEVudGVyQ3JpdGljYWwoZGVjLCBpbykgPT0gVlA4X1NUQVRVU19PSyk7Ci0gIGlmIChvaykgeyAgIC8vIGdvb2QgdG8gZ28uCi0gICAgLy8gV2lsbCBhbGxvY2F0ZSBtZW1vcnkgYW5kIHByZXBhcmUgZXZlcnl0aGluZy4KLSAgICBpZiAob2spIG9rID0gVlA4SW5pdEZyYW1lKGRlYywgaW8pOwotCi0gICAgLy8gTWFpbiBkZWNvZGluZyBsb29wCi0gICAgaWYgKG9rKSBvayA9IFBhcnNlRnJhbWUoZGVjLCBpbyk7Ci0KLSAgICAvLyBFeGl0LgotICAgIG9rICY9IFZQOEV4aXRDcml0aWNhbChkZWMsIGlvKTsKLSAgfQotCi0gIGlmICghb2spIHsKLSAgICBWUDhDbGVhcihkZWMpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgZGVjLT5yZWFkeV8gPSAwOwotICByZXR1cm4gb2s7Ci19Ci0KLXZvaWQgVlA4Q2xlYXIoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7Ci0gIGlmIChkZWMgPT0gTlVMTCkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoZGVjLT51c2VfdGhyZWFkc18pIHsKLSAgICBXZWJQV29ya2VyRW5kKCZkZWMtPndvcmtlcl8pOwotICB9Ci0gIGlmIChkZWMtPm1lbV8pIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjLT5tZW1fKTsKLSAgfQotICBkZWMtPm1lbV8gPSBOVUxMOwotICBkZWMtPm1lbV9zaXplXyA9IDA7Ci0gIFNiTWVtb3J5U2V0KCZkZWMtPmJyXywgMCwgc2l6ZW9mKGRlYy0+YnJfKSk7Ci0gIGRlYy0+cmVhZHlfID0gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4aS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFkMjdmMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4aS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBWUDggZGVjb2RlcjogaW50ZXJuYWwgaGVhZGVyLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9ERUNfVlA4SV9IXwotI2RlZmluZSBXRUJQX0RFQ19WUDhJX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCi0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfcmVhZGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdGhyZWFkLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZhcmlvdXMgZGVmaW5lcyBhbmQgZW51bXMKLQotLy8gdmVyc2lvbiBudW1iZXJzCi0jZGVmaW5lIERFQ19NQUpfVkVSU0lPTiAwCi0jZGVmaW5lIERFQ19NSU5fVkVSU0lPTiAzCi0jZGVmaW5lIERFQ19SRVZfVkVSU0lPTiAxCi0KLSNkZWZpbmUgT05MWV9LRVlGUkFNRV9DT0RFICAgICAgLy8gdG8gcmVtb3ZlIGFueSBjb2RlIHJlbGF0ZWQgdG8gUC1GcmFtZXMKLQotLy8gaW50cmEgcHJlZGljdGlvbiBtb2RlcwotZW51bSB7IEJfRENfUFJFRCA9IDAsICAgLy8gNHg0IG1vZGVzCi0gICAgICAgQl9UTV9QUkVELAotICAgICAgIEJfVkVfUFJFRCwKLSAgICAgICBCX0hFX1BSRUQsCi0gICAgICAgQl9SRF9QUkVELAotICAgICAgIEJfVlJfUFJFRCwKLSAgICAgICBCX0xEX1BSRUQsCi0gICAgICAgQl9WTF9QUkVELAotICAgICAgIEJfSERfUFJFRCwKLSAgICAgICBCX0hVX1BSRUQsCi0gICAgICAgTlVNX0JNT0RFUyA9IEJfSFVfUFJFRCArIDEgLSBCX0RDX1BSRUQsICAvLyA9IDEwCi0KLSAgICAgICAvLyBMdW1hMTYgb3IgVVYgbW9kZXMKLSAgICAgICBEQ19QUkVEID0gQl9EQ19QUkVELCBWX1BSRUQgPSBCX1ZFX1BSRUQsCi0gICAgICAgSF9QUkVEID0gQl9IRV9QUkVELCBUTV9QUkVEID0gQl9UTV9QUkVELAotICAgICAgIEJfUFJFRCA9IE5VTV9CTU9ERVMsICAgLy8gcmVmaW5lZCBJNHg0IG1vZGUKLQotICAgICAgIC8vIHNwZWNpYWwgbW9kZXMKLSAgICAgICBCX0RDX1BSRURfTk9UT1AgPSA0LAotICAgICAgIEJfRENfUFJFRF9OT0xFRlQgPSA1LAotICAgICAgIEJfRENfUFJFRF9OT1RPUExFRlQgPSA2LAotICAgICAgIE5VTV9CX0RDX01PREVTID0gNyB9OwotCi1lbnVtIHsgTUJfRkVBVFVSRV9UUkVFX1BST0JTID0gMywKLSAgICAgICBOVU1fTUJfU0VHTUVOVFMgPSA0LAotICAgICAgIE5VTV9SRUZfTEZfREVMVEFTID0gNCwKLSAgICAgICBOVU1fTU9ERV9MRl9ERUxUQVMgPSA0LCAgICAvLyBJNHg0LCBaRVJPLCAqLCBTUExJVAotICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCi0gICAgICAgLy8gUHJvYmFiaWxpdGllcwotICAgICAgIE5VTV9UWVBFUyA9IDQsCi0gICAgICAgTlVNX0JBTkRTID0gOCwKLSAgICAgICBOVU1fQ1RYID0gMywKLSAgICAgICBOVU1fUFJPQkFTID0gMTEsCi0gICAgICAgTlVNX01WX1BST0JBUyA9IDE5IH07Ci0KLS8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLgotLy8gQ29uc3RyYWludHMgYXJlOiBXZSBuZWVkIHRvIHN0b3JlIG9uZSAxNngxNiBibG9jayBvZiBsdW1hIHNhbXBsZXMgKHkpLAotLy8gYW5kIHR3byA4eDggY2hyb21hIGJsb2NrcyAodS92KS4gVGhlc2UgYXJlIGJldHRlciBiZSAxNi1ieXRlcyBhbGlnbmVkLAotLy8gaW4gb3JkZXIgdG8gYmUgU0lNRC1mcmllbmRseS4gV2UgYWxzbyBuZWVkIHRvIHN0b3JlIHRoZSB0b3AsIGxlZnQgYW5kCi0vLyB0b3AtbGVmdCBzYW1wbGVzIChmcm9tIHByZXZpb3VzbHkgZGVjb2RlZCBibG9ja3MpLCBhbG9uZyB3aXRoIGZvdXIKLS8vIGV4dHJhIHRvcC1yaWdodCBzYW1wbGVzIGZvciBsdW1hIChpbnRyYTR4NCBwcmVkaWN0aW9uIG9ubHkpLgotLy8gT25lIHBvc3NpYmxlIGxheW91dCBpcywgdXNpbmcgMzIgKiAoMTcgKyA5KSBieXRlczoKLS8vCi0vLyAgIC4rLS0tLS0tICAgPC0gb25seSAxIHBpeGVsIGhpZ2gKLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5dC4KLS8vICAgLnx5eXl5Li4KLS8vICAgListLS4rLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAotLy8gICAufHV1Lnx2dgotLy8gICAufHV1Lnx2dgotLy8KLS8vIEV2ZXJ5IGNoYXJhY3RlciBpcyBhIDR4NCBibG9jaywgd2l0aCBsZWdlbmQ6Ci0vLyAgJy4nID0gdW51c2VkCi0vLyAgJ3knID0geS1zYW1wbGVzICAgJ3UnID0gdS1zYW1wbGVzICAgICAndicgPSB1LXNhbXBsZXMKLS8vICAnfCcgPSBsZWZ0IHNhbXBsZSwgICAnLScgPSB0b3Agc2FtcGxlLCAgICAnKycgPSB0b3AtbGVmdCBzYW1wbGUKLS8vICAndCcgPSBleHRyYSB0b3AtcmlnaHQgc2FtcGxlIGZvciA0eDQgbW9kZXMKLS8vIFdpdGggdGhpcyBsYXlvdXQsIEJQUyAoPUJ5dGVzIFBlciBTY2FuLWxpbmUpIGlzIG9uZSBjYWNoZWxpbmUgc2l6ZS4KLSNkZWZpbmUgQlBTICAgICAgIDMyICAgIC8vIHRoaXMgaXMgdGhlIGNvbW1vbiBzdHJpZGUgdXNlZCBieSB5dXZbXQotI2RlZmluZSBZVVZfU0laRSAoQlBTICogMTcgKyBCUFMgKiA5KQotI2RlZmluZSBZX1NJWkUgICAoQlBTICogMTcpCi0jZGVmaW5lIFlfT0ZGICAgIChCUFMgKiAxICsgOCkKLSNkZWZpbmUgVV9PRkYgICAgKFlfT0ZGICsgQlBTICogMTYgKyBCUFMpCi0jZGVmaW5lIFZfT0ZGICAgIChVX09GRiArIDE2KQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVhZGVycwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3Qga2V5X2ZyYW1lXzsKLSAgdWludDhfdCBwcm9maWxlXzsKLSAgdWludDhfdCBzaG93XzsKLSAgdWludDMyX3QgcGFydGl0aW9uX2xlbmd0aF87Ci19IFZQOEZyYW1lSGVhZGVyOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQxNl90IHdpZHRoXzsKLSAgdWludDE2X3QgaGVpZ2h0XzsKLSAgdWludDhfdCB4c2NhbGVfOwotICB1aW50OF90IHlzY2FsZV87Ci0gIHVpbnQ4X3QgY29sb3JzcGFjZV87ICAgLy8gMCA9IFlDYkNyCi0gIHVpbnQ4X3QgY2xhbXBfdHlwZV87Ci19IFZQOFBpY3R1cmVIZWFkZXI7Ci0KLS8vIHNlZ21lbnQgZmVhdHVyZXMKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHVzZV9zZWdtZW50XzsKLSAgaW50IHVwZGF0ZV9tYXBfOyAgICAgICAgLy8gd2hldGhlciB0byB1cGRhdGUgdGhlIHNlZ21lbnQgbWFwIG9yIG5vdAotICBpbnQgYWJzb2x1dGVfZGVsdGFfOyAgICAvLyBhYnNvbHV0ZSBvciBkZWx0YSB2YWx1ZXMgZm9yIHF1YW50aXplciBhbmQgZmlsdGVyCi0gIGludDhfdCBxdWFudGl6ZXJfW05VTV9NQl9TRUdNRU5UU107ICAgICAgICAvLyBxdWFudGl6YXRpb24gY2hhbmdlcwotICBpbnQ4X3QgZmlsdGVyX3N0cmVuZ3RoX1tOVU1fTUJfU0VHTUVOVFNdOyAgLy8gZmlsdGVyIHN0cmVuZ3RoIGZvciBzZWdtZW50cwotfSBWUDhTZWdtZW50SGVhZGVyOwotCi0vLyBTdHJ1Y3QgY29sbGVjdGluZyBhbGwgZnJhbWUtcGVyc2lzdGVudCBwcm9iYWJpbGl0aWVzLgotdHlwZWRlZiBzdHJ1Y3QgewotICB1aW50OF90IHNlZ21lbnRzX1tNQl9GRUFUVVJFX1RSRUVfUFJPQlNdOwotICAvLyBUeXBlOiAwOkludHJhMTYtQUMgIDE6SW50cmExNi1EQyAgIDI6Q2hyb21hICAgMzpJbnRyYTQKLSAgdWludDhfdCBjb2VmZnNfW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIHVpbnQ4X3QgeW1vZGVfWzRdLCB1dm1vZGVfWzNdOwotICB1aW50OF90IG12X1syXVtOVU1fTVZfUFJPQkFTXTsKLSNlbmRpZgotfSBWUDhQcm9iYTsKLQotLy8gRmlsdGVyIHBhcmFtZXRlcnMKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHNpbXBsZV87ICAgICAgICAgICAgICAgICAgLy8gMD1jb21wbGV4LCAxPXNpbXBsZQotICBpbnQgbGV2ZWxfOyAgICAgICAgICAgICAgICAgICAvLyBbMC4uNjNdCi0gIGludCBzaGFycG5lc3NfOyAgICAgICAgICAgICAgIC8vIFswLi43XQotICBpbnQgdXNlX2xmX2RlbHRhXzsKLSAgaW50IHJlZl9sZl9kZWx0YV9bTlVNX1JFRl9MRl9ERUxUQVNdOwotICBpbnQgbW9kZV9sZl9kZWx0YV9bTlVNX01PREVfTEZfREVMVEFTXTsKLX0gVlA4RmlsdGVySGVhZGVyOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5mb3JtYXRpb25zIGFib3V0IHRoZSBtYWNyb2Jsb2Nrcy4KLQotdHlwZWRlZiBzdHJ1Y3QgeyAgLy8gZmlsdGVyIHNwZWNzCi0gIHVuc2lnbmVkIGludCBmX2xldmVsXzo2OyAgICAgIC8vIGZpbHRlciBzdHJlbmd0aDogMC4uNjMKLSAgdW5zaWduZWQgaW50IGZfaWxldmVsXzo2OyAgICAgLy8gaW5uZXIgbGltaXQ6IDEuLjYzCi0gIHVuc2lnbmVkIGludCBmX2lubmVyXzoxOyAgICAgIC8vIGRvIGlubmVyIGZpbHRlcmluZz8KLX0gVlA4RkluZm87Ci0KLXR5cGVkZWYgc3RydWN0IHsgIC8vIHVzZWQgZm9yIHN5bnRheC1wYXJzaW5nCi0gIHVuc2lnbmVkIGludCBuel86MjQ7ICAgICAgIC8vIG5vbi16ZXJvIEFDL0RDIGNvZWZmcyAoMjRiaXQpCi0gIHVuc2lnbmVkIGludCBkY19uel86MTsgICAgIC8vIG5vbi16ZXJvIERDIGNvZWZmcwotICB1bnNpZ25lZCBpbnQgc2tpcF86MTsgICAgICAvLyBibG9jayB0eXBlCi19IFZQOE1COwotCi0vLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwotdHlwZWRlZiBpbnQgcXVhbnRfdFsyXTsgICAgICAvLyBbREMgLyBBQ10uICBDYW4gYmUgJ3VpbnQxNl90WzJdJyB0b28gKH5zbG93ZXIpLgotdHlwZWRlZiBzdHJ1Y3QgewotICBxdWFudF90IHkxX21hdF8sIHkyX21hdF8sIHV2X21hdF87Ci19IFZQOFF1YW50TWF0cml4OwotCi0vLyBQZXJzaXN0ZW50IGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZwotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgaWRfOyAgICAgICAgICAgIC8vIGNhY2hlIHJvdyB0byBwcm9jZXNzIChpbiBbMC4uMl0pCi0gIGludCBtYl95XzsgICAgICAgICAgLy8gbWFjcm9ibG9jayBwb3NpdGlvbiBvZiB0aGUgcm93Ci0gIGludCBmaWx0ZXJfcm93XzsgICAgLy8gdHJ1ZSBpZiByb3ctZmlsdGVyaW5nIGlzIG5lZWRlZAotICBWUDhGSW5mbyogZl9pbmZvXzsgIC8vIGZpbHRlciBzdHJlbmd0aHMKLSAgVlA4SW8gaW9fOyAgICAgICAgICAvLyBjb3B5IG9mIHRoZSBWUDhJbyB0byBwYXNzIHRvIHB1dCgpCi19IFZQOFRocmVhZENvbnRleHQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhEZWNvZGVyOiB0aGUgbWFpbiBvcGFxdWUgc3RydWN0dXJlIGhhbmRlZCBvdmVyIHRvIHVzZXIKLQotc3RydWN0IFZQOERlY29kZXIgewotICBWUDhTdGF0dXNDb2RlIHN0YXR1c187Ci0gIGludCByZWFkeV87ICAgICAvLyB0cnVlIGlmIHJlYWR5IHRvIGRlY29kZSBhIHBpY3R1cmUgd2l0aCBWUDhEZWNvZGUoKQotICBjb25zdCBjaGFyKiBlcnJvcl9tc2dfOyAgLy8gc2V0IHdoZW4gc3RhdHVzXyBpcyBub3QgT0suCi0KLSAgLy8gTWFpbiBkYXRhIHNvdXJjZQotICBWUDhCaXRSZWFkZXIgYnJfOwotCi0gIC8vIGhlYWRlcnMKLSAgVlA4RnJhbWVIZWFkZXIgICBmcm1faGRyXzsKLSAgVlA4UGljdHVyZUhlYWRlciBwaWNfaGRyXzsKLSAgVlA4RmlsdGVySGVhZGVyICBmaWx0ZXJfaGRyXzsKLSAgVlA4U2VnbWVudEhlYWRlciBzZWdtZW50X2hkcl87Ci0KLSAgLy8gV29ya2VyCi0gIFdlYlBXb3JrZXIgd29ya2VyXzsKLSAgaW50IHVzZV90aHJlYWRzXzsgICAgLy8gdXNlIG11bHRpLXRocmVhZAotICBpbnQgY2FjaGVfaWRfOyAgICAgICAvLyBjdXJyZW50IGNhY2hlIHJvdwotICBpbnQgbnVtX2NhY2hlc187ICAgICAvLyBudW1iZXIgb2YgY2FjaGVkIHJvd3Mgb2YgMTYgcGl4ZWxzICgxLCAyIG9yIDMpCi0gIFZQOFRocmVhZENvbnRleHQgdGhyZWFkX2N0eF87ICAvLyBUaHJlYWQgY29udGV4dAotCi0gIC8vIGRpbWVuc2lvbiwgaW4gbWFjcm9ibG9jayB1bml0cy4KLSAgaW50IG1iX3dfLCBtYl9oXzsKLQotICAvLyBNYWNyb2Jsb2NrIHRvIHByb2Nlc3MvZmlsdGVyLCBkZXBlbmRpbmcgb24gY3JvcHBpbmcgYW5kIGZpbHRlcl90eXBlLgotICBpbnQgdGxfbWJfeF8sIHRsX21iX3lfOyAgLy8gdG9wLWxlZnQgTUIgdGhhdCBtdXN0IGJlIGluLWxvb3AgZmlsdGVyZWQKLSAgaW50IGJyX21iX3hfLCBicl9tYl95XzsgIC8vIGxhc3QgYm90dG9tLXJpZ2h0IE1CIHRoYXQgbXVzdCBiZSBkZWNvZGVkCi0KLSAgLy8gbnVtYmVyIG9mIHBhcnRpdGlvbnMuCi0gIGludCBudW1fcGFydHNfOwotICAvLyBwZXItcGFydGl0aW9uIGJvb2xlYW4gZGVjb2RlcnMuCi0gIFZQOEJpdFJlYWRlciBwYXJ0c19bTUFYX05VTV9QQVJUSVRJT05TXTsKLQotICAvLyBidWZmZXIgcmVmcmVzaCBmbGFncwotICAvLyAgIGJpdCAwOiByZWZyZXNoIEdvbGQsIGJpdCAxOiByZWZyZXNoIEFsdAotICAvLyAgIGJpdCAyLTM6IGNvcHkgdG8gR29sZCwgYml0IDQtNTogY29weSB0byBBbHQKLSAgLy8gICBiaXQgNjogR29sZCBzaWduIGJpYXMsIGJpdCA3OiBBbHQgc2lnbiBiaWFzCi0gIC8vICAgYml0IDg6IHJlZnJlc2ggbGFzdCBmcmFtZQotICB1aW50MzJfdCBidWZmZXJfZmxhZ3NfOwotCi0gIC8vIGRlcXVhbnRpemF0aW9uIChvbmUgc2V0IG9mIERDL0FDIGRlcXVhbnQgZmFjdG9yIHBlciBzZWdtZW50KQotICBWUDhRdWFudE1hdHJpeCBkcW1fW05VTV9NQl9TRUdNRU5UU107Ci0KLSAgLy8gcHJvYmFiaWxpdGllcwotICBWUDhQcm9iYSBwcm9iYV87Ci0gIGludCB1c2Vfc2tpcF9wcm9iYV87Ci0gIHVpbnQ4X3Qgc2tpcF9wXzsKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0gIHVpbnQ4X3QgaW50cmFfcF8sIGxhc3RfcF8sIGdvbGRlbl9wXzsKLSAgVlA4UHJvYmEgcHJvYmFfc2F2ZWRfOwotICBpbnQgdXBkYXRlX3Byb2JhXzsKLSNlbmRpZgotCi0gIC8vIEJvdW5kYXJ5IGRhdGEgY2FjaGUgYW5kIHBlcnNpc3RlbnQgYnVmZmVycy4KLSAgdWludDhfdCogaW50cmFfdF87ICAgICAvLyB0b3AgaW50cmEgbW9kZXMgdmFsdWVzOiA0ICogbWJfd18KLSAgdWludDhfdCAgaW50cmFfbF9bNF07ICAvLyBsZWZ0IGludHJhIG1vZGVzIHZhbHVlcwotICB1aW50OF90KiB5X3RfOyAgICAgICAgIC8vIHRvcCBsdW1hIHNhbXBsZXM6IDE2ICogbWJfd18KLSAgdWludDhfdCogdV90XywgKnZfdF87ICAvLyB0b3AgdS92IHNhbXBsZXM6IDggKiBtYl93XyBlYWNoCi0KLSAgVlA4TUIqIG1iX2luZm9fOyAgICAgICAvLyBjb250ZXh0dWFsIG1hY3JvYmxvY2sgaW5mbyAobWJfd18gKyAxKQotICBWUDhGSW5mbyogZl9pbmZvXzsgICAgIC8vIGZpbHRlciBzdHJlbmd0aCBpbmZvCi0gIHVpbnQ4X3QqIHl1dl9iXzsgICAgICAgLy8gbWFpbiBibG9jayBmb3IgWS9VL1YgKHNpemUgPSBZVVZfU0laRSkKLSAgaW50MTZfdCogY29lZmZzXzsgICAgICAvLyAzODQgY29lZmZzID0gKDE2KzgrOCkgKiA0KjQKLQotICB1aW50OF90KiBjYWNoZV95XzsgICAgIC8vIG1hY3JvYmxvY2sgcm93IGZvciBzdG9yaW5nIHVuZmlsdGVyZWQgc2FtcGxlcwotICB1aW50OF90KiBjYWNoZV91XzsKLSAgdWludDhfdCogY2FjaGVfdl87Ci0gIGludCBjYWNoZV95X3N0cmlkZV87Ci0gIGludCBjYWNoZV91dl9zdHJpZGVfOwotCi0gIC8vIG1haW4gbWVtb3J5IGNodW5rIGZvciB0aGUgYWJvdmUgZGF0YS4gUGVyc2lzdGVudC4KLSAgdm9pZCogbWVtXzsKLSAgc2l6ZV90IG1lbV9zaXplXzsKLQotICAvLyBQZXIgbWFjcm9ibG9jayBub24tcGVyc2lzdGVudCBpbmZvcy4KLSAgaW50IG1iX3hfLCBtYl95XzsgICAgICAgLy8gY3VycmVudCBwb3NpdGlvbiwgaW4gbWFjcm9ibG9jayB1bml0cwotICB1aW50OF90IGlzX2k0eDRfOyAgICAgICAvLyB0cnVlIGlmIGludHJhNHg0Ci0gIHVpbnQ4X3QgaW1vZGVzX1sxNl07ICAgIC8vIG9uZSAxNngxNiBtb2RlICgjMCkgb3Igc2l4dGVlbiA0eDQgbW9kZXMKLSAgdWludDhfdCB1dm1vZGVfOyAgICAgICAgLy8gY2hyb21hIHByZWRpY3Rpb24gbW9kZQotICB1aW50OF90IHNlZ21lbnRfOyAgICAgICAvLyBibG9jaydzIHNlZ21lbnQKLQotICAvLyBiaXQtd2lzZSBpbmZvIGFib3V0IHRoZSBjb250ZW50IG9mIGVhY2ggc3ViLTR4NCBibG9ja3M6IHRoZXJlIGFyZSAxNiBiaXRzCi0gIC8vIGZvciBsdW1hIChiaXRzICMwLT4jMTUpLCB0aGVuIDQgYml0cyBmb3IgY2hyb21hLXUgKCMxNi0+IzE5KSBhbmQgNCBiaXRzIGZvcgotICAvLyBjaHJvbWEtdiAoIzIwLT4jMjMpLCBlYWNoIGNvcnJlc3BvbmRpbmcgdG8gb25lIDR4NCBibG9jayBpbiBkZWNvZGluZyBvcmRlci4KLSAgLy8gSWYgdGhlIGJpdCBpcyBzZXQsIHRoZSA0eDQgYmxvY2sgY29udGFpbnMgc29tZSBub24temVybyBjb2VmZmljaWVudHMuCi0gIHVpbnQzMl90IG5vbl96ZXJvXzsKLSAgdWludDMyX3Qgbm9uX3plcm9fYWNfOwotCi0gIC8vIEZpbHRlcmluZyBzaWRlLWluZm8KLSAgaW50IGZpbHRlcl90eXBlXzsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDA9b2ZmLCAxPXNpbXBsZSwgMj1jb21wbGV4Ci0gIGludCBmaWx0ZXJfcm93XzsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZXItcm93IGZsYWcKLSAgVlA4RkluZm8gZnN0cmVuZ3Roc19bTlVNX01CX1NFR01FTlRTXVsyXTsgIC8vIHByZWNhbGN1bGF0ZWQgcGVyLXNlZ21lbnQvdHlwZQotCi0gIC8vIGV4dGVuc2lvbnMKLSAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YV87ICAgLy8gY29tcHJlc3NlZCBhbHBoYSBkYXRhIChpZiBwcmVzZW50KQotICBzaXplX3QgYWxwaGFfZGF0YV9zaXplXzsKLSAgaW50IGlzX2FscGhhX2RlY29kZWRfOyAgLy8gdHJ1ZSBpZiBhbHBoYV9kYXRhXyBpcyBkZWNvZGVkIGluIGFscGhhX3BsYW5lXwotICB1aW50OF90KiBhbHBoYV9wbGFuZV87ICAgICAgICAvLyBvdXRwdXQuIFBlcnNpc3RlbnQsIGNvbnRhaW5zIHRoZSB3aG9sZSBkYXRhLgotCi0gIGludCBsYXllcl9jb2xvcnNwYWNlXzsKLSAgY29uc3QgdWludDhfdCogbGF5ZXJfZGF0YV87ICAgLy8gY29tcHJlc3NlZCBsYXllciBkYXRhIChpZiBwcmVzZW50KQotICBzaXplX3QgbGF5ZXJfZGF0YV9zaXplXzsKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCi0KLS8vIGluIHZwOC5jCi1pbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZyk7Ci0KLS8vIGluIHRyZWUuYwotdm9pZCBWUDhSZXNldFByb2JhKFZQOFByb2JhKiBjb25zdCBwcm9iYSk7Ci12b2lkIFZQOFBhcnNlUHJvYmEoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLXZvaWQgVlA4UGFyc2VJbnRyYU1vZGUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0KLS8vIGluIHF1YW50LmMKLXZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpOwotCi0vLyBpbiBmcmFtZS5jCi1pbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGlvKTsKLS8vIFByZWRpY3QgYSBibG9jayBhbmQgYWRkIHJlc2lkdWFsCi12b2lkIFZQOFJlY29uc3RydWN0QmxvY2soVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLS8vIENhbGwgaW8tPnNldHVwKCkgYW5kIGZpbmlzaCBzZXR0aW5nIHVwIHNjYW4gcGFyYW1ldGVycy4KLS8vIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLCBvbmUgbXVzdCBhbHdheXMgY2FsbCBWUDhFeGl0Q3JpdGljYWwoKSB3aXRoIHRoZQotLy8gc2FtZSBwYXJhbWV0ZXJzLiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbiBwYWlyLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sKLS8vIGlmIG9rLCBvdGhlcndpc2Ugc2V0cyBhbmQgcmV0dXJucyB0aGUgZXJyb3Igc3RhdHVzIG9uICpkZWMuCi1WUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOwotLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGluIHBhaXIgd2l0aCBWUDhFbnRlckNyaXRpY2FsKCkuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1pbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLS8vIFByb2Nlc3MgdGhlIGxhc3QgZGVjb2RlZCByb3cgKGZpbHRlcmluZyArIG91dHB1dCkKLWludCBWUDhQcm9jZXNzUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKLS8vIFRvIGJlIGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgc2NhbmxpbmUsIHRvIGluaXRpYWxpemUgcHJlZGljdG9ycy4KLXZvaWQgVlA4SW5pdFNjYW5saW5lKFZQOERlY29kZXIqIGNvbnN0IGRlYyk7Ci0vLyBEZWNvZGUgb25lIG1hY3JvYmxvY2suIFJldHVybnMgZmFsc2UgaWYgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhLgotaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icik7Ci0KLS8vIGluIGFscGhhLmMKLWNvbnN0IHVpbnQ4X3QqIFZQOERlY29tcHJlc3NBbHBoYVJvd3MoVlA4RGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MpOwotCi0vLyBpbiBsYXllci5jCi1pbnQgVlA4RGVjb2RlTGF5ZXIoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9ERUNfVlA4SV9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZWE5ZTIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3ZwOGwuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNTUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBkZWNvZGVyCi0vLwotLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4uL2RzcC9sb3NzbGVzcy5oIgotI2luY2x1ZGUgIi4uL2RzcC95dXYuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgTlVNX0FSR0JfQ0FDSEVfUk9XUyAgICAgICAgICAxNgotCi1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoTGl0ZXJhbHMgPSAxNjsKLXN0YXRpYyBjb25zdCBpbnQga0NvZGVMZW5ndGhSZXBlYXRDb2RlID0gMTY7Ci1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoRXh0cmFCaXRzWzNdID0geyAyLCAzLCA3IH07Ci1zdGF0aWMgY29uc3QgaW50IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1szXSA9IHsgMywgMywgMTEgfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBGaXZlIEh1ZmZtYW4gY29kZXMgYXJlIHVzZWQgYXQgZWFjaCBtZXRhIGNvZGU6Ci0vLyAgMS4gZ3JlZW4gKyBsZW5ndGggcHJlZml4IGNvZGVzICsgY29sb3IgY2FjaGUgY29kZXMsCi0vLyAgMi4gYWxwaGEsCi0vLyAgMy4gcmVkLAotLy8gIDQuIGJsdWUsIGFuZCwKLS8vICA1LiBkaXN0YW5jZSBwcmVmaXggY29kZXMuCi10eXBlZGVmIGVudW0gewotICBHUkVFTiA9IDAsCi0gIFJFRCAgID0gMSwKLSAgQkxVRSAgPSAyLAotICBBTFBIQSA9IDMsCi0gIERJU1QgID0gNAotfSBIdWZmSW5kZXg7Ci0KLXN0YXRpYyBjb25zdCB1aW50MTZfdCBrQWxwaGFiZXRTaXplW0hVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERV0gPSB7Ci0gIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUywKLSAgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywKLSAgTlVNX0RJU1RBTkNFX0NPREVTCi19OwotCi0KLSNkZWZpbmUgTlVNX0NPREVfTEVOR1RIX0NPREVTICAgICAgIDE5Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aENvZGVPcmRlcltOVU1fQ09ERV9MRU5HVEhfQ09ERVNdID0gewotICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Ci19OwotCi0jZGVmaW5lIENPREVfVE9fUExBTkVfQ09ERVMgICAgICAgIDEyMAotc3RhdGljIGNvbnN0IHVpbnQ4X3QgY29kZV90b19wbGFuZV9sdXRbQ09ERV9UT19QTEFORV9DT0RFU10gPSB7Ci0gIDB4MTgsIDB4MDcsIDB4MTcsIDB4MTksIDB4MjgsIDB4MDYsIDB4MjcsIDB4MjksIDB4MTYsIDB4MWEsCi0gIDB4MjYsIDB4MmEsIDB4MzgsIDB4MDUsIDB4MzcsIDB4MzksIDB4MTUsIDB4MWIsIDB4MzYsIDB4M2EsCi0gIDB4MjUsIDB4MmIsIDB4NDgsIDB4MDQsIDB4NDcsIDB4NDksIDB4MTQsIDB4MWMsIDB4MzUsIDB4M2IsCi0gIDB4NDYsIDB4NGEsIDB4MjQsIDB4MmMsIDB4NTgsIDB4NDUsIDB4NGIsIDB4MzQsIDB4M2MsIDB4MDMsCi0gIDB4NTcsIDB4NTksIDB4MTMsIDB4MWQsIDB4NTYsIDB4NWEsIDB4MjMsIDB4MmQsIDB4NDQsIDB4NGMsCi0gIDB4NTUsIDB4NWIsIDB4MzMsIDB4M2QsIDB4NjgsIDB4MDIsIDB4NjcsIDB4NjksIDB4MTIsIDB4MWUsCi0gIDB4NjYsIDB4NmEsIDB4MjIsIDB4MmUsIDB4NTQsIDB4NWMsIDB4NDMsIDB4NGQsIDB4NjUsIDB4NmIsCi0gIDB4MzIsIDB4M2UsIDB4NzgsIDB4MDEsIDB4NzcsIDB4NzksIDB4NTMsIDB4NWQsIDB4MTEsIDB4MWYsCi0gIDB4NjQsIDB4NmMsIDB4NDIsIDB4NGUsIDB4NzYsIDB4N2EsIDB4MjEsIDB4MmYsIDB4NzUsIDB4N2IsCi0gIDB4MzEsIDB4M2YsIDB4NjMsIDB4NmQsIDB4NTIsIDB4NWUsIDB4MDAsIDB4NzQsIDB4N2MsIDB4NDEsCi0gIDB4NGYsIDB4MTAsIDB4MjAsIDB4NjIsIDB4NmUsIDB4MzAsIDB4NzMsIDB4N2QsIDB4NTEsIDB4NWYsCi0gIDB4NDAsIDB4NzIsIDB4N2UsIDB4NjEsIDB4NmYsIDB4NTAsIDB4NzEsIDB4N2YsIDB4NjAsIDB4NzAKLX07Ci0KLXN0YXRpYyBpbnQgRGVjb2RlSW1hZ2VTdHJlYW0oaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sZXZlbDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgZGVjb2RlZF9kYXRhKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gKHNpemUgPj0gMSkgJiYgKGRhdGFbMF0gPT0gVlA4TF9NQUdJQ19CWVRFKTsKLX0KLQotc3RhdGljIGludCBSZWFkSW1hZ2VJbmZvKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX2FscGhhKSB7Ci0gIGNvbnN0IHVpbnQ4X3Qgc2lnbmF0dXJlID0gVlA4TFJlYWRCaXRzKGJyLCA4KTsKLSAgaWYgKCFWUDhMQ2hlY2tTaWduYXR1cmUoJnNpZ25hdHVyZSwgMSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICAqd2lkdGggPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7Ci0gICpoZWlnaHQgPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7Ci0gICpoYXNfYWxwaGEgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOwotICBWUDhMUmVhZEJpdHMoYnIsIFZQOExfVkVSU0lPTl9CSVRTKTsgIC8vIFJlYWQvaWdub3JlIHRoZSB2ZXJzaW9uIG51bWJlci4KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBWUDhMR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LCBpbnQqIGNvbnN0IGhhc19hbHBoYSkgewotICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKLSAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKLSAgfSBlbHNlIHsKLSAgICBpbnQgdywgaCwgYTsKLSAgICBWUDhMQml0UmVhZGVyIGJyOwotICAgIFZQOExJbml0Qml0UmVhZGVyKCZiciwgZGF0YSwgZGF0YV9zaXplKTsKLSAgICBpZiAoIVJlYWRJbWFnZUluZm8oJmJyLCAmdywgJmgsICZhKSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSB3OwotICAgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IGg7Ci0gICAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSAqaGFzX2FscGhhID0gYTsKLSAgICByZXR1cm4gMTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldENvcHlEaXN0YW5jZShpbnQgZGlzdGFuY2Vfc3ltYm9sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgaW50IGV4dHJhX2JpdHMsIG9mZnNldDsKLSAgaWYgKGRpc3RhbmNlX3N5bWJvbCA8IDQpIHsKLSAgICByZXR1cm4gZGlzdGFuY2Vfc3ltYm9sICsgMTsKLSAgfQotICBleHRyYV9iaXRzID0gKGRpc3RhbmNlX3N5bWJvbCAtIDIpID4+IDE7Ci0gIG9mZnNldCA9ICgyICsgKGRpc3RhbmNlX3N5bWJvbCAmIDEpKSA8PCBleHRyYV9iaXRzOwotICByZXR1cm4gb2Zmc2V0ICsgVlA4TFJlYWRCaXRzKGJyLCBleHRyYV9iaXRzKSArIDE7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0Q29weUxlbmd0aChpbnQgbGVuZ3RoX3N5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgewotICAvLyBMZW5ndGggYW5kIGRpc3RhbmNlIHByZWZpeGVzIGFyZSBlbmNvZGVkIHRoZSBzYW1lIHdheS4KLSAgcmV0dXJuIEdldENvcHlEaXN0YW5jZShsZW5ndGhfc3ltYm9sLCBicik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUGxhbmVDb2RlVG9EaXN0YW5jZShpbnQgeHNpemUsIGludCBwbGFuZV9jb2RlKSB7Ci0gIGlmIChwbGFuZV9jb2RlID4gQ09ERV9UT19QTEFORV9DT0RFUykgewotICAgIHJldHVybiBwbGFuZV9jb2RlIC0gQ09ERV9UT19QTEFORV9DT0RFUzsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQgZGlzdF9jb2RlID0gY29kZV90b19wbGFuZV9sdXRbcGxhbmVfY29kZSAtIDFdOwotICAgIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdF9jb2RlID4+IDQ7Ci0gICAgY29uc3QgaW50IHhvZmZzZXQgPSA4IC0gKGRpc3RfY29kZSAmIDB4Zik7Ci0gICAgY29uc3QgaW50IGRpc3QgPSB5b2Zmc2V0ICogeHNpemUgKyB4b2Zmc2V0OwotICAgIHJldHVybiAoZGlzdCA+PSAxKSA/IGRpc3QgOiAxOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNvZGVzIHRoZSBuZXh0IEh1ZmZtYW4gY29kZSBmcm9tIGJpdC1zdHJlYW0uCi0vLyBGaWxsQml0V2luZG93KGJyKSBuZWVkcyB0byBiZSBjYWxsZWQgYXQgbWluaW11bSBldmVyeSBzZWNvbmQgY2FsbAotLy8gdG8gUmVhZFN5bWJvbCwgaW4gb3JkZXIgdG8gcHJlLWZldGNoIGVub3VnaCBiaXRzLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkU3ltYm9sKGNvbnN0IEh1ZmZtYW5UcmVlKiB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogbm9kZSA9IHRyZWUtPnJvb3RfOwotICBpbnQgbnVtX2JpdHMgPSAwOwotICB1aW50MzJfdCBiaXRzID0gVlA4TFByZWZldGNoQml0cyhicik7Ci0gIFNCX0RDSEVDSyhub2RlICE9IE5VTEwpOwotICB3aGlsZSAoIUh1ZmZtYW5UcmVlTm9kZUlzTGVhZihub2RlKSkgewotICAgIG5vZGUgPSBIdWZmbWFuVHJlZU5leHROb2RlKG5vZGUsIGJpdHMgJiAxKTsKLSAgICBiaXRzID4+PSAxOwotICAgICsrbnVtX2JpdHM7Ci0gIH0KLSAgVlA4TERpc2NhcmRCaXRzKGJyLCBudW1fYml0cyk7Ci0gIHJldHVybiBub2RlLT5zeW1ib2xfOwotfQotCi1zdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZUxlbmd0aHMoCi0gICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHMsCi0gICAgaW50IG51bV9zeW1ib2xzLCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocykgewotICBpbnQgb2sgPSAwOwotICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKLSAgaW50IHN5bWJvbDsKLSAgaW50IG1heF9zeW1ib2w7Ci0gIGludCBwcmV2X2NvZGVfbGVuID0gREVGQVVMVF9DT0RFX0xFTkdUSDsKLSAgSHVmZm1hblRyZWUgdHJlZTsKLQotICBpZiAoIUh1ZmZtYW5UcmVlQnVpbGRJbXBsaWNpdCgmdHJlZSwgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoVlA4TFJlYWRCaXRzKGJyLCAxKSkgeyAgICAvLyB1c2UgbGVuZ3RoCi0gICAgY29uc3QgaW50IGxlbmd0aF9uYml0cyA9IDIgKyAyICogVlA4TFJlYWRCaXRzKGJyLCAzKTsKLSAgICBtYXhfc3ltYm9sID0gMiArIFZQOExSZWFkQml0cyhiciwgbGVuZ3RoX25iaXRzKTsKLSAgICBpZiAobWF4X3N5bWJvbCA+IG51bV9zeW1ib2xzKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtYXhfc3ltYm9sID0gbnVtX3N5bWJvbHM7Ci0gIH0KLQotICBzeW1ib2wgPSAwOwotICB3aGlsZSAoc3ltYm9sIDwgbnVtX3N5bWJvbHMpIHsKLSAgICBpbnQgY29kZV9sZW47Ci0gICAgaWYgKG1heF9zeW1ib2wtLSA9PSAwKSBicmVhazsKLSAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7Ci0gICAgY29kZV9sZW4gPSBSZWFkU3ltYm9sKCZ0cmVlLCBicik7Ci0gICAgaWYgKGNvZGVfbGVuIDwga0NvZGVMZW5ndGhMaXRlcmFscykgewotICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGNvZGVfbGVuOwotICAgICAgaWYgKGNvZGVfbGVuICE9IDApIHByZXZfY29kZV9sZW4gPSBjb2RlX2xlbjsKLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgaW50IHVzZV9wcmV2ID0gKGNvZGVfbGVuID09IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSk7Ci0gICAgICBjb25zdCBpbnQgc2xvdCA9IGNvZGVfbGVuIC0ga0NvZGVMZW5ndGhMaXRlcmFsczsKLSAgICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0ga0NvZGVMZW5ndGhFeHRyYUJpdHNbc2xvdF07Ci0gICAgICBjb25zdCBpbnQgcmVwZWF0X29mZnNldCA9IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1tzbG90XTsKLSAgICAgIGludCByZXBlYXQgPSBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgcmVwZWF0X29mZnNldDsKLSAgICAgIGlmIChzeW1ib2wgKyByZXBlYXQgPiBudW1fc3ltYm9scykgewotICAgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gdXNlX3ByZXYgPyBwcmV2X2NvZGVfbGVuIDogMDsKLSAgICAgICAgd2hpbGUgKHJlcGVhdC0tID4gMCkgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgb2sgPSAxOwotCi0gRW5kOgotICBIdWZmbWFuVHJlZVJlbGVhc2UoJnRyZWUpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlKGludCBhbHBoYWJldF9zaXplLCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUpIHsKLSAgaW50IG9rID0gMDsKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIGNvbnN0IGludCBzaW1wbGVfY29kZSA9IFZQOExSZWFkQml0cyhiciwgMSk7Ci0KLSAgaWYgKHNpbXBsZV9jb2RlKSB7ICAvLyBSZWFkIHN5bWJvbHMsIGNvZGVzICYgY29kZSBsZW5ndGhzIGRpcmVjdGx5LgotICAgIGludCBzeW1ib2xzWzJdOwotICAgIGludCBjb2Rlc1syXTsKLSAgICBpbnQgY29kZV9sZW5ndGhzWzJdOwotICAgIGNvbnN0IGludCBudW1fc3ltYm9scyA9IFZQOExSZWFkQml0cyhiciwgMSkgKyAxOwotICAgIGNvbnN0IGludCBmaXJzdF9zeW1ib2xfbGVuX2NvZGUgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOwotICAgIC8vIFRoZSBmaXJzdCBjb2RlIGlzIGVpdGhlciAxIGJpdCBvciA4IGJpdCBjb2RlLgotICAgIHN5bWJvbHNbMF0gPSBWUDhMUmVhZEJpdHMoYnIsIChmaXJzdF9zeW1ib2xfbGVuX2NvZGUgPT0gMCkgPyAxIDogOCk7Ci0gICAgY29kZXNbMF0gPSAwOwotICAgIGNvZGVfbGVuZ3Roc1swXSA9IG51bV9zeW1ib2xzIC0gMTsKLSAgICAvLyBUaGUgc2Vjb25kIGNvZGUgKGlmIHByZXNlbnQpLCBpcyBhbHdheXMgOCBiaXQgbG9uZy4KLSAgICBpZiAobnVtX3N5bWJvbHMgPT0gMikgewotICAgICAgc3ltYm9sc1sxXSA9IFZQOExSZWFkQml0cyhiciwgOCk7Ci0gICAgICBjb2Rlc1sxXSA9IDE7Ci0gICAgICBjb2RlX2xlbmd0aHNbMV0gPSBudW1fc3ltYm9scyAtIDE7Ci0gICAgfQotICAgIG9rID0gSHVmZm1hblRyZWVCdWlsZEV4cGxpY2l0KHRyZWUsIGNvZGVfbGVuZ3RocywgY29kZXMsIHN5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFiZXRfc2l6ZSwgbnVtX3N5bWJvbHMpOwotICB9IGVsc2UgeyAgLy8gRGVjb2RlIEh1ZmZtYW4tY29kZWQgY29kZSBsZW5ndGhzLgotICAgIGludCogY29kZV9sZW5ndGhzID0gTlVMTDsKLSAgICBpbnQgaTsKLSAgICBpbnQgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7IDAgfTsKLSAgICBjb25zdCBpbnQgbnVtX2NvZGVzID0gVlA4TFJlYWRCaXRzKGJyLCA0KSArIDQ7Ci0gICAgaWYgKG51bV9jb2RlcyA+IE5VTV9DT0RFX0xFTkdUSF9DT0RFUykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBjb2RlX2xlbmd0aHMgPQotICAgICAgICAoaW50KilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpYWxwaGFiZXRfc2l6ZSwgc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKLSAgICBpZiAoY29kZV9sZW5ndGhzID09IE5VTEwpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7ICsraSkgewotICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW2tDb2RlTGVuZ3RoQ29kZU9yZGVyW2ldXSA9IFZQOExSZWFkQml0cyhiciwgMyk7Ci0gICAgfQotICAgIG9rID0gUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocyhkZWMsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzKTsKLSAgICBpZiAob2spIHsKLSAgICAgIG9rID0gSHVmZm1hblRyZWVCdWlsZEltcGxpY2l0KHRyZWUsIGNvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSk7Ci0gICAgfQotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjb2RlX2xlbmd0aHMpOwotICB9Ci0gIG9rID0gb2sgJiYgIWJyLT5lcnJvcl87Ci0gIGlmICghb2spIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgRGVsZXRlSHRyZWVHcm91cHMoSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzLCBpbnQgbnVtX2h0cmVlX2dyb3VwcykgewotICBpZiAoaHRyZWVfZ3JvdXBzICE9IE5VTEwpIHsKLSAgICBpbnQgaSwgajsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2h0cmVlX2dyb3VwczsgKytpKSB7Ci0gICAgICBIdWZmbWFuVHJlZSogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXBzW2ldLmh0cmVlc187Ci0gICAgICBmb3IgKGogPSAwOyBqIDwgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFOyArK2opIHsKLSAgICAgICAgSHVmZm1hblRyZWVSZWxlYXNlKCZodHJlZXNbal0pOwotICAgICAgfQotICAgIH0KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaHRyZWVfZ3JvdXBzKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFJlYWRIdWZmbWFuQ29kZXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbG9yX2NhY2hlX2JpdHMsIGludCBhbGxvd19yZWN1cnNpb24pIHsKLSAgaW50IGksIGo7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87Ci0gIHVpbnQzMl90KiBodWZmbWFuX2ltYWdlID0gTlVMTDsKLSAgSFRyZWVHcm91cCogaHRyZWVfZ3JvdXBzID0gTlVMTDsKLSAgaW50IG51bV9odHJlZV9ncm91cHMgPSAxOwotCi0gIGlmIChhbGxvd19yZWN1cnNpb24gJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgewotICAgIC8vIHVzZSBtZXRhIEh1ZmZtYW4gY29kZXMuCi0gICAgY29uc3QgaW50IGh1ZmZtYW5fcHJlY2lzaW9uID0gVlA4TFJlYWRCaXRzKGJyLCAzKSArIDI7Ci0gICAgY29uc3QgaW50IGh1ZmZtYW5feHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh4c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOwotICAgIGNvbnN0IGludCBodWZmbWFuX3lzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeXNpemUsIGh1ZmZtYW5fcHJlY2lzaW9uKTsKLSAgICBjb25zdCBpbnQgaHVmZm1hbl9waXhzID0gaHVmZm1hbl94c2l6ZSAqIGh1ZmZtYW5feXNpemU7Ci0gICAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShodWZmbWFuX3hzaXplLCBodWZmbWFuX3lzaXplLCAwLCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmaHVmZm1hbl9pbWFnZSkpIHsKLSAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gICAgaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXyA9IGh1ZmZtYW5fcHJlY2lzaW9uOwotICAgIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX3BpeHM7ICsraSkgewotICAgICAgLy8gVGhlIGh1ZmZtYW4gZGF0YSBpcyBzdG9yZWQgaW4gcmVkIGFuZCBncmVlbiBieXRlcy4KLSAgICAgIGNvbnN0IGludCBncm91cCA9IChodWZmbWFuX2ltYWdlW2ldID4+IDgpICYgMHhmZmZmOwotICAgICAgaHVmZm1hbl9pbWFnZVtpXSA9IGdyb3VwOwotICAgICAgaWYgKGdyb3VwID49IG51bV9odHJlZV9ncm91cHMpIHsKLSAgICAgICAgbnVtX2h0cmVlX2dyb3VwcyA9IGdyb3VwICsgMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoYnItPmVycm9yXykgZ290byBFcnJvcjsKLQotICBTQl9EQ0hFQ0sobnVtX2h0cmVlX2dyb3VwcyA8PSAweDEwMDAwKTsKLSAgaHRyZWVfZ3JvdXBzID0KLSAgICAgIChIVHJlZUdyb3VwKilXZWJQU2FmZUNhbGxvYygodWludDY0X3QpbnVtX2h0cmVlX2dyb3VwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmh0cmVlX2dyb3VwcykpOwotICBpZiAoaHRyZWVfZ3JvdXBzID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGZvciAoaSA9IDA7IGkgPCBudW1faHRyZWVfZ3JvdXBzOyArK2kpIHsKLSAgICBIdWZmbWFuVHJlZSogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXBzW2ldLmh0cmVlc187Ci0gICAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7Ci0gICAgICBpbnQgYWxwaGFiZXRfc2l6ZSA9IGtBbHBoYWJldFNpemVbal07Ci0gICAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7Ci0gICAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOwotICAgICAgfQotICAgICAgaWYgKCFSZWFkSHVmZm1hbkNvZGUoYWxwaGFiZXRfc2l6ZSwgZGVjLCBodHJlZXMgKyBqKSkgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICAvLyBBbGwgT0suIEZpbmFsaXplIHBvaW50ZXJzIGFuZCByZXR1cm4uCi0gIGhkci0+aHVmZm1hbl9pbWFnZV8gPSBodWZmbWFuX2ltYWdlOwotICBoZHItPm51bV9odHJlZV9ncm91cHNfID0gbnVtX2h0cmVlX2dyb3VwczsKLSAgaGRyLT5odHJlZV9ncm91cHNfID0gaHRyZWVfZ3JvdXBzOwotICByZXR1cm4gMTsKLQotIEVycm9yOgotICBTYk1lbW9yeURlYWxsb2NhdGUoaHVmZm1hbl9pbWFnZSk7Ci0gIERlbGV0ZUh0cmVlR3JvdXBzKGh0cmVlX2dyb3VwcywgbnVtX2h0cmVlX2dyb3Vwcyk7Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2NhbGluZy4KLQotc3RhdGljIGludCBBbGxvY2F0ZUFuZEluaXRSZXNjYWxlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKLSAgY29uc3QgaW50IG51bV9jaGFubmVscyA9IDQ7Ci0gIGNvbnN0IGludCBpbl93aWR0aCA9IGlvLT5tYl93OwotICBjb25zdCBpbnQgb3V0X3dpZHRoID0gaW8tPnNjYWxlZF93aWR0aDsKLSAgY29uc3QgaW50IGluX2hlaWdodCA9IGlvLT5tYl9oOwotICBjb25zdCBpbnQgb3V0X2hlaWdodCA9IGlvLT5zY2FsZWRfaGVpZ2h0OwotICBjb25zdCB1aW50NjRfdCB3b3JrX3NpemUgPSAyICogbnVtX2NoYW5uZWxzICogKHVpbnQ2NF90KW91dF93aWR0aDsKLSAgaW50MzJfdCogd29yazsgICAgICAgIC8vIFJlc2NhbGVyIHdvcmsgYXJlYS4KLSAgY29uc3QgdWludDY0X3Qgc2NhbGVkX2RhdGFfc2l6ZSA9IG51bV9jaGFubmVscyAqICh1aW50NjRfdClvdXRfd2lkdGg7Ci0gIHVpbnQzMl90KiBzY2FsZWRfZGF0YTsgIC8vIFRlbXBvcmFyeSBzdG9yYWdlIGZvciBzY2FsZWQgQkdSQSBkYXRhLgotICBjb25zdCB1aW50NjRfdCBtZW1vcnlfc2l6ZSA9IHNpemVvZigqZGVjLT5yZXNjYWxlcikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtfc2l6ZSAqIHNpemVvZigqd29yaykgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZF9kYXRhX3NpemUgKiBzaXplb2YoKnNjYWxlZF9kYXRhKTsKLSAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlQ2FsbG9jKG1lbW9yeV9zaXplLCBzaXplb2YoKm1lbW9yeSkpOwotICBpZiAobWVtb3J5ID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgU0JfRENIRUNLKGRlYy0+cmVzY2FsZXJfbWVtb3J5ID09IE5VTEwpOwotICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IG1lbW9yeTsKLQotICBkZWMtPnJlc2NhbGVyID0gKFdlYlBSZXNjYWxlciopbWVtb3J5OwotICBtZW1vcnkgKz0gc2l6ZW9mKCpkZWMtPnJlc2NhbGVyKTsKLSAgd29yayA9IChpbnQzMl90KiltZW1vcnk7Ci0gIG1lbW9yeSArPSB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspOwotICBzY2FsZWRfZGF0YSA9ICh1aW50MzJfdCopbWVtb3J5OwotCi0gIFdlYlBSZXNjYWxlckluaXQoZGVjLT5yZXNjYWxlciwgaW5fd2lkdGgsIGluX2hlaWdodCwgKHVpbnQ4X3QqKXNjYWxlZF9kYXRhLAotICAgICAgICAgICAgICAgICAgIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgIGluX3dpZHRoLCBvdXRfd2lkdGgsIGluX2hlaWdodCwgb3V0X2hlaWdodCwgd29yayk7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRXhwb3J0IHRvIEFSR0IKLQotLy8gV2UgaGF2ZSBzcGVjaWFsICJleHBvcnQiIGZ1bmN0aW9uIHNpbmNlIHdlIG5lZWQgdG8gY29udmVydCBmcm9tIEJHUkEKLXN0YXRpYyBpbnQgRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIsIFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKLSAgICAgICAgICAgICAgICAgIGludCByZ2JhX3N0cmlkZSwgdWludDhfdCogY29uc3QgcmdiYSkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gKGNvbnN0IHVpbnQzMl90KilyZXNjYWxlci0+ZHN0OwotICBjb25zdCBpbnQgZHN0X3dpZHRoID0gcmVzY2FsZXItPmRzdF93aWR0aDsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChyZXNjYWxlcikpIHsKLSAgICB1aW50OF90KiBjb25zdCBkc3QgPSByZ2JhICsgbnVtX2xpbmVzX291dCAqIHJnYmFfc3RyaWRlOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7Ci0gICAgVlA4TENvbnZlcnRGcm9tQkdSQShzcmMsIGRzdF93aWR0aCwgY29sb3JzcGFjZSwgZHN0KTsKLSAgICArK251bV9saW5lc19vdXQ7Ci0gIH0KLSAgcmV0dXJuIG51bV9saW5lc19vdXQ7Ci19Ci0KLS8vIEVtaXQgc2NhbGVkIHJvd3MuCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3MoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YSwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgewotICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2U7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluID0gKGNvbnN0IHVpbnQ4X3QqKWRhdGE7Ci0gIGludCBudW1fbGluZXNfaW4gPSAwOwotICBpbnQgbnVtX2xpbmVzX291dCA9IDA7Ci0gIHdoaWxlIChudW1fbGluZXNfaW4gPCBtYl9oKSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3Qgcm93X2luID0gaW4gKyBudW1fbGluZXNfaW4gKiBpbl9zdHJpZGU7Ci0gICAgdWludDhfdCogY29uc3Qgcm93X291dCA9IG91dCArIG51bV9saW5lc19vdXQgKiBvdXRfc3RyaWRlOwotICAgIG51bV9saW5lc19pbiArPSBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbWJfaCAtIG51bV9saW5lc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19pbiwgaW5fc3RyaWRlKTsKLSAgICBudW1fbGluZXNfb3V0ICs9IEV4cG9ydChkZWMtPnJlc2NhbGVyLCBjb2xvcnNwYWNlLCBvdXRfc3RyaWRlLCByb3dfb3V0KTsKLSAgfQotICByZXR1cm4gbnVtX2xpbmVzX291dDsKLX0KLQotLy8gRW1pdCByb3dzIHdpdGhvdXQgYW55IHNjYWxpbmcuCi1zdGF0aWMgaW50IEVtaXRSb3dzKFdFQlBfQ1NQX01PREUgY29sb3JzcGFjZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRhdGEsIGludCBpbl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbWJfaCwKLSAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgewotICBpbnQgbGluZXMgPSBtYl9oOwotICBjb25zdCB1aW50OF90KiByb3dfaW4gPSAoY29uc3QgdWludDhfdCopZGF0YTsKLSAgdWludDhfdCogcm93X291dCA9IG91dDsKLSAgd2hpbGUgKGxpbmVzLS0gPiAwKSB7Ci0gICAgVlA4TENvbnZlcnRGcm9tQkdSQSgoY29uc3QgdWludDMyX3QqKXJvd19pbiwgbWJfdywgY29sb3JzcGFjZSwgcm93X291dCk7Ci0gICAgcm93X2luICs9IGluX3N0cmlkZTsKLSAgICByb3dfb3V0ICs9IG91dF9zdHJpZGU7Ci0gIH0KLSAgcmV0dXJuIG1iX2g7ICAvLyBOdW0gcm93cyBvdXQgPT0gbnVtIHJvd3MgaW4uCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHBvcnQgdG8gWVVWQQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0VG9ZVVZBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMsIGludCB3aWR0aCwgaW50IHlfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQpIHsKLSAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuWVVWQTsKLSAgLy8gZmlyc3QsIHRoZSBsdW1hIHBsYW5lCi0gIHsKLSAgICBpbnQgaTsKLSAgICB1aW50OF90KiBjb25zdCB5ID0gYnVmLT55ICsgeV9wb3MgKiBidWYtPnlfc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwID0gc3JjW2ldOwotICAgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+IDApICYgMHhmZik7Ci0gICAgfQotICB9Ci0KLSAgLy8gdGhlbiBVL1YgcGxhbmVzCi0gIHsKLSAgICB1aW50OF90KiBjb25zdCB1ID0gYnVmLT51ICsgKHlfcG9zID4+IDEpICogYnVmLT51X3N0cmlkZTsKLSAgICB1aW50OF90KiBjb25zdCB2ID0gYnVmLT52ICsgKHlfcG9zID4+IDEpICogYnVmLT52X3N0cmlkZTsKLSAgICBjb25zdCBpbnQgdXZfd2lkdGggPSB3aWR0aCA+PiAxOwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB1dl93aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCB2MCA9IHNyY1syICogaSArIDBdOwotICAgICAgY29uc3QgdWludDMyX3QgdjEgPSBzcmNbMiAqIGkgKyAxXTsKLSAgICAgIC8vIFZQOFJHQlRvVS9WIGV4cGVjdHMgZm91ciBhY2N1bXVsYXRlZCBwaXhlbHMuIEhlbmNlIHdlIG5lZWQgdG8KLSAgICAgIC8vIHNjYWxlIHIvZy9iIHZhbHVlIGJ5IGEgZmFjdG9yIDIuIFdlIGp1c3Qgc2hpZnQgdjAvdjEgb25lIGJpdCBsZXNzLgotICAgICAgY29uc3QgaW50IHIgPSAoKHYwID4+IDE1KSAmIDB4MWZlKSArICgodjEgPj4gMTUpICYgMHgxZmUpOwotICAgICAgY29uc3QgaW50IGcgPSAoKHYwID4+ICA3KSAmIDB4MWZlKSArICgodjEgPj4gIDcpICYgMHgxZmUpOwotICAgICAgY29uc3QgaW50IGIgPSAoKHYwIDw8ICAxKSAmIDB4MWZlKSArICgodjEgPDwgIDEpICYgMHgxZmUpOwotICAgICAgaWYgKCEoeV9wb3MgJiAxKSkgeyAgLy8gZXZlbiBsaW5lczogc3RvcmUgdmFsdWVzCi0gICAgICAgIHVbaV0gPSBWUDhSR0JUb1UociwgZywgYik7Ci0gICAgICAgIHZbaV0gPSBWUDhSR0JUb1YociwgZywgYik7Ci0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAvLyBvZGQgbGluZXM6IGF2ZXJhZ2Ugd2l0aCBwcmV2aW91cyB2YWx1ZXMKLSAgICAgICAgY29uc3QgaW50IHRtcF91ID0gVlA4UkdCVG9VKHIsIGcsIGIpOwotICAgICAgICBjb25zdCBpbnQgdG1wX3YgPSBWUDhSR0JUb1YociwgZywgYik7Ci0gICAgICAgIC8vIEFwcHJveGltYXRlZCBhdmVyYWdlLW9mLWZvdXIuIEJ1dCBpdCdzIGFuIGFjY2VwdGFibGUgZGlmZi4KLSAgICAgICAgdVtpXSA9ICh1W2ldICsgdG1wX3UgKyAxKSA+PiAxOwotICAgICAgICB2W2ldID0gKHZbaV0gKyB0bXBfdiArIDEpID4+IDE7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh3aWR0aCAmIDEpIHsgICAgICAgLy8gbGFzdCBwaXhlbAotICAgICAgY29uc3QgdWludDMyX3QgdjAgPSBzcmNbMiAqIGkgKyAwXTsKLSAgICAgIGNvbnN0IGludCByID0gKHYwID4+IDE0KSAmIDB4M2ZjOwotICAgICAgY29uc3QgaW50IGcgPSAodjAgPj4gIDYpICYgMHgzZmM7Ci0gICAgICBjb25zdCBpbnQgYiA9ICh2MCA8PCAgMikgJiAweDNmYzsKLSAgICAgIGlmICghKHlfcG9zICYgMSkpIHsgIC8vIGV2ZW4gbGluZXMKLSAgICAgICAgdVtpXSA9IFZQOFJHQlRvVShyLCBnLCBiKTsKLSAgICAgICAgdltpXSA9IFZQOFJHQlRvVihyLCBnLCBiKTsKLSAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgIC8vIG9kZCBsaW5lcyAobm90ZTogd2UgY291bGQganVzdCBza2lwIHRoaXMpCi0gICAgICAgIGNvbnN0IGludCB0bXBfdSA9IFZQOFJHQlRvVShyLCBnLCBiKTsKLSAgICAgICAgY29uc3QgaW50IHRtcF92ID0gVlA4UkdCVG9WKHIsIGcsIGIpOwotICAgICAgICB1W2ldID0gKHVbaV0gKyB0bXBfdSArIDEpID4+IDE7Ci0gICAgICAgIHZbaV0gPSAodltpXSArIHRtcF92ICsgMSkgPj4gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLy8gTGFzdGx5LCBzdG9yZSBhbHBoYSBpZiBuZWVkZWQuCi0gIGlmIChidWYtPmEgIT0gTlVMTCkgewotICAgIGludCBpOwotICAgIHVpbnQ4X3QqIGNvbnN0IGEgPSBidWYtPmEgKyB5X3BvcyAqIGJ1Zi0+YV9zdHJpZGU7Ci0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIGFbaV0gPSAoc3JjW2ldID4+IDI0KTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEV4cG9ydFlVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHlfcG9zKSB7Ci0gIFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIgPSBkZWMtPnJlc2NhbGVyOwotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gKGNvbnN0IHVpbnQzMl90KilyZXNjYWxlci0+ZHN0OwotICBjb25zdCBpbnQgZHN0X3dpZHRoID0gcmVzY2FsZXItPmRzdF93aWR0aDsKLSAgaW50IG51bV9saW5lc19vdXQgPSAwOwotICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChyZXNjYWxlcikpIHsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOwotICAgIENvbnZlcnRUb1lVVkEoc3JjLCBkc3Rfd2lkdGgsIHlfcG9zLCBkZWMtPm91dHB1dF8pOwotICAgICsreV9wb3M7Ci0gICAgKytudW1fbGluZXNfb3V0OwotICB9Ci0gIHJldHVybiBudW1fbGluZXNfb3V0OwotfQotCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3NZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5fc3RyaWRlLCBpbnQgbWJfaCkgewotICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9IChjb25zdCB1aW50OF90KilkYXRhOwotICBpbnQgbnVtX2xpbmVzX2luID0gMDsKLSAgaW50IHlfcG9zID0gZGVjLT5sYXN0X291dF9yb3dfOwotICB3aGlsZSAobnVtX2xpbmVzX2luIDwgbWJfaCkgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvd19pbiA9IGluICsgbnVtX2xpbmVzX2luICogaW5fc3RyaWRlOwotICAgIG51bV9saW5lc19pbiArPSBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbWJfaCAtIG51bV9saW5lc19pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19pbiwgaW5fc3RyaWRlKTsKLSAgICB5X3BvcyArPSBFeHBvcnRZVVZBKGRlYywgeV9wb3MpOwotICB9Ci0gIHJldHVybiB5X3BvczsKLX0KLQotc3RhdGljIGludCBFbWl0Um93c1lVVkEoY29uc3QgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkYXRhLCBpbnQgaW5fc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1iX3csIGludCBudW1fcm93cykgewotICBpbnQgeV9wb3MgPSBkZWMtPmxhc3Rfb3V0X3Jvd187Ci0gIGNvbnN0IHVpbnQ4X3QqIHJvd19pbiA9IChjb25zdCB1aW50OF90KilkYXRhOwotICB3aGlsZSAobnVtX3Jvd3MtLSA+IDApIHsKLSAgICBDb252ZXJ0VG9ZVVZBKChjb25zdCB1aW50MzJfdCopcm93X2luLCBtYl93LCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKLSAgICByb3dfaW4gKz0gaW5fc3RyaWRlOwotICAgICsreV9wb3M7Ci0gIH0KLSAgcmV0dXJuIHlfcG9zOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ3JvcHBpbmcuCi0KLS8vIFNldHMgaW8tPm1iX3ksIGlvLT5tYl9oICYgaW8tPm1iX3cgYWNjb3JkaW5nIHRvIHN0YXJ0IHJvdywgZW5kIHJvdyBhbmQKLS8vIGNyb3Agb3B0aW9ucy4gQWxzbyB1cGRhdGVzIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIsIHNvIHRoYXQgaXQgcG9pbnRzIHRvIHRoZQotLy8gc3RhcnQgb2YgdGhlIGNyb3BwZWQgd2luZG93LgotLy8gTm90ZSB0aGF0ICdwaXhlbF9zdHJpZGUnIGlzIGluIHVuaXRzIG9mICd1aW50MzJfdCcgKGFuZCBub3QgJ2J5dGVzKS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3JvcCB3aW5kb3cgaXMgbm90IGVtcHR5Lgotc3RhdGljIGludCBTZXRDcm9wV2luZG93KFZQOElvKiBjb25zdCBpbywgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCoqIGNvbnN0IGluX2RhdGEsIGludCBwaXhlbF9zdHJpZGUpIHsKLSAgU0JfRENIRUNLKHlfc3RhcnQgPCB5X2VuZCk7Ci0gIFNCX0RDSEVDSyhpby0+Y3JvcF9sZWZ0IDwgaW8tPmNyb3BfcmlnaHQpOwotICBpZiAoeV9lbmQgPiBpby0+Y3JvcF9ib3R0b20pIHsKLSAgICB5X2VuZCA9IGlvLT5jcm9wX2JvdHRvbTsgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBvbiBsYXN0IHJvdy4KLSAgfQotICBpZiAoeV9zdGFydCA8IGlvLT5jcm9wX3RvcCkgewotICAgIGNvbnN0IGludCBkZWx0YSA9IGlvLT5jcm9wX3RvcCAtIHlfc3RhcnQ7Ci0gICAgeV9zdGFydCA9IGlvLT5jcm9wX3RvcDsKLSAgICAqaW5fZGF0YSArPSBwaXhlbF9zdHJpZGUgKiBkZWx0YTsKLSAgfQotICBpZiAoeV9zdGFydCA+PSB5X2VuZCkgcmV0dXJuIDA7ICAvLyBDcm9wIHdpbmRvdyBpcyBlbXB0eS4KLQotICAqaW5fZGF0YSArPSBpby0+Y3JvcF9sZWZ0OwotCi0gIGlvLT5tYl95ID0geV9zdGFydCAtIGlvLT5jcm9wX3RvcDsKLSAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7Ci0gIGlvLT5tYl9oID0geV9lbmQgLSB5X3N0YXJ0OwotICByZXR1cm4gMTsgIC8vIE5vbi1lbXB0eSBjcm9wIHdpbmRvdy4KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNZXRhSW5kZXgoCi0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgeHNpemUsIGludCBiaXRzLCBpbnQgeCwgaW50IHkpIHsKLSAgaWYgKGJpdHMgPT0gMCkgcmV0dXJuIDA7Ci0gIHJldHVybiBpbWFnZVt4c2l6ZSAqICh5ID4+IGJpdHMpICsgKHggPj4gYml0cyldOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgSFRyZWVHcm91cCogR2V0SHRyZWVHcm91cEZvclBvcyhWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSkgewotICBjb25zdCBpbnQgbWV0YV9pbmRleCA9IEdldE1ldGFJbmRleChoZHItPmh1ZmZtYW5faW1hZ2VfLCBoZHItPmh1ZmZtYW5feHNpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfLCB4LCB5KTsKLSAgU0JfRENIRUNLKG1ldGFfaW5kZXggPCBoZHItPm51bV9odHJlZV9ncm91cHNfKTsKLSAgcmV0dXJuIGhkci0+aHRyZWVfZ3JvdXBzXyArIG1ldGFfaW5kZXg7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGxvb3AsIHdpdGggY3VzdG9tIHJvdy1wcm9jZXNzaW5nIGZ1bmN0aW9uCi0KLXR5cGVkZWYgdm9pZCAoKlByb2Nlc3NSb3dzRnVuYykoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdyk7Ci0KLXN0YXRpYyB2b2lkIEFwcGx5SW52ZXJzZVRyYW5zZm9ybXMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cykgewotICBpbnQgbiA9IGRlYy0+bmV4dF90cmFuc2Zvcm1fOwotICBjb25zdCBpbnQgY2FjaGVfcGl4cyA9IGRlYy0+d2lkdGhfICogbnVtX3Jvd3M7Ci0gIGNvbnN0IGludCBzdGFydF9yb3cgPSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgaW50IGVuZF9yb3cgPSBzdGFydF9yb3cgKyBudW1fcm93czsKLSAgY29uc3QgdWludDMyX3QqIHJvd3NfaW4gPSByb3dzOwotICB1aW50MzJfdCogY29uc3Qgcm93c19vdXQgPSBkZWMtPmFyZ2JfY2FjaGVfOwotCi0gIC8vIEludmVyc2UgdHJhbnNmb3Jtcy4KLSAgLy8gVE9ETzogbW9zdCB0cmFuc2Zvcm1zIG9ubHkgbmVlZCB0byBvcGVyYXRlIG9uIHRoZSBjcm9wcGVkIHJlZ2lvbiBvbmx5LgotICBTYk1lbW9yeUNvcHkocm93c19vdXQsIHJvd3NfaW4sIGNhY2hlX3BpeHMgKiBzaXplb2YoKnJvd3Nfb3V0KSk7Ci0gIHdoaWxlIChuLS0gPiAwKSB7Ci0gICAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bbl07Ci0gICAgVlA4TEludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCBzdGFydF9yb3csIGVuZF9yb3csIHJvd3NfaW4sIHJvd3Nfb3V0KTsKLSAgICByb3dzX2luID0gcm93c19vdXQ7Ci0gIH0KLX0KLQotLy8gU3BlY2lhbCBtZXRob2QgZm9yIHBhbGV0dGVkIGFscGhhIGRhdGEuCi1zdGF0aWMgdm9pZCBBcHBseUludmVyc2VUcmFuc2Zvcm1zQWxwaGEoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IG51bV9yb3dzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvd3MpIHsKLSAgY29uc3QgaW50IHN0YXJ0X3JvdyA9IGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCBpbnQgZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOwotICBjb25zdCB1aW50OF90KiByb3dzX2luID0gcm93czsKLSAgdWludDhfdCogcm93c19vdXQgPSAodWludDhfdCopZGVjLT5pb18tPm9wYXF1ZSArIGRlYy0+aW9fLT53aWR0aCAqIHN0YXJ0X3JvdzsKLSAgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtID0gJmRlYy0+dHJhbnNmb3Jtc19bMF07Ci0gIFNCX0RDSEVDSyhkZWMtPm5leHRfdHJhbnNmb3JtXyA9PSAxKTsKLSAgU0JfRENIRUNLKHRyYW5zZm9ybS0+dHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNKTsKLSAgVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEodHJhbnNmb3JtLCBzdGFydF9yb3csIGVuZF9yb3csIHJvd3NfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvd3Nfb3V0KTsKLX0KLQotLy8gUHJvY2Vzc2VzICh0cmFuc2Zvcm1zLCBzY2FsZXMgJiBjb2xvci1jb252ZXJ0cykgdGhlIHJvd3MgZGVjb2RlZCBhZnRlciB0aGUKLS8vIGxhc3QgY2FsbC4KLXN0YXRpYyB2b2lkIFByb2Nlc3NSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCByb3cpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHJvd3MgPSBkZWMtPnBpeGVsc18gKyBkZWMtPndpZHRoXyAqIGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKLQotICBpZiAobnVtX3Jvd3MgPD0gMCkgcmV0dXJuOyAgLy8gTm90aGluZyB0byBiZSBkb25lLgotICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIHJvd3MpOwotCi0gIC8vIEVtaXQgb3V0cHV0LgotICB7Ci0gICAgVlA4SW8qIGNvbnN0IGlvID0gZGVjLT5pb187Ci0gICAgY29uc3QgdWludDMyX3QqIHJvd3NfZGF0YSA9IGRlYy0+YXJnYl9jYWNoZV87Ci0gICAgaWYgKCFTZXRDcm9wV2luZG93KGlvLCBkZWMtPmxhc3Rfcm93Xywgcm93LCAmcm93c19kYXRhLCBpby0+d2lkdGgpKSB7Ci0gICAgICAvLyBOb3RoaW5nIHRvIG91dHB1dCAodGhpcyB0aW1lKS4KLSAgICB9IGVsc2UgewotICAgICAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0ID0gZGVjLT5vdXRwdXRfOwotICAgICAgY29uc3QgaW50IGluX3N0cmlkZSA9IGlvLT53aWR0aCAqIHNpemVvZigqcm93c19kYXRhKTsKLSAgICAgIGlmIChvdXRwdXQtPmNvbG9yc3BhY2UgPCBNT0RFX1lVVikgeyAgLy8gY29udmVydCB0byBSR0JBCi0gICAgICAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEgPSBidWYtPnJnYmEgKyBkZWMtPmxhc3Rfb3V0X3Jvd18gKiBidWYtPnN0cmlkZTsKLSAgICAgICAgY29uc3QgaW50IG51bV9yb3dzX291dCA9IGlvLT51c2Vfc2NhbGluZyA/Ci0gICAgICAgICAgICBFbWl0UmVzY2FsZWRSb3dzKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JhLCBidWYtPnN0cmlkZSkgOgotICAgICAgICAgICAgRW1pdFJvd3Mob3V0cHV0LT5jb2xvcnNwYWNlLCByb3dzX2RhdGEsIGluX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBpby0+bWJfaCwgcmdiYSwgYnVmLT5zdHJpZGUpOwotICAgICAgICAvLyBVcGRhdGUgJ2xhc3Rfb3V0X3Jvd18nLgotICAgICAgICBkZWMtPmxhc3Rfb3V0X3Jvd18gKz0gbnVtX3Jvd3Nfb3V0OwotICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHRvIFlVVkEKLSAgICAgICAgZGVjLT5sYXN0X291dF9yb3dfID0gaW8tPnVzZV9zY2FsaW5nID8KLSAgICAgICAgICAgIEVtaXRSZXNjYWxlZFJvd3NZVVZBKGRlYywgcm93c19kYXRhLCBpbl9zdHJpZGUsIGlvLT5tYl9oKSA6Ci0gICAgICAgICAgICBFbWl0Um93c1lVVkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX3csIGlvLT5tYl9oKTsKLSAgICAgIH0KLSAgICAgIFNCX0RDSEVDSyhkZWMtPmxhc3Rfb3V0X3Jvd18gPD0gb3V0cHV0LT5oZWlnaHQpOwotICAgIH0KLSAgfQotCi0gIC8vIFVwZGF0ZSAnbGFzdF9yb3dfJy4KLSAgZGVjLT5sYXN0X3Jvd18gPSByb3c7Ci0gIFNCX0RDSEVDSyhkZWMtPmxhc3Rfcm93XyA8PSBkZWMtPmhlaWdodF8pOwotfQotCi0jZGVmaW5lIERFQ09ERV9EQVRBX0ZVTkMoRlVOQ19OQU1FLCBUWVBFLCBTVE9SRV9QSVhFTCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIGludCBGVU5DX05BTUUoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVFlQRSogY29uc3QgZGF0YSwgaW50IHdpZHRoLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIFByb2Nlc3NSb3dzRnVuYyBwcm9jZXNzX2Z1bmMpIHsgICAgICAgICAgICAgICBcCi0gIGludCBvayA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbnQgY29sID0gMCwgcm93ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBIVHJlZUdyb3VwKiBodHJlZV9ncm91cCA9IGhkci0+aHRyZWVfZ3JvdXBzXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVFlQRSogc3JjID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRZUEUqIGxhc3RfY2FjaGVkID0gZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBUWVBFKiBjb25zdCBzcmNfZW5kID0gZGF0YSArIHdpZHRoICogaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGxlbl9jb2RlX2xpbWl0ID0gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTOyAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBjb2xvcl9jYWNoZV9saW1pdCA9IGxlbl9jb2RlX2xpbWl0ICsgaGRyLT5jb2xvcl9jYWNoZV9zaXplXzsgICAgICAgXAotICBWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIChoZHItPmNvbG9yX2NhY2hlX3NpemVfID4gMCkgPyAmaGRyLT5jb2xvcl9jYWNoZV8gOiBOVUxMOyAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBtYXNrID0gaGRyLT5odWZmbWFuX21hc2tfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0soaHRyZWVfZ3JvdXAgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgd2hpbGUgKCFici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC8qIE9ubHkgdXBkYXRlIHdoZW4gY2hhbmdpbmcgdGlsZS4gTm90ZSB3ZSBjb3VsZCB1c2UgdGhpcyB0ZXN0OiAgICAgICAgKi8gIFwKLSAgICAvKiBpZiAiKCgoKHByZXZfY29sIF4gY29sKSB8IHByZXZfcm93IF4gcm93KSkgPiBtYXNrKSIgLT4gdGlsZSBjaGFuZ2VkICovICBcCi0gICAgLyogYnV0IHRoYXQncyBhY3R1YWxseSBzbG93ZXIgYW5kIG5lZWRzIHN0b3JpbmcgdGhlIHByZXZpb3VzIGNvbC9yb3cuICAqLyAgXAotICAgIGlmICgoY29sICYgbWFzaykgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2RlID0gUmVhZFN5bWJvbCgmaHRyZWVfZ3JvdXAtPmh0cmVlc19bR1JFRU5dLCBicik7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGNvZGUgPCBOVU1fTElURVJBTF9DT0RFUykgeyAgLyogTGl0ZXJhbCovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaW50IHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlZCA9IFJlYWRTeW1ib2woJmh0cmVlX2dyb3VwLT5odHJlZXNfW1JFRF0sIGJyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBncmVlbiA9IGNvZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGJsdWUgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tCTFVFXSwgYnIpOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBhbHBoYSA9IFJlYWRTeW1ib2woJmh0cmVlX2dyb3VwLT5odHJlZXNfW0FMUEhBXSwgYnIpOyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKnNyYyA9IFNUT1JFX1BJWEVMKGFscGhhLCByZWQsIGdyZWVuLCBibHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBBZHZhbmNlQnlPbmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICArK3NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgKytjb2w7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChjb2wgPj0gd2lkdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsgICAgICBcCi0gICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgaWYgKGNvZGUgPCBsZW5fY29kZV9saW1pdCkgeyAgLyogQmFja3dhcmQgcmVmZXJlbmNlICovICAgICAgICAgICAgICBcCi0gICAgICBpbnQgZGlzdF9jb2RlLCBkaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgaW50IGxlbmd0aF9zeW0gPSBjb2RlIC0gTlVNX0xJVEVSQUxfQ09ERVM7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IGludCBsZW5ndGggPSBHZXRDb3B5TGVuZ3RoKGxlbmd0aF9zeW0sIGJyKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBpbnQgZGlzdF9zeW1ib2wgPSBSZWFkU3ltYm9sKCZodHJlZV9ncm91cC0+aHRyZWVzX1tESVNUXSwgYnIpOyAgICAgXAotICAgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRpc3RfY29kZSA9IEdldENvcHlEaXN0YW5jZShkaXN0X3N5bWJvbCwgYnIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBkaXN0ID0gUGxhbmVDb2RlVG9EaXN0YW5jZSh3aWR0aCwgZGlzdF9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKHNyYyAtIGRhdGEgPCBkaXN0IHx8IHNyY19lbmQgLSBzcmMgPCBsZW5ndGgpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdvdG8gRW5kOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHNyY1tpXSA9IHNyY1tpIC0gZGlzdF07ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc3JjICs9IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29sICs9IGxlbmd0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlIChjb2wgPj0gd2lkdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbCAtPSB3aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICArK3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgJiYgKHJvdyAlIE5VTV9BUkdCX0NBQ0hFX1JPV1MgPT0gMCkpIHsgICAgICBcCi0gICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoc3JjIDwgc3JjX2VuZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoY29sb3JfY2FjaGUsICpsYXN0X2NhY2hlZCsrKTsgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgaWYgKGNvZGUgPCBjb2xvcl9jYWNoZV9saW1pdCkgeyAgLyogQ29sb3IgY2FjaGUgKi8gICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBpbnQga2V5ID0gY29kZSAtIGxlbl9jb2RlX2xpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU0JfRENIRUNLKGNvbG9yX2NhY2hlICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHdoaWxlIChsYXN0X2NhY2hlZCA8IHNyYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICpzcmMgPSBWUDhMQ29sb3JDYWNoZUxvb2t1cChjb2xvcl9jYWNoZSwga2V5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBnb3RvIEFkdmFuY2VCeU9uZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gZWxzZSB7ICAvKiBOb3QgcmVhY2hlZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBnb3RvIEVuZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvayA9ICFici0+ZXJyb3JfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFvaykgZ290byBFbmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4gKi8gICAgICAgICAgICBcCi0gIGlmIChwcm9jZXNzX2Z1bmMgIT0gTlVMTCkgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotRW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJyLT5lcnJvcl8gfHwgIW9rIHx8IChici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSkgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRlYy0+c3RhdHVzXyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKCFici0+ZW9zXykgPyBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiA6IFZQOF9TVEFUVVNfU1VTUEVOREVEOyAgICAgICBcCi0gIH0gZWxzZSBpZiAoc3JjID09IHNyY19lbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGRlYy0+c3RhdGVfID0gUkVBRF9EQVRBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJldHVybiBvazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QVJHQlBpeGVsKGludCBhbHBoYSwgaW50IHJlZCwgaW50IGdyZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmx1ZSkgewotICByZXR1cm4gKGFscGhhIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgYmx1ZTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgR2V0QWxwaGFQaXhlbChpbnQgYWxwaGEsIGludCByZWQsIGludCBncmVlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsdWUpIHsKLSAgKHZvaWQpYWxwaGE7Ci0gICh2b2lkKXJlZDsKLSAgKHZvaWQpYmx1ZTsKLSAgcmV0dXJuIGdyZWVuOyAgLy8gQWxwaGEgdmFsdWUgaXMgc3RvcmVkIGluIGdyZWVuIGNoYW5uZWwuCi19Ci0KLURFQ09ERV9EQVRBX0ZVTkMoRGVjb2RlSW1hZ2VEYXRhLCB1aW50MzJfdCwgR2V0QVJHQlBpeGVsKQotREVDT0RFX0RBVEFfRlVOQyhEZWNvZGVBbHBoYURhdGEsIHVpbnQ4X3QsIEdldEFscGhhUGl4ZWwpCi0KLSN1bmRlZiBERUNPREVfREFUQV9GVU5DCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMVHJhbnNmb3JtCi0KLXN0YXRpYyB2b2lkIENsZWFyVHJhbnNmb3JtKFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSkgewotICBTYk1lbW9yeURlYWxsb2NhdGUodHJhbnNmb3JtLT5kYXRhXyk7Ci0gIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOwotfQotCi0vLyBGb3Igc2VjdXJpdHkgcmVhc29uLCB3ZSBuZWVkIHRvIHJlbWFwIHRoZSBjb2xvciBtYXAgdG8gc3BhbgotLy8gdGhlIHRvdGFsIHBvc3NpYmxlIGJ1bmRsZWQgdmFsdWVzLCBhbmQgbm90IGp1c3QgdGhlIG51bV9jb2xvcnMuCi1zdGF0aWMgaW50IEV4cGFuZENvbG9yTWFwKGludCBudW1fY29sb3JzLCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKLSAgaW50IGk7Ci0gIGNvbnN0IGludCBmaW5hbF9udW1fY29sb3JzID0gMSA8PCAoOCA+PiB0cmFuc2Zvcm0tPmJpdHNfKTsKLSAgdWludDMyX3QqIGNvbnN0IG5ld19jb2xvcl9tYXAgPQotICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpZmluYWxfbnVtX2NvbG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpuZXdfY29sb3JfbWFwKSk7Ci0gIGlmIChuZXdfY29sb3JfbWFwID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBjb25zdCBkYXRhID0gKHVpbnQ4X3QqKXRyYW5zZm9ybS0+ZGF0YV87Ci0gICAgdWludDhfdCogY29uc3QgbmV3X2RhdGEgPSAodWludDhfdCopbmV3X2NvbG9yX21hcDsKLSAgICBuZXdfY29sb3JfbWFwWzBdID0gdHJhbnNmb3JtLT5kYXRhX1swXTsKLSAgICBmb3IgKGkgPSA0OyBpIDwgNCAqIG51bV9jb2xvcnM7ICsraSkgewotICAgICAgLy8gRXF1aXZhbGVudCB0byBBZGRQaXhlbEVxKCksIG9uIGEgYnl0ZS1iYXNpcy4KLSAgICAgIG5ld19kYXRhW2ldID0gKGRhdGFbaV0gKyBuZXdfZGF0YVtpIC0gNF0pICYgMHhmZjsKLSAgICB9Ci0gICAgZm9yICg7IGkgPCA0ICogZmluYWxfbnVtX2NvbG9yczsgKytpKQotICAgICAgbmV3X2RhdGFbaV0gPSAwOyAgLy8gYmxhY2sgdGFpbC4KLSAgICBTYk1lbW9yeURlYWxsb2NhdGUodHJhbnNmb3JtLT5kYXRhXyk7Ci0gICAgdHJhbnNmb3JtLT5kYXRhXyA9IG5ld19jb2xvcl9tYXA7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgUmVhZFRyYW5zZm9ybShpbnQqIGNvbnN0IHhzaXplLCBpbnQgY29uc3QqIHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaW50IG9rID0gMTsKLSAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIFZQOExUcmFuc2Zvcm0qIHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfW2RlYy0+bmV4dF90cmFuc2Zvcm1fXTsKLSAgY29uc3QgVlA4TEltYWdlVHJhbnNmb3JtVHlwZSB0eXBlID0KLSAgICAgIChWUDhMSW1hZ2VUcmFuc2Zvcm1UeXBlKVZQOExSZWFkQml0cyhiciwgMik7Ci0KLSAgLy8gRWFjaCB0cmFuc2Zvcm0gdHlwZSBjYW4gb25seSBiZSBwcmVzZW50IG9uY2UgaW4gdGhlIHN0cmVhbS4KLSAgaWYgKGRlYy0+dHJhbnNmb3Jtc19zZWVuXyAmICgxVSA8PCB0eXBlKSkgewotICAgIHJldHVybiAwOyAgLy8gQWxyZWFkeSB0aGVyZSwgbGV0J3Mgbm90IGFjY2VwdCB0aGUgc2Vjb25kIHNhbWUgdHJhbnNmb3JtLgotICB9Ci0gIGRlYy0+dHJhbnNmb3Jtc19zZWVuXyB8PSAoMVUgPDwgdHlwZSk7Ci0KLSAgdHJhbnNmb3JtLT50eXBlXyA9IHR5cGU7Ci0gIHRyYW5zZm9ybS0+eHNpemVfID0gKnhzaXplOwotICB0cmFuc2Zvcm0tPnlzaXplXyA9ICp5c2l6ZTsKLSAgdHJhbnNmb3JtLT5kYXRhXyA9IE5VTEw7Ci0gICsrZGVjLT5uZXh0X3RyYW5zZm9ybV87Ci0gIFNCX0RDSEVDSyhkZWMtPm5leHRfdHJhbnNmb3JtXyA8PSBOVU1fVFJBTlNGT1JNUyk7Ci0KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBQUkVESUNUT1JfVFJBTlNGT1JNOgotICAgIGNhc2UgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNOgotICAgICAgdHJhbnNmb3JtLT5iaXRzXyA9IFZQOExSZWFkQml0cyhiciwgMykgKyAyOwotICAgICAgb2sgPSBEZWNvZGVJbWFnZVN0cmVhbShWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKHRyYW5zZm9ybS0+eXNpemVfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0tPmJpdHNfKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STTogewotICAgICAgIGNvbnN0IGludCBudW1fY29sb3JzID0gVlA4TFJlYWRCaXRzKGJyLCA4KSArIDE7Ci0gICAgICAgY29uc3QgaW50IGJpdHMgPSAobnVtX2NvbG9ycyA+IDE2KSA/IDAKLSAgICAgICAgICAgICAgICAgICAgICA6IChudW1fY29sb3JzID4gNCkgPyAxCi0gICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDIpID8gMgotICAgICAgICAgICAgICAgICAgICAgIDogMzsKLSAgICAgICAqeHNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywgYml0cyk7Ci0gICAgICAgdHJhbnNmb3JtLT5iaXRzXyA9IGJpdHM7Ci0gICAgICAgb2sgPSBEZWNvZGVJbWFnZVN0cmVhbShudW1fY29sb3JzLCAxLCAwLCBkZWMsICZ0cmFuc2Zvcm0tPmRhdGFfKTsKLSAgICAgICBvayA9IG9rICYmIEV4cGFuZENvbG9yTWFwKG51bV9jb2xvcnMsIHRyYW5zZm9ybSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBTVUJUUkFDVF9HUkVFTjoKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBTQl9EQ0hFQ0soMCk7ICAgIC8vIGNhbid0IGhhcHBlbgotICAgICAgYnJlYWs7Ci0gIH0KLQotICByZXR1cm4gb2s7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMTWV0YWRhdGEKLQotc3RhdGljIHZvaWQgSW5pdE1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7Ci0gIFNCX0RDSEVDSyhoZHIpOwotICBTYk1lbW9yeVNldChoZHIsIDAsIHNpemVvZigqaGRyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIENsZWFyTWV0YWRhdGEoVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIpIHsKLSAgU0JfRENIRUNLKGhkcik7Ci0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhkci0+aHVmZm1hbl9pbWFnZV8pOwotICBEZWxldGVIdHJlZUdyb3VwcyhoZHItPmh0cmVlX2dyb3Vwc18sIGhkci0+bnVtX2h0cmVlX2dyb3Vwc18pOwotICBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoZHItPmNvbG9yX2NhY2hlXyk7Ci0gIEluaXRNZXRhZGF0YShoZHIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TERlY29kZXIKLQotVlA4TERlY29kZXIqIFZQOExOZXcodm9pZCkgewotICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmRlYykpOwotICBpZiAoZGVjID09IE5VTEwpIHJldHVybiBOVUxMOwotICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOwotICBkZWMtPmFjdGlvbl8gPSBSRUFEX0RJTTsKLSAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKLSAgcmV0dXJuIGRlYzsKLX0KLQotdm9pZCBWUDhMQ2xlYXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgewotICBpbnQgaTsKLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm47Ci0gIENsZWFyTWV0YWRhdGEoJmRlYy0+aGRyXyk7Ci0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYy0+cGl4ZWxzXyk7Ci0gIGRlYy0+cGl4ZWxzXyA9IE5VTEw7Ci0gIGZvciAoaSA9IDA7IGkgPCBkZWMtPm5leHRfdHJhbnNmb3JtXzsgKytpKSB7Ci0gICAgQ2xlYXJUcmFuc2Zvcm0oJmRlYy0+dHJhbnNmb3Jtc19baV0pOwotICB9Ci0gIGRlYy0+bmV4dF90cmFuc2Zvcm1fID0gMDsKLSAgZGVjLT50cmFuc2Zvcm1zX3NlZW5fID0gMDsKLQotICBTYk1lbW9yeURlYWxsb2NhdGUoZGVjLT5yZXNjYWxlcl9tZW1vcnkpOwotICBkZWMtPnJlc2NhbGVyX21lbW9yeSA9IE5VTEw7Ci0KLSAgZGVjLT5vdXRwdXRfID0gTlVMTDsgICAvLyBsZWF2ZSBubyB0cmFjZSBiZWhpbmQKLX0KLQotdm9pZCBWUDhMRGVsZXRlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgaWYgKGRlYyAhPSBOVUxMKSB7Ci0gICAgVlA4TENsZWFyKGRlYyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGRlYyk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVXBkYXRlRGVjb2RlcihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOwotICBjb25zdCBpbnQgbnVtX2JpdHMgPSBoZHItPmh1ZmZtYW5fc3Vic2FtcGxlX2JpdHNfOwotICBkZWMtPndpZHRoXyA9IHdpZHRoOwotICBkZWMtPmhlaWdodF8gPSBoZWlnaHQ7Ci0KLSAgaGRyLT5odWZmbWFuX3hzaXplXyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBudW1fYml0cyk7Ci0gIGhkci0+aHVmZm1hbl9tYXNrXyA9IChudW1fYml0cyA9PSAwKSA/IH4wIDogKDEgPDwgbnVtX2JpdHMpIC0gMTsKLX0KLQotc3RhdGljIGludCBEZWNvZGVJbWFnZVN0cmVhbShpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2xldmVsMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TERlY29kZXIqIGNvbnN0IGRlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqKiBjb25zdCBkZWNvZGVkX2RhdGEpIHsKLSAgaW50IG9rID0gMTsKLSAgaW50IHRyYW5zZm9ybV94c2l6ZSA9IHhzaXplOwotICBpbnQgdHJhbnNmb3JtX3lzaXplID0geXNpemU7Ci0gIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87Ci0gIHVpbnQzMl90KiBkYXRhID0gTlVMTDsKLSAgaW50IGNvbG9yX2NhY2hlX2JpdHMgPSAwOwotCi0gIC8vIFJlYWQgdGhlIHRyYW5zZm9ybXMgKG1heSByZWN1cnNlKS4KLSAgaWYgKGlzX2xldmVsMCkgewotICAgIHdoaWxlIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7Ci0gICAgICBvayA9IFJlYWRUcmFuc2Zvcm0oJnRyYW5zZm9ybV94c2l6ZSwgJnRyYW5zZm9ybV95c2l6ZSwgZGVjKTsKLSAgICB9Ci0gIH0KLQotICAvLyBDb2xvciBjYWNoZQotICBpZiAob2sgJiYgVlA4TFJlYWRCaXRzKGJyLCAxKSkgewotICAgIGNvbG9yX2NhY2hlX2JpdHMgPSBWUDhMUmVhZEJpdHMoYnIsIDQpOwotICAgIG9rID0gKGNvbG9yX2NhY2hlX2JpdHMgPj0gMSAmJiBjb2xvcl9jYWNoZV9iaXRzIDw9IE1BWF9DQUNIRV9CSVRTKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgfQotCi0gIC8vIFJlYWQgdGhlIEh1ZmZtYW4gY29kZXMgKG1heSByZWN1cnNlKS4KLSAgb2sgPSBvayAmJiBSZWFkSHVmZm1hbkNvZGVzKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl9jYWNoZV9iaXRzLCBpc19sZXZlbDApOwotICBpZiAoIW9rKSB7Ci0gICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLQotICAvLyBGaW5pc2ggc2V0dGluZyB1cCB0aGUgY29sb3ItY2FjaGUKLSAgaWYgKGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7Ci0gICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDEgPDwgY29sb3JfY2FjaGVfYml0czsKLSAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmaGRyLT5jb2xvcl9jYWNoZV8sIGNvbG9yX2NhY2hlX2JpdHMpKSB7Ci0gICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgICBvayA9IDA7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA9IDA7Ci0gIH0KLSAgVXBkYXRlRGVjb2RlcihkZWMsIHRyYW5zZm9ybV94c2l6ZSwgdHJhbnNmb3JtX3lzaXplKTsKLQotICBpZiAoaXNfbGV2ZWwwKSB7ICAgLy8gbGV2ZWwgMCBjb21wbGV0ZQotICAgIGRlYy0+c3RhdGVfID0gUkVBRF9IRFI7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLQotICB7Ci0gICAgY29uc3QgdWludDY0X3QgdG90YWxfc2l6ZSA9ICh1aW50NjRfdCl0cmFuc2Zvcm1feHNpemUgKiB0cmFuc2Zvcm1feXNpemU7Ci0gICAgZGF0YSA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpkYXRhKSk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOwotICAgICAgb2sgPSAwOwotICAgICAgZ290byBFbmQ7Ci0gICAgfQotICB9Ci0KLSAgLy8gVXNlIHRoZSBIdWZmbWFuIHRyZWVzIHRvIGRlY29kZSB0aGUgTFo3NyBlbmNvZGVkIGRhdGEuCi0gIG9rID0gRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGF0YSwgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUsIE5VTEwpOwotICBvayA9IG9rICYmICFici0+ZXJyb3JfOwotCi0gRW5kOgotCi0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZGF0YSk7Ci0gICAgQ2xlYXJNZXRhZGF0YShoZHIpOwotICAgIC8vIElmIG5vdCBlbm91Z2ggZGF0YSAoYnIuZW9zXykgcmVzdWx0ZWQgaW4gQklUX1NUUkVBTV9FUlJPUiwgdXBkYXRlIHRoZQotICAgIC8vIHN0YXR1cyBhcHByb3ByaWF0ZWx5LgotICAgIGlmIChkZWMtPnN0YXR1c18gPT0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IgJiYgZGVjLT5icl8uZW9zXykgewotICAgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19TVVNQRU5ERUQ7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChkZWNvZGVkX2RhdGEgIT0gTlVMTCkgewotICAgICAgKmRlY29kZWRfZGF0YSA9IGRhdGE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdlIGFsbG9jYXRlIGltYWdlIGRhdGEgaW4gdGhpcyBmdW5jdGlvbiBvbmx5IGZvciB0cmFuc2Zvcm1zLiBBdCBsZXZlbCAwCi0gICAgICAvLyAodGhhdCBpczogbm90IHRoZSB0cmFuc2Zvcm1zKSwgd2Ugc2hvdWxkbid0IGhhdmUgYWxsb2NhdGVkIGFueXRoaW5nLgotICAgICAgU0JfRENIRUNLKGRhdGEgPT0gTlVMTCk7Ci0gICAgICBTQl9EQ0hFQ0soaXNfbGV2ZWwwKTsKLSAgICB9Ci0gICAgaWYgKCFpc19sZXZlbDApIENsZWFyTWV0YWRhdGEoaGRyKTsgIC8vIENsZWFuIHVwIHRlbXBvcmFyeSBkYXRhIGJlaGluZC4KLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbGxvY2F0ZSBpbnRlcm5hbCBidWZmZXJzIGRlYy0+cGl4ZWxzXyBhbmQgZGVjLT5hcmdiX2NhY2hlXy4KLXN0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IGZpbmFsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNfcGVyX3BpeGVsKSB7Ci0gIGNvbnN0IGludCBhcmdiX2NhY2hlX25lZWRlZCA9IChieXRlc19wZXJfcGl4ZWwgPT0gc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIGNvbnN0IHVpbnQ2NF90IG51bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87Ci0gIC8vIFNjcmF0Y2ggYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdG9wLXByZWRpY3Rpb24gcm93IGZvciB0cmFuc2Zvcm1pbmcgdGhlCi0gIC8vIGZpcnN0IHJvdyBpbiB0aGUgcm93LWJsb2Nrcy4gTm90IG5lZWRlZCBmb3IgcGFsZXR0ZWQgYWxwaGEuCi0gIGNvbnN0IHVpbnQ2NF90IGNhY2hlX3RvcF9waXhlbHMgPQotICAgICAgYXJnYl9jYWNoZV9uZWVkZWQgPyAodWludDE2X3QpZmluYWxfd2lkdGggOiAwVUxMOwotICAvLyBTY3JhdGNoIGJ1ZmZlciBmb3IgdGVtcG9yYXJ5IEJHUkEgc3RvcmFnZS4gTm90IG5lZWRlZCBmb3IgcGFsZXR0ZWQgYWxwaGEuCi0gIGNvbnN0IHVpbnQ2NF90IGNhY2hlX3BpeGVscyA9Ci0gICAgICBhcmdiX2NhY2hlX25lZWRlZCA/ICh1aW50NjRfdClmaW5hbF93aWR0aCAqIE5VTV9BUkdCX0NBQ0hFX1JPV1MgOiAwVUxMOwotICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0KLSAgICAgIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzICsgY2FjaGVfcGl4ZWxzOwotCi0gIFNCX0RDSEVDSyhkZWMtPndpZHRoXyA8PSBmaW5hbF93aWR0aCk7Ci0gIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgYnl0ZXNfcGVyX3BpeGVsKTsKLSAgaWYgKGRlYy0+cGl4ZWxzXyA9PSBOVUxMKSB7Ci0gICAgZGVjLT5hcmdiX2NhY2hlXyA9IE5VTEw7ICAgIC8vIGZvciBzYW5pdHkgY2hlY2sKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZGVjLT5hcmdiX2NhY2hlXyA9Ci0gICAgICBhcmdiX2NhY2hlX25lZWRlZCA/IGRlYy0+cGl4ZWxzXyArIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzIDogTlVMTDsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNwZWNpYWwgcm93LXByb2Nlc3NpbmcgdGhhdCBvbmx5IHN0b3JlcyB0aGUgYWxwaGEgZGF0YS4KLXN0YXRpYyB2b2lkIEV4dHJhY3RBbHBoYVJvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdykgewotICBjb25zdCBpbnQgbnVtX3Jvd3MgPSByb3cgLSBkZWMtPmxhc3Rfcm93XzsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IGluID0gZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBkZWMtPmxhc3Rfcm93XzsKLQotICBpZiAobnVtX3Jvd3MgPD0gMCkgcmV0dXJuOyAgLy8gTm90aGluZyB0byBiZSBkb25lLgotICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIGluKTsKLQotICAvLyBFeHRyYWN0IGFscGhhICh3aGljaCBpcyBzdG9yZWQgaW4gdGhlIGdyZWVuIHBsYW5lKS4KLSAgewotICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsgICAgICAvLyB0aGUgZmluYWwgd2lkdGggKCE9IGRlYy0+d2lkdGhfKQotICAgIGNvbnN0IGludCBjYWNoZV9waXhzID0gd2lkdGggKiBudW1fcm93czsKLSAgICB1aW50OF90KiBjb25zdCBkc3QgPSAodWludDhfdCopZGVjLT5pb18tPm9wYXF1ZSArIHdpZHRoICogZGVjLT5sYXN0X3Jvd187Ci0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGRlYy0+YXJnYl9jYWNoZV87Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IGNhY2hlX3BpeHM7ICsraSkgZHN0W2ldID0gKHNyY1tpXSA+PiA4KSAmIDB4ZmY7Ci0gIH0KLSAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSByb3c7Ci19Ci0KLS8vIFJvdy1wcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZW4gYWxwaGEgZGF0YSBjb250YWlucyBvbmx5IG9uZQotLy8gdHJhbnNmb3JtOiBjb2xvciBpbmRleGluZy4KLXN0YXRpYyB2b2lkIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93KSB7Ci0gIGNvbnN0IGludCBudW1fcm93cyA9IHJvdyAtIGRlYy0+bGFzdF9yb3dfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBpbiA9Ci0gICAgICAodWludDhfdCopZGVjLT5waXhlbHNfICsgZGVjLT53aWR0aF8gKiBkZWMtPmxhc3Rfcm93XzsKLSAgaWYgKG51bV9yb3dzIDw9IDApIHJldHVybjsgIC8vIE5vdGhpbmcgdG8gYmUgZG9uZS4KLSAgQXBwbHlJbnZlcnNlVHJhbnNmb3Jtc0FscGhhKGRlYywgbnVtX3Jvd3MsIGluKTsKLSAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSByb3c7Ci19Ci0KLWludCBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDhfdCogY29uc3Qgb3V0cHV0KSB7Ci0gIFZQOElvIGlvOwotICBpbnQgb2sgPSAwOwotICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gVlA4TE5ldygpOwotICBzaXplX3QgYnl0ZXNfcGVyX3BpeGVsID0gc2l6ZW9mKHVpbnQzMl90KTsgIC8vIERlZmF1bHQ6IEJHUkEgbW9kZS4KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBkZWMtPndpZHRoXyA9IHdpZHRoOwotICBkZWMtPmhlaWdodF8gPSBoZWlnaHQ7Ci0gIGRlYy0+aW9fID0gJmlvOwotCi0gIFZQOEluaXRJbygmaW8pOwotICBXZWJQSW5pdEN1c3RvbUlvKE5VTEwsICZpbyk7ICAgIC8vIEp1c3QgYSBzYW5pdHkgSW5pdC4gaW8gd29uJ3QgYmUgdXNlZC4KLSAgaW8ub3BhcXVlID0gb3V0cHV0OwotICBpby53aWR0aCA9IHdpZHRoOwotICBpby5oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKLSAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBkYXRhLCBkYXRhX3NpemUpOwotCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfSERSOwotICBpZiAoIURlY29kZUltYWdlU3RyZWFtKHdpZHRoLCBoZWlnaHQsIDEsIGRlYywgTlVMTCkpIGdvdG8gRXJyOwotCi0gIC8vIFNwZWNpYWwgY2FzZTogaWYgYWxwaGEgZGF0YSB1c2VzIG9ubHkgdGhlIGNvbG9yIGluZGV4aW5nIHRyYW5zZm9ybSBhbmQKLSAgLy8gZG9lc24ndCB1c2UgY29sb3IgY2FjaGUgKGEgZnJlcXVlbnQgY2FzZSksIHdlIHdpbGwgdXNlIERlY29kZUFscGhhRGF0YSgpCi0gIC8vIG1ldGhvZCB0aGF0IG9ubHkgbmVlZHMgYWxsb2NhdGlvbiBvZiAxIGJ5dGUgcGVyIHBpeGVsIChhbHBoYSBjaGFubmVsKS4KLSAgaWYgKGRlYy0+bmV4dF90cmFuc2Zvcm1fID09IDEgJiYKLSAgICAgIGRlYy0+dHJhbnNmb3Jtc19bMF0udHlwZV8gPT0gQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNICYmCi0gICAgICBkZWMtPmhkcl8uY29sb3JfY2FjaGVfc2l6ZV8gPT0gMCkgewotICAgIGJ5dGVzX3Blcl9waXhlbCA9IHNpemVvZih1aW50OF90KTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgKG5vdGUgdGhhdCBkZWMtPndpZHRoXyBtYXkgaGF2ZSBjaGFuZ2VkIGhlcmUpLgotICBpZiAoIUFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzKGRlYywgd2lkdGgsIGJ5dGVzX3Blcl9waXhlbCkpIGdvdG8gRXJyOwotCi0gIC8vIERlY29kZSAod2l0aCBzcGVjaWFsIHJvdyBwcm9jZXNzaW5nKS4KLSAgZGVjLT5hY3Rpb25fID0gUkVBRF9EQVRBOwotICBvayA9IChieXRlc19wZXJfcGl4ZWwgPT0gc2l6ZW9mKHVpbnQ4X3QpKSA/Ci0gICAgICBEZWNvZGVBbHBoYURhdGEoZGVjLCAodWludDhfdCopZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cykgOgotICAgICAgRGVjb2RlSW1hZ2VEYXRhKGRlYywgZGVjLT5waXhlbHNfLCBkZWMtPndpZHRoXywgZGVjLT5oZWlnaHRfLAotICAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RBbHBoYVJvd3MpOwotCi0gRXJyOgotICBWUDhMRGVsZXRlKGRlYyk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50IFZQOExEZWNvZGVIZWFkZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7Ci0gIGludCB3aWR0aCwgaGVpZ2h0LCBoYXNfYWxwaGE7Ci0KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKGlvID09IE5VTEwpIHsKLSAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBkZWMtPmlvXyA9IGlvOwotICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOwotICBWUDhMSW5pdEJpdFJlYWRlcigmZGVjLT5icl8sIGlvLT5kYXRhLCBpby0+ZGF0YV9zaXplKTsKLSAgaWYgKCFSZWFkSW1hZ2VJbmZvKCZkZWMtPmJyXywgJndpZHRoLCAmaGVpZ2h0LCAmaGFzX2FscGhhKSkgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKLSAgaW8tPndpZHRoID0gd2lkdGg7Ci0gIGlvLT5oZWlnaHQgPSBoZWlnaHQ7Ci0KLSAgZGVjLT5hY3Rpb25fID0gUkVBRF9IRFI7Ci0gIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgMSwgZGVjLCBOVUxMKSkgZ290byBFcnJvcjsKLSAgcmV0dXJuIDE7Ci0KLSBFcnJvcjoKLSAgVlA4TENsZWFyKGRlYyk7Ci0gIFNCX0RDSEVDSyhkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgY29uc3Qgc2l6ZV90IGJ5dGVzX3Blcl9waXhlbCA9IHNpemVvZih1aW50MzJfdCk7Ci0gIFZQOElvKiBpbyA9IE5VTEw7Ci0gIFdlYlBEZWNQYXJhbXMqIHBhcmFtcyA9IE5VTEw7Ci0KLSAgLy8gU2FuaXR5IGNoZWNrcy4KLSAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBpbyA9IGRlYy0+aW9fOwotICBTQl9EQ0hFQ0soaW8gIT0gTlVMTCk7Ci0gIHBhcmFtcyA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOwotICBTQl9EQ0hFQ0socGFyYW1zICE9IE5VTEwpOwotICBkZWMtPm91dHB1dF8gPSBwYXJhbXMtPm91dHB1dDsKLSAgU0JfRENIRUNLKGRlYy0+b3V0cHV0XyAhPSBOVUxMKTsKLQotICAvLyBJbml0aWFsaXphdGlvbi4KLSAgaWYgKCFXZWJQSW9Jbml0RnJvbU9wdGlvbnMocGFyYW1zLT5vcHRpb25zLCBpbywgTU9ERV9CR1JBKSkgewotICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKLSAgICBnb3RvIEVycjsKLSAgfQotCi0gIGlmICghQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMoZGVjLCBpby0+d2lkdGgsIGJ5dGVzX3Blcl9waXhlbCkpIGdvdG8gRXJyOwotCi0gIGlmIChpby0+dXNlX3NjYWxpbmcgJiYgIUFsbG9jYXRlQW5kSW5pdFJlc2NhbGVyKGRlYywgaW8pKSBnb3RvIEVycjsKLQotICAvLyBEZWNvZGUuCi0gIGRlYy0+YWN0aW9uXyA9IFJFQURfREFUQTsKLSAgaWYgKCFEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCi0gICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NSb3dzKSkgewotICAgIGdvdG8gRXJyOwotICB9Ci0KLSAgLy8gQ2xlYW51cC4KLSAgcGFyYW1zLT5sYXN0X3kgPSBkZWMtPmxhc3Rfb3V0X3Jvd187Ci0gIFZQOExDbGVhcihkZWMpOwotICByZXR1cm4gMTsKLQotIEVycjoKLSAgVlA4TENsZWFyKGRlYyk7Ci0gIFNCX0RDSEVDSyhkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7Ci0gIHJldHVybiAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy9SRUFETUUgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMjNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvUkVBRE1FCkBAIC0wLDAgKzEsMjkgQEAKKworR2VuZXJhdGUgbGlid2VicCBDb250YWluZXIgU3BlYyBEb2NzIGZyb20gVGV4dCBTb3VyY2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hUTUwgZ2VuZXJhdGlvbiByZXF1aXJlcyBrcmFtZG93biBbMV0sIGVhc2lseSBpbnN0YWxsZWQgYXMgYQorcnVieWdlbSBbMl0uICBSdWJ5Z2VtcyBpbnN0YWxsYXRpb24gc2hvdWxkIHNhdGlzZnkgZGVwZW5kZW5jaWVzCithdXRvbWF0aWNhbGx5LgorCitbMV06IGh0dHA6Ly9rcmFtZG93bi5ydWJ5Zm9yZ2Uub3JnLworWzJdOiBodHRwOi8vcnVieWdlbXMub3JnLworCitIVE1MIGdlbmVyYXRpb24gY2FuIHRoZW4gYmUgZG9uZSBmcm9tIHRoZSBwcm9qZWN0IHJvb3Q6CisKKyQga3JhbWRvd24gZG9jL3dlYnAtY29udGFpbmVyLXNwZWMudHh0IC0tdGVtcGxhdGUgZG9jL3RlbXBsYXRlLmh0bWwgPiBcCisgIGRvYy9vdXRwdXQvd2VicC1jb250YWluZXItc3BlYy5odG1sCisKK2tyYW1kb3duIGNhbiBvcHRpb25hbGx5IHN5bnRheCBoaWdobGlnaHQgY29kZSBibG9ja3MsIHVzaW5nIENvZGVSYXkgWzNdLAorYSBkZXBlbmRlbmN5IG9mIGtyYW1kb3duIHRoYXQgcnVieWdlbXMgd2lsbCBpbnN0YWxsIGF1dG9tYXRpY2FsbHkuICBUaGUKK2ZvbGxvd2luZyB3aWxsIGFwcGx5IGlubGluZSBDU1Mgc3R5bGluZzsgYW4gZXh0ZXJuYWwgc3R5bGVzaGVldCBpcyBub3QKK25lZWRlZC4KKworJCBrcmFtZG93biBkb2Mvd2VicC1sb3NzbGVzcy1iaXRzdHJlYW0tc3BlYy50eHQgLS10ZW1wbGF0ZSBcCisgIGRvYy90ZW1wbGF0ZS5odG1sIC0tY29kZXJheS1jc3Mgc3R5bGUgLS1jb2RlcmF5LWxpbmUtbnVtYmVycyAnICcgXAorICAtLWNvZGVyYXktZGVmYXVsdC1sYW5nIGMgPiBcCisgIGRvYy9vdXRwdXQvd2VicC1sb3NzbGVzcy1iaXRzdHJlYW0tc3BlYy5odG1sCisKK09wdGltYWxseSwgdXNlIGtyYW1kb3duIDAuMTMuNyBvciBuZXdlciBpZiBzeW50YXggaGlnaGxpZ2h0aW5nIGRlc2lyZWQuCisKK1szXTogaHR0cDovL2NvZGVyYXkucnVieWNoYW4uZGUvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvVE9ETyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYTkzODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvVE9ETwpAQCAtMCwwICsxLDEzIEBACis8bG91cXVpbGxpb0Bnb29nbGUuY29tPiwgMjAxMTEwMDQKKworKiBEZXRlcm1pbmUgdGhhdCBub3JtYXRpdmUgUkZDIDIxMTkgdGVybXMgKE1VU1QsIFNIT1VMRCwgTUFZLCBldGMuKSBhcmUKKyAgdHJ1bHkgaW50ZW5kZWQgaW4gYWxsIGNhc2VzIHdoZXJlIGNhcGl0YWxpemVkLgorCisqIFNldmVyYWwgcGFzc2FnZXMgY291bGQgYmUgbWFkZSBjbGVhcmVyLgorCisgICogT3ZlcmFsbCBlZGl0IGZvciBzY29wZS4gIFBvcnRpb25zIGFyZSBwaHJhc2VkIGFzIGFuIGludHJvZHVjdGlvbiB0bworICAgIHRoZSAwLjEuMyBSSUZGIGNvbnRhaW5lciBhZGRpdGlvbnMsIHJhdGhlciB0aGFuIGEgaG9saXN0aWMgZ3VpZGUgdG8KKyAgICBXZWJQLgorCisgICogVG8gd2l0LCBzdWdnZXN0IHMvW3NwZWN8c3BlY2lmaWNhdGlvbl0vZ3VpZGUvZyAuICAiU3BlYyIgY2FuIGltcGx5IGEKKyAgICBzdGFuZGFyZHMgdHJhY2s7IGluIGFueSBjYXNlIGl0J3MgdG9vIGZvcm1hbCBmb3IgYSB3b3JrIGluIHByb2dyZXNzLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3RlbXBsYXRlLmh0bWwgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2MvdGVtcGxhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGJjMjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3RlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw5NCBAQAorPCFET0NUWVBFIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICA8dGl0bGU+V2ViUCBDb250YWluZXIgU3BlY2lmaWNhdGlvbjwvdGl0bGU+CisgIDxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0ia3JhbWRvd24gPCU9IDo6S3JhbWRvd246OlZFUlNJT04gJT4iIC8+CisgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIGNvbG9yOiAjMDAwOworICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CisgICAgbWFyZ2luOiAxMCU7CisgICAgZm9udC1mYW1pbHk6ICJMaWJlcmF0aW9uIFNhbnMiLCAiRGVqYVZ1IFNhbnMiLCAiQml0c3RyZWFtIFZlcmEgU2FucyIsIEFyaWFsLCBzYW5zLXNlcmlmOworICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CisgIH0KKyAgaDIgeworICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjY2NjOworICAgIHBhZGRpbmctYm90dG9tOiAwOworICB9CisgIHRhYmxlIHsKKyAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICB9CisgIHRoLCB0ZCB7CisgICAgYm9yZGVyOiAxcHggc29saWQgIzk5OTsKKyAgICBwYWRkaW5nOiAuNWVtIC43ZW07OworICB9CisgIHRoIHsKKyAgICBjb2xvcjogI2ZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOworICB9CisgIHRkIHsKKyAgfQorICBociB7CisgIH0KKyAgY29kZSB7CisgICAgY29sb3I6ICMwMDA7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgICBwYWRkaW5nOiAwIDNweDsKKyAgICBmb250LWZhbWlseTogIkxpYmVyYXRpb24gTW9ubyIsICJEZWphVnUgU2FucyBNb25vIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsIENvbnNvbGF0YSwgbW9ub3NwYWNlOworICB9CisgIHByZSB7CisgICAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKKyAgICBwYWRkaW5nOiAxZW07CisgICAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKKyAgICB3aWR0aDogNDJlbTsKKyAgICBvdmVyZmxvdzogYXV0bzsKKyAgICBmb250LWZhbWlseTogIkxpYmVyYXRpb24gTW9ubyIsICJEZWphVnUgU2FucyBNb25vIiwgIkJpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyIsIENvbnNvbGF0YSwgbW9ub3NwYWNlOworICB9CisgIHByZSBjb2RlIHsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjdmN2Y3OworICAgIHBhZGRpbmc6IDA7IC8qIE9ubHkgd2FudCBwYWRkaW5nIG9uIGlubGluZSBjb2RlLCBub3QgYmxvY2tzICovCisgIH0KKyAgcHJlLnRlcm1pbmFsIHsKKyAgICBjb2xvcjogI2ZmZjsKKyAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOworICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CisgICAgbWF4LWhlaWdodDogMzBlbTsKKyAgfQorICBwcmUudGVybWluYWwgY29kZSB7CisgICAgY29sb3I6ICNmZmY7CisgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKKyAgICBmb250LXNpemU6IHNtYWxsZXI7CisgIH0KKyAgI21hcmtkb3duLXRvYyB1bCB7CisgICAgbGlzdC1zdHlsZS10eXBlOiBkaXNjOworICB9CisgIHVsI21hcmtkb3duLXRvYyB7CisgICAgbWFyZ2luLXRvcDogLTFlbTsKKyAgICB2aXNpYmlsaXR5OiBoaWRkZW47CisgICAgLXdlYmtpdC1wYWRkaW5nLXN0YXJ0OiAwOworICB9CisgIHVsI21hcmtkb3duLXRvYyB1bCB7CisgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgdWwgdWx7CisgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKKyAgfQorICB1bCNtYXJrZG93bi10b2MgKyBociB7CisgICAgbWFyZ2luLWJvdHRvbTogNGVtOworICB9CisgIG9sIG9sIHsgLyogRm9ybWF0IG5lc3RlZCBvcmRlcmVkIGxpc3RzICovCisgICAgbGlzdC1zdHlsZS10eXBlOiBsb3dlci1hbHBoYTsKKyAgfQorICBkdCB7CisgICAgZm9udC1zdHlsZTogaXRhbGljOworICAgIGZvbnQtd2VpZ2h0OiBib2xkOworICB9CisgIC5jYXB0aW9uIHsKKyAgfQorICA8L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8JT0gQGJvZHkgJT4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RvYy93ZWJwLWNvbnRhaW5lci1zcGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE3Y2EyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3dlYnAtY29udGFpbmVyLXNwZWMudHh0CkBAIC0wLDAgKzEsODIzIEBACis8IS0tCisKK0FsdGhvdWdoIHlvdSBtYXkgYmUgdmlld2luZyBhbiBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb24sIHRoaXMgZG9jdW1lbnQKK2lzIHNvdXJjZWQgaW4gTWFya2Rvd24sIGEgbGlnaHQtZHV0eSBtYXJrdXAgc2NoZW1lLCBhbmQgaXMgb3B0aW1pemVkIGZvcgordGhlIFtrcmFtZG93bl0oaHR0cDovL2tyYW1kb3duLnJ1Ynlmb3JnZS5vcmcvKSB0cmFuc2Zvcm1lci4KKworU2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FLiBFeHRlcm5hbCBsaW5rIHRhcmdldHMgYXJlIHJlZmVyZW5jZWQgYXQgdGhlCitlbmQgb2YgdGhpcyBmaWxlLgorCistLT4KKworCitXZWJQIENvbnRhaW5lciBTcGVjaWZpY2F0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyogVE9DIHBsYWNlaG9sZGVyCit7OnRvY30KKworCitJbnRyb2R1Y3Rpb24KKy0tLS0tLS0tLS0tLQorCitXZWJQIGlzIGFuIGltYWdlIGZvcm1hdCB0aGF0IHVzZXMgZWl0aGVyIChpKSB0aGUgVlA4IGtleSBmcmFtZSBlbmNvZGluZwordG8gY29tcHJlc3MgaW1hZ2UgZGF0YSBpbiBhIGxvc3N5IHdheSwgb3IgKGlpKSB0aGUgV2ViUCBsb3NzbGVzcyBlbmNvZGluZworKGFuZCBwb3NzaWJseSBvdGhlciBlbmNvZGluZ3MgaW4gdGhlIGZ1dHVyZSkuIFRoZXNlIGVuY29kaW5nIHNjaGVtZXMgc2hvdWxkCittYWtlIGl0IG1vcmUgZWZmaWNpZW50IHRoYW4gY3VycmVudGx5IHVzZWQgZm9ybWF0cy4gSXQgaXMgb3B0aW1pemVkIGZvciBmYXN0CitpbWFnZSB0cmFuc2ZlciBvdmVyIHRoZSBuZXR3b3JrIChlLmcuLCBmb3Igd2Vic2l0ZXMpLiBUaGUgV2ViUCBmb3JtYXQgaGFzCitmZWF0dXJlIHBhcml0eSAoY29sb3IgcHJvZmlsZSwgbWV0YWRhdGEsIGFuaW1hdGlvbiBldGMpIHdpdGggb3RoZXIgZm9ybWF0cyBhcword2VsbC4gVGhpcyBkb2N1bWVudCBkZXNjcmliZXMgdGhlIHN0cnVjdHVyZSBvZiBhIFdlYlAgZmlsZS4KKworVGhlIFdlYlAgY29udGFpbmVyIChpLmUuLCBSSUZGIGNvbnRhaW5lciBmb3IgV2ViUCkgYWxsb3dzIGZlYXR1cmUgc3VwcG9ydCBvdmVyCithbmQgYWJvdmUgdGhlIGJhc2ljIHVzZSBjYXNlIG9mIFdlYlAgKGkuZS4sIGEgZmlsZSBjb250YWluaW5nIGEgc2luZ2xlIGltYWdlCitlbmNvZGVkIGFzIGEgVlA4IGtleSBmcmFtZSkuIFRoZSBXZWJQIGNvbnRhaW5lciBwcm92aWRlcyBhZGRpdGlvbmFsIHN1cHBvcnQKK2ZvcjoKKworICAqICoqTG9zc2xlc3MgY29tcHJlc3Npb24uKiogQW4gaW1hZ2UgY2FuIGJlIGxvc3NsZXNzbHkgY29tcHJlc3NlZCwgdXNpbmcgdGhlCisgICAgV2ViUCBMb3NzbGVzcyBGb3JtYXQuCisKKyAgKiAqKk1ldGFkYXRhLioqIEFuIGltYWdlIG1heSBoYXZlIG1ldGFkYXRhIHN0b3JlZCBpbiBFWElGIG9yIFhNUCBmb3JtYXRzLgorCisgICogKipUcmFuc3BhcmVuY3kuKiogQW4gaW1hZ2UgbWF5IGhhdmUgdHJhbnNwYXJlbmN5LCBpLmUuLCBhbiBhbHBoYSBjaGFubmVsLgorCisgICogKipDb2xvciBQcm9maWxlLioqIEFuIGltYWdlIG1heSBoYXZlIGFuIGVtYmVkZGVkIElDQyBwcm9maWxlIGFzIGRlc2NyaWJlZAorICAgIGJ5IHRoZSBbSW50ZXJuYXRpb25hbCBDb2xvciBDb25zb3J0aXVtXVtpY2NzcGVjXS4KKworICAqICoqQW5pbWF0aW9uLioqIEFuIGltYWdlIG1heSBoYXZlIG11bHRpcGxlIGZyYW1lcyB3aXRoIHBhdXNlcyBiZXR3ZWVuIHRoZW0sCisgICAgbWFraW5nIGl0IGFuIGFuaW1hdGlvbi4KKworVGhlIGtleSB3b3JkcyAiTVVTVCIsICJNVVNUIE5PVCIsICJSRVFVSVJFRCIsICJTSEFMTCIsICJTSEFMTCBOT1QiLAorIlNIT1VMRCIsICJTSE9VTEQgTk9UIiwgIlJFQ09NTUVOREVEIiwgIk1BWSIsIGFuZCAiT1BUSU9OQUwiIGluIHRoaXMKK2RvY3VtZW50IGFyZSB0byBiZSBpbnRlcnByZXRlZCBhcyBkZXNjcmliZWQgaW4gW1JGQyAyMTE5XVtdLgorCitCaXQgbnVtYmVyaW5nIGluIGNodW5rIGRpYWdyYW1zIHN0YXJ0cyBhdCBgMGAgZm9yIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdAorKCdNU0IgMCcpIGFzIGRlc2NyaWJlZCBpbiBbUkZDIDExNjZdW10uCisKKyoqTm90ZToqKiBPdXQgb2YgdGhlIGZlYXR1cmVzIG1lbnRpb25lZCBhYm92ZSwgbG9zc3kgY29tcHJlc3Npb24sIGxvc3NsZXNzCitjb21wcmVzc2lvbiwgdHJhbnNwYXJlbmN5LCBtZXRhZGF0YSwgY29sb3IgcHJvZmlsZSBhbmQgYW5pbWF0aW9uIGFyZSBmaW5hbGl6ZWQKK2FuZCBhcmUgdG8gYmUgY29uc2lkZXJlZCBzdGFibGUuCisKK1Rlcm1pbm9sb2d5ICZhbXA7IEJhc2ljcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0EgV2ViUCBmaWxlIGNvbnRhaW5zIGVpdGhlciBhIHN0aWxsIGltYWdlIChpLmUuLCBhbiBlbmNvZGVkIG1hdHJpeCBvZiBwaXhlbHMpCitvciBhbiBbYW5pbWF0aW9uXSgjYW5pbWF0aW9uKS4gT3B0aW9uYWxseSwgaXQgY2FuIGFsc28gY29udGFpbiB0cmFuc3BhcmVuY3kKK2luZm9ybWF0aW9uLCBjb2xvciBwcm9maWxlIGFuZCBtZXRhZGF0YS4gSW4gY2FzZSB3ZSBuZWVkIHRvIHJlZmVyIG9ubHkgdG8gdGhlCittYXRyaXggb2YgcGl4ZWxzLCB3ZSB3aWxsIGNhbGwgaXQgdGhlIF9jYW52YXNfIG9mIHRoZSBpbWFnZS4KKworQmVsb3cgYXJlIGFkZGl0aW9uYWwgdGVybXMgdXNlZCB0aHJvdWdob3V0IHRoaXMgZG9jdW1lbnQ6CisKK19SZWFkZXIvV3JpdGVyXworCis6IENvZGUgdGhhdCByZWFkcyBXZWJQIGZpbGVzIGlzIHJlZmVycmVkIHRvIGFzIGEgX3JlYWRlcl8sIHdoaWxlIGNvZGUgdGhhdAorICB3cml0ZXMgdGhlbSBpcyByZWZlcnJlZCB0byBhcyBhIF93cml0ZXJfLgorCitfdWludDE2XworCis6IEEgMTYtYml0LCBsaXR0bGUtZW5kaWFuLCB1bnNpZ25lZCBpbnRlZ2VyLgorCitfdWludDI0XworCis6IEEgMjQtYml0LCBsaXR0bGUtZW5kaWFuLCB1bnNpZ25lZCBpbnRlZ2VyLgorCitfdWludDMyXworCis6IEEgMzItYml0LCBsaXR0bGUtZW5kaWFuLCB1bnNpZ25lZCBpbnRlZ2VyLgorCitfRm91ckNDXworCis6IEEgX0ZvdXJDQ18gKGZvdXItY2hhcmFjdGVyIGNvZGUpIGlzIGEgX3VpbnQzMl8gY3JlYXRlZCBieSBjb25jYXRlbmF0aW5nIGZvdXIKKyAgQVNDSUkgY2hhcmFjdGVycyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgorCitfMS1iYXNlZF8KKworOiBBbiB1bnNpZ25lZCBpbnRlZ2VyIGZpZWxkIHN0b3JpbmcgdmFsdWVzIG9mZnNldCBieSBgLTFgLiBlLmcuLCBTdWNoIGEgZmllbGQKKyAgd291bGQgc3RvcmUgdmFsdWUgXzI1XyBhcyBfMjRfLgorCisKK1JJRkYgRmlsZSBGb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0KKworVGhlIFdlYlAgZmlsZSBmb3JtYXQgaXMgYmFzZWQgb24gdGhlIFJJRkYgKHJlc291cmNlIGludGVyY2hhbmdlIGZpbGUgZm9ybWF0KQorZG9jdW1lbnQgZm9ybWF0LgorCitUaGUgYmFzaWMgZWxlbWVudCBvZiBhIFJJRkYgZmlsZSBpcyBhIF9jaHVua18uIEl0IGNvbnNpc3RzIG9mOgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIENodW5rIEZvdXJDQyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmsgU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgQ2h1bmsgUGF5bG9hZCAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworQ2h1bmsgRm91ckNDOiAzMiBiaXRzCisKKzogQVNDSUkgZm91ci1jaGFyYWN0ZXIgY29kZSB1c2VkIGZvciBjaHVuayBpZGVudGlmaWNhdGlvbi4KKworQ2h1bmsgU2l6ZTogMzIgYml0cyAoX3VpbnQzMl8pCisKKzogVGhlIHNpemUgb2YgdGhlIGNodW5rIG5vdCBpbmNsdWRpbmcgdGhpcyBmaWVsZCwgdGhlIGNodW5rIGlkZW50aWZpZXIgb3IKKyAgcGFkZGluZy4KKworQ2h1bmsgUGF5bG9hZDogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogVGhlIGRhdGEgcGF5bG9hZC4gSWYgX0NodW5rIFNpemVfIGlzIG9kZCwgYSBzaW5nbGUgcGFkZGluZyBieXRlIC0tIHRoYXQKKyAgU0hPVUxEIGJlIGAwYCAtLSBpcyBhZGRlZC4KKworX0NodW5rSGVhZGVyKCdBQkNEJylfCisKKzogVGhpcyBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBfRm91ckNDXyBhbmQgX0NodW5rIFNpemVfIGhlYWRlciBvZiBpbmRpdmlkdWFsCisgIGNodW5rcywgd2hlcmUgJ0FCQ0QnIGlzIHRoZSBGb3VyQ0MgZm9yIHRoZSBjaHVuay4gVGhpcyBlbGVtZW50J3MKKyAgc2l6ZSBpcyA4IGJ5dGVzLgorCisqKk5vdGU6KiogUklGRiBoYXMgYSBjb252ZW50aW9uIHRoYXQgYWxsLXVwcGVyY2FzZSBjaHVuayBGb3VyQ0NzIGFyZSBzdGFuZGFyZAorY2h1bmtzIHRoYXQgYXBwbHkgdG8gYW55IFJJRkYgZmlsZSBmb3JtYXQsIHdoaWxlIEZvdXJDQ3Mgc3BlY2lmaWMgdG8gYSBmaWxlCitmb3JtYXQgYXJlIGFsbCBsb3dlcmNhc2UuIFdlYlAgZG9lcyBub3QgZm9sbG93IHRoaXMgY29udmVudGlvbi4KKworCitXZWJQIEZpbGUgSGVhZGVyCistLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAnUicgICAgICB8ICAgICAgJ0knICAgICAgfCAgICAgICdGJyAgICAgIHwgICAgICAnRicgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICdXJyAgICAgIHwgICAgICAnRScgICAgICB8ICAgICAgJ0InICAgICAgfCAgICAgICdQJyAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisnUklGRic6IDMyIGJpdHMKKworOiBUaGUgQVNDSUkgY2hhcmFjdGVycyAnUicgJ0knICdGJyAnRicuCisKK0ZpbGUgU2l6ZTogMzIgYml0cyAoX3VpbnQzMl8pCisKKzogVGhlIHNpemUgb2YgdGhlIGZpbGUgaW4gYnl0ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDguIFRoZSBtYXhpbXVtIHZhbHVlIG9mCisgIHRoaXMgZmllbGQgaXMgMl4zMiBtaW51cyAxMCBieXRlcyBhbmQgdGh1cyB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgZmlsZSBpcyBhdAorICBtb3N0IDRHaUIgbWludXMgMiBieXRlcy4KKworJ1dFQlAnOiAzMiBiaXRzCisKKzogVGhlIEFTQ0lJIGNoYXJhY3RlcnMgJ1cnICdFJyAnQicgJ1AnLgorCitBIFdlYlAgZmlsZSBNVVNUIGJlZ2luIHdpdGggYSBSSUZGIGhlYWRlciB3aXRoIHRoZSBGb3VyQ0MgJ1dFQlAnLiBUaGUgZmlsZSBzaXplCitpbiB0aGUgaGVhZGVyIGlzIHRoZSB0b3RhbCBzaXplIG9mIHRoZSBjaHVua3MgdGhhdCBmb2xsb3cgcGx1cyBgNGAgYnl0ZXMgZm9yCit0aGUgJ1dFQlAnIEZvdXJDQy4gVGhlIGZpbGUgU0hPVUxEIE5PVCBjb250YWluIGFueXRoaW5nIGFmdGVyIGl0LiBBcyB0aGUgc2l6ZQorb2YgYW55IGNodW5rIGlzIGV2ZW4sIHRoZSBzaXplIGdpdmVuIGJ5IHRoZSBSSUZGIGhlYWRlciBpcyBhbHNvIGV2ZW4uIFRoZQorY29udGVudHMgb2YgaW5kaXZpZHVhbCBjaHVua3Mgd2lsbCBiZSBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucy4KKworCitTaW1wbGUgRmlsZSBGb3JtYXQgKExvc3N5KQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBsYXlvdXQgU0hPVUxEIGJlIHVzZWQgaWYgdGhlIGltYWdlIHJlcXVpcmVzIF9sb3NzeV8gZW5jb2RpbmcgYW5kIGRvZXMgbm90CityZXF1aXJlIHRyYW5zcGFyZW5jeSBvciBvdGhlciBhZHZhbmNlZCBmZWF0dXJlcyBwcm92aWRlZCBieSB0aGUgZXh0ZW5kZWQgZm9ybWF0LgorRmlsZXMgd2l0aCB0aGlzIGxheW91dCBhcmUgc21hbGxlciBhbmQgc3VwcG9ydGVkIGJ5IG9sZGVyIHNvZnR3YXJlLgorCitTaW1wbGUgV2ViUCAobG9zc3kpIGZpbGUgZm9ybWF0OgorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICBXZWJQIGZpbGUgaGVhZGVyICgxMiBieXRlcykgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4IGNodW5rICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitWUDggY2h1bms6CisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ1ZQOCAnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1ZQOCBkYXRhOiBfQ2h1bmsgU2l6ZV8gYnl0ZXMKKworOiBWUDggYml0c3RyZWFtIGRhdGEuCisKK1RoZSBWUDggYml0c3RyZWFtIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGNhbiBiZSBmb3VuZCBhdCBbVlA4IERhdGEgRm9ybWF0IGFuZAorRGVjb2RpbmcgR3VpZGVdW3ZwOHNwZWNdLiBOb3RlIHRoYXQgdGhlIFZQOCBmcmFtZSBoZWFkZXIgY29udGFpbnMgdGhlIFZQOCBmcmFtZQord2lkdGggYW5kIGhlaWdodC4gVGhhdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjYW52YXMuCisKK1RoZSBWUDggc3BlY2lmaWNhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlY29kZSB0aGUgaW1hZ2UgaW50byBZJ0NiQ3IKK2Zvcm1hdC4gVG8gY29udmVydCB0byBSR0IsIFJlYy4gNjAxIFNIT1VMRCBiZSB1c2VkLgorCisKK1NpbXBsZSBGaWxlIEZvcm1hdCAoTG9zc2xlc3MpCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisqKk5vdGU6KiogT2xkZXIgcmVhZGVycyBtYXkgbm90IHN1cHBvcnQgZmlsZXMgdXNpbmcgdGhlIGxvc3NsZXNzIGZvcm1hdC4KKworVGhpcyBsYXlvdXQgU0hPVUxEIGJlIHVzZWQgaWYgdGhlIGltYWdlIHJlcXVpcmVzIF9sb3NzbGVzc18gZW5jb2RpbmcgKHdpdGggYW4KK29wdGlvbmFsIHRyYW5zcGFyZW5jeSBjaGFubmVsKSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhZHZhbmNlZCBmZWF0dXJlcyBwcm92aWRlZAorYnkgdGhlIGV4dGVuZGVkIGZvcm1hdC4KKworU2ltcGxlIFdlYlAgKGxvc3NsZXNzKSBmaWxlIGZvcm1hdDoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgV2ViUCBmaWxlIGhlYWRlciAoMTIgYnl0ZXMpICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEwgY2h1bmsgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworVlA4TCBjaHVuazoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignVlA4TCcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworVlA4TCBkYXRhOiBfQ2h1bmsgU2l6ZV8gYnl0ZXMKKworOiBWUDhMIGJpdHN0cmVhbSBkYXRhLgorCitUaGUgY3VycmVudCBzcGVjaWZpY2F0aW9uIG9mIHRoZSBWUDhMIGJpdHN0cmVhbSBjYW4gYmUgZm91bmQgYXQKK1tXZWJQIExvc3NsZXNzIEJpdHN0cmVhbSBGb3JtYXRdW3dlYnBsbHNwZWNdLiBOb3RlIHRoYXQgdGhlIFZQOEwgaGVhZGVyCitjb250YWlucyB0aGUgVlA4TCBpbWFnZSB3aWR0aCBhbmQgaGVpZ2h0LiBUaGF0IGlzIGFzc3VtZWQgdG8gYmUgdGhlIHdpZHRoCithbmQgaGVpZ2h0IG9mIHRoZSBjYW52YXMuCisKKworRXh0ZW5kZWQgRmlsZSBGb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyoqTm90ZToqKiBPbGRlciByZWFkZXJzIG1heSBub3Qgc3VwcG9ydCBmaWxlcyB1c2luZyB0aGUgZXh0ZW5kZWQgZm9ybWF0LgorCitBbiBleHRlbmRlZCBmb3JtYXQgZmlsZSBjb25zaXN0cyBvZjoKKworICAqIEEgJ1ZQOFgnIGNodW5rIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgZmVhdHVyZXMgdXNlZCBpbiB0aGUgZmlsZS4KKworICAqIEFuIG9wdGlvbmFsICdJQ0NQJyBjaHVuayB3aXRoIGNvbG9yIHByb2ZpbGUuCisKKyAgKiBBbiBvcHRpb25hbCAnQU5JTScgY2h1bmsgd2l0aCBhbmltYXRpb24gY29udHJvbCBkYXRhLgorCisgICogSW1hZ2UgZGF0YS4KKworICAqIEFuIG9wdGlvbmFsICdFWElGJyBjaHVuayB3aXRoIEVYSUYgbWV0YWRhdGEuCisKKyAgKiBBbiBvcHRpb25hbCAnWE1QICcgY2h1bmsgd2l0aCBYTVAgbWV0YWRhdGEuCisKKyAgKiBBbiBvcHRpb25hbCBsaXN0IG9mIFt1bmtub3duIGNodW5rc10oI3Vua25vd24tY2h1bmtzKS4gX1xbc3RhdHVzOiBleHBlcmltZW50YWxcXV8KKworRm9yIGEgX3N0aWxsIGltYWdlXywgdGhlIF9pbWFnZSBkYXRhXyBjb25zaXN0cyBvZiBhIHNpbmdsZSBmcmFtZSwgd2hpY2ggaXMgbWFkZQordXAgb2Y6CisKKyAgKiBBbiBvcHRpb25hbCBbYWxwaGEgc3ViY2h1bmtdKCNhbHBoYSkuCisKKyAgKiBBIFtiaXRzdHJlYW0gc3ViY2h1bmtdKCNiaXRzdHJlYW0tdnA4dnA4bCkuCisKK0ZvciBhbiBfYW5pbWF0ZWQgaW1hZ2VfLCB0aGUgX2ltYWdlIGRhdGFfIGNvbnNpc3RzIG9mIG11bHRpcGxlIGZyYW1lcy4gTW9yZQorZGV0YWlscyBhYm91dCBmcmFtZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBbQW5pbWF0aW9uXSgjYW5pbWF0aW9uKSBzZWN0aW9uLgorCitBbGwgY2h1bmtzIFNIT1VMRCBiZSBwbGFjZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbGlzdGVkIGFib3ZlLiBJZiBhIGNodW5rCithcHBlYXJzIGluIHRoZSB3cm9uZyBwbGFjZSwgdGhlIGZpbGUgaXMgaW52YWxpZCwgYnV0IHJlYWRlcnMgTUFZIHBhcnNlIHRoZQorZmlsZSwgaWdub3JpbmcgdGhlIGNodW5rcyB0aGF0IGNvbWUgdG9vIGxhdGUuCisKKyoqUmF0aW9uYWxlOioqIFNldHRpbmcgdGhlIG9yZGVyIG9mIGNodW5rcyBzaG91bGQgYWxsb3cgcXVpY2tlciBmaWxlCitwYXJzaW5nLiBGb3IgZXhhbXBsZSwgaWYgYW4gJ0FMUEgnIGNodW5rIGRvZXMgbm90IGFwcGVhciBpbiBpdHMgcmVxdWlyZWQKK3Bvc2l0aW9uLCBhIGRlY29kZXIgY2FuIGNob29zZSB0byBzdG9wIHNlYXJjaGluZyBmb3IgaXQuIFRoZSBydWxlIG9mCitpZ25vcmluZyBsYXRlIGNodW5rcyBzaG91bGQgbWFrZSBwcm9ncmFtcyB0aGF0IG5lZWQgdG8gZG8gYSBmdWxsIHNlYXJjaAorZ2l2ZSB0aGUgc2FtZSByZXN1bHRzIGFzIHRoZSBvbmVzIHN0b3BwaW5nIGVhcmx5LgorCitFeHRlbmRlZCBXZWJQIGZpbGUgaGVhZGVyOgorezojZXh0ZW5kZWRfaGVhZGVyfQorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgIFdlYlAgZmlsZSBoZWFkZXIgKDEyIGJ5dGVzKSAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignVlA4WCcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHxSc3Z8SXxMfEV8WHxBfFJ8ICAgICAgICAgICAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgIENhbnZhcyBXaWR0aCBNaW51cyBPbmUgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC4uLgorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgLi4uICBDYW52YXMgSGVpZ2h0IE1pbnVzIE9uZSAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKK1Jlc2VydmVkIChSc3YpOiAyIGJpdHMKKworOiBTSE9VTEQgYmUgYDBgLgorCitJQ0MgcHJvZmlsZSAoSSk6IDEgYml0CisKKzogU2V0IGlmIHRoZSBmaWxlIGNvbnRhaW5zIGFuIElDQyBwcm9maWxlLgorCitBbHBoYSAoTCk6IDEgYml0CisKKzogU2V0IGlmIGFueSBvZiB0aGUgZnJhbWVzIG9mIHRoZSBpbWFnZSBjb250YWluIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbgorICAoImFscGhhIikuCisKK0VYSUYgbWV0YWRhdGEgKEUpOiAxIGJpdAorCis6IFNldCBpZiB0aGUgZmlsZSBjb250YWlucyBFWElGIG1ldGFkYXRhLgorCitYTVAgbWV0YWRhdGEgKFgpOiAxIGJpdAorCis6IFNldCBpZiB0aGUgZmlsZSBjb250YWlucyBYTVAgbWV0YWRhdGEuCisKK0FuaW1hdGlvbiAoQSk6IDEgYml0CisKKzogU2V0IGlmIHRoaXMgaXMgYW4gYW5pbWF0ZWQgaW1hZ2UuIERhdGEgaW4gJ0FOSU0nIGFuZCAnQU5NRicgY2h1bmtzIHNob3VsZCBiZQorICB1c2VkIHRvIGNvbnRyb2wgdGhlIGFuaW1hdGlvbi4KKworUmVzZXJ2ZWQgKFIpOiAxIGJpdAorCis6IFNIT1VMRCBiZSBgMGAuCisKK1Jlc2VydmVkOiAyNCBiaXRzCisKKzogU0hPVUxEIGJlIGAwYC4KKworQ2FudmFzIFdpZHRoIE1pbnVzIE9uZTogMjQgYml0cworCis6IF8xLWJhc2VkXyB3aWR0aCBvZiB0aGUgY2FudmFzIGluIHBpeGVscy4KKyAgVGhlIGFjdHVhbCBjYW52YXMgd2lkdGggaXMgJzEgKyBDYW52YXMgV2lkdGggTWludXMgT25lJworCitDYW52YXMgSGVpZ2h0IE1pbnVzIE9uZTogMjQgYml0cworCis6IF8xLWJhc2VkXyBoZWlnaHQgb2YgdGhlIGNhbnZhcyBpbiBwaXhlbHMuCisgIFRoZSBhY3R1YWwgY2FudmFzIGhlaWdodCBpcyAnMSArIENhbnZhcyBIZWlnaHQgTWludXMgT25lJworCitUaGUgcHJvZHVjdCBvZiBfQ2FudmFzIFdpZHRoXyBhbmQgX0NhbnZhcyBIZWlnaHRfIE1VU1QgYmUgYXQgbW9zdCBgMl4zMiAtIDFgLgorCitGdXR1cmUgc3BlY2lmaWNhdGlvbnMgTUFZIGFkZCBtb3JlIGZpZWxkcy4KKworIyMjIENodW5rcworCisjIyMjIEFuaW1hdGlvbgorCitBbiBhbmltYXRpb24gaXMgY29udHJvbGxlZCBieSBBTklNIGFuZCBBTk1GIGNodW5rcy4KKworQU5JTSBDaHVuazoKK3s6I2FuaW1fY2h1bmt9CisKK0ZvciBhbiBhbmltYXRlZCBpbWFnZSwgdGhpcyBjaHVuayBjb250YWlucyB0aGUgX2dsb2JhbCBwYXJhbWV0ZXJzXyBvZiB0aGUKK2FuaW1hdGlvbi4KKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignQU5JTScpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgIEJhY2tncm91bmQgQ29sb3IgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgIExvb3AgQ291bnQgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworQmFja2dyb3VuZCBDb2xvcjogMzIgYml0cyAoX3VpbnQzMl8pCisKKzogVGhlIGRlZmF1bHQgYmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2FudmFzIGluIFxbQmx1ZSwgR3JlZW4sIFJlZCwgQWxwaGFcXQorICBieXRlIG9yZGVyLiBUaGlzIGNvbG9yIE1BWSBiZSB1c2VkIHRvIGZpbGwgdGhlIHVudXNlZCBzcGFjZSBvbiB0aGUgY2FudmFzCisgIGFyb3VuZCB0aGUgZnJhbWVzLCBhcyB3ZWxsIGFzIHRoZSB0cmFuc3BhcmVudCBwaXhlbHMgb2YgdGhlIGZpcnN0IGZyYW1lLgorICBCYWNrZ3JvdW5kIGNvbG9yIGlzIGFsc28gdXNlZCB3aGVuIGRpc3Bvc2FsIG1ldGhvZCBpcyBgMWAuCisKKyoqTm90ZSoqOgorCisgICogQmFja2dyb3VuZCBjb2xvciBNQVkgY29udGFpbiBhIHRyYW5zcGFyZW5jeSB2YWx1ZSAoYWxwaGEpLCBldmVuIGlmIHRoZQorICAgIF9BbHBoYV8gZmxhZyBpbiBbVlA4WCBjaHVua10oI2V4dGVuZGVkX2hlYWRlcikgaXMgdW5zZXQuCisKKyAgKiBWaWV3ZXIgYXBwbGljYXRpb25zIFNIT1VMRCB0cmVhdCB0aGUgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSBhcyBhIGhpbnQsIGFuZAorICAgIGFyZSBub3QgcmVxdWlyZWQgdG8gdXNlIGl0LgorCisgICogVGhlIGNhbnZhcyBpcyBjbGVhcmVkIGF0IHRoZSBzdGFydCBvZiBlYWNoIGxvb3AuIFRoZSBiYWNrZ3JvdW5kIGNvbG9yIE1BWSBiZQorICAgIHVzZWQgdG8gYWNoaWV2ZSB0aGlzLgorCitMb29wIENvdW50OiAxNiBiaXRzIChfdWludDE2XykKKworOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGxvb3AgdGhlIGFuaW1hdGlvbi4gYDBgIG1lYW5zIGluZmluaXRlbHkuCisKK1RoaXMgY2h1bmsgTVVTVCBhcHBlYXIgaWYgdGhlIF9BbmltYXRpb25fIGZsYWcgaW4gdGhlIFZQOFggY2h1bmsgaXMgc2V0LgorSWYgdGhlIF9BbmltYXRpb25fIGZsYWcgaXMgbm90IHNldCBhbmQgdGhpcyBjaHVuayBpcyBwcmVzZW50LCBpdAorU0hPVUxEIGJlIGlnbm9yZWQuCisKK0FOTUYgY2h1bms6CisKK0ZvciBhbmltYXRlZCBpbWFnZXMsIHRoaXMgY2h1bmsgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBfc2luZ2xlXyBmcmFtZS4KK0lmIHRoZSBfQW5pbWF0aW9uIGZsYWdfIGlzIG5vdCBzZXQsIHRoZW4gdGhpcyBjaHVuayBTSE9VTEQgTk9UIGJlIHByZXNlbnQuCisKKyAgICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICAgICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgQ2h1bmtIZWFkZXIoJ0FOTUYnKSAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgWCAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgIC4uLgorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgLi4uICAgICAgICAgIEZyYW1lIFkgICAgICAgICAgICB8ICAgRnJhbWUgV2lkdGggTWludXMgT25lICAgICAuLi4KKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIC4uLiAgICAgICAgICAgICB8ICAgICAgICAgICBGcmFtZSBIZWlnaHQgTWludXMgT25lICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICBGcmFtZSBEdXJhdGlvbiAgICAgICAgICAgICAgICB8ICBSZXNlcnZlZCB8QnxEfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBEYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitGcmFtZSBYOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgWCBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgaXMgYEZyYW1lIFggKiAyYAorCitGcmFtZSBZOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgWSBjb29yZGluYXRlIG9mIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgZnJhbWUgaXMgYEZyYW1lIFkgKiAyYAorCitGcmFtZSBXaWR0aCBNaW51cyBPbmU6IDI0IGJpdHMgKF91aW50MjRfKQorCis6IFRoZSBfMS1iYXNlZF8gd2lkdGggb2YgdGhlIGZyYW1lLgorICBUaGUgZnJhbWUgd2lkdGggaXMgYDEgKyBGcmFtZSBXaWR0aCBNaW51cyBPbmVgCisKK0ZyYW1lIEhlaWdodCBNaW51cyBPbmU6IDI0IGJpdHMgKF91aW50MjRfKQorCis6IFRoZSBfMS1iYXNlZF8gaGVpZ2h0IG9mIHRoZSBmcmFtZS4KKyAgVGhlIGZyYW1lIGhlaWdodCBpcyBgMSArIEZyYW1lIEhlaWdodCBNaW51cyBPbmVgCisKK0ZyYW1lIER1cmF0aW9uOiAyNCBiaXRzIChfdWludDI0XykKKworOiBUaGUgdGltZSB0byB3YWl0IGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0IGZyYW1lLCBpbiAxIG1pbGxpc2Vjb25kIHVuaXRzLgorICBOb3RlIHRoZSBpbnRlcnByZXRhdGlvbiBvZiBmcmFtZSBkdXJhdGlvbiBvZiAwIChhbmQgb2Z0ZW4gPD0gMTApIGlzCisgIGltcGxlbWVudGF0aW9uIGRlZmluZWQuIE1hbnkgdG9vbHMgYW5kIGJyb3dzZXJzIGFzc2lnbiBhIG1pbmltdW0gZHVyYXRpb24KKyAgc2ltaWxhciB0byBHSUYuCisKK1Jlc2VydmVkOiA2IGJpdHMKKworOiBTSE9VTEQgYmUgMC4KKworQmxlbmRpbmcgbWV0aG9kIChCKTogMSBiaXQKKworOiBJbmRpY2F0ZXMgaG93IHRyYW5zcGFyZW50IHBpeGVscyBvZiBfdGhlIGN1cnJlbnQgZnJhbWVfIGFyZSB0byBiZSBibGVuZGVkCisgIHdpdGggY29ycmVzcG9uZGluZyBwaXhlbHMgb2YgdGhlIHByZXZpb3VzIGNhbnZhczoKKworICAgICogYDBgOiBVc2UgYWxwaGEgYmxlbmRpbmcuIEFmdGVyIGRpc3Bvc2luZyBvZiB0aGUgcHJldmlvdXMgZnJhbWUsIHJlbmRlciB0aGUKKyAgICAgIGN1cnJlbnQgZnJhbWUgb24gdGhlIGNhbnZhcyB1c2luZyBbYWxwaGEtYmxlbmRpbmddKCNhbHBoYS1ibGVuZGluZykuIElmCisgICAgICB0aGUgY3VycmVudCBmcmFtZSBkb2VzIG5vdCBoYXZlIGFuIGFscGhhIGNoYW5uZWwsIGFzc3VtZSBhbHBoYSB2YWx1ZSBvZgorICAgICAgMjU1LCBlZmZlY3RpdmVseSByZXBsYWNpbmcgdGhlIHJlY3RhbmdsZS4KKworICAgICogYDFgOiBEbyBub3QgYmxlbmQuIEFmdGVyIGRpc3Bvc2luZyBvZiB0aGUgcHJldmlvdXMgZnJhbWUsIHJlbmRlciB0aGUKKyAgICAgIGN1cnJlbnQgZnJhbWUgb24gdGhlIGNhbnZhcyBieSBvdmVyd3JpdGluZyB0aGUgcmVjdGFuZ2xlIGNvdmVyZWQgYnkgdGhlCisgICAgICBjdXJyZW50IGZyYW1lLgorCitEaXNwb3NhbCBtZXRob2QgKEQpOiAxIGJpdAorCis6IEluZGljYXRlcyBob3cgX3RoZSBjdXJyZW50IGZyYW1lXyBpcyB0byBiZSB0cmVhdGVkIGFmdGVyIGl0IGhhcyBiZWVuCisgIGRpc3BsYXllZCAoYmVmb3JlIHJlbmRlcmluZyB0aGUgbmV4dCBmcmFtZSkgb24gdGhlIGNhbnZhczoKKworICAgICogYDBgOiBEbyBub3QgZGlzcG9zZS4gTGVhdmUgdGhlIGNhbnZhcyBhcyBpcy4KKworICAgICogYDFgOiBEaXNwb3NlIHRvIGJhY2tncm91bmQgY29sb3IuIEZpbGwgdGhlIF9yZWN0YW5nbGVfIG9uIHRoZSBjYW52YXMKKyAgICAgIGNvdmVyZWQgYnkgdGhlIF9jdXJyZW50IGZyYW1lXyB3aXRoIGJhY2tncm91bmQgY29sb3Igc3BlY2lmaWVkIGluIHRoZQorICAgICAgW0FOSU0gY2h1bmtdKCNhbmltX2NodW5rKS4KKworKipOb3RlcyoqOgorCisgICogVGhlIGZyYW1lIGRpc3Bvc2FsIG9ubHkgYXBwbGllcyB0byB0aGUgX2ZyYW1lIHJlY3RhbmdsZV8sIHRoYXQgaXMsIHRoZQorICAgIHJlY3RhbmdsZSBkZWZpbmVkIGJ5IF9GcmFtZSBYXywgX0ZyYW1lIFlfLCBfZnJhbWUgd2lkdGhfIGFuZCBfZnJhbWUgaGVpZ2h0Xy4KKyAgICBJdCBtYXkgb3IgbWF5IG5vdCBjb3ZlciB0aGUgd2hvbGUgY2FudmFzLgorCit7OiNhbHBoYS1ibGVuZGluZ30KKyAgKiAqKkFscGhhLWJsZW5kaW5nKio6CisKKyAgICBHaXZlbiB0aGF0IGVhY2ggb2YgdGhlIFIsIEcsIEIgYW5kIEEgY2hhbm5lbHMgaXMgOC1iaXQsIGFuZCB0aGUgUkdCCisgICAgY2hhbm5lbHMgYXJlIF9ub3QgcHJlbXVsdGlwbGllZF8gYnkgYWxwaGEsIHRoZSBmb3JtdWxhIGZvciBibGVuZGluZworICAgICdkc3QnIG9udG8gJ3NyYycgaXM6CisKK35+fn5+CisgICAgYmxlbmQuQSA9IHNyYy5BICsgZHN0LkEgKiAoMSAtIHNyYy5BIC8gMjU1KQorICAgIGlmIGJsZW5kLkEgPSAwIHRoZW4KKyAgICAgIGJsZW5kLlJHQiA9IDAKKyAgICBlbHNlCisgICAgICBibGVuZC5SR0IgPSAoc3JjLlJHQiAqIHNyYy5BICsKKyAgICAgICAgICAgICAgICAgICBkc3QuUkdCICogZHN0LkEgKiAoMSAtIHNyYy5BIC8gMjU1KSkgLyBibGVuZC5BCit+fn5+fgorCisgICogQWxwaGEtYmxlbmRpbmcgU0hPVUxEIGJlIGRvbmUgaW4gbGluZWFyIGNvbG9yIHNwYWNlLCBieSB0YWtpbmcgaW50byBhY2NvdW50CisgICAgdGhlIFtjb2xvciBwcm9maWxlXSgjY29sb3ItcHJvZmlsZSkgb2YgdGhlIGltYWdlLiBJZiB0aGUgY29sb3IgcHJvZmlsZSBpcworICAgIG5vdCBwcmVzZW50LCBzUkdCIGlzIHRvIGJlIGFzc3VtZWQuIChOb3RlIHRoYXQgc1JHQiBhbHNvIG5lZWRzIHRvIGJlCisgICAgbGluZWFyaXplZCBkdWUgdG8gYSBnYW1tYSBvZiB+Mi4yKS4KKworRnJhbWUgRGF0YTogX0NodW5rIFNpemVfIC0gYDE2YCBieXRlcworCis6IENvbnNpc3RzIG9mOgorCisgICogQW4gb3B0aW9uYWwgW2FscGhhIHN1YmNodW5rXSgjYWxwaGEpIGZvciB0aGUgZnJhbWUuCisKKyAgKiBBIFtiaXRzdHJlYW0gc3ViY2h1bmtdKCNiaXRzdHJlYW0tdnA4dnA4bCkgZm9yIHRoZSBmcmFtZS4KKworICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2YgW3Vua25vd24gY2h1bmtzXSgjdW5rbm93bi1jaHVua3MpLgorCisqKk5vdGUqKjogVGhlICdBTk1GJyBwYXlsb2FkLCBfRnJhbWUgRGF0YV8gYWJvdmUsIGNvbnNpc3RzIG9mIGluZGl2aWR1YWwKK19wYWRkZWRfIGNodW5rcyBhcyBkZXNjcmliZWQgYnkgdGhlIFtSSUZGIGZpbGUgZm9ybWF0XSgjcmlmZi1maWxlLWZvcm1hdCkuCisKKyMjIyMgQWxwaGEKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignQUxQSCcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHxSc3Z8IFAgfCBGIHwgQyB8ICAgICBBbHBoYSBCaXRzdHJlYW0uLi4gICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworUmVzZXJ2ZWQgKFJzdik6IDIgYml0cworCis6IFNIT1VMRCBiZSBgMGAuCisKK1ByZS1wcm9jZXNzaW5nIChQKTogMiBiaXRzCisKKzogVGhlc2UgSU5GT1JNQVRJVkUgYml0cyBhcmUgdXNlZCB0byBzaWduYWwgdGhlIHByZS1wcm9jZXNzaW5nIHRoYXQgaGFzCisgIGJlZW4gcGVyZm9ybWVkIGR1cmluZyBjb21wcmVzc2lvbi4gVGhlIGRlY29kZXIgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvCisgIGUuZy4gZGl0aGVyIHRoZSB2YWx1ZXMgb3Igc21vb3RoIHRoZSBncmFkaWVudHMgcHJpb3IgdG8gZGlzcGxheS4KKworICAgICogYDBgOiBubyBwcmUtcHJvY2Vzc2luZworICAgICogYDFgOiBsZXZlbCByZWR1Y3Rpb24KKworRmlsdGVyaW5nIG1ldGhvZCAoRik6IDIgYml0cworCis6IFRoZSBmaWx0ZXJpbmcgbWV0aG9kIHVzZWQ6CisKKyAgICAqIGAwYDogTm9uZS4KKyAgICAqIGAxYDogSG9yaXpvbnRhbCBmaWx0ZXIuCisgICAgKiBgMmA6IFZlcnRpY2FsIGZpbHRlci4KKyAgICAqIGAzYDogR3JhZGllbnQgZmlsdGVyLgorCitGb3IgZWFjaCBwaXhlbCwgZmlsdGVyaW5nIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGNhbGN1bGF0aW9ucy4KK0Fzc3VtZSB0aGUgYWxwaGEgdmFsdWVzIHN1cnJvdW5kaW5nIHRoZSBjdXJyZW50IGBYYCBwb3NpdGlvbiBhcmUgbGFiZWxlZCBhczoKKworICAgICBDIHwgQiB8CisgICAgLS0tKy0tLSsKKyAgICAgQSB8IFggfAorCitXZSBzZWVrIHRvIGNvbXB1dGUgdGhlIGFscGhhIHZhbHVlIGF0IHBvc2l0aW9uIGBYYC4gRmlyc3QsIGEgcHJlZGljdGlvbiBpcworbWFkZSBkZXBlbmRpbmcgb24gdGhlIGZpbHRlcmluZyBtZXRob2Q6CisKKyAgKiBNZXRob2QgYDBgOiBwcmVkaWN0b3IgPSAwCisgICogTWV0aG9kIGAxYDogcHJlZGljdG9yID0gQQorICAqIE1ldGhvZCBgMmA6IHByZWRpY3RvciA9IEIKKyAgKiBNZXRob2QgYDNgOiBwcmVkaWN0b3IgPSBjbGlwKEEgKyBCIC0gQykKKword2hlcmUgYGNsaXAodilgIGlzIGVxdWFsIHRvOgorCisgICogMCAgICBpZiB2IDwgMAorICAqIDI1NSAgaWYgdiA+IDI1NQorICAqIHYgICAgb3RoZXJ3aXNlCisKK1RoZSBmaW5hbCB2YWx1ZSBpcyBkZXJpdmVkIGJ5IGFkZGluZyB0aGUgZGVjb21wcmVzc2VkIHZhbHVlIGBYYCB0byB0aGUKK3ByZWRpY3RvciBhbmQgdXNpbmcgbW9kdWxvLTI1NiBhcml0aG1ldGljIHRvIHdyYXAgdGhlIFxbMjU2LTUxMVxdIHJhbmdlCitpbnRvIHRoZSBcWzAtMjU1XF0gb25lOgorCitgYWxwaGEgPSAocHJlZGljdG9yICsgWCkgJSAyNTZgCisKK1RoZXJlIGFyZSBzcGVjaWFsIGNhc2VzIGZvciBsZWZ0LW1vc3QgYW5kIHRvcC1tb3N0IHBpeGVsIHBvc2l0aW9uczoKKworICAqIFRvcC1sZWZ0IHZhbHVlIGF0IGxvY2F0aW9uICgwLDApIHVzZXMgMCBhcyBwcmVkaWN0b3IgdmFsdWUuIE90aGVyd2lzZSwKKyAgKiBGb3IgaG9yaXpvbnRhbCBvciBncmFkaWVudCBmaWx0ZXJpbmcgbWV0aG9kcywgdGhlIGxlZnQtbW9zdCBwaXhlbHMgYXQKKyAgICBsb2NhdGlvbiAoMCwgeSkgYXJlIHByZWRpY3RlZCB1c2luZyB0aGUgbG9jYXRpb24gKDAsIHktMSkganVzdCBhYm92ZS4KKyAgKiBGb3IgdmVydGljYWwgb3IgZ3JhZGllbnQgZmlsdGVyaW5nIG1ldGhvZHMsIHRoZSB0b3AtbW9zdCBwaXhlbHMgYXQKKyAgICBsb2NhdGlvbiAoeCwgMCkgYXJlIHByZWRpY3RlZCB1c2luZyB0aGUgbG9jYXRpb24gKHgtMSwgMCkgb24gdGhlIGxlZnQuCisKKworRGVjb2RlcnMgYXJlIG5vdCByZXF1aXJlZCB0byB1c2UgdGhpcyBpbmZvcm1hdGlvbiBpbiBhbnkgc3BlY2lmaWVkIHdheS4KKworQ29tcHJlc3Npb24gbWV0aG9kIChDKTogMiBiaXRzCisKKzogVGhlIGNvbXByZXNzaW9uIG1ldGhvZCB1c2VkOgorCisgICAgKiBgMGA6IE5vIGNvbXByZXNzaW9uLgorICAgICogYDFgOiBDb21wcmVzc2VkIHVzaW5nIHRoZSBXZWJQIGxvc3NsZXNzIGZvcm1hdC4KKworQWxwaGEgYml0c3RyZWFtOiBfQ2h1bmsgU2l6ZV8gLSBgMWAgYnl0ZXMKKworOiBFbmNvZGVkIGFscGhhIGJpdHN0cmVhbS4KKworVGhpcyBvcHRpb25hbCBjaHVuayBjb250YWlucyBlbmNvZGVkIGFscGhhIGRhdGEgZm9yIHRoaXMgZnJhbWUuIEEgZnJhbWUKK2NvbnRhaW5pbmcgYSAnVlA4TCcgY2h1bmsgU0hPVUxEIE5PVCBjb250YWluIHRoaXMgY2h1bmsuCisKKyoqUmF0aW9uYWxlKio6IFRoZSB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24gaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSAnVlA4TCcKK2NodW5rLgorCitUaGUgYWxwaGEgY2hhbm5lbCBkYXRhIGlzIHN0b3JlZCBhcyB1bmNvbXByZXNzZWQgcmF3IGRhdGEgKHdoZW4KK2NvbXByZXNzaW9uIG1ldGhvZCBpcyAnMCcpIG9yIGNvbXByZXNzZWQgdXNpbmcgdGhlIGxvc3NsZXNzIGZvcm1hdAorKHdoZW4gdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBpcyAnMScpLgorCisgICogUmF3IGRhdGE6IGNvbnNpc3RzIG9mIGEgYnl0ZSBzZXF1ZW5jZSBvZiBsZW5ndGggd2lkdGggKiBoZWlnaHQsCisgICAgY29udGFpbmluZyBhbGwgdGhlIDgtYml0IHRyYW5zcGFyZW5jeSB2YWx1ZXMgaW4gc2NhbiBvcmRlci4KKworICAqIExvc3NsZXNzIGZvcm1hdCBjb21wcmVzc2lvbjogdGhlIGJ5dGUgc2VxdWVuY2UgaXMgYSBjb21wcmVzc2VkCisgICAgaW1hZ2Utc3RyZWFtIChhcyBkZXNjcmliZWQgaW4gdGhlIFtXZWJQIExvc3NsZXNzIEJpdHN0cmVhbSBGb3JtYXRdCisgICAgW3dlYnBsbHNwZWNdKSBvZiBpbXBsaWNpdCBkaW1lbnNpb24gd2lkdGggeCBoZWlnaHQuIFRoYXQgaXMsIHRoaXMKKyAgICBpbWFnZS1zdHJlYW0gZG9lcyBOT1QgY29udGFpbiBhbnkgaGVhZGVycyBkZXNjcmliaW5nIHRoZSBpbWFnZSBkaW1lbnNpb24uCisKKyAgICAqKlJhdGlvbmFsZSoqOiB0aGUgZGltZW5zaW9uIGlzIGFscmVhZHkga25vd24gZnJvbSBvdGhlciBzb3VyY2VzLAorICAgIHNvIHN0b3JpbmcgaXQgYWdhaW4gd291bGQgYmUgcmVkdW5kYW50IGFuZCBlcnJvci1wcm9uZS4KKworICAgIE9uY2UgdGhlIGltYWdlLXN0cmVhbSBpcyBkZWNvZGVkIGludG8gQVJHQiBjb2xvciB2YWx1ZXMsIGZvbGxvd2luZworICAgIHRoZSBwcm9jZXNzIGRlc2NyaWJlZCBpbiB0aGUgbG9zc2xlc3MgZm9ybWF0IHNwZWNpZmljYXRpb24sIHRoZQorICAgIHRyYW5zcGFyZW5jeSBpbmZvcm1hdGlvbiBtdXN0IGJlIGV4dHJhY3RlZCBmcm9tIHRoZSAqZ3JlZW4qIGNoYW5uZWwKKyAgICBvZiB0aGUgQVJHQiBxdWFkcnVwbGV0LgorCisgICAgKipSYXRpb25hbGUqKjogdGhlIGdyZWVuIGNoYW5uZWwgaXMgYWxsb3dlZCBleHRyYSB0cmFuc2Zvcm1hdGlvbgorICAgIHN0ZXBzIGluIHRoZSBzcGVjaWZpY2F0aW9uIC0tIHVubGlrZSB0aGUgb3RoZXIgY2hhbm5lbHMgLS0gdGhhdCBjYW4KKyAgICBpbXByb3ZlIGNvbXByZXNzaW9uLgorCisjIyMjIEJpdHN0cmVhbSAoVlA4L1ZQOEwpCisKK1RoaXMgY2h1bmsgY29udGFpbnMgY29tcHJlc3NlZCBiaXRzdHJlYW0gZGF0YSBmb3IgYSBzaW5nbGUgZnJhbWUuCisKK0EgYml0c3RyZWFtIGNodW5rIG1heSBiZSBlaXRoZXIgKGkpIGEgVlA4IGNodW5rLCB1c2luZyAiVlA4ICIgKG5vdGUgdGhlCitzaWduaWZpY2FudCBmb3VydGgtY2hhcmFjdGVyIHNwYWNlKSBhcyBpdHMgdGFnIF9vcl8gKGlpKSBhIFZQOEwgY2h1bmssIHVzaW5nCisiVlA4TCIgYXMgaXRzIHRhZy4KKworVGhlIGZvcm1hdHMgb2YgVlA4IGFuZCBWUDhMIGNodW5rcyBhcmUgYXMgZGVzY3JpYmVkIGluIHNlY3Rpb25zCitbU2ltcGxlIEZpbGUgRm9ybWF0IChMb3NzeSldKCNzaW1wbGUtZmlsZS1mb3JtYXQtbG9zc3kpCithbmQgW1NpbXBsZSBGaWxlIEZvcm1hdCAoTG9zc2xlc3MpXSgjc2ltcGxlLWZpbGUtZm9ybWF0LWxvc3NsZXNzKSByZXNwZWN0aXZlbHkuCisKKyMjIyMgQ29sb3IgcHJvZmlsZQorCisgICAgIDAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgIDMKKyAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIENodW5rSGVhZGVyKCdJQ0NQJykgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgQ29sb3IgUHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCitDb2xvciBQcm9maWxlOiBfQ2h1bmsgU2l6ZV8gYnl0ZXMKKworOiBJQ0MgcHJvZmlsZS4KKworVGhpcyBjaHVuayBNVVNUIGFwcGVhciBiZWZvcmUgdGhlIGltYWdlIGRhdGEuCisKK1RoZXJlIFNIT1VMRCBiZSBhdCBtb3N0IG9uZSBzdWNoIGNodW5rLiBJZiB0aGVyZSBhcmUgbW9yZSBzdWNoIGNodW5rcywgcmVhZGVycworTUFZIGlnbm9yZSBhbGwgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCitTZWUgdGhlIFtJQ0MgU3BlY2lmaWNhdGlvbl1baWNjc3BlY10gZm9yIGRldGFpbHMuCisKK0lmIHRoaXMgY2h1bmsgaXMgbm90IHByZXNlbnQsIHNSR0IgU0hPVUxEIGJlIGFzc3VtZWQuCisKKyMjIyMgTWV0YWRhdGEKKworTWV0YWRhdGEgY2FuIGJlIHN0b3JlZCBpbiAnRVhJRicgb3IgJ1hNUCAnIGNodW5rcy4KKworVGhlcmUgU0hPVUxEIGJlIGF0IG1vc3Qgb25lIGNodW5rIG9mIGVhY2ggdHlwZSAoJ0VYSUYnIGFuZCAnWE1QICcpLiBJZiB0aGVyZQorYXJlIG1vcmUgc3VjaCBjaHVua3MsIHJlYWRlcnMgTUFZIGlnbm9yZSBhbGwgZXhjZXB0IHRoZSBmaXJzdCBvbmUuIEFsc28sIGEgZmlsZQorbWF5IHBvc3NpYmx5IGNvbnRhaW4gYm90aCAnRVhJRicgYW5kICdYTVAgJyBjaHVua3MuCisKK1RoZSBjaHVua3MgYXJlIGRlZmluZWQgYXMgZm9sbG93czoKKworRVhJRiBjaHVuazoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignRVhJRicpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBFWElGIE1ldGFkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworRVhJRiBNZXRhZGF0YTogX0NodW5rIFNpemVfIGJ5dGVzCisKKzogaW1hZ2UgbWV0YWRhdGEgaW4gRVhJRiBmb3JtYXQuCisKK1hNUCBjaHVuazoKKworICAgICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgICAgIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgICBDaHVua0hlYWRlcignWE1QICcpICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgICBYTVAgTWV0YWRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworWE1QIE1ldGFkYXRhOiBfQ2h1bmsgU2l6ZV8gYnl0ZXMKKworOiBpbWFnZSBtZXRhZGF0YSBpbiBYTVAgZm9ybWF0LgorCitBZGRpdGlvbmFsIGd1aWRhbmNlIGFib3V0IGhhbmRsaW5nIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBpbiB0aGUKK01ldGFkYXRhIFdvcmtpbmcgR3JvdXAncyBbR3VpZGVsaW5lcyBmb3IgSGFuZGxpbmcgTWV0YWRhdGFdW21ldGFkYXRhXS4KKworIyMjIyBVbmtub3duIENodW5rcyBfXFtzdGF0dXM6IGV4cGVyaW1lbnRhbFxdXworCitBIFJJRkYgY2h1bmsgKGRlc2NyaWJlZCBpbiBbdGhpc10oI3Rlcm1pbm9sb2d5LWFtcC1iYXNpY3MpIHNlY3Rpb24pIHdob3NlIF9jaHVuawordGFnXyBpcyBkaWZmZXJlbnQgZnJvbSBhbnkgb2YgdGhlIGNodW5rcyBkZXNjcmliZWQgaW4gdGhpcyBkb2N1bWVudCwgaXMKK2NvbnNpZGVyZWQgYW4gX3Vua25vd24gY2h1bmtfLgorCisqKlJhdGlvbmFsZSoqOiBBbGxvd2luZyB1bmtub3duIGNodW5rcyBnaXZlcyBhIHByb3Zpc2lvbiBmb3IgZnV0dXJlIGV4dGVuc2lvbgorb2YgdGhlIGZvcm1hdCwgYW5kIGFsc28gYWxsb3dzIHN0b3JhZ2Ugb2YgYW55IGFwcGxpY2F0aW9uLXNwZWNpZmljIGRhdGEuCisKK0EgZmlsZSBNQVkgY29udGFpbiB1bmtub3duIGNodW5rczoKKworICAqIEF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgYXMgZGVzY3JpYmVkIGluIFtFeHRlbmRlZCBXZWJQIGZpbGUKKyAgICBoZWFkZXJdKCNleHRlbmRlZF9oZWFkZXIpIHNlY3Rpb24uCisgICogQXQgdGhlIGVuZCBvZiBBTk1GIGNodW5rcyBhcyBkZXNjcmliZWQgaW4gdGhlCisgICAgW0FuaW1hdGlvbl0oI2FuaW1hdGlvbikgc2VjdGlvbi4KKworUmVhZGVycyBTSE9VTEQgaWdub3JlIHRoZXNlIGNodW5rcy4gV3JpdGVycyBTSE9VTEQgcHJlc2VydmUgdGhlbSBpbiB0aGVpcgorb3JpZ2luYWwgb3JkZXIgKHVubGVzcyB0aGV5IHNwZWNpZmljYWxseSBpbnRlbmQgdG8gbW9kaWZ5IHRoZXNlIGNodW5rcykuCisKKyMjIyBBc3NlbWJsaW5nIHRoZSBDYW52YXMgZnJvbSBmcmFtZXMKKworSGVyZSB3ZSBwcm92aWRlIGFuIG92ZXJ2aWV3IG9mIGhvdyBhIHJlYWRlciBzaG91bGQgYXNzZW1ibGUgYSBjYW52YXMgaW4gdGhlCitjYXNlIG9mIGFuIGFuaW1hdGVkIGltYWdlLiBUaGUgbm90YXRpb24gX1ZQOFguZmllbGRfIG1lYW5zIHRoZSBmaWVsZCBpbiB0aGUKKydWUDhYJyBjaHVuayB3aXRoIHRoZSBzYW1lIGRlc2NyaXB0aW9uLgorCitEaXNwbGF5aW5nIGFuIF9hbmltYXRlZCBpbWFnZV8gY2FudmFzIE1VU1QgYmUgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nCitwc2V1ZG9jb2RlOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorYXNzZXJ0IFZQOFguZmxhZ3MuaGFzQW5pbWF0aW9uCitjYW52YXMg4oaQIG5ldyBpbWFnZSBvZiBzaXplIFZQOFguY2FudmFzV2lkdGggeCBWUDhYLmNhbnZhc0hlaWdodCB3aXRoCisgICAgICAgICBiYWNrZ3JvdW5kIGNvbG9yIEFOSU0uYmFja2dyb3VuZF9jb2xvci4KK2xvb3BfY291bnQg4oaQIEFOSU0ubG9vcENvdW50CitkaXNwb3NlX21ldGhvZCDihpAgQU5JTS5kaXNwb3NlTWV0aG9kCitpZiBsb29wX2NvdW50ID09IDA6CisgICAgbG9vcF9jb3VudCA9IOKIngorZnJhbWVfcGFyYW1zIOKGkCBuaWwKK2Fzc2VydCBuZXh0IGNodW5rIGluIGltYWdlX2RhdGEgaXMgQU5NRgorZm9yIGxvb3AgPSAwLi5sb29wX2NvdW50IC0gMQorICAgIGNsZWFyIGNhbnZhcyB0byBBTklNLmJhY2tncm91bmRfY29sb3Igb3IgYXBwbGljYXRpb24gZGVmaW5lZCBjb2xvcgorICAgIHVudGlsIGVvZiBvciBub24tQU5NRiBjaHVuaworICAgICAgICBmcmFtZV9wYXJhbXMuZnJhbWVYID0gRnJhbWUgWAorICAgICAgICBmcmFtZV9wYXJhbXMuZnJhbWVZID0gRnJhbWUgWQorICAgICAgICBmcmFtZV9wYXJhbXMuZnJhbWVXaWR0aCA9IEZyYW1lIFdpZHRoIE1pbnVzIE9uZSArIDEKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lSGVpZ2h0ID0gRnJhbWUgSGVpZ2h0IE1pbnVzIE9uZSArIDEKKyAgICAgICAgZnJhbWVfcGFyYW1zLmZyYW1lRHVyYXRpb24gPSBGcmFtZSBEdXJhdGlvbgorICAgICAgICBmcmFtZV9yaWdodCA9IGZyYW1lX3BhcmFtcy5mcmFtZVggKyBmcmFtZV9wYXJhbXMuZnJhbWVXaWR0aAorICAgICAgICBmcmFtZV9ib3R0b20gPSBmcmFtZV9wYXJhbXMuZnJhbWVZICsgZnJhbWVfcGFyYW1zLmZyYW1lSGVpZ2h0CisgICAgICAgIGFzc2VydCBWUDhYLmNhbnZhc1dpZHRoID49IGZyYW1lX3JpZ2h0CisgICAgICAgIGFzc2VydCBWUDhYLmNhbnZhc0hlaWdodCA+PSBmcmFtZV9ib3R0b20KKyAgICAgICAgZm9yIHN1YmNodW5rIGluICdGcmFtZSBEYXRhJzoKKyAgICAgICAgICAgIGlmIHN1YmNodW5rLnRhZyA9PSAiQUxQSCI6CisgICAgICAgICAgICAgICAgYXNzZXJ0IGFscGhhIHN1YmNodW5rcyBub3QgZm91bmQgaW4gJ0ZyYW1lIERhdGEnIGVhcmxpZXIKKyAgICAgICAgICAgICAgICBmcmFtZV9wYXJhbXMuYWxwaGEgPSBhbHBoYV9kYXRhCisgICAgICAgICAgICBlbHNlIGlmIHN1YmNodW5rLnRhZyA9PSAiVlA4ICIgT1Igc3ViY2h1bmsudGFnID09ICJWUDhMIjoKKyAgICAgICAgICAgICAgICBhc3NlcnQgYml0c3RyZWFtIHN1YmNodW5rcyBub3QgZm91bmQgaW4gJ0ZyYW1lIERhdGEnIGVhcmxpZXIKKyAgICAgICAgICAgICAgICBmcmFtZV9wYXJhbXMuYml0c3RyZWFtID0gYml0c3RyZWFtX2RhdGEKKyAgICAgICAgcmVuZGVyIGZyYW1lIHdpdGggZnJhbWVfcGFyYW1zLmFscGhhIGFuZCBmcmFtZV9wYXJhbXMuYml0c3RyZWFtIG9uCisgICAgICAgICAgICBjYW52YXMgd2l0aCB0b3AtbGVmdCBjb3JuZXIgYXQgKGZyYW1lX3BhcmFtcy5mcmFtZVgsCisgICAgICAgICAgICBmcmFtZV9wYXJhbXMuZnJhbWVZKSwgdXNpbmcgZGlzcG9zZSBtZXRob2QgZGlzcG9zZV9tZXRob2QuCisgICAgICAgIGNhbnZhcyBjb250YWlucyB0aGUgZGVjb2RlZCBpbWFnZS4KKyAgICAgICAgU2hvdyB0aGUgY29udGVudHMgb2YgdGhlIGNhbnZhcyBmb3IgZnJhbWVfcGFyYW1zLmZyYW1lRHVyYXRpb24gKiAxbXMuCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKK0V4YW1wbGUgRmlsZSBMYXlvdXRzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIGxvc3N5IGVuY29kZWQgaW1hZ2Ugd2l0aCBhbHBoYSBtYXkgbG9vayBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorUklGRi9XRUJQCisrLSBWUDhYIChkZXNjcmlwdGlvbnMgb2YgZmVhdHVyZXMgdXNlZCkKKystIEFMUEggKGFscGhhIGJpdHN0cmVhbSkKKystIFZQOCAoYml0c3RyZWFtKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBsb3NzbGVzc2x5IGVuY29kZWQgaW1hZ2UgbWF5IGxvb2sgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK1JJRkYvV0VCUAorKy0gVlA4WCAoZGVzY3JpcHRpb25zIG9mIGZlYXR1cmVzIHVzZWQpCisrLSBYWVpXICh1bmtub3duIGNodW5rKQorKy0gVlA4TCAobG9zc2xlc3MgYml0c3RyZWFtKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQSBsb3NzbGVzcyBpbWFnZSB3aXRoIElDQyBwcm9maWxlIGFuZCBYTVAgbWV0YWRhdGEgbWF5Citsb29rIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitSSUZGL1dFQlAKKystIFZQOFggKGRlc2NyaXB0aW9ucyBvZiBmZWF0dXJlcyB1c2VkKQorKy0gSUNDUCAoY29sb3IgcHJvZmlsZSkKKystIFZQOEwgKGxvc3NsZXNzIGJpdHN0cmVhbSkKKystIFhNUCAgKG1ldGFkYXRhKQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworQW4gYW5pbWF0ZWQgaW1hZ2Ugd2l0aCBFWElGIG1ldGFkYXRhIG1heSBsb29rIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitSSUZGL1dFQlAKKystIFZQOFggKGRlc2NyaXB0aW9ucyBvZiBmZWF0dXJlcyB1c2VkKQorKy0gQU5JTSAoZ2xvYmFsIGFuaW1hdGlvbiBwYXJhbWV0ZXJzKQorKy0gQU5NRiAoZnJhbWUxIHBhcmFtZXRlcnMgKyBkYXRhKQorKy0gQU5NRiAoZnJhbWUyIHBhcmFtZXRlcnMgKyBkYXRhKQorKy0gQU5NRiAoZnJhbWUzIHBhcmFtZXRlcnMgKyBkYXRhKQorKy0gQU5NRiAoZnJhbWU0IHBhcmFtZXRlcnMgKyBkYXRhKQorKy0gRVhJRiAobWV0YWRhdGEpCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitbdnA4c3BlY106ICBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2Mzg2Citbd2VicGxsc3BlY106IGh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAvKy9tYXN0ZXIvZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0CitbaWNjc3BlY106IGh0dHA6Ly93d3cuY29sb3Iub3JnL2ljY19zcGVjczIueGFsdGVyCitbbWV0YWRhdGFdOiBodHRwOi8vd3d3Lm1ldGFkYXRhd29ya2luZ2dyb3VwLm9yZy9wZGYvbXdnX2d1aWRhbmNlLnBkZgorW3JmYyAxMTY2XTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMTE2NgorW3JmYyAyMTE5XTogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjExOQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZG9jL3dlYnAtbG9zc2xlc3MtYml0c3RyZWFtLXNwZWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMmRkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kb2Mvd2VicC1sb3NzbGVzcy1iaXRzdHJlYW0tc3BlYy50eHQKQEAgLTAsMCArMSwxMDkwIEBACis8IS0tCisKK0FsdGhvdWdoIHlvdSBtYXkgYmUgdmlld2luZyBhbiBhbHRlcm5hdGUgcmVwcmVzZW50YXRpb24sIHRoaXMgZG9jdW1lbnQKK2lzIHNvdXJjZWQgaW4gTWFya2Rvd24sIGEgbGlnaHQtZHV0eSBtYXJrdXAgc2NoZW1lLCBhbmQgaXMgb3B0aW1pemVkIGZvcgordGhlIFtrcmFtZG93bl0oaHR0cDovL2tyYW1kb3duLnJ1Ynlmb3JnZS5vcmcvKSB0cmFuc2Zvcm1lci4KKworU2VlIHRoZSBhY2NvbXBhbnlpbmcgUkVBRE1FLiBFeHRlcm5hbCBsaW5rIHRhcmdldHMgYXJlIHJlZmVyZW5jZWQgYXQgdGhlCitlbmQgb2YgdGhpcyBmaWxlLgorCistLT4KKworU3BlY2lmaWNhdGlvbiBmb3IgV2ViUCBMb3NzbGVzcyBCaXRzdHJlYW0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK19KeXJraSBBbGFrdWlqYWxhLCBQaC5ELiwgR29vZ2xlLCBJbmMuLCAyMDEyLTA2LTE5XworCitQYXJhZ3JhcGhzIG1hcmtlZCBhcyBcW0FNRU5ERURcXSB3ZXJlIGFtZW5kZWQgb24gMjAxNC0wOS0xNi4KKworQWJzdHJhY3QKKy0tLS0tLS0tCisKK1dlYlAgbG9zc2xlc3MgaXMgYW4gaW1hZ2UgZm9ybWF0IGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBvZiBBUkdCCitpbWFnZXMuIFRoZSBsb3NzbGVzcyBmb3JtYXQgc3RvcmVzIGFuZCByZXN0b3JlcyB0aGUgcGl4ZWwgdmFsdWVzCitleGFjdGx5LCBpbmNsdWRpbmcgdGhlIGNvbG9yIHZhbHVlcyBmb3IgemVybyBhbHBoYSBwaXhlbHMuIFRoZQorZm9ybWF0IHVzZXMgc3VicmVzb2x1dGlvbiBpbWFnZXMsIHJlY3Vyc2l2ZWx5IGVtYmVkZGVkIGludG8gdGhlIGZvcm1hdAoraXRzZWxmLCBmb3Igc3RvcmluZyBzdGF0aXN0aWNhbCBkYXRhIGFib3V0IHRoZSBpbWFnZXMsIHN1Y2ggYXMgdGhlIHVzZWQKK2VudHJvcHkgY29kZXMsIHNwYXRpYWwgcHJlZGljdG9ycywgY29sb3Igc3BhY2UgY29udmVyc2lvbiwgYW5kIGNvbG9yCit0YWJsZS4gTFo3NywgSHVmZm1hbiBjb2RpbmcsIGFuZCBhIGNvbG9yIGNhY2hlIGFyZSB1c2VkIGZvciBjb21wcmVzc2lvbgorb2YgdGhlIGJ1bGsgZGF0YS4gRGVjb2Rpbmcgc3BlZWRzIGZhc3RlciB0aGFuIFBORyBoYXZlIGJlZW4KK2RlbW9uc3RyYXRlZCwgYXMgd2VsbCBhcyAyNSUgZGVuc2VyIGNvbXByZXNzaW9uIHRoYW4gY2FuIGJlIGFjaGlldmVkCit1c2luZyB0b2RheSdzIFBORyBmb3JtYXQuCisKKworKiBUT0MgcGxhY2Vob2xkZXIKK3s6dG9jfQorCisKK05vbWVuY2xhdHVyZQorLS0tLS0tLS0tLS0tCisKK0FSR0IKKzogQSBwaXhlbCB2YWx1ZSBjb25zaXN0aW5nIG9mIGFscGhhLCByZWQsIGdyZWVuLCBhbmQgYmx1ZSB2YWx1ZXMuCisKK0FSR0IgaW1hZ2UKKzogQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgY29udGFpbmluZyBBUkdCIHBpeGVscy4KKworY29sb3IgY2FjaGUKKzogQSBzbWFsbCBoYXNoLWFkZHJlc3NlZCBhcnJheSB0byBzdG9yZSByZWNlbnRseSB1c2VkIGNvbG9ycywgdG8gYmUgYWJsZQorICB0byByZWNhbGwgdGhlbSB3aXRoIHNob3J0ZXIgY29kZXMuCisKK2NvbG9yIGluZGV4aW5nIGltYWdlCis6IEEgb25lLWRpbWVuc2lvbmFsIGltYWdlIG9mIGNvbG9ycyB0aGF0IGNhbiBiZSBpbmRleGVkIHVzaW5nIGEgc21hbGwKKyAgaW50ZWdlciAodXAgdG8gMjU2IHdpdGhpbiBXZWJQIGxvc3NsZXNzKS4KKworY29sb3IgdHJhbnNmb3JtIGltYWdlCis6IEEgdHdvLWRpbWVuc2lvbmFsIHN1YnJlc29sdXRpb24gaW1hZ2UgY29udGFpbmluZyBkYXRhIGFib3V0CisgIGNvcnJlbGF0aW9ucyBvZiBjb2xvciBjb21wb25lbnRzLgorCitkaXN0YW5jZSBtYXBwaW5nCis6IENoYW5nZXMgTFo3NyBkaXN0YW5jZXMgdG8gaGF2ZSB0aGUgc21hbGxlc3QgdmFsdWVzIGZvciBwaXhlbHMgaW4gMkQKKyAgcHJveGltaXR5LgorCitlbnRyb3B5IGltYWdlCis6IEEgdHdvLWRpbWVuc2lvbmFsIHN1YnJlc29sdXRpb24gaW1hZ2UgaW5kaWNhdGluZyB3aGljaCBlbnRyb3B5IGNvZGluZworICBzaG91bGQgYmUgdXNlZCBpbiBhIHJlc3BlY3RpdmUgc3F1YXJlIGluIHRoZSBpbWFnZSwgaS5lLiwgZWFjaCBwaXhlbAorICBpcyBhIG1ldGEgSHVmZm1hbiBjb2RlLgorCitIdWZmbWFuIGNvZGUKKzogQSBjbGFzc2ljIHdheSB0byBkbyBlbnRyb3B5IGNvZGluZyB3aGVyZSBhIHNtYWxsZXIgbnVtYmVyIG9mIGJpdHMgYXJlCisgIHVzZWQgZm9yIG1vcmUgZnJlcXVlbnQgY29kZXMuCisKK0xaNzcKKzogRGljdGlvbmFyeS1iYXNlZCBzbGlkaW5nIHdpbmRvdyBjb21wcmVzc2lvbiBhbGdvcml0aG0gdGhhdCBlaXRoZXIKKyAgZW1pdHMgc3ltYm9scyBvciBkZXNjcmliZXMgdGhlbSBhcyBzZXF1ZW5jZXMgb2YgcGFzdCBzeW1ib2xzLgorCittZXRhIEh1ZmZtYW4gY29kZQorOiBBIHNtYWxsIGludGVnZXIgKHVwIHRvIDE2IGJpdHMpIHRoYXQgaW5kZXhlcyBhbiBlbGVtZW50IGluIHRoZSBtZXRhCisgIEh1ZmZtYW4gdGFibGUuCisKK3ByZWRpY3RvciBpbWFnZQorOiBBIHR3by1kaW1lbnNpb25hbCBzdWJyZXNvbHV0aW9uIGltYWdlIGluZGljYXRpbmcgd2hpY2ggc3BhdGlhbAorICBwcmVkaWN0b3IgaXMgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHNxdWFyZSBpbiB0aGUgaW1hZ2UuCisKK3ByZWZpeCBjb2RpbmcKKzogQSB3YXkgdG8gZW50cm9weSBjb2RlIGxhcmdlciBpbnRlZ2VycyB0aGF0IGNvZGVzIGEgZmV3IGJpdHMgb2YgdGhlCisgIGludGVnZXIgdXNpbmcgYW4gZW50cm9weSBjb2RlIGFuZCBjb2RpZmllcyB0aGUgcmVtYWluaW5nIGJpdHMgcmF3LgorICBUaGlzIGFsbG93cyBmb3IgdGhlIGRlc2NyaXB0aW9ucyBvZiB0aGUgZW50cm9weSBjb2RlcyB0byByZW1haW4KKyAgcmVsYXRpdmVseSBzbWFsbCBldmVuIHdoZW4gdGhlIHJhbmdlIG9mIHN5bWJvbHMgaXMgbGFyZ2UuCisKK3NjYW4tbGluZSBvcmRlcgorOiBBIHByb2Nlc3Npbmcgb3JkZXIgb2YgcGl4ZWxzLCBsZWZ0LXRvLXJpZ2h0LCB0b3AtdG8tYm90dG9tLCBzdGFydGluZworICBmcm9tIHRoZSBsZWZ0LWhhbmQtdG9wIHBpeGVsLCBwcm9jZWVkaW5nIHRvIHRoZSByaWdodC4gT25jZSBhIHJvdyBpcworICBjb21wbGV0ZWQsIGNvbnRpbnVlIGZyb20gdGhlIGxlZnQtaGFuZCBjb2x1bW4gb2YgdGhlIG5leHQgcm93LgorCisKKzEgSW50cm9kdWN0aW9uCistLS0tLS0tLS0tLS0tLQorCitUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgY29tcHJlc3NlZCBkYXRhIHJlcHJlc2VudGF0aW9uIG9mIGEgV2ViUAorbG9zc2xlc3MgaW1hZ2UuIEl0IGlzIGludGVuZGVkIGFzIGEgZGV0YWlsZWQgcmVmZXJlbmNlIGZvciBXZWJQIGxvc3NsZXNzCitlbmNvZGVyIGFuZCBkZWNvZGVyIGltcGxlbWVudGF0aW9uLgorCitJbiB0aGlzIGRvY3VtZW50LCB3ZSBleHRlbnNpdmVseSB1c2UgQyBwcm9ncmFtbWluZyBsYW5ndWFnZSBzeW50YXggdG8KK2Rlc2NyaWJlIHRoZSBiaXRzdHJlYW0sIGFuZCBhc3N1bWUgdGhlIGV4aXN0ZW5jZSBvZiBhIGZ1bmN0aW9uIGZvcgorcmVhZGluZyBiaXRzLCBgUmVhZEJpdHMobilgLiBUaGUgYnl0ZXMgYXJlIHJlYWQgaW4gdGhlIG5hdHVyYWwgb3JkZXIgb2YKK3RoZSBzdHJlYW0gY29udGFpbmluZyB0aGVtLCBhbmQgYml0cyBvZiBlYWNoIGJ5dGUgYXJlIHJlYWQgaW4KK2xlYXN0LXNpZ25pZmljYW50LWJpdC1maXJzdCBvcmRlci4gV2hlbiBtdWx0aXBsZSBiaXRzIGFyZSByZWFkIGF0IHRoZQorc2FtZSB0aW1lLCB0aGUgaW50ZWdlciBpcyBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhIGluIHRoZQorb3JpZ2luYWwgb3JkZXIuIFRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIHJldHVybmVkIGludGVnZXIgYXJlCithbHNvIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIG9yaWdpbmFsIGRhdGEuIFRodXMgdGhlIHN0YXRlbWVudAorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2IgPSBSZWFkQml0cygyKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitpcyBlcXVpdmFsZW50IHdpdGggdGhlIHR3byBzdGF0ZW1lbnRzIGJlbG93OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2IgPSBSZWFkQml0cygxKTsKK2IgfD0gUmVhZEJpdHMoMSkgPDwgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitXZSBhc3N1bWUgdGhhdCBlYWNoIGNvbG9yIGNvbXBvbmVudCAoZS5nLiBhbHBoYSwgcmVkLCBibHVlIGFuZCBncmVlbikgaXMKK3JlcHJlc2VudGVkIHVzaW5nIGFuIDgtYml0IGJ5dGUuIFdlIGRlZmluZSB0aGUgY29ycmVzcG9uZGluZyB0eXBlIGFzCit1aW50OC4gQSB3aG9sZSBBUkdCIHBpeGVsIGlzIHJlcHJlc2VudGVkIGJ5IGEgdHlwZSBjYWxsZWQgdWludDMyLCBhbgordW5zaWduZWQgaW50ZWdlciBjb25zaXN0aW5nIG9mIDMyIGJpdHMuIEluIHRoZSBjb2RlIHNob3dpbmcgdGhlIGJlaGF2aW9yCitvZiB0aGUgdHJhbnNmb3JtYXRpb25zLCBhbHBoYSB2YWx1ZSBpcyBjb2RpZmllZCBpbiBiaXRzIDMxLi4yNCwgcmVkIGluCitiaXRzIDIzLi4xNiwgZ3JlZW4gaW4gYml0cyAxNS4uOCBhbmQgYmx1ZSBpbiBiaXRzIDcuLjAsIGJ1dAoraW1wbGVtZW50YXRpb25zIG9mIHRoZSBmb3JtYXQgYXJlIGZyZWUgdG8gdXNlIGFub3RoZXIgcmVwcmVzZW50YXRpb24KK2ludGVybmFsbHkuCisKK0Jyb2FkbHksIGEgV2ViUCBsb3NzbGVzcyBpbWFnZSBjb250YWlucyBoZWFkZXIgZGF0YSwgdHJhbnNmb3JtCitpbmZvcm1hdGlvbiBhbmQgYWN0dWFsIGltYWdlIGRhdGEuIEhlYWRlcnMgY29udGFpbiB3aWR0aCBhbmQgaGVpZ2h0IG9mCit0aGUgaW1hZ2UuIEEgV2ViUCBsb3NzbGVzcyBpbWFnZSBjYW4gZ28gdGhyb3VnaCBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZgordHJhbnNmb3JtYXRpb24gYmVmb3JlIGJlaW5nIGVudHJvcHkgZW5jb2RlZC4gVGhlIHRyYW5zZm9ybSBpbmZvcm1hdGlvbgoraW4gdGhlIGJpdHN0cmVhbSBjb250YWlucyB0aGUgZGF0YSByZXF1aXJlZCB0byBhcHBseSB0aGUgcmVzcGVjdGl2ZQoraW52ZXJzZSB0cmFuc2Zvcm1zLgorCisKKzIgUklGRiBIZWFkZXIKKy0tLS0tLS0tLS0tLS0KKworVGhlIGJlZ2lubmluZyBvZiB0aGUgaGVhZGVyIGhhcyB0aGUgUklGRiBjb250YWluZXIuIFRoaXMgY29uc2lzdHMgb2YgdGhlCitmb2xsb3dpbmcgMjEgYnl0ZXM6CisKKyAgIDEuIFN0cmluZyAiUklGRiIKKyAgIDIuIEEgbGl0dGxlLWVuZGlhbiAzMiBiaXQgdmFsdWUgb2YgdGhlIGJsb2NrIGxlbmd0aCwgdGhlIHdob2xlIHNpemUKKyAgICAgIG9mIHRoZSBibG9jayBjb250cm9sbGVkIGJ5IHRoZSBSSUZGIGhlYWRlci4gTm9ybWFsbHkgdGhpcyBlcXVhbHMKKyAgICAgIHRoZSBwYXlsb2FkIHNpemUgKGZpbGUgc2l6ZSBtaW51cyA4IGJ5dGVzOiA0IGJ5dGVzIGZvciB0aGUgJ1JJRkYnCisgICAgICBpZGVudGlmaWVyIGFuZCA0IGJ5dGVzIGZvciBzdG9yaW5nIHRoZSB2YWx1ZSBpdHNlbGYpLgorICAgMy4gU3RyaW5nICJXRUJQIiAoUklGRiBjb250YWluZXIgbmFtZSkuCisgICA0LiBTdHJpbmcgIlZQOEwiIChjaHVuayB0YWcgZm9yIGxvc3NsZXNzIGVuY29kZWQgaW1hZ2UgZGF0YSkuCisgICA1LiBBIGxpdHRsZS1lbmRpYW4gMzItYml0IHZhbHVlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlCisgICAgICBsb3NzbGVzcyBzdHJlYW0uCisgICA2LiBPbmUgYnl0ZSBzaWduYXR1cmUgMHgyZi4KKworVGhlIGZpcnN0IDI4IGJpdHMgb2YgdGhlIGJpdHN0cmVhbSBzcGVjaWZ5IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZQoraW1hZ2UuIFdpZHRoIGFuZCBoZWlnaHQgYXJlIGRlY29kZWQgYXMgMTQtYml0IGludGVnZXJzIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGltYWdlX3dpZHRoID0gUmVhZEJpdHMoMTQpICsgMTsKK2ludCBpbWFnZV9oZWlnaHQgPSBSZWFkQml0cygxNCkgKyAxOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSAxNC1iaXQgZHluYW1pY3MgZm9yIGltYWdlIHNpemUgbGltaXQgdGhlIG1heGltdW0gc2l6ZSBvZiBhIFdlYlAKK2xvc3NsZXNzIGltYWdlIHRvIDE2Mzg04pyVMTYzODQgcGl4ZWxzLgorCitUaGUgYWxwaGFfaXNfdXNlZCBiaXQgaXMgYSBoaW50IG9ubHksIGFuZCBzaG91bGQgbm90IGltcGFjdCBkZWNvZGluZy4KK0l0IHNob3VsZCBiZSBzZXQgdG8gMCB3aGVuIGFsbCBhbHBoYSB2YWx1ZXMgYXJlIDI1NSBpbiB0aGUgcGljdHVyZSwgYW5kCisxIG90aGVyd2lzZS4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgYWxwaGFfaXNfdXNlZCA9IFJlYWRCaXRzKDEpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSB2ZXJzaW9uX251bWJlciBpcyBhIDMgYml0IGNvZGUgdGhhdCBtdXN0IGJlIHNldCB0byAwLiBBbnkgb3RoZXIgdmFsdWUKK3Nob3VsZCBiZSB0cmVhdGVkIGFzIGFuIGVycm9yLiBcW0FNRU5ERURcXQorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCB2ZXJzaW9uX251bWJlciA9IFJlYWRCaXRzKDMpOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKworMyBUcmFuc2Zvcm1hdGlvbnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKK1RyYW5zZm9ybWF0aW9ucyBhcmUgcmV2ZXJzaWJsZSBtYW5pcHVsYXRpb25zIG9mIHRoZSBpbWFnZSBkYXRhIHRoYXQgY2FuCityZWR1Y2UgdGhlIHJlbWFpbmluZyBzeW1ib2xpYyBlbnRyb3B5IGJ5IG1vZGVsaW5nIHNwYXRpYWwgYW5kIGNvbG9yCitjb3JyZWxhdGlvbnMuIFRyYW5zZm9ybWF0aW9ucyBjYW4gbWFrZSB0aGUgZmluYWwgY29tcHJlc3Npb24gbW9yZSBkZW5zZS4KKworQW4gaW1hZ2UgY2FuIGdvIHRocm91Z2ggZm91ciB0eXBlcyBvZiB0cmFuc2Zvcm1hdGlvbi4gQSAxIGJpdCBpbmRpY2F0ZXMKK3RoZSBwcmVzZW5jZSBvZiBhIHRyYW5zZm9ybS4gRWFjaCB0cmFuc2Zvcm0gaXMgYWxsb3dlZCB0byBiZSB1c2VkIG9ubHkKK29uY2UuIFRoZSB0cmFuc2Zvcm1hdGlvbnMgYXJlIHVzZWQgb25seSBmb3IgdGhlIG1haW4gbGV2ZWwgQVJHQiBpbWFnZToKK3RoZSBzdWJyZXNvbHV0aW9uIGltYWdlcyBoYXZlIG5vIHRyYW5zZm9ybXMsIG5vdCBldmVuIHRoZSAwIGJpdAoraW5kaWNhdGluZyB0aGUgZW5kLW9mLXRyYW5zZm9ybXMuCisKK1R5cGljYWxseSBhbiBlbmNvZGVyIHdvdWxkIHVzZSB0aGVzZSB0cmFuc2Zvcm1zIHRvIHJlZHVjZSB0aGUgU2hhbm5vbgorZW50cm9weSBpbiB0aGUgcmVzaWR1YWwgaW1hZ2UuIEFsc28sIHRoZSB0cmFuc2Zvcm0gZGF0YSBjYW4gYmUgZGVjaWRlZAorYmFzZWQgb24gZW50cm9weSBtaW5pbWl6YXRpb24uCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgord2hpbGUgKFJlYWRCaXRzKDEpKSB7ICAvLyBUcmFuc2Zvcm0gcHJlc2VudC4KKyAgLy8gRGVjb2RlIHRyYW5zZm9ybSB0eXBlLgorICBlbnVtIFRyYW5zZm9ybVR5cGUgdHJhbnNmb3JtX3R5cGUgPSBSZWFkQml0cygyKTsKKyAgLy8gRGVjb2RlIHRyYW5zZm9ybSBkYXRhLgorICAuLi4KK30KKworLy8gRGVjb2RlIGFjdHVhbCBpbWFnZSBkYXRhIChTZWN0aW9uIDQpLgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0lmIGEgdHJhbnNmb3JtIGlzIHByZXNlbnQgdGhlbiB0aGUgbmV4dCB0d28gYml0cyBzcGVjaWZ5IHRoZSB0cmFuc2Zvcm0KK3R5cGUuIFRoZXJlIGFyZSBmb3VyIHR5cGVzIG9mIHRyYW5zZm9ybXMuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorZW51bSBUcmFuc2Zvcm1UeXBlIHsKKyAgUFJFRElDVE9SX1RSQU5TRk9STSAgICAgICAgICAgICA9IDAsCisgIENPTE9SX1RSQU5TRk9STSAgICAgICAgICAgICAgICAgPSAxLAorICBTVUJUUkFDVF9HUkVFTiAgICAgICAgICAgICAgICAgID0gMiwKKyAgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNICAgICAgICA9IDMsCit9Oworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSB0cmFuc2Zvcm0gdHlwZSBpcyBmb2xsb3dlZCBieSB0aGUgdHJhbnNmb3JtIGRhdGEuIFRyYW5zZm9ybSBkYXRhCitjb250YWlucyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gYXBwbHkgdGhlIGludmVyc2UgdHJhbnNmb3JtIGFuZAorZGVwZW5kcyBvbiB0aGUgdHJhbnNmb3JtIHR5cGUuIE5leHQgd2UgZGVzY3JpYmUgdGhlIHRyYW5zZm9ybSBkYXRhIGZvcgorZGlmZmVyZW50IHR5cGVzLgorCisKKyMjIyBQcmVkaWN0b3IgVHJhbnNmb3JtCisKK1RoZSBwcmVkaWN0b3IgdHJhbnNmb3JtIGNhbiBiZSB1c2VkIHRvIHJlZHVjZSBlbnRyb3B5IGJ5IGV4cGxvaXRpbmcgdGhlCitmYWN0IHRoYXQgbmVpZ2hib3JpbmcgcGl4ZWxzIGFyZSBvZnRlbiBjb3JyZWxhdGVkLiBJbiB0aGUgcHJlZGljdG9yCit0cmFuc2Zvcm0sIHRoZSBjdXJyZW50IHBpeGVsIHZhbHVlIGlzIHByZWRpY3RlZCBmcm9tIHRoZSBwaXhlbHMgYWxyZWFkeQorZGVjb2RlZCAoaW4gc2Nhbi1saW5lIG9yZGVyKSBhbmQgb25seSB0aGUgcmVzaWR1YWwgdmFsdWUgKGFjdHVhbCAtCitwcmVkaWN0ZWQpIGlzIGVuY29kZWQuIFRoZSBfcHJlZGljdGlvbiBtb2RlXyBkZXRlcm1pbmVzIHRoZSB0eXBlIG9mCitwcmVkaWN0aW9uIHRvIHVzZS4gV2UgZGl2aWRlIHRoZSBpbWFnZSBpbnRvIHNxdWFyZXMgYW5kIGFsbCB0aGUgcGl4ZWxzCitpbiBhIHNxdWFyZSB1c2Ugc2FtZSBwcmVkaWN0aW9uIG1vZGUuCisKK1RoZSBmaXJzdCAzIGJpdHMgb2YgcHJlZGljdGlvbiBkYXRhIGRlZmluZSB0aGUgYmxvY2sgd2lkdGggYW5kIGhlaWdodCBpbgorbnVtYmVyIG9mIGJpdHMuIFRoZSBudW1iZXIgb2YgYmxvY2sgY29sdW1ucywgYGJsb2NrX3hzaXplYCwgaXMgdXNlZCBpbgoraW5kZXhpbmcgdHdvLWRpbWVuc2lvbmFsbHkuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IHNpemVfYml0cyA9IFJlYWRCaXRzKDMpICsgMjsKK2ludCBibG9ja193aWR0aCA9ICgxIDw8IHNpemVfYml0cyk7CitpbnQgYmxvY2tfaGVpZ2h0ID0gKDEgPDwgc2l6ZV9iaXRzKTsKKyNkZWZpbmUgRElWX1JPVU5EX1VQKG51bSwgZGVuKSAoKG51bSkgKyAoZGVuKSAtIDEpIC8gKGRlbikpCitpbnQgYmxvY2tfeHNpemUgPSBESVZfUk9VTkRfVVAoaW1hZ2Vfd2lkdGgsIDEgPDwgc2l6ZV9iaXRzKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgdHJhbnNmb3JtIGRhdGEgY29udGFpbnMgdGhlIHByZWRpY3Rpb24gbW9kZSBmb3IgZWFjaCBibG9jayBvZiB0aGUKK2ltYWdlLiBBbGwgdGhlIGBibG9ja193aWR0aCAqIGJsb2NrX2hlaWdodGAgcGl4ZWxzIG9mIGEgYmxvY2sgdXNlIHNhbWUKK3ByZWRpY3Rpb24gbW9kZS4gVGhlIHByZWRpY3Rpb24gbW9kZXMgYXJlIHRyZWF0ZWQgYXMgcGl4ZWxzIG9mIGFuIGltYWdlCithbmQgZW5jb2RlZCB1c2luZyB0aGUgc2FtZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBpbgorW0NoYXB0ZXIgNF0oI2ltYWdlLWRhdGEpLgorCitGb3IgYSBwaXhlbCBfeCwgeV8sIG9uZSBjYW4gY29tcHV0ZSB0aGUgcmVzcGVjdGl2ZSBmaWx0ZXIgYmxvY2sgYWRkcmVzcworYnk6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IGJsb2NrX2luZGV4ID0gKHkgPj4gc2l6ZV9iaXRzKSAqIGJsb2NrX3hzaXplICsKKyAgICAgICAgICAgICAgICAgICh4ID4+IHNpemVfYml0cyk7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlcmUgYXJlIDE0IGRpZmZlcmVudCBwcmVkaWN0aW9uIG1vZGVzLiBJbiBlYWNoIHByZWRpY3Rpb24gbW9kZSwgdGhlCitjdXJyZW50IHBpeGVsIHZhbHVlIGlzIHByZWRpY3RlZCBmcm9tIG9uZSBvciBtb3JlIG5laWdoYm9yaW5nIHBpeGVscword2hvc2UgdmFsdWVzIGFyZSBhbHJlYWR5IGtub3duLgorCitXZSBjaG9vc2UgdGhlIG5laWdoYm9yaW5nIHBpeGVscyAoVEwsIFQsIFRSLCBhbmQgTCkgb2YgdGhlIGN1cnJlbnQgcGl4ZWwKKyhQKSBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK08gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTworTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPICAgIE8gICAgTyAgICBPCitPICAgIE8gICAgTyAgICBPICAgIFRMICAgVCAgICBUUiAgIE8gICAgTyAgICBPICAgIE8KK08gICAgTyAgICBPICAgIE8gICAgTCAgICBQICAgIFggICAgWCAgICBYICAgIFggICAgWAorWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYCitYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFggICAgWCAgICBYICAgIFgKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit3aGVyZSBUTCBtZWFucyB0b3AtbGVmdCwgVCB0b3AsIFRSIHRvcC1yaWdodCwgTCBsZWZ0IHBpeGVsLgorQXQgdGhlIHRpbWUgb2YgcHJlZGljdGluZyBhIHZhbHVlIGZvciBQLCBhbGwgcGl4ZWxzIE8sIFRMLCBULCBUUiBhbmQgTAoraGF2ZSBiZWVuIGFscmVhZHkgcHJvY2Vzc2VkLCBhbmQgcGl4ZWwgUCBhbmQgYWxsIHBpeGVscyBYIGFyZSB1bmtub3duLgorCitHaXZlbiB0aGUgYWJvdmUgbmVpZ2hib3JpbmcgcGl4ZWxzLCB0aGUgZGlmZmVyZW50IHByZWRpY3Rpb24gbW9kZXMgYXJlCitkZWZpbmVkIGFzIGZvbGxvd3MuCisKK3wgTW9kZSAgIHwgUHJlZGljdGVkIHZhbHVlIG9mIGVhY2ggY2hhbm5lbCBvZiB0aGUgY3VycmVudCBwaXhlbCAgICB8Cit8IC0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfAorfCAgMCAgICAgfCAweGZmMDAwMDAwIChyZXByZXNlbnRzIHNvbGlkIGJsYWNrIGNvbG9yIGluIEFSR0IpICAgICAgIHwKK3wgIDEgICAgIHwgTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICAyICAgICB8IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgMyAgICAgfCBUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDQgICAgIHwgVEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA1ICAgICB8IEF2ZXJhZ2UyKEF2ZXJhZ2UyKEwsIFRSKSwgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgNiAgICAgfCBBdmVyYWdlMihMLCBUTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgIDcgICAgIHwgQXZlcmFnZTIoTCwgVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cit8ICA4ICAgICB8IEF2ZXJhZ2UyKFRMLCBUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAgOSAgICAgfCBBdmVyYWdlMihULCBUUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTAgICAgIHwgQXZlcmFnZTIoQXZlcmFnZTIoTCwgVEwpLCBBdmVyYWdlMihULCBUUikpICAgICAgICAgICAgICB8Cit8IDExICAgICB8IFNlbGVjdChMLCBULCBUTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorfCAxMiAgICAgfCBDbGFtcEFkZFN1YnRyYWN0RnVsbChMLCBULCBUTCkgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgMTMgICAgIHwgQ2xhbXBBZGRTdWJ0cmFjdEhhbGYoQXZlcmFnZTIoTCwgVCksIFRMKSAgICAgICAgICAgICAgICB8CisKKworYEF2ZXJhZ2UyYCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgZm9yIGVhY2ggQVJHQiBjb21wb25lbnQ6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordWludDggQXZlcmFnZTIodWludDggYSwgdWludDggYikgeworICByZXR1cm4gKGEgKyBiKSAvIDI7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIFNlbGVjdCBwcmVkaWN0b3IgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK3VpbnQzMiBTZWxlY3QodWludDMyIEwsIHVpbnQzMiBULCB1aW50MzIgVEwpIHsKKyAgLy8gTCA9IGxlZnQgcGl4ZWwsIFQgPSB0b3AgcGl4ZWwsIFRMID0gdG9wIGxlZnQgcGl4ZWwuCisKKyAgLy8gQVJHQiBjb21wb25lbnQgZXN0aW1hdGVzIGZvciBwcmVkaWN0aW9uLgorICBpbnQgcEFscGhhID0gQUxQSEEoTCkgKyBBTFBIQShUKSAtIEFMUEhBKFRMKTsKKyAgaW50IHBSZWQgPSBSRUQoTCkgKyBSRUQoVCkgLSBSRUQoVEwpOworICBpbnQgcEdyZWVuID0gR1JFRU4oTCkgKyBHUkVFTihUKSAtIEdSRUVOKFRMKTsKKyAgaW50IHBCbHVlID0gQkxVRShMKSArIEJMVUUoVCkgLSBCTFVFKFRMKTsKKworICAvLyBNYW5oYXR0YW4gZGlzdGFuY2VzIHRvIGVzdGltYXRlcyBmb3IgbGVmdCBhbmQgdG9wIHBpeGVscy4KKyAgaW50IHBMID0gYWJzKHBBbHBoYSAtIEFMUEhBKEwpKSArIGFicyhwUmVkIC0gUkVEKEwpKSArCisgICAgICAgICAgIGFicyhwR3JlZW4gLSBHUkVFTihMKSkgKyBhYnMocEJsdWUgLSBCTFVFKEwpKTsKKyAgaW50IHBUID0gYWJzKHBBbHBoYSAtIEFMUEhBKFQpKSArIGFicyhwUmVkIC0gUkVEKFQpKSArCisgICAgICAgICAgIGFicyhwR3JlZW4gLSBHUkVFTihUKSkgKyBhYnMocEJsdWUgLSBCTFVFKFQpKTsKKworICAvLyBSZXR1cm4gZWl0aGVyIGxlZnQgb3IgdG9wLCB0aGUgb25lIGNsb3NlciB0byB0aGUgcHJlZGljdGlvbi4KKyAgaWYgKHBMIDwgcFQpIHsgICAgIC8vIFxbQU1FTkRFRFxdCisgICAgcmV0dXJuIEw7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFQ7CisgIH0KK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgZnVuY3Rpb25zIGBDbGFtcEFkZFN1YnRyYWN0RnVsbGAgYW5kIGBDbGFtcEFkZFN1YnRyYWN0SGFsZmAgYXJlCitwZXJmb3JtZWQgZm9yIGVhY2ggQVJHQiBjb21wb25lbnQgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisvLyBDbGFtcCB0aGUgaW5wdXQgdmFsdWUgYmV0d2VlbiAwIGFuZCAyNTUuCitpbnQgQ2xhbXAoaW50IGEpIHsKKyAgcmV0dXJuIChhIDwgMCkgPyAwIDogKGEgPiAyNTUpID8gIDI1NSA6IGE7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQgQ2xhbXBBZGRTdWJ0cmFjdEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgeworICByZXR1cm4gQ2xhbXAoYSArIGIgLSBjKTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBDbGFtcEFkZFN1YnRyYWN0SGFsZihpbnQgYSwgaW50IGIpIHsKKyAgcmV0dXJuIENsYW1wKGEgKyAoYSAtIGIpIC8gMik7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlcmUgYXJlIHNwZWNpYWwgaGFuZGxpbmcgcnVsZXMgZm9yIHNvbWUgYm9yZGVyIHBpeGVscy4gSWYgdGhlcmUgaXMgYQorcHJlZGljdGlvbiB0cmFuc2Zvcm0sIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vZGUgXFswLi4xM1xdIGZvciB0aGVzZSBwaXhlbHMsCit0aGUgcHJlZGljdGVkIHZhbHVlIGZvciB0aGUgbGVmdC10b3Btb3N0IHBpeGVsIG9mIHRoZSBpbWFnZSBpcworMHhmZjAwMDAwMCwgTC1waXhlbCBmb3IgYWxsIHBpeGVscyBvbiB0aGUgdG9wIHJvdywgYW5kIFQtcGl4ZWwgZm9yIGFsbAorcGl4ZWxzIG9uIHRoZSBsZWZ0bW9zdCBjb2x1bW4uCisKK0FkZHJlc3NpbmcgdGhlIFRSLXBpeGVsIGZvciBwaXhlbHMgb24gdGhlIHJpZ2h0bW9zdCBjb2x1bW4gaXMKK2V4Y2VwdGlvbmFsLiBUaGUgcGl4ZWxzIG9uIHRoZSByaWdodG1vc3QgY29sdW1uIGFyZSBwcmVkaWN0ZWQgYnkgdXNpbmcKK3RoZSBtb2RlcyBcWzAuLjEzXF0ganVzdCBsaWtlIHBpeGVscyBub3Qgb24gYm9yZGVyLCBidXQgYnkgdXNpbmcgdGhlCitsZWZ0bW9zdCBwaXhlbCBvbiB0aGUgc2FtZSByb3cgYXMgdGhlIGN1cnJlbnQgVFItcGl4ZWwuIFRoZSBUUi1waXhlbAorb2Zmc2V0IGluIG1lbW9yeSBpcyB0aGUgc2FtZSBmb3IgYm9yZGVyIGFuZCBub24tYm9yZGVyIHBpeGVscy4KKworCisjIyMgQ29sb3IgVHJhbnNmb3JtCisKK1RoZSBnb2FsIG9mIHRoZSBjb2xvciB0cmFuc2Zvcm0gaXMgdG8gZGVjb3JyZWxhdGUgdGhlIFIsIEcgYW5kIEIgdmFsdWVzCitvZiBlYWNoIHBpeGVsLiBDb2xvciB0cmFuc2Zvcm0ga2VlcHMgdGhlIGdyZWVuIChHKSB2YWx1ZSBhcyBpdCBpcywKK3RyYW5zZm9ybXMgcmVkIChSKSBiYXNlZCBvbiBncmVlbiBhbmQgdHJhbnNmb3JtcyBibHVlIChCKSBiYXNlZCBvbiBncmVlbgorYW5kIHRoZW4gYmFzZWQgb24gcmVkLgorCitBcyBpcyB0aGUgY2FzZSBmb3IgdGhlIHByZWRpY3RvciB0cmFuc2Zvcm0sIGZpcnN0IHRoZSBpbWFnZSBpcyBkaXZpZGVkCitpbnRvIGJsb2NrcyBhbmQgdGhlIHNhbWUgdHJhbnNmb3JtIG1vZGUgaXMgdXNlZCBmb3IgYWxsIHRoZSBwaXhlbHMgaW4gYQorYmxvY2suIEZvciBlYWNoIGJsb2NrIHRoZXJlIGFyZSB0aHJlZSB0eXBlcyBvZiBjb2xvciB0cmFuc2Zvcm0gZWxlbWVudHMuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OCBncmVlbl90b19yZWQ7CisgIHVpbnQ4IGdyZWVuX3RvX2JsdWU7CisgIHVpbnQ4IHJlZF90b19ibHVlOworfSBDb2xvclRyYW5zZm9ybUVsZW1lbnQ7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGFjdHVhbCBjb2xvciB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGJ5IGRlZmluaW5nIGEgY29sb3IgdHJhbnNmb3JtCitkZWx0YS4gVGhlIGNvbG9yIHRyYW5zZm9ybSBkZWx0YSBkZXBlbmRzIG9uIHRoZSBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCwKK3doaWNoIGlzIHRoZSBzYW1lIGZvciBhbGwgdGhlIHBpeGVscyBpbiBhIHBhcnRpY3VsYXIgYmxvY2suIFRoZSBkZWx0YSBpcworYWRkZWQgZHVyaW5nIGNvbG9yIHRyYW5zZm9ybS4gVGhlIGludmVyc2UgY29sb3IgdHJhbnNmb3JtIHRoZW4gaXMganVzdAorc3VidHJhY3RpbmcgdGhvc2UgZGVsdGFzLgorCitUaGUgY29sb3IgdHJhbnNmb3JtIGZ1bmN0aW9uIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit2b2lkIENvbG9yVHJhbnNmb3JtKHVpbnQ4IHJlZCwgdWludDggYmx1ZSwgdWludDggZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgIENvbG9yVHJhbnNmb3JtRWxlbWVudCAqdHJhbnMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpuZXdfcmVkLCB1aW50OCAqbmV3X2JsdWUpIHsKKyAgLy8gVHJhbnNmb3JtZWQgdmFsdWVzIG9mIHJlZCBhbmQgYmx1ZSBjb21wb25lbnRzCisgIHVpbnQzMiB0bXBfcmVkID0gcmVkOworICB1aW50MzIgdG1wX2JsdWUgPSBibHVlOworCisgIC8vIEFwcGx5aW5nIHRyYW5zZm9ybSBpcyBqdXN0IGFkZGluZyB0aGUgdHJhbnNmb3JtIGRlbHRhcworICB0bXBfcmVkICArPSBDb2xvclRyYW5zZm9ybURlbHRhKHRyYW5zLT5ncmVlbl90b19yZWQsIGdyZWVuKTsKKyAgdG1wX2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YSh0cmFucy0+Z3JlZW5fdG9fYmx1ZSwgZ3JlZW4pOworICB0bXBfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKHRyYW5zLT5yZWRfdG9fYmx1ZSwgcmVkKTsKKworICAqbmV3X3JlZCA9IHRtcF9yZWQgJiAweGZmOworICAqbmV3X2JsdWUgPSB0bXBfYmx1ZSAmIDB4ZmY7Cit9Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworYENvbG9yVHJhbnNmb3JtRGVsdGFgIGlzIGNvbXB1dGVkIHVzaW5nIGEgc2lnbmVkIDgtYml0IGludGVnZXIKK3JlcHJlc2VudGluZyBhIDMuNS1maXhlZC1wb2ludCBudW1iZXIsIGFuZCBhIHNpZ25lZCA4LWJpdCBSR0IgY29sb3IKK2NoYW5uZWwgKGMpIFxbLTEyOC4uMTI3XF0gYW5kIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQ4IENvbG9yVHJhbnNmb3JtRGVsdGEoaW50OCB0LCBpbnQ4IGMpIHsKKyAgcmV0dXJuICh0ICogYykgPj4gNTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBIGNvbnZlcnNpb24gZnJvbSB0aGUgOC1iaXQgdW5zaWduZWQgcmVwcmVzZW50YXRpb24gKHVpbnQ4KSB0byB0aGUgOC1iaXQKK3NpZ25lZCBvbmUgKGludDgpIGlzIHJlcXVpcmVkIGJlZm9yZSBjYWxsaW5nIENvbG9yVHJhbnNmb3JtRGVsdGEoKS4KK0l0IHNob3VsZCBiZSBwZXJmb3JtZWQgdXNpbmcgOC1iaXQgdHdvJ3MgY29tcGxlbWVudCAodGhhdCBpczogdWludDggcmFuZ2UKK1xbMTI4LTI1NVxdIGlzIG1hcHBlZCB0byB0aGUgXFstMTI4LCAtMVxdIHJhbmdlIG9mIGl0cyBjb252ZXJ0ZWQgaW50OCB2YWx1ZSkuCisKK1RoZSBtdWx0aXBsaWNhdGlvbiBpcyB0byBiZSBkb25lIHVzaW5nIG1vcmUgcHJlY2lzaW9uICh3aXRoIGF0IGxlYXN0CisxNi1iaXQgZHluYW1pY3MpLiBUaGUgc2lnbiBleHRlbnNpb24gcHJvcGVydHkgb2YgdGhlIHNoaWZ0IG9wZXJhdGlvbgorZG9lcyBub3QgbWF0dGVyIGhlcmU6IG9ubHkgdGhlIGxvd2VzdCA4IGJpdHMgYXJlIHVzZWQgZnJvbSB0aGUgcmVzdWx0LAorYW5kIHRoZXJlIHRoZSBzaWduIGV4dGVuc2lvbiBzaGlmdGluZyBhbmQgdW5zaWduZWQgc2hpZnRpbmcgYXJlCitjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KKworTm93IHdlIGRlc2NyaWJlIHRoZSBjb250ZW50cyBvZiBjb2xvciB0cmFuc2Zvcm0gZGF0YSBzbyB0aGF0IGRlY29kaW5nCitjYW4gYXBwbHkgdGhlIGludmVyc2UgY29sb3IgdHJhbnNmb3JtIGFuZCByZWNvdmVyIHRoZSBvcmlnaW5hbCByZWQgYW5kCitibHVlIHZhbHVlcy4gVGhlIGZpcnN0IDMgYml0cyBvZiB0aGUgY29sb3IgdHJhbnNmb3JtIGRhdGEgY29udGFpbiB0aGUKK3dpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGltYWdlIGJsb2NrIGluIG51bWJlciBvZiBiaXRzLCBqdXN0IGxpa2UgdGhlCitwcmVkaWN0b3IgdHJhbnNmb3JtOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBzaXplX2JpdHMgPSBSZWFkQml0cygzKSArIDI7CitpbnQgYmxvY2tfd2lkdGggPSAxIDw8IHNpemVfYml0czsKK2ludCBibG9ja19oZWlnaHQgPSAxIDw8IHNpemVfYml0czsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGNvbG9yIHRyYW5zZm9ybSBkYXRhIGNvbnRhaW5zCitgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBpbnN0YW5jZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIGJsb2NrIG9mIHRoZQoraW1hZ2UuIGBDb2xvclRyYW5zZm9ybUVsZW1lbnRgIGluc3RhbmNlcyBhcmUgdHJlYXRlZCBhcyBwaXhlbHMgb2YgYW4KK2ltYWdlIGFuZCBlbmNvZGVkIHVzaW5nIHRoZSBtZXRob2RzIGRlc2NyaWJlZCBpbgorW0NoYXB0ZXIgNF0oI2ltYWdlLWRhdGEpLgorCitEdXJpbmcgZGVjb2RpbmcsIGBDb2xvclRyYW5zZm9ybUVsZW1lbnRgIGluc3RhbmNlcyBvZiB0aGUgYmxvY2tzIGFyZQorZGVjb2RlZCBhbmQgdGhlIGludmVyc2UgY29sb3IgdHJhbnNmb3JtIGlzIGFwcGxpZWQgb24gdGhlIEFSR0IgdmFsdWVzIG9mCit0aGUgcGl4ZWxzLiBBcyBtZW50aW9uZWQgZWFybGllciwgdGhhdCBpbnZlcnNlIGNvbG9yIHRyYW5zZm9ybSBpcyBqdXN0CitzdWJ0cmFjdGluZyBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCB2YWx1ZXMgZnJvbSB0aGUgcmVkIGFuZCBibHVlCitjaGFubmVscy4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit2b2lkIEludmVyc2VUcmFuc2Zvcm0odWludDggcmVkLCB1aW50OCBncmVlbiwgdWludDggYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBDb2xvclRyYW5zZm9ybUVsZW1lbnQgKnAsCisgICAgICAgICAgICAgICAgICAgICAgdWludDggKm5ld19yZWQsIHVpbnQ4ICpuZXdfYmx1ZSkgeworICAvLyBBcHBseWluZyBpbnZlcnNlIHRyYW5zZm9ybSBpcyBqdXN0IHN1YnRyYWN0aW5nIHRoZQorICAvLyBjb2xvciB0cmFuc2Zvcm0gZGVsdGFzCisgIHJlZCAgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShwLT5ncmVlbl90b19yZWRfLCAgZ3JlZW4pOworICBibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocC0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKHAtPnJlZF90b19ibHVlXywgcmVkICYgMHhmZik7CisKKyAgKm5ld19yZWQgPSByZWQgJiAweGZmOworICAqbmV3X2JsdWUgPSBibHVlICYgMHhmZjsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisKKyMjIyBTdWJ0cmFjdCBHcmVlbiBUcmFuc2Zvcm0KKworVGhlIHN1YnRyYWN0IGdyZWVuIHRyYW5zZm9ybSBzdWJ0cmFjdHMgZ3JlZW4gdmFsdWVzIGZyb20gcmVkIGFuZCBibHVlCit2YWx1ZXMgb2YgZWFjaCBwaXhlbC4gV2hlbiB0aGlzIHRyYW5zZm9ybSBpcyBwcmVzZW50LCB0aGUgZGVjb2RlciBuZWVkcwordG8gYWRkIHRoZSBncmVlbiB2YWx1ZSB0byBib3RoIHJlZCBhbmQgYmx1ZS4gVGhlcmUgaXMgbm8gZGF0YSBhc3NvY2lhdGVkCit3aXRoIHRoaXMgdHJhbnNmb3JtLiBUaGUgZGVjb2RlciBhcHBsaWVzIHRoZSBpbnZlcnNlIHRyYW5zZm9ybSBhcworZm9sbG93czoKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkKHVpbnQ4IGdyZWVuLCB1aW50OCAqcmVkLCB1aW50OCAqYmx1ZSkgeworICAqcmVkICA9ICgqcmVkICArIGdyZWVuKSAmIDB4ZmY7CisgICpibHVlID0gKCpibHVlICsgZ3JlZW4pICYgMHhmZjsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitUaGlzIHRyYW5zZm9ybSBpcyByZWR1bmRhbnQgYXMgaXQgY2FuIGJlIG1vZGVsZWQgdXNpbmcgdGhlIGNvbG9yCit0cmFuc2Zvcm0sIGJ1dCBpdCBpcyBzdGlsbCBvZnRlbiB1c2VmdWwuIFNpbmNlIGl0IGNhbiBleHRlbmQgdGhlCitkeW5hbWljcyBvZiB0aGUgY29sb3IgdHJhbnNmb3JtIGFuZCB0aGVyZSBpcyBubyBhZGRpdGlvbmFsIGRhdGEgaGVyZSwKK3RoZSBzdWJ0cmFjdCBncmVlbiB0cmFuc2Zvcm0gY2FuIGJlIGNvZGVkIHVzaW5nIGZld2VyIGJpdHMgdGhhbiBhCitmdWxsLWJsb3duIGNvbG9yIHRyYW5zZm9ybS4KKworCisjIyMgQ29sb3IgSW5kZXhpbmcgVHJhbnNmb3JtCisKK0lmIHRoZXJlIGFyZSBub3QgbWFueSB1bmlxdWUgcGl4ZWwgdmFsdWVzLCBpdCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdG8KK2NyZWF0ZSBhIGNvbG9yIGluZGV4IGFycmF5IGFuZCByZXBsYWNlIHRoZSBwaXhlbCB2YWx1ZXMgYnkgdGhlIGFycmF5J3MKK2luZGljZXMuIFRoZSBjb2xvciBpbmRleGluZyB0cmFuc2Zvcm0gYWNoaWV2ZXMgdGhpcy4gKEluIHRoZSBjb250ZXh0IG9mCitXZWJQIGxvc3NsZXNzLCB3ZSBzcGVjaWZpY2FsbHkgZG8gbm90IGNhbGwgdGhpcyBhIHBhbGV0dGUgdHJhbnNmb3JtCitiZWNhdXNlIGEgc2ltaWxhciBidXQgbW9yZSBkeW5hbWljIGNvbmNlcHQgZXhpc3RzIGluIFdlYlAgbG9zc2xlc3MKK2VuY29kaW5nOiBjb2xvciBjYWNoZS4pCisKK1RoZSBjb2xvciBpbmRleGluZyB0cmFuc2Zvcm0gY2hlY2tzIGZvciB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBBUkdCIHZhbHVlcworaW4gdGhlIGltYWdlLiBJZiB0aGF0IG51bWJlciBpcyBiZWxvdyBhIHRocmVzaG9sZCAoMjU2KSwgaXQgY3JlYXRlcyBhbgorYXJyYXkgb2YgdGhvc2UgQVJHQiB2YWx1ZXMsIHdoaWNoIGlzIHRoZW4gdXNlZCB0byByZXBsYWNlIHRoZSBwaXhlbAordmFsdWVzIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgaW5kZXg6IHRoZSBncmVlbiBjaGFubmVsIG9mIHRoZSBwaXhlbHMgYXJlCityZXBsYWNlZCB3aXRoIHRoZSBpbmRleDsgYWxsIGFscGhhIHZhbHVlcyBhcmUgc2V0IHRvIDI1NTsgYWxsIHJlZCBhbmQKK2JsdWUgdmFsdWVzIHRvIDAuCisKK1RoZSB0cmFuc2Zvcm0gZGF0YSBjb250YWlucyBjb2xvciB0YWJsZSBzaXplIGFuZCB0aGUgZW50cmllcyBpbiB0aGUKK2NvbG9yIHRhYmxlLiBUaGUgZGVjb2RlciByZWFkcyB0aGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGRhdGEgYXMKK2ZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gOCBiaXQgdmFsdWUgZm9yIGNvbG9yIHRhYmxlIHNpemUKK2ludCBjb2xvcl90YWJsZV9zaXplID0gUmVhZEJpdHMoOCkgKyAxOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBjb2xvciB0YWJsZSBpcyBzdG9yZWQgdXNpbmcgdGhlIGltYWdlIHN0b3JhZ2UgZm9ybWF0IGl0c2VsZi4gVGhlCitjb2xvciB0YWJsZSBjYW4gYmUgb2J0YWluZWQgYnkgcmVhZGluZyBhbiBpbWFnZSwgd2l0aG91dCB0aGUgUklGRgoraGVhZGVyLCBpbWFnZSBzaXplLCBhbmQgdHJhbnNmb3JtcywgYXNzdW1pbmcgYSBoZWlnaHQgb2Ygb25lIHBpeGVsIGFuZAorYSB3aWR0aCBvZiBgY29sb3JfdGFibGVfc2l6ZWAuIFRoZSBjb2xvciB0YWJsZSBpcyBhbHdheXMKK3N1YnRyYWN0aW9uLWNvZGVkIHRvIHJlZHVjZSBpbWFnZSBlbnRyb3B5LiBUaGUgZGVsdGFzIG9mIHBhbGV0dGUgY29sb3JzCitjb250YWluIHR5cGljYWxseSBtdWNoIGxlc3MgZW50cm9weSB0aGFuIHRoZSBjb2xvcnMgdGhlbXNlbHZlcywgbGVhZGluZwordG8gc2lnbmlmaWNhbnQgc2F2aW5ncyBmb3Igc21hbGxlciBpbWFnZXMuIEluIGRlY29kaW5nLCBldmVyeSBmaW5hbAorY29sb3IgaW4gdGhlIGNvbG9yIHRhYmxlIGNhbiBiZSBvYnRhaW5lZCBieSBhZGRpbmcgdGhlIHByZXZpb3VzIGNvbG9yCitjb21wb25lbnQgdmFsdWVzIGJ5IGVhY2ggQVJHQiBjb21wb25lbnQgc2VwYXJhdGVseSwgYW5kIHN0b3JpbmcgdGhlCitsZWFzdCBzaWduaWZpY2FudCA4IGJpdHMgb2YgdGhlIHJlc3VsdC4KKworVGhlIGludmVyc2UgdHJhbnNmb3JtIGZvciB0aGUgaW1hZ2UgaXMgc2ltcGx5IHJlcGxhY2luZyB0aGUgcGl4ZWwgdmFsdWVzCisod2hpY2ggYXJlIGluZGljZXMgdG8gdGhlIGNvbG9yIHRhYmxlKSB3aXRoIHRoZSBhY3R1YWwgY29sb3IgdGFibGUKK3ZhbHVlcy4gVGhlIGluZGV4aW5nIGlzIGRvbmUgYmFzZWQgb24gdGhlIGdyZWVuIGNvbXBvbmVudCBvZiB0aGUgQVJHQgorY29sb3IuCisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorLy8gSW52ZXJzZSB0cmFuc2Zvcm0KK2FyZ2IgPSBjb2xvcl90YWJsZVtHUkVFTihhcmdiKV07Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworSWYgdGhlIGluZGV4IGlzIGVxdWFsIG9yIGxhcmdlciB0aGFuIGNvbG9yX3RhYmxlX3NpemUsIHRoZSBhcmdiIGNvbG9yIHZhbHVlCitzaG91bGQgYmUgc2V0IHRvIDB4MDAwMDAwMDAgKHRyYW5zcGFyZW50IGJsYWNrKS4gIFxbQU1FTkRFRFxdCisKK1doZW4gdGhlIGNvbG9yIHRhYmxlIGlzIHNtYWxsIChlcXVhbCB0byBvciBsZXNzIHRoYW4gMTYgY29sb3JzKSwgc2V2ZXJhbAorcGl4ZWxzIGFyZSBidW5kbGVkIGludG8gYSBzaW5nbGUgcGl4ZWwuIFRoZSBwaXhlbCBidW5kbGluZyBwYWNrcyBzZXZlcmFsCisoMiwgNCwgb3IgOCkgcGl4ZWxzIGludG8gYSBzaW5nbGUgcGl4ZWwsIHJlZHVjaW5nIHRoZSBpbWFnZSB3aWR0aAorcmVzcGVjdGl2ZWx5LiBQaXhlbCBidW5kbGluZyBhbGxvd3MgZm9yIGEgbW9yZSBlZmZpY2llbnQgam9pbnQKK2Rpc3RyaWJ1dGlvbiBlbnRyb3B5IGNvZGluZyBvZiBuZWlnaGJvcmluZyBwaXhlbHMsIGFuZCBnaXZlcyBzb21lCithcml0aG1ldGljIGNvZGluZy1saWtlIGJlbmVmaXRzIHRvIHRoZSBlbnRyb3B5IGNvZGUsIGJ1dCBpdCBjYW4gb25seSBiZQordXNlZCB3aGVuIHRoZXJlIGFyZSBhIHNtYWxsIG51bWJlciBvZiB1bmlxdWUgdmFsdWVzLgorCitgY29sb3JfdGFibGVfc2l6ZWAgc3BlY2lmaWVzIGhvdyBtYW55IHBpeGVscyBhcmUgY29tYmluZWQgdG9nZXRoZXI6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IHdpZHRoX2JpdHM7CitpZiAoY29sb3JfdGFibGVfc2l6ZSA8PSAyKSB7CisgIHdpZHRoX2JpdHMgPSAzOworfSBlbHNlIGlmIChjb2xvcl90YWJsZV9zaXplIDw9IDQpIHsKKyAgd2lkdGhfYml0cyA9IDI7Cit9IGVsc2UgaWYgKGNvbG9yX3RhYmxlX3NpemUgPD0gMTYpIHsKKyAgd2lkdGhfYml0cyA9IDE7Cit9IGVsc2UgeworICB3aWR0aF9iaXRzID0gMDsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitgd2lkdGhfYml0c2AgaGFzIGEgdmFsdWUgb2YgMCwgMSwgMiBvciAzLiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIG5vCitwaXhlbCBidW5kbGluZyB0byBiZSBkb25lIGZvciB0aGUgaW1hZ2UuIEEgdmFsdWUgb2YgMSBpbmRpY2F0ZXMgdGhhdCB0d28KK3BpeGVscyBhcmUgY29tYmluZWQgdG9nZXRoZXIsIGFuZCBlYWNoIHBpeGVsIGhhcyBhIHJhbmdlIG9mIFxbMC4uMTVcXS4gQQordmFsdWUgb2YgMiBpbmRpY2F0ZXMgdGhhdCBmb3VyIHBpeGVscyBhcmUgY29tYmluZWQgdG9nZXRoZXIsIGFuZCBlYWNoCitwaXhlbCBoYXMgYSByYW5nZSBvZiBcWzAuLjNcXS4gQSB2YWx1ZSBvZiAzIGluZGljYXRlcyB0aGF0IGVpZ2h0IHBpeGVscworYXJlIGNvbWJpbmVkIHRvZ2V0aGVyIGFuZCBlYWNoIHBpeGVsIGhhcyBhIHJhbmdlIG9mIFxbMC4uMVxdLCBpLmUuLCBhCitiaW5hcnkgdmFsdWUuCisKK1RoZSB2YWx1ZXMgYXJlIHBhY2tlZCBpbnRvIHRoZSBncmVlbiBjb21wb25lbnQgYXMgZm9sbG93czoKKworICAqIGB3aWR0aF9iaXRzYCA9IDE6IGZvciBldmVyeSB4IHZhbHVlIHdoZXJlIHgg4omhIDAgKG1vZCAyKSwgYSBncmVlbgorICAgIHZhbHVlIGF0IHggaXMgcG9zaXRpb25lZCBpbnRvIHRoZSA0IGxlYXN0LXNpZ25pZmljYW50IGJpdHMgb2YgdGhlCisgICAgZ3JlZW4gdmFsdWUgYXQgeCAvIDIsIGEgZ3JlZW4gdmFsdWUgYXQgeCArIDEgaXMgcG9zaXRpb25lZCBpbnRvIHRoZQorICAgIDQgbW9zdC1zaWduaWZpY2FudCBiaXRzIG9mIHRoZSBncmVlbiB2YWx1ZSBhdCB4IC8gMi4KKyAgKiBgd2lkdGhfYml0c2AgPSAyOiBmb3IgZXZlcnkgeCB2YWx1ZSB3aGVyZSB4IOKJoSAwIChtb2QgNCksIGEgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IGlzIHBvc2l0aW9uZWQgaW50byB0aGUgMiBsZWFzdC1zaWduaWZpY2FudCBiaXRzIG9mIHRoZQorICAgIGdyZWVuIHZhbHVlIGF0IHggLyA0LCBncmVlbiB2YWx1ZXMgYXQgeCArIDEgdG8geCArIDMgaW4gb3JkZXIgdG8gdGhlCisgICAgbW9yZSBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBncmVlbiB2YWx1ZSBhdCB4IC8gNC4KKyAgKiBgd2lkdGhfYml0c2AgPSAzOiBmb3IgZXZlcnkgeCB2YWx1ZSB3aGVyZSB4IOKJoSAwIChtb2QgOCksIGEgZ3JlZW4KKyAgICB2YWx1ZSBhdCB4IGlzIHBvc2l0aW9uZWQgaW50byB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBncmVlbgorICAgIHZhbHVlIGF0IHggLyA4LCBncmVlbiB2YWx1ZXMgYXQgeCArIDEgdG8geCArIDcgaW4gb3JkZXIgdG8gdGhlIG1vcmUKKyAgICBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBncmVlbiB2YWx1ZSBhdCB4IC8gOC4KKworCis0IEltYWdlIERhdGEKKy0tLS0tLS0tLS0tLQorCitJbWFnZSBkYXRhIGlzIGFuIGFycmF5IG9mIHBpeGVsIHZhbHVlcyBpbiBzY2FuLWxpbmUgb3JkZXIuCisKKyMjIyA0LjEgUm9sZXMgb2YgSW1hZ2UgRGF0YQorCitXZSB1c2UgaW1hZ2UgZGF0YSBpbiBmaXZlIGRpZmZlcmVudCByb2xlczoKKworICAxLiBBUkdCIGltYWdlOiBTdG9yZXMgdGhlIGFjdHVhbCBwaXhlbHMgb2YgdGhlIGltYWdlLgorICAxLiBFbnRyb3B5IGltYWdlOiBTdG9yZXMgdGhlCisgICAgIFttZXRhIEh1ZmZtYW4gY29kZXNdKCNkZWNvZGluZy1vZi1tZXRhLWh1ZmZtYW4tY29kZXMpLiBUaGUgcmVkIGFuZCBncmVlbgorICAgICBjb21wb25lbnRzIG9mIGEgcGl4ZWwgZGVmaW5lIHRoZSBtZXRhIEh1ZmZtYW4gY29kZSB1c2VkIGluIGEgcGFydGljdWxhcgorICAgICBibG9jayBvZiB0aGUgQVJHQiBpbWFnZS4KKyAgMS4gUHJlZGljdG9yIGltYWdlOiBTdG9yZXMgdGhlIG1ldGFkYXRhIGZvciBbUHJlZGljdG9yCisgICAgIFRyYW5zZm9ybV0oI3ByZWRpY3Rvci10cmFuc2Zvcm0pLiBUaGUgZ3JlZW4gY29tcG9uZW50IG9mIGEgcGl4ZWwgZGVmaW5lcworICAgICB3aGljaCBvZiB0aGUgMTQgcHJlZGljdG9ycyBpcyB1c2VkIHdpdGhpbiBhIHBhcnRpY3VsYXIgYmxvY2sgb2YgdGhlCisgICAgIEFSR0IgaW1hZ2UuCisgIDEuIENvbG9yIHRyYW5zZm9ybSBpbWFnZS4gSXQgaXMgY3JlYXRlZCBieSBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCB2YWx1ZXMKKyAgICAgKGRlZmluZWQgaW4gW0NvbG9yIFRyYW5zZm9ybV0oI2NvbG9yLXRyYW5zZm9ybSkpIGZvciBkaWZmZXJlbnQgYmxvY2tzIG9mCisgICAgIHRoZSBpbWFnZS4gRWFjaCBgQ29sb3JUcmFuc2Zvcm1FbGVtZW50YCBgJ2N0ZSdgIGlzIHRyZWF0ZWQgYXMgYSBwaXhlbCB3aG9zZQorICAgICBhbHBoYSBjb21wb25lbnQgaXMgYDI1NWAsIHJlZCBjb21wb25lbnQgaXMgYGN0ZS5yZWRfdG9fYmx1ZWAsIGdyZWVuCisgICAgIGNvbXBvbmVudCBpcyBgY3RlLmdyZWVuX3RvX2JsdWVgIGFuZCBibHVlIGNvbXBvbmVudCBpcyBgY3RlLmdyZWVuX3RvX3JlZGAuCisgIDEuIENvbG9yIGluZGV4aW5nIGltYWdlOiBBbiBhcnJheSBvZiBvZiBzaXplIGBjb2xvcl90YWJsZV9zaXplYCAodXAgdG8gMjU2CisgICAgIEFSR0IgdmFsdWVzKSBzdG9yaW5nIHRoZSBtZXRhZGF0YSBmb3IgdGhlCisgICAgIFtDb2xvciBJbmRleGluZyBUcmFuc2Zvcm1dKCNjb2xvci1pbmRleGluZy10cmFuc2Zvcm0pLiBUaGlzIGlzIHN0b3JlZCBhcyBhbgorICAgICBpbWFnZSBvZiB3aWR0aCBgY29sb3JfdGFibGVfc2l6ZWAgYW5kIGhlaWdodCBgMWAuCisKKyMjIyA0LjIgRW5jb2Rpbmcgb2YgSW1hZ2UgZGF0YQorCitUaGUgZW5jb2Rpbmcgb2YgaW1hZ2UgZGF0YSBpcyBpbmRlcGVuZGVudCBvZiBpdHMgcm9sZS4KKworVGhlIGltYWdlIGlzIGZpcnN0IGRpdmlkZWQgaW50byBhIHNldCBvZiBmaXhlZC1zaXplIGJsb2NrcyAodHlwaWNhbGx5IDE2eDE2CitibG9ja3MpLiBFYWNoIG9mIHRoZXNlIGJsb2NrcyBhcmUgbW9kZWxlZCB1c2luZyB0aGVpciBvd24gZW50cm9weSBjb2Rlcy4gQWxzbywKK3NldmVyYWwgYmxvY2tzIG1heSBzaGFyZSB0aGUgc2FtZSBlbnRyb3B5IGNvZGVzLgorCisqKlJhdGlvbmFsZToqKiBTdG9yaW5nIGFuIGVudHJvcHkgY29kZSBpbmN1cnMgYSBjb3N0LiBUaGlzIGNvc3QgY2FuIGJlIG1pbmltaXplZAoraWYgc3RhdGlzdGljYWxseSBzaW1pbGFyIGJsb2NrcyBzaGFyZSBhbiBlbnRyb3B5IGNvZGUsIHRoZXJlYnkgc3RvcmluZyB0aGF0IGNvZGUKK29ubHkgb25jZS4gRm9yIGV4YW1wbGUsIGFuIGVuY29kZXIgY2FuIGZpbmQgc2ltaWxhciBibG9ja3MgYnkgY2x1c3RlcmluZyB0aGVtCit1c2luZyB0aGVpciBzdGF0aXN0aWNhbCBwcm9wZXJ0aWVzLCBvciBieSByZXBlYXRlZGx5IGpvaW5pbmcgYSBwYWlyIG9mIHJhbmRvbWx5CitzZWxlY3RlZCBjbHVzdGVycyB3aGVuIGl0IHJlZHVjZXMgdGhlIG92ZXJhbGwgYW1vdW50IG9mIGJpdHMgbmVlZGVkIHRvIGVuY29kZQordGhlIGltYWdlLgorCitFYWNoIHBpeGVsIGlzIGVuY29kZWQgdXNpbmcgb25lIG9mIHRoZSB0aHJlZSBwb3NzaWJsZSBtZXRob2RzOgorCisgIDEuIEh1ZmZtYW4gY29kZWQgbGl0ZXJhbDogZWFjaCBjaGFubmVsIChncmVlbiwgcmVkLCBibHVlIGFuZCBhbHBoYSkgaXMKKyAgICAgZW50cm9weS1jb2RlZCBpbmRlcGVuZGVudGx5OworICAyLiBMWjc3IGJhY2t3YXJkIHJlZmVyZW5jZTogYSBzZXF1ZW5jZSBvZiBwaXhlbHMgYXJlIGNvcGllZCBmcm9tIGVsc2V3aGVyZQorICAgICBpbiB0aGUgaW1hZ2U7IG9yCisgIDMuIENvbG9yIGNhY2hlIGNvZGU6IHVzaW5nIGEgc2hvcnQgbXVsdGlwbGljYXRpdmUgaGFzaCBjb2RlIChjb2xvciBjYWNoZQorICAgICBpbmRleCkgb2YgYSByZWNlbnRseSBzZWVuIGNvbG9yLgorCitUaGUgZm9sbG93aW5nIHN1Yi1zZWN0aW9ucyBkZXNjcmliZSBlYWNoIG9mIHRoZXNlIGluIGRldGFpbC4KKworIyMjIyA0LjIuMSBIdWZmbWFuIENvZGVkIExpdGVyYWxzCisKK1RoZSBwaXhlbCBpcyBzdG9yZWQgYXMgSHVmZm1hbiBjb2RlZCB2YWx1ZXMgb2YgZ3JlZW4sIHJlZCwgYmx1ZSBhbmQgYWxwaGEgKGluCit0aGF0IG9yZGVyKS4gU2VlIFt0aGlzIHNlY3Rpb25dKCNkZWNvZGluZy1lbnRyb3B5LWNvZGVkLWltYWdlLWRhdGEpIGZvciBkZXRhaWxzLgorCisjIyMjIDQuMi4yIExaNzcgQmFja3dhcmQgUmVmZXJlbmNlCisKK0JhY2t3YXJkIHJlZmVyZW5jZXMgYXJlIHR1cGxlcyBvZiBfbGVuZ3RoXyBhbmQgX2Rpc3RhbmNlIGNvZGVfOgorCisgICogTGVuZ3RoIGluZGljYXRlcyBob3cgbWFueSBwaXhlbHMgaW4gc2Nhbi1saW5lIG9yZGVyIGFyZSB0byBiZSBjb3BpZWQuCisgICogRGlzdGFuY2UgY29kZSBpcyBhIG51bWJlciBpbmRpY2F0aW5nIHRoZSBwb3NpdGlvbiBvZiBhIHByZXZpb3VzbHkgc2VlbgorICAgIHBpeGVsLCBmcm9tIHdoaWNoIHRoZSBwaXhlbHMgYXJlIHRvIGJlIGNvcGllZC4gVGhlIGV4YWN0IG1hcHBpbmcgaXMKKyAgICBkZXNjcmliZWQgW2JlbG93XSgjZGlzdGFuY2UtbWFwcGluZykuCisKK1RoZSBsZW5ndGggYW5kIGRpc3RhbmNlIHZhbHVlcyBhcmUgc3RvcmVkIHVzaW5nICoqTFo3NyBwcmVmaXggY29kaW5nKiouCisKK0xaNzcgcHJlZml4IGNvZGluZyBkaXZpZGVzIGxhcmdlIGludGVnZXIgdmFsdWVzIGludG8gdHdvIHBhcnRzOiB0aGUgX3ByZWZpeAorY29kZV8gYW5kIHRoZSBfZXh0cmEgYml0c186IHRoZSBwcmVmaXggY29kZSBpcyBzdG9yZWQgdXNpbmcgYW4gZW50cm9weSBjb2RlLAord2hpbGUgdGhlIGV4dHJhIGJpdHMgYXJlIHN0b3JlZCBhcyB0aGV5IGFyZSAod2l0aG91dCBhbiBlbnRyb3B5IGNvZGUpLgorCisqKlJhdGlvbmFsZSoqOiBUaGlzIGFwcHJvYWNoIHJlZHVjZXMgdGhlIHN0b3JhZ2UgcmVxdWlyZW1lbnQgZm9yIHRoZSBlbnRyb3B5Citjb2RlLiBBbHNvLCBsYXJnZSB2YWx1ZXMgYXJlIHVzdWFsbHkgcmFyZSwgYW5kIHNvIGV4dHJhIGJpdHMgd291bGQgYmUgdXNlZCBmb3IKK3ZlcnkgZmV3IHZhbHVlcyBpbiB0aGUgaW1hZ2UuIFRodXMsIHRoaXMgYXBwcm9hY2ggcmVzdWx0cyBpbiBhIGJldHRlcgorY29tcHJlc3Npb24gb3ZlcmFsbC4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBkZW5vdGVzIHRoZSBwcmVmaXggY29kZXMgYW5kIGV4dHJhIGJpdHMgdXNlZCBmb3Igc3RvcmluZworZGlmZmVyZW50IHJhbmdlIG9mIHZhbHVlcy4KKworTm90ZTogVGhlIG1heGltdW0gYmFja3dhcmQgcmVmZXJlbmNlIGxlbmd0aCBpcyBsaW1pdGVkIHRvIDQwOTYuIEhlbmNlLCBvbmx5IHRoZQorZmlyc3QgMjQgcHJlZml4IGNvZGVzICh3aXRoIHRoZSByZXNwZWN0aXZlIGV4dHJhIGJpdHMpIGFyZSBtZWFuaW5nZnVsIGZvciBsZW5ndGgKK3ZhbHVlcy4gRm9yIGRpc3RhbmNlIHZhbHVlcywgaG93ZXZlciwgYWxsIHRoZSA0MCBwcmVmaXggY29kZXMgYXJlIHZhbGlkLgorCit8IFZhbHVlIHJhbmdlICAgICB8IFByZWZpeCBjb2RlIHwgRXh0cmEgYml0cyB8Cit8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLSB8Cit8IDEgICAgICAgICAgICAgICB8IDAgICAgICAgICAgIHwgMCAgICAgICAgICB8Cit8IDIgICAgICAgICAgICAgICB8IDEgICAgICAgICAgIHwgMCAgICAgICAgICB8Cit8IDMgICAgICAgICAgICAgICB8IDIgICAgICAgICAgIHwgMCAgICAgICAgICB8Cit8IDQgICAgICAgICAgICAgICB8IDMgICAgICAgICAgIHwgMCAgICAgICAgICB8Cit8IDUuLjYgICAgICAgICAgICB8IDQgICAgICAgICAgIHwgMSAgICAgICAgICB8Cit8IDcuLjggICAgICAgICAgICB8IDUgICAgICAgICAgIHwgMSAgICAgICAgICB8Cit8IDkuLjEyICAgICAgICAgICB8IDYgICAgICAgICAgIHwgMiAgICAgICAgICB8Cit8IDEzLi4xNiAgICAgICAgICB8IDcgICAgICAgICAgIHwgMiAgICAgICAgICB8Cit8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICAgICAgIHwgLi4uICAgICAgICB8Cit8IDMwNzIuLjQwOTYgICAgICB8IDIzICAgICAgICAgIHwgMTAgICAgICAgICB8Cit8IC4uLiAgICAgICAgICAgICB8IC4uLiAgICAgICAgIHwgLi4uICAgICAgICB8Cit8IDUyNDI4OS4uNzg2NDMyICB8IDM4ICAgICAgICAgIHwgMTggICAgICAgICB8Cit8IDc4NjQzMy4uMTA0ODU3NiB8IDM5ICAgICAgICAgIHwgMTggICAgICAgICB8CisKK1RoZSBwc2V1ZG9jb2RlIHRvIG9idGFpbiBhIChsZW5ndGggb3IgZGlzdGFuY2UpIHZhbHVlIGZyb20gdGhlIHByZWZpeCBjb2RlIGlzCithcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2lmIChwcmVmaXhfY29kZSA8IDQpIHsKKyAgcmV0dXJuIHByZWZpeF9jb2RlICsgMTsKK30KK2ludCBleHRyYV9iaXRzID0gKHByZWZpeF9jb2RlIC0gMikgPj4gMTsKK2ludCBvZmZzZXQgPSAoMiArIChwcmVmaXhfY29kZSAmIDEpKSA8PCBleHRyYV9iaXRzOworcmV0dXJuIG9mZnNldCArIFJlYWRCaXRzKGV4dHJhX2JpdHMpICsgMTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisqKkRpc3RhbmNlIE1hcHBpbmc6KioKK3s6I2Rpc3RhbmNlLW1hcHBpbmd9CisKK0FzIG5vdGVkIHByZXZpb3VzbHksIGRpc3RhbmNlIGNvZGUgaXMgYSBudW1iZXIgaW5kaWNhdGluZyB0aGUgcG9zaXRpb24gb2YgYQorcHJldmlvdXNseSBzZWVuIHBpeGVsLCBmcm9tIHdoaWNoIHRoZSBwaXhlbHMgYXJlIHRvIGJlIGNvcGllZC4gVGhpcyBzdWItc2VjdGlvbgorZGVmaW5lcyB0aGUgbWFwcGluZyBiZXR3ZWVuIGEgZGlzdGFuY2UgY29kZSBhbmQgdGhlIHBvc2l0aW9uIG9mIGEgcHJldmlvdXMKK3BpeGVsLgorCitUaGUgZGlzdGFuY2UgY29kZXMgbGFyZ2VyIHRoYW4gMTIwIGRlbm90ZSB0aGUgcGl4ZWwtZGlzdGFuY2UgaW4gc2Nhbi1saW5lCitvcmRlciwgb2Zmc2V0IGJ5IDEyMC4KKworVGhlIHNtYWxsZXN0IGRpc3RhbmNlIGNvZGVzIFxbMS4uMTIwXF0gYXJlIHNwZWNpYWwsIGFuZCBhcmUgcmVzZXJ2ZWQgZm9yIGEgY2xvc2UKK25laWdoYm9yaG9vZCBvZiB0aGUgY3VycmVudCBwaXhlbC4gVGhpcyBuZWlnaGJvcmhvb2QgY29uc2lzdHMgb2YgMTIwIHBpeGVsczoKKworICAqIFBpeGVscyB0aGF0IGFyZSAxIHRvIDcgcm93cyBhYm92ZSB0aGUgY3VycmVudCBwaXhlbCwgYW5kIGFyZSB1cCB0byA4IGNvbHVtbnMKKyAgICB0byB0aGUgbGVmdCBvciB1cCB0byA3IGNvbHVtbnMgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJyZW50IHBpeGVsLiBcW1RvdGFsCisgICAgc3VjaCBwaXhlbHMgPSBgNyAqICg4ICsgMSArIDcpID0gMTEyYFxdLgorICAqIFBpeGVscyB0aGF0IGFyZSBpbiBzYW1lIHJvdyBhcyB0aGUgY3VycmVudCBwaXhlbCwgYW5kIGFyZSB1cCB0byA4IGNvbHVtbnMgdG8KKyAgICB0aGUgbGVmdCBvZiB0aGUgY3VycmVudCBwaXhlbC4gXFtgOGAgc3VjaCBwaXhlbHNcXS4KKworVGhlIG1hcHBpbmcgYmV0d2VlbiBkaXN0YW5jZSBjb2RlIGBpYCBhbmQgdGhlIG5laWdoYm9yaW5nIHBpeGVsIG9mZnNldAorYCh4aSwgeWkpYCBpcyBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKygwLCAxKSwgICgxLCAwKSwgICgxLCAxKSwgICgtMSwgMSksICgwLCAyKSwgICgyLCAwKSwgICgxLCAyKSwgICgtMSwgMiksCisoMiwgMSksICAoLTIsIDEpLCAoMiwgMiksICAoLTIsIDIpLCAoMCwgMyksICAoMywgMCksICAoMSwgMyksICAoLTEsIDMpLAorKDMsIDEpLCAgKC0zLCAxKSwgKDIsIDMpLCAgKC0yLCAzKSwgKDMsIDIpLCAgKC0zLCAyKSwgKDAsIDQpLCAgKDQsIDApLAorKDEsIDQpLCAgKC0xLCA0KSwgKDQsIDEpLCAgKC00LCAxKSwgKDMsIDMpLCAgKC0zLCAzKSwgKDIsIDQpLCAgKC0yLCA0KSwKKyg0LCAyKSwgICgtNCwgMiksICgwLCA1KSwgICgzLCA0KSwgICgtMywgNCksICg0LCAzKSwgICgtNCwgMyksICg1LCAwKSwKKygxLCA1KSwgICgtMSwgNSksICg1LCAxKSwgICgtNSwgMSksICgyLCA1KSwgICgtMiwgNSksICg1LCAyKSwgICgtNSwgMiksCisoNCwgNCksICAoLTQsIDQpLCAoMywgNSksICAoLTMsIDUpLCAoNSwgMyksICAoLTUsIDMpLCAoMCwgNiksICAoNiwgMCksCisoMSwgNiksICAoLTEsIDYpLCAoNiwgMSksICAoLTYsIDEpLCAoMiwgNiksICAoLTIsIDYpLCAoNiwgMiksICAoLTYsIDIpLAorKDQsIDUpLCAgKC00LCA1KSwgKDUsIDQpLCAgKC01LCA0KSwgKDMsIDYpLCAgKC0zLCA2KSwgKDYsIDMpLCAgKC02LCAzKSwKKygwLCA3KSwgICg3LCAwKSwgICgxLCA3KSwgICgtMSwgNyksICg1LCA1KSwgICgtNSwgNSksICg3LCAxKSwgICgtNywgMSksCisoNCwgNiksICAoLTQsIDYpLCAoNiwgNCksICAoLTYsIDQpLCAoMiwgNyksICAoLTIsIDcpLCAoNywgMiksICAoLTcsIDIpLAorKDMsIDcpLCAgKC0zLCA3KSwgKDcsIDMpLCAgKC03LCAzKSwgKDUsIDYpLCAgKC01LCA2KSwgKDYsIDUpLCAgKC02LCA1KSwKKyg4LCAwKSwgICg0LCA3KSwgICgtNCwgNyksICg3LCA0KSwgICgtNywgNCksICg4LCAxKSwgICg4LCAyKSwgICg2LCA2KSwKKygtNiwgNiksICg4LCAzKSwgICg1LCA3KSwgICgtNSwgNyksICg3LCA1KSwgICgtNywgNSksICg4LCA0KSwgICg2LCA3KSwKKygtNiwgNyksICg3LCA2KSwgICgtNywgNiksICg4LCA1KSwgICg3LCA3KSwgICgtNywgNyksICg4LCA2KSwgICg4LCA3KQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK0ZvciBleGFtcGxlLCBkaXN0YW5jZSBjb2RlIGAxYCBpbmRpY2F0ZXMgb2Zmc2V0IG9mIGAoMCwgMSlgIGZvciB0aGUgbmVpZ2hib3JpbmcKK3BpeGVsLCB0aGF0IGlzLCB0aGUgcGl4ZWwgYWJvdmUgdGhlIGN1cnJlbnQgcGl4ZWwgKDAtcGl4ZWwgZGlmZmVyZW5jZSBpbgorWC1kaXJlY3Rpb24gYW5kIDEgcGl4ZWwgZGlmZmVyZW5jZSBpbiBZLWRpcmVjdGlvbikuIFNpbWlsYXJseSwgZGlzdGFuY2UgY29kZQorYDNgIGluZGljYXRlcyBsZWZ0LXRvcCBwaXhlbC4KKworVGhlIGRlY29kZXIgY2FuIGNvbnZlcnQgYSBkaXN0YW5jZXMgY29kZSAnaScgdG8gYSBzY2FuLWxpbmUgb3JkZXIgZGlzdGFuY2UKKydkaXN0JyBhcyBmb2xsb3dzOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisoeGksIHlpKSA9IGRpc3RhbmNlX21hcFtpXQorZGlzdCA9IHggKyB5ICogeHNpemUKK2lmIChkaXN0IDwgMSkgeworICBkaXN0ID0gMQorfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit3aGVyZSAnZGlzdGFuY2VfbWFwJyBpcyB0aGUgbWFwcGluZyBub3RlZCBhYm92ZSBhbmQgYHhzaXplYCBpcyB0aGUgd2lkdGggb2YgdGhlCitpbWFnZSBpbiBwaXhlbHMuCisKKworIyMjIyA0LjIuMyBDb2xvciBDYWNoZSBDb2RpbmcKKworQ29sb3IgY2FjaGUgc3RvcmVzIGEgc2V0IG9mIGNvbG9ycyB0aGF0IGhhdmUgYmVlbiByZWNlbnRseSB1c2VkIGluIHRoZSBpbWFnZS4KKworKipSYXRpb25hbGU6KiogVGhpcyB3YXksIHRoZSByZWNlbnRseSB1c2VkIGNvbG9ycyBjYW4gc29tZXRpbWVzIGJlIHJlZmVycmVkIHRvCittb3JlIGVmZmljaWVudGx5IHRoYW4gZW1pdHRpbmcgdGhlbSB1c2luZyBvdGhlciB0d28gbWV0aG9kcyAoZGVzY3JpYmVkIGluCitbNC4yLjFdKCNodWZmbWFuLWNvZGVkLWxpdGVyYWxzKSBhbmQgWzQuMi4yXSgjbHo3Ny1iYWNrd2FyZC1yZWZlcmVuY2UpKS4KKworQ29sb3IgY2FjaGUgY29kZXMgYXJlIHN0b3JlZCBhcyBmb2xsb3dzLiBGaXJzdCwgdGhlcmUgaXMgYSAxLWJpdCB2YWx1ZSB0aGF0CitpbmRpY2F0ZXMgaWYgdGhlIGNvbG9yIGNhY2hlIGlzIHVzZWQuIElmIHRoaXMgYml0IGlzIDAsIG5vIGNvbG9yIGNhY2hlIGNvZGVzCitleGlzdCwgYW5kIHRoZXkgYXJlIG5vdCB0cmFuc21pdHRlZCBpbiB0aGUgSHVmZm1hbiBjb2RlIHRoYXQgZGVjb2RlcyB0aGUgZ3JlZW4KK3N5bWJvbHMgYW5kIHRoZSBsZW5ndGggcHJlZml4IGNvZGVzLiBIb3dldmVyLCBpZiB0aGlzIGJpdCBpcyAxLCB0aGUgY29sb3IgY2FjaGUKK3NpemUgaXMgcmVhZCBuZXh0OgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBjb2xvcl9jYWNoZV9jb2RlX2JpdHMgPSBSZWFkQml0cyg0KTsKK2ludCBjb2xvcl9jYWNoZV9zaXplID0gMSA8PCBjb2xvcl9jYWNoZV9jb2RlX2JpdHM7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworYGNvbG9yX2NhY2hlX2NvZGVfYml0c2AgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgY29sb3JfY2FjaGUgYnkgKDEgPDwKK2Bjb2xvcl9jYWNoZV9jb2RlX2JpdHNgKS4gVGhlIHJhbmdlIG9mIGFsbG93ZWQgdmFsdWVzIGZvcgorYGNvbG9yX2NhY2hlX2NvZGVfYml0c2AgaXMgXFsxLi4xMVxdLiBDb21wbGlhbnQgZGVjb2RlcnMgbXVzdCBpbmRpY2F0ZSBhCitjb3JydXB0ZWQgYml0c3RyZWFtIGZvciBvdGhlciB2YWx1ZXMuCisKK0EgY29sb3IgY2FjaGUgaXMgYW4gYXJyYXkgb2Ygc2l6ZSBgY29sb3JfY2FjaGVfc2l6ZWAuIEVhY2ggZW50cnkKK3N0b3JlcyBvbmUgQVJHQiBjb2xvci4gQ29sb3JzIGFyZSBsb29rZWQgdXAgYnkgaW5kZXhpbmcgdGhlbSBieQorKDB4MWUzNWE3YmQgKiBgY29sb3JgKSA+PiAoMzIgLSBgY29sb3JfY2FjaGVfY29kZV9iaXRzYCkuIE9ubHkgb25lCitsb29rdXAgaXMgZG9uZSBpbiBhIGNvbG9yIGNhY2hlOyB0aGVyZSBpcyBubyBjb25mbGljdCByZXNvbHV0aW9uLgorCitJbiB0aGUgYmVnaW5uaW5nIG9mIGRlY29kaW5nIG9yIGVuY29kaW5nIG9mIGFuIGltYWdlLCBhbGwgZW50cmllcyBpbiBhbGwKK2NvbG9yIGNhY2hlIHZhbHVlcyBhcmUgc2V0IHRvIHplcm8uIFRoZSBjb2xvciBjYWNoZSBjb2RlIGlzIGNvbnZlcnRlZCB0bwordGhpcyBjb2xvciBhdCBkZWNvZGluZyB0aW1lLiBUaGUgc3RhdGUgb2YgdGhlIGNvbG9yIGNhY2hlIGlzIG1haW50YWluZWQKK2J5IGluc2VydGluZyBldmVyeSBwaXhlbCwgYmUgaXQgcHJvZHVjZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNpbmcgb3IgYXMKK2xpdGVyYWxzLCBpbnRvIHRoZSBjYWNoZSBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gdGhlIHN0cmVhbS4KKworCis1IEVudHJvcHkgQ29kZQorLS0tLS0tLS0tLS0tLS0KKworIyMjIDUuMSBPdmVydmlldworCitNb3N0IG9mIHRoZSBkYXRhIGlzIGNvZGVkIHVzaW5nIFtjYW5vbmljYWwgSHVmZm1hbiBjb2RlXVtjYW5vbmljYWxfaHVmZl0uIEhlbmNlLAordGhlIGNvZGVzIGFyZSB0cmFuc21pdHRlZCBieSBzZW5kaW5nIHRoZSBfSHVmZm1hbiBjb2RlIGxlbmd0aHNfLCBhcyBvcHBvc2VkIHRvCit0aGUgYWN0dWFsIF9IdWZmbWFuIGNvZGVzXy4KKworSW4gcGFydGljdWxhciwgdGhlIGZvcm1hdCB1c2VzICoqc3BhdGlhbGx5LXZhcmlhbnQgSHVmZm1hbiBjb2RpbmcqKi4gSW4gb3RoZXIKK3dvcmRzLCBkaWZmZXJlbnQgYmxvY2tzIG9mIHRoZSBpbWFnZSBjYW4gcG90ZW50aWFsbHkgdXNlIGRpZmZlcmVudCBlbnRyb3B5Citjb2Rlcy4KKworKipSYXRpb25hbGUqKjogRGlmZmVyZW50IGFyZWFzIG9mIHRoZSBpbWFnZSBtYXkgaGF2ZSBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLiBTbywgYWxsb3dpbmcgdGhlbSB0byB1c2UgZGlmZmVyZW50IGVudHJvcHkgY29kZXMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eSBhbmQKK3BvdGVudGlhbGx5IGEgYmV0dGVyIGNvbXByZXNzaW9uLgorCisjIyMgNS4yIERldGFpbHMKKworVGhlIGVuY29kZWQgaW1hZ2UgZGF0YSBjb25zaXN0cyBvZiB0d28gcGFydHM6CisKKyAgMS4gTWV0YSBIdWZmbWFuIGNvZGVzCisgIDEuIEVudHJvcHktY29kZWQgaW1hZ2UgZGF0YQorCisjIyMjIDUuMi4xIERlY29kaW5nIG9mIE1ldGEgSHVmZm1hbiBDb2RlcworCitBcyBub3RlZCBlYXJsaWVyLCB0aGUgZm9ybWF0IGFsbG93cyB0aGUgdXNlIG9mIGRpZmZlcmVudCBIdWZmbWFuIGNvZGVzIGZvcgorZGlmZmVyZW50IGJsb2NrcyBvZiB0aGUgaW1hZ2UuIF9NZXRhIEh1ZmZtYW4gY29kZXNfIGFyZSBpbmRleGVzIGlkZW50aWZ5aW5nCit3aGljaCBIdWZmbWFuIGNvZGVzIHRvIHVzZSBpbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIGltYWdlLgorCitNZXRhIEh1ZmZtYW4gY29kZXMgbWF5IGJlIHVzZWQgX29ubHlfIHdoZW4gdGhlIGltYWdlIGlzIGJlaW5nIHVzZWQgaW4gdGhlCitbcm9sZV0oI3JvbGVzLW9mLWltYWdlLWRhdGEpIG9mIGFuIF9BUkdCIGltYWdlXy4KKworVGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzIGZvciB0aGUgbWV0YSBIdWZmbWFuIGNvZGVzLCBpbmRpY2F0ZWQgYnkgYSAxLWJpdAordmFsdWU6CisKKyAgKiBJZiB0aGlzIGJpdCBpcyB6ZXJvLCB0aGVyZSBpcyBvbmx5IG9uZSBtZXRhIEh1ZmZtYW4gY29kZSB1c2VkIGV2ZXJ5d2hlcmUgaW4KKyAgICB0aGUgaW1hZ2UuIE5vIG1vcmUgZGF0YSBpcyBzdG9yZWQuCisgICogSWYgdGhpcyBiaXQgaXMgb25lLCB0aGUgaW1hZ2UgdXNlcyBtdWx0aXBsZSBtZXRhIEh1ZmZtYW4gY29kZXMuIFRoZXNlIG1ldGEKKyAgICBIdWZmbWFuIGNvZGVzIGFyZSBzdG9yZWQgYXMgYW4gX2VudHJvcHkgaW1hZ2VfIChkZXNjcmliZWQgYmVsb3cpLgorCisqKkVudHJvcHkgaW1hZ2U6KioKKworVGhlIGVudHJvcHkgaW1hZ2UgZGVmaW5lcyB3aGljaCBIdWZmbWFuIGNvZGVzIGFyZSB1c2VkIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUKK2ltYWdlLCBhcyBkZXNjcmliZWQgYmVsb3cuCisKK1RoZSBmaXJzdCAzLWJpdHMgY29udGFpbiB0aGUgYGh1ZmZtYW5fYml0c2AgdmFsdWUuIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbnRyb3B5CitpbWFnZSBhcmUgZGVyaXZlZCBmcm9tICdodWZmbWFuX2JpdHMnLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBodWZmbWFuX2JpdHMgPSBSZWFkQml0cygzKSArIDI7CitpbnQgaHVmZm1hbl94c2l6ZSA9IERJVl9ST1VORF9VUCh4c2l6ZSwgMSA8PCBodWZmbWFuX2JpdHMpOworaW50IGh1ZmZtYW5feXNpemUgPSBESVZfUk9VTkRfVVAoeXNpemUsIDEgPDwgaHVmZm1hbl9iaXRzKTsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCit3aGVyZSBgRElWX1JPVU5EX1VQYCBpcyBhcyBkZWZpbmVkIFtlYXJsaWVyXSgjcHJlZGljdG9yLXRyYW5zZm9ybSkuCisKK05leHQgYml0cyBjb250YWluIGFuIGVudHJvcHkgaW1hZ2Ugb2Ygd2lkdGggYGh1ZmZtYW5feHNpemVgIGFuZCBoZWlnaHQKK2BodWZmbWFuX3lzaXplYC4KKworKipJbnRlcnByZXRhdGlvbiBvZiBNZXRhIEh1ZmZtYW4gQ29kZXM6KioKKworRm9yIGFueSBnaXZlbiBwaXhlbCAoeCwgeSksIHRoZXJlIGlzIGEgc2V0IG9mIGZpdmUgSHVmZm1hbiBjb2RlcyBhc3NvY2lhdGVkIHdpdGgKK2l0LiBUaGVzZSBjb2RlcyBhcmUgKGluIGJpdHN0cmVhbSBvcmRlcik6CisKKyAgKiAqKkh1ZmZtYW4gY29kZSAjMSoqOiB1c2VkIGZvciBncmVlbiBjaGFubmVsLCBiYWNrd2FyZC1yZWZlcmVuY2UgbGVuZ3RoIGFuZAorICAgIGNvbG9yIGNhY2hlCisgICogKipIdWZmbWFuIGNvZGUgIzIsICMzIGFuZCAjNCoqOiB1c2VkIGZvciByZWQsIGJsdWUgYW5kIGFscGhhIGNoYW5uZWxzCisgICAgcmVzcGVjdGl2ZWx5LgorICAqICoqSHVmZm1hbiBjb2RlICM1Kio6IHVzZWQgZm9yIGJhY2t3YXJkLXJlZmVyZW5jZSBkaXN0YW5jZS4KKworRnJvbSBoZXJlIG9uLCB3ZSByZWZlciB0byB0aGlzIHNldCBhcyBhICoqSHVmZm1hbiBjb2RlIGdyb3VwKiouCisKK1RoZSBudW1iZXIgb2YgSHVmZm1hbiBjb2RlIGdyb3VwcyBpbiB0aGUgQVJHQiBpbWFnZSBjYW4gYmUgb2J0YWluZWQgYnkgZmluZGluZwordGhlIF9sYXJnZXN0IG1ldGEgSHVmZm1hbiBjb2RlXyBmcm9tIHRoZSBlbnRyb3B5IGltYWdlOgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBudW1faHVmZl9ncm91cHMgPSBtYXgoZW50cm9weSBpbWFnZSkgKyAxOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cit3aGVyZSBgbWF4KGVudHJvcHkgaW1hZ2UpYCBpbmRpY2F0ZXMgdGhlIGxhcmdlc3QgSHVmZm1hbiBjb2RlIHN0b3JlZCBpbiB0aGUKK2VudHJvcHkgaW1hZ2UuCisKK0FzIGVhY2ggSHVmZm1hbiBjb2RlIGdyb3VwcyBjb250YWlucyBmaXZlIEh1ZmZtYW4gY29kZXMsIHRoZSB0b3RhbCBudW1iZXIgb2YKK0h1ZmZtYW4gY29kZXMgaXM6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IG51bV9odWZmX2NvZGVzID0gNSAqIG51bV9odWZmX2dyb3VwczsKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitHaXZlbiBhIHBpeGVsICh4LCB5KSBpbiB0aGUgQVJHQiBpbWFnZSwgd2UgY2FuIG9idGFpbiB0aGUgY29ycmVzcG9uZGluZyBIdWZmbWFuCitjb2RlcyB0byBiZSB1c2VkIGFzIGZvbGxvd3M6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IHBvc2l0aW9uID0gKHkgPj4gaHVmZm1hbl9iaXRzKSAqIGh1ZmZtYW5feHNpemUgKyAoeCA+PiBodWZmbWFuX2JpdHMpOworaW50IG1ldGFfaHVmZl9jb2RlID0gKGVudHJvcHlfaW1hZ2VbcG9zXSA+PiA4KSAmIDB4ZmZmZjsKK0h1ZmZtYW5Db2RlR3JvdXAgaHVmZl9ncm91cCA9IGh1ZmZtYW5fY29kZV9ncm91cHNbbWV0YV9odWZmX2NvZGVdOworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKK3doZXJlLCB3ZSBoYXZlIGFzc3VtZWQgdGhlIGV4aXN0ZW5jZSBvZiBgSHVmZm1hbkNvZGVHcm91cGAgc3RydWN0dXJlLCB3aGljaAorcmVwcmVzZW50cyBhIHNldCBvZiBmaXZlIEh1ZmZtYW4gY29kZXMuIEFsc28sIGBodWZmbWFuX2NvZGVfZ3JvdXBzYCBpcyBhbiBhcnJheQorb2YgYEh1ZmZtYW5Db2RlR3JvdXBgIChvZiBzaXplIGBudW1faHVmZl9ncm91cHNgKS4KKworVGhlIGRlY29kZXIgdGhlbiB1c2VzIEh1ZmZtYW4gY29kZSBncm91cCBgaHVmZl9ncm91cGAgdG8gZGVjb2RlIHRoZSBwaXhlbAorKHgsIHkpIGFzIGV4cGxhaW5lZCBpbiB0aGUgW25leHQgc2VjdGlvbl0oI2RlY29kaW5nLWVudHJvcHktY29kZWQtaW1hZ2UtZGF0YSkuCisKKyMjIyMgNS4yLjIgRGVjb2RpbmcgRW50cm9weS1jb2RlZCBJbWFnZSBEYXRhCisKK0ZvciB0aGUgY3VycmVudCBwb3NpdGlvbiAoeCwgeSkgaW4gdGhlIGltYWdlLCB0aGUgZGVjb2RlciBmaXJzdCBpZGVudGlmaWVzIHRoZQorY29ycmVzcG9uZGluZyBIdWZmbWFuIGNvZGUgZ3JvdXAgKGFzIGV4cGxhaW5lZCBpbiB0aGUgbGFzdCBzZWN0aW9uKS4gR2l2ZW4gdGhlCitIdWZmbWFuIGNvZGUgZ3JvdXAsIHRoZSBwaXhlbCBpcyByZWFkIGFuZCBkZWNvZGVkIGFzIGZvbGxvd3M6CisKK1JlYWQgbmV4dCBzeW1ib2wgUyBmcm9tIHRoZSBiaXRzdHJlYW0gdXNpbmcgSHVmZm1hbiBjb2RlICMxLiBcW1NlZQorW25leHQgc2VjdGlvbl0oI2RlY29kaW5nLXRoZS1jb2RlLWxlbmd0aHMpIGZvciBkZXRhaWxzIG9uIGRlY29kaW5nIHRoZSBIdWZmbWFuCitjb2RlIGxlbmd0aHNcXS4gTm90ZSB0aGF0IFMgaXMgYW55IGludGVnZXIgaW4gdGhlIHJhbmdlIGAwYCB0bworYCgyNTYgKyAyNCArIGAgW2Bjb2xvcl9jYWNoZV9zaXplYF0oI2NvbG9yLWNhY2hlLWNvZGUpYC0gMSlgLgorCitUaGUgaW50ZXJwcmV0YXRpb24gb2YgUyBkZXBlbmRzIG9uIGl0cyB2YWx1ZToKKworICAxLiBpZiBTIDwgMjU2CisgICAgIDEuIFVzZSBTIGFzIHRoZSBncmVlbiBjb21wb25lbnQKKyAgICAgMS4gUmVhZCByZWQgZnJvbSB0aGUgYml0c3RyZWFtIHVzaW5nIEh1ZmZtYW4gY29kZSAjMgorICAgICAxLiBSZWFkIGJsdWUgZnJvbSB0aGUgYml0c3RyZWFtIHVzaW5nIEh1ZmZtYW4gY29kZSAjMworICAgICAxLiBSZWFkIGFscGhhIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzQKKyAgMS4gaWYgUyA8IDI1NiArIDI0CisgICAgIDEuIFVzZSBTIC0gMjU2IGFzIGEgbGVuZ3RoIHByZWZpeCBjb2RlCisgICAgIDEuIFJlYWQgZXh0cmEgYml0cyBmb3IgbGVuZ3RoIGZyb20gdGhlIGJpdHN0cmVhbQorICAgICAxLiBEZXRlcm1pbmUgYmFja3dhcmQtcmVmZXJlbmNlIGxlbmd0aCBMIGZyb20gbGVuZ3RoIHByZWZpeCBjb2RlIGFuZCB0aGUKKyAgICAgICAgZXh0cmEgYml0cyByZWFkLgorICAgICAxLiBSZWFkIGRpc3RhbmNlIHByZWZpeCBjb2RlIGZyb20gdGhlIGJpdHN0cmVhbSB1c2luZyBIdWZmbWFuIGNvZGUgIzUKKyAgICAgMS4gUmVhZCBleHRyYSBiaXRzIGZvciBkaXN0YW5jZSBmcm9tIHRoZSBiaXRzdHJlYW0KKyAgICAgMS4gRGV0ZXJtaW5lIGJhY2t3YXJkLXJlZmVyZW5jZSBkaXN0YW5jZSBEIGZyb20gZGlzdGFuY2UgcHJlZml4IGNvZGUgYW5kCisgICAgICAgIHRoZSBleHRyYSBiaXRzIHJlYWQuCisgICAgIDEuIENvcHkgdGhlIEwgcGl4ZWxzIChpbiBzY2FuLWxpbmUgb3JkZXIpIGZyb20gdGhlIHNlcXVlbmNlIG9mIHBpeGVscworICAgICAgICBwcmlvciB0byB0aGVtIGJ5IEQgcGl4ZWxzLgorICAxLiBpZiBTID49IDI1NiArIDI0CisgICAgIDEuIFVzZSBTIC0gKDI1NiArIDI0KSBhcyB0aGUgaW5kZXggaW50byB0aGUgY29sb3IgY2FjaGUuCisgICAgIDEuIEdldCBBUkdCIGNvbG9yIGZyb20gdGhlIGNvbG9yIGNhY2hlIGF0IHRoYXQgaW5kZXguCisKKworKipEZWNvZGluZyB0aGUgQ29kZSBMZW5ndGhzOioqCit7OiNkZWNvZGluZy10aGUtY29kZS1sZW5ndGhzfQorCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBkZXRhaWxzIGFib3V0IHJlYWRpbmcgYSBzeW1ib2wgZnJvbSB0aGUgYml0c3RyZWFtIGJ5CitkZWNvZGluZyB0aGUgSHVmZm1hbiBjb2RlIGxlbmd0aC4KKworVGhlIEh1ZmZtYW4gY29kZSBsZW5ndGhzIGNhbiBiZSBjb2RlZCBpbiB0d28gd2F5cy4gVGhlIG1ldGhvZCB1c2VkIGlzIHNwZWNpZmllZAorYnkgYSAxLWJpdCB2YWx1ZS4KKworICAqIElmIHRoaXMgYml0IGlzIDEsIGl0IGlzIGEgX3NpbXBsZSBjb2RlIGxlbmd0aCBjb2RlXywgYW5kCisgICogSWYgdGhpcyBiaXQgaXMgMCwgaXQgaXMgYSBfbm9ybWFsIGNvZGUgbGVuZ3RoIGNvZGVfLgorCisqKihpKSBTaW1wbGUgQ29kZSBMZW5ndGggQ29kZToqKgorCitUaGlzIHZhcmlhbnQgaXMgdXNlZCBpbiB0aGUgc3BlY2lhbCBjYXNlIHdoZW4gb25seSAxIG9yIDIgSHVmZm1hbiBjb2RlIGxlbmd0aHMKK2FyZSBub24temVybywgYW5kIGFyZSBpbiB0aGUgcmFuZ2Ugb2YgXFswLCAyNTVcXS4gQWxsIG90aGVyIEh1ZmZtYW4gY29kZSBsZW5ndGhzCithcmUgaW1wbGljaXRseSB6ZXJvcy4KKworVGhlIGZpcnN0IGJpdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBub24temVybyBjb2RlIGxlbmd0aHM6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgoraW50IG51bV9jb2RlX2xlbmd0aHMgPSBSZWFkQml0cygxKSArIDE7Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworVGhlIGZpcnN0IGNvZGUgbGVuZ3RoIGlzIHN0b3JlZCBlaXRoZXIgdXNpbmcgYSAxLWJpdCBjb2RlIGZvciB2YWx1ZXMgb2YgMCBhbmQgMSwKK29yIHVzaW5nIGFuIDgtYml0IGNvZGUgZm9yIHZhbHVlcyBpbiByYW5nZSBcWzAsIDI1NVxdLiBUaGUgc2Vjb25kIGNvZGUgbGVuZ3RoLAord2hlbiBwcmVzZW50LCBpcyBjb2RlZCBhcyBhbiA4LWJpdCBjb2RlLgorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KK2ludCBpc19maXJzdF84Yml0cyA9IFJlYWRCaXRzKDEpOworY29kZV9sZW5ndGhzWzBdID0gUmVhZEJpdHMoMSArIDcgKiBpc19maXJzdF84Yml0cyk7CitpZiAobnVtX2NvZGVfbGVuZ3RocyA9PSAyKSB7CisgIGNvZGVfbGVuZ3Roc1sxXSA9IFJlYWRCaXRzKDgpOworfQorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKyoqTm90ZToqKiBBbm90aGVyIHNwZWNpYWwgY2FzZSBpcyB3aGVuIF9hbGxfIEh1ZmZtYW4gY29kZSBsZW5ndGhzIGFyZSBfemVyb3NfCisoYW4gZW1wdHkgSHVmZm1hbiBjb2RlKS4gRm9yIGV4YW1wbGUsIGEgSHVmZm1hbiBjb2RlIGZvciBkaXN0YW5jZSBjYW4gYmUgZW1wdHkKK2lmIHRoZXJlIGFyZSBubyBiYWNrd2FyZCByZWZlcmVuY2VzLiBTaW1pbGFybHksIEh1ZmZtYW4gY29kZXMgZm9yIGFscGhhLCByZWQsCithbmQgYmx1ZSBjYW4gYmUgZW1wdHkgaWYgYWxsIHBpeGVscyB3aXRoaW4gdGhlIHNhbWUgbWV0YSBIdWZmbWFuIGNvZGUgYXJlCitwcm9kdWNlZCB1c2luZyB0aGUgY29sb3IgY2FjaGUuIEhvd2V2ZXIsIHRoaXMgY2FzZSBkb2Vzbid0IG5lZWQgYSBzcGVjaWFsCitoYW5kbGluZywgYXMgZW1wdHkgSHVmZm1hbiBjb2RlcyBjYW4gYmUgY29kZWQgYXMgdGhvc2UgY29udGFpbmluZyBhIHNpbmdsZQorc3ltYm9sIGAwYC4KKworKiooaWkpIE5vcm1hbCBDb2RlIExlbmd0aCBDb2RlOioqCisKK1RoZSBjb2RlIGxlbmd0aHMgb2YgYSBIdWZmbWFuIGNvZGUgYXJlIHJlYWQgYXMgZm9sbG93czogYG51bV9jb2RlX2xlbmd0aHNgCitzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb2RlIGxlbmd0aHM7IHRoZSByZXN0IG9mIHRoZSBjb2RlIGxlbmd0aHMKKyhhY2NvcmRpbmcgdG8gdGhlIG9yZGVyIGluIGBrQ29kZUxlbmd0aENvZGVPcmRlcmApIGFyZSB6ZXJvcy4KKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CitpbnQga0NvZGVMZW5ndGhDb2RlcyA9IDE5OworaW50IGtDb2RlTGVuZ3RoQ29kZU9yZGVyW2tDb2RlTGVuZ3RoQ29kZXNdID0geworICAxNywgMTgsIDAsIDEsIDIsIDMsIDQsIDUsIDE2LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1Cit9OworaW50IGNvZGVfbGVuZ3Roc1trQ29kZUxlbmd0aENvZGVzXSA9IHsgMCB9OyAgLy8gQWxsIHplcm9zLgoraW50IG51bV9jb2RlX2xlbmd0aHMgPSA0ICsgUmVhZEJpdHMoNCk7Citmb3IgKGkgPSAwOyBpIDwgbnVtX2NvZGVfbGVuZ3RoczsgKytpKSB7CisgIGNvZGVfbGVuZ3Roc1trQ29kZUxlbmd0aENvZGVPcmRlcltpXV0gPSBSZWFkQml0cygzKTsKK30KK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCisgICogQ29kZSBsZW5ndGggY29kZSBcWzAuLjE1XF0gaW5kaWNhdGVzIGxpdGVyYWwgY29kZSBsZW5ndGhzLgorICAgICogVmFsdWUgMCBtZWFucyBubyBzeW1ib2xzIGhhdmUgYmVlbiBjb2RlZC4KKyAgICAqIFZhbHVlcyBcWzEuLjE1XF0gaW5kaWNhdGUgdGhlIGJpdCBsZW5ndGggb2YgdGhlIHJlc3BlY3RpdmUgY29kZS4KKyAgKiBDb2RlIDE2IHJlcGVhdHMgdGhlIHByZXZpb3VzIG5vbi16ZXJvIHZhbHVlIFxbMy4uNlxdIHRpbWVzLCBpLmUuLAorICAgIDMgKyBgUmVhZEJpdHMoMilgIHRpbWVzLiAgSWYgY29kZSAxNiBpcyB1c2VkIGJlZm9yZSBhIG5vbi16ZXJvCisgICAgdmFsdWUgaGFzIGJlZW4gZW1pdHRlZCwgYSB2YWx1ZSBvZiA4IGlzIHJlcGVhdGVkLgorICAqIENvZGUgMTcgZW1pdHMgYSBzdHJlYWsgb2YgemVyb3MgXFszLi4xMFxdLCBpLmUuLCAzICsgYFJlYWRCaXRzKDMpYAorICAgIHRpbWVzLgorICAqIENvZGUgMTggZW1pdHMgYSBzdHJlYWsgb2YgemVyb3Mgb2YgbGVuZ3RoIFxbMTEuLjEzOFxdLCBpLmUuLAorICAgIDExICsgYFJlYWRCaXRzKDcpYCB0aW1lcy4KKworCis2IE92ZXJhbGwgU3RydWN0dXJlIG9mIHRoZSBGb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitCZWxvdyBpcyBhIHZpZXcgaW50byB0aGUgZm9ybWF0IGluIEJhY2t1cy1OYXVyIGZvcm0uIEl0IGRvZXMgbm90IGNvdmVyCithbGwgZGV0YWlscy4gRW5kLW9mLWltYWdlIChFT0kpIGlzIG9ubHkgaW1wbGljaXRseSBjb2RlZCBpbnRvIHRoZSBudW1iZXIKK29mIHBpeGVscyAoeHNpemUgKiB5c2l6ZSkuCisKKworIyMjIyBCYXNpYyBTdHJ1Y3R1cmUKKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Cis8Zm9ybWF0PiA6Oj0gPFJJRkYgaGVhZGVyPjxpbWFnZSBzaXplPjxpbWFnZSBzdHJlYW0+Cis8aW1hZ2Ugc3RyZWFtPiA6Oj0gPG9wdGlvbmFsLXRyYW5zZm9ybT48c3BhdGlhbGx5LWNvZGVkIGltYWdlPgorfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisKKworIyMjIyBTdHJ1Y3R1cmUgb2YgVHJhbnNmb3JtcworCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKzxvcHRpb25hbC10cmFuc2Zvcm0+IDo6PSAoMS1iaXQgdmFsdWUgMTsgPHRyYW5zZm9ybT4gPG9wdGlvbmFsLXRyYW5zZm9ybT4pIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAxLWJpdCB2YWx1ZSAwCis8dHJhbnNmb3JtPiA6Oj0gPHByZWRpY3Rvci10eD4gfCA8Y29sb3ItdHg+IHwgPHN1YnRyYWN0LWdyZWVuLXR4PiB8CisgICAgICAgICAgICAgICAgPGNvbG9yLWluZGV4aW5nLXR4PgorPHByZWRpY3Rvci10eD4gOjo9IDItYml0IHZhbHVlIDA7IDxwcmVkaWN0b3IgaW1hZ2U+Cis8cHJlZGljdG9yIGltYWdlPiA6Oj0gMy1iaXQgc3ViLXBpeGVsIGNvZGUgOyA8ZW50cm9weS1jb2RlZCBpbWFnZT4KKzxjb2xvci10eD4gOjo9IDItYml0IHZhbHVlIDE7IDxjb2xvciBpbWFnZT4KKzxjb2xvciBpbWFnZT4gOjo9IDMtYml0IHN1Yi1waXhlbCBjb2RlIDsgPGVudHJvcHktY29kZWQgaW1hZ2U+Cis8c3VidHJhY3QtZ3JlZW4tdHg+IDo6PSAyLWJpdCB2YWx1ZSAyCis8Y29sb3ItaW5kZXhpbmctdHg+IDo6PSAyLWJpdCB2YWx1ZSAzOyA8Y29sb3ItaW5kZXhpbmcgaW1hZ2U+Cis8Y29sb3ItaW5kZXhpbmcgaW1hZ2U+IDo6PSA4LWJpdCBjb2xvciBjb3VudDsgPGVudHJvcHktY29kZWQgaW1hZ2U+Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworCisjIyMjIFN0cnVjdHVyZSBvZiB0aGUgSW1hZ2UgRGF0YQorCit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKzxzcGF0aWFsbHktY29kZWQgaW1hZ2U+IDo6PSA8bWV0YSBodWZmbWFuPjxlbnRyb3B5LWNvZGVkIGltYWdlPgorPGVudHJvcHktY29kZWQgaW1hZ2U+IDo6PSA8Y29sb3IgY2FjaGUgaW5mbz48aHVmZm1hbiBjb2Rlcz48bHo3Ny1jb2RlZCBpbWFnZT4KKzxtZXRhIGh1ZmZtYW4+IDo6PSAxLWJpdCB2YWx1ZSAwIHwKKyAgICAgICAgICAgICAgICAgICAoMS1iaXQgdmFsdWUgMTsgPGVudHJvcHkgaW1hZ2U+KQorPGVudHJvcHkgaW1hZ2U+IDo6PSAzLWJpdCBzdWJzYW1wbGUgdmFsdWU7IDxlbnRyb3B5LWNvZGVkIGltYWdlPgorPGNvbG9yIGNhY2hlIGluZm8+IDo6PSAxIGJpdCB2YWx1ZSAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgKDEtYml0IHZhbHVlIDE7IDQtYml0IHZhbHVlIGZvciBjb2xvciBjYWNoZSBzaXplKQorPGh1ZmZtYW4gY29kZXM+IDo6PSA8aHVmZm1hbiBjb2RlIGdyb3VwPiB8IDxodWZmbWFuIGNvZGUgZ3JvdXA+PGh1ZmZtYW4gY29kZXM+Cis8aHVmZm1hbiBjb2RlIGdyb3VwPiA6Oj0gPGh1ZmZtYW4gY29kZT48aHVmZm1hbiBjb2RlPjxodWZmbWFuIGNvZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgPGh1ZmZtYW4gY29kZT48aHVmZm1hbiBjb2RlPgorICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSAiSW50ZXJwcmV0YXRpb24gb2YgTWV0YSBIdWZmbWFuIGNvZGVzIiB0bworICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVyc3RhbmQgd2hhdCBlYWNoIG9mIHRoZXNlIGZpdmUgSHVmZm1hbiBjb2RlcyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IuCis8aHVmZm1hbiBjb2RlPiA6Oj0gPHNpbXBsZSBodWZmbWFuIGNvZGU+IHwgPG5vcm1hbCBodWZmbWFuIGNvZGU+Cis8c2ltcGxlIGh1ZmZtYW4gY29kZT4gOjo9IHNlZSAiU2ltcGxlIGNvZGUgbGVuZ3RoIGNvZGUiIGZvciBkZXRhaWxzCis8bm9ybWFsIGh1ZmZtYW4gY29kZT4gOjo9IDxjb2RlIGxlbmd0aCBjb2RlPjsgZW5jb2RlZCBjb2RlIGxlbmd0aHMKKzxjb2RlIGxlbmd0aCBjb2RlPiA6Oj0gc2VlIHNlY3Rpb24gIk5vcm1hbCBjb2RlIGxlbmd0aCBjb2RlIgorPGx6NzctY29kZWQgaW1hZ2U+IDo6PSAoKDxhcmdiLXBpeGVsPiB8IDxsejc3LWNvcHk+IHwgPGNvbG9yLWNhY2hlLWNvZGU+KQorICAgICAgICAgICAgICAgICAgICAgICA8bHo3Ny1jb2RlZCBpbWFnZT4pIHwgIiIKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorCitBIHBvc3NpYmxlIGV4YW1wbGUgc2VxdWVuY2U6CisKK35+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgorPFJJRkYgaGVhZGVyPjxpbWFnZSBzaXplPjEtYml0IHZhbHVlIDE8c3VidHJhY3QtZ3JlZW4tdHg+CisxLWJpdCB2YWx1ZSAxPHByZWRpY3Rvci10eD4xLWJpdCB2YWx1ZSAwPG1ldGEgaHVmZm1hbj4KKzxjb2xvciBjYWNoZSBpbmZvPjxodWZmbWFuIGNvZGVzPgorPGx6NzctY29kZWQgaW1hZ2U+Cit+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKworW2Nhbm9uaWNhbF9odWZmXTogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYW5vbmljYWxfSHVmZm1hbl9jb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvY3B1LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvY3B1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTkwMWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2NwdS5jCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIENQVSBkZXRlY3Rpb24KLS8vCi0vLyBBdXRob3I6IENocmlzdGlhbiBEdXZpdmllciAoY2R1dml2aWVyQGdvb2dsZS5jb20pCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNpbmNsdWRlIDxjcHUtZmVhdHVyZXMuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNTRTIgZGV0ZWN0aW9uLgotLy8KLQotLy8gYXBwbGUvZGFyd2luIGdjYy00LjAuMSBkZWZpbmVzIF9fUElDX18sIGJ1dCBub3QgX19waWNfXyB3aXRoIC1mUElDLgotI2lmIChkZWZpbmVkKF9fcGljX18pIHx8IGRlZmluZWQoX19QSUNfXykpICYmIGRlZmluZWQoX19pMzg2X18pCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgewotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAibW92ICUlZWJ4LCAlJWVkaVxuIgotICAgICJjcHVpZFxuIgotICAgICJ4Y2hnICUlZWRpLCAlJWVieFxuIgotICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9RCIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwgIj1kIihjcHVfaW5mb1szXSkKLSAgICA6ICJhIihpbmZvX3R5cGUpKTsKLX0KLSNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldENQVUluZm8oaW50IGNwdV9pbmZvWzRdLCBpbnQgaW5mb190eXBlKSB7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJjcHVpZFxuIgotICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9YiIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwgIj1kIihjcHVfaW5mb1szXSkKLSAgICA6ICJhIihpbmZvX3R5cGUpKTsKLX0KLSNlbGlmIGRlZmluZWQoV0VCUF9NU0NfU1NFMikKLSNkZWZpbmUgR2V0Q1BVSW5mbyBfX2NwdWlkCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChXRUJQX01TQ19TU0UyKQotc3RhdGljIGludCB4ODZDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgewotICBpbnQgY3B1X2luZm9bNF07Ci0gIEdldENQVUluZm8oY3B1X2luZm8sIDEpOwotICBpZiAoZmVhdHVyZSA9PSBrU1NFMikgewotICAgIHJldHVybiAwICE9IChjcHVfaW5mb1szXSAmIDB4MDQwMDAwMDApOwotICB9Ci0gIGlmIChmZWF0dXJlID09IGtTU0UzKSB7Ci0gICAgcmV0dXJuIDAgIT0gKGNwdV9pbmZvWzJdICYgMHgwMDAwMDAwMSk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci1WUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSB4ODZDUFVJbmZvOwotI2VsaWYgZGVmaW5lZChXRUJQX0FORFJPSURfTkVPTikKLXN0YXRpYyBpbnQgQW5kcm9pZENQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7Ci0gIGNvbnN0IEFuZHJvaWRDcHVGYW1pbHkgY3B1X2ZhbWlseSA9IGFuZHJvaWRfZ2V0Q3B1RmFtaWx5KCk7Ci0gIGNvbnN0IHVpbnQ2NF90IGNwdV9mZWF0dXJlcyA9IGFuZHJvaWRfZ2V0Q3B1RmVhdHVyZXMoKTsKLSAgaWYgKGZlYXR1cmUgPT0ga05FT04pIHsKLSAgICByZXR1cm4gKGNwdV9mYW1pbHkgPT0gQU5EUk9JRF9DUFVfRkFNSUxZX0FSTSAmJgotICAgICAgICAgICAgMCAhPSAoY3B1X2ZlYXR1cmVzICYgQU5EUk9JRF9DUFVfQVJNX0ZFQVRVUkVfTkVPTikpOwotICB9Ci0gIHJldHVybiAwOwotfQotVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gQW5kcm9pZENQVUluZm87Ci0jZWxpZiBkZWZpbmVkKF9fQVJNX05FT05fXykKLS8vIGRlZmluZSBhIGR1bW15IGZ1bmN0aW9uIHRvIGVuYWJsZSB0dXJuaW5nIG9mZiBORU9OIGF0IHJ1bnRpbWUgYnkgc2V0dGluZwotLy8gVlA4RGVjR2V0Q1BVSW5mbyA9IE5VTEwKLXN0YXRpYyBpbnQgYXJtQ1BVSW5mbyhDUFVGZWF0dXJlIGZlYXR1cmUpIHsKLSAgKHZvaWQpZmVhdHVyZTsKLSAgcmV0dXJuIDE7Ci19Ci1WUDhDUFVJbmZvIFZQOEdldENQVUluZm8gPSBhcm1DUFVJbmZvOwotI2Vsc2UKLVZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IE5VTEw7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMzJlZTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlYy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzQzICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBTcGVlZC1jcml0aWNhbCBkZWNvZGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0jaW5jbHVkZSAiLi4vZGVjL3ZwOGkuaCIKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHJ1bi10aW1lIHRhYmxlcyAofjRrKQotCi1zdGF0aWMgdWludDhfdCBhYnMwWzI1NSArIDI1NSArIDFdOyAgICAgLy8gYWJzKGkpCi1zdGF0aWMgdWludDhfdCBhYnMxWzI1NSArIDI1NSArIDFdOyAgICAgLy8gYWJzKGkpPj4xCi1zdGF0aWMgaW50OF90IHNjbGlwMVsxMDIwICsgMTAyMCArIDFdOyAgLy8gY2xpcHMgWy0xMDIwLCAxMDIwXSB0byBbLTEyOCwgMTI3XQotc3RhdGljIGludDhfdCBzY2xpcDJbMTEyICsgMTEyICsgMV07ICAgIC8vIGNsaXBzIFstMTEyLCAxMTJdIHRvIFstMTYsIDE1XQotc3RhdGljIHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTEwICsgMV07ICAgIC8vIGNsaXBzIFstMjU1LDUxMF0gdG8gWzAsMjU1XQotCi0vLyBXZSBkZWNsYXJlIHRoaXMgdmFyaWFibGUgJ3ZvbGF0aWxlJyB0byBwcmV2ZW50IGluc3RydWN0aW9uIHJlb3JkZXJpbmcKLS8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQotc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOwotCi1zdGF0aWMgdm9pZCBEc3BJbml0VGFibGVzKHZvaWQpIHsKLSAgaWYgKCF0YWJsZXNfb2spIHsKLSAgICBpbnQgaTsKLSAgICBmb3IgKGkgPSAtMjU1OyBpIDw9IDI1NTsgKytpKSB7Ci0gICAgICBhYnMwWzI1NSArIGldID0gKGkgPCAwKSA/IC1pIDogaTsKLSAgICAgIGFiczFbMjU1ICsgaV0gPSBhYnMwWzI1NSArIGldID4+IDE7Ci0gICAgfQotICAgIGZvciAoaSA9IC0xMDIwOyBpIDw9IDEwMjA7ICsraSkgewotICAgICAgc2NsaXAxWzEwMjAgKyBpXSA9IChpIDwgLTEyOCkgPyAtMTI4IDogKGkgPiAxMjcpID8gMTI3IDogaTsKLSAgICB9Ci0gICAgZm9yIChpID0gLTExMjsgaSA8PSAxMTI7ICsraSkgewotICAgICAgc2NsaXAyWzExMiArIGldID0gKGkgPCAtMTYpID8gLTE2IDogKGkgPiAxNSkgPyAxNSA6IGk7Ci0gICAgfQotICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKLSAgICAgIGNsaXAxWzI1NSArIGldID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiBpOwotICAgIH0KLSAgICB0YWJsZXNfb2sgPSAxOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGNsaXBfOGIoaW50IHYpIHsKLSAgcmV0dXJuICghKHYgJiB+MHhmZikpID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCi0KLSNkZWZpbmUgU1RPUkUoeCwgeSwgdikgXAotICBkc3RbeCArIHkgKiBCUFNdID0gY2xpcF84Yihkc3RbeCArIHkgKiBCUFNdICsgKCh2KSA+PiAzKSkKLQotc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKLXN0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7Ci0jZGVmaW5lIE1VTChhLCBiKSAoKChhKSAqIChiKSkgPj4gMTYpCi0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZShjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7Ci0gIGludCBDWzQgKiA0XSwgKnRtcDsKLSAgaW50IGk7Ci0gIHRtcCA9IEM7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gdmVydGljYWwgcGFzcwotICAgIGNvbnN0IGludCBhID0gaW5bMF0gKyBpbls4XTsgICAgLy8gWy00MDk2LCA0MDk0XQotICAgIGNvbnN0IGludCBiID0gaW5bMF0gLSBpbls4XTsgICAgLy8gWy00MDk1LCA0MDk1XQotICAgIGNvbnN0IGludCBjID0gTVVMKGluWzRdLCBrQzIpIC0gTVVMKGluWzEyXSwga0MxKTsgICAvLyBbLTM3ODMsIDM3ODNdCi0gICAgY29uc3QgaW50IGQgPSBNVUwoaW5bNF0sIGtDMSkgKyBNVUwoaW5bMTJdLCBrQzIpOyAgIC8vIFstMzc4NSwgMzc4MV0KLSAgICB0bXBbMF0gPSBhICsgZDsgICAvLyBbLTc4ODEsIDc4NzVdCi0gICAgdG1wWzFdID0gYiArIGM7ICAgLy8gWy03ODc4LCA3ODc4XQotICAgIHRtcFsyXSA9IGIgLSBjOyAgIC8vIFstNzg3OCwgNzg3OF0KLSAgICB0bXBbM10gPSBhIC0gZDsgICAvLyBbLTc4NzcsIDc4NzldCi0gICAgdG1wICs9IDQ7Ci0gICAgaW4rKzsKLSAgfQotICAvLyBFYWNoIHBhc3MgaXMgZXhwYW5kaW5nIHRoZSBkeW5hbWljIHJhbmdlIGJ5IH4zLjg1ICh1cHBlciBib3VuZCkuCi0gIC8vIFRoZSBleGFjdCB2YWx1ZSBpcyAoMi4gKyAoa0MxICsga0MyKSAvIDY1NTM2KS4KLSAgLy8gQWZ0ZXIgdGhlIHNlY29uZCBwYXNzLCBtYXhpbXVtIGludGVydmFsIGlzIFstMzc5NCwgMzc5NF0sIGFzc3VtaW5nCi0gIC8vIGFuIGlucHV0IGluIFstMjA0OCwgMjA0N10gaW50ZXJ2YWwuIFdlIHRoZW4gbmVlZCB0byBhZGQgYSBkc3QgdmFsdWUKLSAgLy8gaW4gdGhlIFswLCAyNTVdIHJhbmdlLgotICAvLyBJbiB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbywgdGhlIGlucHV0IHRvIGNsaXBfOGIoKSBjYW4gYmUgYXMgbGFyZ2UgYXMKLSAgLy8gWy02MDcxMywgNjA5NjhdLgotICB0bXAgPSBDOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7ICAgIC8vIGhvcml6b250YWwgcGFzcwotICAgIGNvbnN0IGludCBkYyA9IHRtcFswXSArIDQ7Ci0gICAgY29uc3QgaW50IGEgPSAgZGMgKyAgdG1wWzhdOwotICAgIGNvbnN0IGludCBiID0gIGRjIC0gIHRtcFs4XTsKLSAgICBjb25zdCBpbnQgYyA9IE1VTCh0bXBbNF0sIGtDMikgLSBNVUwodG1wWzEyXSwga0MxKTsKLSAgICBjb25zdCBpbnQgZCA9IE1VTCh0bXBbNF0sIGtDMSkgKyBNVUwodG1wWzEyXSwga0MyKTsKLSAgICBTVE9SRSgwLCAwLCBhICsgZCk7Ci0gICAgU1RPUkUoMSwgMCwgYiArIGMpOwotICAgIFNUT1JFKDIsIDAsIGIgLSBjKTsKLSAgICBTVE9SRSgzLCAwLCBhIC0gZCk7Ci0gICAgdG1wKys7Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotI3VuZGVmIE1VTAotCi1zdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud28oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgewotICBUcmFuc2Zvcm1PbmUoaW4sIGRzdCk7Ci0gIGlmIChkb190d28pIHsKLSAgICBUcmFuc2Zvcm1PbmUoaW4gKyAxNiwgZHN0ICsgNCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtVVYoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBWUDhUcmFuc2Zvcm0oaW4gKyAwICogMTYsIGRzdCwgMSk7Ci0gIFZQOFRyYW5zZm9ybShpbiArIDIgKiAxNiwgZHN0ICsgNCAqIEJQUywgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybURDKGNvbnN0IGludDE2X3QgKmluLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgaW50IERDID0gaW5bMF0gKyA0OwotICBpbnQgaSwgajsKLSAgZm9yIChqID0gMDsgaiA8IDQ7ICsraikgewotICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgIFNUT1JFKGksIGosIERDKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtRENVVihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7Ci0gIGlmIChpblswICogMTZdKSBUcmFuc2Zvcm1EQyhpbiArIDAgKiAxNiwgZHN0KTsKLSAgaWYgKGluWzEgKiAxNl0pIFRyYW5zZm9ybURDKGluICsgMSAqIDE2LCBkc3QgKyA0KTsKLSAgaWYgKGluWzIgKiAxNl0pIFRyYW5zZm9ybURDKGluICsgMiAqIDE2LCBkc3QgKyA0ICogQlBTKTsKLSAgaWYgKGluWzMgKiAxNl0pIFRyYW5zZm9ybURDKGluICsgMyAqIDE2LCBkc3QgKyA0ICogQlBTICsgNCk7Ci19Ci0KLSN1bmRlZiBTVE9SRQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGFyYWdyYXBoIDE0LjMKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50IHRtcFsxNl07Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGEwID0gaW5bMCArIGldICsgaW5bMTIgKyBpXTsKLSAgICBjb25zdCBpbnQgYTEgPSBpbls0ICsgaV0gKyBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMiA9IGluWzQgKyBpXSAtIGluWyA4ICsgaV07Ci0gICAgY29uc3QgaW50IGEzID0gaW5bMCArIGldIC0gaW5bMTIgKyBpXTsKLSAgICB0bXBbMCAgKyBpXSA9IGEwICsgYTE7Ci0gICAgdG1wWzggICsgaV0gPSBhMCAtIGExOwotICAgIHRtcFs0ICArIGldID0gYTMgKyBhMjsKLSAgICB0bXBbMTIgKyBpXSA9IGEzIC0gYTI7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBkYyA9IHRtcFswICsgaSAqIDRdICsgMzsgICAgLy8gdy8gcm91bmRlcgotICAgIGNvbnN0IGludCBhMCA9IGRjICAgICAgICAgICAgICsgdG1wWzMgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGExID0gdG1wWzEgKyBpICogNF0gKyB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTIgPSB0bXBbMSArIGkgKiA0XSAtIHRtcFsyICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMyA9IGRjICAgICAgICAgICAgIC0gdG1wWzMgKyBpICogNF07Ci0gICAgb3V0WyAwXSA9IChhMCArIGExKSA+PiAzOwotICAgIG91dFsxNl0gPSAoYTMgKyBhMikgPj4gMzsKLSAgICBvdXRbMzJdID0gKGEwIC0gYTEpID4+IDM7Ci0gICAgb3V0WzQ4XSA9IChhMyAtIGEyKSA+PiAzOwotICAgIG91dCArPSA2NDsKLSAgfQotfQotCi12b2lkICgqVlA4VHJhbnNmb3JtV0hUKShjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSA9IFRyYW5zZm9ybVdIVDsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEludHJhIHByZWRpY3Rpb25zCi0KLSNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24odWludDhfdCAqZHN0LCBpbnQgc2l6ZSkgewotICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAwID0gY2xpcDEgKyAyNTUgLSB0b3BbLTFdOwotICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAgPSBjbGlwMCArIGRzdFstMV07Ci0gICAgaW50IHg7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHNpemU7ICsreCkgewotICAgICAgZHN0W3hdID0gY2xpcFt0b3BbeF1dOwotICAgIH0KLSAgICBkc3QgKz0gQlBTOwotICB9Ci19Ci1zdGF0aWMgdm9pZCBUTTQodWludDhfdCAqZHN0KSAgIHsgVHJ1ZU1vdGlvbihkc3QsIDQpOyB9Ci1zdGF0aWMgdm9pZCBUTTh1dih1aW50OF90ICpkc3QpIHsgVHJ1ZU1vdGlvbihkc3QsIDgpOyB9Ci1zdGF0aWMgdm9pZCBUTTE2KHVpbnQ4X3QgKmRzdCkgIHsgVHJ1ZU1vdGlvbihkc3QsIDE2KTsgfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gMTZ4MTYKLQotc3RhdGljIHZvaWQgVkUxNih1aW50OF90ICpkc3QpIHsgICAgIC8vIHZlcnRpY2FsCi0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgIFNiTWVtb3J5Q29weShkc3QgKyBqICogQlBTLCBkc3QgLSBCUFMsIDE2KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIRTE2KHVpbnQ4X3QgKmRzdCkgeyAgICAgLy8gaG9yaXpvbnRhbAotICBpbnQgajsKLSAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKLSAgICBTYk1lbW9yeVNldChkc3QsIGRzdFstMV0sIDE2KTsKLSAgICBkc3QgKz0gQlBTOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dDE2KGludCB2LCB1aW50OF90KiBkc3QpIHsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7Ci0gICAgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgdiwgMTYpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIERDMTYodWludDhfdCAqZHN0KSB7ICAgIC8vIERDCi0gIGludCBEQyA9IDE2OwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKLSAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXSArIGRzdFtqIC0gQlBTXTsKLSAgfQotICBQdXQxNihEQyA+PiA1LCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzE2Tm9Ub3AodWludDhfdCAqZHN0KSB7ICAgLy8gREMgd2l0aCB0b3Agc2FtcGxlcyBub3QgYXZhaWxhYmxlCi0gIGludCBEQyA9IDg7Ci0gIGludCBqOwotICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgewotICAgIERDICs9IGRzdFstMSArIGogKiBCUFNdOwotICB9Ci0gIFB1dDE2KERDID4+IDQsIGRzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERDMTZOb0xlZnQodWludDhfdCAqZHN0KSB7ICAvLyBEQyB3aXRoIGxlZnQgc2FtcGxlcyBub3QgYXZhaWxhYmxlCi0gIGludCBEQyA9IDg7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIERDICs9IGRzdFtpIC0gQlBTXTsKLSAgfQotICBQdXQxNihEQyA+PiA0LCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzE2Tm9Ub3BMZWZ0KHVpbnQ4X3QgKmRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3AgYW5kIGxlZnQgc2FtcGxlcwotICBQdXQxNigweDgwLCBkc3QpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gNHg0Ci0KLSNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQotI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKLQotc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QgKmRzdCkgeyAgICAvLyB2ZXJ0aWNhbAotICBjb25zdCB1aW50OF90KiB0b3AgPSBkc3QgLSBCUFM7Ci0gIGNvbnN0IHVpbnQ4X3QgdmFsc1s0XSA9IHsKLSAgICBBVkczKHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKSwKLSAgICBBVkczKHRvcFsgMF0sIHRvcFsxXSwgdG9wWzJdKSwKLSAgICBBVkczKHRvcFsgMV0sIHRvcFsyXSwgdG9wWzNdKSwKLSAgICBBVkczKHRvcFsgMl0sIHRvcFszXSwgdG9wWzRdKQotICB9OwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIFNiTWVtb3J5Q29weShkc3QgKyBpICogQlBTLCB2YWxzLCBzaXplb2YodmFscykpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEhFNCh1aW50OF90ICpkc3QpIHsgICAgLy8gaG9yaXpvbnRhbAotICBjb25zdCBpbnQgQSA9IGRzdFstMSAtIEJQU107Ci0gIGNvbnN0IGludCBCID0gZHN0Wy0xXTsKLSAgY29uc3QgaW50IEMgPSBkc3RbLTEgKyBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFstMSArIDIgKiBCUFNdOwotICBjb25zdCBpbnQgRSA9IGRzdFstMSArIDMgKiBCUFNdOwotICAqKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoQSwgQiwgQyk7Ci0gICoodWludDMyX3QqKShkc3QgKyAxICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhCLCBDLCBEKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEMsIEQsIEUpOwotICAqKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoRCwgRSwgRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERDNCh1aW50OF90ICpkc3QpIHsgICAvLyBEQwotICB1aW50MzJfdCBkYyA9IDQ7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSBkc3RbaSAtIEJQU10gKyBkc3RbLTEgKyBpICogQlBTXTsKLSAgZGMgPj49IDM7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIFNiTWVtb3J5U2V0KGRzdCArIGkgKiBCUFMsIGRjLCA0KTsKLX0KLQotc3RhdGljIHZvaWQgUkQ0KHVpbnQ4X3QgKmRzdCkgeyAgIC8vIERvd24tcmlnaHQKLSAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKLSAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKLSAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKLSAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKLSAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOwotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgRFNUKDAsIDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhKLCBLLCBMKTsKLSAgRFNUKDAsIDIpID0gRFNUKDEsIDMpICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhJLCBKLCBLKTsKLSAgRFNUKDAsIDEpID0gRFNUKDEsIDIpID0gRFNUKDIsIDMpICAgICAgICAgICAgID0gQVZHMyhYLCBJLCBKKTsKLSAgRFNUKDAsIDApID0gRFNUKDEsIDEpID0gRFNUKDIsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhBLCBYLCBJKTsKLSAgRFNUKDEsIDApID0gRFNUKDIsIDEpID0gRFNUKDMsIDIpICAgICAgICAgICAgID0gQVZHMyhCLCBBLCBYKTsKLSAgRFNUKDIsIDApID0gRFNUKDMsIDEpICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhDLCBCLCBBKTsKLSAgRFNUKDMsIDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVZHMyhELCBDLCBCKTsKLX0KLQotc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QgKmRzdCkgeyAgIC8vIERvd24tTGVmdAotICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKLSAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107Ci0gIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOwotICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKLSAgY29uc3QgaW50IEUgPSBkc3RbNCAtIEJQU107Ci0gIGNvbnN0IGludCBGID0gZHN0WzUgLSBCUFNdOwotICBjb25zdCBpbnQgRyA9IGRzdFs2IC0gQlBTXTsKLSAgY29uc3QgaW50IEggPSBkc3RbNyAtIEJQU107Ci0gIERTVCgwLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7Ci0gIERTVCgxLCAwKSA9IERTVCgwLCAxKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQiwgQywgRCk7Ci0gIERTVCgyLCAwKSA9IERTVCgxLCAxKSA9IERTVCgwLCAyKSAgICAgICAgICAgICA9IEFWRzMoQywgRCwgRSk7Ci0gIERTVCgzLCAwKSA9IERTVCgyLCAxKSA9IERTVCgxLCAyKSA9IERTVCgwLCAzKSA9IEFWRzMoRCwgRSwgRik7Ci0gIERTVCgzLCAxKSA9IERTVCgyLCAyKSA9IERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoRSwgRiwgRyk7Ci0gIERTVCgzLCAyKSA9IERTVCgyLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoRiwgRywgSCk7Ci0gIERTVCgzLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoRywgSCwgSCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFZSNCh1aW50OF90ICpkc3QpIHsgICAvLyBWZXJ0aWNhbC1SaWdodAotICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOwotICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOwotICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOwotICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107Ci0gIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOwotICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKLSAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107Ci0gIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOwotICBEU1QoMCwgMCkgPSBEU1QoMSwgMikgPSBBVkcyKFgsIEEpOwotICBEU1QoMSwgMCkgPSBEU1QoMiwgMikgPSBBVkcyKEEsIEIpOwotICBEU1QoMiwgMCkgPSBEU1QoMywgMikgPSBBVkcyKEIsIEMpOwotICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkcyKEMsIEQpOwotCi0gIERTVCgwLCAzKSA9ICAgICAgICAgICAgIEFWRzMoSywgSiwgSSk7Ci0gIERTVCgwLCAyKSA9ICAgICAgICAgICAgIEFWRzMoSiwgSSwgWCk7Ci0gIERTVCgwLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoSSwgWCwgQSk7Ci0gIERTVCgxLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoWCwgQSwgQik7Ci0gIERTVCgyLCAxKSA9IERTVCgzLCAzKSA9IEFWRzMoQSwgQiwgQyk7Ci0gIERTVCgzLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQiwgQywgRCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFZMNCh1aW50OF90ICpkc3QpIHsgICAvLyBWZXJ0aWNhbC1MZWZ0Ci0gIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOwotICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKLSAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107Ci0gIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOwotICBjb25zdCBpbnQgRSA9IGRzdFs0IC0gQlBTXTsKLSAgY29uc3QgaW50IEYgPSBkc3RbNSAtIEJQU107Ci0gIGNvbnN0IGludCBHID0gZHN0WzYgLSBCUFNdOwotICBjb25zdCBpbnQgSCA9IGRzdFs3IC0gQlBTXTsKLSAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihBLCBCKTsKLSAgRFNUKDEsIDApID0gRFNUKDAsIDIpID0gQVZHMihCLCBDKTsKLSAgRFNUKDIsIDApID0gRFNUKDEsIDIpID0gQVZHMihDLCBEKTsKLSAgRFNUKDMsIDApID0gRFNUKDIsIDIpID0gQVZHMihELCBFKTsKLQotICBEU1QoMCwgMSkgPSAgICAgICAgICAgICBBVkczKEEsIEIsIEMpOwotICBEU1QoMSwgMSkgPSBEU1QoMCwgMykgPSBBVkczKEIsIEMsIEQpOwotICBEU1QoMiwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEMsIEQsIEUpOwotICBEU1QoMywgMSkgPSBEU1QoMiwgMykgPSBBVkczKEQsIEUsIEYpOwotICAgICAgICAgICAgICBEU1QoMywgMikgPSBBVkczKEUsIEYsIEcpOwotICAgICAgICAgICAgICBEU1QoMywgMykgPSBBVkczKEYsIEcsIEgpOwotfQotCi1zdGF0aWMgdm9pZCBIVTQodWludDhfdCAqZHN0KSB7ICAgLy8gSG9yaXpvbnRhbC1VcAotICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOwotICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOwotICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOwotICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOwotICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEksIEopOwotICBEU1QoMiwgMCkgPSBEU1QoMCwgMSkgPSBBVkcyKEosIEspOwotICBEU1QoMiwgMSkgPSBEU1QoMCwgMikgPSBBVkcyKEssIEwpOwotICBEU1QoMSwgMCkgPSAgICAgICAgICAgICBBVkczKEksIEosIEspOwotICBEU1QoMywgMCkgPSBEU1QoMSwgMSkgPSBBVkczKEosIEssIEwpOwotICBEU1QoMywgMSkgPSBEU1QoMSwgMikgPSBBVkczKEssIEwsIEwpOwotICBEU1QoMywgMikgPSBEU1QoMiwgMikgPQotICAgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Ci19Ci0KLXN0YXRpYyB2b2lkIEhENCh1aW50OF90ICpkc3QpIHsgIC8vIEhvcml6b250YWwtRG93bgotICBjb25zdCBpbnQgSSA9IGRzdFstMSArIDAgKiBCUFNdOwotICBjb25zdCBpbnQgSiA9IGRzdFstMSArIDEgKiBCUFNdOwotICBjb25zdCBpbnQgSyA9IGRzdFstMSArIDIgKiBCUFNdOwotICBjb25zdCBpbnQgTCA9IGRzdFstMSArIDMgKiBCUFNdOwotICBjb25zdCBpbnQgWCA9IGRzdFstMSAtIEJQU107Ci0gIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOwotICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKLSAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107Ci0KLSAgRFNUKDAsIDApID0gRFNUKDIsIDEpID0gQVZHMihJLCBYKTsKLSAgRFNUKDAsIDEpID0gRFNUKDIsIDIpID0gQVZHMihKLCBJKTsKLSAgRFNUKDAsIDIpID0gRFNUKDIsIDMpID0gQVZHMihLLCBKKTsKLSAgRFNUKDAsIDMpICAgICAgICAgICAgID0gQVZHMihMLCBLKTsKLQotICBEU1QoMywgMCkgICAgICAgICAgICAgPSBBVkczKEEsIEIsIEMpOwotICBEU1QoMiwgMCkgICAgICAgICAgICAgPSBBVkczKFgsIEEsIEIpOwotICBEU1QoMSwgMCkgPSBEU1QoMywgMSkgPSBBVkczKEksIFgsIEEpOwotICBEU1QoMSwgMSkgPSBEU1QoMywgMikgPSBBVkczKEosIEksIFgpOwotICBEU1QoMSwgMikgPSBEU1QoMywgMykgPSBBVkczKEssIEosIEkpOwotICBEU1QoMSwgMykgICAgICAgICAgICAgPSBBVkczKEwsIEssIEopOwotfQotCi0jdW5kZWYgRFNUCi0jdW5kZWYgQVZHMwotI3VuZGVmIEFWRzIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENocm9tYQotCi1zdGF0aWMgdm9pZCBWRTh1dih1aW50OF90ICpkc3QpIHsgICAgLy8gdmVydGljYWwKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaiAqIEJQUywgZHN0IC0gQlBTLCA4KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIRTh1dih1aW50OF90ICpkc3QpIHsgICAgLy8gaG9yaXpvbnRhbAotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgewotICAgIFNiTWVtb3J5U2V0KGRzdCwgZHN0Wy0xXSwgOCk7Ci0gICAgZHN0ICs9IEJQUzsKLSAgfQotfQotCi0vLyBoZWxwZXIgZm9yIGNocm9tYS1EQyBwcmVkaWN0aW9ucwotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0OHg4dXYodWludDhfdCB2YWx1ZSwgdWludDhfdCogZHN0KSB7Ci0gIGludCBqOwotI2lmbmRlZiBXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTgotICBjb25zdCB1aW50NjRfdCB2ID0gKHVpbnQ2NF90KXZhbHVlICogMHgwMTAxMDEwMTAxMDEwMTAxVUxMOwotICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7Ci0gICAgKih1aW50NjRfdCopKGRzdCArIGogKiBCUFMpID0gdjsKLSAgfQotI2Vsc2UKLSAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgU2JNZW1vcnlTZXQoZHN0ICsgaiAqIEJQUywgdmFsdWUsIDgpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyB2b2lkIERDOHV2KHVpbnQ4X3QgKmRzdCkgeyAgICAgLy8gREMKLSAgaW50IGRjMCA9IDg7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgZGMwICs9IGRzdFtpIC0gQlBTXSArIGRzdFstMSArIGkgKiBCUFNdOwotICB9Ci0gIFB1dDh4OHV2KGRjMCA+PiA0LCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzh1dk5vTGVmdCh1aW50OF90ICpkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcwotICBpbnQgZGMwID0gNDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICBkYzAgKz0gZHN0W2kgLSBCUFNdOwotICB9Ci0gIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOwotfQotCi1zdGF0aWMgdm9pZCBEQzh1dk5vVG9wKHVpbnQ4X3QgKmRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcwotICBpbnQgZGMwID0gNDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKLSAgICBkYzAgKz0gZHN0Wy0xICsgaSAqIEJQU107Ci0gIH0KLSAgUHV0OHg4dXYoZGMwID4+IDMsIGRzdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERDOHV2Tm9Ub3BMZWZ0KHVpbnQ4X3QgKmRzdCkgeyAgICAvLyBEQyB3aXRoIG5vdGhpbmcKLSAgUHV0OHg4dXYoMHg4MCwgZHN0KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGRlZmF1bHQgQyBpbXBsZW1lbnRhdGlvbnMKLQotY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWE0W05VTV9CTU9ERVNdID0gewotICBEQzQsIFRNNCwgVkU0LCBIRTQsIFJENCwgVlI0LCBMRDQsIFZMNCwgSEQ0LCBIVTQKLX07Ci0KLWNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRMdW1hMTZbTlVNX0JfRENfTU9ERVNdID0gewotICBEQzE2LCBUTTE2LCBWRTE2LCBIRTE2LAotICBEQzE2Tm9Ub3AsIERDMTZOb0xlZnQsIERDMTZOb1RvcExlZnQKLX07Ci0KLWNvbnN0IFZQOFByZWRGdW5jIFZQOFByZWRDaHJvbWE4W05VTV9CX0RDX01PREVTXSA9IHsKLSAgREM4dXYsIFRNOHV2LCBWRTh1diwgSEU4dXYsCi0gIERDOHV2Tm9Ub3AsIERDOHV2Tm9MZWZ0LCBEQzh1dk5vVG9wTGVmdAotfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucwotCi0vLyA0IHBpeGVscyBpbiwgMiBwaXhlbHMgb3V0Ci1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXIyKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCkgKyBzY2xpcDFbMTAyMCArIHAxIC0gcTFdOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBwWy1zdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTJdOwotICBwWyAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotfQotCi0vLyA0IHBpeGVscyBpbiwgNCBwaXhlbHMgb3V0Ci1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXI0KHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCk7Ci0gIGNvbnN0IGludCBhMSA9IHNjbGlwMlsxMTIgKyAoKGEgKyA0KSA+PiAzKV07Ci0gIGNvbnN0IGludCBhMiA9IHNjbGlwMlsxMTIgKyAoKGEgKyAzKSA+PiAzKV07Ci0gIGNvbnN0IGludCBhMyA9IChhMSArIDEpID4+IDE7Ci0gIHBbLTIqc3RlcF0gPSBjbGlwMVsyNTUgKyBwMSArIGEzXTsKLSAgcFstICBzdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTJdOwotICBwWyAgICAgIDBdID0gY2xpcDFbMjU1ICsgcTAgLSBhMV07Ci0gIHBbICAgc3RlcF0gPSBjbGlwMVsyNTUgKyBxMSAtIGEzXTsKLX0KLQotLy8gNiBwaXhlbHMgaW4sIDYgcGl4ZWxzIG91dAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNih1aW50OF90KiBwLCBpbnQgc3RlcCkgewotICBjb25zdCBpbnQgcDIgPSBwWy0zKnN0ZXBdLCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF07Ci0gIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIqc3RlcF07Ci0gIGNvbnN0IGludCBhID0gc2NsaXAxWzEwMjAgKyAzICogKHEwIC0gcDApICsgc2NsaXAxWzEwMjAgKyBwMSAtIHExXV07Ci0gIGNvbnN0IGludCBhMSA9ICgyNyAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDMgKiBhICsgNykgKiA5KSA+PiA3Ci0gIGNvbnN0IGludCBhMiA9ICgxOCAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDIgKiBhICsgNykgKiA5KSA+PiA3Ci0gIGNvbnN0IGludCBhMyA9ICg5ICAqIGEgKyA2MykgPj4gNzsgIC8vIGVxLiB0byAoKDEgKiBhICsgNykgKiA5KSA+PiA3Ci0gIHBbLTMqc3RlcF0gPSBjbGlwMVsyNTUgKyBwMiArIGEzXTsKLSAgcFstMipzdGVwXSA9IGNsaXAxWzI1NSArIHAxICsgYTJdOwotICBwWy0gIHN0ZXBdID0gY2xpcDFbMjU1ICsgcDAgKyBhMV07Ci0gIHBbICAgICAgMF0gPSBjbGlwMVsyNTUgKyBxMCAtIGExXTsKLSAgcFsgICBzdGVwXSA9IGNsaXAxWzI1NSArIHExIC0gYTJdOwotICBwWyAyKnN0ZXBdID0gY2xpcDFbMjU1ICsgcTIgLSBhM107Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgaGV2KGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICByZXR1cm4gKGFiczBbMjU1ICsgcDEgLSBwMF0gPiB0aHJlc2gpIHx8IChhYnMwWzI1NSArIHExIC0gcTBdID4gdGhyZXNoKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBuZWVkc19maWx0ZXIoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKLSAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07Ci0gIHJldHVybiAoMiAqIGFiczBbMjU1ICsgcDAgLSBxMF0gKyBhYnMxWzI1NSArIHAxIC0gcTFdKSA8PSB0aHJlc2g7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyMihjb25zdCB1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgdCwgaW50IGl0KSB7Ci0gIGNvbnN0IGludCBwMyA9IHBbLTQqc3RlcF0sIHAyID0gcFstMypzdGVwXSwgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdOwotICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyKnN0ZXBdLCBxMyA9IHBbMypzdGVwXTsKLSAgaWYgKCgyICogYWJzMFsyNTUgKyBwMCAtIHEwXSArIGFiczFbMjU1ICsgcDEgLSBxMV0pID4gdCkKLSAgICByZXR1cm4gMDsKLSAgcmV0dXJuIGFiczBbMjU1ICsgcDMgLSBwMl0gPD0gaXQgJiYgYWJzMFsyNTUgKyBwMiAtIHAxXSA8PSBpdCAmJgotICAgICAgICAgYWJzMFsyNTUgKyBwMSAtIHAwXSA8PSBpdCAmJiBhYnMwWzI1NSArIHEzIC0gcTJdIDw9IGl0ICYmCi0gICAgICAgICBhYnMwWzI1NSArIHEyIC0gcTFdIDw9IGl0ICYmIGFiczBbMjU1ICsgcTEgLSBxMF0gPD0gaXQ7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQotCi1zdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpLCBzdHJpZGUsIHRocmVzaCkpIHsKLSAgICAgIGRvX2ZpbHRlcjIocCArIGksIHN0cmlkZSk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGlmIChuZWVkc19maWx0ZXIocCArIGkgKiBzdHJpZGUsIDEsIHRocmVzaCkpIHsKLSAgICAgIGRvX2ZpbHRlcjIocCArIGkgKiBzdHJpZGUsIDEpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQgKiBzdHJpZGU7Ci0gICAgU2ltcGxlVkZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQ7Ci0gICAgU2ltcGxlSEZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNih1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIHdoaWxlIChzaXplLS0gPiAwKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcjIocCwgaHN0cmlkZSwgdGhyZXNoLCBpdGhyZXNoKSkgewotICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgewotICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZG9fZmlsdGVyNihwLCBoc3RyaWRlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcCArPSB2c3RyaWRlOwotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNCh1aW50OF90KiBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIHdoaWxlIChzaXplLS0gPiAwKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcjIocCwgaHN0cmlkZSwgdGhyZXNoLCBpdGhyZXNoKSkgewotICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgewotICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZG9fZmlsdGVyNChwLCBoc3RyaWRlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcCArPSB2c3RyaWRlOwotICB9Ci19Ci0KLS8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIEZpbHRlckxvb3AyNihwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi0vLyBvbiB0aHJlZSBpbm5lciBlZGdlcwotc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQgKiBzdHJpZGU7Ci0gICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQ7Ci0gICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIH0KLX0KLQotLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZwotc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjYodSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICBGaWx0ZXJMb29wMjYodiwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIEZpbHRlckxvb3AyNih1LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIEZpbHRlckxvb3AyNih2LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFZGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXI4aSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBGaWx0ZXJMb29wMjQodSArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLSAgRmlsdGVyTG9vcDI0KHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZQOERlY0lkY3QyIFZQOFRyYW5zZm9ybTsKLVZQOERlY0lkY3QgVlA4VHJhbnNmb3JtVVY7Ci1WUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDOwotVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQ1VWOwotCi1WUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTY7Ci1WUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTY7Ci1WUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4OwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyODsKLVZQOEx1bWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXIxNmk7Ci1WUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTZpOwotVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyOGk7Ci1WUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXI4aTsKLVZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlVkZpbHRlcjE2OwotVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTY7Ci1WUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNmk7Ci1WUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNmk7Ci0KLWV4dGVybiB2b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpOwotZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RHNwSW5pdCh2b2lkKSB7Ci0gIERzcEluaXRUYWJsZXMoKTsKLQotICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud287Ci0gIFZQOFRyYW5zZm9ybVVWID0gVHJhbnNmb3JtVVY7Ci0gIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtREM7Ci0gIFZQOFRyYW5zZm9ybURDVVYgPSBUcmFuc2Zvcm1EQ1VWOwotCi0gIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNjsKLSAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2OwotICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4OwotICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4OwotICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKLSAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7Ci0gIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKLSAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOwotICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTY7Ci0gIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNjsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7Ci0gIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOwotCi0gIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCi0gIGlmIChWUDhHZXRDUFVJbmZvKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgewotICAgICAgVlA4RHNwSW5pdFNTRTIoKTsKLSAgICB9Ci0jZWxpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBWUDhEc3BJbml0TkVPTigpOwotICAgIH0KLSNlbmRpZgotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjX25lb24uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjZDNiNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjX25lb24uYworKysgL2Rldi9udWxsCkBAIC0xLDQwNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQVJNIE5FT04gdmVyc2lvbiBvZiBkc3AgZnVuY3Rpb25zIGFuZCBsb29wIGZpbHRlcmluZy4KLS8vCi0vLyBBdXRob3JzOiBTb21uYXRoIEJhbmVyamVlIChzb21uYXRoQGdvb2dsZS5jb20pCi0vLyAgICAgICAgICBKb2hhbm4gS29lbmlnIChqb2hhbm5rb2VuaWdAZ29vZ2xlLmNvbSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotCi0jaW5jbHVkZSAiLi4vZGVjL3ZwOGkuaCIKLQotI2RlZmluZSBRUmVncyAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLCAicTYiLCAicTciLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgInE4IiwgInE5IiwgInExMCIsICJxMTEiLCAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IgotCi0jZGVmaW5lIEZMSVBfU0lHTl9CSVQyKGEsIGIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidmVvciAgICAgIiAjYSAiLCIgI2EgIiwiICNzICIgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZlb3IgICAgICIgI2IgIiwiICNiICIsIiAjcyAiICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLSNkZWZpbmUgRkxJUF9TSUdOX0JJVDQoYSwgYiwgYywgZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEZMSVBfU0lHTl9CSVQyKGEsIGIsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUMihjLCBkLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI2RlZmluZSBORUVEU19GSUxURVIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZhYmQudTggICAgcTE1LCIgI3AwICIsIiAjcTAgIiAgICAgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICovICAgICAgICAgICAgICBcCi0gICJ2YWJkLnU4ICAgIHExNCwiICNwMSAiLCIgI3ExICIgICAgICAgICBcbiIgIC8qIGFicyhwMSAtIHExKSAqLyAgICAgICAgICAgICAgXAotICAidnFhZGQudTggICBxMTUsIHExNSwgcTE1ICAgICAgICAgICAgICAgXG4iICAvKiBhYnMocDAgLSBxMCkgKiAyICovICAgICAgICAgIFwKLSAgInZzaHIudTggICAgcTE0LCBxMTQsICMxICAgICAgICAgICAgICAgIFxuIiAgLyogYWJzKHAxIC0gcTEpIC8gMiAqLyAgICAgICAgICBcCi0gICJ2cWFkZC51OCAgIHExNSwgcTE1LCBxMTQgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICogMiArIGFicyhwMSAtIHExKSAvIDIgKi8gXAotICAidmR1cC44ICAgICBxMTQsICIgI3RocmVzaCAiICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZjZ2UudTggICAiICNtYXNrICIsIHExNCwgcTE1ICAgICAgICAgIFxuIiAgLyogbWFzayA8PSB0aHJlc2ggKi8KLQotI2RlZmluZSBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgbykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZxc3ViLnM4ICAgcTE1LCIgI3EwICIsIiAjcDAgIiAgICAgICAgIFxuIiAgLyogKHEwIC0gcDApICovICAgICAgICAgICAgICAgICBcCi0gICJ2cXN1Yi5zOCAgIiAjbyAiLCIgI3AxICIsIiAjcTEgIiAgICAgICBcbiIgIC8qIChwMSAtIHExKSAqLyAgICAgICAgICAgICAgICAgXAotICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAxICogKHAwIC0gcTApICovIFwKLSAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMiAqIChwMCAtIHEwKSAqLyBcCi0gICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDMgKiAocDAgLSBxMCkgKi8KLQotI2RlZmluZSBET19TSU1QTEVfRklMVEVSKHAwLCBxMCwgZmwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZtb3YuaTggICAgcTE1LCAjMHgwMyAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2cWFkZC5zOCAgIHExNSwgcTE1LCAiICNmbCAiICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPSBmaWx0ZXIgKyAzICovICAgICAgXAotICAidnNoci5zOCAgICBxMTUsIHExNSwgIzMgICAgICAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID4+IDMgKi8gICAgICAgICAgICAgIFwKLSAgInZxYWRkLnM4ICAiICNwMCAiLCIgI3AwICIsIHExNSAgICAgICAgIFxuIiAgLyogcDAgKz0gZmlsdGVyMSAqLyAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidm1vdi5pOCAgICBxMTUsICMweDA0ICAgICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZxYWRkLnM4ICAgcTE1LCBxMTUsICIgI2ZsICIgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA9IGZpbHRlciArIDQgKi8gICAgICBcCi0gICJ2c2hyLnM4ICAgIHExNSwgcTE1LCAjMyAgICAgICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjIgPj4gMyAqLyAgICAgICAgICAgICAgXAotICAidnFzdWIuczggICIgI3EwICIsIiAjcTAgIiwgcTE1ICAgICAgICAgXG4iICAvKiBxMCAtPSBmaWx0ZXIyICovCi0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDIgcGl4ZWxzIChwMCBhbmQgcTApCi0jZGVmaW5lIERPX0ZJTFRFUjIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBORUVEU19GSUxURVIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgcTkpICAgICAvKiBmaWx0ZXIgbWFzayBpbiBxOSAqLyAgICAgICAgIFwKLSAgInZtb3YuaTggICAgcTEwLCAjMHg4MCAgICAgICAgICAgICAgICAgIFxuIiAgLyogc2lnbiBiaXQgKi8gICAgICAgICAgICAgICAgICBcCi0gIEZMSVBfU0lHTl9CSVQ0KHAxLCBwMCwgcTAsIHExLCBxMTApICAgICAgICAgIC8qIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlICovICAgXAotICBHRVRfQkFTRV9ERUxUQShwMSwgcDAsIHEwLCBxMSwgcTExKSAgICAgICAgICAvKiBnZXQgZmlsdGVyIGxldmVsICAqLyAgICAgICAgIFwKLSAgInZhbmQgICAgICAgcTksIHE5LCBxMTEgICAgICAgICAgICAgICAgIFxuIiAgLyogYXBwbHkgZmlsdGVyIG1hc2sgKi8gICAgICAgICBcCi0gIERPX1NJTVBMRV9GSUxURVIocDAsIHEwLCBxOSkgICAgICAgICAgICAgICAgIC8qIGFwcGx5IGZpbHRlciAqLyAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUMihwMCwgcTAsIHExMCkKLQotLy8gTG9hZC9TdG9yZSB2ZXJ0aWNhbCBlZGdlCi0jZGVmaW5lIExPQUQ4eDQoYzEsIGMyLCBjMywgYzQsIGIxLCBiMiwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidmxkNC44ICAgeyIgI2MxIlswXSwgIiAjYzIiWzBdLCAiICNjMyJbMF0sICIgI2M0IlswXX0sIiAjYjEgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbMV0sICIgI2MyIlsxXSwgIiAjYzMiWzFdLCAiICNjNCJbMV19LCIgI2IyICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzJdLCAiICNjMiJbMl0sICIgI2MzIlsyXSwgIiAjYzQiWzJdfSwiICNiMSAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIlszXSwgIiAjYzIiWzNdLCAiICNjMyJbM10sICIgI2M0IlszXX0sIiAjYjIgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbNF0sICIgI2MyIls0XSwgIiAjYzMiWzRdLCAiICNjNCJbNF19LCIgI2IxICIsIiAjc3RyaWRlIlxuIiBcCi0gICJ2bGQ0LjggICB7IiAjYzEiWzVdLCAiICNjMiJbNV0sICIgI2MzIls1XSwgIiAjYzQiWzVdfSwiICNiMiAiLCIgI3N0cmlkZSJcbiIgXAotICAidmxkNC44ICAgeyIgI2MxIls2XSwgIiAjYzIiWzZdLCAiICNjMyJbNl0sICIgI2M0Ils2XX0sIiAjYjEgIiwiICNzdHJpZGUiXG4iIFwKLSAgInZsZDQuOCAgIHsiICNjMSJbN10sICIgI2MyIls3XSwgIiAjYzMiWzddLCAiICNjNCJbN119LCIgI2IyICIsIiAjc3RyaWRlIlxuIgotCi0jZGVmaW5lIFNUT1JFOHgyKGMxLCBjMiwgcCwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIlswXSwgIiAjYzIiWzBdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbMV0sICIgI2MyIlsxXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzJdLCAiICNjMiJbMl19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIlszXSwgIiAjYzIiWzNdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbNF0sICIgI2MyIls0XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgICBcCi0gICJ2c3QyLjggICB7IiAjYzEiWzVdLCAiICNjMiJbNV19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgICAgXAotICAidnN0Mi44ICAgeyIgI2MxIls2XSwgIiAjYzIiWzZdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICAgIFwKLSAgInZzdDIuOCAgIHsiICNjMSJbN10sICIgI2MyIls3XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQotCi1zdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgJVtzdHJpZGVdLCBsc2wgIzEgIFxuIiAgLy8gcCAtPSAyICogc3RyaWRlCi0KLSAgICAidmxkMS51OCAgICB7cTF9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBwMQotICAgICJ2bGQxLnU4ICAgIHtxMn0sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHAwCi0gICAgInZsZDEudTggICAge3EzfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcTAKLSAgICAidmxkMS51OCAgICB7cTR9LCBbJVtwXV0gICAgICAgICAgICAgICAgICAgXG4iICAvLyBxMQotCi0gICAgRE9fRklMVEVSMihxMSwgcTIsIHEzLCBxNCwgJVt0aHJlc2hdKQotCi0gICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgJVtzdHJpZGVdLCBsc2wgIzEgIFxuIiAgLy8gcCAtPSAyICogc3RyaWRlCi0KLSAgICAidnN0MS51OCAgICB7cTJ9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBzdG9yZSBvcDAKLSAgICAidnN0MS51OCAgICB7cTN9LCBbJVtwXV0gICAgICAgICAgICAgICAgICAgXG4iICAvLyBzdG9yZSBvcTAKLSAgICA6IFtwXSAiK3IiKHApCi0gICAgOiBbc3RyaWRlXSAiciIoc3RyaWRlKSwgW3RocmVzaF0gInIiKHRocmVzaCkKLSAgICA6ICJtZW1vcnkiLCBRUmVncwotICApOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInN1YiAgICAgICAgcjQsICVbcF0sICMyICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gYmFzZTEgPSBwIC0gMgotICAgICJsc2wgICAgICAgIHI2LCAlW3N0cmlkZV0sICMxICAgICAgICAgICAgICBcbiIgIC8vIHI2ID0gMiAqIHN0cmlkZQotICAgICJhZGQgICAgICAgIHI1LCByNCwgJVtzdHJpZGVdICAgICAgICAgICAgICBcbiIgIC8vIGJhc2UyID0gYmFzZTEgKyBzdHJpZGUKLQotICAgIExPQUQ4eDQoZDIsIGQzLCBkNCwgZDUsIFtyNF0sIFtyNV0sIHI2KQotICAgIExPQUQ4eDQoZDYsIGQ3LCBkOCwgZDksIFtyNF0sIFtyNV0sIHI2KQotICAgICJ2c3dwICAgICAgIGQzLCBkNiAgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHAxOnExIHAwOnEzCi0gICAgInZzd3AgICAgICAgZDUsIGQ4ICAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcTA6cTIgcTE6cTQKLSAgICAidnN3cCAgICAgICBxMiwgcTMgICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBwMTpxMSBwMDpxMiBxMDpxMyBxMTpxNAotCi0gICAgRE9fRklMVEVSMihxMSwgcTIsIHEzLCBxNCwgJVt0aHJlc2hdKQotCi0gICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgIzEgICAgICAgICAgICAgICAgIFxuIiAgLy8gcCAtIDEKLQotICAgICJ2c3dwICAgICAgICBkNSwgZDYgICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICBTVE9SRTh4MihkNCwgZDUsIFslW3BdXSwgJVtzdHJpZGVdKQotICAgIFNUT1JFOHgyKGQ2LCBkNywgWyVbcF1dLCAlW3N0cmlkZV0pCi0KLSAgICA6IFtwXSAiK3IiKHApCi0gICAgOiBbc3RyaWRlXSAiciIoc3RyaWRlKSwgW3RocmVzaF0gInIiKHRocmVzaCkKLSAgICA6ICJtZW1vcnkiLCAicjQiLCAicjUiLCAicjYiLCBRUmVncwotICApOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpTkVPTih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIFNpbXBsZVZGaWx0ZXIxNk5FT04ocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmlORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQ7Ci0gICAgU2ltcGxlSEZpbHRlcjE2TkVPTihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW52ZXJzZSB0cmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtT25lTkVPTihjb25zdCBpbnQxNl90ICppbiwgdWludDhfdCAqZHN0KSB7Ci0gIGNvbnN0IGludCBrQlBTID0gQlBTOwotICBjb25zdCBpbnQxNl90IGNvbnN0YW50c1tdID0gezIwMDkxLCAxNzczNCwgMCwgMH07Ci0gIC8qIGtDMSwga0MyLiBQYWRkZWQgYmVjYXVzZSB2bGQxLjE2IGxvYWRzIDggYnl0ZXMKLSAgICogVGVjaG5pY2FsbHkgdGhlc2UgYXJlIHVuc2lnbmVkIGJ1dCB2cWRtdWxoIGlzIG9ubHkgYXZhaWxhYmxlIGluIHNpZ25lZC4KLSAgICogdnFkbXVsaCByZXR1cm5zIGhpZ2ggaGFsZiAoZWZmZWN0aXZlbHkgPj4gMTYpIGJ1dCBhbHNvIGRvdWJsZXMgdGhlIHZhbHVlLAotICAgKiBjaGFuZ2luZyB0aGUgPj4gMTYgdG8gPj4gMTUgYW5kIHJlcXVpcmluZyBhbiBhZGRpdGlvbmFsID4+IDEuCi0gICAqIFdlIHVzZSB0aGlzIHRvIG91ciBhZHZhbnRhZ2Ugd2l0aCBrQzIuIFRoZSBjYW5vbmljYWwgdmFsdWUgaXMgMzU0NjguCi0gICAqIEhvd2V2ZXIsIHRoZSBoaWdoIGJpdCBpcyBzZXQgc28gdHJlYXRpbmcgaXQgYXMgc2lnbmVkIHdpbGwgZ2l2ZSBpbmNvcnJlY3QKLSAgICogcmVzdWx0cy4gV2UgYXZvaWQgdGhpcyBieSBkb3duIHNoaWZ0aW5nIGJ5IDEgaGVyZSB0byBjbGVhciB0aGUgaGlnaGVzdCBiaXQuCi0gICAqIENvbWJpbmVkIHdpdGggdGhlIGRvdWJsaW5nIGVmZmVjdCBvZiB2cWRtdWxoIHdlIGdldCA+PiAxNi4KLSAgICogVGhpcyBjYW4gbm90IGJlIGFwcGxpZWQgdG8ga0MxIGJlY2F1c2UgdGhlIGxvd2VzdCBiaXQgaXMgc2V0LiBEb3duIHNoaWZ0aW5nCi0gICAqIHRoZSBjb25zdGFudCB3b3VsZCByZWR1Y2UgcHJlY2lzaW9uLgotICAgKi8KLQotICAvKiBsaWJ3ZWJwIHVzZXMgYSB0cmljayB0byBhdm9pZCBzb21lIGV4dHJhIGFkZGl0aW9uIHRoYXQgbGlidnB4IGRvZXMuCi0gICAqIEluc3RlYWQgb2Y6Ci0gICAqIHRlbXAyID0gaXBbMTJdICsgKChpcFsxMl0gKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOwotICAgKiBsaWJ3ZWJwIGFkZHMgMSA8PCAxNiB0byBjb3NwaThzcXJ0Mm1pbnVzMSAoa0MxKS4gSG93ZXZlciwgdGhpcyBjYXVzZXMgdGhlCi0gICAqIHNhbWUgaXNzdWUgd2l0aCBrQzEgYW5kIHZxZG11bGggdGhhdCB3ZSB3b3JrIGFyb3VuZCBieSBkb3duIHNoaWZ0aW5nIGtDMgotICAgKi8KLQotICAvKiBBZGFwdGVkIGZyb20gbGlidnB4OiB2cDgvY29tbW9uL2FybS9uZW9uL3Nob3J0aWRjdDR4NGxsbV9uZW9uLmFzbSAqLwotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAidmxkMS4xNiAgICAgICAgIHtxMSwgcTJ9LCBbJVtpbl1dICAgICAgICAgICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIHtkMH0sIFslW2NvbnN0YW50c11dICAgICAgICBcbiIKLQotICAgIC8qIGQyOiBpblswXQotICAgICAqIGQzOiBpbls4XQotICAgICAqIGQ0OiBpbls0XQotICAgICAqIGQ1OiBpblsxMl0KLSAgICAgKi8KLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIHE4ID0ge2luWzRdLCBpblsxMl19ICoga0MxICogMiA+PiAxNgotICAgICAqIHE5ID0ge2luWzRdLCBpblsxMl19ICoga0MyID4+IDE2Ci0gICAgICovCi0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjIgPSBhID0gaW5bMF0gKyBpbls4XQotICAgICAqIGQyMyA9IGIgPSBpblswXSAtIGluWzhdCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBUaGUgbXVsdGlwbGljYXRpb24gc2hvdWxkIGJlIHggKiBrQzEgPj4gMTYKLSAgICAgKiBIb3dldmVyLCB3aXRoIHZxZG11bGggd2UgZ2V0IHggKiBrQzEgKiAyID4+IDE2Ci0gICAgICogKG11bHRpcGx5LCBkb3VibGUsIHJldHVybiBoaWdoIGhhbGYpCi0gICAgICogV2UgYXZvaWRlZCB0aGlzIGluIGtDMiBieSBwcmUtc2hpZnRpbmcgdGhlIGNvbnN0YW50LgotICAgICAqIHE4ID0gaW5bNF0vWzEyXSAqIGtDMSA+PiAxNgotICAgICAqLwotICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogQWRkIHtpbls0XSwgaW5bMTJdfSBiYWNrIGFmdGVyIHRoZSBtdWx0aXBsaWNhdGlvbi4gVGhpcyBpcyBoYW5kbGVkIGJ5Ci0gICAgICogYWRkaW5nIDEgPDwgMTYgdG8ga0MxIGluIHRoZSBsaWJ3ZWJwIEMgY29kZS4KLSAgICAgKi8KLSAgICAidnFhZGQuczE2ICAgICAgIHE4LCBxMiwgcTggICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIGQyMCA9IGMgPSBpbls0XSprQzIgLSBpblsxMl0qa0MxCi0gICAgICogZDIxID0gZCA9IGluWzRdKmtDMSArIGluWzEyXSprQzIKLSAgICAgKi8KLSAgICAidnFzdWIuczE2ICAgICAgIGQyMCwgZDE4LCBkMTcgICAgICAgICAgICAgICBcbiIKLSAgICAidnFhZGQuczE2ICAgICAgIGQyMSwgZDE5LCBkMTYgICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIGQyID0gdG1wWzBdID0gYSArIGQKLSAgICAgKiBkMyA9IHRtcFsxXSA9IGIgKyBjCi0gICAgICogZDQgPSB0bXBbMl0gPSBiIC0gYwotICAgICAqIGQ1ID0gdG1wWzNdID0gYSAtIGQKLSAgICAgKi8KLSAgICAidnFhZGQuczE2ICAgICAgIGQyLCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFhZGQuczE2ICAgICAgIGQzLCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFzdWIuczE2ICAgICAgIGQ0LCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFzdWIuczE2ICAgICAgIGQ1LCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzd3AgICAgICAgICAgICBkMywgZDQgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBxOCA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MxICogMiA+PiAxNgotICAgICAqIHE5ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzIgPj4gMTYKLSAgICAgKi8KLSAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKLSAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKLQotICAgIC8qIGQyMiA9IGEgPSB0bXBbMF0gKyB0bXBbOF0KLSAgICAgKiBkMjMgPSBiID0gdG1wWzBdIC0gdG1wWzhdCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBTZWUgbG9uZyB3aW5kZWQgZXhwbGFuYXRpb25zIHByaW9yICovCi0gICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgICAqIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgICovCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvKiBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgICogZDMgPSB0bXBbMV0gPSBiICsgYwotICAgICAqIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAgKiBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgICovCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKLQotICAgICJzdWIgICAgICAgICAlW2RzdF0sICVbZHN0XSwgJVtrQlBTXSwgbHNsICMyIFxuIgotCi0gICAgLyogKHZhbCkgKyA0ID4+IDMgKi8KLSAgICAidnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLyogTXVzdCBhY2N1bXVsYXRlIGJlZm9yZSBzYXR1cmF0aW5nICovCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOCwgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFhZGQuczE2ICAgICAgIHExLCBxMSwgcTggICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFhZGQuczE2ICAgICAgIHEyLCBxMiwgcTkgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2cW1vdnVuLnMxNiAgICAgZDAsIHExICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cW1vdnVuLnMxNiAgICAgZDEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzdDEuMzIgICAgICAgICBkMFswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMFsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVsxXSwgWyVbZHN0XV0gICAgICAgICAgICAgXG4iCi0KLSAgICA6IFtpbl0gIityIihpbiksIFtkc3RdICIrciIoZHN0KSAgLyogbW9kaWZpZWQgcmVnaXN0ZXJzICovCi0gICAgOiBba0JQU10gInIiKGtCUFMpLCBbY29uc3RhbnRzXSAiciIoY29uc3RhbnRzKSAgLyogY29uc3RhbnRzICovCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiICAvKiBjbG9iYmVyZWQgKi8KLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7Ci0gIFRyYW5zZm9ybU9uZU5FT04oaW4sIGRzdCk7Ci0gIGlmIChkb190d28pIHsKLSAgICBUcmFuc2Zvcm1PbmVORU9OKGluICsgMTYsIGRzdCArIDQpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IGludCBrU3RlcCA9IDMyOyAgLy8gVGhlIHN0b3JlIGlzIG9ubHkgaW5jcmVtZW50aW5nIHRoZSBwb2ludGVyIGFzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFkIHN0b3JlZCBhIHNpbmdsZSBieXRlLgotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAvLyBwYXJ0IDEKLSAgICAvLyBsb2FkIGRhdGEgaW50byBxMCwgcTEKLSAgICAidmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtpbl1dICAgICAgICAgICBcbiIKLQotICAgICJ2YWRkbC5zMTYgICAgICAgcTIsIGQwLCBkMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGluWzBdICsgaW5bMTJdCi0gICAgInZhZGRsLnMxNiAgICAgICBxMywgZDEsIGQyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gaW5bNF0gKyBpbls4XQotICAgICJ2c3VibC5zMTYgICAgICAgcTQsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGluWzRdIC0gaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE1LCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBpblswXSAtIGluWzEyXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFswXSA9IGEwICsgYTEKLSAgICAidnN1Yi5zMzIgICAgICAgIHEyLCBxMiwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzhdID0gYTAgLSBhMQotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbNF0gPSBhMyArIGEyCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTUsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFsxMl0gPSBhMyAtIGEyCi0KLSAgICAvLyBUcmFuc3Bvc2UKLSAgICAvLyBxMCA9IHRtcFswLCA0LCA4LCAxMl0sIHExID0gdG1wWzIsIDYsIDEwLCAxNF0KLSAgICAvLyBxMiA9IHRtcFsxLCA1LCA5LCAxM10sIHEzID0gdG1wWzMsIDcsIDExLCAxNV0KLSAgICAidnN3cCAgICAgICAgICAgIGQxLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMCwgcTIKLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMSwgcTMKLSAgICAidnRybi4zMiAgICAgICAgIHEwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHEyLCBxMyAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bW92LnMzMiAgICAgICAgcTQsICMzICAgICAgICAgICAgICAgICAgICAgIFxuIiAvLyBkYyA9IDMKLSAgICAidmFkZC5zMzIgICAgICAgIHEwLCBxMCwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSB0bXBbMF0gKyAzCi0gICAgInZhZGQuczMyICAgICAgICBxNiwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEwID0gZGMgKyB0bXBbM10KLSAgICAidmFkZC5zMzIgICAgICAgIHE3LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSB0bXBbMV0gKyB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSB0bXBbMV0gLSB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE5LCBxMCwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkYyAtIHRtcFszXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMCwgcTAsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCArIGExKSA+PiAzCi0gICAgInZhZGQuczMyICAgICAgICBxMSwgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTEsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyArIGEyKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMiwgcTIsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCAtIGExKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMywgcTMsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyAtIGEyKSA+PiAzCi0KLSAgICAvLyBzZXQgdGhlIHJlc3VsdHMgdG8gb3V0cHV0Ci0gICAgInZzdDEuMTYgICAgICAgICBkMFswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1swXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1sxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1syXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1szXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgXG4iCi0KLSAgICA6IFtvdXRdICIrciIob3V0KSAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCi0gICAgOiBbaW5dICJyIihpbiksIFtrU3RlcF0gInIiKGtTdGVwKSAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICJxNSIsICJxNiIsICJxNyIsICJxOCIsICJxOSIgIC8vIGNsb2JiZXJlZAotICApOwotfQotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1leHRlcm4gdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKTsKLQotdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud29ORU9OOwotICBWUDhUcmFuc2Zvcm1XSFQgPSBUcmFuc2Zvcm1XSFQ7Ci0KLSAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2TkVPTjsKLSAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2TkVPTjsKLSAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlORU9OOwotICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aU5FT047Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RlY19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjX3NzZTIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTQ2Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZGVjX3NzZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDkxMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU1NFMiB2ZXJzaW9uIG9mIHNvbWUgZGVjb2RpbmcgZnVuY3Rpb25zIChpZGN0LCBsb29wIGZpbHRlcmluZykuCi0vLwotLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0vLyAgICAgICAgIGNkdXZpdmllckBnb29nbGUuY29tIChDaHJpc3RpYW4gRHV2aXZpZXIpCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLQotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKLQotc3RhdGljIHZvaWQgVHJhbnNmb3JtU1NFMihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7Ci0gIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gbWFrZXMgdXNlIG9mIDE2LWJpdCBmaXhlZCBwb2ludCB2ZXJzaW9ucyBvZiB0d28KLSAgLy8gbXVsdGlwbHkgY29uc3RhbnRzOgotICAvLyAgICBLMSA9IHNxcnQoMikgKiBjb3MgKHBpLzgpIH49IDg1NjI3IC8gMl4xNgotICAvLyAgICBLMiA9IHNxcnQoMikgKiBzaW4gKHBpLzgpIH49IDM1NDY4IC8gMl4xNgotICAvLwotICAvLyBUbyBiZSBhYmxlIHRvIHVzZSBzaWduZWQgMTYtYml0IGludGVnZXJzLCB3ZSB1c2UgdGhlIGZvbGxvd2luZyB0cmljayB0bwotICAvLyBoYXZlIGNvbnN0YW50cyB3aXRoaW4gcmFuZ2U6Ci0gIC8vIC0gQXNzb2NpYXRlZCBjb25zdGFudHMgYXJlIG9idGFpbmVkIGJ5IHN1YnRyYWN0aW5nIHRoZSAxNi1iaXQgZml4ZWQgcG9pbnQKLSAgLy8gICB2ZXJzaW9uIG9mIG9uZToKLSAgLy8gICAgICBrID0gSyAtICgxIDw8IDE2KSAgPT4gIEsgPSBrICsgKDEgPDwgMTYpCi0gIC8vICAgICAgSzEgPSA4NTI2NyAgPT4gIGsxID0gIDIwMDkxCi0gIC8vICAgICAgSzIgPSAzNTQ2OCAgPT4gIGsyID0gLTMwMDY4Ci0gIC8vIC0gVGhlIG11bHRpcGxpY2F0aW9uIG9mIGEgdmFyaWFibGUgYnkgYSBjb25zdGFudCBiZWNvbWUgdGhlIHN1bSBvZiB0aGUKLSAgLy8gICB2YXJpYWJsZSBhbmQgdGhlIG11bHRpcGxpY2F0aW9uIG9mIHRoYXQgdmFyaWFibGUgYnkgdGhlIGFzc29jaWF0ZWQKLSAgLy8gICBjb25zdGFudDoKLSAgLy8gICAgICAoeCAqIEspID4+IDE2ID0gKHggKiAoayArICgxIDw8IDE2KSkpID4+IDE2ID0gKCh4ICogayApID4+IDE2KSArIHgKLSAgY29uc3QgX19tMTI4aSBrMSA9IF9tbV9zZXQxX2VwaTE2KDIwMDkxKTsKLSAgY29uc3QgX19tMTI4aSBrMiA9IF9tbV9zZXQxX2VwaTE2KC0zMDA2OCk7Ci0gIF9fbTEyOGkgVDAsIFQxLCBUMiwgVDM7Ci0KLSAgLy8gTG9hZCBhbmQgY29uY2F0ZW5hdGUgdGhlIHRyYW5zZm9ybSBjb2VmZmljaWVudHMgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zCi0gIC8vIGluIHBhcmFsbGVsKS4gSW4gdGhlIGNhc2Ugb2Ygb25seSBvbmUgdHJhbnNmb3JtLCB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlCi0gIC8vIHZlY3RvcnMgd2lsbCBqdXN0IGNvbnRhaW4gcmFuZG9tIHZhbHVlIHdlJ2xsIG5ldmVyIHVzZSBub3Igc3RvcmUuCi0gIF9fbTEyOGkgaW4wLCBpbjEsIGluMiwgaW4zOwotICB7Ci0gICAgaW4wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMF0pOwotICAgIGluMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzRdKTsKLSAgICBpbjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls4XSk7Ci0gICAgaW4zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTJdKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICB4IHggeCB4Ci0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgeCB4IHggeAotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIHggeCB4IHgKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICB4IHggeCB4Ci0gICAgaWYgKGRvX3R3bykgewotICAgICAgY29uc3QgX19tMTI4aSBpbkIwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTZdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzIwXSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyNF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjhdKTsKLSAgICAgIGluMCA9IF9tbV91bnBhY2tsb19lcGk2NChpbjAsIGluQjApOwotICAgICAgaW4xID0gX21tX3VucGFja2xvX2VwaTY0KGluMSwgaW5CMSk7Ci0gICAgICBpbjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4yLCBpbkIyKTsKLSAgICAgIGluMyA9IF9tbV91bnBhY2tsb19lcGk2NChpbjMsIGluQjMpOwotICAgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gICAgfQotICB9Ci0KLSAgLy8gVmVydGljYWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBhID0gX21tX2FkZF9lcGkxNihpbjAsIGluMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1Yl9lcGkxNihpbjAsIGluMik7Ci0gICAgLy8gYyA9IE1VTChpbjEsIEsyKSAtIE1VTChpbjMsIEsxKSA9IE1VTChpbjEsIGsyKSAtIE1VTChpbjMsIGsxKSArIGluMSAtIGluMwotICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChpbjEsIEsxKSArIE1VTChpbjMsIEsyKSA9IE1VTChpbjEsIGsxKSArIE1VTChpbjMsIGsyKSArIGluMSArIGluMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsyKTsKLSAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KLSAgewotICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgotICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KLSAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKLSAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7Ci0gICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKLSAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOwotICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKLSAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOwotICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKLQotICAgIC8vIFNlY29uZCBwYXNzLgotICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQwLCBzaGlmdGVkMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc2hpZnRlZDIsIHNoaWZ0ZWQzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgLy8gYTAwIGExMCBhMDEgYTExICAgYTAyIGExMiBhMDMgYTEzCi0gICAgLy8gYTIwIGEzMCBhMjEgYTMxICAgYTIyIGEzMiBhMjMgYTMzCi0gICAgLy8gYjAwIGIxMCBiMDEgYjExICAgYjAyIGIxMiBiMDMgYjEzCi0gICAgLy8gYjIwIGIzMCBiMjEgYjMxICAgYjIyIGIzMiBiMjMgYjMzCi0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMiA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzMgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCBhMDEgYTExIGEyMSBhMzEKLSAgICAvLyBiMDAgYjEwIGIyMCBiMzAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyIGEwMyBhMTMgYTIzIGEzMwotICAgIC8vIGIwMiBiMTIgYTIyIGIzMiBiMDMgYjEzIGIyMyBiMzMKLSAgICBUMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDEgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQyID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICBUMyA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCi0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gIH0KLQotICAvLyBBZGQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gJ2RzdCcgYW5kIHN0b3JlLgotICB7Ci0gICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgICAvLyBMb2FkIHRoZSByZWZlcmVuY2UocykuCi0gICAgX19tMTI4aSBkc3QwLCBkc3QxLCBkc3QyLCBkc3QzOwotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIExvYWQgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgZHN0MCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSk7Ci0gICAgICBkc3QxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdKTsKLSAgICAgIGRzdDIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10pOwotICAgICAgZHN0MyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIExvYWQgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCi0gICAgICBkc3QwID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZkc3RbMCAqIEJQU10pOwotICAgICAgZHN0MSA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmZHN0WzEgKiBCUFNdKTsKLSAgICAgIGRzdDIgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJmRzdFsyICogQlBTXSk7Ci0gICAgICBkc3QzID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZkc3RbMyAqIEJQU10pOwotICAgIH0KLSAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KLSAgICBkc3QwID0gX21tX3VucGFja2xvX2VwaTgoZHN0MCwgemVybyk7Ci0gICAgZHN0MSA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDEsIHplcm8pOwotICAgIGRzdDIgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QyLCB6ZXJvKTsKLSAgICBkc3QzID0gX21tX3VucGFja2xvX2VwaTgoZHN0MywgemVybyk7Ci0gICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KLSAgICBkc3QwID0gX21tX2FkZF9lcGkxNihkc3QwLCBUMCk7Ci0gICAgZHN0MSA9IF9tbV9hZGRfZXBpMTYoZHN0MSwgVDEpOwotICAgIGRzdDIgPSBfbW1fYWRkX2VwaTE2KGRzdDIsIFQyKTsKLSAgICBkc3QzID0gX21tX2FkZF9lcGkxNihkc3QzLCBUMyk7Ci0gICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCi0gICAgZHN0MCA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MCwgZHN0MCk7Ci0gICAgZHN0MSA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MSwgZHN0MSk7Ci0gICAgZHN0MiA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MiwgZHN0Mik7Ci0gICAgZHN0MyA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MywgZHN0Myk7Ci0gICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCi0gICAgaWYgKGRvX3R3bykgewotICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSwgZHN0MCk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdLCBkc3QxKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10sIGRzdDIpOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSwgZHN0Myk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMCAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIoZHN0MCk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsxICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihkc3QxKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzIgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKGRzdDIpOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMyAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIoZHN0Myk7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMb29wIEZpbHRlciAoUGFyYWdyYXBoIDE1KQotCi0vLyBDb21wdXRlIGFicyhwIC0gcSkgPSBzdWJzKHAgLSBxKSBPUiBzdWJzKHEgLSBwKQotI2RlZmluZSBNTV9BQlMocCwgcSkgIF9tbV9vcl9zaTEyOCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBfbW1fc3Vic19lcHU4KChxKSwgKHApKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX21tX3N1YnNfZXB1OCgocCksIChxKSkpCi0KLS8vIFNoaWZ0IGVhY2ggYnl0ZSBvZiAiYSIgYnkgTiBiaXRzIHdoaWxlIHByZXNlcnZpbmcgYnkgdGhlIHNpZ24gYml0LgotLy8KLS8vIEl0IGZpcnN0IHNoaWZ0cyB0aGUgbG93ZXIgYnl0ZXMgb2YgdGhlIHdvcmRzIGFuZCB0aGVuIHRoZSB1cHBlciBieXRlcyBhbmQKLS8vIHRoZW4gbWVyZ2VzIHRoZSByZXN1bHRzIHRvZ2V0aGVyLgotI2RlZmluZSBTSUdORURfU0hJRlRfTihhLCBOKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19tMTI4aSB0ID0gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHQgPSBfbW1fc2xsaV9lcGkxNih0LCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ID0gX21tX3NyYWlfZXBpMTYodCwgTik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdCA9IF9tbV9zcmxpX2VwaTE2KHQsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBhID0gX21tX3NyYWlfZXBpMTYoYSwgTiArIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV9zbGxpX2VwaTE2KGEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBhID0gX21tX29yX3NpMTI4KHQsIGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBGTElQX1NJR05fQklUMihhLCBiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IF9tbV94b3Jfc2kxMjgoYSwgc2lnbl9iaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGIgPSBfbW1feG9yX3NpMTI4KGIsIHNpZ25fYml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIEZMSVBfU0lHTl9CSVQ0KGEsIGIsIGMsIGQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBGTElQX1NJR05fQklUMihhLCBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgRkxJUF9TSUdOX0JJVDIoYywgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgR0VUX05PVEhFVihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCwgbm90X2hldikgeyAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHRfMSA9IE1NX0FCUyhwMSwgcDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzIgPSBNTV9BQlMocTEsIHEwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGggPSBfbW1fc2V0MV9lcGk4KGhldl90aHJlc2gpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzMgPSBfbW1fc3Vic19lcHU4KHRfMSwgaCk7ICAvKiBhYnMocDEgLSBwMCkgLSBoZXZfdHJlc2ggKi8gICBcCi0gIGNvbnN0IF9fbTEyOGkgdF80ID0gX21tX3N1YnNfZXB1OCh0XzIsIGgpOyAgLyogYWJzKHExIC0gcTApIC0gaGV2X3RyZXNoICovICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbm90X2hldiA9IF9tbV9vcl9zaTEyOCh0XzMsIHRfNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5vdF9oZXYgPSBfbW1fY21wZXFfZXBpOChub3RfaGV2LCB6ZXJvKTsgLyogbm90X2hldiA8PSB0MSAmJiBub3RfaGV2IDw9IHQyICovXAotfQotCi0jZGVmaW5lIEdFVF9CQVNFX0RFTFRBKHAxLCBwMCwgcTAsIHExLCBvKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHFwMCA9IF9tbV9zdWJzX2VwaTgocTAsIHAwKTsgIC8qIHEwIC0gcDAgKi8gICAgICAgICAgICAgICAgICAgIFwKLSAgbyA9IF9tbV9zdWJzX2VwaTgocDEsIHExKTsgICAgICAgICAgICAvKiBwMSAtIHExICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG8gPSBfbW1fYWRkc19lcGk4KG8sIHFwMCk7ICAgICAgICAgICAgLyogcDEgLSBxMSArIDEgKiAocTAgLSBwMCkgKi8gICAgICAgICAgXAotICBvID0gX21tX2FkZHNfZXBpOChvLCBxcDApOyAgICAgICAgICAgIC8qIHAxIC0gcTEgKyAyICogKHEwIC0gcDApICovICAgICAgICAgIFwKLSAgbyA9IF9tbV9hZGRzX2VwaTgobywgcXAwKTsgICAgICAgICAgICAvKiBwMSAtIHExICsgMyAqIChxMCAtIHAwKSAqLyAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgRE9fU0lNUExFX0ZJTFRFUihwMCwgcTAsIGZsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdGhyZWUgPSBfbW1fc2V0MV9lcGk4KDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGk4KDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19tMTI4aSB2MyA9IF9tbV9hZGRzX2VwaTgoZmwsIHRocmVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgdjQgPSBfbW1fYWRkc19lcGk4KGZsLCBmb3VyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogRG8gKzQgc2lkZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNJR05FRF9TSElGVF9OKHY0LCAzKTsgICAgICAgICAgICAgICAgLyogdjQgPj4gMyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAotICBxMCA9IF9tbV9zdWJzX2VwaTgocTAsIHY0KTsgICAgICAgICAgIC8qIHEwIC09IHY0ICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIE5vdyBkbyArMyBzaWRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTSUdORURfU0hJRlRfTih2MywgMyk7ICAgICAgICAgICAgICAgIC8qIHYzID4+IDMgICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcDAgPSBfbW1fYWRkc19lcGk4KHAwLCB2Myk7ICAgICAgICAgICAvKiBwMCArPSB2MyAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFVwZGF0ZXMgdmFsdWVzIG9mIDIgcGl4ZWxzIGF0IE1CIGVkZ2UgZHVyaW5nIGNvbXBsZXggZmlsdGVyaW5nLgotLy8gVXBkYXRlIG9wZXJhdGlvbnM6Ci0vLyBxID0gcSAtIGRlbHRhIGFuZCBwID0gcCArIGRlbHRhOyB3aGVyZSBkZWx0YSA9IFsoYV9oaSA+PiA3KSwgKGFfbG8gPj4gNyldCi0jZGVmaW5lIFVQREFURV8yUElYRUxTKHBpLCBxaSwgYV9sbywgYV9oaSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGFfbG83ID0gX21tX3NyYWlfZXBpMTYoYV9sbywgNyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhX2hpNyA9IF9tbV9zcmFpX2VwaTE2KGFfaGksIDcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgZGVsdGEgPSBfbW1fcGFja3NfZXBpMTYoYV9sbzcsIGFfaGk3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwaSA9IF9tbV9hZGRzX2VwaTgocGksIGRlbHRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcWkgPSBfbW1fc3Vic19lcGk4KHFpLCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXN0YXRpYyB2b2lkIE5lZWRzRmlsdGVyKGNvbnN0IF9fbTEyOGkqIHAxLCBjb25zdCBfX20xMjhpKiBwMCwgY29uc3QgX19tMTI4aSogcTAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBxMSwgaW50IHRocmVzaCwgX19tMTI4aSAqbWFzaykgewotICBfX20xMjhpIHQxID0gTU1fQUJTKCpwMSwgKnExKTsgICAgICAgIC8vIGFicyhwMSAtIHExKQotICAqbWFzayA9IF9tbV9zZXQxX2VwaTgoMHhGRSk7Ci0gIHQxID0gX21tX2FuZF9zaTEyOCh0MSwgKm1hc2spOyAgICAgICAgLy8gc2V0IGxzYiBvZiBlYWNoIGJ5dGUgdG8gemVybwotICB0MSA9IF9tbV9zcmxpX2VwaTE2KHQxLCAxKTsgICAgICAgICAgIC8vIGFicyhwMSAtIHExKSAvIDIKLQotICAqbWFzayA9IE1NX0FCUygqcDAsICpxMCk7ICAgICAgICAgICAgIC8vIGFicyhwMCAtIHEwKQotICAqbWFzayA9IF9tbV9hZGRzX2VwdTgoKm1hc2ssICptYXNrKTsgIC8vIGFicyhwMCAtIHEwKSAqIDIKLSAgKm1hc2sgPSBfbW1fYWRkc19lcHU4KCptYXNrLCB0MSk7ICAgICAvLyBhYnMocDAgLSBxMCkgKiAyICsgYWJzKHAxIC0gcTEpIC8gMgotCi0gIHQxID0gX21tX3NldDFfZXBpOCh0aHJlc2gpOwotICAqbWFzayA9IF9tbV9zdWJzX2VwdTgoKm1hc2ssIHQxKTsgICAgIC8vIG1hc2sgPD0gdGhyZXNoCi0gICptYXNrID0gX21tX2NtcGVxX2VwaTgoKm1hc2ssIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCi0KLS8vIEFwcGxpZXMgZmlsdGVyIG9uIDIgcGl4ZWxzIChwMCBhbmQgcTApCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjIoY29uc3QgX19tMTI4aSogcDEsIF9fbTEyOGkqIHAwLCBfX20xMjhpKiBxMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBxMSwgaW50IHRocmVzaCkgewotICBfX20xMjhpIGEsIG1hc2s7Ci0gIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOwotICBjb25zdCBfX20xMjhpIHAxcyA9IF9tbV94b3Jfc2kxMjgoKnAxLCBzaWduX2JpdCk7Ci0gIGNvbnN0IF9fbTEyOGkgcTFzID0gX21tX3hvcl9zaTEyOCgqcTEsIHNpZ25fYml0KTsKLQotICBOZWVkc0ZpbHRlcihwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCAmbWFzayk7Ci0KLSAgLy8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gIEZMSVBfU0lHTl9CSVQyKCpwMCwgKnEwKTsKLQotICBHRVRfQkFTRV9ERUxUQShwMXMsICpwMCwgKnEwLCBxMXMsIGEpOwotICBhID0gX21tX2FuZF9zaTEyOChhLCBtYXNrKTsgICAgIC8vIG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0gIERPX1NJTVBMRV9GSUxURVIoKnAwLCAqcTAsIGEpOwotCi0gIC8vIHVub2Zmc2V0Ci0gIEZMSVBfU0lHTl9CSVQyKCpwMCwgKnEwKTsKLX0KLQotLy8gQXBwbGllcyBmaWx0ZXIgb24gNCBwaXhlbHMgKHAxLCBwMCwgcTAgYW5kIHExKQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI0KF9fbTEyOGkqIHAxLCBfX20xMjhpICpwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBxMCwgX19tMTI4aSogcTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogbWFzaywgaW50IGhldl90aHJlc2gpIHsKLSAgX19tMTI4aSBub3RfaGV2OwotICBfX20xMjhpIHQxLCB0MiwgdDM7Ci0gIGNvbnN0IF9fbTEyOGkgc2lnbl9iaXQgPSBfbW1fc2V0MV9lcGk4KDB4ODApOwotCi0gIC8vIGNvbXB1dGUgaGV2IG1hc2sKLSAgR0VUX05PVEhFVigqcDEsICpwMCwgKnEwLCAqcTEsIGhldl90aHJlc2gsIG5vdF9oZXYpOwotCi0gIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcwotICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOwotCi0gIHQxID0gX21tX3N1YnNfZXBpOCgqcDEsICpxMSk7ICAgICAgICAvLyBwMSAtIHExCi0gIHQxID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCB0MSk7ICAvLyBoZXYocDEgLSBxMSkKLSAgdDIgPSBfbW1fc3Vic19lcGk4KCpxMCwgKnAwKTsgICAgICAgIC8vIHEwIC0gcDAKLSAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDEgKiAocTAgLSBwMCkKLSAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDIgKiAocTAgLSBwMCkKLSAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDMgKiAocTAgLSBwMCkKLSAgdDEgPSBfbW1fYW5kX3NpMTI4KHQxLCAqbWFzayk7ICAgICAgIC8vIG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0Ci0KLSAgLy8gRG8gKzQgc2lkZQotICB0MiA9IF9tbV9zZXQxX2VwaTgoNCk7Ci0gIHQyID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgLy8gMyAqIChxMCAtIHAwKSArIChwMSAtIHExKSArIDQKLSAgU0lHTkVEX1NISUZUX04odDIsIDMpOyAgICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDQpID4+IDMKLSAgdDMgPSB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHQyCi0gICpxMCA9IF9tbV9zdWJzX2VwaTgoKnEwLCB0Mik7ICAgICAgLy8gcTAgLT0gdDIKLQotICAvLyBOb3cgZG8gKzMgc2lkZQotICB0MiA9IF9tbV9zZXQxX2VwaTgoMyk7Ci0gIHQyID0gX21tX2FkZHNfZXBpOCh0MSwgdDIpOyAgICAgICAgLy8gKzMgaW5zdGVhZCBvZiArNAotICBTSUdORURfU0hJRlRfTih0MiwgMyk7ICAgICAgICAgICAgIC8vICgzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgMykgPj4gMwotICAqcDAgPSBfbW1fYWRkc19lcGk4KCpwMCwgdDIpOyAgICAgIC8vIHAwICs9IHQyCi0KLSAgdDIgPSBfbW1fc2V0MV9lcGk4KDEpOwotICB0MyA9IF9tbV9hZGRzX2VwaTgodDMsIHQyKTsKLSAgU0lHTkVEX1NISUZUX04odDMsIDEpOyAgICAgICAgICAgICAvLyAoMyAqIChxMCAtIHAwKSArIGhldihwMSAtIHExKSArIDQpID4+IDQKLQotICB0MyA9IF9tbV9hbmRfc2kxMjgobm90X2hldiwgdDMpOyAgIC8vIGlmICFoZXYKLSAgKnExID0gX21tX3N1YnNfZXBpOCgqcTEsIHQzKTsgICAgICAvLyBxMSAtPSB0MwotICAqcDEgPSBfbW1fYWRkc19lcGk4KCpwMSwgdDMpOyAgICAgIC8vIHAxICs9IHQzCi0KLSAgLy8gdW5vZmZzZXQKLSAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKLX0KLQotLy8gQXBwbGllcyBmaWx0ZXIgb24gNiBwaXhlbHMgKHAyLCBwMSwgcDAsIHEwLCBxMSBhbmQgcTIpCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjYoX19tMTI4aSAqcDIsIF9fbTEyOGkqIHAxLCBfX20xMjhpICpwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBxMCwgX19tMTI4aSogcTEsIF9fbTEyOGkgKnEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIG1hc2ssIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgYSwgbm90X2hldjsKLSAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7Ci0KLSAgLy8gY29tcHV0ZSBoZXYgbWFzawotICBHRVRfTk9USEVWKCpwMSwgKnAwLCAqcTAsICpxMSwgaGV2X3RocmVzaCwgbm90X2hldik7Ci0KLSAgLy8gY29udmVydCB0byBzaWduZWQgdmFsdWVzCi0gIEZMSVBfU0lHTl9CSVQ0KCpwMSwgKnAwLCAqcTAsICpxMSk7Ci0gIEZMSVBfU0lHTl9CSVQyKCpwMiwgKnEyKTsKLQotICBHRVRfQkFTRV9ERUxUQSgqcDEsICpwMCwgKnEwLCAqcTEsIGEpOwotCi0gIHsgLy8gZG8gc2ltcGxlIGZpbHRlciBvbiBwaXhlbHMgd2l0aCBoZXYKLSAgICBjb25zdCBfX20xMjhpIG0gPSBfbW1fYW5kbm90X3NpMTI4KG5vdF9oZXYsICptYXNrKTsKLSAgICBjb25zdCBfX20xMjhpIGYgPSBfbW1fYW5kX3NpMTI4KGEsIG0pOwotICAgIERPX1NJTVBMRV9GSUxURVIoKnAwLCAqcTAsIGYpOwotICB9Ci0gIHsgLy8gZG8gc3Ryb25nIGZpbHRlciBvbiBwaXhlbHMgd2l0aCBub3QgaGV2Ci0gICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgICBjb25zdCBfX20xMjhpIG5pbmUgPSBfbW1fc2V0MV9lcGkxNigweDA5MDApOwotICAgIGNvbnN0IF9fbTEyOGkgc2l4dHlfdGhyZWUgPSBfbW1fc2V0MV9lcGkxNig2Myk7Ci0KLSAgICBjb25zdCBfX20xMjhpIG0gPSBfbW1fYW5kX3NpMTI4KG5vdF9oZXYsICptYXNrKTsKLSAgICBjb25zdCBfX20xMjhpIGYgPSBfbW1fYW5kX3NpMTI4KGEsIG0pOwotICAgIGNvbnN0IF9fbTEyOGkgZl9sbyA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIGYpOwotICAgIGNvbnN0IF9fbTEyOGkgZl9oaSA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sIGYpOwotCi0gICAgY29uc3QgX19tMTI4aSBmOV9sbyA9IF9tbV9tdWxoaV9lcGkxNihmX2xvLCBuaW5lKTsgICAvLyBGaWx0ZXIgKGxvKSAqIDkKLSAgICBjb25zdCBfX20xMjhpIGY5X2hpID0gX21tX211bGhpX2VwaTE2KGZfaGksIG5pbmUpOyAgIC8vIEZpbHRlciAoaGkpICogOQotICAgIGNvbnN0IF9fbTEyOGkgZjE4X2xvID0gX21tX2FkZF9lcGkxNihmOV9sbywgZjlfbG8pOyAgLy8gRmlsdGVyIChsbykgKiAxOAotICAgIGNvbnN0IF9fbTEyOGkgZjE4X2hpID0gX21tX2FkZF9lcGkxNihmOV9oaSwgZjlfaGkpOyAgLy8gRmlsdGVyIChoaSkgKiAxOAotCi0gICAgY29uc3QgX19tMTI4aSBhMl9sbyA9IF9tbV9hZGRfZXBpMTYoZjlfbG8sIHNpeHR5X3RocmVlKTsgIC8vIEZpbHRlciAqIDkgKyA2MwotICAgIGNvbnN0IF9fbTEyOGkgYTJfaGkgPSBfbW1fYWRkX2VwaTE2KGY5X2hpLCBzaXh0eV90aHJlZSk7ICAvLyBGaWx0ZXIgKiA5ICsgNjMKLQotICAgIGNvbnN0IF9fbTEyOGkgYTFfbG8gPSBfbW1fYWRkX2VwaTE2KGYxOF9sbywgc2l4dHlfdGhyZWUpOyAgLy8gRi4uLiAqIDE4ICsgNjMKLSAgICBjb25zdCBfX20xMjhpIGExX2hpID0gX21tX2FkZF9lcGkxNihmMThfaGksIHNpeHR5X3RocmVlKTsgIC8vIEYuLi4gKiAxOCArIDYzCi0KLSAgICBjb25zdCBfX20xMjhpIGEwX2xvID0gX21tX2FkZF9lcGkxNihmMThfbG8sIGEyX2xvKTsgIC8vIEZpbHRlciAqIDI3ICsgNjMKLSAgICBjb25zdCBfX20xMjhpIGEwX2hpID0gX21tX2FkZF9lcGkxNihmMThfaGksIGEyX2hpKTsgIC8vIEZpbHRlciAqIDI3ICsgNjMKLQotICAgIFVQREFURV8yUElYRUxTKCpwMiwgKnEyLCBhMl9sbywgYTJfaGkpOwotICAgIFVQREFURV8yUElYRUxTKCpwMSwgKnExLCBhMV9sbywgYTFfaGkpOwotICAgIFVQREFURV8yUElYRUxTKCpwMCwgKnEwLCBhMF9sbywgYTBfaGkpOwotICB9Ci0KLSAgLy8gdW5vZmZzZXQKLSAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKLSAgRkxJUF9TSUdOX0JJVDIoKnAyLCAqcTIpOwotfQotCi0vLyByZWFkcyA4IHJvd3MgYWNyb3NzIGEgdmVydGljYWwgZWRnZS4KLS8vCi0vLyBUT0RPKHNvbW5hdGgpOiBJbnZlc3RpZ2F0ZSBfbW1fc2h1ZmZsZSogYWxzbyBzZWUgaWYgaXQgY2FuIGJlIGJyb2tlbiBpbnRvCi0vLyB0d28gTG9hZDR4NCgpIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkOHg0KGNvbnN0IHVpbnQ4X3QqIGIsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIHAsIF9fbTEyOGkqIHEpIHsKLSAgX19tMTI4aSB0MSwgdDI7Ci0KLSAgLy8gTG9hZCAwdGgsIDFzdCwgNHRoIGFuZCA1dGggcm93cwotICBfX20xMjhpIHIwID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbMCAqIHN0cmlkZV0pKTsgIC8vIDAzIDAyIDAxIDAwCi0gIF9fbTEyOGkgcjEgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYlsxICogc3RyaWRlXSkpOyAgLy8gMTMgMTIgMTEgMTAKLSAgX19tMTI4aSByNCA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzQgKiBzdHJpZGVdKSk7ICAvLyA0MyA0MiA0MSA0MAotICBfX20xMjhpIHI1ID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbNSAqIHN0cmlkZV0pKTsgIC8vIDUzIDUyIDUxIDUwCi0KLSAgcjAgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjAsIHI0KTsgICAgICAgICAgICAgICAvLyA0MyA0MiA0MSA0MCAwMyAwMiAwMSAwMAotICByMSA9IF9tbV91bnBhY2tsb19lcGkzMihyMSwgcjUpOyAgICAgICAgICAgICAgIC8vIDUzIDUyIDUxIDUwIDEzIDEyIDExIDEwCi0KLSAgLy8gdDEgPSA1MyA0MyA1MiA0MiA1MSA0MSA1MCA0MCAxMyAwMyAxMiAwMiAxMSAwMSAxMCAwMAotICB0MSA9IF9tbV91bnBhY2tsb19lcGk4KHIwLCByMSk7Ci0KLSAgLy8gTG9hZCAybmQsIDNyZCwgNnRoIGFuZCA3dGggcm93cwotICByMCA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzIgKiBzdHJpZGVdKSk7ICAgICAgICAgIC8vIDIzIDIyIDIxIDIyCi0gIHIxID0gIF9tbV9jdnRzaTMyX3NpMTI4KCooKGludCopJmJbMyAqIHN0cmlkZV0pKTsgICAgICAgICAgLy8gMzMgMzIgMzEgMzAKLSAgcjQgPSAgX21tX2N2dHNpMzJfc2kxMjgoKigoaW50KikmYls2ICogc3RyaWRlXSkpOyAgICAgICAgICAvLyA2MyA2MiA2MSA2MAotICByNSA9ICBfbW1fY3Z0c2kzMl9zaTEyOCgqKChpbnQqKSZiWzcgKiBzdHJpZGVdKSk7ICAgICAgICAgIC8vIDczIDcyIDcxIDcwCi0KLSAgcjAgPSBfbW1fdW5wYWNrbG9fZXBpMzIocjAsIHI0KTsgICAgICAgICAgICAgICAvLyA2MyA2MiA2MSA2MCAyMyAyMiAyMSAyMAotICByMSA9IF9tbV91bnBhY2tsb19lcGkzMihyMSwgcjUpOyAgICAgICAgICAgICAgIC8vIDczIDcyIDcxIDcwIDMzIDMyIDMxIDMwCi0KLSAgLy8gdDIgPSA3MyA2MyA3MiA2MiA3MSA2MSA3MCA2MCAzMyAyMyAzMiAyMiAzMSAyMSAzMCAyMAotICB0MiA9IF9tbV91bnBhY2tsb19lcGk4KHIwLCByMSk7Ci0KLSAgLy8gdDEgPSAzMyAyMyAxMyAwMyAzMiAyMiAxMiAwMiAzMSAyMSAxMSAwMSAzMCAyMCAxMCAwMAotICAvLyB0MiA9IDczIDYzIDUzIDQzIDcyIDYyIDUyIDQyIDcxIDYxIDUxIDQxIDcwIDYwIDUwIDQwCi0gIHIwID0gdDE7Ci0gIHQxID0gX21tX3VucGFja2xvX2VwaTE2KHQxLCB0Mik7Ci0gIHQyID0gX21tX3VucGFja2hpX2VwaTE2KHIwLCB0Mik7Ci0KLSAgLy8gKnAgPSA3MSA2MSA1MSA0MSAzMSAyMSAxMSAwMSA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAvLyAqcSA9IDczIDYzIDUzIDQzIDMzIDIzIDEzIDAzIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCi0gICpwID0gX21tX3VucGFja2xvX2VwaTMyKHQxLCB0Mik7Ci0gICpxID0gX21tX3VucGFja2hpX2VwaTMyKHQxLCB0Mik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQxNng0KGNvbnN0IHVpbnQ4X3QqIHIwLCBjb25zdCB1aW50OF90KiByOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBwMSwgX19tMTI4aSogcDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBxMCwgX19tMTI4aSogcTEpIHsKLSAgX19tMTI4aSB0MSwgdDI7Ci0gIC8vIEFzc3VtZSB0aGUgcGl4ZWxzIGFyb3VuZCB0aGUgZWRnZSAofCkgYXJlIG51bWJlcmVkIGFzIGZvbGxvd3MKLSAgLy8gICAgICAgICAgICAgICAgMDAgMDEgfCAwMiAwMwotICAvLyAgICAgICAgICAgICAgICAxMCAxMSB8IDEyIDEzCi0gIC8vICAgICAgICAgICAgICAgICAuLi4gIHwgIC4uLgotICAvLyAgICAgICAgICAgICAgICBlMCBlMSB8IGUyIGUzCi0gIC8vICAgICAgICAgICAgICAgIGYwIGYxIHwgZjIgZjMKLSAgLy8KLSAgLy8gcjAgaXMgcG9pbnRpbmcgdG8gdGhlIDB0aCByb3cgKDAwKQotICAvLyByOCBpcyBwb2ludGluZyB0byB0aGUgOHRoIHJvdyAoODApCi0KLSAgLy8gTG9hZAotICAvLyBwMSA9IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxIDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCi0gIC8vIHEwID0gNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgLy8gcDAgPSBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MAotICAvLyBxMSA9IGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyCi0gIExvYWQ4eDQocjAsIHN0cmlkZSwgcDEsIHEwKTsKLSAgTG9hZDh4NChyOCwgc3RyaWRlLCBwMCwgcTEpOwotCi0gIHQxID0gKnAxOwotICB0MiA9ICpxMDsKLSAgLy8gcDEgPSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAotICAvLyBwMCA9IGYxIGUxIGQxIGMxIGIxIGExIDkxIDgxIDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxCi0gIC8vIHEwID0gZjIgZTIgZDIgYzIgYjIgYTIgOTIgODIgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKLSAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMwotICAqcDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDEsICpwMCk7Ci0gICpwMCA9IF9tbV91bnBhY2toaV9lcGk2NCh0MSwgKnAwKTsKLSAgKnEwID0gX21tX3VucGFja2xvX2VwaTY0KHQyLCAqcTEpOwotICAqcTEgPSBfbW1fdW5wYWNraGlfZXBpNjQodDIsICpxMSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNHg0KF9fbTEyOGkqIHgsIHVpbnQ4X3QqIGRzdCwgaW50IHN0cmlkZSkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgZHN0ICs9IHN0cmlkZSkgewotICAgICooKGludDMyX3QqKWRzdCkgPSBfbW1fY3Z0c2kxMjhfc2kzMigqeCk7Ci0gICAgKnggPSBfbW1fc3JsaV9zaTEyOCgqeCwgNCk7Ci0gIH0KLX0KLQotLy8gVHJhbnNwb3NlIGJhY2sgYW5kIHN0b3JlCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTE2eDQodWludDhfdCogcjAsIHVpbnQ4X3QqIHI4LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIHAxLCBfX20xMjhpKiBwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBxMCwgX19tMTI4aSogcTEpIHsKLSAgX19tMTI4aSB0MTsKLQotICAvLyBwMCA9IDcxIDcwIDYxIDYwIDUxIDUwIDQxIDQwIDMxIDMwIDIxIDIwIDExIDEwIDAxIDAwCi0gIC8vIHAxID0gZjEgZjAgZTEgZTAgZDEgZDAgYzEgYzAgYjEgYjAgYTEgYTAgOTEgOTAgODEgODAKLSAgdDEgPSAqcDA7Ci0gICpwMCA9IF9tbV91bnBhY2tsb19lcGk4KCpwMSwgdDEpOwotICAqcDEgPSBfbW1fdW5wYWNraGlfZXBpOCgqcDEsIHQxKTsKLQotICAvLyBxMCA9IDczIDcyIDYzIDYyIDUzIDUyIDQzIDQyIDMzIDMyIDIzIDIyIDEzIDEyIDAzIDAyCi0gIC8vIHExID0gZjMgZjIgZTMgZTIgZDMgZDIgYzMgYzIgYjMgYjIgYTMgYTIgOTMgOTIgODMgODIKLSAgdDEgPSAqcTA7Ci0gICpxMCA9IF9tbV91bnBhY2tsb19lcGk4KHQxLCAqcTEpOwotICAqcTEgPSBfbW1fdW5wYWNraGlfZXBpOCh0MSwgKnExKTsKLQotICAvLyBwMCA9IDMzIDMyIDMxIDMwIDIzIDIyIDIxIDIwIDEzIDEyIDExIDEwIDAzIDAyIDAxIDAwCi0gIC8vIHEwID0gNzMgNzIgNzEgNzAgNjMgNjIgNjEgNjAgNTMgNTIgNTEgNTAgNDMgNDIgNDEgNDAKLSAgdDEgPSAqcDA7Ci0gICpwMCA9IF9tbV91bnBhY2tsb19lcGkxNih0MSwgKnEwKTsKLSAgKnEwID0gX21tX3VucGFja2hpX2VwaTE2KHQxLCAqcTApOwotCi0gIC8vIHAxID0gYjMgYjIgYjEgYjAgYTMgYTIgYTEgYTAgOTMgOTIgOTEgOTAgODMgODIgODEgODAKLSAgLy8gcTEgPSBmMyBmMiBmMSBmMCBlMyBlMiBlMSBlMCBkMyBkMiBkMSBkMCBjMyBjMiBjMSBjMAotICB0MSA9ICpwMTsKLSAgKnAxID0gX21tX3VucGFja2xvX2VwaTE2KHQxLCAqcTEpOwotICAqcTEgPSBfbW1fdW5wYWNraGlfZXBpMTYodDEsICpxMSk7Ci0KLSAgU3RvcmU0eDQocDAsIHIwLCBzdHJpZGUpOwotICByMCArPSA0ICogc3RyaWRlOwotICBTdG9yZTR4NChxMCwgcjAsIHN0cmlkZSk7Ci0KLSAgU3RvcmU0eDQocDEsIHI4LCBzdHJpZGUpOwotICByOCArPSA0ICogc3RyaWRlOwotICBTdG9yZTR4NChxMSwgcjgsIHN0cmlkZSk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQotCi1zdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgLy8gTG9hZAotICBfX20xMjhpIHAxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0pOwotICBfX20xMjhpIHAwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSk7Ci0gIF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwWzBdKTsKLSAgX19tMTI4aSBxMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbc3RyaWRlXSk7Ci0KLSAgRG9GaWx0ZXIyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKLQotICAvLyBTdG9yZQotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSwgcDApOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilwLCBxMCk7Ci19Ci0KLXN0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNlNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBfX20xMjhpIHAxLCBwMCwgcTAsIHExOwotCi0gIHAgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQotCi0gIExvYWQxNng0KHAsIHAgKyA4ICogc3RyaWRlLCAgc3RyaWRlLCAmcDEsICZwMCwgJnEwLCAmcTEpOwotICBEb0ZpbHRlcjIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gpOwotICBTdG9yZTE2eDQocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAxLCAmcDAsICZxMCwgJnExKTsKLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aVNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgazsKLSAgZm9yIChrID0gMzsgayA+IDA7IC0taykgewotICAgIHAgKz0gNCAqIHN0cmlkZTsKLSAgICBTaW1wbGVWRmlsdGVyMTZTU0UyKHAsIHN0cmlkZSwgdGhyZXNoKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNlNTRTIocCwgc3RyaWRlLCB0aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKLQotI2RlZmluZSBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IE1NX0FCUyhwMywgcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAyLCBwMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMSwgcDApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBNQVhfRElGRjIocDMsIHAyLCBwMSwgcDAsIG0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDMsIHAyKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG0gPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAyLCBwMSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBtID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMSwgcDApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZTEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMCAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGUyID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzEgKiBzdHJpZGVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlMyA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVsyICogc3RyaWRlXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZTQgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMyAqIHN0cmlkZV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgTE9BRFVWX0hfRURHRShwLCB1LCB2LCBzdHJpZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodSlbKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwID0gX21tX3VucGFja2xvX2VwaTY0KHAsIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJih2KVsoc3RyaWRlKV0pKTsgICAgICAgIFwKLX0KLQotI2RlZmluZSBMT0FEVVZfSF9FREdFUzQodSwgdiwgc3RyaWRlLCBlMSwgZTIsIGUzLCBlNCkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTE9BRFVWX0hfRURHRShlMSwgdSwgdiwgMCAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIExPQURVVl9IX0VER0UoZTIsIHUsIHYsIDEgKiBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBMT0FEVVZfSF9FREdFKGUzLCB1LCB2LCAyICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTE9BRFVWX0hfRURHRShlNCwgdSwgdiwgMyAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU1RPUkVVVihwLCB1LCB2LCBzdHJpZGUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZ1WyhzdHJpZGUpXSwgcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwID0gX21tX3NybGlfc2kxMjgocCwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJnZbKHN0cmlkZSldLCBwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQ09NUExFWF9GTF9NQVNLKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIGl0aHJlc2gsIG1hc2spIHsgICAgICAgICAgICAgICBcCi0gIF9fbTEyOGkgZmxfeWVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGl0ID0gX21tX3NldDFfZXBpOChpdGhyZXNoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbWFzayA9IF9tbV9zdWJzX2VwdTgobWFzaywgaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG1hc2sgPSBfbW1fY21wZXFfZXBpOChtYXNrLCBfbW1fc2V0emVyb19zaTEyOCgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBOZWVkc0ZpbHRlcigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgJmZsX3llcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbWFzayA9IF9tbV9hbmRfc2kxMjgobWFzaywgZmxfeWVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNlNTRTIodWludDhfdCogcCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgdDE7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyOwotCi0gIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKLSAgTE9BRF9IX0VER0VTNChwIC0gNCAqIHN0cmlkZSwgc3RyaWRlLCB0MSwgcDIsIHAxLCBwMCk7Ci0gIE1BWF9ESUZGMSh0MSwgcDIsIHAxLCBwMCwgbWFzayk7Ci0KLSAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMwotICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcTAsIHExLCBxMiwgdDEpOwotICBNQVhfRElGRjIodDEsIHEyLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI2KCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAvLyBTdG9yZQotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMyAqIHN0cmlkZV0sIHAyKTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTIgKiBzdHJpZGVdLCBwMSk7Ci0gIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0xICogc3RyaWRlXSwgcDApOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFswICogc3RyaWRlXSwgcTApOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsxICogc3RyaWRlXSwgcTEpOwotICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsyICogc3RyaWRlXSwgcTIpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyMTZTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOwotCi0gIHVpbnQ4X3QqIGNvbnN0IGIgPSBwIC0gNDsKLSAgTG9hZDE2eDQoYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsgIC8vIHAzLCBwMiwgcDEsIHAwCi0gIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7Ci0KLSAgTG9hZDE2eDQocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsgIC8vIHEwLCBxMSwgcTIsIHEzCi0gIE1BWF9ESUZGMihxMywgcTIsIHExLCBxMCwgbWFzayk7Ci0KLSAgQ09NUExFWF9GTF9NQVNLKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIGl0aHJlc2gsIG1hc2spOwotICBEb0ZpbHRlcjYoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gIFN0b3JlMTZ4NChiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDApOwotICBTdG9yZTE2eDQocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsKLX0KLQotLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKLXN0YXRpYyB2b2lkIFZGaWx0ZXIxNmlTU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgaW50IGs7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSB0MSwgdDIsIHAxLCBwMCwgcTAsIHExOwotCi0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gICAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHQyLCB0MSwgcDEsIHAwKTsKLSAgICBNQVhfRElGRjEodDIsIHQxLCBwMSwgcDAsIG1hc2spOwotCi0gICAgcCArPSA0ICogc3RyaWRlOwotCi0gICAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMwotICAgIExPQURfSF9FREdFUzQocCwgc3RyaWRlLCBxMCwgcTEsIHQxLCB0Mik7Ci0gICAgTUFYX0RJRkYyKHQyLCB0MSwgcTEsIHEwLCBtYXNrKTsKLQotICAgIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgICBEb0ZpbHRlcjQoJnAxLCAmcDAsICZxMCwgJnExLCAmbWFzaywgaGV2X3RocmVzaCk7Ci0KLSAgICAvLyBTdG9yZQotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0yICogc3RyaWRlXSwgcDEpOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0xICogc3RyaWRlXSwgcDApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWzAgKiBzdHJpZGVdLCBxMCk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbMSAqIHN0cmlkZV0sIHExKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyMTZpU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIGludCBrOwotICB1aW50OF90KiBiOwotICBfX20xMjhpIG1hc2s7Ci0gIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKLQotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgYiA9IHA7Ci0gICAgTG9hZDE2eDQoYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnQyLCAmdDEsICZwMSwgJnAwKTsgIC8vIHAzLCBwMiwgcDEsIHAwCi0gICAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICAgIGIgKz0gNDsgIC8vIGJlZ2lubmluZyBvZiBxMAotICAgIExvYWQxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmdDEsICZ0Mik7ICAvLyBxMCwgcTEsIHEyLCBxMwotICAgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7Ci0KLSAgICBDT01QTEVYX0ZMX01BU0socDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgaXRocmVzaCwgbWFzayk7Ci0gICAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gICAgYiAtPSAyOyAgLy8gYmVnaW5uaW5nIG9mIHAxCi0gICAgU3RvcmUxNng0KGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7Ci0KLSAgICBwICs9IDQ7Ci0gIH0KLX0KLQotLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZwotc3RhdGljIHZvaWQgVkZpbHRlcjhTU0UyKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSB0MSwgcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKLQotICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCi0gIExPQURVVl9IX0VER0VTNCh1IC0gNCAqIHN0cmlkZSwgdiAtIDQgKiBzdHJpZGUsIHN0cmlkZSwgdDEsIHAyLCBwMSwgcDApOwotICBNQVhfRElGRjEodDEsIHAyLCBwMSwgcDAsIG1hc2spOwotCi0gIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgcTAsIHExLCBxMiwgdDEpOwotICBNQVhfRElGRjIodDEsIHEyLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI2KCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICAvLyBTdG9yZQotICBTVE9SRVVWKHAyLCB1LCB2LCAtMyAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocDEsIHUsIHYsIC0yICogc3RyaWRlKTsKLSAgU1RPUkVVVihwMCwgdSwgdiwgLTEgKiBzdHJpZGUpOwotICBTVE9SRVVWKHEwLCB1LCB2LCAwICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMSwgdSwgdiwgMSAqIHN0cmlkZSk7Ci0gIFNUT1JFVVYocTIsIHUsIHYsIDIgKiBzdHJpZGUpOwotfQotCi1zdGF0aWMgdm9pZCBIRmlsdGVyOFNTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgX19tMTI4aSBtYXNrOwotICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKLQotICB1aW50OF90KiBjb25zdCB0dSA9IHUgLSA0OwotICB1aW50OF90KiBjb25zdCB0diA9IHYgLSA0OwotICBMb2FkMTZ4NCh0dSwgdHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsgIC8vIHAzLCBwMiwgcDEsIHAwCi0gIE1BWF9ESUZGMShwMywgcDIsIHAxLCBwMCwgbWFzayk7Ci0KLSAgTG9hZDE2eDQodSwgdiwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOyAgICAvLyBxMCwgcTEsIHEyLCBxMwotICBNQVhfRElGRjIocTMsIHEyLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI2KCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKLQotICBTdG9yZTE2eDQodHUsIHR2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7Ci0gIFN0b3JlMTZ4NCh1LCB2LCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFZGaWx0ZXI4aVNTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSB0MSwgdDIsIHAxLCBwMCwgcTAsIHExOwotCi0gIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKLSAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgdDIsIHQxLCBwMSwgcDApOwotICBNQVhfRElGRjEodDIsIHQxLCBwMSwgcDAsIG1hc2spOwotCi0gIHUgKz0gNCAqIHN0cmlkZTsKLSAgdiArPSA0ICogc3RyaWRlOwotCi0gIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKLSAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgcTAsIHExLCB0MSwgdDIpOwotICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gIC8vIFN0b3JlCi0gIFNUT1JFVVYocDEsIHUsIHYsIC0yICogc3RyaWRlKTsKLSAgU1RPUkVVVihwMCwgdSwgdiwgLTEgKiBzdHJpZGUpOwotICBTVE9SRVVWKHEwLCB1LCB2LCAwICogc3RyaWRlKTsKLSAgU1RPUkVVVihxMSwgdSwgdiwgMSAqIHN0cmlkZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhGaWx0ZXI4aVNTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIF9fbTEyOGkgbWFzazsKLSAgX19tMTI4aSB0MSwgdDIsIHAxLCBwMCwgcTAsIHExOwotICBMb2FkMTZ4NCh1LCB2LCBzdHJpZGUsICZ0MiwgJnQxLCAmcDEsICZwMCk7ICAgLy8gcDMsIHAyLCBwMSwgcDAKLSAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKLQotICB1ICs9IDQ7ICAvLyBiZWdpbm5pbmcgb2YgcTAKLSAgdiArPSA0OwotICBMb2FkMTZ4NCh1LCB2LCBzdHJpZGUsICZxMCwgJnExLCAmdDEsICZ0Mik7ICAvLyBxMCwgcTEsIHEyLCBxMwotICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOwotCi0gIENPTVBMRVhfRkxfTUFTSyhwMSwgcDAsIHEwLCBxMSwgdGhyZXNoLCBpdGhyZXNoLCBtYXNrKTsKLSAgRG9GaWx0ZXI0KCZwMSwgJnAwLCAmcTAsICZxMSwgJm1hc2ssIGhldl90aHJlc2gpOwotCi0gIHUgLT0gMjsgIC8vIGJlZ2lubmluZyBvZiBwMQotICB2IC09IDI7Ci0gIFN0b3JlMTZ4NCh1LCB2LCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7Ci19Ci0KLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudHJ5IHBvaW50Ci0KLWV4dGVybiB2b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpOwotCi12b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0gIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVNTRTI7Ci0KLSAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2U1NFMjsKLSAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2U1NFMjsKLSAgVlA4VkZpbHRlcjggPSBWRmlsdGVyOFNTRTI7Ci0gIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjhTU0UyOwotICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aVNTRTI7Ci0gIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpU1NFMjsKLSAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpU1NFMjsKLSAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpU1NFMjsKLQotICBWUDhTaW1wbGVWRmlsdGVyMTYgPSBTaW1wbGVWRmlsdGVyMTZTU0UyOwotICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTZTU0UyOwotICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aVNTRTI7Ci0gIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpU1NFMjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZHNwLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZHNwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYmVlNTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2RzcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgIFNwZWVkLWNyaXRpY2FsIGZ1bmN0aW9ucy4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfRFNQX0RTUF9IXwotI2RlZmluZSBXRUJQX0RTUF9EU1BfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDUFUgZGV0ZWN0aW9uCi0KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpCi0jZGVmaW5lIFdFQlBfTVNDX1NTRTIgIC8vIFZpc3VhbCBDKysgU1NFMiB0YXJnZXRzCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19TU0UyX18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikKLSNkZWZpbmUgV0VCUF9VU0VfU1NFMgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKSAmJiBkZWZpbmVkKF9fQVJNX0FSQ0hfN0FfXykKLSNkZWZpbmUgV0VCUF9BTkRST0lEX05FT04gIC8vIEFuZHJvaWQgdGFyZ2V0cyB0aGF0IG1pZ2h0IHN1cHBvcnQgTkVPTgotI2VuZGlmCi0KLSNpZiAoZGVmaW5lZChfX0FSTV9ORU9OX18pIHx8IGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pKSAmJiAhZGVmaW5lZChfX2FhcmNoNjRfXykKLSNkZWZpbmUgV0VCUF9VU0VfTkVPTgotI2VuZGlmCi0KLXR5cGVkZWYgZW51bSB7Ci0gIGtTU0UyLAotICBrU1NFMywKLSAga05FT04KLX0gQ1BVRmVhdHVyZTsKLS8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgQ1BVIHN1cHBvcnRzIHRoZSBmZWF0dXJlLgotdHlwZWRlZiBpbnQgKCpWUDhDUFVJbmZvKShDUFVGZWF0dXJlIGZlYXR1cmUpOwotZXh0ZXJuIFZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbzsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVuY29kaW5nCi0KLS8vIFRyYW5zZm9ybXMKLS8vIFZQOElkY3Q6IERvZXMgb25lIG9mIHR3byBpbnZlcnNlIHRyYW5zZm9ybXMuIElmIGRvX3R3byBpcyBzZXQsIHRoZSB0cmFuc2Zvcm1zCi0vLyAgICAgICAgICB3aWxsIGJlIGRvbmUgZm9yIChyZWYsIGluLCBkc3QpIGFuZCAocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCkuCi10eXBlZGVmIHZvaWQgKCpWUDhJZGN0KShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZG9fdHdvKTsKLXR5cGVkZWYgdm9pZCAoKlZQOEZkY3QpKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpOwotdHlwZWRlZiB2b2lkICgqVlA4V0hUKShjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KTsKLWV4dGVybiBWUDhJZGN0IFZQOElUcmFuc2Zvcm07Ci1leHRlcm4gVlA4RmRjdCBWUDhGVHJhbnNmb3JtOwotZXh0ZXJuIFZQOFdIVCBWUDhJVHJhbnNmb3JtV0hUOwotZXh0ZXJuIFZQOFdIVCBWUDhGVHJhbnNmb3JtV0hUOwotLy8gUHJlZGljdGlvbnMKLS8vICpkc3QgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLiAqdG9wIGFuZCAqbGVmdCBjYW4gYmUgTlVMTC4KLXR5cGVkZWYgdm9pZCAoKlZQOEludHJhUHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCk7Ci10eXBlZGVmIHZvaWQgKCpWUDhJbnRyYTRQcmVkcykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90KiB0b3ApOwotZXh0ZXJuIFZQOEludHJhNFByZWRzIFZQOEVuY1ByZWRMdW1hNDsKLWV4dGVybiBWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRMdW1hMTY7Ci1leHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkQ2hyb21hODsKLQotdHlwZWRlZiBpbnQgKCpWUDhNZXRyaWMpKGNvbnN0IHVpbnQ4X3QqIHBpeCwgY29uc3QgdWludDhfdCogcmVmKTsKLWV4dGVybiBWUDhNZXRyaWMgVlA4U1NFMTZ4MTYsIFZQOFNTRTE2eDgsIFZQOFNTRTh4OCwgVlA4U1NFNHg0OwotdHlwZWRlZiBpbnQgKCpWUDhXTWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHdlaWdodHMpOwotZXh0ZXJuIFZQOFdNZXRyaWMgVlA4VERpc3RvNHg0LCBWUDhURGlzdG8xNngxNjsKLQotdHlwZWRlZiB2b2lkICgqVlA4QmxvY2tDb3B5KShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCk7Ci1leHRlcm4gVlA4QmxvY2tDb3B5IFZQOENvcHk0eDQ7Ci0vLyBRdWFudGl6YXRpb24KLXN0cnVjdCBWUDhNYXRyaXg7ICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgotdHlwZWRlZiBpbnQgKCpWUDhRdWFudGl6ZUJsb2NrKShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgY29uc3Qgc3RydWN0IFZQOE1hdHJpeCogY29uc3QgbXR4KTsKLWV4dGVybiBWUDhRdWFudGl6ZUJsb2NrIFZQOEVuY1F1YW50aXplQmxvY2s7Ci0KLS8vIENvbGxlY3QgaGlzdG9ncmFtIGZvciBzdXNjZXB0aWJpbGl0eSBjYWxjdWxhdGlvbiBhbmQgYWNjdW11bGF0ZSBpbiBoaXN0b1tdLgotc3RydWN0IFZQOEhpc3RvZ3JhbTsKLXR5cGVkZWYgdm9pZCAoKlZQOENIaXN0bykoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKTsKLWV4dGVybiBjb25zdCBpbnQgVlA4RHNwU2NhblsxNiArIDQgKyA0XTsKLWV4dGVybiBWUDhDSGlzdG8gVlA4Q29sbGVjdEhpc3RvZ3JhbTsKLQotdm9pZCBWUDhFbmNEc3BJbml0KHZvaWQpOyAgIC8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb2YgdGhlIGFib3ZlCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWNvZGluZwotCi10eXBlZGVmIHZvaWQgKCpWUDhEZWNJZGN0KShjb25zdCBpbnQxNl90KiBjb2VmZnMsIHVpbnQ4X3QqIGRzdCk7Ci0vLyB3aGVuIGRvaW5nIHR3byB0cmFuc2Zvcm1zLCBjb2VmZnMgaXMgYWN0dWFsbHkgaW50MTZfdFsyXVsxNl0uCi10eXBlZGVmIHZvaWQgKCpWUDhEZWNJZGN0MikoY29uc3QgaW50MTZfdCogY29lZmZzLCB1aW50OF90KiBkc3QsIGludCBkb190d28pOwotZXh0ZXJuIFZQOERlY0lkY3QyIFZQOFRyYW5zZm9ybTsKLWV4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybVVWOwotZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtREM7Ci1leHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQ1VWOwotZXh0ZXJuIFZQOFdIVCBWUDhUcmFuc2Zvcm1XSFQ7Ci0KLS8vICpkc3QgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLCB3aXRoIHN0cmlkZSBCUFMuIEJvdW5kYXJ5IHNhbXBsZXMgYXJlCi0vLyBhc3N1bWVkIGFjY2Vzc2libGUgd2hlbiBuZWVkZWQuCi10eXBlZGVmIHZvaWQgKCpWUDhQcmVkRnVuYykodWludDhfdCogZHN0KTsKLWV4dGVybiBjb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTE2Wy8qIE5VTV9CX0RDX01PREVTICovXTsKLWV4dGVybiBjb25zdCBWUDhQcmVkRnVuYyBWUDhQcmVkQ2hyb21hOFsvKiBOVU1fQl9EQ19NT0RFUyAqL107Ci1leHRlcm4gY29uc3QgVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWE0Wy8qIE5VTV9CTU9ERVMgKi9dOwotCi0vLyBzaW1wbGUgZmlsdGVyIChvbmx5IGZvciBsdW1hKQotdHlwZWRlZiB2b2lkICgqVlA4U2ltcGxlRmlsdGVyRnVuYykodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCk7Ci1leHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTY7Ci1leHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTY7Ci1leHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOyAgLy8gZmlsdGVyIDMgaW5uZXIgZWRnZXMKLWV4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNmk7Ci0KLS8vIHJlZ3VsYXIgZmlsdGVyIChvbiBib3RoIG1hY3JvYmxvY2sgZWRnZXMgYW5kIGlubmVyIGVkZ2VzKQotdHlwZWRlZiB2b2lkICgqVlA4THVtYUZpbHRlckZ1bmMpKHVpbnQ4X3QqIGx1bWEsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7Ci10eXBlZGVmIHZvaWQgKCpWUDhDaHJvbWFGaWx0ZXJGdW5jKSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7Ci0vLyBvbiBvdXRlciBlZGdlCi1leHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OwotZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNjsKLWV4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4OwotZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7Ci0KLS8vIG9uIGlubmVyIGVkZ2UKLWV4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOyAgIC8vIGZpbHRlcmluZyAzIGlubmVyIGVkZ2VzIGFsdG9nZXRoZXIKLWV4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTZpOwotZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOyAgLy8gZmlsdGVyaW5nIHUgYW5kIHYgYWx0b2dldGhlcgotZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjhpOwotCi0vLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgdXNpbmcgdGhlIGFib3ZlCi12b2lkIFZQOERzcEluaXQodm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXZWJQIEkvTwotCi0jZGVmaW5lIEZBTkNZX1VQU0FNUExJTkcgICAvLyB1bmRlZmluZWQgdG8gcmVtb3ZlIGZhbmN5IHVwc2FtcGxpbmcgc3VwcG9ydAotCi10eXBlZGVmIHZvaWQgKCpXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMpKAotICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwKLSAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsCi0gICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LAotICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pOwotCi0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotCi0vLyBGYW5jeSB1cHNhbXBsaW5nIGZ1bmN0aW9ucyB0byBjb252ZXJ0IFlVViB0byBSR0IoQSkgbW9kZXMKLWV4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKLQotLy8gSW5pdGlhbGl6ZXMgU1NFMiB2ZXJzaW9uIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXJzLgotdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKHZvaWQpOwotCi0vLyBORU9OIHZlcnNpb24KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKTsKLQotI2VuZGlmICAgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gUG9pbnQtc2FtcGxpbmcgbWV0aG9kcy4KLXR5cGVkZWYgdm9pZCAoKldlYlBTYW1wbGVMaW5lUGFpckZ1bmMpKAotICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwKLSAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAotICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pOwotCi1leHRlcm4gY29uc3QgV2ViUFNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQU2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKLQotLy8gR2VuZXJhbCBmdW5jdGlvbiBmb3IgY29udmVydGluZyB0d28gbGluZXMgb2YgQVJHQiBvciBSR0JBLgotLy8gJ2FscGhhX2lzX2xhc3QnIHNob3VsZCBiZSB0cnVlIGlmIDB4ZmYwMDAwMDAgaXMgc3RvcmVkIGluIG1lbW9yeSBhcwotLy8gYXMgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiAobGl0dGxlIGVuZGlhbikuCi1XZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKGludCBhbHBoYV9pc19sYXN0KTsKLQotLy8gWVVWNDQ0LT5SR0IgY29udmVydGVycwotdHlwZWRlZiB2b2lkICgqV2ViUFlVVjQ0NENvbnZlcnRlcikoY29uc3QgdWludDhfdCogeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOwotCi1leHRlcm4gY29uc3QgV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1svKiBNT0RFX0xBU1QgKi9dOwotCi0vLyBNYWluIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZAotdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnModm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcmUtbXVsdGlwbHkgcGxhbmVzIHdpdGggYWxwaGEgdmFsdWVzCi0KLS8vIEFwcGx5IGFscGhhIHByZS1tdWx0aXBseSBvbiBhbiByZ2JhLCBiZ3JhIG9yIGFyZ2IgcGxhbmUgb2Ygc2l6ZSB3ICogaC4KLS8vIGFscGhhX2ZpcnN0IHNob3VsZCBiZSAwIGZvciBhcmdiLCAxIGZvciByZ2JhIG9yIGJncmEgKHdoZXJlIGFscGhhIGlzIGxhc3QpLgotZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5KSgKLSAgICB1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7Ci0KLS8vIFNhbWUsIGJ1ZiBzcGVjaWZpY2FsbHkgZm9yIFJHQkE0NDQ0IGZvcm1hdAotZXh0ZXJuIHZvaWQgKCpXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCkoCi0gICAgdWludDhfdCogcmdiYTQ0NDQsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSk7Ci0KLS8vIFRvIGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgdXNpbmcgdGhlIGFib3ZlLgotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5KHZvaWQpOwotCi12b2lkIFdlYlBJbml0UHJlbXVsdGlwbHlTU0UyKHZvaWQpOyAgIC8vIHNob3VsZCBub3QgYmUgY2FsbGVkIGRpcmVjdGx5Lgotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5TkVPTih2b2lkKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9EU1BfRFNQX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfbmVvbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjI1NmU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfbmVvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBUk0gTkVPTiB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBhZGFwdGVkIGZyb20gbGlidnB4IChodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlLykKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotCi0jaW5jbHVkZSAiLi4vZW5jL3ZwOGVuY2kuaCIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQotCi0vLyBJbnZlcnNlIHRyYW5zZm9ybS4KLS8vIFRoaXMgY29kZSBpcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyBUcmFuc2Zvcm1PbmVORU9OIGluIHRoZSBkZWNvZGVyLCBleGNlcHQKLS8vIGZvciBzdWJ0cmFjdGlvbiB0byAqcmVmLiBTZWUgdGhlIGNvbW1lbnRzIHRoZXJlIGZvciBhbGdvcml0aG1pYyBleHBsYW5hdGlvbnMuCi1zdGF0aWMgdm9pZCBJVHJhbnNmb3JtT25lKGNvbnN0IHVpbnQ4X3QqIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCBpbnQga0JQUyA9IEJQUzsKLSAgY29uc3QgaW50MTZfdCBrQzFDMltdID0geyAyMDA5MSwgMTc3MzQsIDAsIDAgfTsgIC8vIGtDMSAvIChrQzIgPj4gMSkgLyAwIC8gMAotCi0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgICJ2bGQxLjE2ICAgICAgICAge3ExLCBxMn0sIFslW2luXV0gICAgICAgICAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAge2QwfSwgWyVba0MxQzJdXSAgICAgICAgICAgIFxuIgotCi0gICAgLy8gZDI6IGluWzBdCi0gICAgLy8gZDM6IGluWzhdCi0gICAgLy8gZDQ6IGluWzRdCi0gICAgLy8gZDU6IGluWzEyXQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcTggPSB7aW5bNF0sIGluWzEyXX0gKiBrQzEgKiAyID4+IDE2Ci0gICAgLy8gcTkgPSB7aW5bNF0sIGluWzEyXX0gKiBrQzIgPj4gMTYKLSAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKLSAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGQyMiA9IGEgPSBpblswXSArIGluWzhdCi0gICAgLy8gZDIzID0gYiA9IGluWzBdIC0gaW5bOF0KLSAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vICBxOCA9IGluWzRdL1sxMl0gKiBrQzEgPj4gMTYKLSAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIEFkZCB7aW5bNF0sIGluWzEyXX0gYmFjayBhZnRlciB0aGUgbXVsdGlwbGljYXRpb24uCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYwotICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcTggPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMSAqIDIgPj4gMTYKLSAgICAvLyBxOSA9IHt0bXBbNF0sIHRtcFsxMl19ICoga0MyID4+IDE2Ci0gICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCi0gICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjIgPSBhID0gdG1wWzBdICsgdG1wWzhdCi0gICAgLy8gZDIzID0gYiA9IHRtcFswXSAtIHRtcFs4XQotICAgICJ2cWFkZC5zMTYgICAgICAgZDIyLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cXN1Yi5zMTYgICAgICAgZDIzLCBkMiwgZDMgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBxOCwgcTIsIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMjAgPSBjID0gaW5bNF0qa0MyIC0gaW5bMTJdKmtDMQotICAgIC8vIGQyMSA9IGQgPSBpbls0XSprQzEgKyBpblsxMl0qa0MyCi0gICAgInZxc3ViLnMxNiAgICAgICBkMjAsIGQxOCwgZDE3ICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMjEsIGQxOSwgZDE2ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBkMiA9IHRtcFswXSA9IGEgKyBkCi0gICAgLy8gZDMgPSB0bXBbMV0gPSBiICsgYwotICAgIC8vIGQ0ID0gdG1wWzJdID0gYiAtIGMKLSAgICAvLyBkNSA9IHRtcFszXSA9IGEgLSBkCi0gICAgInZxYWRkLnMxNiAgICAgICBkMiwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxYWRkLnMxNiAgICAgICBkMywgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNCwgZDIzLCBkMjAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZxc3ViLnMxNiAgICAgICBkNSwgZDIyLCBkMjEgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ2WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzBdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQ3WzFdLCBbJVtyZWZdXSwgJVtrQlBTXSAgICBcbiIKLQotICAgICJzdWIgICAgICAgICAlW3JlZl0sICVbcmVmXSwgJVtrQlBTXSwgbHNsICMyIFxuIgotCi0gICAgLy8gKHZhbCkgKyA0ID4+IDMKLSAgICAidnJzaHIuczE2ICAgICAgIGQyLCBkMiwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQzLCBkMywgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ0LCBkNCwgIzMgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnJzaHIuczE2ICAgICAgIGQ1LCBkNSwgIzMgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2emlwLjE2ICAgICAgICAgcTEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gTXVzdCBhY2N1bXVsYXRlIGJlZm9yZSBzYXR1cmF0aW5nCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOCwgZDYgICAgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnU4ICAgICAgICBxOSwgZDcgICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFhZGQuczE2ICAgICAgIHExLCBxMSwgcTggICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnFhZGQuczE2ICAgICAgIHEyLCBxMiwgcTkgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2cW1vdnVuLnMxNiAgICAgZDAsIHExICAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2cW1vdnVuLnMxNiAgICAgZDEsIHEyICAgICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZzdDEuMzIgICAgICAgICBkMFswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMFsxXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVswXSwgWyVbZHN0XV0sICVba0JQU10gICAgXG4iCi0gICAgInZzdDEuMzIgICAgICAgICBkMVsxXSwgWyVbZHN0XV0gICAgICAgICAgICAgXG4iCi0KLSAgICA6IFtpbl0gIityIihpbiksIFtkc3RdICIrciIoZHN0KSAgICAgICAgICAgICAgIC8vIG1vZGlmaWVkIHJlZ2lzdGVycwotICAgIDogW2tCUFNdICJyIihrQlBTKSwgW2tDMUMyXSAiciIoa0MxQzIpLCBbcmVmXSAiciIocmVmKSAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInE4IiwgInE5IiwgInExMCIsICJxMTEiICAvLyBjbG9iYmVyZWQKLSAgKTsKLX0KLQotc3RhdGljIHZvaWQgSVRyYW5zZm9ybShjb25zdCB1aW50OF90KiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKLSAgSVRyYW5zZm9ybU9uZShyZWYsIGluLCBkc3QpOwotICBpZiAoZG9fdHdvKSB7Ci0gICAgSVRyYW5zZm9ybU9uZShyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKLSAgfQotfQotCi0vLyBTYW1lIGNvZGUgYXMgZGVjX25lb24uYwotc3RhdGljIHZvaWQgSVRyYW5zZm9ybVdIVChjb25zdCBpbnQxNl90KiBpbiwgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IGludCBrU3RlcCA9IDMyOyAgLy8gVGhlIHN0b3JlIGlzIG9ubHkgaW5jcmVtZW50aW5nIHRoZSBwb2ludGVyIGFzIGlmIHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFkIHN0b3JlZCBhIHNpbmdsZSBieXRlLgotICBfX2FzbV9fIHZvbGF0aWxlICgKLSAgICAvLyBwYXJ0IDEKLSAgICAvLyBsb2FkIGRhdGEgaW50byBxMCwgcTEKLSAgICAidmxkMS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtpbl1dICAgICAgICAgICBcbiIKLQotICAgICJ2YWRkbC5zMTYgICAgICAgcTIsIGQwLCBkMyAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IGluWzBdICsgaW5bMTJdCi0gICAgInZhZGRsLnMxNiAgICAgICBxMywgZDEsIGQyICAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gaW5bNF0gKyBpbls4XQotICAgICJ2c3VibC5zMTYgICAgICAgcTQsIGQxLCBkMiAgICAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGluWzRdIC0gaW5bOF0KLSAgICAidnN1YmwuczE2ICAgICAgIHE1LCBkMCwgZDMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBpblswXSAtIGluWzEyXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTIsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFswXSA9IGEwICsgYTEKLSAgICAidnN1Yi5zMzIgICAgICAgIHEyLCBxMiwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gdG1wWzhdID0gYTAgLSBhMQotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHE1LCBxNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB0bXBbNF0gPSBhMyArIGEyCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTUsIHE0ICAgICAgICAgICAgICAgICAgXG4iIC8vIHRtcFsxMl0gPSBhMyAtIGEyCi0KLSAgICAvLyBUcmFuc3Bvc2UKLSAgICAvLyBxMCA9IHRtcFswLCA0LCA4LCAxMl0sIHExID0gdG1wWzIsIDYsIDEwLCAxNF0KLSAgICAvLyBxMiA9IHRtcFsxLCA1LCA5LCAxM10sIHEzID0gdG1wWzMsIDcsIDExLCAxNV0KLSAgICAidnN3cCAgICAgICAgICAgIGQxLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMCwgcTIKLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMSwgcTMKLSAgICAidnRybi4zMiAgICAgICAgIHEwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHEyLCBxMyAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bW92LnMzMiAgICAgICAgcTQsICMzICAgICAgICAgICAgICAgICAgICAgIFxuIiAvLyBkYyA9IDMKLSAgICAidmFkZC5zMzIgICAgICAgIHEwLCBxMCwgcTQgICAgICAgICAgICAgICAgICBcbiIgLy8gZGMgPSB0bXBbMF0gKyAzCi0gICAgInZhZGQuczMyICAgICAgICBxNiwgcTAsIHEzICAgICAgICAgICAgICAgICAgXG4iIC8vIGEwID0gZGMgKyB0bXBbM10KLSAgICAidmFkZC5zMzIgICAgICAgIHE3LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSB0bXBbMV0gKyB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxMSwgcTIgICAgICAgICAgICAgICAgICBcbiIgLy8gYTIgPSB0bXBbMV0gLSB0bXBbMl0KLSAgICAidnN1Yi5zMzIgICAgICAgIHE5LCBxMCwgcTMgICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkYyAtIHRtcFszXQotCi0gICAgInZhZGQuczMyICAgICAgICBxMCwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMCwgcTAsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCArIGExKSA+PiAzCi0gICAgInZhZGQuczMyICAgICAgICBxMSwgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTEsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyArIGEyKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMiwgcTYsIHE3ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMiwgcTIsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMCAtIGExKSA+PiAzCi0gICAgInZzdWIuczMyICAgICAgICBxMywgcTksIHE4ICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZzaHJuLnMzMiAgICAgICBkMywgcTMsICMzICAgICAgICAgICAgICAgICAgXG4iIC8vIChhMyAtIGEyKSA+PiAzCi0KLSAgICAvLyBzZXQgdGhlIHJlc3VsdHMgdG8gb3V0cHV0Ci0gICAgInZzdDEuMTYgICAgICAgICBkMFswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlswXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1swXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1sxXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlsyXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1syXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMFszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMVszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkMlszXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0gICAgInZzdDEuMTYgICAgICAgICBkM1szXSwgWyVbb3V0XV0sICVba1N0ZXBdICAgICAgXG4iCi0KLSAgICA6IFtvdXRdICIrciIob3V0KSAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCi0gICAgOiBbaW5dICJyIihpbiksIFtrU3RlcF0gInIiKGtTdGVwKSAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwKLSAgICAgICJxNSIsICJxNiIsICJxNyIsICJxOCIsICJxOSIgLy8gY2xvYmJlcmVkCi0gICk7Ci19Ci0KLS8vIEZvcndhcmQgdHJhbnNmb3JtLgotCi0vLyBhZGFwdGVkIGZyb20gdnA4L2VuY29kZXIvYXJtL25lb24vc2hvcnRmZGN0X25lb24uYXNtCi1zdGF0aWMgY29uc3QgaW50MTZfdCBrQ29lZmYxNltdID0gewotICA1MzUyLCAgNTM1MiwgIDUzNTIsIDUzNTIsIDIyMTcsICAyMjE3LCAgMjIxNywgMjIxNwotfTsKLXN0YXRpYyBjb25zdCBpbnQzMl90IGtDb2VmZjMyW10gPSB7Ci0gICAxODEyLCAgMTgxMiwgIDE4MTIsICAxODEyLAotICAgIDkzNywgICA5MzcsICAgOTM3LCAgIDkzNywKLSAgMTIwMDAsIDEyMDAwLCAxMjAwMCwgMTIwMDAsCi0gIDUxMDAwLCA1MTAwMCwgNTEwMDAsIDUxMDAwCi19OwotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKLSAgY29uc3QgaW50IGtCUFMgPSBCUFM7Ci0gIGNvbnN0IHVpbnQ4X3QqIHNyY19wdHIgPSBzcmM7Ci0gIGNvbnN0IHVpbnQ4X3QqIHJlZl9wdHIgPSByZWY7Ci0gIGNvbnN0IGludDE2X3QqIGNvZWZmMTYgPSBrQ29lZmYxNjsKLSAgY29uc3QgaW50MzJfdCogY29lZmYzMiA9IGtDb2VmZjMyOwotCi0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgIC8vIGxvYWQgc3JjIGludG8gcTQsIHE1IGluIGhpZ2ggaGFsZgotICAgICJ2bGQxLjgge2Q4fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxMH0sIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2Q5fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgotICAgICJ2bGQxLjgge2QxMX0sIFslW3NyY19wdHJdXSAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCByZWYgaW50byBxNiwgcTcgaW4gaGlnaCBoYWxmCi0gICAgInZsZDEuOCB7ZDEyfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDE0fSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDEzfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCi0gICAgInZsZDEuOCB7ZDE1fSwgWyVbcmVmX3B0cl1dICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBQYWNrIHRoZSBoaWdoIHZhbHVlcyBpbiB0byBxNCBhbmQgcTYKLSAgICAidnRybi4zMiAgICAgcTQsIHE1ICAgICAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgcTYsIHE3ICAgICAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGRbMC0zXSA9IHNyYyAtIHJlZgotICAgICJ2c3VibC51OCAgICBxMCwgZDgsIGQxMiAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC51OCAgICBxMSwgZDksIGQxMyAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCBjb2VmZjE2IGludG8gcTgoZDE2PTUzNTIsIGQxNz0yMjE3KQotICAgICJ2bGQxLjE2ICAgICB7cTh9LCBbJVtjb2VmZjE2XV0gICAgICAgICAgIFxuIgotCi0gICAgLy8gbG9hZCBjb2VmZjMyIGhpZ2ggaGFsZiBpbnRvIHE5ID0gMTgxMiwgcTEwID0gOTM3Ci0gICAgInZsZDEuMzIgICAgIHtxOSwgcTEwfSwgWyVbY29lZmYzMl1dISAgICAgXG4iCi0KLSAgICAvLyBsb2FkIGNvZWZmMzIgbG93IGhhbGYgaW50byBxMTE9MTIwMDAsIHExMj01MTAwMAotICAgICJ2bGQxLjMyICAgICB7cTExLHExMn0sIFslW2NvZWZmMzJdXSAgICAgIFxuIgotCi0gICAgLy8gcGFydCAxCi0gICAgLy8gVHJhbnNwb3NlLiBSZWdpc3RlciBkTiBpcyB0aGUgc2FtZSBhcyBkTiBpbiBDCi0gICAgInZ0cm4uMzIgICAgICAgICBkMCwgZDIgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBkMSwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMTYgICAgICAgICBkMCwgZDEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMTYgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBkMCArIGQzCi0gICAgInZhZGQuczE2ICAgICAgICBkNSwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGExID0gZDEgKyBkMgotICAgICJ2c3ViLnMxNiAgICAgICAgZDYsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGQxIC0gZDIKLSAgICAidnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkMCAtIGQzCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gYTAgKyBhMQotICAgICJ2c2hsLnMxNiAgICAgICAgZDAsIGQwLCAjMyAgICAgICAgICAgICAgIFxuIiAvLyB0ZW1wWzAraSo0XSA9IChhMCthMSkgPDwgMwotICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBhMCAtIGExCi0gICAgInZzaGwuczE2ICAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgXG4iIC8vICh0ZW1wWzIraSo0XSA9IChhMC1hMSkgPDwgMwotCi0gICAgInZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iIC8vIGEzKjUzNTIgKyAxODEyCi0gICAgInZtbGFsLnMxNiAgICAgICBxMTAsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcKLSAgICAidm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIgLy8gYTIqMjIxNyArIGEzKjUzNTIgKyAxODEyCi0gICAgInZtbHNsLnMxNiAgICAgICBxMTAsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcgLSBhMio1MzUyCi0KLSAgICAvLyB0ZW1wWzEraSo0XSA9IChkMioyMjE3ICsgZDMqNTM1MiArIDE4MTIpID4+IDkKLSAgICAvLyB0ZW1wWzMraSo0XSA9IChkMyoyMjE3ICsgOTM3IC0gZDIqNTM1MikgPj4gOQotICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHE5LCAjOSAgICAgICAgICAgICAgIFxuIgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMCwgIzkgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gcGFydCAyCi0gICAgLy8gdHJhbnNwb3NlIGQwPWlwWzBdLCBkMT1pcFs0XSwgZDI9aXBbOF0sIGQzPWlwWzEyXQotICAgICJ2dHJuLjMyICAgICAgICAgZDAsIGQyICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgZDEsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDAsIGQxICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgInZtb3YuczE2ICAgICAgICBkMjYsICM3ICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSBpcFswXSArIGlwWzEyXQotICAgICJ2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBiMSA9IGlwWzRdICsgaXBbOF0KLSAgICAidnN1Yi5zMTYgICAgICAgIGQ2LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYzEgPSBpcFs0XSAtIGlwWzhdCi0gICAgInZhZGQuczE2ICAgICAgICBkNCwgZDQsIGQyNiAgICAgICAgICAgICAgXG4iIC8vIGExICsgNwotICAgICJ2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBkMSA9IGlwWzBdIC0gaXBbMTJdCi0KLSAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gb3BbMF0gPSBhMSArIGIxICsgNwotICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBvcFs4XSA9IGExIC0gYjEgKyA3Ci0KLSAgICAidm1sYWwuczE2ICAgICAgIHExMSwgZDcsIGQxNiAgICAgICAgICAgICBcbiIgLy8gZDEqNTM1MiArIDEyMDAwCi0gICAgInZtbGFsLnMxNiAgICAgICBxMTIsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgKyA1MTAwMAotCi0gICAgInZjZXEuczE2ICAgICAgICBkNCwgZDcsICMwICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnNoci5zMTYgICAgICAgIGQwLCBkMCwgIzQgICAgICAgICAgICAgICBcbiIKLSAgICAidnNoci5zMTYgICAgICAgIGQyLCBkMiwgIzQgICAgICAgICAgICAgICBcbiIKLQotICAgICJ2bWxhbC5zMTYgICAgICAgcTExLCBkNiwgZDE3ICAgICAgICAgICAgIFxuIiAvLyBjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwCi0gICAgInZtbHNsLnMxNiAgICAgICBxMTIsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDAKLQotICAgICJ2bXZuICAgICAgICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAvLyAhKGQxID09IDApCi0gICAgLy8gb3BbNF0gPSAoYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMCk+PjE2Ci0gICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTExLCAjMTYgICAgICAgICAgICAgXG4iCi0gICAgLy8gb3BbNF0gKz0gKGQxIT0wKQotICAgICJ2c3ViLnMxNiAgICAgICAgZDEsIGQxLCBkNCAgICAgICAgICAgICAgIFxuIgotICAgIC8vIG9wWzEyXT0gKGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDApPj4xNgotICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMiwgIzE2ICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gc2V0IHJlc3VsdCB0byBvdXQgYXJyYXkKLSAgICAidnN0MS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtvdXRdXSAgIFxuIgotICAgIDogW3NyY19wdHJdICIrciIoc3JjX3B0ciksIFtyZWZfcHRyXSAiK3IiKHJlZl9wdHIpLAotICAgICAgW2NvZWZmMzJdICIrciIoY29lZmYzMikgICAgICAgICAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCi0gICAgOiBba0JQU10gInIiKGtCUFMpLCBbY29lZmYxNl0gInIiKGNvZWZmMTYpLAotICAgICAgW291dF0gInIiKG91dCkgICAgICAgICAgICAgICAgICAgLy8gY29uc3RhbnRzCi0gICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgInE4IiwgInE5IiwKLSAgICAgICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiICAgICAgIC8vIGNsb2JiZXJlZAotICApOwotfQotCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgY29uc3QgaW50IGtTdGVwID0gMzI7Ci0gIF9fYXNtX18gdm9sYXRpbGUgKAotICAgIC8vIGQwID0gaW5bMCAqIDE2XSAsIGQxID0gaW5bMSAqIDE2XQotICAgIC8vIGQyID0gaW5bMiAqIDE2XSAsIGQzID0gaW5bMyAqIDE2XQotICAgICJ2bGQxLjE2ICAgICAgICAgZDBbMF0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMVswXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQyWzBdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDNbMF0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMFsxXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQxWzFdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDJbMV0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkM1sxXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQwWzJdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDFbMl0sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMlsyXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQzWzJdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDBbM10sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0gICAgInZsZDEuMTYgICAgICAgICBkMVszXSwgWyVbaW5dXSwgJVtrU3RlcF0gICBcbiIKLSAgICAidmxkMS4xNiAgICAgICAgIGQyWzNdLCBbJVtpbl1dLCAlW2tTdGVwXSAgIFxuIgotICAgICJ2bGQxLjE2ICAgICAgICAgZDNbM10sIFslW2luXV0sICVba1N0ZXBdICAgXG4iCi0KLSAgICAidmFkZGwuczE2ICAgICAgIHEyLCBkMCwgZDIgICAgICAgICAgICAgICAgIFxuIiAvLyBhMD0oaW5bMCoxNl0raW5bMioxNl0pCi0gICAgInZhZGRsLnMxNiAgICAgICBxMywgZDEsIGQzICAgICAgICAgICAgICAgICBcbiIgLy8gYTE9KGluWzEqMTZdK2luWzMqMTZdKQotICAgICJ2c3VibC5zMTYgICAgICAgcTQsIGQxLCBkMyAgICAgICAgICAgICAgICAgXG4iIC8vIGEyPShpblsxKjE2XS1pblszKjE2XSkKLSAgICAidnN1YmwuczE2ICAgICAgIHE1LCBkMCwgZDIgICAgICAgICAgICAgICAgIFxuIiAvLyBhMz0oaW5bMCoxNl0taW5bMioxNl0pCi0KLSAgICAidnFhZGQuczMyICAgICAgIHE2LCBxMiwgcTMgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCArIGExCi0gICAgInZxYWRkLnMzMiAgICAgICBxNywgcTUsIHE0ICAgICAgICAgICAgICAgICBcbiIgLy8gYTMgKyBhMgotICAgICJ2cXN1Yi5zMzIgICAgICAgcTgsIHE1LCBxNCAgICAgICAgICAgICAgICAgXG4iIC8vIGEzIC0gYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE5LCBxMiwgcTMgICAgICAgICAgICAgICAgIFxuIiAvLyBhMCAtIGExCi0KLSAgICAvLyBUcmFuc3Bvc2UKLSAgICAvLyBxNiA9IHRtcFswLCAxLCAgMiwgIDNdIDsgcTcgPSB0bXBbIDQsICA1LCAgNiwgIDddCi0gICAgLy8gcTggPSB0bXBbOCwgOSwgMTAsIDExXSA7IHE5ID0gdG1wWzEyLCAxMywgMTQsIDE1XQotICAgICJ2c3dwICAgICAgICAgICAgZDEzLCBkMTYgICAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQgcTAsIHEyCi0gICAgInZzd3AgICAgICAgICAgICBkMTUsIGQxOCAgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NCBxMSwgcTMKLSAgICAidnRybi4zMiAgICAgICAgIHE2LCBxNyAgICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgcTgsIHE5ICAgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAidnFhZGQuczMyICAgICAgIHEwLCBxNiwgcTggICAgICAgICAgICAgICAgIFxuIiAvLyBhMCA9IHRtcFswXSArIHRtcFs4XQotICAgICJ2cWFkZC5zMzIgICAgICAgcTEsIHE3LCBxOSAgICAgICAgICAgICAgICAgXG4iIC8vIGExID0gdG1wWzRdICsgdG1wWzEyXQotICAgICJ2cXN1Yi5zMzIgICAgICAgcTIsIHE3LCBxOSAgICAgICAgICAgICAgICAgXG4iIC8vIGEyID0gdG1wWzRdIC0gdG1wWzEyXQotICAgICJ2cXN1Yi5zMzIgICAgICAgcTMsIHE2LCBxOCAgICAgICAgICAgICAgICAgXG4iIC8vIGEzID0gdG1wWzBdIC0gdG1wWzhdCi0KLSAgICAidnFhZGQuczMyICAgICAgIHE0LCBxMCwgcTEgICAgICAgICAgICAgICAgIFxuIiAvLyBiMCA9IGEwICsgYTEKLSAgICAidnFhZGQuczMyICAgICAgIHE1LCBxMywgcTIgICAgICAgICAgICAgICAgIFxuIiAvLyBiMSA9IGEzICsgYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE2LCBxMywgcTIgICAgICAgICAgICAgICAgIFxuIiAvLyBiMiA9IGEzIC0gYTIKLSAgICAidnFzdWIuczMyICAgICAgIHE3LCBxMCwgcTEgICAgICAgICAgICAgICAgIFxuIiAvLyBiMyA9IGEwIC0gYTEKLQotICAgICJ2c2hybi5zMzIgICAgICAgZDE4LCBxNCwgIzEgICAgICAgICAgICAgICAgXG4iIC8vIGIwID4+IDEKLSAgICAidnNocm4uczMyICAgICAgIGQxOSwgcTUsICMxICAgICAgICAgICAgICAgIFxuIiAvLyBiMSA+PiAxCi0gICAgInZzaHJuLnMzMiAgICAgICBkMjAsIHE2LCAjMSAgICAgICAgICAgICAgICBcbiIgLy8gYjIgPj4gMQotICAgICJ2c2hybi5zMzIgICAgICAgZDIxLCBxNywgIzEgICAgICAgICAgICAgICAgXG4iIC8vIGIzID4+IDEKLQotICAgICJ2c3QxLjE2ICAgICAgICAge3E5LCBxMTB9LCBbJVtvdXRdXSAgICAgICAgXG4iCi0KLSAgICA6IFtpbl0gIityIihpbikKLSAgICA6IFtrU3RlcF0gInIiKGtTdGVwKSwgW291dF0gInIiKG91dCkKLSAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLAotICAgICAgInE2IiwgInE3IiwgInE4IiwgInE5IiwgInExMCIgICAgICAgLy8gY2xvYmJlcmVkCi0gICkgOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGV4dHVyZSBkaXN0b3J0aW9uCi0vLwotLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCi0vLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCi0KLS8vIEhhZGFtYXJkIHRyYW5zZm9ybQotLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCi0vLyBUaGlzIHVzZXMgYSBUVHJhbnNmb3JtIGhlbHBlciBmdW5jdGlvbiBpbiBDCi1zdGF0aWMgaW50IERpc3RvNHg0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGNvbnN0IGludCBrQlBTID0gQlBTOwotICBjb25zdCB1aW50OF90KiBBID0gYTsKLSAgY29uc3QgdWludDhfdCogQiA9IGI7Ci0gIGNvbnN0IHVpbnQxNl90KiBXID0gdzsKLSAgaW50IHN1bTsKLSAgX19hc21fXyB2b2xhdGlsZSAoCi0gICAgInZsZDEuMzIgICAgICAgICBkMFswXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMFsxXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMlswXSwgWyVbYV1dLCAlW2tCUFNdICAgXG4iCi0gICAgInZsZDEuMzIgICAgICAgICBkMlsxXSwgWyVbYV1dICAgICAgICAgICAgXG4iCi0KLSAgICAidmxkMS4zMiAgICAgICAgIGQxWzBdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQxWzFdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQzWzBdLCBbJVtiXV0sICVba0JQU10gICBcbiIKLSAgICAidmxkMS4zMiAgICAgICAgIGQzWzFdLCBbJVtiXV0gICAgICAgICAgICBcbiIKLQotICAgIC8vIGEgZDAvZDIsIGIgZDEvZDMKLSAgICAvLyBkMC9kMTogMDEgMDEgMDEgMDEKLSAgICAvLyBkMi9kMzogMjMgMjMgMjMgMjMKLSAgICAvLyBCdXQ6IGl0IGdvZXMgMDEgNDUgMjMgNjcKLSAgICAvLyBOb3RpY2UgdGhlIG1pZGRsZSB2YWx1ZXMgYXJlIHRyYW5zcG9zZWQKLSAgICAidnRybi4xNiAgICAgICAgIHEwLCBxMSAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHthMCwgYTF9ID0ge2luWzBdICsgaW5bMl0sIGluWzFdICsgaW5bM119Ci0gICAgInZhZGRsLnU4ICAgICAgICBxMiwgZDAsIGQyICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGRsLnU4ICAgICAgICBxMTAsIGQxLCBkMyAgICAgICAgICAgICAgXG4iCi0gICAgLy8ge2EzLCBhMn0gPSB7aW5bMF0gLSBpblsyXSwgaW5bMV0gLSBpblszXX0KLSAgICAidnN1YmwudTggICAgICAgIHEzLCBkMCwgZDIgICAgICAgICAgICAgICBcbiIKLSAgICAidnN1YmwudTggICAgICAgIHExMSwgZDEsIGQzICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHRtcFswXSA9IGEwICsgYTEKLSAgICAidnBhZGRsLnMxNiAgICAgIHEwLCBxMiAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnBhZGRsLnMxNiAgICAgIHE4LCBxMTAgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHRtcFsxXSA9IGEzICsgYTIKLSAgICAidnBhZGRsLnMxNiAgICAgIHExLCBxMyAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnBhZGRsLnMxNiAgICAgIHE5LCBxMTEgICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIE5vIHBhaXIgc3VidHJhY3QKLSAgICAvLyBxMiA9IHthMCwgYTN9Ci0gICAgLy8gcTMgPSB7YTEsIGEyfQotICAgICJ2dHJuLjE2ICAgICAgICAgcTIsIHEzICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjE2ICAgICAgICAgcTEwLCBxMTEgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8ge3RtcFszXSwgdG1wWzJdfSA9IHthMCAtIGExLCBhMyAtIGEyfQotICAgICJ2c3VibC5zMTYgICAgICAgcTEyLCBkNCwgZDYgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTEzLCBkNSwgZDcgICAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTE0LCBkMjAsIGQyMiAgICAgICAgICAgIFxuIgotICAgICJ2c3VibC5zMTYgICAgICAgcTE1LCBkMjEsIGQyMyAgICAgICAgICAgIFxuIgotCi0gICAgLy8gc2VwYXJhdGUgdG1wWzNdIGFuZCB0bXBbMl0KLSAgICAvLyBxMTIgPSB0bXBbM10KLSAgICAvLyBxMTMgPSB0bXBbMl0KLSAgICAidnRybi4zMiAgICAgICAgIHExMiwgcTEzICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnRybi4zMiAgICAgICAgIHExNCwgcTE1ICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIFRyYW5zcG9zZSB0bXAgZm9yIGEKLSAgICAidnN3cCAgICAgICAgICAgIGQxLCBkMjYgICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NAotICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQyNCAgICAgICAgICAgICAgICAgIFxuIiAvLyB2dHJuLjY0Ci0gICAgInZ0cm4uMzIgICAgICAgICBxMCwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZ0cm4uMzIgICAgICAgICBxMTMsIHExMiAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBUcmFuc3Bvc2UgdG1wIGZvciBiCi0gICAgInZzd3AgICAgICAgICAgICBkMTcsIGQzMCAgICAgICAgICAgICAgICAgXG4iIC8vIHZ0cm4uNjQKLSAgICAidnN3cCAgICAgICAgICAgIGQxOSwgZDI4ICAgICAgICAgICAgICAgICBcbiIgLy8gdnRybi42NAotICAgICJ2dHJuLjMyICAgICAgICAgcTgsIHE5ICAgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2dHJuLjMyICAgICAgICAgcTE1LCBxMTQgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gVGhlIGZpcnN0IFEgcmVnaXN0ZXIgaXMgYSwgdGhlIHNlY29uZCBiLgotICAgIC8vIHEwLzggdG1wWzAtM10KLSAgICAvLyBxMTMvMTUgdG1wWzQtN10KLSAgICAvLyBxMS85IHRtcFs4LTExXQotICAgIC8vIHExMi8xNCB0bXBbMTItMTVdCi0KLSAgICAvLyBUaGVzZSBhcmUgc3RpbGwgaW4gMDEgNDUgMjMgNjcgb3JkZXIuIFdlIGZpeCBpdCBlYXNpbHkgaW4gdGhlIGFkZGl0aW9uCi0gICAgLy8gY2FzZSBidXQgdGhlIHN1YnRyYWN0aW9uIHByb3BlZ2F0ZXMgdGhlbS4KLSAgICAidnN3cCAgICAgICAgICAgIGQzLCBkMjcgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidnN3cCAgICAgICAgICAgIGQxOSwgZDMxICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGEwID0gdG1wWzBdICsgdG1wWzhdCi0gICAgInZhZGQuczMyICAgICAgICBxMiwgcTAsIHExICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQuczMyICAgICAgICBxMywgcTgsIHE5ICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBhMSA9IHRtcFs0XSArIHRtcFsxMl0KLSAgICAidmFkZC5zMzIgICAgICAgIHExMCwgcTEzLCBxMTIgICAgICAgICAgICBcbiIKLSAgICAidmFkZC5zMzIgICAgICAgIHExMSwgcTE1LCBxMTQgICAgICAgICAgICBcbiIKLQotICAgIC8vIGEyID0gdG1wWzRdIC0gdG1wWzEyXQotICAgICJ2c3ViLnMzMiAgICAgICAgcTEzLCBxMTMsIHExMiAgICAgICAgICAgIFxuIgotICAgICJ2c3ViLnMzMiAgICAgICAgcTE1LCBxMTUsIHExNCAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYTMgPSB0bXBbMF0gLSB0bXBbOF0KLSAgICAidnN1Yi5zMzIgICAgICAgIHEwLCBxMCwgcTEgICAgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxOCwgcTkgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGIwID0gYTAgKyBhMQotICAgICJ2YWRkLnMzMiAgICAgICAgcTEsIHEyLCBxMTAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWRkLnMzMiAgICAgICAgcTksIHEzLCBxMTEgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gYjEgPSBhMyArIGEyCi0gICAgInZhZGQuczMyICAgICAgICBxMTIsIHEwLCBxMTMgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQuczMyICAgICAgICBxMTQsIHE4LCBxMTUgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBiMiA9IGEzIC0gYTIKLSAgICAidnN1Yi5zMzIgICAgICAgIHEwLCBxMCwgcTEzICAgICAgICAgICAgICBcbiIKLSAgICAidnN1Yi5zMzIgICAgICAgIHE4LCBxOCwgcTE1ICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGIzID0gYTAgLSBhMQotICAgICJ2c3ViLnMzMiAgICAgICAgcTIsIHEyLCBxMTAgICAgICAgICAgICAgIFxuIgotICAgICJ2c3ViLnMzMiAgICAgICAgcTMsIHEzLCBxMTEgICAgICAgICAgICAgIFxuIgotCi0gICAgInZsZDEuNjQgICAgICAgICB7cTEwLCBxMTF9LCBbJVt3XV0gICAgICAgXG4iCi0KLSAgICAvLyBhYnMoYjApCi0gICAgInZhYnMuczMyICAgICAgICBxMSwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhYnMuczMyICAgICAgICBxOSwgcTkgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgLy8gYWJzKGIxKQotICAgICJ2YWJzLnMzMiAgICAgICAgcTEyLCBxMTIgICAgICAgICAgICAgICAgIFxuIgotICAgICJ2YWJzLnMzMiAgICAgICAgcTE0LCBxMTQgICAgICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhiMikKLSAgICAidmFicy5zMzIgICAgICAgIHEwLCBxMCAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAidmFicy5zMzIgICAgICAgIHE4LCBxOCAgICAgICAgICAgICAgICAgICBcbiIKLSAgICAvLyBhYnMoYjMpCi0gICAgInZhYnMuczMyICAgICAgICBxMiwgcTIgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhYnMuczMyICAgICAgICBxMywgcTMgICAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBleHBhbmQgdyBiZWZvcmUgdXNpbmcuCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTMsIGQyMCAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZtb3ZsLnUxNiAgICAgICBxMTUsIGQyMSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB3WzBdICogYWJzKGIwKQotICAgICJ2bXVsLnUzMiAgICAgICAgcTEsIHExLCBxMTMgICAgICAgICAgICAgIFxuIgotICAgICJ2bXVsLnUzMiAgICAgICAgcTksIHE5LCBxMTMgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gd1s0XSAqIGFicyhiMSkKLSAgICAidm1sYS51MzIgICAgICAgIHExLCBxMTIsIHExNSAgICAgICAgICAgICBcbiIKLSAgICAidm1sYS51MzIgICAgICAgIHE5LCBxMTQsIHExNSAgICAgICAgICAgICBcbiIKLQotICAgIC8vIGV4cGFuZCB3IGJlZm9yZSB1c2luZy4KLSAgICAidm1vdmwudTE2ICAgICAgIHExMywgZDIyICAgICAgICAgICAgICAgICBcbiIKLSAgICAidm1vdmwudTE2ICAgICAgIHExNSwgZDIzICAgICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIHdbOF0gKiBhYnMoYjEpCi0gICAgInZtbGEudTMyICAgICAgICBxMSwgcTAsIHExMyAgICAgICAgICAgICAgXG4iCi0gICAgInZtbGEudTMyICAgICAgICBxOSwgcTgsIHExMyAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyB3WzEyXSAqIGFicyhiMSkKLSAgICAidm1sYS51MzIgICAgICAgIHExLCBxMiwgcTE1ICAgICAgICAgICAgICBcbiIKLSAgICAidm1sYS51MzIgICAgICAgIHE5LCBxMywgcTE1ICAgICAgICAgICAgICBcbiIKLQotICAgIC8vIFN1bSB0aGUgYXJyYXlzCi0gICAgInZwYWRkbC51MzIgICAgICBxMSwgcTEgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZwYWRkbC51MzIgICAgICBxOSwgcTkgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQudTY0ICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCi0gICAgInZhZGQudTY0ICAgICAgICBkMTgsIGQxOSAgICAgICAgICAgICAgICAgXG4iCi0KLSAgICAvLyBIYWRhbWFyZCB0cmFuc2Zvcm0gbmVlZHMgNCBiaXRzIG9mIGV4dHJhIHByZWNpc2lvbiAoMiBiaXRzIGluIGVhY2gKLSAgICAvLyBkaXJlY3Rpb24pIGZvciBkeW5hbWljIHJhdy4gV2VpZ2h0cyB3W10gYXJlIDE2Yml0cyBhdCBtYXgsIHNvIHRoZSBtYXhpbXVtCi0gICAgLy8gcHJlY2lzaW9uIGZvciBjb2VmZiBpcyA4Yml0IG9mIGlucHV0ICsgNGJpdHMgb2YgSGFkYW1hcmQgdHJhbnNmb3JtICsKLSAgICAvLyAxNmJpdHMgZm9yIHdbXSArIDIgYml0cyBvZiBhYnMoKSBzdW1tYXRpb24uCi0gICAgLy8KLSAgICAvLyBUaGlzIHVzZXMgYSBtYXhpbXVtIG9mIDMxIGJpdHMgKHNpZ25lZCkuIERpc2NhcmRpbmcgdGhlIHRvcCAzMiBiaXRzIGlzCi0gICAgLy8gQS1PSy4KLQotICAgIC8vIHN1bTIgLSBzdW0xCi0gICAgInZzdWIudTMyICAgICAgICBkMCwgZDIsIGQxOCAgICAgICAgICAgICAgXG4iCi0gICAgLy8gYWJzKHN1bTIgLSBzdW0xKQotICAgICJ2YWJzLnMzMiAgICAgICAgZDAsIGQwICAgICAgICAgICAgICAgICAgIFxuIgotICAgIC8vIGFicyhzdW0yIC0gc3VtMSkgPj4gNQotICAgICJ2c2hyLnUzMiAgICAgICAgZDAsICM1ICAgICAgICAgICAgICAgICAgIFxuIgotCi0gICAgLy8gSXQgd291bGQgYmUgYmV0dGVyIHRvIG1vdmUgdGhlIHZhbHVlIHN0cmFpZ2h0IGludG8gcjAgYnV0IEknbSBub3QKLSAgICAvLyBlbnRpcmVseSBzdXJlIGhvdyB0aGlzIHdvcmtzIHdpdGggaW5saW5lIGFzc2VtYmx5LgotICAgICJ2bW92LjMyICAgICAgICAgJVtzdW1dLCBkMFswXSAgICAgICAgICAgIFxuIgotCi0gICAgOiBbc3VtXSAiPXIiKHN1bSksIFthXSAiK3IiKEEpLCBbYl0gIityIihCKSwgW3ddICIrciIoVykKLSAgICA6IFtrQlBTXSAiciIoa0JQUykKLSAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTMiLCAicTQiLCAicTUiLCAicTYiLCAicTciLCAicTgiLCAicTkiLAotICAgICAgInExMCIsICJxMTEiLCAicTEyIiwgInExMyIsICJxMTQiLCAicTE1IiAgLy8gY2xvYmJlcmVkCi0gICkgOwotCi0gIHJldHVybiBzdW07Ci19Ci0KLXN0YXRpYyBpbnQgRGlzdG8xNngxNihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGludCBEID0gMDsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKLSAgICAgIEQgKz0gRGlzdG80eDQoYSArIHggKyB5LCBiICsgeCArIHksIHcpOwotICAgIH0KLSAgfQotICByZXR1cm4gRDsKLX0KLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW50cnkgcG9pbnQKLQotZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7Ci0KLXZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKLSAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm07Ci0gIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtOwotCi0gIFZQOElUcmFuc2Zvcm1XSFQgPSBJVHJhbnNmb3JtV0hUOwotICBWUDhGVHJhbnNmb3JtV0hUID0gRlRyYW5zZm9ybVdIVDsKLQotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NDsKLSAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2OwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmNfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuY19zc2UyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMmU5OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2VuY19zc2UyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNTRTIgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBDaHJpc3RpYW4gRHV2aXZpZXIgKGNkdXZpdmllckBnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKLSNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KLQotI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWl0ZSB1c2VmdWwgbWFjcm8gZm9yIGRlYnVnZ2luZy4gTGVmdCBoZXJlIGZvciBjb252ZW5pZW5jZS4KLQotI2lmIDAKLSNpbmNsdWRlIDxzdGRpby5oPgotc3RhdGljIHZvaWQgUHJpbnRSZWcoY29uc3QgX19tMTI4aSByLCBjb25zdCBjaGFyKiBjb25zdCBuYW1lLCBpbnQgc2l6ZSkgewotICBpbnQgbjsKLSAgdW5pb24gewotICAgIF9fbTEyOGkgcjsKLSAgICB1aW50OF90IGk4WzE2XTsKLSAgICB1aW50MTZfdCBpMTZbOF07Ci0gICAgdWludDMyX3QgaTMyWzRdOwotICAgIHVpbnQ2NF90IGk2NFsyXTsKLSAgfSB0bXA7Ci0gIHRtcC5yID0gcjsKLSAgcHJpbnRmKCIlc1x0OiAiLCBuYW1lKTsKLSAgaWYgKHNpemUgPT0gOCkgewotICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSBwcmludGYoIiUuMnggIiwgdG1wLmk4W25dKTsKLSAgfSBlbHNlIGlmIChzaXplID09IDE2KSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgcHJpbnRmKCIlLjR4ICIsIHRtcC5pMTZbbl0pOwotICB9IGVsc2UgaWYgKHNpemUgPT0gMzIpIHsKLSAgICBmb3IgKG4gPSAwOyBuIDwgNDsgKytuKSBwcmludGYoIiUuOHggIiwgdG1wLmkzMltuXSk7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDI7ICsrbikgcHJpbnRmKCIlLjE2bHggIiwgdG1wLmk2NFtuXSk7Ci0gIH0KLSAgcHJpbnRmKCJcbiIpOwotfQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21wdXRlIHN1c2NlcHRpYmlsaXR5IGJhc2VkIG9uIERDVC1jb2VmZiBoaXN0b2dyYW1zOgotLy8gdGhlIGhpZ2hlciwgdGhlICJlYXNpZXIiIHRoZSBtYWNyb2Jsb2NrIGlzIHRvIGNvbXByZXNzLgotCi1zdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtU1NFMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7Ci0gIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmX3RocmVzaCA9IF9tbV9zZXQxX2VwaTE2KE1BWF9DT0VGRl9USFJFU0gpOwotICBpbnQgajsKLSAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgewotICAgIGludDE2X3Qgb3V0WzE2XTsKLSAgICBpbnQgazsKLQotICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7Ci0KLSAgICAvLyBDb252ZXJ0IGNvZWZmaWNpZW50cyB0byBiaW4gKHdpdGhpbiBvdXRbXSkuCi0gICAgewotICAgICAgLy8gTG9hZC4KLSAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFswXSk7Ci0gICAgICBjb25zdCBfX20xMjhpIG91dDEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0pOwotICAgICAgLy8gc2lnbihvdXQpID0gb3V0ID4+IDE1ICAoMHgwMDAwIGlmIHBvc2l0aXZlLCAweGZmZmYgaWYgbmVnYXRpdmUpCi0gICAgICBjb25zdCBfX20xMjhpIHNpZ24wID0gX21tX3NyYWlfZXBpMTYob3V0MCwgMTUpOwotICAgICAgY29uc3QgX19tMTI4aSBzaWduMSA9IF9tbV9zcmFpX2VwaTE2KG91dDEsIDE1KTsKLSAgICAgIC8vIGFicyhvdXQpID0gKG91dCBeIHNpZ24pIC0gc2lnbgotICAgICAgY29uc3QgX19tMTI4aSB4b3IwID0gX21tX3hvcl9zaTEyOChvdXQwLCBzaWduMCk7Ci0gICAgICBjb25zdCBfX20xMjhpIHhvcjEgPSBfbW1feG9yX3NpMTI4KG91dDEsIHNpZ24xKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMCA9IF9tbV9zdWJfZXBpMTYoeG9yMCwgc2lnbjApOwotICAgICAgY29uc3QgX19tMTI4aSBhYnMxID0gX21tX3N1Yl9lcGkxNih4b3IxLCBzaWduMSk7Ci0gICAgICAvLyB2ID0gYWJzKG91dCkgPj4gMwotICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9zcmFpX2VwaTE2KGFiczAsIDMpOwotICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV9zcmFpX2VwaTE2KGFiczEsIDMpOwotICAgICAgLy8gYmluID0gbWluKHYsIE1BWF9DT0VGRl9USFJFU0gpCi0gICAgICBjb25zdCBfX20xMjhpIGJpbjAgPSBfbW1fbWluX2VwaTE2KHYwLCBtYXhfY29lZmZfdGhyZXNoKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgYmluMSA9IF9tbV9taW5fZXBpMTYodjEsIG1heF9jb2VmZl90aHJlc2gpOwotICAgICAgLy8gU3RvcmUuCi0gICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBiaW4wKTsKLSAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGJpbjEpOwotICAgIH0KLQotICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KLSAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgewotICAgICAgaGlzdG8tPmRpc3RyaWJ1dGlvbltvdXRba11dKys7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKLQotLy8gRG9lcyBvbmUgb3IgdHdvIGludmVyc2UgdHJhbnNmb3Jtcy4KLXN0YXRpYyB2b2lkIElUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKLSAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgMTYtYml0IGZpeGVkIHBvaW50IHZlcnNpb25zIG9mIHR3bwotICAvLyBtdWx0aXBseSBjb25zdGFudHM6Ci0gIC8vICAgIEsxID0gc3FydCgyKSAqIGNvcyAocGkvOCkgfj0gODU2MjcgLyAyXjE2Ci0gIC8vICAgIEsyID0gc3FydCgyKSAqIHNpbiAocGkvOCkgfj0gMzU0NjggLyAyXjE2Ci0gIC8vCi0gIC8vIFRvIGJlIGFibGUgdG8gdXNlIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMsIHdlIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrIHRvCi0gIC8vIGhhdmUgY29uc3RhbnRzIHdpdGhpbiByYW5nZToKLSAgLy8gLSBBc3NvY2lhdGVkIGNvbnN0YW50cyBhcmUgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgdGhlIDE2LWJpdCBmaXhlZCBwb2ludAotICAvLyAgIHZlcnNpb24gb2Ygb25lOgotICAvLyAgICAgIGsgPSBLIC0gKDEgPDwgMTYpICA9PiAgSyA9IGsgKyAoMSA8PCAxNikKLSAgLy8gICAgICBLMSA9IDg1MjY3ICA9PiAgazEgPSAgMjAwOTEKLSAgLy8gICAgICBLMiA9IDM1NDY4ICA9PiAgazIgPSAtMzAwNjgKLSAgLy8gLSBUaGUgbXVsdGlwbGljYXRpb24gb2YgYSB2YXJpYWJsZSBieSBhIGNvbnN0YW50IGJlY29tZSB0aGUgc3VtIG9mIHRoZQotICAvLyAgIHZhcmlhYmxlIGFuZCB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhhdCB2YXJpYWJsZSBieSB0aGUgYXNzb2NpYXRlZAotICAvLyAgIGNvbnN0YW50OgotICAvLyAgICAgICh4ICogSykgPj4gMTYgPSAoeCAqIChrICsgKDEgPDwgMTYpKSkgPj4gMTYgPSAoKHggKiBrICkgPj4gMTYpICsgeAotICBjb25zdCBfX20xMjhpIGsxID0gX21tX3NldDFfZXBpMTYoMjAwOTEpOwotICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoLTMwMDY4KTsKLSAgX19tMTI4aSBUMCwgVDEsIFQyLCBUMzsKLQotICAvLyBMb2FkIGFuZCBjb25jYXRlbmF0ZSB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyAod2UnbGwgZG8gdHdvIGludmVyc2UKLSAgLy8gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIGludmVyc2UgdHJhbnNmb3JtLCB0aGUKLSAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIHZlY3RvcnMgd2lsbCBqdXN0IGNvbnRhaW4gcmFuZG9tIHZhbHVlIHdlJ2xsIG5ldmVyCi0gIC8vIHVzZSBub3Igc3RvcmUuCi0gIF9fbTEyOGkgaW4wLCBpbjEsIGluMiwgaW4zOwotICB7Ci0gICAgaW4wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMF0pOwotICAgIGluMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzRdKTsKLSAgICBpbjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpbls4XSk7Ci0gICAgaW4zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTJdKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICB4IHggeCB4Ci0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgeCB4IHggeAotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIHggeCB4IHgKLSAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICB4IHggeCB4Ci0gICAgaWYgKGRvX3R3bykgewotICAgICAgY29uc3QgX19tMTI4aSBpbkIwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMTZdKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzIwXSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGluQjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblsyNF0pOwotICAgICAgY29uc3QgX19tMTI4aSBpbkIzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMjhdKTsKLSAgICAgIGluMCA9IF9tbV91bnBhY2tsb19lcGk2NChpbjAsIGluQjApOwotICAgICAgaW4xID0gX21tX3VucGFja2xvX2VwaTY0KGluMSwgaW5CMSk7Ci0gICAgICBpbjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4yLCBpbkIyKTsKLSAgICAgIGluMyA9IF9tbV91bnBhY2tsb19lcGk2NChpbjMsIGluQjMpOwotICAgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKLSAgICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gICAgfQotICB9Ci0KLSAgLy8gVmVydGljYWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCi0gIHsKLSAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKLSAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCi0gICAgY29uc3QgX19tMTI4aSBhID0gX21tX2FkZF9lcGkxNihpbjAsIGluMik7Ci0gICAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1Yl9lcGkxNihpbjAsIGluMik7Ci0gICAgLy8gYyA9IE1VTChpbjEsIEsyKSAtIE1VTChpbjMsIEsxKSA9IE1VTChpbjEsIGsyKSAtIE1VTChpbjMsIGsxKSArIGluMSAtIGluMwotICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChpbjEsIEsxKSArIE1VTChpbjMsIEsyKSA9IE1VTChpbjEsIGsxKSArIE1VTChpbjMsIGsyKSArIGluMSArIGluMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMSk7Ci0gICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsyKTsKLSAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihpbjEsIGluMyk7Ci0gICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKLSAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7Ci0KLSAgICAvLyBTZWNvbmQgcGFzcy4KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDAsIHRtcDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHRtcDIsIHRtcDMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgVDAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICBUMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgVDMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KLSAgewotICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgotICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KLSAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKLSAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7Ci0gICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKLSAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOwotICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKLSAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOwotICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7Ci0gICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKLSAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7Ci0gICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKLSAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7Ci0gICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKLSAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOwotICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKLQotICAgIC8vIFNlY29uZCBwYXNzLgotICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOwotICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKLSAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOwotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgotICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMwotICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMwotICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMwotICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8wID0gX21tX3VucGFja2xvX2VwaTE2KHNoaWZ0ZWQwLCBzaGlmdGVkMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc2hpZnRlZDIsIHNoaWZ0ZWQzKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMiA9IF9tbV91bnBhY2toaV9lcGkxNihzaGlmdGVkMCwgc2hpZnRlZDEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8zID0gX21tX3VucGFja2hpX2VwaTE2KHNoaWZ0ZWQyLCBzaGlmdGVkMyk7Ci0gICAgLy8gYTAwIGExMCBhMDEgYTExICAgYTAyIGExMiBhMDMgYTEzCi0gICAgLy8gYTIwIGEzMCBhMjEgYTMxICAgYTIyIGEzMiBhMjMgYTMzCi0gICAgLy8gYjAwIGIxMCBiMDEgYjExICAgYjAyIGIxMiBiMDMgYjEzCi0gICAgLy8gYjIwIGIzMCBiMjEgYjMxICAgYjIyIGIzMiBiMjMgYjMzCi0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzAgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMiA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzMgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCBhMDEgYTExIGEyMSBhMzEKLSAgICAvLyBiMDAgYjEwIGIyMCBiMzAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyIGEwMyBhMTMgYTIzIGEzMwotICAgIC8vIGIwMiBiMTIgYTIyIGIzMiBiMDMgYjEzIGIyMyBiMzMKLSAgICBUMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7Ci0gICAgVDEgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIFQyID0gX21tX3VucGFja2xvX2VwaTY0KHRyYW5zcG9zZTFfMiwgdHJhbnNwb3NlMV8zKTsKLSAgICBUMyA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCi0gICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCi0gICAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCi0gICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCi0gIH0KLQotICAvLyBBZGQgaW52ZXJzZSB0cmFuc2Zvcm0gdG8gJ3JlZicgYW5kIHN0b3JlLgotICB7Ci0gICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgICAvLyBMb2FkIHRoZSByZWZlcmVuY2UocykuCi0gICAgX19tMTI4aSByZWYwLCByZWYxLCByZWYyLCByZWYzOwotICAgIGlmIChkb190d28pIHsKLSAgICAgIC8vIExvYWQgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlswICogQlBTXSk7Ci0gICAgICByZWYxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKLSAgICAgIHJlZjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMiAqIEJQU10pOwotICAgICAgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlszICogQlBTXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIExvYWQgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCi0gICAgICByZWYwID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZyZWZbMCAqIEJQU10pOwotICAgICAgcmVmMSA9IF9tbV9jdnRzaTMyX3NpMTI4KCooaW50KikmcmVmWzEgKiBCUFNdKTsKLSAgICAgIHJlZjIgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGludCopJnJlZlsyICogQlBTXSk7Ci0gICAgICByZWYzID0gX21tX2N2dHNpMzJfc2kxMjgoKihpbnQqKSZyZWZbMyAqIEJQU10pOwotICAgIH0KLSAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KLSAgICByZWYwID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7Ci0gICAgcmVmMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOwotICAgIHJlZjIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKLSAgICByZWYzID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7Ci0gICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybShzKS4KLSAgICByZWYwID0gX21tX2FkZF9lcGkxNihyZWYwLCBUMCk7Ci0gICAgcmVmMSA9IF9tbV9hZGRfZXBpMTYocmVmMSwgVDEpOwotICAgIHJlZjIgPSBfbW1fYWRkX2VwaTE2KHJlZjIsIFQyKTsKLSAgICByZWYzID0gX21tX2FkZF9lcGkxNihyZWYzLCBUMyk7Ci0gICAgLy8gVW5zaWduZWQgc2F0dXJhdGUgdG8gOGIuCi0gICAgcmVmMCA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMCwgcmVmMCk7Ci0gICAgcmVmMSA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMSwgcmVmMSk7Ci0gICAgcmVmMiA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMiwgcmVmMik7Ci0gICAgcmVmMyA9IF9tbV9wYWNrdXNfZXBpMTYocmVmMywgcmVmMyk7Ci0gICAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCi0gICAgaWYgKGRvX3R3bykgewotICAgICAgLy8gU3RvcmUgZWlnaHQgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFswICogQlBTXSwgcmVmMCk7Ci0gICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzEgKiBCUFNdLCByZWYxKTsKLSAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMiAqIEJQU10sIHJlZjIpOwotICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFszICogQlBTXSwgcmVmMyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFN0b3JlIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMCAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIocmVmMCk7Ci0gICAgICAqKChpbnQzMl90ICopJmRzdFsxICogQlBTXSkgPSBfbW1fY3Z0c2kxMjhfc2kzMihyZWYxKTsKLSAgICAgICooKGludDMyX3QgKikmZHN0WzIgKiBCUFNdKSA9IF9tbV9jdnRzaTEyOF9zaTMyKHJlZjIpOwotICAgICAgKigoaW50MzJfdCAqKSZkc3RbMyAqIEJQU10pID0gX21tX2N2dHNpMTI4X3NpMzIocmVmMyk7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEZUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0gIGNvbnN0IF9fbTEyOGkgc2V2ZW4gPSBfbW1fc2V0MV9lcGkxNig3KTsKLSAgY29uc3QgX19tMTI4aSBrOTM3ID0gX21tX3NldDFfZXBpMzIoOTM3KTsKLSAgY29uc3QgX19tMTI4aSBrMTgxMiA9IF9tbV9zZXQxX2VwaTMyKDE4MTIpOwotICBjb25zdCBfX20xMjhpIGs1MTAwMCA9IF9tbV9zZXQxX2VwaTMyKDUxMDAwKTsKLSAgY29uc3QgX19tMTI4aSBrMTIwMDBfcGx1c19vbmUgPSBfbW1fc2V0MV9lcGkzMigxMjAwMCArICgxIDw8IDE2KSk7Ci0gIGNvbnN0IF9fbTEyOGkgazUzNTJfMjIxNyA9IF9tbV9zZXRfZXBpMTYoNTM1MiwgIDIyMTcsIDUzNTIsICAyMjE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNyk7Ci0gIGNvbnN0IF9fbTEyOGkgazIyMTdfNTM1MiA9IF9tbV9zZXRfZXBpMTYoMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1Mik7Ci0gIGNvbnN0IF9fbTEyOGkgazg4cCA9IF9tbV9zZXRfZXBpMTYoOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCk7Ci0gIGNvbnN0IF9fbTEyOGkgazg4bSA9IF9tbV9zZXRfZXBpMTYoLTgsIDgsIC04LCA4LCAtOCwgOCwgLTgsIDgpOwotICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTdwID0gX21tX3NldF9lcGkxNigyMjE3LCA1MzUyLCAyMjE3LCA1MzUyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCA1MzUyLCAyMjE3LCA1MzUyKTsKLSAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3bSA9IF9tbV9zZXRfZXBpMTYoLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcpOwotICBfX20xMjhpIHYwMSwgdjMyOwotCi0KLSAgLy8gRGlmZmVyZW5jZSBiZXR3ZWVuIHNyYyBhbmQgcmVmIGFuZCBpbml0aWFsIHRyYW5zcG9zZS4KLSAgewotICAgIC8vIExvYWQgc3JjIGFuZCBjb252ZXJ0IHRvIDE2Yi4KLSAgICBjb25zdCBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZzcmNbMCAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnNyY1sxICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmc3JjWzIgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZzcmNbMyAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMwLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHNyY18xID0gX21tX3VucGFja2xvX2VwaTgoc3JjMSwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmNfMiA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzIsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMzLCB6ZXJvKTsKLSAgICAvLyBMb2FkIHJlZiBhbmQgY29udmVydCB0byAxNmIuCi0gICAgY29uc3QgX19tMTI4aSByZWYwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZjEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZyZWZbMSAqIEJQU10pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnJlZlsyICogQlBTXSk7Ci0gICAgY29uc3QgX19tMTI4aSByZWYzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZl8wID0gX21tX3VucGFja2xvX2VwaTgocmVmMCwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSByZWZfMSA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjEsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgcmVmXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIHJlZl8zID0gX21tX3VucGFja2xvX2VwaTgocmVmMywgemVybyk7Ci0gICAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlLiAtPiAwMCAwMSAwMiAwMyAwMCAwMCAwMCAwMAotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjAgPSBfbW1fc3ViX2VwaTE2KHNyY18wLCByZWZfMCk7Ci0gICAgY29uc3QgX19tMTI4aSBkaWZmMSA9IF9tbV9zdWJfZXBpMTYoc3JjXzEsIHJlZl8xKTsKLSAgICBjb25zdCBfX20xMjhpIGRpZmYyID0gX21tX3N1Yl9lcGkxNihzcmNfMiwgcmVmXzIpOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjMgPSBfbW1fc3ViX2VwaTE2KHNyY18zLCByZWZfMyk7Ci0KLQotICAgIC8vIFVucGFjayBhbmQgc2h1ZmZsZQotICAgIC8vIDAwIDAxIDAyIDAzICAgMCAwIDAgMAotICAgIC8vIDEwIDExIDEyIDEzICAgMCAwIDAgMAotICAgIC8vIDIwIDIxIDIyIDIzICAgMCAwIDAgMAotICAgIC8vIDMwIDMxIDMyIDMzICAgMCAwIDAgMAotICAgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxID0gX21tX3VucGFja2xvX2VwaTMyKGRpZmYwLCBkaWZmMSk7Ci0gICAgY29uc3QgX19tMTI4aSBzaHVmMjMgPSBfbW1fdW5wYWNrbG9fZXBpMzIoZGlmZjIsIGRpZmYzKTsKLSAgICAvLyAwMCAwMSAxMCAxMSAwMiAwMyAxMiAxMwotICAgIC8vIDIwIDIxIDMwIDMxIDIyIDIzIDMyIDMzCi0gICAgY29uc3QgX19tMTI4aSBzaHVmMDFfcCA9Ci0gICAgICAgIF9tbV9zaHVmZmxlaGlfZXBpMTYoc2h1ZjAxLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7Ci0gICAgY29uc3QgX19tMTI4aSBzaHVmMjNfcCA9Ci0gICAgICAgIF9tbV9zaHVmZmxlaGlfZXBpMTYoc2h1ZjIzLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7Ci0gICAgLy8gMDAgMDEgMTAgMTEgMDMgMDIgMTMgMTIKLSAgICAvLyAyMCAyMSAzMCAzMSAyMyAyMiAzMyAzMgotICAgIGNvbnN0IF9fbTEyOGkgczAxID0gX21tX3VucGFja2xvX2VwaTY0KHNodWYwMV9wLCBzaHVmMjNfcCk7Ci0gICAgY29uc3QgX19tMTI4aSBzMzIgPSBfbW1fdW5wYWNraGlfZXBpNjQoc2h1ZjAxX3AsIHNodWYyM19wKTsKLSAgICAvLyAwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMQotICAgIC8vIDAzIDAyIDEzIDEyIDIzIDIyIDMzIDMyCi0gICAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KHMwMSwgczMyKTsKLSAgICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYoczAxLCBzMzIpOwotICAgIC8vIFtkMCArIGQzIHwgZDEgKyBkMiB8IC4uLl0gPSBbYTAgYTEgfCBhMCcgYTEnIHwgLi4uIF0KLSAgICAvLyBbZDAgLSBkMyB8IGQxIC0gZDIgfCAuLi5dID0gW2EzIGEyIHwgYTMnIGEyJyB8IC4uLiBdCi0KLSAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OHApOyAgLy8gWyAoYTAgKyBhMSkgPDwgMywgLi4uIF0KLSAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fbWFkZF9lcGkxNihhMDEsIGs4OG0pOyAgLy8gWyAoYTAgLSBhMSkgPDwgMywgLi4uIF0KLSAgICBjb25zdCBfX20xMjhpIHRtcDFfMSA9IF9tbV9tYWRkX2VwaTE2KGEzMiwgazUzNTJfMjIxN3ApOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wM18xID0gX21tX21hZGRfZXBpMTYoYTMyLCBrNTM1Ml8yMjE3bSk7Ci0gICAgY29uc3QgX19tMTI4aSB0bXAxXzIgPSBfbW1fYWRkX2VwaTMyKHRtcDFfMSwgazE4MTIpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wM18yID0gX21tX2FkZF9lcGkzMih0bXAzXzEsIGs5MzcpOwotICAgIGNvbnN0IF9fbTEyOGkgdG1wMSAgID0gX21tX3NyYWlfZXBpMzIodG1wMV8yLCA5KTsKLSAgICBjb25zdCBfX20xMjhpIHRtcDMgICA9IF9tbV9zcmFpX2VwaTMyKHRtcDNfMiwgOSk7Ci0gICAgY29uc3QgX19tMTI4aSBzMDMgPSBfbW1fcGFja3NfZXBpMzIodG1wMCwgdG1wMik7Ci0gICAgY29uc3QgX19tMTI4aSBzMTIgPSBfbW1fcGFja3NfZXBpMzIodG1wMSwgdG1wMyk7Ci0gICAgY29uc3QgX19tMTI4aSBzX2xvID0gX21tX3VucGFja2xvX2VwaTE2KHMwMywgczEyKTsgICAvLyAwIDEgMCAxIDAgMS4uLgotICAgIGNvbnN0IF9fbTEyOGkgc19oaSA9IF9tbV91bnBhY2toaV9lcGkxNihzMDMsIHMxMik7ICAgLy8gMiAzIDIgMyAyIDMKLSAgICBjb25zdCBfX20xMjhpIHYyMyA9IF9tbV91bnBhY2toaV9lcGkzMihzX2xvLCBzX2hpKTsKLSAgICB2MDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc19sbywgc19oaSk7Ci0gICAgdjMyID0gX21tX3NodWZmbGVfZXBpMzIodjIzLCBfTU1fU0hVRkZMRSgxLCAwLCAzLCAyKSk7ICAvLyAzIDIgMyAyIDMgMi4uCi0gIH0KLQotICAvLyBTZWNvbmQgcGFzcwotICB7Ci0gICAgLy8gU2FtZSBvcGVyYXRpb25zIGFyZSBkb25lIG9uIHRoZSAoMCwzKSBhbmQgKDEsMikgcGFpcnMuCi0gICAgLy8gYTAgPSB2MCArIHYzCi0gICAgLy8gYTEgPSB2MSArIHYyCi0gICAgLy8gYTMgPSB2MCAtIHYzCi0gICAgLy8gYTIgPSB2MSAtIHYyCi0gICAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KHYwMSwgdjMyKTsKLSAgICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYodjAxLCB2MzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYTExID0gX21tX3VucGFja2hpX2VwaTY0KGEwMSwgYTAxKTsKLSAgICBjb25zdCBfX20xMjhpIGEyMiA9IF9tbV91bnBhY2toaV9lcGk2NChhMzIsIGEzMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMDFfcGx1c183ID0gX21tX2FkZF9lcGkxNihhMDEsIHNldmVuKTsKLQotICAgIC8vIGQwID0gKGEwICsgYTEgKyA3KSA+PiA0OwotICAgIC8vIGQyID0gKGEwIC0gYTEgKyA3KSA+PiA0OwotICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fYWRkX2VwaTE2KGEwMV9wbHVzXzcsIGExMSk7Ci0gICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9zdWJfZXBpMTYoYTAxX3BsdXNfNywgYTExKTsKLSAgICBjb25zdCBfX20xMjhpIGQwID0gX21tX3NyYWlfZXBpMTYoYzAsIDQpOwotICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fc3JhaV9lcGkxNihjMiwgNCk7Ci0KLSAgICAvLyBmMSA9ICgoYjMgKiA1MzUyICsgYjIgKiAyMjE3ICsgMTIwMDApID4+IDE2KQotICAgIC8vIGYzID0gKChiMyAqIDIyMTcgLSBiMiAqIDUzNTIgKyA1MTAwMCkgPj4gMTYpCi0gICAgY29uc3QgX19tMTI4aSBiMjMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTIyLCBhMzIpOwotICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGs1MzUyXzIyMTcpOwotICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fbWFkZF9lcGkxNihiMjMsIGsyMjE3XzUzNTIpOwotICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fYWRkX2VwaTMyKGMxLCBrMTIwMDBfcGx1c19vbmUpOwotICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fYWRkX2VwaTMyKGMzLCBrNTEwMDApOwotICAgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fc3JhaV9lcGkzMihkMSwgMTYpOwotICAgIGNvbnN0IF9fbTEyOGkgZTMgPSBfbW1fc3JhaV9lcGkzMihkMywgMTYpOwotICAgIGNvbnN0IF9fbTEyOGkgZjEgPSBfbW1fcGFja3NfZXBpMzIoZTEsIGUxKTsKLSAgICBjb25zdCBfX20xMjhpIGYzID0gX21tX3BhY2tzX2VwaTMyKGUzLCBlMyk7Ci0gICAgLy8gZjEgPSBmMSArIChhMyAhPSAwKTsKLSAgICAvLyBUaGUgY29tcGFyZSB3aWxsIHJldHVybiAoMHhmZmZmLCAwKSBmb3IgKD09MCwgIT0wKS4gVG8gdHVybiB0aGF0IGludG8gdGhlCi0gICAgLy8gZGVzaXJlZCAoMCwgMSksIHdlIGFkZCBvbmUgZWFybGllciB0aHJvdWdoIGsxMjAwMF9wbHVzX29uZS4KLSAgICAvLyAtPiBmMSA9IGYxICsgMSAtIChhMyA9PSAwKQotICAgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fYWRkX2VwaTE2KGYxLCBfbW1fY21wZXFfZXBpMTYoYTMyLCB6ZXJvKSk7Ci0KLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyAwXSwgZDApOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDRdLCBnMSk7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgOF0sIGQyKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WzEyXSwgZjMpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRTU0UyKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50MTZfdCB0bXBbMTZdOwotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgaW4gKz0gNjQpIHsKLSAgICBjb25zdCBpbnQgYTAgPSAoaW5bMCAqIDE2XSArIGluWzIgKiAxNl0pOwotICAgIGNvbnN0IGludCBhMSA9IChpblsxICogMTZdICsgaW5bMyAqIDE2XSk7Ci0gICAgY29uc3QgaW50IGEyID0gKGluWzEgKiAxNl0gLSBpblszICogMTZdKTsKLSAgICBjb25zdCBpbnQgYTMgPSAoaW5bMCAqIDE2XSAtIGluWzIgKiAxNl0pOwotICAgIHRtcFswICsgaSAqIDRdID0gYTAgKyBhMTsKLSAgICB0bXBbMSArIGkgKiA0XSA9IGEzICsgYTI7Ci0gICAgdG1wWzIgKyBpICogNF0gPSBhMyAtIGEyOwotICAgIHRtcFszICsgaSAqIDRdID0gYTAgLSBhMTsKLSAgfQotICB7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmdG1wWzBdKTsKLSAgICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZ0bXBbNF0pOwotICAgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJnRtcFs4XSk7Ci0gICAgY29uc3QgX19tMTI4aSBzcmMzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmdG1wWzEyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYoc3JjMCwgc3JjMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYoc3JjMSwgc3JjMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYoc3JjMSwgc3JjMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYoc3JjMCwgc3JjMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9zcmFpX2VwaTE2KF9tbV9hZGRzX2VwaTE2KGEwLCBhMSksIDEpOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc3JhaV9lcGkxNihfbW1fYWRkc19lcGkxNihhMywgYTIpLCAxKTsKLSAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3NyYWlfZXBpMTYoX21tX3N1YnNfZXBpMTYoYTMsIGEyKSwgMSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zcmFpX2VwaTE2KF9tbV9zdWJzX2VwaTE2KGEwLCBhMSksIDEpOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbIDBdLCBiMCk7Ci0gICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJm91dFsgNF0sIGIxKTsKLSAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmb3V0WyA4XSwgYjIpOwotICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbMTJdLCBiMyk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1ldHJpYwotCi1zdGF0aWMgaW50IFNTRV9OeDRTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcXVhZHMsIGludCBkb18xNikgewotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBfX20xMjhpIHN1bTEgPSB6ZXJvOwotICBfX20xMjhpIHN1bTIgPSB6ZXJvOwotCi0gIHdoaWxlIChudW1fcXVhZHMtLSA+IDApIHsKLSAgICAvLyBOb3RlOiBmb3IgdGhlICFkb18xNiBjYXNlLCB3ZSByZWFkIDE2IHBpeGVscyBpbnN0ZWFkIG9mIDggYnV0IHRoYXQncyBvaywKLSAgICAvLyB0aGFua3MgdG8gYnVmZmVyIG92ZXItYWxsb2NhdGlvbiB0byB0aGF0IGVmZmVjdC4KLSAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYVtCUFMgKiAwXSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFbQlBTICogMV0pOwotICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYVtCUFMgKiAzXSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmJbQlBTICogMF0pOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZiW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYltCUFMgKiAyXSk7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmJbQlBTICogM10pOwotCi0gICAgLy8gY29tcHV0ZSBjbGlwMChhLWIpIGFuZCBjbGlwMChiLWEpCi0gICAgY29uc3QgX19tMTI4aSBhMHAgPSBfbW1fc3Vic19lcHU4KGEwLCBiMCk7Ci0gICAgY29uc3QgX19tMTI4aSBhMG0gPSBfbW1fc3Vic19lcHU4KGIwLCBhMCk7Ci0gICAgY29uc3QgX19tMTI4aSBhMXAgPSBfbW1fc3Vic19lcHU4KGExLCBiMSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMW0gPSBfbW1fc3Vic19lcHU4KGIxLCBhMSk7Ci0gICAgY29uc3QgX19tMTI4aSBhMnAgPSBfbW1fc3Vic19lcHU4KGEyLCBiMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMm0gPSBfbW1fc3Vic19lcHU4KGIyLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBhM3AgPSBfbW1fc3Vic19lcHU4KGEzLCBiMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhM20gPSBfbW1fc3Vic19lcHU4KGIzLCBhMyk7Ci0KLSAgICAvLyBjb21wdXRlIHxhLWJ8IHdpdGggOGIgYXJpdGhtZXRpYyBhcyBjbGlwMChhLWIpIHwgY2xpcDAoYi1hKQotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjAgPSBfbW1fb3Jfc2kxMjgoYTBwLCBhMG0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjEgPSBfbW1fb3Jfc2kxMjgoYTFwLCBhMW0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjIgPSBfbW1fb3Jfc2kxMjgoYTJwLCBhMm0pOwotICAgIGNvbnN0IF9fbTEyOGkgZGlmZjMgPSBfbW1fb3Jfc2kxMjgoYTNwLCBhM20pOwotCi0gICAgLy8gdW5wYWNrIChvbmx5IGZvdXIgb3BlcmF0aW9ucywgaW5zdGVhZCBvZiBlaWdodCkKLSAgICBjb25zdCBfX20xMjhpIGxvdzAgPSBfbW1fdW5wYWNrbG9fZXBpOChkaWZmMCwgemVybyk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3cxID0gX21tX3VucGFja2xvX2VwaTgoZGlmZjEsIHplcm8pOwotICAgIGNvbnN0IF9fbTEyOGkgbG93MiA9IF9tbV91bnBhY2tsb19lcGk4KGRpZmYyLCB6ZXJvKTsKLSAgICBjb25zdCBfX20xMjhpIGxvdzMgPSBfbW1fdW5wYWNrbG9fZXBpOChkaWZmMywgemVybyk7Ci0KLSAgICAvLyBtdWx0aXBseSB3aXRoIHNlbGYKLSAgICBjb25zdCBfX20xMjhpIGxvd19tYWRkMCA9IF9tbV9tYWRkX2VwaTE2KGxvdzAsIGxvdzApOwotICAgIGNvbnN0IF9fbTEyOGkgbG93X21hZGQxID0gX21tX21hZGRfZXBpMTYobG93MSwgbG93MSk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfbWFkZDIgPSBfbW1fbWFkZF9lcGkxNihsb3cyLCBsb3cyKTsKLSAgICBjb25zdCBfX20xMjhpIGxvd19tYWRkMyA9IF9tbV9tYWRkX2VwaTE2KGxvdzMsIGxvdzMpOwotCi0gICAgLy8gY29sbGVjdCBpbiBhIGNhc2NhZGluZyB3YXkKLSAgICBjb25zdCBfX20xMjhpIGxvd19zdW0wID0gX21tX2FkZF9lcGkzMihsb3dfbWFkZDAsIGxvd19tYWRkMSk7Ci0gICAgY29uc3QgX19tMTI4aSBsb3dfc3VtMSA9IF9tbV9hZGRfZXBpMzIobG93X21hZGQyLCBsb3dfbWFkZDMpOwotICAgIHN1bTEgPSBfbW1fYWRkX2VwaTMyKHN1bTEsIGxvd19zdW0wKTsKLSAgICBzdW0yID0gX21tX2FkZF9lcGkzMihzdW0yLCBsb3dfc3VtMSk7Ci0KLSAgICBpZiAoZG9fMTYpIHsgIC8vIGlmIG5lY2Vzc2FyeSwgcHJvY2VzcyB0aGUgaGlnaGVyIDggYnl0ZXMgc2ltaWxhcmx5Ci0gICAgICBjb25zdCBfX20xMjhpIGhpMCA9IF9tbV91bnBhY2toaV9lcGk4KGRpZmYwLCB6ZXJvKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGkxID0gX21tX3VucGFja2hpX2VwaTgoZGlmZjEsIHplcm8pOwotICAgICAgY29uc3QgX19tMTI4aSBoaTIgPSBfbW1fdW5wYWNraGlfZXBpOChkaWZmMiwgemVybyk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpMyA9IF9tbV91bnBhY2toaV9lcGk4KGRpZmYzLCB6ZXJvKTsKLQotICAgICAgY29uc3QgX19tMTI4aSBoaV9tYWRkMCA9IF9tbV9tYWRkX2VwaTE2KGhpMCwgaGkwKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfbWFkZDEgPSBfbW1fbWFkZF9lcGkxNihoaTEsIGhpMSk7Ci0gICAgICBjb25zdCBfX20xMjhpIGhpX21hZGQyID0gX21tX21hZGRfZXBpMTYoaGkyLCBoaTIpOwotICAgICAgY29uc3QgX19tMTI4aSBoaV9tYWRkMyA9IF9tbV9tYWRkX2VwaTE2KGhpMywgaGkzKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfc3VtMCA9IF9tbV9hZGRfZXBpMzIoaGlfbWFkZDAsIGhpX21hZGQxKTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgaGlfc3VtMSA9IF9tbV9hZGRfZXBpMzIoaGlfbWFkZDIsIGhpX21hZGQzKTsKLSAgICAgIHN1bTEgPSBfbW1fYWRkX2VwaTMyKHN1bTEsIGhpX3N1bTApOwotICAgICAgc3VtMiA9IF9tbV9hZGRfZXBpMzIoc3VtMiwgaGlfc3VtMSk7Ci0gICAgfQotICAgIGEgKz0gNCAqIEJQUzsKLSAgICBiICs9IDQgKiBCUFM7Ci0gIH0KLSAgewotICAgIGludDMyX3QgdG1wWzRdOwotICAgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7Ci0gICAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgU1NFMTZ4MTZTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIFNTRV9OeDRTU0UyKGEsIGIsIDQsIDEpOwotfQotCi1zdGF0aWMgaW50IFNTRTE2eDhTU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKLSAgcmV0dXJuIFNTRV9OeDRTU0UyKGEsIGIsIDIsIDEpOwotfQotCi1zdGF0aWMgaW50IFNTRTh4OFNTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgewotICByZXR1cm4gU1NFX054NFNTRTIoYSwgYiwgMiwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgU1NFNHg0U1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7Ci0gIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7Ci0KLSAgLy8gTG9hZCB2YWx1ZXMuIE5vdGUgdGhhdCB3ZSByZWFkIDggcGl4ZWxzIGluc3RlYWQgb2YgNCwKLSAgLy8gYnV0IHRoZSBhL2IgYnVmZmVycyBhcmUgb3Zlci1hbGxvY2F0ZWQgdG8gdGhhdCBlZmZlY3QuCi0gIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKLSAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmFbQlBTICogMV0pOwotICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYVtCUFMgKiAyXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZhW0JQUyAqIDNdKTsKLSAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmJbQlBTICogMF0pOwotICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmYltCUFMgKiAxXSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZiW0JQUyAqIDJdKTsKLSAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmJbQlBTICogM10pOwotCi0gIC8vIENvbWJpbmUgcGFpciBvZiBsaW5lcyBhbmQgY29udmVydCB0byAxNmIuCi0gIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX3VucGFja2xvX2VwaTMyKGEwLCBhMSk7Ci0gIGNvbnN0IF9fbTEyOGkgYTIzID0gX21tX3VucGFja2xvX2VwaTMyKGEyLCBhMyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjAxID0gX21tX3VucGFja2xvX2VwaTMyKGIwLCBiMSk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTMyKGIyLCBiMyk7Ci0gIGNvbnN0IF9fbTEyOGkgYTAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGEwMSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYTIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGEyMywgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjAxcyA9IF9tbV91bnBhY2tsb19lcGk4KGIwMSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgYjIzcyA9IF9tbV91bnBhY2tsb19lcGk4KGIyMywgemVybyk7Ci0KLSAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlczsgKGEtYileMiA9IChhYnMoYS1iKSleMiA9IChzYXQ4KGEtYikgKyBzYXQ4KGItYSkpXjIKLSAgLy8gVE9ETyhjZHV2aXZpZXIpOiBEaXNzYXNzZW1ibGUgYW5kIGZpZ3VyZSBvdXQgd2h5IHRoaXMgaXMgZmFzdGVzdC4gV2UgZG9uJ3QKLSAgLy8gICAgICAgICAgICAgICAgICBuZWVkIGFic29sdXRlIHZhbHVlcywgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBjYWxjdWxhdGlvbgotICAvLyAgICAgICAgICAgICAgICAgIGluIDhiaXQgYXMgd2UgYXJlIGFscmVhZHkgaW4gMTZiaXQsIC4uLiBZZXQgdGhpcyBpcyB3aGF0Ci0gIC8vICAgICAgICAgICAgICAgICAgYmVuY2htYXJrcyB0aGUgZmFzdGVzdCEKLSAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zdWJzX2VwdTgoYTAxcywgYjAxcyk7Ci0gIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fc3Vic19lcHU4KGIwMXMsIGEwMXMpOwotICBjb25zdCBfX20xMjhpIGQyID0gX21tX3N1YnNfZXB1OChhMjNzLCBiMjNzKTsKLSAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9zdWJzX2VwdTgoYjIzcywgYTIzcyk7Ci0KLSAgLy8gU3F1YXJlIGFuZCBhZGQgdGhlbSBhbGwgdG9nZXRoZXIuCi0gIGNvbnN0IF9fbTEyOGkgbWFkZDAgPSBfbW1fbWFkZF9lcGkxNihkMCwgZDApOwotICBjb25zdCBfX20xMjhpIG1hZGQxID0gX21tX21hZGRfZXBpMTYoZDEsIGQxKTsKLSAgY29uc3QgX19tMTI4aSBtYWRkMiA9IF9tbV9tYWRkX2VwaTE2KGQyLCBkMik7Ci0gIGNvbnN0IF9fbTEyOGkgbWFkZDMgPSBfbW1fbWFkZF9lcGkxNihkMywgZDMpOwotICBjb25zdCBfX20xMjhpIHN1bTAgPSBfbW1fYWRkX2VwaTMyKG1hZGQwLCBtYWRkMSk7Ci0gIGNvbnN0IF9fbTEyOGkgc3VtMSA9IF9tbV9hZGRfZXBpMzIobWFkZDIsIG1hZGQzKTsKLSAgY29uc3QgX19tMTI4aSBzdW0yID0gX21tX2FkZF9lcGkzMihzdW0wLCBzdW0xKTsKLQotICBpbnQzMl90IHRtcFs0XTsKLSAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0yKTsKLSAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGV4dHVyZSBkaXN0b3J0aW9uCi0vLwotLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCi0vLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCi0KLS8vIEhhZGFtYXJkIHRyYW5zZm9ybQotLy8gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB3ZWlnaHRlZCBzdW0gb2YgdGhlIGFic29sdXRlIHZhbHVlIG9mCi0vLyB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCi1zdGF0aWMgaW50IFRUcmFuc2Zvcm1TU0UyKGNvbnN0IHVpbnQ4X3QqIGluQSwgY29uc3QgdWludDhfdCogaW5CLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewotICBpbnQzMl90IHN1bVs0XTsKLSAgX19tMTI4aSB0bXBfMCwgdG1wXzEsIHRtcF8yLCB0bXBfMzsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLQotICAvLyBMb2FkLCBjb21iaW5lIGFuZCB0cmFucG9zZSBpbnB1dHMuCi0gIHsKLSAgICBjb25zdCBfX20xMjhpIGluQV8wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDBdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8xID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQV8zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5BW0JQUyAqIDNdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8wID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDBdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8xID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDFdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8yID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDJdKTsKLSAgICBjb25zdCBfX20xMjhpIGluQl8zID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5CW0JQUyAqIDNdKTsKLQotICAgIC8vIENvbWJpbmUgaW5BIGFuZCBpbkIgKHdlJ2xsIGRvIHR3byB0cmFuc2Zvcm1zIGluIHBhcmFsbGVsKS4KLSAgICBjb25zdCBfX20xMjhpIGluQUJfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQV8wLCBpbkJfMCk7Ci0gICAgY29uc3QgX19tMTI4aSBpbkFCXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFfMSwgaW5CXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8yID0gX21tX3VucGFja2xvX2VwaTgoaW5BXzIsIGluQl8yKTsKLSAgICBjb25zdCBfX20xMjhpIGluQUJfMyA9IF9tbV91bnBhY2tsb19lcGk4KGluQV8zLCBpbkJfMyk7Ci0gICAgLy8gYTAwIGIwMCBhMDEgYjAxIGEwMiBiMDMgYTAzIGIwMyAgIDAgMCAwIDAgMCAwIDAgMAotICAgIC8vIGExMCBiMTAgYTExIGIxMSBhMTIgYjEyIGExMyBiMTMgICAwIDAgMCAwIDAgMCAwIDAKLSAgICAvLyBhMjAgYjIwIGEyMSBiMjEgYTIyIGIyMiBhMjMgYjIzICAgMCAwIDAgMCAwIDAgMCAwCi0gICAgLy8gYTMwIGIzMCBhMzEgYjMxIGEzMiBiMzIgYTMzIGIzMyAgIDAgMCAwIDAgMCAwIDAgMAotCi0gICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LCBkaXNjYXJkaW5nIHRoZSBmaWxsaW5nIHplcm9lcy4KLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMCwgaW5BQl8yKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMSA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMSwgaW5BQl8zKTsKLSAgICAvLyBhMDAgYTIwICBiMDAgYjIwICBhMDEgYTIxICBiMDEgYjIxICBhMDIgYTIyICBiMDIgYjIyICBhMDMgYTIzICBiMDMgYjIzCi0gICAgLy8gYTEwIGEzMCAgYjEwIGIzMCAgYTExIGEzMSAgYjExIGIzMSAgYTEyIGEzMiAgYjEyIGIzMiAgYTEzIGEzMyAgYjEzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTgodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8xID0gX21tX3VucGFja2hpX2VwaTgodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgYjAwIGIxMCBiMjAgYjMwICBhMDEgYTExIGEyMSBhMzEgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgYjAyIGIxMiBiMjIgYjMyICBhMDMgYTEzIGEyMyBhMzMgIGIwMyBiMTMgYjIzIGIzMwotCi0gICAgLy8gQ29udmVydCB0byAxNmIuCi0gICAgdG1wXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh0cmFuc3Bvc2UxXzAsIHplcm8pOwotICAgIHRtcF8xID0gX21tX3VucGFja2hpX2VwaTgodHJhbnNwb3NlMV8wLCB6ZXJvKTsKLSAgICB0bXBfMiA9IF9tbV91bnBhY2tsb19lcGk4KHRyYW5zcG9zZTFfMSwgemVybyk7Ci0gICAgdG1wXzMgPSBfbW1fdW5wYWNraGlfZXBpOCh0cmFuc3Bvc2UxXzEsIHplcm8pOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KLSAgewotICAgIC8vIENhbGN1bGF0ZSBhIGFuZCBiICh0d28gNHg0IGF0IG9uY2UpLgotICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fYWRkX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMTYodG1wXzEsIHRtcF8zKTsKLSAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX3N1Yl9lcGkxNih0bXBfMSwgdG1wXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fc3ViX2VwaTE2KHRtcF8wLCB0bXBfMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hZGRfZXBpMTYoYTAsIGExKTsKLSAgICBjb25zdCBfX20xMjhpIGIxID0gX21tX2FkZF9lcGkxNihhMywgYTIpOwotICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fc3ViX2VwaTE2KGEzLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zdWJfZXBpMTYoYTAsIGExKTsKLSAgICAvLyBhMDAgYTAxIGEwMiBhMDMgICBiMDAgYjAxIGIwMiBiMDMKLSAgICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKLSAgICAvLyBhMjAgYTIxIGEyMiBhMjMgICBiMjAgYjIxIGIyMiBiMjMKLSAgICAvLyBhMzAgYTMxIGEzMiBhMzMgICBiMzAgYjMxIGIzMiBiMzMKLQotICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNihiMCwgYjEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8xID0gX21tX3VucGFja2xvX2VwaTE2KGIyLCBiMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzIgPSBfbW1fdW5wYWNraGlfZXBpMTYoYjAsIGIxKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNihiMiwgYjMpOwotICAgIC8vIGEwMCBhMTAgYTAxIGExMSAgIGEwMiBhMTIgYTAzIGExMwotICAgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMwotICAgIC8vIGIwMCBiMTAgYjAxIGIxMSAgIGIwMiBiMTIgYjAzIGIxMwotICAgIC8vIGIyMCBiMzAgYjIxIGIzMSAgIGIyMiBiMzIgYjIzIGIzMwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKLSAgICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMSA9IF9tbV91bnBhY2tsb19lcGkzMih0cmFuc3Bvc2UwXzIsIHRyYW5zcG9zZTBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzIgPSBfbW1fdW5wYWNraGlfZXBpMzIodHJhbnNwb3NlMF8wLCB0cmFuc3Bvc2UwXzEpOwotICAgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKLSAgICAvLyBhMDAgYTEwIGEyMCBhMzAgYTAxIGExMSBhMjEgYTMxCi0gICAgLy8gYjAwIGIxMCBiMjAgYjMwIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKLSAgICAvLyBiMDIgYjEyIGEyMiBiMzIgYjAzIGIxMyBiMjMgYjMzCi0gICAgdG1wXzAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8wLCB0cmFuc3Bvc2UxXzEpOwotICAgIHRtcF8xID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKLSAgICB0bXBfMiA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7Ci0gICAgdG1wXzMgPSBfbW1fdW5wYWNraGlfZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOwotICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAotICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIGIwMSBiMTEgYjIxIGIzMQotICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgotICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMwotICB9Ci0KLSAgLy8gVmVydGljYWwgcGFzcyBhbmQgZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zLgotICB7Ci0gICAgLy8gTG9hZCBhbGwgaW5wdXRzLgotICAgIC8vIFRPRE8oY2R1dml2aWVyKTogTWFrZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGFsbG9jYXRpb25zIGFsaWduZWQgc28KLSAgICAvLyAgICAgICAgICAgICAgICAgIHdlIGNhbiB1c2UgX21tX2xvYWRfc2kxMjggaW5zdGVhZCBvZiBfbW1fbG9hZHVfc2kxMjguCi0gICAgY29uc3QgX19tMTI4aSB3XzAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZ3WzBdKTsKLSAgICBjb25zdCBfX20xMjhpIHdfOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJndbOF0pOwotCi0gICAgLy8gQ2FsY3VsYXRlIGEgYW5kIGIgKHR3byA0eDQgYXQgb25jZSkuCi0gICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMTYodG1wXzAsIHRtcF8yKTsKLSAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2FkZF9lcGkxNih0bXBfMSwgdG1wXzMpOwotICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fc3ViX2VwaTE2KHRtcF8xLCB0bXBfMyk7Ci0gICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMTYodG1wXzAsIHRtcF8yKTsKLSAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FkZF9lcGkxNihhMCwgYTEpOwotICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYWRkX2VwaTE2KGEzLCBhMik7Ci0gICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zdWJfZXBpMTYoYTMsIGEyKTsKLSAgICBjb25zdCBfX20xMjhpIGIzID0gX21tX3N1Yl9lcGkxNihhMCwgYTEpOwotCi0gICAgLy8gU2VwYXJhdGUgdGhlIHRyYW5zZm9ybXMgb2YgaW5BIGFuZCBpbkIuCi0gICAgX19tMTI4aSBBX2IwID0gX21tX3VucGFja2xvX2VwaTY0KGIwLCBiMSk7Ci0gICAgX19tMTI4aSBBX2IyID0gX21tX3VucGFja2xvX2VwaTY0KGIyLCBiMyk7Ci0gICAgX19tMTI4aSBCX2IwID0gX21tX3VucGFja2hpX2VwaTY0KGIwLCBiMSk7Ci0gICAgX19tMTI4aSBCX2IyID0gX21tX3VucGFja2hpX2VwaTY0KGIyLCBiMyk7Ci0KLSAgICB7Ci0gICAgICAvLyBzaWduKGIpID0gYiA+PiAxNSAgKDB4MDAwMCBpZiBwb3NpdGl2ZSwgMHhmZmZmIGlmIG5lZ2F0aXZlKQotICAgICAgY29uc3QgX19tMTI4aSBzaWduX0FfYjAgPSBfbW1fc3JhaV9lcGkxNihBX2IwLCAxNSk7Ci0gICAgICBjb25zdCBfX20xMjhpIHNpZ25fQV9iMiA9IF9tbV9zcmFpX2VwaTE2KEFfYjIsIDE1KTsKLSAgICAgIGNvbnN0IF9fbTEyOGkgc2lnbl9CX2IwID0gX21tX3NyYWlfZXBpMTYoQl9iMCwgMTUpOwotICAgICAgY29uc3QgX19tMTI4aSBzaWduX0JfYjIgPSBfbW1fc3JhaV9lcGkxNihCX2IyLCAxNSk7Ci0KLSAgICAgIC8vIGIgPSBhYnMoYikgPSAoYiBeIHNpZ24pIC0gc2lnbgotICAgICAgQV9iMCA9IF9tbV94b3Jfc2kxMjgoQV9iMCwgc2lnbl9BX2IwKTsKLSAgICAgIEFfYjIgPSBfbW1feG9yX3NpMTI4KEFfYjIsIHNpZ25fQV9iMik7Ci0gICAgICBCX2IwID0gX21tX3hvcl9zaTEyOChCX2IwLCBzaWduX0JfYjApOwotICAgICAgQl9iMiA9IF9tbV94b3Jfc2kxMjgoQl9iMiwgc2lnbl9CX2IyKTsKLSAgICAgIEFfYjAgPSBfbW1fc3ViX2VwaTE2KEFfYjAsIHNpZ25fQV9iMCk7Ci0gICAgICBBX2IyID0gX21tX3N1Yl9lcGkxNihBX2IyLCBzaWduX0FfYjIpOwotICAgICAgQl9iMCA9IF9tbV9zdWJfZXBpMTYoQl9iMCwgc2lnbl9CX2IwKTsKLSAgICAgIEJfYjIgPSBfbW1fc3ViX2VwaTE2KEJfYjIsIHNpZ25fQl9iMik7Ci0gICAgfQotCi0gICAgLy8gd2VpZ2h0ZWQgc3VtcwotICAgIEFfYjAgPSBfbW1fbWFkZF9lcGkxNihBX2IwLCB3XzApOwotICAgIEFfYjIgPSBfbW1fbWFkZF9lcGkxNihBX2IyLCB3XzgpOwotICAgIEJfYjAgPSBfbW1fbWFkZF9lcGkxNihCX2IwLCB3XzApOwotICAgIEJfYjIgPSBfbW1fbWFkZF9lcGkxNihCX2IyLCB3XzgpOwotICAgIEFfYjAgPSBfbW1fYWRkX2VwaTMyKEFfYjAsIEFfYjIpOwotICAgIEJfYjAgPSBfbW1fYWRkX2VwaTMyKEJfYjAsIEJfYjIpOwotCi0gICAgLy8gZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zCi0gICAgQV9iMCA9IF9tbV9zdWJfZXBpMzIoQV9iMCwgQl9iMCk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnN1bVswXSwgQV9iMCk7Ci0gIH0KLSAgcmV0dXJuIHN1bVswXSArIHN1bVsxXSArIHN1bVsyXSArIHN1bVszXTsKLX0KLQotc3RhdGljIGludCBEaXN0bzR4NFNTRTIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGNvbnN0IGludCBkaWZmX3N1bSA9IFRUcmFuc2Zvcm1TU0UyKGEsIGIsIHcpOwotICByZXR1cm4gYWJzKGRpZmZfc3VtKSA+PiA1OwotfQotCi1zdGF0aWMgaW50IERpc3RvMTZ4MTZTU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7Ci0gIGludCBEID0gMDsKLSAgaW50IHgsIHk7Ci0gIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKLSAgICAgIEQgKz0gRGlzdG80eDRTU0UyKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIEQ7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWFudGl6YXRpb24KLS8vCi0KLS8vIFNpbXBsZSBxdWFudGl6YXRpb24KLXN0YXRpYyBpbnQgUXVhbnRpemVCbG9ja1NTRTIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7Ci0gIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmXzIwNDcgPSBfbW1fc2V0MV9lcGkxNihNQVhfTEVWRUwpOwotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBfX20xMjhpIGNvZWZmMCwgY29lZmY4OwotICBfX20xMjhpIG91dDAsIG91dDg7Ci0gIF9fbTEyOGkgcGFja2VkX291dDsKLQotICAvLyBMb2FkIGFsbCBpbnB1dHMuCi0gIC8vIFRPRE8oY2R1dml2aWVyKTogTWFrZSB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIGFsbG9jYXRpb25zIGFsaWduZWQgc28gdGhhdAotICAvLyAgICAgICAgICAgICAgICAgIHdlIGNhbiB1c2UgX21tX2xvYWRfc2kxMjggaW5zdGVhZCBvZiBfbW1fbG9hZHVfc2kxMjguCi0gIF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bMF0pOwotICBfX20xMjhpIGluOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzhdKTsKLSAgY29uc3QgX19tMTI4aSBzaGFycGVuMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+c2hhcnBlbl9bMF0pOwotICBjb25zdCBfX20xMjhpIHNoYXJwZW44ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5zaGFycGVuX1s4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgaXEwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5pcV9bMF0pOwotICBjb25zdCBfX20xMjhpIGlxOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+aXFfWzhdKTsKLSAgY29uc3QgX19tMTI4aSBiaWFzMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+Ymlhc19bMF0pOwotICBjb25zdCBfX20xMjhpIGJpYXM4ID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT5iaWFzX1s4XSk7Ci0gIGNvbnN0IF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnFfWzBdKTsKLSAgY29uc3QgX19tMTI4aSBxOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm10eC0+cV9bOF0pOwotICBjb25zdCBfX20xMjhpIHp0aHJlc2gwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmbXR4LT56dGhyZXNoX1swXSk7Ci0gIGNvbnN0IF9fbTEyOGkgenRocmVzaDggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZtdHgtPnp0aHJlc2hfWzhdKTsKLQotICAvLyBzaWduKGluKSA9IGluID4+IDE1ICAoMHgwMDAwIGlmIHBvc2l0aXZlLCAweGZmZmYgaWYgbmVnYXRpdmUpCi0gIGNvbnN0IF9fbTEyOGkgc2lnbjAgPSBfbW1fc3JhaV9lcGkxNihpbjAsIDE1KTsKLSAgY29uc3QgX19tMTI4aSBzaWduOCA9IF9tbV9zcmFpX2VwaTE2KGluOCwgMTUpOwotCi0gIC8vIGNvZWZmID0gYWJzKGluKSA9IChpbiBeIHNpZ24pIC0gc2lnbgotICBjb2VmZjAgPSBfbW1feG9yX3NpMTI4KGluMCwgc2lnbjApOwotICBjb2VmZjggPSBfbW1feG9yX3NpMTI4KGluOCwgc2lnbjgpOwotICBjb2VmZjAgPSBfbW1fc3ViX2VwaTE2KGNvZWZmMCwgc2lnbjApOwotICBjb2VmZjggPSBfbW1fc3ViX2VwaTE2KGNvZWZmOCwgc2lnbjgpOwotCi0gIC8vIGNvZWZmID0gYWJzKGluKSArIHNoYXJwZW4KLSAgY29lZmYwID0gX21tX2FkZF9lcGkxNihjb2VmZjAsIHNoYXJwZW4wKTsKLSAgY29lZmY4ID0gX21tX2FkZF9lcGkxNihjb2VmZjgsIHNoYXJwZW44KTsKLQotICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpID4+IFFGSVg7Ci0gIHsKLSAgICAvLyBkb2luZyBjYWxjdWxhdGlvbnMgd2l0aCAzMmIgcHJlY2lzaW9uIChRRklYPTE3KQotICAgIC8vIG91dCA9IChjb2VmZiAqIGlRKQotICAgIF9fbTEyOGkgY29lZmZfaVEwSCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjAsIGlxMCk7Ci0gICAgX19tMTI4aSBjb2VmZl9pUTBMID0gX21tX211bGxvX2VwaTE2KGNvZWZmMCwgaXEwKTsKLSAgICBfX20xMjhpIGNvZWZmX2lROEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmY4LCBpcTgpOwotICAgIF9fbTEyOGkgY29lZmZfaVE4TCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjgsIGlxOCk7Ci0gICAgX19tMTI4aSBvdXRfMDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7Ci0gICAgX19tMTI4aSBvdXRfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7Ci0gICAgX19tMTI4aSBvdXRfMDggPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7Ci0gICAgX19tMTI4aSBvdXRfMTIgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7Ci0gICAgLy8gZXhwYW5kIGJpYXMgZnJvbSAxNmIgdG8gMzJiCi0gICAgX19tMTI4aSBiaWFzXzAwID0gX21tX3VucGFja2xvX2VwaTE2KGJpYXMwLCB6ZXJvKTsKLSAgICBfX20xMjhpIGJpYXNfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoYmlhczAsIHplcm8pOwotICAgIF9fbTEyOGkgYmlhc18wOCA9IF9tbV91bnBhY2tsb19lcGkxNihiaWFzOCwgemVybyk7Ci0gICAgX19tMTI4aSBiaWFzXzEyID0gX21tX3VucGFja2hpX2VwaTE2KGJpYXM4LCB6ZXJvKTsKLSAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSArIEIpCi0gICAgb3V0XzAwID0gX21tX2FkZF9lcGkzMihvdXRfMDAsIGJpYXNfMDApOwotICAgIG91dF8wNCA9IF9tbV9hZGRfZXBpMzIob3V0XzA0LCBiaWFzXzA0KTsKLSAgICBvdXRfMDggPSBfbW1fYWRkX2VwaTMyKG91dF8wOCwgYmlhc18wOCk7Ci0gICAgb3V0XzEyID0gX21tX2FkZF9lcGkzMihvdXRfMTIsIGJpYXNfMTIpOwotICAgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikgPj4gUUZJWDsKLSAgICBvdXRfMDAgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDAsIFFGSVgpOwotICAgIG91dF8wNCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wNCwgUUZJWCk7Ci0gICAgb3V0XzA4ID0gX21tX3NyYWlfZXBpMzIob3V0XzA4LCBRRklYKTsKLSAgICBvdXRfMTIgPSBfbW1fc3JhaV9lcGkzMihvdXRfMTIsIFFGSVgpOwotCi0gICAgLy8gcGFjayByZXN1bHQgYXMgMTZiCi0gICAgb3V0MCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDAsIG91dF8wNCk7Ci0gICAgb3V0OCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDgsIG91dF8xMik7Ci0KLSAgICAvLyBpZiAoY29lZmYgPiAyMDQ3KSBjb2VmZiA9IDIwNDcKLSAgICBvdXQwID0gX21tX21pbl9lcGkxNihvdXQwLCBtYXhfY29lZmZfMjA0Nyk7Ci0gICAgb3V0OCA9IF9tbV9taW5fZXBpMTYob3V0OCwgbWF4X2NvZWZmXzIwNDcpOwotICB9Ci0KLSAgLy8gZ2V0IHNpZ24gYmFjayAoaWYgKHNpZ25bal0pIG91dF9uID0gLW91dF9uKQotICBvdXQwID0gX21tX3hvcl9zaTEyOChvdXQwLCBzaWduMCk7Ci0gIG91dDggPSBfbW1feG9yX3NpMTI4KG91dDgsIHNpZ244KTsKLSAgb3V0MCA9IF9tbV9zdWJfZXBpMTYob3V0MCwgc2lnbjApOwotICBvdXQ4ID0gX21tX3N1Yl9lcGkxNihvdXQ4LCBzaWduOCk7Ci0KLSAgLy8gaW4gPSBvdXQgKiBRCi0gIGluMCA9IF9tbV9tdWxsb19lcGkxNihvdXQwLCBxMCk7Ci0gIGluOCA9IF9tbV9tdWxsb19lcGkxNihvdXQ4LCBxOCk7Ci0KLSAgLy8gaWYgKGNvZWZmIDw9IG10eC0+enRocmVzaF8pIHtpbj0wOyBvdXQ9MDt9Ci0gIHsKLSAgICBfX20xMjhpIGNtcDAgPSBfbW1fY21wZ3RfZXBpMTYoY29lZmYwLCB6dGhyZXNoMCk7Ci0gICAgX19tMTI4aSBjbXA4ID0gX21tX2NtcGd0X2VwaTE2KGNvZWZmOCwgenRocmVzaDgpOwotICAgIGluMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBjbXAwKTsKLSAgICBpbjggPSBfbW1fYW5kX3NpMTI4KGluOCwgY21wOCk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzBdLCBpbjApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSwgaW44KTsKLSAgICBvdXQwID0gX21tX2FuZF9zaTEyOChvdXQwLCBjbXAwKTsKLSAgICBvdXQ4ID0gX21tX2FuZF9zaTEyOChvdXQ4LCBjbXA4KTsKLSAgfQotCi0gIC8vIHppZ3phZyB0aGUgb3V0cHV0IGJlZm9yZSBzdG9yaW5nIGl0LgotICAvLwotICAvLyBUaGUgemlnemFnIHBhdHRlcm4gY2FuIGFsbW9zdCBiZSByZXByb2R1Y2VkIHdpdGggYSBzbWFsbCBzZXF1ZW5jZSBvZgotICAvLyBzaHVmZmxlcy4gQWZ0ZXIgaXQsIHdlIG9ubHkgbmVlZCB0byBzd2FwIHRoZSA3dGggKGVuZGluZyB1cCBpbiB0aGlyZAotICAvLyBwb3NpdGlvbiBpbnN0ZWFkIG9mIHR3ZWxmdGgpIGFuZCA4dGggdmFsdWVzLgotICB7Ci0gICAgX19tMTI4aSBvdXRaMCwgb3V0Wjg7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dDAsICBfTU1fU0hVRkZMRSgyLCAxLCAzLCAwKSk7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7Ci0gICAgb3V0WjAgPSBfbW1fc2h1ZmZsZWhpX2VwaTE2KG91dFowLCBfTU1fU0hVRkZMRSgzLCAxLCAwLCAyKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dDgsICBfTU1fU0hVRkZMRSgzLCAwLCAyLCAxKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZV9lcGkzMiAgKG91dFo4LCBfTU1fU0hVRkZMRSgzLCAxLCAyLCAwKSk7Ci0gICAgb3V0WjggPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG91dFo4LCBfTU1fU0hVRkZMRSgxLCAzLCAyLCAwKSk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgb3V0WjApOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIG91dFo4KTsKLSAgICBwYWNrZWRfb3V0ID0gX21tX3BhY2tzX2VwaTE2KG91dFowLCBvdXRaOCk7Ci0gIH0KLSAgewotICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8xMiA9IG91dFsxMl07Ci0gICAgY29uc3QgaW50MTZfdCBvdXRaXzMgPSBvdXRbM107Ci0gICAgb3V0WzNdID0gb3V0Wl8xMjsKLSAgICBvdXRbMTJdID0gb3V0Wl8zOwotICB9Ci0KLSAgLy8gZGV0ZWN0IGlmIGFsbCAnb3V0JyB2YWx1ZXMgYXJlIHplcm9lcyBvciBub3QKLSAgewotICAgIGludDMyX3QgdG1wWzRdOwotICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgcGFja2VkX291dCk7Ci0gICAgaWYgKG4pIHsKLSAgICAgIHRtcFswXSAmPSB+MHhmZjsKLSAgICB9Ci0gICAgcmV0dXJuICh0bXBbM10gfHwgdG1wWzJdIHx8IHRtcFsxXSB8fCB0bXBbMF0pOwotICB9Ci19Ci0KLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudHJ5IHBvaW50Ci0KLWV4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpOwotCi12b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCi0gIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtU1NFMjsKLSAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tTU0UyOwotICBWUDhJVHJhbnNmb3JtID0gSVRyYW5zZm9ybVNTRTI7Ci0gIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtU1NFMjsKLSAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRTU0UyOwotICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2U1NFMjsKLSAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhTU0UyOwotICBWUDhTU0U4eDggPSBTU0U4eDhTU0UyOwotICBWUDhTU0U0eDQgPSBTU0U0eDRTU0UyOwotICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NFNTRTI7Ci0gIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNlNTRTI7Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9TU0UyCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvbG9zc2xlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdmNmEyNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvbG9zc2xlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDEzOTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KLS8vCi0vLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKLS8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0vLyAgICAgICAgICBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaW5jbHVkZSAiLi9kc3AuaCIKLQotLy8gRGVmaW5lIHRoZSBmb2xsb3dpbmcgaWYgdGFyZ2V0IGFyY2ggaXMgc3VyZSB0byBoYXZlIFNTRTIKLS8vICNkZWZpbmUgV0VCUF9UQVJHRVRfSEFTX1NTRTIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotI2luY2x1ZGUgPGVtbWludHJpbi5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgIi4vbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi9kZWMvdnA4bGkuaCIKLSNpbmNsdWRlICIuL3l1di5oIgotCi0jZGVmaW5lIE1BWF9ESUZGX0NPU1QgKDFlMzBmKQotCi0vLyBsb29rdXAgdGFibGUgZm9yIHNtYWxsIHZhbHVlcyBvZiBsb2cyKGludCkKLSNkZWZpbmUgQVBQUk9YX0xPR19NQVggIDQwOTYKLSNkZWZpbmUgTE9HXzJfUkVDSVBST0NBTCAxLjQ0MjY5NTA0MDg4ODk2MzM4NzAwNDY1MDk0MDA3MDg2Ci1jb25zdCBmbG9hdCBrTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7Ci0gIDAuMDAwMDAwMDAwMDAwMDAwMGYsIDAuMDAwMDAwMDAwMDAwMDAwMGYsCi0gIDEuMDAwMDAwMDAwMDAwMDAwMGYsIDEuNTg0OTYyNTAwNzIxMTU2MGYsCi0gIDIuMDAwMDAwMDAwMDAwMDAwMGYsIDIuMzIxOTI4MDk0ODg3MzYyMWYsCi0gIDIuNTg0OTYyNTAwNzIxMTU2MGYsIDIuODA3MzU0OTIyMDU3NjA0MWYsCi0gIDMuMDAwMDAwMDAwMDAwMDAwMGYsIDMuMTY5OTI1MDAxNDQyMzEyMWYsCi0gIDMuMzIxOTI4MDk0ODg3MzYyMWYsIDMuNDU5NDMxNjE4NjM3Mjk3M2YsCi0gIDMuNTg0OTYyNTAwNzIxMTU2MGYsIDMuNzAwNDM5NzE4MTQxMDkyMWYsCi0gIDMuODA3MzU0OTIyMDU3NjA0MWYsIDMuOTA2ODkwNTk1NjA4NTE4N2YsCi0gIDQuMDAwMDAwMDAwMDAwMDAwMGYsIDQuMDg3NDYyODQxMjUwMzM5MGYsCi0gIDQuMTY5OTI1MDAxNDQyMzEyMWYsIDQuMjQ3OTI3NTEzNDQzNTg1MmYsCi0gIDQuMzIxOTI4MDk0ODg3MzYyNmYsIDQuMzkyMzE3NDIyNzc4NzYwNmYsCi0gIDQuNDU5NDMxNjE4NjM3Mjk3M2YsIDQuNTIzNTYxOTU2MDU3MDEzMGYsCi0gIDQuNTg0OTYyNTAwNzIxMTU2MGYsIDQuNjQzODU2MTg5Nzc0NzI0M2YsCi0gIDQuNzAwNDM5NzE4MTQxMDkxN2YsIDQuNzU0ODg3NTAyMTYzNDY4MmYsCi0gIDQuODA3MzU0OTIyMDU3NjAzN2YsIDQuODU3OTgwOTk1MTI3NTcxOGYsCi0gIDQuOTA2ODkwNTk1NjA4NTE4N2YsIDQuOTU0MTk2MzEwMzg2ODc0OWYsCi0gIDUuMDAwMDAwMDAwMDAwMDAwMGYsIDUuMDQ0Mzk0MTE5MzU4NDUzM2YsCi0gIDUuMDg3NDYyODQxMjUwMzM5MGYsIDUuMTI5MjgzMDE2OTQ0OTY2M2YsCi0gIDUuMTY5OTI1MDAxNDQyMzEyMWYsIDUuMjA5NDUzMzY1NjI4OTUwMWYsCi0gIDUuMjQ3OTI3NTEzNDQzNTg1MmYsIDUuMjg1NDAyMjE4ODYyMjQ4N2YsCi0gIDUuMzIxOTI4MDk0ODg3MzYyNmYsIDUuMzU3NTUyMDA0NjE4MDgzN2YsCi0gIDUuMzkyMzE3NDIyNzc4NzYwNmYsIDUuNDI2MjY0NzU0NzAyMDk3OWYsCi0gIDUuNDU5NDMxNjE4NjM3Mjk3M2YsIDUuNDkxODUzMDk2MzI5Njc0N2YsCi0gIDUuNTIzNTYxOTU2MDU3MDEzMGYsIDUuNTU0NTg4ODUxNjc3NjM3NmYsCi0gIDUuNTg0OTYyNTAwNzIxMTU2MGYsIDUuNjE0NzA5ODQ0MTE1MjA4M2YsCi0gIDUuNjQzODU2MTg5Nzc0NzI0M2YsIDUuNjcyNDI1MzQxOTcxNDk1MWYsCi0gIDUuNzAwNDM5NzE4MTQxMDkxN2YsIDUuNzI3OTIwNDU0NTYzMTk4N2YsCi0gIDUuNzU0ODg3NTAyMTYzNDY4MmYsIDUuNzgxMzU5NzEzNTI0NjU5OWYsCi0gIDUuODA3MzU0OTIyMDU3NjAzN2YsIDUuODMyODkwMDE0MTY0NzQxMmYsCi0gIDUuODU3OTgwOTk1MTI3NTcxOGYsIDUuODgyNjQzMDQ5MzYxODQxNWYsCi0gIDUuOTA2ODkwNTk1NjA4NTE4N2YsIDUuOTMwNzM3MzM3NTYyODg2NmYsCi0gIDUuOTU0MTk2MzEwMzg2ODc0OWYsIDUuOTc3Mjc5OTIzNDk5OTE2N2YsCi0gIDYuMDAwMDAwMDAwMDAwMDAwMGYsIDYuMDIyMzY3ODEzMDI4NDU0M2YsCi0gIDYuMDQ0Mzk0MTE5MzU4NDUzM2YsIDYuMDY2MDg5MTkwNDU3NzcyMGYsCi0gIDYuMDg3NDYyODQxMjUwMzM5MGYsIDYuMTA4NTI0NDU2Nzc4MTY5MWYsCi0gIDYuMTI5MjgzMDE2OTQ0OTY2M2YsIDYuMTQ5NzQ3MTE5NTA0NjgyMmYsCi0gIDYuMTY5OTI1MDAxNDQyMzEyMWYsIDYuMTg5ODI0NTU4ODgwMDE3NWYsCi0gIDYuMjA5NDUzMzY1NjI4OTUwMWYsIDYuMjI4ODE4NjkwNDk1ODgwNGYsCi0gIDYuMjQ3OTI3NTEzNDQzNTg1MmYsIDYuMjY2Nzg2NTQwNjk0OTAxMGYsCi0gIDYuMjg1NDAyMjE4ODYyMjQ4N2YsIDYuMzAzNzgwNzQ4MTc3MTAzMGYsCi0gIDYuMzIxOTI4MDk0ODg3MzYyNmYsIDYuMzM5ODUwMDAyODg0NjI0M2YsCi0gIDYuMzU3NTUyMDA0NjE4MDgzN2YsIDYuMzc1MDM5NDMxMzQ2OTI0NWYsCi0gIDYuMzkyMzE3NDIyNzc4NzYwNmYsIDYuNDA5MzkwOTM2MTM3NzAxN2YsCi0gIDYuNDI2MjY0NzU0NzAyMDk3OWYsIDYuNDQyOTQzNDk1ODQ4NzI3OWYsCi0gIDYuNDU5NDMxNjE4NjM3Mjk3M2YsIDYuNDc1NzMzNDMwOTY2Mzk3NmYsCi0gIDYuNDkxODUzMDk2MzI5Njc0N2YsIDYuNTA3Nzk0NjQwMTk4Njk2M2YsCi0gIDYuNTIzNTYxOTU2MDU3MDEzMGYsIDYuNTM5MTU4ODExMTA4MDMwOWYsCi0gIDYuNTU0NTg4ODUxNjc3NjM3NmYsIDYuNTY5ODU1NjA4MzMwOTQ3OGYsCi0gIDYuNTg0OTYyNTAwNzIxMTU2MGYsIDYuNTk5OTEyODQyMTg3MTI3OGYsCi0gIDYuNjE0NzA5ODQ0MTE1MjA4M2YsIDYuNjI5MzU2NjIwMDc5NjA5NGYsCi0gIDYuNjQzODU2MTg5Nzc0NzI0M2YsIDYuNjU4MjExNDgyNzUxNzk0NmYsCi0gIDYuNjcyNDI1MzQxOTcxNDk1MWYsIDYuNjg2NTAwNTI3MTgzMjE4NWYsCi0gIDYuNzAwNDM5NzE4MTQxMDkxN2YsIDYuNzE0MjQ1NTE3NjY2MTIyNGYsCi0gIDYuNzI3OTIwNDU0NTYzMTk4N2YsIDYuNzQxNDY2OTg2NDAxMTQ2NGYsCi0gIDYuNzU0ODg3NTAyMTYzNDY4MmYsIDYuNzY4MTg0MzI0Nzc2OTI1OWYsCi0gIDYuNzgxMzU5NzEzNTI0NjU5OWYsIDYuNzk0NDE1ODY2MzUwMTA2MWYsCi0gIDYuODA3MzU0OTIyMDU3NjAzN2YsIDYuODIwMTc4OTYyNDE1MTg3OGYsCi0gIDYuODMyODkwMDE0MTY0NzQxMmYsIDYuODQ1NDkwMDUwOTQ0Mzc0N2YsCi0gIDYuODU3OTgwOTk1MTI3NTcxOGYsIDYuODcwMzY0NzE5NTgzNDA0N2YsCi0gIDYuODgyNjQzMDQ5MzYxODQxNWYsIDYuODk0ODE3NzYzMzA3OTQzN2YsCi0gIDYuOTA2ODkwNTk1NjA4NTE4N2YsIDYuOTE4ODYzMjM3Mjc0NTk0NmYsCi0gIDYuOTMwNzM3MzM3NTYyODg2NmYsIDYuOTQyNTE0NTA1MzM5MjM5OGYsCi0gIDYuOTU0MTk2MzEwMzg2ODc0OWYsIDYuOTY1Nzg0Mjg0NjYyMDg2OWYsCi0gIDYuOTc3Mjc5OTIzNDk5OTE2N2YsIDYuOTg4Njg0Njg2NzcyMTY1NGYsCi0gIDcuMDAwMDAwMDAwMDAwMDAwMGYsIDcuMDExMjI3MjU1NDIzMjUzOWYsCi0gIDcuMDIyMzY3ODEzMDI4NDU0M2YsIDcuMDMzNDIzMDAxNTM3NDUwMWYsCi0gIDcuMDQ0Mzk0MTE5MzU4NDUzM2YsIDcuMDU1MjgyNDM1NTAxMTg5OGYsCi0gIDcuMDY2MDg5MTkwNDU3NzcyMGYsIDcuMDc2ODE1NTk3MDUwODMwOGYsCi0gIDcuMDg3NDYyODQxMjUwMzM5MGYsIDcuMDk4MDMyMDgyOTYwNTI2M2YsCi0gIDcuMTA4NTI0NDU2Nzc4MTY5MWYsIDcuMTE4OTQxMDcyNzIzNTA3NmYsCi0gIDcuMTI5MjgzMDE2OTQ0OTY2M2YsIDcuMTM5NTUxMzUyMzk4NzkzNmYsCi0gIDcuMTQ5NzQ3MTE5NTA0NjgyMmYsIDcuMTU5ODcxMzM2Nzc4Mzg5MGYsCi0gIDcuMTY5OTI1MDAxNDQyMzEyMWYsIDcuMTc5OTA5MDkwMDE0OTM0NGYsCi0gIDcuMTg5ODI0NTU4ODgwMDE3NWYsIDcuMTk5NjcyMzQ0ODM2MzY0NGYsCi0gIDcuMjA5NDUzMzY1NjI4OTUwMWYsIDcuMjE5MTY4NTIwNDYyMTYxMWYsCi0gIDcuMjI4ODE4NjkwNDk1ODgwNGYsIDcuMjM4NDA0NzM5MzI1MDc4NWYsCi0gIDcuMjQ3OTI3NTEzNDQzNTg1MmYsIDcuMjU3Mzg3ODQyNjkyNjUyMWYsCi0gIDcuMjY2Nzg2NTQwNjk0OTAxMGYsIDcuMjc2MTI0NDA1Mjc0MjM3NWYsCi0gIDcuMjg1NDAyMjE4ODYyMjQ4N2YsIDcuMjk0NjIwNzQ4ODkxNjI3MGYsCi0gIDcuMzAzNzgwNzQ4MTc3MTAzMGYsIDcuMzEyODgyOTU1Mjg0MzU1N2YsCi0gIDcuMzIxOTI4MDk0ODg3MzYyNmYsIDcuMzMwOTE2ODc4MTE0NjE2N2YsCi0gIDcuMzM5ODUwMDAyODg0NjI0M2YsIDcuMzQ4NzI4MTU0MjMxMDc3MWYsCi0gIDcuMzU3NTUyMDA0NjE4MDgzN2YsIDcuMzY2MzIyMjE0MjQ1ODE2MGYsCi0gIDcuMzc1MDM5NDMxMzQ2OTI0NWYsIDcuMzgzNzA0MjkyNDc0MDUxOWYsCi0gIDcuMzkyMzE3NDIyNzc4NzYwNmYsIDcuNDAwODc5NDM2MjgyMTg0M2YsCi0gIDcuNDA5MzkwOTM2MTM3NzAxN2YsIDcuNDE3ODUyNTE0ODg1ODk4MmYsCi0gIDcuNDI2MjY0NzU0NzAyMDk3OWYsIDcuNDM0NjI4MjI3NjM2NzI0NWYsCi0gIDcuNDQyOTQzNDk1ODQ4NzI3OWYsIDcuNDUxMjExMTExODMyMzI4OWYsCi0gIDcuNDU5NDMxNjE4NjM3Mjk3M2YsIDcuNDY3NjA1NTUwMDgyOTk3NmYsCi0gIDcuNDc1NzMzNDMwOTY2Mzk3NmYsIDcuNDgzODE1Nzc3MjY0MjU2M2YsCi0gIDcuNDkxODUzMDk2MzI5Njc0N2YsIDcuNDk5ODQ1ODg3MDgzMjA1NmYsCi0gIDcuNTA3Nzk0NjQwMTk4Njk2M2YsIDcuNTE1Njk5ODM4Mjg0MDQyN2YsCi0gIDcuNTIzNTYxOTU2MDU3MDEzMGYsIDcuNTMxMzgxNDYwNTE2MzExOGYsCi0gIDcuNTM5MTU4ODExMTA4MDMwOWYsIDcuNTQ2ODk0NDU5ODg3NjM2NGYsCi0gIDcuNTU0NTg4ODUxNjc3NjM3NmYsIDcuNTYyMjQyNDI0MjIxMDcyOGYsCi0gIDcuNTY5ODU1NjA4MzMwOTQ3OGYsIDcuNTc3NDI4ODI4MDM1NzQ4NmYsCi0gIDcuNTg0OTYyNTAwNzIxMTU2MGYsIDcuNTkyNDU3MDM3MjY4MDgwNmYsCi0gIDcuNTk5OTEyODQyMTg3MTI3OGYsIDcuNjA3MzMwMzEzNzQ5NjEwNGYsCi0gIDcuNjE0NzA5ODQ0MTE1MjA4M2YsIDcuNjIyMDUxODE5NDU2Mzc2NGYsCi0gIDcuNjI5MzU2NjIwMDc5NjA5NGYsIDcuNjM2NjI0NjIwNTQzNjQ4N2YsCi0gIDcuNjQzODU2MTg5Nzc0NzI0M2YsIDcuNjUxMDUxNjkxMTc4OTI4MWYsCi0gIDcuNjU4MjExNDgyNzUxNzk0NmYsIDcuNjY1MzM1OTE3MTg1MTc2NGYsCi0gIDcuNjcyNDI1MzQxOTcxNDk1MWYsIDcuNjc5NDgwMDk5NTA1NDQ2NGYsCi0gIDcuNjg2NTAwNTI3MTgzMjE4NWYsIDcuNjkzNDg2OTU3NDk5MzI1MmYsCi0gIDcuNzAwNDM5NzE4MTQxMDkxN2YsIDcuNzA3MzU5MTMyMDgwODgyNWYsCi0gIDcuNzE0MjQ1NTE3NjY2MTIyNGYsIDcuNzIxMDk5MTg4NzA3MTg1NWYsCi0gIDcuNzI3OTIwNDU0NTYzMTk4N2YsIDcuNzM0NzA5NjIwMjI1ODM4M2YsCi0gIDcuNzQxNDY2OTg2NDAxMTQ2NGYsIDcuNzQ4MTkyODQ5NTg5NDYwNWYsCi0gIDcuNzU0ODg3NTAyMTYzNDY4MmYsIDcuNzYxNTUxMjMyNDQ0NDc5NWYsCi0gIDcuNzY4MTg0MzI0Nzc2OTI1OWYsIDcuNzc0Nzg3MDU5NjAxMTczNmYsCi0gIDcuNzgxMzU5NzEzNTI0NjU5OWYsIDcuNzg3OTAyNTU5MzkxNDMxN2YsCi0gIDcuNzk0NDE1ODY2MzUwMTA2MWYsIDcuODAwODk5ODk5OTIwMzA0N2YsCi0gIDcuODA3MzU0OTIyMDU3NjAzN2YsIDcuODEzNzgxMTkxMjE3MDM3NGYsCi0gIDcuODIwMTc4OTYyNDE1MTg3OGYsIDcuODI2NTQ4NDg3MjkwOTE1MGYsCi0gIDcuODMyODkwMDE0MTY0NzQxMmYsIDcuODM5MjAzNzg4MDk2OTQzNmYsCi0gIDcuODQ1NDkwMDUwOTQ0Mzc0N2YsIDcuODUxNzQ5MDQxNDE2MDU3MWYsCi0gIDcuODU3OTgwOTk1MTI3NTcxOGYsIDcuODY0MTg2MTQ0NjU0Mjc5N2YsCi0gIDcuODcwMzY0NzE5NTgzNDA0N2YsIDcuODc2NTE2OTQ2NTY0OTk5M2YsCi0gIDcuODgyNjQzMDQ5MzYxODQxNWYsIDcuODg4NzQzMjQ4ODk4MjU5MWYsCi0gIDcuODk0ODE3NzYzMzA3OTQzN2YsIDcuOTAwODY2ODA3OTgwNzQ4NmYsCi0gIDcuOTA2ODkwNTk1NjA4NTE4N2YsIDcuOTEyODg5MzM2MjI5OTYxOWYsCi0gIDcuOTE4ODYzMjM3Mjc0NTk0NmYsIDcuOTI0ODEyNTAzNjA1NzgxMmYsCi0gIDcuOTMwNzM3MzM3NTYyODg2NmYsIDcuOTM2NjM3OTM5MDAyNTcwOWYsCi0gIDcuOTQyNTE0NTA1MzM5MjM5OGYsIDcuOTQ4MzY3MjMxNTg0Njc3OGYsCi0gIDcuOTU0MTk2MzEwMzg2ODc0OWYsIDcuOTYwMDAxOTMyMDY4MDgwNWYsCi0gIDcuOTY1Nzg0Mjg0NjYyMDg2OWYsIDcuOTcxNTQzNTUzOTUwNzcxOWYsCi0gIDcuOTc3Mjc5OTIzNDk5OTE2N2YsIDcuOTgyOTkzNTc0Njk0MzEwM2YsCi0gIDcuOTg4Njg0Njg2NzcyMTY1NGYsIDcuOTk0MzUzNDM2ODU4ODU3N2YKLX07Ci0KLWNvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF0gPSB7Ci0gIDAuMDAwMDAwMDBmLCAgICAwLjAwMDAwMDAwZiwgIDIuMDAwMDAwMDBmLCAgIDQuNzU0ODg3NTBmLAotICA4LjAwMDAwMDAwZiwgICAxMS42MDk2NDA0N2YsICAxNS41MDk3NzUwMGYsICAxOS42NTE0ODQ0NWYsCi0gIDI0LjAwMDAwMDAwZiwgIDI4LjUyOTMyNTAxZiwgIDMzLjIxOTI4MDk1ZiwgIDM4LjA1Mzc0NzgxZiwKLSAgNDMuMDE5NTUwMDFmLCAgNDguMTA1NzE2MzRmLCAgNTMuMzAyOTY4OTFmLCAgNTguNjAzMzU4OTNmLAotICA2NC4wMDAwMDAwMGYsICA2OS40ODY4NjgzMGYsICA3NS4wNTg2NTAwM2YsICA4MC43MTA2MjI3NmYsCi0gIDg2LjQzODU2MTkwZiwgIDkyLjIzODY2NTg4ZiwgIDk4LjEwNzQ5NTYxZiwgIDEwNC4wNDE5MjQ5OWYsCi0gIDExMC4wMzkxMDAwMmYsIDExNi4wOTY0MDQ3NGYsIDEyMi4yMTE0MzI2N2YsIDEyOC4zODE5NjI1NmYsCi0gIDEzNC42MDU5Mzc4MmYsIDE0MC44ODE0NDg4NmYsIDE0Ny4yMDY3MTc4N2YsIDE1My41ODAwODU2MmYsCi0gIDE2MC4wMDAwMDAwMGYsIDE2Ni40NjUwMDU5NGYsIDE3Mi45NzM3MzY2MGYsIDE3OS41MjQ5MDU1OWYsCi0gIDE4Ni4xMTczMDAwNWYsIDE5Mi43NDk3NzQ1M2YsIDE5OS40MjEyNDU1MWYsIDIwNi4xMzA2ODY1NGYsCi0gIDIxMi44NzcxMjM4MGYsIDIxOS42NTk2MzIxOWYsIDIyNi40NzczMzE3NmYsIDIzMy4zMjkzODQ0NWYsCi0gIDI0MC4yMTQ5OTEyMmYsIDI0Ny4xMzMzODkzM2YsIDI1NC4wODM4NDk5OGYsIDI2MS4wNjU2NzYwM2YsCi0gIDI2OC4wNzgyMDAwM2YsIDI3NS4xMjA3ODIzNmYsIDI4Mi4xOTI4MDk0OWYsIDI4OS4yOTM2OTI0NGYsCi0gIDI5Ni40MjI4NjUzNGYsIDMwMy41Nzk3ODQwOWYsIDMxMC43NjM5MjUxMmYsIDMxNy45NzQ3ODQyNGYsCi0gIDMyNS4yMTE4NzU2NGYsIDMzMi40NzQ3MzA4MWYsIDMzOS43NjI4OTc3MmYsIDM0Ny4wNzU5Mzk5MWYsCi0gIDM1NC40MTM0MzU3NGYsIDM2MS43NzQ5Nzc1OWYsIDM2OS4xNjAxNzEyNGYsIDM3Ni41Njg2MzUxOGYsCi0gIDM4NC4wMDAwMDAwMGYsIDM5MS40NTM5MDc4NWYsIDM5OC45MzAwMTE4OGYsIDQwNi40Mjc5NzU3NmYsCi0gIDQxMy45NDc0NzMyMWYsIDQyMS40ODgxODc1MmYsIDQyOS4wNDk4MTExOWYsIDQzNi42MzIwNDU0OGYsCi0gIDQ0NC4yMzQ2MDAxMGYsIDQ1MS44NTcxOTI4MGYsIDQ1OS40OTk1NDkwNmYsIDQ2Ny4xNjE0MDE3OWYsCi0gIDQ3NC44NDI0OTEwMmYsIDQ4Mi41NDI1NjM2M2YsIDQ5MC4yNjEzNzMwN2YsIDQ5Ny45OTg2NzkxMWYsCi0gIDUwNS43NTQyNDc1OWYsIDUxMy41Mjc4NTAyM2YsIDUyMS4zMTkyNjQzOGYsIDUyOS4xMjgyNzI4MGYsCi0gIDUzNi45NTQ2NjM1MWYsIDU0NC43OTgyMjk1N2YsIDU1Mi42NTg3Njg5MGYsIDU2MC41MzYwODQxNGYsCi0gIDU2OC40Mjk5ODI0NGYsIDU3Ni4zNDAyNzUzNmYsIDU4NC4yNjY3Nzg2N2YsIDU5Mi4yMDkzMTIyNmYsCi0gIDYwMC4xNjc2OTk5NmYsIDYwOC4xNDE3Njk0M2YsIDYxNi4xMzEzNTIwNmYsIDYyNC4xMzYyODI3OWYsCi0gIDYzMi4xNTY0MDAwN2YsIDY0MC4xOTE1NDU2OWYsIDY0OC4yNDE1NjQ3MmYsIDY1Ni4zMDYzMDUzOWYsCi0gIDY2NC4zODU2MTg5OGYsIDY3Mi40NzkzNTk3NmYsIDY4MC41ODczODQ4OGYsIDY4OC43MDk1NTQzMGYsCi0gIDY5Ni44NDU3MzA2OWYsIDcwNC45OTU3NzkzNWYsIDcxMy4xNTk1NjgxOGYsIDcyMS4zMzY5Njc1NGYsCi0gIDcyOS41Mjc4NTAyM2YsIDczNy43MzIwOTE0MGYsIDc0NS45NDk1Njg0OWYsIDc1NC4xODAxNjExNmYsCi0gIDc2Mi40MjM3NTEyN2YsIDc3MC42ODAyMjI3NWYsIDc3OC45NDk0NjE2MWYsIDc4Ny4yMzEzNTU4NmYsCi0gIDc5NS41MjU3OTU0M2YsIDgwMy44MzI2NzIxOWYsIDgxMi4xNTE4Nzk4MmYsIDgyMC40ODMzMTM4M2YsCi0gIDgyOC44MjY4NzE0N2YsIDgzNy4xODI0NTE3MWYsIDg0NS41NDk5NTUxOGYsIDg1My45MjkyODQxNmYsCi0gIDg2Mi4zMjAzNDI0OWYsIDg3MC43MjMwMzU1OGYsIDg3OS4xMzcyNzAzNmYsIDg4Ny41NjI5NTUyMmYsCi0gIDg5Ni4wMDAwMDAwMGYsIDkwNC40NDgzMTU5NWYsIDkxMi45MDc4MTU2OWYsIDkyMS4zNzg0MTMyMGYsCi0gIDkyOS44NjAwMjM3NmYsIDkzOC4zNTI1NjM5MmYsIDk0Ni44NTU5NTE1MmYsIDk1NS4zNzAxMDU2MGYsCi0gIDk2My44OTQ5NDY0MWYsIDk3Mi40MzAzOTUzN2YsIDk4MC45NzYzNzUwNGYsIDk4OS41MzI4MDkxMWYsCi0gIDk5OC4wOTk2MjIzN2YsIDEwMDYuNjc2NzQwNjlmLCAxMDE1LjI2NDA5MDk3ZiwgMTAyMy44NjE2MDExNmYsCi0gIDEwMzIuNDY5MjAwMjFmLCAxMDQxLjA4NjgxODA1ZiwgMTA0OS43MTQzODU2MGYsIDEwNTguMzUxODM0NjlmLAotICAxMDY2Ljk5OTA5ODExZiwgMTA3NS42NTYxMDk1NWYsIDEwODQuMzIyODAzNTdmLCAxMDkyLjk5OTExNTY0ZiwKLSAgMTEwMS42ODQ5ODIwNGYsIDExMTAuMzgwMzM5OTNmLCAxMTE5LjA4NTEyNzI3ZiwgMTEyNy43OTkyODI4MmYsCi0gIDExMzYuNTIyNzQ2MTRmLCAxMTQ1LjI1NTQ1NzU4ZiwgMTE1My45OTczNTgyMWYsIDExNjIuNzQ4Mzg5ODlmLAotICAxMTcxLjUwODQ5NTE4ZiwgMTE4MC4yNzc2MTczOGYsIDExODkuMDU1NzAwNDdmLCAxMTk3Ljg0MjY4OTE0ZiwKLSAgMTIwNi42Mzg1Mjg3NmYsIDEyMTUuNDQzMTY1MzVmLCAxMjI0LjI1NjU0NTYwZiwgMTIzMy4wNzg2MTY4NGYsCi0gIDEyNDEuOTA5MzI3MDNmLCAxMjUwLjc0ODYyNDczZiwgMTI1OS41OTY0NTkxNGYsIDEyNjguNDUyNzgwMDVmLAotICAxMjc3LjMxNzUzNzgxZiwgMTI4Ni4xOTA2ODMzOGYsIDEyOTUuMDcyMTY4MjhmLCAxMzAzLjk2MTk0NDU3ZiwKLSAgMTMxMi44NTk5NjQ4OGYsIDEzMjEuNzY2MTgyMzZmLCAxMzMwLjY4MDU1MDcxZiwgMTMzOS42MDMwMjQxM2YsCi0gIDEzNDguNTMzNTU3MzRmLCAxMzU3LjQ3MjEwNTU2ZiwgMTM2Ni40MTg2MjQ1MmYsIDEzNzUuMzczMDcwNDFmLAotICAxMzg0LjMzNTM5OTkxZiwgMTM5My4zMDU1NzAyMGYsIDE0MDIuMjgzNTM4ODdmLCAxNDExLjI2OTI2NDAwZiwKLSAgMTQyMC4yNjI3MDQxMmYsIDE0MjkuMjYzODE4MThmLCAxNDM4LjI3MjU2NTU4ZiwgMTQ0Ny4yODg5MDYxNWYsCi0gIDE0NTYuMzEyODAwMTRmLCAxNDY1LjM0NDIwODE5ZiwgMTQ3NC4zODMwOTEzOGYsIDE0ODMuNDI5NDExMThmLAotICAxNDkyLjQ4MzEyOTQ1ZiwgMTUwMS41NDQyMDg0M2YsIDE1MTAuNjEyNjEwNzhmLCAxNTE5LjY4ODI5OTQ5ZiwKLSAgMTUyOC43NzEyMzc5NWYsIDE1MzcuODYxMzg5OTNmLCAxNTQ2Ljk1ODcxOTUyZiwgMTU1Ni4wNjMxOTExOWYsCi0gIDE1NjUuMTc0NzY5NzZmLCAxNTc0LjI5MzQyMDQwZiwgMTU4My40MTkxMDg2MGYsIDE1OTIuNTUxODAwMjBmLAotICAxNjAxLjY5MTQ2MTM3ZiwgMTYxMC44MzgwNTg2MGYsIDE2MTkuOTkxNTU4NzFmLCAxNjI5LjE1MTkyODgyZiwKLSAgMTYzOC4zMTkxMzYzN2YsIDE2NDcuNDkzMTQ5MTFmLCAxNjU2LjY3MzkzNTA5ZiwgMTY2NS44NjE0NjI2NmYsCi0gIDE2NzUuMDU1NzAwNDdmLCAxNjg0LjI1NjYxNzQ0ZiwgMTY5My40NjQxODI4MGYsIDE3MDIuNjc4MzY2MDVmLAotICAxNzExLjg5OTEzNjk4ZiwgMTcyMS4xMjY0NjU2M2YsIDE3MzAuMzYwMzIyMzNmLCAxNzM5LjYwMDY3NzY4ZiwKLSAgMTc0OC44NDc1MDI1NGYsIDE3NTguMTAwNzY4MDJmLCAxNzY3LjM2MDQ0NTUxZiwgMTc3Ni42MjY1MDY2MmYsCi0gIDE3ODUuODk4OTIzMjNmLCAxNzk1LjE3NzY2NzQ3ZiwgMTgwNC40NjI3MTE3MmYsIDE4MTMuNzU0MDI4NTdmLAotICAxODIzLjA1MTU5MDg3ZiwgMTgzMi4zNTUzNzE3MGYsIDE4NDEuNjY1MzQ0MzhmLCAxODUwLjk4MTQ4MjQ0ZiwKLSAgMTg2MC4zMDM3NTk2NWYsIDE4NjkuNjMyMTQ5OTlmLCAxODc4Ljk2NjYyNzY3ZiwgMTg4OC4zMDcxNjcxMWYsCi0gIDE4OTcuNjUzNzQyOTVmLCAxOTA3LjAwNjMzMDAzZiwgMTkxNi4zNjQ5MDM0MmYsIDE5MjUuNzI5NDM4MzhmLAotICAxOTM1LjA5OTkxMDM3ZiwgMTk0NC40NzYyOTUwNmYsIDE5NTMuODU4NTY4MzFmLCAxOTYzLjI0NjcwNjIwZiwKLSAgMTk3Mi42NDA2ODQ5OGYsIDE5ODIuMDQwNDgxMDhmLCAxOTkxLjQ0NjA3MTE3ZiwgMjAwMC44NTc0MzIwNGYsCi0gIDIwMTAuMjc0NTQwNzJmLCAyMDE5LjY5NzM3NDQwZiwgMjAyOS4xMjU5MTA0NGYsIDIwMzguNTYwMTI2NDBmCi19OwotCi1mbG9hdCBWUDhMRmFzdFNMb2cyU2xvdyhpbnQgdikgewotICBTQl9EQ0hFQ0sodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOwotICBpZiAodiA8IEFQUFJPWF9MT0dfTUFYKSB7Ci0gICAgaW50IGxvZ19jbnQgPSAwOwotICAgIGNvbnN0IGZsb2F0IHZfZiA9IChmbG9hdCl2OwotICAgIHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCkgewotICAgICAgKytsb2dfY250OwotICAgICAgdiA9IHYgPj4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIHZfZiAqIChrTG9nMlRhYmxlW3ZdICsgbG9nX2NudCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIHYgKiBsb2coKGRvdWJsZSl2KSk7Ci0gIH0KLX0KLQotZmxvYXQgVlA4TEZhc3RMb2cyU2xvdyhpbnQgdikgewotICBTQl9EQ0hFQ0sodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOwotICBpZiAodiA8IEFQUFJPWF9MT0dfTUFYKSB7Ci0gICAgaW50IGxvZ19jbnQgPSAwOwotICAgIHdoaWxlICh2ID49IExPR19MT09LVVBfSURYX01BWCkgewotICAgICAgKytsb2dfY250OwotICAgICAgdiA9IHYgPj4gMTsKLSAgICB9Ci0gICAgcmV0dXJuIGtMb2cyVGFibGVbdl0gKyBsb2dfY250OwotICB9IGVsc2UgewotICAgIHJldHVybiAoZmxvYXQpKExPR18yX1JFQ0lQUk9DQUwgKiBsb2coKGRvdWJsZSl2KSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltYWdlIHRyYW5zZm9ybXMuCi0KLS8vIEluLXBsYWNlIHN1bSBvZiBlYWNoIGNvbXBvbmVudCB3aXRoIG1vZCAyNTYuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRQaXhlbHNFcSh1aW50MzJfdCogYSwgdWludDMyX3QgYikgewotICBjb25zdCB1aW50MzJfdCBhbHBoYV9hbmRfZ3JlZW4gPSAoKmEgJiAweGZmMDBmZjAwdSkgKyAoYiAmIDB4ZmYwMGZmMDB1KTsKLSAgY29uc3QgdWludDMyX3QgcmVkX2FuZF9ibHVlID0gKCphICYgMHgwMGZmMDBmZnUpICsgKGIgJiAweDAwZmYwMGZmdSk7Ci0gICphID0gKGFscGhhX2FuZF9ncmVlbiAmIDB4ZmYwMGZmMDB1KSB8IChyZWRfYW5kX2JsdWUgJiAweDAwZmYwMGZmdSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKLSAgcmV0dXJuICgoKGEwIF4gYTEpICYgMHhmZWZlZmVmZUwpID4+IDEpICsgKGEwICYgYTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgewotICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgewotICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Ci19Ci0KLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMwKSwgemVybyk7Ci0gIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMSksIHplcm8pOwotICBjb25zdCBfX20xMjhpIEMyID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBWMSA9IF9tbV9hZGRfZXBpMTYoQzAsIEMxKTsKLSAgY29uc3QgX19tMTI4aSBWMiA9IF9tbV9zdWJfZXBpMTYoVjEsIEMyKTsKLSAgY29uc3QgX19tMTI4aSBiID0gX21tX3BhY2t1c19lcGkxNihWMiwgVjIpOwotICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihiKTsKLSAgcmV0dXJuIG91dHB1dDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGYodWludDMyX3QgYzAsIHVpbnQzMl90IGMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKLSAgY29uc3QgdWludDMyX3QgYXZlID0gQXZlcmFnZTIoYzAsIGMxKTsKLSAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKLSAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGF2ZSksIHplcm8pOwotICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKLSAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zdWJfZXBpMTYoQTAsIEIwKTsKLSAgY29uc3QgX19tMTI4aSBCZ3RBID0gX21tX2NtcGd0X2VwaTE2KEIwLCBBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc3ViX2VwaTE2KEExLCBCZ3RBKTsKLSAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zcmFpX2VwaTE2KEEyLCAxKTsKLSAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9hZGRfZXBpMTYoQTAsIEEzKTsKLSAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9wYWNrdXNfZXBpMTYoQTQsIEE0KTsKLSAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gX21tX2N2dHNpMTI4X3NpMzIoQTUpOwotICByZXR1cm4gb3V0cHV0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKLSAgaW50IHBhX21pbnVzX3BiOwotICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOwotICBjb25zdCBfX20xMjhpIEEwID0gX21tX2N2dHNpMzJfc2kxMjgoYSk7Ci0gIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fY3Z0c2kzMl9zaTEyOChiKTsKLSAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGMpOwotICBjb25zdCBfX20xMjhpIEFDMCA9IF9tbV9zdWJzX2VwdTgoQTAsIEMwKTsKLSAgY29uc3QgX19tMTI4aSBDQTAgPSBfbW1fc3Vic19lcHU4KEMwLCBBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQkMwID0gX21tX3N1YnNfZXB1OChCMCwgQzApOwotICBjb25zdCBfX20xMjhpIENCMCA9IF9tbV9zdWJzX2VwdTgoQzAsIEIwKTsKLSAgY29uc3QgX19tMTI4aSBBQyA9IF9tbV9vcl9zaTEyOChBQzAsIENBMCk7Ci0gIGNvbnN0IF9fbTEyOGkgQkMgPSBfbW1fb3Jfc2kxMjgoQkMwLCBDQjApOwotICBjb25zdCBfX20xMjhpIHBhID0gX21tX3VucGFja2xvX2VwaTgoQUMsIHplcm8pOyAgLy8gfGEgLSBjfAotICBjb25zdCBfX20xMjhpIHBiID0gX21tX3VucGFja2xvX2VwaTgoQkMsIHplcm8pOyAgLy8gfGIgLSBjfAotICBjb25zdCBfX20xMjhpIGRpZmYgPSBfbW1fc3ViX2VwaTE2KHBiLCBwYSk7Ci0gIHsKLSAgICBpbnQxNl90IG91dFs4XTsKLSAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilvdXQsIGRpZmYpOwotICAgIHBhX21pbnVzX3BiID0gb3V0WzBdICsgb3V0WzFdICsgb3V0WzJdICsgb3V0WzNdOwotICB9Ci0gIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKLX0KLQotI2Vsc2UKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsaXAyNTUodWludDMyX3QgYSkgewotICBpZiAoYSA8IDI1NikgewotICAgIHJldHVybiBhOwotICB9Ci0gIC8vIHJldHVybiAwLCB3aGVuIGEgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLgotICAvLyByZXR1cm4gMjU1LCB3aGVuIGEgaXMgcG9zaXRpdmUuCi0gIHJldHVybiB+YSA+PiAyNDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgewotICByZXR1cm4gQ2xpcDI1NShhICsgYiAtIGMpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgewotICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKLSAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gMTYpICYgMHhmZik7Ci0gIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiA4KSAmIDB4ZmYpOwotICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCAmIDB4ZmYsIGMxICYgMHhmZiwgYzIgJiAweGZmKTsKLSAgcmV0dXJuIChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoaW50IGEsIGludCBiKSB7Ci0gIHJldHVybiBDbGlwMjU1KGEgKyAoYSAtIGIpIC8gMik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGF2ZSA9IEF2ZXJhZ2UyKGMwLCBjMSk7Ci0gIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGF2ZSA+PiAyNCwgYzIgPj4gMjQpOwotICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDE2KSAmIDB4ZmYsIChjMiA+PiAxNikgJiAweGZmKTsKLSAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiA4KSAmIDB4ZmYsIChjMiA+PiA4KSAmIDB4ZmYpOwotICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDApICYgMHhmZiwgKGMyID4+IDApICYgMHhmZik7Ci0gIHJldHVybiAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgU3ViMyhpbnQgYSwgaW50IGIsIGludCBjKSB7Ci0gIGNvbnN0IGludCBwYiA9IGIgLSBjOwotICBjb25zdCBpbnQgcGEgPSBhIC0gYzsKLSAgcmV0dXJuIGFicyhwYikgLSBhYnMocGEpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKLSAgY29uc3QgaW50IHBhX21pbnVzX3BiID0KLSAgICAgIFN1YjMoKGEgPj4gMjQpICAgICAgICwgKGIgPj4gMjQpICAgICAgICwgKGMgPj4gMjQpICAgICAgICkgKwotICAgICAgU3ViMygoYSA+PiAxNikgJiAweGZmLCAoYiA+PiAxNikgJiAweGZmLCAoYyA+PiAxNikgJiAweGZmKSArCi0gICAgICBTdWIzKChhID4+ICA4KSAmIDB4ZmYsIChiID4+ICA4KSAmIDB4ZmYsIChjID4+ICA4KSAmIDB4ZmYpICsKLSAgICAgIFN1YjMoKGEgICAgICApICYgMHhmZiwgKGIgICAgICApICYgMHhmZiwgKGMgICAgICApICYgMHhmZik7Ci0gIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKLX0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlZGljdG9ycwotCi1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKXRvcDsKLSAgKHZvaWQpbGVmdDsKLSAgcmV0dXJuIEFSR0JfQkxBQ0s7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKXRvcDsKLSAgcmV0dXJuIGxlZnQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbMF07Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbMV07Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiB0b3BbLTFdOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjUodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTMobGVmdCwgdG9wWzBdLCB0b3BbMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLXN0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjgodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIodG9wWy0xXSwgdG9wWzBdKTsKLSAgKHZvaWQpbGVmdDsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7Ci0gICh2b2lkKWxlZnQ7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTEodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gU2VsZWN0KHRvcFswXSwgbGVmdCwgdG9wWy0xXSk7Ci0gIHJldHVybiBwcmVkOwotfQotc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKLSAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKLSAgcmV0dXJuIHByZWQ7Ci19Ci1zdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgewotICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOwotICByZXR1cm4gcHJlZDsKLX0KLQotdHlwZWRlZiB1aW50MzJfdCAoKlByZWRpY3RvckZ1bmMpKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApOwotc3RhdGljIGNvbnN0IFByZWRpY3RvckZ1bmMga1ByZWRpY3RvcnNbMTZdID0gewotICBQcmVkaWN0b3IwLCBQcmVkaWN0b3IxLCBQcmVkaWN0b3IyLCBQcmVkaWN0b3IzLAotICBQcmVkaWN0b3I0LCBQcmVkaWN0b3I1LCBQcmVkaWN0b3I2LCBQcmVkaWN0b3I3LAotICBQcmVkaWN0b3I4LCBQcmVkaWN0b3I5LCBQcmVkaWN0b3IxMCwgUHJlZGljdG9yMTEsCi0gIFByZWRpY3RvcjEyLCBQcmVkaWN0b3IxMywKLSAgUHJlZGljdG9yMCwgUHJlZGljdG9yMCAgICAvLyA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscwotfTsKLQotLy8gVE9ETyh2aWthc2EpOiBSZXBsYWNlIDI1NiBldGMgd2l0aCBkZWZpbmVzLgotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb25zdCBpbnQqIGNvdW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodF8wLCBkb3VibGUgZXhwX3ZhbCkgewotICBjb25zdCBpbnQgc2lnbmlmaWNhbnRfc3ltYm9scyA9IDE2OwotICBjb25zdCBkb3VibGUgZXhwX2RlY2F5X2ZhY3RvciA9IDAuNjsKLSAgZG91YmxlIGJpdHMgPSB3ZWlnaHRfMCAqIGNvdW50c1swXTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDE7IGkgPCBzaWduaWZpY2FudF9zeW1ib2xzOyArK2kpIHsKLSAgICBiaXRzICs9IGV4cF92YWwgKiAoY291bnRzW2ldICsgY291bnRzWzI1NiAtIGldKTsKLSAgICBleHBfdmFsICo9IGV4cF9kZWNheV9mYWN0b3I7Ci0gIH0KLSAgcmV0dXJuIChmbG9hdCkoLTAuMSAqIGJpdHMpOwotfQotCi0vLyBDb21wdXRlIHRoZSBjb21iaW5lZCBTaGFub24ncyBlbnRyb3B5IGZvciBkaXN0cmlidXRpb24ge1h9IGFuZCB7WCtZfQotc3RhdGljIGZsb2F0IENvbWJpbmVkU2hhbm5vbkVudHJvcHkoY29uc3QgaW50KiBjb25zdCBYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBZLCBpbnQgbikgewotICBpbnQgaTsKLSAgZG91YmxlIHJldHZhbCA9IDAuOwotICBpbnQgc3VtWCA9IDAsIHN1bVhZID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgIGNvbnN0IGludCB4ID0gWFtpXTsKLSAgICBjb25zdCBpbnQgeHkgPSBYW2ldICsgWVtpXTsKLSAgICBpZiAoeCAhPSAwKSB7Ci0gICAgICBzdW1YICs9IHg7Ci0gICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih4KTsKLSAgICB9Ci0gICAgaWYgKHh5ICE9IDApIHsKLSAgICAgIHN1bVhZICs9IHh5OwotICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoeHkpOwotICAgIH0KLSAgfQotICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW1YKSArIFZQOExGYXN0U0xvZzIoc3VtWFkpOwotICByZXR1cm4gKGZsb2F0KXJldHZhbDsKLX0KLQotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShpbnQgYWNjdW11bGF0ZWRbNF1bMjU2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVbNF1bMjU2XSkgewotICBpbnQgaTsKLSAgZG91YmxlIHJldHZhbCA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMC45NDsKLSAgICByZXR2YWwgKz0gUHJlZGljdGlvbkNvc3RTcGF0aWFsKHRpbGVbaV0sIDEsIGtFeHBWYWx1ZSk7Ci0gICAgcmV0dmFsICs9IENvbWJpbmVkU2hhbm5vbkVudHJvcHkodGlsZVtpXSwgYWNjdW11bGF0ZWRbaV0sIDI1Nik7Ci0gIH0KLSAgcmV0dXJuIChmbG9hdClyZXR2YWw7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0QmVzdFByZWRpY3RvckZvclRpbGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY3VtdWxhdGVkWzRdWzI1Nl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gpIHsKLSAgY29uc3QgaW50IGtOdW1QcmVkTW9kZXMgPSAxNDsKLSAgY29uc3QgaW50IGNvbF9zdGFydCA9IHRpbGVfeCA8PCBiaXRzOwotICBjb25zdCBpbnQgcm93X3N0YXJ0ID0gdGlsZV95IDw8IGJpdHM7Ci0gIGNvbnN0IGludCB0aWxlX3NpemUgPSAxIDw8IGJpdHM7Ci0gIGNvbnN0IGludCB5bWF4ID0gKHRpbGVfc2l6ZSA8PSBoZWlnaHQgLSByb3dfc3RhcnQpID8KLSAgICAgIHRpbGVfc2l6ZSA6IGhlaWdodCAtIHJvd19zdGFydDsKLSAgY29uc3QgaW50IHhtYXggPSAodGlsZV9zaXplIDw9IHdpZHRoIC0gY29sX3N0YXJ0KSA/Ci0gICAgICB0aWxlX3NpemUgOiB3aWR0aCAtIGNvbF9zdGFydDsKLSAgaW50IGhpc3RvWzRdWzI1Nl07Ci0gIGZsb2F0IGJlc3RfZGlmZiA9IE1BWF9ESUZGX0NPU1Q7Ci0gIGludCBiZXN0X21vZGUgPSAwOwotCi0gIGludCBtb2RlOwotICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwga051bVByZWRNb2RlczsgKyttb2RlKSB7Ci0gICAgY29uc3QgdWludDMyX3QqIGN1cnJlbnRfcm93ID0gYXJnYl9zY3JhdGNoOwotICAgIGNvbnN0IFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbbW9kZV07Ci0gICAgZmxvYXQgY3VyX2RpZmY7Ci0gICAgaW50IHk7Ci0gICAgU2JNZW1vcnlTZXQoJmhpc3RvWzBdWzBdLCAwLCBzaXplb2YoaGlzdG8pKTsKLSAgICBmb3IgKHkgPSAwOyB5IDwgeW1heDsgKyt5KSB7Ci0gICAgICBpbnQgeDsKLSAgICAgIGNvbnN0IGludCByb3cgPSByb3dfc3RhcnQgKyB5OwotICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OwotICAgICAgY3VycmVudF9yb3cgPSB1cHBlcl9yb3cgKyB3aWR0aDsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB4bWF4OyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbCA9IGNvbF9zdGFydCArIHg7Ci0gICAgICAgIHVpbnQzMl90IHByZWRpY3Q7Ci0gICAgICAgIHVpbnQzMl90IHByZWRpY3RfZGlmZjsKLSAgICAgICAgaWYgKHJvdyA9PSAwKSB7Ci0gICAgICAgICAgcHJlZGljdCA9IChjb2wgPT0gMCkgPyBBUkdCX0JMQUNLIDogY3VycmVudF9yb3dbY29sIC0gMV07ICAvLyBMZWZ0LgotICAgICAgICB9IGVsc2UgaWYgKGNvbCA9PSAwKSB7Ci0gICAgICAgICAgcHJlZGljdCA9IHVwcGVyX3Jvd1tjb2xdOyAgLy8gVG9wLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbY29sIC0gMV0sIHVwcGVyX3JvdyArIGNvbCk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZGljdF9kaWZmID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1tjb2xdLCBwcmVkaWN0KTsKLSAgICAgICAgKytoaXN0b1swXVtwcmVkaWN0X2RpZmYgPj4gMjRdOwotICAgICAgICArK2hpc3RvWzFdWygocHJlZGljdF9kaWZmID4+IDE2KSAmIDB4ZmYpXTsKLSAgICAgICAgKytoaXN0b1syXVsoKHByZWRpY3RfZGlmZiA+PiA4KSAmIDB4ZmYpXTsKLSAgICAgICAgKytoaXN0b1szXVsocHJlZGljdF9kaWZmICYgMHhmZildOwotICAgICAgfQotICAgIH0KLSAgICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShhY2N1bXVsYXRlZCwgaGlzdG8pOwotICAgIGlmIChjdXJfZGlmZiA8IGJlc3RfZGlmZikgewotICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7Ci0gICAgICBiZXN0X21vZGUgPSBtb2RlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBiZXN0X21vZGU7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlUaWxlV2l0aFByZWRpY3Rpb24oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywgaW50IG1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCBjb2xfc3RhcnQgPSB0aWxlX3ggPDwgYml0czsKLSAgY29uc3QgaW50IHJvd19zdGFydCA9IHRpbGVfeSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgeW1heCA9ICh0aWxlX3NpemUgPD0gaGVpZ2h0IC0gcm93X3N0YXJ0KSA/Ci0gICAgICB0aWxlX3NpemUgOiBoZWlnaHQgLSByb3dfc3RhcnQ7Ci0gIGNvbnN0IGludCB4bWF4ID0gKHRpbGVfc2l6ZSA8PSB3aWR0aCAtIGNvbF9zdGFydCkgPwotICAgICAgdGlsZV9zaXplIDogd2lkdGggLSBjb2xfc3RhcnQ7Ci0gIGNvbnN0IFByZWRpY3RvckZ1bmMgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbbW9kZV07Ci0gIGNvbnN0IHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IGFyZ2Jfc2NyYXRjaDsKLQotICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHltYXg7ICsreSkgewotICAgIGludCB4OwotICAgIGNvbnN0IGludCByb3cgPSByb3dfc3RhcnQgKyB5OwotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB1cHBlcl9yb3cgPSBjdXJyZW50X3JvdzsKLSAgICBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoOwotICAgIGZvciAoeCA9IDA7IHggPCB4bWF4OyArK3gpIHsKLSAgICAgIGNvbnN0IGludCBjb2wgPSBjb2xfc3RhcnQgKyB4OwotICAgICAgY29uc3QgaW50IHBpeCA9IHJvdyAqIHdpZHRoICsgY29sOwotICAgICAgdWludDMyX3QgcHJlZGljdDsKLSAgICAgIGlmIChyb3cgPT0gMCkgewotICAgICAgICBwcmVkaWN0ID0gKGNvbCA9PSAwKSA/IEFSR0JfQkxBQ0sgOiBjdXJyZW50X3Jvd1tjb2wgLSAxXTsgIC8vIExlZnQuCi0gICAgICB9IGVsc2UgaWYgKGNvbCA9PSAwKSB7Ci0gICAgICAgIHByZWRpY3QgPSB1cHBlcl9yb3dbY29sXTsgIC8vIFRvcC4KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbY29sIC0gMV0sIHVwcGVyX3JvdyArIGNvbCk7Ci0gICAgICB9Ci0gICAgICBhcmdiW3BpeF0gPSBWUDhMU3ViUGl4ZWxzKGN1cnJlbnRfcm93W2NvbF0sIHByZWRpY3QpOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgaW1hZ2UpIHsKLSAgY29uc3QgaW50IG1heF90aWxlX3NpemUgPSAxIDw8IGJpdHM7Ci0gIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOwotICBjb25zdCBpbnQgdGlsZXNfcGVyX2NvbCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgYml0cyk7Ci0gIHVpbnQzMl90KiBjb25zdCB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7Ci0gIHVpbnQzMl90KiBjb25zdCBjdXJyZW50X3RpbGVfcm93cyA9IGFyZ2Jfc2NyYXRjaCArIHdpZHRoOwotICBpbnQgdGlsZV95OwotICBpbnQgaGlzdG9bNF1bMjU2XTsKLSAgU2JNZW1vcnlTZXQoaGlzdG8sIDAsIHNpemVvZihoaXN0bykpOwotICBmb3IgKHRpbGVfeSA9IDA7IHRpbGVfeSA8IHRpbGVzX3Blcl9jb2w7ICsrdGlsZV95KSB7Ci0gICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOwotICAgIGNvbnN0IGludCB0aGlzX3RpbGVfaGVpZ2h0ID0KLSAgICAgICAgKHRpbGVfeSA8IHRpbGVzX3Blcl9jb2wgLSAxKSA/IG1heF90aWxlX3NpemUgOiBoZWlnaHQgLSB0aWxlX3lfb2Zmc2V0OwotICAgIGludCB0aWxlX3g7Ci0gICAgaWYgKHRpbGVfeSA+IDApIHsKLSAgICAgIFNiTWVtb3J5Q29weSh1cHBlcl9yb3csIGN1cnJlbnRfdGlsZV9yb3dzICsgKG1heF90aWxlX3NpemUgLSAxKSAqIHdpZHRoLAotICAgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCp1cHBlcl9yb3cpKTsKLSAgICB9Ci0gICAgU2JNZW1vcnlDb3B5KGN1cnJlbnRfdGlsZV9yb3dzLCAmYXJnYlt0aWxlX3lfb2Zmc2V0ICogd2lkdGhdLAotICAgICAgICAgICB0aGlzX3RpbGVfaGVpZ2h0ICogd2lkdGggKiBzaXplb2YoKmN1cnJlbnRfdGlsZV9yb3dzKSk7Ci0gICAgZm9yICh0aWxlX3ggPSAwOyB0aWxlX3ggPCB0aWxlc19wZXJfcm93OyArK3RpbGVfeCkgewotICAgICAgaW50IHByZWQ7Ci0gICAgICBpbnQgeTsKLSAgICAgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGludCBhbGxfeF9tYXggPSB0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZTsKLSAgICAgIGlmIChhbGxfeF9tYXggPiB3aWR0aCkgewotICAgICAgICBhbGxfeF9tYXggPSB3aWR0aDsKLSAgICAgIH0KLSAgICAgIHByZWQgPSBHZXRCZXN0UHJlZGljdG9yRm9yVGlsZSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3gsIHRpbGVfeSwgYml0cywgaGlzdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYl9zY3JhdGNoKTsKLSAgICAgIGltYWdlW3RpbGVfeSAqIHRpbGVzX3Blcl9yb3cgKyB0aWxlX3hdID0gMHhmZjAwMDAwMHUgfCAocHJlZCA8PCA4KTsKLSAgICAgIENvcHlUaWxlV2l0aFByZWRpY3Rpb24od2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksIGJpdHMsIHByZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2Jfc2NyYXRjaCwgYXJnYik7Ci0gICAgICBmb3IgKHkgPSAwOyB5IDwgbWF4X3RpbGVfc2l6ZTsgKyt5KSB7Ci0gICAgICAgIGludCBpeDsKLSAgICAgICAgaW50IGFsbF94OwotICAgICAgICBpbnQgYWxsX3kgPSB0aWxlX3lfb2Zmc2V0ICsgeTsKLSAgICAgICAgaWYgKGFsbF95ID49IGhlaWdodCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGl4ID0gYWxsX3kgKiB3aWR0aCArIHRpbGVfeF9vZmZzZXQ7Ci0gICAgICAgIGZvciAoYWxsX3ggPSB0aWxlX3hfb2Zmc2V0OyBhbGxfeCA8IGFsbF94X21heDsgKythbGxfeCwgKytpeCkgewotICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhcmdiW2l4XTsKLSAgICAgICAgICArK2hpc3RvWzBdW2EgPj4gMjRdOwotICAgICAgICAgICsraGlzdG9bMV1bKChhID4+IDE2KSAmIDB4ZmYpXTsKLSAgICAgICAgICArK2hpc3RvWzJdWygoYSA+PiA4KSAmIDB4ZmYpXTsKLSAgICAgICAgICArK2hpc3RvWzNdWyhhICYgMHhmZildOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS8vIEludmVyc2UgcHJlZGljdGlvbi4KLXN0YXRpYyB2b2lkIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm0oY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCB1aW50MzJfdCogZGF0YSkgewotICBjb25zdCBpbnQgd2lkdGggPSB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgaWYgKHlfc3RhcnQgPT0gMCkgeyAgLy8gRmlyc3QgUm93IGZvbGxvd3MgdGhlIEwgKG1vZGU9MSkgbW9kZS4KLSAgICBpbnQgeDsKLSAgICBjb25zdCB1aW50MzJfdCBwcmVkMCA9IFByZWRpY3RvcjAoZGF0YVstMV0sIE5VTEwpOwotICAgIEFkZFBpeGVsc0VxKGRhdGEsIHByZWQwKTsKLSAgICBmb3IgKHggPSAxOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgY29uc3QgdWludDMyX3QgcHJlZDEgPSBQcmVkaWN0b3IxKGRhdGFbeCAtIDFdLCBOVUxMKTsKLSAgICAgIEFkZFBpeGVsc0VxKGRhdGEgKyB4LCBwcmVkMSk7Ci0gICAgfQotICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgKyt5X3N0YXJ0OwotICB9Ci0KLSAgewotICAgIGludCB5ID0geV9zdGFydDsKLSAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHRyYW5zZm9ybS0+Yml0c18pIC0gMTsKLSAgICBjb25zdCBpbnQgdGlsZXNfcGVyX3JvdyA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB0cmFuc2Zvcm0tPmJpdHNfKTsKLSAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX2Jhc2UgPQotICAgICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OwotCi0gICAgd2hpbGUgKHkgPCB5X2VuZCkgewotICAgICAgaW50IHg7Ci0gICAgICBjb25zdCB1aW50MzJfdCBwcmVkMiA9IFByZWRpY3RvcjIoZGF0YVstMV0sIGRhdGEgLSB3aWR0aCk7Ci0gICAgICBjb25zdCB1aW50MzJfdCogcHJlZF9tb2RlX3NyYyA9IHByZWRfbW9kZV9iYXNlOwotICAgICAgUHJlZGljdG9yRnVuYyBwcmVkX2Z1bmM7Ci0KLSAgICAgIC8vIEZpcnN0IHBpeGVsIGZvbGxvd3MgdGhlIFQgKG1vZGU9MikgbW9kZS4KLSAgICAgIEFkZFBpeGVsc0VxKGRhdGEsIHByZWQyKTsKLQotICAgICAgLy8gLi4gdGhlIHJlc3Q6Ci0gICAgICBwcmVkX2Z1bmMgPSBrUHJlZGljdG9yc1soKCpwcmVkX21vZGVfc3JjKyspID4+IDgpICYgMHhmXTsKLSAgICAgIGZvciAoeCA9IDE7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIHVpbnQzMl90IHByZWQ7Ci0gICAgICAgIGlmICgoeCAmIG1hc2spID09IDApIHsgICAgLy8gc3RhcnQgb2YgdGlsZS4gUmVhZCBwcmVkaWN0b3IgZnVuY3Rpb24uCi0gICAgICAgICAgcHJlZF9mdW5jID0ga1ByZWRpY3RvcnNbKCgqcHJlZF9tb2RlX3NyYysrKSA+PiA4KSAmIDB4Zl07Ci0gICAgICAgIH0KLSAgICAgICAgcHJlZCA9IHByZWRfZnVuYyhkYXRhW3ggLSAxXSwgZGF0YSArIHggLSB3aWR0aCk7Ci0gICAgICAgIEFkZFBpeGVsc0VxKGRhdGEgKyB4LCBwcmVkKTsKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gd2lkdGg7Ci0gICAgICArK3k7Ci0gICAgICBpZiAoKHkgJiBtYXNrKSA9PSAwKSB7ICAgLy8gVXNlIHRoZSBzYW1lIG1hc2ssIHNpbmNlIHRpbGVzIGFyZSBzcXVhcmVzLgotICAgICAgICBwcmVkX21vZGVfYmFzZSArPSB0aWxlc19wZXJfcm93OwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQodWludDMyX3QqIGFyZ2JfZGF0YSwgaW50IG51bV9waXhzKSB7Ci0gIGludCBpID0gMDsKLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwMDBmZjAwKTsKLSAgZm9yICg7IGkgKyA0IDwgbnVtX3BpeHM7IGkgKz0gNCkgewotICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOwotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDBnMCA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2spOyAgICAgLy8gMDBnMHwwMGcwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwMCA9IF9tbV9zbGxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMGcwMHwwZzAwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDAwZyA9IF9tbV9zcmxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMDAwZ3wwMDBnfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwZyA9IF9tbV9vcl9zaTEyOChpbl8wZzAwLCBpbl8wMDBnKTsKLSAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9zdWJfZXBpOChpbiwgaW5fMGcwZyk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSwgb3V0KTsKLSAgfQotICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKLSNlbmRpZgotICBmb3IgKDsgaSA8IG51bV9waXhzOyArK2kpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gYXJnYl9kYXRhW2ldOwotICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKGFyZ2IgPj4gOCkgJiAweGZmOwotICAgIGNvbnN0IHVpbnQzMl90IG5ld19yID0gKCgoYXJnYiA+PiAxNikgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7Ci0gICAgY29uc3QgdWludDMyX3QgbmV3X2IgPSAoKGFyZ2IgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7Ci0gICAgYXJnYl9kYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwKSB8IChuZXdfciA8PCAxNikgfCBuZXdfYjsKLSAgfQotfQotCi0vLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCi0vLyAnc3VidHJhY3QgZ3JlZW4nKS4KLXN0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIHVpbnQzMl90KiBkYXRhKSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOwotICBjb25zdCB1aW50MzJfdCogY29uc3QgZGF0YV9lbmQgPSBkYXRhICsgKHlfZW5kIC0geV9zdGFydCkgKiB3aWR0aDsKLSNpZiBkZWZpbmVkKFdFQlBfVEFSR0VUX0hBU19TU0UyKQotICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fc2V0MV9lcGkzMigweDAwMDBmZjAwKTsKLSAgZm9yICg7IGRhdGEgKyA0IDwgZGF0YV9lbmQ7IGRhdGEgKz0gNCkgewotICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKWRhdGEpOwotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDBnMCA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2spOyAgICAgLy8gMDBnMHwwMGcwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwMCA9IF9tbV9zbGxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMGcwMHwwZzAwfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMDAwZyA9IF9tbV9zcmxpX2VwaTMyKGluXzAwZzAsIDgpOyAgLy8gMDAwZ3wwMDBnfC4uLgotICAgIGNvbnN0IF9fbTEyOGkgaW5fMGcwZyA9IF9tbV9vcl9zaTEyOChpbl8wZzAwLCBpbl8wMDBnKTsKLSAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9hZGRfZXBpOChpbiwgaW5fMGcwZyk7Ci0gICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZGF0YSwgb3V0KTsKLSAgfQotICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKLSNlbmRpZgotICB3aGlsZSAoZGF0YSA8IGRhdGFfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpkYXRhOwotICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gKChhcmdiID4+IDgpICYgMHhmZik7Ci0gICAgdWludDMyX3QgcmVkX2JsdWUgPSAoYXJnYiAmIDB4MDBmZjAwZmZ1KTsKLSAgICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47Ci0gICAgcmVkX2JsdWUgJj0gMHgwMGZmMDBmZnU7Ci0gICAgKmRhdGErKyA9IChhcmdiICYgMHhmZjAwZmYwMHUpIHwgcmVkX2JsdWU7Ci0gIH0KLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBOb3RlOiB0aGUgbWVtYmVycyBhcmUgdWludDhfdCwgc28gdGhhdCBhbnkgbmVnYXRpdmUgdmFsdWVzIGFyZQotICAvLyBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byAibW9kIDI1NiIgdmFsdWVzLgotICB1aW50OF90IGdyZWVuX3RvX3JlZF87Ci0gIHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZV87Ci0gIHVpbnQ4X3QgcmVkX3RvX2JsdWVfOwotfSBNdWx0aXBsaWVyczsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTXVsdGlwbGllcnNDbGVhcihNdWx0aXBsaWVycyogbSkgewotICBtLT5ncmVlbl90b19yZWRfID0gMDsKLSAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAwOwotICBtLT5yZWRfdG9fYmx1ZV8gPSAwOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgewotICByZXR1cm4gKHVpbnQzMl90KSgoaW50KShjb2xvcl9wcmVkKSAqIGNvbG9yKSA+PiA1OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb2xvckNvZGVUb011bHRpcGxpZXJzKHVpbnQzMl90IGNvbG9yX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxpZXJzKiBjb25zdCBtKSB7Ci0gIG0tPmdyZWVuX3RvX3JlZF8gID0gKGNvbG9yX2NvZGUgPj4gIDApICYgMHhmZjsKLSAgbS0+Z3JlZW5fdG9fYmx1ZV8gPSAoY29sb3JfY29kZSA+PiAgOCkgJiAweGZmOwotICBtLT5yZWRfdG9fYmx1ZV8gICA9IChjb2xvcl9jb2RlID4+IDE2KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBNdWx0aXBsaWVyc1RvQ29sb3JDb2RlKE11bHRpcGxpZXJzKiBjb25zdCBtKSB7Ci0gIHJldHVybiAweGZmMDAwMDAwdSB8Ci0gICAgICAgICAoKHVpbnQzMl90KShtLT5yZWRfdG9fYmx1ZV8pIDw8IDE2KSB8Ci0gICAgICAgICAoKHVpbnQzMl90KShtLT5ncmVlbl90b19ibHVlXykgPDwgOCkgfAotICAgICAgICAgbS0+Z3JlZW5fdG9fcmVkXzsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFRyYW5zZm9ybUNvbG9yKGNvbnN0IE11bHRpcGxpZXJzKiBjb25zdCBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IsIGludCBpbnZlcnNlKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OwotICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OwotICB1aW50MzJfdCBuZXdfcmVkID0gcmVkOwotICB1aW50MzJfdCBuZXdfYmx1ZSA9IGFyZ2I7Ci0KLSAgaWYgKGludmVyc2UpIHsKLSAgICBuZXdfcmVkICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fcmVkXywgZ3JlZW4pOwotICAgIG5ld19yZWQgJj0gMHhmZjsKLSAgICBuZXdfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7Ci0gICAgbmV3X2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5yZWRfdG9fYmx1ZV8sIG5ld19yZWQpOwotICAgIG5ld19ibHVlICY9IDB4ZmY7Ci0gIH0gZWxzZSB7Ci0gICAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKLSAgICBuZXdfcmVkICY9IDB4ZmY7Ci0gICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOwotICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCByZWQpOwotICAgIG5ld19ibHVlICY9IDB4ZmY7Ci0gIH0KLSAgcmV0dXJuIChhcmdiICYgMHhmZjAwZmYwMHUpIHwgKG5ld19yZWQgPDwgMTYpIHwgKG5ld19ibHVlKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JSZWQodWludDhfdCBncmVlbl90b19yZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OwotICB1aW50MzJfdCBuZXdfcmVkID0gYXJnYiA+PiAxNjsKLSAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX3JlZCwgZ3JlZW4pOwotICByZXR1cm4gKG5ld19yZWQgJiAweGZmKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JCbHVlKHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZF90b19ibHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7Ci0gIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7Ci0gIHVpbnQ4X3QgbmV3X2JsdWUgPSBhcmdiOwotICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKLSAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShyZWRfdG9fYmx1ZSwgcmVkKTsKLSAgcmV0dXJuIChuZXdfYmx1ZSAmIDB4ZmYpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFNraXBSZXBlYXRlZFBpeGVscyhjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpeCwgaW50IHhzaXplKSB7Ci0gIGNvbnN0IHVpbnQzMl90IHYgPSBhcmdiW2l4XTsKLSAgaWYgKGl4ID49IHhzaXplICsgMykgewotICAgIGlmICh2ID09IGFyZ2JbaXggLSB4c2l6ZV0gJiYKLSAgICAgICAgYXJnYltpeCAtIDFdID09IGFyZ2JbaXggLSB4c2l6ZSAtIDFdICYmCi0gICAgICAgIGFyZ2JbaXggLSAyXSA9PSBhcmdiW2l4IC0geHNpemUgLSAyXSAmJgotICAgICAgICBhcmdiW2l4IC0gM10gPT0gYXJnYltpeCAtIHhzaXplIC0gM10pIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgICByZXR1cm4gdiA9PSBhcmdiW2l4IC0gM10gJiYgdiA9PSBhcmdiW2l4IC0gMl0gJiYgdiA9PSBhcmdiW2l4IC0gMV07Ci0gIH0gZWxzZSBpZiAoaXggPj0gMykgewotICAgIHJldHVybiB2ID09IGFyZ2JbaXggLSAzXSAmJiB2ID09IGFyZ2JbaXggLSAyXSAmJiB2ID09IGFyZ2JbaXggLSAxXTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihjb25zdCBpbnQgYWNjdW11bGF0ZWRbMjU2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvdW50c1syNTZdKSB7Ci0gIC8vIEZhdm9yIGxvdyBlbnRyb3B5LCBsb2NhbGx5IGFuZCBnbG9iYWxseS4KLSAgLy8gRmF2b3Igc21hbGwgYWJzb2x1dGUgdmFsdWVzIGZvciBQcmVkaWN0aW9uQ29zdFNwYXRpYWwKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXhwVmFsdWUgPSAyLjQ7Ci0gIHJldHVybiBDb21iaW5lZFNoYW5ub25FbnRyb3B5KGNvdW50cywgYWNjdW11bGF0ZWQsIDI1NikgKwotICAgICAgICAgUHJlZGljdGlvbkNvc3RTcGF0aWFsKGNvdW50cywgMywga0V4cFZhbHVlKTsKLX0KLQotc3RhdGljIE11bHRpcGxpZXJzIEdldEJlc3RDb2xvclRyYW5zZm9ybUZvclRpbGUoCi0gICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCi0gICAgTXVsdGlwbGllcnMgcHJldlgsCi0gICAgTXVsdGlwbGllcnMgcHJldlksCi0gICAgaW50IHN0ZXAsIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgIGludCogYWNjdW11bGF0ZWRfcmVkX2hpc3RvLAotICAgIGludCogYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgewotICBmbG9hdCBiZXN0X2RpZmYgPSBNQVhfRElGRl9DT1NUOwotICBmbG9hdCBjdXJfZGlmZjsKLSAgY29uc3QgaW50IGhhbGZzdGVwID0gc3RlcCAvIDI7Ci0gIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBjb25zdCBpbnQgdGlsZV95X29mZnNldCA9IHRpbGVfeSAqIG1heF90aWxlX3NpemU7Ci0gIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKLSAgaW50IGdyZWVuX3RvX3JlZDsKLSAgaW50IGdyZWVuX3RvX2JsdWU7Ci0gIGludCByZWRfdG9fYmx1ZTsKLSAgaW50IGFsbF94X21heCA9IHRpbGVfeF9vZmZzZXQgKyBtYXhfdGlsZV9zaXplOwotICBpbnQgYWxsX3lfbWF4ID0gdGlsZV95X29mZnNldCArIG1heF90aWxlX3NpemU7Ci0gIE11bHRpcGxpZXJzIGJlc3RfdHg7Ci0gIE11bHRpcGxpZXJzQ2xlYXIoJmJlc3RfdHgpOwotICBpZiAoYWxsX3hfbWF4ID4geHNpemUpIHsKLSAgICBhbGxfeF9tYXggPSB4c2l6ZTsKLSAgfQotICBpZiAoYWxsX3lfbWF4ID4geXNpemUpIHsKLSAgICBhbGxfeV9tYXggPSB5c2l6ZTsKLSAgfQotCi0gIGZvciAoZ3JlZW5fdG9fcmVkID0gLTY0OyBncmVlbl90b19yZWQgPD0gNjQ7IGdyZWVuX3RvX3JlZCArPSBoYWxmc3RlcCkgewotICAgIGludCBoaXN0b1syNTZdID0geyAwIH07Ci0gICAgaW50IGFsbF95OwotCi0gICAgZm9yIChhbGxfeSA9IHRpbGVfeV9vZmZzZXQ7IGFsbF95IDwgYWxsX3lfbWF4OyArK2FsbF95KSB7Ci0gICAgICBpbnQgaXggPSBhbGxfeSAqIHhzaXplICsgdGlsZV94X29mZnNldDsKLSAgICAgIGludCBhbGxfeDsKLSAgICAgIGZvciAoYWxsX3ggPSB0aWxlX3hfb2Zmc2V0OyBhbGxfeCA8IGFsbF94X21heDsgKythbGxfeCwgKytpeCkgewotICAgICAgICBpZiAoU2tpcFJlcGVhdGVkUGl4ZWxzKGFyZ2IsIGl4LCB4c2l6ZSkpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yUmVkKGdyZWVuX3RvX3JlZCwgYXJnYltpeF0pXTsgIC8vIHJlZC4KLSAgICAgIH0KLSAgICB9Ci0gICAgY3VyX2RpZmYgPSBQcmVkaWN0aW9uQ29zdENyb3NzQ29sb3IoJmFjY3VtdWxhdGVkX3JlZF9oaXN0b1swXSwgJmhpc3RvWzBdKTsKLSAgICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZYLmdyZWVuX3RvX3JlZF8pIHsKLSAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICB9Ci0gICAgaWYgKCh1aW50OF90KWdyZWVuX3RvX3JlZCA9PSBwcmV2WS5ncmVlbl90b19yZWRfKSB7Ci0gICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgfQotICAgIGlmIChncmVlbl90b19yZWQgPT0gMCkgewotICAgICAgY3VyX2RpZmYgLT0gMzsKLSAgICB9Ci0gICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7Ci0gICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKLSAgICAgIGJlc3RfdHguZ3JlZW5fdG9fcmVkXyA9IGdyZWVuX3RvX3JlZDsKLSAgICB9Ci0gIH0KLSAgYmVzdF9kaWZmID0gTUFYX0RJRkZfQ09TVDsKLSAgZm9yIChncmVlbl90b19ibHVlID0gLTMyOyBncmVlbl90b19ibHVlIDw9IDMyOyBncmVlbl90b19ibHVlICs9IHN0ZXApIHsKLSAgICBmb3IgKHJlZF90b19ibHVlID0gLTMyOyByZWRfdG9fYmx1ZSA8PSAzMjsgcmVkX3RvX2JsdWUgKz0gc3RlcCkgewotICAgICAgaW50IGFsbF95OwotICAgICAgaW50IGhpc3RvWzI1Nl0gPSB7IDAgfTsKLSAgICAgIGZvciAoYWxsX3kgPSB0aWxlX3lfb2Zmc2V0OyBhbGxfeSA8IGFsbF95X21heDsgKythbGxfeSkgewotICAgICAgICBpbnQgYWxsX3g7Ci0gICAgICAgIGludCBpeCA9IGFsbF95ICogeHNpemUgKyB0aWxlX3hfb2Zmc2V0OwotICAgICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgICBpZiAoU2tpcFJlcGVhdGVkUGl4ZWxzKGFyZ2IsIGl4LCB4c2l6ZSkpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICArK2hpc3RvW1RyYW5zZm9ybUNvbG9yQmx1ZShncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgYXJnYltpeF0pXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgY3VyX2RpZmYgPQotICAgICAgICAgIFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcigmYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1swXSwgJmhpc3RvWzBdKTsKLSAgICAgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZYLmdyZWVuX3RvX2JsdWVfKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICAgIH0KLSAgICAgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZZLmdyZWVuX3RvX2JsdWVfKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKLSAgICAgIH0KLSAgICAgIGlmICgodWludDhfdClyZWRfdG9fYmx1ZSA9PSBwcmV2WC5yZWRfdG9fYmx1ZV8pIHsKLSAgICAgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgotICAgICAgfQotICAgICAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZZLnJlZF90b19ibHVlXykgewotICAgICAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCi0gICAgICB9Ci0gICAgICBpZiAoZ3JlZW5fdG9fYmx1ZSA9PSAwKSB7Ci0gICAgICAgIGN1cl9kaWZmIC09IDM7Ci0gICAgICB9Ci0gICAgICBpZiAocmVkX3RvX2JsdWUgPT0gMCkgewotICAgICAgICBjdXJfZGlmZiAtPSAzOwotICAgICAgfQotICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7Ci0gICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOwotICAgICAgICBiZXN0X3R4LmdyZWVuX3RvX2JsdWVfID0gZ3JlZW5fdG9fYmx1ZTsKLSAgICAgICAgYmVzdF90eC5yZWRfdG9fYmx1ZV8gPSByZWRfdG9fYmx1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGJlc3RfdHg7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsaWVycyBjb2xvcl90cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYikgewotICBpbnQgeTsKLSAgaW50IHhzY2FuID0gMSA8PCBiaXRzOwotICBpbnQgeXNjYW4gPSAxIDw8IGJpdHM7Ci0gIHRpbGVfeCA8PD0gYml0czsKLSAgdGlsZV95IDw8PSBiaXRzOwotICBpZiAoeHNjYW4gPiB4c2l6ZSAtIHRpbGVfeCkgewotICAgIHhzY2FuID0geHNpemUgLSB0aWxlX3g7Ci0gIH0KLSAgaWYgKHlzY2FuID4geXNpemUgLSB0aWxlX3kpIHsKLSAgICB5c2NhbiA9IHlzaXplIC0gdGlsZV95OwotICB9Ci0gIHlzY2FuICs9IHRpbGVfeTsKLSAgZm9yICh5ID0gdGlsZV95OyB5IDwgeXNjYW47ICsreSkgewotICAgIGludCBpeCA9IHkgKiB4c2l6ZSArIHRpbGVfeDsKLSAgICBjb25zdCBpbnQgZW5kX2l4ID0gaXggKyB4c2NhbjsKLSAgICBmb3IgKDsgaXggPCBlbmRfaXg7ICsraXgpIHsKLSAgICAgIGFyZ2JbaXhdID0gVHJhbnNmb3JtQ29sb3IoJmNvbG9yX3RyYW5zZm9ybSwgYXJnYltpeF0sIDApOwotICAgIH0KLSAgfQotfQotCi12b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBzdGVwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKSB7Ci0gIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOwotICBpbnQgdGlsZV94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKLSAgaW50IHRpbGVfeXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOwotICBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0gPSB7IDAgfTsKLSAgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSA9IHsgMCB9OwotICBpbnQgdGlsZV95OwotICBpbnQgdGlsZV94OwotICBNdWx0aXBsaWVycyBwcmV2WDsKLSAgTXVsdGlwbGllcnMgcHJldlk7Ci0gIE11bHRpcGxpZXJzQ2xlYXIoJnByZXZZKTsKLSAgTXVsdGlwbGllcnNDbGVhcigmcHJldlgpOwotICBmb3IgKHRpbGVfeSA9IDA7IHRpbGVfeSA8IHRpbGVfeXNpemU7ICsrdGlsZV95KSB7Ci0gICAgZm9yICh0aWxlX3ggPSAwOyB0aWxlX3ggPCB0aWxlX3hzaXplOyArK3RpbGVfeCkgewotICAgICAgTXVsdGlwbGllcnMgY29sb3JfdHJhbnNmb3JtOwotICAgICAgaW50IGFsbF94X21heDsKLSAgICAgIGludCB5OwotICAgICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOwotICAgICAgY29uc3QgaW50IHRpbGVfeF9vZmZzZXQgPSB0aWxlX3ggKiBtYXhfdGlsZV9zaXplOwotICAgICAgaWYgKHRpbGVfeSAhPSAwKSB7Ci0gICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeCAtIDFdLCAmcHJldlgpOwotICAgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKGltYWdlWyh0aWxlX3kgLSAxKSAqIHRpbGVfeHNpemUgKyB0aWxlX3hdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwcmV2WSk7Ci0gICAgICB9IGVsc2UgaWYgKHRpbGVfeCAhPSAwKSB7Ci0gICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeCAtIDFdLCAmcHJldlgpOwotICAgICAgfQotICAgICAgY29sb3JfdHJhbnNmb3JtID0KLSAgICAgICAgICBHZXRCZXN0Q29sb3JUcmFuc2Zvcm1Gb3JUaWxlKHRpbGVfeCwgdGlsZV95LCBiaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldlgsIHByZXZZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2IpOwotICAgICAgaW1hZ2VbdGlsZV95ICogdGlsZV94c2l6ZSArIHRpbGVfeF0gPQotICAgICAgICAgIE11bHRpcGxpZXJzVG9Db2xvckNvZGUoJmNvbG9yX3RyYW5zZm9ybSk7Ci0gICAgICBDb3B5VGlsZVdpdGhDb2xvclRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCB0aWxlX3gsIHRpbGVfeSwgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX3RyYW5zZm9ybSwgYXJnYik7Ci0KLSAgICAgIC8vIEdhdGhlciBhY2N1bXVsYXRlZCBoaXN0b2dyYW0gZGF0YS4KLSAgICAgIGFsbF94X21heCA9IHRpbGVfeF9vZmZzZXQgKyBtYXhfdGlsZV9zaXplOwotICAgICAgaWYgKGFsbF94X21heCA+IHdpZHRoKSB7Ci0gICAgICAgIGFsbF94X21heCA9IHdpZHRoOwotICAgICAgfQotICAgICAgZm9yICh5ID0gMDsgeSA8IG1heF90aWxlX3NpemU7ICsreSkgewotICAgICAgICBpbnQgaXg7Ci0gICAgICAgIGludCBhbGxfeDsKLSAgICAgICAgaW50IGFsbF95ID0gdGlsZV95X29mZnNldCArIHk7Ci0gICAgICAgIGlmIChhbGxfeSA+PSBoZWlnaHQpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpeCA9IGFsbF95ICogd2lkdGggKyB0aWxlX3hfb2Zmc2V0OwotICAgICAgICBmb3IgKGFsbF94ID0gdGlsZV94X29mZnNldDsgYWxsX3ggPCBhbGxfeF9tYXg7ICsrYWxsX3gsICsraXgpIHsKLSAgICAgICAgICBpZiAoaXggPj0gMiAmJgotICAgICAgICAgICAgICBhcmdiW2l4XSA9PSBhcmdiW2l4IC0gMl0gJiYKLSAgICAgICAgICAgICAgYXJnYltpeF0gPT0gYXJnYltpeCAtIDFdKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCi0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpeCA+PSB3aWR0aCArIDIgJiYKLSAgICAgICAgICAgICAgYXJnYltpeCAtIDJdID09IGFyZ2JbaXggLSB3aWR0aCAtIDJdICYmCi0gICAgICAgICAgICAgIGFyZ2JbaXggLSAxXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAxXSAmJgotICAgICAgICAgICAgICBhcmdiW2l4XSA9PSBhcmdiW2l4IC0gd2lkdGhdKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCi0gICAgICAgICAgfQotICAgICAgICAgICsrYWNjdW11bGF0ZWRfcmVkX2hpc3RvWyhhcmdiW2l4XSA+PiAxNikgJiAweGZmXTsKLSAgICAgICAgICArK2FjY3VtdWxhdGVkX2JsdWVfaGlzdG9bYXJnYltpeF0gJiAweGZmXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyBDb2xvciBzcGFjZSBpbnZlcnNlIHRyYW5zZm9ybS4KLXN0YXRpYyB2b2lkIENvbG9yU3BhY2VJbnZlcnNlVHJhbnNmb3JtKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIHVpbnQzMl90KiBkYXRhKSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOwotICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHRyYW5zZm9ybS0+Yml0c18pIC0gMTsKLSAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtLT5iaXRzXyk7Ci0gIGludCB5ID0geV9zdGFydDsKLSAgY29uc3QgdWludDMyX3QqIHByZWRfcm93ID0KLSAgICAgIHRyYW5zZm9ybS0+ZGF0YV8gKyAoeSA+PiB0cmFuc2Zvcm0tPmJpdHNfKSAqIHRpbGVzX3Blcl9yb3c7Ci0KLSAgd2hpbGUgKHkgPCB5X2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkID0gcHJlZF9yb3c7Ci0gICAgTXVsdGlwbGllcnMgbSA9IHsgMCwgMCwgMCB9OwotICAgIGludCB4OwotCi0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGlmICgoeCAmIG1hc2spID09IDApIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoKnByZWQrKywgJm0pOwotICAgICAgZGF0YVt4XSA9IFRyYW5zZm9ybUNvbG9yKCZtLCBkYXRhW3hdLCAxKTsKLSAgICB9Ci0gICAgZGF0YSArPSB3aWR0aDsKLSAgICArK3k7Ci0gICAgaWYgKCh5ICYgbWFzaykgPT0gMCkgcHJlZF9yb3cgKz0gdGlsZXNfcGVyX3Jvdzs7Ci0gIH0KLX0KLQotLy8gU2VwYXJhdGUgb3V0IHBpeGVscyBwYWNrZWQgdG9nZXRoZXIgdXNpbmcgcGl4ZWwtYnVuZGxpbmcuCi0vLyBXZSBkZWZpbmUgdHdvIG1ldGhvZHMgZm9yIEFSR0IgZGF0YSAodWludDMyX3QpIGFuZCBhbHBoYS1vbmx5IGRhdGEgKHVpbnQ4X3QpLgotI2RlZmluZSBDT0xPUl9JTkRFWF9JTlZFUlNFKEZVTkNfTkFNRSwgVFlQRSwgR0VUX0lOREVYLCBHRVRfVkFMVUUpICAgICAgICAgICAgIFwKLXZvaWQgRlVOQ19OQU1FKGNvbnN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCBjb25zdCBUWVBFKiBzcmMsIFRZUEUqIGRzdCkgeyAgICAgICAgICAgXAotICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGJpdHNfcGVyX3BpeGVsID0gOCA+PiB0cmFuc2Zvcm0tPmJpdHNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwID0gdHJhbnNmb3JtLT5kYXRhXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJpdHNfcGVyX3BpeGVsIDwgOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHBpeGVsc19wZXJfYnl0ZSA9IDEgPDwgdHJhbnNmb3JtLT5iaXRzXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCBjb3VudF9tYXNrID0gcGl4ZWxzX3Blcl9ieXRlIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCBiaXRfbWFzayA9ICgxIDw8IGJpdHNfcGVyX3BpeGVsKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgdWludDMyX3QgcGFja2VkX3BpeGVscyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAvKiBXZSBuZWVkIHRvIGxvYWQgZnJlc2ggJ3BhY2tlZF9waXhlbHMnIG9uY2UgZXZlcnkgICAgICAgICAgICAgICAgKi8gIFwKLSAgICAgICAgLyogJ3BpeGVsc19wZXJfYnl0ZScgaW5jcmVtZW50cyBvZiB4LiBGb3J0dW5hdGVseSwgcGl4ZWxzX3Blcl9ieXRlICovICBcCi0gICAgICAgIC8qIGlzIGEgcG93ZXIgb2YgMiwgc28gY2FuIGp1c3QgdXNlIGEgbWFzayBmb3IgdGhhdCwgaW5zdGVhZCBvZiAgICAqLyAgXAotICAgICAgICAvKiBkZWNyZW1lbnRpbmcgYSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIFwKLSAgICAgICAgaWYgKCh4ICYgY291bnRfbWFzaykgPT0gMCkgcGFja2VkX3BpeGVscyA9IEdFVF9JTkRFWCgqc3JjKyspOyAgICAgICAgICBcCi0gICAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbcGFja2VkX3BpeGVscyAmIGJpdF9tYXNrXSk7ICAgICAgICAgICAgICAgXAotICAgICAgICBwYWNrZWRfcGl4ZWxzID4+PSBiaXRzX3Blcl9waXhlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKHkgPSB5X3N0YXJ0OyB5IDwgeV9lbmQ7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgKmRzdCsrID0gR0VUX1ZBTFVFKGNvbG9yX21hcFtHRVRfSU5ERVgoKnNyYysrKV0pOyAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRBUkdCSW5kZXgodWludDMyX3QgaWR4KSB7Ci0gIHJldHVybiAoaWR4ID4+IDgpICYgMHhmZjsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgR2V0QWxwaGFJbmRleCh1aW50OF90IGlkeCkgewotICByZXR1cm4gaWR4OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0QVJHQlZhbHVlKHVpbnQzMl90IHZhbCkgewotICByZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBHZXRBbHBoYVZhbHVlKHVpbnQzMl90IHZhbCkgewotICByZXR1cm4gKHZhbCA+PiA4KSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBDT0xPUl9JTkRFWF9JTlZFUlNFKENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtLCB1aW50MzJfdCwgR2V0QVJHQkluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0QVJHQlZhbHVlKQotQ09MT1JfSU5ERVhfSU5WRVJTRShWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSwgdWludDhfdCwgR2V0QWxwaGFJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgR2V0QWxwaGFWYWx1ZSkKLQotI3VuZGVmIENPTE9SX0lOREVYX0lOVkVSU0UKLQotdm9pZCBWUDhMSW52ZXJzZVRyYW5zZm9ybShjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3dfc3RhcnQsIGludCByb3dfZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW4sIHVpbnQzMl90KiBjb25zdCBvdXQpIHsKLSAgU0JfRENIRUNLKHJvd19zdGFydCA8IHJvd19lbmQpOwotICBTQl9EQ0hFQ0socm93X2VuZCA8PSB0cmFuc2Zvcm0tPnlzaXplXyk7Ci0gIHN3aXRjaCAodHJhbnNmb3JtLT50eXBlXykgewotICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46Ci0gICAgICBBZGRHcmVlblRvQmx1ZUFuZFJlZCh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKLSAgICAgIFByZWRpY3RvckludmVyc2VUcmFuc2Zvcm0odHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIG91dCk7Ci0gICAgICBpZiAocm93X2VuZCAhPSB0cmFuc2Zvcm0tPnlzaXplXykgewotICAgICAgICAvLyBUaGUgbGFzdCBwcmVkaWN0ZWQgcm93IGluIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgdGhlIHRvcC1wcmVkIHJvdwotICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IHJvdyBpbiBuZXh0IGl0ZXJhdGlvbi4KLSAgICAgICAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87Ci0gICAgICAgIFNiTWVtb3J5Q29weShvdXQgLSB3aWR0aCwgb3V0ICsgKHJvd19lbmQgLSByb3dfc3RhcnQgLSAxKSAqIHdpZHRoLAotICAgICAgICAgICAgICAgd2lkdGggKiBzaXplb2YoKm91dCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUk9TU19DT0xPUl9UUkFOU0ZPUk06Ci0gICAgICBDb2xvclNwYWNlSW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgb3V0KTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNOgotICAgICAgaWYgKGluID09IG91dCAmJiB0cmFuc2Zvcm0tPmJpdHNfID4gMCkgewotICAgICAgICAvLyBNb3ZlIHBhY2tlZCBwaXhlbHMgdG8gdGhlIGVuZCBvZiB1bnBhY2tlZCByZWdpb24sIHNvIHRoYXQgdW5wYWNraW5nCi0gICAgICAgIC8vIGNhbiBvY2N1ciBzZWFtbGVzc2x5LgotICAgICAgICAvLyBBbHNvLCBub3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSB0cmFuc2Zvcm0gdGhhdCBhcHBsaWVzIG9uCi0gICAgICAgIC8vIHRoZSBlZmZlY3RpdmUgd2lkdGggb2YgVlA4TFN1YlNhbXBsZVNpemUoeHNpemVfLCBiaXRzXykuIEFsbCBvdGhlcgotICAgICAgICAvLyB0cmFuc2Zvcm1zIHdvcmsgb24gZWZmZWN0aXZlIHdpZHRoIG9mIHhzaXplXy4KLSAgICAgICAgY29uc3QgaW50IG91dF9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKiB0cmFuc2Zvcm0tPnhzaXplXzsKLSAgICAgICAgY29uc3QgaW50IGluX3N0cmlkZSA9IChyb3dfZW5kIC0gcm93X3N0YXJ0KSAqCi0gICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywgdHJhbnNmb3JtLT5iaXRzXyk7Ci0gICAgICAgIHVpbnQzMl90KiBjb25zdCBzcmMgPSBvdXQgKyBvdXRfc3RyaWRlIC0gaW5fc3RyaWRlOwotICAgICAgICBTYk1lbW9yeU1vdmUoc3JjLCBvdXQsIGluX3N0cmlkZSAqIHNpemVvZigqc3JjKSk7Ci0gICAgICAgIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBzcmMsIG91dCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybSh0cmFuc2Zvcm0sIHJvd19zdGFydCwgcm93X2VuZCwgaW4sIG91dCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLQotc3RhdGljIGludCBpc19iaWdfZW5kaWFuKHZvaWQpIHsKLSAgc3RhdGljIGNvbnN0IHVuaW9uIHsKLSAgICB1aW50MTZfdCB3OwotICAgIHVpbnQ4X3QgYlsyXTsKLSAgfSB0bXAgPSB7IDEgfTsKLSAgcmV0dXJuICh0bXAuYlswXSAhPSAxKTsKLX0KLQotc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQihjb25zdCB1aW50MzJfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBKGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7Ci0gIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKLSAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOwotICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+IDI0KSAmIDB4ZmY7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkE0NDQ0KGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICBjb25zdCB1aW50OF90IHJnID0gKChhcmdiID4+IDE2KSAmIDB4ZjApIHwgKChhcmdiID4+IDEyKSAmIDB4Zik7Ci0gICAgY29uc3QgdWludDhfdCBiYSA9ICgoYXJnYiA+PiAgMCkgJiAweGYwKSB8ICgoYXJnYiA+PiAyOCkgJiAweGYpOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgICAqZHN0KysgPSBiYTsKLSAgICAqZHN0KysgPSByZzsKLSNlbHNlCi0gICAgKmRzdCsrID0gcmc7Ci0gICAgKmRzdCsrID0gYmE7Ci0jZW5kaWYKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCNTY1KGNvbnN0IHVpbnQzMl90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKLSAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOwotICB3aGlsZSAoc3JjIDwgc3JjX2VuZCkgewotICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0gICAgY29uc3QgdWludDhfdCByZyA9ICgoYXJnYiA+PiAxNikgJiAweGY4KSB8ICgoYXJnYiA+PiAxMykgJiAweDcpOwotICAgIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoKGFyZ2IgPj4gIDUpICYgMHhlMCkgfCAoKGFyZ2IgPj4gIDMpICYgMHgxZik7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICAgICpkc3QrKyA9IGdiOwotICAgICpkc3QrKyA9IHJnOwotI2Vsc2UKLSAgICAqZHN0KysgPSByZzsKLSAgICAqZHN0KysgPSBnYjsKLSNlbmRpZgotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9CR1IoY29uc3QgdWludDMyX3QqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgewotICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7Ci0gICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKLSAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgKmRzdCsrID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBDb3B5T3JTd2FwKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzd2FwX29uX2JpZ19lbmRpYW4pIHsKLSAgaWYgKGlzX2JpZ19lbmRpYW4oKSA9PSBzd2FwX29uX2JpZ19lbmRpYW4pIHsKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7Ci0gICAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKLSAgICAgIHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7Ci0KLSNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSNpZiAhZGVmaW5lZChXRUJQX1JFRkVSRU5DRV9JTVBMRU1FTlRBVElPTikKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcCAlMCIgOiAiPXIiKGFyZ2IpIDogIjAiKGFyZ2IpKTsKLSAgICAgICoodWludDMyX3QqKWRzdCA9IGFyZ2I7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgICAgYXJnYiA9IF9ieXRlc3dhcF91bG9uZyhhcmdiKTsKLSAgICAgICoodWludDMyX3QqKWRzdCA9IGFyZ2I7Ci0jZWxzZQotICAgICAgZHN0WzBdID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKLSAgICAgIGRzdFsxXSA9IChhcmdiID4+IDE2KSAmIDB4ZmY7Ci0gICAgICBkc3RbMl0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICAgZHN0WzNdID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKLSNlbmRpZgotI2Vsc2UgIC8vIFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OCi0gICAgICBkc3RbMF0gPSAoYXJnYiA+PiAyNCkgJiAweGZmOwotICAgICAgZHN0WzFdID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgICAgIGRzdFsyXSA9IChhcmdiID4+ICA4KSAmIDB4ZmY7Ci0gICAgICBkc3RbM10gPSAoYXJnYiA+PiAgMCkgJiAweGZmOwotI2VuZGlmCi0jZWxzZSAgLy8gX19CSUdfRU5ESUFOX18KLSAgICAgIGRzdFswXSA9IChhcmdiID4+ICAwKSAmIDB4ZmY7Ci0gICAgICBkc3RbMV0gPSAoYXJnYiA+PiAgOCkgJiAweGZmOwotICAgICAgZHN0WzJdID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKLSAgICAgIGRzdFszXSA9IChhcmdiID4+IDI0KSAmIDB4ZmY7Ci0jZW5kaWYKLSAgICAgIGRzdCArPSBzaXplb2YoYXJnYik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgbnVtX3BpeGVscyAqIHNpemVvZigqc3JjKSk7Ci0gIH0KLX0KLQotdm9pZCBWUDhMQ29udmVydEZyb21CR1JBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbl9kYXRhLCBpbnQgbnVtX3BpeGVscywKLSAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NTUF9NT0RFIG91dF9jb2xvcnNwYWNlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7Ci0gIHN3aXRjaCAob3V0X2NvbG9yc3BhY2UpIHsKLSAgICBjYXNlIE1PREVfUkdCOgotICAgICAgQ29udmVydEJHUkFUb1JHQihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9SR0JBOgotICAgICAgQ29udmVydEJHUkFUb1JHQkEoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfcmdiQToKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9CR1I6Ci0gICAgICBDb252ZXJ0QkdSQVRvQkdSKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX0JHUkE6Ci0gICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX2JnckE6Ci0gICAgICBDb3B5T3JTd2FwKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEsIDEpOwotICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9BUkdCOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgTU9ERV9BcmdiOgotICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAwKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMSwgbnVtX3BpeGVscywgMSwgMCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE1PREVfUkdCQV80NDQ0OgotICAgICAgQ29udmVydEJHUkFUb1JHQkE0NDQ0KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX3JnYkFfNDQ0NDoKLSAgICAgIENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKLSAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHJnYmEsIG51bV9waXhlbHMsIDEsIDApOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNT0RFX1JHQl81NjU6Ci0gICAgICBDb252ZXJ0QkdSQVRvUkdCNTY1KGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIFNCX0RDSEVDSygwKTsgICAgICAgICAgLy8gQ29kZSBmbG93IHNob3VsZCBub3QgcmVhY2ggaGVyZS4KLSAgfQotfQotCi0vLyBCdW5kbGVzIG11bHRpcGxlICgxLCAyLCA0IG9yIDgpIHBpeGVscyBpbnRvIGEgc2luZ2xlIHBpeGVsLgotdm9pZCBWUDhMQnVuZGxlQ29sb3JNYXAoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBjb25zdCBkc3QpIHsKLSAgaW50IHg7Ci0gIGlmICh4Yml0cyA+IDApIHsKLSAgICBjb25zdCBpbnQgYml0X2RlcHRoID0gMSA8PCAoMyAtIHhiaXRzKTsKLSAgICBjb25zdCBpbnQgbWFzayA9ICgxIDw8IHhiaXRzKSAtIDE7Ci0gICAgdWludDMyX3QgY29kZSA9IDB4ZmYwMDAwMDA7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IGludCB4c3ViID0geCAmIG1hc2s7Ci0gICAgICBpZiAoeHN1YiA9PSAwKSB7Ci0gICAgICAgIGNvZGUgPSAweGZmMDAwMDAwOwotICAgICAgfQotICAgICAgY29kZSB8PSByb3dbeF0gPDwgKDggKyBiaXRfZGVwdGggKiB4c3ViKTsKLSAgICAgIGRzdFt4ID4+IHhiaXRzXSA9IGNvZGU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSBkc3RbeF0gPSAweGZmMDAwMDAwIHwgKHJvd1t4XSA8PCA4KTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9sb3NzbGVzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OTBlYzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL2xvc3NsZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KLS8vCi0vLyBBdXRob3JzOiBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKLS8vICAgICAgICAgIEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCi0KLSNpZm5kZWYgV0VCUF9EU1BfTE9TU0xFU1NfSF8KLSNkZWZpbmUgV0VCUF9EU1BfTE9TU0xFU1NfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLSNpbmNsdWRlICIuLi93ZWJwL2RlY29kZS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltYWdlIHRyYW5zZm9ybXMuCi0KLXN0cnVjdCBWUDhMVHJhbnNmb3JtOyAgLy8gRGVmaW5lZCBpbiBkZWMvdnA4bGkuaC4KLQotLy8gUGVyZm9ybXMgaW52ZXJzZSB0cmFuc2Zvcm0gb2YgZGF0YSBnaXZlbiB0cmFuc2Zvcm0gaW5mb3JtYXRpb24sIHN0YXJ0IGFuZCBlbmQKLS8vIHJvd3MuIFRyYW5zZm9ybSB3aWxsIGJlIGFwcGxpZWQgdG8gcm93cyBbcm93X3N0YXJ0LCByb3dfZW5kWy4KLS8vIFRoZSAqaW4gYW5kICpvdXQgcG9pbnRlcnMgcmVmZXIgdG8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBkYXRhIHJlc3BlY3RpdmVseQotLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZXJtZWRpYXRlIHJvdyAocm93X3N0YXJ0KS4KLXZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19zdGFydCwgaW50IHJvd19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbiwgdWludDMyX3QqIGNvbnN0IG91dCk7Ci0KLS8vIFNpbWlsYXIgdG8gdGhlIHN0YXRpYyBtZXRob2QgQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm0oKSB0aGF0IGlzIHBhcnQgb2YKLS8vIGxvc3NsZXNzLmMsIGJ1dCB1c2VkIG9ubHkgZm9yIGFscGhhIGRlY29kaW5nLiBJdCB0YWtlcyB1aW50OF90IChyYXRoZXIgdGhhbgotLy8gdWludDMyX3QpIGFyZ3VtZW50cyBmb3IgJ3NyYycgYW5kICdkc3QnLgotdm9pZCBWUDhMQ29sb3JJbmRleEludmVyc2VUcmFuc2Zvcm1BbHBoYSgKLSAgICBjb25zdCBzdHJ1Y3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAotICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKLQotLy8gU3VidHJhY3RzIGdyZWVuIGZyb20gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzLgotdm9pZCBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkKHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4cyk7Ci0KLXZvaWQgVlA4TFJlc2lkdWFsSW1hZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBpbWFnZSk7Ci0KLXZvaWQgVlA4TENvbG9yU3BhY2VUcmFuc2Zvcm0oaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgYml0cywgaW50IHN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiLCB1aW50MzJfdCogaW1hZ2UpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KLQotLy8gQ29udmVydHMgZnJvbSBCR1JBIHRvIG90aGVyIGNvbG9yIHNwYWNlcy4KLXZvaWQgVlA4TENvbnZlcnRGcm9tQkdSQShjb25zdCB1aW50MzJfdCogY29uc3QgaW5fZGF0YSwgaW50IG51bV9waXhlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DU1BfTU9ERSBvdXRfY29sb3JzcGFjZSwgdWludDhfdCogY29uc3QgcmdiYSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNaXNjIG1ldGhvZHMuCi0KLS8vIENvbXB1dGVzIHNhbXBsZWQgc2l6ZSBvZiAnc2l6ZScgd2hlbiBzYW1wbGluZyB1c2luZyAnc2FtcGxpbmcgYml0cycuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlNhbXBsZVNpemUodWludDMyX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ19iaXRzKSB7Ci0gIHJldHVybiAoc2l6ZSArICgxIDw8IHNhbXBsaW5nX2JpdHMpIC0gMSkgPj4gc2FtcGxpbmdfYml0czsKLX0KLQotLy8gRmFzdGVyIGxvZ2FyaXRobSBmb3IgaW50ZWdlcnMuIFNtYWxsIHZhbHVlcyB1c2UgYSBsb29rLXVwIHRhYmxlLgotI2RlZmluZSBMT0dfTE9PS1VQX0lEWF9NQVggMjU2Ci1leHRlcm4gY29uc3QgZmxvYXQga0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdOwotZXh0ZXJuIGNvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF07Ci1leHRlcm4gZmxvYXQgVlA4TEZhc3RMb2cyU2xvdyhpbnQgdik7Ci1leHRlcm4gZmxvYXQgVlA4TEZhc3RTTG9nMlNsb3coaW50IHYpOwotc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0TG9nMihpbnQgdikgewotICByZXR1cm4gKHYgPCBMT0dfTE9PS1VQX0lEWF9NQVgpID8ga0xvZzJUYWJsZVt2XSA6IFZQOExGYXN0TG9nMlNsb3codik7Ci19Ci0vLyBGYXN0IGNhbGN1bGF0aW9uIG9mIHYgKiBsb2cyKHYpIGZvciBpbnRlZ2VyIGlucHV0Lgotc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0U0xvZzIoaW50IHYpIHsKLSAgcmV0dXJuICh2IDwgTE9HX0xPT0tVUF9JRFhfTUFYKSA/IGtTTG9nMlRhYmxlW3ZdIDogVlA4TEZhc3RTTG9nMlNsb3codik7Ci19Ci0KLQotLy8gSW4tcGxhY2UgZGlmZmVyZW5jZSBvZiBlYWNoIGNvbXBvbmVudCB3aXRoIG1vZCAyNTYuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFN1YlBpeGVscyh1aW50MzJfdCBhLCB1aW50MzJfdCBiKSB7Ci0gIGNvbnN0IHVpbnQzMl90IGFscGhhX2FuZF9ncmVlbiA9Ci0gICAgICAweDAwZmYwMGZmdSArIChhICYgMHhmZjAwZmYwMHUpIC0gKGIgJiAweGZmMDBmZjAwdSk7Ci0gIGNvbnN0IHVpbnQzMl90IHJlZF9hbmRfYmx1ZSA9Ci0gICAgICAweGZmMDBmZjAwdSArIChhICYgMHgwMGZmMDBmZnUpIC0gKGIgJiAweDAwZmYwMGZmdSk7Ci0gIHJldHVybiAoYWxwaGFfYW5kX2dyZWVuICYgMHhmZjAwZmYwMHUpIHwgKHJlZF9hbmRfYmx1ZSAmIDB4MDBmZjAwZmZ1KTsKLX0KLQotdm9pZCBWUDhMQnVuZGxlQ29sb3JNYXAoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGJpdHMsIHVpbnQzMl90KiBjb25zdCBkc3QpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX0RTUF9MT1NTTEVTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmcuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmE0ZjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmcuYworKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGYW5jeSB1cHNhbXBsZXIKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCCi1XZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbTU9ERV9MQVNUXTsKLQotLy8gR2l2ZW4gc2FtcGxlcyBsYWlkIG91dCBpbiBhIHNxdWFyZSBhczoKLS8vICBbYSBiXQotLy8gIFtjIGRdCi0vLyB3ZSBpbnRlcnBvbGF0ZSB1L3YgYXM6Ci0vLyAgKFs5KmEgKyAzKmIgKyAzKmMgKyAgIGQgICAgMyphICsgOSpiICsgMypjICsgICBkXSArIFs4IDhdKSAvIDE2Ci0vLyAgKFszKmEgKyAgIGIgKyA5KmMgKyAzKmQgICAgICBhICsgMypiICsgMypjICsgOSpkXSAgIFs4IDhdKSAvIDE2Ci0KLS8vIFdlIHByb2Nlc3MgdSBhbmQgdiB0b2dldGhlciBzdGFzaGVkIGludG8gMzJiaXQgKDE2Yml0IGVhY2gpLgotI2RlZmluZSBMT0FEX1VWKHUsIHYpICgodSkgfCAoKHYpIDw8IDE2KSkKLQotI2RlZmluZSBVUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCi0gIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbGFzdF9waXhlbF9wYWlyID0gKGxlbiAtIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDMyX3QgdGxfdXYgPSBMT0FEX1VWKHRvcF91WzBdLCB0b3BfdlswXSk7ICAgLyogdG9wLWxlZnQgc2FtcGxlICovICAgICAgICBcCi0gIHVpbnQzMl90IGxfdXYgID0gTE9BRF9VVihjdXJfdVswXSwgY3VyX3ZbMF0pOyAgIC8qIGxlZnQtc2FtcGxlICovICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIHRsX3V2ICsgbF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoeCA9IDE7IHggPD0gbGFzdF9waXhlbF9wYWlyOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVpbnQzMl90IHRfdXYgPSBMT0FEX1VWKHRvcF91W3hdLCB0b3Bfdlt4XSk7ICAvKiB0b3Agc2FtcGxlICovICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCB1diAgID0gTE9BRF9VVihjdXJfdVt4XSwgY3VyX3ZbeF0pOyAgLyogc2FtcGxlICovICAgICAgICAgICBcCi0gICAgLyogcHJlY29tcHV0ZSBpbnZhcmlhbnQgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBmaXJzdCBhbmQgc2Vjb25kIGRpYWdvbmFscyovXAotICAgIGNvbnN0IHVpbnQzMl90IGF2ZyA9IHRsX3V2ICsgdF91diArIGxfdXYgKyB1diArIDB4MDAwODAwMDh1OyAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50MzJfdCBkaWFnXzEyID0gKGF2ZyArIDIgKiAodF91diArIGxfdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdWludDMyX3QgZGlhZ18wMyA9IChhdmcgKyAyICogKHRsX3V2ICsgdXYpKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzEyICsgdGxfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18wMyArIHRfdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WzIgKiB4IC0gMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICB0b3BfZHN0ICsgKDIgKiB4IC0gMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKGRpYWdfMDMgKyBsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IHVpbnQzMl90IHV2MSA9IChkaWFnXzEyICsgdXYpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdHRvbV95WzIgKiB4IC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4IC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90dG9tX3lbMiAqIHggKyAwXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIGJvdHRvbV9kc3QgKyAoMiAqIHggKyAwKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0bF91diA9IHRfdXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbF91diA9IHV2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCEobGVuICYgMSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHRvcF9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICAgICAgXAotICAgICAgRlVOQyhib3R0b21feVtsZW4gLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgYm90dG9tX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gQWxsIHZhcmlhbnRzIGltcGxlbWVudGVkLgotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgVlA4WXV2VG9SZ2IsICAzKQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyLCAgVlA4WXV2VG9CZ3IsICAzKQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpciwgVlA4WXV2VG9SZ2JhLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgVlA4WXV2VG9CZ3JhLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUFyZ2JMaW5lUGFpciwgVlA4WXV2VG9BcmdiLCA0KQotVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCi1VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsICBWUDhZdXZUb1JnYjU2NSwgIDIpCi0KLSN1bmRlZiBMT0FEX1VWCi0jdW5kZWYgVVBTQU1QTEVfRlVOQwotCi0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNpbXBsZSBwb2ludC1zYW1wbGluZwotCi0jZGVmaW5lIFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAotICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkgKz0gMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdVswXSwgdlswXSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMV0sIHVbMF0sIHZbMF0sIHRvcF9kc3QgKyBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBGVU5DKGJvdHRvbV95WzBdLCB1WzBdLCB2WzBdLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyhib3R0b21feVsxXSwgdVswXSwgdlswXSwgYm90dG9tX2RzdCArIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRvcF95ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBib3R0b21feSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdSsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHYrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfZHN0ICs9IDIgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYm90dG9tX2RzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGkgPT0gbGVuIC0gMSkgeyAgICAvKiBsYXN0IG9uZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyh0b3BfeVswXSwgdVswXSwgdlswXSwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkMoYm90dG9tX3lbMF0sIHVbMF0sIHZbMF0sIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KLVNBTVBMRV9GVU5DKFNhbXBsZVJnYkxpbmVQYWlyLCAgICAgIFZQOFl1dlRvUmdiLCAgMykKLVNBTVBMRV9GVU5DKFNhbXBsZUJnckxpbmVQYWlyLCAgICAgIFZQOFl1dlRvQmdyLCAgMykKLVNBTVBMRV9GVU5DKFNhbXBsZVJnYmFMaW5lUGFpciwgICAgIFZQOFl1dlRvUmdiYSwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZUJncmFMaW5lUGFpciwgICAgIFZQOFl1dlRvQmdyYSwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgIFZQOFl1dlRvQXJnYiwgNCkKLVNBTVBMRV9GVU5DKFNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCi1TQU1QTEVfRlVOQyhTYW1wbGVSZ2I1NjVMaW5lUGFpciwgICBWUDhZdXZUb1JnYjU2NSwgMikKLQotI3VuZGVmIFNBTVBMRV9GVU5DCi0KLWNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFNhbXBsZXJzW01PREVfTEFTVF0gPSB7Ci0gIFNhbXBsZVJnYkxpbmVQYWlyLCAgICAgICAvLyBNT0RFX1JHQgotICBTYW1wbGVSZ2JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9SR0JBCi0gIFNhbXBsZUJnckxpbmVQYWlyLCAgICAgICAvLyBNT0RFX0JHUgotICBTYW1wbGVCZ3JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9CR1JBCi0gIFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgICAvLyBNT0RFX0FSR0IKLSAgU2FtcGxlUmdiYTQ0NDRMaW5lUGFpciwgIC8vIE1PREVfUkdCQV80NDQ0Ci0gIFNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgICAvLyBNT0RFX1JHQl81NjUKLSAgU2FtcGxlUmdiYUxpbmVQYWlyLCAgICAgIC8vIE1PREVfcmdiQQotICBTYW1wbGVCZ3JhTGluZVBhaXIsICAgICAgLy8gTU9ERV9iZ3JBCi0gIFNhbXBsZUFyZ2JMaW5lUGFpciwgICAgICAvLyBNT0RFX0FyZ2IKLSAgU2FtcGxlUmdiYTQ0NDRMaW5lUGFpciAgIC8vIE1PREVfcmdiQV80NDQ0Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykKLSNkZWZpbmUgRFVBTF9TQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdF95LCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBib3RfdSwgY29uc3QgdWludDhfdCogYm90X3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90X2RzdCwgaW50IGxlbikgeyAgICAgICAgICAgXAotICBjb25zdCBpbnQgaGFsZl9sZW4gPSBsZW4gPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfZHN0ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbMiAqIHggKyAwXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHggKyAwKTsgICAgICAgICBcCi0gICAgICBGVU5DKHRvcF95WzIgKiB4ICsgMV0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4ICsgNCk7ICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAobGVuICYgMSkgRlVOQyh0b3BfeVsyICogeCArIDBdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCk7ICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90X2RzdCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBGVU5DKGJvdF95WzIgKiB4ICsgMF0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4ICsgMCk7ICAgICAgICAgXAotICAgICAgRlVOQyhib3RfeVsyICogeCArIDFdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCArIDQpOyAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGxlbiAmIDEpIEZVTkMoYm90X3lbMiAqIHggKyAwXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHgpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotRFVBTF9TQU1QTEVfRlVOQyhEdWFsTGluZVNhbXBsZXJCR1JBLCBWUDhZdXZUb0JncmEpCi1EVUFMX1NBTVBMRV9GVU5DKER1YWxMaW5lU2FtcGxlckFSR0IsIFZQOFl1dlRvQXJnYikKLSN1bmRlZiBEVUFMX1NBTVBMRV9GVU5DCi0KLSNlbmRpZiAgLy8gIUZBTkNZX1VQU0FNUExJTkcKLQotV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCkgewotICBXZWJQSW5pdFVwc2FtcGxlcnMoKTsKLSAgVlA4WVVWSW5pdCgpOwotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLSAgcmV0dXJuIFdlYlBVcHNhbXBsZXJzW2FscGhhX2lzX2xhc3QgPyBNT0RFX0JHUkEgOiBNT0RFX0FSR0JdOwotI2Vsc2UKLSAgcmV0dXJuIChhbHBoYV9pc19sYXN0ID8gRHVhbExpbmVTYW1wbGVyQkdSQSA6IER1YWxMaW5lU2FtcGxlckFSR0IpOwotI2VuZGlmCi19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBZVVY0NDQgY29udmVydGVyCi0KLSNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBGVU5DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgRlVOQyh5W2ldLCB1W2ldLCB2W2ldLCAmZHN0W2kgKiBYU1RFUF0pOyAgICAgICAgICAgXAotfQotCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYiwgICAgICBWUDhZdXZUb1JnYiwgIDMpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0JnciwgICAgICBWUDhZdXZUb0JnciwgIDMpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmEsICAgICBWUDhZdXZUb1JnYmEsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0JncmEsICAgICBWUDhZdXZUb0JncmEsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb0FyZ2IsICAgICBWUDhZdXZUb0FyZ2IsIDQpCi1ZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmE0NDQ0LCBWUDhZdXZUb1JnYmE0NDQ0LCAyKQotWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2I1NjUsICAgVlA4WXV2VG9SZ2I1NjUsIDIpCi0KLSN1bmRlZiBZVVY0NDRfRlVOQwotCi1jb25zdCBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfTEFTVF0gPSB7Ci0gIFl1djQ0NFRvUmdiLCAgICAgICAvLyBNT0RFX1JHQgotICBZdXY0NDRUb1JnYmEsICAgICAgLy8gTU9ERV9SR0JBCi0gIFl1djQ0NFRvQmdyLCAgICAgICAvLyBNT0RFX0JHUgotICBZdXY0NDRUb0JncmEsICAgICAgLy8gTU9ERV9CR1JBCi0gIFl1djQ0NFRvQXJnYiwgICAgICAvLyBNT0RFX0FSR0IKLSAgWXV2NDQ0VG9SZ2JhNDQ0NCwgIC8vIE1PREVfUkdCQV80NDQ0Ci0gIFl1djQ0NFRvUmdiNTY1LCAgICAvLyBNT0RFX1JHQl81NjUKLSAgWXV2NDQ0VG9SZ2JhLCAgICAgIC8vIE1PREVfcmdiQQotICBZdXY0NDRUb0JncmEsICAgICAgLy8gTU9ERV9iZ3JBCi0gIFl1djQ0NFRvQXJnYiwgICAgICAvLyBNT0RFX0FyZ2IKLSAgWXV2NDQ0VG9SZ2JhNDQ0NCAgIC8vIE1PREVfcmdiQV80NDQ0Ci19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUHJlbXVsdGlwbGllZCBtb2RlcwotCi0vLyBub24gZGl0aGVyZWQtbW9kZXMKLQotLy8gKHggKiBhICogMzI4OTcpID4+IDIzIGlzIGJpdC13aXNlIGVxdWl2YWxlbnQgdG8gKGludCkoeCAqIGEgLyAyNTUuKQotLy8gZm9yIGFsbCA4Yml0IHggb3IgYS4gRm9yIGJpdC13aXNlIGVxdWl2YWxlbmNlIHRvIChpbnQpKHggKiBhIC8gMjU1LiArIC41KSwKLS8vIG9uZSBjYW4gdXNlIGluc3RlYWQ6ICh4ICogYSAqIDY1NzkzICsgKDEgPDwgMjMpKSA+PiAyNAotI2lmIDEgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LikKLSNkZWZpbmUgTVVMVElQTElFUihhKSAgICgoYSkgKiAzMjg5N1VMKQotI2RlZmluZSBQUkVNVUxUSVBMWSh4LCBtKSAoKCh4KSAqIChtKSkgPj4gMjMpCi0jZWxzZSAgICAgLy8gKGludCkoeCAqIGEgLyAyNTUuICsgLjUpCi0jZGVmaW5lIE1VTFRJUExJRVIoYSkgKChhKSAqIDY1NzkzVUwpCi0jZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pICsgKDFVTCA8PCAyMykpID4+IDI0KQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseSh1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7Ci0gIHdoaWxlIChoLS0gPiAwKSB7Ci0gICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7Ci0gICAgaW50IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHc7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKLSAgICAgIGlmIChhICE9IDB4ZmYpIHsKLSAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7Ci0gICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOwotICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKLSAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJnYmEgKz0gc3RyaWRlOwotICB9Ci19Ci0jdW5kZWYgTVVMVElQTElFUgotI3VuZGVmIFBSRU1VTFRJUExZCi0KLS8vIHJnYkE0NDQ0Ci0KLSNkZWZpbmUgTVVMVElQTElFUihhKSAgKChhKSAqIDB4MTExMSkgICAgLy8gMHgxMTExIH49ICgxIDw8IDE2KSAvIDE1Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9oaSh1aW50OF90IHgpIHsKLSAgcmV0dXJuICh4ICYgMHhmMCkgfCAoeCA+PiA0KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgZGl0aGVyX2xvKHVpbnQ4X3QgeCkgewotICByZXR1cm4gKHggJiAweDBmKSB8ICh4IDw8IDQpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBtdWx0aXBseSh1aW50OF90IHgsIHVpbnQzMl90IG0pIHsKLSAgcmV0dXJuICh4ICogbSkgPj4gMTY7Ci19Ci0KLXN0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQodWludDhfdCogcmdiYTQ0NDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgewotICB3aGlsZSAoaC0tID4gMCkgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgYSA9IChyZ2JhNDQ0NFsyICogaSArIDFdICYgMHgwZik7Ci0gICAgICBjb25zdCB1aW50MzJfdCBtdWx0ID0gTVVMVElQTElFUihhKTsKLSAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IG11bHRpcGx5KGRpdGhlcl9oaShyZ2JhNDQ0NFsyICogaSArIDBdKSwgbXVsdCk7Ci0gICAgICBjb25zdCB1aW50OF90IGcgPSBtdWx0aXBseShkaXRoZXJfbG8ocmdiYTQ0NDRbMiAqIGkgKyAwXSksIG11bHQpOwotICAgICAgY29uc3QgdWludDhfdCBiID0gbXVsdGlwbHkoZGl0aGVyX2hpKHJnYmE0NDQ0WzIgKiBpICsgMV0pLCBtdWx0KTsKLSAgICAgIHJnYmE0NDQ0WzIgKiBpICsgMF0gPSAociAmIDB4ZjApIHwgKChnID4+IDQpICYgMHgwZik7Ci0gICAgICByZ2JhNDQ0NFsyICogaSArIDFdID0gKGIgJiAweGYwKSB8IGE7Ci0gICAgfQotICAgIHJnYmE0NDQ0ICs9IHN0cmlkZTsKLSAgfQotfQotI3VuZGVmIE1VTFRJUExJRVIKLQotdm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHkpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpCi0gICAgPSBBcHBseUFscGhhTXVsdGlwbHk7Ci12b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50KQotICAgID0gQXBwbHlBbHBoYU11bHRpcGx5NDQ0NDsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1haW4gY2FsbAotCi12b2lkIFdlYlBJbml0VXBzYW1wbGVycyh2b2lkKSB7Ci0jaWZkZWYgRkFOQ1lfVVBTQU1QTElORwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gVXBzYW1wbGVCZ3JMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gICAgICA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXI7Ci0KLSAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KLSAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgewotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLSAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKLSAgICAgIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIoKTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKCk7Ci0gICAgfQotI2VuZGlmCi0gIH0KLSNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORwotfQotCi12b2lkIFdlYlBJbml0UHJlbXVsdGlwbHkodm9pZCkgewotICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5ID0gQXBwbHlBbHBoYU11bHRpcGx5OwotICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCA9IEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQ7Ci0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKLQotICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgewotICAgICAgV2ViUEluaXRQcmVtdWx0aXBseVNTRTIoKTsKLSAgICB9Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBXZWJQSW5pdFByZW11bHRpcGx5TkVPTigpOwotICAgIH0KLSNlbmRpZgotICB9Ci0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZ19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvdXBzYW1wbGluZ19uZW9uLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNmE4ZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBORU9OIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KLS8vCi0vLyBBdXRob3I6IG1hbnNAbWFuc3IuY29tIChNYW5zIFJ1bGxnYXJkKQotLy8gQmFzZWQgb24gU1NFIGNvZGUgYnk6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKLQotI2luY2x1ZGUgIi4vZHNwLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxhcm1fbmVvbi5oPgotI2luY2x1ZGUgIi4veXV2LmgiCi0KLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCi0KLS8vIExvYWRzIDkgcGl4ZWxzIGVhY2ggZnJvbSByb3dzIHIxIGFuZCByMiBhbmQgZ2VuZXJhdGVzIDE2IHBpeGVscy4KLSNkZWZpbmUgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGEgPSB2bGQxX3U4KHIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGIgPSB2bGQxX3U4KHIxICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGMgPSB2bGQxX3U4KHIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGQgPSB2bGQxX3U4KHIyICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBhbCA9IHZzaGxsX25fdTgoYSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBibCA9IHZzaGxsX25fdTgoYiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBjbCA9IHZzaGxsX25fdTgoYywgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBkbCA9IHZzaGxsX25fdTgoZCwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDh4OF90IGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdWludDE2eDhfdCBzbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogYSArIGIgKyBjICsgZCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkbF91OChhLCAgYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkd191OChzbCwgYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc2wgPSB2YWRkd191OChzbCwgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYWwgPSB2YWRkcV91MTYoc2wsIGFsKTsgLyogM2EgKyAgYiArICBjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYmwgPSB2YWRkcV91MTYoc2wsIGJsKTsgLyogIGEgKyAzYiArICBjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYWwgPSB2YWRkcV91MTYoYWwsIGRsKTsgLyogM2EgKyAgYiArICBjICsgM2QgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYmwgPSB2YWRkcV91MTYoYmwsIGNsKTsgLyogIGEgKyAzYiArIDNjICsgIGQgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZGlhZzIgPSB2c2hybl9uX3UxNihhbCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZGlhZzEgPSB2c2hybl9uX3UxNihibCwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYSA9IHZyaGFkZF91OChhLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYiA9IHZyaGFkZF91OChiLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgYyA9IHZyaGFkZF91OChjLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZCA9IHZyaGFkZF91OChkLCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50OHg4eDJfdCBhX2IgPSB7eyBhLCBiIH19OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1aW50OHg4eDJfdCBjX2QgPSB7eyBjLCBkIH19OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2c3QyX3U4KG91dCwgICAgICBhX2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2c3QyX3U4KG91dCArIDMyLCBjX2QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotLy8gVHVybiB0aGUgbWFjcm8gaW50byBhIGZ1bmN0aW9uIGZvciByZWR1Y2luZyBjb2RlLXNpemUgd2hlbiBub24tY3JpdGljYWwKLXN0YXRpYyB2b2lkIFVwc2FtcGxlMTZQaXhlbHMoY29uc3QgdWludDhfdCAqcjEsIGNvbnN0IHVpbnQ4X3QgKnIyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQpIHsKLSAgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpOwotfQotCi0jZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgcjFbOV0sIHIyWzldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIHJlcGxpY2F0ZSBsYXN0IGJ5dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5U2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgOSAtIChudW1fcGl4ZWxzKSk7ICAgIFwKLSAgU2JNZW1vcnlTZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCA5IC0gKG51bV9waXhlbHMpKTsgICAgXAotICBVcHNhbXBsZTE2UGl4ZWxzKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENZICA3NjI4MwotI2RlZmluZSBDVlIgODk4NTgKLSNkZWZpbmUgQ1VHIDIyMDE0Ci0jZGVmaW5lIENWRyA0NTc3MwotI2RlZmluZSBDVUIgMTEzNjE4Ci0KLXN0YXRpYyBjb25zdCBpbnQxNl90IGNvZWZbNF0gPSB7IENWUiAvIDQsIENVRywgQ1ZHIC8gMiwgQ1VCIC8gNCB9OwotCi0jZGVmaW5lIENPTlZFUlQ4KEZNVCwgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIG91dCwgY3VyX3gpIHsgICAgICAgICAgICBcCi0gIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBOOyBpICs9IDgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHkgID0gdmxkMV91OChzcmNfeSArIChjdXJfeCkgICsgaSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHUgID0gdmxkMV91OCgoc3JjX3V2KSArIGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDh4OF90IHYgID0gdmxkMV91OCgoc3JjX3V2KSArIGkgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHl5ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHksIHUxNikpOyAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHV1ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHUsIHUxMjgpKTsgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHZ2ID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHYsIHUxMjgpKTsgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHVkID0gdnNobHFfbl9zMTYodXUsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MTZ4OF90IHZkID0gdnNobHFfbl9zMTYodnYsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZybCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9sb3dfczE2KHZ2KSwgMSksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHZkKSwgIGNmMTYsIDApOyAgICAgICBcCi0gICAgaW50MzJ4NF90IHZyaCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9oaWdoX3MxNih2diksIDEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih2ZCksIGNmMTYsIDApOyAgICAgICBcCi0gICAgaW50MTZ4OF90IHZyID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMih2cmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMih2cmgsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZsID0gdm1vdmxfczE2KHZnZXRfbG93X3MxNih2dikpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHZoID0gdm1vdmxfczE2KHZnZXRfaGlnaF9zMTYodnYpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHVnbCA9IHZtbGFsX2xhbmVfczE2KHZsLCB2Z2V0X2xvd19zMTYodXUpLCAgY2YxNiwgMSk7ICAgICBcCi0gICAgaW50MzJ4NF90IHVnaCA9IHZtbGFsX2xhbmVfczE2KHZoLCB2Z2V0X2hpZ2hfczE2KHV1KSwgY2YxNiwgMSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGdjbCA9IHZxZG1sYWxfbGFuZV9zMTYodWdsLCB2Z2V0X2xvd19zMTYodnYpLCAgY2YxNiwgMik7ICBcCi0gICAgaW50MzJ4NF90IGdjaCA9IHZxZG1sYWxfbGFuZV9zMTYodWdoLCB2Z2V0X2hpZ2hfczE2KHZ2KSwgY2YxNiwgMik7ICBcCi0gICAgaW50MTZ4OF90IGdjID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMihnY2wsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMihnY2gsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHVibCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9sb3dfczE2KHV1KSwgMSksICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHVkKSwgIGNmMTYsIDMpOyAgICAgICBcCi0gICAgaW50MzJ4NF90IHViaCA9IHZxZG1sYWxfbGFuZV9zMTYodnNobGxfbl9zMTYodmdldF9oaWdoX3MxNih1dSksIDEpLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih1ZCksIGNmMTYsIDMpOyAgICAgICBcCi0gICAgaW50MTZ4OF90IHViID0gdmNvbWJpbmVfczE2KHZyc2hybl9uX3MzMih1YmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyc2hybl9uX3MzMih1YmgsIDE2KSk7ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50MzJ4NF90IHJsID0gdmFkZGxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYodnIpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IHJoID0gdmFkZGxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KHZyKSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGdsID0gdnN1YmxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYoZ2MpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IGdoID0gdnN1YmxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KGdjKSk7ICAgICBcCi0gICAgaW50MzJ4NF90IGJsID0gdmFkZGxfczE2KHZnZXRfbG93X3MxNih5eSksICB2Z2V0X2xvd19zMTYodWIpKTsgICAgICBcCi0gICAgaW50MzJ4NF90IGJoID0gdmFkZGxfczE2KHZnZXRfaGlnaF9zMTYoeXkpLCB2Z2V0X2hpZ2hfczE2KHViKSk7ICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmwgPSB2bXVscV9sYW5lX3MzMihybCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmggPSB2bXVscV9sYW5lX3MzMihyaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2wgPSB2bXVscV9sYW5lX3MzMihnbCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ2ggPSB2bXVscV9sYW5lX3MzMihnaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmwgPSB2bXVscV9sYW5lX3MzMihibCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYmggPSB2bXVscV9sYW5lX3MzMihiaCwgY2YzMiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeSA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIocmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIocmgsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgdSA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIoZ2wsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIoZ2gsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgdiA9IHZxbW92dW5fczE2KHZjb21iaW5lX3MxNih2cnNocm5fbl9zMzIoYmwsIDE2KSwgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl9zMzIoYmgsIDE2KSkpOyAgICAgICAgICAgICAgICBcCi0gICAgU1RSXyAjIyBGTVQob3V0ICsgb2ZmLCB5LCB1LCB2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgdjI1NSB2bW92X25fdTgoMjU1KQotCi0jZGVmaW5lIFNUUl9SZ2Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4M190IHJfZ19iID0ge3sgciwgZywgYiB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDNfdTgob3V0LCByX2dfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9CZ3Iob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4M190IGJfZ19yID0ge3sgYiwgZywgciB9fTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDNfdTgob3V0LCBiX2dfcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9SZ2JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4NF90IHJfZ19iX3YyNTUgPSB7eyByLCBnLCBiLCB2MjU1IH19OyAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDRfdTgob3V0LCByX2dfYl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIFNUUl9CZ3JhKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDh4NF90IGJfZ19yX3YyNTUgPSB7eyBiLCBnLCByLCB2MjU1IH19OyAgICAgICAgICAgICAgICAgICBcCi0gIHZzdDRfdTgob3V0LCBiX2dfcl92MjU1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIENPTlZFUlQxKEZNVCwgWFNURVAsIE4sIHNyY195LCBzcmNfdXYsIHJnYiwgY3VyX3gpIHsgICAgICAgICAgICBcCi0gIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoaSA9IDA7IGkgPCBOOyBpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IG9mZiA9ICgoY3VyX3gpICsgaSkgKiBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHkgPSBzcmNfeVsoY3VyX3gpICsgaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHUgPSAoc3JjX3V2KVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50IHYgPSAoc3JjX3V2KVtpICsgMTZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKHksIHUsIHYsIHJnYiArIG9mZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbGVuKSB7ICAgICAgICAgICAgICAgIFwKLSAgaWYgKHRvcF95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIHRvcF95LCB1diwgdG9wX2RzdCwgY3VyX3gpICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKGJvdHRvbV95KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDT05WRVJUOChGTVQsIFhTVEVQLCBsZW4sIGJvdHRvbV95LCAodXYpICsgMzIsIGJvdHRvbV9kc3QsIGN1cl94KSAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBDT05WRVJUMlJHQl8xKEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgdXYsICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94LCBsZW4pIHsgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQxKEZNVCwgWFNURVAsIGxlbiwgdG9wX3ksIHV2LCB0b3BfZHN0LCBjdXJfeCk7ICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoYm90dG9tX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENPTlZFUlQxKEZNVCwgWFNURVAsIGxlbiwgYm90dG9tX3ksICh1dikgKyAzMiwgYm90dG9tX2RzdCwgY3VyX3gpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIE5FT05fVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZNVCwgWFNURVApICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCAqdG9wX3ksIGNvbnN0IHVpbnQ4X3QgKmJvdHRvbV95LCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqdG9wX3UsIGNvbnN0IHVpbnQ4X3QgKnRvcF92LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqY3VyX3UsIGNvbnN0IHVpbnQ4X3QgKmN1cl92LCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqdG9wX2RzdCwgdWludDhfdCAqYm90dG9tX2RzdCwgaW50IGxlbikgeyBcCi0gIGludCBibG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDE2IGJ5dGUgYWxpZ25lZCBhcnJheSB0byBjYWNoZSByZWNvbnN0cnVjdGVkIHUgYW5kIHYgKi8gICAgICAgICAgICBcCi0gIHVpbnQ4X3QgdXZfYnVmWzIgKiAzMiArIDE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgKmNvbnN0IHJfdXYgPSAodWludDhfdCopKCh1aW50cHRyX3QpKHV2X2J1ZiArIDE1KSAmIH4xNSk7ICAgICBcCi0gIGNvbnN0IGludCB1dl9sZW4gPSAobGVuICsgMSkgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDkgcGl4ZWxzIG11c3QgYmUgcmVhZC1hYmxlIGZvciBlYWNoIGJsb2NrICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBudW1fYmxvY2tzID0gKHV2X2xlbiAtIDEpID4+IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsZWZ0b3ZlciA9IHV2X2xlbiAtIG51bV9ibG9ja3MgKiA4OyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsYXN0X3BvcyA9IDEgKyAxNiAqIG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludDE2eDRfdCBjZjE2ID0gdmxkMV9zMTYoY29lZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludDMyeDJfdCBjZjMyID0gdm1vdl9uX3MzMihDWSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDhfdCB1MTYgID0gdm1vdl9uX3U4KDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IHVpbnQ4eDhfdCB1MTI4ID0gdm1vdl9uX3U4KDEyOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHUwID0gKHRvcF91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKHRvcF95WzBdLCB1MCwgdjAsIHRvcF9kc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHUwID0gKGN1cl91WzBdICsgdV9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVlA4WXV2VG8gIyMgRk1UKGJvdHRvbV95WzBdLCB1MCwgdjAsIGJvdHRvbV9kc3QpOyAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG51bV9ibG9ja3M7ICsrYmxvY2spIHsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3UsIGN1cl91LCByX3V2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBTQU1QTEVfMTZQSVhFTFModG9wX3YsIGN1cl92LCByX3V2ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDJSR0JfOChGTVQsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHJfdXYsICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCAxNiAqIGJsb2NrICsgMSwgMTYpOyAgICAgICAgICAgICBcCi0gICAgdG9wX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3UgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdG9wX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3YgKz0gODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UsIGN1cl91LCBsZWZ0b3Zlciwgcl91dik7ICAgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YsIGN1cl92LCBsZWZ0b3Zlciwgcl91diArIDE2KTsgICAgICAgICAgICAgICBcCi0gIENPTlZFUlQyUkdCXzEoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgbGFzdF9wb3MsIGxlbiAtIGxhc3RfcG9zKTsgICAgICAgICBcCi19Ci0KLS8vIE5FT04gdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KLU5FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyTkVPTiwgIFJnYiwgIDMpCi1ORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpck5FT04sICBCZ3IsICAzKQotTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyTkVPTiwgUmdiYSwgNCkKLU5FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpck5FT04sIEJncmEsIDQpCi0KLSNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORwotCi0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWV4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKLQotdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNORU9OKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyTkVPTjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyTkVPTjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICA9IFVwc2FtcGxlQmdyTGluZVBhaXJORU9OOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJORU9OOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfTkVPTgotfQotCi12b2lkIFdlYlBJbml0UHJlbXVsdGlwbHlORU9OKHZvaWQpIHsKLSNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpck5FT047Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpck5FT047Ci0jZW5kaWYgICAvLyBXRUJQX1VTRV9ORU9OCi19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTExNjBjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC91cHNhbXBsaW5nX3NzZTIuYworKysgL2Rldi9udWxsCkBAIC0xLDIyMiArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU1NFMiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCi0vLwotLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCi0KLSNpbmNsdWRlICIuL2RzcC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0jaW5jbHVkZSA8ZW1taW50cmluLmg+Ci0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKLQotLy8gV2UgY29tcHV0ZSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYgYXMgZm9sbG93cwotLy8gdSA9ICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNgotLy8gICA9IChhICsgKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDggKyAxKSAvIDIKLS8vICAgPSAoYSArIG0gKyAxKSAvIDIKLS8vIHdoZXJlIG0gPSAoYSArIDMqYiArIDMqYyArIGQpIC8gOAotLy8gICAgICAgICA9ICgoYSArIGIgKyBjICsgZCkgLyAyICsgYiArIGMpIC8gNAotLy8KLS8vIExldCdzIHNheSAgayA9IChhICsgYiArIGMgKyBkKSAvIDQuCi0vLyBXZSBjYW4gY29tcHV0ZSBrIGFzCi0vLyBrID0gKHMgKyB0ICsgMSkgLyAyIC0gKChhXmQpIHwgKGJeYykgfCAoc150KSkgJiAxCi0vLyB3aGVyZSBzID0gKGEgKyBkICsgMSkgLyAyIGFuZCB0ID0gKGIgKyBjICsgMSkgLyAyCi0vLwotLy8gVGhlbiBtIGNhbiBiZSB3cml0dGVuIGFzCi0vLyBtID0gKGsgKyB0ICsgMSkgLyAyIC0gKCgoYl5jKSAmIChzXnQpKSB8IChrXnQpKSAmIDEKLQotLy8gQ29tcHV0ZXMgb3V0ID0gKGsgKyBpbiArIDEpIC8gMiAtICgoaWogJiAoc150KSkgfCAoa15pbikpICYgMQotI2RlZmluZSBHRVRfTShpaiwgaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2F2Z19lcHU4KGssIChpbikpOyAgICAgLyogKGsgKyBpbiArIDEpIC8gMiAqLyAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hbmRfc2kxMjgoKGlqKSwgc3QpOyAgIC8qIChpaikgJiAoc150KSAqLyAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1feG9yX3NpMTI4KGssIChpbikpOyAgICAvKiAoa15pbikgKi8gICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX29yX3NpMTI4KHRtcDEsIHRtcDIpOyAgLyogKChpaikgJiAoc150KSkgfCAoa15pbikgKi9cCi0gIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9hbmRfc2kxMjgodG1wMywgb25lKTsgIC8qICYgMSAtPiBsc2JfY29ycmVjdGlvbiAqLyAgXAotICAob3V0KSA9IF9tbV9zdWJfZXBpOCh0bXAwLCB0bXA0KTsgICAgLyogKGsgKyBpbiArIDEpIC8gMiAtIGxzYl9jb3JyZWN0aW9uICovIFwKLX0gd2hpbGUgKDApCi0KLS8vIHBhY2sgYW5kIHN0b3JlIHR3byBhbHRlcm5pbmcgcGl4ZWwgcm93cwotI2RlZmluZSBQQUNLX0FORF9TVE9SRShhLCBiLCBkYSwgZGIsIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0X2EgPSBfbW1fYXZnX2VwdTgoYSwgZGEpOyAgLyogKDlhICsgM2IgKyAzYyArICBkICsgOCkgLyAxNiAqLyBcCi0gIGNvbnN0IF9fbTEyOGkgdF9iID0gX21tX2F2Z19lcHU4KGIsIGRiKTsgIC8qICgzYSArIDliICsgIGMgKyAzZCArIDgpIC8gMTYgKi8gXAotICBjb25zdCBfX20xMjhpIHRfMSA9IF9tbV91bnBhY2tsb19lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0XzIgPSBfbW1fdW5wYWNraGlfZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDAsIHRfMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAxLCB0XzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLS8vIExvYWRzIDE3IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAzMiBwaXhlbHMuCi0jZGVmaW5lIFVQU0FNUExFXzMyUElYRUxTKHIxLCByMiwgb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHIxKVswXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihyMSlbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIGMgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocjIpWzBdKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBkID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHIyKVsxXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBfX20xMjhpIHMgPSBfbW1fYXZnX2VwdTgoYSwgZCk7ICAgICAgICAvKiBzID0gKGEgKyBkICsgMSkgLyAyICovICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0ID0gX21tX2F2Z19lcHU4KGIsIGMpOyAgICAgICAgLyogdCA9IChiICsgYyArIDEpIC8gMiAqLyAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgc3QgPSBfbW1feG9yX3NpMTI4KHMsIHQpOyAgICAgIC8qIHN0ID0gc150ICovICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSBhZCA9IF9tbV94b3Jfc2kxMjgoYSwgZCk7ICAgICAgLyogYWQgPSBhXmQgKi8gICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgYmMgPSBfbW1feG9yX3NpMTI4KGIsIGMpOyAgICAgIC8qIGJjID0gYl5jICovICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgX19tMTI4aSB0MSA9IF9tbV9vcl9zaTEyOChhZCwgYmMpOyAgICAgLyogKGFeZCkgfCAoYl5jKSAqLyAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgdDIgPSBfbW1fb3Jfc2kxMjgodDEsIHN0KTsgICAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAqLyAgICAgXAotICBjb25zdCBfX20xMjhpIHQzID0gX21tX2FuZF9zaTEyOCh0Miwgb25lKTsgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgJiAxICovIFwKLSAgY29uc3QgX19tMTI4aSB0NCA9IF9tbV9hdmdfZXB1OChzLCB0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IF9fbTEyOGkgayA9IF9tbV9zdWJfZXBpOCh0NCwgdDMpOyAgICAgIC8qIGsgPSAoYSArIGIgKyBjICsgZCkgLyA0ICovICAgXAotICBfX20xMjhpIGRpYWcxLCBkaWFnMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEdFVF9NKGJjLCB0LCBkaWFnMSk7ICAgICAgICAgICAgICAgICAgLyogZGlhZzEgPSAoYSArIDNiICsgM2MgKyBkKSAvIDggKi8gICAgXAotICBHRVRfTShhZCwgcywgZGlhZzIpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcyID0gKDNhICsgYiArIGMgKyAzZCkgLyA4ICovICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIHBhY2sgdGhlIGFsdGVybmF0ZSBwaXhlbHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBQQUNLX0FORF9TVE9SRShhLCBiLCBkaWFnMSwgZGlhZzIsICYob3V0KVswICogMzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgUEFDS19BTkRfU1RPUkUoYywgZCwgZGlhZzIsIGRpYWcxLCAmKG91dClbMiAqIDMyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFR1cm4gdGhlIG1hY3JvIGludG8gYSBmdW5jdGlvbiBmb3IgcmVkdWNpbmcgY29kZS1zaXplIHdoZW4gbm9uLWNyaXRpY2FsCi1zdGF0aWMgdm9pZCBVcHNhbXBsZTMyUGl4ZWxzKGNvbnN0IHVpbnQ4X3QgcjFbXSwgY29uc3QgdWludDhfdCByMltdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQpIHsKLSAgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpOwotfQotCi0jZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90IHIxWzE3XSwgcjJbMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU2JNZW1vcnlDb3B5KHIxLCAodGIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFNiTWVtb3J5Q29weShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU2JNZW1vcnlTZXQocjEgKyAobnVtX3BpeGVscyksIHIxWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKLSAgU2JNZW1vcnlTZXQocjIgKyAobnVtX3BpeGVscyksIHIyWyhudW1fcGl4ZWxzKSAtIDFdLCAxNyAtIChudW1fcGl4ZWxzKSk7ICAgICAgICAgIFwKLSAgLyogdXNpbmcgdGhlIHNoYXJlZCBmdW5jdGlvbiBpbnN0ZWFkIG9mIHRoZSBtYWNybyBzYXZlcyB+M2sgY29kZSBzaXplICovICAgICBcCi0gIFVwc2FtcGxlMzJQaXhlbHMocjEsIHIyLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi0jZGVmaW5lIENPTlZFUlQyUkdCKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHV2LCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgIFwKLSAgaW50IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh0b3BfeSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAobiA9IDA7IG4gPCAobnVtX3BpeGVscyk7ICsrbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkModG9wX3lbKGN1cl94KSArIG5dLCAodXYpW25dLCAodXYpWzMyICsgbl0sICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgIHRvcF9kc3QgKyAoKGN1cl94KSArIG4pICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZvciAobiA9IDA7IG4gPCAobnVtX3BpeGVscyk7ICsrbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIEZVTkMoYm90dG9tX3lbKGN1cl94KSArIG5dLCAodXYpWzY0ICsgbl0sICh1dilbNjQgKyAzMiArIG5dLCAgICAgICAgICAgICBcCi0gICAgICAgICAgIGJvdHRvbV9kc3QgKyAoKGN1cl94KSArIG4pICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLSNkZWZpbmUgU1NFMl9VUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LCAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbikgeyAgICAgICAgXAotICBpbnQgYmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogMTYgYnl0ZSBhbGlnbmVkIGFycmF5IHRvIGNhY2hlIHJlY29uc3RydWN0ZWQgdSBhbmQgdiAqLyAgICAgICAgICAgICAgICAgICBcCi0gIHVpbnQ4X3QgdXZfYnVmWzQgKiAzMiArIDE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1aW50OF90KiBjb25zdCByX3V2ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHV2X2xlbiA9IChsZW4gKyAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIDE3IHBpeGVscyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9ICh1dl9sZW4gLSAxKSA+PiA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGxlZnRvdmVyID0gdXZfbGVuIC0gbnVtX2Jsb2NrcyAqIDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCBsYXN0X3BvcyA9IDEgKyAzMiAqIG51bV9ibG9ja3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHVfZGlhZyA9ICgodG9wX3VbMF0gKyBjdXJfdVswXSkgPj4gMSkgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNvbnN0IGludCB2X2RpYWcgPSAoKHRvcF92WzBdICsgY3VyX3ZbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgU0JfRENIRUNLKGxlbiA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFRyZWF0IHRoZSBmaXJzdCBwaXhlbCBpbiByZWd1bGFyIHdheSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAodG9wX3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdTAgPSAodG9wX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgaW50IHYwID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEZVTkModG9wX3lbMF0sIHUwLCB2MCwgdG9wX2RzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChib3R0b21feSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCB1MCA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgdjAgPSAoY3VyX3ZbMF0gKyB2X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgRlVOQyhib3R0b21feVswXSwgdTAsIHYwLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGZvciAoYmxvY2sgPSAwOyBibG9jayA8IG51bV9ibG9ja3M7ICsrYmxvY2spIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQU0FNUExFXzMyUElYRUxTKHRvcF91LCBjdXJfdSwgcl91diArIDAgKiAzMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdiwgY3VyX3YsIHJfdXYgKyAxICogMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ09OVkVSVDJSR0IoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgdG9wX2RzdCwgYm90dG9tX2RzdCwgICAgICAgXAotICAgICAgICAgICAgICAgIDMyICogYmxvY2sgKyAxLCAzMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0b3BfdSArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY3VyX3UgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRvcF92ICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjdXJfdiArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBTQU1QTEVfTEFTVF9CTE9DSyh0b3BfdSwgY3VyX3UsIGxlZnRvdmVyLCByX3V2ICsgMCAqIDMyKTsgICAgICAgICAgICAgICAgICBcCi0gIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3YsIGN1cl92LCBsZWZ0b3Zlciwgcl91diArIDEgKiAzMik7ICAgICAgICAgICAgICAgICAgXAotICBDT05WRVJUMlJHQihGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCB0b3BfZHN0LCBib3R0b21fZHN0LCAgICAgICAgIFwKLSAgICAgICAgICAgICAgbGFzdF9wb3MsIGxlbiAtIGxhc3RfcG9zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLS8vIFNTRTIgdmFyaWFudHMgb2YgdGhlIGZhbmN5IHVwc2FtcGxlci4KLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyU1NFMiwgIFZQOFl1dlRvUmdiLCAgMykKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyU1NFMiwgIFZQOFl1dlRvQmdyLCAgMykKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmFMaW5lUGFpclNTRTIsIFZQOFl1dlRvUmdiYSwgNCkKLVNTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpclNTRTIsIFZQOFl1dlRvQmdyYSwgNCkKLQotI3VuZGVmIEdFVF9NCi0jdW5kZWYgUEFDS19BTkRfU1RPUkUKLSN1bmRlZiBVUFNBTVBMRV8zMlBJWEVMUwotI3VuZGVmIFVQU0FNUExFX0xBU1RfQkxPQ0sKLSN1bmRlZiBDT05WRVJUMlJHQgotI3VuZGVmIFNTRTJfVVBTQU1QTEVfRlVOQwotCi0jZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKLQotI2VuZGlmICAgLy8gV0VCUF9VU0VfU1NFMgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1leHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107Ci0KLXZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gID0gVXBzYW1wbGVSZ2JMaW5lUGFpclNTRTI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpclNTRTI7Ci0gIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyU1NFMjsKLSAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyU1NFMjsKLSNlbmRpZiAgIC8vIFdFQlBfVVNFX1NTRTIKLX0KLQotdm9pZCBXZWJQSW5pdFByZW11bHRpcGx5U1NFMih2b2lkKSB7Ci0jaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQotICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJTU0UyOwotICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJTU0UyOwotI2VuZGlmICAgLy8gV0VCUF9VU0VfU1NFMgotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTlmNzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5jCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb24KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZmRlZiBXRUJQX1lVVl9VU0VfVEFCTEUKLQotaW50MTZfdCBWUDhrVlRvUlsyNTZdLCBWUDhrVVRvQlsyNTZdOwotaW50MzJfdCBWUDhrVlRvR1syNTZdLCBWUDhrVVRvR1syNTZdOwotdWludDhfdCBWUDhrQ2xpcFtZVVZfUkFOR0VfTUFYIC0gWVVWX1JBTkdFX01JTl07Ci11aW50OF90IFZQOGtDbGlwNEJpdHNbWVVWX1JBTkdFX01BWCAtIFlVVl9SQU5HRV9NSU5dOwotCi1zdGF0aWMgaW50IGRvbmUgPSAwOwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwKGludCB2LCBpbnQgbWF4X3ZhbHVlKSB7Ci0gIHJldHVybiB2IDwgMCA/IDAgOiB2ID4gbWF4X3ZhbHVlID8gbWF4X3ZhbHVlIDogdjsKLX0KLQotdm9pZCBWUDhZVVZJbml0KHZvaWQpIHsKLSAgaW50IGk7Ci0gIGlmIChkb25lKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0jaWZuZGVmIFVTRV9ZVVZqCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIFZQOGtWVG9SW2ldID0gKDg5ODU4ICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gICAgVlA4a1VUb0dbaV0gPSAtMjIwMTQgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRjsKLSAgICBWUDhrVlRvR1tpXSA9IC00NTc3MyAqIChpIC0gMTI4KTsKLSAgICBWUDhrVVRvQltpXSA9ICgxMTM2MTggKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKLSAgfQotICBmb3IgKGkgPSBZVVZfUkFOR0VfTUlOOyBpIDwgWVVWX1JBTkdFX01BWDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGsgPSAoKGkgLSAxNikgKiA3NjI4MyArIFlVVl9IQUxGKSA+PiBZVVZfRklYOwotICAgIFZQOGtDbGlwW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoaywgMjU1KTsKLSAgICBWUDhrQ2xpcDRCaXRzW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoKGsgKyA4KSA+PiA0LCAxNSk7Ci0gIH0KLSNlbHNlCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgewotICAgIFZQOGtWVG9SW2ldID0gKDkxODgxICogKGkgLSAxMjgpICsgWVVWX0hBTEYpID4+IFlVVl9GSVg7Ci0gICAgVlA4a1VUb0dbaV0gPSAtMjI1NTQgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRjsKLSAgICBWUDhrVlRvR1tpXSA9IC00NjgwMiAqIChpIC0gMTI4KTsKLSAgICBWUDhrVVRvQltpXSA9ICgxMTYxMzAgKiAoaSAtIDEyOCkgKyBZVVZfSEFMRikgPj4gWVVWX0ZJWDsKLSAgfQotICBmb3IgKGkgPSBZVVZfUkFOR0VfTUlOOyBpIDwgWVVWX1JBTkdFX01BWDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGsgPSBpOwotICAgIFZQOGtDbGlwW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoaywgMjU1KTsKLSAgICBWUDhrQ2xpcDRCaXRzW2kgLSBZVVZfUkFOR0VfTUlOXSA9IGNsaXAoKGsgKyA4KSA+PiA0LCAxNSk7Ci0gIH0KLSNlbmRpZgotCi0gIGRvbmUgPSAxOwotfQotCi0jZWxzZQotCi12b2lkIFZQOFlVVkluaXQodm9pZCkge30KLQotI2VuZGlmICAvLyBXRUJQX1lVVl9VU0VfVEFCTEUKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AveXV2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDRkOGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZHNwL3l1di5oCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBpbmxpbmUgWVVWPC0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb24KLS8vCi0vLyBUaGUgZXhhY3QgbmFtaW5nIGlzIFknQ2JDciwgZm9sbG93aW5nIHRoZSBJVFUtUiBCVC42MDEgc3RhbmRhcmQuCi0vLyBNb3JlIGluZm9ybWF0aW9uIGF0OiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyCi0vLyBZID0gMC4yNTY5ICogUiArIDAuNTA0NCAqIEcgKyAwLjA5NzkgKiBCICsgMTYKLS8vIFUgPSAtMC4xNDgzICogUiAtIDAuMjkxMSAqIEcgKyAwLjQzOTQgKiBCICsgMTI4Ci0vLyBWID0gMC40Mzk0ICogUiAtIDAuMzY3OSAqIEcgLSAwLjA3MTUgKiBCICsgMTI4Ci0vLyBXZSB1c2UgMTZiaXQgZml4ZWQgcG9pbnQgb3BlcmF0aW9ucyBmb3IgUkdCLT5ZVVYgY29udmVyc2lvbi4KLS8vCi0vLyBGb3IgdGhlIFknQ2JDciB0byBSR0IgY29udmVyc2lvbiwgdGhlIEJULjYwMSBzcGVjaWZpY2F0aW9uIHJlYWRzOgotLy8gICBSID0gMS4xNjQgKiAoWS0xNikgKyAxLjU5NiAqIChWLTEyOCkKLS8vICAgRyA9IDEuMTY0ICogKFktMTYpIC0gMC44MTMgKiAoVi0xMjgpIC0gMC4zOTEgKiAoVS0xMjgpCi0vLyAgIEIgPSAxLjE2NCAqIChZLTE2KSAgICAgICAgICAgICAgICAgICArIDIuMDE4ICogKFUtMTI4KQotLy8gd2hlcmUgWSBpcyBpbiB0aGUgWzE2LDIzNV0gcmFuZ2UsIGFuZCBVL1YgaW4gdGhlIFsxNiwyNDBdIHJhbmdlLgotLy8gSW4gdGhlIHRhYmxlLWxvb2t1cCB2ZXJzaW9uIChXRUJQX1lVVl9VU0VfVEFCTEUpLCB0aGUgY29tbW9uIGZhY3RvcgotLy8gIjEuMTY0ICogKFktMTYpIiBjYW4gYmUgaGFuZGxlZCBhcyBhbiBvZmZzZXQgaW4gdGhlIFZQOGtDbGlwW10gdGFibGUuCi0vLyBTbyBpbiB0aGlzIGNhc2UgdGhlIGZvcm11bGFlIHNob3VsZCBiZSByZWFkIGFzOgotLy8gICBSID0gMS4xNjQgKiBbWSArIDEuMzcxICogKFYtMTI4KSAgICAgICAgICAgICAgICAgIF0gLSAxOC42MjQKLS8vICAgRyA9IDEuMTY0ICogW1kgLSAwLjY5OCAqIChWLTEyOCkgLSAwLjMzNiAqIChVLTEyOCldIC0gMTguNjI0Ci0vLyAgIEIgPSAxLjE2NCAqIFtZICAgICAgICAgICAgICAgICAgICsgMS43MzMgKiAoVS0xMjgpXSAtIDE4LjYyNAotLy8gb25jZSBmYWN0b3JpemVkLiBIZXJlIHRvbywgMTZiaXQgZml4ZWQgcHJlY2lzaW9uIGlzIHVzZWQuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX0RTUF9ZVVZfSF8KLSNkZWZpbmUgV0VCUF9EU1BfWVVWX0hfCi0KLSNpbmNsdWRlICIuLi9kZWMvZGVjb2RlX3ZwOC5oIgotCi0vLyBEZWZpbmUgdGhlIGZvbGxvd2luZyB0byB1c2UgdGhlIExVVC1iYXNlZCBjb2RlOgotI2RlZmluZSBXRUJQX1lVVl9VU0VfVEFCTEUKLQotI2lmIGRlZmluZWQoV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMpCi0vLyBEbyBOT1QgYWN0aXZhdGUgdGhpcyBmZWF0dXJlIGZvciByZWFsIGNvbXByZXNzaW9uLiBUaGlzIGlzIG9ubHkgZXhwZXJpbWVudGFsIQotLy8gVGhpcyBmbGFnIGlzIGZvciBjb21wYXJpc29uIHB1cnBvc2UgYWdhaW5zdCBKUEVHJ3MgIllVVmoiIG5hdHVyYWwgY29sb3JzcGFjZS4KLS8vIFRoaXMgY29sb3JzcGFjZSBpcyBjbG9zZSB0byBSZWMuNjAxJ3MgWSdDYkNyIG1vZGVsIHdpdGggdGhlIG5vdGFibGUKLS8vIGRpZmZlcmVuY2Ugb2YgYWxsb3dpbmcgbGFyZ2VyIHJhbmdlIGZvciBsdW1hL2Nocm9tYS4KLS8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0pQRUdfY29udmVyc2lvbiBwYXJhZ3JhcGgsIGFuZCBpdHMKLS8vIGRpZmZlcmVuY2Ugd2l0aCBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1lDYkNyI0lUVS1SX0JULjYwMV9jb252ZXJzaW9uCi0vLyAjZGVmaW5lIFVTRV9ZVVZqCi0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFlVViAtPiBSR0IgY29udmVyc2lvbgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotZW51bSB7IFlVVl9GSVggPSAxNiwgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uCi0gICAgICAgWVVWX0hBTEYgPSAxIDw8IChZVVZfRklYIC0gMSksCi0gICAgICAgWVVWX01BU0sgPSAoMjU2IDw8IFlVVl9GSVgpIC0gMSwKLSAgICAgICBZVVZfUkFOR0VfTUlOID0gLTIyNywgICAgICAgIC8vIG1pbiB2YWx1ZSBvZiByL2cvYiBvdXRwdXQKLSAgICAgICBZVVZfUkFOR0VfTUFYID0gMjU2ICsgMjI2ICAgIC8vIG1heCB2YWx1ZSBvZiByL2cvYiBvdXRwdXQKLX07Ci0KLSNpZmRlZiBXRUJQX1lVVl9VU0VfVEFCTEUKLQotZXh0ZXJuIGludDE2X3QgVlA4a1ZUb1JbMjU2XSwgVlA4a1VUb0JbMjU2XTsKLWV4dGVybiBpbnQzMl90IFZQOGtWVG9HWzI1Nl0sIFZQOGtVVG9HWzI1Nl07Ci1leHRlcm4gdWludDhfdCBWUDhrQ2xpcFtZVVZfUkFOR0VfTUFYIC0gWVVWX1JBTkdFX01JTl07Ci1leHRlcm4gdWludDhfdCBWUDhrQ2xpcDRCaXRzW1lVVl9SQU5HRV9NQVggLSBZVVZfUkFOR0VfTUlOXTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgewotICBjb25zdCBpbnQgcl9vZmYgPSBWUDhrVlRvUlt2XTsKLSAgY29uc3QgaW50IGdfb2ZmID0gKFZQOGtWVG9HW3ZdICsgVlA4a1VUb0dbdV0pID4+IFlVVl9GSVg7Ci0gIGNvbnN0IGludCBiX29mZiA9IFZQOGtVVG9CW3VdOwotICByZ2JbMF0gPSBWUDhrQ2xpcFt5ICsgcl9vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLSAgcmdiWzFdID0gVlA4a0NsaXBbeSArIGdfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci0gIHJnYlsyXSA9IFZQOGtDbGlwW3kgKyBiX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0Jncih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyKSB7Ci0gIGNvbnN0IGludCByX29mZiA9IFZQOGtWVG9SW3ZdOwotICBjb25zdCBpbnQgZ19vZmYgPSAoVlA4a1ZUb0dbdl0gKyBWUDhrVVRvR1t1XSkgPj4gWVVWX0ZJWDsKLSAgY29uc3QgaW50IGJfb2ZmID0gVlA4a1VUb0JbdV07Ci0gIGJnclswXSA9IFZQOGtDbGlwW3kgKyBiX29mZiAtIFlVVl9SQU5HRV9NSU5dOwotICBiZ3JbMV0gPSBWUDhrQ2xpcFt5ICsgZ19vZmYgLSBZVVZfUkFOR0VfTUlOXTsKLSAgYmdyWzJdID0gVlA4a0NsaXBbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl07Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiNTY1KHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKLSAgY29uc3QgaW50IHJfb2ZmID0gVlA4a1ZUb1Jbdl07Ci0gIGNvbnN0IGludCBnX29mZiA9IChWUDhrVlRvR1t2XSArIFZQOGtVVG9HW3VdKSA+PiBZVVZfRklYOwotICBjb25zdCBpbnQgYl9vZmYgPSBWUDhrVVRvQlt1XTsKLSAgY29uc3QgdWludDhfdCByZyA9ICgoVlA4a0NsaXBbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gJiAweGY4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgKFZQOGtDbGlwW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dID4+IDUpKTsKLSAgY29uc3QgdWludDhfdCBnYiA9ICgoKFZQOGtDbGlwW3kgKyBnX29mZiAtIFlVVl9SQU5HRV9NSU5dIDw8IDMpICYgMHhlMCkgfAotICAgICAgICAgICAgICAgICAgICAgIChWUDhrQ2xpcFt5ICsgYl9vZmYgLSBZVVZfUkFOR0VfTUlOXSA+PiAzKSk7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICByZ2JbMF0gPSBnYjsKLSAgcmdiWzFdID0gcmc7Ci0jZWxzZQotICByZ2JbMF0gPSByZzsKLSAgcmdiWzFdID0gZ2I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NCh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCByX29mZiA9IFZQOGtWVG9SW3ZdOwotICBjb25zdCBpbnQgZ19vZmYgPSAoVlA4a1ZUb0dbdl0gKyBWUDhrVVRvR1t1XSkgPj4gWVVWX0ZJWDsKLSAgY29uc3QgaW50IGJfb2ZmID0gVlA4a1VUb0JbdV07Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKFZQOGtDbGlwNEJpdHNbeSArIHJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gPDwgNCkgfAotICAgICAgICAgICAgICAgICAgICAgIFZQOGtDbGlwNEJpdHNbeSArIGdfb2ZmIC0gWVVWX1JBTkdFX01JTl0pOwotICBjb25zdCB1aW50OF90IGJhID0gKFZQOGtDbGlwNEJpdHNbeSArIGJfb2ZmIC0gWVVWX1JBTkdFX01JTl0gPDwgNCkgfCAweDBmOwotI2lmZGVmIFdFQlBfU1dBUF8xNkJJVF9DU1AKLSAgYXJnYlswXSA9IGJhOwotICBhcmdiWzFdID0gcmc7Ci0jZWxzZQotICBhcmdiWzBdID0gcmc7Ci0gIGFyZ2JbMV0gPSBiYTsKLSNlbmRpZgotfQotCi0jZWxzZSAgIC8vIFRhYmxlLWZyZWUgdmVyc2lvbiAoc2xvd2VyIG9uIHg4NikKLQotLy8gVGhlc2UgY29uc3RhbnRzIGFyZSAxNmIgZml4ZWQtcG9pbnQgdmVyc2lvbiBvZiBJVFUtUiBCVC42MDEgY29uc3RhbnRzCi0jZGVmaW5lIGtZU2NhbGUgNzYzMDkgICAgICAvLyAxLjE2NCA9IDI1NSAvIDIxOQotI2RlZmluZSBrVlRvUiAgIDEwNDU5NyAgICAgLy8gMS41OTYgPSAyNTUgLyAxMTIgKiAwLjcwMQotI2RlZmluZSBrVVRvRyAgIDI1Njc0ICAgICAgLy8gMC4zOTEgPSAyNTUgLyAxMTIgKiAwLjg4NiAqIDAuMTE0IC8gMC41ODcKLSNkZWZpbmUga1ZUb0cgICA1MzI3OCAgICAgIC8vIDAuODEzID0gMjU1IC8gMTEyICogMC43MDEgKiAwLjI5OSAvIDAuNTg3Ci0jZGVmaW5lIGtVVG9CICAgMTMyMjAxICAgICAvLyAyLjAxOCA9IDI1NSAvIDExMiAqIDAuODg2Ci0jZGVmaW5lIGtSQ3N0ICgta1lTY2FsZSAqIDE2IC0ga1ZUb1IgKiAxMjggKyBZVVZfSEFMRikKLSNkZWZpbmUga0dDc3QgKC1rWVNjYWxlICogMTYgKyBrVVRvRyAqIDEyOCArIGtWVG9HICogMTI4ICsgWVVWX0hBTEYpCi0jZGVmaW5lIGtCQ3N0ICgta1lTY2FsZSAqIDE2IC0ga1VUb0IgKiAxMjggKyBZVVZfSEFMRikKLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVlA4Q2xpcDgoaW50IHYpIHsKLSAgcmV0dXJuICgodiAmIH5ZVVZfTUFTSykgPT0gMCkgPyAodWludDhfdCkodiA+PiBZVVZfRklYKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh2IDwgMCkgPyAwdSA6IDI1NXU7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOENsaXBOKGludCB2LCBpbnQgTikgeyAgLy8gY2xpcCB0byBOIGJpdHMKLSAgcmV0dXJuICgodiAmIH5ZVVZfTUFTSykgPT0gMCkgPyAodWludDhfdCkodiA+PiAoWVVWX0ZJWCArICg4IC0gTikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICh2IDwgMCkgPyAwdSA6ICgyNTV1ID4+ICg4IC0gTikpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFlVVlRvUihpbnQgeSwgaW50IHYpIHsKLSAgcmV0dXJuIGtZU2NhbGUgKiB5ICsga1ZUb1IgKiB2ICsga1JDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9HKGludCB5LCBpbnQgdSwgaW50IHYpIHsKLSAgcmV0dXJuIGtZU2NhbGUgKiB5IC0ga1VUb0cgKiB1IC0ga1ZUb0cgKiB2ICsga0dDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9CKGludCB5LCBpbnQgdSkgewotICByZXR1cm4ga1lTY2FsZSAqIHkgICsga1VUb0IgKiB1ICsga0JDc3Q7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKLSAgcmdiWzBdID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHYpKTsKLSAgcmdiWzFdID0gVlA4Q2xpcDgoVlA4WVVWVG9HKHksIHUsIHYpKTsKLSAgcmdiWzJdID0gVlA4Q2xpcDgoVlA4WVVWVG9CKHksIHUpKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3IodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncikgewotICBiZ3JbMF0gPSBWUDhDbGlwOChWUDhZVVZUb0IoeSwgdSkpOwotICBiZ3JbMV0gPSBWUDhDbGlwOChWUDhZVVZUb0coeSwgdSwgdikpOwotICBiZ3JbMl0gPSBWUDhDbGlwOChWUDhZVVZUb1IoeSwgdikpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYjU2NSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7Ci0gIGNvbnN0IGludCByID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHUpKTsKLSAgY29uc3QgaW50IGcgPSBWUDhDbGlwTihWUDhZVVZUb0coeSwgdSwgdiksIDYpOwotICBjb25zdCBpbnQgYiA9IFZQOENsaXBOKFZQOFlVVlRvQih5LCB2KSwgNSk7Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gMyk7Ci0gIGNvbnN0IHVpbnQ4X3QgZ2IgPSAoZyA8PCA1KSB8IGI7Ci0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICByZ2JbMF0gPSBnYjsKLSAgcmdiWzFdID0gcmc7Ci0jZWxzZQotICByZ2JbMF0gPSByZzsKLSAgcmdiWzFdID0gZ2I7Ci0jZW5kaWYKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NCh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7Ci0gIGNvbnN0IGludCByID0gVlA4Q2xpcDgoVlA4WVVWVG9SKHksIHUpKTsKLSAgY29uc3QgaW50IGcgPSBWUDhDbGlwTihWUDhZVVZUb0coeSwgdSwgdiksIDQpOwotICBjb25zdCBpbnQgYiA9IFZQOENsaXA4KFZQOFlVVlRvQih5LCB2KSk7Ci0gIGNvbnN0IHVpbnQ4X3QgcmcgPSAociAmIDB4ZjApIHwgZzsKLSAgY29uc3QgdWludDhfdCBiYSA9IGIgfCAweDBmOyAgIC8vIG92ZXJ3cml0ZSB0aGUgbG93ZXIgNCBiaXRzCi0jaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAotICBhcmdiWzBdID0gYmE7Ci0gIGFyZ2JbMV0gPSByZzsKLSNlbHNlCi0gIGFyZ2JbMF0gPSByZzsKLSAgYXJnYlsxXSA9IGJhOwotI2VuZGlmCi19Ci0KLSNlbmRpZiAgLy8gV0VCUF9ZVVZfVVNFX1RBQkxFCi0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvQXJnYih1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKLSAgYXJnYlswXSA9IDB4ZmY7Ci0gIFZQOFl1dlRvUmdiKHksIHUsIHYsIGFyZ2IgKyAxKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYmdyYSkgewotICBWUDhZdXZUb0Jncih5LCB1LCB2LCBiZ3JhKTsKLSAgYmdyYVszXSA9IDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKLSAgVlA4WXV2VG9SZ2IoeSwgdSwgdiwgcmdiYSk7Ci0gIHJnYmFbM10gPSAweGZmOwotfQotCi0vLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXZlcnl0aGluZywgdG8gaW5pdGlhbGl6ZSB0aGUgdGFibGVzLgotdm9pZCBWUDhZVVZJbml0KHZvaWQpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUkdCIC0+IFlVViBjb252ZXJzaW9uCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Q2xpcFVWKGludCB2KSB7Ci0gIHYgPSAodiArICgyNTcgPDwgKFlVVl9GSVggKyAyIC0gMSkpKSA+PiAoWVVWX0ZJWCArIDIpOwotICByZXR1cm4gKCh2ICYgfjB4ZmYpID09IDApID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OwotfQotCi0jaWZuZGVmIFVTRV9ZVVZqCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IGtSb3VuZCA9ICgxIDw8IChZVVZfRklYIC0gMSkpICsgKDE2IDw8IFlVVl9GSVgpOwotICBjb25zdCBpbnQgbHVtYSA9IDE2ODM5ICogciArIDMzMDU5ICogZyArIDY0MjAgKiBiOwotICByZXR1cm4gKGx1bWEgKyBrUm91bmQpID4+IFlVVl9GSVg7ICAvLyBubyBuZWVkIHRvIGNsaXAKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1UoaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQgdSA9IC05NzE5ICogciAtIDE5MDgxICogZyArIDI4ODAwICogYjsKLSAgcmV0dXJuIFZQOENsaXBVVih1KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSR0JUb1YoaW50IHIsIGludCBnLCBpbnQgYikgewotICBjb25zdCBpbnQgdiA9ICsyODgwMCAqIHIgLSAyNDExNiAqIGcgLSA0Njg0ICogYjsKLSAgcmV0dXJuIFZQOENsaXBVVih2KTsKLX0KLQotI2Vsc2UKLQotLy8gVGhpcyBKUEVHLVlVViBjb2xvcnNwYWNlLCBvbmx5IGZvciBjb21wYXJpc29uIQotLy8gVGhlc2UgYXJlIGFsc28gMTYtYml0IHByZWNpc2lvbiBjb2VmZmljaWVudHMgZnJvbSBSZWMuNjAxLCBidXQgd2l0aCBmdWxsCi0vLyBbMC4uMjU1XSBvdXRwdXQgcmFuZ2UuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvWShpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCBrUm91bmQgPSAoMSA8PCAoWVVWX0ZJWCAtIDEpKTsKLSAgY29uc3QgaW50IGx1bWEgPSAxOTU5NSAqIHIgKyAzODQ3MCAqIGcgKyA3NDcxICogYjsKLSAgcmV0dXJuIChsdW1hICsga1JvdW5kKSA+PiBZVVZfRklYOyAgLy8gbm8gbmVlZCB0byBjbGlwCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIpIHsKLSAgY29uc3QgaW50IHUgPSAtMTEwNTggKiByIC0gMjE3MTAgKiBnICsgMzI3NjggKiBiOwotICByZXR1cm4gVlA4Q2xpcFVWKHUpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiKSB7Ci0gIGNvbnN0IGludCB2ID0gMzI3NjggKiByIC0gMjc0MzkgKiBnIC0gNTMyOSAqIGI7Ci0gIHJldHVybiBWUDhDbGlwVVYodik7Ci19Ci0KLSNlbmRpZiAgICAvLyBVU0VfWVVWagotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX0RTUF9ZVVZfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbHBoYS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FscGhhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNmM3ZTguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FscGhhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEFscGhhLXBsYW5lIGNvbXByZXNzaW9uLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvZmlsdGVycy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3F1YW50X2xldmVscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVuY29kZXMgdGhlIGdpdmVuIGFscGhhIGRhdGEgdmlhIHNwZWNpZmllZCBjb21wcmVzc2lvbiBtZXRob2QgJ21ldGhvZCcuCi0vLyBUaGUgcHJlLXByb2Nlc3NpbmcgKHF1YW50aXphdGlvbikgaXMgcGVyZm9ybWVkIGlmICdxdWFsaXR5JyBpcyBsZXNzIHRoYW4gMTAwLgotLy8gRm9yIHN1Y2ggY2FzZXMsIHRoZSBlbmNvZGluZyBpcyBsb3NzeS4gVGhlIHZhbGlkIHJhbmdlIGlzIFswLCAxMDBdIGZvcgotLy8gJ3F1YWxpdHknIGFuZCBbMCwgMV0gZm9yICdtZXRob2QnOgotLy8gICAnbWV0aG9kID0gMCcgLSBObyBjb21wcmVzc2lvbjsKLS8vICAgJ21ldGhvZCA9IDEnIC0gVXNlIGxvc3NsZXNzIGNvZGVyIG9uIHRoZSBhbHBoYSBwbGFuZSBvbmx5Ci0vLyAnZmlsdGVyJyB2YWx1ZXMgWzAsIDRdIGNvcnJlc3BvbmQgdG8gcHJlZGljdGlvbiBtb2RlcyBub25lLCBob3Jpem9udGFsLAotLy8gdmVydGljYWwgJiBncmFkaWVudCBmaWx0ZXJzLiBUaGUgcHJlZGljdGlvbiBtb2RlIDQgd2lsbCB0cnkgYWxsIHRoZQotLy8gcHJlZGljdGlvbiBtb2RlcyAwIHRvIDMgYW5kIHBpY2sgdGhlIGJlc3Qgb25lLgotLy8gJ2VmZm9ydF9sZXZlbCc6IHNwZWNpZmllcyBob3cgbXVjaCBlZmZvcnQgbXVzdCBiZSBzcGVudCB0byB0cnkgYW5kIHJlZHVjZQotLy8gIHRoZSBjb21wcmVzc2VkIG91dHB1dCBzaXplLiBJbiByYW5nZSAwIChxdWljaykgdG8gNiAoc2xvdykuCi0vLwotLy8gJ291dHB1dCcgY29ycmVzcG9uZHMgdG8gdGhlIGJ1ZmZlciBjb250YWluaW5nIGNvbXByZXNzZWQgYWxwaGEgZGF0YS4KLS8vICAgICAgICAgIFRoaXMgYnVmZmVyIGlzIGFsbG9jYXRlZCBieSB0aGlzIG1ldGhvZCBhbmQgY2FsbGVyIHNob3VsZCBjYWxsCi0vLyAgICAgICAgICBTYk1lbW9yeURlYWxsb2NhdGUoKm91dHB1dCkgd2hlbiBkb25lLgotLy8gJ291dHB1dF9zaXplJyBjb3JyZXNwb25kcyB0byBzaXplIG9mIHRoaXMgY29tcHJlc3NlZCBhbHBoYSBidWZmZXIuCi0vLwotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3NmdWxseSBlbmNvZGluZyB0aGUgYWxwaGEgYW5kCi0vLyAgICAgICAgIDAgaWYgZWl0aGVyOgotLy8gICAgICAgICAgIGludmFsaWQgcXVhbGl0eSBvciBtZXRob2QsIG9yCi0vLyAgICAgICAgICAgbWVtb3J5IGFsbG9jYXRpb24gZm9yIHRoZSBjb21wcmVzc2VkIGRhdGEgZmFpbHMuCi0KLSNpbmNsdWRlICIuLi9lbmMvdnA4bGkuaCIKLQotc3RhdGljIGludCBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cykgewotICBpbnQgb2sgPSAwOwotICBXZWJQQ29uZmlnIGNvbmZpZzsKLSAgV2ViUFBpY3R1cmUgcGljdHVyZTsKLSAgVlA4TEJpdFdyaXRlciB0bXBfYnc7Ci0KLSAgV2ViUFBpY3R1cmVJbml0KCZwaWN0dXJlKTsKLSAgcGljdHVyZS53aWR0aCA9IHdpZHRoOwotICBwaWN0dXJlLmhlaWdodCA9IGhlaWdodDsKLSAgcGljdHVyZS51c2VfYXJnYiA9IDE7Ci0gIHBpY3R1cmUuc3RhdHMgPSBzdGF0czsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZwaWN0dXJlKSkgcmV0dXJuIDA7Ci0KLSAgLy8gVHJhbnNmZXIgdGhlIGFscGhhIHZhbHVlcyB0byB0aGUgZ3JlZW4gY2hhbm5lbC4KLSAgewotICAgIGludCBpLCBqOwotICAgIHVpbnQzMl90KiBkc3QgPSBwaWN0dXJlLmFyZ2I7Ci0gICAgY29uc3QgdWludDhfdCogc3JjID0gZGF0YTsKLSAgICBmb3IgKGogPSAwOyBqIDwgcGljdHVyZS5oZWlnaHQ7ICsraikgewotICAgICAgZm9yIChpID0gMDsgaSA8IHBpY3R1cmUud2lkdGg7ICsraSkgewotICAgICAgICBkc3RbaV0gPSAoc3JjW2ldIDw8IDgpIHwgMHhmZjAwMDAwMHU7Ci0gICAgICB9Ci0gICAgICBzcmMgKz0gd2lkdGg7Ci0gICAgICBkc3QgKz0gcGljdHVyZS5hcmdiX3N0cmlkZTsKLSAgICB9Ci0gIH0KLQotICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKLSAgY29uZmlnLmxvc3NsZXNzID0gMTsKLSAgY29uZmlnLm1ldGhvZCA9IGVmZm9ydF9sZXZlbDsgIC8vIGltcGFjdCBpcyB2ZXJ5IHNtYWxsCi0gIC8vIFNldCBhIG1vZGVyYXRlIGRlZmF1bHQgcXVhbGl0eSBzZXR0aW5nIGZvciBhbHBoYS4KLSAgY29uZmlnLnF1YWxpdHkgPSAxMC5mICogZWZmb3J0X2xldmVsOwotICBTQl9EQ0hFQ0soY29uZmlnLnF1YWxpdHkgPj0gMCAmJiBjb25maWcucXVhbGl0eSA8PSAxMDAuZik7Ci0KLSAgb2sgPSBWUDhMQml0V3JpdGVySW5pdCgmdG1wX2J3LCAod2lkdGggKiBoZWlnaHQpID4+IDMpOwotICBvayA9IG9rICYmIChWUDhMRW5jb2RlU3RyZWFtKCZjb25maWcsICZwaWN0dXJlLCAmdG1wX2J3KSA9PSBWUDhfRU5DX09LKTsKLSAgV2ViUFBpY3R1cmVGcmVlKCZwaWN0dXJlKTsKLSAgaWYgKG9rKSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmZmVyID0gVlA4TEJpdFdyaXRlckZpbmlzaCgmdG1wX2J3KTsKLSAgICBjb25zdCBzaXplX3QgYnVmZmVyX3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoJnRtcF9idyk7Ci0gICAgVlA4Qml0V3JpdGVyQXBwZW5kKGJ3LCBidWZmZXIsIGJ1ZmZlcl9zaXplKTsKLSAgfQotICBWUDhMQml0V3JpdGVyRGVzdHJveSgmdG1wX2J3KTsKLSAgcmV0dXJuIG9rICYmICFidy0+ZXJyb3JfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEVuY29kZUFscGhhSW50ZXJuYWwoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGludCBmaWx0ZXIsIGludCByZWR1Y2VfbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfYWxwaGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzKSB7Ci0gIGludCBvayA9IDA7Ci0gIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3NyYzsKLSAgV2ViUEZpbHRlckZ1bmMgZmlsdGVyX2Z1bmM7Ci0gIHVpbnQ4X3QgaGVhZGVyOwotICBzaXplX3QgZXhwZWN0ZWRfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotCi0gIFNCX0RDSEVDSygodWludDY0X3QpZGF0YV9zaXplID09ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCk7ICAvLyBhcyBwZXIgc3BlYwotICBTQl9EQ0hFQ0soZmlsdGVyID49IDAgJiYgZmlsdGVyIDwgV0VCUF9GSUxURVJfTEFTVCk7Ci0gIFNCX0RDSEVDSyhtZXRob2QgPj0gQUxQSEFfTk9fQ09NUFJFU1NJT04pOwotICBTQl9EQ0hFQ0sobWV0aG9kIDw9IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKTsKLSAgU0JfRENIRUNLKHNpemVvZihoZWFkZXIpID09IEFMUEhBX0hFQURFUl9MRU4pOwotICAvLyBUT0RPKHNrYWwpOiBoYXZlIGEgY29tbW9uIGZ1bmN0aW9uIGFuZCAjZGVmaW5lJ3MgdG8gdmFsaWRhdGUgYWxwaGEgcGFyYW1zLgotCi0gIGV4cGVjdGVkX3NpemUgPQotICAgICAgKG1ldGhvZCA9PSBBTFBIQV9OT19DT01QUkVTU0lPTikgPyAoQUxQSEFfSEVBREVSX0xFTiArIGRhdGFfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGRhdGFfc2l6ZSA+PiA1KTsKLSAgaGVhZGVyID0gbWV0aG9kIHwgKGZpbHRlciA8PCAyKTsKLSAgaWYgKHJlZHVjZV9sZXZlbHMpIGhlYWRlciB8PSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIDw8IDQ7Ci0KLSAgVlA4Qml0V3JpdGVySW5pdChidywgZXhwZWN0ZWRfc2l6ZSk7Ci0gIFZQOEJpdFdyaXRlckFwcGVuZChidywgJmhlYWRlciwgQUxQSEFfSEVBREVSX0xFTik7Ci0KLSAgZmlsdGVyX2Z1bmMgPSBXZWJQRmlsdGVyc1tmaWx0ZXJdOwotICBpZiAoZmlsdGVyX2Z1bmMgIT0gTlVMTCkgewotICAgIGZpbHRlcl9mdW5jKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoLCB0bXBfYWxwaGEpOwotICAgIGFscGhhX3NyYyA9IHRtcF9hbHBoYTsKLSAgfSAgZWxzZSB7Ci0gICAgYWxwaGFfc3JjID0gZGF0YTsKLSAgfQotCi0gIGlmIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKLSAgICBvayA9IFZQOEJpdFdyaXRlckFwcGVuZChidywgYWxwaGFfc3JjLCB3aWR0aCAqIGhlaWdodCk7Ci0gICAgb2sgPSBvayAmJiAhYnctPmVycm9yXzsKLSAgfSBlbHNlIHsKLSAgICBvayA9IEVuY29kZUxvc3NsZXNzKGFscGhhX3NyYywgd2lkdGgsIGhlaWdodCwgZWZmb3J0X2xldmVsLCBidywgc3RhdHMpOwotICAgIFZQOEJpdFdyaXRlckZpbmlzaChidyk7Ci0gIH0KLSAgcmV0dXJuIG9rOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUT0RPKHNrYWwpOiBtb3ZlIHRvIGRzcC8gPwotc3RhdGljIHZvaWQgQ29weVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIHdoaWxlIChoZWlnaHQtLSA+IDApIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIHdpZHRoKTsKLSAgICBzcmMgKz0gc3JjX3N0cmlkZTsKLSAgICBkc3QgKz0gZHN0X3N0cmlkZTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEdldE51bUNvbG9ycyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7Ci0gIGludCBqOwotICBpbnQgY29sb3JzID0gMDsKLSAgdWludDhfdCBjb2xvclsyNTZdID0geyAwIH07Ci0KLSAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IGRhdGEgKyBqICogc3RyaWRlOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb2xvcltwW2ldXSA9IDE7Ci0gICAgfQotICB9Ci0gIGZvciAoaiA9IDA7IGogPCAyNTY7ICsraikgewotICAgIGlmIChjb2xvcltqXSA+IDApICsrY29sb3JzOwotICB9Ci0gIHJldHVybiBjb2xvcnM7Ci19Ci0KLXN0YXRpYyBpbnQgRW5jb2RlQWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IG1ldGhvZCwgaW50IGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGVmZm9ydF9sZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIGNvbnN0IG91dHB1dCwgc2l6ZV90KiBjb25zdCBvdXRwdXRfc2l6ZSkgewotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7Ci0KLSAgdWludDhfdCogcXVhbnRfYWxwaGEgPSBOVUxMOwotICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gd2lkdGggKiBoZWlnaHQ7Ci0gIHVpbnQ2NF90IHNzZSA9IDA7Ci0gIGludCBvayA9IDE7Ci0gIGNvbnN0IGludCByZWR1Y2VfbGV2ZWxzID0gKHF1YWxpdHkgPCAxMDApOwotCi0gIC8vIHF1aWNrIHNhbml0eSBjaGVja3MKLSAgU0JfRENIRUNLKCh1aW50NjRfdClkYXRhX3NpemUgPT0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0KTsgIC8vIGFzIHBlciBzcGVjCi0gIFNCX0RDSEVDSyhlbmMgIT0gTlVMTCAmJiBwaWMgIT0gTlVMTCAmJiBwaWMtPmEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhvdXRwdXQgIT0gTlVMTCAmJiBvdXRwdXRfc2l6ZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwKTsKLSAgU0JfRENIRUNLKHBpYy0+YV9zdHJpZGUgPj0gd2lkdGgpOwotICBTQl9EQ0hFQ0soZmlsdGVyID49IFdFQlBfRklMVEVSX05PTkUgJiYgZmlsdGVyIDw9IFdFQlBfRklMVEVSX0ZBU1QpOwotCi0gIGlmIChxdWFsaXR5IDwgMCB8fCBxdWFsaXR5ID4gMTAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAobWV0aG9kIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwgbWV0aG9kID4gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHF1YW50X2FscGhhID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUoZGF0YV9zaXplKTsKLSAgaWYgKHF1YW50X2FscGhhID09IE5VTEwpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIEV4dHJhY3QgYWxwaGEgZGF0YSAod2lkdGggeCBoZWlnaHQpIGZyb20gcmF3X2RhdGEgKHN0cmlkZSB4IGhlaWdodCkuCi0gIENvcHlQbGFuZShwaWMtPmEsIHBpYy0+YV9zdHJpZGUsIHF1YW50X2FscGhhLCB3aWR0aCwgd2lkdGgsIGhlaWdodCk7Ci0KLSAgaWYgKHJlZHVjZV9sZXZlbHMpIHsgIC8vIE5vIFF1YW50aXphdGlvbiByZXF1aXJlZCBmb3IgJ3F1YWxpdHkgPSAxMDAnLgotICAgIC8vIDE2IGFscGhhIGxldmVscyBnaXZlcyBxdWl0ZSBhIGxvdyBNU0Ugdy5yLnQgb3JpZ2luYWwgYWxwaGEgcGxhbmUgaGVuY2UKLSAgICAvLyBtYXBwZWQgdG8gbW9kZXJhdGUgcXVhbGl0eSA3MC4gSGVuY2UgUXVhbGl0eTpbMCwgNzBdIC0+IExldmVsczpbMiwgMTZdCi0gICAgLy8gYW5kIFF1YWxpdHk6XTcwLCAxMDBdIC0+IExldmVsczpdMTYsIDI1Nl0uCi0gICAgY29uc3QgaW50IGFscGhhX2xldmVscyA9IChxdWFsaXR5IDw9IDcwKSA/ICgyICsgcXVhbGl0eSAvIDUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgxNiArIChxdWFsaXR5IC0gNzApICogOCk7Ci0gICAgb2sgPSBRdWFudGl6ZUxldmVscyhxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwgYWxwaGFfbGV2ZWxzLCAmc3NlKTsKLSAgfQotCi0gIGlmIChvaykgewotICAgIFZQOEJpdFdyaXRlciBidzsKLSAgICBpbnQgdGVzdF9maWx0ZXI7Ci0gICAgdWludDhfdCogZmlsdGVyZWRfYWxwaGEgPSBOVUxMOwotICAgIGludCB0cnlfZmlsdGVyX25vbmUgPSAoZWZmb3J0X2xldmVsID4gMyk7Ci0KLSAgICBpZiAoZmlsdGVyID09IFdFQlBfRklMVEVSX0ZBU1QpIHsgIC8vIFF1aWNrIGVzdGltYXRlIG9mIHRoZSBiZXN0IGNhbmRpZGF0ZS4KLSAgICAgIGNvbnN0IGludCBrTWluQ29sb3JzRm9yRmlsdGVyTm9uZSA9IDE2OwotICAgICAgY29uc3QgaW50IGtNYXhDb2xvcnNGb3JGaWx0ZXJOb25lID0gMTkyOwotICAgICAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBHZXROdW1Db2xvcnMocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKLSAgICAgIC8vIEZvciBsb3cgbnVtYmVyIG9mIGNvbG9ycywgTk9ORSB5ZWlsZHMgYmV0dGVyIGNvbXByZXNzaW9uLgotICAgICAgZmlsdGVyID0gKG51bV9jb2xvcnMgPD0ga01pbkNvbG9yc0ZvckZpbHRlck5vbmUpID8gV0VCUF9GSUxURVJfTk9ORSA6Ci0gICAgICAgICAgICAgICBFc3RpbWF0ZUJlc3RGaWx0ZXIocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKLSAgICAgIC8vIEZvciBsYXJnZSBudW1iZXIgb2YgY29sb3JzLCB0cnkgRklMVEVSX05PTkUgaW4gYWRkaXRpb24gdG8gdGhlIGJlc3QKLSAgICAgIC8vIGZpbHRlciBhcyB3ZWxsLgotICAgICAgaWYgKG51bV9jb2xvcnMgPiBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSkgewotICAgICAgICB0cnlfZmlsdGVyX25vbmUgPSAxOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRlc3QgZm9yIFdFQlBfRklMVEVSX05PTkUgZm9yIGhpZ2hlciBlZmZvcnQgbGV2ZWxzLgotICAgIGlmICh0cnlfZmlsdGVyX25vbmUgfHwgZmlsdGVyID09IFdFQlBfRklMVEVSX05PTkUpIHsKLSAgICAgIG9rID0gRW5jb2RlQWxwaGFJbnRlcm5hbChxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIFdFQlBfRklMVEVSX05PTkUsIHJlZHVjZV9sZXZlbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmb3J0X2xldmVsLCBOVUxMLCAmYncsIHBpYy0+c3RhdHMpOwotCi0gICAgICBpZiAoIW9rKSB7Ci0gICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJ3KTsKLSAgICAgICAgZ290byBFbmQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFN0b3A/Ci0gICAgaWYgKGZpbHRlciA9PSBXRUJQX0ZJTFRFUl9OT05FKSB7Ci0gICAgICBnb3RvIE9rOwotICAgIH0KLQotICAgIGZpbHRlcmVkX2FscGhhID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUoZGF0YV9zaXplKTsKLSAgICBvayA9IChmaWx0ZXJlZF9hbHBoYSAhPSBOVUxMKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0KLSAgICAvLyBUcnkgdGhlIG90aGVyIG1vZGUocykuCi0gICAgewotICAgICAgV2ViUEF1eFN0YXRzIGJlc3Rfc3RhdHM7Ci0gICAgICBzaXplX3QgYmVzdF9zY29yZSA9IHRyeV9maWx0ZXJfbm9uZSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEJpdFdyaXRlclNpemUoJmJ3KSA6IChzaXplX3QpfjBVOwotICAgICAgaW50IHdpcGVfdG1wX2J3ID0gdHJ5X2ZpbHRlcl9ub25lOwotCi0gICAgICBTYk1lbW9yeVNldCgmYmVzdF9zdGF0cywgMCwgc2l6ZW9mKGJlc3Rfc3RhdHMpKTsgIC8vIHByZXZlbnQgc3B1cmlvdXMgd2FybmluZwotICAgICAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgYmVzdF9zdGF0cyA9ICpwaWMtPnN0YXRzOwotICAgICAgZm9yICh0ZXN0X2ZpbHRlciA9Ci0gICAgICAgICAgIHRyeV9maWx0ZXJfbm9uZSA/IFdFQlBfRklMVEVSX0hPUklaT05UQUwgOiBXRUJQX0ZJTFRFUl9OT05FOwotICAgICAgICAgICBvayAmJiAodGVzdF9maWx0ZXIgPD0gV0VCUF9GSUxURVJfR1JBRElFTlQpOwotICAgICAgICAgICArK3Rlc3RfZmlsdGVyKSB7Ci0gICAgICAgIFZQOEJpdFdyaXRlciB0bXBfYnc7Ci0gICAgICAgIGlmIChmaWx0ZXIgIT0gV0VCUF9GSUxURVJfQkVTVCAmJiB0ZXN0X2ZpbHRlciAhPSBmaWx0ZXIpIHsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBvayA9IEVuY29kZUFscGhhSW50ZXJuYWwocXVhbnRfYWxwaGEsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QsIHRlc3RfZmlsdGVyLCByZWR1Y2VfbGV2ZWxzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmb3J0X2xldmVsLCBmaWx0ZXJlZF9hbHBoYSwgJnRtcF9idywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+c3RhdHMpOwotICAgICAgICBpZiAob2spIHsKLSAgICAgICAgICBjb25zdCBzaXplX3Qgc2NvcmUgPSBWUDhCaXRXcml0ZXJTaXplKCZ0bXBfYncpOwotICAgICAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKLSAgICAgICAgICAgIC8vIHN3YXAgYml0d3JpdGVyIG9iamVjdHMuCi0gICAgICAgICAgICBWUDhCaXRXcml0ZXIgdG1wID0gdG1wX2J3OwotICAgICAgICAgICAgdG1wX2J3ID0gYnc7Ci0gICAgICAgICAgICBidyA9IHRtcDsKLSAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIGJlc3Rfc3RhdHMgPSAqcGljLT5zdGF0czsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmYncpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh3aXBlX3RtcF9idykgewotICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJnRtcF9idyk7Ci0gICAgICAgIH0KLSAgICAgICAgd2lwZV90bXBfYncgPSAxOyAgLy8gRm9yIG5leHQgZmlsdGVyIHRyaWFsIGZvciBXRUJQX0ZJTFRFUl9CRVNULgotICAgICAgfQotICAgICAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgKnBpYy0+c3RhdHMgPSBiZXN0X3N0YXRzOwotICAgIH0KLSBPazoKLSAgICBpZiAob2spIHsKLSAgICAgICpvdXRwdXRfc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoJmJ3KTsKLSAgICAgICpvdXRwdXQgPSBWUDhCaXRXcml0ZXJCdWYoJmJ3KTsKLSAgICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsgICAgICAgICAvLyBuZWVkIHN0YXRzPwotICAgICAgICBwaWMtPnN0YXRzLT5jb2RlZF9zaXplICs9IChpbnQpKCpvdXRwdXRfc2l6ZSk7Ci0gICAgICAgIGVuYy0+c3NlX1szXSA9IHNzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGZpbHRlcmVkX2FscGhhKTsKLSAgfQotIEVuZDoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHF1YW50X2FscGhhKTsKLSAgcmV0dXJuIG9rOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGNhbGxzCi0KLXN0YXRpYyBpbnQgQ29tcHJlc3NBbHBoYUpvYihWUDhFbmNvZGVyKiBjb25zdCBlbmMsIHZvaWQqIGR1bW15KSB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKLSAgdWludDhfdCogYWxwaGFfZGF0YSA9IE5VTEw7Ci0gIHNpemVfdCBhbHBoYV9zaXplID0gMDsKLSAgY29uc3QgaW50IGVmZm9ydF9sZXZlbCA9IGNvbmZpZy0+bWV0aG9kOyAgLy8gbWFwcyB0byBbMC4uNl0KLSAgY29uc3QgV0VCUF9GSUxURVJfVFlQRSBmaWx0ZXIgPQotICAgICAgKGNvbmZpZy0+YWxwaGFfZmlsdGVyaW5nID09IDApID8gV0VCUF9GSUxURVJfTk9ORSA6Ci0gICAgICAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPT0gMSkgPyBXRUJQX0ZJTFRFUl9GQVNUIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRklMVEVSX0JFU1Q7Ci0gIGlmICghRW5jb2RlQWxwaGEoZW5jLCBjb25maWctPmFscGhhX3F1YWxpdHksIGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgZmlsdGVyLCBlZmZvcnRfbGV2ZWwsICZhbHBoYV9kYXRhLCAmYWxwaGFfc2l6ZSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoYWxwaGFfc2l6ZSAhPSAodWludDMyX3QpYWxwaGFfc2l6ZSkgeyAgLy8gU2FuaXR5IGNoZWNrLgotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShhbHBoYV9kYXRhKTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAodWludDMyX3QpYWxwaGFfc2l6ZTsKLSAgZW5jLT5hbHBoYV9kYXRhXyA9IGFscGhhX2RhdGE7Ci0gICh2b2lkKWR1bW15OwotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhFbmNJbml0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGVuYy0+aGFzX2FscGhhXyA9IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KGVuYy0+cGljXyk7Ci0gIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOwotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOwotICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgV2ViUFdvcmtlckluaXQod29ya2VyKTsKLSAgICB3b3JrZXItPmRhdGExID0gZW5jOwotICAgIHdvcmtlci0+ZGF0YTIgPSBOVUxMOwotICAgIHdvcmtlci0+aG9vayA9IChXZWJQV29ya2VySG9vaylDb21wcmVzc0FscGhhSm9iOwotICB9Ci19Ci0KLWludCBWUDhFbmNTdGFydEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7Ci0gICAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKLSAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgICBpZiAoIVdlYlBXb3JrZXJSZXNldCh3b3JrZXIpKSB7ICAgIC8vIE1ha2VzIHN1cmUgd29ya2VyIGlzIGdvb2QgdG8gZ28uCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgICAgV2ViUFdvcmtlckxhdW5jaCh3b3JrZXIpOwotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBDb21wcmVzc0FscGhhSm9iKGVuYywgTlVMTCk7ICAgLy8ganVzdCBkbyB0aGUgam9iIHJpZ2h0IGF3YXkKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBWUDhFbmNGaW5pc2hBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaWYgKGVuYy0+aGFzX2FscGhhXykgewotICAgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7Ci0gICAgICBXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIgPSAmZW5jLT5hbHBoYV93b3JrZXJfOwotICAgICAgaWYgKCFXZWJQV29ya2VyU3luYyh3b3JrZXIpKSByZXR1cm4gMDsgIC8vIGVycm9yCi0gICAgfQotICB9Ci0gIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKLX0KLQotaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgb2sgPSAxOwotICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgewotICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87Ci0gICAgb2sgPSBXZWJQV29ya2VyU3luYyh3b3JrZXIpOyAgLy8gZmluaXNoIGFueXRoaW5nIGxlZnQgaW4gZmxpZ2h0Ci0gICAgV2ViUFdvcmtlckVuZCh3b3JrZXIpOyAgLy8gc3RpbGwgbmVlZCB0byBlbmQgdGhlIHdvcmtlciwgZXZlbiBpZiAhb2sKLSAgfQotICBTYk1lbW9yeURlYWxsb2NhdGUoZW5jLT5hbHBoYV9kYXRhXyk7Ci0gIGVuYy0+YWxwaGFfZGF0YV8gPSBOVUxMOwotICBlbmMtPmFscGhhX2RhdGFfc2l6ZV8gPSAwOwotICBlbmMtPmhhc19hbHBoYV8gPSAwOwotICByZXR1cm4gb2s7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDRmOWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQotLy8KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL2JhY2t3YXJkX3JlZmVyZW5jZXMuaCIKLSNpbmNsdWRlICIuL2hpc3RvZ3JhbS5oIgotI2luY2x1ZGUgIi4uL2RzcC9sb3NzbGVzcy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2NvbG9yX2NhY2hlLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2RlZmluZSBWQUxVRVNfSU5fQllURSAyNTYKLQotI2RlZmluZSBIQVNIX0JJVFMgMTgKLSNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfQklUUykKLSNkZWZpbmUgSEFTSF9NVUxUSVBMSUVSICgweGM2YTRhNzkzNWJkMWU5OTVVTEwpCi0KLS8vIDFNIHdpbmRvdyAoNE0gYnl0ZXMpIG1pbnVzIDEyMCBzcGVjaWFsIGNvZGVzIGZvciBzaG9ydCBkaXN0YW5jZXMuCi0jZGVmaW5lIFdJTkRPV19TSVpFICgoMSA8PCAyMCkgLSAxMjApCi0KLS8vIEJvdW5kcyBmb3IgdGhlIG1hdGNoIGxlbmd0aC4KLSNkZWZpbmUgTUlOX0xFTkdUSCAyCi0jZGVmaW5lIE1BWF9MRU5HVEggNDA5NgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIFN0b3JlcyB0aGUgbW9zdCByZWNlbnRseSBhZGRlZCBwb3NpdGlvbiB3aXRoIHRoZSBnaXZlbiBoYXNoIHZhbHVlLgotICBpbnQzMl90IGhhc2hfdG9fZmlyc3RfaW5kZXhfW0hBU0hfU0laRV07Ci0gIC8vIGNoYWluX1twb3NdIHN0b3JlcyB0aGUgcHJldmlvdXMgcG9zaXRpb24gd2l0aCB0aGUgc2FtZSBoYXNoIHZhbHVlCi0gIC8vIGZvciBldmVyeSBwaXhlbCBpbiB0aGUgaW1hZ2UuCi0gIGludDMyX3QqIGNoYWluXzsKLX0gSGFzaENoYWluOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgdWludDhfdCBwbGFuZV90b19jb2RlX2x1dFsxMjhdID0gewotIDk2LCAgIDczLCAgNTUsICAzOSwgIDIzLCAgMTMsICAgNSwgIDEsICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKLSAxMDEsICA3OCwgIDU4LCAgNDIsICAyNiwgIDE2LCAgIDgsICAyLCAgICAwLCAgIDMsICA5LCAgIDE3LCAgMjcsICA0MywgIDU5LCAgNzksCi0gMTAyLCAgODYsICA2MiwgIDQ2LCAgMzIsICAyMCwgIDEwLCAgNiwgICAgNCwgICA3LCAgMTEsICAyMSwgIDMzLCAgNDcsICA2MywgIDg3LAotIDEwNSwgIDkwLCAgNzAsICA1MiwgIDM3LCAgMjgsICAxOCwgIDE0LCAgMTIsICAxNSwgIDE5LCAgMjksICAzOCwgIDUzLCAgNzEsICA5MSwKLSAxMTAsICA5OSwgIDgyLCAgNjYsICA0OCwgIDM1LCAgMzAsICAyNCwgIDIyLCAgMjUsICAzMSwgIDM2LCAgNDksICA2NywgIDgzLCAxMDAsCi0gMTE1LCAxMDgsICA5NCwgIDc2LCAgNjQsICA1MCwgIDQ0LCAgNDAsICAzNCwgIDQxLCAgNDUsICA1MSwgIDY1LCAgNzcsICA5NSwgMTA5LAotIDExOCwgMTEzLCAxMDMsICA5MiwgIDgwLCAgNjgsICA2MCwgIDU2LCAgNTQsICA1NywgIDYxLCAgNjksICA4MSwgIDkzLCAxMDQsIDExNCwKLSAxMTksIDExNiwgMTExLCAxMDYsICA5NywgIDg4LCAgODQsICA3NCwgIDcyLCAgNzUsICA4NSwgIDg5LCAgOTgsIDEwNywgMTEyLCAxMTcKLX07Ci0KLXN0YXRpYyBpbnQgRGlzdGFuY2VUb1BsYW5lQ29kZShpbnQgeHNpemUsIGludCBkaXN0KSB7Ci0gIGNvbnN0IGludCB5b2Zmc2V0ID0gZGlzdCAvIHhzaXplOwotICBjb25zdCBpbnQgeG9mZnNldCA9IGRpc3QgLSB5b2Zmc2V0ICogeHNpemU7Ci0gIGlmICh4b2Zmc2V0IDw9IDggJiYgeW9mZnNldCA8IDgpIHsKLSAgICByZXR1cm4gcGxhbmVfdG9fY29kZV9sdXRbeW9mZnNldCAqIDE2ICsgOCAtIHhvZmZzZXRdICsgMTsKLSAgfSBlbHNlIGlmICh4b2Zmc2V0ID4geHNpemUgLSA4ICYmIHlvZmZzZXQgPCA3KSB7Ci0gICAgcmV0dXJuIHBsYW5lX3RvX2NvZGVfbHV0Wyh5b2Zmc2V0ICsgMSkgKiAxNiArIDggKyAoeHNpemUgLSB4b2Zmc2V0KV0gKyAxOwotICB9Ci0gIHJldHVybiBkaXN0ICsgMTIwOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEZpbmRNYXRjaExlbmd0aChjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBtYXhfbGltaXQpIHsKLSAgaW50IG1hdGNoX2xlbiA9IDA7Ci0gIHdoaWxlIChtYXRjaF9sZW4gPCBtYXhfbGltaXQgJiYgYXJyYXkxW21hdGNoX2xlbl0gPT0gYXJyYXkyW21hdGNoX2xlbl0pIHsKLSAgICArK21hdGNoX2xlbjsKLSAgfQotICByZXR1cm4gbWF0Y2hfbGVuOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gIFZQOExCYWNrd2FyZFJlZnMKLQotdm9pZCBWUDhMSW5pdEJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGlmIChyZWZzICE9IE5VTEwpIHsKLSAgICByZWZzLT5yZWZzID0gTlVMTDsKLSAgICByZWZzLT5zaXplID0gMDsKLSAgICByZWZzLT5tYXhfc2l6ZSA9IDA7Ci0gIH0KLX0KLQotdm9pZCBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBpZiAocmVmcyAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHJlZnMtPnJlZnMpOwotICAgIFZQOExJbml0QmFja3dhcmRSZWZzKHJlZnMpOwotICB9Ci19Ci0KLWludCBWUDhMQmFja3dhcmRSZWZzQWxsb2MoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywgaW50IG1heF9zaXplKSB7Ci0gIFNCX0RDSEVDSyhyZWZzICE9IE5VTEwpOwotICByZWZzLT5zaXplID0gMDsKLSAgcmVmcy0+bWF4X3NpemUgPSAwOwotICByZWZzLT5yZWZzID0gKFBpeE9yQ29weSopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KW1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpyZWZzLT5yZWZzKSk7Ci0gIGlmIChyZWZzLT5yZWZzID09IE5VTEwpIHJldHVybiAwOwotICByZWZzLT5tYXhfc2l6ZSA9IG1heF9zaXplOwotICByZXR1cm4gMTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhhc2ggY2hhaW5zCi0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50NjRfdCBHZXRQaXhQYWlySGFzaDY0KGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiKSB7Ci0gIHVpbnQ2NF90IGtleSA9ICgodWludDY0X3QpKGFyZ2JbMV0pIDw8IDMyKSB8IGFyZ2JbMF07Ci0gIGtleSA9IChrZXkgKiBIQVNIX01VTFRJUExJRVIpID4+ICg2NCAtIEhBU0hfQklUUyk7Ci0gIHJldHVybiBrZXk7Ci19Ci0KLXN0YXRpYyBpbnQgSGFzaENoYWluSW5pdChIYXNoQ2hhaW4qIGNvbnN0IHAsIGludCBzaXplKSB7Ci0gIGludCBpOwotICBwLT5jaGFpbl8gPSAoaW50KilXZWJQU2FmZU1hbGxvYygodWludDY0X3Qpc2l6ZSwgc2l6ZW9mKCpwLT5jaGFpbl8pKTsKLSAgaWYgKHAtPmNoYWluXyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgIHAtPmNoYWluX1tpXSA9IC0xOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7ICsraSkgewotICAgIHAtPmhhc2hfdG9fZmlyc3RfaW5kZXhfW2ldID0gLTE7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIEhhc2hDaGFpbkRlbGV0ZShIYXNoQ2hhaW4qIGNvbnN0IHApIHsKLSAgaWYgKHAgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShwLT5jaGFpbl8pOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShwKTsKLSAgfQotfQotCi0vLyBJbnNlcnRpb24gb2YgdHdvIHBpeGVscyBhdCBhIHRpbWUuCi1zdGF0aWMgdm9pZCBIYXNoQ2hhaW5JbnNlcnQoSGFzaENoYWluKiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcG9zKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGhhc2hfY29kZSA9IEdldFBpeFBhaXJIYXNoNjQoYXJnYik7Ci0gIHAtPmNoYWluX1twb3NdID0gcC0+aGFzaF90b19maXJzdF9pbmRleF9baGFzaF9jb2RlXTsKLSAgcC0+aGFzaF90b19maXJzdF9pbmRleF9baGFzaF9jb2RlXSA9IHBvczsKLX0KLQotc3RhdGljIHZvaWQgR2V0UGFyYW1zRm9ySGFzaENoYWluRmluZENvcHkoaW50IHF1YWxpdHksIGludCB4c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWNoZV9iaXRzLCBpbnQqIHdpbmRvd19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBpdGVyX3BvcywgaW50KiBpdGVyX2xpbWl0KSB7Ci0gIGNvbnN0IGludCBpdGVyX211bHQgPSAocXVhbGl0eSA8IDI3KSA/IDEgOiAxICsgKChxdWFsaXR5IC0gMjcpID4+IDQpOwotICBjb25zdCBpbnQgaXRlcl9uZWcgPSAtaXRlcl9tdWx0ICogKHF1YWxpdHkgPj4gMSk7Ci0gIC8vIExpbWl0IHRoZSBiYWNrd2FyZC1yZWYgd2luZG93IHNpemUgZm9yIGxvd2VyIHF1YWxpdGllcy4KLSAgY29uc3QgaW50IG1heF93aW5kb3dfc2l6ZSA9IChxdWFsaXR5ID4gNTApID8gV0lORE9XX1NJWkUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChxdWFsaXR5ID4gMjUpID8gKHhzaXplIDw8IDgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoeHNpemUgPDwgNCk7Ci0gIFNCX0RDSEVDSyh4c2l6ZSA+IDApOwotICAqd2luZG93X3NpemUgPSAobWF4X3dpbmRvd19zaXplID4gV0lORE9XX1NJWkUpID8gV0lORE9XX1NJWkUKLSAgICAgICAgICAgICAgIDogbWF4X3dpbmRvd19zaXplOwotICAqaXRlcl9wb3MgPSA4ICsgKHF1YWxpdHkgPj4gMyk7Ci0gIC8vIEZvciBsb3dlciBlbnRyb3B5IGltYWdlcywgdGhlIHJpZ291cm91cyBzZWFyY2ggbG9vcCBpbiBIYXNoQ2hhaW5GaW5kQ29weQotICAvLyBjYW4gYmUgcmVsYXhlZC4KLSAgKml0ZXJfbGltaXQgPSAoY2FjaGVfYml0cyA+IDApID8gaXRlcl9uZWcgOiBpdGVyX25lZyAvIDI7Ci19Ci0KLXN0YXRpYyBpbnQgSGFzaENoYWluRmluZENvcHkoY29uc3QgSGFzaENoYWluKiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmFzZV9wb3NpdGlvbiwgaW50IHhzaXplX3NpZ25lZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aW5kb3dfc2l6ZSwgaW50IGl0ZXJfcG9zLCBpbnQgaXRlcl9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkaXN0YW5jZV9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVuZ3RoX3B0cikgewotICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYl9zdGFydCA9IGFyZ2IgKyBiYXNlX3Bvc2l0aW9uOwotICB1aW50NjRfdCBiZXN0X3ZhbCA9IDA7Ci0gIHVpbnQzMl90IGJlc3RfbGVuZ3RoID0gMTsKLSAgdWludDMyX3QgYmVzdF9kaXN0YW5jZSA9IDA7Ci0gIGNvbnN0IHVpbnQzMl90IHhzaXplID0gKHVpbnQzMl90KXhzaXplX3NpZ25lZDsKLSAgY29uc3QgaW50IG1pbl9wb3MgPQotICAgICAgKGJhc2VfcG9zaXRpb24gPiB3aW5kb3dfc2l6ZSkgPyBiYXNlX3Bvc2l0aW9uIC0gd2luZG93X3NpemUgOiAwOwotICBpbnQgcG9zOwotICBTQl9EQ0hFQ0soeHNpemUgPiAwKTsKLSAgZm9yIChwb3MgPSBwLT5oYXNoX3RvX2ZpcnN0X2luZGV4X1tHZXRQaXhQYWlySGFzaDY0KGFyZ2Jfc3RhcnQpXTsKLSAgICAgICBwb3MgPj0gbWluX3BvczsKLSAgICAgICBwb3MgPSBwLT5jaGFpbl9bcG9zXSkgewotICAgIHVpbnQ2NF90IHZhbDsKLSAgICB1aW50MzJfdCBjdXJyX2xlbmd0aDsKLSAgICB1aW50MzJfdCBkaXN0YW5jZTsKLSAgICBpZiAoaXRlcl9wb3MgPCAwKSB7Ci0gICAgICBpZiAoaXRlcl9wb3MgPCBpdGVyX2xpbWl0IHx8IGJlc3RfdmFsID49IDB4ZmYwMDAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAtLWl0ZXJfcG9zOwotICAgIGlmIChhcmdiW3BvcyArIGJlc3RfbGVuZ3RoIC0gMV0gIT0gYXJnYl9zdGFydFtiZXN0X2xlbmd0aCAtIDFdKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgY3Vycl9sZW5ndGggPSBGaW5kTWF0Y2hMZW5ndGgoYXJnYiArIHBvcywgYXJnYl9zdGFydCwgbWF4bGVuKTsKLSAgICBpZiAoY3Vycl9sZW5ndGggPCBiZXN0X2xlbmd0aCkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGRpc3RhbmNlID0gKHVpbnQzMl90KShiYXNlX3Bvc2l0aW9uIC0gcG9zKTsKLSAgICB2YWwgPSBjdXJyX2xlbmd0aCA8PCAxNjsKLSAgICAvLyBGYXZvcmluZyAyZCBsb2NhbGl0eSBoZXJlIGdpdmVzIHNhdmluZ3MgZm9yIGNlcnRhaW4gaW1hZ2VzLgotICAgIGlmIChkaXN0YW5jZSA8IDkgKiB4c2l6ZSkgewotICAgICAgY29uc3QgdWludDMyX3QgeSA9IGRpc3RhbmNlIC8geHNpemU7Ci0gICAgICB1aW50MzJfdCB4ID0gZGlzdGFuY2UgJSB4c2l6ZTsKLSAgICAgIGlmICh4ID4gKHhzaXplID4+IDEpKSB7Ci0gICAgICAgIHggPSB4c2l6ZSAtIHg7Ci0gICAgICB9Ci0gICAgICBpZiAoeCA8PSA3KSB7Ci0gICAgICAgIHZhbCArPSA5ICogOSArIDkgKiA5OwotICAgICAgICB2YWwgLT0geSAqIHkgKyB4ICogeDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGJlc3RfdmFsIDwgdmFsKSB7Ci0gICAgICBiZXN0X3ZhbCA9IHZhbDsKLSAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7Ci0gICAgICBiZXN0X2Rpc3RhbmNlID0gZGlzdGFuY2U7Ci0gICAgICBpZiAoY3Vycl9sZW5ndGggPj0gTUFYX0xFTkdUSCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGlmICgoYmVzdF9kaXN0YW5jZSA9PSAxIHx8IGRpc3RhbmNlID09IHhzaXplKSAmJgotICAgICAgICAgIGJlc3RfbGVuZ3RoID49IDEyOCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgKmRpc3RhbmNlX3B0ciA9IChpbnQpYmVzdF9kaXN0YW5jZTsKLSAgKmxlbmd0aF9wdHIgPSBiZXN0X2xlbmd0aDsKLSAgcmV0dXJuIChiZXN0X2xlbmd0aCA+PSBNSU5fTEVOR1RIKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHVzaEJhY2tDb3B5KFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsIGludCBsZW5ndGgpIHsKLSAgaW50IHNpemUgPSByZWZzLT5zaXplOwotICB3aGlsZSAobGVuZ3RoID49IE1BWF9MRU5HVEgpIHsKLSAgICByZWZzLT5yZWZzW3NpemUrK10gPSBQaXhPckNvcHlDcmVhdGVDb3B5KDEsIE1BWF9MRU5HVEgpOwotICAgIGxlbmd0aCAtPSBNQVhfTEVOR1RIOwotICB9Ci0gIGlmIChsZW5ndGggPiAwKSB7Ci0gICAgcmVmcy0+cmVmc1tzaXplKytdID0gUGl4T3JDb3B5Q3JlYXRlQ29weSgxLCBsZW5ndGgpOwotICB9Ci0gIHJlZnMtPnNpemUgPSBzaXplOwotfQotCi1zdGF0aWMgdm9pZCBCYWNrd2FyZFJlZmVyZW5jZXNSbGUoaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKLSAgaW50IG1hdGNoX2xlbiA9IDA7Ci0gIGludCBpOwotICByZWZzLT5zaXplID0gMDsKLSAgUHVzaEJhY2tDb3B5KHJlZnMsIG1hdGNoX2xlbik7ICAgIC8vIGk9MCBjYXNlCi0gIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZSsrXSA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwoYXJnYlswXSk7Ci0gIGZvciAoaSA9IDE7IGkgPCBwaXhfY291bnQ7ICsraSkgewotICAgIGlmIChhcmdiW2ldID09IGFyZ2JbaSAtIDFdKSB7Ci0gICAgICArK21hdGNoX2xlbjsKLSAgICB9IGVsc2UgewotICAgICAgUHVzaEJhY2tDb3B5KHJlZnMsIG1hdGNoX2xlbik7Ci0gICAgICBtYXRjaF9sZW4gPSAwOwotICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplKytdID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChhcmdiW2ldKTsKLSAgICB9Ci0gIH0KLSAgUHVzaEJhY2tDb3B5KHJlZnMsIG1hdGNoX2xlbik7Ci19Ci0KLXN0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluKGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywgaW50IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGludCBpOwotICBpbnQgb2sgPSAwOwotICBpbnQgY2NfaW5pdCA9IDA7Ci0gIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOwotICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKLSAgSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluID0gKEhhc2hDaGFpbiopU2JNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmhhc2hfY2hhaW4pKTsKLSAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKLSAgaW50IHdpbmRvd19zaXplID0gV0lORE9XX1NJWkU7Ci0gIGludCBpdGVyX3BvcyA9IDE7Ci0gIGludCBpdGVyX2xpbWl0ID0gLTE7Ci0KLSAgaWYgKGhhc2hfY2hhaW4gPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKLSAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBpZiAoIUhhc2hDaGFpbkluaXQoaGFzaF9jaGFpbiwgcGl4X2NvdW50KSkgZ290byBFcnJvcjsKLQotICByZWZzLT5zaXplID0gMDsKLSAgR2V0UGFyYW1zRm9ySGFzaENoYWluRmluZENvcHkocXVhbGl0eSwgeHNpemUsIGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dfc2l6ZSwgJml0ZXJfcG9zLCAmaXRlcl9saW1pdCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBwaXhfY291bnQ7ICkgewotICAgIC8vIEFsdGVybmF0aXZlIzE6IENvZGUgdGhlIHBpeGVscyBzdGFydGluZyBhdCAnaScgdXNpbmcgYmFja3dhcmQgcmVmZXJlbmNlLgotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCBsZW4gPSAwOwotICAgIGlmIChpIDwgcGl4X2NvdW50IC0gMSkgeyAgLy8gRmluZENvcHkoaSwuLikgcmVhZHMgcGl4ZWxzIGF0IFtpXSBhbmQgW2kgKyAxXS4KLSAgICAgIGludCBtYXhsZW4gPSBwaXhfY291bnQgLSBpOwotICAgICAgaWYgKG1heGxlbiA+IE1BWF9MRU5HVEgpIHsKLSAgICAgICAgbWF4bGVuID0gTUFYX0xFTkdUSDsKLSAgICAgIH0KLSAgICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGksIHhzaXplLCBhcmdiLCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dfc2l6ZSwgaXRlcl9wb3MsIGl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0LCAmbGVuKTsKLSAgICB9Ci0gICAgaWYgKGxlbiA+PSBNSU5fTEVOR1RIKSB7Ci0gICAgICAvLyBBbHRlcm5hdGl2ZSMyOiBJbnNlcnQgdGhlIHBpeGVsIGF0ICdpJyBhcyBsaXRlcmFsLCBhbmQgY29kZSB0aGUKLSAgICAgIC8vIHBpeGVscyBzdGFydGluZyBhdCAnaSArIDEnIHVzaW5nIGJhY2t3YXJkIHJlZmVyZW5jZS4KLSAgICAgIGludCBvZmZzZXQyID0gMDsKLSAgICAgIGludCBsZW4yID0gMDsKLSAgICAgIGludCBrOwotICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2ldLCBpKTsKLSAgICAgIGlmIChpIDwgcGl4X2NvdW50IC0gMikgeyAgLy8gRmluZENvcHkoaSsxLC4uKSByZWFkcyBbaSArIDFdIGFuZCBbaSArIDJdLgotICAgICAgICBpbnQgbWF4bGVuID0gcGl4X2NvdW50IC0gKGkgKyAxKTsKLSAgICAgICAgaWYgKG1heGxlbiA+IE1BWF9MRU5HVEgpIHsKLSAgICAgICAgICBtYXhsZW4gPSBNQVhfTEVOR1RIOwotICAgICAgICB9Ci0gICAgICAgIEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGkgKyAxLCB4c2l6ZSwgYXJnYiwgbWF4bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dfc2l6ZSwgaXRlcl9wb3MsIGl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQyLCAmbGVuMik7Ci0gICAgICAgIGlmIChsZW4yID4gbGVuICsgMSkgewotICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeGVsID0gYXJnYltpXTsKLSAgICAgICAgICAvLyBBbHRlcm5hdGl2ZSMyIGlzIGEgYmV0dGVyIG1hdGNoLiBTbyBwdXNoIHBpeGVsIGF0ICdpJyBhcyBsaXRlcmFsLgotICAgICAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgcGl4ZWwpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgaXggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBwaXhlbCk7Ci0gICAgICAgICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemVdID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaXgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemVdID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXhlbCk7Ci0gICAgICAgICAgfQotICAgICAgICAgICsrcmVmcy0+c2l6ZTsKLSAgICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgcGl4ZWwpOwotICAgICAgICAgIGkrKzsgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZSB0byBiZSBkb25lIGZvciBuZXh0IHBpeGVsLgotICAgICAgICAgIGxlbiA9IGxlbjI7Ci0gICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0MjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGxlbiA+PSBNQVhfTEVOR1RIKSB7Ci0gICAgICAgIGxlbiA9IE1BWF9MRU5HVEggLSAxOwotICAgICAgfQotICAgICAgcmVmcy0+cmVmc1tyZWZzLT5zaXplKytdID0gUGl4T3JDb3B5Q3JlYXRlQ29weShvZmZzZXQsIGxlbik7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47ICsraykgewotICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0byB0aGUgaGFzaF9jaGFpbiAoYnV0IGNhbm5vdCBhZGQgdGhlIGxhc3QgcGl4ZWwpLgotICAgICAgewotICAgICAgICBjb25zdCBpbnQgbGFzdCA9IChsZW4gPCBwaXhfY291bnQgLSAxIC0gaSkgPyBsZW4gOiBwaXhfY291bnQgLSAxIC0gaTsKLSAgICAgICAgZm9yIChrID0gMTsgayA8IGxhc3Q7ICsraykgewotICAgICAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpICsga10sIGkgKyBrKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaSArPSBsZW47Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHBpeGVsID0gYXJnYltpXTsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgcGl4ZWwpKSB7Ci0gICAgICAgIC8vIHB1c2ggcGl4ZWwgYXMgYSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeCBwaXhlbAotICAgICAgICBjb25zdCBpbnQgaXggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBwaXhlbCk7Ci0gICAgICAgIHJlZnMtPnJlZnNbcmVmcy0+c2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpeCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWZzLT5yZWZzW3JlZnMtPnNpemVdID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXhlbCk7Ci0gICAgICB9Ci0gICAgICArK3JlZnMtPnNpemU7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgcGl4ZWwpOwotICAgICAgaWYgKGkgKyAxIDwgcGl4X2NvdW50KSB7Ci0gICAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltpXSwgaSk7Ci0gICAgICB9Ci0gICAgICArK2k7Ci0gICAgfQotICB9Ci0gIG9rID0gMTsKLUVycm9yOgotICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7Ci0gIEhhc2hDaGFpbkRlbGV0ZShoYXNoX2NoYWluKTsKLSAgcmV0dXJuIG9rOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGRvdWJsZSBhbHBoYV9bVkFMVUVTX0lOX0JZVEVdOwotICBkb3VibGUgcmVkX1tWQUxVRVNfSU5fQllURV07Ci0gIGRvdWJsZSBsaXRlcmFsX1tQSVhfT1JfQ09QWV9DT0RFU19NQVhdOwotICBkb3VibGUgYmx1ZV9bVkFMVUVTX0lOX0JZVEVdOwotICBkb3VibGUgZGlzdGFuY2VfW05VTV9ESVNUQU5DRV9DT0RFU107Ci19IENvc3RNb2RlbDsKLQotc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcygKLSAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwgaW50IHJlY3Vyc2l2ZV9jb3N0X21vZGVsLAotICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMsCi0gICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7Ci0KLXN0YXRpYyB2b2lkIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAotICAgIGludCBudW1fc3ltYm9scywgY29uc3QgaW50IHBvcHVsYXRpb25fY291bnRzW10sIGRvdWJsZSBvdXRwdXRbXSkgewotICBpbnQgc3VtID0gMDsKLSAgaW50IG5vbnplcm9zID0gMDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7Ci0gICAgc3VtICs9IHBvcHVsYXRpb25fY291bnRzW2ldOwotICAgIGlmIChwb3B1bGF0aW9uX2NvdW50c1tpXSA+IDApIHsKLSAgICAgICsrbm9uemVyb3M7Ci0gICAgfQotICB9Ci0gIGlmIChub256ZXJvcyA8PSAxKSB7Ci0gICAgU2JNZW1vcnlTZXQob3V0cHV0LCAwLCBudW1fc3ltYm9scyAqIHNpemVvZigqb3V0cHV0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgZG91YmxlIGxvZ3N1bSA9IFZQOExGYXN0TG9nMihzdW0pOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7Ci0gICAgICBvdXRwdXRbaV0gPSBsb2dzdW0gLSBWUDhMRmFzdExvZzIocG9wdWxhdGlvbl9jb3VudHNbaV0pOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgaW50IENvc3RNb2RlbEJ1aWxkKENvc3RNb2RlbCogY29uc3QgbSwgaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWN1cnNpb25fbGV2ZWwsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGNhY2hlX2JpdHMpIHsKLSAgaW50IG9rID0gMDsKLSAgVlA4TEhpc3RvZ3JhbSBoaXN0bzsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzOwotCi0gIGlmICghVlA4TEJhY2t3YXJkUmVmc0FsbG9jKCZyZWZzLCB4c2l6ZSAqIHlzaXplKSkgZ290byBFcnJvcjsKLQotICBpZiAocmVjdXJzaW9uX2xldmVsID4gMCkgewotICAgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoeHNpemUsIHlzaXplLCByZWN1cnNpb25fbGV2ZWwgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYiwgcXVhbGl0eSwgY2FjaGVfYml0cywgJnJlZnMpKSB7Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbih4c2l6ZSwgeXNpemUsIGFyZ2IsIGNhY2hlX2JpdHMsIHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZnMpKSB7Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotICBWUDhMSGlzdG9ncmFtQ3JlYXRlKCZoaXN0bywgJnJlZnMsIGNhY2hlX2JpdHMpOwotICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICAgIFZQOExIaXN0b2dyYW1OdW1Db2RlcygmaGlzdG8pLCBoaXN0by5saXRlcmFsXywgbS0+bGl0ZXJhbF8pOwotICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICAgIFZBTFVFU19JTl9CWVRFLCBoaXN0by5yZWRfLCBtLT5yZWRfKTsKLSAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgICBWQUxVRVNfSU5fQllURSwgaGlzdG8uYmx1ZV8sIG0tPmJsdWVfKTsKLSAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCi0gICAgICBWQUxVRVNfSU5fQllURSwgaGlzdG8uYWxwaGFfLCBtLT5hbHBoYV8pOwotICBDb252ZXJ0UG9wdWxhdGlvbkNvdW50VGFibGVUb0JpdEVzdGltYXRlcygKLSAgICAgIE5VTV9ESVNUQU5DRV9DT0RFUywgaGlzdG8uZGlzdGFuY2VfLCBtLT5kaXN0YW5jZV8pOwotICBvayA9IDE7Ci0KLSBFcnJvcjoKLSAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzKTsKLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExpdGVyYWxDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgdikgewotICByZXR1cm4gbS0+YWxwaGFfW3YgPj4gMjRdICsKLSAgICAgICAgIG0tPnJlZF9bKHYgPj4gMTYpICYgMHhmZl0gKwotICAgICAgICAgbS0+bGl0ZXJhbF9bKHYgPj4gOCkgJiAweGZmXSArCi0gICAgICAgICBtLT5ibHVlX1t2ICYgMHhmZl07Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0Q2FjaGVDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwgdWludDMyX3QgaWR4KSB7Ci0gIGNvbnN0IGludCBsaXRlcmFsX2lkeCA9IFZBTFVFU19JTl9CWVRFICsgTlVNX0xFTkdUSF9DT0RFUyArIGlkeDsKLSAgcmV0dXJuIG0tPmxpdGVyYWxfW2xpdGVyYWxfaWR4XTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRMZW5ndGhDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsZW5ndGgpIHsKLSAgaW50IGNvZGUsIGV4dHJhX2JpdHNfY291bnQsIGV4dHJhX2JpdHNfdmFsdWU7Ci0gIFByZWZpeEVuY29kZShsZW5ndGgsICZjb2RlLCAmZXh0cmFfYml0c19jb3VudCwgJmV4dHJhX2JpdHNfdmFsdWUpOwotICByZXR1cm4gbS0+bGl0ZXJhbF9bVkFMVUVTX0lOX0JZVEUgKyBjb2RlXSArIGV4dHJhX2JpdHNfY291bnQ7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0RGlzdGFuY2VDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpc3RhbmNlKSB7Ci0gIGludCBjb2RlLCBleHRyYV9iaXRzX2NvdW50LCBleHRyYV9iaXRzX3ZhbHVlOwotICBQcmVmaXhFbmNvZGUoZGlzdGFuY2UsICZjb2RlLCAmZXh0cmFfYml0c19jb3VudCwgJmV4dHJhX2JpdHNfdmFsdWUpOwotICByZXR1cm4gbS0+ZGlzdGFuY2VfW2NvZGVdICsgZXh0cmFfYml0c19jb3VudDsKLX0KLQotc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkoCi0gICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGludCByZWN1cnNpdmVfY29zdF9tb2RlbCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLCB1aW50MzJfdCogY29uc3QgZGlzdF9hcnJheSkgewotICBpbnQgaTsKLSAgaW50IG9rID0gMDsKLSAgaW50IGNjX2luaXQgPSAwOwotICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGZsb2F0KiBjb25zdCBjb3N0ID0KLSAgICAgIChmbG9hdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXBpeF9jb3VudCwgc2l6ZW9mKCpjb3N0KSk7Ci0gIENvc3RNb2RlbCogY29zdF9tb2RlbCA9IChDb3N0TW9kZWwqKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpjb3N0X21vZGVsKSk7Ci0gIEhhc2hDaGFpbiogaGFzaF9jaGFpbiA9IChIYXNoQ2hhaW4qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoYXNoX2NoYWluKSk7Ci0gIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7Ci0gIGNvbnN0IGRvdWJsZSBtdWwwID0gKHJlY3Vyc2l2ZV9jb3N0X21vZGVsICE9IDApID8gMS4wIDogMC42ODsKLSAgY29uc3QgZG91YmxlIG11bDEgPSAocmVjdXJzaXZlX2Nvc3RfbW9kZWwgIT0gMCkgPyAxLjAgOiAwLjgyOwotICBjb25zdCBpbnQgbWluX2Rpc3RhbmNlX2NvZGUgPSAyOyAgLy8gVE9ETyh2aWthc2EpOiB0dW5lIGFzIGZ1bmN0aW9uIG9mIHF1YWxpdHkKLSAgaW50IHdpbmRvd19zaXplID0gV0lORE9XX1NJWkU7Ci0gIGludCBpdGVyX3BvcyA9IDE7Ci0gIGludCBpdGVyX2xpbWl0ID0gLTE7Ci0KLSAgaWYgKGNvc3QgPT0gTlVMTCB8fCBjb3N0X21vZGVsID09IE5VTEwgfHwgaGFzaF9jaGFpbiA9PSBOVUxMKSBnb3RvIEVycm9yOwotCi0gIGlmICghSGFzaENoYWluSW5pdChoYXNoX2NoYWluLCBwaXhfY291bnQpKSBnb3RvIEVycm9yOwotCi0gIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKLSAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBpZiAoIUNvc3RNb2RlbEJ1aWxkKGNvc3RfbW9kZWwsIHhzaXplLCB5c2l6ZSwgcmVjdXJzaXZlX2Nvc3RfbW9kZWwsIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgY2FjaGVfYml0cykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDsgKytpKSBjb3N0W2ldID0gMWUzOGY7Ci0KLSAgLy8gV2UgbG9vcCBvbmUgcGl4ZWwgYXQgYSB0aW1lLCBidXQgc3RvcmUgYWxsIGN1cnJlbnRseSBiZXN0IHBvaW50cyB0bwotICAvLyBub24tcHJvY2Vzc2VkIGxvY2F0aW9ucyBmcm9tIHRoaXMgcG9pbnQuCi0gIGRpc3RfYXJyYXlbMF0gPSAwOwotICBHZXRQYXJhbXNGb3JIYXNoQ2hhaW5GaW5kQ29weShxdWFsaXR5LCB4c2l6ZSwgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJndpbmRvd19zaXplLCAmaXRlcl9wb3MsICZpdGVyX2xpbWl0KTsKLSAgZm9yIChpID0gMDsgaSA8IHBpeF9jb3VudDsgKytpKSB7Ci0gICAgZG91YmxlIHByZXZfY29zdCA9IDAuMDsKLSAgICBpbnQgc2hvcnRtYXg7Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBwcmV2X2Nvc3QgPSBjb3N0W2kgLSAxXTsKLSAgICB9Ci0gICAgZm9yIChzaG9ydG1heCA9IDA7IHNob3J0bWF4IDwgMjsgKytzaG9ydG1heCkgewotICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICBpbnQgbGVuID0gMDsKLSAgICAgIGlmIChpIDwgcGl4X2NvdW50IC0gMSkgeyAgLy8gRmluZENvcHkgcmVhZHMgcGl4ZWxzIGF0IFtpXSBhbmQgW2kgKyAxXS4KLSAgICAgICAgaW50IG1heGxlbiA9IHNob3J0bWF4ID8gMiA6IE1BWF9MRU5HVEg7Ci0gICAgICAgIGlmIChtYXhsZW4gPiBwaXhfY291bnQgLSBpKSB7Ci0gICAgICAgICAgbWF4bGVuID0gcGl4X2NvdW50IC0gaTsKLSAgICAgICAgfQotICAgICAgICBIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCB4c2l6ZSwgYXJnYiwgbWF4bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dfc2l6ZSwgaXRlcl9wb3MsIGl0ZXJfbGltaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXQsICZsZW4pOwotICAgICAgfQotICAgICAgaWYgKGxlbiA+PSBNSU5fTEVOR1RIKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2RlID0gRGlzdGFuY2VUb1BsYW5lQ29kZSh4c2l6ZSwgb2Zmc2V0KTsKLSAgICAgICAgY29uc3QgZG91YmxlIGRpc3RhbmNlX2Nvc3QgPQotICAgICAgICAgICAgcHJldl9jb3N0ICsgR2V0RGlzdGFuY2VDb3N0KGNvc3RfbW9kZWwsIGNvZGUpOwotICAgICAgICBpbnQgazsKLSAgICAgICAgZm9yIChrID0gMTsgayA8IGxlbjsgKytrKSB7Ci0gICAgICAgICAgY29uc3QgZG91YmxlIGNvc3RfdmFsID0gZGlzdGFuY2VfY29zdCArIEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgayk7Ci0gICAgICAgICAgaWYgKGNvc3RbaSArIGtdID4gY29zdF92YWwpIHsKLSAgICAgICAgICAgIGNvc3RbaSArIGtdID0gKGZsb2F0KWNvc3RfdmFsOwotICAgICAgICAgICAgZGlzdF9hcnJheVtpICsga10gPSBrICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVGhpcyBpZiBpcyBmb3Igc3BlZWR1cCBvbmx5LiBJdCByb3VnaGx5IGRvdWJsZXMgdGhlIHNwZWVkLCBhbmQKLSAgICAgICAgLy8gbWFrZXMgY29tcHJlc3Npb24gd29yc2UgYnkgLjEgJS4KLSAgICAgICAgaWYgKGxlbiA+PSAxMjggJiYgY29kZSA8PSBtaW5fZGlzdGFuY2VfY29kZSkgewotICAgICAgICAgIC8vIExvbmcgY29weSBmb3Igc2hvcnQgZGlzdGFuY2VzLCBsZXQncyBza2lwIHRoZSBtaWRkbGUKLSAgICAgICAgICAvLyBsb29rdXBzIGZvciBiZXR0ZXIgY29waWVzLgotICAgICAgICAgIC8vIDEpIGluc2VydCB0aGUgaGFzaGVzLgotICAgICAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47ICsraykgewotICAgICAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpICsga10pOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICAvLyAyKSBBZGQgdG8gdGhlIGhhc2hfY2hhaW4gKGJ1dCBjYW5ub3QgYWRkIHRoZSBsYXN0IHBpeGVsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBsYXN0ID0gKGxlbiArIGkgPCBwaXhfY291bnQgLSAxKSA/IGxlbiArIGkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHBpeF9jb3VudCAtIDE7Ci0gICAgICAgICAgICBmb3IgKGsgPSBpOyBrIDwgbGFzdDsgKytrKSB7Ci0gICAgICAgICAgICAgIEhhc2hDaGFpbkluc2VydChoYXNoX2NoYWluLCAmYXJnYltrXSwgayk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIDMpIGp1bXAuCi0gICAgICAgICAgaSArPSBsZW4gLSAxOyAgLy8gZm9yIGxvb3AgZG9lcyArK2ksIHRodXMgLTEgaGVyZS4KLSAgICAgICAgICBnb3RvIG5leHRfc3ltYm9sOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChpIDwgcGl4X2NvdW50IC0gMSkgewotICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2ldLCBpKTsKLSAgICB9Ci0gICAgewotICAgICAgLy8gaW5zZXJ0aW5nIGEgbGl0ZXJhbCBwaXhlbAotICAgICAgZG91YmxlIGNvc3RfdmFsID0gcHJldl9jb3N0OwotICAgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSAmJiBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBhcmdiW2ldKSkgewotICAgICAgICBjb25zdCBpbnQgaXggPSBWUDhMQ29sb3JDYWNoZUdldEluZGV4KCZoYXNoZXJzLCBhcmdiW2ldKTsKLSAgICAgICAgY29zdF92YWwgKz0gR2V0Q2FjaGVDb3N0KGNvc3RfbW9kZWwsIGl4KSAqIG11bDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb3N0X3ZhbCArPSBHZXRMaXRlcmFsQ29zdChjb3N0X21vZGVsLCBhcmdiW2ldKSAqIG11bDE7Ci0gICAgICB9Ci0gICAgICBpZiAoY29zdFtpXSA+IGNvc3RfdmFsKSB7Ci0gICAgICAgIGNvc3RbaV0gPSAoZmxvYXQpY29zdF92YWw7Ci0gICAgICAgIGRpc3RfYXJyYXlbaV0gPSAxOyAgLy8gb25seSBvbmUgaXMgaW5zZXJ0ZWQuCi0gICAgICB9Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpXSk7Ci0gICAgfQotIG5leHRfc3ltYm9sOiA7Ci0gIH0KLSAgLy8gTGFzdCBwaXhlbCBzdGlsbCB0byBkbywgaXQgY2FuIG9ubHkgYmUgYSBzaW5nbGUgc3RlcCBpZiBub3QgcmVhY2hlZAotICAvLyB0aHJvdWdoIGNoZWFwZXIgbWVhbnMgYWxyZWFkeS4KLSAgb2sgPSAxOwotRXJyb3I6Ci0gIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKLSAgSGFzaENoYWluRGVsZXRlKGhhc2hfY2hhaW4pOwotICBTYk1lbW9yeURlYWxsb2NhdGUoY29zdF9tb2RlbCk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShjb3N0KTsKLSAgcmV0dXJuIG9rOwotfQotCi0vLyBXZSBwYWNrIHRoZSBwYXRoIGF0IHRoZSBlbmQgb2YgKmRpc3RfYXJyYXkgYW5kIHJldHVybgotLy8gYSBwb2ludGVyIHRvIHRoaXMgcGFydCBvZiB0aGUgYXJyYXkuIEV4YW1wbGU6Ci0vLyBkaXN0X2FycmF5ID0gWzF4Mnh4M3gyXSA9PiBwYWNrZWQgWzF4MngxMjMyXSwgY2hvc2VuX3BhdGggPSBbMTIzMl0KLXN0YXRpYyB2b2lkIFRyYWNlQmFja3dhcmRzKHVpbnQzMl90KiBjb25zdCBkaXN0X2FycmF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RfYXJyYXlfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgY2hvc2VuX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGNob3Nlbl9wYXRoX3NpemUpIHsKLSAgdWludDMyX3QqIHBhdGggPSBkaXN0X2FycmF5ICsgZGlzdF9hcnJheV9zaXplOwotICB1aW50MzJfdCogY3VyID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIDE7Ci0gIHdoaWxlIChjdXIgPj0gZGlzdF9hcnJheSkgewotICAgIGNvbnN0IGludCBrID0gKmN1cjsKLSAgICAtLXBhdGg7Ci0gICAgKnBhdGggPSBrOwotICAgIGN1ciAtPSBrOwotICB9Ci0gICpjaG9zZW5fcGF0aCA9IHBhdGg7Ci0gICpjaG9zZW5fcGF0aF9zaXplID0gKGludCkoZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIHBhdGgpOwotfQotCi1zdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGgoCi0gICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywKLSAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY2hvc2VuX3BhdGgsIGludCBjaG9zZW5fcGF0aF9zaXplLAotICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKLSAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7Ci0gIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOwotICBpbnQgc2l6ZSA9IDA7Ci0gIGludCBpID0gMDsKLSAgaW50IGs7Ci0gIGludCBpeDsKLSAgaW50IG9rID0gMDsKLSAgaW50IGNjX2luaXQgPSAwOwotICBpbnQgd2luZG93X3NpemUgPSBXSU5ET1dfU0laRTsKLSAgaW50IGl0ZXJfcG9zID0gMTsKLSAgaW50IGl0ZXJfbGltaXQgPSAtMTsKLSAgSGFzaENoYWluKiBoYXNoX2NoYWluID0gKEhhc2hDaGFpbiopU2JNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmhhc2hfY2hhaW4pKTsKLSAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKLQotICBpZiAoaGFzaF9jaGFpbiA9PSBOVUxMIHx8ICFIYXNoQ2hhaW5Jbml0KGhhc2hfY2hhaW4sIHBpeF9jb3VudCkpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKLSAgICBpZiAoIWNjX2luaXQpIGdvdG8gRXJyb3I7Ci0gIH0KLQotICByZWZzLT5zaXplID0gMDsKLSAgR2V0UGFyYW1zRm9ySGFzaENoYWluRmluZENvcHkocXVhbGl0eSwgeHNpemUsIGNhY2hlX2JpdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3aW5kb3dfc2l6ZSwgJml0ZXJfcG9zLCAmaXRlcl9saW1pdCk7Ci0gIGZvciAoaXggPSAwOyBpeCA8IGNob3Nlbl9wYXRoX3NpemU7ICsraXgsICsrc2l6ZSkgewotICAgIGludCBvZmZzZXQgPSAwOwotICAgIGludCBsZW4gPSAwOwotICAgIGludCBtYXhsZW4gPSBjaG9zZW5fcGF0aFtpeF07Ci0gICAgaWYgKG1heGxlbiAhPSAxKSB7Ci0gICAgICBIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCB4c2l6ZSwgYXJnYiwgbWF4bGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93X3NpemUsIGl0ZXJfcG9zLCBpdGVyX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldCwgJmxlbik7Ci0gICAgICBTQl9EQ0hFQ0sobGVuID09IG1heGxlbik7Ci0gICAgICByZWZzLT5yZWZzW3NpemVdID0gUGl4T3JDb3B5Q3JlYXRlQ29weShvZmZzZXQsIGxlbik7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47ICsraykgewotICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgY29uc3QgaW50IGxhc3QgPSAobGVuIDwgcGl4X2NvdW50IC0gMSAtIGkpID8gbGVuIDogcGl4X2NvdW50IC0gMSAtIGk7Ci0gICAgICAgIGZvciAoayA9IDA7IGsgPCBsYXN0OyArK2spIHsKLSAgICAgICAgICBIYXNoQ2hhaW5JbnNlcnQoaGFzaF9jaGFpbiwgJmFyZ2JbaSArIGtdLCBpICsgayk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGkgKz0gbGVuOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlICYmIFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JbaV0pKSB7Ci0gICAgICAgIC8vIHB1c2ggcGl4ZWwgYXMgYSBjb2xvciBjYWNoZSBpbmRleAotICAgICAgICBjb25zdCBpbnQgaWR4ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleCgmaGFzaGVycywgYXJnYltpXSk7Ci0gICAgICAgIHJlZnMtPnJlZnNbc2l6ZV0gPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpZHgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVmcy0+cmVmc1tzaXplXSA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwoYXJnYltpXSk7Ci0gICAgICB9Ci0gICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpXSk7Ci0gICAgICBpZiAoaSArIDEgPCBwaXhfY291bnQpIHsKLSAgICAgICAgSGFzaENoYWluSW5zZXJ0KGhhc2hfY2hhaW4sICZhcmdiW2ldLCBpKTsKLSAgICAgIH0KLSAgICAgICsraTsKLSAgICB9Ci0gIH0KLSAgU0JfRENIRUNLKHNpemUgPD0gcmVmcy0+bWF4X3NpemUpOwotICByZWZzLT5zaXplID0gc2l6ZTsKLSAgb2sgPSAxOwotRXJyb3I6Ci0gIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKLSAgSGFzaENoYWluRGVsZXRlKGhhc2hfY2hhaW4pOwotICByZXR1cm4gb2s7Ci19Ci0KLS8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgotc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcyhpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3Vyc2l2ZV9jb3N0X21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7Ci0gIGludCBvayA9IDA7Ci0gIGNvbnN0IGludCBkaXN0X2FycmF5X3NpemUgPSB4c2l6ZSAqIHlzaXplOwotICB1aW50MzJfdCogY2hvc2VuX3BhdGggPSBOVUxMOwotICBpbnQgY2hvc2VuX3BhdGhfc2l6ZSA9IDA7Ci0gIHVpbnQzMl90KiBkaXN0X2FycmF5ID0KLSAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWRpc3RfYXJyYXlfc2l6ZSwgc2l6ZW9mKCpkaXN0X2FycmF5KSk7Ci0KLSAgaWYgKGRpc3RfYXJyYXkgPT0gTlVMTCkgZ290byBFcnJvcjsKLQotICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkRpc3RhbmNlT25seSgKLSAgICAgIHhzaXplLCB5c2l6ZSwgcmVjdXJzaXZlX2Nvc3RfbW9kZWwsIGFyZ2IsIHF1YWxpdHksIGNhY2hlX2JpdHMsCi0gICAgICBkaXN0X2FycmF5KSkgewotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLSAgVHJhY2VCYWNrd2FyZHMoZGlzdF9hcnJheSwgZGlzdF9hcnJheV9zaXplLCAmY2hvc2VuX3BhdGgsICZjaG9zZW5fcGF0aF9zaXplKTsKLSAgaWYgKCFCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5Gb2xsb3dDaG9zZW5QYXRoKAotICAgICAgeHNpemUsIHlzaXplLCBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLCBjaG9zZW5fcGF0aCwgY2hvc2VuX3BhdGhfc2l6ZSwKLSAgICAgIHJlZnMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICBvayA9IDE7Ci0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShkaXN0X2FycmF5KTsKLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgdm9pZCBCYWNrd2FyZFJlZmVyZW5jZXMyRExvY2FsaXR5KGludCB4c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IHJlZnMtPnNpemU7ICsraSkgewotICAgIGlmIChQaXhPckNvcHlJc0NvcHkoJnJlZnMtPnJlZnNbaV0pKSB7Ci0gICAgICBjb25zdCBpbnQgZGlzdCA9IHJlZnMtPnJlZnNbaV0uYXJnYl9vcl9kaXN0YW5jZTsKLSAgICAgIGNvbnN0IGludCB0cmFuc2Zvcm1lZF9kaXN0ID0gRGlzdGFuY2VUb1BsYW5lQ29kZSh4c2l6ZSwgZGlzdCk7Ci0gICAgICByZWZzLT5yZWZzW2ldLmFyZ2Jfb3JfZGlzdGFuY2UgPSB0cmFuc2Zvcm1lZF9kaXN0OwotICAgIH0KLSAgfQotfQotCi1pbnQgVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyhpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgY2FjaGVfYml0cywgaW50IHVzZV8yZF9sb2NhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IGJlc3QpIHsKLSAgaW50IG9rID0gMDsKLSAgaW50IGx6NzdfaXNfdXNlZnVsOwotICBWUDhMQmFja3dhcmRSZWZzIHJlZnNfcmxlLCByZWZzX2x6Nzc7Ci0gIGNvbnN0IGludCBudW1fcGl4ID0gd2lkdGggKiBoZWlnaHQ7Ci0KLSAgVlA4TEJhY2t3YXJkUmVmc0FsbG9jKCZyZWZzX3JsZSwgbnVtX3BpeCk7Ci0gIFZQOExCYWNrd2FyZFJlZnNBbGxvYygmcmVmc19sejc3LCBudW1fcGl4KTsKLSAgVlA4TEluaXRCYWNrd2FyZFJlZnMoYmVzdCk7Ci0gIGlmIChyZWZzX3JsZS5yZWZzID09IE5VTEwgfHwgcmVmc19sejc3LnJlZnMgPT0gTlVMTCkgewotIEVycm9yMToKLSAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnNfcmxlKTsKLSAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnNfbHo3Nyk7Ci0gICAgZ290byBFbmQ7Ci0gIH0KLQotICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbih3aWR0aCwgaGVpZ2h0LCBhcmdiLCBjYWNoZV9iaXRzLCBxdWFsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmc19sejc3KSkgewotICAgIGdvdG8gRW5kOwotICB9Ci0gIC8vIEJhY2t3YXJkIFJlZmVyZW5jZSB1c2luZyBSTEUgb25seS4KLSAgQmFja3dhcmRSZWZlcmVuY2VzUmxlKHdpZHRoLCBoZWlnaHQsIGFyZ2IsICZyZWZzX3JsZSk7Ci0KLSAgewotICAgIGRvdWJsZSBiaXRfY29zdF9sejc3LCBiaXRfY29zdF9ybGU7Ci0gICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSAoVlA4TEhpc3RvZ3JhbSopU2JNZW1vcnlBbGxvY2F0ZShzaXplb2YoKmhpc3RvKSk7Ci0gICAgaWYgKGhpc3RvID09IE5VTEwpIGdvdG8gRXJyb3IxOwotICAgIC8vIEV2YWx1YXRlIGx6NzcgY29kaW5nCi0gICAgVlA4TEhpc3RvZ3JhbUNyZWF0ZShoaXN0bywgJnJlZnNfbHo3NywgY2FjaGVfYml0cyk7Ci0gICAgYml0X2Nvc3RfbHo3NyA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOwotICAgIC8vIEV2YWx1YXRlIFJMRSBjb2RpbmcKLSAgICBWUDhMSGlzdG9ncmFtQ3JlYXRlKGhpc3RvLCAmcmVmc19ybGUsIGNhY2hlX2JpdHMpOwotICAgIGJpdF9jb3N0X3JsZSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOwotICAgIC8vIERlY2lkZSBpZiBMWjc3IGlzIHVzZWZ1bC4KLSAgICBsejc3X2lzX3VzZWZ1bCA9IChiaXRfY29zdF9sejc3IDwgYml0X2Nvc3RfcmxlKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG8pOwotICB9Ci0KLSAgLy8gQ2hvb3NlIGFwcHJvcHJpYXRlIGJhY2t3YXJkIHJlZmVyZW5jZS4KLSAgaWYgKGx6NzdfaXNfdXNlZnVsKSB7Ci0gICAgLy8gVHJhY2VCYWNrd2FyZHMgaXMgY29zdGx5LiBEb24ndCBleGVjdXRlIGl0IGF0IGxvd2VyIHF1YWxpdHkgKHEgPD0gMTApLgotICAgIGNvbnN0IGludCB0cnlfbHo3N190cmFjZV9iYWNrd2FyZHMgPSAocXVhbGl0eSA+IDEwKTsKLSAgICAqYmVzdCA9IHJlZnNfbHo3NzsgICAvLyBkZWZhdWx0IGd1ZXNzOiBsejc3IGlzIGJldHRlcgotICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmc19ybGUpOwotICAgIGlmICh0cnlfbHo3N190cmFjZV9iYWNrd2FyZHMpIHsKLSAgICAgIC8vIFNldCByZWN1cnNpb24gbGV2ZWwgZm9yIGxhcmdlIGltYWdlcyB1c2luZyBhIGNvbG9yIGNhY2hlLgotICAgICAgY29uc3QgaW50IHJlY3Vyc2lvbl9sZXZlbCA9Ci0gICAgICAgICAgKG51bV9waXggPCAzMjAgKiAyMDApICYmIChjYWNoZV9iaXRzID4gMCkgPyAxIDogMDsKLSAgICAgIFZQOExCYWNrd2FyZFJlZnMgcmVmc190cmFjZTsKLSAgICAgIGlmICghVlA4TEJhY2t3YXJkUmVmc0FsbG9jKCZyZWZzX3RyYWNlLCBudW1fcGl4KSkgewotICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLSAgICAgIGlmIChCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcyh3aWR0aCwgaGVpZ2h0LCByZWN1cnNpb25fbGV2ZWwsIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSwgY2FjaGVfYml0cywgJnJlZnNfdHJhY2UpKSB7Ci0gICAgICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmc19sejc3KTsKLSAgICAgICAgKmJlc3QgPSByZWZzX3RyYWNlOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnNfbHo3Nyk7Ci0gICAgKmJlc3QgPSByZWZzX3JsZTsKLSAgfQotCi0gIGlmICh1c2VfMmRfbG9jYWxpdHkpIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkod2lkdGgsIGJlc3QpOwotCi0gIG9rID0gMTsKLQotIEVuZDoKLSAgaWYgKCFvaykgewotICAgIFZQOExDbGVhckJhY2t3YXJkUmVmcyhiZXN0KTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLS8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgotc3RhdGljIGludCBDb21wdXRlQ2FjaGVIaXN0b2dyYW0oY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7Ci0gIGludCBwaXhlbF9pbmRleCA9IDA7Ci0gIGludCBpOwotICB1aW50MzJfdCBrOwotICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOwotICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKLSAgaW50IGNjX2luaXQgPSAwOwotCi0gIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKLSAgICBjY19pbml0ID0gVlA4TENvbG9yQ2FjaGVJbml0KCZoYXNoZXJzLCBjYWNoZV9iaXRzKTsKLSAgICBpZiAoIWNjX2luaXQpIHJldHVybiAwOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHJlZnMtPnNpemU7ICsraSkgewotICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9ICZyZWZzLT5yZWZzW2ldOwotICAgIGlmIChQaXhPckNvcHlJc0xpdGVyYWwodikpIHsKLSAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYKLSAgICAgICAgICBWUDhMQ29sb3JDYWNoZUNvbnRhaW5zKCZoYXNoZXJzLCBhcmdiW3BpeGVsX2luZGV4XSkpIHsKLSAgICAgICAgLy8gcHVzaCBwaXhlbCBhcyBhIGNhY2hlIGluZGV4Ci0gICAgICAgIGNvbnN0IGludCBpeCA9IFZQOExDb2xvckNhY2hlR2V0SW5kZXgoJmhhc2hlcnMsIGFyZ2JbcGl4ZWxfaW5kZXhdKTsKLSAgICAgICAgY29uc3QgUGl4T3JDb3B5IHRva2VuID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaXgpOwotICAgICAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCAmdG9rZW4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgdik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sIHYpOwotICAgIH0KLSAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7Ci0gICAgICBmb3IgKGsgPSAwOyBrIDwgUGl4T3JDb3B5TGVuZ3RoKHYpOyArK2spIHsKLSAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbcGl4ZWxfaW5kZXggKyBrXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHBpeGVsX2luZGV4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKLSAgfQotICBTQl9EQ0hFQ0socGl4ZWxfaW5kZXggPT0geHNpemUgKiB5c2l6ZSk7Ci0gICh2b2lkKXhzaXplOyAgLy8geHNpemUgaXMgbm90IHVzZWQgaW4gbm9uLWRlYnVnIGNvbXBpbGF0aW9ucyBvdGhlcndpc2UuCi0gICh2b2lkKXlzaXplOyAgLy8geXNpemUgaXMgbm90IHVzZWQgaW4gbm9uLWRlYnVnIGNvbXBpbGF0aW9ucyBvdGhlcndpc2UuCi0gIGlmIChjY19pbml0KSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzKTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFJldHVybnMgaG93IG1hbnkgYml0cyBhcmUgdG8gYmUgdXNlZCBmb3IgYSBjb2xvciBjYWNoZS4KLWludCBWUDhMQ2FsY3VsYXRlRXN0aW1hdGVGb3JDYWNoZVNpemUoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4c2l6ZSwgaW50IHlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGJlc3RfY2FjaGVfYml0cykgewotICBpbnQgb2sgPSAwOwotICBpbnQgY2FjaGVfYml0czsKLSAgZG91YmxlIGxvd2VzdF9lbnRyb3B5ID0gMWU5OTsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzOwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtTbWFsbFBlbmFsdHlGb3JMYXJnZUNhY2hlID0gNC4wOwotICBzdGF0aWMgY29uc3QgaW50IHF1YWxpdHkgPSAzMDsKLSAgaWYgKCFWUDhMQmFja3dhcmRSZWZzQWxsb2MoJnJlZnMsIHhzaXplICogeXNpemUpIHx8Ci0gICAgICAhQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluKHhzaXplLCB5c2l6ZSwgYXJnYiwgMCwgcXVhbGl0eSwgJnJlZnMpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICBmb3IgKGNhY2hlX2JpdHMgPSAwOyBjYWNoZV9iaXRzIDw9IE1BWF9DT0xPUl9DQUNIRV9CSVRTOyArK2NhY2hlX2JpdHMpIHsKLSAgICBkb3VibGUgY3VyX2VudHJvcHk7Ci0gICAgVlA4TEhpc3RvZ3JhbSBoaXN0bzsKLSAgICBWUDhMSGlzdG9ncmFtSW5pdCgmaGlzdG8sIGNhY2hlX2JpdHMpOwotICAgIENvbXB1dGVDYWNoZUhpc3RvZ3JhbShhcmdiLCB4c2l6ZSwgeXNpemUsICZyZWZzLCBjYWNoZV9iaXRzLCAmaGlzdG8pOwotICAgIGN1cl9lbnRyb3B5ID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cygmaGlzdG8pICsKLSAgICAgICAga1NtYWxsUGVuYWx0eUZvckxhcmdlQ2FjaGUgKiBjYWNoZV9iaXRzOwotICAgIGlmIChjYWNoZV9iaXRzID09IDAgfHwgY3VyX2VudHJvcHkgPCBsb3dlc3RfZW50cm9weSkgewotICAgICAgKmJlc3RfY2FjaGVfYml0cyA9IGNhY2hlX2JpdHM7Ci0gICAgICBsb3dlc3RfZW50cm9weSA9IGN1cl9lbnRyb3B5OwotICAgIH0KLSAgfQotICBvayA9IDE7Ci0gRXJyb3I6Ci0gIFZQOExDbGVhckJhY2t3YXJkUmVmcygmcmVmcyk7Ci0gIHJldHVybiBvazsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvYmFja3dhcmRfcmVmZXJlbmNlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTM0NDFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKLS8vCi0KLSNpZm5kZWYgV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19IXwotI2RlZmluZSBXRUJQX0VOQ19CQUNLV0FSRF9SRUZFUkVOQ0VTX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2VuZGlmCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gVGhlIHNwZWMgYWxsb3dzIDExLCB3ZSB1c2UgOSBiaXRzIHRvIHJlZHVjZSBtZW1vcnkgY29uc3VtcHRpb24gaW4gZW5jb2RpbmcuCi0vLyBIYXZpbmcgOSBpbnN0ZWFkIG9mIDExIG9ubHkgcmVtb3ZlcyBhYm91dCAwLjI1ICUgb2YgY29tcHJlc3Npb24gZGVuc2l0eS4KLSNkZWZpbmUgTUFYX0NPTE9SX0NBQ0hFX0JJVFMgOQotCi0vLyBNYXggZXZlciBudW1iZXIgb2YgY29kZXMgd2UnbGwgdXNlOgotI2RlZmluZSBQSVhfT1JfQ09QWV9DT0RFU19NQVggXAotICAgIChOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMgKyAoMSA8PCBNQVhfQ09MT1JfQ0FDSEVfQklUUykpCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcmVmaXhFbmNvZGUoKQotCi0vLyB1c2UgR05VIGJ1aWx0aW5zIHdoZXJlIGF2YWlsYWJsZS4KLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBcCi0gICAgKChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpIHx8IF9fR05VQ19fID49IDQpCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEJpdHNMb2cyRmxvb3IodWludDMyX3QgbikgewotICBTQl9EQ0hFQ0sobiAhPSAwKTsKLSAgcmV0dXJuIDMxIF4gX19idWlsdGluX2NseihuKTsKLX0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkKLSNpbmNsdWRlIDxpbnRyaW4uaD4KLSNwcmFnbWEgaW50cmluc2ljKF9CaXRTY2FuUmV2ZXJzZSkKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBCaXRzTG9nMkZsb29yKHVpbnQzMl90IG4pIHsKLSAgdW5zaWduZWQgbG9uZyBmaXJzdF9zZXRfYml0OwotICBTQl9EQ0hFQ0sobiAhPSAwKTsKLSAgX0JpdFNjYW5SZXZlcnNlKCZmaXJzdF9zZXRfYml0LCBuKTsKLSAgcmV0dXJuIGZpcnN0X3NldF9iaXQ7Ci19Ci0jZWxzZQotLy8gUmV0dXJucyAoaW50KWZsb29yKGxvZzIobikpLiBuIG11c3QgYmUgPiAwLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBCaXRzTG9nMkZsb29yKHVpbnQzMl90IG4pIHsKLSAgaW50IGxvZyA9IDA7Ci0gIHVpbnQzMl90IHZhbHVlID0gbjsKLSAgaW50IGk7Ci0KLSAgU0JfRENIRUNLKG4gIT0gMCk7Ci0gIGZvciAoaSA9IDQ7IGkgPj0gMDsgLS1pKSB7Ci0gICAgY29uc3QgaW50IHNoaWZ0ID0gKDEgPDwgaSk7Ci0gICAgY29uc3QgdWludDMyX3QgeCA9IHZhbHVlID4+IHNoaWZ0OwotICAgIGlmICh4ICE9IDApIHsKLSAgICAgIHZhbHVlID0geDsKLSAgICAgIGxvZyArPSBzaGlmdDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGxvZzsKLX0KLSNlbmRpZgotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExCaXRzTG9nMkNlaWxpbmcodWludDMyX3QgbikgewotICBjb25zdCBpbnQgbG9nX2Zsb29yID0gQml0c0xvZzJGbG9vcihuKTsKLSAgaWYgKG4gPT0gKG4gJiB+KG4gLSAxKSkpICAvLyB6ZXJvIG9yIGEgcG93ZXIgb2YgdHdvLgotICAgIHJldHVybiBsb2dfZmxvb3I7Ci0gIGVsc2UKLSAgICByZXR1cm4gbG9nX2Zsb29yICsgMTsKLX0KLQotLy8gU3BsaXR0aW5nIG9mIGRpc3RhbmNlIGFuZCBsZW5ndGggY29kZXMgaW50byBwcmVmaXhlcyBhbmQKLS8vIGV4dHJhIGJpdHMuIFRoZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB3aXRoIGFuIGVudHJvcHkgY29kZQotLy8gd2hpbGUgdGhlIGV4dHJhIGJpdHMgYXJlIHN0b3JlZCBqdXN0IGFzIG5vcm1hbCBiaXRzLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZml4RW5jb2RlKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c19jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHNfdmFsdWUpIHsKLSAgaWYgKGRpc3RhbmNlID4gMikgeyAgLy8gQ29sbGVjdCB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KLSAgICBjb25zdCBpbnQgaGlnaGVzdF9iaXQgPSBCaXRzTG9nMkZsb29yKC0tZGlzdGFuY2UpOwotICAgIGNvbnN0IGludCBzZWNvbmRfaGlnaGVzdF9iaXQgPSAoZGlzdGFuY2UgPj4gKGhpZ2hlc3RfYml0IC0gMSkpICYgMTsKLSAgICAqZXh0cmFfYml0c19jb3VudCA9IGhpZ2hlc3RfYml0IC0gMTsKLSAgICAqZXh0cmFfYml0c192YWx1ZSA9IGRpc3RhbmNlICYgKCgxIDw8ICpleHRyYV9iaXRzX2NvdW50KSAtIDEpOwotICAgICpjb2RlID0gMiAqIGhpZ2hlc3RfYml0ICsgc2Vjb25kX2hpZ2hlc3RfYml0OwotICB9IGVsc2UgewotICAgICpleHRyYV9iaXRzX2NvdW50ID0gMDsKLSAgICAqZXh0cmFfYml0c192YWx1ZSA9IDA7Ci0gICAgKmNvZGUgPSAoZGlzdGFuY2UgPT0gMikgPyAxIDogMDsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGl4T3JDb3B5Ci0KLWVudW0gTW9kZSB7Ci0gIGtMaXRlcmFsLAotICBrQ2FjaGVJZHgsCi0gIGtDb3B5LAotICBrTm9uZQotfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICAvLyBtb2RlIGFzIHVpbnQ4X3QgdG8gbWFrZSB0aGUgbWVtb3J5IGxheW91dCB0byBiZSBleGFjdGx5IDggYnl0ZXMuCi0gIHVpbnQ4X3QgbW9kZTsKLSAgdWludDE2X3QgbGVuOwotICB1aW50MzJfdCBhcmdiX29yX2Rpc3RhbmNlOwotfSBQaXhPckNvcHk7Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ29weSh1aW50MzJfdCBkaXN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKLSAgUGl4T3JDb3B5IHJldHZhbDsKLSAgcmV0dmFsLm1vZGUgPSBrQ29weTsKLSAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBkaXN0YW5jZTsKLSAgcmV0dmFsLmxlbiA9IGxlbjsKLSAgcmV0dXJuIHJldHZhbDsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpbnQgaWR4KSB7Ci0gIFBpeE9yQ29weSByZXR2YWw7Ci0gIFNCX0RDSEVDSyhpZHggPj0gMCk7Ci0gIFNCX0RDSEVDSyhpZHggPCAoMSA8PCBNQVhfQ09MT1JfQ0FDSEVfQklUUykpOwotICByZXR2YWwubW9kZSA9IGtDYWNoZUlkeDsKLSAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBpZHg7Ci0gIHJldHZhbC5sZW4gPSAxOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwodWludDMyX3QgYXJnYikgewotICBQaXhPckNvcHkgcmV0dmFsOwotICByZXR2YWwubW9kZSA9IGtMaXRlcmFsOwotICByZXR2YWwuYXJnYl9vcl9kaXN0YW5jZSA9IGFyZ2I7Ci0gIHJldHZhbC5sZW4gPSAxOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeE9yQ29weUlzTGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKLSAgcmV0dXJuIChwLT5tb2RlID09IGtMaXRlcmFsKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NhY2hlSWR4KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICByZXR1cm4gKHAtPm1vZGUgPT0ga0NhY2hlSWR4KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NvcHkoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIHJldHVybiAocC0+bW9kZSA9PSBrQ29weSk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMaXRlcmFsKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQpIHsKLSAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0xpdGVyYWwpOwotICByZXR1cm4gKHAtPmFyZ2Jfb3JfZGlzdGFuY2UgPj4gKGNvbXBvbmVudCAqIDgpKSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMZW5ndGgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIHJldHVybiBwLT5sZW47Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlBcmdiKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgewotICBTQl9EQ0hFQ0socC0+bW9kZSA9PSBrTGl0ZXJhbCk7Ci0gIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5Q2FjaGVJZHgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDYWNoZUlkeCk7Ci0gIFNCX0RDSEVDSyhwLT5hcmdiX29yX2Rpc3RhbmNlIDwgKDFVIDw8IE1BWF9DT0xPUl9DQUNIRV9CSVRTKSk7Ci0gIHJldHVybiBwLT5hcmdiX29yX2Rpc3RhbmNlOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGl4T3JDb3B5RGlzdGFuY2UoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7Ci0gIFNCX0RDSEVDSyhwLT5tb2RlID09IGtDb3B5KTsKLSAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQmFja3dhcmRSZWZzCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgUGl4T3JDb3B5KiByZWZzOwotICBpbnQgc2l6ZTsgICAgICAvLyBjdXJyZW50bHkgdXNlZAotICBpbnQgbWF4X3NpemU7ICAvLyBtYXhpbXVtIGNhcGFjaXR5Ci19IFZQOExCYWNrd2FyZFJlZnM7Ci0KLS8vIEluaXRpYWxpemUgdGhlIG9iamVjdC4gTXVzdCBiZSBjYWxsZWQgZmlyc3QuICdyZWZzJyBjYW4gYmUgTlVMTC4KLXZvaWQgVlA4TEluaXRCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7Ci0KLS8vIFJlbGVhc2UgbWVtb3J5IGFuZCByZS1pbml0aWFsaXplIHRoZSBvYmplY3QuICdyZWZzJyBjYW4gYmUgTlVMTC4KLXZvaWQgVlA4TENsZWFyQmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOwotCi0vLyBBbGxvY2F0ZSAnbWF4X3NpemUnIHJlZmVyZW5jZXMuIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCi1pbnQgVlA4TEJhY2t3YXJkUmVmc0FsbG9jKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsIGludCBtYXhfc2l6ZSk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGVudHJ5IHBvaW50cwotCi0vLyBFdmFsdWF0ZXMgYmVzdCBwb3NzaWJsZSBiYWNrd2FyZCByZWZlcmVuY2VzIGZvciBzcGVjaWZpZWQgcXVhbGl0eS4KLS8vIEZ1cnRoZXIgb3B0aW1pemUgZm9yIDJEIGxvY2FsaXR5IGlmIHVzZV8yZF9sb2NhbGl0eSBmbGFnIGlzIHNldC4KLWludCBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBjYWNoZV9iaXRzLCBpbnQgdXNlXzJkX2xvY2FsaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgYmVzdCk7Ci0KLS8vIFByb2R1Y2UgYW4gZXN0aW1hdGUgZm9yIGEgZ29vZCBjb2xvciBjYWNoZSBzaXplIGZvciB0aGUgaW1hZ2UuCi1pbnQgVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBiZXN0X2NhY2hlX2JpdHMpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2NvbmZpZy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2NvbmZpZy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y5NmIwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb25maWcuYworKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQ29kaW5nIHRvb2xzIGNvbmZpZ3VyYXRpb24KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi4vd2VicC9lbmNvZGUuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXZWJQQ29uZmlnCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbnQgV2ViUENvbmZpZ0luaXRJbnRlcm5hbChXZWJQQ29uZmlnKiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUHJlc2V0IHByZXNldCwgZmxvYXQgcXVhbGl0eSwgaW50IHZlcnNpb24pIHsKLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pKSB7Ci0gICAgcmV0dXJuIDA7ICAgLy8gY2FsbGVyL3N5c3RlbSB2ZXJzaW9uIG1pc21hdGNoIQotICB9Ci0gIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgY29uZmlnLT5xdWFsaXR5ID0gcXVhbGl0eTsKLSAgY29uZmlnLT50YXJnZXRfc2l6ZSA9IDA7Ci0gIGNvbmZpZy0+dGFyZ2V0X1BTTlIgPSAwLjsKLSAgY29uZmlnLT5tZXRob2QgPSA0OwotICBjb25maWctPnNuc19zdHJlbmd0aCA9IDUwOwotICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDYwOyAgIC8vIHJhdGhlciBoaWdoIGZpbHRlcmluZywgaGVscHMgdy8gZ3JhZGllbnRzLgotICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSAwOwotICBjb25maWctPmZpbHRlcl90eXBlID0gMTsgICAgICAgIC8vIGRlZmF1bHQ6IHN0cm9uZyAoc28gVS9WIGlzIGZpbHRlcmVkIHRvbykKLSAgY29uZmlnLT5wYXJ0aXRpb25zID0gMDsKLSAgY29uZmlnLT5zZWdtZW50cyA9IDQ7Ci0gIGNvbmZpZy0+cGFzcyA9IDE7Ci0gIGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID0gMDsKLSAgY29uZmlnLT5wcmVwcm9jZXNzaW5nID0gMDsKLSAgY29uZmlnLT5hdXRvZmlsdGVyID0gMDsKLSAgY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPSAwOwotICBjb25maWctPmFscGhhX2NvbXByZXNzaW9uID0gMTsKLSAgY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPSAxOwotICBjb25maWctPmFscGhhX3F1YWxpdHkgPSAxMDA7Ci0gIGNvbmZpZy0+bG9zc2xlc3MgPSAwOwotICBjb25maWctPmltYWdlX2hpbnQgPSBXRUJQX0hJTlRfREVGQVVMVDsKLSAgY29uZmlnLT5lbXVsYXRlX2pwZWdfc2l6ZSA9IDA7Ci0gIGNvbmZpZy0+dGhyZWFkX2xldmVsID0gMDsKLSAgY29uZmlnLT5sb3dfbWVtb3J5ID0gMDsKLQotICAvLyBUT0RPKHNrYWwpOiB0dW5lLgotICBzd2l0Y2ggKHByZXNldCkgewotICAgIGNhc2UgV0VCUF9QUkVTRVRfUElDVFVSRToKLSAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gODA7Ci0gICAgICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSA0OwotICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAzNTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV0VCUF9QUkVTRVRfUEhPVE86Ci0gICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOwotICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gMzsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX0RSQVdJTkc6Ci0gICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDI1OwotICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gNjsKLSAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMTA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdFQlBfUFJFU0VUX0lDT046Ci0gICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7Ci0gICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9URVhUOgotICAgICAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSAwOwotICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAwOyAgIC8vIGRpc2FibGUgZmlsdGVyaW5nIHRvIHJldGFpbiBzaGFycG5lc3MKLSAgICAgIGNvbmZpZy0+c2VnbWVudHMgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXRUJQX1BSRVNFVF9ERUZBVUxUOgotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gV2ViUFZhbGlkYXRlQ29uZmlnKGNvbmZpZyk7Ci19Ci0KLWludCBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKSB7Ci0gIGlmIChjb25maWcgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnF1YWxpdHkgPCAwIHx8IGNvbmZpZy0+cXVhbGl0eSA+IDEwMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+dGFyZ2V0X3NpemUgPCAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT50YXJnZXRfUFNOUiA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPm1ldGhvZCA8IDAgfHwgY29uZmlnLT5tZXRob2QgPiA2KQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5zZWdtZW50cyA8IDEgfHwgY29uZmlnLT5zZWdtZW50cyA+IDQpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnNuc19zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5zbnNfc3RyZW5ndGggPiAxMDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA8IDAgfHwgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPiAxMDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA+IDcpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmZpbHRlcl90eXBlIDwgMCB8fCBjb25maWctPmZpbHRlcl90eXBlID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+YXV0b2ZpbHRlciA8IDAgfHwgY29uZmlnLT5hdXRvZmlsdGVyID4gMSkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+cGFzcyA8IDEgfHwgY29uZmlnLT5wYXNzID4gMTApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnNob3dfY29tcHJlc3NlZCA8IDAgfHwgY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5wcmVwcm9jZXNzaW5nIDwgMCB8fCBjb25maWctPnByZXByb2Nlc3NpbmcgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5wYXJ0aXRpb25zIDwgMCB8fCBjb25maWctPnBhcnRpdGlvbnMgPiAzKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5wYXJ0aXRpb25fbGltaXQgPCAwIHx8IGNvbmZpZy0+cGFydGl0aW9uX2xpbWl0ID4gMTAwKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA8IDApCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPmFscGhhX3F1YWxpdHkgPCAwIHx8IGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA+IDEwMCkKLSAgICByZXR1cm4gMDsKLSAgaWYgKGNvbmZpZy0+bG9zc2xlc3MgPCAwIHx8IGNvbmZpZy0+bG9zc2xlc3MgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5pbWFnZV9oaW50ID49IFdFQlBfSElOVF9MQVNUKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5lbXVsYXRlX2pwZWdfc2l6ZSA8IDAgfHwgY29uZmlnLT5lbXVsYXRlX2pwZWdfc2l6ZSA+IDEpCi0gICAgcmV0dXJuIDA7Ci0gIGlmIChjb25maWctPnRocmVhZF9sZXZlbCA8IDAgfHwgY29uZmlnLT50aHJlYWRfbGV2ZWwgPiAxKQotICAgIHJldHVybiAwOwotICBpZiAoY29uZmlnLT5sb3dfbWVtb3J5IDwgMCB8fCBjb25maWctPmxvd19tZW1vcnkgPiAxKQotICAgIHJldHVybiAwOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2Nvc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3YzJjNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIENvc3QgdGFibGVzIGZvciBsZXZlbCBhbmQgbW9kZXMuCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmbmRlZiBXRUJQX0VOQ19DT1NUX0hfCi0jZGVmaW5lIFdFQlBfRU5DX0NPU1RfSF8KLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gYXBwcm94aW1hdGUgY29zdCBwZXIgbGV2ZWw6Ci1leHRlcm4gY29uc3QgdWludDE2X3QgVlA4TGV2ZWxGaXhlZENvc3RzW01BWF9MRVZFTCArIDFdOwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEVudHJvcHlDb3N0WzI1Nl07ICAgICAgICAvLyA4Yml0IGZpeGVkLXBvaW50IGxvZyhwKQotCi0vLyBDb3N0IG9mIGNvZGluZyBvbmUgZXZlbnQgd2l0aCBwcm9iYWJpbGl0eSAncHJvYmEnLgotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhCaXRDb3N0KGludCBiaXQsIHVpbnQ4X3QgcHJvYmEpIHsKLSAgcmV0dXJuICFiaXQgPyBWUDhFbnRyb3B5Q29zdFtwcm9iYV0gOiBWUDhFbnRyb3B5Q29zdFsyNTUgLSBwcm9iYV07Ci19Ci0KLS8vIExldmVsIGNvc3QgY2FsY3VsYXRpb25zCi1leHRlcm4gY29uc3QgdWludDE2X3QgVlA4TGV2ZWxDb2Rlc1tNQVhfVkFSSUFCTEVfTEVWRUxdWzJdOwotdm9pZCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKFZQOFByb2JhKiBjb25zdCBwcm9iYSk7Ci1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExldmVsQ29zdChjb25zdCB1aW50MTZfdCogY29uc3QgdGFibGUsIGludCBsZXZlbCkgewotICByZXR1cm4gVlA4TGV2ZWxGaXhlZENvc3RzW2xldmVsXQotICAgICAgICsgdGFibGVbKGxldmVsID4gTUFYX1ZBUklBQkxFX0xFVkVMKSA/IE1BWF9WQVJJQUJMRV9MRVZFTCA6IGxldmVsXTsKLX0KLQotLy8gTW9kZSBjb3N0cwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNVVls0XTsKLWV4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTE2WzRdOwotZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJNFtOVU1fQk1PREVTXVtOVU1fQk1PREVTXVtOVU1fQk1PREVTXTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9FTkNfQ09TVF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZpbHRlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZpbHRlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzc3MjdjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9maWx0ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gU2VsZWN0aW5nIGZpbHRlciBsZXZlbAotLy8KLS8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVuZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBOT1RFOiBjbGlwMSwgdGFibGVzIGFuZCBJbml0VGFibGVzIGFyZSByZXBlYXRlZCBlbnRyaWVzIG9mIGRzcC5jCi1zdGF0aWMgdWludDhfdCBhYnMwWzI1NSArIDI1NSArIDFdOyAgICAgLy8gYWJzKGkpCi1zdGF0aWMgdWludDhfdCBhYnMxWzI1NSArIDI1NSArIDFdOyAgICAgLy8gYWJzKGkpPj4xCi1zdGF0aWMgaW50OF90IHNjbGlwMVsxMDIwICsgMTAyMCArIDFdOyAgLy8gY2xpcHMgWy0xMDIwLCAxMDIwXSB0byBbLTEyOCwgMTI3XQotc3RhdGljIGludDhfdCBzY2xpcDJbMTEyICsgMTEyICsgMV07ICAgIC8vIGNsaXBzIFstMTEyLCAxMTJdIHRvIFstMTYsIDE1XQotc3RhdGljIHVpbnQ4X3QgY2xpcDFbMjU1ICsgNTEwICsgMV07ICAgIC8vIGNsaXBzIFstMjU1LDUxMF0gdG8gWzAsMjU1XQotCi1zdGF0aWMgaW50IHRhYmxlc19vayA9IDA7Ci0KLXN0YXRpYyB2b2lkIEluaXRUYWJsZXModm9pZCkgewotICBpZiAoIXRhYmxlc19vaykgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1OyArK2kpIHsKLSAgICAgIGFiczBbMjU1ICsgaV0gPSAoaSA8IDApID8gLWkgOiBpOwotICAgICAgYWJzMVsyNTUgKyBpXSA9IGFiczBbMjU1ICsgaV0gPj4gMTsKLSAgICB9Ci0gICAgZm9yIChpID0gLTEwMjA7IGkgPD0gMTAyMDsgKytpKSB7Ci0gICAgICBzY2xpcDFbMTAyMCArIGldID0gKGkgPCAtMTI4KSA/IC0xMjggOiAoaSA+IDEyNykgPyAxMjcgOiBpOwotICAgIH0KLSAgICBmb3IgKGkgPSAtMTEyOyBpIDw9IDExMjsgKytpKSB7Ci0gICAgICBzY2xpcDJbMTEyICsgaV0gPSAoaSA8IC0xNikgPyAtMTYgOiAoaSA+IDE1KSA/IDE1IDogaTsKLSAgICB9Ci0gICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTUgKyAyNTU7ICsraSkgewotICAgICAgY2xpcDFbMjU1ICsgaV0gPSAoaSA8IDApID8gMCA6IChpID4gMjU1KSA/IDI1NSA6IGk7Ci0gICAgfQotICAgIHRhYmxlc19vayA9IDE7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucwotCi0vLyA0IHBpeGVscyBpbiwgMiBwaXhlbHMgb3V0Ci1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXIyKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCkgKyBzY2xpcDFbMTAyMCArIHAxIC0gcTFdOwotICBjb25zdCBpbnQgYTEgPSBzY2xpcDJbMTEyICsgKChhICsgNCkgPj4gMyldOwotICBjb25zdCBpbnQgYTIgPSBzY2xpcDJbMTEyICsgKChhICsgMykgPj4gMyldOwotICBwWy1zdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTJdOwotICBwWyAgICAwXSA9IGNsaXAxWzI1NSArIHEwIC0gYTFdOwotfQotCi0vLyA0IHBpeGVscyBpbiwgNCBwaXhlbHMgb3V0Ci1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXI0KHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCk7Ci0gIGNvbnN0IGludCBhMSA9IHNjbGlwMlsxMTIgKyAoKGEgKyA0KSA+PiAzKV07Ci0gIGNvbnN0IGludCBhMiA9IHNjbGlwMlsxMTIgKyAoKGEgKyAzKSA+PiAzKV07Ci0gIGNvbnN0IGludCBhMyA9IChhMSArIDEpID4+IDE7Ci0gIHBbLTIqc3RlcF0gPSBjbGlwMVsyNTUgKyBwMSArIGEzXTsKLSAgcFstICBzdGVwXSA9IGNsaXAxWzI1NSArIHAwICsgYTJdOwotICBwWyAgICAgIDBdID0gY2xpcDFbMjU1ICsgcTAgLSBhMV07Ci0gIHBbICAgc3RlcF0gPSBjbGlwMVsyNTUgKyBxMSAtIGEzXTsKLX0KLQotLy8gaGlnaCBlZGdlLXZhcmlhbmNlCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IGhldihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgewotICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKLSAgcmV0dXJuIChhYnMwWzI1NSArIHAxIC0gcDBdID4gdGhyZXNoKSB8fCAoYWJzMFsyNTUgKyBxMSAtIHEwXSA+IHRocmVzaCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdGhyZXNoKSB7Ci0gIGNvbnN0IGludCBwMSA9IHBbLTIqc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOwotICByZXR1cm4gKDIgKiBhYnMwWzI1NSArIHAwIC0gcTBdICsgYWJzMVsyNTUgKyBwMSAtIHExXSkgPD0gdGhyZXNoOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcjIoY29uc3QgdWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgewotICBjb25zdCBpbnQgcDMgPSBwWy00KnN0ZXBdLCBwMiA9IHBbLTMqc3RlcF0sIHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXTsKLSAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMipzdGVwXSwgcTMgPSBwWzMqc3RlcF07Ci0gIGlmICgoMiAqIGFiczBbMjU1ICsgcDAgLSBxMF0gKyBhYnMxWzI1NSArIHAxIC0gcTFdKSA+IHQpCi0gICAgcmV0dXJuIDA7Ci0gIHJldHVybiBhYnMwWzI1NSArIHAzIC0gcDJdIDw9IGl0ICYmIGFiczBbMjU1ICsgcDIgLSBwMV0gPD0gaXQgJiYKLSAgICAgICAgIGFiczBbMjU1ICsgcDEgLSBwMF0gPD0gaXQgJiYgYWJzMFsyNTUgKyBxMyAtIHEyXSA8PSBpdCAmJgotICAgICAgICAgYWJzMFsyNTUgKyBxMiAtIHExXSA8PSBpdCAmJiBhYnMwWzI1NSArIHExIC0gcTBdIDw9IGl0OwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlIEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMikKLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7Ci0gICAgaWYgKG5lZWRzX2ZpbHRlcihwICsgaSwgc3RyaWRlLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpLCBzdHJpZGUpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gpKSB7Ci0gICAgICBkb19maWx0ZXIyKHAgKyBpICogc3RyaWRlLCAxKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0ICogc3RyaWRlOwotICAgIFNpbXBsZVZGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7Ci0gIGludCBrOwotICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7Ci0gICAgcCArPSA0OwotICAgIFNpbXBsZUhGaWx0ZXIxNihwLCBzdHJpZGUsIHRocmVzaCk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvbXBsZXggSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4zKQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjQodWludDhfdCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgewotICB3aGlsZSAoc2l6ZS0tID4gMCkgewotICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaCwgaXRocmVzaCkpIHsKLSAgICAgIGlmIChoZXYocCwgaHN0cmlkZSwgaGV2X3RocmVzaCkpIHsKLSAgICAgICAgZG9fZmlsdGVyMihwLCBoc3RyaWRlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvX2ZpbHRlcjQocCwgaHN0cmlkZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHAgKz0gdnN0cmlkZTsKLSAgfQotfQotCi0vLyBvbiB0aHJlZSBpbm5lciBlZGdlcwotc3RhdGljIHZvaWQgVkZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQgKiBzdHJpZGU7Ci0gICAgRmlsdGVyTG9vcDI0KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBwLCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKLSAgaW50IGs7Ci0gIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKLSAgICBwICs9IDQ7Ci0gICAgRmlsdGVyTG9vcDI0KHAsIDEsIHN0cmlkZSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIEZpbHRlckxvb3AyNCh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICBGaWx0ZXJMb29wMjQodiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7Ci0gIEZpbHRlckxvb3AyNCh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOwotICBGaWx0ZXJMb29wMjQodiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCAoKlZQOEVuY1ZGaWx0ZXIxNmkpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpID0gVkZpbHRlcjE2aTsKLXZvaWQgKCpWUDhFbmNIRmlsdGVyMTZpKSh1aW50OF90KiwgaW50LCBpbnQsIGludCwgaW50KSA9IEhGaWx0ZXIxNmk7Ci12b2lkICgqVlA4RW5jVkZpbHRlcjhpKSh1aW50OF90KiwgdWludDhfdCosIGludCwgaW50LCBpbnQsIGludCkgPSBWRmlsdGVyOGk7Ci12b2lkICgqVlA4RW5jSEZpbHRlcjhpKSh1aW50OF90KiwgdWludDhfdCosIGludCwgaW50LCBpbnQsIGludCkgPSBIRmlsdGVyOGk7Ci0KLXZvaWQgKCpWUDhFbmNTaW1wbGVWRmlsdGVyMTZpKSh1aW50OF90KiwgaW50LCBpbnQpID0gU2ltcGxlVkZpbHRlcjE2aTsKLXZvaWQgKCpWUDhFbmNTaW1wbGVIRmlsdGVyMTZpKSh1aW50OF90KiwgaW50LCBpbnQpID0gU2ltcGxlSEZpbHRlcjE2aTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcmFncmFwaCAxNS40OiBjb21wdXRlIHRoZSBpbm5lci1lZGdlIGZpbHRlcmluZyBzdHJlbmd0aAotCi1zdGF0aWMgaW50IEdldElMZXZlbChpbnQgc2hhcnBuZXNzLCBpbnQgbGV2ZWwpIHsKLSAgaWYgKHNoYXJwbmVzcyA+IDApIHsKLSAgICBpZiAoc2hhcnBuZXNzID4gNCkgewotICAgICAgbGV2ZWwgPj49IDI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxldmVsID4+PSAxOwotICAgIH0KLSAgICBpZiAobGV2ZWwgPiA5IC0gc2hhcnBuZXNzKSB7Ci0gICAgICBsZXZlbCA9IDkgLSBzaGFycG5lc3M7Ci0gICAgfQotICB9Ci0gIGlmIChsZXZlbCA8IDEpIGxldmVsID0gMTsKLSAgcmV0dXJuIGxldmVsOwotfQotCi1zdGF0aWMgdm9pZCBEb0ZpbHRlcihjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBsZXZlbCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgaW50IGlsZXZlbCA9IEdldElMZXZlbChlbmMtPmNvbmZpZ18tPmZpbHRlcl9zaGFycG5lc3MsIGxldmVsKTsKLSAgY29uc3QgaW50IGxpbWl0ID0gMiAqIGxldmVsICsgaWxldmVsOwotCi0gIHVpbnQ4X3QqIGNvbnN0IHlfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGOwotICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBVX09GRjsKLSAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBpdC0+eXV2X291dDJfICsgVl9PRkY7Ci0KLSAgLy8gY29weSBjdXJyZW50IGJsb2NrIHRvIHl1dl9vdXQyXwotICBTYk1lbW9yeUNvcHkoeV9kc3QsIGl0LT55dXZfb3V0XywgWVVWX1NJWkUgKiBzaXplb2YodWludDhfdCkpOwotCi0gIGlmIChlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPT0gMSkgeyAgIC8vIHNpbXBsZQotICAgIFZQOEVuY1NpbXBsZUhGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOwotICAgIFZQOEVuY1NpbXBsZVZGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQpOwotICB9IGVsc2UgeyAgICAvLyBjb21wbGV4Ci0gICAgY29uc3QgaW50IGhldl90aHJlc2ggPSAobGV2ZWwgPj0gNDApID8gMiA6IChsZXZlbCA+PSAxNSkgPyAxIDogMDsKLSAgICBWUDhFbmNIRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICAgIFZQOEVuY0hGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7Ci0gICAgVlA4RW5jVkZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKLSAgICBWUDhFbmNWRmlsdGVyOGkodV9kc3QsIHZfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTU0lNIG1ldHJpYwotCi1lbnVtIHsgS0VSTkVMID0gMyB9Owotc3RhdGljIGNvbnN0IGRvdWJsZSBrTWluVmFsdWUgPSAxLmUtMTA7ICAvLyBtaW5pbWFsIHRocmVzaG9sZAotCi12b2lkIFZQOFNTSU1BZGRTdGF0cyhjb25zdCBEaXN0b1N0YXRzKiBjb25zdCBzcmMsIERpc3RvU3RhdHMqIGNvbnN0IGRzdCkgewotICBkc3QtPncgICArPSBzcmMtPnc7Ci0gIGRzdC0+eG0gICs9IHNyYy0+eG07Ci0gIGRzdC0+eW0gICs9IHNyYy0+eW07Ci0gIGRzdC0+eHhtICs9IHNyYy0+eHhtOwotICBkc3QtPnh5bSArPSBzcmMtPnh5bTsKLSAgZHN0LT55eW0gKz0gc3JjLT55eW07Ci19Ci0KLXN0YXRpYyB2b2lkIFZQOFNTSU1BY2N1bXVsYXRlKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG8sIGludCB5bywgaW50IFcsIGludCBILAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKLSAgY29uc3QgaW50IHltaW4gPSAoeW8gLSBLRVJORUwgPCAwKSA/IDAgOiB5byAtIEtFUk5FTDsKLSAgY29uc3QgaW50IHltYXggPSAoeW8gKyBLRVJORUwgPiBIIC0gMSkgPyBIIC0gMSA6IHlvICsgS0VSTkVMOwotICBjb25zdCBpbnQgeG1pbiA9ICh4byAtIEtFUk5FTCA8IDApID8gMCA6IHhvIC0gS0VSTkVMOwotICBjb25zdCBpbnQgeG1heCA9ICh4byArIEtFUk5FTCA+IFcgLSAxKSA/IFcgLSAxIDogeG8gKyBLRVJORUw7Ci0gIGludCB4LCB5OwotICBzcmMxICs9IHltaW4gKiBzdHJpZGUxOwotICBzcmMyICs9IHltaW4gKiBzdHJpZGUyOwotICBmb3IgKHkgPSB5bWluOyB5IDw9IHltYXg7ICsreSwgc3JjMSArPSBzdHJpZGUxLCBzcmMyICs9IHN0cmlkZTIpIHsKLSAgICBmb3IgKHggPSB4bWluOyB4IDw9IHhtYXg7ICsreCkgewotICAgICAgY29uc3QgaW50IHMxID0gc3JjMVt4XTsKLSAgICAgIGNvbnN0IGludCBzMiA9IHNyYzJbeF07Ci0gICAgICBzdGF0cy0+dyAgICs9IDE7Ci0gICAgICBzdGF0cy0+eG0gICs9IHMxOwotICAgICAgc3RhdHMtPnltICArPSBzMjsKLSAgICAgIHN0YXRzLT54eG0gKz0gczEgKiBzMTsKLSAgICAgIHN0YXRzLT54eW0gKz0gczEgKiBzMjsKLSAgICAgIHN0YXRzLT55eW0gKz0gczIgKiBzMjsKLSAgICB9Ci0gIH0KLX0KLQotZG91YmxlIFZQOFNTSU1HZXQoY29uc3QgRGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKLSAgY29uc3QgZG91YmxlIHhteG0gPSBzdGF0cy0+eG0gKiBzdGF0cy0+eG07Ci0gIGNvbnN0IGRvdWJsZSB5bXltID0gc3RhdHMtPnltICogc3RhdHMtPnltOwotICBjb25zdCBkb3VibGUgeG15bSA9IHN0YXRzLT54bSAqIHN0YXRzLT55bTsKLSAgY29uc3QgZG91YmxlIHcyID0gc3RhdHMtPncgKiBzdGF0cy0+dzsKLSAgZG91YmxlIHN4eCA9IHN0YXRzLT54eG0gKiBzdGF0cy0+dyAtIHhteG07Ci0gIGRvdWJsZSBzeXkgPSBzdGF0cy0+eXltICogc3RhdHMtPncgLSB5bXltOwotICBkb3VibGUgc3h5ID0gc3RhdHMtPnh5bSAqIHN0YXRzLT53IC0geG15bTsKLSAgZG91YmxlIEMxLCBDMjsKLSAgZG91YmxlIGZudW07Ci0gIGRvdWJsZSBmZGVuOwotICAvLyBzbWFsbCBlcnJvcnMgYXJlIHBvc3NpYmxlLCBkdWUgdG8gcm91bmRpbmcuIENsYW1wIHRvIHplcm8uCi0gIGlmIChzeHggPCAwLikgc3h4ID0gMC47Ci0gIGlmIChzeXkgPCAwLikgc3l5ID0gMC47Ci0gIEMxID0gNi41MDI1ICogdzI7Ci0gIEMyID0gNTguNTIyNSAqIHcyOwotICBmbnVtID0gKDIgKiB4bXltICsgQzEpICogKDIgKiBzeHkgKyBDMik7Ci0gIGZkZW4gPSAoeG14bSArIHlteW0gKyBDMSkgKiAoc3h4ICsgc3l5ICsgQzIpOwotICByZXR1cm4gKGZkZW4gIT0gMC4pID8gZm51bSAvIGZkZW4gOiBrTWluVmFsdWU7Ci19Ci0KLWRvdWJsZSBWUDhTU0lNR2V0U3F1YXJlZEVycm9yKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHMpIHsKLSAgaWYgKHMtPncgPiAwLikgewotICAgIGNvbnN0IGRvdWJsZSBpdzIgPSAxLiAvIChzLT53ICogcy0+dyk7Ci0gICAgY29uc3QgZG91YmxlIHN4eCA9IHMtPnh4bSAqIHMtPncgLSBzLT54bSAqIHMtPnhtOwotICAgIGNvbnN0IGRvdWJsZSBzeXkgPSBzLT55eW0gKiBzLT53IC0gcy0+eW0gKiBzLT55bTsKLSAgICBjb25zdCBkb3VibGUgc3h5ID0gcy0+eHltICogcy0+dyAtIHMtPnhtICogcy0+eW07Ci0gICAgY29uc3QgZG91YmxlIFNTRSA9IGl3MiAqIChzeHggKyBzeXkgLSAyLiAqIHN4eSk7Ci0gICAgaWYgKFNTRSA+IGtNaW5WYWx1ZSkgcmV0dXJuIFNTRTsKLSAgfQotICByZXR1cm4ga01pblZhbHVlOwotfQotCi12b2lkIFZQOFNTSU1BY2N1bXVsYXRlUGxhbmUoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFcsIGludCBILCBEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgewotICBpbnQgeCwgeTsKLSAgZm9yICh5ID0gMDsgeSA8IEg7ICsreSkgewotICAgIGZvciAoeCA9IDA7IHggPCBXOyArK3gpIHsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHNyYzEsIHN0cmlkZTEsIHNyYzIsIHN0cmlkZTIsIHgsIHksIFcsIEgsIHN0YXRzKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGRvdWJsZSBHZXRNQlNTSU0oY29uc3QgdWludDhfdCogeXV2MSwgY29uc3QgdWludDhfdCogeXV2MikgewotICBpbnQgeCwgeTsKLSAgRGlzdG9TdGF0cyBzID0geyAuMCwgLjAsIC4wLCAuMCwgLjAsIC4wIH07Ci0KLSAgLy8gY29tcHV0ZSBTU0lNIGluIGEgMTAgeCAxMCB3aW5kb3cKLSAgZm9yICh4ID0gMzsgeCA8IDEzOyB4KyspIHsKLSAgICBmb3IgKHkgPSAzOyB5IDwgMTM7IHkrKykgewotICAgICAgVlA4U1NJTUFjY3VtdWxhdGUoeXV2MSArIFlfT0ZGLCBCUFMsIHl1djIgKyBZX09GRiwgQlBTLCB4LCB5LCAxNiwgMTYsICZzKTsKLSAgICB9Ci0gIH0KLSAgZm9yICh4ID0gMTsgeCA8IDc7IHgrKykgewotICAgIGZvciAoeSA9IDE7IHkgPCA3OyB5KyspIHsKLSAgICAgIFZQOFNTSU1BY2N1bXVsYXRlKHl1djEgKyBVX09GRiwgQlBTLCB5dXYyICsgVV9PRkYsIEJQUywgeCwgeSwgOCwgOCwgJnMpOwotICAgICAgVlA4U1NJTUFjY3VtdWxhdGUoeXV2MSArIFZfT0ZGLCBCUFMsIHl1djIgKyBWX09GRiwgQlBTLCB4LCB5LCA4LCA4LCAmcyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBWUDhTU0lNR2V0KCZzKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEV4cG9zZWQgQVBJczogRW5jb2RlciBzaG91bGQgY2FsbCB0aGUgZm9sbG93aW5nIDMgZnVuY3Rpb25zIHRvIGFkanVzdAotLy8gbG9vcCBmaWx0ZXIgc3RyZW5ndGgKLQotdm9pZCBWUDhJbml0RmlsdGVyKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBpbnQgcywgaTsKLSAgaWYgKCFpdC0+bGZfc3RhdHNfKSByZXR1cm47Ci0KLSAgSW5pdFRhYmxlcygpOwotICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7Ci0gICAgICAoKml0LT5sZl9zdGF0c18pW3NdW2ldID0gMDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhTdG9yZUZpbHRlclN0YXRzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBpbnQgZDsKLSAgY29uc3QgaW50IHMgPSBpdC0+bWJfLT5zZWdtZW50XzsKLSAgY29uc3QgaW50IGxldmVsMCA9IGl0LT5lbmNfLT5kcW1fW3NdLmZzdHJlbmd0aF87ICAvLyBUT0RPOiByZWZfbGZfZGVsdGFbXQotCi0gIC8vIGV4cGxvcmUgKy8tcXVhbnQgcmFuZ2Ugb2YgdmFsdWVzIGFyb3VuZCBsZXZlbDAKLSAgY29uc3QgaW50IGRlbHRhX21pbiA9IC1pdC0+ZW5jXy0+ZHFtX1tzXS5xdWFudF87Ci0gIGNvbnN0IGludCBkZWx0YV9tYXggPSBpdC0+ZW5jXy0+ZHFtX1tzXS5xdWFudF87Ci0gIGNvbnN0IGludCBzdGVwX3NpemUgPSAoZGVsdGFfbWF4IC0gZGVsdGFfbWluID49IDQpID8gNCA6IDE7Ci0KLSAgaWYgKCFpdC0+bGZfc3RhdHNfKSByZXR1cm47Ci0KLSAgLy8gTk9URTogQ3VycmVudGx5IHdlIGFyZSBhcHBseWluZyBmaWx0ZXIgb25seSBhY3Jvc3MgdGhlIHN1YmxvY2sgZWRnZXMKLSAgLy8gVGhlcmUgYXJlIHR3byByZWFzb25zIGZvciB0aGF0LgotICAvLyAxLiBBcHBseWluZyBmaWx0ZXIgb24gbWFjcm8gYmxvY2sgZWRnZXMgd2lsbCBjaGFuZ2UgdGhlIHBpeGVscyBpbgotICAvLyB0aGUgbGVmdCBhbmQgdG9wIG1hY3JvIGJsb2Nrcy4gVGhhdCB3aWxsIGJlIGhhcmQgdG8gcmVzdG9yZQotICAvLyAyLiBNYWNybyBCbG9ja3Mgb24gdGhlIGJvdHRvbSBhbmQgcmlnaHQgYXJlIG5vdCB5ZXQgY29tcHJlc3NlZC4gU28gd2UKLSAgLy8gY2Fubm90IGFwcGx5IGZpbHRlciBvbiB0aGUgcmlnaHQgYW5kIGJvdHRvbSBtYWNybyBibG9jayBlZGdlcy4KLSAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEgJiYgaXQtPm1iXy0+c2tpcF8pIHJldHVybjsKLQotICAvLyBBbHdheXMgdHJ5IGZpbHRlciBsZXZlbCAgemVybwotICAoKml0LT5sZl9zdGF0c18pW3NdWzBdICs9IEdldE1CU1NJTShpdC0+eXV2X2luXywgaXQtPnl1dl9vdXRfKTsKLQotICBmb3IgKGQgPSBkZWx0YV9taW47IGQgPD0gZGVsdGFfbWF4OyBkICs9IHN0ZXBfc2l6ZSkgewotICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsMCArIGQ7Ci0gICAgaWYgKGxldmVsIDw9IDAgfHwgbGV2ZWwgPj0gTUFYX0xGX0xFVkVMUykgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIERvRmlsdGVyKGl0LCBsZXZlbCk7Ci0gICAgKCppdC0+bGZfc3RhdHNfKVtzXVtsZXZlbF0gKz0gR2V0TUJTU0lNKGl0LT55dXZfaW5fLCBpdC0+eXV2X291dDJfKTsKLSAgfQotfQotCi12b2lkIFZQOEFkanVzdEZpbHRlclN0cmVuZ3RoKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBpbnQgczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0KLSAgaWYgKCFpdC0+bGZfc3RhdHNfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7IHMrKykgewotICAgIGludCBpLCBiZXN0X2xldmVsID0gMDsKLSAgICAvLyBJbXByb3ZlbWVudCBvdmVyIGZpbHRlciBsZXZlbCAwIHNob3VsZCBiZSBhdCBsZWFzdCAxZS01IChyZWxhdGl2ZWx5KQotICAgIGRvdWJsZSBiZXN0X3YgPSAxLjAwMDAxICogKCppdC0+bGZfc3RhdHNfKVtzXVswXTsKLSAgICBmb3IgKGkgPSAxOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7Ci0gICAgICBjb25zdCBkb3VibGUgdiA9ICgqaXQtPmxmX3N0YXRzXylbc11baV07Ci0gICAgICBpZiAodiA+IGJlc3RfdikgewotICAgICAgICBiZXN0X3YgPSB2OwotICAgICAgICBiZXN0X2xldmVsID0gaTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZW5jLT5kcW1fW3NdLmZzdHJlbmd0aF8gPSBiZXN0X2xldmVsOwotICB9Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2ZyYW1lLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvZnJhbWUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NiZDE0Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvZnJhbWUuYworKysgL2Rldi9udWxsCkBAIC0xLDk4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gICBmcmFtZSBjb2RpbmcgYW5kIGFuYWx5c2lzCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaC4iCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vY29zdC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBTRUdNRU5UX1ZJU1UgMAotI2RlZmluZSBERUJVR19TRUFSQ0ggMCAgICAvLyB1c2VmdWwgdG8gdHJhY2sgc2VhcmNoIGNvbnZlcmdlbmNlCi0KLS8vIE9uLXRoZS1mbHkgaW5mbyBhYm91dCB0aGUgY3VycmVudCBzZXQgb2YgcmVzaWR1YWxzLiBIYW5keSB0byBhdm9pZAotLy8gcGFzc2luZyB6aWxsaW9ucyBvZiBwYXJhbXMuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBmaXJzdDsKLSAgaW50IGxhc3Q7Ci0gIGNvbnN0IGludDE2X3QqIGNvZWZmczsKLQotICBpbnQgY29lZmZfdHlwZTsKLSAgUHJvYmFBcnJheSogcHJvYjsKLSAgU3RhdHNBcnJheSogc3RhdHM7Ci0gIENvc3RBcnJheSogIGNvc3Q7Ci19IFZQOFJlc2lkdWFsOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGFibGVzIGZvciBsZXZlbCBjb2RpbmcKLQotY29uc3QgdWludDhfdCBWUDhFbmNCYW5kc1sxNiArIDFdID0gewotICAwLCAxLCAyLCAzLCA2LCA0LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LAotICAwICAvLyBzZW50aW5lbAotfTsKLQotY29uc3QgdWludDhfdCBWUDhDYXQzW10gPSB7IDE3MywgMTQ4LCAxNDAgfTsKLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0NFtdID0geyAxNzYsIDE1NSwgMTQwLCAxMzUgfTsKLWNvbnN0IHVpbnQ4X3QgVlA4Q2F0NVtdID0geyAxODAsIDE1NywgMTQxLCAxMzQsIDEzMCB9OwotY29uc3QgdWludDhfdCBWUDhDYXQ2W10gPQotICAgIHsgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjkgfTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlc2V0IHRoZSBzdGF0aXN0aWNzIGFib3V0OiBudW1iZXIgb2Ygc2tpcHMsIHRva2VuIHByb2JhLCBsZXZlbCBjb3N0LC4uLgotCi1zdGF0aWMgdm9pZCBSZXNldFN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87Ci0gIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMocHJvYmEpOwotICBwcm9iYS0+bmJfc2tpcF8gPSAwOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2tpcCBkZWNpc2lvbiBwcm9iYWJpbGl0eQotCi0jZGVmaW5lIFNLSVBfUFJPQkFfVEhSRVNIT0xEIDI1MCAgLy8gdmFsdWUgYmVsb3cgd2hpY2ggdXNpbmcgc2tpcF9wcm9iYSBpcyBPSy4KLQotc3RhdGljIGludCBDYWxjU2tpcFByb2JhKHVpbnQ2NF90IG5iLCB1aW50NjRfdCB0b3RhbCkgewotICByZXR1cm4gKGludCkodG90YWwgPyAodG90YWwgLSBuYikgKiAyNTUgLyB0b3RhbCA6IDI1NSk7Ci19Ci0KLS8vIFJldHVybnMgdGhlIGJpdC1jb3N0IGZvciBjb2RpbmcgdGhlIHNraXAgcHJvYmFiaWxpdHkuCi1zdGF0aWMgaW50IEZpbmFsaXplU2tpcFByb2JhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87Ci0gIGNvbnN0IGludCBuYl9tYnMgPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKLSAgY29uc3QgaW50IG5iX2V2ZW50cyA9IHByb2JhLT5uYl9za2lwXzsKLSAgaW50IHNpemU7Ci0gIHByb2JhLT5za2lwX3Byb2JhXyA9IENhbGNTa2lwUHJvYmEobmJfZXZlbnRzLCBuYl9tYnMpOwotICBwcm9iYS0+dXNlX3NraXBfcHJvYmFfID0gKHByb2JhLT5za2lwX3Byb2JhXyA8IFNLSVBfUFJPQkFfVEhSRVNIT0xEKTsKLSAgc2l6ZSA9IDI1NjsgICAvLyAndXNlX3NraXBfcHJvYmEnIGJpdAotICBpZiAocHJvYmEtPnVzZV9za2lwX3Byb2JhXykgewotICAgIHNpemUgKz0gIG5iX2V2ZW50cyAqIFZQOEJpdENvc3QoMSwgcHJvYmEtPnNraXBfcHJvYmFfKQotICAgICAgICAgKyAobmJfbWJzIC0gbmJfZXZlbnRzKSAqIFZQOEJpdENvc3QoMCwgcHJvYmEtPnNraXBfcHJvYmFfKTsKLSAgICBzaXplICs9IDggKiAyNTY7ICAgLy8gY29zdCBvZiBzaWduYWxpbmcgdGhlIHNraXBfcHJvYmFfIGl0c2VsZi4KLSAgfQotICByZXR1cm4gc2l6ZTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlY29yZGluZyBvZiB0b2tlbiBwcm9iYWJpbGl0aWVzLgotCi1zdGF0aWMgdm9pZCBSZXNldFRva2VuU3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOFByb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKLSAgU2JNZW1vcnlTZXQocHJvYmEtPnN0YXRzXywgMCwgc2l6ZW9mKHByb2JhLT5zdGF0c18pKTsKLX0KLQotLy8gUmVjb3JkIHByb2JhIGNvbnRleHQgdXNlZAotc3RhdGljIGludCBSZWNvcmQoaW50IGJpdCwgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKLSAgcHJvYmFfdCBwID0gKnN0YXRzOwotICBpZiAocCA+PSAweGZmZmYwMDAwdSkgeyAgICAgICAgICAgICAgIC8vIGFuIG92ZXJmbG93IGlzIGluYm91bmQuCi0gICAgcCA9ICgocCArIDF1KSA+PiAxKSAmIDB4N2ZmZjdmZmZ1OyAgLy8gLT4gZGl2aWRlIHRoZSBzdGF0cyBieSAyLgotICB9Ci0gIC8vIHJlY29yZCBiaXQgY291bnQgKGxvd2VyIDE2IGJpdHMpIGFuZCBpbmNyZW1lbnQgdG90YWwgY291bnQgKHVwcGVyIDE2IGJpdHMpLgotICBwICs9IDB4MDAwMTAwMDB1ICsgYml0OwotICAqc3RhdHMgPSBwOwotICByZXR1cm4gYml0OwotfQotCi0vLyBXZSBrZWVwIHRoZSB0YWJsZSBmcmVlIHZhcmlhbnQgYXJvdW5kIGZvciByZWZlcmVuY2UsIGluIGNhc2UuCi0jZGVmaW5lIFVTRV9MRVZFTF9DT0RFX1RBQkxFCi0KLS8vIFNpbXVsYXRlIGJsb2NrIGNvZGluZywgYnV0IG9ubHkgcmVjb3JkIHN0YXRpc3RpY3MuCi0vLyBOb3RlOiBubyBuZWVkIHRvIHJlY29yZCB0aGUgZml4ZWQgcHJvYmFzLgotc3RhdGljIGludCBSZWNvcmRDb2VmZnMoaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICBpbnQgbiA9IHJlcy0+Zmlyc3Q7Ci0gIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCi0gIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07Ci0gIGlmIChyZXMtPmxhc3QgIDwgMCkgewotICAgIFJlY29yZCgwLCBzICsgMCk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgd2hpbGUgKG4gPD0gcmVzLT5sYXN0KSB7Ci0gICAgaW50IHY7Ci0gICAgUmVjb3JkKDEsIHMgKyAwKTsgIC8vIG9yZGVyIG9mIHJlY29yZCBkb2Vzbid0IG1hdHRlcgotICAgIHdoaWxlICgodiA9IHJlcy0+Y29lZmZzW24rK10pID09IDApIHsKLSAgICAgIFJlY29yZCgwLCBzICsgMSk7Ci0gICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07Ci0gICAgfQotICAgIFJlY29yZCgxLCBzICsgMSk7Ci0gICAgaWYgKCFSZWNvcmQoMnUgPCAodW5zaWduZWQgaW50KSh2ICsgMSksIHMgKyAyKSkgeyAgLy8gdiA9IC0xIG9yIDEKLSAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsxXTsKLSAgICB9IGVsc2UgewotICAgICAgdiA9IGFicyh2KTsKLSNpZiAhZGVmaW5lZChVU0VfTEVWRUxfQ09ERV9UQUJMRSkKLSAgICAgIGlmICghUmVjb3JkKHYgPiA0LCBzICsgMykpIHsKLSAgICAgICAgaWYgKFJlY29yZCh2ICE9IDIsIHMgKyA0KSkKLSAgICAgICAgICBSZWNvcmQodiA9PSA0LCBzICsgNSk7Ci0gICAgICB9IGVsc2UgaWYgKCFSZWNvcmQodiA+IDEwLCBzICsgNikpIHsKLSAgICAgICAgUmVjb3JkKHYgPiA2LCBzICsgNyk7Ci0gICAgICB9IGVsc2UgaWYgKCFSZWNvcmQoKHYgPj0gMyArICg4IDw8IDIpKSwgcyArIDgpKSB7Ci0gICAgICAgIFJlY29yZCgodiA+PSAzICsgKDggPDwgMSkpLCBzICsgOSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBSZWNvcmQoKHYgPj0gMyArICg4IDw8IDMpKSwgcyArIDEwKTsKLSAgICAgIH0KLSNlbHNlCi0gICAgICBpZiAodiA+IE1BWF9WQVJJQUJMRV9MRVZFTCkKLSAgICAgICAgdiA9IE1BWF9WQVJJQUJMRV9MRVZFTDsKLQotICAgICAgewotICAgICAgICBjb25zdCBpbnQgYml0cyA9IFZQOExldmVsQ29kZXNbdiAtIDFdWzFdOwotICAgICAgICBpbnQgcGF0dGVybiA9IFZQOExldmVsQ29kZXNbdiAtIDFdWzBdOwotICAgICAgICBpbnQgaTsKLSAgICAgICAgZm9yIChpID0gMDsgKHBhdHRlcm4gPj49IDEpICE9IDA7ICsraSkgewotICAgICAgICAgIGNvbnN0IGludCBtYXNrID0gMiA8PCBpOwotICAgICAgICAgIGlmIChwYXR0ZXJuICYgMSkgUmVjb3JkKCEhKGJpdHMgJiBtYXNrKSwgcyArIDMgKyBpKTsKLSAgICAgICAgfQotICAgICAgfQotI2VuZGlmCi0gICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMl07Ci0gICAgfQotICB9Ci0gIGlmIChuIDwgMTYpIFJlY29yZCgwLCBzICsgMCk7Ci0gIHJldHVybiAxOwotfQotCi0vLyBDb2xsZWN0IHN0YXRpc3RpY3MgYW5kIGRlZHVjZSBwcm9iYWJpbGl0aWVzIGZvciBuZXh0IGNvZGluZyBwYXNzLgotLy8gUmV0dXJuIHRoZSB0b3RhbCBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBwcm9iYWJpbGl0eSB1cGRhdGVzLgotc3RhdGljIGludCBDYWxjVG9rZW5Qcm9iYShpbnQgbmIsIGludCB0b3RhbCkgewotICBTQl9EQ0hFQ0sobmIgPD0gdG90YWwpOwotICByZXR1cm4gbmIgPyAoMjU1IC0gbmIgKiAyNTUgLyB0b3RhbCkgOiAyNTU7Ci19Ci0KLS8vIENvc3Qgb2YgY29kaW5nICduYicgMSdzIGFuZCAndG90YWwtbmInIDAncyB1c2luZyAncHJvYmEnIHByb2JhYmlsaXR5Lgotc3RhdGljIGludCBCcmFuY2hDb3N0KGludCBuYiwgaW50IHRvdGFsLCBpbnQgcHJvYmEpIHsKLSAgcmV0dXJuIG5iICogVlA4Qml0Q29zdCgxLCBwcm9iYSkgKyAodG90YWwgLSBuYikgKiBWUDhCaXRDb3N0KDAsIHByb2JhKTsKLX0KLQotc3RhdGljIGludCBGaW5hbGl6ZVRva2VuUHJvYmFzKFZQOFByb2JhKiBjb25zdCBwcm9iYSkgewotICBpbnQgaGFzX2NoYW5nZWQgPSAwOwotICBpbnQgc2l6ZSA9IDA7Ci0gIGludCB0LCBiLCBjLCBwOwotICBmb3IgKHQgPSAwOyB0IDwgTlVNX1RZUEVTOyArK3QpIHsKLSAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKLSAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKLSAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgewotICAgICAgICAgIGNvbnN0IHByb2JhX3Qgc3RhdHMgPSBwcm9iYS0+c3RhdHNfW3RdW2JdW2NdW3BdOwotICAgICAgICAgIGNvbnN0IGludCBuYiA9IChzdGF0cyA+PiAwKSAmIDB4ZmZmZjsKLSAgICAgICAgICBjb25zdCBpbnQgdG90YWwgPSAoc3RhdHMgPj4gMTYpICYgMHhmZmZmOwotICAgICAgICAgIGNvbnN0IGludCB1cGRhdGVfcHJvYmEgPSBWUDhDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXTsKLSAgICAgICAgICBjb25zdCBpbnQgb2xkX3AgPSBWUDhDb2VmZnNQcm9iYTBbdF1bYl1bY11bcF07Ci0gICAgICAgICAgY29uc3QgaW50IG5ld19wID0gQ2FsY1Rva2VuUHJvYmEobmIsIHRvdGFsKTsKLSAgICAgICAgICBjb25zdCBpbnQgb2xkX2Nvc3QgPSBCcmFuY2hDb3N0KG5iLCB0b3RhbCwgb2xkX3ApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Qml0Q29zdCgwLCB1cGRhdGVfcHJvYmEpOwotICAgICAgICAgIGNvbnN0IGludCBuZXdfY29zdCA9IEJyYW5jaENvc3QobmIsIHRvdGFsLCBuZXdfcCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWUDhCaXRDb3N0KDEsIHVwZGF0ZV9wcm9iYSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyA4ICogMjU2OwotICAgICAgICAgIGNvbnN0IGludCB1c2VfbmV3X3AgPSAob2xkX2Nvc3QgPiBuZXdfY29zdCk7Ci0gICAgICAgICAgc2l6ZSArPSBWUDhCaXRDb3N0KHVzZV9uZXdfcCwgdXBkYXRlX3Byb2JhKTsKLSAgICAgICAgICBpZiAodXNlX25ld19wKSB7ICAvLyBvbmx5IHVzZSBwcm9iYSB0aGF0IHNlZW0gbWVhbmluZ2Z1bCBlbm91Z2guCi0gICAgICAgICAgICBwcm9iYS0+Y29lZmZzX1t0XVtiXVtjXVtwXSA9IG5ld19wOwotICAgICAgICAgICAgaGFzX2NoYW5nZWQgfD0gKG5ld19wICE9IG9sZF9wKTsKLSAgICAgICAgICAgIHNpemUgKz0gOCAqIDI1NjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBvbGRfcDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcHJvYmEtPmRpcnR5XyA9IGhhc19jaGFuZ2VkOwotICByZXR1cm4gc2l6ZTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZpbmFsaXplIFNlZ21lbnQgcHJvYmFiaWxpdHkgYmFzZWQgb24gdGhlIGNvZGluZyB0cmVlCi0KLXN0YXRpYyBpbnQgR2V0UHJvYmEoaW50IGEsIGludCBiKSB7Ci0gIGNvbnN0IGludCB0b3RhbCA9IGEgKyBiOwotICByZXR1cm4gKHRvdGFsID09IDApID8gMjU1ICAgICAvLyB0aGF0J3MgdGhlIGRlZmF1bHQgcHJvYmFiaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgICAgOiAoMjU1ICogYSArIHRvdGFsIC8gMikgLyB0b3RhbDsgIC8vIHJvdW5kZWQgcHJvYmEKLX0KLQotc3RhdGljIHZvaWQgU2V0U2VnbWVudFByb2JhcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IHBbTlVNX01CX1NFR01FTlRTXSA9IHsgMCB9OwotICBpbnQgbjsKLQotICBmb3IgKG4gPSAwOyBuIDwgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87ICsrbikgewotICAgIGNvbnN0IFZQOE1CSW5mbyogY29uc3QgbWIgPSAmZW5jLT5tYl9pbmZvX1tuXTsKLSAgICBwW21iLT5zZWdtZW50X10rKzsKLSAgfQotICBpZiAoZW5jLT5waWNfLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IE5VTV9NQl9TRUdNRU5UUzsgKytuKSB7Ci0gICAgICBlbmMtPnBpY18tPnN0YXRzLT5zZWdtZW50X3NpemVbbl0gPSBwW25dOwotICAgIH0KLSAgfQotICBpZiAoZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA+IDEpIHsKLSAgICB1aW50OF90KiBjb25zdCBwcm9iYXMgPSBlbmMtPnByb2JhXy5zZWdtZW50c187Ci0gICAgcHJvYmFzWzBdID0gR2V0UHJvYmEocFswXSArIHBbMV0sIHBbMl0gKyBwWzNdKTsKLSAgICBwcm9iYXNbMV0gPSBHZXRQcm9iYShwWzBdLCBwWzFdKTsKLSAgICBwcm9iYXNbMl0gPSBHZXRQcm9iYShwWzJdLCBwWzNdKTsKLQotICAgIGVuYy0+c2VnbWVudF9oZHJfLnVwZGF0ZV9tYXBfID0KLSAgICAgICAgKHByb2Jhc1swXSAhPSAyNTUpIHx8IChwcm9iYXNbMV0gIT0gMjU1KSB8fCAocHJvYmFzWzJdICE9IDI1NSk7Ci0gICAgZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV8gPQotICAgICAgICBwWzBdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzFdKSkgKwotICAgICAgICBwWzFdICogKFZQOEJpdENvc3QoMCwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzFdKSkgKwotICAgICAgICBwWzJdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMCwgcHJvYmFzWzJdKSkgKwotICAgICAgICBwWzNdICogKFZQOEJpdENvc3QoMSwgcHJvYmFzWzBdKSArIFZQOEJpdENvc3QoMSwgcHJvYmFzWzJdKSk7Ci0gIH0gZWxzZSB7Ci0gICAgZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8gPSAwOwotICAgIGVuYy0+c2VnbWVudF9oZHJfLnNpemVfID0gMDsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gaGVscGVyIGZ1bmN0aW9ucyBmb3IgcmVzaWR1YWxzIHN0cnVjdCBWUDhSZXNpZHVhbC4KLQotc3RhdGljIHZvaWQgSW5pdFJlc2lkdWFsKGludCBmaXJzdCwgaW50IGNvZWZmX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7Ci0gIHJlcy0+Y29lZmZfdHlwZSA9IGNvZWZmX3R5cGU7Ci0gIHJlcy0+cHJvYiAgPSBlbmMtPnByb2JhXy5jb2VmZnNfW2NvZWZmX3R5cGVdOwotICByZXMtPnN0YXRzID0gZW5jLT5wcm9iYV8uc3RhdHNfW2NvZWZmX3R5cGVdOwotICByZXMtPmNvc3QgID0gZW5jLT5wcm9iYV8ubGV2ZWxfY29zdF9bY29lZmZfdHlwZV07Ci0gIHJlcy0+Zmlyc3QgPSBmaXJzdDsKLX0KLQotc3RhdGljIHZvaWQgU2V0UmVzaWR1YWxDb2VmZnMoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgewotICBpbnQgbjsKLSAgcmVzLT5sYXN0ID0gLTE7Ci0gIGZvciAobiA9IDE1OyBuID49IHJlcy0+Zmlyc3Q7IC0tbikgewotICAgIGlmIChjb2VmZnNbbl0pIHsKLSAgICAgIHJlcy0+bGFzdCA9IG47Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmVzLT5jb2VmZnMgPSBjb2VmZnM7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNb2RlIGNvc3RzCi0KLXN0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0KGludCBjdHgwLCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7Ci0gIGludCBuID0gcmVzLT5maXJzdDsKLSAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQotICBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07Ci0gIGNvbnN0IHVpbnQxNl90KiB0ID0gcmVzLT5jb3N0W25dW2N0eDBdOwotICBpbnQgY29zdDsKLQotICBpZiAocmVzLT5sYXN0IDwgMCkgewotICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKLSAgfQotICBjb3N0ID0gMDsKLSAgd2hpbGUgKG4gPCByZXMtPmxhc3QpIHsKLSAgICBpbnQgdiA9IHJlcy0+Y29lZmZzW25dOwotICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOwotICAgICsrbjsKLSAgICBpZiAodiA9PSAwKSB7Ci0gICAgICAvLyBzaG9ydC1jYXNlIGZvciBWUDhMZXZlbENvc3QodCwgMCkgKG5vdGU6IFZQOExldmVsRml4ZWRDb3N0c1swXSA9PSAwKToKLSAgICAgIGNvc3QgKz0gdFswXTsKLSAgICAgIHQgPSByZXMtPmNvc3RbYl1bMF07Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgdiA9IGFicyh2KTsKLSAgICBjb3N0ICs9IFZQOEJpdENvc3QoMSwgcDApOwotICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOwotICAgIHsKLSAgICAgIGNvbnN0IGludCBjdHggPSAodiA9PSAxKSA/IDEgOiAyOwotICAgICAgcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKLSAgICAgIHQgPSByZXMtPmNvc3RbYl1bY3R4XTsKLSAgICB9Ci0gIH0KLSAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KLSAgewotICAgIGNvbnN0IGludCB2ID0gYWJzKHJlcy0+Y29lZmZzW25dKTsKLSAgICBTQl9EQ0hFQ0sodiAhPSAwKTsKLSAgICBjb3N0ICs9IFZQOEJpdENvc3QoMSwgcDApOwotICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOwotICAgIGlmIChuIDwgMTUpIHsKLSAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOwotICAgICAgY29uc3QgaW50IGN0eCA9ICh2ID09IDEpID8gMSA6IDI7Ci0gICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOwotICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOwotICAgIH0KLSAgfQotICByZXR1cm4gY29zdDsKLX0KLQotaW50IFZQOEdldENvc3RMdW1hNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IGludDE2X3QgbGV2ZWxzWzE2XSkgewotICBjb25zdCBpbnQgeCA9IChpdC0+aTRfICYgMyksIHkgPSAoaXQtPmk0XyA+PiAyKTsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaW50IFIgPSAwOwotICBpbnQgY3R4OwotCi0gIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgU2V0UmVzaWR1YWxDb2VmZnMobGV2ZWxzLCAmcmVzKTsKLSAgUiArPSBHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKLSAgcmV0dXJuIFI7Ci19Ci0KLWludCBWUDhHZXRDb3N0THVtYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICBWUDhSZXNpZHVhbCByZXM7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpbnQgeCwgeTsKLSAgaW50IFIgPSAwOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgICAvLyByZS1pbXBvcnQgdGhlIG5vbi16ZXJvIGNvbnRleHQKLQotICAvLyBEQwotICBJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKLSAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKLSAgUiArPSBHZXRSZXNpZHVhbENvc3QoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOwotCi0gIC8vIEFDCi0gIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgUiArPSBHZXRSZXNpZHVhbENvc3QoY3R4LCAmcmVzKTsKLSAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gKHJlcy5sYXN0ID49IDApOwotICAgIH0KLSAgfQotICByZXR1cm4gUjsKLX0KLQotaW50IFZQOEdldENvc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgaW50IGNoLCB4LCB5OwotICBpbnQgUiA9IDA7Ci0KLSAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOyAgLy8gcmUtaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0Ci0KLSAgSW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7Ci0gIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7Ci0gICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07Ci0gICAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7Ci0gICAgICAgIFIgKz0gR2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7Ci0gICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0gKHJlcy5sYXN0ID49IDApOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gUjsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENvZWZmaWNpZW50IGNvZGluZwotCi1zdGF0aWMgaW50IFB1dENvZWZmcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgY3R4LCBjb25zdCBWUDhSZXNpZHVhbCogcmVzKSB7Ci0gIGludCBuID0gcmVzLT5maXJzdDsKLSAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQotICBjb25zdCB1aW50OF90KiBwID0gcmVzLT5wcm9iW25dW2N0eF07Ci0gIGlmICghVlA4UHV0Qml0KGJ3LCByZXMtPmxhc3QgPj0gMCwgcFswXSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHdoaWxlIChuIDwgMTYpIHsKLSAgICBjb25zdCBpbnQgYyA9IHJlcy0+Y29lZmZzW24rK107Ci0gICAgY29uc3QgaW50IHNpZ24gPSBjIDwgMDsKLSAgICBpbnQgdiA9IHNpZ24gPyAtYyA6IGM7Ci0gICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgIT0gMCwgcFsxXSkpIHsKLSAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzBdOwotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMSwgcFsyXSkpIHsKLSAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzFdOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDQsIHBbM10pKSB7Ci0gICAgICAgIGlmIChWUDhQdXRCaXQoYncsIHYgIT0gMiwgcFs0XSkpCi0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID09IDQsIHBbNV0pOwotICAgICAgfSBlbHNlIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gMTAsIHBbNl0pKSB7Ci0gICAgICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ID4gNiwgcFs3XSkpIHsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPT0gNiwgMTU5KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIHYgPj0gOSwgMTY1KTsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsICEodiAmIDEpLCAxNDUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgbWFzazsKLSAgICAgICAgY29uc3QgdWludDhfdCogdGFiOwotICAgICAgICBpZiAodiA8IDMgKyAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCi0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzhdKTsKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOV0pOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDApOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDI7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0MzsKLSAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQotICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs4XSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzldKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAxKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCAzOwotICAgICAgICAgIHRhYiA9IFZQOENhdDQ7Ci0gICAgICAgIH0gZWxzZSBpZiAodiA8IDMgKyAoOCA8PCAzKSkgeyAgIC8vIFZQOENhdDUgICg1YikKLSAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOF0pOwotICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFsxMF0pOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDIpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NTsKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQotICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs4XSk7Ci0gICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzEwXSk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMyk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMTA7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NjsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAobWFzaykgewotICAgICAgICAgIFZQOFB1dEJpdChidywgISEodiAmIG1hc2spLCAqdGFiKyspOwotICAgICAgICAgIG1hc2sgPj49IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHAgPSByZXMtPnByb2JbVlA4RW5jQmFuZHNbbl1dWzJdOwotICAgIH0KLSAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCBzaWduKTsKLSAgICBpZiAobiA9PSAxNiB8fCAhVlA4UHV0Qml0KGJ3LCBuIDw9IHJlcy0+bGFzdCwgcFswXSkpIHsKLSAgICAgIHJldHVybiAxOyAgIC8vIEVPQgotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIHZvaWQgQ29kZVJlc2lkdWFscyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgaW50IHgsIHksIGNoOwotICBWUDhSZXNpZHVhbCByZXM7Ci0gIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7Ci0gIGNvbnN0IGludCBpMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7Ci0gIGNvbnN0IGludCBzZWdtZW50ID0gaXQtPm1iXy0+c2VnbWVudF87Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotCi0gIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKLQotICBwb3MxID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKLSAgaWYgKGkxNikgewotICAgIEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOwotICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQotICAgICAgUHV0Q29lZmZzKGJ3LCBpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7Ci0gICAgSW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgSW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7Ci0gIH0KLQotICAvLyBsdW1hLUFDCi0gIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7Ci0gICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IFB1dENvZWZmcyhidywgY3R4LCAmcmVzKTsKLSAgICB9Ci0gIH0KLSAgcG9zMiA9IFZQOEJpdFdyaXRlclBvcyhidyk7Ci0KLSAgLy8gVS9WCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9Ci0gICAgICAgICAgICBQdXRDb2VmZnMoYncsIGN0eCwgJnJlcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHBvczMgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwotICBpdC0+bHVtYV9iaXRzXyA9IHBvczIgLSBwb3MxOwotICBpdC0+dXZfYml0c18gPSBwb3MzIC0gcG9zMjsKLSAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1baTE2XSArPSBpdC0+bHVtYV9iaXRzXzsKLSAgaXQtPmJpdF9jb3VudF9bc2VnbWVudF1bMl0gKz0gaXQtPnV2X2JpdHNfOwotICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7Ci19Ci0KLS8vIFNhbWUgYXMgQ29kZVJlc2lkdWFscywgYnV0IGRvZXNuJ3QgYWN0dWFsbHkgd3JpdGUgYW55dGhpbmcuCi0vLyBJbnN0ZWFkLCBpdCBqdXN0IHJlY29yZHMgdGhlIGV2ZW50IGRpc3RyaWJ1dGlvbi4KLXN0YXRpYyB2b2lkIFJlY29yZFJlc2lkdWFscyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICBpbnQgeCwgeSwgY2g7Ci0gIFZQOFJlc2lkdWFsIHJlczsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0KLSAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOwotCi0gIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2Ci0gICAgSW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7Ci0gICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKLSAgICBpdC0+dG9wX256X1s4XSA9IGl0LT5sZWZ0X256X1s4XSA9Ci0gICAgICBSZWNvcmRDb2VmZnMoaXQtPnRvcF9uel9bOF0gKyBpdC0+bGVmdF9uel9bOF0sICZyZXMpOwotICAgIEluaXRSZXNpZHVhbCgxLCAwLCBlbmMsICZyZXMpOwotICB9IGVsc2UgewotICAgIEluaXRSZXNpZHVhbCgwLCAzLCBlbmMsICZyZXMpOwotICB9Ci0KLSAgLy8gbHVtYS1BQwotICBmb3IgKHkgPSAwOyB5IDwgNDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgewotICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOwotICAgICAgU2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfYWNfbGV2ZWxzW3ggKyB5ICogNF0sICZyZXMpOwotICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBVL1YKLSAgSW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7Ci0gIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7Ci0gICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07Ci0gICAgICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7Ci0gICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KLSAgICAgICAgICAgIFJlY29yZENvZWZmcyhjdHgsICZyZXMpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRva2VuIGJ1ZmZlcgotCi0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0KLXN0YXRpYyB2b2lkIFJlY29yZFRva2VucyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKSB7Ci0gIGludCB4LCB5LCBjaDsKLSAgVlA4UmVzaWR1YWwgcmVzOwotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLQotICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7Ci0gIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2Ci0gICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdOwotICAgIEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOwotICAgIFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7Ci0gICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQotICAgICAgICBWUDhSZWNvcmRDb2VmZlRva2VucyhjdHgsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcy5maXJzdCwgcmVzLmxhc3QsIHJlcy5jb2VmZnMsIHRva2Vucyk7Ci0gICAgUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgSW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgSW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7Ci0gIH0KLQotICAvLyBsdW1hLUFDCi0gIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7Ci0gICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9Ci0gICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCByZXMuY29lZmZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZmlyc3QsIHJlcy5sYXN0LCByZXMuY29lZmZzLCB0b2tlbnMpOwotICAgICAgUmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVS9WCi0gIEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOwotICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgewotICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICBTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOwotICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9Ci0gICAgICAgICAgICBWUDhSZWNvcmRDb2VmZlRva2VucyhjdHgsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMuZmlyc3QsIHJlcy5sYXN0LCByZXMuY29lZmZzLCB0b2tlbnMpOwotICAgICAgICBSZWNvcmRDb2VmZnMoY3R4LCAmcmVzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOwotfQotCi0jZW5kaWYgICAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHRyYUluZm8gbWFwIC8gRGVidWcgZnVuY3Rpb24KLQotI2lmIFNFR01FTlRfVklTVQotc3RhdGljIHZvaWQgU2V0QmxvY2sodWludDhfdCogcCwgaW50IHZhbHVlLCBpbnQgc2l6ZSkgewotICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewotICAgIFNiTWVtb3J5U2V0KHAsIHZhbHVlLCBzaXplKTsKLSAgICBwICs9IEJQUzsKLSAgfQotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIFJlc2V0U1NFKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBlbmMtPnNzZV9bMF0gPSAwOwotICBlbmMtPnNzZV9bMV0gPSAwOwotICBlbmMtPnNzZV9bMl0gPSAwOwotICAvLyBOb3RlOiBlbmMtPnNzZV9bM10gaXMgbWFuYWdlZCBieSBhbHBoYS5jCi0gIGVuYy0+c3NlX2NvdW50XyA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlU1NFKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPSBpdC0+eXV2X2luXzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgb3V0ID0gaXQtPnl1dl9vdXRfOwotICAvLyBOb3RlOiBub3QgdG90YWxseSBhY2N1cmF0ZSBhdCBib3VuZGFyeS4gQW5kIGRvZXNuJ3QgaW5jbHVkZSBpbi1sb29wIGZpbHRlci4KLSAgZW5jLT5zc2VfWzBdICs9IFZQOFNTRTE2eDE2KGluICsgWV9PRkYsIG91dCArIFlfT0ZGKTsKLSAgZW5jLT5zc2VfWzFdICs9IFZQOFNTRTh4OChpbiArIFVfT0ZGLCBvdXQgKyBVX09GRik7Ci0gIGVuYy0+c3NlX1syXSArPSBWUDhTU0U4eDgoaW4gKyBWX09GRiwgb3V0ICsgVl9PRkYpOwotICBlbmMtPnNzZV9jb3VudF8gKz0gMTYgKiAxNjsKLX0KLQotc3RhdGljIHZvaWQgU3RvcmVTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IFZQOE1CSW5mbyogY29uc3QgbWIgPSBpdC0+bWJfOwotICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotCi0gIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsKLSAgICBTdG9yZVNTRShpdCk7Ci0gICAgZW5jLT5ibG9ja19jb3VudF9bMF0gKz0gKG1iLT50eXBlXyA9PSAwKTsKLSAgICBlbmMtPmJsb2NrX2NvdW50X1sxXSArPSAobWItPnR5cGVfID09IDEpOwotICAgIGVuYy0+YmxvY2tfY291bnRfWzJdICs9IChtYi0+c2tpcF8gIT0gMCk7Ci0gIH0KLQotICBpZiAocGljLT5leHRyYV9pbmZvICE9IE5VTEwpIHsKLSAgICB1aW50OF90KiBjb25zdCBpbmZvID0gJnBpYy0+ZXh0cmFfaW5mb1tpdC0+eF8gKyBpdC0+eV8gKiBlbmMtPm1iX3dfXTsKLSAgICBzd2l0Y2ggKHBpYy0+ZXh0cmFfaW5mb190eXBlKSB7Ci0gICAgICBjYXNlIDE6ICppbmZvID0gbWItPnR5cGVfOyBicmVhazsKLSAgICAgIGNhc2UgMjogKmluZm8gPSBtYi0+c2VnbWVudF87IGJyZWFrOwotICAgICAgY2FzZSAzOiAqaW5mbyA9IGVuYy0+ZHFtX1ttYi0+c2VnbWVudF9dLnF1YW50XzsgYnJlYWs7Ci0gICAgICBjYXNlIDQ6ICppbmZvID0gKG1iLT50eXBlXyA9PSAxKSA/IGl0LT5wcmVkc19bMF0gOiAweGZmOyBicmVhazsKLSAgICAgIGNhc2UgNTogKmluZm8gPSBtYi0+dXZfbW9kZV87IGJyZWFrOwotICAgICAgY2FzZSA2OiB7Ci0gICAgICAgIGNvbnN0IGludCBiID0gKGludCkoKGl0LT5sdW1hX2JpdHNfICsgaXQtPnV2X2JpdHNfICsgNykgPj4gMyk7Ci0gICAgICAgICppbmZvID0gKGIgPiAyNTUpID8gMjU1IDogYjsgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIDc6ICppbmZvID0gbWItPmFscGhhXzsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OiAqaW5mbyA9IDA7IGJyZWFrOwotICAgIH07Ci0gIH0KLSNpZiBTRUdNRU5UX1ZJU1UgIC8vIHZpc3VhbGl6ZSBzZWdtZW50cyBhbmQgcHJlZGljdGlvbiBtb2RlcwotICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBZX09GRiwgbWItPnNlZ21lbnRfICogNjQsIDE2KTsKLSAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgVV9PRkYsIGl0LT5wcmVkc19bMF0gKiA2NCwgOCk7Ci0gIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFZfT0ZGLCBtYi0+dXZfbW9kZV8gKiA2NCwgOCk7Ci0jZW5kaWYKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBTdGF0TG9vcCgpOiBvbmx5IGNvbGxlY3Qgc3RhdGlzdGljcyAobnVtYmVyIG9mIHNraXBzLCB0b2tlbiB1c2FnZSwgLi4uKS4KLS8vICBUaGlzIGlzIHVzZWQgZm9yIGRlY2lkaW5nIG9wdGltYWwgcHJvYmFiaWxpdGllcy4gSXQgYWxzbyBtb2RpZmllcyB0aGUKLS8vICBxdWFudGl6ZXIgdmFsdWUgaWYgc29tZSB0YXJnZXQgKHNpemUsIFBOU1IpIHdhcyBzcGVjaWZpZWQuCi0KLSNkZWZpbmUga0hlYWRlclNpemVFc3RpbWF0ZSAoMTUgKyAyMCArIDEwKSAgICAgIC8vIFRPRE86IGZpeCBiZXR0ZXIKLQotc3RhdGljIHZvaWQgU2V0TG9vcFBhcmFtcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsIGZsb2F0IHEpIHsKLSAgLy8gTWFrZSBzdXJlIHRoZSBxdWFsaXR5IHBhcmFtZXRlciBpcyBpbnNpZGUgdmFsaWQgYm91bmRzCi0gIGlmIChxIDwgMC4pIHsKLSAgICBxID0gMDsKLSAgfSBlbHNlIGlmIChxID4gMTAwLikgewotICAgIHEgPSAxMDA7Ci0gIH0KLQotICBWUDhTZXRTZWdtZW50UGFyYW1zKGVuYywgcSk7ICAgICAgLy8gc2V0dXAgc2VnbWVudCBxdWFudGl6YXRpb25zIGFuZCBmaWx0ZXJzCi0gIFNldFNlZ21lbnRQcm9iYXMoZW5jKTsgICAgICAgICAgICAvLyBjb21wdXRlIHNlZ21lbnQgcHJvYmFiaWxpdGllcwotCi0gIFJlc2V0U3RhdHMoZW5jKTsKLSAgUmVzZXRUb2tlblN0YXRzKGVuYyk7Ci0KLSAgUmVzZXRTU0UoZW5jKTsKLX0KLQotc3RhdGljIGludCBPbmVTdGF0UGFzcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsIGZsb2F0IHEsIFZQOFJETGV2ZWwgcmRfb3B0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmJfbWJzLCBmbG9hdCogY29uc3QgUFNOUiwgaW50IHBlcmNlbnRfZGVsdGEpIHsKLSAgVlA4RW5jSXRlcmF0b3IgaXQ7Ci0gIHVpbnQ2NF90IHNpemUgPSAwOwotICB1aW50NjRfdCBkaXN0b3J0aW9uID0gMDsKLSAgY29uc3QgdWludDY0X3QgcGl4ZWxfY291bnQgPSBuYl9tYnMgKiAzODQ7Ci0KLSAgU2V0TG9vcFBhcmFtcyhlbmMsIHEpOwotCi0gIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7Ci0gIGRvIHsKLSAgICBWUDhNb2RlU2NvcmUgaW5mbzsKLSAgICBWUDhJdGVyYXRvckltcG9ydCgmaXQpOwotICAgIGlmIChWUDhEZWNpbWF0ZSgmaXQsICZpbmZvLCByZF9vcHQpKSB7Ci0gICAgICAvLyBKdXN0IHJlY29yZCB0aGUgbnVtYmVyIG9mIHNraXBzIGFuZCBhY3QgbGlrZSBza2lwX3Byb2JhIGlzIG5vdCB1c2VkLgotICAgICAgZW5jLT5wcm9iYV8ubmJfc2tpcF8rKzsKLSAgICB9Ci0gICAgUmVjb3JkUmVzaWR1YWxzKCZpdCwgJmluZm8pOwotICAgIHNpemUgKz0gaW5mby5SOwotICAgIGRpc3RvcnRpb24gKz0gaW5mby5EOwotICAgIGlmIChwZXJjZW50X2RlbHRhICYmICFWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgcGVyY2VudF9kZWx0YSkpCi0gICAgICByZXR1cm4gMDsKLSAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCwgaXQueXV2X291dF8pICYmIC0tbmJfbWJzID4gMCk7Ci0gIHNpemUgKz0gRmluYWxpemVTa2lwUHJvYmEoZW5jKTsKLSAgc2l6ZSArPSBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7Ci0gIHNpemUgKz0gZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV87Ci0gIHNpemUgPSAoKHNpemUgKyAxMDI0KSA+PiAxMSkgKyBrSGVhZGVyU2l6ZUVzdGltYXRlOwotCi0gIGlmIChQU05SKSB7Ci0gICAgKlBTTlIgPSAoZmxvYXQpKDEwLiogbG9nMTAoMjU1LiAqIDI1NS4gKiBwaXhlbF9jb3VudCAvIGRpc3RvcnRpb24pKTsKLSAgfQotICByZXR1cm4gKGludClzaXplOwotfQotCi0vLyBzdWNjZXNzaXZlIHJlZmluZW1lbnQgaW5jcmVtZW50cy4KLXN0YXRpYyBjb25zdCBpbnQgZHFzW10gPSB7IDIwLCAxNSwgMTAsIDgsIDYsIDQsIDIsIDEsIDAgfTsKLQotc3RhdGljIGludCBTdGF0TG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgY29uc3QgaW50IG1ldGhvZCA9IGVuYy0+bWV0aG9kXzsKLSAgY29uc3QgaW50IGRvX3NlYXJjaCA9IGVuYy0+ZG9fc2VhcmNoXzsKLSAgY29uc3QgaW50IGZhc3RfcHJvYmUgPSAoKG1ldGhvZCA9PSAwIHx8IG1ldGhvZCA9PSAzKSAmJiAhZG9fc2VhcmNoKTsKLSAgZmxvYXQgcSA9IGVuYy0+Y29uZmlnXy0+cXVhbGl0eTsKLSAgY29uc3QgaW50IG1heF9wYXNzZXMgPSBlbmMtPmNvbmZpZ18tPnBhc3M7Ci0gIGNvbnN0IGludCB0YXNrX3BlcmNlbnQgPSAyMDsKLSAgY29uc3QgaW50IHBlcmNlbnRfcGVyX3Bhc3MgPSAodGFza19wZXJjZW50ICsgbWF4X3Bhc3NlcyAvIDIpIC8gbWF4X3Bhc3NlczsKLSAgY29uc3QgaW50IGZpbmFsX3BlcmNlbnQgPSBlbmMtPnBlcmNlbnRfICsgdGFza19wZXJjZW50OwotICBpbnQgcGFzczsKLSAgaW50IG5iX21iczsKLQotICAvLyBGYXN0IG1vZGU6IHF1aWNrIGFuYWx5c2lzIHBhc3Mgb3ZlciBmZXcgbWJzLiBCZXR0ZXIgdGhhbiBub3RoaW5nLgotICBuYl9tYnMgPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXzsKLSAgaWYgKGZhc3RfcHJvYmUpIHsKLSAgICBpZiAobWV0aG9kID09IDMpIHsgIC8vIHdlIG5lZWQgbW9yZSBzdGF0cyBmb3IgbWV0aG9kIDMgdG8gYmUgcmVsaWFibGUuCi0gICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAxIDogMTAwOwotICAgIH0gZWxzZSB7Ci0gICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAyIDogNTA7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm8gdGFyZ2V0IHNpemU6IGp1c3QgZG8gc2V2ZXJhbCBwYXNzIHdpdGhvdXQgY2hhbmdpbmcgJ3EnCi0gIGlmICghZG9fc2VhcmNoKSB7Ci0gICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG1heF9wYXNzZXM7ICsrcGFzcykgewotICAgICAgY29uc3QgVlA4UkRMZXZlbCByZF9vcHQgPSAobWV0aG9kID49IDMpID8gUkRfT1BUX0JBU0lDIDogUkRfT1BUX05PTkU7Ci0gICAgICBpZiAoIU9uZVN0YXRQYXNzKGVuYywgcSwgcmRfb3B0LCBuYl9tYnMsIE5VTEwsIHBlcmNlbnRfcGVyX3Bhc3MpKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBiaW5hcnkgc2VhcmNoIGZvciBhIHNpemUgY2xvc2UgdG8gdGFyZ2V0Ci0gICAgZm9yIChwYXNzID0gMDsgcGFzcyA8IG1heF9wYXNzZXMgJiYgKGRxc1twYXNzXSA+IDApOyArK3Bhc3MpIHsKLSAgICAgIGZsb2F0IFBTTlI7Ci0gICAgICBpbnQgY3JpdGVyaW9uOwotICAgICAgY29uc3QgaW50IHNpemUgPSBPbmVTdGF0UGFzcyhlbmMsIHEsIFJEX09QVF9CQVNJQywgbmJfbWJzLCAmUFNOUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudF9wZXJfcGFzcyk7Ci0jaWYgREVCVUdfU0VBUkNICi0gICAgICBwcmludGYoIiMlZCBzaXplPSVkIFBTTlI9JS4yZiBxPSUuMmZcbiIsIHBhc3MsIHNpemUsIFBTTlIsIHEpOwotI2VuZGlmCi0gICAgICBpZiAoc2l6ZSA9PSAwKSByZXR1cm4gMDsKLSAgICAgIGlmIChlbmMtPmNvbmZpZ18tPnRhcmdldF9QU05SID4gMCkgewotICAgICAgICBjcml0ZXJpb24gPSAoUFNOUiA8IGVuYy0+Y29uZmlnXy0+dGFyZ2V0X1BTTlIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3JpdGVyaW9uID0gKHNpemUgPCBlbmMtPmNvbmZpZ18tPnRhcmdldF9zaXplKTsKLSAgICAgIH0KLSAgICAgIC8vIGRpY2hvdG9taXplCi0gICAgICBpZiAoY3JpdGVyaW9uKSB7Ci0gICAgICAgIHEgKz0gZHFzW3Bhc3NdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcSAtPSBkcXNbcGFzc107Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoJmVuYy0+cHJvYmFfKTsgIC8vIGZpbmFsaXplIGNvc3RzCi0gIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBmaW5hbF9wZXJjZW50LCAmZW5jLT5wZXJjZW50Xyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGxvb3BzCi0vLwotCi1zdGF0aWMgY29uc3QgaW50IGtBdmVyYWdlQnl0ZXNQZXJNQls4XSA9IHsgNTAsIDI0LCAxNiwgOSwgNywgNSwgMywgMiB9OwotCi1zdGF0aWMgaW50IFByZUxvb3BJbml0aWFsaXplKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgcDsKLSAgaW50IG9rID0gMTsKLSAgY29uc3QgaW50IGF2ZXJhZ2VfYnl0ZXNfcGVyX01CID0ga0F2ZXJhZ2VCeXRlc1Blck1CW2VuYy0+YmFzZV9xdWFudF8gPj4gNF07Ci0gIGNvbnN0IGludCBieXRlc19wZXJfcGFydHMgPQotICAgICAgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiBhdmVyYWdlX2J5dGVzX3Blcl9NQiAvIGVuYy0+bnVtX3BhcnRzXzsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgYml0LXdyaXRlcnMKLSAgZm9yIChwID0gMDsgb2sgJiYgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7Ci0gICAgb2sgPSBWUDhCaXRXcml0ZXJJbml0KGVuYy0+cGFydHNfICsgcCwgYnl0ZXNfcGVyX3BhcnRzKTsKLSAgfQotICBpZiAoIW9rKSBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOyAgLy8gbWFsbG9jIGVycm9yIG9jY3VycmVkCi0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBQb3N0TG9vcEZpbmFsaXplKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IG9rKSB7Ci0gIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpZiAob2spIHsgICAgICAvLyBGaW5hbGl6ZSB0aGUgcGFydGl0aW9ucywgY2hlY2sgZm9yIGV4dHJhIGVycm9ycy4KLSAgICBpbnQgcDsKLSAgICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKLSAgICAgIFZQOEJpdFdyaXRlckZpbmlzaChlbmMtPnBhcnRzXyArIHApOwotICAgICAgb2sgJj0gIWVuYy0+cGFydHNfW3BdLmVycm9yXzsKLSAgICB9Ci0gIH0KLQotICBpZiAob2spIHsgICAgICAvLyBBbGwgZ29vZC4gRmluaXNoIHVwLgotICAgIGlmIChlbmMtPnBpY18tPnN0YXRzKSB7ICAgICAgICAgICAvLyBmaW5hbGl6ZSBieXRlIGNvdW50ZXJzLi4uCi0gICAgICBpbnQgaSwgczsKLSAgICAgIGZvciAoaSA9IDA7IGkgPD0gMjsgKytpKSB7Ci0gICAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICAgIGVuYy0+cmVzaWR1YWxfYnl0ZXNfW2ldW3NdID0gKGludCkoKGl0LT5iaXRfY291bnRfW3NdW2ldICsgNykgPj4gMyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoaXQpOyAgICAgLy8gLi4uYW5kIHN0b3JlIGZpbHRlciBzdGF0cy4KLSAgfSBlbHNlIHsKLSAgICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkIC0+IG5lZWQgdG8gZG8gc29tZSBtZW1vcnkgY2xlYW51cC4KLSAgICBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOwotICB9Ci0gIHJldHVybiBvazsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICBWUDhFbmNMb29wKCk6IGRvZXMgdGhlIGZpbmFsIGJpdHN0cmVhbSBjb2RpbmcuCi0KLXN0YXRpYyB2b2lkIFJlc2V0QWZ0ZXJTa2lwKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgewotICAgICppdC0+bnpfID0gMDsgIC8vIHJlc2V0IGFsbCBwcmVkaWN0b3JzCi0gICAgaXQtPmxlZnRfbnpfWzhdID0gMDsKLSAgfSBlbHNlIHsKLSAgICAqaXQtPm56XyAmPSAoMSA8PCAyNCk7ICAvLyBwcmVzZXJ2ZSB0aGUgZGNfbnogYml0Ci0gIH0KLX0KLQotaW50IFZQOEVuY0xvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOEVuY0l0ZXJhdG9yIGl0OwotICBpbnQgb2sgPSBQcmVMb29wSW5pdGlhbGl6ZShlbmMpOwotICBpZiAoIW9rKSByZXR1cm4gMDsKLQotICBTdGF0TG9vcChlbmMpOyAgLy8gc3RhdHMtY29sbGVjdGlvbiBsb29wCi0KLSAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKLSAgVlA4SW5pdEZpbHRlcigmaXQpOwotICBkbyB7Ci0gICAgVlA4TW9kZVNjb3JlIGluZm87Ci0gICAgY29uc3QgaW50IGRvbnRfdXNlX3NraXAgPSAhZW5jLT5wcm9iYV8udXNlX3NraXBfcHJvYmFfOwotICAgIGNvbnN0IFZQOFJETGV2ZWwgcmRfb3B0ID0gZW5jLT5yZF9vcHRfbGV2ZWxfOwotCi0gICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICAvLyBXYXJuaW5nISBvcmRlciBpcyBpbXBvcnRhbnQ6IGZpcnN0IGNhbGwgVlA4RGVjaW1hdGUoKSBhbmQKLSAgICAvLyAqdGhlbiogZGVjaWRlIGhvdyB0byBjb2RlIHRoZSBza2lwIGRlY2lzaW9uIGlmIHRoZXJlJ3Mgb25lLgotICAgIGlmICghVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSB8fCBkb250X3VzZV9za2lwKSB7Ci0gICAgICBDb2RlUmVzaWR1YWxzKGl0LmJ3XywgJml0LCAmaW5mbyk7Ci0gICAgfSBlbHNlIHsgICAvLyByZXNldCBwcmVkaWN0b3JzIGFmdGVyIGEgc2tpcAotICAgICAgUmVzZXRBZnRlclNraXAoJml0KTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoZW5jLT51c2VfbGF5ZXJfKSB7Ci0gICAgICBWUDhFbmNDb2RlTGF5ZXJCbG9jaygmaXQpOwotICAgIH0KLSNlbmRpZgotICAgIFN0b3JlU2lkZUluZm8oJml0KTsKLSAgICBWUDhTdG9yZUZpbHRlclN0YXRzKCZpdCk7Ci0gICAgVlA4SXRlcmF0b3JFeHBvcnQoJml0KTsKLSAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7Ci0gIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQsIGl0Lnl1dl9vdXRfKSk7Ci0KLSAgcmV0dXJuIFBvc3RMb29wRmluYWxpemUoJml0LCBvayk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW5nbGUgcGFzcyB1c2luZyBUb2tlbiBCdWZmZXIuCi0KLSNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKLQotI2RlZmluZSBNSU5fQ09VTlQgOTYgICAvLyBtaW5pbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZWZvcmUgdXBkYXRpbmcgc3RhdHMKLQotaW50IFZQOEVuY1Rva2VuTG9vcChWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgaW50IG9rOwotICAvLyBSb3VnaGx5IHJlZnJlc2ggdGhlIHByb2JhIGhlaWdodCB0aW1lcyBwZXIgcGFzcwotICBpbnQgbWF4X2NvdW50ID0gKGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKSA+PiAzOwotICBpbnQgY250OwotICBWUDhFbmNJdGVyYXRvciBpdDsKLSAgVlA4UHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOwotICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKLQotICBpZiAobWF4X2NvdW50IDwgTUlOX0NPVU5UKSBtYXhfY291bnQgPSBNSU5fQ09VTlQ7Ci0gIGNudCA9IG1heF9jb3VudDsKLQotICBTQl9EQ0hFQ0soZW5jLT5udW1fcGFydHNfID09IDEpOwotICBTQl9EQ0hFQ0soZW5jLT51c2VfdG9rZW5zXyk7Ci0gIFNCX0RDSEVDSyhwcm9iYS0+dXNlX3NraXBfcHJvYmFfID09IDApOwotICBTQl9EQ0hFQ0socmRfb3B0ID49IFJEX09QVF9CQVNJQyk7ICAgLy8gb3RoZXJ3aXNlLCB0b2tlbi1idWZmZXIgd29uJ3QgYmUgdXNlZnVsCi0gIFNCX0RDSEVDSyghZW5jLT5kb19zZWFyY2hfKTsgICAgICAgICAvLyBUT0RPKHNrYWwpOiBoYW5kbGUgcGFzcyBhbmQgZGljaG90b215Ci0KLSAgU2V0TG9vcFBhcmFtcyhlbmMsIGVuYy0+Y29uZmlnXy0+cXVhbGl0eSk7Ci0KLSAgb2sgPSBQcmVMb29wSW5pdGlhbGl6ZShlbmMpOwotICBpZiAoIW9rKSByZXR1cm4gMDsKLQotICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwotICBWUDhJbml0RmlsdGVyKCZpdCk7Ci0gIGRvIHsKLSAgICBWUDhNb2RlU2NvcmUgaW5mbzsKLSAgICBWUDhJdGVyYXRvckltcG9ydCgmaXQpOwotICAgIGlmICgtLWNudCA8IDApIHsKLSAgICAgIEZpbmFsaXplVG9rZW5Qcm9iYXMocHJvYmEpOwotICAgICAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhwcm9iYSk7ICAvLyByZWZyZXNoIGNvc3QgdGFibGVzIGZvciByZC1vcHQKLSAgICAgIGNudCA9IG1heF9jb3VudDsKLSAgICB9Ci0gICAgVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KTsKLSAgICBSZWNvcmRUb2tlbnMoJml0LCAmaW5mbywgJmVuYy0+dG9rZW5zXyk7Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoZW5jLT51c2VfbGF5ZXJfKSB7Ci0gICAgICBWUDhFbmNDb2RlTGF5ZXJCbG9jaygmaXQpOwotICAgIH0KLSNlbmRpZgotICAgIFN0b3JlU2lkZUluZm8oJml0KTsKLSAgICBWUDhTdG9yZUZpbHRlclN0YXRzKCZpdCk7Ci0gICAgVlA4SXRlcmF0b3JFeHBvcnQoJml0KTsKLSAgICBvayA9IFZQOEl0ZXJhdG9yUHJvZ3Jlc3MoJml0LCAyMCk7Ci0gIH0gd2hpbGUgKG9rICYmIFZQOEl0ZXJhdG9yTmV4dCgmaXQsIGl0Lnl1dl9vdXRfKSk7Ci0KLSAgb2sgPSBvayAmJiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKLQotICBpZiAob2spIHsKLSAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKHByb2JhKTsKLSAgICBvayA9IFZQOEVtaXRUb2tlbnMoJmVuYy0+dG9rZW5zXywgZW5jLT5wYXJ0c18gKyAwLAotICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcHJvYmEtPmNvZWZmc18sIDEpOwotICB9Ci0KLSAgcmV0dXJuIFBvc3RMb29wRmluYWxpemUoJml0LCBvayk7Ci19Ci0KLSNlbHNlCi0KLWludCBWUDhFbmNUb2tlbkxvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gICh2b2lkKWVuYzsKLSAgcmV0dXJuIDA7ICAgLy8gd2Ugc2hvdWxkbid0IGJlIGhlcmUuCi19Ci0KLSNlbmRpZiAgICAvLyBESVNBQkxFX1RPS0VOX0JVRkZFUgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc0YzM3Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MTkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKLS8vCi0jaWZkZWYgSEFWRV9DT05GSUdfSAotI2luY2x1ZGUgImNvbmZpZy5oIgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiLi9oaXN0b2dyYW0uaCIKLSNpbmNsdWRlICIuLi9kc3AvbG9zc2xlc3MuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotCi1zdGF0aWMgdm9pZCBIaXN0b2dyYW1DbGVhcihWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7Ci0gIFNiTWVtb3J5U2V0KHAtPmxpdGVyYWxfLCAwLCBzaXplb2YocC0+bGl0ZXJhbF8pKTsKLSAgU2JNZW1vcnlTZXQocC0+cmVkXywgMCwgc2l6ZW9mKHAtPnJlZF8pKTsKLSAgU2JNZW1vcnlTZXQocC0+Ymx1ZV8sIDAsIHNpemVvZihwLT5ibHVlXykpOwotICBTYk1lbW9yeVNldChwLT5hbHBoYV8sIDAsIHNpemVvZihwLT5hbHBoYV8pKTsKLSAgU2JNZW1vcnlTZXQocC0+ZGlzdGFuY2VfLCAwLCBzaXplb2YocC0+ZGlzdGFuY2VfKSk7Ci0gIHAtPmJpdF9jb3N0XyA9IDA7Ci19Ci0KLXZvaWQgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgcmVmcy0+c2l6ZTsgKytpKSB7Ci0gICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShoaXN0bywgJnJlZnMtPnJlZnNbaV0pOwotICB9Ci19Ci0KLXZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7Ci0gIGlmIChwYWxldHRlX2NvZGVfYml0cyA+PSAwKSB7Ci0gICAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gcGFsZXR0ZV9jb2RlX2JpdHM7Ci0gIH0KLSAgSGlzdG9ncmFtQ2xlYXIocCk7Ci0gIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMocmVmcywgcCk7Ci19Ci0KLXZvaWQgVlA4TEhpc3RvZ3JhbUluaXQoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCwgaW50IHBhbGV0dGVfY29kZV9iaXRzKSB7Ci0gIHAtPnBhbGV0dGVfY29kZV9iaXRzXyA9IHBhbGV0dGVfY29kZV9iaXRzOwotICBIaXN0b2dyYW1DbGVhcihwKTsKLX0KLQotVlA4TEhpc3RvZ3JhbVNldCogVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KGludCBzaXplLCBpbnQgY2FjaGVfYml0cykgewotICBpbnQgaTsKLSAgVlA4TEhpc3RvZ3JhbVNldCogc2V0OwotICBWUDhMSGlzdG9ncmFtKiBidWxrOwotICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gc2l6ZW9mKCpzZXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3Qpc2l6ZSAqIHNpemVvZigqc2V0LT5oaXN0b2dyYW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KXNpemUgKiBzaXplb2YoKipzZXQtPmhpc3RvZ3JhbXMpOwotICB1aW50OF90KiBtZW1vcnkgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKLSAgaWYgKG1lbW9yeSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLQotICBzZXQgPSAoVlA4TEhpc3RvZ3JhbVNldCopbWVtb3J5OwotICBtZW1vcnkgKz0gc2l6ZW9mKCpzZXQpOwotICBzZXQtPmhpc3RvZ3JhbXMgPSAoVlA4TEhpc3RvZ3JhbSoqKW1lbW9yeTsKLSAgbWVtb3J5ICs9IHNpemUgKiBzaXplb2YoKnNldC0+aGlzdG9ncmFtcyk7Ci0gIGJ1bGsgPSAoVlA4TEhpc3RvZ3JhbSopbWVtb3J5OwotICBzZXQtPm1heF9zaXplID0gc2l6ZTsKLSAgc2V0LT5zaXplID0gc2l6ZTsKLSAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgIHNldC0+aGlzdG9ncmFtc1tpXSA9IGJ1bGsgKyBpOwotICAgIFZQOExIaXN0b2dyYW1Jbml0KHNldC0+aGlzdG9ncmFtc1tpXSwgY2FjaGVfYml0cyk7Ci0gIH0KLSAgcmV0dXJuIHNldDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdikgewotICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7Ci0gICAgKytoaXN0by0+YWxwaGFfW1BpeE9yQ29weUxpdGVyYWwodiwgMyldOwotICAgICsraGlzdG8tPnJlZF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAyKV07Ci0gICAgKytoaXN0by0+bGl0ZXJhbF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAxKV07Ci0gICAgKytoaXN0by0+Ymx1ZV9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAwKV07Ci0gIH0gZWxzZSBpZiAoUGl4T3JDb3B5SXNDYWNoZUlkeCh2KSkgewotICAgIGludCBsaXRlcmFsX2l4ID0gMjU2ICsgTlVNX0xFTkdUSF9DT0RFUyArIFBpeE9yQ29weUNhY2hlSWR4KHYpOwotICAgICsraGlzdG8tPmxpdGVyYWxfW2xpdGVyYWxfaXhdOwotICB9IGVsc2UgewotICAgIGludCBjb2RlLCBleHRyYV9iaXRzX2NvdW50LCBleHRyYV9iaXRzX3ZhbHVlOwotICAgIFByZWZpeEVuY29kZShQaXhPckNvcHlMZW5ndGgodiksCi0gICAgICAgICAgICAgICAgICZjb2RlLCAmZXh0cmFfYml0c19jb3VudCwgJmV4dHJhX2JpdHNfdmFsdWUpOwotICAgICsraGlzdG8tPmxpdGVyYWxfWzI1NiArIGNvZGVdOwotICAgIFByZWZpeEVuY29kZShQaXhPckNvcHlEaXN0YW5jZSh2KSwKLSAgICAgICAgICAgICAgICAgJmNvZGUsICZleHRyYV9iaXRzX2NvdW50LCAmZXh0cmFfYml0c192YWx1ZSk7Ci0gICAgKytoaXN0by0+ZGlzdGFuY2VfW2NvZGVdOwotICB9Ci19Ci0KLXN0YXRpYyBkb3VibGUgQml0c0VudHJvcHkoY29uc3QgaW50KiBjb25zdCBhcnJheSwgaW50IG4pIHsKLSAgZG91YmxlIHJldHZhbCA9IDAuOwotICBpbnQgc3VtID0gMDsKLSAgaW50IG5vbnplcm9zID0gMDsKLSAgaW50IG1heF92YWwgPSAwOwotICBpbnQgaTsKLSAgZG91YmxlIG1peDsKLSAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgIGlmIChhcnJheVtpXSAhPSAwKSB7Ci0gICAgICBzdW0gKz0gYXJyYXlbaV07Ci0gICAgICArK25vbnplcm9zOwotICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoYXJyYXlbaV0pOwotICAgICAgaWYgKG1heF92YWwgPCBhcnJheVtpXSkgewotICAgICAgICBtYXhfdmFsID0gYXJyYXlbaV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHZhbCArPSBWUDhMRmFzdFNMb2cyKHN1bSk7Ci0KLSAgaWYgKG5vbnplcm9zIDwgNSkgewotICAgIGlmIChub256ZXJvcyA8PSAxKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgLy8gVHdvIHN5bWJvbHMsIHRoZXkgd2lsbCBiZSAwIGFuZCAxIGluIGEgSHVmZm1hbiBjb2RlLgotICAgIC8vIExldCdzIG1peCBpbiBhIGJpdCBvZiBlbnRyb3B5IHRvIGZhdm9yIGdvb2QgY2x1c3RlcmluZyB3aGVuCi0gICAgLy8gZGlzdHJpYnV0aW9ucyBvZiB0aGVzZSBhcmUgY29tYmluZWQuCi0gICAgaWYgKG5vbnplcm9zID09IDIpIHsKLSAgICAgIHJldHVybiAwLjk5ICogc3VtICsgMC4wMSAqIHJldHZhbDsKLSAgICB9Ci0gICAgLy8gTm8gbWF0dGVyIHdoYXQgdGhlIGVudHJvcHkgc2F5cywgd2UgY2Fubm90IGJlIGJldHRlciB0aGFuIG1pbl9saW1pdAotICAgIC8vIHdpdGggSHVmZm1hbiBjb2RpbmcuIEkgYW0gbWl4aW5nIGEgYml0IG9mIGVudHJvcHkgaW50byB0aGUKLSAgICAvLyBtaW5fbGltaXQgc2luY2UgaXQgcHJvZHVjZXMgbXVjaCBiZXR0ZXIgKH4wLjUgJSkgY29tcHJlc3Npb24gcmVzdWx0cwotICAgIC8vIHBlcmhhcHMgYmVjYXVzZSBvZiBiZXR0ZXIgZW50cm9weSBjbHVzdGVyaW5nLgotICAgIGlmIChub256ZXJvcyA9PSAzKSB7Ci0gICAgICBtaXggPSAwLjk1OwotICAgIH0gZWxzZSB7Ci0gICAgICBtaXggPSAwLjc7ICAvLyBub256ZXJvcyA9PSA0LgotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBtaXggPSAwLjYyNzsKLSAgfQotCi0gIHsKLSAgICBkb3VibGUgbWluX2xpbWl0ID0gMiAqIHN1bSAtIG1heF92YWw7Ci0gICAgbWluX2xpbWl0ID0gbWl4ICogbWluX2xpbWl0ICsgKDEuMCAtIG1peCkgKiByZXR2YWw7Ci0gICAgcmV0dXJuIChyZXR2YWwgPCBtaW5fbGltaXQpID8gbWluX2xpbWl0IDogcmV0dmFsOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdGhlIGNvc3QgZW5jb2RlIHRoZSBybGUtZW5jb2RlZCBlbnRyb3B5IGNvZGUuCi0vLyBUaGUgY29uc3RhbnRzIGluIHRoaXMgZnVuY3Rpb24gYXJlIGV4cGVyaW1lbnRhbC4KLXN0YXRpYyBkb3VibGUgSHVmZm1hbkNvc3QoY29uc3QgaW50KiBjb25zdCBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoKSB7Ci0gIC8vIFNtYWxsIGJpYXMgYmVjYXVzZSBIdWZmbWFuIGNvZGUgbGVuZ3RoIGlzIHR5cGljYWxseSBub3Qgc3RvcmVkIGluCi0gIC8vIGZ1bGwgbGVuZ3RoLgotICBzdGF0aWMgY29uc3QgaW50IGtIdWZmbWFuQ29kZU9mSHVmZm1hbkNvZGVTaXplID0gQ09ERV9MRU5HVEhfQ09ERVMgKiAzOwotICBzdGF0aWMgY29uc3QgZG91YmxlIGtTbWFsbEJpYXMgPSA5LjE7Ci0gIGRvdWJsZSByZXR2YWwgPSBrSHVmZm1hbkNvZGVPZkh1ZmZtYW5Db2RlU2l6ZSAtIGtTbWFsbEJpYXM7Ci0gIGludCBzdHJlYWsgPSAwOwotICBpbnQgaSA9IDA7Ci0gIGZvciAoOyBpIDwgbGVuZ3RoIC0gMTsgKytpKSB7Ci0gICAgKytzdHJlYWs7Ci0gICAgaWYgKHBvcHVsYXRpb25baV0gPT0gcG9wdWxhdGlvbltpICsgMV0pIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSBsYXN0X3N0cmVha19oYWNrOgotICAgIC8vIHBvcHVsYXRpb25baV0gcG9pbnRzIG5vdyB0byB0aGUgc3ltYm9sIGluIHRoZSBzdHJlYWsgb2Ygc2FtZSB2YWx1ZXMuCi0gICAgaWYgKHN0cmVhayA+IDMpIHsKLSAgICAgIGlmIChwb3B1bGF0aW9uW2ldID09IDApIHsKLSAgICAgICAgcmV0dmFsICs9IDEuNTYyNSArIDAuMjM0Mzc1ICogc3RyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dmFsICs9IDIuNTc4MTI1ICsgMC43MDMxMjUgKiBzdHJlYWs7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwb3B1bGF0aW9uW2ldID09IDApIHsKLSAgICAgICAgcmV0dmFsICs9IDEuNzk2ODc1ICogc3RyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dmFsICs9IDMuMjgxMjUgKiBzdHJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN0cmVhayA9IDA7Ci0gIH0KLSAgaWYgKGkgPT0gbGVuZ3RoIC0gMSkgewotICAgICsrc3RyZWFrOwotICAgIGdvdG8gbGFzdF9zdHJlYWtfaGFjazsKLSAgfQotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgZG91YmxlIFBvcHVsYXRpb25Db3N0KGNvbnN0IGludCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgewotICByZXR1cm4gQml0c0VudHJvcHkocG9wdWxhdGlvbiwgbGVuZ3RoKSArIEh1ZmZtYW5Db3N0KHBvcHVsYXRpb24sIGxlbmd0aCk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgRXh0cmFDb3N0KGNvbnN0IGludCogY29uc3QgcG9wdWxhdGlvbiwgaW50IGxlbmd0aCkgewotICBpbnQgaTsKLSAgZG91YmxlIGNvc3QgPSAwLjsKLSAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCAtIDI7ICsraSkgY29zdCArPSAoaSA+PiAxKSAqIHBvcHVsYXRpb25baSArIDJdOwotICByZXR1cm4gY29zdDsKLX0KLQotLy8gRXN0aW1hdGVzIHRoZSBFbnRyb3B5ICsgSHVmZm1hbiArIG90aGVyIGJsb2NrIG92ZXJoZWFkIHNpemUgY29zdC4KLWRvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKLSAgcmV0dXJuIFBvcHVsYXRpb25Db3N0KHAtPmxpdGVyYWxfLCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMocCkpCi0gICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5yZWRfLCAyNTYpCi0gICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5ibHVlXywgMjU2KQotICAgICAgICsgUG9wdWxhdGlvbkNvc3QocC0+YWxwaGFfLCAyNTYpCi0gICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUykKLSAgICAgICArIEV4dHJhQ29zdChwLT5saXRlcmFsXyArIDI1NiwgTlVNX0xFTkdUSF9DT0RFUykKLSAgICAgICArIEV4dHJhQ29zdChwLT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUyk7Ci19Ci0KLWRvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzQnVsayhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKSB7Ci0gIHJldHVybiBCaXRzRW50cm9weShwLT5saXRlcmFsXywgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKHApKQotICAgICAgICsgQml0c0VudHJvcHkocC0+cmVkXywgMjU2KQotICAgICAgICsgQml0c0VudHJvcHkocC0+Ymx1ZV8sIDI1NikKLSAgICAgICArIEJpdHNFbnRyb3B5KHAtPmFscGhhXywgMjU2KQotICAgICAgICsgQml0c0VudHJvcHkocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+bGl0ZXJhbF8gKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpCi0gICAgICAgKyBFeHRyYUNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVmFyaW91cyBoaXN0b2dyYW0gY29tYmluZS9jb3N0LWV2YWwgZnVuY3Rpb25zCi0KLS8vIEFkZHMgJ2luJyBoaXN0b2dyYW0gdG8gJ291dCcKLXN0YXRpYyB2b2lkIEhpc3RvZ3JhbUFkZChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBQSVhfT1JfQ09QWV9DT0RFU19NQVg7ICsraSkgewotICAgIG91dC0+bGl0ZXJhbF9baV0gKz0gaW4tPmxpdGVyYWxfW2ldOwotICB9Ci0gIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgewotICAgIG91dC0+ZGlzdGFuY2VfW2ldICs9IGluLT5kaXN0YW5jZV9baV07Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7Ci0gICAgb3V0LT5yZWRfW2ldICs9IGluLT5yZWRfW2ldOwotICAgIG91dC0+Ymx1ZV9baV0gKz0gaW4tPmJsdWVfW2ldOwotICAgIG91dC0+YWxwaGFfW2ldICs9IGluLT5hbHBoYV9baV07Ci0gIH0KLX0KLQotLy8gUGVyZm9ybXMgb3V0ID0gYSArIGIsIGNvbXB1dGluZyB0aGUgY29zdCBDKGErYikgLSBDKGEpIC0gQyhiKSB3aGlsZSBjb21wYXJpbmcKLS8vIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWUgJ2Nvc3RfdGhyZXNob2xkJy4gVGhlIHNjb3JlIHJldHVybmVkIGlzCi0vLyAgU2NvcmUgPSBDKGErYikgLSBDKGEpIC0gQyhiKSwgd2hlcmUgQyhhKSArIEMoYikgaXMga25vd24gYW5kIGZpeGVkLgotLy8gU2luY2UgdGhlIHByZXZpb3VzIHNjb3JlIHBhc3NlZCBpcyAnY29zdF90aHJlc2hvbGQnLCB3ZSBvbmx5IG5lZWQgdG8gY29tcGFyZQotLy8gdGhlIHBhcnRpYWwgY29zdCBhZ2FpbnN0ICdjb3N0X3RocmVzaG9sZCArIEMoYSkgKyBDKGIpJyB0byBwb3NzaWJseSBiYWlsLW91dAotLy8gZWFybHkuCi1zdGF0aWMgZG91YmxlIEhpc3RvZ3JhbUFkZEV2YWwoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29zdF90aHJlc2hvbGQpIHsKLSAgZG91YmxlIGNvc3QgPSAwOwotICBjb25zdCBkb3VibGUgc3VtX2Nvc3QgPSBhLT5iaXRfY29zdF8gKyBiLT5iaXRfY29zdF87Ci0gIGludCBpOwotCi0gIGNvc3RfdGhyZXNob2xkICs9IHN1bV9jb3N0OwotCi0gIC8vIHBhbGV0dGVfY29kZV9iaXRzXyBpcyBwYXJ0IG9mIHRoZSBjb3N0IGV2YWx1YXRpb24gZm9yIGxpdGVyYWxfLgotICAvLyBUT0RPKHNrYWwpOiByZW1vdmUvc2ltcGxpZnkgdGhpcyBwYWxldHRlX2NvZGVfYml0c18/Ci0gIG91dC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0KLSAgICAgIChhLT5wYWxldHRlX2NvZGVfYml0c18gPiBiLT5wYWxldHRlX2NvZGVfYml0c18pID8gYS0+cGFsZXR0ZV9jb2RlX2JpdHNfIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+cGFsZXR0ZV9jb2RlX2JpdHNfOwotICBmb3IgKGkgPSAwOyBpIDwgUElYX09SX0NPUFlfQ09ERVNfTUFYOyArK2kpIHsKLSAgICBvdXQtPmxpdGVyYWxfW2ldID0gYS0+bGl0ZXJhbF9baV0gKyBiLT5saXRlcmFsX1tpXTsKLSAgfQotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+bGl0ZXJhbF8sIFZQOExIaXN0b2dyYW1OdW1Db2RlcyhvdXQpKTsKLSAgY29zdCArPSBFeHRyYUNvc3Qob3V0LT5saXRlcmFsXyArIDI1NiwgTlVNX0xFTkdUSF9DT0RFUyk7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgb3V0LT5yZWRfW2ldID0gYS0+cmVkX1tpXSArIGItPnJlZF9baV07Ci0gIGNvc3QgKz0gUG9wdWxhdGlvbkNvc3Qob3V0LT5yZWRfLCAyNTYpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIG91dC0+Ymx1ZV9baV0gPSBhLT5ibHVlX1tpXSArIGItPmJsdWVfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+Ymx1ZV8sIDI1Nik7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgewotICAgIG91dC0+ZGlzdGFuY2VfW2ldID0gYS0+ZGlzdGFuY2VfW2ldICsgYi0+ZGlzdGFuY2VfW2ldOwotICB9Ci0gIGNvc3QgKz0gUG9wdWxhdGlvbkNvc3Qob3V0LT5kaXN0YW5jZV8sIE5VTV9ESVNUQU5DRV9DT0RFUyk7Ci0gIGNvc3QgKz0gRXh0cmFDb3N0KG91dC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIG91dC0+YWxwaGFfW2ldID0gYS0+YWxwaGFfW2ldICsgYi0+YWxwaGFfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KG91dC0+YWxwaGFfLCAyNTYpOwotCi0gIG91dC0+Yml0X2Nvc3RfID0gY29zdDsKLSAgcmV0dXJuIGNvc3QgLSBzdW1fY29zdDsKLX0KLQotLy8gU2FtZSBhcyBIaXN0b2dyYW1BZGRFdmFsKCksIGV4Y2VwdCB0aGF0IHRoZSByZXN1bHRpbmcgaGlzdG9ncmFtCi0vLyBpcyBub3Qgc3RvcmVkLiBPbmx5IHRoZSBjb3N0IEMoYStiKSAtIEMoYSkgaXMgZXZhbHVhdGVkLiBXZSBvbWl0Ci0vLyB0aGUgdGVybSBDKGIpIHdoaWNoIGlzIGNvbnN0YW50IG92ZXIgYWxsIHRoZSBldmFsdWF0aW9ucy4KLXN0YXRpYyBkb3VibGUgSGlzdG9ncmFtQWRkVGhyZXNoKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7Ci0gIGludCB0bXBbUElYX09SX0NPUFlfQ09ERVNfTUFYXTsgIC8vIDw9IG1heCBzdG9yYWdlIHdlJ2xsIG5lZWQKLSAgaW50IGk7Ci0gIGRvdWJsZSBjb3N0ID0gLWEtPmJpdF9jb3N0XzsKLQotICBmb3IgKGkgPSAwOyBpIDwgUElYX09SX0NPUFlfQ09ERVNfTUFYOyArK2kpIHsKLSAgICB0bXBbaV0gPSBhLT5saXRlcmFsX1tpXSArIGItPmxpdGVyYWxfW2ldOwotICB9Ci0gIC8vIG5vdGUgdGhhdCB0aGUgdGVzdHMgYXJlIG9yZGVyZWQgc28gdGhhdCB0aGUgdXN1YWxseSBsYXJnZXN0Ci0gIC8vIGNvc3Qgc2hhcmVzIGNvbWUgZmlyc3QuCi0gIGNvc3QgKz0gUG9wdWxhdGlvbkNvc3QodG1wLCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoYSkpOwotICBjb3N0ICs9IEV4dHJhQ29zdCh0bXAgKyAyNTYsIE5VTV9MRU5HVEhfQ09ERVMpOwotICBpZiAoY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gY29zdDsKLQotICBmb3IgKGkgPSAwOyBpIDwgMjU2OyArK2kpIHRtcFtpXSA9IGEtPnJlZF9baV0gKyBiLT5yZWRfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgMjU2KTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB0bXBbaV0gPSBhLT5ibHVlX1tpXSArIGItPmJsdWVfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgMjU2KTsKLSAgaWYgKGNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIGNvc3Q7Ci0KLSAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNUQU5DRV9DT0RFUzsgKytpKSB7Ci0gICAgdG1wW2ldID0gYS0+ZGlzdGFuY2VfW2ldICsgYi0+ZGlzdGFuY2VfW2ldOwotICB9Ci0gIGNvc3QgKz0gUG9wdWxhdGlvbkNvc3QodG1wLCBOVU1fRElTVEFOQ0VfQ09ERVMpOwotICBjb3N0ICs9IEV4dHJhQ29zdCh0bXAsIE5VTV9ESVNUQU5DRV9DT0RFUyk7Ci0gIGlmIChjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiBjb3N0OwotCi0gIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgdG1wW2ldID0gYS0+YWxwaGFfW2ldICsgYi0+YWxwaGFfW2ldOwotICBjb3N0ICs9IFBvcHVsYXRpb25Db3N0KHRtcCwgMjU2KTsKLQotICByZXR1cm4gY29zdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHZvaWQgSGlzdG9ncmFtQnVpbGRJbWFnZShpbnQgeHNpemUsIGludCBoaXN0b19iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCBiYWNrd2FyZF9yZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZSkgewotICBpbnQgaTsKLSAgaW50IHggPSAwLCB5ID0gMDsKLSAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gVlA4TFN1YlNhbXBsZVNpemUoeHNpemUsIGhpc3RvX2JpdHMpOwotICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlLT5oaXN0b2dyYW1zOwotICBTQl9EQ0hFQ0soaGlzdG9fYml0cyA+IDApOwotICBmb3IgKGkgPSAwOyBpIDwgYmFja3dhcmRfcmVmcy0+c2l6ZTsgKytpKSB7Ci0gICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gJmJhY2t3YXJkX3JlZnMtPnJlZnNbaV07Ci0gICAgY29uc3QgaW50IGl4ID0gKHkgPj4gaGlzdG9fYml0cykgKiBoaXN0b194c2l6ZSArICh4ID4+IGhpc3RvX2JpdHMpOwotICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG9ncmFtc1tpeF0sIHYpOwotICAgIHggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOwotICAgIHdoaWxlICh4ID49IHhzaXplKSB7Ci0gICAgICB4IC09IHhzaXplOwotICAgICAgKyt5OwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdWludDMyX3QgTXlSYW5kKHVpbnQzMl90ICpzZWVkKSB7Ci0gICpzZWVkICo9IDE2ODA3VTsKLSAgaWYgKCpzZWVkID09IDApIHsKLSAgICAqc2VlZCA9IDE7Ci0gIH0KLSAgcmV0dXJuICpzZWVkOwotfQotCi1zdGF0aWMgaW50IEhpc3RvZ3JhbUNvbWJpbmUoY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3V0LCBpbnQgaXRlcl9tdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFpcnMsIGludCBudW1fdHJpZXNfbm9fc3VjY2VzcykgewotICBpbnQgb2sgPSAwOwotICBpbnQgaSwgaXRlcjsKLSAgdWludDMyX3Qgc2VlZCA9IDA7Ci0gIGludCB0cmllc193aXRoX25vX3N1Y2Nlc3MgPSAwOwotICBpbnQgb3V0X3NpemUgPSBpbi0+c2l6ZTsKLSAgY29uc3QgaW50IG91dGVyX2l0ZXJzID0gaW4tPnNpemUgKiBpdGVyX211bHQ7Ci0gIGNvbnN0IGludCBtaW5fY2x1c3Rlcl9zaXplID0gMjsKLSAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG9zID0gKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoMiAqIHNpemVvZigqaGlzdG9zKSk7Ci0gIFZQOExIaXN0b2dyYW0qIGN1cl9jb21ibyA9IGhpc3RvcyArIDA7ICAgIC8vIHRyaWFsIG1lcmdlZCBoaXN0b2dyYW0KLSAgVlA4TEhpc3RvZ3JhbSogYmVzdF9jb21ibyA9IGhpc3RvcyArIDE7ICAgLy8gYmVzdCBtZXJnZWQgaGlzdG9ncmFtIHNvIGZhcgotICBpZiAoaGlzdG9zID09IE5VTEwpIGdvdG8gRW5kOwotCi0gIC8vIENvcHkgaGlzdG9ncmFtcyBmcm9tIGluW10gdG8gb3V0W10uCi0gIFNCX0RDSEVDSyhpbi0+c2l6ZSA8PSBvdXQtPnNpemUpOwotICBmb3IgKGkgPSAwOyBpIDwgaW4tPnNpemU7ICsraSkgewotICAgIGluLT5oaXN0b2dyYW1zW2ldLT5iaXRfY29zdF8gPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGluLT5oaXN0b2dyYW1zW2ldKTsKLSAgICAqb3V0LT5oaXN0b2dyYW1zW2ldID0gKmluLT5oaXN0b2dyYW1zW2ldOwotICB9Ci0KLSAgLy8gQ29sbGFwc2Ugc2ltaWxhciBoaXN0b2dyYW1zIGluICdvdXQnLgotICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgb3V0ZXJfaXRlcnMgJiYgb3V0X3NpemUgPj0gbWluX2NsdXN0ZXJfc2l6ZTsgKytpdGVyKSB7Ci0gICAgZG91YmxlIGJlc3RfY29zdF9kaWZmID0gMC47Ci0gICAgaW50IGJlc3RfaWR4MSA9IC0xLCBiZXN0X2lkeDIgPSAxOwotICAgIGludCBqOwotICAgIGNvbnN0IGludCBudW1fdHJpZXMgPSAobnVtX3BhaXJzIDwgb3V0X3NpemUpID8gbnVtX3BhaXJzIDogb3V0X3NpemU7Ci0gICAgc2VlZCArPSBpdGVyOwotICAgIGZvciAoaiA9IDA7IGogPCBudW1fdHJpZXM7ICsraikgewotICAgICAgZG91YmxlIGN1cnJfY29zdF9kaWZmOwotICAgICAgLy8gQ2hvb3NlIHR3byBoaXN0b2dyYW1zIGF0IHJhbmRvbSBhbmQgdHJ5IHRvIGNvbWJpbmUgdGhlbS4KLSAgICAgIGNvbnN0IHVpbnQzMl90IGlkeDEgPSBNeVJhbmQoJnNlZWQpICUgb3V0X3NpemU7Ci0gICAgICBjb25zdCB1aW50MzJfdCB0bXAgPSAoaiAmIDcpICsgMTsKLSAgICAgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSAodG1wIDwgMykgPyB0bXAgOiBNeVJhbmQoJnNlZWQpICUgKG91dF9zaXplIC0gMSk7Ci0gICAgICBjb25zdCB1aW50MzJfdCBpZHgyID0gKGlkeDEgKyBkaWZmICsgMSkgJSBvdXRfc2l6ZTsKLSAgICAgIGlmIChpZHgxID09IGlkeDIpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAvLyBDYWxjdWxhdGUgY29zdCByZWR1Y3Rpb24gb24gY29tYmluaW5nLgotICAgICAgY3Vycl9jb3N0X2RpZmYgPSBIaXN0b2dyYW1BZGRFdmFsKG91dC0+aGlzdG9ncmFtc1tpZHgxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtPmhpc3RvZ3JhbXNbaWR4Ml0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvbWJvLCBiZXN0X2Nvc3RfZGlmZik7Ci0gICAgICBpZiAoY3Vycl9jb3N0X2RpZmYgPCBiZXN0X2Nvc3RfZGlmZikgeyAgICAvLyBmb3VuZCBhIGJldHRlciBwYWlyPwotICAgICAgICB7ICAgICAvLyBzd2FwIGN1ci9iZXN0IGNvbWJvIGhpc3RvZ3JhbXMKLSAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCB0bXBfaGlzdG8gPSBjdXJfY29tYm87Ci0gICAgICAgICAgY3VyX2NvbWJvID0gYmVzdF9jb21ibzsKLSAgICAgICAgICBiZXN0X2NvbWJvID0gdG1wX2hpc3RvOwotICAgICAgICB9Ci0gICAgICAgIGJlc3RfY29zdF9kaWZmID0gY3Vycl9jb3N0X2RpZmY7Ci0gICAgICAgIGJlc3RfaWR4MSA9IGlkeDE7Ci0gICAgICAgIGJlc3RfaWR4MiA9IGlkeDI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGJlc3RfaWR4MSA+PSAwKSB7Ci0gICAgICAqb3V0LT5oaXN0b2dyYW1zW2Jlc3RfaWR4MV0gPSAqYmVzdF9jb21ibzsKLSAgICAgIC8vIHN3YXAgYmVzdF9pZHgyIHNsb3Qgd2l0aCBsYXN0IG9uZSAod2hpY2ggaXMgbm93IHVudXNlZCkKLSAgICAgIC0tb3V0X3NpemU7Ci0gICAgICBpZiAoYmVzdF9pZHgyICE9IG91dF9zaXplKSB7Ci0gICAgICAgIG91dC0+aGlzdG9ncmFtc1tiZXN0X2lkeDJdID0gb3V0LT5oaXN0b2dyYW1zW291dF9zaXplXTsKLSAgICAgICAgb3V0LT5oaXN0b2dyYW1zW291dF9zaXplXSA9IE5VTEw7ICAgLy8ganVzdCBmb3Igc2FuaXR5IGNoZWNrLgotICAgICAgfQotICAgICAgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKLSAgICB9Ci0gICAgaWYgKCsrdHJpZXNfd2l0aF9ub19zdWNjZXNzID49IG51bV90cmllc19ub19zdWNjZXNzKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgb3V0LT5zaXplID0gb3V0X3NpemU7Ci0gIG9rID0gMTsKLQotIEVuZDoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3Rvcyk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhpc3RvZ3JhbSByZWZpbmVtZW50Ci0KLS8vIFdoYXQgaXMgdGhlIGJpdCBjb3N0IG9mIG1vdmluZyBzcXVhcmVfaGlzdG9ncmFtIGZyb20gY3VyX3N5bWJvbCB0byBjYW5kaWRhdGUuCi1zdGF0aWMgZG91YmxlIEhpc3RvZ3JhbURpc3RhbmNlKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHNxdWFyZV9oaXN0b2dyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGNhbmRpZGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkKSB7Ci0gIHJldHVybiBIaXN0b2dyYW1BZGRUaHJlc2goY2FuZGlkYXRlLCBzcXVhcmVfaGlzdG9ncmFtLCBjb3N0X3RocmVzaG9sZCk7Ci19Ci0KLS8vIEZpbmQgdGhlIGJlc3QgJ291dCcgaGlzdG9ncmFtIGZvciBlYWNoIG9mIHRoZSAnaW4nIGhpc3RvZ3JhbXMuCi0vLyBOb3RlOiB3ZSBhc3N1bWUgdGhhdCBvdXRbXS0+Yml0X2Nvc3RfIGlzIGFscmVhZHkgdXAtdG8tZGF0ZS4KLXN0YXRpYyB2b2lkIEhpc3RvZ3JhbVJlbWFwKGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3Qgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IHN5bWJvbHMpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBpbi0+c2l6ZTsgKytpKSB7Ci0gICAgaW50IGJlc3Rfb3V0ID0gMDsKLSAgICBkb3VibGUgYmVzdF9iaXRzID0KLSAgICAgICAgSGlzdG9ncmFtRGlzdGFuY2UoaW4tPmhpc3RvZ3JhbXNbaV0sIG91dC0+aGlzdG9ncmFtc1swXSwgMS5lMzgpOwotICAgIGludCBrOwotICAgIGZvciAoayA9IDE7IGsgPCBvdXQtPnNpemU7ICsraykgewotICAgICAgY29uc3QgZG91YmxlIGN1cl9iaXRzID0KLSAgICAgICAgICBIaXN0b2dyYW1EaXN0YW5jZShpbi0+aGlzdG9ncmFtc1tpXSwgb3V0LT5oaXN0b2dyYW1zW2tdLCBiZXN0X2JpdHMpOwotICAgICAgaWYgKGN1cl9iaXRzIDwgYmVzdF9iaXRzKSB7Ci0gICAgICAgIGJlc3RfYml0cyA9IGN1cl9iaXRzOwotICAgICAgICBiZXN0X291dCA9IGs7Ci0gICAgICB9Ci0gICAgfQotICAgIHN5bWJvbHNbaV0gPSBiZXN0X291dDsKLSAgfQotCi0gIC8vIFJlY29tcHV0ZSBlYWNoIG91dCBiYXNlZCBvbiByYXcgYW5kIHN5bWJvbHMuCi0gIGZvciAoaSA9IDA7IGkgPCBvdXQtPnNpemU7ICsraSkgewotICAgIEhpc3RvZ3JhbUNsZWFyKG91dC0+aGlzdG9ncmFtc1tpXSk7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IGluLT5zaXplOyArK2kpIHsKLSAgICBIaXN0b2dyYW1BZGQoaW4tPmhpc3RvZ3JhbXNbaV0sIG91dC0+aGlzdG9ncmFtc1tzeW1ib2xzW2ldXSk7Ci0gIH0KLX0KLQotaW50IFZQOExHZXRIaXN0b0ltYWdlU3ltYm9scyhpbnQgeHNpemUsIGludCB5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBoaXN0b19iaXRzLCBpbnQgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBjb25zdCBoaXN0b2dyYW1fc3ltYm9scykgewotICBpbnQgb2sgPSAwOwotICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUoeHNpemUsIGhpc3RvX2JpdHMpIDogMTsKLSAgY29uc3QgaW50IGhpc3RvX3lzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHlzaXplLCBoaXN0b19iaXRzKSA6IDE7Ci0gIGNvbnN0IGludCBoaXN0b19pbWFnZV9yYXdfc2l6ZSA9IGhpc3RvX3hzaXplICogaGlzdG9feXNpemU7Ci0KLSAgLy8gSGV1cmlzdGljIHBhcmFtcyBmb3IgSGlzdG9ncmFtQ29tYmluZSgpLgotICBjb25zdCBpbnQgbnVtX3RyaWVzX25vX3N1Y2Nlc3MgPSA4ICsgKHF1YWxpdHkgPj4gMSk7Ci0gIGNvbnN0IGludCBpdGVyX211bHQgPSAocXVhbGl0eSA8IDI3KSA/IDEgOiAxICsgKChxdWFsaXR5IC0gMjcpID4+IDQpOwotICBjb25zdCBpbnQgbnVtX3BhaXJzID0gKHF1YWxpdHkgPCAyNSkgPyAxMCA6ICg1ICogcXVhbGl0eSkgPj4gMzsKLQotICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9vdXQgPQotICAgICAgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KGhpc3RvX2ltYWdlX3Jhd19zaXplLCBjYWNoZV9iaXRzKTsKLSAgaWYgKGltYWdlX291dCA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAvLyBCdWlsZCBoaXN0b2dyYW0gaW1hZ2UuCi0gIEhpc3RvZ3JhbUJ1aWxkSW1hZ2UoeHNpemUsIGhpc3RvX2JpdHMsIHJlZnMsIGltYWdlX291dCk7Ci0gIC8vIENvbGxhcHNlIHNpbWlsYXIgaGlzdG9ncmFtcy4KLSAgaWYgKCFIaXN0b2dyYW1Db21iaW5lKGltYWdlX291dCwgaW1hZ2VfaW4sIGl0ZXJfbXVsdCwgbnVtX3BhaXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RyaWVzX25vX3N1Y2Nlc3MpKSB7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotICAvLyBGaW5kIHRoZSBvcHRpbWFsIG1hcCBmcm9tIG9yaWdpbmFsIGhpc3RvZ3JhbXMgdG8gdGhlIGZpbmFsIG9uZXMuCi0gIEhpc3RvZ3JhbVJlbWFwKGltYWdlX291dCwgaW1hZ2VfaW4sIGhpc3RvZ3JhbV9zeW1ib2xzKTsKLSAgb2sgPSAxOwotCi1FcnJvcjoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGltYWdlX291dCk7Ci0gIHJldHVybiBvazsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9oaXN0b2dyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA4MzFhNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaGlzdG9ncmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKLS8vCi0vLyBNb2RlbHMgdGhlIGhpc3RvZ3JhbXMgb2YgbGl0ZXJhbCBhbmQgZGlzdGFuY2UgY29kZXMuCi0KLSNpZm5kZWYgV0VCUF9FTkNfSElTVE9HUkFNX0hfCi0jZGVmaW5lIFdFQlBfRU5DX0hJU1RPR1JBTV9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gQSBzaW1wbGUgY29udGFpbmVyIGZvciBoaXN0b2dyYW1zIG9mIGRhdGEuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIC8vIGxpdGVyYWxfIGNvbnRhaW5zIGdyZWVuIGxpdGVyYWwsIHBhbGV0dGUtY29kZSBhbmQKLSAgLy8gY29weS1sZW5ndGgtcHJlZml4IGhpc3RvZ3JhbQotICBpbnQgbGl0ZXJhbF9bUElYX09SX0NPUFlfQ09ERVNfTUFYXTsKLSAgaW50IHJlZF9bMjU2XTsKLSAgaW50IGJsdWVfWzI1Nl07Ci0gIGludCBhbHBoYV9bMjU2XTsKLSAgLy8gQmFja3dhcmQgcmVmZXJlbmNlIHByZWZpeC1jb2RlIGhpc3RvZ3JhbS4KLSAgaW50IGRpc3RhbmNlX1tOVU1fRElTVEFOQ0VfQ09ERVNdOwotICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHNfOwotICBkb3VibGUgYml0X2Nvc3RfOyAgIC8vIGNhY2hlZCB2YWx1ZSBvZiBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKHRoaXMpCi19IFZQOExIaXN0b2dyYW07Ci0KLS8vIENvbGxlY3Rpb24gb2YgaGlzdG9ncmFtcyB3aXRoIGZpeGVkIGNhcGFjaXR5LCBhbGxvY2F0ZWQgYXMgb25lCi0vLyBiaWcgbWVtb3J5IGNodW5rLiBDYW4gYmUgZGVzdHJveWVkIGJ5IHNpbXBseSBjYWxsaW5nICdTYk1lbW9yeURlYWxsb2NhdGUoKScuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCBzaXplOyAgICAgICAgIC8vIG51bWJlciBvZiBzbG90cyBjdXJyZW50bHkgaW4gdXNlCi0gIGludCBtYXhfc2l6ZTsgICAgIC8vIG1heGltdW0gY2FwYWNpdHkKLSAgVlA4TEhpc3RvZ3JhbSoqIGhpc3RvZ3JhbXM7Ci19IFZQOExIaXN0b2dyYW1TZXQ7Ci0KLS8vIENyZWF0ZSB0aGUgaGlzdG9ncmFtLgotLy8KLS8vIFRoZSBpbnB1dCBkYXRhIGlzIHRoZSBQaXhPckNvcHkgZGF0YSwgd2hpY2ggbW9kZWxzIHRoZSBsaXRlcmFscywgc3RvcAotLy8gY29kZXMgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZXMgKGJvdGggZGlzdGFuY2VzIGFuZCBsZW5ndGhzKS4gIEFsc286IGlmCi0vLyBwYWxldHRlX2NvZGVfYml0cyBpcyA+PSAwLCBpbml0aWFsaXplIHRoZSBoaXN0b2dyYW0gd2l0aCB0aGlzIHZhbHVlLgotdm9pZCBWUDhMSGlzdG9ncmFtQ3JlYXRlKFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpOwotCi0vLyBTZXQgdGhlIHBhbGV0dGVfY29kZV9iaXRzIGFuZCByZXNldCB0aGUgc3RhdHMuCi12b2lkIFZQOExIaXN0b2dyYW1Jbml0KFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsIGludCBwYWxldHRlX2NvZGVfYml0cyk7Ci0KLS8vIENvbGxlY3QgYWxsIHRoZSByZWZlcmVuY2VzIGludG8gYSBoaXN0b2dyYW0gKHdpdGhvdXQgcmVzZXQpCi12b2lkIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byk7Ci0KLS8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIHBvaW50ZXIgdG8gaGlzdG9ncmFtcywgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAotLy8gdXNpbmcgJ2NhY2hlX2JpdHMnLiBSZXR1cm4gTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLVZQOExIaXN0b2dyYW1TZXQqIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbnQgc2l6ZSwgaW50IGNhY2hlX2JpdHMpOwotCi0vLyBBY2N1bXVsYXRlIGEgdG9rZW4gJ3YnIGludG8gYSBoaXN0b2dyYW0uCi12b2lkIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2KTsKLQotLy8gRXN0aW1hdGUgaG93IG1hbnkgYml0cyB0aGUgY29tYmluZWQgZW50cm9weSBvZiBsaXRlcmFscyBhbmQgZGlzdGFuY2UKLS8vIGFwcHJveGltYXRlbHkgbWFwcyB0by4KLWRvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApOwotCi0vLyBUaGlzIGZ1bmN0aW9uIGVzdGltYXRlcyB0aGUgY29zdCBpbiBiaXRzIGV4Y2x1ZGluZyB0aGUgYml0cyBuZWVkZWQgdG8KLS8vIHJlcHJlc2VudCB0aGUgZW50cm9weSBjb2RlIGl0c2VsZi4KLWRvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzQnVsayhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBwKTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgewotICByZXR1cm4gMjU2ICsgTlVNX0xFTkdUSF9DT0RFUyArCi0gICAgICAoKHAtPnBhbGV0dGVfY29kZV9iaXRzXyA+IDApID8gKDEgPDwgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfKSA6IDApOwotfQotCi0vLyBCdWlsZHMgdGhlIGhpc3RvZ3JhbSBpbWFnZS4KLWludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgaGlzdG9ncmFtX2JpdHMsIGludCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vIFdFQlBfRU5DX0hJU1RPR1JBTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2xheWVyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvbGF5ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxOTRjOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvbGF5ZXIuYworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBFbmhhbmNlbWVudCBsYXllciAoZm9yIFlVVjQ0NC80MjIpCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBWUDhFbmNJbml0TGF5ZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIGVuYy0+dXNlX2xheWVyXyA9IChlbmMtPnBpY18tPnUwICE9IE5VTEwpOwotICBlbmMtPmxheWVyX2RhdGFfc2l6ZV8gPSAwOwotICBlbmMtPmxheWVyX2RhdGFfID0gTlVMTDsKLSAgaWYgKGVuYy0+dXNlX2xheWVyXykgewotICAgIFZQOEJpdFdyaXRlckluaXQoJmVuYy0+bGF5ZXJfYndfLCBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyAqIDMpOwotICB9Ci19Ci0KLXZvaWQgVlA4RW5jQ29kZUxheWVyQmxvY2soVlA4RW5jSXRlcmF0b3IqIGl0KSB7Ci0gICh2b2lkKWl0OyAgIC8vIHJlbW92ZSBhIHdhcm5pbmcKLX0KLQotaW50IFZQOEVuY0ZpbmlzaExheWVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpZiAoZW5jLT51c2VfbGF5ZXJfKSB7Ci0gICAgZW5jLT5sYXllcl9kYXRhXyA9IFZQOEJpdFdyaXRlckZpbmlzaCgmZW5jLT5sYXllcl9id18pOwotICAgIGVuYy0+bGF5ZXJfZGF0YV9zaXplXyA9IFZQOEJpdFdyaXRlclNpemUoJmVuYy0+bGF5ZXJfYndfKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotdm9pZCBWUDhFbmNEZWxldGVMYXllcihWUDhFbmNvZGVyKiBlbmMpIHsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYy0+bGF5ZXJfZGF0YV8pOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9waWN0dXJlLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcGljdHVyZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTRiZjdjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9waWN0dXJlLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBXZWJQUGljdHVyZSB1dGlsczogY29sb3JzcGFjZSBjb252ZXJzaW9uLCBjcm9wLCAuLi4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLSNpbmNsdWRlICIuLi91dGlscy9yZXNjYWxlci5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vZHNwL2RzcC5oIgotI2luY2x1ZGUgIi4uL2RzcC95dXYuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgSEFMVkUoeCkgKCgoeCkgKyAxKSA+PiAxKQotI2RlZmluZSBJU19ZVVZfQ1NQKGNzcCwgWVVWX0NTUCkgKCgoY3NwKSAmIFdFQlBfQ1NQX1VWX01BU0spID09IChZVVZfQ1NQKSkKLQotc3RhdGljIGNvbnN0IHVuaW9uIHsKLSAgdWludDMyX3QgYXJnYjsKLSAgdWludDhfdCAgYnl0ZXNbNF07Ci19IHRlc3RfZW5kaWFuID0geyAweGZmMDAwMDAwdSB9OwotI2RlZmluZSBBTFBIQV9JU19MQVNUICh0ZXN0X2VuZGlhbi5ieXRlc1szXSA9PSAweGZmKQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUFBpY3R1cmUKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBXZWJQUGljdHVyZUFsbG9jKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKLSAgICBjb25zdCBXZWJQRW5jQ1NQIHV2X2NzcCA9IHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUOwotICAgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICAgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0KLSAgICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgICBjb25zdCBpbnQgeV9zdHJpZGUgPSB3aWR0aDsKLSAgICAgIGNvbnN0IGludCB1dl93aWR0aCA9IEhBTFZFKHdpZHRoKTsKLSAgICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSBIQUxWRShoZWlnaHQpOwotICAgICAgY29uc3QgaW50IHV2X3N0cmlkZSA9IHV2X3dpZHRoOwotICAgICAgaW50IHV2MF9zdHJpZGUgPSAwOwotICAgICAgaW50IGFfd2lkdGgsIGFfc3RyaWRlOwotICAgICAgdWludDY0X3QgeV9zaXplLCB1dl9zaXplLCB1djBfc2l6ZSwgYV9zaXplLCB0b3RhbF9zaXplOwotICAgICAgdWludDhfdCogbWVtOwotCi0gICAgICAvLyBVL1YKLSAgICAgIHN3aXRjaCAodXZfY3NwKSB7Ci0gICAgICAgIGNhc2UgV0VCUF9ZVVY0MjA6Ci0gICAgICAgICAgYnJlYWs7Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICAgICAgY2FzZSBXRUJQX1lVVjQwMDogICAgLy8gZm9yIG5vdywgd2UnbGwganVzdCByZXNldCB0aGUgVS9WIHNhbXBsZXMKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXRUJQX1lVVjQyMjoKLSAgICAgICAgICB1djBfc3RyaWRlID0gdXZfd2lkdGg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV0VCUF9ZVVY0NDQ6Ci0gICAgICAgICAgdXYwX3N0cmlkZSA9IHdpZHRoOwotICAgICAgICAgIGJyZWFrOwotI2VuZGlmCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICB1djBfc2l6ZSA9IGhlaWdodCAqIHV2MF9zdHJpZGU7Ci0KLSAgICAgIC8vIGFscGhhCi0gICAgICBhX3dpZHRoID0gaGFzX2FscGhhID8gd2lkdGggOiAwOwotICAgICAgYV9zdHJpZGUgPSBhX3dpZHRoOwotICAgICAgeV9zaXplID0gKHVpbnQ2NF90KXlfc3RyaWRlICogaGVpZ2h0OwotICAgICAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiB1dl9oZWlnaHQ7Ci0gICAgICBhX3NpemUgPSAgKHVpbnQ2NF90KWFfc3RyaWRlICogaGVpZ2h0OwotCi0gICAgICB0b3RhbF9zaXplID0geV9zaXplICsgYV9zaXplICsgMiAqIHV2X3NpemUgKyAyICogdXYwX3NpemU7Ci0KLSAgICAgIC8vIFNlY3VyaXR5IGFuZCB2YWxpZGF0aW9uIGNoZWNrcwotICAgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgICAgICAgICAvLyBsdW1hL2FscGhhIHBhcmFtIGVycm9yCi0gICAgICAgICAgdXZfd2lkdGggPCAwIHx8IHV2X2hlaWdodCA8IDApIHsgICAgIC8vIHUvdiBwYXJhbSBlcnJvcgotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlciBhbmQgYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpY3R1cmUpOyAgIC8vIGVyYXNlIHByZXZpb3VzIGJ1ZmZlcgotICAgICAgbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7Ci0gICAgICBpZiAobWVtID09IE5VTEwpIHJldHVybiAwOwotCi0gICAgICAvLyBGcm9tIG5vdyBvbiwgd2UncmUgaW4gdGhlIGNsZWFyLCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwuLi4KLSAgICAgIHBpY3R1cmUtPm1lbW9yeV8gPSAodm9pZCopbWVtOwotICAgICAgcGljdHVyZS0+eV9zdHJpZGUgID0geV9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT51dl9zdHJpZGUgPSB1dl9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT5hX3N0cmlkZSAgPSBhX3N0cmlkZTsKLSAgICAgIHBpY3R1cmUtPnV2MF9zdHJpZGUgPSB1djBfc3RyaWRlOwotICAgICAgLy8gVE9ETyhza2FsKTogd2UgY291bGQgYWxpZ24gdGhlIHkvdS92IHBsYW5lcyBhbmQgYWRqdXN0IHN0cmlkZS4KLSAgICAgIHBpY3R1cmUtPnkgPSBtZW07Ci0gICAgICBtZW0gKz0geV9zaXplOwotCi0gICAgICBwaWN0dXJlLT51ID0gbWVtOwotICAgICAgbWVtICs9IHV2X3NpemU7Ci0gICAgICBwaWN0dXJlLT52ID0gbWVtOwotICAgICAgbWVtICs9IHV2X3NpemU7Ci0KLSAgICAgIGlmIChhX3NpemUpIHsKLSAgICAgICAgcGljdHVyZS0+YSA9IG1lbTsKLSAgICAgICAgbWVtICs9IGFfc2l6ZTsKLSAgICAgIH0KLSAgICAgIGlmICh1djBfc2l6ZSkgewotICAgICAgICBwaWN0dXJlLT51MCA9IG1lbTsKLSAgICAgICAgbWVtICs9IHV2MF9zaXplOwotICAgICAgICBwaWN0dXJlLT52MCA9IG1lbTsKLSAgICAgICAgbWVtICs9IHV2MF9zaXplOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2b2lkKiBtZW1vcnk7Ci0gICAgICBjb25zdCB1aW50NjRfdCBhcmdiX3NpemUgPSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQ7Ci0gICAgICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIC8vIENsZWFyIHByZXZpb3VzIGJ1ZmZlciBhbmQgYWxsb2NhdGUgYSBuZXcgb25lLgotICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpY3R1cmUpOyAgIC8vIGVyYXNlIHByZXZpb3VzIGJ1ZmZlcgotICAgICAgbWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoYXJnYl9zaXplLCBzaXplb2YoKnBpY3R1cmUtPmFyZ2IpKTsKLSAgICAgIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICAgIC8vIFRPRE8oc2thbCk6IGFsaWduIHBsYW5lIHRvIGNhY2hlIGxpbmU/Ci0gICAgICBwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPSBtZW1vcnk7Ci0gICAgICBwaWN0dXJlLT5hcmdiID0gKHVpbnQzMl90KiltZW1vcnk7Ci0gICAgICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IHdpZHRoOwotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8gUmVtb3ZlIHJlZmVyZW5jZSB0byB0aGUgQVJHQiBidWZmZXIgKGRvZXNuJ3QgZnJlZSBhbnl0aGluZykuCi1zdGF0aWMgdm9pZCBQaWN0dXJlUmVzZXRBUkdCKFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIHBpY3R1cmUtPm1lbW9yeV9hcmdiXyA9IE5VTEw7Ci0gIHBpY3R1cmUtPmFyZ2IgPSBOVUxMOwotICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IDA7Ci19Ci0KLS8vIFJlbW92ZSByZWZlcmVuY2UgdG8gdGhlIFlVVkEgYnVmZmVyIChkb2Vzbid0IGZyZWUgYW55dGhpbmcpLgotc3RhdGljIHZvaWQgUGljdHVyZVJlc2V0WVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBwaWN0dXJlLT5tZW1vcnlfID0gTlVMTDsKLSAgcGljdHVyZS0+eSA9IHBpY3R1cmUtPnUgPSBwaWN0dXJlLT52ID0gcGljdHVyZS0+YSA9IE5VTEw7Ci0gIHBpY3R1cmUtPnUwID0gcGljdHVyZS0+djAgPSBOVUxMOwotICBwaWN0dXJlLT55X3N0cmlkZSA9IHBpY3R1cmUtPnV2X3N0cmlkZSA9IDA7Ci0gIHBpY3R1cmUtPmFfc3RyaWRlID0gMDsKLSAgcGljdHVyZS0+dXYwX3N0cmlkZSA9IDA7Ci19Ci0KLS8vIEdyYWIgdGhlICdzcGVjcycgKHdyaXRlciwgKm9wYXF1ZSwgd2lkdGgsIGhlaWdodC4uLikgZnJvbSAnc3JjJyBhbmQgY29weSB0aGVtCi0vLyBpbnRvICdkc3QnLiBNYXJrICdkc3QnIGFzIG5vdCBvd25pbmcgYW55IG1lbW9yeS4KLXN0YXRpYyB2b2lkIFdlYlBQaWN0dXJlR3JhYlNwZWNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7Ci0gIFNCX0RDSEVDSyhzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7Ci0gICpkc3QgPSAqc3JjOwotICBQaWN0dXJlUmVzZXRZVVZBKGRzdCk7Ci0gIFBpY3R1cmVSZXNldEFSR0IoZHN0KTsKLX0KLQotLy8gQWxsb2NhdGUgYSBuZXcgYXJnYiBidWZmZXIsIGRpc2NhcmRpbmcgYW55IGV4aXN0aW5nIG9uZSBhbmQgcHJlc2VydmluZwotLy8gdGhlIG90aGVyIFlVVihBKSBidWZmZXIuCi1zdGF0aWMgaW50IFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKLSAgV2ViUFBpY3R1cmUgdG1wOwotICBTYk1lbW9yeURlYWxsb2NhdGUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKLSAgUGljdHVyZVJlc2V0QVJHQihwaWN0dXJlKTsKLSAgcGljdHVyZS0+dXNlX2FyZ2IgPSAxOwotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhwaWN0dXJlLCAmdG1wKTsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSB7Ci0gICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7Ci0gIH0KLSAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gdG1wLm1lbW9yeV9hcmdiXzsKLSAgcGljdHVyZS0+YXJnYiA9IHRtcC5hcmdiOwotICBwaWN0dXJlLT5hcmdiX3N0cmlkZSA9IHRtcC5hcmdiX3N0cmlkZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLS8vIFJlbGVhc2UgbWVtb3J5IG93bmVkIGJ5ICdwaWN0dXJlJyAoYm90aCBZVVYgYW5kIEFSR0IgYnVmZmVycykuCi12b2lkIFdlYlBQaWN0dXJlRnJlZShXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHBpY3R1cmUtPm1lbW9yeV8pOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShwaWN0dXJlLT5tZW1vcnlfYXJnYl8pOwotICAgIFBpY3R1cmVSZXNldFlVVkEocGljdHVyZSk7Ci0gICAgUGljdHVyZVJlc2V0QVJHQihwaWN0dXJlKTsKLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUGljdHVyZSBjb3B5aW5nCi0KLS8vIE5vdCB3b3J0aCBtb3ZpbmcgdG8gZHNwL2VuYy5jIChvbmx5IHVzZWQgaGVyZSkuCi1zdGF0aWMgdm9pZCBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgd2hpbGUgKGhlaWdodC0tID4gMCkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgd2lkdGgpOwotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgIGRzdCArPSBkc3Rfc3RyaWRlOwotICB9Ci19Ci0KLS8vIEFkanVzdCB0b3AtbGVmdCBjb3JuZXIgdG8gY2hyb21hIHNhbXBsZSBwb3NpdGlvbi4KLXN0YXRpYyB2b2lkIFNuYXBUb3BMZWZ0UG9zaXRpb24oY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0LCBpbnQqIGNvbnN0IHRvcCkgewotICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKLSAgICBjb25zdCBpbnQgaXNfeXV2NDIyID0gSVNfWVVWX0NTUChwaWMtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIyKTsKLSAgICBpZiAoSVNfWVVWX0NTUChwaWMtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIwKSB8fCBpc195dXY0MjIpIHsKLSAgICAgICpsZWZ0ICY9IH4xOwotICAgICAgaWYgKCFpc195dXY0MjIpICp0b3AgJj0gfjE7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEFkanVzdCB0b3AtbGVmdCBjb3JuZXIgYW5kIHZlcmlmeSB0aGF0IHRoZSBzdWItcmVjdGFuZ2xlIGlzIHZhbGlkLgotc3RhdGljIGludCBBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlZnQsIGludCogY29uc3QgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgU25hcFRvcExlZnRQb3NpdGlvbihwaWMsIGxlZnQsIHRvcCk7Ci0gIGlmICgoKmxlZnQpIDwgMCB8fCAoKnRvcCkgPCAwKSByZXR1cm4gMDsKLSAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOwotICBpZiAoKCpsZWZ0KSArIHdpZHRoID4gcGljLT53aWR0aCkgcmV0dXJuIDA7Ci0gIGlmICgoKnRvcCkgKyBoZWlnaHQgPiBwaWMtPmhlaWdodCkgcmV0dXJuIDA7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpIHsKLSAgaWYgKHNyYyA9PSBOVUxMIHx8IGRzdCA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHNyYyA9PSBkc3QpIHJldHVybiAxOwotCi0gIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKGRzdCkpIHJldHVybiAwOwotCi0gIGlmICghc3JjLT51c2VfYXJnYikgewotICAgIENvcHlQbGFuZShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgIGRzdC0+eSwgZHN0LT55X3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgIENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICBkc3QtPnUsIGRzdC0+dXZfc3RyaWRlLCBIQUxWRShkc3QtPndpZHRoKSwgSEFMVkUoZHN0LT5oZWlnaHQpKTsKLSAgICBDb3B5UGxhbmUoc3JjLT52LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgZHN0LT52LCBkc3QtPnV2X3N0cmlkZSwgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7Ci0gICAgaWYgKGRzdC0+YSAhPSBOVUxMKSAgewotICAgICAgQ29weVBsYW5lKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPmEsIGRzdC0+YV9zdHJpZGUsIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoZHN0LT51MCAhPSBOVUxMKSAgewotICAgICAgaW50IHV2MF93aWR0aCA9IHNyYy0+d2lkdGg7Ci0gICAgICBpZiAoSVNfWVVWX0NTUChkc3QtPmNvbG9yc3BhY2UsIFdFQlBfWVVWNDIyKSkgewotICAgICAgICB1djBfd2lkdGggPSBIQUxWRSh1djBfd2lkdGgpOwotICAgICAgfQotICAgICAgQ29weVBsYW5lKHNyYy0+dTAsIHNyYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPnUwLCBkc3QtPnV2MF9zdHJpZGUsIHV2MF93aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgICAgQ29weVBsYW5lKHNyYy0+djAsIHNyYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICBkc3QtPnYwLCBkc3QtPnV2MF9zdHJpZGUsIHV2MF93aWR0aCwgZHN0LT5oZWlnaHQpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIENvcHlQbGFuZSgoY29uc3QgdWludDhfdCopc3JjLT5hcmdiLCA0ICogc3JjLT5hcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdC0+YXJnYiwgNCAqIGRzdC0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgIDQgKiBkc3QtPndpZHRoLCBkc3QtPmhlaWdodCk7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBXZWJQUGljdHVyZUlzVmlldyhjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSkgewotICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKHBpY3R1cmUtPnVzZV9hcmdiKSB7Ci0gICAgcmV0dXJuIChwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPT0gTlVMTCk7Ci0gIH0KLSAgcmV0dXJuIChwaWN0dXJlLT5tZW1vcnlfID09IE5VTEwpOwotfQotCi1pbnQgV2ViUFBpY3R1cmVWaWV3KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsCi0gICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBkc3QpIHsKLSAgaWYgKHNyYyA9PSBOVUxMIHx8IGRzdCA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAvLyB2ZXJpZnkgcmVjdGFuZ2xlIHBvc2l0aW9uLgotICBpZiAoIUFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKHNyYywgJmxlZnQsICZ0b3AsIHdpZHRoLCBoZWlnaHQpKSByZXR1cm4gMDsKLQotICBpZiAoc3JjICE9IGRzdCkgeyAgLy8gYmV3YXJlIG9mIGFsaWFzaW5nISBXZSBkb24ndCB3YW50IHRvIGxlYWsgJ21lbW9yeV8nLgotICAgIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKLSAgfQotICBkc3QtPndpZHRoID0gd2lkdGg7Ci0gIGRzdC0+aGVpZ2h0ID0gaGVpZ2h0OwotICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKLSAgICBkc3QtPnkgPSBzcmMtPnkgKyB0b3AgKiBzcmMtPnlfc3RyaWRlICsgbGVmdDsKLSAgICBkc3QtPnUgPSBzcmMtPnUgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKLSAgICBkc3QtPnYgPSBzcmMtPnYgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKLSAgICBkc3QtPnlfc3RyaWRlID0gc3JjLT55X3N0cmlkZTsKLSAgICBkc3QtPnV2X3N0cmlkZSA9IHNyYy0+dXZfc3RyaWRlOwotICAgIGlmIChzcmMtPmEgIT0gTlVMTCkgewotICAgICAgZHN0LT5hID0gc3JjLT5hICsgdG9wICogc3JjLT5hX3N0cmlkZSArIGxlZnQ7Ci0gICAgICBkc3QtPmFfc3RyaWRlID0gc3JjLT5hX3N0cmlkZTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAoc3JjLT51MCAhPSBOVUxMKSB7Ci0gICAgICBjb25zdCBpbnQgbGVmdF9wb3MgPQotICAgICAgICAgIElTX1lVVl9DU1AoZHN0LT5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMikgPyAobGVmdCA+PiAxKSA6IGxlZnQ7Ci0gICAgICBkc3QtPnUwID0gc3JjLT51MCArIHRvcCAqIHNyYy0+dXYwX3N0cmlkZSArIGxlZnRfcG9zOwotICAgICAgZHN0LT52MCA9IHNyYy0+djAgKyB0b3AgKiBzcmMtPnV2MF9zdHJpZGUgKyBsZWZ0X3BvczsKLSAgICAgIGRzdC0+dXYwX3N0cmlkZSA9IHNyYy0+dXYwX3N0cmlkZTsKLSAgICB9Ci0jZW5kaWYKLSAgfSBlbHNlIHsKLSAgICBkc3QtPmFyZ2IgPSBzcmMtPmFyZ2IgKyB0b3AgKiBzcmMtPmFyZ2Jfc3RyaWRlICsgbGVmdDsKLSAgICBkc3QtPmFyZ2Jfc3RyaWRlID0gc3JjLT5hcmdiX3N0cmlkZTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBpY3R1cmUgY3JvcHBpbmcKLQotaW50IFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljLAotICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFdlYlBQaWN0dXJlIHRtcDsKLQotICBpZiAocGljID09IE5VTEwpIHJldHVybiAwOwotICBpZiAoIUFkanVzdEFuZENoZWNrUmVjdGFuZ2xlKHBpYywgJmxlZnQsICZ0b3AsIHdpZHRoLCBoZWlnaHQpKSByZXR1cm4gMDsKLQotICBXZWJQUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOwotICB0bXAud2lkdGggPSB3aWR0aDsKLSAgdG1wLmhlaWdodCA9IGhlaWdodDsKLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKLQotICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKLSAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSB0b3AgKiBwaWMtPnlfc3RyaWRlICsgbGVmdDsKLSAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gKHRvcCAvIDIpICogcGljLT51dl9zdHJpZGUgKyBsZWZ0IC8gMjsKLSAgICBDb3B5UGxhbmUocGljLT55ICsgeV9vZmZzZXQsIHBpYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgIHRtcC55LCB0bXAueV9zdHJpZGUsIHdpZHRoLCBoZWlnaHQpOwotICAgIENvcHlQbGFuZShwaWMtPnUgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICB0bXAudSwgdG1wLnV2X3N0cmlkZSwgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpKTsKLSAgICBDb3B5UGxhbmUocGljLT52ICsgdXZfb2Zmc2V0LCBwaWMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgdG1wLnYsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7Ci0KLSAgICBpZiAodG1wLmEgIT0gTlVMTCkgewotICAgICAgY29uc3QgaW50IGFfb2Zmc2V0ID0gdG9wICogcGljLT5hX3N0cmlkZSArIGxlZnQ7Ci0gICAgICBDb3B5UGxhbmUocGljLT5hICsgYV9vZmZzZXQsIHBpYy0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgdG1wLmEsIHRtcC5hX3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgaWYgKHRtcC51MCAhPSBOVUxMKSB7Ci0gICAgICBpbnQgdyA9IHdpZHRoOwotICAgICAgaW50IGxlZnRfcG9zID0gbGVmdDsKLSAgICAgIGlmIChJU19ZVVZfQ1NQKHRtcC5jb2xvcnNwYWNlLCBXRUJQX1lVVjQyMikpIHsKLSAgICAgICAgdyA9IEhBTFZFKHcpOwotICAgICAgICBsZWZ0X3BvcyA9IEhBTFZFKGxlZnRfcG9zKTsKLSAgICAgIH0KLSAgICAgIENvcHlQbGFuZShwaWMtPnUwICsgdG9wICogcGljLT51djBfc3RyaWRlICsgbGVmdF9wb3MsIHBpYy0+dXYwX3N0cmlkZSwKLSAgICAgICAgICAgICAgICB0bXAudTAsIHRtcC51djBfc3RyaWRlLCB3LCBoZWlnaHQpOwotICAgICAgQ29weVBsYW5lKHBpYy0+djAgKyB0b3AgKiBwaWMtPnV2MF9zdHJpZGUgKyBsZWZ0X3BvcywgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgICAgICAgIHRtcC52MCwgdG1wLnV2MF9zdHJpZGUsIHcsIGhlaWdodCk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0KLSAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKShwaWMtPmFyZ2IgKyB0b3AgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgbGVmdCk7Ci0gICAgQ29weVBsYW5lKHNyYywgcGljLT5hcmdiX3N0cmlkZSAqIDQsCi0gICAgICAgICAgICAgICh1aW50OF90Kil0bXAuYXJnYiwgdG1wLmFyZ2Jfc3RyaWRlICogNCwKLSAgICAgICAgICAgICAgd2lkdGggKiA0LCBoZWlnaHQpOwotICB9Ci0gIFdlYlBQaWN0dXJlRnJlZShwaWMpOwotICAqcGljID0gdG1wOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZSBwaWN0dXJlIHJlc2NhbGVyCi0KLXN0YXRpYyB2b2lkIFJlc2NhbGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsIGludCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29uc3Qgd29yaywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKSB7Ci0gIFdlYlBSZXNjYWxlciByZXNjYWxlcjsKLSAgaW50IHkgPSAwOwotICBXZWJQUmVzY2FsZXJJbml0KCZyZXNjYWxlciwgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3dpZHRoLCBkc3RfaGVpZ2h0LCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgIG51bV9jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICBzcmNfd2lkdGgsIGRzdF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICBzcmNfaGVpZ2h0LCBkc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgIHdvcmspOwotICBTYk1lbW9yeVNldCh3b3JrLCAwLCAyICogZHN0X3dpZHRoICogbnVtX2NoYW5uZWxzICogc2l6ZW9mKCp3b3JrKSk7Ci0gIHdoaWxlICh5IDwgc3JjX2hlaWdodCkgewotICAgIHkgKz0gV2ViUFJlc2NhbGVySW1wb3J0KCZyZXNjYWxlciwgc3JjX2hlaWdodCAtIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjICsgeSAqIHNyY19zdHJpZGUsIHNyY19zdHJpZGUpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydCgmcmVzY2FsZXIpOwotICB9Ci19Ci0KLWludCBXZWJQUGljdHVyZVJlc2NhbGUoV2ViUFBpY3R1cmUqIHBpYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gIFdlYlBQaWN0dXJlIHRtcDsKLSAgaW50IHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0OwotICBpbnQzMl90KiB3b3JrOwotCi0gIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIHByZXZfd2lkdGggPSBwaWMtPndpZHRoOwotICBwcmV2X2hlaWdodCA9IHBpYy0+aGVpZ2h0OwotICAvLyBpZiB3aWR0aCBpcyB1bnNwZWNpZmllZCwgc2NhbGUgb3JpZ2luYWwgcHJvcG9ydGlvbmFsbHkgdG8gaGVpZ2h0IHJhdGlvLgotICBpZiAod2lkdGggPT0gMCkgewotICAgIHdpZHRoID0gKHByZXZfd2lkdGggKiBoZWlnaHQgKyBwcmV2X2hlaWdodCAvIDIpIC8gcHJldl9oZWlnaHQ7Ci0gIH0KLSAgLy8gaWYgaGVpZ2h0IGlzIHVuc3BlY2lmaWVkLCBzY2FsZSBvcmlnaW5hbCBwcm9wb3J0aW9uYWxseSB0byB3aWR0aCByYXRpby4KLSAgaWYgKGhlaWdodCA9PSAwKSB7Ci0gICAgaGVpZ2h0ID0gKHByZXZfaGVpZ2h0ICogd2lkdGggKyBwcmV2X3dpZHRoIC8gMikgLyBwcmV2X3dpZHRoOwotICB9Ci0gIC8vIENoZWNrIGlmIHRoZSBvdmVyYWxsIGRpbWVuc2lvbnMgc3RpbGwgbWFrZSBzZW5zZS4KLSAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOwotCi0gIFdlYlBQaWN0dXJlR3JhYlNwZWNzKHBpYywgJnRtcCk7Ci0gIHRtcC53aWR0aCA9IHdpZHRoOwotICB0bXAuaGVpZ2h0ID0gaGVpZ2h0OwotICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJnRtcCkpIHJldHVybiAwOwotCi0gIGlmICghcGljLT51c2VfYXJnYikgewotICAgIHdvcmsgPSAoaW50MzJfdCopV2ViUFNhZmVNYWxsb2MoMlVMTCAqIHdpZHRoLCBzaXplb2YoKndvcmspKTsKLSAgICBpZiAod29yayA9PSBOVUxMKSB7Ci0gICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSZXNjYWxlUGxhbmUocGljLT55LCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT55X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgdG1wLnksIHdpZHRoLCBoZWlnaHQsIHRtcC55X3N0cmlkZSwgd29yaywgMSk7Ci0gICAgUmVzY2FsZVBsYW5lKHBpYy0+dSwKLSAgICAgICAgICAgICAgICAgSEFMVkUocHJldl93aWR0aCksIEhBTFZFKHByZXZfaGVpZ2h0KSwgcGljLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgIHRtcC51LAotICAgICAgICAgICAgICAgICBIQUxWRSh3aWR0aCksIEhBTFZFKGhlaWdodCksIHRtcC51dl9zdHJpZGUsIHdvcmssIDEpOwotICAgIFJlc2NhbGVQbGFuZShwaWMtPnYsCi0gICAgICAgICAgICAgICAgIEhBTFZFKHByZXZfd2lkdGgpLCBIQUxWRShwcmV2X2hlaWdodCksIHBpYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICB0bXAudiwKLSAgICAgICAgICAgICAgICAgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpLCB0bXAudXZfc3RyaWRlLCB3b3JrLCAxKTsKLQotICAgIGlmICh0bXAuYSAhPSBOVUxMKSB7Ci0gICAgICBSZXNjYWxlUGxhbmUocGljLT5hLCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICB0bXAuYSwgd2lkdGgsIGhlaWdodCwgdG1wLmFfc3RyaWRlLCB3b3JrLCAxKTsKLSAgICB9Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgICBpZiAodG1wLnUwICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IGludCBzID0gSVNfWVVWX0NTUCh0bXAuY29sb3JzcGFjZSwgV0VCUF9ZVVY0MjIpID8gMiA6IDE7Ci0gICAgICBSZXNjYWxlUGxhbmUoCi0gICAgICAgICAgcGljLT51MCwgKHByZXZfd2lkdGggKyBzIC8gMikgLyBzLCBwcmV2X2hlaWdodCwgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgIHRtcC51MCwgKHdpZHRoICsgcyAvIDIpIC8gcywgaGVpZ2h0LCB0bXAudXYwX3N0cmlkZSwgd29yaywgMSk7Ci0gICAgICBSZXNjYWxlUGxhbmUoCi0gICAgICAgICAgcGljLT52MCwgKHByZXZfd2lkdGggKyBzIC8gMikgLyBzLCBwcmV2X2hlaWdodCwgcGljLT51djBfc3RyaWRlLAotICAgICAgICAgIHRtcC52MCwgKHdpZHRoICsgcyAvIDIpIC8gcywgaGVpZ2h0LCB0bXAudXYwX3N0cmlkZSwgd29yaywgMSk7Ci0gICAgfQotI2VuZGlmCi0gIH0gZWxzZSB7Ci0gICAgd29yayA9IChpbnQzMl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiA0LCBzaXplb2YoKndvcmspKTsKLSAgICBpZiAod29yayA9PSBOVUxMKSB7Ci0gICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBSZXNjYWxlUGxhbmUoKGNvbnN0IHVpbnQ4X3QqKXBpYy0+YXJnYiwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsCi0gICAgICAgICAgICAgICAgIHBpYy0+YXJnYl9zdHJpZGUgKiA0LAotICAgICAgICAgICAgICAgICAodWludDhfdCopdG1wLmFyZ2IsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgIHRtcC5hcmdiX3N0cmlkZSAqIDQsCi0gICAgICAgICAgICAgICAgIHdvcmssIDQpOwotICB9Ci0gIFdlYlBQaWN0dXJlRnJlZShwaWMpOwotICBTYk1lbW9yeURlYWxsb2NhdGUod29yayk7Ci0gICpwaWMgPSB0bXA7Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gV2ViUE1lbW9yeVdyaXRlcjogV3JpdGUtdG8tbWVtb3J5Ci0KLXZvaWQgV2ViUE1lbW9yeVdyaXRlckluaXQoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKSB7Ci0gIHdyaXRlci0+bWVtID0gTlVMTDsKLSAgd3JpdGVyLT5zaXplID0gMDsKLSAgd3JpdGVyLT5tYXhfc2l6ZSA9IDA7Ci19Ci0KLWludCBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgdyA9IChXZWJQTWVtb3J5V3JpdGVyKilwaWN0dXJlLT5jdXN0b21fcHRyOwotICB1aW50NjRfdCBuZXh0X3NpemU7Ci0gIGlmICh3ID09IE5VTEwpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotICBuZXh0X3NpemUgPSAodWludDY0X3Qpdy0+c2l6ZSArIGRhdGFfc2l6ZTsKLSAgaWYgKG5leHRfc2l6ZSA+IHctPm1heF9zaXplKSB7Ci0gICAgdWludDhfdCogbmV3X21lbTsKLSAgICB1aW50NjRfdCBuZXh0X21heF9zaXplID0gMlVMTCAqIHctPm1heF9zaXplOwotICAgIGlmIChuZXh0X21heF9zaXplIDwgbmV4dF9zaXplKSBuZXh0X21heF9zaXplID0gbmV4dF9zaXplOwotICAgIGlmIChuZXh0X21heF9zaXplIDwgODE5MlVMTCkgbmV4dF9tYXhfc2l6ZSA9IDgxOTJVTEw7Ci0gICAgbmV3X21lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhuZXh0X21heF9zaXplLCAxKTsKLSAgICBpZiAobmV3X21lbSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaWYgKHctPnNpemUgPiAwKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkobmV3X21lbSwgdy0+bWVtLCB3LT5zaXplKTsKLSAgICB9Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHctPm1lbSk7Ci0gICAgdy0+bWVtID0gbmV3X21lbTsKLSAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZU1hbGxvYwotICAgIHctPm1heF9zaXplID0gKHNpemVfdCluZXh0X21heF9zaXplOwotICB9Ci0gIGlmIChkYXRhX3NpemUgPiAwKSB7Ci0gICAgU2JNZW1vcnlDb3B5KHctPm1lbSArIHctPnNpemUsIGRhdGEsIGRhdGFfc2l6ZSk7Ci0gICAgdy0+c2l6ZSArPSBkYXRhX3NpemU7Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZXRlY3Rpb24gb2Ygbm9uLXRyaXZpYWwgdHJhbnNwYXJlbmN5Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiBhbHBoYVtdIGhhcyBub24tMHhmZiB2YWx1ZXMuCi1zdGF0aWMgaW50IENoZWNrTm9uT3BhcXVlKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0ZXAsIGludCB5X3N0ZXApIHsKLSAgaWYgKGFscGhhID09IE5VTEwpIHJldHVybiAwOwotICB3aGlsZSAoaGVpZ2h0LS0gPiAwKSB7Ci0gICAgaW50IHg7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoICogeF9zdGVwOyB4ICs9IHhfc3RlcCkgewotICAgICAgaWYgKGFscGhhW3hdICE9IDB4ZmYpIHJldHVybiAxOyAgLy8gVE9ETyhza2FsKTogY2hlY2sgNC84IGJ5dGVzIGF0IGEgdGltZS4KLSAgICB9Ci0gICAgYWxwaGEgKz0geV9zdGVwOwotICB9Ci0gIHJldHVybiAwOwotfQotCi0vLyBDaGVja2luZyBmb3IgdGhlIHByZXNlbmNlIG9mIG5vbi1vcGFxdWUgYWxwaGEuCi1pbnQgV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUocGljdHVyZS0+YSwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgcGljdHVyZS0+YV9zdHJpZGUpOwotICB9IGVsc2UgewotICAgIGludCB4LCB5OwotICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljdHVyZS0+YXJnYjsKLSAgICBpZiAoYXJnYiA9PSBOVUxMKSByZXR1cm4gMDsKLSAgICBmb3IgKHkgPSAwOyB5IDwgcGljdHVyZS0+aGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCBwaWN0dXJlLT53aWR0aDsgKyt4KSB7Ci0gICAgICAgIGlmIChhcmdiW3hdIDwgMHhmZjAwMDAwMHUpIHJldHVybiAxOyAgIC8vIHRlc3QgYW55IGFscGhhIHZhbHVlcyAhPSAweGZmCi0gICAgICB9Ci0gICAgICBhcmdiICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJHQiAtPiBZVVYgY29udmVyc2lvbgotCi0vLyBUT0RPOiB3ZSBjYW4gZG8gYmV0dGVyIHRoYW4gc2ltcGx5IDJ4MiBhdmVyYWdpbmcgb24gVS9WIHNhbXBsZXMuCi0jZGVmaW5lIFNVTTQocHRyKSAoKHB0cilbMF0gKyAocHRyKVtzdGVwXSArIFwKLSAgICAgICAgICAgICAgICAgICAocHRyKVtyZ2Jfc3RyaWRlXSArIChwdHIpW3JnYl9zdHJpZGUgKyBzdGVwXSkKLSNkZWZpbmUgU1VNMkgocHRyKSAoMiAqIChwdHIpWzBdICsgMiAqIChwdHIpW3N0ZXBdKQotI2RlZmluZSBTVU0yVihwdHIpICgyICogKHB0cilbMF0gKyAyICogKHB0cilbcmdiX3N0cmlkZV0pCi0jZGVmaW5lIFNVTTEocHRyKSAgKDQgKiAocHRyKVswXSkKLSNkZWZpbmUgUkdCX1RPX1VWKHgsIHksIFNVTSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IHNyYyA9ICgyICogKHN0ZXAgKiAoeCkgKyAoeSkgKiByZ2Jfc3RyaWRlKSk7IFwKLSAgY29uc3QgaW50IGRzdCA9ICh4KSArICh5KSAqIHBpY3R1cmUtPnV2X3N0cmlkZTsgICAgICAgIFwKLSAgY29uc3QgaW50IHIgPSBTVU0ocl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGcgPSBTVU0oZ19wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY29uc3QgaW50IGIgPSBTVU0oYl9wdHIgKyBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+dVtkc3RdID0gVlA4UkdCVG9VKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgIFwKLSAgcGljdHVyZS0+dltkc3RdID0gVlA4UkdCVG9WKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgIFwKLX0KLQotI2RlZmluZSBSR0JfVE9fVVYwKHhfaW4sIHhfb3V0LCB5LCBTVU0pIHsgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgc3JjID0gKHN0ZXAgKiAoeF9pbikgKyAoeSkgKiByZ2Jfc3RyaWRlKTsgICAgXAotICBjb25zdCBpbnQgZHN0ID0gKHhfb3V0KSArICh5KSAqIHBpY3R1cmUtPnV2MF9zdHJpZGU7ICAgXAotICBjb25zdCBpbnQgciA9IFNVTShyX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgZyA9IFNVTShnX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjb25zdCBpbnQgYiA9IFNVTShiX3B0ciArIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBwaWN0dXJlLT51MFtkc3RdID0gVlA4UkdCVG9VKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgXAotICBwaWN0dXJlLT52MFtkc3RdID0gVlA4UkdCVG9WKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgXAotfQotCi1zdGF0aWMgdm9pZCBNYWtlR3JheShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBpbnQgeTsKLSAgY29uc3QgaW50IHV2X3dpZHRoID0gSEFMVkUocGljdHVyZS0+d2lkdGgpOwotICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gSEFMVkUocGljdHVyZS0+aGVpZ2h0KTsKLSAgZm9yICh5ID0gMDsgeSA8IHV2X2hlaWdodDsgKyt5KSB7Ci0gICAgU2JNZW1vcnlTZXQocGljdHVyZS0+dSArIHkgKiBwaWN0dXJlLT51dl9zdHJpZGUsIDEyOCwgdXZfd2lkdGgpOwotICAgIFNiTWVtb3J5U2V0KHBpY3R1cmUtPnYgKyB5ICogcGljdHVyZS0+dXZfc3RyaWRlLCAxMjgsIHV2X3dpZHRoKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IEltcG9ydFlVVkFGcm9tUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCAgICAgICAgIC8vIGJ5dGVzIHBlciBwaXhlbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUsICAgLy8gYnl0ZXMgcGVyIHNjYW5saW5lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBjb25zdCBXZWJQRW5jQ1NQIHV2X2NzcCA9IHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICBpbnQgeCwgeTsKLSAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7Ci0gIGNvbnN0IGludCBoYXNfYWxwaGEgPSBDaGVja05vbk9wYXF1ZShhX3B0ciwgd2lkdGgsIGhlaWdodCwgc3RlcCwgcmdiX3N0cmlkZSk7Ci0KLSAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IHV2X2NzcDsKLSAgcGljdHVyZS0+dXNlX2FyZ2IgPSAwOwotICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgcGljdHVyZS0+Y29sb3JzcGFjZSB8PSBXRUJQX0NTUF9BTFBIQV9CSVQ7Ci0gIH0KLSAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpY3R1cmUpKSByZXR1cm4gMDsKLQotICAvLyBJbXBvcnQgbHVtYSBwbGFuZQotICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgY29uc3QgaW50IG9mZnNldCA9IHN0ZXAgKiB4ICsgeSAqIHJnYl9zdHJpZGU7Ci0gICAgICBwaWN0dXJlLT55W3ggKyB5ICogcGljdHVyZS0+eV9zdHJpZGVdID0KLSAgICAgICAgICBWUDhSR0JUb1kocl9wdHJbb2Zmc2V0XSwgZ19wdHJbb2Zmc2V0XSwgYl9wdHJbb2Zmc2V0XSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRG93bnNhbXBsZSBVL1YgcGxhbmUKLSAgaWYgKHV2X2NzcCAhPSBXRUJQX1lVVjQwMCkgewotICAgIGZvciAoeSA9IDA7IHkgPCAoaGVpZ2h0ID4+IDEpOyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMSk7ICsreCkgewotICAgICAgICBSR0JfVE9fVVYoeCwgeSwgU1VNNCk7Ci0gICAgICB9Ci0gICAgICBpZiAod2lkdGggJiAxKSB7Ci0gICAgICAgIFJHQl9UT19VVih4LCB5LCBTVU0yVik7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChoZWlnaHQgJiAxKSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoID4+IDEpOyArK3gpIHsKLSAgICAgICAgUkdCX1RPX1VWKHgsIHksIFNVTTJIKTsKLSAgICAgIH0KLSAgICAgIGlmICh3aWR0aCAmIDEpIHsKLSAgICAgICAgUkdCX1RPX1VWKHgsIHksIFNVTTEpOwotICAgICAgfQotICAgIH0KLQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgLy8gU3RvcmUgb3JpZ2luYWwgVS9WIHNhbXBsZXMgdG9vCi0gICAgaWYgKHV2X2NzcCA9PSBXRUJQX1lVVjQyMikgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggPj4gMSk7ICsreCkgewotICAgICAgICAgIFJHQl9UT19VVjAoMiAqIHgsIHgsIHksIFNVTTJIKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod2lkdGggJiAxKSB7Ci0gICAgICAgICAgUkdCX1RPX1VWMCgyICogeCwgeCwgeSwgU1VNMSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHV2X2NzcCA9PSBXRUJQX1lVVjQ0NCkgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgICAgUkdCX1RPX1VWMCh4LCB4LCB5LCBTVU0xKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIE1ha2VHcmF5KHBpY3R1cmUpOwotICB9Ci0KLSAgaWYgKGhhc19hbHBoYSkgewotICAgIFNCX0RDSEVDSyhzdGVwID49IDQpOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgcGljdHVyZS0+YVt4ICsgeSAqIHBpY3R1cmUtPmFfc3RyaWRlXSA9Ci0gICAgICAgICAgICBhX3B0cltzdGVwICogeCArIHkgKiByZ2Jfc3RyaWRlXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgSW1wb3J0KFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiLCBpbnQgcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgc3dhcF9yYiwgaW50IGltcG9ydF9hbHBoYSkgewotICBjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciA9IHJnYiArIChzd2FwX3JiID8gMiA6IDApOwotICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciA9IHJnYiArIDE7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJfcHRyID0gcmdiICsgKHN3YXBfcmIgPyAwIDogMik7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFfcHRyID0gaW1wb3J0X2FscGhhID8gcmdiICsgMyA6IE5VTEw7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotCi0gIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHJfcHRyLCBnX3B0ciwgYl9wdHIsIGFfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSk7Ci0gIH0KLSAgaWYgKGltcG9ydF9hbHBoYSkgewotICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgfD0gV0VCUF9DU1BfQUxQSEFfQklUOwotICB9IGVsc2UgewotICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgJj0gfldFQlBfQ1NQX0FMUEhBX0JJVDsKLSAgfQotICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljdHVyZSkpIHJldHVybiAwOwotCi0gIGlmICghaW1wb3J0X2FscGhhKSB7Ci0gICAgaW50IHgsIHk7Ci0gICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICBjb25zdCBpbnQgb2Zmc2V0ID0gc3RlcCAqIHggKyB5ICogcmdiX3N0cmlkZTsKLSAgICAgICAgY29uc3QgdWludDMyX3QgYXJnYiA9Ci0gICAgICAgICAgICAweGZmMDAwMDAwdSB8Ci0gICAgICAgICAgICAocl9wdHJbb2Zmc2V0XSA8PCAxNikgfAotICAgICAgICAgICAgKGdfcHRyW29mZnNldF0gPDwgIDgpIHwKLSAgICAgICAgICAgIChiX3B0cltvZmZzZXRdKTsKLSAgICAgICAgcGljdHVyZS0+YXJnYlt4ICsgeSAqIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlXSA9IGFyZ2I7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGludCB4LCB5OwotICAgIFNCX0RDSEVDSyhzdGVwID49IDQpOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHN0ZXAgKiB4ICsgeSAqIHJnYl9zdHJpZGU7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAoKHVpbnQzMl90KWFfcHRyW29mZnNldF0gPDwgMjQpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyX3B0cltvZmZzZXRdIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ19wdHJbb2Zmc2V0XSA8PCAgOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJfcHRyW29mZnNldF0pOwotICAgICAgICBwaWN0dXJlLT5hcmdiW3ggKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGVdID0gYXJnYjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0jdW5kZWYgU1VNNAotI3VuZGVmIFNVTTJWCi0jdW5kZWYgU1VNMkgKLSN1bmRlZiBTVU0xCi0jdW5kZWYgUkdCX1RPX1VWCi0KLWludCBXZWJQUGljdHVyZUltcG9ydFJHQihXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiLCByZ2Jfc3RyaWRlLCAzLCAwLCAwKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2IsIHJnYl9zdHJpZGUsIDMsIDEsIDApOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMCwgMSk7Ci19Ci0KLWludCBXZWJQUGljdHVyZUltcG9ydEJHUkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgewotICByZXR1cm4gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAxKTsKLX0KLQotaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCWChXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKSB7Ci0gIHJldHVybiBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDAsIDApOwotfQotCi1pbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKLSAgcmV0dXJuIEltcG9ydChwaWN0dXJlLCByZ2JhLCByZ2JhX3N0cmlkZSwgNCwgMSwgMCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBdXRvbWF0aWMgWVVWIDwtPiBBUkdCIGNvbnZlcnNpb25zLgotCi1pbnQgV2ViUFBpY3R1cmVZVVZBVG9BUkdCKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7Ci0gIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOwotICBpZiAocGljdHVyZS0+bWVtb3J5XyA9PSBOVUxMIHx8IHBpY3R1cmUtPnkgPT0gTlVMTCB8fAotICAgICAgcGljdHVyZS0+dSA9PSBOVUxMIHx8IHBpY3R1cmUtPnYgPT0gTlVMTCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKLSAgfQotICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9BTFBIQV9CSVQpICYmIHBpY3R1cmUtPmEgPT0gTlVMTCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX05VTExfUEFSQU1FVEVSKTsKLSAgfQotICBpZiAoKHBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLKSAhPSBXRUJQX1lVVjQyMCkgewotICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7Ci0gIH0KLSAgLy8gQWxsb2NhdGUgYSBuZXcgYXJnYiBidWZmZXIgKGRpc2NhcmRpbmcgdGhlIHByZXZpb3VzIG9uZSkuCi0gIGlmICghUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlKSkgcmV0dXJuIDA7Ci0KLSAgLy8gQ29udmVydAotICB7Ci0gICAgaW50IHk7Ci0gICAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7Ci0gICAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLSAgICBjb25zdCBpbnQgYXJnYl9zdHJpZGUgPSA0ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgdWludDhfdCogZHN0ID0gKHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2I7Ci0gICAgY29uc3QgdWludDhfdCAqY3VyX3UgPSBwaWN0dXJlLT51LCAqY3VyX3YgPSBwaWN0dXJlLT52LCAqY3VyX3kgPSBwaWN0dXJlLT55OwotICAgIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyB1cHNhbXBsZSA9IFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihBTFBIQV9JU19MQVNUKTsKLQotICAgIC8vIEZpcnN0IHJvdywgd2l0aCByZXBsaWNhdGVkIHRvcCBzYW1wbGVzLgotICAgIHVwc2FtcGxlKE5VTEwsIGN1cl95LCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgTlVMTCwgZHN0LCB3aWR0aCk7Ci0gICAgY3VyX3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7Ci0gICAgZHN0ICs9IGFyZ2Jfc3RyaWRlOwotICAgIC8vIENlbnRlciByb3dzLgotICAgIGZvciAoeSA9IDE7IHkgKyAxIDwgaGVpZ2h0OyB5ICs9IDIpIHsKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF91ID0gY3VyX3U7Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3BfdiA9IGN1cl92OwotICAgICAgY3VyX3UgKz0gcGljdHVyZS0+dXZfc3RyaWRlOwotICAgICAgY3VyX3YgKz0gcGljdHVyZS0+dXZfc3RyaWRlOwotICAgICAgdXBzYW1wbGUoY3VyX3ksIGN1cl95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHRvcF91LCB0b3BfdiwgY3VyX3UsIGN1cl92LAotICAgICAgICAgICAgICAgZHN0LCBkc3QgKyBhcmdiX3N0cmlkZSwgd2lkdGgpOwotICAgICAgY3VyX3kgKz0gMiAqIHBpY3R1cmUtPnlfc3RyaWRlOwotICAgICAgZHN0ICs9IDIgKiBhcmdiX3N0cmlkZTsKLSAgICB9Ci0gICAgLy8gTGFzdCByb3cgKGlmIG5lZWRlZCksIHdpdGggcmVwbGljYXRlZCBib3R0b20gc2FtcGxlcy4KLSAgICBpZiAoaGVpZ2h0ID4gMSAmJiAhKGhlaWdodCAmIDEpKSB7Ci0gICAgICB1cHNhbXBsZShjdXJfeSwgTlVMTCwgY3VyX3UsIGN1cl92LCBjdXJfdSwgY3VyX3YsIGRzdCwgTlVMTCwgd2lkdGgpOwotICAgIH0KLSAgICAvLyBJbnNlcnQgYWxwaGEgdmFsdWVzIGlmIG5lZWRlZCwgaW4gcmVwbGFjZW1lbnQgZm9yIHRoZSBkZWZhdWx0IDB4ZmYgb25lcy4KLSAgICBpZiAocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgewotICAgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgICAgIHVpbnQzMl90KiBjb25zdCBhcmdiX2RzdCA9IHBpY3R1cmUtPmFyZ2IgKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHBpY3R1cmUtPmEgKyB5ICogcGljdHVyZS0+YV9zdHJpZGU7Ci0gICAgICAgIGludCB4OwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgICAgIGFyZ2JfZHN0W3hdID0gKGFyZ2JfZHN0W3hdICYgMHgwMGZmZmZmZnUpIHwgKCh1aW50MzJfdClzcmNbeF0gPDwgMjQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1pbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UpIHsKLSAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIGlmIChwaWN0dXJlLT5hcmdiID09IE5VTEwpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUik7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYXJnYiA9IChjb25zdCB1aW50OF90KilwaWN0dXJlLT5hcmdiOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHIgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDIgOiBhcmdiICsgMTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBnID0gQUxQSEFfSVNfTEFTVCA/IGFyZ2IgKyAxIDogYXJnYiArIDI7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgYiA9IEFMUEhBX0lTX0xBU1QgPyBhcmdiICsgMCA6IGFyZ2IgKyAzOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEgPSBBTFBIQV9JU19MQVNUID8gYXJnYiArIDMgOiBhcmdiICsgMDsKLSAgICAvLyBXZSB3b3JrIG9uIGEgdG1wIGNvcHkgb2YgJ3BpY3R1cmUnLCBiZWNhdXNlIEltcG9ydFlVVkFGcm9tUkdCQSgpCi0gICAgLy8gd291bGQgYmUgY2FsbGluZyBXZWJQUGljdHVyZUZyZWUocGljdHVyZSkgb3RoZXJ3aXNlLgotICAgIFdlYlBQaWN0dXJlIHRtcCA9ICpwaWN0dXJlOwotICAgIFBpY3R1cmVSZXNldEFSR0IoJnRtcCk7ICAvLyByZXNldCBBUkdCIGJ1ZmZlciBzbyB0aGF0IGl0J3Mgbm90IFNiTWVtb3J5RGVhbGxvY2F0ZSgpJ2QuCi0gICAgdG1wLnVzZV9hcmdiID0gMDsKLSAgICB0bXAuY29sb3JzcGFjZSA9IGNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLOwotICAgIGlmICghSW1wb3J0WVVWQUZyb21SR0JBKHIsIGcsIGIsIGEsIDQsIDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwgJnRtcCkpIHsKLSAgICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOwotICAgIH0KLSAgICAvLyBDb3B5IGJhY2sgdGhlIFlVViBzcGVjcyBpbnRvICdwaWN0dXJlJy4KLSAgICB0bXAuYXJnYiA9IHBpY3R1cmUtPmFyZ2I7Ci0gICAgdG1wLmFyZ2Jfc3RyaWRlID0gcGljdHVyZS0+YXJnYl9zdHJpZGU7Ci0gICAgdG1wLm1lbW9yeV9hcmdiXyA9IHBpY3R1cmUtPm1lbW9yeV9hcmdiXzsKLSAgICAqcGljdHVyZSA9IHRtcDsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlbHBlcjogY2xlYW4gdXAgZnVsbHkgdHJhbnNwYXJlbnQgYXJlYSB0byBoZWxwIGNvbXByZXNzaWJpbGl0eS4KLQotI2RlZmluZSBTSVpFIDgKLSNkZWZpbmUgU0laRTIgKFNJWkUgLyAyKQotc3RhdGljIGludCBpc190cmFuc3BhcmVudF9hcmVhKGNvbnN0IHVpbnQ4X3QqIHB0ciwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKLSAgaW50IHksIHg7Ci0gIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSB7Ci0gICAgICBpZiAocHRyW3hdKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotICAgIH0KLSAgICBwdHIgKz0gc3RyaWRlOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBmbGF0dGVuKHVpbnQ4X3QqIHB0ciwgaW50IHYsIGludCBzdHJpZGUsIGludCBzaXplKSB7Ci0gIGludCB5OwotICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7Ci0gICAgU2JNZW1vcnlTZXQocHRyLCB2LCBzaXplKTsKLSAgICBwdHIgKz0gc3RyaWRlOwotICB9Ci19Ci0KLXZvaWQgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoV2ViUFBpY3R1cmUqIHBpYykgewotICBpbnQgeCwgeSwgdywgaDsKLSAgY29uc3QgdWludDhfdCogYV9wdHI7Ci0gIGludCB2YWx1ZXNbM10gPSB7IDAgfTsKLQotICBpZiAocGljID09IE5VTEwpIHJldHVybjsKLQotICBhX3B0ciA9IHBpYy0+YTsKLSAgaWYgKGFfcHRyID09IE5VTEwpIHJldHVybjsgICAgLy8gbm90aGluZyB0byBkbwotCi0gIHcgPSBwaWMtPndpZHRoIC8gU0laRTsKLSAgaCA9IHBpYy0+aGVpZ2h0IC8gU0laRTsKLSAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgewotICAgIGludCBuZWVkX3Jlc2V0ID0gMTsKLSAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7Ci0gICAgICBjb25zdCBpbnQgb2ZmX2EgPSAoeSAqIHBpYy0+YV9zdHJpZGUgKyB4KSAqIFNJWkU7Ci0gICAgICBjb25zdCBpbnQgb2ZmX3kgPSAoeSAqIHBpYy0+eV9zdHJpZGUgKyB4KSAqIFNJWkU7Ci0gICAgICBjb25zdCBpbnQgb2ZmX3V2ID0gKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogU0laRTI7Ci0gICAgICBpZiAoaXNfdHJhbnNwYXJlbnRfYXJlYShhX3B0ciArIG9mZl9hLCBwaWMtPmFfc3RyaWRlLCBTSVpFKSkgewotICAgICAgICBpZiAobmVlZF9yZXNldCkgewotICAgICAgICAgIHZhbHVlc1swXSA9IHBpYy0+eVtvZmZfeV07Ci0gICAgICAgICAgdmFsdWVzWzFdID0gcGljLT51W29mZl91dl07Ci0gICAgICAgICAgdmFsdWVzWzJdID0gcGljLT52W29mZl91dl07Ci0gICAgICAgICAgbmVlZF9yZXNldCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZmxhdHRlbihwaWMtPnkgKyBvZmZfeSwgdmFsdWVzWzBdLCBwaWMtPnlfc3RyaWRlLCBTSVpFKTsKLSAgICAgICAgZmxhdHRlbihwaWMtPnUgKyBvZmZfdXYsIHZhbHVlc1sxXSwgcGljLT51dl9zdHJpZGUsIFNJWkUyKTsKLSAgICAgICAgZmxhdHRlbihwaWMtPnYgKyBvZmZfdXYsIHZhbHVlc1syXSwgcGljLT51dl9zdHJpZGUsIFNJWkUyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5lZWRfcmVzZXQgPSAxOwotICAgICAgfQotICAgIH0KLSAgICAvLyBpZ25vcmUgdGhlIGxlZnQtb3ZlcnMgb24gcmlnaHQvYm90dG9tCi0gIH0KLX0KLQotI3VuZGVmIFNJWkUKLSN1bmRlZiBTSVpFMgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gbG9jYWwtbWluIGRpc3RvcnRpb24KLS8vCi0vLyBGb3IgZXZlcnkgcGl4ZWwgaW4gdGhlICpyZWZlcmVuY2UqIHBpY3R1cmUsIHdlIHNlYXJjaCBmb3IgdGhlIGxvY2FsIGJlc3QKLS8vIG1hdGNoIGluIHRoZSBjb21wcmVzc2VkIGltYWdlLiBUaGlzIGlzIG5vdCBhIHN5bW1ldHJpY2FsIG1lYXN1cmUuCi0KLS8vIHNlYXJjaCByYWRpdXMuIFNob3VsZG4ndCBiZSB0b28gbGFyZ2UuCi0jZGVmaW5lIFJBRElVUyAyCi0KLXN0YXRpYyBmbG9hdCBBY2N1bXVsYXRlTFNJTShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7Ci0gIGludCB4LCB5OwotICBkb3VibGUgdG90YWxfc3NlID0gMC47Ci0gIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKLSAgICBjb25zdCBpbnQgeV8wID0gKHkgLSBSQURJVVMgPCAwKSA/IDAgOiB5IC0gUkFESVVTOwotICAgIGNvbnN0IGludCB5XzEgPSAoeSArIFJBRElVUyArIDEgPj0gaCkgPyBoIDogeSArIFJBRElVUyArIDE7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgewotICAgICAgY29uc3QgaW50IHhfMCA9ICh4IC0gUkFESVVTIDwgMCkgPyAwIDogeCAtIFJBRElVUzsKLSAgICAgIGNvbnN0IGludCB4XzEgPSAoeCArIFJBRElVUyArIDEgPj0gdykgPyB3IDogeCArIFJBRElVUyArIDE7Ci0gICAgICBkb3VibGUgYmVzdF9zc2UgPSAyNTUuICogMjU1LjsKLSAgICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IChkb3VibGUpcmVmW3kgKiByZWZfc3RyaWRlICsgeF07Ci0gICAgICBpbnQgaSwgajsKLSAgICAgIGZvciAoaiA9IHlfMDsgaiA8IHlfMTsgKytqKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIHMgPSBzcmMgKyBqICogc3JjX3N0cmlkZTsKLSAgICAgICAgZm9yIChpID0geF8wOyBpIDwgeF8xOyArK2kpIHsKLSAgICAgICAgICBjb25zdCBkb3VibGUgc3NlID0gKGRvdWJsZSkoc1tpXSAtIHZhbHVlKSAqIChzW2ldIC0gdmFsdWUpOwotICAgICAgICAgIGlmIChzc2UgPCBiZXN0X3NzZSkgYmVzdF9zc2UgPSBzc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRvdGFsX3NzZSArPSBiZXN0X3NzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIChmbG9hdCl0b3RhbF9zc2U7Ci19Ci0jdW5kZWYgUkFESVVTCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEaXN0b3J0aW9uCi0KLS8vIE1heCB2YWx1ZSByZXR1cm5lZCBpbiBjYXNlIG9mIGV4YWN0IHNpbWlsYXJpdHkuCi1zdGF0aWMgY29uc3QgZG91YmxlIGtNaW5EaXN0b3J0aW9uX2RCID0gOTkuOwotc3RhdGljIGZsb2F0IEdldFBTTlIoY29uc3QgZG91YmxlIHYpIHsKLSAgcmV0dXJuIChmbG9hdCkoKHYgPiAwLikgPyAtNC4zNDI5NDQ4ICogbG9nKHYgLyAoMjU1ICogMjU1LikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDoga01pbkRpc3RvcnRpb25fZEIpOwotfQotCi1pbnQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIGNvbnN0IFdlYlBQaWN0dXJlKiByZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCByZXN1bHRbNV0pIHsKLSAgRGlzdG9TdGF0cyBzdGF0c1s1XTsKLSAgaW50IGhhc19hbHBoYTsKLSAgaW50IHV2X3csIHV2X2g7Ci0KLSAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8Ci0gICAgICBzcmMtPndpZHRoICE9IHJlZi0+d2lkdGggfHwgc3JjLT5oZWlnaHQgIT0gcmVmLT5oZWlnaHQgfHwKLSAgICAgIHNyYy0+eSA9PSBOVUxMIHx8IHJlZi0+eSA9PSBOVUxMIHx8Ci0gICAgICBzcmMtPnUgPT0gTlVMTCB8fCByZWYtPnUgPT0gTlVMTCB8fAotICAgICAgc3JjLT52ID09IE5VTEwgfHwgcmVmLT52ID09IE5VTEwgfHwKLSAgICAgIHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgLy8gVE9ETyhza2FsKTogcHJvdmlkZSBkaXN0b3J0aW9uIGZvciBBUkdCIHRvby4KLSAgaWYgKHNyYy0+dXNlX2FyZ2IgPT0gMSB8fCBzcmMtPnVzZV9hcmdiICE9IHJlZi0+dXNlX2FyZ2IpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGhhc19hbHBoYSA9ICEhKHNyYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCk7Ci0gIGlmIChoYXNfYWxwaGEgIT0gISEocmVmLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSB8fAotICAgICAgKGhhc19hbHBoYSAmJiAoc3JjLT5hID09IE5VTEwgfHwgcmVmLT5hID09IE5VTEwpKSkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgU2JNZW1vcnlTZXQoc3RhdHMsIDAsIHNpemVvZihzdGF0cykpOwotCi0gIHV2X3cgPSBIQUxWRShzcmMtPndpZHRoKTsKLSAgdXZfaCA9IEhBTFZFKHNyYy0+aGVpZ2h0KTsKLSAgaWYgKHR5cGUgPj0gMikgewotICAgIGZsb2F0IHNzZVs0XTsKLSAgICBzc2VbMF0gPSBBY2N1bXVsYXRlTFNJTShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT55LCByZWYtPnlfc3RyaWRlLCBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCk7Ci0gICAgc3NlWzFdID0gQWNjdW11bGF0ZUxTSU0oc3JjLT51LCBzcmMtPnV2X3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnUsIHJlZi0+dXZfc3RyaWRlLCB1dl93LCB1dl9oKTsKLSAgICBzc2VbMl0gPSBBY2N1bXVsYXRlTFNJTShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZi0+diwgcmVmLT51dl9zdHJpZGUsIHV2X3csIHV2X2gpOwotICAgIHNzZVszXSA9IGhhc19hbHBoYSA/IEFjY3VtdWxhdGVMU0lNKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPmEsIHJlZi0+YV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQpCi0gICAgICAgICAgICAgICAgICAgICAgIDogMC5mOwotICAgIHJlc3VsdFswXSA9IEdldFBTTlIoc3NlWzBdIC8gKHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodCkpOwotICAgIHJlc3VsdFsxXSA9IEdldFBTTlIoc3NlWzFdIC8gKHV2X3cgKiB1dl9oKSk7Ci0gICAgcmVzdWx0WzJdID0gR2V0UFNOUihzc2VbMl0gLyAodXZfdyAqIHV2X2gpKTsKLSAgICByZXN1bHRbM10gPSBHZXRQU05SKHNzZVszXSAvIChzcmMtPndpZHRoICogc3JjLT5oZWlnaHQpKTsKLSAgICB7Ci0gICAgICBkb3VibGUgdG90YWxfc3NlID0gc3NlWzBdICsgc3NlWzFdICsgc3NlWzJdOwotICAgICAgaW50IHRvdGFsX3BpeGVscyA9IHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodCArIDIgKiB1dl93ICogdXZfaDsKLSAgICAgIGlmIChoYXNfYWxwaGEpIHsKLSAgICAgICAgdG90YWxfcGl4ZWxzICs9IHNyYy0+d2lkdGggKiBzcmMtPmhlaWdodDsKLSAgICAgICAgdG90YWxfc3NlICs9IHNzZVszXTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdFs0XSA9IEdldFBTTlIodG90YWxfc3NlIC8gdG90YWxfcGl4ZWxzKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaW50IGM7Ci0gICAgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShzcmMtPnksIHNyYy0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnksIHJlZi0+eV9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCwgJnN0YXRzWzBdKTsKLSAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+dSwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnUsIHJlZi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZfdywgdXZfaCwgJnN0YXRzWzFdKTsKLSAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+diwgc3JjLT51dl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZWYtPnYsIHJlZi0+dXZfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXZfdywgdXZfaCwgJnN0YXRzWzJdKTsKLSAgICBpZiAoaGFzX2FscGhhKSB7Ci0gICAgICBWUDhTU0lNQWNjdW11bGF0ZVBsYW5lKHNyYy0+YSwgc3JjLT5hX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmLT5hLCByZWYtPmFfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCwgJnN0YXRzWzNdKTsKLSAgICB9Ci0gICAgZm9yIChjID0gMDsgYyA8PSA0OyArK2MpIHsKLSAgICAgIGlmICh0eXBlID09IDEpIHsKLSAgICAgICAgY29uc3QgZG91YmxlIHYgPSBWUDhTU0lNR2V0KCZzdGF0c1tjXSk7Ci0gICAgICAgIHJlc3VsdFtjXSA9IChmbG9hdCkoKHYgPCAxLikgPyAtMTAuMCAqIGxvZzEwKDEuIC0gdikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IGRvdWJsZSB2ID0gVlA4U1NJTUdldFNxdWFyZWRFcnJvcigmc3RhdHNbY10pOwotICAgICAgICByZXN1bHRbY10gPSBHZXRQU05SKHYpOwotICAgICAgfQotICAgICAgLy8gQWNjdW11bGF0ZSBmb3J3YXJkCi0gICAgICBpZiAoYyA8IDQpIFZQOFNTSU1BZGRTdGF0cygmc3RhdHNbY10sICZzdGF0c1s0XSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlc3QgaGlnaC1sZXZlbCBjYWxsczoKLQotdHlwZWRlZiBpbnQgKCpJbXBvcnRlcikoV2ViUFBpY3R1cmUqIGNvbnN0LCBjb25zdCB1aW50OF90KiBjb25zdCwgaW50KTsKLQotc3RhdGljIHNpemVfdCBFbmNvZGUoY29uc3QgdWludDhfdCogcmdiYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgSW1wb3J0ZXIgaW1wb3J0LCBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgaW50IGxvc3NsZXNzLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCkgewotICBXZWJQUGljdHVyZSBwaWM7Ci0gIFdlYlBDb25maWcgY29uZmlnOwotICBXZWJQTWVtb3J5V3JpdGVyIHdydDsKLSAgaW50IG9rOwotCi0gIGlmICghV2ViUENvbmZpZ1ByZXNldCgmY29uZmlnLCBXRUJQX1BSRVNFVF9ERUZBVUxULCBxdWFsaXR5X2ZhY3RvcikgfHwKLSAgICAgICFXZWJQUGljdHVyZUluaXQoJnBpYykpIHsKLSAgICByZXR1cm4gMDsgIC8vIHNob3VsZG4ndCBoYXBwZW4sIGV4Y2VwdCBpZiBzeXN0ZW0gaW5zdGFsbGF0aW9uIGlzIGJyb2tlbgotICB9Ci0KLSAgY29uZmlnLmxvc3NsZXNzID0gISFsb3NzbGVzczsKLSAgcGljLnVzZV9hcmdiID0gISFsb3NzbGVzczsKLSAgcGljLndpZHRoID0gd2lkdGg7Ci0gIHBpYy5oZWlnaHQgPSBoZWlnaHQ7Ci0gIHBpYy53cml0ZXIgPSBXZWJQTWVtb3J5V3JpdGU7Ci0gIHBpYy5jdXN0b21fcHRyID0gJndydDsKLSAgV2ViUE1lbW9yeVdyaXRlckluaXQoJndydCk7Ci0KLSAgb2sgPSBpbXBvcnQoJnBpYywgcmdiYSwgc3RyaWRlKSAmJiBXZWJQRW5jb2RlKCZjb25maWcsICZwaWMpOwotICBXZWJQUGljdHVyZUZyZWUoJnBpYyk7Ci0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUod3J0Lm1lbSk7Ci0gICAgKm91dHB1dCA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgKm91dHB1dCA9IHdydC5tZW07Ci0gIHJldHVybiB3cnQuc2l6ZTsKLX0KLQotI2RlZmluZSBFTkNPREVfRlVOQyhOQU1FLCBJTVBPUlRFUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotc2l6ZV90IE5BTUUoY29uc3QgdWludDhfdCogaW4sIGludCB3LCBpbnQgaCwgaW50IGJwcywgZmxvYXQgcSwgICAgICAgICAgXAotICAgICAgICAgICAgdWludDhfdCoqIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gRW5jb2RlKGluLCB3LCBoLCBicHMsIElNUE9SVEVSLCBxLCAwLCBvdXQpOyAgICAgICAgICAgICAgICAgICAgXAotfQotCi1FTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCLCBXZWJQUGljdHVyZUltcG9ydFJHQik7Ci1FTkNPREVfRlVOQyhXZWJQRW5jb2RlQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUik7Ci1FTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKTsKLUVOQ09ERV9GVU5DKFdlYlBFbmNvZGVCR1JBLCBXZWJQUGljdHVyZUltcG9ydEJHUkEpOwotCi0jdW5kZWYgRU5DT0RFX0ZVTkMKLQotI2RlZmluZSBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFkgNzAuCi0jZGVmaW5lIExPU1NMRVNTX0VOQ09ERV9GVU5DKE5BTUUsIElNUE9SVEVSKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXNpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgXAotICByZXR1cm4gRW5jb2RlKGluLCB3LCBoLCBicHMsIElNUE9SVEVSLCBMT1NTTEVTU19ERUZBVUxUX1FVQUxJVFksIDEsIG91dCk7ICBcCi19Ci0KLUxPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpOwotTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBXZWJQUGljdHVyZUltcG9ydEJHUik7Ci1MT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NSR0JBLCBXZWJQUGljdHVyZUltcG9ydFJHQkEpOwotTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKTsKLQotI3VuZGVmIExPU1NMRVNTX0VOQ09ERV9GVU5DCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3F1YW50LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcXVhbnQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYjBiNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvcXVhbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDEwNTcgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vICAgUXVhbnRpemF0aW9uCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0KLSNkZWZpbmUgRE9fVFJFTExJU19JNCAgMQotI2RlZmluZSBET19UUkVMTElTX0kxNiAxICAgLy8gbm90IGEgaHVnZSBnYWluLCBidXQgb2sgYXQgbG93IGJpdHJhdGUuCi0jZGVmaW5lIERPX1RSRUxMSVNfVVYgIDAgICAvLyBkaXNhYmxlIHRyZWxsaXMgZm9yIFVWLiBSaXNreS4gTm90IHdvcnRoLgotI2RlZmluZSBVU0VfVERJU1RPIDEKLQotI2RlZmluZSBNSURfQUxQSEEgNjQgICAgICAvLyBuZXV0cmFsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotI2RlZmluZSBNSU5fQUxQSEEgMzAgICAgICAvLyBsb3dlc3QgdXNhYmxlIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotI2RlZmluZSBNQVhfQUxQSEEgMTAwICAgICAvLyBoaWdoZXIgbWVhbmluZnVsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQotCi0jZGVmaW5lIFNOU19UT19EUSAwLjkgICAgIC8vIFNjYWxpbmcgY29uc3RhbnQgYmV0d2VlbiB0aGUgc25zIHZhbHVlIGFuZCB0aGUgUVAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXItbGF3IG1vZHVsYXRpb24uIE11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIDEuCi0KLSNkZWZpbmUgSTRfUEVOQUxUWSA0MDAwICAgLy8gUmF0ZS1wZW5hbHR5IGZvciBxdWljayBpNC9pMTYgZGVjaXNpb24KLQotI2RlZmluZSBNVUxUXzhCKGEsIGIpICgoKGEpICogKGIpICsgMTI4KSA+PiA4KQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgbSwgaW50IE0pIHsKLSAgcmV0dXJuIHYgPCBtID8gbSA6IHYgPiBNID8gTSA6IHY7Ci19Ci0KLXN0YXRpYyBjb25zdCB1aW50OF90IGtaaWd6YWdbMTZdID0gewotICAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2LCA5LCAxMiwgMTMsIDEwLCA3LCAxMSwgMTQsIDE1Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDhfdCBrRGNUYWJsZVsxMjhdID0gewotICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMCwKLSAgMTEsICAgMTIsICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTcsCi0gIDE4LCAgIDE5LCAgMjAsICAyMCwgIDIxLCAgMjEsICAyMiwgIDIyLAotICAyMywgICAyMywgIDI0LCAgMjUsICAyNSwgIDI2LCAgMjcsICAyOCwKLSAgMjksICAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LCAgMzYsCi0gIDM3LCAgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLAotICA0NCwgICA0NSwgIDQ2LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwKLSAgNTEsICAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsCi0gIDU5LCAgIDYwLCAgNjEsICA2MiwgIDYzLCAgNjQsICA2NSwgIDY2LAotICA2NywgICA2OCwgIDY5LCAgNzAsICA3MSwgIDcyLCAgNzMsICA3NCwKLSAgNzUsICAgNzYsICA3NiwgIDc3LCAgNzgsICA3OSwgIDgwLCAgODEsCi0gIDgyLCAgIDgzLCAgODQsICA4NSwgIDg2LCAgODcsICA4OCwgIDg5LAotICA5MSwgICA5MywgIDk1LCAgOTYsICA5OCwgMTAwLCAxMDEsIDEwMiwKLSAgMTA0LCAxMDYsIDEwOCwgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTgsCi0gIDEyMiwgMTI0LCAxMjYsIDEyOCwgMTMwLCAxMzIsIDEzNCwgMTM2LAotICAxMzgsIDE0MCwgMTQzLCAxNDUsIDE0OCwgMTUxLCAxNTQsIDE1NwotfTsKLQotc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBY1RhYmxlWzEyOF0gPSB7Ci0gIDQsICAgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLAotICAxMiwgICAxMywgIDE0LCAgMTUsICAxNiwgIDE3LCAgMTgsICAxOSwKLSAgMjAsICAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsCi0gIDI4LCAgIDI5LCAgMzAsICAzMSwgIDMyLCAgMzMsICAzNCwgIDM1LAotICAzNiwgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKLSAgNDQsICAgNDUsICA0NiwgIDQ3LCAgNDgsICA0OSwgIDUwLCAgNTEsCi0gIDUyLCAgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDYwLAotICA2MiwgICA2NCwgIDY2LCAgNjgsICA3MCwgIDcyLCAgNzQsICA3NiwKLSAgNzgsICAgODAsICA4MiwgIDg0LCAgODYsICA4OCwgIDkwLCAgOTIsCi0gIDk0LCAgIDk2LCAgOTgsIDEwMCwgMTAyLCAxMDQsIDEwNiwgMTA4LAotICAxMTAsIDExMiwgMTE0LCAxMTYsIDExOSwgMTIyLCAxMjUsIDEyOCwKLSAgMTMxLCAxMzQsIDEzNywgMTQwLCAxNDMsIDE0NiwgMTQ5LCAxNTIsCi0gIDE1NSwgMTU4LCAxNjEsIDE2NCwgMTY3LCAxNzAsIDE3MywgMTc3LAotICAxODEsIDE4NSwgMTg5LCAxOTMsIDE5NywgMjAxLCAyMDUsIDIwOSwKLSAgMjEzLCAyMTcsIDIyMSwgMjI1LCAyMjksIDIzNCwgMjM5LCAyNDUsCi0gIDI0OSwgMjU0LCAyNTksIDI2NCwgMjY5LCAyNzQsIDI3OSwgMjg0Ci19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0FjVGFibGUyWzEyOF0gPSB7Ci0gIDgsICAgICA4LCAgIDksICAxMCwgIDEyLCAgMTMsICAxNSwgIDE3LAotICAxOCwgICAyMCwgIDIxLCAgMjMsICAyNCwgIDI2LCAgMjcsICAyOSwKLSAgMzEsICAgMzIsICAzNCwgIDM1LCAgMzcsICAzOCwgIDQwLCAgNDEsCi0gIDQzLCAgIDQ0LCAgNDYsICA0OCwgIDQ5LCAgNTEsICA1MiwgIDU0LAotICA1NSwgICA1NywgIDU4LCAgNjAsICA2MiwgIDYzLCAgNjUsICA2NiwKLSAgNjgsICAgNjksICA3MSwgIDcyLCAgNzQsICA3NSwgIDc3LCAgNzksCi0gIDgwLCAgIDgyLCAgODMsICA4NSwgIDg2LCAgODgsICA4OSwgIDkzLAotICA5NiwgICA5OSwgMTAyLCAxMDUsIDEwOCwgMTExLCAxMTQsIDExNywKLSAgMTIwLCAxMjQsIDEyNywgMTMwLCAxMzMsIDEzNiwgMTM5LCAxNDIsCi0gIDE0NSwgMTQ4LCAxNTEsIDE1NSwgMTU4LCAxNjEsIDE2NCwgMTY3LAotICAxNzAsIDE3MywgMTc2LCAxNzksIDE4NCwgMTg5LCAxOTMsIDE5OCwKLSAgMjAzLCAyMDcsIDIxMiwgMjE3LCAyMjEsIDIyNiwgMjMwLCAyMzUsCi0gIDI0MCwgMjQ0LCAyNDksIDI1NCwgMjU4LCAyNjMsIDI2OCwgMjc0LAotICAyODAsIDI4NiwgMjkyLCAyOTksIDMwNSwgMzExLCAzMTcsIDMyMywKLSAgMzMwLCAzMzYsIDM0MiwgMzQ4LCAzNTQsIDM2MiwgMzcwLCAzNzksCi0gIDM4NSwgMzkzLCA0MDEsIDQwOSwgNDE2LCA0MjQsIDQzMiwgNDQwCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga0NvZWZmVGhyZXNoWzE2XSA9IHsKLSAgMCwgIDEwLCAyMCwgMzAsCi0gIDEwLCAyMCwgMzAsIDMwLAotICAyMCwgMzAsIDMwLCAzMCwKLSAgMzAsIDMwLCAzMCwgMzAKLX07Ci0KLS8vIFRPRE8oc2thbCk6IHR1bmUgbW9yZS4gQ29lZmYgdGhyZXNob2xkaW5nPwotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JpYXNNYXRyaWNlc1szXVsxNl0gPSB7ICAvLyBbM10gPSBbbHVtYS1hYyxsdW1hLWRjLGNocm9tYV0KLSAgeyA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiwKLSAgICA5NiwgOTYsIDk2LCA5NiB9LAotICB7IDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2LAotICAgIDk2LCA5NiwgOTYsIDk2IH0sCi0gIHsgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYsCi0gICAgOTYsIDk2LCA5NiwgOTYgfQotfTsKLQotLy8gU2hhcnBlbmluZyBieSAoc2xpZ2h0bHkpIHJhaXNpbmcgdGhlIGhpLWZyZXF1ZW5jeSBjb2VmZnMgKG9ubHkgZm9yIHRyZWxsaXMpLgotLy8gSGFjay1pc2ggYnV0IGhlbHBmdWwgZm9yIG1pZC1iaXRyYXRlIHJhbmdlLiBVc2Ugd2l0aCBjYXJlLgotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZyZXFTaGFycGVuaW5nWzE2XSA9IHsKLSAgMCwgIDMwLCA2MCwgOTAsCi0gIDMwLCA2MCwgOTAsIDkwLAotICA2MCwgOTAsIDkwLCA5MCwKLSAgOTAsIDkwLCA5MCwgOTAKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbml0aWFsaXplIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGluIFZQOE1hdHJpeAotCi0vLyBSZXR1cm5zIHRoZSBhdmVyYWdlIHF1YW50aXplcgotc3RhdGljIGludCBFeHBhbmRNYXRyaXgoVlA4TWF0cml4KiBjb25zdCBtLCBpbnQgdHlwZSkgewotICBpbnQgaTsKLSAgaW50IHN1bSA9IDA7Ci0gIGZvciAoaSA9IDI7IGkgPCAxNjsgKytpKSB7Ci0gICAgbS0+cV9baV0gPSBtLT5xX1sxXTsKLSAgfQotICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tpXTsKLSAgICBjb25zdCBpbnQgYmlhcyA9IGtCaWFzTWF0cmljZXNbdHlwZV1bal07Ci0gICAgbS0+aXFfW2pdID0gKDEgPDwgUUZJWCkgLyBtLT5xX1tqXTsKLSAgICBtLT5iaWFzX1tqXSA9IEJJQVMoYmlhcyk7Ci0gICAgLy8gVE9ETyhza2FsKTogdHVuZSBrQ29lZmZUaHJlc2hbXQotICAgIG0tPnp0aHJlc2hfW2pdID0gKCgyNTYgLyorIGtDb2VmZlRocmVzaFtqXSovIC0gYmlhcykgKiBtLT5xX1tqXSArIDEyNykgPj4gODsKLSAgICBtLT5zaGFycGVuX1tqXSA9IChrRnJlcVNoYXJwZW5pbmdbal0gKiBtLT5xX1tqXSkgPj4gMTE7Ci0gICAgc3VtICs9IG0tPnFfW2pdOwotICB9Ci0gIHJldHVybiAoc3VtICsgOCkgPj4gNDsKLX0KLQotc3RhdGljIHZvaWQgU2V0dXBNYXRyaWNlcyhWUDhFbmNvZGVyKiBlbmMpIHsKLSAgaW50IGk7Ci0gIGNvbnN0IGludCB0bGFtYmRhX3NjYWxlID0KLSAgICAoZW5jLT5tZXRob2RfID49IDQpID8gZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fc2VnbWVudHM7ICsraSkgewotICAgIFZQOFNlZ21lbnRJbmZvKiBjb25zdCBtID0gJmVuYy0+ZHFtX1tpXTsKLSAgICBjb25zdCBpbnQgcSA9IG0tPnF1YW50XzsKLSAgICBpbnQgcTQsIHExNiwgcXV2OwotICAgIG0tPnkxXy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfeTFfZGNfLCAwLCAxMjcpXTsKLSAgICBtLT55MV8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEsICAgICAgICAgICAgICAgICAgMCwgMTI3KV07Ci0KLSAgICBtLT55Ml8ucV9bMF0gPSBrRGNUYWJsZVsgY2xpcChxICsgZW5jLT5kcV95Ml9kY18sIDAsIDEyNyldICogMjsKLSAgICBtLT55Ml8ucV9bMV0gPSBrQWNUYWJsZTJbY2xpcChxICsgZW5jLT5kcV95Ml9hY18sIDAsIDEyNyldOwotCi0gICAgbS0+dXZfLnFfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZW5jLT5kcV91dl9kY18sIDAsIDExNyldOwotICAgIG0tPnV2Xy5xX1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfYWNfLCAwLCAxMjcpXTsKLQotICAgIHE0ICA9IEV4cGFuZE1hdHJpeCgmbS0+eTFfLCAwKTsKLSAgICBxMTYgPSBFeHBhbmRNYXRyaXgoJm0tPnkyXywgMSk7Ci0gICAgcXV2ID0gRXhwYW5kTWF0cml4KCZtLT51dl8sIDIpOwotCi0gICAgLy8gVE9ETzogU3dpdGNoIHRvIGtMYW1iZGEqW10gdGFibGVzPwotICAgIHsKLSAgICAgIG0tPmxhbWJkYV9pNF8gID0gKDMgKiBxNCAqIHE0KSA+PiA3OwotICAgICAgbS0+bGFtYmRhX2kxNl8gPSAoMyAqIHExNiAqIHExNik7Ci0gICAgICBtLT5sYW1iZGFfdXZfICA9ICgzICogcXV2ICogcXV2KSA+PiA2OwotICAgICAgbS0+bGFtYmRhX21vZGVfICAgID0gKDEgKiBxNCAqIHE0KSA+PiA3OwotICAgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTRfICA9ICg3ICogcTQgKiBxNCkgPj4gMzsKLSAgICAgIG0tPmxhbWJkYV90cmVsbGlzX2kxNl8gPSAocTE2ICogcTE2KSA+PiAyOwotICAgICAgbS0+bGFtYmRhX3RyZWxsaXNfdXZfICA9IChxdXYgKnF1dikgPDwgMTsKLSAgICAgIG0tPnRsYW1iZGFfICAgICAgICAgICAgPSAodGxhbWJkYV9zY2FsZSAqIHE0KSA+PiA1OwotICAgIH0KLSAgfQotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW5pdGlhbGl6ZSBmaWx0ZXJpbmcgcGFyYW1ldGVycwotCi0vLyBWZXJ5IHNtYWxsIGZpbHRlci1zdHJlbmd0aCB2YWx1ZXMgaGF2ZSBjbG9zZSB0byBubyB2aXN1YWwgZWZmZWN0LiBTbyB3ZSBjYW4KLS8vIHNhdmUgYSBsaXR0bGUgZGVjb2RpbmctQ1BVIGJ5IHR1cm5pbmcgZmlsdGVyaW5nIG9mZiBmb3IgdGhlc2UuCi0jZGVmaW5lIEZTVFJFTkdUSF9DVVRPRkYgMwotCi1zdGF0aWMgdm9pZCBTZXR1cEZpbHRlclN0cmVuZ3RoKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgaTsKLSAgY29uc3QgaW50IGxldmVsMCA9IGVuYy0+Y29uZmlnXy0+ZmlsdGVyX3N0cmVuZ3RoOwotICBmb3IgKGkgPSAwOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKLSAgICAvLyBTZWdtZW50cyB3aXRoIGxvd2VyIHF1YW50aXplciB3aWxsIGJlIGxlc3MgZmlsdGVyZWQuIFRPRE86IHR1bmUgKHdydCBTTlMpCi0gICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWwwICogMjU2ICogZW5jLT5kcW1fW2ldLnF1YW50XyAvIDEyODsKLSAgICBjb25zdCBpbnQgZiA9IGxldmVsIC8gKDI1NiArIGVuYy0+ZHFtX1tpXS5iZXRhXyk7Ci0gICAgZW5jLT5kcW1fW2ldLmZzdHJlbmd0aF8gPSAoZiA8IEZTVFJFTkdUSF9DVVRPRkYpID8gMCA6IChmID4gNjMpID8gNjMgOiBmOwotICB9Ci0gIC8vIFdlIHJlY29yZCB0aGUgaW5pdGlhbCBzdHJlbmd0aCAobWFpbmx5IGZvciB0aGUgY2FzZSBvZiAxLXNlZ21lbnQgb25seSkuCi0gIGVuYy0+ZmlsdGVyX2hkcl8ubGV2ZWxfID0gZW5jLT5kcW1fWzBdLmZzdHJlbmd0aF87Ci0gIGVuYy0+ZmlsdGVyX2hkcl8uc2ltcGxlXyA9IChlbmMtPmNvbmZpZ18tPmZpbHRlcl90eXBlID09IDApOwotICBlbmMtPmZpbHRlcl9oZHJfLnNoYXJwbmVzc18gPSBlbmMtPmNvbmZpZ18tPmZpbHRlcl9zaGFycG5lc3M7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE5vdGU6IGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlcyBiZWxvdywgcmVtZW1iZXIgdGhhdCB0aGUgbWF4IHJhbmdlCi0vLyBhbGxvd2VkIGJ5IHRoZSBzeW50YXggZm9yIERRX1VWIGlzIFstMTYsMTZdLgotI2RlZmluZSBNQVhfRFFfVVYgKDYpCi0jZGVmaW5lIE1JTl9EUV9VViAoLTQpCi0KLS8vIFdlIHdhbnQgdG8gZW11bGF0ZSBqcGVnLWxpa2UgYmVoYXZpb3VyIHdoZXJlIHRoZSBleHBlY3RlZCAiZ29vZCIgcXVhbGl0eQotLy8gaXMgYXJvdW5kIHE9NzUuIEludGVybmFsbHksIG91ciAiZ29vZCIgbWlkZGxlIGlzIGFyb3VuZCBjPTUwLiBTbyB3ZQotLy8gbWFwIGFjY29yZGluZ2x5IHVzaW5nIGxpbmVhciBwaWVjZS13aXNlIGZ1bmN0aW9uCi1zdGF0aWMgZG91YmxlIFF1YWxpdHlUb0NvbXByZXNzaW9uKGRvdWJsZSBjKSB7Ci0gIGNvbnN0IGRvdWJsZSBsaW5lYXJfYyA9IChjIDwgMC43NSkgPyBjICogKDIuIC8gMy4pIDogMi4gKiBjIC0gMS47Ci0gIC8vIFRoZSBmaWxlIHNpemUgcm91Z2hseSBzY2FsZXMgYXMgcG93KHF1YW50aXplciwgMy4pLiBBY3R1YWxseSwgdGhlCi0gIC8vIGV4cG9uZW50IGlzIHNvbWV3aGVyZSBiZXR3ZWVuIDIuOCBhbmQgMy4yLCBidXQgd2UncmUgbW9zdGx5IGludGVyZXN0ZWQKLSAgLy8gaW4gdGhlIG1pZC1xdWFudCByYW5nZS4gU28gd2Ugc2NhbGUgdGhlIGNvbXByZXNzaWJpbGl0eSBpbnZlcnNlbHkgdG8KLSAgLy8gdGhpcyBwb3dlci1sYXc6IHF1YW50IH49IGNvbXByZXNzaW9uIF4gMS8zLiBUaGlzIGxhdyBob2xkcyB3ZWxsIGZvcgotICAvLyBsb3cgcXVhbnQuIEZpbmVyIG1vZGVsbGluZyBmb3IgaGlnaC1xdWFudCB3b3VsZCBtYWtlIHVzZSBvZiBrQWNUYWJsZVtdCi0gIC8vIG1vcmUgZXhwbGljaXRseS4KLSAgY29uc3QgZG91YmxlIHYgPSBwb3cobGluZWFyX2MsIDEgLyAzLik7Ci0gIHJldHVybiB2OwotfQotCi1zdGF0aWMgZG91YmxlIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihkb3VibGUgYywgZG91YmxlIGFscGhhKSB7Ci0gIC8vIFdlIG1hcCB0aGUgY29tcGxleGl0eSAnYWxwaGEnIGFuZCBxdWFsaXR5IHNldHRpbmcgJ2MnIHRvIGEgY29tcHJlc3Npb24KLSAgLy8gZXhwb25lbnQgZW1waXJpY2FsbHkgbWF0Y2hlZCB0byB0aGUgY29tcHJlc3Npb24gY3VydmUgb2YgbGlianBlZzZiLgotICAvLyBPbiBhdmVyYWdlLCB0aGUgV2ViUCBvdXRwdXQgc2l6ZSB3aWxsIGJlIHJvdWdobHkgc2ltaWxhciB0byB0aGF0IG9mIGEKLSAgLy8gSlBFRyBmaWxlIGNvbXByZXNzZWQgd2l0aCBzYW1lIHF1YWxpdHkgZmFjdG9yLgotICBjb25zdCBkb3VibGUgYW1pbiA9IDAuMzA7Ci0gIGNvbnN0IGRvdWJsZSBhbWF4ID0gMC44NTsKLSAgY29uc3QgZG91YmxlIGV4cF9taW4gPSAwLjQ7Ci0gIGNvbnN0IGRvdWJsZSBleHBfbWF4ID0gMC45OwotICBjb25zdCBkb3VibGUgc2xvcGUgPSAoZXhwX21pbiAtIGV4cF9tYXgpIC8gKGFtYXggLSBhbWluKTsKLSAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgJ2V4cG4nIGZyb20gZXhwX21pbiB0byBleHBfbWF4Ci0gIC8vIGluIHRoZSBbYW1pbiwgYW1heF0gcmFuZ2UuCi0gIGNvbnN0IGRvdWJsZSBleHBuID0gKGFscGhhID4gYW1heCkgPyBleHBfbWluCi0gICAgICAgICAgICAgICAgICAgIDogKGFscGhhIDwgYW1pbikgPyBleHBfbWF4Ci0gICAgICAgICAgICAgICAgICAgIDogZXhwX21heCArIHNsb3BlICogKGFscGhhIC0gYW1pbik7Ci0gIGNvbnN0IGRvdWJsZSB2ID0gcG93KGMsIGV4cG4pOwotICByZXR1cm4gdjsKLX0KLQotc3RhdGljIGludCBTZWdtZW50c0FyZUVxdWl2YWxlbnQoY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMyKSB7Ci0gIHJldHVybiAoUzEtPnF1YW50XyA9PSBTMi0+cXVhbnRfKSAmJiAoUzEtPmZzdHJlbmd0aF8gPT0gUzItPmZzdHJlbmd0aF8pOwotfQotCi1zdGF0aWMgdm9pZCBTaW1wbGlmeVNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBpbnQgbWFwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAsIDEsIDIsIDMgfTsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGludCBudW1fZmluYWxfc2VnbWVudHMgPSAxOwotICBpbnQgczEsIHMyOwotICBmb3IgKHMxID0gMTsgczEgPCBudW1fc2VnbWVudHM7ICsrczEpIHsgICAgLy8gZmluZCBzaW1pbGFyIHNlZ21lbnRzCi0gICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxID0gJmVuYy0+ZHFtX1tzMV07Ci0gICAgaW50IGZvdW5kID0gMDsKLSAgICAvLyBjaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgc2ltaWxhciBzZWdtZW50Ci0gICAgZm9yIChzMiA9IDA7IHMyIDwgbnVtX2ZpbmFsX3NlZ21lbnRzOyArK3MyKSB7Ci0gICAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzIgPSAmZW5jLT5kcW1fW3MyXTsKLSAgICAgIGlmIChTZWdtZW50c0FyZUVxdWl2YWxlbnQoUzEsIFMyKSkgewotICAgICAgICBmb3VuZCA9IDE7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICBtYXBbczFdID0gczI7Ci0gICAgaWYgKCFmb3VuZCkgewotICAgICAgaWYgKG51bV9maW5hbF9zZWdtZW50cyAhPSBzMSkgewotICAgICAgICBlbmMtPmRxbV9bbnVtX2ZpbmFsX3NlZ21lbnRzXSA9IGVuYy0+ZHFtX1tzMV07Ci0gICAgICB9Ci0gICAgICArK251bV9maW5hbF9zZWdtZW50czsKLSAgICB9Ci0gIH0KLSAgaWYgKG51bV9maW5hbF9zZWdtZW50cyA8IG51bV9zZWdtZW50cykgeyAgLy8gUmVtYXAKLSAgICBpbnQgaSA9IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwotICAgIHdoaWxlIChpLS0gPiAwKSBlbmMtPm1iX2luZm9fW2ldLnNlZ21lbnRfID0gbWFwW2VuYy0+bWJfaW5mb19baV0uc2VnbWVudF9dOwotICAgIGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPSBudW1fZmluYWxfc2VnbWVudHM7Ci0gICAgLy8gUmVwbGljYXRlIHRoZSB0cmFpbGluZyBzZWdtZW50IGluZm9zIChpdCdzIG1vc3RseSBjb3NtZXRpY3MpCi0gICAgZm9yIChpID0gbnVtX2ZpbmFsX3NlZ21lbnRzOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKLSAgICAgIGVuYy0+ZHFtX1tpXSA9IGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHMgLSAxXTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBWUDhTZXRTZWdtZW50UGFyYW1zKFZQOEVuY29kZXIqIGNvbnN0IGVuYywgZmxvYXQgcXVhbGl0eSkgewotICBpbnQgaTsKLSAgaW50IGRxX3V2X2FjLCBkcV91dl9kYzsKLSAgY29uc3QgaW50IG51bV9zZWdtZW50cyA9IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c187Ci0gIGNvbnN0IGRvdWJsZSBhbXAgPSBTTlNfVE9fRFEgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMC4gLyAxMjguOwotICBjb25zdCBkb3VibGUgUSA9IHF1YWxpdHkgLyAxMDAuOwotICBjb25zdCBkb3VibGUgY19iYXNlID0gZW5jLT5jb25maWdfLT5lbXVsYXRlX2pwZWdfc2l6ZSA/Ci0gICAgICBRdWFsaXR5VG9KUEVHQ29tcHJlc3Npb24oUSwgZW5jLT5hbHBoYV8gLyAyNTUuKSA6Ci0gICAgICBRdWFsaXR5VG9Db21wcmVzc2lvbihRKTsKLSAgZm9yIChpID0gMDsgaSA8IG51bV9zZWdtZW50czsgKytpKSB7Ci0gICAgLy8gV2UgbW9kdWxhdGUgdGhlIGJhc2UgY29lZmZpY2llbnQgdG8gYWNjb21tb2RhdGUgZm9yIHRoZSBxdWFudGl6YXRpb24KLSAgICAvLyBzdXNjZXB0aWJpbGl0eSBhbmQgYWxsb3cgZGVuc2VyIHNlZ21lbnRzIHRvIGJlIHF1YW50aXplZCBtb3JlLgotICAgIGNvbnN0IGRvdWJsZSBleHBuID0gMS4gLSBhbXAgKiBlbmMtPmRxbV9baV0uYWxwaGFfOwotICAgIGNvbnN0IGRvdWJsZSBjID0gcG93KGNfYmFzZSwgZXhwbik7Ci0gICAgY29uc3QgaW50IHEgPSAoaW50KSgxMjcuICogKDEuIC0gYykpOwotICAgIFNCX0RDSEVDSyhleHBuID4gMC4pOwotICAgIGVuYy0+ZHFtX1tpXS5xdWFudF8gPSBjbGlwKHEsIDAsIDEyNyk7Ci0gIH0KLQotICAvLyBwdXJlbHkgaW5kaWNhdGl2ZSBpbiB0aGUgYml0c3RyZWFtIChleGNlcHQgZm9yIHRoZSAxLXNlZ21lbnQgY2FzZSkKLSAgZW5jLT5iYXNlX3F1YW50XyA9IGVuYy0+ZHFtX1swXS5xdWFudF87Ci0KLSAgLy8gZmlsbC1pbiB2YWx1ZXMgZm9yIHRoZSB1bnVzZWQgc2VnbWVudHMgKHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpCi0gIGZvciAoaSA9IG51bV9zZWdtZW50czsgaSA8IE5VTV9NQl9TRUdNRU5UUzsgKytpKSB7Ci0gICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGVuYy0+YmFzZV9xdWFudF87Ci0gIH0KLQotICAvLyB1dl9hbHBoYV8gaXMgbm9ybWFsbHkgc3ByZWFkIGFyb3VuZCB+NjAuIFRoZSB1c2VmdWwgcmFuZ2UgaXMKLSAgLy8gdHlwaWNhbGx5IH4zMCAocXVpdGUgYmFkKSB0byB+MTAwIChvayB0byBkZWNpbWF0ZSBVViBtb3JlKS4KLSAgLy8gV2UgbWFwIGl0IHRvIHRoZSBzYWZlIG1heGltYWwgcmFuZ2Ugb2YgTUFYL01JTl9EUV9VViBmb3IgZHFfdXYuCi0gIGRxX3V2X2FjID0gKGVuYy0+dXZfYWxwaGFfIC0gTUlEX0FMUEhBKSAqIChNQVhfRFFfVVYgLSBNSU5fRFFfVVYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIChNQVhfQUxQSEEgLSBNSU5fQUxQSEEpOwotICAvLyB3ZSByZXNjYWxlIGJ5IHRoZSB1c2VyLWRlZmluZWQgc3RyZW5ndGggb2YgYWRhcHRhdGlvbgotICBkcV91dl9hYyA9IGRxX3V2X2FjICogZW5jLT5jb25maWdfLT5zbnNfc3RyZW5ndGggLyAxMDA7Ci0gIC8vIGFuZCBtYWtlIGl0IHNhZmUuCi0gIGRxX3V2X2FjID0gY2xpcChkcV91dl9hYywgTUlOX0RRX1VWLCBNQVhfRFFfVVYpOwotICAvLyBXZSBhbHNvIGJvb3N0IHRoZSBkYy11di1xdWFudCBhIGxpdHRsZSwgYmFzZWQgb24gc25zLXN0cmVuZ3RoLCBzaW5jZQotICAvLyBVL1YgY2hhbm5lbHMgYXJlIHF1aXRlIG1vcmUgcmVhY3RpdmUgdG8gaGlnaCBxdWFudHMgKGZsYXQgREMtYmxvY2tzCi0gIC8vIHRlbmQgdG8gYXBwZWFyLCBhbmQgYXJlIGRpc3BsZWFzYW50KS4KLSAgZHFfdXZfZGMgPSAtNCAqIGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoIC8gMTAwOwotICBkcV91dl9kYyA9IGNsaXAoZHFfdXZfZGMsIC0xNSwgMTUpOyAgIC8vIDRiaXQtc2lnbmVkIG1heCBhbGxvd2VkCi0KLSAgZW5jLT5kcV95MV9kY18gPSAwOyAgICAgICAvLyBUT0RPKHNrYWwpOiBkcS1sdW0KLSAgZW5jLT5kcV95Ml9kY18gPSAwOwotICBlbmMtPmRxX3kyX2FjXyA9IDA7Ci0gIGVuYy0+ZHFfdXZfZGNfID0gZHFfdXZfZGM7Ci0gIGVuYy0+ZHFfdXZfYWNfID0gZHFfdXZfYWM7Ci0KLSAgU2V0dXBGaWx0ZXJTdHJlbmd0aChlbmMpOyAgIC8vIGluaXRpYWxpemUgc2VnbWVudHMnIGZpbHRlcmluZywgZXZlbnR1YWxseQotCi0gIGlmIChudW1fc2VnbWVudHMgPiAxKSBTaW1wbGlmeVNlZ21lbnRzKGVuYyk7Ci0KLSAgU2V0dXBNYXRyaWNlcyhlbmMpOyAgICAgICAgIC8vIGZpbmFsaXplIHF1YW50aXphdGlvbiBtYXRyaWNlcwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRm9ybSB0aGUgcHJlZGljdGlvbnMgaW4gY2FjaGUKLQotLy8gTXVzdCBiZSBvcmRlcmVkIHVzaW5nIHtEQ19QUkVELCBUTV9QUkVELCBWX1BSRUQsIEhfUFJFRH0gYXMgaW5kZXgKLWNvbnN0IGludCBWUDhJMTZNb2RlT2Zmc2V0c1s0XSA9IHsgSTE2REMxNiwgSTE2VE0xNiwgSTE2VkUxNiwgSTE2SEUxNiB9OwotY29uc3QgaW50IFZQOFVWTW9kZU9mZnNldHNbNF0gPSB7IEM4REM4LCBDOFRNOCwgQzhWRTgsIEM4SEU4IH07Ci0KLS8vIE11c3QgYmUgaW5kZXhlZCB1c2luZyB7Ql9EQ19QUkVEIC0+IEJfSFVfUFJFRH0gYXMgaW5kZXgKLWNvbnN0IGludCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdID0gewotICBJNERDNCwgSTRUTTQsIEk0VkU0LCBJNEhFNCwgSTRSRDQsIEk0VlI0LCBJNExENCwgSTRWTDQsIEk0SEQ0LCBJNEhVNAotfTsKLQotdm9pZCBWUDhNYWtlTHVtYTE2UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gZW5jLT55X2xlZnRfIDogTlVMTDsKLSAgY29uc3QgdWludDhfdCogY29uc3QgdG9wID0gaXQtPnlfID8gZW5jLT55X3RvcF8gKyBpdC0+eF8gKiAxNiA6IE5VTEw7Ci0gIFZQOEVuY1ByZWRMdW1hMTYoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKLX0KLQotdm9pZCBWUDhNYWtlQ2hyb21hOFByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgbGVmdCA9IGl0LT54XyA/IGVuYy0+dV9sZWZ0XyA6IE5VTEw7Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT55XyA/IGVuYy0+dXZfdG9wXyArIGl0LT54XyAqIDE2IDogTlVMTDsKLSAgVlA4RW5jUHJlZENocm9tYTgoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKLX0KLQotdm9pZCBWUDhNYWtlSW50cmE0UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIFZQOEVuY1ByZWRMdW1hNChpdC0+eXV2X3BfLCBpdC0+aTRfdG9wXyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWFudGl6ZQotCi0vLyBMYXlvdXQ6Ci0vLyArLS0tLSsKLS8vIHxZWVlZfCAwCi0vLyB8WVlZWXwgNAotLy8gfFlZWVl8IDgKLS8vIHxZWVlZfCAxMgotLy8gKy0tLS0rCi0vLyB8VVVWVnwgMTYKLS8vIHxVVVZWfCAyMAotLy8gKy0tLS0rCi0KLWNvbnN0IGludCBWUDhTY2FuWzE2ICsgNCArIDRdID0gewotICAvLyBMdW1hCi0gIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAotICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKLSAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCi0gIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTLAotCi0gIDAgKyAwICogQlBTLCAgIDQgKyAwICogQlBTLCAwICsgNCAqIEJQUywgIDQgKyA0ICogQlBTLCAgICAvLyBVCi0gIDggKyAwICogQlBTLCAgMTIgKyAwICogQlBTLCA4ICsgNCAqIEJQUywgMTIgKyA0ICogQlBTICAgICAvLyBWCi19OwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGlzdG9ydGlvbiBtZWFzdXJlbWVudAotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga1dlaWdodFlbMTZdID0gewotICAzOCwgMzIsIDIwLCA5LCAzMiwgMjgsIDE3LCA3LCAyMCwgMTcsIDEwLCA0LCA5LCA3LCA0LCAyCi19OwotCi1zdGF0aWMgY29uc3QgdWludDE2X3Qga1dlaWdodFRyZWxsaXNbMTZdID0gewotI2lmIFVTRV9URElTVE8gPT0gMAotICAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNgotI2Vsc2UKLSAgMzAsIDI3LCAxOSwgMTEsCi0gIDI3LCAyNCwgMTcsIDEwLAotICAxOSwgMTcsIDEyLCAgOCwKLSAgMTEsIDEwLCAgOCwgIDYKLSNlbmRpZgotfTsKLQotLy8gSW5pdC9Db3B5IHRoZSBjb21tb24gZmllbGRzIGluIHNjb3JlLgotc3RhdGljIHZvaWQgSW5pdFNjb3JlKFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgcmQtPkQgID0gMDsKLSAgcmQtPlNEID0gMDsKLSAgcmQtPlIgID0gMDsKLSAgcmQtPm56ID0gMDsKLSAgcmQtPnNjb3JlID0gTUFYX0NPU1Q7Ci19Ci0KLXN0YXRpYyB2b2lkIENvcHlTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKLSAgZHN0LT5EICA9IHNyYy0+RDsKLSAgZHN0LT5TRCA9IHNyYy0+U0Q7Ci0gIGRzdC0+UiAgPSBzcmMtPlI7Ci0gIGRzdC0+bnogPSBzcmMtPm56OyAgICAgIC8vIG5vdGUgdGhhdCBueiBpcyBub3QgYWNjdW11bGF0ZWQsIGJ1dCBqdXN0IGNvcGllZC4KLSAgZHN0LT5zY29yZSA9IHNyYy0+c2NvcmU7Ci19Ci0KLXN0YXRpYyB2b2lkIEFkZFNjb3JlKFZQOE1vZGVTY29yZSogY29uc3QgZHN0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHNyYykgewotICBkc3QtPkQgICs9IHNyYy0+RDsKLSAgZHN0LT5TRCArPSBzcmMtPlNEOwotICBkc3QtPlIgICs9IHNyYy0+UjsKLSAgZHN0LT5ueiB8PSBzcmMtPm56OyAgICAgLy8gaGVyZSwgbmV3IG56IGJpdHMgYXJlIGFjY3VtdWxhdGVkLgotICBkc3QtPnNjb3JlICs9IHNyYy0+c2NvcmU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQZXJmb3JtcyB0cmVsbGlzLW9wdGltaXplZCBxdWFudGl6YXRpb24uCi0KLS8vIFRyZWxsaXMKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgcHJldjsgICAgICAgIC8vIGJlc3QgcHJldmlvdXMKLSAgaW50IGxldmVsOyAgICAgICAvLyBsZXZlbAotICBpbnQgc2lnbjsgICAgICAgIC8vIHNpZ24gb2YgY29lZmZfaQotICBzY29yZV90IGNvc3Q7ICAgIC8vIGJpdCBjb3N0Ci0gIHNjb3JlX3QgZXJyb3I7ICAgLy8gZGlzdG9ydGlvbiA9IHN1bSBvZiAofGNvZWZmX2l8IC0gbGV2ZWxfaSAqIFFfaSleMgotICBpbnQgY3R4OyAgICAgICAgIC8vIGNvbnRleHQgKG9ubHkgZGVwZW5kcyBvbiAnbGV2ZWwnLiBDb3VsZCBiZSBzcGFyZWQuKQotfSBOb2RlOwotCi0vLyBJZiBhIGNvZWZmaWNpZW50IHdhcyBxdWFudGl6ZWQgdG8gYSB2YWx1ZSBRICh1c2luZyBhIG5ldXRyYWwgYmlhcyksCi0vLyB3ZSB0ZXN0IGFsbCBhbHRlcm5hdGUgcG9zc2liaWxpdGllcyBiZXR3ZWVuIFtRLU1JTl9ERUxUQSwgUStNQVhfREVMVEFdCi0vLyBXZSBkb24ndCB0ZXN0IG5lZ2F0aXZlIHZhbHVlcyB0aG91Z2guCi0jZGVmaW5lIE1JTl9ERUxUQSAwICAgLy8gaG93IG11Y2ggbG93ZXIgbGV2ZWwgdG8gdHJ5Ci0jZGVmaW5lIE1BWF9ERUxUQSAxICAgLy8gaG93IG11Y2ggaGlnaGVyCi0jZGVmaW5lIE5VTV9OT0RFUyAoTUlOX0RFTFRBICsgMSArIE1BWF9ERUxUQSkKLSNkZWZpbmUgTk9ERShuLCBsKSAobm9kZXNbKG4pICsgMV1bKGwpICsgTUlOX0RFTFRBXSkKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2V0UkRTY29yZShpbnQgbGFtYmRhLCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIC8vIFRPRE86IGluY29ycG9yYXRlIHRoZSAiKiAyNTYiIGluIHRoZSB0YWJsZXM/Ci0gIHJkLT5zY29yZSA9IHJkLT5SICogbGFtYmRhICsgMjU2ICogKHJkLT5EICsgcmQtPlNEKTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHNjb3JlX3QgUkRTY29yZVRyZWxsaXMoaW50IGxhbWJkYSwgc2NvcmVfdCByYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfdCBkaXN0b3J0aW9uKSB7Ci0gIHJldHVybiByYXRlICogbGFtYmRhICsgMjU2ICogZGlzdG9ydGlvbjsKLX0KLQotc3RhdGljIGludCBUcmVsbGlzUXVhbnRpemVCbG9jayhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHgwLCBpbnQgY29lZmZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYW1iZGEpIHsKLSAgUHJvYmFBcnJheSogY29uc3QgbGFzdF9jb3N0cyA9IGl0LT5lbmNfLT5wcm9iYV8uY29lZmZzX1tjb2VmZl90eXBlXTsKLSAgQ29zdEFycmF5KiBjb25zdCBjb3N0cyA9IGl0LT5lbmNfLT5wcm9iYV8ubGV2ZWxfY29zdF9bY29lZmZfdHlwZV07Ci0gIGNvbnN0IGludCBmaXJzdCA9IChjb2VmZl90eXBlID09IDApID8gMSA6IDA7Ci0gIE5vZGUgbm9kZXNbMTddW05VTV9OT0RFU107Ci0gIGludCBiZXN0X3BhdGhbM10gPSB7LTEsIC0xLCAtMX07ICAgLy8gc3RvcmUgYmVzdC1sYXN0L2Jlc3QtbGV2ZWwvYmVzdC1wcmV2aW91cwotICBzY29yZV90IGJlc3Rfc2NvcmU7Ci0gIGludCBiZXN0X25vZGU7Ci0gIGludCBsYXN0ID0gZmlyc3QgLSAxOwotICBpbnQgbiwgbSwgcCwgbno7Ci0KLSAgewotICAgIHNjb3JlX3QgY29zdDsKLSAgICBzY29yZV90IG1heF9lcnJvcjsKLSAgICBjb25zdCBpbnQgdGhyZXNoID0gbXR4LT5xX1sxXSAqIG10eC0+cV9bMV0gLyA0OwotICAgIGNvbnN0IGludCBsYXN0X3Byb2JhID0gbGFzdF9jb3N0c1tWUDhFbmNCYW5kc1tmaXJzdF1dW2N0eDBdWzBdOwotCi0gICAgLy8gY29tcHV0ZSBtYXhpbWFsIGRpc3RvcnRpb24uCi0gICAgbWF4X2Vycm9yID0gMDsKLSAgICBmb3IgKG4gPSBmaXJzdDsgbiA8IDE2OyArK24pIHsKLSAgICAgIGNvbnN0IGludCBqICA9IGtaaWd6YWdbbl07Ci0gICAgICBjb25zdCBpbnQgZXJyID0gaW5bal0gKiBpbltqXTsKLSAgICAgIG1heF9lcnJvciArPSBrV2VpZ2h0VHJlbGxpc1tqXSAqIGVycjsKLSAgICAgIGlmIChlcnIgPiB0aHJlc2gpIGxhc3QgPSBuOwotICAgIH0KLSAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdvIGluc3BlY3QgdXAgdG8gbiA9IDE2IGNvZWZmcy4gV2UgY2FuIGp1c3QgZ28gdXAKLSAgICAvLyB0byBsYXN0ICsgMSAoaW5jbHVzaXZlKSB3aXRob3V0IGxvc2luZyBtdWNoLgotICAgIGlmIChsYXN0IDwgMTUpICsrbGFzdDsKLQotICAgIC8vIGNvbXB1dGUgJ3NraXAnIHNjb3JlLiBUaGlzIGlzIHRoZSBtYXggc2NvcmUgb25lIGNhbiBkby4KLSAgICBjb3N0ID0gVlA4Qml0Q29zdCgwLCBsYXN0X3Byb2JhKTsKLSAgICBiZXN0X3Njb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBjb3N0LCBtYXhfZXJyb3IpOwotCi0gICAgLy8gaW5pdGlhbGl6ZSBzb3VyY2Ugbm9kZS4KLSAgICBuID0gZmlyc3QgLSAxOwotICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKLSAgICAgIE5PREUobiwgbSkuY29zdCA9IDA7Ci0gICAgICBOT0RFKG4sIG0pLmVycm9yID0gbWF4X2Vycm9yOwotICAgICAgTk9ERShuLCBtKS5jdHggPSBjdHgwOwotICAgIH0KLSAgfQotCi0gIC8vIHRyYXZlcnNlIHRyZWxsaXMuCi0gIGZvciAobiA9IGZpcnN0OyBuIDw9IGxhc3Q7ICsrbikgewotICAgIGNvbnN0IGludCBqICA9IGtaaWd6YWdbbl07Ci0gICAgY29uc3QgaW50IFEgID0gbXR4LT5xX1tqXTsKLSAgICBjb25zdCBpbnQgaVEgPSBtdHgtPmlxX1tqXTsKLSAgICBjb25zdCBpbnQgQiA9IEJJQVMoMHgwMCk7ICAgICAvLyBuZXV0cmFsIGJpYXMKLSAgICAvLyBub3RlOiBpdCdzIGltcG9ydGFudCB0byB0YWtlIHNpZ24gb2YgdGhlIF9vcmlnaW5hbF8gY29lZmYsCi0gICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjb25zaWRlciBsZXZlbCA8IDAgYWZ0ZXJ3YXJkLgotICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7Ci0gICAgaW50IGNvZWZmMCA9IChzaWduID8gLWluW2pdIDogaW5bal0pICsgbXR4LT5zaGFycGVuX1tqXTsKLSAgICBpbnQgbGV2ZWwwOwotICAgIGlmIChjb2VmZjAgPiAyMDQ3KSBjb2VmZjAgPSAyMDQ3OwotCi0gICAgbGV2ZWwwID0gUVVBTlRESVYoY29lZmYwLCBpUSwgQik7Ci0gICAgLy8gdGVzdCBhbGwgYWx0ZXJuYXRlIGxldmVsIHZhbHVlcyBhcm91bmQgbGV2ZWwwLgotICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKLSAgICAgIE5vZGUqIGNvbnN0IGN1ciA9ICZOT0RFKG4sIG0pOwotICAgICAgaW50IGRlbHRhX2Vycm9yLCBuZXdfZXJyb3I7Ci0gICAgICBzY29yZV90IGN1cl9zY29yZSA9IE1BWF9DT1NUOwotICAgICAgaW50IGxldmVsID0gbGV2ZWwwICsgbTsKLSAgICAgIGludCBsYXN0X3Byb2JhOwotCi0gICAgICBjdXItPnNpZ24gPSBzaWduOwotICAgICAgY3VyLT5sZXZlbCA9IGxldmVsOwotICAgICAgY3VyLT5jdHggPSAobGV2ZWwgPT0gMCkgPyAwIDogKGxldmVsID09IDEpID8gMSA6IDI7Ci0gICAgICBpZiAobGV2ZWwgPj0gMjA0OCB8fCBsZXZlbCA8IDApIHsgICAvLyBub2RlIGlzIGRlYWQ/Ci0gICAgICAgIGN1ci0+Y29zdCA9IE1BWF9DT1NUOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGxhc3RfcHJvYmEgPSBsYXN0X2Nvc3RzW1ZQOEVuY0JhbmRzW24gKyAxXV1bY3VyLT5jdHhdWzBdOwotCi0gICAgICAvLyBDb21wdXRlIGRlbHRhX2Vycm9yID0gaG93IG11Y2ggY29kaW5nIHRoaXMgbGV2ZWwgd2lsbAotICAgICAgLy8gc3VidHJhY3QgYXMgZGlzdG9ydGlvbiB0byBtYXhfZXJyb3IKLSAgICAgIG5ld19lcnJvciA9IGNvZWZmMCAtIGxldmVsICogUTsKLSAgICAgIGRlbHRhX2Vycm9yID0KLSAgICAgICAga1dlaWdodFRyZWxsaXNbal0gKiAoY29lZmYwICogY29lZmYwIC0gbmV3X2Vycm9yICogbmV3X2Vycm9yKTsKLQotICAgICAgLy8gSW5zcGVjdCBhbGwgcG9zc2libGUgbm9uLWRlYWQgcHJlZGVjZXNzb3JzLiBSZXRhaW4gb25seSB0aGUgYmVzdCBvbmUuCi0gICAgICBmb3IgKHAgPSAtTUlOX0RFTFRBOyBwIDw9IE1BWF9ERUxUQTsgKytwKSB7Ci0gICAgICAgIGNvbnN0IE5vZGUqIGNvbnN0IHByZXYgPSAmTk9ERShuIC0gMSwgcCk7Ci0gICAgICAgIGNvbnN0IGludCBwcmV2X2N0eCA9IHByZXYtPmN0eDsKLSAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHRjb3N0ID0gY29zdHNbVlA4RW5jQmFuZHNbbl1dW3ByZXZfY3R4XTsKLSAgICAgICAgY29uc3Qgc2NvcmVfdCB0b3RhbF9lcnJvciA9IHByZXYtPmVycm9yIC0gZGVsdGFfZXJyb3I7Ci0gICAgICAgIHNjb3JlX3QgY29zdCwgYmFzZV9jb3N0LCBzY29yZTsKLQotICAgICAgICBpZiAocHJldi0+Y29zdCA+PSBNQVhfQ09TVCkgeyAgIC8vIGRlYWQgbm9kZT8KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEJhc2UgY29zdCBvZiBib3RoIHRlcm1pbmFsL25vbi10ZXJtaW5hbAotICAgICAgICBiYXNlX2Nvc3QgPSBwcmV2LT5jb3N0ICsgVlA4TGV2ZWxDb3N0KHRjb3N0LCBsZXZlbCk7Ci0KLSAgICAgICAgLy8gRXhhbWluZSBub2RlIGFzc3VtaW5nIGl0J3MgYSBub24tdGVybWluYWwgb25lLgotICAgICAgICBjb3N0ID0gYmFzZV9jb3N0OwotICAgICAgICBpZiAobGV2ZWwgJiYgbiA8IDE1KSB7Ci0gICAgICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDEsIGxhc3RfcHJvYmEpOwotICAgICAgICB9Ci0gICAgICAgIHNjb3JlID0gUkRTY29yZVRyZWxsaXMobGFtYmRhLCBjb3N0LCB0b3RhbF9lcnJvcik7Ci0gICAgICAgIGlmIChzY29yZSA8IGN1cl9zY29yZSkgewotICAgICAgICAgIGN1cl9zY29yZSA9IHNjb3JlOwotICAgICAgICAgIGN1ci0+Y29zdCAgPSBjb3N0OwotICAgICAgICAgIGN1ci0+ZXJyb3IgPSB0b3RhbF9lcnJvcjsKLSAgICAgICAgICBjdXItPnByZXYgID0gcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE5vdywgcmVjb3JkIGJlc3QgdGVybWluYWwgbm9kZSAoYW5kIHRodXMgYmVzdCBlbnRyeSBpbiB0aGUgZ3JhcGgpLgotICAgICAgICBpZiAobGV2ZWwpIHsKLSAgICAgICAgICBjb3N0ID0gYmFzZV9jb3N0OwotICAgICAgICAgIGlmIChuIDwgMTUpIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3Byb2JhKTsKLSAgICAgICAgICBzY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgdG90YWxfZXJyb3IpOwotICAgICAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKLSAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgIGJlc3RfcGF0aFswXSA9IG47ICAgLy8gYmVzdCBlb2IgcG9zaXRpb24KLSAgICAgICAgICAgIGJlc3RfcGF0aFsxXSA9IG07ICAgLy8gYmVzdCBsZXZlbAotICAgICAgICAgICAgYmVzdF9wYXRoWzJdID0gcDsgICAvLyBiZXN0IHByZWRlY2Vzc29yCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gRnJlc2ggc3RhcnQKLSAgU2JNZW1vcnlTZXQoaW4gKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCppbikpOwotICBTYk1lbW9yeVNldChvdXQgKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCpvdXQpKTsKLSAgaWYgKGJlc3RfcGF0aFswXSA9PSAtMSkgewotICAgIHJldHVybiAwOyAgIC8vIHNraXAhCi0gIH0KLQotICAvLyBVbndpbmQgdGhlIGJlc3QgcGF0aC4KLSAgLy8gTm90ZTogYmVzdC1wcmV2IG9uIHRlcm1pbmFsIG5vZGUgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZQotICAvLyBiZXN0X3ByZXYgZm9yIG5vbi10ZXJtaW5hbC4gU28gd2UgcGF0Y2ggYmVzdF9wYXRoWzJdIGluLgotICBuID0gYmVzdF9wYXRoWzBdOwotICBiZXN0X25vZGUgPSBiZXN0X3BhdGhbMV07Ci0gIE5PREUobiwgYmVzdF9ub2RlKS5wcmV2ID0gYmVzdF9wYXRoWzJdOyAgIC8vIGZvcmNlIGJlc3QtcHJldiBmb3IgdGVybWluYWwKLSAgbnogPSAwOwotCi0gIGZvciAoOyBuID49IGZpcnN0OyAtLW4pIHsKLSAgICBjb25zdCBOb2RlKiBjb25zdCBub2RlID0gJk5PREUobiwgYmVzdF9ub2RlKTsKLSAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07Ci0gICAgb3V0W25dID0gbm9kZS0+c2lnbiA/IC1ub2RlLT5sZXZlbCA6IG5vZGUtPmxldmVsOwotICAgIG56IHw9IChub2RlLT5sZXZlbCAhPSAwKTsKLSAgICBpbltqXSA9IG91dFtuXSAqIG10eC0+cV9bal07Ci0gICAgYmVzdF9ub2RlID0gbm9kZS0+cHJldjsKLSAgfQotICByZXR1cm4gbno7Ci19Ci0KLSN1bmRlZiBOT0RFCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQZXJmb3JtczogZGlmZmVyZW5jZSwgdHJhbnNmb3JtLCBxdWFudGl6ZSwgYmFjay10cmFuc2Zvcm0sIGFkZAotLy8gYWxsIGF0IG9uY2UuIE91dHB1dCBpcyB0aGUgcmVjb25zdHJ1Y3RlZCBibG9jayBpbiAqeXV2X291dCwgYW5kIHRoZQotLy8gcXVhbnRpemVkIGxldmVscyBpbiAqbGV2ZWxzLgotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgeXV2X291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STE2TW9kZU9mZnNldHNbbW9kZV07Ci0gIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgaW50IG56ID0gMDsKLSAgaW50IG47Ci0gIGludDE2X3QgdG1wWzE2XVsxNl0sIGRjX3RtcFsxNl07Ci0KLSAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKLSAgICBWUDhGVHJhbnNmb3JtKHNyYyArIFZQOFNjYW5bbl0sIHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSk7Ci0gIH0KLSAgVlA4RlRyYW5zZm9ybVdIVCh0bXBbMF0sIGRjX3RtcCk7Ci0gIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2soZGNfdG1wLCByZC0+eV9kY19sZXZlbHMsIDAsICZkcW0tPnkyXykgPDwgMjQ7Ci0KLSAgaWYgKERPX1RSRUxMSVNfSTE2ICYmIGl0LT5kb190cmVsbGlzXykgewotICAgIGludCB4LCB5OwotICAgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsKLSAgICBmb3IgKHkgPSAwLCBuID0gMDsgeSA8IDQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCwgKytuKSB7Ci0gICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKLSAgICAgICAgY29uc3QgaW50IG5vbl96ZXJvID0KLSAgICAgICAgICAgVHJlbGxpc1F1YW50aXplQmxvY2soaXQsIHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCBjdHgsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnkxXywgZHFtLT5sYW1iZGFfdHJlbGxpc19pMTZfKTsKLSAgICAgICAgaXQtPnRvcF9uel9beF0gPSBpdC0+bGVmdF9uel9beV0gPSBub25femVybzsKLSAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24pIHsKLSAgICAgIG56IHw9IFZQOEVuY1F1YW50aXplQmxvY2sodG1wW25dLCByZC0+eV9hY19sZXZlbHNbbl0sIDEsICZkcW0tPnkxXykgPDwgbjsKLSAgICB9Ci0gIH0KLQotICAvLyBUcmFuc2Zvcm0gYmFjawotICBWUDhJVHJhbnNmb3JtV0hUKGRjX3RtcCwgdG1wWzBdKTsKLSAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKLSAgICBWUDhJVHJhbnNmb3JtKHJlZiArIFZQOFNjYW5bbl0sIHRtcFtuXSwgeXV2X291dCArIFZQOFNjYW5bbl0sIDEpOwotICB9Ci0KLSAgcmV0dXJuIG56OwotfQotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBsZXZlbHNbMTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4STRNb2RlT2Zmc2V0c1ttb2RlXTsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBpbnQgbnogPSAwOwotICBpbnQxNl90IHRtcFsxNl07Ci0KLSAgVlA4RlRyYW5zZm9ybShzcmMsIHJlZiwgdG1wKTsKLSAgaWYgKERPX1RSRUxMSVNfSTQgJiYgaXQtPmRvX3RyZWxsaXNfKSB7Ci0gICAgY29uc3QgaW50IHggPSBpdC0+aTRfICYgMywgeSA9IGl0LT5pNF8gPj4gMjsKLSAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07Ci0gICAgbnogPSBUcmVsbGlzUXVhbnRpemVCbG9jayhpdCwgdG1wLCBsZXZlbHMsIGN0eCwgMywgJmRxbS0+eTFfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHFtLT5sYW1iZGFfdHJlbGxpc19pNF8pOwotICB9IGVsc2UgewotICAgIG56ID0gVlA4RW5jUXVhbnRpemVCbG9jayh0bXAsIGxldmVscywgMCwgJmRxbS0+eTFfKTsKLSAgfQotICBWUDhJVHJhbnNmb3JtKHJlZiwgdG1wLCB5dXZfb3V0LCAwKTsKLSAgcmV0dXJuIG56OwotfQotCi1zdGF0aWMgaW50IFJlY29uc3RydWN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsIGludCBtb2RlKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXTsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRjsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBpbnQgbnogPSAwOwotICBpbnQgbjsKLSAgaW50MTZfdCB0bXBbOF1bMTZdOwotCi0gIGZvciAobiA9IDA7IG4gPCA4OyArK24pIHsKLSAgICBWUDhGVHJhbnNmb3JtKHNyYyArIFZQOFNjYW5bMTYgKyBuXSwgcmVmICsgVlA4U2NhblsxNiArIG5dLCB0bXBbbl0pOwotICB9Ci0gIGlmIChET19UUkVMTElTX1VWICYmIGl0LT5kb190cmVsbGlzXykgewotICAgIGludCBjaCwgeCwgeTsKLSAgICBmb3IgKGNoID0gMCwgbiA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKLSAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKLSAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCwgKytuKSB7Ci0gICAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOwotICAgICAgICAgIGNvbnN0IGludCBub25femVybyA9Ci0gICAgICAgICAgICBUcmVsbGlzUXVhbnRpemVCbG9jayhpdCwgdG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCBjdHgsIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT51dl8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfdXZfKTsKLSAgICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IG5vbl96ZXJvOwotICAgICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgewotICAgICAgbnogfD0gVlA4RW5jUXVhbnRpemVCbG9jayh0bXBbbl0sIHJkLT51dl9sZXZlbHNbbl0sIDAsICZkcW0tPnV2XykgPDwgbjsKLSAgICB9Ci0gIH0KLQotICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7Ci0gICAgVlA4SVRyYW5zZm9ybShyZWYgKyBWUDhTY2FuWzE2ICsgbl0sIHRtcFtuXSwgeXV2X291dCArIFZQOFNjYW5bMTYgKyBuXSwgMSk7Ci0gIH0KLSAgcmV0dXJuIChueiA8PCAxNik7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSRC1vcHQgZGVjaXNpb24uIFJlY29uc3RydWN0IGVhY2ggbW9kZXMsIGV2YWx1ZSBkaXN0b3J0aW9uIGFuZCBiaXQtY29zdC4KLS8vIFBpY2sgdGhlIG1vZGUgaXMgbG93ZXIgUkQtY29zdCA9IFJhdGUgKyBsYW1iYSAqIERpc3RvcnRpb24uCi0KLXN0YXRpYyB2b2lkIFN3YXBQdHIodWludDhfdCoqIGEsIHVpbnQ4X3QqKiBiKSB7Ci0gIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICphOwotICAqYSA9ICpiOwotICAqYiA9IHRtcDsKLX0KLQotc3RhdGljIHZvaWQgU3dhcE91dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKLSAgU3dhcFB0cigmaXQtPnl1dl9vdXRfLCAmaXQtPnl1dl9vdXQyXyk7Ci19Ci0KLXN0YXRpYyB2b2lkIFBpY2tCZXN0SW50cmExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKLSAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2kxNl87Ci0gIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRjsKLSAgVlA4TW9kZVNjb3JlIHJkMTY7Ci0gIGludCBtb2RlOwotCi0gIHJkLT5tb2RlX2kxNiA9IC0xOwotICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgewotICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkY7ICAvLyBzY3JhdGNoIGJ1ZmZlcgotICAgIGludCBuejsKLQotICAgIC8vIFJlY29uc3RydWN0Ci0gICAgbnogPSBSZWNvbnN0cnVjdEludHJhMTYoaXQsICZyZDE2LCB0bXBfZHN0LCBtb2RlKTsKLQotICAgIC8vIE1lYXN1cmUgUkQtc2NvcmUKLSAgICByZDE2LkQgPSBWUDhTU0UxNngxNihzcmMsIHRtcF9kc3QpOwotICAgIHJkMTYuU0QgPSB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG8xNngxNihzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkKLSAgICAgICAgICAgIDogMDsKLSAgICByZDE2LlIgPSBWUDhHZXRDb3N0THVtYTE2KGl0LCAmcmQxNik7Ci0gICAgcmQxNi5SICs9IFZQOEZpeGVkQ29zdHNJMTZbbW9kZV07Ci0KLSAgICAvLyBTaW5jZSB3ZSBhbHdheXMgZXhhbWluZSBJbnRyYTE2IGZpcnN0LCB3ZSBjYW4gb3ZlcndyaXRlICpyZCBkaXJlY3RseS4KLSAgICBTZXRSRFNjb3JlKGxhbWJkYSwgJnJkMTYpOwotICAgIGlmIChtb2RlID09IDAgfHwgcmQxNi5zY29yZSA8IHJkLT5zY29yZSkgewotICAgICAgQ29weVNjb3JlKHJkLCAmcmQxNik7Ci0gICAgICByZC0+bW9kZV9pMTYgPSBtb2RlOwotICAgICAgcmQtPm56ID0gbno7Ci0gICAgICBTYk1lbW9yeUNvcHkocmQtPnlfYWNfbGV2ZWxzLCByZDE2LnlfYWNfbGV2ZWxzLCBzaXplb2YocmQxNi55X2FjX2xldmVscykpOwotICAgICAgU2JNZW1vcnlDb3B5KHJkLT55X2RjX2xldmVscywgcmQxNi55X2RjX2xldmVscywgc2l6ZW9mKHJkMTYueV9kY19sZXZlbHMpKTsKLSAgICAgIFN3YXBPdXQoaXQpOwotICAgIH0KLSAgfQotICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCByZCk7ICAgLy8gZmluYWxpemUgc2NvcmUgZm9yIG1vZGUgZGVjaXNpb24uCi0gIFZQOFNldEludHJhMTZNb2RlKGl0LCByZC0+bW9kZV9pMTYpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyByZXR1cm4gdGhlIGNvc3QgYXJyYXkgY29ycmVzcG9uZGluZyB0byB0aGUgc3Vycm91bmRpbmcgcHJlZGljdGlvbiBtb2Rlcy4KLXN0YXRpYyBjb25zdCB1aW50MTZfdCogR2V0Q29zdE1vZGVJNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCBtb2Rlc1sxNl0pIHsKLSAgY29uc3QgaW50IHByZWRzX3cgPSBpdC0+ZW5jXy0+cHJlZHNfd187Ci0gIGNvbnN0IGludCB4ID0gKGl0LT5pNF8gJiAzKSwgeSA9IGl0LT5pNF8gPj4gMjsKLSAgY29uc3QgaW50IGxlZnQgPSAoeCA9PSAwKSA/IGl0LT5wcmVkc19beSAqIHByZWRzX3cgLSAxXSA6IG1vZGVzW2l0LT5pNF8gLSAxXTsKLSAgY29uc3QgaW50IHRvcCA9ICh5ID09IDApID8gaXQtPnByZWRzX1stcHJlZHNfdyArIHhdIDogbW9kZXNbaXQtPmk0XyAtIDRdOwotICByZXR1cm4gVlA4Rml4ZWRDb3N0c0k0W3RvcF1bbGVmdF07Ci19Ci0KLXN0YXRpYyBpbnQgUGlja0Jlc3RJbnRyYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJmVuYy0+ZHFtX1tpdC0+bWJfLT5zZWdtZW50X107Ci0gIGNvbnN0IGludCBsYW1iZGEgPSBkcW0tPmxhbWJkYV9pNF87Ci0gIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjMCA9IGl0LT55dXZfaW5fICsgWV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IGJlc3RfYmxvY2tzID0gaXQtPnl1dl9vdXQyXyArIFlfT0ZGOwotICBpbnQgdG90YWxfaGVhZGVyX2JpdHMgPSAwOwotICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKLQotICBpZiAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEluaXRTY29yZSgmcmRfYmVzdCk7Ci0gIHJkX2Jlc3Quc2NvcmUgPSAyMTE7ICAvLyAnMjExJyBpcyB0aGUgdmFsdWUgb2YgVlA4Qml0Q29zdCgwLCAxNDUpCi0gIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7Ci0gIGRvIHsKLSAgICBWUDhNb2RlU2NvcmUgcmRfaTQ7Ci0gICAgaW50IG1vZGU7Ci0gICAgaW50IGJlc3RfbW9kZSA9IC0xOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYyA9IHNyYzAgKyBWUDhTY2FuW2l0LT5pNF9dOwotICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBtb2RlX2Nvc3RzID0gR2V0Q29zdE1vZGVJNChpdCwgcmQtPm1vZGVzX2k0KTsKLSAgICB1aW50OF90KiBiZXN0X2Jsb2NrID0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dOwotICAgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X3BfICsgSTRUTVA7ICAgIC8vIHNjcmF0Y2ggYnVmZmVyLgotCi0gICAgSW5pdFNjb3JlKCZyZF9pNCk7Ci0gICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7Ci0gICAgICBWUDhNb2RlU2NvcmUgcmRfdG1wOwotICAgICAgaW50MTZfdCB0bXBfbGV2ZWxzWzE2XTsKLQotICAgICAgLy8gUmVjb25zdHJ1Y3QKLSAgICAgIHJkX3RtcC5ueiA9Ci0gICAgICAgICAgUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHRtcF9sZXZlbHMsIHNyYywgdG1wX2RzdCwgbW9kZSkgPDwgaXQtPmk0XzsKLQotICAgICAgLy8gQ29tcHV0ZSBSRC1zY29yZQotICAgICAgcmRfdG1wLkQgPSBWUDhTU0U0eDQoc3JjLCB0bXBfZHN0KTsKLSAgICAgIHJkX3RtcC5TRCA9Ci0gICAgICAgICAgdGxhbWJkYSA/IE1VTFRfOEIodGxhbWJkYSwgVlA4VERpc3RvNHg0KHNyYywgdG1wX2RzdCwga1dlaWdodFkpKQotICAgICAgICAgICAgICAgICAgOiAwOwotICAgICAgcmRfdG1wLlIgPSBWUDhHZXRDb3N0THVtYTQoaXQsIHRtcF9sZXZlbHMpOwotICAgICAgcmRfdG1wLlIgKz0gbW9kZV9jb3N0c1ttb2RlXTsKLQotICAgICAgU2V0UkRTY29yZShsYW1iZGEsICZyZF90bXApOwotICAgICAgaWYgKGJlc3RfbW9kZSA8IDAgfHwgcmRfdG1wLnNjb3JlIDwgcmRfaTQuc2NvcmUpIHsKLSAgICAgICAgQ29weVNjb3JlKCZyZF9pNCwgJnJkX3RtcCk7Ci0gICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgIFN3YXBQdHIoJnRtcF9kc3QsICZiZXN0X2Jsb2NrKTsKLSAgICAgICAgU2JNZW1vcnlDb3B5KHJkX2Jlc3QueV9hY19sZXZlbHNbaXQtPmk0X10sIHRtcF9sZXZlbHMsIHNpemVvZih0bXBfbGV2ZWxzKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9pNCk7Ci0gICAgQWRkU2NvcmUoJnJkX2Jlc3QsICZyZF9pNCk7Ci0gICAgdG90YWxfaGVhZGVyX2JpdHMgKz0gbW9kZV9jb3N0c1tiZXN0X21vZGVdOwotICAgIGlmIChyZF9iZXN0LnNjb3JlID49IHJkLT5zY29yZSB8fAotICAgICAgICB0b3RhbF9oZWFkZXJfYml0cyA+IGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXykgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIC8vIENvcHkgc2VsZWN0ZWQgc2FtcGxlcyBpZiBub3QgaW4gdGhlIHJpZ2h0IHBsYWNlIGFscmVhZHkuCi0gICAgaWYgKGJlc3RfYmxvY2sgIT0gYmVzdF9ibG9ja3MgKyBWUDhTY2FuW2l0LT5pNF9dKQotICAgICAgVlA4Q29weTR4NChiZXN0X2Jsb2NrLCBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pOwotICAgIHJkLT5tb2Rlc19pNFtpdC0+aTRfXSA9IGJlc3RfbW9kZTsKLSAgICBpdC0+dG9wX256X1tpdC0+aTRfICYgM10gPSBpdC0+bGVmdF9uel9baXQtPmk0XyA+PiAyXSA9IChyZF9pNC5ueiA/IDEgOiAwKTsKLSAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgYmVzdF9ibG9ja3MpKTsKLQotICAvLyBmaW5hbGl6ZSBzdGF0ZQotICBDb3B5U2NvcmUocmQsICZyZF9iZXN0KTsKLSAgVlA4U2V0SW50cmE0TW9kZShpdCwgcmQtPm1vZGVzX2k0KTsKLSAgU3dhcE91dChpdCk7Ci0gIFNiTWVtb3J5Q29weShyZC0+eV9hY19sZXZlbHMsIHJkX2Jlc3QueV9hY19sZXZlbHMsIHNpemVvZihyZC0+eV9hY19sZXZlbHMpKTsKLSAgcmV0dXJuIDE7ICAgLy8gc2VsZWN0IGludHJhNHg0IG92ZXIgaW50cmExNngxNgotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBQaWNrQmVzdFVWKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgewotICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKLSAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOwotICBjb25zdCBpbnQgbGFtYmRhID0gZHFtLT5sYW1iZGFfdXZfOwotICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFVfT0ZGOwotICB1aW50OF90KiBjb25zdCB0bXBfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFVfT0ZGOyAgLy8gc2NyYXRjaCBidWZmZXIKLSAgdWludDhfdCogY29uc3QgZHN0MCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGOwotICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKLSAgaW50IG1vZGU7Ci0KLSAgcmQtPm1vZGVfdXYgPSAtMTsKLSAgSW5pdFNjb3JlKCZyZF9iZXN0KTsKLSAgZm9yIChtb2RlID0gMDsgbW9kZSA8IE5VTV9QUkVEX01PREVTOyArK21vZGUpIHsKLSAgICBWUDhNb2RlU2NvcmUgcmRfdXY7Ci0KLSAgICAvLyBSZWNvbnN0cnVjdAotICAgIHJkX3V2Lm56ID0gUmVjb25zdHJ1Y3RVVihpdCwgJnJkX3V2LCB0bXBfZHN0LCBtb2RlKTsKLQotICAgIC8vIENvbXB1dGUgUkQtc2NvcmUKLSAgICByZF91di5EICA9IFZQOFNTRTE2eDgoc3JjLCB0bXBfZHN0KTsKLSAgICByZF91di5TRCA9IDA7ICAgIC8vIFRPRE86IHNob3VsZCB3ZSBjYWxsIFREaXN0bz8gaXQgdGVuZHMgdG8gZmxhdHRlbiBhcmVhcy4KLSAgICByZF91di5SICA9IFZQOEdldENvc3RVVihpdCwgJnJkX3V2KTsKLSAgICByZF91di5SICs9IFZQOEZpeGVkQ29zdHNVVlttb2RlXTsKLQotICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdXYpOwotICAgIGlmIChtb2RlID09IDAgfHwgcmRfdXYuc2NvcmUgPCByZF9iZXN0LnNjb3JlKSB7Ci0gICAgICBDb3B5U2NvcmUoJnJkX2Jlc3QsICZyZF91dik7Ci0gICAgICByZC0+bW9kZV91diA9IG1vZGU7Ci0gICAgICBTYk1lbW9yeUNvcHkocmQtPnV2X2xldmVscywgcmRfdXYudXZfbGV2ZWxzLCBzaXplb2YocmQtPnV2X2xldmVscykpOwotICAgICAgU2JNZW1vcnlDb3B5KGRzdDAsIHRtcF9kc3QsIFVWX1NJWkUpOyAgIC8vICBUT0RPOiBTd2FwVVZPdXQoKSA/Ci0gICAgfQotICB9Ci0gIFZQOFNldEludHJhVVZNb2RlKGl0LCByZC0+bW9kZV91dik7Ci0gIEFkZFNjb3JlKHJkLCAmcmRfYmVzdCk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGaW5hbCByZWNvbnN0cnVjdGlvbiBhbmQgcXVhbnRpemF0aW9uLgotCi1zdGF0aWMgdm9pZCBTaW1wbGVRdWFudGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKLSAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187Ci0gIGNvbnN0IGludCBpc19pMTYgPSAoaXQtPm1iXy0+dHlwZV8gPT0gMSk7Ci0gIGludCBueiA9IDA7Ci0KLSAgaWYgKGlzX2kxNikgewotICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCByZCwgaXQtPnl1dl9vdXRfICsgWV9PRkYsIGl0LT5wcmVkc19bMF0pOwotICB9IGVsc2UgewotICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7Ci0gICAgZG8gewotICAgICAgY29uc3QgaW50IG1vZGUgPQotICAgICAgICAgIGl0LT5wcmVkc19bKGl0LT5pNF8gJiAzKSArIChpdC0+aTRfID4+IDIpICogZW5jLT5wcmVkc193X107Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGl0LT55dXZfb3V0XyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLSAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7Ci0gICAgICBueiB8PSBSZWNvbnN0cnVjdEludHJhNChpdCwgcmQtPnlfYWNfbGV2ZWxzW2l0LT5pNF9dLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG1vZGUpIDw8IGl0LT5pNF87Ci0gICAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9vdXRfICsgWV9PRkYpKTsKLSAgfQotCi0gIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRiwgaXQtPm1iXy0+dXZfbW9kZV8pOwotICByZC0+bnogPSBuejsKLX0KLQotLy8gUmVmaW5lIGludHJhMTYvaW50cmE0IHN1Yi1tb2RlcyBiYXNlZCBvbiBkaXN0b3J0aW9uIG9ubHkgKG5vdCByYXRlKS4KLXN0YXRpYyB2b2lkIERpc3RvUmVmaW5lKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHRyeV9ib3RoX2k0X2kxNikgewotICBjb25zdCBpbnQgaXNfaTE2ID0gKGl0LT5tYl8tPnR5cGVfID09IDEpOwotICBzY29yZV90IGJlc3Rfc2NvcmUgPSBNQVhfQ09TVDsKLQotICBpZiAodHJ5X2JvdGhfaTRfaTE2IHx8IGlzX2kxNikgewotICAgIGludCBtb2RlOwotICAgIGludCBiZXN0X21vZGUgPSAtMTsKLSAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgewotICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOwotICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRjsKLSAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBWUDhTU0UxNngxNihzcmMsIHJlZik7Ci0gICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7Ci0gICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgVlA4U2V0SW50cmExNk1vZGUoaXQsIGJlc3RfbW9kZSk7Ci0gIH0KLSAgaWYgKHRyeV9ib3RoX2k0X2kxNiB8fCAhaXNfaTE2KSB7Ci0gICAgdWludDhfdCBtb2Rlc19pNFsxNl07Ci0gICAgLy8gV2UgZG9uJ3QgZXZhbHVhdGUgdGhlIHJhdGUgaGVyZSwgYnV0IGp1c3QgYWNjb3VudCBmb3IgaXQgdGhyb3VnaCBhCi0gICAgLy8gY29uc3RhbnQgcGVuYWx0eSAoaTQgbW9kZSB1c3VhbGx5IG5lZWRzIG1vcmUgYml0cyBjb21wYXJlZCB0byBpMTYpLgotICAgIHNjb3JlX3Qgc2NvcmVfaTQgPSAoc2NvcmVfdClJNF9QRU5BTFRZOwotCi0gICAgVlA4SXRlcmF0b3JTdGFydEk0KGl0KTsKLSAgICBkbyB7Ci0gICAgICBpbnQgbW9kZTsKLSAgICAgIGludCBiZXN0X3N1Yl9tb2RlID0gLTE7Ci0gICAgICBzY29yZV90IGJlc3Rfc3ViX3Njb3JlID0gTUFYX0NPU1Q7Ci0gICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKLQotICAgICAgLy8gVE9ETyhza2FsKTogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIHByZWRpY3Rpb24gcGl4ZWxzIGhlcmUsCi0gICAgICAvLyBidXQganVzdCB0aGUgZGlzdG9ydGlvbiBhZ2FpbnN0ICdzcmMnLgotICAgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKLSAgICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fQk1PREVTOyArK21vZGUpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV07Ci0gICAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPSBWUDhTU0U0eDQoc3JjLCByZWYpOwotICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X3N1Yl9zY29yZSkgewotICAgICAgICAgIGJlc3Rfc3ViX21vZGUgPSBtb2RlOwotICAgICAgICAgIGJlc3Rfc3ViX3Njb3JlID0gc2NvcmU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIG1vZGVzX2k0W2l0LT5pNF9dID0gYmVzdF9zdWJfbW9kZTsKLSAgICAgIHNjb3JlX2k0ICs9IGJlc3Rfc3ViX3Njb3JlOwotICAgICAgaWYgKHNjb3JlX2k0ID49IGJlc3Rfc2NvcmUpIGJyZWFrOwotICAgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGl0LT55dXZfaW5fICsgWV9PRkYpKTsKLSAgICBpZiAoc2NvcmVfaTQgPCBiZXN0X3Njb3JlKSB7Ci0gICAgICBWUDhTZXRJbnRyYTRNb2RlKGl0LCBtb2Rlc19pNCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbnRyeSBwb2ludAotCi1pbnQgVlA4RGVjaW1hdGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAotICAgICAgICAgICAgICAgIFZQOFJETGV2ZWwgcmRfb3B0KSB7Ci0gIGludCBpc19za2lwcGVkOwotICBjb25zdCBpbnQgbWV0aG9kID0gaXQtPmVuY18tPm1ldGhvZF87Ci0KLSAgSW5pdFNjb3JlKHJkKTsKLQotICAvLyBXZSBjYW4gcGVyZm9ybSBwcmVkaWN0aW9ucyBmb3IgTHVtYTE2eDE2IGFuZCBDaHJvbWE4eDggYWxyZWFkeS4KLSAgLy8gTHVtYTR4NCBwcmVkaWN0aW9ucyBuZWVkcyB0byBiZSBkb25lIGFzLXdlLWdvLgotICBWUDhNYWtlTHVtYTE2UHJlZHMoaXQpOwotICBWUDhNYWtlQ2hyb21hOFByZWRzKGl0KTsKLQotICBpZiAocmRfb3B0ID4gUkRfT1BUX05PTkUpIHsKLSAgICBpdC0+ZG9fdHJlbGxpc18gPSAocmRfb3B0ID49IFJEX09QVF9UUkVMTElTX0FMTCk7Ci0gICAgUGlja0Jlc3RJbnRyYTE2KGl0LCByZCk7Ci0gICAgaWYgKG1ldGhvZCA+PSAyKSB7Ci0gICAgICBQaWNrQmVzdEludHJhNChpdCwgcmQpOwotICAgIH0KLSAgICBQaWNrQmVzdFVWKGl0LCByZCk7Ci0gICAgaWYgKHJkX29wdCA9PSBSRF9PUFRfVFJFTExJUykgeyAgIC8vIGZpbmlzaCBvZmYgd2l0aCB0cmVsbGlzLW9wdGltIG5vdwotICAgICAgaXQtPmRvX3RyZWxsaXNfID0gMTsKLSAgICAgIFNpbXBsZVF1YW50aXplKGl0LCByZCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEZvciBtZXRob2QgPT0gMiwgcGljayB0aGUgYmVzdCBpbnRyYTQvaW50cmExNiBiYXNlZCBvbiBTU0UgKH50YWQgc2xvd2VyKS4KLSAgICAvLyBGb3IgbWV0aG9kIDw9IDEsIHdlIHJlZmluZSBpbnRyYTQgb3IgaW50cmExNiAoYnV0IGRvbid0IHJlLWV4YW1pbmUgbW9kZSkuCi0gICAgRGlzdG9SZWZpbmUoaXQsIChtZXRob2QgPj0gMikpOwotICAgIFNpbXBsZVF1YW50aXplKGl0LCByZCk7Ci0gIH0KLSAgaXNfc2tpcHBlZCA9IChyZC0+bnogPT0gMCk7Ci0gIFZQOFNldFNraXAoaXQsIGlzX3NraXBwZWQpOwotICByZXR1cm4gaXNfc2tpcHBlZDsKLX0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdG9rZW4uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90b2tlbi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjgwZWI1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy90b2tlbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBQYWdpbmF0ZWQgdG9rZW4gYnVmZmVyCi0vLwotLy8gIEEgJ3Rva2VuJyBpcyBhIGJpdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwcm9iYWJpbGl0eSwgZWl0aGVyIGZpeGVkCi0vLyBvciBhIGxhdGVyLXRvLWJlLWRldGVybWluZWQgYWZ0ZXIgc3RhdGlzdGljcyBoYXZlIGJlZW4gY29sbGVjdGVkLgotLy8gRm9yIGR5bmFtaWMgcHJvYmFiaWxpdHksIHdlIGp1c3QgcmVjb3JkIHRoZSBzbG90IGlkIChpZHgpIGZvciB0aGUgcHJvYmFiaWxpdHkKLS8vIHZhbHVlIGluIHRoZSBmaW5hbCBwcm9iYWJpbGl0eSBhcnJheSAodWludDhfdCogcHJvYmFzIGluIFZQOEVtaXRUb2tlbnMpLgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jaWYgIWRlZmluZWQoRElTQUJMRV9UT0tFTl9CVUZGRVIpCi0KLS8vIHdlIHVzZSBwYWdlcyB0byByZWR1Y2UgdGhlIG51bWJlciBvZiBTYk1lbW9yeUNvcHkoKQotI2RlZmluZSBNQVhfTlVNX1RPS0VOIDgxOTIgICAgICAgICAgLy8gbWF4IG51bWJlciBvZiB0b2tlbiBwZXIgcGFnZQotI2RlZmluZSBGSVhFRF9QUk9CQV9CSVQgKDF1IDw8IDE0KQotCi1zdHJ1Y3QgVlA4VG9rZW5zIHsKLSAgdWludDE2X3QgdG9rZW5zX1tNQVhfTlVNX1RPS0VOXTsgIC8vIGJpdCMxNTogYml0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQgIzE0OiBjb25zdGFudCBwcm9iYSBvciBpZHgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgMC4uMTM6IHNsb3Qgb3IgY29uc3RhbnQgcHJvYmEKLSAgVlA4VG9rZW5zKiBuZXh0XzsKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYikgewotICBiLT50b2tlbnNfID0gTlVMTDsKLSAgYi0+cGFnZXNfID0gTlVMTDsKLSAgYi0+bGFzdF9wYWdlXyA9ICZiLT5wYWdlc187Ci0gIGItPmxlZnRfID0gMDsKLSAgYi0+ZXJyb3JfID0gMDsKLX0KLQotdm9pZCBWUDhUQnVmZmVyQ2xlYXIoVlA4VEJ1ZmZlciogY29uc3QgYikgewotICBpZiAoYiAhPSBOVUxMKSB7Ci0gICAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOwotICAgIHdoaWxlIChwICE9IE5VTEwpIHsKLSAgICAgIGNvbnN0IFZQOFRva2VucyogY29uc3QgbmV4dCA9IHAtPm5leHRfOwotICAgICAgU2JNZW1vcnlEZWFsbG9jYXRlKCh2b2lkKilwKTsKLSAgICAgIHAgPSBuZXh0OwotICAgIH0KLSAgICBWUDhUQnVmZmVySW5pdChiKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFRCdWZmZXJOZXdQYWdlKFZQOFRCdWZmZXIqIGNvbnN0IGIpIHsKLSAgVlA4VG9rZW5zKiBjb25zdCBwYWdlID0gYi0+ZXJyb3JfID8gTlVMTCA6IChWUDhUb2tlbnMqKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpwYWdlKSk7Ci0gIGlmIChwYWdlID09IE5VTEwpIHsKLSAgICBiLT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gICpiLT5sYXN0X3BhZ2VfID0gcGFnZTsKLSAgYi0+bGFzdF9wYWdlXyA9ICZwYWdlLT5uZXh0XzsKLSAgYi0+bGVmdF8gPSBNQVhfTlVNX1RPS0VOOwotICBiLT50b2tlbnNfID0gcGFnZS0+dG9rZW5zXzsKLSAgcGFnZS0+bmV4dF8gPSBOVUxMOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBUT0tFTl9JRCh0LCBiLCBjdHgsIHApIFwKLSAgICAoKHApICsgTlVNX1BST0JBUyAqICgoY3R4KSArIE5VTV9DVFggKiAoKGIpICsgTlVNX0JBTkRTICogKHQpKSkpCi0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkVG9rZW4oVlA4VEJ1ZmZlciogY29uc3QgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJpdCwgdWludDMyX3QgcHJvYmFfaWR4KSB7Ci0gIFNCX0RDSEVDSyhwcm9iYV9pZHggPCBGSVhFRF9QUk9CQV9CSVQpOwotICBTQl9EQ0hFQ0soYml0ID09IDAgfHwgYml0ID09IDEpOwotICBpZiAoYi0+bGVmdF8gPiAwIHx8IFRCdWZmZXJOZXdQYWdlKGIpKSB7Ci0gICAgY29uc3QgaW50IHNsb3QgPSAtLWItPmxlZnRfOwotICAgIGItPnRva2Vuc19bc2xvdF0gPSAoYml0IDw8IDE1KSB8IHByb2JhX2lkeDsKLSAgfQotICByZXR1cm4gYml0OwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRDb25zdGFudFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXQsIGludCBwcm9iYSkgewotICBTQl9EQ0hFQ0socHJvYmEgPCAyNTYpOwotICBTQl9EQ0hFQ0soYml0ID09IDAgfHwgYml0ID09IDEpOwotICBpZiAoYi0+bGVmdF8gPiAwIHx8IFRCdWZmZXJOZXdQYWdlKGIpKSB7Ci0gICAgY29uc3QgaW50IHNsb3QgPSAtLWItPmxlZnRfOwotICAgIGItPnRva2Vuc19bc2xvdF0gPSAoYml0IDw8IDE1KSB8IEZJWEVEX1BST0JBX0JJVCB8IHByb2JhOwotICB9Ci19Ci0KLWludCBWUDhSZWNvcmRDb2VmZlRva2VucyhpbnQgY3R4LCBpbnQgY29lZmZfdHlwZSwgaW50IGZpcnN0LCBpbnQgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKSB7Ci0gIGludCBuID0gZmlyc3Q7Ci0gIHVpbnQzMl90IGJhc2VfaWQgPSBUT0tFTl9JRChjb2VmZl90eXBlLCBuLCBjdHgsIDApOwotICBpZiAoIUFkZFRva2VuKHRva2VucywgbGFzdCA+PSAwLCBiYXNlX2lkICsgMCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHdoaWxlIChuIDwgMTYpIHsKLSAgICBjb25zdCBpbnQgYyA9IGNvZWZmc1tuKytdOwotICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7Ci0gICAgaW50IHYgPSBzaWduID8gLWMgOiBjOwotICAgIGlmICghQWRkVG9rZW4odG9rZW5zLCB2ICE9IDAsIGJhc2VfaWQgKyAxKSkgewotICAgICAgY3R4ID0gMDsKLSAgICAgIGJhc2VfaWQgPSBUT0tFTl9JRChjb2VmZl90eXBlLCBWUDhFbmNCYW5kc1tuXSwgY3R4LCAwKTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDEsIGJhc2VfaWQgKyAyKSkgewotICAgICAgY3R4ID0gMTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiA0LCBiYXNlX2lkICsgMykpIHsKLSAgICAgICAgaWYgKEFkZFRva2VuKHRva2VucywgdiAhPSAyLCBiYXNlX2lkICsgNCkpCi0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCB2ID09IDQsIGJhc2VfaWQgKyA1KTsKLSAgICAgIH0gZWxzZSBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDEwLCBiYXNlX2lkICsgNikpIHsKLSAgICAgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiA2LCBiYXNlX2lkICsgNykpIHsKLSAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA9PSA2LCAxNTkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCB2ID49IDksIDE2NSk7Ci0gICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEodiAmIDEpLCAxNDUpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpbnQgbWFzazsKLSAgICAgICAgY29uc3QgdWludDhfdCogdGFiOwotICAgICAgICBpZiAodiA8IDMgKyAoOCA8PCAxKSkgeyAgICAgICAgICAvLyBWUDhDYXQzICAoM2IpCi0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOCk7Ci0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOSk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMCk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMjsKLSAgICAgICAgICB0YWIgPSBWUDhDYXQzOwotICAgICAgICB9IGVsc2UgaWYgKHYgPCAzICsgKDggPDwgMikpIHsgICAvLyBWUDhDYXQ0ICAoNGIpCi0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgOCk7Ci0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAxLCBiYXNlX2lkICsgOSk7Ci0gICAgICAgICAgdiAtPSAzICsgKDggPDwgMSk7Ci0gICAgICAgICAgbWFzayA9IDEgPDwgMzsKLSAgICAgICAgICB0YWIgPSBWUDhDYXQ0OwotICAgICAgICB9IGVsc2UgaWYgKHYgPCAzICsgKDggPDwgMykpIHsgICAvLyBWUDhDYXQ1ICAoNWIpCi0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAxLCBiYXNlX2lkICsgOCk7Ci0gICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAwLCBiYXNlX2lkICsgMTApOwotICAgICAgICAgIHYgLT0gMyArICg4IDw8IDIpOwotICAgICAgICAgIG1hc2sgPSAxIDw8IDQ7Ci0gICAgICAgICAgdGFiID0gVlA4Q2F0NTsKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVlA4Q2F0NiAoMTFiKQotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgpOwotICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDEwKTsKLSAgICAgICAgICB2IC09IDMgKyAoOCA8PCAzKTsKLSAgICAgICAgICBtYXNrID0gMSA8PCAxMDsKLSAgICAgICAgICB0YWIgPSBWUDhDYXQ2OwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChtYXNrKSB7Ci0gICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEhKHYgJiBtYXNrKSwgKnRhYisrKTsKLSAgICAgICAgICBtYXNrID4+PSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBjdHggPSAyOwotICAgIH0KLSAgICBBZGRDb25zdGFudFRva2VuKHRva2Vucywgc2lnbiwgMTI4KTsKLSAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIGN0eCwgMCk7Ci0gICAgaWYgKG4gPT0gMTYgfHwgIUFkZFRva2VuKHRva2VucywgbiA8PSBsYXN0LCBiYXNlX2lkICsgMCkpIHsKLSAgICAgIHJldHVybiAxOyAgIC8vIEVPQgotICAgIH0KLSAgfQotICByZXR1cm4gMTsKLX0KLQotI3VuZGVmIFRPS0VOX0lECi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUaGlzIGZ1bmN0aW9uIHdvcmtzLCBidXQgaXNuJ3QgY3VycmVudGx5IHVzZWQuIFNhdmVkIGZvciBsYXRlci4KLQotI2lmIDAKLQotc3RhdGljIHZvaWQgUmVjb3JkKGludCBiaXQsIHByb2JhX3QqIGNvbnN0IHN0YXRzKSB7Ci0gIHByb2JhX3QgcCA9ICpzdGF0czsKLSAgaWYgKHAgPj0gMHhmZmZmMDAwMHUpIHsgICAgICAgICAgICAgICAvLyBhbiBvdmVyZmxvdyBpcyBpbmJvdW5kLgotICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KLSAgfQotICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KLSAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKLSAgKnN0YXRzID0gcDsKLX0KLQotdm9pZCBWUDhUb2tlblRvU3RhdHMoY29uc3QgVlA4VEJ1ZmZlciogY29uc3QgYiwgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKLSAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOwotICB3aGlsZSAocCAhPSBOVUxMKSB7Ci0gICAgY29uc3QgaW50IE4gPSAocC0+bmV4dF8gPT0gTlVMTCkgPyBiLT5sZWZ0XyA6IDA7Ci0gICAgaW50IG4gPSBNQVhfTlVNX1RPS0VOOwotICAgIHdoaWxlIChuLS0gPiBOKSB7Ci0gICAgICBjb25zdCB1aW50MTZfdCB0b2tlbiA9IHAtPnRva2Vuc19bbl07Ci0gICAgICBpZiAoISh0b2tlbiAmIEZJWEVEX1BST0JBX0JJVCkpIHsKLSAgICAgICAgUmVjb3JkKCh0b2tlbiA+PiAxNSkgJiAxLCBzdGF0cyArICh0b2tlbiAmIDB4M2ZmZnUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcCA9IHAtPm5leHRfOwotICB9Ci19Ci0KLSNlbmRpZiAgIC8vIDAKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZpbmFsIGNvZGluZyBwYXNzLCB3aXRoIGtub3duIHByb2JhYmlsaXRpZXMKLQotaW50IFZQOEVtaXRUb2tlbnMoVlA4VEJ1ZmZlciogY29uc3QgYiwgVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2JhcywgaW50IGZpbmFsX3Bhc3MpIHsKLSAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOwotICAodm9pZClmaW5hbF9wYXNzOwotICBpZiAoYi0+ZXJyb3JfKSByZXR1cm4gMDsKLSAgd2hpbGUgKHAgIT0gTlVMTCkgewotICAgIGNvbnN0IFZQOFRva2VucyogY29uc3QgbmV4dCA9IHAtPm5leHRfOwotICAgIGNvbnN0IGludCBOID0gKG5leHQgPT0gTlVMTCkgPyBiLT5sZWZ0XyA6IDA7Ci0gICAgaW50IG4gPSBNQVhfTlVNX1RPS0VOOwotICAgIHdoaWxlIChuLS0gPiBOKSB7Ci0gICAgICBjb25zdCB1aW50MTZfdCB0b2tlbiA9IHAtPnRva2Vuc19bbl07Ci0gICAgICBjb25zdCBpbnQgYml0ID0gKHRva2VuID4+IDE1KSAmIDE7Ci0gICAgICBpZiAodG9rZW4gJiBGSVhFRF9QUk9CQV9CSVQpIHsKLSAgICAgICAgVlA4UHV0Qml0KGJ3LCBiaXQsIHRva2VuICYgMHhmZnUpOyAgLy8gY29uc3RhbnQgcHJvYmEKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFZQOFB1dEJpdChidywgYml0LCBwcm9iYXNbdG9rZW4gJiAweDNmZmZ1XSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChmaW5hbF9wYXNzKSBTYk1lbW9yeURlYWxsb2NhdGUoKHZvaWQqKXApOwotICAgIHAgPSBuZXh0OwotICB9Ci0gIGlmIChmaW5hbF9wYXNzKSBiLT5wYWdlc18gPSBOVUxMOwotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2Vsc2UgICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCi0KLXZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYikgewotICAodm9pZCliOwotfQotdm9pZCBWUDhUQnVmZmVyQ2xlYXIoVlA4VEJ1ZmZlciogY29uc3QgYikgewotICAodm9pZCliOwotfQotCi0jZW5kaWYgICAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGwuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MDcwYjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGwuYworKysgL2Rldi9udWxsCkBAIC0xLDExODAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIG1haW4gZW50cnkgZm9yIHRoZSBsb3NzbGVzcyBlbmNvZGVyLgotLy8KLS8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0vLwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iYWNrd2FyZF9yZWZlcmVuY2VzLmgiCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4uL2RzcC9sb3NzbGVzcy5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF93cml0ZXIuaCIKLSNpbmNsdWRlICIuLi91dGlscy9odWZmbWFuX2VuY29kZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFBBTEVUVEVfS0VZX1JJR0hUX1NISUZUICAgMjIgIC8vIEtleSBmb3IgMUsgYnVmZmVyLgotI2RlZmluZSBNQVhfSFVGRl9JTUFHRV9TSVpFICAgICAgICgxNiAqIDEwMjQgKiAxMDI0KQotI2RlZmluZSBNQVhfQ09MT1JTX0ZPUl9HUkFQSCAgICAgIDY0Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQYWxldHRlCi0KLXN0YXRpYyBpbnQgQ29tcGFyZUNvbG9ycyhjb25zdCB2b2lkKiBwMSwgY29uc3Qgdm9pZCogcDIpIHsKLSAgY29uc3QgdWludDMyX3QgYSA9ICooY29uc3QgdWludDMyX3QqKXAxOwotICBjb25zdCB1aW50MzJfdCBiID0gKihjb25zdCB1aW50MzJfdCopcDI7Ci0gIFNCX0RDSEVDSyhhICE9IGIpOwotICByZXR1cm4gKGEgPCBiKSA/IC0xIDogMTsKLX0KLQotLy8gSWYgbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgaW1hZ2UgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIE1BWF9QQUxFVFRFX1NJWkUsCi0vLyBjcmVhdGVzIGEgcGFsZXR0ZSBhbmQgcmV0dXJucyB0cnVlLCBlbHNlIHJldHVybnMgZmFsc2UuCi1zdGF0aWMgaW50IEFuYWx5emVBbmRDcmVhdGVQYWxldHRlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcGFsZXR0ZV9zaXplKSB7Ci0gIGludCBpLCB4LCB5LCBrZXk7Ci0gIGludCBudW1fY29sb3JzID0gMDsKLSAgdWludDhfdCBpbl91c2VbTUFYX1BBTEVUVEVfU0laRSAqIDRdID0geyAwIH07Ci0gIHVpbnQzMl90IGNvbG9yc1tNQVhfUEFMRVRURV9TSVpFICogNF07Ci0gIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrSGFzaE11bCA9IDB4MWUzNWE3YmQ7Ci0gIGNvbnN0IHVpbnQzMl90KiBhcmdiID0gcGljLT5hcmdiOwotICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7Ci0gIHVpbnQzMl90IGxhc3RfcGl4ID0gfmFyZ2JbMF07ICAgLy8gc28gd2UncmUgc3VyZSB0aGF0IGxhc3RfcGl4ICE9IGFyZ2JbMF0KLQotICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewotICAgICAgaWYgKGFyZ2JbeF0gPT0gbGFzdF9waXgpIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBsYXN0X3BpeCA9IGFyZ2JbeF07Ci0gICAgICBrZXkgPSAoa0hhc2hNdWwgKiBsYXN0X3BpeCkgPj4gUEFMRVRURV9LRVlfUklHSFRfU0hJRlQ7Ci0gICAgICB3aGlsZSAoMSkgewotICAgICAgICBpZiAoIWluX3VzZVtrZXldKSB7Ci0gICAgICAgICAgY29sb3JzW2tleV0gPSBsYXN0X3BpeDsKLSAgICAgICAgICBpbl91c2Vba2V5XSA9IDE7Ci0gICAgICAgICAgKytudW1fY29sb3JzOwotICAgICAgICAgIGlmIChudW1fY29sb3JzID4gTUFYX1BBTEVUVEVfU0laRSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGNvbG9yc1trZXldID09IGxhc3RfcGl4KSB7Ci0gICAgICAgICAgLy8gVGhlIGNvbG9yIGlzIGFscmVhZHkgdGhlcmUuCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gU29tZSBvdGhlciBjb2xvciBzaXRzIHRoZXJlLgotICAgICAgICAgIC8vIERvIGxpbmVhciBjb25mbGljdCByZXNvbHV0aW9uLgotICAgICAgICAgICsra2V5OwotICAgICAgICAgIGtleSAmPSAoTUFYX1BBTEVUVEVfU0laRSAqIDQgLSAxKTsgIC8vIGtleSBtYXNrIGZvciAxSyBidWZmZXIuCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOwotICB9Ci0KLSAgLy8gVE9ETyhza2FsKTogY291bGQgd2UgcmV1c2UgaW5fdXNlW10gdG8gc3BlZWQgdXAgRW5jb2RlUGFsZXR0ZSgpPwotICBudW1fY29sb3JzID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IChpbnQpKHNpemVvZihpbl91c2UpIC8gc2l6ZW9mKGluX3VzZVswXSkpOyArK2kpIHsKLSAgICBpZiAoaW5fdXNlW2ldKSB7Ci0gICAgICBwYWxldHRlW251bV9jb2xvcnNdID0gY29sb3JzW2ldOwotICAgICAgKytudW1fY29sb3JzOwotICAgIH0KLSAgfQotCi0gIFNiU3lzdGVtU29ydChwYWxldHRlLCBudW1fY29sb3JzLCBzaXplb2YoKnBhbGV0dGUpLCBDb21wYXJlQ29sb3JzKTsKLSAgKnBhbGV0dGVfc2l6ZSA9IG51bV9jb2xvcnM7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFuYWx5emVFbnRyb3B5KGNvbnN0IHVpbnQzMl90KiBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb25zdCBub25wcmVkaWN0ZWRfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb25zdCBwcmVkaWN0ZWRfYml0cykgewotICBpbnQgeCwgeTsKLSAgY29uc3QgdWludDMyX3QqIGxhc3RfbGluZSA9IE5VTEw7Ci0gIHVpbnQzMl90IGxhc3RfcGl4ID0gYXJnYlswXTsgICAgLy8gc28gd2UncmUgc3VyZSB0aGF0IHBpeF9kaWZmID09IDAKLQotICBWUDhMSGlzdG9ncmFtKiBub25wcmVkaWN0ZWQgPSBOVUxMOwotICBWUDhMSGlzdG9ncmFtKiBwcmVkaWN0ZWQgPQotICAgICAgKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoMiAqIHNpemVvZigqcHJlZGljdGVkKSk7Ci0gIGlmIChwcmVkaWN0ZWQgPT0gTlVMTCkgcmV0dXJuIDA7Ci0gIG5vbnByZWRpY3RlZCA9IHByZWRpY3RlZCArIDE7Ci0KLSAgVlA4TEhpc3RvZ3JhbUluaXQocHJlZGljdGVkLCAwKTsKLSAgVlA4TEhpc3RvZ3JhbUluaXQobm9ucHJlZGljdGVkLCAwKTsKLSAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7Ci0gICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IGFyZ2JbeF07Ci0gICAgICBjb25zdCB1aW50MzJfdCBwaXhfZGlmZiA9IFZQOExTdWJQaXhlbHMocGl4LCBsYXN0X3BpeCk7Ci0gICAgICBpZiAocGl4X2RpZmYgPT0gMCkgY29udGludWU7Ci0gICAgICBpZiAobGFzdF9saW5lICE9IE5VTEwgJiYgcGl4ID09IGxhc3RfbGluZVt4XSkgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGxhc3RfcGl4ID0gcGl4OwotICAgICAgewotICAgICAgICBjb25zdCBQaXhPckNvcHkgcGl4X3Rva2VuID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXgpOwotICAgICAgICBjb25zdCBQaXhPckNvcHkgcGl4X2RpZmZfdG9rZW4gPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKHBpeF9kaWZmKTsKLSAgICAgICAgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShub25wcmVkaWN0ZWQsICZwaXhfdG9rZW4pOwotICAgICAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KHByZWRpY3RlZCwgJnBpeF9kaWZmX3Rva2VuKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbGFzdF9saW5lID0gYXJnYjsKLSAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOwotICB9Ci0gICpub25wcmVkaWN0ZWRfYml0cyA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHNCdWxrKG5vbnByZWRpY3RlZCk7Ci0gICpwcmVkaWN0ZWRfYml0cyA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHNCdWxrKHByZWRpY3RlZCk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShwcmVkaWN0ZWQpOwotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBWUDhMRW5jQW5hbHl6ZShWUDhMRW5jb2RlciogY29uc3QgZW5jLCBXZWJQSW1hZ2VIaW50IGltYWdlX2hpbnQpIHsKLSAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgU0JfRENIRUNLKHBpYyAhPSBOVUxMICYmIHBpYy0+YXJnYiAhPSBOVUxMKTsKLQotICBlbmMtPnVzZV9wYWxldHRlXyA9Ci0gICAgICBBbmFseXplQW5kQ3JlYXRlUGFsZXR0ZShwaWMsIGVuYy0+cGFsZXR0ZV8sICZlbmMtPnBhbGV0dGVfc2l6ZV8pOwotCi0gIGlmIChpbWFnZV9oaW50ID09IFdFQlBfSElOVF9HUkFQSCkgewotICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXyAmJiBlbmMtPnBhbGV0dGVfc2l6ZV8gPCBNQVhfQ09MT1JTX0ZPUl9HUkFQSCkgewotICAgICAgZW5jLT51c2VfcGFsZXR0ZV8gPSAwOwotICAgIH0KLSAgfQotCi0gIGlmICghZW5jLT51c2VfcGFsZXR0ZV8pIHsKLSAgICBpZiAoaW1hZ2VfaGludCA9PSBXRUJQX0hJTlRfUEhPVE8pIHsKLSAgICAgIGVuYy0+dXNlX3ByZWRpY3RfID0gMTsKLSAgICAgIGVuYy0+dXNlX2Nyb3NzX2NvbG9yXyA9IDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRvdWJsZSBub25fcHJlZF9lbnRyb3B5LCBwcmVkX2VudHJvcHk7Ci0gICAgICBpZiAoIUFuYWx5emVFbnRyb3B5KHBpYy0+YXJnYiwgcGljLT53aWR0aCwgcGljLT5oZWlnaHQsIHBpYy0+YXJnYl9zdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZub25fcHJlZF9lbnRyb3B5LCAmcHJlZF9lbnRyb3B5KSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICAgIH0KLSAgICAgIGlmIChwcmVkX2VudHJvcHkgPCAwLjk1ICogbm9uX3ByZWRfZW50cm9weSkgewotICAgICAgICBlbmMtPnVzZV9wcmVkaWN0XyA9IDE7Ci0gICAgICAgIC8vIFRPRE8odmlrYXNhKTogT2JzZXJ2ZWQgc29tZSBjb3JyZWxhdGlvbiBvZiBjcm9zc19jb2xvciB0cmFuc2Zvcm0gd2l0aAotICAgICAgICAvLyBwcmVkaWN0LiBOZWVkIHRvIGludmVzdGlnYXRlIHRoaXMgZnVydGhlciBhbmQgYWRkIHNlcGFyYXRlIGhldXJpc3RpYwotICAgICAgICAvLyBmb3Igc2V0dGluZyB1c2VfY3Jvc3NfY29sb3IgZmxhZy4KLSAgICAgICAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gMTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKAotICAgIGNvbnN0IFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvZ3JhbV9pbWFnZSwKLSAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZXMpIHsKLSAgaW50IGksIGs7Ci0gIGludCBvayA9IDE7Ci0gIHVpbnQ2NF90IHRvdGFsX2xlbmd0aF9zaXplID0gMDsKLSAgdWludDhfdCogbWVtX2J1ZiA9IE5VTEw7Ci0gIGNvbnN0IGludCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKLQotICAvLyBJdGVyYXRlIG92ZXIgYWxsIGhpc3RvZ3JhbXMgYW5kIGdldCB0aGUgYWdncmVnYXRlIG51bWJlciBvZiBjb2RlcyB1c2VkLgotICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgewotICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gaGlzdG9ncmFtX2ltYWdlLT5oaXN0b2dyYW1zW2ldOwotICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1s1ICogaV07Ci0gICAgZm9yIChrID0gMDsgayA8IDU7ICsraykgewotICAgICAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gKGsgPT0gMCkgPyBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaGlzdG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoayA9PSA0KSA/IE5VTV9ESVNUQU5DRV9DT0RFUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMjU2OwotICAgICAgY29kZXNba10ubnVtX3N5bWJvbHMgPSBudW1fc3ltYm9sczsKLSAgICAgIHRvdGFsX2xlbmd0aF9zaXplICs9IG51bV9zeW1ib2xzOwotICAgIH0KLSAgfQotCi0gIC8vIEFsbG9jYXRlIGFuZCBTZXQgSHVmZm1hbiBjb2Rlcy4KLSAgewotICAgIHVpbnQxNl90KiBjb2RlczsKLSAgICB1aW50OF90KiBsZW5ndGhzOwotICAgIG1lbV9idWYgPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2ModG90YWxfbGVuZ3RoX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmxlbmd0aHMpICsgc2l6ZW9mKCpjb2RlcykpOwotICAgIGlmIChtZW1fYnVmID09IE5VTEwpIHsKLSAgICAgIG9rID0gMDsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLSAgICBjb2RlcyA9ICh1aW50MTZfdCopbWVtX2J1ZjsKLSAgICBsZW5ndGhzID0gKHVpbnQ4X3QqKSZjb2Rlc1t0b3RhbF9sZW5ndGhfc2l6ZV07Ci0gICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7Ci0gICAgICBjb25zdCBpbnQgYml0X2xlbmd0aCA9IGh1ZmZtYW5fY29kZXNbaV0ubnVtX3N5bWJvbHM7Ci0gICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVzID0gY29kZXM7Ci0gICAgICBodWZmbWFuX2NvZGVzW2ldLmNvZGVfbGVuZ3RocyA9IGxlbmd0aHM7Ci0gICAgICBjb2RlcyArPSBiaXRfbGVuZ3RoOwotICAgICAgbGVuZ3RocyArPSBiaXRfbGVuZ3RoOwotICAgIH0KLSAgfQotCi0gIC8vIENyZWF0ZSBIdWZmbWFuIHRyZWVzLgotICBmb3IgKGkgPSAwOyBvayAmJiAoaSA8IGhpc3RvZ3JhbV9pbWFnZV9zaXplKTsgKytpKSB7Ci0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzWzUgKiBpXTsKLSAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1tpXTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+bGl0ZXJhbF8sIDE1LCBjb2RlcyArIDApOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5yZWRfLCAxNSwgY29kZXMgKyAxKTsKLSAgICBvayA9IG9rICYmIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+Ymx1ZV8sIDE1LCBjb2RlcyArIDIpOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5hbHBoYV8sIDE1LCBjb2RlcyArIDMpOwotICAgIG9rID0gb2sgJiYgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKGhpc3RvLT5kaXN0YW5jZV8sIDE1LCBjb2RlcyArIDQpOwotICB9Ci0KLSBFbmQ6Ci0gIGlmICghb2spIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUobWVtX2J1Zik7Ci0gICAgLy8gSWYgb25lIFZQOExDcmVhdGVIdWZmbWFuVHJlZSgpIGFib3ZlIGZhaWxzLCB3ZSBuZWVkIHRvIGNsZWFuIHVwIGJlaGluZC4KLSAgICBTYk1lbW9yeVNldChodWZmbWFuX2NvZGVzLCAwLCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemUgKiBzaXplb2YoKmh1ZmZtYW5fY29kZXMpKTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyB2b2lkIFN0b3JlSHVmZm1hblRyZWVPZkh1ZmZtYW5UcmVlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCB1aW50OF90KiBjb2RlX2xlbmd0aF9iaXRkZXB0aCkgewotICAvLyBSRkMgMTk1MSB3aWxsIGNhbG0geW91IGRvd24gaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHRoaXMgZnVubnkgc2VxdWVuY2UuCi0gIC8vIFRoaXMgc2VxdWVuY2UgaXMgdHVuZWQgZnJvbSB0aGF0LCBidXQgbW9yZSB3ZWlnaHRlZCBmb3IgbG93ZXIgc3ltYm9sIGNvdW50LAotICAvLyBhbmQgbW9yZSBzcGlraW5nIGhpc3RvZ3JhbXMuCi0gIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdG9yYWdlT3JkZXJbQ09ERV9MRU5HVEhfQ09ERVNdID0gewotICAgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKLSAgfTsKLSAgaW50IGk7Ci0gIC8vIFRocm93IGF3YXkgdHJhaWxpbmcgemVyb3M6Ci0gIGludCBjb2Rlc190b19zdG9yZSA9IENPREVfTEVOR1RIX0NPREVTOwotICBmb3IgKDsgY29kZXNfdG9fc3RvcmUgPiA0OyAtLWNvZGVzX3RvX3N0b3JlKSB7Ci0gICAgaWYgKGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbY29kZXNfdG9fc3RvcmUgLSAxXV0gIT0gMCkgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFZQOExXcml0ZUJpdHMoYncsIDQsIGNvZGVzX3RvX3N0b3JlIC0gNCk7Ci0gIGZvciAoaSA9IDA7IGkgPCBjb2Rlc190b19zdG9yZTsgKytpKSB7Ci0gICAgVlA4TFdyaXRlQml0cyhidywgMywgY29kZV9sZW5ndGhfYml0ZGVwdGhba1N0b3JhZ2VPcmRlcltpXV0pOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woCi0gICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKLSAgaW50IGs7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGZvciAoayA9IDA7IGsgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzOyArK2spIHsKLSAgICBpZiAoaHVmZm1hbl9jb2RlLT5jb2RlX2xlbmd0aHNba10gIT0gMCkgewotICAgICAgKytjb3VudDsKLSAgICAgIGlmIChjb3VudCA+IDEpIHJldHVybjsKLSAgICB9Ci0gIH0KLSAgZm9yIChrID0gMDsgayA8IGh1ZmZtYW5fY29kZS0+bnVtX3N5bWJvbHM7ICsraykgewotICAgIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2tdID0gMDsKLSAgICBodWZmbWFuX2NvZGUtPmNvZGVzW2tdID0gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBTdG9yZUh1ZmZtYW5UcmVlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHRva2VucywgY29uc3QgaW50IG51bV90b2tlbnMsCi0gICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKLSAgICBjb25zdCBpbnQgaXggPSB0b2tlbnNbaV0uY29kZTsKLSAgICBjb25zdCBpbnQgZXh0cmFfYml0cyA9IHRva2Vuc1tpXS5leHRyYV9iaXRzOwotICAgIFZQOExXcml0ZUJpdHMoYncsIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2l4XSwgaHVmZm1hbl9jb2RlLT5jb2Rlc1tpeF0pOwotICAgIHN3aXRjaCAoaXgpIHsKLSAgICAgIGNhc2UgMTY6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDIsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTc6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTg6Ci0gICAgICAgIFZQOExXcml0ZUJpdHMoYncsIDcsIGV4dHJhX2JpdHMpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIGludCBTdG9yZUZ1bGxIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKSB7Ci0gIGludCBvayA9IDA7Ci0gIHVpbnQ4X3QgY29kZV9sZW5ndGhfYml0ZGVwdGhbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07Ci0gIHVpbnQxNl90IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHNbQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07Ci0gIGNvbnN0IGludCBtYXhfdG9rZW5zID0gdHJlZS0+bnVtX3N5bWJvbHM7Ci0gIGludCBudW1fdG9rZW5zOwotICBIdWZmbWFuVHJlZUNvZGUgaHVmZm1hbl9jb2RlOwotICBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMgPQotICAgICAgKEh1ZmZtYW5UcmVlVG9rZW4qKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCltYXhfdG9rZW5zLCBzaXplb2YoKnRva2VucykpOwotICBpZiAodG9rZW5zID09IE5VTEwpIHJldHVybiAwOwotCi0gIGh1ZmZtYW5fY29kZS5udW1fc3ltYm9scyA9IENPREVfTEVOR1RIX0NPREVTOwotICBodWZmbWFuX2NvZGUuY29kZV9sZW5ndGhzID0gY29kZV9sZW5ndGhfYml0ZGVwdGg7Ci0gIGh1ZmZtYW5fY29kZS5jb2RlcyA9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoX3N5bWJvbHM7Ci0KLSAgVlA4TFdyaXRlQml0cyhidywgMSwgMCk7Ci0gIG51bV90b2tlbnMgPSBWUDhMQ3JlYXRlQ29tcHJlc3NlZEh1ZmZtYW5UcmVlKHRyZWUsIHRva2VucywgbWF4X3Rva2Vucyk7Ci0gIHsKLSAgICBpbnQgaGlzdG9ncmFtW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OwotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKLSAgICAgICsraGlzdG9ncmFtW3Rva2Vuc1tpXS5jb2RlXTsKLSAgICB9Ci0KLSAgICBpZiAoIVZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0b2dyYW0sIDcsICZodWZmbWFuX2NvZGUpKSB7Ci0gICAgICBnb3RvIEVuZDsKLSAgICB9Ci0gIH0KLQotICBTdG9yZUh1ZmZtYW5UcmVlT2ZIdWZmbWFuVHJlZVRvQml0TWFzayhidywgY29kZV9sZW5ndGhfYml0ZGVwdGgpOwotICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKCZodWZmbWFuX2NvZGUpOwotICB7Ci0gICAgaW50IHRyYWlsaW5nX3plcm9fYml0cyA9IDA7Ci0gICAgaW50IHRyaW1tZWRfbGVuZ3RoID0gbnVtX3Rva2VuczsKLSAgICBpbnQgd3JpdGVfdHJpbW1lZF9sZW5ndGg7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBpbnQgaSA9IG51bV90b2tlbnM7Ci0gICAgd2hpbGUgKGktLSA+IDApIHsKLSAgICAgIGNvbnN0IGludCBpeCA9IHRva2Vuc1tpXS5jb2RlOwotICAgICAgaWYgKGl4ID09IDAgfHwgaXggPT0gMTcgfHwgaXggPT0gMTgpIHsKLSAgICAgICAgLS10cmltbWVkX2xlbmd0aDsgICAvLyBkaXNjb3VudCB0cmFpbGluZyB6ZXJvcwotICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gY29kZV9sZW5ndGhfYml0ZGVwdGhbaXhdOwotICAgICAgICBpZiAoaXggPT0gMTcpIHsKLSAgICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gMzsKLSAgICAgICAgfSBlbHNlIGlmIChpeCA9PSAxOCkgewotICAgICAgICAgIHRyYWlsaW5nX3plcm9fYml0cyArPSA3OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgd3JpdGVfdHJpbW1lZF9sZW5ndGggPSAodHJpbW1lZF9sZW5ndGggPiAxICYmIHRyYWlsaW5nX3plcm9fYml0cyA+IDEyKTsKLSAgICBsZW5ndGggPSB3cml0ZV90cmltbWVkX2xlbmd0aCA/IHRyaW1tZWRfbGVuZ3RoIDogbnVtX3Rva2VuczsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCB3cml0ZV90cmltbWVkX2xlbmd0aCk7Ci0gICAgaWYgKHdyaXRlX3RyaW1tZWRfbGVuZ3RoKSB7Ci0gICAgICBjb25zdCBpbnQgbmJpdHMgPSBWUDhMQml0c0xvZzJDZWlsaW5nKHRyaW1tZWRfbGVuZ3RoIC0gMSk7Ci0gICAgICBjb25zdCBpbnQgbmJpdHBhaXJzID0gKG5iaXRzID09IDApID8gMSA6IChuYml0cyArIDEpIC8gMjsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIG5iaXRwYWlycyAtIDEpOwotICAgICAgU0JfRENIRUNLKHRyaW1tZWRfbGVuZ3RoID49IDIpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgbmJpdHBhaXJzICogMiwgdHJpbW1lZF9sZW5ndGggLSAyKTsKLSAgICB9Ci0gICAgU3RvcmVIdWZmbWFuVHJlZVRvQml0TWFzayhidywgdG9rZW5zLCBsZW5ndGgsICZodWZmbWFuX2NvZGUpOwotICB9Ci0gIG9rID0gMTsKLSBFbmQ6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZSh0b2tlbnMpOwotICByZXR1cm4gb2s7Ci19Ci0KLXN0YXRpYyBpbnQgU3RvcmVIdWZmbWFuQ29kZShWUDhMQml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZtYW5fY29kZSkgewotICBpbnQgaTsKLSAgaW50IGNvdW50ID0gMDsKLSAgaW50IHN5bWJvbHNbMl0gPSB7IDAsIDAgfTsKLSAgY29uc3QgaW50IGtNYXhCaXRzID0gODsKLSAgY29uc3QgaW50IGtNYXhTeW1ib2wgPSAxIDw8IGtNYXhCaXRzOwotCi0gIC8vIENoZWNrIHdoZXRoZXIgaXQncyBhIHNtYWxsIHRyZWUuCi0gIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzICYmIGNvdW50IDwgMzsgKytpKSB7Ci0gICAgaWYgKGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2ldICE9IDApIHsKLSAgICAgIGlmIChjb3VudCA8IDIpIHN5bWJvbHNbY291bnRdID0gaTsKLSAgICAgICsrY291bnQ7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNvdW50ID09IDApIHsgICAvLyBlbWl0IG1pbmltYWwgdHJlZSBmb3IgZW1wdHkgY2FzZXMKLSAgICAvLyBiaXRzOiBzbWFsbCB0cmVlIG1hcmtlcjogMSwgY291bnQtMTogMCwgbGFyZ2UgOC1iaXQgY29kZTogMCwgY29kZTogMAotICAgIFZQOExXcml0ZUJpdHMoYncsIDQsIDB4MDEpOwotICAgIHJldHVybiAxOwotICB9IGVsc2UgaWYgKGNvdW50IDw9IDIgJiYgc3ltYm9sc1swXSA8IGtNYXhTeW1ib2wgJiYgc3ltYm9sc1sxXSA8IGtNYXhTeW1ib2wpIHsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCAxKTsgIC8vIFNtYWxsIHRyZWUgbWFya2VyIHRvIGVuY29kZSAxIG9yIDIgc3ltYm9scy4KLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBjb3VudCAtIDEpOwotICAgIGlmIChzeW1ib2xzWzBdIDw9IDEpIHsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIDApOyAgLy8gQ29kZSBiaXQgZm9yIHNtYWxsICgxIGJpdCkgc3ltYm9sIHZhbHVlLgotICAgICAgVlA4TFdyaXRlQml0cyhidywgMSwgc3ltYm9sc1swXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDEsIDEpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgOCwgc3ltYm9sc1swXSk7Ci0gICAgfQotICAgIGlmIChjb3VudCA9PSAyKSB7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCA4LCBzeW1ib2xzWzFdKTsKLSAgICB9Ci0gICAgcmV0dXJuIDE7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFN0b3JlRnVsbEh1ZmZtYW5Db2RlKGJ3LCBodWZmbWFuX2NvZGUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFdyaXRlSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfaW5kZXgpIHsKLSAgY29uc3QgaW50IGRlcHRoID0gY29kZS0+Y29kZV9sZW5ndGhzW2NvZGVfaW5kZXhdOwotICBjb25zdCBpbnQgc3ltYm9sID0gY29kZS0+Y29kZXNbY29kZV9pbmRleF07Ci0gIFZQOExXcml0ZUJpdHMoYncsIGRlcHRoLCBzeW1ib2wpOwotfQotCi1zdGF0aWMgdm9pZCBTdG9yZUltYWdlVG9CaXRNYXNrKAotICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgd2lkdGgsIGludCBoaXN0b19iaXRzLAotICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCi0gICAgY29uc3QgdWludDE2X3QqIGhpc3RvZ3JhbV9zeW1ib2xzLAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlcykgewotICAvLyB4IGFuZCB5IHRyYWNlIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW1hZ2UuCi0gIGludCB4ID0gMDsKLSAgaW50IHkgPSAwOwotICBjb25zdCBpbnQgaGlzdG9feHNpemUgPSBoaXN0b19iaXRzID8gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpIDogMTsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCByZWZzLT5zaXplOyArK2kpIHsKLSAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSAmcmVmcy0+cmVmc1tpXTsKLSAgICBjb25zdCBpbnQgaGlzdG9ncmFtX2l4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaGlzdG9fYml0cyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCA+PiBoaXN0b19iaXRzKSA6IDBdOwotICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSBodWZmbWFuX2NvZGVzICsgNSAqIGhpc3RvZ3JhbV9peDsKLSAgICBpZiAoUGl4T3JDb3B5SXNDYWNoZUlkeCh2KSkgewotICAgICAgY29uc3QgaW50IGNvZGUgPSBQaXhPckNvcHlDYWNoZUlkeCh2KTsKLSAgICAgIGNvbnN0IGludCBsaXRlcmFsX2l4ID0gMjU2ICsgTlVNX0xFTkdUSF9DT0RFUyArIGNvZGU7Ci0gICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcywgbGl0ZXJhbF9peCk7Ci0gICAgfSBlbHNlIGlmIChQaXhPckNvcHlJc0xpdGVyYWwodikpIHsKLSAgICAgIHN0YXRpYyBjb25zdCBpbnQgb3JkZXJbXSA9IHsgMSwgMiwgMCwgMyB9OwotICAgICAgaW50IGs7Ci0gICAgICBmb3IgKGsgPSAwOyBrIDwgNDsgKytrKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5TGl0ZXJhbCh2LCBvcmRlcltrXSk7Ci0gICAgICAgIFdyaXRlSHVmZm1hbkNvZGUoYncsIGNvZGVzICsgaywgY29kZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBiaXRzLCBuX2JpdHM7Ci0gICAgICBpbnQgY29kZSwgZGlzdGFuY2U7Ci0KLSAgICAgIFByZWZpeEVuY29kZSh2LT5sZW4sICZjb2RlLCAmbl9iaXRzLCAmYml0cyk7Ci0gICAgICBXcml0ZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcywgMjU2ICsgY29kZSk7Ci0gICAgICBWUDhMV3JpdGVCaXRzKGJ3LCBuX2JpdHMsIGJpdHMpOwotCi0gICAgICBkaXN0YW5jZSA9IFBpeE9yQ29weURpc3RhbmNlKHYpOwotICAgICAgUHJlZml4RW5jb2RlKGRpc3RhbmNlLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOwotICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMgKyA0LCBjb2RlKTsKLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIG5fYml0cywgYml0cyk7Ci0gICAgfQotICAgIHggKz0gUGl4T3JDb3B5TGVuZ3RoKHYpOwotICAgIHdoaWxlICh4ID49IHdpZHRoKSB7Ci0gICAgICB4IC09IHdpZHRoOwotICAgICAgKyt5OwotICAgIH0KLSAgfQotfQotCi0vLyBTcGVjaWFsIGNhc2Ugb2YgRW5jb2RlSW1hZ2VJbnRlcm5hbCgpIGZvciBjYWNoZS1iaXRzPTAsIGhpc3RvX2JpdHM9MzEKLXN0YXRpYyBpbnQgRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7Ci0gIGludCBpOwotICBpbnQgb2sgPSAwOwotICBWUDhMQmFja3dhcmRSZWZzIHJlZnM7Ci0gIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGVzWzVdID0geyB7IDAsIE5VTEwsIE5VTEwgfSB9OwotICBjb25zdCB1aW50MTZfdCBoaXN0b2dyYW1fc3ltYm9sc1sxXSA9IHsgMCB9OyAgICAvLyBvbmx5IG9uZSB0cmVlLCBvbmUgc3ltYm9sCi0gIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGhpc3RvZ3JhbV9pbWFnZSA9IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldCgxLCAwKTsKLSAgaWYgKGhpc3RvZ3JhbV9pbWFnZSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCi0gIGlmICghVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCAwLCAxLCAmcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEJ1aWxkIGhpc3RvZ3JhbSBpbWFnZSBhbmQgc3ltYm9scyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCi0gIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoJnJlZnMsIGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1swXSk7Ci0KLSAgLy8gQ3JlYXRlIEh1ZmZtYW4gYml0IGxlbmd0aHMgYW5kIGNvZGVzIGZvciBlYWNoIGhpc3RvZ3JhbSBpbWFnZS4KLSAgU0JfRENIRUNLKGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZSA9PSAxKTsKLSAgaWYgKCFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgLy8gTm8gY29sb3IgY2FjaGUsIG5vIEh1ZmZtYW4gaW1hZ2UuCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsIDApOwotCi0gIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCi0gIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpIHsKLSAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbaV07Ci0gICAgaWYgKCFTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcykpIHsKLSAgICAgIGdvdG8gRXJyb3I7Ci0gICAgfQotICAgIENsZWFySHVmZm1hblRyZWVJZk9ubHlPbmVTeW1ib2woY29kZXMpOwotICB9Ci0KLSAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgotICBTdG9yZUltYWdlVG9CaXRNYXNrKGJ3LCB3aWR0aCwgMCwgJnJlZnMsIGhpc3RvZ3JhbV9zeW1ib2xzLCBodWZmbWFuX2NvZGVzKTsKLSAgb2sgPSAxOwotCi0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoJnJlZnMpOwotICBTYk1lbW9yeURlYWxsb2NhdGUoaHVmZm1hbl9jb2Rlc1swXS5jb2Rlcyk7Ci0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIGludCBFbmNvZGVJbWFnZUludGVybmFsKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhY2hlX2JpdHMsIGludCBoaXN0b2dyYW1fYml0cykgewotICBpbnQgb2sgPSAwOwotICBjb25zdCBpbnQgdXNlXzJkX2xvY2FsaXR5ID0gMTsKLSAgY29uc3QgaW50IHVzZV9jb2xvcl9jYWNoZSA9IChjYWNoZV9iaXRzID4gMCk7Ci0gIGNvbnN0IHVpbnQzMl90IGhpc3RvZ3JhbV9pbWFnZV94eXNpemUgPQotICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSAqCi0gICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvZ3JhbV9iaXRzKTsKLSAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0KLSAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChoaXN0b2dyYW1faW1hZ2VfeHlzaXplLCAwKTsKLSAgaW50IGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gMDsKLSAgc2l6ZV90IGJpdF9hcnJheV9zaXplID0gMDsKLSAgSHVmZm1hblRyZWVDb2RlKiBodWZmbWFuX2NvZGVzID0gTlVMTDsKLSAgVlA4TEJhY2t3YXJkUmVmcyByZWZzOwotICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMgPQotICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpoaXN0b2dyYW1fc3ltYm9scykpOwotICBTQl9EQ0hFQ0soaGlzdG9ncmFtX2JpdHMgPj0gTUlOX0hVRkZNQU5fQklUUyk7Ci0gIFNCX0RDSEVDSyhoaXN0b2dyYW1fYml0cyA8PSBNQVhfSFVGRk1BTl9CSVRTKTsKLQotICBpZiAoaGlzdG9ncmFtX2ltYWdlID09IE5VTEwgfHwgaGlzdG9ncmFtX3N5bWJvbHMgPT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1faW1hZ2UpOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1fc3ltYm9scyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCi0gIGlmICghVlA4TEdldEJhY2t3YXJkUmVmZXJlbmNlcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCBxdWFsaXR5LCBjYWNoZV9iaXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlXzJkX2xvY2FsaXR5LCAmcmVmcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEJ1aWxkIGhpc3RvZ3JhbSBpbWFnZSBhbmQgc3ltYm9scyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCi0gIGlmICghVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKHdpZHRoLCBoZWlnaHQsICZyZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBoaXN0b2dyYW1fYml0cywgY2FjaGVfYml0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX2ltYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fc3ltYm9scykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIENyZWF0ZSBIdWZmbWFuIGJpdCBsZW5ndGhzIGFuZCBjb2RlcyBmb3IgZWFjaCBoaXN0b2dyYW0gaW1hZ2UuCi0gIGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gaGlzdG9ncmFtX2ltYWdlLT5zaXplOwotICBiaXRfYXJyYXlfc2l6ZSA9IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsKLSAgaHVmZm1hbl9jb2RlcyA9IChIdWZmbWFuVHJlZUNvZGUqKVdlYlBTYWZlQ2FsbG9jKGJpdF9hcnJheV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodWZmbWFuX2NvZGVzKSk7Ci0gIGlmIChodWZmbWFuX2NvZGVzID09IE5VTEwgfHwKLSAgICAgICFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIEZyZWUgY29tYmluZWQgaGlzdG9ncmFtcy4KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9pbWFnZSk7Ci0gIGhpc3RvZ3JhbV9pbWFnZSA9IE5VTEw7Ci0KLSAgLy8gQ29sb3IgQ2FjaGUgcGFyYW1ldGVycy4KLSAgVlA4TFdyaXRlQml0cyhidywgMSwgdXNlX2NvbG9yX2NhY2hlKTsKLSAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgewotICAgIFZQOExXcml0ZUJpdHMoYncsIDQsIGNhY2hlX2JpdHMpOwotICB9Ci0KLSAgLy8gSHVmZm1hbiBpbWFnZSArIG1ldGEgaHVmZm1hbi4KLSAgewotICAgIGNvbnN0IGludCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UgPSAoaGlzdG9ncmFtX2ltYWdlX3NpemUgPiAxKTsKLSAgICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCB3cml0ZV9oaXN0b2dyYW1faW1hZ2UpOwotICAgIGlmICh3cml0ZV9oaXN0b2dyYW1faW1hZ2UpIHsKLSAgICAgIHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW1fYXJnYiA9Ci0gICAgICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX2FyZ2IpKTsKLSAgICAgIGludCBtYXhfaW5kZXggPSAwOwotICAgICAgdWludDMyX3QgaTsKLSAgICAgIGlmIChoaXN0b2dyYW1fYXJnYiA9PSBOVUxMKSBnb3RvIEVycm9yOwotICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV94eXNpemU7ICsraSkgewotICAgICAgICBjb25zdCBpbnQgc3ltYm9sX2luZGV4ID0gaGlzdG9ncmFtX3N5bWJvbHNbaV0gJiAweGZmZmY7Ci0gICAgICAgIGhpc3RvZ3JhbV9hcmdiW2ldID0gMHhmZjAwMDAwMCB8IChzeW1ib2xfaW5kZXggPDwgOCk7Ci0gICAgICAgIGlmIChzeW1ib2xfaW5kZXggPj0gbWF4X2luZGV4KSB7Ci0gICAgICAgICAgbWF4X2luZGV4ID0gc3ltYm9sX2luZGV4ICsgMTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBtYXhfaW5kZXg7Ci0KLSAgICAgIFZQOExXcml0ZUJpdHMoYncsIDMsIGhpc3RvZ3JhbV9iaXRzIC0gMik7Ci0gICAgICBvayA9IEVuY29kZUltYWdlTm9IdWZmbWFuKGJ3LCBoaXN0b2dyYW1fYXJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBoaXN0b2dyYW1fYml0cyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpOwotICAgICAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9hcmdiKTsKLSAgICAgIGlmICghb2spIGdvdG8gRXJyb3I7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3RvcmUgSHVmZm1hbiBjb2Rlcy4KLSAgewotICAgIGludCBpOwotICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgewotICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOwotICAgICAgaWYgKCFTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBjb2RlcykpIGdvdG8gRXJyb3I7Ci0gICAgICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKGNvZGVzKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTdG9yZSBhY3R1YWwgbGl0ZXJhbHMuCi0gIFN0b3JlSW1hZ2VUb0JpdE1hc2soYncsIHdpZHRoLCBoaXN0b2dyYW1fYml0cywgJnJlZnMsCi0gICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX3N5bWJvbHMsIGh1ZmZtYW5fY29kZXMpOwotICBvayA9IDE7Ci0KLSBFcnJvcjoKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGhpc3RvZ3JhbV9pbWFnZSk7Ci0KLSAgVlA4TENsZWFyQmFja3dhcmRSZWZzKCZyZWZzKTsKLSAgaWYgKGh1ZmZtYW5fY29kZXMgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShodWZmbWFuX2NvZGVzLT5jb2Rlcyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGh1ZmZtYW5fY29kZXMpOwotICB9Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShoaXN0b2dyYW1fc3ltYm9scyk7Ci0gIHJldHVybiBvazsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFRyYW5zZm9ybXMKLQotLy8gQ2hlY2sgaWYgaXQgd291bGQgYmUgYSBnb29kIGlkZWEgdG8gc3VidHJhY3QgZ3JlZW4gZnJvbSByZWQgYW5kIGJsdWUuIFdlCi0vLyBvbmx5IGltcGFjdCBlbnRyb3B5IGluIHJlZC9ibHVlIGNvbXBvbmVudHMsIGRvbid0IGJvdGhlciB0byBsb29rIGF0IG90aGVycy4KLXN0YXRpYyBpbnQgRXZhbEFuZEFwcGx5U3VidHJhY3RHcmVlbihWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoIWVuYy0+dXNlX3BhbGV0dGVfKSB7Ci0gICAgaW50IGk7Ci0gICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IgPSBlbmMtPmFyZ2JfOwotICAgIGRvdWJsZSBiaXRfY29zdF9iZWZvcmUsIGJpdF9jb3N0X2FmdGVyOwotICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGhpc3RvID0gKFZQOExIaXN0b2dyYW0qKVNiTWVtb3J5QWxsb2NhdGUoc2l6ZW9mKCpoaXN0bykpOwotICAgIGlmIChoaXN0byA9PSBOVUxMKSByZXR1cm4gMDsKLQotICAgIFZQOExIaXN0b2dyYW1Jbml0KGhpc3RvLCAxKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggKiBoZWlnaHQ7ICsraSkgewotICAgICAgY29uc3QgdWludDMyX3QgYyA9IGFyZ2JbaV07Ci0gICAgICArK2hpc3RvLT5yZWRfWyhjID4+IDE2KSAmIDB4ZmZdOwotICAgICAgKytoaXN0by0+Ymx1ZV9bKGMgPj4gMCkgJiAweGZmXTsKLSAgICB9Ci0gICAgYml0X2Nvc3RfYmVmb3JlID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0byk7Ci0KLSAgICBWUDhMSGlzdG9ncmFtSW5pdChoaXN0bywgMSk7Ci0gICAgZm9yIChpID0gMDsgaSA8IHdpZHRoICogaGVpZ2h0OyArK2kpIHsKLSAgICAgIGNvbnN0IHVpbnQzMl90IGMgPSBhcmdiW2ldOwotICAgICAgY29uc3QgaW50IGdyZWVuID0gKGMgPj4gOCkgJiAweGZmOwotICAgICAgKytoaXN0by0+cmVkX1soKGMgPj4gMTYpIC0gZ3JlZW4pICYgMHhmZl07Ci0gICAgICArK2hpc3RvLT5ibHVlX1soKGMgPj4gMCkgLSBncmVlbikgJiAweGZmXTsKLSAgICB9Ci0gICAgYml0X2Nvc3RfYWZ0ZXIgPSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGhpc3RvKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoaGlzdG8pOwotCi0gICAgLy8gQ2hlY2sgaWYgc3VidHJhY3RpbmcgZ3JlZW4geWllbGRzIGxvdyBlbnRyb3B5LgotICAgIGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXyA9IChiaXRfY29zdF9hZnRlciA8IGJpdF9jb3N0X2JlZm9yZSk7Ci0gICAgaWYgKGVuYy0+dXNlX3N1YnRyYWN0X2dyZWVuXykgewotICAgICAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICAgICAgVlA4TFdyaXRlQml0cyhidywgMiwgU1VCVFJBQ1RfR1JFRU4pOwotICAgICAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZChlbmMtPmFyZ2JfLCB3aWR0aCAqIGhlaWdodCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFwcGx5UHJlZGljdEZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCBwcmVkX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBwcmVkX2JpdHMpOwotICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgcHJlZF9iaXRzKTsKLQotICBWUDhMUmVzaWR1YWxJbWFnZSh3aWR0aCwgaGVpZ2h0LCBwcmVkX2JpdHMsIGVuYy0+YXJnYl8sIGVuYy0+YXJnYl9zY3JhdGNoXywKLSAgICAgICAgICAgICAgICAgICAgZW5jLT50cmFuc2Zvcm1fZGF0YV8pOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBUUkFOU0ZPUk1fUFJFU0VOVCk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDIsIFBSRURJQ1RPUl9UUkFOU0ZPUk0pOwotICBTQl9EQ0hFQ0socHJlZF9iaXRzID49IDIpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBwcmVkX2JpdHMgLSAyKTsKLSAgaWYgKCFFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LCBxdWFsaXR5KSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IEFwcGx5Q3Jvc3NDb2xvckZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgaW50IHRyYW5zZm9ybV93aWR0aCA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOwotICBjb25zdCBpbnQgdHJhbnNmb3JtX2hlaWdodCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgY2NvbG9yX3RyYW5zZm9ybV9iaXRzKTsKLSAgY29uc3QgaW50IHN0ZXAgPSAocXVhbGl0eSA9PSAwKSA/IDMyIDogODsKLQotICBWUDhMQ29sb3JTcGFjZVRyYW5zZm9ybSh3aWR0aCwgaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMsIHN0ZXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl8sIGVuYy0+dHJhbnNmb3JtX2RhdGFfKTsKLSAgVlA4TFdyaXRlQml0cyhidywgMSwgVFJBTlNGT1JNX1BSRVNFTlQpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAyLCBDUk9TU19DT0xPUl9UUkFOU0ZPUk0pOwotICBTQl9EQ0hFQ0soY2NvbG9yX3RyYW5zZm9ybV9iaXRzID49IDIpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCAzLCBjY29sb3JfdHJhbnNmb3JtX2JpdHMgLSAyKTsKLSAgaWYgKCFFbmNvZGVJbWFnZU5vSHVmZm1hbihidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3dpZHRoLCB0cmFuc2Zvcm1faGVpZ2h0LCBxdWFsaXR5KSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVSaWZmSGVhZGVyKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsIHNpemVfdCB2cDhsX3NpemUpIHsKLSAgdWludDhfdCByaWZmW1JJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSArIFZQOExfU0lHTkFUVVJFX1NJWkVdID0gewotICAgICdSJywgJ0knLCAnRicsICdGJywgMCwgMCwgMCwgMCwgJ1cnLCAnRScsICdCJywgJ1AnLAotICAgICdWJywgJ1AnLCAnOCcsICdMJywgMCwgMCwgMCwgMCwgVlA4TF9NQUdJQ19CWVRFLAotICB9OwotICBQdXRMRTMyKHJpZmYgKyBUQUdfU0laRSwgKHVpbnQzMl90KXJpZmZfc2l6ZSk7Ci0gIFB1dExFMzIocmlmZiArIFJJRkZfSEVBREVSX1NJWkUgKyBUQUdfU0laRSwgKHVpbnQzMl90KXZwOGxfc2l6ZSk7Ci0gIGlmICghcGljLT53cml0ZXIocmlmZiwgc2l6ZW9mKHJpZmYpLCBwaWMpKSB7Ci0gICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwotICB9Ci0gIHJldHVybiBWUDhfRU5DX09LOwotfQotCi1zdGF0aWMgaW50IFdyaXRlSW1hZ2VTaXplKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGggLSAxOwotICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQgLSAxOwotICBTQl9EQ0hFQ0sod2lkdGggPCBXRUJQX01BWF9ESU1FTlNJT04gJiYgaGVpZ2h0IDwgV0VCUF9NQVhfRElNRU5TSU9OKTsKLQotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX0lNQUdFX1NJWkVfQklUUywgd2lkdGgpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX0lNQUdFX1NJWkVfQklUUywgaGVpZ2h0KTsKLSAgcmV0dXJuICFidy0+ZXJyb3JfOwotfQotCi1zdGF0aWMgaW50IFdyaXRlUmVhbEFscGhhQW5kVmVyc2lvbihWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IGhhc19hbHBoYSkgewotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBoYXNfYWxwaGEpOwotICBWUDhMV3JpdGVCaXRzKGJ3LCBWUDhMX1ZFUlNJT05fQklUUywgVlA4TF9WRVJTSU9OKTsKLSAgcmV0dXJuICFidy0+ZXJyb3JfOwotfQotCi1zdGF0aWMgV2ViUEVuY29kaW5nRXJyb3IgV3JpdGVJbWFnZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGNvZGVkX3NpemUpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgY29uc3QgdWludDhfdCogY29uc3Qgd2VicGxsX2RhdGEgPSBWUDhMQml0V3JpdGVyRmluaXNoKGJ3KTsKLSAgY29uc3Qgc2l6ZV90IHdlYnBsbF9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKLSAgY29uc3Qgc2l6ZV90IHZwOGxfc2l6ZSA9IFZQOExfU0lHTkFUVVJFX1NJWkUgKyB3ZWJwbGxfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IHBhZCA9IHZwOGxfc2l6ZSAmIDE7Ci0gIGNvbnN0IHNpemVfdCByaWZmX3NpemUgPSBUQUdfU0laRSArIENIVU5LX0hFQURFUl9TSVpFICsgdnA4bF9zaXplICsgcGFkOwotCi0gIGVyciA9IFdyaXRlUmlmZkhlYWRlcihwaWMsIHJpZmZfc2l6ZSwgdnA4bF9zaXplKTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotCi0gIGlmICghcGljLT53cml0ZXIod2VicGxsX2RhdGEsIHdlYnBsbF9zaXplLCBwaWMpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmIChwYWQpIHsKLSAgICBjb25zdCB1aW50OF90IHBhZF9ieXRlWzFdID0geyAwIH07Ci0gICAgaWYgKCFwaWMtPndyaXRlcihwYWRfYnl0ZSwgMSwgcGljKSkgewotICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9CQURfV1JJVEU7Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotICAqY29kZWRfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgcmlmZl9zaXplOwotICByZXR1cm4gVlA4X0VOQ19PSzsKLQotIEVycm9yOgotICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBbGxvY2F0ZXMgdGhlIG1lbW9yeSBmb3IgYXJnYiAoVyB4IEgpIGJ1ZmZlciwgMiByb3dzIG9mIGNvbnRleHQgZm9yCi0vLyBwcmVkaWN0aW9uIGFuZCB0cmFuc2Zvcm0gZGF0YS4KLXN0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihWUDhMRW5jb2RlciogY29uc3QgZW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOwotICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgY29uc3QgdWludDY0X3QgaW1hZ2Vfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OwotICBjb25zdCB1aW50NjRfdCBhcmdiX3NjcmF0Y2hfc2l6ZSA9IHRpbGVfc2l6ZSAqIHdpZHRoICsgd2lkdGg7Ci0gIGNvbnN0IHVpbnQ2NF90IHRyYW5zZm9ybV9kYXRhX3NpemUgPQotICAgICAgKHVpbnQ2NF90KVZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBlbmMtPnRyYW5zZm9ybV9iaXRzXykgKgotICAgICAgKHVpbnQ2NF90KVZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgZW5jLT50cmFuc2Zvcm1fYml0c18pOwotICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0KLSAgICAgIGltYWdlX3NpemUgKyBhcmdiX3NjcmF0Y2hfc2l6ZSArIHRyYW5zZm9ybV9kYXRhX3NpemU7Ci0gIHVpbnQzMl90KiBtZW0gPSAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7Ci0gIGlmIChtZW0gPT0gTlVMTCkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIGVuYy0+YXJnYl8gPSBtZW07Ci0gIG1lbSArPSBpbWFnZV9zaXplOwotICBlbmMtPmFyZ2Jfc2NyYXRjaF8gPSBtZW07Ci0gIG1lbSArPSBhcmdiX3NjcmF0Y2hfc2l6ZTsKLSAgZW5jLT50cmFuc2Zvcm1fZGF0YV8gPSBtZW07Ci0gIGVuYy0+Y3VycmVudF93aWR0aF8gPSB3aWR0aDsKLQotIEVycm9yOgotICByZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBBcHBseVBhbGV0dGUodWludDMyX3QqIHNyYywgdWludDMyX3QqIGRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfc3RyaWRlLCB1aW50MzJfdCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBwYWxldHRlLCBpbnQgcGFsZXR0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhiaXRzLCB1aW50OF90KiByb3cpIHsKLSAgaW50IGksIHgsIHk7Ci0gIGludCB1c2VfTFVUID0gMTsKLSAgZm9yIChpID0gMDsgaSA8IHBhbGV0dGVfc2l6ZTsgKytpKSB7Ci0gICAgaWYgKChwYWxldHRlW2ldICYgMHhmZmZmMDBmZnUpICE9IDApIHsKLSAgICAgIHVzZV9MVVQgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHVzZV9MVVQpIHsKLSAgICBpbnQgaW52X3BhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV0gPSB7IDAgfTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgcGFsZXR0ZV9zaXplOyArK2kpIHsKLSAgICAgIGNvbnN0IGludCBjb2xvciA9IChwYWxldHRlW2ldID4+IDgpICYgMHhmZjsKLSAgICAgIGludl9wYWxldHRlW2NvbG9yXSA9IGk7Ci0gICAgfQotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKLSAgICAgICAgY29uc3QgaW50IGNvbG9yID0gKHNyY1t4XSA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIHJvd1t4XSA9IGludl9wYWxldHRlW2NvbG9yXTsKLSAgICAgIH0KLSAgICAgIFZQOExCdW5kbGVDb2xvck1hcChyb3csIHdpZHRoLCB4Yml0cywgZHN0KTsKLSAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFVzZSAxIHBpeGVsIGNhY2hlIGZvciBBUkdCIHBpeGVscy4KLSAgICB1aW50MzJfdCBsYXN0X3BpeCA9IHBhbGV0dGVbMF07Ci0gICAgaW50IGxhc3RfaWR4ID0gMDsKLSAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKLSAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeCA9IHNyY1t4XTsKLSAgICAgICAgaWYgKHBpeCAhPSBsYXN0X3BpeCkgewotICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwYWxldHRlX3NpemU7ICsraSkgewotICAgICAgICAgICAgaWYgKHBpeCA9PSBwYWxldHRlW2ldKSB7Ci0gICAgICAgICAgICAgIGxhc3RfaWR4ID0gaTsKLSAgICAgICAgICAgICAgbGFzdF9waXggPSBwaXg7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByb3dbeF0gPSBsYXN0X2lkeDsKLSAgICAgIH0KLSAgICAgIFZQOExCdW5kbGVDb2xvck1hcChyb3csIHdpZHRoLCB4Yml0cywgZHN0KTsKLSAgICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICAgZHN0ICs9IGRzdF9zdHJpZGU7Ci0gICAgfQotICB9Ci19Ci0KLS8vIE5vdGU6IEV4cGVjdHMgImVuYy0+cGFsZXR0ZV8iIHRvIGJlIHNldCBwcm9wZXJseS4KLS8vIEFsc28sICJlbmMtPnBhbGV0dGVfIiB3aWxsIGJlIG1vZGlmaWVkIGFmdGVyIHRoaXMgY2FsbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkCi0vLyBsYXRlci4KLXN0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBFbmNvZGVQYWxldHRlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywgaW50IHF1YWxpdHkpIHsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgaW50IGk7Ci0gIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMgPSBlbmMtPnBpY187Ci0gIHVpbnQzMl90KiBzcmMgPSBwaWMtPmFyZ2I7Ci0gIHVpbnQzMl90KiBkc3Q7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7Ci0gIGNvbnN0IGludCBoZWlnaHQgPSBwaWMtPmhlaWdodDsKLSAgdWludDMyX3QqIGNvbnN0IHBhbGV0dGUgPSBlbmMtPnBhbGV0dGVfOwotICBjb25zdCBpbnQgcGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOwotICB1aW50OF90KiByb3cgPSBOVUxMOwotICBpbnQgeGJpdHM7Ci0KLSAgLy8gUmVwbGFjZSBlYWNoIGlucHV0IHBpeGVsIGJ5IGNvcnJlc3BvbmRpbmcgcGFsZXR0ZSBpbmRleC4KLSAgLy8gVGhpcyBpcyBkb25lIGxpbmUgYnkgbGluZS4KLSAgaWYgKHBhbGV0dGVfc2l6ZSA8PSA0KSB7Ci0gICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDIpID8gMyA6IDI7Ci0gIH0gZWxzZSB7Ci0gICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDE2KSA/IDEgOiAwOwotICB9Ci0KLSAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgeGJpdHMpLCBoZWlnaHQpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0gIGRzdCA9IGVuYy0+YXJnYl87Ci0KLSAgcm93ID0gV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXdpZHRoLCBzaXplb2YoKnJvdykpOwotICBpZiAocm93ID09IE5VTEwpIHJldHVybiBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0KLSAgQXBwbHlQYWxldHRlKHNyYywgZHN0LCBwaWMtPmFyZ2Jfc3RyaWRlLCBlbmMtPmN1cnJlbnRfd2lkdGhfLAotICAgICAgICAgICAgICAgcGFsZXR0ZSwgcGFsZXR0ZV9zaXplLCB3aWR0aCwgaGVpZ2h0LCB4Yml0cywgcm93KTsKLQotICAvLyBTYXZlIHBhbGV0dGUgdG8gYml0c3RyZWFtLgotICBWUDhMV3JpdGVCaXRzKGJ3LCAxLCBUUkFOU0ZPUk1fUFJFU0VOVCk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDIsIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSk7Ci0gIFNCX0RDSEVDSyhwYWxldHRlX3NpemUgPj0gMSk7Ci0gIFZQOExXcml0ZUJpdHMoYncsIDgsIHBhbGV0dGVfc2l6ZSAtIDEpOwotICBmb3IgKGkgPSBwYWxldHRlX3NpemUgLSAxOyBpID49IDE7IC0taSkgewotICAgIHBhbGV0dGVbaV0gPSBWUDhMU3ViUGl4ZWxzKHBhbGV0dGVbaV0sIHBhbGV0dGVbaSAtIDFdKTsKLSAgfQotICBpZiAoIUVuY29kZUltYWdlTm9IdWZmbWFuKGJ3LCBwYWxldHRlLCBwYWxldHRlX3NpemUsIDEsIHF1YWxpdHkpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gRXJyb3I6Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShyb3cpOwotICByZXR1cm4gZXJyOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgaW50IEdldEhpc3RvQml0cyhpbnQgbWV0aG9kLCBpbnQgdXNlX3BhbGV0dGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICBjb25zdCB1aW50NjRfdCBoaXN0X3NpemUgPSBzaXplb2YoVlA4TEhpc3RvZ3JhbSk7Ci0gIC8vIE1ha2UgdGlsZSBzaXplIGEgZnVuY3Rpb24gb2YgZW5jb2RpbmcgbWV0aG9kIChSYW5nZTogMCB0byA2KS4KLSAgaW50IGhpc3RvX2JpdHMgPSAodXNlX3BhbGV0dGUgPyA5IDogNykgLSBtZXRob2Q7Ci0gIHdoaWxlICgxKSB7Ci0gICAgY29uc3QgdWludDY0X3QgaHVmZl9pbWFnZV9zaXplID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvX2JpdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvX2JpdHMpICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0X3NpemU7Ci0gICAgaWYgKGh1ZmZfaW1hZ2Vfc2l6ZSA8PSBNQVhfSFVGRl9JTUFHRV9TSVpFKSBicmVhazsKLSAgICArK2hpc3RvX2JpdHM7Ci0gIH0KLSAgcmV0dXJuIChoaXN0b19iaXRzIDwgTUlOX0hVRkZNQU5fQklUUykgPyBNSU5fSFVGRk1BTl9CSVRTIDoKLSAgICAgICAgIChoaXN0b19iaXRzID4gTUFYX0hVRkZNQU5fQklUUykgPyBNQVhfSFVGRk1BTl9CSVRTIDogaGlzdG9fYml0czsKLX0KLQotc3RhdGljIHZvaWQgRmluaXNoRW5jUGFyYW1zKFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnID0gZW5jLT5jb25maWdfOwotICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotICBjb25zdCBpbnQgbWV0aG9kID0gY29uZmlnLT5tZXRob2Q7Ci0gIGNvbnN0IGZsb2F0IHF1YWxpdHkgPSBjb25maWctPnF1YWxpdHk7Ci0gIGNvbnN0IGludCB1c2VfcGFsZXR0ZSA9IGVuYy0+dXNlX3BhbGV0dGVfOwotICBlbmMtPnRyYW5zZm9ybV9iaXRzXyA9IChtZXRob2QgPCA0KSA/IDUgOiAobWV0aG9kID4gNCkgPyAzIDogNDsKLSAgZW5jLT5oaXN0b19iaXRzXyA9IEdldEhpc3RvQml0cyhtZXRob2QsIHVzZV9wYWxldHRlLCBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7Ci0gIGVuYy0+Y2FjaGVfYml0c18gPSAocXVhbGl0eSA8PSAyNS5mKSA/IDAgOiA3OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4TEVuY29kZXIKLQotc3RhdGljIFZQOExFbmNvZGVyKiBWUDhMRW5jb2Rlck5ldyhjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7Ci0gIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSAoVlA4TEVuY29kZXIqKVNiTWVtb3J5Q2FsbG9jKDEsIHNpemVvZigqZW5jKSk7Ci0gIGlmIChlbmMgPT0gTlVMTCkgewotICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZW5jLT5jb25maWdfID0gY29uZmlnOwotICBlbmMtPnBpY18gPSBwaWN0dXJlOwotICByZXR1cm4gZW5jOwotfQotCi1zdGF0aWMgdm9pZCBWUDhMRW5jb2RlckRlbGV0ZShWUDhMRW5jb2RlciogZW5jKSB7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShlbmMtPmFyZ2JfKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYWluIGNhbGwKLQotV2ViUEVuY29kaW5nRXJyb3IgVlA4TEVuY29kZVN0cmVhbShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOwotICBjb25zdCBpbnQgcXVhbGl0eSA9IChpbnQpY29uZmlnLT5xdWFsaXR5OwotICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKLSAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYyA9IFZQOExFbmNvZGVyTmV3KGNvbmZpZywgcGljdHVyZSk7Ci0gIGNvbnN0IHNpemVfdCBieXRlX3Bvc2l0aW9uID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KTsKLQotICBpZiAoZW5jID09IE5VTEwpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBbmFseXplIGltYWdlIChlbnRyb3B5LCBudW1fcGFsZXR0ZXMgZXRjKQotCi0gIGlmICghVlA4TEVuY0FuYWx5emUoZW5jLCBjb25maWctPmltYWdlX2hpbnQpKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICAgIGdvdG8gRXJyb3I7Ci0gIH0KLQotICBGaW5pc2hFbmNQYXJhbXMoZW5jKTsKLQotICBpZiAoZW5jLT51c2VfcGFsZXR0ZV8pIHsKLSAgICBlcnIgPSBFbmNvZGVQYWxldHRlKGJ3LCBlbmMsIHF1YWxpdHkpOwotICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKLSAgICAvLyBDb2xvciBjYWNoZSBpcyBkaXNhYmxlZCBmb3IgcGFsZXR0ZS4KLSAgICBlbmMtPmNhY2hlX2JpdHNfID0gMDsKLSAgfQotCi0gIC8vIEluIGNhc2UgaW1hZ2UgaXMgbm90IHBhY2tlZC4KLSAgaWYgKGVuYy0+YXJnYl8gPT0gTlVMTCkgewotICAgIGludCB5OwotICAgIGVyciA9IEFsbG9jYXRlVHJhbnNmb3JtQnVmZmVyKGVuYywgd2lkdGgsIGhlaWdodCk7Ci0gICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgewotICAgICAgU2JNZW1vcnlDb3B5KGVuYy0+YXJnYl8gKyB5ICogd2lkdGgsCi0gICAgICAgICAgICAgcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwKLSAgICAgICAgICAgICB3aWR0aCAqIHNpemVvZigqZW5jLT5hcmdiXykpOwotICAgIH0KLSAgICBlbmMtPmN1cnJlbnRfd2lkdGhfID0gd2lkdGg7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQXBwbHkgdHJhbnNmb3JtcyBhbmQgd3JpdGUgdHJhbnNmb3JtIGRhdGEuCi0KLSAgaWYgKCFFdmFsQW5kQXBwbHlTdWJ0cmFjdEdyZWVuKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBidykpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmIChlbmMtPnVzZV9wcmVkaWN0XykgewotICAgIGlmICghQXBwbHlQcmVkaWN0RmlsdGVyKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LCBidykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICBpZiAoZW5jLT51c2VfY3Jvc3NfY29sb3JfKSB7Ci0gICAgaWYgKCFBcHBseUNyb3NzQ29sb3JGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksIGJ3KSkgewotICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047Ci0gICAgICBnb3RvIEVycm9yOwotICAgIH0KLSAgfQotCi0gIFZQOExXcml0ZUJpdHMoYncsIDEsICFUUkFOU0ZPUk1fUFJFU0VOVCk7ICAvLyBObyBtb3JlIHRyYW5zZm9ybXMuCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEVzdGltYXRlIHRoZSBjb2xvciBjYWNoZSBzaXplLgotCi0gIGlmIChlbmMtPmNhY2hlX2JpdHNfID4gMCkgewotICAgIGlmICghVlA4TENhbGN1bGF0ZUVzdGltYXRlRm9yQ2FjaGVTaXplKGVuYy0+YXJnYl8sIGVuYy0+Y3VycmVudF93aWR0aF8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCAmZW5jLT5jYWNoZV9iaXRzXykpIHsKLSAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOwotICAgICAgZ290byBFcnJvcjsKLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRW5jb2RlIGFuZCB3cml0ZSB0aGUgdHJhbnNmb3JtZWQgaW1hZ2UuCi0KLSAgaWYgKCFFbmNvZGVJbWFnZUludGVybmFsKGJ3LCBlbmMtPmFyZ2JfLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5LCBlbmMtPmNhY2hlX2JpdHNfLCBlbmMtPmhpc3RvX2JpdHNfKSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKLSAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzID0gcGljdHVyZS0+c3RhdHM7Ci0gICAgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzID0gMDsKLSAgICBpZiAoZW5jLT51c2VfcHJlZGljdF8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAxOwotICAgIGlmIChlbmMtPnVzZV9jcm9zc19jb2xvcl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSAyOwotICAgIGlmIChlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSA0OwotICAgIGlmIChlbmMtPnVzZV9wYWxldHRlXykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDg7Ci0gICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzID0gZW5jLT5oaXN0b19iaXRzXzsKLSAgICBzdGF0cy0+dHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKLSAgICBzdGF0cy0+Y2FjaGVfYml0cyA9IGVuYy0+Y2FjaGVfYml0c187Ci0gICAgc3RhdHMtPnBhbGV0dGVfc2l6ZSA9IGVuYy0+cGFsZXR0ZV9zaXplXzsKLSAgICBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IChpbnQpKFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgLSBieXRlX3Bvc2l0aW9uKTsKLSAgfQotCi0gRXJyb3I6Ci0gIFZQOExFbmNvZGVyRGVsZXRlKGVuYyk7Ci0gIHJldHVybiBlcnI7Ci19Ci0KLWludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgaW50IGhhc19hbHBoYTsKLSAgc2l6ZV90IGNvZGVkX3NpemU7Ci0gIGludCBwZXJjZW50ID0gMDsKLSAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKLSAgVlA4TEJpdFdyaXRlciBidzsKLQotICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKLQotICBpZiAoY29uZmlnID09IE5VTEwgfHwgcGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7Ci0gICAgZXJyID0gVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUjsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOwotICAgIHJldHVybiAwOwotICB9Ci0KLSAgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKLSAgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OwotICBpZiAoIVZQOExCaXRXcml0ZXJJbml0KCZidywgKHdpZHRoICogaGVpZ2h0KSA+PiAxKSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgMSwgJnBlcmNlbnQpKSB7Ci0gVXNlckFib3J0OgotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfVVNFUl9BQk9SVDsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0gIC8vIFJlc2V0IHN0YXRzIChmb3IgcHVyZSBsb3NzbGVzcyBjb2RpbmcpCi0gIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7Ci0gICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpY3R1cmUtPnN0YXRzOwotICAgIFNiTWVtb3J5U2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7Ci0gICAgc3RhdHMtPlBTTlJbMF0gPSA5OS5mOwotICAgIHN0YXRzLT5QU05SWzFdID0gOTkuZjsKLSAgICBzdGF0cy0+UFNOUlsyXSA9IDk5LmY7Ci0gICAgc3RhdHMtPlBTTlJbM10gPSA5OS5mOwotICAgIHN0YXRzLT5QU05SWzRdID0gOTkuZjsKLSAgfQotCi0gIC8vIFdyaXRlIGltYWdlIHNpemUuCi0gIGlmICghV3JpdGVJbWFnZVNpemUocGljdHVyZSwgJmJ3KSkgewotICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKLSAgICBnb3RvIEVycm9yOwotICB9Ci0KLSAgaGFzX2FscGhhID0gV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3kocGljdHVyZSk7Ci0gIC8vIFdyaXRlIHRoZSBub24tdHJpdmlhbCBBbHBoYSBmbGFnIGFuZCBsb3NzbGVzcyB2ZXJzaW9uLgotICBpZiAoIVdyaXRlUmVhbEFscGhhQW5kVmVyc2lvbigmYncsIGhhc19hbHBoYSkpIHsKLSAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7Ci0gICAgZ290byBFcnJvcjsKLSAgfQotCi0gIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDUsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7Ci0KLSAgLy8gRW5jb2RlIG1haW4gaW1hZ2Ugc3RyZWFtLgotICBlcnIgPSBWUDhMRW5jb2RlU3RyZWFtKGNvbmZpZywgcGljdHVyZSwgJmJ3KTsKLSAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOwotCi0gIC8vIFRPRE8oc2thbCk6IGhhdmUgYSBmaW5lLWdyYWluZWQgcHJvZ3Jlc3MgcmVwb3J0IGluIFZQOExFbmNvZGVTdHJlYW0oKS4KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgOTAsICZwZXJjZW50KSkgZ290byBVc2VyQWJvcnQ7Ci0KLSAgLy8gRmluaXNoIHRoZSBSSUZGIGNodW5rLgotICBlcnIgPSBXcml0ZUltYWdlKHBpY3R1cmUsICZidywgJmNvZGVkX3NpemUpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7Ci0KLSAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgMTAwLCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OwotCi0gIC8vIFNhdmUgc2l6ZS4KLSAgaWYgKHBpY3R1cmUtPnN0YXRzICE9IE5VTEwpIHsKLSAgICBwaWN0dXJlLT5zdGF0cy0+Y29kZWRfc2l6ZSArPSAoaW50KWNvZGVkX3NpemU7Ci0gICAgcGljdHVyZS0+c3RhdHMtPmxvc3NsZXNzX3NpemUgPSAoaW50KWNvZGVkX3NpemU7Ci0gIH0KLQotICBpZiAocGljdHVyZS0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7Ci0gICAgY29uc3QgaW50IG1iX3cgPSAod2lkdGggKyAxNSkgPj4gNDsKLSAgICBjb25zdCBpbnQgbWJfaCA9IChoZWlnaHQgKyAxNSkgPj4gNDsKLSAgICBTYk1lbW9yeVNldChwaWN0dXJlLT5leHRyYV9pbmZvLCAwLCBtYl93ICogbWJfaCAqIHNpemVvZigqcGljdHVyZS0+ZXh0cmFfaW5mbykpOwotICB9Ci0KLSBFcnJvcjoKLSAgaWYgKGJ3LmVycm9yXykgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOwotICBWUDhMQml0V3JpdGVyRGVzdHJveSgmYncpOwotICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOwotICAgIHJldHVybiAwOwotICB9Ci0gIHJldHVybiAxOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhsaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGxpLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjAxZjUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGxpLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTG9zc2xlc3MgZW5jb2RlcjogaW50ZXJuYWwgaGVhZGVyLgotLy8KLS8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9FTkNfVlA4TElfSF8KLSNkZWZpbmUgV0VCUF9FTkNfVlA4TElfSF8KLQotI2luY2x1ZGUgIi4vaGlzdG9ncmFtLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvYml0X3dyaXRlci5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZW5jb2RlLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IFdlYlBDb25maWcqIGNvbmZpZ187ICAgIC8vIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcGFyYW1ldGVycwotICBjb25zdCBXZWJQUGljdHVyZSogcGljXzsgICAgICAvLyBpbnB1dCBwaWN0dXJlLgotCi0gIHVpbnQzMl90KiBhcmdiXzsgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybWVkIGFyZ2IgaW1hZ2UgZGF0YS4KLSAgdWludDMyX3QqIGFyZ2Jfc2NyYXRjaF87ICAgICAgLy8gU2NyYXRjaCBtZW1vcnkgZm9yIGFyZ2Igcm93cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodXNlZCBmb3IgcHJlZGljdGlvbikuCi0gIHVpbnQzMl90KiB0cmFuc2Zvcm1fZGF0YV87ICAgIC8vIFNjcmF0Y2ggbWVtb3J5IGZvciB0cmFuc2Zvcm0gZGF0YS4KLSAgaW50ICAgICAgIGN1cnJlbnRfd2lkdGhfOyAgICAgLy8gQ29ycmVzcG9uZHMgdG8gcGFja2VkIGltYWdlIHdpZHRoLgotCi0gIC8vIEVuY29kaW5nIHBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIHF1YWxpdHkgcGFyYW1ldGVyLgotICBpbnQgaGlzdG9fYml0c187Ci0gIGludCB0cmFuc2Zvcm1fYml0c187Ci0gIGludCBjYWNoZV9iaXRzXzsgICAgICAgIC8vIElmIGVxdWFsIHRvIDAsIGRvbid0IHVzZSBjb2xvciBjYWNoZS4KLQotICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MuCi0gIGludCB1c2VfY3Jvc3NfY29sb3JfOwotICBpbnQgdXNlX3N1YnRyYWN0X2dyZWVuXzsKLSAgaW50IHVzZV9wcmVkaWN0XzsKLSAgaW50IHVzZV9wYWxldHRlXzsKLSAgaW50IHBhbGV0dGVfc2l6ZV87Ci0gIHVpbnQzMl90IHBhbGV0dGVfW01BWF9QQUxFVFRFX1NJWkVdOwotfSBWUDhMRW5jb2RlcjsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGludGVybmFsIGZ1bmN0aW9ucy4gTm90IHB1YmxpYy4KLQotLy8gRW5jb2RlcyB0aGUgcGljdHVyZS4KLS8vIFJldHVybnMgMCBpZiBjb25maWcgb3IgcGljdHVyZSBpcyBOVUxMIG9yIHBpY3R1cmUgZG9lc24ndCBoYXZlIHZhbGlkIGFyZ2IKLS8vIGlucHV0LgotaW50IFZQOExFbmNvZGVJbWFnZShjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKTsKLQotLy8gRW5jb2RlcyB0aGUgbWFpbiBpbWFnZSBzdHJlYW0gdXNpbmcgdGhlIHN1cHBsaWVkIGJpdCB3cml0ZXIuCi1XZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9FTkNfVlA4TElfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL0FuZHJvaWQubWsgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NmI4YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsOTggQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGliZXhhbXBsZV91dGlsCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGV4YW1wbGVfdXRpbC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCisKK0xPQ0FMX01PRFVMRSA6PSBleGFtcGxlX3V0aWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBjd2VicAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworIyBOb3RlOiB0byBlbmFibGUganBlZy9wbmcgZW5jb2RpbmcgdGhlIHNvdXJjZXMgZnJvbSBBT1NQIGNhbiBiZSB1c2VkIHdpdGgKKyMgbWlub3IgbW9kaWZpY2F0aW9uIHRvIHRoZWlyIEFuZHJvaWQubWsgZmlsZXMuCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGN3ZWJwLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZXhhbXBsZV91dGlsIGltYWdlaW9fdXRpbCBpbWFnZWRlYyB3ZWJwZGVtdXggd2VicAorCitMT0NBTF9NT0RVTEUgOj0gY3dlYnAKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGR3ZWJwCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGR3ZWJwLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZXhhbXBsZV91dGlsIGltYWdlZGVjIGltYWdlZW5jIHdlYnBkZW11eCB3ZWJwCitMT0NBTF9NT0RVTEUgOj0gZHdlYnAKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHdlYnBtdXgKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgd2VicG11eC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGV4YW1wbGVfdXRpbCBpbWFnZWlvX3V0aWwgd2VicG11eCB3ZWJwCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwbXV4X2V4YW1wbGUKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIGltZzJ3ZWJwCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGltZzJ3ZWJwLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZXhhbXBsZV91dGlsIGltYWdlaW9fdXRpbCBpbWFnZWRlYyB3ZWJwbXV4IHdlYnBkZW11eCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdlYnAKKworTE9DQUxfTU9EVUxFIDo9IGltZzJ3ZWJwX2V4YW1wbGUKKworaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHdlYnBpbmZvCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIHdlYnBpbmZvLmMgXAorCitMT0NBTF9DRkxBR1MgOj0gJChXRUJQX0NGTEFHUykKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS8uLi9zcmMKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gZXhhbXBsZV91dGlsIGltYWdlaW9fdXRpbCB3ZWJwCisKK0xPQ0FMX01PRFVMRSA6PSB3ZWJwaW5mb19leGFtcGxlCisKK2luY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTA4NzJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMTkgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjCisKK2Jpbl9QUk9HUkFNUyA9CitpZiBXQU5UX0RFTVVYCisgIGJpbl9QUk9HUkFNUyArPSBkd2VicCBjd2VicAorZW5kaWYKK2lmIEJVSUxEX0FOSU1ESUZGCisgIG5vaW5zdF9QUk9HUkFNUyA9IGFuaW1fZGlmZiBhbmltX2R1bXAKK2VuZGlmCitpZiBCVUlMRF9HSUYyV0VCUAorICBiaW5fUFJPR1JBTVMgKz0gZ2lmMndlYnAKK2VuZGlmCitpZiBCVUlMRF9JTUcyV0VCUAorICBiaW5fUFJPR1JBTVMgKz0gaW1nMndlYnAKK2VuZGlmCitpZiBXQU5UX01VWAorICBiaW5fUFJPR1JBTVMgKz0gd2VicG11eAorZW5kaWYKK2lmIEJVSUxEX1ZXRUJQCisgIGJpbl9QUk9HUkFNUyArPSB2d2VicAorZW5kaWYKK2lmIEJVSUxEX1dFQlBJTkZPCisgIGJpbl9QUk9HUkFNUyArPSB3ZWJwaW5mbworZW5kaWYKKworbm9pbnN0X0xUTElCUkFSSUVTID0gbGliZXhhbXBsZV91dGlsLmxhCisKK2xpYmV4YW1wbGVfdXRpbF9sYV9TT1VSQ0VTID0gZXhhbXBsZV91dGlsLmMgZXhhbXBsZV91dGlsLmgKK2xpYmV4YW1wbGVfdXRpbF9sYV9MSUJBREQgPSAuLi9zcmMvbGlid2VicC5sYQorCithbmltX2RpZmZfU09VUkNFUyA9IGFuaW1fZGlmZi5jIGFuaW1fdXRpbC5jIGFuaW1fdXRpbC5oCithbmltX2RpZmZfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKEdJRl9JTkNMVURFUykKK2FuaW1fZGlmZl9MREFERCAgPQorYW5pbV9kaWZmX0xEQUREICs9IC4uL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgubGEKK2FuaW1fZGlmZl9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2FuaW1fZGlmZl9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorYW5pbV9kaWZmX0xEQUREICs9ICQoR0lGX0xJQlMpIC1sbQorCithbmltX2R1bXBfU09VUkNFUyA9IGFuaW1fZHVtcC5jIGFuaW1fdXRpbC5jIGFuaW1fdXRpbC5oCithbmltX2R1bXBfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKSAkKFBOR19JTkNMVURFUykKK2FuaW1fZHVtcF9DUFBGTEFHUyArPSAkKEdJRl9JTkNMVURFUykKK2FuaW1fZHVtcF9MREFERCAgPQorYW5pbV9kdW1wX0xEQUREICs9IC4uL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgubGEKK2FuaW1fZHVtcF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2FuaW1fZHVtcF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorYW5pbV9kdW1wX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2VlbmMubGEKK2FuaW1fZHVtcF9MREFERCArPSAkKFBOR19MSUJTKSAkKEdJRl9MSUJTKSAkKFRJRkZfTElCUykgLWxtCisKK2N3ZWJwX1NPVVJDRVMgID0gY3dlYnAuYyBzdG9wd2F0Y2guaAorY3dlYnBfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykKK2N3ZWJwX0xEQUREICA9Citjd2VicF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK2N3ZWJwX0xEQUREICs9IC4uL2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmxhCitjd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZGVjLmxhCitjd2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorY3dlYnBfTERBREQgKz0gJChKUEVHX0xJQlMpICQoUE5HX0xJQlMpICQoVElGRl9MSUJTKQorCitkd2VicF9TT1VSQ0VTID0gZHdlYnAuYyBzdG9wd2F0Y2guaAorZHdlYnBfQ1BQRkxBR1MgID0gJChBTV9DUFBGTEFHUykKK2R3ZWJwX0NQUEZMQUdTICs9ICQoSlBFR19JTkNMVURFUykgJChQTkdfSU5DTFVERVMpCitkd2VicF9MREFERCAgPQorZHdlYnBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCitkd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZGVjLmxhCitkd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZW5jLmxhCitkd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQorZHdlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2R3ZWJwX0xEQUREICs9JChQTkdfTElCUykgJChKUEVHX0xJQlMpCisKK2dpZjJ3ZWJwX1NPVVJDRVMgPSBnaWYyd2VicC5jIGdpZmRlYy5jIGdpZmRlYy5oCitnaWYyd2VicF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoR0lGX0lOQ0xVREVTKQorZ2lmMndlYnBfTERBREQgID0KK2dpZjJ3ZWJwX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQorZ2lmMndlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2dpZjJ3ZWJwX0xEQUREICs9IC4uL3NyYy9tdXgvbGlid2VicG11eC5sYQorZ2lmMndlYnBfTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2dpZjJ3ZWJwX0xEQUREICs9ICQoR0lGX0xJQlMpCisKK3Z3ZWJwX1NPVVJDRVMgPSB2d2VicC5jCit2d2VicF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoR0xfSU5DTFVERVMpCit2d2VicF9MREFERCAgPQordndlYnBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCit2d2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQordndlYnBfTERBREQgKz0gLi4vc3JjL2RlbXV4L2xpYndlYnBkZW11eC5sYQordndlYnBfTERBREQgKz0gJChHTF9MSUJTKQorCit3ZWJwbXV4X1NPVVJDRVMgPSB3ZWJwbXV4LmMKK3dlYnBtdXhfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQord2VicG11eF9MREFERCAgPQord2VicG11eF9MREFERCArPSBsaWJleGFtcGxlX3V0aWwubGEKK3dlYnBtdXhfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK3dlYnBtdXhfTERBREQgKz0gLi4vc3JjL211eC9saWJ3ZWJwbXV4LmxhCit3ZWJwbXV4X0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCisKK2ltZzJ3ZWJwX1NPVVJDRVMgPSBpbWcyd2VicC5jCitpbWcyd2VicF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCitpbWcyd2VicF9MREFERCAgPQoraW1nMndlYnBfTERBREQgKz0gbGliZXhhbXBsZV91dGlsLmxhCitpbWcyd2VicF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQoraW1nMndlYnBfTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWRlYy5sYQoraW1nMndlYnBfTERBREQgKz0gLi4vc3JjL211eC9saWJ3ZWJwbXV4LmxhCitpbWcyd2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQoraW1nMndlYnBfTERBREQgKz0gJChQTkdfTElCUykgJChKUEVHX0xJQlMpICQoVElGRl9MSUJTKQorCit3ZWJwaW5mb19TT1VSQ0VTID0gd2VicGluZm8uYword2VicGluZm9fQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQord2VicGluZm9fTERBREQgID0KK3dlYnBpbmZvX0xEQUREICs9IGxpYmV4YW1wbGVfdXRpbC5sYQord2VicGluZm9fTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK3dlYnBpbmZvX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIGFuaW1fZGlmZl9MREFERCArPSAuLi9zcmMvbGlid2VicGRlY29kZXIubGEKKyAgYW5pbV9kdW1wX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwZGVjb2Rlci5sYQorICB2d2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicGRlY29kZXIubGEKK2Vsc2UKKyAgYW5pbV9kaWZmX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCisgIGFuaW1fZHVtcF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorICB2d2VicF9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZGlmZi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0YTkxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fZGlmZi5jCkBAIC0wLDAgKzEsMzE0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ2hlY2tzIGlmIGdpdmVuIHBhaXIgb2YgYW5pbWF0ZWQgR0lGL1dlYlAgaW1hZ2VzIGFyZSBpZGVudGljYWw6CisvLyBUaGF0IGlzOiB0aGVpciByZWNvbnN0cnVjdGVkIGNhbnZhc2VzIG1hdGNoIHBpeGVsLWJ5LXBpeGVsIGFuZCB0aGVpciBvdGhlcgorLy8gYW5pbWF0aW9uIHByb3BlcnRpZXMgKGxvb3AgY291bnQgZXRjKSBhbHNvIG1hdGNoLgorLy8KKy8vIGV4YW1wbGU6IGFuaW1fZGlmZiBmb28uZ2lmIGJhci53ZWJwCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yICdzdHJ0b2QnLgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gZm9yICdzdHJjbXAnLgorCisjaW5jbHVkZSAiLi9hbmltX3V0aWwuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisvLyBSZXR1cm5zIHRydWUgaWYgJ2EgKyBiJyB3aWxsIG92ZXJmbG93Lgorc3RhdGljIGludCBBZGRpdGlvbldpbGxPdmVyZmxvdyhpbnQgYSwgaW50IGIpIHsKKyAgcmV0dXJuIChiID4gMCkgJiYgKGEgPiBJTlRfTUFYIC0gYik7Cit9CisKK3N0YXRpYyBpbnQgRnJhbWVzQXJlRXF1YWwoY29uc3QgdWludDhfdCogY29uc3QgcmdiYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmEyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgY29uc3QgaW50IHN0cmlkZSA9IHdpZHRoICogNDsgIC8vIEFsd2F5cyB0cnVlIGZvciAnRGVjb2RlZEZyYW1lLnJnYmEnLgorICByZXR1cm4gIW1lbWNtcChyZ2JhMSwgcmdiYTIsIHN0cmlkZSAqIGhlaWdodCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgUGl4ZWxzQXJlU2ltaWxhcih1aW50MzJfdCBzcmMsIHVpbnQzMl90IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2FsbG93ZWRfZGlmZikgeworICBjb25zdCBpbnQgc3JjX2EgPSAoc3JjID4+IDI0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfciA9IChzcmMgPj4gMTYpICYgMHhmZjsKKyAgY29uc3QgaW50IHNyY19nID0gKHNyYyA+PiA4KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfYiA9IChzcmMgPj4gMCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2EgPSAoZHN0ID4+IDI0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfciA9IChkc3QgPj4gMTYpICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9nID0gKGRzdCA+PiA4KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfYiA9IChkc3QgPj4gMCkgJiAweGZmOworCisgIHJldHVybiAoYWJzKHNyY19yICogc3JjX2EgLSBkc3RfciAqIGRzdF9hKSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpICYmCisgICAgICAgICAoYWJzKHNyY19nICogc3JjX2EgLSBkc3RfZyAqIGRzdF9hKSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpICYmCisgICAgICAgICAoYWJzKHNyY19iICogc3JjX2EgLSBkc3RfYiAqIGRzdF9hKSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpICYmCisgICAgICAgICAoYWJzKHNyY19hIC0gZHN0X2EpIDw9IG1heF9hbGxvd2VkX2RpZmYpOworfQorCitzdGF0aWMgaW50IEZyYW1lc0FyZVNpbWlsYXIoY29uc3QgdWludDhfdCogY29uc3QgcmdiYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbWF4X2FsbG93ZWRfZGlmZikgeworICBpbnQgaSwgajsKKyAgYXNzZXJ0KG1heF9hbGxvd2VkX2RpZmYgPiAwKTsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBzdHJpZGUgPSB3aWR0aCAqIDQ7CisgICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0gaiAqIHN0cmlkZSArIGk7CisgICAgICBpZiAoIVBpeGVsc0FyZVNpbWlsYXIocmdiYTFbb2Zmc2V0XSwgcmdiYTJbb2Zmc2V0XSwgbWF4X2FsbG93ZWRfZGlmZikpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCisvLyBNaW5pbWl6ZSBudW1iZXIgb2YgZnJhbWVzIGJ5IGNvbWJpbmluZyBzdWNjZXNzaXZlIGZyYW1lcyB0aGF0IGhhdmUgYXQgbWF4CisvLyAnbWF4X2RpZmYnIGRpZmZlcmVuY2UgcGVyIGNoYW5uZWwgYmV0d2VlbiBjb3JyZXNwb25kaW5nIHBpeGVscy4KK3N0YXRpYyB2b2lkIE1pbmltaXplQW5pbWF0aW9uRnJhbWVzKEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltZywgaW50IG1heF9kaWZmKSB7CisgIHVpbnQzMl90IGk7CisgIGZvciAoaSA9IDE7IGkgPCBpbWctPm51bV9mcmFtZXM7ICsraSkgeworICAgIERlY29kZWRGcmFtZSogY29uc3QgZnJhbWUxID0gJmltZy0+ZnJhbWVzW2kgLSAxXTsKKyAgICBEZWNvZGVkRnJhbWUqIGNvbnN0IGZyYW1lMiA9ICZpbWctPmZyYW1lc1tpXTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMSA9IGZyYW1lMS0+cmdiYTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2JhMiA9IGZyYW1lMi0+cmdiYTsKKyAgICBpbnQgc2hvdWxkX21lcmdlX2ZyYW1lcyA9IDA7CisgICAgLy8gSWYgbWVyZ2luZyBmcmFtZXMgd2lsbCByZXN1bHQgaW4gaW50ZWdlciBvdmVyZmxvdyBmb3IgJ2R1cmF0aW9uJywKKyAgICAvLyBza2lwIG1lcmdpbmcuCisgICAgaWYgKEFkZGl0aW9uV2lsbE92ZXJmbG93KGZyYW1lMS0+ZHVyYXRpb24sIGZyYW1lMi0+ZHVyYXRpb24pKSBjb250aW51ZTsKKyAgICBpZiAobWF4X2RpZmYgPiAwKSB7CisgICAgICBzaG91bGRfbWVyZ2VfZnJhbWVzID0gRnJhbWVzQXJlU2ltaWxhcihyZ2JhMSwgcmdiYTIsIGltZy0+Y2FudmFzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5jYW52YXNfaGVpZ2h0LCBtYXhfZGlmZik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNob3VsZF9tZXJnZV9mcmFtZXMgPQorICAgICAgICAgIEZyYW1lc0FyZUVxdWFsKHJnYmExLCByZ2JhMiwgaW1nLT5jYW52YXNfd2lkdGgsIGltZy0+Y2FudmFzX2hlaWdodCk7CisgICAgfQorICAgIGlmIChzaG91bGRfbWVyZ2VfZnJhbWVzKSB7ICAvLyBNZXJnZSAnaSsxJ3RoIGZyYW1lIGludG8gJ2kndGggZnJhbWUuCisgICAgICBmcmFtZTEtPmR1cmF0aW9uICs9IGZyYW1lMi0+ZHVyYXRpb247CisgICAgICBpZiAoaSArIDEgPCBpbWctPm51bV9mcmFtZXMpIHsKKyAgICAgICAgbWVtbW92ZSgmaW1nLT5mcmFtZXNbaV0sICZpbWctPmZyYW1lc1tpICsgMV0sCisgICAgICAgICAgICAgICAgKGltZy0+bnVtX2ZyYW1lcyAtIGkgLSAxKSAqIHNpemVvZigqaW1nLT5mcmFtZXMpKTsKKyAgICAgIH0KKyAgICAgIC0taW1nLT5udW1fZnJhbWVzOworICAgICAgLS1pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgaW50IENvbXBhcmVWYWx1ZXModWludDMyX3QgYSwgdWludDMyX3QgYiwgY29uc3QgY2hhciogb3V0cHV0X3N0cikgeworICBpZiAoYSAhPSBiKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlczogJWQgdnMgJWRcbiIsIG91dHB1dF9zdHIsIGEsIGIpOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IENvbXBhcmVCYWNrZ3JvdW5kQ29sb3IodWludDMyX3QgYmcxLCB1aW50MzJfdCBiZzIsIGludCBwcmVtdWx0aXBseSkgeworICBpZiAocHJlbXVsdGlwbHkpIHsKKyAgICBjb25zdCBpbnQgYWxwaGExID0gKGJnMSA+PiAyNCkgJiAweGZmOworICAgIGNvbnN0IGludCBhbHBoYTIgPSAoYmcyID4+IDI0KSAmIDB4ZmY7CisgICAgaWYgKGFscGhhMSA9PSAwICYmIGFscGhhMiA9PSAwKSByZXR1cm4gMTsKKyAgfQorICBpZiAoYmcxICE9IGJnMikgeworICAgIGZwcmludGYoc3RkZXJyLCAiQmFja2dyb3VuZCBjb2xvciBtaXNtYXRjaDogMHglMDh4IHZzIDB4JTA4eFxuIiwKKyAgICAgICAgICAgIGJnMSwgYmcyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gTm90ZTogQXMgbG9uZyBhcyBmcmFtZSBkdXJhdGlvbnMgYW5kIHJlY29uc3RydWN0ZWQgZnJhbWVzIGFyZSBpZGVudGljYWwsIGl0CisvLyBpcyBPSyBmb3Igb3RoZXIgYXNwZWN0cyBsaWtlIG9mZnNldHMsIGRpc3Bvc2UvYmxlbmQgbWV0aG9kIHRvIHZhcnkuCitzdGF0aWMgaW50IENvbXBhcmVBbmltYXRlZEltYWdlUGFpcihjb25zdCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1nMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVtdWx0aXBseSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5fcHNucikgeworICBpbnQgb2sgPSAxOworICBjb25zdCBpbnQgaXNfbXVsdGlfZnJhbWVfaW1hZ2UgPSAoaW1nMS0+bnVtX2ZyYW1lcyA+IDEpOworICB1aW50MzJfdCBpOworCisgIG9rID0gQ29tcGFyZVZhbHVlcyhpbWcxLT5jYW52YXNfd2lkdGgsIGltZzItPmNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICJDYW52YXMgd2lkdGggbWlzbWF0Y2giKSAmJiBvazsKKyAgb2sgPSBDb21wYXJlVmFsdWVzKGltZzEtPmNhbnZhc19oZWlnaHQsIGltZzItPmNhbnZhc19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAiQ2FudmFzIGhlaWdodCBtaXNtYXRjaCIpICYmIG9rOworICBvayA9IENvbXBhcmVWYWx1ZXMoaW1nMS0+bnVtX2ZyYW1lcywgaW1nMi0+bnVtX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICJGcmFtZSBjb3VudCBtaXNtYXRjaCIpICYmIG9rOworICBpZiAoIW9rKSByZXR1cm4gMDsgIC8vIFRoZXNlIGFyZSBmYXRhbCBmYWlsdXJlcywgY2FuJ3QgcHJvY2VlZC4KKworICBpZiAoaXNfbXVsdGlfZnJhbWVfaW1hZ2UpIHsgIC8vIENoZWNrcyByZWxldmFudCBmb3IgbXVsdGktZnJhbWUgaW1hZ2VzIG9ubHkuCisgICAgb2sgPSBDb21wYXJlVmFsdWVzKGltZzEtPmxvb3BfY291bnQsIGltZzItPmxvb3BfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICJMb29wIGNvdW50IG1pc21hdGNoIikgJiYgb2s7CisgICAgb2sgPSBDb21wYXJlQmFja2dyb3VuZENvbG9yKGltZzEtPmJnY29sb3IsIGltZzItPmJnY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZW11bHRpcGx5KSAmJiBvazsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBpbWcxLT5udW1fZnJhbWVzOyArK2kpIHsKKyAgICAvLyBQaXhlbC1ieS1waXhlbCBjb21wYXJpc29uLgorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYmExID0gaW1nMS0+ZnJhbWVzW2ldLnJnYmE7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgcmdiYTIgPSBpbWcyLT5mcmFtZXNbaV0ucmdiYTsKKyAgICBpbnQgbWF4X2RpZmY7CisgICAgZG91YmxlIHBzbnI7CisgICAgaWYgKGlzX211bHRpX2ZyYW1lX2ltYWdlKSB7ICAvLyBDaGVjayByZWxldmFudCBmb3IgbXVsdGktZnJhbWUgaW1hZ2VzIG9ubHkuCisgICAgICBjb25zdCBjaGFyIGZvcm1hdFtdID0gIkZyYW1lICMlZCwgZHVyYXRpb24gbWlzbWF0Y2giOworICAgICAgY2hhciB0bXBbc2l6ZW9mKGZvcm1hdCkgKyA4XTsKKyAgICAgIG9rID0gb2sgJiYgKHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksIGZvcm1hdCwgaSkgPj0gMCk7CisgICAgICBvayA9IG9rICYmIENvbXBhcmVWYWx1ZXMoaW1nMS0+ZnJhbWVzW2ldLmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZzItPmZyYW1lc1tpXS5kdXJhdGlvbiwgdG1wKTsKKyAgICB9CisgICAgR2V0RGlmZkFuZFBTTlIocmdiYTEsIHJnYmEyLCBpbWcxLT5jYW52YXNfd2lkdGgsIGltZzEtPmNhbnZhc19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgcHJlbXVsdGlwbHksICZtYXhfZGlmZiwgJnBzbnIpOworICAgIGlmIChtaW5fcHNuciA+IDAuKSB7CisgICAgICBpZiAocHNuciA8IG1pbl9wc25yKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRnJhbWUgIyVkLCBwc25yID0gJS4ybGYgKG1pbl9wc25yID0gJWYpXG4iLCBpLAorICAgICAgICAgICAgICAgIHBzbnIsIG1pbl9wc25yKTsKKyAgICAgICAgb2sgPSAwOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAobWF4X2RpZmYgIT0gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZyYW1lICMlZCwgbWF4IHBpeGVsIGRpZmY6ICVkXG4iLCBpLCBtYXhfZGlmZik7CisgICAgICAgIG9rID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogYW5pbV9kaWZmIDxpbWFnZTE+IDxpbWFnZTI+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG5PcHRpb25zOlxuIik7CisgIHByaW50ZigiICAtZHVtcF9mcmFtZXMgPGZvbGRlcj4gZHVtcCBkZWNvZGVkIGZyYW1lcyBpbiBQQU0gZm9ybWF0XG4iKTsKKyAgcHJpbnRmKCIgIC1taW5fcHNuciA8ZmxvYXQ+IC4uLiBtaW5pbXVtIHBlci1mcmFtZSBQU05SXG4iKTsKKyAgcHJpbnRmKCIgIC1yYXdfY29tcGFyaXNvbiAuLi4uLiBpZiB0aGlzIGZsYWcgaXMgbm90IHVzZWQsIFJHQiBpc1xuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgcHJlbXVsdGlwbGllZCBiZWZvcmUgY29tcGFyaXNvblxuIik7CisgIHByaW50ZigiICAtbWF4X2RpZmYgPGludD4gLi4uLi4gbWF4aW11bSBhbGxvd2VkIGRpZmZlcmVuY2UgcGVyIGNoYW5uZWxcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGNvcnJlc3BvbmRpbmcgcGl4ZWxzIGluIHN1YnNlcXVlbnRcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNcbiIpOworICBwcmludGYoIiAgLWggLi4uLi4uLi4uLi4uLi4uLi4uIHRoaXMgaGVscFxuIik7CisgIHByaW50ZigiICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdKSB7CisgIGludCByZXR1cm5fY29kZSA9IC0xOworICBpbnQgZHVtcF9mcmFtZXMgPSAwOworICBjb25zdCBjaGFyKiBkdW1wX2ZvbGRlciA9IE5VTEw7CisgIGRvdWJsZSBtaW5fcHNuciA9IDAuOworICBpbnQgZ290X2lucHV0MSA9IDA7CisgIGludCBnb3RfaW5wdXQyID0gMDsKKyAgaW50IHByZW11bHRpcGx5ID0gMTsKKyAgaW50IG1heF9kaWZmID0gMDsKKyAgaW50IGksIGM7CisgIGNvbnN0IGNoYXIqIGZpbGVzWzJdID0geyBOVUxMLCBOVUxMIH07CisgIEFuaW1hdGVkSW1hZ2UgaW1hZ2VzWzJdOworCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItZHVtcF9mcmFtZXMiKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgeworICAgICAgICBkdW1wX2ZyYW1lcyA9IDE7CisgICAgICAgIGR1bXBfZm9sZGVyID0gYXJndlsrK2NdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1pbl9wc25yIikpIHsKKyAgICAgIGlmIChjIDwgYXJnYyAtIDEpIHsKKyAgICAgICAgY29uc3QgY2hhciogY29uc3QgdiA9IGFyZ3ZbKytjXTsKKyAgICAgICAgY2hhciogZW5kID0gTlVMTDsKKyAgICAgICAgY29uc3QgZG91YmxlIGQgPSBzdHJ0b2QodiwgJmVuZCk7CisgICAgICAgIGlmIChlbmQgPT0gdikgeworICAgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISAnJXMnIGlzIG5vdCBhIGZsb2F0aW5nIHBvaW50IG51bWJlci5cbiIsIHYpOworICAgICAgICB9CisgICAgICAgIG1pbl9wc25yID0gZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1yYXdfY29tcGFyaXNvbiIpKSB7CisgICAgICBwcmVtdWx0aXBseSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWF4X2RpZmYiKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCB2ID0gYXJndlsrK2NdOworICAgICAgICBjaGFyKiBlbmQgPSBOVUxMOworICAgICAgICBjb25zdCBpbnQgbiA9IChpbnQpc3RydG9sKHYsICZlbmQsIDEwKTsKKyAgICAgICAgaWYgKGVuZCA9PSB2KSB7CisgICAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhICclcycgaXMgbm90IGFuIGludGVnZXIuXG4iLCB2KTsKKyAgICAgICAgfQorICAgICAgICBtYXhfZGlmZiA9IG47CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvciA9IDE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgaW50IGRlY192ZXJzaW9uLCBkZW11eF92ZXJzaW9uOworICAgICAgR2V0QW5pbWF0ZWRJbWFnZVZlcnNpb25zKCZkZWNfdmVyc2lvbiwgJmRlbXV4X3ZlcnNpb24pOworICAgICAgcHJpbnRmKCJXZWJQIERlY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbldlYlAgRGVtdXggdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKGRlY192ZXJzaW9uID4+IDE2KSAmIDB4ZmYsIChkZWNfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlY192ZXJzaW9uID4+IDApICYgMHhmZiwKKyAgICAgICAgICAgICAoZGVtdXhfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZGVtdXhfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlbXV4X3ZlcnNpb24gPj4gMCkgJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIWdvdF9pbnB1dDEpIHsKKyAgICAgICAgZmlsZXNbMF0gPSBhcmd2W2NdOworICAgICAgICBnb3RfaW5wdXQxID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoIWdvdF9pbnB1dDIpIHsKKyAgICAgICAgZmlsZXNbMV0gPSBhcmd2W2NdOworICAgICAgICBnb3RfaW5wdXQyID0gMTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcnNlX2Vycm9yID0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChhcmdjIDwgMykgeworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworCisgIGlmICghZ290X2lucHV0MikgeworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBpZiAoZHVtcF9mcmFtZXMpIHsKKyAgICBwcmludGYoIkR1bXBpbmcgZGVjb2RlZCBmcmFtZXMgaW46ICVzXG4iLCBkdW1wX2ZvbGRlcik7CisgIH0KKworICBtZW1zZXQoaW1hZ2VzLCAwLCBzaXplb2YoaW1hZ2VzKSk7CisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBwcmludGYoIkRlY29kaW5nIGZpbGU6ICVzXG4iLCBmaWxlc1tpXSk7CisgICAgaWYgKCFSZWFkQW5pbWF0ZWRJbWFnZShmaWxlc1tpXSwgJmltYWdlc1tpXSwgZHVtcF9mcmFtZXMsIGR1bXBfZm9sZGVyKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkZWNvZGluZyBmaWxlOiAlc1xuIEFib3J0aW5nLlxuIiwgZmlsZXNbaV0pOworICAgICAgcmV0dXJuX2NvZGUgPSAtMjsKKyAgICAgIGdvdG8gRW5kOworICAgIH0gZWxzZSB7CisgICAgICBNaW5pbWl6ZUFuaW1hdGlvbkZyYW1lcygmaW1hZ2VzW2ldLCBtYXhfZGlmZik7CisgICAgfQorICB9CisKKyAgaWYgKCFDb21wYXJlQW5pbWF0ZWRJbWFnZVBhaXIoJmltYWdlc1swXSwgJmltYWdlc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlbXVsdGlwbHksIG1pbl9wc25yKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiXG5GaWxlcyAlcyBhbmQgJXMgZGlmZmVyLlxuIiwgZmlsZXNbMF0sIGZpbGVzWzFdKTsKKyAgICByZXR1cm5fY29kZSA9IC0zOworICB9IGVsc2UgeworICAgIHByaW50ZigiXG5GaWxlcyAlcyBhbmQgJXMgYXJlIGlkZW50aWNhbC5cbiIsIGZpbGVzWzBdLCBmaWxlc1sxXSk7CisgICAgcmV0dXJuX2NvZGUgPSAwOworICB9CisgRW5kOgorICBDbGVhckFuaW1hdGVkSW1hZ2UoJmltYWdlc1swXSk7CisgIENsZWFyQW5pbWF0ZWRJbWFnZSgmaW1hZ2VzWzFdKTsKKyAgcmV0dXJuIHJldHVybl9jb2RlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kdW1wLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk2Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV9kdW1wLmMKQEAgLTAsMCArMSwxMTggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBEZWNvZGVzIGFuIGFuaW1hdGVkIFdlYlAgZmlsZSBhbmQgZHVtcHMgdGhlIGRlY29kZWQgZnJhbWVzIGFzIFBORyBvciBUSUZGLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gZm9yICdzdHJjbXAnLgorCisjaW5jbHVkZSAiLi9hbmltX3V0aWwuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2VfZW5jLmgiCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBfTVNDX1ZFUiA8IDE5MDAKKyNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmCisjZW5kaWYKKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IGFuaW1fZHVtcCBbb3B0aW9uc10gZmlsZXMuLi5cbiIpOworICBwcmludGYoIlxuT3B0aW9uczpcbiIpOworICBwcmludGYoIiAgLWZvbGRlciA8c3RyaW5nPiAuLi4uIGR1bXAgZm9sZGVyIChkZWZhdWx0OiAnLicpXG4iKTsKKyAgcHJpbnRmKCIgIC1wcmVmaXggPHN0cmluZz4gLi4uLiBwcmVmaXggZm9yIGR1bXBlZCBmcmFtZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZGVmYXVsdDogJ2R1bXBfJylcbiIpOworICBwcmludGYoIiAgLXRpZmYgLi4uLi4uLi4uLi4uLi4uIHNhdmUgZnJhbWVzIGFzIFRJRkZcbiIpOworICBwcmludGYoIiAgLXBhbSAuLi4uLi4uLi4uLi4uLi4uIHNhdmUgZnJhbWVzIGFzIFBBTVxuIik7CisgIHByaW50ZigiICAtaCAuLi4uLi4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgIC12ZXJzaW9uIC4uLi4uLi4uLi4uLiBwcmludCB2ZXJzaW9uIG51bWJlciBhbmQgZXhpdFxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgaW50IGVycm9yID0gMDsKKyAgY29uc3QgY2hhciogZHVtcF9mb2xkZXIgPSAiLiI7CisgIGNvbnN0IGNoYXIqIHByZWZpeCA9ICJkdW1wXyI7CisgIGNvbnN0IGNoYXIqIHN1ZmZpeCA9ICJwbmciOworICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQgPSBQTkc7CisgIGludCBjOworCisgIGlmIChhcmdjIDwgMikgeworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBmb3IgKGMgPSAxOyAhZXJyb3IgJiYgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItZm9sZGVyIikpIHsKKyAgICAgIGlmIChjICsgMSA9PSBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWlzc2luZyBhcmd1bWVudCBhZnRlciBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkdW1wX2ZvbGRlciA9IGFyZ3ZbKytjXTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmVmaXgiKSkgeworICAgICAgaWYgKGMgKyAxID09IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJtaXNzaW5nIGFyZ3VtZW50IGFmdGVyIG9wdGlvbiAnJXMnXG4iLCBhcmd2W2NdKTsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHByZWZpeCA9IGFyZ3ZbKytjXTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi10aWZmIikpIHsKKyAgICAgIGZvcm1hdCA9IFRJRkY7CisgICAgICBzdWZmaXggPSAidGlmZiI7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcGFtIikpIHsKKyAgICAgIGZvcm1hdCA9IFBBTTsKKyAgICAgIHN1ZmZpeCA9ICJwYW0iOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGludCBkZWNfdmVyc2lvbiwgZGVtdXhfdmVyc2lvbjsKKyAgICAgIEdldEFuaW1hdGVkSW1hZ2VWZXJzaW9ucygmZGVjX3ZlcnNpb24sICZkZW11eF92ZXJzaW9uKTsKKyAgICAgIHByaW50ZigiV2ViUCBEZWNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG5XZWJQIERlbXV4IHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgIChkZWNfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZGVjX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIChkZWNfdmVyc2lvbiA+PiAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgKGRlbXV4X3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGRlbXV4X3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIChkZW11eF92ZXJzaW9uID4+IDApICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyX3QgaTsKKyAgICAgIEFuaW1hdGVkSW1hZ2UgaW1hZ2U7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBmaWxlID0gYXJndltjXTsKKyAgICAgIG1lbXNldCgmaW1hZ2UsIDAsIHNpemVvZihpbWFnZSkpOworICAgICAgcHJpbnRmKCJEZWNvZGluZyBmaWxlOiAlcyBhcyAlcy8lc3h4eHguJXNcbiIsCisgICAgICAgICAgICAgZmlsZSwgZHVtcF9mb2xkZXIsIHByZWZpeCwgc3VmZml4KTsKKyAgICAgIGlmICghUmVhZEFuaW1hdGVkSW1hZ2UoZmlsZSwgJmltYWdlLCAwLCBOVUxMKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGRlY29kaW5nIGZpbGU6ICVzXG4gQWJvcnRpbmcuXG4iLCBmaWxlKTsKKyAgICAgICAgZXJyb3IgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZvciAoaSA9IDA7ICFlcnJvciAmJiBpIDwgaW1hZ2UubnVtX2ZyYW1lczsgKytpKSB7CisgICAgICAgIGNoYXIgb3V0X2ZpbGVbMTAyNF07CisgICAgICAgIFdlYlBEZWNCdWZmZXIgYnVmZmVyOworICAgICAgICBXZWJQSW5pdERlY0J1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgYnVmZmVyLmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7CisgICAgICAgIGJ1ZmZlci5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICAgICAgICBidWZmZXIud2lkdGggPSBpbWFnZS5jYW52YXNfd2lkdGg7CisgICAgICAgIGJ1ZmZlci5oZWlnaHQgPSBpbWFnZS5jYW52YXNfaGVpZ2h0OworICAgICAgICBidWZmZXIudS5SR0JBLnJnYmEgPSBpbWFnZS5mcmFtZXNbaV0ucmdiYTsKKyAgICAgICAgYnVmZmVyLnUuUkdCQS5zdHJpZGUgPSBidWZmZXIud2lkdGggKiBzaXplb2YodWludDMyX3QpOworICAgICAgICBidWZmZXIudS5SR0JBLnNpemUgPSBidWZmZXIudS5SR0JBLnN0cmlkZSAqIGJ1ZmZlci5oZWlnaHQ7CisgICAgICAgIHNucHJpbnRmKG91dF9maWxlLCBzaXplb2Yob3V0X2ZpbGUpLCAiJXMvJXMlLjRkLiVzIiwKKyAgICAgICAgICAgICAgICAgZHVtcF9mb2xkZXIsIHByZWZpeCwgaSwgc3VmZml4KTsKKyAgICAgICAgaWYgKCFXZWJQU2F2ZUltYWdlKCZidWZmZXIsIGZvcm1hdCwgb3V0X2ZpbGUpKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBzYXZpbmcgaW1hZ2UgJyVzJ1xuIiwgb3V0X2ZpbGUpOworICAgICAgICAgIGVycm9yID0gMTsKKyAgICAgICAgfQorICAgICAgICBXZWJQRnJlZURlY0J1ZmZlcigmYnVmZmVyKTsKKyAgICAgIH0KKyAgICAgIENsZWFyQW5pbWF0ZWRJbWFnZSgmaW1hZ2UpOworICAgIH0KKyAgfQorICByZXR1cm4gZXJyb3IgPyAxIDogMDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhMDVjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2FuaW1fdXRpbC5jCkBAIC0wLDAgKzEsNzk0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBhbmltYXRlZCBpbWFnZXMKKworI2luY2x1ZGUgIi4vYW5pbV91dGlsLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0dJRikKKyNpbmNsdWRlIDxnaWZfbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJ3ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZGVtdXguaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPCAxOTAwCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBpbnQga051bUNoYW5uZWxzID0gNDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbW1vbiB1dGlsaXRpZXMuCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9HSUYpCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZyYW1lIGNvdmVycyB0aGUgZnVsbCBjYW52YXMuCitzdGF0aWMgaW50IElzRnVsbEZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc193aWR0aCwgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgcmV0dXJuICh3aWR0aCA9PSBjYW52YXNfd2lkdGggJiYgaGVpZ2h0ID09IGNhbnZhc19oZWlnaHQpOworfQorI2VuZGlmIC8vIFdFQlBfSEFWRV9HSUYKKworc3RhdGljIGludCBDaGVja1NpemVGb3JPdmVyZmxvdyh1aW50NjRfdCBzaXplKSB7CisgIHJldHVybiAoc2l6ZSA9PSAoc2l6ZV90KXNpemUpOworfQorCitzdGF0aWMgaW50IEFsbG9jYXRlRnJhbWVzKEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLCB1aW50MzJfdCBudW1fZnJhbWVzKSB7CisgIHVpbnQzMl90IGk7CisgIHVpbnQ4X3QqIG1lbSA9IE5VTEw7CisgIERlY29kZWRGcmFtZSogZnJhbWVzID0gTlVMTDsKKyAgY29uc3QgdWludDY0X3QgcmdiYV9zaXplID0KKyAgICAgICh1aW50NjRfdClpbWFnZS0+Y2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzICogaW1hZ2UtPmNhbnZhc19oZWlnaHQ7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSAodWludDY0X3QpbnVtX2ZyYW1lcyAqIHJnYmFfc2l6ZSAqIHNpemVvZigqbWVtKTsKKyAgY29uc3QgdWludDY0X3QgdG90YWxfZnJhbWVfc2l6ZSA9ICh1aW50NjRfdCludW1fZnJhbWVzICogc2l6ZW9mKCpmcmFtZXMpOworICBpZiAoIUNoZWNrU2l6ZUZvck92ZXJmbG93KHRvdGFsX3NpemUpIHx8CisgICAgICAhQ2hlY2tTaXplRm9yT3ZlcmZsb3codG90YWxfZnJhbWVfc2l6ZSkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBtZW0gPSAodWludDhfdCopbWFsbG9jKChzaXplX3QpdG90YWxfc2l6ZSk7CisgIGZyYW1lcyA9IChEZWNvZGVkRnJhbWUqKW1hbGxvYygoc2l6ZV90KXRvdGFsX2ZyYW1lX3NpemUpOworCisgIGlmIChtZW0gPT0gTlVMTCB8fCBmcmFtZXMgPT0gTlVMTCkgeworICAgIGZyZWUobWVtKTsKKyAgICBmcmVlKGZyYW1lcyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZnJlZShpbWFnZS0+cmF3X21lbSk7CisgIGltYWdlLT5udW1fZnJhbWVzID0gbnVtX2ZyYW1lczsKKyAgaW1hZ2UtPmZyYW1lcyA9IGZyYW1lczsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9mcmFtZXM7ICsraSkgeworICAgIGZyYW1lc1tpXS5yZ2JhID0gbWVtICsgaSAqIHJnYmFfc2l6ZTsKKyAgICBmcmFtZXNbaV0uZHVyYXRpb24gPSAwOworICAgIGZyYW1lc1tpXS5pc19rZXlfZnJhbWUgPSAwOworICB9CisgIGltYWdlLT5yYXdfbWVtID0gbWVtOworICByZXR1cm4gMTsKK30KKwordm9pZCBDbGVhckFuaW1hdGVkSW1hZ2UoQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UpIHsKKyAgaWYgKGltYWdlICE9IE5VTEwpIHsKKyAgICBmcmVlKGltYWdlLT5yYXdfbWVtKTsKKyAgICBmcmVlKGltYWdlLT5mcmFtZXMpOworICAgIGltYWdlLT5udW1fZnJhbWVzID0gMDsKKyAgICBpbWFnZS0+ZnJhbWVzID0gTlVMTDsKKyAgICBpbWFnZS0+cmF3X21lbSA9IE5VTEw7CisgIH0KK30KKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0dJRikKKy8vIENsZWFyIHRoZSBjYW52YXMgdG8gdHJhbnNwYXJlbnQuCitzdGF0aWMgdm9pZCBaZXJvRmlsbENhbnZhcyh1aW50OF90KiByZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FudmFzX3dpZHRoLCB1aW50MzJfdCBjYW52YXNfaGVpZ2h0KSB7CisgIG1lbXNldChyZ2JhLCAwLCBjYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHMgKiBjYW52YXNfaGVpZ2h0KTsKK30KKworLy8gQ2xlYXIgZ2l2ZW4gZnJhbWUgcmVjdGFuZ2xlIHRvIHRyYW5zcGFyZW50Lgorc3RhdGljIHZvaWQgWmVyb0ZpbGxGcmFtZVJlY3QodWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlLCBpbnQgeF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9vZmZzZXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBpbnQgajsKKyAgYXNzZXJ0KHdpZHRoICoga051bUNoYW5uZWxzIDw9IHJnYmFfc3RyaWRlKTsKKyAgcmdiYSArPSB5X29mZnNldCAqIHJnYmFfc3RyaWRlICsgeF9vZmZzZXQgKiBrTnVtQ2hhbm5lbHM7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIG1lbXNldChyZ2JhLCAwLCB3aWR0aCAqIGtOdW1DaGFubmVscyk7CisgICAgcmdiYSArPSByZ2JhX3N0cmlkZTsKKyAgfQorfQorCisvLyBDb3B5IHdpZHRoICogaGVpZ2h0IHBpeGVscyBmcm9tICdzcmMnIHRvICdkc3QnLgorc3RhdGljIHZvaWQgQ29weUNhbnZhcyhjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoICoga051bUNoYW5uZWxzICogaGVpZ2h0KTsKK30KKworLy8gQ29weSBwaXhlbHMgaW4gdGhlIGdpdmVuIHJlY3RhbmdsZSBmcm9tICdzcmMnIHRvICdkc3QnIGhvbm9yaW5nIHRoZSAnc3RyaWRlJy4KK3N0YXRpYyB2b2lkIENvcHlGcmFtZVJlY3RhbmdsZShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9vZmZzZXQsIGludCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IGo7CisgIGNvbnN0IGludCB3aWR0aF9pbl9ieXRlcyA9IHdpZHRoICoga051bUNoYW5uZWxzOworICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0geV9vZmZzZXQgKiBzdHJpZGUgKyB4X29mZnNldCAqIGtOdW1DaGFubmVsczsKKyAgYXNzZXJ0KHdpZHRoX2luX2J5dGVzIDw9IHN0cmlkZSk7CisgIHNyYyArPSBvZmZzZXQ7CisgIGRzdCArPSBvZmZzZXQ7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGhfaW5fYnl0ZXMpOworICAgIHNyYyArPSBzdHJpZGU7CisgICAgZHN0ICs9IHN0cmlkZTsKKyAgfQorfQorI2VuZGlmIC8vIFdFQlBfSEFWRV9HSUYKKworLy8gQ2Fub25pY2FsaXplIGFsbCB0cmFuc3BhcmVudCBwaXhlbHMgdG8gdHJhbnNwYXJlbnQgYmxhY2sgdG8gYWlkIGNvbXBhcmlzb24uCitzdGF0aWMgdm9pZCBDbGVhbnVwVHJhbnNwYXJlbnRQaXhlbHModWludDMyX3QqIHJnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgcmdiYV9lbmQgPSByZ2JhICsgd2lkdGggKiBoZWlnaHQ7CisgIHdoaWxlIChyZ2JhIDwgcmdiYV9lbmQpIHsKKyAgICBjb25zdCB1aW50OF90IGFscGhhID0gKCpyZ2JhID4+IDI0KSAmIDB4ZmY7CisgICAgaWYgKGFscGhhID09IDApIHsKKyAgICAgICpyZ2JhID0gMDsKKyAgICB9CisgICAgKytyZ2JhOworICB9Cit9CisKKy8vIER1bXAgZnJhbWUgdG8gYSBQQU0gZmlsZS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitzdGF0aWMgaW50IER1bXBGcmFtZShjb25zdCBjaGFyIGZpbGVuYW1lW10sIGNvbnN0IGNoYXIgZHVtcF9mb2xkZXJbXSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lX251bSwgY29uc3QgdWludDhfdCByZ2JhW10sCisgICAgICAgICAgICAgICAgICAgICBpbnQgY2FudmFzX3dpZHRoLCBpbnQgY2FudmFzX2hlaWdodCkgeworICBpbnQgb2sgPSAwOworICBzaXplX3QgbWF4X2xlbjsKKyAgaW50IHk7CisgIGNvbnN0IGNoYXIqIGJhc2VfbmFtZSA9IE5VTEw7CisgIGNoYXIqIGZpbGVfbmFtZSA9IE5VTEw7CisgIEZJTEUqIGYgPSBOVUxMOworICBjb25zdCBjaGFyKiByb3c7CisKKyAgaWYgKGR1bXBfZm9sZGVyID09IE5VTEwpIGR1bXBfZm9sZGVyID0gIi4iOworCisgIGJhc2VfbmFtZSA9IHN0cnJjaHIoZmlsZW5hbWUsICcvJyk7CisgIGJhc2VfbmFtZSA9IChiYXNlX25hbWUgPT0gTlVMTCkgPyBmaWxlbmFtZSA6IGJhc2VfbmFtZSArIDE7CisgIG1heF9sZW4gPSBzdHJsZW4oZHVtcF9mb2xkZXIpICsgMSArIHN0cmxlbihiYXNlX25hbWUpCisgICAgICAgICAgKyBzdHJsZW4oIl9mcmFtZV8iKSArIHN0cmxlbigiLnBhbSIpICsgODsKKyAgZmlsZV9uYW1lID0gKGNoYXIqKW1hbGxvYyhtYXhfbGVuICogc2l6ZW9mKCpmaWxlX25hbWUpKTsKKyAgaWYgKGZpbGVfbmFtZSA9PSBOVUxMKSBnb3RvIEVuZDsKKworICBpZiAoc25wcmludGYoZmlsZV9uYW1lLCBtYXhfbGVuLCAiJXMvJXNfZnJhbWVfJWQucGFtIiwKKyAgICAgICAgICAgICAgIGR1bXBfZm9sZGVyLCBiYXNlX25hbWUsIGZyYW1lX251bSkgPCAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBnZW5lcmF0aW5nIGZpbGUgbmFtZVxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICBmID0gZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKKyAgaWYgKGYgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBmaWxlIGZvciB3cml0aW5nOiAlc1xuIiwgZmlsZV9uYW1lKTsKKyAgICBvayA9IDA7CisgICAgZ290byBFbmQ7CisgIH0KKyAgaWYgKGZwcmludGYoZiwgIlA3XG5XSURUSCAlZFxuSEVJR0hUICVkXG4iCisgICAgICAgICAgICAgICJERVBUSCA0XG5NQVhWQUwgMjU1XG5UVVBMVFlQRSBSR0JfQUxQSEFcbkVOREhEUlxuIiwKKyAgICAgICAgICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KSA8IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldyaXRlIGVycm9yIGZvciBmaWxlICVzXG4iLCBmaWxlX25hbWUpOworICAgIGdvdG8gRW5kOworICB9CisgIHJvdyA9IChjb25zdCBjaGFyKilyZ2JhOworICBmb3IgKHkgPSAwOyB5IDwgY2FudmFzX2hlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShyb3csIGNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVscywgMSwgZikgIT0gMSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIHRvIGZpbGU6ICVzXG4iLCBmaWxlX25hbWUpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICAgIHJvdyArPSBjYW52YXNfd2lkdGggKiBrTnVtQ2hhbm5lbHM7CisgIH0KKyAgb2sgPSAxOworIEVuZDoKKyAgaWYgKGYgIT0gTlVMTCkgZmNsb3NlKGYpOworICBmcmVlKGZpbGVfbmFtZSk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlAgRGVjb2RpbmcuCisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgdmFsaWQgV2ViUCBiaXRzdHJlYW0uCitzdGF0aWMgaW50IElzV2ViUChjb25zdCBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKSB7CisgIHJldHVybiAoV2ViUEdldEluZm8od2VicF9kYXRhLT5ieXRlcywgd2VicF9kYXRhLT5zaXplLCBOVUxMLCBOVUxMKSAhPSAwKTsKK30KKworLy8gUmVhZCBhbmltYXRlZCBXZWJQIGJpdHN0cmVhbSAnd2VicF9kYXRhJyBpbnRvICdBbmltYXRlZEltYWdlJyBzdHJ1Y3QuCitzdGF0aWMgaW50IFJlYWRBbmltYXRlZFdlYlAoY29uc3QgY2hhciBmaWxlbmFtZVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UsIGludCBkdW1wX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyIGR1bXBfZm9sZGVyW10pIHsKKyAgaW50IG9rID0gMDsKKyAgaW50IGR1bXBfb2sgPSAxOworICB1aW50MzJfdCBmcmFtZV9pbmRleCA9IDA7CisgIGludCBwcmV2X2ZyYW1lX3RpbWVzdGFtcCA9IDA7CisgIFdlYlBBbmltRGVjb2RlciogZGVjOworICBXZWJQQW5pbUluZm8gYW5pbV9pbmZvOworCisgIG1lbXNldChpbWFnZSwgMCwgc2l6ZW9mKCppbWFnZSkpOworCisgIGRlYyA9IFdlYlBBbmltRGVjb2Rlck5ldyh3ZWJwX2RhdGEsIE5VTEwpOworICBpZiAoZGVjID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHBhcnNpbmcgaW1hZ2U6ICVzXG4iLCBmaWxlbmFtZSk7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoIVdlYlBBbmltRGVjb2RlckdldEluZm8oZGVjLCAmYW5pbV9pbmZvKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZ2V0dGluZyBnbG9iYWwgaW5mbyBhYm91dCB0aGUgYW5pbWF0aW9uXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIEFuaW1hdGlvbiBwcm9wZXJ0aWVzLgorICBpbWFnZS0+Y2FudmFzX3dpZHRoID0gYW5pbV9pbmZvLmNhbnZhc193aWR0aDsKKyAgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPSBhbmltX2luZm8uY2FudmFzX2hlaWdodDsKKyAgaW1hZ2UtPmxvb3BfY291bnQgPSBhbmltX2luZm8ubG9vcF9jb3VudDsKKyAgaW1hZ2UtPmJnY29sb3IgPSBhbmltX2luZm8uYmdjb2xvcjsKKworICAvLyBBbGxvY2F0ZSBmcmFtZXMuCisgIGlmICghQWxsb2NhdGVGcmFtZXMoaW1hZ2UsIGFuaW1faW5mby5mcmFtZV9jb3VudCkpIHJldHVybiAwOworCisgIC8vIERlY29kZSBmcmFtZXMuCisgIHdoaWxlIChXZWJQQW5pbURlY29kZXJIYXNNb3JlRnJhbWVzKGRlYykpIHsKKyAgICBEZWNvZGVkRnJhbWUqIGN1cnJfZnJhbWU7CisgICAgdWludDhfdCogY3Vycl9yZ2JhOworICAgIHVpbnQ4X3QqIGZyYW1lX3JnYmE7CisgICAgaW50IHRpbWVzdGFtcDsKKworICAgIGlmICghV2ViUEFuaW1EZWNvZGVyR2V0TmV4dChkZWMsICZmcmFtZV9yZ2JhLCAmdGltZXN0YW1wKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkZWNvZGluZyBmcmFtZSAjJXVcbiIsIGZyYW1lX2luZGV4KTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBhc3NlcnQoZnJhbWVfaW5kZXggPCBhbmltX2luZm8uZnJhbWVfY291bnQpOworICAgIGN1cnJfZnJhbWUgPSAmaW1hZ2UtPmZyYW1lc1tmcmFtZV9pbmRleF07CisgICAgY3Vycl9yZ2JhID0gY3Vycl9mcmFtZS0+cmdiYTsKKyAgICBjdXJyX2ZyYW1lLT5kdXJhdGlvbiA9IHRpbWVzdGFtcCAtIHByZXZfZnJhbWVfdGltZXN0YW1wOworICAgIGN1cnJfZnJhbWUtPmlzX2tleV9mcmFtZSA9IDA7ICAvLyBVbnVzZWQuCisgICAgbWVtY3B5KGN1cnJfcmdiYSwgZnJhbWVfcmdiYSwKKyAgICAgICAgICAgaW1hZ2UtPmNhbnZhc193aWR0aCAqIGtOdW1DaGFubmVscyAqIGltYWdlLT5jYW52YXNfaGVpZ2h0KTsKKworICAgIC8vIE5lZWRlZCBvbmx5IGJlY2F1c2Ugd2UgbWF5IHdhbnQgdG8gY29tcGFyZSB3aXRoIEdJRiBsYXRlci4KKyAgICBDbGVhbnVwVHJhbnNwYXJlbnRQaXhlbHMoKHVpbnQzMl90KiljdXJyX3JnYmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5jYW52YXNfd2lkdGgsIGltYWdlLT5jYW52YXNfaGVpZ2h0KTsKKworICAgIGlmIChkdW1wX2ZyYW1lcyAmJiBkdW1wX29rKSB7CisgICAgICBkdW1wX29rID0gRHVtcEZyYW1lKGZpbGVuYW1lLCBkdW1wX2ZvbGRlciwgZnJhbWVfaW5kZXgsIGN1cnJfcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmNhbnZhc193aWR0aCwgaW1hZ2UtPmNhbnZhc19oZWlnaHQpOworICAgICAgaWYgKCFkdW1wX29rKSB7ICAvLyBQcmludCBlcnJvciBvbmNlLCBidXQgY29udGludWUgZGVjb2RlIGxvb3AuCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVtcGluZyBmcmFtZXMgdG8gJXNcbiIsIGR1bXBfZm9sZGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICArK2ZyYW1lX2luZGV4OworICAgIHByZXZfZnJhbWVfdGltZXN0YW1wID0gdGltZXN0YW1wOworICB9CisgIG9rID0gZHVtcF9vazsKKworIEVuZDoKKyAgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKGRlYyk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdJRiBEZWNvZGluZy4KKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0dJRikKKworLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBHSUYgYml0c3RyZWFtLgorc3RhdGljIGludCBJc0dJRihjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSkgeworICByZXR1cm4gZGF0YS0+c2l6ZSA+IEdJRl9TVEFNUF9MRU4gJiYKKyAgICAgICAgICghbWVtY21wKEdJRl9TVEFNUCwgZGF0YS0+Ynl0ZXMsIEdJRl9TVEFNUF9MRU4pIHx8CisgICAgICAgICAgIW1lbWNtcChHSUY4N19TVEFNUCwgZGF0YS0+Ynl0ZXMsIEdJRl9TVEFNUF9MRU4pIHx8CisgICAgICAgICAgIW1lbWNtcChHSUY4OV9TVEFNUCwgZGF0YS0+Ynl0ZXMsIEdJRl9TVEFNUF9MRU4pKTsKK30KKworLy8gR0lGTElCX01BSk9SIGlzIG9ubHkgZGVmaW5lZCBpbiBsaWJnaWYgPj0gNC4yLjAuCisjaWYgZGVmaW5lZChHSUZMSUJfTUFKT1IpICYmIGRlZmluZWQoR0lGTElCX01JTk9SKQorIyBkZWZpbmUgTE9DQUxfR0lGX1ZFUlNJT04gKChHSUZMSUJfTUFKT1IgPDwgOCkgfCBHSUZMSUJfTUlOT1IpCisjIGRlZmluZSBMT0NBTF9HSUZfUFJFUkVRKG1haiwgbWluKSBcCisgICAgKExPQ0FMX0dJRl9WRVJTSU9OID49ICgoKG1haikgPDwgOCkgfCAobWluKSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfR0lGX1ZFUlNJT04gMAorIyBkZWZpbmUgTE9DQUxfR0lGX1BSRVJFUShtYWosIG1pbikgMAorI2VuZGlmCisKKyNpZiAhTE9DQUxfR0lGX1BSRVJFUSg1LCAwKQorCisvLyBBZGRlZCBpbiB2NS4wCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBEaXNwb3NhbE1vZGU7CisjZGVmaW5lIERJU1BPU0FMX1VOU1BFQ0lGSUVEICAgICAgMCAgICAgICAvLyBObyBkaXNwb3NhbCBzcGVjaWZpZWQKKyNkZWZpbmUgRElTUE9TRV9ET19OT1QgICAgICAgICAgICAxICAgICAgIC8vIExlYXZlIGltYWdlIGluIHBsYWNlCisjZGVmaW5lIERJU1BPU0VfQkFDS0dST1VORCAgICAgICAgMiAgICAgICAvLyBTZXQgYXJlYSB0byBiYWNrZ3JvdW5kIGNvbG9yCisjZGVmaW5lIERJU1BPU0VfUFJFVklPVVMgICAgICAgICAgMyAgICAgICAvLyBSZXN0b3JlIHRvIHByZXZpb3VzIGNvbnRlbnQKKyAgaW50IFVzZXJJbnB1dEZsYWc7ICAgICAgIC8vIFVzZXIgY29uZmlybWF0aW9uIHJlcXVpcmVkIGJlZm9yZSBkaXNwb3NhbAorICBpbnQgRGVsYXlUaW1lOyAgICAgICAgICAgLy8gUHJlLWRpc3BsYXkgZGVsYXkgaW4gMC4wMXNlYyB1bml0cworICBpbnQgVHJhbnNwYXJlbnRDb2xvcjsgICAgLy8gUGFsZXR0ZSBpbmRleCBmb3IgdHJhbnNwYXJlbmN5LCAtMSBpZiBub25lCisjZGVmaW5lIE5PX1RSQU5TUEFSRU5UX0NPTE9SICAgICAtMQorfSBHcmFwaGljc0NvbnRyb2xCbG9jazsKKworc3RhdGljIGludCBER2lmRXh0ZW5zaW9uVG9HQ0IoY29uc3Qgc2l6ZV90IEdpZkV4dGVuc2lvbkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdpZkJ5dGVUeXBlKiBHaWZFeHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRyb2xCbG9jayogZ2NiKSB7CisgIGlmIChHaWZFeHRlbnNpb25MZW5ndGggIT0gNCkgeworICAgIHJldHVybiBHSUZfRVJST1I7CisgIH0KKyAgZ2NiLT5EaXNwb3NhbE1vZGUgPSAoR2lmRXh0ZW5zaW9uWzBdID4+IDIpICYgMHgwNzsKKyAgZ2NiLT5Vc2VySW5wdXRGbGFnID0gKEdpZkV4dGVuc2lvblswXSAmIDB4MDIpICE9IDA7CisgIGdjYi0+RGVsYXlUaW1lID0gR2lmRXh0ZW5zaW9uWzFdIHwgKEdpZkV4dGVuc2lvblsyXSA8PCA4KTsKKyAgaWYgKEdpZkV4dGVuc2lvblswXSAmIDB4MDEpIHsKKyAgICBnY2ItPlRyYW5zcGFyZW50Q29sb3IgPSAoaW50KUdpZkV4dGVuc2lvblszXTsKKyAgfSBlbHNlIHsKKyAgICBnY2ItPlRyYW5zcGFyZW50Q29sb3IgPSBOT19UUkFOU1BBUkVOVF9DT0xPUjsKKyAgfQorICByZXR1cm4gR0lGX09LOworfQorCitzdGF0aWMgaW50IERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKEdpZkZpbGVUeXBlKiBHaWZGaWxlLCBpbnQgSW1hZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250cm9sQmxvY2sqIGdjYikgeworICBpbnQgaTsKKyAgaWYgKEltYWdlSW5kZXggPCAwIHx8IEltYWdlSW5kZXggPiBHaWZGaWxlLT5JbWFnZUNvdW50IC0gMSkgeworICAgIHJldHVybiBHSUZfRVJST1I7CisgIH0KKyAgZ2NiLT5EaXNwb3NhbE1vZGUgPSBESVNQT1NBTF9VTlNQRUNJRklFRDsKKyAgZ2NiLT5Vc2VySW5wdXRGbGFnID0gMDsKKyAgZ2NiLT5EZWxheVRpbWUgPSAwOworICBnY2ItPlRyYW5zcGFyZW50Q29sb3IgPSBOT19UUkFOU1BBUkVOVF9DT0xPUjsKKworICBmb3IgKGkgPSAwOyBpIDwgR2lmRmlsZS0+U2F2ZWRJbWFnZXNbSW1hZ2VJbmRleF0uRXh0ZW5zaW9uQmxvY2tDb3VudDsgaSsrKSB7CisgICAgRXh0ZW5zaW9uQmxvY2sqIGVwID0gJkdpZkZpbGUtPlNhdmVkSW1hZ2VzW0ltYWdlSW5kZXhdLkV4dGVuc2lvbkJsb2Nrc1tpXTsKKyAgICBpZiAoZXAtPkZ1bmN0aW9uID09IEdSQVBISUNTX0VYVF9GVU5DX0NPREUpIHsKKyAgICAgIHJldHVybiBER2lmRXh0ZW5zaW9uVG9HQ0IoCisgICAgICAgICAgZXAtPkJ5dGVDb3VudCwgKGNvbnN0IEdpZkJ5dGVUeXBlKillcC0+Qnl0ZXMsIGdjYik7CisgICAgfQorICB9CisgIHJldHVybiBHSUZfRVJST1I7Cit9CisKKyNkZWZpbmUgQ09OVElOVUVfRVhUX0ZVTkNfQ09ERSAweDAwCisKKy8vIFNpZ25hdHVyZSB3YXMgY2hhbmdlZCBpbiB2NS4wCisjZGVmaW5lIERHaWZPcGVuRmlsZU5hbWUoYSwgYikgREdpZk9wZW5GaWxlTmFtZShhKQorCisjZW5kaWYgIC8vICFMT0NBTF9HSUZfUFJFUkVRKDUsIDApCisKKy8vIFNpZ25hdHVyZSBjaGFuZ2VkIGluIHY1LjEKKyNpZiAhTE9DQUxfR0lGX1BSRVJFUSg1LCAxKQorI2RlZmluZSBER2lmQ2xvc2VGaWxlKGEsIGIpIERHaWZDbG9zZUZpbGUoYSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBHSUZEaXNwbGF5RXJyb3IoY29uc3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgaW50IGdpZl9lcnJvcikgeworICAvLyBsaWJnaWYgNC4yLjAgaGFzIHJldGlyZWQgUHJpbnRHaWZFcnJvcigpIGFuZCBhZGRlZCBHaWZFcnJvclN0cmluZygpLgorI2lmIExPQ0FMX0dJRl9QUkVSRVEoNCwgMikKKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDUsIDApCisgIGNvbnN0IGNoYXIqIGVycm9yX3N0ciA9CisgICAgICBHaWZFcnJvclN0cmluZygoZ2lmID09IE5VTEwpID8gZ2lmX2Vycm9yIDogZ2lmLT5FcnJvcik7CisjZWxzZQorICBjb25zdCBjaGFyKiBlcnJvcl9zdHIgPSBHaWZFcnJvclN0cmluZygpOworICAodm9pZClnaWY7CisjZW5kaWYKKyAgaWYgKGVycm9yX3N0ciA9PSBOVUxMKSBlcnJvcl9zdHIgPSAiVW5rbm93biBlcnJvciI7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGTGliIEVycm9yICVkOiAlc1xuIiwgZ2lmX2Vycm9yLCBlcnJvcl9zdHIpOworI2Vsc2UKKyAgKHZvaWQpZ2lmOworICBmcHJpbnRmKHN0ZGVyciwgIkdJRkxpYiBFcnJvciAlZDogIiwgZ2lmX2Vycm9yKTsKKyAgUHJpbnRHaWZFcnJvcigpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKK30KKworc3RhdGljIGludCBJc0tleUZyYW1lR0lGKGNvbnN0IEdpZkltYWdlRGVzYyogcHJldl9kZXNjLCBpbnQgcHJldl9kaXNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY29kZWRGcmFtZSogY29uc3QgcHJldl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FudmFzX3dpZHRoLCBpbnQgY2FudmFzX2hlaWdodCkgeworICBpZiAocHJldl9mcmFtZSA9PSBOVUxMKSByZXR1cm4gMTsKKyAgaWYgKHByZXZfZGlzcG9zZSA9PSBESVNQT1NFX0JBQ0tHUk9VTkQpIHsKKyAgICBpZiAoSXNGdWxsRnJhbWUocHJldl9kZXNjLT5XaWR0aCwgcHJldl9kZXNjLT5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCkpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAocHJldl9mcmFtZS0+aXNfa2V5X2ZyYW1lKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBHZXRUcmFuc3BhcmVudEluZGV4R0lGKEdpZkZpbGVUeXBlKiBnaWYpIHsKKyAgR3JhcGhpY3NDb250cm9sQmxvY2sgZmlyc3RfZ2NiOworICBtZW1zZXQoJmZpcnN0X2djYiwgMCwgc2l6ZW9mKGZpcnN0X2djYikpOworICBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihnaWYsIDAsICZmaXJzdF9nY2IpOworICByZXR1cm4gZmlyc3RfZ2NiLlRyYW5zcGFyZW50Q29sb3I7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBHZXRCYWNrZ3JvdW5kQ29sb3JHSUYoR2lmRmlsZVR5cGUqIGdpZikgeworICBjb25zdCBpbnQgdHJhbnNwYXJlbnRfaW5kZXggPSBHZXRUcmFuc3BhcmVudEluZGV4R0lGKGdpZik7CisgIGNvbnN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjb2xvcl9tYXAgPSBnaWYtPlNDb2xvck1hcDsKKyAgaWYgKHRyYW5zcGFyZW50X2luZGV4ICE9IE5PX1RSQU5TUEFSRU5UX0NPTE9SICYmCisgICAgICBnaWYtPlNCYWNrR3JvdW5kQ29sb3IgPT0gdHJhbnNwYXJlbnRfaW5kZXgpIHsKKyAgICByZXR1cm4gMHgwMDAwMDAwMDsgIC8vIFNwZWNpYWwgY2FzZTogdHJhbnNwYXJlbnQgYmxhY2suCisgIH0gZWxzZSBpZiAoY29sb3JfbWFwID09IE5VTEwgfHwgY29sb3JfbWFwLT5Db2xvcnMgPT0gTlVMTAorICAgICAgICAgICAgIHx8IGdpZi0+U0JhY2tHcm91bmRDb2xvciA+PSBjb2xvcl9tYXAtPkNvbG9yQ291bnQpIHsKKyAgICByZXR1cm4gMHhmZmZmZmZmZjsgIC8vIEludmFsaWQ6IGFzc3VtZSB3aGl0ZS4KKyAgfSBlbHNlIHsKKyAgICBjb25zdCBHaWZDb2xvclR5cGUgY29sb3IgPSBjb2xvcl9tYXAtPkNvbG9yc1tnaWYtPlNCYWNrR3JvdW5kQ29sb3JdOworICAgIHJldHVybiAoMHhmZiA8PCAyNCkgfAorICAgICAgICAgICAoY29sb3IuUmVkIDw8IDE2KSB8CisgICAgICAgICAgIChjb2xvci5HcmVlbiA8PCA4KSB8CisgICAgICAgICAgIChjb2xvci5CbHVlIDw8IDApOworICB9Cit9CisKKy8vIEZpbmQgYXBwcm9wcmlhdGUgYXBwIGV4dGVuc2lvbiBhbmQgZ2V0IGxvb3AgY291bnQgZnJvbSB0aGUgbmV4dCBleHRlbnNpb24uCisvLyBXZSB1c2UgQ2hyb21lJ3MgaW50ZXJwcmV0YXRpb24gb2YgdGhlICdsb29wX2NvdW50JyBzZW1hbnRpY3M6CisvLyAgIGlmIG5vdCBwcmVzZW50IC0+IGxvb3Agb25jZQorLy8gICBpZiBwcmVzZW50IGFuZCBsb29wX2NvdW50ID09IDAsIHJldHVybiAwICgnaW5maW5pdGUnKS4KKy8vICAgaWYgcHJlc2VudCBhbmQgbG9vcF9jb3VudCAhPSAwLCBpdCdzIHRoZSBudW1iZXIgb2YgKmV4dHJhKiBsb29wcworLy8gICAgIHNvIHdlIG5lZWQgdG8gcmV0dXJuIGxvb3BfY291bnQgKyAxIGFzIHRvdGFsIGxvb3AgbnVtYmVyLgorc3RhdGljIHVpbnQzMl90IEdldExvb3BDb3VudEdJRihjb25zdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgZ2lmLT5JbWFnZUNvdW50OyArK2kpIHsKKyAgICBjb25zdCBTYXZlZEltYWdlKiBjb25zdCBpbWFnZSA9ICZnaWYtPlNhdmVkSW1hZ2VzW2ldOworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IChqICsgMSkgPCBpbWFnZS0+RXh0ZW5zaW9uQmxvY2tDb3VudDsgKytqKSB7CisgICAgICBjb25zdCBFeHRlbnNpb25CbG9jayogY29uc3QgZWIxID0gaW1hZ2UtPkV4dGVuc2lvbkJsb2NrcyArIGo7CisgICAgICBjb25zdCBFeHRlbnNpb25CbG9jayogY29uc3QgZWIyID0gaW1hZ2UtPkV4dGVuc2lvbkJsb2NrcyArIGogKyAxOworICAgICAgY29uc3QgY2hhciogY29uc3Qgc2lnbmF0dXJlID0gKGNvbnN0IGNoYXIqKWViMS0+Qnl0ZXM7CisgICAgICBjb25zdCBpbnQgc2lnbmF0dXJlX2lzX29rID0KKyAgICAgICAgICAoZWIxLT5GdW5jdGlvbiA9PSBBUFBMSUNBVElPTl9FWFRfRlVOQ19DT0RFKSAmJgorICAgICAgICAgIChlYjEtPkJ5dGVDb3VudCA9PSAxMSkgJiYKKyAgICAgICAgICAoIW1lbWNtcChzaWduYXR1cmUsICJORVRTQ0FQRTIuMCIsIDExKSB8fAorICAgICAgICAgICAhbWVtY21wKHNpZ25hdHVyZSwgIkFOSU1FWFRTMS4wIiwgMTEpKTsKKyAgICAgIGlmIChzaWduYXR1cmVfaXNfb2sgJiYKKyAgICAgICAgICBlYjItPkZ1bmN0aW9uID09IENPTlRJTlVFX0VYVF9GVU5DX0NPREUgJiYgZWIyLT5CeXRlQ291bnQgPj0gMyAmJgorICAgICAgICAgIGViMi0+Qnl0ZXNbMF0gPT0gMSkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBleHRyYV9sb29wID0gKCh1aW50MzJfdCkoZWIyLT5CeXRlc1syXSkgPDwgOCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1aW50MzJfdCkoZWIyLT5CeXRlc1sxXSkgPDwgMCk7CisgICAgICAgIHJldHVybiAoZXh0cmFfbG9vcCA+IDApID8gZXh0cmFfbG9vcCArIDEgOiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsgIC8vIERlZmF1bHQuCit9CisKKy8vIEdldCBkdXJhdGlvbiBvZiAnbid0aCBmcmFtZSBpbiBtaWxsaXNlY29uZHMuCitzdGF0aWMgaW50IEdldEZyYW1lRHVyYXRpb25HSUYoR2lmRmlsZVR5cGUqIGdpZiwgaW50IG4pIHsKKyAgR3JhcGhpY3NDb250cm9sQmxvY2sgZ2NiOworICBtZW1zZXQoJmdjYiwgMCwgc2l6ZW9mKGdjYikpOworICBER2lmU2F2ZWRFeHRlbnNpb25Ub0dDQihnaWYsIG4sICZnY2IpOworICByZXR1cm4gZ2NiLkRlbGF5VGltZSAqIDEwOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgZnJhbWUgJ3RhcmdldCcgY29tcGxldGVseSBjb3ZlcnMgJ2NvdmVyZWQnLgorc3RhdGljIGludCBDb3ZlcnNGcmFtZUdJRihjb25zdCBHaWZJbWFnZURlc2MqIGNvbnN0IHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2lmSW1hZ2VEZXNjKiBjb25zdCBjb3ZlcmVkKSB7CisgIHJldHVybiB0YXJnZXQtPkxlZnQgPD0gY292ZXJlZC0+TGVmdCAmJgorICAgICAgICAgY292ZXJlZC0+TGVmdCArIGNvdmVyZWQtPldpZHRoIDw9IHRhcmdldC0+TGVmdCArIHRhcmdldC0+V2lkdGggJiYKKyAgICAgICAgIHRhcmdldC0+VG9wIDw9IGNvdmVyZWQtPlRvcCAmJgorICAgICAgICAgY292ZXJlZC0+VG9wICsgY292ZXJlZC0+SGVpZ2h0IDw9IHRhcmdldC0+VG9wICsgdGFyZ2V0LT5IZWlnaHQ7Cit9CisKK3N0YXRpYyB2b2lkIFJlbWFwUGl4ZWxzR0lGKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYW5zcGFyZW50X2NvbG9yLCBpbnQgbGVuLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGlmIChzcmNbaV0gIT0gdHJhbnNwYXJlbnRfY29sb3IpIHsKKyAgICAgIC8vIElmIGEgcGl4ZWwgaW4gdGhlIGN1cnJlbnQgZnJhbWUgaXMgdHJhbnNwYXJlbnQsIHdlIGRvbid0IG1vZGlmeSBpdCwgc28KKyAgICAgIC8vIHRoYXQgd2UgY2FuIHNlZS10aHJvdWdoIHRoZSBjb3JyZXNwb25kaW5nIHBpeGVsIGZyb20gYW4gZWFybGllciBmcmFtZS4KKyAgICAgIGNvbnN0IEdpZkNvbG9yVHlwZSBjID0gY21hcC0+Q29sb3JzW3NyY1tpXV07CisgICAgICBkc3RbNCAqIGkgKyAwXSA9IGMuUmVkOworICAgICAgZHN0WzQgKiBpICsgMV0gPSBjLkdyZWVuOworICAgICAgZHN0WzQgKiBpICsgMl0gPSBjLkJsdWU7CisgICAgICBkc3RbNCAqIGkgKyAzXSA9IDB4ZmY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgUmVhZEZyYW1lR0lGKGNvbnN0IFNhdmVkSW1hZ2UqIGNvbnN0IGdpZl9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbG9yTWFwT2JqZWN0KiBjbWFwLCBpbnQgdHJhbnNwYXJlbnRfY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0X3N0cmlkZSwgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IEdpZkltYWdlRGVzYyogaW1hZ2VfZGVzYyA9ICZnaWZfaW1hZ2UtPkltYWdlRGVzYzsKKyAgY29uc3QgdWludDhfdCogaW47CisgIHVpbnQ4X3QqIG91dDsKKyAgaW50IGo7CisKKyAgaWYgKGltYWdlX2Rlc2MtPkNvbG9yTWFwKSBjbWFwID0gaW1hZ2VfZGVzYy0+Q29sb3JNYXA7CisKKyAgaWYgKGNtYXAgPT0gTlVMTCB8fCBjbWFwLT5Db2xvckNvdW50ICE9ICgxIDw8IGNtYXAtPkJpdHNQZXJQaXhlbCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlBvdGVudGlhbGx5IGNvcnJ1cHQgY29sb3IgbWFwLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpbiA9IChjb25zdCB1aW50OF90KilnaWZfaW1hZ2UtPlJhc3RlckJpdHM7CisgIG91dCA9IGRzdCArIGltYWdlX2Rlc2MtPlRvcCAqIG91dF9zdHJpZGUgKyBpbWFnZV9kZXNjLT5MZWZ0ICoga051bUNoYW5uZWxzOworCisgIGZvciAoaiA9IDA7IGogPCBpbWFnZV9kZXNjLT5IZWlnaHQ7ICsraikgeworICAgIFJlbWFwUGl4ZWxzR0lGKGluLCBjbWFwLCB0cmFuc3BhcmVudF9jb2xvciwgaW1hZ2VfZGVzYy0+V2lkdGgsIG91dCk7CisgICAgaW4gKz0gaW1hZ2VfZGVzYy0+V2lkdGg7CisgICAgb3V0ICs9IG91dF9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJlYWQgYW5pbWF0ZWQgR0lGIGJpdHN0cmVhbSBmcm9tICdmaWxlbmFtZScgaW50byAnQW5pbWF0ZWRJbWFnZScgc3RydWN0Lgorc3RhdGljIGludCBSZWFkQW5pbWF0ZWRHSUYoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdW1wX2ZyYW1lcywgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdKSB7CisgIHVpbnQzMl90IGZyYW1lX2NvdW50OworICB1aW50MzJfdCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQ7CisgIHVpbnQzMl90IGk7CisgIGludCBnaWZfZXJyb3I7CisgIEdpZkZpbGVUeXBlKiBnaWY7CisKKyAgZ2lmID0gREdpZk9wZW5GaWxlTmFtZShmaWxlbmFtZSwgTlVMTCk7CisgIGlmIChnaWYgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHJlYWQgZmlsZTogJXMuXG4iLCBmaWxlbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBnaWZfZXJyb3IgPSBER2lmU2x1cnAoZ2lmKTsKKyAgaWYgKGdpZl9lcnJvciAhPSBHSUZfT0spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBwYXJzZSBpbWFnZTogJXMuXG4iLCBmaWxlbmFtZSk7CisgICAgR0lGRGlzcGxheUVycm9yKGdpZiwgZ2lmX2Vycm9yKTsKKyAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBBbmltYXRpb24gcHJvcGVydGllcy4KKyAgaW1hZ2UtPmNhbnZhc193aWR0aCA9ICh1aW50MzJfdClnaWYtPlNXaWR0aDsKKyAgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPSAodWludDMyX3QpZ2lmLT5TSGVpZ2h0OworICBpZiAoaW1hZ2UtPmNhbnZhc193aWR0aCA+IE1BWF9DQU5WQVNfU0laRSB8fAorICAgICAgaW1hZ2UtPmNhbnZhc19oZWlnaHQgPiBNQVhfQ0FOVkFTX1NJWkUpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgY2FudmFzIGRpbWVuc2lvbjogJWQgeCAlZFxuIiwKKyAgICAgICAgICAgIGltYWdlLT5jYW52YXNfd2lkdGgsIGltYWdlLT5jYW52YXNfaGVpZ2h0KTsKKyAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW1hZ2UtPmxvb3BfY291bnQgPSBHZXRMb29wQ291bnRHSUYoZ2lmKTsKKyAgaW1hZ2UtPmJnY29sb3IgPSBHZXRCYWNrZ3JvdW5kQ29sb3JHSUYoZ2lmKTsKKworICBmcmFtZV9jb3VudCA9ICh1aW50MzJfdClnaWYtPkltYWdlQ291bnQ7CisgIGlmIChmcmFtZV9jb3VudCA9PSAwKSB7CisgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKGltYWdlLT5jYW52YXNfd2lkdGggPT0gMCB8fCBpbWFnZS0+Y2FudmFzX2hlaWdodCA9PSAwKSB7CisgICAgaW1hZ2UtPmNhbnZhc193aWR0aCA9IGdpZi0+U2F2ZWRJbWFnZXNbMF0uSW1hZ2VEZXNjLldpZHRoOworICAgIGltYWdlLT5jYW52YXNfaGVpZ2h0ID0gZ2lmLT5TYXZlZEltYWdlc1swXS5JbWFnZURlc2MuSGVpZ2h0OworICAgIGdpZi0+U2F2ZWRJbWFnZXNbMF0uSW1hZ2VEZXNjLkxlZnQgPSAwOworICAgIGdpZi0+U2F2ZWRJbWFnZXNbMF0uSW1hZ2VEZXNjLlRvcCA9IDA7CisgICAgaWYgKGltYWdlLT5jYW52YXNfd2lkdGggPT0gMCB8fCBpbWFnZS0+Y2FudmFzX2hlaWdodCA9PSAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgY2FudmFzIHNpemUgaW4gR0lGLlxuIik7CisgICAgICBER2lmQ2xvc2VGaWxlKGdpZiwgTlVMTCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgLy8gQWxsb2NhdGUgZnJhbWVzLgorICBBbGxvY2F0ZUZyYW1lcyhpbWFnZSwgZnJhbWVfY291bnQpOworCisgIGNhbnZhc193aWR0aCA9IGltYWdlLT5jYW52YXNfd2lkdGg7CisgIGNhbnZhc19oZWlnaHQgPSBpbWFnZS0+Y2FudmFzX2hlaWdodDsKKworICAvLyBEZWNvZGUgYW5kIHJlY29uc3RydWN0IGZyYW1lcy4KKyAgZm9yIChpID0gMDsgaSA8IGZyYW1lX2NvdW50OyArK2kpIHsKKyAgICBjb25zdCBpbnQgY2FudmFzX3dpZHRoX2luX2J5dGVzID0gY2FudmFzX3dpZHRoICoga051bUNoYW5uZWxzOworICAgIGNvbnN0IFNhdmVkSW1hZ2UqIGNvbnN0IGN1cnJfZ2lmX2ltYWdlID0gJmdpZi0+U2F2ZWRJbWFnZXNbaV07CisgICAgR3JhcGhpY3NDb250cm9sQmxvY2sgY3Vycl9nY2I7CisgICAgRGVjb2RlZEZyYW1lKiBjdXJyX2ZyYW1lOworICAgIHVpbnQ4X3QqIGN1cnJfcmdiYTsKKworICAgIG1lbXNldCgmY3Vycl9nY2IsIDAsIHNpemVvZihjdXJyX2djYikpOworICAgIERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKGdpZiwgaSwgJmN1cnJfZ2NiKTsKKworICAgIGN1cnJfZnJhbWUgPSAmaW1hZ2UtPmZyYW1lc1tpXTsKKyAgICBjdXJyX3JnYmEgPSBjdXJyX2ZyYW1lLT5yZ2JhOworICAgIGN1cnJfZnJhbWUtPmR1cmF0aW9uID0gR2V0RnJhbWVEdXJhdGlvbkdJRihnaWYsIGkpOworICAgIC8vIEZvcmNlIGZyYW1lcyB3aXRoIGEgc21hbGwgb3Igbm8gZHVyYXRpb24gdG8gMTAwbXMgdG8gYmUgY29uc2lzdGVudAorICAgIC8vIHdpdGggd2ViIGJyb3dzZXJzIGFuZCBvdGhlciB0cmFuc2NvZGluZyB0b29scyAobGlrZSBnaWYyd2VicCBpdHNlbGYpLgorICAgIGlmIChjdXJyX2ZyYW1lLT5kdXJhdGlvbiA8PSAxMCkgY3Vycl9mcmFtZS0+ZHVyYXRpb24gPSAxMDA7CisKKyAgICBpZiAoaSA9PSAwKSB7ICAvLyBJbml0aWFsaXplIGFzIHRyYW5zcGFyZW50LgorICAgICAgY3Vycl9mcmFtZS0+aXNfa2V5X2ZyYW1lID0gMTsKKyAgICAgIFplcm9GaWxsQ2FudmFzKGN1cnJfcmdiYSwgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgRGVjb2RlZEZyYW1lKiBjb25zdCBwcmV2X2ZyYW1lID0gJmltYWdlLT5mcmFtZXNbaSAtIDFdOworICAgICAgY29uc3QgR2lmSW1hZ2VEZXNjKiBjb25zdCBwcmV2X2Rlc2MgPSAmZ2lmLT5TYXZlZEltYWdlc1tpIC0gMV0uSW1hZ2VEZXNjOworICAgICAgR3JhcGhpY3NDb250cm9sQmxvY2sgcHJldl9nY2I7CisgICAgICBtZW1zZXQoJnByZXZfZ2NiLCAwLCBzaXplb2YocHJldl9nY2IpKTsKKyAgICAgIERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKGdpZiwgaSAtIDEsICZwcmV2X2djYik7CisKKyAgICAgIGN1cnJfZnJhbWUtPmlzX2tleV9mcmFtZSA9CisgICAgICAgICAgSXNLZXlGcmFtZUdJRihwcmV2X2Rlc2MsIHByZXZfZ2NiLkRpc3Bvc2FsTW9kZSwgcHJldl9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCk7CisKKyAgICAgIGlmIChjdXJyX2ZyYW1lLT5pc19rZXlfZnJhbWUpIHsgIC8vIEluaXRpYWxpemUgYXMgdHJhbnNwYXJlbnQuCisgICAgICAgIFplcm9GaWxsQ2FudmFzKGN1cnJfcmdiYSwgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBwcmV2X2ZyYW1lX2Rpc3Bvc2VkLCBjdXJyX2ZyYW1lX29wYXF1ZTsKKyAgICAgICAgaW50IHByZXZfZnJhbWVfY29tcGxldGVseV9jb3ZlcmVkOworICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggcHJldmlvdXMgY2FudmFzLgorICAgICAgICB1aW50OF90KiBjb25zdCBwcmV2X3JnYmEgPSBpbWFnZS0+ZnJhbWVzW2kgLSAxXS5yZ2JhOworICAgICAgICBDb3B5Q2FudmFzKHByZXZfcmdiYSwgY3Vycl9yZ2JhLCBjYW52YXNfd2lkdGgsIGNhbnZhc19oZWlnaHQpOworCisgICAgICAgIC8vIERpc3Bvc2UgcHJldmlvdXMgZnJhbWUgcmVjdGFuZ2xlLgorICAgICAgICBwcmV2X2ZyYW1lX2Rpc3Bvc2VkID0KKyAgICAgICAgICAgIChwcmV2X2djYi5EaXNwb3NhbE1vZGUgPT0gRElTUE9TRV9CQUNLR1JPVU5EIHx8CisgICAgICAgICAgICAgcHJldl9nY2IuRGlzcG9zYWxNb2RlID09IERJU1BPU0VfUFJFVklPVVMpOworICAgICAgICBjdXJyX2ZyYW1lX29wYXF1ZSA9CisgICAgICAgICAgICAoY3Vycl9nY2IuVHJhbnNwYXJlbnRDb2xvciA9PSBOT19UUkFOU1BBUkVOVF9DT0xPUik7CisgICAgICAgIHByZXZfZnJhbWVfY29tcGxldGVseV9jb3ZlcmVkID0KKyAgICAgICAgICAgIGN1cnJfZnJhbWVfb3BhcXVlICYmCisgICAgICAgICAgICBDb3ZlcnNGcmFtZUdJRigmY3Vycl9naWZfaW1hZ2UtPkltYWdlRGVzYywgcHJldl9kZXNjKTsKKworICAgICAgICBpZiAocHJldl9mcmFtZV9kaXNwb3NlZCAmJiAhcHJldl9mcmFtZV9jb21wbGV0ZWx5X2NvdmVyZWQpIHsKKyAgICAgICAgICBzd2l0Y2ggKHByZXZfZ2NiLkRpc3Bvc2FsTW9kZSkgeworICAgICAgICAgICAgY2FzZSBESVNQT1NFX0JBQ0tHUk9VTkQ6IHsKKyAgICAgICAgICAgICAgWmVyb0ZpbGxGcmFtZVJlY3QoY3Vycl9yZ2JhLCBjYW52YXNfd2lkdGhfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+TGVmdCwgcHJldl9kZXNjLT5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+V2lkdGgsIHByZXZfZGVzYy0+SGVpZ2h0KTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIERJU1BPU0VfUFJFVklPVVM6IHsKKyAgICAgICAgICAgICAgaW50IHNyY19mcmFtZV9udW0gPSBpIC0gMjsKKyAgICAgICAgICAgICAgd2hpbGUgKHNyY19mcmFtZV9udW0gPj0gMCkgeworICAgICAgICAgICAgICAgIEdyYXBoaWNzQ29udHJvbEJsb2NrIHNyY19mcmFtZV9nY2I7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZzcmNfZnJhbWVfZ2NiLCAwLCBzaXplb2Yoc3JjX2ZyYW1lX2djYikpOworICAgICAgICAgICAgICAgIERHaWZTYXZlZEV4dGVuc2lvblRvR0NCKGdpZiwgc3JjX2ZyYW1lX251bSwgJnNyY19mcmFtZV9nY2IpOworICAgICAgICAgICAgICAgIGlmIChzcmNfZnJhbWVfZ2NiLkRpc3Bvc2FsTW9kZSAhPSBESVNQT1NFX1BSRVZJT1VTKSBicmVhazsKKyAgICAgICAgICAgICAgICAtLXNyY19mcmFtZV9udW07CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgaWYgKHNyY19mcmFtZV9udW0gPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgcGl4ZWxzIGluc2lkZSBwcmV2aW91cyBmcmFtZSByZWN0YW5nbGUgdG8KKyAgICAgICAgICAgICAgICAvLyBjb3JyZXNwb25kaW5nIHBpeGVscyBpbiBzb3VyY2UgY2FudmFzLgorICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHNyY19mcmFtZV9yZ2JhID0KKyAgICAgICAgICAgICAgICAgICAgaW1hZ2UtPmZyYW1lc1tzcmNfZnJhbWVfbnVtXS5yZ2JhOworICAgICAgICAgICAgICAgIENvcHlGcmFtZVJlY3RhbmdsZShzcmNfZnJhbWVfcmdiYSwgY3Vycl9yZ2JhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW52YXNfd2lkdGhfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+TGVmdCwgcHJldl9kZXNjLT5Ub3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZGVzYy0+V2lkdGgsIHByZXZfZGVzYy0+SGVpZ2h0KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBTb3VyY2UgY2FudmFzIGRvZXNuJ3QgZXhpc3QuIFNvIGNsZWFyIHByZXZpb3VzIGZyYW1lCisgICAgICAgICAgICAgICAgLy8gcmVjdGFuZ2xlIHRvIGJhY2tncm91bmQuCisgICAgICAgICAgICAgICAgWmVyb0ZpbGxGcmFtZVJlY3QoY3Vycl9yZ2JhLCBjYW52YXNfd2lkdGhfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl9kZXNjLT5MZWZ0LCBwcmV2X2Rlc2MtPlRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2Rlc2MtPldpZHRoLCBwcmV2X2Rlc2MtPkhlaWdodCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBicmVhazsgIC8vIE5vdGhpbmcgdG8gZG8uCisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgLy8gRGVjb2RlIGN1cnJlbnQgZnJhbWUuCisgICAgaWYgKCFSZWFkRnJhbWVHSUYoY3Vycl9naWZfaW1hZ2UsIGdpZi0+U0NvbG9yTWFwLCBjdXJyX2djYi5UcmFuc3BhcmVudENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aF9pbl9ieXRlcywgY3Vycl9yZ2JhKSkgeworICAgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKGR1bXBfZnJhbWVzKSB7CisgICAgICBpZiAoIUR1bXBGcmFtZShmaWxlbmFtZSwgZHVtcF9mb2xkZXIsIGksIGN1cnJfcmdiYSwKKyAgICAgICAgICAgICAgICAgICAgIGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodCkpIHsKKyAgICAgICAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgREdpZkNsb3NlRmlsZShnaWYsIE5VTEwpOworICByZXR1cm4gMTsKK30KKworI2Vsc2UKKworc3RhdGljIGludCBJc0dJRihjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSkgeworICAodm9pZClkYXRhOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBSZWFkQW5pbWF0ZWRHSUYoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBBbmltYXRlZEltYWdlKiBjb25zdCBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdW1wX2ZyYW1lcywgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdKSB7CisgICh2b2lkKWZpbGVuYW1lOworICAodm9pZClpbWFnZTsKKyAgKHZvaWQpZHVtcF9mcmFtZXM7CisgICh2b2lkKWR1bXBfZm9sZGVyOworICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYmdpZi1kZXYgIgorICAgICAgICAgICJwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBXRUJQX0hBVkVfR0lGCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBSZWFkQW5pbWF0ZWRJbWFnZShjb25zdCBjaGFyIGZpbGVuYW1lW10sIEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBkdW1wX2ZyYW1lcywgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdKSB7CisgIGludCBvayA9IDA7CisgIFdlYlBEYXRhIHdlYnBfZGF0YTsKKworICBXZWJQRGF0YUluaXQoJndlYnBfZGF0YSk7CisgIG1lbXNldChpbWFnZSwgMCwgc2l6ZW9mKCppbWFnZSkpOworCisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZ3ZWJwX2RhdGEuYnl0ZXMsICZ3ZWJwX2RhdGEuc2l6ZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHJlYWRpbmcgZmlsZTogJXNcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChJc1dlYlAoJndlYnBfZGF0YSkpIHsKKyAgICBvayA9IFJlYWRBbmltYXRlZFdlYlAoZmlsZW5hbWUsICZ3ZWJwX2RhdGEsIGltYWdlLCBkdW1wX2ZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHVtcF9mb2xkZXIpOworICB9IGVsc2UgaWYgKElzR0lGKCZ3ZWJwX2RhdGEpKSB7CisgICAgb2sgPSBSZWFkQW5pbWF0ZWRHSUYoZmlsZW5hbWUsIGltYWdlLCBkdW1wX2ZyYW1lcywgZHVtcF9mb2xkZXIpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIlVua25vd24gZmlsZSB0eXBlOiAlcy4gU3VwcG9ydGVkIGZpbGUgdHlwZXMgYXJlIFdlYlAgYW5kIEdJRlxuIiwKKyAgICAgICAgICAgIGZpbGVuYW1lKTsKKyAgICBvayA9IDA7CisgIH0KKyAgaWYgKCFvaykgQ2xlYXJBbmltYXRlZEltYWdlKGltYWdlKTsKKyAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBBY2N1bXVsYXRlKGRvdWJsZSB2MSwgZG91YmxlIHYyLCBkb3VibGUqIGNvbnN0IG1heF9kaWZmLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGNvbnN0IHNzZSkgeworICBjb25zdCBkb3VibGUgZGlmZiA9IGZhYnModjEgLSB2Mik7CisgIGlmIChkaWZmID4gKm1heF9kaWZmKSAqbWF4X2RpZmYgPSBkaWZmOworICAqc3NlICs9IGRpZmYgKiBkaWZmOworfQorCit2b2lkIEdldERpZmZBbmRQU05SKGNvbnN0IHVpbnQ4X3QgcmdiYTFbXSwgY29uc3QgdWludDhfdCByZ2JhMltdLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgcHJlbXVsdGlwbHksCisgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbWF4X2RpZmYsIGRvdWJsZSogY29uc3QgcHNucikgeworICBjb25zdCB1aW50MzJfdCBzdHJpZGUgPSB3aWR0aCAqIGtOdW1DaGFubmVsczsKKyAgY29uc3QgaW50IGtBbHBoYUNoYW5uZWwgPSBrTnVtQ2hhbm5lbHMgLSAxOworICBkb3VibGUgZl9tYXhfZGlmZiA9IDAuOworICBkb3VibGUgc3NlID0gMC47CisgIHVpbnQzMl90IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCBzdHJpZGU7IHggKz0ga051bUNoYW5uZWxzKSB7CisgICAgICBpbnQgazsKKyAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQgPSAoc2l6ZV90KXkgKiBzdHJpZGUgKyB4OworICAgICAgY29uc3QgaW50IGFscGhhMSA9IHJnYmExW29mZnNldCArIGtBbHBoYUNoYW5uZWxdOworICAgICAgY29uc3QgaW50IGFscGhhMiA9IHJnYmEyW29mZnNldCArIGtBbHBoYUNoYW5uZWxdOworICAgICAgQWNjdW11bGF0ZShhbHBoYTEsIGFscGhhMiwgJmZfbWF4X2RpZmYsICZzc2UpOworICAgICAgaWYgKCFwcmVtdWx0aXBseSkgeworICAgICAgICBmb3IgKGsgPSAwOyBrIDwga0FscGhhQ2hhbm5lbDsgKytrKSB7CisgICAgICAgICAgQWNjdW11bGF0ZShyZ2JhMVtvZmZzZXQgKyBrXSwgcmdiYTJbb2Zmc2V0ICsga10sICZmX21heF9kaWZmLCAmc3NlKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcHJlbXVsdGlwbHkgUi9HL0IgY2hhbm5lbHMgd2l0aCBhbHBoYSB2YWx1ZQorICAgICAgICBmb3IgKGsgPSAwOyBrIDwga0FscGhhQ2hhbm5lbDsgKytrKSB7CisgICAgICAgICAgQWNjdW11bGF0ZShyZ2JhMVtvZmZzZXQgKyBrXSAqIGFscGhhMSAvIDI1NS4sCisgICAgICAgICAgICAgICAgICAgICByZ2JhMltvZmZzZXQgKyBrXSAqIGFscGhhMiAvIDI1NS4sCisgICAgICAgICAgICAgICAgICAgICAmZl9tYXhfZGlmZiwgJnNzZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgKm1heF9kaWZmID0gKGludClmX21heF9kaWZmOworICBpZiAoKm1heF9kaWZmID09IDApIHsKKyAgICAqcHNuciA9IDk5LjsgIC8vIFBTTlIgd2hlbiBpbWFnZXMgYXJlIGlkZW50aWNhbC4KKyAgfSBlbHNlIHsKKyAgICBzc2UgLz0gc3RyaWRlICogaGVpZ2h0OworICAgICpwc25yID0gNC4zNDI5NDQ4ICogbG9nKDI1NS4gKiAyNTUuIC8gc3NlKTsKKyAgfQorfQorCit2b2lkIEdldEFuaW1hdGVkSW1hZ2VWZXJzaW9ucyhpbnQqIGNvbnN0IGRlY29kZXJfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZGVtdXhfdmVyc2lvbikgeworICAqZGVjb2Rlcl92ZXJzaW9uID0gV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgICpkZW11eF92ZXJzaW9uID0gV2ViUEdldERlbXV4VmVyc2lvbigpOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9hbmltX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDYzMTIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvYW5pbV91dGlsLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgYW5pbWF0ZWQgaW1hZ2VzCisKKyNpZm5kZWYgV0VCUF9FWEFNUExFU19BTklNX1VUSUxfSF8KKyNkZWZpbmUgV0VCUF9FWEFNUExFU19BTklNX1VUSUxfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90KiByZ2JhOyAgICAgICAgIC8vIERlY29kZWQgYW5kIHJlY29uc3RydWN0ZWQgZnVsbCBmcmFtZS4KKyAgaW50IGR1cmF0aW9uOyAgICAgICAgICAvLyBGcmFtZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCisgIGludCBpc19rZXlfZnJhbWU7ICAgICAgLy8gVHJ1ZSBpZiB0aGlzIGZyYW1lIGlzIGEga2V5LWZyYW1lLgorfSBEZWNvZGVkRnJhbWU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgY2FudmFzX3dpZHRoOworICB1aW50MzJfdCBjYW52YXNfaGVpZ2h0OworICB1aW50MzJfdCBiZ2NvbG9yOworICB1aW50MzJfdCBsb29wX2NvdW50OworICBEZWNvZGVkRnJhbWUqIGZyYW1lczsKKyAgdWludDMyX3QgbnVtX2ZyYW1lczsKKyAgdm9pZCogcmF3X21lbTsKK30gQW5pbWF0ZWRJbWFnZTsKKworLy8gRGVhbGxvY2F0ZSBldmVyeXRoaW5nIGluICdpbWFnZScgKGJ1dCBub3QgdGhlIG9iamVjdCBpdHNlbGYpLgordm9pZCBDbGVhckFuaW1hdGVkSW1hZ2UoQW5pbWF0ZWRJbWFnZSogY29uc3QgaW1hZ2UpOworCisvLyBSZWFkIGFuaW1hdGVkIGltYWdlIGZpbGUgaW50byAnQW5pbWF0ZWRJbWFnZScgc3RydWN0LgorLy8gSWYgJ2R1bXBfZnJhbWVzJyBpcyB0cnVlLCBkdW1wIGZyYW1lcyB0byAnZHVtcF9mb2xkZXInLgorLy8gUHJldmlvdXMgY29udGVudCBvZiAnaW1hZ2UnIGlzIG9ibGl0ZXJhdGVkLgorLy8gVXBvbiBzdWNjZXNzZnVsIHJldHVybiwgY29udGVudCBvZiAnaW1hZ2UnIG11c3QgYmUgZGVsZXRlZCBieQorLy8gY2FsbGluZyAnQ2xlYXJBbmltYXRlZEltYWdlJy4KK2ludCBSZWFkQW5pbWF0ZWRJbWFnZShjb25zdCBjaGFyIGZpbGVuYW1lW10sIEFuaW1hdGVkSW1hZ2UqIGNvbnN0IGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBkdW1wX2ZyYW1lcywgY29uc3QgY2hhciBkdW1wX2ZvbGRlcltdKTsKKworLy8gR2l2ZW4gdHdvIFJHQkEgYnVmZmVycywgY2FsY3VsYXRlIG1heCBwaXhlbCBkaWZmZXJlbmNlIGFuZCBQU05SLgorLy8gSWYgJ3ByZW11bHRpcGx5JyBpcyB0cnVlLCBSL0cvQiB2YWx1ZXMgd2lsbCBiZSBwcmUtbXVsdGlwbGllZCBieSB0aGUKKy8vIHRyYW5zcGFyZW5jeSBiZWZvcmUgY29tcGFyaXNvbi4KK3ZvaWQgR2V0RGlmZkFuZFBTTlIoY29uc3QgdWludDhfdCByZ2JhMVtdLCBjb25zdCB1aW50OF90IHJnYmEyW10sCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBwcmVtdWx0aXBseSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBtYXhfZGlmZiwgZG91YmxlKiBjb25zdCBwc25yKTsKKworLy8gUmV0dXJuIGxpYnJhcnkgdmVyc2lvbnMgdXNlZCBieSBhbmltX3V0aWwuCit2b2lkIEdldEFuaW1hdGVkSW1hZ2VWZXJzaW9ucyhpbnQqIGNvbnN0IGRlY29kZXJfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZGVtdXhfdmVyc2lvbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VYQU1QTEVTX0FOSU1fVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvY3dlYnAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2N3ZWJwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU3MTkwYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2N3ZWJwLmMKQEAgLTAsMCArMSwxMTMxIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIHNpbXBsZSBjb21tYW5kIGxpbmUgY2FsbGluZyB0aGUgV2ViUEVuY29kZSBmdW5jdGlvbi4KKy8vICBFbmNvZGVzIGEgcmF3IC5ZVVYgaW50byBXZWJQIGJpdHN0cmVhbQorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2VfZGVjLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL3N0b3B3YXRjaC5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKyNpZm5kZWYgV0VCUF9ETEwKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQqIFZQOEdldENQVUluZm87ICAgLy8gb3BhcXVlIGZvcndhcmQgZGVjbGFyYXRpb24uCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKyNlbmRpZiAgLy8gV0VCUF9ETEwKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCB2ZXJib3NlID0gMDsKKworc3RhdGljIGludCBSZWFkWVVWKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBjb25zdCBpbnQgdXNlX2FyZ2IgPSBwaWMtPnVzZV9hcmdiOworICBjb25zdCBpbnQgdXZfd2lkdGggPSAocGljLT53aWR0aCArIDEpIC8gMjsKKyAgY29uc3QgaW50IHV2X2hlaWdodCA9IChwaWMtPmhlaWdodCArIDEpIC8gMjsKKyAgY29uc3QgaW50IHlfcGxhbmVfc2l6ZSA9IHBpYy0+d2lkdGggKiBwaWMtPmhlaWdodDsKKyAgY29uc3QgaW50IHV2X3BsYW5lX3NpemUgPSB1dl93aWR0aCAqIHV2X2hlaWdodDsKKyAgY29uc3Qgc2l6ZV90IGV4cGVjdGVkX2RhdGFfc2l6ZSA9IHlfcGxhbmVfc2l6ZSArIDIgKiB1dl9wbGFuZV9zaXplOworCisgIGlmIChkYXRhX3NpemUgIT0gZXhwZWN0ZWRfZGF0YV9zaXplKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiaW5wdXQgZGF0YSBkb2Vzbid0IGhhdmUgdGhlIGV4cGVjdGVkIHNpemUgKCVkIGluc3RlYWQgb2YgJWQpXG4iLAorICAgICAgICAgICAgKGludClkYXRhX3NpemUsIChpbnQpZXhwZWN0ZWRfZGF0YV9zaXplKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHBpYy0+dXNlX2FyZ2IgPSAwOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljKSkgcmV0dXJuIDA7CisgIEltZ0lvVXRpbENvcHlQbGFuZShkYXRhLCBwaWMtPndpZHRoLCBwaWMtPnksIHBpYy0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgIEltZ0lvVXRpbENvcHlQbGFuZShkYXRhICsgeV9wbGFuZV9zaXplLCB1dl93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIHBpYy0+dSwgcGljLT51dl9zdHJpZGUsIHV2X3dpZHRoLCB1dl9oZWlnaHQpOworICBJbWdJb1V0aWxDb3B5UGxhbmUoZGF0YSArIHlfcGxhbmVfc2l6ZSArIHV2X3BsYW5lX3NpemUsIHV2X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgcGljLT52LCBwaWMtPnV2X3N0cmlkZSwgdXZfd2lkdGgsIHV2X2hlaWdodCk7CisgIHJldHVybiB1c2VfYXJnYiA/IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihwaWMpIDogMTsKK30KKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorCitzdGF0aWMgaW50IFJlYWRQaWN0dXJlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgaWYgKHBpYy0+d2lkdGggIT0gMCAmJiBwaWMtPmhlaWdodCAhPSAwKSB7CisgICAgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICAgIG9rID0gb2sgJiYgUmVhZFlVVihkYXRhLCBkYXRhX3NpemUsIHBpYyk7CisgIH0gZWxzZSB7CisgICAgLy8gSWYgbm8gc2l6ZSBzcGVjaWZpZWQsIHRyeSB0byBkZWNvZGUgaXQgdXNpbmcgV0lDLgorICAgIG9rID0gUmVhZFBpY3R1cmVXaXRoV0lDKGZpbGVuYW1lLCBwaWMsIGtlZXBfYWxwaGEsIG1ldGFkYXRhKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgICAgICBvayA9IG9rICYmIFJlYWRXZWJQKGRhdGEsIGRhdGFfc2l6ZSwgcGljLCBrZWVwX2FscGhhLCBtZXRhZGF0YSk7CisgICAgfQorICB9CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDb3VsZCBub3QgcHJvY2VzcyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgIH0KKyAgZnJlZSgodm9pZCopZGF0YSk7CisgIHJldHVybiBvazsKK30KKworI2Vsc2UgIC8vICFIQVZFX1dJTkNPREVDX0gKKworc3RhdGljIGludCBSZWFkUGljdHVyZShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgIGludCBvayA9IDA7CisKKyAgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICBpZiAoIW9rKSBnb3RvIEVuZDsKKworICBpZiAocGljLT53aWR0aCA9PSAwIHx8IHBpYy0+aGVpZ2h0ID09IDApIHsKKyAgICBXZWJQSW1hZ2VSZWFkZXIgcmVhZGVyID0gV2ViUEd1ZXNzSW1hZ2VSZWFkZXIoZGF0YSwgZGF0YV9zaXplKTsKKyAgICBvayA9IHJlYWRlcihkYXRhLCBkYXRhX3NpemUsIHBpYywga2VlcF9hbHBoYSwgbWV0YWRhdGEpOworICB9IGVsc2UgeworICAgIC8vIElmIGltYWdlIHNpemUgaXMgc3BlY2lmaWVkLCBpbmZlciBpdCBhcyBZVVYgZm9ybWF0LgorICAgIG9rID0gUmVhZFlVVihkYXRhLCBkYXRhX3NpemUsIHBpYyk7CisgIH0KKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDb3VsZCBub3QgcHJvY2VzcyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgIH0KKyAgZnJlZSgodm9pZCopZGF0YSk7CisgIHJldHVybiBvazsKK30KKworI2VuZGlmICAvLyAhSEFWRV9XSU5DT0RFQ19ICisKK3N0YXRpYyB2b2lkIEFsbG9jRXh0cmFJbmZvKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgY29uc3QgaW50IG1iX3cgPSAocGljLT53aWR0aCArIDE1KSAvIDE2OworICBjb25zdCBpbnQgbWJfaCA9IChwaWMtPmhlaWdodCArIDE1KSAvIDE2OworICBwaWMtPmV4dHJhX2luZm8gPSAodWludDhfdCopbWFsbG9jKG1iX3cgKiBtYl9oICogc2l6ZW9mKCpwaWMtPmV4dHJhX2luZm8pKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRCeXRlQ291bnQoY29uc3QgaW50IGJ5dGVzWzRdLCBpbnQgdG90YWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgdG90YWxzKSB7CisgIGludCBzOworICBpbnQgdG90YWwgPSAwOworICBmb3IgKHMgPSAwOyBzIDwgNDsgKytzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ8ICU3ZCAiLCBieXRlc1tzXSk7CisgICAgdG90YWwgKz0gYnl0ZXNbc107CisgICAgaWYgKHRvdGFscykgdG90YWxzW3NdICs9IGJ5dGVzW3NdOworICB9CisgIGZwcmludGYoc3RkZXJyLCAifCAlN2QgICglLjFmJSUpXG4iLCB0b3RhbCwgMTAwLmYgKiB0b3RhbCAvIHRvdGFsX3NpemUpOworfQorCitzdGF0aWMgdm9pZCBQcmludFBlcmNlbnRzKGNvbnN0IGludCBjb3VudHNbNF0pIHsKKyAgaW50IHM7CisgIGNvbnN0IGludCB0b3RhbCA9IGNvdW50c1swXSArIGNvdW50c1sxXSArIGNvdW50c1syXSArIGNvdW50c1szXTsKKyAgZm9yIChzID0gMDsgcyA8IDQ7ICsrcykgeworICAgIGZwcmludGYoc3RkZXJyLCAifCAgICAgICUyZCUlIiwgKGludCkoMTAwLiAqIGNvdW50c1tzXSAvIHRvdGFsICsgLjUpKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgInwgJTdkXG4iLCB0b3RhbCk7Cit9CisKK3N0YXRpYyB2b2lkIFByaW50VmFsdWVzKGNvbnN0IGludCB2YWx1ZXNbNF0pIHsKKyAgaW50IHM7CisgIGZvciAocyA9IDA7IHMgPCA0OyArK3MpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInwgJTdkICIsIHZhbHVlc1tzXSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJ8XG4iKTsKK30KKworc3RhdGljIHZvaWQgUHJpbnRGdWxsTG9zc2xlc3NJbmZvKGNvbnN0IFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgZGVzY3JpcHRpb24pIHsKKyAgZnByaW50ZihzdGRlcnIsICJMb3NzbGVzcy0lcyBjb21wcmVzc2VkIHNpemU6ICVkIGJ5dGVzXG4iLAorICAgICAgICAgIGRlc2NyaXB0aW9uLCBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSk7CisgIGZwcmludGYoc3RkZXJyLCAiICAqIEhlYWRlciBzaXplOiAlZCBieXRlcywgaW1hZ2UgZGF0YSBzaXplOiAlZFxuIiwKKyAgICAgICAgICBzdGF0cy0+bG9zc2xlc3NfaGRyX3NpemUsIHN0YXRzLT5sb3NzbGVzc19kYXRhX3NpemUpOworICBpZiAoc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgICogTG9zc2xlc3MgZmVhdHVyZXMgdXNlZDoiKTsKKyAgICBpZiAoc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzICYgMSkgZnByaW50ZihzdGRlcnIsICIgUFJFRElDVElPTiIpOworICAgIGlmIChzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgJiAyKSBmcHJpbnRmKHN0ZGVyciwgIiBDUk9TUy1DT0xPUi1UUkFOU0ZPUk0iKTsKKyAgICBpZiAoc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzICYgNCkgZnByaW50ZihzdGRlcnIsICIgU1VCVFJBQ1QtR1JFRU4iKTsKKyAgICBpZiAoc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzICYgOCkgZnByaW50ZihzdGRlcnIsICIgUEFMRVRURSIpOworICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgfQorICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBQcmVjaXNpb24gQml0czogaGlzdG9ncmFtPSVkIHRyYW5zZm9ybT0lZCBjYWNoZT0lZFxuIiwKKyAgICAgICAgICBzdGF0cy0+aGlzdG9ncmFtX2JpdHMsIHN0YXRzLT50cmFuc2Zvcm1fYml0cywgc3RhdHMtPmNhY2hlX2JpdHMpOworICBpZiAoc3RhdHMtPnBhbGV0dGVfc2l6ZSA+IDApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBQYWxldHRlIHNpemU6ICAgJWRcbiIsIHN0YXRzLT5wYWxldHRlX3NpemUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50RXh0cmFJbmZvTG9zc2xlc3MoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNob3J0X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lKSB7CisgIGNvbnN0IFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMgPSBwaWMtPnN0YXRzOworICBpZiAoc2hvcnRfb3V0cHV0KSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlN2QgJTIuMmZcbiIsIHN0YXRzLT5jb2RlZF9zaXplLCBzdGF0cy0+UFNOUlszXSk7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihzdGRlcnIsICJGaWxlOiAgICAgICVzXG4iLCBmaWxlX25hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiRGltZW5zaW9uOiAlZCB4ICVkXG4iLCBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCk7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQ6ICAgICVkIGJ5dGVzICglLjJmIGJwcClcbiIsIHN0YXRzLT5jb2RlZF9zaXplLAorICAgICAgICAgICAgOC5mICogc3RhdHMtPmNvZGVkX3NpemUgLyBwaWMtPndpZHRoIC8gcGljLT5oZWlnaHQpOworICAgIFByaW50RnVsbExvc3NsZXNzSW5mbyhzdGF0cywgIkFSR0IiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBQcmludEV4dHJhSW5mb0xvc3N5KGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBzaG9ydF9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmdWxsX2RldGFpbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVfbmFtZSkgeworICBjb25zdCBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzID0gcGljLT5zdGF0czsKKyAgaWYgKHNob3J0X291dHB1dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiJTdkICUyLjJmXG4iLCBzdGF0cy0+Y29kZWRfc2l6ZSwgc3RhdHMtPlBTTlJbM10pOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBudW1faTQgPSBzdGF0cy0+YmxvY2tfY291bnRbMF07CisgICAgY29uc3QgaW50IG51bV9pMTYgPSBzdGF0cy0+YmxvY2tfY291bnRbMV07CisgICAgY29uc3QgaW50IG51bV9za2lwID0gc3RhdHMtPmJsb2NrX2NvdW50WzJdOworICAgIGNvbnN0IGludCB0b3RhbCA9IG51bV9pNCArIG51bV9pMTY7CisgICAgZnByaW50ZihzdGRlcnIsICJGaWxlOiAgICAgICVzXG4iLCBmaWxlX25hbWUpOworICAgIGZwcmludGYoc3RkZXJyLCAiRGltZW5zaW9uOiAlZCB4ICVkJXNcbiIsCisgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwKKyAgICAgICAgICAgIHN0YXRzLT5hbHBoYV9kYXRhX3NpemUgPyAiICh3aXRoIGFscGhhKSIgOiAiIik7CisgICAgZnByaW50ZihzdGRlcnIsICJPdXRwdXQ6ICAgICIKKyAgICAgICAgICAgICIlZCBieXRlcyBZLVUtVi1BbGwtUFNOUiAlMi4yZiAlMi4yZiAlMi4yZiAgICUyLjJmIGRCXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAoJS4yZiBicHApXG4iLAorICAgICAgICAgICAgc3RhdHMtPmNvZGVkX3NpemUsCisgICAgICAgICAgICBzdGF0cy0+UFNOUlswXSwgc3RhdHMtPlBTTlJbMV0sIHN0YXRzLT5QU05SWzJdLCBzdGF0cy0+UFNOUlszXSwKKyAgICAgICAgICAgIDguZiAqIHN0YXRzLT5jb2RlZF9zaXplIC8gcGljLT53aWR0aCAvIHBpYy0+aGVpZ2h0KTsKKyAgICBpZiAodG90YWwgPiAwKSB7CisgICAgICBpbnQgdG90YWxzWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImJsb2NrIGNvdW50OiAgaW50cmE0OiAgICAgJTZkICAoJS4yZiUlKVxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIGludHJhMTY6ICAgICU2ZCAgKCUuMmYlJSlcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBza2lwcGVkOiAgICAlNmQgICglLjJmJSUpXG4iLAorICAgICAgICAgICAgICBudW1faTQsIDEwMC5mICogbnVtX2k0IC8gdG90YWwsCisgICAgICAgICAgICAgIG51bV9pMTYsIDEwMC5mICogbnVtX2kxNiAvIHRvdGFsLAorICAgICAgICAgICAgICBudW1fc2tpcCwgMTAwLmYgKiBudW1fc2tpcCAvIHRvdGFsKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiYnl0ZXMgdXNlZDogIGhlYWRlcjogICAgICAgICAlNmQgICglLjFmJSUpXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICBtb2RlLXBhcnRpdGlvbjogJTZkICAoJS4xZiUlKVxuIiwKKyAgICAgICAgICAgICAgc3RhdHMtPmhlYWRlcl9ieXRlc1swXSwKKyAgICAgICAgICAgICAgMTAwLmYgKiBzdGF0cy0+aGVhZGVyX2J5dGVzWzBdIC8gc3RhdHMtPmNvZGVkX3NpemUsCisgICAgICAgICAgICAgIHN0YXRzLT5oZWFkZXJfYnl0ZXNbMV0sCisgICAgICAgICAgICAgIDEwMC5mICogc3RhdHMtPmhlYWRlcl9ieXRlc1sxXSAvIHN0YXRzLT5jb2RlZF9zaXplKTsKKyAgICAgIGlmIChzdGF0cy0+YWxwaGFfZGF0YV9zaXplID4gMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICB0cmFuc3BhcmVuY3k6ICAgJTZkICglLjFmIGRCKVxuIiwKKyAgICAgICAgICAgICAgICBzdGF0cy0+YWxwaGFfZGF0YV9zaXplLCBzdGF0cy0+UFNOUls0XSk7CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBSZXNpZHVhbHMgYnl0ZXMgICIKKyAgICAgICAgICAgICAgICAgICAgICAifHNlZ21lbnQgMXxzZWdtZW50IDJ8c2VnbWVudCAzIgorICAgICAgICAgICAgICAgICAgICAgICJ8c2VnbWVudCA0fCAgdG90YWxcbiIpOworICAgICAgaWYgKGZ1bGxfZGV0YWlscykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgaW50cmE0LWNvZWZmczogICIpOworICAgICAgICBQcmludEJ5dGVDb3VudChzdGF0cy0+cmVzaWR1YWxfYnl0ZXNbMF0sIHN0YXRzLT5jb2RlZF9zaXplLCB0b3RhbHMpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiBpbnRyYTE2LWNvZWZmczogICIpOworICAgICAgICBQcmludEJ5dGVDb3VudChzdGF0cy0+cmVzaWR1YWxfYnl0ZXNbMV0sIHN0YXRzLT5jb2RlZF9zaXplLCB0b3RhbHMpOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgY2hyb21hIGNvZWZmczogICIpOworICAgICAgICBQcmludEJ5dGVDb3VudChzdGF0cy0+cmVzaWR1YWxfYnl0ZXNbMl0sIHN0YXRzLT5jb2RlZF9zaXplLCB0b3RhbHMpOworICAgICAgfQorICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgbWFjcm9ibG9ja3M6ICAiKTsKKyAgICAgIFByaW50UGVyY2VudHMoc3RhdHMtPnNlZ21lbnRfc2l6ZSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgIHF1YW50aXplcjogICIpOworICAgICAgUHJpbnRWYWx1ZXMoc3RhdHMtPnNlZ21lbnRfcXVhbnQpOworICAgICAgZnByaW50ZihzdGRlcnIsICIgICBmaWx0ZXIgbGV2ZWw6ICAiKTsKKyAgICAgIFByaW50VmFsdWVzKHN0YXRzLT5zZWdtZW50X2xldmVsKTsKKyAgICAgIGlmIChmdWxsX2RldGFpbHMpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICItLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiKy0tLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICIgc2VnbWVudHMgdG90YWw6ICAiKTsKKyAgICAgICAgUHJpbnRCeXRlQ291bnQodG90YWxzLCBzdGF0cy0+Y29kZWRfc2l6ZSwgTlVMTCk7CisgICAgICB9CisgICAgfQorICAgIGlmIChzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA+IDApIHsKKyAgICAgIFByaW50RnVsbExvc3NsZXNzSW5mbyhzdGF0cywgImFscGhhIik7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFByaW50TWFwSW5mbyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGlmIChwaWMtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBtYl93ID0gKHBpYy0+d2lkdGggKyAxNSkgLyAxNjsKKyAgICBjb25zdCBpbnQgbWJfaCA9IChwaWMtPmhlaWdodCArIDE1KSAvIDE2OworICAgIGNvbnN0IGludCB0eXBlID0gcGljLT5leHRyYV9pbmZvX3R5cGU7CisgICAgaW50IHgsIHk7CisgICAgZm9yICh5ID0gMDsgeSA8IG1iX2g7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IG1iX3c7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgYyA9IHBpYy0+ZXh0cmFfaW5mb1t4ICsgeSAqIG1iX3ddOworICAgICAgICBpZiAodHlwZSA9PSAxKSB7ICAgLy8gaW50cmE0L2ludHJhMTYKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVjIiwgIisuIltjXSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAyKSB7ICAgIC8vIHNlZ21lbnRzCisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlYyIsICIuLSpYIltjXSk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSAzKSB7ICAgIC8vIHF1YW50aXplcnMKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiUuMmQgIiwgYyk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSA2IHx8IHR5cGUgPT0gNykgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJTNkICIsIGMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiMHglLjJ4ICIsIGMpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgTXlXcml0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBGSUxFKiBjb25zdCBvdXQgPSAoRklMRSopcGljLT5jdXN0b21fcHRyOworICByZXR1cm4gZGF0YV9zaXplID8gKGZ3cml0ZShkYXRhLCBkYXRhX3NpemUsIDEsIG91dCkgPT0gMSkgOiAxOworfQorCisvLyBEdW1wcyBhIHBpY3R1cmUgYXMgYSBQR00gZmlsZSB1c2luZyB0aGUgSU1DNCBsYXlvdXQuCitzdGF0aWMgaW50IER1bXBQaWN0dXJlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBjb25zdCBjaGFyKiBQR01fbmFtZSkgeworICBpbnQgeTsKKyAgY29uc3QgaW50IHV2X3dpZHRoID0gKHBpY3R1cmUtPndpZHRoICsgMSkgLyAyOworICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKHBpY3R1cmUtPmhlaWdodCArIDEpIC8gMjsKKyAgY29uc3QgaW50IHN0cmlkZSA9IChwaWN0dXJlLT53aWR0aCArIDEpICYgfjE7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gcGljdHVyZS0+eTsKKyAgY29uc3QgdWludDhfdCogc3JjX3UgPSBwaWN0dXJlLT51OworICBjb25zdCB1aW50OF90KiBzcmNfdiA9IHBpY3R1cmUtPnY7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19hID0gcGljdHVyZS0+YTsKKyAgY29uc3QgaW50IGFscGhhX2hlaWdodCA9CisgICAgICBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShwaWN0dXJlKSA/IHBpY3R1cmUtPmhlaWdodCA6IDA7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQgKyB1dl9oZWlnaHQgKyBhbHBoYV9oZWlnaHQ7CisgIEZJTEUqIGNvbnN0IGYgPSBmb3BlbihQR01fbmFtZSwgIndiIik7CisgIGlmIChmID09IE5VTEwpIHJldHVybiAwOworICBmcHJpbnRmKGYsICJQNVxuJWQgJWRcbjI1NVxuIiwgc3RyaWRlLCBoZWlnaHQpOworICBmb3IgKHkgPSAwOyB5IDwgcGljdHVyZS0+aGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHNyY195LCBwaWN0dXJlLT53aWR0aCwgMSwgZikgIT0gMSkgcmV0dXJuIDA7CisgICAgaWYgKHBpY3R1cmUtPndpZHRoICYgMSkgZnB1dGMoMCwgZik7ICAvLyBwYWQKKyAgICBzcmNfeSArPSBwaWN0dXJlLT55X3N0cmlkZTsKKyAgfQorICBmb3IgKHkgPSAwOyB5IDwgdXZfaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHNyY191LCB1dl93aWR0aCwgMSwgZikgIT0gMSkgcmV0dXJuIDA7CisgICAgaWYgKGZ3cml0ZShzcmNfdiwgdXZfd2lkdGgsIDEsIGYpICE9IDEpIHJldHVybiAwOworICAgIHNyY191ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKKyAgICBzcmNfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgIH0KKyAgZm9yICh5ID0gMDsgeSA8IGFscGhhX2hlaWdodDsgKyt5KSB7CisgICAgaWYgKGZ3cml0ZShzcmNfYSwgcGljdHVyZS0+d2lkdGgsIDEsIGYpICE9IDEpIHJldHVybiAwOworICAgIGlmIChwaWN0dXJlLT53aWR0aCAmIDEpIGZwdXRjKDAsIGYpOyAgLy8gcGFkCisgICAgc3JjX2EgKz0gcGljdHVyZS0+YV9zdHJpZGU7CisgIH0KKyAgZmNsb3NlKGYpOworICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGFkYXRhIHdyaXRpbmcuCisKK2VudW0geworICBNRVRBREFUQV9FWElGID0gKDEgPDwgMCksCisgIE1FVEFEQVRBX0lDQyAgPSAoMSA8PCAxKSwKKyAgTUVUQURBVEFfWE1QICA9ICgxIDw8IDIpLAorICBNRVRBREFUQV9BTEwgID0gTUVUQURBVEFfRVhJRiB8IE1FVEFEQVRBX0lDQyB8IE1FVEFEQVRBX1hNUAorfTsKKworc3RhdGljIGNvbnN0IGludCBrQ2h1bmtIZWFkZXJTaXplID0gODsKK3N0YXRpYyBjb25zdCBpbnQga1RhZ1NpemUgPSA0OworCitzdGF0aWMgdm9pZCBQcmludE1ldGFkYXRhSW5mbyhjb25zdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0YWRhdGFfd3JpdHRlbikgeworICBpZiAobWV0YWRhdGEgPT0gTlVMTCB8fCBtZXRhZGF0YV93cml0dGVuID09IDApIHJldHVybjsKKworICBmcHJpbnRmKHN0ZGVyciwgIk1ldGFkYXRhOlxuIik7CisgIGlmIChtZXRhZGF0YV93cml0dGVuICYgTUVUQURBVEFfSUNDKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgICogSUNDIHByb2ZpbGU6ICAlNmQgYnl0ZXNcbiIsIChpbnQpbWV0YWRhdGEtPmljY3Auc2l6ZSk7CisgIH0KKyAgaWYgKG1ldGFkYXRhX3dyaXR0ZW4gJiBNRVRBREFUQV9FWElGKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIgICogRVhJRiBkYXRhOiAgICAlNmQgYnl0ZXNcbiIsIChpbnQpbWV0YWRhdGEtPmV4aWYuc2l6ZSk7CisgIH0KKyAgaWYgKG1ldGFkYXRhX3dyaXR0ZW4gJiBNRVRBREFUQV9YTVApIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgKiBYTVAgZGF0YTogICAgICU2ZCBieXRlc1xuIiwgKGludCltZXRhZGF0YS0+eG1wLnNpemUpOworICB9Cit9CisKKy8vIE91dHB1dHMsIGluIGxpdHRsZSBlbmRpYW4sICdudW0nIGJ5dGVzIGZyb20gJ3ZhbCcgdG8gJ291dCcuCitzdGF0aWMgaW50IFdyaXRlTEUoRklMRSogY29uc3Qgb3V0LCB1aW50MzJfdCB2YWwsIGludCBudW0pIHsKKyAgdWludDhfdCBidWZbNF07CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBidWZbaV0gPSAodWludDhfdCkodmFsICYgMHhmZik7CisgICAgdmFsID4+PSA4OworICB9CisgIHJldHVybiAoZndyaXRlKGJ1ZiwgbnVtLCAxLCBvdXQpID09IDEpOworfQorCitzdGF0aWMgaW50IFdyaXRlTEUyNChGSUxFKiBjb25zdCBvdXQsIHVpbnQzMl90IHZhbCkgeworICByZXR1cm4gV3JpdGVMRShvdXQsIHZhbCwgMyk7Cit9CisKK3N0YXRpYyBpbnQgV3JpdGVMRTMyKEZJTEUqIGNvbnN0IG91dCwgdWludDMyX3QgdmFsKSB7CisgIHJldHVybiBXcml0ZUxFKG91dCwgdmFsLCA0KTsKK30KKworc3RhdGljIGludCBXcml0ZU1ldGFkYXRhQ2h1bmsoRklMRSogY29uc3Qgb3V0LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCkgeworICBjb25zdCB1aW50OF90IHplcm8gPSAwOworICBjb25zdCBzaXplX3QgbmVlZF9wYWRkaW5nID0gcGF5bG9hZC0+c2l6ZSAmIDE7CisgIGludCBvayA9IChmd3JpdGUoZm91cmNjLCBrVGFnU2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgb2sgPSBvayAmJiBXcml0ZUxFMzIob3V0LCAodWludDMyX3QpcGF5bG9hZC0+c2l6ZSk7CisgIG9rID0gb2sgJiYgKGZ3cml0ZShwYXlsb2FkLT5ieXRlcywgcGF5bG9hZC0+c2l6ZSwgMSwgb3V0KSA9PSAxKTsKKyAgcmV0dXJuIG9rICYmIChmd3JpdGUoJnplcm8sIG5lZWRfcGFkZGluZywgbmVlZF9wYWRkaW5nLCBvdXQpID09IG5lZWRfcGFkZGluZyk7Cit9CisKKy8vIFNldHMgJ2ZsYWcnIGluICd2cDh4X2ZsYWdzJyBhbmQgdXBkYXRlcyAnbWV0YWRhdGFfc2l6ZScgd2l0aCB0aGUgc2l6ZSBvZiB0aGUKKy8vIGNodW5rIGlmIHRoZXJlIGlzIG1ldGFkYXRhIGFuZCAna2VlcCcgaXMgdHJ1ZS4KK3N0YXRpYyBpbnQgVXBkYXRlRmxhZ3NBbmRTaXplKGNvbnN0IE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwLCBpbnQgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiB2cDh4X2ZsYWdzLCB1aW50NjRfdCogbWV0YWRhdGFfc2l6ZSkgeworICBpZiAoa2VlcCAmJiBwYXlsb2FkLT5ieXRlcyAhPSBOVUxMICYmIHBheWxvYWQtPnNpemUgPiAwKSB7CisgICAgKnZwOHhfZmxhZ3MgfD0gZmxhZzsKKyAgICAqbWV0YWRhdGFfc2l6ZSArPSBrQ2h1bmtIZWFkZXJTaXplICsgcGF5bG9hZC0+c2l6ZSArIChwYXlsb2FkLT5zaXplICYgMSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIFdyaXRlcyBhIFdlYlAgZmlsZSB1c2luZyB0aGUgaW1hZ2UgY29udGFpbmVkIGluICdtZW1vcnlfd3JpdGVyJyBhbmQgdGhlCisvLyBtZXRhZGF0YSBmcm9tICdtZXRhZGF0YScuIE1ldGFkYXRhIGlzIGNvbnRyb2xsZWQgYnkgJ2tlZXBfbWV0YWRhdGEnIGFuZCB0aGUKKy8vIGF2YWlsYWJpbGl0eSBpbiAnbWV0YWRhdGEnLiBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKy8vIEZvciBkZXRhaWxzIHNlZSBkb2Mvd2VicC1jb250YWluZXItc3BlYy50eHQjZXh0ZW5kZWQtZmlsZS1mb3JtYXQuCitzdGF0aWMgaW50IFdyaXRlV2ViUFdpdGhNZXRhZGF0YShGSUxFKiBjb25zdCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IG1lbW9yeV93cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9tZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbWV0YWRhdGFfd3JpdHRlbikgeworICBjb25zdCBjaGFyIGtWUDhYSGVhZGVyW10gPSAiVlA4WFx4MGFceDAwXHgwMFx4MDAiOworICBjb25zdCBpbnQga0FscGhhRmxhZyA9IDB4MTA7CisgIGNvbnN0IGludCBrRVhJRkZsYWcgID0gMHgwODsKKyAgY29uc3QgaW50IGtJQ0NQRmxhZyAgPSAweDIwOworICBjb25zdCBpbnQga1hNUEZsYWcgICA9IDB4MDQ7CisgIGNvbnN0IHNpemVfdCBrUmlmZkhlYWRlclNpemUgPSAxMjsKKyAgY29uc3Qgc2l6ZV90IGtNYXhDaHVua1BheWxvYWQgPSB+MCAtIGtDaHVua0hlYWRlclNpemUgLSAxOworICBjb25zdCBzaXplX3Qga01pblNpemUgPSBrUmlmZkhlYWRlclNpemUgKyBrQ2h1bmtIZWFkZXJTaXplOworICB1aW50MzJfdCBmbGFncyA9IDA7CisgIHVpbnQ2NF90IG1ldGFkYXRhX3NpemUgPSAwOworICBjb25zdCBpbnQgd3JpdGVfZXhpZiA9IFVwZGF0ZUZsYWdzQW5kU2l6ZSgmbWV0YWRhdGEtPmV4aWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGtlZXBfbWV0YWRhdGEgJiBNRVRBREFUQV9FWElGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VYSUZGbGFnLCAmZmxhZ3MsICZtZXRhZGF0YV9zaXplKTsKKyAgY29uc3QgaW50IHdyaXRlX2ljY3AgPSBVcGRhdGVGbGFnc0FuZFNpemUoJm1ldGFkYXRhLT5pY2NwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIShrZWVwX21ldGFkYXRhICYgTUVUQURBVEFfSUNDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0lDQ1BGbGFnLCAmZmxhZ3MsICZtZXRhZGF0YV9zaXplKTsKKyAgY29uc3QgaW50IHdyaXRlX3htcCAgPSBVcGRhdGVGbGFnc0FuZFNpemUoJm1ldGFkYXRhLT54bXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEhKGtlZXBfbWV0YWRhdGEgJiBNRVRBREFUQV9YTVApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrWE1QRmxhZywgJmZsYWdzLCAmbWV0YWRhdGFfc2l6ZSk7CisgIHVpbnQ4X3QqIHdlYnAgPSBtZW1vcnlfd3JpdGVyLT5tZW07CisgIHNpemVfdCB3ZWJwX3NpemUgPSBtZW1vcnlfd3JpdGVyLT5zaXplOworCisgICptZXRhZGF0YV93cml0dGVuID0gMDsKKworICBpZiAod2VicF9zaXplIDwga01pblNpemUpIHJldHVybiAwOworICBpZiAod2VicF9zaXplIC0ga0NodW5rSGVhZGVyU2l6ZSArIG1ldGFkYXRhX3NpemUgPiBrTWF4Q2h1bmtQYXlsb2FkKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQWRkaXRpb24gb2YgbWV0YWRhdGEgd291bGQgZXhjZWVkICIKKyAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5lciBzaXplIGxpbWl0LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAobWV0YWRhdGFfc2l6ZSA+IDApIHsKKyAgICBjb25zdCBpbnQga1ZQOFhDaHVua1NpemUgPSAxODsKKyAgICBjb25zdCBpbnQgaGFzX3ZwOHggPSAhbWVtY21wKHdlYnAgKyBrUmlmZkhlYWRlclNpemUsICJWUDhYIiwga1RhZ1NpemUpOworICAgIGNvbnN0IHVpbnQzMl90IHJpZmZfc2l6ZSA9ICh1aW50MzJfdCkod2VicF9zaXplIC0ga0NodW5rSGVhZGVyU2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGFzX3ZwOHggPyAwIDoga1ZQOFhDaHVua1NpemUpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhX3NpemUpOworICAgIC8vIFJJRkYKKyAgICBpbnQgb2sgPSAoZndyaXRlKHdlYnAsIGtUYWdTaXplLCAxLCBvdXQpID09IDEpOworICAgIC8vIFJJRkYgc2l6ZSAoZmlsZSBoZWFkZXIgc2l6ZSBpcyBub3QgcmVjb3JkZWQpCisgICAgb2sgPSBvayAmJiBXcml0ZUxFMzIob3V0LCByaWZmX3NpemUpOworICAgIHdlYnAgKz0ga0NodW5rSGVhZGVyU2l6ZTsKKyAgICB3ZWJwX3NpemUgLT0ga0NodW5rSGVhZGVyU2l6ZTsKKyAgICAvLyBXRUJQCisgICAgb2sgPSBvayAmJiAoZndyaXRlKHdlYnAsIGtUYWdTaXplLCAxLCBvdXQpID09IDEpOworICAgIHdlYnAgKz0ga1RhZ1NpemU7CisgICAgd2VicF9zaXplIC09IGtUYWdTaXplOworICAgIGlmIChoYXNfdnA4eCkgeyAgLy8gdXBkYXRlIHRoZSBleGlzdGluZyBWUDhYIGZsYWdzCisgICAgICB3ZWJwW2tDaHVua0hlYWRlclNpemVdIHw9ICh1aW50OF90KShmbGFncyAmIDB4ZmYpOworICAgICAgb2sgPSBvayAmJiAoZndyaXRlKHdlYnAsIGtWUDhYQ2h1bmtTaXplLCAxLCBvdXQpID09IDEpOworICAgICAgd2VicCArPSBrVlA4WENodW5rU2l6ZTsKKyAgICAgIHdlYnBfc2l6ZSAtPSBrVlA4WENodW5rU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IGlzX2xvc3NsZXNzID0gIW1lbWNtcCh3ZWJwLCAiVlA4TCIsIGtUYWdTaXplKTsKKyAgICAgIGlmIChpc19sb3NzbGVzcykgeworICAgICAgICAvLyBQcmVzZW5jZSBvZiBhbHBoYSBpcyBzdG9yZWQgaW4gdGhlIDM3dGggYml0ICgyOXRoIGFmdGVyIHRoZQorICAgICAgICAvLyBzaWduYXR1cmUpIG9mIFZQOEwgZGF0YS4KKyAgICAgICAgaWYgKHdlYnBba0NodW5rSGVhZGVyU2l6ZSArIDRdICYgKDEgPDwgNCkpIGZsYWdzIHw9IGtBbHBoYUZsYWc7CisgICAgICB9CisgICAgICBvayA9IG9rICYmIChmd3JpdGUoa1ZQOFhIZWFkZXIsIGtDaHVua0hlYWRlclNpemUsIDEsIG91dCkgPT0gMSk7CisgICAgICBvayA9IG9rICYmIFdyaXRlTEUzMihvdXQsIGZsYWdzKTsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVMRTI0KG91dCwgcGljdHVyZS0+d2lkdGggLSAxKTsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVMRTI0KG91dCwgcGljdHVyZS0+aGVpZ2h0IC0gMSk7CisgICAgfQorICAgIGlmICh3cml0ZV9pY2NwKSB7CisgICAgICBvayA9IG9rICYmIFdyaXRlTWV0YWRhdGFDaHVuayhvdXQsICJJQ0NQIiwgJm1ldGFkYXRhLT5pY2NwKTsKKyAgICAgICptZXRhZGF0YV93cml0dGVuIHw9IE1FVEFEQVRBX0lDQzsKKyAgICB9CisgICAgLy8gSW1hZ2UKKyAgICBvayA9IG9rICYmIChmd3JpdGUod2VicCwgd2VicF9zaXplLCAxLCBvdXQpID09IDEpOworICAgIGlmICh3cml0ZV9leGlmKSB7CisgICAgICBvayA9IG9rICYmIFdyaXRlTWV0YWRhdGFDaHVuayhvdXQsICJFWElGIiwgJm1ldGFkYXRhLT5leGlmKTsKKyAgICAgICptZXRhZGF0YV93cml0dGVuIHw9IE1FVEFEQVRBX0VYSUY7CisgICAgfQorICAgIGlmICh3cml0ZV94bXApIHsKKyAgICAgIG9rID0gb2sgJiYgV3JpdGVNZXRhZGF0YUNodW5rKG91dCwgIlhNUCAiLCAmbWV0YWRhdGEtPnhtcCk7CisgICAgICAqbWV0YWRhdGFfd3JpdHRlbiB8PSBNRVRBREFUQV9YTVA7CisgICAgfQorICAgIHJldHVybiBvazsKKyAgfQorCisgIC8vIE5vIG1ldGFkYXRhLCBqdXN0IHdyaXRlIHRoZSBvcmlnaW5hbCBpbWFnZSBmaWxlLgorICByZXR1cm4gKGZ3cml0ZSh3ZWJwLCB3ZWJwX3NpemUsIDEsIG91dCkgPT0gMSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgUHJvZ3Jlc3NSZXBvcnQoaW50IHBlcmNlbnQsIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIGZwcmludGYoc3RkZXJyLCAiWyVzXTogJTNkICUlICAgICAgXHIiLAorICAgICAgICAgIChjaGFyKilwaWN0dXJlLT51c2VyX2RhdGEsIHBlcmNlbnQpOworICByZXR1cm4gMTsgIC8vIGFsbCBvaworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIZWxwU2hvcnQodm9pZCkgeworICBwcmludGYoIlVzYWdlOlxuXG4iKTsKKyAgcHJpbnRmKCIgICBjd2VicCBbb3B0aW9uc10gLXEgcXVhbGl0eSBpbnB1dC5wbmcgLW8gb3V0cHV0LndlYnBcblxuIik7CisgIHByaW50Zigid2hlcmUgcXVhbGl0eSBpcyBiZXR3ZWVuIDAgKHBvb3IpIHRvIDEwMCAodmVyeSBnb29kKS5cbiIpOworICBwcmludGYoIlR5cGljYWwgdmFsdWUgaXMgYXJvdW5kIDgwLlxuXG4iKTsKKyAgcHJpbnRmKCJUcnkgLWxvbmdoZWxwIGZvciBhbiBleGhhdXN0aXZlIGxpc3Qgb2YgYWR2YW5jZWQgb3B0aW9ucy5cbiIpOworfQorCitzdGF0aWMgdm9pZCBIZWxwTG9uZyh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6XG4iKTsKKyAgcHJpbnRmKCIgY3dlYnAgWy1wcmVzZXQgPC4uLj5dIFtvcHRpb25zXSBpbl9maWxlIFstbyBvdXRfZmlsZV1cblxuIik7CisgIHByaW50ZigiSWYgaW5wdXQgc2l6ZSAoLXMpIGZvciBhbiBpbWFnZSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpc1xuIgorICAgICAgICAgImFzc3VtZWQgdG8gYmUgYSBQTkcsIEpQRUcsIFRJRkYgb3IgV2ViUCBmaWxlLlxuIik7CisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgIHByaW50ZigiV2luZG93cyBidWlsZHMgY2FuIHRha2UgYXMgaW5wdXQgYW55IG9mIHRoZSBmaWxlcyBoYW5kbGVkIGJ5IFdJQy5cbiIpOworI2VuZGlmCisgIHByaW50ZigiXG5PcHRpb25zOlxuIik7CisgIHByaW50ZigiICAtaCAvIC1oZWxwIC4uLi4uLi4uLi4uLi4gc2hvcnQgaGVscFxuIik7CisgIHByaW50ZigiICAtSCAvIC1sb25naGVscCAuLi4uLi4uLi4gbG9uZyBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4uLiBxdWFsaXR5IGZhY3RvciAoMDpzbWFsbC4uMTAwOmJpZyksICIKKyAgICAgICAgICJkZWZhdWx0PTc1XG4iKTsKKyAgcHJpbnRmKCIgIC1hbHBoYV9xIDxpbnQ+IC4uLi4uLi4uLiB0cmFuc3BhcmVuY3ktY29tcHJlc3Npb24gcXVhbGl0eSAoMC4uMTAwKSwiCisgICAgICAgICAiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PTEwMFxuIik7CisgIHByaW50ZigiICAtcHJlc2V0IDxzdHJpbmc+IC4uLi4uLi4gcHJlc2V0IHNldHRpbmcsIG9uZSBvZjpcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LCBwaG90bywgcGljdHVyZSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3aW5nLCBpY29uLCB0ZXh0XG4iKTsKKyAgcHJpbnRmKCIgICAgIC1wcmVzZXQgbXVzdCBjb21lIGZpcnN0LCBhcyBpdCBvdmVyd3JpdGVzIG90aGVyIHBhcmFtZXRlcnNcbiIpOworICBwcmludGYoIiAgLXogPGludD4gLi4uLi4uLi4uLi4uLi4uIGFjdGl2YXRlcyBsb3NzbGVzcyBwcmVzZXQgd2l0aCBnaXZlblxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIGluIFswOmZhc3QsIC4uLiwgOTpzbG93ZXN0XVxuIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCIgIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4uLiBjb21wcmVzc2lvbiBtZXRob2QgKDA9ZmFzdCwgNj1zbG93ZXN0KSwgIgorICAgICAgICAgImRlZmF1bHQ9NFxuIik7CisgIHByaW50ZigiICAtc2VnbWVudHMgPGludD4gLi4uLi4uLi4gbnVtYmVyIG9mIHNlZ21lbnRzIHRvIHVzZSAoMS4uNCksICIKKyAgICAgICAgICJkZWZhdWx0PTRcbiIpOworICBwcmludGYoIiAgLXNpemUgPGludD4gLi4uLi4uLi4uLi4uIHRhcmdldCBzaXplIChpbiBieXRlcylcbiIpOworICBwcmludGYoIiAgLXBzbnIgPGZsb2F0PiAuLi4uLi4uLi4uIHRhcmdldCBQU05SIChpbiBkQi4gdHlwaWNhbGx5OiA0MilcbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiICAtcyA8aW50PiA8aW50PiAuLi4uLi4uLi4gaW5wdXQgc2l6ZSAod2lkdGggeCBoZWlnaHQpIGZvciBZVVZcbiIpOworICBwcmludGYoIiAgLXNucyA8aW50PiAuLi4uLi4uLi4uLi4uIHNwYXRpYWwgbm9pc2Ugc2hhcGluZyAoMDpvZmYsIDEwMDptYXgpLCAiCisgICAgICAgICAiZGVmYXVsdD01MFxuIik7CisgIHByaW50ZigiICAtZiA8aW50PiAuLi4uLi4uLi4uLi4uLi4gZmlsdGVyIHN0cmVuZ3RoICgwPW9mZi4uMTAwKSwgIgorICAgICAgICAgImRlZmF1bHQ9NjBcbiIpOworICBwcmludGYoIiAgLXNoYXJwbmVzcyA8aW50PiAuLi4uLi4uICIKKyAgICAgICAgICJmaWx0ZXIgc2hhcnBuZXNzICgwOm1vc3QgLi4gNzpsZWFzdCBzaGFycCksIGRlZmF1bHQ9MFxuIik7CisgIHByaW50ZigiICAtc3Ryb25nIC4uLi4uLi4uLi4uLi4uLi4gdXNlIHN0cm9uZyBmaWx0ZXIgaW5zdGVhZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHNpbXBsZSAoZGVmYXVsdClcbiIpOworICBwcmludGYoIiAgLW5vc3Ryb25nIC4uLi4uLi4uLi4uLi4uIHVzZSBzaW1wbGUgZmlsdGVyIGluc3RlYWQgb2Ygc3Ryb25nXG4iKTsKKyAgcHJpbnRmKCIgIC1zaGFycF95dXYgLi4uLi4uLi4uLi4uLiB1c2Ugc2hhcnBlciAoYW5kIHNsb3dlcikgUkdCLT5ZVVYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb252ZXJzaW9uXG4iKTsKKyAgcHJpbnRmKCIgIC1wYXJ0aXRpb25fbGltaXQgPGludD4gLiBsaW1pdCBxdWFsaXR5IHRvIGZpdCB0aGUgNTEyayBsaW1pdCBvblxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorICAgICAgICAgInRoZSBmaXJzdCBwYXJ0aXRpb24gKDA9bm8gZGVncmFkYXRpb24gLi4uIDEwMD1mdWxsKVxuIik7CisgIHByaW50ZigiICAtcGFzcyA8aW50PiAuLi4uLi4uLi4uLi4gYW5hbHlzaXMgcGFzcyBudW1iZXIgKDEuLjEwKVxuIik7CisgIHByaW50ZigiICAtY3JvcCA8eD4gPHk+IDx3PiA8aD4gLi4gY3JvcCBwaWN0dXJlIHdpdGggdGhlIGdpdmVuIHJlY3RhbmdsZVxuIik7CisgIHByaW50ZigiICAtcmVzaXplIDx3PiA8aD4gLi4uLi4uLi4gcmVzaXplIHBpY3R1cmUgKGFmdGVyIGFueSBjcm9wcGluZylcbiIpOworICBwcmludGYoIiAgLW10IC4uLi4uLi4uLi4uLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmcgaWYgYXZhaWxhYmxlXG4iKTsKKyAgcHJpbnRmKCIgIC1sb3dfbWVtb3J5IC4uLi4uLi4uLi4uLiByZWR1Y2UgbWVtb3J5IHVzYWdlIChzbG93ZXIgZW5jb2RpbmcpXG4iKTsKKyAgcHJpbnRmKCIgIC1tYXAgPGludD4gLi4uLi4uLi4uLi4uLiBwcmludCBtYXAgb2YgZXh0cmEgaW5mb1xuIik7CisgIHByaW50ZigiICAtcHJpbnRfcHNuciAuLi4uLi4uLi4uLi4gcHJpbnRzIGF2ZXJhZ2VkIFBTTlIgZGlzdG9ydGlvblxuIik7CisgIHByaW50ZigiICAtcHJpbnRfc3NpbSAuLi4uLi4uLi4uLi4gcHJpbnRzIGF2ZXJhZ2VkIFNTSU0gZGlzdG9ydGlvblxuIik7CisgIHByaW50ZigiICAtcHJpbnRfbHNpbSAuLi4uLi4uLi4uLi4gcHJpbnRzIGxvY2FsLXNpbWlsYXJpdHkgZGlzdG9ydGlvblxuIik7CisgIHByaW50ZigiICAtZCA8ZmlsZS5wZ20+IC4uLi4uLi4uLi4gZHVtcCB0aGUgY29tcHJlc3NlZCBvdXRwdXQgKFBHTSBmaWxlKVxuIik7CisgIHByaW50ZigiICAtYWxwaGFfbWV0aG9kIDxpbnQ+IC4uLi4gdHJhbnNwYXJlbmN5LWNvbXByZXNzaW9uIG1ldGhvZCAoMC4uMSksICIKKyAgICAgICAgICJkZWZhdWx0PTFcbiIpOworICBwcmludGYoIiAgLWFscGhhX2ZpbHRlciA8c3RyaW5nPiAuIHByZWRpY3RpdmUgZmlsdGVyaW5nIGZvciBhbHBoYSBwbGFuZSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZSBvZjogbm9uZSwgZmFzdCAoZGVmYXVsdCkgb3IgYmVzdFxuIik7CisgIHByaW50ZigiICAtZXhhY3QgLi4uLi4uLi4uLi4uLi4uLi4gcHJlc2VydmUgUkdCIHZhbHVlcyBpbiB0cmFuc3BhcmVudCBhcmVhLCAiCisgICAgICAgICAiZGVmYXVsdD1vZmZcbiIpOworICBwcmludGYoIiAgLWJsZW5kX2FscGhhIDxoZXg+IC4uLi4uIGJsZW5kIGNvbG9ycyBhZ2FpbnN0IGJhY2tncm91bmQgY29sb3JcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzZWQgYXMgUkdCIHZhbHVlcyB3cml0dGVuIGluXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4YWRlY2ltYWwsIGUuZy4gMHhjMGUwZDAgZm9yIHJlZD0weGMwXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW49MHhlMCBhbmQgYmx1ZT0weGQwXG4iKTsKKyAgcHJpbnRmKCIgIC1ub2FscGhhIC4uLi4uLi4uLi4uLi4uLiBkaXNjYXJkIGFueSB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb25cbiIpOworICBwcmludGYoIiAgLWxvc3NsZXNzIC4uLi4uLi4uLi4uLi4uIGVuY29kZSBpbWFnZSBsb3NzbGVzc2x5LCBkZWZhdWx0PW9mZlxuIik7CisgIHByaW50ZigiICAtbmVhcl9sb3NzbGVzcyA8aW50PiAuLi4gdXNlIG5lYXItbG9zc2xlc3MgaW1hZ2VcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwcm9jZXNzaW5nICgwLi4xMDA9b2ZmKSwgIgorICAgICAgICAgImRlZmF1bHQ9MTAwXG4iKTsKKyAgcHJpbnRmKCIgIC1oaW50IDxzdHJpbmc+IC4uLi4uLi4uLiBzcGVjaWZ5IGltYWdlIGNoYXJhY3RlcmlzdGljcyBoaW50LFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mOiBwaG90bywgcGljdHVyZSBvciBncmFwaFxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIiAgLW1ldGFkYXRhIDxzdHJpbmc+IC4uLi4uIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgcHJpbnRmKCJjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYgcHJlc2VudC5cbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgICAgICIKKyAgICAgICAgICJWYWxpZCB2YWx1ZXM6IGFsbCwgbm9uZSAoZGVmYXVsdCksIGV4aWYsIGljYywgeG1wXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiICAtc2hvcnQgLi4uLi4uLi4uLi4uLi4uLi4gY29uZGVuc2UgcHJpbnRlZCBtZXNzYWdlXG4iKTsKKyAgcHJpbnRmKCIgIC1xdWlldCAuLi4uLi4uLi4uLi4uLi4uLiBkb24ndCBwcmludCBhbnl0aGluZ1xuIik7CisgIHByaW50ZigiICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOworI2lmbmRlZiBXRUJQX0RMTAorICBwcmludGYoIiAgLW5vYXNtIC4uLi4uLi4uLi4uLi4uLi4uIGRpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnNcbiIpOworI2VuZGlmCisgIHByaW50ZigiICAtdiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4gdmVyYm9zZSwgZS5nLiBwcmludCBlbmNvZGluZy9kZWNvZGluZyAiCisgICAgICAgICAidGltZXNcbiIpOworICBwcmludGYoIiAgLXByb2dyZXNzIC4uLi4uLi4uLi4uLi4uIHJlcG9ydCBlbmNvZGluZyBwcm9ncmVzc1xuIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJFeHBlcmltZW50YWwgT3B0aW9uczpcbiIpOworICBwcmludGYoIiAgLWpwZWdfbGlrZSAuLi4uLi4uLi4uLi4uIHJvdWdobHkgbWF0Y2ggZXhwZWN0ZWQgSlBFRyBzaXplXG4iKTsKKyAgcHJpbnRmKCIgIC1hZiAuLi4uLi4uLi4uLi4uLi4uLi4uLiBhdXRvLWFkanVzdCBmaWx0ZXIgc3RyZW5ndGhcbiIpOworICBwcmludGYoIiAgLXByZSA8aW50PiAuLi4uLi4uLi4uLi4uIHByZS1wcm9jZXNzaW5nIGZpbHRlclxuIik7CisgIHByaW50ZigiXG4iKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVycm9yIG1lc3NhZ2VzCisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRXJyb3JNZXNzYWdlc1tWUDhfRU5DX0VSUk9SX0xBU1RdID0geworICAiT0siLAorICAiT1VUX09GX01FTU9SWTogT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIG9iamVjdHMiLAorICAiQklUU1RSRUFNX09VVF9PRl9NRU1PUlk6IE91dCBvZiBtZW1vcnkgcmUtYWxsb2NhdGluZyBieXRlIGJ1ZmZlciIsCisgICJOVUxMX1BBUkFNRVRFUjogTlVMTCBwYXJhbWV0ZXIgcGFzc2VkIHRvIGZ1bmN0aW9uIiwKKyAgIklOVkFMSURfQ09ORklHVVJBVElPTjogY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkIiwKKyAgIkJBRF9ESU1FTlNJT046IEJhZCBwaWN0dXJlIGRpbWVuc2lvbi4gTWF4aW11bSB3aWR0aCBhbmQgaGVpZ2h0ICIKKyAgImFsbG93ZWQgaXMgMTYzODMgcGl4ZWxzLiIsCisgICJQQVJUSVRJT04wX09WRVJGTE9XOiBQYXJ0aXRpb24gIzAgaXMgdG9vIGJpZyB0byBmaXQgNTEyay5cbiIKKyAgIlRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGlzIHBhcnRpdGlvbiwgdHJ5IHVzaW5nIGxlc3Mgc2VnbWVudHMgIgorICAid2l0aCB0aGUgLXNlZ21lbnRzIG9wdGlvbiwgYW5kIGV2ZW50dWFsbHkgcmVkdWNlIHRoZSBudW1iZXIgb2YgIgorICAiaGVhZGVyIGJpdHMgdXNpbmcgLXBhcnRpdGlvbl9saW1pdC4gTW9yZSBkZXRhaWxzIGFyZSBhdmFpbGFibGUgIgorICAiaW4gdGhlIG1hbnVhbCAoYG1hbiBjd2VicGApIiwKKyAgIlBBUlRJVElPTl9PVkVSRkxPVzogUGFydGl0aW9uIGlzIHRvbyBiaWcgdG8gZml0IDE2TSIsCisgICJCQURfV1JJVEU6IFBpY3R1cmUgd3JpdGVyIHJldHVybmVkIGFuIEkvTyBlcnJvciIsCisgICJGSUxFX1RPT19CSUc6IEZpbGUgd291bGQgYmUgdG9vIGJpZyB0byBmaXQgaW4gNEciLAorICAiVVNFUl9BQk9SVDogZW5jb2RpbmcgYWJvcnQgcmVxdWVzdGVkIGJ5IHVzZXIiCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGludCByZXR1cm5fdmFsdWUgPSAtMTsKKyAgY29uc3QgY2hhciAqaW5fZmlsZSA9IE5VTEwsICpvdXRfZmlsZSA9IE5VTEwsICpkdW1wX2ZpbGUgPSBOVUxMOworICBGSUxFICpvdXQgPSBOVUxMOworICBpbnQgYzsKKyAgaW50IHNob3J0X291dHB1dCA9IDA7CisgIGludCBxdWlldCA9IDA7CisgIGludCBrZWVwX2FscGhhID0gMTsKKyAgaW50IGJsZW5kX2FscGhhID0gMDsKKyAgdWludDMyX3QgYmFja2dyb3VuZF9jb2xvciA9IDB4ZmZmZmZmdTsKKyAgaW50IGNyb3AgPSAwLCBjcm9wX3ggPSAwLCBjcm9wX3kgPSAwLCBjcm9wX3cgPSAwLCBjcm9wX2ggPSAwOworICBpbnQgcmVzaXplX3cgPSAwLCByZXNpemVfaCA9IDA7CisgIGludCBsb3NzbGVzc19wcmVzZXQgPSA2OworICBpbnQgdXNlX2xvc3NsZXNzX3ByZXNldCA9IC0xOyAgLy8gLTE9dW5zZXQsIDA9ZG9uJ3QgdXNlLCAxPXVzZSBpdAorICBpbnQgc2hvd19wcm9ncmVzcyA9IDA7CisgIGludCBrZWVwX21ldGFkYXRhID0gMDsKKyAgaW50IG1ldGFkYXRhX3dyaXR0ZW4gPSAwOworICBXZWJQUGljdHVyZSBwaWN0dXJlOworICBpbnQgcHJpbnRfZGlzdG9ydGlvbiA9IC0xOyAgICAgICAgLy8gLTE9b2ZmLCAwPVBTTlIsIDE9U1NJTSwgMj1MU0lNCisgIFdlYlBQaWN0dXJlIG9yaWdpbmFsX3BpY3R1cmU7ICAgIC8vIHdoZW4gUFNOUiBvciBTU0lNIGlzIHJlcXVlc3RlZAorICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgV2ViUEF1eFN0YXRzIHN0YXRzOworICBXZWJQTWVtb3J5V3JpdGVyIG1lbW9yeV93cml0ZXI7CisgIE1ldGFkYXRhIG1ldGFkYXRhOworICBTdG9wd2F0Y2ggc3RvcF93YXRjaDsKKworICBNZXRhZGF0YUluaXQoJm1ldGFkYXRhKTsKKyAgV2ViUE1lbW9yeVdyaXRlckluaXQoJm1lbW9yeV93cml0ZXIpOworICBpZiAoIVdlYlBQaWN0dXJlSW5pdCgmcGljdHVyZSkgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJm9yaWdpbmFsX3BpY3R1cmUpIHx8CisgICAgICAhV2ViUENvbmZpZ0luaXQoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBWZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIEhlbHBTaG9ydCgpOworICAgIHJldHVybiAwOworICB9CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscFNob3J0KCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1IIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWxvbmdoZWxwIikpIHsKKyAgICAgIEhlbHBMb25nKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1vIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBvdXRfZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBkdW1wX2ZpbGUgPSBhcmd2WysrY107CisgICAgICBjb25maWcuc2hvd19jb21wcmVzc2VkID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmludF9wc25yIikpIHsKKyAgICAgIGNvbmZpZy5zaG93X2NvbXByZXNzZWQgPSAxOworICAgICAgcHJpbnRfZGlzdG9ydGlvbiA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJpbnRfc3NpbSIpKSB7CisgICAgICBjb25maWcuc2hvd19jb21wcmVzc2VkID0gMTsKKyAgICAgIHByaW50X2Rpc3RvcnRpb24gPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXByaW50X2xzaW0iKSkgeworICAgICAgY29uZmlnLnNob3dfY29tcHJlc3NlZCA9IDE7CisgICAgICBwcmludF9kaXN0b3J0aW9uID0gMjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zaG9ydCIpKSB7CisgICAgICArK3Nob3J0X291dHB1dDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zIikgJiYgYyA8IGFyZ2MgLSAyKSB7CisgICAgICBwaWN0dXJlLndpZHRoID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIHBpY3R1cmUuaGVpZ2h0ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGlmIChwaWN0dXJlLndpZHRoID4gV0VCUF9NQVhfRElNRU5TSU9OIHx8IHBpY3R1cmUud2lkdGggPCAwIHx8CisgICAgICAgICAgcGljdHVyZS5oZWlnaHQgPiBXRUJQX01BWF9ESU1FTlNJT04gfHwgIHBpY3R1cmUuaGVpZ2h0IDwgMCkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAiU3BlY2lmaWVkIGRpbWVuc2lvbiAoJWQgeCAlZCkgaXMgb3V0IG9mIHJhbmdlLlxuIiwKKyAgICAgICAgICAgICAgICBwaWN0dXJlLndpZHRoLCBwaWN0dXJlLmhlaWdodCk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLm1ldGhvZCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICB1c2VfbG9zc2xlc3NfcHJlc2V0ID0gMDsgICAvLyBkaXNhYmxlIC16IG9wdGlvbgorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXEiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5xdWFsaXR5ID0gRXhVdGlsR2V0RmxvYXQoYXJndlsrK2NdLCAmcGFyc2VfZXJyb3IpOworICAgICAgdXNlX2xvc3NsZXNzX3ByZXNldCA9IDA7ICAgLy8gZGlzYWJsZSAteiBvcHRpb24KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi16IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBsb3NzbGVzc19wcmVzZXQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgaWYgKHVzZV9sb3NzbGVzc19wcmVzZXQgIT0gMCkgdXNlX2xvc3NsZXNzX3ByZXNldCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGFfcSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLmFscGhhX3F1YWxpdHkgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhX21ldGhvZCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLmFscGhhX2NvbXByZXNzaW9uID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYV9jbGVhbnVwIikpIHsKKyAgICAgIC8vIFRoaXMgZmxhZyBpcyBvYnNvbGV0ZSwgZG9lcyBvcHBvc2l0ZSBvZiAtZXhhY3QuCisgICAgICBjb25maWcuZXhhY3QgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWV4YWN0IikpIHsKKyAgICAgIGNvbmZpZy5leGFjdCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYmxlbmRfYWxwaGEiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGJsZW5kX2FscGhhID0gMTsKKyAgICAgIC8vIGJhY2tncm91bmQgY29sb3IgaXMgZ2l2ZW4gaW4gaGV4IHdpdGggYW4gb3B0aW9uYWwgJzB4JyBwcmVmaXgKKyAgICAgIGJhY2tncm91bmRfY29sb3IgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAxNiwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGJhY2tncm91bmRfY29sb3IgPSBiYWNrZ3JvdW5kX2NvbG9yICYgMHgwMGZmZmZmZnU7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYWxwaGFfZmlsdGVyIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICArK2M7CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAibm9uZSIpKSB7CisgICAgICAgIGNvbmZpZy5hbHBoYV9maWx0ZXJpbmcgPSAwOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJmYXN0IikpIHsKKyAgICAgICAgY29uZmlnLmFscGhhX2ZpbHRlcmluZyA9IDE7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgImJlc3QiKSkgeworICAgICAgICBjb25maWcuYWxwaGFfZmlsdGVyaW5nID0gMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVucmVjb2duaXplZCBhbHBoYSBmaWx0ZXI6ICVzXG4iLCBhcmd2W2NdKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2FscGhhIikpIHsKKyAgICAgIGtlZXBfYWxwaGEgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvc3NsZXNzIikpIHsKKyAgICAgIGNvbmZpZy5sb3NzbGVzcyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbmVhcl9sb3NzbGVzcyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLm5lYXJfbG9zc2xlc3MgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY29uZmlnLmxvc3NsZXNzID0gMTsgIC8vIHVzZSBuZWFyLWxvc3NsZXNzIG9ubHkgd2l0aCBsb3NzbGVzcworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWhpbnQiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgICsrYzsKKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICJwaG90byIpKSB7CisgICAgICAgIGNvbmZpZy5pbWFnZV9oaW50ID0gV0VCUF9ISU5UX1BIT1RPOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJwaWN0dXJlIikpIHsKKyAgICAgICAgY29uZmlnLmltYWdlX2hpbnQgPSBXRUJQX0hJTlRfUElDVFVSRTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiZ3JhcGgiKSkgeworICAgICAgICBjb25maWcuaW1hZ2VfaGludCA9IFdFQlBfSElOVF9HUkFQSDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFVucmVjb2duaXplZCBpbWFnZSBoaW50OiAlc1xuIiwgYXJndltjXSk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc2l6ZSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnRhcmdldF9zaXplID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wc25yIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcudGFyZ2V0X1BTTlIgPSBFeFV0aWxHZXRGbG9hdChhcmd2WysrY10sICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc25zIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuc25zX3N0cmVuZ3RoID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1mIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuZmlsdGVyX3N0cmVuZ3RoID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hZiIpKSB7CisgICAgICBjb25maWcuYXV0b2ZpbHRlciA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItanBlZ19saWtlIikpIHsKKyAgICAgIGNvbmZpZy5lbXVsYXRlX2pwZWdfc2l6ZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbXQiKSkgeworICAgICAgKytjb25maWcudGhyZWFkX2xldmVsOyAgLy8gaW5jcmVhc2UgdGhyZWFkIGxldmVsCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG93X21lbW9yeSIpKSB7CisgICAgICBjb25maWcubG93X21lbW9yeSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc3Ryb25nIikpIHsKKyAgICAgIGNvbmZpZy5maWx0ZXJfdHlwZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9zdHJvbmciKSkgeworICAgICAgY29uZmlnLmZpbHRlcl90eXBlID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zaGFycG5lc3MiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5maWx0ZXJfc2hhcnBuZXNzID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zaGFycF95dXYiKSkgeworICAgICAgY29uZmlnLnVzZV9zaGFycF95dXYgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBhc3MiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5wYXNzID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcmUiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5wcmVwcm9jZXNzaW5nID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1zZWdtZW50cyIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnNlZ21lbnRzID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wYXJ0aXRpb25fbGltaXQiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGNvbmZpZy5wYXJ0aXRpb25fbGltaXQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1hcCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgcGljdHVyZS5leHRyYV9pbmZvX3R5cGUgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWNyb3AiKSAmJiBjIDwgYXJnYyAtIDQpIHsKKyAgICAgIGNyb3AgPSAxOworICAgICAgY3JvcF94ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNyb3BfeSA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBjcm9wX3cgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY3JvcF9oID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1yZXNpemUiKSAmJiBjIDwgYXJnYyAtIDIpIHsKKyAgICAgIHJlc2l6ZV93ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIHJlc2l6ZV9oID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyNpZm5kZWYgV0VCUF9ETEwKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2FzbSIpKSB7CisgICAgICBWUDhHZXRDUFVJbmZvID0gTlVMTDsKKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgY29uc3QgaW50IHZlcnNpb24gPSBXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAgICAgIHByaW50ZigiJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKHZlcnNpb24gPj4gMTYpICYgMHhmZiwgKHZlcnNpb24gPj4gOCkgJiAweGZmLCB2ZXJzaW9uICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wcm9ncmVzcyIpKSB7CisgICAgICBzaG93X3Byb2dyZXNzID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xdWlldCIpKSB7CisgICAgICBxdWlldCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcHJlc2V0IikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBXZWJQUHJlc2V0IHByZXNldDsKKyAgICAgICsrYzsKKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICJkZWZhdWx0IikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfREVGQVVMVDsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAicGhvdG8iKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9QSE9UTzsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAicGljdHVyZSIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX1BJQ1RVUkU7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgImRyYXdpbmciKSkgeworICAgICAgICBwcmVzZXQgPSBXRUJQX1BSRVNFVF9EUkFXSU5HOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICJpY29uIikpIHsKKyAgICAgICAgcHJlc2V0ID0gV0VCUF9QUkVTRVRfSUNPTjsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAidGV4dCIpKSB7CisgICAgICAgIHByZXNldCA9IFdFQlBfUFJFU0VUX1RFWFQ7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbnJlY29nbml6ZWQgcHJlc2V0OiAlc1xuIiwgYXJndltjXSk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBpZiAoIVdlYlBDb25maWdQcmVzZXQoJmNvbmZpZywgcHJlc2V0LCBjb25maWcucXVhbGl0eSkpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ291bGQgaW5pdGlhbGl6ZSBjb25maWd1cmF0aW9uIHdpdGggcHJlc2V0LlxuIik7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWV0YWRhdGEiKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyKiBvcHRpb247CisgICAgICAgIGludCBmbGFnOworICAgICAgfSBrVG9rZW5zW10gPSB7CisgICAgICAgIHsgImFsbCIsICBNRVRBREFUQV9BTEwgfSwKKyAgICAgICAgeyAibm9uZSIsIDAgfSwKKyAgICAgICAgeyAiZXhpZiIsIE1FVEFEQVRBX0VYSUYgfSwKKyAgICAgICAgeyAiaWNjIiwgIE1FVEFEQVRBX0lDQyB9LAorICAgICAgICB7ICJ4bXAiLCAgTUVUQURBVEFfWE1QIH0sCisgICAgICB9OworICAgICAgY29uc3Qgc2l6ZV90IGtOdW1Ub2tlbnMgPSBzaXplb2Yoa1Rva2VucykgLyBzaXplb2Yoa1Rva2Vuc1swXSk7CisgICAgICBjb25zdCBjaGFyKiBzdGFydCA9IGFyZ3ZbKytjXTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKworICAgICAgd2hpbGUgKHN0YXJ0IDwgZW5kKSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICBjb25zdCBjaGFyKiB0b2tlbiA9IHN0cmNocihzdGFydCwgJywnKTsKKyAgICAgICAgaWYgKHRva2VuID09IE5VTEwpIHRva2VuID0gZW5kOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBrTnVtVG9rZW5zOyArK2kpIHsKKyAgICAgICAgICBpZiAoKHNpemVfdCkodG9rZW4gLSBzdGFydCkgPT0gc3RybGVuKGtUb2tlbnNbaV0ub3B0aW9uKSAmJgorICAgICAgICAgICAgICAhc3RybmNtcChzdGFydCwga1Rva2Vuc1tpXS5vcHRpb24sIHN0cmxlbihrVG9rZW5zW2ldLm9wdGlvbikpKSB7CisgICAgICAgICAgICBpZiAoa1Rva2Vuc1tpXS5mbGFnICE9IDApIHsKKyAgICAgICAgICAgICAga2VlcF9tZXRhZGF0YSB8PSBrVG9rZW5zW2ldLmZsYWc7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBrZWVwX21ldGFkYXRhID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaSA9PSBrTnVtVG9rZW5zKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5rbm93biBtZXRhZGF0YSB0eXBlICclLipzJ1xuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpKHRva2VuIC0gc3RhcnQpLCBzdGFydCk7CisgICAgICAgICAgSGVscExvbmcoKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RhcnQgPSB0b2tlbiArIDE7CisgICAgICB9CisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgICAgICBpZiAoa2VlcF9tZXRhZGF0YSAhPSAwICYmIGtlZXBfbWV0YWRhdGEgIT0gTUVUQURBVEFfSUNDKSB7CisgICAgICAgIC8vIFRPRE8oanplcm4pOiByZW1vdmUgd2hlbiAtbWV0YWRhdGEgaXMgc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogb25seSBJQ0MgcHJvZmlsZSBleHRyYWN0aW9uIGlzIGN1cnJlbnRseSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0hXG4iKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXYiKSkgeworICAgICAgdmVyYm9zZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItLSIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSBpbl9maWxlID0gYXJndlsrK2NdOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChhcmd2W2NdWzBdID09ICctJykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICBIZWxwTG9uZygpOworICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICBpbl9maWxlID0gYXJndltjXTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgIEhlbHBMb25nKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorICB9CisgIGlmIChpbl9maWxlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIVxuIik7CisgICAgSGVscFNob3J0KCk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICh1c2VfbG9zc2xlc3NfcHJlc2V0ID09IDEpIHsKKyAgICBpZiAoIVdlYlBDb25maWdMb3NzbGVzc1ByZXNldCgmY29uZmlnLCBsb3NzbGVzc19wcmVzZXQpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbG9zc2xlc3MgcHJlc2V0ICgteiAlZClcbiIsIGxvc3NsZXNzX3ByZXNldCk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCisgIC8vIENoZWNrIGZvciB1bnN1cHBvcnRlZCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgbG9zc2xlc3MgbW9kZSBhbmQgbG9nCisgIC8vIHdhcm5pbmcgZm9yIHN1Y2ggb3B0aW9ucy4KKyAgaWYgKCFxdWlldCAmJiBjb25maWcubG9zc2xlc3MgPT0gMSkgeworICAgIGlmIChjb25maWcudGFyZ2V0X3NpemUgPiAwIHx8IGNvbmZpZy50YXJnZXRfUFNOUiA+IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRW5jb2RpbmcgZm9yIHNwZWNpZmllZCBzaXplIG9yIFBTTlIgaXMgbm90IHN1cHBvcnRlZCIKKyAgICAgICAgICAgICAgICAgICAgICAiIGZvciBsb3NzbGVzcyBlbmNvZGluZy4gSWdub3Jpbmcgc3VjaCBvcHRpb24ocykhXG4iKTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy5wYXJ0aXRpb25fbGltaXQgPiAwKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlBhcnRpdGlvbiBsaW1pdCBvcHRpb24gaXMgbm90IHJlcXVpcmVkIGZvciBsb3NzbGVzcyIKKyAgICAgICAgICAgICAgICAgICAgICAiIGVuY29kaW5nLiBJZ25vcmluZyB0aGlzIG9wdGlvbiFcbiIpOworICAgIH0KKyAgfQorICAvLyBJZiBhIHRhcmdldCBzaXplIG9yIFBTTlIgd2FzIGdpdmVuLCBidXQgc29tZWhvdyB0aGUgLXBhc3Mgb3B0aW9uIHdhcworICAvLyBvbWl0dGVkLCBmb3JjZSBhIHJlYXNvbmFibGUgdmFsdWUuCisgIGlmIChjb25maWcudGFyZ2V0X3NpemUgPiAwIHx8IGNvbmZpZy50YXJnZXRfUFNOUiA+IDApIHsKKyAgICBpZiAoY29uZmlnLnBhc3MgPT0gMSkgY29uZmlnLnBhc3MgPSA2OworICB9CisKKyAgaWYgKCFXZWJQVmFsaWRhdGVDb25maWcoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgLy8gUmVhZCB0aGUgaW5wdXQuIFdlIG5lZWQgdG8gZGVjaWRlIGlmIHdlIHByZWZlciBBUkdCIG9yIFlVVkEKKyAgLy8gc2FtcGxlcywgZGVwZW5kaW5nIG9uIHRoZSBleHBlY3RlZCBjb21wcmVzc2lvbiBtb2RlICh0aGlzIHNhdmVzCisgIC8vIHNvbWUgY29udmVyc2lvbiBzdGVwcykuCisgIHBpY3R1cmUudXNlX2FyZ2IgPSAoY29uZmlnLmxvc3NsZXNzIHx8IGNvbmZpZy51c2Vfc2hhcnBfeXV2IHx8CisgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnByZXByb2Nlc3NpbmcgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgY3JvcCB8fCAocmVzaXplX3cgfCByZXNpemVfaCkgPiAwKTsKKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBTdG9wd2F0Y2hSZXNldCgmc3RvcF93YXRjaCk7CisgIH0KKyAgaWYgKCFSZWFkUGljdHVyZShpbl9maWxlLCAmcGljdHVyZSwga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAoa2VlcF9tZXRhZGF0YSA9PSAwKSA/IE5VTEwgOiAmbWV0YWRhdGEpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHJlYWQgaW5wdXQgcGljdHVyZSBmaWxlICclcydcbiIsIGluX2ZpbGUpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgcGljdHVyZS5wcm9ncmVzc19ob29rID0gKHNob3dfcHJvZ3Jlc3MgJiYgIXF1aWV0KSA/IFByb2dyZXNzUmVwb3J0IDogTlVMTDsKKworICBpZiAoYmxlbmRfYWxwaGEpIHsKKyAgICBXZWJQQmxlbmRBbHBoYSgmcGljdHVyZSwgYmFja2dyb3VuZF9jb2xvcik7CisgIH0KKworICBpZiAodmVyYm9zZSkgeworICAgIGNvbnN0IGRvdWJsZSByZWFkX3RpbWUgPSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoJnN0b3Bfd2F0Y2gpOworICAgIGZwcmludGYoc3RkZXJyLCAiVGltZSB0byByZWFkIGlucHV0OiAlLjNmc1xuIiwgcmVhZF90aW1lKTsKKyAgfQorCisgIC8vIE9wZW4gdGhlIG91dHB1dAorICBpZiAob3V0X2ZpbGUgIT0gTlVMTCkgeworICAgIGNvbnN0IGludCB1c2Vfc3Rkb3V0ID0gIXN0cmNtcChvdXRfZmlsZSwgIi0iKTsKKyAgICBvdXQgPSB1c2Vfc3Rkb3V0ID8gSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShzdGRvdXQpIDogZm9wZW4ob3V0X2ZpbGUsICJ3YiIpOworICAgIGlmIChvdXQgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJyVzJ1xuIiwgb3V0X2ZpbGUpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFzaG9ydF9vdXRwdXQgJiYgIXF1aWV0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2F2aW5nIGZpbGUgJyVzJ1xuIiwgb3V0X2ZpbGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoa2VlcF9tZXRhZGF0YSA9PSAwKSB7CisgICAgICBwaWN0dXJlLndyaXRlciA9IE15V3JpdGVyOworICAgICAgcGljdHVyZS5jdXN0b21fcHRyID0gKHZvaWQqKW91dDsKKyAgICB9IGVsc2UgeworICAgICAgcGljdHVyZS53cml0ZXIgPSBXZWJQTWVtb3J5V3JpdGU7CisgICAgICBwaWN0dXJlLmN1c3RvbV9wdHIgPSAodm9pZCopJm1lbW9yeV93cml0ZXI7CisgICAgfQorICB9IGVsc2UgeworICAgIG91dCA9IE5VTEw7CisgICAgaWYgKCFxdWlldCAmJiAhc2hvcnRfb3V0cHV0KSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk5vIG91dHB1dCBmaWxlIHNwZWNpZmllZCAobm8gLW8gZmxhZykuIEVuY29kaW5nIHdpbGxcbiIpOworICAgICAgZnByaW50ZihzdGRlcnIsICJiZSBwZXJmb3JtZWQsIGJ1dCBpdHMgcmVzdWx0cyBkaXNjYXJkZWQuXG5cbiIpOworICAgIH0KKyAgfQorICBpZiAoIXF1aWV0KSB7CisgICAgcGljdHVyZS5zdGF0cyA9ICZzdGF0czsKKyAgICBwaWN0dXJlLnVzZXJfZGF0YSA9ICh2b2lkKilpbl9maWxlOworICB9CisKKyAgLy8gQ3JvcCAmIHJlc2l6ZS4KKyAgaWYgKHZlcmJvc2UpIHsKKyAgICBTdG9wd2F0Y2hSZXNldCgmc3RvcF93YXRjaCk7CisgIH0KKyAgaWYgKGNyb3AgIT0gMCkgeworICAgIC8vIFdlIHVzZSBzZWxmLWNyb3BwaW5nIHVzaW5nIGEgdmlldy4KKyAgICBpZiAoIVdlYlBQaWN0dXJlVmlldygmcGljdHVyZSwgY3JvcF94LCBjcm9wX3ksIGNyb3BfdywgY3JvcF9oLCAmcGljdHVyZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENhbm5vdCBjcm9wIHBpY3R1cmVcbiIpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgIH0KKyAgaWYgKChyZXNpemVfdyB8IHJlc2l6ZV9oKSA+IDApIHsKKyAgICBpZiAoIVdlYlBQaWN0dXJlUmVzY2FsZSgmcGljdHVyZSwgcmVzaXplX3csIHJlc2l6ZV9oKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHJlc2l6ZSBwaWN0dXJlXG4iKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisgIGlmICh2ZXJib3NlICYmIChjcm9wICE9IDAgfHwgKHJlc2l6ZV93IHwgcmVzaXplX2gpID4gMCkpIHsKKyAgICBjb25zdCBkb3VibGUgcHJlcHJvY190aW1lID0gU3RvcHdhdGNoUmVhZEFuZFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWUgdG8gY3JvcC9yZXNpemUgcGljdHVyZTogJS4zZnNcbiIsIHByZXByb2NfdGltZSk7CisgIH0KKworICBpZiAocGljdHVyZS5leHRyYV9pbmZvX3R5cGUgPiAwKSB7CisgICAgQWxsb2NFeHRyYUluZm8oJnBpY3R1cmUpOworICB9CisgIGlmIChwcmludF9kaXN0b3J0aW9uID49IDApIHsgIC8vIFNhdmUgb3JpZ2luYWwgcGljdHVyZSBmb3IgbGF0ZXIgY29tcGFyaXNvbgorICAgIFdlYlBQaWN0dXJlQ29weSgmcGljdHVyZSwgJm9yaWdpbmFsX3BpY3R1cmUpOworICB9CisKKyAgLy8gQ29tcHJlc3MuCisgIGlmICh2ZXJib3NlKSB7CisgICAgU3RvcHdhdGNoUmVzZXQoJnN0b3Bfd2F0Y2gpOworICB9CisgIGlmICghV2ViUEVuY29kZSgmY29uZmlnLCAmcGljdHVyZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgZW5jb2RlIHBpY3R1cmUgYXMgV2ViUFxuIik7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjb2RlOiAlZCAoJXMpXG4iLAorICAgICAgICAgICAgcGljdHVyZS5lcnJvcl9jb2RlLCBrRXJyb3JNZXNzYWdlc1twaWN0dXJlLmVycm9yX2NvZGVdKTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGlmICh2ZXJib3NlKSB7CisgICAgY29uc3QgZG91YmxlIGVuY29kZV90aW1lID0gU3RvcHdhdGNoUmVhZEFuZFJlc2V0KCZzdG9wX3dhdGNoKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlRpbWUgdG8gZW5jb2RlIHBpY3R1cmU6ICUuM2ZzXG4iLCBlbmNvZGVfdGltZSk7CisgIH0KKworICAvLyBXcml0ZSBpbmZvCisgIGlmIChkdW1wX2ZpbGUpIHsKKyAgICBpZiAocGljdHVyZS51c2VfYXJnYikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBjYW4ndCBkdW1wIGZpbGUgKC1kIG9wdGlvbikgaW4gbG9zc2xlc3MgbW9kZS4iKTsKKyAgICB9IGVsc2UgaWYgKCFEdW1wUGljdHVyZSgmcGljdHVyZSwgZHVtcF9maWxlKSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nLCBjb3VsZG4ndCBkdW1wIHBpY3R1cmUgJXNcbiIsIGR1bXBfZmlsZSk7CisgICAgfQorICB9CisKKyAgaWYgKGtlZXBfbWV0YWRhdGEgIT0gMCkgeworICAgIGlmIChvdXQgIT0gTlVMTCkgeworICAgICAgaWYgKCFXcml0ZVdlYlBXaXRoTWV0YWRhdGEob3V0LCAmcGljdHVyZSwgJm1lbW9yeV93cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWV0YWRhdGEsIGtlZXBfbWV0YWRhdGEsICZtZXRhZGF0YV93cml0dGVuKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgV2ViUCBmaWxlIHdpdGggbWV0YWRhdGEhXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gb3V0cHV0IGlzIGRpc2FibGVkLCBqdXN0IGRpc3BsYXkgdGhlIG1ldGFkYXRhIHN0YXRzLgorICAgICAgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkOworICAgICAgICBpbnQgZmxhZzsKKyAgICAgIH0gKml0ZXIsIGluZm9bXSA9IHsKKyAgICAgICAgeyAmbWV0YWRhdGEuZXhpZiwgTUVUQURBVEFfRVhJRiB9LAorICAgICAgICB7ICZtZXRhZGF0YS5pY2NwLCBNRVRBREFUQV9JQ0MgfSwKKyAgICAgICAgeyAmbWV0YWRhdGEueG1wLCBNRVRBREFUQV9YTVAgfSwKKyAgICAgICAgeyBOVUxMLCAwIH0KKyAgICAgIH07CisgICAgICB1aW50MzJfdCB1bnVzZWQxID0gMDsKKyAgICAgIHVpbnQ2NF90IHVudXNlZDIgPSAwOworCisgICAgICBmb3IgKGl0ZXIgPSBpbmZvOyBpdGVyLT5wYXlsb2FkICE9IE5VTEw7ICsraXRlcikgeworICAgICAgICBpZiAoVXBkYXRlRmxhZ3NBbmRTaXplKGl0ZXItPnBheWxvYWQsICEhKGtlZXBfbWV0YWRhdGEgJiBpdGVyLT5mbGFnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmdW51c2VkMSwgJnVudXNlZDIpKSB7CisgICAgICAgICAgbWV0YWRhdGFfd3JpdHRlbiB8PSBpdGVyLT5mbGFnOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKCFxdWlldCkgeworICAgIGlmICghc2hvcnRfb3V0cHV0IHx8IHByaW50X2Rpc3RvcnRpb24gPCAwKSB7CisgICAgICBpZiAoY29uZmlnLmxvc3NsZXNzKSB7CisgICAgICAgIFByaW50RXh0cmFJbmZvTG9zc2xlc3MoJnBpY3R1cmUsIHNob3J0X291dHB1dCwgaW5fZmlsZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQcmludEV4dHJhSW5mb0xvc3N5KCZwaWN0dXJlLCBzaG9ydF9vdXRwdXQsIGNvbmZpZy5sb3dfbWVtb3J5LCBpbl9maWxlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFzaG9ydF9vdXRwdXQgJiYgcGljdHVyZS5leHRyYV9pbmZvX3R5cGUgPiAwKSB7CisgICAgICBQcmludE1hcEluZm8oJnBpY3R1cmUpOworICAgIH0KKyAgICBpZiAocHJpbnRfZGlzdG9ydGlvbiA+PSAwKSB7ICAgIC8vIHByaW50IGRpc3RvcnRpb24KKyAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBkaXN0b3J0aW9uX25hbWVzW10gPSB7ICJQU05SIiwgIlNTSU0iLCAiTFNJTSIgfTsKKyAgICAgIGZsb2F0IHZhbHVlc1s1XTsKKyAgICAgIGlmICghV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCZwaWN0dXJlLCAmb3JpZ2luYWxfcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50X2Rpc3RvcnRpb24sIHZhbHVlcykpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBjb21wdXRpbmcgdGhlIGRpc3RvcnRpb24uXG4iKTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIGlmICghc2hvcnRfb3V0cHV0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6ICIsIGRpc3RvcnRpb25fbmFtZXNbcHJpbnRfZGlzdG9ydGlvbl0pOworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkI6JS4yZiBHOiUuMmYgUjolLjJmIEE6JS4yZiAgVG90YWw6JS4yZlxuIiwKKyAgICAgICAgICAgICAgICB2YWx1ZXNbMF0sIHZhbHVlc1sxXSwgdmFsdWVzWzJdLCB2YWx1ZXNbM10sIHZhbHVlc1s0XSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiU3ZCAlLjRmXG4iLCBwaWN0dXJlLnN0YXRzLT5jb2RlZF9zaXplLCB2YWx1ZXNbNF0pOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXNob3J0X291dHB1dCkgeworICAgICAgUHJpbnRNZXRhZGF0YUluZm8oJm1ldGFkYXRhLCBtZXRhZGF0YV93cml0dGVuKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuX3ZhbHVlID0gMDsKKworIEVycm9yOgorICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJm1lbW9yeV93cml0ZXIpOworICBmcmVlKHBpY3R1cmUuZXh0cmFfaW5mbyk7CisgIE1ldGFkYXRhRnJlZSgmbWV0YWRhdGEpOworICBXZWJQUGljdHVyZUZyZWUoJnBpY3R1cmUpOworICBXZWJQUGljdHVyZUZyZWUoJm9yaWdpbmFsX3BpY3R1cmUpOworICBpZiAob3V0ICE9IE5VTEwgJiYgb3V0ICE9IHN0ZG91dCkgeworICAgIGZjbG9zZShvdXQpOworICB9CisKKyAgcmV0dXJuIHJldHVybl92YWx1ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2R3ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9kd2VicC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDA2OWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9kd2VicC5jCkBAIC0wLDAgKzEsNDE3IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIENvbW1hbmQtbGluZSB0b29sIGZvciBkZWNvZGluZyBhIFdlYlAgaW1hZ2UuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZV9lbmMuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL3dlYnBkZWMuaCIKKyNpbmNsdWRlICIuL3N0b3B3YXRjaC5oIgorCitzdGF0aWMgaW50IHZlcmJvc2UgPSAwOworc3RhdGljIGludCBxdWlldCA9IDA7CisjaWZuZGVmIFdFQlBfRExMCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK2V4dGVybiB2b2lkKiBWUDhHZXRDUFVJbmZvOyAgIC8vIG9wYXF1ZSBmb3J3YXJkIGRlY2xhcmF0aW9uLgorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisjZW5kaWYgIC8vIFdFQlBfRExMCisKKworc3RhdGljIGludCBTYXZlT3V0cHV0KGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQsIGNvbnN0IGNoYXIqIGNvbnN0IG91dF9maWxlKSB7CisgIGNvbnN0IGludCB1c2Vfc3Rkb3V0ID0gKG91dF9maWxlICE9IE5VTEwpICYmICFzdHJjbXAob3V0X2ZpbGUsICItIik7CisgIGludCBvayA9IDE7CisgIFN0b3B3YXRjaCBzdG9wX3dhdGNoOworCisgIGlmICh2ZXJib3NlKSB7CisgICAgU3RvcHdhdGNoUmVzZXQoJnN0b3Bfd2F0Y2gpOworICB9CisgIG9rID0gV2ViUFNhdmVJbWFnZShidWZmZXIsIGZvcm1hdCwgb3V0X2ZpbGUpOworCisgIGlmIChvaykgeworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIGlmICh1c2Vfc3Rkb3V0KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2F2ZWQgdG8gc3Rkb3V0XG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2F2ZWQgZmlsZSAlc1xuIiwgb3V0X2ZpbGUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgY29uc3QgZG91YmxlIHdyaXRlX3RpbWUgPSBTdG9wd2F0Y2hSZWFkQW5kUmVzZXQoJnN0b3Bfd2F0Y2gpOworICAgICAgZnByaW50ZihzdGRlcnIsICJUaW1lIHRvIHdyaXRlIG91dHB1dDogJS4zZnNcbiIsIHdyaXRlX3RpbWUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodXNlX3N0ZG91dCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3cml0aW5nIHRvIHN0ZG91dCAhIVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBmaWxlICVzICEhXG4iLCBvdXRfZmlsZSk7CisgICAgfQorICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6IGR3ZWJwIGluX2ZpbGUgW29wdGlvbnNdIFstbyBvdXRfZmlsZV1cblxuIgorICAgICAgICAgIkRlY29kZXMgdGhlIFdlYlAgaW1hZ2UgZmlsZSB0byBQTkcgZm9ybWF0IFtEZWZhdWx0XVxuIgorICAgICAgICAgIlVzZSBmb2xsb3dpbmcgb3B0aW9ucyB0byBjb252ZXJ0IGludG8gYWx0ZXJuYXRlIGltYWdlIGZvcm1hdHM6XG4iCisgICAgICAgICAiICAtcGFtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgUkdCQSBzYW1wbGVzIGFzIGEgY29sb3IgUEFNXG4iCisgICAgICAgICAiICAtcHBtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgUkdCIHNhbXBsZXMgYXMgYSBjb2xvciBQUE1cbiIKKyAgICAgICAgICIgIC1ibXAgLi4uLi4uLi4uIHNhdmUgYXMgdW5jb21wcmVzc2VkIEJNUCBmb3JtYXRcbiIKKyAgICAgICAgICIgIC10aWZmIC4uLi4uLi4uIHNhdmUgYXMgdW5jb21wcmVzc2VkIFRJRkYgZm9ybWF0XG4iCisgICAgICAgICAiICAtcGdtIC4uLi4uLi4uLiBzYXZlIHRoZSByYXcgWVVWIHNhbXBsZXMgYXMgYSBncmF5c2NhbGUgUEdNXG4iCisgICAgICAgICAiICAgICAgICAgICAgICAgICBmaWxlIHdpdGggSU1DNCBsYXlvdXRcbiIKKyAgICAgICAgICIgIC15dXYgLi4uLi4uLi4uIHNhdmUgdGhlIHJhdyBZVVYgc2FtcGxlcyBpbiBmbGF0IGxheW91dFxuIgorICAgICAgICAgIlxuIgorICAgICAgICAgIiBPdGhlciBvcHRpb25zIGFyZTpcbiIKKyAgICAgICAgICIgIC12ZXJzaW9uIC4uLi4uIHByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0XG4iCisgICAgICAgICAiICAtbm9mYW5jeSAuLi4uLiBkb24ndCB1c2UgdGhlIGZhbmN5IFlVVjQyMCB1cHNjYWxlclxuIgorICAgICAgICAgIiAgLW5vZmlsdGVyIC4uLi4gZGlzYWJsZSBpbi1sb29wIGZpbHRlcmluZ1xuIgorICAgICAgICAgIiAgLW5vZGl0aGVyIC4uLi4gZGlzYWJsZSBkaXRoZXJpbmdcbiIKKyAgICAgICAgICIgIC1kaXRoZXIgPGQ+IC4uIGRpdGhlcmluZyBzdHJlbmd0aCAoaW4gMC4uMTAwKVxuIgorICAgICAgICAgIiAgLWFscGhhX2RpdGhlciAgdXNlIGFscGhhLXBsYW5lIGRpdGhlcmluZyBpZiBuZWVkZWRcbiIKKyAgICAgICAgICIgIC1tdCAuLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmdcbiIKKyAgICAgICAgICIgIC1jcm9wIDx4PiA8eT4gPHc+IDxoPiAuLi4gY3JvcCBvdXRwdXQgd2l0aCB0aGUgZ2l2ZW4gcmVjdGFuZ2xlXG4iCisgICAgICAgICAiICAtcmVzaXplIDx3PiA8aD4gLi4uLi4uLi4uIHNjYWxlIHRoZSBvdXRwdXQgKCphZnRlciogYW55IGNyb3BwaW5nKVxuIgorICAgICAgICAgIiAgLWZsaXAgLi4uLi4uLi4gZmxpcCB0aGUgb3V0cHV0IHZlcnRpY2FsbHlcbiIKKyAgICAgICAgICIgIC1hbHBoYSAuLi4uLi4uIG9ubHkgc2F2ZSB0aGUgYWxwaGEgcGxhbmVcbiIKKyAgICAgICAgICIgIC1pbmNyZW1lbnRhbCAuIHVzZSBpbmNyZW1lbnRhbCBkZWNvZGluZyAodXNlZnVsIGZvciB0ZXN0cylcbiIKKyAgICAgICAgICIgIC1oIC4uLi4uLi4uLi4uIHRoaXMgaGVscCBtZXNzYWdlXG4iCisgICAgICAgICAiICAtdiAuLi4uLi4uLi4uLiB2ZXJib3NlIChlLmcuIHByaW50IGVuY29kaW5nL2RlY29kaW5nIHRpbWVzKVxuIgorICAgICAgICAgIiAgLXF1aWV0IC4uLi4uLi4gcXVpZXQgbW9kZSwgZG9uJ3QgcHJpbnQgYW55dGhpbmdcbiIKKyNpZm5kZWYgV0VCUF9ETEwKKyAgICAgICAgICIgIC1ub2FzbSAuLi4uLi4uIGRpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnNcbiIKKyNlbmRpZgorICAgICAgICApOworfQorCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Zvcm1hdFR5cGVbXSA9IHsKKyAgInVuc3BlY2lmaWVkIiwgImxvc3N5IiwgImxvc3NsZXNzIgorfTsKKworc3RhdGljIHVpbnQ4X3QqIEFsbG9jYXRlRXh0ZXJuYWxCdWZmZXIoV2ViUERlY29kZXJDb25maWcqIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfZXh0ZXJuYWxfbWVtb3J5KSB7CisgIHVpbnQ4X3QqIGV4dGVybmFsX2J1ZmZlciA9IE5VTEw7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIgPSAmY29uZmlnLT5vdXRwdXQ7CisgIGludCB3ID0gY29uZmlnLT5pbnB1dC53aWR0aDsKKyAgaW50IGggPSBjb25maWctPmlucHV0LmhlaWdodDsKKyAgaWYgKGNvbmZpZy0+b3B0aW9ucy51c2Vfc2NhbGluZykgeworICAgIHcgPSBjb25maWctPm9wdGlvbnMuc2NhbGVkX3dpZHRoOworICAgIGggPSBjb25maWctPm9wdGlvbnMuc2NhbGVkX2hlaWdodDsKKyAgfSBlbHNlIGlmIChjb25maWctPm9wdGlvbnMudXNlX2Nyb3BwaW5nKSB7CisgICAgdyA9IGNvbmZpZy0+b3B0aW9ucy5jcm9wX3dpZHRoOworICAgIGggPSBjb25maWctPm9wdGlvbnMuY3JvcF9oZWlnaHQ7CisgIH0KKyAgaWYgKGZvcm1hdCA+PSBSR0IgJiYgZm9ybWF0IDw9IHJnYkFfNDQ0NCkgeworICAgIGNvbnN0IGludCBicHAgPSAoZm9ybWF0ID09IFJHQiB8fCBmb3JtYXQgPT0gQkdSKSA/IDMKKyAgICAgICAgICAgICAgICAgIDogKGZvcm1hdCA9PSBSR0JBXzQ0NDQgfHwgZm9ybWF0ID09IHJnYkFfNDQ0NCB8fAorICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID09IFJHQl81NjUpID8gMgorICAgICAgICAgICAgICAgICAgOiA0OworICAgIHVpbnQzMl90IHN0cmlkZSA9IGJwcCAqIHcgKyA3OyAgIC8vIDwtIGp1c3QgZm9yIGV4ZXJjaXNpbmcKKyAgICBleHRlcm5hbF9idWZmZXIgPSAodWludDhfdCopbWFsbG9jKHN0cmlkZSAqIGgpOworICAgIGlmIChleHRlcm5hbF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnN0cmlkZSA9IHN0cmlkZTsKKyAgICBvdXRwdXRfYnVmZmVyLT51LlJHQkEuc2l6ZSA9IHN0cmlkZSAqIGg7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnJnYmEgPSBleHRlcm5hbF9idWZmZXI7CisgIH0gZWxzZSB7ICAgIC8vIFlVViBhbmQgWVVWQQorICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUob3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSk7CisgICAgdWludDhfdCogdG1wOworICAgIHVpbnQzMl90IHN0cmlkZSA9IHcgKyAzOworICAgIHVpbnQzMl90IHV2X3N0cmlkZSA9ICh3ICsgMSkgLyAyICsgMTM7CisgICAgdWludDMyX3QgdG90YWxfc2l6ZSA9IHN0cmlkZSAqIGggKiAoaGFzX2FscGhhID8gMiA6IDEpCisgICAgICAgICAgICAgICAgICAgICAgICArIDIgKiB1dl9zdHJpZGUgKiAoaCArIDEpIC8gMjsKKyAgICBhc3NlcnQoZm9ybWF0ID49IFlVViAmJiBmb3JtYXQgPD0gWVVWQSk7CisgICAgZXh0ZXJuYWxfYnVmZmVyID0gKHVpbnQ4X3QqKW1hbGxvYyh0b3RhbF9zaXplKTsKKyAgICBpZiAoZXh0ZXJuYWxfYnVmZmVyID09IE5VTEwpIHJldHVybiBOVUxMOworICAgIHRtcCA9IGV4dGVybmFsX2J1ZmZlcjsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueSA9IHRtcDsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueV9zdHJpZGUgPSBzdHJpZGU7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnlfc2l6ZSA9IHN0cmlkZSAqIGg7CisgICAgdG1wICs9IG91dHB1dF9idWZmZXItPnUuWVVWQS55X3NpemU7CisgICAgaWYgKGhhc19hbHBoYSkgeworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmEgPSB0bXA7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zdHJpZGUgPSBzdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zaXplID0gc3RyaWRlICogaDsKKyAgICAgIHRtcCArPSBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zaXplOworICAgIH0gZWxzZSB7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYSA9IE5VTEw7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEuYV9zdHJpZGUgPSAwOworICAgIH0KKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudSA9IHRtcDsKKyAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudV9zdHJpZGUgPSB1dl9zdHJpZGU7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnVfc2l6ZSA9IHV2X3N0cmlkZSAqIChoICsgMSkgLyAyOworICAgIHRtcCArPSBvdXRwdXRfYnVmZmVyLT51LllVVkEudV9zaXplOworCisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnYgPSB0bXA7CisgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnZfc3RyaWRlID0gdXZfc3RyaWRlOworICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52X3NpemUgPSB1dl9zdHJpZGUgKiAoaCArIDEpIC8gMjsKKyAgICB0bXAgKz0gb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnZfc2l6ZTsKKyAgICBhc3NlcnQodG1wIDw9IGV4dGVybmFsX2J1ZmZlciArIHRvdGFsX3NpemUpOworICB9CisgIG91dHB1dF9idWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA9IHVzZV9leHRlcm5hbF9tZW1vcnk7CisgIHJldHVybiBleHRlcm5hbF9idWZmZXI7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgY2hhciAqaW5fZmlsZSA9IE5VTEw7CisgIGNvbnN0IGNoYXIgKm91dF9maWxlID0gTlVMTDsKKworICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIgPSAmY29uZmlnLm91dHB1dDsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBiaXRzdHJlYW0gPSAmY29uZmlnLmlucHV0OworICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQgPSBQTkc7CisgIHVpbnQ4X3QqIGV4dGVybmFsX2J1ZmZlciA9IE5VTEw7CisgIGludCB1c2VfZXh0ZXJuYWxfbWVtb3J5ID0gMDsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IE5VTEw7CisKKyAgaW50IGluY3JlbWVudGFsID0gMDsKKyAgaW50IGM7CisKKyAgaWYgKCFXZWJQSW5pdERlY29kZXJDb25maWcoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZvciAoYyA9IDE7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW8iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIG91dF9maWxlID0gYXJndlsrK2NdOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhIikpIHsKKyAgICAgIGZvcm1hdCA9IEFMUEhBX1BMQU5FX09OTFk7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9mYW5jeSIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy5ub19mYW5jeV91cHNhbXBsaW5nID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ub2ZpbHRlciIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy5ieXBhc3NfZmlsdGVyaW5nID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wYW0iKSkgeworICAgICAgZm9ybWF0ID0gUEFNOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBwbSIpKSB7CisgICAgICBmb3JtYXQgPSBQUE07CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItYm1wIikpIHsKKyAgICAgIGZvcm1hdCA9IEJNUDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi10aWZmIikpIHsKKyAgICAgIGZvcm1hdCA9IFRJRkY7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcXVpZXQiKSkgeworICAgICAgcXVpZXQgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXZlcnNpb24iKSkgeworICAgICAgY29uc3QgaW50IHZlcnNpb24gPSBXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgICAgIHByaW50ZigiJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKHZlcnNpb24gPj4gMTYpICYgMHhmZiwgKHZlcnNpb24gPj4gOCkgJiAweGZmLCB2ZXJzaW9uICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wZ20iKSkgeworICAgICAgZm9ybWF0ID0gUEdNOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXl1diIpKSB7CisgICAgICBmb3JtYXQgPSBSQVdfWVVWOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXBpeGVsX2Zvcm1hdCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uc3QgY2hhciogY29uc3QgZm10ID0gYXJndlsrK2NdOworICAgICAgaWYgICAgICAoIXN0cmNtcChmbXQsICJSR0IiKSkgIGZvcm1hdCA9IFJHQjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiUkdCQSIpKSBmb3JtYXQgPSBSR0JBOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJCR1IiKSkgIGZvcm1hdCA9IEJHUjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiQkdSQSIpKSBmb3JtYXQgPSBCR1JBOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJBUkdCIikpIGZvcm1hdCA9IEFSR0I7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIlJHQkFfNDQ0NCIpKSBmb3JtYXQgPSBSR0JBXzQ0NDQ7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIlJHQl81NjUiKSkgZm9ybWF0ID0gUkdCXzU2NTsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAicmdiQSIpKSBmb3JtYXQgPSByZ2JBOworICAgICAgZWxzZSBpZiAoIXN0cmNtcChmbXQsICJiZ3JBIikpIGZvcm1hdCA9IGJnckE7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIkFyZ2IiKSkgZm9ybWF0ID0gQXJnYjsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAicmdiQV80NDQ0IikpIGZvcm1hdCA9IHJnYkFfNDQ0NDsKKyAgICAgIGVsc2UgaWYgKCFzdHJjbXAoZm10LCAiWVVWIikpICBmb3JtYXQgPSBZVVY7CisgICAgICBlbHNlIGlmICghc3RyY21wKGZtdCwgIllVVkEiKSkgZm9ybWF0ID0gWVVWQTsKKyAgICAgIGVsc2UgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHBhcnNlIHBpeGVsX2Zvcm1hdCAlc1xuIiwgZm10KTsKKyAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWV4dGVybmFsX21lbW9yeSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgdXNlX2V4dGVybmFsX21lbW9yeSA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBwYXJzZV9lcnJvciB8PSAodXNlX2V4dGVybmFsX21lbW9yeSA+IDIgfHwgdXNlX2V4dGVybmFsX21lbW9yeSA8IDApOworICAgICAgaWYgKHBhcnNlX2Vycm9yKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3QgcGFyc2UgJ2V4dGVybmFsX21lbW9yeScgdmFsdWUgJXNcbiIsIGFyZ3ZbY10pOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW10IikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLnVzZV90aHJlYWRzID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1hbHBoYV9kaXRoZXIiKSkgeworICAgICAgY29uZmlnLm9wdGlvbnMuYWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoID0gMTAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vZGl0aGVyIikpIHsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmRpdGhlcmluZ19zdHJlbmd0aCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZGl0aGVyIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcub3B0aW9ucy5kaXRoZXJpbmdfc3RyZW5ndGggPQorICAgICAgICAgIEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItY3JvcCIpICYmIGMgPCBhcmdjIC0gNCkgeworICAgICAgY29uZmlnLm9wdGlvbnMudXNlX2Nyb3BwaW5nID0gMTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmNyb3BfbGVmdCAgID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmNyb3BfdG9wICAgID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmNyb3Bfd2lkdGggID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLmNyb3BfaGVpZ2h0ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCghc3RyY21wKGFyZ3ZbY10sICItc2NhbGUiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItcmVzaXplIikpICYmCisgICAgICAgICAgICAgICBjIDwgYXJnYyAtIDIpIHsgIC8vICctc2NhbGUnIGlzIGxlZnQgZm9yIGNvbXBhdGliaWxpdHkKKyAgICAgIGNvbmZpZy5vcHRpb25zLnVzZV9zY2FsaW5nID0gMTsKKyAgICAgIGNvbmZpZy5vcHRpb25zLnNjYWxlZF93aWR0aCAgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgY29uZmlnLm9wdGlvbnMuc2NhbGVkX2hlaWdodCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZmxpcCIpKSB7CisgICAgICBjb25maWcub3B0aW9ucy5mbGlwID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12IikpIHsKKyAgICAgIHZlcmJvc2UgPSAxOworI2lmbmRlZiBXRUJQX0RMTAorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vYXNtIikpIHsKKyAgICAgIFZQOEdldENQVUluZm8gPSBOVUxMOworI2VuZGlmCisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaW5jcmVtZW50YWwiKSkgeworICAgICAgaW5jcmVtZW50YWwgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLS0iKSkgeworICAgICAgaWYgKGMgPCBhcmdjIC0gMSkgaW5fZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYXJndltjXVswXSA9PSAnLScpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGluX2ZpbGUgPSBhcmd2W2NdOworICAgIH0KKworICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIGlmIChpbl9maWxlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIm1pc3NpbmcgaW5wdXQgZmlsZSEhXG4iKTsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgaWYgKHF1aWV0KSB2ZXJib3NlID0gMDsKKworICB7CisgICAgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBWUDhfU1RBVFVTX09LOworICAgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICAgIGlmICghTG9hZFdlYlAoaW5fZmlsZSwgJmRhdGEsICZkYXRhX3NpemUsIGJpdHN0cmVhbSkpIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgY2FzZSBQTkc6CisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBiaXRzdHJlYW0tPmhhc19hbHBoYSA/IE1PREVfQkdSQSA6IE1PREVfQkdSOworI2Vsc2UKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IGJpdHN0cmVhbS0+aGFzX2FscGhhID8gTU9ERV9SR0JBIDogTU9ERV9SR0I7CisjZW5kaWYKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBBTToKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCQTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBQTToKKyAgICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCOyAgLy8gZHJvcHMgYWxwaGEgZm9yIFBQTQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQk1QOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gYml0c3RyZWFtLT5oYXNfYWxwaGEgPyBNT0RFX0JHUkEgOiBNT0RFX0JHUjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFRJRkY6CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBiaXRzdHJlYW0tPmhhc19hbHBoYSA/IE1PREVfUkdCQSA6IE1PREVfUkdCOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgUEdNOgorICAgICAgY2FzZSBSQVdfWVVWOgorICAgICAgICBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gYml0c3RyZWFtLT5oYXNfYWxwaGEgPyBNT0RFX1lVVkEgOiBNT0RFX1lVVjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEFMUEhBX1BMQU5FX09OTFk6CisgICAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1lVVkE7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gZm9yY2VkIG1vZGVzOgorICAgICAgY2FzZSBSR0I6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQjsgYnJlYWs7CisgICAgICBjYXNlIFJHQkE6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7IGJyZWFrOworICAgICAgY2FzZSBCR1I6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0JHUjsgYnJlYWs7CisgICAgICBjYXNlIEJHUkE6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7IGJyZWFrOworICAgICAgY2FzZSBBUkdCOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9BUkdCOyBicmVhazsKKyAgICAgIGNhc2UgUkdCQV80NDQ0OiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0JBXzQ0NDQ7IGJyZWFrOworICAgICAgY2FzZSBSR0JfNTY1OiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9SR0JfNTY1OyBicmVhazsKKyAgICAgIGNhc2UgcmdiQTogb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfcmdiQTsgYnJlYWs7CisgICAgICBjYXNlIGJnckE6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX2JnckE7IGJyZWFrOworICAgICAgY2FzZSBBcmdiOiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9BcmdiOyBicmVhazsKKyAgICAgIGNhc2UgcmdiQV80NDQ0OiBvdXRwdXRfYnVmZmVyLT5jb2xvcnNwYWNlID0gTU9ERV9yZ2JBXzQ0NDQ7IGJyZWFrOworICAgICAgY2FzZSBZVVY6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1lVVjsgYnJlYWs7CisgICAgICBjYXNlIFlVVkE6IG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX1lVVkE7IGJyZWFrOworICAgICAgZGVmYXVsdDogZ290byBFeGl0OworICAgIH0KKworICAgIGlmICh1c2VfZXh0ZXJuYWxfbWVtb3J5ID4gMCAmJiBmb3JtYXQgPj0gUkdCKSB7CisgICAgICBleHRlcm5hbF9idWZmZXIgPSBBbGxvY2F0ZUV4dGVybmFsQnVmZmVyKCZjb25maWcsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2V4dGVybmFsX21lbW9yeSk7CisgICAgICBpZiAoZXh0ZXJuYWxfYnVmZmVyID09IE5VTEwpIGdvdG8gRXhpdDsKKyAgICB9CisKKyAgICB7CisgICAgICBTdG9wd2F0Y2ggc3RvcF93YXRjaDsKKyAgICAgIGlmICh2ZXJib3NlKSBTdG9wd2F0Y2hSZXNldCgmc3RvcF93YXRjaCk7CisKKyAgICAgIGlmIChpbmNyZW1lbnRhbCkgeworICAgICAgICBzdGF0dXMgPSBEZWNvZGVXZWJQSW5jcmVtZW50YWwoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0YXR1cyA9IERlY29kZVdlYlAoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnKTsKKyAgICAgIH0KKyAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBkZWNvZGVfdGltZSA9IFN0b3B3YXRjaFJlYWRBbmRSZXNldCgmc3RvcF93YXRjaCk7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGltZSB0byBkZWNvZGUgcGljdHVyZTogJS4zZnNcbiIsIGRlY29kZV90aW1lKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBvayA9IChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyk7CisgICAgaWYgKCFvaykgeworICAgICAgUHJpbnRXZWJQRXJyb3IoaW5fZmlsZSwgc3RhdHVzKTsKKyAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisgIH0KKworICBpZiAob3V0X2ZpbGUgIT0gTlVMTCkgeworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRGVjb2RlZCAlcy4gRGltZW5zaW9uczogJWQgeCAlZCAlcy4gRm9ybWF0OiAlcy4gIgorICAgICAgICAgICAgICAgICAgICAgICJOb3cgc2F2aW5nLi4uXG4iLAorICAgICAgICAgICAgICBpbl9maWxlLCBvdXRwdXRfYnVmZmVyLT53aWR0aCwgb3V0cHV0X2J1ZmZlci0+aGVpZ2h0LAorICAgICAgICAgICAgICBiaXRzdHJlYW0tPmhhc19hbHBoYSA/ICIgKHdpdGggYWxwaGEpIiA6ICIiLAorICAgICAgICAgICAgICBrRm9ybWF0VHlwZVtiaXRzdHJlYW0tPmZvcm1hdF0pOworICAgIH0KKyAgICBvayA9IFNhdmVPdXRwdXQob3V0cHV0X2J1ZmZlciwgZm9ybWF0LCBvdXRfZmlsZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKCFxdWlldCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJGaWxlICVzIGNhbiBiZSBkZWNvZGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAiKGRpbWVuc2lvbnM6ICVkIHggJWQgJXMuIEZvcm1hdDogJXMpLlxuIiwKKyAgICAgICAgICAgICAgaW5fZmlsZSwgb3V0cHV0X2J1ZmZlci0+d2lkdGgsIG91dHB1dF9idWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgYml0c3RyZWFtLT5oYXNfYWxwaGEgPyAiICh3aXRoIGFscGhhKSIgOiAiIiwKKyAgICAgICAgICAgICAga0Zvcm1hdFR5cGVbYml0c3RyZWFtLT5mb3JtYXRdKTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90aGluZyB3cml0dGVuOyAiCisgICAgICAgICAgICAgICAgICAgICAgInVzZSAtbyBmbGFnIHRvIHNhdmUgdGhlIHJlc3VsdCBhcyBlLmcuIFBORy5cbiIpOworICAgIH0KKyAgfQorIEV4aXQ6CisgIFdlYlBGcmVlRGVjQnVmZmVyKG91dHB1dF9idWZmZXIpOworICBmcmVlKCh2b2lkKilleHRlcm5hbF9idWZmZXIpOworICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgcmV0dXJuIG9rID8gMCA6IC0xOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVhMTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmMKQEAgLTAsMCArMSwxMjcgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVXRpbGl0eSBmdW5jdGlvbnMgdXNlZCBieSB0aGUgZXhhbXBsZSBwcm9ncmFtcy4KKy8vCisKKyNpbmNsdWRlICIuL2V4YW1wbGVfdXRpbC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvbXV4X3R5cGVzLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZyBwYXJzaW5nCisKK3VpbnQzMl90IEV4VXRpbEdldFVJbnQoY29uc3QgY2hhciogY29uc3QgdiwgaW50IGJhc2UsIGludCogY29uc3QgZXJyb3IpIHsKKyAgY2hhciogZW5kID0gTlVMTDsKKyAgY29uc3QgdWludDMyX3QgbiA9ICh2ICE9IE5VTEwpID8gKHVpbnQzMl90KXN0cnRvdWwodiwgJmVuZCwgYmFzZSkgOiAwdTsKKyAgaWYgKGVuZCA9PSB2ICYmIGVycm9yICE9IE5VTEwgJiYgISplcnJvcikgeworICAgICplcnJvciA9IDE7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgJyVzJyBpcyBub3QgYW4gaW50ZWdlci5cbiIsCisgICAgICAgICAgICAodiAhPSBOVUxMKSA/IHYgOiAiKG51bGwpIik7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKK2ludCBFeFV0aWxHZXRJbnQoY29uc3QgY2hhciogY29uc3QgdiwgaW50IGJhc2UsIGludCogY29uc3QgZXJyb3IpIHsKKyAgcmV0dXJuIChpbnQpRXhVdGlsR2V0VUludCh2LCBiYXNlLCBlcnJvcik7Cit9CisKK2ludCBFeFV0aWxHZXRJbnRzKGNvbnN0IGNoYXIqIHYsIGludCBiYXNlLCBpbnQgbWF4X291dHB1dCwgaW50IG91dHB1dFtdKSB7CisgIGludCBuLCBlcnJvciA9IDA7CisgIGZvciAobiA9IDA7IHYgIT0gTlVMTCAmJiBuIDwgbWF4X291dHB1dDsgKytuKSB7CisgICAgY29uc3QgaW50IHZhbHVlID0gRXhVdGlsR2V0SW50KHYsIGJhc2UsICZlcnJvcik7CisgICAgaWYgKGVycm9yKSByZXR1cm4gLTE7CisgICAgb3V0cHV0W25dID0gdmFsdWU7CisgICAgdiA9IHN0cmNocih2LCAnLCcpOworICAgIGlmICh2ICE9IE5VTEwpICsrdjsgICAvLyBza2lwIG92ZXIgdGhlIHRyYWlsaW5nICcsJworICB9CisgIHJldHVybiBuOworfQorCitmbG9hdCBFeFV0aWxHZXRGbG9hdChjb25zdCBjaGFyKiBjb25zdCB2LCBpbnQqIGNvbnN0IGVycm9yKSB7CisgIGNoYXIqIGVuZCA9IE5VTEw7CisgIGNvbnN0IGZsb2F0IGYgPSAodiAhPSBOVUxMKSA/IChmbG9hdClzdHJ0b2QodiwgJmVuZCkgOiAwLmY7CisgIGlmIChlbmQgPT0gdiAmJiBlcnJvciAhPSBOVUxMICYmICEqZXJyb3IpIHsKKyAgICAqZXJyb3IgPSAxOworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhICclcycgaXMgbm90IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLlxuIiwKKyAgICAgICAgICAgICh2ICE9IE5VTEwpID8gdiA6ICIobnVsbCkiKTsKKyAgfQorICByZXR1cm4gZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUmVzZXRDb21tYW5kTGluZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogYXJndltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgYXJncykgeworICBhc3NlcnQoYXJncyAhPSBOVUxMKTsKKyAgYXJncy0+YXJnY18gPSBhcmdjOworICBhcmdzLT5hcmd2XyA9IGFyZ3Y7CisgIGFyZ3MtPm93bl9hcmd2XyA9IDA7CisgIFdlYlBEYXRhSW5pdCgmYXJncy0+YXJndl9kYXRhXyk7Cit9CisKK3ZvaWQgRXhVdGlsRGVsZXRlQ29tbWFuZExpbmVBcmd1bWVudHMoQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MpIHsKKyAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgIGlmIChhcmdzLT5vd25fYXJndl8pIHsKKyAgICAgIGZyZWUoKHZvaWQqKWFyZ3MtPmFyZ3ZfKTsKKyAgICAgIFdlYlBEYXRhQ2xlYXIoJmFyZ3MtPmFyZ3ZfZGF0YV8pOworICAgIH0KKyAgICBSZXNldENvbW1hbmRMaW5lQXJndW1lbnRzKDAsIE5VTEwsIGFyZ3MpOworICB9Cit9CisKKyNkZWZpbmUgTUFYX0FSR0MgMTYzODQKK2ludCBFeFV0aWxJbml0Q29tbWFuZExpbmVBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MpIHsKKyAgaWYgKGFyZ3MgPT0gTlVMTCB8fCBhcmd2ID09IE5VTEwpIHJldHVybiAwOworICBSZXNldENvbW1hbmRMaW5lQXJndW1lbnRzKGFyZ2MsIGFyZ3YsIGFyZ3MpOworICBpZiAoYXJnYyA9PSAxICYmIGFyZ3ZbMF1bMF0gIT0gJy0nKSB7CisgICAgY2hhciogY3VyOworICAgIGNvbnN0IGNoYXIgc2VwW10gPSAiIFx0XHJcblxmXHYiOworICAgIGlmICghRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGFyZ3ZbMF0sICZhcmdzLT5hcmd2X2RhdGFfKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZ3MtPm93bl9hcmd2XyA9IDE7CisgICAgYXJncy0+YXJndl8gPSAoY29uc3QgY2hhcioqKW1hbGxvYyhNQVhfQVJHQyAqIHNpemVvZigqYXJncy0+YXJndl8pKTsKKyAgICBpZiAoYXJncy0+YXJndl8gPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBhcmdjID0gMDsKKyAgICBmb3IgKGN1ciA9IHN0cnRvaygoY2hhciopYXJncy0+YXJndl9kYXRhXy5ieXRlcywgc2VwKTsKKyAgICAgICAgIGN1ciAhPSBOVUxMOworICAgICAgICAgY3VyID0gc3RydG9rKE5VTEwsIHNlcCkpIHsKKyAgICAgIGlmIChhcmdjID09IE1BWF9BUkdDKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFyZ3VtZW50cyBsaW1pdCAlZCByZWFjaGVkXG4iLCBNQVhfQVJHQyk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgYXNzZXJ0KHN0cmxlbihjdXIpICE9IDApOworICAgICAgYXJncy0+YXJndl9bYXJnYysrXSA9IGN1cjsKKyAgICB9CisgICAgYXJncy0+YXJnY18gPSBhcmdjOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBzaXplOworICBpZiAod2VicF9kYXRhID09IE5VTEwpIHJldHVybiAwOworICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJnNpemUpKSByZXR1cm4gMDsKKyAgd2VicF9kYXRhLT5ieXRlcyA9IGRhdGE7CisgIHdlYnBfZGF0YS0+c2l6ZSA9IHNpemU7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9leGFtcGxlX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTc2MmE0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBleGFtcGxlIHByb2dyYW1zLgorLy8KKworI2lmbmRlZiBXRUJQX0VYQU1QTEVTX0VYQU1QTEVfVVRJTF9IXworI2RlZmluZSBXRUJQX0VYQU1QTEVTX0VYQU1QTEVfVVRJTF9IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorI2luY2x1ZGUgIndlYnAvbXV4X3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN0cmluZyBwYXJzaW5nCisKKy8vIFBhcnNlcyAndicgdXNpbmcgc3RydG8odWx8bHxkKSgpLiBJZiBlcnJvciBpcyBub24tTlVMTCwgJyplcnJvcicgaXMgc2V0IHRvCisvLyB0cnVlIG9uIGZhaWx1cmUgd2hpbGUgb24gc3VjY2VzcyBpdCBpcyBsZWZ0IHVubW9kaWZpZWQgdG8gYWxsb3cgY2hhaW5pbmcgb2YKKy8vIGNhbGxzLiBBbiBlcnJvciBpcyBvbmx5IHByaW50ZWQgb24gdGhlIGZpcnN0IG9jY3VycmVuY2UuCit1aW50MzJfdCBFeFV0aWxHZXRVSW50KGNvbnN0IGNoYXIqIGNvbnN0IHYsIGludCBiYXNlLCBpbnQqIGNvbnN0IGVycm9yKTsKK2ludCBFeFV0aWxHZXRJbnQoY29uc3QgY2hhciogY29uc3QgdiwgaW50IGJhc2UsIGludCogY29uc3QgZXJyb3IpOworZmxvYXQgRXhVdGlsR2V0RmxvYXQoY29uc3QgY2hhciogY29uc3QgdiwgaW50KiBjb25zdCBlcnJvcik7CisKKy8vIFRoaXMgdmFyaWFudCBvZiBFeFV0aWxHZXRJbnQoKSB3aWxsIHBhcnNlIG11bHRpcGxlIGludGVnZXJzIGZyb20gYQorLy8gY29tbWEtc2VwYXJhdGVkIGxpc3QuIFVwIHRvICdtYXhfb3V0cHV0JyBpbnRlZ2VycyBhcmUgcGFyc2VkLgorLy8gVGhlIHJlc3VsdCBpcyBwbGFjZWQgaW4gdGhlIG91dHB1dFtdIGFycmF5LCBhbmQgdGhlIG51bWJlciBvZiBpbnRlZ2VycworLy8gYWN0dWFsbHkgcGFyc2VkIGlzIHJldHVybmVkLCBvciAtMSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KK2ludCBFeFV0aWxHZXRJbnRzKGNvbnN0IGNoYXIqIHYsIGludCBiYXNlLCBpbnQgbWF4X291dHB1dCwgaW50IG91dHB1dFtdKTsKKworLy8gUmVhZHMgYSBmaWxlIG5hbWVkICdmaWxlbmFtZScgaW50byBhIFdlYlBEYXRhIHN0cnVjdHVyZS4gVGhlIGNvbnRlbnQgb2YKKy8vIHdlYnBfZGF0YSBpcyBvdmVyd3JpdHRlbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgoraW50IEV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERhdGEqIGNvbnN0IHdlYnBfZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21tYW5kLWxpbmUgYXJndW1lbnRzCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGFyZ2NfOworICBjb25zdCBjaGFyKiogYXJndl87CisgIFdlYlBEYXRhIGFyZ3ZfZGF0YV87CisgIGludCBvd25fYXJndl87Cit9IENvbW1hbmRMaW5lQXJndW1lbnRzOworCisvLyBJbml0aWFsaXplcyB0aGUgc3RydWN0dXJlIGZyb20gdGhlIGNvbW1hbmQtbGluZSBwYXJhbWV0ZXJzLiBJZiB0aGVyZSBpcworLy8gb25seSBvbmUgcGFyYW1ldGVyIGFuZCBpdCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgJy0nLCB0aGVuIGl0IGlzIGFzc3VtZWQgdG8KKy8vIGJlIGEgZmlsZSBuYW1lLiBUaGlzIGZpbGUgd2lsbCBiZSByZWFkIGFuZCB0b2tlbml6ZWQgaW50byBjb21tYW5kLWxpbmUKKy8vIGFyZ3VtZW50cy4gVGhlIGNvbnRlbnQgb2YgJ2FyZ3MnIGlzIG92ZXJ3cml0dGVuLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCBub24KKy8vIGV4aXN0aW5nIGZpbGUsIHRvbyBtYW55IGFyZ3VtZW50cywgLi4uKS4KK2ludCBFeFV0aWxJbml0Q29tbWFuZExpbmVBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MpOworCisvLyBEZWFsbG9jYXRlIGFsbCBtZW1vcnkgYW5kIHJlc2V0ICdhcmdzJy4KK3ZvaWQgRXhVdGlsRGVsZXRlQ29tbWFuZExpbmVBcmd1bWVudHMoQ29tbWFuZExpbmVBcmd1bWVudHMqIGNvbnN0IGFyZ3MpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9FWEFNUExFU19FWEFNUExFX1VUSUxfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL2dpZjJ3ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWYyd2VicC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MWYyNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWYyd2VicC5jCkBAIC0wLDAgKzEsNjA3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIHNpbXBsZSB0b29sIHRvIGNvbnZlcnQgYW5pbWF0ZWQgR0lGcyB0byBXZWJQCisvLworLy8gQXV0aG9yczogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXRUJQX0hBVkVfR0lGCisKKyNpZiBkZWZpbmVkKEhBVkVfVU5JU1REX0gpICYmIEhBVkVfVU5JU1REX0gKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z2lmX2xpYi5oPgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAid2VicC9tdXguaCIKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vZ2lmZGVjLmgiCisKKyNpZiAhZGVmaW5lZChTVERJTl9GSUxFTk8pCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCB0cmFuc3BhcmVudF9pbmRleCA9IEdJRl9JTkRFWF9JTlZBTElEOyAgLy8gT3BhcXVlIGJ5IGRlZmF1bHQuCisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRXJyb3JNZXNzYWdlc1stV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBICsgMV0gPSB7CisgICJXRUJQX01VWF9OT1RfRk9VTkQiLCAiV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCIsICJXRUJQX01VWF9CQURfREFUQSIsCisgICJXRUJQX01VWF9NRU1PUllfRVJST1IiLCAiV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIEVycm9yU3RyaW5nKFdlYlBNdXhFcnJvciBlcnIpIHsKKyAgYXNzZXJ0KGVyciA8PSBXRUJQX01VWF9OT1RfRk9VTkQgJiYgZXJyID49IFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSk7CisgIHJldHVybiBrRXJyb3JNZXNzYWdlc1stZXJyXTsKK30KKworZW51bSB7CisgIE1FVEFEQVRBX0lDQyAgPSAoMSA8PCAwKSwKKyAgTUVUQURBVEFfWE1QICA9ICgxIDw8IDEpLAorICBNRVRBREFUQV9BTEwgID0gTUVUQURBVEFfSUNDIHwgTUVUQURBVEFfWE1QCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTpcbiIpOworICBwcmludGYoIiBnaWYyd2VicCBbb3B0aW9uc10gZ2lmX2ZpbGUgLW8gd2VicF9maWxlXG4iKTsKKyAgcHJpbnRmKCJPcHRpb25zOlxuIik7CisgIHByaW50ZigiICAtaCAvIC1oZWxwIC4uLi4uLi4uLi4uLi4gdGhpcyBoZWxwXG4iKTsKKyAgcHJpbnRmKCIgIC1sb3NzeSAuLi4uLi4uLi4uLi4uLi4uLiBlbmNvZGUgaW1hZ2UgdXNpbmcgbG9zc3kgY29tcHJlc3Npb25cbiIpOworICBwcmludGYoIiAgLW1peGVkIC4uLi4uLi4uLi4uLi4uLi4uIGZvciBlYWNoIGZyYW1lIGluIHRoZSBpbWFnZSwgcGljayBsb3NzeVxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGxvc3NsZXNzIGNvbXByZXNzaW9uIGhldXJpc3RpY2FsbHlcbiIpOworICBwcmludGYoIiAgLXEgPGZsb2F0PiAuLi4uLi4uLi4uLi4uIHF1YWxpdHkgZmFjdG9yICgwOnNtYWxsLi4xMDA6YmlnKVxuIik7CisgIHByaW50ZigiICAtbSA8aW50PiAuLi4uLi4uLi4uLi4uLi4gY29tcHJlc3Npb24gbWV0aG9kICgwPWZhc3QsIDY9c2xvd2VzdClcbiIpOworICBwcmludGYoIiAgLW1pbl9zaXplIC4uLi4uLi4uLi4uLi4uIG1pbmltaXplIG91dHB1dCBzaXplIChkZWZhdWx0Om9mZilcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3NzbGVzcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0OyBjYW4gYmVcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21iaW5lZCB3aXRoIC1xLCAtbSwgLWxvc3N5IG9yIC1taXhlZFxuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNcbiIpOworICBwcmludGYoIiAgLWttaW4gPGludD4gLi4uLi4uLi4uLi4uIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIGtleSBmcmFtZXNcbiIpOworICBwcmludGYoIiAgLWttYXggPGludD4gLi4uLi4uLi4uLi4uIG1heCBkaXN0YW5jZSBiZXR3ZWVuIGtleSBmcmFtZXNcbiIpOworICBwcmludGYoIiAgLWYgPGludD4gLi4uLi4uLi4uLi4uLi4uIGZpbHRlciBzdHJlbmd0aCAoMD1vZmYuLjEwMClcbiIpOworICBwcmludGYoIiAgLW1ldGFkYXRhIDxzdHJpbmc+IC4uLi4uIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIG1ldGFkYXRhIHRvXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICAiKTsKKyAgcHJpbnRmKCJjb3B5IGZyb20gdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQgaWYgcHJlc2VudFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgICAgICAgICAgICAgIik7CisgIHByaW50ZigiVmFsaWQgdmFsdWVzOiBhbGwsIG5vbmUsIGljYywgeG1wIChkZWZhdWx0KVxuIik7CisgIHByaW50ZigiICAtbG9vcF9jb21wYXRpYmlsaXR5IC4uLi4gdXNlIGNvbXBhdGliaWxpdHkgbW9kZSBmb3IgQ2hyb21lXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIHByaW9yIHRvIE02MiAoaW5jbHVzaXZlKVxuIik7CisgIHByaW50ZigiICAtbXQgLi4uLi4uLi4uLi4uLi4uLi4uLi4gdXNlIG11bHRpLXRocmVhZGluZyBpZiBhdmFpbGFibGVcbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiICAtdmVyc2lvbiAuLi4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOworICBwcmludGYoIiAgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLi4uIHZlcmJvc2VcbiIpOworICBwcmludGYoIiAgLXF1aWV0IC4uLi4uLi4uLi4uLi4uLi4uIGRvbid0IHByaW50IGFueXRoaW5nXG4iKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGludCB2ZXJib3NlID0gMDsKKyAgaW50IGdpZl9lcnJvciA9IEdJRl9FUlJPUjsKKyAgV2ViUE11eEVycm9yIGVyciA9IFdFQlBfTVVYX09LOworICBpbnQgb2sgPSAwOworICBjb25zdCBjaGFyICppbl9maWxlID0gTlVMTCwgKm91dF9maWxlID0gTlVMTDsKKyAgRklMRSogb3V0ID0gTlVMTDsKKyAgR2lmRmlsZVR5cGUqIGdpZiA9IE5VTEw7CisgIGludCBmcmFtZV9kdXJhdGlvbiA9IDA7CisgIGludCBmcmFtZV90aW1lc3RhbXAgPSAwOworICBHSUZEaXNwb3NlTWV0aG9kIG9yaWdfZGlzcG9zZSA9IEdJRl9ESVNQT1NFX05PTkU7CisKKyAgV2ViUFBpY3R1cmUgZnJhbWU7ICAgICAgICAgICAgICAgIC8vIEZyYW1lIHJlY3RhbmdsZSBvbmx5IChub3QgZGlzcG9zZWQpLgorICBXZWJQUGljdHVyZSBjdXJyX2NhbnZhczsgICAgICAgICAgLy8gTm90IGRpc3Bvc2VkLgorICBXZWJQUGljdHVyZSBwcmV2X2NhbnZhczsgICAgICAgICAgLy8gRGlzcG9zZWQuCisKKyAgV2ViUEFuaW1FbmNvZGVyKiBlbmMgPSBOVUxMOworICBXZWJQQW5pbUVuY29kZXJPcHRpb25zIGVuY19vcHRpb25zOworICBXZWJQQ29uZmlnIGNvbmZpZzsKKworICBpbnQgZnJhbWVfbnVtYmVyID0gMDsgICAgIC8vIFdoZXRoZXIgd2UgYXJlIHByb2Nlc3NpbmcgdGhlIGZpcnN0IGZyYW1lLgorICBpbnQgZG9uZTsKKyAgaW50IGM7CisgIGludCBxdWlldCA9IDA7CisgIFdlYlBEYXRhIHdlYnBfZGF0YTsKKworICBpbnQga2VlcF9tZXRhZGF0YSA9IE1FVEFEQVRBX1hNUDsgIC8vIElDQyBub3Qgb3V0cHV0IGJ5IGRlZmF1bHQuCisgIFdlYlBEYXRhIGljY19kYXRhOworICBpbnQgc3RvcmVkX2ljYyA9IDA7ICAgICAgICAgLy8gV2hldGhlciB3ZSBoYXZlIGFscmVhZHkgc3RvcmVkIGFuIElDQyBwcm9maWxlLgorICBXZWJQRGF0YSB4bXBfZGF0YTsKKyAgaW50IHN0b3JlZF94bXAgPSAwOyAgICAgICAgIC8vIFdoZXRoZXIgd2UgaGF2ZSBhbHJlYWR5IHN0b3JlZCBhbiBYTVAgcHJvZmlsZS4KKyAgaW50IGxvb3BfY291bnQgPSAwOyAgICAgICAgIC8vIGRlZmF1bHQ6IGluZmluaXRlCisgIGludCBzdG9yZWRfbG9vcF9jb3VudCA9IDA7ICAvLyBXaGV0aGVyIHdlIGhhdmUgZm91bmQgYW4gZXhwbGljaXQgbG9vcCBjb3VudC4KKyAgaW50IGxvb3BfY29tcGF0aWJpbGl0eSA9IDA7CisgIFdlYlBNdXgqIG11eCA9IE5VTEw7CisKKyAgaW50IGRlZmF1bHRfa21pbiA9IDE7ICAvLyBXaGV0aGVyIHRvIHVzZSBkZWZhdWx0IGttaW4gdmFsdWUuCisgIGludCBkZWZhdWx0X2ttYXggPSAxOworCisgIGlmICghV2ViUENvbmZpZ0luaXQoJmNvbmZpZykgfHwgIVdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZlbmNfb3B0aW9ucykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJmZyYW1lKSB8fCAhV2ViUFBpY3R1cmVJbml0KCZjdXJyX2NhbnZhcykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJnByZXZfY2FudmFzKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIFZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uZmlnLmxvc3NsZXNzID0gMTsgIC8vIFVzZSBsb3NzbGVzcyBjb21wcmVzc2lvbiBieSBkZWZhdWx0LgorCisgIFdlYlBEYXRhSW5pdCgmd2VicF9kYXRhKTsKKyAgV2ViUERhdGFJbml0KCZpY2NfZGF0YSk7CisgIFdlYlBEYXRhSW5pdCgmeG1wX2RhdGEpOworCisgIGlmIChhcmdjID09IDEpIHsKKyAgICBIZWxwKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWgiKSB8fCAhc3RyY21wKGFyZ3ZbY10sICItaGVscCIpKSB7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1vIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBvdXRfZmlsZSA9IGFyZ3ZbKytjXTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb3NzeSIpKSB7CisgICAgICBjb25maWcubG9zc2xlc3MgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW1peGVkIikpIHsKKyAgICAgIGVuY19vcHRpb25zLmFsbG93X21peGVkID0gMTsKKyAgICAgIGNvbmZpZy5sb3NzbGVzcyA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbG9vcF9jb21wYXRpYmlsaXR5IikpIHsKKyAgICAgIGxvb3BfY29tcGF0aWJpbGl0eSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItcSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLnF1YWxpdHkgPSBFeFV0aWxHZXRGbG9hdChhcmd2WysrY10sICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgY29uZmlnLm1ldGhvZCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWluX3NpemUiKSkgeworICAgICAgZW5jX29wdGlvbnMubWluaW1pemVfc2l6ZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIta21heCIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgZW5jX29wdGlvbnMua21heCA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICBkZWZhdWx0X2ttYXggPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWttaW4iKSAmJiBjIDwgYXJnYyAtIDEpIHsKKyAgICAgIGVuY19vcHRpb25zLmttaW4gPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgZGVmYXVsdF9rbWluID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1mIikgJiYgYyA8IGFyZ2MgLSAxKSB7CisgICAgICBjb25maWcuZmlsdGVyX3N0cmVuZ3RoID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1tZXRhZGF0YSIpICYmIGMgPCBhcmdjIC0gMSkgeworICAgICAgc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgICAgICAgIGNvbnN0IGNoYXIqIG9wdGlvbjsKKyAgICAgICAgaW50IGZsYWc7CisgICAgICB9IGtUb2tlbnNbXSA9IHsKKyAgICAgICAgeyAiYWxsIiwgIE1FVEFEQVRBX0FMTCB9LAorICAgICAgICB7ICJub25lIiwgMCB9LAorICAgICAgICB7ICJpY2MiLCAgTUVUQURBVEFfSUNDIH0sCisgICAgICAgIHsgInhtcCIsICBNRVRBREFUQV9YTVAgfSwKKyAgICAgIH07CisgICAgICBjb25zdCBzaXplX3Qga051bVRva2VucyA9IHNpemVvZihrVG9rZW5zKSAvIHNpemVvZigqa1Rva2Vucyk7CisgICAgICBjb25zdCBjaGFyKiBzdGFydCA9IGFyZ3ZbKytjXTsKKyAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RybGVuKHN0YXJ0KTsKKworICAgICAga2VlcF9tZXRhZGF0YSA9IDA7CisgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIGNvbnN0IGNoYXIqIHRva2VuID0gc3RyY2hyKHN0YXJ0LCAnLCcpOworICAgICAgICBpZiAodG9rZW4gPT0gTlVMTCkgdG9rZW4gPSBlbmQ7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGtOdW1Ub2tlbnM7ICsraSkgeworICAgICAgICAgIGlmICgoc2l6ZV90KSh0b2tlbiAtIHN0YXJ0KSA9PSBzdHJsZW4oa1Rva2Vuc1tpXS5vcHRpb24pICYmCisgICAgICAgICAgICAgICFzdHJuY21wKHN0YXJ0LCBrVG9rZW5zW2ldLm9wdGlvbiwgc3RybGVuKGtUb2tlbnNbaV0ub3B0aW9uKSkpIHsKKyAgICAgICAgICAgIGlmIChrVG9rZW5zW2ldLmZsYWcgIT0gMCkgeworICAgICAgICAgICAgICBrZWVwX21ldGFkYXRhIHw9IGtUb2tlbnNbaV0uZmxhZzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGtlZXBfbWV0YWRhdGEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpID09IGtOdW1Ub2tlbnMpIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBVbmtub3duIG1ldGFkYXRhIHR5cGUgJyUuKnMnXG4iLAorICAgICAgICAgICAgICAgICAgKGludCkodG9rZW4gLSBzdGFydCksIHN0YXJ0KTsKKyAgICAgICAgICBIZWxwKCk7CisgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gdG9rZW4gKyAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW10IikpIHsKKyAgICAgICsrY29uZmlnLnRocmVhZF9sZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGNvbnN0IGludCBlbmNfdmVyc2lvbiA9IFdlYlBHZXRFbmNvZGVyVmVyc2lvbigpOworICAgICAgY29uc3QgaW50IG11eF92ZXJzaW9uID0gV2ViUEdldE11eFZlcnNpb24oKTsKKyAgICAgIHByaW50ZigiV2ViUCBFbmNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG5XZWJQIE11eCB2ZXJzaW9uOiAlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAoZW5jX3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGVuY192ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICBlbmNfdmVyc2lvbiAmIDB4ZmYsIChtdXhfdmVyc2lvbiA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgIChtdXhfdmVyc2lvbiA+PiA4KSAmIDB4ZmYsIG11eF92ZXJzaW9uICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xdWlldCIpKSB7CisgICAgICBxdWlldCA9IDE7CisgICAgICBlbmNfb3B0aW9ucy52ZXJib3NlID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12IikpIHsKKyAgICAgIHZlcmJvc2UgPSAxOworICAgICAgZW5jX29wdGlvbnMudmVyYm9zZSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItLSIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSBpbl9maWxlID0gYXJndlsrK2NdOworICAgICAgYnJlYWs7CisgICAgfSBlbHNlIGlmIChhcmd2W2NdWzBdID09ICctJykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGluX2ZpbGUgPSBhcmd2W2NdOworICAgIH0KKworICAgIGlmIChwYXJzZV9lcnJvcikgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgfQorCisgIC8vIEFwcHJvcHJpYXRlIGRlZmF1bHQga21pbiwga21heCB2YWx1ZXMgZm9yIGxvc3N5IGFuZCBsb3NzbGVzcy4KKyAgaWYgKGRlZmF1bHRfa21pbikgeworICAgIGVuY19vcHRpb25zLmttaW4gPSBjb25maWcubG9zc2xlc3MgPyA5IDogMzsKKyAgfQorICBpZiAoZGVmYXVsdF9rbWF4KSB7CisgICAgZW5jX29wdGlvbnMua21heCA9IGNvbmZpZy5sb3NzbGVzcyA/IDE3IDogNTsKKyAgfQorCisgIGlmICghV2ViUFZhbGlkYXRlQ29uZmlnKCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgSW52YWxpZCBjb25maWd1cmF0aW9uLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoaW5fZmlsZSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCFcbiIpOworICAgIEhlbHAoKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIFN0YXJ0IHRoZSBkZWNvZGVyIG9iamVjdAorI2lmIExPQ0FMX0dJRl9QUkVSRVEoNSwwKQorICBnaWYgPSAhc3RyY21wKGluX2ZpbGUsICItIikgPyBER2lmT3BlbkZpbGVIYW5kbGUoU1RESU5fRklMRU5PLCAmZ2lmX2Vycm9yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBER2lmT3BlbkZpbGVOYW1lKGluX2ZpbGUsICZnaWZfZXJyb3IpOworI2Vsc2UKKyAgZ2lmID0gIXN0cmNtcChpbl9maWxlLCAiLSIpID8gREdpZk9wZW5GaWxlSGFuZGxlKFNURElOX0ZJTEVOTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogREdpZk9wZW5GaWxlTmFtZShpbl9maWxlKTsKKyNlbmRpZgorICBpZiAoZ2lmID09IE5VTEwpIGdvdG8gRW5kOworCisgIC8vIExvb3Agb3ZlciBHSUYgaW1hZ2VzCisgIGRvbmUgPSAwOworICBkbyB7CisgICAgR2lmUmVjb3JkVHlwZSB0eXBlOworICAgIGlmIChER2lmR2V0UmVjb3JkVHlwZShnaWYsICZ0eXBlKSA9PSBHSUZfRVJST1IpIGdvdG8gRW5kOworCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIElNQUdFX0RFU0NfUkVDT1JEX1RZUEU6IHsKKyAgICAgICAgR0lGRnJhbWVSZWN0IGdpZl9yZWN0OworICAgICAgICBHaWZJbWFnZURlc2MqIGNvbnN0IGltYWdlX2Rlc2MgPSAmZ2lmLT5JbWFnZTsKKworICAgICAgICBpZiAoIURHaWZHZXRJbWFnZURlc2MoZ2lmKSkgZ290byBFbmQ7CisKKyAgICAgICAgaWYgKGZyYW1lX251bWJlciA9PSAwKSB7CisgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIHByaW50ZigiQ2FudmFzIHNjcmVlbjogJWQgeCAlZFxuIiwgZ2lmLT5TV2lkdGgsIGdpZi0+U0hlaWdodCk7CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEZpeCBzb21lIGJyb2tlbiBHSUYgZ2xvYmFsIGhlYWRlcnMgdGhhdCByZXBvcnQKKyAgICAgICAgICAvLyAwIHggMCBzY3JlZW4gZGltZW5zaW9uLgorICAgICAgICAgIGlmIChnaWYtPlNXaWR0aCA9PSAwIHx8IGdpZi0+U0hlaWdodCA9PSAwKSB7CisgICAgICAgICAgICBpbWFnZV9kZXNjLT5MZWZ0ID0gMDsKKyAgICAgICAgICAgIGltYWdlX2Rlc2MtPlRvcCA9IDA7CisgICAgICAgICAgICBnaWYtPlNXaWR0aCA9IGltYWdlX2Rlc2MtPldpZHRoOworICAgICAgICAgICAgZ2lmLT5TSGVpZ2h0ID0gaW1hZ2VfZGVzYy0+SGVpZ2h0OworICAgICAgICAgICAgaWYgKGdpZi0+U1dpZHRoIDw9IDAgfHwgZ2lmLT5TSGVpZ2h0IDw9IDApIHsKKyAgICAgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICBwcmludGYoIkZpeGVkIGNhbnZhcyBzY3JlZW4gZGltZW5zaW9uIHRvOiAlZCB4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ2lmLT5TV2lkdGgsIGdpZi0+U0hlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIC8vIEFsbG9jYXRlIGN1cnJlbnQgYnVmZmVyLgorICAgICAgICAgIGZyYW1lLndpZHRoID0gZ2lmLT5TV2lkdGg7CisgICAgICAgICAgZnJhbWUuaGVpZ2h0ID0gZ2lmLT5TSGVpZ2h0OworICAgICAgICAgIGZyYW1lLnVzZV9hcmdiID0gMTsKKyAgICAgICAgICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MoJmZyYW1lKSkgZ290byBFbmQ7CisgICAgICAgICAgR0lGQ2xlYXJQaWMoJmZyYW1lLCBOVUxMKTsKKyAgICAgICAgICBXZWJQUGljdHVyZUNvcHkoJmZyYW1lLCAmY3Vycl9jYW52YXMpOworICAgICAgICAgIFdlYlBQaWN0dXJlQ29weSgmZnJhbWUsICZwcmV2X2NhbnZhcyk7CisKKyAgICAgICAgICAvLyBCYWNrZ3JvdW5kIGNvbG9yLgorICAgICAgICAgIEdJRkdldEJhY2tncm91bmRDb2xvcihnaWYtPlNDb2xvck1hcCwgZ2lmLT5TQmFja0dyb3VuZENvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY19vcHRpb25zLmFuaW1fcGFyYW1zLmJnY29sb3IpOworCisgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyLgorICAgICAgICAgIGVuYyA9IFdlYlBBbmltRW5jb2Rlck5ldyhjdXJyX2NhbnZhcy53aWR0aCwgY3Vycl9jYW52YXMuaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jX29wdGlvbnMpOworICAgICAgICAgIGlmIChlbmMgPT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICJFcnJvciEgQ291bGQgbm90IGNyZWF0ZSBlbmNvZGVyIG9iamVjdC4gUG9zc2libHkgZHVlIHRvICIKKyAgICAgICAgICAgICAgICAgICAgImEgbWVtb3J5IGVycm9yLlxuIik7CisgICAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTb21lIGV2ZW4gbW9yZSBicm9rZW4gR0lGIGNhbiBoYXZlIHN1Yi1yZWN0IHdpdGggemVybyB3aWR0aC9oZWlnaHQuCisgICAgICAgIGlmIChpbWFnZV9kZXNjLT5XaWR0aCA9PSAwIHx8IGltYWdlX2Rlc2MtPkhlaWdodCA9PSAwKSB7CisgICAgICAgICAgaW1hZ2VfZGVzYy0+V2lkdGggPSBnaWYtPlNXaWR0aDsKKyAgICAgICAgICBpbWFnZV9kZXNjLT5IZWlnaHQgPSBnaWYtPlNIZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIUdJRlJlYWRGcmFtZShnaWYsIHRyYW5zcGFyZW50X2luZGV4LCAmZ2lmX3JlY3QsICZmcmFtZSkpIHsKKyAgICAgICAgICBnb3RvIEVuZDsKKyAgICAgICAgfQorICAgICAgICAvLyBCbGVuZCBmcmFtZSByZWN0YW5nbGUgd2l0aCBwcmV2aW91cyBjYW52YXMgdG8gY29tcG9zZSBmdWxsIGNhbnZhcy4KKyAgICAgICAgLy8gTm90ZSB0aGF0ICdjdXJyX2NhbnZhcycgaXMgc2FtZSBhcyAncHJldl9jYW52YXMnIGF0IHRoaXMgcG9pbnQuCisgICAgICAgIEdJRkJsZW5kRnJhbWVzKCZmcmFtZSwgJmdpZl9yZWN0LCAmY3Vycl9jYW52YXMpOworCisgICAgICAgIGlmICghV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgJmN1cnJfY2FudmFzLCBmcmFtZV90aW1lc3RhbXAsICZjb25maWcpKSB7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciB3aGlsZSBhZGRpbmcgZnJhbWUgIyVkOiAlc1xuIiwgZnJhbWVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgV2ViUEFuaW1FbmNvZGVyR2V0RXJyb3IoZW5jKSk7CisgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytmcmFtZV9udW1iZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBVcGRhdGUgY2FudmFzZXMuCisgICAgICAgIEdJRkRpc3Bvc2VGcmFtZShvcmlnX2Rpc3Bvc2UsICZnaWZfcmVjdCwgJnByZXZfY2FudmFzLCAmY3Vycl9jYW52YXMpOworICAgICAgICBHSUZDb3B5UGl4ZWxzKCZjdXJyX2NhbnZhcywgJnByZXZfY2FudmFzKTsKKworICAgICAgICAvLyBGb3JjZSBmcmFtZXMgd2l0aCBhIHNtYWxsIG9yIG5vIGR1cmF0aW9uIHRvIDEwMG1zIHRvIGJlIGNvbnNpc3RlbnQKKyAgICAgICAgLy8gd2l0aCB3ZWIgYnJvd3NlcnMgYW5kIG90aGVyIHRyYW5zY29kaW5nIHRvb2xzLiBUaGlzIGFsc28gYXZvaWRzCisgICAgICAgIC8vIGluY29ycmVjdCBkdXJhdGlvbnMgYmV0d2VlbiBmcmFtZXMgd2hlbiBwYWRkaW5nIGZyYW1lcyBhcmUKKyAgICAgICAgLy8gZGlzY2FyZGVkLgorICAgICAgICBpZiAoZnJhbWVfZHVyYXRpb24gPD0gMTApIHsKKyAgICAgICAgICBmcmFtZV9kdXJhdGlvbiA9IDEwMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFVwZGF0ZSB0aW1lc3RhbXAgKGZvciBuZXh0IGZyYW1lKS4KKyAgICAgICAgZnJhbWVfdGltZXN0YW1wICs9IGZyYW1lX2R1cmF0aW9uOworCisgICAgICAgIC8vIEluIEdJRiwgZ3JhcGhpYyBjb250cm9sIGV4dGVuc2lvbnMgYXJlIG9wdGlvbmFsIGZvciBhIGZyYW1lLCBzbyB3ZQorICAgICAgICAvLyBtYXkgbm90IGdldCBvbmUgYmVmb3JlIHJlYWRpbmcgdGhlIG5leHQgZnJhbWUuIFRvIGhhbmRsZSB0aGlzIGNhc2UsCisgICAgICAgIC8vIHdlIHJlc2V0IGZyYW1lIHByb3BlcnRpZXMgdG8gcmVhc29uYWJsZSBkZWZhdWx0cyBmb3IgdGhlIG5leHQgZnJhbWUuCisgICAgICAgIG9yaWdfZGlzcG9zZSA9IEdJRl9ESVNQT1NFX05PTkU7CisgICAgICAgIGZyYW1lX2R1cmF0aW9uID0gMDsKKyAgICAgICAgdHJhbnNwYXJlbnRfaW5kZXggPSBHSUZfSU5ERVhfSU5WQUxJRDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEVYVEVOU0lPTl9SRUNPUkRfVFlQRTogeworICAgICAgICBpbnQgZXh0ZW5zaW9uOworICAgICAgICBHaWZCeXRlVHlwZSAqZGF0YSA9IE5VTEw7CisgICAgICAgIGlmIChER2lmR2V0RXh0ZW5zaW9uKGdpZiwgJmV4dGVuc2lvbiwgJmRhdGEpID09IEdJRl9FUlJPUikgeworICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICB9CisgICAgICAgIGlmIChkYXRhID09IE5VTEwpIGNvbnRpbnVlOworCisgICAgICAgIHN3aXRjaCAoZXh0ZW5zaW9uKSB7CisgICAgICAgICAgY2FzZSBDT01NRU5UX0VYVF9GVU5DX0NPREU6IHsKKyAgICAgICAgICAgIGJyZWFrOyAgLy8gRG8gbm90aGluZyBmb3Igbm93LgorICAgICAgICAgIH0KKyAgICAgICAgICBjYXNlIEdSQVBISUNTX0VYVF9GVU5DX0NPREU6IHsKKyAgICAgICAgICAgIGlmICghR0lGUmVhZEdyYXBoaWNzRXh0ZW5zaW9uKGRhdGEsICZmcmFtZV9kdXJhdGlvbiwgJm9yaWdfZGlzcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFuc3BhcmVudF9pbmRleCkpIHsKKyAgICAgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgY2FzZSBQTEFJTlRFWFRfRVhUX0ZVTkNfQ09ERTogeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIGNhc2UgQVBQTElDQVRJT05fRVhUX0ZVTkNfQ09ERTogeworICAgICAgICAgICAgaWYgKGRhdGFbMF0gIT0gMTEpIGJyZWFrOyAgICAvLyBDaHVuayBpcyB0b28gc2hvcnQKKyAgICAgICAgICAgIGlmICghbWVtY21wKGRhdGEgKyAxLCAiTkVUU0NBUEUyLjAiLCAxMSkgfHwKKyAgICAgICAgICAgICAgICAhbWVtY21wKGRhdGEgKyAxLCAiQU5JTUVYVFMxLjAiLCAxMSkpIHsKKyAgICAgICAgICAgICAgaWYgKCFHSUZSZWFkTG9vcENvdW50KGdpZiwgJmRhdGEsICZsb29wX2NvdW50KSkgeworICAgICAgICAgICAgICAgIGdvdG8gRW5kOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJMb29wIGNvdW50OiAlZFxuIiwgbG9vcF9jb3VudCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RvcmVkX2xvb3BfY291bnQgPSBsb29wX2NvbXBhdGliaWxpdHkgPyAobG9vcF9jb3VudCAhPSAwKSA6IDE7CisgICAgICAgICAgICB9IGVsc2UgeyAgLy8gQW4gZXh0ZW5zaW9uIGNvbnRhaW5pbmcgbWV0YWRhdGEuCisgICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3RvcmUgdGhlIGZpcnN0IGVuY291bnRlcmVkIGNodW5rIG9mIGVhY2ggdHlwZSwgYW5kCisgICAgICAgICAgICAgIC8vIG9ubHkgaWYgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyLgorICAgICAgICAgICAgICBjb25zdCBpbnQgaXNfeG1wID0gKGtlZXBfbWV0YWRhdGEgJiBNRVRBREFUQV9YTVApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RvcmVkX3htcCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcChkYXRhICsgMSwgIlhNUCBEYXRhWE1QIiwgMTEpOworICAgICAgICAgICAgICBjb25zdCBpbnQgaXNfaWNjID0gKGtlZXBfbWV0YWRhdGEgJiBNRVRBREFUQV9JQ0MpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RvcmVkX2ljYyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1lbWNtcChkYXRhICsgMSwgIklDQ1JHQkcxMDEyIiwgMTEpOworICAgICAgICAgICAgICBpZiAoaXNfeG1wIHx8IGlzX2ljYykgeworICAgICAgICAgICAgICAgIGlmICghR0lGUmVhZE1ldGFkYXRhKGdpZiwgJmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfeG1wID8gJnhtcF9kYXRhIDogJmljY19kYXRhKSkgeworICAgICAgICAgICAgICAgICAgZ290byBFbmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc19pY2MpIHsKKyAgICAgICAgICAgICAgICAgIHN0b3JlZF9pY2MgPSAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfeG1wKSB7CisgICAgICAgICAgICAgICAgICBzdG9yZWRfeG1wID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBicmVhazsgIC8vIHNraXAKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGRhdGEgIT0gTlVMTCkgeworICAgICAgICAgIGlmIChER2lmR2V0RXh0ZW5zaW9uTmV4dChnaWYsICZkYXRhKSA9PSBHSUZfRVJST1IpIGdvdG8gRW5kOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBURVJNSU5BVEVfUkVDT1JEX1RZUEU6IHsKKyAgICAgICAgZG9uZSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDogeworICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiU2tpcHBpbmcgb3ZlciB1bmtub3duIHJlY29yZCB0eXBlICVkXG4iLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0gd2hpbGUgKCFkb25lKTsKKworICAvLyBMYXN0IE5VTEwgZnJhbWUuCisgIGlmICghV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgTlVMTCwgZnJhbWVfdGltZXN0YW1wLCBOVUxMKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZmx1c2hpbmcgV2ViUCBtdXhlci5cbiIpOworICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIFdlYlBBbmltRW5jb2RlckdldEVycm9yKGVuYykpOworICB9CisKKyAgaWYgKCFXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShlbmMsICZ3ZWJwX2RhdGEpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgV2ViUEFuaW1FbmNvZGVyR2V0RXJyb3IoZW5jKSk7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoIWxvb3BfY29tcGF0aWJpbGl0eSkgeworICAgIGlmICghc3RvcmVkX2xvb3BfY291bnQpIHsKKyAgICAgIC8vIGlmIG5vIGxvb3AtY291bnQgZWxlbWVudCBpcyBzZWVuLCB0aGUgZGVmYXVsdCBpcyAnMScgKGxvb3Atb25jZSkKKyAgICAgIC8vIGFuZCB3ZSBuZWVkIHRvIHNpZ25hbCBpdCBleHBsaWNpdGx5IGluIFdlYlAuIE5vdGUgaG93ZXZlciB0aGF0CisgICAgICAvLyBpbiBjYXNlIHRoZXJlJ3MgYSBzaW5nbGUgZnJhbWUsIHdlIHN0aWxsIGRvbid0IG5lZWQgdG8gc3RvcmUgaXQuCisgICAgICBpZiAoZnJhbWVfbnVtYmVyID4gMSkgeworICAgICAgICBzdG9yZWRfbG9vcF9jb3VudCA9IDE7CisgICAgICAgIGxvb3BfY291bnQgPSAxOworICAgICAgfQorICAgIH0gZWxzZSBpZiAobG9vcF9jb3VudCA+IDApIHsKKyAgICAgIC8vIGFkYXB0IEdJRidzIHNlbWFudGljIHRvIFdlYlAncyAoZXhjZXB0IGluIHRoZSBpbmZpbml0ZS1sb29wIGNhc2UpCisgICAgICBsb29wX2NvdW50ICs9IDE7CisgICAgfQorICB9CisgIC8vIGxvb3BfY291bnQgb2YgMCBpcyB0aGUgZGVmYXVsdCAoaW5maW5pdGUpLCBzbyBubyBuZWVkIHRvIHNpZ25hbCBpdAorICBpZiAobG9vcF9jb3VudCA9PSAwKSBzdG9yZWRfbG9vcF9jb3VudCA9IDA7CisKKyAgaWYgKHN0b3JlZF9sb29wX2NvdW50IHx8IHN0b3JlZF9pY2MgfHwgc3RvcmVkX3htcCkgeworICAgIC8vIFJlLW11eCB0byBhZGQgbG9vcCBjb3VudCBhbmQvb3IgbWV0YWRhdGEgYXMgbmVlZGVkLgorICAgIG11eCA9IFdlYlBNdXhDcmVhdGUoJndlYnBfZGF0YSwgMSk7CisgICAgaWYgKG11eCA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBDb3VsZCBub3QgcmUtbXV4IHRvIGFkZCBsb29wIGNvdW50L21ldGFkYXRhLlxuIik7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKworICAgIGlmIChzdG9yZWRfbG9vcF9jb3VudCkgeyAgLy8gVXBkYXRlIGxvb3AgY291bnQuCisgICAgICBXZWJQTXV4QW5pbVBhcmFtcyBuZXdfcGFyYW1zOworICAgICAgZXJyID0gV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcyhtdXgsICZuZXdfcGFyYW1zKTsKKyAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAoJXMpOiBDb3VsZCBub3QgZmV0Y2ggbG9vcCBjb3VudC5cbiIsCisgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfQorICAgICAgbmV3X3BhcmFtcy5sb29wX2NvdW50ID0gbG9vcF9jb3VudDsKKyAgICAgIGVyciA9IFdlYlBNdXhTZXRBbmltYXRpb25QYXJhbXMobXV4LCAmbmV3X3BhcmFtcyk7CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgKCVzKTogQ291bGQgbm90IHVwZGF0ZSBsb29wIGNvdW50LlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0b3JlZF9pY2MpIHsgICAvLyBBZGQgSUNDUCBjaHVuay4KKyAgICAgIGVyciA9IFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19kYXRhLCAxKTsKKyAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSUNDIHNpemU6ICVkXG4iLCAoaW50KWljY19kYXRhLnNpemUpOworICAgICAgfQorICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SICglcyk6IENvdWxkIG5vdCBzZXQgSUNDIGNodW5rLlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0b3JlZF94bXApIHsgICAvLyBBZGQgWE1QIGNodW5rLgorICAgICAgZXJyID0gV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wX2RhdGEsIDEpOworICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJYTVAgc2l6ZTogJWRcbiIsIChpbnQpeG1wX2RhdGEuc2l6ZSk7CisgICAgICB9CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgKCVzKTogQ291bGQgbm90IHNldCBYTVAgY2h1bmsuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVycikpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBlcnIgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCAmd2VicF9kYXRhKTsKKyAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SICglcyk6IENvdWxkIG5vdCBhc3NlbWJsZSB3aGVuIHJlLW11eGluZyB0byBhZGQgIgorICAgICAgICAgICAgICAibG9vcCBjb3VudC9tZXRhZGF0YS5cbiIsIEVycm9yU3RyaW5nKGVycikpOworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9maWxlICE9IE5VTEwpIHsKKyAgICBpZiAoIUltZ0lvVXRpbFdyaXRlRmlsZShvdXRfZmlsZSwgd2VicF9kYXRhLmJ5dGVzLCB3ZWJwX2RhdGEuc2l6ZSkpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd3JpdGluZyBvdXRwdXQgZmlsZTogJXNcbiIsIG91dF9maWxlKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBpZiAoIXF1aWV0KSB7CisgICAgICBpZiAoIXN0cmNtcChvdXRfZmlsZSwgIi0iKSkgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkICVkIGJ5dGVzIHRvIFNURElPXG4iLAorICAgICAgICAgICAgICAgIChpbnQpd2VicF9kYXRhLnNpemUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJTYXZlZCBvdXRwdXQgZmlsZSAoJWQgYnl0ZXMpOiAlc1xuIiwKKyAgICAgICAgICAgICAgICAoaW50KXdlYnBfZGF0YS5zaXplLCBvdXRfZmlsZSk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICghcXVpZXQpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiTm90aGluZyB3cml0dGVuOyB1c2UgLW8gZmxhZyB0byBzYXZlIHRoZSByZXN1bHQgIgorICAgICAgICAgICAgICAgICAgICAgICIoJWQgYnl0ZXMpLlxuIiwgKGludCl3ZWJwX2RhdGEuc2l6ZSk7CisgICAgfQorICB9CisKKyAgLy8gQWxsIE9LLgorICBvayA9IDE7CisgIGdpZl9lcnJvciA9IEdJRl9PSzsKKworIEVuZDoKKyAgV2ViUERhdGFDbGVhcigmaWNjX2RhdGEpOworICBXZWJQRGF0YUNsZWFyKCZ4bXBfZGF0YSk7CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZmcmFtZSk7CisgIFdlYlBQaWN0dXJlRnJlZSgmY3Vycl9jYW52YXMpOworICBXZWJQUGljdHVyZUZyZWUoJnByZXZfY2FudmFzKTsKKyAgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKGVuYyk7CisgIGlmIChvdXQgIT0gTlVMTCAmJiBvdXRfZmlsZSAhPSBOVUxMKSBmY2xvc2Uob3V0KTsKKworICBpZiAoZ2lmX2Vycm9yICE9IEdJRl9PSykgeworICAgIEdJRkRpc3BsYXlFcnJvcihnaWYsIGdpZl9lcnJvcik7CisgIH0KKyAgaWYgKGdpZiAhPSBOVUxMKSB7CisjaWYgTE9DQUxfR0lGX1BSRVJFUSg1LDEpCisgICAgREdpZkNsb3NlRmlsZShnaWYsICZnaWZfZXJyb3IpOworI2Vsc2UKKyAgICBER2lmQ2xvc2VGaWxlKGdpZik7CisjZW5kaWYKKyAgfQorCisgIHJldHVybiAhb2s7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9IQVZFX0dJRgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGIHN1cHBvcnQgbm90IGVuYWJsZWQgaW4gJXMuXG4iLCBhcmd2WzBdKTsKKyAgKHZvaWQpYXJnYzsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE5MzUyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmMKQEAgLTAsMCArMSw0MTYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBHSUYgZGVjb2RlLgorCisjaW5jbHVkZSAiLi9naWZkZWMuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBXRUJQX0hBVkVfR0lGCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIndlYnAvbXV4X3R5cGVzLmgiCisKKyNkZWZpbmUgR0lGX1RSQU5TUEFSRU5UX0NPTE9SIDB4MDAwMDAwMDB1CisjZGVmaW5lIEdJRl9XSElURV9DT0xPUiAgICAgICAweGZmZmZmZmZmdQorI2RlZmluZSBHSUZfVFJBTlNQQVJFTlRfTUFTSyAgMHgwMQorI2RlZmluZSBHSUZfRElTUE9TRV9NQVNLICAgICAgMHgwNworI2RlZmluZSBHSUZfRElTUE9TRV9TSElGVCAgICAgMgorCisvLyBmcm9tIHV0aWxzL3V0aWxzLmgKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiB2b2lkIFdlYlBDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKK2V4dGVybiB2b2lkIFdlYlBDb3B5UGl4ZWxzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KTsKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKK3ZvaWQgR0lGR2V0QmFja2dyb3VuZENvbG9yKGNvbnN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjb2xvcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmdjb2xvcl9pbmRleCwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGJnY29sb3IpIHsKKyAgaWYgKHRyYW5zcGFyZW50X2luZGV4ICE9IEdJRl9JTkRFWF9JTlZBTElEICYmCisgICAgICBiZ2NvbG9yX2luZGV4ID09IHRyYW5zcGFyZW50X2luZGV4KSB7CisgICAgKmJnY29sb3IgPSBHSUZfVFJBTlNQQVJFTlRfQ09MT1I7ICAvLyBTcGVjaWFsIGNhc2UuCisgIH0gZWxzZSBpZiAoY29sb3JfbWFwID09IE5VTEwgfHwgY29sb3JfbWFwLT5Db2xvcnMgPT0gTlVMTAorICAgICAgICAgICAgIHx8IGJnY29sb3JfaW5kZXggPj0gY29sb3JfbWFwLT5Db2xvckNvdW50KSB7CisgICAgKmJnY29sb3IgPSBHSUZfV0hJVEVfQ09MT1I7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiR0lGIGRlY29kZSB3YXJuaW5nOiBpbnZhbGlkIGJhY2tncm91bmQgY29sb3IgaW5kZXguIEFzc3VtaW5nICIKKyAgICAgICAgICAgICJ3aGl0ZSBiYWNrZ3JvdW5kLlxuIik7CisgIH0gZWxzZSB7CisgICAgY29uc3QgR2lmQ29sb3JUeXBlIGNvbG9yID0gY29sb3JfbWFwLT5Db2xvcnNbYmdjb2xvcl9pbmRleF07CisgICAgKmJnY29sb3IgPSAoMHhmZnUgICAgICAgPDwgMjQpCisgICAgICAgICAgICAgfCAoY29sb3IuUmVkICAgPDwgMTYpCisgICAgICAgICAgICAgfCAoY29sb3IuR3JlZW4gPDwgIDgpCisgICAgICAgICAgICAgfCAoY29sb3IuQmx1ZSAgPDwgIDApOworICB9Cit9CisKK2ludCBHSUZSZWFkR3JhcGhpY3NFeHRlbnNpb24oY29uc3QgR2lmQnl0ZVR5cGUqIGNvbnN0IGJ1ZiwgaW50KiBjb25zdCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0lGRGlzcG9zZU1ldGhvZCogY29uc3QgZGlzcG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB0cmFuc3BhcmVudF9pbmRleCkgeworICBjb25zdCBpbnQgZmxhZ3MgPSBidWZbMV07CisgIGNvbnN0IGludCBkaXNwb3NlX3JhdyA9IChmbGFncyA+PiBHSUZfRElTUE9TRV9TSElGVCkgJiBHSUZfRElTUE9TRV9NQVNLOworICBjb25zdCBpbnQgZHVyYXRpb25fcmF3ID0gYnVmWzJdIHwgKGJ1ZlszXSA8PCA4KTsgIC8vIEluIDEwIG1zIHVuaXRzLgorICBpZiAoYnVmWzBdICE9IDQpIHJldHVybiAwOworICAqZHVyYXRpb24gPSBkdXJhdGlvbl9yYXcgKiAxMDsgIC8vIER1cmF0aW9uIGlzIGluIDEgbXMgdW5pdHMuCisgIHN3aXRjaCAoZGlzcG9zZV9yYXcpIHsKKyAgICBjYXNlIDM6CisgICAgICAqZGlzcG9zZSA9IEdJRl9ESVNQT1NFX1JFU1RPUkVfUFJFVklPVVM7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAqZGlzcG9zZSA9IEdJRl9ESVNQT1NFX0JBQ0tHUk9VTkQ7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAwOgorICAgIGRlZmF1bHQ6CisgICAgICAqZGlzcG9zZSA9IEdJRl9ESVNQT1NFX05PTkU7CisgICAgICBicmVhazsKKyAgfQorICAqdHJhbnNwYXJlbnRfaW5kZXggPQorICAgICAgKGZsYWdzICYgR0lGX1RSQU5TUEFSRU5UX01BU0spID8gYnVmWzRdIDogR0lGX0lOREVYX0lOVkFMSUQ7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFJlbWFwKGNvbnN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHRyYW5zcGFyZW50X2luZGV4LCB1aW50MzJfdCogZHN0KSB7CisgIGludCBpOworICBjb25zdCBHaWZDb2xvclR5cGUqIGNvbG9yczsKKyAgY29uc3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNtYXAgPQorICAgICAgZ2lmLT5JbWFnZS5Db2xvck1hcCA/IGdpZi0+SW1hZ2UuQ29sb3JNYXAgOiBnaWYtPlNDb2xvck1hcDsKKyAgaWYgKGNtYXAgPT0gTlVMTCkgcmV0dXJuIDE7CisgIGlmIChjbWFwLT5Db2xvcnMgPT0gTlVMTCB8fCBjbWFwLT5Db2xvckNvdW50IDw9IDApIHJldHVybiAwOworICBjb2xvcnMgPSBjbWFwLT5Db2xvcnM7CisKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgaWYgKHNyY1tpXSA9PSB0cmFuc3BhcmVudF9pbmRleCkgeworICAgICAgZHN0W2ldID0gR0lGX1RSQU5TUEFSRU5UX0NPTE9SOworICAgIH0gZWxzZSBpZiAoc3JjW2ldIDwgY21hcC0+Q29sb3JDb3VudCkgeworICAgICAgY29uc3QgR2lmQ29sb3JUeXBlIGMgPSBjb2xvcnNbc3JjW2ldXTsKKyAgICAgIGRzdFtpXSA9IGMuQmx1ZSB8IChjLkdyZWVuIDw8IDgpIHwgKGMuUmVkIDw8IDE2KSB8ICgweGZmdSA8PCAyNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IEdJRlJlYWRGcmFtZShHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgIEdJRkZyYW1lUmVjdCogY29uc3QgZ2lmX3JlY3QsIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIFdlYlBQaWN0dXJlIHN1Yl9pbWFnZTsKKyAgY29uc3QgR2lmSW1hZ2VEZXNjKiBjb25zdCBpbWFnZV9kZXNjID0gJmdpZi0+SW1hZ2U7CisgIHVpbnQzMl90KiBkc3QgPSBOVUxMOworICB1aW50OF90KiB0bXAgPSBOVUxMOworICBjb25zdCBHSUZGcmFtZVJlY3QgcmVjdCA9IHsKKyAgICAgIGltYWdlX2Rlc2MtPkxlZnQsIGltYWdlX2Rlc2MtPlRvcCwgaW1hZ2VfZGVzYy0+V2lkdGgsIGltYWdlX2Rlc2MtPkhlaWdodAorICB9OworICBjb25zdCB1aW50NjRfdCBtZW1vcnlfbmVlZGVkID0gNCAqIHJlY3Qud2lkdGggKiAodWludDY0X3QpcmVjdC5oZWlnaHQ7CisgIGludCBvayA9IDA7CisgICpnaWZfcmVjdCA9IHJlY3Q7CisKKyAgaWYgKG1lbW9yeV9uZWVkZWQgIT0gKHNpemVfdCltZW1vcnlfbmVlZGVkIHx8IG1lbW9yeV9uZWVkZWQgPiAoNFVMTCA8PCAzMikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkltYWdlIGlzIHRvbyBsYXJnZSAoJWQgeCAlZCkuIiwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVXNlIGEgdmlldyBmb3IgdGhlIHN1Yi1waWN0dXJlOgorICBpZiAoIVdlYlBQaWN0dXJlVmlldyhwaWN0dXJlLCByZWN0Lnhfb2Zmc2V0LCByZWN0Lnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoLCByZWN0LmhlaWdodCwgJnN1Yl9pbWFnZSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlN1Yi1pbWFnZSAlZHglZCBhdCBwb3NpdGlvbiAlZCwlZCBpcyBpbnZhbGlkIVxuIiwKKyAgICAgICAgICAgIHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCByZWN0Lnhfb2Zmc2V0LCByZWN0Lnlfb2Zmc2V0KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBkc3QgPSBzdWJfaW1hZ2UuYXJnYjsKKworICB0bXAgPSAodWludDhfdCopbWFsbG9jKHJlY3Qud2lkdGggKiBzaXplb2YoKnRtcCkpOworICBpZiAodG1wID09IE5VTEwpIGdvdG8gRW5kOworCisgIGlmIChpbWFnZV9kZXNjLT5JbnRlcmxhY2UpIHsgIC8vIEludGVybGFjZWQgaW1hZ2UuCisgICAgLy8gV2UgbmVlZCA0IHBhc3Nlcywgd2l0aCB0aGUgZm9sbG93aW5nIG9mZnNldHMgYW5kIGp1bXBzLgorICAgIGNvbnN0IGludCBpbnRlcmxhY2Vfb2Zmc2V0c1tdID0geyAwLCA0LCAyLCAxIH07CisgICAgY29uc3QgaW50IGludGVybGFjZV9qdW1wc1tdICAgPSB7IDgsIDgsIDQsIDIgfTsKKyAgICBpbnQgcGFzczsKKyAgICBmb3IgKHBhc3MgPSAwOyBwYXNzIDwgNDsgKytwYXNzKSB7CisgICAgICBjb25zdCBzaXplX3Qgc3RyaWRlID0gKHNpemVfdClzdWJfaW1hZ2UuYXJnYl9zdHJpZGU7CisgICAgICBpbnQgeSA9IGludGVybGFjZV9vZmZzZXRzW3Bhc3NdOworICAgICAgdWludDMyX3QqIHJvdyA9IGRzdCArIHkgKiBzdHJpZGU7CisgICAgICBjb25zdCBzaXplX3QganVtcCA9IGludGVybGFjZV9qdW1wc1twYXNzXSAqIHN0cmlkZTsKKyAgICAgIGZvciAoOyB5IDwgcmVjdC5oZWlnaHQ7IHkgKz0gaW50ZXJsYWNlX2p1bXBzW3Bhc3NdLCByb3cgKz0ganVtcCkgeworICAgICAgICBpZiAoREdpZkdldExpbmUoZ2lmLCB0bXAsIHJlY3Qud2lkdGgpID09IEdJRl9FUlJPUikgZ290byBFbmQ7CisgICAgICAgIGlmICghUmVtYXAoZ2lmLCB0bXAsIHJlY3Qud2lkdGgsIHRyYW5zcGFyZW50X2luZGV4LCByb3cpKSBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7ICAvLyBOb24taW50ZXJsYWNlZCBpbWFnZS4KKyAgICBpbnQgeTsKKyAgICB1aW50MzJfdCogcHRyID0gZHN0OworICAgIGZvciAoeSA9IDA7IHkgPCByZWN0LmhlaWdodDsgKyt5LCBwdHIgKz0gc3ViX2ltYWdlLmFyZ2Jfc3RyaWRlKSB7CisgICAgICBpZiAoREdpZkdldExpbmUoZ2lmLCB0bXAsIHJlY3Qud2lkdGgpID09IEdJRl9FUlJPUikgZ290byBFbmQ7CisgICAgICBpZiAoIVJlbWFwKGdpZiwgdG1wLCByZWN0LndpZHRoLCB0cmFuc3BhcmVudF9pbmRleCwgcHRyKSkgZ290byBFbmQ7CisgICAgfQorICB9CisgIG9rID0gMTsKKworIEVuZDoKKyAgaWYgKCFvaykgcGljdHVyZS0+ZXJyb3JfY29kZSA9IHN1Yl9pbWFnZS5lcnJvcl9jb2RlOworICBXZWJQUGljdHVyZUZyZWUoJnN1Yl9pbWFnZSk7CisgIGZyZWUodG1wKTsKKyAgcmV0dXJuIG9rOworfQorCitpbnQgR0lGUmVhZExvb3BDb3VudChHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBHaWZCeXRlVHlwZSoqIGNvbnN0IGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbG9vcF9jb3VudCkgeworICBhc3NlcnQoIW1lbWNtcCgqYnVmICsgMSwgIk5FVFNDQVBFMi4wIiwgMTEpIHx8CisgICAgICAgICAhbWVtY21wKCpidWYgKyAxLCAiQU5JTUVYVFMxLjAiLCAxMSkpOworICBpZiAoREdpZkdldEV4dGVuc2lvbk5leHQoZ2lmLCBidWYpID09IEdJRl9FUlJPUikgeworICAgIHJldHVybiAwOworICB9CisgIGlmICgqYnVmID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsgIC8vIExvb3AgY291bnQgc3ViLWJsb2NrIG1pc3NpbmcuCisgIH0KKyAgaWYgKCgqYnVmKVswXSA8IDMgfHwgKCpidWYpWzFdICE9IDEpIHsKKyAgICByZXR1cm4gMDsgICAvLyB3cm9uZyBzaXplL21hcmtlcgorICB9CisgICpsb29wX2NvdW50ID0gKCpidWYpWzJdIHwgKCgqYnVmKVszXSA8PCA4KTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBHSUZSZWFkTWV0YWRhdGEoR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBjb25zdCBpbnQgaXNfeG1wID0gIW1lbWNtcCgqYnVmICsgMSwgIlhNUCBEYXRhWE1QIiwgMTEpOworICBjb25zdCBpbnQgaXNfaWNjID0gIW1lbWNtcCgqYnVmICsgMSwgIklDQ1JHQkcxMDEyIiwgMTEpOworICBhc3NlcnQoaXNfeG1wIHx8IGlzX2ljYyk7CisgICh2b2lkKWlzX2ljYzsgIC8vIHNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisgIC8vIENvbnN0cnVjdCBtZXRhZGF0YSBmcm9tIHN1Yi1ibG9ja3MuCisgIC8vIFVzdWFsIGNhc2UgKGluY2x1ZGluZyBJQ0MgcHJvZmlsZSk6IEluIGVhY2ggc3ViLWJsb2NrLCB0aGUKKyAgLy8gZmlyc3QgYnl0ZSBzcGVjaWZpZXMgaXRzIHNpemUgaW4gYnl0ZXMgKDAgdG8gMjU1KSBhbmQgdGhlCisgIC8vIHJlc3Qgb2YgdGhlIGJ5dGVzIGNvbnRhaW4gdGhlIGRhdGEuCisgIC8vIFNwZWNpYWwgY2FzZSBmb3IgWE1QIGRhdGE6IEluIGVhY2ggc3ViLWJsb2NrLCB0aGUgZmlyc3QgYnl0ZQorICAvLyBpcyBhbHNvIHBhcnQgb2YgdGhlIFhNUCBwYXlsb2FkLiBYTVAgaW4gR0lGIGFsc28gaGFzIGEgMjU3CisgIC8vIGJ5dGUgcGFkZGluZyBkYXRhLiBTZWUgdGhlIFhNUCBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzLgorICB3aGlsZSAoMSkgeworICAgIFdlYlBEYXRhIHN1YmJsb2NrOworICAgIGNvbnN0IHVpbnQ4X3QqIHRtcDsKKyAgICBpZiAoREdpZkdldEV4dGVuc2lvbk5leHQoZ2lmLCBidWYpID09IEdJRl9FUlJPUikgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgqYnVmID09IE5VTEwpIGJyZWFrOyAgLy8gRmluaXNoZWQuCisgICAgc3ViYmxvY2suc2l6ZSA9IGlzX3htcCA/ICgqYnVmKVswXSArIDEgOiAoKmJ1ZilbMF07CisgICAgYXNzZXJ0KHN1YmJsb2NrLnNpemUgPiAwKTsKKyAgICBzdWJibG9jay5ieXRlcyA9IGlzX3htcCA/ICpidWYgOiAqYnVmICsgMTsKKyAgICAvLyBOb3RlOiBXZSBzdG9yZSByZXR1cm5lZCB2YWx1ZSBpbiAndG1wJyBmaXJzdCwgdG8gYXZvaWQKKyAgICAvLyBsZWFraW5nIG9sZCBtZW1vcnkgaW4gbWV0YWRhdGEtPmJ5dGVzIG9uIGVycm9yLgorICAgIHRtcCA9ICh1aW50OF90KilyZWFsbG9jKCh2b2lkKiltZXRhZGF0YS0+Ynl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEtPnNpemUgKyBzdWJibG9jay5zaXplKTsKKyAgICBpZiAodG1wID09IE5VTEwpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtZW1jcHkoKHZvaWQqKSh0bXAgKyBtZXRhZGF0YS0+c2l6ZSksCisgICAgICAgICAgIHN1YmJsb2NrLmJ5dGVzLCBzdWJibG9jay5zaXplKTsKKyAgICBtZXRhZGF0YS0+Ynl0ZXMgPSB0bXA7CisgICAgbWV0YWRhdGEtPnNpemUgKz0gc3ViYmxvY2suc2l6ZTsKKyAgfQorICBpZiAoaXNfeG1wKSB7CisgICAgLy8gWE1QIHBhZGRpbmcgZGF0YSBpcyAweDAxLCAweGZmLCAweGZlIC4uLiAweDAxLCAweDAwLgorICAgIGNvbnN0IHNpemVfdCB4bXBfcGFkaW5nX3NpemUgPSAyNTc7CisgICAgaWYgKG1ldGFkYXRhLT5zaXplID4geG1wX3BhZGluZ19zaXplKSB7CisgICAgICBtZXRhZGF0YS0+c2l6ZSAtPSB4bXBfcGFkaW5nX3NpemU7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBDbGVhclJlY3RhbmdsZShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IGksIGo7CisgIGNvbnN0IHNpemVfdCBzdHJpZGUgPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgdWludDMyX3QqIGRzdCA9IHBpY3R1cmUtPmFyZ2IgKyB0b3AgKiBzdHJpZGUgKyBsZWZ0OworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2osIGRzdCArPSBzdHJpZGUpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgZHN0W2ldID0gR0lGX1RSQU5TUEFSRU5UX0NPTE9SOworICB9Cit9CisKK3ZvaWQgR0lGQ2xlYXJQaWMoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0KSB7CisgIGlmIChyZWN0ICE9IE5VTEwpIHsKKyAgICBDbGVhclJlY3RhbmdsZShwaWMsIHJlY3QtPnhfb2Zmc2V0LCByZWN0LT55X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICByZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhclJlY3RhbmdsZShwaWMsIDAsIDAsIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KTsKKyAgfQorfQorCit2b2lkIEdJRkNvcHlQaXhlbHMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBXZWJQQ29weVBpeGVscyhzcmMsIGRzdCk7Cit9CisKK3ZvaWQgR0lGRGlzcG9zZUZyYW1lKEdJRkRpc3Bvc2VNZXRob2QgZGlzcG9zZSwgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzKSB7CisgIGFzc2VydChyZWN0ICE9IE5VTEwpOworICBpZiAoZGlzcG9zZSA9PSBHSUZfRElTUE9TRV9CQUNLR1JPVU5EKSB7CisgICAgR0lGQ2xlYXJQaWMoY3Vycl9jYW52YXMsIHJlY3QpOworICB9IGVsc2UgaWYgKGRpc3Bvc2UgPT0gR0lGX0RJU1BPU0VfUkVTVE9SRV9QUkVWSU9VUykgeworICAgIGNvbnN0IHNpemVfdCBzcmNfc3RyaWRlID0gcHJldl9jYW52YXMtPmFyZ2Jfc3RyaWRlOworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBwcmV2X2NhbnZhcy0+YXJnYiArIHJlY3QtPnhfb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlY3QtPnlfb2Zmc2V0ICogc3JjX3N0cmlkZTsKKyAgICBjb25zdCBzaXplX3QgZHN0X3N0cmlkZSA9IGN1cnJfY2FudmFzLT5hcmdiX3N0cmlkZTsKKyAgICB1aW50MzJfdCogY29uc3QgZHN0ID0gY3Vycl9jYW52YXMtPmFyZ2IgKyByZWN0LT54X29mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgKyByZWN0LT55X29mZnNldCAqIGRzdF9zdHJpZGU7CisgICAgYXNzZXJ0KHByZXZfY2FudmFzICE9IE5VTEwpOworICAgIFdlYlBDb3B5UGxhbmUoKHVpbnQ4X3QqKXNyYywgKGludCkoNCAqIHNyY19zdHJpZGUpLAorICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdCwgKGludCkoNCAqIGRzdF9zdHJpZGUpLAorICAgICAgICAgICAgICAgICAgNCAqIHJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOworICB9Cit9CisKK3ZvaWQgR0lGQmxlbmRGcmFtZXMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LCBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgIGludCBpLCBqOworICBjb25zdCBzaXplX3Qgc3JjX3N0cmlkZSA9IHNyYy0+YXJnYl9zdHJpZGU7CisgIGNvbnN0IHNpemVfdCBkc3Rfc3RyaWRlID0gZHN0LT5hcmdiX3N0cmlkZTsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0OyBqIDwgcmVjdC0+eV9vZmZzZXQgKyByZWN0LT5oZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0OyBpIDwgcmVjdC0+eF9vZmZzZXQgKyByZWN0LT53aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBzcmNfcGl4ZWwgPSBzcmMtPmFyZ2JbaiAqIHNyY19zdHJpZGUgKyBpXTsKKyAgICAgIGNvbnN0IGludCBzcmNfYWxwaGEgPSBzcmNfcGl4ZWwgPj4gMjQ7CisgICAgICBpZiAoc3JjX2FscGhhICE9IDApIHsKKyAgICAgICAgZHN0LT5hcmdiW2ogKiBkc3Rfc3RyaWRlICsgaV0gPSBzcmNfcGl4ZWw7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgR0lGRGlzcGxheUVycm9yKGNvbnN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCBnaWZfZXJyb3IpIHsKKyAgLy8gbGliZ2lmIDQuMi4wIGhhcyByZXRpcmVkIFByaW50R2lmRXJyb3IoKSBhbmQgYWRkZWQgR2lmRXJyb3JTdHJpbmcoKS4KKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDQsMikKKyNpZiBMT0NBTF9HSUZfUFJFUkVRKDUsMCkKKyAgLy8gU3RhdGljIHN0cmluZyBhY3R1YWxseSwgaGVuY2UgdGhlIGNvbnN0IGNoYXIqIGNhc3QuCisgIGNvbnN0IGNoYXIqIGVycm9yX3N0ciA9IChjb25zdCBjaGFyKilHaWZFcnJvclN0cmluZygKKyAgICAgIChnaWYgPT0gTlVMTCkgPyBnaWZfZXJyb3IgOiBnaWYtPkVycm9yKTsKKyNlbHNlCisgIGNvbnN0IGNoYXIqIGVycm9yX3N0ciA9IChjb25zdCBjaGFyKilHaWZFcnJvclN0cmluZygpOworICAodm9pZClnaWY7CisjZW5kaWYKKyAgaWYgKGVycm9yX3N0ciA9PSBOVUxMKSBlcnJvcl9zdHIgPSAiVW5rbm93biBlcnJvciI7CisgIGZwcmludGYoc3RkZXJyLCAiR0lGTGliIEVycm9yICVkOiAlc1xuIiwgZ2lmX2Vycm9yLCBlcnJvcl9zdHIpOworI2Vsc2UKKyAgKHZvaWQpZ2lmOworICBmcHJpbnRmKHN0ZGVyciwgIkdJRkxpYiBFcnJvciAlZDogIiwgZ2lmX2Vycm9yKTsKKyAgUHJpbnRHaWZFcnJvcigpOworICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKK30KKworI2Vsc2UgIC8vICFXRUJQX0hBVkVfR0lGCisKK3N0YXRpYyB2b2lkIEVycm9yR0lGTm90QXZhaWxhYmxlKCkgeworICBmcHJpbnRmKHN0ZGVyciwgIkdJRiBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYmdpZi1kZXYgIgorICAgICAgICAgICJwYWNrYWdlIGJlZm9yZSBidWlsZGluZy5cbiIpOworfQorCit2b2lkIEdJRkdldEJhY2tncm91bmRDb2xvcihjb25zdCBzdHJ1Y3QgQ29sb3JNYXBPYmplY3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZ2NvbG9yX2luZGV4LCBpbnQgdHJhbnNwYXJlbnRfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYmdjb2xvcikgeworICAodm9pZCljb2xvcl9tYXA7CisgICh2b2lkKWJnY29sb3JfaW5kZXg7CisgICh2b2lkKXRyYW5zcGFyZW50X2luZGV4OworICAodm9pZCliZ2NvbG9yOworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCitpbnQgR0lGUmVhZEdyYXBoaWNzRXh0ZW5zaW9uKGNvbnN0IEdpZkJ5dGVUeXBlKiBjb25zdCBkYXRhLCBpbnQqIGNvbnN0IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZEaXNwb3NlTWV0aG9kKiBjb25zdCBkaXNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHRyYW5zcGFyZW50X2luZGV4KSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWR1cmF0aW9uOworICAodm9pZClkaXNwb3NlOworICAodm9pZCl0cmFuc3BhcmVudF9pbmRleDsKKyAgRXJyb3JHSUZOb3RBdmFpbGFibGUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBHSUZSZWFkRnJhbWUoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgR0lGRnJhbWVSZWN0KiBjb25zdCBnaWZfcmVjdCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgICh2b2lkKWdpZjsKKyAgKHZvaWQpdHJhbnNwYXJlbnRfaW5kZXg7CisgICh2b2lkKWdpZl9yZWN0OworICAodm9pZClwaWN0dXJlOworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEdJRlJlYWRMb29wQ291bnQoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsb29wX2NvdW50KSB7CisgICh2b2lkKWdpZjsKKyAgKHZvaWQpYnVmOworICAodm9pZClsb29wX2NvdW50OworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEdJRlJlYWRNZXRhZGF0YShzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQRGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZ2lmOworICAodm9pZClidWY7CisgICh2b2lkKW1ldGFkYXRhOworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworICByZXR1cm4gMDsKK30KKwordm9pZCBHSUZEaXNwb3NlRnJhbWUoR0lGRGlzcG9zZU1ldGhvZCBkaXNwb3NlLCBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBjdXJyX2NhbnZhcykgeworICAodm9pZClkaXNwb3NlOworICAodm9pZClyZWN0OworICAodm9pZClwcmV2X2NhbnZhczsKKyAgKHZvaWQpY3Vycl9jYW52YXM7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgR0lGQmxlbmRGcmFtZXMoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClyZWN0OworICAodm9pZClkc3Q7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgR0lGRGlzcGxheUVycm9yKGNvbnN0IHN0cnVjdCBHaWZGaWxlVHlwZSogY29uc3QgZ2lmLCBpbnQgZ2lmX2Vycm9yKSB7CisgICh2b2lkKWdpZjsKKyAgKHZvaWQpZ2lmX2Vycm9yOworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCit2b2lkIEdJRkNsZWFyUGljKHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICBjb25zdCBHSUZGcmFtZVJlY3QqIGNvbnN0IHJlY3QpIHsKKyAgKHZvaWQpcGljOworICAodm9pZClyZWN0OworICBFcnJvckdJRk5vdEF2YWlsYWJsZSgpOworfQorCit2b2lkIEdJRkNvcHlQaXhlbHMoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClkc3Q7CisgIEVycm9yR0lGTm90QXZhaWxhYmxlKCk7Cit9CisKKyNlbmRpZiAgLy8gV0VCUF9IQVZFX0dJRgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9naWZkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJhOWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvZ2lmZGVjLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBHSUYgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfRVhBTVBMRVNfR0lGREVDX0hfCisjZGVmaW5lIFdFQlBfRVhBTVBMRVNfR0lGREVDX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZmRlZiBXRUJQX0hBVkVfR0lGCisjaW5jbHVkZSA8Z2lmX2xpYi5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLy8gR0lGTElCX01BSk9SIGlzIG9ubHkgZGVmaW5lZCBpbiBsaWJnaWYgPj0gNC4yLjAuCisjaWYgZGVmaW5lZChHSUZMSUJfTUFKT1IpICYmIGRlZmluZWQoR0lGTElCX01JTk9SKQorIyBkZWZpbmUgTE9DQUxfR0lGX1ZFUlNJT04gKChHSUZMSUJfTUFKT1IgPDwgOCkgfCBHSUZMSUJfTUlOT1IpCisjIGRlZmluZSBMT0NBTF9HSUZfUFJFUkVRKG1haiwgbWluKSBcCisgICAgKExPQ0FMX0dJRl9WRVJTSU9OID49ICgoKG1haikgPDwgOCkgfCAobWluKSkpCisjZWxzZQorIyBkZWZpbmUgTE9DQUxfR0lGX1ZFUlNJT04gMAorIyBkZWZpbmUgTE9DQUxfR0lGX1BSRVJFUShtYWosIG1pbikgMAorI2VuZGlmCisKKyNkZWZpbmUgR0lGX0lOREVYX0lOVkFMSUQgKC0xKQorCit0eXBlZGVmIGVudW0gR0lGRGlzcG9zZU1ldGhvZCB7CisgIEdJRl9ESVNQT1NFX05PTkUsCisgIEdJRl9ESVNQT1NFX0JBQ0tHUk9VTkQsCisgIEdJRl9ESVNQT1NFX1JFU1RPUkVfUFJFVklPVVMKK30gR0lGRGlzcG9zZU1ldGhvZDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0LCB3aWR0aCwgaGVpZ2h0OworfSBHSUZGcmFtZVJlY3Q7CisKK3N0cnVjdCBXZWJQRGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworI2lmbmRlZiBXRUJQX0hBVkVfR0lGCitzdHJ1Y3QgQ29sb3JNYXBPYmplY3Q7CitzdHJ1Y3QgR2lmRmlsZVR5cGU7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgR2lmQnl0ZVR5cGU7CisjZW5kaWYKKworLy8gR2l2ZW4gdGhlIGluZGV4IG9mIGJhY2tncm91bmQgY29sb3IgYW5kIHRyYW5zcGFyZW50IGNvbG9yLCByZXR1cm5zIHRoZQorLy8gY29ycmVzcG9uZGluZyBiYWNrZ3JvdW5kIGNvbG9yIChpbiBCR1JBIGZvcm1hdCkgaW4gJ2JnY29sb3InLgordm9pZCBHSUZHZXRCYWNrZ3JvdW5kQ29sb3IoY29uc3Qgc3RydWN0IENvbG9yTWFwT2JqZWN0KiBjb25zdCBjb2xvcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmdjb2xvcl9pbmRleCwgaW50IHRyYW5zcGFyZW50X2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGJnY29sb3IpOworCisvLyBQYXJzZXMgdGhlIGdpdmVuIGdyYXBoaWNzIGV4dGVuc2lvbiBkYXRhIHRvIGdldCBmcmFtZSBkdXJhdGlvbiAoaW4gMW1zCisvLyB1bml0cyksIGRpc3Bvc2UgbWV0aG9kIGFuZCB0cmFuc3BhcmVudCBjb2xvciBpbmRleC4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IEdJRlJlYWRHcmFwaGljc0V4dGVuc2lvbihjb25zdCBHaWZCeXRlVHlwZSogY29uc3QgYnVmLCBpbnQqIGNvbnN0IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHSUZEaXNwb3NlTWV0aG9kKiBjb25zdCBkaXNwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHRyYW5zcGFyZW50X2luZGV4KTsKKworLy8gUmVhZHMgdGhlIG5leHQgR0lGIGZyYW1lIGZyb20gJ2dpZicgaW50byAncGljdHVyZScuIEFsc28sIHJldHVybnMgdGhlIEdJRgorLy8gZnJhbWUgZGltZW5zaW9ucyBhbmQgb2Zmc2V0cyBpbiAncmVjdCcuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBHSUZSZWFkRnJhbWUoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCB0cmFuc3BhcmVudF9pbmRleCwKKyAgICAgICAgICAgICAgICAgR0lGRnJhbWVSZWN0KiBjb25zdCBnaWZfcmVjdCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKTsKKworLy8gUGFyc2VzIGxvb3AgY291bnQgZnJvbSB0aGUgZ2l2ZW4gTmV0c2NhcGUgZXh0ZW5zaW9uIGRhdGEuCitpbnQgR0lGUmVhZExvb3BDb3VudChzdHJ1Y3QgR2lmRmlsZVR5cGUqIGNvbnN0IGdpZiwgR2lmQnl0ZVR5cGUqKiBjb25zdCBidWYsCisgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxvb3BfY291bnQpOworCisvLyBQYXJzZXMgdGhlIGdpdmVuIElDQyBvciBYTVAgZXh0ZW5zaW9uIGRhdGEgYW5kIHN0b3JlcyBpdCBpbnRvICdtZXRhZGF0YScuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBHSUZSZWFkTWV0YWRhdGEoc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIEdpZkJ5dGVUeXBlKiogY29uc3QgYnVmLAorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUERhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworLy8gRGlzcG9zZSB0aGUgcGl4ZWxzIHdpdGhpbiAncmVjdCcgb2YgJ2N1cnJfY2FudmFzJyBiYXNlZCBvbiAnZGlzcG9zZScgbWV0aG9kCisvLyBhbmQgJ3ByZXZfY2FudmFzJy4KK3ZvaWQgR0lGRGlzcG9zZUZyYW1lKEdJRkRpc3Bvc2VNZXRob2QgZGlzcG9zZSwgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMpOworCisvLyBHaXZlbiAnc3JjJyBwaWN0dXJlIGFuZCBpdHMgZnJhbWUgcmVjdGFuZ2xlICdyZWN0JywgYmxlbmQgaXQgaW50byAnZHN0Jy4KK3ZvaWQgR0lGQmxlbmRGcmFtZXMoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdJRkZyYW1lUmVjdCogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QpOworCisvLyBQcmludHMgYW4gZXJyb3Igc3RyaW5nIGJhc2VkIG9uICdnaWZfZXJyb3InLgordm9pZCBHSUZEaXNwbGF5RXJyb3IoY29uc3Qgc3RydWN0IEdpZkZpbGVUeXBlKiBjb25zdCBnaWYsIGludCBnaWZfZXJyb3IpOworCisvLyBJbiB0aGUgZ2l2ZW4gJ3BpYycsIGNsZWFyIHRoZSBwaXhlbHMgaW4gJ3JlY3QnIHRvIHRyYW5zcGFyZW50IGNvbG9yLgordm9pZCBHSUZDbGVhclBpYyhzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgY29uc3QgR0lGRnJhbWVSZWN0KiBjb25zdCByZWN0KTsKKworLy8gQ29weSBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyBzdHJpZGVzLiAnc3JjJyBhbmQgJ2RzdCcgYXJlIGFzc3VtZWQKKy8vIHRvIGJlIGFscmVhZHkgYWxsb2NhdGVkLgordm9pZCBHSUZDb3B5UGl4ZWxzKGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgZHN0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRVhBTVBMRVNfR0lGREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9pbWcyd2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvaW1nMndlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjc1MGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvaW1nMndlYnAuYwpAQCAtMCwwICsxLDMxNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBnZW5lcmF0ZSBhbiBhbmltYXRlZCBXZWJQIG91dCBvZiBhIHNlcXVlbmNlIG9mIGltYWdlcworLy8gIChQTkcsIEpQRUcsIC4uLikKKy8vCisvLyAgRXhhbXBsZSB1c2FnZToKKy8vICAgICBpbWcyd2VicCAtbyBvdXQud2VicCAtcSA0MCAtbWl4ZWQgLWR1cmF0aW9uIDQwIGlucHV0Pz8ucG5nCisvLworLy8gQXV0aG9yOiBza2FsQGdvb2dsZS5jb20gKFBhc2NhbCBNYXNzaW1pbm8pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIi4uL2V4YW1wbGVzL2V4YW1wbGVfdXRpbC5oIgorI2luY2x1ZGUgIi4uL2ltYWdlaW8vaW1hZ2VfZGVjLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL3N0b3B3YXRjaC5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAid2VicC9tdXguaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSGVscCh2b2lkKSB7CisgIHByaW50ZigiVXNhZ2U6XG5cbiIpOworICBwcmludGYoIiAgaW1nMndlYnAgW2ZpbGUtbGV2ZWwgb3B0aW9uc10gW2ltYWdlIGZpbGVzLi4uXSAiCisgICAgICAgICAiW3Blci1mcmFtZSBvcHRpb25zLi4uXVxuIik7CisgIHByaW50ZigiXG4iKTsKKworICBwcmludGYoIkZpbGUtbGV2ZWwgb3B0aW9ucyAob25seSB1c2VkIGF0IHRoZSBzdGFydCBvZiBjb21wcmVzc2lvbik6XG4iKTsKKyAgcHJpbnRmKCIgLW1pbl9zaXplIC4uLi4uLi4uLi4uLiBtaW5pbWl6ZSBzaXplXG4iKTsKKyAgcHJpbnRmKCIgLWxvb3AgPGludD4gLi4uLi4uLi4uLiBsb29wIGNvdW50IChkZWZhdWx0OiAwLCA9IGluZmluaXRlIGxvb3ApXG4iKTsKKyAgcHJpbnRmKCIgLWttYXggPGludD4gLi4uLi4uLi4uLiBtYXhpbXVtIG51bWJlciBvZiBmcmFtZSBiZXR3ZWVuIGtleS1mcmFtZXNcbiIKKyAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAoMD1vbmx5IGtleWZyYW1lcylcbiIpOworICBwcmludGYoIiAta21pbiA8aW50PiAuLi4uLi4uLi4uIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lIGJldHdlZW4ga2V5LWZyYW1lc1xuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICgwPWRpc2FibGUga2V5LWZyYW1lcyBhbHRvZ2V0aGVyKVxuIik7CisgIHByaW50ZigiIC1taXhlZCAuLi4uLi4uLi4uLi4uLi4gdXNlIG1peGVkIGxvc3N5L2xvc3NsZXNzIGF1dG9tYXRpYyBtb2RlXG4iKTsKKyAgcHJpbnRmKCIgLXYgLi4uLi4uLi4uLi4uLi4uLi4uLiB2ZXJib3NlIG1vZGVcbiIpOworICBwcmludGYoIiAtaCAuLi4uLi4uLi4uLi4uLi4uLi4uIHRoaXMgaGVscFxuIik7CisgIHByaW50ZigiIC12ZXJzaW9uIC4uLi4uLi4uLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIpOworICBwcmludGYoIlxuIik7CisKKyAgcHJpbnRmKCJQZXItZnJhbWUgb3B0aW9ucyAob25seSB1c2VkIGZvciBzdWJzZXF1ZW50IGltYWdlcyBpbnB1dCk6XG4iKTsKKyAgcHJpbnRmKCIgLWQgPGludD4gLi4uLi4uLi4uLi4uLiBmcmFtZSBkdXJhdGlvbiBpbiBtcyAoZGVmYXVsdDogMTAwKVxuIik7CisgIHByaW50ZigiIC1sb3NzbGVzcyAgLi4uLi4uLi4uLi4gdXNlIGxvc3NsZXNzIG1vZGUgKGRlZmF1bHQpXG4iKTsKKyAgcHJpbnRmKCIgLWxvc3N5IC4uLiAuLi4uLi4uLi4uLiB1c2UgbG9zc3kgbW9kZVxuIik7CisgIHByaW50ZigiIC1xIDxmbG9hdD4gLi4uLi4uLi4uLi4gcXVhbGl0eVxuIik7CisgIHByaW50ZigiIC1tIDxpbnQ+IC4uLi4uLi4uLi4uLi4gbWV0aG9kIHRvIHVzZVxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoImV4YW1wbGU6IGltZzJ3ZWJwIC1sb29wIDIgaW4wLnBuZyAtbG9zc3kgaW4xLmpwZ1xuIgorICAgICAgICAgIiAgICAgICAgICAgICAgICAgIC1kIDgwIGluMi50aWZmIC1vIG91dC53ZWJwXG4iKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBSZWFkSW1hZ2UoY29uc3QgY2hhciBmaWxlbmFtZVtdLCBXZWJQUGljdHVyZSogY29uc3QgcGljKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBOVUxMOworICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgV2ViUEltYWdlUmVhZGVyIHJlYWRlcjsKKyAgaW50IG9rOworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICAvLyBUcnkgdG8gZGVjb2RlIHRoZSBmaWxlIHVzaW5nIFdJQyBmYWxsaW5nIGJhY2sgdG8gdGhlIG90aGVyIHJlYWRlcnMgZm9yCisgIC8vIGUuZy4sIFdlYlAuCisgIG9rID0gUmVhZFBpY3R1cmVXaXRoV0lDKGZpbGVuYW1lLCBwaWMsIDEsIE5VTEwpOworICBpZiAob2spIHJldHVybiAxOworI2VuZGlmCisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoZmlsZW5hbWUsICZkYXRhLCAmZGF0YV9zaXplKSkgcmV0dXJuIDA7CisgIHJlYWRlciA9IFdlYlBHdWVzc0ltYWdlUmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSk7CisgIG9rID0gcmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSwgcGljLCAxLCBOVUxMKTsKKyAgZnJlZSgodm9pZCopZGF0YSk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBTZXRMb29wQ291bnQoaW50IGxvb3BfY291bnQsIFdlYlBEYXRhKiBjb25zdCB3ZWJwX2RhdGEpIHsKKyAgaW50IG9rID0gMTsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgdWludDMyX3QgZmVhdHVyZXM7CisgIFdlYlBNdXhBbmltUGFyYW1zIG5ld19wYXJhbXM7CisgIFdlYlBNdXgqIGNvbnN0IG11eCA9IFdlYlBNdXhDcmVhdGUod2VicF9kYXRhLCAxKTsKKyAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gMDsKKworICBlcnIgPSBXZWJQTXV4R2V0RmVhdHVyZXMobXV4LCAmZmVhdHVyZXMpOworICBvayA9IChlcnIgPT0gV0VCUF9NVVhfT0spOworICBpZiAoIW9rIHx8ICEoZmVhdHVyZXMgJiBBTklNQVRJT05fRkxBRykpIGdvdG8gRW5kOworCisgIGVyciA9IFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMobXV4LCAmbmV3X3BhcmFtcyk7CisgIG9rID0gKGVyciA9PSBXRUJQX01VWF9PSyk7CisgIGlmIChvaykgeworICAgIG5ld19wYXJhbXMubG9vcF9jb3VudCA9IGxvb3BfY291bnQ7CisgICAgZXJyID0gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhtdXgsICZuZXdfcGFyYW1zKTsKKyAgICBvayA9IChlcnIgPT0gV0VCUF9NVVhfT0spOworICB9CisgIGlmIChvaykgeworICAgIFdlYlBEYXRhQ2xlYXIod2VicF9kYXRhKTsKKyAgICBlcnIgPSBXZWJQTXV4QXNzZW1ibGUobXV4LCB3ZWJwX2RhdGEpOworICAgIG9rID0gKGVyciA9PSBXRUJQX01VWF9PSyk7CisgIH0KKworIEVuZDoKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgbG9vcC1jb3VudCBzZXR0aW5nXG4iKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgY29uc3QgY2hhciogb3V0cHV0ID0gTlVMTDsKKyAgV2ViUEFuaW1FbmNvZGVyKiBlbmMgPSBOVUxMOworICBpbnQgdmVyYm9zZSA9IDA7CisgIGludCBwaWNfbnVtID0gMDsKKyAgaW50IGR1cmF0aW9uID0gMTAwOworICBpbnQgdGltZXN0YW1wX21zID0gMDsKKyAgaW50IGxvb3BfY291bnQgPSAwOworICBpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICBXZWJQQW5pbUVuY29kZXJPcHRpb25zIGFuaW1fY29uZmlnOworICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgV2ViUFBpY3R1cmUgcGljOworICBXZWJQRGF0YSB3ZWJwX2RhdGE7CisgIGludCBjOworICBpbnQgaGF2ZV9pbnB1dCA9IDA7CisgIENvbW1hbmRMaW5lQXJndW1lbnRzIGNtZF9hcmdzOworICBpbnQgb2sgPSBFeFV0aWxJbml0Q29tbWFuZExpbmVBcmd1bWVudHMoYXJnYyAtIDEsIGFyZ3YgKyAxLCAmY21kX2FyZ3MpOworICBpZiAoIW9rKSByZXR1cm4gMTsKKyAgYXJnYyA9IGNtZF9hcmdzLmFyZ2NfOworICBhcmd2ID0gY21kX2FyZ3MuYXJndl87CisKKyAgV2ViUERhdGFJbml0KCZ3ZWJwX2RhdGEpOworICBpZiAoIVdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0KCZhbmltX2NvbmZpZykgfHwKKyAgICAgICFXZWJQQ29uZmlnSW5pdCgmY29uZmlnKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmcGljKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgb2sgPSAwOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gMXN0IHBhc3Mgb2Ygb3B0aW9uIHBhcnNpbmcKKyAgZm9yIChjID0gMDsgb2sgJiYgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmIChhcmd2W2NdWzBdID09ICctJykgeworICAgICAgaW50IHBhcnNlX2Vycm9yID0gMDsKKyAgICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItbyIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBhcmd2W2NdID0gTlVMTDsKKyAgICAgICAgb3V0cHV0ID0gYXJndlsrK2NdOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICIta21pbiIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBhcmd2W2NdID0gTlVMTDsKKyAgICAgICAgYW5pbV9jb25maWcua21pbiA9IEV4VXRpbEdldEludChhcmd2WysrY10sIDAsICZwYXJzZV9lcnJvcik7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1rbWF4IikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGFyZ3ZbY10gPSBOVUxMOworICAgICAgICBhbmltX2NvbmZpZy5rbWF4ID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWxvb3AiKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgYXJndltjXSA9IE5VTEw7CisgICAgICAgIGxvb3BfY291bnQgPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgICBpZiAobG9vcF9jb3VudCA8IDApIHsKKyAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgbm9uLXBvc2l0aXZlIGxvb3AtY291bnQgKCVkKVxuIiwgbG9vcF9jb3VudCk7CisgICAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1taW5fc2l6ZSIpKSB7CisgICAgICAgIGFuaW1fY29uZmlnLm1pbmltaXplX3NpemUgPSAxOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbWl4ZWQiKSkgeworICAgICAgICBhbmltX2NvbmZpZy5hbGxvd19taXhlZCA9IDE7CisgICAgICAgIGNvbmZpZy5sb3NzbGVzcyA9IDA7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12IikpIHsKKyAgICAgICAgdmVyYm9zZSA9IDE7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgICBIZWxwKCk7CisgICAgICAgIGdvdG8gRW5kOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICAgIGNvbnN0IGludCBlbmNfdmVyc2lvbiA9IFdlYlBHZXRFbmNvZGVyVmVyc2lvbigpOworICAgICAgICBjb25zdCBpbnQgbXV4X3ZlcnNpb24gPSBXZWJQR2V0TXV4VmVyc2lvbigpOworICAgICAgICBwcmludGYoIldlYlAgRW5jb2RlciB2ZXJzaW9uOiAlZC4lZC4lZFxuV2ViUCBNdXggdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgICAoZW5jX3ZlcnNpb24gPj4gMTYpICYgMHhmZiwgKGVuY192ZXJzaW9uID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgIGVuY192ZXJzaW9uICYgMHhmZiwgKG11eF92ZXJzaW9uID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAobXV4X3ZlcnNpb24gPj4gOCkgJiAweGZmLCBtdXhfdmVyc2lvbiAmIDB4ZmYpOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgb2sgPSAhcGFyc2VfZXJyb3I7CisgICAgICBpZiAoIW9rKSBnb3RvIEVuZDsKKyAgICAgIGFyZ3ZbY10gPSBOVUxMOyAgIC8vIG1hcmsgb3B0aW9uIGFzICdwYXJzZWQnIGR1cmluZyAxc3QgcGFzcworICAgIH0gZWxzZSB7CisgICAgICBoYXZlX2lucHV0IHw9IDE7CisgICAgfQorICB9CisgIGlmICghaGF2ZV9pbnB1dCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZShzKSBmb3IgZ2VuZXJhdGluZyBhbmltYXRpb24hXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIGltYWdlLXJlYWRpbmcgcGFzcworICBwaWNfbnVtID0gMDsKKyAgY29uZmlnLmxvc3NsZXNzID0gMTsKKyAgZm9yIChjID0gMDsgb2sgJiYgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmIChhcmd2W2NdID09IE5VTEwpIGNvbnRpbnVlOworICAgIGlmIChhcmd2W2NdWzBdID09ICctJykgeyAgICAvLyBwYXJzZSBsb2NhbCBvcHRpb25zCisgICAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb3NzeSIpKSB7CisgICAgICAgIGlmICghYW5pbV9jb25maWcuYWxsb3dfbWl4ZWQpIGNvbmZpZy5sb3NzbGVzcyA9IDA7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1sb3NzbGVzcyIpKSB7CisgICAgICAgIGlmICghYW5pbV9jb25maWcuYWxsb3dfbWl4ZWQpIGNvbmZpZy5sb3NzbGVzcyA9IDE7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICAgIGNvbmZpZy5xdWFsaXR5ID0gRXhVdGlsR2V0RmxvYXQoYXJndlsrK2NdLCAmcGFyc2VfZXJyb3IpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbSIpICYmIGMgKyAxIDwgYXJnYykgeworICAgICAgICBjb25maWcubWV0aG9kID0gRXhVdGlsR2V0SW50KGFyZ3ZbKytjXSwgMCwgJnBhcnNlX2Vycm9yKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWQiKSAmJiBjICsgMSA8IGFyZ2MpIHsKKyAgICAgICAgZHVyYXRpb24gPSBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgICAgICBpZiAoZHVyYXRpb24gPD0gMCkgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBuZWdhdGl2ZSBkdXJhdGlvbiAoJWQpXG4iLCBkdXJhdGlvbik7CisgICAgICAgICAgcGFyc2VfZXJyb3IgPSAxOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwYXJzZV9lcnJvciA9IDE7ICAgLy8gc2hvdWxkbid0IGJlIGhlcmUuCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb24gWyVzXVxuIiwgYXJndltjXSk7CisgICAgICB9CisgICAgICBvayA9ICFwYXJzZV9lcnJvcjsKKyAgICAgIGlmICghb2spIGdvdG8gRW5kOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgaWYgKG9rKSB7CisgICAgICBvayA9IFdlYlBWYWxpZGF0ZUNvbmZpZygmY29uZmlnKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24uXG4iKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8gcmVhZCBuZXh0IGlucHV0IGltYWdlCisgICAgcGljLnVzZV9hcmdiID0gMTsKKyAgICBvayA9IFJlYWRJbWFnZShhcmd2W2NdLCAmcGljKTsKKyAgICBpZiAoIW9rKSBnb3RvIEVuZDsKKworICAgIGlmIChlbmMgPT0gTlVMTCkgeworICAgICAgd2lkdGggID0gcGljLndpZHRoOworICAgICAgaGVpZ2h0ID0gcGljLmhlaWdodDsKKyAgICAgIGVuYyA9IFdlYlBBbmltRW5jb2Rlck5ldyh3aWR0aCwgaGVpZ2h0LCAmYW5pbV9jb25maWcpOworICAgICAgb2sgPSAoZW5jICE9IE5VTEwpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjcmVhdGUgV2ViUEFuaW1FbmNvZGVyIG9iamVjdC5cbiIpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvaykgeworICAgICAgb2sgPSAod2lkdGggPT0gcGljLndpZHRoICYmIGhlaWdodCA9PSBwaWMuaGVpZ2h0KTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJGcmFtZSAjJWQgZGltZW5zaW9uIG1pc21hdGNoZWQhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJHb3QgJWQgeCAlZC4gV2FzIGV4cGVjdGluZyAlZCB4ICVkLlxuIiwKKyAgICAgICAgICAgICAgICBwaWNfbnVtLCBwaWMud2lkdGgsIHBpYy5oZWlnaHQsIHdpZHRoLCBoZWlnaHQpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvaykgeworICAgICAgb2sgPSBXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCAmcGljLCB0aW1lc3RhbXBfbXMsICZjb25maWcpOworICAgICAgaWYgKCFvaykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGFkZGluZyBmcmFtZSAjJWRcbiIsIHBpY19udW0pOworICAgICAgfQorICAgIH0KKyAgICBXZWJQUGljdHVyZUZyZWUoJnBpYyk7CisgICAgaWYgKCFvaykgZ290byBFbmQ7CisKKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJBZGRlZCBmcmFtZSAjJTNkIGF0IHRpbWUgJTRkIChmaWxlOiAlcylcbiIsCisgICAgICAgICAgICAgIHBpY19udW0sIHRpbWVzdGFtcF9tcywgYXJndltjXSk7CisgICAgfQorICAgIHRpbWVzdGFtcF9tcyArPSBkdXJhdGlvbjsKKyAgICArK3BpY19udW07CisgIH0KKworICAvLyBhZGQgYSBsYXN0IGZha2UgZnJhbWUgdG8gc2lnbmFsIHRoZSBsYXN0IGR1cmF0aW9uCisgIG9rID0gb2sgJiYgV2ViUEFuaW1FbmNvZGVyQWRkKGVuYywgTlVMTCwgdGltZXN0YW1wX21zLCBOVUxMKTsKKyAgb2sgPSBvayAmJiBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShlbmMsICZ3ZWJwX2RhdGEpOworICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkdXJpbmcgZmluYWwgYW5pbWF0aW9uIGFzc2VtYmx5LlxuIik7CisgIH0KKworIEVuZDoKKyAgLy8gZnJlZSByZXNvdXJjZXMKKyAgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKGVuYyk7CisKKyAgaWYgKG9rICYmIGxvb3BfY291bnQgPiAwKSB7ICAvLyBSZS1tdXggdG8gYWRkIGxvb3AgY291bnQuCisgICAgb2sgPSBTZXRMb29wQ291bnQobG9vcF9jb3VudCwgJndlYnBfZGF0YSk7CisgIH0KKworICBpZiAob2spIHsKKyAgICBpZiAob3V0cHV0ICE9IE5VTEwpIHsKKyAgICAgIG9rID0gSW1nSW9VdGlsV3JpdGVGaWxlKG91dHB1dCwgd2VicF9kYXRhLmJ5dGVzLCB3ZWJwX2RhdGEuc2l6ZSk7CisgICAgICBpZiAob2spIGZwcmludGYoc3RkZXJyLCAib3V0cHV0IGZpbGU6ICVzICAgICAiLCBvdXRwdXQpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIltubyBvdXRwdXQgZmlsZSBzcGVjaWZpZWRdICAgIik7CisgICAgfQorICB9CisKKyAgaWYgKG9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJbJWQgZnJhbWVzLCAldSBieXRlc10uXG4iLAorICAgICAgICAgICAgcGljX251bSwgKHVuc2lnbmVkIGludCl3ZWJwX2RhdGEuc2l6ZSk7CisgIH0KKyAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKyAgRXhVdGlsRGVsZXRlQ29tbWFuZExpbmVBcmd1bWVudHMoJmNtZF9hcmdzKTsKKyAgcmV0dXJuIG9rID8gMCA6IDE7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9zdG9wd2F0Y2guaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3N0b3B3YXRjaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTM4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy9zdG9wd2F0Y2guaApAQCAtMCwwICsxLDYzIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEhlbHBlciBmdW5jdGlvbnMgdG8gbWVhc3VyZSBlbGFwc2VkIHRpbWUuCisvLworLy8gQXV0aG9yOiBNaWtvbGFqIFphbGV3c2tpIChtaWtvbGFqekBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfRVhBTVBMRVNfU1RPUFdBVENIX0hfCisjZGVmaW5lIFdFQlBfRVhBTVBMRVNfU1RPUFdBVENIX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZiBkZWZpbmVkIF9XSU4zMiAmJiAhZGVmaW5lZCBfX0dOVUNfXworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwordHlwZWRlZiBMQVJHRV9JTlRFR0VSIFN0b3B3YXRjaDsKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcHdhdGNoUmVzZXQoU3RvcHdhdGNoKiB3YXRjaCkgeworICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcih3YXRjaCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgU3RvcHdhdGNoUmVhZEFuZFJlc2V0KFN0b3B3YXRjaCogd2F0Y2gpIHsKKyAgY29uc3QgTEFSR0VfSU5URUdFUiBvbGRfdmFsdWUgPSAqd2F0Y2g7CisgIExBUkdFX0lOVEVHRVIgZnJlcTsKKyAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlQ291bnRlcih3YXRjaCkpCisgICAgcmV0dXJuIDAuMDsKKyAgaWYgKCFRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCZmcmVxKSkKKyAgICByZXR1cm4gMC4wOworICBpZiAoZnJlcS5RdWFkUGFydCA9PSAwKQorICAgIHJldHVybiAwLjA7CisgIHJldHVybiAod2F0Y2gtPlF1YWRQYXJ0IC0gb2xkX3ZhbHVlLlF1YWRQYXJ0KSAvIChkb3VibGUpZnJlcS5RdWFkUGFydDsKK30KKworCisjZWxzZSAgICAvKiAhX1dJTjMyICovCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBtZW1jcHkKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCit0eXBlZGVmIHN0cnVjdCB0aW1ldmFsIFN0b3B3YXRjaDsKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcHdhdGNoUmVzZXQoU3RvcHdhdGNoKiB3YXRjaCkgeworICBnZXR0aW1lb2ZkYXkod2F0Y2gsIE5VTEwpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIFN0b3B3YXRjaFJlYWRBbmRSZXNldChTdG9wd2F0Y2gqIHdhdGNoKSB7CisgIHN0cnVjdCB0aW1ldmFsIG9sZF92YWx1ZTsKKyAgZG91YmxlIGRlbHRhX3NlYywgZGVsdGFfdXNlYzsKKyAgU2JNZW1vcnlDb3B5KCZvbGRfdmFsdWUsIHdhdGNoLCBzaXplb2Yob2xkX3ZhbHVlKSk7CisgIGdldHRpbWVvZmRheSh3YXRjaCwgTlVMTCk7CisgIGRlbHRhX3NlYyA9IChkb3VibGUpd2F0Y2gtPnR2X3NlYyAtIG9sZF92YWx1ZS50dl9zZWM7CisgIGRlbHRhX3VzZWMgPSAoZG91YmxlKXdhdGNoLT50dl91c2VjIC0gb2xkX3ZhbHVlLnR2X3VzZWM7CisgIHJldHVybiBkZWx0YV9zZWMgKyBkZWx0YV91c2VjIC8gMTAwMDAwMC4wOworfQorCisjZW5kaWYgICAvKiBfV0lOMzIgKi8KKworI2VuZGlmICAvKiBXRUJQX0VYQU1QTEVTX1NUT1BXQVRDSF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdC53ZWJwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdC53ZWJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNGJjYTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0LndlYnAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdF9yZWYucHBtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdGVzdF9yZWYucHBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NzE5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy90ZXN0X3JlZi5wcG0KQEAgLTAsMCArMSw0IEBACitQNgorMTI4IDEyOAorMjU1CivL4fvL4fvL4fvL4fvL4fvL4fvL4fvL4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3Q4/3Q4/3Q4/3Q4/3S5P7S5P7S5P7S5P7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5P7S5P7S5P7S5P7T5f/T5f/T5f/T5f/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvL4fvL4fvL4fvL4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3P5P3Q4/3Q4/3Q4/3S5P7S5P7S5P7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5P7S5P7S5P7S5P7T5f/T5f/T5f/T5f/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvL4fvL4fvL4fvL4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3P5PvP5PvP5PvP5PvQ5f3Q5f3Q5f3Q5f3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5P7S5P7S5P7S5P7T5f/T5f/T5f/T5f/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvL4fvL4fvL4fvL4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvM4fvN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3O5fvO5fvO5fvO5fvP5v3P5v3P5v3P5v3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5P7S5P7S5P7S5P7T5f/T5f/T5f/T5f/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvM4v3M4v3M4v3M4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7O5fvO5fnO5fnO5fnP5vrP5vrP5vrP5v3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T5f/T5f/T5f/T5f/U5v/U5v/U5v/U5v/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frS6PnS6PnS6PnS6PnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvM4v3M4v3M4v3M4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f3S6PvS6PvS6PvS6PvQ5vrQ5vrQ5vrQ5vrQ5f3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T5f/T5f/T5f/T5f/U5v/U5v/U5v/U5v/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frS6PnS6PnS6PnS6PnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvM4v3M4v3M4v3M4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f3Q5vrS5fjS5fjS5fjS5fjS5fjS5fjQ5vrQ5f3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T5f/T5f/T5f/T5f/U5v/U5v/U5v/U5v/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frS6PnS6PnS6PnS6PnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffL4fvL4fvL4fvL4fvM4v3M4v3M4v3M4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P/Q4//Q4//Q4//P5P3P5P3P5P3Q4/3S5P7S5f3S5f3S5f3P4fPP4fPP4fPP4fHU5fbU5fbU5fbU5fjS5frS5f3S5f3Q5f3Q5f3Q5f3Q5f3Q5f7T5f/T5f/T5f/T5f/U5v/U5v/U5v/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/U6P/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f/V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/U6vvU6vvU6vvU6vvU6vvU6vvU6vvU6vvT6frT6frT6frT6frS6PnS6PnS6PnS6PnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5v/Q5f7S5P7Q4/3O4frS4vvQ4frV5f/O4f3U5v/U5v/T4/3P3/jJ2vC3xtyHlqqJl6mQm62xu86fqrups8XM1ujW4fLT4fHW6PjU5fbX6fvS5fjS5frW6v/Q5vrS5v7T5v7T5v7T5v7T5v7U6P/U6P/U6P/U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/V6//V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3X6/7X6/7X6/7X6/7W6v3W6v3W6v3W6v3V6fvV6fvV6fvV6fvU6PrU6PrU6PrU6PrT5vnT5vnT5vnT5vnS5fjS5fjS5fjS5fjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5P7S5P7T4/3X6P/V4/7S3/rV5P/M2/jI2fKdq8Vte5VkcYhodIxsdoxze4+Fi515f5GHjZ+Rl6ikqrqwtsa9xtXO3OrT5PPV5vfU5fbW6PrT5vnQ5PnU6v7T5vvT5vvT5vvT5vvU6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3X6/7X6/7X6/7X6/7W6v3W6v3W6v3W6v3V6fvV6fvV6fvV6fvU6PrU6PrU6PrU6PrT5vnT5vnT5vnT5vnS5fjS5fjS5fjS5fjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7M4fnO4/vT5f/V6P/S4vvT4/3U4v3Z5v/T4fupt9JsepVcaoRtepRocYxtd4+Ci6GGiZ6NkKV/gpaHi55/gpSws8W4vcuVm6m/y9nT4/LW5vbX5vjU5fbW6PrV6fvQ5PfT5vvT5vvT5vvT5vvU6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3X6/7X6/7X6/7X6/7W6v3W6v3W6v3W6v3V6fvV6fvV6fvV6fvU6PrU6PrU6PrU6PrT5vnT5vnT5vnT5vnS5fjS5fjS5fjS5fjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffN4v3N4v3N4v3N4v3O4/7O4/7O4/7O4/7O4/vO4/vO4/vO4/vP5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T6P/S5v/Q4/3P4vvT4/3V5f+xv9qBj6pygJtXZH5caYJ+i6SYor1qcY2Hjqp6f5iEhZ2bnLKChJqFhpuChZaXmqmytMGvs7+Wn6yxvcvG1OTU4vLZ6PnU4/TW6PrV5vnT5vvT5vvT5vvT5vvU6P3U6P3U6P3U6P3V6f7V6f7V6f7V6f7V6f7V6f7V6f7V6f7W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3V6/3X6/7X6/7X6/7X6/7W6v3W6v3W6v3W6v3V6fvV6fvV6fvV6fvU6PrU6PrU6PrU6PrT5vnT5vnT5vnT5vnS5fjS5fjS5fjS5fjQ5vjQ5vjQ5vjQ5vjP5ffP5ffP5ffP5ffO4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T6P/J3vfa7P/U5v/I2fJ5iaNNW3ZYZoFWY31bZH9lb4lpcIyHjqpmaoeMj6x4epd9fZh+e5Vxb4aRkKWXlqmJiJiXl6Seoa3GzNq9xtWYorGvucvW4fLX5ffa6PnX5vrW5v3U6P3U6P3U6P3U6P3U6P3U6P3U6P3W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7X7f/X7f/X7f/X7f/X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7W6v3V6fvU6PrV6fvV6fvV6fvV6fvT5vnT5vnT5vnT5vnT5vnT5vnT5vnT5vnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjO4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5v/S5P7F1/Fmd5BNXXdMWnRNWnNPWHFfZoBqcY1+gZ5ydpNyc5OIiamFhaRzc5F2c49/fZaenbKbmqyAgI2amqWkqLK3u8eLkJ6Rl6iIkaGttsjT3e/a5Pfb6frW6PrU6P3U6P3U6P3U6P3U6P3U6P3U6P3W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7X7f/X7f/X7f/X7f/X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7W6v3V6fvU6PrV6fvV6fvV6fvV6fvT5vnT5vnT5vnT5vnT5vnT5vnT5vnT5vnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjO4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5v/P5P29z+lYa4VJWnNMXHZQXnlOW3RiaYJzeJGOk6yAgp9+gJ2CgqKpqMuBgaF9fZtxcY1+f5ecnbKcnq2ChZGxtL+kqLJ/hI+orLp7gI6Jj5+Ynq+zu87X3/LX5ffW6PrU6P3U6P3U6P3U6P3U6P3U6P3U6P3W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7X7f/X7f/X7f/X7f/X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7W6v3V6fvU6PrV6fvV6fvV6fvV6fvT5vnT5vnT5vnT5vnT5vnT5vnT5vnT5vnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjO4/7O4/7O4/7O4/7P5P/P5P/P5P/P5P/P5P3P5P3P5P3P5P3Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f3Q5f3Q5f7Q5f7N3/lbbYdHV3FMWnRJV3JGUW1veJObn7ShpLiRlap5epBzc4+kpMK9udmysMyJi6NsbYR6e5B2eImcnqurr7nMz9qPk5uMj5qbnqmYm6h/hJGQlaOqsMDU2urX4vPX5vrU6P3U6P3U6P3U6P3U6P3U6P3U6P3W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W6v/W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7W7P7X7f/X7f/X7f/X7f/X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7W6v3V6fvU6PrV6fvV6fvV6fvV6fvT5vnT5vnT5vnT5vnT5vnT5vnT5vnT5vnQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5vjQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7P5f/P5f/P5v7P5v7O4/rP5fnW6v/S5f26zeZrfppKWHZMV3ZMVHFGTmtRWHRscYjGyNqjpbLh5O+3t8SFhJajorfOzeLd3O/s6/u4uMWjorJ5eYaXl6Oysru6usaIiJGVlpydnqStrbeVmKOChZGhpbGssb/V3u3W5ffX6fvU6PrT5vnU6v7U6v7U6f/V6f7W6v/Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X7f/X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3Z7f3Z7f3Z7f3Z7f3X7PvX7PvX7PvX7PvX7f3W7PvV6/rU6vnU6vnU6vnU6vnU6vnT6fjT6fjT6fjT6fjS6PfS6PfS6PfS6PfQ5vbQ5vbQ5vbQ5vbQ5vbQ5vbQ5vbQ5vbQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7P5f/P5f/P5v7Q5f3V6v/Q5PnP4/iswNVWaYJJWHZOXHlIUHBMU3BIT2xlaYaNj6iTlaKysrva2+HS0tuCgZGUk6O6ucnMzNmwsLuXl6OMjJh5eYa3t8Cjo6yenqp/f4ubmqGvrbSqqrO7u8Wqrbicn6qanqqjqbfM2urS4/Pa6/va7f/V6fvU6v7U6f/V6f7Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrX7/vW7frV7PnU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7P5v7P5v7Q5f7Q5f3Q5PvQ5Pu9zeNTY3tGVnBJV3RTXn1NVXRMU3BIT2xscI2Tla2Ii5qdoamOkZeJjZVqbHmFh5Z3eYaQk59pa3hqbHlzdoWIi5rJzdeFiJN4eoePj5ympa+pqLGamqOtrbeytsCVmKOmq7aHjpimssDI1ubX6PfX6fnZ6v3V6f7V6f7V6f7Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrX7/vW7frV7PnU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7P5v7Q5f3Q5f3S5f3S5f2js8xUZH1JV3FJV3JRXXtQXHpPV3dMVHFGTWpjZoR6f5ZpbH54e4Z5fYV6fohdX29+gI+lqLRrbXppa3hlaHdeYXJ0d4iOkJ1+gI2HiZhzdoVpaXSjoqvCwsyVlZ6JjZd9gIuRlqGGi5WXnqnM1eLW4vDd6/vc6/3X6fvV6fvV6f7Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3Z6v3W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrX7/vW7frV7PnU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7T6P/O4/rV6f/I3PNxgZpJWnJKWHJJV3JPW3lKVnRQWHhUXHtGTmtWXXp2fZhvc41YXHBxdoRma3eCh5NmanuIjJ2BhpFzeISGi5h5fY5oa39laX1YXWt0eYeHi5xjZXdiYm+GhJCwsLu9vcixtL3Hy9O3vcShpq23u8a2usXAx9LX4+/Z5vfZ6PnW6PrZ7P/W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7Z7P/Z7P/Z7P/Z7P/X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrV7PnV7PnV7PnV7PnU6/jU6/jU6/jU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f3O5PjT5vvE1+9eb4dIWHFNW3ZEUWxQXHhOWnhJVXNMVHNNVXRIUG1dZYJrco5TWnNTV29XW3BmantxdIZ0eIxqbYFdYXJaXmxtcYJeYnZbXnNkaH1mantkaHlpbIBlaHl+fouYlqOioq2pqbSipa27v8eqsLext77BxcvMz9e2usXByNPa5fPa6Pjb7P3W6v3W6v3W6v3W6v3W6v3X6/7X6/7X6/7X6/7X6/7X6/7X6/7X6/7Z7P/Z7P/Z7P/Z7P/X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrV7PnV7PnV7PnV7PnU6/jU6/jU6/jU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f3V6f6yxttUZHpFVW1NW3RBT2pXY4FNWHdKU3JTW3pJUXFKU3JbY4BeZoROV3JMU29QVHFJTmhXXHNpbYJYXXRhZX1WXG9YXnFVW21dYndXXHNdYnlrcYRmbH9WW3BUV2txcICVk6GqqraYmKSIjJSMj5eFi4+ytru3uLvMy8/a3eW9wcy5ws/U4vLb6vvV6fvW6v3V6/3V6/3V6/3W7P7W7P7W7P7W7P7X6/7X6/7X6/7X6/7Z7P/Z7P/Z7P/Z7P/X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrV7PnV7PnV7PnV7PnU6/jU6/jU6/jU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTQ5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7Q5f7S5f2zxNpOXnRJWnBJV3FIVnFRX3pKWHZMV3ZOWnhFUG9MV3ZRWnlWXntXX31VXHlPVnNRVXNUV3R7gJpcYXpTV3FQVW9QVWxPVGlWW3BtcodUWHJPVG1tcod4fZFfZHtYXHF6fYycnKiPj5uWlqJ6foiGiZR7f4l3d4CMi5HGxczMzNWlqrSwt8HF0N7X5fbb6/rZ6vrW6v3W6v3V6/3W7P7W7P7W7P7W7P7X6/7X6/7X6/7X6/7Z7P/Z7P/Z7P/Z7P/X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7f3X7/vX7/vX7/vX7/vX7/vX7/vX7/vX7/vZ7fvZ7fvZ7fvZ7fvX7PrX7PrX7PrX7PrV7PnV7PnV7PnV7PnU6/jU6/jU6/jU6/jU6/jU6/jU6/jU6/jT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTQ6PTS5v7S5v7S5v7S5v7T6P/T6P/T6P/T6P/S5P7U5v/V6P/Q4/3Q4/3V6P/V6P+ouNJaaIFOW3ROW3RPXXhRX3pNW3ZMWnRMXHZKWndCUW9QXntRXXtXX39XXX5XW3tVWHdRVXNcX31obIZUWHJMT21JTWtER2RESF9FSV6Ch5xscYtUWHJ+gpp/hJtUV3RhZX9xdoSmqrSHi5V+gI1xcICHhpaNjJyCgJCJh5Shn6nFxdCzt8GhpbCkqbPFzNXZ4uzc6vre7f/a6/vW6/rW7PvX7f3X8P7Z8f/X7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3X7f3X7/vX7/vX7/vZ8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8PrZ8PrZ8PrZ8PrX7/nX7/nX7/nX7/nW7frW7frW7frW7frV7PnV7PnV7PnV7PnV7PnU6/jU6/jU6/jT6vfT6vfS6fbS6fbT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTQ6PTS5v7S5v7S5v7S5v7T6P/T6P/T6P/T6P/S5P7W6f/S5P7T5f/Q4/3Q4/19j6lPX3lOWnZOVnNMV3NRXXlMV3NOXHdOXHdIWHJJWnNIV3RTYX5TXn1bYYFiZYZoaYtXWHhXW3lWWndaXnhUV3RQVHJPU3FOUW9CR2FJTmN7gJVeY31bX3mWm7KAhZxYXHlRVnBqb32IjZeipLGtsL93doaJiJuJhpqalqqJh5VycH2Xl6O/v8uEh4+ipa27wcbJ0Nrd6ffZ5vjc6/3d7//a7/7Z7/7W7/3V7fvX7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3X7/vX7/vX7/vX7/vZ8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8PrZ8PrZ8PrZ8PrX7/nX7/nX7/nX7/nW7frW7frW7frW7frV7PnV7PnV7PnV7PnV7PnV7PnV7PnU6/jT6vfT6vfT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTQ6PTS5v7S5v7S5v7S5v7T6P/T6P/T6P/T6P/U5v/T4/3W5v/V5f/b6/93h6FNXXdEUWxMV3NMVHFTW3hWXntPW3dTXnpMV3NCUGtMWnRPXXhVYX1aYn9sc5BfY4FvcI9/gZ5eYn9VWHZcYXpXXHZHSmlITGpNUG1GSmJJT2JYXnFaXnZ5fpWfpbh3e5BVWnFbX3R0eYd0eYWHiZaNj56FhJSJiJijobGsqrq7u8h2doJ/f4ufn6umqrKprLSkqLC5vsjb5vTb6fnb6/rZ6vnb8P7Z8P3W7/vV7frX7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3X7/vX7/vX7/vX7/vZ8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8PrZ8PrZ8PrZ8PrX7/nX7/nX7/nX7/nW7frW7frW7frW7frV7PnV7PnV7PnV7PnV7PnV7PnV7PnV7PnU6/jT6vfT6vfT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbQ6PTS5v7S5v7S5v7S5v7T6P/T6P/T6P/U6P/W5v/U5P7T4/3X6P9+jqhIWHJIWHJJV3JJVXFNVXJRWndOVnNRWndQWHZOVnNKVnJTX3lPXHZVXnleZYFWWndeYn9zdpOGiKV5fZpVWnNdYnlYXXdQVHFQVHFNUWtOU2pQVmlMUWRTV29+gpeepLdqcIJdYndbX3RydodVWmhaXGtrbX2BgJCamqaxr73AvsypqbZmZnN4eIWJiZWMj5qWmqKYnKSeo63Gz97d6/vc6vrb6/rZ7fvW7frZ8P3a8f7Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3Z7f3X7/vX7/vX7/vX7/vZ8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8PrZ8PrZ8PrZ8PrX7/nX7/nX7/nX7/nW7frW7frW7frW7frV7PnV7PnV7PnV7PnV7PnV7PnV7PnV7PnU6/jU6/jU6/jT6vfT6vfT6vfT6vfT6vfS6fbS6fbS6fbS6fbS5v7S5v7S5v7S5v7S5v7S5v7S5v7T5v7a6v/P3fjO3PdodpBIVnFIVnFIVnFHVXBIVHBPV3RVXXpMVHFMVHFPVnNMU3BTXHdPWHFWXXdVXHZdYntwdI5qb4hrbYh6fZdrcIlYXXdMUGhOU2pUV3RPU3BXXHZMUGhNUWZQVWpWW3JhZX1VW21VW21rcIVYXXJeYnZeYnZlaHliZHNlZXKfn6upprOin6yLiZprbX1maXh0d4R/f4yNjZiNjZiipLGfpbPO2ujc6vjZ6fbe8f3Z7fnZ8PrV7Pna7/7a7/7a7/7a7/7a7/7a7/7a7/7a7/7Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8fva8fva8fva8fvZ8PrZ8PrZ8PrZ8PrX7/vX7/vX7/vX7/vW7frW7frW7frW7frW7frW7frW7frW7frW7frV7PnU6/jU6/jU6/jU6/jU6/jU6/jT6vfS6fbS6fbS6fbS5v7S5v7S5v7S5v7S5v7S5v7S5v7T5v7V5f/O3Pdkco1GVG9JV3JFU21GVG9NWHRTXnpVXXpIUG1MU3BKUW9VXHlcY4Bzd5RbX3dcYXheY3pkaYBjaH9jaH9kZn9fYnpTV29OU2pYXXJcYXhcYXpPVG1QVWxhZX1RVm1ITWRMUGpJTmhNUWZkan15fpNlan9WWm9qbYKAgZaLjZyBgY6Hh5OoprCenqh5e4uFh5iAgpF6fYx9e4yPj5yRkZ6oqreVm6nAydnZ5PLZ5vTa6vfc7/rZ7fnb8v3a7/3a7/7a7/7a7/7a7/7a7/7a7/7a7/7Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8fva8fva8fva8fvZ8PrZ8PrZ8PrZ8PrX7/vX7/vX7/vX7/vW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frV7PnU6/jU6/jU6/jU6/jU6/jT6vfS6fbS6fbS5v7S5v7S5v7S5v7S5v7S5v7S5v7T5v7V4/53gp5IVHBNWHRPW3dMV3NOWnZUX3tQXHhMVHFJUW9MU3BPU3FcX35pbIuBhKFtcIhTVmtkaH2FiJ1XW3BbXnNVWm9OU2hWW3JfaH5eZnp3f5NxeJFQV3FQWG9ja4FESmRHTmpOVXFGTWlYYXd0fZCAiJxWW3JTVW10d4+QkaaUlqidnaqbm6SxsLeJi5B4eod/gpSEhpeLjZ59e4yUk6Ocmqi0tMGRlqSmsL3L1uLc6/bd7fjd8PnX7fba7/ra7/3a7/7a7/7a7/7a7/7a7/7a7/7a7/7Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8fva8fva8fva8fvZ8PrZ8PrZ8PrZ8PrX7/vX7/vX7/vX7/vW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frU6/jU6/jU6/jU6/jU6/jU6/jT6vfS6fbS5v/S5v7S5v7S5v7S5v7T5v7T5v7V5f59i6VET2tJVXFNWHRKVnJNWHRQXHhTXnpMV3ZIUHBHTmtFTGlOUW9kaIWMkKqmqcSbnrNbXnJ7f5NpbIFTVmtRVWpNUWZHTGFKU2ZfaHtsdIhXX3ZUW3ReZX9KU2lHTmhOVXFMU29GTWpGTWlJUGpyepBWXnRMUGhPUWx4epOYmrCEhZqHhpaNjZi4t76VlJ2Cgo+EhpeEhpd4d4l0c4SQj5+bm6i0tMGrrbqXnKipsLrN2eLb6vLa6vTf8vvc8vra7/3a7/7a7/7a7/7a7/7a7/7a7/7a7/3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3Z8P3a8f7a8f7a8f7a8f7a8f7a8f7a8f7a8fva8fva8fva8fva8fvZ8PrZ8PrZ8PrZ8PrX7/nX7/vX7/vX7/vW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frW7frU6/jU6/jU6/jU6/jU6/jU6/jU6/jT6vfT6P/Q5f7T5f/T5f/S5f3T4/vU5Ppte5VMV3NKU3BKU3BOVnNUXHlaYn9YYX5OVnZHT3FGTG9HTW1JUGxRWHJian6aorS0us2IjaJma4BpbYJcYXhOU2pKT2ZRVm1MUGVWW3BeY3hjaH9GSWZNVHFIT2xGT2pOVXFaYX1GSWZRVXJNUG1UV3RlaoRNUWtNUWtXWnR9f5p4epNbXHJiYXNmZXaYlqSPjZuNi5iOjJyfnLBdXG9hX3KLiZqfn6zExNC7u8ekpK2hpK+mrbfL197d7PTd8Pfd8Pnc7/rc7f3c7f3c7f3c8f/c8f/b8v/b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3c8/7c8/7c8/7c8/7c8/7c8/7c8/7c8/vb8vrb8vra8fna8fna8fna8fna8fna8fnZ8PjZ8PrZ8PrZ8PrX7/nX7/nX7/nX7/nX7/nX7/nX7/nX7/nW7fjW7fjW7fjW7fjV7PfV7PfV7PfV7PfU6/bU6/bU6/bT6vTQ4/3W6f/T5v7U5P3U5P3X5f9wfpdUYXpOVnNMVHNMVHNOVnZWXn5WXn5OVnZFTWxHTXBOVHdMU3BGTWlbY3lweIydprartMReY3hfZHtcYXhXXHNUWHBOU2pOU2pcYXZpb4FaXnNkaYJGSWZHTmtJT3BHT2xTWnZma4VeY319gZtbX3lQVHFlaYZPVG1OU2xiZH+Nj6pdX3hdXnR7eo96eYycmqqOjJyVkJ+Xk6Sem69dWm1bWmxran2bnayzs7+6ucK+vcSsrLaorbSxu8TQ3eTf8fja6vTd7frd7frc7/rc7/rc8f3c8f3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3c8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbV7PTV7PTV7PTV7PTU6/PU6/PU6/PT6vLX6fvS4/bV5fvX5v3W5P6EkKpJVnBXX31QWHhNVXdNVXdQWHpVXX9OVnhHT3FETG1OVHdJT3BCSWZKUW1MVGptdomvt8lweItXXHNjaH9aXnZNUWlTV29PVGtQVWphZXpcYnRpb4FhZX1BRWJMU3BMU3BHT2xKUWtXXHNzd4yjpb50d49YW3Zpa4ZKTWpRVG9wco1/gZpNT2hcXXN5eIuJiJijobGNi5idmKiNiJpzcIRyb4JhX3JeXXCJjJuvr7qzsru3tr3AwMmdo6qvtr+/zNPb6vLc7Pfd7frd7frc7/rc7/rc8f3c8f3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3c8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/va8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbV7PTV7PTV7PTV7PTU6/PU6/PU6/PT6vLV5fTX6PfW5ffX5PmMmLBQWnRTXHdMVHFRWnlOVnhOVnhRWntPV3lIUHJGTnBJUXFRV3hXXntMU29NVG1IT2lTW3F6gpZbY3dYXXdWW3RITWZARVxJTmViZn5QVWpyeItpb39kanpQVWpITWZPVnJIT2xNVXJGTWlITWRYXHFqbYJlaX5/gZqAgptQU2tpa4R3eZFsb4dUV2xfYXZ7eo2OjZ2in62QjpyhnKuTjp+PjJ+QjaFycYRaWGttcH+hoayWlZ66ucDLy9Sbnqaepa+st7/L1t/b6vTd7frd7frc7/rc7/rc8f3c8f3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3b8v3c8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/vc8/va8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbV7PTV7PTV7PTV7PTU6/PU6/PU6/PT6vKVpK+vvsi9y9l6hZZTXHJWXXdRWHRWXXpTW3pUXHtQWHhMVHNGTm1JUXFPV3dUXHtXXnpRWHRKUWtFTGVFTGVOVW9VXXNHTmhHTGVQVHFOU2xVWnFNUWlwdIlbX3R6gJBqcXt9hI5YXm9ITWRUW3dPVnNOVnZTWndVV3JISV9UVWtyc4h/gJV3eI1oaX5zdIlVWG1NUGVVWG1zdImNjJyVlaKtq7mVk5+kn6+qpbeopLiinrKhn7JxcIJtcH+bm6ahn6msq7K0tL6zt7+fpK+rsruqsbvZ5PDh7/3c7Pnh8//h8//c8f3c8f3b8v3b8v3c8/7c8/7c8/7c8/7c8/7c8/7c8/7c8/7d9P3d9P3d9P3d9P3d9P3d9P3d9P3d9P3c8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbW7fbW7fbW7fbW7fbV7PTV7PTV7PTU6/NlcXppdH5OWmVPWGhQWGxYXXRYXXdbXntRWHZTW3hTW3hQWHZOVnNRWndUXHlUXHlNVG1NVG1CSWNBSGJNVG1FTGVCSWNAR2NJTWpPU3BPVG1qb4hyd45obIFkan1NU2NQV2FhaHJNU2NWW3BUW3RRWHZPV3RUW3dWWHFWV2xpan9xc4VhY3Rxc4WMjp12eIlTVmpUV2xXW29oanuRkKGmprOcmqadm6i2scCjnrCOi56MiJyQj6KamKuQk6KPj5uamKKNjJO5ucLFxc6mqrSvs76mq7e2v8zh7/3e7/vh8//h8//c8f3c8f3b8v3b8v3c8/7c8/7c8/7c8/7c8/7c8/7c8/7c8/7d9P3d9P3d9P3d9P3d9P3d9P3d9P3d9P3c8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbW7fbW7fbW7fbW7fbV7PTV7PTV7PTU6/OAiZR5go1ia3hOVGRWXG9YXHFXW3BeYXlTWnNVXnlVXnlRW3ZTXHdVXnlTXHdOV3BGTmRBSV9CSmE+RV5HTmhHTmo3Plo7Ql8/QmE/Ql9CR2FYXXdJTmVjaH2Jj6JHTV1ESVdPVWVhZnlfZHlKU2lNVG1XYXdkbIBbXW9mZXZzcoJoZndmZXZtbH2amKueobJxdIhfY3hhZHhbXW+Af4+mprOdm6icmqatqbiWkaN9eY16d4t7eo2GhZeVl6aQkJyOjZaMi5GpqbLAwMmytsC4u8a0t8ScorDBz93c7Pnh8//e8f3c8f3c8f3b8v3b8v3c8/7c8/7c8/7c8/7c8/7c8/7c8/7c8/7d9P3d9P3d9P3d9P3d9P3d9P3d9P3d9P3c8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbW7fbW7fbW7fbW7fbV7PTV7PTV7PTU6/OFjJZ0e4ZwdIBscX9obHplaHlUVmhfYXZaXnNYYXRVXXNQWG9RWHJUW3ROVW9FTGVBSGJESF9BRl9AR2FFTGg9RGE9RGFAR2Q+QV8+QV5KTmtITWZBRl1QVWpPVGlPVWhYXnFzeYxlan9PVGlTW3FGTmRMVmlUXHBYXHBaXG1eYXJpaHpkY3ZqaXmLiZqjorRyc4h5fZB+gZN4eol3eYaEhJCXl6OJh5R+e4mHhZOJh5eNiZ2GhZeLiZqUlqOMjJeamKK4t767u8W+vse/v8u9vci2tsGqr7qPm6bT4/Dh8f7c7/re8f3c8f3c8f3b8v3c8/7c8/7c8/7c8/7c8/7c8/7c8/7c8/7d9P3d9P3d9P3d9P3d9P3d9P3d9P3d9P3c8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fW7fbW7fbW7fbW7fbW7fbW7fbW7fbW7fbV7PTV7PTV7PTU6/OPk52VmKOIjJaLjpjGydSxsb2amqWbm6hzdoJoanlwc4VWWm1VWnFQVW9MT2xGSWhGSWhHSGhFRmVBRWNARGJARGQ+RGQ+RWI+RWI/RmJIT2tGTWlBSGJBSGJCSWNOVmxYYXRTW21dZXlkbIBVXXNMU2xKUWtMU2xUV3RISmhPUWpdXnRjZHl4eomxsb6HhpZtcIF9fpORlKOeoa2WmKWChZF/gY52doJ/f4xzc4CLi5ePjp6Af4+FhZGTk5+dnamcm6StrLa6ucK+vcako6y5uMG+vcaytsCXnqmcqLPf7/nh8fvb7fnf8v7d8v/a7/re8//e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7d9vrd9vrd9vrd9vrc9Pnc9Pnc9Pnc9Pnb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fV7/bV7/bV7/bV7/bU7fTU7fTU7fTT7POPkJaJi5CbnKKio6mztLrZ2t/Iyc+srbO9vsS3t8CoqrdbXW9iY3tiZIFNTm1JTWtKTGtMTWxJSmpGR2lARGRARGQ+RGQ+RWI/RmI+RWFHTmpESmZCSWVBSGQ/RmJGTWZETGJASFxJUWVja4FRWnBJUGpGTWZPVnJNUG9MT21QU21dX3hdXnNwcoSFhZF+fY1/gZN+gJF2eIeHiZaipbCjpbJwcoF2eIeBgY6FhZFzc4CQkJ2Ojpt+fouNjZqdnaqal6Scm6Sko6zT0tuko6ytrLazsruwsLmxtsCCjJbS3enf7/nh8f7h8//f9P/d8v7e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7d9vrd9vrd9vrd9vrc9Pnc9Pnc9Pnc9Pnb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fV7/bV7/bV7/bV7/bU7fTU7fTU7fTT7PPBwsakpamMjZCUlZiXmJze3+POz9PFxsm/wMS0tru3t8J7eo1jZH1oaIZWV3lMTW9JTGlKTWpISmhFRmVARGJARGI+RWI+RWI/RmI+RWFFTGhBSGRBSGRBSGQ+RWFAR2NFTGg+RV5FTGVdZXtKU2lHT2NOVmpWXnJQVW9OU2xPUWpYXHFRU2hiZHZvbYB7eo17fZFtcIFRVGNbXWqFiJOLjZqGiJeMjp2GhpNkZHFiYm95eYaIiJWMjJiPj5yTk5+dm6ibmqOenaaysbqenaampa+hn6mQkJq0ucSYn6qstsDi7fnh8fve8f3b8Pvd8v7e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7d9vrd9vrd9vrd9vrc9Pnc9Pnc9Pnc9Pnb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fV7/bV7/bV7/bV7/bU7fTU7fTU7fTT7PPJy820trimqKqRk5WLjI63uLrc3d/a2924ubuys7fHx9Cqqbl6eI9kZIBfX39OT29ERmFERmFBRF4/QV5ARGFARGI+RWI+RWJAR2M+RWFESmY/RmI9RF9AR2M+RWFAR2NGTWlAR2NKUWtYYXdQWG9KU2ZYYXNQWGxHTGNRVm1cX3RRVWpTVGlcXnB0c4R2dIeBgpdpa31VV2Zpa3h4e4aFh5SHiZiPkaGQkJ1eXmt6eoeCgo+JiZaHh5SRkZ6UlKGUkZ6joquhn6mxsLmGhY6joquioaqfn6mytsCtsr2LkZza4+3j8v3h8/3e8//h9v/e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9P3e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7d9vrd9vrd9vrd9vrc9Pnc9Pnc9Pnc9Pnb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX7/fX7/fX7/fX7/fV7/bV7/bV7/bV7/bU7fTU7fTU7fTT7POpq6q+wL+RlJOIi4ltcG96fXvLzczf4uHW1tbS0tTBwMfAvsuyscSWlKtkZX5PT2tITGFHSl9ISmNGSGFARV49QF06QV09RF8+RWE/RmI+RWE7Ql4+RWE/RmJAR2NBSGRNVG1TWnNIUGZGTmRTW3FPV21RWnBMVGpKT2lfZHtKTmNfY3ddX3FqbHtsbHl/f4x5e41WWGpXWmlydIFscHqAgo+Vl6aipLOUlKF3d4R9fYmLi5eGhpOUlKGhoa2Tk5+bmKWUk5ybmqPGxc6joquenaaqqbKwr7jf3+m7u8eUmKO6xM7d7PTh8/3f9v7b8vre9P3e9P3e9P3e9P3f9v7f9v7f9v7f9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9/ve9/ve9/ve9/vd9vrd9vrd9vrd9vrc8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX8fjX8fjX8fjX8fjW8PfW8PfW8PfV7/Z+f4GxsrSJi42BgoVkZWiQkZSvsLLOzs64trfT0NTc2t7S0Newrbqqqbl3dohXWG1PU2ROUWVOUWVMT2RARVw+Qlw6QV0+RWE/RmI+RWE7Ql49RF9AR2M/RmI+RWE9RF09RVtGTmRETGJNVWtTW3FRWnBUW3RVXHZWW3JlaoFUV2xYXHBjZXdqbHl5eYWOjpt5e41cXnBsb355e4iLjpiUlqN2eId+gI+VlaKRkZ6Cgo+Tk5+VlaKJiZaWlqOYmKWfnaqhn6mmpa+fnqixsLmjoqupqLGqqbKxsLm0s72ssLqLkZvf6/Tb7fTe9P3f9//e9P3e9P3e9P3e9P3f9v7f9v7f9v7f9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9/ve9/ve9/ve9/vd9vrd9vrd9vrd9vrc8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX8fjX8fjX8fjX8fjW8PfW8PfW8PfV7/ahoqWUlZiChId7fYBkZWmFhomYmp2ampybmJrFwMHb2dzT0NTNzNDGxcywsLllaXNWW2ZUWGZRVWZPU2ZBRl0+Qlw7Ql4/RmI+RWE7Ql49RF89RF8/RmI+RWE9RF87QlxCSmFFTWFASF5NVWtJUWhKU2lOVW9WXnRkaX57gZRXW29kaHlzdoV6fYyioq9xcIBWWGp4eoxydIR2eIWAhI6TlaJmaXhkZnaOjpuQkJ13d4SHh5Sjo7C+vsuXl6Sbm6icmqaamKKvrbfBwMmlpK20s72trLawr7imo6vNydS9vcaeo62ptr3e8Pfe9Prd9vre9P3e9P3e9P3e9P3f9v7f9v7f9v7f9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9v7e9/ve9/ve9/ve9/vd9vrd9vrd9vrd9vrc8/vc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX8fjX8fjX8fjX8fjW8PfW8PfW8PfV7/awsbSwsbSlpqqOj5N7fYBlZmptb3JfXmOvrLDV09aXlZimpKiQj5SMi4+VlpyJiZNeYmxWW2ZTV2VQVGVCRls/RFs/Ql8+RWE7Ql49RF89RF8+RWE6QV07Ql49RF8+RWFGTmRBSV87RFpKUWtIT2lCSWM7QlxBSGJWW3BhZnldYXJobHp5e4t/gZCena1qaXl3eYtiZHZqbHt9f4xmaXZ+gI1vcX56eoeYmKSOjpqQkJyHh5N+fomTk5+rq7iTk56cm6Shn6mYl6GjoqudnKWqqbKfnqi2tLuloqrS0NfAwcevtLulsLba6fDf8ffj9v3e9Pre9P3e9P3e9P3f9v7f9vvf9vvf9vve9v7e9v7e9v7e9v7e9v7e9/ve9/ve9/ve9/ve9/ve9/ve9/vd9vrd9vrd9vrd9vrc9Pnc8/vc8/vc8/vb8vrb8vrb8vrb8vra8fna8fna8fna8fnZ8PjZ8PjZ8PjZ8PjX8fjX8fjX8fjX8fjW8PfW8PfW8PfV7/a2tLmopqufnqOamJ1+fYF6eX6LiY50c3hxcHSrqq/EwsmNjJNWVV5XVl9sand5eYVscHpUV2JTVmFVV2ZHSl5HSWJARGE+RWI/RmM+R2I9RmE7RV07RV07RV87RV87RV8/SGE/SGE/SGE/SGNASWQ+R2I+R2JBSGRNUWlOU2hfY3RxdoSHiZZ/gY52dIVzcoJ6eYlranp2dIV/fo55eYaVlaKTk5+WlqKxsLmpqK+enaaVlJ2BgImUkZ6QjpuhnquioaqXlp+LiZCjoqnQz9aqqbClpKuwr7OxsLSqq6+zuLqytruwtr20u8LW4ebf7/bh8/rd9vre9/ve9/vf+P3h+f3i+P3h9/vh9/3h9/3h9/3h9/3i+P7i+P3i+P3i+P3h+f3h+f3f+Pve9/re9/re9/re9/re9/rd9vnd9vrd9vrd9vrc9Pnc9Pnc9Pnc9Pnb8/jb8/jb8/jb8/ja8vfa8vfa8vfa8vfX8fbX8fbX8fbX8fbW8PTW8PTW8PTV7/NycXalpKmbmp6cm597en+TkZaEgod3dnqAf4alpKu6ucKYl6FhXmtfXWpiX21kYnBzc39cX2hOUVxcXmtOUWVHSWJER2Q+QV8/RmM+RmM9RmE7RV07RV07RV87RGE7RGE+R2I+R18+R2I+R2I9RmE9RmE/R2RFTGhVWnNPVGldYXKAhZOChZFzdoJ5eIhranpvbX5kY3N/fo6JiJh+fot9fYmamqWTk5ywr7asq7Copq2bmqGVlJ2sq7SUkZ6UkZ6lpK2WlZ6Uk5qioai0s7jFxMjT0ta9u8CsrbCqq626u7+7v8WkqLDAxs2epKvk7/fi9Pve9/vd9vrc9Pni+v7e9/rf9/jj+f7h9/3h9/3h9/3h9/3i+P3i+P3i+fri+frh+f3h+f3f+Pve9/re9/re9/re9/re9/rd9vnd9vnd9vnd9vnc9Pjc9Pjc9Pjc9Pjb8/jb8/jb8/jb8/ja8vfa8vfa8vfa8vfX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PJ9e4B3dnpycXZ2dHmBgIWwr7Ohn6SQj5SLiZCJiI+JiJGamKKEgY6MiZZhXmxaV2VeXmpbXmlaXWhdX2xQVGVKTmNHTGVARGI/RmM+RmM9RmE7RV87RV87RV87RGE7RGE9RmE9Rl49RmE9RmE9RmE9RmE/R2RFTGhcYXpPVGljZniAhZNqbHlcXmt7eotfXm9WVWViYXFxcIB/fo59fYlzc4CNjZiNjZapqK+rqq+vrbSdnKOhn6nGxc6opbKQjputrLaRkJqenaSlpKuhn6TCwcbr6u/My8/GxsixsbPFxsm+v8Wvsrq9wMiTmJ/BzNTf8fjf9vve9Prf9vvf9vrj+f7i+vve9/rh9/3h9/3h9/3h9/3i+P3i+P3i+fri+frh+f3h+f3f+Pve9/re9/re9/re9/re9/rd9vnd9vnd9vnd9vnc9Pjc9Pjc9Pjc9Pjb8/jb8/jb8/jb8/ja8vfa8vfa8vfa8vfX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PK/vsKJiI1cW19lZGmEgoexsLS2tLmXlpuUk5qLiZCEgoxbWmOFgo+/vcmTkJ5jYW9dXWlWWmRrb3lfYm9OUWNOUWZHTGVHSmg/RmI+RmM9RmE7RV87RV87RV87RGE7RV89Rl49Rl49RmE9RmFASWQ+R2I+RmNBSGRHTGVYXXJjZnhkaXddX2xlaHR/fo5iYXFcW2tzcoJ4d4d7eouCgo95eYaJiZWVlZ6joqmqqa2zsrmenaSUk5yqqbKhnqukoq+3tr+Mi5Sko6qqqbCmpaqpqKzHxsvBwMW9vb+/v8G6ub7Gx825ucK+wcm+wcmNlJ3S4ene8fjk9/7k+v/i+P3h9/vf+Pnh+f3h9/3h9/3h9/3h9/3i+P3i+P3i+fri+frh+f3h+f3f+Pve9/re9/re9/re9/re9/rd9vnd9vnd9vnd9vnc9Pjc9Pjc9Pjc9Pjb8/jb8/jb8/jb8/ja8vfa8vfa8vfa8vfX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PKpqKy0s7hlZGl/foKhn6SXlputrLGsq7CamJ+WlZyenaZ+fYZXVWKsqrfNy9loZXNiYm1wc35aXWVjZnFfZHJNUGRJTmVKT2lBSGQ9RmE9RWI7RGE7RGE7RGE7RV87RV87RV07RV07RV87RV8+R2I7RV9BSWZKUW1KT2lXXHFaXW9scX9fYm96fYmAf49tbH1paHhycYF+fY12dIV0dIF0dIGUlJ+dnaasq7Ksq7CqqbCamJ+TkZuenaalo7C9usempa+WlZ6NjJOamJ+cm5+mpaq/vsLGxcnAvsHFwsa/vsLU09qysru7u8W+wcmfpK+FkJrJ2eHk9v3c7/bh9/vj+f7j+/3k/f/i+P7i+P7i+P7i+P7i+P3i+P3i+fri+frh+f3h+f3h+f3h+f3f+Pvf+Pvf+Pvf+Pve9/re9/re9/re9/rd9vnd9vnd9vnd9vnb8/fb8/fb8/fb8/fa8vba8vba8vba8vbX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PK7ur/Cwcahn6SMi4+pqKyjoqaWlZqUk5eopq2cm6Kenaawr7iCgI1bWGVeXGq4tsRdXWlYXGZfY2tcX2pscX1mantESF1HTGNESmQ+R2I9RWI7RGE7RGE7RGE7RV87RV87RV07RV07RV87RV89RmE7RV8/R2RHTmpQVW9RVmtTVmhscX92eIV5e4hlZHRlZHR4d4d4d4dzcoKEgpOJiZZxcX6JiZWoqLHGxcy9u8CxsLe9u8KfnqiPjpeTkJ17eYaAf4iQj5iko6qTkZiQj5Smpaq7ur/Lyc7IxsnLyMzCwMXAv8a7usS/v8jCwsywtL99hpCQnKXf7/fo+f/h9Pnh9/vh+frh+f3i+P7i+P7i+P7i+P7i+P3i+P3i+fri+frh+f3h+f3h+f3h+f3f+Pvf+Pvf+Pvf+Pve9/re9/re9/re9/rd9vnd9vnd9vnd9vnb8/fb8/fb8/fb8/fa8vba8vba8vba8vbX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PLQz9SvrbKlpKmmpaqXlpubmp6dnKGRkJWRkJeIh46WlZ64t8DGxNBeXGliX21xb31TU15aXWhbXmZhZG9obHh9gY9GTF49QVZGTWZASWQ9RWI9RWI7RGE7RGE7RV87RV07RV07RV07RV87RV86RF46RF49RWJBSGRGSmROU2hNUGJdYnCBhJCPkZ6EgpOHhpZ4d4eBgJB5eIiAf4+NjZp/f4x0dICOjpexsLe6ub6mpay5uL+trLaWlZ6lo7CPjZqYl6GamKKVlJuamJ+OjZGpqKy7ur/Lyc7i3+PUztPEwcbMyNDPztfOzda7u8WmqrSjqrR5go2suMHo9//l+f7f9vrf+Pnf+Pvi+P7i+P7i+P7i+P7i+P3i+P3i+fri+frh+f3h+f3h+f3h+f3f+Pvf+Pvf+Pvf+Pve9/re9/re9/re9/rd9vnd9vnd9vnd9vnb8/Tb8/Tb8/Tb8/Ta8vPa8vPa8vPa8vPX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PLIx8yqqa2WlZqvrbKpqKyjoqazsretrLGjoqZ7en+Hho2cm6Skoq9sandWVGJWVmNOUF1aXWhpbHdiZXBjZnFpbXlydodGTF5CSmFESmQ/RmI+RWI9RGE7RGE7RV87RV07RV07RV87RV87RV85Ql06RF47RGE9RF9AR2E/RFtGSV1wc4WMjp2cnquXl6SCgZGCgZF4d4d/fo6AgI2Hh5SEhJB2doGGho+/vsWysbaqqbCWlZyJiJGhn6m4t8CpqLG7usStrLO4t76hn6aXlputrLG+vcHEwsfNy87Ny865t7u9ur+wr7azsrvBwcvBwcu+wcyiprKCiZTL197l9Pvo+//i+P3f+Pvh+f3h+f7i+P7i+P3i+P3i+P3h+frh+frh+frh+f3h+f3h+f3f+Pvf+Pvf+Pvf+Pve9/re9/re9/re9/rd9vnd9vnd9vnd9vnb8/Tb8/Tb8/Tb8/Ta8vPa8vPa8vPa8vPX8vTX8vTX8vTX8vTW8fPW8fPW8fPV8PLHx8nPz9LAwMKlpaiTk5WoqKq3t7mvr7Gbm5ucnJyBgoVyc3mYmKJoaHROTV1OUF9TVWRhY3JsbHhmZnJsbHhydIF9f45maXpBRVpISmNKTmtER2Q+QV85QF07Ql5AR2E/RmI/RmM+RWI+RWI9RF87Ql47Ql49RF87QlxBRl9ESGJAQltMT2NtcH+OkJ2Ym6iLi5d6eoeBgY5ycn54eIR0dIB/f4uCgoy2t725usCwsbelpqyVlpyrrLKztLqxsrivrbSysba3trq6ub6fnqOhn6S9u8DHxsvBwMWysba0s7i6ub6zsrfQz9bGxczEwsm+vca0tMCOkZyVnKXd6vHo9//l+P/h9/3h+/7h+/7i+v7j+vvk+/3j+/3i/f3i/f3i+vvi+vvi+vvi+vvh+frh+frh+frh+frf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jb9vbb9vbb9vbb9vba9PTa9PTa9PTa9PTZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/De3uHIyMu9vb+zs7aVlZeTk5XAwMLHx8mrq6uvr6+6u76Ji45bXmZUVmNQU2JYW2xWWGpiZHNvb3uxsb2bm6Z+foloaHRranpeX3RISV9ISmVNT2xGSWY/Ql85QFw7Ql4+RWI+RWI+RWI+RWI+RWE9RF87Ql47Ql47QlxAR2E+QV5ARV5RVWpOUWNVV2SBhY+VlaGFhZCHh5NpaXRmZnJsbHiAgIyJiZWwsLm0truxsrijpKqFhoyvsLamqK2ys7m5uL2ysba4t7vBwMW5uL2bmp6ioaW7ur/JyM25uL2sq7C3trq0s7jZ19zEwsfIx87AvcelpK2ysruHjJalr7nf6/Tm9//k+v/h+/7h+/vi+vvj+vvk+/3j+/3i/f3i/f3i+/ni+/ni+/ni+/nh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jb9vbb9vbb9vbb9vba9PTa9PTa9PTa9PTZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/Df3+LS0tSampydnZ+jo6WTk5WtrbCzs7avr6+fn5+XmJuvsLN6foZqbHlOUF9RVGV3eYtoanl6eoeUlKHIyNRcXGhsbHl0c4R5e41QUWZFR19ISmVHSmhBRWI9RF8+RWE+RWI+RWI9RGE9RGE+RWE+RWE9RF87Ql49RF05QFpARGE/RF1QVGleYnNkZnN3eoVdXWltbXmJiZV7e4dqanZ6eoaGhpGTk56ioquztLq5usCys7mWl52Rk5iztLqpqrC4t7uysbatrLGvrbK+vcG4t7uxsLSlpKm+vcHHxsu6ub6Uk5e9u8C3trrAv8TOzdTHxs+wr7i9vcaanql4f4mxvcbp+P/k9/7i+v7h+/vi+vvi+vvj+/3j+/3i/f3i/f3i+/ni+/ni+/ni+/nh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jb9vbb9vbb9vbb9vba9PTa9PTa9PTa9PTZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/DMzM7X19qzs7aqqqywsLKsrK+ampyUlJahoaGlpaWjpKakpamYnKSChZFXWmlUVmhwcoRcXm1/fo5mZnOTk59aWmWJiZahoa2kprZ0d4hFSF1GSGFMUGpHSmg/RmI7Ql49RGE9RGE9RGE9RGE9RF8+RWE+RWE9RF8+RV46QVs7P1xARV5OUWZjZniFh5SjprGMjJeAgIx3d4KEhI97e4d/f4uQkJyOjpqYmKK0truztLqztLqkpauBgoikpauhoqi0s7izsrexsLS3trrMy8+9u8C+vcG5uL2/vsK7ur/GxcmYl5zMy8/Cwcbs6/Dh3+bEwszHxs+2tr+ws755gIuJk53r9//j9Pvj+f7h+/vi+vvi+vvj+/3j+/3i/f3i/f3i+/ni+/ni+/ni+/nh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jb9vbb9vbb9vbb9vba9PTa9PTa9PTa9PTZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/DExMbMzM7Pz9K4uLq6ur2zs7bCwsWsrK+YmJiQkJCTlJaXmJycn6iHiZZMTl1JTF1xc4Jsb35ranpOTV1GRlNPT1xlZXF+fot5e4iFh5ZfY3c+QFhPVG1GSWZBSGQ+RWE+RWI+RWI+RWI+RWI5QFw6QV0+RWE+RWE9RF09RF07P1xITWZITGFcX3GBhJCssLqvr7qTk56GhpGJiZWOjpqIiJSXl6OIiJSdnaalpqyvsLays7m4ub+am6GNjpSwsbe0s7i5uL2xsLS6ub7FxMjHxsu9u8C5uL3FxMjIx8zFxMiko6iopqvW1drj4ubd3OPU09zLydPAwMnN0NuWm6aQl6LIztzr9//j+f7j+/3i/f3i/f3i/f3i/f3j+/3j+/3j/fri+/nh+vjh+vjh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jc9/fc9/fc9/fc9/fb9vbb9vbb9vbb9vbZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/DAwMK3t7nLy82+vsCoqKq2trjIyMvHx8mysrKqqqqsrbCfoaSYnKSbnapHSVhJTF1TVWRlaHeEgpNYV2hNTFxeXmtdXWlwcHuOkZyvscCTlqpJTGRJTmhITGlBSGRBSGQ/RmM+RWI+RWI+RWI6QV06QV09RF8+RWE+RV5AR2E+QV5BRl9BRVpdYXJydIF7f4l9fYiIiJSBgY2FhZCPj5uXl6OlpbGfn6umprCqq7G4ub+2t72tr7SxsriGh42qq7G7ur/My8/Cwcarqq+5uL3NzNDEwse6ub63trq9u8C+vcGxsLS/vsLf3uPEwsfd3OPt7PbCwcvHx9DQ0NzFx9SPlJ+qr73r9P/l+f7i+vvi/f3i/f3i/f3i/f3j+/3j+/3j/fri+/nh+vjh+vjh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jc9/fc9/fc9/fc9/fb9vbb9vbb9vbb9vbZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/DBwcS6ur3Fxce+vsCQkJOlpai7u77BwcTFxcW+vr6ztLewsbSssLiUlqNMTl1PUWNcXm1hY3KFhJRqaXtUU2NiYm9aWmVqanOvsrq6vclfY3RWWm9ARV4+QV5GTWlCSWVCSWY/RmM+RWI+RWI6QV07Ql49RF89RF8/Rl8+RV5ARGFARV5HSl9cX3F7fot6fohzc3+GhpGFhZB/f4uLi5aYmKSTk56Pj5ukpK3NztS7vcKztLqkpaufoaatr7SdnqSxsLS/vsLPztOtrLGxsLSenaKvrbLCwca/vsKzsre4t7urqq+6ub6/vsLNzND39v3Z1+HEwsy9vcbGxtLX1+SanKmQk6LJ0Nvo+f/i+vvi/f3f/v3f/v3i/f3j+/3k+/3j/fri+/nh+vjh+vjh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jc9/fc9/fc9/fc9/fb9vbb9vbb9vbb9vbZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/DHx8nExMa9vb+9vb+mpqm5ubuxsbOzs7PBwb/Hx8eys7awsbSqqrOhoa1OTV9JTF1VV2lpa31QT2JxcIJlZHReXmthYWxqanOtrbeprLd9f457fZFTVW1GSGNITGlHSmhESmZBSmU+R2I+RWE6QV07Ql4+RWE9RF8/Rl85QFpARGFGSmQ9P1dMT2N+go53eoVvb3qCgo6Xl6OBgY2Cgo6IiJSWlqKFhZCWl52VlpyztLq/wMaMjZOhoqi9vcamqK2opqvFxMjOzdK0s7isq7C3trrAv8Sysba7ur/FxMjHxsu2tLnAv8TOzdLc29/U09fX1t3j4um/wMasrLbAwMy0tMF/f4ycoazh8Pfl+fvi+vvi/f3i/f3i/f3j+/3j/frj/fri+/nh+vjh+vjh+vjh+vjh+vjh+vjf+Pnf+Pnf+Pnf+Pne9/je9/je9/je9/jc9/fc9/fc9/fc9/fb9vbb9vbb9vbb9vbZ8fLZ8fLZ8fLZ8fLX8PHX8PHX8PHW7/CRkZHAwMCrq6vLy8u+vr7BwcG5ubm9vb3ExMG/v7/OztCtrLOvrLmfna1QTWFOTWJIRl1xb4ZcW3B6eYyAf49cXGmCgo5sbHZ9foSCgoyYmKStrL2dm7JOTGVOTGhKTWpKVGxHVGtBTmU9Rl49RF06QVs7P1w9QF0/RF0/RF0/Ql8/Ql9BRl8/RFhmbXh+hItzd392dn+Ojpd+foeQkJ13d4SenquHh5OQj5alpKuLiZOjoquTkZicm6SvrLmhn6mioaWysrTPz9LAwMLGxsixsbOjo6WxsbO9vb/IyMvHx8nCwsXExMbHx8nNzc/MzM7x8PT29PnIx8ytrLO/vsXFxM2Rj5yWmqS4wsvm9v3k9vnr///j/frj/vve/fni/vjk/vnj/fji+/fi+/fh+vbh+vbh+vbh+vjf+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbd9/Td9/Td9/Td9/Tc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e94eHjMzMzS0tK2trbMzMycnJyHh4ewsLCmpqSioqK4uLqysbiwrbqin61PTF9MSF5WVGtXVWxNTGFoZnmYmKVkZHCcnKVzc31paG+FhIulpK2xr73JxtqJhp1YVG9UVHBETWVOW3JEUGg+R186QVs6QVs+QV4+QV4/RF0/RF0/Ql8/Ql9CRmM9QVhaX215foh0eIJwcHmIiJGJiZWTk5+Li5d6eoeUlJ+PjpefnqWWlZ6NjJWVlJ2Pjpe2s8C7usSamJ2ysrTBwcS4uLq/v8HHx8msrK+hoaO7u77Gxsi+vsDBwcTAwMLFxcfMzM7Hx8nj4+XCwsXS0NW3trrAv8a/vsWrqrOOjpeiqbLh6/Pl9vnp+v7l/fvh+vji//re/ffj//nj/fji+/fi+/fh+vbh+vbh+vbh+vbf+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbd9/Td9/Td9/Td9/Tc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9sbGqWlpTPz82/v724uLZ+fnuFhYK/v72hoZ6enpyjo6WxsLSpqLGrqbZIRlRPTV1YV2pYV2pTUWJcXGl0dIF3d4J7e4VmaG1vbXSWlZyvrbe+u8i9usuyr8JbV21WV3BCSWNRW3ZJU21CSWU9RF8+QV4/Ql8+QV4/RF0/RF0/RF0/RF0/Ql9CR15NU2FzeIR4eod6eod/f4yWlqN7e4eamqOFhY6Cgo56eIWYlqOdnKWXlp+Xlp+WlZ6qqbDHxs2wr7Ozs7arq62xsbOysrSrq62/v8HGxsizs7bBwcTHx8nBwcS5ubu9vb/IyMvIyMu9vb/Hx8m4t7vBwMW5uL/JyM+5uMGLi5SMkJvG0Nnt+v/o+f3l+fnl//3f+/bh//nj//nj/fji+/fi+/fh+vbh+vbh+vbh+vbf+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbd9/Td9/Td9/Td9/Tc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9hYV55eXfZ2dbLy8jIyMaFhYJ3d3ShoZ6foZy0tLKdnZ2fn6Kmpaycm6RWVGFMSVZOTltVVWJQUFxFRVBhYWxNTVZNTlRoaW9ram+enaK9u8KjoqvEwc+7ucl3c4dRUGVGSmRNVHBOVXFITGlFSGVBRWI+QV49QVs/RFs/RFs/RF0/RF0/Ql9ESGJCSFhxdoFzdoJxcX53doaXl6SFhY6LjJGPj5iUlJ9xb32MiZalpK2oprCdm6ibmqOQj5a7ur+4uLq4uLq7u77ExMa7u760tLeysrTt7fC4uLrFxcfCwsXFxce9vb+0tLe3t7m5ubuoqKrJyczEwse6ub6xsLe4t77Ix9CenqiCh5GTmqPc6e3i8vbm+vrj+vnj//ni/vjk/vnj/fji+/fi+/fh+vbh+vbh+vbh+vbf+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbd9/Td9/Td9/Td9/Tc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9WV1NvcGu9vrm9vrmPkIx2d3KAgX2UlZCChH+ys6+zs7GEhIShoaOMi4+WlZxranFkZG1UVF1UVF1PT1haW2FUVVtOT1NkZWlvbXKIh4ylpKmjoqnCwcumpLFxb31lZHRTVms/RF1PVG1PVG1ITGlCRmM7P1w+Qlw/RFg/RFg+Qlo+QlxBRWI+Qlw/RVd6f41zdoJvb3ttbH2NjZqWlp+ChImdnaaTk56PjZtycH2PjpexsLmwrbqenaaMi5GPjpOxsbPBwcTExMa6ur3GxsjGxsjJyczMzM64uLrMzM7Hx8nFxcfAwMLAwMK6ur2ysrS6ur3o6Orc29+/vsK9u8K4t77NzNXIyNKHi5V5gImps7nt+v/k9/fl/fvk/vnh/ffl//rk/vnj/fjj/fji+/fi+/fi+/fi+/ff+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbc9vPc9vPc9vPc9vPc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9UVVBiY159fnmrrKiio55iY16HiIRzdHBrbGiLjIeLi4iAgH6AgICHh4mwsLKwr7Npam1dXmJYWl1kZWlaW15cXWFUVVhlZmpvb3F3d3m5ubucm5+5uL+Mi5Swr7iGhpNjZXdMT2RQVGlQU2tPUWxJTWo/Ql8+Qlw/RFhARVo/RFs/RF0/Ql8/RF1CSFtqb32Ago97e4hkZHF4eIWcnKiGho+RkZuYmKSjoa2TkJ14d4CPjpewr7ixsLmYl56GhYyrqq+7u77ExMbJycy+vsDMzM7IyMvi4uTNzc+4uLrLy83JyczHx8nCwsXBwcTCwsW7u77AwMLEwsfIx8zHxs2opq3S0NrFxc6fo617gIuGjZTU4eXl+Pjl+fnj/fjj//nl//rk/vnj/fjj/fji+/fi+/fi+/fi+/ff+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbc9vPc9vPc9vPc9vPc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9VVk9lZl9sbWapqqOJi4RXWFGEhX5tb2hkZV5zdHBqa2ZkZGJhYV5lZWWfn5+Ojo5pamxqa21eX2JdXmFlZmmEhYdMTU9pamxycnRra2uenp6Li42Xl5pqaW1mZWyFhI19fYhmaXZVV2lQUWZQU2tPVG1ER2Q7QlxARVpBR1pARVw/RF0/Ql9ARV5CSFtTV2V5fYd5eYJtbXd3d4KFhZGBgY6FhZGamqWNjJWfnqWfnqiCgYuUk5yzsrual6SMi5Sko6i7u77FxcfV1dfPz9LGxsjU1NbIyMvf3+K7u77Nzc/Hx8nIyMvMzM7Ly83GxsjCwsXOztDHxsusq7C2tLurqrG6ucLOzte+wcx7gIuCiZCfrLHj8/Tm+vrm/vrl//rl//rk/vnj/fjj/fji+/fi+/fi+/fi+/ff+fff+fff+fff+ffe+Pbe+Pbe+Pbe+Pbc9vPc9vPc9vPc9vPc9vPc9vPc9vPb9PLa8/Ha8/Ha8/Ha8/HZ8vDZ8vDZ8vDX8e9VVlFbXFdmaGNsbWZmaGFeX1hlZl9jZF1bXFVeX1teX1taW1ZpaWZjY2GOjox0dHJjZWRkZmVdX15UVlVlaGZ7fX9iY2VrbWxzc3NpaWlsbGyRkZF9fX12dnh4eHp7en+JiI2AgYdkZHBWWGhUVWpUVm9JTmhARV5BR1pBR1pARVo/RFs/Ql9ARV4+QldCRldrbXqAgIlsbHZ4eISHh5RqaXl0dIGCgo6JiI+WlZyfnqioprB6eYKIhpOOjJqFgo+Uk5ekpKa3t7nExMbOztDOztDQ0NPX19rU1Nbb293Pz9LOztDPz9LMzM7Ly83Nzc/FxcfIyMvCwca+vcS0s7q3tr2ysbrS0NrS0t2Mj5qEiZB+iI7e7/Dq/f3q//7j/fjl//rk/vnj/fjj/fji+/fi+/fi+/fi+/ff+ffh+Pfh+Pfh+Pff9/bf9/bf9/bf9/bd9PPd9PPd9PPd9PPd9PPd9PPd9PPc8/Lb8vHb8vHb8vHb8vHa8fDa8fDa8fDZ8O9PT01bW1hpaWaFhoFrbGhlZmJjZF1jZF1OT0pUVFFVVVNRUU9wcG1wcG1YWFZkZGJqamhiYl9bW1hXV1VmZmRqampqampmZmRoaGVkZGJhYV5eXlxpaWZ/f394eHhxcXF0dHJtbW1vbXJfX2lQT19MTWJHSWJBRFxBRVZMT2FOUWY/QVpBRFw/QVo/QldCRlphY3KGhpF9fYhra3iJiZaIiJVkZHF/f4uOjpeHh5CPj5iYmKKqqraLi5eYmKWNjZiNjJCenqGwsLLAwMLLy83AwMLPz9LU1NbIyMvb293FxcfS0tTGxsjHx8nGxsjNzc/GxsbLy83JyM++vcStrLGlpKmzsrvGxNDS0Nq3tr+Hi5ORmp3q9/np+/np/vrk/ffm//nl/vjk/ffk/ffj+/bj+/bj+/bj+vfh+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Ph9vLh9vLh9vLh9vLf9PHf9PHf9PHe8/De8/Dd8u/d8u/d8u/d8u/c8e3c8e3c8e1TU1NOTk5ra2lzc3Fxcm1dXlpiY1xpamVRUU9MTElaWldNTUpiYl+OjoxeXlxaWldpaWZiYl9cXFpbW1hiYl9oaGVhYV5kZGJlZWNWVlRkZGJhYV5fX11lZWNlZWNtbWtzcm9qaWVpaWmFhIhfX2tUU2NUVmhRVWZMUFxVWmVVWGpFSFxBRVo/QVo/QldCRFhJSFhsbHmGhpN9fYmCgo6pqbSkpLCEhI9fX2twcHl/f4iUlJ+VlaKUlKGhoa2qqrOQj5SenqG0tLe3t7nLy83JyczFxcfOztDHx8nb293Nzc/T09XExMbJyczT09Xd3d/a2trGxsjGxczEwsnLyc6dnKGvrbe/vcnLx9LW1d6cnaOPlZrf7ezr/vvp/vnm//nm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Ph9vLh9vLh9vLh9vLf9PHf9PHf9PHe8/De8/Dd8u/d8u/d8u/d8u/c8e3c8e3c8e1KSkpNTU1dXVtoaGVmaGNiY15fYVpmaGNUVFFPT01fX11UVFFVVVOCgoB+fntTU1BiY15dXlpbXFdcXVhiY15lZmJeX1tlZmJpaWZQUE5dXVtlZWNoaGVtbWtqamhkZGJwcG1iYl9fX1+NjpB7fYJeXmhaWmVYXGRVW19cYmlaXmpGSVtARFdARFhCRltISV5UU2VpaXZ6eod3d4KNjZajpKqys7nFxsyJiZViYm9aWmaBgY6Tk56OjpeTk5y2tr+2tLmcnJ64uLq4uLrCwsXS0tTCwsXQ0NPU1NbU1NbT09XQ0NPHx8nGxsjIyMulpai3t7e7u77EwsfJyM2/vsLHxsubmqOysbrNydS+vcbAwceOlJjc6unl+Pbp/vnk/ffm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Ph9vLh9vLh9vLh9vLf9PHf9PHf9PHe8/De8/De8/Dd8u/d8u/d8u/d8u/c8e3c8e1BQUFMTExVVVNjY2FiY15aW1ZeX1hhYl1XV1VYWFZVVVNOTkxYWFZlZWOTk5BMTElbXFdXWFRXWFRaW1ZfYVxcXVhcXVhfYVxeXlxaWlddXVtlZWNlZWNtbWtqamhaWldmZmRbXVxeYV92eHeIiYxrbG9dXmJaW11YXVxdYmNYXGRERlNAQlRERVpMTWJUVmhMSlthYW1+fomAgImFhoyhoqW2t7nGx8vGxtKFhZFYV2hiYm+Li5SEhYuXl6GkpauenaKlpaioqKrAwMK2tri7u77Ly83MzM7AwMLMzM7GxsjGxsjOztDJycyOjpB5eXuLi4uoqKrCwsXAv8S/vsLV1NurqrGTkZu5tsDPztfW192Vm5/N29ro+vjq//ro//rm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Ph9vLh9vLh9vLh9vLf9PHf9PHf9PHe8/De8/De8/Dd8u/d8u/d8u/d8u/c8e3c8e1ISEhOTk5WVlRmZmRdXlpOT0pRU0xfYVxXV1VcXFpQUE5QUE5eXlxjY2F9fXpWVlRYWlVfYVpXWFFfYVphYltcXVZaW1RfYVxiYl9dXVtaWldeXlxlZWNlZWNkZGJVVVNYW1pYW1peYV9jZWRkZGRpaWloaGVUVlNUVlFbXVpeX2NRUVtJSVZFRFRNTFxeXW1dXWphYWxpaXKBgoh9foGJi42vsbC+v8HJydPOztuHhpZRUV5xcXqYmp+YmKKPkJZ+fYHFxcesrK+/v8HLy83AwMLCwsW+vsDNzc/Gxsi4uLq9vb/OztDNzc/T09XOztDMzM6vr7G+vsDJyM24t769u8LQz9aTkZi5tsDNzNXc3ePN09fV4+Lp+/nm+/fj+/bm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bk+fbk+fbk+fbk+fbj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Pf9PHf9PHf9PHe8/Df9PHf9PHe8/De8/Dd8u/d8u/d8u/d8u9PT09HR0dRUU9dXVtWV1NNTklVVk9hYl1dXVtfX11fX11bW1hWVlRhYV5hYV5dXVtUVVBoaWJVVk9iY1xiY1xdXldXWFFeX1tbW1hdXVtWVlRdXVtlZWNkZGJkZGJWWFdTV1hYXV5bXF5iZGNiYmJjY2FsbGpXWFRaW1ZiZF9hYmRUVVtKSlRGRlFKSlZXV2NhYWppanBcXWN/gIR6e359f36lqKaxsrTBwcvQ0N3Nzdpzc4BeXmqbm6Sbm6SioquamJ2/v8Gzs7bFxcezs7bIyMvCwsXLy83T09XS0tSqqqyfn6K5ubvLy83T09XU1Nbj4+Xp6eu3t7nEwsfLydCysbrCwcivrbSvq7bBwMnOz9XZ3uPb6ejo+vjm+/fk/ffm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bk+fbk+fbk+fbk+fbj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Pf9PHf9PHf9PHe8/Df9PHf9PHe8/De8/Dd8u/d8u/d8u/d8u9aWlpQUFBRUU9PT01QUU1OT0pXWFFeX1tbW1heXlxfX11cXFpWVlRjY2FeXlxaWldfYVxkZV5YWlNkZV5hYltfYVpiY1xUVVBaWlddXVtcXFpfX11jY2FfX11hYV5WWFdVWltQVVdOU1VjZGZpaWtdXV1jYWJbWldWV1NjY2FkZGRcW19XVl1UU1pTUVZUU1ddXmJ2d3ljZGZxcnR0d3Z3eXibnZyYmpypqrDJydPX1+G+vslbW2h4eIWIiJWUlJ2JiI29vb/d3d+ioqSwsLK+vsDMzM7CwsXLy83S0tSmpqmWlpi9vb/GxsjV1dfa2tzm5unm5unb29u/v8HNzNW/vsfNzNPIx86jn6q3tr/Awcfd4+jh7+3o+vjo/fjl/vjm//nl/vjk/ffk/ffj+/bj+/bj+/bj+/bk+fbk+fbk+fbk+fbj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Pf9PHf9PHf9PHe8/Df9PHf9PHe8/De8/Dd8u/d8u/d8u/d8u9YWFhhYV5YWFZUVFFPUExPUExXWFFaW1ZbXFdlZWNfX11iYl9bW1hfX11YWFZVVlFiY1xkZV5TVE1YWlNkZV5jZF1dXldVVk9XWFRTU1BdXVtYWFZdXVtYWFZbW1hUVlNOU1RHTE1FSUpfYWNhYWNdXV1iX2FfXlxWVlRjY2FeXl5WVlhUVFZXV1paWlxXV1daXFtmaWhfYmFfYmFmaWhxc3KNj46BgoWLjJHFxszW193S09mlpbF2doFlZXGHh5OHho2PjpPi4eWbmp60tLfFxcfNzc/IyMvIyMvS0tTNzc/m5unS0tTNzc/MzM7f3+Ll5ejx8fPk5OTHx8nGxczQz9bIx87Ewse9ucGtrLPFxsnO1Nbf6+vp9/Tq+/jq/fnp/vnl/vjk/ffk/ffj+/bj+/bj+/bl+vbk+fbk+fbk+fbk+fbj+PTj+PTj+PTj+PTi9/Pi9/Pi9/Pi9/Pf9PHf8/Pf8/Pe8vLf9PHf9PHe8/De8/Dd8u/d8fHd8fHd8fFVVVNcXVhfYVxVVlFRU05JSkZPUExcXVhaW1ZdXlpeX1tdXlpdXlpXWFRaW1ZYWlVhYltkZV5bXFVNTkdeX1hXWFFaW1RaW1RWV1NXWFRfYVxYWlVhYl1RU05YWlVcXFpOUE1WWFdHSUhYWFhlZWVeXlxhYV5jY2FVVVNlZWNkZGJaWlpTU1NfX19bW1tPT09bW1toaGhYWFZkZGJqamh5eXeHh4eAgIKMi4+/vsXS0tTIyMu2tLmjoqZ+fYReXWZ2c4CIhpOfnqiTkZienaLe3uHS0tTMzMzHx8nFxcff3+LJyczW1tnQ0NPS0tTZ2dve3t7q6urq6urV1dXFxcfIyMvX19rAwMLAwMK3t7m9vsDJzs/L0tLZ393s9vLs+PTq/fnp/vno/fbl+vPp/vfl+vPk+fLk+fTj9vbk9/fk9/Tl+Pbj9vLl+PTl+PTi9PHi9PHi9PHi9PLh8/Hh8/Ph8vbh8vbh8vbh8/Hh8/Dh8/Hh8/Hf8vLf8fTf8fTf8fRPUExVVlFdXlpaW1ZISUVFRkFNTklYWlVUVVBdXlpeX1tXWFReX1tYWlVUVVBdXlpcXVZdXldYWlNFRj9XWFFVVk9aW1RaW1RYWlVdXlpbXFdaW1ZeX1tTVE9RU05dXlpTU1BcXFpQUE5WVlRaWldRUU9XV1VcXFpQUE5YWFZpaWZeXlxMTElVVVNXV1VTU1BeXl5jY2FfYVxjZF9yc293eHN0dHJxcXN7en+XlpukpKaCgoKfn5+5ubuYl5yBgIlkYnB9eoiHhZGNjJWWlZypqKzCwsXAwMDHx8nQ0NPW1tm6ur3Pz9Lb293IyMvJyczd3d3X19ff39/W1tbExMTNzc3MzMzFxcXBwcHHx8ewsrHFx8bFycjCx8bs8fDv+PTs/vrq//rp/vfp/vfl+vbo/fjl+vPi9/Lm+ffl+Pjj9vPi9PLm+fbj9vLi9u/l+PTi9PHi9PLh8/Hf8vLh8/Ph8vbh8vjh8vbh8/Hh8/Hh8/Hh8/Pf8vLf8fTf8fff8fdJSkZRU05eX1teX1tKTEdCRD9HSERUVVBTVE9cXVhdXlpWV1NeX1tYWlVUVVBdXlpaW1RbXFVdXldHSEFWV1BWV1BbXFVYWlNYWlNeX1haW1RYWlNcXVZOT0hPUEleX1tdXlpaW1ZRU05TVE9eX1tRU05TVE9YWlVRU05XWFRqa2ZYWlVNTklRU05aW1ZbW1hfX11lZWNfYVxkZV5maGFkZWFwcG1sbGxpaGx+fYF/f39ycnCAgH6lpaWJiI2joqllY3BiX2xsane0s720s7qdnKGxsbOWlpi0tLfV1dfb293c3N7Nzc/W1tnIyMvQ0NPT09PQ0NDc3NzT09PNzc3U1NTGxsbIyMjGxsa+vr6LjYy5u7rO09LBxsXX3Nv0/vrs/vjo+/Tl+PTl+PTp+/nl+Pbk9/Tm+ffi9PLj9vPl+PTm+fbj9vLl+PTl+PTi9PHk9/Tj9vPi9PTi9PTh8/Ph8vbh8vbh8vbh8/Hh8/Hh8/Ph8/Pf8vLf8fTf8fTf8fRISUVUVVBiY15eX1tNTkk+PzpFRkFbXFdYWlVcXVhdXlpcXVhdXlpXWFRaW1ZYWlVeX1heX1hiY1xTVE1bXFVbXFVdXldWV1BaW1RdXldaW1RVVk9bXFVISUJRU0xfYVpVVlFXWFRXWFRRU05cXVhPUExTVE9dXlpQUU1cXVhpamVYWlVWV1NVVlFiY15eX1tjY2FhYl1maGFjZF1iY1xkZV5lZmJfX19hYWNxcXNtbW1oaGVxcW9/f397e37CwcZ7eoRcW2RbWmNkY2pqaW2Ih4yoqKqVlZerq63Ly83Hx8nf3+LU1NbV1dfV1dfT09XZ2dnZ2dnf39/h4eHU1NTNzc3V1dXMzMy5ubnJycycnZ+ys7azuLnQ1dbM0NLp8PDt+/nr+/rs/fvp+frp+f3p+P/o9//l9Pvl9/rk9/fk9/fj9vPk9/Ti9PLi9PHk9/Tk9/Tj9vbj9vbi9PTh8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Pf8vLf8vLf8vLf8fRJSkZJSkZaW1ZcXVhMTUg5OjZCRD9dXlpWV1NVVlFYWlVcXVhbXFdaW1ZeX1tXWFRhYltcXVZdXldYWlNOT0hUVU5YWlNYWlNaW1FdXlViY1pcXVRcXVRUVUxXWE9aW1RTVE1YWlNdXldMTUZaW1RbXFVfYVpiY1xPUEldXldkZV5iY1xeX1hXWFFhYltdXlpbXFdeX1toaWJkZVxhYlhfYVpdXlpiYl9WVlhqamxqamhfYVxqa2ZjY2FoaGqmparMy8+OjZSVlJt6eX5/foKqqqylpahiYmStrbC+vsCkpKa+vsDAwMLNzc/T09XS0tTc3Nzl5eXf39/i4uLc3NzU1NTIyMjBwcHGxsjFxMidnqKwsbStsrTCx8nb3+Li6Orq9Pjp9vrV4um3wsyXo7GXorSao7mhq763xdOwwMu6zNPN3uTi8/fh8/Pd8O3k9/Td8PDh8/Ph8/Pf8vLh8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/Ph8/NMTUhMTUhcXVheX1tRU04/QDtFRkFbXFdPUExRU05aW1ZWV1NaW1ZaW1ZaW1ZVVlFcXVZbXFVdXldcXVZKTEVQUUpVVk9VVk9XWE9cXVRhYlhaW1FRU0lUVUxYWlBbXFNPUElXWFFiY1xVVk9UVU5XWFFbXFVbXFVOT0hkZV5hYltbXFVcXVZVVk9dXldYWlNcXVhjZF1aW1FdXlVjZFtdXlVaW1RfX11aWlpmZmZiYl9aW1ZfYVxiYl9fX1+Li42enqG2tLmysbaJiI1+foCcnJ64uLpra22CgoWPj5GcnJ6oqKq0tLeysrS9vb/Nzc/Q0NDa2trf39/p6enm5ubb29vMzMy4uLrOzdK/vsKhoqWpqq2rsLK0ubvO09Xh5uvP1t3HztettL+fpbasscadoruEh6SEi6aEkKWAkJ+Lm6iXqLKoucDG193c7fHe8PPk9vni8/ff8fTe8fHh8/Ph8/Ph8/Hh8/Hh8vbh8vbh8vbh8/Ph8/Ph8/Ph8/Hh8/FWV1NRU05bXFdaW1ZbXFdHSERISUVYWlVOT0pTVE9aW1ZYWlVaW1ZWV1NYWlVPUExXWFFYWlNXWFFYWlNHSEFNTkdQUUpRU0xTVEpbXFNfYVdVVk1NTkVRU0lVVk1aW1FcXVZRU0xYWlNYWlNWV1BaW1RYWlNVVk9PUElkZV5eX1hXWFFcXVZUVU5bXFVVVk9aW1ZaW1RdXlVfYlVeYVRiY1pVVk9hYV5cXFxiYmJcXFpYWlViY15paWZeXl5paWlra2t/f4G0tLehoaOHh4mcnJ6lpahqamyHh4nExMaUlJaGhoiVlZe5ubu5ubuBgYSRkZHS0tLw8PDU1NTZ2dnl5eXZ2dnGxsjCwcbOzdSam6GsrbOws7mlqa+7v8Xe4ujr8fPW3OHHzNa4vcvf4/ixs86Njq2Ei6h+i6J6iZt9jJ1/jp+Onq2Qoa2isr++ztnZ6vHj9Prh8vbd8PDh8/Ph8/Hh8/Hh8/Hh8vbh8vjh8vbh8/Ph8/Ph8/Hh8/Hh8/BXWFRUVVBdXlpcXVhhYl1NTklKTEdXWFRJSkZQUU1OT0pbXFdbXFdQUU1aW1ZJSkZVVk9WV1BPUElQUU1ERUBJSkZOT0pOT0pQUUpaW1FeX1ZTVEpPUEdPUEdOT0ZYWlBbXFVOT0hVVk9WV1BJSkRTVE1XWFFVVk9QUUpcXVZfYVpaW1ReX1hVVk9bXFVUVVBcXVhaW1ZfYVdjZFtXWE9cXVRhYl1eXlxdXVthYV5cXVheX1tkZWFsbWllZWNiYmJUVFFkZGKXl5eioqJ9fX2rq6ubm5tTU1V5eXu7u76FhYdwcHKAgIK+vsCYmJuGhoZwcHC2trbk5OTt7e3m5ubi4uLd3d3Pz8/EwsfEwsfBwsaOj5OxsraXmJyoqazS1tno7O/T19q7v8e9wc24u8+cnreAgp+BhaJ9hp57iJ17iJ15hpt4hZp9iZ6IlaqVo7Shr73L3OPh8vjh8vbh8/Ph8/Hh8/Dh8/Dh8/Ph8vbh8vbh8/Ph8/Ph8/Hh8/Hh8/FTVE9WV1NXWFRVVlFVVlFWV1NQUU1YWlVHSERKTEdPUExhYl1MTUhbXFdQUU1JSkZRU05NTklTVE9UVFFJSUdOTkxMTExNTUpTVE9TVE1VVk9VVk9RU0xXWFFTVE1WV1BWV1BQUUpPUElTVE1HSEFRU0xQUUpTVE1VVk1VVk1cXVZeX1hYWlVVVlFVVlFNTUpUVFFaW1ZdXldfYVphYltbXFVYWlVeXlxbW1hcXFpkZWFkZV5hYltsbWlmZmRfX11VVlFaW1Rqa2Z9fnlvb2yCgoBpaWZYWFhsbGyhoaGBgYGMjIyVlZWenp5+fn5oaGhkZGKTk5C4uLbOzszl5ePV1dPW1tSvr6zHx8e6ur3Q0NOxsbOpqaufn6KdnZ+lpqnNztLm6O2vr7ipq7ibna+Oj6WGh5+EhqGIjaSUmK2fpLukqcCTl6+Jjqh/hJ10e5WFj6KkssLV5fDh8vje8vLf9PDf9O3j+PHi9PHj8/Lj8/Lj8/Ti8vPi8vbi8vbi8vZKTEdQUU1WV1NWV1NbXFdYWlVOT0pTVE9HSERJSkZVVlFfYVxMTUhXWFROT0pFRkFRU05MTUhOTkxVVVNMTExMTExHR0lKSkpPUExQUUpUVU5UVU5TVE1NTkdaW1RbXFVWV1BQUUpPUElTVE1OT0hMTUZTVE1PUElVVk1VVk1YWlNdXldWV1NUVVBPT01ISEZQUE5YWFZdXlphYltjZF1eX1tYWFZdXVteXlxfX11eX1teX1hVVk9eX1tYWFZUVVBRU0xWV05jZF1tb2hiY154eXRmZmRcXFpfX19/f39xcXGHh4eGhoZ2dnZtbW1cXFxeXlxxcm2mqKOJi4bX2dSrrKjExcCNjYvMzMy3t7fOzs7Q0NDb29u9vb26urqqqqzd3OPS0Nq+vsmsq7uUlqiHiJ2IiaKJi6OFh5+GiKGQk6ubnbaipL2WmLGOkKmEiJ95gpiHlaajsb/V5u3e8PPb8Ozh9u/f9O3i9PHj8/Lj8/Lj8/Ti8vPi8vbi8fji8fhGR0JOT0pUVVBWV1NWV1NUVVBKTEdPUExQUU1MTUhaW1ZUVVBKTEdWV1NWV1NOT0pPUExNTklNTUpTU1BQUFBHR0dAQEJHR0dJSkZRU0xNTkdVVk9OT0hXWFFdXldeX1hWV1BQUUpPUElTVE1VVk9ISUJPUElOT0hVVk1VVk1WV05bXFVRU0xVVlFRU05QUU1PT01WVlRXWFRaW1RlZl9kZWFaWldeXlxbW1hhYV5YWlVeX1hbXFVdXlpQUE5KTEdVVk9cXVRhYltiY1xUVVBlZmJbW1hRUU9cXFpfX11lZWVxcXF4eHhpaWlxcXNWVlZcXFpmZmRsbGp5eXe2trN7e3mXl5VycnC0tLSzs7PGxsbBwcHIyMisrKy9vb27u77i4ejHxdLNzNyWlaiRk6l/gJh7e5eEhKKAgp93eZZ+gJuPkaqjpruytsmfo7SQlqmAiJx7hpiCkKGsu8ba6/Hm+fnj+PTh9vHi9PLj8/Lj8/Tj8/Ti8vPi8vbi8vbi8vZAQD5GRkRKSkhKSkhWVlRQUE5CQkBERUBRU05KTEdbXFdUVVBKTEdUVVBVVlFJSkZJSkZQUU1OTkxPT01TU1NFRUU6Oj1FRUVISUVISUVRU05RU05OT0pRU05UVVBaW1ZWV1NQUU1PUExTVE9YWlVJSkZKTEdOT0hKTEJUVUxYWlBdXldOT0hTVE9NTklKTEdQUE5QUE5PUExQUUpdXldiY15YWFZWVlRcXFpjY2FQUU1WV1BXWFFXWFRKSkhHSERWV1BdXlVeX1hYWlNQUU1jZF9iYl9dXVtUVFFcXFpfX19oaGhbW1tUVFZeXmFMTE5OTk5iYl9kZGJpaWaCgoBlZWNtbWtdXVufn5+zs7O6urq+vr6FhYV7e3uenp7CwsXZ19zGxc7GxtKwr7/W1+y/wNmVlbGGhqR3eJd4eZh9f5yAgpuLjqOUl6mdorCan62Nlal0f5F3gZOMm6XP3ubc7fPf8fTk9/fj8/Tj8/Tj8/Tj8/Ti8vPi8vPi8vPi8vY+Pj5BQUFNTU1GRkZISEhKSkpBQUFAQD5QUU1QUU1YWlVNTklAQT1ISUVOT0pFRkFHSERGR0JGRkRHR0VOTk5BQUE5OTs+Pj5EREFAQD5MTElNTUpMTElKSkhOTkxPT01VVVNNTUpJSUdQUE5dXVtTU1BKSkhNTklTVEpXWE9eX1heX1hQUU1FRkFISEZJSUdMTElQUE5WV1NTVE1eX1hdXlpTU1BUVFFVVVNdXVtVVlFVVk9aW1RVVlFISEZNTklXWFFfYVdhYltdXldVVlFcXVhaWldQUE5VVlFYWFZRUU9bW1tVVVVNTU9PTlNHR0lQUFBaWlpaWlpcXFxUVFRbW1tcXFxpaWmLi4vCwsKWlpawsLBzc3OAgICIiIienp69vbrJycfAwcWVlZ7Fx9bQ0uaYmrKHh6V7fZx4eZh4epV9f5eChpqYnK2anqqorbuiqr2Lk6ZyfY5zf42Onai3xtDc7fTb7PLj8/fk9Pbj8/Tk9Pbj8/Ti8vPi8vPi8vM2NjY7OztHR0c+Pj5ERERBQUE+Pj5BQUFNTUpKTEdQUU1OT0pCRD9ISUVMTUhERUBERUBFRkFFRUJEREFTU1NGRkY4ODo6Oj07OztAQD4/Pz1JSUdHR0VMTElHR0VGRkRPT01MTElGRkRRUU9YWFZTU1BOTkxISUVMTUZTVEpcXVZeX1hXWFRHSERGRkREREFHR0VKSkhRU05NTkdbXFVdXlpTU1BPT01WVlRYWFZVVlFQUUpWV1BMTUhJSUdTVE9eX1hmaF5maGFiY1xWV1NRU05TU1BYWFZOT0pUVVBXV1VQUFBRUVRHR0lIR0xBQEVOTlBbW1tVVVVfX19XV1dTU1NdXV1aWlpiYmKcnJx+fn5qampsbGxvb2+CgoKLi4uxsq3HyMSqrKt4eX+mqrR9f46Bgpd4eZFydI95e5Z7fpZ3eo+BhZiNkKKanqyjqLaiqLqQmKxyeo1sd4hyfY6MmqqywM7j8/7i8fjj8/fk9Pji8vPj8/Tj8/Ti8vHi8vE+PkA6Oj1GRkhGRkhKSk1ISEpCQkU5OTlNTUpJSkZHSERERUBCRD9GR0JMTUhHSERCRD9GR0JGRkRCQkBUVFRKSko4ODo5OTs4ODg3Nzc+Pj5CQkJMTExFRUVHR0dHR0dKSkpGRkZHR0dRUVFRUVFVVVVPT09EREFNTkdQUUhWV1BWV1BXWFRJSkZMTElMTElOTkxMTElNTklISUJeX1hmaGNcXFpUVFFXV1VbW1haW1ZVVk9XWFFPUExISEZUVVBiY1xpamFoaWJhYltYWlVGR0JKSkhYWFZPUExYWlVVVVNOTk5TU1VQUFNRUFVEQkdKSk1VVVdQUFNeXmFKSk1ISEpQUFNiYmReXmFjY2VYWFtWVlhbW11kZGZ+foCCgoWvr6+WlpajpKZtb3SNkJh6fohvcX5xc4Jwc4d7f5R7f5Rydot0eI2Eh5yChpuOkaaXnLGNkaZpcYVmb4JzfpCIk6WXpbfE0uLc6/Pi8fji8vbi8vPj8/Tj8/Lj8/Li8/A/Pz8+Pj5JSUlHR0k/P0E7Oz5BQURBQUFFRUJISUVFRkE/QDs/QDtCRD9MTUhNTklERUBJSkZJSUdEREFRUVFOTk46Ojo7Ozs3Nzc2NjY9PT1BQUFKSkpOTk5NTU1OTk5HR0c+Pj5KSkpQUFBNTU1WVlZMTExGRkRHSERNTkdVVk9WV1BdXlpPUExRUU9RUU9KSkhFRUJISUVGR0JVVlFiY15WVlRKSkhPT01aW1ZWV1NYWlVRU05YWlVMTEldXVteX1hkZVxjZF1cXVZhYl1OT0pOTkxTU1BcXVhYWlVYWFZKSkhRUVFQUFNVVFhMSk9GRUlJSE1OTVFaWlxQUFNNTU9PT1FbW11bW11dXV9fX2JXV1pUVFZpaWuOjpBvb3GCgoV5eXuIiY1maGt6foRrb3RmanJpbHdvcX52eIdydIRmaXp3eI2EhZt+f5WEhp6Ii6OFiaF2eo+JkaRxeY1weY+IkaqYpbrF1N7b6vHf8PPf8PHi8vPj8/Lj8/Lj8/I0ODA3OTRCRUFMTk0+P0EyMzY2ODdGSEVAQD5GRkRGRkQ+PjtHR0VBQT9GRkRISEZEREFMTElKSkhKSkhWVlRdXVtUVFFGRkQ0NDI5OTc7OzlAQD5EREFMTElKSkhCQkBCRUFFR0ZJTEpFRkhGR0lOUE9AQkFHSUZEREFJSUdVVlFbXFdPUExMTUg5OTc/Pz9HR0VCQkBGRkRFRUJdXVtbW1hRUU9OTkxMTUhTVE9OT0pXV1VTU1BNTU1JSUlVVVNlZl9kZVxhYltlZl9jZF9UVVBNTUpOTkxXV1VcXFpbW1hUVVBNTUpOTkxVVVVTU1VERUpFRkxGR01WV1tNTlFJSk5JSk1VVlhbW1tRUVFVVVVWVlZPT09dXV1lZWVlZWVlZmleX2JpamxhYmRjZGhvcHNoaWxlZmpkZWtxcXpzc39qandycYGLiZyYl6yHiJ6EhJ9vcYxjZnp3fY17gZRze5F0e5h+h6KQm6zM2d/f7O/i8O/k9Pbh8fLj9vbh8/NBRTpBRT1FR0JERkU5Oj0wMTM2ODdJTEhFRUJMTElHR0U4ODY2NjNAQD5HR0VFRUI/Pz1NTUpQUE5RUU9hYV5iYl9YWFZUVFE/Pz1AQD47OzlEREFGRkRMTElKSkhBQT9KTUlFR0ZHSEpGR0lERUdJSk1KTUxGSEVGRkZHR0dWVlRYWlVRU05UVFE/Pz87OztGRkRAQD5GRkROTkxpaWZfX11TU1BTU1BNTklPUExPT01KSkhRUVFGRkZEREZCQkJWV1BhYlthYltUVVBcXVhWVlRNTUpNTUpTU1NXV1dQUE5YWlVJSkZOTkxOTk5PT1FGR01ERE1HSE5UVVtOT1NFRklFRkhWV1pTU1NNTU1UVFRYWFhRUVFWVlZbW1tXV1deX2JVVlheX2JdXmFdXmFiY2ViY2VdXmFiY2ZkZWl7fYJmZnB2doKNjJyrqr2MiaGJiaVpaoJhZHZzeIajprp7gJd0eJZ0e5eAiJuQnaTb6Ork8vHj8/Tk9Pbb7e3k9/dCRjs9QDg+QDs+QD83ODotLzEyNDNCRUFNTUpPT01GRkQyMjAyMjA/Pz1FRUJHR0VAQD5JSUdKSkhMTElVVVNiYl9jY2FhYV5PT01FRUI5OTdCQkBEREFMTElKSkhCQkBERkI+QD8/QEI/QEI6Oz5AQUROUE9JTEhMTExOTk5aWldcXVhVVlFPT01QUFBAQEBMTElNTUpJSUdKSkhiYl9fX11UVFFMTElVVlFNTklPT01OTkxOTk49PT06Oj0/Pz9QUU1YWlNbXFdHSERcXFpMTElGRkZJSUlRUVFXV1dMTElYWlVKTEdPT01PT09KSk1HSExAQUdFRkxOT1NPUFRGR0lGR0lXWlhNTU1ISEhOTk5UVFRWVlZVVVVTU1NXV1dUVVdVVlhcXV9WV1piY2VdXmFdXmFiY2ViY2ZkZWliY2leXmhoaHNsbHl6eYmLiZ6IiaJxcohpa3qanKmssMGWmq9xc5Byd5Bye4t2gIjF0tTi8O/h8fTj8/fl9vff8PFUV01OUUk/QT1AQkFAQUQzNDcyNDM/QT5OTkxJSUc/Pz03NzQ+Pjs7Ozk9PTpKSkhHR0VISEZISEZRUU9KSkhRUU9TU1BYWFZdXVtISEY3NzRBQT8/Pz1JSUdNTUpHR0U6PTk7Pj1AQUQ9PkA7PT87PT9FR0ZERkJHR0dPT09PT01YWlVXWFRKSkhKSko/Pz9MTElISEZBQT9HR0VaWldUVFFKSkhKSkhISUVISUVISEZHR0VAQEA7Ozs4ODpBQUFcXVhYWlVYWlVVVVNMTEk/Pz9JSUlHR0dKSkpRUVFRUU9fYVxRU05RUU9TU1NGRkhAQUU7PUJCREdHSExQUVRNTlBNT05YW1pKSkpFRUVJSUlOTk5JSUlUVFRUVFRWVlZPUFNOT1FUVVdWV1pYWlxfYWNYWlxbXF5eX2NlZmpmaG1RU1hlZW9kZHB4eIWGhZWRk6h6fY5fYm9tcXuNj56XmK1+f5d0eI1xd4V3gYmfqq3c6evk8fji8fjj8/fh8fJbXlRPU0o4OjY4OjlAQUQxMjQzNjQ+QD1MTElKSkhBQT86OjhISEY7Ozk/Pz1RUU9CQkA/Pz1RUU9TU1BOTkxPT01PT01OTkxaWldFRUI6OjhFRUJFRUJGRkRMTElQUE45OzgwMjE5Oj00NjgwMTM4OTs+QD9AQj9GRkZRUVFTU1BOT0pYWlVTU1A+Pj5CQkJPT01MTElHR0VGRkRPT01ISEZCQkBCQkBFRkE/QDtBQT9EREFEREQ/Pz86Oj1FRUVQUE5QUU1bW1hBQT8+Pj46OjpGRkhQUFNGRkZNTU1OTkxYWlVTVE9NTUpTU1NJSUw/QEQ6Oz9HSExTVFZJSk1NT05OUE9VV1RPT09OTk5GRkZNTU1ISEhRUVFPT09RUVFMTU9OT1FPUFNNTlBYWlxdXmFWV1pQUVRWV1pWV1teX2NdXmJbXGJfYWZmZnBtbXl6fYlhY3BbXmZlaXFtcH2JiJh7eo9vcYJscXtpcHeHj5PFz9Xh6/Pe6/Lf7PHp9vpUV01MT0dERkE7Pj1AQUQ2NzkxMzJAQj9MTElRUU9HR0U3NzRNTUpFRUJBQT9OTkxFRUJBQT9QUE5MTElXV1VMTElGRkRJSUdWVlRBQT80NDI/Pz1CQkBJSUdKSkhUVFE+QD03OTg4OTsvMDIxMjQ+P0E/QUBHSUZHR0dFRUVISEZRU05bXFdeXlxMTExMTExMTElJSUdKSkhFRUJJSUdJSUdBQT9HR0VAQT1ERUBISEZAQD5CQkJISEhFRUdCQkJKSkhNTUpaWldCQkJAQEBOTlBHR0lNTU9ERERBQUE+PjtOT0pYWlVNTUpQUFBJSUlCREZCREdOT1FaW11MTk1MTk1KTUlRVFBWVlZRUVFFRUVMTExISEhOTk5TU1NWVlZQUVRPUFNQUVRGR0lUVVdbXF5VVlhUVVdRU1VUVVdcXV9eX2NPUFRWV1tjZGhrbHJkaHBTVl5XXF5lZmpzc32AgI12dIVvb3tlaXFla3B2foG2vcTc4+y4wczi7PLi7/NNUEZNUEhOUEw9Pz49PkA3ODo4OjlMTkpHR0VOTkxISEY+PjtQUE5OTkw+PjtKSkhCQkBAQD5NTUpGRkRVVVNUVFFOTkxISEZXV1VAQD4zMzE7OzlEREFRUU9JSUdVVVNGSEU7Pj04OTszNDc4OTtAQUQ6PTs+QD1ISEg+Pj5ISEZdXlphYl1cXFpaWlpMTExMTElNTUpISEZAQD5EREFFRUI3NzRJSUdAQT07PThGRkRCQkBERERKSkpOTlBHR0dHR0VMTElbW1tFRUVOTlBRUVRAP0RCQkU7Ozs+Pj4/Pz1RU05eX1tMTElKSkpJSUlHSEpISUxNTlBVV1ZOUE9ISkdFR0RNT0xTU1NWVlZMTExPT09NTU1KSkpXV1dXV1dWV1pNTlBJSk1JSk1QUVRQUVRaW11XWFtMTU9OT1FbXF5fYWNVVlhVVlheX2JiY2VYXV9UWFtkZWhkZWhkY2p2dH53dIFqaXJiZmliaGpqcHSjqbC/xtCNlJ7M1tzZ4+ZJTUJTVk5QU049Pz49PkAxMjQ5OzpISkdNTUpGRkQ/Pz1AQD5BQT9VVVM+PjtUVFFGRkRHR0VVVVNNTUpMTElPT01PT01MTElcXFpFRUI2NjM+PjtGRkRbW1hGRkROTkxCRUE4OjkyMzY0NjgyMzY5OzpISkdJTEhERERGRkRJSkZKTEdbXFdQUU1KSkg/Pz1HR0VUVFFKSkg4ODY+PjtNTUo7OzlISEZGR0I/QDtOTkxJSUdGRkZTU1NVVVU/Pz9HR0dNTU1eXl5KSk1JSUxFREhEQkc7Oj84ODo+Pj49PTpISUVeX1tHR0VGRkZISEpCREZGR0lHSEpTVVRPUVBHSUZAQj9JTEhHR0VYWFhXV1dWVlZTU1NISEhYWFhVVVVRVFNRU1VHSEpNTlBNTlBOT1FYWlxcXV9RU1VQUVRWWFdYW1pbXVxVV1ZeYV9hYmReY2RQVVZhY2JiZGNiYWVoZm1tbHNiYWheY2RlamtpbHJ2e4KCh5N9hI67wsnZ4+ZHSD9QUUpXWFRNTU1AQEIvLzFCQkJCQkBKTUg6PTgzNjI3OTg+QD9UVlNGSERUVlFERUBNTklWV1NPUExOT0pKTEdNTklISUVRUU9PT005OjZGR0JWV1NhYl1HSERMTUhKSko+PkAyMjQyMjRERERJSUk/Pz1EREFMTElISEZNTklOT0pWV1BeX1hTVE1ISUVKSkhNTUpEREE0NDI6Ojg4ODY4ODZFRUJOTkxAQD5FRUJUVFFBQT9MTElYWFZJSUlPT09FRUVUVFZQUFNWVVpGRUlCQUg6OT44ODo/Pz9AQD5KSkhdXVtBQT8/Pz9KSk1BQkZGR0pISU1GR0lYWlxNT05JTEpNT0xJSUdUVFFeXlxNTUpUVFFQUE5OTkxUVFFTVVRRVFNOUE9MTk1JTEpJTEpRVFNcXl1bXF5VVlhVVlhWV1peX2JbXF5bXF5dXmFcXV9fYWNcXV9eX2JhYmReX2NeX2NfYWNeX2JpamxoaW9laXFfZHBeY2+Ah46VnKNAQThNTkdPUExJSUlEREYxMTM6Ojo7OzlQU05BRD8zNjQ0NzY4OjlOUE9AQj5PU0pOT0pMTUhPUExMTUhQUU1GR0JMTUhBQj5VVVNbW1hHSEQ/QDtISUJaW1RISUJKTEdGRkgzMjcyMjRCQkVMTExQUFBBQT8/Pz0/Pz0/Pz1ISEZOT0pQUU1cXVZVVk9OT0hKTEdQUE5OTkw7Ozk0NDI2NjM3NzRHR0VQUE5CQkBBQT9RUU9JSUdFRUJQUE5TU1BXV1dJSUlHR0k/P0FGRUlAP0Q9O0I5OD03Nzk/P0FERERaWldhYV5MTExAQEJKSk05Oj4/QERERUhGR0pPUFNHSEpHSUhKTUxKSkhPUExaW1ZVVlFYWlVWV1NRU05WVlRQU1FYW1pXWlhMTk1ISklGSEdKTUxVV1ZcXV9UVVdRU1VUVVdaW11XWFtTVFZYWlxbXF5YWlxbXF5aW11eX2JRU1VWV1pcXV9iYmJjY2VfYWZhZGxYXGZYXWhzeYB9hItHSD9MTUZUVVBGRkZRUVQxMTMxMTE7OzlNT0pBREAvMTAvMDI0NjhKTUw9PztKTUhOT0pJSkZPUExNTklHSEQ/QDtJSkZFRkFGRkRVVVNXWFRQUU1OT0hXWFFKTEVRU05MTEw5OTssLC87OztVVVVVVVNOTkxAQD5AQD4+Pj5FRUJHR0VMTUhWV1NOT0hHSEFCRD9NTUpQUE5ISEY4ODYyMjA5OTdAQD5TU1BEREE9PTpOTkxKSkhGRkRQUE5UVFFXV1VKSkpOTk5ISEpAQEI7Oj8/PkJJSE1AQEI/P0FNTU1aWldaWldRUVE7Oz5HR0k6Oz87PUA/QERCREdNTlBISUxHSUhISklNTUpOTkxVVVNaWldWVlRVVVNQUE5UVFFRVFNXWlhWWFdPUVBISklHSUhHSUhPUVBYWlxRU1VOT1FWV1pYWlxaW11QUVRXWFtYWlxWV1pYWlxXWFtdXmFQUVRRU1VdXmFfYWNXWFtUVVtbXmZTVl5MT1dfZWpfZWpMTURRU0xOT0pAQEBTU1U+PkA3Nzc7OzlMTkpGSEUyMzYzNDc2NzlMTU8+QD1NT0xQUE5JSUdPT01FRUJCQkBBQT9GRkREREFNTUpWVlRWV1NGR0JGR0BWV1BRU0xWV1NGRkY0NDc7Ozs3NzdMTElUVFFISUVFRkFERERBQUFHR0dJSUdGRkRUVVBRU05NTklNTUpVVVNNTUpQUE49PTorKyk5OTc/Pz1UVFFEREE+PjtMTElMTElJSUdOTkxQUE5cXFpJSUdVVVVMTExXV1pNTU9GRUk4Nzs2Njg9PT9ISEhRUU9cXFpKSkpNTU9ISEo4OT05Oj5AQUVISU1JSk1FRkhBREI/QUBPT09RUVFTU1NWVlZOTk5RUVFOTk5QUFBTVVRMTk1NT05TVVROUE9JTEpISklNT05XWFtUVVdKTE5NTlBUVVdUVVdJSk1UVVdUVVdXWFtUVVdWV1pVVlhTVFZKTE5YWlxXWFtPVFZJTVNQVFpRVV1PU1haXmFXXF5WV05VVk9NTklERERPT1FUVFZISEg6Ojg+QD09Pz4qKy0mKCs2NzpAQURAQkFFR0ZGRkY+Pj5GRkZGRkZNTU1QUFBQUFBNTUpBQT9RUU9XWFRISUVJSkROT0hUVU5QUU1KSkhHR0dUVFRGRkRJSUdWV1NTVE8+Pzo4ODg2Njg+Pj5BQUE+PjtISEZQUE5TU1BTU1BNTUpOTkxRUU9JSUc3NzQ0NDI/Pz1WVlRPT01FRUJGRkRVVVNNTUpJSUdNTUpYWlVYWFZXV1VMTExUVFRMTE4tLTAzMzYxMTM+PkBISEhVVVNcXFpPT09MTE4/P0E2Nzo6Oz89PkFHSExERUdGR0k9Pz5FR0ZMTExUVFZMTE5PT1FMTE5OTlBHR0lRUVFTVVRPUVBRVFNPUVBXWlhQU1FPUVBaXFtWV1pVVlhHSEpMTU9QUVRYWlxGR0lISUxQUVRRU1VUVVdXWFtTVFZaW11NTlBQUVRNUVNQVVdKTlRCRkxMT1VWWl9UWFpUVVdXWE9MTUZISUU/Pz9EREZHR0k+Pj4xMS83OTg3ODopKi0qKy8yMzc0Njk0Njg6PTtEREQ9PT09PT1BQUFERERAQEBAQEBERERFRUJVVVNWV1M/QDtAQTpGR0BWV1BbXFdRUU9bW1tTU1BFRUJOT0pRU05PUEk4OTRBQUE+PkA+PkA9PT09PT1KSkhQUE5KSkhJSUdNTUpISEZOTkxPT01AQD5BQT9CQkBVVVNWVlROTkxISEZTU1BJSUdNTUpKSkhVVlFTVE9MTElRUU9OTk5PT087Oz5JSUw4ODo7Oz5RUVFPT01bW1hcXFxCQkVEREY/QEQ/QEQ7PUA+P0JERUdERUc5Ozo7Pj1FRUdQUFNKSk1HR0lHR0lKSk1GRkhMTE5KTUxNT05RVFNQU1FTVVRTVVRVV1ZUVlVPUFNOT1FFRkhJSk1JSk1QUVRCREZGR0lMTU9QUVRTVFZUVVdNTlBWV1pUVVdPVFVGTU1QVlhQVFpFSE5JTVNUVVhRVFNRVFNVVk1QUUpFRkFCQkI/P0FFRUdCQkI4ODYyNDMyMzYoKSwvMDYzNDo2Nzo3ODo9Pz5GRkg6Oj06Oj0/P0FBQUQ6Oj06Oj1BQUFUVFFWVlRXWFRNTklKTEVGR0BOT0hPUExUVFFeXlxdXVtHSERNTklRU0xFRj85OjZJSUxHRko/P0E6Oj05OTlISEhNTUpHR0VHR0VKSkhHR0VOTkxTU1BHR0U/Pz07OzlPT01XV1VUVFFHR0VJSUdKSkhOTkxGRkRRU05MTUhNTklMTElOTkxOTk5GRkZAQEBHR0lNTU9VVVVHR0VYWFZOTk5BQUQ4ODo3ODs5Oj4/QERAQUU6Oz4+P0E/QUBAQkFFRUdOTlBMTE5GRkhFRUdHR0lFRUdFRUdGSEdNT05PUVBTVVRUVlVRVFNWWFdPUVBUVVdOT1FFRkhFRkhCREZNTlBISUxOT1FISUxKTE5QUVRRU1VISUxQUVRXWFtNUVNBR0lNU1VRV1xJTVNNUVRUVVdUVFFWVlRKTEVJSkRISUU/Pz1CQkJRUVFJSUk0NDQtLzEyMzYrLDAvMDMtLzI5Oj47PT8/QUBKSk00NDdAQEJAQEI+PkA6Oj06Oj0+PkBAQEBVVVNbXFdHSEQ/QDtCRD9PUExXWFRQUE5cXFpcXFpMTUhHSERMTUhERUA9PTpMTE5NTU9BQUQ9PT83NzdBQUFKSkhMTElISEZCQkA+PjtAQD5AQD5CQkA+Pj45OTlISEhQUFBNTUpGRkRKSkhGRkRGRkRMTElNTklOT0pKSkhJSUdNTUpbW1tYWFhVVVVMTE5QUFNRUVFEREFVVVNQUFA5OTs0NDc3ODs9PkFJSk5JSk05Oj0/QEJERUdCREZCQkVFRUdGRkhCQkJCQkJFRUdGRkhBQURFR0ZOUE9OUE9TVVRQU1FJTEpWWFdWWFdVVlhPUFNKTE5KTE5FRkhKTE5GR0lGR0lGR0lISUxMTU9QUVRISUxNTlBXWFtHTE09QkVKUFNPVVdKT1FMUFFQU1FOUE1UVFFOT0pPUExQUU1HSERERUBHR0VCQkU4Nzs6O0EwMTc3ODswMTMxMjQ0Njg6Oz4+P0FFRUc3Nzk3NzlBQURJSUw5OTszMzY6Oj1ISEhaWldVVVNFRUI+PjtGRkRMTElbW1hQUE5aWlpcXFxQUE5CQkBNTUpCQkBCQkJERkVJTEo7Pj1GSEc9Pz44OjlNT05GSEdMTk1AQj85Ozg9Pzs/QT47Pj03ODozNDg9PkFHSEpISklJTEhMTklKTUlISkdGSEdISklOUE9GSEdGSEdGSEdMTU8/QEI6Oz5BQkVJSk1FR0Y/QT5UVlNPUVBAQUQ4OTsvMDM5Oj5GR0lVV1Y9Pz47PT86Oz4/QEQ9PkFFRkhTVVRPUU5FR0Q9Pz5AQUQ/QEJMTk1OUE9QU1FRVFNRVFNKTUxOUE9YW1pUVVdQUVRJSk1OT1FKTE5HSEpHSEpJSk1ERkVHSUhHSUhNT05GSEdMTk1WWFdNTlBJTk9ITU5NUVNMUFFITU5JTk9NUVBRVFNQUE5NTUpMTUhERT47PThBQT8+PkAzMjkxMTovMDY7PUA2Nzk2ODc5Ozo5Oj06Oz4+PkAyMjQ3Nzk/P0E9PT8yMjQvLzE2Njg9PT1JSUdWVlROTkw+PjtFRUJQUE5UVFFaWlpYWFhcXFxJSUlBQUFHR0dGRkZAQEA/QUBCRURERkVCRUQ6PTs4OjlKTUxFR0ZJTEo+QD8zNjIzNjI6PTs4OTs0NjkyMzk2Nz1AQUVERkVFR0RHSUVGSEVFR0ZERkVKTE5OT1FERUdBQkVGR0lRU1VERUc5Oj1CREZBQkVERkVAQj9PUU5UVlVJSk1BQkUyMzc5Oj5FRkhWWFdFR0Y7PT83ODs6Oz8+P0JJSk1UVlNUVlFKTUhCRUFERUc/QERHSEpISklMTk1RVFNNT05ISklMTk1UVlVXWFtPUFNJSk1NTlBQUVRKTE5FRkhBQkVHSUhISklOUE9MTk1KTUxTVVRUVlVNT05GSkxFSUpJTk9ITU5FSUpHTE1JTk9MUFFJSUdRUU9UVVBGR0A5OjY/Pz09PT8zMjksLDYtLzQ/QEQ/QEIyNDM9Pz47PT8+P0E/QEQxMjY2Nzo3ODstLzIrLDAxMjY7PT8+Pj5ISEZVVVNRUU9BQT9BQT9KSkhVVVNVVVVaWlpXV1dQUFBAQEBKSkpFRUVFRUVBREJAQkFISklBREI5Ozo5OzpISklFR0ZNT05ERkU5Ozg3OTY9Pz45Oj00NjkxMjg4OT8/QEQ9Pz47Pjo/QT1CRUFGSEdJTEpHSEpKTE4/QEI/QEI/QEJRU1VOT1FMTU8+P0FFRkhJTEo/QT5OUE1TVVRISUxAQUQ6Oz9BQkZHSEpWWFdTVVQ+P0E3ODs4OT00NjlHSEpRVFBXWlVPUU1JTEhFRkg+P0JKTE5ISUxGR0lHSEpFRkhCREZGR0lMTU9OT1FJSk1HSEpFRkhKTE5KTE5ISUxFRkhFR0ZGSEdKTUxFR0ZCRURNT05RVFNOUE9ITU5HTE1MUFFKT1BCR0hESElHTE1JTk9RUU9VVVNVVlFHSEE9PjlCQkBBQUQ5OD8vLzgrLDI+P0JFRkg2ODdBREI6Oz46Oz4+P0IxMjY6Oz86Oz8yMzcwMTQzNDg6Oz4/Pz9NTUpMTElEREE+PjtGRkRISEZRUU9XV1dVVVVaWlpQUFBFRUVJSUlOTk5HR0dAQkE4Ojk9Pz46PTs3OTg5OzpGSEdERkVISklERkU9Pzs5OzhERkU+P0E0NjkvMDY2Nz0+P0I+QD89PztGSERGSEVGSEdGSEc+P0FGR0k/QEJCREY7PT9FRkg7PT85Oj03ODo/QEI9Pz49Pz5QU1FMTk09PkA2Nzo2NzpBQkZERUdKTUxcXl1HSEo+P0I4OT06Oz9NTlBQU09UVlFPUU1JTEhHSEpBQkZISUxHSEpFRkhFRkg/QEI/QEJCREZGR0lISUxNTlBOT1E/QEJJSk1KTE5JSk1FRkhGSEdOUE9KTUxGSEdJTEpNT05WWFdMTk1FSUpESElITU5HTE0/REVBRkdESElGSkxTU1BXV1VXWFRQUUo9Pjk/Pz1EREZBQEdFRU4xMjg3ODszNDc3OThAQkFAQUQ0Njg3Oz4mKjAzNz0xNDotMTcqLTMqLTMtLzI6OjpOTkxRUU9JSUc/Pz1BQT9HR0VMTElOTk5VVVVXV1dOTk5BQUFISEhRUVFHR0dFR0Y/QUA5OzpBREI4Ojk5OzpERkVAQkFFR0ZCRURAQj89PztHSUg5Oj0xMjYtLzQ3OD47PUBBREI+QD1CRUA/QT46PTs3OTg+P0E7PT82Nzk3ODo2Nzk4OTs3ODozNDc5Oj46Oz85Oj0+P0FHSEpQUVRGR0o0Njk4OT0/QERFRkhFR0ZcXl1MTU89PkExMjY2NzpGR0lRVFBYW1ZeYVxKTUlISUw7PUA/QEQ+P0I/QEQ/QEQ7PUA6Oz9AQUVISU1HSEo/QEJKTE45Oj1BQkVMTU9ERUc9PkBISklPUVBKTUxGSEdGSEdFR0ZOUE9ISklBRkdARUZESElBRkc+QkQ7QEFCR0hHTE1PT01VVVNVVlFPUEk4OTQ4ODY9PT8+PUQ4OEEvMDY4OT02Nzk5OzpBREI+P0ExMjYzNz0kKC0sMDYoKzEqLTMoKzEqLTMwMTQ7OztMTElOTkxISEZAQD49PTo/Pz1ISEZKSkpVVVVUVFRRUVE9PT1HR0dNTU1JSUlAQkE9Pz45OzpISkk/QUA+QD9ERkVCRURBREJCRURFR0RHSUZJTEo7PT80NjkxMjgzNDo3ODs+QD8+QD1HSUVFR0RCRURBREI+P0E5Oj0xMjQzNDc2Nzk4OTs4OTs2Nzo3OD47PUI4OT04OTtERUdOT1NERUoxMjg3ODs9PkFBQkVERkVbXVxQUVRCREc5Oj5GR0pNTlBTVVFXWlVdX1tQU09MTU8/QEQ7PUA6Oz8/QEQ+P0I3ODs5Oj5BQkZJSk5NTlBHSEpQUVRAQURHSEpJSk1HSEpHSEpQU1FPUVBOUE9FR0ZHSUhFR0ZNT05NT05GSkxESElGSkxESEk7QEE7QEFCR0hFSUpTU1BVVVNQUU1HSEEzNDA5OTc7Oz4yMTgrKzQsLTM3ODs2NzkzNjQ+QD8+P0E0NjktMTcmKjIvMjosMDglKTElKTEqLTYyMzlQUFBRUU9CQkA0NDI9PTo/Pz07Ozk9PTpJSUlPT09VVVVTU1M7OztBQUFJSUlERERAQkE9Pz4+QD9KTUxFR0Y/QUA/QUA/QUA5Ozo/QUBHSUZMTkpJTEo7PT80NjkxMjgvMDYwMTQ5Ozo6PTlGSERCRUE9Pz44Ojk5Oj02NzkwMTMzNDc0Njg3ODo3ODo0NjkzNDo4OT80Njk2NzpISU1JSk4/QEY2Nz0zNDg4OT0/QEJERkVTVVRQUVRERUg+P0JHSExJSk1PUU5TVVBaXFdVV1RPUFM/QEQ5OkA5OkA+P0U6O0E3OD44OT89PkRAQUVBQkVBQkVOT1FFRkhFRkhGR0lKTE5MTU9HSUhHSUhNT05KTUxHSUhBREJGSEdISklCR0g/REVARUY9QUI5Pj87QEFCR0hCR0hOTkxRU05PUElGR0A6Ozc6Ojg3NzksKzIlJiwsLTM0NjkxMjQ2ODc+P0E7PT8wMTQpLDQjJi8mKjIiJS0iJS0jJiwqLTMzNDhERkVMTElGRkQ/Pz04ODZEREFMTElHR0VCQkJOTk5QUE5UVFE7OzlJSUdAQEA+Pj45OzpAQkFHSUhQU1FPUVBFR0ZERkU/QUA9Pz5CRURMTkpRVFBHSUg5Oj0xMjYtLzQ2Nz0yMzc6PTs9PztAQj89Pzs5Ozo3ODo4OT02NzowMTQzNDgxMjYzNDgzNDgxMjYyMjszMz0xMjg3ODtJSk5OT1NERUo3OD4xMjg4OT09PkBBQkVTVFZWV1pKTE5GR0pOT1NISUxJTEhKTUhRVE9UVlNNT047PT85Oj42Nz06O0E5OkAxMjg3OD4+P0VBQkg+P0I/QEJISUxBQkU4OTs/QEJKTE5JSk1GSEdKTUxMTk1RVFNOUE9BREJGSEdJSk1ESEk/REU/REU7QEE3Oz07QEFCR0hARUZQUU1NTkdPUElTVE1NTklCQkI9O0A0MzopKjAoKS83ODszNDc0Njg5Oj03ODsvMDYqKjYlJTEkJC0lJS8oKS8xMjYyMzYwMTM+QD9CRURAQkE5Ozo7Pj1BREJGSEdMTk1QUFBISEZRU05RU05ISUVMTUhISEZCQkI3ODpAQURGSEVNT0xMTkpKTUlJSk1AQUQ+P0FERkVPUU5OUE1BREI3ODozNDosLDYxMjgxMjY4OTs5Ozo6PTs4OTs3ODs3OD4xNDoxND0wMzsvMj0tMTs2OUEyNj4wMzswMDkwMDkvMDY3ODtHSEpKTE9AQUczNDoxMjg5OkA/QEQ9PkFGR0pWV1pFRkhFRkhAQEJMTE5GRkZJSUdVVVNVVVNOTkxHR0dFRkg4OT0zNDo2Nz0xMTo4OEE2Nj84OEE/QERFRkhISUxCREY9PkA9PkBHSEpFRkhFRkhCREZJSk1OT1FHSEpHSEpFRkhISUw6Oz89PkE+P0I6Oz85Oj45Oj49PkE6Oz9QUUpJSkRaW1RNTklEREE9PT03NjoyMTgqKzEsLTM6Oz8yMzYtLzEzNDgxMjgoKDEpKTQlJTIlJTEmJjAmKC0tLzI0Njg2ODc/QUA6PTs3OTg3OTg/QUA/QUBCRURBREI/Pz9HR0dKTEdPUEk4OTI+Pzo/Pz87Oz44OT1BQkVGSEVOUExRVE9HSUZGR0lGR0pCREZBQkVHSUhOUE1KTUw9PkAyMzksLDYzNDo2Nz05Oj4yMzY/QEI/QEQ7PUI0NjszNz8sMDorLTowMj8xM0A3OUYxND8sMDgtLTkyMjswMTcyMzc6Oz5RU1ZGR002Nz0zNDo3OD5FRkw9PkRCREdOT1NHSEo+P0E/P0FMTE5ISEhGRkZTU1BXV1VQUU1FRUJOT1E/QEQzNDoyMzkvLzg2Nj8xMT0+Pkc/QERERUdHSEpAQUQ6Oz49PkBERUdERUc+P0E9PkBISUxOT1FNTlBGR0lBQkVHSEpERUhAQUU7PUA3ODs9PkE9PkE+P0I9PkFRU0xHSEFXWFFPUExCQkBJSUk2NDkxMDcrLDIxMjg+P0IwMTMrLC8xMjYvMDYlJS8mJjIkJDElJTEpKTIlJiwqKy85Oj0+QD8+QD85OzozNjQyNDM6PTtCRUQ+QD8+QD9HR0lHR0dOTkxMTUhBQj5JSUc7Ozs9PT85Oj4+P0E+QD1ERkFTVVBAQj87PT9AQUVAQUQ5Oj06PTtHSUZOUE8/QEIwMTcvLzgzNDo4OT89PkE4OTs+P0E4OT0zNDozNDoyNj4rLzkqLDkvMT4xM0A3OUYxND8sMDgyMj4vLzgsLTMzNDg/QEJPUFRAQUcyMzkyMzk2Nz1ERUo7PUJBQkZNTlFISUw7PT9KSk1JSUxGRkZISEhWVlRUVFFNTklISEZYW1pXWFw4OT02Nz0zNDo2Nj8xMTo4OEE9PkFAQUVBQkY6Oz83ODs7PUA/QERBQkY/QEI+P0FISUxOT1FNTlBGR0lBQkVHSEo/QEQ5Oj42Nzo0NjlCREdFRklCREdERUhMTUZRU0xUVU5OT0pNTUpAQEAzMjcvLTQoKS8xMjg9PkEpKiwqKy0vMDMsLTMkJC0lJTEkJDEmJjIqKjMjJComKCs7PT9CRURFR0Y2NzkvMDI2Nzk2Nzk6Oz5BQkVAQUREREZEREZOTkxQUE5PT01NTUpKSk1BQUQ+P0JERUc+QD0+QDtOUEw6PTkxMjQwMTRAQUQ+P0E6PTtCRUFMTk09PkAtLzQwMDk2Nz0yMzkzNDgxMjQ3ODo3ODs2Nz0zNDovMjotMTssLzsrLTotMD02OEUyNkAwMzsxMT0xMTosLTMwMTRGR0lTVFdJSlA2Nz0tLzQ2Nz09PkQ5OkBBQkZRU1ZJSk09PkA+PkBAQEJFRUVGRkZUVFFWVlRPUExGRkRaXFthYmRBQkYyMzcvMDYxMjg5OUI2Nz1CRElFRklFRkk9PkE0Njk6Oz87PUBAQUU/QEI9PkBERUdISUxHSEpHSEpFRkhISUxHSEw9PkE0NjkxMjY+P0JCREdAQUU/QERTVE1JSkRRU0xWV1NFRUJAQEA5OD0vLTQoKS8xMjg7PUArLC8qKy0pKi0jJCokJC0lJTEjIzAkJDAmJjAmKC0pKi1CREZJTEoyMzYvMDMsLTEzNDg7PUA2Nzo3ODszNDg5OD09PT9HR0dMTExBQUE/Pz8zMzYtLDErLDAyMzZBREBISkZUVlFHSUYxMjQvMDM9PkA+P0FBREJFR0RCRUQ4OTssLTMrKzQxMjg0Njs3ODswMTM3ODo4OT04OT83OD4sMDgoKzYtMD0wMj8rLTorLTorLzkrLzctLTksLDYsLTM0NjlMTU9MTVBOT1U6O0EvMDY0Njs4OT85OkBAQUVJSk5AQUQ5Oj1BQUQ9PT86OjpBQUFUVFFbW1hMTUhMTElaXFtUVVdNTlA9PkExMjYvMDYqKzE5OkA7PUI7PUI+P0U0Njs2Nz09PkQ/QEY+P0I7PT87PT9CREZFRkhJSk1JSk1ISUxGR0lERUdFRkg2NzkxMjQ/QEJISUxISUxERUc/QDlAQTpQUUpVVlFUVFFGRkY0MzgoJi0oKS83OD5CREcvMDIpKiwpKi0jJColJS8jIy8iIi8kJDAqKjMoKS8wMTRHSEpUVVc4OT0vMDMrLDAtLzIvMDMwMTQ6Oz8yMzcsKzA7Oj9CQkVISEhFRUVAQEI3NjowLzM0Njk5Oj06PTk/QT1PUU1MTko6Oz43ODs4OTs7PT8+QD89Pzs+QD83ODotLzQsLDY0Njs0Njs0NjksLTA4OTs2NzoxMjgtLzQrLzcpLDcsLzssLzsqLDkqLDkqLTgqLTYtLTksLDYmKC05Oj5KTE5KTE9RU1hMTVMwMTcyMzk5OkA0NjtCREdERUg+P0E7PT9ISEo5OTs4ODg+Pj5NTUpPT01JSkZNTklQU09UVlVVVlhOT1E6Oz8wMTQvMDY0Njs4OT82Nz03OD4zNDowMTc4OT87PUI6O0E5Oj40Njg9PkBFRkhHSEpHSEpFRkhCREZERUdBQkU5Oj04OTs9PkBERUdFRkg+P0E6OzQ+PzhQUUpXWFRNTUpCQkIzMjclJCsqKzE/QEZKTE8zNDcsLTAsLTEpKjArKzQoKDMkJDEqKjY2Nj8kJSsxMjZCREZTVFY6Oz8tLzQsLTMrLDIyMzktLzQwMTcpKjAwLzY5OD1ISEpISEhFRUU/P0E5OD0vLTQ6Oz87PT84Ojc5OzdOUExKTUk5Oj02Nzo4OTtAQURAQkE5Ozg4Ojk2NzkvMDYtLTc0NjsxMjgxMjYsLTA3ODo0Njk5OkBBQkgrLzcpLDcsLzsoKjcpKzgpKzgpLDcpLDQpKTQwMDkrLDI3ODtCREZGR0pGR006O0E5OkAwMTcyMzkzNDo+P0JAQUU7PT86Oz4+PkA6Oj0+Pj49PT1JSUdPT01TVE9RU05MTkpRVFNOUE9JSk00NjktLzIxMjY7PUI6O0E2Nj8zMz0yMjsxMTo3N0A7O0U7PUJAQUU5Oj07PT9AQUQ/QEJERUdHSEpJSk1ISkk9Pz42ODc3OTg9Pz5BREJGSEdBREI+Pzg6OzRJSkRUVVBJSUdISEg6OT4mJSwrLDJERUpRU1Y3ODoxMjQyMzcvMDYyMjslJTEiIi8qKjY5OUIoKS83ODs/QEJRU1U5Oj4rLDIvMDYsLTMsLTM5OkA4OT82Nz00Mzo6OT5BQURISEhCQkI6Oj03NjorKjE4OT03ODo7Pjo6PThRVE9FR0QtLzErLDAyMzY+P0E+QD8yNDEzNjQ0NjgwMTctLTcwMTcsLTMwMTQvMDIyMzY3ODs3OD4zNDoqLTYqLTgrLTokJjMoKjcoKjcoKzYoKzMrKzcpKTIsLTM5Oj5HSEpJSk5PUFZRU1hAQUcwMTcqKzE0Njs7PUA/QEQ4OTs4OTs/P0E9PT83Nzc7OztGRkRPT01UVVBQUU1MTkpTVVFMTk1HSEovMDMtLzIrLDA7PUI/P0g2Nj8yMjszMz0zMz0yMjszMz02Nz03ODs0Njg5Oj05Oj1AQURFRkhISUxJSk1ERkU0NzYzNjQ4OjlAQkFAQkFGSEdISkkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy92d2VicC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdndlYnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzljNzJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvdndlYnAuYwpAQCAtMCwwICsxLDU5NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBTaW1wbGUgT3BlbkdMLWJhc2VkIFdlYlAgZmlsZSB2aWV3ZXIuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX3VuaXhfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorI2RlZmluZSBfUE9TSVhfQ19TT1VSQ0UgMjAwMTEyTCAgLy8gZm9yIHNldGVudgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfR0wpCisKKyNpZiBkZWZpbmVkKEhBVkVfR0xVVF9HTFVUX0gpCisjaW5jbHVkZSA8R0xVVC9nbHV0Lmg+CisjZWxzZQorI2luY2x1ZGUgPEdML2dsdXQuaD4KKyNpZmRlZiBGUkVFR0xVVAorI2luY2x1ZGUgPEdML2ZyZWVnbHV0Lmg+CisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgV0VCUF9IQVZFX1FDTVMKKyNpbmNsdWRlIDxxY21zLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9kZW11eC5oIgorCisjaW5jbHVkZSAiLi4vZXhhbXBsZXMvZXhhbXBsZV91dGlsLmgiCisjaW5jbHVkZSAiLi4vaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisvLyBVbmZvcnR1bmF0ZSBnbG9iYWwgdmFyaWFibGVzLiBHYXRoZXJlZCBpbnRvIGEgc3RydWN0IGZvciBjb21mb3J0Lgorc3RhdGljIHN0cnVjdCB7CisgIGludCBoYXNfYW5pbWF0aW9uOworICBpbnQgaGFzX2NvbG9yX3Byb2ZpbGU7CisgIGludCBkb25lOworICBpbnQgZGVjb2RpbmdfZXJyb3I7CisgIGludCBwcmludF9pbmZvOworICBpbnQgb25seV9kZWx0YXM7CisgIGludCB1c2VfY29sb3JfcHJvZmlsZTsKKworICBpbnQgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0OworICBpbnQgbG9vcF9jb3VudDsKKyAgdWludDMyX3QgYmdfY29sb3I7CisKKyAgY29uc3QgY2hhciogZmlsZV9uYW1lOworICBXZWJQRGF0YSBkYXRhOworICBXZWJQRGVjb2RlckNvbmZpZyBjb25maWc7CisgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIHBpYzsKKyAgV2ViUERlbXV4ZXIqIGRtdXg7CisgIFdlYlBJdGVyYXRvciBjdXJyX2ZyYW1lOworICBXZWJQSXRlcmF0b3IgcHJldl9mcmFtZTsKKyAgV2ViUENodW5rSXRlcmF0b3IgaWNjcDsKKyAgaW50IHZpZXdwb3J0X3dpZHRoLCB2aWV3cG9ydF9oZWlnaHQ7Cit9IGtQYXJhbXM7CisKK3N0YXRpYyB2b2lkIENsZWFyUHJldmlvdXNQaWModm9pZCkgeworICBXZWJQRnJlZURlY0J1ZmZlcigoV2ViUERlY0J1ZmZlciopa1BhcmFtcy5waWMpOworICBrUGFyYW1zLnBpYyA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIENsZWFyUGFyYW1zKHZvaWQpIHsKKyAgQ2xlYXJQcmV2aW91c1BpYygpOworICBXZWJQRGF0YUNsZWFyKCZrUGFyYW1zLmRhdGEpOworICBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoJmtQYXJhbXMuY3Vycl9mcmFtZSk7CisgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigma1BhcmFtcy5wcmV2X2ZyYW1lKTsKKyAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmtQYXJhbXMuaWNjcCk7CisgIFdlYlBEZW11eERlbGV0ZShrUGFyYW1zLmRtdXgpOworICBrUGFyYW1zLmRtdXggPSBOVUxMOworfQorCisvLyBTZXRzIHRoZSBwcmV2aW91cyBmcmFtZSB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgY2FudmFzIGFuZCBoYXMgaXQgZGlzcG9zZQorLy8gdG8gYmFja2dyb3VuZCB0byBjYXVzZSB0aGUgY2FudmFzIHRvIGJlIGNsZWFyZWQuCitzdGF0aWMgdm9pZCBDbGVhclByZXZpb3VzRnJhbWUodm9pZCkgeworICBXZWJQSXRlcmF0b3IqIGNvbnN0IHByZXYgPSAma1BhcmFtcy5wcmV2X2ZyYW1lOworICBwcmV2LT53aWR0aCA9IGtQYXJhbXMuY2FudmFzX3dpZHRoOworICBwcmV2LT5oZWlnaHQgPSBrUGFyYW1zLmNhbnZhc19oZWlnaHQ7CisgIHByZXYtPnhfb2Zmc2V0ID0gcHJldi0+eV9vZmZzZXQgPSAwOworICBwcmV2LT5kaXNwb3NlX21ldGhvZCA9IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIHByb2ZpbGUgaGFuZGxpbmcKK3N0YXRpYyBpbnQgQXBwbHlDb2xvclByb2ZpbGUoY29uc3QgV2ViUERhdGEqIGNvbnN0IHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IHJnYmEpIHsKKyNpZmRlZiBXRUJQX0hBVkVfUUNNUworICBpbnQgaSwgb2sgPSAwOworICB1aW50OF90KiBsaW5lOworICB1aW50OF90IG1ham9yX3JldmlzaW9uOworICBxY21zX3Byb2ZpbGUqIGlucHV0X3Byb2ZpbGUgPSBOVUxMOworICBxY21zX3Byb2ZpbGUqIG91dHB1dF9wcm9maWxlID0gTlVMTDsKKyAgcWNtc190cmFuc2Zvcm0qIHRyYW5zZm9ybSA9IE5VTEw7CisgIGNvbnN0IHFjbXNfZGF0YV90eXBlIGlucHV0X3R5cGUgPSBRQ01TX0RBVEFfUkdCQV84OworICBjb25zdCBxY21zX2RhdGFfdHlwZSBvdXRwdXRfdHlwZSA9IFFDTVNfREFUQV9SR0JBXzg7CisgIGNvbnN0IHFjbXNfaW50ZW50IGludGVudCA9IFFDTVNfSU5URU5UX0RFRkFVTFQ7CisKKyAgaWYgKHByb2ZpbGUgPT0gTlVMTCB8fCByZ2JhID09IE5VTEwpIHJldHVybiAwOworICBpZiAocHJvZmlsZS0+Ynl0ZXMgPT0gTlVMTCB8fCBwcm9maWxlLT5zaXplIDwgMTApIHJldHVybiAxOworICBtYWpvcl9yZXZpc2lvbiA9IHByb2ZpbGUtPmJ5dGVzWzhdOworCisgIHFjbXNfZW5hYmxlX2ljY3Y0KCk7CisgIGlucHV0X3Byb2ZpbGUgPSBxY21zX3Byb2ZpbGVfZnJvbV9tZW1vcnkocHJvZmlsZS0+Ynl0ZXMsIHByb2ZpbGUtPnNpemUpOworICAvLyBxY21zX3Byb2ZpbGVfaXNfYm9ndXMoKSBpcyBicm9rZW4gd2l0aCBJQ0N2NC4KKyAgaWYgKGlucHV0X3Byb2ZpbGUgPT0gTlVMTCB8fAorICAgICAgKG1ham9yX3JldmlzaW9uIDwgNCAmJiBxY21zX3Byb2ZpbGVfaXNfYm9ndXMoaW5wdXRfcHJvZmlsZSkpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb2xvciBwcm9maWxlIGlzIGJvZ3VzIVxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIG91dHB1dF9wcm9maWxlID0gcWNtc19wcm9maWxlX3NSR0IoKTsKKyAgaWYgKG91dHB1dF9wcm9maWxlID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIG91dHB1dCBjb2xvciBwcm9maWxlIVxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIHFjbXNfcHJvZmlsZV9wcmVjYWNoZV9vdXRwdXRfdHJhbnNmb3JtKG91dHB1dF9wcm9maWxlKTsKKyAgdHJhbnNmb3JtID0gcWNtc190cmFuc2Zvcm1fY3JlYXRlKGlucHV0X3Byb2ZpbGUsIGlucHV0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJvZmlsZSwgb3V0cHV0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQpOworICBpZiAodHJhbnNmb3JtID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIGNyZWF0aW5nIGNvbG9yIHRyYW5zZm9ybSFcbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBsaW5lID0gcmdiYS0+dS5SR0JBLnJnYmE7CisgIGZvciAoaSA9IDA7IGkgPCByZ2JhLT5oZWlnaHQ7ICsraSwgbGluZSArPSByZ2JhLT51LlJHQkEuc3RyaWRlKSB7CisgICAgcWNtc190cmFuc2Zvcm1fZGF0YSh0cmFuc2Zvcm0sIGxpbmUsIGxpbmUsIHJnYmEtPndpZHRoKTsKKyAgfQorICBvayA9IDE7CisKKyBFcnJvcjoKKyAgaWYgKGlucHV0X3Byb2ZpbGUgIT0gTlVMTCkgcWNtc19wcm9maWxlX3JlbGVhc2UoaW5wdXRfcHJvZmlsZSk7CisgIGlmIChvdXRwdXRfcHJvZmlsZSAhPSBOVUxMKSBxY21zX3Byb2ZpbGVfcmVsZWFzZShvdXRwdXRfcHJvZmlsZSk7CisgIGlmICh0cmFuc2Zvcm0gIT0gTlVMTCkgcWNtc190cmFuc2Zvcm1fcmVsZWFzZSh0cmFuc2Zvcm0pOworICByZXR1cm4gb2s7CisjZWxzZQorICAodm9pZClwcm9maWxlOworICAodm9pZClyZ2JhOworICByZXR1cm4gMTsKKyNlbmRpZiAgLy8gV0VCUF9IQVZFX1FDTVMKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbGUgZGVjb2RpbmcKKworc3RhdGljIGludCBEZWNvZGUodm9pZCkgeyAgIC8vIEZpbGxzIGtQYXJhbXMuY3Vycl9mcmFtZQorICBjb25zdCBXZWJQSXRlcmF0b3IqIGNvbnN0IGN1cnIgPSAma1BhcmFtcy5jdXJyX2ZyYW1lOworICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnID0gJmtQYXJhbXMuY29uZmlnOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXRfYnVmZmVyID0gJmNvbmZpZy0+b3V0cHV0OworICBpbnQgb2sgPSAwOworCisgIENsZWFyUHJldmlvdXNQaWMoKTsKKyAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfUkdCQTsKKyAgb2sgPSAoV2ViUERlY29kZShjdXJyLT5mcmFnbWVudC5ieXRlcywgY3Vyci0+ZnJhZ21lbnQuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBjb25maWcpID09IFZQOF9TVEFUVVNfT0spOworICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJEZWNvZGluZyBvZiBmcmFtZSAjJWQgZmFpbGVkIVxuIiwgY3Vyci0+ZnJhbWVfbnVtKTsKKyAgfSBlbHNlIHsKKyAgICBrUGFyYW1zLnBpYyA9IG91dHB1dF9idWZmZXI7CisgICAgaWYgKGtQYXJhbXMudXNlX2NvbG9yX3Byb2ZpbGUpIHsKKyAgICAgIG9rID0gQXBwbHlDb2xvclByb2ZpbGUoJmtQYXJhbXMuaWNjcC5jaHVuaywgb3V0cHV0X2J1ZmZlcik7CisgICAgICBpZiAoIW9rKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQXBwbHlpbmcgY29sb3IgcHJvZmlsZSB0byBmcmFtZSAjJWQgZmFpbGVkIVxuIiwKKyAgICAgICAgICAgICAgICBjdXJyLT5mcmFtZV9udW0pOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIGRlY29kZV9jYWxsYmFjayhpbnQgd2hhdCkgeworICBpZiAod2hhdCA9PSAwICYmICFrUGFyYW1zLmRvbmUpIHsKKyAgICBpbnQgZHVyYXRpb24gPSAwOworICAgIGlmIChrUGFyYW1zLmRtdXggIT0gTlVMTCkgeworICAgICAgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyID0gJmtQYXJhbXMuY3Vycl9mcmFtZTsKKyAgICAgIGlmICghV2ViUERlbXV4TmV4dEZyYW1lKGN1cnIpKSB7CisgICAgICAgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihjdXJyKTsKKyAgICAgICAgaWYgKFdlYlBEZW11eEdldEZyYW1lKGtQYXJhbXMuZG11eCwgMSwgY3VycikpIHsKKyAgICAgICAgICAtLWtQYXJhbXMubG9vcF9jb3VudDsKKyAgICAgICAgICBrUGFyYW1zLmRvbmUgPSAoa1BhcmFtcy5sb29wX2NvdW50ID09IDApOworICAgICAgICAgIGlmIChrUGFyYW1zLmRvbmUpIHJldHVybjsKKyAgICAgICAgICBDbGVhclByZXZpb3VzRnJhbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBrUGFyYW1zLmRlY29kaW5nX2Vycm9yID0gMTsKKyAgICAgICAgICBrUGFyYW1zLmRvbmUgPSAxOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZHVyYXRpb24gPSBjdXJyLT5kdXJhdGlvbjsKKyAgICAgIC8vIEJlaGF2aW9yIGNvcGllZCBmcm9tIENocm9tZSwgY2Y6CisgICAgICAvLyBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvdGhpcmRfcGFydHkvV2ViS2l0L1NvdXJjZS8KKyAgICAgIC8vIHBsYXRmb3JtL2dyYXBoaWNzL0RlZmVycmVkSW1hZ2VEZWNvZGVyLmNwcD8KKyAgICAgIC8vIHJjbD1iNGMzMzA0OWYwOTZjZDI4M2YzMmJlOWE1OGI5YTllNzY4MjI3YzI2Jmw9MjQ2CisgICAgICBpZiAoZHVyYXRpb24gPD0gMTApIGR1cmF0aW9uID0gMTAwOworICAgIH0KKyAgICBpZiAoIURlY29kZSgpKSB7CisgICAgICBrUGFyYW1zLmRlY29kaW5nX2Vycm9yID0gMTsKKyAgICAgIGtQYXJhbXMuZG9uZSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CisgICAgICBnbHV0VGltZXJGdW5jKGR1cmF0aW9uLCBkZWNvZGVfY2FsbGJhY2ssIHdoYXQpOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2FsbGJhY2tzCisKK3N0YXRpYyB2b2lkIEhhbmRsZUtleSh1bnNpZ25lZCBjaGFyIGtleSwgaW50IHBvc194LCBpbnQgcG9zX3kpIHsKKyAgKHZvaWQpcG9zX3g7CisgICh2b2lkKXBvc195OworICBpZiAoa2V5ID09ICdxJyB8fCBrZXkgPT0gJ1EnIHx8IGtleSA9PSAyNyAvKiBFc2MgKi8pIHsKKyNpZmRlZiBGUkVFR0xVVAorICAgIGdsdXRMZWF2ZU1haW5Mb29wKCk7CisjZWxzZQorICAgIENsZWFyUGFyYW1zKCk7CisgICAgZXhpdCgwKTsKKyNlbmRpZgorICB9IGVsc2UgaWYgKGtleSA9PSAnYycpIHsKKyAgICBpZiAoa1BhcmFtcy5oYXNfY29sb3JfcHJvZmlsZSAmJiAha1BhcmFtcy5kZWNvZGluZ19lcnJvcikgeworICAgICAga1BhcmFtcy51c2VfY29sb3JfcHJvZmlsZSA9IDEgLSBrUGFyYW1zLnVzZV9jb2xvcl9wcm9maWxlOworCisgICAgICBpZiAoa1BhcmFtcy5oYXNfYW5pbWF0aW9uKSB7CisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGNvbXBsZXRlZCBhbmltYXRpb24gdG8gcGlja3VwIHRoZSBjb2xvciBwcm9maWxlIGNoYW5nZS4KKyAgICAgICAgaWYgKGtQYXJhbXMuZG9uZSAmJiBrUGFyYW1zLmxvb3BfY291bnQgPT0gMCkgeworICAgICAgICAgIGtQYXJhbXMubG9vcF9jb3VudCA9CisgICAgICAgICAgICAgIChpbnQpV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfTE9PUF9DT1VOVCkgKyAxOworICAgICAgICAgIGtQYXJhbXMuZG9uZSA9IDA7CisgICAgICAgICAgLy8gU3RhcnQgdGhlIGRlY29kZSBsb29wIGltbWVkaWF0ZWx5LgorICAgICAgICAgIGdsdXRUaW1lckZ1bmMoMCwgZGVjb2RlX2NhbGxiYWNrLCAwKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgRGVjb2RlKCk7CisgICAgICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgaWYgKGtleSA9PSAnaScpIHsKKyAgICAvLyBOb3RlOiBkb2Vzbid0IGhhbmRsZSByZWZyZXNoIG9mIGFuaW1hdGlvbidzIGxhc3QtZnJhbWUgKGl0J3MgcXVpdGUKKyAgICAvLyBtb3JlIGludm9sdmVkIHRvIGRvLCBzaW5jZSB5b3UgbmVlZCB0byBzYXZlIHRoZSBwcmV2aW91cyBmcmFtZSkuCisgICAga1BhcmFtcy5wcmludF9pbmZvID0gMSAtIGtQYXJhbXMucHJpbnRfaW5mbzsKKyAgICBpZiAoIWtQYXJhbXMuaGFzX2FuaW1hdGlvbikgQ2xlYXJQcmV2aW91c0ZyYW1lKCk7CisgICAgZ2x1dFBvc3RSZWRpc3BsYXkoKTsKKyAgfSBlbHNlIGlmIChrZXkgPT0gJ2QnKSB7CisgICAga1BhcmFtcy5vbmx5X2RlbHRhcyA9IDEgLSBrUGFyYW1zLm9ubHlfZGVsdGFzOworICAgIGdsdXRQb3N0UmVkaXNwbGF5KCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgSGFuZGxlUmVzaGFwZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgLy8gTm90ZTogcmVzaGFwZSBkb2Vzbid0IHByZXNlcnZlIGFzcGVjdCByYXRpbywgYW5kIG1pZ2h0CisgIC8vIGJlIGhhbmRsaW5nIGxhcmdlci10aGFuLXNjcmVlbiBwaWN0dXJlcyBpbmNvcnJlY3RseS4KKyAgZ2xWaWV3cG9ydCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOworICBnbExvYWRJZGVudGl0eSgpOworICBnbE1hdHJpeE1vZGUoR0xfTU9ERUxWSUVXKTsKKyAgZ2xMb2FkSWRlbnRpdHkoKTsKKyAga1BhcmFtcy52aWV3cG9ydF93aWR0aCA9IHdpZHRoOworICBrUGFyYW1zLnZpZXdwb3J0X2hlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFrUGFyYW1zLmhhc19hbmltYXRpb24pIENsZWFyUHJldmlvdXNGcmFtZSgpOworfQorCitzdGF0aWMgdm9pZCBQcmludFN0cmluZyhjb25zdCBjaGFyKiBjb25zdCB0ZXh0KSB7CisgIHZvaWQqIGNvbnN0IGZvbnQgPSBHTFVUX0JJVE1BUF85X0JZXzE1OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgdGV4dFtpXTsgKytpKSB7CisgICAgZ2x1dEJpdG1hcENoYXJhY3Rlcihmb250LCB0ZXh0W2ldKTsKKyAgfQorfQorCitzdGF0aWMgZmxvYXQgR2V0Q29sb3JmKHVpbnQzMl90IGNvbG9yLCBpbnQgc2hpZnQpIHsKKyAgcmV0dXJuIChjb2xvciA+PiBzaGlmdCkgLyAyNTUuZjsKK30KKworc3RhdGljIHZvaWQgRHJhd0NoZWNrZXJCb2FyZCh2b2lkKSB7CisgIGNvbnN0IGludCBzcXVhcmVfc2l6ZSA9IDg7ICAvLyBtdXN0IGJlIGEgcG93ZXIgb2YgMgorICBpbnQgeCwgeTsKKyAgR0xpbnQgdmlld3BvcnRbNF07ICAvLyB4LCB5LCB3aWR0aCwgaGVpZ2h0CisKKyAgZ2xQdXNoTWF0cml4KCk7CisKKyAgZ2xHZXRJbnRlZ2VydihHTF9WSUVXUE9SVCwgdmlld3BvcnQpOworICAvLyBzaGlmdCB0byBpbnRlZ2VyIGNvb3JkaW5hdGVzIHdpdGggKDAsMCkgYmVpbmcgdG9wLWxlZnQuCisgIGdsT3J0aG8oMCwgdmlld3BvcnRbMl0sIHZpZXdwb3J0WzNdLCAwLCAtMSwgMSk7CisgIGZvciAoeSA9IDA7IHkgPCB2aWV3cG9ydFszXTsgeSArPSBzcXVhcmVfc2l6ZSkgeworICAgIGZvciAoeCA9IDA7IHggPCB2aWV3cG9ydFsyXTsgeCArPSBzcXVhcmVfc2l6ZSkgeworICAgICAgY29uc3QgR0x1Ynl0ZSBjb2xvciA9IDEyOCArIDY0ICogKCEoKHggKyB5KSAmIHNxdWFyZV9zaXplKSk7CisgICAgICBnbENvbG9yM3ViKGNvbG9yLCBjb2xvciwgY29sb3IpOworICAgICAgZ2xSZWN0aSh4LCB5LCB4ICsgc3F1YXJlX3NpemUsIHkgKyBzcXVhcmVfc2l6ZSk7CisgICAgfQorICB9CisgIGdsUG9wTWF0cml4KCk7Cit9CisKK3N0YXRpYyB2b2lkIEhhbmRsZURpc3BsYXkodm9pZCkgeworICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBwaWMgPSBrUGFyYW1zLnBpYzsKKyAgY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBjdXJyID0gJmtQYXJhbXMuY3Vycl9mcmFtZTsKKyAgV2ViUEl0ZXJhdG9yKiBjb25zdCBwcmV2ID0gJmtQYXJhbXMucHJldl9mcmFtZTsKKyAgR0xmbG9hdCB4b2ZmLCB5b2ZmOworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgZ2xQdXNoTWF0cml4KCk7CisgIGdsUGl4ZWxab29tKChHTGZsb2F0KSgrMS4gLyBrUGFyYW1zLmNhbnZhc193aWR0aCAqIGtQYXJhbXMudmlld3BvcnRfd2lkdGgpLAorICAgICAgICAgICAgICAoR0xmbG9hdCkoLTEuIC8ga1BhcmFtcy5jYW52YXNfaGVpZ2h0ICoga1BhcmFtcy52aWV3cG9ydF9oZWlnaHQpKTsKKyAgeG9mZiA9IChHTGZsb2F0KSgyLiAqIGN1cnItPnhfb2Zmc2V0IC8ga1BhcmFtcy5jYW52YXNfd2lkdGgpOworICB5b2ZmID0gKEdMZmxvYXQpKDIuICogY3Vyci0+eV9vZmZzZXQgLyBrUGFyYW1zLmNhbnZhc19oZWlnaHQpOworICBnbFJhc3RlclBvczJmKC0xLmYgKyB4b2ZmLCAxLmYgLSB5b2ZmKTsKKyAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCAxKTsKKyAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfUk9XX0xFTkdUSCwgcGljLT51LlJHQkEuc3RyaWRlIC8gNCk7CisKKyAgaWYgKGtQYXJhbXMub25seV9kZWx0YXMpIHsKKyAgICBEcmF3Q2hlY2tlckJvYXJkKCk7CisgIH0gZWxzZSBpZiAocHJldi0+ZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EIHx8CisgICAgICBjdXJyLT5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfTk9fQkxFTkQpIHsKKyAgICAvLyBnbFNjaXNzb3IoKSB0YWtlcyB3aW5kb3cgY29vcmRpbmF0ZXMgKDAsMCBhdCBib3R0b20gbGVmdCkuCisgICAgaW50IHdpbmRvd194LCB3aW5kb3dfeTsKKyAgICBpbnQgZnJhbWVfdywgZnJhbWVfaDsKKyAgICBpZiAocHJldi0+ZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EKSB7CisgICAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgZnJhbWUgcmVjdGFuZ2xlLgorICAgICAgd2luZG93X3ggPSBwcmV2LT54X29mZnNldDsKKyAgICAgIHdpbmRvd195ID0ga1BhcmFtcy5jYW52YXNfaGVpZ2h0IC0gcHJldi0+eV9vZmZzZXQgLSBwcmV2LT5oZWlnaHQ7CisgICAgICBmcmFtZV93ID0gcHJldi0+d2lkdGg7CisgICAgICBmcmFtZV9oID0gcHJldi0+aGVpZ2h0OworICAgIH0gZWxzZSB7ICAvLyBjdXJyLT5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfTk9fQkxFTkQuCisgICAgICAvLyBXZSBzaW11bGF0ZSBuby1ibGVuZGluZyBiZWhhdmlvciBieSBmaXJzdCBjbGVhcmluZyB0aGUgY3VycmVudCBmcmFtZQorICAgICAgLy8gcmVjdGFuZ2xlICh0byBhIGNoZWNrZXItYm9hcmQpIGFuZCB0aGVuIGFscGhhLWJsZW5kaW5nIGFnYWluc3QgaXQuCisgICAgICB3aW5kb3dfeCA9IGN1cnItPnhfb2Zmc2V0OworICAgICAgd2luZG93X3kgPSBrUGFyYW1zLmNhbnZhc19oZWlnaHQgLSBjdXJyLT55X29mZnNldCAtIGN1cnItPmhlaWdodDsKKyAgICAgIGZyYW1lX3cgPSBjdXJyLT53aWR0aDsKKyAgICAgIGZyYW1lX2ggPSBjdXJyLT5oZWlnaHQ7CisgICAgfQorICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgLy8gT25seSB1cGRhdGUgdGhlIHJlcXVlc3RlZCBhcmVhLCBub3QgdGhlIHdob2xlIGNhbnZhcy4KKyAgICB3aW5kb3dfeCA9IHdpbmRvd194ICoga1BhcmFtcy52aWV3cG9ydF93aWR0aCAvIGtQYXJhbXMuY2FudmFzX3dpZHRoOworICAgIHdpbmRvd195ID0gd2luZG93X3kgKiBrUGFyYW1zLnZpZXdwb3J0X2hlaWdodCAvIGtQYXJhbXMuY2FudmFzX2hlaWdodDsKKyAgICBmcmFtZV93ID0gZnJhbWVfdyAqIGtQYXJhbXMudmlld3BvcnRfd2lkdGggLyBrUGFyYW1zLmNhbnZhc193aWR0aDsKKyAgICBmcmFtZV9oID0gZnJhbWVfaCAqIGtQYXJhbXMudmlld3BvcnRfaGVpZ2h0IC8ga1BhcmFtcy5jYW52YXNfaGVpZ2h0OworICAgIGdsU2Npc3Nvcih3aW5kb3dfeCwgd2luZG93X3ksIGZyYW1lX3csIGZyYW1lX2gpOworCisgICAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsgIC8vIHVzZSBjbGVhciBjb2xvcgorICAgIERyYXdDaGVja2VyQm9hcmQoKTsKKworICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICB9CisKKyAgKnByZXYgPSAqY3VycjsKKworICBnbERyYXdQaXhlbHMocGljLT53aWR0aCwgcGljLT5oZWlnaHQsCisgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLAorICAgICAgICAgICAgICAgKEdMdm9pZCopcGljLT51LlJHQkEucmdiYSk7CisgIGlmIChrUGFyYW1zLnByaW50X2luZm8pIHsKKyAgICBjaGFyIHRtcFszMl07CisKKyAgICBnbENvbG9yNGYoMC45MGYsIDAuMGYsIDAuOTBmLCAxLjBmKTsKKyAgICBnbFJhc3RlclBvczJmKC0wLjk1ZiwgMC45MGYpOworICAgIFByaW50U3RyaW5nKGtQYXJhbXMuZmlsZV9uYW1lKTsKKworICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJEaW1lbnNpb246JWQgeCAlZCIsIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KTsKKyAgICBnbENvbG9yNGYoMC45MGYsIDAuMGYsIDAuOTBmLCAxLjBmKTsKKyAgICBnbFJhc3RlclBvczJmKC0wLjk1ZiwgMC44MGYpOworICAgIFByaW50U3RyaW5nKHRtcCk7CisgICAgaWYgKGN1cnItPnhfb2Zmc2V0ICE9IDAgfHwgY3Vyci0+eV9vZmZzZXQgIT0gMCkgeworICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiAob2Zmc2V0OiVkLCVkKSIsCisgICAgICAgICAgICAgICBjdXJyLT54X29mZnNldCwgY3Vyci0+eV9vZmZzZXQpOworICAgICAgZ2xSYXN0ZXJQb3MyZigtMC45NWYsIDAuNzBmKTsKKyAgICAgIFByaW50U3RyaW5nKHRtcCk7CisgICAgfQorICB9CisgIGdsUG9wTWF0cml4KCk7CisjaWYgZGVmaW5lZChfX0FQUExFX18pIHx8IGRlZmluZWQoX1dJTjMyKQorICBnbEZsdXNoKCk7CisjZWxzZQorICBnbHV0U3dhcEJ1ZmZlcnMoKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBTdGFydERpc3BsYXkodm9pZCkgeworICBjb25zdCBpbnQgd2lkdGggPSBrUGFyYW1zLmNhbnZhc193aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IGtQYXJhbXMuY2FudmFzX2hlaWdodDsKKyAgLy8gVE9ETyh3ZWJwOjM2NSkgR0xVVF9ET1VCTEUgcmVzdWx0cyBpbiBmbGlja2VyaW5nIC8gb2xkIGZyYW1lcyB0byBiZQorICAvLyBwYXJ0aWFsbHkgZGlzcGxheWVkIHdpdGggYW5pbWF0ZWQgd2VicCArIGFscGhhLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKSB8fCBkZWZpbmVkKF9XSU4zMikKKyAgZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX1JHQkEpOworI2Vsc2UKKyAgZ2x1dEluaXREaXNwbGF5TW9kZShHTFVUX0RPVUJMRSB8IEdMVVRfUkdCQSk7CisjZW5kaWYKKyAgZ2x1dEluaXRXaW5kb3dTaXplKHdpZHRoLCBoZWlnaHQpOworICBnbHV0Q3JlYXRlV2luZG93KCJXZWJQIHZpZXdlciIpOworICBnbHV0RGlzcGxheUZ1bmMoSGFuZGxlRGlzcGxheSk7CisgIGdsdXRSZXNoYXBlRnVuYyhIYW5kbGVSZXNoYXBlKTsKKyAgZ2x1dElkbGVGdW5jKE5VTEwpOworICBnbHV0S2V5Ym9hcmRGdW5jKEhhbmRsZUtleSk7CisgIGdsQmxlbmRGdW5jKEdMX1NSQ19BTFBIQSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSk7CisgIGdsRW5hYmxlKEdMX0JMRU5EKTsKKyAgZ2xDbGVhckNvbG9yKEdldENvbG9yZihrUGFyYW1zLmJnX2NvbG9yLCAwKSwKKyAgICAgICAgICAgICAgIEdldENvbG9yZihrUGFyYW1zLmJnX2NvbG9yLCA4KSwKKyAgICAgICAgICAgICAgIEdldENvbG9yZihrUGFyYW1zLmJnX2NvbG9yLCAxNiksCisgICAgICAgICAgICAgICBHZXRDb2xvcmYoa1BhcmFtcy5iZ19jb2xvciwgMjQpKTsKKyAgZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUKTsKKyAgRHJhd0NoZWNrZXJCb2FyZCgpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbgorCitzdGF0aWMgdm9pZCBIZWxwKHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogdndlYnAgaW5fZmlsZSBbb3B0aW9uc11cblxuIgorICAgICAgICAgIkRlY29kZXMgdGhlIFdlYlAgaW1hZ2UgZmlsZSBhbmQgdmlzdWFsaXplIGl0IHVzaW5nIE9wZW5HTFxuIgorICAgICAgICAgIk9wdGlvbnMgYXJlOlxuIgorICAgICAgICAgIiAgLXZlcnNpb24gLi4uLi4gcHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcbiIKKyAgICAgICAgICIgIC1ub2ljYyAuLi4uLi4uIGRvbid0IHVzZSB0aGUgaWNjIHByb2ZpbGUgaWYgcHJlc2VudFxuIgorICAgICAgICAgIiAgLW5vZmFuY3kgLi4uLi4gZG9uJ3QgdXNlIHRoZSBmYW5jeSBZVVY0MjAgdXBzY2FsZXJcbiIKKyAgICAgICAgICIgIC1ub2ZpbHRlciAuLi4uIGRpc2FibGUgaW4tbG9vcCBmaWx0ZXJpbmdcbiIKKyAgICAgICAgICIgIC1kaXRoZXIgPGludD4gIGRpdGhlcmluZyBzdHJlbmd0aCAoMC4uMTAwKSwgZGVmYXVsdD01MFxuIgorICAgICAgICAgIiAgLW5vYWxwaGFkaXRoZXIgZGlzYWJsZSBhbHBoYSBwbGFuZSBkaXRoZXJpbmdcbiIKKyAgICAgICAgICIgIC1tdCAuLi4uLi4uLi4uIHVzZSBtdWx0aS10aHJlYWRpbmdcbiIKKyAgICAgICAgICIgIC1pbmZvIC4uLi4uLi4uIHByaW50IGluZm9cbiIKKyAgICAgICAgICIgIC1oIC4uLi4uLi4uLi4uIHRoaXMgaGVscCBtZXNzYWdlXG4iCisgICAgICAgICAiXG4iCisgICAgICAgICAiS2V5Ym9hcmQgc2hvcnRjdXRzOlxuIgorICAgICAgICAgIiAgJ2MnIC4uLi4uLi4uLi4uLi4uLi4gdG9nZ2xlIHVzZSBvZiBjb2xvciBwcm9maWxlXG4iCisgICAgICAgICAiICAnaScgLi4uLi4uLi4uLi4uLi4uLiBvdmVybGF5IGZpbGUgaW5mb3JtYXRpb25cbiIKKyAgICAgICAgICIgICdkJyAuLi4uLi4uLi4uLi4uLi4uIGRpc2FibGUgYmxlbmRpbmcgJiBkaXNwb3NhbCAoZGVidWcpXG4iCisgICAgICAgICAiICAncScgLyAnUScgLyBFU0MgLi4uLiBxdWl0XG4iCisgICAgICAgICk7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKKyAgaW50IGM7CisgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcgPSAma1BhcmFtcy5jb25maWc7CisgIFdlYlBJdGVyYXRvciogY29uc3QgY3VyciA9ICZrUGFyYW1zLmN1cnJfZnJhbWU7CisKKyAgaWYgKCFXZWJQSW5pdERlY29kZXJDb25maWcoY29uZmlnKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTGlicmFyeSB2ZXJzaW9uIG1pc21hdGNoIVxuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbmZpZy0+b3B0aW9ucy5kaXRoZXJpbmdfc3RyZW5ndGggPSA1MDsKKyAgY29uZmlnLT5vcHRpb25zLmFscGhhX2RpdGhlcmluZ19zdHJlbmd0aCA9IDEwMDsKKyAga1BhcmFtcy51c2VfY29sb3JfcHJvZmlsZSA9IDE7CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGludCBwYXJzZV9lcnJvciA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWhlbHAiKSkgeworICAgICAgSGVscCgpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9pY2MiKSkgeworICAgICAga1BhcmFtcy51c2VfY29sb3JfcHJvZmlsZSA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9mYW5jeSIpKSB7CisgICAgICBjb25maWctPm9wdGlvbnMubm9fZmFuY3lfdXBzYW1wbGluZyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItbm9maWx0ZXIiKSkgeworICAgICAgY29uZmlnLT5vcHRpb25zLmJ5cGFzc19maWx0ZXJpbmcgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW5vYWxwaGFkaXRoZXIiKSkgeworICAgICAgY29uZmlnLT5vcHRpb25zLmFscGhhX2RpdGhlcmluZ19zdHJlbmd0aCA9IDA7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItZGl0aGVyIikgJiYgYyArIDEgPCBhcmdjKSB7CisgICAgICBjb25maWctPm9wdGlvbnMuZGl0aGVyaW5nX3N0cmVuZ3RoID0KKyAgICAgICAgICBFeFV0aWxHZXRJbnQoYXJndlsrK2NdLCAwLCAmcGFyc2VfZXJyb3IpOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWluZm8iKSkgeworICAgICAga1BhcmFtcy5wcmludF9pbmZvID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi12ZXJzaW9uIikpIHsKKyAgICAgIGNvbnN0IGludCBkZWNfdmVyc2lvbiA9IFdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICAgICAgY29uc3QgaW50IGRtdXhfdmVyc2lvbiA9IFdlYlBHZXREZW11eFZlcnNpb24oKTsKKyAgICAgIHByaW50ZigiV2ViUCBEZWNvZGVyIHZlcnNpb246ICVkLiVkLiVkXG5XZWJQIERlbXV4IHZlcnNpb246ICVkLiVkLiVkXG4iLAorICAgICAgICAgICAgIChkZWNfdmVyc2lvbiA+PiAxNikgJiAweGZmLCAoZGVjX3ZlcnNpb24gPj4gOCkgJiAweGZmLAorICAgICAgICAgICAgIGRlY192ZXJzaW9uICYgMHhmZiwgKGRtdXhfdmVyc2lvbiA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgIChkbXV4X3ZlcnNpb24gPj4gOCkgJiAweGZmLCBkbXV4X3ZlcnNpb24gJiAweGZmKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLW10IikpIHsKKyAgICAgIGNvbmZpZy0+b3B0aW9ucy51c2VfdGhyZWFkcyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItLSIpKSB7CisgICAgICBpZiAoYyA8IGFyZ2MgLSAxKSBrUGFyYW1zLmZpbGVfbmFtZSA9IGFyZ3ZbKytjXTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSBpZiAoYXJndltjXVswXSA9PSAnLScpIHsKKyAgICAgIHByaW50ZigiVW5rbm93biBvcHRpb24gJyVzJ1xuIiwgYXJndltjXSk7CisgICAgICBIZWxwKCk7CisgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGtQYXJhbXMuZmlsZV9uYW1lID0gYXJndltjXTsKKyAgICB9CisKKyAgICBpZiAocGFyc2VfZXJyb3IpIHsKKyAgICAgIEhlbHAoKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBpZiAoa1BhcmFtcy5maWxlX25hbWUgPT0gTlVMTCkgeworICAgIHByaW50ZigibWlzc2luZyBpbnB1dCBmaWxlISFcbiIpOworICAgIEhlbHAoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoa1BhcmFtcy5maWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJmtQYXJhbXMuZGF0YS5ieXRlcywgJmtQYXJhbXMuZGF0YS5zaXplKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIVdlYlBHZXRJbmZvKGtQYXJhbXMuZGF0YS5ieXRlcywga1BhcmFtcy5kYXRhLnNpemUsIE5VTEwsIE5VTEwpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbnB1dCBmaWxlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIFdlYlAgZm9ybWF0LlxuIik7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGtQYXJhbXMuZG11eCA9IFdlYlBEZW11eCgma1BhcmFtcy5kYXRhKTsKKyAgaWYgKGtQYXJhbXMuZG11eCA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY3JlYXRlIGRlbXV4aW5nIG9iamVjdCFcbiIpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBrUGFyYW1zLmNhbnZhc193aWR0aCA9IFdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0NBTlZBU19XSURUSCk7CisgIGtQYXJhbXMuY2FudmFzX2hlaWdodCA9IFdlYlBEZW11eEdldEkoa1BhcmFtcy5kbXV4LCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOworICBpZiAoa1BhcmFtcy5wcmludF9pbmZvKSB7CisgICAgcHJpbnRmKCJDYW52YXM6ICVkIHggJWRcbiIsIGtQYXJhbXMuY2FudmFzX3dpZHRoLCBrUGFyYW1zLmNhbnZhc19oZWlnaHQpOworICB9CisKKyAgQ2xlYXJQcmV2aW91c0ZyYW1lKCk7CisKKyAgbWVtc2V0KCZrUGFyYW1zLmljY3AsIDAsIHNpemVvZihrUGFyYW1zLmljY3ApKTsKKyAga1BhcmFtcy5oYXNfY29sb3JfcHJvZmlsZSA9CisgICAgICAhIShXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9GT1JNQVRfRkxBR1MpICYgSUNDUF9GTEFHKTsKKyAgaWYgKGtQYXJhbXMuaGFzX2NvbG9yX3Byb2ZpbGUpIHsKKyNpZmRlZiBXRUJQX0hBVkVfUUNNUworICAgIGlmICghV2ViUERlbXV4R2V0Q2h1bmsoa1BhcmFtcy5kbXV4LCAiSUNDUCIsIDEsICZrUGFyYW1zLmljY3ApKSBnb3RvIEVycm9yOworICAgIHByaW50ZigiVlA4WDogRm91bmQgY29sb3IgcHJvZmlsZVxuIik7CisjZWxzZQorICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogY29sb3IgcHJvZmlsZSBwcmVzZW50LCBidXQgcWNtcyBpcyB1bmF2YWlsYWJsZSFcbiIKKyAgICAgICAgICAgICJCdWlsZCBsaWJxY21zIGZyb20gTW96aWxsYSBvciBDaHJvbWl1bSBhbmQgZGVmaW5lIFdFQlBfSEFWRV9RQ01TICIKKyAgICAgICAgICAgICJiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyNlbmRpZgorICB9CisKKyAgaWYgKCFXZWJQRGVtdXhHZXRGcmFtZShrUGFyYW1zLmRtdXgsIDEsIGN1cnIpKSBnb3RvIEVycm9yOworCisgIGtQYXJhbXMuaGFzX2FuaW1hdGlvbiA9IChjdXJyLT5udW1fZnJhbWVzID4gMSk7CisgIGtQYXJhbXMubG9vcF9jb3VudCA9IChpbnQpV2ViUERlbXV4R2V0SShrUGFyYW1zLmRtdXgsIFdFQlBfRkZfTE9PUF9DT1VOVCk7CisgIGtQYXJhbXMuYmdfY29sb3IgPSBXZWJQRGVtdXhHZXRJKGtQYXJhbXMuZG11eCwgV0VCUF9GRl9CQUNLR1JPVU5EX0NPTE9SKTsKKyAgcHJpbnRmKCJWUDhYOiBGb3VuZCAlZCBpbWFnZXMgaW4gZmlsZSAobG9vcCBjb3VudCA9ICVkKVxuIiwKKyAgICAgICAgIGN1cnItPm51bV9mcmFtZXMsIGtQYXJhbXMubG9vcF9jb3VudCk7CisKKyAgLy8gRGVjb2RlIGZpcnN0IGZyYW1lCisgIGlmICghRGVjb2RlKCkpIGdvdG8gRXJyb3I7CisKKyAgLy8gUG9zaXRpb24gaXRlcmF0b3IgdG8gbGFzdCBmcmFtZS4gTmV4dCBjYWxsIHRvIEhhbmRsZURpc3BsYXkgd2lsbCB3cmFwIG92ZXIuCisgIC8vIFdlIHRha2UgdGhpcyBpbnRvIGFjY291bnQgYnkgYnVtcGluZyB1cCBsb29wX2NvdW50LgorICBXZWJQRGVtdXhHZXRGcmFtZShrUGFyYW1zLmRtdXgsIDAsIGN1cnIpOworICBpZiAoa1BhcmFtcy5sb29wX2NvdW50KSArK2tQYXJhbXMubG9vcF9jb3VudDsKKworI2lmIGRlZmluZWQoX191bml4X18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyAgLy8gV29yayBhcm91bmQgR0xVVCBjb21wb3NpdG9yIGJ1Zy4KKyAgLy8gaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2UvZnJlZWdsdXQvK2J1Zy8zNjk4OTEKKyAgc2V0ZW52KCJYTElCX1NLSVBfQVJHQl9WSVNVQUxTIiwgIjEiLCAxKTsKKyNlbmRpZgorCisgIC8vIFN0YXJ0IGRpc3BsYXkgKGFuZCB0aW1lcikKKyAgZ2x1dEluaXQoJmFyZ2MsIGFyZ3YpOworI2lmZGVmIEZSRUVHTFVUCisgIGdsdXRTZXRPcHRpb24oR0xVVF9BQ1RJT05fT05fV0lORE9XX0NMT1NFLCBHTFVUX0FDVElPTl9DT05USU5VRV9FWEVDVVRJT04pOworI2VuZGlmCisgIFN0YXJ0RGlzcGxheSgpOworCisgIGlmIChrUGFyYW1zLmhhc19hbmltYXRpb24pIGdsdXRUaW1lckZ1bmMoMCwgZGVjb2RlX2NhbGxiYWNrLCAwKTsKKyAgZ2x1dE1haW5Mb29wKCk7CisKKyAgLy8gU2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB3aGVuIHVzaW5nIEZSRUVHTFVUOgorICBDbGVhclBhcmFtcygpOworICByZXR1cm4gMDsKKworIEVycm9yOgorICBDbGVhclBhcmFtcygpOworICByZXR1cm4gLTE7Cit9CisKKyNlbHNlICAgLy8gIVdFQlBfSEFWRV9HTAorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGZwcmludGYoc3RkZXJyLCAiT3BlbkdMIHN1cHBvcnQgbm90IGVuYWJsZWQgaW4gJXMuXG4iLCBhcmd2WzBdKTsKKyAgKHZvaWQpYXJnYzsKKyAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicGluZm8uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBpbmZvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjZDI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4YW1wbGVzL3dlYnBpbmZvLmMKQEAgLTAsMCArMSwxMTc4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIENvbW1hbmQtbGluZSB0b29sIHRvIHByaW50IG91dCB0aGUgY2h1bmsgbGV2ZWwgc3RydWN0dXJlIG9mIFdlYlAgZmlsZXMKKy8vICBhbG9uZyB3aXRoIGJhc2ljIGludGVncml0eSBjaGVja3MuCisvLworLy8gIEF1dGhvcjogSHVpIFN1IChodWlzdUBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAid2VicC9tdXhfdHlwZXMuaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisjZGVmaW5lIExPR19FUlJPUihNRVNTQUdFKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICh3ZWJwX2luZm8tPnNob3dfZGlhZ25vc2lzXykgeyAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yOiAlc1xuIiwgTUVTU0FHRSk7IFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPR19XQVJOKE1FU1NBR0UpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAod2VicF9pbmZvLT5zaG93X2RpYWdub3Npc18pIHsgICAgICAgICAgICBcCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6ICVzXG4iLCBNRVNTQUdFKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtGb3JtYXRzWzNdID0geworICAiVW5rbm93biIsCisgICJMb3NzeSIsCisgICJMb3NzbGVzcyIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrTG9zc2xlc3NUcmFuc2Zvcm1zWzRdID0geworICAiUHJlZGljdG9yIiwKKyAgIkNyb3NzIENvbG9yIiwKKyAgIlN1YnRyYWN0IEdyZWVuIiwKKyAgIkNvbG9yIEluZGV4aW5nIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtBbHBoYUZpbHRlck1ldGhvZHNbNF0gPSB7CisgICJOb25lIiwKKyAgIkhvcml6b250YWwiLAorICAiVmVydGljYWwiLAorICAiR3JhZGllbnQiCit9OworCit0eXBlZGVmIGVudW0geworICBXRUJQX0lORk9fT0sgPSAwLAorICBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEEsCisgIFdFQlBfSU5GT19QQVJTRV9FUlJPUiwKKyAgV0VCUF9JTkZPX0lOVkFMSURfUEFSQU0sCisgIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1IsCisgIFdFQlBfSU5GT19NSVNTSU5HX0RBVEEsCisgIFdFQlBfSU5GT19JTlZBTElEX0NPTU1BTkQKK30gV2ViUEluZm9TdGF0dXM7CisKK3R5cGVkZWYgZW51bSBDaHVua0lEIHsKKyAgQ0hVTktfVlA4LAorICBDSFVOS19WUDhMLAorICBDSFVOS19WUDhYLAorICBDSFVOS19BTFBIQSwKKyAgQ0hVTktfQU5JTSwKKyAgQ0hVTktfQU5NRiwKKyAgQ0hVTktfSUNDUCwKKyAgQ0hVTktfRVhJRiwKKyAgQ0hVTktfWE1QLAorICBDSFVOS19VTktOT1dOLAorICBDSFVOS19UWVBFUyA9IENIVU5LX1VOS05PV04KK30gQ2h1bmtJRDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBzaXplX3Qgc3RhcnRfOworICBzaXplX3QgZW5kXzsKKyAgY29uc3QgdWludDhfdCogYnVmXzsKK30gTWVtQnVmZmVyOworCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBvZmZzZXRfOworICBzaXplX3Qgc2l6ZV87CisgIGNvbnN0IHVpbnQ4X3QqIHBheWxvYWRfOworICBDaHVua0lEIGlkXzsKK30gQ2h1bmtEYXRhOworCit0eXBlZGVmIHN0cnVjdCBXZWJQSW5mbyB7CisgIGludCBjYW52YXNfd2lkdGhfOworICBpbnQgY2FudmFzX2hlaWdodF87CisgIGludCBsb29wX2NvdW50XzsKKyAgaW50IG51bV9mcmFtZXNfOworICBpbnQgY2h1bmtfY291bnRzX1tDSFVOS19UWVBFU107CisgIGludCBhbm1mX3N1YmNodW5rX2NvdW50c19bM107ICAvLyAwIFZQODsgMSBWUDhMOyAyIEFMUEguCisgIHVpbnQzMl90IGJnY29sb3JfOworICBpbnQgZmVhdHVyZV9mbGFnc187CisgIGludCBoYXNfYWxwaGFfOworICAvLyBVc2VkIGZvciBwYXJzaW5nIEFOTUYgY2h1bmtzLgorICBpbnQgZnJhbWVfd2lkdGhfLCBmcmFtZV9oZWlnaHRfOworICBzaXplX3QgYW5pbV9mcmFtZV9kYXRhX3NpemVfOworICBpbnQgaXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXywgc2Vlbl9hbHBoYV9zdWJjaHVua18sIHNlZW5faW1hZ2Vfc3ViY2h1bmtfOworICAvLyBQcmludCBvdXRwdXQgY29udHJvbC4KKyAgaW50IHF1aWV0Xywgc2hvd19kaWFnbm9zaXNfLCBzaG93X3N1bW1hcnlfOworICBpbnQgcGFyc2VfYml0c3RyZWFtXzsKK30gV2ViUEluZm87CisKK3N0YXRpYyB2b2lkIFdlYlBJbmZvSW5pdChXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIG1lbXNldCh3ZWJwX2luZm8sIDAsIHNpemVvZigqd2VicF9pbmZvKSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGtXZWJQQ2h1bmtUYWdzW0NIVU5LX1RZUEVTXVs0XSA9IHsKKyAgeyAnVicsICdQJywgJzgnLCAnICcgfSwKKyAgeyAnVicsICdQJywgJzgnLCAnTCcgfSwKKyAgeyAnVicsICdQJywgJzgnLCAnWCcgfSwKKyAgeyAnQScsICdMJywgJ1AnLCAnSCcgfSwKKyAgeyAnQScsICdOJywgJ0knLCAnTScgfSwKKyAgeyAnQScsICdOJywgJ00nLCAnRicgfSwKKyAgeyAnSScsICdDJywgJ0MnLCAnUCcgfSwKKyAgeyAnRScsICdYJywgJ0knLCAnRicgfSwKKyAgeyAnWCcsICdNJywgJ1AnLCAnICcgfSwKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEYXRhIHJlYWRpbmcuCisKK3N0YXRpYyBpbnQgR2V0TEUxNihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7CisgIHJldHVybiAoZGF0YVswXSA8PCAwKSB8IChkYXRhWzFdIDw8IDgpOworfQorCitzdGF0aWMgaW50IEdldExFMjQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gR2V0TEUxNihkYXRhKSB8IChkYXRhWzJdIDw8IDE2KTsKK30KKworc3RhdGljIHVpbnQzMl90IEdldExFMzIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgeworICByZXR1cm4gR2V0TEUxNihkYXRhKSB8ICgodWludDMyX3QpR2V0TEUxNihkYXRhICsgMikgPDwgMTYpOworfQorCitzdGF0aWMgaW50IFJlYWRMRTE2KGNvbnN0IHVpbnQ4X3QqKiBkYXRhKSB7CisgIGNvbnN0IGludCB2YWwgPSBHZXRMRTE2KCpkYXRhKTsKKyAgKmRhdGEgKz0gMjsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBSZWFkTEUyNChjb25zdCB1aW50OF90KiogZGF0YSkgeworICBjb25zdCBpbnQgdmFsID0gR2V0TEUyNCgqZGF0YSk7CisgICpkYXRhICs9IDM7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBSZWFkTEUzMihjb25zdCB1aW50OF90KiogZGF0YSkgeworICBjb25zdCB1aW50MzJfdCB2YWwgPSBHZXRMRTMyKCpkYXRhKTsKKyAgKmRhdGEgKz0gNDsKKyAgcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGludCBSZWFkRmlsZVRvV2ViUERhdGEoY29uc3QgY2hhciogY29uc3QgZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBzaXplOworICBpZiAoIUltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJnNpemUpKSByZXR1cm4gMDsKKyAgd2VicF9kYXRhLT5ieXRlcyA9IGRhdGE7CisgIHdlYnBfZGF0YS0+c2l6ZSA9IHNpemU7CisgIHJldHVybiAxOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWVtQnVmZmVyIG9iamVjdC4KKworc3RhdGljIHZvaWQgSW5pdE1lbUJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSwgY29uc3QgV2ViUERhdGEqIHdlYnBfZGF0YSkgeworICBtZW0tPmJ1Zl8gPSB3ZWJwX2RhdGEtPmJ5dGVzOworICBtZW0tPnN0YXJ0XyA9IDA7CisgIG1lbS0+ZW5kXyA9IHdlYnBfZGF0YS0+c2l6ZTsKK30KKworc3RhdGljIHNpemVfdCBNZW1EYXRhU2l6ZShjb25zdCBNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gKG1lbS0+ZW5kXyAtIG1lbS0+c3RhcnRfKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QqIEdldEJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICByZXR1cm4gbWVtLT5idWZfICsgbWVtLT5zdGFydF87Cit9CisKK3N0YXRpYyB2b2lkIFNraXAoTWVtQnVmZmVyKiBjb25zdCBtZW0sIHNpemVfdCBzaXplKSB7CisgIG1lbS0+c3RhcnRfICs9IHNpemU7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBSZWFkTWVtQnVmTEUzMihNZW1CdWZmZXIqIGNvbnN0IG1lbSkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhID0gbWVtLT5idWZfICsgbWVtLT5zdGFydF87CisgIGNvbnN0IHVpbnQzMl90IHZhbCA9IEdldExFMzIoZGF0YSk7CisgIGFzc2VydChNZW1EYXRhU2l6ZShtZW0pID49IDQpOworICBTa2lwKG1lbSwgNCk7CisgIHJldHVybiB2YWw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb3NzeSBiaXRzdHJlYW0gYW5hbHlzaXMuCisKK3N0YXRpYyBpbnQgR2V0Qml0cyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgbmIsCisgICAgICAgICAgICAgICAgICAgaW50KiB2YWwsIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgICp2YWwgPSAwOworICB3aGlsZSAobmItLSA+IDApIHsKKyAgICBjb25zdCB1aW50NjRfdCBwID0gKCpiaXRfcG9zKSsrOworICAgIGlmICgocCA+PiAzKSA+PSBkYXRhX3NpemUpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBpbnQgYml0ID0gISEoZGF0YVtwID4+IDNdICYgKDEyOCA+PiAoKHAgJiA3KSkpKTsKKyAgICAgICp2YWwgPSAoKnZhbCA8PCAxKSB8IGJpdDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgR2V0U2lnbmVkQml0cyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgbmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB2YWwsIHVpbnQ2NF90KiBjb25zdCBiaXRfcG9zKSB7CisgIGludCBzaWduOworICBpZiAoIUdldEJpdHMoZGF0YSwgZGF0YV9zaXplLCBuYiwgdmFsLCBiaXRfcG9zKSkgcmV0dXJuIDA7CisgIGlmICghR2V0Qml0cyhkYXRhLCBkYXRhX3NpemUsIDEsICZzaWduLCBiaXRfcG9zKSkgcmV0dXJuIDA7CisgIGlmIChzaWduKSAqdmFsID0gLSgqdmFsKTsKKyAgcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgR0VUX0JJVFModiwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghR2V0Qml0cyhkYXRhLCBkYXRhX3NpemUsIG4sICYodiksIGJpdF9wb3MpKSB7IFwKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGxvc3N5IGJpdHN0cmVhbS4iKTsgICAgICAgICBcCisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOyAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBHRVRfU0lHTkVEX0JJVFModiwgbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCFHZXRTaWduZWRCaXRzKGRhdGEsIGRhdGFfc2l6ZSwgbiwgJih2KSwgYml0X3BvcykpIHsgXAorICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc3kgYml0c3RyZWFtLiIpOyAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VMb3NzeVNlZ21lbnRIZWFkZXIoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgaW50IHVzZV9zZWdtZW50OworICBHRVRfQklUUyh1c2Vfc2VnbWVudCwgMSk7CisgIHByaW50ZigiICBVc2Ugc2VnbWVudDogICAgICAlZFxuIiwgdXNlX3NlZ21lbnQpOworICBpZiAodXNlX3NlZ21lbnQpIHsKKyAgICBpbnQgdXBkYXRlX21hcCwgdXBkYXRlX2RhdGE7CisgICAgR0VUX0JJVFModXBkYXRlX21hcCwgMSk7CisgICAgR0VUX0JJVFModXBkYXRlX2RhdGEsIDEpOworICAgIHByaW50ZigiICBVcGRhdGUgbWFwOiAgICAgICAlZFxuIgorICAgICAgICAgICAiICBVcGRhdGUgZGF0YTogICAgICAlZFxuIiwKKyAgICAgICAgICAgdXBkYXRlX21hcCwgdXBkYXRlX2RhdGEpOworICAgIGlmICh1cGRhdGVfZGF0YSkgeworICAgICAgaW50IGksIGFfZGVsdGE7CisgICAgICBpbnQgcXVhbnRpemVyWzRdID0gezAsIDAsIDAsIDB9OworICAgICAgaW50IGZpbHRlcl9zdHJlbmd0aFs0XSA9IHswLCAwLCAwLCAwfTsKKyAgICAgIEdFVF9CSVRTKGFfZGVsdGEsIDEpOworICAgICAgcHJpbnRmKCIgIEFic29sdXRlIGRlbHRhOiAgICVkXG4iLCBhX2RlbHRhKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICAgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKHF1YW50aXplcltpXSwgNyk7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAgIGludCBiaXQ7CisgICAgICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhmaWx0ZXJfc3RyZW5ndGhbaV0sIDYpOworICAgICAgfQorICAgICAgcHJpbnRmKCIgIFF1YW50aXplcjogICAgICAgICVkICVkICVkICVkXG4iLCBxdWFudGl6ZXJbMF0sIHF1YW50aXplclsxXSwKKyAgICAgICAgICAgICBxdWFudGl6ZXJbMl0sIHF1YW50aXplclszXSk7CisgICAgICBwcmludGYoIiAgRmlsdGVyIHN0cmVuZ3RoOiAgJWQgJWQgJWQgJWRcbiIsIGZpbHRlcl9zdHJlbmd0aFswXSwKKyAgICAgICAgICAgICBmaWx0ZXJfc3RyZW5ndGhbMV0sIGZpbHRlcl9zdHJlbmd0aFsyXSwgZmlsdGVyX3N0cmVuZ3RoWzNdKTsKKyAgICB9CisgICAgaWYgKHVwZGF0ZV9tYXApIHsKKyAgICAgIGludCBpOworICAgICAgaW50IHByb2Jfc2VnbWVudFszXSA9IHsyNTUsIDI1NSwgMjU1fTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgICAgaW50IGJpdDsKKyAgICAgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICAgICAgaWYgKGJpdCkgR0VUX0JJVFMocHJvYl9zZWdtZW50W2ldLCA4KTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiICBQcm9iIHNlZ21lbnQ6ICAgICAlZCAlZCAlZFxuIiwKKyAgICAgICAgICAgICBwcm9iX3NlZ21lbnRbMF0sIHByb2Jfc2VnbWVudFsxXSwgcHJvYl9zZWdtZW50WzJdKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlTG9zc3lGaWx0ZXJIZWFkZXIoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgaW50IHNpbXBsZV9maWx0ZXIsIGxldmVsLCBzaGFycG5lc3MsIHVzZV9sZl9kZWx0YTsKKyAgR0VUX0JJVFMoc2ltcGxlX2ZpbHRlciwgMSk7CisgIEdFVF9CSVRTKGxldmVsLCA2KTsKKyAgR0VUX0JJVFMoc2hhcnBuZXNzLCAzKTsKKyAgR0VUX0JJVFModXNlX2xmX2RlbHRhLCAxKTsKKyAgcHJpbnRmKCIgIFNpbXBsZSBmaWx0ZXI6ICAgICVkXG4iLCBzaW1wbGVfZmlsdGVyKTsKKyAgcHJpbnRmKCIgIExldmVsOiAgICAgICAgICAgICVkXG4iLCBsZXZlbCk7CisgIHByaW50ZigiICBTaGFycG5lc3M6ICAgICAgICAlZFxuIiwgc2hhcnBuZXNzKTsKKyAgcHJpbnRmKCIgIFVzZSBsZiBkZWx0YTogICAgICVkXG4iLCB1c2VfbGZfZGVsdGEpOworICBpZiAodXNlX2xmX2RlbHRhKSB7CisgICAgaW50IHVwZGF0ZTsKKyAgICBHRVRfQklUUyh1cGRhdGUsIDEpOworICAgIHByaW50ZigiICBVcGRhdGUgbGYgZGVsdGE6ICAlZFxuIiwgdXBkYXRlKTsKKyAgICBpZiAodXBkYXRlKSB7CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCA0ICsgNDsgKytpKSB7CisgICAgICAgIGludCB0ZW1wOworICAgICAgICBHRVRfQklUUyh0ZW1wLCAxKTsKKyAgICAgICAgaWYgKHRlbXApIEdFVF9CSVRTKHRlbXAsIDcpOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VMb3NzeUhlYWRlcihjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IGNodW5rX2RhdGEtPnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIGNvbnN0IHVpbnQzMl90IGJpdHMgPSAodWludDMyX3QpZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOworICBjb25zdCBpbnQga2V5X2ZyYW1lID0gIShiaXRzICYgMSk7CisgIGNvbnN0IGludCBwcm9maWxlID0gKGJpdHMgPj4gMSkgJiA3OworICBjb25zdCBpbnQgZGlzcGxheSA9IChiaXRzID4+IDQpICYgMTsKKyAgY29uc3QgdWludDMyX3QgcGFydGl0aW9uMF9sZW5ndGggPSAoYml0cyA+PiA1KTsKKyAgV2ViUEluZm9TdGF0dXMgc3RhdHVzID0gV0VCUF9JTkZPX09LOworICB1aW50NjRfdCBiaXRfcG9zaXRpb24gPSAwOworICB1aW50NjRfdCogY29uc3QgYml0X3BvcyA9ICZiaXRfcG9zaXRpb247CisgIGludCBjb2xvcnNwYWNlLCBjbGFtcF90eXBlOworICBwcmludGYoIiAgUGFyc2luZyBsb3NzeSBiaXRzdHJlYW0uLi5cbiIpOworICAvLyBDYWxsaW5nIFdlYlBHZXRGZWF0dXJlcygpIGluIFByb2Nlc3NJbWFnZUNodW5rKCkgc2hvdWxkIGVuc3VyZSB0aGlzLgorICBhc3NlcnQoY2h1bmtfZGF0YS0+c2l6ZV8gPj0gQ0hVTktfSEVBREVSX1NJWkUgKyAxMCk7CisgIGlmIChwcm9maWxlID4gMykgeworICAgIExPR19FUlJPUigiVW5rbm93biBwcm9maWxlLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIGlmICghZGlzcGxheSkgeworICAgIExPR19FUlJPUigiRnJhbWUgaXMgbm90IGRpc3BsYXlhYmxlLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIGRhdGEgKz0gMzsKKyAgZGF0YV9zaXplIC09IDM7CisgIHByaW50ZigiICBLZXkgZnJhbWU6ICAgICAgICAlc1xuIgorICAgICAgICAgIiAgUHJvZmlsZTogICAgICAgICAgJWRcbiIKKyAgICAgICAgICIgIERpc3BsYXk6ICAgICAgICAgICVzXG4iCisgICAgICAgICAiICBQYXJ0LiAwIGxlbmd0aDogICAlZFxuIiwKKyAgICAgICAgIGtleV9mcmFtZSA/ICJZZXMiIDogIk5vIiwgcHJvZmlsZSwKKyAgICAgICAgIGRpc3BsYXkgPyAiWWVzIiA6ICJObyIsIHBhcnRpdGlvbjBfbGVuZ3RoKTsKKyAgaWYgKGtleV9mcmFtZSkgeworICAgIGlmICghKGRhdGFbMF0gPT0gMHg5ZCAmJiBkYXRhWzFdID09IDB4MDEgJiYgZGF0YVsyXSA9PSAweDJhKSkgeworICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGxvc3N5IGJpdHN0cmVhbSBzaWduYXR1cmUuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CisgICAgcHJpbnRmKCIgIFdpZHRoOiAgICAgICAgICAgICVkXG4iCisgICAgICAgICAgICIgIFggc2NhbGU6ICAgICAgICAgICVkXG4iCisgICAgICAgICAgICIgIEhlaWdodDogICAgICAgICAgICVkXG4iCisgICAgICAgICAgICIgIFkgc2NhbGU6ICAgICAgICAgICVkXG4iLAorICAgICAgICAgICAoKGRhdGFbNF0gPDwgOCkgfCBkYXRhWzNdKSAmIDB4M2ZmZiwgZGF0YVs0XSA+PiA2LAorICAgICAgICAgICAoKGRhdGFbNl0gPDwgOCkgfCBkYXRhWzVdKSAmIDB4M2ZmZiwgZGF0YVs2XSA+PiA2KTsKKyAgICBkYXRhICs9IDc7CisgICAgZGF0YV9zaXplIC09IDc7CisgIH0gZWxzZSB7CisgICAgTE9HX0VSUk9SKCJOb24ta2V5ZnJhbWUgZGV0ZWN0ZWQgaW4gbG9zc3kgYml0c3RyZWFtLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIGlmIChwYXJ0aXRpb24wX2xlbmd0aCA+PSBkYXRhX3NpemUpIHsKKyAgICBMT0dfRVJST1IoIkJhZCBwYXJ0aXRpb24gbGVuZ3RoLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICB9CisgIEdFVF9CSVRTKGNvbG9yc3BhY2UsIDEpOworICBHRVRfQklUUyhjbGFtcF90eXBlLCAxKTsKKyAgcHJpbnRmKCIgIENvbG9yIHNwYWNlOiAgICAgICVkXG4iLCBjb2xvcnNwYWNlKTsKKyAgcHJpbnRmKCIgIENsYW1wIHR5cGU6ICAgICAgICVkXG4iLCBjbGFtcF90eXBlKTsKKyAgc3RhdHVzID0gUGFyc2VMb3NzeVNlZ21lbnRIZWFkZXIod2VicF9pbmZvLCBkYXRhLCBkYXRhX3NpemUsIGJpdF9wb3MpOworICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgc3RhdHVzID0gUGFyc2VMb3NzeUZpbHRlckhlYWRlcih3ZWJwX2luZm8sIGRhdGEsIGRhdGFfc2l6ZSwgYml0X3Bvcyk7CisgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICB7ICAvLyBQYXJ0aXRpb24gbnVtYmVyIGFuZCBzaXplLgorICAgIGNvbnN0IHVpbnQ4X3QqIHBhcnRfc2l6ZSA9IGRhdGEgKyBwYXJ0aXRpb24wX2xlbmd0aDsKKyAgICBpbnQgbnVtX3BhcnRzLCBpOworICAgIHNpemVfdCBwYXJ0X2RhdGFfc2l6ZTsKKyAgICBHRVRfQklUUyhudW1fcGFydHMsIDIpOworICAgIG51bV9wYXJ0cyA9IDEgPDwgbnVtX3BhcnRzOworICAgIGlmICgoaW50KShkYXRhX3NpemUgLSBwYXJ0aXRpb24wX2xlbmd0aCkgPCAobnVtX3BhcnRzIC0gMSkgKiAzKSB7CisgICAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzeSBiaXRzdHJlYW0uIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICAgIH0KKyAgICBwYXJ0X2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZSAtIHBhcnRpdGlvbjBfbGVuZ3RoIC0gKG51bV9wYXJ0cyAtIDEpICogMzsKKyAgICBwcmludGYoIiAgVG90YWwgcGFydGl0aW9uczogJWRcbiIsIG51bV9wYXJ0cyk7CisgICAgZm9yIChpID0gMTsgaSA8IG51bV9wYXJ0czsgKytpKSB7CisgICAgICBjb25zdCBzaXplX3QgcHNpemUgPQorICAgICAgICAgIHBhcnRfc2l6ZVswXSB8IChwYXJ0X3NpemVbMV0gPDwgOCkgfCAocGFydF9zaXplWzJdIDw8IDE2KTsKKyAgICAgIGlmIChwc2l6ZSA+IHBhcnRfZGF0YV9zaXplKSB7CisgICAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIHBhcnRpdGlvbi4iKTsKKyAgICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgICAgIH0KKyAgICAgIHByaW50ZigiICBQYXJ0LiAlZCBsZW5ndGg6ICAgJWRcbiIsIGksIChpbnQpcHNpemUpOworICAgICAgcGFydF9kYXRhX3NpemUgLT0gcHNpemU7CisgICAgICBwYXJ0X3NpemUgKz0gMzsKKyAgICB9CisgIH0KKyAgLy8gUXVhbnRpemVyLgorICB7CisgICAgaW50IGJhc2VfcSwgYml0OworICAgIGludCBkcV95MV9kYyA9IDAsIGRxX3kyX2RjID0gMCwgZHFfeTJfYWMgPSAwLCBkcV91dl9kYyA9IDAsIGRxX3V2X2FjID0gMDsKKyAgICBHRVRfQklUUyhiYXNlX3EsIDcpOworICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGRxX3kxX2RjLCA0KTsKKyAgICBHRVRfQklUUyhiaXQsIDEpOworICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhkcV95Ml9kYywgNCk7CisgICAgR0VUX0JJVFMoYml0LCAxKTsKKyAgICBpZiAoYml0KSBHRVRfU0lHTkVEX0JJVFMoZHFfeTJfYWMsIDQpOworICAgIEdFVF9CSVRTKGJpdCwgMSk7CisgICAgaWYgKGJpdCkgR0VUX1NJR05FRF9CSVRTKGRxX3V2X2RjLCA0KTsKKyAgICBHRVRfQklUUyhiaXQsIDEpOworICAgIGlmIChiaXQpIEdFVF9TSUdORURfQklUUyhkcV91dl9hYywgNCk7CisgICAgcHJpbnRmKCIgIEJhc2UgUTogICAgICAgICAgICVkXG4iLCBiYXNlX3EpOworICAgIHByaW50ZigiICBEUSBZMSBEQzogICAgICAgICAlZFxuIiwgZHFfeTFfZGMpOworICAgIHByaW50ZigiICBEUSBZMiBEQzogICAgICAgICAlZFxuIiwgZHFfeTJfZGMpOworICAgIHByaW50ZigiICBEUSBZMiBBQzogICAgICAgICAlZFxuIiwgZHFfeTJfYWMpOworICAgIHByaW50ZigiICBEUSBVViBEQzogICAgICAgICAlZFxuIiwgZHFfdXZfZGMpOworICAgIHByaW50ZigiICBEUSBVViBBQzogICAgICAgICAlZFxuIiwgZHFfdXZfYWMpOworICB9CisgIGlmICgoKmJpdF9wb3MgPj4gMykgPj0gcGFydGl0aW9uMF9sZW5ndGgpIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBsb3NzeSBiaXRzdHJlYW0uIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTG9zc2xlc3MgYml0c3RyZWFtIGFuYWx5c2lzLgorCitzdGF0aWMgaW50IExMR2V0Qml0cyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBzaXplX3QgbmIsCisgICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbCwgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgdWludDMyX3QgaSA9IDA7CisgICp2YWwgPSAwOworICB3aGlsZSAoaSA8IG5iKSB7CisgICAgY29uc3QgdWludDY0X3QgcCA9ICgqYml0X3BvcykrKzsKKyAgICBpZiAoKHAgPj4gMykgPj0gZGF0YV9zaXplKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IGJpdCA9ICEhKGRhdGFbcCA+PiAzXSAmICgxIDw8ICgocCAmIDcpKSkpOworICAgICAgKnZhbCA9ICp2YWwgfCAoYml0IDw8IGkpOworICAgICAgKytpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworI2RlZmluZSBMTF9HRVRfQklUUyh2LCBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghTExHZXRCaXRzKGRhdGEsIGRhdGFfc2l6ZSwgbiwgJih2KSwgYml0X3BvcykpIHsgXAorICAgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc2xlc3MgYml0c3RyZWFtLiIpOyAgICAgICAgXAorICAgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VMb3NzbGVzc1RyYW5zZm9ybShXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCogY29uc3QgIGJpdF9wb3MpIHsKKyAgaW50IHVzZV90cmFuc2Zvcm0sIGJsb2NrX3NpemUsIG5fY29sb3JzOworICBMTF9HRVRfQklUUyh1c2VfdHJhbnNmb3JtLCAxKTsKKyAgcHJpbnRmKCIgIFVzZSB0cmFuc2Zvcm06ICAgICVzXG4iLCB1c2VfdHJhbnNmb3JtID8gIlllcyIgOiAiTm8iKTsKKyAgaWYgKHVzZV90cmFuc2Zvcm0pIHsKKyAgICBpbnQgdHlwZTsKKyAgICBMTF9HRVRfQklUUyh0eXBlLCAyKTsKKyAgICBwcmludGYoIiAgMXN0IHRyYW5zZm9ybTogICAgJXMgKCVkKVxuIiwga0xvc3NsZXNzVHJhbnNmb3Jtc1t0eXBlXSwgdHlwZSk7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICBjYXNlIFBSRURJQ1RPUl9UUkFOU0ZPUk06CisgICAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKKyAgICAgICAgTExfR0VUX0JJVFMoYmxvY2tfc2l6ZSwgMyk7CisgICAgICAgIGJsb2NrX3NpemUgPSAxIDw8IChibG9ja19zaXplICsgMik7CisgICAgICAgIHByaW50ZigiICBUcmFuLiBibG9jayBzaXplOiAlZFxuIiwgYmxvY2tfc2l6ZSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06CisgICAgICAgIExMX0dFVF9CSVRTKG5fY29sb3JzLCA4KTsKKyAgICAgICAgbl9jb2xvcnMgKz0gMTsKKyAgICAgICAgcHJpbnRmKCIgIE5vLiBvZiBjb2xvcnM6ICAgICVkXG4iLCBuX2NvbG9ycyk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQYXJzZUxvc3NsZXNzSGVhZGVyKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgY29uc3QgdWludDhfdCogZGF0YSA9IGNodW5rX2RhdGEtPnBheWxvYWRfOworICBzaXplX3QgZGF0YV9zaXplID0gY2h1bmtfZGF0YS0+c2l6ZV8gLSBDSFVOS19IRUFERVJfU0laRTsKKyAgdWludDY0X3QgYml0X3Bvc2l0aW9uID0gMDsKKyAgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MgPSAmYml0X3Bvc2l0aW9uOworICBXZWJQSW5mb1N0YXR1cyBzdGF0dXM7CisgIHByaW50ZigiICBQYXJzaW5nIGxvc3NsZXNzIGJpdHN0cmVhbS4uLlxuIik7CisgIGlmIChkYXRhX3NpemUgPCBWUDhMX0ZSQU1FX0hFQURFUl9TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgbG9zc2xlc3MgYml0c3RyZWFtLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgaWYgKGRhdGFbMF0gIT0gVlA4TF9NQUdJQ19CWVRFKSB7CisgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGxvc3NsZXNzIGJpdHN0cmVhbSBzaWduYXR1cmUuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgZGF0YSArPSAxOworICBkYXRhX3NpemUgLT0gMTsKKyAgeworICAgIGludCB3aWR0aCwgaGVpZ2h0LCBoYXNfYWxwaGEsIHZlcnNpb247CisgICAgTExfR0VUX0JJVFMod2lkdGgsIDE0KTsKKyAgICBMTF9HRVRfQklUUyhoZWlnaHQsIDE0KTsKKyAgICBMTF9HRVRfQklUUyhoYXNfYWxwaGEsIDEpOworICAgIExMX0dFVF9CSVRTKHZlcnNpb24sIDMpOworICAgIHdpZHRoICs9IDE7CisgICAgaGVpZ2h0ICs9IDE7CisgICAgcHJpbnRmKCIgIFdpZHRoOiAgICAgICAgICAgICVkXG4iLCB3aWR0aCk7CisgICAgcHJpbnRmKCIgIEhlaWdodDogICAgICAgICAgICVkXG4iLCBoZWlnaHQpOworICAgIHByaW50ZigiICBBbHBoYTogICAgICAgICAgICAlZFxuIiwgaGFzX2FscGhhKTsKKyAgICBwcmludGYoIiAgVmVyc2lvbjogICAgICAgICAgJWRcbiIsIHZlcnNpb24pOworICB9CisgIHN0YXR1cyA9IFBhcnNlTG9zc2xlc3NUcmFuc2Zvcm0od2VicF9pbmZvLCBkYXRhLCBkYXRhX3NpemUsIGJpdF9wb3MpOworICBpZiAoc3RhdHVzICE9IFdFQlBfSU5GT19PSykgcmV0dXJuIHN0YXR1czsKKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFBhcnNlQWxwaGFIZWFkZXIoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIHNpemVfdCBkYXRhX3NpemUgPSBjaHVua19kYXRhLT5zaXplXyAtIENIVU5LX0hFQURFUl9TSVpFOworICBpZiAoZGF0YV9zaXplIDw9IEFMUEhBX0hFQURFUl9MRU4pIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBBTFBIIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgcHJpbnRmKCIgIFBhcnNpbmcgQUxQSCBjaHVuay4uLlxuIik7CisgIHsKKyAgICBjb25zdCBpbnQgY29tcHJlc3Npb25fbWV0aG9kID0gKGRhdGFbMF0gPj4gMCkgJiAweDAzOworICAgIGNvbnN0IGludCBmaWx0ZXIgPSAoZGF0YVswXSA+PiAyKSAmIDB4MDM7CisgICAgY29uc3QgaW50IHByZV9wcm9jZXNzaW5nID0gKGRhdGFbMF0gPj4gNCkgJiAweDAzOworICAgIGNvbnN0IGludCByZXNlcnZlZF9iaXRzID0gKGRhdGFbMF0gPj4gNikgJiAweDAzOworICAgIHByaW50ZigiICBDb21wcmVzc2lvbjogICAgICAlZFxuIiwgY29tcHJlc3Npb25fbWV0aG9kKTsKKyAgICBwcmludGYoIiAgRmlsdGVyOiAgICAgICAgICAgJXMgKCVkKVxuIiwKKyAgICAgICAgICAga0FscGhhRmlsdGVyTWV0aG9kc1tmaWx0ZXJdLCBmaWx0ZXIpOworICAgIHByaW50ZigiICBQcmUtcHJvY2Vzc2luZzogICAlZFxuIiwgcHJlX3Byb2Nlc3NpbmcpOworICAgIGlmIChjb21wcmVzc2lvbl9tZXRob2QgPiBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTikgeworICAgICAgTE9HX0VSUk9SKCJJbnZhbGlkIEFscGhhIGNvbXByZXNzaW9uIG1ldGhvZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fQklUU1RSRUFNX0VSUk9SOworICAgIH0KKyAgICBpZiAocHJlX3Byb2Nlc3NpbmcgPiBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTKSB7CisgICAgICBMT0dfRVJST1IoIkludmFsaWQgQWxwaGEgcHJlLXByb2Nlc3NpbmcgbWV0aG9kLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgICAgfQorICAgIGlmIChyZXNlcnZlZF9iaXRzICE9IDApIHsKKyAgICAgIExPR19XQVJOKCJSZXNlcnZlZCBiaXRzIGluIEFMUEggY2h1bmsgaGVhZGVyIGFyZSBub3QgYWxsIDAuIik7CisgICAgfQorICAgIGRhdGEgKz0gQUxQSEFfSEVBREVSX0xFTjsKKyAgICBkYXRhX3NpemUgLT0gQUxQSEFfSEVBREVSX0xFTjsKKyAgICBpZiAoY29tcHJlc3Npb25fbWV0aG9kID09IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKSB7CisgICAgICB1aW50NjRfdCBiaXRfcG9zID0gMDsKKyAgICAgIFdlYlBJbmZvU3RhdHVzIHN0YXR1cyA9CisgICAgICAgICAgUGFyc2VMb3NzbGVzc1RyYW5zZm9ybSh3ZWJwX2luZm8sIGRhdGEsIGRhdGFfc2l6ZSwgJmJpdF9wb3MpOworICAgICAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgICAgfQorICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayBwYXJzaW5nLgorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VSSUZGSGVhZGVyKGNvbnN0IFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CisgIGNvbnN0IHNpemVfdCBtaW5fc2l6ZSA9IFJJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRTsKKyAgc2l6ZV90IHJpZmZfc2l6ZTsKKworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgUklGRiBoZWFkZXIuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19UUlVOQ0FURURfREFUQTsKKyAgfQorICBpZiAobWVtY21wKEdldEJ1ZmZlcihtZW0pLCAiUklGRiIsIENIVU5LX1NJWkVfQllURVMpIHx8CisgICAgICBtZW1jbXAoR2V0QnVmZmVyKG1lbSkgKyBDSFVOS19IRUFERVJfU0laRSwgIldFQlAiLCBDSFVOS19TSVpFX0JZVEVTKSkgeworICAgIExPR19FUlJPUigiQ29ycnVwdGVkIFJJRkYgaGVhZGVyLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgcmlmZl9zaXplID0gR2V0TEUzMihHZXRCdWZmZXIobWVtKSArIFRBR19TSVpFKTsKKyAgaWYgKHJpZmZfc2l6ZSA8IENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJSSUZGIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKHJpZmZfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgTE9HX0VSUk9SKCJSSUZGIHNpemUgaXMgb3ZlciBsaW1pdC4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIHJpZmZfc2l6ZSArPSBDSFVOS19IRUFERVJfU0laRTsKKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIHByaW50ZigiUklGRiBIRUFERVI6XG4iKTsKKyAgICBwcmludGYoIiAgRmlsZSBzaXplOiAlNmRcbiIsIChpbnQpcmlmZl9zaXplKTsKKyAgfQorICBpZiAocmlmZl9zaXplIDwgbWVtLT5lbmRfKSB7CisgICAgTE9HX1dBUk4oIlJJRkYgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIGZpbGUgc2l6ZS4iKTsKKyAgICBtZW0tPmVuZF8gPSByaWZmX3NpemU7CisgIH0gZWxzZSBpZiAocmlmZl9zaXplID4gbWVtLT5lbmRfKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgUklGRiBwYXlsb2FkLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgU2tpcChtZW0sIFJJRkZfSEVBREVSX1NJWkUpOworICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUGFyc2VDaHVuayhjb25zdCBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtQnVmZmVyKiBjb25zdCBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEpIHsKKyAgbWVtc2V0KGNodW5rX2RhdGEsIDAsIHNpemVvZigqY2h1bmtfZGF0YSkpOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IENIVU5LX0hFQURFUl9TSVpFKSB7CisgICAgTE9HX0VSUk9SKCJUcnVuY2F0ZWQgZGF0YSBkZXRlY3RlZCB3aGVuIHBhcnNpbmcgY2h1bmsgaGVhZGVyLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0gZWxzZSB7CisgICAgY29uc3Qgc2l6ZV90IGNodW5rX3N0YXJ0X29mZnNldCA9IG1lbS0+c3RhcnRfOworICAgIGNvbnN0IHVpbnQzMl90IGZvdXJjYyA9IFJlYWRNZW1CdWZMRTMyKG1lbSk7CisgICAgY29uc3QgdWludDMyX3QgcGF5bG9hZF9zaXplID0gUmVhZE1lbUJ1ZkxFMzIobWVtKTsKKyAgICBjb25zdCB1aW50MzJfdCBwYXlsb2FkX3NpemVfcGFkZGVkID0gcGF5bG9hZF9zaXplICsgKHBheWxvYWRfc2l6ZSAmIDEpOworICAgIGNvbnN0IHNpemVfdCBjaHVua19zaXplID0gQ0hVTktfSEVBREVSX1NJWkUgKyBwYXlsb2FkX3NpemVfcGFkZGVkOworICAgIGludCBpOworICAgIGlmIChwYXlsb2FkX3NpemUgPiBNQVhfQ0hVTktfUEFZTE9BRCkgeworICAgICAgTE9HX0VSUk9SKCJTaXplIG9mIGNodW5rIHBheWxvYWQgaXMgb3ZlciBsaW1pdC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fSU5WQUxJRF9QQVJBTTsKKyAgICB9CisgICAgaWYgKHBheWxvYWRfc2l6ZV9wYWRkZWQgPiBNZW1EYXRhU2l6ZShtZW0pKXsKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIGNodW5rIHBheWxvYWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgQ0hVTktfVFlQRVM7ICsraSkgeworICAgICAgaWYgKCFtZW1jbXAoa1dlYlBDaHVua1RhZ3NbaV0sICZmb3VyY2MsIFRBR19TSVpFKSkgYnJlYWs7CisgICAgfQorICAgIGNodW5rX2RhdGEtPm9mZnNldF8gPSBjaHVua19zdGFydF9vZmZzZXQ7CisgICAgY2h1bmtfZGF0YS0+c2l6ZV8gPSBjaHVua19zaXplOworICAgIGNodW5rX2RhdGEtPmlkXyA9IChDaHVua0lEKWk7CisgICAgY2h1bmtfZGF0YS0+cGF5bG9hZF8gPSBHZXRCdWZmZXIobWVtKTsKKyAgICBpZiAoY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX0FOTUYpIHsKKyAgICAgIGlmIChwYXlsb2FkX3NpemUgIT0gcGF5bG9hZF9zaXplX3BhZGRlZCkgeworICAgICAgICBMT0dfRVJST1IoIkFOTUYgY2h1bmsgc2l6ZSBzaG91bGQgYWx3YXlzIGJlIGV2ZW4uIik7CisgICAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgICAvLyBUaGVyZSBhcmUgc3ViLWNodW5rcyB0byBiZSBwYXJzZWQgaW4gYW4gQU5NRiBjaHVuay4KKyAgICAgIFNraXAobWVtLCBBTk1GX0NIVU5LX1NJWkUpOworICAgIH0gZWxzZSB7CisgICAgICBTa2lwKG1lbSwgcGF5bG9hZF9zaXplX3BhZGRlZCk7CisgICAgfQorICAgIHJldHVybiBXRUJQX0lORk9fT0s7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIGFuYWx5c2lzLgorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc1ZQOFhDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhdIHx8CisgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4TF0gfHwKKyAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXSkgeworICAgIExPR19FUlJPUigiQWxyZWFkeSBzZWVuIGEgVlA4L1ZQOEwvVlA4WCBjaHVuayB3aGVuIHBhcnNpbmcgVlA4WCBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICB9CisgIGlmIChjaHVua19kYXRhLT5zaXplXyAhPSBWUDhYX0NIVU5LX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSkgeworICAgIExPR19FUlJPUigiQ29ycnVwdGVkIFZQOFggY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhYXTsKKyAgd2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyA9ICpkYXRhOworICBkYXRhICs9IDQ7CisgIHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyA9IDEgKyBSZWFkTEUyNCgmZGF0YSk7CisgIHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPSAxICsgUmVhZExFMjQoJmRhdGEpOworICBpZiAoIXdlYnBfaW5mby0+cXVpZXRfKSB7CisgICAgcHJpbnRmKCIgIElDQ1A6ICVkXG4gIEFscGhhOiAlZFxuICBFWElGOiAlZFxuICBYTVA6ICVkXG4gIEFuaW1hdGlvbjogJWRcbiIsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgSUNDUF9GTEFHKSAhPSAwLAorICAgICAgICAgICAod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEFMUEhBX0ZMQUcpICE9IDAsCisgICAgICAgICAgICh3ZWJwX2luZm8tPmZlYXR1cmVfZmxhZ3NfICYgRVhJRl9GTEFHKSAhPSAwLAorICAgICAgICAgICAod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIFhNUF9GTEFHKSAhPSAwLAorICAgICAgICAgICAod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKSAhPSAwKTsKKyAgICBwcmludGYoIiAgQ2FudmFzIHNpemUgJWQgeCAlZFxuIiwKKyAgICAgICAgICAgd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfLCB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfKTsKKyAgfQorICBpZiAod2VicF9pbmZvLT5jYW52YXNfd2lkdGhfID4gTUFYX0NBTlZBU19TSVpFKSB7CisgICAgTE9HX1dBUk4oIkNhbnZhcyB3aWR0aCBpcyBvdXQgb2YgcmFuZ2UgaW4gVlA4WCBjaHVuay4iKTsKKyAgfQorICBpZiAod2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA+IE1BWF9DQU5WQVNfU0laRSkgeworICAgIExPR19XQVJOKCJDYW52YXMgaGVpZ2h0IGlzIG91dCBvZiByYW5nZSBpbiBWUDhYIGNodW5rLiIpOworICB9CisgIGlmICgodWludDY0X3Qpd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfICogd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA+CisgICAgICBNQVhfSU1BR0VfQVJFQSkgeworICAgIExPR19XQVJOKCJDYW52YXMgYXJlYSBpcyBvdXQgb2YgcmFuZ2UgaW4gVlA4WCBjaHVuay4iKTsKKyAgfQorICByZXR1cm4gV0VCUF9JTkZPX09LOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgUHJvY2Vzc0FOSU1DaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBjaHVua19kYXRhLT5wYXlsb2FkXzsKKyAgaWYgKCF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICBMT0dfRVJST1IoIkFOSU0gY2h1bmsgZGV0ZWN0ZWQgYmVmb3JlIFZQOFggY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAoY2h1bmtfZGF0YS0+c2l6ZV8gIT0gQU5JTV9DSFVOS19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIkNvcnJ1cHRlZCBBTklNIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgd2VicF9pbmZvLT5iZ2NvbG9yXyA9IFJlYWRMRTMyKCZkYXRhKTsKKyAgd2VicF9pbmZvLT5sb29wX2NvdW50XyA9IFJlYWRMRTE2KCZkYXRhKTsKKyAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV07CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBwcmludGYoIiAgQmFja2dyb3VuZCBjb2xvcjooQVJHQikgJTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+Ymdjb2xvcl8gPj4gMjQpICYgMHhmZiwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+Ymdjb2xvcl8gPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgKHdlYnBfaW5mby0+Ymdjb2xvcl8gPj4gOCkgJiAweGZmLAorICAgICAgICAgICB3ZWJwX2luZm8tPmJnY29sb3JfICYgMHhmZik7CisgICAgcHJpbnRmKCIgIExvb3AgY291bnQgICAgICA6ICVkXG4iLCB3ZWJwX2luZm8tPmxvb3BfY291bnRfKTsKKyAgfQorICBpZiAod2VicF9pbmZvLT5sb29wX2NvdW50XyA+IE1BWF9MT09QX0NPVU5UKSB7CisgICAgTE9HX1dBUk4oIkxvb3AgY291bnQgaXMgb3V0IG9mIHJhbmdlIGluIEFOSU0gY2h1bmsuIik7CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NBTk1GQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF87CisgIGludCBvZmZzZXRfeCwgb2Zmc2V0X3ksIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uLCBibGVuZCwgZGlzcG9zZSwgdGVtcDsKKyAgaWYgKHdlYnBfaW5mby0+aXNfcHJvY2Vzc2luZ19hbmltX2ZyYW1lXykgeworICAgIExPR19FUlJPUigiQU5NRiBjaHVuayBkZXRlY3RlZCB3aXRoaW4gYW5vdGhlciBBTk1GIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgIH0KKyAgaWYgKCF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV0pIHsKKyAgICBMT0dfRVJST1IoIkFOTUYgY2h1bmsgZGV0ZWN0ZWQgYmVmb3JlIEFOSU0gY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAoY2h1bmtfZGF0YS0+c2l6ZV8gPD0gQ0hVTktfSEVBREVSX1NJWkUgKyBBTk1GX0NIVU5LX1NJWkUpIHsKKyAgICBMT0dfRVJST1IoIlRydW5jYXRlZCBkYXRhIGRldGVjdGVkIHdoZW4gcGFyc2luZyBBTk1GIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fVFJVTkNBVEVEX0RBVEE7CisgIH0KKyAgb2Zmc2V0X3ggPSAyICogUmVhZExFMjQoJmRhdGEpOworICBvZmZzZXRfeSA9IDIgKiBSZWFkTEUyNCgmZGF0YSk7CisgIHdpZHRoID0gMSArIFJlYWRMRTI0KCZkYXRhKTsKKyAgaGVpZ2h0ID0gMSArIFJlYWRMRTI0KCZkYXRhKTsKKyAgZHVyYXRpb24gPSBSZWFkTEUyNCgmZGF0YSk7CisgIHRlbXAgPSAqZGF0YTsKKyAgZGlzcG9zZSA9IHRlbXAgJiAxOworICBibGVuZCA9ICh0ZW1wID4+IDEpICYgMTsKKyAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5NRl07CisgIGlmICghd2VicF9pbmZvLT5xdWlldF8pIHsKKyAgICBwcmludGYoIiAgT2Zmc2V0X1g6ICVkXG4gIE9mZnNldF9ZOiAlZFxuICBXaWR0aDogJWRcbiAgSGVpZ2h0OiAlZFxuIgorICAgICAgICAgICAiICBEdXJhdGlvbjogJWRcbiAgRGlzcG9zZTogJWRcbiAgQmxlbmQ6ICVkXG4iLAorICAgICAgICAgICBvZmZzZXRfeCwgb2Zmc2V0X3ksIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uLCBkaXNwb3NlLCBibGVuZCk7CisgIH0KKyAgaWYgKGR1cmF0aW9uID4gTUFYX0RVUkFUSU9OKSB7CisgICAgTE9HX0VSUk9SKCJJbnZhbGlkIGR1cmF0aW9uIHBhcmFtZXRlciBpbiBBTk1GIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAob2Zmc2V0X3ggPiBNQVhfUE9TSVRJT05fT0ZGU0VUIHx8IG9mZnNldF95ID4gTUFYX1BPU0lUSU9OX09GRlNFVCkgeworICAgIExPR19FUlJPUigiSW52YWxpZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBBTk1GIGNodW5rLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAoKHVpbnQ2NF90KW9mZnNldF94ICsgd2lkdGggPiAodWludDY0X3Qpd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfIHx8CisgICAgICAodWludDY0X3Qpb2Zmc2V0X3kgKyBoZWlnaHQgPiAodWludDY0X3Qpd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XykgeworICAgIExPR19FUlJPUigiRnJhbWUgZXhjZWVkcyBjYW52YXMgaW4gQU5NRiBjaHVuay4iKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0lOVkFMSURfUEFSQU07CisgIH0KKyAgd2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfID0gMTsKKyAgd2VicF9pbmZvLT5zZWVuX2FscGhhX3N1YmNodW5rXyA9IDA7CisgIHdlYnBfaW5mby0+c2Vlbl9pbWFnZV9zdWJjaHVua18gPSAwOworICB3ZWJwX2luZm8tPmZyYW1lX3dpZHRoXyA9IHdpZHRoOworICB3ZWJwX2luZm8tPmZyYW1lX2hlaWdodF8gPSBoZWlnaHQ7CisgIHdlYnBfaW5mby0+YW5pbV9mcmFtZV9kYXRhX3NpemVfID0KKyAgICAgIGNodW5rX2RhdGEtPnNpemVfIC0gQ0hVTktfSEVBREVSX1NJWkUgLSBBTk1GX0NIVU5LX1NJWkU7CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzSW1hZ2VDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gY2h1bmtfZGF0YS0+cGF5bG9hZF8gLSBDSFVOS19IRUFERVJfU0laRTsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIGZlYXR1cmVzOworICBjb25zdCBWUDhTdGF0dXNDb2RlIHZwOF9zdGF0dXMgPQorICAgICAgV2ViUEdldEZlYXR1cmVzKGRhdGEsIGNodW5rX2RhdGEtPnNpemVfLCAmZmVhdHVyZXMpOworICBpZiAodnA4X3N0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgTE9HX0VSUk9SKCJWUDgvVlA4TCBiaXRzdHJlYW0gZXJyb3IuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19CSVRTVFJFQU1fRVJST1I7CisgIH0KKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIGFzc2VydChmZWF0dXJlcy5mb3JtYXQgPj0gMCAmJiBmZWF0dXJlcy5mb3JtYXQgPD0gMik7CisgICAgcHJpbnRmKCIgIFdpZHRoOiAlZFxuICBIZWlnaHQ6ICVkXG4gIEFscGhhOiAlZFxuICBBbmltYXRpb246ICVkXG4iCisgICAgICAgICAgICIgIEZvcm1hdDogJXMgKCVkKVxuIiwKKyAgICAgICAgICAgZmVhdHVyZXMud2lkdGgsIGZlYXR1cmVzLmhlaWdodCwgZmVhdHVyZXMuaGFzX2FscGhhLAorICAgICAgICAgICBmZWF0dXJlcy5oYXNfYW5pbWF0aW9uLCBrRm9ybWF0c1tmZWF0dXJlcy5mb3JtYXRdLCBmZWF0dXJlcy5mb3JtYXQpOworICB9CisgIGlmICh3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8pIHsKKyAgICArK3dlYnBfaW5mby0+YW5tZl9zdWJjaHVua19jb3VudHNfW2NodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19WUDggPyAwIDogMV07CisgICAgaWYgKGNodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19WUDhMICYmIHdlYnBfaW5mby0+c2Vlbl9hbHBoYV9zdWJjaHVua18pIHsKKyAgICAgIExPR19FUlJPUigiQm90aCBWUDhMIGFuZCBBTFBIIHN1Yi1jaHVua3MgYXJlIHByZXNlbnQgaW4gYW4gQU5NRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPmZyYW1lX3dpZHRoXyAhPSBmZWF0dXJlcy53aWR0aCB8fAorICAgICAgICB3ZWJwX2luZm8tPmZyYW1lX2hlaWdodF8gIT0gZmVhdHVyZXMuaGVpZ2h0KSB7CisgICAgICBMT0dfRVJST1IoIkZyYW1lIHNpemUgaW4gVlA4L1ZQOEwgc3ViLWNodW5rIGRpZmZlcnMgZnJvbSBBTk1GIGhlYWRlci4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPnNlZW5faW1hZ2Vfc3ViY2h1bmtfKSB7CisgICAgICBMT0dfRVJST1IoIkNvbnNlY3V0aXZlIFZQOC9WUDhMIHN1Yi1jaHVua3MgaW4gYW4gQU5NRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIHdlYnBfaW5mby0+c2Vlbl9pbWFnZV9zdWJjaHVua18gPSAxOworICB9IGVsc2UgeworICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4XSB8fAorICAgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4TF0pIHsKKyAgICAgIExPR19FUlJPUigiTXVsdGlwbGUgVlA4L1ZQOEwgY2h1bmtzIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKGNodW5rX2RhdGEtPmlkXyA9PSBDSFVOS19WUDhMICYmCisgICAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTFBIQV0pIHsKKyAgICAgIExPR19XQVJOKCJCb3RoIFZQOEwgYW5kIEFMUEggY2h1bmtzIGFyZSBkZXRlY3RlZC4iKTsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXSB8fAorICAgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5NRl0pIHsKKyAgICAgIExPR19FUlJPUigiVlA4L1ZQOEwgY2h1bmsgYW5kIEFOSU0vQU5NRiBjaHVuayBhcmUgYm90aCBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICAgIGlmICh3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gIT0gZmVhdHVyZXMud2lkdGggfHwKKyAgICAgICAgICB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfICE9IGZlYXR1cmVzLmhlaWdodCkgeworICAgICAgICBMT0dfRVJST1IoIkltYWdlIHNpemUgaW4gVlA4L1ZQOEwgY2h1bmsgZGlmZmVycyBmcm9tIFZQOFggY2h1bmsuIik7CisgICAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHdlYnBfaW5mby0+Y2FudmFzX3dpZHRoXyA9IGZlYXR1cmVzLndpZHRoOworICAgICAgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA9IGZlYXR1cmVzLmhlaWdodDsKKyAgICAgIGlmICh3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gPCAxIHx8IHdlYnBfaW5mby0+Y2FudmFzX2hlaWdodF8gPCAxIHx8CisgICAgICAgICAgd2VicF9pbmZvLT5jYW52YXNfd2lkdGhfID4gTUFYX0NBTlZBU19TSVpFIHx8CisgICAgICAgICAgd2VicF9pbmZvLT5jYW52YXNfaGVpZ2h0XyA+IE1BWF9DQU5WQVNfU0laRSB8fAorICAgICAgICAgICh1aW50NjRfdCl3ZWJwX2luZm8tPmNhbnZhc193aWR0aF8gKiB3ZWJwX2luZm8tPmNhbnZhc19oZWlnaHRfID4KKyAgICAgICAgICAgICAgTUFYX0lNQUdFX0FSRUEpIHsKKyAgICAgICAgTE9HX1dBUk4oIkludmFsaWQgcGFyYW1ldGVycyBpbiBWUDgvVlA4TCBjaHVuay4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bY2h1bmtfZGF0YS0+aWRfXTsKKyAgfQorICArK3dlYnBfaW5mby0+bnVtX2ZyYW1lc187CisgIHdlYnBfaW5mby0+aGFzX2FscGhhXyB8PSBmZWF0dXJlcy5oYXNfYWxwaGE7CisgIGlmICh3ZWJwX2luZm8tPnBhcnNlX2JpdHN0cmVhbV8pIHsKKyAgICBjb25zdCBpbnQgaXNfbG9zc3kgPSAoY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX1ZQOCk7CisgICAgY29uc3QgV2ViUEluZm9TdGF0dXMgc3RhdHVzID0KKyAgICAgICAgaXNfbG9zc3kgPyBQYXJzZUxvc3N5SGVhZGVyKGNodW5rX2RhdGEsIHdlYnBfaW5mbykKKyAgICAgICAgICAgICAgICAgOiBQYXJzZUxvc3NsZXNzSGVhZGVyKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgaWYgKHN0YXR1cyAhPSBXRUJQX0lORk9fT0spIHJldHVybiBzdGF0dXM7CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NBTFBIQ2h1bmsoY29uc3QgQ2h1bmtEYXRhKiBjb25zdCBjaHVua19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBpZiAod2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfKSB7CisgICAgKyt3ZWJwX2luZm8tPmFubWZfc3ViY2h1bmtfY291bnRzX1syXTsKKyAgICBpZiAod2VicF9pbmZvLT5zZWVuX2FscGhhX3N1YmNodW5rXykgeworICAgICAgTE9HX0VSUk9SKCJDb25zZWN1dGl2ZSBBTFBIIHN1Yi1jaHVua3MgaW4gYW4gQU5NRiBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIHdlYnBfaW5mby0+c2Vlbl9hbHBoYV9zdWJjaHVua18gPSAxOworCisgICAgaWYgKHdlYnBfaW5mby0+c2Vlbl9pbWFnZV9zdWJjaHVua18pIHsKKyAgICAgIExPR19FUlJPUigiQUxQSEEgc3ViLWNodW5rIGRldGVjdGVkIGFmdGVyIFZQOCBzdWItY2h1bmsgIgorICAgICAgICAgICAgICAgICJpbiBhbiBBTk1GIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTklNXSB8fAorICAgICAgICB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5NRl0pIHsKKyAgICAgIExPR19FUlJPUigiQUxQSEEgY2h1bmsgYW5kIEFOSU0vQU5NRiBjaHVuayBhcmUgYm90aCBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICghd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOFhdKSB7CisgICAgICBMT0dfRVJST1IoIkFMUEhBIGNodW5rIGRldGVjdGVkIGJlZm9yZSBWUDhYIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhdKSB7CisgICAgICBMT0dfRVJST1IoIkFMUEhBIGNodW5rIGRldGVjdGVkIGFmdGVyIFZQOCBjaHVuay4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQUxQSEFdKSB7CisgICAgICBMT0dfRVJST1IoIk11bHRpcGxlIEFMUEhBIGNodW5rcyBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgICsrd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FMUEhBXTsKKyAgfQorICB3ZWJwX2luZm8tPmhhc19hbHBoYV8gPSAxOworICBpZiAod2VicF9pbmZvLT5wYXJzZV9iaXRzdHJlYW1fKSB7CisgICAgY29uc3QgV2ViUEluZm9TdGF0dXMgc3RhdHVzID0gUGFyc2VBbHBoYUhlYWRlcihjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgIGlmIChzdGF0dXMgIT0gV0VCUF9JTkZPX09LKSByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiBXRUJQX0lORk9fT0s7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBQcm9jZXNzSUNDUENodW5rKGNvbnN0IENodW5rRGF0YSogY29uc3QgY2h1bmtfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgKHZvaWQpY2h1bmtfZGF0YTsKKyAgaWYgKCF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICBMT0dfRVJST1IoIklDQ1AgY2h1bmsgZGV0ZWN0ZWQgYmVmb3JlIFZQOFggY2h1bmsuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICBpZiAod2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX1ZQOF0gfHwKKyAgICAgIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19WUDhMXSB8fAorICAgICAgd2VicF9pbmZvLT5jaHVua19jb3VudHNfW0NIVU5LX0FOSU1dKSB7CisgICAgTE9HX0VSUk9SKCJJQ0NQIGNodW5rIGRldGVjdGVkIGFmdGVyIGltYWdlIGRhdGEuIik7CisgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgfQorICArK3dlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19JQ0NQXTsKKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIFdlYlBJbmZvU3RhdHVzIFByb2Nlc3NDaHVuayhjb25zdCBDaHVua0RhdGEqIGNvbnN0IGNodW5rX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBJbmZvKiBjb25zdCB3ZWJwX2luZm8pIHsKKyAgV2ViUEluZm9TdGF0dXMgc3RhdHVzID0gV0VCUF9JTkZPX09LOworICBDaHVua0lEIGlkID0gY2h1bmtfZGF0YS0+aWRfOworICBpZiAoY2h1bmtfZGF0YS0+aWRfID09IENIVU5LX1VOS05PV04pIHsKKyAgICBjaGFyIGVycm9yX21lc3NhZ2VbNTBdOworICAgIHNucHJpbnRmKGVycm9yX21lc3NhZ2UsIDUwLCAiVW5rbm93biBjaHVuayBhdCBvZmZzZXQgJTZkLCBsZW5ndGggJTZkIiwKKyAgICAgICAgICAgIChpbnQpY2h1bmtfZGF0YS0+b2Zmc2V0XywgKGludCljaHVua19kYXRhLT5zaXplXyk7CisgICAgTE9HX1dBUk4oZXJyb3JfbWVzc2FnZSk7CisgIH0gZWxzZSB7CisgICAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgICAgY29uc3QgY2hhciogdGFnID0ga1dlYlBDaHVua1RhZ3NbY2h1bmtfZGF0YS0+aWRfXTsKKyAgICAgIHByaW50ZigiQ2h1bmsgJWMlYyVjJWMgYXQgb2Zmc2V0ICU2ZCwgbGVuZ3RoICU2ZFxuIiwKKyAgICAgICAgICAgICB0YWdbMF0sIHRhZ1sxXSwgdGFnWzJdLCB0YWdbM10sIChpbnQpY2h1bmtfZGF0YS0+b2Zmc2V0XywKKyAgICAgICAgICAgICAoaW50KWNodW5rX2RhdGEtPnNpemVfKTsKKyAgICB9CisgIH0KKyAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQ0hVTktfVlA4OgorICAgIGNhc2UgQ0hVTktfVlA4TDoKKyAgICAgIHN0YXR1cyA9IFByb2Nlc3NJbWFnZUNodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX1ZQOFg6CisgICAgICBzdGF0dXMgPSBQcm9jZXNzVlA4WENodW5rKGNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENIVU5LX0FMUEhBOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc0FMUEhDaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19BTklNOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc0FOSU1DaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19BTk1GOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc0FOTUZDaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19JQ0NQOgorICAgICAgc3RhdHVzID0gUHJvY2Vzc0lDQ1BDaHVuayhjaHVua19kYXRhLCB3ZWJwX2luZm8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19FWElGOgorICAgIGNhc2UgQ0hVTktfWE1QOgorICAgICAgKyt3ZWJwX2luZm8tPmNodW5rX2NvdW50c19baWRdOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDSFVOS19VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorICBpZiAod2VicF9pbmZvLT5pc19wcm9jZXNzaW5nX2FuaW1fZnJhbWVfICYmIGlkICE9IENIVU5LX0FOTUYpIHsKKyAgICBpZiAod2VicF9pbmZvLT5hbmltX2ZyYW1lX2RhdGFfc2l6ZV8gPT0gY2h1bmtfZGF0YS0+c2l6ZV8pIHsKKyAgICAgIGlmICghd2VicF9pbmZvLT5zZWVuX2ltYWdlX3N1YmNodW5rXykgeworICAgICAgICBMT0dfRVJST1IoIk5vIFZQOC9WUDhMIGNodW5rIGRldGVjdGVkIGluIGFuIEFOTUYgY2h1bmsuIik7CisgICAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgICB9CisgICAgICB3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8gPSAwOworICAgIH0gZWxzZSBpZiAod2VicF9pbmZvLT5hbmltX2ZyYW1lX2RhdGFfc2l6ZV8gPiBjaHVua19kYXRhLT5zaXplXykgeworICAgICAgd2VicF9pbmZvLT5hbmltX2ZyYW1lX2RhdGFfc2l6ZV8gLT0gY2h1bmtfZGF0YS0+c2l6ZV87CisgICAgfSBlbHNlIHsKKyAgICAgIExPR19FUlJPUigiVHJ1bmNhdGVkIGRhdGEgZGV0ZWN0ZWQgd2hlbiBwYXJzaW5nIEFOTUYgY2h1bmsuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1RSVU5DQVRFRF9EQVRBOworICAgIH0KKyAgfQorICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgV2ViUEluZm9TdGF0dXMgVmFsaWRhdGUoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBpZiAod2VicF9pbmZvLT5udW1fZnJhbWVzXyA8IDEpIHsKKyAgICBMT0dfRVJST1IoIk5vIGltYWdlL2ZyYW1lIGRldGVjdGVkLiIpOworICAgIHJldHVybiBXRUJQX0lORk9fTUlTU0lOR19EQVRBOworICB9CisgIGlmICh3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfVlA4WF0pIHsKKyAgICBjb25zdCBpbnQgaWNjcCA9ICEhKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBJQ0NQX0ZMQUcpOworICAgIGNvbnN0IGludCBleGlmID0gISEod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEVYSUZfRkxBRyk7CisgICAgY29uc3QgaW50IHhtcCA9ICEhKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBYTVBfRkxBRyk7CisgICAgY29uc3QgaW50IGFuaW1hdGlvbiA9ICEhKHdlYnBfaW5mby0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CisgICAgY29uc3QgaW50IGFscGhhID0gISEod2VicF9pbmZvLT5mZWF0dXJlX2ZsYWdzXyAmIEFMUEhBX0ZMQUcpOworICAgIGlmICghYWxwaGEgJiYgd2VicF9pbmZvLT5oYXNfYWxwaGFfKSB7CisgICAgICBMT0dfRVJST1IoIlVuZXhwZWN0ZWQgYWxwaGEgZGF0YSBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmIChhbHBoYSAmJiAhd2VicF9pbmZvLT5oYXNfYWxwaGFfKSB7CisgICAgICBMT0dfV0FSTigiQWxwaGEgZmxhZyBpcyBzZXQgd2l0aCBubyBhbHBoYSBkYXRhIHByZXNlbnQuIik7CisgICAgfQorICAgIGlmIChpY2NwICYmICF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfSUNDUF0pIHsKKyAgICAgIExPR19FUlJPUigiTWlzc2luZyBJQ0NQIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19NSVNTSU5HX0RBVEE7CisgICAgfQorICAgIGlmIChleGlmICYmICF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfRVhJRl0pIHsKKyAgICAgIExPR19FUlJPUigiTWlzc2luZyBFWElGIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19NSVNTSU5HX0RBVEE7CisgICAgfQorICAgIGlmICh4bXAgJiYgIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19YTVBdKSB7CisgICAgICBMT0dfRVJST1IoIk1pc3NpbmcgWE1QIGNodW5rLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19NSVNTSU5HX0RBVEE7CisgICAgfQorICAgIGlmICghaWNjcCAmJiB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfSUNDUF0pIHsKKyAgICAgIExPR19FUlJPUigiVW5leHBlY3RlZCBJQ0NQIGNodW5rIGRldGVjdGVkLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgICAgaWYgKCFleGlmICYmIHdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19FWElGXSkgeworICAgICAgTE9HX0VSUk9SKCJVbmV4cGVjdGVkIEVYSUYgY2h1bmsgZGV0ZWN0ZWQuIik7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX1BBUlNFX0VSUk9SOworICAgIH0KKyAgICBpZiAoIXhtcCAmJiB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfWE1QXSkgeworICAgICAgTE9HX0VSUk9SKCJVbmV4cGVjdGVkIFhNUCBjaHVuayBkZXRlY3RlZC4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIC8vIEluY29tcGxldGUgYW5pbWF0aW9uIGZyYW1lLgorICAgIGlmICh3ZWJwX2luZm8tPmlzX3Byb2Nlc3NpbmdfYW5pbV9mcmFtZV8pIHJldHVybiBXRUJQX0lORk9fTUlTU0lOR19EQVRBOworICAgIGlmICghYW5pbWF0aW9uICYmIHdlYnBfaW5mby0+bnVtX2ZyYW1lc18gPiAxKSB7CisgICAgICBMT0dfRVJST1IoIk1vcmUgdGhhbiAxIGZyYW1lIGRldGVjdGVkIGluIG5vbi1hbmltYXRpb24gZmlsZS4iKTsKKyAgICAgIHJldHVybiBXRUJQX0lORk9fUEFSU0VfRVJST1I7CisgICAgfQorICAgIGlmIChhbmltYXRpb24gJiYgKCF3ZWJwX2luZm8tPmNodW5rX2NvdW50c19bQ0hVTktfQU5JTV0gfHwKKyAgICAgICAgIXdlYnBfaW5mby0+Y2h1bmtfY291bnRzX1tDSFVOS19BTk1GXSkpIHsKKyAgICAgIExPR19FUlJPUigiTm8gQU5JTS9BTk1GIGNodW5rIGRldGVjdGVkIGluIGFuaW1hdGlvbiBmaWxlLiIpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19QQVJTRV9FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFdFQlBfSU5GT19PSzsKK30KKworc3RhdGljIHZvaWQgU2hvd1N1bW1hcnkoY29uc3QgV2ViUEluZm8qIGNvbnN0IHdlYnBfaW5mbykgeworICBpbnQgaTsKKyAgcHJpbnRmKCJTdW1tYXJ5OlxuIik7CisgIHByaW50ZigiTnVtYmVyIG9mIGZyYW1lczogJWRcbiIsIHdlYnBfaW5mby0+bnVtX2ZyYW1lc18pOworICBwcmludGYoIkNodW5rIHR5cGUgIDogIFZQOCBWUDhMIFZQOFggQUxQSCBBTklNIEFOTUYoVlA4IC9WUDhML0FMUEgpIElDQ1AgIgorICAgICAgIkVYSUYgIFhNUFxuIik7CisgIHByaW50ZigiQ2h1bmsgY291bnRzOiAiKTsKKyAgZm9yIChpID0gMDsgaSA8IENIVU5LX1RZUEVTOyArK2kpIHsKKyAgICBwcmludGYoIiU0ZCAiLCB3ZWJwX2luZm8tPmNodW5rX2NvdW50c19baV0pOworICAgIGlmIChpID09IENIVU5LX0FOTUYpIHsKKyAgICAgIHByaW50ZigiJTRkICU0ZCAlNGQgICIsCisgICAgICAgICAgICAgd2VicF9pbmZvLT5hbm1mX3N1YmNodW5rX2NvdW50c19bMF0sCisgICAgICAgICAgICAgd2VicF9pbmZvLT5hbm1mX3N1YmNodW5rX2NvdW50c19bMV0sCisgICAgICAgICAgICAgd2VicF9pbmZvLT5hbm1mX3N1YmNodW5rX2NvdW50c19bMl0pOworICAgIH0KKyAgfQorICBwcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyBXZWJQSW5mb1N0YXR1cyBBbmFseXplV2ViUChXZWJQSW5mbyogY29uc3Qgd2VicF9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEYXRhKiB3ZWJwX2RhdGEpIHsKKyAgQ2h1bmtEYXRhIGNodW5rX2RhdGE7CisgIE1lbUJ1ZmZlciBtZW1fYnVmZmVyOworICBXZWJQSW5mb1N0YXR1cyB3ZWJwX2luZm9fc3RhdHVzID0gV0VCUF9JTkZPX09LOworCisgIEluaXRNZW1CdWZmZXIoJm1lbV9idWZmZXIsIHdlYnBfZGF0YSk7CisgIHdlYnBfaW5mb19zdGF0dXMgPSBQYXJzZVJJRkZIZWFkZXIod2VicF9pbmZvLCAmbWVtX2J1ZmZlcik7CisgIGlmICh3ZWJwX2luZm9fc3RhdHVzICE9IFdFQlBfSU5GT19PSykgZ290byBFcnJvcjsKKworICAvLyAgTG9vcCB0aHJvdWdoIGFsbCB0aGUgY2h1bmtzLiBUZXJtaW5hdGUgaW1tZWRpYXRlbHkgaW4gY2FzZSBvZiBlcnJvci4KKyAgd2hpbGUgKHdlYnBfaW5mb19zdGF0dXMgPT0gV0VCUF9JTkZPX09LICYmIE1lbURhdGFTaXplKCZtZW1fYnVmZmVyKSA+IDApIHsKKyAgICB3ZWJwX2luZm9fc3RhdHVzID0gUGFyc2VDaHVuayh3ZWJwX2luZm8sICZtZW1fYnVmZmVyLCAmY2h1bmtfZGF0YSk7CisgICAgaWYgKHdlYnBfaW5mb19zdGF0dXMgIT0gV0VCUF9JTkZPX09LKSBnb3RvIEVycm9yOworICAgIHdlYnBfaW5mb19zdGF0dXMgPSBQcm9jZXNzQ2h1bmsoJmNodW5rX2RhdGEsIHdlYnBfaW5mbyk7CisgIH0KKyAgaWYgKHdlYnBfaW5mb19zdGF0dXMgIT0gV0VCUF9JTkZPX09LKSBnb3RvIEVycm9yOworICBpZiAod2VicF9pbmZvLT5zaG93X3N1bW1hcnlfKSBTaG93U3VtbWFyeSh3ZWJwX2luZm8pOworCisgIC8vICBGaW5hbCBjaGVjay4KKyAgd2VicF9pbmZvX3N0YXR1cyA9IFZhbGlkYXRlKHdlYnBfaW5mbyk7CisKKyBFcnJvcjoKKyAgaWYgKCF3ZWJwX2luZm8tPnF1aWV0XykgeworICAgIGlmICh3ZWJwX2luZm9fc3RhdHVzID09IFdFQlBfSU5GT19PSykgeworICAgICAgcHJpbnRmKCJObyBlcnJvciBkZXRlY3RlZC5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIkVycm9ycyBkZXRlY3RlZC5cbiIpOworICAgIH0KKyAgfQorICByZXR1cm4gd2VicF9pbmZvX3N0YXR1czsKK30KKworc3RhdGljIHZvaWQgSGVscFNob3J0KHZvaWQpIHsKKyAgcHJpbnRmKCJVc2FnZTogd2VicGluZm8gW29wdGlvbnNdIGluX2ZpbGVzXG4iCisgICAgICAgICAiVHJ5IC1sb25naGVscCBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0IG9mIG9wdGlvbnMuXG4iKTsKK30KKworc3RhdGljIHZvaWQgSGVscExvbmcodm9pZCkgeworICBwcmludGYoIlVzYWdlOiB3ZWJwaW5mbyBbb3B0aW9uc10gaW5fZmlsZXNcbiIKKyAgICAgICAgICJOb3RlOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbnB1dCBmaWxlcztcbiIKKyAgICAgICAgICIgICAgICBvcHRpb25zIG11c3QgY29tZSBiZWZvcmUgaW5wdXQgZmlsZXMuXG4iCisgICAgICAgICAiT3B0aW9uczpcbiIKKyAgICAgICAgICIgIC12ZXJzaW9uIC4uLi4uLi4uLi4uIFByaW50IHZlcnNpb24gbnVtYmVyIGFuZCBleGl0LlxuIgorICAgICAgICAgIiAgLXF1aWV0IC4uLi4uLi4uLi4uLi4gRG8gbm90IHNob3cgY2h1bmsgcGFyc2luZyBpbmZvcm1hdGlvbi5cbiIKKyAgICAgICAgICIgIC1kaWFnIC4uLi4uLi4uLi4uLi4uIFNob3cgcGFyc2luZyBlcnJvciBkaWFnbm9zaXMuXG4iCisgICAgICAgICAiICAtc3VtbWFyeSAuLi4uLi4uLi4uLiBTaG93IGNodW5rIHN0YXRzIHN1bW1hcnkuXG4iCisgICAgICAgICAiICAtYml0c3RyZWFtX2luZm8gLi4uLiBQYXJzZSBiaXRzdHJlYW0gaGVhZGVyLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBhcmd2W10pIHsKKyAgaW50IGMsIHF1aWV0ID0gMCwgc2hvd19kaWFnID0gMCwgc2hvd19zdW1tYXJ5ID0gMDsKKyAgaW50IHBhcnNlX2JpdHN0cmVhbSA9IDA7CisgIFdlYlBJbmZvU3RhdHVzIHdlYnBfaW5mb19zdGF0dXMgPSBXRUJQX0lORk9fT0s7CisgIFdlYlBJbmZvIHdlYnBfaW5mbzsKKworICBpZiAoYXJnYyA9PSAxKSB7CisgICAgSGVscFNob3J0KCk7CisgICAgcmV0dXJuIFdFQlBfSU5GT19PSzsKKyAgfQorCisgIC8vIFBhcnNlIGNvbW1hbmQtbGluZSBpbnB1dC4KKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItaCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oZWxwIikpIHsKKyAgICAgIEhlbHBTaG9ydCgpOworICAgICAgcmV0dXJuIFdFQlBfSU5GT19PSzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1IIikgfHwgIXN0cmNtcChhcmd2W2NdLCAiLWxvbmdoZWxwIikpIHsKKyAgICAgIEhlbHBMb25nKCk7CisgICAgICByZXR1cm4gV0VCUF9JTkZPX09LOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXF1aWV0IikpIHsKKyAgICAgIHF1aWV0ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1kaWFnIikpIHsKKyAgICAgIHNob3dfZGlhZyA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItc3VtbWFyeSIpKSB7CisgICAgICBzaG93X3N1bW1hcnkgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWJpdHN0cmVhbV9pbmZvIikpIHsKKyAgICAgIHBhcnNlX2JpdHN0cmVhbSA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItdmVyc2lvbiIpKSB7CisgICAgICBjb25zdCBpbnQgdmVyc2lvbiA9IFdlYlBHZXREZWNvZGVyVmVyc2lvbigpOworICAgICAgcHJpbnRmKCJXZWJQIERlY29kZXIgdmVyc2lvbjogJWQuJWQuJWRcbiIsCisgICAgICAgICAgICAgKHZlcnNpb24gPj4gMTYpICYgMHhmZiwgKHZlcnNpb24gPj4gOCkgJiAweGZmLCB2ZXJzaW9uICYgMHhmZik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeyAgLy8gQXNzdW1lIHRoZSByZW1haW5pbmcgYXJlIGFsbCBpbnB1dCBmaWxlcy4KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChjID09IGFyZ2MpIHsKKyAgICBIZWxwU2hvcnQoKTsKKyAgICByZXR1cm4gV0VCUF9JTkZPX0lOVkFMSURfQ09NTUFORDsKKyAgfQorCisgIC8vIFByb2Nlc3MgaW5wdXQgZmlsZXMgb25lIGJ5IG9uZS4KKyAgZm9yICg7IGMgPCBhcmdjOyArK2MpIHsKKyAgICBXZWJQRGF0YSB3ZWJwX2RhdGE7CisgICAgY29uc3QgY2hhciogaW5fZmlsZSA9IE5VTEw7CisgICAgV2ViUEluZm9Jbml0KCZ3ZWJwX2luZm8pOworICAgIHdlYnBfaW5mby5xdWlldF8gPSBxdWlldDsKKyAgICB3ZWJwX2luZm8uc2hvd19kaWFnbm9zaXNfID0gc2hvd19kaWFnOworICAgIHdlYnBfaW5mby5zaG93X3N1bW1hcnlfID0gc2hvd19zdW1tYXJ5OworICAgIHdlYnBfaW5mby5wYXJzZV9iaXRzdHJlYW1fID0gcGFyc2VfYml0c3RyZWFtOworICAgIGluX2ZpbGUgPSBhcmd2W2NdOworICAgIGlmIChpbl9maWxlID09IE5VTEwgfHwgIVJlYWRGaWxlVG9XZWJQRGF0YShpbl9maWxlLCAmd2VicF9kYXRhKSkgeworICAgICAgd2VicF9pbmZvX3N0YXR1cyA9IFdFQlBfSU5GT19JTlZBTElEX0NPTU1BTkQ7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBvcGVuIGlucHV0IGZpbGUgJXMuXG4iLCBpbl9maWxlKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIXdlYnBfaW5mby5xdWlldF8pIHByaW50ZigiRmlsZTogJXNcbiIsIGluX2ZpbGUpOworICAgIHdlYnBfaW5mb19zdGF0dXMgPSBBbmFseXplV2ViUCgmd2VicF9pbmZvLCAmd2VicF9kYXRhKTsKKyAgICBXZWJQRGF0YUNsZWFyKCZ3ZWJwX2RhdGEpOworICB9CisgIHJldHVybiB3ZWJwX2luZm9fc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicG11eC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXhhbXBsZXMvd2VicG11eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZThkMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leGFtcGxlcy93ZWJwbXV4LmMKQEAgLTAsMCArMSwxMTQ4IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFNpbXBsZSBjb21tYW5kLWxpbmUgdG8gY3JlYXRlIGEgV2ViUCBjb250YWluZXIgZmlsZSBhbmQgdG8gZXh0cmFjdCBvciBzdHJpcAorLy8gIHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgY29udGFpbmVyIGZpbGUuCisvLworLy8gQXV0aG9yczogVmlrYXMgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pLAorLy8gICAgICAgICAgVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworLyogIFVzYWdlIGV4YW1wbGVzOgorCisgIENyZWF0ZSBjb250YWluZXIgV2ViUCBmaWxlOgorICAgIHdlYnBtdXggLWZyYW1lIGFuaW1fMS53ZWJwICsxMDArMTArMTAgICBcCisgICAgICAgICAgICAtZnJhbWUgYW5pbV8yLndlYnAgKzEwMCsyNSsyNSsxIFwKKyAgICAgICAgICAgIC1mcmFtZSBhbmltXzMud2VicCArMTAwKzUwKzUwKzEgXAorICAgICAgICAgICAgLWZyYW1lIGFuaW1fNC53ZWJwICsxMDAgICAgICAgICBcCisgICAgICAgICAgICAtbG9vcCAxMCAtYmdjb2xvciAxMjgsMjU1LDI1NSwyNTUgXAorICAgICAgICAgICAgLW8gb3V0X2FuaW1hdGlvbl9jb250YWluZXIud2VicAorCisgICAgd2VicG11eCAtc2V0IGljYyBpbWFnZV9wcm9maWxlLmljYyBpbi53ZWJwIC1vIG91dF9pY2NfY29udGFpbmVyLndlYnAKKyAgICB3ZWJwbXV4IC1zZXQgZXhpZiBpbWFnZV9tZXRhZGF0YS5leGlmIGluLndlYnAgLW8gb3V0X2V4aWZfY29udGFpbmVyLndlYnAKKyAgICB3ZWJwbXV4IC1zZXQgeG1wIGltYWdlX21ldGFkYXRhLnhtcCBpbi53ZWJwIC1vIG91dF94bXBfY29udGFpbmVyLndlYnAKKworICBFeHRyYWN0IHJlbGV2YW50IGRhdGEgZnJvbSBXZWJQIGNvbnRhaW5lciBmaWxlOgorICAgIHdlYnBtdXggLWdldCBmcmFtZSBuIGluLndlYnAgLW8gb3V0X2ZyYW1lLndlYnAKKyAgICB3ZWJwbXV4IC1nZXQgaWNjIGluLndlYnAgLW8gaW1hZ2VfcHJvZmlsZS5pY2MKKyAgICB3ZWJwbXV4IC1nZXQgZXhpZiBpbi53ZWJwIC1vIGltYWdlX21ldGFkYXRhLmV4aWYKKyAgICB3ZWJwbXV4IC1nZXQgeG1wIGluLndlYnAgLW8gaW1hZ2VfbWV0YWRhdGEueG1wCisKKyAgU3RyaXAgZGF0YSBmcm9tIFdlYlAgQ29udGFpbmVyIGZpbGU6CisgICAgd2VicG11eCAtc3RyaXAgaWNjIGluLndlYnAgLW8gb3V0LndlYnAKKyAgICB3ZWJwbXV4IC1zdHJpcCBleGlmIGluLndlYnAgLW8gb3V0LndlYnAKKyAgICB3ZWJwbXV4IC1zdHJpcCB4bXAgaW4ud2VicCAtbyBvdXQud2VicAorCisgIENoYW5nZSBkdXJhdGlvbiBvZiBmcmFtZSBpbnRlcnZhbHM6CisgICAgd2VicG11eCAtZHVyYXRpb24gMTUwIGluLndlYnAgLW8gb3V0LndlYnAKKyAgICB3ZWJwbXV4IC1kdXJhdGlvbiAzMywyIGluLndlYnAgLW8gb3V0LndlYnAKKyAgICB3ZWJwbXV4IC1kdXJhdGlvbiAyMDAsMTAsMCAtZHVyYXRpb24gMTUwLDYsNTAgaW4ud2VicCAtbyBvdXQud2VicAorCisgIE1pc2M6CisgICAgd2VicG11eCAtaW5mbyBpbi53ZWJwCisgICAgd2VicG11eCBbIC1oIHwgLWhlbHAgXQorICAgIHdlYnBtdXggLXZlcnNpb24KKyAgICB3ZWJwbXV4IGFyZ3VtZW50X2ZpbGVfbmFtZQorKi8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAid2VicC9tdXguaCIKKyNpbmNsdWRlICIuLi9leGFtcGxlcy9leGFtcGxlX3V0aWwuaCIKKyNpbmNsdWRlICIuLi9pbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29uZmlnIG9iamVjdCB0byBwYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorCit0eXBlZGVmIGVudW0geworICBOSUxfQUNUSU9OID0gMCwKKyAgQUNUSU9OX0dFVCwKKyAgQUNUSU9OX1NFVCwKKyAgQUNUSU9OX1NUUklQLAorICBBQ1RJT05fSU5GTywKKyAgQUNUSU9OX0hFTFAsCisgIEFDVElPTl9EVVJBVElPTgorfSBBY3Rpb25UeXBlOworCit0eXBlZGVmIGVudW0geworICBOSUxfU1VCVFlQRSA9IDAsCisgIFNVQlRZUEVfQU5NRiwKKyAgU1VCVFlQRV9MT09QLAorICBTVUJUWVBFX0JHQ09MT1IKK30gRmVhdHVyZVN1YlR5cGU7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgRmVhdHVyZVN1YlR5cGUgc3VidHlwZV87CisgIGNvbnN0IGNoYXIqIGZpbGVuYW1lXzsKKyAgY29uc3QgY2hhciogcGFyYW1zXzsKK30gRmVhdHVyZUFyZzsKKwordHlwZWRlZiBlbnVtIHsKKyAgTklMX0ZFQVRVUkUgPSAwLAorICBGRUFUVVJFX0VYSUYsCisgIEZFQVRVUkVfWE1QLAorICBGRUFUVVJFX0lDQ1AsCisgIEZFQVRVUkVfQU5NRiwKKyAgRkVBVFVSRV9EVVJBVElPTiwKKyAgTEFTVF9GRUFUVVJFCit9IEZlYXR1cmVUeXBlOworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0ZvdXJjY0xpc3RbTEFTVF9GRUFUVVJFXSA9IHsKKyAgTlVMTCwgIkVYSUYiLCAiWE1QICIsICJJQ0NQIiwgIkFOTUYiCit9OworCitzdGF0aWMgY29uc3QgY2hhciogY29uc3Qga0Rlc2NyaXB0aW9uc1tMQVNUX0ZFQVRVUkVdID0geworICBOVUxMLCAiRVhJRiBtZXRhZGF0YSIsICJYTVAgbWV0YWRhdGEiLCAiSUNDIHByb2ZpbGUiLAorICAiQW5pbWF0aW9uIGZyYW1lIgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBDb21tYW5kTGluZUFyZ3VtZW50cyBjbWRfYXJnc187CisKKyAgQWN0aW9uVHlwZSBhY3Rpb25fdHlwZV87CisgIGNvbnN0IGNoYXIqIGlucHV0XzsKKyAgY29uc3QgY2hhciogb3V0cHV0XzsKKyAgRmVhdHVyZVR5cGUgdHlwZV87CisgIEZlYXR1cmVBcmcqIGFyZ3NfOworICBpbnQgYXJnX2NvdW50XzsKK30gQ29uZmlnOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucy4KKworc3RhdGljIGludCBDb3VudE9jY3VycmVuY2VzKGNvbnN0IENvbW1hbmRMaW5lQXJndW1lbnRzKiBjb25zdCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0IGFyZykgeworICBpbnQgaTsKKyAgaW50IG51bV9vY2N1cmVuY2VzID0gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgYXJncy0+YXJnY187ICsraSkgeworICAgIGlmICghc3RyY21wKGFyZ3MtPmFyZ3ZfW2ldLCBhcmcpKSB7CisgICAgICArK251bV9vY2N1cmVuY2VzOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX29jY3VyZW5jZXM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBrRXJyb3JNZXNzYWdlc1stV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBICsgMV0gPSB7CisgICJXRUJQX01VWF9OT1RfRk9VTkQiLCAiV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCIsICJXRUJQX01VWF9CQURfREFUQSIsCisgICJXRUJQX01VWF9NRU1PUllfRVJST1IiLCAiV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIEVycm9yU3RyaW5nKFdlYlBNdXhFcnJvciBlcnIpIHsKKyAgYXNzZXJ0KGVyciA8PSBXRUJQX01VWF9OT1RfRk9VTkQgJiYgZXJyID49IFdFQlBfTVVYX05PVF9FTk9VR0hfREFUQSk7CisgIHJldHVybiBrRXJyb3JNZXNzYWdlc1stZXJyXTsKK30KKworI2RlZmluZSBSRVRVUk5fSUZfRVJST1IoRVJSX01TRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBFUlJfTVNHKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgUkVUVVJOX0lGX0VSUk9SMyhFUlJfTVNHLCBGT1JNQVRfU1RSMSwgRk9STUFUX1NUUjIpICAgICAgICAgIFwKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRVJSX01TRywgRk9STUFUX1NUUjEsIEZPUk1BVF9TVFIyKTsgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIEVSUk9SX0dPVE8xKEVSUl9NU0csIExBQkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsIEVSUl9NU0cpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2sgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ290byBMQUJFTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNkZWZpbmUgRVJST1JfR09UTzIoRVJSX01TRywgRk9STUFUX1NUUiwgTEFCRUwpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgRVJSX01TRywgRk9STUFUX1NUUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnb3RvIExBQkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFUlJPUl9HT1RPMyhFUlJfTVNHLCBGT1JNQVRfU1RSMSwgRk9STUFUX1NUUjIsIExBQkVMKSAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCBFUlJfTVNHLCBGT1JNQVRfU1RSMSwgRk9STUFUX1NUUjIpOyAgICAgICAgICAgICAgXAorICAgIG9rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGdvdG8gTEFCRUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV2ViUE11eEVycm9yIERpc3BsYXlJbmZvKGNvbnN0IFdlYlBNdXgqIG11eCkgeworICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgdWludDMyX3QgZmxhZzsKKworICBXZWJQTXV4RXJyb3IgZXJyID0gV2ViUE11eEdldENhbnZhc1NpemUobXV4LCAmd2lkdGgsICZoZWlnaHQpOworICBhc3NlcnQoZXJyID09IFdFQlBfTVVYX09LKTsgIC8vIEFzIFdlYlBNdXhDcmVhdGUoKSB3YXMgc3VjY2Vzc2Z1bCBlYXJsaWVyLgorICBwcmludGYoIkNhbnZhcyBzaXplOiAlZCB4ICVkXG4iLCB3aWR0aCwgaGVpZ2h0KTsKKworICBlcnIgPSBXZWJQTXV4R2V0RmVhdHVyZXMobXV4LCAmZmxhZyk7CisgIFJFVFVSTl9JRl9FUlJPUigiRmFpbGVkIHRvIHJldHJpZXZlIGZlYXR1cmVzXG4iKTsKKworICBpZiAoZmxhZyA9PSAwKSB7CisgICAgcHJpbnRmKCJObyBmZWF0dXJlcyBwcmVzZW50LlxuIik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorCisgIC8vIFByaW50IHRoZSBmZWF0dXJlcyBwcmVzZW50LgorICBwcmludGYoIkZlYXR1cmVzIHByZXNlbnQ6Iik7CisgIGlmIChmbGFnICYgQU5JTUFUSU9OX0ZMQUcpIHByaW50ZigiIGFuaW1hdGlvbiIpOworICBpZiAoZmxhZyAmIElDQ1BfRkxBRykgICAgICBwcmludGYoIiBJQ0MgcHJvZmlsZSIpOworICBpZiAoZmxhZyAmIEVYSUZfRkxBRykgICAgICBwcmludGYoIiBFWElGIG1ldGFkYXRhIik7CisgIGlmIChmbGFnICYgWE1QX0ZMQUcpICAgICAgIHByaW50ZigiIFhNUCBtZXRhZGF0YSIpOworICBpZiAoZmxhZyAmIEFMUEhBX0ZMQUcpICAgICBwcmludGYoIiB0cmFuc3BhcmVuY3kiKTsKKyAgcHJpbnRmKCJcbiIpOworCisgIGlmIChmbGFnICYgQU5JTUFUSU9OX0ZMQUcpIHsKKyAgICBjb25zdCBXZWJQQ2h1bmtJZCBpZCA9IFdFQlBfQ0hVTktfQU5NRjsKKyAgICBjb25zdCBjaGFyKiBjb25zdCB0eXBlX3N0ciA9ICJmcmFtZSI7CisgICAgaW50IG5GcmFtZXM7CisKKyAgICBXZWJQTXV4QW5pbVBhcmFtcyBwYXJhbXM7CisgICAgZXJyID0gV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcyhtdXgsICZwYXJhbXMpOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOworICAgIHByaW50ZigiQmFja2dyb3VuZCBjb2xvciA6IDB4JS44WCAgTG9vcCBDb3VudCA6ICVkXG4iLAorICAgICAgICAgICBwYXJhbXMuYmdjb2xvciwgcGFyYW1zLmxvb3BfY291bnQpOworCisgICAgZXJyID0gV2ViUE11eE51bUNodW5rcyhtdXgsIGlkLCAmbkZyYW1lcyk7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7CisKKyAgICBwcmludGYoIk51bWJlciBvZiAlc3M6ICVkXG4iLCB0eXBlX3N0ciwgbkZyYW1lcyk7CisgICAgaWYgKG5GcmFtZXMgPiAwKSB7CisgICAgICBpbnQgaTsKKyAgICAgIHByaW50ZigiTm8uOiB3aWR0aCBoZWlnaHQgYWxwaGEgeF9vZmZzZXQgeV9vZmZzZXQgIik7CisgICAgICBwcmludGYoImR1cmF0aW9uICAgZGlzcG9zZSBibGVuZCAiKTsKKyAgICAgIHByaW50ZigiaW1hZ2Vfc2l6ZSAgY29tcHJlc3Npb25cbiIpOworICAgICAgZm9yIChpID0gMTsgaSA8PSBuRnJhbWVzOyBpKyspIHsKKyAgICAgICAgV2ViUE11eEZyYW1lSW5mbyBmcmFtZTsKKyAgICAgICAgZXJyID0gV2ViUE11eEdldEZyYW1lKG11eCwgaSwgJmZyYW1lKTsKKyAgICAgICAgaWYgKGVyciA9PSBXRUJQX01VWF9PSykgeworICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgICAgICAgICBjb25zdCBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFdlYlBHZXRGZWF0dXJlcygKKyAgICAgICAgICAgICAgZnJhbWUuYml0c3RyZWFtLmJ5dGVzLCBmcmFtZS5iaXRzdHJlYW0uc2l6ZSwgJmZlYXR1cmVzKTsKKyAgICAgICAgICBhc3NlcnQoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spOyAgLy8gQ2hlY2tlZCBieSBXZWJQTXV4Q3JlYXRlKCkuCisgICAgICAgICAgKHZvaWQpc3RhdHVzOworICAgICAgICAgIHByaW50ZigiJTNkOiAlNWQgJTVkICU1cyAlOGQgJThkICIsIGksIGZlYXR1cmVzLndpZHRoLAorICAgICAgICAgICAgICAgICBmZWF0dXJlcy5oZWlnaHQsIGZlYXR1cmVzLmhhc19hbHBoYSA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgICAgICAgZnJhbWUueF9vZmZzZXQsIGZyYW1lLnlfb2Zmc2V0KTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBkaXNwb3NlID0KKyAgICAgICAgICAgICAgICAoZnJhbWUuZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9OT05FKSA/ICJub25lIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImJhY2tncm91bmQiOworICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QgYmxlbmQgPQorICAgICAgICAgICAgICAgIChmcmFtZS5ibGVuZF9tZXRob2QgPT0gV0VCUF9NVVhfQkxFTkQpID8gInllcyIgOiAibm8iOworICAgICAgICAgICAgcHJpbnRmKCIlOGQgJTEwcyAlNXMgIiwgZnJhbWUuZHVyYXRpb24sIGRpc3Bvc2UsIGJsZW5kKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRmKCIlMTBkICUxMXNcbiIsIChpbnQpZnJhbWUuYml0c3RyZWFtLnNpemUsCisgICAgICAgICAgICAgICAgIChmZWF0dXJlcy5mb3JtYXQgPT0gMSkgPyAibG9zc3kiIDoKKyAgICAgICAgICAgICAgICAgKGZlYXR1cmVzLmZvcm1hdCA9PSAyKSA/ICJsb3NzbGVzcyIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCIpOworICAgICAgICB9CisgICAgICAgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lLmJpdHN0cmVhbSk7CisgICAgICAgIFJFVFVSTl9JRl9FUlJPUjMoIkZhaWxlZCB0byByZXRyaWV2ZSAlcyMlZFxuIiwgdHlwZV9zdHIsIGkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGlmIChmbGFnICYgSUNDUF9GTEFHKSB7CisgICAgV2ViUERhdGEgaWNjX3Byb2ZpbGU7CisgICAgZXJyID0gV2ViUE11eEdldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUpOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOworICAgIHByaW50ZigiU2l6ZSBvZiB0aGUgSUNDIHByb2ZpbGUgZGF0YTogJWRcbiIsIChpbnQpaWNjX3Byb2ZpbGUuc2l6ZSk7CisgIH0KKworICBpZiAoZmxhZyAmIEVYSUZfRkxBRykgeworICAgIFdlYlBEYXRhIGV4aWY7CisgICAgZXJyID0gV2ViUE11eEdldENodW5rKG11eCwgIkVYSUYiLCAmZXhpZik7CisgICAgYXNzZXJ0KGVyciA9PSBXRUJQX01VWF9PSyk7CisgICAgcHJpbnRmKCJTaXplIG9mIHRoZSBFWElGIG1ldGFkYXRhOiAlZFxuIiwgKGludClleGlmLnNpemUpOworICB9CisKKyAgaWYgKGZsYWcgJiBYTVBfRkxBRykgeworICAgIFdlYlBEYXRhIHhtcDsKKyAgICBlcnIgPSBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiWE1QICIsICZ4bXApOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOworICAgIHByaW50ZigiU2l6ZSBvZiB0aGUgWE1QIG1ldGFkYXRhOiAlZFxuIiwgKGludCl4bXAuc2l6ZSk7CisgIH0KKworICBpZiAoKGZsYWcgJiBBTFBIQV9GTEFHKSAmJiAhKGZsYWcgJiBBTklNQVRJT05fRkxBRykpIHsKKyAgICBXZWJQTXV4RnJhbWVJbmZvIGltYWdlOworICAgIGVyciA9IFdlYlBNdXhHZXRGcmFtZShtdXgsIDEsICZpbWFnZSk7CisgICAgaWYgKGVyciA9PSBXRUJQX01VWF9PSykgeworICAgICAgcHJpbnRmKCJTaXplIG9mIHRoZSBpbWFnZSAod2l0aCBhbHBoYSk6ICVkXG4iLCAoaW50KWltYWdlLmJpdHN0cmVhbS5zaXplKTsKKyAgICB9CisgICAgV2ViUERhdGFDbGVhcigmaW1hZ2UuYml0c3RyZWFtKTsKKyAgICBSRVRVUk5fSUZfRVJST1IoIkZhaWxlZCB0byByZXRyaWV2ZSB0aGUgaW1hZ2VcbiIpOworICB9CisKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitzdGF0aWMgdm9pZCBQcmludEhlbHAodm9pZCkgeworICBwcmludGYoIlVzYWdlOiB3ZWJwbXV4IC1nZXQgR0VUX09QVElPTlMgSU5QVVQgLW8gT1VUUFVUXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCAtc2V0IFNFVF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLWR1cmF0aW9uIERVUkFUSU9OX09QVElPTlMgWy1kdXJhdGlvbiAuLi5dXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICAgICBJTlBVVCAtbyBPVVRQVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC1zdHJpcCBTVFJJUF9PUFRJT05TIElOUFVUIC1vIE9VVFBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLWZyYW1lIEZSQU1FX09QVElPTlMgWy1mcmFtZS4uLl0gWy1sb29wIExPT1BfQ09VTlRdIgorICAgICAgICAgIlxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICAgWy1iZ2NvbG9yIEJBQ0tHUk9VTkRfQ09MT1JdIC1vIE9VVFBVVFxuIik7CisgIHByaW50ZigiICAgICAgIHdlYnBtdXggLWluZm8gSU5QVVRcbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IFstaHwtaGVscF1cbiIpOworICBwcmludGYoIiAgICAgICB3ZWJwbXV4IC12ZXJzaW9uXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgd2VicG11eCBhcmd1bWVudF9maWxlX25hbWVcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJHRVRfT1BUSU9OUzpcbiIpOworICBwcmludGYoIiBFeHRyYWN0IHJlbGV2YW50IGRhdGE6XG4iKTsKKyAgcHJpbnRmKCIgICBpY2MgICAgICAgZ2V0IElDQyBwcm9maWxlXG4iKTsKKyAgcHJpbnRmKCIgICBleGlmICAgICAgZ2V0IEVYSUYgbWV0YWRhdGFcbiIpOworICBwcmludGYoIiAgIHhtcCAgICAgICBnZXQgWE1QIG1ldGFkYXRhXG4iKTsKKyAgcHJpbnRmKCIgICBmcmFtZSBuICAgZ2V0IG50aCBmcmFtZVxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlNFVF9PUFRJT05TOlxuIik7CisgIHByaW50ZigiIFNldCBjb2xvciBwcm9maWxlL21ldGFkYXRhOlxuIik7CisgIHByaW50ZigiICAgaWNjICBmaWxlLmljYyAgICAgc2V0IElDQyBwcm9maWxlXG4iKTsKKyAgcHJpbnRmKCIgICBleGlmIGZpbGUuZXhpZiAgICBzZXQgRVhJRiBtZXRhZGF0YVxuIik7CisgIHByaW50ZigiICAgeG1wICBmaWxlLnhtcCAgICAgc2V0IFhNUCBtZXRhZGF0YVxuIik7CisgIHByaW50ZigiICAgd2hlcmU6ICAgICdmaWxlLmljYycgY29udGFpbnMgdGhlIElDQyBwcm9maWxlIHRvIGJlIHNldCxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAnZmlsZS5leGlmJyBjb250YWlucyB0aGUgRVhJRiBtZXRhZGF0YSB0byBiZSBzZXRcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAnZmlsZS54bXAnIGNvbnRhaW5zIHRoZSBYTVAgbWV0YWRhdGEgdG8gYmUgc2V0XG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiRFVSQVRJT05fT1BUSU9OUzpcbiIpOworICBwcmludGYoIiBTZXQgZHVyYXRpb24gb2Ygc2VsZWN0ZWQgZnJhbWVzOlxuIik7CisgIHByaW50ZigiICAgZHVyYXRpb24gICAgICAgICAgICBzZXQgZHVyYXRpb24gZm9yIGVhY2ggZnJhbWVzXG4iKTsKKyAgcHJpbnRmKCIgICBkdXJhdGlvbixmcmFtZSAgICAgIHNldCBkdXJhdGlvbiBvZiBhIHBhcnRpY3VsYXIgZnJhbWVcbiIpOworICBwcmludGYoIiAgIGR1cmF0aW9uLHN0YXJ0LGVuZCAgc2V0IGR1cmF0aW9uIG9mIGZyYW1lcyBpbiB0aGVcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsIFtzdGFydCxlbmRdKVxuIik7CisgIHByaW50ZigiICAgd2hlcmU6ICdkdXJhdGlvbicgaXMgdGhlIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kc1xuIik7CisgIHByaW50ZigiICAgICAgICAgICdzdGFydCcgaXMgdGhlIHN0YXJ0IGZyYW1lIGluZGV4XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgJ2VuZCcgaXMgdGhlIGluY2x1c2l2ZSBlbmQgZnJhbWUgaW5kZXhcbiIpOworICBwcmludGYoIiAgICAgICAgICAgVGhlIHNwZWNpYWwgJ2VuZCcgdmFsdWUgJzAnIG1lYW5zOiBsYXN0IGZyYW1lLlxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlNUUklQX09QVElPTlM6XG4iKTsKKyAgcHJpbnRmKCIgU3RyaXAgY29sb3IgcHJvZmlsZS9tZXRhZGF0YTpcbiIpOworICBwcmludGYoIiAgIGljYyAgICAgICBzdHJpcCBJQ0MgcHJvZmlsZVxuIik7CisgIHByaW50ZigiICAgZXhpZiAgICAgIHN0cmlwIEVYSUYgbWV0YWRhdGFcbiIpOworICBwcmludGYoIiAgIHhtcCAgICAgICBzdHJpcCBYTVAgbWV0YWRhdGFcbiIpOworCisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJGUkFNRV9PUFRJT05TKGkpOlxuIik7CisgIHByaW50ZigiIENyZWF0ZSBhbmltYXRpb246XG4iKTsKKyAgcHJpbnRmKCIgICBmaWxlX2kgK2RpK1t4aSt5aVsrbWlbYmldXV1cbiIpOworICBwcmludGYoIiAgIHdoZXJlOiAgICAnZmlsZV9pJyBpcyB0aGUgaSd0aCBhbmltYXRpb24gZnJhbWUgKFdlYlAgZm9ybWF0KSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAnZGknIGlzIHRoZSBwYXVzZSBkdXJhdGlvbiBiZWZvcmUgbmV4dCBmcmFtZSxcbiIpOworICBwcmludGYoIiAgICAgICAgICAgICAneGknLCd5aScgc3BlY2lmeSB0aGUgaW1hZ2Ugb2Zmc2V0IGZvciB0aGlzIGZyYW1lLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICdtaScgaXMgdGhlIGRpc3Bvc2UgbWV0aG9kIGZvciB0aGlzIGZyYW1lICgwIG9yIDEpLFxuIik7CisgIHByaW50ZigiICAgICAgICAgICAgICdiaScgaXMgdGhlIGJsZW5kaW5nIG1ldGhvZCBmb3IgdGhpcyBmcmFtZSAoK2Igb3IgLWIpIgorICAgICAgICAgIlxuIik7CisKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIkxPT1BfQ09VTlQ6XG4iKTsKKyAgcHJpbnRmKCIgTnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgYW5pbWF0aW9uLlxuIik7CisgIHByaW50ZigiIFZhbGlkIHJhbmdlIGlzIDAgdG8gNjU1MzUgW0RlZmF1bHQ6IDAgKGluZmluaXRlKV0uXG4iKTsKKworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiQkFDS0dST1VORF9DT0xPUjpcbiIpOworICBwcmludGYoIiBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMuXG4iKTsKKyAgcHJpbnRmKCIgIEEsUixHLEJcbiIpOworICBwcmludGYoIiAgd2hlcmU6ICAgICdBJywgJ1InLCAnRycgYW5kICdCJyBhcmUgaW50ZWdlcnMgaW4gdGhlIHJhbmdlIDAgdG8gMjU1ICIKKyAgICAgICAgICJzcGVjaWZ5aW5nXG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICB0aGUgQWxwaGEsIFJlZCwgR3JlZW4gYW5kIEJsdWUgY29tcG9uZW50IHZhbHVlcyAiCisgICAgICAgICAicmVzcGVjdGl2ZWx5XG4iKTsKKyAgcHJpbnRmKCIgICAgICAgICAgICBbRGVmYXVsdDogMjU1LDI1NSwyNTUsMjU1XVxuIik7CisKKyAgcHJpbnRmKCJcbklOUFVUICYgT1VUUFVUIGFyZSBpbiBXZWJQIGZvcm1hdC5cbiIpOworCisgIHByaW50ZigiXG5Ob3RlOiBUaGUgbmF0dXJlIG9mIEVYSUYsIFhNUCBhbmQgSUNDIGRhdGEgaXMgbm90IGNoZWNrZWQiKTsKKyAgcHJpbnRmKCIgYW5kIGlzIGFzc3VtZWQgdG8gYmVcbnZhbGlkLlxuIik7CisgIHByaW50ZigiXG5Ob3RlOiBpZiBhIHNpbmdsZSBmaWxlIG5hbWUgaXMgcGFzc2VkIGFzIHRoZSBhcmd1bWVudCwgdGhlICIKKyAgICAgICAgICJhcmd1bWVudHMgd2lsbCBiZVxuIik7CisgIHByaW50ZigidG9rZW5pemVkIGZyb20gdGhpcyBmaWxlLiBUaGUgZmlsZSBuYW1lIG11c3Qgbm90IHN0YXJ0IHdpdGggIgorICAgICAgICAgInRoZSBjaGFyYWN0ZXIgJy0nLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIFdhcm5BYm91dE9kZE9mZnNldChjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBpbmZvKSB7CisgIGlmICgoaW5mby0+eF9vZmZzZXQgfCBpbmZvLT55X29mZnNldCkgJiAxKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBvZGQgb2Zmc2V0cyB3aWxsIGJlIHNuYXBwZWQgdG8gZXZlbiB2YWx1ZXMiCisgICAgICAgICAgICAiICglZCwgJWQpIC0+ICglZCwgJWQpXG4iLCBpbmZvLT54X29mZnNldCwgaW5mby0+eV9vZmZzZXQsCisgICAgICAgICAgICBpbmZvLT54X29mZnNldCAmIH4xLCBpbmZvLT55X29mZnNldCAmIH4xKTsKKyAgfQorfQorCitzdGF0aWMgaW50IENyZWF0ZU11eChjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwgV2ViUE11eCoqIG11eCkgeworICBXZWJQRGF0YSBiaXRzdHJlYW07CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGlmICghRXhVdGlsUmVhZEZpbGVUb1dlYlBEYXRhKGZpbGVuYW1lLCAmYml0c3RyZWFtKSkgcmV0dXJuIDA7CisgICptdXggPSBXZWJQTXV4Q3JlYXRlKCZiaXRzdHJlYW0sIDEpOworICBXZWJQRGF0YUNsZWFyKCZiaXRzdHJlYW0pOworICBpZiAoKm11eCAhPSBOVUxMKSByZXR1cm4gMTsKKyAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gY3JlYXRlIG11eCBvYmplY3QgZnJvbSBmaWxlICVzLlxuIiwgZmlsZW5hbWUpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBXcml0ZURhdGEoY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IFdlYlBEYXRhKiBjb25zdCB3ZWJwZGF0YSkgeworICBpbnQgb2sgPSAwOworICBGSUxFKiBmb3V0ID0gc3RyY21wKGZpbGVuYW1lLCAiLSIpID8gZm9wZW4oZmlsZW5hbWUsICJ3YiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBJbWdJb1V0aWxTZXRCaW5hcnlNb2RlKHN0ZG91dCk7CisgIGlmIChmb3V0ID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IFdlYlAgZmlsZSAlcyFcbiIsIGZpbGVuYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZndyaXRlKHdlYnBkYXRhLT5ieXRlcywgd2VicGRhdGEtPnNpemUsIDEsIGZvdXQpICE9IDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdyaXRpbmcgZmlsZSAlcyFcbiIsIGZpbGVuYW1lKTsKKyAgfSBlbHNlIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlNhdmVkIGZpbGUgJXMgKCVkIGJ5dGVzKVxuIiwKKyAgICAgICAgICAgIGZpbGVuYW1lLCAoaW50KXdlYnBkYXRhLT5zaXplKTsKKyAgICBvayA9IDE7CisgIH0KKyAgaWYgKGZvdXQgIT0gc3Rkb3V0KSBmY2xvc2UoZm91dCk7CisgIHJldHVybiBvazsKK30KKworc3RhdGljIGludCBXcml0ZVdlYlAoV2ViUE11eCogY29uc3QgbXV4LCBjb25zdCBjaGFyKiBmaWxlbmFtZSkgeworICBpbnQgb2s7CisgIFdlYlBEYXRhIHdlYnBfZGF0YTsKKyAgY29uc3QgV2ViUE11eEVycm9yIGVyciA9IFdlYlBNdXhBc3NlbWJsZShtdXgsICZ3ZWJwX2RhdGEpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciAoJXMpIGFzc2VtYmxpbmcgdGhlIFdlYlAgZmlsZS5cbiIsIEVycm9yU3RyaW5nKGVycikpOworICAgIHJldHVybiAwOworICB9CisgIG9rID0gV3JpdGVEYXRhKGZpbGVuYW1lLCAmd2VicF9kYXRhKTsKKyAgV2ViUERhdGFDbGVhcigmd2VicF9kYXRhKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgV2ViUE11eCogRHVwbGljYXRlTXV4SGVhZGVyKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBXZWJQTXV4KiBuZXdfbXV4ID0gV2ViUE11eE5ldygpOworICBXZWJQTXV4QW5pbVBhcmFtcyBwOworICBXZWJQTXV4RXJyb3IgZXJyOworICBpbnQgaTsKKyAgaW50IG9rID0gMTsKKworICBpZiAobmV3X211eCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBlcnIgPSBXZWJQTXV4R2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJnApOworICBpZiAoZXJyID09IFdFQlBfTVVYX09LKSB7CisgICAgZXJyID0gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhuZXdfbXV4LCAmcCk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgRVJST1JfR09UTzIoIkVycm9yICglcykgaGFuZGxpbmcgYW5pbWF0aW9uIHBhcmFtcy5cbiIsCisgICAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBFbmQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvKiBpdCBtaWdodCBub3QgYmUgYW4gYW5pbWF0aW9uLiBKdXN0IGtlZXAgbW92aW5nLiAqLworICB9CisKKyAgZm9yIChpID0gMTsgaSA8PSAzOyArK2kpIHsKKyAgICBXZWJQRGF0YSBtZXRhZGF0YTsKKyAgICBlcnIgPSBXZWJQTXV4R2V0Q2h1bmsobXV4LCBrRm91cmNjTGlzdFtpXSwgJm1ldGFkYXRhKTsKKyAgICBpZiAoZXJyID09IFdFQlBfTVVYX09LICYmIG1ldGFkYXRhLnNpemUgPiAwKSB7CisgICAgICBlcnIgPSBXZWJQTXV4U2V0Q2h1bmsobmV3X211eCwga0ZvdXJjY0xpc3RbaV0sICZtZXRhZGF0YSwgMSk7CisgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgIEVSUk9SX0dPVE8xKCJFcnJvciB0cmFuc2ZlcnJpbmcgbWV0YWRhdGEgaW4gRHVwbGljYXRlTXV4KCkuIiwgRW5kKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworIEVuZDoKKyAgaWYgKCFvaykgeworICAgIFdlYlBNdXhEZWxldGUobmV3X211eCk7CisgICAgbmV3X211eCA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIG5ld19tdXg7Cit9CisKK3N0YXRpYyBpbnQgUGFyc2VGcmFtZUFyZ3MoY29uc3QgY2hhciogYXJncywgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgaW5mbykgeworICBpbnQgZGlzcG9zZV9tZXRob2QsIGR1bW15OworICBjaGFyIHBsdXNfbWludXMsIGJsZW5kX21ldGhvZDsKKyAgY29uc3QgaW50IG51bV9hcmdzID0gc3NjYW5mKGFyZ3MsICIrJWQrJWQrJWQrJWQlYyVjKyVkIiwgJmluZm8tPmR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluZm8tPnhfb2Zmc2V0LCAmaW5mby0+eV9vZmZzZXQsICZkaXNwb3NlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwbHVzX21pbnVzLCAmYmxlbmRfbWV0aG9kLCAmZHVtbXkpOworICBzd2l0Y2ggKG51bV9hcmdzKSB7CisgICAgY2FzZSAxOgorICAgICAgaW5mby0+eF9vZmZzZXQgPSBpbmZvLT55X29mZnNldCA9IDA7ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIDM6CisgICAgICBkaXNwb3NlX21ldGhvZCA9IDA7ICAvLyBmYWxsIHRocm91Z2gKKyAgICBjYXNlIDQ6CisgICAgICBwbHVzX21pbnVzID0gJysnOworICAgICAgYmxlbmRfbWV0aG9kID0gJ2InOyAgLy8gZmFsbCB0aHJvdWdoCisgICAgY2FzZSA2OgorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgIGNhc2UgNToKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIDA7CisgIH0KKworICBXYXJuQWJvdXRPZGRPZmZzZXQoaW5mbyk7CisKKyAgLy8gTm90ZTogVGhlIHNhbml0eSBvZiB0aGUgZm9sbG93aW5nIGNvbnZlcnNpb24gaXMgY2hlY2tlZCBieQorICAvLyBXZWJQTXV4UHVzaEZyYW1lKCkuCisgIGluZm8tPmRpc3Bvc2VfbWV0aG9kID0gKFdlYlBNdXhBbmltRGlzcG9zZSlkaXNwb3NlX21ldGhvZDsKKworICBpZiAoYmxlbmRfbWV0aG9kICE9ICdiJykgcmV0dXJuIDA7CisgIGlmIChwbHVzX21pbnVzICE9ICctJyAmJiBwbHVzX21pbnVzICE9ICcrJykgcmV0dXJuIDA7CisgIGluZm8tPmJsZW5kX21ldGhvZCA9CisgICAgICAocGx1c19taW51cyA9PSAnKycpID8gV0VCUF9NVVhfQkxFTkQgOiBXRUJQX01VWF9OT19CTEVORDsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgUGFyc2VCZ2NvbG9yQXJncyhjb25zdCBjaGFyKiBhcmdzLCB1aW50MzJfdCogY29uc3QgYmdjb2xvcikgeworICB1aW50MzJfdCBhLCByLCBnLCBiOworICBpZiAoc3NjYW5mKGFyZ3MsICIldSwldSwldSwldSIsICZhLCAmciwgJmcsICZiKSAhPSA0KSByZXR1cm4gMDsKKyAgaWYgKGEgPj0gMjU2IHx8IHIgPj0gMjU2IHx8IGcgPj0gMjU2IHx8IGIgPj0gMjU2KSByZXR1cm4gMDsKKyAgKmJnY29sb3IgPSAoYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IChiIDw8IDApOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENsZWFuLXVwLgorCitzdGF0aWMgdm9pZCBEZWxldGVDb25maWcoQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaWYgKGNvbmZpZyAhPSBOVUxMKSB7CisgICAgZnJlZShjb25maWctPmFyZ3NfKTsKKyAgICBFeFV0aWxEZWxldGVDb21tYW5kTGluZUFyZ3VtZW50cygmY29uZmlnLT5jbWRfYXJnc18pOworICAgIG1lbXNldChjb25maWcsIDAsIHNpemVvZigqY29uZmlnKSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcnNpbmcuCisKKy8vIEJhc2ljIHN5bnRhY3RpYyBjaGVja3Mgb24gdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisvLyBSZXR1cm5zIDEgb24gdmFsaWQsIDAgb3RoZXJ3aXNlLgorLy8gQWxzbyBmaWxscyB1cCBudW1fZmVhdHVyZV9hcmdzIHRvIGJlIG51bWJlciBvZiBmZWF0dXJlIGFyZ3VtZW50cyBnaXZlbi4KKy8vIChlLmcuIGlmIHRoZXJlIGFyZSA0ICctZnJhbWUncyBhbmQgMSAnLWxvb3AnLCB0aGVuIG51bV9mZWF0dXJlX2FyZ3MgPSA1KS4KK3N0YXRpYyBpbnQgVmFsaWRhdGVDb21tYW5kTGluZShjb25zdCBDb21tYW5kTGluZUFyZ3VtZW50cyogY29uc3QgY21kX2FyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBudW1fZmVhdHVyZV9hcmdzKSB7CisgIGludCBudW1fZnJhbWVfYXJnczsKKyAgaW50IG51bV9sb29wX2FyZ3M7CisgIGludCBudW1fYmdjb2xvcl9hcmdzOworICBpbnQgbnVtX2R1cmF0aW9uc19hcmdzOworICBpbnQgb2sgPSAxOworCisgIGFzc2VydChudW1fZmVhdHVyZV9hcmdzICE9IE5VTEwpOworICAqbnVtX2ZlYXR1cmVfYXJncyA9IDA7CisKKyAgLy8gU2ltcGxlIGNoZWNrcy4KKyAgaWYgKENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItZ2V0IikgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSAnLWdldCcgYXJndW1lbnRzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAoQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1zZXQiKSA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlICctc2V0JyBhcmd1bWVudHMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLXN0cmlwIikgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSAnLXN0cmlwJyBhcmd1bWVudHMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisgIGlmIChDb3VudE9jY3VycmVuY2VzKGNtZF9hcmdzLCAiLWluZm8iKSA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlICctaW5mbycgYXJndW1lbnRzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAoQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1vIikgPiAxKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBvdXRwdXQgZmlsZXMgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUpOworICB9CisKKyAgLy8gQ29tcG91bmQgY2hlY2tzLgorICBudW1fZnJhbWVfYXJncyA9IENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItZnJhbWUiKTsKKyAgbnVtX2xvb3BfYXJncyA9IENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItbG9vcCIpOworICBudW1fYmdjb2xvcl9hcmdzID0gQ291bnRPY2N1cnJlbmNlcyhjbWRfYXJncywgIi1iZ2NvbG9yIik7CisgIG51bV9kdXJhdGlvbnNfYXJncyA9IENvdW50T2NjdXJyZW5jZXMoY21kX2FyZ3MsICItZHVyYXRpb24iKTsKKworICBpZiAobnVtX2xvb3BfYXJncyA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGxvb3AgY291bnRzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAobnVtX2JnY29sb3JfYXJncyA+IDEpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGJhY2tncm91bmQgY29sb3JzIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorCisgIGlmICgobnVtX2ZyYW1lX2FyZ3MgPT0gMCkgJiYgKG51bV9sb29wX2FyZ3MgKyBudW1fYmdjb2xvcl9hcmdzID4gMCkpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IExvb3AgY291bnQgYW5kIGJhY2tncm91bmQgY29sb3IgYXJlIHJlbGV2YW50IG9ubHkgaW4gIgorICAgICAgICAgICAgICAgICJjYXNlIG9mIGFuaW1hdGlvbi5cbiIsIEVyclZhbGlkYXRlKTsKKyAgfQorICBpZiAobnVtX2R1cmF0aW9uc19hcmdzID4gMCAmJiBudW1fZnJhbWVfYXJncyAhPSAwKSB7CisgICAgRVJST1JfR09UTzEoIkVSUk9SOiBDYW4gbm90IGNvbWJpbmUgLWR1cmF0aW9uIGFuZCAtZnJhbWUgY29tbWFuZHMuXG4iLAorICAgICAgICAgICAgICAgIEVyclZhbGlkYXRlKTsKKyAgfQorCisgIGFzc2VydChvayA9PSAxKTsKKyAgaWYgKG51bV9kdXJhdGlvbnNfYXJncyA+IDApIHsKKyAgICAqbnVtX2ZlYXR1cmVfYXJncyA9IG51bV9kdXJhdGlvbnNfYXJnczsKKyAgfSBlbHNlIGlmIChudW1fZnJhbWVfYXJncyA9PSAwKSB7CisgICAgLy8gU2luZ2xlIGFyZ3VtZW50ICgnc2V0JyBhY3Rpb24gZm9yIElDQ1AvRVhJRi9YTVAsIE9SIGEgJ2dldCcgYWN0aW9uKS4KKyAgICAqbnVtX2ZlYXR1cmVfYXJncyA9IDE7CisgIH0gZWxzZSB7CisgICAgLy8gTXVsdGlwbGUgYXJndW1lbnRzICgnc2V0JyBhY3Rpb24gZm9yIGFuaW1hdGlvbikKKyAgICAqbnVtX2ZlYXR1cmVfYXJncyA9IG51bV9mcmFtZV9hcmdzICsgbnVtX2xvb3BfYXJncyArIG51bV9iZ2NvbG9yX2FyZ3M7CisgIH0KKworIEVyclZhbGlkYXRlOgorICByZXR1cm4gb2s7Cit9CisKKyNkZWZpbmUgQUNUSU9OX0lTX05JTCAoY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gTklMX0FDVElPTikKKworI2RlZmluZSBGRUFUVVJFVFlQRV9JU19OSUwgKGNvbmZpZy0+dHlwZV8gPT0gTklMX0ZFQVRVUkUpCisKKyNkZWZpbmUgQ0hFQ0tfTlVNX0FSR1NfTEVTUyhOVU0sIExBQkVMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChhcmdjIDwgaSArIChOVU0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IFRvbyBmZXcgYXJndW1lbnRzIGZvciAnJXMnLlxuIiwgYXJndltpXSk7ICAgIFwKKyAgICBnb3RvIExBQkVMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBDSEVDS19OVU1fQVJHU19OT1RfRVFVQUwoTlVNLCBMQUJFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGFyZ2MgIT0gaSArIChOVU0pKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogVG9vIG1hbnkgYXJndW1lbnRzIGZvciAnJXMnLlxuIiwgYXJndltpXSk7ICAgXAorICAgIGdvdG8gTEFCRUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisvLyBQYXJzZXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cyB0byBmaWxsIHVwIGNvbmZpZyBvYmplY3QuIEFsc28gcGVyZm9ybXMgc29tZQorLy8gc2VtYW50aWMgY2hlY2tzLgorc3RhdGljIGludCBQYXJzZUNvbW1hbmRMaW5lKENvbmZpZyogY29uZmlnKSB7CisgIGludCBpID0gMDsKKyAgaW50IGZlYXR1cmVfYXJnX2luZGV4ID0gMDsKKyAgaW50IG9rID0gMTsKKyAgaW50IGFyZ2MgPSBjb25maWctPmNtZF9hcmdzXy5hcmdjXzsKKyAgY29uc3QgY2hhciogY29uc3QqIGFyZ3YgPSBjb25maWctPmNtZF9hcmdzXy5hcmd2XzsKKworICB3aGlsZSAoaSA8IGFyZ2MpIHsKKyAgICBGZWF0dXJlQXJnKiBjb25zdCBhcmcgPSAmY29uZmlnLT5hcmdzX1tmZWF0dXJlX2FyZ19pbmRleF07CisgICAgaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nKSB7ICAvLyBPbmUgb2YgdGhlIGFjdGlvbiB0eXBlcyBvciBvdXRwdXQuCisgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXNldCIpKSB7CisgICAgICAgIGlmIChBQ1RJT05fSVNfTklMKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fU0VUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZHVyYXRpb24iKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDIsIEVyclBhcnNlKTsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwgfHwgY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gQUNUSU9OX0RVUkFUSU9OKSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fRFVSQVRJT047CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRVJST1JfR09UTzEoIkVSUk9SOiBNdWx0aXBsZSBhY3Rpb25zIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoRkVBVFVSRVRZUEVfSVNfTklMIHx8IGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9EVVJBVElPTikgeworICAgICAgICAgIGNvbmZpZy0+dHlwZV8gPSBGRUFUVVJFX0RVUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgZmVhdHVyZXMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGFyZy0+cGFyYW1zXyA9IGFyZ3ZbaSArIDFdOworICAgICAgICArK2ZlYXR1cmVfYXJnX2luZGV4OworICAgICAgICBpICs9IDI7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1nZXQiKSkgeworICAgICAgICBpZiAoQUNUSU9OX0lTX05JTCkgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX0dFVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgICsraTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXN0cmlwIikpIHsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwpIHsKKyAgICAgICAgICBjb25maWctPmFjdGlvbl90eXBlXyA9IEFDVElPTl9TVFJJUDsKKyAgICAgICAgICBjb25maWctPmFyZ19jb3VudF8gPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZnJhbWUiKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDMsIEVyclBhcnNlKTsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwgfHwgY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gQUNUSU9OX1NFVCkgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX1NFVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChGRUFUVVJFVFlQRV9JU19OSUwgfHwgY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX0FOTUYpIHsKKyAgICAgICAgICBjb25maWctPnR5cGVfID0gRkVBVFVSRV9BTk1GOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgZmVhdHVyZXMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGFyZy0+c3VidHlwZV8gPSBTVUJUWVBFX0FOTUY7CisgICAgICAgIGFyZy0+ZmlsZW5hbWVfID0gYXJndltpICsgMV07CisgICAgICAgIGFyZy0+cGFyYW1zXyA9IGFyZ3ZbaSArIDJdOworICAgICAgICArK2ZlYXR1cmVfYXJnX2luZGV4OworICAgICAgICBpICs9IDM7CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1sb29wIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiLWJnY29sb3IiKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDIsIEVyclBhcnNlKTsKKyAgICAgICAgaWYgKEFDVElPTl9JU19OSUwgfHwgY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gQUNUSU9OX1NFVCkgeworICAgICAgICAgIGNvbmZpZy0+YWN0aW9uX3R5cGVfID0gQUNUSU9OX1NFVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGFjdGlvbnMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGlmIChGRUFUVVJFVFlQRV9JU19OSUwgfHwgY29uZmlnLT50eXBlXyA9PSBGRUFUVVJFX0FOTUYpIHsKKyAgICAgICAgICBjb25maWctPnR5cGVfID0gRkVBVFVSRV9BTk1GOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgZmVhdHVyZXMgc3BlY2lmaWVkLlxuIiwgRXJyUGFyc2UpOworICAgICAgICB9CisgICAgICAgIGFyZy0+c3VidHlwZV8gPQorICAgICAgICAgICAgIXN0cmNtcChhcmd2W2ldLCAiLWxvb3AiKSA/IFNVQlRZUEVfTE9PUCA6IFNVQlRZUEVfQkdDT0xPUjsKKyAgICAgICAgYXJnLT5wYXJhbXNfID0gYXJndltpICsgMV07CisgICAgICAgICsrZmVhdHVyZV9hcmdfaW5kZXg7CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLW8iKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19MRVNTKDIsIEVyclBhcnNlKTsKKyAgICAgICAgY29uZmlnLT5vdXRwdXRfID0gYXJndltpICsgMV07CisgICAgICAgIGkgKz0gMjsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWluZm8iKSkgeworICAgICAgICBDSEVDS19OVU1fQVJHU19OT1RfRVFVQUwoMiwgRXJyUGFyc2UpOworICAgICAgICBpZiAoY29uZmlnLT5hY3Rpb25fdHlwZV8gIT0gTklMX0FDVElPTikgeworICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTXVsdGlwbGUgYWN0aW9ucyBzcGVjaWZpZWQuXG4iLCBFcnJQYXJzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgY29uZmlnLT5hY3Rpb25fdHlwZV8gPSBBQ1RJT05fSU5GTzsKKyAgICAgICAgICBjb25maWctPmFyZ19jb3VudF8gPSAwOworICAgICAgICAgIGNvbmZpZy0+aW5wdXRfID0gYXJndltpICsgMV07CisgICAgICAgIH0KKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaCIpIHx8ICFzdHJjbXAoYXJndltpXSwgIi1oZWxwIikpIHsKKyAgICAgICAgUHJpbnRIZWxwKCk7CisgICAgICAgIERlbGV0ZUNvbmZpZyhjb25maWcpOworICAgICAgICBleGl0KDApOworICAgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdmVyc2lvbiIpKSB7CisgICAgICAgIGNvbnN0IGludCB2ZXJzaW9uID0gV2ViUEdldE11eFZlcnNpb24oKTsKKyAgICAgICAgcHJpbnRmKCIlZC4lZC4lZFxuIiwKKyAgICAgICAgICAgICAgICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmYsICh2ZXJzaW9uID4+IDgpICYgMHhmZiwgdmVyc2lvbiAmIDB4ZmYpOworICAgICAgICBEZWxldGVDb25maWcoY29uZmlnKTsKKyAgICAgICAgZXhpdCgwKTsKKyAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLS0iKSkgeworICAgICAgICBpZiAoaSA8IGFyZ2MgLSAxKSB7CisgICAgICAgICAgKytpOworICAgICAgICAgIGlmIChjb25maWctPmlucHV0XyA9PSBOVUxMKSB7CisgICAgICAgICAgICBjb25maWctPmlucHV0XyA9IGFyZ3ZbaV07CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUiBhdCAnJXMnOiBNdWx0aXBsZSBpbnB1dCBmaWxlcyBzcGVjaWZpZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJndltpXSwgRXJyUGFyc2UpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUjogVW5rbm93biBvcHRpb246ICclcycuXG4iLCBhcmd2W2ldLCBFcnJQYXJzZSk7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIE9uZSBvZiB0aGUgZmVhdHVyZSB0eXBlcyBvciBpbnB1dC4KKyAgICAgIGlmIChBQ1RJT05fSVNfTklMKSB7CisgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogQWN0aW9uIG11c3QgYmUgc3BlY2lmaWVkIGJlZm9yZSBvdGhlciBhcmd1bWVudHMuXG4iLAorICAgICAgICAgICAgICAgICAgICBFcnJQYXJzZSk7CisgICAgICB9CisgICAgICBpZiAoIXN0cmNtcChhcmd2W2ldLCAiaWNjIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiZXhpZiIpIHx8CisgICAgICAgICAgIXN0cmNtcChhcmd2W2ldLCAieG1wIikpIHsKKyAgICAgICAgaWYgKEZFQVRVUkVUWVBFX0lTX05JTCkgeworICAgICAgICAgIGNvbmZpZy0+dHlwZV8gPSAoIXN0cmNtcChhcmd2W2ldLCAiaWNjIikpID8gRkVBVFVSRV9JQ0NQIDoKKyAgICAgICAgICAgICAgKCFzdHJjbXAoYXJndltpXSwgImV4aWYiKSkgPyBGRUFUVVJFX0VYSUYgOiBGRUFUVVJFX1hNUDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE11bHRpcGxlIGZlYXR1cmVzIHNwZWNpZmllZC5cbiIsIEVyclBhcnNlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29uZmlnLT5hY3Rpb25fdHlwZV8gPT0gQUNUSU9OX1NFVCkgeworICAgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMiwgRXJyUGFyc2UpOworICAgICAgICAgIGFyZy0+ZmlsZW5hbWVfID0gYXJndltpICsgMV07CisgICAgICAgICAgKytmZWF0dXJlX2FyZ19pbmRleDsKKyAgICAgICAgICBpICs9IDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgImZyYW1lIikgJiYKKyAgICAgICAgICAgICAgICAgKGNvbmZpZy0+YWN0aW9uX3R5cGVfID09IEFDVElPTl9HRVQpKSB7CisgICAgICAgIENIRUNLX05VTV9BUkdTX0xFU1MoMiwgRXJyUGFyc2UpOworICAgICAgICBjb25maWctPnR5cGVfID0gRkVBVFVSRV9BTk1GOworICAgICAgICBhcmctPnBhcmFtc18gPSBhcmd2W2kgKyAxXTsKKyAgICAgICAgKytmZWF0dXJlX2FyZ19pbmRleDsKKyAgICAgICAgaSArPSAyOworICAgICAgfSBlbHNlIHsgIC8vIEFzc3VtZSBpbnB1dCBmaWxlLgorICAgICAgICBpZiAoY29uZmlnLT5pbnB1dF8gPT0gTlVMTCkgeworICAgICAgICAgIGNvbmZpZy0+aW5wdXRfID0gYXJndltpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1IgYXQgJyVzJzogTXVsdGlwbGUgaW5wdXQgZmlsZXMgc3BlY2lmaWVkLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhcmd2W2ldLCBFcnJQYXJzZSk7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgICAgfQorICAgIH0KKyAgfQorIEVyclBhcnNlOgorICByZXR1cm4gb2s7Cit9CisKKy8vIEFkZGl0aW9uYWwgY2hlY2tzIGFmdGVyIGNvbmZpZyBpcyBmaWxsZWQuCitzdGF0aWMgaW50IFZhbGlkYXRlQ29uZmlnKENvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGludCBvayA9IDE7CisKKyAgLy8gQWN0aW9uLgorICBpZiAoQUNUSU9OX0lTX05JTCkgeworICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTm8gYWN0aW9uIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlMik7CisgIH0KKworICAvLyBGZWF0dXJlIHR5cGUuCisgIGlmIChGRUFUVVJFVFlQRV9JU19OSUwgJiYgY29uZmlnLT5hY3Rpb25fdHlwZV8gIT0gQUNUSU9OX0lORk8pIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE5vIGZlYXR1cmUgc3BlY2lmaWVkLlxuIiwgRXJyVmFsaWRhdGUyKTsKKyAgfQorCisgIC8vIElucHV0IGZpbGUuCisgIGlmIChjb25maWctPmlucHV0XyA9PSBOVUxMKSB7CisgICAgaWYgKGNvbmZpZy0+YWN0aW9uX3R5cGVfICE9IEFDVElPTl9TRVQpIHsKKyAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZTIpOworICAgIH0gZWxzZSBpZiAoY29uZmlnLT50eXBlXyAhPSBGRUFUVVJFX0FOTUYpIHsKKyAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQuXG4iLCBFcnJWYWxpZGF0ZTIpOworICAgIH0KKyAgfQorCisgIC8vIE91dHB1dCBmaWxlLgorICBpZiAoY29uZmlnLT5vdXRwdXRfID09IE5VTEwgJiYgY29uZmlnLT5hY3Rpb25fdHlwZV8gIT0gQUNUSU9OX0lORk8pIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE5vIG91dHB1dCBmaWxlIHNwZWNpZmllZC5cbiIsIEVyclZhbGlkYXRlMik7CisgIH0KKworIEVyclZhbGlkYXRlMjoKKyAgcmV0dXJuIG9rOworfQorCisvLyBDcmVhdGUgY29uZmlnIG9iamVjdCBmcm9tIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCitzdGF0aWMgaW50IEluaXRpYWxpemVDb25maWcoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpbnQgbnVtX2ZlYXR1cmVfYXJncyA9IDA7CisgIGludCBvazsKKworICBtZW1zZXQoY29uZmlnLCAwLCBzaXplb2YoKmNvbmZpZykpOworCisgIG9rID0gRXhVdGlsSW5pdENvbW1hbmRMaW5lQXJndW1lbnRzKGFyZ2MsIGFyZ3YsICZjb25maWctPmNtZF9hcmdzXyk7CisgIGlmICghb2spIHJldHVybiAwOworCisgIC8vIFZhbGlkYXRlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCisgIGlmICghVmFsaWRhdGVDb21tYW5kTGluZSgmY29uZmlnLT5jbWRfYXJnc18sICZudW1fZmVhdHVyZV9hcmdzKSkgeworICAgIEVSUk9SX0dPVE8xKCJFeGl0aW5nIGR1ZSB0byBjb21tYW5kLWxpbmUgcGFyc2luZyBlcnJvci5cbiIsIEVycjEpOworICB9CisKKyAgY29uZmlnLT5hcmdfY291bnRfID0gbnVtX2ZlYXR1cmVfYXJnczsKKyAgY29uZmlnLT5hcmdzXyA9IChGZWF0dXJlQXJnKiljYWxsb2MobnVtX2ZlYXR1cmVfYXJncywgc2l6ZW9mKCpjb25maWctPmFyZ3NfKSk7CisgIGlmIChjb25maWctPmFyZ3NfID09IE5VTEwpIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IE1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLlxuIiwgRXJyMSk7CisgIH0KKworICAvLyBQYXJzZSBjb21tYW5kLWxpbmUuCisgIGlmICghUGFyc2VDb21tYW5kTGluZShjb25maWcpIHx8ICFWYWxpZGF0ZUNvbmZpZyhjb25maWcpKSB7CisgICAgRVJST1JfR09UTzEoIkV4aXRpbmcgZHVlIHRvIGNvbW1hbmQtbGluZSBwYXJzaW5nIGVycm9yLlxuIiwgRXJyMSk7CisgIH0KKworIEVycjE6CisgIHJldHVybiBvazsKK30KKworI3VuZGVmIEFDVElPTl9JU19OSUwKKyN1bmRlZiBGRUFUVVJFVFlQRV9JU19OSUwKKyN1bmRlZiBDSEVDS19OVU1fQVJHU19MRVNTCisjdW5kZWYgQ0hFQ0tfTlVNX0FSR1NfTU9SRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJvY2Vzc2luZy4KKworc3RhdGljIGludCBHZXRGcmFtZShjb25zdCBXZWJQTXV4KiBtdXgsIGNvbnN0IENvbmZpZyogY29uZmlnKSB7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9PSzsKKyAgV2ViUE11eCogbXV4X3NpbmdsZSA9IE5VTEw7CisgIGludCBudW0gPSAwOworICBpbnQgb2sgPSAxOworICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICBjb25zdCBXZWJQQ2h1bmtJZCBpZCA9IFdFQlBfQ0hVTktfQU5NRjsKKyAgV2ViUE11eEZyYW1lSW5mbyBpbmZvOworICBXZWJQRGF0YUluaXQoJmluZm8uYml0c3RyZWFtKTsKKworICBudW0gPSBFeFV0aWxHZXRJbnQoY29uZmlnLT5hcmdzX1swXS5wYXJhbXNfLCAxMCwgJnBhcnNlX2Vycm9yKTsKKyAgaWYgKG51bSA8IDApIHsKKyAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEZyYW1lL0ZyYWdtZW50IGluZGV4IG11c3QgYmUgbm9uLW5lZ2F0aXZlLlxuIiwgRXJyR2V0KTsKKyAgfQorICBpZiAocGFyc2VfZXJyb3IpIGdvdG8gRXJyR2V0OworCisgIGVyciA9IFdlYlBNdXhHZXRGcmFtZShtdXgsIG51bSwgJmluZm8pOworICBpZiAoZXJyID09IFdFQlBfTVVYX09LICYmIGluZm8uaWQgIT0gaWQpIGVyciA9IFdFQlBfTVVYX05PVF9GT1VORDsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgIEVSUk9SX0dPVE8zKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgZ2V0IGZyYW1lICVkLlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBudW0sIEVyckdldCk7CisgIH0KKworICBtdXhfc2luZ2xlID0gV2ViUE11eE5ldygpOworICBpZiAobXV4X3NpbmdsZSA9PSBOVUxMKSB7CisgICAgZXJyID0gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworICAgIEVSUk9SX0dPVE8yKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgYWxsb2NhdGUgYSBtdXggb2JqZWN0LlxuIiwKKyAgICAgICAgICAgICAgICBFcnJvclN0cmluZyhlcnIpLCBFcnJHZXQpOworICB9CisgIGVyciA9IFdlYlBNdXhTZXRJbWFnZShtdXhfc2luZ2xlLCAmaW5mby5iaXRzdHJlYW0sIDEpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgRVJST1JfR09UTzIoIkVSUk9SICglcyk6IENvdWxkIG5vdCBjcmVhdGUgc2luZ2xlIGltYWdlIG11eCBvYmplY3QuXG4iLAorICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIEVyckdldCk7CisgIH0KKworICBvayA9IFdyaXRlV2ViUChtdXhfc2luZ2xlLCBjb25maWctPm91dHB1dF8pOworCisgRXJyR2V0OgorICBXZWJQRGF0YUNsZWFyKCZpbmZvLmJpdHN0cmVhbSk7CisgIFdlYlBNdXhEZWxldGUobXV4X3NpbmdsZSk7CisgIHJldHVybiBvayAmJiAhcGFyc2VfZXJyb3I7Cit9CisKKy8vIFJlYWQgYW5kIHByb2Nlc3MgY29uZmlnLgorc3RhdGljIGludCBQcm9jZXNzKGNvbnN0IENvbmZpZyogY29uZmlnKSB7CisgIFdlYlBNdXgqIG11eCA9IE5VTEw7CisgIFdlYlBEYXRhIGNodW5rOworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfT0s7CisgIGludCBvayA9IDE7CisKKyAgc3dpdGNoIChjb25maWctPmFjdGlvbl90eXBlXykgeworICAgIGNhc2UgQUNUSU9OX0dFVDogeworICAgICAgb2sgPSBDcmVhdGVNdXgoY29uZmlnLT5pbnB1dF8sICZtdXgpOworICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgc3dpdGNoIChjb25maWctPnR5cGVfKSB7CisgICAgICAgIGNhc2UgRkVBVFVSRV9BTk1GOgorICAgICAgICAgIG9rID0gR2V0RnJhbWUobXV4LCBjb25maWcpOworICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgRkVBVFVSRV9JQ0NQOgorICAgICAgICBjYXNlIEZFQVRVUkVfRVhJRjoKKyAgICAgICAgY2FzZSBGRUFUVVJFX1hNUDoKKyAgICAgICAgICBlcnIgPSBXZWJQTXV4R2V0Q2h1bmsobXV4LCBrRm91cmNjTGlzdFtjb25maWctPnR5cGVfXSwgJmNodW5rKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMygiRVJST1IgKCVzKTogQ291bGQgbm90IGdldCB0aGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwga0Rlc2NyaXB0aW9uc1tjb25maWctPnR5cGVfXSwgRXJyMik7CisgICAgICAgICAgfQorICAgICAgICAgIG9rID0gV3JpdGVEYXRhKGNvbmZpZy0+b3V0cHV0XywgJmNodW5rKTsKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogSW52YWxpZCBmZWF0dXJlIGZvciBhY3Rpb24gJ2dldCcuXG4iLCBFcnIyKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFDVElPTl9TRVQ6IHsKKyAgICAgIHN3aXRjaCAoY29uZmlnLT50eXBlXykgeworICAgICAgICBjYXNlIEZFQVRVUkVfQU5NRjogeworICAgICAgICAgIGludCBpOworICAgICAgICAgIFdlYlBNdXhBbmltUGFyYW1zIHBhcmFtcyA9IHsgMHhGRkZGRkZGRiwgMCB9OworICAgICAgICAgIG11eCA9IFdlYlBNdXhOZXcoKTsKKyAgICAgICAgICBpZiAobXV4ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUiAoJXMpOiBDb3VsZCBub3QgYWxsb2NhdGUgYSBtdXggb2JqZWN0LlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKFdFQlBfTVVYX01FTU9SWV9FUlJPUiksIEVycjIpOworICAgICAgICAgIH0KKyAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5hcmdfY291bnRfOyArK2kpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY29uZmlnLT5hcmdzX1tpXS5zdWJ0eXBlXykgeworICAgICAgICAgICAgICBjYXNlIFNVQlRZUEVfQkdDT0xPUjogeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGJnY29sb3I7CisgICAgICAgICAgICAgICAgb2sgPSBQYXJzZUJnY29sb3JBcmdzKGNvbmZpZy0+YXJnc19baV0ucGFyYW1zXywgJmJnY29sb3IpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogQ291bGQgbm90IHBhcnNlIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJhbXMuYmdjb2xvciA9IGJnY29sb3I7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgY2FzZSBTVUJUWVBFX0xPT1A6IHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyc2VfZXJyb3IgPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGludCBsb29wX2NvdW50ID0KKyAgICAgICAgICAgICAgICAgICAgRXhVdGlsR2V0SW50KGNvbmZpZy0+YXJnc19baV0ucGFyYW1zXywgMTAsICZwYXJzZV9lcnJvcik7CisgICAgICAgICAgICAgICAgaWYgKGxvb3BfY291bnQgPCAwIHx8IGxvb3BfY291bnQgPiA2NTUzNSkgeworICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhpcyBpcyBvbmx5IGEgJ25lY2Vzc2FyeScgY29uZGl0aW9uIGZvciBsb29wX2NvdW50CisgICAgICAgICAgICAgICAgICAvLyB0byBiZSB2YWxpZC4gVGhlICdzdWZmaWNpZW50JyBjb25kaXRpb25lZCBpbiBjaGVja2VkIGluCisgICAgICAgICAgICAgICAgICAvLyBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKCkgbWV0aG9kIGNhbGxlZCBsYXRlci4KKyAgICAgICAgICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogTG9vcCBjb3VudCBtdXN0IGJlIGluIHRoZSByYW5nZSAwIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NTUzNS5cbiIsIEVycjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvayA9ICFwYXJzZV9lcnJvcjsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICAgICAgICAgICAgcGFyYW1zLmxvb3BfY291bnQgPSBsb29wX2NvdW50OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGNhc2UgU1VCVFlQRV9BTk1GOiB7CisgICAgICAgICAgICAgICAgV2ViUE11eEZyYW1lSW5mbyBmcmFtZTsKKyAgICAgICAgICAgICAgICBmcmFtZS5pZCA9IFdFQlBfQ0hVTktfQU5NRjsKKyAgICAgICAgICAgICAgICBvayA9IEV4VXRpbFJlYWRGaWxlVG9XZWJQRGF0YShjb25maWctPmFyZ3NfW2ldLmZpbGVuYW1lXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWUuYml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICAgICAgICAgICAgb2sgPSBQYXJzZUZyYW1lQXJncyhjb25maWctPmFyZ3NfW2ldLnBhcmFtc18sICZmcmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgV2ViUERhdGFDbGVhcigmZnJhbWUuYml0c3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogQ291bGQgbm90IHBhcnNlIGZyYW1lIHByb3BlcnRpZXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IFdlYlBNdXhQdXNoRnJhbWUobXV4LCAmZnJhbWUsIDEpOworICAgICAgICAgICAgICAgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lLmJpdHN0cmVhbSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgICAgICAgICAgRVJST1JfR09UTzMoIkVSUk9SICglcyk6IENvdWxkIG5vdCBhZGQgYSBmcmFtZSBhdCBpbmRleCAlZC4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iLCBFcnJvclN0cmluZyhlcnIpLCBpLCBFcnIyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIEVSUk9SX0dPVE8xKCJFUlJPUjogSW52YWxpZCBzdWJ0eXBlIGZvciAnZnJhbWUnIiwgRXJyMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZXJyID0gV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcyhtdXgsICZwYXJhbXMpOworICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgICAgICAgIEVSUk9SX0dPVE8yKCJFUlJPUiAoJXMpOiBDb3VsZCBub3Qgc2V0IGFuaW1hdGlvbiBwYXJhbWV0ZXJzLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIEVycjIpOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRkVBVFVSRV9JQ0NQOgorICAgICAgICBjYXNlIEZFQVRVUkVfRVhJRjoKKyAgICAgICAgY2FzZSBGRUFUVVJFX1hNUDogeworICAgICAgICAgIG9rID0gQ3JlYXRlTXV4KGNvbmZpZy0+aW5wdXRfLCAmbXV4KTsKKyAgICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICAgICAgb2sgPSBFeFV0aWxSZWFkRmlsZVRvV2ViUERhdGEoY29uZmlnLT5hcmdzX1swXS5maWxlbmFtZV8sICZjaHVuayk7CisgICAgICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgICAgIGVyciA9IFdlYlBNdXhTZXRDaHVuayhtdXgsIGtGb3VyY2NMaXN0W2NvbmZpZy0+dHlwZV9dLCAmY2h1bmssIDEpOworICAgICAgICAgIGZyZWUoKHZvaWQqKWNodW5rLmJ5dGVzKTsKKyAgICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMygiRVJST1IgKCVzKTogQ291bGQgbm90IHNldCB0aGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JTdHJpbmcoZXJyKSwga0Rlc2NyaXB0aW9uc1tjb25maWctPnR5cGVfXSwgRXJyMik7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEludmFsaWQgZmVhdHVyZSBmb3IgYWN0aW9uICdzZXQnLlxuIiwgRXJyMik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG9rID0gV3JpdGVXZWJQKG11eCwgY29uZmlnLT5vdXRwdXRfKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEFDVElPTl9EVVJBVElPTjogeworICAgICAgaW50IG51bV9mcmFtZXM7CisgICAgICBvayA9IENyZWF0ZU11eChjb25maWctPmlucHV0XywgJm11eCk7CisgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICBlcnIgPSBXZWJQTXV4TnVtQ2h1bmtzKG11eCwgV0VCUF9DSFVOS19BTk1GLCAmbnVtX2ZyYW1lcyk7CisgICAgICBvayA9IChlcnIgPT0gV0VCUF9NVVhfT0spOworICAgICAgaWYgKCFvaykgeworICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IGNhbiBub3QgcGFyc2UgdGhlIG51bWJlciBvZiBmcmFtZXMuXG4iLCBFcnIyKTsKKyAgICAgIH0KKyAgICAgIGlmIChudW1fZnJhbWVzID09IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJEb2Vzbid0IGxvb2sgbGlrZSB0aGUgc291cmNlIGlzIGFuaW1hdGVkLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU2tpcHBpbmcgZHVyYXRpb24gc2V0dGluZy5cbiIpOworICAgICAgICBvayA9IFdyaXRlV2ViUChtdXgsIGNvbmZpZy0+b3V0cHV0Xyk7CisgICAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQqIGR1cmF0aW9ucyA9IE5VTEw7CisgICAgICAgIFdlYlBNdXgqIG5ld19tdXggPSBEdXBsaWNhdGVNdXhIZWFkZXIobXV4KTsKKyAgICAgICAgaWYgKG5ld19tdXggPT0gTlVMTCkgZ290byBFcnIyOworICAgICAgICBkdXJhdGlvbnMgPSAoaW50KiltYWxsb2MoKHNpemVfdCludW1fZnJhbWVzICogc2l6ZW9mKCpkdXJhdGlvbnMpKTsKKyAgICAgICAgaWYgKGR1cmF0aW9ucyA9PSBOVUxMKSBnb3RvIEVycjI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fZnJhbWVzOyArK2kpIGR1cmF0aW9uc1tpXSA9IC0xOworCisgICAgICAgIC8vIFBhcnNlIGludGVydmFscyB0byBwcm9jZXNzLgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29uZmlnLT5hcmdfY291bnRfOyArK2kpIHsKKyAgICAgICAgICBpbnQgazsKKyAgICAgICAgICBpbnQgYXJnc1szXTsKKyAgICAgICAgICBpbnQgZHVyYXRpb24sIHN0YXJ0LCBlbmQ7CisgICAgICAgICAgY29uc3QgaW50IG5iX2FyZ3MgPSBFeFV0aWxHZXRJbnRzKGNvbmZpZy0+YXJnc19baV0ucGFyYW1zXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDMsIGFyZ3MpOworICAgICAgICAgIG9rID0gKG5iX2FyZ3MgPj0gMSk7CisgICAgICAgICAgaWYgKCFvaykgZ290byBFcnIzOworICAgICAgICAgIGR1cmF0aW9uID0gYXJnc1swXTsKKyAgICAgICAgICBpZiAoZHVyYXRpb24gPCAwKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IGR1cmF0aW9uIG11c3QgYmUgc3RyaWN0bHkgcG9zaXRpdmUuXG4iLCBFcnIzKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBpZiAobmJfYXJncyA9PSAxKSB7ICAgLy8gb25seSBkdXJhdGlvbiBpcyBwcmVzZW50IC0+IHVzZSBmdWxsIGludGVydmFsCisgICAgICAgICAgICBzdGFydCA9IDE7CisgICAgICAgICAgICBlbmQgPSBudW1fZnJhbWVzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCA9IGFyZ3NbMV07CisgICAgICAgICAgICBpZiAoc3RhcnQgPD0gMCkgeworICAgICAgICAgICAgICBzdGFydCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID4gbnVtX2ZyYW1lcykgeworICAgICAgICAgICAgICBzdGFydCA9IG51bV9mcmFtZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbmQgPSAobmJfYXJncyA+PSAzKSA/IGFyZ3NbMl0gOiBzdGFydDsKKyAgICAgICAgICAgIGlmIChlbmQgPT0gMCB8fCBlbmQgPiBudW1fZnJhbWVzKSBlbmQgPSBudW1fZnJhbWVzOworICAgICAgICAgIH0KKworICAgICAgICAgIGZvciAoayA9IHN0YXJ0OyBrIDw9IGVuZDsgKytrKSB7CisgICAgICAgICAgICBhc3NlcnQoayA+PSAxICYmIGsgPD0gbnVtX2ZyYW1lcyk7CisgICAgICAgICAgICBkdXJhdGlvbnNbayAtIDFdID0gZHVyYXRpb247CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQXBwbHkgbm9uLW5lZ2F0aXZlIGR1cmF0aW9ucyB0byB0aGVpciBkZXN0aW5hdGlvbiBmcmFtZXMuCisgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gbnVtX2ZyYW1lczsgKytpKSB7CisgICAgICAgICAgV2ViUE11eEZyYW1lSW5mbyBmcmFtZTsKKyAgICAgICAgICBlcnIgPSBXZWJQTXV4R2V0RnJhbWUobXV4LCBpLCAmZnJhbWUpOworICAgICAgICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0sgfHwgZnJhbWUuaWQgIT0gV0VCUF9DSFVOS19BTk1GKSB7CisgICAgICAgICAgICBFUlJPUl9HT1RPMigiRVJST1I6IGNhbiBub3QgcmV0cmlldmUgZnJhbWUgIyVkLlxuIiwgaSwgRXJyMyk7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChkdXJhdGlvbnNbaSAtIDFdID49IDApIGZyYW1lLmR1cmF0aW9uID0gZHVyYXRpb25zW2kgLSAxXTsKKyAgICAgICAgICBlcnIgPSBXZWJQTXV4UHVzaEZyYW1lKG5ld19tdXgsICZmcmFtZSwgMSk7CisgICAgICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgeworICAgICAgICAgICAgRVJST1JfR09UTzIoIkVSUk9SOiBlcnJvciBwdXNoIGZyYW1lIGRhdGEgIyVkXG4iLCBpLCBFcnIzKTsKKyAgICAgICAgICB9CisgICAgICAgICAgV2ViUERhdGFDbGVhcigmZnJhbWUuYml0c3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBXZWJQTXV4RGVsZXRlKG11eCk7CisgICAgICAgIG9rID0gV3JpdGVXZWJQKG5ld19tdXgsIGNvbmZpZy0+b3V0cHV0Xyk7CisgICAgICAgIG11eCA9IG5ld19tdXg7ICAvLyB0cmFuc2ZlciBmb3IgdGhlIFdlYlBNdXhEZWxldGUoKSBjYWxsCisgICAgICAgIG5ld19tdXggPSBOVUxMOworCisgRXJyMzoKKyAgICAgICAgZnJlZShkdXJhdGlvbnMpOworICAgICAgICBXZWJQTXV4RGVsZXRlKG5ld19tdXgpOworICAgICAgICBpZiAoIW9rKSBnb3RvIEVycjI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBQ1RJT05fU1RSSVA6IHsKKyAgICAgIG9rID0gQ3JlYXRlTXV4KGNvbmZpZy0+aW5wdXRfLCAmbXV4KTsKKyAgICAgIGlmICghb2spIGdvdG8gRXJyMjsKKyAgICAgIGlmIChjb25maWctPnR5cGVfID09IEZFQVRVUkVfSUNDUCB8fCBjb25maWctPnR5cGVfID09IEZFQVRVUkVfRVhJRiB8fAorICAgICAgICAgIGNvbmZpZy0+dHlwZV8gPT0gRkVBVFVSRV9YTVApIHsKKyAgICAgICAgZXJyID0gV2ViUE11eERlbGV0ZUNodW5rKG11eCwga0ZvdXJjY0xpc3RbY29uZmlnLT50eXBlX10pOworICAgICAgICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSB7CisgICAgICAgICAgRVJST1JfR09UTzMoIkVSUk9SICglcyk6IENvdWxkIG5vdCBzdHJpcCB0aGUgJXMuXG4iLAorICAgICAgICAgICAgICAgICAgICAgIEVycm9yU3RyaW5nKGVyciksIGtEZXNjcmlwdGlvbnNbY29uZmlnLT50eXBlX10sIEVycjIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBFUlJPUl9HT1RPMSgiRVJST1I6IEludmFsaWQgZmVhdHVyZSBmb3IgYWN0aW9uICdzdHJpcCcuXG4iLCBFcnIyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBvayA9IFdyaXRlV2ViUChtdXgsIGNvbmZpZy0+b3V0cHV0Xyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBBQ1RJT05fSU5GTzogeworICAgICAgb2sgPSBDcmVhdGVNdXgoY29uZmlnLT5pbnB1dF8sICZtdXgpOworICAgICAgaWYgKCFvaykgZ290byBFcnIyOworICAgICAgb2sgPSAoRGlzcGxheUluZm8obXV4KSA9PSBXRUJQX01VWF9PSyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgYXNzZXJ0KDApOyAgLy8gSW52YWxpZCBhY3Rpb24uCisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworIEVycjI6CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgcmV0dXJuIG9rOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbi4KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGFyZ3ZbXSkgeworICBDb25maWcgY29uZmlnOworICBpbnQgb2sgPSBJbml0aWFsaXplQ29uZmlnKGFyZ2MgLSAxLCBhcmd2ICsgMSwgJmNvbmZpZyk7CisgIGlmIChvaykgeworICAgIG9rID0gUHJvY2VzcygmY29uZmlnKTsKKyAgfSBlbHNlIHsKKyAgICBQcmludEhlbHAoKTsKKyAgfQorICBEZWxldGVDb25maWcoJmNvbmZpZyk7CisgIHJldHVybiAhb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkNTY3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQ0IEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwZXh0cmFzLmxhCisKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL3NyYy93ZWJwL3R5cGVzLmgKKworbGlid2VicGV4dHJhc19sYV9TT1VSQ0VTID0KK2xpYndlYnBleHRyYXNfbGFfU09VUkNFUyArPSBleHRyYXMuYyBleHRyYXMuaCBxdWFsaXR5X2VzdGltYXRlLmMKKworbGlid2VicGV4dHJhc19sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCitsaWJ3ZWJwZXh0cmFzX2xhX0xERkxBR1MgPSAtbG0KK2xpYndlYnBleHRyYXNfbGFfTElCQUREID0gLi4vc3JjL2xpYndlYnAubGEKKworbm9pbnN0X1BST0dSQU1TID0KK25vaW5zdF9QUk9HUkFNUyArPSB3ZWJwX3F1YWxpdHkKK2lmIFdBTlRfREVNVVgKKyAgbm9pbnN0X1BST0dSQU1TICs9IGdldF9kaXN0bworZW5kaWYKK2lmIEJVSUxEX1ZXRUJQX1NETAorICBub2luc3RfUFJPR1JBTVMgKz0gdndlYnBfc2RsCitlbmRpZgorCitnZXRfZGlzdG9fU09VUkNFUyAgPSBnZXRfZGlzdG8uYworZ2V0X2Rpc3RvX0NQUEZMQUdTID0gJChBTV9DUFBGTEFHUykKK2dldF9kaXN0b19MREFERCA9CitnZXRfZGlzdG9fTERBREQgKz0gLi4vaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwubGEKK2dldF9kaXN0b19MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlZGVjLmxhCitnZXRfZGlzdG9fTERBREQgKz0gLi4vc3JjL2xpYndlYnAubGEKK2dldF9kaXN0b19MREFERCArPSAkKFBOR19MSUJTKSAkKEpQRUdfTElCUykgJChUSUZGX0xJQlMpCisKK3dlYnBfcXVhbGl0eV9TT1VSQ0VTICA9IHdlYnBfcXVhbGl0eS5jCit3ZWJwX3F1YWxpdHlfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQord2VicF9xdWFsaXR5X0xEQUREID0KK3dlYnBfcXVhbGl0eV9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQord2VicF9xdWFsaXR5X0xEQUREICs9IGxpYndlYnBleHRyYXMubGEKK3dlYnBfcXVhbGl0eV9MREFERCArPSAuLi9zcmMvbGlid2VicC5sYQorCit2d2VicF9zZGxfU09VUkNFUyAgPSB2d2VicF9zZGwuYyB3ZWJwX3RvX3NkbC5jIHdlYnBfdG9fc2RsLmgKK3Z3ZWJwX3NkbF9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpICQoU0RMX0lOQ0xVREVTKQordndlYnBfc2RsX0xEQUREID0KK3Z3ZWJwX3NkbF9MREFERCArPSAuLi9pbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5sYQordndlYnBfc2RsX0xEQUREICs9IC4uL3NyYy9saWJ3ZWJwLmxhCit2d2VicF9zZGxfTERBREQgKz0gJChTRExfTElCUykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9leHRyYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmViNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5jCkBAIC0wLDAgKzEsMTQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEFkZGl0aW9uYWwgV2ViUCB1dGlsaXRpZXMuCisvLworCisjaW5jbHVkZSAiZXh0cmFzL2V4dHJhcy5oIgorI2luY2x1ZGUgIndlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgWFRSQV9NQUpfVkVSU0lPTiAxCisjZGVmaW5lIFhUUkFfTUlOX1ZFUlNJT04gMAorI2RlZmluZSBYVFJBX1JFVl9WRVJTSU9OIDAKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBHZXRFeHRyYXNWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChYVFJBX01BSl9WRVJTSU9OIDw8IDE2KSB8IChYVFJBX01JTl9WRVJTSU9OIDw8IDgpIHwgWFRSQV9SRVZfVkVSU0lPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBJbXBvcnRHcmF5KGNvbnN0IHVpbnQ4X3QqIGdyYXlfZGF0YSwgV2ViUFBpY3R1cmUqIHBpYykgeworICBpbnQgeSwgd2lkdGgsIHV2X3dpZHRoOworICBpZiAocGljID09IE5VTEwgfHwgZ3JheV9kYXRhID09IE5VTEwpIHJldHVybiAwOworICBwaWMtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpYykpIHJldHVybiAwOworICB3aWR0aCA9IHBpYy0+d2lkdGg7CisgIHV2X3dpZHRoID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICBtZW1jcHkocGljLT55ICsgeSAqIHBpYy0+eV9zdHJpZGUsIGdyYXlfZGF0YSwgd2lkdGgpOworICAgIGdyYXlfZGF0YSArPSB3aWR0aDsgICAgLy8gPC0gd2UgY291bGQgdXNlIHNvbWUgJ2RhdGFfc3RyaWRlJyBoZXJlIGlmIG5lZWRlZAorICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgIG1lbXNldChwaWMtPnUgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlLCAxMjgsIHV2X3dpZHRoKTsKKyAgICAgIG1lbXNldChwaWMtPnYgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlLCAxMjgsIHV2X3dpZHRoKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQSW1wb3J0UkdCNTY1KGNvbnN0IHVpbnQ4X3QqIHJnYjU2NSwgV2ViUFBpY3R1cmUqIHBpYykgeworICBpbnQgeCwgeTsKKyAgdWludDMyX3QqIGRzdDsKKyAgaWYgKHBpYyA9PSBOVUxMIHx8IHJnYjU2NSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGljLT5jb2xvcnNwYWNlID0gV0VCUF9ZVVY0MjA7CisgIHBpYy0+dXNlX2FyZ2IgPSAxOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljKSkgcmV0dXJuIDA7CisgIGRzdCA9IHBpYy0+YXJnYjsKKyAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisjaWZkZWYgV0VCUF9TV0FQXzE2QklUX0NTUAorICAgICAgY29uc3QgdWludDMyX3QgcmcgPSByZ2I1NjVbMiAqIHggKyAxXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGdiID0gcmdiNTY1WzIgKiB4ICsgMF07CisjZWxzZQorICAgICAgY29uc3QgdWludDMyX3QgcmcgPSByZ2I1NjVbMiAqIHggKyAwXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGdiID0gcmdiNTY1WzIgKiB4ICsgMV07CisjZW5kaWYKKyAgICAgIHVpbnQzMl90IHIgPSByZyAmIDB4Zjg7CisgICAgICB1aW50MzJfdCBnID0gKChyZyA8PCA1KSB8IChnYiA+PiAzKSkgJiAweGZjOworICAgICAgdWludDMyX3QgYiA9IChnYiA8PCA1KTsKKyAgICAgIC8vIGRpdGhlcmluZworICAgICAgciA9IHIgfCAociA+PiA1KTsKKyAgICAgIGcgPSBnIHwgKGcgPj4gNik7CisgICAgICBiID0gYiB8IChiID4+IDUpOworICAgICAgZHN0W3hdID0gKDB4ZmZ1IDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKKyAgICB9CisgICAgcmdiNTY1ICs9IDIgKiB3aWR0aDsKKyAgICBkc3QgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFdlYlBJbXBvcnRSR0I0NDQ0KGNvbnN0IHVpbnQ4X3QqIHJnYjQ0NDQsIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHgsIHk7CisgIHVpbnQzMl90KiBkc3Q7CisgIGlmIChwaWMgPT0gTlVMTCB8fCByZ2I0NDQ0ID09IE5VTEwpIHJldHVybiAwOworICBwaWMtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgcGljLT51c2VfYXJnYiA9IDE7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYyhwaWMpKSByZXR1cm4gMDsKKyAgZHN0ID0gcGljLT5hcmdiOworICBmb3IgKHkgPSAwOyB5IDwgcGljLT5oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IGludCB3aWR0aCA9IHBpYy0+d2lkdGg7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyNpZmRlZiBXRUJQX1NXQVBfMTZCSVRfQ1NQCisgICAgICBjb25zdCB1aW50MzJfdCByZyA9IHJnYjQ0NDRbMiAqIHggKyAxXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGJhID0gcmdiNDQ0NFsyICogeCArIDBdOworI2Vsc2UKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiNDQ0NFsyICogeCArIDBdOworICAgICAgY29uc3QgdWludDMyX3QgYmEgPSByZ2I0NDQ0WzIgKiB4ICsgMV07CisjZW5kaWYKKyAgICAgIHVpbnQzMl90IHIgPSByZyAmIDB4ZjA7CisgICAgICB1aW50MzJfdCBnID0gKHJnIDw8IDQpOworICAgICAgdWludDMyX3QgYiA9IChiYSAmIDB4ZjApOworICAgICAgdWludDMyX3QgYSA9IChiYSA8PCA0KTsKKyAgICAgIC8vIGRpdGhlcmluZworICAgICAgciA9IHIgfCAociA+PiA0KTsKKyAgICAgIGcgPSBnIHwgKGcgPj4gNCk7CisgICAgICBiID0gYiB8IChiID4+IDQpOworICAgICAgYSA9IGEgfCAoYSA+PiA0KTsKKyAgICAgIGRzdFt4XSA9IChhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKKyAgICB9CisgICAgcmdiNDQ0NCArPSAyICogd2lkdGg7CisgICAgZHN0ICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQSW1wb3J0Q29sb3JNYXBwZWRBUkdCKGNvbnN0IHVpbnQ4X3QqIGluZGV4ZWQsIGludCBpbmRleGVkX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IHBhbGV0dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHgsIHk7CisgIHVpbnQzMl90KiBkc3Q7CisgIC8vIDI1NiBhcyB0aGUgaW5wdXQgYnVmZmVyIGlzIHVpbnQ4X3QuCisgIGFzc2VydChNQVhfUEFMRVRURV9TSVpFIDw9IDI1Nik7CisgIGlmIChwaWMgPT0gTlVMTCB8fCBpbmRleGVkID09IE5VTEwgfHwgaW5kZXhlZF9zdHJpZGUgPCBwaWMtPndpZHRoIHx8CisgICAgICBwYWxldHRlID09IE5VTEwgfHwgcGFsZXR0ZV9zaXplID4gTUFYX1BBTEVUVEVfU0laRSB8fCBwYWxldHRlX3NpemUgPD0gMCkgeworICAgIHJldHVybiAwOworICB9CisgIHBpYy0+dXNlX2FyZ2IgPSAxOworICBpZiAoIVdlYlBQaWN0dXJlQWxsb2MocGljKSkgcmV0dXJuIDA7CisgIGRzdCA9IHBpYy0+YXJnYjsKKyAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgcGljLT53aWR0aDsgKyt4KSB7CisgICAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIHdpdGhpbiB0aGUgcGFsZXR0ZS4KKyAgICAgIGlmIChpbmRleGVkW3hdID49IHBhbGV0dGVfc2l6ZSkgeworICAgICAgICBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBkc3RbeF0gPSBwYWxldHRlW2luZGV4ZWRbeF1dOworICAgIH0KKyAgICBpbmRleGVkICs9IGluZGV4ZWRfc3RyaWRlOworICAgIGRzdCArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL2V4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDQzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZXh0cmFzLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworI2lmbmRlZiBXRUJQX0VYVFJBU19FWFRSQVNfSF8KKyNkZWZpbmUgV0VCUF9FWFRSQVNfRVhUUkFTX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKyNkZWZpbmUgV0VCUF9FWFRSQVNfQUJJX1ZFUlNJT04gMHgwMDAxICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZXh0cmFzIGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZworLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgorV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRFeHRyYXNWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWQtaG9jIGNvbG9yc3BhY2UgaW1wb3J0ZXJzLgorCisvLyBJbXBvcnQgbHVtYSBzYW1wbGUgKGdyYXkgc2NhbGUgaW1hZ2UpIGludG8gJ3BpY3R1cmUnLiBUaGUgJ3BpY3R1cmUnCisvLyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KK1dFQlBfRVhURVJOIGludCBXZWJQSW1wb3J0R3JheShjb25zdCB1aW50OF90KiBncmF5LCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIEltcG9ydCByZ2Igc2FtcGxlIGluIFJHQjU2NSBwYWNrZWQgZm9ybWF0IGludG8gJ3BpY3R1cmUnLiBUaGUgJ3BpY3R1cmUnCisvLyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgc2V0IHByaW9yIHRvIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KK1dFQlBfRVhURVJOIGludCBXZWJQSW1wb3J0UkdCNTY1KGNvbnN0IHVpbnQ4X3QqIHJnYjU2NSwgV2ViUFBpY3R1cmUqIHBpYyk7CisKKy8vIEltcG9ydCByZ2Igc2FtcGxlIGluIFJHQjQ0NDQgcGFja2VkIGZvcm1hdCBpbnRvICdwaWN0dXJlJy4gVGhlICdwaWN0dXJlJworLy8gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIHNldCBwcmlvciB0byBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCitXRUJQX0VYVEVSTiBpbnQgV2ViUEltcG9ydFJHQjQ0NDQoY29uc3QgdWludDhfdCogcmdiNDQ0NCwgV2ViUFBpY3R1cmUqIHBpYyk7CisKKy8vIEltcG9ydCBhIGNvbG9yIG1hcHBlZCBpbWFnZS4gVGhlIG51bWJlciBvZiBjb2xvcnMgaXMgbGVzcyBvciBlcXVhbCB0bworLy8gTUFYX1BBTEVUVEVfU0laRS4gJ3BpYycgbXVzdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuIEl0cyBjb250ZW50LCBpZiBhbnksCisvLyB3aWxsIGJlIGRpc2NhcmRlZC4gUmV0dXJucyAnZmFsc2UnIGluIGNhc2Ugb2YgZXJyb3IsIG9yIGlmIGluZGV4ZWRbXSBjb250YWlucworLy8gaW52YWxpZCBpbmRpY2VzLgorV0VCUF9FWFRFUk4gaW50CitXZWJQSW1wb3J0Q29sb3JNYXBwZWRBUkdCKGNvbnN0IHVpbnQ4X3QqIGluZGV4ZWQsIGludCBpbmRleGVkX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcGFsZXR0ZVtdLCBpbnQgcGFsZXR0ZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogcGljKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUGFyc2UgYSBiaXRzdHJlYW0sIHNlYXJjaCBmb3IgVlA4IChsb3NzeSkgaGVhZGVyIGFuZCByZXBvcnQgYQorLy8gcm91Z2ggZXN0aW1hdGlvbiBvZiB0aGUgcXVhbGl0eSBmYWN0b3IgdXNlZCBmb3IgY29tcHJlc3NpbmcgdGhlIGJpdHN0cmVhbS4KKy8vIElmIHRoZSBiaXRzdHJlYW0gaXMgaW4gbG9zc2xlc3MgZm9ybWF0LCB0aGUgc3BlY2lhbCB2YWx1ZSAnMTAxJyBpcyByZXR1cm5lZC4KKy8vIE90aGVyd2lzZSAobG9zc3kgYml0c3RyZWFtKSwgdGhlIHJldHVybmVkIHZhbHVlIGlzIGluIHRoZSByYW5nZSBbMC4uMTAwXS4KKy8vIEFueSBlcnJvciAoaW52YWxpZCBiaXRzdHJlYW0sIGFuaW1hdGVkIFdlYlAsIGluY29tcGxldGUgaGVhZGVyLCBldGMuKQorLy8gd2lsbCByZXR1cm4gYSB2YWx1ZSBvZiAtMS4KK1dFQlBfRVhURVJOIGludCBWUDhFc3RpbWF0ZVF1YWxpdHkoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9FWFRSQVNfRVhUUkFTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZ2V0X2Rpc3RvLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvZ2V0X2Rpc3RvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwNjE0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9nZXRfZGlzdG8uYwpAQCAtMCwwICsxLDM1MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNpbXBsZSB0b29sIHRvIGxvYWQgdHdvIHdlYnAvcG5nL2pwZy90aWZmIGZpbGVzIGFuZCBjb21wdXRlIFBTTlIvU1NJTS4KKy8vIFRoaXMgaXMgbW9zdGx5IGEgd3JhcHBlciBhcm91bmQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKCkuCisvLworLyoKKyBnY2MgLW8gZ2V0X2Rpc3RvIGdldF9kaXN0by5jIC1PMyAtSS4uLyAtTC4uL2V4YW1wbGVzIC1MLi4vaW1hZ2VpbyBcCisgICAgLWxleGFtcGxlX3V0aWwgLWxpbWFnZWlvX3V0aWwgLWxpbWFnZWRlYyAtbHdlYnAgLUwvb3B0L2xvY2FsL2xpYiBcCisgICAgLWxwbmcgLWx6IC1sanBlZyAtbHRpZmYgLWxtIC1scHRocmVhZAorKi8KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiaW1hZ2Vpby9pbWFnZV9kZWMuaCIKKyNpbmNsdWRlICJpbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCitzdGF0aWMgc2l6ZV90IFJlYWRQaWN0dXJlKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSkgeworICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgIFdlYlBJbWFnZVJlYWRlciByZWFkZXIgPSBOVUxMOworICBpbnQgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICBpZiAoIW9rKSBnb3RvIEVuZDsKKworICBwaWMtPnVzZV9hcmdiID0gMTsgIC8vIGZvcmNlIEFSR0IKKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICAvLyBUcnkgdG8gZGVjb2RlIHRoZSBmaWxlIHVzaW5nIFdJQyBmYWxsaW5nIGJhY2sgdG8gdGhlIG90aGVyIHJlYWRlcnMgZm9yCisgIC8vIGUuZy4sIFdlYlAuCisgIG9rID0gUmVhZFBpY3R1cmVXaXRoV0lDKGZpbGVuYW1lLCBwaWMsIGtlZXBfYWxwaGEsIE5VTEwpOworICBpZiAob2spIGdvdG8gRW5kOworI2VuZGlmCisgIHJlYWRlciA9IFdlYlBHdWVzc0ltYWdlUmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSk7CisgIG9rID0gcmVhZGVyKGRhdGEsIGRhdGFfc2l6ZSwgcGljLCBrZWVwX2FscGhhLCBOVUxMKTsKKworIEVuZDoKKyAgaWYgKCFvaykgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IhIENvdWxkIG5vdCBwcm9jZXNzIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgfQorICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgcmV0dXJuIG9rID8gZGF0YV9zaXplIDogMDsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZVBsYW5lKHVpbnQ4X3QqIHBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfc3RyaWRlLCBpbnQgeV9zdHJpZGUsIGludCBtYXgpIHsKKyAgY29uc3QgdWludDMyX3QgZmFjdG9yID0gKG1heCA+IDApID8gKDI1NXUgPDwgMTYpIC8gbWF4IDogMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHB0ciA9IHBsYW5lICsgeSAqIHlfc3RyaWRlOworICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aCAqIHhfc3RyaWRlOyB4ICs9IHhfc3RyaWRlKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBkaWZmID0gKHB0clt4XSAqIGZhY3RvciArICgxIDw8IDE1KSkgPj4gMTY7CisgICAgICBwdHJbeF0gPSBkaWZmOworICAgIH0KKyAgfQorfQorCisvLyBSZXR1cm4gdGhlIG1heCBhYnNvbHV0ZSBkaWZmZXJlbmNlLgorc3RhdGljIGludCBEaWZmU2NhbGVDaGFubmVsKHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3N0cmlkZSwgaW50IHcsIGludCBoLCBpbnQgZG9fc2NhbGluZykgeworICBpbnQgeCwgeTsKKyAgaW50IG1heCA9IDA7CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICB1aW50OF90KiBjb25zdCBwdHIxID0gc3JjMSArIHkgKiBzdHJpZGUxOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHB0cjIgPSBzcmMyICsgeSAqIHN0cmlkZTI7CisgICAgZm9yICh4ID0gMDsgeCA8IHcgKiB4X3N0cmlkZTsgeCArPSB4X3N0cmlkZSkgeworICAgICAgY29uc3QgaW50IGRpZmYgPSBhYnMocHRyMVt4XSAtIHB0cjJbeF0pOworICAgICAgaWYgKGRpZmYgPiBtYXgpIG1heCA9IGRpZmY7CisgICAgICBwdHIxW3hdID0gZGlmZjsKKyAgICB9CisgIH0KKworICBpZiAoZG9fc2NhbGluZykgUmVzY2FsZVBsYW5lKHNyYzEsIHcsIGgsIHhfc3RyaWRlLCBzdHJpZGUxLCBtYXgpOworICByZXR1cm4gbWF4OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NJTSBjYWxjdWxhdGlvbi4gV2UgcmUtaW1wbGVtZW50IHRoZXNlIGZ1bmN0aW9ucyBoZXJlLCBvdXQgb2YgZHNwLywgdG8gYXZvaWQKKy8vIGJyZWFraW5nIHRoZSBsaWJyYXJ5J3MgaGlkZGVuIHZpc2liaWxpdHkuIFRoaXMgY29kZSBkdXBsaWNhdGlvbiBhdm9pZHMgdGhlCisvLyBiaWdnZXIgYW5ub3lhbmNlIG9mIGhhdmluZyB0byBvcGVuIHVwIGludGVybmFsIGRldGFpbHMgb2YgbGliZHNwLi4uCisKKyNkZWZpbmUgU1NJTV9LRVJORUwgMyAgIC8vIHRvdGFsIHNpemUgb2YgdGhlIGtlcm5lbDogMiAqIFNTSU1fS0VSTkVMICsgMQorCisvLyBzdHJ1Y3QgZm9yIGFjY3VtdWxhdGluZyBzdGF0aXN0aWNhbCBtb21lbnRzCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90IHc7ICAgICAgICAgICAgICAvLyBzdW0od19pKSA6IHN1bSBvZiB3ZWlnaHRzCisgIHVpbnQzMl90IHhtLCB5bTsgICAgICAgICAvLyBzdW0od19pICogeF9pKSwgc3VtKHdfaSAqIHlfaSkKKyAgdWludDMyX3QgeHhtLCB4eW0sIHl5bTsgIC8vIHN1bSh3X2kgKiB4X2kgKiB4X2kpLCBldGMuCit9IERpc3RvU3RhdHM7CisKKy8vIGhhdC1zaGFwZWQgZmlsdGVyLiBTdW0gb2YgY29lZmZpY2llbnRzIGlzIGVxdWFsIHRvIDE2Lgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtXZWlnaHRbMiAqIFNTSU1fS0VSTkVMICsgMV0gPSB7IDEsIDIsIDMsIDQsIDMsIDIsIDEgfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBTU0lNQ2FsY3VsYXRpb24oY29uc3QgRGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgY29uc3QgdWludDMyX3QgTiA9IHN0YXRzLT53OworICBjb25zdCB1aW50MzJfdCB3MiA9ICBOICogTjsKKyAgY29uc3QgdWludDMyX3QgQzEgPSAyMCAqIHcyOworICBjb25zdCB1aW50MzJfdCBDMiA9IDYwICogdzI7CisgIGNvbnN0IHVpbnQzMl90IEMzID0gOCAqIDggKiB3MjsgICAvLyAnZGFyaycgbGltaXQgfj0gNgorICBjb25zdCB1aW50NjRfdCB4bXhtID0gKHVpbnQ2NF90KXN0YXRzLT54bSAqIHN0YXRzLT54bTsKKyAgY29uc3QgdWludDY0X3QgeW15bSA9ICh1aW50NjRfdClzdGF0cy0+eW0gKiBzdGF0cy0+eW07CisgIGlmICh4bXhtICsgeW15bSA+PSBDMykgeworICAgIGNvbnN0IGludDY0X3QgeG15bSA9IChpbnQ2NF90KXN0YXRzLT54bSAqIHN0YXRzLT55bTsKKyAgICBjb25zdCBpbnQ2NF90IHN4eSA9IChpbnQ2NF90KXN0YXRzLT54eW0gKiBOIC0geG15bTsgICAgLy8gY2FuIGJlIG5lZ2F0aXZlCisgICAgY29uc3QgdWludDY0X3Qgc3h4ID0gKHVpbnQ2NF90KXN0YXRzLT54eG0gKiBOIC0geG14bTsKKyAgICBjb25zdCB1aW50NjRfdCBzeXkgPSAodWludDY0X3Qpc3RhdHMtPnl5bSAqIE4gLSB5bXltOworICAgIC8vIHdlIGRlc2NhbGUgYnkgOCB0byBwcmV2ZW50IG92ZXJmbG93IGR1cmluZyB0aGUgZm51bS9mZGVuIG11bHRpcGx5LgorICAgIGNvbnN0IHVpbnQ2NF90IG51bV9TID0gKDIgKiAodWludDY0X3QpKHN4eSA8IDAgPyAwIDogc3h5KSArIEMyKSA+PiA4OworICAgIGNvbnN0IHVpbnQ2NF90IGRlbl9TID0gKHN4eCArIHN5eSArIEMyKSA+PiA4OworICAgIGNvbnN0IHVpbnQ2NF90IGZudW0gPSAoMiAqIHhteW0gKyBDMSkgKiBudW1fUzsKKyAgICBjb25zdCB1aW50NjRfdCBmZGVuID0gKHhteG0gKyB5bXltICsgQzEpICogZGVuX1M7CisgICAgY29uc3QgZG91YmxlIHIgPSAoZG91YmxlKWZudW0gLyBmZGVuOworICAgIGFzc2VydChyID49IDAuICYmIHIgPD0gMS4wKTsKKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gMS47ICAgLy8gYXJlYSBpcyB0b28gZGFyayB0byBjb250cmlidXRlIG1lYW5pbmdmdWxseQorfQorCitzdGF0aWMgZG91YmxlIFNTSU1HZXRDbGlwcGVkKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvLCBpbnQgeW8sIGludCBXLCBpbnQgSCkgeworICBEaXN0b1N0YXRzIHN0YXRzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CisgIGNvbnN0IGludCB5bWluID0gKHlvIC0gU1NJTV9LRVJORUwgPCAwKSA/IDAgOiB5byAtIFNTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeW1heCA9ICh5byArIFNTSU1fS0VSTkVMID4gSCAtIDEpID8gSCAtIDEgOiB5byArIFNTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeG1pbiA9ICh4byAtIFNTSU1fS0VSTkVMIDwgMCkgPyAwIDogeG8gLSBTU0lNX0tFUk5FTDsKKyAgY29uc3QgaW50IHhtYXggPSAoeG8gKyBTU0lNX0tFUk5FTCA+IFcgLSAxKSA/IFcgLSAxIDogeG8gKyBTU0lNX0tFUk5FTDsKKyAgaW50IHgsIHk7CisgIHNyYzEgKz0geW1pbiAqIHN0cmlkZTE7CisgIHNyYzIgKz0geW1pbiAqIHN0cmlkZTI7CisgIGZvciAoeSA9IHltaW47IHkgPD0geW1heDsgKyt5LCBzcmMxICs9IHN0cmlkZTEsIHNyYzIgKz0gc3RyaWRlMikgeworICAgIGZvciAoeCA9IHhtaW47IHggPD0geG1heDsgKyt4KSB7CisgICAgICBjb25zdCB1aW50MzJfdCB3ID0ga1dlaWdodFtTU0lNX0tFUk5FTCArIHggLSB4b10KKyAgICAgICAgICAgICAgICAgICAgICAgKiBrV2VpZ2h0W1NTSU1fS0VSTkVMICsgeSAtIHlvXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMxID0gc3JjMVt4XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMyID0gc3JjMlt4XTsKKyAgICAgIHN0YXRzLncgICArPSB3OworICAgICAgc3RhdHMueG0gICs9IHcgKiBzMTsKKyAgICAgIHN0YXRzLnltICArPSB3ICogczI7CisgICAgICBzdGF0cy54eG0gKz0gdyAqIHMxICogczE7CisgICAgICBzdGF0cy54eW0gKz0gdyAqIHMxICogczI7CisgICAgICBzdGF0cy55eW0gKz0gdyAqIHMyICogczI7CisgICAgfQorICB9CisgIHJldHVybiBTU0lNQ2FsY3VsYXRpb24oJnN0YXRzKTsKK30KKworLy8gQ29tcHV0ZSBTU0lNLXNjb3JlIG1hcC4gUmV0dXJuIC0xIGluIGNhc2Ugb2YgZXJyb3IsIG1heCBkaWZmIG90aGVyd2lzZS4KK3N0YXRpYyBpbnQgU1NJTVNjYWxlQ2hhbm5lbCh1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdHJpZGUsIGludCB3LCBpbnQgaCwgaW50IGRvX3NjYWxpbmcpIHsKKyAgaW50IHgsIHk7CisgIGludCBtYXggPSAwOworICB1aW50OF90KiBjb25zdCBwbGFuZTEgPSAodWludDhfdCopbWFsbG9jKDIgKiB3ICogaCAqIHNpemVvZigqcGxhbmUxKSk7CisgIHVpbnQ4X3QqIGNvbnN0IHBsYW5lMiA9IHBsYW5lMSArIHcgKiBoOworICBpZiAocGxhbmUxID09IE5VTEwpIHJldHVybiAtMTsKKworICAvLyBleHRyYWN0IHBsYW5lCisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBwbGFuZTFbeCArIHkgKiB3XSA9IHNyYzFbeCAqIHhfc3RyaWRlICsgeSAqIHN0cmlkZTFdOworICAgICAgcGxhbmUyW3ggKyB5ICogd10gPSBzcmMyW3ggKiB4X3N0cmlkZSArIHkgKiBzdHJpZGUyXTsKKyAgICB9CisgIH0KKyAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICAgIGNvbnN0IGRvdWJsZSBzc2ltID0gU1NJTUdldENsaXBwZWQocGxhbmUxLCB3LCBwbGFuZTIsIHcsIHgsIHksIHcsIGgpOworICAgICAgaW50IGRpZmYgPSAoaW50KSgyNTUgKiAoMS4gLSBzc2ltKSk7CisgICAgICBpZiAoZGlmZiA8IDApIHsKKyAgICAgICAgZGlmZiA9IDA7CisgICAgICB9IGVsc2UgaWYgKGRpZmYgPiBtYXgpIHsKKyAgICAgICAgbWF4ID0gZGlmZjsKKyAgICAgIH0KKyAgICAgIHNyYzFbeCAqIHhfc3RyaWRlICsgeSAqIHN0cmlkZTFdID0gKGRpZmYgPiAyNTUpID8gMjU1dSA6ICh1aW50OF90KWRpZmY7CisgICAgfQorICB9CisgIGZyZWUocGxhbmUxKTsKKworICBpZiAoZG9fc2NhbGluZykgUmVzY2FsZVBsYW5lKHNyYzEsIHcsIGgsIHhfc3RyaWRlLCBzdHJpZGUxLCBtYXgpOworICByZXR1cm4gbWF4OworfQorCisvLyBDb252ZXJ0IGFuIGFyZ2IgcGljdHVyZSB0byBsdW1pbmFuY2UuCitzdGF0aWMgdm9pZCBDb252ZXJ0VG9HcmF5KFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpIHsKKyAgaW50IHgsIHk7CisgIGFzc2VydChwaWMgIT0gTlVMTCk7CisgIGFzc2VydChwaWMtPnVzZV9hcmdiKTsKKyAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICB1aW50MzJfdCogY29uc3Qgcm93ID0gJnBpYy0+YXJnYlt5ICogcGljLT5hcmdiX3N0cmlkZV07CisgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgeworICAgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IHJvd1t4XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHIgPSAoYXJnYiA+PiAxNikgJiAweGZmOworICAgICAgY29uc3QgdWludDMyX3QgZyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7CisgICAgICBjb25zdCB1aW50MzJfdCBiID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgICAgIC8vIFdlIHVzZSBCVC43MDkgZm9yIGNvbnZlcnRpbmcgdG8gbHVtaW5hbmNlLgorICAgICAgY29uc3QgdWludDMyX3QgWSA9ICh1aW50MzJfdCkoMC4yMTI2ICogciArIDAuNzE1MiAqIGcgKyAwLjA3MjIgKiBiICsgLjUpOworICAgICAgcm93W3hdID0gKGFyZ2IgJiAweGZmMDAwMDAwdSkgfCAoWSAqIDB4MDEwMTAxdSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEhlbHAodm9pZCkgeworICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAiVXNhZ2U6IGdldF9kaXN0byBbLXNzaW1dWy1wc25yXVstYWxwaGFdIGNvbXByZXNzZWQud2VicCBvcmlnLndlYnBcbiIKKyAgICAgICAgICAiICAtc3NpbSAuLi4uLiBwcmludCBTU0lNIGRpc3RvcnRpb25cbiIKKyAgICAgICAgICAiICAtcHNuciAuLi4uLiBwcmludCBQU05SIGRpc3RvcnRpb24gKGRlZmF1bHQpXG4iCisgICAgICAgICAgIiAgLWFscGhhIC4uLi4gcHJlc2VydmUgYWxwaGEgcGxhbmVcbiIKKyAgICAgICAgICAiICAtaCAuLi4uLi4uLiB0aGlzIG1lc3NhZ2VcbiIKKyAgICAgICAgICAiICAtbyA8ZmlsZT4gLiBzYXZlIHRoZSBkaWZmIG1hcCBhcyBhIFdlYlAgbG9zc2xlc3MgZmlsZVxuIgorICAgICAgICAgICIgIC1zY2FsZSAuLi4uIHNjYWxlIHRoZSBkaWZmZXJlbmNlIG1hcCB0byBmaXQgWzAuLjI1NV0gcmFuZ2VcbiIKKyAgICAgICAgICAiICAtZ3JheSAuLi4uLiB1c2UgZ3JheXNjYWxlIGZvciBkaWZmZXJlbmNlIG1hcCAoLXNjYWxlKVxuIgorICAgICAgICAgICIgQWxzbyBoYW5kbGVzIFBORywgSlBHIGFuZCBUSUZGIGZpbGVzLCBpbiBhZGRpdGlvbiB0byBXZWJQLlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgV2ViUFBpY3R1cmUgcGljMSwgcGljMjsKKyAgc2l6ZV90IHNpemUxID0gMCwgc2l6ZTIgPSAwOworICBpbnQgcmV0ID0gMTsKKyAgZmxvYXQgZGlzdG9bNV07CisgIGludCB0eXBlID0gMDsKKyAgaW50IGM7CisgIGludCBoZWxwID0gMDsKKyAgaW50IGtlZXBfYWxwaGEgPSAwOworICBpbnQgc2NhbGUgPSAwOworICBpbnQgdXNlX2dyYXkgPSAwOworICBjb25zdCBjaGFyKiBuYW1lMSA9IE5VTEw7CisgIGNvbnN0IGNoYXIqIG5hbWUyID0gTlVMTDsKKyAgY29uc3QgY2hhciogb3V0cHV0ID0gTlVMTDsKKworICBpZiAoIVdlYlBQaWN0dXJlSW5pdCgmcGljMSkgfHwgIVdlYlBQaWN0dXJlSW5pdCgmcGljMikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IGluaXQgcGljdHVyZXNcbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgZm9yIChjID0gMTsgYyA8IGFyZ2M7ICsrYykgeworICAgIGlmICghc3RyY21wKGFyZ3ZbY10sICItc3NpbSIpKSB7CisgICAgICB0eXBlID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1wc25yIikpIHsKKyAgICAgIHR5cGUgPSAwOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLWFscGhhIikpIHsKKyAgICAgIGtlZXBfYWxwaGEgPSAxOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2NdLCAiLXNjYWxlIikpIHsKKyAgICAgIHNjYWxlID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1ncmF5IikpIHsKKyAgICAgIHVzZV9ncmF5ID0gMTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikpIHsKKyAgICAgIGhlbHAgPSAxOworICAgICAgcmV0ID0gMDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1vIikpIHsKKyAgICAgIGlmICgrK2MgPT0gYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1pc3NpbmcgZmlsZSBuYW1lIGFmdGVyICVzIG9wdGlvbi5cbiIsIGFyZ3ZbYyAtIDFdKTsKKyAgICAgICAgZ290byBFbmQ7CisgICAgICB9CisgICAgICBvdXRwdXQgPSBhcmd2W2NdOworICAgIH0gZWxzZSBpZiAobmFtZTEgPT0gTlVMTCkgeworICAgICAgbmFtZTEgPSBhcmd2W2NdOworICAgIH0gZWxzZSB7CisgICAgICBuYW1lMiA9IGFyZ3ZbY107CisgICAgfQorICB9CisgIGlmIChoZWxwIHx8IG5hbWUxID09IE5VTEwgfHwgbmFtZTIgPT0gTlVMTCkgeworICAgIGlmICghaGVscCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvcjogbWlzc2luZyBhcmd1bWVudHMuXG4iKTsKKyAgICB9CisgICAgSGVscCgpOworICAgIGdvdG8gRW5kOworICB9CisgIHNpemUxID0gUmVhZFBpY3R1cmUobmFtZTEsICZwaWMxLCAxKTsKKyAgc2l6ZTIgPSBSZWFkUGljdHVyZShuYW1lMiwgJnBpYzIsIDEpOworICBpZiAoc2l6ZTEgPT0gMCB8fCBzaXplMiA9PSAwKSBnb3RvIEVuZDsKKworICBpZiAoIWtlZXBfYWxwaGEpIHsKKyAgICBXZWJQQmxlbmRBbHBoYSgmcGljMSwgMHgwMDAwMDAwMCk7CisgICAgV2ViUEJsZW5kQWxwaGEoJnBpYzIsIDB4MDAwMDAwMDApOworICB9CisKKyAgaWYgKCFXZWJQUGljdHVyZURpc3RvcnRpb24oJnBpYzEsICZwaWMyLCB0eXBlLCBkaXN0bykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdoaWxlIGNvbXB1dGluZyB0aGUgZGlzdG9ydGlvbi5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisgIHByaW50ZigiJXUgJS4yZiAgICAlLjJmICUuMmYgJS4yZiAlLjJmIFsgJS4yZiBicHAgXVxuIiwKKyAgICAgICAgICh1bnNpZ25lZCBpbnQpc2l6ZTEsCisgICAgICAgICBkaXN0b1s0XSwgZGlzdG9bMF0sIGRpc3RvWzFdLCBkaXN0b1syXSwgZGlzdG9bM10sCisgICAgICAgICA4LmYgKiBzaXplMSAvIHBpYzEud2lkdGggLyBwaWMxLmhlaWdodCk7CisKKyAgaWYgKG91dHB1dCAhPSBOVUxMKSB7CisgICAgdWludDhfdCogZGF0YSA9IE5VTEw7CisgICAgc2l6ZV90IGRhdGFfc2l6ZSA9IDA7CisgICAgaWYgKHBpYzEudXNlX2FyZ2IgIT0gcGljMi51c2VfYXJnYikgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQaWN0dXJlcyBhcmUgbm90IGluIHRoZSBzYW1lIGFyZ2IgZm9ybWF0LiAiCisgICAgICAgICAgICAgICAgICAgICAgIkNhbid0IHNhdmUgdGhlIGRpZmZlcmVuY2UgbWFwLlxuIik7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgaWYgKHBpYzEudXNlX2FyZ2IpIHsKKyAgICAgIGludCBuOworICAgICAgZnByaW50ZihzdGRlcnIsICJtYXggZGlmZmVyZW5jZXMgcGVyIGNoYW5uZWw6ICIpOworICAgICAgZm9yIChuID0gMDsgbiA8IDM7ICsrbikgeyAgICAvLyBza2lwIHRoZSBhbHBoYSBjaGFubmVsCisgICAgICAgIGNvbnN0IGludCByYW5nZSA9ICh0eXBlID09IDEpID8KKyAgICAgICAgICBTU0lNU2NhbGVDaGFubmVsKCh1aW50OF90KilwaWMxLmFyZ2IgKyBuLCBwaWMxLmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KilwaWMyLmFyZ2IgKyBuLCBwaWMyLmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHBpYzEud2lkdGgsIHBpYzEuaGVpZ2h0LCBzY2FsZSkgOgorICAgICAgICAgIERpZmZTY2FsZUNoYW5uZWwoKHVpbnQ4X3QqKXBpYzEuYXJnYiArIG4sIHBpYzEuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKXBpYzIuYXJnYiArIG4sIHBpYzIuYXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgNCwgcGljMS53aWR0aCwgcGljMS5oZWlnaHQsIHNjYWxlKTsKKyAgICAgICAgaWYgKHJhbmdlIDwgMCkgZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGNvbXB1dGluZyBkaWZmIG1hcFxuIik7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiWyVkXSIsIHJhbmdlKTsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKKyAgICAgIGlmICh1c2VfZ3JheSkgQ29udmVydFRvR3JheSgmcGljMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuIG9ubHkgY29tcHV0ZSB0aGUgZGlmZmVyZW5jZSBtYXAgaW4gQVJHQiBmb3JtYXQuXG4iKTsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgICAgZGF0YV9zaXplID0gV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgoY29uc3QgdWludDhfdCopcGljMS5hcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljMS53aWR0aCwgcGljMS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWMxLmFyZ2Jfc3RyaWRlICogNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhKTsKKyAgICBpZiAoZGF0YV9zaXplID09IDApIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZHVyaW5nIGxvc3NsZXNzIGVuY29kaW5nLlxuIik7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgICAgcmV0ID0gSW1nSW9VdGlsV3JpdGVGaWxlKG91dHB1dCwgZGF0YSwgZGF0YV9zaXplKSA/IDAgOiAxOworICAgIFdlYlBGcmVlKGRhdGEpOworICAgIGlmIChyZXQpIGdvdG8gRW5kOworI2Vsc2UKKyAgICAodm9pZClkYXRhOworICAgICh2b2lkKWRhdGFfc2l6ZTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbm5vdCBzYXZlIHRoZSBkaWZmZXJlbmNlIG1hcC4gUGxlYXNlIHJlY29tcGlsZSAiCisgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0IHRoZSBXRUJQX1JFRFVDRV9DU1AgZmxhZy5cbiIpOworI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKyAgfQorICByZXQgPSAwOworCisgRW5kOgorICBXZWJQUGljdHVyZUZyZWUoJnBpYzEpOworICBXZWJQUGljdHVyZUZyZWUoJnBpYzIpOworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3F1YWxpdHlfZXN0aW1hdGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9xdWFsaXR5X2VzdGltYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdlOThkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy9xdWFsaXR5X2VzdGltYXRlLmMKQEAgLTAsMCArMSwxMjkgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVlA4RXN0aW1hdGVRdWFsaXR5KCk6IHJvdWdoIGVuY29kaW5nIHF1YWxpdHkgZXN0aW1hdGUKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAiZXh0cmFzL2V4dHJhcy5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgSU5WQUxJRF9CSVRfUE9TICgxdWxsIDw8IDYzKQorCisvLyBJbiBtb3N0IGNhc2VzLCB3ZSBkb24ndCBuZWVkIHRvIHVzZSBhIGZ1bGwgYXJpdGhtZXRpYyBkZWNvZGVyLCBzaW5jZQorLy8gYWxsIHRoZSBoZWFkZXIncyBiaXRzIGFyZSB3cml0dGVuIHVzaW5nIGEgdW5pZm9ybSBwcm9iYWJpbGl0eSBvZiAxMjguCisvLyBXZSBjYW4ganVzdCBwYXJzZSB0aGUgaGVhZGVyIGFzIGlmIGl0IHdhcyBiaXRzICh3b3JrcyBpbiA5OS45OTklIGNhc2VzKS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRCaXQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IG5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBtYXhfc2l6ZSwgdWludDY0X3QqIGNvbnN0IGJpdF9wb3MpIHsKKyAgdWludDMyX3QgdmFsID0gMDsKKyAgaWYgKCpiaXRfcG9zICsgbmIgPD0gOCAqIG1heF9zaXplKSB7CisgICAgd2hpbGUgKG5iLS0gPiAwKSB7CisgICAgICBjb25zdCB1aW50NjRfdCBwID0gKCpiaXRfcG9zKSsrOworICAgICAgY29uc3QgaW50IGJpdCA9ICEhKGRhdGFbcCA+PiAzXSAmICgxMjggPj4gKChwICYgNykpKSk7CisgICAgICB2YWwgPSAodmFsIDw8IDEpIHwgYml0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAqYml0X3BvcyA9IElOVkFMSURfQklUX1BPUzsKKyAgfQorICByZXR1cm4gdmFsOworfQorCisjZGVmaW5lIEdFVF9CSVQobikgR2V0Qml0KGRhdGEsIChuKSwgc2l6ZSwgJmJpdF9wb3MpCisjZGVmaW5lIENPTkRJVElPTkFMX1NLSVAobikgKEdFVF9CSVQoMSkgPyBHRVRfQklUKChuKSkgOiAwKQorCitpbnQgVlA4RXN0aW1hdGVRdWFsaXR5KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBwb3MgPSAwOworICB1aW50NjRfdCBiaXRfcG9zOworICB1aW50NjRfdCBzaWcgPSAweDAwOworICBpbnQgb2sgPSAwOworICBpbnQgUSA9IC0xOworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgZmVhdHVyZXM7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIC0xOworCisgIGlmIChXZWJQR2V0RmVhdHVyZXMoZGF0YSwgc2l6ZSwgJmZlYXR1cmVzKSAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIC0xOyAgIC8vIGludmFsaWQgZmlsZQorICB9CisgIGlmIChmZWF0dXJlcy5mb3JtYXQgPT0gMikgcmV0dXJuIDEwMTsgIC8vIGxvc3NsZXNzCisgIGlmIChmZWF0dXJlcy5mb3JtYXQgPT0gMCB8fCBmZWF0dXJlcy5oYXNfYW5pbWF0aW9uKSByZXR1cm4gLTE7ICAgLy8gbWl4ZWQKKworICB3aGlsZSAocG9zIDwgc2l6ZSkgeworICAgIHNpZyA9IChzaWcgPj4gOCkgfCAoKHVpbnQ2NF90KWRhdGFbcG9zKytdIDw8IDQwKTsKKyAgICBpZiAoKHNpZyA+PiAyNCkgPT0gMHgyYTAxOWR1bGwpIHsKKyAgICAgIG9rID0gMTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoIW9rKSByZXR1cm4gLTE7CisgIGlmIChwb3MgKyA0ID4gc2l6ZSkgcmV0dXJuIC0xOworCisgIC8vIFNraXAgbWFpbiBIZWFkZXIKKyAgLy8gd2lkdGggID0gKGRhdGFbcG9zICsgMF0gfCAoZGF0YVtwb3MgKyAxXSA8PCA4KSkgJiAweDNmZmY7CisgIC8vIGhlaWdodCA9IChkYXRhW3BvcyArIDJdIHwgKGRhdGFbcG9zICsgM10gPDwgOCkpICYgMHgzZmZmOworICBwb3MgKz0gNDsKKyAgYml0X3BvcyA9IHBvcyAqIDg7CisKKyAgR0VUX0JJVCgyKTsgIC8vIGNvbG9yc3BhY2UgKyBjbGFtcCB0eXBlCisKKyAgLy8gU2VnbWVudCBoZWFkZXIKKyAgaWYgKEdFVF9CSVQoMSkpIHsgICAgICAgLy8gdXNlX3NlZ21lbnRfCisgICAgaW50IHM7CisgICAgY29uc3QgaW50IHVwZGF0ZV9tYXAgPSBHRVRfQklUKDEpOworICAgIGlmIChHRVRfQklUKDEpKSB7ICAgICAvLyB1cGRhdGUgZGF0YQorICAgICAgY29uc3QgaW50IGFic29sdXRlX2RlbHRhID0gR0VUX0JJVCgxKTsKKyAgICAgIGludCBxWzRdICA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgZm9yIChzID0gMDsgcyA8IDQ7ICsrcykgeworICAgICAgICBpZiAoR0VUX0JJVCgxKSkgeworICAgICAgICAgIHFbc10gPSBHRVRfQklUKDcpOworICAgICAgICAgIGlmIChHRVRfQklUKDEpKSBxW3NdID0gLXFbc107ICAgLy8gc2lnbgorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoYWJzb2x1dGVfZGVsdGEpIFEgPSBxWzBdOyAgLy8ganVzdCB1c2UgdGhlIGZpcnN0IHNlZ21lbnQncyBxdWFudGl6ZXIKKyAgICAgIGZvciAocyA9IDA7IHMgPCA0OyArK3MpIENPTkRJVElPTkFMX1NLSVAoNyk7ICAgLy8gIGZpbHRlciBzdHJlbmd0aAorICAgIH0KKyAgICBpZiAodXBkYXRlX21hcCkgeworICAgICAgZm9yIChzID0gMDsgcyA8IDM7ICsrcykgQ09ORElUSU9OQUxfU0tJUCg4KTsKKyAgICB9CisgIH0KKyAgLy8gRmlsdGVyIGhlYWRlcgorICBHRVRfQklUKDEgKyA2ICsgMyk7ICAgICAvLyBzaW1wbGUgKyBsZXZlbCArIHNoYXJwbmVzcworICBpZiAoR0VUX0JJVCgxKSkgeyAgICAgICAvLyB1c2VfbGZfZGVsdGEKKyAgICBpZiAoR0VUX0JJVCgxKSkgeyAgICAgLy8gdXBkYXRlIGxmX2RlbHRhPworICAgICAgaW50IG47CisgICAgICBmb3IgKG4gPSAwOyBuIDwgNCArIDQ7ICsrbikgQ09ORElUSU9OQUxfU0tJUCg2KTsKKyAgICB9CisgIH0KKyAgLy8gbnVtIHBhcnRpdGlvbnMKKyAgR0VUX0JJVCgyKTsKKworICAvLyBQYXJzZVF1YW50CisgIHsKKyAgICBjb25zdCBpbnQgYmFzZV9xID0gR0VUX0JJVCg3KTsKKyAgICAvKiBkcXkxX2RjID0gKi8gQ09ORElUSU9OQUxfU0tJUCg1KTsKKyAgICAvKiBkcXkyX2RjID0gKi8gQ09ORElUSU9OQUxfU0tJUCg1KTsKKyAgICAvKiBkcXkyX2FjID0gKi8gQ09ORElUSU9OQUxfU0tJUCg1KTsKKyAgICAvKiBkcXV2X2RjID0gKi8gQ09ORElUSU9OQUxfU0tJUCg1KTsKKyAgICAvKiBkcXV2X2FjID0gKi8gQ09ORElUSU9OQUxfU0tJUCg1KTsKKworICAgIGlmIChRIDwgMCkgUSA9IGJhc2VfcTsKKyAgfQorICBpZiAoYml0X3BvcyA9PSBJTlZBTElEX0JJVF9QT1MpIHJldHVybiAtMTsKKworICAvLyBiYXNlIG1hcHBpbmcKKyAgUSA9ICgxMjcgLSBRKSAqIDEwMCAvIDEyNzsKKyAgLy8gY29ycmVjdGlvbiBmb3IgcG93ZXItbGF3IGJlaGF2aW9yIGluIGxvdyByYW5nZQorICBpZiAoUSA8IDgwKSB7CisgICAgUSA9IChpbnQpKHBvdyhRIC8gODAuLCAxLiAvIDAuMzgpICogODApOworICB9CisgIHJldHVybiBROworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3Z3ZWJwX3NkbC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3Z3ZWJwX3NkbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTcxYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvdndlYnBfc2RsLmMKQEAgLTAsMCArMSw5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNpbXBsZSBTREwtYmFzZWQgV2ViUCBmaWxlIHZpZXdlci4KKy8vIERvZXMgbm90IHN1cHBvcnQgYW5pbWF0aW9uLCBqdXN0IHN0YXRpYyBpbWFnZXMuCisvLworLy8gUHJlc3MgJ3EnIHRvIGV4aXQuCisvLworLy8gQXV0aG9yOiBKYW1lcyBaZXJuIChqemVybkBnb29nbGUuY29tKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfSEFWRV9TREwpCisKKyNpbmNsdWRlICJ3ZWJwX3RvX3NkbC5oIgorI2luY2x1ZGUgIndlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAiaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCIKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX0pVU1RfU0RMX0gpCisjaW5jbHVkZSA8U0RMLmg+CisjZWxzZQorI2luY2x1ZGUgPFNETC9TREwuaD4KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBQcm9jZXNzRXZlbnRzKHZvaWQpIHsKKyAgaW50IGRvbmUgPSAwOworICBTRExfRXZlbnQgZXZlbnQ7CisgIHdoaWxlICghZG9uZSAmJiBTRExfV2FpdEV2ZW50KCZldmVudCkpIHsKKyAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHsKKyAgICAgIGNhc2UgU0RMX0tFWVVQOgorICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleS5rZXlzeW0uc3ltKSB7CisgICAgICAgICAgY2FzZSBTRExLX3E6IGRvbmUgPSAxOyBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OiBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyAgfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisgIGludCBjOworICBpbnQgb2sgPSAwOworICBmb3IgKGMgPSAxOyBjIDwgYXJnYzsgKytjKSB7CisgICAgY29uc3QgY2hhciogZmlsZSA9IE5VTEw7CisgICAgY29uc3QgdWludDhfdCogd2VicCA9IE5VTEw7CisgICAgc2l6ZV90IHdlYnBfc2l6ZSA9IDA7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1oIikpIHsKKyAgICAgIHByaW50ZigiVXNhZ2U6ICVzIFstaF0gaW1hZ2Uud2VicCBbbW9yZV9maWxlcy53ZWJwLi4uXVxuIiwgYXJndlswXSk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgZmlsZSA9IGFyZ3ZbY107CisgICAgfQorICAgIGlmIChmaWxlID09IE5VTEwpIGNvbnRpbnVlOworICAgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoZmlsZSwgJndlYnAsICZ3ZWJwX3NpemUpKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgZmlsZTogJXNcbiIsIGZpbGUpOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKHdlYnBfc2l6ZSAhPSAoc2l6ZV90KShpbnQpd2VicF9zaXplKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZpbGUgdG9vIGxhcmdlLlxuIik7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBvayA9IFdlYnBUb1NETCgoY29uc3QgY2hhciopd2VicCwgKGludCl3ZWJwX3NpemUpOworICAgIGZyZWUoKHZvaWQqKXdlYnApOworICAgIGlmICghb2spIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZGVjb2RpbmcgZmlsZSAlc1xuIiwgZmlsZSk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBQcm9jZXNzRXZlbnRzKCk7CisgIH0KKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFNETF9RdWl0KCk7CisgIHJldHVybiBvayA/IDAgOiAxOworfQorCisjZWxzZSAgLy8gIVdFQlBfSEFWRV9TREwKKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBmcHJpbnRmKHN0ZGVyciwgIlNETCBzdXBwb3J0IG5vdCBlbmFibGVkIGluICVzLlxuIiwgYXJndlswXSk7CisgICh2b2lkKWFyZ2M7CisgIHJldHVybiAwOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3F1YWxpdHkuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2V4dHJhcy93ZWJwX3F1YWxpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjZiYTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfcXVhbGl0eS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFNpbXBsZSB0b29sIHRvIHJvdWdobHkgZXZhbHVhdGUgdGhlIHF1YWxpdHkgZW5jb2Rpbmcgb2YgYSB3ZWJwIGJpdHN0cmVhbQorLy8KKy8vIFJlc3VsdCBpcyBhICpyb3VnaCogZXN0aW1hdGlvbiBvZiB0aGUgcXVhbGl0eS4gWW91IHNob3VsZCBqdXN0IGNvbnNpZGVyCisvLyB0aGUgYnVja2V0IGl0J3MgaW4gKHEgPiA4MD8gPiA1MD8gPiAyMD8pIGFuZCBub3QgdGFrZSBpdCBmb3IgZmFjZSB2YWx1ZS4KKy8qCisgZ2NjIC1vIHdlYnBfcXVhbGl0eSB3ZWJwX3F1YWxpdHkuYyAtTzMgLUkuLi8gLUwuIC1MLi4vaW1hZ2VpbyBcCisgICAgLWxpbWFnZWlvX3V0aWwgLWx3ZWJwZXh0cmFzIC1sd2VicCAtbG0gLWxwdGhyZWFkCisqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImV4dHJhcy9leHRyYXMuaCIKKyNpbmNsdWRlICJpbWFnZWlvL2ltYWdlaW9fdXRpbC5oIgorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGludCBjOworICBpbnQgcXVpZXQgPSAwOworICBpbnQgb2sgPSAxOworICBmb3IgKGMgPSAxOyBvayAmJiBjIDwgYXJnYzsgKytjKSB7CisgICAgaWYgKCFzdHJjbXAoYXJndltjXSwgIi1xdWlldCIpKSB7CisgICAgICBxdWlldCA9IDE7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbY10sICItaGVscCIpIHx8ICFzdHJjbXAoYXJndltjXSwgIi1oIikpIHsKKyAgICAgIHByaW50Zigid2VicF9xdWFsaXR5IFstaF1bLXF1aWV0XSB3ZWJwX2ZpbGVzLi4uXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSA9IGFyZ3ZbY107CisgICAgICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgICAgIHNpemVfdCBkYXRhX3NpemUgPSAwOworICAgICAgaW50IHE7CisgICAgICBvayA9IEltZ0lvVXRpbFJlYWRGaWxlKGZpbGVuYW1lLCAmZGF0YSwgJmRhdGFfc2l6ZSk7CisgICAgICBpZiAoIW9rKSBicmVhazsKKyAgICAgIHEgPSBWUDhFc3RpbWF0ZVF1YWxpdHkoZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgIGlmICghcXVpZXQpIHByaW50ZigiWyVzXSAiLCBmaWxlbmFtZSk7CisgICAgICBpZiAocSA8IDApIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJOb3QgYSBXZWJQIGZpbGUsIG9yIG5vdCBhIGxvc3N5IFdlYlAgZmlsZS5cbiIpOworICAgICAgICBvayA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIXF1aWV0KSB7CisgICAgICAgICAgcHJpbnRmKCJFc3RpbWF0ZWQgcXVhbGl0eSBmYWN0b3I6ICVkXG4iLCBxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBwcmludGYoIiVkXG4iLCBxKTsgICAvLyBqdXN0IHByaW50IHRoZSBudW1iZXIKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZnJlZSgodm9pZCopZGF0YSk7CisgICAgfQorICB9CisgIHJldHVybiBvayA/IDAgOiAxOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc0NzE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmMKQEAgLTAsMCArMSwxMTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgU2ltcGxlIFdlYlAtdG8tU0RMIHdyYXBwZXIuIFVzZWZ1bCBmb3IgZW1zY3JpcHRlbi4KKy8vCisvLyBBdXRob3I6IEphbWVzIFplcm4gKGp6ZXJuQGdvb2dsZS5jb20pCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9IQVZFX1NETCkKKworI2luY2x1ZGUgIndlYnBfdG9fc2RsLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgInNyYy93ZWJwL2RlY29kZS5oIgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfSlVTVF9TRExfSCkKKyNpbmNsdWRlIDxTREwuaD4KKyNlbHNlCisjaW5jbHVkZSA8U0RML1NETC5oPgorI2VuZGlmCisKK3N0YXRpYyBpbnQgaW5pdF9vayA9IDA7CitpbnQgV2VicFRvU0RMKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGludCBkYXRhX3NpemUpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBpbnB1dCA9ICZjb25maWcuaW5wdXQ7CisgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9ICZjb25maWcub3V0cHV0OworICBTRExfU3VyZmFjZSogc2NyZWVuID0gTlVMTDsKKyAgU0RMX1N1cmZhY2UqIHN1cmZhY2UgPSBOVUxMOworCisgIGlmICghV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJMaWJyYXJ5IHZlcnNpb24gbWlzbWF0Y2ghXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmICghaW5pdF9vaykgeworICAgIFNETF9Jbml0KFNETF9JTklUX1ZJREVPKTsKKyAgICBpbml0X29rID0gMTsKKyAgfQorCisgIHN0YXR1cyA9IFdlYlBHZXRGZWF0dXJlcygodWludDhfdCopZGF0YSwgKHNpemVfdClkYXRhX3NpemUsICZjb25maWcuaW5wdXQpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIGdvdG8gRXJyb3I7CisKKyAgc2NyZWVuID0gU0RMX1NldFZpZGVvTW9kZShpbnB1dC0+d2lkdGgsIGlucHV0LT5oZWlnaHQsIDMyLCBTRExfU1dTVVJGQUNFKTsKKyAgaWYgKHNjcmVlbiA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gc2V0IHZpZGVvIG1vZGUgKDMyYnBwICVkeCVkKSFcbiIsCisgICAgICAgICAgICBpbnB1dC0+d2lkdGgsIGlucHV0LT5oZWlnaHQpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBzdXJmYWNlID0gU0RMX0NyZWF0ZVJHQlN1cmZhY2UoU0RMX1NXU1VSRkFDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT53aWR0aCwgaW5wdXQtPmhlaWdodCwgMzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMGZmdSwgICAvLyBSIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMGZmMDB1LCAgIC8vIEcgbWFzaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMGZmMDAwMHUsICAgLy8gQiBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweGZmMDAwMDAwdSk7ICAvLyBBIG1hc2sKKworICBpZiAoc3VyZmFjZSA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlICVkeCVkIFJHQkEgc3VyZmFjZSFcbiIsCisgICAgICAgICAgICBpbnB1dC0+d2lkdGgsIGlucHV0LT5oZWlnaHQpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgaWYgKFNETF9NVVNUTE9DSyhzdXJmYWNlKSkgU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpOworCisjaWYgU0RMX0JZVEVPUkRFUiA9PSBTRExfQklHX0VORElBTgorICBvdXRwdXQtPmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7CisjZWxzZQorICBvdXRwdXQtPmNvbG9yc3BhY2UgPSBNT0RFX1JHQkE7CisjZW5kaWYKKyAgb3V0cHV0LT53aWR0aCAgPSBzdXJmYWNlLT53OworICBvdXRwdXQtPmhlaWdodCA9IHN1cmZhY2UtPmg7CisgIG91dHB1dC0+dS5SR0JBLnJnYmEgICA9IHN1cmZhY2UtPnBpeGVsczsKKyAgb3V0cHV0LT51LlJHQkEuc3RyaWRlID0gc3VyZmFjZS0+cGl0Y2g7CisgIG91dHB1dC0+dS5SR0JBLnNpemUgICA9IHN1cmZhY2UtPnBpdGNoICogc3VyZmFjZS0+aDsKKyAgb3V0cHV0LT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworCisgIHN0YXR1cyA9IFdlYlBEZWNvZGUoKGNvbnN0IHVpbnQ4X3QqKWRhdGEsIChzaXplX3QpZGF0YV9zaXplLCAmY29uZmlnKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBkZWNvZGluZyBpbWFnZSAoJWQpXG4iLCBzdGF0dXMpOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoU0RMX01VU1RMT0NLKHN1cmZhY2UpKSBTRExfVW5sb2NrU3VyZmFjZShzdXJmYWNlKTsKKyAgaWYgKFNETF9CbGl0U3VyZmFjZShzdXJmYWNlLCBOVUxMLCBzY3JlZW4sIE5VTEwpIHx8CisgICAgICBTRExfRmxpcChzY3JlZW4pKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIG9rID0gMTsKKworIEVycm9yOgorICBTRExfRnJlZVN1cmZhY2Uoc3VyZmFjZSk7CisgIFNETF9GcmVlU3VyZmFjZShzY3JlZW4pOworICBXZWJQRnJlZURlY0J1ZmZlcihvdXRwdXQpOworICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNlbmRpZiAgLy8gV0VCUF9IQVZFX1NETApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9leHRyYXMvd2VicF90b19zZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVlYTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZXh0cmFzL3dlYnBfdG9fc2RsLmgKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBTaW1wbGUgV2ViUC10by1TREwgd3JhcHBlci4gVXNlZnVsIGZvciBlbXNjcmlwdGVuLgorLy8KKy8vIEF1dGhvcjogSmFtZXMgWmVybiAoanplcm5AZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0VYVFJBU19XRUJQX1RPX1NETF9IXworI2RlZmluZSBXRUJQX0VYVFJBU19XRUJQX1RPX1NETF9IXworCisvLyBFeHBvcnRzIHRoZSBtZXRob2QgV2VicFRvU0RMKGNvbnN0IGNoYXIqIGRhdGEsIGludCBkYXRhX3NpemUpIHdoaWNoIGRlY29kZXMKKy8vIGEgV2ViUCBiaXRzdHJlYW0gaW50byBhbiBSR0JBIFNETCBzdXJmYWNlLgorLy8gUmV0dXJuIGZhbHNlIG9uIGZhaWx1cmUuCitleHRlcm4gaW50IFdlYnBUb1NETChjb25zdCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBpbnQgZGF0YV9zaXplKTsKKworI2VuZGlmICAvLyBXRUJQX0VYVFJBU19XRUJQX1RPX1NETF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlLnByb3BlcnRpZXMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGQzOWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBQcm9qZWN0LXdpZGUgR3JhZGxlIHNldHRpbmdzLgorCisjIElERSAoZS5nLiBBbmRyb2lkIFN0dWRpbykgdXNlcnM6CisjIEdyYWRsZSBzZXR0aW5ncyBjb25maWd1cmVkIHRocm91Z2ggdGhlIElERSAqd2lsbCBvdmVycmlkZSoKKyMgYW55IHNldHRpbmdzIHNwZWNpZmllZCBpbiB0aGlzIGZpbGUuCisKKyMgRm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gY29uZmlndXJlIHlvdXIgYnVpbGQgZW52aXJvbm1lbnQgdmlzaXQKKyMgaHR0cDovL3d3dy5ncmFkbGUub3JnL2RvY3MvY3VycmVudC91c2VyZ3VpZGUvYnVpbGRfZW52aXJvbm1lbnQuaHRtbAorCisjIFZlcnNpb25zIGZvciBncmFkbGUKK0JVSUxEX1RPT0xTX1ZFUlNJT049MjMuMC4zCitDT01QSUxFX1NES19WRVJTSU9OPTIzCitBTkRST0lEX0dSQURMRV9QTFVHSU5fVkVSU0lPTj0xLjUuMAorR1JBRExFX0RPV05MT0FEX1RBU0tfVkVSU0lPTj0yLjEuMApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIuamFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzgwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxlL3dyYXBwZXIvZ3JhZGxlLXdyYXBwZXIucHJvcGVydGllcyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1NjEwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZS93cmFwcGVyL2dyYWRsZS13cmFwcGVyLnByb3BlcnRpZXMKQEAgLTAsMCArMSw2IEBACisjVGh1IE1heSAxMiAxNzowNjoyNSBDRVNUIDIwMTYKK2Rpc3RyaWJ1dGlvbkJhc2U9R1JBRExFX1VTRVJfSE9NRQorZGlzdHJpYnV0aW9uUGF0aD13cmFwcGVyL2Rpc3RzCit6aXBTdG9yZUJhc2U9R1JBRExFX1VTRVJfSE9NRQoremlwU3RvcmVQYXRoPXdyYXBwZXIvZGlzdHMKK2Rpc3RyaWJ1dGlvblVybD1odHRwc1w6Ly9zZXJ2aWNlcy5ncmFkbGUub3JnL2Rpc3RyaWJ1dGlvbnMvZ3JhZGxlLTIuMTMtYmluLnppcApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjczMDlkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2dyYWRsZXcKQEAgLTAsMCArMSwxNjQgQEAKKyMhL3Vzci9iaW4vZW52IGJhc2gKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIworIyMgIEdyYWRsZSBzdGFydCB1cCBzY3JpcHQgZm9yIFVOKlgKKyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBBdHRlbXB0IHRvIHNldCBBUFBfSE9NRQorIyBSZXNvbHZlIGxpbmtzOiAkMCBtYXkgYmUgYSBsaW5rCitQUkc9IiQwIgorIyBOZWVkIHRoaXMgZm9yIHJlbGF0aXZlIHN5bWxpbmtzLgord2hpbGUgWyAtaCAiJFBSRyIgXSA7IGRvCisgICAgbHM9YGxzIC1sZCAiJFBSRyJgCisgICAgbGluaz1gZXhwciAiJGxzIiA6ICcuKi0+IFwoLipcKSQnYAorICAgIGlmIGV4cHIgIiRsaW5rIiA6ICcvLionID4gL2Rldi9udWxsOyB0aGVuCisgICAgICAgIFBSRz0iJGxpbmsiCisgICAgZWxzZQorICAgICAgICBQUkc9YGRpcm5hbWUgIiRQUkciYCIvJGxpbmsiCisgICAgZmkKK2RvbmUKK1NBVkVEPSJgcHdkYCIKK2NkICJgZGlybmFtZSBcIiRQUkdcImAvIiA+L2Rldi9udWxsCitBUFBfSE9NRT0iYHB3ZCAtUGAiCitjZCAiJFNBVkVEIiA+L2Rldi9udWxsCisKK0FQUF9OQU1FPSJHcmFkbGUiCitBUFBfQkFTRV9OQU1FPWBiYXNlbmFtZSAiJDAiYAorCisjIEFkZCBkZWZhdWx0IEpWTSBvcHRpb25zIGhlcmUuIFlvdSBjYW4gYWxzbyB1c2UgSkFWQV9PUFRTIGFuZCBHUkFETEVfT1BUUyB0byBwYXNzIEpWTSBvcHRpb25zIHRvIHRoaXMgc2NyaXB0LgorREVGQVVMVF9KVk1fT1BUUz0iIgorCisjIFVzZSB0aGUgbWF4aW11bSBhdmFpbGFibGUsIG9yIHNldCBNQVhfRkQgIT0gLTEgdG8gdXNlIHRoYXQgdmFsdWUuCitNQVhfRkQ9Im1heGltdW0iCisKK3dhcm4gKCApIHsKKyAgICBlY2hvICIkKiIKK30KKworZGllICggKSB7CisgICAgZWNobworICAgIGVjaG8gIiQqIgorICAgIGVjaG8KKyAgICBleGl0IDEKK30KKworIyBPUyBzcGVjaWZpYyBzdXBwb3J0IChtdXN0IGJlICd0cnVlJyBvciAnZmFsc2UnKS4KK2N5Z3dpbj1mYWxzZQorbXN5cz1mYWxzZQorZGFyd2luPWZhbHNlCitub25zdG9wPWZhbHNlCitjYXNlICJgdW5hbWVgIiBpbgorICBDWUdXSU4qICkKKyAgICBjeWd3aW49dHJ1ZQorICAgIDs7CisgIERhcndpbiogKQorICAgIGRhcndpbj10cnVlCisgICAgOzsKKyAgTUlOR1cqICkKKyAgICBtc3lzPXRydWUKKyAgICA7OworICBOT05TVE9QKiApCisgICAgbm9uc3RvcD10cnVlCisgICAgOzsKK2VzYWMKKworQ0xBU1NQQVRIPSRBUFBfSE9NRS9ncmFkbGUvd3JhcHBlci9ncmFkbGUtd3JhcHBlci5qYXIKKworIyBEZXRlcm1pbmUgdGhlIEphdmEgY29tbWFuZCB0byB1c2UgdG8gc3RhcnQgdGhlIEpWTS4KK2lmIFsgLW4gIiRKQVZBX0hPTUUiIF0gOyB0aGVuCisgICAgaWYgWyAteCAiJEpBVkFfSE9NRS9qcmUvc2gvamF2YSIgXSA7IHRoZW4KKyAgICAgICAgIyBJQk0ncyBKREsgb24gQUlYIHVzZXMgc3RyYW5nZSBsb2NhdGlvbnMgZm9yIHRoZSBleGVjdXRhYmxlcworICAgICAgICBKQVZBQ01EPSIkSkFWQV9IT01FL2pyZS9zaC9qYXZhIgorICAgIGVsc2UKKyAgICAgICAgSkFWQUNNRD0iJEpBVkFfSE9NRS9iaW4vamF2YSIKKyAgICBmaQorICAgIGlmIFsgISAteCAiJEpBVkFDTUQiIF0gOyB0aGVuCisgICAgICAgIGRpZSAiRVJST1I6IEpBVkFfSE9NRSBpcyBzZXQgdG8gYW4gaW52YWxpZCBkaXJlY3Rvcnk6ICRKQVZBX0hPTUUKKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKKyAgICBmaQorZWxzZQorICAgIEpBVkFDTUQ9ImphdmEiCisgICAgd2hpY2ggamF2YSA+L2Rldi9udWxsIDI+JjEgfHwgZGllICJFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4KKworUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlCitsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLiIKK2ZpCisKKyMgSW5jcmVhc2UgdGhlIG1heGltdW0gZmlsZSBkZXNjcmlwdG9ycyBpZiB3ZSBjYW4uCitpZiBbICIkY3lnd2luIiA9ICJmYWxzZSIgLWEgIiRkYXJ3aW4iID0gImZhbHNlIiAtYSAiJG5vbnN0b3AiID0gImZhbHNlIiBdIDsgdGhlbgorICAgIE1BWF9GRF9MSU1JVD1gdWxpbWl0IC1IIC1uYAorICAgIGlmIFsgJD8gLWVxIDAgXSA7IHRoZW4KKyAgICAgICAgaWYgWyAiJE1BWF9GRCIgPSAibWF4aW11bSIgLW8gIiRNQVhfRkQiID0gIm1heCIgXSA7IHRoZW4KKyAgICAgICAgICAgIE1BWF9GRD0iJE1BWF9GRF9MSU1JVCIKKyAgICAgICAgZmkKKyAgICAgICAgdWxpbWl0IC1uICRNQVhfRkQKKyAgICAgICAgaWYgWyAkPyAtbmUgMCBdIDsgdGhlbgorICAgICAgICAgICAgd2FybiAiQ291bGQgbm90IHNldCBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRCIKKyAgICAgICAgZmkKKyAgICBlbHNlCisgICAgICAgIHdhcm4gIkNvdWxkIG5vdCBxdWVyeSBtYXhpbXVtIGZpbGUgZGVzY3JpcHRvciBsaW1pdDogJE1BWF9GRF9MSU1JVCIKKyAgICBmaQorZmkKKworIyBGb3IgRGFyd2luLCBhZGQgb3B0aW9ucyB0byBzcGVjaWZ5IGhvdyB0aGUgYXBwbGljYXRpb24gYXBwZWFycyBpbiB0aGUgZG9jaworaWYgJGRhcndpbjsgdGhlbgorICAgIEdSQURMRV9PUFRTPSIkR1JBRExFX09QVFMgXCItWGRvY2s6bmFtZT0kQVBQX05BTUVcIiBcIi1YZG9jazppY29uPSRBUFBfSE9NRS9tZWRpYS9ncmFkbGUuaWNuc1wiIgorZmkKKworIyBGb3IgQ3lnd2luLCBzd2l0Y2ggcGF0aHMgdG8gV2luZG93cyBmb3JtYXQgYmVmb3JlIHJ1bm5pbmcgamF2YQoraWYgJGN5Z3dpbiA7IHRoZW4KKyAgICBBUFBfSE9NRT1gY3lncGF0aCAtLXBhdGggLS1taXhlZCAiJEFQUF9IT01FImAKKyAgICBDTEFTU1BBVEg9YGN5Z3BhdGggLS1wYXRoIC0tbWl4ZWQgIiRDTEFTU1BBVEgiYAorICAgIEpBVkFDTUQ9YGN5Z3BhdGggLS11bml4ICIkSkFWQUNNRCJgCisKKyAgICAjIFdlIGJ1aWxkIHRoZSBwYXR0ZXJuIGZvciBhcmd1bWVudHMgdG8gYmUgY29udmVydGVkIHZpYSBjeWdwYXRoCisgICAgUk9PVERJUlNSQVc9YGZpbmQgLUwgLyAtbWF4ZGVwdGggMSAtbWluZGVwdGggMSAtdHlwZSBkIDI+L2Rldi9udWxsYAorICAgIFNFUD0iIgorICAgIGZvciBkaXIgaW4gJFJPT1RESVJTUkFXIDsgZG8KKyAgICAgICAgUk9PVERJUlM9IiRST09URElSUyRTRVAkZGlyIgorICAgICAgICBTRVA9InwiCisgICAgZG9uZQorICAgIE9VUkNZR1BBVFRFUk49IiheKCRST09URElSUykpIgorICAgICMgQWRkIGEgdXNlci1kZWZpbmVkIHBhdHRlcm4gdG8gdGhlIGN5Z3BhdGggYXJndW1lbnRzCisgICAgaWYgWyAiJEdSQURMRV9DWUdQQVRURVJOIiAhPSAiIiBdIDsgdGhlbgorICAgICAgICBPVVJDWUdQQVRURVJOPSIkT1VSQ1lHUEFUVEVSTnwoJEdSQURMRV9DWUdQQVRURVJOKSIKKyAgICBmaQorICAgICMgTm93IGNvbnZlcnQgdGhlIGFyZ3VtZW50cyAtIGtsdWRnZSB0byBsaW1pdCBvdXJzZWx2ZXMgdG8gL2Jpbi9zaAorICAgIGk9MAorICAgIGZvciBhcmcgaW4gIiRAIiA7IGRvCisgICAgICAgIENIRUNLPWBlY2hvICIkYXJnInxlZ3JlcCAtYyAiJE9VUkNZR1BBVFRFUk4iIC1gCisgICAgICAgIENIRUNLMj1gZWNobyAiJGFyZyJ8ZWdyZXAgLWMgIl4tImAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMgRGV0ZXJtaW5lIGlmIGFuIG9wdGlvbgorCisgICAgICAgIGlmIFsgJENIRUNLIC1uZSAwIF0gJiYgWyAkQ0hFQ0syIC1lcSAwIF0gOyB0aGVuICAgICAgICAgICAgICAgICAgICAjIyMgQWRkZWQgYSBjb25kaXRpb24KKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD1gY3lncGF0aCAtLXBhdGggLS1pZ25vcmUgLS1taXhlZCAiJGFyZyJgCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YWwgYGVjaG8gYXJncyRpYD0iXCIkYXJnXCIiCisgICAgICAgIGZpCisgICAgICAgIGk9JCgoaSsxKSkKKyAgICBkb25lCisgICAgY2FzZSAkaSBpbgorICAgICAgICAoMCkgc2V0IC0tIDs7CisgICAgICAgICgxKSBzZXQgLS0gIiRhcmdzMCIgOzsKKyAgICAgICAgKDIpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiA7OworICAgICAgICAoMykgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiIDs7CisgICAgICAgICg0KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgOzsKKyAgICAgICAgKDUpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiA7OworICAgICAgICAoNikgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiIDs7CisgICAgICAgICg3KSBzZXQgLS0gIiRhcmdzMCIgIiRhcmdzMSIgIiRhcmdzMiIgIiRhcmdzMyIgIiRhcmdzNCIgIiRhcmdzNSIgIiRhcmdzNiIgOzsKKyAgICAgICAgKDgpIHNldCAtLSAiJGFyZ3MwIiAiJGFyZ3MxIiAiJGFyZ3MyIiAiJGFyZ3MzIiAiJGFyZ3M0IiAiJGFyZ3M1IiAiJGFyZ3M2IiAiJGFyZ3M3IiA7OworICAgICAgICAoOSkgc2V0IC0tICIkYXJnczAiICIkYXJnczEiICIkYXJnczIiICIkYXJnczMiICIkYXJnczQiICIkYXJnczUiICIkYXJnczYiICIkYXJnczciICIkYXJnczgiIDs7CisgICAgZXNhYworZmkKKworIyBTcGxpdCB1cCB0aGUgSlZNX09QVFMgQW5kIEdSQURMRV9PUFRTIHZhbHVlcyBpbnRvIGFuIGFycmF5LCBmb2xsb3dpbmcgdGhlIHNoZWxsIHF1b3RpbmcgYW5kIHN1YnN0aXR1dGlvbiBydWxlcworZnVuY3Rpb24gc3BsaXRKdm1PcHRzKCkgeworICAgIEpWTV9PUFRTPSgiJEAiKQorfQorZXZhbCBzcGxpdEp2bU9wdHMgJERFRkFVTFRfSlZNX09QVFMgJEpBVkFfT1BUUyAkR1JBRExFX09QVFMKK0pWTV9PUFRTWyR7I0pWTV9PUFRTWypdfV09Ii1Eb3JnLmdyYWRsZS5hcHBuYW1lPSRBUFBfQkFTRV9OQU1FIgorCitleGVjICIkSkFWQUNNRCIgIiR7SlZNX09QVFNbQF19IiAtY2xhc3NwYXRoICIkQ0xBU1NQQVRIIiBvcmcuZ3JhZGxlLndyYXBwZXIuR3JhZGxlV3JhcHBlck1haW4gIiRAIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldy5iYXQgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9ncmFkbGV3LmJhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQ1OTc0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZ3JhZGxldy5iYXQKQEAgLTAsMCArMSw5MCBAQAorQGlmICIlREVCVUclIiA9PSAiIiBAZWNobyBvZmYNCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorQHJlbQ0KK0ByZW0gIEdyYWRsZSBzdGFydHVwIHNjcmlwdCBmb3IgV2luZG93cw0KK0ByZW0NCitAcmVtICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQorDQorQHJlbSBTZXQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVPUyUiPT0iV2luZG93c19OVCIgc2V0bG9jYWwNCisNCitzZXQgRElSTkFNRT0lfmRwMA0KK2lmICIlRElSTkFNRSUiID09ICIiIHNldCBESVJOQU1FPS4NCitzZXQgQVBQX0JBU0VfTkFNRT0lfm4wDQorc2V0IEFQUF9IT01FPSVESVJOQU1FJQ0KKw0KK0ByZW0gQWRkIGRlZmF1bHQgSlZNIG9wdGlvbnMgaGVyZS4gWW91IGNhbiBhbHNvIHVzZSBKQVZBX09QVFMgYW5kIEdSQURMRV9PUFRTIHRvIHBhc3MgSlZNIG9wdGlvbnMgdG8gdGhpcyBzY3JpcHQuDQorc2V0IERFRkFVTFRfSlZNX09QVFM9DQorDQorQHJlbSBGaW5kIGphdmEuZXhlDQoraWYgZGVmaW5lZCBKQVZBX0hPTUUgZ290byBmaW5kSmF2YUZyb21KYXZhSG9tZQ0KKw0KK3NldCBKQVZBX0VYRT1qYXZhLmV4ZQ0KKyVKQVZBX0VYRSUgLXZlcnNpb24gPk5VTCAyPiYxDQoraWYgIiVFUlJPUkxFVkVMJSIgPT0gIjAiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIG5vdCBzZXQgYW5kIG5vICdqYXZhJyBjb21tYW5kIGNvdWxkIGJlIGZvdW5kIGluIHlvdXIgUEFUSC4NCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzpmaW5kSmF2YUZyb21KYXZhSG9tZQ0KK3NldCBKQVZBX0hPTUU9JUpBVkFfSE9NRToiPSUNCitzZXQgSkFWQV9FWEU9JUpBVkFfSE9NRSUvYmluL2phdmEuZXhlDQorDQoraWYgZXhpc3QgIiVKQVZBX0VYRSUiIGdvdG8gaW5pdA0KKw0KK2VjaG8uDQorZWNobyBFUlJPUjogSkFWQV9IT01FIGlzIHNldCB0byBhbiBpbnZhbGlkIGRpcmVjdG9yeTogJUpBVkFfSE9NRSUNCitlY2hvLg0KK2VjaG8gUGxlYXNlIHNldCB0aGUgSkFWQV9IT01FIHZhcmlhYmxlIGluIHlvdXIgZW52aXJvbm1lbnQgdG8gbWF0Y2ggdGhlDQorZWNobyBsb2NhdGlvbiBvZiB5b3VyIEphdmEgaW5zdGFsbGF0aW9uLg0KKw0KK2dvdG8gZmFpbA0KKw0KKzppbml0DQorQHJlbSBHZXQgY29tbWFuZC1saW5lIGFyZ3VtZW50cywgaGFuZGxpbmcgV2luZG93cyB2YXJpYW50cw0KKw0KK2lmIG5vdCAiJU9TJSIgPT0gIldpbmRvd3NfTlQiIGdvdG8gd2luOXhNRV9hcmdzDQoraWYgIiVAZXZhbFsyKzJdIiA9PSAiNCIgZ290byA0TlRfYXJncw0KKw0KKzp3aW45eE1FX2FyZ3MNCitAcmVtIFNsdXJwIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzLg0KK3NldCBDTURfTElORV9BUkdTPQ0KK3NldCBfU0tJUD0yDQorDQorOndpbjl4TUVfYXJnc19zbHVycA0KK2lmICJ4JX4xIiA9PSAieCIgZ290byBleGVjdXRlDQorDQorc2V0IENNRF9MSU5FX0FSR1M9JSoNCitnb3RvIGV4ZWN1dGUNCisNCis6NE5UX2FyZ3MNCitAcmVtIEdldCBhcmd1bWVudHMgZnJvbSB0aGUgNE5UIFNoZWxsIGZyb20gSlAgU29mdHdhcmUNCitzZXQgQ01EX0xJTkVfQVJHUz0lJA0KKw0KKzpleGVjdXRlDQorQHJlbSBTZXR1cCB0aGUgY29tbWFuZCBsaW5lDQorDQorc2V0IENMQVNTUEFUSD0lQVBQX0hPTUUlXGdyYWRsZVx3cmFwcGVyXGdyYWRsZS13cmFwcGVyLmphcg0KKw0KK0ByZW0gRXhlY3V0ZSBHcmFkbGUNCisiJUpBVkFfRVhFJSIgJURFRkFVTFRfSlZNX09QVFMlICVKQVZBX09QVFMlICVHUkFETEVfT1BUUyUgIi1Eb3JnLmdyYWRsZS5hcHBuYW1lPSVBUFBfQkFTRV9OQU1FJSIgLWNsYXNzcGF0aCAiJUNMQVNTUEFUSCUiIG9yZy5ncmFkbGUud3JhcHBlci5HcmFkbGVXcmFwcGVyTWFpbiAlQ01EX0xJTkVfQVJHUyUNCisNCis6ZW5kDQorQHJlbSBFbmQgbG9jYWwgc2NvcGUgZm9yIHRoZSB2YXJpYWJsZXMgd2l0aCB3aW5kb3dzIE5UIHNoZWxsDQoraWYgIiVFUlJPUkxFVkVMJSI9PSIwIiBnb3RvIG1haW5FbmQNCisNCis6ZmFpbA0KK3JlbSBTZXQgdmFyaWFibGUgR1JBRExFX0VYSVRfQ09OU09MRSBpZiB5b3UgbmVlZCB0aGUgX3NjcmlwdF8gcmV0dXJuIGNvZGUgaW5zdGVhZCBvZg0KK3JlbSB0aGUgX2NtZC5leGUgL2NfIHJldHVybiBjb2RlIQ0KK2lmICBub3QgIiIgPT0gIiVHUkFETEVfRVhJVF9DT05TT0xFJSIgZXhpdCAxDQorZXhpdCAvYiAxDQorDQorOm1haW5FbmQNCitpZiAiJU9TJSI9PSJXaW5kb3dzX05UIiBlbmRsb2NhbA0KKw0KKzpvbWVnYQ0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vQW5kcm9pZC5tayBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzc5ZjcxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgbGliaW1hZ2Vpb191dGlsCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgIGltYWdlaW9fdXRpbC5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCisKK0xPQ0FMX01PRFVMRSA6PSBpbWFnZWlvX3V0aWwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJpbWFnZWRlYworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBpbWFnZV9kZWMuYyBcCisgICAganBlZ2RlYy5jIFwKKyAgICBtZXRhZGF0YS5jIFwKKyAgICBwbmdkZWMuYyBcCisgICAgcG5tZGVjLmMgXAorICAgIHRpZmZkZWMuYyBcCisgICAgd2VicGRlYy5jIFwKKworTE9DQUxfQ0ZMQUdTIDo9ICQoV0VCUF9DRkxBR1MpCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoTE9DQUxfUEFUSCkvLi4vc3JjCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGltYWdlaW9fdXRpbAorCitMT0NBTF9NT0RVTEUgOj0gaW1hZ2VkZWMKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBsaWJpbWFnZWVuYworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICBpbWFnZV9lbmMuYyBcCisKK0xPQ0FMX0NGTEFHUyA6PSAkKFdFQlBfQ0ZMQUdTKQorTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpLy4uL3NyYworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBpbWFnZWlvX3V0aWwKKworTE9DQUxfTU9EVUxFIDo9IGltYWdlZW5jCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTZkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMzIgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpL3NyYyAtSSQodG9wX3NyY2Rpcikvc3JjCitub2luc3RfTFRMSUJSQVJJRVMgPQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYmltYWdlaW9fdXRpbC5sYQoraWYgV0FOVF9ERU1VWAorICBub2luc3RfTFRMSUJSQVJJRVMgKz0gbGliaW1hZ2VkZWMubGEKK2VuZGlmCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGliaW1hZ2VlbmMubGEKKworbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vc3JjL3dlYnAvZGVjb2RlLmgKK25vaW5zdF9IRUFERVJTICs9IC4uL3NyYy93ZWJwL3R5cGVzLmgKKworbGliaW1hZ2Vpb191dGlsX2xhX1NPVVJDRVMgPQorbGliaW1hZ2Vpb191dGlsX2xhX1NPVVJDRVMgKz0gaW1hZ2Vpb191dGlsLmMgaW1hZ2Vpb191dGlsLmgKKworbGliaW1hZ2VkZWNfbGFfU09VUkNFUyAgPQorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSBpbWFnZV9kZWMuYyBpbWFnZV9kZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSBqcGVnZGVjLmMganBlZ2RlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IG1ldGFkYXRhLmMgbWV0YWRhdGEuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSBwbmdkZWMuYyBwbmdkZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSBwbm1kZWMuYyBwbm1kZWMuaAorbGliaW1hZ2VkZWNfbGFfU09VUkNFUyArPSB0aWZmZGVjLmMgdGlmZmRlYy5oCitsaWJpbWFnZWRlY19sYV9TT1VSQ0VTICs9IHdlYnBkZWMuYyB3ZWJwZGVjLmgKK2xpYmltYWdlZGVjX2xhX1NPVVJDRVMgKz0gd2ljZGVjLmMgd2ljZGVjLmgKK2xpYmltYWdlZGVjX2xhX0NQUEZMQUdTID0gJChKUEVHX0lOQ0xVREVTKSAkKFBOR19JTkNMVURFUykgJChUSUZGX0lOQ0xVREVTKQorbGliaW1hZ2VkZWNfbGFfQ1BQRkxBR1MgKz0gJChBTV9DUFBGTEFHUykKK2xpYmltYWdlZGVjX2xhX0xJQkFERCA9IC4uL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgubGEKKworbGliaW1hZ2VlbmNfbGFfU09VUkNFUyAgPQorbGliaW1hZ2VlbmNfbGFfU09VUkNFUyArPSBpbWFnZV9lbmMuYyBpbWFnZV9lbmMuaAorbGliaW1hZ2VlbmNfbGFfQ1BQRkxBR1MgPSAkKEpQRUdfSU5DTFVERVMpICQoUE5HX0lOQ0xVREVTKSAkKFRJRkZfSU5DTFVERVMpCitsaWJpbWFnZWVuY19sYV9DUFBGTEFHUyArPSAkKEFNX0NQUEZMQUdTKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhMWIxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZGVjLmMKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEdlbmVyaWMgaW1hZ2UtdHlwZSBndWVzc2luZy4KKworI2luY2x1ZGUgIi4vaW1hZ2VfZGVjLmgiCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRCRTMyKGNvbnN0IHVpbnQ4X3QgYnVmW10pIHsKKyAgcmV0dXJuICgodWludDMyX3QpYnVmWzBdIDw8IDI0KSB8IChidWZbMV0gPDwgMTYpIHwgKGJ1ZlsyXSA8PCA4KSB8IGJ1ZlszXTsKK30KKworV2ViUElucHV0RmlsZUZvcm1hdCBXZWJQR3Vlc3NJbWFnZVR5cGUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgV2ViUElucHV0RmlsZUZvcm1hdCBmb3JtYXQgPSBXRUJQX1VOU1VQUE9SVEVEX0ZPUk1BVDsKKyAgaWYgKGRhdGEgIT0gTlVMTCAmJiBkYXRhX3NpemUgPj0gMTIpIHsKKyAgICBjb25zdCB1aW50MzJfdCBtYWdpYzEgPSBHZXRCRTMyKGRhdGEgKyAwKTsKKyAgICBjb25zdCB1aW50MzJfdCBtYWdpYzIgPSBHZXRCRTMyKGRhdGEgKyA4KTsKKyAgICBpZiAobWFnaWMxID09IDB4ODk1MDRFNDdVKSB7CisgICAgICBmb3JtYXQgPSBXRUJQX1BOR19GT1JNQVQ7CisgICAgfSBlbHNlIGlmIChtYWdpYzEgPj0gMHhGRkQ4RkYwMFUgJiYgbWFnaWMxIDw9IDB4RkZEOEZGRkZVKSB7CisgICAgICBmb3JtYXQgPSBXRUJQX0pQRUdfRk9STUFUOworICAgIH0gZWxzZSBpZiAobWFnaWMxID09IDB4NDk0OTJBMDAgfHwgbWFnaWMxID09IDB4NEQ0RDAwMkEpIHsKKyAgICAgIGZvcm1hdCA9IFdFQlBfVElGRl9GT1JNQVQ7CisgICAgfSBlbHNlIGlmIChtYWdpYzEgPT0gMHg1MjQ5NDY0NiAmJiBtYWdpYzIgPT0gMHg1NzQ1NDI1MCkgeworICAgICAgZm9ybWF0ID0gV0VCUF9XRUJQX0ZPUk1BVDsKKyAgICB9IGVsc2UgaWYgKCgobWFnaWMxID4+IDI0KSAmIDB4ZmYpID09ICdQJykgeworICAgICAgY29uc3QgaW50IHR5cGUgPSAobWFnaWMxID4+IDE2KSAmIDB4ZmY7CisgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgJ1A1IC0+IFA3JyBmb3Igbm93LgorICAgICAgaWYgKHR5cGUgPj0gJzUnICYmIHR5cGUgPD0gJzcnKSBmb3JtYXQgPSBXRUJQX1BOTV9GT1JNQVQ7CisgICAgfQorICB9CisgIHJldHVybiBmb3JtYXQ7Cit9CisKK3N0YXRpYyBpbnQgRmFpbFJlYWRlcihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljOworICAodm9pZClrZWVwX2FscGhhOworICAodm9pZCltZXRhZGF0YTsKKyAgcmV0dXJuIDA7Cit9CisKK1dlYlBJbWFnZVJlYWRlciBXZWJQR2V0SW1hZ2VSZWFkZXIoV2ViUElucHV0RmlsZUZvcm1hdCBmb3JtYXQpIHsKKyAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIFdFQlBfUE5HX0ZPUk1BVDogcmV0dXJuIFJlYWRQTkc7CisgICAgY2FzZSBXRUJQX0pQRUdfRk9STUFUOiByZXR1cm4gUmVhZEpQRUc7CisgICAgY2FzZSBXRUJQX1RJRkZfRk9STUFUOiByZXR1cm4gUmVhZFRJRkY7CisgICAgY2FzZSBXRUJQX1dFQlBfRk9STUFUOiByZXR1cm4gUmVhZFdlYlA7CisgICAgY2FzZSBXRUJQX1BOTV9GT1JNQVQ6IHJldHVybiBSZWFkUE5NOworICAgIGRlZmF1bHQ6IHJldHVybiBGYWlsUmVhZGVyOworICB9Cit9CisKK1dlYlBJbWFnZVJlYWRlciBXZWJQR3Vlc3NJbWFnZVJlYWRlcihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgcmV0dXJuIFdlYlBHZXRJbWFnZVJlYWRlcihXZWJQR3Vlc3NJbWFnZVR5cGUoZGF0YSwgZGF0YV9zaXplKSk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQxMWUxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9kZWMuaApAQCAtMCwwICsxLDY3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEFsbC1pbi1vbmUgbGlicmFyeSB0byBkZWNvZGUgUE5HL0pQRUcvV2ViUC9USUZGL1dJQyBpbnB1dCBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fSU1BR0VfREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19JTUFHRV9ERUNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJ3ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisjaW5jbHVkZSAiLi9qcGVnZGVjLmgiCisjaW5jbHVkZSAiLi9wbmdkZWMuaCIKKyNpbmNsdWRlICIuL3BubWRlYy5oIgorI2luY2x1ZGUgIi4vdGlmZmRlYy5oIgorI2luY2x1ZGUgIi4vd2VicGRlYy5oIgorI2luY2x1ZGUgIi4vd2ljZGVjLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBlbnVtIHsKKyAgV0VCUF9QTkdfRk9STUFUID0gMCwKKyAgV0VCUF9KUEVHX0ZPUk1BVCwKKyAgV0VCUF9USUZGX0ZPUk1BVCwKKyAgV0VCUF9XRUJQX0ZPUk1BVCwKKyAgV0VCUF9QTk1fRk9STUFULAorICBXRUJQX1VOU1VQUE9SVEVEX0ZPUk1BVAorfSBXZWJQSW5wdXRGaWxlRm9ybWF0OworCisvLyBUcnkgdG8gaW5mZXIgdGhlIGltYWdlIGZvcm1hdC4gJ2RhdGFfc2l6ZScgc2hvdWxkIGJlIGxhcmdlciB0aGFuIDEyLgorLy8gUmV0dXJucyBXRUJQX1VOU1VQUE9SVEVEX0ZPUk1BVCBpZiBmb3JtYXQgY2FuJ3QgYmUgZ3Vlc3Mgc2FmZWx5LgorV2ViUElucHV0RmlsZUZvcm1hdCBXZWJQR3Vlc3NJbWFnZVR5cGUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpOworCisvLyBTaWduYXR1cmUgZm9yIGNvbW1vbiBpbWFnZS1yZWFkaW5nIGZ1bmN0aW9ucyAoUmVhZFBORywgUmVhZEpQRUcsIC4uLikKK3R5cGVkZWYgaW50ICgqV2ViUEltYWdlUmVhZGVyKShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworLy8gUmV0dXJuIHRoZSByZWFkZXIgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGZpbGUgZm9ybWF0LgorV2ViUEltYWdlUmVhZGVyIFdlYlBHZXRJbWFnZVJlYWRlcihXZWJQSW5wdXRGaWxlRm9ybWF0IGZvcm1hdCk7CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBXZWJQR3Vlc3NJbWFnZVR5cGUoKSwgYnV0IHJldHVybnMgYQorLy8gc3VpdGFibGUgcmVhZGVyIGZ1bmN0aW9uLiBUaGUgcmV0dXJuZWQgcmVhZGVyIGlzIG5ldmVyIE5VTEwsIGJ1dAorLy8gdW5rbm93biBmb3JtYXRzIHdpbGwgcmV0dXJuIGFuIGFsd2F5cy1mYWlsaW5nIHZhbGlkIHJlYWRlci4KK1dlYlBJbWFnZVJlYWRlciBXZWJQR3Vlc3NJbWFnZVJlYWRlcihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX0lNQUdFX0RFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMzQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2VfZW5jLmMKQEAgLTAsMCArMSw1OTkgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTYXZlIGltYWdlCisKKyNpbmNsdWRlICIuL2ltYWdlX2VuYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBXRUJQX0hBVkVfUE5HCisjaW5jbHVkZSA8cG5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+ICAgLy8gbm90ZTogdGhpcyBtdXN0IGJlIGluY2x1ZGVkICphZnRlciogcG5nLmgKKyNlbmRpZgorCisjaWZkZWYgSEFWRV9XSU5DT0RFQ19ICisjaWZkZWYgX19NSU5HVzMyX18KKyNkZWZpbmUgSU5JVEdVSUQgIC8vIFdpdGhvdXQgdGhpcyBHVUlEcyBhcmUgZGVjbGFyZWQgZXh0ZXJuIGFuZCBmYWlsIHRvIGxpbmsKKyNlbmRpZgorI2RlZmluZSBDSU5URVJGQUNFCisjZGVmaW5lIENPQkpNQUNST1MKKyNkZWZpbmUgX1dJTjMyX0lFIDB4NTAwICAvLyBXb3JrYXJvdW5kIGJ1ZyBpbiBzaGx3YXBpLmggd2hlbiBjb21waWxpbmcgQysrCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSB3aXRoIENPQkpNQUNST1MuCisjaW5jbHVkZSA8b2xlMi5oPiAgLy8gQ3JlYXRlU3RyZWFtT25IR2xvYmFsKCkKKyNpbmNsdWRlIDxzaGx3YXBpLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNvZGVjLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQTkcKKworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorCisjZGVmaW5lIElGUyhmbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChTVUNDRUVERUQoaHIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBociA9IChmbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChGQUlMRUQoaHIpKSBmcHJpbnRmKHN0ZGVyciwgI2ZuICIgZmFpbGVkICUwOGx4XG4iLCBocik7ICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBNQUtFX1JFRkdVSUQoeCkgKHgpCisjZWxzZQorI2RlZmluZSBNQUtFX1JFRkdVSUQoeCkgJih4KQorI2VuZGlmCisKK3N0YXRpYyBIUkVTVUxUIENyZWF0ZU91dHB1dFN0cmVhbShjb25zdCBjaGFyKiBvdXRfZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3cml0ZV90b19tZW0sIElTdHJlYW0qKiBzdHJlYW0pIHsKKyAgSFJFU1VMVCBociA9IFNfT0s7CisgIGlmICh3cml0ZV90b19tZW0pIHsKKyAgICAvLyBPdXRwdXQgdG8gYSBtZW1vcnkgYnVmZmVyLiBUaGlzIGlzIGZyZWVkIHdoZW4gJ3N0cmVhbScgaXMgcmVsZWFzZWQuCisgICAgSUZTKENyZWF0ZVN0cmVhbU9uSEdsb2JhbChOVUxMLCBUUlVFLCBzdHJlYW0pKTsKKyAgfSBlbHNlIHsKKyAgICBJRlMoU0hDcmVhdGVTdHJlYW1PbkZpbGVBKG91dF9maWxlX25hbWUsIFNUR01fV1JJVEUgfCBTVEdNX0NSRUFURSwgc3RyZWFtKSk7CisgIH0KKyAgaWYgKEZBSUxFRChocikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgJXMgKCUwOGx4KVxuIiwKKyAgICAgICAgICAgIG91dF9maWxlX25hbWUsIGhyKTsKKyAgfQorICByZXR1cm4gaHI7Cit9CisKK3N0YXRpYyBIUkVTVUxUIFdyaXRlVXNpbmdXSUMoY29uc3QgY2hhciogb3V0X2ZpbGVfbmFtZSwgaW50IHVzZV9zdGRvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRkdVSUQgY29udGFpbmVyX2d1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGhhc19hbHBoYSkgeworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgSVdJQ0ltYWdpbmdGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTDsKKyAgSVdJQ0JpdG1hcEZyYW1lRW5jb2RlKiBmcmFtZSA9IE5VTEw7CisgIElXSUNCaXRtYXBFbmNvZGVyKiBlbmNvZGVyID0gTlVMTDsKKyAgSVN0cmVhbSogc3RyZWFtID0gTlVMTDsKKyAgV0lDUGl4ZWxGb3JtYXRHVUlEIHBpeGVsX2Zvcm1hdCA9IGhhc19hbHBoYSA/IEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcEJHUkEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdVSURfV0lDUGl4ZWxGb3JtYXQyNGJwcEJHUjsKKworICBpZiAob3V0X2ZpbGVfbmFtZSA9PSBOVUxMIHx8IHJnYiA9PSBOVUxMKSByZXR1cm4gRV9JTlZBTElEQVJHOworCisgIElGUyhDb0luaXRpYWxpemUoTlVMTCkpOworICBJRlMoQ29DcmVhdGVJbnN0YW5jZShNQUtFX1JFRkdVSUQoQ0xTSURfV0lDSW1hZ2luZ0ZhY3RvcnkpLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICBDTFNDVFhfSU5QUk9DX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKElJRF9JV0lDSW1hZ2luZ0ZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKikmZmFjdG9yeSkpOworICBpZiAoaHIgPT0gUkVHREJfRV9DTEFTU05PVFJFRykgeworICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgIkNvdWxkbid0IGFjY2VzcyBXaW5kb3dzIEltYWdpbmcgQ29tcG9uZW50IChhcmUgeW91IHJ1bm5pbmcgIgorICAgICAgICAgICAgIldpbmRvd3MgWFAgU1AzIG9yIG5ld2VyPykuIFBORyBzdXBwb3J0IG5vdCBhdmFpbGFibGUuICIKKyAgICAgICAgICAgICJVc2UgLXBwbSBvciAtcGdtIGZvciBhdmFpbGFibGUgUFBNIGFuZCBQR00gZm9ybWF0cy5cbiIpOworICB9CisgIElGUyhDcmVhdGVPdXRwdXRTdHJlYW0ob3V0X2ZpbGVfbmFtZSwgdXNlX3N0ZG91dCwgJnN0cmVhbSkpOworICBJRlMoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZUVuY29kZXIoZmFjdG9yeSwgY29udGFpbmVyX2d1aWQsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jb2RlcikpOworICBJRlMoSVdJQ0JpdG1hcEVuY29kZXJfSW5pdGlhbGl6ZShlbmNvZGVyLCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJQ0JpdG1hcEVuY29kZXJOb0NhY2hlKSk7CisgIElGUyhJV0lDQml0bWFwRW5jb2Rlcl9DcmVhdGVOZXdGcmFtZShlbmNvZGVyLCAmZnJhbWUsIE5VTEwpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZUVuY29kZV9Jbml0aWFsaXplKGZyYW1lLCBOVUxMKSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVFbmNvZGVfU2V0U2l6ZShmcmFtZSwgd2lkdGgsIGhlaWdodCkpOworICBJRlMoSVdJQ0JpdG1hcEZyYW1lRW5jb2RlX1NldFBpeGVsRm9ybWF0KGZyYW1lLCAmcGl4ZWxfZm9ybWF0KSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVFbmNvZGVfV3JpdGVQaXhlbHMoZnJhbWUsIGhlaWdodCwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCAqIHN0cmlkZSwgcmdiKSk7CisgIElGUyhJV0lDQml0bWFwRnJhbWVFbmNvZGVfQ29tbWl0KGZyYW1lKSk7CisgIElGUyhJV0lDQml0bWFwRW5jb2Rlcl9Db21taXQoZW5jb2RlcikpOworCisgIGlmIChTVUNDRUVERUQoaHIpICYmIHVzZV9zdGRvdXQpIHsKKyAgICBIR0xPQkFMIGltYWdlOworICAgIElGUyhHZXRIR2xvYmFsRnJvbVN0cmVhbShzdHJlYW0sICZpbWFnZSkpOworICAgIGlmIChTVUNDRUVERUQoaHIpKSB7CisgICAgICBIQU5ETEUgc3RkX291dHB1dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CisgICAgICBEV09SRCBtb2RlOworICAgICAgY29uc3QgQk9PTCB1cGRhdGVfbW9kZSA9IEdldENvbnNvbGVNb2RlKHN0ZF9vdXRwdXQsICZtb2RlKTsKKyAgICAgIGNvbnN0IHZvaWQqIGNvbnN0IGltYWdlX21lbSA9IEdsb2JhbExvY2soaW1hZ2UpOworICAgICAgRFdPUkQgYnl0ZXNfd3JpdHRlbiA9IDA7CisKKyAgICAgIC8vIENsZWFyIG91dHB1dCBwcm9jZXNzaW5nIGlmIG5lY2Vzc2FyeSwgdGhlbiBvdXRwdXQgdGhlIGltYWdlLgorICAgICAgaWYgKHVwZGF0ZV9tb2RlKSBTZXRDb25zb2xlTW9kZShzdGRfb3V0cHV0LCAwKTsKKyAgICAgIGlmICghV3JpdGVGaWxlKHN0ZF9vdXRwdXQsIGltYWdlX21lbSwgKERXT1JEKUdsb2JhbFNpemUoaW1hZ2UpLAorICAgICAgICAgICAgICAgICAgICAgJmJ5dGVzX3dyaXR0ZW4sIE5VTEwpIHx8CisgICAgICAgICAgYnl0ZXNfd3JpdHRlbiAhPSBHbG9iYWxTaXplKGltYWdlKSkgeworICAgICAgICBociA9IEVfRkFJTDsKKyAgICAgIH0KKyAgICAgIGlmICh1cGRhdGVfbW9kZSkgU2V0Q29uc29sZU1vZGUoc3RkX291dHB1dCwgbW9kZSk7CisgICAgICBHbG9iYWxVbmxvY2soaW1hZ2UpOworICAgIH0KKyAgfQorCisgIGlmIChmcmFtZSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGZyYW1lKTsKKyAgaWYgKGVuY29kZXIgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShlbmNvZGVyKTsKKyAgaWYgKGZhY3RvcnkgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShmYWN0b3J5KTsKKyAgaWYgKHN0cmVhbSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKHN0cmVhbSk7CisgIHJldHVybiBocjsKK30KKworaW50IFdlYlBXcml0ZVBORyhjb25zdCBjaGFyKiBvdXRfZmlsZV9uYW1lLCBpbnQgdXNlX3N0ZG91dCwKKyAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgIHVpbnQ4X3QqIGNvbnN0IHJnYiA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKTsKKworICByZXR1cm4gU1VDQ0VFREVEKFdyaXRlVXNpbmdXSUMob3V0X2ZpbGVfbmFtZSwgdXNlX3N0ZG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX0NvbnRhaW5lckZvcm1hdFBuZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2IsIHN0cmlkZSwgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhKSk7Cit9CisKKyNlbGlmIGRlZmluZWQoV0VCUF9IQVZFX1BORykgICAgLy8gIUhBVkVfV0lOQ09ERUNfSAorc3RhdGljIHZvaWQgUE5HQVBJIFBOR0Vycm9yRnVuY3Rpb24ocG5nX3N0cnVjdHAgcG5nLCBwbmdfY29uc3RfY2hhcnAgZHVtbXkpIHsKKyAgKHZvaWQpZHVtbXk7ICAvLyByZW1vdmUgdmFyaWFibGUtdW51c2VkIHdhcm5pbmcKKyAgbG9uZ2ptcChwbmdfam1wYnVmKHBuZyksIDEpOworfQorCitpbnQgV2ViUFdyaXRlUE5HKEZJTEUqIG91dF9maWxlLCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgdm9sYXRpbGUgcG5nX3N0cnVjdHAgcG5nOworICB2b2xhdGlsZSBwbmdfaW5mb3AgaW5mbzsKKworICBpZiAob3V0X2ZpbGUgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgcG5nID0gcG5nX2NyZWF0ZV93cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBQTkdFcnJvckZ1bmN0aW9uLCBOVUxMKTsKKyAgaWYgKHBuZyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QocG5nKTsKKyAgaWYgKGluZm8gPT0gTlVMTCkgeworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgocG5nX3N0cnVjdHBwKSZwbmcsIE5VTEwpOworICAgIHJldHVybiAwOworICB9CisgIGlmIChzZXRqbXAocG5nX2ptcGJ1ZihwbmcpKSkgeworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgocG5nX3N0cnVjdHBwKSZwbmcsIChwbmdfaW5mb3BwKSZpbmZvKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBwbmdfaW5pdF9pbyhwbmcsIG91dF9maWxlKTsKKyAgeworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gYnVmZmVyLT53aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgICBwbmdfYnl0ZXAgcm93ID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKTsKKyAgICB1aW50MzJfdCB5OworCisgICAgcG5nX3NldF9JSERSKHBuZywgaW5mbywgd2lkdGgsIGhlaWdodCwgOCwKKyAgICAgICAgICAgICAgICAgaGFzX2FscGhhID8gUE5HX0NPTE9SX1RZUEVfUkdCQSA6IFBOR19DT0xPUl9UWVBFX1JHQiwKKyAgICAgICAgICAgICAgICAgUE5HX0lOVEVSTEFDRV9OT05FLCBQTkdfQ09NUFJFU1NJT05fVFlQRV9ERUZBVUxULAorICAgICAgICAgICAgICAgICBQTkdfRklMVEVSX1RZUEVfREVGQVVMVCk7CisgICAgcG5nX3dyaXRlX2luZm8ocG5nLCBpbmZvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIHBuZ193cml0ZV9yb3dzKHBuZywgJnJvdywgMSk7CisgICAgICByb3cgKz0gc3RyaWRlOworICAgIH0KKyAgfQorICBwbmdfd3JpdGVfZW5kKHBuZywgaW5mbyk7CisgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgocG5nX3N0cnVjdHBwKSZwbmcsIChwbmdfaW5mb3BwKSZpbmZvKTsKKyAgcmV0dXJuIDE7Cit9CisjZWxzZSAgICAvLyAhSEFWRV9XSU5DT0RFQ19IICYmICFXRUJQX0hBVkVfUE5HCitpbnQgV2ViUFdyaXRlUE5HKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKKworICBmcHJpbnRmKHN0ZGVyciwgIlBORyBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYnBuZyAiCisgICAgICAgICAgImRldmVsb3BtZW50IHBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIGZwcmludGYoc3RkZXJyLCAiWW91IGNhbiBydW4gd2l0aCAtcHBtIGZsYWcgdG8gZGVjb2RlIGluIFBQTSBmb3JtYXQuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBQTSAvIFBBTQorCitzdGF0aWMgaW50IFdyaXRlUFBNUEFNKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGFscGhhKSB7CisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCogcm93ID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gYnVmZmVyLT51LlJHQkEuc3RyaWRlOworICAgIGNvbnN0IHNpemVfdCBieXRlc19wZXJfcHggPSBhbHBoYSA/IDQgOiAzOworICAgIHVpbnQzMl90IHk7CisKKyAgICBpZiAocm93ID09IE5VTEwpIHJldHVybiAwOworCisgICAgaWYgKGFscGhhKSB7CisgICAgICBmcHJpbnRmKGZvdXQsICJQN1xuV0lEVEggJXVcbkhFSUdIVCAldVxuREVQVEggNFxuTUFYVkFMIDI1NVxuIgorICAgICAgICAgICAgICAgICAgICAiVFVQTFRZUEUgUkdCX0FMUEhBXG5FTkRIRFJcbiIsIHdpZHRoLCBoZWlnaHQpOworICAgIH0gZWxzZSB7CisgICAgICBmcHJpbnRmKGZvdXQsICJQNlxuJXUgJXVcbjI1NVxuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgfQorICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgaWYgKGZ3cml0ZShyb3csIHdpZHRoLCBieXRlc19wZXJfcHgsIGZvdXQpICE9IGJ5dGVzX3Blcl9weCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIHJvdyArPSBzdHJpZGU7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFdyaXRlUFBNKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICByZXR1cm4gV3JpdGVQUE1QQU0oZm91dCwgYnVmZmVyLCAwKTsKK30KKworaW50IFdlYlBXcml0ZVBBTShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgcmV0dXJuIFdyaXRlUFBNUEFNKGZvdXQsIGJ1ZmZlciwgMSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSYXcgUEdNCisKKy8vIFNhdmUgMTZiIG1vZGUgKFJHQkE0NDQ0LCBSR0I1NjUsIC4uLikgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgoraW50IFdlYlBXcml0ZTE2YkFzUEdNKEZJTEUqIGZvdXQsIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcikgeworICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICBjb25zdCB1aW50OF90KiByZ2JhID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgY29uc3QgdWludDMyX3QgYnl0ZXNfcGVyX3B4ID0gMjsKKyAgdWludDMyX3QgeTsKKworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IHJnYmEgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgZnByaW50Zihmb3V0LCAiUDVcbiV1ICV1XG4yNTVcbiIsIHdpZHRoICogYnl0ZXNfcGVyX3B4LCBoZWlnaHQpOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBpZiAoZndyaXRlKHJnYmEsIHdpZHRoLCBieXRlc19wZXJfcHgsIGZvdXQpICE9IGJ5dGVzX3Blcl9weCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQk1QCisKK3N0YXRpYyB2b2lkIFB1dExFMTYodWludDhfdCogY29uc3QgZHN0LCB1aW50MzJfdCB2YWx1ZSkgeworICBkc3RbMF0gPSAodmFsdWUgPj4gMCkgJiAweGZmOworICBkc3RbMV0gPSAodmFsdWUgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBQdXRMRTMyKHVpbnQ4X3QqIGNvbnN0IGRzdCwgdWludDMyX3QgdmFsdWUpIHsKKyAgUHV0TEUxNihkc3QgKyAwLCAodmFsdWUgPj4gIDApICYgMHhmZmZmKTsKKyAgUHV0TEUxNihkc3QgKyAyLCAodmFsdWUgPj4gMTYpICYgMHhmZmZmKTsKK30KKworI2RlZmluZSBCTVBfSEVBREVSX1NJWkUgNTQKK2ludCBXZWJQV3JpdGVCTVAoRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBXZWJQSXNBbHBoYU1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKTsKKyAgY29uc3QgdWludDMyX3Qgd2lkdGggPSBidWZmZXItPndpZHRoOworICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgY29uc3QgdWludDhfdCogcmdiYSA9IGJ1ZmZlci0+dS5SR0JBLnJnYmE7CisgIGNvbnN0IGludCBzdHJpZGUgPSBidWZmZXItPnUuUkdCQS5zdHJpZGU7CisgIGNvbnN0IHVpbnQzMl90IGJ5dGVzX3Blcl9weCA9IGhhc19hbHBoYSA/IDQgOiAzOworICB1aW50MzJfdCB5OworICBjb25zdCB1aW50MzJfdCBsaW5lX3NpemUgPSBieXRlc19wZXJfcHggKiB3aWR0aDsKKyAgY29uc3QgdWludDMyX3QgYm1wX3N0cmlkZSA9IChsaW5lX3NpemUgKyAzKSAmIH4zOyAgIC8vIHBhZCB0byA0CisgIGNvbnN0IHVpbnQzMl90IHRvdGFsX3NpemUgPSBibXBfc3RyaWRlICogaGVpZ2h0ICsgQk1QX0hFQURFUl9TSVpFOworICB1aW50OF90IGJtcF9oZWFkZXJbQk1QX0hFQURFUl9TSVpFXSA9IHsgMCB9OworCisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwgfHwgcmdiYSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAvLyBiaXRtYXAgZmlsZSBoZWFkZXIKKyAgUHV0TEUxNihibXBfaGVhZGVyICsgMCwgMHg0ZDQyKTsgICAgICAgICAgICAgICAgLy8gc2lnbmF0dXJlICdCTScKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMiwgdG90YWxfc2l6ZSk7ICAgICAgICAgICAgLy8gc2l6ZSBpbmNsdWRpbmcgaGVhZGVyCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDYsIDApOyAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VydmVkCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDEwLCBCTVBfSEVBREVSX1NJWkUpOyAgICAgIC8vIG9mZnNldCB0byBwaXhlbCBhcnJheQorICAvLyBiaXRtYXAgaW5mbyBoZWFkZXIKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMTQsIDQwKTsgICAgICAgICAgICAgICAgICAgLy8gRElCIGhlYWRlciBzaXplCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDE4LCB3aWR0aCk7ICAgICAgICAgICAgICAgIC8vIGRpbWVuc2lvbnMKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMjIsIC0oaW50KWhlaWdodCk7ICAgICAgICAgLy8gdmVydGljYWwgZmxpcCEKKyAgUHV0TEUxNihibXBfaGVhZGVyICsgMjYsIDEpOyAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBsYW5lcworICBQdXRMRTE2KGJtcF9oZWFkZXIgKyAyOCwgYnl0ZXNfcGVyX3B4ICogOCk7ICAgICAvLyBiaXRzIHBlciBwaXhlbAorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAzMCwgMCk7ICAgICAgICAgICAgICAgICAgICAvLyBubyBjb21wcmVzc2lvbiAoQklfUkdCKQorICBQdXRMRTMyKGJtcF9oZWFkZXIgKyAzNCwgMCk7ICAgICAgICAgICAgICAgICAgICAvLyBpbWFnZSBzaXplIChkdW1teSkKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgMzgsIDI0MDApOyAgICAgICAgICAgICAgICAgLy8geCBwaXhlbHMvbWV0ZXIKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgNDIsIDI0MDApOyAgICAgICAgICAgICAgICAgLy8geSBwaXhlbHMvbWV0ZXIKKyAgUHV0TEUzMihibXBfaGVhZGVyICsgNDYsIDApOyAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHBhbGV0dGUgY29sb3JzCisgIFB1dExFMzIoYm1wX2hlYWRlciArIDUwLCAwKTsgICAgICAgICAgICAgICAgICAgIC8vIGltcG9ydGFudCBjb2xvciBjb3VudAorCisgIC8vIFRPRE8oc2thbCk6IGNvbG9yIHByb2ZpbGUKKworICAvLyB3cml0ZSBoZWFkZXIKKyAgaWYgKGZ3cml0ZShibXBfaGVhZGVyLCBzaXplb2YoYm1wX2hlYWRlciksIDEsIGZvdXQpICE9IDEpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIHdyaXRlIHBpeGVsIGFycmF5CisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUocmdiYSwgbGluZV9zaXplLCAxLCBmb3V0KSAhPSAxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gd3JpdGUgcGFkZGluZyB6ZXJvZXMKKyAgICBpZiAoYm1wX3N0cmlkZSAhPSBsaW5lX3NpemUpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgemVyb2VzWzNdID0geyAwIH07CisgICAgICBpZiAoZndyaXRlKHplcm9lcywgYm1wX3N0cmlkZSAtIGxpbmVfc2l6ZSwgMSwgZm91dCkgIT0gMSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcmdiYSArPSBzdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisjdW5kZWYgQk1QX0hFQURFUl9TSVpFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUSUZGCisKKyNkZWZpbmUgTlVNX0lGRF9FTlRSSUVTIDE1CisjZGVmaW5lIEVYVFJBX0RBVEFfU0laRSAxNgorLy8gMTBiIGZvciBzaWduYXR1cmUvaGVhZGVyICsgbiAqIDEyYiBlbnRyaWVzICsgNGIgZm9yIElGRCB0ZXJtaW5hdG9yOgorI2RlZmluZSBFWFRSQV9EQVRBX09GRlNFVCAoMTAgKyAxMiAqIE5VTV9JRkRfRU5UUklFUyArIDQpCisjZGVmaW5lIFRJRkZfSEVBREVSX1NJWkUgKEVYVFJBX0RBVEFfT0ZGU0VUICsgRVhUUkFfREFUQV9TSVpFKQorCitpbnQgV2ViUFdyaXRlVElGRihGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBJc0FscGhhTW9kZShidWZmZXItPmNvbG9yc3BhY2UpOworICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICBjb25zdCB1aW50OF90KiByZ2JhID0gYnVmZmVyLT51LlJHQkEucmdiYTsKKyAgY29uc3QgaW50IHN0cmlkZSA9IGJ1ZmZlci0+dS5SR0JBLnN0cmlkZTsKKyAgY29uc3QgdWludDhfdCBieXRlc19wZXJfcHggPSBoYXNfYWxwaGEgPyA0IDogMzsKKyAgY29uc3QgdWludDhfdCBhc3NvY19hbHBoYSA9CisgICAgICBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShidWZmZXItPmNvbG9yc3BhY2UpID8gMSA6IDI7CisgIC8vIEZvciBub24tYWxwaGEgY2FzZSwgd2Ugb21pdCB0YWcgMHgxNTIgKEV4dHJhU2FtcGxlcykuCisgIGNvbnN0IHVpbnQ4X3QgbnVtX2lmZF9lbnRyaWVzID0gaGFzX2FscGhhID8gTlVNX0lGRF9FTlRSSUVTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVNX0lGRF9FTlRSSUVTIC0gMTsKKyAgdWludDhfdCB0aWZmX2hlYWRlcltUSUZGX0hFQURFUl9TSVpFXSA9IHsKKyAgICAweDQ5LCAweDQ5LCAweDJhLCAweDAwLCAgIC8vIGxpdHRsZSBlbmRpYW4gc2lnbmF0dXJlCisgICAgOCwgMCwgMCwgMCwgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gdGhlIHVuaXF1ZSBJRkQgdGhhdCBmb2xsb3dzCisgICAgLy8gSUZEIChvZmZzZXQgPSA4KS4gRW50cmllcyBtdXN0IGJlIHdyaXR0ZW4gaW4gaW5jcmVhc2luZyB0YWcgb3JkZXIuCisgICAgbnVtX2lmZF9lbnRyaWVzLCAwLCAgICAgICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgSUZEICgxMiBieXRlcyBlYWNoKS4KKyAgICAweDAwLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvLyAgMTA6IFdpZHRoICAoVEJEKQorICAgIDB4MDEsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8vICAyMjogSGVpZ2h0IChUQkQpCisgICAgMHgwMiwgMHgwMSwgMywgMCwgYnl0ZXNfcGVyX3B4LCAwLCAwLCAwLCAgICAgLy8gIDM0OiBCaXRzUGVyU2FtcGxlOiA4ODg4CisgICAgICAgIEVYVFJBX0RBVEFfT0ZGU0VUICsgMCwgMCwgMCwgMCwKKyAgICAweDAzLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAgICAvLyAgNDY6IENvbXByZXNzaW9uOiBub25lCisgICAgMHgwNiwgMHgwMSwgMywgMCwgMSwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgICAgLy8gIDU4OiBQaG90b21ldHJpYzogUkdCCisgICAgMHgxMSwgMHgwMSwgNCwgMCwgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLy8gIDcwOiBTdHJpcHMgb2Zmc2V0OgorICAgICAgICBUSUZGX0hFQURFUl9TSVpFLCAwLCAwLCAwLCAgICAgICAgICAgICAgIC8vICAgICAgZGF0YSBmb2xsb3dzIGhlYWRlcgorICAgIDB4MTIsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsICAgIC8vICA4MjogT3JpZW50YXRpb246IHRvcGxlZnQKKyAgICAweDE1LCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAvLyAgOTQ6IFNhbXBsZXNQZXJQaXhlbHMKKyAgICAgICAgYnl0ZXNfcGVyX3B4LCAwLCAwLCAwLAorICAgIDB4MTYsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgIC8vIDEwNjogUm93cyBwZXIgc3RyaXAgKFRCRCkKKyAgICAweDE3LCAweDAxLCA0LCAwLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAvLyAxMTg6IFN0cmlwQnl0ZUNvdW50IChUQkQpCisgICAgMHgxYSwgMHgwMSwgNSwgMCwgMSwgMCwgMCwgMCwgICAgICAgICAgICAgICAgLy8gMTMwOiBYLXJlc29sdXRpb24KKyAgICAgICAgRVhUUkFfREFUQV9PRkZTRVQgKyA4LCAwLCAwLCAwLAorICAgIDB4MWIsIDB4MDEsIDUsIDAsIDEsIDAsIDAsIDAsICAgICAgICAgICAgICAgIC8vIDE0MjogWS1yZXNvbHV0aW9uCisgICAgICAgIEVYVFJBX0RBVEFfT0ZGU0VUICsgOCwgMCwgMCwgMCwKKyAgICAweDFjLCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAgICAvLyAxNTQ6IFBsYW5hckNvbmZpZ3VyYXRpb24KKyAgICAweDI4LCAweDAxLCAzLCAwLCAxLCAwLCAwLCAwLCAyLCAwLCAwLCAwLCAgICAvLyAxNjY6IFJlc29sdXRpb25Vbml0IChpbmNoKQorICAgIDB4NTIsIDB4MDEsIDMsIDAsIDEsIDAsIDAsIDAsCisgICAgICAgIGFzc29jX2FscGhhLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgLy8gMTc4OiBFeHRyYVNhbXBsZXM6IHJnYkEvUkdCQQorICAgIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDE5MDogSUZEIHRlcm1pbmF0b3IKKyAgICAvLyBFWFRSQV9EQVRBX09GRlNFVDoKKyAgICA4LCAwLCA4LCAwLCA4LCAwLCA4LCAwLCAgICAgIC8vIEJpdHNQZXJTYW1wbGUKKyAgICA3MiwgMCwgMCwgMCwgMSwgMCwgMCwgMCAgICAgIC8vIDcyIHBpeGVscy9pbmNoLCBmb3IgWC9ZLXJlc29sdXRpb24KKyAgfTsKKyAgdWludDMyX3QgeTsKKworICBpZiAoZm91dCA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMIHx8IHJnYmEgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gRmlsbCBwbGFjZWhvbGRlcnMgaW4gSUZEOgorICBQdXRMRTMyKHRpZmZfaGVhZGVyICsgMTAgKyA4LCB3aWR0aCk7CisgIFB1dExFMzIodGlmZl9oZWFkZXIgKyAyMiArIDgsIGhlaWdodCk7CisgIFB1dExFMzIodGlmZl9oZWFkZXIgKyAxMDYgKyA4LCBoZWlnaHQpOworICBQdXRMRTMyKHRpZmZfaGVhZGVyICsgMTE4ICsgOCwgd2lkdGggKiBieXRlc19wZXJfcHggKiBoZWlnaHQpOworICBpZiAoIWhhc19hbHBoYSkgUHV0TEUzMih0aWZmX2hlYWRlciArIDE3OCwgMCk7ICAvLyBJRkQgdGVybWluYXRvcgorCisgIC8vIHdyaXRlIGhlYWRlcgorICBpZiAoZndyaXRlKHRpZmZfaGVhZGVyLCBzaXplb2YodGlmZl9oZWFkZXIpLCAxLCBmb3V0KSAhPSAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgLy8gd3JpdGUgcGl4ZWwgdmFsdWVzCisgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGlmIChmd3JpdGUocmdiYSwgYnl0ZXNfcGVyX3B4LCB3aWR0aCwgZm91dCkgIT0gd2lkdGgpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorCisgIHJldHVybiAxOworfQorCisjdW5kZWYgVElGRl9IRUFERVJfU0laRQorI3VuZGVmIEVYVFJBX0RBVEFfT0ZGU0VUCisjdW5kZWYgRVhUUkFfREFUQV9TSVpFCisjdW5kZWYgTlVNX0lGRF9FTlRSSUVTCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSYXcgQWxwaGEKKworaW50IFdlYlBXcml0ZUFscGhhUGxhbmUoRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgICAgY29uc3QgdWludDMyX3QgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgICAgY29uc3QgdWludDhfdCogYSA9IGJ1ZmZlci0+dS5ZVVZBLmE7CisgICAgY29uc3QgaW50IGFfc3RyaWRlID0gYnVmZmVyLT51LllVVkEuYV9zdHJpZGU7CisgICAgdWludDMyX3QgeTsKKworICAgIGlmIChhID09IE5VTEwpIHJldHVybiAwOworCisgICAgZnByaW50Zihmb3V0LCAiUDVcbiV1ICV1XG4yNTVcbiIsIHdpZHRoLCBoZWlnaHQpOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgaWYgKGZ3cml0ZShhLCB3aWR0aCwgMSwgZm91dCkgIT0gMSkgcmV0dXJuIDA7CisgICAgICBhICs9IGFfc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUEdNIHdpdGggSU1DNCBsYXlvdXQKKworaW50IFdlYlBXcml0ZVBHTShGSUxFKiBmb3V0LCBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaWYgKGZvdXQgPT0gTlVMTCB8fCBidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGNvbnN0IFdlYlBZVVZBQnVmZmVyKiBjb25zdCB5dXYgPSAmYnVmZmVyLT51LllVVkE7CisgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB5dXYtPnk7CisgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSB5dXYtPnU7CisgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSB5dXYtPnY7CisgICAgY29uc3QgdWludDhfdCogc3JjX2EgPSB5dXYtPmE7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHdpZHRoICsgMSkgLyAyOworICAgIGNvbnN0IGludCB1dl9oZWlnaHQgPSAoaGVpZ2h0ICsgMSkgLyAyOworICAgIGNvbnN0IGludCBhX2hlaWdodCA9IChzcmNfYSAhPSBOVUxMKSA/IGhlaWdodCA6IDA7CisgICAgaW50IG9rID0gMTsKKyAgICBpbnQgeTsKKworICAgIGlmIChzcmNfeSA9PSBOVUxMIHx8IHNyY191ID09IE5VTEwgfHwgc3JjX3YgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBmcHJpbnRmKGZvdXQsICJQNVxuJWQgJWRcbjI1NVxuIiwKKyAgICAgICAgICAgICh3aWR0aCArIDEpICYgfjEsIGhlaWdodCArIHV2X2hlaWdodCArIGFfaGVpZ2h0KTsKKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3ksIHdpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIGlmICh3aWR0aCAmIDEpIGZwdXRjKDAsIGZvdXQpOyAgICAvLyBwYWRkaW5nIGJ5dGUKKyAgICAgIHNyY195ICs9IHl1di0+eV9zdHJpZGU7CisgICAgfQorICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCB1dl9oZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfdSwgdXZfd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfdiwgdXZfd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgc3JjX3UgKz0geXV2LT51X3N0cmlkZTsKKyAgICAgIHNyY192ICs9IHl1di0+dl9zdHJpZGU7CisgICAgfQorICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCBhX2hlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY19hLCB3aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBpZiAod2lkdGggJiAxKSBmcHV0YygwLCBmb3V0KTsgICAgLy8gcGFkZGluZyBieXRlCisgICAgICBzcmNfYSArPSB5dXYtPmFfc3RyaWRlOworICAgIH0KKyAgICByZXR1cm4gb2s7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJhdyBZVVYoQSkgcGxhbmVzCisKK2ludCBXZWJQV3JpdGVZVVYoRklMRSogZm91dCwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChmb3V0ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBidWZmZXItPndpZHRoOworICAgIGNvbnN0IGludCBoZWlnaHQgPSBidWZmZXItPmhlaWdodDsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgeXV2ID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0geXV2LT55OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0geXV2LT51OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0geXV2LT52OworICAgIGNvbnN0IHVpbnQ4X3QqIHNyY19hID0geXV2LT5hOworICAgIGNvbnN0IGludCB1dl93aWR0aCA9ICh3aWR0aCArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGhlaWdodCArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgYV9oZWlnaHQgPSAoc3JjX2EgIT0gTlVMTCkgPyBoZWlnaHQgOiAwOworICAgIGludCBvayA9IDE7CisgICAgaW50IHk7CisKKyAgICBpZiAoc3JjX3kgPT0gTlVMTCB8fCBzcmNfdSA9PSBOVUxMIHx8IHNyY192ID09IE5VTEwpIHJldHVybiAwOworCisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBvayAmPSAoZndyaXRlKHNyY195LCB3aWR0aCwgMSwgZm91dCkgPT0gMSk7CisgICAgICBzcmNfeSArPSB5dXYtPnlfc3RyaWRlOworICAgIH0KKyAgICBmb3IgKHkgPSAwOyBvayAmJiB5IDwgdXZfaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX3UsIHV2X3dpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIHNyY191ICs9IHl1di0+dV9zdHJpZGU7CisgICAgfQorICAgIGZvciAoeSA9IDA7IG9rICYmIHkgPCB1dl9oZWlnaHQ7ICsreSkgeworICAgICAgb2sgJj0gKGZ3cml0ZShzcmNfdiwgdXZfd2lkdGgsIDEsIGZvdXQpID09IDEpOworICAgICAgc3JjX3YgKz0geXV2LT52X3N0cmlkZTsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgb2sgJiYgeSA8IGFfaGVpZ2h0OyArK3kpIHsKKyAgICAgIG9rICY9IChmd3JpdGUoc3JjX2EsIHdpZHRoLCAxLCBmb3V0KSA9PSAxKTsKKyAgICAgIHNyY19hICs9IHl1di0+YV9zdHJpZGU7CisgICAgfQorICAgIHJldHVybiBvazsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2VuZXJpYyB0b3AtbGV2ZWwgY2FsbAorCitpbnQgV2ViUFNhdmVJbWFnZShjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIsCisgICAgICAgICAgICAgICAgICBXZWJQT3V0cHV0RmlsZUZvcm1hdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBvdXRfZmlsZV9uYW1lKSB7CisgIEZJTEUqIGZvdXQgPSBOVUxMOworICBpbnQgbmVlZHNfb3Blbl9maWxlID0gMTsKKyAgY29uc3QgaW50IHVzZV9zdGRvdXQgPSAob3V0X2ZpbGVfbmFtZSAhPSBOVUxMKSAmJiAhc3RyY21wKG91dF9maWxlX25hbWUsICItIik7CisgIGludCBvayA9IDE7CisKKyAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IG91dF9maWxlX25hbWUgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyAgbmVlZHNfb3Blbl9maWxlID0gKGZvcm1hdCAhPSBQTkcpOworI2VuZGlmCisKKyAgaWYgKG5lZWRzX29wZW5fZmlsZSkgeworICAgIGZvdXQgPSB1c2Vfc3Rkb3V0ID8gSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShzdGRvdXQpCisgICAgICAgICAgICAgICAgICAgICAgOiBmb3BlbihvdXRfZmlsZV9uYW1lLCAid2IiKTsKKyAgICBpZiAoZm91dCA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgJXNcbiIsIG91dF9maWxlX25hbWUpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGZvcm1hdCA9PSBQTkcgfHwKKyAgICAgIGZvcm1hdCA9PSBSR0JBIHx8IGZvcm1hdCA9PSBCR1JBIHx8IGZvcm1hdCA9PSBBUkdCIHx8CisgICAgICBmb3JtYXQgPT0gcmdiQSB8fCBmb3JtYXQgPT0gYmdyQSB8fCBmb3JtYXQgPT0gQXJnYikgeworI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAorICAgIG9rICY9IFdlYlBXcml0ZVBORyhvdXRfZmlsZV9uYW1lLCB1c2Vfc3Rkb3V0LCBidWZmZXIpOworI2Vsc2UKKyAgICBvayAmPSBXZWJQV3JpdGVQTkcoZm91dCwgYnVmZmVyKTsKKyNlbmRpZgorICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBQQU0pIHsKKyAgICBvayAmPSBXZWJQV3JpdGVQQU0oZm91dCwgYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChmb3JtYXQgPT0gUFBNIHx8IGZvcm1hdCA9PSBSR0IgfHwgZm9ybWF0ID09IEJHUikgeworICAgIG9rICY9IFdlYlBXcml0ZVBQTShmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBSR0JBXzQ0NDQgfHwgZm9ybWF0ID09IFJHQl81NjUgfHwgZm9ybWF0ID09IHJnYkFfNDQ0NCkgeworICAgIG9rICY9IFdlYlBXcml0ZTE2YkFzUEdNKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEJNUCkgeworICAgIG9rICY9IFdlYlBXcml0ZUJNUChmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBUSUZGKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlVElGRihmb3V0LCBidWZmZXIpOworICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBSQVdfWVVWKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlWVVWKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IFBHTSB8fCBmb3JtYXQgPT0gWVVWIHx8IGZvcm1hdCA9PSBZVVZBKSB7CisgICAgb2sgJj0gV2ViUFdyaXRlUEdNKGZvdXQsIGJ1ZmZlcik7CisgIH0gZWxzZSBpZiAoZm9ybWF0ID09IEFMUEhBX1BMQU5FX09OTFkpIHsKKyAgICBvayAmPSBXZWJQV3JpdGVBbHBoYVBsYW5lKGZvdXQsIGJ1ZmZlcik7CisgIH0KKyAgaWYgKGZvdXQgIT0gTlVMTCAmJiBmb3V0ICE9IHN0ZG91dCkgeworICAgIGZjbG9zZShmb3V0KTsKKyAgfQorICByZXR1cm4gb2s7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFiZGFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZV9lbmMuaApAQCAtMCwwICsxLDk2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEFsbC1pbi1vbmUgbGlicmFyeSB0byBzYXZlIFBORy9KUEVHL1dlYlAvVElGRi9XSUMgaW1hZ2VzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX0lNQUdFX0VOQ19IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fSU1BR0VfRU5DX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIE91dHB1dCB0eXBlcwordHlwZWRlZiBlbnVtIHsKKyAgUE5HID0gMCwKKyAgUEFNLAorICBQUE0sCisgIFBHTSwKKyAgQk1QLAorICBUSUZGLAorICBSQVdfWVVWLAorICBBTFBIQV9QTEFORV9PTkxZLCAgLy8gdGhpcyBpcyBmb3IgZXhwZXJpbWVudGluZyBvbmx5CisgIC8vIGZvcmNlZCBjb2xvcnNwYWNlIG91dHB1dCAoZm9yIHRlc3RpbmcsIG1vc3RseSkKKyAgUkdCLCBSR0JBLCBCR1IsIEJHUkEsIEFSR0IsCisgIFJHQkFfNDQ0NCwgUkdCXzU2NSwKKyAgcmdiQSwgYmdyQSwgQXJnYiwgcmdiQV80NDQ0LAorICBZVVYsIFlVVkEKK30gV2ViUE91dHB1dEZpbGVGb3JtYXQ7CisKKy8vIEdlbmVyYWwgYWxsLXB1cnBvc2UgY2FsbC4KKy8vIE1vc3QgZm9ybWF0cyBleHBlY3QgYSAnYnVmZmVyJyBjb250YWluaW5nIFJHQkEtbGlrZSBzYW1wbGVzLCBleGNlcHQKKy8vIFJBV19ZVVYsIFlVViBhbmQgWVVWQSBmb3JtYXRzLgorLy8gSWYgJ291dF9maWxlX25hbWUnIGlzICItIiwgZGF0YSBpcyBzYXZlZCB0byBzdGRvdXQuCisvLyBSZXR1cm5zIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkLCB0cnVlIG90aGVyd2lzZS4KK2ludCBXZWJQU2F2ZUltYWdlKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgIFdlYlBPdXRwdXRGaWxlRm9ybWF0IGZvcm1hdCwgY29uc3QgY2hhciogY29uc3Qgb3V0X2ZpbGVfbmFtZSk7CisKKy8vIFNhdmUgdG8gUE5HLgorI2lmZGVmIEhBVkVfV0lOQ09ERUNfSAoraW50IFdlYlBXcml0ZVBORyhjb25zdCBjaGFyKiBvdXRfZmlsZV9uYW1lLCBpbnQgdXNlX3N0ZG91dCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisjZWxzZQoraW50IFdlYlBXcml0ZVBORyhGSUxFKiBvdXRfZmlsZSwgY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKyNlbmRpZgorCisvLyBTYXZlIHRvIFBQTSBmb3JtYXQgKFJHQiwgbm8gYWxwaGEpCitpbnQgV2ViUFdyaXRlUFBNKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIHRvIFBBTSBmb3JtYXQgKD0gUFBNICsgYWxwaGEpCitpbnQgV2ViUFdyaXRlUEFNKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIDE2YiBtb2RlIChSR0JBNDQ0NCwgUkdCNTY1LCAuLi4pIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCitpbnQgV2ViUFdyaXRlMTZiQXNQR00oRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgYXMgQk1QCitpbnQgV2ViUFdyaXRlQk1QKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIGFzIFRJRkYKK2ludCBXZWJQV3JpdGVUSUZGKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIHRoZSBBTFBIQSBwbGFuZSAob25seSkgYXMgYSBQR00KK2ludCBXZWJQV3JpdGVBbHBoYVBsYW5lKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIGFzIFlVViBzYW1wbGVzIGFzIFBHTSBmb3JtYXQgKHVzaW5nIElNQzQgbGF5b3V0KS4KKy8vIFNlZTogaHR0cDovL3d3dy5mb3VyY2Mub3JnL3l1di5waHAjSU1DNC4KKy8vICh2ZXJ5IGNvbnZlbmllbnQgZm9ybWF0IGZvciB2aWV3aW5nIHRoZSBzYW1wbGVzLCBlc3AuIGZvciBvZGQgZGltZW5zaW9ucykuCitpbnQgV2ViUFdyaXRlUEdNKEZJTEUqIGZvdXQsIGNvbnN0IHN0cnVjdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCisvLyBTYXZlIFlVVihBKSBwbGFuZXMgc2VxdWVudGlhbGx5IChyYXcgZHVtcCkKK2ludCBXZWJQV3JpdGVZVVYoRklMRSogZm91dCwgY29uc3Qgc3RydWN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IGJ1ZmZlcik7CisKKy8vIFNhdmUgMTZiIG1vZGUgKFJHQkE0NDQ0LCBSR0I1NjUsIC4uLikgYXMgUEdNIGZvcm1hdCwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KK2ludCBXZWJQV3JpdGUxNmJBc1BHTShGSUxFKiBmb3V0LCBjb25zdCBzdHJ1Y3QgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19JTUFHRV9FTkNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNGFkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2ltYWdlaW9fdXRpbC5jCkBAIC0wLDAgKzEsMTU4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdGhlIGltYWdlIGRlY29kZXJzLgorLy8KKworI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKyNpbmNsdWRlIDxmY250bC5oPiAgIC8vIGZvciBfT19CSU5BUlkKKyNpbmNsdWRlIDxpby5oPiAgICAgIC8vIGZvciBfc2V0bW9kZSgpCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbGUgSS9PCisKK0ZJTEUqIEltZ0lvVXRpbFNldEJpbmFyeU1vZGUoRklMRSogZmlsZSkgeworI2lmIGRlZmluZWQoX1dJTjMyKQorICBpZiAoX3NldG1vZGUoX2ZpbGVubyhmaWxlKSwgX09fQklOQVJZKSA9PSAtMSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHJlb3BlbiBmaWxlIGluIE9fQklOQVJZIG1vZGUuXG4iKTsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorI2VuZGlmCisgIHJldHVybiBmaWxlOworfQorCitpbnQgSW1nSW9VdGlsUmVhZEZyb21TdGRpbihjb25zdCB1aW50OF90KiogZGF0YSwgc2l6ZV90KiBkYXRhX3NpemUpIHsKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmxvY2tTaXplID0gMTYzODQ7ICAvLyBkZWZhdWx0IGluaXRpYWwgc2l6ZQorICBzaXplX3QgbWF4X3NpemUgPSAwOworICBzaXplX3Qgc2l6ZSA9IDA7CisgIHVpbnQ4X3QqIGlucHV0ID0gTlVMTDsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgKmRhdGEgPSBOVUxMOworICAqZGF0YV9zaXplID0gMDsKKworICBpZiAoIUltZ0lvVXRpbFNldEJpbmFyeU1vZGUoc3RkaW4pKSByZXR1cm4gMDsKKworICB3aGlsZSAoIWZlb2Yoc3RkaW4pKSB7CisgICAgLy8gV2UgZG91YmxlIHRoZSBidWZmZXIgc2l6ZSBlYWNoIHRpbWUgYW5kIHJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKyAgICBjb25zdCBzaXplX3QgZXh0cmFfc2l6ZSA9IChtYXhfc2l6ZSA9PSAwKSA/IGtCbG9ja1NpemUgOiBtYXhfc2l6ZTsKKyAgICAvLyB3ZSBhbGxvY2F0ZSBvbmUgZXh0cmEgYnl0ZSBmb3IgdGhlIFwwIHRlcm1pbmF0b3IKKyAgICB2b2lkKiBjb25zdCBuZXdfZGF0YSA9IHJlYWxsb2MoaW5wdXQsIG1heF9zaXplICsgZXh0cmFfc2l6ZSArIDEpOworICAgIGlmIChuZXdfZGF0YSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIGlucHV0ID0gKHVpbnQ4X3QqKW5ld19kYXRhOworICAgIG1heF9zaXplICs9IGV4dHJhX3NpemU7CisgICAgc2l6ZSArPSBmcmVhZChpbnB1dCArIHNpemUsIDEsIGV4dHJhX3NpemUsIHN0ZGluKTsKKyAgICBpZiAoc2l6ZSA8IG1heF9zaXplKSBicmVhazsKKyAgfQorICBpZiAoZmVycm9yKHN0ZGluKSkgZ290byBFcnJvcjsKKyAgaWYgKGlucHV0ICE9IE5VTEwpIGlucHV0W3NpemVdID0gJ1wwJzsgIC8vIGNvbnZlbmllbnQgMC10ZXJtaW5hdG9yCisgICpkYXRhID0gaW5wdXQ7CisgICpkYXRhX3NpemUgPSBzaXplOworICByZXR1cm4gMTsKKworIEVycm9yOgorICBmcmVlKGlucHV0KTsKKyAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCBmcm9tIHN0ZGluXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBJbWdJb1V0aWxSZWFkRmlsZShjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplKSB7CisgIGludCBvazsKKyAgdWludDhfdCogZmlsZV9kYXRhOworICBzaXplX3QgZmlsZV9zaXplOworICBGSUxFKiBpbjsKKyAgY29uc3QgaW50IGZyb21fc3RkaW4gPSAoZmlsZV9uYW1lID09IE5VTEwpIHx8ICFzdHJjbXAoZmlsZV9uYW1lLCAiLSIpOworCisgIGlmIChmcm9tX3N0ZGluKSByZXR1cm4gSW1nSW9VdGlsUmVhZEZyb21TdGRpbihkYXRhLCBkYXRhX3NpemUpOworCisgIGlmIChkYXRhID09IE5VTEwgfHwgZGF0YV9zaXplID09IE5VTEwpIHJldHVybiAwOworICAqZGF0YSA9IE5VTEw7CisgICpkYXRhX3NpemUgPSAwOworCisgIGluID0gZm9wZW4oZmlsZV9uYW1lLCAicmIiKTsKKyAgaWYgKGluID09IE5VTEwpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgImNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJyVzJ1xuIiwgZmlsZV9uYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmc2VlayhpbiwgMCwgU0VFS19FTkQpOworICBmaWxlX3NpemUgPSBmdGVsbChpbik7CisgIGZzZWVrKGluLCAwLCBTRUVLX1NFVCk7CisgIC8vIHdlIGFsbG9jYXRlIG9uZSBleHRyYSBieXRlIGZvciB0aGUgXDAgdGVybWluYXRvcgorICBmaWxlX2RhdGEgPSAodWludDhfdCopbWFsbG9jKGZpbGVfc2l6ZSArIDEpOworICBpZiAoZmlsZV9kYXRhID09IE5VTEwpIHsKKyAgICBmY2xvc2UoaW4pOworICAgIGZwcmludGYoc3RkZXJyLCAibWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSB3aGVuIHJlYWRpbmcgZmlsZSAlc1xuIiwKKyAgICAgICAgICAgIGZpbGVfbmFtZSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb2sgPSAoZnJlYWQoZmlsZV9kYXRhLCBmaWxlX3NpemUsIDEsIGluKSA9PSAxKTsKKyAgZmNsb3NlKGluKTsKKworICBpZiAoIW9rKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgcmVhZCAlZCBieXRlcyBvZiBkYXRhIGZyb20gZmlsZSAlc1xuIiwKKyAgICAgICAgICAgIChpbnQpZmlsZV9zaXplLCBmaWxlX25hbWUpOworICAgIGZyZWUoZmlsZV9kYXRhKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmaWxlX2RhdGFbZmlsZV9zaXplXSA9ICdcMCc7ICAvLyBjb252ZW5pZW50IDAtdGVybWluYXRvcgorICAqZGF0YSA9IGZpbGVfZGF0YTsKKyAgKmRhdGFfc2l6ZSA9IGZpbGVfc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBJbWdJb1V0aWxXcml0ZUZpbGUoY29uc3QgY2hhciogY29uc3QgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplKSB7CisgIGludCBvazsKKyAgRklMRSogb3V0OworICBjb25zdCBpbnQgdG9fc3Rkb3V0ID0gKGZpbGVfbmFtZSA9PSBOVUxMKSB8fCAhc3RyY21wKGZpbGVfbmFtZSwgIi0iKTsKKworICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgb3V0ID0gdG9fc3Rkb3V0ID8gSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShzdGRvdXQpIDogZm9wZW4oZmlsZV9uYW1lLCAid2IiKTsKKyAgaWYgKG91dCA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJyVzJ1xuIiwgZmlsZV9uYW1lKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBvayA9IChmd3JpdGUoZGF0YSwgZGF0YV9zaXplLCAxLCBvdXQpID09IDEpOworICBpZiAob3V0ICE9IHN0ZG91dCkgZmNsb3NlKG91dCk7CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBJbWdJb1V0aWxDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICB3aGlsZSAoaGVpZ2h0LS0gPiAwKSB7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAqIHNpemVvZigqZHN0KSk7CisgICAgc3JjICs9IHNyY19zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgeworICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gbm1lbWIgKiBzaXplOworICBpbnQgb2sgPSAodG90YWxfc2l6ZSA9PSAoc2l6ZV90KXRvdGFsX3NpemUpOworI2lmIGRlZmluZWQoV0VCUF9NQVhfSU1BR0VfU0laRSkKKyAgb2sgPSBvayAmJiAodG90YWxfc2l6ZSA8PSAodWludDY0X3QpV0VCUF9NQVhfSU1BR0VfU0laRSk7CisjZW5kaWYKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9pbWFnZWlvX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkYjE1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vaW1hZ2Vpb191dGlsLmgKQEAgLTAsMCArMSw2NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBVdGlsaXR5IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBpbWFnZSBkZWNvZGVycy4KKy8vCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX0lNQUdFSU9fVVRJTF9IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fSU1BR0VJT19VVElMX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmlsZSBJL08KKworLy8gUmVvcGVuIGZpbGUgaW4gYmluYXJ5IChPX0JJTkFSWSkgbW9kZS4KKy8vIFJldHVybnMgJ2ZpbGUnIG9uIHN1Y2Nlc3MsIE5VTEwgb3RoZXJ3aXNlLgorRklMRSogSW1nSW9VdGlsU2V0QmluYXJ5TW9kZShGSUxFKiBmaWxlKTsKKworLy8gQWxsb2NhdGVzIHN0b3JhZ2UgZm9yIGVudGlyZSBmaWxlICdmaWxlX25hbWUnIGFuZCByZXR1cm5zIGNvbnRlbnRzIGFuZCBzaXplCisvLyBpbiAnZGF0YScgYW5kICdkYXRhX3NpemUnLiBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvdGhlcndpc2UuICcqZGF0YScgc2hvdWxkCisvLyBiZSBkZWxldGVkIHVzaW5nIGZyZWUoKS4KKy8vIE5vdGU6IGZvciBjb252ZW5pZW5jZSwgdGhlIGRhdGEgd2lsbCBiZSBudWxsLXRlcm1pbmF0ZWQgd2l0aCBhbiBleHRyYSBieXRlCisvLyAobm90IGFjY291bnRlZCBmb3IgaW4gKmRhdGFfc2l6ZSksIGluIGNhc2UgdGhlIGZpbGUgaXMgdGV4dCBhbmQgaW50ZW5kZWQKKy8vIHRvIGJlIHVzZWQgYXMgYSBDLXN0cmluZy4KKy8vIElmICdmaWxlX25hbWUnIGlzIE5VTEwgb3IgZXF1YWwgdG8gIi0iLCBpbnB1dCBpcyByZWFkIGZyb20gc3RkaW4gYnkgY2FsbGluZworLy8gdGhlIGZ1bmN0aW9uIEltZ0lvVXRpbFJlYWRGcm9tU3RkaW4oKS4KK2ludCBJbWdJb1V0aWxSZWFkRmlsZShjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplKTsKKworLy8gU2FtZSBhcyBJbWdJb1V0aWxSZWFkRmlsZSgpLCBidXQgcmVhZHMgdW50aWwgRU9GIGZyb20gc3RkaW4gaW5zdGVhZC4KK2ludCBJbWdJb1V0aWxSZWFkRnJvbVN0ZGluKGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSk7CisKKy8vIFdyaXRlIGEgZGF0YSBzZWdtZW50IGludG8gYSBmaWxlIG5hbWVkICdmaWxlX25hbWUnLiBSZXR1cm5zIHRydWUgaWYgb2suCisvLyBJZiAnZmlsZV9uYW1lJyBpcyBOVUxMIG9yIGVxdWFsIHRvICItIiwgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LgoraW50IEltZ0lvVXRpbFdyaXRlRmlsZShjb25zdCBjaGFyKiBjb25zdCBmaWxlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDb3B5IHdpZHRoIHggaGVpZ2h0IHBpeGVscyBmcm9tICdzcmMnIHRvICdkc3QnIGhvbm9yaW5nIHRoZSBzdHJpZGVzLgordm9pZCBJbWdJb1V0aWxDb3B5UGxhbmUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFJldHVybnMgMCBpbiBjYXNlIG9mIG92ZXJmbG93IG9mIG5tZW1iICogc2l6ZS4KK2ludCBJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX0lNQUdFSU9fVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWZlOTJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBKUEVHIGRlY29kZS4KKworI2luY2x1ZGUgIi4vanBlZ2RlYy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBXRUJQX0hBVkVfSlBFRworI2luY2x1ZGUgPGpwZWdsaWIuaD4KKyNpbmNsdWRlIDxqZXJyb3IuaD4KKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRhZGF0YSBwcm9jZXNzaW5nCisKKyNpZm5kZWYgSlBFR19BUFAxCisjIGRlZmluZSBKUEVHX0FQUDEgKEpQRUdfQVBQMCArIDEpCisjZW5kaWYKKyNpZm5kZWYgSlBFR19BUFAyCisjIGRlZmluZSBKUEVHX0FQUDIgKEpQRUdfQVBQMCArIDIpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCB1aW50OF90KiBkYXRhOworICBzaXplX3QgZGF0YV9sZW5ndGg7CisgIGludCBzZXE7ICAvLyB0aGlzIHNlZ21lbnQncyBzZXF1ZW5jZSBudW1iZXIgWzEsIDI1NV0gZm9yIHVzZSBpbiByZWFzc2VtYmx5LgorfSBJQ0NQU2VnbWVudDsKKworc3RhdGljIHZvaWQgU2F2ZU1ldGFkYXRhTWFya2VycyhqX2RlY29tcHJlc3NfcHRyIGRpbmZvKSB7CisgIGNvbnN0IHVuc2lnbmVkIGludCBtYXhfbWFya2VyX2xlbmd0aCA9IDB4ZmZmZjsKKyAganBlZ19zYXZlX21hcmtlcnMoZGluZm8sIEpQRUdfQVBQMSwgbWF4X21hcmtlcl9sZW5ndGgpOyAgLy8gRXhpZi9YTVAKKyAganBlZ19zYXZlX21hcmtlcnMoZGluZm8sIEpQRUdfQVBQMiwgbWF4X21hcmtlcl9sZW5ndGgpOyAgLy8gSUNDIHByb2ZpbGUKK30KKworc3RhdGljIGludCBDb21wYXJlSUNDUFNlZ21lbnRzKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIpIHsKKyAgY29uc3QgSUNDUFNlZ21lbnQqIHMxID0gKGNvbnN0IElDQ1BTZWdtZW50KilhOworICBjb25zdCBJQ0NQU2VnbWVudCogczIgPSAoY29uc3QgSUNDUFNlZ21lbnQqKWI7CisgIHJldHVybiBzMS0+c2VxIC0gczItPnNlcTsKK30KKworLy8gRXh0cmFjdCBJQ0MgcHJvZmlsZSBzZWdtZW50cyBmcm9tIHRoZSBtYXJrZXIgbGlzdCBpbiAnZGluZm8nLCByZWFzc2VtYmxpbmcKKy8vIGFuZCBzdG9yaW5nIHRoZW0gaW4gJ2ljY3AnLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MgYW5kIGZhbHNlIGZvciBtZW1vcnkgZXJyb3JzIGFuZCBjb3JydXB0IHByb2ZpbGVzLgorc3RhdGljIGludCBTdG9yZUlDQ1Aoal9kZWNvbXByZXNzX3B0ciBkaW5mbywgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBpY2NwKSB7CisgIC8vIElDQy4xOjIwMTAtMTIgKDQuMy4wLjApIEFubmV4IEIuNCBFbWJlZGRpbmcgSUNDIFByb2ZpbGVzIGluIEpQRUcgZmlsZXMKKyAgc3RhdGljIGNvbnN0IGNoYXIga0lDQ1BTaWduYXR1cmVbXSA9ICJJQ0NfUFJPRklMRSI7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0lDQ1BTaWduYXR1cmVMZW5ndGggPSAxMjsgIC8vIHNpZ25hdHVyZSBpbmNsdWRlcyAnXDAnCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0lDQ1BTa2lwTGVuZ3RoID0gMTQ7ICAvLyBzaWduYXR1cmUgKyBzZXEgJiBjb3VudAorICBpbnQgZXhwZWN0ZWRfY291bnQgPSAwOworICBpbnQgYWN0dWFsX2NvdW50ID0gMDsKKyAgaW50IHNlcV9tYXggPSAwOworICBzaXplX3QgdG90YWxfc2l6ZSA9IDA7CisgIElDQ1BTZWdtZW50IGljY3Bfc2VnbWVudHNbMjU1XTsKKyAganBlZ19zYXZlZF9tYXJrZXJfcHRyIG1hcmtlcjsKKworICBtZW1zZXQoaWNjcF9zZWdtZW50cywgMCwgc2l6ZW9mKGljY3Bfc2VnbWVudHMpKTsKKyAgZm9yIChtYXJrZXIgPSBkaW5mby0+bWFya2VyX2xpc3Q7IG1hcmtlciAhPSBOVUxMOyBtYXJrZXIgPSBtYXJrZXItPm5leHQpIHsKKyAgICBpZiAobWFya2VyLT5tYXJrZXIgPT0gSlBFR19BUFAyICYmCisgICAgICAgIG1hcmtlci0+ZGF0YV9sZW5ndGggPiBrSUNDUFNraXBMZW5ndGggJiYKKyAgICAgICAgIW1lbWNtcChtYXJrZXItPmRhdGEsIGtJQ0NQU2lnbmF0dXJlLCBrSUNDUFNpZ25hdHVyZUxlbmd0aCkpIHsKKyAgICAgIC8vIElDQ19QUk9GSUxFXDA8c2VxPjxjb3VudD47ICdzZXEnIHN0YXJ0cyBhdCAxLgorICAgICAgY29uc3QgaW50IHNlcSA9IG1hcmtlci0+ZGF0YVtrSUNDUFNpZ25hdHVyZUxlbmd0aF07CisgICAgICBjb25zdCBpbnQgY291bnQgPSBtYXJrZXItPmRhdGFba0lDQ1BTaWduYXR1cmVMZW5ndGggKyAxXTsKKyAgICAgIGNvbnN0IHNpemVfdCBzZWdtZW50X3NpemUgPSBtYXJrZXItPmRhdGFfbGVuZ3RoIC0ga0lDQ1BTa2lwTGVuZ3RoOworICAgICAgSUNDUFNlZ21lbnQqIHNlZ21lbnQ7CisKKyAgICAgIGlmIChzZWdtZW50X3NpemUgPT0gMCB8fCBjb3VudCA9PSAwIHx8IHNlcSA9PSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiW0lDQ1BdIHNpemUgKCVkKSAvIGNvdW50ICglZCkgLyBzZXF1ZW5jZSBudW1iZXIgKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgY2Fubm90IGJlIDAhXG4iLAorICAgICAgICAgICAgICAgIChpbnQpc2VnbWVudF9zaXplLCBzZXEsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIGlmIChleHBlY3RlZF9jb3VudCA9PSAwKSB7CisgICAgICAgIGV4cGVjdGVkX2NvdW50ID0gY291bnQ7CisgICAgICB9IGVsc2UgaWYgKGV4cGVjdGVkX2NvdW50ICE9IGNvdW50KSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiW0lDQ1BdIEluY29uc2lzdGVudCBzZWdtZW50IGNvdW50ICglZCAvICVkKSFcbiIsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRfY291bnQsIGNvdW50KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisKKyAgICAgIHNlZ21lbnQgPSBpY2NwX3NlZ21lbnRzICsgc2VxIC0gMTsKKyAgICAgIGlmIChzZWdtZW50LT5kYXRhX2xlbmd0aCAhPSAwKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiW0lDQ1BdIER1cGxpY2F0ZSBzZWdtZW50IG51bWJlciAoJWQpIVxuIiAsIHNlcSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorCisgICAgICBzZWdtZW50LT5kYXRhID0gbWFya2VyLT5kYXRhICsga0lDQ1BTa2lwTGVuZ3RoOworICAgICAgc2VnbWVudC0+ZGF0YV9sZW5ndGggPSBzZWdtZW50X3NpemU7CisgICAgICBzZWdtZW50LT5zZXEgPSBzZXE7CisgICAgICB0b3RhbF9zaXplICs9IHNlZ21lbnRfc2l6ZTsKKyAgICAgIGlmIChzZXEgPiBzZXFfbWF4KSBzZXFfbWF4ID0gc2VxOworICAgICAgKythY3R1YWxfY291bnQ7CisgICAgfQorICB9CisKKyAgaWYgKGFjdHVhbF9jb3VudCA9PSAwKSByZXR1cm4gMTsKKyAgaWYgKHNlcV9tYXggIT0gYWN0dWFsX2NvdW50KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJbSUNDUF0gRGlzY29udGludW91cyBzZWdtZW50cywgZXhwZWN0ZWQ6ICVkIGFjdHVhbDogJWQhXG4iLAorICAgICAgICAgICAgYWN0dWFsX2NvdW50LCBzZXFfbWF4KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoZXhwZWN0ZWRfY291bnQgIT0gYWN0dWFsX2NvdW50KSB7CisgICAgZnByaW50ZihzdGRlcnIsICJbSUNDUF0gU2VnbWVudCBjb3VudDogJWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQ6ICVkIVxuIiwKKyAgICAgICAgICAgIGFjdHVhbF9jb3VudCwgZXhwZWN0ZWRfY291bnQpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gVGhlIHNlZ21lbnRzIG1heSBhcHBlYXIgb3V0IG9mIG9yZGVyIGluIHRoZSBmaWxlLCBzb3J0IHRoZW0gYmFzZWQgb24KKyAgLy8gc2VxdWVuY2UgbnVtYmVyIGJlZm9yZSBhc3NlbWJsaW5nIHRoZSBwYXlsb2FkLgorICBxc29ydChpY2NwX3NlZ21lbnRzLCBhY3R1YWxfY291bnQsIHNpemVvZigqaWNjcF9zZWdtZW50cyksCisgICAgICAgIENvbXBhcmVJQ0NQU2VnbWVudHMpOworCisgIGljY3AtPmJ5dGVzID0gKHVpbnQ4X3QqKW1hbGxvYyh0b3RhbF9zaXplKTsKKyAgaWYgKGljY3AtPmJ5dGVzID09IE5VTEwpIHJldHVybiAwOworICBpY2NwLT5zaXplID0gdG90YWxfc2l6ZTsKKworICB7CisgICAgaW50IGk7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IHNlcV9tYXg7ICsraSkgeworICAgICAgbWVtY3B5KGljY3AtPmJ5dGVzICsgb2Zmc2V0LAorICAgICAgICAgICAgIGljY3Bfc2VnbWVudHNbaV0uZGF0YSwgaWNjcF9zZWdtZW50c1tpXS5kYXRhX2xlbmd0aCk7CisgICAgICBvZmZzZXQgKz0gaWNjcF9zZWdtZW50c1tpXS5kYXRhX2xlbmd0aDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIGFuZCBmYWxzZSBmb3IgbWVtb3J5IGVycm9ycyBhbmQgY29ycnVwdCBwcm9maWxlcy4KKy8vIFRoZSBjYWxsZXIgbXVzdCB1c2UgTWV0YWRhdGFGcmVlKCkgb24gJ21ldGFkYXRhJyBpbiBhbGwgY2FzZXMuCitzdGF0aWMgaW50IEV4dHJhY3RNZXRhZGF0YUZyb21KUEVHKGpfZGVjb21wcmVzc19wdHIgZGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICBpbnQgbWFya2VyOworICAgIGNvbnN0IGNoYXIqIHNpZ25hdHVyZTsKKyAgICBzaXplX3Qgc2lnbmF0dXJlX2xlbmd0aDsKKyAgICBzaXplX3Qgc3RvcmFnZV9vZmZzZXQ7CisgIH0ga0pQRUdNZXRhZGF0YU1hcFtdID0geworICAgIC8vIEV4aWYgMi4yIFNlY3Rpb24gNC43LjIgSW50ZXJvcGVyYWJpbGl0eSBTdHJ1Y3R1cmUgb2YgQVBQMSAuLi4KKyAgICB7IEpQRUdfQVBQMSwgIkV4aWZcMCIsICAgICAgICAgICAgICAgICAgICAgICAgNiwgTUVUQURBVEFfT0ZGU0VUKGV4aWYpIH0sCisgICAgLy8gWE1QIFNwZWNpZmljYXRpb24gUGFydCAzIFNlY3Rpb24gMyBFbWJlZGRpbmcgWE1QIE1ldGFkYXRhIC4uLiAjSlBFRworICAgIC8vIFRPRE8oanplcm4pIEFkZCBzdXBwb3J0IGZvciAnRXh0ZW5kZWRYTVAnCisgICAgeyBKUEVHX0FQUDEsICJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiwgMjksIE1FVEFEQVRBX09GRlNFVCh4bXApIH0sCisgICAgeyAwLCBOVUxMLCAwLCAwIH0sCisgIH07CisgIGpwZWdfc2F2ZWRfbWFya2VyX3B0ciBtYXJrZXI7CisgIC8vIFRyZWF0IElDQyBwcm9maWxlcyBzZXBhcmF0ZWx5IGFzIHRoZXkgbWF5IGJlIHNlZ21lbnRlZCBhbmQgb3V0IG9mIG9yZGVyLgorICBpZiAoIVN0b3JlSUNDUChkaW5mbywgJm1ldGFkYXRhLT5pY2NwKSkgcmV0dXJuIDA7CisKKyAgZm9yIChtYXJrZXIgPSBkaW5mby0+bWFya2VyX2xpc3Q7IG1hcmtlciAhPSBOVUxMOyBtYXJrZXIgPSBtYXJrZXItPm5leHQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBrSlBFR01ldGFkYXRhTWFwW2ldLm1hcmtlciAhPSAwOyArK2kpIHsKKyAgICAgIGlmIChtYXJrZXItPm1hcmtlciA9PSBrSlBFR01ldGFkYXRhTWFwW2ldLm1hcmtlciAmJgorICAgICAgICAgIG1hcmtlci0+ZGF0YV9sZW5ndGggPiBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZV9sZW5ndGggJiYKKyAgICAgICAgICAhbWVtY21wKG1hcmtlci0+ZGF0YSwga0pQRUdNZXRhZGF0YU1hcFtpXS5zaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZV9sZW5ndGgpKSB7CisgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCA9CisgICAgICAgICAgICAoTWV0YWRhdGFQYXlsb2FkKikoKHVpbnQ4X3QqKW1ldGFkYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSlBFR01ldGFkYXRhTWFwW2ldLnN0b3JhZ2Vfb2Zmc2V0KTsKKworICAgICAgICBpZiAocGF5bG9hZC0+Ynl0ZXMgPT0gTlVMTCkgeworICAgICAgICAgIGNvbnN0IGNoYXIqIG1hcmtlcl9kYXRhID0gKGNvbnN0IGNoYXIqKW1hcmtlci0+ZGF0YSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZV9sZW5ndGg7CisgICAgICAgICAgY29uc3Qgc2l6ZV90IG1hcmtlcl9kYXRhX2xlbmd0aCA9CisgICAgICAgICAgICAgIG1hcmtlci0+ZGF0YV9sZW5ndGggLSBrSlBFR01ldGFkYXRhTWFwW2ldLnNpZ25hdHVyZV9sZW5ndGg7CisgICAgICAgICAgaWYgKCFNZXRhZGF0YUNvcHkobWFya2VyX2RhdGEsIG1hcmtlcl9kYXRhX2xlbmd0aCwgcGF5bG9hZCkpIHJldHVybiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgYWRkaXRpb25hbCAnJXMnIG1hcmtlclxuIiwKKyAgICAgICAgICAgICAgICAgIGtKUEVHTWV0YWRhdGFNYXBbaV0uc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworI3VuZGVmIEpQRUdfQVBQMQorI3VuZGVmIEpQRUdfQVBQMgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSlBFRyBkZWNvZGluZworCitzdHJ1Y3QgbXlfZXJyb3JfbWdyIHsKKyAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIHB1YjsKKyAgam1wX2J1ZiBzZXRqbXBfYnVmZmVyOworfTsKKworc3RhdGljIHZvaWQgbXlfZXJyb3JfZXhpdChqX2NvbW1vbl9wdHIgZGluZm8pIHsKKyAgc3RydWN0IG15X2Vycm9yX21nciogbXllcnIgPSAoc3RydWN0IG15X2Vycm9yX21nciopZGluZm8tPmVycjsKKyAgZGluZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UoZGluZm8pOworICBsb25nam1wKG15ZXJyLT5zZXRqbXBfYnVmZmVyLCAxKTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBzdHJ1Y3QganBlZ19zb3VyY2VfbWdyIHB1YjsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IGRhdGFfc2l6ZTsKK30gSlBFR1JlYWRDb250ZXh0OworCitzdGF0aWMgdm9pZCBDb250ZXh0SW5pdChqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgIEpQRUdSZWFkQ29udGV4dCogY29uc3QgY3R4ID0gKEpQRUdSZWFkQ29udGV4dCopY2luZm8tPnNyYzsKKyAgY3R4LT5wdWIubmV4dF9pbnB1dF9ieXRlID0gY3R4LT5kYXRhOworICBjdHgtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSBjdHgtPmRhdGFfc2l6ZTsKK30KKworc3RhdGljIGJvb2xlYW4gQ29udGV4dEZpbGwoal9kZWNvbXByZXNzX3B0ciBjaW5mbykgeworICAvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUuCisgIEVSUkVYSVQoY2luZm8sIEpFUlJfRklMRV9SRUFEKTsKKyAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgdm9pZCBDb250ZXh0U2tpcChqX2RlY29tcHJlc3NfcHRyIGNpbmZvLCBsb25nIGp1bXBfc2l6ZSkgeworICBKUEVHUmVhZENvbnRleHQqIGNvbnN0IGN0eCA9IChKUEVHUmVhZENvbnRleHQqKWNpbmZvLT5zcmM7CisgIHNpemVfdCBqdW1wID0gKHNpemVfdClqdW1wX3NpemU7CisgIGlmIChqdW1wID4gY3R4LT5wdWIuYnl0ZXNfaW5fYnVmZmVyKSB7ICAvLyBEb24ndCBvdmVyZmxvdyB0aGUgYnVmZmVyLgorICAgIGp1bXAgPSBjdHgtPnB1Yi5ieXRlc19pbl9idWZmZXI7CisgIH0KKyAgY3R4LT5wdWIuYnl0ZXNfaW5fYnVmZmVyIC09IGp1bXA7CisgIGN0eC0+cHViLm5leHRfaW5wdXRfYnl0ZSArPSBqdW1wOworfQorCitzdGF0aWMgdm9pZCBDb250ZXh0VGVybShqX2RlY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICh2b2lkKWNpbmZvOworfQorCitzdGF0aWMgdm9pZCBDb250ZXh0U2V0dXAodm9sYXRpbGUgc3RydWN0IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNvbnN0IGNpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIEpQRUdSZWFkQ29udGV4dCogY29uc3QgY3R4KSB7CisgIGNpbmZvLT5zcmMgPSAoc3RydWN0IGpwZWdfc291cmNlX21nciopY3R4OworICBjdHgtPnB1Yi5pbml0X3NvdXJjZSA9IENvbnRleHRJbml0OworICBjdHgtPnB1Yi5maWxsX2lucHV0X2J1ZmZlciA9IENvbnRleHRGaWxsOworICBjdHgtPnB1Yi5za2lwX2lucHV0X2RhdGEgPSBDb250ZXh0U2tpcDsKKyAgY3R4LT5wdWIucmVzeW5jX3RvX3Jlc3RhcnQgPSBqcGVnX3Jlc3luY190b19yZXN0YXJ0OworICBjdHgtPnB1Yi50ZXJtX3NvdXJjZSA9IENvbnRleHRUZXJtOworICBjdHgtPnB1Yi5ieXRlc19pbl9idWZmZXIgPSAwOworICBjdHgtPnB1Yi5uZXh0X2lucHV0X2J5dGUgPSBOVUxMOworfQorCitpbnQgUmVhZEpQRUcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgdm9sYXRpbGUgaW50IG9rID0gMDsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIGludDY0X3Qgc3RyaWRlOworICB2b2xhdGlsZSBzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCBkaW5mbzsKKyAgc3RydWN0IG15X2Vycm9yX21nciBqZXJyOworICB1aW50OF90KiB2b2xhdGlsZSByZ2IgPSBOVUxMOworICBKU0FNUFJPVyBidWZmZXJbMV07CisgIEpQRUdSZWFkQ29udGV4dCBjdHg7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCB8fCBwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKKyAgY3R4LmRhdGEgPSBkYXRhOworICBjdHguZGF0YV9zaXplID0gZGF0YV9zaXplOworCisgIG1lbXNldCgoal9kZWNvbXByZXNzX3B0cikmZGluZm8sIDAsIHNpemVvZihkaW5mbykpOyAgIC8vIGZvciBzZXRqbXAgc2FuaXR5CisgIGRpbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZqZXJyLnB1Yik7CisgIGplcnIucHViLmVycm9yX2V4aXQgPSBteV9lcnJvcl9leGl0OworCisgIGlmIChzZXRqbXAoamVyci5zZXRqbXBfYnVmZmVyKSkgeworIEVycm9yOgorICAgIE1ldGFkYXRhRnJlZShtZXRhZGF0YSk7CisgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGpwZWdfY3JlYXRlX2RlY29tcHJlc3MoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKyAgQ29udGV4dFNldHVwKCZkaW5mbywgJmN0eCk7CisgIGlmIChtZXRhZGF0YSAhPSBOVUxMKSBTYXZlTWV0YWRhdGFNYXJrZXJzKChqX2RlY29tcHJlc3NfcHRyKSZkaW5mbyk7CisgIGpwZWdfcmVhZF9oZWFkZXIoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvLCBUUlVFKTsKKworICBkaW5mby5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfUkdCOworICBkaW5mby5kb19mYW5jeV91cHNhbXBsaW5nID0gVFJVRTsKKworICBqcGVnX3N0YXJ0X2RlY29tcHJlc3MoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvKTsKKworICBpZiAoZGluZm8ub3V0cHV0X2NvbXBvbmVudHMgIT0gMykgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICB3aWR0aCA9IGRpbmZvLm91dHB1dF93aWR0aDsKKyAgaGVpZ2h0ID0gZGluZm8ub3V0cHV0X2hlaWdodDsKKyAgc3RyaWRlID0gKGludDY0X3QpZGluZm8ub3V0cHV0X3dpZHRoICogZGluZm8ub3V0cHV0X2NvbXBvbmVudHMgKiBzaXplb2YoKnJnYik7CisKKyAgaWYgKHN0cmlkZSAhPSAoaW50KXN0cmlkZSB8fAorICAgICAgIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHN0cmlkZSwgaGVpZ2h0KSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICByZ2IgPSAodWludDhfdCopbWFsbG9jKChzaXplX3Qpc3RyaWRlICogaGVpZ2h0KTsKKyAgaWYgKHJnYiA9PSBOVUxMKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBidWZmZXJbMF0gPSAoSlNBTVBMRSopcmdiOworCisgIHdoaWxlIChkaW5mby5vdXRwdXRfc2NhbmxpbmUgPCBkaW5mby5vdXRwdXRfaGVpZ2h0KSB7CisgICAgaWYgKGpwZWdfcmVhZF9zY2FubGluZXMoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvLCBidWZmZXIsIDEpICE9IDEpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICAgIGJ1ZmZlclswXSArPSBzdHJpZGU7CisgIH0KKworICBpZiAobWV0YWRhdGEgIT0gTlVMTCkgeworICAgIG9rID0gRXh0cmFjdE1ldGFkYXRhRnJvbUpQRUcoKGpfZGVjb21wcmVzc19wdHIpJmRpbmZvLCBtZXRhZGF0YSk7CisgICAgaWYgKCFvaykgeworICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBleHRyYWN0aW5nIEpQRUcgbWV0YWRhdGEhXG4iKTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAganBlZ19maW5pc2hfZGVjb21wcmVzcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworICBqcGVnX2Rlc3Ryb3lfZGVjb21wcmVzcygoal9kZWNvbXByZXNzX3B0cikmZGluZm8pOworCisgIC8vIFdlYlAgY29udmVyc2lvbi4KKyAgcGljLT53aWR0aCA9IHdpZHRoOworICBwaWMtPmhlaWdodCA9IGhlaWdodDsKKyAgb2sgPSBXZWJQUGljdHVyZUltcG9ydFJHQihwaWMsIHJnYiwgKGludClzdHJpZGUpOworICBpZiAoIW9rKSBnb3RvIEVycm9yOworCisgRW5kOgorICBmcmVlKHJnYik7CisgIHJldHVybiBvazsKK30KKyNlbHNlICAvLyAhV0VCUF9IQVZFX0pQRUcKK2ludCBSZWFkSlBFRyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgICh2b2lkKWRhdGE7CisgICh2b2lkKWRhdGFfc2l6ZTsKKyAgKHZvaWQpcGljOworICAodm9pZClrZWVwX2FscGhhOworICAodm9pZCltZXRhZGF0YTsKKyAgZnByaW50ZihzdGRlcnIsICJKUEVHIHN1cHBvcnQgbm90IGNvbXBpbGVkLiBQbGVhc2UgaW5zdGFsbCB0aGUgbGlianBlZyAiCisgICAgICAgICAgImRldmVsb3BtZW50IHBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIHJldHVybiAwOworfQorI2VuZGlmICAvLyBXRUJQX0hBVkVfSlBFRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL2pwZWdkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZjMTRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9qcGVnZGVjLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEpQRUcgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19KUEVHREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19KUEVHREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworc3RydWN0IE1ldGFkYXRhOworc3RydWN0IFdlYlBQaWN0dXJlOworCisvLyBSZWFkcyBhIEpQRUcgZnJvbSAnZGF0YScsIHJldHVybmluZyB0aGUgZGVjb2RlZCBvdXRwdXQgaW4gJ3BpYycuCisvLyBUaGUgb3V0cHV0IGlzIFJHQiBvciBZVVYgZGVwZW5kaW5nIG9uIHBpYy0+dXNlX2FyZ2IgdmFsdWUuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKy8vICdrZWVwX2FscGhhJyBoYXMgbm8gZWZmZWN0LCBidXQgaXMga2VwdCBmb3IgY29oZXJlbmNlIHdpdGggb3RoZXIgc2lnbmF0dXJlcworLy8gZm9yIGltYWdlIHJlYWRlcnMuCitpbnQgUmVhZEpQRUcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fSlBFR0RFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9tZXRhZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmYyZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmMKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBNZXRhZGF0YSB0eXBlcyBhbmQgZnVuY3Rpb25zLgorLy8KKworI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCit2b2lkIE1ldGFkYXRhSW5pdChNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHJldHVybjsKKyAgbWVtc2V0KG1ldGFkYXRhLCAwLCBzaXplb2YoKm1ldGFkYXRhKSk7Cit9CisKK3ZvaWQgTWV0YWRhdGFQYXlsb2FkRGVsZXRlKE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCkgeworICBpZiAocGF5bG9hZCA9PSBOVUxMKSByZXR1cm47CisgIGZyZWUocGF5bG9hZC0+Ynl0ZXMpOworICBwYXlsb2FkLT5ieXRlcyA9IE5VTEw7CisgIHBheWxvYWQtPnNpemUgPSAwOworfQorCit2b2lkIE1ldGFkYXRhRnJlZShNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgaWYgKG1ldGFkYXRhID09IE5VTEwpIHJldHVybjsKKyAgTWV0YWRhdGFQYXlsb2FkRGVsZXRlKCZtZXRhZGF0YS0+ZXhpZik7CisgIE1ldGFkYXRhUGF5bG9hZERlbGV0ZSgmbWV0YWRhdGEtPmljY3ApOworICBNZXRhZGF0YVBheWxvYWREZWxldGUoJm1ldGFkYXRhLT54bXApOworfQorCitpbnQgTWV0YWRhdGFDb3B5KGNvbnN0IGNoYXIqIG1ldGFkYXRhLCBzaXplX3QgbWV0YWRhdGFfbGVuLAorICAgICAgICAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpIHsKKyAgaWYgKG1ldGFkYXRhID09IE5VTEwgfHwgbWV0YWRhdGFfbGVuID09IDAgfHwgcGF5bG9hZCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGF5bG9hZC0+Ynl0ZXMgPSAodWludDhfdCopbWFsbG9jKG1ldGFkYXRhX2xlbik7CisgIGlmIChwYXlsb2FkLT5ieXRlcyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcGF5bG9hZC0+c2l6ZSA9IG1ldGFkYXRhX2xlbjsKKyAgbWVtY3B5KHBheWxvYWQtPmJ5dGVzLCBtZXRhZGF0YSwgbWV0YWRhdGFfbGVuKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ1YmU5MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vbWV0YWRhdGEuaApAQCAtMCwwICsxLDQ3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIE1ldGFkYXRhIHR5cGVzIGFuZCBmdW5jdGlvbnMuCisvLworCisjaWZuZGVmIFdFQlBfSU1BR0VJT19NRVRBREFUQV9IXworI2RlZmluZSBXRUJQX0lNQUdFSU9fTUVUQURBVEFfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBNZXRhZGF0YVBheWxvYWQgeworICB1aW50OF90KiBieXRlczsKKyAgc2l6ZV90IHNpemU7Cit9IE1ldGFkYXRhUGF5bG9hZDsKKwordHlwZWRlZiBzdHJ1Y3QgTWV0YWRhdGEgeworICBNZXRhZGF0YVBheWxvYWQgZXhpZjsKKyAgTWV0YWRhdGFQYXlsb2FkIGljY3A7CisgIE1ldGFkYXRhUGF5bG9hZCB4bXA7Cit9IE1ldGFkYXRhOworCisjZGVmaW5lIE1FVEFEQVRBX09GRlNFVCh4KSBvZmZzZXRvZihNZXRhZGF0YSwgeCkKKwordm9pZCBNZXRhZGF0YUluaXQoTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKK3ZvaWQgTWV0YWRhdGFQYXlsb2FkRGVsZXRlKE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCk7Cit2b2lkIE1ldGFkYXRhRnJlZShNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisvLyBTdG9yZXMgJ21ldGFkYXRhJyB0byAncGF5bG9hZC0+Ynl0ZXMnLCByZXR1cm5zIGZhbHNlIG9uIGFsbG9jYXRpb24gZXJyb3IuCitpbnQgTWV0YWRhdGFDb3B5KGNvbnN0IGNoYXIqIG1ldGFkYXRhLCBzaXplX3QgbWV0YWRhdGFfbGVuLAorICAgICAgICAgICAgICAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX01FVEFEQVRBX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjIyMzUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuYwpAQCAtMCwwICsxLDM0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFBORyBkZWNvZGUuCisKKyNpbmNsdWRlICIuL3BuZ2RlYy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZmRlZiBXRUJQX0hBVkVfUE5HCisjaW5jbHVkZSA8cG5nLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+ICAgLy8gbm90ZTogdGhpcyBtdXN0IGJlIGluY2x1ZGVkICphZnRlciogcG5nLmgKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKK3N0YXRpYyB2b2lkIFBOR0FQSSBlcnJvcl9mdW5jdGlvbihwbmdfc3RydWN0cCBwbmcsIHBuZ19jb25zdF9jaGFycCBlcnJvcikgeworICBpZiAoZXJyb3IgIT0gTlVMTCkgZnByaW50ZihzdGRlcnIsICJsaWJwbmcgZXJyb3I6ICVzXG4iLCBlcnJvcik7CisgIGxvbmdqbXAocG5nX2ptcGJ1ZihwbmcpLCAxKTsKK30KKworLy8gQ29udmVydHMgdGhlIE5VTEwgdGVybWluYXRlZCAnaGV4c3RyaW5nJyB3aGljaCBjb250YWlucyAyLWJ5dGUgY2hhcmFjdGVyCisvLyByZXByZXNlbnRhdGlvbnMgb2YgaGV4IHZhbHVlcyB0byByYXcgZGF0YS4KKy8vICdoZXhzdHJpbmcnIG1heSBjb250YWluIHZhbHVlcyBjb25zaXN0aW5nIG9mIFtBLUZdW2EtZl1bMC05XSBpbiBwYWlycywKKy8vIGUuZy4sIDdhZjIuLi4sIHNlcGFyYXRlZCBieSBhbnkgbnVtYmVyIG9mIG5ld2xpbmVzLgorLy8gJ2V4cGVjdGVkX2xlbmd0aCcgaXMgdGhlIGFudGljaXBhdGVkIHByb2Nlc3NlZCBzaXplLgorLy8gT24gc3VjY2VzcyB0aGUgcmF3IGJ1ZmZlciBpcyByZXR1cm5lZCB3aXRoIGl0cyBsZW5ndGggZXF1aXZhbGVudCB0bworLy8gJ2V4cGVjdGVkX2xlbmd0aCcuIE5VTEwgaXMgcmV0dXJuZWQgaWYgdGhlIHByb2Nlc3NlZCBsZW5ndGggaXMgbGVzcyB0aGFuCisvLyAnZXhwZWN0ZWRfbGVuZ3RoJyBvciBhbnkgY2hhcmFjdGVyIGFzaWRlIGZyb20gdGhvc2UgYWJvdmUgaXMgZW5jb3VudGVyZWQuCisvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KK3N0YXRpYyB1aW50OF90KiBIZXhTdHJpbmdUb0J5dGVzKGNvbnN0IGNoYXIqIGhleHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZF9sZW5ndGgpIHsKKyAgY29uc3QgY2hhciogc3JjID0gaGV4c3RyaW5nOworICBzaXplX3QgYWN0dWFsX2xlbmd0aCA9IDA7CisgIHVpbnQ4X3QqIGNvbnN0IHJhd19kYXRhID0gKHVpbnQ4X3QqKW1hbGxvYyhleHBlY3RlZF9sZW5ndGgpOworICB1aW50OF90KiBkc3Q7CisKKyAgaWYgKHJhd19kYXRhID09IE5VTEwpIHJldHVybiBOVUxMOworCisgIGZvciAoZHN0ID0gcmF3X2RhdGE7IGFjdHVhbF9sZW5ndGggPCBleHBlY3RlZF9sZW5ndGggJiYgKnNyYyAhPSAnXDAnOyArK3NyYykgeworICAgIGNoYXIqIGVuZDsKKyAgICBjaGFyIHZhbFszXTsKKyAgICBpZiAoKnNyYyA9PSAnXG4nKSBjb250aW51ZTsKKyAgICB2YWxbMF0gPSAqc3JjKys7CisgICAgdmFsWzFdID0gKnNyYzsKKyAgICB2YWxbMl0gPSAnXDAnOworICAgICpkc3QrKyA9ICh1aW50OF90KXN0cnRvbCh2YWwsICZlbmQsIDE2KTsKKyAgICBpZiAoZW5kICE9IHZhbCArIDIpIGJyZWFrOworICAgICsrYWN0dWFsX2xlbmd0aDsKKyAgfQorCisgIGlmIChhY3R1YWxfbGVuZ3RoICE9IGV4cGVjdGVkX2xlbmd0aCkgeworICAgIGZyZWUocmF3X2RhdGEpOworICAgIHJldHVybiBOVUxMOworICB9CisgIHJldHVybiByYXdfZGF0YTsKK30KKworc3RhdGljIGludCBQcm9jZXNzUmF3UHJvZmlsZShjb25zdCBjaGFyKiBwcm9maWxlLCBzaXplX3QgcHJvZmlsZV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCkgeworICBjb25zdCBjaGFyKiBzcmMgPSBwcm9maWxlOworICBjaGFyKiBlbmQ7CisgIGludCBleHBlY3RlZF9sZW5ndGg7CisKKyAgaWYgKHByb2ZpbGUgPT0gTlVMTCB8fCBwcm9maWxlX2xlbiA9PSAwKSByZXR1cm4gMDsKKworICAvLyBJbWFnZU1hZ2ljayBmb3JtYXRzICdyYXcgcHJvZmlsZXMnIGFzCisgIC8vICdcbjxuYW1lPlxuPGxlbmd0aD4oJThsdSlcbjxoZXggcGF5bG9hZD5cbicuCisgIGlmICgqc3JjICE9ICdcbicpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCByYXcgcHJvZmlsZSwgZXhwZWN0ZWQgJ1xcbicgZ290ICdcXHglLjJYJ1xuIiwKKyAgICAgICAgICAgICpzcmMpOworICAgIHJldHVybiAwOworICB9CisgICsrc3JjOworICAvLyBza2lwIHRoZSBwcm9maWxlIG5hbWUgYW5kIGV4dHJhY3QgdGhlIGxlbmd0aC4KKyAgd2hpbGUgKCpzcmMgIT0gJ1wwJyAmJiAqc3JjKysgIT0gJ1xuJykge30KKyAgZXhwZWN0ZWRfbGVuZ3RoID0gKGludClzdHJ0b2woc3JjLCAmZW5kLCAxMCk7CisgIGlmICgqZW5kICE9ICdcbicpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1hbGZvcm1lZCByYXcgcHJvZmlsZSwgZXhwZWN0ZWQgJ1xcbicgZ290ICdcXHglLjJYJ1xuIiwKKyAgICAgICAgICAgICplbmQpOworICAgIHJldHVybiAwOworICB9CisgICsrZW5kOworCisgIC8vICdlbmQnIG5vdyBwb2ludHMgdG8gdGhlIHByb2ZpbGUgcGF5bG9hZC4KKyAgcGF5bG9hZC0+Ynl0ZXMgPSBIZXhTdHJpbmdUb0J5dGVzKGVuZCwgZXhwZWN0ZWRfbGVuZ3RoKTsKKyAgaWYgKHBheWxvYWQtPmJ5dGVzID09IE5VTEwpIHJldHVybiAwOworICBwYXlsb2FkLT5zaXplID0gZXhwZWN0ZWRfbGVuZ3RoOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisgIGNvbnN0IGNoYXIqIG5hbWU7CisgIGludCAoKnByb2Nlc3MpKGNvbnN0IGNoYXIqIHByb2ZpbGUsIHNpemVfdCBwcm9maWxlX2xlbiwKKyAgICAgICAgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBwYXlsb2FkKTsKKyAgc2l6ZV90IHN0b3JhZ2Vfb2Zmc2V0OworfSBrUE5HTWV0YWRhdGFNYXBbXSA9IHsKKyAgLy8gaHR0cDovL3d3dy5zbm8ucGh5LnF1ZWVuc3UuY2EvfnBoaWwvZXhpZnRvb2wvVGFnTmFtZXMvUE5HLmh0bWwjVGV4dHVhbERhdGEKKyAgLy8gU2VlIGFsc286IEV4aWZUb29sIG9uIENQQU4uCisgIHsgIlJhdyBwcm9maWxlIHR5cGUgZXhpZiIsIFByb2Nlc3NSYXdQcm9maWxlLCBNRVRBREFUQV9PRkZTRVQoZXhpZikgfSwKKyAgeyAiUmF3IHByb2ZpbGUgdHlwZSB4bXAiLCAgUHJvY2Vzc1Jhd1Byb2ZpbGUsIE1FVEFEQVRBX09GRlNFVCh4bXApIH0sCisgIC8vIEV4aWZ0b29sIHB1dHMgZXhpZiBkYXRhIGluIEFQUDEgY2h1bmssIHRvby4KKyAgeyAiUmF3IHByb2ZpbGUgdHlwZSBBUFAxIiwgUHJvY2Vzc1Jhd1Byb2ZpbGUsIE1FVEFEQVRBX09GRlNFVChleGlmKSB9LAorICAvLyBYTVAgU3BlY2lmaWNhdGlvbiBQYXJ0IDMsIFNlY3Rpb24gMyAjUE5HCisgIHsgIlhNTDpjb20uYWRvYmUueG1wIiwgICAgIE1ldGFkYXRhQ29weSwgICAgICBNRVRBREFUQV9PRkZTRVQoeG1wKSB9LAorICB7IE5VTEwsIE5VTEwsIDAgfSwKK307CisKKy8vIExvb2tzIGZvciBtZXRhZGF0YSBhdCBib3RoIHRoZSBiZWdpbm5pbmcgYW5kIGVuZCBvZiB0aGUgUE5HIGZpbGUsIGdpdmluZworLy8gcHJlZmVyZW5jZSB0byB0aGUgaGVhZC4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBUaGUgY2FsbGVyIG11c3QgdXNlIE1ldGFkYXRhRnJlZSgpIG9uICdtZXRhZGF0YScgaW4KKy8vIGFsbCBjYXNlcy4KK3N0YXRpYyBpbnQgRXh0cmFjdE1ldGFkYXRhRnJvbVBORyhwbmdfc3RydWN0cCBwbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG5nX2luZm9wIGNvbnN0IGhlYWRfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbmdfaW5mb3AgY29uc3QgZW5kX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGludCBwOworCisgIGZvciAocCA9IDA7IHAgPCAyOyArK3ApICB7CisgICAgcG5nX2luZm9wIGNvbnN0IGluZm8gPSAocCA9PSAwKSA/IGhlYWRfaW5mbyA6IGVuZF9pbmZvOworICAgIHBuZ190ZXh0cCB0ZXh0ID0gTlVMTDsKKyAgICBjb25zdCBwbmdfdWludF8zMiBudW0gPSBwbmdfZ2V0X3RleHQocG5nLCBpbmZvLCAmdGV4dCwgTlVMTCk7CisgICAgcG5nX3VpbnRfMzIgaTsKKyAgICAvLyBMb29rIGZvciBFWElGIC8gWE1QIG1ldGFkYXRhLgorICAgIGZvciAoaSA9IDA7IGkgPCBudW07ICsraSwgKyt0ZXh0KSB7CisgICAgICBpbnQgajsKKyAgICAgIGZvciAoaiA9IDA7IGtQTkdNZXRhZGF0YU1hcFtqXS5uYW1lICE9IE5VTEw7ICsraikgeworICAgICAgICBpZiAoIXN0cmNtcCh0ZXh0LT5rZXksIGtQTkdNZXRhZGF0YU1hcFtqXS5uYW1lKSkgeworICAgICAgICAgIE1ldGFkYXRhUGF5bG9hZCogY29uc3QgcGF5bG9hZCA9CisgICAgICAgICAgICAgIChNZXRhZGF0YVBheWxvYWQqKSgodWludDhfdCopbWV0YWRhdGEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1BOR01ldGFkYXRhTWFwW2pdLnN0b3JhZ2Vfb2Zmc2V0KTsKKyAgICAgICAgICBwbmdfc2l6ZV90IHRleHRfbGVuZ3RoOworICAgICAgICAgIHN3aXRjaCAodGV4dC0+Y29tcHJlc3Npb24pIHsKKyNpZmRlZiBQTkdfaVRYdF9TVVBQT1JURUQKKyAgICAgICAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05fTk9ORToKKyAgICAgICAgICAgIGNhc2UgUE5HX0lUWFRfQ09NUFJFU1NJT05felRYdDoKKyAgICAgICAgICAgICAgdGV4dF9sZW5ndGggPSB0ZXh0LT5pdHh0X2xlbmd0aDsKKyAgICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgUE5HX1RFWFRfQ09NUFJFU1NJT05fTk9ORToKKyAgICAgICAgICAgIGNhc2UgUE5HX1RFWFRfQ09NUFJFU1NJT05felRYdDoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIHRleHRfbGVuZ3RoID0gdGV4dC0+dGV4dF9sZW5ndGg7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAocGF5bG9hZC0+Ynl0ZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBhZGRpdGlvbmFsICclcydcbiIsIHRleHQtPmtleSk7CisgICAgICAgICAgfSBlbHNlIGlmICgha1BOR01ldGFkYXRhTWFwW2pdLnByb2Nlc3ModGV4dC0+dGV4dCwgdGV4dF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCkpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHByb2Nlc3M6ICclcydcbiIsIHRleHQtPmtleSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gTG9vayBmb3IgYW4gSUNDIHByb2ZpbGUuCisgICAgeworICAgICAgcG5nX2NoYXJwIG5hbWU7CisgICAgICBpbnQgY29tcF90eXBlOworI2lmICgoUE5HX0xJQlBOR19WRVJfTUFKT1IgPDwgOCkgfCBQTkdfTElCUE5HX1ZFUl9NSU5PUiA8PCAwKSA8IFwKKyAgICAoKDEgPDwgOCkgfCAoNSA8PCAwKSkKKyAgICAgIHBuZ19jaGFycCBwcm9maWxlOworI2Vsc2UgIC8vID49IGxpYnBuZyAxLjUuMAorICAgICAgcG5nX2J5dGVwIHByb2ZpbGU7CisjZW5kaWYKKyAgICAgIHBuZ191aW50XzMyIGxlbjsKKworICAgICAgaWYgKHBuZ19nZXRfaUNDUChwbmcsIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLCAmY29tcF90eXBlLCAmcHJvZmlsZSwgJmxlbikgPT0gUE5HX0lORk9faUNDUCkgeworICAgICAgICBpZiAoIU1ldGFkYXRhQ29weSgoY29uc3QgY2hhciopcHJvZmlsZSwgbGVuLCAmbWV0YWRhdGEtPmljY3ApKSByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IGRhdGFfc2l6ZTsKKyAgcG5nX3NpemVfdCBvZmZzZXQ7Cit9IFBOR1JlYWRDb250ZXh0OworCitzdGF0aWMgdm9pZCBSZWFkRnVuYyhwbmdfc3RydWN0cCBwbmdfcHRyLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBsZW5ndGgpIHsKKyAgUE5HUmVhZENvbnRleHQqIGNvbnN0IGN0eCA9IChQTkdSZWFkQ29udGV4dCopcG5nX2dldF9pb19wdHIocG5nX3B0cik7CisgIGlmIChjdHgtPmRhdGFfc2l6ZSAtIGN0eC0+b2Zmc2V0IDwgbGVuZ3RoKSB7CisgICAgcG5nX2Vycm9yKHBuZ19wdHIsICJSZWFkRnVuYzogaW52YWxpZCByZWFkIGxlbmd0aCAob3ZlcmZsb3cpISIpOworICB9CisgIG1lbWNweShkYXRhLCBjdHgtPmRhdGEgKyBjdHgtPm9mZnNldCwgbGVuZ3RoKTsKKyAgY3R4LT5vZmZzZXQgKz0gbGVuZ3RoOworfQorCitpbnQgUmVhZFBORyhjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICBpbnQga2VlcF9hbHBoYSwgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICB2b2xhdGlsZSBwbmdfc3RydWN0cCBwbmcgPSBOVUxMOworICB2b2xhdGlsZSBwbmdfaW5mb3AgaW5mbyA9IE5VTEw7CisgIHZvbGF0aWxlIHBuZ19pbmZvcCBlbmRfaW5mbyA9IE5VTEw7CisgIFBOR1JlYWRDb250ZXh0IGNvbnRleHQgPSB7IE5VTEwsIDAsIDAgfTsKKyAgaW50IGNvbG9yX3R5cGUsIGJpdF9kZXB0aCwgaW50ZXJsYWNlZDsKKyAgaW50IGhhc19hbHBoYTsKKyAgaW50IG51bV9wYXNzZXM7CisgIGludCBwOworICB2b2xhdGlsZSBpbnQgb2sgPSAwOworICBwbmdfdWludF8zMiB3aWR0aCwgaGVpZ2h0LCB5OworICBpbnQ2NF90IHN0cmlkZTsKKyAgdWludDhfdCogdm9sYXRpbGUgcmdiID0gTlVMTDsKKworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA9PSAwIHx8IHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKworICBjb250ZXh0LmRhdGEgPSBkYXRhOworICBjb250ZXh0LmRhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKworICBwbmcgPSBwbmdfY3JlYXRlX3JlYWRfc3RydWN0KFBOR19MSUJQTkdfVkVSX1NUUklORywgMCwgMCwgMCk7CisgIGlmIChwbmcgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgcG5nX3NldF9lcnJvcl9mbihwbmcsIDAsIGVycm9yX2Z1bmN0aW9uLCBOVUxMKTsKKyAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZykpKSB7CisgRXJyb3I6CisgICAgTWV0YWRhdGFGcmVlKG1ldGFkYXRhKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGluZm8gPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZyk7CisgIGlmIChpbmZvID09IE5VTEwpIGdvdG8gRXJyb3I7CisgIGVuZF9pbmZvID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdChwbmcpOworICBpZiAoZW5kX2luZm8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBwbmdfc2V0X3JlYWRfZm4ocG5nLCAmY29udGV4dCwgUmVhZEZ1bmMpOworICBwbmdfcmVhZF9pbmZvKHBuZywgaW5mbyk7CisgIGlmICghcG5nX2dldF9JSERSKHBuZywgaW5mbywKKyAgICAgICAgICAgICAgICAgICAgJndpZHRoLCAmaGVpZ2h0LCAmYml0X2RlcHRoLCAmY29sb3JfdHlwZSwgJmludGVybGFjZWQsCisgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwpKSBnb3RvIEVycm9yOworCisgIHBuZ19zZXRfc3RyaXBfMTYocG5nKTsKKyAgcG5nX3NldF9wYWNraW5nKHBuZyk7CisgIGlmIChjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUpIHsKKyAgICBwbmdfc2V0X3BhbGV0dGVfdG9fcmdiKHBuZyk7CisgIH0KKyAgaWYgKGNvbG9yX3R5cGUgPT0gUE5HX0NPTE9SX1RZUEVfR1JBWSB8fAorICAgICAgY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZX0FMUEhBKSB7CisgICAgaWYgKGJpdF9kZXB0aCA8IDgpIHsKKyAgICAgIHBuZ19zZXRfZXhwYW5kX2dyYXlfMV8yXzRfdG9fOChwbmcpOworICAgIH0KKyAgICBwbmdfc2V0X2dyYXlfdG9fcmdiKHBuZyk7CisgIH0KKyAgaWYgKHBuZ19nZXRfdmFsaWQocG5nLCBpbmZvLCBQTkdfSU5GT190Uk5TKSkgeworICAgIHBuZ19zZXRfdFJOU190b19hbHBoYShwbmcpOworICAgIGhhc19hbHBoYSA9IDE7CisgIH0gZWxzZSB7CisgICAgaGFzX2FscGhhID0gISEoY29sb3JfdHlwZSAmIFBOR19DT0xPUl9NQVNLX0FMUEhBKTsKKyAgfQorCisgIC8vIEFwcGx5IGdhbW1hIGNvcnJlY3Rpb24gaWYgbmVlZGVkLgorICB7CisgICAgZG91YmxlIGltYWdlX2dhbW1hID0gMSAvIDIuMiwgc2NyZWVuX2dhbW1hID0gMi4yOworICAgIGludCBzcmdiX2ludGVudDsKKyAgICBpZiAocG5nX2dldF9zUkdCKHBuZywgaW5mbywgJnNyZ2JfaW50ZW50KSB8fAorICAgICAgICBwbmdfZ2V0X2dBTUEocG5nLCBpbmZvLCAmaW1hZ2VfZ2FtbWEpKSB7CisgICAgICBwbmdfc2V0X2dhbW1hKHBuZywgc2NyZWVuX2dhbW1hLCBpbWFnZV9nYW1tYSk7CisgICAgfQorICB9CisKKyAgaWYgKCFrZWVwX2FscGhhKSB7CisgICAgcG5nX3NldF9zdHJpcF9hbHBoYShwbmcpOworICAgIGhhc19hbHBoYSA9IDA7CisgIH0KKworICBudW1fcGFzc2VzID0gcG5nX3NldF9pbnRlcmxhY2VfaGFuZGxpbmcocG5nKTsKKyAgcG5nX3JlYWRfdXBkYXRlX2luZm8ocG5nLCBpbmZvKTsKKworICBzdHJpZGUgPSAoaW50NjRfdCkoaGFzX2FscGhhID8gNCA6IDMpICogd2lkdGggKiBzaXplb2YoKnJnYik7CisgIGlmIChzdHJpZGUgIT0gKGludClzdHJpZGUgfHwKKyAgICAgICFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhzdHJpZGUsIGhlaWdodCkpIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgcmdiID0gKHVpbnQ4X3QqKW1hbGxvYygoc2l6ZV90KXN0cmlkZSAqIGhlaWdodCk7CisgIGlmIChyZ2IgPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgZm9yIChwID0gMDsgcCA8IG51bV9wYXNzZXM7ICsrcCkgeworICAgIHBuZ19ieXRlcCByb3cgPSByZ2I7CisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBwbmdfcmVhZF9yb3dzKHBuZywgJnJvdywgTlVMTCwgMSk7CisgICAgICByb3cgKz0gc3RyaWRlOworICAgIH0KKyAgfQorICBwbmdfcmVhZF9lbmQocG5nLCBlbmRfaW5mbyk7CisKKyAgaWYgKG1ldGFkYXRhICE9IE5VTEwgJiYKKyAgICAgICFFeHRyYWN0TWV0YWRhdGFGcm9tUE5HKHBuZywgaW5mbywgZW5kX2luZm8sIG1ldGFkYXRhKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZXh0cmFjdGluZyBQTkcgbWV0YWRhdGEhXG4iKTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgcGljLT53aWR0aCA9IChpbnQpd2lkdGg7CisgIHBpYy0+aGVpZ2h0ID0gKGludCloZWlnaHQ7CisgIG9rID0gaGFzX2FscGhhID8gV2ViUFBpY3R1cmVJbXBvcnRSR0JBKHBpYywgcmdiLCAoaW50KXN0cmlkZSkKKyAgICAgICAgICAgICAgICAgOiBXZWJQUGljdHVyZUltcG9ydFJHQihwaWMsIHJnYiwgKGludClzdHJpZGUpOworCisgIGlmICghb2spIHsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyBFbmQ6CisgIGlmIChwbmcgIT0gTlVMTCkgeworICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KChwbmdfc3RydWN0cHApJnBuZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG5nX2luZm9wcCkmaW5mbywgKHBuZ19pbmZvcHApJmVuZF9pbmZvKTsKKyAgfQorICBmcmVlKHJnYik7CisgIHJldHVybiBvazsKK30KKyNlbHNlICAvLyAhV0VCUF9IQVZFX1BORworaW50IFJlYWRQTkcoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWM7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgICh2b2lkKW1ldGFkYXRhOworICBmcHJpbnRmKHN0ZGVyciwgIlBORyBzdXBwb3J0IG5vdCBjb21waWxlZC4gUGxlYXNlIGluc3RhbGwgdGhlIGxpYnBuZyAiCisgICAgICAgICAgImRldmVsb3BtZW50IHBhY2thZ2UgYmVmb3JlIGJ1aWxkaW5nLlxuIik7CisgIHJldHVybiAwOworfQorI2VuZGlmICAvLyBXRUJQX0hBVkVfUE5HCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BuZ2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE2MTIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbmdkZWMuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUE5HIGRlY29kZS4KKworI2lmbmRlZiBXRUJQX0lNQUdFSU9fUE5HREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19QTkdERUNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIFJlYWRzIGEgUE5HIGZyb20gJ2RhdGEnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gT3V0cHV0IGlzIFJHQkEgb3IgWVVWQSwgZGVwZW5kaW5nIG9uIHBpYy0+dXNlX2FyZ2IgdmFsdWUuCisvLyBJZiAna2VlcF9hbHBoYScgaXMgdHJ1ZSBhbmQgdGhlIFBORyBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgdGhlIG91dHB1dCBpcyBSR0JBCisvLyBvciBZVVZBLiBPdGhlcndpc2UsIGFscGhhIGNoYW5uZWwgaXMgZHJvcHBlZCBhbmQgb3V0cHV0IGlzIFJHQiBvciBZVVYuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBSZWFkUE5HKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgIGludCBrZWVwX2FscGhhLCBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfSU1BR0VJT19QTkdERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNWE0YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3BubWRlYy5jCkBAIC0wLDAgKzEsMjU3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gKGxpbWl0ZWQpIFBOTSBkZWNvZGVyCisKKyNpbmNsdWRlICIuL3BubWRlYy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorCit0eXBlZGVmIGVudW0geworICBXSURUSF9GTEFHICAgICAgPSAxIDw8IDAsCisgIEhFSUdIVF9GTEFHICAgICA9IDEgPDwgMSwKKyAgREVQVEhfRkxBRyAgICAgID0gMSA8PCAyLAorICBNQVhWQUxfRkxBRyAgICAgPSAxIDw8IDMsCisgIFRVUExFX0ZMQUcgICAgICA9IDEgPDwgNCwKKyAgQUxMX05FRURFRF9GTEFHUyA9IDB4MWYKK30gUE5NRmxhZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgc2l6ZV90IGRhdGFfc2l6ZTsKKyAgaW50IHdpZHRoLCBoZWlnaHQ7CisgIGludCBieXRlc19wZXJfcHg7ICAgLy8gMSwgMywgNAorICBpbnQgZGVwdGg7CisgIGludCBtYXhfdmFsdWU7CisgIGludCB0eXBlOyAgICAgICAgICAgLy8gNSwgNiBvciA3CisgIGludCBzZWVuX2ZsYWdzOworfSBQTk1JbmZvOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUE5NIGRlY29kaW5nCisKKyNkZWZpbmUgTUFYX0xJTkVfU0laRSAxMDI0CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5QTk1IZWFkZXJTaXplID0gMzsKKworc3RhdGljIHNpemVfdCBSZWFkTGluZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgb2ZmLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyIG91dFtNQVhfTElORV9TSVpFICsgMV0sIHNpemVfdCogY29uc3Qgb3V0X3NpemUpIHsKKyAgc2l6ZV90IGkgPSAwOworICAqb3V0X3NpemUgPSAwOworIHJlZG86CisgIGZvciAoaSA9IDA7IGkgPCBNQVhfTElORV9TSVpFICYmIG9mZiA8IGRhdGFfc2l6ZTsgKytpKSB7CisgICAgb3V0W2ldID0gZGF0YVtvZmYrK107CisgICAgaWYgKG91dFtpXSA9PSAnXG4nKSBicmVhazsKKyAgfQorICBpZiAob2ZmIDwgZGF0YV9zaXplKSB7CisgICAgaWYgKGkgPT0gMCkgZ290byByZWRvOyAgICAgICAgIC8vIGVtcHR5IGxpbmUKKyAgICBpZiAob3V0WzBdID09ICcjJykgZ290byByZWRvOyAgLy8gc2tpcCBjb21tZW50CisgIH0KKyAgb3V0W2ldID0gMDsgICAvLyBzYWZldHkgc2VudGluZWwKKyAgKm91dF9zaXplID0gaTsKKyAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNpemVfdCBGbGFnRXJyb3IoY29uc3QgY2hhciBmbGFnW10pIHsKKyAgZnByaW50ZihzdGRlcnIsICJQQU0gaGVhZGVyIGVycm9yOiBmbGFncyAnJXMnIGFscmVhZHkgc2Vlbi5cbiIsIGZsYWcpOworICByZXR1cm4gMDsKK30KKworLy8gaW5zcGlyZWQgZnJvbSBodHRwOi8vbmV0cGJtLnNvdXJjZWZvcmdlLm5ldC9kb2MvcGFtLmh0bWwKK3N0YXRpYyBzaXplX3QgUmVhZFBBTUZpZWxkcyhQTk1JbmZvKiBjb25zdCBpbmZvLCBzaXplX3Qgb2ZmKSB7CisgIGNoYXIgb3V0W01BWF9MSU5FX1NJWkUgKyAxXTsKKyAgc2l6ZV90IG91dF9zaXplOworICBpbnQgdG1wOworICBhc3NlcnQoaW5mbyAhPSBOVUxMKTsKKyAgd2hpbGUgKDEpIHsKKyAgICBvZmYgPSBSZWFkTGluZShpbmZvLT5kYXRhLCBvZmYsIGluZm8tPmRhdGFfc2l6ZSwgb3V0LCAmb3V0X3NpemUpOworICAgIGlmIChvZmYgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKHNzY2FuZihvdXQsICJXSURUSCAlZCIsICZ0bXApID09IDEpIHsKKyAgICAgIGlmIChpbmZvLT5zZWVuX2ZsYWdzICYgV0lEVEhfRkxBRykgcmV0dXJuIEZsYWdFcnJvcigiV0lEVEgiKTsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gV0lEVEhfRkxBRzsKKyAgICAgIGluZm8tPndpZHRoID0gdG1wOworICAgIH0gZWxzZSBpZiAoc3NjYW5mKG91dCwgIkhFSUdIVCAlZCIsICZ0bXApID09IDEpIHsKKyAgICAgIGlmIChpbmZvLT5zZWVuX2ZsYWdzICYgSEVJR0hUX0ZMQUcpIHJldHVybiBGbGFnRXJyb3IoIkhFSUdIVCIpOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBIRUlHSFRfRkxBRzsKKyAgICAgIGluZm8tPmhlaWdodCA9IHRtcDsKKyAgICB9IGVsc2UgaWYgKHNzY2FuZihvdXQsICJERVBUSCAlZCIsICZ0bXApID09IDEpIHsKKyAgICAgIGlmIChpbmZvLT5zZWVuX2ZsYWdzICYgREVQVEhfRkxBRykgcmV0dXJuIEZsYWdFcnJvcigiREVQVEgiKTsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gREVQVEhfRkxBRzsKKyAgICAgIGluZm8tPmRlcHRoID0gdG1wOworICAgIH0gZWxzZSBpZiAoc3NjYW5mKG91dCwgIk1BWFZBTCAlZCIsICZ0bXApID09IDEpIHsKKyAgICAgIGlmIChpbmZvLT5zZWVuX2ZsYWdzICYgTUFYVkFMX0ZMQUcpIHJldHVybiBGbGFnRXJyb3IoIk1BWFZBTCIpOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBNQVhWQUxfRkxBRzsKKyAgICAgIGluZm8tPm1heF92YWx1ZSA9IHRtcDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3V0LCAiVFVQTFRZUEUgUkdCX0FMUEhBIikpIHsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9weCA9IDQ7CisgICAgICBpbmZvLT5zZWVuX2ZsYWdzIHw9IFRVUExFX0ZMQUc7CisgICAgfSBlbHNlIGlmICghc3RyY21wKG91dCwgIlRVUExUWVBFIFJHQiIpKSB7CisgICAgICBpbmZvLT5ieXRlc19wZXJfcHggPSAzOworICAgICAgaW5mby0+c2Vlbl9mbGFncyB8PSBUVVBMRV9GTEFHOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChvdXQsICJUVVBMVFlQRSBHUkFZU0NBTEUiKSkgeworICAgICAgaW5mby0+Ynl0ZXNfcGVyX3B4ID0gMTsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gVFVQTEVfRkxBRzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAob3V0LCAiRU5ESERSIikpIHsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICBzdGF0aWMgY29uc3QgY2hhciBrRWxsaXBzaXNbXSA9ICIgLi4uIjsKKyAgICAgIGludCBpOworICAgICAgaWYgKG91dF9zaXplID4gMjApIHNwcmludGYob3V0ICsgMjAgLSBzdHJsZW4oa0VsbGlwc2lzKSwga0VsbGlwc2lzKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCAoaW50KXN0cmxlbihvdXQpOyArK2kpIHsKKyAgICAgICAgaWYgKCFpc3ByaW50KG91dFtpXSkpIG91dFtpXSA9ICcgJzsKKyAgICAgIH0KKyAgICAgIGZwcmludGYoc3RkZXJyLCAiUEFNIGhlYWRlciBlcnJvcjogdW5yZWNvZ25pemVkIGVudHJ5IFslc11cbiIsIG91dCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgaWYgKCEoaW5mby0+c2Vlbl9mbGFncyAmIFRVUExFX0ZMQUcpKSB7CisgICAgaWYgKGluZm8tPmRlcHRoID4gMCAmJiBpbmZvLT5kZXB0aCA8PSA0ICYmIGluZm8tPmRlcHRoICE9IDIpIHsKKyAgICAgIGluZm8tPnNlZW5fZmxhZ3MgfD0gVFVQTEVfRkxBRzsKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9weCA9IGluZm8tPmRlcHRoICogKGluZm8tPm1heF92YWx1ZSA+IDI1NSA/IDIgOiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgZnByaW50ZihzdGRlcnIsICJQQU06IGludmFsaWQgYml0ZGVwdGggKCVkKS5cbiIsIGluZm8tPmRlcHRoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBpZiAoaW5mby0+c2Vlbl9mbGFncyAhPSBBTExfTkVFREVEX0ZMQUdTKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJQQU06IGluY29tcGxldGUgaGVhZGVyLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIG9mZjsKK30KKworc3RhdGljIHNpemVfdCBSZWFkSGVhZGVyKFBOTUluZm8qIGNvbnN0IGluZm8pIHsKKyAgc2l6ZV90IG9mZiA9IDA7CisgIGNoYXIgb3V0W01BWF9MSU5FX1NJWkUgKyAxXTsKKyAgc2l6ZV90IG91dF9zaXplOworICBpZiAoaW5mbyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGluZm8tPmRhdGEgPT0gTlVMTCB8fCBpbmZvLT5kYXRhX3NpemUgPCBrTWluUE5NSGVhZGVyU2l6ZSkgcmV0dXJuIDA7CisKKyAgaW5mby0+d2lkdGggPSBpbmZvLT5oZWlnaHQgPSAwOworICBpbmZvLT50eXBlID0gLTE7CisgIGluZm8tPnNlZW5fZmxhZ3MgPSAwOworICBpbmZvLT5ieXRlc19wZXJfcHggPSAwOworICBpbmZvLT5kZXB0aCA9IDA7CisgIGluZm8tPm1heF92YWx1ZSA9IDA7CisKKyAgb2ZmID0gUmVhZExpbmUoaW5mby0+ZGF0YSwgb2ZmLCBpbmZvLT5kYXRhX3NpemUsIG91dCwgJm91dF9zaXplKTsKKyAgaWYgKG9mZiA9PSAwIHx8IHNzY2FuZihvdXQsICJQJWQiLCAmaW5mby0+dHlwZSkgIT0gMSkgcmV0dXJuIDA7CisgIGlmIChpbmZvLT50eXBlID09IDcpIHsKKyAgICBvZmYgPSBSZWFkUEFNRmllbGRzKGluZm8sIG9mZik7CisgIH0gZWxzZSB7CisgICAgb2ZmID0gUmVhZExpbmUoaW5mby0+ZGF0YSwgb2ZmLCBpbmZvLT5kYXRhX3NpemUsIG91dCwgJm91dF9zaXplKTsKKyAgICBpZiAob2ZmID09IDAgfHwgc3NjYW5mKG91dCwgIiVkICVkIiwgJmluZm8tPndpZHRoLCAmaW5mby0+aGVpZ2h0KSAhPSAyKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgb2ZmID0gUmVhZExpbmUoaW5mby0+ZGF0YSwgb2ZmLCBpbmZvLT5kYXRhX3NpemUsIG91dCwgJm91dF9zaXplKTsKKyAgICBpZiAob2ZmID09IDAgfHwgc3NjYW5mKG91dCwgIiVkIiwgJmluZm8tPm1heF92YWx1ZSkgIT0gMSkgcmV0dXJuIDA7CisKKyAgICAvLyBmaW5pc2ggaW5pdGlhbGl6aW5nIG1pc3NpbmcgZmllbGRzCisgICAgaW5mby0+ZGVwdGggPSAoaW5mby0+dHlwZSA9PSA1KSA/IDEgOiAzOworICAgIGluZm8tPmJ5dGVzX3Blcl9weCA9IGluZm8tPmRlcHRoICogKGluZm8tPm1heF92YWx1ZSA+IDI1NSA/IDIgOiAxKTsKKyAgfQorICAvLyBwZXJmb3JtIHNvbWUgYmFzaWMgbnVtZXJpY2FsIHZhbGlkYXRpb24KKyAgaWYgKGluZm8tPndpZHRoIDw9IDAgfHwgaW5mby0+aGVpZ2h0IDw9IDAgfHwKKyAgICAgIGluZm8tPnR5cGUgPD0gMCB8fCBpbmZvLT50eXBlID49IDkgfHwKKyAgICAgIGluZm8tPmRlcHRoIDw9IDAgfHwgaW5mby0+ZGVwdGggPT0gMiB8fCBpbmZvLT5kZXB0aCA+IDQgfHwKKyAgICAgIGluZm8tPmJ5dGVzX3Blcl9weCA8IGluZm8tPmRlcHRoIHx8CisgICAgICBpbmZvLT5tYXhfdmFsdWUgPD0gMCB8fCBpbmZvLT5tYXhfdmFsdWUgPj0gNjU1MzYpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gb2ZmOworfQorCitpbnQgUmVhZFBOTShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICBzdHJ1Y3QgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIGludCBvayA9IDA7CisgIGludCBpLCBqOworICB1aW50NjRfdCBzdHJpZGUsIHBpeGVsX2J5dGVzOworICB1aW50OF90KiByZ2IgPSBOVUxMLCAqdG1wX3JnYjsKKyAgc2l6ZV90IG9mZnNldDsKKyAgUE5NSW5mbyBpbmZvOworCisgIGluZm8uZGF0YSA9IGRhdGE7CisgIGluZm8uZGF0YV9zaXplID0gZGF0YV9zaXplOworICBvZmZzZXQgPSBSZWFkSGVhZGVyKCZpbmZvKTsKKyAgaWYgKG9mZnNldCA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBwYXJzaW5nIFBOTSBoZWFkZXIuXG4iKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGlmIChpbmZvLnR5cGUgPCA1IHx8IGluZm8udHlwZSA+IDcpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlVuc3VwcG9ydGVkIFAlZCBQTk0gZm9ybWF0LlxuIiwgaW5mby50eXBlKTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIFNvbWUgYmFzaWMgdmFsaWRhdGlvbnMuCisgIGlmIChwaWMgPT0gTlVMTCkgZ290byBFbmQ7CisgIGlmIChpbmZvLndpZHRoID4gV0VCUF9NQVhfRElNRU5TSU9OIHx8IGluZm8uaGVpZ2h0ID4gV0VCUF9NQVhfRElNRU5TSU9OKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkICVkeCVkIGRpbWVuc2lvbiBmb3IgUE5NXG4iLAorICAgICAgICAgICAgICAgICAgICBpbmZvLndpZHRoLCBpbmZvLmhlaWdodCk7CisgICAgZ290byBFbmQ7CisgIH0KKworICBwaXhlbF9ieXRlcyA9ICh1aW50NjRfdClpbmZvLndpZHRoICogaW5mby5oZWlnaHQgKiBpbmZvLmJ5dGVzX3Blcl9weDsKKyAgaWYgKGRhdGFfc2l6ZSA8IG9mZnNldCArIHBpeGVsX2J5dGVzKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJUcnVuY2F0ZWQgUE5NIGZpbGUgKFAlZCkuXG4iLCBpbmZvLnR5cGUpOworICAgIGdvdG8gRW5kOworICB9CisgIHN0cmlkZSA9CisgICAgICAodWludDY0X3QpKGluZm8uYnl0ZXNfcGVyX3B4IDwgMyA/IDMgOiBpbmZvLmJ5dGVzX3Blcl9weCkgKiBpbmZvLndpZHRoOworICBpZiAoc3RyaWRlICE9IChzaXplX3Qpc3RyaWRlIHx8CisgICAgICAhSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coc3RyaWRlLCBpbmZvLmhlaWdodCkpIHsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIHJnYiA9ICh1aW50OF90KiltYWxsb2MoKHNpemVfdClzdHJpZGUgKiBpbmZvLmhlaWdodCk7CisgIGlmIChyZ2IgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgLy8gQ29udmVydCBpbnB1dAorICB0bXBfcmdiID0gcmdiOworICBmb3IgKGogPSAwOyBqIDwgaW5mby5oZWlnaHQ7ICsraikgeworICAgIGFzc2VydChvZmZzZXQgKyBpbmZvLmJ5dGVzX3Blcl9weCAqIGluZm8ud2lkdGggPD0gZGF0YV9zaXplKTsKKyAgICBpZiAoaW5mby5kZXB0aCA9PSAxKSB7CisgICAgICAvLyBjb252ZXJ0IGdyYXlzY2FsZSAtPiBSR0IKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLndpZHRoOyArK2kpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCB2ID0gZGF0YVtvZmZzZXQgKyBpXTsKKyAgICAgICAgdG1wX3JnYlszICogaSArIDBdID0gdG1wX3JnYlszICogaSArIDFdID0gdG1wX3JnYlszICogaSArIDJdID0gdjsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGluZm8uZGVwdGggPT0gMykgeyAgIC8vIFJHQgorICAgICAgbWVtY3B5KHRtcF9yZ2IsIGRhdGEgKyBvZmZzZXQsIDMgKiBpbmZvLndpZHRoICogc2l6ZW9mKCpkYXRhKSk7CisgICAgfSBlbHNlIGlmIChpbmZvLmRlcHRoID09IDQpIHsgICAvLyBSR0JBCisgICAgICBtZW1jcHkodG1wX3JnYiwgZGF0YSArIG9mZnNldCwgNCAqIGluZm8ud2lkdGggKiBzaXplb2YoKmRhdGEpKTsKKyAgICB9CisgICAgb2Zmc2V0ICs9IGluZm8uYnl0ZXNfcGVyX3B4ICogaW5mby53aWR0aDsKKyAgICB0bXBfcmdiICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIFdlYlAgY29udmVyc2lvbi4KKyAgcGljLT53aWR0aCA9IGluZm8ud2lkdGg7CisgIHBpYy0+aGVpZ2h0ID0gaW5mby5oZWlnaHQ7CisgIG9rID0gKGluZm8uZGVwdGggPT0gNCkgPyBXZWJQUGljdHVyZUltcG9ydFJHQkEocGljLCByZ2IsIChpbnQpc3RyaWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogV2ViUFBpY3R1cmVJbXBvcnRSR0IocGljLCByZ2IsIChpbnQpc3RyaWRlKTsKKyAgaWYgKCFvaykgZ290byBFbmQ7CisKKyAgb2sgPSAxOworIEVuZDoKKyAgZnJlZSgodm9pZCopcmdiKTsKKworICAodm9pZCltZXRhZGF0YTsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby9wbm1kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRkNTgyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vcG5tZGVjLmgKQEAgLTAsMCArMSwzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIHBhcnRpYWwgUE5NIGZvcm1hdCBkZWNvZGVyIChwcG0vcGdtKQorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19QTk1ERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX1BOTURFQ19IXworCisjaW5jbHVkZSAid2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gUmVhZHMgYSBQTk0gZmlsZSBmcm9tICdkYXRhJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIFRoZSBvdXRwdXQgaXMgUkdCIG9yIFlVViBkZXBlbmRpbmcgb24gcGljLT51c2VfYXJnYiB2YWx1ZS4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorLy8gJ21ldGFkYXRhJyBoYXMgbm8gZWZmZWN0LCBidXQgaXMga2VwdCBmb3IgY29oZXJlbmNlIHdpdGggb3RoZXIgc2lnbmF0dXJlcworLy8gZm9yIGltYWdlIHJlYWRlcnMuCitpbnQgUmVhZFBOTShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgc3RydWN0IE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0lNQUdFSU9fUE5NREVDX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZWI2ODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuYwpAQCAtMCwwICsxLDI2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFRJRkYgZGVjb2RlLgorCisjaW5jbHVkZSAiLi90aWZmZGVjLmgiCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIFdFQlBfSEFWRV9USUZGCisjaW5jbHVkZSA8dGlmZmlvLmg+CisKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgIi4vaW1hZ2Vpb191dGlsLmgiCisjaW5jbHVkZSAiLi9tZXRhZGF0YS5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgdHRhZ190IHRhZzsKKyAgc2l6ZV90IHN0b3JhZ2Vfb2Zmc2V0OworfSBrVElGRk1ldGFkYXRhTWFwW10gPSB7CisgIHsgVElGRlRBR19JQ0NQUk9GSUxFLCBNRVRBREFUQV9PRkZTRVQoaWNjcCkgfSwKKyAgeyBUSUZGVEFHX1hNTFBBQ0tFVCwgIE1FVEFEQVRBX09GRlNFVCh4bXApIH0sCisgIHsgMCwgMCB9LAorfTsKKworLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFRoZSBjYWxsZXIgbXVzdCB1c2UgTWV0YWRhdGFGcmVlKCkgb24gJ21ldGFkYXRhJyBpbgorLy8gYWxsIGNhc2VzLgorc3RhdGljIGludCBFeHRyYWN0TWV0YWRhdGFGcm9tVElGRihUSUZGKiBjb25zdCB0aWYsIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpbnQgaTsKKyAgdG9mZl90IGV4aWZfaWZkX29mZnNldDsKKworICBmb3IgKGkgPSAwOyBrVElGRk1ldGFkYXRhTWFwW2ldLnRhZyAhPSAwOyArK2kpIHsKKyAgICBNZXRhZGF0YVBheWxvYWQqIGNvbnN0IHBheWxvYWQgPQorICAgICAgICAoTWV0YWRhdGFQYXlsb2FkKikoKHVpbnQ4X3QqKW1ldGFkYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUSUZGTWV0YWRhdGFNYXBbaV0uc3RvcmFnZV9vZmZzZXQpOworICAgIHZvaWQqIHRhZ19kYXRhOworICAgIHVpbnQzMiB0YWdfZGF0YV9sZW47CisKKyAgICBpZiAoVElGRkdldEZpZWxkKHRpZiwga1RJRkZNZXRhZGF0YU1hcFtpXS50YWcsICZ0YWdfZGF0YV9sZW4sICZ0YWdfZGF0YSkgJiYKKyAgICAgICAgIU1ldGFkYXRhQ29weSgoY29uc3QgY2hhciopdGFnX2RhdGEsIHRhZ19kYXRhX2xlbiwgcGF5bG9hZCkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIC8vIFRPRE8oanplcm4pOiBUbyBleHRyYWN0IHRoZSByYXcgRVhJRiBkaXJlY3Rvcnkgc29tZSBwYXJzaW5nIG9mIGl0IHdvdWxkIGJlCisgIC8vIG5lY2Vzc2FyeSB0byBkZXRlcm1pbmUgdGhlIG92ZXJhbGwgc2l6ZS4gSW4gYWRkaXRpb24sIHZhbHVlIG9mZnNldHMgaW4KKyAgLy8gaW5kaXZpZHVhbCBkaXJlY3RvcnkgZW50cmllcyBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGFzLCBkZXBlbmRpbmcgb24gdGhlCisgIC8vIHR5cGUsIHRoZXkgYXJlIGZpbGUgYmFzZWQuCisgIC8vIEV4aWYgMi4yIFNlY3Rpb24gNC42LjIgVGFnIFN0cnVjdHVyZQorICAvLyBUSUZGIFJldmlzaW9uIDYuMCBQYXJ0IDEgU2VjdGlvbiAyIFRJRkYgU3RydWN0dXJlICNJbWFnZSBGaWxlIERpcmVjdG9yeQorICBpZiAoVElGRkdldEZpZWxkKHRpZiwgVElGRlRBR19FWElGSUZELCAmZXhpZl9pZmRfb2Zmc2V0KSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogRVhJRiBleHRyYWN0aW9uIGZyb20gVElGRiBpcyB1bnN1cHBvcnRlZC5cbiIpOworICB9CisgIHJldHVybiAxOworfQorCisvLyBBZC1ob2Mgc3RydWN0dXJlIHRvIHN1cHBseSByZWFkLWZyb20tbWVtb3J5IGZ1bmN0aW9uYWxpdGllcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgdWludDhfdCogZGF0YTsKKyAgdG9mZl90IHNpemU7CisgIHRvZmZfdCBwb3M7Cit9IE15RGF0YTsKKworc3RhdGljIGludCBNeUNsb3NlKHRoYW5kbGVfdCBvcGFxdWUpIHsKKyAgKHZvaWQpb3BhcXVlOworICByZXR1cm4gMDsKK30KKworc3RhdGljIHRvZmZfdCBNeVNpemUodGhhbmRsZV90IG9wYXF1ZSkgeworICBjb25zdCBNeURhdGEqIGNvbnN0IG15X2RhdGEgPSAoTXlEYXRhKilvcGFxdWU7CisgIHJldHVybiBteV9kYXRhLT5zaXplOworfQorCitzdGF0aWMgdG9mZl90IE15U2Vlayh0aGFuZGxlX3Qgb3BhcXVlLCB0b2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CisgIE15RGF0YSogY29uc3QgbXlfZGF0YSA9IChNeURhdGEqKW9wYXF1ZTsKKyAgb2Zmc2V0ICs9ICh3aGVuY2UgPT0gU0VFS19DVVIpID8gbXlfZGF0YS0+cG9zCisgICAgICAgICAgOiAod2hlbmNlID09IFNFRUtfU0VUKSA/IDAKKyAgICAgICAgICA6IG15X2RhdGEtPnNpemU7CisgIGlmIChvZmZzZXQgPiBteV9kYXRhLT5zaXplKSByZXR1cm4gKHRvZmZfdCktMTsKKyAgbXlfZGF0YS0+cG9zID0gb2Zmc2V0OworICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW50IE15TWFwRmlsZSh0aGFuZGxlX3Qgb3BhcXVlLCB2b2lkKiogYmFzZSwgdG9mZl90KiBzaXplKSB7CisgICh2b2lkKW9wYXF1ZTsKKyAgKHZvaWQpYmFzZTsKKyAgKHZvaWQpc2l6ZTsKKyAgcmV0dXJuIDA7Cit9CitzdGF0aWMgdm9pZCBNeVVubWFwRmlsZSh0aGFuZGxlX3Qgb3BhcXVlLCB2b2lkKiBiYXNlLCB0b2ZmX3Qgc2l6ZSkgeworICAodm9pZClvcGFxdWU7CisgICh2b2lkKWJhc2U7CisgICh2b2lkKXNpemU7Cit9CisKK3N0YXRpYyB0c2l6ZV90IE15UmVhZCh0aGFuZGxlX3Qgb3BhcXVlLCB2b2lkKiBkc3QsIHRzaXplX3Qgc2l6ZSkgeworICBNeURhdGEqIGNvbnN0IG15X2RhdGEgPSAoTXlEYXRhKilvcGFxdWU7CisgIGlmIChteV9kYXRhLT5wb3MgKyBzaXplID4gbXlfZGF0YS0+c2l6ZSkgeworICAgIHNpemUgPSAodHNpemVfdCkobXlfZGF0YS0+c2l6ZSAtIG15X2RhdGEtPnBvcyk7CisgIH0KKyAgaWYgKHNpemUgPiAwKSB7CisgICAgbWVtY3B5KGRzdCwgbXlfZGF0YS0+ZGF0YSArIG15X2RhdGEtPnBvcywgc2l6ZSk7CisgICAgbXlfZGF0YS0+cG9zICs9IHNpemU7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIFVubXVsdGlwbHkgQXJnYiBkYXRhLiBUYWtlbiBmcm9tIGRzcC9hbHBoYV9wcm9jZXNzaW5nCisvLyAod2UgZG9uJ3Qgd2FudCB0byBmb3JjZSBhIGRlcGVuZGVuY3kgdG8gYSBsaWJkc3BkZWMgbGlicmFyeSkuCisjZGVmaW5lIE1GSVggMjQgICAgLy8gMjRiaXQgZml4ZWQtcG9pbnQgYXJpdGhtZXRpYworI2RlZmluZSBIQUxGICgoMXUgPDwgTUZJWCkgPj4gMSkKKyNkZWZpbmUgS0lOVl8yNTUgKCgxdSA8PCBNRklYKSAvIDI1NXUpCisKK3N0YXRpYyB1aW50MzJfdCBVbm11bHQodWludDhfdCB4LCB1aW50MzJfdCBtdWx0KSB7CisgIGNvbnN0IHVpbnQzMl90IHYgPSAoeCAqIG11bHQgKyBIQUxGKSA+PiBNRklYOworICByZXR1cm4gKHYgPiAyNTV1KSA/IDI1NXUgOiB2OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0U2NhbGUodWludDMyX3QgYSkgeworICByZXR1cm4gKDI1NXUgPDwgTUZJWCkgLyBhOworfQorCitzdGF0aWMgdm9pZCBNdWx0QVJHQlJvdyh1aW50OF90KiBwdHIsIGludCB3aWR0aCkgeworICBpbnQgeDsKKyAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gsIHB0ciArPSA0KSB7CisgICAgY29uc3QgdWludDMyX3QgYWxwaGEgPSBwdHJbM107CisgICAgaWYgKGFscGhhIDwgMjU1KSB7CisgICAgICBpZiAoYWxwaGEgPT0gMCkgeyAgIC8vIGFscGhhID09IDAKKyAgICAgICAgcHRyWzBdID0gcHRyWzFdID0gcHRyWzJdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gR2V0U2NhbGUoYWxwaGEpOworICAgICAgICBwdHJbMF0gPSBVbm11bHQocHRyWzBdLCBzY2FsZSk7CisgICAgICAgIHB0clsxXSA9IFVubXVsdChwdHJbMV0sIHNjYWxlKTsKKyAgICAgICAgcHRyWzJdID0gVW5tdWx0KHB0clsyXSwgc2NhbGUpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitpbnQgUmVhZFRJRkYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljLCBpbnQga2VlcF9hbHBoYSwKKyAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgTXlEYXRhIG15X2RhdGEgPSB7IGRhdGEsICh0b2ZmX3QpZGF0YV9zaXplLCAwIH07CisgIFRJRkYqIHRpZjsKKyAgdWludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgdWludDE2X3Qgc2FtcGxlc19wZXJfcHggPSAwOworICB1aW50MTZfdCBleHRyYV9zYW1wbGVzID0gMDsKKyAgdWludDE2X3QqIGV4dHJhX3NhbXBsZXNfcHRyID0gTlVMTDsKKyAgdWludDMyX3QqIHJhc3RlcjsKKyAgaW50NjRfdCBhbGxvY19zaXplOworICBpbnQgb2sgPSAwOworICB0ZGlyX3QgZGlyY291bnQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCB8fCBkYXRhX3NpemUgPiBJTlRfTUFYIHx8IHBpYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB0aWYgPSBUSUZGQ2xpZW50T3BlbigiTWVtb3J5IiwgInIiLCAmbXlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgTXlSZWFkLCBNeVJlYWQsIE15U2VlaywgTXlDbG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgTXlTaXplLCBNeU1hcEZpbGUsIE15VW5tYXBGaWxlKTsKKyAgaWYgKHRpZiA9PSBOVUxMKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciEgQ2Fubm90IHBhcnNlIFRJRkYgZmlsZVxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkaXJjb3VudCA9IFRJRkZOdW1iZXJPZkRpcmVjdG9yaWVzKHRpZik7CisgIGlmIChkaXJjb3VudCA+IDEpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IG11bHRpLWRpcmVjdG9yeSBUSUZGIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAiT25seSB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLCAlZCB3aWxsIGJlIGlnbm9yZWQuXG4iLAorICAgICAgICAgICAgICAgICAgICBkaXJjb3VudCAtIDEpOworICB9CisgIGlmICghVElGRkdldEZpZWxkRGVmYXVsdGVkKHRpZiwgVElGRlRBR19TQU1QTEVTUEVSUElYRUwsICZzYW1wbGVzX3Blcl9weCkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcmV0cmlldmUgVElGRiBzYW1wbGVzLXBlci1waXhlbCBpbmZvLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKyAgaWYgKHNhbXBsZXNfcGVyX3B4IDwgMyB8fCBzYW1wbGVzX3Blcl9weCA+IDQpIGdvdG8gRW5kOyAgLy8gbm90IHN1cHBvcnRlZAorCisgIGlmICghKFRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoKSAmJgorICAgICAgICBUSUZGR2V0RmllbGQodGlmLCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0KSkpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcmV0cmlldmUgVElGRiBpbWFnZSBkaW1lbnNpb25zLlxuIik7CisgICAgZ290byBFbmQ7CisgIH0KKyAgaWYgKCFJbWdJb1V0aWxDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdygodWludDY0X3Qpd2lkdGggKiBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpyYXN0ZXIpKSkgeworICAgIGdvdG8gRW5kOworICB9CisgIGlmIChzYW1wbGVzX3Blcl9weCA+IDMgJiYgIVRJRkZHZXRGaWVsZCh0aWYsIFRJRkZUQUdfRVhUUkFTQU1QTEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4dHJhX3NhbXBsZXMsICZleHRyYV9zYW1wbGVzX3B0cikpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yISBDYW5ub3QgcmV0cmlldmUgVElGRiBFeHRyYVNhbXBsZXMgaW5mby5cbiIpOworICAgIGdvdG8gRW5kOworICB9CisKKyAgLy8gX1RpZmZtYWxsb2MgdXNlcyBhIHNpZ25lZCB0eXBlIGZvciBzaXplLgorICBhbGxvY19zaXplID0gKGludDY0X3QpKCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCAqIHNpemVvZigqcmFzdGVyKSk7CisgIGlmIChhbGxvY19zaXplIDwgMCB8fCBhbGxvY19zaXplICE9ICh0c2l6ZV90KWFsbG9jX3NpemUpIGdvdG8gRW5kOworCisgIHJhc3RlciA9ICh1aW50MzIqKV9USUZGbWFsbG9jKCh0c2l6ZV90KWFsbG9jX3NpemUpOworICBpZiAocmFzdGVyICE9IE5VTEwpIHsKKyAgICBpZiAoVElGRlJlYWRSR0JBSW1hZ2VPcmllbnRlZCh0aWYsIHdpZHRoLCBoZWlnaHQsIHJhc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUklFTlRBVElPTl9UT1BMRUZULCAxKSkgeworICAgICAgY29uc3QgaW50IHN0cmlkZSA9IHdpZHRoICogc2l6ZW9mKCpyYXN0ZXIpOworICAgICAgcGljLT53aWR0aCA9IHdpZHRoOworICAgICAgcGljLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAvLyBUSUZGIGRhdGEgaXMgQUJHUgorI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICAgVElGRlN3YWJBcnJheU9mTG9uZyhyYXN0ZXIsIHdpZHRoICogaGVpZ2h0KTsKKyNlbmRpZgorICAgICAgLy8gaWYgd2UgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCB3ZSBtdXN0IHVuLW11bHRpcGx5IGZyb20gcmdiQSB0byBSR0JBCisgICAgICBpZiAoZXh0cmFfc2FtcGxlcyA9PSAxICYmIGV4dHJhX3NhbXBsZXNfcHRyICE9IE5VTEwgJiYKKyAgICAgICAgICBleHRyYV9zYW1wbGVzX3B0clswXSA9PSBFWFRSQVNBTVBMRV9BU1NPQ0FMUEhBKSB7CisgICAgICAgIHVpbnQzMl90IHk7CisgICAgICAgIHVpbnQ4X3QqIHRtcCA9ICh1aW50OF90KilyYXN0ZXI7CisgICAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICAgIE11bHRBUkdCUm93KHRtcCwgd2lkdGgpOworICAgICAgICAgIHRtcCArPSBzdHJpZGU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG9rID0ga2VlcF9hbHBoYQorICAgICAgICAgPyBXZWJQUGljdHVyZUltcG9ydFJHQkEocGljLCAoY29uc3QgdWludDhfdCopcmFzdGVyLCBzdHJpZGUpCisgICAgICAgICA6IFdlYlBQaWN0dXJlSW1wb3J0UkdCWChwaWMsIChjb25zdCB1aW50OF90KilyYXN0ZXIsIHN0cmlkZSk7CisgICAgfQorICAgIF9USUZGZnJlZShyYXN0ZXIpOworICB9IGVsc2UgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgYWxsb2NhdGluZyBUSUZGIFJHQkEgbWVtb3J5IVxuIik7CisgIH0KKworICBpZiAob2spIHsKKyAgICBpZiAobWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgb2sgPSBFeHRyYWN0TWV0YWRhdGFGcm9tVElGRih0aWYsIG1ldGFkYXRhKTsKKyAgICAgIGlmICghb2spIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBleHRyYWN0aW5nIFRJRkYgbWV0YWRhdGEhXG4iKTsKKyAgICAgICAgTWV0YWRhdGFGcmVlKG1ldGFkYXRhKTsKKyAgICAgICAgV2ViUFBpY3R1cmVGcmVlKHBpYyk7CisgICAgICB9CisgICAgfQorICB9CisgRW5kOgorICBUSUZGQ2xvc2UodGlmKTsKKyAgcmV0dXJuIG9rOworfQorI2Vsc2UgIC8vICFXRUJQX0hBVkVfVElGRgoraW50IFJlYWRUSUZGKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWM7CisgICh2b2lkKWtlZXBfYWxwaGE7CisgICh2b2lkKW1ldGFkYXRhOworICBmcHJpbnRmKHN0ZGVyciwgIlRJRkYgc3VwcG9ydCBub3QgY29tcGlsZWQuIFBsZWFzZSBpbnN0YWxsIHRoZSBsaWJ0aWZmICIKKyAgICAgICAgICAiZGV2ZWxvcG1lbnQgcGFja2FnZSBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vIFdFQlBfSEFWRV9USUZGCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vdGlmZmRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjOGJlY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3RpZmZkZWMuaApAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVElGRiBkZWNvZGUuCisKKyNpZm5kZWYgV0VCUF9JTUFHRUlPX1RJRkZERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX1RJRkZERUNfSF8KKworI2luY2x1ZGUgIndlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitzdHJ1Y3QgTWV0YWRhdGE7CitzdHJ1Y3QgV2ViUFBpY3R1cmU7CisKKy8vIFJlYWRzIGEgVElGRiBmcm9tICdkYXRhJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIE91dHB1dCBpcyBSR0JBIG9yIFlVVkEsIGRlcGVuZGluZyBvbiBwaWMtPnVzZV9hcmdiIHZhbHVlLgorLy8gSWYgJ2tlZXBfYWxwaGEnIGlzIHRydWUgYW5kIHRoZSBUSUZGIGhhcyBhbiBhbHBoYSBjaGFubmVsLCB0aGUgb3V0cHV0IGlzIFJHQkEKKy8vIG9yIFlVVkEuIE90aGVyd2lzZSwgYWxwaGEgY2hhbm5lbCBpcyBkcm9wcGVkIGFuZCBvdXRwdXQgaXMgUkdCIG9yIFlVVi4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IFJlYWRUSUZGKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIGludCBrZWVwX2FscGhhLAorICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX1RJRkZERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkMDY1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2VicGRlYy5jCkBAIC0wLDAgKzEsMjQzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUCBkZWNvZGUuCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAid2VicC9jb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAiLi93ZWJwZGVjLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2RlbXV4LmgiCisjaW5jbHVkZSAid2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICIuL2ltYWdlaW9fdXRpbC5oIgorI2luY2x1ZGUgIi4vbWV0YWRhdGEuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlAgZGVjb2RpbmcKKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTdGF0dXNNZXNzYWdlc1tWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSArIDFdID0geworICAiT0siLCAiT1VUX09GX01FTU9SWSIsICJJTlZBTElEX1BBUkFNIiwgIkJJVFNUUkVBTV9FUlJPUiIsCisgICJVTlNVUFBPUlRFRF9GRUFUVVJFIiwgIlNVU1BFTkRFRCIsICJVU0VSX0FCT1JUIiwgIk5PVF9FTk9VR0hfREFUQSIKK307CisKK3N0YXRpYyB2b2lkIFByaW50QW5pbWF0aW9uV2FybmluZyhjb25zdCBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnKSB7CisgIGlmIChjb25maWctPmlucHV0Lmhhc19hbmltYXRpb24pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJFcnJvciEgRGVjb2Rpbmcgb2YgYW4gYW5pbWF0ZWQgV2ViUCBmaWxlIGlzIG5vdCBzdXBwb3J0ZWQuXG4iCisgICAgICAgICAgICAiICAgICAgIFVzZSB3ZWJwbXV4IHRvIGV4dHJhY3QgdGhlIGluZGl2aWR1YWwgZnJhbWVzIG9yXG4iCisgICAgICAgICAgICAiICAgICAgIHZ3ZWJwIHRvIHZpZXcgdGhpcyBpbWFnZS5cbiIpOworICB9Cit9CisKK3ZvaWQgUHJpbnRXZWJQRXJyb3IoY29uc3QgY2hhciogY29uc3QgaW5fZmlsZSwgaW50IHN0YXR1cykgeworICBmcHJpbnRmKHN0ZGVyciwgIkRlY29kaW5nIG9mICVzIGZhaWxlZC5cbiIsIGluX2ZpbGUpOworICBmcHJpbnRmKHN0ZGVyciwgIlN0YXR1czogJWQiLCBzdGF0dXMpOworICBpZiAoc3RhdHVzID49IFZQOF9TVEFUVVNfT0sgJiYgc3RhdHVzIDw9IFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgZnByaW50ZihzdGRlcnIsICIoJXMpIiwga1N0YXR1c01lc3NhZ2VzW3N0YXR1c10pOworICB9CisgIGZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworaW50IExvYWRXZWJQKGNvbnN0IGNoYXIqIGNvbnN0IGluX2ZpbGUsCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCoqIGRhdGEsIHNpemVfdCogZGF0YV9zaXplLAorICAgICAgICAgICAgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogYml0c3RyZWFtKSB7CisgIFZQOFN0YXR1c0NvZGUgc3RhdHVzOworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMgbG9jYWxfZmVhdHVyZXM7CisgIGlmICghSW1nSW9VdGlsUmVhZEZpbGUoaW5fZmlsZSwgZGF0YSwgZGF0YV9zaXplKSkgcmV0dXJuIDA7CisKKyAgaWYgKGJpdHN0cmVhbSA9PSBOVUxMKSB7CisgICAgYml0c3RyZWFtID0gJmxvY2FsX2ZlYXR1cmVzOworICB9CisKKyAgc3RhdHVzID0gV2ViUEdldEZlYXR1cmVzKCpkYXRhLCAqZGF0YV9zaXplLCBiaXRzdHJlYW0pOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICBmcmVlKCh2b2lkKikqZGF0YSk7CisgICAgKmRhdGEgPSBOVUxMOworICAgICpkYXRhX3NpemUgPSAwOworICAgIFByaW50V2ViUEVycm9yKGluX2ZpbGUsIHN0YXR1cyk7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICBQcmludEFuaW1hdGlvbldhcm5pbmcoY29uZmlnKTsKKyAgcmV0dXJuIFdlYlBEZWNvZGUoZGF0YSwgZGF0YV9zaXplLCBjb25maWcpOworfQorCitWUDhTdGF0dXNDb2RlIERlY29kZVdlYlBJbmNyZW1lbnRhbCgKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcpIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPSBWUDhfU1RBVFVTX09LOworICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisKKyAgUHJpbnRBbmltYXRpb25XYXJuaW5nKGNvbmZpZyk7CisKKyAgLy8gRGVjb2RpbmcgY2FsbC4KKyAgeworICAgIFdlYlBJRGVjb2RlciogY29uc3QgaWRlYyA9IFdlYlBJRGVjb2RlKGRhdGEsIGRhdGFfc2l6ZSwgY29uZmlnKTsKKyAgICBpZiAoaWRlYyA9PSBOVUxMKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCBkdXJpbmcgV2ViUElOZXdEZWNvZGVyKCkuXG4iKTsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXR1cyA9IFdlYlBJVXBkYXRlKGlkZWMsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgICBXZWJQSURlbGV0ZShpZGVjKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldGFkYXRhCisKK3N0YXRpYyBpbnQgRXh0cmFjdE1ldGFkYXRhKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgV2ViUERhdGEgd2VicF9kYXRhID0geyBkYXRhLCBkYXRhX3NpemUgfTsKKyAgV2ViUERlbXV4ZXIqIGNvbnN0IGRlbXV4ID0gV2ViUERlbXV4KCZ3ZWJwX2RhdGEpOworICBXZWJQQ2h1bmtJdGVyYXRvciBjaHVua19pdGVyOworICB1aW50MzJfdCBmbGFnczsKKworICBpZiAoZGVtdXggPT0gTlVMTCkgcmV0dXJuIDA7CisgIGFzc2VydChtZXRhZGF0YSAhPSBOVUxMKTsKKworICBmbGFncyA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfRk9STUFUX0ZMQUdTKTsKKworICBpZiAoKGZsYWdzICYgSUNDUF9GTEFHKSAmJiBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIklDQ1AiLCAxLCAmY2h1bmtfaXRlcikpIHsKKyAgICBNZXRhZGF0YUNvcHkoKGNvbnN0IGNoYXIqKWNodW5rX2l0ZXIuY2h1bmsuYnl0ZXMsIGNodW5rX2l0ZXIuY2h1bmsuc2l6ZSwKKyAgICAgICAgICAgICAgICAgJm1ldGFkYXRhLT5pY2NwKTsKKyAgICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIH0KKyAgaWYgKChmbGFncyAmIEVYSUZfRkxBRykgJiYgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJFWElGIiwgMSwgJmNodW5rX2l0ZXIpKSB7CisgICAgTWV0YWRhdGFDb3B5KChjb25zdCBjaGFyKiljaHVua19pdGVyLmNodW5rLmJ5dGVzLCBjaHVua19pdGVyLmNodW5rLnNpemUsCisgICAgICAgICAgICAgICAgICZtZXRhZGF0YS0+ZXhpZik7CisgICAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOworICB9CisgIGlmICgoZmxhZ3MgJiBYTVBfRkxBRykgJiYgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJYTVAgIiwgMSwgJmNodW5rX2l0ZXIpKSB7CisgICAgTWV0YWRhdGFDb3B5KChjb25zdCBjaGFyKiljaHVua19pdGVyLmNodW5rLmJ5dGVzLCBjaHVua19pdGVyLmNodW5rLnNpemUsCisgICAgICAgICAgICAgICAgICZtZXRhZGF0YS0+eG1wKTsKKyAgICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIH0KKyAgV2ViUERlbXV4RGVsZXRlKGRlbXV4KTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBSZWFkV2ViUChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICBpbnQgb2sgPSAwOworICBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFZQOF9TVEFUVVNfT0s7CisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgV2ViUERlY0J1ZmZlciogY29uc3Qgb3V0cHV0X2J1ZmZlciA9ICZjb25maWcub3V0cHV0OworICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGJpdHN0cmVhbSA9ICZjb25maWcuaW5wdXQ7CisKKyAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhX3NpemUgPT0gMCB8fCBwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgaWYgKCFXZWJQSW5pdERlY29kZXJDb25maWcoJmNvbmZpZykpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkxpYnJhcnkgdmVyc2lvbiBtaXNtYXRjaCFcbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgc3RhdHVzID0gV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgYml0c3RyZWFtKTsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgUHJpbnRXZWJQRXJyb3IoImlucHV0IGRhdGEiLCBzdGF0dXMpOworICAgIHJldHVybiAwOworICB9CisKKyAgZG8geworICAgIGNvbnN0IGludCBoYXNfYWxwaGEgPSBrZWVwX2FscGhhICYmIGJpdHN0cmVhbS0+aGFzX2FscGhhOworICAgIHVpbnQ2NF90IHN0cmlkZTsKKyAgICBwaWMtPndpZHRoID0gYml0c3RyZWFtLT53aWR0aDsKKyAgICBwaWMtPmhlaWdodCA9IGJpdHN0cmVhbS0+aGVpZ2h0OworICAgIGlmIChwaWMtPnVzZV9hcmdiKSB7CisgICAgICBzdHJpZGUgPSAodWludDY0X3QpYml0c3RyZWFtLT53aWR0aCAqIDQ7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0cmlkZSA9ICh1aW50NjRfdCliaXRzdHJlYW0tPndpZHRoICogKGhhc19hbHBoYSA/IDUgOiAzKSAvIDI7CisgICAgICBwaWMtPmNvbG9yc3BhY2UgPSBoYXNfYWxwaGEgPyBXRUJQX1lVVjQyMEEgOiBXRUJQX1lVVjQyMDsKKyAgICB9CisKKyAgICBpZiAoIUltZ0lvVXRpbENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHN0cmlkZSwgYml0c3RyZWFtLT5oZWlnaHQpKSB7CisgICAgICBzdGF0dXMgPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBvayA9IFdlYlBQaWN0dXJlQWxsb2MocGljKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICBzdGF0dXMgPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKHBpYy0+dXNlX2FyZ2IpIHsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBNT0RFX0FSR0I7CisjZWxzZQorICAgICAgb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZSA9IE1PREVfQkdSQTsKKyNlbmRpZgorICAgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnJnYmEgPSAodWludDhfdCopcGljLT5hcmdiOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnN0cmlkZSA9IHBpYy0+YXJnYl9zdHJpZGUgKiBzaXplb2YodWludDMyX3QpOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5SR0JBLnNpemUgPSBvdXRwdXRfYnVmZmVyLT51LlJHQkEuc3RyaWRlICogcGljLT5oZWlnaHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIG91dHB1dF9idWZmZXItPmNvbG9yc3BhY2UgPSBoYXNfYWxwaGEgPyBNT0RFX1lVVkEgOiBNT0RFX1lVVjsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55ID0gcGljLT55OworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnUgPSBwaWMtPnU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudiA9IHBpYy0+djsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS5hID0gaGFzX2FscGhhID8gcGljLT5hIDogTlVMTDsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS55X3N0cmlkZSA9IHBpYy0+eV9zdHJpZGU7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEudV9zdHJpZGUgPSBwaWMtPnV2X3N0cmlkZTsKKyAgICAgIG91dHB1dF9idWZmZXItPnUuWVVWQS52X3N0cmlkZSA9IHBpYy0+dXZfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc3RyaWRlID0gaGFzX2FscGhhID8gcGljLT5hX3N0cmlkZSA6IDA7CisgICAgICBvdXRwdXRfYnVmZmVyLT51LllVVkEueV9zaXplID0gcGljLT5oZWlnaHQgKiBwaWMtPnlfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnVfc2l6ZSA9IChwaWMtPmhlaWdodCArIDEpIC8gMiAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLnZfc2l6ZSA9IChwaWMtPmhlaWdodCArIDEpIC8gMiAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgb3V0cHV0X2J1ZmZlci0+dS5ZVVZBLmFfc2l6ZSA9IHBpYy0+aGVpZ2h0ICogcGljLT5hX3N0cmlkZTsKKyAgICB9CisgICAgb3V0cHV0X2J1ZmZlci0+aXNfZXh0ZXJuYWxfbWVtb3J5ID0gMTsKKworICAgIHN0YXR1cyA9IERlY29kZVdlYlAoZGF0YSwgZGF0YV9zaXplLCAmY29uZmlnKTsKKyAgICBvayA9IChzdGF0dXMgPT0gVlA4X1NUQVRVU19PSyk7CisgICAgaWYgKG9rICYmICFrZWVwX2FscGhhICYmIHBpYy0+dXNlX2FyZ2IpIHsKKyAgICAgIC8vIE5lZWQgdG8gd2lwZSBvdXQgdGhlIGFscGhhIHZhbHVlLCBhcyByZXF1ZXN0ZWQuCisgICAgICBpbnQgeCwgeTsKKyAgICAgIHVpbnQzMl90KiBhcmdiID0gcGljLT5hcmdiOworICAgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgYXJnYlt4XSB8PSAweGZmMDAwMDAwdTsKKyAgICAgICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfSB3aGlsZSAoMCk7ICAgLy8gPC0gc28gd2UgY2FuICdicmVhaycgb3V0IG9mIHRoZSBsb29wCisKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgUHJpbnRXZWJQRXJyb3IoImlucHV0IGRhdGEiLCBzdGF0dXMpOworICAgIG9rID0gMDsKKyAgfQorCisgIFdlYlBGcmVlRGVjQnVmZmVyKG91dHB1dF9idWZmZXIpOworCisgIGlmIChvayAmJiBtZXRhZGF0YSAhPSBOVUxMKSB7CisgICAgb2sgPSBFeHRyYWN0TWV0YWRhdGEoZGF0YSwgZGF0YV9zaXplLCBtZXRhZGF0YSk7CisgICAgaWYgKCFvaykgeworICAgICAgUHJpbnRXZWJQRXJyb3IoIm1ldGFkYXRhIiwgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IpOworICAgIH0KKyAgfQorICBpZiAoIW9rKSBXZWJQUGljdHVyZUZyZWUocGljKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dlYnBkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzI5ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93ZWJwZGVjLmgKQEAgLTAsMCArMSw2NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlAgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19XRUJQREVDX0hfCisjZGVmaW5lIFdFQlBfSU1BR0VJT19XRUJQREVDX0hfCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlAgZGVjb2RpbmcKKworLy8gUHJpbnRzIGFuIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2UgcmVnYXJkaW5nIGRlY29kZSBmYWlsdXJlIG9mICdpbl9maWxlJy4KKy8vICdzdGF0dXMnIGlzIHRyZWF0ZWQgYXMgYSBWUDhTdGF0dXNDb2RlIGFuZCBpZiB2YWxpZCB3aWxsIGJlIHByaW50ZWQgYXMgYQorLy8gdGV4dCBzdHJpbmcuCit2b2lkIFByaW50V2ViUEVycm9yKGNvbnN0IGNoYXIqIGNvbnN0IGluX2ZpbGUsIGludCBzdGF0dXMpOworCisvLyBSZWFkcyBhIFdlYlAgZnJvbSAnaW5fZmlsZScsIHJldHVybmluZyB0aGUgY29udGVudHMgYW5kIHNpemUgaW4gJ2RhdGEnIGFuZAorLy8gJ2RhdGFfc2l6ZScuIElmIG5vdCBOVUxMLCAnYml0c3RyZWFtJyBpcyBwb3B1bGF0ZWQgdXNpbmcgV2ViUEdldEZlYXR1cmVzKCkuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KK2ludCBMb2FkV2ViUChjb25zdCBjaGFyKiBjb25zdCBpbl9maWxlLAorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqKiBkYXRhLCBzaXplX3QqIGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGJpdHN0cmVhbSk7CisKKy8vIERlY29kZXMgdGhlIFdlYlAgY29udGFpbmVkIGluICdkYXRhJy4KKy8vICdjb25maWcnIGlzIGEgc3RydWN0dXJlIHByZXZpb3VzbHkgaW5pdGlhbGl6ZWQgYnkgV2ViUEluaXREZWNvZGVyQ29uZmlnKCkuCisvLyAnY29uZmlnLT5vdXRwdXQnIHNob3VsZCBoYXZlIHRoZSBkZXNpcmVkIGNvbG9yc3BhY2Ugc2VsZWN0ZWQuCisvLyBSZXR1cm5zIHRoZSBkZWNvZGVyIHN0YXR1cy4gT24gc3VjY2VzcyAnY29uZmlnLT5vdXRwdXQnIHdpbGwgY29udGFpbiB0aGUKKy8vIGRlY29kZWQgcGljdHVyZS4KK1ZQOFN0YXR1c0NvZGUgRGVjb2RlV2ViUChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcpOworCisvLyBTYW1lIGFzIERlY29kZVdlYlAoKSwgYnV0IHVzaW5nIHRoZSBpbmNyZW1lbnRhbCBkZWNvZGVyLgorVlA4U3RhdHVzQ29kZSBEZWNvZGVXZWJQSW5jcmVtZW50YWwoCisgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uc3QgY29uZmlnKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gRGVjb2RlcyBhIFdlYlAgY29udGFpbmVkIGluICdkYXRhJywgcmV0dXJuaW5nIHRoZSBkZWNvZGVkIG91dHB1dCBpbiAncGljJy4KKy8vIE91dHB1dCBpcyBSR0JBIG9yIFlVVkEsIGRlcGVuZGluZyBvbiBwaWMtPnVzZV9hcmdiIHZhbHVlLgorLy8gSWYgJ2tlZXBfYWxwaGEnIGlzIHRydWUgYW5kIHRoZSBXZWJQIGhhcyBhbiBhbHBoYSBjaGFubmVsLCB0aGUgb3V0cHV0IGlzIFJHQkEKKy8vIG9yIFlVVkEuIE90aGVyd2lzZSwgYWxwaGEgY2hhbm5lbCBpcyBkcm9wcGVkIGFuZCBvdXRwdXQgaXMgUkdCIG9yIFlVVi4KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgoraW50IFJlYWRXZWJQKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgaW50IGtlZXBfYWxwaGEsIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX1dFQlBERUNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTcyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pbWFnZWlvL3dpY2RlYy5jCkBAIC0wLDAgKzEsMzk2IEBACisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoV0lDKSBkZWNvZGUuCisKKyNpbmNsdWRlICIuL3dpY2RlYy5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgIndlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBIQVZFX1dJTkNPREVDX0gKKyNpZmRlZiBfX01JTkdXMzJfXworI2RlZmluZSBJTklUR1VJRCAgLy8gV2l0aG91dCB0aGlzIEdVSURzIGFyZSBkZWNsYXJlZCBleHRlcm4gYW5kIGZhaWwgdG8gbGluaworI2VuZGlmCisjZGVmaW5lIENJTlRFUkZBQ0UKKyNkZWZpbmUgQ09CSk1BQ1JPUworI2RlZmluZSBfV0lOMzJfSUUgMHg1MDAgIC8vIFdvcmthcm91bmQgYnVnIGluIHNobHdhcGkuaCB3aGVuIGNvbXBpbGluZyBDKysKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlIHdpdGggQ09CSk1BQ1JPUy4KKyNpbmNsdWRlIDxvbGUyLmg+ICAvLyBDcmVhdGVTdHJlYW1PbkhHbG9iYWwoKQorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luY29kZWMuaD4KKworI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAiLi9pbWFnZWlvX3V0aWwuaCIKKyNpbmNsdWRlICIuL21ldGFkYXRhLmgiCisKKyNkZWZpbmUgSUZTKGZuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKFNVQ0NFRURFRChocikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGhyID0gKGZuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaWYgKEZBSUxFRChocikpIGZwcmludGYoc3RkZXJyLCAjZm4gIiBmYWlsZWQgJTA4bHhcbiIsIGhyKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8gbW9kaWZpZWQgdmVyc2lvbiBvZiBERUZJTkVfR1VJRCBmcm9tIGd1aWRkZWYuaC4KKyNkZWZpbmUgV0VCUF9ERUZJTkVfR1VJRChuYW1lLCBsLCB3MSwgdzIsIGIxLCBiMiwgYjMsIGI0LCBiNSwgYjYsIGI3LCBiOCkgXAorICBzdGF0aWMgY29uc3QgR1VJRCBuYW1lID0gXAorICAgICAgeyBsLCB3MSwgdzIsIHsgYjEsIGIyLCAgYjMsICBiNCwgIGI1LCAgYjYsICBiNywgIGI4IH0gfQorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgTUFLRV9SRUZHVUlEKHgpICh4KQorI2Vsc2UKKyNkZWZpbmUgTUFLRV9SRUZHVUlEKHgpICYoeCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBXSUNGb3JtYXRJbXBvcnRlciB7CisgIGNvbnN0IEdVSUQqIHBpeGVsX2Zvcm1hdDsKKyAgaW50IGJ5dGVzX3Blcl9waXhlbDsKKyAgaW50ICgqaW1wb3J0KShXZWJQUGljdHVyZSogY29uc3QsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0LCBpbnQpOworfSBXSUNGb3JtYXRJbXBvcnRlcjsKKworLy8gRnJvbSBNaWNyb3NvZnQgU0RLIDcuMGEgLS0gd2luY29kZWMuaAorLy8gQ3JlYXRlIGxvY2FsIGNvcGllcyBmb3IgY29tcGF0aWJpbGl0eSB3aGVuIGJ1aWxkaW5nIGFnYWluc3QgZWFybGllcgorLy8gdmVyc2lvbnMgb2YgdGhlIFNESy4KK1dFQlBfREVGSU5FX0dVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDI0YnBwQkdSXywKKyAgICAgICAgICAgICAgICAgMHg2ZmRkYzMyNCwgMHg0ZTAzLCAweDRiZmUsCisgICAgICAgICAgICAgICAgIDB4YjEsIDB4ODUsIDB4M2QsIDB4NzcsIDB4NzYsIDB4OGQsIDB4YzksIDB4MGMpOworV0VCUF9ERUZJTkVfR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0MjRicHBSR0JfLAorICAgICAgICAgICAgICAgICAweDZmZGRjMzI0LCAweDRlMDMsIDB4NGJmZSwKKyAgICAgICAgICAgICAgICAgMHhiMSwgMHg4NSwgMHgzZCwgMHg3NywgMHg3NiwgMHg4ZCwgMHhjOSwgMHgwZCk7CitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcEJHUkFfLAorICAgICAgICAgICAgICAgICAweDZmZGRjMzI0LCAweDRlMDMsIDB4NGJmZSwKKyAgICAgICAgICAgICAgICAgMHhiMSwgMHg4NSwgMHgzZCwgMHg3NywgMHg3NiwgMHg4ZCwgMHhjOSwgMHgwZik7CitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcFJHQkFfLAorICAgICAgICAgICAgICAgICAweGY1YzdhZDJkLCAweDZhOGQsIDB4NDNkZCwKKyAgICAgICAgICAgICAgICAgMHhhNywgMHhhOCwgMHhhMiwgMHg5OSwgMHgzNSwgMHgyNiwgMHgxYSwgMHhlOSk7CitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ2NGJwcEJHUkFfLAorICAgICAgICAgICAgICAgICAweDE1NjJmZjdjLCAweGQzNTIsIDB4NDZmOSwKKyAgICAgICAgICAgICAgICAgMHg5NywgMHg5ZSwgMHg0MiwgMHg5NywgMHg2YiwgMHg3OSwgMHgyMiwgMHg0Nik7CitXRUJQX0RFRklORV9HVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ2NGJwcFJHQkFfLAorICAgICAgICAgICAgICAgICAweDZmZGRjMzI0LCAweDRlMDMsIDB4NGJmZSwKKyAgICAgICAgICAgICAgICAgMHhiMSwgMHg4NSwgMHgzZCwgMHg3NywgMHg3NiwgMHg4ZCwgMHhjOSwgMHgxNik7CisKK3N0YXRpYyBIUkVTVUxUIE9wZW5JbnB1dFN0cmVhbShjb25zdCBjaGFyKiBmaWxlbmFtZSwgSVN0cmVhbSoqIHN0cmVhbSkgeworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgaWYgKCFzdHJjbXAoZmlsZW5hbWUsICItIikpIHsKKyAgICBjb25zdCB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgICBzaXplX3QgZGF0YV9zaXplID0gMDsKKyAgICBjb25zdCBpbnQgb2sgPSBJbWdJb1V0aWxSZWFkRmlsZShmaWxlbmFtZSwgJmRhdGEsICZkYXRhX3NpemUpOworICAgIGlmIChvaykgeworICAgICAgSEdMT0JBTCBpbWFnZSA9IEdsb2JhbEFsbG9jKEdNRU1fTU9WRUFCTEUsIGRhdGFfc2l6ZSk7CisgICAgICBpZiAoaW1hZ2UgIT0gTlVMTCkgeworICAgICAgICB2b2lkKiBjb25zdCBpbWFnZV9tZW0gPSBHbG9iYWxMb2NrKGltYWdlKTsKKyAgICAgICAgaWYgKGltYWdlX21lbSAhPSBOVUxMKSB7CisgICAgICAgICAgbWVtY3B5KGltYWdlX21lbSwgZGF0YSwgZGF0YV9zaXplKTsKKyAgICAgICAgICBHbG9iYWxVbmxvY2soaW1hZ2UpOworICAgICAgICAgIElGUyhDcmVhdGVTdHJlYW1PbkhHbG9iYWwoaW1hZ2UsIFRSVUUsIHN0cmVhbSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGhyID0gRV9GQUlMOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBociA9IEVfT1VUT0ZNRU1PUlk7CisgICAgICB9CisgICAgICBmcmVlKCh2b2lkKilkYXRhKTsKKyAgICB9IGVsc2UgeworICAgICAgaHIgPSBFX0ZBSUw7CisgICAgfQorICB9IGVsc2UgeworICAgIElGUyhTSENyZWF0ZVN0cmVhbU9uRmlsZUEoZmlsZW5hbWUsIFNUR01fUkVBRCwgc3RyZWFtKSk7CisgIH0KKworICBpZiAoRkFJTEVEKGhyKSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlICVzICglMDhseClcbiIsIGZpbGVuYW1lLCBocik7CisgIH0KKyAgcmV0dXJuIGhyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0YWRhdGEgcHJvY2Vzc2luZworCisvLyBTdG9yZXMgdGhlIGZpcnN0IG5vbi16ZXJvIHNpemVkIGNvbG9yIHByb2ZpbGUgZnJvbSAnZnJhbWUnIHRvICdpY2NwJy4KKy8vIFJldHVybnMgYW4gSFJFU1VMVCB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yIGZhaWx1cmUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUKKy8vIGZvciBmcmVlaW5nICdpY2NwLT5ieXRlcycgaW4gZWl0aGVyIGNhc2UuCitzdGF0aWMgSFJFU1VMVCBFeHRyYWN0SUNDUChJV0lDSW1hZ2luZ0ZhY3RvcnkqIGNvbnN0IGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJV0lDQml0bWFwRnJhbWVEZWNvZGUqIGNvbnN0IGZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGFQYXlsb2FkKiBjb25zdCBpY2NwKSB7CisgIEhSRVNVTFQgaHIgPSBTX09LOworICBVSU5UIGksIGNvdW50OworICBJV0lDQ29sb3JDb250ZXh0KiogY29sb3JfY29udGV4dHM7CisKKyAgSUZTKElXSUNCaXRtYXBGcmFtZURlY29kZV9HZXRDb2xvckNvbnRleHRzKGZyYW1lLCAwLCBOVUxMLCAmY291bnQpKTsKKyAgaWYgKEZBSUxFRChocikgfHwgY291bnQgPT0gMCkgcmV0dXJuIGhyOworCisgIGNvbG9yX2NvbnRleHRzID0gKElXSUNDb2xvckNvbnRleHQqKiljYWxsb2MoY291bnQsIHNpemVvZigqY29sb3JfY29udGV4dHMpKTsKKyAgaWYgKGNvbG9yX2NvbnRleHRzID09IE5VTEwpIHJldHVybiBFX09VVE9GTUVNT1JZOworICBmb3IgKGkgPSAwOyBTVUNDRUVERUQoaHIpICYmIGkgPCBjb3VudDsgKytpKSB7CisgICAgSUZTKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVDb2xvckNvbnRleHQoZmFjdG9yeSwgJmNvbG9yX2NvbnRleHRzW2ldKSk7CisgIH0KKworICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIFVJTlQgbnVtX2NvbG9yX2NvbnRleHRzOworICAgIElGUyhJV0lDQml0bWFwRnJhbWVEZWNvZGVfR2V0Q29sb3JDb250ZXh0cyhmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQsIGNvbG9yX2NvbnRleHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtX2NvbG9yX2NvbnRleHRzKSk7CisgICAgYXNzZXJ0KEZBSUxFRChocikgfHwgbnVtX2NvbG9yX2NvbnRleHRzIDw9IGNvdW50KTsKKyAgICBmb3IgKGkgPSAwOyBTVUNDRUVERUQoaHIpICYmIGkgPCBudW1fY29sb3JfY29udGV4dHM7ICsraSkgeworICAgICAgV0lDQ29sb3JDb250ZXh0VHlwZSB0eXBlOworICAgICAgSUZTKElXSUNDb2xvckNvbnRleHRfR2V0VHlwZShjb2xvcl9jb250ZXh0c1tpXSwgJnR5cGUpKTsKKyAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIHR5cGUgPT0gV0lDQ29sb3JDb250ZXh0UHJvZmlsZSkgeworICAgICAgICBVSU5UIHNpemU7CisgICAgICAgIElGUyhJV0lDQ29sb3JDb250ZXh0X0dldFByb2ZpbGVCeXRlcyhjb2xvcl9jb250ZXh0c1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwsICZzaXplKSk7CisgICAgICAgIGlmIChTVUNDRUVERUQoaHIpICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgaWNjcC0+Ynl0ZXMgPSAodWludDhfdCopbWFsbG9jKHNpemUpOworICAgICAgICAgIGlmIChpY2NwLT5ieXRlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICBociA9IEVfT1VUT0ZNRU1PUlk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWNjcC0+c2l6ZSA9IHNpemU7CisgICAgICAgICAgSUZTKElXSUNDb2xvckNvbnRleHRfR2V0UHJvZmlsZUJ5dGVzKGNvbG9yX2NvbnRleHRzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVClpY2NwLT5zaXplLCBpY2NwLT5ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNpemUpKTsKKyAgICAgICAgICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBzaXplICE9IGljY3AtPnNpemUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZyEgSUNDIHByb2ZpbGUgc2l6ZSAoJXUpICE9IGV4cGVjdGVkICgldSlcbiIsCisgICAgICAgICAgICAgICAgICAgIHNpemUsICh1aW50MzJfdClpY2NwLT5zaXplKTsKKyAgICAgICAgICAgIGljY3AtPnNpemUgPSBzaXplOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgIGlmIChjb2xvcl9jb250ZXh0c1tpXSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGNvbG9yX2NvbnRleHRzW2ldKTsKKyAgfQorICBmcmVlKGNvbG9yX2NvbnRleHRzKTsKKyAgcmV0dXJuIGhyOworfQorCitzdGF0aWMgSFJFU1VMVCBFeHRyYWN0TWV0YWRhdGEoSVdJQ0ltYWdpbmdGYWN0b3J5KiBjb25zdCBmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElXSUNCaXRtYXBGcmFtZURlY29kZSogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEqIGNvbnN0IG1ldGFkYXRhKSB7CisgIC8vIFRPRE8oanplcm4pOiBhZGQgWE1QL0VYSUYgZXh0cmFjdGlvbi4KKyAgY29uc3QgSFJFU1VMVCBociA9IEV4dHJhY3RJQ0NQKGZhY3RvcnksIGZyYW1lLCAmbWV0YWRhdGEtPmljY3ApOworICBpZiAoRkFJTEVEKGhyKSkgTWV0YWRhdGFGcmVlKG1ldGFkYXRhKTsKKyAgcmV0dXJuIGhyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IEhhc1BhbGV0dGUoR1VJRCBwaXhlbF9mb3JtYXQpIHsKKyAgcmV0dXJuIChJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDFicHBJbmRleGVkKSkgfHwKKyAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDJicHBJbmRleGVkKSkgfHwKKyAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDRicHBJbmRleGVkKSkgfHwKKyAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDhicHBJbmRleGVkKSkpOworfQorCitzdGF0aWMgaW50IEhhc0FscGhhKElXSUNJbWFnaW5nRmFjdG9yeSogY29uc3QgZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgSVdJQ0JpdG1hcERlY29kZXIqIGNvbnN0IGRlY29kZXIsCisgICAgICAgICAgICAgICAgICAgIElXSUNCaXRtYXBGcmFtZURlY29kZSogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgIEdVSUQgcGl4ZWxfZm9ybWF0KSB7CisgIGludCBoYXNfYWxwaGE7CisgIGlmIChIYXNQYWxldHRlKHBpeGVsX2Zvcm1hdCkpIHsKKyAgICBJV0lDUGFsZXR0ZSogZnJhbWVfcGFsZXR0ZSA9IE5VTEw7CisgICAgSVdJQ1BhbGV0dGUqIGdsb2JhbF9wYWxldHRlID0gTlVMTDsKKyAgICBCT09MIGZyYW1lX3BhbGV0dGVfaGFzX2FscGhhID0gRkFMU0U7CisgICAgQk9PTCBnbG9iYWxfcGFsZXR0ZV9oYXNfYWxwaGEgPSBGQUxTRTsKKworICAgIC8vIEEgcGFsZXR0ZSBtYXkgZXhpc3QgYXQgdGhlIGZyYW1lIG9yIGNvbnRhaW5lciBsZXZlbCwKKyAgICAvLyBjaGVjayBJV0lDUGFsZXR0ZTo6SGFzQWxwaGEoKSBmb3IgYm90aCBpZiBwcmVzZW50LgorICAgIGlmIChTVUNDRUVERUQoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZVBhbGV0dGUoZmFjdG9yeSwgJmZyYW1lX3BhbGV0dGUpKSAmJgorICAgICAgICBTVUNDRUVERUQoSVdJQ0JpdG1hcEZyYW1lRGVjb2RlX0NvcHlQYWxldHRlKGZyYW1lLCBmcmFtZV9wYWxldHRlKSkpIHsKKyAgICAgIElXSUNQYWxldHRlX0hhc0FscGhhKGZyYW1lX3BhbGV0dGUsICZmcmFtZV9wYWxldHRlX2hhc19hbHBoYSk7CisgICAgfQorICAgIGlmIChTVUNDRUVERUQoSVdJQ0ltYWdpbmdGYWN0b3J5X0NyZWF0ZVBhbGV0dGUoZmFjdG9yeSwgJmdsb2JhbF9wYWxldHRlKSkgJiYKKyAgICAgICAgU1VDQ0VFREVEKElXSUNCaXRtYXBEZWNvZGVyX0NvcHlQYWxldHRlKGRlY29kZXIsIGdsb2JhbF9wYWxldHRlKSkpIHsKKyAgICAgIElXSUNQYWxldHRlX0hhc0FscGhhKGdsb2JhbF9wYWxldHRlLCAmZ2xvYmFsX3BhbGV0dGVfaGFzX2FscGhhKTsKKyAgICB9CisgICAgaGFzX2FscGhhID0gZnJhbWVfcGFsZXR0ZV9oYXNfYWxwaGEgfHwgZ2xvYmFsX3BhbGV0dGVfaGFzX2FscGhhOworCisgICAgaWYgKGZyYW1lX3BhbGV0dGUgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShmcmFtZV9wYWxldHRlKTsKKyAgICBpZiAoZ2xvYmFsX3BhbGV0dGUgIT0gTlVMTCkgSVVua25vd25fUmVsZWFzZShnbG9iYWxfcGFsZXR0ZSk7CisgIH0gZWxzZSB7CisgICAgaGFzX2FscGhhID0gSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQzMmJwcFJHQkFfKSkgfHwKKyAgICAgICAgICAgICAgICBJc0VxdWFsR1VJRChNQUtFX1JFRkdVSUQocGl4ZWxfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwQkdSQV8pKSB8fAorICAgICAgICAgICAgICAgIElzRXF1YWxHVUlEKE1BS0VfUkVGR1VJRChwaXhlbF9mb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfUkVGR1VJRChHVUlEX1dJQ1BpeGVsRm9ybWF0NjRicHBSR0JBXykpIHx8CisgICAgICAgICAgICAgICAgSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHBpeGVsX2Zvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFLRV9SRUZHVUlEKEdVSURfV0lDUGl4ZWxGb3JtYXQ2NGJwcEJHUkFfKSk7CisgIH0KKyAgcmV0dXJuIGhhc19hbHBoYTsKK30KKworaW50IFJlYWRQaWN0dXJlV2l0aFdJQyhjb25zdCBjaGFyKiBjb25zdCBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhKiBjb25zdCBtZXRhZGF0YSkgeworICAvLyBGcm9tIE1pY3Jvc29mdCBTREsgNi4wYSAtLSBrcy5oCisgIC8vIERlZmluZSBhIGxvY2FsIGNvcHkgdG8gYXZvaWQgbGluayBlcnJvcnMgdW5kZXIgbWluZ3cuCisgIFdFQlBfREVGSU5FX0dVSUQoR1VJRF9OVUxMXywgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgIHN0YXRpYyBjb25zdCBXSUNGb3JtYXRJbXBvcnRlciBrQWxwaGFGb3JtYXRJbXBvcnRlcnNbXSA9IHsKKyAgICB7ICZHVUlEX1dJQ1BpeGVsRm9ybWF0MzJicHBCR1JBXywgNCwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBIH0sCisgICAgeyAmR1VJRF9XSUNQaXhlbEZvcm1hdDMyYnBwUkdCQV8sIDQsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSB9LAorICAgIHsgTlVMTCwgMCwgTlVMTCB9LAorICB9OworICBzdGF0aWMgY29uc3QgV0lDRm9ybWF0SW1wb3J0ZXIga05vbkFscGhhRm9ybWF0SW1wb3J0ZXJzW10gPSB7CisgICAgeyAmR1VJRF9XSUNQaXhlbEZvcm1hdDI0YnBwQkdSXywgMywgV2ViUFBpY3R1cmVJbXBvcnRCR1IgfSwKKyAgICB7ICZHVUlEX1dJQ1BpeGVsRm9ybWF0MjRicHBSR0JfLCAzLCBXZWJQUGljdHVyZUltcG9ydFJHQiB9LAorICAgIHsgTlVMTCwgMCwgTlVMTCB9LAorICB9OworICBIUkVTVUxUIGhyID0gU19PSzsKKyAgSVdJQ0JpdG1hcEZyYW1lRGVjb2RlKiBmcmFtZSA9IE5VTEw7CisgIElXSUNGb3JtYXRDb252ZXJ0ZXIqIGNvbnZlcnRlciA9IE5VTEw7CisgIElXSUNJbWFnaW5nRmFjdG9yeSogZmFjdG9yeSA9IE5VTEw7CisgIElXSUNCaXRtYXBEZWNvZGVyKiBkZWNvZGVyID0gTlVMTDsKKyAgSVN0cmVhbSogc3RyZWFtID0gTlVMTDsKKyAgVUlOVCBmcmFtZV9jb3VudCA9IDA7CisgIFVJTlQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICBCWVRFKiByZ2IgPSBOVUxMOworICBXSUNQaXhlbEZvcm1hdEdVSUQgc3JjX3BpeGVsX2Zvcm1hdCA9IEdVSURfV0lDUGl4ZWxGb3JtYXRVbmRlZmluZWQ7CisgIGNvbnN0IFdJQ0Zvcm1hdEltcG9ydGVyKiBpbXBvcnRlciA9IE5VTEw7CisgIEdVSUQgc3JjX2NvbnRhaW5lcl9mb3JtYXQgPSBHVUlEX05VTExfOworICBzdGF0aWMgY29uc3QgR1VJRCoga0FscGhhQ29udGFpbmVyc1tdID0geworICAgICZHVUlEX0NvbnRhaW5lckZvcm1hdEJtcCwKKyAgICAmR1VJRF9Db250YWluZXJGb3JtYXRQbmcsCisgICAgJkdVSURfQ29udGFpbmVyRm9ybWF0VGlmZiwKKyAgICBOVUxMCisgIH07CisgIGludCBoYXNfYWxwaGEgPSAwOworICBpbnQ2NF90IHN0cmlkZTsKKworICBpZiAoZmlsZW5hbWUgPT0gTlVMTCB8fCBwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgSUZTKENvSW5pdGlhbGl6ZShOVUxMKSk7CisgIElGUyhDb0NyZWF0ZUluc3RhbmNlKE1BS0VfUkVGR1VJRChDTFNJRF9XSUNJbWFnaW5nRmFjdG9yeSksIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgIENMU0NUWF9JTlBST0NfU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoSUlEX0lXSUNJbWFnaW5nRmFjdG9yeSksCisgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQqKSZmYWN0b3J5KSk7CisgIGlmIChociA9PSBSRUdEQl9FX0NMQVNTTk9UUkVHKSB7CisgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAiQ291bGRuJ3QgYWNjZXNzIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKGFyZSB5b3UgcnVubmluZyAiCisgICAgICAgICAgICAiV2luZG93cyBYUCBTUDMgb3IgbmV3ZXI/KS4gTW9zdCBmb3JtYXRzIG5vdCBhdmFpbGFibGUuICIKKyAgICAgICAgICAgICJVc2UgLXMgZm9yIHRoZSBhdmFpbGFibGUgWVVWIGlucHV0LlxuIik7CisgIH0KKyAgLy8gUHJlcGFyZSBmb3IgaW1hZ2UgZGVjb2RpbmcuCisgIElGUyhPcGVuSW5wdXRTdHJlYW0oZmlsZW5hbWUsICZzdHJlYW0pKTsKKyAgSUZTKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVEZWNvZGVyRnJvbVN0cmVhbSgKKyAgICAgICAgICBmYWN0b3J5LCBzdHJlYW0sIE5VTEwsCisgICAgICAgICAgV0lDRGVjb2RlTWV0YWRhdGFDYWNoZU9uRGVtYW5kLCAmZGVjb2RlcikpOworICBJRlMoSVdJQ0JpdG1hcERlY29kZXJfR2V0RnJhbWVDb3VudChkZWNvZGVyLCAmZnJhbWVfY291bnQpKTsKKyAgaWYgKFNVQ0NFRURFRChocikgJiYgZnJhbWVfY291bnQgPT0gMCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiTm8gZnJhbWUgZm91bmQgaW4gaW5wdXQgZmlsZS5cbiIpOworICAgIGhyID0gRV9GQUlMOworICB9CisgIElGUyhJV0lDQml0bWFwRGVjb2Rlcl9HZXRGcmFtZShkZWNvZGVyLCAwLCAmZnJhbWUpKTsKKyAgSUZTKElXSUNCaXRtYXBGcmFtZURlY29kZV9HZXRQaXhlbEZvcm1hdChmcmFtZSwgJnNyY19waXhlbF9mb3JtYXQpKTsKKyAgSUZTKElXSUNCaXRtYXBEZWNvZGVyX0dldENvbnRhaW5lckZvcm1hdChkZWNvZGVyLCAmc3JjX2NvbnRhaW5lcl9mb3JtYXQpKTsKKworICBpZiAoU1VDQ0VFREVEKGhyKSAmJiBrZWVwX2FscGhhKSB7CisgICAgY29uc3QgR1VJRCoqIGd1aWQ7CisgICAgZm9yIChndWlkID0ga0FscGhhQ29udGFpbmVyczsgKmd1aWQgIT0gTlVMTDsgKytndWlkKSB7CisgICAgICBpZiAoSXNFcXVhbEdVSUQoTUFLRV9SRUZHVUlEKHNyY19jb250YWluZXJfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1JFRkdVSUQoKipndWlkKSkpIHsKKyAgICAgICAgaGFzX2FscGhhID0gSGFzQWxwaGEoZmFjdG9yeSwgZGVjb2RlciwgZnJhbWUsIHNyY19waXhlbF9mb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBQcmVwYXJlIGZvciBwaXhlbCBmb3JtYXQgY29udmVyc2lvbiAoaWYgbmVjZXNzYXJ5KS4KKyAgSUZTKElXSUNJbWFnaW5nRmFjdG9yeV9DcmVhdGVGb3JtYXRDb252ZXJ0ZXIoZmFjdG9yeSwgJmNvbnZlcnRlcikpOworCisgIGZvciAoaW1wb3J0ZXIgPSBoYXNfYWxwaGEgPyBrQWxwaGFGb3JtYXRJbXBvcnRlcnMgOiBrTm9uQWxwaGFGb3JtYXRJbXBvcnRlcnM7CisgICAgICAgaHIgPT0gU19PSyAmJiBpbXBvcnRlci0+aW1wb3J0ICE9IE5VTEw7ICsraW1wb3J0ZXIpIHsKKyAgICBCT09MIGNhbl9jb252ZXJ0OworICAgIGNvbnN0IEhSRVNVTFQgY2NociA9IElXSUNGb3JtYXRDb252ZXJ0ZXJfQ2FuQ29udmVydCgKKyAgICAgICAgY29udmVydGVyLAorICAgICAgICBNQUtFX1JFRkdVSUQoc3JjX3BpeGVsX2Zvcm1hdCksCisgICAgICAgIE1BS0VfUkVGR1VJRCgqaW1wb3J0ZXItPnBpeGVsX2Zvcm1hdCksCisgICAgICAgICZjYW5fY29udmVydCk7CisgICAgaWYgKFNVQ0NFRURFRChjY2hyKSAmJiBjYW5fY29udmVydCkgYnJlYWs7CisgIH0KKyAgaWYgKGltcG9ydGVyLT5pbXBvcnQgPT0gTlVMTCkgaHIgPSBFX0ZBSUw7CisKKyAgSUZTKElXSUNGb3JtYXRDb252ZXJ0ZXJfSW5pdGlhbGl6ZShjb252ZXJ0ZXIsIChJV0lDQml0bWFwU291cmNlKilmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRlci0+cGl4ZWxfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJQ0JpdG1hcERpdGhlclR5cGVOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAuMCwgV0lDQml0bWFwUGFsZXR0ZVR5cGVDdXN0b20pKTsKKworICAvLyBEZWNvZGUuCisgIElGUyhJV0lDRm9ybWF0Q29udmVydGVyX0dldFNpemUoY29udmVydGVyLCAmd2lkdGgsICZoZWlnaHQpKTsKKyAgc3RyaWRlID0gKGludDY0X3QpaW1wb3J0ZXItPmJ5dGVzX3Blcl9waXhlbCAqIHdpZHRoICogc2l6ZW9mKCpyZ2IpOworICBpZiAoc3RyaWRlICE9IChpbnQpc3RyaWRlIHx8CisgICAgICAhSW1nSW9VdGlsQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3coc3RyaWRlLCBoZWlnaHQpKSB7CisgICAgaHIgPSBFX0ZBSUw7CisgIH0KKworICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIHJnYiA9IChCWVRFKiltYWxsb2MoKHNpemVfdClzdHJpZGUgKiBoZWlnaHQpOworICAgIGlmIChyZ2IgPT0gTlVMTCkKKyAgICAgIGhyID0gRV9PVVRPRk1FTU9SWTsKKyAgfQorICBJRlMoSVdJQ0Zvcm1hdENvbnZlcnRlcl9Db3B5UGl4ZWxzKGNvbnZlcnRlciwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVUlOVClzdHJpZGUsIChVSU5UKXN0cmlkZSAqIGhlaWdodCwgcmdiKSk7CisKKyAgLy8gV2ViUCBjb252ZXJzaW9uLgorICBpZiAoU1VDQ0VFREVEKGhyKSkgeworICAgIGludCBvazsKKyAgICBwaWMtPndpZHRoID0gd2lkdGg7CisgICAgcGljLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgcGljLT51c2VfYXJnYiA9IDE7ICAgIC8vIEZvciBXSUMsIHdlIGFsd2F5cyBmb3JjZSB0byBhcmdiCisgICAgb2sgPSBpbXBvcnRlci0+aW1wb3J0KHBpYywgcmdiLCAoaW50KXN0cmlkZSk7CisgICAgaWYgKCFvaykgaHIgPSBFX0ZBSUw7CisgIH0KKyAgaWYgKFNVQ0NFRURFRChocikpIHsKKyAgICBpZiAobWV0YWRhdGEgIT0gTlVMTCkgeworICAgICAgaHIgPSBFeHRyYWN0TWV0YWRhdGEoZmFjdG9yeSwgZnJhbWUsIG1ldGFkYXRhKTsKKyAgICAgIGlmIChGQUlMRUQoaHIpKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3IgZXh0cmFjdGluZyBpbWFnZSBtZXRhZGF0YSB1c2luZyBXSUMhXG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBDbGVhbnVwLgorICBpZiAoY29udmVydGVyICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoY29udmVydGVyKTsKKyAgaWYgKGZyYW1lICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2UoZnJhbWUpOworICBpZiAoZGVjb2RlciAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGRlY29kZXIpOworICBpZiAoZmFjdG9yeSAhPSBOVUxMKSBJVW5rbm93bl9SZWxlYXNlKGZhY3RvcnkpOworICBpZiAoc3RyZWFtICE9IE5VTEwpIElVbmtub3duX1JlbGVhc2Uoc3RyZWFtKTsKKyAgZnJlZShyZ2IpOworICByZXR1cm4gU1VDQ0VFREVEKGhyKTsKK30KKyNlbHNlICAvLyAhSEFWRV9XSU5DT0RFQ19ICitpbnQgUmVhZFBpY3R1cmVXaXRoV0lDKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpIHsKKyAgKHZvaWQpZmlsZW5hbWU7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpa2VlcF9hbHBoYTsKKyAgKHZvaWQpbWV0YWRhdGE7CisgIGZwcmludGYoc3RkZXJyLCAiV2luZG93cyBJbWFnaW5nIENvbXBvbmVudCAoV0lDKSBzdXBwb3J0IG5vdCBjb21waWxlZC4gIgorICAgICAgICAgICAgICAgICAgIlZpc3VhbCBTdHVkaW8gYW5kIG1pbmd3LXc2NCBidWlsZHMgc3VwcG9ydCBXSUMuIE1ha2Ugc3VyZSAiCisgICAgICAgICAgICAgICAgICAid2luY29kZWMuaCBkZXRlY3Rpb24gaXMgd29ya2luZyBjb3JyZWN0bHkgaWYgdXNpbmcgYXV0b2NvbmYgIgorICAgICAgICAgICAgICAgICAgImFuZCBIQVZFX1dJTkNPREVDX0ggaXMgZGVmaW5lZCBiZWZvcmUgYnVpbGRpbmcuXG4iKTsKKyAgcmV0dXJuIDA7Cit9CisjZW5kaWYgIC8vIEhBVkVfV0lOQ09ERUNfSAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW1hZ2Vpby93aWNkZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllZWNhOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2ltYWdlaW8vd2ljZGVjLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdpbmRvd3MgSW1hZ2luZyBDb21wb25lbnQgKFdJQykgZGVjb2RlLgorCisjaWZuZGVmIFdFQlBfSU1BR0VJT19XSUNERUNfSF8KKyNkZWZpbmUgV0VCUF9JTUFHRUlPX1dJQ0RFQ19IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBNZXRhZGF0YTsKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gUmVhZHMgYW4gaW1hZ2UgZnJvbSAnZmlsZW5hbWUnLCByZXR1cm5pbmcgdGhlIGRlY29kZWQgb3V0cHV0IGluICdwaWMnLgorLy8gSWYgJ2tlZXBfYWxwaGEnIGlzIHRydWUgYW5kIHRoZSBpbWFnZSBoYXMgYW4gYWxwaGEgY2hhbm5lbCwgdGhlIG91dHB1dCBpcworLy8gUkdCQSBvdGhlcndpc2UgaXQgd2lsbCBiZSBSR0IuIHBpYy0+dXNlX2FyZ2IgaXMgYWx3YXlzIGZvcmNlZCB0byB0cnVlLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgUmVhZFBpY3R1cmVXaXRoV0lDKGNvbnN0IGNoYXIqIGNvbnN0IGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGtlZXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBNZXRhZGF0YSogY29uc3QgbWV0YWRhdGEpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9JTUFHRUlPX1dJQ0RFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW9zYnVpbGQuc2ggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9pb3NidWlsZC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45NzFlZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvaW9zYnVpbGQuc2gKQEAgLTAsMCArMSwxMjkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFRoaXMgc2NyaXB0IGdlbmVyYXRlcyAnV2ViUC5mcmFtZXdvcmsnIGFuZCAnV2ViUERlY29kZXIuZnJhbWV3b3JrJy4gQW4gaU9TCisjIGFwcCBjYW4gZGVjb2RlIFdlYlAgaW1hZ2VzIGJ5IGluY2x1ZGluZyAnV2ViUERlY29kZXIuZnJhbWV3b3JrJyBhbmQgYm90aAorIyBlbmNvZGUgYW5kIGRlY29kZSBXZWJQIGltYWdlcyBieSBpbmNsdWRpbmcgJ1dlYlAuZnJhbWV3b3JrJy4KKyMKKyMgUnVuIC4vaW9zYnVpbGQuc2ggdG8gZ2VuZXJhdGUgdGhlIGZyYW1ld29ya3MgdW5kZXIgdGhlIGN1cnJlbnQgZGlyZWN0b3J5CisjICh0aGUgcHJldmlvdXMgYnVpbGQgd2lsbCBiZSBlcmFzZWQgaWYgaXQgZXhpc3RzKS4KKyMKKyMgVGhpcyBzY3JpcHQgaXMgaW5zcGlyZWQgYnkgdGhlIGJ1aWxkIHNjcmlwdCB3cml0dGVuIGJ5IENhcnNvbiBNY0RvbmFsZC4KKyMgKGh0dHA6Ly93d3cuaW9uY2Fubm9uLm5ldC9wcm9ncmFtbWluZy8xNDgzL3VzaW5nLXdlYnAtdG8tcmVkdWNlLW5hdGl2ZS1pb3MtYXBwLXNpemUvKS4KKworc2V0IC1lCisKKyMgRXh0cmFjdCB0aGUgbGF0ZXN0IFNESyB2ZXJzaW9uIGZyb20gdGhlIGZpbmFsIGZpZWxkIG9mIHRoZSBmb3JtOiBpcGhvbmVvc1guWQorcmVhZG9ubHkgU0RLPSQoeGNvZGVidWlsZCAtc2hvd3Nka3MgXAorICB8IGdyZXAgaXBob25lb3MgfCBzb3J0IHwgdGFpbCAtbiAxIHwgYXdrICd7cHJpbnQgc3Vic3RyKCRORiwgOSl9JworKQorIyBFeHRyYWN0IFhjb2RlIHZlcnNpb24uCityZWFkb25seSBYQ09ERT0kKHhjb2RlYnVpbGQgLXZlcnNpb24gfCBncmVwIFhjb2RlIHwgY3V0IC1kICIgIiAtZjIpCitpZiBbWyAteiAiJHtYQ09ERX0iIF1dOyB0aGVuCisgIGVjaG8gIlhjb2RlIG5vdCBhdmFpbGFibGUiCisgIGV4aXQgMQorZmkKKworcmVhZG9ubHkgT0xEUEFUSD0ke1BBVEh9CisKKyMgQWRkIGlQaG9uZU9TLVY2IHRvIHRoZSBsaXN0IG9mIHBsYXRmb3JtcyBiZWxvdyBpZiB5b3UgbmVlZCBhcm12NiBzdXBwb3J0LgorIyBOb3RlIHRoYXQgaVBob25lT1MtVjYgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlIHdpdGggdGhlIGlPUzYgU0RLLgorUExBVEZPUk1TPSJpUGhvbmVTaW11bGF0b3IgaVBob25lU2ltdWxhdG9yNjQiCitQTEFURk9STVMrPSIgaVBob25lT1MtVjcgaVBob25lT1MtVjdzIGlQaG9uZU9TLVY3LWFybTY0IgorcmVhZG9ubHkgUExBVEZPUk1TCityZWFkb25seSBTUkNESVI9JChkaXJuYW1lICQwKQorcmVhZG9ubHkgVE9QRElSPSQocHdkKQorcmVhZG9ubHkgQlVJTERESVI9IiR7VE9QRElSfS9pb3NidWlsZCIKK3JlYWRvbmx5IFRBUkdFVERJUj0iJHtUT1BESVJ9L1dlYlAuZnJhbWV3b3JrIgorcmVhZG9ubHkgREVDVEFSR0VURElSPSIke1RPUERJUn0vV2ViUERlY29kZXIuZnJhbWV3b3JrIgorcmVhZG9ubHkgREVWRUxPUEVSPSQoeGNvZGUtc2VsZWN0IC0tcHJpbnQtcGF0aCkKK3JlYWRvbmx5IFBMQVRGT1JNU1JPT1Q9IiR7REVWRUxPUEVSfS9QbGF0Zm9ybXMiCityZWFkb25seSBMSVBPPSQoeGNydW4gLXNkayBpcGhvbmVvcyR7U0RLfSAtZmluZCBsaXBvKQorTElCTElTVD0nJworREVDTElCTElTVD0nJworCitpZiBbWyAteiAiJHtTREt9IiBdXTsgdGhlbgorICBlY2hvICJpT1MgU0RLIG5vdCBhdmFpbGFibGUiCisgIGV4aXQgMQorZWxpZiBbWyAke1NESyUlLip9IC1ndCA4IF1dOyB0aGVuCisgIEVYVFJBX0NGTEFHUz0iLWZlbWJlZC1iaXRjb2RlIgorZWxpZiBbWyAke1NES30gPCA2LjAgXV07IHRoZW4KKyAgZWNobyAiWW91IG5lZWQgaU9TIFNESyB2ZXJzaW9uIDYuMCBvciBhYm92ZSIKKyAgZXhpdCAxCitlbHNlCisgIGVjaG8gImlPUyBTREsgVmVyc2lvbiAke1NES30iCitmaQorCitybSAtcmYgJHtCVUlMRERJUn0gJHtUQVJHRVRESVJ9ICR7REVDVEFSR0VURElSfQorbWtkaXIgLXAgJHtCVUlMRERJUn0gJHtUQVJHRVRESVJ9L0hlYWRlcnMvICR7REVDVEFSR0VURElSfS9IZWFkZXJzLworCitpZiBbWyAhIC1lICR7U1JDRElSfS9jb25maWd1cmUgXV07IHRoZW4KKyAgaWYgISAoY2QgJHtTUkNESVJ9ICYmIHNoIGF1dG9nZW4uc2gpOyB0aGVuCisgICAgY2F0IDw8RU9UCitFcnJvciBjcmVhdGluZyBjb25maWd1cmUgc2NyaXB0IQorVGhpcyBzY3JpcHQgcmVxdWlyZXMgdGhlIGF1dG9jb25mL2F1dG9tYWtlIGFuZCBsaWJ0b29sIHRvIGJ1aWxkLiBNYWNQb3J0cyBjYW4KK2JlIHVzZWQgdG8gb2J0YWluIHRoZXNlOgoraHR0cDovL3d3dy5tYWNwb3J0cy5vcmcvaW5zdGFsbC5waHAKK0VPVAorICAgIGV4aXQgMQorICBmaQorZmkKKworZm9yIFBMQVRGT1JNIGluICR7UExBVEZPUk1TfTsgZG8KKyAgQVJDSDI9IiIKKyAgaWYgW1sgIiR7UExBVEZPUk19IiA9PSAiaVBob25lT1MtVjctYXJtNjQiIF1dOyB0aGVuCisgICAgUExBVEZPUk09ImlQaG9uZU9TIgorICAgIEFSQ0g9ImFhcmNoNjQiCisgICAgQVJDSDI9ImFybTY0IgorICBlbGlmIFtbICIke1BMQVRGT1JNfSIgPT0gImlQaG9uZU9TLVY3cyIgXV07IHRoZW4KKyAgICBQTEFURk9STT0iaVBob25lT1MiCisgICAgQVJDSD0iYXJtdjdzIgorICBlbGlmIFtbICIke1BMQVRGT1JNfSIgPT0gImlQaG9uZU9TLVY3IiBdXTsgdGhlbgorICAgIFBMQVRGT1JNPSJpUGhvbmVPUyIKKyAgICBBUkNIPSJhcm12NyIKKyAgZWxpZiBbWyAiJHtQTEFURk9STX0iID09ICJpUGhvbmVPUy1WNiIgXV07IHRoZW4KKyAgICBQTEFURk9STT0iaVBob25lT1MiCisgICAgQVJDSD0iYXJtdjYiCisgIGVsaWYgW1sgIiR7UExBVEZPUk19IiA9PSAiaVBob25lU2ltdWxhdG9yNjQiIF1dOyB0aGVuCisgICAgUExBVEZPUk09ImlQaG9uZVNpbXVsYXRvciIKKyAgICBBUkNIPSJ4ODZfNjQiCisgIGVsc2UKKyAgICBBUkNIPSJpMzg2IgorICBmaQorCisgIFJPT1RESVI9IiR7QlVJTERESVJ9LyR7UExBVEZPUk19LSR7U0RLfS0ke0FSQ0h9IgorICBta2RpciAtcCAiJHtST09URElSfSIKKworICBERVZST09UPSIke0RFVkVMT1BFUn0vVG9vbGNoYWlucy9YY29kZURlZmF1bHQueGN0b29sY2hhaW4iCisgIFNES1JPT1Q9IiR7UExBVEZPUk1TUk9PVH0vIgorICBTREtST09UKz0iJHtQTEFURk9STX0ucGxhdGZvcm0vRGV2ZWxvcGVyL1NES3MvJHtQTEFURk9STX0ke1NES30uc2RrLyIKKyAgQ0ZMQUdTPSItYXJjaCAke0FSQ0gyOi0ke0FSQ0h9fSAtcGlwZSAtaXN5c3Jvb3QgJHtTREtST09UfSAtTzMgLUROREVCVUciCisgIENGTEFHUys9IiAtbWlwaG9uZW9zLXZlcnNpb24tbWluPTYuMCAke0VYVFJBX0NGTEFHU30iCisKKyAgc2V0IC14CisgIGV4cG9ydCBQQVRIPSIke0RFVlJPT1R9L3Vzci9iaW46JHtPTERQQVRIfSIKKyAgJHtTUkNESVJ9L2NvbmZpZ3VyZSAtLWhvc3Q9JHtBUkNIfS1hcHBsZS1kYXJ3aW4gLS1wcmVmaXg9JHtST09URElSfSBcCisgICAgLS1idWlsZD0kKCR7U1JDRElSfS9jb25maWcuZ3Vlc3MpIFwKKyAgICAtLWRpc2FibGUtc2hhcmVkIC0tZW5hYmxlLXN0YXRpYyBcCisgICAgLS1lbmFibGUtbGlid2VicGRlY29kZXIgLS1lbmFibGUtc3dhcC0xNmJpdC1jc3AgXAorICAgIENGTEFHUz0iJHtDRkxBR1N9IgorICBzZXQgK3gKKworICAjIHJ1biBtYWtlIG9ubHkgaW4gdGhlIHNyYy8gZGlyZWN0b3J5IHRvIGNyZWF0ZSBsaWJ3ZWJwLmEvbGlid2VicGRlY29kZXIuYQorICBjZCBzcmMvCisgIG1ha2UgVj0wCisgIG1ha2UgaW5zdGFsbAorCisgIExJQkxJU1QrPSIgJHtST09URElSfS9saWIvbGlid2VicC5hIgorICBERUNMSUJMSVNUKz0iICR7Uk9PVERJUn0vbGliL2xpYndlYnBkZWNvZGVyLmEiCisKKyAgbWFrZSBjbGVhbgorICBjZCAuLgorCisgIGV4cG9ydCBQQVRIPSR7T0xEUEFUSH0KK2RvbmUKKworY3AgLWEgJHtTUkNESVJ9L3NyYy93ZWJwL3tkZWNvZGUsZW5jb2RlLHR5cGVzfS5oICR7VEFSR0VURElSfS9IZWFkZXJzLworJHtMSVBPfSAtY3JlYXRlICR7TElCTElTVH0gLW91dHB1dCAke1RBUkdFVERJUn0vV2ViUAorCitjcCAtYSAke1NSQ0RJUn0vc3JjL3dlYnAve2RlY29kZSx0eXBlc30uaCAke0RFQ1RBUkdFVERJUn0vSGVhZGVycy8KKyR7TElQT30gLWNyZWF0ZSAke0RFQ0xJQkxJU1R9IC1vdXRwdXQgJHtERUNUQVJHRVRESVJ9L1dlYlBEZWNvZGVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwCmluZGV4IDY4MDZmMDcuLjI2YjhkNmQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2xpYndlYnAuZ3lwCkBAIC0xLDMwICsxLDE3IEBACiAjIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICMgVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogIyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgotCiB7CisgICdpbmNsdWRlcyc6IFsKKyAgICAnbGlid2VicC5neXBpJworICBdLAogICAndGFyZ2V0cyc6IFsKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kZWMnLAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2RlcGVuZGVuY2llcycgOiBbCi0gICAgICAgICdsaWJ3ZWJwX2RzcCcsCi0gICAgICAgICdsaWJ3ZWJwX2RzcF9uZW9uJywKLSAgICAgICAgJ2xpYndlYnBfdXRpbHMnLAotICAgICAgXSwKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnZGVjL2FscGhhLmMnLAotICAgICAgICAnZGVjL2J1ZmZlci5jJywKLSAgICAgICAgJ2RlYy9mcmFtZS5jJywKLSAgICAgICAgJ2RlYy9pZGVjLmMnLAotICAgICAgICAnZGVjL2lvLmMnLAotICAgICAgICAnZGVjL2xheWVyLmMnLAotICAgICAgICAnZGVjL3F1YW50LmMnLAotICAgICAgICAnZGVjL3RyZWUuYycsCi0gICAgICAgICdkZWMvdnA4LmMnLAotICAgICAgICAnZGVjL3ZwOGwuYycsCi0gICAgICAgICdkZWMvd2VicC5jJywKKyAgICAgICAgJzxAKGxpYndlYnBfZGVjX3NvdXJjZXMpJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7CkBAIC0zMiwxMTMgKzE5LDEyNCBAQAogICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICdkZW11eC9kZW11eC5jJywKKyAgICAgICAgJzxAKGxpYndlYnBfZGVtdXhfc291cmNlcyknLAogICAgICAgXSwKICAgICB9LAogICAgIHsKLSAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcCcsCisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfY29tbW9uX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnbGlid2VicF9kc3BfZGVjX21zYScsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfbmVvbicsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfc3NlMicsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfc3NlNDEnLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjX21pcHMzMicsCisgICAgICAgICdsaWJ3ZWJwX2RzcF9kZWNfbWlwc19kc3BfcjInLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfbXNhJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfbXNhX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX25lb24nLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19uZW9uX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX3NzZTInLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZHNwX2RlY19zc2UyX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX3NzZTQxJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfc3NlNDFfc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX2RzcF9kZWNfbWlwczMyJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfbWlwczMyX3NvdXJjZXMpJywKKyAgICAgIF0sCisgICAgfSwKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZGVjX21pcHNfZHNwX3IyJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9kZWNfbWlwc19kc3BfcjJfc291cmNlcyknLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdsaWJ3ZWJwX3V0aWxzX2RlYycsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCiAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgJ2RzcC9jcHUuYycsCi0gICAgICAgICdkc3AvZGVjLmMnLAotICAgICAgICAnZHNwL2RlY19zc2UyLmMnLAotICAgICAgICAnZHNwL2VuYy5jJywKLSAgICAgICAgJ2RzcC9lbmNfc3NlMi5jJywKLSAgICAgICAgJ2RzcC9sb3NzbGVzcy5jJywKLSAgICAgICAgJ2RzcC91cHNhbXBsaW5nLmMnLAotICAgICAgICAnZHNwL3Vwc2FtcGxpbmdfc3NlMi5jJywKLSAgICAgICAgJ2RzcC95dXYuYycsCi0gICAgICBdLAotICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnT1MgPT0gImFuZHJvaWQiJywgewotICAgICAgICAgICdpbmNsdWRlcyc6IFsgJy4uLy4uL2J1aWxkL2FuZHJvaWQvY3B1ZmVhdHVyZXMuZ3lwaScgXSwKLSAgICAgICAgfV0sCisgICAgICAgICc8QChsaWJ3ZWJwX3V0aWxzX2RlY19zb3VyY2VzKScsCiAgICAgICBdLAogICAgIH0sCi0gICAgewotICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfZHNwX25lb24nLAotICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnKCh0YXJnZXRfYXJjaCA9PSAiYXJtIiBhbmQgYXJtX3ZlcnNpb24gPj0gNykgb3IgKHRhcmdldF9hcmNoID09ICJhcm02NCIpKScsIHsKLSAgICAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCi0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsnLiddLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ2RzcC9kZWNfbmVvbi5jJywKLSAgICAgICAgICAgICdkc3AvZW5jX25lb24uYycsCi0gICAgICAgICAgICAnZHNwL3Vwc2FtcGxpbmdfbmVvbi5jJywKLSAgICAgICAgICBdLAotICAgICAgICAgICMgYmVoYXZpb3Igc2ltaWxhciB0byAqLmMubmVvbiBpbiBhbiBBbmRyb2lkLm1rCi0gICAgICAgICAgJ2NmbGFncyEnOiBbICctbWZwdT12ZnB2My1kMTYnIF0sCi0gICAgICAgICAgJ2NmbGFncyc6IFsgJy1tZnB1PW5lb24nIF0sCi0gICAgICAgIH0seyAgIyAidGFyZ2V0X2FyY2ggIT0gImFybSIgb3IgYXJtX3ZlcnNpb24gPCA3IgotICAgICAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgICB9XSwKLSAgICAgICAgWycodGFyZ2V0X2FyY2ggPT0gImFybSIgYW5kIGFybV92ZXJzaW9uID49IDgpIG9yICh0YXJnZXRfYXJjaCA9PSAiYXJtNjQiKScsIHsKLSAgICAgICAgICAjIE5FT04gaXMgaW1wbGljaXQgb24gQVJNdjgsIGFuZCBib3RoIGNsYW5nIGFuZCBnY2MgZG9uJ3QgbGlrZSB0aGUKLSAgICAgICAgICAjIHJlZHVuZGFudCBmbGFnLgotICAgICAgICAgICdjZmxhZ3MhJzogWyAnLW1mcHU9bmVvbicgXSwKLSAgICAgICAgfV0sCi0gICAgICBdLAotICAgIH0sCisKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9lbmMnLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ3R5cGUnIDogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKLSAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAnZW5jL2FscGhhLmMnLAotICAgICAgICAnZW5jL2FuYWx5c2lzLmMnLAotICAgICAgICAnZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXMuYycsCi0gICAgICAgICdlbmMvY29uZmlnLmMnLAotICAgICAgICAnZW5jL2Nvc3QuYycsCi0gICAgICAgICdlbmMvZmlsdGVyLmMnLAotICAgICAgICAnZW5jL2ZyYW1lLmMnLAotICAgICAgICAnZW5jL2hpc3RvZ3JhbS5jJywKLSAgICAgICAgJ2VuYy9pdGVyYXRvci5jJywKLSAgICAgICAgJ2VuYy9sYXllci5jJywKLSAgICAgICAgJ2VuYy9waWN0dXJlLmMnLAotICAgICAgICAnZW5jL3F1YW50LmMnLAotICAgICAgICAnZW5jL3N5bnRheC5jJywKLSAgICAgICAgJ2VuYy90b2tlbi5jJywKLSAgICAgICAgJ2VuYy90cmVlLmMnLAotICAgICAgICAnZW5jL3ZwOGwuYycsCi0gICAgICAgICdlbmMvd2VicGVuYy5jJywKKyAgICAgICdzb3VyY2VzJyA6IFsKKyAgICAgICAgJzxAKGxpYndlYnBfZW5jX3NvdXJjZXMpJywKICAgICAgIF0sCiAgICAgfSwKICAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF91dGlscycsCisgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicF9kc3BfZW5jJywKKyAgICAgICd0eXBlJyA6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnaW5jbHVkZV9kaXJzJzogWycuJ10sCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8QChsaWJ3ZWJwX2RzcF9lbmNfc291cmNlcyknLAorICAgICAgXSwKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2xpYndlYnBfdXRpbHNfZW5jJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAndXRpbHMvYml0X3JlYWRlci5jJywKLSAgICAgICAgJ3V0aWxzL2JpdF93cml0ZXIuYycsCi0gICAgICAgICd1dGlscy9jb2xvcl9jYWNoZS5jJywKLSAgICAgICAgJ3V0aWxzL2ZpbHRlcnMuYycsCi0gICAgICAgICd1dGlscy9odWZmbWFuLmMnLAotICAgICAgICAjJ3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmMnLAotICAgICAgICAndXRpbHMvcXVhbnRfbGV2ZWxzLmMnLAotICAgICAgICAndXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5jJywKLSAgICAgICAgJ3V0aWxzL3Jlc2NhbGVyLmMnLAotICAgICAgICAndXRpbHMvdGhyZWFkLmMnLAotICAgICAgICAndXRpbHMvdXRpbHMuYycsCisgICAgICAgICc8QChsaWJ3ZWJwX3V0aWxzX2VuY19zb3VyY2VzKScsCiAgICAgICBdLAogICAgIH0sCisKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnbGlid2VicCcsCiAgICAgICAndHlwZSc6ICdub25lJywKICAgICAgICdkZXBlbmRlbmNpZXMnIDogWwogICAgICAgICAnbGlid2VicF9kZWMnLAogICAgICAgICAnbGlid2VicF9kZW11eCcsCi0gICAgICAgICMnbGlid2VicF9kc3AnLAotICAgICAgICAjJ2xpYndlYnBfZHNwX25lb24nLAotICAgICAgICAjJ2xpYndlYnBfZW5jJywgICMgTm90IG5lZWRlZCBieSBDb2JhbHQKLSAgICAgICAgJ2xpYndlYnBfdXRpbHMnLAorICAgICAgICAnbGlid2VicF9kc3BfZGVjJywKKyAgICAgICAgJ2xpYndlYnBfdXRpbHNfZGVjJywKKyAgICAgICAgJ2xpYndlYnBfZW5jJywKKyAgICAgICAgJ2xpYndlYnBfZHNwX2VuYycsCisgICAgICAgICdsaWJ3ZWJwX3V0aWxzX2VuYycsCiAgICAgICBdLAogICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CiAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbJy4nXSwKICAgICAgIH0sCi0gICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgWydPUyE9IndpbiInLCB7J3Byb2R1Y3RfbmFtZSc6ICd3ZWJwJ31dLAotICAgICAgXSwKICAgICB9LAogICBdLAogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXBpIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbGlid2VicC5neXBpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTFiZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9saWJ3ZWJwLmd5cGkKQEAgLTAsMCArMSwxNjggQEAKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnbGlid2VicF9kZWNfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZGVjL2FscGhhX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL2J1ZmZlcl9kZWMuYycsCisgICAgICAnc3JjL2RlYy9mcmFtZV9kZWMuYycsCisgICAgICAnc3JjL2RlYy9pZGVjX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL2lvX2RlYy5jJywKKyAgICAgICdzcmMvZGVjL3F1YW50X2RlYy5jJywKKyAgICAgICdzcmMvZGVjL3RyZWVfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvdnA4X2RlYy5jJywKKyAgICAgICdzcmMvZGVjL3ZwOGxfZGVjLmMnLAorICAgICAgJ3NyYy9kZWMvd2VicF9kZWMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kZW11eF9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kZW11eC9hbmltX2RlY29kZS5jJywKKyAgICAgICdzcmMvZGVtdXgvZGVtdXguYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX2NvbW1vbl9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5jJywKKyAgICAgICdzcmMvZHNwL2NwdS5jJywKKyAgICAgICdzcmMvZHNwL2RlYy5jJywKKyAgICAgICdzcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5jJywKKyAgICAgICdzcmMvZHNwL2ZpbHRlcnMuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzcy5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZy5jJywKKyAgICAgICdzcmMvZHNwL3l1di5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfc3NlNDFfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2FscGhhX3Byb2Nlc3Npbmdfc3NlNDEuYycsCisgICAgICAnc3JjL2RzcC9kZWNfc3NlNDEuYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLmMnLAorICAgICAgJ3NyYy9kc3AveXV2X3NzZTQxLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZHNwX2RlY19zc2UyX3NvdXJjZXMnOiBbCisgICAgICAnc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9kZWNfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2ZpbHRlcnNfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX3NzZTIuYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlcl9zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZ19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AveXV2X3NzZTIuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX25lb25fc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL2RlY19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvZmlsdGVyc19uZW9uLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyX25lb24uYycsCisgICAgICAnc3JjL2RzcC91cHNhbXBsaW5nX25lb24uYycsCisgICAgICAnc3JjL2RzcC95dXZfbmVvbi5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2RzcF9kZWNfbWlwc19kc3BfcjJfc291cmNlcyc6IFsKKyAgICAgICdzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9maWx0ZXJzX21pcHNfZHNwX3IyLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL3Vwc2FtcGxpbmdfbWlwc19kc3BfcjIuYycsCisgICAgICAnc3JjL2RzcC95dXZfbWlwc19kc3BfcjIuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX21pcHMzMl9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvZGVjX21pcHMzMi5jJywKKyAgICAgICdzcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5jJywKKyAgICAgICdzcmMvZHNwL3l1dl9taXBzMzIuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZGVjX21zYV9zb3VyY2VzJzogWworICAgICAgJ3NyYy9kc3AvZGVjX21zYS5jJywKKyAgICAgICdzcmMvZHNwL2ZpbHRlcnNfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvcmVzY2FsZXJfbXNhLmMnLAorICAgICAgJ3NyYy9kc3AvdXBzYW1wbGluZ19tc2EuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9kc3BfZW5jX3NvdXJjZXMnIDogWworICAgICAgJ3NyYy9kc3AvY29zdC5jJywKKyAgICAgICdzcmMvZHNwL2Nvc3RfbWlwczMyLmMnLAorICAgICAgJ3NyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2Nvc3Rfc3NlMi5jJywKKyAgICAgICdzcmMvZHNwL2VuYy5jJywKKyAgICAgICdzcmMvZHNwL2VuY19hdngyLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX21pcHMzMi5jJywKKyAgICAgICdzcmMvZHNwL2VuY19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2VuY19tc2EuYycsCisgICAgICAnc3JjL2RzcC9lbmNfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL2VuY19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvZW5jX3NzZTQxLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EuYycsCisgICAgICAnc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi5jJywKKyAgICAgICdzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMnLAorICAgICAgJ3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMnLAorICAgICAgJ3NyYy9kc3Avc3NpbS5jJywKKyAgICAgICdzcmMvZHNwL3NzaW1fc3NlMi5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2VuY19zb3VyY2VzJzogWworICAgICAgJ3NyYy9lbmMvYWxwaGFfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvYW5hbHlzaXNfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvY29uZmlnX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2Nvc3RfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvZmlsdGVyX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2ZyYW1lX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuYycsCisgICAgICAnc3JjL2VuYy9pdGVyYXRvcl9lbmMuYycsCisgICAgICAnc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3BpY3R1cmVfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvcGljdHVyZV9wc25yX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYycsCisgICAgICAnc3JjL2VuYy9waWN0dXJlX3Rvb2xzX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYycsCisgICAgICAnc3JjL2VuYy9xdWFudF9lbmMuYycsCisgICAgICAnc3JjL2VuYy9zeW50YXhfZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvdG9rZW5fZW5jLmMnLAorICAgICAgJ3NyYy9lbmMvdHJlZV9lbmMuYycsCisgICAgICAnc3JjL2VuYy92cDhsX2VuYy5jJywKKyAgICAgICdzcmMvZW5jL3dlYnBfZW5jLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfZm9ybWF0X2RlY19zb3VyY2VzJzogWworICAgICAgJ2ltYWdlaW8vaW1hZ2VfZGVjLmMnLAorICAgICAgJ2ltYWdlaW8vanBlZ2RlYy5jJywKKyAgICAgICdpbWFnZWlvL21ldGFkYXRhLmMnLAorICAgICAgJ2ltYWdlaW8vcG5nZGVjLmMnLAorICAgICAgJ2ltYWdlaW8vcG5tZGVjLmMnLAorICAgICAgJ2ltYWdlaW8vdGlmZmRlYy5jJywKKyAgICAgICdpbWFnZWlvL3dlYnBkZWMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF9mb3JtYXRfZW5jX3NvdXJjZXMnOiBbCisgICAgICAnaW1hZ2Vpby9pbWFnZV9lbmMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF91dGlsX3NvdXJjZXMnOiBbCisgICAgICAnZXhhbXBsZXMvZXhhbXBsZV91dGlsLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfaW1hZ2VfdXRpbF9zb3VyY2VzJzogWworICAgICAgJ2ltYWdlaW8vaW1hZ2Vpb191dGlsLmMnLAorICAgIF0sCisgICAgJ2xpYndlYnBfbXV4X3NvdXJjZXMnOiBbCisgICAgICAnc3JjL211eC9hbmltX2VuY29kZS5jJywKKyAgICAgICdzcmMvbXV4L211eGVkaXQuYycsCisgICAgICAnc3JjL211eC9tdXhpbnRlcm5hbC5jJywKKyAgICAgICdzcmMvbXV4L211eHJlYWQuYycsCisgICAgXSwKKyAgICAnbGlid2VicF91dGlsc19kZWNfc291cmNlcyc6IFsKKyAgICAgICdzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3JhbmRvbV91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3RocmVhZF91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvdXRpbHMuYycsCisgICAgXSwKKyAgICAnbGlid2VicF91dGlsc19lbmNfc291cmNlcyc6IFsKKyAgICAgICdzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5jJywKKyAgICAgICdzcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuYycsCisgICAgICAnc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5jJywKKyAgICBdLAorICAgICdsaWJ3ZWJwX2V4dHJhX3NvdXJjZXMnOiBbCisgICAgICAnZXh0cmFzL2V4dHJhcy5jJywKKyAgICAgICdleHRyYXMvcXVhbGl0eV9lc3RpbWF0ZS5jJywKKyAgICBdLAorICB9LAorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbTQvYXhfcHRocmVhZC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL200L2F4X3B0aHJlYWQubTQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM4M2FkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL200L2F4X3B0aHJlYWQubTQKQEAgLTAsMCArMSwzMzIgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYtYXJjaGl2ZS9heF9wdGhyZWFkLmh0bWwKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIFNZTk9QU0lTCisjCisjICAgQVhfUFRIUkVBRChbQUNUSU9OLUlGLUZPVU5EWywgQUNUSU9OLUlGLU5PVC1GT1VORF1dKQorIworIyBERVNDUklQVElPTgorIworIyAgIFRoaXMgbWFjcm8gZmlndXJlcyBvdXQgaG93IHRvIGJ1aWxkIEMgcHJvZ3JhbXMgdXNpbmcgUE9TSVggdGhyZWFkcy4gSXQKKyMgICBzZXRzIHRoZSBQVEhSRUFEX0xJQlMgb3V0cHV0IHZhcmlhYmxlIHRvIHRoZSB0aHJlYWRzIGxpYnJhcnkgYW5kIGxpbmtlcgorIyAgIGZsYWdzLCBhbmQgdGhlIFBUSFJFQURfQ0ZMQUdTIG91dHB1dCB2YXJpYWJsZSB0byBhbnkgc3BlY2lhbCBDIGNvbXBpbGVyCisjICAgZmxhZ3MgdGhhdCBhcmUgbmVlZGVkLiAoVGhlIHVzZXIgY2FuIGFsc28gZm9yY2UgY2VydGFpbiBjb21waWxlcgorIyAgIGZsYWdzL2xpYnMgdG8gYmUgdGVzdGVkIGJ5IHNldHRpbmcgdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzLikKKyMKKyMgICBBbHNvIHNldHMgUFRIUkVBRF9DQyB0byBhbnkgc3BlY2lhbCBDIGNvbXBpbGVyIHRoYXQgaXMgbmVlZGVkIGZvcgorIyAgIG11bHRpLXRocmVhZGVkIHByb2dyYW1zIChkZWZhdWx0cyB0byB0aGUgdmFsdWUgb2YgQ0Mgb3RoZXJ3aXNlKS4gKFRoaXMKKyMgICBpcyBuZWNlc3Nhcnkgb24gQUlYIHRvIHVzZSB0aGUgc3BlY2lhbCBjY19yIGNvbXBpbGVyIGFsaWFzLikKKyMKKyMgICBOT1RFOiBZb3UgYXJlIGFzc3VtZWQgdG8gbm90IG9ubHkgY29tcGlsZSB5b3VyIHByb2dyYW0gd2l0aCB0aGVzZSBmbGFncywKKyMgICBidXQgYWxzbyBsaW5rIGl0IHdpdGggdGhlbSBhcyB3ZWxsLiBlLmcuIHlvdSBzaG91bGQgbGluayB3aXRoCisjICAgJFBUSFJFQURfQ0MgJENGTEFHUyAkUFRIUkVBRF9DRkxBR1MgJExERkxBR1MgLi4uICRQVEhSRUFEX0xJQlMgJExJQlMKKyMKKyMgICBJZiB5b3UgYXJlIG9ubHkgYnVpbGRpbmcgdGhyZWFkcyBwcm9ncmFtcywgeW91IG1heSB3aXNoIHRvIHVzZSB0aGVzZQorIyAgIHZhcmlhYmxlcyBpbiB5b3VyIGRlZmF1bHQgTElCUywgQ0ZMQUdTLCBhbmQgQ0M6CisjCisjICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorIyAgICAgQ0ZMQUdTPSIkQ0ZMQUdTICRQVEhSRUFEX0NGTEFHUyIKKyMgICAgIENDPSIkUFRIUkVBRF9DQyIKKyMKKyMgICBJbiBhZGRpdGlvbiwgaWYgdGhlIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRocmVhZC1hdHRyaWJ1dGUgY29uc3RhbnQKKyMgICBoYXMgYSBub25zdGFuZGFyZCBuYW1lLCBkZWZpbmVzIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFIHRvIHRoYXQgbmFtZQorIyAgIChlLmcuIFBUSFJFQURfQ1JFQVRFX1VOREVUQUNIRUQgb24gQUlYKS4KKyMKKyMgICBBbHNvIEhBVkVfUFRIUkVBRF9QUklPX0lOSEVSSVQgaXMgZGVmaW5lZCBpZiBwdGhyZWFkIGlzIGZvdW5kIGFuZCB0aGUKKyMgICBQVEhSRUFEX1BSSU9fSU5IRVJJVCBzeW1ib2wgaXMgZGVmaW5lZCB3aGVuIGNvbXBpbGluZyB3aXRoCisjICAgUFRIUkVBRF9DRkxBR1MuCisjCisjICAgQUNUSU9OLUlGLUZPVU5EIGlzIGEgbGlzdCBvZiBzaGVsbCBjb21tYW5kcyB0byBydW4gaWYgYSB0aHJlYWRzIGxpYnJhcnkKKyMgICBpcyBmb3VuZCwgYW5kIEFDVElPTi1JRi1OT1QtRk9VTkQgaXMgYSBsaXN0IG9mIGNvbW1hbmRzIHRvIHJ1biBpdCBpZiBpdAorIyAgIGlzIG5vdCBmb3VuZC4gSWYgQUNUSU9OLUlGLUZPVU5EIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjdGlvbgorIyAgIHdpbGwgZGVmaW5lIEhBVkVfUFRIUkVBRC4KKyMKKyMgICBQbGVhc2UgbGV0IHRoZSBhdXRob3JzIGtub3cgaWYgdGhpcyBtYWNybyBmYWlscyBvbiBhbnkgcGxhdGZvcm0sIG9yIGlmCisjICAgeW91IGhhdmUgYW55IG90aGVyIHN1Z2dlc3Rpb25zIG9yIGNvbW1lbnRzLiBUaGlzIG1hY3JvIHdhcyBiYXNlZCBvbiB3b3JrCisjICAgYnkgU0dKIG9uIGF1dG9jb25mIHNjcmlwdHMgZm9yIEZGVFcgKGh0dHA6Ly93d3cuZmZ0dy5vcmcvKSAod2l0aCBoZWxwCisjICAgZnJvbSBNLiBGcmlnbyksIGFzIHdlbGwgYXMgYWNfcHRocmVhZCBhbmQgaGJfcHRocmVhZCBtYWNyb3MgcG9zdGVkIGJ5CisjICAgQWxlamFuZHJvIEZvcmVybyBDdWVydm8gdG8gdGhlIGF1dG9jb25mIG1hY3JvIHJlcG9zaXRvcnkuIFdlIGFyZSBhbHNvCisjICAgZ3JhdGVmdWwgZm9yIHRoZSBoZWxwZnVsIGZlZWRiYWNrIG9mIG51bWVyb3VzIHVzZXJzLgorIworIyAgIFVwZGF0ZWQgZm9yIEF1dG9jb25mIDIuNjggYnkgRGFuaWVsIFJpY2hhcmQgRy4KKyMKKyMgTElDRU5TRQorIworIyAgIENvcHlyaWdodCAoYykgMjAwOCBTdGV2ZW4gRy4gSm9obnNvbiA8c3RldmVuakBhbHVtLm1pdC5lZHU+CisjICAgQ29weXJpZ2h0IChjKSAyMDExIERhbmllbCBSaWNoYXJkIEcuIDxza3Vua0BpU0tVTksuT1JHPgorIworIyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisjICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorIyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorIyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwKKyMgICBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisjICAgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyMKKyMgICBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB0aGUgcmVzcGVjdGl2ZSBBdXRvY29uZiBNYWNybydzIGNvcHlyaWdodCBvd25lcgorIyAgIGdpdmVzIHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSB0aGUgY29uZmlndXJlCisjICAgc2NyaXB0cyB0aGF0IGFyZSB0aGUgb3V0cHV0IG9mIEF1dG9jb25mIHdoZW4gcHJvY2Vzc2luZyB0aGUgTWFjcm8uIFlvdQorIyAgIG5lZWQgbm90IGZvbGxvdyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHdoZW4gdXNpbmcKKyMgICBvciBkaXN0cmlidXRpbmcgc3VjaCBzY3JpcHRzLCBldmVuIHRob3VnaCBwb3J0aW9ucyBvZiB0aGUgdGV4dCBvZiB0aGUKKyMgICBNYWNybyBhcHBlYXIgaW4gdGhlbS4gVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIGRvZXMgZ292ZXJuCisjICAgYWxsIG90aGVyIHVzZSBvZiB0aGUgbWF0ZXJpYWwgdGhhdCBjb25zdGl0dXRlcyB0aGUgQXV0b2NvbmYgTWFjcm8uCisjCisjICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB0byB0aGUgR1BMIGFwcGxpZXMgdG8gdmVyc2lvbnMgb2YgdGhlIEF1dG9jb25mCisjICAgTWFjcm8gcmVsZWFzZWQgYnkgdGhlIEF1dG9jb25mIEFyY2hpdmUuIFdoZW4geW91IG1ha2UgYW5kIGRpc3RyaWJ1dGUgYQorIyAgIG1vZGlmaWVkIHZlcnNpb24gb2YgdGhlIEF1dG9jb25mIE1hY3JvLCB5b3UgbWF5IGV4dGVuZCB0aGlzIHNwZWNpYWwKKyMgICBleGNlcHRpb24gdG8gdGhlIEdQTCB0byBhcHBseSB0byB5b3VyIG1vZGlmaWVkIHZlcnNpb24gYXMgd2VsbC4KKworI3NlcmlhbCAyMQorCitBVV9BTElBUyhbQUNYX1BUSFJFQURdLCBbQVhfUFRIUkVBRF0pCitBQ19ERUZVTihbQVhfUFRIUkVBRF0sIFsKK0FDX1JFUVVJUkUoW0FDX0NBTk9OSUNBTF9IT1NUXSkKK0FDX0xBTkdfUFVTSChbQ10pCitheF9wdGhyZWFkX29rPW5vCisKKyMgV2UgdXNlZCB0byBjaGVjayBmb3IgcHRocmVhZC5oIGZpcnN0LCBidXQgdGhpcyBmYWlscyBpZiBwdGhyZWFkLmgKKyMgcmVxdWlyZXMgc3BlY2lhbCBjb21waWxlciBmbGFncyAoZS5nLiBvbiBUcnVlNjQgb3IgU2VxdWVudCkuCisjIEl0IGdldHMgY2hlY2tlZCBmb3IgaW4gdGhlIGxpbmsgdGVzdCBhbnl3YXkuCisKKyMgRmlyc3Qgb2YgYWxsLCBjaGVjayBpZiB0aGUgdXNlciBoYXMgc2V0IGFueSBvZiB0aGUgUFRIUkVBRF9MSUJTLAorIyBldGNldGVyYSBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGFuZCBpZiB0aHJlYWRzIGxpbmtpbmcgd29ya3MgdXNpbmcKKyMgdGhlbToKK2lmIHRlc3QgeCIkUFRIUkVBRF9MSUJTJFBUSFJFQURfQ0ZMQUdTIiAhPSB4OyB0aGVuCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorICAgICAgICBzYXZlX0xJQlM9IiRMSUJTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciBwdGhyZWFkX2pvaW4gaW4gTElCUz0kUFRIUkVBRF9MSUJTIHdpdGggQ0ZMQUdTPSRQVEhSRUFEX0NGTEFHU10pCisgICAgICAgIEFDX1RSWV9MSU5LX0ZVTkMoW3B0aHJlYWRfam9pbl0sIFtheF9wdGhyZWFkX29rPXllc10pCisgICAgICAgIEFDX01TR19SRVNVTFQoWyRheF9wdGhyZWFkX29rXSkKKyAgICAgICAgaWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorICAgICAgICAgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICAgICAgICAgIFBUSFJFQURfQ0ZMQUdTPSIiCisgICAgICAgIGZpCisgICAgICAgIExJQlM9IiRzYXZlX0xJQlMiCisgICAgICAgIENGTEFHUz0iJHNhdmVfQ0ZMQUdTIgorZmkKKworIyBXZSBtdXN0IGNoZWNrIGZvciB0aGUgdGhyZWFkcyBsaWJyYXJ5IHVuZGVyIGEgbnVtYmVyIG9mIGRpZmZlcmVudAorIyBuYW1lczsgdGhlIG9yZGVyaW5nIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2Ugc29tZSBzeXN0ZW1zCisjIChlLmcuIERFQykgaGF2ZSBib3RoIC1scHRocmVhZCBhbmQgLWxwdGhyZWFkcywgd2hlcmUgb25lIG9mIHRoZQorIyBsaWJyYXJpZXMgaXMgYnJva2VuIChub24tUE9TSVgpLgorCisjIENyZWF0ZSBhIGxpc3Qgb2YgdGhyZWFkIGZsYWdzIHRvIHRyeS4gIEl0ZW1zIHN0YXJ0aW5nIHdpdGggYSAiLSIgYXJlCisjIEMgY29tcGlsZXIgZmxhZ3MsIGFuZCBvdGhlciBpdGVtcyBhcmUgbGlicmFyeSBuYW1lcywgZXhjZXB0IGZvciAibm9uZSIKKyMgd2hpY2ggaW5kaWNhdGVzIHRoYXQgd2UgdHJ5IHdpdGhvdXQgYW55IGZsYWdzIGF0IGFsbCwgYW5kICJwdGhyZWFkLWNvbmZpZyIKKyMgd2hpY2ggaXMgYSBwcm9ncmFtIHJldHVybmluZyB0aGUgZmxhZ3MgZm9yIHRoZSBQdGggZW11bGF0aW9uIGxpYnJhcnkuCisKK2F4X3B0aHJlYWRfZmxhZ3M9InB0aHJlYWRzIG5vbmUgLUt0aHJlYWQgLWt0aHJlYWQgbHRocmVhZCAtcHRocmVhZCAtcHRocmVhZHMgLW10aHJlYWRzIHB0aHJlYWQgLS10aHJlYWQtc2FmZSAtbXQgcHRocmVhZC1jb25maWciCisKKyMgVGhlIG9yZGVyaW5nICppcyogKHNvbWV0aW1lcykgaW1wb3J0YW50LiAgU29tZSBub3RlcyBvbiB0aGUKKyMgaW5kaXZpZHVhbCBpdGVtcyBmb2xsb3c6CisKKyMgcHRocmVhZHM6IEFJWCAobXVzdCBjaGVjayB0aGlzIGJlZm9yZSAtbHB0aHJlYWQpCisjIG5vbmU6IGluIGNhc2UgdGhyZWFkcyBhcmUgaW4gbGliYzsgc2hvdWxkIGJlIHRyaWVkIGJlZm9yZSAtS3RocmVhZCBhbmQKKyMgICAgICAgb3RoZXIgY29tcGlsZXIgZmxhZ3MgdG8gcHJldmVudCBjb250aW51YWwgY29tcGlsZXIgd2FybmluZ3MKKyMgLUt0aHJlYWQ6IFNlcXVlbnQgKHRocmVhZHMgaW4gbGliYywgYnV0IC1LdGhyZWFkIG5lZWRlZCBmb3IgcHRocmVhZC5oKQorIyAta3RocmVhZDogRnJlZUJTRCBrZXJuZWwgdGhyZWFkcyAocHJlZmVycmVkIHRvIC1wdGhyZWFkIHNpbmNlIFNNUC1hYmxlKQorIyBsdGhyZWFkOiBMaW51eFRocmVhZHMgcG9ydCBvbiBGcmVlQlNEIChhbHNvIHByZWZlcnJlZCB0byAtcHRocmVhZCkKKyMgLXB0aHJlYWQ6IExpbnV4L2djYyAoa2VybmVsIHRocmVhZHMpLCBCU0QvZ2NjICh1c2VybGFuZCB0aHJlYWRzKQorIyAtcHRocmVhZHM6IFNvbGFyaXMvZ2NjCisjIC1tdGhyZWFkczogTWluZ3czMi9nY2MsIEx5bngvZ2NjCisjIC1tdDogU3VuIFdvcmtzaG9wIEMgKG1heSBvbmx5IGxpbmsgU3VuT1MgdGhyZWFkcyBbLWx0aHJlYWRdLCBidXQgaXQKKyMgICAgICBkb2Vzbid0IGh1cnQgdG8gY2hlY2sgc2luY2UgdGhpcyBzb21ldGltZXMgZGVmaW5lcyBwdGhyZWFkcyB0b287CisjICAgICAgYWxzbyBkZWZpbmVzIC1EX1JFRU5UUkFOVCkKKyMgICAgICAuLi4gLW10IGlzIGFsc28gdGhlIHB0aHJlYWRzIGZsYWcgZm9yIEhQL2FDQworIyBwdGhyZWFkOiBMaW51eCwgZXRjZXRlcmEKKyMgLS10aHJlYWQtc2FmZTogS0FJIEMrKworIyBwdGhyZWFkLWNvbmZpZzogdXNlIHB0aHJlYWQtY29uZmlnIHByb2dyYW0gKGZvciBHTlUgUHRoIGxpYnJhcnkpCisKK2Nhc2UgJHtob3N0X29zfSBpbgorICAgICAgICBzb2xhcmlzKikKKworICAgICAgICAjIE9uIFNvbGFyaXMgKGF0IGxlYXN0LCBmb3Igc29tZSB2ZXJzaW9ucyksIGxpYmMgY29udGFpbnMgc3R1YmJlZAorICAgICAgICAjIChub24tZnVuY3Rpb25hbCkgdmVyc2lvbnMgb2YgdGhlIHB0aHJlYWRzIHJvdXRpbmVzLCBzbyBsaW5rLWJhc2VkCisgICAgICAgICMgdGVzdHMgd2lsbCBlcnJvbmVvdXNseSBzdWNjZWVkLiAgKFdlIG5lZWQgdG8gbGluayB3aXRoIC1wdGhyZWFkcy8tbXQvCisgICAgICAgICMgLWxwdGhyZWFkLikgIChUaGUgc3R1YnMgYXJlIG1pc3NpbmcgcHRocmVhZF9jbGVhbnVwX3B1c2gsIG9yIHJhdGhlcgorICAgICAgICAjIGEgZnVuY3Rpb24gY2FsbGVkIGJ5IHRoaXMgbWFjcm8sIHNvIHdlIGNvdWxkIGNoZWNrIGZvciB0aGF0LCBidXQKKyAgICAgICAgIyB3aG8ga25vd3Mgd2hldGhlciB0aGV5J2xsIHN0dWIgdGhhdCB0b28gaW4gYSBmdXR1cmUgbGliYy4pICBTbywKKyAgICAgICAgIyB3ZSdsbCBqdXN0IGxvb2sgZm9yIC1wdGhyZWFkcyBhbmQgLWxwdGhyZWFkIGZpcnN0OgorCisgICAgICAgIGF4X3B0aHJlYWRfZmxhZ3M9Ii1wdGhyZWFkcyBwdGhyZWFkIC1tdCAtcHRocmVhZCAkYXhfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKKworICAgICAgICBkYXJ3aW4qKQorICAgICAgICBheF9wdGhyZWFkX2ZsYWdzPSItcHRocmVhZCAkYXhfcHRocmVhZF9mbGFncyIKKyAgICAgICAgOzsKK2VzYWMKKworIyBDbGFuZyBkb2Vzbid0IGNvbnNpZGVyIHVucmVjb2duaXplZCBvcHRpb25zIGFuIGVycm9yIHVubGVzcyB3ZSBzcGVjaWZ5CisjIC1XZXJyb3IuIFdlIHRocm93IGluIHNvbWUgZXh0cmEgQ2xhbmctc3BlY2lmaWMgb3B0aW9ucyB0byBlbnN1cmUgdGhhdAorIyB0aGlzIGRvZXNuJ3QgaGFwcGVuIGZvciBHQ0MsIHdoaWNoIGFsc28gYWNjZXB0cyAtV2Vycm9yLgorCitBQ19NU0dfQ0hFQ0tJTkcoW2lmIGNvbXBpbGVyIG5lZWRzIC1XZXJyb3IgdG8gcmVqZWN0IHVua25vd24gZmxhZ3NdKQorc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCitheF9wdGhyZWFkX2V4dHJhX2ZsYWdzPSItV2Vycm9yIgorQ0ZMQUdTPSIkQ0ZMQUdTICRheF9wdGhyZWFkX2V4dHJhX2ZsYWdzIC1XdW5rbm93bi13YXJuaW5nLW9wdGlvbiAtV3NpemVvZi1hcnJheS1hcmd1bWVudCIKK0FDX0NPTVBJTEVfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oW2ludCBmb28odm9pZCk7XSxbZm9vKCldKV0sCisgICAgICAgICAgICAgICAgICBbQUNfTVNHX1JFU1VMVChbeWVzXSldLAorICAgICAgICAgICAgICAgICAgW2F4X3B0aHJlYWRfZXh0cmFfZmxhZ3M9CisgICAgICAgICAgICAgICAgICAgQUNfTVNHX1JFU1VMVChbbm9dKV0pCitDRkxBR1M9IiRzYXZlX0NGTEFHUyIKKworaWYgdGVzdCB4IiRheF9wdGhyZWFkX29rIiA9IHhubzsgdGhlbgorZm9yIGZsYWcgaW4gJGF4X3B0aHJlYWRfZmxhZ3M7IGRvCisKKyAgICAgICAgY2FzZSAkZmxhZyBpbgorICAgICAgICAgICAgICAgIG5vbmUpCisgICAgICAgICAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFt3aGV0aGVyIHB0aHJlYWRzIHdvcmsgd2l0aG91dCBhbnkgZmxhZ3NdKQorICAgICAgICAgICAgICAgIDs7CisKKyAgICAgICAgICAgICAgICAtKikKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW3doZXRoZXIgcHRocmVhZHMgd29yayB3aXRoICRmbGFnXSkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0NGTEFHUz0iJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKworICAgICAgICAgICAgICAgIHB0aHJlYWQtY29uZmlnKQorICAgICAgICAgICAgICAgIEFDX0NIRUNLX1BST0coW2F4X3B0aHJlYWRfY29uZmlnXSwgW3B0aHJlYWQtY29uZmlnXSwgW3llc10sIFtub10pCisgICAgICAgICAgICAgICAgaWYgdGVzdCB4IiRheF9wdGhyZWFkX2NvbmZpZyIgPSB4bm87IHRoZW4gY29udGludWU7IGZpCisgICAgICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9ImBwdGhyZWFkLWNvbmZpZyAtLWNmbGFnc2AiCisgICAgICAgICAgICAgICAgUFRIUkVBRF9MSUJTPSJgcHRocmVhZC1jb25maWcgLS1sZGZsYWdzYCBgcHRocmVhZC1jb25maWcgLS1saWJzYCIKKyAgICAgICAgICAgICAgICA7OworCisgICAgICAgICAgICAgICAgKikKKyAgICAgICAgICAgICAgICBBQ19NU0dfQ0hFQ0tJTkcoW2ZvciB0aGUgcHRocmVhZHMgbGlicmFyeSAtbCRmbGFnXSkKKyAgICAgICAgICAgICAgICBQVEhSRUFEX0xJQlM9Ii1sJGZsYWciCisgICAgICAgICAgICAgICAgOzsKKyAgICAgICAgZXNhYworCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBMSUJTPSIkUFRIUkVBRF9MSUJTICRMSUJTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTICRheF9wdGhyZWFkX2V4dHJhX2ZsYWdzIgorCisgICAgICAgICMgQ2hlY2sgZm9yIHZhcmlvdXMgZnVuY3Rpb25zLiAgV2UgbXVzdCBpbmNsdWRlIHB0aHJlYWQuaCwKKyAgICAgICAgIyBzaW5jZSBzb21lIGZ1bmN0aW9ucyBtYXkgYmUgbWFjcm9zLiAgKE9uIHRoZSBTZXF1ZW50LCB3ZQorICAgICAgICAjIG5lZWQgYSBzcGVjaWFsIGZsYWcgLUt0aHJlYWQgdG8gbWFrZSB0aGlzIGhlYWRlciBjb21waWxlLikKKyAgICAgICAgIyBXZSBjaGVjayBmb3IgcHRocmVhZF9qb2luIGJlY2F1c2UgaXQgaXMgaW4gLWxwdGhyZWFkIG9uIElSSVgKKyAgICAgICAgIyB3aGlsZSBwdGhyZWFkX2NyZWF0ZSBpcyBpbiBsaWJjLiAgV2UgY2hlY2sgZm9yIHB0aHJlYWRfYXR0cl9pbml0CisgICAgICAgICMgZHVlIHRvIERFQyBjcmF6aW5lc3Mgd2l0aCAtbHB0aHJlYWRzLiAgV2UgY2hlY2sgZm9yCisgICAgICAgICMgcHRocmVhZF9jbGVhbnVwX3B1c2ggYmVjYXVzZSBpdCBpcyBvbmUgb2YgdGhlIGZldyBwdGhyZWFkCisgICAgICAgICMgZnVuY3Rpb25zIG9uIFNvbGFyaXMgdGhhdCBkb2Vzbid0IGhhdmUgYSBub24tZnVuY3Rpb25hbCBsaWJjIHN0dWIuCisgICAgICAgICMgV2UgdHJ5IHB0aHJlYWRfY3JlYXRlIG9uIGdlbmVyYWwgcHJpbmNpcGxlcy4KKyAgICAgICAgQUNfTElOS19JRkVMU0UoW0FDX0xBTkdfUFJPR1JBTShbI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIHJvdXRpbmUodm9pZCAqYSkgeyBhID0gMDsgfQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIHZvaWQgKnN0YXJ0X3JvdXRpbmUodm9pZCAqYSkgeyByZXR1cm4gYTsgfV0sCisgICAgICAgICAgICAgICAgICAgICAgIFtwdGhyZWFkX3QgdGg7IHB0aHJlYWRfYXR0cl90IGF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX2NyZWF0ZSgmdGgsIDAsIHN0YXJ0X3JvdXRpbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9qb2luKHRoLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0aHJlYWRfY2xlYW51cF9wdXNoKHJvdXRpbmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcHRocmVhZF9jbGVhbnVwX3BvcCgwKSAvKiA7ICovXSldLAorICAgICAgICAgICAgICAgIFtheF9wdGhyZWFkX29rPXllc10sCisgICAgICAgICAgICAgICAgW10pCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJGF4X3B0aHJlYWRfb2tdKQorICAgICAgICBpZiB0ZXN0ICJ4JGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaQorCisgICAgICAgIFBUSFJFQURfTElCUz0iIgorICAgICAgICBQVEhSRUFEX0NGTEFHUz0iIgorZG9uZQorZmkKKworIyBWYXJpb3VzIG90aGVyIGNoZWNrczoKK2lmIHRlc3QgIngkYXhfcHRocmVhZF9vayIgPSB4eWVzOyB0aGVuCisgICAgICAgIHNhdmVfTElCUz0iJExJQlMiCisgICAgICAgIExJQlM9IiRQVEhSRUFEX0xJQlMgJExJQlMiCisgICAgICAgIHNhdmVfQ0ZMQUdTPSIkQ0ZMQUdTIgorICAgICAgICBDRkxBR1M9IiRDRkxBR1MgJFBUSFJFQURfQ0ZMQUdTIgorCisgICAgICAgICMgRGV0ZWN0IEFJWCBsb3NzYWdlOiBKT0lOQUJMRSBhdHRyaWJ1dGUgaXMgY2FsbGVkIFVOREVUQUNIRUQuCisgICAgICAgIEFDX01TR19DSEVDS0lORyhbZm9yIGpvaW5hYmxlIHB0aHJlYWQgYXR0cmlidXRlXSkKKyAgICAgICAgYXR0cl9uYW1lPXVua25vd24KKyAgICAgICAgZm9yIGF0dHIgaW4gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEUgUFRIUkVBRF9DUkVBVEVfVU5ERVRBQ0hFRDsgZG8KKyAgICAgICAgICAgIEFDX0xJTktfSUZFTFNFKFtBQ19MQU5HX1BST0dSQU0oWyNpbmNsdWRlIDxwdGhyZWFkLmg+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbnQgYXR0ciA9ICRhdHRyOyByZXR1cm4gYXR0ciAvKiA7ICovXSldLAorICAgICAgICAgICAgICAgIFthdHRyX25hbWU9JGF0dHI7IGJyZWFrXSwKKyAgICAgICAgICAgICAgICBbXSkKKyAgICAgICAgZG9uZQorICAgICAgICBBQ19NU0dfUkVTVUxUKFskYXR0cl9uYW1lXSkKKyAgICAgICAgaWYgdGVzdCAiJGF0dHJfbmFtZSIgIT0gUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEU7IHRoZW4KKyAgICAgICAgICAgIEFDX0RFRklORV9VTlFVT1RFRChbUFRIUkVBRF9DUkVBVEVfSk9JTkFCTEVdLCBbJGF0dHJfbmFtZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0RlZmluZSB0byBuZWNlc3Nhcnkgc3ltYm9sIGlmIHRoaXMgY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcyBhIG5vbi1zdGFuZGFyZCBuYW1lIG9uIHlvdXIgc3lzdGVtLl0pCisgICAgICAgIGZpCisKKyAgICAgICAgQUNfTVNHX0NIRUNLSU5HKFtpZiBtb3JlIHNwZWNpYWwgZmxhZ3MgYXJlIHJlcXVpcmVkIGZvciBwdGhyZWFkc10pCisgICAgICAgIGZsYWc9bm8KKyAgICAgICAgY2FzZSAke2hvc3Rfb3N9IGluCisgICAgICAgICAgICBhaXgqIHwgZnJlZWJzZCogfCBkYXJ3aW4qKSBmbGFnPSItRF9USFJFQURfU0FGRSI7OworICAgICAgICAgICAgb3NmKiB8IGhwdXgqKSBmbGFnPSItRF9SRUVOVFJBTlQiOzsKKyAgICAgICAgICAgIHNvbGFyaXMqKQorICAgICAgICAgICAgaWYgdGVzdCAiJEdDQyIgPSAieWVzIjsgdGhlbgorICAgICAgICAgICAgICAgIGZsYWc9Ii1EX1JFRU5UUkFOVCIKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAjIFRPRE86IFdoYXQgYWJvdXQgQ2xhbmcgb24gU29sYXJpcz8KKyAgICAgICAgICAgICAgICBmbGFnPSItbXQgLURfUkVFTlRSQU5UIgorICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIDs7CisgICAgICAgIGVzYWMKKyAgICAgICAgQUNfTVNHX1JFU1VMVChbJGZsYWddKQorICAgICAgICBpZiB0ZXN0ICJ4JGZsYWciICE9IHhubzsgdGhlbgorICAgICAgICAgICAgUFRIUkVBRF9DRkxBR1M9IiRmbGFnICRQVEhSRUFEX0NGTEFHUyIKKyAgICAgICAgZmkKKworICAgICAgICBBQ19DQUNIRV9DSEVDSyhbZm9yIFBUSFJFQURfUFJJT19JTkhFUklUXSwKKyAgICAgICAgICAgIFtheF9jdl9QVEhSRUFEX1BSSU9fSU5IRVJJVF0sIFsKKyAgICAgICAgICAgICAgICBBQ19MSU5LX0lGRUxTRShbQUNfTEFOR19QUk9HUkFNKFtbI2luY2x1ZGUgPHB0aHJlYWQuaD5dXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbaW50IGkgPSBQVEhSRUFEX1BSSU9fSU5IRVJJVDtdXSldLAorICAgICAgICAgICAgICAgICAgICBbYXhfY3ZfUFRIUkVBRF9QUklPX0lOSEVSSVQ9eWVzXSwKKyAgICAgICAgICAgICAgICAgICAgW2F4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUPW5vXSkKKyAgICAgICAgICAgIF0pCisgICAgICAgIEFTX0lGKFt0ZXN0ICJ4JGF4X2N2X1BUSFJFQURfUFJJT19JTkhFUklUIiA9ICJ4eWVzIl0sCisgICAgICAgICAgICBbQUNfREVGSU5FKFtIQVZFX1BUSFJFQURfUFJJT19JTkhFUklUXSwgWzFdLCBbSGF2ZSBQVEhSRUFEX1BSSU9fSU5IRVJJVC5dKV0pCisKKyAgICAgICAgTElCUz0iJHNhdmVfTElCUyIKKyAgICAgICAgQ0ZMQUdTPSIkc2F2ZV9DRkxBR1MiCisKKyAgICAgICAgIyBNb3JlIEFJWCBsb3NzYWdlOiBjb21waWxlIHdpdGggKl9yIHZhcmlhbnQKKyAgICAgICAgaWYgdGVzdCAieCRHQ0MiICE9IHh5ZXM7IHRoZW4KKyAgICAgICAgICAgIGNhc2UgJGhvc3Rfb3MgaW4KKyAgICAgICAgICAgICAgICBhaXgqKQorICAgICAgICAgICAgICAgIEFTX0NBU0UoWyJ4LyRDQyJdLAorICAgICAgICAgICAgICAgICAgW3gqL2M4OXx4Ki9jODlfMTI4fHgqL2M5OXx4Ki9jOTlfMTI4fHgqL2NjfHgqL2NjMTI4fHgqL3hsY3x4Ki94bGNfdjZ8eCoveGxjMTI4fHgqL3hsYzEyOF92Nl0sCisgICAgICAgICAgICAgICAgICBbI2hhbmRsZSBhYnNvbHV0ZSBwYXRoIGRpZmZlcmVudGx5IGZyb20gUEFUSCBiYXNlZCBwcm9ncmFtIGxvb2t1cAorICAgICAgICAgICAgICAgICAgIEFTX0NBU0UoWyJ4JENDIl0sCisgICAgICAgICAgICAgICAgICAgICBbeC8qXSwKKyAgICAgICAgICAgICAgICAgICAgIFtBU19JRihbQVNfRVhFQ1VUQUJMRV9QKFske0NDfV9yXSldLFtQVEhSRUFEX0NDPSIke0NDfV9yIl0pXSwKKyAgICAgICAgICAgICAgICAgICAgIFtBQ19DSEVDS19QUk9HUyhbUFRIUkVBRF9DQ10sWyR7Q0N9X3JdLFskQ0NdKV0pXSkKKyAgICAgICAgICAgICAgICA7OworICAgICAgICAgICAgZXNhYworICAgICAgICBmaQorZmkKKwordGVzdCAtbiAiJFBUSFJFQURfQ0MiIHx8IFBUSFJFQURfQ0M9IiRDQyIKKworQUNfU1VCU1QoW1BUSFJFQURfTElCU10pCitBQ19TVUJTVChbUFRIUkVBRF9DRkxBR1NdKQorQUNfU1VCU1QoW1BUSFJFQURfQ0NdKQorCisjIEZpbmFsbHksIGV4ZWN1dGUgQUNUSU9OLUlGLUZPVU5EL0FDVElPTi1JRi1OT1QtRk9VTkQ6CitpZiB0ZXN0IHgiJGF4X3B0aHJlYWRfb2siID0geHllczsgdGhlbgorICAgICAgICBpZmVsc2UoWyQxXSwsW0FDX0RFRklORShbSEFWRV9QVEhSRUFEXSxbMV0sW0RlZmluZSBpZiB5b3UgaGF2ZSBQT1NJWCB0aHJlYWRzIGxpYnJhcmllcyBhbmQgaGVhZGVyIGZpbGVzLl0pXSxbJDFdKQorICAgICAgICA6CitlbHNlCisgICAgICAgIGF4X3B0aHJlYWRfb2s9bm8KKyAgICAgICAgJDIKK2ZpCitBQ19MQU5HX1BPUAorXSlkbmwgQVhfUFRIUkVBRApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFrZWZpbGUudW5peCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21ha2VmaWxlLnVuaXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MwMDM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21ha2VmaWxlLnVuaXgKQEAgLTAsMCArMSw1MDIgQEAKKyMgVGhpcyBtYWtlZmlsZSBpcyBhIHNpbXBsZXIgYWx0ZXJuYXRpdmUgdG8gdGhlIGF1dG9jb25mLWJhc2VkIGJ1aWxkCisjIHN5c3RlbSwgZm9yIHNpbXBsZSBsb2NhbCBidWlsZGluZyBvZiB0aGUgbGlicmFyaWVzIGFuZCB0b29scy4KKyMgSXQgd2lsbCBub3QgaW5zdGFsbCB0aGUgbGlicmFyaWVzIHN5c3RlbS13aWRlLCBidXQganVzdCBjcmVhdGUgdGhlICdjd2VicCcKKyMgYW5kICdkd2VicCcgdG9vbHMgaW4gdGhlIGV4YW1wbGVzLyBkaXJlY3RvcnksIGFsb25nIHdpdGggdGhlIHN0YXRpYworIyBsaWJyYXJpZXMgJ3NyYy9saWJ3ZWJwLmEnLCAnc3JjL2xpYndlYnBkZWNvZGVyLmEnLCAnc3JjL211eC9saWJ3ZWJwbXV4LmEnLAorIyAnc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hJyBhbmQgJ2V4dHJhcy9saWJ3ZWJwZXh0cmFzLmEnLgorIworIyBUbyBidWlsZCB0aGUgbGlicmFyeSBhbmQgZXhhbXBsZXMsIHVzZToKKyMgICAgbWFrZSAtZiBtYWtlZmlsZS51bml4CisjIGZyb20gdGhpcyB0b3AgZGlyZWN0b3J5LgorCisjIyMjIEN1c3RvbWl6YWJsZSBwYXJ0ICMjIyMKKworIyBUaGVzZSBmbGFncyBhc3N1bWUgeW91IGhhdmUgbGlicG5nLCBsaWJqcGVnLCBsaWJ0aWZmIGFuZCBsaWJnaWYgaW5zdGFsbGVkLiBJZgorIyBub3QsIGVpdGhlciBmb2xsb3cgdGhlIGluc3RhbGwgaW5zdHJ1Y3Rpb25zIGJlbG93IG9yIGp1c3QgY29tbWVudCBvdXQgdGhlIG5leHQKKyMgZm91ciBsaW5lcy4KK0VYVFJBX0ZMQUdTPSAtRFdFQlBfSEFWRV9QTkcgLURXRUJQX0hBVkVfSlBFRyAtRFdFQlBfSEFWRV9USUZGCitEV0VCUF9MSUJTPSAtbHBuZyAtbHoKK0NXRUJQX0xJQlM9ICQoRFdFQlBfTElCUykgLWxqcGVnIC1sdGlmZgorR0lGX0xJQlMgPSAtbGdpZgorCitpZmVxICgkKHN0cmlwICQoc2hlbGwgdW5hbWUpKSwgRGFyd2luKQorICAjIFdvcmsgYXJvdW5kIGEgcHJvYmxlbSBsaW5raW5nIHRhYmxlcyBtYXJrZWQgYXMgY29tbW9uIHN5bWJvbHMsCisgICMgY2YuLCBzcmMvZW5jL3l1di5baGNdCisgICMgRmFpbHVyZSBvYnNlcnZlZCB3aXRoOiBnY2MgNC4yLjEgYW5kIDQuMC4xLgorICBFWFRSQV9GTEFHUyArPSAtZm5vLWNvbW1vbgorICBFWFRSQV9GTEFHUyArPSAtREhBVkVfR0xVVF9HTFVUX0gKKyAgRVhUUkFfRkxBR1MgKz0gLVduby1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucworICBFWFRSQV9GTEFHUyArPSAtSS9vcHQvbG9jYWwvaW5jbHVkZQorICBFWFRSQV9MSUJTICArPSAtTC9vcHQvbG9jYWwvbGliCisgIEdMX0xJQlMgPSAtZnJhbWV3b3JrIEdMVVQgLWZyYW1ld29yayBPcGVuR0wKK2Vsc2UKKyAgRVhUUkFfRkxBR1MgKz0gLUkvdXNyL2xvY2FsL2luY2x1ZGUKKyAgRVhUUkFfTElCUyAgKz0gLUwvdXNyL2xvY2FsL2xpYgorICBHTF9MSUJTID0gLWxnbHV0IC1sR0wKK2VuZGlmCisKKyMgU0RMIGZsYWdzOiB1c2Ugc2RsLWNvbmZpZyBpZiBpdCBleGlzdHMKK1NETF9DT05GSUcgPSAkKHNoZWxsIHNkbC1jb25maWcgLS12ZXJzaW9uIDI+IC9kZXYvbnVsbCkKK2lmbmVxICgkKFNETF9DT05GSUcpLCkKKyAgU0RMX0xJQlMgPSAkKHNoZWxsIHNkbC1jb25maWcgLS1saWJzKQorICBTRExfRkxBR1MgPSAkKHNoZWxsIHNkbC1jb25maWcgLS1jZmxhZ3MpCitlbHNlCisgICMgdXNlIGJlc3QtZ3Vlc3MKKyAgU0RMX0xJQlMgPSAtbFNETAorICBTRExfRkxBR1MgPQorZW5kaWYKKworIyBUbyBpbnN0YWxsIGxpYnJhcmllcyBvbiBNYWMgT1MgWDoKKyMgMS4gSW5zdGFsbCBNYWNQb3J0cyAoaHR0cDovL3d3dy5tYWNwb3J0cy5vcmcvaW5zdGFsbC5waHApCisjIDIuIFJ1biAic3VkbyBwb3J0IGluc3RhbGwganBlZyIKKyMgMy4gUnVuICJzdWRvIHBvcnQgaW5zdGFsbCBsaWJwbmciCisjIDQuIFJ1biAic3VkbyBwb3J0IGluc3RhbGwgdGlmZiIKKyMgNS4gUnVuICJzdWRvIHBvcnQgaW5zdGFsbCBnaWZsaWIiCisKKyMgVG8gaW5zdGFsbCBsaWJyYXJpZXMgb24gTGludXg6CisjIDEuIFJ1biAic3VkbyBhcHQtZ2V0IGluc3RhbGwgbGlianBlZzYyLWRldiIKKyMgMi4gUnVuICJzdWRvIGFwdC1nZXQgaW5zdGFsbCBsaWJwbmcxMi1kZXYiCisjIDMuIFJ1biAic3VkbyBhcHQtZ2V0IGluc3RhbGwgbGlidGlmZjQtZGV2IgorIyA0LiBSdW4gInN1ZG8gYXB0LWdldCBpbnN0YWxsIGxpYmdpZi1kZXYiCisKKyMgVW5jb21tZW50IGZvciBidWlsZCBmb3IgMzJiaXQgcGxhdGZvcm0KKyMgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBqdXN0IHVzZSB0aGUgY29tbWFuZAorIyAnbWFrZSAtZiBtYWtlZmlsZS51bml4IEVYVFJBX0ZMQUdTPS1tMzInIHRvIHRoYXQgZWZmZWN0LgorIyBFWFRSQV9GTEFHUyArPSAtbTMyCisKKyMgRXh0cmEgZmxhZ3MgdG8gZW5hYmxlIGJ5dGUgc3dhcCBmb3IgMTYgYml0IGNvbG9yc3BhY2VzLgorIyBFWFRSQV9GTEFHUyArPSAtRFdFQlBfU1dBUF8xNkJJVF9DU1A9MQorCisjIEV4dHJhIGZsYWdzIHRvIGVuYWJsZSBtdWx0aS10aHJlYWRpbmcKK0VYVFJBX0ZMQUdTICs9IC1EV0VCUF9VU0VfVEhSRUFECitFWFRSQV9MSUJTICs9IC1scHRocmVhZAorCisjIENvbnRyb2wgc3ltYm9sIHZpc2liaWxpdHkuIENvbW1lbnQgb3V0IGlmIHlvdXIgY29tcGlsZXIgZG9lc24ndCBzdXBwb3J0IGl0LgorRVhUUkFfRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorCisjIEV4dHJhIGZsYWdzIHRvIGVtdWxhdGUgQzg5IHN0cmljdG5lc3Mgd2l0aCB0aGUgZnVsbCBBTlNJCitFWFRSQV9GTEFHUyArPSAtV2V4dHJhIC1Xb2xkLXN0eWxlLWRlZmluaXRpb24KK0VYVFJBX0ZMQUdTICs9IC1XbWlzc2luZy1wcm90b3R5cGVzCitFWFRSQV9GTEFHUyArPSAtV21pc3NpbmctZGVjbGFyYXRpb25zCitFWFRSQV9GTEFHUyArPSAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudAorRVhUUkFfRkxBR1MgKz0gLVdzaGFkb3cKK0VYVFJBX0ZMQUdTICs9IC1XZm9ybWF0LXNlY3VyaXR5IC1XZm9ybWF0LW5vbmxpdGVyYWwKKyMgRVhUUkFfRkxBR1MgKz0gLVd2bGEKKworIyBTU0U0LjEtc3BlY2lmaWMgZmxhZ3M6CitpZmVxICgkKEhBVkVfU1NFNDEpLCAxKQorRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfU1NFNDEKK3NyYy9kc3AvJV9zc2U0MS5vOiBFWFRSQV9GTEFHUyArPSAtbXNzZTQuMQorZW5kaWYKKworIyBBVlgyLXNwZWNpZmljIGZsYWdzOgoraWZlcSAoJChIQVZFX0FWWDIpLCAxKQorRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfQVZYMgorc3JjL2RzcC8lX2F2eDIubzogRVhUUkFfRkxBR1MgKz0gLW1hdngyCitlbmRpZgorCisjIE5FT04tc3BlY2lmaWMgZmxhZ3M6CisjIEVYVFJBX0ZMQUdTICs9IC1tYXJjaD1hcm12Ny1hIC1tZmxvYXQtYWJpPWhhcmQgLW1mcHU9bmVvbiAtbXR1bmU9Y29ydGV4LWE4CisjIC0+IHNlZW1zIHRvIG1ha2UgdGhlIG92ZXJhbGwgbGliIHNsb3dlcjogLWZuby1zcGxpdC13aWRlLXR5cGVzCisKKyMgTUlQUyAoTVNBKSAzMi1iaXQgYnVpbGQgc3BlY2lmaWMgZmxhZ3MgZm9yIG1pcHMzMnI1IChwNTYwMCk6CisjIEVYVFJBX0ZMQUdTICs9IC1taXBzMzJyNSAtbWFiaT0zMiAtbXR1bmU9cDU2MDAgLW1tc2EgLW1mcDY0CisjIEVYVFJBX0ZMQUdTICs9IC1tc2NoZWQtd2VpZ2h0IC1tbG9hZC1zdG9yZS1wYWlycworCisjIE1JUFMgKE1TQSkgNjQtYml0IGJ1aWxkIHNwZWNpZmljIGZsYWdzIGZvciBtaXBzNjRyNiAoaTY0MDApOgorIyBFWFRSQV9GTEFHUyArPSAtbWlwczY0cjYgLW1hYmk9NjQgLW10dW5lPWk2NDAwIC1tbXNhIC1tZnA2NAorIyBFWFRSQV9GTEFHUyArPSAtbXNjaGVkLXdlaWdodCAtbWxvYWQtc3RvcmUtcGFpcnMKKworIyMjIyBOb3RoaW5nIHNob3VsZCBub3JtYWxseSBiZSBjaGFuZ2VkIGJlbG93IHRoaXMgbGluZSAjIyMjCisKK0FSID0gYXIKK0FSRkxBR1MgPSByCitDUFBGTEFHUyA9IC1JLiAtSXNyYy8gLVdhbGwKK2lmZXEgKCQoREVCVUcpLCAxKQorICBDRkxBR1MgPSAtZworZWxzZQorICBDRkxBR1MgPSAtTzMgLUROREVCVUcKK2VuZGlmCitDRkxBR1MgKz0gJChFWFRSQV9GTEFHUykKK0NDID0gZ2NjCitJTlNUQUxMID0gaW5zdGFsbAorR1JPRkYgPSAvdXNyL2Jpbi9ncm9mZgorQ09MID0gL3Vzci9iaW4vY29sCitMREZMQUdTID0gJChFWFRSQV9MSUJTKSAkKEVYVFJBX0ZMQUdTKSAtbG0KKworQU5JTV9VVElMX09CSlMgPSBcCisgICAgZXhhbXBsZXMvYW5pbV91dGlsLm8gXAorCitERUNfT0JKUyA9IFwKKyAgICBzcmMvZGVjL2FscGhhX2RlYy5vIFwKKyAgICBzcmMvZGVjL2J1ZmZlcl9kZWMubyBcCisgICAgc3JjL2RlYy9mcmFtZV9kZWMubyBcCisgICAgc3JjL2RlYy9pZGVjX2RlYy5vIFwKKyAgICBzcmMvZGVjL2lvX2RlYy5vIFwKKyAgICBzcmMvZGVjL3F1YW50X2RlYy5vIFwKKyAgICBzcmMvZGVjL3RyZWVfZGVjLm8gXAorICAgIHNyYy9kZWMvdnA4X2RlYy5vIFwKKyAgICBzcmMvZGVjL3ZwOGxfZGVjLm8gXAorICAgIHNyYy9kZWMvd2VicF9kZWMubyBcCisKK0RFTVVYX09CSlMgPSBcCisgICAgc3JjL2RlbXV4L2FuaW1fZGVjb2RlLm8gXAorICAgIHNyYy9kZW11eC9kZW11eC5vIFwKKworRFNQX0RFQ19PQkpTID0gXAorICAgIHNyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZy5vIFwKKyAgICBzcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX25lb24ubyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIubyBcCisgICAgc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLm8gXAorICAgIHNyYy9kc3AvY3B1Lm8gXAorICAgIHNyYy9kc3AvZGVjLm8gXAorICAgIHNyYy9kc3AvZGVjX2NsaXBfdGFibGVzLm8gXAorICAgIHNyYy9kc3AvZGVjX21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL2RlY19taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL2RlY19tc2EubyBcCisgICAgc3JjL2RzcC9kZWNfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2RlY19zc2UyLm8gXAorICAgIHNyYy9kc3AvZGVjX3NzZTQxLm8gXAorICAgIHNyYy9kc3AvZmlsdGVycy5vIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9maWx0ZXJzX21zYS5vIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfbmVvbi5vIFwKKyAgICBzcmMvZHNwL2ZpbHRlcnNfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19tc2EubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19uZW9uLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3Nfc3NlMi5vIFwKKyAgICBzcmMvZHNwL3Jlc2NhbGVyLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbWlwczMyLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9tc2EubyBcCisgICAgc3JjL2RzcC9yZXNjYWxlcl9uZW9uLm8gXAorICAgIHNyYy9kc3AvcmVzY2FsZXJfc3NlMi5vIFwKKyAgICBzcmMvZHNwL3Vwc2FtcGxpbmcubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLm8gXAorICAgIHNyYy9kc3AvdXBzYW1wbGluZ19tc2EubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX25lb24ubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX3NzZTIubyBcCisgICAgc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLm8gXAorICAgIHNyYy9kc3AveXV2Lm8gXAorICAgIHNyYy9kc3AveXV2X21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL3l1dl9taXBzX2RzcF9yMi5vIFwKKyAgICBzcmMvZHNwL3l1dl9uZW9uLm8gXAorICAgIHNyYy9kc3AveXV2X3NzZTIubyBcCisgICAgc3JjL2RzcC95dXZfc3NlNDEubyBcCisKK0RTUF9FTkNfT0JKUyA9IFwKKyAgICBzcmMvZHNwL2Nvc3QubyBcCisgICAgc3JjL2RzcC9jb3N0X21pcHMzMi5vIFwKKyAgICBzcmMvZHNwL2Nvc3RfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9jb3N0X3NzZTIubyBcCisgICAgc3JjL2RzcC9lbmMubyBcCisgICAgc3JjL2RzcC9lbmNfYXZ4Mi5vIFwKKyAgICBzcmMvZHNwL2VuY19taXBzMzIubyBcCisgICAgc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9lbmNfbXNhLm8gXAorICAgIHNyYy9kc3AvZW5jX25lb24ubyBcCisgICAgc3JjL2RzcC9lbmNfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2VuY19zc2U0MS5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuYy5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbWlwc19kc3BfcjIubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfbXNhLm8gXAorICAgIHNyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24ubyBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlMi5vIFwKKyAgICBzcmMvZHNwL2xvc3NsZXNzX2VuY19zc2U0MS5vIFwKKyAgICBzcmMvZHNwL3NzaW0ubyBcCisgICAgc3JjL2RzcC9zc2ltX3NzZTIubyBcCisKK0VOQ19PQkpTID0gXAorICAgIHNyYy9lbmMvYWxwaGFfZW5jLm8gXAorICAgIHNyYy9lbmMvYW5hbHlzaXNfZW5jLm8gXAorICAgIHNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5vIFwKKyAgICBzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLm8gXAorICAgIHNyYy9lbmMvY29uZmlnX2VuYy5vIFwKKyAgICBzcmMvZW5jL2Nvc3RfZW5jLm8gXAorICAgIHNyYy9lbmMvZmlsdGVyX2VuYy5vIFwKKyAgICBzcmMvZW5jL2ZyYW1lX2VuYy5vIFwKKyAgICBzcmMvZW5jL2hpc3RvZ3JhbV9lbmMubyBcCisgICAgc3JjL2VuYy9pdGVyYXRvcl9lbmMubyBcCisgICAgc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5vIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfZW5jLm8gXAorICAgIHNyYy9lbmMvcGljdHVyZV9jc3BfZW5jLm8gXAorICAgIHNyYy9lbmMvcGljdHVyZV9wc25yX2VuYy5vIFwKKyAgICBzcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMubyBcCisgICAgc3JjL2VuYy9waWN0dXJlX3Rvb2xzX2VuYy5vIFwKKyAgICBzcmMvZW5jL3ByZWRpY3Rvcl9lbmMubyBcCisgICAgc3JjL2VuYy9xdWFudF9lbmMubyBcCisgICAgc3JjL2VuYy9zeW50YXhfZW5jLm8gXAorICAgIHNyYy9lbmMvdG9rZW5fZW5jLm8gXAorICAgIHNyYy9lbmMvdHJlZV9lbmMubyBcCisgICAgc3JjL2VuYy92cDhsX2VuYy5vIFwKKyAgICBzcmMvZW5jL3dlYnBfZW5jLm8gXAorCitFWF9GT1JNQVRfREVDX09CSlMgPSBcCisgICAgaW1hZ2Vpby9pbWFnZV9kZWMubyBcCisgICAgaW1hZ2Vpby9qcGVnZGVjLm8gXAorICAgIGltYWdlaW8vbWV0YWRhdGEubyBcCisgICAgaW1hZ2Vpby9wbmdkZWMubyBcCisgICAgaW1hZ2Vpby9wbm1kZWMubyBcCisgICAgaW1hZ2Vpby90aWZmZGVjLm8gXAorICAgIGltYWdlaW8vd2VicGRlYy5vIFwKKworRVhfRk9STUFUX0VOQ19PQkpTID0gXAorICAgIGltYWdlaW8vaW1hZ2VfZW5jLm8gXAorCitFWF9VVElMX09CSlMgPSBcCisgICAgZXhhbXBsZXMvZXhhbXBsZV91dGlsLm8gXAorCitHSUZERUNfT0JKUyA9IFwKKyAgICBleGFtcGxlcy9naWZkZWMubyBcCisKK0lNQUdFX1VUSUxfT0JKUyA9IFwKKyAgICBpbWFnZWlvL2ltYWdlaW9fdXRpbC5vIFwKKworTVVYX09CSlMgPSBcCisgICAgc3JjL211eC9hbmltX2VuY29kZS5vIFwKKyAgICBzcmMvbXV4L211eGVkaXQubyBcCisgICAgc3JjL211eC9tdXhpbnRlcm5hbC5vIFwKKyAgICBzcmMvbXV4L211eHJlYWQubyBcCisKK1VUSUxTX0RFQ19PQkpTID0gXAorICAgIHNyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvZmlsdGVyc191dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9yZXNjYWxlcl91dGlscy5vIFwKKyAgICBzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy91dGlscy5vIFwKKworVVRJTFNfRU5DX09CSlMgPSBcCisgICAgc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMubyBcCisgICAgc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLm8gXAorICAgIHNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMubyBcCisKK0VYVFJBX09CSlMgPSBcCisgICAgZXh0cmFzL2V4dHJhcy5vIFwKKyAgICBleHRyYXMvcXVhbGl0eV9lc3RpbWF0ZS5vIFwKKworTElCV0VCUERFQ09ERVJfT0JKUyA9ICQoREVDX09CSlMpICQoRFNQX0RFQ19PQkpTKSAkKFVUSUxTX0RFQ19PQkpTKQorTElCV0VCUF9PQkpTID0gJChMSUJXRUJQREVDT0RFUl9PQkpTKSAkKEVOQ19PQkpTKSAkKERTUF9FTkNfT0JKUykgXAorICAgICAgICAgICAgICAgJChVVElMU19FTkNfT0JKUykKK0xJQldFQlBNVVhfT0JKUyA9ICQoTVVYX09CSlMpCitMSUJXRUJQREVNVVhfT0JKUyA9ICQoREVNVVhfT0JKUykKK0xJQldFQlBFWFRSQV9PQkpTID0gJChFWFRSQV9PQkpTKQorCitIRFJTX0lOU1RBTExFRCA9IFwKKyAgICBzcmMvd2VicC9kZWNvZGUuaCBcCisgICAgc3JjL3dlYnAvZGVtdXguaCBcCisgICAgc3JjL3dlYnAvZW5jb2RlLmggXAorICAgIHNyYy93ZWJwL211eC5oIFwKKyAgICBzcmMvd2VicC9tdXhfdHlwZXMuaCBcCisgICAgc3JjL3dlYnAvdHlwZXMuaCBcCisKK0hEUlMgPSBcCisgICAgc3JjL2RlYy9hbHBoYWlfZGVjLmggXAorICAgIHNyYy9kZWMvY29tbW9uX2RlYy5oIFwKKyAgICBzcmMvZGVjL3ZwOF9kZWMuaCBcCisgICAgc3JjL2RlYy92cDhpX2RlYy5oIFwKKyAgICBzcmMvZGVjL3ZwOGxpX2RlYy5oIFwKKyAgICBzcmMvZGVjL3dlYnBpX2RlYy5oIFwKKyAgICBzcmMvZHNwL2NvbW1vbl9zc2UyLmggXAorICAgIHNyYy9kc3AvZHNwLmggXAorICAgIHNyYy9kc3AvbG9zc2xlc3MuaCBcCisgICAgc3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCBcCisgICAgc3JjL2RzcC9taXBzX21hY3JvLmggXAorICAgIHNyYy9kc3AvbXNhX21hY3JvLmggXAorICAgIHNyYy9kc3AvbmVvbi5oIFwKKyAgICBzcmMvZHNwL3l1di5oIFwKKyAgICBzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmggXAorICAgIHNyYy9lbmMvY29zdF9lbmMuaCBcCisgICAgc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmggXAorICAgIHNyYy9lbmMvdnA4aV9lbmMuaCBcCisgICAgc3JjL2VuYy92cDhsaV9lbmMuaCBcCisgICAgc3JjL211eC9hbmltaS5oIFwKKyAgICBzcmMvbXV4L211eGkuaCBcCisgICAgc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvZmlsdGVyc191dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuaCBcCisgICAgc3JjL3V0aWxzL3F1YW50X2xldmVsc191dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvcmFuZG9tX3V0aWxzLmggXAorICAgIHNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIFwKKyAgICBzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmggXAorICAgIHNyYy91dGlscy91dGlscy5oIFwKKyAgICBzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmggXAorICAgICQoSERSU19JTlNUQUxMRUQpIFwKKworT1VUX0xJQlMgPSBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYQorT1VUX0xJQlMgKz0gaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorT1VUX0xJQlMgKz0gaW1hZ2Vpby9saWJpbWFnZWRlYy5hCitPVVRfTElCUyArPSBpbWFnZWlvL2xpYmltYWdlZW5jLmEKK09VVF9MSUJTICs9IHNyYy9saWJ3ZWJwZGVjb2Rlci5hCitPVVRfTElCUyArPSBzcmMvbGlid2VicC5hCitFWFRSQV9MSUIgPSBleHRyYXMvbGlid2VicGV4dHJhcy5hCitPVVRfRVhBTVBMRVMgPSBleGFtcGxlcy9jd2VicCBleGFtcGxlcy9kd2VicAorRVhUUkFfRVhBTVBMRVMgPSBleGFtcGxlcy9naWYyd2VicCBleGFtcGxlcy92d2VicCBleGFtcGxlcy93ZWJwbXV4IFwKKyAgICAgICAgICAgICAgICAgZXhhbXBsZXMvYW5pbV9kaWZmIGV4YW1wbGVzL2FuaW1fZHVtcCBcCisgICAgICAgICAgICAgICAgIGV4YW1wbGVzL2ltZzJ3ZWJwIGV4YW1wbGVzL3dlYnBpbmZvCitPVEhFUl9FWEFNUExFUyA9IGV4dHJhcy9nZXRfZGlzdG8gZXh0cmFzL3dlYnBfcXVhbGl0eSBleHRyYXMvdndlYnBfc2RsCisKK09VVFBVVCA9ICQoT1VUX0xJQlMpICQoT1VUX0VYQU1QTEVTKQoraWZlcSAoJChNQUtFQ01ER09BTFMpLGNsZWFuKQorICBPVVRQVVQgKz0gJChFWFRSQV9FWEFNUExFUykgJChPVEhFUl9FWEFNUExFUykKKyAgT1VUUFVUICs9IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYSBzcmMvbXV4L2xpYndlYnBtdXguYSAkKEVYVFJBX0xJQikKKyAgT1VUUFVUICs9IGV4YW1wbGVzL2xpYmdpZmRlYy5hIGV4YW1wbGVzL2xpYmFuaW1fdXRpbC5hCitlbmRpZgorCitleDogJChPVVRfRVhBTVBMRVMpCithbGw6IGV4ICQoRVhUUkFfRVhBTVBMRVMpICQoT1RIRVJfRVhBTVBMRVMpCitleHRyYXM6ICQoRVhUUkFfTElCKQorCiskKEVYX0ZPUk1BVF9ERUNfT0JKUyk6ICUubzogJS5oCisKKyMgc3BlY2lhbCBkZXBlbmRlbmNpZXM6CisjICAgdHJlZV9kZWMuYy92cDhfZGVjLmMvYml0X3JlYWRlcl91dGlscy5jIDwtPgorIyAgICAgYml0X3JlYWRlcl9pbmxfdXRpbHMuaCwgZW5kaWFuX2lubF91dGlscy5oCisjICAgYml0X3dyaXRlcl91dGlscy5jIDwtPiBlbmRpYW5faW5sX3V0aWxzLmgKK3NyYy9kZWMvdHJlZV9kZWMubzogc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmgKK3NyYy9kZWMvdHJlZV9kZWMubzogc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaAorc3JjL2RlYy92cDhfZGVjLm86IHNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIHNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKK3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLm86IHNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oCitzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5vOiBzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCitzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5vOiBzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oCisKKyUubzogJS5jICQoSERSUykKKwkkKENDKSAkKENQUEZMQUdTKSAkKENGTEFHUykgLWMgJDwgLW8gJEAKKworZXhhbXBsZXMvbGliYW5pbV91dGlsLmE6ICQoQU5JTV9VVElMX09CSlMpCitleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYTogJChFWF9VVElMX09CSlMpCitleGFtcGxlcy9saWJnaWZkZWMuYTogJChHSUZERUNfT0JKUykKK2V4dHJhcy9saWJ3ZWJwZXh0cmFzLmE6ICQoTElCV0VCUEVYVFJBX09CSlMpCitpbWFnZWlvL2xpYmltYWdlZGVjLmE6ICQoRVhfRk9STUFUX0RFQ19PQkpTKQoraW1hZ2Vpby9saWJpbWFnZWVuYy5hOiAkKEVYX0ZPUk1BVF9FTkNfT0JKUykKK2ltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmE6ICQoSU1BR0VfVVRJTF9PQkpTKQorc3JjL2xpYndlYnBkZWNvZGVyLmE6ICQoTElCV0VCUERFQ09ERVJfT0JKUykKK3NyYy9saWJ3ZWJwLmE6ICQoTElCV0VCUF9PQkpTKQorc3JjL211eC9saWJ3ZWJwbXV4LmE6ICQoTElCV0VCUE1VWF9PQkpTKQorc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hOiAkKExJQldFQlBERU1VWF9PQkpTKQorCislLmE6CisJJChBUikgJChBUkZMQUdTKSAkQCAkXgorCitleGFtcGxlcy9hbmltX2RpZmY6IGV4YW1wbGVzL2FuaW1fZGlmZi5vICQoQU5JTV9VVElMX09CSlMpICQoR0lGREVDX09CSlMpCitleGFtcGxlcy9hbmltX2R1bXA6IGV4YW1wbGVzL2FuaW1fZHVtcC5vICQoQU5JTV9VVElMX09CSlMpCitleGFtcGxlcy9jd2VicDogZXhhbXBsZXMvY3dlYnAubworZXhhbXBsZXMvZHdlYnA6IGV4YW1wbGVzL2R3ZWJwLm8KK2V4YW1wbGVzL2dpZjJ3ZWJwOiBleGFtcGxlcy9naWYyd2VicC5vICQoR0lGREVDX09CSlMpCitleGFtcGxlcy92d2VicDogZXhhbXBsZXMvdndlYnAubworZXhhbXBsZXMvd2VicG11eDogZXhhbXBsZXMvd2VicG11eC5vCitleGFtcGxlcy9pbWcyd2VicDogZXhhbXBsZXMvaW1nMndlYnAubworZXhhbXBsZXMvd2VicGluZm86IGV4YW1wbGVzL3dlYnBpbmZvLm8KKworZXhhbXBsZXMvYW5pbV9kaWZmOiBleGFtcGxlcy9saWJhbmltX3V0aWwuYSBleGFtcGxlcy9saWJnaWZkZWMuYQorZXhhbXBsZXMvYW5pbV9kaWZmOiBzcmMvZGVtdXgvbGlid2VicGRlbXV4LmEgZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEKK2V4YW1wbGVzL2FuaW1fZGlmZjogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYSBzcmMvbGlid2VicC5hCitleGFtcGxlcy9hbmltX2RpZmY6IEVYVFJBX0xJQlMgKz0gJChHSUZfTElCUykKK2V4YW1wbGVzL2FuaW1fZGlmZjogRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfR0lGCitleGFtcGxlcy9hbmltX2R1bXA6IGV4YW1wbGVzL2xpYmFuaW1fdXRpbC5hCitleGFtcGxlcy9hbmltX2R1bXA6IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy9hbmltX2R1bXA6IGltYWdlaW8vbGliaW1hZ2VlbmMuYQorZXhhbXBsZXMvYW5pbV9kdW1wOiBzcmMvbGlid2VicC5hCitleGFtcGxlcy9hbmltX2R1bXA6IEVYVFJBX0xJQlMgKz0gJChHSUZfTElCUykgJChEV0VCUF9MSUJTKQorZXhhbXBsZXMvY3dlYnA6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hCitleGFtcGxlcy9jd2VicDogaW1hZ2Vpby9saWJpbWFnZWRlYy5hCitleGFtcGxlcy9jd2VicDogc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleGFtcGxlcy9jd2VicDogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvY3dlYnA6IHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2N3ZWJwOiBFWFRSQV9MSUJTICs9ICQoQ1dFQlBfTElCUykKK2V4YW1wbGVzL2R3ZWJwOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYQorZXhhbXBsZXMvZHdlYnA6IGltYWdlaW8vbGliaW1hZ2VkZWMuYQorZXhhbXBsZXMvZHdlYnA6IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXhhbXBsZXMvZHdlYnA6IGltYWdlaW8vbGliaW1hZ2VlbmMuYQorZXhhbXBsZXMvZHdlYnA6IGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL2R3ZWJwOiBzcmMvbGlid2VicC5hCitleGFtcGxlcy9kd2VicDogRVhUUkFfTElCUyArPSAkKERXRUJQX0xJQlMpCitleGFtcGxlcy9naWYyd2VicDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEgaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvZ2lmMndlYnA6IGV4YW1wbGVzL2xpYmdpZmRlYy5hIHNyYy9tdXgvbGlid2VicG11eC5hIHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2dpZjJ3ZWJwOiBFWFRSQV9MSUJTICs9ICQoR0lGX0xJQlMpCitleGFtcGxlcy9naWYyd2VicDogRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfR0lGCitleGFtcGxlcy92d2VicDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEgc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hCitleGFtcGxlcy92d2VicDogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYSBzcmMvbGlid2VicC5hCitleGFtcGxlcy92d2VicDogRVhUUkFfTElCUyArPSAkKEdMX0xJQlMpCitleGFtcGxlcy92d2VicDogRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfR0wKK2V4YW1wbGVzL3dlYnBtdXg6IGV4YW1wbGVzL2xpYmV4YW1wbGVfdXRpbC5hIGltYWdlaW8vbGliaW1hZ2Vpb191dGlsLmEKK2V4YW1wbGVzL3dlYnBtdXg6IHNyYy9tdXgvbGlid2VicG11eC5hIHNyYy9saWJ3ZWJwZGVjb2Rlci5hCitleGFtcGxlcy9pbWcyd2VicDogZXhhbXBsZXMvbGliZXhhbXBsZV91dGlsLmEgaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXhhbXBsZXMvaW1nMndlYnA6IGltYWdlaW8vbGliaW1hZ2VkZWMuYQorZXhhbXBsZXMvaW1nMndlYnA6IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXhhbXBsZXMvaW1nMndlYnA6IHNyYy9tdXgvbGlid2VicG11eC5hIHNyYy9saWJ3ZWJwLmEKK2V4YW1wbGVzL2ltZzJ3ZWJwOiBFWFRSQV9MSUJTICs9ICQoQ1dFQlBfTElCUykKK2V4YW1wbGVzL3dlYnBpbmZvOiBleGFtcGxlcy9saWJleGFtcGxlX3V0aWwuYSBpbWFnZWlvL2xpYmltYWdlaW9fdXRpbC5hCitleGFtcGxlcy93ZWJwaW5mbzogc3JjL2xpYndlYnBkZWNvZGVyLmEKKworZXh0cmFzL2dldF9kaXN0bzogZXh0cmFzL2dldF9kaXN0by5vCitleHRyYXMvZ2V0X2Rpc3RvOiBpbWFnZWlvL2xpYmltYWdlZGVjLmEKK2V4dHJhcy9nZXRfZGlzdG86IHNyYy9kZW11eC9saWJ3ZWJwZGVtdXguYQorZXh0cmFzL2dldF9kaXN0bzogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXh0cmFzL2dldF9kaXN0bzogc3JjL2xpYndlYnAuYQorZXh0cmFzL2dldF9kaXN0bzogRVhUUkFfTElCUyArPSAkKENXRUJQX0xJQlMpCisKK2V4dHJhcy93ZWJwX3F1YWxpdHk6IGV4dHJhcy93ZWJwX3F1YWxpdHkubworZXh0cmFzL3dlYnBfcXVhbGl0eTogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXh0cmFzL3dlYnBfcXVhbGl0eTogJChFWFRSQV9MSUIpIHNyYy9saWJ3ZWJwLmEKKworZXh0cmFzL3Z3ZWJwX3NkbDogZXh0cmFzL3Z3ZWJwX3NkbC5vCitleHRyYXMvdndlYnBfc2RsOiBleHRyYXMvd2VicF90b19zZGwubworZXh0cmFzL3Z3ZWJwX3NkbDogaW1hZ2Vpby9saWJpbWFnZWlvX3V0aWwuYQorZXh0cmFzL3Z3ZWJwX3NkbDogc3JjL2xpYndlYnAuYQorZXh0cmFzL3Z3ZWJwX3NkbDogRVhUUkFfRkxBR1MgKz0gLURXRUJQX0hBVkVfU0RMICQoU0RMX0ZMQUdTKQorZXh0cmFzL3Z3ZWJwX3NkbDogRVhUUkFfTElCUyArPSAkKFNETF9MSUJTKQorCiskKE9VVF9FWEFNUExFUykgJChFWFRSQV9FWEFNUExFUykgJChPVEhFUl9FWEFNUExFUyk6CisJJChDQykgLW8gJEAgJF4gJChMREZMQUdTKQorCitkaXN0OiBERVNURElSIDo9IGRpc3QKK2Rpc3Q6IE9VVF9FWEFNUExFUyArPSAkKEVYVFJBX0VYQU1QTEVTKQorZGlzdDogYWxsCisJJChJTlNUQUxMKSAtbTc1NSAtZCAkKERFU1RESVIpL2luY2x1ZGUvd2VicCBcCisJICAgICAgICAgICAkKERFU1RESVIpL2JpbiAkKERFU1RESVIpL2RvYyAkKERFU1RESVIpL2xpYgorCSQoSU5TVEFMTCkgLW03NTUgLXMgJChPVVRfRVhBTVBMRVMpICQoREVTVERJUikvYmluCisJJChJTlNUQUxMKSAtbTY0NCAkKEhEUlNfSU5TVEFMTEVEKSAkKERFU1RESVIpL2luY2x1ZGUvd2VicAorCSQoSU5TVEFMTCkgLW02NDQgc3JjL2xpYndlYnAuYSAkKERFU1RESVIpL2xpYgorCSQoSU5TVEFMTCkgLW02NDQgc3JjL2RlbXV4L2xpYndlYnBkZW11eC5hICQoREVTVERJUikvbGliCisJJChJTlNUQUxMKSAtbTY0NCBzcmMvbXV4L2xpYndlYnBtdXguYSAkKERFU1RESVIpL2xpYgorCXVtYXNrIDAyMjsgXAorCWZvciBtIGluIG1hbi9bY2R2XXdlYnAuMSBtYW4vZ2lmMndlYnAuMSBtYW4vd2VicG11eC4xIFwKKyAgICAgICAgICAgICAgICAgbWFuL2ltZzJ3ZWJwLjEgbWFuL3dlYnBpbmZvLjE7IGRvIFwKKwkgIGJhc2VuYW09JCQoYmFzZW5hbWUgJCRtIC4xKTsgXAorCSAgJChHUk9GRikgLXQgLWUgLW1hbiAtVCBhc2NpaSAkJG0gXAorCSAgICB8ICQoQ09MKSAtYnggPiQoREVTVERJUikvZG9jLyQke2Jhc2VuYW19LnR4dDsgXAorCSAgJChHUk9GRikgLXQgLWUgLW1hbiAtVCBodG1sICQkbSBcCisJICAgIHwgJChDT0wpIC1ieCA+JChERVNURElSKS9kb2MvJCR7YmFzZW5hbX0uaHRtbDsgXAorCWRvbmUKKworY2xlYW46CisJJChSTSkgJChPVVRQVVQpICp+IFwKKyAgICAgICAgICAgICAgZXhhbXBsZXMvKi5vIGV4YW1wbGVzLyp+IFwKKyAgICAgICAgICAgICAgZXh0cmFzLyoubyBleHRyYXMvKn4gXAorICAgICAgICAgICAgICBpbWFnZWlvLyoubyBpbWFnZWlvLyp+IFwKKyAgICAgICAgICAgICAgc3JjL2RlYy8qLm8gc3JjL2RlYy8qfiBcCisgICAgICAgICAgICAgIHNyYy9kZW11eC8qLm8gc3JjL2RlbXV4Lyp+IFwKKyAgICAgICAgICAgICAgc3JjL2RzcC8qLm8gc3JjL2RzcC8qfiBcCisgICAgICAgICAgICAgIHNyYy9lbmMvKi5vIHNyYy9lbmMvKn4gXAorICAgICAgICAgICAgICBzcmMvbXV4LyoubyBzcmMvbXV4Lyp+IFwKKyAgICAgICAgICAgICAgc3JjL3V0aWxzLyoubyBzcmMvdXRpbHMvKn4gXAorICAgICAgICAgICAgICBzcmMvd2VicC8qfiBtYW4vKn4gZG9jLyp+IHN3aWcvKn4gXAorCisuUEhPTlk6IGFsbCBjbGVhbiBkaXN0IGV4CisuU1VGRklYRVM6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlZjc3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE0IEBACittYW5fTUFOUyA9IGN3ZWJwLjEgZHdlYnAuMQoraWYgV0FOVF9NVVgKKyAgbWFuX01BTlMgKz0gd2VicG11eC4xCitlbmRpZgoraWYgQlVJTERfR0lGMldFQlAKKyAgbWFuX01BTlMgKz0gZ2lmMndlYnAuMQorZW5kaWYKK2lmIEJVSUxEX1ZXRUJQCisgIG1hbl9NQU5TICs9IHZ3ZWJwLjEKK2VuZGlmCitpZiBCVUlMRF9XRUJQSU5GTworICBtYW5fTUFOUyArPSB3ZWJwaW5mby4xCitlbmRpZgorRVhUUkFfRElTVCA9ICQobWFuX01BTlMpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vY3dlYnAuMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9jd2VicC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDMzMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vY3dlYnAuMQpAQCAtMCwwICsxLDMxNiBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggQ1dFQlAgMSAiSmFudWFyeSAyMCwgMjAxNyIKKy5TSCBOQU1FCitjd2VicCBcLSBjb21wcmVzcyBhbiBpbWFnZSBmaWxlIHRvIGEgV2ViUCBmaWxlCisuU0ggU1lOT1BTSVMKKy5CIGN3ZWJwCisuUkkgWyBvcHRpb25zIF0gIiBpbnB1dF9maWxlIFwtbyBvdXRwdXRfZmlsZS53ZWJwCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiBjd2VicAorY29tbWFuZC4KKy5QUAorXGZCY3dlYnBcZlAgY29tcHJlc3NlcyBhbiBpbWFnZSB1c2luZyB0aGUgV2ViUCBmb3JtYXQuCitJbnB1dCBmb3JtYXQgY2FuIGJlIGVpdGhlciBQTkcsIEpQRUcsIFRJRkYsIFdlYlAgb3IgcmF3IFknQ2JDciBzYW1wbGVzLgorLlNIIE9QVElPTlMKK1RoZSBiYXNpYyBvcHRpb25zIGFyZToKKy5UUAorLkJJIFwtbyAiIHN0cmluZworU3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IFdlYlAgZmlsZS4gSWYgb21pdHRlZCwgXGZCY3dlYnBcZlAgd2lsbAorcGVyZm9ybSBjb21wcmVzc2lvbiBidXQgb25seSByZXBvcnQgc3RhdGlzdGljcy4KK1VzaW5nICJcLSIgYXMgb3V0cHV0IG5hbWUgd2lsbCBkaXJlY3Qgb3V0cHV0IHRvICdzdGRvdXQnLgorLlRQCisuQkkgXC1cLSAiIHN0cmluZworRXhwbGljaXRseSBzcGVjaWZ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgdGhlIGlucHV0CitmaWxlIHN0YXJ0cyB3aXRoIGEgJ1wtJyBmb3IgaW5zdGFuY2UuIFRoaXMgb3B0aW9uIG11c3QgYXBwZWFyIFxmQmxhc3RcZlAuCitBbnkgb3RoZXIgb3B0aW9ucyBhZnRlcndhcmQgd2lsbCBiZSBpZ25vcmVkLgorLlRQCisuQiBcLWgsIFwtaGVscAorQSBzaG9ydCB1c2FnZSBzdW1tYXJ5LgorLlRQCisuQiBcLUgsIFwtbG9uZ2hlbHAKK0Egc3VtbWFyeSBvZiBhbGwgdGhlIHBvc3NpYmxlIG9wdGlvbnMuCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdGhlIHZlcnNpb24gbnVtYmVyIChhcyBtYWpvci5taW5vci5yZXZpc2lvbikgYW5kIGV4aXQuCisuVFAKKy5CIFwtbG9zc2xlc3MKK0VuY29kZSB0aGUgaW1hZ2Ugd2l0aG91dCBhbnkgbG9zcy4gRm9yIGltYWdlcyB3aXRoIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEsCit0aGUgaW52aXNpYmxlIHBpeGVsIHZhbHVlcyAoUi9HL0Igb3IgWS9VL1YpIHdpbGwgYmUgcHJlc2VydmVkIG9ubHkgaWYgdGhlCitcLWV4YWN0IG9wdGlvbiBpcyB1c2VkLgorLlRQCisuQkkgXC1uZWFyX2xvc3NsZXNzICIgaW50CitVc2UgbmVhclwtbG9zc2xlc3MgaW1hZ2UgcHJlcHJvY2Vzc2luZy4gVGhpcyBvcHRpb24gYWRqdXN0cyBwaXhlbCB2YWx1ZXMKK3RvIGhlbHAgY29tcHJlc3NpYmlsaXR5LCBidXQgaGFzIG1pbmltYWwgaW1wYWN0IG9uIHRoZSB2aXN1YWwgcXVhbGl0eS4KK0l0IHRyaWdnZXJzIGxvc3NsZXNzIGNvbXByZXNzaW9uIG1vZGUgYXV0b21hdGljYWxseS4KK1JhbmdlIGlzIDAgKG1heGltdW0gcHJlcHJvY2Vzc2luZykgdG8gMTAwIChubyBwcmVwcm9jZXNzaW5nLCB0aGUgZGVmYXVsdCkuCisuVFAKKy5CSSBcLXEgIiBmbG9hdAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gZmFjdG9yIGZvciBSR0IgY2hhbm5lbHMgYmV0d2VlbiAwIGFuZCAxMDAuIFRoZSBkZWZhdWx0CitpcyA3NS4KKy5icgorSW4gY2FzZSBvZiBsb3NzeSBjb21wcmVzc2lvbiAoZGVmYXVsdCksIGEgc21hbGwgZmFjdG9yIHByb2R1Y2VzIGEgc21hbGxlciBmaWxlCit3aXRoIGxvd2VyIHF1YWxpdHkuIEJlc3QgcXVhbGl0eSBpcyBhY2hpZXZlZCBieSB1c2luZyBhIHZhbHVlIG9mIDEwMC4KKy5icgorSW4gY2FzZSBvZiBsb3NzbGVzcyBjb21wcmVzc2lvbiAoc3BlY2lmaWVkIGJ5IHRoZSBcZkJcLWxvc3NsZXNzXGZQIG9wdGlvbiksIGEKK3NtYWxsIGZhY3RvciBlbmFibGVzIGZhc3RlciBjb21wcmVzc2lvbiBzcGVlZCwgYnV0IHByb2R1Y2VzIGEgbGFyZ2VyIGZpbGUuCitNYXhpbXVtIGNvbXByZXNzaW9uIGlzIGFjaGlldmVkIGJ5IHVzaW5nIGEgdmFsdWUgb2YgMTAwLgorLlRQCisuQkkgXC16ICIgaW50CitTd2l0Y2ggb24gXGZCbG9zc2xlc3NcZlAgY29tcHJlc3Npb24gbW9kZSB3aXRoIHRoZSBzcGVjaWZpZWQgbGV2ZWwgYmV0d2VlbiAwCithbmQgOSwgd2l0aCBsZXZlbCAwIGJlaW5nIHRoZSBmYXN0ZXN0LCA5IGJlaW5nIHRoZSBzbG93ZXN0LiBGYXN0IG1vZGUKK3Byb2R1Y2VzIGxhcmdlciBmaWxlIHNpemUgdGhhbiBzbG93ZXIgb25lcy4gQSBnb29kIGRlZmF1bHQgaXMgXGZCXC16IDZcZlAuCitUaGlzIG9wdGlvbiBpcyBhY3R1YWxseSBhIHNob3J0Y3V0IGZvciBzb21lIHByZWRlZmluZWQgc2V0dGluZ3MgZm9yIHF1YWxpdHkKK2FuZCBtZXRob2QuIElmIG9wdGlvbnMgXGZCXC1xXGZQICBvciBcZkJcLW1cZlAgYXJlIHN1YnNlcXVlbnRseSB1c2VkLCB0aGV5IHdpbGwKK2ludmFsaWRhdGUgdGhlIGVmZmVjdCBvZiB0aGlzIG9wdGlvbi4KKy5UUAorLkJJIFwtYWxwaGFfcSAiIGludAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gZmFjdG9yIGZvciBhbHBoYSBjb21wcmVzc2lvbiBiZXR3ZWVuIDAgYW5kIDEwMC4KK0xvc3NsZXNzIGNvbXByZXNzaW9uIG9mIGFscGhhIGlzIGFjaGlldmVkIHVzaW5nIGEgdmFsdWUgb2YgMTAwLCB3aGlsZSB0aGUgbG93ZXIKK3ZhbHVlcyByZXN1bHQgaW4gYSBsb3NzeSBjb21wcmVzc2lvbi4gVGhlIGRlZmF1bHQgaXMgMTAwLgorLlRQCisuQkkgXC1wcmVzZXQgIiBzdHJpbmcKK1NwZWNpZnkgYSBzZXQgb2YgcHJlXC1kZWZpbmVkIHBhcmFtZXRlcnMgdG8gc3VpdCBhIHBhcnRpY3VsYXIgdHlwZSBvZgorc291cmNlIG1hdGVyaWFsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiAgXGZCZGVmYXVsdFxmUCwgXGZCcGhvdG9cZlAsCitcZkJwaWN0dXJlXGZQLCBcZkJkcmF3aW5nXGZQLCBcZkJpY29uXGZQLCBcZkJ0ZXh0XGZQLiBTaW5jZQorXGZCXC1wcmVzZXRcZlAgb3ZlcndyaXRlcyB0aGUgb3RoZXIgcGFyYW1ldGVycycgdmFsdWVzIChleGNlcHQgdGhlCitcZkJcLXFcZlAgb25lKSwgdGhpcyBvcHRpb24gc2hvdWxkIHByZWZlcmFibHkgYXBwZWFyIGZpcnN0IGluIHRoZQorb3JkZXIgb2YgdGhlIGFyZ3VtZW50cy4KKy5UUAorLkJJIFwtbSAiIGludAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIHVzZS4gVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlCit0cmFkZSBvZmYgYmV0d2VlbiBlbmNvZGluZyBzcGVlZCBhbmQgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGFuZCBxdWFsaXR5LgorUG9zc2libGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byA2LiBEZWZhdWx0IHZhbHVlIGlzIDQuCitXaGVuIGhpZ2hlciB2YWx1ZXMgYXJlIHVzZWQsIHRoZSBlbmNvZGVyIHdpbGwgc3BlbmQgbW9yZSB0aW1lIGluc3BlY3RpbmcKK2FkZGl0aW9uYWwgZW5jb2RpbmcgcG9zc2liaWxpdGllcyBhbmQgZGVjaWRlIG9uIHRoZSBxdWFsaXR5IGdhaW4uCitMb3dlciB2YWx1ZSBjYW4gcmVzdWx0IGluIGZhc3RlciBwcm9jZXNzaW5nIHRpbWUgYXQgdGhlIGV4cGVuc2Ugb2YKK2xhcmdlciBmaWxlIHNpemUgYW5kIGxvd2VyIGNvbXByZXNzaW9uIHF1YWxpdHkuCisuVFAKKy5CSSBcLXJlc2l6ZSAiIHdpZHRoIGhlaWdodAorUmVzaXplIHRoZSBzb3VyY2UgdG8gYSByZWN0YW5nbGUgd2l0aCBzaXplIFxmQndpZHRoXGZQIHggXGZCaGVpZ2h0XGZQLgorSWYgZWl0aGVyIChidXQgbm90IGJvdGgpIG9mIHRoZSBcZkJ3aWR0aFxmUCBvciBcZkJoZWlnaHRcZlAgcGFyYW1ldGVycyBpcyAwLAordGhlIHZhbHVlIHdpbGwgYmUgY2FsY3VsYXRlZCBwcmVzZXJ2aW5nIHRoZSBhc3BlY3RcLXJhdGlvLgorLlRQCisuQkkgXC1jcm9wICIgeF9wb3NpdGlvbiB5X3Bvc2l0aW9uIHdpZHRoIGhlaWdodAorQ3JvcCB0aGUgc291cmNlIHRvIGEgcmVjdGFuZ2xlIHdpdGggdG9wXC1sZWZ0IGNvcm5lciBhdCBjb29yZGluYXRlcworKFxmQnhfcG9zaXRpb25cZlAsIFxmQnlfcG9zaXRpb25cZlApIGFuZCBzaXplIFxmQndpZHRoXGZQIHggXGZCaGVpZ2h0XGZQLgorVGhpcyBjcm9wcGluZyBhcmVhIG11c3QgYmUgZnVsbHkgY29udGFpbmVkIHdpdGhpbiB0aGUgc291cmNlIHJlY3RhbmdsZS4KKy5UUAorLkIgXC1tdAorVXNlIG11bHRpXC10aHJlYWRpbmcgZm9yIGVuY29kaW5nLCBpZiBwb3NzaWJsZS4KKy5UUAorLkIgXC1sb3dfbWVtb3J5CitSZWR1Y2UgbWVtb3J5IHVzYWdlIG9mIGxvc3N5IGVuY29kaW5nIGJ5IHNhdmluZyBmb3VyIHRpbWVzIHRoZSBjb21wcmVzc2VkCitzaXplICh0eXBpY2FsbHkpLiBUaGlzIHdpbGwgbWFrZSB0aGUgZW5jb2Rpbmcgc2xvd2VyIGFuZCB0aGUgb3V0cHV0IHNsaWdodGx5CitkaWZmZXJlbnQgaW4gc2l6ZSBhbmQgZGlzdG9ydGlvbi4gVGhpcyBmbGFnIGlzIG9ubHkgZWZmZWN0aXZlIGZvciBtZXRob2RzCiszIGFuZCB1cCwgYW5kIGlzIG9mZiBieSBkZWZhdWx0LiBOb3RlIHRoYXQgbGVhdmluZyB0aGlzIGZsYWcgb2ZmIHdpbGwgaGF2ZQorc29tZSBzaWRlIGVmZmVjdHMgb24gdGhlIGJpdHN0cmVhbTogaXQgZm9yY2VzIGNlcnRhaW4gYml0c3RyZWFtIGZlYXR1cmVzCitsaWtlIG51bWJlciBvZiBwYXJ0aXRpb25zIChmb3JjZWQgdG8gMSkuIE5vdGUgdGhhdCBhIG1vcmUgZGV0YWlsZWQgcmVwb3J0CitvZiBiaXRzdHJlYW0gc2l6ZSBpcyBwcmludGVkIGJ5IFxmQmN3ZWJwXGZQIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24uCisKKy5TUyBMT1NTWSBPUFRJT05TCitUaGVzZSBvcHRpb25zIGFyZSBvbmx5IGVmZmVjdGl2ZSB3aGVuIGRvaW5nIGxvc3N5IGVuY29kaW5nICh0aGUgZGVmYXVsdCwgd2l0aAorb3Igd2l0aG91dCBhbHBoYSkuCisKKy5UUAorLkJJIFwtc2l6ZSAiIGludAorU3BlY2lmeSBhIHRhcmdldCBzaXplIChpbiBieXRlcykgdG8gdHJ5IGFuZCByZWFjaCBmb3IgdGhlIGNvbXByZXNzZWQgb3V0cHV0LgorVGhlIGNvbXByZXNzb3Igd2lsbCBtYWtlIHNldmVyYWwgcGFzc2VzIG9mIHBhcnRpYWwgZW5jb2RpbmcgaW4gb3JkZXIgdG8gZ2V0IGFzCitjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGlzIHRhcmdldC4gSWYgYm90aCBcZkJcLXNpemVcZlAgYW5kIFxmQlwtcHNuclxmUAorYXJlIHVzZWQsIFxmQlwtc2l6ZVxmUCB2YWx1ZSB3aWxsIHByZXZhaWwuCisuVFAKKy5CSSBcLXBzbnIgIiBmbG9hdAorU3BlY2lmeSBhIHRhcmdldCBQU05SIChpbiBkQikgdG8gdHJ5IGFuZCByZWFjaCBmb3IgdGhlIGNvbXByZXNzZWQgb3V0cHV0LgorVGhlIGNvbXByZXNzb3Igd2lsbCBtYWtlIHNldmVyYWwgcGFzc2VzIG9mIHBhcnRpYWwgZW5jb2RpbmcgaW4gb3JkZXIgdG8gZ2V0IGFzCitjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGlzIHRhcmdldC4gSWYgYm90aCBcZkJcLXNpemVcZlAgYW5kIFxmQlwtcHNuclxmUAorYXJlIHVzZWQsIFxmQlwtc2l6ZVxmUCB2YWx1ZSB3aWxsIHByZXZhaWwuCisuVFAKKy5CSSBcLXBhc3MgIiBpbnQKK1NldCBhIG1heGltdW0gbnVtYmVyIG9mIHBhc3NlcyB0byB1c2UgZHVyaW5nIHRoZSBkaWNob3RvbXkgdXNlZCBieQorb3B0aW9ucyBcZkJcLXNpemVcZlAgb3IgXGZCXC1wc25yXGZQLiBNYXhpbXVtIHZhbHVlIGlzIDEwLCBkZWZhdWx0IGlzIDEuCitJZiBvcHRpb25zIFxmQlwtc2l6ZVxmUCBvciBcZkJcLXBzbnJcZlAgd2VyZSB1c2VkLCBidXQgXGZCXC1wYXNzXGZQIHdhc24ndAorc3BlY2lmaWVkLCBhIGRlZmF1bHQgdmFsdWUgb2YgJzYnIHBhc3NlcyB3aWxsIGJlIHVzZWQuCisuVFAKKy5CIFwtYWYKK1R1cm5zIGF1dG9cLWZpbHRlciBvbi4gVGhpcyBhbGdvcml0aG0gd2lsbCBzcGVuZCBhZGRpdGlvbmFsIHRpbWUgb3B0aW1pemluZwordGhlIGZpbHRlcmluZyBzdHJlbmd0aCB0byByZWFjaCBhIHdlbGxcLWJhbGFuY2VkIHF1YWxpdHkuCisuVFAKKy5CIFwtanBlZ19saWtlCitDaGFuZ2UgdGhlIGludGVybmFsIHBhcmFtZXRlciBtYXBwaW5nIHRvIGJldHRlciBtYXRjaCB0aGUgZXhwZWN0ZWQgc2l6ZQorb2YgSlBFRyBjb21wcmVzc2lvbi4gVGhpcyBmbGFnIHdpbGwgZ2VuZXJhbGx5IHByb2R1Y2UgYW4gb3V0cHV0IGZpbGUgb2YKK3NpbWlsYXIgc2l6ZSB0byBpdHMgSlBFRyBlcXVpdmFsZW50IChmb3IgdGhlIHNhbWUgXGZCXC1xXGZQIHNldHRpbmcpLCBidXQKK3dpdGggbGVzcyB2aXN1YWwgZGlzdG9ydGlvbi4KKworLlRQCitBZHZhbmNlZCBvcHRpb25zOgorCisuVFAKKy5CSSBcLWYgIiBpbnQKK1NwZWNpZnkgdGhlIHN0cmVuZ3RoIG9mIHRoZSBkZWJsb2NraW5nIGZpbHRlciwgYmV0d2VlbiAwIChubyBmaWx0ZXJpbmcpCithbmQgMTAwIChtYXhpbXVtIGZpbHRlcmluZykuIEEgdmFsdWUgb2YgMCB3aWxsIHR1cm4gb2ZmIGFueSBmaWx0ZXJpbmcuCitIaWdoZXIgdmFsdWUgd2lsbCBpbmNyZWFzZSB0aGUgc3RyZW5ndGggb2YgdGhlIGZpbHRlcmluZyBwcm9jZXNzIGFwcGxpZWQKK2FmdGVyIGRlY29kaW5nIHRoZSBwaWN0dXJlLiBUaGUgaGlnaGVyIHRoZSB2YWx1ZSB0aGUgc21vb3RoZXIgdGhlIHBpY3R1cmUgd2lsbAorYXBwZWFyLiBUeXBpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSBpbiB0aGUgcmFuZ2Ugb2YgMjAgdG8gNTAuCisuVFAKKy5CSSBcLXNoYXJwbmVzcyAiIGludAorU3BlY2lmeSB0aGUgc2hhcnBuZXNzIG9mIHRoZSBmaWx0ZXJpbmcgKGlmIHVzZWQpLgorUmFuZ2UgaXMgMCAoc2hhcnBlc3QpIHRvIDcgKGxlYXN0IHNoYXJwKS4gRGVmYXVsdCBpcyAwLgorLlRQCisuQiBcLXN0cm9uZworVXNlIHN0cm9uZyBmaWx0ZXJpbmcgKGlmIGZpbHRlcmluZyBpcyBiZWluZyB1c2VkIHRoYW5rcyB0byB0aGUKK1xmQlwtZlxmUCBvcHRpb24pLiBTdHJvbmcgZmlsdGVyaW5nIGlzIG9uIGJ5IGRlZmF1bHQuCisuVFAKKy5CIFwtbm9zdHJvbmcKK0Rpc2FibGUgc3Ryb25nIGZpbHRlcmluZyAoaWYgZmlsdGVyaW5nIGlzIGJlaW5nIHVzZWQgdGhhbmtzIHRvIHRoZQorXGZCXC1mXGZQIG9wdGlvbikgYW5kIHVzZSBzaW1wbGUgZmlsdGVyaW5nIGluc3RlYWQuCisuVFAKKy5CIFwtc2hhcnBfeXV2CitVc2UgbW9yZSBhY2N1cmF0ZSBhbmQgc2hhcnBlciBSR0ItPllVViBjb252ZXJzaW9uIGlmIG5lZWRlZC4gTm90ZSB0aGF0IHRoaXMKK3Byb2Nlc3MgaXMgc2xvd2VyIHRoYW4gdGhlIGRlZmF1bHQgJ2Zhc3QnIFJHQi0+WVVWIGNvbnZlcnNpb24uCisuVFAKKy5CSSBcLXNucyAiIGludAorU3BlY2lmeSB0aGUgYW1wbGl0dWRlIG9mIHRoZSBzcGF0aWFsIG5vaXNlIHNoYXBpbmcuIFNwYXRpYWwgbm9pc2Ugc2hhcGluZworKG9yIFxmQnNuc1xmUCBmb3Igc2hvcnQpIHJlZmVycyB0byBhIGdlbmVyYWwgY29sbGVjdGlvbiBvZiBidWlsdFwtaW4gYWxnb3JpdGhtcwordXNlZCB0byBkZWNpZGUgd2hpY2ggYXJlYSBvZiB0aGUgcGljdHVyZSBzaG91bGQgdXNlIHJlbGF0aXZlbHkgbGVzcyBiaXRzLAorYW5kIHdoZXJlIGVsc2UgdG8gYmV0dGVyIHRyYW5zZmVyIHRoZXNlIGJpdHMuIFRoZSBwb3NzaWJsZSByYW5nZSBnb2VzIGZyb20KKzAgKGFsZ29yaXRobSBpcyBvZmYpIHRvIDEwMCAodGhlIG1heGltYWwgZWZmZWN0KS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgNTAuCisuVFAKKy5CSSBcLXNlZ21lbnRzICIgaW50CitDaGFuZ2UgdGhlIG51bWJlciBvZiBwYXJ0aXRpb25zIHRvIHVzZSBkdXJpbmcgdGhlIHNlZ21lbnRhdGlvbiBvZiB0aGUKK3NucyBhbGdvcml0aG0uIFNlZ21lbnRzIHNob3VsZCBiZSBpbiByYW5nZSAxIHRvIDQuIERlZmF1bHQgdmFsdWUgaXMgNC4KK1RoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgZm9yIG1ldGhvZHMgMyBhbmQgdXAsIHVubGVzcyBcZkJcLWxvd19tZW1vcnlcZlAKK2lzIHVzZWQuCisuVFAKKy5CSSBcLXBhcnRpdGlvbl9saW1pdCAiIGludAorRGVncmFkZSBxdWFsaXR5IGJ5IGxpbWl0aW5nIHRoZSBudW1iZXIgb2YgYml0cyB1c2VkIGJ5IHNvbWUgbWFjcm9ibG9ja3MuCitSYW5nZSBpcyAwIChubyBkZWdyYWRhdGlvbiwgdGhlIGRlZmF1bHQpIHRvIDEwMCAoZnVsbCBkZWdyYWRhdGlvbikuCitVc2VmdWwgdmFsdWVzIGFyZSB1c3VhbGx5IGFyb3VuZCAzMFwtNzAgZm9yIG1vZGVyYXRlbHkgbGFyZ2UgaW1hZ2VzLgorSW4gdGhlIFZQOCBmb3JtYXQsIHRoZSBzb1wtY2FsbGVkIGNvbnRyb2wgcGFydGl0aW9uIGhhcyBhIGxpbWl0IG9mIDUxMmsgYW5kCitpcyB1c2VkIHRvIHN0b3JlIHRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb246IHdoZXRoZXIgdGhlIG1hY3JvYmxvY2sgaXMgc2tpcHBlZCwKK3doaWNoIHNlZ21lbnQgaXQgYmVsb25ncyB0bywgd2hldGhlciBpdCBpcyBjb2RlZCBhcyBpbnRyYSA0eDQgb3IgaW50cmEgMTZ4MTYKK21vZGUsIGFuZCBmaW5hbGx5IHRoZSBwcmVkaWN0aW9uIG1vZGVzIHRvIHVzZSBmb3IgZWFjaCBvZiB0aGUgc3ViXC1ibG9ja3MuCitGb3IgYSB2ZXJ5IGxhcmdlIGltYWdlLCA1MTJrIG9ubHkgbGVhdmVzIHJvb20gdG8gZmV3IGJpdHMgcGVyIDE2eDE2IG1hY3JvYmxvY2suCitUaGUgYWJzb2x1dGUgbWluaW11bSBpcyA0IGJpdHMgcGVyIG1hY3JvYmxvY2suIFNraXAsIHNlZ21lbnQsIGFuZCBtb2RlCitpbmZvcm1hdGlvbiBjYW4gdXNlIHVwIGFsbW9zdCBhbGwgdGhlc2UgNCBiaXRzIChhbHRob3VnaCB0aGUgY2FzZSBpcyB1bmxpa2VseSksCit3aGljaCBpcyBwcm9ibGVtYXRpYyBmb3IgdmVyeSBsYXJnZSBpbWFnZXMuIFRoZSBwYXJ0aXRpb25fbGltaXQgZmFjdG9yIGNvbnRyb2xzCitob3cgZnJlcXVlbnRseSB0aGUgbW9zdCBiaXRcLWNvc3RseSBtb2RlIChpbnRyYSA0eDQpIHdpbGwgYmUgdXNlZC4gVGhpcyBpcwordXNlZnVsIGluIGNhc2UgdGhlIDUxMmsgbGltaXQgaXMgcmVhY2hlZCBhbmQgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGlzIGRpc3BsYXllZDoKK1xmSUVycm9yIGNvZGU6IDYgKFBBUlRJVElPTjBfT1ZFUkZMT1c6IFBhcnRpdGlvbiAjMCBpcyB0b28gYmlnIHRvIGZpdCA1MTJrKVxmUC4KK0lmIHVzaW5nIFxmQlwtcGFydGl0aW9uX2xpbWl0XGZQIGlzIG5vdCBlbm91Z2ggdG8gbWVldCB0aGUgNTEyayBjb25zdHJhaW50LCBvbmUKK3Nob3VsZCB1c2UgbGVzcyBzZWdtZW50cyBpbiBvcmRlciB0byBzYXZlIG1vcmUgaGVhZGVyIGJpdHMgcGVyIG1hY3JvYmxvY2suCitTZWUgdGhlIFxmQlwtc2VnbWVudHNcZlAgb3B0aW9uLgorCisuU1MgTE9HR0lORyBPUFRJT05TCitUaGVzZSBvcHRpb25zIGNvbnRyb2wgdGhlIGxldmVsIG9mIG91dHB1dDoKKy5UUAorLkIgXC12CitQcmludCBleHRyYSBpbmZvcm1hdGlvbiAoZW5jb2RpbmcgdGltZSBpbiBwYXJ0aWN1bGFyKS4KKy5UUAorLkIgXC1wcmludF9wc25yCitDb21wdXRlIGFuZCByZXBvcnQgYXZlcmFnZSBQU05SIChQZWFrXC1TaWduYWxcLVRvXC1Ob2lzZSByYXRpbykuCisuVFAKKy5CIFwtcHJpbnRfc3NpbQorQ29tcHV0ZSBhbmQgcmVwb3J0IGF2ZXJhZ2UgU1NJTSAoc3RydWN0dXJhbCBzaW1pbGFyaXR5CittZXRyaWMsIHNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NTSU0gZm9yIGFkZGl0aW9uYWwgZGV0YWlscykuCisuVFAKKy5CIFwtcHJpbnRfbHNpbQorQ29tcHV0ZSBhbmQgcmVwb3J0IGxvY2FsIHNpbWlsYXJpdHkgbWV0cmljIChzdW0gb2YgbG93ZXN0IGVycm9yIGFtb25nc3QgdGhlCitjb2xsb2NhdGVkIHBpeGVsIG5laWdoYm9ycykuCisuVFAKKy5CIFwtcHJvZ3Jlc3MKK1JlcG9ydCBlbmNvZGluZyBwcm9ncmVzcyBpbiBwZXJjZW50LgorLlRQCisuQiBcLXF1aWV0CitEbyBub3QgcHJpbnQgYW55dGhpbmcuCisuVFAKKy5CIFwtc2hvcnQKK09ubHkgcHJpbnQgYnJpZWYgaW5mb3JtYXRpb24gKG91dHB1dCBmaWxlIHNpemUgYW5kIFBTTlIpIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorLlRQCisuQkkgXC1tYXAgIiBpbnQKK091dHB1dCBhZGRpdGlvbmFsIEFTQ0lJXC1tYXAgb2YgZW5jb2RpbmcgaW5mb3JtYXRpb24uIFBvc3NpYmxlIG1hcCB2YWx1ZXMKK3JhbmdlIGZyb20gMSB0byA2LiBUaGlzIGlzIG9ubHkgbWVhbnQgdG8gaGVscCBkZWJ1Z2dpbmcuCisKKy5TUyBBRERJVElPTkFMIE9QVElPTlMKK01vcmUgYWR2YW5jZWQgb3B0aW9ucyBhcmU6CisuVFAKKy5CSSBcLXMgIiB3aWR0aCBoZWlnaHQKK1NwZWNpZnkgdGhhdCB0aGUgaW5wdXQgZmlsZSBhY3R1YWxseSBjb25zaXN0cyBvZiByYXcgWSdDYkNyIHNhbXBsZXMgZm9sbG93aW5nCit0aGUgSVRVXC1SIEJULjYwMSByZWNvbW1lbmRhdGlvbiwgaW4gNDoyOjAgbGluZWFyIGZvcm1hdC4KK1RoZSBsdW1hIHBsYW5lIGhhcyBzaXplIFxmQndpZHRoXGZQIHggXGZCaGVpZ2h0XGZQLgorLlRQCisuQkkgXC1wcmUgIiBpbnQKK1NwZWNpZnkgc29tZSBwcmVwcm9jZXNzaW5nIHN0ZXBzLiBVc2luZyBhIHZhbHVlIG9mICcyJyB3aWxsIHRyaWdnZXIKK3F1YWxpdHlcLWRlcGVuZGVudCBwc2V1ZG9cLXJhbmRvbSBkaXRoZXJpbmcgZHVyaW5nIFJHQkFcLT5ZVVZBIGNvbnZlcnNpb24KKyhsb3NzeSBjb21wcmVzc2lvbiBvbmx5KS4KKy5UUAorLkJJIFwtYWxwaGFfZmlsdGVyICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBwcmVkaWN0aXZlIGZpbHRlcmluZyBtZXRob2QgZm9yIHRoZSBhbHBoYSBwbGFuZS4gT25lIG9mICdub25lJywKK1wmJ2Zhc3QnIG9yICdiZXN0JywgaW4gaW5jcmVhc2luZyBjb21wbGV4aXR5IGFuZCBzbG93bmVzcyBvcmRlci4gRGVmYXVsdCBpcworXCYnZmFzdCcuIEludGVybmFsbHksIGFscGhhIGZpbHRlcmluZyBpcyBwZXJmb3JtZWQgdXNpbmcgZm91ciBwb3NzaWJsZQorcHJlZGljdGlvbnMgKG5vbmUsIGhvcml6b250YWwsIHZlcnRpY2FsLCBncmFkaWVudCkuIFRoZSAnYmVzdCcgbW9kZSB3aWxsIHRyeQorZWFjaCBtb2RlIGluIHR1cm4gYW5kIHBpY2sgdGhlIG9uZSB3aGljaCBnaXZlcyB0aGUgc21hbGxlciBzaXplLiBUaGUgJ2Zhc3QnCittb2RlIHdpbGwganVzdCB0cnkgdG8gZm9ybSBhbiBhIHByaW9yaSBndWVzcyB3aXRob3V0IHRlc3RpbmcgYWxsIG1vZGVzLgorLlRQCisuQkkgXC1hbHBoYV9tZXRob2QgIiBpbnQKK1NwZWNpZnkgdGhlIGFsZ29yaXRobSB1c2VkIGZvciBhbHBoYSBjb21wcmVzc2lvbjogMCBvciAxLiBBbGdvcml0aG0gMCBkZW5vdGVzCitubyBjb21wcmVzc2lvbiwgMSB1c2VzIFdlYlAgbG9zc2xlc3MgZm9ybWF0IGZvciBjb21wcmVzc2lvbi4gVGhlIGRlZmF1bHQgaXMgMS4KKy5UUAorLkIgXC1leGFjdAorUHJlc2VydmUgUkdCIHZhbHVlcyBpbiB0cmFuc3BhcmVudCBhcmVhLiBUaGUgZGVmYXVsdCBpcyBvZmYsIHRvIGhlbHAKK2NvbXByZXNzaWJpbGl0eS4KKy5UUAorLkJJIFwtYmxlbmRfYWxwaGEgIiBpbnQKK1RoaXMgb3B0aW9uIGJsZW5kcyB0aGUgYWxwaGEgY2hhbm5lbCAoaWYgcHJlc2VudCkgd2l0aCB0aGUgc291cmNlIHVzaW5nIHRoZQorYmFja2dyb3VuZCBjb2xvciBzcGVjaWZpZWQgaW4gaGV4YWRlY2ltYWwgYXMgMHhycmdnYmIuIFRoZSBhbHBoYSBjaGFubmVsIGlzCithZnRlcndhcmQgcmVzZXQgdG8gdGhlIG9wYXF1ZSB2YWx1ZSAyNTUuCisuVFAKKy5CIFwtbm9hbHBoYQorVXNpbmcgdGhpcyBvcHRpb24gd2lsbCBkaXNjYXJkIHRoZSBhbHBoYSBjaGFubmVsLgorLlRQCisuQkkgXC1oaW50ICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBoaW50IGFib3V0IGlucHV0IGltYWdlIHR5cGUuIFBvc3NpYmxlIHZhbHVlcyBhcmU6CitcZkJwaG90b1xmUCwgXGZCcGljdHVyZVxmUCBvciBcZkJncmFwaFxmUC4KKy5UUAorLkJJIFwtbWV0YWRhdGEgIiBzdHJpbmcKK0EgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG8gY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmCitwcmVzZW50LgorVmFsaWQgdmFsdWVzOiBcZkJhbGxcZlAsIFxmQm5vbmVcZlAsIFxmQmV4aWZcZlAsIFxmQmljY1xmUCwgXGZCeG1wXGZQLgorVGhlIGRlZmF1bHQgaXMgXGZCbm9uZVxmUC4KKworTm90ZTogZWFjaCBpbnB1dCBmb3JtYXQgbWF5IG5vdCBzdXBwb3J0IGFsbCBjb21iaW5hdGlvbnMuCisuVFAKKy5CIFwtbm9hc20KK0Rpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnMuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmdcLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUworY3dlYnAgXC1xIDUwIC1sb3NzbGVzcyBwaWN0dXJlLnBuZyBcLW8gcGljdHVyZV9sb3NzbGVzcy53ZWJwCisuYnIKK2N3ZWJwIFwtcSA3MCBwaWN0dXJlX3dpdGhfYWxwaGEucG5nIFwtbyBwaWN0dXJlX3dpdGhfYWxwaGEud2VicAorLmJyCitjd2VicCBcLXNucyA3MCBcLWYgNTAgXC1zaXplIDYwMDAwIHBpY3R1cmUucG5nIFwtbyBwaWN0dXJlLndlYnAKKy5icgorY3dlYnAgXC1vIHBpY3R1cmUud2VicCBcLVwtIFwtXC1cLXBpY3R1cmUucG5nCisKKy5TSCBBVVRIT1JTCitcZkJjd2VicFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBQYXNjYWwgTWFzc2ltaW5vIDxwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbT4sCitmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgZHdlYnAgKDEpLAorLkJSIGdpZjJ3ZWJwICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZHdlYnAuMSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9kd2VicC4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YjYwZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vZHdlYnAuMQpAQCAtMCwwICsxLDE0OSBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggRFdFQlAgMSAiSnVuZSAyMywgMjAxNiIKKy5TSCBOQU1FCitkd2VicCBcLSBkZWNvbXByZXNzIGEgV2ViUCBmaWxlIHRvIGFuIGltYWdlIGZpbGUKKy5TSCBTWU5PUFNJUworLkIgZHdlYnAKKy5SSSBbIG9wdGlvbnMgXSAiIGlucHV0X2ZpbGUud2VicAorLmJyCisuU0ggREVTQ1JJUFRJT04KK1RoaXMgbWFudWFsIHBhZ2UgZG9jdW1lbnRzIHRoZQorLkIgZHdlYnAKK2NvbW1hbmQuCisuUFAKK1xmQmR3ZWJwXGZQIGRlY29tcHJlc3NlcyBXZWJQIGZpbGVzIGludG8gUE5HLCBQQU0sIFBQTSBvciBQR00gaW1hZ2VzLgorLlNIIE9QVElPTlMKK1RoZSBiYXNpYyBvcHRpb25zIGFyZToKKy5UUAorLkIgXC1oCitQcmludCB1c2FnZSBzdW1tYXJ5LgorLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciAoYXMgbWFqb3IubWlub3IucmV2aXNpb24pIGFuZCBleGl0LgorLlRQCisuQkkgXC1vICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgZmlsZSAoYXMgUE5HIGZvcm1hdCBieSBkZWZhdWx0KS4KK1VzaW5nICItIiBhcyBvdXRwdXQgbmFtZSB3aWxsIGRpcmVjdCBvdXRwdXQgdG8gJ3N0ZG91dCcuCisuVFAKKy5CSSBcLVwtICIgc3RyaW5nCitFeHBsaWNpdGx5IHNwZWNpZnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBpZiB0aGUgaW5wdXQKK2ZpbGUgc3RhcnRzIHdpdGggYW4gJ1wtJyBmb3IgaW5zdGFuY2UuIFRoaXMgb3B0aW9uIG11c3QgYXBwZWFyIFxmQmxhc3RcZlAuCitBbnkgb3RoZXIgb3B0aW9ucyBhZnRlcndhcmQgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGUgaW5wdXQgZmlsZSBpcyAiXC0iLAordGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gXGZJc3RkaW5cZlAgaW5zdGVhZCBvZiBhIGZpbGUuCisuVFAKKy5CIFwtYm1wCitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gdW5jb21wcmVzc2VkIEJNUC4KKy5UUAorLkIgXC10aWZmCitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gdW5jb21wcmVzc2VkIFRJRkYuCisuVFAKKy5CIFwtcGFtCitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gUEFNIChyZXRhaW5zIGFscGhhKS4KKy5UUAorLkIgXC1wcG0KK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byBQUE0gKGRpc2NhcmRzIGFscGhhKS4KKy5UUAorLkIgXC1wZ20KK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCB0byBQR00uIFRoZSBvdXRwdXQgY29uc2lzdHMgb2YgbHVtYS9jaHJvbWEKK3NhbXBsZXMgaW5zdGVhZCBvZiBSR0IsIHVzaW5nIHRoZSBJTUM0IGxheW91dC4gVGhpcyBvcHRpb24gaXMgbWFpbmx5Citmb3IgdmVyaWZpY2F0aW9uIGFuZCBkZWJ1Z2dpbmcgcHVycG9zZXMuCisuVFAKKy5CIFwteXV2CitDaGFuZ2UgdGhlIG91dHB1dCBmb3JtYXQgdG8gcmF3IFlVVi4gVGhlIG91dHB1dCBjb25zaXN0cyBvZgorbHVtYS9jaHJvbWEtVS9jaHJvbWEtViBzYW1wbGVzIGluc3RlYWQgb2YgUkdCLCBzYXZlZCBzZXF1ZW50aWFsbHkgYXMKK2luZGl2aWR1YWwgcGxhbmVzLiBUaGlzIG9wdGlvbiBpcyBtYWlubHkgZm9yIHZlcmlmaWNhdGlvbiBhbmQgZGVidWdnaW5nCitwdXJwb3Nlcy4KKy5UUAorLkIgXC1ub2ZhbmN5CitEb24ndCB1c2UgdGhlIGZhbmN5IHVwc2NhbGVyIGZvciBZVVY0MjAuIFRoaXMgbWF5IGxlYWQgdG8gamFnZ3kKK2VkZ2VzIChlc3BlY2lhbGx5IHRoZSByZWQgb25lcyksIGJ1dCBzaG91bGQgYmUgZmFzdGVyLgorLlRQCisuQiBcLW5vZmlsdGVyCitEb24ndCB1c2UgdGhlIGluLWxvb3AgZmlsdGVyaW5nIHByb2Nlc3MgZXZlbiBpZiBpdCBpcyByZXF1aXJlZCBieQordGhlIGJpdHN0cmVhbS4gVGhpcyBtYXkgcHJvZHVjZSB2aXNpYmxlIGJsb2NrcyBvbiB0aGUgbm9uLWNvbXBsaWFudCBvdXRwdXQsCitidXQgaXQgd2lsbCBtYWtlIHRoZSBkZWNvZGluZyBmYXN0ZXIuCisuVFAKKy5CSSBcLWRpdGhlciAiIHN0cmVuZ3RoCitTcGVjaWZ5IGEgZGl0aGVyaW5nIFxmQnN0cmVuZ3RoXGZQIGJldHdlZW4gMCBhbmQgMTAwLiBEaXRoZXJpbmcgaXMgYQorcG9zdC1wcm9jZXNzaW5nIGVmZmVjdCBhcHBsaWVkIHRvIGNocm9tYSBjb21wb25lbnRzIGluIGxvc3N5IGNvbXByZXNzaW9uLgorSXQgaGVscHMgYnkgc21vb3RoaW5nIGdyYWRpZW50cyBhbmQgYXZvaWRpbmcgYmFuZGluZyBhcnRpZmFjdHMuCisuVFAKKy5CSSBcLWFscGhhX2RpdGhlcgorSWYgdGhlIGNvbXByZXNzZWQgZmlsZSBjb250YWlucyBhIHRyYW5zcGFyZW5jeSBwbGFuZSB0aGF0IHdhcyBxdWFudGl6ZWQKK2R1cmluZyBjb21wcmVzc2lvbiwgdGhpcyBmbGFnIHdpbGwgYWxsb3cgZGl0aGVyaW5nIHRoZSByZWNvbnN0cnVjdGVkIHBsYW5lCitpbiBvcmRlciB0byBnZW5lcmF0ZSBzbW9vdGhlciB0cmFuc3BhcmVuY3kgZ3JhZGllbnRzLgorLlRQCisuQiBcLW5vZGl0aGVyCitEaXNhYmxlIGFsbCBkaXRoZXJpbmcgKGRlZmF1bHQpLgorLlRQCisuQiBcLW10CitVc2UgbXVsdGktdGhyZWFkaW5nIGZvciBkZWNvZGluZywgaWYgcG9zc2libGUuCisuVFAKKy5CSSBcLWNyb3AgIiB4X3Bvc2l0aW9uIHlfcG9zaXRpb24gd2lkdGggaGVpZ2h0CitDcm9wIHRoZSBkZWNvZGVkIHBpY3R1cmUgdG8gYSByZWN0YW5nbGUgd2l0aCB0b3AtbGVmdCBjb3JuZXIgYXQgY29vcmRpbmF0ZXMKKyhcZkJ4X3Bvc2l0aW9uXGZQLCBcZkJ5X3Bvc2l0aW9uXGZQKSBhbmQgc2l6ZSBcZkJ3aWR0aFxmUCB4IFxmQmhlaWdodFxmUC4KK1RoaXMgY3JvcHBpbmcgYXJlYSBtdXN0IGJlIGZ1bGx5IGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNvdXJjZSByZWN0YW5nbGUuCitUaGUgdG9wLWxlZnQgY29ybmVyIHdpbGwgYmUgc25hcHBlZCB0byBldmVuIGNvb3JkaW5hdGVzIGlmIG5lZWRlZC4KK1RoaXMgb3B0aW9uIGlzIG1lYW50IHRvIHJlZHVjZSB0aGUgbWVtb3J5IG5lZWRlZCBmb3IgY3JvcHBpbmcgbGFyZ2UgaW1hZ2VzLgorTm90ZTogdGhlIGNyb3BwaW5nIGlzIGFwcGxpZWQgXGZJYmVmb3JlXGZQIGFueSBzY2FsaW5nLgorLlRQCisuQiBcLWZsaXAKK0ZsaXAgZGVjb2RlZCBpbWFnZSB2ZXJ0aWNhbGx5IChjYW4gYmUgdXNlZnVsIGZvciBPcGVuR0wgdGV4dHVyZXMgZm9yIGluc3RhbmNlKS4KKy5UUAorXGZCXC1yZXNpemVcZlIsIFxmQlwtc2NhbGVcZkkgd2lkdGggaGVpZ2h0XGZSCitSZXNjYWxlIHRoZSBkZWNvZGVkIHBpY3R1cmUgdG8gZGltZW5zaW9uIFxmQndpZHRoXGZQIHggXGZCaGVpZ2h0XGZQLiBUaGlzCitvcHRpb24gaXMgbW9zdGx5IGludGVuZGVkIHRvIHJlZHVjaW5nIHRoZSBtZW1vcnkgbmVlZGVkIHRvIGRlY29kZSBsYXJnZSBpbWFnZXMsCit3aGVuIG9ubHkgYSBzbWFsbCB2ZXJzaW9uIGlzIG5lZWRlZCAodGh1bWJuYWlsLCBwcmV2aWV3LCBldGMuKS4gTm90ZTogc2NhbGluZworaXMgYXBwbGllZCBcZklhZnRlclxmUCBjcm9wcGluZy4KK0lmIGVpdGhlciAoYnV0IG5vdCBib3RoKSBvZiB0aGUgXGZCd2lkdGhcZlAgb3IgXGZCaGVpZ2h0XGZQIHBhcmFtZXRlcnMgaXMgMCwKK3RoZSB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQgcHJlc2VydmluZyB0aGUgYXNwZWN0LXJhdGlvLgorLlRQCisuQiBcLXF1aWV0CitEbyBub3QgcHJpbnQgYW55dGhpbmcuCisuVFAKKy5CIFwtdgorUHJpbnQgZXh0cmEgaW5mb3JtYXRpb24gKGRlY29kaW5nIHRpbWUgaW4gcGFydGljdWxhcikuCisuVFAKKy5CIFwtbm9hc20KK0Rpc2FibGUgYWxsIGFzc2VtYmx5IG9wdGltaXphdGlvbnMuCisKKy5TSCBCVUdTCitQbGVhc2UgcmVwb3J0IGFsbCBidWdzIHRvIHRoZSBpc3N1ZSB0cmFja2VyOgoraHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3dlYnAKKy5icgorUGF0Y2hlcyB3ZWxjb21lISBTZWUgdGhpcyBwYWdlIHRvIGdldCBzdGFydGVkOgoraHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvY29kZS9jb250cmlidXRlL3N1Ym1pdHRpbmctcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCitkd2VicCBwaWN0dXJlLndlYnAgXC1vIG91dHB1dC5wbmcKKy5icgorZHdlYnAgcGljdHVyZS53ZWJwIFwtcHBtIFwtbyBvdXRwdXQucHBtCisuYnIKK2R3ZWJwIFwtbyBvdXRwdXQucHBtIFwtXC0gXC1cLVwtcGljdHVyZS53ZWJwCisuYnIKK2NhdCBwaWN0dXJlLndlYnAgfCBkd2VicCBcLW8gXC0gXC1cLSBcLSA+IG91dHB1dC5wcG0KKworLlNIIEFVVEhPUlMKK1xmQmR3ZWJwXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFBhc2NhbCBNYXNzaW1pbm8gPHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tPiwKK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBjd2VicCAoMSksCisuQlIgZ2lmMndlYnAgKDEpLAorLkJSIHdlYnBtdXggKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KKy5TUyBPdXRwdXQgZmlsZSBmb3JtYXQgZGV0YWlscworUEFNOiBodHRwOi8vbmV0cGJtLnNvdXJjZWZvcmdlLm5ldC9kb2MvcGFtLmh0bWwKKy5icgorUEdNOiBodHRwOi8vbmV0cGJtLnNvdXJjZWZvcmdlLm5ldC9kb2MvcGdtLmh0bWwKKy5icgorUFBNOiBodHRwOi8vbmV0cGJtLnNvdXJjZWZvcmdlLm5ldC9kb2MvcHBtLmh0bWwKKy5icgorUE5HOiBodHRwOi8vd3d3LmxpYnBuZy5vcmcvcHViL3BuZy9wbmctc2l0ZW1hcC5odG1sI2luZm8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9naWYyd2VicC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2dpZjJ3ZWJwLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0ZjJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9naWYyd2VicC4xCkBAIC0wLDAgKzEsMTY0IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBHSUYyV0VCUCAxICJKYW51YXJ5IDI1LCAyMDE4IgorLlNIIE5BTUUKK2dpZjJ3ZWJwIFwtIENvbnZlcnQgYSBHSUYgaW1hZ2UgdG8gV2ViUAorLlNIIFNZTk9QU0lTCisuQiBnaWYyd2VicAorLlJJIFsgb3B0aW9ucyBdICIgaW5wdXRfZmlsZS5naWYgXC1vIG91dHB1dF9maWxlLndlYnAKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIGdpZjJ3ZWJwCitjb21tYW5kLgorLlBQCitcZkJnaWYyd2VicFxmUCBjb252ZXJ0cyBhIEdJRiBpbWFnZSB0byBhIFdlYlAgaW1hZ2UuCisuU0ggT1BUSU9OUworVGhlIGJhc2ljIG9wdGlvbnMgYXJlOgorLlRQCisuQkkgXC1vICIgc3RyaW5nCitTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBvdXRwdXQgV2ViUCBmaWxlLiBJZiBvbWl0dGVkLCBcZkJnaWYyd2VicFxmUCB3aWxsCitwZXJmb3JtIGNvbnZlcnNpb24gYnV0IG9ubHkgcmVwb3J0IHN0YXRpc3RpY3MuCitVc2luZyAiXC0iIGFzIG91dHB1dCBuYW1lIHdpbGwgZGlyZWN0IG91dHB1dCB0byAnc3Rkb3V0Jy4KKy5UUAorLkJJIFwtXC0gIiBzdHJpbmcKK0V4cGxpY2l0bHkgc3BlY2lmeSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHRoZSBpbnB1dAorZmlsZSBzdGFydHMgd2l0aCBhbiAnXC0nIGZvciBpbnN0YW5jZS4gVGhpcyBvcHRpb24gbXVzdCBhcHBlYXIgXGZCbGFzdFxmUC4KK0FueSBvdGhlciBvcHRpb25zIGFmdGVyd2FyZCB3aWxsIGJlIGlnbm9yZWQuIElmIHRoZSBpbnB1dCBmaWxlIGlzICJcLSIsCit0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBcZklzdGRpblxmUCBpbnN0ZWFkIG9mIGEgZmlsZS4KKy5UUAorLkIgXC1oLCBcLWhlbHAKK1VzYWdlIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciAoYXMgbWFqb3IubWlub3IucmV2aXNpb24pIGFuZCBleGl0LgorLlRQCisuQiBcLWxvc3N5CitFbmNvZGUgdGhlIGltYWdlIHVzaW5nIGxvc3N5IGNvbXByZXNzaW9uLgorLlRQCisuQiBcLW1peGVkCitNaXhlZCBjb21wcmVzc2lvbiBtb2RlOiBvcHRpbWl6ZSBjb21wcmVzc2lvbiBvZiB0aGUgaW1hZ2UgYnkgcGlja2luZyBlaXRoZXIKK2xvc3N5IG9yIGxvc3NsZXNzIGNvbXByZXNzaW9uIGZvciBlYWNoIGZyYW1lIGhldXJpc3RpY2FsbHkuCisuVFAKKy5CSSBcLXEgIiBmbG9hdAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gZmFjdG9yIGZvciBSR0IgY2hhbm5lbHMgYmV0d2VlbiAwIGFuZCAxMDAuIFRoZSBkZWZhdWx0CitpcyA3NS4KKy5icgorSW4gY2FzZSBvZiBsb3NzbGVzcyBjb21wcmVzc2lvbiAoZGVmYXVsdCksIGEgc21hbGwgZmFjdG9yIGVuYWJsZXMgZmFzdGVyCitjb21wcmVzc2lvbiBzcGVlZCwgYnV0IHByb2R1Y2VzIGEgbGFyZ2VyIGZpbGUuIE1heGltdW0gY29tcHJlc3Npb24gaXMgYWNoaWV2ZWQKK2J5IHVzaW5nIGEgdmFsdWUgb2YgMTAwLgorLmJyCitJbiBjYXNlIG9mIGxvc3N5IGNvbXByZXNzaW9uIChzcGVjaWZpZWQgYnkgdGhlIFwtbG9zc3kgb3B0aW9uKSwgYSBzbWFsbCBmYWN0b3IKK3Byb2R1Y2VzIGEgc21hbGxlciBmaWxlIHdpdGggbG93ZXIgcXVhbGl0eS4gQmVzdCBxdWFsaXR5IGlzIGFjaGlldmVkIGJ5IHVzaW5nIGEKK3ZhbHVlIG9mIDEwMC4KKy5UUAorLkJJIFwtbSAiIGludAorU3BlY2lmeSB0aGUgY29tcHJlc3Npb24gbWV0aG9kIHRvIHVzZS4gVGhpcyBwYXJhbWV0ZXIgY29udHJvbHMgdGhlCit0cmFkZSBvZmYgYmV0d2VlbiBlbmNvZGluZyBzcGVlZCBhbmQgdGhlIGNvbXByZXNzZWQgZmlsZSBzaXplIGFuZCBxdWFsaXR5LgorUG9zc2libGUgdmFsdWVzIHJhbmdlIGZyb20gMCB0byA2LiBEZWZhdWx0IHZhbHVlIGlzIDQuCitXaGVuIGhpZ2hlciB2YWx1ZXMgYXJlIHVzZWQsIHRoZSBlbmNvZGVyIHdpbGwgc3BlbmQgbW9yZSB0aW1lIGluc3BlY3RpbmcKK2FkZGl0aW9uYWwgZW5jb2RpbmcgcG9zc2liaWxpdGllcyBhbmQgZGVjaWRlIG9uIHRoZSBxdWFsaXR5IGdhaW4uCitMb3dlciB2YWx1ZSBjYW4gcmVzdWx0IGlzIGZhc3RlciBwcm9jZXNzaW5nIHRpbWUgYXQgdGhlIGV4cGVuc2Ugb2YKK2xhcmdlciBmaWxlIHNpemUgYW5kIGxvd2VyIGNvbXByZXNzaW9uIHF1YWxpdHkuCisuVFAKKy5CSSBcLW1pbl9zaXplCitFbmNvZGUgaW1hZ2UgdG8gYWNoaWV2ZSBzbWFsbGVzdCBzaXplLiBUaGlzIGRpc2FibGVzIGtleSBmcmFtZSBpbnNlcnRpb24gYW5kCitwaWNrcyB0aGUgZGlzcG9zZSBtZXRob2QgcmVzdWx0aW5nIGluIHNtYWxsZXN0IG91dHB1dCBmb3IgZWFjaCBmcmFtZS4gSXQgdXNlcworbG9zc2xlc3MgY29tcHJlc3Npb24gYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFwtcSwgXC1tLCBcLWxvc3N5IG9yCitcLW1peGVkIG9wdGlvbnMuCisuVFAKKy5CSSBcLWttaW4gIiBpbnQKKy5UUAorLkJJIFwta21heCAiIGludAorU3BlY2lmeSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGtleSBmcmFtZXMKKyhpbmRlcGVuZGVudGx5IGRlY29kYWJsZSBmcmFtZXMpIGluIHRoZSBvdXRwdXQgYW5pbWF0aW9uLiBUaGUgdG9vbCB3aWxsIGluc2VydAorc29tZSBrZXkgZnJhbWVzIGludG8gdGhlIG91dHB1dCBhbmltYXRpb24gYXMgbmVlZGVkIHNvIHRoYXQgdGhpcyBjcml0ZXJpYSBpcworc2F0aXNmaWVkLgorLmJyCitBICdrbWF4JyB2YWx1ZSBvZiAwIHdpbGwgdHVybiBvZmYgaW5zZXJ0aW9uIG9mIGtleSBmcmFtZXMuIEEgJ2ttYXgnIHZhbHVlIG9mIDEKK3dpbGwgcmVzdWx0IGluIGFsbCBmcmFtZXMgYmVpbmcga2V5IGZyYW1lcy4gJ2ttaW4nIHZhbHVlIGlzIG5vdCB0YWtlbiBpbnRvCithY2NvdW50IGluIGJvdGggdGhlc2Ugc3BlY2lhbCBjYXNlcy4KK1R5cGljYWwgdmFsdWVzIGFyZSBpbiB0aGUgcmFuZ2UgMyB0byAzMC4gRGVmYXVsdCB2YWx1ZXMgYXJlIGttaW4gPSA5LAora21heCA9IDE3IGZvciBsb3NzbGVzcyBjb21wcmVzc2lvbiBhbmQga21pbiA9IDMsIGttYXggPSA1IGZvciBsb3NzeSBjb21wcmVzc2lvbi4KKy5icgorVGhlc2UgdHdvIG9wdGlvbnMgYXJlIHJlbGV2YW50IG9ubHkgZm9yIGFuaW1hdGVkIGltYWdlcyB3aXRoIGxhcmdlIG51bWJlciBvZgorZnJhbWVzICg+NTApLgorLmJyCitXaGVuIGxvd2VyIHZhbHVlcyBhcmUgdXNlZCwgbW9yZSBmcmFtZXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8ga2V5IGZyYW1lcy4gVGhpcworbWF5IGxlYWQgdG8gc21hbGxlciBudW1iZXIgb2YgZnJhbWVzIHJlcXVpcmVkIHRvIGRlY29kZSBhIGZyYW1lIG9uIGF2ZXJhZ2UsCit0aGVyZWJ5IGltcHJvdmluZyB0aGUgZGVjb2RpbmcgcGVyZm9ybWFuY2UuIEJ1dCB0aGlzIG1heSBsZWFkIHRvIHNsaWdodGx5IGJpZ2dlcgorZmlsZSBzaXplcy4KK0hpZ2hlciB2YWx1ZXMgbWF5IGxlYWQgdG8gd29yc2UgZGVjb2RpbmcgcGVyZm9ybWFuY2UsIGJ1dCBzbWFsbGVyIGZpbGUgc2l6ZXMuCisuYnIKK1NvbWUgcmVzdHJpY3Rpb25zOgorLmJyCisoaSkga21pbiA8IGttYXgsCisuYnIKKyhpaSkga21pbiA+PSBrbWF4IC8gMiArIDEgYW5kCisuYnIKKyhpaWkpIGttYXggLSBrbWluIDw9IDMwLgorLmJyCitJZiBhbnkgb2YgdGhlc2UgcmVzdHJpY3Rpb25zIGFyZSBub3QgbWV0LCB0aGV5IHdpbGwgYmUgZW5mb3JjZWQgYXV0b21hdGljYWxseS4KKy5UUAorLkJJIFwtbWV0YWRhdGEgIiBzdHJpbmcKK0EgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbWV0YWRhdGEgdG8gY29weSBmcm9tIHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0IGlmCitwcmVzZW50LgorVmFsaWQgdmFsdWVzOiBcZkJhbGxcZlAsIFxmQm5vbmVcZlAsIFxmQmljY1xmUCwgXGZCeG1wXGZQLgorVGhlIGRlZmF1bHQgaXMgXGZCeG1wXGZQLgorLlRQCisuQkkgXC1mICIgaW50CitGb3IgbG9zc3kgZW5jb2Rpbmcgb25seSAoc3BlY2lmaWVkIGJ5IHRoZSBcLWxvc3N5IG9wdGlvbikuIFNwZWNpZnkgdGhlIHN0cmVuZ3RoCitvZiB0aGUgZGVibG9ja2luZyBmaWx0ZXIsIGJldHdlZW4gMCAobm8gZmlsdGVyaW5nKSBhbmQgMTAwIChtYXhpbXVtIGZpbHRlcmluZykuCitBIHZhbHVlIG9mIDAgd2lsbCB0dXJuIG9mZiBhbnkgZmlsdGVyaW5nLiBIaWdoZXIgdmFsdWUgd2lsbCBpbmNyZWFzZSB0aGUKK3N0cmVuZ3RoIG9mIHRoZSBmaWx0ZXJpbmcgcHJvY2VzcyBhcHBsaWVkIGFmdGVyIGRlY29kaW5nIHRoZSBwaWN0dXJlLiBUaGUgaGlnaGVyCit0aGUgdmFsdWUgdGhlIHNtb290aGVyIHRoZSBwaWN0dXJlIHdpbGwgYXBwZWFyLiBUeXBpY2FsIHZhbHVlcyBhcmUgdXN1YWxseSBpbgordGhlIHJhbmdlIG9mIDIwIHRvIDUwLgorLlRQCisuQiBcLW10CitVc2UgbXVsdGktdGhyZWFkaW5nIGZvciBlbmNvZGluZywgaWYgcG9zc2libGUuCisuVFAKKy5CIFwtbG9vcF9jb21wYXRpYmlsaXR5CitJZiBlbmFibGVkLCBoYW5kbGUgdGhlIGxvb3AgaW5mb3JtYXRpb24gaW4gYSBjb21wYXRpYmxlIGZhc2hpb24gZm9yIENocm9tZQordmVyc2lvbiBwcmlvciB0byBNNjIgKGluY2x1c2l2ZSkgYW5kIEZpcmVmb3guCisuVFAKKy5CIFwtdgorUHJpbnQgZXh0cmEgaW5mb3JtYXRpb24uCisuVFAKKy5CIFwtcXVpZXQKK0RvIG5vdCBwcmludCBhbnl0aGluZy4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZy1wYXRjaGVzLworCisuU0ggRVhBTVBMRVMKK2dpZjJ3ZWJwIHBpY3R1cmUuZ2lmIFwtbyBwaWN0dXJlLndlYnAKKy5icgorZ2lmMndlYnAgXC1xIDcwIHBpY3R1cmUuZ2lmIFwtbyBwaWN0dXJlLndlYnAKKy5icgorZ2lmMndlYnAgXC1sb3NzeSBcLW0gMyBwaWN0dXJlLmdpZiBcLW8gcGljdHVyZV9sb3NzeS53ZWJwCisuYnIKK2dpZjJ3ZWJwIFwtbG9zc3kgXC1mIDUwIHBpY3R1cmUuZ2lmIFwtbyBwaWN0dXJlLndlYnAKKy5icgorZ2lmMndlYnAgXC1xIDcwIFwtbyBwaWN0dXJlLndlYnAgXC1cLSBcLVwtXC1waWN0dXJlLmdpZgorLmJyCitjYXQgcGljdHVyZS5naWYgfCBnaWYyd2VicCBcLW8gXC0gXC1cLSBcLSA+IG91dHB1dC53ZWJwCisKKy5TSCBBVVRIT1JTCitcZkJnaWYyd2VicFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBVcnZhbmcgSm9zaGkgPHVydmFuZ0Bnb29nbGUuY29tPiwgZm9yIHRoZQorRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiBjd2VicCAoMSksCisuQlIgZHdlYnAgKDEpLAorLkJSIHdlYnBtdXggKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9pbWcyd2VicC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL2ltZzJ3ZWJwLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZDkxZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi9pbWcyd2VicC4xCkBAIC0wLDAgKzEsMTA1IEBACisuXCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleSwgRU1BQ1M6IC0qLSBucm9mZiAtKi0KKy5USCBJTUcyV0VCUCAxICJBcHJpbCAzLCAyMDE4IgorLlNIIE5BTUUKK2ltZzJ3ZWJwIFwtIGNyZWF0ZSBhbmltYXRlZCBXZWJQIGZpbGUgZnJvbSBhIHNlcXVlbmNlIG9mIGlucHV0IGltYWdlcy4KKy5TSCBTWU5PUFNJUworLkIgaW1nMndlYnAKK1tmaWxlX2xldmVsX29wdGlvbnNdIFtmaWxlc10gW3Blcl9mcmFtZV9vcHRpb25zLi4uXQorLmJyCisuQiBpbWcyd2VicCBhcmd1bWVudF9maWxlX25hbWUKKy5icgorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIGltZzJ3ZWJwCitjb21tYW5kLgorLlBQCitcZkJpbWcyd2VicFxmUCBjb21wcmVzc2VzIGEgc2VxdWVuY2Ugb2YgaW1hZ2VzIHVzaW5nIHRoZSBhbmltYXRlZCBXZWJQIGZvcm1hdC4KK0lucHV0IGltYWdlcyBjYW4gZWl0aGVyIGJlIFBORywgSlBFRywgVElGRiBvciBXZWJQLgorSWYgYSBzaW5nbGUgZmlsZSBuYW1lIChub3Qgc3RhcnRpbmcgd2l0aCB0aGUgY2hhcmFjdGVyICdcLScpIGlzIHN1cHBsaWVkIGFzCit0aGUgYXJndW1lbnQsIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgYXJlIGFjdHVhbGx5IHRva2VuaXplZCBmcm9tIHRoaXMgZmlsZS4KK1RoaXMgYWxsb3dzIGZvciBlYXN5IHNjcmlwdGluZyBvciB1c2luZyBsYXJnZSBudW1iZXIgb2YgYXJndW1lbnRzLgorLlNIIEZJTEUtTEVWRUwgT1BUSU9OUworVGhlIGZpbGUtbGV2ZWwgb3B0aW9ucyBhcmUgYXBwbGllZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb21wcmVzc2lvbiBwcm9jZXNzLAorYmVmb3JlIHRoZSBpbnB1dCBmcmFtZXMgYXJlIHJlYWQuCisuVFAKKy5CSSBcLW8gIiBzdHJpbmcKK1NwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIG91dHB1dCBXZWJQIGZpbGUuCisuVFAKKy5CSSBcLW1pbl9zaXplCitFbmNvZGUgaW1hZ2VzIHRvIGFjaGlldmUgc21hbGxlc3Qgc2l6ZS4gVGhpcyBkaXNhYmxlcyBrZXkgZnJhbWUgaW5zZXJ0aW9uIGFuZAorcGlja3MgdGhlIHBhcmFtZXRlcnMgcmVzdWx0aW5nIGluIHNtYWxsZXN0IG91dHB1dCBmb3IgZWFjaCBmcmFtZS4gSXQgdXNlcworbG9zc2xlc3MgY29tcHJlc3Npb24gYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBjb21iaW5lZCB3aXRoIFwtcSwgXC1tLCBcLWxvc3N5IG9yCitcLW1peGVkIG9wdGlvbnMuCisuVFAKKy5CSSBcLWttaW4gIiBpbnQKKy5UUAorLkJJIFwta21heCAiIGludAorU3BlY2lmeSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkaXN0YW5jZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGtleSBmcmFtZXMKKyhpbmRlcGVuZGVudGx5IGRlY29kYWJsZSBmcmFtZXMpIGluIHRoZSBvdXRwdXQgYW5pbWF0aW9uLiBUaGUgdG9vbCB3aWxsIGluc2VydAorc29tZSBrZXkgZnJhbWVzIGludG8gdGhlIG91dHB1dCBhbmltYXRpb24gYXMgbmVlZGVkIHNvIHRoYXQgdGhpcyBjcml0ZXJpYSBpcworc2F0aXNmaWVkLgorLmJyCisuQiBcLW1peGVkCitNaXhlZCBjb21wcmVzc2lvbiBtb2RlOiBvcHRpbWl6ZSBjb21wcmVzc2lvbiBvZiB0aGUgaW1hZ2UgYnkgcGlja2luZyBlaXRoZXIKK2xvc3N5IG9yIGxvc3NsZXNzIGNvbXByZXNzaW9uIGZvciBlYWNoIGZyYW1lIGhldXJpc3RpY2FsbHkuIFRoaXMgZ2xvYmFsCitvcHRpb24gZGlzYWJsZXMgdGhlIGxvY2FsIG9wdGlvbiBcZkItbG9zc3lcZlAgYW5kIFxmQi1sb3NzbGVzc1xmUCAuCisuVFAKKy5CSSBcLWxvb3AgIiBpbnQKK1NwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhbmltYXRpb24gc2hvdWxkIGxvb3AuIFVzaW5nICcwJworbWVhbnMgJ2xvb3AgaW5kZWZpbml0ZWx5Jy4KKy5UUAorLkJJIFwtdgorQmUgbW9yZSB2ZXJib3NlLgorLlRQCisuQiBcLWgsIFwtaGVscAorQSBzaG9ydCB1c2FnZSBzdW1tYXJ5LgorLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIHJlbGV2YW50IGxpYnJhcmllcyB1c2VkLgorCisuU0ggUEVSLUZSQU1FIE9QVElPTlMKK1RoZSBwZXItZnJhbWUgb3B0aW9ucyBhcmUgYXBwbGllZCBmb3IgdGhlIGltYWdlcyBmb2xsb3dpbmcgYXMgYXJndW1lbnRzIGluIHRoZQorY29tbWFuZCBsaW5lLiBUaGV5IGNhbiBiZSBtb2RpZmllZCBhbnkgbnVtYmVyIG9mIHRpbWVzIHByZWNlZGluZyBlYWNoIHBhcnRpY3VsYXIKK2lucHV0IGltYWdlLgorLlRQCisuQkkgXC1kICIgaW50CitTcGVjaWZ5IHRoZSBpbWFnZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMuCisuVFAKKy5CIFwtbG9zc2xlc3MsIFwtbG9zc3kKK0NvbXByZXNzIHRoZSBuZXh0IGltYWdlKHMpIHVzaW5nIGxvc3NsZXNzIG9yIGxvc3N5IGNvbXByZXNzaW9uIG1vZGUuIFRoZQorZGVmYXVsdCBtb2RlIGlzIGxvc3NsZXNzLgorLlRQCisuQkkgXC1xICIgZmxvYXQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIGZhY3RvciBiZXR3ZWVuIDAgYW5kIDEwMC4gVGhlIGRlZmF1bHQgaXMgNzUuCisuVFAKKy5CSSBcLW0gIiBpbnQKK1NwZWNpZnkgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCB0byB1c2UuIFRoaXMgcGFyYW1ldGVyIGNvbnRyb2xzIHRoZQordHJhZGUgb2ZmIGJldHdlZW4gZW5jb2Rpbmcgc3BlZWQgYW5kIHRoZSBjb21wcmVzc2VkIGZpbGUgc2l6ZSBhbmQgcXVhbGl0eS4KK1Bvc3NpYmxlIHZhbHVlcyByYW5nZSBmcm9tIDAgdG8gNi4gRGVmYXVsdCB2YWx1ZSBpcyA0LgorCisuU0ggRVhBTVBMRQoraW1nMndlYnAgLWxvb3AgMiBpbjAucG5nIC1sb3NzeSBpbjEuanBnIC1kIDgwIGluMi50aWZmIC1vIG91dC53ZWJwCisuYnIKKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZ1wtcGF0Y2hlcy8KKworLlNIIEFVVEhPUlMKK1xmQmltZzJ3ZWJwXGZQIGlzIGEgcGFydCBvZiBsaWJ3ZWJwIGFuZCB3YXMgd3JpdHRlbiBieSB0aGUgV2ViUCB0ZWFtLgorLmJyCitUaGUgbGF0ZXN0IHNvdXJjZSB0cmVlIGlzIGF2YWlsYWJsZSBhdAoraHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL3dlYm0vbGlid2VicAorLlBQCitUaGlzIG1hbnVhbCBwYWdlIHdhcyB3cml0dGVuIGJ5IFBhc2NhbCBNYXNzaW1pbm8gPHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tPiwKK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiB3ZWJwbXV4ICgxKSwKKy5CUiBnaWYyd2VicCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3Z3ZWJwLjEgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vdndlYnAuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMzNDZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3Z3ZWJwLjEKQEAgLTAsMCArMSw5NCBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggVldFQlAgMSAiTm92ZW1iZXIgMjUsIDIwMTYiCisuU0ggTkFNRQordndlYnAgXC0gZGVjb21wcmVzcyBhIFdlYlAgZmlsZSBhbmQgZGlzcGxheSBpdCBpbiBhIHdpbmRvdworLlNIIFNZTk9QU0lTCisuQiB2d2VicAorLlJJIFsgb3B0aW9ucyBdICIgaW5wdXRfZmlsZS53ZWJwCisuYnIKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiB2d2VicAorY29tbWFuZC4KKy5QUAorXGZCdndlYnBcZlAgZGVjb21wcmVzc2VzIGEgV2ViUCBmaWxlIGFuZCBkaXNwbGF5cyBpdCBpbiBhIHdpbmRvdyB1c2luZyBPcGVuR0wuCisuU0ggT1BUSU9OUworLlRQCisuQiBcLWgKK1ByaW50IHVzYWdlIHN1bW1hcnkuCisuVFAKKy5CIFwtdmVyc2lvbgorUHJpbnQgdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQuCisuVFAKKy5CIFwtbm9pY2MKK0Rvbid0IHVzZSB0aGUgSUNDIHByb2ZpbGUgaWYgcHJlc2VudC4KKy5UUAorLkIgXC1ub2ZhbmN5CitEb24ndCB1c2UgdGhlIGZhbmN5IFlVVjQyMCB1cHNjYWxlci4KKy5UUAorLkIgXC1ub2ZpbHRlcgorRGlzYWJsZSBpbi1sb29wIGZpbHRlcmluZy4KKy5UUAorLkJJIFwtZGl0aGVyICIgc3RyZW5ndGgKK1NwZWNpZnkgYSBkaXRoZXJpbmcgXGZCc3RyZW5ndGhcZlAgYmV0d2VlbiAwIGFuZCAxMDAuIERpdGhlcmluZyBpcyBhCitwb3N0LXByb2Nlc3NpbmcgZWZmZWN0IGFwcGxpZWQgdG8gY2hyb21hIGNvbXBvbmVudHMgaW4gbG9zc3kgY29tcHJlc3Npb24uCitJdCBoZWxwcyBieSBzbW9vdGhpbmcgZ3JhZGllbnRzIGFuZCBhdm9pZGluZyBiYW5kaW5nIGFydGlmYWN0cy4gRGVmYXVsdDogNTAuCisuVFAKKy5CSSBcLW5vYWxwaGFkaXRoZXIKK0J5IGRlZmF1bHQsIHF1YW50aXplZCB0cmFuc3BhcmVuY3kgcGxhbmVzIGFyZSBkaXRoZXJlZCBkdXJpbmcgZGVjb21wcmVzc2lvbiwKK3RvIHNtb290aCB0aGUgZ3JhZGllbnRzLiBUaGlzIGZsYWcgd2lsbCBwcmV2ZW50IHRoaXMgZGl0aGVyaW5nLgorLlRQCisuQiBcLW10CitVc2UgbXVsdGktdGhyZWFkaW5nIGZvciBkZWNvZGluZywgaWYgcG9zc2libGUuCisuVFAKKy5CIFwtaW5mbworRGlzcGxheSBpbWFnZSBpbmZvcm1hdGlvbiBvbiB0b3Agb2YgdGhlIGRlY29kZWQgaW1hZ2UuCisuVFAKKy5CSSBcLVwtICIgc3RyaW5nCitFeHBsaWNpdGx5IHNwZWNpZnkgdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCBpZiB0aGUgaW5wdXQKK2ZpbGUgc3RhcnRzIHdpdGggYW4gJ1wtJyBmb3IgaW5zdGFuY2UuIFRoaXMgb3B0aW9uIG11c3QgYXBwZWFyIFxmQmxhc3RcZlAuCitBbnkgb3RoZXIgb3B0aW9ucyBhZnRlcndhcmQgd2lsbCBiZSBpZ25vcmVkLiBJZiB0aGUgaW5wdXQgZmlsZSBpcyAiXC0iLAordGhlIGRhdGEgd2lsbCBiZSByZWFkIGZyb20gXGZJc3RkaW5cZlAgaW5zdGVhZCBvZiBhIGZpbGUuCisuVFAKKworLlNIIEtFWUJPQVJEIFNIT1JUQ1VUUworLlRQCisuQiAnYycKK1RvZ2dsZSB1c2Ugb2YgY29sb3IgcHJvZmlsZS4KKy5UUAorLkIgJ2knCitPdmVybGF5IGZpbGUgaW5mb3JtYXRpb24uCisuVFAKKy5CICdkJworRGlzYWJsZSBibGVuZGluZyBhbmQgZGlzcG9zYWwgcHJvY2VzcywgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKy5UUAorLkIgJ3EnIC8gJ1EnIC8gRVNDCitRdWl0LgorCisuU0ggQlVHUworUGxlYXNlIHJlcG9ydCBhbGwgYnVncyB0byB0aGUgaXNzdWUgdHJhY2tlcjoKK2h0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC93ZWJwCisuYnIKK1BhdGNoZXMgd2VsY29tZSEgU2VlIHRoaXMgcGFnZSB0byBnZXQgc3RhcnRlZDoKK2h0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL2NvZGUvY29udHJpYnV0ZS9zdWJtaXR0aW5nLXBhdGNoZXMvCisKKy5TSCBFWEFNUExFUwordndlYnAgcGljdHVyZS53ZWJwCisuYnIKK3Z3ZWJwIHBpY3R1cmUud2VicCAtbXQgLWRpdGhlciAwCisuYnIKK3Z3ZWJwIFwtXC0gXC1cLVwtcGljdHVyZS53ZWJwCisKKy5TSCBBVVRIT1JTCitcZkJ2d2VicFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgZHdlYnAgKDEpCisuYnIKK1BsZWFzZSByZWZlciB0byBodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAvIGZvciBhZGRpdGlvbmFsCitpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwaW5mby4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBpbmZvLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyYmE5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL21hbi93ZWJwaW5mby4xCkBAIC0wLDAgKzEsODAgQEAKKy5cIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV5LCBFTUFDUzogLSotIG5yb2ZmIC0qLQorLlRIIFdFQlBJTkZPIDEgIk5vdmVtYmVyIDI0LCAyMDE3IgorLlNIIE5BTUUKK3dlYnBpbmZvIFwtIHByaW50IG91dCB0aGUgY2h1bmsgbGV2ZWwgc3RydWN0dXJlIG9mIFdlYlAgZmlsZXMKK2Fsb25nIHdpdGggYmFzaWMgaW50ZWdyaXR5IGNoZWNrcy4KKy5TSCBTWU5PUFNJUworLkIgd2VicGluZm8KKy5JIE9QVElPTlMKKy5JIElOUFVUCisuYnIKKy5CIHdlYnBpbmZvIFtcLWh8XC1oZWxwfFwtSHxcLWxvbmdoZWxwXQorLmJyCisKKy5TSCBERVNDUklQVElPTgorVGhpcyBtYW51YWwgcGFnZSBkb2N1bWVudHMgdGhlCisuQiB3ZWJwaW5mbworY29tbWFuZC4KKy5QUAorXGZCd2VicGluZm9cZlAgY2FuIGJlIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSBjaHVuayBsZXZlbCBzdHJ1Y3R1cmUgYW5kIGJpdHN0cmVhbQoraGVhZGVyIGluZm9ybWF0aW9uIG9mIFdlYlAgZmlsZXMuIEl0IGNhbiBhbHNvIGNoZWNrIGlmIHRoZSBmaWxlcyBhcmUgb2YgdmFsaWQKK1dlYlAgZm9ybWF0LgorCisuU0ggT1BUSU9OUworLlRQCisuQiBcLXZlcnNpb24KK1ByaW50IHRoZSB2ZXJzaW9uIG51bWJlciAoYXMgbWFqb3IubWlub3IucmV2aXNpb24pIGFuZCBleGl0LgorLlRQCisuQiBcLXF1aWV0CitEbyBub3Qgc2hvdyBjaHVuayBwYXJzaW5nIGluZm9ybWF0aW9uLgorLlRQCisuQiBcLWRpYWcKK1Nob3cgcGFyc2luZyBlcnJvciBkaWFnbm9zaXMuCisuVFAKKy5CIFwtc3VtbWFyeQorU2hvdyBjaHVuayBzdGF0cyBzdW1tYXJ5LgorLlRQCisuQkkgXC1iaXRzdHJlYW1faW5mbworUGFyc2UgYml0c3RyZWFtIGhlYWRlci4KKy5UUAorLkIgXC1oLCBcLWhlbHAKK0Egc2hvcnQgdXNhZ2Ugc3VtbWFyeS4KKy5UUAorLkIgXC1ILCBcLWxvbmdoZWxwCitEZXRhaWxlZCB1c2FnZSBpbnN0cnVjdGlvbnMuCisKKy5TSCBJTlBVVAorSW5wdXQgZmlsZXMgaW4gV2ViUCBmb3JtYXQuIElucHV0IGZpbGVzIG11c3QgY29tZSBsYXN0LCBmb2xsb3dpbmcKK29wdGlvbnMgKGlmIGFueSkuIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBpbnB1dCBmaWxlcy4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZ1wtcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCisuYnIKK3dlYnBpbmZvIFwtaAorLmJyCit3ZWJwaW5mbyBcLWRpYWcgXC1zdW1tYXJ5IGlucHV0X2ZpbGUud2VicAorLmJyCit3ZWJwaW5mbyBcLWJpdHN0cmVhbV9pbmZvIGlucHV0X2ZpbGVfMS53ZWJwIGlucHV0X2ZpbGVfMi53ZWJwCisuYnIKK3dlYnBpbmZvICoud2VicAorCisuU0ggQVVUSE9SUworXGZCd2VicGluZm9cZlAgaXMgYSBwYXJ0IG9mIGxpYndlYnAgYW5kIHdhcyB3cml0dGVuIGJ5IHRoZSBXZWJQIHRlYW0uCisuYnIKK1RoZSBsYXRlc3Qgc291cmNlIHRyZWUgaXMgYXZhaWxhYmxlIGF0CitodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vd2VibS9saWJ3ZWJwCisuUFAKK1RoaXMgbWFudWFsIHBhZ2Ugd2FzIHdyaXR0ZW4gYnkgSHVpIFN1IDxodWlzdUBnb29nbGUuY29tPiwKK2ZvciB0aGUgRGViaWFuIHByb2plY3QgKGFuZCBtYXkgYmUgdXNlZCBieSBvdGhlcnMpLgorCisuU0ggU0VFIEFMU08KKy5CUiB3ZWJwbXV4ICgxKQorLmJyCitQbGVhc2UgcmVmZXIgdG8gaHR0cDovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9zcGVlZC93ZWJwLyBmb3IgYWRkaXRpb25hbAoraW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9tYW4vd2VicG11eC4xIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBtdXguMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQxYTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvbWFuL3dlYnBtdXguMQpAQCAtMCwwICsxLDI2MCBAQAorLlwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZXksIEVNQUNTOiAtKi0gbnJvZmYgLSotCisuVEggV0VCUE1VWCAxICJEZWNlbWJlciAxLCAyMDE3IgorLlNIIE5BTUUKK3dlYnBtdXggXC0gY3JlYXRlIGFuaW1hdGVkIFdlYlAgZmlsZXMgZnJvbSBub25cLWFuaW1hdGVkIFdlYlAgaW1hZ2VzLCBleHRyYWN0CitmcmFtZXMgZnJvbSBhbmltYXRlZCBXZWJQIGltYWdlcywgYW5kIG1hbmFnZSBYTVAvRVhJRiBtZXRhZGF0YSBhbmQgSUNDIHByb2ZpbGUuCisuU0ggU1lOT1BTSVMKKy5CIHdlYnBtdXggXC1nZXQKKy5JIEdFVF9PUFRJT05TCisuSSBJTlBVVAorLkIgXC1vCisuSSBPVVRQVVQKKy5icgorLkIgd2VicG11eCBcLXNldAorLkkgU0VUX09QVElPTlMKKy5JIElOUFVUCisuQiBcLW8KKy5JIE9VVFBVVAorLmJyCisuQiB3ZWJwbXV4IFwtc3RyaXAKKy5JIFNUUklQX09QVElPTlMKKy5JIElOUFVUCisuQiBcLW8KKy5JIE9VVFBVVAorLmJyCisuQiB3ZWJwbXV4IFwtZnJhbWUKKy5JIEZSQU1FX09QVElPTlMKKy5CIFsgXC1mcmFtZSAuLi4gXSBbIFwtbG9vcAorLkkgTE9PUF9DT1VOVAorLkIgXQorLmJyCisuUlMgOAorLkIgWyBcLWJnY29sb3IKKy5JIEJBQ0tHUk9VTkRfQ09MT1IKKy5CIF0gXC1vCisuSSBPVVRQVVQKKy5SRQorLmJyCisuQiB3ZWJwbXV4IFwtZHVyYXRpb24KKy5JIERVUkFUSU9OIE9QVElPTlMKKy5CIFsgXC1kdXJhdGlvbiAuLi4gXQorLkkgSU5QVVQKKy5CIFwtbworLkkgT1VUUFVUCisuYnIKKy5CIHdlYnBtdXggXC1pbmZvCisuSSBJTlBVVAorLmJyCisuQiB3ZWJwbXV4IFtcLWh8XC1oZWxwXQorLmJyCisuQiB3ZWJwbXV4IFwtdmVyc2lvbgorLmJyCisuQiB3ZWJwbXV4IGFyZ3VtZW50X2ZpbGVfbmFtZQorLlNIIERFU0NSSVBUSU9OCitUaGlzIG1hbnVhbCBwYWdlIGRvY3VtZW50cyB0aGUKKy5CIHdlYnBtdXgKK2NvbW1hbmQuCisuUFAKK1xmQndlYnBtdXhcZlAgY2FuIGJlIHVzZWQgdG8gY3JlYXRlL2V4dHJhY3QgZnJvbSBhbmltYXRlZCBXZWJQIGZpbGVzLCBhcyB3ZWxsIGFzCit0byBhZGQvZXh0cmFjdC9zdHJpcCBYTVAvRVhJRiBtZXRhZGF0YSBhbmQgSUNDIHByb2ZpbGUuCitJZiBhIHNpbmdsZSBmaWxlIG5hbWUgKG5vdCBzdGFydGluZyB3aXRoIHRoZSBjaGFyYWN0ZXIgJ1wtJykgaXMgc3VwcGxpZWQgYXMKK3RoZSBhcmd1bWVudCwgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBhcmUgYWN0dWFsbHkgdG9rZW5pemVkIGZyb20gdGhpcyBmaWxlLgorVGhpcyBhbGxvd3MgZm9yIGVhc3kgc2NyaXB0aW5nIG9yIHVzaW5nIGxhcmdlIG51bWJlciBvZiBhcmd1bWVudHMuCisuU0ggT1BUSU9OUworLlNTIEdFVF9PUFRJT05TIChcLWdldCk6CisuVFAKKy5CIGljYworR2V0IElDQyBwcm9maWxlLgorLlRQCisuQiBleGlmCitHZXQgRVhJRiBtZXRhZGF0YS4KKy5UUAorLkIgeG1wCitHZXQgWE1QIG1ldGFkYXRhLgorLlRQCisuQkkgZnJhbWUgIiBuCitHZXQgbnRoIGZyYW1lIGZyb20gYW4gYW5pbWF0ZWQgaW1hZ2UuIChuID0gMCBoYXMgYSBzcGVjaWFsIG1lYW5pbmc6IGxhc3QgZnJhbWUpLgorCisuU1MgU0VUX09QVElPTlMgKFwtc2V0KQorLlRQCisuQkkgaWNjICIgZmlsZS5pY2MKK1NldCBJQ0MgcHJvZmlsZS4KKy5QCitXaGVyZTogJ2ZpbGUuaWNjJyBjb250YWlucyB0aGUgSUNDIHByb2ZpbGUgdG8gYmUgc2V0LgorLlRQCisuQkkgZXhpZiAiIGZpbGUuZXhpZgorU2V0IEVYSUYgbWV0YWRhdGEuCisuUAorV2hlcmU6ICdmaWxlLmV4aWYnIGNvbnRhaW5zIHRoZSBFWElGIG1ldGFkYXRhIHRvIGJlIHNldC4KKy5UUAorLkJJIHhtcCAiIGZpbGUueG1wCitTZXQgWE1QIG1ldGFkYXRhLgorLlAKK1doZXJlOiAnZmlsZS54bXAnIGNvbnRhaW5zIHRoZSBYTVAgbWV0YWRhdGEgdG8gYmUgc2V0LgorCisuU1MgU1RSSVBfT1BUSU9OUyAoXC1zdHJpcCkKKy5UUAorLkIgaWNjCitTdHJpcCBJQ0MgcHJvZmlsZS4KKy5UUAorLkIgZXhpZgorU3RyaXAgRVhJRiBtZXRhZGF0YS4KKy5UUAorLkIgeG1wCitTdHJpcCBYTVAgbWV0YWRhdGEuCisKKy5TUyBEVVJBVElPTl9PUFRJT05TIChcLWR1cmF0aW9uKQorQW1lbmQgdGhlIGR1cmF0aW9uIG9mIGEgc3BlY2lmaWMgaW50ZXJ2YWwgb2YgZnJhbWVzLiBUaGlzIG9wdGlvbiBpcyBvbmx5CitlZmZlY3RpdmUgb24gYW5pbWF0ZWQgV2ViUCBhbmQgaGFzIG5vIGVmZmVjdCBvbiBhIHNpbmdsZS1mcmFtZSBmaWxlLgorLlRQCisuSSBkdXJhdGlvblssc3RhcnRbLGVuZF1dCitXaGVyZToKKy5icgorLkIgZHVyYXRpb24KK2lzIHRoZSBkdXJhdGlvbiBmb3IgdGhlIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAobWFuZGF0b3J5KS4KK011c3QgYmUgbm9uLW5lZ2F0aXZlLgorLmJyCisuQiBzdGFydAoraXMgdGhlIHN0YXJ0aW5nIGZyYW1lIGluZGV4IG9mIHRoZSBpbnRlcnZhbCAob3B0aW9uYWwpLgorLmJyCisuQiBlbmQKK2lzIHRoZSBlbmRpbmcgZnJhbWUgaW5kZXggKGluY2x1c2l2ZSkgb2YgdGhlIGludGVydmFsIChvcHRpb25hbCkuCisuVFAKK1RoZSB0aHJlZSB0eXBpY2FsIHVzYWdlcyBvZiB0aGlzIG9wdGlvbiBhcmU6CisuYnIKKy5CIC1kdXJhdGlvbiBkCisgICAgIHNldCB0aGUgZHVyYXRpb24gdG8gJ2QnIGZvciB0aGUgd2hvbGUgYW5pbWF0aW9uLgorLmJyCisuQiAtZHVyYXRpb24gZCxmCisgICAgIHNldCB0aGUgZHVyYXRpb24gb2YgZnJhbWUgJ2YnIHRvICdkJy4KKy5icgorLkIgLWR1cmF0aW9uIGQsc3RhcnQsZW5kCisgICAgIHNldCB0aGUgZHVyYXRpb24gdG8gJ2QnIGZvciB0aGUgd2hvbGUgW3N0YXJ0LGVuZF0gaW50ZXJ2YWwuCisuVFAKKy5QCitOb3RlIHRoYXQgdGhlIGZyYW1lcyBvdXRzaWRlIG9mIHRoZSBbc3RhcnQsIGVuZF0gaW50ZXJ2YWwgd2lsbCByZW1haW4gdW50b3VjaGVkLgorVGhlICdlbmQnIHZhbHVlICcwJyBoYXMgdGhlIHNwZWNpYWwgbWVhbmluZyAnbGFzdCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uJy4KKy5UUAorLkkgUmVtaW5kZXI6CitmcmFtZSBpbmRleGluZyBzdGFydHMgYXQgJzEnLgorLmJyCisKKy5TUyBGUkFNRV9PUFRJT05TIChcLWZyYW1lKQorQ3JlYXRlIGFuIGFuaW1hdGVkIFdlYlAgZmlsZSBmcm9tIG11bHRpcGxlIChub25cLWFuaW1hdGVkKSBXZWJQIGltYWdlcy4KKy5UUAorLkkgZmlsZV9pICtkaVsreGkreWlbK21pW2JpXV1dCitXaGVyZTogJ2ZpbGVfaScgaXMgdGhlIGkndGggZnJhbWUgKFdlYlAgZm9ybWF0KSwgJ3hpJywneWknIHNwZWNpZnkgdGhlIGltYWdlCitvZmZzZXQgZm9yIHRoaXMgZnJhbWUsICdkaScgaXMgdGhlIHBhdXNlIGR1cmF0aW9uIGJlZm9yZSBuZXh0IGZyYW1lLCAnbWknIGlzCit0aGUgZGlzcG9zZSBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKDAgZm9yIE5PTkUgb3IgMSBmb3IgQkFDS0dST1VORCkgYW5kICdiaScgaXMKK3RoZSBibGVuZGluZyBtZXRob2QgZm9yIHRoaXMgZnJhbWUgKCtiIGZvciBCTEVORCBvciBcLWIgZm9yIE5PX0JMRU5EKS4KK0FyZ3VtZW50ICdiaScgY2FuIGJlIG9taXR0ZWQgYW5kIHdpbGwgZGVmYXVsdCB0byArYiAoQkxFTkQpLgorQWxzbywgJ21pJyBjYW4gYmUgb21pdHRlZCBpZiAnYmknIGlzIG9taXR0ZWQgYW5kIHdpbGwgZGVmYXVsdCB0byAwIChOT05FKS4KK0ZpbmFsbHksIGlmICdtaScgYW5kICdiaScgYXJlIG9taXR0ZWQgdGhlbiAneGknIGFuZCAneWknIGNhbiBiZSBvbWl0dGVkIGFuZCB3aWxsCitkZWZhdWx0IHRvICswKzAuCisuVFAKKy5CSSBcLWxvb3AgIiBuCitMb29wIHRoZSBmcmFtZXMgbiBudW1iZXIgb2YgdGltZXMuIDAgaW5kaWNhdGVzIHRoZSBmcmFtZXMgc2hvdWxkIGxvb3AgZm9yZXZlci4KK1ZhbGlkIHJhbmdlIGlzIDAgdG8gNjU1MzUgW0RlZmF1bHQ6IDAgKGluZmluaXRlKV0uCisuVFAKKy5CSSBcLWJnY29sb3IgIiBBLFIsRyxCCitCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMuCisuYnIKK3doZXJlOiAnQScsICdSJywgJ0cnIGFuZCAnQicgYXJlIGludGVnZXJzIGluIHRoZSByYW5nZSAwIHRvIDI1NSBzcGVjaWZ5aW5nIHRoZQorQWxwaGEsIFJlZCwgR3JlZW4gYW5kIEJsdWUgY29tcG9uZW50IHZhbHVlcyByZXNwZWN0aXZlbHkKK1tEZWZhdWx0OiAyNTUsMjU1LDI1NSwyNTVdLgorCisuU1MgSU5QVVQKKy5UUAorSW5wdXQgZmlsZSBpbiBXZWJQIGZvcm1hdC4KKworLlNTIE9VVFBVVCAoXC1vKQorLlRQCitPdXRwdXQgZmlsZSBpbiBXZWJQIGZvcm1hdC4KKworLlNTIE5vdGU6CisuVFAKK1RoZSBuYXR1cmUgb2YgRVhJRiwgWE1QIGFuZCBJQ0MgZGF0YSBpcyBub3QgY2hlY2tlZCBhbmQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZC4KKworLlNIIEJVR1MKK1BsZWFzZSByZXBvcnQgYWxsIGJ1Z3MgdG8gdGhlIGlzc3VlIHRyYWNrZXI6CitodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3Avd2VicAorLmJyCitQYXRjaGVzIHdlbGNvbWUhIFNlZSB0aGlzIHBhZ2UgdG8gZ2V0IHN0YXJ0ZWQ6CitodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlL2NvbnRyaWJ1dGUvc3VibWl0dGluZ1wtcGF0Y2hlcy8KKworLlNIIEVYQU1QTEVTCisuUAorQWRkIElDQyBwcm9maWxlOgorLmJyCit3ZWJwbXV4IFwtc2V0IGljYyBpbWFnZV9wcm9maWxlLmljYyBpbi53ZWJwIFwtbyBpY2NfY29udGFpbmVyLndlYnAKKy5QCitFeHRyYWN0IElDQyBwcm9maWxlOgorLmJyCit3ZWJwbXV4IFwtZ2V0IGljYyBpY2NfY29udGFpbmVyLndlYnAgXC1vIGltYWdlX3Byb2ZpbGUuaWNjCisuUAorU3RyaXAgSUNDIHByb2ZpbGU6CisuYnIKK3dlYnBtdXggXC1zdHJpcCBpY2MgaWNjX2NvbnRhaW5lci53ZWJwIFwtbyB3aXRob3V0X2ljYy53ZWJwCisuUAorQWRkIFhNUCBtZXRhZGF0YToKKy5icgord2VicG11eCBcLXNldCB4bXAgaW1hZ2VfbWV0YWRhdGEueG1wIGluLndlYnAgXC1vIHhtcF9jb250YWluZXIud2VicAorLlAKK0V4dHJhY3QgWE1QIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtZ2V0IHhtcCB4bXBfY29udGFpbmVyLndlYnAgXC1vIGltYWdlX21ldGFkYXRhLnhtcAorLlAKK1N0cmlwIFhNUCBtZXRhZGF0YToKKy5icgord2VicG11eCBcLXN0cmlwIHhtcCB4bXBfY29udGFpbmVyLndlYnAgXC1vIHdpdGhvdXRfeG1wLndlYnAKKy5QCitBZGQgRVhJRiBtZXRhZGF0YToKKy5icgord2VicG11eCBcLXNldCBleGlmIGltYWdlX21ldGFkYXRhLmV4aWYgaW4ud2VicCBcLW8gZXhpZl9jb250YWluZXIud2VicAorLlAKK0V4dHJhY3QgRVhJRiBtZXRhZGF0YToKKy5icgord2VicG11eCBcLWdldCBleGlmIGV4aWZfY29udGFpbmVyLndlYnAgXC1vIGltYWdlX21ldGFkYXRhLmV4aWYKKy5QCitTdHJpcCBFWElGIG1ldGFkYXRhOgorLmJyCit3ZWJwbXV4IFwtc3RyaXAgZXhpZiBleGlmX2NvbnRhaW5lci53ZWJwIFwtbyB3aXRob3V0X2V4aWYud2VicAorLlAKK0NyZWF0ZSBhbiBhbmltYXRlZCBXZWJQIGZpbGUgZnJvbSAzIChub25cLWFuaW1hdGVkKSBXZWJQIGltYWdlczoKKy5icgord2VicG11eCBcLWZyYW1lIDEud2VicCArMTAwIFwtZnJhbWUgMi53ZWJwICsxMDArNTArNTAKKy5icgorLlJTIDgKK1wtZnJhbWUgMy53ZWJwICsxMDArNTArNTArMStiIFwtbG9vcCAxMCBcLWJnY29sb3IgMjU1LDI1NSwyNTUsMjU1CisuYnIKK1wtbyBhbmltX2NvbnRhaW5lci53ZWJwCisuUkUKKy5QCitHZXQgdGhlIDJuZCBmcmFtZSBmcm9tIGFuIGFuaW1hdGVkIFdlYlAgZmlsZToKKy5icgord2VicG11eCBcLWdldCBmcmFtZSAyIGFuaW1fY29udGFpbmVyLndlYnAgXC1vIGZyYW1lXzIud2VicAorLlAKK1VzaW5nIFwtZ2V0L1wtc2V0L1wtc3RyaXAgd2l0aCBpbnB1dCBmaWxlIG5hbWUgc3RhcnRpbmcgd2l0aCAnXC0nOgorLmJyCit3ZWJwbXV4IFwtc2V0IGljYyBpbWFnZV9wcm9maWxlLmljYyBcLW8gaWNjX2NvbnRhaW5lci53ZWJwIFwtXC0gXC1cLVwtaW4ud2VicAorLmJyCit3ZWJwbXV4IFwtZ2V0IGljYyBcLW8gaW1hZ2VfcHJvZmlsZS5pY2MgXC1cLSBcLVwtXC1pY2NfY29udGFpbmVyLndlYnAKKy5icgord2VicG11eCBcLXN0cmlwIGljYyBcLW8gd2l0aG91dF9pY2Mud2VicCBcLVwtIFwtXC1cLWljY19jb250YWluZXIud2VicAorCisuU0ggQVVUSE9SUworXGZCd2VicG11eFxmUCBpcyBhIHBhcnQgb2YgbGlid2VicCBhbmQgd2FzIHdyaXR0ZW4gYnkgdGhlIFdlYlAgdGVhbS4KKy5icgorVGhlIGxhdGVzdCBzb3VyY2UgdHJlZSBpcyBhdmFpbGFibGUgYXQKK2h0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS93ZWJtL2xpYndlYnAKKy5QUAorVGhpcyBtYW51YWwgcGFnZSB3YXMgd3JpdHRlbiBieSBWaWthcyBBcm9yYSA8dmlrYWFzLmFyb3JhQGdtYWlsLmNvbT4sCitmb3IgdGhlIERlYmlhbiBwcm9qZWN0IChhbmQgbWF5IGJlIHVzZWQgYnkgb3RoZXJzKS4KKworLlNIIFNFRSBBTFNPCisuQlIgY3dlYnAgKDEpLAorLkJSIGR3ZWJwICgxKSwKKy5CUiBnaWYyd2VicCAoMSkKKy5icgorUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vc3BlZWQvd2VicC8gZm9yIGFkZGl0aW9uYWwKK2luZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyY2ZhMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1NSBAQAorIyBUaGUgbXV4IGFuZCBkZW11eCBsaWJyYXJpZXMgZGVwZW5kIG9uIGxpYndlYnAsIHRodXMgdGhlICcuJyB0byBmb3JjZQorIyB0aGUgYnVpbGQgb3JkZXIgc28gaXQncyBhdmFpbGFibGUgdG8gdGhlbS4KK1NVQkRJUlMgPSBkZWMgZW5jIGRzcCB1dGlscyAuCitpZiBXQU5UX01VWAorICBTVUJESVJTICs9IG11eAorZW5kaWYKK2lmIFdBTlRfREVNVVgKKyAgU1VCRElSUyArPSBkZW11eAorZW5kaWYKKworbGliX0xUTElCUkFSSUVTID0gbGlid2VicC5sYQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBsaWJfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRlY29kZXIubGEKK2VuZGlmCisKK2NvbW1vbl9IRUFERVJTID0KK2NvbW1vbl9IRUFERVJTICs9IHdlYnAvZGVjb2RlLmgKK2NvbW1vbl9IRUFERVJTICs9IHdlYnAvdHlwZXMuaAorY29tbW9uZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCisKK2xpYndlYnBfbGFfU09VUkNFUyA9CitsaWJ3ZWJwaW5jbHVkZV9IRUFERVJTID0KK2xpYndlYnBpbmNsdWRlX0hFQURFUlMgKz0gd2VicC9lbmNvZGUuaAorCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSB3ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitsaWJ3ZWJwX2xhX0xJQkFERCA9CitsaWJ3ZWJwX2xhX0xJQkFERCArPSBkZWMvbGlid2VicGRlY29kZS5sYQorbGlid2VicF9sYV9MSUJBREQgKz0gZHNwL2xpYndlYnBkc3AubGEKK2xpYndlYnBfbGFfTElCQUREICs9IGVuYy9saWJ3ZWJwZW5jb2RlLmxhCitsaWJ3ZWJwX2xhX0xJQkFERCArPSB1dGlscy9saWJ3ZWJwdXRpbHMubGEKKworIyBVc2UgJy1uby11bmRlZmluZWQnIHRvIGRlY2xhcmUgdGhhdCBsaWJ3ZWJwIGRvZXMgbm90IGRlcGVuZCBvbiBhbnkgbGlicmFyaWVzCisjIG90aGVyIHRoYW4gdGhlIG9uZXMgbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGkuZS4sIGFmdGVyIGxpbmtpbmcsIGl0IHdpbGwKKyMgbm90IGhhdmUgdW5yZXNvbHZlZCBzeW1ib2xzLiBTb21lIHBsYXRmb3JtcyAoV2luZG93cyBhbW9uZyB0aGVtKSByZXF1aXJlIGFsbAorIyBzeW1ib2xzIGluIHNoYXJlZCBsaWJyYXJpZXMgdG8gYmUgcmVzb2x2ZWQgYXQgbGlicmFyeSBjcmVhdGlvbi4KK2xpYndlYnBfbGFfTERGTEFHUyA9IC1uby11bmRlZmluZWQgLXZlcnNpb24taW5mbyA3OjI6MAorbGlid2VicGluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKK3BrZ2NvbmZpZ19EQVRBID0gbGlid2VicC5wYworCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBsaWJ3ZWJwZGVjb2Rlcl9sYV9TT1VSQ0VTID0KKworICBsaWJ3ZWJwZGVjb2Rlcl9sYV9MSUJBREQgPQorICBsaWJ3ZWJwZGVjb2Rlcl9sYV9MSUJBREQgKz0gZGVjL2xpYndlYnBkZWNvZGUubGEKKyAgbGlid2VicGRlY29kZXJfbGFfTElCQUREICs9IGRzcC9saWJ3ZWJwZHNwZGVjb2RlLmxhCisgIGxpYndlYnBkZWNvZGVyX2xhX0xJQkFERCArPSB1dGlscy9saWJ3ZWJwdXRpbHNkZWNvZGUubGEKKworICBsaWJ3ZWJwZGVjb2Rlcl9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDM6MjowCisgIHBrZ2NvbmZpZ19EQVRBICs9IGxpYndlYnBkZWNvZGVyLnBjCitlbmRpZgorCiske3BrZ2NvbmZpZ19EQVRBfTogJHt0b3BfYnVpbGRkaXJ9L2NvbmZpZy5zdGF0dXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YzYzOTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMjkgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbm9pbnN0X0xUTElCUkFSSUVTID0gbGlid2VicGRlY29kZS5sYQorCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgPQorbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IGFscGhhX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gYWxwaGFpX2RlYy5oCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gYnVmZmVyX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gY29tbW9uX2RlYy5oCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdnA4X2RlYy5oCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gZnJhbWVfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBpZGVjX2RlYy5jCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gaW9fZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSBxdWFudF9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHRyZWVfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB2cDhfZGVjLmMKK2xpYndlYnBkZWNvZGVfbGFfU09VUkNFUyArPSB2cDhpX2RlYy5oCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gdnA4bF9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHZwOGxpX2RlYy5oCitsaWJ3ZWJwZGVjb2RlX2xhX1NPVVJDRVMgKz0gd2VicF9kZWMuYworbGlid2VicGRlY29kZV9sYV9TT1VSQ0VTICs9IHdlYnBpX2RlYy5oCisKK2xpYndlYnBkZWNvZGVpbmNsdWRlX0hFQURFUlMgPQorbGlid2VicGRlY29kZWluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL2RlY29kZS5oCitsaWJ3ZWJwZGVjb2RlaW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvdHlwZXMuaAorbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKKworbGlid2VicGRlY29kZV9sYV9DUFBGTEFHUyA9ICQoQU1fQ1BQRkxBR1MpCitsaWJ3ZWJwZGVjb2RlaW5jbHVkZWRpciA9ICQoaW5jbHVkZWRpcikvd2VicApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYV9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE2YzhhNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFfZGVjLmMKQEAgLTAsMCArMSwyMzggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYS1wbGFuZSBkZWNvbXByZXNzaW9uLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL2FscGhhaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQUxQSERlY29kZXIgb2JqZWN0LgorCisvLyBBbGxvY2F0ZXMgYSBuZXcgYWxwaGEgZGVjb2RlciBpbnN0YW5jZS4KK3N0YXRpYyBBTFBIRGVjb2RlciogQUxQSE5ldyh2b2lkKSB7CisgIEFMUEhEZWNvZGVyKiBjb25zdCBkZWMgPSAoQUxQSERlY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZGVjKSk7CisgIHJldHVybiBkZWM7Cit9CisKKy8vIENsZWFycyBhbmQgZGVhbGxvY2F0ZXMgYW4gYWxwaGEgZGVjb2RlciBpbnN0YW5jZS4KK3N0YXRpYyB2b2lkIEFMUEhEZWxldGUoQUxQSERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBWUDhMRGVsZXRlKGRlYy0+dnA4bF9kZWNfKTsKKyAgICBkZWMtPnZwOGxfZGVjXyA9IE5VTEw7CisgICAgV2ViUFNhZmVGcmVlKGRlYyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kaW5nLgorCisvLyBJbml0aWFsaXplIGFscGhhIGRlY29kaW5nIGJ5IHBhcnNpbmcgdGhlIGFscGhhIGhlYWRlciBhbmQgZGVjb2RpbmcgdGhlIGltYWdlCisvLyBoZWFkZXIgZm9yIGFscGhhIGRhdGEgc3RvcmVkIHVzaW5nIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIGluIGFscGhhIGhlYWRlciAoZGF0YSB0b28gc2hvcnQsIGludmFsaWQKKy8vIGNvbXByZXNzaW9uIG1ldGhvZCBvciBmaWx0ZXIsIGVycm9yIGluIGxvc3NsZXNzIGhlYWRlciBkYXRhIGV0YykuCitzdGF0aWMgaW50IEFMUEhJbml0KEFMUEhEZWNvZGVyKiBjb25zdCBkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhX3NpemUsIGNvbnN0IFZQOElvKiBjb25zdCBzcmNfaW8sCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCkgeworICBpbnQgb2sgPSAwOworICBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYV9kYXRhID0gZGF0YSArIEFMUEhBX0hFQURFUl9MRU47CisgIGNvbnN0IHNpemVfdCBhbHBoYV9kYXRhX3NpemUgPSBkYXRhX3NpemUgLSBBTFBIQV9IRUFERVJfTEVOOworICBpbnQgcnNydjsKKyAgVlA4SW8qIGNvbnN0IGlvID0gJmRlYy0+aW9fOworCisgIGFzc2VydChkYXRhICE9IE5VTEwgJiYgb3V0cHV0ICE9IE5VTEwgJiYgc3JjX2lvICE9IE5VTEwpOworCisgIFZQOEZpbHRlcnNJbml0KCk7CisgIGRlYy0+b3V0cHV0XyA9IG91dHB1dDsKKyAgZGVjLT53aWR0aF8gPSBzcmNfaW8tPndpZHRoOworICBkZWMtPmhlaWdodF8gPSBzcmNfaW8tPmhlaWdodDsKKyAgYXNzZXJ0KGRlYy0+d2lkdGhfID4gMCAmJiBkZWMtPmhlaWdodF8gPiAwKTsKKworICBpZiAoZGF0YV9zaXplIDw9IEFMUEhBX0hFQURFUl9MRU4pIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGRlYy0+bWV0aG9kXyA9IChkYXRhWzBdID4+IDApICYgMHgwMzsKKyAgZGVjLT5maWx0ZXJfID0gKFdFQlBfRklMVEVSX1RZUEUpKChkYXRhWzBdID4+IDIpICYgMHgwMyk7CisgIGRlYy0+cHJlX3Byb2Nlc3NpbmdfID0gKGRhdGFbMF0gPj4gNCkgJiAweDAzOworICByc3J2ID0gKGRhdGFbMF0gPj4gNikgJiAweDAzOworICBpZiAoZGVjLT5tZXRob2RfIDwgQUxQSEFfTk9fQ09NUFJFU1NJT04gfHwKKyAgICAgIGRlYy0+bWV0aG9kXyA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OIHx8CisgICAgICBkZWMtPmZpbHRlcl8gPj0gV0VCUF9GSUxURVJfTEFTVCB8fAorICAgICAgZGVjLT5wcmVfcHJvY2Vzc2luZ18gPiBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTIHx8CisgICAgICByc3J2ICE9IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIENvcHkgdGhlIG5lY2Vzc2FyeSBwYXJhbWV0ZXJzIGZyb20gc3JjX2lvIHRvIGlvCisgIFZQOEluaXRJbyhpbyk7CisgIFdlYlBJbml0Q3VzdG9tSW8oTlVMTCwgaW8pOworICBpby0+b3BhcXVlID0gZGVjOworICBpby0+d2lkdGggPSBzcmNfaW8tPndpZHRoOworICBpby0+aGVpZ2h0ID0gc3JjX2lvLT5oZWlnaHQ7CisKKyAgaW8tPnVzZV9jcm9wcGluZyA9IHNyY19pby0+dXNlX2Nyb3BwaW5nOworICBpby0+Y3JvcF9sZWZ0ID0gc3JjX2lvLT5jcm9wX2xlZnQ7CisgIGlvLT5jcm9wX3JpZ2h0ID0gc3JjX2lvLT5jcm9wX3JpZ2h0OworICBpby0+Y3JvcF90b3AgPSBzcmNfaW8tPmNyb3BfdG9wOworICBpby0+Y3JvcF9ib3R0b20gPSBzcmNfaW8tPmNyb3BfYm90dG9tOworICAvLyBObyBuZWVkIHRvIGNvcHkgdGhlIHNjYWxpbmcgcGFyYW1ldGVycy4KKworICBpZiAoZGVjLT5tZXRob2RfID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgY29uc3Qgc2l6ZV90IGFscGhhX2RlY29kZWRfc2l6ZSA9IGRlYy0+d2lkdGhfICogZGVjLT5oZWlnaHRfOworICAgIG9rID0gKGFscGhhX2RhdGFfc2l6ZSA+PSBhbHBoYV9kZWNvZGVkX3NpemUpOworICB9IGVsc2UgeworICAgIGFzc2VydChkZWMtPm1ldGhvZF8gPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pOworICAgIG9rID0gVlA4TERlY29kZUFscGhhSGVhZGVyKGRlYywgYWxwaGFfZGF0YSwgYWxwaGFfZGF0YV9zaXplKTsKKyAgfQorCisgIHJldHVybiBvazsKK30KKworLy8gRGVjb2RlcywgdW5maWx0ZXJzIGFuZCBkZXF1YW50aXplcyAqYXQgbGVhc3QqICdudW1fcm93cycgcm93cyBvZiBhbHBoYQorLy8gc3RhcnRpbmcgZnJvbSByb3cgbnVtYmVyICdyb3cnLiBJdCBhc3N1bWVzIHRoYXQgcm93cyB1cCB0byAocm93IC0gMSkgaGF2ZQorLy8gYWxyZWFkeSBiZWVuIGRlY29kZWQuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYml0c3RyZWFtIGVycm9yLgorc3RhdGljIGludCBBTFBIRGVjb2RlKFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdywgaW50IG51bV9yb3dzKSB7CisgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IGRlYy0+YWxwaF9kZWNfOworICBjb25zdCBpbnQgd2lkdGggPSBhbHBoX2RlYy0+d2lkdGhfOworICBjb25zdCBpbnQgaGVpZ2h0ID0gYWxwaF9kZWMtPmlvXy5jcm9wX2JvdHRvbTsKKyAgaWYgKGFscGhfZGVjLT5tZXRob2RfID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgaW50IHk7CisgICAgY29uc3QgdWludDhfdCogcHJldl9saW5lID0gZGVjLT5hbHBoYV9wcmV2X2xpbmVfOworICAgIGNvbnN0IHVpbnQ4X3QqIGRlbHRhcyA9IGRlYy0+YWxwaGFfZGF0YV8gKyBBTFBIQV9IRUFERVJfTEVOICsgcm93ICogd2lkdGg7CisgICAgdWludDhfdCogZHN0ID0gZGVjLT5hbHBoYV9wbGFuZV8gKyByb3cgKiB3aWR0aDsKKyAgICBhc3NlcnQoZGVsdGFzIDw9ICZkZWMtPmFscGhhX2RhdGFfW2RlYy0+YWxwaGFfZGF0YV9zaXplX10pOworICAgIGlmIChhbHBoX2RlYy0+ZmlsdGVyXyAhPSBXRUJQX0ZJTFRFUl9OT05FKSB7CisgICAgICBhc3NlcnQoV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10gIT0gTlVMTCk7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgbnVtX3Jvd3M7ICsreSkgeworICAgICAgICBXZWJQVW5maWx0ZXJzW2FscGhfZGVjLT5maWx0ZXJfXShwcmV2X2xpbmUsIGRlbHRhcywgZHN0LCB3aWR0aCk7CisgICAgICAgIHByZXZfbGluZSA9IGRzdDsKKyAgICAgICAgZHN0ICs9IHdpZHRoOworICAgICAgICBkZWx0YXMgKz0gd2lkdGg7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBudW1fcm93czsgKyt5KSB7CisgICAgICAgIG1lbWNweShkc3QsIGRlbHRhcywgd2lkdGggKiBzaXplb2YoKmRzdCkpOworICAgICAgICBwcmV2X2xpbmUgPSBkc3Q7CisgICAgICAgIGRzdCArPSB3aWR0aDsKKyAgICAgICAgZGVsdGFzICs9IHdpZHRoOworICAgICAgfQorICAgIH0KKyAgICBkZWMtPmFscGhhX3ByZXZfbGluZV8gPSBwcmV2X2xpbmU7CisgIH0gZWxzZSB7ICAvLyBhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTgorICAgIGFzc2VydChhbHBoX2RlYy0+dnA4bF9kZWNfICE9IE5VTEwpOworICAgIGlmICghVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oYWxwaF9kZWMsIHJvdyArIG51bV9yb3dzKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKHJvdyArIG51bV9yb3dzID49IGhlaWdodCkgeworICAgIGRlYy0+aXNfYWxwaGFfZGVjb2RlZF8gPSAxOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IEFsbG9jYXRlQWxwaGFQbGFuZShWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGNvbnN0IFZQOElvKiBjb25zdCBpbykgeworICBjb25zdCBpbnQgc3RyaWRlID0gaW8tPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gaW8tPmNyb3BfYm90dG9tOworICBjb25zdCB1aW50NjRfdCBhbHBoYV9zaXplID0gKHVpbnQ2NF90KXN0cmlkZSAqIGhlaWdodDsKKyAgYXNzZXJ0KGRlYy0+YWxwaGFfcGxhbmVfbWVtXyA9PSBOVUxMKTsKKyAgZGVjLT5hbHBoYV9wbGFuZV9tZW1fID0KKyAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhhbHBoYV9zaXplLCBzaXplb2YoKmRlYy0+YWxwaGFfcGxhbmVfKSk7CisgIGlmIChkZWMtPmFscGhhX3BsYW5lX21lbV8gPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YWxwaGFfcGxhbmVfID0gZGVjLT5hbHBoYV9wbGFuZV9tZW1fOworICBkZWMtPmFscGhhX3ByZXZfbGluZV8gPSBOVUxMOworICByZXR1cm4gMTsKK30KKwordm9pZCBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBhc3NlcnQoZGVjICE9IE5VTEwpOworICBXZWJQU2FmZUZyZWUoZGVjLT5hbHBoYV9wbGFuZV9tZW1fKTsKKyAgZGVjLT5hbHBoYV9wbGFuZV9tZW1fID0gTlVMTDsKKyAgZGVjLT5hbHBoYV9wbGFuZV8gPSBOVUxMOworICBBTFBIRGVsZXRlKGRlYy0+YWxwaF9kZWNfKTsKKyAgZGVjLT5hbHBoX2RlY18gPSBOVUxMOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBwb2ludC4KKworY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOElvKiBjb25zdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKSB7CisgIGNvbnN0IGludCB3aWR0aCA9IGlvLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IGlvLT5jcm9wX2JvdHRvbTsKKworICBhc3NlcnQoZGVjICE9IE5VTEwgJiYgaW8gIT0gTlVMTCk7CisKKyAgaWYgKHJvdyA8IDAgfHwgbnVtX3Jvd3MgPD0gMCB8fCByb3cgKyBudW1fcm93cyA+IGhlaWdodCkgeworICAgIHJldHVybiBOVUxMOyAgICAvLyBzYW5pdHkgY2hlY2suCisgIH0KKworICBpZiAoIWRlYy0+aXNfYWxwaGFfZGVjb2RlZF8pIHsKKyAgICBpZiAoZGVjLT5hbHBoX2RlY18gPT0gTlVMTCkgeyAgICAvLyBJbml0aWFsaXplIGRlY29kZXIuCisgICAgICBkZWMtPmFscGhfZGVjXyA9IEFMUEhOZXcoKTsKKyAgICAgIGlmIChkZWMtPmFscGhfZGVjXyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgICAgIGlmICghQWxsb2NhdGVBbHBoYVBsYW5lKGRlYywgaW8pKSBnb3RvIEVycm9yOworICAgICAgaWYgKCFBTFBISW5pdChkZWMtPmFscGhfZGVjXywgZGVjLT5hbHBoYV9kYXRhXywgZGVjLT5hbHBoYV9kYXRhX3NpemVfLAorICAgICAgICAgICAgICAgICAgICBpbywgZGVjLT5hbHBoYV9wbGFuZV8pKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICAvLyBpZiB3ZSBhbGxvd2VkIHVzZSBvZiBhbHBoYSBkaXRoZXJpbmcsIGNoZWNrIHdoZXRoZXIgaXQncyBuZWVkZWQgYXQgYWxsCisgICAgICBpZiAoZGVjLT5hbHBoX2RlY18tPnByZV9wcm9jZXNzaW5nXyAhPSBBTFBIQV9QUkVQUk9DRVNTRURfTEVWRUxTKSB7CisgICAgICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IDA7ICAgLy8gZGlzYWJsZSBkaXRoZXJpbmcKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG51bV9yb3dzID0gaGVpZ2h0IC0gcm93OyAgICAgLy8gZGVjb2RlIGV2ZXJ5dGhpbmcgaW4gb25lIHBhc3MKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoZGVjLT5hbHBoX2RlY18gIT0gTlVMTCk7CisgICAgYXNzZXJ0KHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7CisgICAgaWYgKCFBTFBIRGVjb2RlKGRlYywgcm93LCBudW1fcm93cykpIGdvdG8gRXJyb3I7CisKKyAgICBpZiAoZGVjLT5pc19hbHBoYV9kZWNvZGVkXykgeyAgIC8vIGZpbmlzaGVkPworICAgICAgQUxQSERlbGV0ZShkZWMtPmFscGhfZGVjXyk7CisgICAgICBkZWMtPmFscGhfZGVjXyA9IE5VTEw7CisgICAgICBpZiAoZGVjLT5hbHBoYV9kaXRoZXJpbmdfID4gMCkgeworICAgICAgICB1aW50OF90KiBjb25zdCBhbHBoYSA9IGRlYy0+YWxwaGFfcGxhbmVfICsgaW8tPmNyb3BfdG9wICogd2lkdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBpby0+Y3JvcF9sZWZ0OworICAgICAgICBpZiAoIVdlYlBEZXF1YW50aXplTGV2ZWxzKGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+Y3JvcF9ib3R0b20gLSBpby0+Y3JvcF90b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGRlYy0+YWxwaGFfZGl0aGVyaW5nXykpIHsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBkZWNvZGVkIHJvdy4KKyAgcmV0dXJuIGRlYy0+YWxwaGFfcGxhbmVfICsgcm93ICogd2lkdGg7CisKKyBFcnJvcjoKKyAgV2ViUERlYWxsb2NhdGVBbHBoYU1lbW9yeShkZWMpOworICByZXR1cm4gTlVMTDsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFpX2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9hbHBoYWlfZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBmYTI4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvYWxwaGFpX2RlYy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYSBkZWNvZGVyOiBpbnRlcm5hbCBoZWFkZXIuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfREVDX0FMUEhBSV9ERUNfSF8KKyNkZWZpbmUgV0VCUF9ERUNfQUxQSEFJX0RFQ19IXworCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZmlsdGVyc191dGlscy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBWUDhMRGVjb2RlcjsgIC8vIERlZmluZWQgaW4gZGVjL3ZwOGxpLmguCisKK3R5cGVkZWYgc3RydWN0IEFMUEhEZWNvZGVyIEFMUEhEZWNvZGVyOworc3RydWN0IEFMUEhEZWNvZGVyIHsKKyAgaW50IHdpZHRoXzsKKyAgaW50IGhlaWdodF87CisgIGludCBtZXRob2RfOworICBXRUJQX0ZJTFRFUl9UWVBFIGZpbHRlcl87CisgIGludCBwcmVfcHJvY2Vzc2luZ187CisgIHN0cnVjdCBWUDhMRGVjb2RlciogdnA4bF9kZWNfOworICBWUDhJbyBpb187CisgIGludCB1c2VfOGJfZGVjb2RlXzsgIC8vIEFsdGhvdWdoIGFscGhhIGNoYW5uZWwgcmVxdWlyZXMgb25seSAxIGJ5dGUgcGVyCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHBpeGVsLCBzb21ldGltZXMgVlA4TERlY29kZXIgbWF5IG5lZWQgdG8gYWxsb2NhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gNCBieXRlcyBwZXIgcGl4ZWwgaW50ZXJuYWxseSBkdXJpbmcgZGVjb2RlLgorICB1aW50OF90KiBvdXRwdXRfOworICBjb25zdCB1aW50OF90KiBwcmV2X2xpbmVfOyAgIC8vIGxhc3Qgb3V0cHV0IHJvdyAob3IgTlVMTCkKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCisKKy8vIERlYWxsb2NhdGUgbWVtb3J5IGFzc29jaWF0ZWQgdG8gZGVjLT5hbHBoYV9wbGFuZV8gZGVjb2RpbmcKK3ZvaWQgV2ViUERlYWxsb2NhdGVBbHBoYU1lbW9yeShWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9ERUNfQUxQSEFJX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9idWZmZXJfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2J1ZmZlcl9kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWUzZDBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9idWZmZXJfZGVjLmMKQEAgLTAsMCArMSwzMTcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBFdmVyeXRoaW5nIGFib3V0IFdlYlBEZWNCdWZmZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy93ZWJwaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBEZWNCdWZmZXIKKworLy8gTnVtYmVyIG9mIGJ5dGVzIHBlciBwaXhlbCBmb3IgdGhlIGRpZmZlcmVudCBjb2xvci1zcGFjZXMuCitzdGF0aWMgY29uc3QgdWludDhfdCBrTW9kZUJwcFtNT0RFX0xBU1RdID0geworICAzLCA0LCAzLCA0LCA0LCAyLCAyLAorICA0LCA0LCA0LCAyLCAgICAvLyBwcmUtbXVsdGlwbGllZCBtb2RlcworICAxLCAxIH07CisKKy8vIENoZWNrIHRoYXQgd2VicF9jc3BfbW9kZSBpcyB3aXRoaW4gdGhlIGJvdW5kcyBvZiBXRUJQX0NTUF9NT0RFLgorLy8gQ29udmVydCB0byBhbiBpbnRlZ2VyIHRvIGhhbmRsZSBib3RoIHRoZSB1bnNpZ25lZC9zaWduZWQgZW51bSBjYXNlcworLy8gd2l0aG91dCB0aGUgbmVlZCBmb3IgY2FzdGluZyB0byByZW1vdmUgdHlwZSBsaW1pdCB3YXJuaW5ncy4KK3N0YXRpYyBpbnQgSXNWYWxpZENvbG9yc3BhY2UoaW50IHdlYnBfY3NwX21vZGUpIHsKKyAgcmV0dXJuICh3ZWJwX2NzcF9tb2RlID49IE1PREVfUkdCICYmIHdlYnBfY3NwX21vZGUgPCBNT0RFX0xBU1QpOworfQorCisvLyBzdHJpY3RseSBzcGVha2luZywgdGhlIHZlcnkgbGFzdCAob3IgZmlyc3QsIGlmIGZsaXBwZWQpIHJvdworLy8gZG9lc24ndCByZXF1aXJlIHBhZGRpbmcuCisjZGVmaW5lIE1JTl9CVUZGRVJfU0laRShXSURUSCwgSEVJR0hULCBTVFJJREUpICAgICAgIFwKKyAgICAoKHVpbnQ2NF90KShTVFJJREUpICogKChIRUlHSFQpIC0gMSkgKyAoV0lEVEgpKQorCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBDaGVja0RlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBtb2RlID0gYnVmZmVyLT5jb2xvcnNwYWNlOworICBjb25zdCBpbnQgd2lkdGggPSBidWZmZXItPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gYnVmZmVyLT5oZWlnaHQ7CisgIGlmICghSXNWYWxpZENvbG9yc3BhY2UobW9kZSkpIHsKKyAgICBvayA9IDA7CisgIH0gZWxzZSBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsgICAvLyBZVVYgY2hlY2tzCisgICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKKyAgICBjb25zdCBpbnQgdXZfd2lkdGggID0gKHdpZHRoICArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGhlaWdodCArIDEpIC8gMjsKKyAgICBjb25zdCBpbnQgeV9zdHJpZGUgPSBhYnMoYnVmLT55X3N0cmlkZSk7CisgICAgY29uc3QgaW50IHVfc3RyaWRlID0gYWJzKGJ1Zi0+dV9zdHJpZGUpOworICAgIGNvbnN0IGludCB2X3N0cmlkZSA9IGFicyhidWYtPnZfc3RyaWRlKTsKKyAgICBjb25zdCBpbnQgYV9zdHJpZGUgPSBhYnMoYnVmLT5hX3N0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3QgeV9zaXplID0gTUlOX0JVRkZFUl9TSVpFKHdpZHRoLCBoZWlnaHQsIHlfc3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCB1X3NpemUgPSBNSU5fQlVGRkVSX1NJWkUodXZfd2lkdGgsIHV2X2hlaWdodCwgdV9zdHJpZGUpOworICAgIGNvbnN0IHVpbnQ2NF90IHZfc2l6ZSA9IE1JTl9CVUZGRVJfU0laRSh1dl93aWR0aCwgdXZfaGVpZ2h0LCB2X3N0cmlkZSk7CisgICAgY29uc3QgdWludDY0X3QgYV9zaXplID0gTUlOX0JVRkZFUl9TSVpFKHdpZHRoLCBoZWlnaHQsIGFfc3RyaWRlKTsKKyAgICBvayAmPSAoeV9zaXplIDw9IGJ1Zi0+eV9zaXplKTsKKyAgICBvayAmPSAodV9zaXplIDw9IGJ1Zi0+dV9zaXplKTsKKyAgICBvayAmPSAodl9zaXplIDw9IGJ1Zi0+dl9zaXplKTsKKyAgICBvayAmPSAoeV9zdHJpZGUgPj0gd2lkdGgpOworICAgIG9rICY9ICh1X3N0cmlkZSA+PSB1dl93aWR0aCk7CisgICAgb2sgJj0gKHZfc3RyaWRlID49IHV2X3dpZHRoKTsKKyAgICBvayAmPSAoYnVmLT55ICE9IE5VTEwpOworICAgIG9rICY9IChidWYtPnUgIT0gTlVMTCk7CisgICAgb2sgJj0gKGJ1Zi0+diAhPSBOVUxMKTsKKyAgICBpZiAobW9kZSA9PSBNT0RFX1lVVkEpIHsKKyAgICAgIG9rICY9IChhX3N0cmlkZSA+PSB3aWR0aCk7CisgICAgICBvayAmPSAoYV9zaXplIDw9IGJ1Zi0+YV9zaXplKTsKKyAgICAgIG9rICY9IChidWYtPmEgIT0gTlVMTCk7CisgICAgfQorICB9IGVsc2UgeyAgICAvLyBSR0IgY2hlY2tzCisgICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuUkdCQTsKKyAgICBjb25zdCBpbnQgc3RyaWRlID0gYWJzKGJ1Zi0+c3RyaWRlKTsKKyAgICBjb25zdCB1aW50NjRfdCBzaXplID0gTUlOX0JVRkZFUl9TSVpFKHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisgICAgb2sgJj0gKHNpemUgPD0gYnVmLT5zaXplKTsKKyAgICBvayAmPSAoc3RyaWRlID49IHdpZHRoICoga01vZGVCcHBbbW9kZV0pOworICAgIG9rICY9IChidWYtPnJnYmEgIT0gTlVMTCk7CisgIH0KKyAgcmV0dXJuIG9rID8gVlA4X1NUQVRVU19PSyA6IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKK30KKyN1bmRlZiBNSU5fQlVGRkVSX1NJWkUKKworc3RhdGljIFZQOFN0YXR1c0NvZGUgQWxsb2NhdGVCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGNvbnN0IGludCB3ID0gYnVmZmVyLT53aWR0aDsKKyAgY29uc3QgaW50IGggPSBidWZmZXItPmhlaWdodDsKKyAgY29uc3QgV0VCUF9DU1BfTU9ERSBtb2RlID0gYnVmZmVyLT5jb2xvcnNwYWNlOworCisgIGlmICh3IDw9IDAgfHwgaCA8PSAwIHx8ICFJc1ZhbGlkQ29sb3JzcGFjZShtb2RlKSkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKworICBpZiAoYnVmZmVyLT5pc19leHRlcm5hbF9tZW1vcnkgPD0gMCAmJiBidWZmZXItPnByaXZhdGVfbWVtb3J5ID09IE5VTEwpIHsKKyAgICB1aW50OF90KiBvdXRwdXQ7CisgICAgaW50IHV2X3N0cmlkZSA9IDAsIGFfc3RyaWRlID0gMDsKKyAgICB1aW50NjRfdCB1dl9zaXplID0gMCwgYV9zaXplID0gMCwgdG90YWxfc2l6ZTsKKyAgICAvLyBXZSBuZWVkIG1lbW9yeSBhbmQgaXQgaGFzbid0IGJlZW4gYWxsb2NhdGVkIHlldC4KKyAgICAvLyA9PiBpbml0aWFsaXplIG91dHB1dCBidWZmZXIsIG5vdyB0aGF0IGRpbWVuc2lvbnMgYXJlIGtub3duLgorICAgIGludCBzdHJpZGU7CisgICAgdWludDY0X3Qgc2l6ZTsKKworICAgIGlmICgodWludDY0X3QpdyAqIGtNb2RlQnBwW21vZGVdID49ICgxdWxsIDw8IDMyKSkgeworICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisgICAgc3RyaWRlID0gdyAqIGtNb2RlQnBwW21vZGVdOworICAgIHNpemUgPSAodWludDY0X3Qpc3RyaWRlICogaDsKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsKKyAgICAgIHV2X3N0cmlkZSA9ICh3ICsgMSkgLyAyOworICAgICAgdXZfc2l6ZSA9ICh1aW50NjRfdCl1dl9zdHJpZGUgKiAoKGggKyAxKSAvIDIpOworICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7CisgICAgICAgIGFfc3RyaWRlID0gdzsKKyAgICAgICAgYV9zaXplID0gKHVpbnQ2NF90KWFfc3RyaWRlICogaDsKKyAgICAgIH0KKyAgICB9CisgICAgdG90YWxfc2l6ZSA9IHNpemUgKyAyICogdXZfc2l6ZSArIGFfc2l6ZTsKKworICAgIC8vIFNlY3VyaXR5L3Nhbml0eSBjaGVja3MKKyAgICBvdXRwdXQgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCpvdXRwdXQpKTsKKyAgICBpZiAob3V0cHV0ID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgfQorICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBvdXRwdXQ7CisKKyAgICBpZiAoIVdlYlBJc1JHQk1vZGUobW9kZSkpIHsgICAvLyBZVVZBIGluaXRpYWxpemF0aW9uCisgICAgICBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJmJ1ZmZlci0+dS5ZVVZBOworICAgICAgYnVmLT55ID0gb3V0cHV0OworICAgICAgYnVmLT55X3N0cmlkZSA9IHN0cmlkZTsKKyAgICAgIGJ1Zi0+eV9zaXplID0gKHNpemVfdClzaXplOworICAgICAgYnVmLT51ID0gb3V0cHV0ICsgc2l6ZTsKKyAgICAgIGJ1Zi0+dV9zdHJpZGUgPSB1dl9zdHJpZGU7CisgICAgICBidWYtPnVfc2l6ZSA9IChzaXplX3QpdXZfc2l6ZTsKKyAgICAgIGJ1Zi0+diA9IG91dHB1dCArIHNpemUgKyB1dl9zaXplOworICAgICAgYnVmLT52X3N0cmlkZSA9IHV2X3N0cmlkZTsKKyAgICAgIGJ1Zi0+dl9zaXplID0gKHNpemVfdCl1dl9zaXplOworICAgICAgaWYgKG1vZGUgPT0gTU9ERV9ZVVZBKSB7CisgICAgICAgIGJ1Zi0+YSA9IG91dHB1dCArIHNpemUgKyAyICogdXZfc2l6ZTsKKyAgICAgIH0KKyAgICAgIGJ1Zi0+YV9zaXplID0gKHNpemVfdClhX3NpemU7CisgICAgICBidWYtPmFfc3RyaWRlID0gYV9zdHJpZGU7CisgICAgfSBlbHNlIHsgIC8vIFJHQkEgaW5pdGlhbGl6YXRpb24KKyAgICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7CisgICAgICBidWYtPnJnYmEgPSBvdXRwdXQ7CisgICAgICBidWYtPnN0cmlkZSA9IHN0cmlkZTsKKyAgICAgIGJ1Zi0+c2l6ZSA9IChzaXplX3Qpc2l6ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIENoZWNrRGVjQnVmZmVyKGJ1ZmZlcik7Cit9CisKK1ZQOFN0YXR1c0NvZGUgV2ViUEZsaXBCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKSB7CisgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKFdlYlBJc1JHQk1vZGUoYnVmZmVyLT5jb2xvcnNwYWNlKSkgeworICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmYnVmZmVyLT51LlJHQkE7CisgICAgYnVmLT5yZ2JhICs9IChidWZmZXItPmhlaWdodCAtIDEpICogYnVmLT5zdHJpZGU7CisgICAgYnVmLT5zdHJpZGUgPSAtYnVmLT5zdHJpZGU7CisgIH0gZWxzZSB7CisgICAgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZidWZmZXItPnUuWVVWQTsKKyAgICBjb25zdCBpbnQgSCA9IGJ1ZmZlci0+aGVpZ2h0OworICAgIGJ1Zi0+eSArPSAoSCAtIDEpICogYnVmLT55X3N0cmlkZTsKKyAgICBidWYtPnlfc3RyaWRlID0gLWJ1Zi0+eV9zdHJpZGU7CisgICAgYnVmLT51ICs9ICgoSCAtIDEpID4+IDEpICogYnVmLT51X3N0cmlkZTsKKyAgICBidWYtPnVfc3RyaWRlID0gLWJ1Zi0+dV9zdHJpZGU7CisgICAgYnVmLT52ICs9ICgoSCAtIDEpID4+IDEpICogYnVmLT52X3N0cmlkZTsKKyAgICBidWYtPnZfc3RyaWRlID0gLWJ1Zi0+dl9zdHJpZGU7CisgICAgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgICBidWYtPmEgKz0gKEggLSAxKSAqIGJ1Zi0+YV9zdHJpZGU7CisgICAgICBidWYtPmFfc3RyaWRlID0gLWJ1Zi0+YV9zdHJpZGU7CisgICAgfQorICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitWUDhTdGF0dXNDb2RlIFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIGNvbnN0IG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpIHsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisgIGlmIChidWZmZXIgPT0gTlVMTCB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSB7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgfQorICBpZiAob3B0aW9ucyAhPSBOVUxMKSB7ICAgIC8vIEZpcnN0LCBhcHBseSBvcHRpb25zIGlmIHRoZXJlIGlzIGFueS4KKyAgICBpZiAob3B0aW9ucy0+dXNlX2Nyb3BwaW5nKSB7CisgICAgICBjb25zdCBpbnQgY3cgPSBvcHRpb25zLT5jcm9wX3dpZHRoOworICAgICAgY29uc3QgaW50IGNoID0gb3B0aW9ucy0+Y3JvcF9oZWlnaHQ7CisgICAgICBjb25zdCBpbnQgeCA9IG9wdGlvbnMtPmNyb3BfbGVmdCAmIH4xOworICAgICAgY29uc3QgaW50IHkgPSBvcHRpb25zLT5jcm9wX3RvcCAmIH4xOworICAgICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IGN3IDw9IDAgfHwgY2ggPD0gMCB8fAorICAgICAgICAgIHggKyBjdyA+IHdpZHRoIHx8IHkgKyBjaCA+IGhlaWdodCkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOyAgIC8vIG91dCBvZiBmcmFtZSBib3VuZGFyeS4KKyAgICAgIH0KKyAgICAgIHdpZHRoID0gY3c7CisgICAgICBoZWlnaHQgPSBjaDsKKyAgICB9CisKKyAgICBpZiAob3B0aW9ucy0+dXNlX3NjYWxpbmcpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICAgICAgaW50IHNjYWxlZF93aWR0aCA9IG9wdGlvbnMtPnNjYWxlZF93aWR0aDsKKyAgICAgIGludCBzY2FsZWRfaGVpZ2h0ID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKKyAgICAgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucygKKyAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgJnNjYWxlZF93aWR0aCwgJnNjYWxlZF9oZWlnaHQpKSB7CisgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgICB9CisgICAgICB3aWR0aCA9IHNjYWxlZF93aWR0aDsKKyAgICAgIGhlaWdodCA9IHNjYWxlZF9oZWlnaHQ7CisjZWxzZQorICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsgICAvLyByZXNjYWxpbmcgbm90IHN1cHBvcnRlZAorI2VuZGlmCisgICAgfQorICB9CisgIGJ1ZmZlci0+d2lkdGggPSB3aWR0aDsKKyAgYnVmZmVyLT5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgLy8gVGhlbiwgYWxsb2NhdGUgYnVmZmVyIGZvciByZWFsLgorICBzdGF0dXMgPSBBbGxvY2F0ZUJ1ZmZlcihidWZmZXIpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHJldHVybiBzdGF0dXM7CisKKyAgLy8gVXNlIHRoZSBzdHJpZGUgdHJpY2sgaWYgdmVydGljYWwgZmxpcCBpcyBuZWVkZWQuCisgIGlmIChvcHRpb25zICE9IE5VTEwgJiYgb3B0aW9ucy0+ZmxpcCkgeworICAgIHN0YXR1cyA9IFdlYlBGbGlwQnVmZmVyKGJ1ZmZlcik7CisgIH0KKyAgcmV0dXJuIHN0YXR1czsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvbnN0cnVjdG9ycyAvIGRlc3RydWN0b3JzCisKK2ludCBXZWJQSW5pdERlY0J1ZmZlckludGVybmFsKFdlYlBEZWNCdWZmZXIqIGJ1ZmZlciwgaW50IHZlcnNpb24pIHsKKyAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0RFQ09ERVJfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7ICAvLyB2ZXJzaW9uIG1pc21hdGNoCisgIH0KKyAgaWYgKGJ1ZmZlciA9PSBOVUxMKSByZXR1cm4gMDsKKyAgbWVtc2V0KGJ1ZmZlciwgMCwgc2l6ZW9mKCpidWZmZXIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUEZyZWVEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogYnVmZmVyKSB7CisgIGlmIChidWZmZXIgIT0gTlVMTCkgeworICAgIGlmIChidWZmZXItPmlzX2V4dGVybmFsX21lbW9yeSA8PSAwKSB7CisgICAgICBXZWJQU2FmZUZyZWUoYnVmZmVyLT5wcml2YXRlX21lbW9yeSk7CisgICAgfQorICAgIGJ1ZmZlci0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOworICB9Cit9CisKK3ZvaWQgV2ViUENvcHlEZWNCdWZmZXIoY29uc3QgV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKKyAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7CisgICAgKmRzdCA9ICpzcmM7CisgICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgeworICAgICAgZHN0LT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIGRzdCBidWZmZXIgZG9lc24ndCBvd24gdGhlIG1lbW9yeS4KKyAgICAgIGRzdC0+cHJpdmF0ZV9tZW1vcnkgPSBOVUxMOworICAgIH0KKyAgfQorfQorCisvLyBDb3B5IGFuZCB0cmFuc2ZlciBvd25lcnNoaXAgZnJvbSBzcmMgdG8gZHN0IChiZXdhcmUgb2YgcGFyYW1ldGVyIG9yZGVyISkKK3ZvaWQgV2ViUEdyYWJEZWNCdWZmZXIoV2ViUERlY0J1ZmZlciogY29uc3Qgc3JjLCBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3QpIHsKKyAgaWYgKHNyYyAhPSBOVUxMICYmIGRzdCAhPSBOVUxMKSB7CisgICAgKmRzdCA9ICpzcmM7CisgICAgaWYgKHNyYy0+cHJpdmF0ZV9tZW1vcnkgIT0gTlVMTCkgeworICAgICAgc3JjLT5pc19leHRlcm5hbF9tZW1vcnkgPSAxOyAgIC8vIHNyYyByZWxpbnF1aXNoZXMgb3duZXJzaGlwCisgICAgICBzcmMtPnByaXZhdGVfbWVtb3J5ID0gTlVMTDsKKyAgICB9CisgIH0KK30KKworVlA4U3RhdHVzQ29kZSBXZWJQQ29weURlY0J1ZmZlclBpeGVscyhjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjQnVmZmVyKiBjb25zdCBkc3RfYnVmKSB7CisgIGFzc2VydChzcmNfYnVmICE9IE5VTEwgJiYgZHN0X2J1ZiAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyY19idWYtPmNvbG9yc3BhY2UgPT0gZHN0X2J1Zi0+Y29sb3JzcGFjZSk7CisKKyAgZHN0X2J1Zi0+d2lkdGggPSBzcmNfYnVmLT53aWR0aDsKKyAgZHN0X2J1Zi0+aGVpZ2h0ID0gc3JjX2J1Zi0+aGVpZ2h0OworICBpZiAoQ2hlY2tEZWNCdWZmZXIoZHN0X2J1ZikgIT0gVlA4X1NUQVRVU19PSykgeworICAgIHJldHVybiBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgIH0KKyAgaWYgKFdlYlBJc1JHQk1vZGUoc3JjX2J1Zi0+Y29sb3JzcGFjZSkpIHsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3Qgc3JjID0gJnNyY19idWYtPnUuUkdCQTsKKyAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgZHN0ID0gJmRzdF9idWYtPnUuUkdCQTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+cmdiYSwgc3JjLT5zdHJpZGUsIGRzdC0+cmdiYSwgZHN0LT5zdHJpZGUsCisgICAgICAgICAgICAgICAgICBzcmNfYnVmLT53aWR0aCAqIGtNb2RlQnBwW3NyY19idWYtPmNvbG9yc3BhY2VdLAorICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+aGVpZ2h0KTsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3Qgc3JjID0gJnNyY19idWYtPnUuWVVWQTsKKyAgICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgZHN0ID0gJmRzdF9idWYtPnUuWVVWQTsKKyAgICBXZWJQQ29weVBsYW5lKHNyYy0+eSwgc3JjLT55X3N0cmlkZSwgZHN0LT55LCBkc3QtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+d2lkdGgsIHNyY19idWYtPmhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dV9zdHJpZGUsIGRzdC0+dSwgZHN0LT51X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIChzcmNfYnVmLT53aWR0aCArIDEpIC8gMiwgKHNyY19idWYtPmhlaWdodCArIDEpIC8gMik7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnYsIHNyYy0+dl9zdHJpZGUsIGRzdC0+diwgZHN0LT52X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgIChzcmNfYnVmLT53aWR0aCArIDEpIC8gMiwgKHNyY19idWYtPmhlaWdodCArIDEpIC8gMik7CisgICAgaWYgKFdlYlBJc0FscGhhTW9kZShzcmNfYnVmLT5jb2xvcnNwYWNlKSkgeworICAgICAgV2ViUENvcHlQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsIGRzdC0+YSwgZHN0LT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgc3JjX2J1Zi0+d2lkdGgsIHNyY19idWYtPmhlaWdodCk7CisgICAgfQorICB9CisgIHJldHVybiBWUDhfU1RBVFVTX09LOworfQorCitpbnQgV2ViUEF2b2lkU2xvd01lbW9yeShjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGZlYXR1cmVzKSB7CisgIGFzc2VydChvdXRwdXQgIT0gTlVMTCk7CisgIHJldHVybiAob3V0cHV0LT5pc19leHRlcm5hbF9tZW1vcnkgPj0gMikgJiYKKyAgICAgICAgIFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKG91dHB1dC0+Y29sb3JzcGFjZSkgJiYKKyAgICAgICAgIChmZWF0dXJlcyAhPSBOVUxMICYmIGZlYXR1cmVzLT5oYXNfYWxwaGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9jb21tb25fZGVjLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2NvbW1vbl9kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk1ZjFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9jb21tb25fZGVjLmgKQEAgLTAsMCArMSw1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIERlZmluaXRpb25zIGFuZCBtYWNyb3MgY29tbW9uIHRvIGVuY29kaW5nIGFuZCBkZWNvZGluZworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9ERUNfQ09NTU9OX0RFQ19IXworI2RlZmluZSBXRUJQX0RFQ19DT01NT05fREVDX0hfCisKKy8vIGludHJhIHByZWRpY3Rpb24gbW9kZXMKK2VudW0geyBCX0RDX1BSRUQgPSAwLCAgIC8vIDR4NCBtb2RlcworICAgICAgIEJfVE1fUFJFRCA9IDEsCisgICAgICAgQl9WRV9QUkVEID0gMiwKKyAgICAgICBCX0hFX1BSRUQgPSAzLAorICAgICAgIEJfUkRfUFJFRCA9IDQsCisgICAgICAgQl9WUl9QUkVEID0gNSwKKyAgICAgICBCX0xEX1BSRUQgPSA2LAorICAgICAgIEJfVkxfUFJFRCA9IDcsCisgICAgICAgQl9IRF9QUkVEID0gOCwKKyAgICAgICBCX0hVX1BSRUQgPSA5LAorICAgICAgIE5VTV9CTU9ERVMgPSBCX0hVX1BSRUQgKyAxIC0gQl9EQ19QUkVELCAgLy8gPSAxMAorCisgICAgICAgLy8gTHVtYTE2IG9yIFVWIG1vZGVzCisgICAgICAgRENfUFJFRCA9IEJfRENfUFJFRCwgVl9QUkVEID0gQl9WRV9QUkVELAorICAgICAgIEhfUFJFRCA9IEJfSEVfUFJFRCwgVE1fUFJFRCA9IEJfVE1fUFJFRCwKKyAgICAgICBCX1BSRUQgPSBOVU1fQk1PREVTLCAgIC8vIHJlZmluZWQgSTR4NCBtb2RlCisgICAgICAgTlVNX1BSRURfTU9ERVMgPSA0LAorCisgICAgICAgLy8gc3BlY2lhbCBtb2RlcworICAgICAgIEJfRENfUFJFRF9OT1RPUCA9IDQsCisgICAgICAgQl9EQ19QUkVEX05PTEVGVCA9IDUsCisgICAgICAgQl9EQ19QUkVEX05PVE9QTEVGVCA9IDYsCisgICAgICAgTlVNX0JfRENfTU9ERVMgPSA3IH07CisKK2VudW0geyBNQl9GRUFUVVJFX1RSRUVfUFJPQlMgPSAzLAorICAgICAgIE5VTV9NQl9TRUdNRU5UUyA9IDQsCisgICAgICAgTlVNX1JFRl9MRl9ERUxUQVMgPSA0LAorICAgICAgIE5VTV9NT0RFX0xGX0RFTFRBUyA9IDQsICAgIC8vIEk0eDQsIFpFUk8sICosIFNQTElUCisgICAgICAgTUFYX05VTV9QQVJUSVRJT05TID0gOCwKKyAgICAgICAvLyBQcm9iYWJpbGl0aWVzCisgICAgICAgTlVNX1RZUEVTID0gNCwgICAvLyAwOiBpMTYtQUMsICAxOiBpMTYtREMsICAyOmNocm9tYS1BQywgIDM6aTQtQUMKKyAgICAgICBOVU1fQkFORFMgPSA4LAorICAgICAgIE5VTV9DVFggPSAzLAorICAgICAgIE5VTV9QUk9CQVMgPSAxMQorICAgICB9OworCisjZW5kaWYgICAgLy8gV0VCUF9ERUNfQ09NTU9OX0RFQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9mcmFtZV9kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvZnJhbWVfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZjMxZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvZnJhbWVfZGVjLmMKQEAgLTAsMCArMSw4MTYgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGcmFtZS1yZWNvbnN0cnVjdGlvbiBmdW5jdGlvbi4gTWVtb3J5IGFsbG9jYXRpb24uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gcmVjb25zdHJ1Y3Rpb24gZnVuY3Rpb24uCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrU2NhblsxNl0gPSB7CisgIDAgKyAgMCAqIEJQUywgIDQgKyAgMCAqIEJQUywgOCArICAwICogQlBTLCAxMiArICAwICogQlBTLAorICAwICsgIDQgKiBCUFMsICA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUywKKyAgMCArICA4ICogQlBTLCAgNCArICA4ICogQlBTLCA4ICsgIDggKiBCUFMsIDEyICsgIDggKiBCUFMsCisgIDAgKyAxMiAqIEJQUywgIDQgKyAxMiAqIEJQUywgOCArIDEyICogQlBTLCAxMiArIDEyICogQlBTCit9OworCitzdGF0aWMgaW50IENoZWNrTW9kZShpbnQgbWJfeCwgaW50IG1iX3ksIGludCBtb2RlKSB7CisgIGlmIChtb2RlID09IEJfRENfUFJFRCkgeworICAgIGlmIChtYl94ID09IDApIHsKKyAgICAgIHJldHVybiAobWJfeSA9PSAwKSA/IEJfRENfUFJFRF9OT1RPUExFRlQgOiBCX0RDX1BSRURfTk9MRUZUOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gKG1iX3kgPT0gMCkgPyBCX0RDX1BSRURfTk9UT1AgOiBCX0RDX1BSRUQ7CisgICAgfQorICB9CisgIHJldHVybiBtb2RlOworfQorCitzdGF0aWMgdm9pZCBDb3B5MzJiKHVpbnQ4X3QqIGNvbnN0IGRzdCwgY29uc3QgdWludDhfdCogY29uc3Qgc3JjKSB7CisgIG1lbWNweShkc3QsIHNyYywgNCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVHJhbnNmb3JtKHVpbnQzMl90IGJpdHMsIGNvbnN0IGludDE2X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCkgeworICBzd2l0Y2ggKGJpdHMgPj4gMzApIHsKKyAgICBjYXNlIDM6CisgICAgICBWUDhUcmFuc2Zvcm0oc3JjLCBkc3QsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgVlA4VHJhbnNmb3JtQUMzKHNyYywgZHN0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIFZQOFRyYW5zZm9ybURDKHNyYywgZHN0KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBicmVhazsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEb1VWVHJhbnNmb3JtKHVpbnQzMl90IGJpdHMsIGNvbnN0IGludDE2X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGlmIChiaXRzICYgMHhmZikgeyAgICAvLyBhbnkgbm9uLXplcm8gY29lZmYgYXQgYWxsPworICAgIGlmIChiaXRzICYgMHhhYSkgeyAgLy8gYW55IG5vbi16ZXJvIEFDIGNvZWZmaWNpZW50PworICAgICAgVlA4VHJhbnNmb3JtVVYoc3JjLCBkc3QpOyAgIC8vIG5vdGUgd2UgZG9uJ3QgdXNlIHRoZSBBQzMgdmFyaWFudCBmb3IgVS9WCisgICAgfSBlbHNlIHsKKyAgICAgIFZQOFRyYW5zZm9ybURDVVYoc3JjLCBkc3QpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZWNvbnN0cnVjdFJvdyhjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjdHgpIHsKKyAgaW50IGo7CisgIGludCBtYl94OworICBjb25zdCBpbnQgbWJfeSA9IGN0eC0+bWJfeV87CisgIGNvbnN0IGludCBjYWNoZV9pZCA9IGN0eC0+aWRfOworICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGRlYy0+eXV2X2JfICsgWV9PRkY7CisgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gZGVjLT55dXZfYl8gKyBVX09GRjsKKyAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBkZWMtPnl1dl9iXyArIFZfT0ZGOworCisgIC8vIEluaXRpYWxpemUgbGVmdC1tb3N0IGJsb2NrLgorICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIHlfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKKyAgfQorICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgdV9kc3RbaiAqIEJQUyAtIDFdID0gMTI5OworICAgIHZfZHN0W2ogKiBCUFMgLSAxXSA9IDEyOTsKKyAgfQorCisgIC8vIEluaXQgdG9wLWxlZnQgc2FtcGxlIG9uIGxlZnQgY29sdW1uIHRvby4KKyAgaWYgKG1iX3kgPiAwKSB7CisgICAgeV9kc3RbLTEgLSBCUFNdID0gdV9kc3RbLTEgLSBCUFNdID0gdl9kc3RbLTEgLSBCUFNdID0gMTI5OworICB9IGVsc2UgeworICAgIC8vIHdlIG9ubHkgbmVlZCB0byBkbyB0aGlzIGluaXQgb25jZSBhdCBibG9jayAoMCwwKS4KKyAgICAvLyBBZnRlcndhcmQsIGl0IHJlbWFpbnMgdmFsaWQgZm9yIHRoZSB3aG9sZSB0b3Btb3N0IHJvdy4KKyAgICBtZW1zZXQoeV9kc3QgLSBCUFMgLSAxLCAxMjcsIDE2ICsgNCArIDEpOworICAgIG1lbXNldCh1X2RzdCAtIEJQUyAtIDEsIDEyNywgOCArIDEpOworICAgIG1lbXNldCh2X2RzdCAtIEJQUyAtIDEsIDEyNywgOCArIDEpOworICB9CisKKyAgLy8gUmVjb25zdHJ1Y3Qgb25lIHJvdy4KKyAgZm9yIChtYl94ID0gMDsgbWJfeCA8IGRlYy0+bWJfd187ICsrbWJfeCkgeworICAgIGNvbnN0IFZQOE1CRGF0YSogY29uc3QgYmxvY2sgPSBjdHgtPm1iX2RhdGFfICsgbWJfeDsKKworICAgIC8vIFJvdGF0ZSBpbiB0aGUgbGVmdCBzYW1wbGVzIGZyb20gcHJldmlvdXNseSBkZWNvZGVkIGJsb2NrLiBXZSBtb3ZlIGZvdXIKKyAgICAvLyBwaXhlbHMgYXQgYSB0aW1lIGZvciBhbGlnbm1lbnQgcmVhc29uLCBhbmQgYmVjYXVzZSBvZiBpbi1sb29wIGZpbHRlci4KKyAgICBpZiAobWJfeCA+IDApIHsKKyAgICAgIGZvciAoaiA9IC0xOyBqIDwgMTY7ICsraikgeworICAgICAgICBDb3B5MzJiKCZ5X2RzdFtqICogQlBTIC0gNF0sICZ5X2RzdFtqICogQlBTICsgMTJdKTsKKyAgICAgIH0KKyAgICAgIGZvciAoaiA9IC0xOyBqIDwgODsgKytqKSB7CisgICAgICAgIENvcHkzMmIoJnVfZHN0W2ogKiBCUFMgLSA0XSwgJnVfZHN0W2ogKiBCUFMgKyA0XSk7CisgICAgICAgIENvcHkzMmIoJnZfZHN0W2ogKiBCUFMgLSA0XSwgJnZfZHN0W2ogKiBCUFMgKyA0XSk7CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIC8vIGJyaW5nIHRvcCBzYW1wbGVzIGludG8gdGhlIGNhY2hlCisgICAgICBWUDhUb3BTYW1wbGVzKiBjb25zdCB0b3BfeXV2ID0gZGVjLT55dXZfdF8gKyBtYl94OworICAgICAgY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzID0gYmxvY2stPmNvZWZmc187CisgICAgICB1aW50MzJfdCBiaXRzID0gYmxvY2stPm5vbl96ZXJvX3lfOworICAgICAgaW50IG47CisKKyAgICAgIGlmIChtYl95ID4gMCkgeworICAgICAgICBtZW1jcHkoeV9kc3QgLSBCUFMsIHRvcF95dXZbMF0ueSwgMTYpOworICAgICAgICBtZW1jcHkodV9kc3QgLSBCUFMsIHRvcF95dXZbMF0udSwgOCk7CisgICAgICAgIG1lbWNweSh2X2RzdCAtIEJQUywgdG9wX3l1dlswXS52LCA4KTsKKyAgICAgIH0KKworICAgICAgLy8gcHJlZGljdCBhbmQgYWRkIHJlc2lkdWFscworICAgICAgaWYgKGJsb2NrLT5pc19pNHg0XykgeyAgIC8vIDR4NAorICAgICAgICB1aW50MzJfdCogY29uc3QgdG9wX3JpZ2h0ID0gKHVpbnQzMl90KikoeV9kc3QgLSBCUFMgKyAxNik7CisKKyAgICAgICAgaWYgKG1iX3kgPiAwKSB7CisgICAgICAgICAgaWYgKG1iX3ggPj0gZGVjLT5tYl93XyAtIDEpIHsgICAgLy8gb24gcmlnaHRtb3N0IGJvcmRlcgorICAgICAgICAgICAgbWVtc2V0KHRvcF9yaWdodCwgdG9wX3l1dlswXS55WzE1XSwgc2l6ZW9mKCp0b3BfcmlnaHQpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KHRvcF9yaWdodCwgdG9wX3l1dlsxXS55LCBzaXplb2YoKnRvcF9yaWdodCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyByZXBsaWNhdGUgdGhlIHRvcC1yaWdodCBwaXhlbHMgYmVsb3cKKyAgICAgICAgdG9wX3JpZ2h0W0JQU10gPSB0b3BfcmlnaHRbMiAqIEJQU10gPSB0b3BfcmlnaHRbMyAqIEJQU10gPSB0b3BfcmlnaHRbMF07CisKKyAgICAgICAgLy8gcHJlZGljdCBhbmQgYWRkIHJlc2lkdWFscyBmb3IgYWxsIDR4NCBibG9ja3MgaW4gdHVybi4KKyAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24sIGJpdHMgPDw9IDIpIHsKKyAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QgPSB5X2RzdCArIGtTY2FuW25dOworICAgICAgICAgIFZQOFByZWRMdW1hNFtibG9jay0+aW1vZGVzX1tuXV0oZHN0KTsKKyAgICAgICAgICBEb1RyYW5zZm9ybShiaXRzLCBjb2VmZnMgKyBuICogMTYsIGRzdCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7ICAgIC8vIDE2eDE2CisgICAgICAgIGNvbnN0IGludCBwcmVkX2Z1bmMgPSBDaGVja01vZGUobWJfeCwgbWJfeSwgYmxvY2stPmltb2Rlc19bMF0pOworICAgICAgICBWUDhQcmVkTHVtYTE2W3ByZWRfZnVuY10oeV9kc3QpOworICAgICAgICBpZiAoYml0cyAhPSAwKSB7CisgICAgICAgICAgZm9yIChuID0gMDsgbiA8IDE2OyArK24sIGJpdHMgPDw9IDIpIHsKKyAgICAgICAgICAgIERvVHJhbnNmb3JtKGJpdHMsIGNvZWZmcyArIG4gKiAxNiwgeV9kc3QgKyBrU2NhbltuXSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICB7CisgICAgICAgIC8vIENocm9tYQorICAgICAgICBjb25zdCB1aW50MzJfdCBiaXRzX3V2ID0gYmxvY2stPm5vbl96ZXJvX3V2XzsKKyAgICAgICAgY29uc3QgaW50IHByZWRfZnVuYyA9IENoZWNrTW9kZShtYl94LCBtYl95LCBibG9jay0+dXZtb2RlXyk7CisgICAgICAgIFZQOFByZWRDaHJvbWE4W3ByZWRfZnVuY10odV9kc3QpOworICAgICAgICBWUDhQcmVkQ2hyb21hOFtwcmVkX2Z1bmNdKHZfZHN0KTsKKyAgICAgICAgRG9VVlRyYW5zZm9ybShiaXRzX3V2ID4+IDAsIGNvZWZmcyArIDE2ICogMTYsIHVfZHN0KTsKKyAgICAgICAgRG9VVlRyYW5zZm9ybShiaXRzX3V2ID4+IDgsIGNvZWZmcyArIDIwICogMTYsIHZfZHN0KTsKKyAgICAgIH0KKworICAgICAgLy8gc3Rhc2ggYXdheSB0b3Agc2FtcGxlcyBmb3IgbmV4dCBibG9jaworICAgICAgaWYgKG1iX3kgPCBkZWMtPm1iX2hfIC0gMSkgeworICAgICAgICBtZW1jcHkodG9wX3l1dlswXS55LCB5X2RzdCArIDE1ICogQlBTLCAxNik7CisgICAgICAgIG1lbWNweSh0b3BfeXV2WzBdLnUsIHVfZHN0ICsgIDcgKiBCUFMsICA4KTsKKyAgICAgICAgbWVtY3B5KHRvcF95dXZbMF0udiwgdl9kc3QgKyAgNyAqIEJQUywgIDgpOworICAgICAgfQorICAgIH0KKyAgICAvLyBUcmFuc2ZlciByZWNvbnN0cnVjdGVkIHNhbXBsZXMgZnJvbSB5dXZfYl8gY2FjaGUgdG8gZmluYWwgZGVzdGluYXRpb24uCisgICAgeworICAgICAgY29uc3QgaW50IHlfb2Zmc2V0ID0gY2FjaGVfaWQgKiAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICAgICAgY29uc3QgaW50IHV2X29mZnNldCA9IGNhY2hlX2lkICogOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHlfb3V0ID0gZGVjLT5jYWNoZV95XyArIG1iX3ggKiAxNiArIHlfb2Zmc2V0OworICAgICAgdWludDhfdCogY29uc3QgdV9vdXQgPSBkZWMtPmNhY2hlX3VfICsgbWJfeCAqIDggKyB1dl9vZmZzZXQ7CisgICAgICB1aW50OF90KiBjb25zdCB2X291dCA9IGRlYy0+Y2FjaGVfdl8gKyBtYl94ICogOCArIHV2X29mZnNldDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgICAgIG1lbWNweSh5X291dCArIGogKiBkZWMtPmNhY2hlX3lfc3RyaWRlXywgeV9kc3QgKyBqICogQlBTLCAxNik7CisgICAgICB9CisgICAgICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICAgIG1lbWNweSh1X291dCArIGogKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHVfZHN0ICsgaiAqIEJQUywgOCk7CisgICAgICAgIG1lbWNweSh2X291dCArIGogKiBkZWMtPmNhY2hlX3V2X3N0cmlkZV8sIHZfZHN0ICsgaiAqIEJQUywgOCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaWx0ZXJpbmcKKworLy8ga0ZpbHRlckV4dHJhUm93c1tdID0gSG93IG1hbnkgZXh0cmEgbGluZXMgYXJlIG5lZWRlZCBvbiB0aGUgTUIgYm91bmRhcnkKKy8vIGZvciBjYWNoaW5nLCBnaXZlbiBhIGZpbHRlcmluZyBsZXZlbC4KKy8vIFNpbXBsZSBmaWx0ZXI6ICB1cCB0byAyIGx1bWEgc2FtcGxlcyBhcmUgcmVhZCBhbmQgMSBpcyB3cml0dGVuLgorLy8gQ29tcGxleCBmaWx0ZXI6IHVwIHRvIDQgbHVtYSBzYW1wbGVzIGFyZSByZWFkIGFuZCAzIGFyZSB3cml0dGVuLiBTYW1lIGZvcgorLy8gICAgICAgICAgICAgICAgIFUvViwgc28gaXQncyA4IHNhbXBsZXMgdG90YWwgKGJlY2F1c2Ugb2YgdGhlIDJ4IHVwc2FtcGxpbmcpLgorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0ZpbHRlckV4dHJhUm93c1szXSA9IHsgMCwgMiwgOCB9OworCitzdGF0aWMgdm9pZCBEb0ZpbHRlcihjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMsIGludCBtYl94LCBpbnQgbWJfeSkgeworICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKKyAgY29uc3QgaW50IGNhY2hlX2lkID0gY3R4LT5pZF87CisgIGNvbnN0IGludCB5X2JwcyA9IGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBjb25zdCBWUDhGSW5mbyogY29uc3QgZl9pbmZvID0gY3R4LT5mX2luZm9fICsgbWJfeDsKKyAgdWludDhfdCogY29uc3QgeV9kc3QgPSBkZWMtPmNhY2hlX3lfICsgY2FjaGVfaWQgKiAxNiAqIHlfYnBzICsgbWJfeCAqIDE2OworICBjb25zdCBpbnQgaWxldmVsID0gZl9pbmZvLT5mX2lsZXZlbF87CisgIGNvbnN0IGludCBsaW1pdCA9IGZfaW5mby0+Zl9saW1pdF87CisgIGlmIChsaW1pdCA9PSAwKSB7CisgICAgcmV0dXJuOworICB9CisgIGFzc2VydChsaW1pdCA+PSAzKTsKKyAgaWYgKGRlYy0+ZmlsdGVyX3R5cGVfID09IDEpIHsgICAvLyBzaW1wbGUKKyAgICBpZiAobWJfeCA+IDApIHsKKyAgICAgIFZQOFNpbXBsZUhGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCk7CisgICAgfQorICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7CisgICAgICBWUDhTaW1wbGVIRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQpOworICAgIH0KKyAgICBpZiAobWJfeSA+IDApIHsKKyAgICAgIFZQOFNpbXBsZVZGaWx0ZXIxNih5X2RzdCwgeV9icHMsIGxpbWl0ICsgNCk7CisgICAgfQorICAgIGlmIChmX2luZm8tPmZfaW5uZXJfKSB7CisgICAgICBWUDhTaW1wbGVWRmlsdGVyMTZpKHlfZHN0LCB5X2JwcywgbGltaXQpOworICAgIH0KKyAgfSBlbHNlIHsgICAgLy8gY29tcGxleAorICAgIGNvbnN0IGludCB1dl9icHMgPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV87CisgICAgdWludDhfdCogY29uc3QgdV9kc3QgPSBkZWMtPmNhY2hlX3VfICsgY2FjaGVfaWQgKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7CisgICAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBkZWMtPmNhY2hlX3ZfICsgY2FjaGVfaWQgKiA4ICogdXZfYnBzICsgbWJfeCAqIDg7CisgICAgY29uc3QgaW50IGhldl90aHJlc2ggPSBmX2luZm8tPmhldl90aHJlc2hfOworICAgIGlmIChtYl94ID4gMCkgeworICAgICAgVlA4SEZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4SEZpbHRlcjgodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOEhGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICAgIFZQOEhGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgfQorICAgIGlmIChtYl95ID4gMCkgeworICAgICAgVlA4VkZpbHRlcjE2KHlfZHN0LCB5X2JwcywgbGltaXQgKyA0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgICAgVlA4VkZpbHRlcjgodV9kc3QsIHZfZHN0LCB1dl9icHMsIGxpbWl0ICsgNCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICB9CisgICAgaWYgKGZfaW5mby0+Zl9pbm5lcl8pIHsKKyAgICAgIFZQOFZGaWx0ZXIxNmkoeV9kc3QsIHlfYnBzLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICAgIFZQOFZGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIHV2X2JwcywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgfQorICB9Cit9CisKKy8vIEZpbHRlciB0aGUgZGVjb2RlZCBtYWNyb2Jsb2NrIHJvdyAoaWYgbmVlZGVkKQorc3RhdGljIHZvaWQgRmlsdGVyUm93KGNvbnN0IFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgbWJfeDsKKyAgY29uc3QgaW50IG1iX3kgPSBkZWMtPnRocmVhZF9jdHhfLm1iX3lfOworICBhc3NlcnQoZGVjLT50aHJlYWRfY3R4Xy5maWx0ZXJfcm93Xyk7CisgIGZvciAobWJfeCA9IGRlYy0+dGxfbWJfeF87IG1iX3ggPCBkZWMtPmJyX21iX3hfOyArK21iX3gpIHsKKyAgICBEb0ZpbHRlcihkZWMsIG1iX3gsIG1iX3kpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVjb21wdXRlIHRoZSBmaWx0ZXJpbmcgc3RyZW5ndGggZm9yIGVhY2ggc2VnbWVudCBhbmQgZWFjaCBpNHg0L2kxNngxNiBtb2RlLgorCitzdGF0aWMgdm9pZCBQcmVjb21wdXRlRmlsdGVyU3RyZW5ndGhzKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSB7CisgICAgaW50IHM7CisgICAgY29uc3QgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIgPSAmZGVjLT5maWx0ZXJfaGRyXzsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgIGludCBpNHg0OworICAgICAgLy8gRmlyc3QsIGNvbXB1dGUgdGhlIGluaXRpYWwgbGV2ZWwKKyAgICAgIGludCBiYXNlX2xldmVsOworICAgICAgaWYgKGRlYy0+c2VnbWVudF9oZHJfLnVzZV9zZWdtZW50XykgeworICAgICAgICBiYXNlX2xldmVsID0gZGVjLT5zZWdtZW50X2hkcl8uZmlsdGVyX3N0cmVuZ3RoX1tzXTsKKyAgICAgICAgaWYgKCFkZWMtPnNlZ21lbnRfaGRyXy5hYnNvbHV0ZV9kZWx0YV8pIHsKKyAgICAgICAgICBiYXNlX2xldmVsICs9IGhkci0+bGV2ZWxfOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBiYXNlX2xldmVsID0gaGRyLT5sZXZlbF87CisgICAgICB9CisgICAgICBmb3IgKGk0eDQgPSAwOyBpNHg0IDw9IDE7ICsraTR4NCkgeworICAgICAgICBWUDhGSW5mbyogY29uc3QgaW5mbyA9ICZkZWMtPmZzdHJlbmd0aHNfW3NdW2k0eDRdOworICAgICAgICBpbnQgbGV2ZWwgPSBiYXNlX2xldmVsOworICAgICAgICBpZiAoaGRyLT51c2VfbGZfZGVsdGFfKSB7CisgICAgICAgICAgbGV2ZWwgKz0gaGRyLT5yZWZfbGZfZGVsdGFfWzBdOworICAgICAgICAgIGlmIChpNHg0KSB7CisgICAgICAgICAgICBsZXZlbCArPSBoZHItPm1vZGVfbGZfZGVsdGFfWzBdOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsZXZlbCA9IChsZXZlbCA8IDApID8gMCA6IChsZXZlbCA+IDYzKSA/IDYzIDogbGV2ZWw7CisgICAgICAgIGlmIChsZXZlbCA+IDApIHsKKyAgICAgICAgICBpbnQgaWxldmVsID0gbGV2ZWw7CisgICAgICAgICAgaWYgKGhkci0+c2hhcnBuZXNzXyA+IDApIHsKKyAgICAgICAgICAgIGlmIChoZHItPnNoYXJwbmVzc18gPiA0KSB7CisgICAgICAgICAgICAgIGlsZXZlbCA+Pj0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIGlsZXZlbCA+Pj0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbGV2ZWwgPiA5IC0gaGRyLT5zaGFycG5lc3NfKSB7CisgICAgICAgICAgICAgIGlsZXZlbCA9IDkgLSBoZHItPnNoYXJwbmVzc187CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpbGV2ZWwgPCAxKSBpbGV2ZWwgPSAxOworICAgICAgICAgIGluZm8tPmZfaWxldmVsXyA9IGlsZXZlbDsKKyAgICAgICAgICBpbmZvLT5mX2xpbWl0XyA9IDIgKiBsZXZlbCArIGlsZXZlbDsKKyAgICAgICAgICBpbmZvLT5oZXZfdGhyZXNoXyA9IChsZXZlbCA+PSA0MCkgPyAyIDogKGxldmVsID49IDE1KSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGluZm8tPmZfbGltaXRfID0gMDsgIC8vIG5vIGZpbHRlcmluZworICAgICAgICB9CisgICAgICAgIGluZm8tPmZfaW5uZXJfID0gaTR4NDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpdGhlcmluZworCisvLyBtaW5pbWFsIGFtcCB0aGF0IHdpbGwgcHJvdmlkZSBhIG5vbi16ZXJvIGRpdGhlcmluZyBlZmZlY3QKKyNkZWZpbmUgTUlOX0RJVEhFUl9BTVAgNAorCisjZGVmaW5lIERJVEhFUl9BTVBfVEFCX1NJWkUgMTIKK3N0YXRpYyBjb25zdCB1aW50OF90IGtRdWFudFRvRGl0aGVyQW1wW0RJVEhFUl9BTVBfVEFCX1NJWkVdID0geworICAvLyByb3VnaGx5LCBpdCdzIGRxbS0+dXZfbWF0X1sxXQorICA4LCA3LCA2LCA0LCA0LCAyLCAyLCAyLCAxLCAxLCAxLCAxCit9OworCit2b2lkIFZQOEluaXREaXRoZXJpbmcoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBhc3NlcnQoZGVjICE9IE5VTEwpOworICBpZiAob3B0aW9ucyAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IGQgPSBvcHRpb25zLT5kaXRoZXJpbmdfc3RyZW5ndGg7CisgICAgY29uc3QgaW50IG1heF9hbXAgPSAoMSA8PCBWUDhfUkFORE9NX0RJVEhFUl9GSVgpIC0gMTsKKyAgICBjb25zdCBpbnQgZiA9IChkIDwgMCkgPyAwIDogKGQgPiAxMDApID8gbWF4X2FtcCA6IChkICogbWF4X2FtcCAvIDEwMCk7CisgICAgaWYgKGYgPiAwKSB7CisgICAgICBpbnQgczsKKyAgICAgIGludCBhbGxfYW1wID0gMDsKKyAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgICBWUDhRdWFudE1hdHJpeCogY29uc3QgZHFtID0gJmRlYy0+ZHFtX1tzXTsKKyAgICAgICAgaWYgKGRxbS0+dXZfcXVhbnRfIDwgRElUSEVSX0FNUF9UQUJfU0laRSkgeworICAgICAgICAgIC8vIFRPRE8oc2thbCk6IHNob3VsZCB3ZSBzcGVjaWFsbHkgZGl0aGVyIG1vcmUgZm9yIHV2X3F1YW50XyA8IDA/CisgICAgICAgICAgY29uc3QgaW50IGlkeCA9IChkcW0tPnV2X3F1YW50XyA8IDApID8gMCA6IGRxbS0+dXZfcXVhbnRfOworICAgICAgICAgIGRxbS0+ZGl0aGVyXyA9IChmICoga1F1YW50VG9EaXRoZXJBbXBbaWR4XSkgPj4gMzsKKyAgICAgICAgfQorICAgICAgICBhbGxfYW1wIHw9IGRxbS0+ZGl0aGVyXzsKKyAgICAgIH0KKyAgICAgIGlmIChhbGxfYW1wICE9IDApIHsKKyAgICAgICAgVlA4SW5pdFJhbmRvbSgmZGVjLT5kaXRoZXJpbmdfcmdfLCAxLjBmKTsKKyAgICAgICAgZGVjLT5kaXRoZXJfID0gMTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gcG90ZW50aWFsbHkgYWxsb3cgYWxwaGEgZGl0aGVyaW5nCisgICAgZGVjLT5hbHBoYV9kaXRoZXJpbmdfID0gb3B0aW9ucy0+YWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoOworICAgIGlmIChkZWMtPmFscGhhX2RpdGhlcmluZ18gPiAxMDApIHsKKyAgICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IDEwMDsKKyAgICB9IGVsc2UgaWYgKGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA8IDApIHsKKyAgICAgIGRlYy0+YWxwaGFfZGl0aGVyaW5nXyA9IDA7CisgICAgfQorICB9Cit9CisKKy8vIENvbnZlcnQgdG8gcmFuZ2U6IFstMiwyXSBmb3IgZGl0aGVyPTUwLCBbLTQsNF0gZm9yIGRpdGhlcj0xMDAKK3N0YXRpYyB2b2lkIERpdGhlcjh4OChWUDhSYW5kb20qIGNvbnN0IHJnLCB1aW50OF90KiBkc3QsIGludCBicHMsIGludCBhbXApIHsKKyAgdWludDhfdCBkaXRoZXJbNjRdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDggKiA4OyArK2kpIHsKKyAgICBkaXRoZXJbaV0gPSBWUDhSYW5kb21CaXRzMihyZywgVlA4X0RJVEhFUl9BTVBfQklUUyArIDEsIGFtcCk7CisgIH0KKyAgVlA4RGl0aGVyQ29tYmluZTh4OChkaXRoZXIsIGRzdCwgYnBzKTsKK30KKworc3RhdGljIHZvaWQgRGl0aGVyUm93KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpbnQgbWJfeDsKKyAgYXNzZXJ0KGRlYy0+ZGl0aGVyXyk7CisgIGZvciAobWJfeCA9IGRlYy0+dGxfbWJfeF87IG1iX3ggPCBkZWMtPmJyX21iX3hfOyArK21iX3gpIHsKKyAgICBjb25zdCBWUDhUaHJlYWRDb250ZXh0KiBjb25zdCBjdHggPSAmZGVjLT50aHJlYWRfY3R4XzsKKyAgICBjb25zdCBWUDhNQkRhdGEqIGNvbnN0IGRhdGEgPSBjdHgtPm1iX2RhdGFfICsgbWJfeDsKKyAgICBjb25zdCBpbnQgY2FjaGVfaWQgPSBjdHgtPmlkXzsKKyAgICBjb25zdCBpbnQgdXZfYnBzID0gZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICAgIGlmIChkYXRhLT5kaXRoZXJfID49IE1JTl9ESVRIRVJfQU1QKSB7CisgICAgICB1aW50OF90KiBjb25zdCB1X2RzdCA9IGRlYy0+Y2FjaGVfdV8gKyBjYWNoZV9pZCAqIDggKiB1dl9icHMgKyBtYl94ICogODsKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHZfZHN0ID0gZGVjLT5jYWNoZV92XyArIGNhY2hlX2lkICogOCAqIHV2X2JwcyArIG1iX3ggKiA4OworICAgICAgRGl0aGVyOHg4KCZkZWMtPmRpdGhlcmluZ19yZ18sIHVfZHN0LCB1dl9icHMsIGRhdGEtPmRpdGhlcl8pOworICAgICAgRGl0aGVyOHg4KCZkZWMtPmRpdGhlcmluZ19yZ18sIHZfZHN0LCB1dl9icHMsIGRhdGEtPmRpdGhlcl8pOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYWZ0ZXIgYSByb3cgb2YgbWFjcm9ibG9ja3MgaXMgZmluaXNoZWQgZGVjb2RpbmcuCisvLyBJdCBhbHNvIHRha2VzIGludG8gYWNjb3VudCB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKy8vICAqIEluIGNhc2Ugb2YgaW4tbG9vcCBmaWx0ZXJpbmcsIHdlIG11c3QgaG9sZCBvZmYgc2VuZGluZyBzb21lIG9mIHRoZSBib3R0b20KKy8vICAgIHBpeGVscyBhcyB0aGV5IGFyZSB5ZXQgdW5maWx0ZXJlZC4gVGhleSB3aWxsIGJlIHdoZW4gdGhlIG5leHQgbWFjcm9ibG9jaworLy8gICAgcm93IGlzIGRlY29kZWQuIE1lYW53aGlsZSwgd2UgbXVzdCBwcmVzZXJ2ZSB0aGVtIGJ5IHJvdGF0aW5nIHRoZW0gaW4gdGhlCisvLyAgICBjYWNoZSBhcmVhLiBUaGlzIGRvZXNuJ3QgaG9sZCBmb3IgdGhlIHZlcnkgYm90dG9tIHJvdyBvZiB0aGUgdW5jcm9wcGVkCisvLyAgICBwaWN0dXJlIG9mIGNvdXJzZS4KKy8vICAqIHdlIG11c3QgY2xpcCB0aGUgcmVtYWluaW5nIHBpeGVscyBhZ2FpbnN0IHRoZSBjcm9wcGluZyBhcmVhLiBUaGUgVlA4SW8KKy8vICAgIHN0cnVjdCBtdXN0IGhhdmUgdGhlIGZvbGxvd2luZyBmaWVsZHMgc2V0IGNvcnJlY3RseSBiZWZvcmUgY2FsbGluZyBwdXQoKToKKworI2RlZmluZSBNQUNST0JMT0NLX1ZQT1MobWJfeSkgICgobWJfeSkgKiAxNikgICAgLy8gdmVydGljYWwgcG9zaXRpb24gb2YgYSBNQgorCisvLyBGaW5hbGl6ZSBhbmQgdHJhbnNtaXQgYSBjb21wbGV0ZSByb3cuIFJldHVybiBmYWxzZSBpbiBjYXNlIG9mIHVzZXItYWJvcnQuCitzdGF0aWMgaW50IEZpbmlzaFJvdyh2b2lkKiBhcmcxLCB2b2lkKiBhcmcyKSB7CisgIFZQOERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhEZWNvZGVyKilhcmcxOworICBWUDhJbyogY29uc3QgaW8gPSAoVlA4SW8qKWFyZzI7CisgIGludCBvayA9IDE7CisgIGNvbnN0IFZQOFRocmVhZENvbnRleHQqIGNvbnN0IGN0eCA9ICZkZWMtPnRocmVhZF9jdHhfOworICBjb25zdCBpbnQgY2FjaGVfaWQgPSBjdHgtPmlkXzsKKyAgY29uc3QgaW50IGV4dHJhX3lfcm93cyA9IGtGaWx0ZXJFeHRyYVJvd3NbZGVjLT5maWx0ZXJfdHlwZV9dOworICBjb25zdCBpbnQgeXNpemUgPSBleHRyYV95X3Jvd3MgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgY29uc3QgaW50IHV2c2l6ZSA9IChleHRyYV95X3Jvd3MgLyAyKSAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgY29uc3QgaW50IHlfb2Zmc2V0ID0gY2FjaGVfaWQgKiAxNiAqIGRlYy0+Y2FjaGVfeV9zdHJpZGVfOworICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gY2FjaGVfaWQgKiA4ICogZGVjLT5jYWNoZV91dl9zdHJpZGVfOworICB1aW50OF90KiBjb25zdCB5ZHN0ID0gZGVjLT5jYWNoZV95XyAtIHlzaXplICsgeV9vZmZzZXQ7CisgIHVpbnQ4X3QqIGNvbnN0IHVkc3QgPSBkZWMtPmNhY2hlX3VfIC0gdXZzaXplICsgdXZfb2Zmc2V0OworICB1aW50OF90KiBjb25zdCB2ZHN0ID0gZGVjLT5jYWNoZV92XyAtIHV2c2l6ZSArIHV2X29mZnNldDsKKyAgY29uc3QgaW50IG1iX3kgPSBjdHgtPm1iX3lfOworICBjb25zdCBpbnQgaXNfZmlyc3Rfcm93ID0gKG1iX3kgPT0gMCk7CisgIGNvbnN0IGludCBpc19sYXN0X3JvdyA9IChtYl95ID49IGRlYy0+YnJfbWJfeV8gLSAxKTsKKworICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDIpIHsKKyAgICBSZWNvbnN0cnVjdFJvdyhkZWMsIGN0eCk7CisgIH0KKworICBpZiAoY3R4LT5maWx0ZXJfcm93XykgeworICAgIEZpbHRlclJvdyhkZWMpOworICB9CisKKyAgaWYgKGRlYy0+ZGl0aGVyXykgeworICAgIERpdGhlclJvdyhkZWMpOworICB9CisKKyAgaWYgKGlvLT5wdXQgIT0gTlVMTCkgeworICAgIGludCB5X3N0YXJ0ID0gTUFDUk9CTE9DS19WUE9TKG1iX3kpOworICAgIGludCB5X2VuZCA9IE1BQ1JPQkxPQ0tfVlBPUyhtYl95ICsgMSk7CisgICAgaWYgKCFpc19maXJzdF9yb3cpIHsKKyAgICAgIHlfc3RhcnQgLT0gZXh0cmFfeV9yb3dzOworICAgICAgaW8tPnkgPSB5ZHN0OworICAgICAgaW8tPnUgPSB1ZHN0OworICAgICAgaW8tPnYgPSB2ZHN0OworICAgIH0gZWxzZSB7CisgICAgICBpby0+eSA9IGRlYy0+Y2FjaGVfeV8gKyB5X29mZnNldDsKKyAgICAgIGlvLT51ID0gZGVjLT5jYWNoZV91XyArIHV2X29mZnNldDsKKyAgICAgIGlvLT52ID0gZGVjLT5jYWNoZV92XyArIHV2X29mZnNldDsKKyAgICB9CisKKyAgICBpZiAoIWlzX2xhc3Rfcm93KSB7CisgICAgICB5X2VuZCAtPSBleHRyYV95X3Jvd3M7CisgICAgfQorICAgIGlmICh5X2VuZCA+IGlvLT5jcm9wX2JvdHRvbSkgeworICAgICAgeV9lbmQgPSBpby0+Y3JvcF9ib3R0b207ICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyBvbiBsYXN0IHJvdy4KKyAgICB9CisgICAgLy8gSWYgZGVjLT5hbHBoYV9kYXRhXyBpcyBub3QgTlVMTCwgd2UgaGF2ZSBzb21lIGFscGhhIHBsYW5lIHByZXNlbnQuCisgICAgaW8tPmEgPSBOVUxMOworICAgIGlmIChkZWMtPmFscGhhX2RhdGFfICE9IE5VTEwgJiYgeV9zdGFydCA8IHlfZW5kKSB7CisgICAgICBpby0+YSA9IFZQOERlY29tcHJlc3NBbHBoYVJvd3MoZGVjLCBpbywgeV9zdGFydCwgeV9lbmQgLSB5X3N0YXJ0KTsKKyAgICAgIGlmIChpby0+YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBkZWNvZGUgYWxwaGEgZGF0YS4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKKyAgICAgIGNvbnN0IGludCBkZWx0YV95ID0gaW8tPmNyb3BfdG9wIC0geV9zdGFydDsKKyAgICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7CisgICAgICBhc3NlcnQoIShkZWx0YV95ICYgMSkpOworICAgICAgaW8tPnkgKz0gZGVjLT5jYWNoZV95X3N0cmlkZV8gKiBkZWx0YV95OworICAgICAgaW8tPnUgKz0gZGVjLT5jYWNoZV91dl9zdHJpZGVfICogKGRlbHRhX3kgPj4gMSk7CisgICAgICBpby0+diArPSBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gKiAoZGVsdGFfeSA+PiAxKTsKKyAgICAgIGlmIChpby0+YSAhPSBOVUxMKSB7CisgICAgICAgIGlvLT5hICs9IGlvLT53aWR0aCAqIGRlbHRhX3k7CisgICAgICB9CisgICAgfQorICAgIGlmICh5X3N0YXJ0IDwgeV9lbmQpIHsKKyAgICAgIGlvLT55ICs9IGlvLT5jcm9wX2xlZnQ7CisgICAgICBpby0+dSArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7CisgICAgICBpby0+diArPSBpby0+Y3JvcF9sZWZ0ID4+IDE7CisgICAgICBpZiAoaW8tPmEgIT0gTlVMTCkgeworICAgICAgICBpby0+YSArPSBpby0+Y3JvcF9sZWZ0OworICAgICAgfQorICAgICAgaW8tPm1iX3kgPSB5X3N0YXJ0IC0gaW8tPmNyb3BfdG9wOworICAgICAgaW8tPm1iX3cgPSBpby0+Y3JvcF9yaWdodCAtIGlvLT5jcm9wX2xlZnQ7CisgICAgICBpby0+bWJfaCA9IHlfZW5kIC0geV9zdGFydDsKKyAgICAgIG9rID0gaW8tPnB1dChpbyk7CisgICAgfQorICB9CisgIC8vIHJvdGF0ZSB0b3Agc2FtcGxlcyBpZiBuZWVkZWQKKyAgaWYgKGNhY2hlX2lkICsgMSA9PSBkZWMtPm51bV9jYWNoZXNfKSB7CisgICAgaWYgKCFpc19sYXN0X3JvdykgeworICAgICAgbWVtY3B5KGRlYy0+Y2FjaGVfeV8gLSB5c2l6ZSwgeWRzdCArIDE2ICogZGVjLT5jYWNoZV95X3N0cmlkZV8sIHlzaXplKTsKKyAgICAgIG1lbWNweShkZWMtPmNhY2hlX3VfIC0gdXZzaXplLCB1ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKKyAgICAgIG1lbWNweShkZWMtPmNhY2hlX3ZfIC0gdXZzaXplLCB2ZHN0ICsgOCAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXywgdXZzaXplKTsKKyAgICB9CisgIH0KKworICByZXR1cm4gb2s7Cit9CisKKyN1bmRlZiBNQUNST0JMT0NLX1ZQT1MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMTsKKyAgVlA4VGhyZWFkQ29udGV4dCogY29uc3QgY3R4ID0gJmRlYy0+dGhyZWFkX2N0eF87CisgIGNvbnN0IGludCBmaWx0ZXJfcm93ID0KKyAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApICYmCisgICAgICAoZGVjLT5tYl95XyA+PSBkZWMtPnRsX21iX3lfKSAmJiAoZGVjLT5tYl95XyA8PSBkZWMtPmJyX21iX3lfKTsKKyAgaWYgKGRlYy0+bXRfbWV0aG9kXyA9PSAwKSB7CisgICAgLy8gY3R4LT5pZF8gYW5kIGN0eC0+Zl9pbmZvXyBhcmUgYWxyZWFkeSBzZXQKKyAgICBjdHgtPm1iX3lfID0gZGVjLT5tYl95XzsKKyAgICBjdHgtPmZpbHRlcl9yb3dfID0gZmlsdGVyX3JvdzsKKyAgICBSZWNvbnN0cnVjdFJvdyhkZWMsIGN0eCk7CisgICAgb2sgPSBGaW5pc2hSb3coZGVjLCBpbyk7CisgIH0gZWxzZSB7CisgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmRlYy0+d29ya2VyXzsKKyAgICAvLyBGaW5pc2ggcHJldmlvdXMgam9iICpiZWZvcmUqIHVwZGF0aW5nIGNvbnRleHQKKyAgICBvayAmPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMod29ya2VyKTsKKyAgICBhc3NlcnQod29ya2VyLT5zdGF0dXNfID09IE9LKTsKKyAgICBpZiAob2spIHsgICAvLyBzcGF3biBhIG5ldyBkZWJsb2NraW5nL291dHB1dCBqb2IKKyAgICAgIGN0eC0+aW9fID0gKmlvOworICAgICAgY3R4LT5pZF8gPSBkZWMtPmNhY2hlX2lkXzsKKyAgICAgIGN0eC0+bWJfeV8gPSBkZWMtPm1iX3lfOworICAgICAgY3R4LT5maWx0ZXJfcm93XyA9IGZpbHRlcl9yb3c7CisgICAgICBpZiAoZGVjLT5tdF9tZXRob2RfID09IDIpIHsgIC8vIHN3YXAgbWFjcm9ibG9jayBkYXRhCisgICAgICAgIFZQOE1CRGF0YSogY29uc3QgdG1wID0gY3R4LT5tYl9kYXRhXzsKKyAgICAgICAgY3R4LT5tYl9kYXRhXyA9IGRlYy0+bWJfZGF0YV87CisgICAgICAgIGRlYy0+bWJfZGF0YV8gPSB0bXA7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBwZXJmb3JtIHJlY29uc3RydWN0aW9uIGRpcmVjdGx5IGluIG1haW4gdGhyZWFkCisgICAgICAgIFJlY29uc3RydWN0Um93KGRlYywgY3R4KTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWx0ZXJfcm93KSB7ICAgICAgICAgICAgLy8gc3dhcCBmaWx0ZXIgaW5mbworICAgICAgICBWUDhGSW5mbyogY29uc3QgdG1wID0gY3R4LT5mX2luZm9fOworICAgICAgICBjdHgtPmZfaW5mb18gPSBkZWMtPmZfaW5mb187CisgICAgICAgIGRlYy0+Zl9pbmZvXyA9IHRtcDsKKyAgICAgIH0KKyAgICAgIC8vIChyZWNvbnN0cnVjdCkrZmlsdGVyIGluIHBhcmFsbGVsCisgICAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkxhdW5jaCh3b3JrZXIpOworICAgICAgaWYgKCsrZGVjLT5jYWNoZV9pZF8gPT0gZGVjLT5udW1fY2FjaGVzXykgeworICAgICAgICBkZWMtPmNhY2hlX2lkXyA9IDA7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIgb25jZSB1c2VyJ3Mgc2V0dXAoKSBpcyBjYWxsZWQuCisKK1ZQOFN0YXR1c0NvZGUgVlA4RW50ZXJDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICAvLyBDYWxsIHNldHVwKCkgZmlyc3QuIFRoaXMgbWF5IHRyaWdnZXIgYWRkaXRpb25hbCBkZWNvZGluZyBmZWF0dXJlcyBvbiAnaW8nLgorICAvLyBOb3RlOiBBZnRlcndhcmQsIHdlIG11c3QgY2FsbCB0ZWFyZG93bigpIG5vIG1hdHRlciB3aGF0LgorICBpZiAoaW8tPnNldHVwICE9IE5VTEwgJiYgIWlvLT5zZXR1cChpbykpIHsKKyAgICBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCwgIkZyYW1lIHNldHVwIGZhaWxlZCIpOworICAgIHJldHVybiBkZWMtPnN0YXR1c187CisgIH0KKworICAvLyBEaXNhYmxlIGZpbHRlcmluZyBwZXIgdXNlciByZXF1ZXN0CisgIGlmIChpby0+YnlwYXNzX2ZpbHRlcmluZykgeworICAgIGRlYy0+ZmlsdGVyX3R5cGVfID0gMDsKKyAgfQorCisgIC8vIERlZmluZSB0aGUgYXJlYSB3aGVyZSB3ZSBjYW4gc2tpcCBpbi1sb29wIGZpbHRlcmluZywgaW4gY2FzZSBvZiBjcm9wcGluZy4KKyAgLy8KKyAgLy8gJ1NpbXBsZScgZmlsdGVyIHJlYWRzIHR3byBsdW1hIHNhbXBsZXMgb3V0c2lkZSBvZiB0aGUgbWFjcm9ibG9jaworICAvLyBhbmQgZmlsdGVycyBvbmUuIEl0IGRvZXNuJ3QgZmlsdGVyIHRoZSBjaHJvbWEgc2FtcGxlcy4gSGVuY2UsIHdlIGNhbgorICAvLyBhdm9pZCBkb2luZyB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcgYmVmb3JlIGNyb3BfdG9wL2Nyb3BfbGVmdCBwb3NpdGlvbi4KKyAgLy8gRm9yIHRoZSAnQ29tcGxleCcgZmlsdGVyLCAzIHNhbXBsZXMgYXJlIHJlYWQgYW5kIHVwIHRvIDMgYXJlIGZpbHRlcmVkLgorICAvLyBNZWFuczogdGhlcmUncyBhIGRlcGVuZGVuY3kgY2hhaW4gdGhhdCBnb2VzIGFsbCB0aGUgd2F5IHVwIHRvIHRoZQorICAvLyB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlIHBpY3R1cmUgKE1CICMwKS4gV2UgbXVzdCBmaWx0ZXIgYWxsIHRoZSBwcmV2aW91cworICAvLyBtYWNyb2Jsb2Nrcy4KKyAgeworICAgIGNvbnN0IGludCBleHRyYV9waXhlbHMgPSBrRmlsdGVyRXh0cmFSb3dzW2RlYy0+ZmlsdGVyX3R5cGVfXTsKKyAgICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPT0gMikgeworICAgICAgLy8gRm9yIGNvbXBsZXggZmlsdGVyLCB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBkZXBlbmRlbmN5IGNoYWluLgorICAgICAgZGVjLT50bF9tYl94XyA9IDA7CisgICAgICBkZWMtPnRsX21iX3lfID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgLy8gRm9yIHNpbXBsZSBmaWx0ZXIsIHdlIGNhbiBmaWx0ZXIgb25seSB0aGUgY3JvcHBlZCByZWdpb24uCisgICAgICAvLyBXZSBpbmNsdWRlICdleHRyYV9waXhlbHMnIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBib3VuZGFyeSwgc2luY2UKKyAgICAgIC8vIHZlcnRpY2FsIG9yIGhvcml6b250YWwgZmlsdGVyaW5nIG9mIHRoZSBwcmV2aW91cyBtYWNyb2Jsb2NrIGNhbgorICAgICAgLy8gbW9kaWZ5IHNvbWUgYWJ1dHRpbmcgcGl4ZWxzLgorICAgICAgZGVjLT50bF9tYl94XyA9IChpby0+Y3JvcF9sZWZ0IC0gZXh0cmFfcGl4ZWxzKSA+PiA0OworICAgICAgZGVjLT50bF9tYl95XyA9IChpby0+Y3JvcF90b3AgLSBleHRyYV9waXhlbHMpID4+IDQ7CisgICAgICBpZiAoZGVjLT50bF9tYl94XyA8IDApIGRlYy0+dGxfbWJfeF8gPSAwOworICAgICAgaWYgKGRlYy0+dGxfbWJfeV8gPCAwKSBkZWMtPnRsX21iX3lfID0gMDsKKyAgICB9CisgICAgLy8gV2UgbmVlZCBzb21lICdleHRyYScgcGl4ZWxzIG9uIHRoZSByaWdodC9ib3R0b20uCisgICAgZGVjLT5icl9tYl95XyA9IChpby0+Y3JvcF9ib3R0b20gKyAxNSArIGV4dHJhX3BpeGVscykgPj4gNDsKKyAgICBkZWMtPmJyX21iX3hfID0gKGlvLT5jcm9wX3JpZ2h0ICsgMTUgKyBleHRyYV9waXhlbHMpID4+IDQ7CisgICAgaWYgKGRlYy0+YnJfbWJfeF8gPiBkZWMtPm1iX3dfKSB7CisgICAgICBkZWMtPmJyX21iX3hfID0gZGVjLT5tYl93XzsKKyAgICB9CisgICAgaWYgKGRlYy0+YnJfbWJfeV8gPiBkZWMtPm1iX2hfKSB7CisgICAgICBkZWMtPmJyX21iX3lfID0gZGVjLT5tYl9oXzsKKyAgICB9CisgIH0KKyAgUHJlY29tcHV0ZUZpbHRlclN0cmVuZ3RocyhkZWMpOworICByZXR1cm4gVlA4X1NUQVRVU19PSzsKK30KKworaW50IFZQOEV4aXRDcml0aWNhbChWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpbnQgb2sgPSAxOworICBpZiAoZGVjLT5tdF9tZXRob2RfID4gMCkgeworICAgIG9rID0gV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5TeW5jKCZkZWMtPndvcmtlcl8pOworICB9CisKKyAgaWYgKGlvLT50ZWFyZG93biAhPSBOVUxMKSB7CisgICAgaW8tPnRlYXJkb3duKGlvKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3IgbXVsdGktdGhyZWFkZWQgZGVjb2Rpbmcgd2UgbmVlZCB0byB1c2UgMyByb3dzIG9mIDE2IHBpeGVscyBhcyBkZWxheSBsaW5lLgorLy8KKy8vIFJlYXNvbiBpczogdGhlIGRlYmxvY2tpbmcgZmlsdGVyIGNhbm5vdCBkZWJsb2NrIHRoZSBib3R0b20gaG9yaXpvbnRhbCBlZGdlcworLy8gaW1tZWRpYXRlbHksIGFuZCBuZWVkcyB0byB3YWl0IGZvciBmaXJzdCBmZXcgcm93cyBvZiB0aGUgbmV4dCBtYWNyb2Jsb2NrIHRvCisvLyBiZSBkZWNvZGVkLiBIZW5jZSwgZGVibG9ja2luZyBpcyBsYWdnaW5nIGJlaGluZCBieSA0IG9yIDggcGl4ZWxzIChkZXBlbmRpbmcKKy8vIG9uIHN0cmVuZ3RoKS4KKy8vIFdpdGggdHdvIHRocmVhZHMsIHRoZSB2ZXJ0aWNhbCBwb3NpdGlvbnMgb2YgdGhlIHJvd3MgYmVpbmcgZGVjb2RlZCBhcmU6CisvLyBEZWNvZGU6ICBbIDAuLjE1XVsxNi4uMzFdWzMyLi40N11bNDguLjYzXVs2NC4uNzldWy4uLgorLy8gRGVibG9jazogICAgICAgICBbIDAuLjExXVsxMi4uMjddWzI4Li40M11bNDQuLjU5XVsuLi4KKy8vIElmIHdlIHVzZSB0d28gdGhyZWFkcyBhbmQgdHdvIGNhY2hlcyBvZiAxNiBwaXhlbHMsIHRoZSBzZXF1ZW5jZSB3b3VsZCBiZToKKy8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1ISFdWzE2Li4zMV1bIDAuLjE1XVsuLi4KKy8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3ISFdWy00Li4xMV1bMTIuLjI3XVsuLi4KKy8vIFRoZSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcm93IFsxMi4uMTUhIV0gdGhhdCBib3RoIHRoZSBkZWNvZGluZyBhbmQKKy8vIGRlYmxvY2tpbmcgdGhyZWFkcyBhcmUgd3JpdGluZyBzaW11bHRhbmVvdXNseS4KKy8vIFdpdGggMyBjYWNoZSBsaW5lcywgb25lIGdldCBhIHNhZmUgd3JpdGUgcGF0dGVybjoKKy8vIERlY29kZTogIFsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVsgMC4uMTVdWzE2Li4zMV1bMzIuLjQ3XVswLi4KKy8vIERlYmxvY2s6ICAgICAgICAgWyAwLi4xMV1bMTIuLjI3XVsyOC4uNDNdWy00Li4xMV1bMTIuLjI3XVsyOC4uLgorLy8gTm90ZSB0aGF0IG11bHRpLXRocmVhZGVkIG91dHB1dCBfd2l0aG91dF8gZGVibG9ja2luZyBjYW4gbWFrZSB1c2Ugb2YgdHdvCisvLyBjYWNoZSBsaW5lcyBvZiAxNiBwaXhlbHMgb25seSwgc2luY2UgdGhlcmUncyBubyBsYWdnaW5nIGJlaGluZC4gVGhlIGRlY29kaW5nCisvLyBhbmQgb3V0cHV0IHByb2Nlc3MgaGF2ZSBub24tY29uY3VycmVudCB3cml0aW5nOgorLy8gRGVjb2RlOiAgWyAwLi4xNV1bMTYuLjMxXVsgMC4uMTVdWzE2Li4zMV1bLi4uCisvLyBpby0+cHV0OiAgICAgICAgIFsgMC4uMTVdWzE2Li4zMV1bIDAuLjE1XVsuLi4KKworI2RlZmluZSBNVF9DQUNIRV9MSU5FUyAzCisjZGVmaW5lIFNUX0NBQ0hFX0xJTkVTIDEgICAvLyAxIGNhY2hlIHJvdyBvbmx5IGZvciBzaW5nbGUtdGhyZWFkZWQgY2FzZQorCisvLyBJbml0aWFsaXplIG11bHRpL3NpbmdsZS10aHJlYWQgd29ya2VyCitzdGF0aWMgaW50IEluaXRUaHJlYWRDb250ZXh0KFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBkZWMtPmNhY2hlX2lkXyA9IDA7CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmRlYy0+d29ya2VyXzsKKyAgICBpZiAoIVdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+UmVzZXQod29ya2VyKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQgaW5pdGlhbGl6YXRpb24gZmFpbGVkLiIpOworICAgIH0KKyAgICB3b3JrZXItPmRhdGExID0gZGVjOworICAgIHdvcmtlci0+ZGF0YTIgPSAodm9pZCopJmRlYy0+dGhyZWFkX2N0eF8uaW9fOworICAgIHdvcmtlci0+aG9vayA9IEZpbmlzaFJvdzsKKyAgICBkZWMtPm51bV9jYWNoZXNfID0KKyAgICAgIChkZWMtPmZpbHRlcl90eXBlXyA+IDApID8gTVRfQ0FDSEVfTElORVMgOiBNVF9DQUNIRV9MSU5FUyAtIDE7CisgIH0gZWxzZSB7CisgICAgZGVjLT5udW1fY2FjaGVzXyA9IFNUX0NBQ0hFX0xJTkVTOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgVlA4R2V0VGhyZWFkTWV0aG9kKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGlmIChvcHRpb25zID09IE5VTEwgfHwgb3B0aW9ucy0+dXNlX3RocmVhZHMgPT0gMCkgeworICAgIHJldHVybiAwOworICB9CisgICh2b2lkKWhlYWRlcnM7CisgICh2b2lkKXdpZHRoOworICAodm9pZCloZWlnaHQ7CisgIGFzc2VydChoZWFkZXJzID09IE5VTEwgfHwgIWhlYWRlcnMtPmlzX2xvc3NsZXNzKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1RIUkVBRCkKKyAgaWYgKHdpZHRoIDwgTUlOX1dJRFRIX0ZPUl9USFJFQURTKSByZXR1cm4gMDsKKyAgLy8gVE9ETyhza2FsKTogdHVuZSB0aGUgaGV1cmlzdGljIGZ1cnRoZXIKKyNpZiAwCisgIGlmIChoZWlnaHQgPCAyICogd2lkdGgpIHJldHVybiAyOworI2VuZGlmCisgIHJldHVybiAyOworI2Vsc2UgICAvLyAhV0VCUF9VU0VfVEhSRUFECisgIHJldHVybiAwOworI2VuZGlmCit9CisKKyN1bmRlZiBNVF9DQUNIRV9MSU5FUworI3VuZGVmIFNUX0NBQ0hFX0xJTkVTCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZW1vcnkgc2V0dXAKKworc3RhdGljIGludCBBbGxvY2F0ZU1lbW9yeShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgY29uc3QgaW50IG51bV9jYWNoZXMgPSBkZWMtPm51bV9jYWNoZXNfOworICBjb25zdCBpbnQgbWJfdyA9IGRlYy0+bWJfd187CisgIC8vIE5vdGU6IHdlIHVzZSAnc2l6ZV90JyB3aGVuIHRoZXJlJ3Mgbm8gb3ZlcmZsb3cgcmlzaywgdWludDY0X3Qgb3RoZXJ3aXNlLgorICBjb25zdCBzaXplX3QgaW50cmFfcHJlZF9tb2RlX3NpemUgPSA0ICogbWJfdyAqIHNpemVvZih1aW50OF90KTsKKyAgY29uc3Qgc2l6ZV90IHRvcF9zaXplID0gc2l6ZW9mKFZQOFRvcFNhbXBsZXMpICogbWJfdzsKKyAgY29uc3Qgc2l6ZV90IG1iX2luZm9fc2l6ZSA9IChtYl93ICsgMSkgKiBzaXplb2YoVlA4TUIpOworICBjb25zdCBzaXplX3QgZl9pbmZvX3NpemUgPQorICAgICAgKGRlYy0+ZmlsdGVyX3R5cGVfID4gMCkgPworICAgICAgICAgIG1iX3cgKiAoZGVjLT5tdF9tZXRob2RfID4gMCA/IDIgOiAxKSAqIHNpemVvZihWUDhGSW5mbykKKyAgICAgICAgOiAwOworICBjb25zdCBzaXplX3QgeXV2X3NpemUgPSBZVVZfU0laRSAqIHNpemVvZigqZGVjLT55dXZfYl8pOworICBjb25zdCBzaXplX3QgbWJfZGF0YV9zaXplID0KKyAgICAgIChkZWMtPm10X21ldGhvZF8gPT0gMiA/IDIgOiAxKSAqIG1iX3cgKiBzaXplb2YoKmRlYy0+bWJfZGF0YV8pOworICBjb25zdCBzaXplX3QgY2FjaGVfaGVpZ2h0ID0gKDE2ICogbnVtX2NhY2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX10pICogMyAvIDI7CisgIGNvbnN0IHNpemVfdCBjYWNoZV9zaXplID0gdG9wX3NpemUgKiBjYWNoZV9oZWlnaHQ7CisgIC8vIGFscGhhX3NpemUgaXMgdGhlIG9ubHkgb25lIHRoYXQgc2NhbGVzIGFzIHdpZHRoIHggaGVpZ2h0LgorICBjb25zdCB1aW50NjRfdCBhbHBoYV9zaXplID0gKGRlYy0+YWxwaGFfZGF0YV8gIT0gTlVMTCkgPworICAgICAgKHVpbnQ2NF90KWRlYy0+cGljX2hkcl8ud2lkdGhfICogZGVjLT5waWNfaGRyXy5oZWlnaHRfIDogMFVMTDsKKyAgY29uc3QgdWludDY0X3QgbmVlZGVkID0gKHVpbnQ2NF90KWludHJhX3ByZWRfbW9kZV9zaXplCisgICAgICAgICAgICAgICAgICAgICAgICArIHRvcF9zaXplICsgbWJfaW5mb19zaXplICsgZl9pbmZvX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgeXV2X3NpemUgKyBtYl9kYXRhX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICsgY2FjaGVfc2l6ZSArIGFscGhhX3NpemUgKyBXRUJQX0FMSUdOX0NTVDsKKyAgdWludDhfdCogbWVtOworCisgIGlmIChuZWVkZWQgIT0gKHNpemVfdCluZWVkZWQpIHJldHVybiAwOyAgLy8gY2hlY2sgZm9yIG92ZXJmbG93CisgIGlmIChuZWVkZWQgPiBkZWMtPm1lbV9zaXplXykgeworICAgIFdlYlBTYWZlRnJlZShkZWMtPm1lbV8pOworICAgIGRlYy0+bWVtX3NpemVfID0gMDsKKyAgICBkZWMtPm1lbV8gPSBXZWJQU2FmZU1hbGxvYyhuZWVkZWQsIHNpemVvZih1aW50OF90KSk7CisgICAgaWYgKGRlYy0+bWVtXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgIm5vIG1lbW9yeSBkdXJpbmcgZnJhbWUgaW5pdGlhbGl6YXRpb24uIik7CisgICAgfQorICAgIC8vIGRvd24tY2FzdCBpcyBvaywgdGhhbmtzIHRvIFdlYlBTYWZlTWFsbG9jKCkgYWJvdmUuCisgICAgZGVjLT5tZW1fc2l6ZV8gPSAoc2l6ZV90KW5lZWRlZDsKKyAgfQorCisgIG1lbSA9ICh1aW50OF90KilkZWMtPm1lbV87CisgIGRlYy0+aW50cmFfdF8gPSBtZW07CisgIG1lbSArPSBpbnRyYV9wcmVkX21vZGVfc2l6ZTsKKworICBkZWMtPnl1dl90XyA9IChWUDhUb3BTYW1wbGVzKiltZW07CisgIG1lbSArPSB0b3Bfc2l6ZTsKKworICBkZWMtPm1iX2luZm9fID0gKChWUDhNQiopbWVtKSArIDE7CisgIG1lbSArPSBtYl9pbmZvX3NpemU7CisKKyAgZGVjLT5mX2luZm9fID0gZl9pbmZvX3NpemUgPyAoVlA4RkluZm8qKW1lbSA6IE5VTEw7CisgIG1lbSArPSBmX2luZm9fc2l6ZTsKKyAgZGVjLT50aHJlYWRfY3R4Xy5pZF8gPSAwOworICBkZWMtPnRocmVhZF9jdHhfLmZfaW5mb18gPSBkZWMtPmZfaW5mb187CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgLy8gc2Vjb25kYXJ5IGNhY2hlIGxpbmUuIFRoZSBkZWJsb2NraW5nIHByb2Nlc3MgbmVlZCB0byBtYWtlIHVzZSBvZiB0aGUKKyAgICAvLyBmaWx0ZXJpbmcgc3RyZW5ndGggZnJvbSBwcmV2aW91cyBtYWNyb2Jsb2NrIHJvdywgd2hpbGUgdGhlIG5ldyBvbmVzCisgICAgLy8gYXJlIGJlaW5nIGRlY29kZWQgaW4gcGFyYWxsZWwuIFdlJ2xsIGp1c3Qgc3dhcCB0aGUgcG9pbnRlcnMuCisgICAgZGVjLT50aHJlYWRfY3R4Xy5mX2luZm9fICs9IG1iX3c7CisgIH0KKworICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0pOworICBhc3NlcnQoKHl1dl9zaXplICYgV0VCUF9BTElHTl9DU1QpID09IDApOworICBkZWMtPnl1dl9iXyA9IG1lbTsKKyAgbWVtICs9IHl1dl9zaXplOworCisgIGRlYy0+bWJfZGF0YV8gPSAoVlA4TUJEYXRhKiltZW07CisgIGRlYy0+dGhyZWFkX2N0eF8ubWJfZGF0YV8gPSAoVlA4TUJEYXRhKiltZW07CisgIGlmIChkZWMtPm10X21ldGhvZF8gPT0gMikgeworICAgIGRlYy0+dGhyZWFkX2N0eF8ubWJfZGF0YV8gKz0gbWJfdzsKKyAgfQorICBtZW0gKz0gbWJfZGF0YV9zaXplOworCisgIGRlYy0+Y2FjaGVfeV9zdHJpZGVfID0gMTYgKiBtYl93OworICBkZWMtPmNhY2hlX3V2X3N0cmlkZV8gPSA4ICogbWJfdzsKKyAgeworICAgIGNvbnN0IGludCBleHRyYV9yb3dzID0ga0ZpbHRlckV4dHJhUm93c1tkZWMtPmZpbHRlcl90eXBlX107CisgICAgY29uc3QgaW50IGV4dHJhX3kgPSBleHRyYV9yb3dzICogZGVjLT5jYWNoZV95X3N0cmlkZV87CisgICAgY29uc3QgaW50IGV4dHJhX3V2ID0gKGV4dHJhX3Jvd3MgLyAyKSAqIGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgICBkZWMtPmNhY2hlX3lfID0gbWVtICsgZXh0cmFfeTsKKyAgICBkZWMtPmNhY2hlX3VfID0gZGVjLT5jYWNoZV95XworICAgICAgICAgICAgICAgICAgKyAxNiAqIG51bV9jYWNoZXMgKiBkZWMtPmNhY2hlX3lfc3RyaWRlXyArIGV4dHJhX3V2OworICAgIGRlYy0+Y2FjaGVfdl8gPSBkZWMtPmNhY2hlX3VfCisgICAgICAgICAgICAgICAgICArIDggKiBudW1fY2FjaGVzICogZGVjLT5jYWNoZV91dl9zdHJpZGVfICsgZXh0cmFfdXY7CisgICAgZGVjLT5jYWNoZV9pZF8gPSAwOworICB9CisgIG1lbSArPSBjYWNoZV9zaXplOworCisgIC8vIGFscGhhIHBsYW5lCisgIGRlYy0+YWxwaGFfcGxhbmVfID0gYWxwaGFfc2l6ZSA/IG1lbSA6IE5VTEw7CisgIG1lbSArPSBhbHBoYV9zaXplOworICBhc3NlcnQobWVtIDw9ICh1aW50OF90KilkZWMtPm1lbV8gKyBkZWMtPm1lbV9zaXplXyk7CisKKyAgLy8gbm90ZTogbGVmdC90b3AtaW5mbyBpcyBpbml0aWFsaXplZCBvbmNlIGZvciBhbGwuCisgIG1lbXNldChkZWMtPm1iX2luZm9fIC0gMSwgMCwgbWJfaW5mb19zaXplKTsKKyAgVlA4SW5pdFNjYW5saW5lKGRlYyk7ICAgLy8gaW5pdGlhbGl6ZSBsZWZ0IHRvby4KKworICAvLyBpbml0aWFsaXplIHRvcAorICBtZW1zZXQoZGVjLT5pbnRyYV90XywgQl9EQ19QUkVELCBpbnRyYV9wcmVkX21vZGVfc2l6ZSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEluaXRJbyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBpbykgeworICAvLyBwcmVwYXJlICdpbycKKyAgaW8tPm1iX3kgPSAwOworICBpby0+eSA9IGRlYy0+Y2FjaGVfeV87CisgIGlvLT51ID0gZGVjLT5jYWNoZV91XzsKKyAgaW8tPnYgPSBkZWMtPmNhY2hlX3ZfOworICBpby0+eV9zdHJpZGUgPSBkZWMtPmNhY2hlX3lfc3RyaWRlXzsKKyAgaW8tPnV2X3N0cmlkZSA9IGRlYy0+Y2FjaGVfdXZfc3RyaWRlXzsKKyAgaW8tPmEgPSBOVUxMOworfQorCitpbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGlmICghSW5pdFRocmVhZENvbnRleHQoZGVjKSkgcmV0dXJuIDA7ICAvLyBjYWxsIGZpcnN0LiBTZXRzIGRlYy0+bnVtX2NhY2hlc18uCisgIGlmICghQWxsb2NhdGVNZW1vcnkoZGVjKSkgcmV0dXJuIDA7CisgIEluaXRJbyhkZWMsIGlvKTsKKyAgVlA4RHNwSW5pdCgpOyAgLy8gSW5pdCBjcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycyBhbmQgbG9vay11cCB0YWJsZXMuCisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lkZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaWRlY19kZWMuYwpzaW1pbGFyaXR5IGluZGV4IDczJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvaWRlYy5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lkZWNfZGVjLmMKaW5kZXggZDcyYWM2MC4uNWIwOWIwMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lkZWMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL2lkZWNfZGVjLmMKQEAgLTEyLDIxICsxMiwxOSBAQAogLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2Vsc2UKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4vdnA4aS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvYWxwaGFpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvd2VicGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgogCiAvLyBJbiBhcHBlbmQgbW9kZSwgYnVmZmVyIGFsbG9jYXRpb25zIGluY3JlYXNlIGFzIG11bHRpcGxlcyBvZiB0aGlzIHZhbHVlLgogLy8gTmVlZHMgdG8gYmUgYSBwb3dlciBvZiAyLgpAQCAtMzYsMTEgKzM0LDEzIEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRGF0YSBzdHJ1Y3R1cmVzIGZvciBtZW1vcnkgYW5kIHN0YXRlcwogCi0vLyBEZWNvZGluZyBzdGF0ZXMuIFN0YXRlIG5vcm1hbGx5IGZsb3dzIGxpa2UgSEVBREVSLT5QQVJUUzAtPkRBVEEtPkRPTkUuCisvLyBEZWNvZGluZyBzdGF0ZXMuIFN0YXRlIG5vcm1hbGx5IGZsb3dzIGFzOgorLy8gV0VCUF9IRUFERVItPlZQOF9IRUFERVItPlZQOF9QQVJUUzAtPlZQOF9EQVRBLT5ET05FIGZvciBhIGxvc3N5IGltYWdlLCBhbmQKKy8vIFdFQlBfSEVBREVSLT5WUDhMX0hFQURFUi0+VlA4TF9EQVRBLT5ET05FIGZvciBhIGxvc3NsZXNzIGltYWdlLgogLy8gSWYgdGhlcmUgaXMgYW55IGVycm9yIHRoZSBkZWNvZGVyIGdvZXMgaW50byBzdGF0ZSBFUlJPUi4KIHR5cGVkZWYgZW51bSB7Ci0gIFNUQVRFX1BSRV9WUDgsICAvLyBBbGwgZGF0YSBiZWZvcmUgdGhhdCBvZiB0aGUgZmlyc3QgVlA4IGNodW5rLgotICBTVEFURV9WUDhfRlJBTUVfSEVBREVSLCAgLy8gRm9yIFZQOCBGcmFtZSBoZWFkZXIgKHdpdGhpbiBWUDggY2h1bmspLgorICBTVEFURV9XRUJQX0hFQURFUiwgIC8vIEFsbCB0aGUgZGF0YSBiZWZvcmUgdGhhdCBvZiB0aGUgVlA4L1ZQOEwgY2h1bmsuCisgIFNUQVRFX1ZQOF9IRUFERVIsICAgLy8gVGhlIFZQOCBGcmFtZSBoZWFkZXIgKHdpdGhpbiB0aGUgVlA4IGNodW5rKS4KICAgU1RBVEVfVlA4X1BBUlRTMCwKICAgU1RBVEVfVlA4X0RBVEEsCiAgIFNUQVRFX1ZQOExfSEVBREVSLApAQCAtNzYsMzAgKzc2LDI0IEBACiAgIFZQOElvIGlvXzsKIAogICBNZW1CdWZmZXIgbWVtXzsgICAgICAgICAgLy8gaW5wdXQgbWVtb3J5IGJ1ZmZlci4KLSAgV2ViUERlY0J1ZmZlciBvdXRwdXRfOyAgIC8vIG91dHB1dCBidWZmZXIgKHdoZW4gbm8gZXh0ZXJuYWwgb25lIGlzIHN1cHBsaWVkKQorICBXZWJQRGVjQnVmZmVyIG91dHB1dF87ICAgLy8gb3V0cHV0IGJ1ZmZlciAod2hlbiBubyBleHRlcm5hbCBvbmUgaXMgc3VwcGxpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBpZiB0aGUgZXh0ZXJuYWwgb25lIGhhcyBzbG93LW1lbW9yeSkKKyAgV2ViUERlY0J1ZmZlciogZmluYWxfb3V0cHV0XzsgIC8vIFNsb3ctbWVtb3J5IG91dHB1dCB0byBjb3B5IHRvIGV2ZW50dWFsbHkuCiAgIHNpemVfdCBjaHVua19zaXplXzsgICAgICAvLyBDb21wcmVzc2VkIFZQOC9WUDhMIHNpemUgZXh0cmFjdGVkIGZyb20gSGVhZGVyLgorCisgIGludCBsYXN0X21iX3lfOyAgICAgICAgICAvLyBsYXN0IHJvdyByZWFjaGVkIGZvciBpbnRyYS1tb2RlIGRlY29kaW5nCiB9OwogCiAvLyBNQiBjb250ZXh0IHRvIHJlc3RvcmUgaW4gY2FzZSBWUDhEZWNvZGVNQigpIGZhaWxzCiB0eXBlZGVmIHN0cnVjdCB7CiAgIFZQOE1CIGxlZnRfOwogICBWUDhNQiBpbmZvXzsKLSAgdWludDhfdCBpbnRyYV90X1s0XTsKLSAgdWludDhfdCBpbnRyYV9sX1s0XTsKLSAgVlA4Qml0UmVhZGVyIGJyXzsKICAgVlA4Qml0UmVhZGVyIHRva2VuX2JyXzsKIH0gTUJDb250ZXh0OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWVtQnVmZmVyOiBpbmNvbWluZyBkYXRhIGhhbmRsaW5nCiAKLXN0YXRpYyB2b2lkIFJlbWFwQml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHB0cmRpZmZfdCBvZmZzZXQpIHsKLSAgaWYgKGJyLT5idWZfICE9IE5VTEwpIHsKLSAgICBici0+YnVmXyArPSBvZmZzZXQ7Ci0gICAgYnItPmJ1Zl9lbmRfICs9IG9mZnNldDsKLSAgfQotfQotCiBzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IE1lbURhdGFTaXplKGNvbnN0IE1lbUJ1ZmZlciogbWVtKSB7CiAgIHJldHVybiAobWVtLT5lbmRfIC0gbWVtLT5zdGFydF8pOwogfQpAQCAtMTA3LDcgKzEwMSw3IEBACiAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBjb21wcmVzc2VkIGFscGhhIGRhdGEsIGFzIGl0IG1heSBub3QgaGF2ZQogLy8gYmVlbiBkZWNvZGVkIHlldC4KIHN0YXRpYyBpbnQgTmVlZENvbXByZXNzZWRBbHBoYShjb25zdCBXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9QUkVfVlA4KSB7CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfV0VCUF9IRUFERVIpIHsKICAgICAvLyBXZSBoYXZlbid0IHBhcnNlZCB0aGUgaGVhZGVycyB5ZXQsIHNvIHdlIGRvbid0IGtub3cgd2hldGhlciB0aGUgaW1hZ2UgaXMKICAgICAvLyBsb3NzeSBvciBsb3NzbGVzcy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgd2UgaGF2ZW4ndCBwYXJzZWQgdGhlIEFMUEggY2h1bmsuCiAgICAgcmV0dXJuIDA7CkBAIC0xMTYsNyArMTEwLDcgQEAKICAgICByZXR1cm4gMDsgIC8vIEFMUEggY2h1bmsgaXMgbm90IHByZXNlbnQgZm9yIGxvc3NsZXNzIGltYWdlcy4KICAgfSBlbHNlIHsKICAgICBjb25zdCBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKLSAgICBTQl9EQ0hFQ0soZGVjICE9IE5VTEwpOyAgLy8gTXVzdCBiZSB0cnVlIGFzIGlkZWMtPnN0YXRlXyAhPSBTVEFURV9QUkVfVlA4LgorICAgIGFzc2VydChkZWMgIT0gTlVMTCk7ICAvLyBNdXN0IGJlIHRydWUgYXMgaWRlYy0+c3RhdGVfICE9IFNUQVRFX1dFQlBfSEVBREVSLgogICAgIHJldHVybiAoZGVjLT5hbHBoYV9kYXRhXyAhPSBOVUxMKSAmJiAhZGVjLT5pc19hbHBoYV9kZWNvZGVkXzsKICAgfQogfQpAQCAtMTMyLDIxICsxMjYsMzkgQEAKICAgaWYgKGlkZWMtPmRlY18gIT0gTlVMTCkgewogICAgIGlmICghaWRlYy0+aXNfbG9zc2xlc3NfKSB7CiAgICAgICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKLSAgICAgIGNvbnN0IGludCBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c18gLSAxOworICAgICAgY29uc3QgdWludDMyX3QgbGFzdF9wYXJ0ID0gZGVjLT5udW1fcGFydHNfbWludXNfb25lXzsKICAgICAgIGlmIChvZmZzZXQgIT0gMCkgewotICAgICAgICBpbnQgcDsKKyAgICAgICAgdWludDMyX3QgcDsKICAgICAgICAgZm9yIChwID0gMDsgcCA8PSBsYXN0X3BhcnQ7ICsrcCkgewotICAgICAgICAgIFJlbWFwQml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgb2Zmc2V0KTsKKyAgICAgICAgICBWUDhSZW1hcEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIHAsIG9mZnNldCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUmVtYXAgcGFydGl0aW9uICMwIGRhdGEgcG9pbnRlciB0byBuZXcgb2Zmc2V0LCBidXQgb25seSBpbiBNQVAKICAgICAgICAgLy8gbW9kZSAoaW4gQVBQRU5EIG1vZGUsIHBhcnRpdGlvbiAjMCBpcyBjb3BpZWQgaW50byBhIGZpeGVkIG1lbW9yeSkuCiAgICAgICAgIGlmIChtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCkgewotICAgICAgICAgIFJlbWFwQml0UmVhZGVyKCZkZWMtPmJyXywgb2Zmc2V0KTsKKyAgICAgICAgICBWUDhSZW1hcEJpdFJlYWRlcigmZGVjLT5icl8sIG9mZnNldCk7CiAgICAgICAgIH0KICAgICAgIH0KLSAgICAgIFNCX0RDSEVDSyhsYXN0X3BhcnQgPj0gMCk7Ci0gICAgICBkZWMtPnBhcnRzX1tsYXN0X3BhcnRdLmJ1Zl9lbmRfID0gbWVtLT5idWZfICsgbWVtLT5lbmRfOwotICAgICAgaWYgKE5lZWRDb21wcmVzc2VkQWxwaGEoaWRlYykpIGRlYy0+YWxwaGFfZGF0YV8gKz0gb2Zmc2V0OworICAgICAgeworICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBsYXN0X3N0YXJ0ID0gZGVjLT5wYXJ0c19bbGFzdF9wYXJ0XS5idWZfOworICAgICAgICBWUDhCaXRSZWFkZXJTZXRCdWZmZXIoJmRlYy0+cGFydHNfW2xhc3RfcGFydF0sIGxhc3Rfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0tPmJ1Zl8gKyBtZW0tPmVuZF8gLSBsYXN0X3N0YXJ0KTsKKyAgICAgIH0KKyAgICAgIGlmIChOZWVkQ29tcHJlc3NlZEFscGhhKGlkZWMpKSB7CisgICAgICAgIEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYyA9IGRlYy0+YWxwaF9kZWNfOworICAgICAgICBkZWMtPmFscGhhX2RhdGFfICs9IG9mZnNldDsKKyAgICAgICAgaWYgKGFscGhfZGVjICE9IE5VTEwpIHsKKyAgICAgICAgICBpZiAoYWxwaF9kZWMtPm1ldGhvZF8gPT0gQUxQSEFfTE9TU0xFU1NfQ09NUFJFU1NJT04pIHsKKyAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBhbHBoX3ZwOGxfZGVjID0gYWxwaF9kZWMtPnZwOGxfZGVjXzsKKyAgICAgICAgICAgIGFzc2VydChhbHBoX3ZwOGxfZGVjICE9IE5VTEwpOworICAgICAgICAgICAgYXNzZXJ0KGRlYy0+YWxwaGFfZGF0YV9zaXplXyA+PSBBTFBIQV9IRUFERVJfTEVOKTsKKyAgICAgICAgICAgIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoJmFscGhfdnA4bF9kZWMtPmJyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5hbHBoYV9kYXRhXyArIEFMUEhBX0hFQURFUl9MRU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYy0+YWxwaGFfZGF0YV9zaXplXyAtIEFMUEhBX0hFQURFUl9MRU4pOworICAgICAgICAgIH0gZWxzZSB7ICAvLyBhbHBoX2RlYy0+bWV0aG9kXyA9PSBBTFBIQV9OT19DT01QUkVTU0lPTgorICAgICAgICAgICAgLy8gTm90aGluZyBzcGVjaWFsIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KICAgICB9IGVsc2UgeyAgICAvLyBSZXNpemUgbG9zc2xlc3MgYml0cmVhZGVyCiAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gKFZQOExEZWNvZGVyKilpZGVjLT5kZWNfOwogICAgICAgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcigmZGVjLT5icl8sIG5ld19iYXNlLCBNZW1EYXRhU2l6ZShtZW0pKTsKQEAgLTE2NCw3ICsxNzYsNyBAQAogICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfc3RhcnQgPSBtZW0tPmJ1Zl8gKyBtZW0tPnN0YXJ0XzsKICAgY29uc3QgdWludDhfdCogY29uc3Qgb2xkX2Jhc2UgPQogICAgICAgbmVlZF9jb21wcmVzc2VkX2FscGhhID8gZGVjLT5hbHBoYV9kYXRhXyA6IG9sZF9zdGFydDsKLSAgU0JfRENIRUNLKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfQVBQRU5EKTsKKyAgYXNzZXJ0KG1lbS0+bW9kZV8gPT0gTUVNX01PREVfQVBQRU5EKTsKICAgaWYgKGRhdGFfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CiAgICAgLy8gc2VjdXJpdHkgc2FmZWd1YXJkOiB0cnlpbmcgdG8gYWxsb2NhdGUgbW9yZSB0aGFuIHdoYXQgdGhlIGZvcm1hdAogICAgIC8vIGFsbG93cyBmb3IgYSBjaHVuayBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHNtb2tlIHNtZWxsLgpAQCAtMTc5LDE3ICsxOTEsMTcgQEAKICAgICB1aW50OF90KiBjb25zdCBuZXdfYnVmID0KICAgICAgICAgKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKGV4dHJhX3NpemUsIHNpemVvZigqbmV3X2J1ZikpOwogICAgIGlmIChuZXdfYnVmID09IE5VTEwpIHJldHVybiAwOwotICAgIFNiTWVtb3J5Q29weShuZXdfYnVmLCBvbGRfYmFzZSwgY3VycmVudF9zaXplKTsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUobWVtLT5idWZfKTsKKyAgICBtZW1jcHkobmV3X2J1Ziwgb2xkX2Jhc2UsIGN1cnJlbnRfc2l6ZSk7CisgICAgV2ViUFNhZmVGcmVlKG1lbS0+YnVmXyk7CiAgICAgbWVtLT5idWZfID0gbmV3X2J1ZjsKICAgICBtZW0tPmJ1Zl9zaXplXyA9IChzaXplX3QpZXh0cmFfc2l6ZTsKICAgICBtZW0tPnN0YXJ0XyA9IG5ld19tZW1fc3RhcnQ7CiAgICAgbWVtLT5lbmRfID0gY3VycmVudF9zaXplOwogICB9CiAKLSAgU2JNZW1vcnlDb3B5KG1lbS0+YnVmXyArIG1lbS0+ZW5kXywgZGF0YSwgZGF0YV9zaXplKTsKKyAgbWVtY3B5KG1lbS0+YnVmXyArIG1lbS0+ZW5kXywgZGF0YSwgZGF0YV9zaXplKTsKICAgbWVtLT5lbmRfICs9IGRhdGFfc2l6ZTsKLSAgU0JfRENIRUNLKG1lbS0+ZW5kXyA8PSBtZW0tPmJ1Zl9zaXplXyk7CisgIGFzc2VydChtZW0tPmVuZF8gPD0gbWVtLT5idWZfc2l6ZV8pOwogCiAgIERvUmVtYXAoaWRlYywgbWVtLT5idWZfICsgbWVtLT5zdGFydF8gLSBvbGRfc3RhcnQpOwogICByZXR1cm4gMTsKQEAgLTIwMCw3ICsyMTIsNyBAQAogICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZpZGVjLT5tZW1fOwogICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfYnVmID0gbWVtLT5idWZfOwogICBjb25zdCB1aW50OF90KiBjb25zdCBvbGRfc3RhcnQgPSBvbGRfYnVmICsgbWVtLT5zdGFydF87Ci0gIFNCX0RDSEVDSyhtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCk7CisgIGFzc2VydChtZW0tPm1vZGVfID09IE1FTV9NT0RFX01BUCk7CiAKICAgaWYgKGRhdGFfc2l6ZSA8IG1lbS0+YnVmX3NpemVfKSByZXR1cm4gMDsgIC8vIGNhbid0IHJlbWFwIHRvIGEgc2hvcnRlciBidWZmZXIhCiAKQEAgLTIyMCwxMCArMjMyLDEwIEBACiB9CiAKIHN0YXRpYyB2b2lkIENsZWFyTWVtQnVmZmVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7Ci0gIFNCX0RDSEVDSyhtZW0pOworICBhc3NlcnQobWVtKTsKICAgaWYgKG1lbS0+bW9kZV8gPT0gTUVNX01PREVfQVBQRU5EKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKG1lbS0+YnVmXyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKCh2b2lkKiltZW0tPnBhcnQwX2J1Zl8pOworICAgIFdlYlBTYWZlRnJlZShtZW0tPmJ1Zl8pOworICAgIFdlYlBTYWZlRnJlZSgodm9pZCopbWVtLT5wYXJ0MF9idWZfKTsKICAgfQogfQogCkBAIC0yMzMsMzkgKzI0NSw0NCBAQAogICB9IGVsc2UgaWYgKG1lbS0+bW9kZV8gIT0gZXhwZWN0ZWQpIHsKICAgICByZXR1cm4gMDsgICAgICAgICAvLyB3ZSBtaXhlZCB0aGUgbW9kZXMgPT4gZXJyb3IKICAgfQotICBTQl9EQ0hFQ0sobWVtLT5tb2RlXyA9PSBleHBlY3RlZCk7ICAgLy8gbW9kZSBpcyBvaworICBhc3NlcnQobWVtLT5tb2RlXyA9PSBleHBlY3RlZCk7ICAgLy8gbW9kZSBpcyBvawogICByZXR1cm4gMTsKIH0KIAorLy8gVG8gYmUgY2FsbGVkIGxhc3QuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBGaW5pc2hEZWNvZGluZyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMpIHsKKyAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zID0gaWRlYy0+cGFyYW1zXy5vcHRpb25zOworICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBpZGVjLT5wYXJhbXNfLm91dHB1dDsKKworICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9ET05FOworICBpZiAob3B0aW9ucyAhPSBOVUxMICYmIG9wdGlvbnMtPmZsaXApIHsKKyAgICBjb25zdCBWUDhTdGF0dXNDb2RlIHN0YXR1cyA9IFdlYlBGbGlwQnVmZmVyKG91dHB1dCk7CisgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSByZXR1cm4gc3RhdHVzOworICB9CisgIGlmIChpZGVjLT5maW5hbF9vdXRwdXRfICE9IE5VTEwpIHsKKyAgICBXZWJQQ29weURlY0J1ZmZlclBpeGVscyhvdXRwdXQsIGlkZWMtPmZpbmFsX291dHB1dF8pOyAgLy8gZG8gdGhlIHNsb3ctY29weQorICAgIFdlYlBGcmVlRGVjQnVmZmVyKCZpZGVjLT5vdXRwdXRfKTsKKyAgICAqb3V0cHV0ID0gKmlkZWMtPmZpbmFsX291dHB1dF87CisgICAgaWRlYy0+ZmluYWxfb3V0cHV0XyA9IE5VTEw7CisgIH0KKyAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7Cit9CisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBNYWNyb2Jsb2NrLWRlY29kaW5nIGNvbnRleHRzCiAKIHN0YXRpYyB2b2lkIFNhdmVDb250ZXh0KGNvbnN0IFZQOERlY29kZXIqIGRlYywgY29uc3QgVlA4Qml0UmVhZGVyKiB0b2tlbl9iciwKICAgICAgICAgICAgICAgICAgICAgICAgIE1CQ29udGV4dCogY29uc3QgY29udGV4dCkgewotICBjb25zdCBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwotICBjb25zdCBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOwotICBjb25zdCBWUDhNQiogY29uc3QgaW5mbyA9IGRlYy0+bWJfaW5mb18gKyBkZWMtPm1iX3hfOwotCi0gIGNvbnRleHQtPmxlZnRfID0gKmxlZnQ7Ci0gIGNvbnRleHQtPmluZm9fID0gKmluZm87Ci0gIGNvbnRleHQtPmJyXyA9ICpicjsKKyAgY29udGV4dC0+bGVmdF8gPSBkZWMtPm1iX2luZm9fWy0xXTsKKyAgY29udGV4dC0+aW5mb18gPSBkZWMtPm1iX2luZm9fW2RlYy0+bWJfeF9dOwogICBjb250ZXh0LT50b2tlbl9icl8gPSAqdG9rZW5fYnI7Ci0gIFNiTWVtb3J5Q29weShjb250ZXh0LT5pbnRyYV90XywgZGVjLT5pbnRyYV90XyArIDQgKiBkZWMtPm1iX3hfLCA0KTsKLSAgU2JNZW1vcnlDb3B5KGNvbnRleHQtPmludHJhX2xfLCBkZWMtPmludHJhX2xfLCA0KTsKIH0KIAogc3RhdGljIHZvaWQgUmVzdG9yZUNvbnRleHQoY29uc3QgTUJDb250ZXh0KiBjb250ZXh0LCBWUDhEZWNvZGVyKiBjb25zdCBkZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyKSB7Ci0gIFZQOEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87Ci0gIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7Ci0gIFZQOE1CKiBjb25zdCBpbmZvID0gZGVjLT5tYl9pbmZvXyArIGRlYy0+bWJfeF87Ci0KLSAgKmxlZnQgPSBjb250ZXh0LT5sZWZ0XzsKLSAgKmluZm8gPSBjb250ZXh0LT5pbmZvXzsKLSAgKmJyID0gY29udGV4dC0+YnJfOworICBkZWMtPm1iX2luZm9fWy0xXSA9IGNvbnRleHQtPmxlZnRfOworICBkZWMtPm1iX2luZm9fW2RlYy0+bWJfeF9dID0gY29udGV4dC0+aW5mb187CiAgICp0b2tlbl9iciA9IGNvbnRleHQtPnRva2VuX2JyXzsKLSAgU2JNZW1vcnlDb3B5KGRlYy0+aW50cmFfdF8gKyA0ICogZGVjLT5tYl94XywgY29udGV4dC0+aW50cmFfdF8sIDQpOwotICBTYk1lbW9yeUNvcHkoZGVjLT5pbnRyYV9sXywgY29udGV4dC0+aW50cmFfbF8sIDQpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjczLDcgKzI5MCw3IEBACiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjRXJyb3IoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjLCBWUDhTdGF0dXNDb2RlIGVycm9yKSB7CiAgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0RBVEEpIHsKICAgICBWUDhJbyogY29uc3QgaW8gPSAmaWRlYy0+aW9fOwotICAgIGlmIChpby0+dGVhcmRvd24pIHsKKyAgICBpZiAoaW8tPnRlYXJkb3duICE9IE5VTEwpIHsKICAgICAgIGlvLT50ZWFyZG93bihpbyk7CiAgICAgfQogICB9CkBAIC0yODYsNyArMzAzLDcgQEAKICAgTWVtQnVmZmVyKiBjb25zdCBtZW0gPSAmaWRlYy0+bWVtXzsKICAgaWRlYy0+c3RhdGVfID0gbmV3X3N0YXRlOwogICBtZW0tPnN0YXJ0XyArPSBjb25zdW1lZF9ieXRlczsKLSAgU0JfRENIRUNLKG1lbS0+c3RhcnRfIDw9IG1lbS0+ZW5kXyk7CisgIGFzc2VydChtZW0tPnN0YXJ0XyA8PSBtZW0tPmVuZF8pOwogICBpZGVjLT5pb18uZGF0YSA9IG1lbS0+YnVmXyArIG1lbS0+c3RhcnRfOwogICBpZGVjLT5pb18uZGF0YV9zaXplID0gTWVtRGF0YVNpemUobWVtKTsKIH0KQEAgLTMwMSw2ICszMTgsNyBAQAogCiAgIGhlYWRlcnMuZGF0YSA9IGRhdGE7CiAgIGhlYWRlcnMuZGF0YV9zaXplID0gY3Vycl9zaXplOworICBoZWFkZXJzLmhhdmVfYWxsX2RhdGEgPSAwOwogICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsKICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgewogICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsgIC8vIFdlIGhhdmVuJ3QgZm91bmQgYSBWUDggY2h1bmsgeWV0LgpAQCAtMzE2LDE1ICszMzQsOSBAQAogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKICAgICB9CiAgICAgaWRlYy0+ZGVjXyA9IGRlYzsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBkZWMtPnVzZV90aHJlYWRzXyA9IChpZGVjLT5wYXJhbXNfLm9wdGlvbnMgIT0gTlVMTCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChpZGVjLT5wYXJhbXNfLm9wdGlvbnMtPnVzZV90aHJlYWRzID4gMCk7Ci0jZWxzZQotICAgIGRlYy0+dXNlX3RocmVhZHNfID0gMDsKLSNlbmRpZgogICAgIGRlYy0+YWxwaGFfZGF0YV8gPSBoZWFkZXJzLmFscGhhX2RhdGE7CiAgICAgZGVjLT5hbHBoYV9kYXRhX3NpemVfID0gaGVhZGVycy5hbHBoYV9kYXRhX3NpemU7Ci0gICAgQ2hhbmdlU3RhdGUoaWRlYywgU1RBVEVfVlA4X0ZSQU1FX0hFQURFUiwgaGVhZGVycy5vZmZzZXQpOworICAgIENoYW5nZVN0YXRlKGlkZWMsIFNUQVRFX1ZQOF9IRUFERVIsIGhlYWRlcnMub2Zmc2V0KTsKICAgfSBlbHNlIHsKICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjID0gVlA4TE5ldygpOwogICAgIGlmIChkZWMgPT0gTlVMTCkgewpAQCAtMzM5LDEzICszNTEsMTQgQEAKIHN0YXRpYyBWUDhTdGF0dXNDb2RlIERlY29kZVZQOEZyYW1lSGVhZGVyKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYykgewogICBjb25zdCB1aW50OF90KiBkYXRhID0gaWRlYy0+bWVtXy5idWZfICsgaWRlYy0+bWVtXy5zdGFydF87CiAgIGNvbnN0IHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXyk7CisgIGludCB3aWR0aCwgaGVpZ2h0OwogICB1aW50MzJfdCBiaXRzOwogCiAgIGlmIChjdXJyX3NpemUgPCBWUDhfRlJBTUVfSEVBREVSX1NJWkUpIHsKICAgICAvLyBOb3QgZW5vdWdoIGRhdGEgYnl0ZXMgdG8gZXh0cmFjdCBWUDggRnJhbWUgSGVhZGVyLgogICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKICAgfQotICBpZiAoIVZQOEdldEluZm8oZGF0YSwgY3Vycl9zaXplLCBpZGVjLT5jaHVua19zaXplXywgTlVMTCwgTlVMTCkpIHsKKyAgaWYgKCFWUDhHZXRJbmZvKGRhdGEsIGN1cnJfc2l6ZSwgaWRlYy0+Y2h1bmtfc2l6ZV8sICZ3aWR0aCwgJmhlaWdodCkpIHsKICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SKTsKICAgfQogCkBAIC0zNjQsMjMgKzM3NywyMiBAQAogICBWUDhCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOwogICBjb25zdCBzaXplX3QgcGFydF9zaXplID0gYnItPmJ1Zl9lbmRfIC0gYnItPmJ1Zl87CiAgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmlkZWMtPm1lbV87Ci0gIFNCX0RDSEVDSyghaWRlYy0+aXNfbG9zc2xlc3NfKTsKLSAgU0JfRENIRUNLKG1lbS0+cGFydDBfYnVmXyA9PSBOVUxMKTsKKyAgYXNzZXJ0KCFpZGVjLT5pc19sb3NzbGVzc18pOworICBhc3NlcnQobWVtLT5wYXJ0MF9idWZfID09IE5VTEwpOwogICAvLyB0aGUgZm9sbG93aW5nIGlzIGEgZm9ybWF0IGxpbWl0YXRpb24sIG5vIG5lZWQgZm9yIHJ1bnRpbWUgY2hlY2s6Ci0gIFNCX0RDSEVDSyhwYXJ0X3NpemUgPD0gbWVtLT5wYXJ0MF9zaXplXyk7CisgIGFzc2VydChwYXJ0X3NpemUgPD0gbWVtLT5wYXJ0MF9zaXplXyk7CiAgIGlmIChwYXJ0X3NpemUgPT0gMCkgeyAgIC8vIGNhbid0IGhhdmUgemVyby1zaXplIHBhcnRpdGlvbiAjMAogICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgfQogICBpZiAobWVtLT5tb2RlXyA9PSBNRU1fTU9ERV9BUFBFTkQpIHsKICAgICAvLyBXZSBjb3B5IGFuZCBncmFiIG93bmVyc2hpcCBvZiB0aGUgcGFydGl0aW9uICMwIGRhdGEuCi0gICAgdWludDhfdCogY29uc3QgcGFydDBfYnVmID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUocGFydF9zaXplKTsKKyAgICB1aW50OF90KiBjb25zdCBwYXJ0MF9idWYgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgcGFydF9zaXplKTsKICAgICBpZiAocGFydDBfYnVmID09IE5VTEwpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CiAgICAgfQotICAgIFNiTWVtb3J5Q29weShwYXJ0MF9idWYsIGJyLT5idWZfLCBwYXJ0X3NpemUpOworICAgIG1lbWNweShwYXJ0MF9idWYsIGJyLT5idWZfLCBwYXJ0X3NpemUpOwogICAgIG1lbS0+cGFydDBfYnVmXyA9IHBhcnQwX2J1ZjsKLSAgICBici0+YnVmXyA9IHBhcnQwX2J1ZjsKLSAgICBici0+YnVmX2VuZF8gPSBwYXJ0MF9idWYgKyBwYXJ0X3NpemU7CisgICAgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKGJyLCBwYXJ0MF9idWYsIHBhcnRfc2l6ZSk7CiAgIH0gZWxzZSB7CiAgICAgLy8gRWxzZToganVzdCBrZWVwIHBvaW50ZXJzIHRvIHRoZSBwYXJ0aXRpb24gIzAncyBkYXRhIGluIGRlY18tPmJyXy4KICAgfQpAQCAtNDE1LDYgKzQyNywxMCBAQAogICBpZiAoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spIHsKICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIGRlYy0+c3RhdHVzXyk7CiAgIH0KKyAgLy8gVGhpcyBjaGFuZ2UgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIFZQOEluaXRGcmFtZSgpCisgIGRlYy0+bXRfbWV0aG9kXyA9IFZQOEdldFRocmVhZE1ldGhvZChwYXJhbXMtPm9wdGlvbnMsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+d2lkdGgsIGlvLT5oZWlnaHQpOworICBWUDhJbml0RGl0aGVyaW5nKHBhcmFtcy0+b3B0aW9ucywgZGVjKTsKIAogICBkZWMtPnN0YXR1c18gPSBDb3B5UGFydHMwRGF0YShpZGVjKTsKICAgaWYgKGRlYy0+c3RhdHVzXyAhPSBWUDhfU1RBVFVTX09LKSB7CkBAIC00NDEsNTAgKzQ1Nyw1NCBAQAogICBWUDhEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4RGVjb2RlciopaWRlYy0+ZGVjXzsKICAgVlA4SW8qIGNvbnN0IGlvID0gJmlkZWMtPmlvXzsKIAotICBTQl9EQ0hFQ0soZGVjLT5yZWFkeV8pOwotCisgIGFzc2VydChkZWMtPnJlYWR5Xyk7CiAgIGZvciAoOyBkZWMtPm1iX3lfIDwgZGVjLT5tYl9oXzsgKytkZWMtPm1iX3lfKSB7Ci0gICAgVlA4Qml0UmVhZGVyKiB0b2tlbl9iciA9ICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgKGRlYy0+bnVtX3BhcnRzXyAtIDEpXTsKLSAgICBpZiAoZGVjLT5tYl94XyA9PSAwKSB7Ci0gICAgICBWUDhJbml0U2NhbmxpbmUoZGVjKTsKKyAgICBpZiAoaWRlYy0+bGFzdF9tYl95XyAhPSBkZWMtPm1iX3lfKSB7CisgICAgICBpZiAoIVZQOFBhcnNlSW50cmFNb2RlUm93KCZkZWMtPmJyXywgZGVjKSkgeworICAgICAgICAvLyBub3RlOiBub3JtYWxseSwgZXJyb3Igc2hvdWxkbid0IG9jY3VyIHNpbmNlIHdlIGFscmVhZHkgaGF2ZSB0aGUgd2hvbGUKKyAgICAgICAgLy8gcGFydGl0aW9uMCBhdmFpbGFibGUgaGVyZSBpbiBEZWNvZGVSZW1haW5pbmcoKS4gUmVhY2hpbmcgRU9GIHdoaWxlCisgICAgICAgIC8vIHJlYWRpbmcgaW50cmEgbW9kZXMgcmVhbGx5IG1lYW5zIGEgQklUU1RSRUFNX0VSUk9SLgorICAgICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SKTsKKyAgICAgIH0KKyAgICAgIGlkZWMtPmxhc3RfbWJfeV8gPSBkZWMtPm1iX3lfOwogICAgIH0KLSAgICBmb3IgKDsgZGVjLT5tYl94XyA8IGRlYy0+bWJfd187ICBkZWMtPm1iX3hfKyspIHsKKyAgICBmb3IgKDsgZGVjLT5tYl94XyA8IGRlYy0+bWJfd187ICsrZGVjLT5tYl94XykgeworICAgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9iciA9CisgICAgICAgICAgJmRlYy0+cGFydHNfW2RlYy0+bWJfeV8gJiBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfXTsKICAgICAgIE1CQ29udGV4dCBjb250ZXh0OwogICAgICAgU2F2ZUNvbnRleHQoZGVjLCB0b2tlbl9iciwgJmNvbnRleHQpOwotCiAgICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7Ci0gICAgICAgIFJlc3RvcmVDb250ZXh0KCZjb250ZXh0LCBkZWMsIHRva2VuX2JyKTsKICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGZhaWwgd2hlbiBNQVhfTUIgZGF0YSB3YXMgYXZhaWxhYmxlCi0gICAgICAgIGlmIChkZWMtPm51bV9wYXJ0c18gPT0gMSAmJiBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXykgPiBNQVhfTUJfU0laRSkgeworICAgICAgICBpZiAoZGVjLT5udW1fcGFydHNfbWludXNfb25lXyA9PSAwICYmCisgICAgICAgICAgICBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXykgPiBNQVhfTUJfU0laRSkgewogICAgICAgICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IpOwogICAgICAgICB9CisgICAgICAgIFJlc3RvcmVDb250ZXh0KCZjb250ZXh0LCBkZWMsIHRva2VuX2JyKTsKICAgICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOwogICAgICAgfQotICAgICAgLy8gUmVjb25zdHJ1Y3QgYW5kIGVtaXQgc2FtcGxlcy4KLSAgICAgIFZQOFJlY29uc3RydWN0QmxvY2soZGVjKTsKLQogICAgICAgLy8gUmVsZWFzZSBidWZmZXIgb25seSBpZiB0aGVyZSBpcyBvbmx5IG9uZSBwYXJ0aXRpb24KLSAgICAgIGlmIChkZWMtPm51bV9wYXJ0c18gPT0gMSkgeworICAgICAgaWYgKGRlYy0+bnVtX3BhcnRzX21pbnVzX29uZV8gPT0gMCkgewogICAgICAgICBpZGVjLT5tZW1fLnN0YXJ0XyA9IHRva2VuX2JyLT5idWZfIC0gaWRlYy0+bWVtXy5idWZfOwotICAgICAgICBTQl9EQ0hFQ0soaWRlYy0+bWVtXy5zdGFydF8gPD0gaWRlYy0+bWVtXy5lbmRfKTsKKyAgICAgICAgYXNzZXJ0KGlkZWMtPm1lbV8uc3RhcnRfIDw9IGlkZWMtPm1lbV8uZW5kXyk7CiAgICAgICB9CiAgICAgfQorICAgIFZQOEluaXRTY2FubGluZShkZWMpOyAgIC8vIFByZXBhcmUgZm9yIG5leHQgc2NhbmxpbmUKKworICAgIC8vIFJlY29uc3RydWN0LCBmaWx0ZXIgYW5kIGVtaXQgdGhlIHJvdy4KICAgICBpZiAoIVZQOFByb2Nlc3NSb3coZGVjLCBpbykpIHsKICAgICAgIHJldHVybiBJRGVjRXJyb3IoaWRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JUKTsKICAgICB9Ci0gICAgZGVjLT5tYl94XyA9IDA7CiAgIH0KICAgLy8gU3luY2hyb25pemUgdGhlIHRocmVhZCBhbmQgY2hlY2sgZm9yIGVycm9ycy4KICAgaWYgKCFWUDhFeGl0Q3JpdGljYWwoZGVjLCBpbykpIHsKICAgICByZXR1cm4gSURlY0Vycm9yKGlkZWMsIFZQOF9TVEFUVVNfVVNFUl9BQk9SVCk7CiAgIH0KICAgZGVjLT5yZWFkeV8gPSAwOwotICBpZGVjLT5zdGF0ZV8gPSBTVEFURV9ET05FOwotCi0gIHJldHVybiBWUDhfU1RBVFVTX09LOworICByZXR1cm4gRmluaXNoRGVjb2RpbmcoaWRlYyk7CiB9CiAKLXN0YXRpYyBpbnQgRXJyb3JTdGF0dXNMb3NzbGVzcyhXZWJQSURlY29kZXIqIGNvbnN0IGlkZWMsIFZQOFN0YXR1c0NvZGUgc3RhdHVzKSB7CitzdGF0aWMgVlA4U3RhdHVzQ29kZSBFcnJvclN0YXR1c0xvc3NsZXNzKFdlYlBJRGVjb2RlciogY29uc3QgaWRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4U3RhdHVzQ29kZSBzdGF0dXMpIHsKICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCB8fCBzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpIHsKICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CiAgIH0KQEAgLTQ5NywxMyArNTE3LDE5IEBACiAgIGNvbnN0IFdlYlBEZWNQYXJhbXMqIGNvbnN0IHBhcmFtcyA9ICZpZGVjLT5wYXJhbXNfOwogICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBwYXJhbXMtPm91dHB1dDsKICAgc2l6ZV90IGN1cnJfc2l6ZSA9IE1lbURhdGFTaXplKCZpZGVjLT5tZW1fKTsKLSAgU0JfRENIRUNLKGlkZWMtPmlzX2xvc3NsZXNzXyk7CisgIGFzc2VydChpZGVjLT5pc19sb3NzbGVzc18pOwogCiAgIC8vIFdhaXQgdW50aWwgdGhlcmUncyBlbm91Z2ggZGF0YSBmb3IgZGVjb2RpbmcgaGVhZGVyLgogICBpZiAoY3Vycl9zaXplIDwgKGlkZWMtPmNodW5rX3NpemVfID4+IDMpKSB7Ci0gICAgcmV0dXJuIFZQOF9TVEFUVVNfU1VTUEVOREVEOworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOworICAgIHJldHVybiBFcnJvclN0YXR1c0xvc3NsZXNzKGlkZWMsIGRlYy0+c3RhdHVzXyk7CiAgIH0KKwogICBpZiAoIVZQOExEZWNvZGVIZWFkZXIoZGVjLCBpbykpIHsKKyAgICBpZiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SICYmCisgICAgICAgIGN1cnJfc2l6ZSA8IGlkZWMtPmNodW5rX3NpemVfKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKKyAgICB9CiAgICAgcmV0dXJuIEVycm9yU3RhdHVzTG9zc2xlc3MoaWRlYywgZGVjLT5zdGF0dXNfKTsKICAgfQogICAvLyBBbGxvY2F0ZS92ZXJpZnkgb3V0cHV0IGJ1ZmZlciBub3cuCkBAIC01MjAsMzUgKzU0NiwzMSBAQAogc3RhdGljIFZQOFN0YXR1c0NvZGUgRGVjb2RlVlA4TERhdGEoV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7CiAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMgPSAoVlA4TERlY29kZXIqKWlkZWMtPmRlY187CiAgIGNvbnN0IHNpemVfdCBjdXJyX3NpemUgPSBNZW1EYXRhU2l6ZSgmaWRlYy0+bWVtXyk7Ci0gIFNCX0RDSEVDSyhpZGVjLT5pc19sb3NzbGVzc18pOworICBhc3NlcnQoaWRlYy0+aXNfbG9zc2xlc3NfKTsKIAotICAvLyBBdCBwcmVzZW50IExvc3NsZXNzIGRlY29kZXIgY2FuJ3QgZGVjb2RlIGltYWdlIGluY3JlbWVudGFsbHkuIFNvIHdhaXQgdGlsbAotICAvLyBhbGwgdGhlIGltYWdlIGRhdGEgaXMgYWdncmVnYXRlZCBiZWZvcmUgaW1hZ2UgY2FuIGJlIGRlY29kZWQuCi0gIGlmIChjdXJyX3NpemUgPCBpZGVjLT5jaHVua19zaXplXykgewotICAgIHJldHVybiBWUDhfU1RBVFVTX1NVU1BFTkRFRDsKLSAgfQorICAvLyBTd2l0Y2ggdG8gaW5jcmVtZW50YWwgZGVjb2RpbmcgaWYgd2UgZG9uJ3QgaGF2ZSBhbGwgdGhlIGJ5dGVzIGF2YWlsYWJsZS4KKyAgZGVjLT5pbmNyZW1lbnRhbF8gPSAoY3Vycl9zaXplIDwgaWRlYy0+Y2h1bmtfc2l6ZV8pOwogCiAgIGlmICghVlA4TERlY29kZUltYWdlKGRlYykpIHsKICAgICByZXR1cm4gRXJyb3JTdGF0dXNMb3NzbGVzcyhpZGVjLCBkZWMtPnN0YXR1c18pOwogICB9Ci0KLSAgaWRlYy0+c3RhdGVfID0gU1RBVEVfRE9ORTsKLQotICByZXR1cm4gVlA4X1NUQVRVU19PSzsKKyAgYXNzZXJ0KGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX09LIHx8IGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX1NVU1BFTkRFRCk7CisgIHJldHVybiAoZGVjLT5zdGF0dXNfID09IFZQOF9TVEFUVVNfU1VTUEVOREVEKSA/IGRlYy0+c3RhdHVzXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGaW5pc2hEZWNvZGluZyhpZGVjKTsKIH0KIAogICAvLyBNYWluIGRlY29kaW5nIGxvb3AKIHN0YXRpYyBWUDhTdGF0dXNDb2RlIElEZWNvZGUoV2ViUElEZWNvZGVyKiBpZGVjKSB7CiAgIFZQOFN0YXR1c0NvZGUgc3RhdHVzID0gVlA4X1NUQVRVU19TVVNQRU5ERUQ7CiAKLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9QUkVfVlA4KSB7CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfV0VCUF9IRUFERVIpIHsKICAgICBzdGF0dXMgPSBEZWNvZGVXZWJQSGVhZGVycyhpZGVjKTsKICAgfSBlbHNlIHsKICAgICBpZiAoaWRlYy0+ZGVjXyA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAgIC8vIGNhbid0IGNvbnRpbnVlIGlmIHdlIGhhdmUgbm8gZGVjb2Rlci4KICAgICB9CiAgIH0KLSAgaWYgKGlkZWMtPnN0YXRlXyA9PSBTVEFURV9WUDhfRlJBTUVfSEVBREVSKSB7CisgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0hFQURFUikgewogICAgIHN0YXR1cyA9IERlY29kZVZQOEZyYW1lSGVhZGVyKGlkZWMpOwogICB9CiAgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X1BBUlRTMCkgewpAQCAtNTY3LDQwICs1ODksNjUgQEAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFB1YmxpYyBmdW5jdGlvbnMKKy8vIEludGVybmFsIGNvbnN0cnVjdG9yCiAKLVdlYlBJRGVjb2RlciogV2ViUElOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIG91dHB1dF9idWZmZXIpIHsKLSAgV2ViUElEZWNvZGVyKiBpZGVjID0gKFdlYlBJRGVjb2RlciopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCppZGVjKSk7CitzdGF0aWMgV2ViUElEZWNvZGVyKiBOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dF9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBCaXRzdHJlYW1GZWF0dXJlcyogY29uc3QgZmVhdHVyZXMpIHsKKyAgV2ViUElEZWNvZGVyKiBpZGVjID0gKFdlYlBJRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCppZGVjKSk7CiAgIGlmIChpZGVjID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQogCi0gIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1BSRV9WUDg7CisgIGlkZWMtPnN0YXRlXyA9IFNUQVRFX1dFQlBfSEVBREVSOwogICBpZGVjLT5jaHVua19zaXplXyA9IDA7CiAKKyAgaWRlYy0+bGFzdF9tYl95XyA9IC0xOworCiAgIEluaXRNZW1CdWZmZXIoJmlkZWMtPm1lbV8pOwogICBXZWJQSW5pdERlY0J1ZmZlcigmaWRlYy0+b3V0cHV0Xyk7CiAgIFZQOEluaXRJbygmaWRlYy0+aW9fKTsKIAogICBXZWJQUmVzZXREZWNQYXJhbXMoJmlkZWMtPnBhcmFtc18pOwotICBpZGVjLT5wYXJhbXNfLm91dHB1dCA9IG91dHB1dF9idWZmZXIgPyBvdXRwdXRfYnVmZmVyIDogJmlkZWMtPm91dHB1dF87CisgIGlmIChvdXRwdXRfYnVmZmVyID09IE5VTEwgfHwgV2ViUEF2b2lkU2xvd01lbW9yeShvdXRwdXRfYnVmZmVyLCBmZWF0dXJlcykpIHsKKyAgICBpZGVjLT5wYXJhbXNfLm91dHB1dCA9ICZpZGVjLT5vdXRwdXRfOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBvdXRwdXRfYnVmZmVyOworICAgIGlmIChvdXRwdXRfYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgIGlkZWMtPnBhcmFtc18ub3V0cHV0LT5jb2xvcnNwYWNlID0gb3V0cHV0X2J1ZmZlci0+Y29sb3JzcGFjZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWRlYy0+cGFyYW1zXy5vdXRwdXQgPSBvdXRwdXRfYnVmZmVyOworICAgIGlkZWMtPmZpbmFsX291dHB1dF8gPSBOVUxMOworICB9CiAgIFdlYlBJbml0Q3VzdG9tSW8oJmlkZWMtPnBhcmFtc18sICZpZGVjLT5pb18pOyAgLy8gUGx1ZyB0aGUgSS9PIGZ1bmN0aW9ucy4KIAogICByZXR1cm4gaWRlYzsKIH0KIAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1YmxpYyBmdW5jdGlvbnMKKworV2ViUElEZWNvZGVyKiBXZWJQSU5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogb3V0cHV0X2J1ZmZlcikgeworICByZXR1cm4gTmV3RGVjb2RlcihvdXRwdXRfYnVmZmVyLCBOVUxMKTsKK30KKwogV2ViUElEZWNvZGVyKiBXZWJQSURlY29kZShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVjb2RlckNvbmZpZyogY29uZmlnKSB7CiAgIFdlYlBJRGVjb2RlciogaWRlYzsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzIHRtcF9mZWF0dXJlczsKKyAgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcyA9CisgICAgICAoY29uZmlnID09IE5VTEwpID8gJnRtcF9mZWF0dXJlcyA6ICZjb25maWctPmlucHV0OworICBtZW1zZXQoJnRtcF9mZWF0dXJlcywgMCwgc2l6ZW9mKHRtcF9mZWF0dXJlcykpOwogCiAgIC8vIFBhcnNlIHRoZSBiaXRzdHJlYW0ncyBmZWF0dXJlcywgaWYgcmVxdWVzdGVkOgotICBpZiAoZGF0YSAhPSBOVUxMICYmIGRhdGFfc2l6ZSA+IDAgJiYgY29uZmlnICE9IE5VTEwpIHsKLSAgICBpZiAoV2ViUEdldEZlYXR1cmVzKGRhdGEsIGRhdGFfc2l6ZSwgJmNvbmZpZy0+aW5wdXQpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgaWYgKGRhdGEgIT0gTlVMTCAmJiBkYXRhX3NpemUgPiAwKSB7CisgICAgaWYgKFdlYlBHZXRGZWF0dXJlcyhkYXRhLCBkYXRhX3NpemUsIGZlYXR1cmVzKSAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgIH0KKwogICAvLyBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGluY3JlbWVudGFsIGRlY29kZXIKLSAgaWRlYyA9IFdlYlBJTmV3RGVjb2Rlcihjb25maWcgPyAmY29uZmlnLT5vdXRwdXQgOiBOVUxMKTsKKyAgaWRlYyA9IChjb25maWcgIT0gTlVMTCkgPyBOZXdEZWNvZGVyKCZjb25maWctPm91dHB1dCwgZmVhdHVyZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogTmV3RGVjb2RlcihOVUxMLCBmZWF0dXJlcyk7CiAgIGlmIChpZGVjID09IE5VTEwpIHsKICAgICByZXR1cm4gTlVMTDsKICAgfQpAQCAtNjE1LDI2ICs2NjIsMzAgQEAKICAgaWYgKGlkZWMgPT0gTlVMTCkgcmV0dXJuOwogICBpZiAoaWRlYy0+ZGVjXyAhPSBOVUxMKSB7CiAgICAgaWYgKCFpZGVjLT5pc19sb3NzbGVzc18pIHsKLSAgICAgIFZQOERlbGV0ZShpZGVjLT5kZWNfKTsKKyAgICAgIGlmIChpZGVjLT5zdGF0ZV8gPT0gU1RBVEVfVlA4X0RBVEEpIHsKKyAgICAgICAgLy8gU3luY2hyb25pemUgdGhlIHRocmVhZCwgY2xlYW4tdXAgYW5kIGNoZWNrIGZvciBlcnJvcnMuCisgICAgICAgIFZQOEV4aXRDcml0aWNhbCgoVlA4RGVjb2RlciopaWRlYy0+ZGVjXywgJmlkZWMtPmlvXyk7CisgICAgICB9CisgICAgICBWUDhEZWxldGUoKFZQOERlY29kZXIqKWlkZWMtPmRlY18pOwogICAgIH0gZWxzZSB7Ci0gICAgICBWUDhMRGVsZXRlKGlkZWMtPmRlY18pOworICAgICAgVlA4TERlbGV0ZSgoVlA4TERlY29kZXIqKWlkZWMtPmRlY18pOwogICAgIH0KICAgfQogICBDbGVhck1lbUJ1ZmZlcigmaWRlYy0+bWVtXyk7CiAgIFdlYlBGcmVlRGVjQnVmZmVyKCZpZGVjLT5vdXRwdXRfKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGlkZWMpOworICBXZWJQU2FmZUZyZWUoaWRlYyk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBXcmFwcGVyIHRvd2FyZCBXZWJQSU5ld0RlY29kZXIKIAotV2ViUElEZWNvZGVyKiBXZWJQSU5ld1JHQihXRUJQX0NTUF9NT0RFIG1vZGUsIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsCitXZWJQSURlY29kZXIqIFdlYlBJTmV3UkdCKFdFQlBfQ1NQX01PREUgY3NwLCB1aW50OF90KiBvdXRwdXRfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSkgewotICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKG91dHB1dF9idWZmZXIgIT0gTlVMTCk7CisgIGNvbnN0IGludCBpc19leHRlcm5hbF9tZW1vcnkgPSAob3V0cHV0X2J1ZmZlciAhPSBOVUxMKSA/IDEgOiAwOwogICBXZWJQSURlY29kZXIqIGlkZWM7CiAKLSAgaWYgKG1vZGUgPj0gTU9ERV9ZVVYpIHJldHVybiBOVUxMOwotICBpZiAoIWlzX2V4dGVybmFsX21lbW9yeSkgeyAgICAvLyBPdmVyd3JpdGUgcGFyYW1ldGVycyB0byBzYW5lIHZhbHVlcy4KKyAgaWYgKGNzcCA+PSBNT0RFX1lVVikgcmV0dXJuIE5VTEw7CisgIGlmIChpc19leHRlcm5hbF9tZW1vcnkgPT0gMCkgeyAgICAvLyBPdmVyd3JpdGUgcGFyYW1ldGVycyB0byBzYW5lIHZhbHVlcy4KICAgICBvdXRwdXRfYnVmZmVyX3NpemUgPSAwOwogICAgIG91dHB1dF9zdHJpZGUgPSAwOwogICB9IGVsc2UgeyAgLy8gQSBidWZmZXIgd2FzIHBhc3NlZC4gVmFsaWRhdGUgdGhlIG90aGVyIHBhcmFtcy4KQEAgLTY0NCw3ICs2OTUsNyBAQAogICB9CiAgIGlkZWMgPSBXZWJQSU5ld0RlY29kZXIoTlVMTCk7CiAgIGlmIChpZGVjID09IE5VTEwpIHJldHVybiBOVUxMOwotICBpZGVjLT5vdXRwdXRfLmNvbG9yc3BhY2UgPSBtb2RlOworICBpZGVjLT5vdXRwdXRfLmNvbG9yc3BhY2UgPSBjc3A7CiAgIGlkZWMtPm91dHB1dF8uaXNfZXh0ZXJuYWxfbWVtb3J5ID0gaXNfZXh0ZXJuYWxfbWVtb3J5OwogICBpZGVjLT5vdXRwdXRfLnUuUkdCQS5yZ2JhID0gb3V0cHV0X2J1ZmZlcjsKICAgaWRlYy0+b3V0cHV0Xy51LlJHQkEuc3RyaWRlID0gb3V0cHV0X3N0cmlkZTsKQEAgLTY1NiwxMSArNzA3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCBzaXplX3QgdV9zaXplLCBpbnQgdV9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2LCBzaXplX3Qgdl9zaXplLCBpbnQgdl9zdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhLCBzaXplX3QgYV9zaXplLCBpbnQgYV9zdHJpZGUpIHsKLSAgY29uc3QgaW50IGlzX2V4dGVybmFsX21lbW9yeSA9IChsdW1hICE9IE5VTEwpOworICBjb25zdCBpbnQgaXNfZXh0ZXJuYWxfbWVtb3J5ID0gKGx1bWEgIT0gTlVMTCkgPyAxIDogMDsKICAgV2ViUElEZWNvZGVyKiBpZGVjOwogICBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2U7CiAKLSAgaWYgKCFpc19leHRlcm5hbF9tZW1vcnkpIHsgICAgLy8gT3ZlcndyaXRlIHBhcmFtZXRlcnMgdG8gc2FuZSB2YWx1ZXMuCisgIGlmIChpc19leHRlcm5hbF9tZW1vcnkgPT0gMCkgeyAgICAvLyBPdmVyd3JpdGUgcGFyYW1ldGVycyB0byBzYW5lIHZhbHVlcy4KICAgICBsdW1hX3NpemUgPSB1X3NpemUgPSB2X3NpemUgPSBhX3NpemUgPSAwOwogICAgIGx1bWFfc3RyaWRlID0gdV9zdHJpZGUgPSB2X3N0cmlkZSA9IGFfc3RyaWRlID0gMDsKICAgICB1ID0gdiA9IGEgPSBOVUxMOwpAQCAtNzA3LDcgKzc1OCw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0aWMgVlA4U3RhdHVzQ29kZSBJRGVjQ2hlY2tTdGF0dXMoY29uc3QgV2ViUElEZWNvZGVyKiBjb25zdCBpZGVjKSB7Ci0gIFNCX0RDSEVDSyhpZGVjKTsKKyAgYXNzZXJ0KGlkZWMpOwogICBpZiAoaWRlYy0+c3RhdGVfID09IFNUQVRFX0VSUk9SKSB7CiAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwogICB9CkBAIC03NjgsNiArODE5LDkgQEAKICAgaWYgKGlkZWMtPnN0YXRlXyA8PSBTVEFURV9WUDhfUEFSVFMwKSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KKyAgaWYgKGlkZWMtPmZpbmFsX291dHB1dF8gIT0gTlVMTCkgeworICAgIHJldHVybiBOVUxMOyAgIC8vIG5vdCB5ZXQgc2xvdy1jb3BpZWQKKyAgfQogICByZXR1cm4gaWRlYy0+cGFyYW1zXy5vdXRwdXQ7CiB9CiAKQEAgLTc3Nyw4ICs4MzEsNyBAQAogICBjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMgPSBHZXRPdXRwdXRCdWZmZXIoaWRlYyk7CiAgIGlmIChsZWZ0ICE9IE5VTEwpICpsZWZ0ID0gMDsKICAgaWYgKHRvcCAhPSBOVUxMKSAqdG9wID0gMDsKLSAgLy8gVE9ETyhza2FsKTogbGF0ZXIgaW5jbHVkZSBoYW5kbGluZyBvZiByb3RhdGlvbnMuCi0gIGlmIChzcmMpIHsKKyAgaWYgKHNyYyAhPSBOVUxMKSB7CiAgICAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHNyYy0+d2lkdGg7CiAgICAgaWYgKGhlaWdodCAhPSBOVUxMKSAqaGVpZ2h0ID0gaWRlYy0+cGFyYW1zXy5sYXN0X3k7CiAgIH0gZWxzZSB7CkBAIC04MzIsNyArODg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgVlA4SW9TZXR1cEhvb2sgc2V0dXAsCiAgICAgICAgICAgICAgICAgICAgIFZQOElvVGVhcmRvd25Ib29rIHRlYXJkb3duLAogICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX2RhdGEpIHsKLSAgaWYgKGlkZWMgPT0gTlVMTCB8fCBpZGVjLT5zdGF0ZV8gPiBTVEFURV9QUkVfVlA4KSB7CisgIGlmIChpZGVjID09IE5VTEwgfHwgaWRlYy0+c3RhdGVfID4gU1RBVEVfV0VCUF9IRUFERVIpIHsKICAgICByZXR1cm4gMDsKICAgfQogCkBAIC04NDMsNyArODk2LDMgQEAKIAogICByZXR1cm4gMTsKIH0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvaW8uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaW9fZGVjLmMKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lvLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvaW9fZGVjLmMKaW5kZXggNjBhNjg2NS4uZGE5ZTU1ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2lvLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9pb19kZWMuYwpAQCAtMTIsMjEgKzEyLDE4IEBACiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjZW5kaWYKLQotI2luY2x1ZGUgIi4uL2RlYy92cDhpLmgiCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL2RzcC9kc3AuaCIKLSNpbmNsdWRlICIuLi9kc3AveXV2LmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIE1haW4gWVVWPC0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCkBAIC00Myw2OCArNDAsMjggQEAKICAgY29uc3QgaW50IHV2X2ggPSAobWJfaCArIDEpIC8gMjsKICAgaW50IGo7CiAgIGZvciAoaiA9IDA7IGogPCBtYl9oOyArK2opIHsKLSAgICBTYk1lbW9yeUNvcHkoeV9kc3QgKyBqICogYnVmLT55X3N0cmlkZSwgaW8tPnkgKyBqICogaW8tPnlfc3RyaWRlLCBtYl93KTsKKyAgICBtZW1jcHkoeV9kc3QgKyBqICogYnVmLT55X3N0cmlkZSwgaW8tPnkgKyBqICogaW8tPnlfc3RyaWRlLCBtYl93KTsKICAgfQogICBmb3IgKGogPSAwOyBqIDwgdXZfaDsgKytqKSB7Ci0gICAgU2JNZW1vcnlDb3B5KHVfZHN0ICsgaiAqIGJ1Zi0+dV9zdHJpZGUsIGlvLT51ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOwotICAgIFNiTWVtb3J5Q29weSh2X2RzdCArIGogKiBidWYtPnZfc3RyaWRlLCBpby0+diArIGogKiBpby0+dXZfc3RyaWRlLCB1dl93KTsKKyAgICBtZW1jcHkodV9kc3QgKyBqICogYnVmLT51X3N0cmlkZSwgaW8tPnUgKyBqICogaW8tPnV2X3N0cmlkZSwgdXZfdyk7CisgICAgbWVtY3B5KHZfZHN0ICsgaiAqIGJ1Zi0+dl9zdHJpZGUsIGlvLT52ICsgaiAqIGlvLT51dl9zdHJpZGUsIHV2X3cpOwogICB9CiAgIHJldHVybiBpby0+bWJfaDsKIH0KIAogLy8gUG9pbnQtc2FtcGxpbmcgVS9WIHNhbXBsZXIuCiBzdGF0aWMgaW50IEVtaXRTYW1wbGVkUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgewotICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQgPSBwLT5vdXRwdXQ7Ci0gIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHlfc3JjID0gaW8tPnk7Ci0gIGNvbnN0IHVpbnQ4X3QqIHVfc3JjID0gaW8tPnU7Ci0gIGNvbnN0IHVpbnQ4X3QqIHZfc3JjID0gaW8tPnY7Ci0gIGNvbnN0IFdlYlBTYW1wbGVMaW5lUGFpckZ1bmMgc2FtcGxlID0gV2ViUFNhbXBsZXJzW291dHB1dC0+Y29sb3JzcGFjZV07Ci0gIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7Ci0gIGNvbnN0IGludCBsYXN0ID0gaW8tPm1iX2ggLSAxOwotICBpbnQgajsKLSAgZm9yIChqID0gMDsgaiA8IGxhc3Q7IGogKz0gMikgewotICAgIHNhbXBsZSh5X3NyYywgeV9zcmMgKyBpby0+eV9zdHJpZGUsIHVfc3JjLCB2X3NyYywKLSAgICAgICAgICAgZHN0LCBkc3QgKyBidWYtPnN0cmlkZSwgbWJfdyk7Ci0gICAgeV9zcmMgKz0gMiAqIGlvLT55X3N0cmlkZTsKLSAgICB1X3NyYyArPSBpby0+dXZfc3RyaWRlOwotICAgIHZfc3JjICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgZHN0ICs9IDIgKiBidWYtPnN0cmlkZTsKLSAgfQotICBpZiAoaiA9PSBsYXN0KSB7ICAvLyBKdXN0IGRvIHRoZSBsYXN0IGxpbmUgdHdpY2UKLSAgICBzYW1wbGUoeV9zcmMsIHlfc3JjLCB1X3NyYywgdl9zcmMsIGRzdCwgZHN0LCBtYl93KTsKLSAgfQorICBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQgPSBwLT5vdXRwdXQ7CisgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmb3V0cHV0LT51LlJHQkE7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IGJ1Zi0+cmdiYSArIGlvLT5tYl95ICogYnVmLT5zdHJpZGU7CisgIFdlYlBTYW1wbGVyUHJvY2Vzc1BsYW5lKGlvLT55LCBpby0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT51LCBpby0+diwgaW8tPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBidWYtPnN0cmlkZSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQU2FtcGxlcnNbb3V0cHV0LT5jb2xvcnNwYWNlXSk7CiAgIHJldHVybiBpby0+bWJfaDsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFlVVjQ0NCAtPiBSR0IgY29udmVyc2lvbgotCi0jaWYgMCAgIC8vIFRPRE8oc2thbCk6IHRoaXMgaXMgZm9yIGZ1dHVyZSByZXNjYWxpbmcuCi1zdGF0aWMgaW50IEVtaXRSR0IoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7Ci0gIFdlYlBEZWNCdWZmZXIqIG91dHB1dCA9IHAtPm91dHB1dDsKLSAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZvdXRwdXQtPnUuUkdCQTsKLSAgdWludDhfdCogZHN0ID0gYnVmLT5yZ2JhICsgaW8tPm1iX3kgKiBidWYtPnN0cmlkZTsKLSAgY29uc3QgdWludDhfdCogeV9zcmMgPSBpby0+eTsKLSAgY29uc3QgdWludDhfdCogdV9zcmMgPSBpby0+dTsKLSAgY29uc3QgdWludDhfdCogdl9zcmMgPSBpby0+djsKLSAgY29uc3QgV2ViUFlVVjQ0NENvbnZlcnRlciBjb252ZXJ0ID0gV2ViUFlVVjQ0NENvbnZlcnRlcnNbb3V0cHV0LT5jb2xvcnNwYWNlXTsKLSAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKLSAgY29uc3QgaW50IGxhc3QgPSBpby0+bWJfaDsKLSAgaW50IGo7Ci0gIGZvciAoaiA9IDA7IGogPCBsYXN0OyArK2opIHsKLSAgICBjb252ZXJ0KHlfc3JjLCB1X3NyYywgdl9zcmMsIGRzdCwgbWJfdyk7Ci0gICAgeV9zcmMgKz0gaW8tPnlfc3RyaWRlOwotICAgIHVfc3JjICs9IGlvLT51dl9zdHJpZGU7Ci0gICAgdl9zcmMgKz0gaW8tPnV2X3N0cmlkZTsKLSAgICBkc3QgKz0gYnVmLT5zdHJpZGU7Ci0gIH0KLSAgcmV0dXJuIGlvLT5tYl9oOwotfQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBGYW5jeSB1cHNhbXBsaW5nCiAKICNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCkBAIC0xMjUsNyArODIsNyBAQAogCiAgIGlmICh5ID09IDApIHsKICAgICAvLyBGaXJzdCBsaW5lIGlzIHNwZWNpYWwgY2FzZWQuIFdlIG1pcnJvciB0aGUgdS92IHNhbXBsZXMgYXQgYm91bmRhcnkuCi0gICAgdXBzYW1wbGUoTlVMTCwgY3VyX3ksIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBOVUxMLCBkc3QsIG1iX3cpOworICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgZHN0LCBOVUxMLCBtYl93KTsKICAgfSBlbHNlIHsKICAgICAvLyBXZSBjYW4gZmluaXNoIHRoZSBsZWZ0LW92ZXIgbGluZSBmcm9tIHByZXZpb3VzIGNhbGwuCiAgICAgdXBzYW1wbGUocC0+dG1wX3ksIGN1cl95LCB0b3BfdSwgdG9wX3YsIGN1cl91LCBjdXJfdiwKQEAgLTE0OCw5ICsxMDUsOSBAQAogICBjdXJfeSArPSBpby0+eV9zdHJpZGU7CiAgIGlmIChpby0+Y3JvcF90b3AgKyB5X2VuZCA8IGlvLT5jcm9wX2JvdHRvbSkgewogICAgIC8vIFNhdmUgdGhlIHVuZmluaXNoZWQgc2FtcGxlcyBmb3IgbmV4dCBjYWxsIChhcyB3ZSdyZSBub3QgZG9uZSB5ZXQpLgotICAgIFNiTWVtb3J5Q29weShwLT50bXBfeSwgY3VyX3ksIG1iX3cgKiBzaXplb2YoKnAtPnRtcF95KSk7Ci0gICAgU2JNZW1vcnlDb3B5KHAtPnRtcF91LCBjdXJfdSwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3UpKTsKLSAgICBTYk1lbW9yeUNvcHkocC0+dG1wX3YsIGN1cl92LCB1dl93ICogc2l6ZW9mKCpwLT50bXBfdikpOworICAgIG1lbWNweShwLT50bXBfeSwgY3VyX3ksIG1iX3cgKiBzaXplb2YoKnAtPnRtcF95KSk7CisgICAgbWVtY3B5KHAtPnRtcF91LCBjdXJfdSwgdXZfdyAqIHNpemVvZigqcC0+dG1wX3UpKTsKKyAgICBtZW1jcHkocC0+dG1wX3YsIGN1cl92LCB1dl93ICogc2l6ZW9mKCpwLT50bXBfdikpOwogICAgIC8vIFRoZSBmYW5jeSB1cHNhbXBsZXIgbGVhdmVzIGEgcm93IHVuZmluaXNoZWQgYmVoaW5kCiAgICAgLy8gKGV4Y2VwdCBmb3IgdGhlIHZlcnkgbGFzdCByb3cpCiAgICAgbnVtX2xpbmVzX291dC0tOwpAQCAtMTY4LDI2ICsxMjUsMzMgQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIGludCBFbWl0QWxwaGFZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CitzdGF0aWMgdm9pZCBGaWxsQWxwaGFQbGFuZSh1aW50OF90KiBkc3QsIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IGg7ICsraikgeworICAgIG1lbXNldChkc3QsIDB4ZmYsIHcgKiBzaXplb2YoKmRzdCkpOworICAgIGRzdCArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIGludCBFbWl0QWxwaGFZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKICAgY29uc3QgdWludDhfdCogYWxwaGEgPSBpby0+YTsKICAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuWVVWQTsKICAgY29uc3QgaW50IG1iX3cgPSBpby0+bWJfdzsKICAgY29uc3QgaW50IG1iX2ggPSBpby0+bWJfaDsKICAgdWludDhfdCogZHN0ID0gYnVmLT5hICsgaW8tPm1iX3kgKiBidWYtPmFfc3RyaWRlOwogICBpbnQgajsKLQorICAodm9pZClleHBlY3RlZF9udW1fbGluZXNfb3V0OworICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBtYl9oKTsKICAgaWYgKGFscGhhICE9IE5VTEwpIHsKICAgICBmb3IgKGogPSAwOyBqIDwgbWJfaDsgKytqKSB7Ci0gICAgICBTYk1lbW9yeUNvcHkoZHN0LCBhbHBoYSwgbWJfdyAqIHNpemVvZigqZHN0KSk7CisgICAgICBtZW1jcHkoZHN0LCBhbHBoYSwgbWJfdyAqIHNpemVvZigqZHN0KSk7CiAgICAgICBhbHBoYSArPSBpby0+d2lkdGg7CiAgICAgICBkc3QgKz0gYnVmLT5hX3N0cmlkZTsKICAgICB9CiAgIH0gZWxzZSBpZiAoYnVmLT5hICE9IE5VTEwpIHsKICAgICAvLyB0aGUgdXNlciByZXF1ZXN0ZWQgYWxwaGEsIGJ1dCB0aGVyZSBpcyBub25lLCBzZXQgaXQgdG8gb3BhcXVlLgotICAgIGZvciAoaiA9IDA7IGogPCBtYl9oOyArK2opIHsKLSAgICAgIFNiTWVtb3J5U2V0KGRzdCwgMHhmZiwgbWJfdyAqIHNpemVvZigqZHN0KSk7Ci0gICAgICBkc3QgKz0gYnVmLT5hX3N0cmlkZTsKLSAgICB9CisgICAgRmlsbEFscGhhUGxhbmUoZHN0LCBtYl93LCBtYl9oLCBidWYtPmFfc3RyaWRlKTsKICAgfQogICByZXR1cm4gMDsKIH0KQEAgLTIxOCw3ICsxODIsOCBAQAogICByZXR1cm4gc3RhcnRfeTsKIH0KIAotc3RhdGljIGludCBFbWl0QWxwaGFSR0IoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CitzdGF0aWMgaW50IEVtaXRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCkgewogICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOwogICBpZiAoYWxwaGEgIT0gTlVMTCkgewogICAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CkBAIC0yMjksMjEgKzE5NCwxMyBAQAogICAgIGludCBudW1fcm93czsKICAgICBjb25zdCBpbnQgc3RhcnRfeSA9IEdldEFscGhhU291cmNlUm93KGlvLCAmYWxwaGEsICZudW1fcm93cyk7CiAgICAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgc3RhcnRfeSAqIGJ1Zi0+c3RyaWRlOwotICAgIHVpbnQ4X3QqIGRzdCA9IGJhc2VfcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKLSAgICB1aW50MzJfdCBhbHBoYV9tYXNrID0gMHhmZjsKLSAgICBpbnQgaSwgajsKLQotICAgIGZvciAoaiA9IDA7IGogPCBudW1fcm93czsgKytqKSB7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgbWJfdzsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYWxwaGFbaV07Ci0gICAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKLSAgICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKLSAgICAgIH0KLSAgICAgIGFscGhhICs9IGlvLT53aWR0aDsKLSAgICAgIGRzdCArPSBidWYtPnN0cmlkZTsKLSAgICB9Ci0gICAgLy8gYWxwaGFfbWFzayBpcyA8IDB4ZmYgaWYgdGhlcmUncyBub24tdHJpdmlhbCBhbHBoYSB0byBwcmVtdWx0aXBseSB3aXRoLgotICAgIGlmIChhbHBoYV9tYXNrICE9IDB4ZmYgJiYgV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIHsKKyAgICB1aW50OF90KiBjb25zdCBkc3QgPSBiYXNlX3JnYmEgKyAoYWxwaGFfZmlyc3QgPyAwIDogMyk7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IFdlYlBEaXNwYXRjaEFscGhhKGFscGhhLCBpby0+d2lkdGgsIG1iX3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9yb3dzLCBkc3QsIGJ1Zi0+c3RyaWRlKTsKKyAgICAodm9pZClleHBlY3RlZF9udW1fbGluZXNfb3V0OworICAgIGFzc2VydChleHBlY3RlZF9udW1fbGluZXNfb3V0ID09IG51bV9yb3dzKTsKKyAgICAvLyBoYXNfYWxwaGEgaXMgdHJ1ZSBpZiB0aGVyZSdzIG5vbi10cml2aWFsIGFscGhhIHRvIHByZW11bHRpcGx5IHdpdGguCisgICAgaWYgKGhhc19hbHBoYSAmJiBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKSkgewogICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShiYXNlX3JnYmEsIGFscGhhX2ZpcnN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYl93LCBudW1fcm93cywgYnVmLT5zdHJpZGUpOwogICAgIH0KQEAgLTI1MSw3ICsyMDgsOCBAQAogICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBFbWl0QWxwaGFSR0JBNDQ0NChjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHApIHsKK3N0YXRpYyBpbnQgRW1pdEFscGhhUkdCQTQ0NDQoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCkgewogICBjb25zdCB1aW50OF90KiBhbHBoYSA9IGlvLT5hOwogICBpZiAoYWxwaGEgIT0gTlVMTCkgewogICAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CkBAIC0yNjAsMTAgKzIxOCwxMyBAQAogICAgIGludCBudW1fcm93czsKICAgICBjb25zdCBpbnQgc3RhcnRfeSA9IEdldEFscGhhU291cmNlUm93KGlvLCAmYWxwaGEsICZudW1fcm93cyk7CiAgICAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgc3RhcnRfeSAqIGJ1Zi0+c3RyaWRlOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgdWludDhfdCogYWxwaGFfZHN0ID0gYmFzZV9yZ2JhOworI2Vsc2UKICAgICB1aW50OF90KiBhbHBoYV9kc3QgPSBiYXNlX3JnYmEgKyAxOworI2VuZGlmCiAgICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4MGY7CiAgICAgaW50IGksIGo7Ci0KICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3Jvd3M7ICsraikgewogICAgICAgZm9yIChpID0gMDsgaSA8IG1iX3c7ICsraSkgewogICAgICAgICAvLyBGaWxsIGluIHRoZSBhbHBoYSB2YWx1ZSAoY29udmVydGVkIHRvIDQgYml0cykuCkBAIC0yNzQsNiArMjM1LDggQEAKICAgICAgIGFscGhhICs9IGlvLT53aWR0aDsKICAgICAgIGFscGhhX2RzdCArPSBidWYtPnN0cmlkZTsKICAgICB9CisgICAgKHZvaWQpZXhwZWN0ZWRfbnVtX2xpbmVzX291dDsKKyAgICBhc3NlcnQoZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA9PSBudW1fcm93cyk7CiAgICAgaWYgKGFscGhhX21hc2sgIT0gMHgwZiAmJiBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKSkgewogICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQoYmFzZV9yZ2JhLCBtYl93LCBudW1fcm93cywgYnVmLT5zdHJpZGUpOwogICAgIH0KQEAgLTI4NCw2ICsyNDcsNyBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFlVViByZXNjYWxpbmcgKG5vIGZpbmFsIFJHQiBjb252ZXJzaW9uIG5lZWRlZCkKIAorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCiBzdGF0aWMgaW50IFJlc2NhbGUoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2xpbmVzLCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgewogICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CkBAIC0yOTksMTUgKzI2MywzOSBAQAogc3RhdGljIGludCBFbWl0UmVzY2FsZWRZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CiAgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CiAgIGNvbnN0IGludCB1dl9tYl9oID0gKG1iX2ggKyAxKSA+PiAxOwotICBjb25zdCBpbnQgbnVtX2xpbmVzX291dCA9IFJlc2NhbGUoaW8tPnksIGlvLT55X3N0cmlkZSwgbWJfaCwgJnAtPnNjYWxlcl95KTsKLSAgUmVzY2FsZShpby0+dSwgaW8tPnV2X3N0cmlkZSwgdXZfbWJfaCwgJnAtPnNjYWxlcl91KTsKLSAgUmVzY2FsZShpby0+diwgaW8tPnV2X3N0cmlkZSwgdXZfbWJfaCwgJnAtPnNjYWxlcl92KTsKKyAgV2ViUFJlc2NhbGVyKiBjb25zdCBzY2FsZXIgPSBwLT5zY2FsZXJfeTsKKyAgaW50IG51bV9saW5lc19vdXQgPSAwOworICBpZiAoV2ViUElzQWxwaGFNb2RlKHAtPm91dHB1dC0+Y29sb3JzcGFjZSkgJiYgaW8tPmEgIT0gTlVMTCkgeworICAgIC8vIEJlZm9yZSByZXNjYWxpbmcsIHdlIHByZW11bHRpcGx5IHRoZSBsdW1hIGRpcmVjdGx5IGludG8gdGhlIGlvLT55CisgICAgLy8gaW50ZXJuYWwgYnVmZmVyLiBUaGlzIGlzIE9LIHNpbmNlIHRoZXNlIHNhbXBsZXMgYXJlIG5vdCB1c2VkIGZvcgorICAgIC8vIGludHJhLXByZWRpY3Rpb24gKHRoZSB0b3Agc2FtcGxlcyBhcmUgc2F2ZWQgaW4gY2FjaGVfeV8vdV8vdl8pLgorICAgIC8vIEJ1dCB3ZSBuZWVkIHRvIGNhc3QgdGhlIGNvbnN0IGF3YXksIHRob3VnaC4KKyAgICBXZWJQTXVsdFJvd3MoKHVpbnQ4X3QqKWlvLT55LCBpby0+eV9zdHJpZGUsCisgICAgICAgICAgICAgICAgIGlvLT5hLCBpby0+d2lkdGgsIGlvLT5tYl93LCBtYl9oLCAwKTsKKyAgfQorICBudW1fbGluZXNfb3V0ID0gUmVzY2FsZShpby0+eSwgaW8tPnlfc3RyaWRlLCBtYl9oLCBzY2FsZXIpOworICBSZXNjYWxlKGlvLT51LCBpby0+dXZfc3RyaWRlLCB1dl9tYl9oLCBwLT5zY2FsZXJfdSk7CisgIFJlc2NhbGUoaW8tPnYsIGlvLT51dl9zdHJpZGUsIHV2X21iX2gsIHAtPnNjYWxlcl92KTsKICAgcmV0dXJuIG51bV9saW5lc19vdXQ7CiB9CiAKLXN0YXRpYyBpbnQgRW1pdFJlc2NhbGVkQWxwaGFZVVYoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKSB7CitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhWVVWKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9saW5lc19vdXQpIHsKKyAgY29uc3QgV2ViUFlVVkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuWVVWQTsKKyAgdWludDhfdCogY29uc3QgZHN0X2EgPSBidWYtPmEgKyBwLT5sYXN0X3kgKiBidWYtPmFfc3RyaWRlOwogICBpZiAoaW8tPmEgIT0gTlVMTCkgewotICAgIFJlc2NhbGUoaW8tPmEsIGlvLT53aWR0aCwgaW8tPm1iX2gsICZwLT5zY2FsZXJfYSk7CisgICAgdWludDhfdCogY29uc3QgZHN0X3kgPSBidWYtPnkgKyBwLT5sYXN0X3kgKiBidWYtPnlfc3RyaWRlOworICAgIGNvbnN0IGludCBudW1fbGluZXNfb3V0ID0gUmVzY2FsZShpby0+YSwgaW8tPndpZHRoLCBpby0+bWJfaCwgcC0+c2NhbGVyX2EpOworICAgIGFzc2VydChleHBlY3RlZF9udW1fbGluZXNfb3V0ID09IG51bV9saW5lc19vdXQpOworICAgIGlmIChudW1fbGluZXNfb3V0ID4gMCkgeyAgIC8vIHVubXVsdGlwbHkgdGhlIFkKKyAgICAgIFdlYlBNdWx0Um93cyhkc3RfeSwgYnVmLT55X3N0cmlkZSwgZHN0X2EsIGJ1Zi0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgcC0+c2NhbGVyX2EtPmRzdF93aWR0aCwgbnVtX2xpbmVzX291dCwgMSk7CisgICAgfQorICB9IGVsc2UgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgLy8gdGhlIHVzZXIgcmVxdWVzdGVkIGFscGhhLCBidXQgdGhlcmUgaXMgbm9uZSwgc2V0IGl0IHRvIG9wYXF1ZS4KKyAgICBhc3NlcnQocC0+bGFzdF95ICsgZXhwZWN0ZWRfbnVtX2xpbmVzX291dCA8PSBpby0+c2NhbGVkX2hlaWdodCk7CisgICAgRmlsbEFscGhhUGxhbmUoZHN0X2EsIGlvLT5zY2FsZWRfd2lkdGgsIGV4cGVjdGVkX251bV9saW5lc19vdXQsCisgICAgICAgICAgICAgICAgICAgYnVmLT5hX3N0cmlkZSk7CiAgIH0KICAgcmV0dXJuIDA7CiB9CkBAIC0zMjMsNDAgKzMxMSw0NiBAQAogICBjb25zdCBpbnQgdXZfaW5faGVpZ2h0ID0gKGlvLT5tYl9oICsgMSkgPj4gMTsKICAgY29uc3Qgc2l6ZV90IHdvcmtfc2l6ZSA9IDIgKiBvdXRfd2lkdGg7ICAgLy8gc2NyYXRjaCBtZW1vcnkgZm9yIGx1bWEgcmVzY2FsZXIKICAgY29uc3Qgc2l6ZV90IHV2X3dvcmtfc2l6ZSA9IDIgKiB1dl9vdXRfd2lkdGg7ICAvLyBhbmQgZm9yIGVhY2ggdS92IG9uZXMKLSAgc2l6ZV90IHRtcF9zaXplOwotICBpbnQzMl90KiB3b3JrOworICBzaXplX3QgdG1wX3NpemUsIHJlc2NhbGVyX3NpemU7CisgIHJlc2NhbGVyX3QqIHdvcms7CisgIFdlYlBSZXNjYWxlciogc2NhbGVyczsKKyAgY29uc3QgaW50IG51bV9yZXNjYWxlcnMgPSBoYXNfYWxwaGEgPyA0IDogMzsKIAotICB0bXBfc2l6ZSA9IHdvcmtfc2l6ZSArIDIgKiB1dl93b3JrX3NpemU7CisgIHRtcF9zaXplID0gKHdvcmtfc2l6ZSArIDIgKiB1dl93b3JrX3NpemUpICogc2l6ZW9mKCp3b3JrKTsKICAgaWYgKGhhc19hbHBoYSkgewotICAgIHRtcF9zaXplICs9IHdvcmtfc2l6ZTsKKyAgICB0bXBfc2l6ZSArPSB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspOwogICB9Ci0gIHAtPm1lbW9yeSA9IFNiTWVtb3J5Q2FsbG9jKDEsIHRtcF9zaXplICogc2l6ZW9mKCp3b3JrKSk7CisgIHJlc2NhbGVyX3NpemUgPSBudW1fcmVzY2FsZXJzICogc2l6ZW9mKCpwLT5zY2FsZXJfeSkgKyBXRUJQX0FMSUdOX0NTVDsKKworICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCB0bXBfc2l6ZSArIHJlc2NhbGVyX3NpemUpOwogICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKICAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IKICAgfQotICB3b3JrID0gKGludDMyX3QqKXAtPm1lbW9yeTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKKyAgd29yayA9IChyZXNjYWxlcl90KilwLT5tZW1vcnk7CisKKyAgc2NhbGVycyA9IChXZWJQUmVzY2FsZXIqKVdFQlBfQUxJR04oKGNvbnN0IHVpbnQ4X3QqKXdvcmsgKyB0bXBfc2l6ZSk7CisgIHAtPnNjYWxlcl95ID0gJnNjYWxlcnNbMF07CisgIHAtPnNjYWxlcl91ID0gJnNjYWxlcnNbMV07CisgIHAtPnNjYWxlcl92ID0gJnNjYWxlcnNbMl07CisgIHAtPnNjYWxlcl9hID0gaGFzX2FscGhhID8gJnNjYWxlcnNbM10gOiBOVUxMOworCisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKICAgICAgICAgICAgICAgICAgICBidWYtPnksIG91dF93aWR0aCwgb3V0X2hlaWdodCwgYnVmLT55X3N0cmlkZSwgMSwKLSAgICAgICAgICAgICAgICAgICBpby0+bWJfdywgb3V0X3dpZHRoLCBpby0+bWJfaCwgb3V0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICB3b3JrKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgYnVmLT51LCB1dl9vdXRfd2lkdGgsIHV2X291dF9oZWlnaHQsIGJ1Zi0+dV9zdHJpZGUsIDEsCi0gICAgICAgICAgICAgICAgICAgdXZfaW5fd2lkdGgsIHV2X291dF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICB1dl9pbl9oZWlnaHQsIHV2X291dF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgd29yayArIHdvcmtfc2l6ZSk7Ci0gIFdlYlBSZXNjYWxlckluaXQoJnAtPnNjYWxlcl92LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAorICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl92LCB1dl9pbl93aWR0aCwgdXZfaW5faGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIGJ1Zi0+diwgdXZfb3V0X3dpZHRoLCB1dl9vdXRfaGVpZ2h0LCBidWYtPnZfc3RyaWRlLCAxLAotICAgICAgICAgICAgICAgICAgIHV2X2luX3dpZHRoLCB1dl9vdXRfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgdXZfaW5faGVpZ2h0LCB1dl9vdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHdvcmsgKyB3b3JrX3NpemUgKyB1dl93b3JrX3NpemUpOwogICBwLT5lbWl0ID0gRW1pdFJlc2NhbGVkWVVWOwogCiAgIGlmIChoYXNfYWxwaGEpIHsKLSAgICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfYSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKICAgICAgICAgICAgICAgICAgICAgIGJ1Zi0+YSwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCBidWYtPmFfc3RyaWRlLCAxLAotICAgICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIG91dF93aWR0aCwgaW8tPm1iX2gsIG91dF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICB3b3JrICsgd29ya19zaXplICsgMiAqIHV2X3dvcmtfc2l6ZSk7CiAgICAgcC0+ZW1pdF9hbHBoYSA9IEVtaXRSZXNjYWxlZEFscGhhWVVWOworICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CiAgIH0KICAgcmV0dXJuIDE7CiB9CkBAIC0zNjgsMTkgKzM2MiwxOSBAQAogICBjb25zdCBXZWJQWVVWNDQ0Q29udmVydGVyIGNvbnZlcnQgPQogICAgICAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbcC0+b3V0cHV0LT5jb2xvcnNwYWNlXTsKICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKLSAgdWludDhfdCogZHN0ID0gYnVmLT5yZ2JhICsgKHAtPmxhc3RfeSArIHlfcG9zKSAqIGJ1Zi0+c3RyaWRlOworICB1aW50OF90KiBkc3QgPSBidWYtPnJnYmEgKyB5X3BvcyAqIGJ1Zi0+c3RyaWRlOwogICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CiAgIC8vIEZvciBSR0IgcmVzY2FsaW5nLCBiZWNhdXNlIG9mIHRoZSBZVVY0MjAsIGN1cnJlbnQgc2NhbiBwb3NpdGlvbgogICAvLyBVL1YgY2FuIGJlICsxLy0xIGxpbmUgZnJvbSB0aGUgWSBvbmUuICBIZW5jZSB0aGUgZG91YmxlIHRlc3QuCi0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfeSkgJiYKLSAgICAgICAgIFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoJnAtPnNjYWxlcl91KSkgewotICAgIFNCX0RDSEVDSyhwLT5sYXN0X3kgKyB5X3BvcyArIG51bV9saW5lc19vdXQgPCBwLT5vdXRwdXQtPmhlaWdodCk7Ci0gICAgU0JfRENIRUNLKHAtPnNjYWxlcl91LnlfYWNjdW0gPT0gcC0+c2NhbGVyX3YueV9hY2N1bSk7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KCZwLT5zY2FsZXJfeSk7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KCZwLT5zY2FsZXJfdSk7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KCZwLT5zY2FsZXJfdik7Ci0gICAgY29udmVydChwLT5zY2FsZXJfeS5kc3QsIHAtPnNjYWxlcl91LmRzdCwgcC0+c2NhbGVyX3YuZHN0LAotICAgICAgICAgICAgZHN0LCBwLT5zY2FsZXJfeS5kc3Rfd2lkdGgpOworICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChwLT5zY2FsZXJfeSkgJiYKKyAgICAgICAgIFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocC0+c2NhbGVyX3UpKSB7CisgICAgYXNzZXJ0KHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKKyAgICBhc3NlcnQocC0+c2NhbGVyX3UtPnlfYWNjdW0gPT0gcC0+c2NhbGVyX3YtPnlfYWNjdW0pOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhwLT5zY2FsZXJfeSk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHAtPnNjYWxlcl91KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX3YpOworICAgIGNvbnZlcnQocC0+c2NhbGVyX3ktPmRzdCwgcC0+c2NhbGVyX3UtPmRzdCwgcC0+c2NhbGVyX3YtPmRzdCwKKyAgICAgICAgICAgIGRzdCwgcC0+c2NhbGVyX3ktPmRzdF93aWR0aCk7CiAgICAgZHN0ICs9IGJ1Zi0+c3RyaWRlOwogICAgICsrbnVtX2xpbmVzX291dDsKICAgfQpAQCAtMzk0LDcxICszODgsNzUgQEAKICAgaW50IG51bV9saW5lc19vdXQgPSAwOwogICB3aGlsZSAoaiA8IG1iX2gpIHsKICAgICBjb25zdCBpbnQgeV9saW5lc19pbiA9Ci0gICAgICAgIFdlYlBSZXNjYWxlckltcG9ydCgmcC0+c2NhbGVyX3ksIG1iX2ggLSBqLAorICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQocC0+c2NhbGVyX3ksIG1iX2ggLSBqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnkgKyBqICogaW8tPnlfc3RyaWRlLCBpby0+eV9zdHJpZGUpOwotICAgIGNvbnN0IGludCB1X2xpbmVzX2luID0KLSAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KCZwLT5zY2FsZXJfdSwgdXZfbWJfaCAtIHV2X2osCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpby0+dSArIHV2X2ogKiBpby0+dXZfc3RyaWRlLCBpby0+dXZfc3RyaWRlKTsKLSAgICBjb25zdCBpbnQgdl9saW5lc19pbiA9Ci0gICAgICAgIFdlYlBSZXNjYWxlckltcG9ydCgmcC0+c2NhbGVyX3YsIHV2X21iX2ggLSB1dl9qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPnYgKyB1dl9qICogaW8tPnV2X3N0cmlkZSwgaW8tPnV2X3N0cmlkZSk7Ci0gICAgKHZvaWQpdl9saW5lc19pbjsgICAvLyByZW1vdmUgYSBnY2Mgd2FybmluZwotICAgIFNCX0RDSEVDSyh1X2xpbmVzX2luID09IHZfbGluZXNfaW4pOwogICAgIGogKz0geV9saW5lc19pbjsKLSAgICB1dl9qICs9IHVfbGluZXNfaW47Ci0gICAgbnVtX2xpbmVzX291dCArPSBFeHBvcnRSR0IocCwgbnVtX2xpbmVzX291dCk7CisgICAgaWYgKFdlYlBSZXNjYWxlTmVlZGVkTGluZXMocC0+c2NhbGVyX3UsIHV2X21iX2ggLSB1dl9qKSkgeworICAgICAgY29uc3QgaW50IHVfbGluZXNfaW4gPQorICAgICAgICAgIFdlYlBSZXNjYWxlckltcG9ydChwLT5zY2FsZXJfdSwgdXZfbWJfaCAtIHV2X2osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT51ICsgdXZfaiAqIGlvLT51dl9zdHJpZGUsIGlvLT51dl9zdHJpZGUpOworICAgICAgY29uc3QgaW50IHZfbGluZXNfaW4gPQorICAgICAgICAgIFdlYlBSZXNjYWxlckltcG9ydChwLT5zY2FsZXJfdiwgdXZfbWJfaCAtIHV2X2osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvLT52ICsgdXZfaiAqIGlvLT51dl9zdHJpZGUsIGlvLT51dl9zdHJpZGUpOworICAgICAgKHZvaWQpdl9saW5lc19pbjsgICAvLyByZW1vdmUgYSBnY2Mgd2FybmluZworICAgICAgYXNzZXJ0KHVfbGluZXNfaW4gPT0gdl9saW5lc19pbik7CisgICAgICB1dl9qICs9IHVfbGluZXNfaW47CisgICAgfQorICAgIG51bV9saW5lc19vdXQgKz0gRXhwb3J0UkdCKHAsIHAtPmxhc3RfeSArIG51bV9saW5lc19vdXQpOwogICB9CiAgIHJldHVybiBudW1fbGluZXNfb3V0OwogfQogCi1zdGF0aWMgaW50IEV4cG9ydEFscGhhKFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsIGludCB5X3Bvcykgeworc3RhdGljIGludCBFeHBvcnRBbHBoYShXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MsIGludCBtYXhfbGluZXNfb3V0KSB7CiAgIGNvbnN0IFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmcC0+b3V0cHV0LT51LlJHQkE7Ci0gIHVpbnQ4X3QqIGNvbnN0IGJhc2VfcmdiYSA9IGJ1Zi0+cmdiYSArIChwLT5sYXN0X3kgKyB5X3BvcykgKiBidWYtPnN0cmlkZTsKKyAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgeV9wb3MgKiBidWYtPnN0cmlkZTsKICAgY29uc3QgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlID0gcC0+b3V0cHV0LT5jb2xvcnNwYWNlOwogICBjb25zdCBpbnQgYWxwaGFfZmlyc3QgPQogICAgICAgKGNvbG9yc3BhY2UgPT0gTU9ERV9BUkdCIHx8IGNvbG9yc3BhY2UgPT0gTU9ERV9BcmdiKTsKICAgdWludDhfdCogZHN0ID0gYmFzZV9yZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOwogICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CiAgIGNvbnN0IGludCBpc19wcmVtdWx0X2FscGhhID0gV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSk7Ci0gIHVpbnQzMl90IGFscGhhX21hc2sgPSAweGZmOwotICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS5kc3Rfd2lkdGg7CisgIHVpbnQzMl90IG5vbl9vcGFxdWUgPSAwOworICBjb25zdCBpbnQgd2lkdGggPSBwLT5zY2FsZXJfYS0+ZHN0X3dpZHRoOwogCi0gIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KCZwLT5zY2FsZXJfYSkpIHsKLSAgICBpbnQgaTsKLSAgICBTQl9EQ0hFQ0socC0+bGFzdF95ICsgeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOwotICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdygmcC0+c2NhbGVyX2EpOwotICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLmRzdFtpXTsKLSAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKLSAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7Ci0gICAgfQorICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChwLT5zY2FsZXJfYSkgJiYKKyAgICAgICAgIG51bV9saW5lc19vdXQgPCBtYXhfbGluZXNfb3V0KSB7CisgICAgYXNzZXJ0KHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocC0+c2NhbGVyX2EpOworICAgIG5vbl9vcGFxdWUgfD0gV2ViUERpc3BhdGNoQWxwaGEocC0+c2NhbGVyX2EtPmRzdCwgMCwgd2lkdGgsIDEsIGRzdCwgMCk7CiAgICAgZHN0ICs9IGJ1Zi0+c3RyaWRlOwogICAgICsrbnVtX2xpbmVzX291dDsKICAgfQotICBpZiAoaXNfcHJlbXVsdF9hbHBoYSAmJiBhbHBoYV9tYXNrICE9IDB4ZmYpIHsKKyAgaWYgKGlzX3ByZW11bHRfYWxwaGEgJiYgbm9uX29wYXF1ZSkgewogICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkoYmFzZV9yZ2JhLCBhbHBoYV9maXJzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBudW1fbGluZXNfb3V0LCBidWYtPnN0cmlkZSk7CiAgIH0KICAgcmV0dXJuIG51bV9saW5lc19vdXQ7CiB9CiAKLXN0YXRpYyBpbnQgRXhwb3J0QWxwaGFSR0JBNDQ0NChXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MpIHsKK3N0YXRpYyBpbnQgRXhwb3J0QWxwaGFSR0JBNDQ0NChXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9saW5lc19vdXQpIHsKICAgY29uc3QgV2ViUFJHQkFCdWZmZXIqIGNvbnN0IGJ1ZiA9ICZwLT5vdXRwdXQtPnUuUkdCQTsKLSAgdWludDhfdCogY29uc3QgYmFzZV9yZ2JhID0gYnVmLT5yZ2JhICsgKHAtPmxhc3RfeSArIHlfcG9zKSAqIGJ1Zi0+c3RyaWRlOworICB1aW50OF90KiBjb25zdCBiYXNlX3JnYmEgPSBidWYtPnJnYmEgKyB5X3BvcyAqIGJ1Zi0+c3RyaWRlOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIHVpbnQ4X3QqIGFscGhhX2RzdCA9IGJhc2VfcmdiYTsKKyNlbHNlCiAgIHVpbnQ4X3QqIGFscGhhX2RzdCA9IGJhc2VfcmdiYSArIDE7CisjZW5kaWYKICAgaW50IG51bV9saW5lc19vdXQgPSAwOwogICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBwLT5vdXRwdXQtPmNvbG9yc3BhY2U7Ci0gIGNvbnN0IGludCB3aWR0aCA9IHAtPnNjYWxlcl9hLmRzdF93aWR0aDsKKyAgY29uc3QgaW50IHdpZHRoID0gcC0+c2NhbGVyX2EtPmRzdF93aWR0aDsKICAgY29uc3QgaW50IGlzX3ByZW11bHRfYWxwaGEgPSBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKTsKICAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4MGY7CiAKLSAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQoJnAtPnNjYWxlcl9hKSkgeworICB3aGlsZSAoV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChwLT5zY2FsZXJfYSkgJiYKKyAgICAgICAgIG51bV9saW5lc19vdXQgPCBtYXhfbGluZXNfb3V0KSB7CiAgICAgaW50IGk7Ci0gICAgU0JfRENIRUNLKHAtPmxhc3RfeSArIHlfcG9zICsgbnVtX2xpbmVzX291dCA8IHAtPm91dHB1dC0+aGVpZ2h0KTsKLSAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3coJnAtPnNjYWxlcl9hKTsKKyAgICBhc3NlcnQoeV9wb3MgKyBudW1fbGluZXNfb3V0IDwgcC0+b3V0cHV0LT5oZWlnaHQpOworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhwLT5zY2FsZXJfYSk7CiAgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKICAgICAgIC8vIEZpbGwgaW4gdGhlIGFscGhhIHZhbHVlIChjb252ZXJ0ZWQgdG8gNCBiaXRzKS4KLSAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gcC0+c2NhbGVyX2EuZHN0W2ldID4+IDQ7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IHAtPnNjYWxlcl9hLT5kc3RbaV0gPj4gNDsKICAgICAgIGFscGhhX2RzdFsyICogaV0gPSAoYWxwaGFfZHN0WzIgKiBpXSAmIDB4ZjApIHwgYWxwaGFfdmFsdWU7CiAgICAgICBhbHBoYV9tYXNrICY9IGFscGhhX3ZhbHVlOwogICAgIH0KQEAgLTQ3MSwxNSArNDY5LDE3IEBACiAgIHJldHVybiBudW1fbGluZXNfb3V0OwogfQogCi1zdGF0aWMgaW50IEVtaXRSZXNjYWxlZEFscGhhUkdCKGNvbnN0IFZQOElvKiBjb25zdCBpbywgV2ViUERlY1BhcmFtcyogY29uc3QgcCkgeworc3RhdGljIGludCBFbWl0UmVzY2FsZWRBbHBoYVJHQihjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9udW1fb3V0X2xpbmVzKSB7CiAgIGlmIChpby0+YSAhPSBOVUxMKSB7Ci0gICAgV2ViUFJlc2NhbGVyKiBjb25zdCBzY2FsZXIgPSAmcC0+c2NhbGVyX2E7Ci0gICAgaW50IGogPSAwOwotICAgIGludCBwb3MgPSAwOwotICAgIHdoaWxlIChqIDwgaW8tPm1iX2gpIHsKLSAgICAgIGogKz0gV2ViUFJlc2NhbGVySW1wb3J0KHNjYWxlciwgaW8tPm1iX2ggLSBqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPmEgKyBqICogaW8tPndpZHRoLCBpby0+d2lkdGgpOwotICAgICAgcG9zICs9IHAtPmVtaXRfYWxwaGFfcm93KHAsIHBvcyk7CisgICAgV2ViUFJlc2NhbGVyKiBjb25zdCBzY2FsZXIgPSBwLT5zY2FsZXJfYTsKKyAgICBpbnQgbGluZXNfbGVmdCA9IGV4cGVjdGVkX251bV9vdXRfbGluZXM7CisgICAgY29uc3QgaW50IHlfZW5kID0gcC0+bGFzdF95ICsgbGluZXNfbGVmdDsKKyAgICB3aGlsZSAobGluZXNfbGVmdCA+IDApIHsKKyAgICAgIGNvbnN0IGludCByb3dfb2Zmc2V0ID0gc2NhbGVyLT5zcmNfeSAtIGlvLT5tYl95OworICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KHNjYWxlciwgaW8tPm1iX2ggKyBpby0+bWJfeSAtIHNjYWxlci0+c3JjX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW8tPmEgKyByb3dfb2Zmc2V0ICogaW8tPndpZHRoLCBpby0+d2lkdGgpOworICAgICAgbGluZXNfbGVmdCAtPSBwLT5lbWl0X2FscGhhX3JvdyhwLCB5X2VuZCAtIGxpbmVzX2xlZnQsIGxpbmVzX2xlZnQpOwogICAgIH0KICAgfQogICByZXR1cm4gMDsKQEAgLTQ5Miw5ICs0OTIsMTEgQEAKICAgY29uc3QgaW50IHV2X2luX3dpZHRoICA9IChpby0+bWJfdyArIDEpID4+IDE7CiAgIGNvbnN0IGludCB1dl9pbl9oZWlnaHQgPSAoaW8tPm1iX2ggKyAxKSA+PiAxOwogICBjb25zdCBzaXplX3Qgd29ya19zaXplID0gMiAqIG91dF93aWR0aDsgICAvLyBzY3JhdGNoIG1lbW9yeSBmb3Igb25lIHJlc2NhbGVyCi0gIGludDMyX3QqIHdvcms7ICAvLyByZXNjYWxlcnMgd29yayBhcmVhCisgIHJlc2NhbGVyX3QqIHdvcms7ICAvLyByZXNjYWxlcnMgd29yayBhcmVhCiAgIHVpbnQ4X3QqIHRtcDsgICAvLyB0bXAgc3RvcmFnZSBmb3Igc2NhbGVkIFlVVjQ0NCBzYW1wbGVzIGJlZm9yZSBSR0IgY29udmVyc2lvbgotICBzaXplX3QgdG1wX3NpemUxLCB0bXBfc2l6ZTI7CisgIHNpemVfdCB0bXBfc2l6ZTEsIHRtcF9zaXplMiwgdG90YWxfc2l6ZSwgcmVzY2FsZXJfc2l6ZTsKKyAgV2ViUFJlc2NhbGVyKiBzY2FsZXJzOworICBjb25zdCBpbnQgbnVtX3Jlc2NhbGVycyA9IGhhc19hbHBoYSA/IDQgOiAzOwogCiAgIHRtcF9zaXplMSA9IDMgKiB3b3JrX3NpemU7CiAgIHRtcF9zaXplMiA9IDMgKiBvdXRfd2lkdGg7CkBAIC01MDIsMzAgKzUwNCwzNyBAQAogICAgIHRtcF9zaXplMSArPSB3b3JrX3NpemU7CiAgICAgdG1wX3NpemUyICs9IG91dF93aWR0aDsKICAgfQotICBwLT5tZW1vcnkgPSBTYk1lbW9yeUNhbGxvYygxLCB0bXBfc2l6ZTEgKiBzaXplb2YoKndvcmspICsgdG1wX3NpemUyICogc2l6ZW9mKCp0bXApKTsKKyAgdG90YWxfc2l6ZSA9IHRtcF9zaXplMSAqIHNpemVvZigqd29yaykgKyB0bXBfc2l6ZTIgKiBzaXplb2YoKnRtcCk7CisgIHJlc2NhbGVyX3NpemUgPSBudW1fcmVzY2FsZXJzICogc2l6ZW9mKCpwLT5zY2FsZXJfeSkgKyBXRUJQX0FMSUdOX0NTVDsKKworICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCB0b3RhbF9zaXplICsgcmVzY2FsZXJfc2l6ZSk7CiAgIGlmIChwLT5tZW1vcnkgPT0gTlVMTCkgewogICAgIHJldHVybiAwOyAgIC8vIG1lbW9yeSBlcnJvcgogICB9Ci0gIHdvcmsgPSAoaW50MzJfdCopcC0+bWVtb3J5OworICB3b3JrID0gKHJlc2NhbGVyX3QqKXAtPm1lbW9yeTsKICAgdG1wID0gKHVpbnQ4X3QqKSh3b3JrICsgdG1wX3NpemUxKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3ksIGlvLT5tYl93LCBpby0+bWJfaCwKKworICBzY2FsZXJzID0gKFdlYlBSZXNjYWxlciopV0VCUF9BTElHTigoY29uc3QgdWludDhfdCopd29yayArIHRvdGFsX3NpemUpOworICBwLT5zY2FsZXJfeSA9ICZzY2FsZXJzWzBdOworICBwLT5zY2FsZXJfdSA9ICZzY2FsZXJzWzFdOworICBwLT5zY2FsZXJfdiA9ICZzY2FsZXJzWzJdOworICBwLT5zY2FsZXJfYSA9IGhhc19hbHBoYSA/ICZzY2FsZXJzWzNdIDogTlVMTDsKKworICBXZWJQUmVzY2FsZXJJbml0KHAtPnNjYWxlcl95LCBpby0+bWJfdywgaW8tPm1iX2gsCiAgICAgICAgICAgICAgICAgICAgdG1wICsgMCAqIG91dF93aWR0aCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCAxLAotICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBvdXRfd2lkdGgsIGlvLT5tYl9oLCBvdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgIHdvcmsgKyAwICogd29ya19zaXplKTsKLSAgV2ViUFJlc2NhbGVySW5pdCgmcC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCisgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX3UsIHV2X2luX3dpZHRoLCB1dl9pbl9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgdG1wICsgMSAqIG91dF93aWR0aCwgb3V0X3dpZHRoLCBvdXRfaGVpZ2h0LCAwLCAxLAotICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCAyICogb3V0X3dpZHRoLCBpby0+bWJfaCwgMiAqIG91dF9oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgd29yayArIDEgKiB3b3JrX3NpemUpOwotICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfdiwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKKyAgV2ViUFJlc2NhbGVySW5pdChwLT5zY2FsZXJfdiwgdXZfaW5fd2lkdGgsIHV2X2luX2hlaWdodCwKICAgICAgICAgICAgICAgICAgICB0bXAgKyAyICogb3V0X3dpZHRoLCBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIDEsCi0gICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIDIgKiBvdXRfd2lkdGgsIGlvLT5tYl9oLCAyICogb3V0X2hlaWdodCwKICAgICAgICAgICAgICAgICAgICB3b3JrICsgMiAqIHdvcmtfc2l6ZSk7CiAgIHAtPmVtaXQgPSBFbWl0UmVzY2FsZWRSR0I7CisgIFdlYlBJbml0WVVWNDQ0Q29udmVydGVycygpOwogCiAgIGlmIChoYXNfYWxwaGEpIHsKLSAgICBXZWJQUmVzY2FsZXJJbml0KCZwLT5zY2FsZXJfYSwgaW8tPm1iX3csIGlvLT5tYl9oLAorICAgIFdlYlBSZXNjYWxlckluaXQocC0+c2NhbGVyX2EsIGlvLT5tYl93LCBpby0+bWJfaCwKICAgICAgICAgICAgICAgICAgICAgIHRtcCArIDMgKiBvdXRfd2lkdGgsIG91dF93aWR0aCwgb3V0X2hlaWdodCwgMCwgMSwKLSAgICAgICAgICAgICAgICAgICAgIGlvLT5tYl93LCBvdXRfd2lkdGgsIGlvLT5tYl9oLCBvdXRfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgd29yayArIDMgKiB3b3JrX3NpemUpOwogICAgIHAtPmVtaXRfYWxwaGEgPSBFbWl0UmVzY2FsZWRBbHBoYVJHQjsKICAgICBpZiAocC0+b3V0cHV0LT5jb2xvcnNwYWNlID09IE1PREVfUkdCQV80NDQ0IHx8CkBAIC01MzQsMTAgKzU0MywxMyBAQAogICAgIH0gZWxzZSB7CiAgICAgICBwLT5lbWl0X2FscGhhX3JvdyA9IEV4cG9ydEFscGhhOwogICAgIH0KKyAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOwogICB9CiAgIHJldHVybiAxOwogfQogCisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX1NJWkUKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIERlZmF1bHQgY3VzdG9tIGZ1bmN0aW9ucwogCkBAIC01NTQsMTkgKzU2NiwyNiBAQAogICBpZiAoIVdlYlBJb0luaXRGcm9tT3B0aW9ucyhwLT5vcHRpb25zLCBpbywgaXNfYWxwaGEgPyBNT0RFX1lVViA6IE1PREVfWVVWQSkpIHsKICAgICByZXR1cm4gMDsKICAgfQotCisgIGlmIChpc19hbHBoYSAmJiBXZWJQSXNQcmVtdWx0aXBsaWVkTW9kZShjb2xvcnNwYWNlKSkgeworICAgIFdlYlBJbml0VXBzYW1wbGVycygpOworICB9CiAgIGlmIChpby0+dXNlX3NjYWxpbmcpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQogICAgIGNvbnN0IGludCBvayA9IGlzX3JnYiA/IEluaXRSR0JSZXNjYWxlcihpbywgcCkgOiBJbml0WVVWUmVzY2FsZXIoaW8sIHApOwogICAgIGlmICghb2spIHsKICAgICAgIHJldHVybiAwOyAgICAvLyBtZW1vcnkgZXJyb3IKICAgICB9CisjZWxzZQorICAgIHJldHVybiAwOyAgIC8vIHJlc2NhbGluZyBzdXBwb3J0IG5vdCBjb21waWxlZAorI2VuZGlmCiAgIH0gZWxzZSB7CiAgICAgaWYgKGlzX3JnYikgeworICAgICAgV2ViUEluaXRTYW1wbGVycygpOwogICAgICAgcC0+ZW1pdCA9IEVtaXRTYW1wbGVkUkdCOyAgIC8vIGRlZmF1bHQKLSNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCiAgICAgICBpZiAoaW8tPmZhbmN5X3Vwc2FtcGxpbmcpIHsKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCiAgICAgICAgIGNvbnN0IGludCB1dl93aWR0aCA9IChpby0+bWJfdyArIDEpID4+IDE7Ci0gICAgICAgIHAtPm1lbW9yeSA9IFNiTWVtb3J5QWxsb2NhdGUoaW8tPm1iX3cgKyAyICogdXZfd2lkdGgpOworICAgICAgICBwLT5tZW1vcnkgPSBXZWJQU2FmZU1hbGxvYygxVUxMLCAoc2l6ZV90KShpby0+bWJfdyArIDIgKiB1dl93aWR0aCkpOwogICAgICAgICBpZiAocC0+bWVtb3J5ID09IE5VTEwpIHsKICAgICAgICAgICByZXR1cm4gMDsgICAvLyBtZW1vcnkgZXJyb3IuCiAgICAgICAgIH0KQEAgLTU3NSwyNCArNTk0LDIzIEBACiAgICAgICAgIHAtPnRtcF92ID0gcC0+dG1wX3UgKyB1dl93aWR0aDsKICAgICAgICAgcC0+ZW1pdCA9IEVtaXRGYW5jeVJHQjsKICAgICAgICAgV2ViUEluaXRVcHNhbXBsZXJzKCk7Ci0gICAgICB9CiAjZW5kaWYKKyAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgcC0+ZW1pdCA9IEVtaXRZVVY7CiAgICAgfQogICAgIGlmIChpc19hbHBoYSkgeyAgLy8gbmVlZCB0cmFuc3BhcmVuY3kgb3V0cHV0Ci0gICAgICBpZiAoV2ViUElzUHJlbXVsdGlwbGllZE1vZGUoY29sb3JzcGFjZSkpIFdlYlBJbml0UHJlbXVsdGlwbHkoKTsKICAgICAgIHAtPmVtaXRfYWxwaGEgPQogICAgICAgICAgIChjb2xvcnNwYWNlID09IE1PREVfUkdCQV80NDQ0IHx8IGNvbG9yc3BhY2UgPT0gTU9ERV9yZ2JBXzQ0NDQpID8KICAgICAgICAgICAgICAgRW1pdEFscGhhUkdCQTQ0NDQKICAgICAgICAgICA6IGlzX3JnYiA/IEVtaXRBbHBoYVJHQgogICAgICAgICAgIDogRW1pdEFscGhhWVVWOworICAgICAgaWYgKGlzX3JnYikgeworICAgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmIChpc19yZ2IpIHsKLSAgICBWUDhZVVZJbml0KCk7Ci0gIH0KICAgcmV0dXJuIDE7CiB9CiAKQEAgLTYwMywxNCArNjIxLDE0IEBACiAgIGNvbnN0IGludCBtYl93ID0gaW8tPm1iX3c7CiAgIGNvbnN0IGludCBtYl9oID0gaW8tPm1iX2g7CiAgIGludCBudW1fbGluZXNfb3V0OwotICBTQl9EQ0hFQ0soIShpby0+bWJfeSAmIDEpKTsKKyAgYXNzZXJ0KCEoaW8tPm1iX3kgJiAxKSk7CiAKICAgaWYgKG1iX3cgPD0gMCB8fCBtYl9oIDw9IDApIHsKICAgICByZXR1cm4gMDsKICAgfQogICBudW1fbGluZXNfb3V0ID0gcC0+ZW1pdChpbywgcCk7Ci0gIGlmIChwLT5lbWl0X2FscGhhKSB7Ci0gICAgcC0+ZW1pdF9hbHBoYShpbywgcCk7CisgIGlmIChwLT5lbWl0X2FscGhhICE9IE5VTEwpIHsKKyAgICBwLT5lbWl0X2FscGhhKGlvLCBwLCBudW1fbGluZXNfb3V0KTsKICAgfQogICBwLT5sYXN0X3kgKz0gbnVtX2xpbmVzX291dDsKICAgcmV0dXJuIDE7CkBAIC02MjAsNyArNjM4LDcgQEAKIAogc3RhdGljIHZvaWQgQ3VzdG9tVGVhcmRvd24oY29uc3QgVlA4SW8qIGlvKSB7CiAgIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAgPSAoV2ViUERlY1BhcmFtcyopaW8tPm9wYXF1ZTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHAtPm1lbW9yeSk7CisgIFdlYlBTYWZlRnJlZShwLT5tZW1vcnkpOwogICBwLT5tZW1vcnkgPSBOVUxMOwogfQogCkBAIC02MzUsNyArNjUzLDMgQEAKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvcXVhbnQuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvcXVhbnRfZGVjLmMKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3F1YW50LmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvcXVhbnRfZGVjLmMKaW5kZXggYTRjYzY5My4uZjA3MjEyYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3F1YW50LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy9xdWFudF9kZWMuYwpAQCAtMTEsMTEgKzExLDcgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKIAogc3RhdGljIFdFQlBfSU5MSU5FIGludCBjbGlwKGludCB2LCBpbnQgTSkgewogICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IE0gPyBNIDogdjsKQEAgLTEwNCwxMiArMTAwLDExIEBACiAKICAgICAgIG0tPnV2X21hdF9bMF0gPSBrRGNUYWJsZVtjbGlwKHEgKyBkcXV2X2RjLCAxMTcpXTsKICAgICAgIG0tPnV2X21hdF9bMV0gPSBrQWNUYWJsZVtjbGlwKHEgKyBkcXV2X2FjLCAxMjcpXTsKKworICAgICAgbS0+dXZfcXVhbnRfID0gcSArIGRxdXZfYWM7ICAgLy8gZm9yIGRpdGhlcmluZyBzdHJlbmd0aCBldmFsdWF0aW9uCiAgICAgfQogICB9CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3RyZWUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdHJlZV9kZWMuYwpzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdHJlZS5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3RyZWVfZGVjLmMKaW5kZXggZGNiMzJmYy4uMWJkNGRmYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3RyZWUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3RyZWVfZGVjLmMKQEAgLTExLDE5ICsxMSwyMyBAQAogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpbmNsdWRlICJ2cDhpLmgiCi0KLSNkZWZpbmUgVVNFX0dFTkVSSUNfVFJFRQotCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL2RlYy92cDhpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIgogCi0jaWZkZWYgVVNFX0dFTkVSSUNfVFJFRQorI2lmICFkZWZpbmVkKFVTRV9HRU5FUklDX1RSRUUpCisjaWYgIWRlZmluZWQoX19hcm1fXykgJiYgIWRlZmluZWQoX01fQVJNKSAmJiAhZGVmaW5lZChfX2FhcmNoNjRfXykKKy8vIHVzaW5nIGEgdGFibGUgaXMgfjEtMiUgc2xvd2VyIG9uIEFSTS4gUHJlZmVyIHRoZSBjb2RlZC10cmVlIGFwcHJvYWNoIHRoZW4uCisjZGVmaW5lIFVTRV9HRU5FUklDX1RSRUUgMSAgIC8vIEFMVEVSTkFURV9DT0RFCisjZWxzZQorI2RlZmluZSBVU0VfR0VORVJJQ19UUkVFIDAKKyNlbmRpZgorI2VuZGlmICAvLyBVU0VfR0VORVJJQ19UUkVFCisKKyNpZiAoVVNFX0dFTkVSSUNfVFJFRSA9PSAxKQogc3RhdGljIGNvbnN0IGludDhfdCBrWU1vZGVzSW50cmE0WzE4XSA9IHsKICAgLUJfRENfUFJFRCwgMSwKICAgICAtQl9UTV9QUkVELCAyLApAQCAtMzcsNjEgKzQxLDEyIEBACiB9OwogI2VuZGlmCiAKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi0KLS8vIGludGVyIHByZWRpY3Rpb24gbW9kZXMKLWVudW0gewotICBMRUZUNCA9IDAsIEFCT1ZFNCA9IDEsIFpFUk80ID0gMiwgTkVXNCA9IDMsCi0gIE5FQVJFU1RNViwgTkVBUk1WLCBaRVJPTVYsIE5FV01WLCBTUExJVE1WIH07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga1lNb2Rlc0ludGVyWzhdID0gewotICAtRENfUFJFRCwgMSwKLSAgICAyLCAzLAotICAgICAgLVZfUFJFRCwgLUhfUFJFRCwKLSAgICAgIC1UTV9QUkVELCAtQl9QUkVECi19OwotCi1zdGF0aWMgY29uc3QgaW50OF90IGtNQlNwbGl0WzZdID0gewotICAtMywgMSwKLSAgICAtMiwgMiwKLSAgICAgIC0wLCAtMQotfTsKLQotc3RhdGljIGNvbnN0IGludDhfdCBrTVZSZWZbOF0gPSB7Ci0gIC1aRVJPTVYsIDEsCi0gICAgLU5FQVJFU1RNViwgMiwKLSAgICAgIC1ORUFSTVYsIDMsCi0gICAgICAgIC1ORVdNViwgLVNQTElUTVYKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQ4X3Qga01WUmVmNFs2XSA9IHsKLSAgLUxFRlQ0LCAxLAotICAgIC1BQk9WRTQsIDIsCi0gICAgICAtWkVSTzQsIC1ORVc0Ci19OwotI2VuZGlmCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBEZWZhdWx0IHByb2JhYmlsaXRpZXMKIAotLy8gSW50ZXIKLSNpZm5kZWYgT05MWV9LRVlGUkFNRV9DT0RFCi1zdGF0aWMgY29uc3QgdWludDhfdCBrWU1vZGVQcm9iYUludGVyMFs0XSA9IHsgMTEyLCA4NiwgMTQwLCAzNyB9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1VWTW9kZVByb2JhSW50ZXIwWzNdID0geyAxNjIsIDEwMSwgMjA0IH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrTVZQcm9iYTBbMl1bTlVNX01WX1BST0JBU10gPSB7Ci0gIHsgMTYyLCAxMjgsIDIyNSwgMTQ2LCAxNzIsIDE0NywgMjE0LCAgMzksCi0gICAgMTU2LCAxMjgsIDEyOSwgMTMyLCAgNzUsIDE0NSwgMTc4LCAyMDYsCi0gICAgMjM5LCAyNTQsIDI1NCB9LAotICB7IDE2NCwgMTI4LCAyMDQsIDE3MCwgMTE5LCAyMzUsIDE0MCwgMjMwLAotICAgIDIyOCwgMTI4LCAxMzAsIDEzMCwgIDc0LCAxNDgsIDE4MCwgMjAzLAotICAgIDIzNiwgMjU0LCAyNTQgfQotfTsKLSNlbmRpZgotCiAvLyBQYXJhZ3JhcGggMTMuNQogc3RhdGljIGNvbnN0IHVpbnQ4X3QKICAgQ29lZmZzUHJvYmEwW05VTV9UWVBFU11bTlVNX0JBTkRTXVtOVU1fQ1RYXVtOVU1fUFJPQkFTXSA9IHsKLSAgLy8gZ2VuZXJlYXRlZCB1c2luZyB2cDhfZGVmYXVsdF9jb2VmX3Byb2JzKCkgaW4gZW50cm9weS5jOjEyOQogICB7IHsgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAogICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9LAogICAgICAgeyAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCB9CkBAIC0zMzEsNDEgKzI4Niw1MSBAQAogfTsKIAogdm9pZCBWUDhSZXNldFByb2JhKFZQOFByb2JhKiBjb25zdCBwcm9iYSkgewotICBTYk1lbW9yeVNldChwcm9iYS0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmEtPnNlZ21lbnRzXykpOwotICBTYk1lbW9yeUNvcHkocHJvYmEtPmNvZWZmc18sIENvZWZmc1Byb2JhMCwgc2l6ZW9mKENvZWZmc1Byb2JhMCkpOwotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLSAgU2JNZW1vcnlDb3B5KHByb2JhLT5tdl8sIGtNVlByb2JhMCwgc2l6ZW9mKGtNVlByb2JhMCkpOwotICBTYk1lbW9yeUNvcHkocHJvYmEtPnltb2RlXywga1lNb2RlUHJvYmFJbnRlcjAsIHNpemVvZihrWU1vZGVQcm9iYUludGVyMCkpOwotICBTYk1lbW9yeUNvcHkocHJvYmEtPnV2bW9kZV8sIGtVVk1vZGVQcm9iYUludGVyMCwgc2l6ZW9mKGtVVk1vZGVQcm9iYUludGVyMCkpOwotI2VuZGlmCisgIG1lbXNldChwcm9iYS0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmEtPnNlZ21lbnRzXykpOworICAvLyBwcm9iYS0+YmFuZHNfW11bXSBpcyBpbml0aWFsaXplZCBsYXRlcgogfQogCi12b2lkIFZQOFBhcnNlSW50cmFNb2RlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsICBWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKLSAgdWludDhfdCogY29uc3QgdG9wID0gZGVjLT5pbnRyYV90XyArIDQgKiBkZWMtPm1iX3hfOworc3RhdGljIHZvaWQgUGFyc2VJbnRyYU1vZGUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYywgaW50IG1iX3gpIHsKKyAgdWludDhfdCogY29uc3QgdG9wID0gZGVjLT5pbnRyYV90XyArIDQgKiBtYl94OwogICB1aW50OF90KiBjb25zdCBsZWZ0ID0gZGVjLT5pbnRyYV9sXzsKLSAgLy8gSGFyZGNvZGVkIDE2eDE2IGludHJhLW1vZGUgZGVjaXNpb24gdHJlZS4KLSAgZGVjLT5pc19pNHg0XyA9ICFWUDhHZXRCaXQoYnIsIDE0NSk7ICAgLy8gZGVjaWRlIGZvciBCX1BSRUQgZmlyc3QKLSAgaWYgKCFkZWMtPmlzX2k0eDRfKSB7CisgIFZQOE1CRGF0YSogY29uc3QgYmxvY2sgPSBkZWMtPm1iX2RhdGFfICsgbWJfeDsKKworICAvLyBOb3RlOiB3ZSBkb24ndCBzYXZlIHNlZ21lbnQgbWFwICh5ZXQpLCBhcyB3ZSBkb24ndCBleHBlY3QKKyAgLy8gdG8gZGVjb2RlIG1vcmUgdGhhbiAxIGtleWZyYW1lLgorICBpZiAoZGVjLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIHsKKyAgICAvLyBIYXJkY29kZWQgdHJlZSBwYXJzaW5nCisgICAgYmxvY2stPnNlZ21lbnRfID0gIVZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzBdKQorICAgICAgICAgICAgICAgICAgICA/IFZQOEdldEJpdChiciwgZGVjLT5wcm9iYV8uc2VnbWVudHNfWzFdKQorICAgICAgICAgICAgICAgICAgICA6IDIgKyBWUDhHZXRCaXQoYnIsIGRlYy0+cHJvYmFfLnNlZ21lbnRzX1syXSk7CisgIH0gZWxzZSB7CisgICAgYmxvY2stPnNlZ21lbnRfID0gMDsgIC8vIGRlZmF1bHQgZm9yIGludHJhCisgIH0KKyAgaWYgKGRlYy0+dXNlX3NraXBfcHJvYmFfKSBibG9jay0+c2tpcF8gPSBWUDhHZXRCaXQoYnIsIGRlYy0+c2tpcF9wXyk7CisKKyAgYmxvY2stPmlzX2k0eDRfID0gIVZQOEdldEJpdChiciwgMTQ1KTsgICAvLyBkZWNpZGUgZm9yIEJfUFJFRCBmaXJzdAorICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeworICAgIC8vIEhhcmRjb2RlZCAxNngxNiBpbnRyYS1tb2RlIGRlY2lzaW9uIHRyZWUuCiAgICAgY29uc3QgaW50IHltb2RlID0KICAgICAgICAgVlA4R2V0Qml0KGJyLCAxNTYpID8gKFZQOEdldEJpdChiciwgMTI4KSA/IFRNX1BSRUQgOiBIX1BSRUQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChWUDhHZXRCaXQoYnIsIDE2MykgPyBWX1BSRUQgOiBEQ19QUkVEKTsKLSAgICBkZWMtPmltb2Rlc19bMF0gPSB5bW9kZTsKLSAgICBTYk1lbW9yeVNldCh0b3AsIHltb2RlLCA0ICogc2l6ZW9mKHRvcFswXSkpOwotICAgIFNiTWVtb3J5U2V0KGxlZnQsIHltb2RlLCA0ICogc2l6ZW9mKGxlZnRbMF0pKTsKKyAgICBibG9jay0+aW1vZGVzX1swXSA9IHltb2RlOworICAgIG1lbXNldCh0b3AsIHltb2RlLCA0ICogc2l6ZW9mKCp0b3ApKTsKKyAgICBtZW1zZXQobGVmdCwgeW1vZGUsIDQgKiBzaXplb2YoKmxlZnQpKTsKICAgfSBlbHNlIHsKLSAgICB1aW50OF90KiBtb2RlcyA9IGRlYy0+aW1vZGVzXzsKKyAgICB1aW50OF90KiBtb2RlcyA9IGJsb2NrLT5pbW9kZXNfOwogICAgIGludCB5OwogICAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKICAgICAgIGludCB5bW9kZSA9IGxlZnRbeV07CiAgICAgICBpbnQgeDsKICAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYiA9IGtCTW9kZXNQcm9iYVt0b3BbeF1dW3ltb2RlXTsKLSNpZmRlZiBVU0VfR0VORVJJQ19UUkVFCisjaWYgKFVTRV9HRU5FUklDX1RSRUUgPT0gMSkKICAgICAgICAgLy8gR2VuZXJpYyB0cmVlLXBhcnNpbmcKLSAgICAgICAgaW50IGkgPSAwOwotICAgICAgICBkbyB7CisgICAgICAgIGludCBpID0ga1lNb2Rlc0ludHJhNFtWUDhHZXRCaXQoYnIsIHByb2JbMF0pXTsKKyAgICAgICAgd2hpbGUgKGkgPiAwKSB7CiAgICAgICAgICAgaSA9IGtZTW9kZXNJbnRyYTRbMiAqIGkgKyBWUDhHZXRCaXQoYnIsIHByb2JbaV0pXTsKLSAgICAgICAgfSB3aGlsZSAoaSA+IDApOworICAgICAgICB9CiAgICAgICAgIHltb2RlID0gLWk7CiAjZWxzZQogICAgICAgICAvLyBIYXJkY29kZWQgdHJlZSBwYXJzaW5nCkBAIC0zNzgsMTcgKzM0MywyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbNl0pID8gQl9MRF9QUkVEIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgKCFWUDhHZXRCaXQoYnIsIHByb2JbN10pID8gQl9WTF9QUkVEIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIVZQOEdldEJpdChiciwgcHJvYls4XSkgPyBCX0hEX1BSRUQgOiBCX0hVX1BSRUQpKSk7Ci0jZW5kaWYgICAgLy8gVVNFX0dFTkVSSUNfVFJFRQorI2VuZGlmICAvLyBVU0VfR0VORVJJQ19UUkVFCiAgICAgICAgIHRvcFt4XSA9IHltb2RlOwotICAgICAgICAqbW9kZXMrKyA9IHltb2RlOwogICAgICAgfQorICAgICAgbWVtY3B5KG1vZGVzLCB0b3AsIDQgKiBzaXplb2YoKnRvcCkpOworICAgICAgbW9kZXMgKz0gNDsKICAgICAgIGxlZnRbeV0gPSB5bW9kZTsKICAgICB9CiAgIH0KICAgLy8gSGFyZGNvZGVkIFVWTW9kZSBkZWNpc2lvbiB0cmVlCi0gIGRlYy0+dXZtb2RlXyA9ICFWUDhHZXRCaXQoYnIsIDE0MikgPyBEQ19QUkVECi0gICAgICAgICAgICAgICA6ICFWUDhHZXRCaXQoYnIsIDExNCkgPyBWX1BSRUQKLSAgICAgICAgICAgICAgIDogVlA4R2V0Qml0KGJyLCAxODMpID8gVE1fUFJFRCA6IEhfUFJFRDsKKyAgYmxvY2stPnV2bW9kZV8gPSAhVlA4R2V0Qml0KGJyLCAxNDIpID8gRENfUFJFRAorICAgICAgICAgICAgICAgICA6ICFWUDhHZXRCaXQoYnIsIDExNCkgPyBWX1BSRUQKKyAgICAgICAgICAgICAgICAgOiBWUDhHZXRCaXQoYnIsIDE4MykgPyBUTV9QUkVEIDogSF9QUkVEOworfQorCitpbnQgVlA4UGFyc2VJbnRyYU1vZGVSb3coVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBtYl94OworICBmb3IgKG1iX3ggPSAwOyBtYl94IDwgZGVjLT5tYl93XzsgKyttYl94KSB7CisgICAgUGFyc2VJbnRyYU1vZGUoYnIsIGRlYywgbWJfeCk7CisgIH0KKyAgcmV0dXJuICFkZWMtPmJyXy5lb2ZfOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTMwLDE4ICs1MDQsMTMgQEAKICAgfQogfTsKIAotI2lmbmRlZiBPTkxZX0tFWUZSQU1FX0NPREUKLXN0YXRpYyBjb25zdCB1aW50OF90IE1WVXBkYXRlUHJvYmFbMl1bTlVNX01WX1BST0JBU10gPSB7Ci0gIHsgMjM3LCAyNDYsIDI1MywgMjUzLCAyNTQsIDI1NCwgMjU0LCAyNTQsCi0gICAgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjUwLCAyNTAsCi0gICAgMjUyLCAyNTQsIDI1NCB9LAotICB7IDIzMSwgMjQzLCAyNDUsIDI1MywgMjU0LCAyNTQsIDI1NCwgMjU0LAotICAgIDI1NCwgMjU0LCAyNTQsIDI1NCwgMjU0LCAyNTQsIDI1MSwgMjUxLAotICAgIDI1NCwgMjU0LCAyNTQgfQotfTsKLSNlbmRpZgotCiAvLyBQYXJhZ3JhcGggOS45CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCYW5kc1sxNiArIDFdID0geworICAwLCAxLCAyLCAzLCA2LCA0LCA1LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA2LCA3LAorICAwICAvLyBleHRyYSBlbnRyeSBhcyBzZW50aW5lbAorfTsKKwogdm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYykgewogICBWUDhQcm9iYSogY29uc3QgcHJvYmEgPSAmZGVjLT5wcm9iYV87CiAgIGludCB0LCBiLCBjLCBwOwpAQCAtNTQ5LDQ3ICs1MTgsMTkgQEAKICAgICBmb3IgKGIgPSAwOyBiIDwgTlVNX0JBTkRTOyArK2IpIHsKICAgICAgIGZvciAoYyA9IDA7IGMgPCBOVU1fQ1RYOyArK2MpIHsKICAgICAgICAgZm9yIChwID0gMDsgcCA8IE5VTV9QUk9CQVM7ICsrcCkgewotICAgICAgICAgIGlmIChWUDhHZXRCaXQoYnIsIENvZWZmc1VwZGF0ZVByb2JhW3RdW2JdW2NdW3BdKSkgewotICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBWUDhHZXRWYWx1ZShiciwgOCk7Ci0gICAgICAgICAgfQorICAgICAgICAgIGNvbnN0IGludCB2ID0gVlA4R2V0Qml0KGJyLCBDb2VmZnNVcGRhdGVQcm9iYVt0XVtiXVtjXVtwXSkgPworICAgICAgICAgICAgICAgICAgICAgICAgVlA4R2V0VmFsdWUoYnIsIDgpIDogQ29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOworICAgICAgICAgIHByb2JhLT5iYW5kc19bdF1bYl0ucHJvYmFzX1tjXVtwXSA9IHY7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CisgICAgZm9yIChiID0gMDsgYiA8IDE2ICsgMTsgKytiKSB7CisgICAgICBwcm9iYS0+YmFuZHNfcHRyX1t0XVtiXSA9ICZwcm9iYS0+YmFuZHNfW3RdW2tCYW5kc1tiXV07CisgICAgfQogICB9CiAgIGRlYy0+dXNlX3NraXBfcHJvYmFfID0gVlA4R2V0KGJyKTsKICAgaWYgKGRlYy0+dXNlX3NraXBfcHJvYmFfKSB7CiAgICAgZGVjLT5za2lwX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwogICB9Ci0jaWZuZGVmIE9OTFlfS0VZRlJBTUVfQ09ERQotICBpZiAoIWRlYy0+ZnJtX2hkcl8ua2V5X2ZyYW1lXykgewotICAgIGludCBpOwotICAgIGRlYy0+aW50cmFfcF8gPSBWUDhHZXRWYWx1ZShiciwgOCk7Ci0gICAgZGVjLT5sYXN0X3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgIGRlYy0+Z29sZGVuX3BfID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgIGlmIChWUDhHZXQoYnIpKSB7ICAgLy8gdXBkYXRlIHktbW9kZQotICAgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgICAgICBwcm9iYS0+eW1vZGVfW2ldID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSB1di1tb2RlCi0gICAgICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgICAgIHByb2JhLT51dm1vZGVfW2ldID0gVlA4R2V0VmFsdWUoYnIsIDgpOwotICAgICAgfQotICAgIH0KLSAgICAvLyB1cGRhdGUgTVYKLSAgICBmb3IgKGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICBpbnQgazsKLSAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fTVZfUFJPQkFTOyArK2spIHsKLSAgICAgICAgaWYgKFZQOEdldEJpdChiciwgTVZVcGRhdGVQcm9iYVtpXVtrXSkpIHsKLSAgICAgICAgICBjb25zdCBpbnQgdiA9IFZQOEdldFZhbHVlKGJyLCA3KTsKLSAgICAgICAgICBwcm9iYS0+bXZfW2ldW2tdID0gdiA/IHYgPDwgMSA6IDE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSNlbmRpZgogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY0NzZmYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4X2RlYy5jCkBAIC0wLDAgKzEsNzI3IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gbWFpbiBlbnRyeSBmb3IgdGhlIGRlY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZGVjL2FscGhhaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpIHsKKyAgcmV0dXJuIChERUNfTUFKX1ZFUlNJT04gPDwgMTYpIHwgKERFQ19NSU5fVkVSU0lPTiA8PCA4KSB8IERFQ19SRVZfVkVSU0lPTjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpZ25hdHVyZSBhbmQgcG9pbnRlci10by1mdW5jdGlvbiBmb3IgR2V0Q29lZmZzKCkgdmFyaWFudHMgYmVsb3cuCisKK3R5cGVkZWYgaW50ICgqR2V0Q29lZmZzRnVuYykoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4QmFuZFByb2JhcyogY29uc3QgcHJvYltdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KTsKK3N0YXRpYyB2b2xhdGlsZSBHZXRDb2VmZnNGdW5jIEdldENvZWZmcyA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIEluaXRHZXRDb2VmZnModm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhEZWNvZGVyCisKK3N0YXRpYyB2b2lkIFNldE9rKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICBkZWMtPmVycm9yX21zZ18gPSAiT0siOworfQorCitpbnQgVlA4SW5pdElvSW50ZXJuYWwoVlA4SW8qIGNvbnN0IGlvLCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVDT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgIC8vIG1pc21hdGNoIGVycm9yCisgIH0KKyAgaWYgKGlvICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoaW8sIDAsIHNpemVvZigqaW8pKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworVlA4RGVjb2RlciogVlA4TmV3KHZvaWQpIHsKKyAgVlA4RGVjb2RlciogY29uc3QgZGVjID0gKFZQOERlY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZGVjKSk7CisgIGlmIChkZWMgIT0gTlVMTCkgeworICAgIFNldE9rKGRlYyk7CisgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5Jbml0KCZkZWMtPndvcmtlcl8pOworICAgIGRlYy0+cmVhZHlfID0gMDsKKyAgICBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfID0gMDsKKyAgICBJbml0R2V0Q29lZmZzKCk7CisgIH0KKyAgcmV0dXJuIGRlYzsKK30KKworVlA4U3RhdHVzQ29kZSBWUDhTdGF0dXMoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIGlmICghZGVjKSByZXR1cm4gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICByZXR1cm4gZGVjLT5zdGF0dXNfOworfQorCitjb25zdCBjaGFyKiBWUDhTdGF0dXNNZXNzYWdlKFZQOERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAibm8gb2JqZWN0IjsKKyAgaWYgKCFkZWMtPmVycm9yX21zZ18pIHJldHVybiAiT0siOworICByZXR1cm4gZGVjLT5lcnJvcl9tc2dfOworfQorCit2b2lkIFZQOERlbGV0ZShWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgVlA4Q2xlYXIoZGVjKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCitpbnQgVlA4U2V0RXJyb3IoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgIFZQOFN0YXR1c0NvZGUgZXJyb3IsIGNvbnN0IGNoYXIqIGNvbnN0IG1zZykgeworICAvLyBUaGUgb2xkZXN0IGVycm9yIHJlcG9ydGVkIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmV3IG9uZS4KKyAgaWYgKGRlYy0+c3RhdHVzXyA9PSBWUDhfU1RBVFVTX09LKSB7CisgICAgZGVjLT5zdGF0dXNfID0gZXJyb3I7CisgICAgZGVjLT5lcnJvcl9tc2dfID0gbXNnOworICAgIGRlYy0+cmVhZHlfID0gMDsKKyAgfQorICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOENoZWNrU2lnbmF0dXJlKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgcmV0dXJuIChkYXRhX3NpemUgPj0gMyAmJgorICAgICAgICAgIGRhdGFbMF0gPT0gMHg5ZCAmJiBkYXRhWzFdID09IDB4MDEgJiYgZGF0YVsyXSA9PSAweDJhKTsKK30KKworaW50IFZQOEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgc2l6ZV90IGNodW5rX3NpemUsCisgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgeworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOF9GUkFNRV9IRUFERVJfU0laRSkgeworICAgIHJldHVybiAwOyAgICAgICAgIC8vIG5vdCBlbm91Z2ggZGF0YQorICB9CisgIC8vIGNoZWNrIHNpZ25hdHVyZQorICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGRhdGEgKyAzLCBkYXRhX3NpemUgLSAzKSkgeworICAgIHJldHVybiAwOyAgICAgICAgIC8vIFdyb25nIHNpZ25hdHVyZS4KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50MzJfdCBiaXRzID0gZGF0YVswXSB8IChkYXRhWzFdIDw8IDgpIHwgKGRhdGFbMl0gPDwgMTYpOworICAgIGNvbnN0IGludCBrZXlfZnJhbWUgPSAhKGJpdHMgJiAxKTsKKyAgICBjb25zdCBpbnQgdyA9ICgoZGF0YVs3XSA8PCA4KSB8IGRhdGFbNl0pICYgMHgzZmZmOworICAgIGNvbnN0IGludCBoID0gKChkYXRhWzldIDw8IDgpIHwgZGF0YVs4XSkgJiAweDNmZmY7CisKKyAgICBpZiAoIWtleV9mcmFtZSkgeyAgIC8vIE5vdCBhIGtleWZyYW1lLgorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYgKCgoYml0cyA+PiAxKSAmIDcpID4gMykgeworICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gdW5rbm93biBwcm9maWxlCisgICAgfQorICAgIGlmICghKChiaXRzID4+IDQpICYgMSkpIHsKKyAgICAgIHJldHVybiAwOyAgICAgICAgIC8vIGZpcnN0IGZyYW1lIGlzIGludmlzaWJsZSEKKyAgICB9CisgICAgaWYgKCgoYml0cyA+PiA1KSkgPj0gY2h1bmtfc2l6ZSkgeyAgLy8gcGFydGl0aW9uX2xlbmd0aAorICAgICAgcmV0dXJuIDA7ICAgICAgICAgLy8gaW5jb25zaXN0ZW50IHNpemUgaW5mb3JtYXRpb24uCisgICAgfQorICAgIGlmICh3ID09IDAgfHwgaCA9PSAwKSB7CisgICAgICByZXR1cm4gMDsgICAgICAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGJvdGggd2lkdGggYW5kIGhlaWdodCB0byBiZSB6ZXJvLgorICAgIH0KKworICAgIGlmICh3aWR0aCkgeworICAgICAgKndpZHRoID0gdzsKKyAgICB9CisgICAgaWYgKGhlaWdodCkgeworICAgICAgKmhlaWdodCA9IGg7CisgICAgfQorCisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlciBwYXJzaW5nCisKK3N0YXRpYyB2b2lkIFJlc2V0U2VnbWVudEhlYWRlcihWUDhTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIpIHsKKyAgYXNzZXJ0KGhkciAhPSBOVUxMKTsKKyAgaGRyLT51c2Vfc2VnbWVudF8gPSAwOworICBoZHItPnVwZGF0ZV9tYXBfID0gMDsKKyAgaGRyLT5hYnNvbHV0ZV9kZWx0YV8gPSAxOworICBtZW1zZXQoaGRyLT5xdWFudGl6ZXJfLCAwLCBzaXplb2YoaGRyLT5xdWFudGl6ZXJfKSk7CisgIG1lbXNldChoZHItPmZpbHRlcl9zdHJlbmd0aF8sIDAsIHNpemVvZihoZHItPmZpbHRlcl9zdHJlbmd0aF8pKTsKK30KKworLy8gUGFyYWdyYXBoIDkuMworc3RhdGljIGludCBQYXJzZVNlZ21lbnRIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFNlZ21lbnRIZWFkZXIqIGhkciwgVlA4UHJvYmEqIHByb2JhKSB7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KGhkciAhPSBOVUxMKTsKKyAgaGRyLT51c2Vfc2VnbWVudF8gPSBWUDhHZXQoYnIpOworICBpZiAoaGRyLT51c2Vfc2VnbWVudF8pIHsKKyAgICBoZHItPnVwZGF0ZV9tYXBfID0gVlA4R2V0KGJyKTsKKyAgICBpZiAoVlA4R2V0KGJyKSkgeyAgIC8vIHVwZGF0ZSBkYXRhCisgICAgICBpbnQgczsKKyAgICAgIGhkci0+YWJzb2x1dGVfZGVsdGFfID0gVlA4R2V0KGJyKTsKKyAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgICBoZHItPnF1YW50aXplcl9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDcpIDogMDsKKyAgICAgIH0KKyAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgeworICAgICAgICBoZHItPmZpbHRlcl9zdHJlbmd0aF9bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpIDogMDsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhkci0+dXBkYXRlX21hcF8pIHsKKyAgICAgIGludCBzOworICAgICAgZm9yIChzID0gMDsgcyA8IE1CX0ZFQVRVUkVfVFJFRV9QUk9CUzsgKytzKSB7CisgICAgICAgIHByb2JhLT5zZWdtZW50c19bc10gPSBWUDhHZXQoYnIpID8gVlA4R2V0VmFsdWUoYnIsIDgpIDogMjU1dTsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaGRyLT51cGRhdGVfbWFwXyA9IDA7CisgIH0KKyAgcmV0dXJuICFici0+ZW9mXzsKK30KKworLy8gUGFyYWdyYXBoIDkuNQorLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIFZQOF9TVEFUVVNfU1VTUEVOREVEIGlmIHdlIGRvbid0IGhhdmUgYWxsIHRoZQorLy8gbmVjZXNzYXJ5IGRhdGEgaW4gJ2J1ZicuCisvLyBUaGlzIGNhc2UgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGVycm9yIChmb3IgaW5jcmVtZW50YWwgZGVjb2RpbmcpLgorLy8gU3RpbGwsIG5vIGJpdHJlYWRlciBpcyBldmVyIGluaXRpYWxpemVkIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gcmVhZAorLy8gdW5hdmFpbGFibGUgbWVtb3J5LgorLy8gSWYgd2UgZG9uJ3QgZXZlbiBoYXZlIHRoZSBwYXJ0aXRpb25zJyBzaXplcywgdGhhbiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQQorLy8gaXMgcmV0dXJuZWQsIGFuZCB0aGlzIGlzIGFuIHVucmVjb3ZlcmFibGUgZXJyb3IuCisvLyBJZiB0aGUgcGFydGl0aW9ucyB3ZXJlIHBvc2l0aW9uZWQgb2ssIFZQOF9TVEFUVVNfT0sgaXMgcmV0dXJuZWQuCitzdGF0aWMgVlA4U3RhdHVzQ29kZSBQYXJzZVBhcnRpdGlvbnMoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgVlA4Qml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgY29uc3QgdWludDhfdCogc3ogPSBidWY7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmQgPSBidWYgKyBzaXplOworICBjb25zdCB1aW50OF90KiBwYXJ0X3N0YXJ0OworICBzaXplX3Qgc2l6ZV9sZWZ0ID0gc2l6ZTsKKyAgc2l6ZV90IGxhc3RfcGFydDsKKyAgc2l6ZV90IHA7CisKKyAgZGVjLT5udW1fcGFydHNfbWludXNfb25lXyA9ICgxIDw8IFZQOEdldFZhbHVlKGJyLCAyKSkgLSAxOworICBsYXN0X3BhcnQgPSBkZWMtPm51bV9wYXJ0c19taW51c19vbmVfOworICBpZiAoc2l6ZSA8IDMgKiBsYXN0X3BhcnQpIHsKKyAgICAvLyB3ZSBjYW4ndCBldmVuIHJlYWQgdGhlIHNpemVzIHdpdGggc3pbXSEgVGhhdCdzIGEgZmFpbHVyZS4KKyAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgIH0KKyAgcGFydF9zdGFydCA9IGJ1ZiArIGxhc3RfcGFydCAqIDM7CisgIHNpemVfbGVmdCAtPSBsYXN0X3BhcnQgKiAzOworICBmb3IgKHAgPSAwOyBwIDwgbGFzdF9wYXJ0OyArK3ApIHsKKyAgICBzaXplX3QgcHNpemUgPSBzelswXSB8IChzelsxXSA8PCA4KSB8IChzelsyXSA8PCAxNik7CisgICAgaWYgKHBzaXplID4gc2l6ZV9sZWZ0KSBwc2l6ZSA9IHNpemVfbGVmdDsKKyAgICBWUDhJbml0Qml0UmVhZGVyKGRlYy0+cGFydHNfICsgcCwgcGFydF9zdGFydCwgcHNpemUpOworICAgIHBhcnRfc3RhcnQgKz0gcHNpemU7CisgICAgc2l6ZV9sZWZ0IC09IHBzaXplOworICAgIHN6ICs9IDM7CisgIH0KKyAgVlA4SW5pdEJpdFJlYWRlcihkZWMtPnBhcnRzXyArIGxhc3RfcGFydCwgcGFydF9zdGFydCwgc2l6ZV9sZWZ0KTsKKyAgcmV0dXJuIChwYXJ0X3N0YXJ0IDwgYnVmX2VuZCkgPyBWUDhfU1RBVFVTX09LIDoKKyAgICAgICAgICAgVlA4X1NUQVRVU19TVVNQRU5ERUQ7ICAgLy8gSW5pdCBpcyBvaywgYnV0IHRoZXJlJ3Mgbm90IGVub3VnaCBkYXRhCit9CisKKy8vIFBhcmFncmFwaCA5LjQKK3N0YXRpYyBpbnQgUGFyc2VGaWx0ZXJIZWFkZXIoVlA4Qml0UmVhZGVyKiBiciwgVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmRlYy0+ZmlsdGVyX2hkcl87CisgIGhkci0+c2ltcGxlXyAgICA9IFZQOEdldChicik7CisgIGhkci0+bGV2ZWxfICAgICA9IFZQOEdldFZhbHVlKGJyLCA2KTsKKyAgaGRyLT5zaGFycG5lc3NfID0gVlA4R2V0VmFsdWUoYnIsIDMpOworICBoZHItPnVzZV9sZl9kZWx0YV8gPSBWUDhHZXQoYnIpOworICBpZiAoaGRyLT51c2VfbGZfZGVsdGFfKSB7CisgICAgaWYgKFZQOEdldChicikpIHsgICAvLyB1cGRhdGUgbGYtZGVsdGE/CisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fUkVGX0xGX0RFTFRBUzsgKytpKSB7CisgICAgICAgIGlmIChWUDhHZXQoYnIpKSB7CisgICAgICAgICAgaGRyLT5yZWZfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOworICAgICAgICB9CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX01PREVfTEZfREVMVEFTOyArK2kpIHsKKyAgICAgICAgaWYgKFZQOEdldChicikpIHsKKyAgICAgICAgICBoZHItPm1vZGVfbGZfZGVsdGFfW2ldID0gVlA4R2V0U2lnbmVkVmFsdWUoYnIsIDYpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGRlYy0+ZmlsdGVyX3R5cGVfID0gKGhkci0+bGV2ZWxfID09IDApID8gMCA6IGhkci0+c2ltcGxlXyA/IDEgOiAyOworICByZXR1cm4gIWJyLT5lb2ZfOworfQorCisvLyBUb3Btb3N0IGNhbGwKK2ludCBWUDhHZXRIZWFkZXJzKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGJ1ZjsKKyAgc2l6ZV90IGJ1Zl9zaXplOworICBWUDhGcmFtZUhlYWRlciogZnJtX2hkcjsKKyAgVlA4UGljdHVyZUhlYWRlciogcGljX2hkcjsKKyAgVlA4Qml0UmVhZGVyKiBicjsKKyAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CisKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgU2V0T2soZGVjKTsKKyAgaWYgKGlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJudWxsIFZQOElvIHBhc3NlZCB0byBWUDhHZXRIZWFkZXJzKCkiKTsKKyAgfQorICBidWYgPSBpby0+ZGF0YTsKKyAgYnVmX3NpemUgPSBpby0+ZGF0YV9zaXplOworICBpZiAoYnVmX3NpemUgPCA0KSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICJUcnVuY2F0ZWQgaGVhZGVyLiIpOworICB9CisKKyAgLy8gUGFyYWdyYXBoIDkuMQorICB7CisgICAgY29uc3QgdWludDMyX3QgYml0cyA9IGJ1ZlswXSB8IChidWZbMV0gPDwgOCkgfCAoYnVmWzJdIDw8IDE2KTsKKyAgICBmcm1faGRyID0gJmRlYy0+ZnJtX2hkcl87CisgICAgZnJtX2hkci0+a2V5X2ZyYW1lXyA9ICEoYml0cyAmIDEpOworICAgIGZybV9oZHItPnByb2ZpbGVfID0gKGJpdHMgPj4gMSkgJiA3OworICAgIGZybV9oZHItPnNob3dfID0gKGJpdHMgPj4gNCkgJiAxOworICAgIGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID0gKGJpdHMgPj4gNSk7CisgICAgaWYgKGZybV9oZHItPnByb2ZpbGVfID4gMykgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkluY29ycmVjdCBrZXlmcmFtZSBwYXJhbWV0ZXJzLiIpOworICAgIH0KKyAgICBpZiAoIWZybV9oZHItPnNob3dfKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX1VOU1VQUE9SVEVEX0ZFQVRVUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIkZyYW1lIG5vdCBkaXNwbGF5YWJsZS4iKTsKKyAgICB9CisgICAgYnVmICs9IDM7CisgICAgYnVmX3NpemUgLT0gMzsKKyAgfQorCisgIHBpY19oZHIgPSAmZGVjLT5waWNfaGRyXzsKKyAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKKyAgICAvLyBQYXJhZ3JhcGggOS4yCisgICAgaWYgKGJ1Zl9zaXplIDwgNykgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBwaWN0dXJlIGhlYWRlciIpOworICAgIH0KKyAgICBpZiAoIVZQOENoZWNrU2lnbmF0dXJlKGJ1ZiwgYnVmX3NpemUpKSB7CisgICAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGNvZGUgd29yZCIpOworICAgIH0KKyAgICBwaWNfaGRyLT53aWR0aF8gPSAoKGJ1Zls0XSA8PCA4KSB8IGJ1ZlszXSkgJiAweDNmZmY7CisgICAgcGljX2hkci0+eHNjYWxlXyA9IGJ1Zls0XSA+PiA2OyAgIC8vIHJhdGlvOiAxLCA1LzQgNS8zIG9yIDIKKyAgICBwaWNfaGRyLT5oZWlnaHRfID0gKChidWZbNl0gPDwgOCkgfCBidWZbNV0pICYgMHgzZmZmOworICAgIHBpY19oZHItPnlzY2FsZV8gPSBidWZbNl0gPj4gNjsKKyAgICBidWYgKz0gNzsKKyAgICBidWZfc2l6ZSAtPSA3OworCisgICAgZGVjLT5tYl93XyA9IChwaWNfaGRyLT53aWR0aF8gKyAxNSkgPj4gNDsKKyAgICBkZWMtPm1iX2hfID0gKHBpY19oZHItPmhlaWdodF8gKyAxNSkgPj4gNDsKKworICAgIC8vIFNldHVwIGRlZmF1bHQgb3V0cHV0IGFyZWEgKGNhbiBiZSBsYXRlciBtb2RpZmllZCBkdXJpbmcgaW8tPnNldHVwKCkpCisgICAgaW8tPndpZHRoID0gcGljX2hkci0+d2lkdGhfOworICAgIGlvLT5oZWlnaHQgPSBwaWNfaGRyLT5oZWlnaHRfOworICAgIC8vIElNUE9SVEFOVCEgdXNlIHNvbWUgc2FuZSBkaW1lbnNpb25zIGluIGNyb3BfKiBhbmQgc2NhbGVkXyogZmllbGRzLgorICAgIC8vIFNvIHRoZXkgY2FuIGJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGhvdXQgYWx3YXlzIHRlc3RpbmcgZm9yCisgICAgLy8gJ3VzZV9jcm9wcGluZycuCisgICAgaW8tPnVzZV9jcm9wcGluZyA9IDA7CisgICAgaW8tPmNyb3BfdG9wICA9IDA7CisgICAgaW8tPmNyb3BfbGVmdCA9IDA7CisgICAgaW8tPmNyb3BfcmlnaHQgID0gaW8tPndpZHRoOworICAgIGlvLT5jcm9wX2JvdHRvbSA9IGlvLT5oZWlnaHQ7CisgICAgaW8tPnVzZV9zY2FsaW5nICA9IDA7CisgICAgaW8tPnNjYWxlZF93aWR0aCA9IGlvLT53aWR0aDsKKyAgICBpby0+c2NhbGVkX2hlaWdodCA9IGlvLT5oZWlnaHQ7CisKKyAgICBpby0+bWJfdyA9IGlvLT53aWR0aDsgICAvLyBzYW5pdHkgY2hlY2sKKyAgICBpby0+bWJfaCA9IGlvLT5oZWlnaHQ7ICAvLyBkaXR0bworCisgICAgVlA4UmVzZXRQcm9iYSgmZGVjLT5wcm9iYV8pOworICAgIFJlc2V0U2VnbWVudEhlYWRlcigmZGVjLT5zZWdtZW50X2hkcl8pOworICB9CisKKyAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhbGwgdGhlIHBhcnRpdGlvbiAjMCBhdmFpbGFibGUsIGFuZCBpbml0aWFsaXplIGRlYy0+YnJfCisgIC8vIHRvIHJlYWQgdGhpcyBwYXJ0aXRpb24gKGFuZCB0aGlzIHBhcnRpdGlvbiBvbmx5KS4KKyAgaWYgKGZybV9oZHItPnBhcnRpdGlvbl9sZW5ndGhfID4gYnVmX3NpemUpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgImJhZCBwYXJ0aXRpb24gbGVuZ3RoIik7CisgIH0KKworICBiciA9ICZkZWMtPmJyXzsKKyAgVlA4SW5pdEJpdFJlYWRlcihiciwgYnVmLCBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXyk7CisgIGJ1ZiArPSBmcm1faGRyLT5wYXJ0aXRpb25fbGVuZ3RoXzsKKyAgYnVmX3NpemUgLT0gZnJtX2hkci0+cGFydGl0aW9uX2xlbmd0aF87CisKKyAgaWYgKGZybV9oZHItPmtleV9mcmFtZV8pIHsKKyAgICBwaWNfaGRyLT5jb2xvcnNwYWNlXyA9IFZQOEdldChicik7CisgICAgcGljX2hkci0+Y2xhbXBfdHlwZV8gPSBWUDhHZXQoYnIpOworICB9CisgIGlmICghUGFyc2VTZWdtZW50SGVhZGVyKGJyLCAmZGVjLT5zZWdtZW50X2hkcl8sICZkZWMtPnByb2JhXykpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBwYXJzZSBzZWdtZW50IGhlYWRlciIpOworICB9CisgIC8vIEZpbHRlciBzcGVjcworICBpZiAoIVBhcnNlRmlsdGVySGVhZGVyKGJyLCBkZWMpKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3QgcGFyc2UgZmlsdGVyIGhlYWRlciIpOworICB9CisgIHN0YXR1cyA9IFBhcnNlUGFydGl0aW9ucyhkZWMsIGJ1ZiwgYnVmX3NpemUpOworICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBzdGF0dXMsICJjYW5ub3QgcGFyc2UgcGFydGl0aW9ucyIpOworICB9CisKKyAgLy8gcXVhbnRpemVyIGNoYW5nZQorICBWUDhQYXJzZVF1YW50KGRlYyk7CisKKyAgLy8gRnJhbWUgYnVmZmVyIG1hcmtpbmcKKyAgaWYgKCFmcm1faGRyLT5rZXlfZnJhbWVfKSB7CisgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFLAorICAgICAgICAgICAgICAgICAgICAgICAiTm90IGEga2V5IGZyYW1lLiIpOworICB9CisKKyAgVlA4R2V0KGJyKTsgICAvLyBpZ25vcmUgdGhlIHZhbHVlIG9mIHVwZGF0ZV9wcm9iYV8KKworICBWUDhQYXJzZVByb2JhKGJyLCBkZWMpOworCisgIC8vIHNhbml0aXplZCBzdGF0ZQorICBkZWMtPnJlYWR5XyA9IDE7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUmVzaWR1YWwgZGVjb2RpbmcgKFBhcmFncmFwaCAxMy4yIC8gMTMuMykKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDNbXSA9IHsgMTczLCAxNDgsIDE0MCwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1LCAwIH07CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ2F0NVtdID0geyAxODAsIDE1NywgMTQxLCAxMzQsIDEzMCwgMCB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0NhdDZbXSA9CisgIHsgMjU0LCAyNTQsIDI0MywgMjMwLCAxOTYsIDE3NywgMTUzLCAxNDAsIDEzMywgMTMwLCAxMjksIDAgfTsKK3N0YXRpYyBjb25zdCB1aW50OF90KiBjb25zdCBrQ2F0MzQ1NltdID0geyBrQ2F0Mywga0NhdDQsIGtDYXQ1LCBrQ2F0NiB9Oworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1ppZ3phZ1sxNl0gPSB7CisgIDAsIDEsIDQsIDgsICA1LCAyLCAzLCA2LCAgOSwgMTIsIDEzLCAxMCwgIDcsIDExLCAxNCwgMTUKK307CisKKy8vIFNlZSBzZWN0aW9uIDEzLTI6IGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzYzODYjc2VjdGlvbi0xMy4yCitzdGF0aWMgaW50IEdldExhcmdlVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgY29uc3QgdWludDhfdCogY29uc3QgcCkgeworICBpbnQgdjsKKyAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbM10pKSB7CisgICAgaWYgKCFWUDhHZXRCaXQoYnIsIHBbNF0pKSB7CisgICAgICB2ID0gMjsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IDMgKyBWUDhHZXRCaXQoYnIsIHBbNV0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIVZQOEdldEJpdChiciwgcFs2XSkpIHsKKyAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzddKSkgeworICAgICAgICB2ID0gNSArIFZQOEdldEJpdChiciwgMTU5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHYgPSA3ICsgMiAqIFZQOEdldEJpdChiciwgMTY1KTsKKyAgICAgICAgdiArPSBWUDhHZXRCaXQoYnIsIDE0NSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHRhYjsKKyAgICAgIGNvbnN0IGludCBiaXQxID0gVlA4R2V0Qml0KGJyLCBwWzhdKTsKKyAgICAgIGNvbnN0IGludCBiaXQwID0gVlA4R2V0Qml0KGJyLCBwWzkgKyBiaXQxXSk7CisgICAgICBjb25zdCBpbnQgY2F0ID0gMiAqIGJpdDEgKyBiaXQwOworICAgICAgdiA9IDA7CisgICAgICBmb3IgKHRhYiA9IGtDYXQzNDU2W2NhdF07ICp0YWI7ICsrdGFiKSB7CisgICAgICAgIHYgKz0gdiArIFZQOEdldEJpdChiciwgKnRhYik7CisgICAgICB9CisgICAgICB2ICs9IDMgKyAoOCA8PCBjYXQpOworICAgIH0KKyAgfQorICByZXR1cm4gdjsKK30KKworLy8gUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3Qgbm9uLXplcm8gY29lZmYgcGx1cyBvbmUKK3N0YXRpYyBpbnQgR2V0Q29lZmZzRmFzdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGNvbnN0IHByb2JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4LCBjb25zdCBxdWFudF90IGRxLCBpbnQgbiwgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHAgPSBwcm9iW25dLT5wcm9iYXNfW2N0eF07CisgIGZvciAoOyBuIDwgMTY7ICsrbikgeworICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzBdKSkgeworICAgICAgcmV0dXJuIG47ICAvLyBwcmV2aW91cyBjb2VmZiB3YXMgbGFzdCBub24temVybyBjb2VmZgorICAgIH0KKyAgICB3aGlsZSAoIVZQOEdldEJpdChiciwgcFsxXSkpIHsgICAgICAgLy8gc2VxdWVuY2Ugb2YgemVybyBjb2VmZnMKKyAgICAgIHAgPSBwcm9iWysrbl0tPnByb2Jhc19bMF07CisgICAgICBpZiAobiA9PSAxNikgcmV0dXJuIDE2OworICAgIH0KKyAgICB7ICAgICAgICAvLyBub24gemVybyBjb2VmZgorICAgICAgY29uc3QgVlA4UHJvYmFBcnJheSogY29uc3QgcF9jdHggPSAmcHJvYltuICsgMV0tPnByb2Jhc19bMF07CisgICAgICBpbnQgdjsKKyAgICAgIGlmICghVlA4R2V0Qml0KGJyLCBwWzJdKSkgeworICAgICAgICB2ID0gMTsKKyAgICAgICAgcCA9IHBfY3R4WzFdOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdiA9IEdldExhcmdlVmFsdWUoYnIsIHApOworICAgICAgICBwID0gcF9jdHhbMl07CisgICAgICB9CisgICAgICBvdXRba1ppZ3phZ1tuXV0gPSBWUDhHZXRTaWduZWQoYnIsIHYpICogZHFbbiA+IDBdOworICAgIH0KKyAgfQorICByZXR1cm4gMTY7Cit9CisKKy8vIFRoaXMgdmVyc2lvbiBvZiBHZXRDb2VmZnMoKSB1c2VzIFZQOEdldEJpdEFsdCgpIHdoaWNoIGlzIGFuIGFsdGVybmF0ZSB2ZXJzaW9uCisvLyBvZiBWUDhHZXRCaXRBbHQoKSB0YXJnZXRpbmcgc3BlY2lmaWMgcGxhdGZvcm1zLgorc3RhdGljIGludCBHZXRDb2VmZnNBbHQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEJhbmRQcm9iYXMqIGNvbnN0IHByb2JbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjdHgsIGNvbnN0IHF1YW50X3QgZHEsIGludCBuLCBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcCA9IHByb2Jbbl0tPnByb2Jhc19bY3R4XTsKKyAgZm9yICg7IG4gPCAxNjsgKytuKSB7CisgICAgaWYgKCFWUDhHZXRCaXRBbHQoYnIsIHBbMF0pKSB7CisgICAgICByZXR1cm4gbjsgIC8vIHByZXZpb3VzIGNvZWZmIHdhcyBsYXN0IG5vbi16ZXJvIGNvZWZmCisgICAgfQorICAgIHdoaWxlICghVlA4R2V0Qml0QWx0KGJyLCBwWzFdKSkgeyAgICAgICAvLyBzZXF1ZW5jZSBvZiB6ZXJvIGNvZWZmcworICAgICAgcCA9IHByb2JbKytuXS0+cHJvYmFzX1swXTsKKyAgICAgIGlmIChuID09IDE2KSByZXR1cm4gMTY7CisgICAgfQorICAgIHsgICAgICAgIC8vIG5vbiB6ZXJvIGNvZWZmCisgICAgICBjb25zdCBWUDhQcm9iYUFycmF5KiBjb25zdCBwX2N0eCA9ICZwcm9iW24gKyAxXS0+cHJvYmFzX1swXTsKKyAgICAgIGludCB2OworICAgICAgaWYgKCFWUDhHZXRCaXRBbHQoYnIsIHBbMl0pKSB7CisgICAgICAgIHYgPSAxOworICAgICAgICBwID0gcF9jdHhbMV07CisgICAgICB9IGVsc2UgeworICAgICAgICB2ID0gR2V0TGFyZ2VWYWx1ZShiciwgcCk7CisgICAgICAgIHAgPSBwX2N0eFsyXTsKKyAgICAgIH0KKyAgICAgIG91dFtrWmlnemFnW25dXSA9IFZQOEdldFNpZ25lZChiciwgdikgKiBkcVtuID4gMF07CisgICAgfQorICB9CisgIHJldHVybiAxNjsKK30KKworc3RhdGljIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBJbml0R2V0Q29lZmZzKHZvaWQpIHsKKyAgaWYgKEdldENvZWZmcyA9PSBOVUxMKSB7CisgICAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtTbG93U1NTRTMpKSB7CisgICAgICBHZXRDb2VmZnMgPSBHZXRDb2VmZnNBbHQ7CisgICAgfSBlbHNlIHsKKyAgICAgIEdldENvZWZmcyA9IEdldENvZWZmc0Zhc3Q7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBOekNvZGVCaXRzKHVpbnQzMl90IG56X2NvZWZmcywgaW50IG56LCBpbnQgZGNfbnopIHsKKyAgbnpfY29lZmZzIDw8PSAyOworICBuel9jb2VmZnMgfD0gKG56ID4gMykgPyAzIDogKG56ID4gMSkgPyAyIDogZGNfbno7CisgIHJldHVybiBuel9jb2VmZnM7Cit9CisKK3N0YXRpYyBpbnQgUGFyc2VSZXNpZHVhbHMoVlA4RGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhNQiogY29uc3QgbWIsIFZQOEJpdFJlYWRlciogY29uc3QgdG9rZW5fYnIpIHsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogKCogY29uc3QgYmFuZHMpWzE2ICsgMV0gPSBkZWMtPnByb2JhXy5iYW5kc19wdHJfOworICBjb25zdCBWUDhCYW5kUHJvYmFzKiBjb25zdCAqIGFjX3Byb2JhOworICBWUDhNQkRhdGEqIGNvbnN0IGJsb2NrID0gZGVjLT5tYl9kYXRhXyArIGRlYy0+bWJfeF87CisgIGNvbnN0IFZQOFF1YW50TWF0cml4KiBjb25zdCBxID0gJmRlYy0+ZHFtX1tibG9jay0+c2VnbWVudF9dOworICBpbnQxNl90KiBkc3QgPSBibG9jay0+Y29lZmZzXzsKKyAgVlA4TUIqIGNvbnN0IGxlZnRfbWIgPSBkZWMtPm1iX2luZm9fIC0gMTsKKyAgdWludDhfdCB0bnosIGxuejsKKyAgdWludDMyX3Qgbm9uX3plcm9feSA9IDA7CisgIHVpbnQzMl90IG5vbl96ZXJvX3V2ID0gMDsKKyAgaW50IHgsIHksIGNoOworICB1aW50MzJfdCBvdXRfdF9ueiwgb3V0X2xfbno7CisgIGludCBmaXJzdDsKKworICBtZW1zZXQoZHN0LCAwLCAzODQgKiBzaXplb2YoKmRzdCkpOworICBpZiAoIWJsb2NrLT5pc19pNHg0XykgeyAgICAvLyBwYXJzZSBEQworICAgIGludDE2X3QgZGNbMTZdID0geyAwIH07CisgICAgY29uc3QgaW50IGN0eCA9IG1iLT5uel9kY18gKyBsZWZ0X21iLT5uel9kY187CisgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1sxXSwgY3R4LCBxLT55Ml9tYXRfLCAwLCBkYyk7CisgICAgbWItPm56X2RjXyA9IGxlZnRfbWItPm56X2RjXyA9IChueiA+IDApOworICAgIGlmIChueiA+IDEpIHsgICAvLyBtb3JlIHRoYW4ganVzdCB0aGUgREMgLT4gcGVyZm9ybSB0aGUgZnVsbCB0cmFuc2Zvcm0KKyAgICAgIFZQOFRyYW5zZm9ybVdIVChkYywgZHN0KTsKKyAgICB9IGVsc2UgeyAgICAgICAgLy8gb25seSBEQyBpcyBub24temVybyAtPiBpbmxpbmVkIHNpbXBsaWZpZWQgdHJhbnNmb3JtCisgICAgICBpbnQgaTsKKyAgICAgIGNvbnN0IGludCBkYzAgPSAoZGNbMF0gKyAzKSA+PiAzOworICAgICAgZm9yIChpID0gMDsgaSA8IDE2ICogMTY7IGkgKz0gMTYpIGRzdFtpXSA9IGRjMDsKKyAgICB9CisgICAgZmlyc3QgPSAxOworICAgIGFjX3Byb2JhID0gYmFuZHNbMF07CisgIH0gZWxzZSB7CisgICAgZmlyc3QgPSAwOworICAgIGFjX3Byb2JhID0gYmFuZHNbM107CisgIH0KKworICB0bnogPSBtYi0+bnpfICYgMHgwZjsKKyAgbG56ID0gbGVmdF9tYi0+bnpfICYgMHgwZjsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGludCBsID0gbG56ICYgMTsKKyAgICB1aW50MzJfdCBuel9jb2VmZnMgPSAwOworICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCBjdHggPSBsICsgKHRueiAmIDEpOworICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBhY19wcm9iYSwgY3R4LCBxLT55MV9tYXRfLCBmaXJzdCwgZHN0KTsKKyAgICAgIGwgPSAobnogPiBmaXJzdCk7CisgICAgICB0bnogPSAodG56ID4+IDEpIHwgKGwgPDwgNyk7CisgICAgICBuel9jb2VmZnMgPSBOekNvZGVCaXRzKG56X2NvZWZmcywgbnosIGRzdFswXSAhPSAwKTsKKyAgICAgIGRzdCArPSAxNjsKKyAgICB9CisgICAgdG56ID4+PSA0OworICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA3KTsKKyAgICBub25femVyb195ID0gKG5vbl96ZXJvX3kgPDwgOCkgfCBuel9jb2VmZnM7CisgIH0KKyAgb3V0X3RfbnogPSB0bno7CisgIG91dF9sX256ID0gbG56ID4+IDQ7CisKKyAgZm9yIChjaCA9IDA7IGNoIDwgNDsgY2ggKz0gMikgeworICAgIHVpbnQzMl90IG56X2NvZWZmcyA9IDA7CisgICAgdG56ID0gbWItPm56XyA+PiAoNCArIGNoKTsKKyAgICBsbnogPSBsZWZ0X21iLT5uel8gPj4gKDQgKyBjaCk7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgaW50IGwgPSBsbnogJiAxOworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gbCArICh0bnogJiAxKTsKKyAgICAgICAgY29uc3QgaW50IG56ID0gR2V0Q29lZmZzKHRva2VuX2JyLCBiYW5kc1syXSwgY3R4LCBxLT51dl9tYXRfLCAwLCBkc3QpOworICAgICAgICBsID0gKG56ID4gMCk7CisgICAgICAgIHRueiA9ICh0bnogPj4gMSkgfCAobCA8PCAzKTsKKyAgICAgICAgbnpfY29lZmZzID0gTnpDb2RlQml0cyhuel9jb2VmZnMsIG56LCBkc3RbMF0gIT0gMCk7CisgICAgICAgIGRzdCArPSAxNjsKKyAgICAgIH0KKyAgICAgIHRueiA+Pj0gMjsKKyAgICAgIGxueiA9IChsbnogPj4gMSkgfCAobCA8PCA1KTsKKyAgICB9CisgICAgLy8gTm90ZTogd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdGhlIHBlci00eDQgZGV0YWlscyBmb3IgVS9WIGJsb2Nrcy4KKyAgICBub25femVyb191diB8PSBuel9jb2VmZnMgPDwgKDQgKiBjaCk7CisgICAgb3V0X3RfbnogfD0gKHRueiA8PCA0KSA8PCBjaDsKKyAgICBvdXRfbF9ueiB8PSAobG56ICYgMHhmMCkgPDwgY2g7CisgIH0KKyAgbWItPm56XyA9IG91dF90X256OworICBsZWZ0X21iLT5uel8gPSBvdXRfbF9uejsKKworICBibG9jay0+bm9uX3plcm9feV8gPSBub25femVyb195OworICBibG9jay0+bm9uX3plcm9fdXZfID0gbm9uX3plcm9fdXY7CisKKyAgLy8gV2UgbG9vayBhdCB0aGUgbW9kZS1jb2RlIG9mIGVhY2ggYmxvY2sgYW5kIGNoZWNrIGlmIHNvbWUgYmxvY2tzIGhhdmUgbGVzcworICAvLyB0aGFuIHRocmVlIG5vbi16ZXJvIGNvZWZmcyAoY29kZSA8IDIpLiBUaGlzIGlzIHRvIGF2b2lkIGRpdGhlcmluZyBmbGF0IGFuZAorICAvLyBlbXB0eSBibG9ja3MuCisgIGJsb2NrLT5kaXRoZXJfID0gKG5vbl96ZXJvX3V2ICYgMHhhYWFhKSA/IDAgOiBxLT5kaXRoZXJfOworCisgIHJldHVybiAhKG5vbl96ZXJvX3kgfCBub25femVyb191dik7ICAvLyB3aWxsIGJlIHVzZWQgZm9yIGZ1cnRoZXIgb3B0aW1pemF0aW9uCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGxvb3AKKworaW50IFZQOERlY29kZU1CKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9icikgeworICBWUDhNQiogY29uc3QgbGVmdCA9IGRlYy0+bWJfaW5mb18gLSAxOworICBWUDhNQiogY29uc3QgbWIgPSBkZWMtPm1iX2luZm9fICsgZGVjLT5tYl94XzsKKyAgVlA4TUJEYXRhKiBjb25zdCBibG9jayA9IGRlYy0+bWJfZGF0YV8gKyBkZWMtPm1iX3hfOworICBpbnQgc2tpcCA9IGRlYy0+dXNlX3NraXBfcHJvYmFfID8gYmxvY2stPnNraXBfIDogMDsKKworICBpZiAoIXNraXApIHsKKyAgICBza2lwID0gUGFyc2VSZXNpZHVhbHMoZGVjLCBtYiwgdG9rZW5fYnIpOworICB9IGVsc2UgeworICAgIGxlZnQtPm56XyA9IG1iLT5uel8gPSAwOworICAgIGlmICghYmxvY2stPmlzX2k0eDRfKSB7CisgICAgICBsZWZ0LT5uel9kY18gPSBtYi0+bnpfZGNfID0gMDsKKyAgICB9CisgICAgYmxvY2stPm5vbl96ZXJvX3lfID0gMDsKKyAgICBibG9jay0+bm9uX3plcm9fdXZfID0gMDsKKyAgICBibG9jay0+ZGl0aGVyXyA9IDA7CisgIH0KKworICBpZiAoZGVjLT5maWx0ZXJfdHlwZV8gPiAwKSB7ICAvLyBzdG9yZSBmaWx0ZXIgaW5mbworICAgIFZQOEZJbmZvKiBjb25zdCBmaW5mbyA9IGRlYy0+Zl9pbmZvXyArIGRlYy0+bWJfeF87CisgICAgKmZpbmZvID0gZGVjLT5mc3RyZW5ndGhzX1tibG9jay0+c2VnbWVudF9dW2Jsb2NrLT5pc19pNHg0X107CisgICAgZmluZm8tPmZfaW5uZXJfIHw9ICFza2lwOworICB9CisKKyAgcmV0dXJuICF0b2tlbl9ici0+ZW9mXzsKK30KKwordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKSB7CisgIFZQOE1CKiBjb25zdCBsZWZ0ID0gZGVjLT5tYl9pbmZvXyAtIDE7CisgIGxlZnQtPm56XyA9IDA7CisgIGxlZnQtPm56X2RjXyA9IDA7CisgIG1lbXNldChkZWMtPmludHJhX2xfLCBCX0RDX1BSRUQsIHNpemVvZihkZWMtPmludHJhX2xfKSk7CisgIGRlYy0+bWJfeF8gPSAwOworfQorCitzdGF0aWMgaW50IFBhcnNlRnJhbWUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogaW8pIHsKKyAgZm9yIChkZWMtPm1iX3lfID0gMDsgZGVjLT5tYl95XyA8IGRlYy0+YnJfbWJfeV87ICsrZGVjLT5tYl95XykgeworICAgIC8vIFBhcnNlIGJpdHN0cmVhbSBmb3IgdGhpcyByb3cuCisgICAgVlA4Qml0UmVhZGVyKiBjb25zdCB0b2tlbl9iciA9CisgICAgICAgICZkZWMtPnBhcnRzX1tkZWMtPm1iX3lfICYgZGVjLT5udW1fcGFydHNfbWludXNfb25lX107CisgICAgaWYgKCFWUDhQYXJzZUludHJhTW9kZVJvdygmZGVjLT5icl8sIGRlYykpIHsKKyAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICJQcmVtYXR1cmUgZW5kLW9mLXBhcnRpdGlvbjAgZW5jb3VudGVyZWQuIik7CisgICAgfQorICAgIGZvciAoOyBkZWMtPm1iX3hfIDwgZGVjLT5tYl93XzsgKytkZWMtPm1iX3hfKSB7CisgICAgICBpZiAoIVZQOERlY29kZU1CKGRlYywgdG9rZW5fYnIpKSB7CisgICAgICAgIHJldHVybiBWUDhTZXRFcnJvcihkZWMsIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZW1hdHVyZSBlbmQtb2YtZmlsZSBlbmNvdW50ZXJlZC4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4SW5pdFNjYW5saW5lKGRlYyk7ICAgLy8gUHJlcGFyZSBmb3IgbmV4dCBzY2FubGluZQorCisgICAgLy8gUmVjb25zdHJ1Y3QsIGZpbHRlciBhbmQgZW1pdCB0aGUgcm93LgorICAgIGlmICghVlA4UHJvY2Vzc1JvdyhkZWMsIGlvKSkgeworICAgICAgcmV0dXJuIFZQOFNldEVycm9yKGRlYywgVlA4X1NUQVRVU19VU0VSX0FCT1JULCAiT3V0cHV0IGFib3J0ZWQuIik7CisgICAgfQorICB9CisgIGlmIChkZWMtPm10X21ldGhvZF8gPiAwKSB7CisgICAgaWYgKCFXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMoJmRlYy0+d29ya2VyXykpIHJldHVybiAwOworICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vIE1haW4gZW50cnkgcG9pbnQKK2ludCBWUDhEZWNvZGUoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pIHsKKyAgaW50IG9rID0gMDsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGlvID09IE5VTEwpIHsKKyAgICByZXR1cm4gVlA4U2V0RXJyb3IoZGVjLCBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICJOVUxMIFZQOElvIHBhcmFtZXRlciBpbiBWUDhEZWNvZGUoKS4iKTsKKyAgfQorCisgIGlmICghZGVjLT5yZWFkeV8pIHsKKyAgICBpZiAoIVZQOEdldEhlYWRlcnMoZGVjLCBpbykpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorICBhc3NlcnQoZGVjLT5yZWFkeV8pOworCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBkZWNvZGluZyBwYXJhbWV0ZXIuIFdpbGwgY2FsbCBpby0+c2V0dXAoKS4KKyAgb2sgPSAoVlA4RW50ZXJDcml0aWNhbChkZWMsIGlvKSA9PSBWUDhfU1RBVFVTX09LKTsKKyAgaWYgKG9rKSB7ICAgLy8gZ29vZCB0byBnby4KKyAgICAvLyBXaWxsIGFsbG9jYXRlIG1lbW9yeSBhbmQgcHJlcGFyZSBldmVyeXRoaW5nLgorICAgIGlmIChvaykgb2sgPSBWUDhJbml0RnJhbWUoZGVjLCBpbyk7CisKKyAgICAvLyBNYWluIGRlY29kaW5nIGxvb3AKKyAgICBpZiAob2spIG9rID0gUGFyc2VGcmFtZShkZWMsIGlvKTsKKworICAgIC8vIEV4aXQuCisgICAgb2sgJj0gVlA4RXhpdENyaXRpY2FsKGRlYywgaW8pOworICB9CisKKyAgaWYgKCFvaykgeworICAgIFZQOENsZWFyKGRlYyk7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkZWMtPnJlYWR5XyA9IDA7CisgIHJldHVybiBvazsKK30KKwordm9pZCBWUDhDbGVhcihWUDhEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgaWYgKGRlYyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RW5kKCZkZWMtPndvcmtlcl8pOworICBXZWJQRGVhbGxvY2F0ZUFscGhhTWVtb3J5KGRlYyk7CisgIFdlYlBTYWZlRnJlZShkZWMtPm1lbV8pOworICBkZWMtPm1lbV8gPSBOVUxMOworICBkZWMtPm1lbV9zaXplXyA9IDA7CisgIG1lbXNldCgmZGVjLT5icl8sIDAsIHNpemVvZihkZWMtPmJyXykpOworICBkZWMtPnJlYWR5XyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvZGVjb2RlX3ZwOC5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhfZGVjLmgKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2RlY29kZV92cDguaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhfZGVjLmgKaW5kZXggYWNkYjE1YS4uY2E4NWIzNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL2RlY29kZV92cDguaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOF9kZWMuaApAQCAtMTEsMTIgKzExLDEyIEBACiAvLwogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAotI2lmbmRlZiBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXwotI2RlZmluZSBXRUJQX1dFQlBfREVDT0RFX1ZQOF9IXworI2lmbmRlZiBXRUJQX0RFQ19WUDhfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1ZQOF9ERUNfSF8KIAotI2luY2x1ZGUgIi4uL3dlYnAvZGVjb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZGVjb2RlLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKQEAgLTMzLDcgKzMzLDcgQEAKIC8vICAgLyogY3VzdG9taXplIGlvJ3MgZnVuY3Rpb25zIChzZXR1cCgpL3B1dCgpL3RlYXJkb3duKCkpIGlmIG5lZWRlZC4gKi8KIC8vCiAvLyAgIFZQOERlY29kZXIqIGRlYyA9IFZQOE5ldygpOwotLy8gICBib29sIG9rID0gVlA4RGVjb2RlKGRlYyk7CisvLyAgIGludCBvayA9IFZQOERlY29kZShkZWMsICZpbyk7CiAvLyAgIGlmICghb2spIHByaW50ZigiRXJyb3I6ICVzXG4iLCBWUDhTdGF0dXNNZXNzYWdlKGRlYykpOwogLy8gICBWUDhEZWxldGUoZGVjKTsKIC8vICAgcmV0dXJuIG9rOwpAQCAtMTMyLDcgKzEzMiw4IEBACiAgIHJldHVybiBWUDhJbml0SW9JbnRlcm5hbChpbywgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OKTsKIH0KIAotLy8gU3RhcnQgZGVjb2RpbmcgYSBuZXcgcGljdHVyZS4gUmV0dXJucyB0cnVlIGlmIG9rLgorLy8gRGVjb2RlIHRoZSBWUDggZnJhbWUgaGVhZGVyLiBSZXR1cm5zIHRydWUgaWYgb2suCisvLyBOb3RlOiAnaW8tPmRhdGEnIG11c3QgYmUgcG9pbnRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBWUDggZnJhbWUgaGVhZGVyLgogaW50IFZQOEdldEhlYWRlcnMoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOwogCiAvLyBEZWNvZGUgYSBwaWN0dXJlLiBXaWxsIGNhbGwgVlA4R2V0SGVhZGVycygpIGlmIGl0IHdhc24ndCBkb25lIGFscmVhZHkuCkBAIC0xNTYsMjkgKzE1NywyOSBAQAogLy8gTWlzY2VsbGFuZW91cyBWUDgvVlA4TCBiaXRzdHJlYW0gcHJvYmluZyBmdW5jdGlvbnMuCiAKIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbmV4dCAzIGJ5dGVzIGluIGRhdGEgY29udGFpbiB0aGUgVlA4IHNpZ25hdHVyZS4KLVdFQlBfRVhURVJOKGludCkgVlA4Q2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CitXRUJQX0VYVEVSTiBpbnQgVlA4Q2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CiAKIC8vIFZhbGlkYXRlcyB0aGUgVlA4IGRhdGEtaGVhZGVyIGFuZCByZXRyaWV2ZXMgYmFzaWMgaGVhZGVyIGluZm9ybWF0aW9uIHZpegogLy8gd2lkdGggYW5kIGhlaWdodC4gUmV0dXJucyAwIGluIGNhc2Ugb2YgZm9ybWF0dGluZyBlcnJvci4gKndpZHRoLypoZWlnaHQKIC8vIGNhbiBiZSBwYXNzZWQgTlVMTC4KLVdFQlBfRVhURVJOKGludCkgVlA4R2V0SW5mbygKK1dFQlBfRVhURVJOIGludCBWUDhHZXRJbmZvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCiAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgICAgLy8gZGF0YSBhdmFpbGFibGUgc28gZmFyCiAgICAgc2l6ZV90IGNodW5rX3NpemUsICAgLy8gdG90YWwgZGF0YSBzaXplIGV4cGVjdGVkIGluIHRoZSBjaHVuawogICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KTsKIAogLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBuZXh0IGJ5dGUocykgaW4gZGF0YSBpcyBhIFZQOEwgc2lnbmF0dXJlLgotV0VCUF9FWFRFUk4oaW50KSBWUDhMQ2hlY2tTaWduYXR1cmUoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpOworV0VCUF9FWFRFUk4gaW50IFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKIC8vIFZhbGlkYXRlcyB0aGUgVlA4TCBkYXRhLWhlYWRlciBhbmQgcmV0cmlldmVzIGJhc2ljIGhlYWRlciBpbmZvcm1hdGlvbiB2aXoKIC8vIHdpZHRoLCBoZWlnaHQgYW5kIGFscGhhLiBSZXR1cm5zIDAgaW4gY2FzZSBvZiBmb3JtYXR0aW5nIGVycm9yLgogLy8gd2lkdGgvaGVpZ2h0L2hhc19hbHBoYSBjYW4gYmUgcGFzc2VkIE5VTEwuCi1XRUJQX0VYVEVSTihpbnQpIFZQOExHZXRJbmZvKAorV0VCUF9FWFRFUk4gaW50IFZQOExHZXRJbmZvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsICAvLyBkYXRhIGF2YWlsYWJsZSBzbyBmYXIKICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwgaW50KiBjb25zdCBoYXNfYWxwaGEpOwogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAgIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9ERUNPREVfVlA4X0hfICovCisjZW5kaWYgIC8qIFdFQlBfREVDX1ZQOF9ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4aV9kZWMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4aV9kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2IwZGJkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhpX2RlYy5oCkBAIC0wLDAgKzEsMzIyIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVlA4IGRlY29kZXI6IGludGVybmFsIGhlYWRlci4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfREVDX1ZQOElfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1ZQOElfREVDX0hfCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3IgbWVtY3B5KCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy9jb21tb25fZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yYW5kb21fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW91cyBkZWZpbmVzIGFuZCBlbnVtcworCisvLyB2ZXJzaW9uIG51bWJlcnMKKyNkZWZpbmUgREVDX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgREVDX01JTl9WRVJTSU9OIDAKKyNkZWZpbmUgREVDX1JFVl9WRVJTSU9OIDAKKworLy8gWVVWLWNhY2hlIHBhcmFtZXRlcnMuIENhY2hlIGlzIDMyLWJ5dGVzIHdpZGUgKD0gb25lIGNhY2hlbGluZSkuCisvLyBDb25zdHJhaW50cyBhcmU6IFdlIG5lZWQgdG8gc3RvcmUgb25lIDE2eDE2IGJsb2NrIG9mIGx1bWEgc2FtcGxlcyAoeSksCisvLyBhbmQgdHdvIDh4OCBjaHJvbWEgYmxvY2tzICh1L3YpLiBUaGVzZSBhcmUgYmV0dGVyIGJlIDE2LWJ5dGVzIGFsaWduZWQsCisvLyBpbiBvcmRlciB0byBiZSBTSU1ELWZyaWVuZGx5LiBXZSBhbHNvIG5lZWQgdG8gc3RvcmUgdGhlIHRvcCwgbGVmdCBhbmQKKy8vIHRvcC1sZWZ0IHNhbXBsZXMgKGZyb20gcHJldmlvdXNseSBkZWNvZGVkIGJsb2NrcyksIGFsb25nIHdpdGggZm91cgorLy8gZXh0cmEgdG9wLXJpZ2h0IHNhbXBsZXMgZm9yIGx1bWEgKGludHJhNHg0IHByZWRpY3Rpb24gb25seSkuCisvLyBPbmUgcG9zc2libGUgbGF5b3V0IGlzLCB1c2luZyAzMiAqICgxNyArIDkpIGJ5dGVzOgorLy8KKy8vICAgListLS0tLS0gICA8LSBvbmx5IDEgcGl4ZWwgaGlnaAorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXl0LgorLy8gICAufHl5eXkuLgorLy8gICAuKy0tListLSAgIDwtIG9ubHkgMSBwaXhlbCBoaWdoCisvLyAgIC58dXUufHZ2CisvLyAgIC58dXUufHZ2CisvLworLy8gRXZlcnkgY2hhcmFjdGVyIGlzIGEgNHg0IGJsb2NrLCB3aXRoIGxlZ2VuZDoKKy8vICAnLicgPSB1bnVzZWQKKy8vICAneScgPSB5LXNhbXBsZXMgICAndScgPSB1LXNhbXBsZXMgICAgICd2JyA9IHUtc2FtcGxlcworLy8gICd8JyA9IGxlZnQgc2FtcGxlLCAgICctJyA9IHRvcCBzYW1wbGUsICAgICcrJyA9IHRvcC1sZWZ0IHNhbXBsZQorLy8gICd0JyA9IGV4dHJhIHRvcC1yaWdodCBzYW1wbGUgZm9yIDR4NCBtb2RlcworI2RlZmluZSBZVVZfU0laRSAoQlBTICogMTcgKyBCUFMgKiA5KQorI2RlZmluZSBZX09GRiAgICAoQlBTICogMSArIDgpCisjZGVmaW5lIFVfT0ZGICAgIChZX09GRiArIEJQUyAqIDE2ICsgQlBTKQorI2RlZmluZSBWX09GRiAgICAoVV9PRkYgKyAxNikKKworLy8gbWluaW1hbCB3aWR0aCB1bmRlciB3aGljaCBsb3NzeSBtdWx0aS10aHJlYWRpbmcgaXMgYWx3YXlzIGRpc2FibGVkCisjZGVmaW5lIE1JTl9XSURUSF9GT1JfVEhSRUFEUyA1MTIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlYWRlcnMKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50OF90IGtleV9mcmFtZV87CisgIHVpbnQ4X3QgcHJvZmlsZV87CisgIHVpbnQ4X3Qgc2hvd187CisgIHVpbnQzMl90IHBhcnRpdGlvbl9sZW5ndGhfOworfSBWUDhGcmFtZUhlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MTZfdCB3aWR0aF87CisgIHVpbnQxNl90IGhlaWdodF87CisgIHVpbnQ4X3QgeHNjYWxlXzsKKyAgdWludDhfdCB5c2NhbGVfOworICB1aW50OF90IGNvbG9yc3BhY2VfOyAgIC8vIDAgPSBZQ2JDcgorICB1aW50OF90IGNsYW1wX3R5cGVfOworfSBWUDhQaWN0dXJlSGVhZGVyOworCisvLyBzZWdtZW50IGZlYXR1cmVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCB1c2Vfc2VnbWVudF87CisgIGludCB1cGRhdGVfbWFwXzsgICAgICAgIC8vIHdoZXRoZXIgdG8gdXBkYXRlIHRoZSBzZWdtZW50IG1hcCBvciBub3QKKyAgaW50IGFic29sdXRlX2RlbHRhXzsgICAgLy8gYWJzb2x1dGUgb3IgZGVsdGEgdmFsdWVzIGZvciBxdWFudGl6ZXIgYW5kIGZpbHRlcgorICBpbnQ4X3QgcXVhbnRpemVyX1tOVU1fTUJfU0VHTUVOVFNdOyAgICAgICAgLy8gcXVhbnRpemF0aW9uIGNoYW5nZXMKKyAgaW50OF90IGZpbHRlcl9zdHJlbmd0aF9bTlVNX01CX1NFR01FTlRTXTsgIC8vIGZpbHRlciBzdHJlbmd0aCBmb3Igc2VnbWVudHMKK30gVlA4U2VnbWVudEhlYWRlcjsKKworLy8gcHJvYmFzIGFzc29jaWF0ZWQgdG8gb25lIG9mIHRoZSBjb250ZXh0cwordHlwZWRlZiB1aW50OF90IFZQOFByb2JhQXJyYXlbTlVNX1BST0JBU107CisKK3R5cGVkZWYgc3RydWN0IHsgICAvLyBhbGwgdGhlIHByb2JhcyBhc3NvY2lhdGVkIHRvIG9uZSBiYW5kCisgIFZQOFByb2JhQXJyYXkgcHJvYmFzX1tOVU1fQ1RYXTsKK30gVlA4QmFuZFByb2JhczsKKworLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDhfdCBzZWdtZW50c19bTUJfRkVBVFVSRV9UUkVFX1BST0JTXTsKKyAgLy8gVHlwZTogMDpJbnRyYTE2LUFDICAxOkludHJhMTYtREMgICAyOkNocm9tYSAgIDM6SW50cmE0CisgIFZQOEJhbmRQcm9iYXMgYmFuZHNfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsKKyAgY29uc3QgVlA4QmFuZFByb2JhcyogYmFuZHNfcHRyX1tOVU1fVFlQRVNdWzE2ICsgMV07Cit9IFZQOFByb2JhOworCisvLyBGaWx0ZXIgcGFyYW1ldGVycwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2ltcGxlXzsgICAgICAgICAgICAgICAgICAvLyAwPWNvbXBsZXgsIDE9c2ltcGxlCisgIGludCBsZXZlbF87ICAgICAgICAgICAgICAgICAgIC8vIFswLi42M10KKyAgaW50IHNoYXJwbmVzc187ICAgICAgICAgICAgICAgLy8gWzAuLjddCisgIGludCB1c2VfbGZfZGVsdGFfOworICBpbnQgcmVmX2xmX2RlbHRhX1tOVU1fUkVGX0xGX0RFTFRBU107CisgIGludCBtb2RlX2xmX2RlbHRhX1tOVU1fTU9ERV9MRl9ERUxUQVNdOworfSBWUDhGaWx0ZXJIZWFkZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgorCit0eXBlZGVmIHN0cnVjdCB7ICAvLyBmaWx0ZXIgc3BlY3MKKyAgdWludDhfdCBmX2xpbWl0XzsgICAgICAvLyBmaWx0ZXIgbGltaXQgaW4gWzMuLjE4OV0sIG9yIDAgaWYgbm8gZmlsdGVyaW5nCisgIHVpbnQ4X3QgZl9pbGV2ZWxfOyAgICAgLy8gaW5uZXIgbGltaXQgaW4gWzEuLjYzXQorICB1aW50OF90IGZfaW5uZXJfOyAgICAgIC8vIGRvIGlubmVyIGZpbHRlcmluZz8KKyAgdWludDhfdCBoZXZfdGhyZXNoXzsgICAvLyBoaWdoIGVkZ2UgdmFyaWFuY2UgdGhyZXNob2xkIGluIFswLi4yXQorfSBWUDhGSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gVG9wL0xlZnQgQ29udGV4dHMgdXNlZCBmb3Igc3ludGF4LXBhcnNpbmcKKyAgdWludDhfdCBuel87ICAgICAgICAvLyBub24temVybyBBQy9EQyBjb2VmZnMgKDRiaXQgZm9yIGx1bWEgKyA0Yml0IGZvciBjaHJvbWEpCisgIHVpbnQ4X3QgbnpfZGNfOyAgICAgLy8gbm9uLXplcm8gREMgY29lZmYgKDFiaXQpCit9IFZQOE1COworCisvLyBEZXF1YW50aXphdGlvbiBtYXRyaWNlcwordHlwZWRlZiBpbnQgcXVhbnRfdFsyXTsgICAgICAvLyBbREMgLyBBQ10uICBDYW4gYmUgJ3VpbnQxNl90WzJdJyB0b28gKH5zbG93ZXIpLgordHlwZWRlZiBzdHJ1Y3QgeworICBxdWFudF90IHkxX21hdF8sIHkyX21hdF8sIHV2X21hdF87CisKKyAgaW50IHV2X3F1YW50XzsgICAvLyBVL1YgcXVhbnRpemVyIHZhbHVlCisgIGludCBkaXRoZXJfOyAgICAgLy8gZGl0aGVyaW5nIGFtcGxpdHVkZSAoMCA9IG9mZiwgbWF4PTI1NSkKK30gVlA4UXVhbnRNYXRyaXg7CisKKy8vIERhdGEgbmVlZGVkIHRvIHJlY29uc3RydWN0IGEgbWFjcm9ibG9jawordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQxNl90IGNvZWZmc19bMzg0XTsgICAvLyAzODQgY29lZmZzID0gKDE2KzQrNCkgKiA0KjQKKyAgdWludDhfdCBpc19pNHg0XzsgICAgICAgLy8gdHJ1ZSBpZiBpbnRyYTR4NAorICB1aW50OF90IGltb2Rlc19bMTZdOyAgICAvLyBvbmUgMTZ4MTYgbW9kZSAoIzApIG9yIHNpeHRlZW4gNHg0IG1vZGVzCisgIHVpbnQ4X3QgdXZtb2RlXzsgICAgICAgIC8vIGNocm9tYSBwcmVkaWN0aW9uIG1vZGUKKyAgLy8gYml0LXdpc2UgaW5mbyBhYm91dCB0aGUgY29udGVudCBvZiBlYWNoIHN1Yi00eDQgYmxvY2tzIChpbiBkZWNvZGluZyBvcmRlcikuCisgIC8vIEVhY2ggb2YgdGhlIDR4NCBibG9ja3MgZm9yIHkvdS92IGlzIGFzc29jaWF0ZWQgd2l0aCBhIDJiIGNvZGUgYWNjb3JkaW5nIHRvOgorICAvLyAgIGNvZGU9MCAtPiBubyBjb2VmZmljaWVudAorICAvLyAgIGNvZGU9MSAtPiBvbmx5IERDCisgIC8vICAgY29kZT0yIC0+IGZpcnN0IHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gICBjb2RlPTMgLT4gbW9yZSB0aGFuIHRocmVlIGNvZWZmaWNpZW50cyBhcmUgbm9uLXplcm8KKyAgLy8gVGhpcyBhbGxvd3MgdG8gY2FsbCBzcGVjaWFsaXplZCB0cmFuc2Zvcm0gZnVuY3Rpb25zLgorICB1aW50MzJfdCBub25femVyb195XzsKKyAgdWludDMyX3Qgbm9uX3plcm9fdXZfOworICB1aW50OF90IGRpdGhlcl87ICAgICAgLy8gbG9jYWwgZGl0aGVyaW5nIHN0cmVuZ3RoIChkZWR1Y2VkIGZyb20gbm9uX3plcm9fKikKKyAgdWludDhfdCBza2lwXzsKKyAgdWludDhfdCBzZWdtZW50XzsKK30gVlA4TUJEYXRhOworCisvLyBQZXJzaXN0ZW50IGluZm9ybWF0aW9uIG5lZWRlZCBieSB0aGUgcGFyYWxsZWwgcHJvY2Vzc2luZwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaWRfOyAgICAgICAgICAgICAgLy8gY2FjaGUgcm93IHRvIHByb2Nlc3MgKGluIFswLi4yXSkKKyAgaW50IG1iX3lfOyAgICAgICAgICAgIC8vIG1hY3JvYmxvY2sgcG9zaXRpb24gb2YgdGhlIHJvdworICBpbnQgZmlsdGVyX3Jvd187ICAgICAgLy8gdHJ1ZSBpZiByb3ctZmlsdGVyaW5nIGlzIG5lZWRlZAorICBWUDhGSW5mbyogZl9pbmZvXzsgICAgLy8gZmlsdGVyIHN0cmVuZ3RocyAoc3dhcHBlZCB3aXRoIGRlYy0+Zl9pbmZvXykKKyAgVlA4TUJEYXRhKiBtYl9kYXRhXzsgIC8vIHJlY29uc3RydWN0aW9uIGRhdGEgKHN3YXBwZWQgd2l0aCBkZWMtPm1iX2RhdGFfKQorICBWUDhJbyBpb187ICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgVlA4SW8gdG8gcGFzcyB0byBwdXQoKQorfSBWUDhUaHJlYWRDb250ZXh0OworCisvLyBTYXZlZCB0b3Agc2FtcGxlcywgcGVyIG1hY3JvYmxvY2suIEZpdHMgaW50byBhIGNhY2hlLWxpbmUuCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgeVsxNl0sIHVbOF0sIHZbOF07Cit9IFZQOFRvcFNhbXBsZXM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhEZWNvZGVyOiB0aGUgbWFpbiBvcGFxdWUgc3RydWN0dXJlIGhhbmRlZCBvdmVyIHRvIHVzZXIKKworc3RydWN0IFZQOERlY29kZXIgeworICBWUDhTdGF0dXNDb2RlIHN0YXR1c187CisgIGludCByZWFkeV87ICAgICAvLyB0cnVlIGlmIHJlYWR5IHRvIGRlY29kZSBhIHBpY3R1cmUgd2l0aCBWUDhEZWNvZGUoKQorICBjb25zdCBjaGFyKiBlcnJvcl9tc2dfOyAgLy8gc2V0IHdoZW4gc3RhdHVzXyBpcyBub3QgT0suCisKKyAgLy8gTWFpbiBkYXRhIHNvdXJjZQorICBWUDhCaXRSZWFkZXIgYnJfOworCisgIC8vIGhlYWRlcnMKKyAgVlA4RnJhbWVIZWFkZXIgICBmcm1faGRyXzsKKyAgVlA4UGljdHVyZUhlYWRlciBwaWNfaGRyXzsKKyAgVlA4RmlsdGVySGVhZGVyICBmaWx0ZXJfaGRyXzsKKyAgVlA4U2VnbWVudEhlYWRlciBzZWdtZW50X2hkcl87CisKKyAgLy8gV29ya2VyCisgIFdlYlBXb3JrZXIgd29ya2VyXzsKKyAgaW50IG10X21ldGhvZF87ICAgICAgLy8gbXVsdGktdGhyZWFkIG1ldGhvZDogMD1vZmYsIDE9W3BhcnNlK3JlY29uXVtmaWx0ZXJdCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDI9W3BhcnNlXVtyZWNvbitmaWx0ZXJdCisgIGludCBjYWNoZV9pZF87ICAgICAgIC8vIGN1cnJlbnQgY2FjaGUgcm93CisgIGludCBudW1fY2FjaGVzXzsgICAgIC8vIG51bWJlciBvZiBjYWNoZWQgcm93cyBvZiAxNiBwaXhlbHMgKDEsIDIgb3IgMykKKyAgVlA4VGhyZWFkQ29udGV4dCB0aHJlYWRfY3R4XzsgIC8vIFRocmVhZCBjb250ZXh0CisKKyAgLy8gZGltZW5zaW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzLgorICBpbnQgbWJfd18sIG1iX2hfOworCisgIC8vIE1hY3JvYmxvY2sgdG8gcHJvY2Vzcy9maWx0ZXIsIGRlcGVuZGluZyBvbiBjcm9wcGluZyBhbmQgZmlsdGVyX3R5cGUuCisgIGludCB0bF9tYl94XywgdGxfbWJfeV87ICAvLyB0b3AtbGVmdCBNQiB0aGF0IG11c3QgYmUgaW4tbG9vcCBmaWx0ZXJlZAorICBpbnQgYnJfbWJfeF8sIGJyX21iX3lfOyAgLy8gbGFzdCBib3R0b20tcmlnaHQgTUIgdGhhdCBtdXN0IGJlIGRlY29kZWQKKworICAvLyBudW1iZXIgb2YgcGFydGl0aW9ucyBtaW51cyBvbmUuCisgIHVpbnQzMl90IG51bV9wYXJ0c19taW51c19vbmVfOworICAvLyBwZXItcGFydGl0aW9uIGJvb2xlYW4gZGVjb2RlcnMuCisgIFZQOEJpdFJlYWRlciBwYXJ0c19bTUFYX05VTV9QQVJUSVRJT05TXTsKKworICAvLyBEaXRoZXJpbmcgc3RyZW5ndGgsIGRlZHVjZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zCisgIGludCBkaXRoZXJfOyAgICAgICAgICAgICAgICAvLyB3aGV0aGVyIHRvIHVzZSBkaXRoZXJpbmcgb3Igbm90CisgIFZQOFJhbmRvbSBkaXRoZXJpbmdfcmdfOyAgICAvLyByYW5kb20gZ2VuZXJhdG9yIGZvciBkaXRoZXJpbmcKKworICAvLyBkZXF1YW50aXphdGlvbiAob25lIHNldCBvZiBEQy9BQyBkZXF1YW50IGZhY3RvciBwZXIgc2VnbWVudCkKKyAgVlA4UXVhbnRNYXRyaXggZHFtX1tOVU1fTUJfU0VHTUVOVFNdOworCisgIC8vIHByb2JhYmlsaXRpZXMKKyAgVlA4UHJvYmEgcHJvYmFfOworICBpbnQgdXNlX3NraXBfcHJvYmFfOworICB1aW50OF90IHNraXBfcF87CisKKyAgLy8gQm91bmRhcnkgZGF0YSBjYWNoZSBhbmQgcGVyc2lzdGVudCBidWZmZXJzLgorICB1aW50OF90KiBpbnRyYV90XzsgICAgICAvLyB0b3AgaW50cmEgbW9kZXMgdmFsdWVzOiA0ICogbWJfd18KKyAgdWludDhfdCAgaW50cmFfbF9bNF07ICAgLy8gbGVmdCBpbnRyYSBtb2RlcyB2YWx1ZXMKKworICBWUDhUb3BTYW1wbGVzKiB5dXZfdF87ICAvLyB0b3AgeS91L3Ygc2FtcGxlcworCisgIFZQOE1CKiBtYl9pbmZvXzsgICAgICAgIC8vIGNvbnRleHR1YWwgbWFjcm9ibG9jayBpbmZvIChtYl93XyArIDEpCisgIFZQOEZJbmZvKiBmX2luZm9fOyAgICAgIC8vIGZpbHRlciBzdHJlbmd0aCBpbmZvCisgIHVpbnQ4X3QqIHl1dl9iXzsgICAgICAgIC8vIG1haW4gYmxvY2sgZm9yIFkvVS9WIChzaXplID0gWVVWX1NJWkUpCisKKyAgdWludDhfdCogY2FjaGVfeV87ICAgICAgLy8gbWFjcm9ibG9jayByb3cgZm9yIHN0b3JpbmcgdW5maWx0ZXJlZCBzYW1wbGVzCisgIHVpbnQ4X3QqIGNhY2hlX3VfOworICB1aW50OF90KiBjYWNoZV92XzsKKyAgaW50IGNhY2hlX3lfc3RyaWRlXzsKKyAgaW50IGNhY2hlX3V2X3N0cmlkZV87CisKKyAgLy8gbWFpbiBtZW1vcnkgY2h1bmsgZm9yIHRoZSBhYm92ZSBkYXRhLiBQZXJzaXN0ZW50LgorICB2b2lkKiBtZW1fOworICBzaXplX3QgbWVtX3NpemVfOworCisgIC8vIFBlciBtYWNyb2Jsb2NrIG5vbi1wZXJzaXN0ZW50IGluZm9zLgorICBpbnQgbWJfeF8sIG1iX3lfOyAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uLCBpbiBtYWNyb2Jsb2NrIHVuaXRzCisgIFZQOE1CRGF0YSogbWJfZGF0YV87ICAgIC8vIHBhcnNlZCByZWNvbnN0cnVjdGlvbiBkYXRhCisKKyAgLy8gRmlsdGVyaW5nIHNpZGUtaW5mbworICBpbnQgZmlsdGVyX3R5cGVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMD1vZmYsIDE9c2ltcGxlLCAyPWNvbXBsZXgKKyAgVlA4RkluZm8gZnN0cmVuZ3Roc19bTlVNX01CX1NFR01FTlRTXVsyXTsgIC8vIHByZWNhbGN1bGF0ZWQgcGVyLXNlZ21lbnQvdHlwZQorCisgIC8vIEFscGhhCisgIHN0cnVjdCBBTFBIRGVjb2RlciogYWxwaF9kZWNfOyAgLy8gYWxwaGEtcGxhbmUgZGVjb2RlciBvYmplY3QKKyAgY29uc3QgdWludDhfdCogYWxwaGFfZGF0YV87ICAgICAvLyBjb21wcmVzc2VkIGFscGhhIGRhdGEgKGlmIHByZXNlbnQpCisgIHNpemVfdCBhbHBoYV9kYXRhX3NpemVfOworICBpbnQgaXNfYWxwaGFfZGVjb2RlZF87ICAgICAgLy8gdHJ1ZSBpZiBhbHBoYV9kYXRhXyBpcyBkZWNvZGVkIGluIGFscGhhX3BsYW5lXworICB1aW50OF90KiBhbHBoYV9wbGFuZV9tZW1fOyAgLy8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgYWxwaGFfcGxhbmVfCisgIHVpbnQ4X3QqIGFscGhhX3BsYW5lXzsgICAgICAvLyBvdXRwdXQuIFBlcnNpc3RlbnQsIGNvbnRhaW5zIHRoZSB3aG9sZSBkYXRhLgorICBjb25zdCB1aW50OF90KiBhbHBoYV9wcmV2X2xpbmVfOyAgLy8gbGFzdCBkZWNvZGVkIGFscGhhIHJvdyAob3IgTlVMTCkKKyAgaW50IGFscGhhX2RpdGhlcmluZ187ICAgICAgIC8vIGRlcml2ZWQgZnJvbSBkZWNvZGluZyBvcHRpb25zICgwPW9mZiwgMTAwPWZ1bGwpCit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgorCisvLyBpbiB2cDguYworaW50IFZQOFNldEVycm9yKFZQOERlY29kZXIqIGNvbnN0IGRlYywKKyAgICAgICAgICAgICAgICBWUDhTdGF0dXNDb2RlIGVycm9yLCBjb25zdCBjaGFyKiBjb25zdCBtc2cpOworCisvLyBpbiB0cmVlLmMKK3ZvaWQgVlA4UmVzZXRQcm9iYShWUDhQcm9iYSogY29uc3QgcHJvYmEpOwordm9pZCBWUDhQYXJzZVByb2JhKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBwYXJzZXMgb25lIHJvdyBvZiBpbnRyYSBtb2RlIGRhdGEgaW4gcGFydGl0aW9uIDAsIHJldHVybnMgIWVvZgoraW50IFZQOFBhcnNlSW50cmFNb2RlUm93KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisKKy8vIGluIHF1YW50LmMKK3ZvaWQgVlA4UGFyc2VRdWFudChWUDhEZWNvZGVyKiBjb25zdCBkZWMpOworCisvLyBpbiBmcmFtZS5jCitpbnQgVlA4SW5pdEZyYW1lKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIENhbGwgaW8tPnNldHVwKCkgYW5kIGZpbmlzaCBzZXR0aW5nIHVwIHNjYW4gcGFyYW1ldGVycy4KKy8vIEFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLCBvbmUgbXVzdCBhbHdheXMgY2FsbCBWUDhFeGl0Q3JpdGljYWwoKSB3aXRoIHRoZQorLy8gc2FtZSBwYXJhbWV0ZXJzLiBCb3RoIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZCBpbiBwYWlyLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sKKy8vIGlmIG9rLCBvdGhlcndpc2Ugc2V0cyBhbmQgcmV0dXJucyB0aGUgZXJyb3Igc3RhdHVzIG9uICpkZWMuCitWUDhTdGF0dXNDb2RlIFZQOEVudGVyQ3JpdGljYWwoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGluIHBhaXIgd2l0aCBWUDhFbnRlckNyaXRpY2FsKCkuCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitpbnQgVlA4RXhpdENyaXRpY2FsKFZQOERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKTsKKy8vIFJldHVybiB0aGUgbXVsdGktdGhyZWFkaW5nIG1ldGhvZCB0byB1c2UgKDA9b2ZmKSwgZGVwZW5kaW5nCisvLyBvbiBvcHRpb25zIGFuZCBiaXRzdHJlYW0gc2l6ZS4gT25seSBmb3IgbG9zc3kgZGVjb2RpbmcuCitpbnQgVlA4R2V0VGhyZWFkTWV0aG9kKGNvbnN0IFdlYlBEZWNvZGVyT3B0aW9ucyogY29uc3Qgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKy8vIEluaXRpYWxpemUgZGl0aGVyaW5nIHBvc3QtcHJvY2VzcyBpZiBuZWVkZWQuCit2b2lkIFZQOEluaXREaXRoZXJpbmcoY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgIFZQOERlY29kZXIqIGNvbnN0IGRlYyk7CisvLyBQcm9jZXNzIHRoZSBsYXN0IGRlY29kZWQgcm93IChmaWx0ZXJpbmcgKyBvdXRwdXQpLgoraW50IFZQOFByb2Nlc3NSb3coVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhJbyogY29uc3QgaW8pOworLy8gVG8gYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBzY2FubGluZSwgdG8gaW5pdGlhbGl6ZSBwcmVkaWN0b3JzLgordm9pZCBWUDhJbml0U2NhbmxpbmUoVlA4RGVjb2RlciogY29uc3QgZGVjKTsKKy8vIERlY29kZSBvbmUgbWFjcm9ibG9jay4gUmV0dXJucyBmYWxzZSBpZiB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEuCitpbnQgVlA4RGVjb2RlTUIoVlA4RGVjb2RlciogY29uc3QgZGVjLCBWUDhCaXRSZWFkZXIqIGNvbnN0IHRva2VuX2JyKTsKKworLy8gaW4gYWxwaGEuYworY29uc3QgdWludDhfdCogVlA4RGVjb21wcmVzc0FscGhhUm93cyhWUDhEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOElvKiBjb25zdCBpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfREVDX1ZQOElfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxfZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxfZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3MjRiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZWMvdnA4bF9kZWMuYwpAQCAtMCwwICsxLDE2OTQgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBtYWluIGVudHJ5IGZvciB0aGUgZGVjb2RlcgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kZWMvYWxwaGFpX2RlYy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorI2luY2x1ZGUgInNyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBOVU1fQVJHQl9DQUNIRV9ST1dTICAgICAgICAgIDE2CisKK3N0YXRpYyBjb25zdCBpbnQga0NvZGVMZW5ndGhMaXRlcmFscyA9IDE2Oworc3RhdGljIGNvbnN0IGludCBrQ29kZUxlbmd0aFJlcGVhdENvZGUgPSAxNjsKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb2RlTGVuZ3RoRXh0cmFCaXRzWzNdID0geyAyLCAzLCA3IH07CitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZUxlbmd0aFJlcGVhdE9mZnNldHNbM10gPSB7IDMsIDMsIDExIH07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRml2ZSBIdWZmbWFuIGNvZGVzIGFyZSB1c2VkIGF0IGVhY2ggbWV0YSBjb2RlOgorLy8gIDEuIGdyZWVuICsgbGVuZ3RoIHByZWZpeCBjb2RlcyArIGNvbG9yIGNhY2hlIGNvZGVzLAorLy8gIDIuIGFscGhhLAorLy8gIDMuIHJlZCwKKy8vICA0LiBibHVlLCBhbmQsCisvLyAgNS4gZGlzdGFuY2UgcHJlZml4IGNvZGVzLgordHlwZWRlZiBlbnVtIHsKKyAgR1JFRU4gPSAwLAorICBSRUQgICA9IDEsCisgIEJMVUUgID0gMiwKKyAgQUxQSEEgPSAzLAorICBESVNUICA9IDQKK30gSHVmZkluZGV4OworCitzdGF0aWMgY29uc3QgdWludDE2X3Qga0FscGhhYmV0U2l6ZVtIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdID0geworICBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMsCisgIE5VTV9MSVRFUkFMX0NPREVTLCBOVU1fTElURVJBTF9DT0RFUywgTlVNX0xJVEVSQUxfQ09ERVMsCisgIE5VTV9ESVNUQU5DRV9DT0RFUworfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0xpdGVyYWxNYXBbSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFXSA9IHsKKyAgMCwgMSwgMSwgMSwgMAorfTsKKworI2RlZmluZSBOVU1fQ09ERV9MRU5HVEhfQ09ERVMgICAgICAgMTkKK3N0YXRpYyBjb25zdCB1aW50OF90IGtDb2RlTGVuZ3RoQ29kZU9yZGVyW05VTV9DT0RFX0xFTkdUSF9DT0RFU10gPSB7CisgIDE3LCAxOCwgMCwgMSwgMiwgMywgNCwgNSwgMTYsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUKK307CisKKyNkZWZpbmUgQ09ERV9UT19QTEFORV9DT0RFUyAgICAgICAgMTIwCitzdGF0aWMgY29uc3QgdWludDhfdCBrQ29kZVRvUGxhbmVbQ09ERV9UT19QTEFORV9DT0RFU10gPSB7CisgIDB4MTgsIDB4MDcsIDB4MTcsIDB4MTksIDB4MjgsIDB4MDYsIDB4MjcsIDB4MjksIDB4MTYsIDB4MWEsCisgIDB4MjYsIDB4MmEsIDB4MzgsIDB4MDUsIDB4MzcsIDB4MzksIDB4MTUsIDB4MWIsIDB4MzYsIDB4M2EsCisgIDB4MjUsIDB4MmIsIDB4NDgsIDB4MDQsIDB4NDcsIDB4NDksIDB4MTQsIDB4MWMsIDB4MzUsIDB4M2IsCisgIDB4NDYsIDB4NGEsIDB4MjQsIDB4MmMsIDB4NTgsIDB4NDUsIDB4NGIsIDB4MzQsIDB4M2MsIDB4MDMsCisgIDB4NTcsIDB4NTksIDB4MTMsIDB4MWQsIDB4NTYsIDB4NWEsIDB4MjMsIDB4MmQsIDB4NDQsIDB4NGMsCisgIDB4NTUsIDB4NWIsIDB4MzMsIDB4M2QsIDB4NjgsIDB4MDIsIDB4NjcsIDB4NjksIDB4MTIsIDB4MWUsCisgIDB4NjYsIDB4NmEsIDB4MjIsIDB4MmUsIDB4NTQsIDB4NWMsIDB4NDMsIDB4NGQsIDB4NjUsIDB4NmIsCisgIDB4MzIsIDB4M2UsIDB4NzgsIDB4MDEsIDB4NzcsIDB4NzksIDB4NTMsIDB4NWQsIDB4MTEsIDB4MWYsCisgIDB4NjQsIDB4NmMsIDB4NDIsIDB4NGUsIDB4NzYsIDB4N2EsIDB4MjEsIDB4MmYsIDB4NzUsIDB4N2IsCisgIDB4MzEsIDB4M2YsIDB4NjMsIDB4NmQsIDB4NTIsIDB4NWUsIDB4MDAsIDB4NzQsIDB4N2MsIDB4NDEsCisgIDB4NGYsIDB4MTAsIDB4MjAsIDB4NjIsIDB4NmUsIDB4MzAsIDB4NzMsIDB4N2QsIDB4NTEsIDB4NWYsCisgIDB4NDAsIDB4NzIsIDB4N2UsIDB4NjEsIDB4NmYsIDB4NTAsIDB4NzEsIDB4N2YsIDB4NjAsIDB4NzAKK307CisKKy8vIE1lbW9yeSBuZWVkZWQgZm9yIGxvb2t1cCB0YWJsZXMgb2Ygb25lIEh1ZmZtYW4gdHJlZSBncm91cC4gUmVkLCBibHVlLCBhbHBoYQorLy8gYW5kIGRpc3RhbmNlIGFscGhhYmV0cyBhcmUgY29uc3RhbnQgKDI1NiBmb3IgcmVkLCBibHVlIGFuZCBhbHBoYSwgNDAgZm9yCisvLyBkaXN0YW5jZSkgYW5kIGxvb2t1cCB0YWJsZSBzaXplcyBmb3IgdGhlbSBpbiB3b3JzdCBjYXNlIGFyZSA2MzAgYW5kIDQxMAorLy8gcmVzcGVjdGl2ZWx5LiBTaXplIG9mIGdyZWVuIGFscGhhYmV0IGRlcGVuZHMgb24gY29sb3IgY2FjaGUgc2l6ZSBhbmQgaXMgZXF1YWwKKy8vIHRvIDI1NiAoZ3JlZW4gY29tcG9uZW50IHZhbHVlcykgKyAyNCAobGVuZ3RoIHByZWZpeCB2YWx1ZXMpCisvLyArIGNvbG9yX2NhY2hlX3NpemUgKGJldHdlZW4gMCBhbmQgMjA0OCkuCisvLyBBbGwgdmFsdWVzIGNvbXB1dGVkIGZvciA4LWJpdCBmaXJzdCBsZXZlbCBsb29rdXAgd2l0aCBNYXJrIEFkbGVyJ3MgdG9vbDoKKy8vIGh0dHA6Ly93d3cuaGRmZ3JvdXAub3JnL2Z0cC9saWItZXh0ZXJuYWwvemxpYi96bGliLTEuMi41L2V4YW1wbGVzL2Vub3VnaC5jCisjZGVmaW5lIEZJWEVEX1RBQkxFX1NJWkUgKDYzMCAqIDMgKyA0MTApCitzdGF0aWMgY29uc3QgdWludDE2X3Qga1RhYmxlU2l6ZVsxMl0gPSB7CisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTQsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTYsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NTgsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NjIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2NzAsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA2ODYsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA3MTgsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA3ODIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyA5MTIsCisgIEZJWEVEX1RBQkxFX1NJWkUgKyAxMTY4LAorICBGSVhFRF9UQUJMRV9TSVpFICsgMTY4MCwKKyAgRklYRURfVEFCTEVfU0laRSArIDI3MDQKK307CisKK3N0YXRpYyBpbnQgRGVjb2RlSW1hZ2VTdHJlYW0oaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sZXZlbDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiogY29uc3QgZGVjb2RlZF9kYXRhKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFZQOExDaGVja1NpZ25hdHVyZShjb25zdCB1aW50OF90KiBjb25zdCBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICByZXR1cm4gKHNpemUgPj0gVlA4TF9GUkFNRV9IRUFERVJfU0laRSAmJgorICAgICAgICAgIGRhdGFbMF0gPT0gVlA4TF9NQUdJQ19CWVRFICYmCisgICAgICAgICAgKGRhdGFbNF0gPj4gNSkgPT0gMCk7ICAvLyB2ZXJzaW9uCit9CisKK3N0YXRpYyBpbnQgUmVhZEltYWdlSW5mbyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc19hbHBoYSkgeworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCA4KSAhPSBWUDhMX01BR0lDX0JZVEUpIHJldHVybiAwOworICAqd2lkdGggPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7CisgICpoZWlnaHQgPSBWUDhMUmVhZEJpdHMoYnIsIFZQOExfSU1BR0VfU0laRV9CSVRTKSArIDE7CisgICpoYXNfYWxwaGEgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCBWUDhMX1ZFUlNJT05fQklUUykgIT0gMCkgcmV0dXJuIDA7CisgIHJldHVybiAhYnItPmVvc187Cit9CisKK2ludCBWUDhMR2V0SW5mbyhjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0LCBpbnQqIGNvbnN0IGhhc19hbHBoYSkgeworICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFZQOExfRlJBTUVfSEVBREVSX1NJWkUpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBub3QgZW5vdWdoIGRhdGEKKyAgfSBlbHNlIGlmICghVlA4TENoZWNrU2lnbmF0dXJlKGRhdGEsIGRhdGFfc2l6ZSkpIHsKKyAgICByZXR1cm4gMDsgICAgICAgICAvLyBiYWQgc2lnbmF0dXJlCisgIH0gZWxzZSB7CisgICAgaW50IHcsIGgsIGE7CisgICAgVlA4TEJpdFJlYWRlciBicjsKKyAgICBWUDhMSW5pdEJpdFJlYWRlcigmYnIsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgaWYgKCFSZWFkSW1hZ2VJbmZvKCZiciwgJncsICZoLCAmYSkpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gdzsKKyAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBoOworICAgIGlmIChoYXNfYWxwaGEgIT0gTlVMTCkgKmhhc19hbHBoYSA9IGE7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRDb3B5RGlzdGFuY2UoaW50IGRpc3RhbmNlX3N5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGludCBleHRyYV9iaXRzLCBvZmZzZXQ7CisgIGlmIChkaXN0YW5jZV9zeW1ib2wgPCA0KSB7CisgICAgcmV0dXJuIGRpc3RhbmNlX3N5bWJvbCArIDE7CisgIH0KKyAgZXh0cmFfYml0cyA9IChkaXN0YW5jZV9zeW1ib2wgLSAyKSA+PiAxOworICBvZmZzZXQgPSAoMiArIChkaXN0YW5jZV9zeW1ib2wgJiAxKSkgPDwgZXh0cmFfYml0czsKKyAgcmV0dXJuIG9mZnNldCArIFZQOExSZWFkQml0cyhiciwgZXh0cmFfYml0cykgKyAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldENvcHlMZW5ndGgoaW50IGxlbmd0aF9zeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgLy8gTGVuZ3RoIGFuZCBkaXN0YW5jZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkuCisgIHJldHVybiBHZXRDb3B5RGlzdGFuY2UobGVuZ3RoX3N5bWJvbCwgYnIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBsYW5lQ29kZVRvRGlzdGFuY2UoaW50IHhzaXplLCBpbnQgcGxhbmVfY29kZSkgeworICBpZiAocGxhbmVfY29kZSA+IENPREVfVE9fUExBTkVfQ09ERVMpIHsKKyAgICByZXR1cm4gcGxhbmVfY29kZSAtIENPREVfVE9fUExBTkVfQ09ERVM7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGRpc3RfY29kZSA9IGtDb2RlVG9QbGFuZVtwbGFuZV9jb2RlIC0gMV07CisgICAgY29uc3QgaW50IHlvZmZzZXQgPSBkaXN0X2NvZGUgPj4gNDsKKyAgICBjb25zdCBpbnQgeG9mZnNldCA9IDggLSAoZGlzdF9jb2RlICYgMHhmKTsKKyAgICBjb25zdCBpbnQgZGlzdCA9IHlvZmZzZXQgKiB4c2l6ZSArIHhvZmZzZXQ7CisgICAgcmV0dXJuIChkaXN0ID49IDEpID8gZGlzdCA6IDE7ICAvLyBkaXN0PDEgY2FuIGhhcHBlbiBpZiB4c2l6ZSBpcyB2ZXJ5IHNtYWxsCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kZXMgdGhlIG5leHQgSHVmZm1hbiBjb2RlIGZyb20gYml0LXN0cmVhbS4KKy8vIEZpbGxCaXRXaW5kb3coYnIpIG5lZWRzIHRvIGJlIGNhbGxlZCBhdCBtaW5pbXVtIGV2ZXJ5IHNlY29uZCBjYWxsCisvLyB0byBSZWFkU3ltYm9sLCBpbiBvcmRlciB0byBwcmUtZmV0Y2ggZW5vdWdoIGJpdHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFJlYWRTeW1ib2woY29uc3QgSHVmZm1hbkNvZGUqIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGludCBuYml0czsKKyAgdWludDMyX3QgdmFsID0gVlA4TFByZWZldGNoQml0cyhicik7CisgIHRhYmxlICs9IHZhbCAmIEhVRkZNQU5fVEFCTEVfTUFTSzsKKyAgbmJpdHMgPSB0YWJsZS0+Yml0cyAtIEhVRkZNQU5fVEFCTEVfQklUUzsKKyAgaWYgKG5iaXRzID4gMCkgeworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIEhVRkZNQU5fVEFCTEVfQklUUyk7CisgICAgdmFsID0gVlA4TFByZWZldGNoQml0cyhicik7CisgICAgdGFibGUgKz0gdGFibGUtPnZhbHVlOworICAgIHRhYmxlICs9IHZhbCAmICgoMSA8PCBuYml0cykgLSAxKTsKKyAgfQorICBWUDhMU2V0Qml0UG9zKGJyLCBici0+Yml0X3Bvc18gKyB0YWJsZS0+Yml0cyk7CisgIHJldHVybiB0YWJsZS0+dmFsdWU7Cit9CisKKy8vIFJlYWRzIHBhY2tlZCBzeW1ib2wgZGVwZW5kaW5nIG9uIEdSRUVOIGNoYW5uZWwKKyNkZWZpbmUgQklUU19TUEVDSUFMX01BUktFUiAweDEwMCAgLy8gc29tZXRoaW5nIGxhcmdlIGVub3VnaCAoYW5kIGEgYml0LW1hc2spCisjZGVmaW5lIFBBQ0tFRF9OT05fTElURVJBTF9DT0RFIDAgIC8vIG11c3QgYmUgPCBOVU1fTElURVJBTF9DT0RFUworc3RhdGljIFdFQlBfSU5MSU5FIGludCBSZWFkUGFja2VkU3ltYm9scyhjb25zdCBIVHJlZUdyb3VwKiBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QgdmFsID0gVlA4TFByZWZldGNoQml0cyhicikgJiAoSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRSAtIDEpOworICBjb25zdCBIdWZmbWFuQ29kZTMyIGNvZGUgPSBncm91cC0+cGFja2VkX3RhYmxlW3ZhbF07CisgIGFzc2VydChncm91cC0+dXNlX3BhY2tlZF90YWJsZSk7CisgIGlmIChjb2RlLmJpdHMgPCBCSVRTX1NQRUNJQUxfTUFSS0VSKSB7CisgICAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgY29kZS5iaXRzKTsKKyAgICAqZHN0ID0gY29kZS52YWx1ZTsKKyAgICByZXR1cm4gUEFDS0VEX05PTl9MSVRFUkFMX0NPREU7CisgIH0gZWxzZSB7CisgICAgVlA4TFNldEJpdFBvcyhiciwgYnItPmJpdF9wb3NfICsgY29kZS5iaXRzIC0gQklUU19TUEVDSUFMX01BUktFUik7CisgICAgYXNzZXJ0KGNvZGUudmFsdWUgPj0gTlVNX0xJVEVSQUxfQ09ERVMpOworICAgIHJldHVybiBjb2RlLnZhbHVlOworICB9Cit9CisKK3N0YXRpYyBpbnQgQWNjdW11bGF0ZUhDb2RlKEh1ZmZtYW5Db2RlIGhjb2RlLCBpbnQgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuQ29kZTMyKiBjb25zdCBodWZmKSB7CisgIGh1ZmYtPmJpdHMgKz0gaGNvZGUuYml0czsKKyAgaHVmZi0+dmFsdWUgfD0gKHVpbnQzMl90KWhjb2RlLnZhbHVlIDw8IHNoaWZ0OworICBhc3NlcnQoaHVmZi0+Yml0cyA8PSBIVUZGTUFOX1RBQkxFX0JJVFMpOworICByZXR1cm4gaGNvZGUuYml0czsKK30KKworc3RhdGljIHZvaWQgQnVpbGRQYWNrZWRUYWJsZShIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cCkgeworICB1aW50MzJfdCBjb2RlOworICBmb3IgKGNvZGUgPSAwOyBjb2RlIDwgSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRTsgKytjb2RlKSB7CisgICAgdWludDMyX3QgYml0cyA9IGNvZGU7CisgICAgSHVmZm1hbkNvZGUzMiogY29uc3QgaHVmZiA9ICZodHJlZV9ncm91cC0+cGFja2VkX3RhYmxlW2JpdHNdOworICAgIEh1ZmZtYW5Db2RlIGhjb2RlID0gaHRyZWVfZ3JvdXAtPmh0cmVlc1tHUkVFTl1bYml0c107CisgICAgaWYgKGhjb2RlLnZhbHVlID49IE5VTV9MSVRFUkFMX0NPREVTKSB7CisgICAgICBodWZmLT5iaXRzID0gaGNvZGUuYml0cyArIEJJVFNfU1BFQ0lBTF9NQVJLRVI7CisgICAgICBodWZmLT52YWx1ZSA9IGhjb2RlLnZhbHVlOworICAgIH0gZWxzZSB7CisgICAgICBodWZmLT5iaXRzID0gMDsKKyAgICAgIGh1ZmYtPnZhbHVlID0gMDsKKyAgICAgIGJpdHMgPj49IEFjY3VtdWxhdGVIQ29kZShoY29kZSwgOCwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tSRURdW2JpdHNdLCAxNiwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tCTFVFXVtiaXRzXSwgMCwgaHVmZik7CisgICAgICBiaXRzID4+PSBBY2N1bXVsYXRlSENvZGUoaHRyZWVfZ3JvdXAtPmh0cmVlc1tBTFBIQV1bYml0c10sIDI0LCBodWZmKTsKKyAgICAgICh2b2lkKWJpdHM7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocygKKyAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLCBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywKKyAgICBpbnQgbnVtX3N5bWJvbHMsIGludCogY29uc3QgY29kZV9sZW5ndGhzKSB7CisgIGludCBvayA9IDA7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBpbnQgc3ltYm9sOworICBpbnQgbWF4X3N5bWJvbDsKKyAgaW50IHByZXZfY29kZV9sZW4gPSBERUZBVUxUX0NPREVfTEVOR1RIOworICBIdWZmbWFuQ29kZSB0YWJsZVsxIDw8IExFTkdUSFNfVEFCTEVfQklUU107CisKKyAgaWYgKCFWUDhMQnVpbGRIdWZmbWFuVGFibGUodGFibGUsIExFTkdUSFNfVEFCTEVfQklUUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fQ09ERV9MRU5HVEhfQ09ERVMpKSB7CisgICAgZ290byBFbmQ7CisgIH0KKworICBpZiAoVlA4TFJlYWRCaXRzKGJyLCAxKSkgeyAgICAvLyB1c2UgbGVuZ3RoCisgICAgY29uc3QgaW50IGxlbmd0aF9uYml0cyA9IDIgKyAyICogVlA4TFJlYWRCaXRzKGJyLCAzKTsKKyAgICBtYXhfc3ltYm9sID0gMiArIFZQOExSZWFkQml0cyhiciwgbGVuZ3RoX25iaXRzKTsKKyAgICBpZiAobWF4X3N5bWJvbCA+IG51bV9zeW1ib2xzKSB7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWF4X3N5bWJvbCA9IG51bV9zeW1ib2xzOworICB9CisKKyAgc3ltYm9sID0gMDsKKyAgd2hpbGUgKHN5bWJvbCA8IG51bV9zeW1ib2xzKSB7CisgICAgY29uc3QgSHVmZm1hbkNvZGUqIHA7CisgICAgaW50IGNvZGVfbGVuOworICAgIGlmIChtYXhfc3ltYm9sLS0gPT0gMCkgYnJlYWs7CisgICAgVlA4TEZpbGxCaXRXaW5kb3coYnIpOworICAgIHAgPSAmdGFibGVbVlA4TFByZWZldGNoQml0cyhicikgJiBMRU5HVEhTX1RBQkxFX01BU0tdOworICAgIFZQOExTZXRCaXRQb3MoYnIsIGJyLT5iaXRfcG9zXyArIHAtPmJpdHMpOworICAgIGNvZGVfbGVuID0gcC0+dmFsdWU7CisgICAgaWYgKGNvZGVfbGVuIDwga0NvZGVMZW5ndGhMaXRlcmFscykgeworICAgICAgY29kZV9sZW5ndGhzW3N5bWJvbCsrXSA9IGNvZGVfbGVuOworICAgICAgaWYgKGNvZGVfbGVuICE9IDApIHByZXZfY29kZV9sZW4gPSBjb2RlX2xlbjsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgaW50IHVzZV9wcmV2ID0gKGNvZGVfbGVuID09IGtDb2RlTGVuZ3RoUmVwZWF0Q29kZSk7CisgICAgICBjb25zdCBpbnQgc2xvdCA9IGNvZGVfbGVuIC0ga0NvZGVMZW5ndGhMaXRlcmFsczsKKyAgICAgIGNvbnN0IGludCBleHRyYV9iaXRzID0ga0NvZGVMZW5ndGhFeHRyYUJpdHNbc2xvdF07CisgICAgICBjb25zdCBpbnQgcmVwZWF0X29mZnNldCA9IGtDb2RlTGVuZ3RoUmVwZWF0T2Zmc2V0c1tzbG90XTsKKyAgICAgIGludCByZXBlYXQgPSBWUDhMUmVhZEJpdHMoYnIsIGV4dHJhX2JpdHMpICsgcmVwZWF0X29mZnNldDsKKyAgICAgIGlmIChzeW1ib2wgKyByZXBlYXQgPiBudW1fc3ltYm9scykgeworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCBsZW5ndGggPSB1c2VfcHJldiA/IHByZXZfY29kZV9sZW4gOiAwOworICAgICAgICB3aGlsZSAocmVwZWF0LS0gPiAwKSBjb2RlX2xlbmd0aHNbc3ltYm9sKytdID0gbGVuZ3RoOworICAgICAgfQorICAgIH0KKyAgfQorICBvayA9IDE7CisKKyBFbmQ6CisgIGlmICghb2spIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICByZXR1cm4gb2s7Cit9CisKKy8vICdjb2RlX2xlbmd0aHMnIGlzIHByZS1hbGxvY2F0ZWQgdGVtcG9yYXJ5IGJ1ZmZlciwgdXNlZCBmb3IgY3JlYXRpbmcgSHVmZm1hbgorLy8gdHJlZS4KK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlKGludCBhbHBoYWJldF9zaXplLCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsIEh1ZmZtYW5Db2RlKiBjb25zdCB0YWJsZSkgeworICBpbnQgb2sgPSAwOworICBpbnQgc2l6ZSA9IDA7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBjb25zdCBpbnQgc2ltcGxlX2NvZGUgPSBWUDhMUmVhZEJpdHMoYnIsIDEpOworCisgIG1lbXNldChjb2RlX2xlbmd0aHMsIDAsIGFscGhhYmV0X3NpemUgKiBzaXplb2YoKmNvZGVfbGVuZ3RocykpOworCisgIGlmIChzaW1wbGVfY29kZSkgeyAgLy8gUmVhZCBzeW1ib2xzLCBjb2RlcyAmIGNvZGUgbGVuZ3RocyBkaXJlY3RseS4KKyAgICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPSBWUDhMUmVhZEJpdHMoYnIsIDEpICsgMTsKKyAgICBjb25zdCBpbnQgZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID0gVlA4TFJlYWRCaXRzKGJyLCAxKTsKKyAgICAvLyBUaGUgZmlyc3QgY29kZSBpcyBlaXRoZXIgMSBiaXQgb3IgOCBiaXQgY29kZS4KKyAgICBpbnQgc3ltYm9sID0gVlA4TFJlYWRCaXRzKGJyLCAoZmlyc3Rfc3ltYm9sX2xlbl9jb2RlID09IDApID8gMSA6IDgpOworICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xdID0gMTsKKyAgICAvLyBUaGUgc2Vjb25kIGNvZGUgKGlmIHByZXNlbnQpLCBpcyBhbHdheXMgOCBiaXQgbG9uZy4KKyAgICBpZiAobnVtX3N5bWJvbHMgPT0gMikgeworICAgICAgc3ltYm9sID0gVlA4TFJlYWRCaXRzKGJyLCA4KTsKKyAgICAgIGNvZGVfbGVuZ3Roc1tzeW1ib2xdID0gMTsKKyAgICB9CisgICAgb2sgPSAxOworICB9IGVsc2UgeyAgLy8gRGVjb2RlIEh1ZmZtYW4tY29kZWQgY29kZSBsZW5ndGhzLgorICAgIGludCBpOworICAgIGludCBjb2RlX2xlbmd0aF9jb2RlX2xlbmd0aHNbTlVNX0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICAgIGNvbnN0IGludCBudW1fY29kZXMgPSBWUDhMUmVhZEJpdHMoYnIsIDQpICsgNDsKKyAgICBpZiAobnVtX2NvZGVzID4gTlVNX0NPREVfTEVOR1RIX0NPREVTKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fY29kZXM7ICsraSkgeworICAgICAgY29kZV9sZW5ndGhfY29kZV9sZW5ndGhzW2tDb2RlTGVuZ3RoQ29kZU9yZGVyW2ldXSA9IFZQOExSZWFkQml0cyhiciwgMyk7CisgICAgfQorICAgIG9rID0gUmVhZEh1ZmZtYW5Db2RlTGVuZ3RocyhkZWMsIGNvZGVfbGVuZ3RoX2NvZGVfbGVuZ3RocywgYWxwaGFiZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzKTsKKyAgfQorCisgIG9rID0gb2sgJiYgIWJyLT5lb3NfOworICBpZiAob2spIHsKKyAgICBzaXplID0gVlA4TEJ1aWxkSHVmZm1hblRhYmxlKHRhYmxlLCBIVUZGTUFOX1RBQkxFX0JJVFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlX2xlbmd0aHMsIGFscGhhYmV0X3NpemUpOworICB9CisgIGlmICghb2sgfHwgc2l6ZSA9PSAwKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgUmVhZEh1ZmZtYW5Db2RlcyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgeHNpemUsIGludCB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29sb3JfY2FjaGVfYml0cywgaW50IGFsbG93X3JlY3Vyc2lvbikgeworICBpbnQgaSwgajsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgdWludDMyX3QqIGh1ZmZtYW5faW1hZ2UgPSBOVUxMOworICBIVHJlZUdyb3VwKiBodHJlZV9ncm91cHMgPSBOVUxMOworICBIdWZmbWFuQ29kZSogaHVmZm1hbl90YWJsZXMgPSBOVUxMOworICBIdWZmbWFuQ29kZSogbmV4dCA9IE5VTEw7CisgIGludCBudW1faHRyZWVfZ3JvdXBzID0gMTsKKyAgaW50IG1heF9hbHBoYWJldF9zaXplID0gMDsKKyAgaW50KiBjb2RlX2xlbmd0aHMgPSBOVUxMOworICBjb25zdCBpbnQgdGFibGVfc2l6ZSA9IGtUYWJsZVNpemVbY29sb3JfY2FjaGVfYml0c107CisKKyAgaWYgKGFsbG93X3JlY3Vyc2lvbiAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgLy8gdXNlIG1ldGEgSHVmZm1hbiBjb2Rlcy4KKyAgICBjb25zdCBpbnQgaHVmZm1hbl9wcmVjaXNpb24gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKKyAgICBjb25zdCBpbnQgaHVmZm1hbl94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBodWZmbWFuX3ByZWNpc2lvbik7CisgICAgY29uc3QgaW50IGh1ZmZtYW5feXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh5c2l6ZSwgaHVmZm1hbl9wcmVjaXNpb24pOworICAgIGNvbnN0IGludCBodWZmbWFuX3BpeHMgPSBodWZmbWFuX3hzaXplICogaHVmZm1hbl95c2l6ZTsKKyAgICBpZiAoIURlY29kZUltYWdlU3RyZWFtKGh1ZmZtYW5feHNpemUsIGh1ZmZtYW5feXNpemUsIDAsIGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZodWZmbWFuX2ltYWdlKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaGRyLT5odWZmbWFuX3N1YnNhbXBsZV9iaXRzXyA9IGh1ZmZtYW5fcHJlY2lzaW9uOworICAgIGZvciAoaSA9IDA7IGkgPCBodWZmbWFuX3BpeHM7ICsraSkgeworICAgICAgLy8gVGhlIGh1ZmZtYW4gZGF0YSBpcyBzdG9yZWQgaW4gcmVkIGFuZCBncmVlbiBieXRlcy4KKyAgICAgIGNvbnN0IGludCBncm91cCA9IChodWZmbWFuX2ltYWdlW2ldID4+IDgpICYgMHhmZmZmOworICAgICAgaHVmZm1hbl9pbWFnZVtpXSA9IGdyb3VwOworICAgICAgaWYgKGdyb3VwID49IG51bV9odHJlZV9ncm91cHMpIHsKKyAgICAgICAgbnVtX2h0cmVlX2dyb3VwcyA9IGdyb3VwICsgMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBpZiAoYnItPmVvc18pIGdvdG8gRXJyb3I7CisKKyAgLy8gRmluZCBtYXhpbXVtIGFscGhhYmV0IHNpemUgZm9yIHRoZSBodHJlZSBncm91cC4KKyAgZm9yIChqID0gMDsgaiA8IEhVRkZNQU5fQ09ERVNfUEVSX01FVEFfQ09ERTsgKytqKSB7CisgICAgaW50IGFscGhhYmV0X3NpemUgPSBrQWxwaGFiZXRTaXplW2pdOworICAgIGlmIChqID09IDAgJiYgY29sb3JfY2FjaGVfYml0cyA+IDApIHsKKyAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgIH0KKyAgICBpZiAobWF4X2FscGhhYmV0X3NpemUgPCBhbHBoYWJldF9zaXplKSB7CisgICAgICBtYXhfYWxwaGFiZXRfc2l6ZSA9IGFscGhhYmV0X3NpemU7CisgICAgfQorICB9CisKKyAgaHVmZm1hbl90YWJsZXMgPSAoSHVmZm1hbkNvZGUqKVdlYlBTYWZlTWFsbG9jKG51bV9odHJlZV9ncm91cHMgKiB0YWJsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodWZmbWFuX3RhYmxlcykpOworICBodHJlZV9ncm91cHMgPSBWUDhMSHRyZWVHcm91cHNOZXcobnVtX2h0cmVlX2dyb3Vwcyk7CisgIGNvZGVfbGVuZ3RocyA9IChpbnQqKVdlYlBTYWZlQ2FsbG9jKCh1aW50NjRfdCltYXhfYWxwaGFiZXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpjb2RlX2xlbmd0aHMpKTsKKworICBpZiAoaHRyZWVfZ3JvdXBzID09IE5VTEwgfHwgY29kZV9sZW5ndGhzID09IE5VTEwgfHwgaHVmZm1hbl90YWJsZXMgPT0gTlVMTCkgeworICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgbmV4dCA9IGh1ZmZtYW5fdGFibGVzOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2h0cmVlX2dyb3VwczsgKytpKSB7CisgICAgSFRyZWVHcm91cCogY29uc3QgaHRyZWVfZ3JvdXAgPSAmaHRyZWVfZ3JvdXBzW2ldOworICAgIEh1ZmZtYW5Db2RlKiogY29uc3QgaHRyZWVzID0gaHRyZWVfZ3JvdXAtPmh0cmVlczsKKyAgICBpbnQgc2l6ZTsKKyAgICBpbnQgdG90YWxfc2l6ZSA9IDA7CisgICAgaW50IGlzX3RyaXZpYWxfbGl0ZXJhbCA9IDE7CisgICAgaW50IG1heF9iaXRzID0gMDsKKyAgICBmb3IgKGogPSAwOyBqIDwgSFVGRk1BTl9DT0RFU19QRVJfTUVUQV9DT0RFOyArK2opIHsKKyAgICAgIGludCBhbHBoYWJldF9zaXplID0ga0FscGhhYmV0U2l6ZVtqXTsKKyAgICAgIGh0cmVlc1tqXSA9IG5leHQ7CisgICAgICBpZiAoaiA9PSAwICYmIGNvbG9yX2NhY2hlX2JpdHMgPiAwKSB7CisgICAgICAgIGFscGhhYmV0X3NpemUgKz0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgICAgfQorICAgICAgc2l6ZSA9IFJlYWRIdWZmbWFuQ29kZShhbHBoYWJldF9zaXplLCBkZWMsIGNvZGVfbGVuZ3RocywgbmV4dCk7CisgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBpZiAoaXNfdHJpdmlhbF9saXRlcmFsICYmIGtMaXRlcmFsTWFwW2pdID09IDEpIHsKKyAgICAgICAgaXNfdHJpdmlhbF9saXRlcmFsID0gKG5leHQtPmJpdHMgPT0gMCk7CisgICAgICB9CisgICAgICB0b3RhbF9zaXplICs9IG5leHQtPmJpdHM7CisgICAgICBuZXh0ICs9IHNpemU7CisgICAgICBpZiAoaiA8PSBBTFBIQSkgeworICAgICAgICBpbnQgbG9jYWxfbWF4X2JpdHMgPSBjb2RlX2xlbmd0aHNbMF07CisgICAgICAgIGludCBrOworICAgICAgICBmb3IgKGsgPSAxOyBrIDwgYWxwaGFiZXRfc2l6ZTsgKytrKSB7CisgICAgICAgICAgaWYgKGNvZGVfbGVuZ3Roc1trXSA+IGxvY2FsX21heF9iaXRzKSB7CisgICAgICAgICAgICBsb2NhbF9tYXhfYml0cyA9IGNvZGVfbGVuZ3Roc1trXTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWF4X2JpdHMgKz0gbG9jYWxfbWF4X2JpdHM7CisgICAgICB9CisgICAgfQorICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2xpdGVyYWwgPSBpc190cml2aWFsX2xpdGVyYWw7CisgICAgaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSA9IDA7CisgICAgaWYgKGlzX3RyaXZpYWxfbGl0ZXJhbCkgeworICAgICAgY29uc3QgaW50IHJlZCA9IGh0cmVlc1tSRURdWzBdLnZhbHVlOworICAgICAgY29uc3QgaW50IGJsdWUgPSBodHJlZXNbQkxVRV1bMF0udmFsdWU7CisgICAgICBjb25zdCBpbnQgYWxwaGEgPSBodHJlZXNbQUxQSEFdWzBdLnZhbHVlOworICAgICAgaHRyZWVfZ3JvdXAtPmxpdGVyYWxfYXJiID0KKyAgICAgICAgICAoKHVpbnQzMl90KWFscGhhIDw8IDI0KSB8IChyZWQgPDwgMTYpIHwgYmx1ZTsKKyAgICAgIGlmICh0b3RhbF9zaXplID09IDAgJiYgaHRyZWVzW0dSRUVOXVswXS52YWx1ZSA8IE5VTV9MSVRFUkFMX0NPREVTKSB7CisgICAgICAgIGh0cmVlX2dyb3VwLT5pc190cml2aWFsX2NvZGUgPSAxOworICAgICAgICBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmIgfD0gaHRyZWVzW0dSRUVOXVswXS52YWx1ZSA8PCA4OworICAgICAgfQorICAgIH0KKyAgICBodHJlZV9ncm91cC0+dXNlX3BhY2tlZF90YWJsZSA9ICFodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9jb2RlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4X2JpdHMgPCBIVUZGTUFOX1BBQ0tFRF9CSVRTKTsKKyAgICBpZiAoaHRyZWVfZ3JvdXAtPnVzZV9wYWNrZWRfdGFibGUpIEJ1aWxkUGFja2VkVGFibGUoaHRyZWVfZ3JvdXApOworICB9CisgIFdlYlBTYWZlRnJlZShjb2RlX2xlbmd0aHMpOworCisgIC8vIEFsbCBPSy4gRmluYWxpemUgcG9pbnRlcnMgYW5kIHJldHVybi4KKyAgaGRyLT5odWZmbWFuX2ltYWdlXyA9IGh1ZmZtYW5faW1hZ2U7CisgIGhkci0+bnVtX2h0cmVlX2dyb3Vwc18gPSBudW1faHRyZWVfZ3JvdXBzOworICBoZHItPmh0cmVlX2dyb3Vwc18gPSBodHJlZV9ncm91cHM7CisgIGhkci0+aHVmZm1hbl90YWJsZXNfID0gaHVmZm1hbl90YWJsZXM7CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIFdlYlBTYWZlRnJlZShjb2RlX2xlbmd0aHMpOworICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9pbWFnZSk7CisgIFdlYlBTYWZlRnJlZShodWZmbWFuX3RhYmxlcyk7CisgIFZQOExIdHJlZUdyb3Vwc0ZyZWUoaHRyZWVfZ3JvdXBzKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTY2FsaW5nLgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKK3N0YXRpYyBpbnQgQWxsb2NhdGVBbmRJbml0UmVzY2FsZXIoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgVlA4SW8qIGNvbnN0IGlvKSB7CisgIGNvbnN0IGludCBudW1fY2hhbm5lbHMgPSA0OworICBjb25zdCBpbnQgaW5fd2lkdGggPSBpby0+bWJfdzsKKyAgY29uc3QgaW50IG91dF93aWR0aCA9IGlvLT5zY2FsZWRfd2lkdGg7CisgIGNvbnN0IGludCBpbl9oZWlnaHQgPSBpby0+bWJfaDsKKyAgY29uc3QgaW50IG91dF9oZWlnaHQgPSBpby0+c2NhbGVkX2hlaWdodDsKKyAgY29uc3QgdWludDY0X3Qgd29ya19zaXplID0gMiAqIG51bV9jaGFubmVscyAqICh1aW50NjRfdClvdXRfd2lkdGg7CisgIHJlc2NhbGVyX3QqIHdvcms7ICAgICAgICAvLyBSZXNjYWxlciB3b3JrIGFyZWEuCisgIGNvbnN0IHVpbnQ2NF90IHNjYWxlZF9kYXRhX3NpemUgPSAodWludDY0X3Qpb3V0X3dpZHRoOworICB1aW50MzJfdCogc2NhbGVkX2RhdGE7ICAvLyBUZW1wb3Jhcnkgc3RvcmFnZSBmb3Igc2NhbGVkIEJHUkEgZGF0YS4KKyAgY29uc3QgdWludDY0X3QgbWVtb3J5X3NpemUgPSBzaXplb2YoKmRlYy0+cmVzY2FsZXIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrX3NpemUgKiBzaXplb2YoKndvcmspICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZWRfZGF0YV9zaXplICogc2l6ZW9mKCpzY2FsZWRfZGF0YSk7CisgIHVpbnQ4X3QqIG1lbW9yeSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhtZW1vcnlfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKKyAgaWYgKG1lbW9yeSA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIGFzc2VydChkZWMtPnJlc2NhbGVyX21lbW9yeSA9PSBOVUxMKTsKKyAgZGVjLT5yZXNjYWxlcl9tZW1vcnkgPSBtZW1vcnk7CisKKyAgZGVjLT5yZXNjYWxlciA9IChXZWJQUmVzY2FsZXIqKW1lbW9yeTsKKyAgbWVtb3J5ICs9IHNpemVvZigqZGVjLT5yZXNjYWxlcik7CisgIHdvcmsgPSAocmVzY2FsZXJfdCopbWVtb3J5OworICBtZW1vcnkgKz0gd29ya19zaXplICogc2l6ZW9mKCp3b3JrKTsKKyAgc2NhbGVkX2RhdGEgPSAodWludDMyX3QqKW1lbW9yeTsKKworICBXZWJQUmVzY2FsZXJJbml0KGRlYy0+cmVzY2FsZXIsIGluX3dpZHRoLCBpbl9oZWlnaHQsICh1aW50OF90KilzY2FsZWRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsIDAsIG51bV9jaGFubmVscywgd29yayk7CisgIHJldHVybiAxOworfQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfU0laRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRXhwb3J0IHRvIEFSR0IKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKy8vIFdlIGhhdmUgc3BlY2lhbCAiZXhwb3J0IiBmdW5jdGlvbiBzaW5jZSB3ZSBuZWVkIHRvIGNvbnZlcnQgZnJvbSBCR1JBCitzdGF0aWMgaW50IEV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UsCisgICAgICAgICAgICAgICAgICBpbnQgcmdiYV9zdHJpZGUsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgdWludDMyX3QqIGNvbnN0IHNyYyA9ICh1aW50MzJfdCopcmVzY2FsZXItPmRzdDsKKyAgY29uc3QgaW50IGRzdF93aWR0aCA9IHJlc2NhbGVyLT5kc3Rfd2lkdGg7CisgIGludCBudW1fbGluZXNfb3V0ID0gMDsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7CisgICAgdWludDhfdCogY29uc3QgZHN0ID0gcmdiYSArIG51bV9saW5lc19vdXQgKiByZ2JhX3N0cmlkZTsKKyAgICBXZWJQUmVzY2FsZXJFeHBvcnRSb3cocmVzY2FsZXIpOworICAgIFdlYlBNdWx0QVJHQlJvdyhzcmMsIGRzdF93aWR0aCwgMSk7CisgICAgVlA4TENvbnZlcnRGcm9tQkdSQShzcmMsIGRzdF93aWR0aCwgY29sb3JzcGFjZSwgZHN0KTsKKyAgICArK251bV9saW5lc19vdXQ7CisgIH0KKyAgcmV0dXJuIG51bV9saW5lc19vdXQ7Cit9CisKKy8vIEVtaXQgc2NhbGVkIHJvd3MuCitzdGF0aWMgaW50IEVtaXRSZXNjYWxlZFJvd3NSR0JBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGluLCBpbnQgaW5fc3RyaWRlLCBpbnQgbWJfaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgeworICBjb25zdCBXRUJQX0NTUF9NT0RFIGNvbG9yc3BhY2UgPSBkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2U7CisgIGludCBudW1fbGluZXNfaW4gPSAwOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChudW1fbGluZXNfaW4gPCBtYl9oKSB7CisgICAgdWludDhfdCogY29uc3Qgcm93X2luID0gaW4gKyBudW1fbGluZXNfaW4gKiBpbl9zdHJpZGU7CisgICAgdWludDhfdCogY29uc3Qgcm93X291dCA9IG91dCArIG51bV9saW5lc19vdXQgKiBvdXRfc3RyaWRlOworICAgIGNvbnN0IGludCBsaW5lc19sZWZ0ID0gbWJfaCAtIG51bV9saW5lc19pbjsKKyAgICBjb25zdCBpbnQgbmVlZGVkX2xpbmVzID0gV2ViUFJlc2NhbGVOZWVkZWRMaW5lcyhkZWMtPnJlc2NhbGVyLCBsaW5lc19sZWZ0KTsKKyAgICBpbnQgbGluZXNfaW1wb3J0ZWQ7CisgICAgYXNzZXJ0KG5lZWRlZF9saW5lcyA+IDAgJiYgbmVlZGVkX2xpbmVzIDw9IGxpbmVzX2xlZnQpOworICAgIFdlYlBNdWx0QVJHQlJvd3Mocm93X2luLCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBkZWMtPnJlc2NhbGVyLT5zcmNfd2lkdGgsIG5lZWRlZF9saW5lcywgMCk7CisgICAgbGluZXNfaW1wb3J0ZWQgPQorICAgICAgICBXZWJQUmVzY2FsZXJJbXBvcnQoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCwgcm93X2luLCBpbl9zdHJpZGUpOworICAgIGFzc2VydChsaW5lc19pbXBvcnRlZCA9PSBuZWVkZWRfbGluZXMpOworICAgIG51bV9saW5lc19pbiArPSBsaW5lc19pbXBvcnRlZDsKKyAgICBudW1fbGluZXNfb3V0ICs9IEV4cG9ydChkZWMtPnJlc2NhbGVyLCBjb2xvcnNwYWNlLCBvdXRfc3RyaWRlLCByb3dfb3V0KTsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfU0laRQorCisvLyBFbWl0IHJvd3Mgd2l0aG91dCBhbnkgc2NhbGluZy4KK3N0YXRpYyBpbnQgRW1pdFJvd3MoV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByb3dfaW4sIGludCBpbl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbWJfaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3Qgb3V0LCBpbnQgb3V0X3N0cmlkZSkgeworICBpbnQgbGluZXMgPSBtYl9oOworICB1aW50OF90KiByb3dfb3V0ID0gb3V0OworICB3aGlsZSAobGluZXMtLSA+IDApIHsKKyAgICBWUDhMQ29udmVydEZyb21CR1JBKChjb25zdCB1aW50MzJfdCopcm93X2luLCBtYl93LCBjb2xvcnNwYWNlLCByb3dfb3V0KTsKKyAgICByb3dfaW4gKz0gaW5fc3RyaWRlOworICAgIHJvd19vdXQgKz0gb3V0X3N0cmlkZTsKKyAgfQorICByZXR1cm4gbWJfaDsgIC8vIE51bSByb3dzIG91dCA9PSBudW0gcm93cyBpbi4KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4cG9ydCB0byBZVVZBCisKK3N0YXRpYyB2b2lkIENvbnZlcnRUb1lVVkEoY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywgaW50IHdpZHRoLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCkgeworICBjb25zdCBXZWJQWVVWQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5ZVVZBOworCisgIC8vIGZpcnN0LCB0aGUgbHVtYSBwbGFuZQorICBXZWJQQ29udmVydEFSR0JUb1koc3JjLCBidWYtPnkgKyB5X3BvcyAqIGJ1Zi0+eV9zdHJpZGUsIHdpZHRoKTsKKworICAvLyB0aGVuIFUvViBwbGFuZXMKKyAgeworICAgIHVpbnQ4X3QqIGNvbnN0IHUgPSBidWYtPnUgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnVfc3RyaWRlOworICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBidWYtPnYgKyAoeV9wb3MgPj4gMSkgKiBidWYtPnZfc3RyaWRlOworICAgIC8vIGV2ZW4gbGluZXM6IHN0b3JlIHZhbHVlcworICAgIC8vIG9kZCBsaW5lczogYXZlcmFnZSB3aXRoIHByZXZpb3VzIHZhbHVlcworICAgIFdlYlBDb252ZXJ0QVJHQlRvVVYoc3JjLCB1LCB2LCB3aWR0aCwgISh5X3BvcyAmIDEpKTsKKyAgfQorICAvLyBMYXN0bHksIHN0b3JlIGFscGhhIGlmIG5lZWRlZC4KKyAgaWYgKGJ1Zi0+YSAhPSBOVUxMKSB7CisgICAgdWludDhfdCogY29uc3QgYSA9IGJ1Zi0+YSArIHlfcG9zICogYnVmLT5hX3N0cmlkZTsKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgICBXZWJQRXh0cmFjdEFscGhhKCh1aW50OF90KilzcmMgKyAwLCAwLCB3aWR0aCwgMSwgYSwgMCk7CisjZWxzZQorICAgIFdlYlBFeHRyYWN0QWxwaGEoKHVpbnQ4X3QqKXNyYyArIDMsIDAsIHdpZHRoLCAxLCBhLCAwKTsKKyNlbmRpZgorICB9Cit9CisKK3N0YXRpYyBpbnQgRXhwb3J0WVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgeV9wb3MpIHsKKyAgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciA9IGRlYy0+cmVzY2FsZXI7CisgIHVpbnQzMl90KiBjb25zdCBzcmMgPSAodWludDMyX3QqKXJlc2NhbGVyLT5kc3Q7CisgIGNvbnN0IGludCBkc3Rfd2lkdGggPSByZXNjYWxlci0+ZHN0X3dpZHRoOworICBpbnQgbnVtX2xpbmVzX291dCA9IDA7CisgIHdoaWxlIChXZWJQUmVzY2FsZXJIYXNQZW5kaW5nT3V0cHV0KHJlc2NhbGVyKSkgeworICAgIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhyZXNjYWxlcik7CisgICAgV2ViUE11bHRBUkdCUm93KHNyYywgZHN0X3dpZHRoLCAxKTsKKyAgICBDb252ZXJ0VG9ZVVZBKHNyYywgZHN0X3dpZHRoLCB5X3BvcywgZGVjLT5vdXRwdXRfKTsKKyAgICArK3lfcG9zOworICAgICsrbnVtX2xpbmVzX291dDsKKyAgfQorICByZXR1cm4gbnVtX2xpbmVzX291dDsKK30KKworc3RhdGljIGludCBFbWl0UmVzY2FsZWRSb3dzWVVWQShjb25zdCBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwgaW50IG1iX2gpIHsKKyAgaW50IG51bV9saW5lc19pbiA9IDA7CisgIGludCB5X3BvcyA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgd2hpbGUgKG51bV9saW5lc19pbiA8IG1iX2gpIHsKKyAgICBjb25zdCBpbnQgbGluZXNfbGVmdCA9IG1iX2ggLSBudW1fbGluZXNfaW47CisgICAgY29uc3QgaW50IG5lZWRlZF9saW5lcyA9IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoZGVjLT5yZXNjYWxlciwgbGluZXNfbGVmdCk7CisgICAgaW50IGxpbmVzX2ltcG9ydGVkOworICAgIFdlYlBNdWx0QVJHQlJvd3MoaW4sIGluX3N0cmlkZSwgZGVjLT5yZXNjYWxlci0+c3JjX3dpZHRoLCBuZWVkZWRfbGluZXMsIDApOworICAgIGxpbmVzX2ltcG9ydGVkID0KKyAgICAgICAgV2ViUFJlc2NhbGVySW1wb3J0KGRlYy0+cmVzY2FsZXIsIGxpbmVzX2xlZnQsIGluLCBpbl9zdHJpZGUpOworICAgIGFzc2VydChsaW5lc19pbXBvcnRlZCA9PSBuZWVkZWRfbGluZXMpOworICAgIG51bV9saW5lc19pbiArPSBsaW5lc19pbXBvcnRlZDsKKyAgICBpbiArPSBuZWVkZWRfbGluZXMgKiBpbl9zdHJpZGU7CisgICAgeV9wb3MgKz0gRXhwb3J0WVVWQShkZWMsIHlfcG9zKTsKKyAgfQorICByZXR1cm4geV9wb3M7Cit9CisKK3N0YXRpYyBpbnQgRW1pdFJvd3NZVVZBKGNvbnN0IFZQOExEZWNvZGVyKiBjb25zdCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbiwgaW50IGluX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYl93LCBpbnQgbnVtX3Jvd3MpIHsKKyAgaW50IHlfcG9zID0gZGVjLT5sYXN0X291dF9yb3dfOworICB3aGlsZSAobnVtX3Jvd3MtLSA+IDApIHsKKyAgICBDb252ZXJ0VG9ZVVZBKChjb25zdCB1aW50MzJfdCopaW4sIG1iX3csIHlfcG9zLCBkZWMtPm91dHB1dF8pOworICAgIGluICs9IGluX3N0cmlkZTsKKyAgICArK3lfcG9zOworICB9CisgIHJldHVybiB5X3BvczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENyb3BwaW5nLgorCisvLyBTZXRzIGlvLT5tYl95LCBpby0+bWJfaCAmIGlvLT5tYl93IGFjY29yZGluZyB0byBzdGFydCByb3csIGVuZCByb3cgYW5kCisvLyBjcm9wIG9wdGlvbnMuIEFsc28gdXBkYXRlcyB0aGUgaW5wdXQgZGF0YSBwb2ludGVyLCBzbyB0aGF0IGl0IHBvaW50cyB0byB0aGUKKy8vIHN0YXJ0IG9mIHRoZSBjcm9wcGVkIHdpbmRvdy4gTm90ZSB0aGF0IHBpeGVscyBhcmUgaW4gQVJHQiBmb3JtYXQgZXZlbiBpZgorLy8gJ2luX2RhdGEnIGlzIHVpbnQ4X3QqLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjcm9wIHdpbmRvdyBpcyBub3QgZW1wdHkuCitzdGF0aWMgaW50IFNldENyb3BXaW5kb3coVlA4SW8qIGNvbnN0IGlvLCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBpbl9kYXRhLCBpbnQgcGl4ZWxfc3RyaWRlKSB7CisgIGFzc2VydCh5X3N0YXJ0IDwgeV9lbmQpOworICBhc3NlcnQoaW8tPmNyb3BfbGVmdCA8IGlvLT5jcm9wX3JpZ2h0KTsKKyAgaWYgKHlfZW5kID4gaW8tPmNyb3BfYm90dG9tKSB7CisgICAgeV9lbmQgPSBpby0+Y3JvcF9ib3R0b207ICAvLyBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZsb3cgb24gbGFzdCByb3cuCisgIH0KKyAgaWYgKHlfc3RhcnQgPCBpby0+Y3JvcF90b3ApIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBpby0+Y3JvcF90b3AgLSB5X3N0YXJ0OworICAgIHlfc3RhcnQgPSBpby0+Y3JvcF90b3A7CisgICAgKmluX2RhdGEgKz0gZGVsdGEgKiBwaXhlbF9zdHJpZGU7CisgIH0KKyAgaWYgKHlfc3RhcnQgPj0geV9lbmQpIHJldHVybiAwOyAgLy8gQ3JvcCB3aW5kb3cgaXMgZW1wdHkuCisKKyAgKmluX2RhdGEgKz0gaW8tPmNyb3BfbGVmdCAqIHNpemVvZih1aW50MzJfdCk7CisKKyAgaW8tPm1iX3kgPSB5X3N0YXJ0IC0gaW8tPmNyb3BfdG9wOworICBpby0+bWJfdyA9IGlvLT5jcm9wX3JpZ2h0IC0gaW8tPmNyb3BfbGVmdDsKKyAgaW8tPm1iX2ggPSB5X2VuZCAtIHlfc3RhcnQ7CisgIHJldHVybiAxOyAgLy8gTm9uLWVtcHR5IGNyb3Agd2luZG93LgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldE1ldGFJbmRleCgKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgaW1hZ2UsIGludCB4c2l6ZSwgaW50IGJpdHMsIGludCB4LCBpbnQgeSkgeworICBpZiAoYml0cyA9PSAwKSByZXR1cm4gMDsKKyAgcmV0dXJuIGltYWdlW3hzaXplICogKHkgPj4gYml0cykgKyAoeCA+PiBiaXRzKV07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBIVHJlZUdyb3VwKiBHZXRIdHJlZUdyb3VwRm9yUG9zKFZQOExNZXRhZGF0YSogY29uc3QgaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHgsIGludCB5KSB7CisgIGNvbnN0IGludCBtZXRhX2luZGV4ID0gR2V0TWV0YUluZGV4KGhkci0+aHVmZm1hbl9pbWFnZV8sIGhkci0+aHVmZm1hbl94c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c18sIHgsIHkpOworICBhc3NlcnQobWV0YV9pbmRleCA8IGhkci0+bnVtX2h0cmVlX2dyb3Vwc18pOworICByZXR1cm4gaGRyLT5odHJlZV9ncm91cHNfICsgbWV0YV9pbmRleDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gbG9vcCwgd2l0aCBjdXN0b20gcm93LXByb2Nlc3NpbmcgZnVuY3Rpb24KKwordHlwZWRlZiB2b2lkICgqUHJvY2Vzc1Jvd3NGdW5jKShWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgcm93KTsKKworc3RhdGljIHZvaWQgQXBwbHlJbnZlcnNlVHJhbnNmb3JtcyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCByb3dzKSB7CisgIGludCBuID0gZGVjLT5uZXh0X3RyYW5zZm9ybV87CisgIGNvbnN0IGludCBjYWNoZV9waXhzID0gZGVjLT53aWR0aF8gKiBudW1fcm93czsKKyAgY29uc3QgaW50IHN0YXJ0X3JvdyA9IGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgZW5kX3JvdyA9IHN0YXJ0X3JvdyArIG51bV9yb3dzOworICBjb25zdCB1aW50MzJfdCogcm93c19pbiA9IHJvd3M7CisgIHVpbnQzMl90KiBjb25zdCByb3dzX291dCA9IGRlYy0+YXJnYl9jYWNoZV87CisKKyAgLy8gSW52ZXJzZSB0cmFuc2Zvcm1zLgorICB3aGlsZSAobi0tID4gMCkgeworICAgIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfW25dOworICAgIFZQOExJbnZlcnNlVHJhbnNmb3JtKHRyYW5zZm9ybSwgc3RhcnRfcm93LCBlbmRfcm93LCByb3dzX2luLCByb3dzX291dCk7CisgICAgcm93c19pbiA9IHJvd3Nfb3V0OworICB9CisgIGlmIChyb3dzX2luICE9IHJvd3Nfb3V0KSB7CisgICAgLy8gTm8gdHJhbnNmb3JtIGNhbGxlZCwgaGVuY2UganVzdCBjb3B5LgorICAgIG1lbWNweShyb3dzX291dCwgcm93c19pbiwgY2FjaGVfcGl4cyAqIHNpemVvZigqcm93c19vdXQpKTsKKyAgfQorfQorCisvLyBQcm9jZXNzZXMgKHRyYW5zZm9ybXMsIHNjYWxlcyAmIGNvbG9yLWNvbnZlcnRzKSB0aGUgcm93cyBkZWNvZGVkIGFmdGVyIHRoZQorLy8gbGFzdCBjYWxsLgorc3RhdGljIHZvaWQgUHJvY2Vzc1Jvd3MoVlA4TERlY29kZXIqIGNvbnN0IGRlYywgaW50IHJvdykgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgcm93cyA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZGVjLT5sYXN0X3Jvd187CisgIGNvbnN0IGludCBudW1fcm93cyA9IHJvdyAtIGRlYy0+bGFzdF9yb3dfOworCisgIGFzc2VydChyb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgLy8gV2UgY2FuJ3QgcHJvY2VzcyBtb3JlIHRoYW4gTlVNX0FSR0JfQ0FDSEVfUk9XUyBhdCBhIHRpbWUgKHRoYXQncyB0aGUgc2l6ZQorICAvLyBvZiBhcmdiX2NhY2hlXyksIGJ1dCB3ZSBjdXJyZW50bHkgZG9uJ3QgbmVlZCBtb3JlIHRoYW4gdGhhdC4KKyAgYXNzZXJ0KG51bV9yb3dzIDw9IE5VTV9BUkdCX0NBQ0hFX1JPV1MpOworICBpZiAobnVtX3Jvd3MgPiAwKSB7ICAgIC8vIEVtaXQgb3V0cHV0LgorICAgIFZQOElvKiBjb25zdCBpbyA9IGRlYy0+aW9fOworICAgIHVpbnQ4X3QqIHJvd3NfZGF0YSA9ICh1aW50OF90KilkZWMtPmFyZ2JfY2FjaGVfOworICAgIGNvbnN0IGludCBpbl9zdHJpZGUgPSBpby0+d2lkdGggKiBzaXplb2YodWludDMyX3QpOyAgLy8gaW4gdW5pdCBvZiBSR0JBCisKKyAgICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3MsIHJvd3MpOworICAgIGlmICghU2V0Q3JvcFdpbmRvdyhpbywgZGVjLT5sYXN0X3Jvd18sIHJvdywgJnJvd3NfZGF0YSwgaW5fc3RyaWRlKSkgeworICAgICAgLy8gTm90aGluZyB0byBvdXRwdXQgKHRoaXMgdGltZSkuCisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IG91dHB1dCA9IGRlYy0+b3V0cHV0XzsKKyAgICAgIGlmIChXZWJQSXNSR0JNb2RlKG91dHB1dC0+Y29sb3JzcGFjZSkpIHsgIC8vIGNvbnZlcnQgdG8gUkdCQQorICAgICAgICBjb25zdCBXZWJQUkdCQUJ1ZmZlciogY29uc3QgYnVmID0gJm91dHB1dC0+dS5SR0JBOworICAgICAgICB1aW50OF90KiBjb25zdCByZ2JhID0gYnVmLT5yZ2JhICsgZGVjLT5sYXN0X291dF9yb3dfICogYnVmLT5zdHJpZGU7CisgICAgICAgIGNvbnN0IGludCBudW1fcm93c19vdXQgPQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgICAgICAgICBpby0+dXNlX3NjYWxpbmcgPworICAgICAgICAgICAgRW1pdFJlc2NhbGVkUm93c1JHQkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JhLCBidWYtPnN0cmlkZSkgOgorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9TSVpFCisgICAgICAgICAgICBFbWl0Um93cyhvdXRwdXQtPmNvbG9yc3BhY2UsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW8tPm1iX3csIGlvLT5tYl9oLCByZ2JhLCBidWYtPnN0cmlkZSk7CisgICAgICAgIC8vIFVwZGF0ZSAnbGFzdF9vdXRfcm93XycuCisgICAgICAgIGRlYy0+bGFzdF9vdXRfcm93XyArPSBudW1fcm93c19vdXQ7CisgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gWVVWQQorICAgICAgICBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBpby0+dXNlX3NjYWxpbmcgPworICAgICAgICAgICAgRW1pdFJlc2NhbGVkUm93c1lVVkEoZGVjLCByb3dzX2RhdGEsIGluX3N0cmlkZSwgaW8tPm1iX2gpIDoKKyAgICAgICAgICAgIEVtaXRSb3dzWVVWQShkZWMsIHJvd3NfZGF0YSwgaW5fc3RyaWRlLCBpby0+bWJfdywgaW8tPm1iX2gpOworICAgICAgfQorICAgICAgYXNzZXJ0KGRlYy0+bGFzdF9vdXRfcm93XyA8PSBvdXRwdXQtPmhlaWdodCk7CisgICAgfQorICB9CisKKyAgLy8gVXBkYXRlICdsYXN0X3Jvd18nLgorICBkZWMtPmxhc3Rfcm93XyA9IHJvdzsKKyAgYXNzZXJ0KGRlYy0+bGFzdF9yb3dfIDw9IGRlYy0+aGVpZ2h0Xyk7Cit9CisKKy8vIFJvdy1wcm9jZXNzaW5nIGZvciB0aGUgc3BlY2lhbCBjYXNlIHdoZW4gYWxwaGEgZGF0YSBjb250YWlucyBvbmx5IG9uZQorLy8gdHJhbnNmb3JtIChjb2xvciBpbmRleGluZyksIGFuZCB0cml2aWFsIG5vbi1ncmVlbiBsaXRlcmFscy4KK3N0YXRpYyBpbnQgSXM4Yk9wdGltaXphYmxlKGNvbnN0IFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7CisgIGludCBpOworICBpZiAoaGRyLT5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHJldHVybiAwOworICAvLyBXaGVuIHRoZSBIdWZmbWFuIHRyZWUgY29udGFpbnMgb25seSBvbmUgc3ltYm9sLCB3ZSBjYW4gc2tpcCB0aGUKKyAgLy8gY2FsbCB0byBSZWFkU3ltYm9sKCkgZm9yIHJlZC9ibHVlL2FscGhhIGNoYW5uZWxzLgorICBmb3IgKGkgPSAwOyBpIDwgaGRyLT5udW1faHRyZWVfZ3JvdXBzXzsgKytpKSB7CisgICAgSHVmZm1hbkNvZGUqKiBjb25zdCBodHJlZXMgPSBoZHItPmh0cmVlX2dyb3Vwc19baV0uaHRyZWVzOworICAgIGlmIChodHJlZXNbUkVEXVswXS5iaXRzID4gMCkgcmV0dXJuIDA7CisgICAgaWYgKGh0cmVlc1tCTFVFXVswXS5iaXRzID4gMCkgcmV0dXJuIDA7CisgICAgaWYgKGh0cmVlc1tBTFBIQV1bMF0uYml0cyA+IDApIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBBbHBoYUFwcGx5RmlsdGVyKEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X3JvdywgaW50IGxhc3Rfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCBzdHJpZGUpIHsKKyAgaWYgKGFscGhfZGVjLT5maWx0ZXJfICE9IFdFQlBfRklMVEVSX05PTkUpIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCB1aW50OF90KiBwcmV2X2xpbmUgPSBhbHBoX2RlYy0+cHJldl9saW5lXzsKKyAgICBhc3NlcnQoV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10gIT0gTlVMTCk7CisgICAgZm9yICh5ID0gZmlyc3Rfcm93OyB5IDwgbGFzdF9yb3c7ICsreSkgeworICAgICAgV2ViUFVuZmlsdGVyc1thbHBoX2RlYy0+ZmlsdGVyX10ocHJldl9saW5lLCBvdXQsIG91dCwgc3RyaWRlKTsKKyAgICAgIHByZXZfbGluZSA9IG91dDsKKyAgICAgIG91dCArPSBzdHJpZGU7CisgICAgfQorICAgIGFscGhfZGVjLT5wcmV2X2xpbmVfID0gcHJldl9saW5lOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgLy8gRm9yIHZlcnRpY2FsIGFuZCBncmFkaWVudCBmaWx0ZXJpbmcsIHdlIG5lZWQgdG8gZGVjb2RlIHRoZSBwYXJ0IGFib3ZlIHRoZQorICAvLyBjcm9wX3RvcCByb3csIGluIG9yZGVyIHRvIGhhdmUgdGhlIGNvcnJlY3Qgc3BhdGlhbCBwcmVkaWN0b3JzLgorICBBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMgPSAoQUxQSERlY29kZXIqKWRlYy0+aW9fLT5vcGFxdWU7CisgIGNvbnN0IGludCB0b3Bfcm93ID0KKyAgICAgIChhbHBoX2RlYy0+ZmlsdGVyXyA9PSBXRUJQX0ZJTFRFUl9OT05FIHx8CisgICAgICAgYWxwaF9kZWMtPmZpbHRlcl8gPT0gV0VCUF9GSUxURVJfSE9SSVpPTlRBTCkgPyBkZWMtPmlvXy0+Y3JvcF90b3AKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRlYy0+bGFzdF9yb3dfOworICBjb25zdCBpbnQgZmlyc3Rfcm93ID0gKGRlYy0+bGFzdF9yb3dfIDwgdG9wX3JvdykgPyB0b3Bfcm93IDogZGVjLT5sYXN0X3Jvd187CisgIGFzc2VydChsYXN0X3JvdyA8PSBkZWMtPmlvXy0+Y3JvcF9ib3R0b20pOworICBpZiAobGFzdF9yb3cgPiBmaXJzdF9yb3cpIHsKKyAgICAvLyBTcGVjaWFsIG1ldGhvZCBmb3IgcGFsZXR0ZWQgYWxwaGEgZGF0YS4gV2Ugb25seSBwcm9jZXNzIHRoZSBjcm9wcGVkIGFyZWEuCisgICAgY29uc3QgaW50IHdpZHRoID0gZGVjLT5pb18tPndpZHRoOworICAgIHVpbnQ4X3QqIG91dCA9IGFscGhfZGVjLT5vdXRwdXRfICsgd2lkdGggKiBmaXJzdF9yb3c7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPQorICAgICAgKHVpbnQ4X3QqKWRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogZmlyc3Rfcm93OworICAgIFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSA9ICZkZWMtPnRyYW5zZm9ybXNfWzBdOworICAgIGFzc2VydChkZWMtPm5leHRfdHJhbnNmb3JtXyA9PSAxKTsKKyAgICBhc3NlcnQodHJhbnNmb3JtLT50eXBlXyA9PSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0pOworICAgIFZQOExDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybUFscGhhKHRyYW5zZm9ybSwgZmlyc3Rfcm93LCBsYXN0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiwgb3V0KTsKKyAgICBBbHBoYUFwcGx5RmlsdGVyKGFscGhfZGVjLCBmaXJzdF9yb3csIGxhc3Rfcm93LCBvdXQsIHdpZHRoKTsKKyAgfQorICBkZWMtPmxhc3Rfcm93XyA9IGRlYy0+bGFzdF9vdXRfcm93XyA9IGxhc3Rfcm93OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgZmFzdCBwYXR0ZXJuIGNvcHkgKDhiIGFuZCAzMmIpCisKKy8vIGN5Y2xpYyByb3RhdGlvbiBvZiBwYXR0ZXJuIHdvcmQKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBSb3RhdGU4Yih1aW50MzJfdCBWKSB7CisjaWYgZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisgIHJldHVybiAoKFYgJiAweGZmMDAwMDAwdSkgPj4gMjQpIHwgKFYgPDwgOCk7CisjZWxzZQorICByZXR1cm4gKChWICYgMHhmZnUpIDw8IDI0KSB8IChWID4+IDgpOworI2VuZGlmCit9CisKKy8vIGNvcHkgMSwgMiBvciA0LWJ5dGVzIHBhdHRlcm4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHlTbWFsbFBhdHRlcm44Yihjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCB1aW50MzJfdCBwYXR0ZXJuKSB7CisgIGludCBpOworICAvLyBhbGlnbiAnZHN0JyB0byA0LWJ5dGVzIGJvdW5kYXJ5LiBBZGp1c3QgdGhlIHBhdHRlcm4gYWxvbmcgdGhlIHdheS4KKyAgd2hpbGUgKCh1aW50cHRyX3QpZHN0ICYgMykgeworICAgICpkc3QrKyA9ICpzcmMrKzsKKyAgICBwYXR0ZXJuID0gUm90YXRlOGIocGF0dGVybik7CisgICAgLS1sZW5ndGg7CisgIH0KKyAgLy8gQ29weSB0aGUgcGF0dGVybiA0IGJ5dGVzIGF0IGEgdGltZS4KKyAgZm9yIChpID0gMDsgaSA8IChsZW5ndGggPj4gMik7ICsraSkgeworICAgICgodWludDMyX3QqKWRzdClbaV0gPSBwYXR0ZXJuOworICB9CisgIC8vIEZpbmlzaCB3aXRoIGxlZnQtb3ZlcnMuICdwYXR0ZXJuJyBpcyBzdGlsbCBjb3JyZWN0bHkgcG9zaXRpb25lZCwKKyAgLy8gc28gbm8gUm90YXRlOGIoKSBjYWxsIGlzIG5lZWRlZC4KKyAgZm9yIChpIDw8PSAyOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBkc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weUJsb2NrOGIodWludDhfdCogY29uc3QgZHN0LCBpbnQgZGlzdCwgaW50IGxlbmd0aCkgeworICBjb25zdCB1aW50OF90KiBzcmMgPSBkc3QgLSBkaXN0OworICBpZiAobGVuZ3RoID49IDgpIHsKKyAgICB1aW50MzJfdCBwYXR0ZXJuID0gMDsKKyAgICBzd2l0Y2ggKGRpc3QpIHsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcGF0dGVybiA9IHNyY1swXTsKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSAgIC8vIGFybSBkb2Vzbid0IGxpa2UgbXVsdGlwbHkgdGhhdCBtdWNoCisgICAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCA4OworICAgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgMTY7CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgICAgICBfX2FzbV9fIHZvbGF0aWxlICgicmVwbHYucWIgJTAsICUwIiA6ICIrciIocGF0dGVybikpOworI2Vsc2UKKyAgICAgICAgcGF0dGVybiA9IDB4MDEwMTAxMDF1ICogcGF0dGVybjsKKyNlbmRpZgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgbWVtY3B5KCZwYXR0ZXJuLCBzcmMsIHNpemVvZih1aW50MTZfdCkpOworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pCisgICAgICAgIHBhdHRlcm4gfD0gcGF0dGVybiA8PCAxNjsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKCJyZXBsdi5waCAlMCwgJTAiIDogIityIihwYXR0ZXJuKSk7CisjZWxzZQorICAgICAgICBwYXR0ZXJuID0gMHgwMDAxMDAwMXUgKiBwYXR0ZXJuOworI2VuZGlmCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSA0OgorICAgICAgICBtZW1jcHkoJnBhdHRlcm4sIHNyYywgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgZ290byBDb3B5OworICAgICAgICBicmVhazsKKyAgICB9CisgICAgQ29weVNtYWxsUGF0dGVybjhiKHNyYywgZHN0LCBsZW5ndGgsIHBhdHRlcm4pOworICAgIHJldHVybjsKKyAgfQorIENvcHk6CisgIGlmIChkaXN0ID49IGxlbmd0aCkgeyAgLy8gbm8gb3ZlcmxhcCAtPiB1c2UgbWVtY3B5KCkKKyAgICBtZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV07CisgIH0KK30KKworLy8gY29weSBwYXR0ZXJuIG9mIDEgb3IgMiB1aW50MzJfdCdzCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb3B5U21hbGxQYXR0ZXJuMzJiKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIHVpbnQ2NF90IHBhdHRlcm4pIHsKKyAgaW50IGk7CisgIGlmICgodWludHB0cl90KWRzdCAmIDQpIHsgICAgICAgICAgIC8vIEFsaWduICdkc3QnIHRvIDgtYnl0ZXMgYm91bmRhcnkuCisgICAgKmRzdCsrID0gKnNyYysrOworICAgIHBhdHRlcm4gPSAocGF0dGVybiA+PiAzMikgfCAocGF0dGVybiA8PCAzMik7CisgICAgLS1sZW5ndGg7CisgIH0KKyAgYXNzZXJ0KDAgPT0gKCh1aW50cHRyX3QpZHN0ICYgNykpOworICBmb3IgKGkgPSAwOyBpIDwgKGxlbmd0aCA+PiAxKTsgKytpKSB7CisgICAgKCh1aW50NjRfdCopZHN0KVtpXSA9IHBhdHRlcm47ICAgIC8vIENvcHkgdGhlIHBhdHRlcm4gOCBieXRlcyBhdCBhIHRpbWUuCisgIH0KKyAgaWYgKGxlbmd0aCAmIDEpIHsgICAgICAgICAgICAgICAgICAgLy8gRmluaXNoIHdpdGggbGVmdC1vdmVyLgorICAgIGRzdFtpIDw8IDFdID0gc3JjW2kgPDwgMV07CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weUJsb2NrMzJiKHVpbnQzMl90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3QsIGludCBsZW5ndGgpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGRzdCAtIGRpc3Q7CisgIGlmIChkaXN0IDw9IDIgJiYgbGVuZ3RoID49IDQgJiYgKCh1aW50cHRyX3QpZHN0ICYgMykgPT0gMCkgeworICAgIHVpbnQ2NF90IHBhdHRlcm47CisgICAgaWYgKGRpc3QgPT0gMSkgeworICAgICAgcGF0dGVybiA9ICh1aW50NjRfdClzcmNbMF07CisgICAgICBwYXR0ZXJuIHw9IHBhdHRlcm4gPDwgMzI7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweSgmcGF0dGVybiwgc3JjLCBzaXplb2YocGF0dGVybikpOworICAgIH0KKyAgICBDb3B5U21hbGxQYXR0ZXJuMzJiKHNyYywgZHN0LCBsZW5ndGgsIHBhdHRlcm4pOworICB9IGVsc2UgaWYgKGRpc3QgPj0gbGVuZ3RoKSB7ICAvLyBubyBvdmVybGFwCisgICAgbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGggKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgZHN0W2ldID0gc3JjW2ldOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRGVjb2RlQWxwaGFEYXRhKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIHVpbnQ4X3QqIGNvbnN0IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBsYXN0X3JvdykgeworICBpbnQgb2sgPSAxOworICBpbnQgcm93ID0gZGVjLT5sYXN0X3BpeGVsXyAvIHdpZHRoOworICBpbnQgY29sID0gZGVjLT5sYXN0X3BpeGVsXyAlIHdpZHRoOworICBWUDhMQml0UmVhZGVyKiBjb25zdCBiciA9ICZkZWMtPmJyXzsKKyAgVlA4TE1ldGFkYXRhKiBjb25zdCBoZHIgPSAmZGVjLT5oZHJfOworICBpbnQgcG9zID0gZGVjLT5sYXN0X3BpeGVsXzsgICAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uCisgIGNvbnN0IGludCBlbmQgPSB3aWR0aCAqIGhlaWdodDsgICAgIC8vIEVuZCBvZiBkYXRhCisgIGNvbnN0IGludCBsYXN0ID0gd2lkdGggKiBsYXN0X3JvdzsgIC8vIExhc3QgcGl4ZWwgdG8gZGVjb2RlCisgIGNvbnN0IGludCBsZW5fY29kZV9saW1pdCA9IE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUzsKKyAgY29uc3QgaW50IG1hc2sgPSBoZHItPmh1ZmZtYW5fbWFza187CisgIGNvbnN0IEhUcmVlR3JvdXAqIGh0cmVlX2dyb3VwID0KKyAgICAgIChwb3MgPCBsYXN0KSA/IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdykgOiBOVUxMOworICBhc3NlcnQocG9zIDw9IGVuZCk7CisgIGFzc2VydChsYXN0X3JvdyA8PSBoZWlnaHQpOworICBhc3NlcnQoSXM4Yk9wdGltaXphYmxlKGhkcikpOworCisgIHdoaWxlICghYnItPmVvc18gJiYgcG9zIDwgbGFzdCkgeworICAgIGludCBjb2RlOworICAgIC8vIE9ubHkgdXBkYXRlIHdoZW4gY2hhbmdpbmcgdGlsZS4KKyAgICBpZiAoKGNvbCAmIG1hc2spID09IDApIHsKKyAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsKKyAgICB9CisgICAgYXNzZXJ0KGh0cmVlX2dyb3VwICE9IE5VTEwpOworICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICBjb2RlID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0dSRUVOXSwgYnIpOworICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8vIExpdGVyYWwKKyAgICAgIGRhdGFbcG9zXSA9IGNvZGU7CisgICAgICArK3BvczsKKyAgICAgICsrY29sOworICAgICAgaWYgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgPSAwOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgIEV4dHJhY3RQYWxldHRlZEFscGhhUm93cyhkZWMsIHJvdyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGNvZGUgPCBsZW5fY29kZV9saW1pdCkgeyAgLy8gQmFja3dhcmQgcmVmZXJlbmNlCisgICAgICBpbnQgZGlzdF9jb2RlLCBkaXN0OworICAgICAgY29uc3QgaW50IGxlbmd0aF9zeW0gPSBjb2RlIC0gTlVNX0xJVEVSQUxfQ09ERVM7CisgICAgICBjb25zdCBpbnQgbGVuZ3RoID0gR2V0Q29weUxlbmd0aChsZW5ndGhfc3ltLCBicik7CisgICAgICBjb25zdCBpbnQgZGlzdF9zeW1ib2wgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbRElTVF0sIGJyKTsKKyAgICAgIFZQOExGaWxsQml0V2luZG93KGJyKTsKKyAgICAgIGRpc3RfY29kZSA9IEdldENvcHlEaXN0YW5jZShkaXN0X3N5bWJvbCwgYnIpOworICAgICAgZGlzdCA9IFBsYW5lQ29kZVRvRGlzdGFuY2Uod2lkdGgsIGRpc3RfY29kZSk7CisgICAgICBpZiAocG9zID49IGRpc3QgJiYgZW5kIC0gcG9zID49IGxlbmd0aCkgeworICAgICAgICBDb3B5QmxvY2s4YihkYXRhICsgcG9zLCBkaXN0LCBsZW5ndGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgb2sgPSAwOworICAgICAgICBnb3RvIEVuZDsKKyAgICAgIH0KKyAgICAgIHBvcyArPSBsZW5ndGg7CisgICAgICBjb2wgKz0gbGVuZ3RoOworICAgICAgd2hpbGUgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgLT0gd2lkdGg7CisgICAgICAgICsrcm93OworICAgICAgICBpZiAocm93IDw9IGxhc3Rfcm93ICYmIChyb3cgJSBOVU1fQVJHQl9DQUNIRV9ST1dTID09IDApKSB7CisgICAgICAgICAgRXh0cmFjdFBhbGV0dGVkQWxwaGFSb3dzKGRlYywgcm93KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHBvcyA8IGxhc3QgJiYgKGNvbCAmIG1hc2spKSB7CisgICAgICAgIGh0cmVlX2dyb3VwID0gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAgLy8gTm90IHJlYWNoZWQKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgICBici0+ZW9zXyA9IFZQOExJc0VuZE9mU3RyZWFtKGJyKTsKKyAgfQorICAvLyBQcm9jZXNzIHRoZSByZW1haW5pbmcgcm93cyBjb3JyZXNwb25kaW5nIHRvIGxhc3Qgcm93LWJsb2NrLgorICBFeHRyYWN0UGFsZXR0ZWRBbHBoYVJvd3MoZGVjLCByb3cgPiBsYXN0X3JvdyA/IGxhc3Rfcm93IDogcm93KTsKKworIEVuZDoKKyAgYnItPmVvc18gPSBWUDhMSXNFbmRPZlN0cmVhbShicik7CisgIGlmICghb2sgfHwgKGJyLT5lb3NfICYmIHBvcyA8IGVuZCkpIHsKKyAgICBvayA9IDA7CisgICAgZGVjLT5zdGF0dXNfID0gYnItPmVvc18gPyBWUDhfU1RBVFVTX1NVU1BFTkRFRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIH0gZWxzZSB7CisgICAgZGVjLT5sYXN0X3BpeGVsXyA9IHBvczsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIFNhdmVTdGF0ZShWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgbGFzdF9waXhlbCkgeworICBhc3NlcnQoZGVjLT5pbmNyZW1lbnRhbF8pOworICBkZWMtPnNhdmVkX2JyXyA9IGRlYy0+YnJfOworICBkZWMtPnNhdmVkX2xhc3RfcGl4ZWxfID0gbGFzdF9waXhlbDsKKyAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHsKKyAgICBWUDhMQ29sb3JDYWNoZUNvcHkoJmRlYy0+aGRyXy5jb2xvcl9jYWNoZV8sICZkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXN0b3JlU3RhdGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBhc3NlcnQoZGVjLT5icl8uZW9zXyk7CisgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfU1VTUEVOREVEOworICBkZWMtPmJyXyA9IGRlYy0+c2F2ZWRfYnJfOworICBkZWMtPmxhc3RfcGl4ZWxfID0gZGVjLT5zYXZlZF9sYXN0X3BpeGVsXzsKKyAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDApIHsKKyAgICBWUDhMQ29sb3JDYWNoZUNvcHkoJmRlYy0+aGRyXy5zYXZlZF9jb2xvcl9jYWNoZV8sICZkZWMtPmhkcl8uY29sb3JfY2FjaGVfKTsKKyAgfQorfQorCisjZGVmaW5lIFNZTkNfRVZFUllfTl9ST1dTIDggIC8vIG1pbmltdW0gbnVtYmVyIG9mIHJvd3MgYmV0d2VlbiBjaGVjay1wb2ludHMKK3N0YXRpYyBpbnQgRGVjb2RlSW1hZ2VEYXRhKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIHVpbnQzMl90KiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbGFzdF9yb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9jZXNzUm93c0Z1bmMgcHJvY2Vzc19mdW5jKSB7CisgIGludCByb3cgPSBkZWMtPmxhc3RfcGl4ZWxfIC8gd2lkdGg7CisgIGludCBjb2wgPSBkZWMtPmxhc3RfcGl4ZWxfICUgd2lkdGg7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIHVpbnQzMl90KiBzcmMgPSBkYXRhICsgZGVjLT5sYXN0X3BpeGVsXzsKKyAgdWludDMyX3QqIGxhc3RfY2FjaGVkID0gc3JjOworICB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IGRhdGEgKyB3aWR0aCAqIGhlaWdodDsgICAgIC8vIEVuZCBvZiBkYXRhCisgIHVpbnQzMl90KiBjb25zdCBzcmNfbGFzdCA9IGRhdGEgKyB3aWR0aCAqIGxhc3Rfcm93OyAgLy8gTGFzdCBwaXhlbCB0byBkZWNvZGUKKyAgY29uc3QgaW50IGxlbl9jb2RlX2xpbWl0ID0gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTOworICBjb25zdCBpbnQgY29sb3JfY2FjaGVfbGltaXQgPSBsZW5fY29kZV9saW1pdCArIGhkci0+Y29sb3JfY2FjaGVfc2l6ZV87CisgIGludCBuZXh0X3N5bmNfcm93ID0gZGVjLT5pbmNyZW1lbnRhbF8gPyByb3cgOiAxIDw8IDI0OworICBWUDhMQ29sb3JDYWNoZSogY29uc3QgY29sb3JfY2FjaGUgPQorICAgICAgKGhkci0+Y29sb3JfY2FjaGVfc2l6ZV8gPiAwKSA/ICZoZHItPmNvbG9yX2NhY2hlXyA6IE5VTEw7CisgIGNvbnN0IGludCBtYXNrID0gaGRyLT5odWZmbWFuX21hc2tfOworICBjb25zdCBIVHJlZUdyb3VwKiBodHJlZV9ncm91cCA9CisgICAgICAoc3JjIDwgc3JjX2xhc3QpID8gR2V0SHRyZWVHcm91cEZvclBvcyhoZHIsIGNvbCwgcm93KSA6IE5VTEw7CisgIGFzc2VydChkZWMtPmxhc3Rfcm93XyA8IGxhc3Rfcm93KTsKKyAgYXNzZXJ0KHNyY19sYXN0IDw9IHNyY19lbmQpOworCisgIHdoaWxlIChzcmMgPCBzcmNfbGFzdCkgeworICAgIGludCBjb2RlOworICAgIGlmIChyb3cgPj0gbmV4dF9zeW5jX3JvdykgeworICAgICAgU2F2ZVN0YXRlKGRlYywgKGludCkoc3JjIC0gZGF0YSkpOworICAgICAgbmV4dF9zeW5jX3JvdyA9IHJvdyArIFNZTkNfRVZFUllfTl9ST1dTOworICAgIH0KKyAgICAvLyBPbmx5IHVwZGF0ZSB3aGVuIGNoYW5naW5nIHRpbGUuIE5vdGUgd2UgY291bGQgdXNlIHRoaXMgdGVzdDoKKyAgICAvLyBpZiAiKCgoKHByZXZfY29sIF4gY29sKSB8IHByZXZfcm93IF4gcm93KSkgPiBtYXNrKSIgLT4gdGlsZSBjaGFuZ2VkCisgICAgLy8gYnV0IHRoYXQncyBhY3R1YWxseSBzbG93ZXIgYW5kIG5lZWRzIHN0b3JpbmcgdGhlIHByZXZpb3VzIGNvbC9yb3cuCisgICAgaWYgKChjb2wgJiBtYXNrKSA9PSAwKSB7CisgICAgICBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgfQorICAgIGFzc2VydChodHJlZV9ncm91cCAhPSBOVUxMKTsKKyAgICBpZiAoaHRyZWVfZ3JvdXAtPmlzX3RyaXZpYWxfY29kZSkgeworICAgICAgKnNyYyA9IGh0cmVlX2dyb3VwLT5saXRlcmFsX2FyYjsKKyAgICAgIGdvdG8gQWR2YW5jZUJ5T25lOworICAgIH0KKyAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgaWYgKGh0cmVlX2dyb3VwLT51c2VfcGFja2VkX3RhYmxlKSB7CisgICAgICBjb2RlID0gUmVhZFBhY2tlZFN5bWJvbHMoaHRyZWVfZ3JvdXAsIGJyLCBzcmMpOworICAgICAgaWYgKFZQOExJc0VuZE9mU3RyZWFtKGJyKSkgYnJlYWs7CisgICAgICBpZiAoY29kZSA9PSBQQUNLRURfTk9OX0xJVEVSQUxfQ09ERSkgZ290byBBZHZhbmNlQnlPbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvZGUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbR1JFRU5dLCBicik7CisgICAgfQorICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgIGlmIChjb2RlIDwgTlVNX0xJVEVSQUxfQ09ERVMpIHsgIC8vIExpdGVyYWwKKyAgICAgIGlmIChodHJlZV9ncm91cC0+aXNfdHJpdmlhbF9saXRlcmFsKSB7CisgICAgICAgICpzcmMgPSBodHJlZV9ncm91cC0+bGl0ZXJhbF9hcmIgfCAoY29kZSA8PCA4KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCByZWQsIGJsdWUsIGFscGhhOworICAgICAgICByZWQgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbUkVEXSwgYnIpOworICAgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICAgIGJsdWUgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQkxVRV0sIGJyKTsKKyAgICAgICAgYWxwaGEgPSBSZWFkU3ltYm9sKGh0cmVlX2dyb3VwLT5odHJlZXNbQUxQSEFdLCBicik7CisgICAgICAgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIGJyZWFrOworICAgICAgICAqc3JjID0gKCh1aW50MzJfdClhbHBoYSA8PCAyNCkgfCAocmVkIDw8IDE2KSB8IChjb2RlIDw8IDgpIHwgYmx1ZTsKKyAgICAgIH0KKyAgICBBZHZhbmNlQnlPbmU6CisgICAgICArK3NyYzsKKyAgICAgICsrY29sOworICAgICAgaWYgKGNvbCA+PSB3aWR0aCkgeworICAgICAgICBjb2wgPSAwOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHByb2Nlc3NfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbG9yX2NhY2hlICE9IE5VTEwpIHsKKyAgICAgICAgICB3aGlsZSAobGFzdF9jYWNoZWQgPCBzcmMpIHsKKyAgICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlIDwgbGVuX2NvZGVfbGltaXQpIHsgIC8vIEJhY2t3YXJkIHJlZmVyZW5jZQorICAgICAgaW50IGRpc3RfY29kZSwgZGlzdDsKKyAgICAgIGNvbnN0IGludCBsZW5ndGhfc3ltID0gY29kZSAtIE5VTV9MSVRFUkFMX0NPREVTOworICAgICAgY29uc3QgaW50IGxlbmd0aCA9IEdldENvcHlMZW5ndGgobGVuZ3RoX3N5bSwgYnIpOworICAgICAgY29uc3QgaW50IGRpc3Rfc3ltYm9sID0gUmVhZFN5bWJvbChodHJlZV9ncm91cC0+aHRyZWVzW0RJU1RdLCBicik7CisgICAgICBWUDhMRmlsbEJpdFdpbmRvdyhicik7CisgICAgICBkaXN0X2NvZGUgPSBHZXRDb3B5RGlzdGFuY2UoZGlzdF9zeW1ib2wsIGJyKTsKKyAgICAgIGRpc3QgPSBQbGFuZUNvZGVUb0Rpc3RhbmNlKHdpZHRoLCBkaXN0X2NvZGUpOworICAgICAgaWYgKFZQOExJc0VuZE9mU3RyZWFtKGJyKSkgYnJlYWs7CisgICAgICBpZiAoc3JjIC0gZGF0YSA8IChwdHJkaWZmX3QpZGlzdCB8fCBzcmNfZW5kIC0gc3JjIDwgKHB0cmRpZmZfdClsZW5ndGgpIHsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvcHlCbG9jazMyYihzcmMsIGRpc3QsIGxlbmd0aCk7CisgICAgICB9CisgICAgICBzcmMgKz0gbGVuZ3RoOworICAgICAgY29sICs9IGxlbmd0aDsKKyAgICAgIHdoaWxlIChjb2wgPj0gd2lkdGgpIHsKKyAgICAgICAgY29sIC09IHdpZHRoOworICAgICAgICArK3JvdzsKKyAgICAgICAgaWYgKHByb2Nlc3NfZnVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgaWYgKHJvdyA8PSBsYXN0X3JvdyAmJiAocm93ICUgTlVNX0FSR0JfQ0FDSEVfUk9XUyA9PSAwKSkgeworICAgICAgICAgICAgcHJvY2Vzc19mdW5jKGRlYywgcm93KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGNoZWNrIGRvbmUgYWJvdmUgKGJlZm9yZSAnc3JjJyB3YXMgaW5jcmVtZW50ZWQgYnkKKyAgICAgIC8vICdsZW5ndGgnKSwgdGhlIGZvbGxvd2luZyBob2xkcyB0cnVlLgorICAgICAgYXNzZXJ0KHNyYyA8PSBzcmNfZW5kKTsKKyAgICAgIGlmIChjb2wgJiBtYXNrKSBodHJlZV9ncm91cCA9IEdldEh0cmVlR3JvdXBGb3JQb3MoaGRyLCBjb2wsIHJvdyk7CisgICAgICBpZiAoY29sb3JfY2FjaGUgIT0gTlVMTCkgeworICAgICAgICB3aGlsZSAobGFzdF9jYWNoZWQgPCBzcmMpIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydChjb2xvcl9jYWNoZSwgKmxhc3RfY2FjaGVkKyspOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIGlmIChjb2RlIDwgY29sb3JfY2FjaGVfbGltaXQpIHsgIC8vIENvbG9yIGNhY2hlCisgICAgICBjb25zdCBpbnQga2V5ID0gY29kZSAtIGxlbl9jb2RlX2xpbWl0OworICAgICAgYXNzZXJ0KGNvbG9yX2NhY2hlICE9IE5VTEwpOworICAgICAgd2hpbGUgKGxhc3RfY2FjaGVkIDwgc3JjKSB7CisgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbG9yX2NhY2hlLCAqbGFzdF9jYWNoZWQrKyk7CisgICAgICB9CisgICAgICAqc3JjID0gVlA4TENvbG9yQ2FjaGVMb29rdXAoY29sb3JfY2FjaGUsIGtleSk7CisgICAgICBnb3RvIEFkdmFuY2VCeU9uZTsKKyAgICB9IGVsc2UgeyAgLy8gTm90IHJlYWNoZWQKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgYnItPmVvc18gPSBWUDhMSXNFbmRPZlN0cmVhbShicik7CisgIGlmIChkZWMtPmluY3JlbWVudGFsXyAmJiBici0+ZW9zXyAmJiBzcmMgPCBzcmNfZW5kKSB7CisgICAgUmVzdG9yZVN0YXRlKGRlYyk7CisgIH0gZWxzZSBpZiAoIWJyLT5lb3NfKSB7CisgICAgLy8gUHJvY2VzcyB0aGUgcmVtYWluaW5nIHJvd3MgY29ycmVzcG9uZGluZyB0byBsYXN0IHJvdy1ibG9jay4KKyAgICBpZiAocHJvY2Vzc19mdW5jICE9IE5VTEwpIHsKKyAgICAgIHByb2Nlc3NfZnVuYyhkZWMsIHJvdyA+IGxhc3Rfcm93ID8gbGFzdF9yb3cgOiByb3cpOworICAgIH0KKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICAgIGRlYy0+bGFzdF9waXhlbF8gPSAoaW50KShzcmMgLSBkYXRhKTsgIC8vIGVuZC1vZi1zY2FuIG1hcmtlcgorICB9IGVsc2UgeworICAgIC8vIGlmIG5vdCBpbmNyZW1lbnRhbCwgYW5kIHdlIGFyZSBwYXN0IHRoZSBlbmQgb2YgYnVmZmVyIChlb3NfPTEpLCB0aGVuIHRoaXMKKyAgICAvLyBpcyBhIHJlYWwgYml0c3RyZWFtIGVycm9yLgorICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CisgIHJldHVybiAwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBDbGVhclRyYW5zZm9ybShWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0pIHsKKyAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICB0cmFuc2Zvcm0tPmRhdGFfID0gTlVMTDsKK30KKworLy8gRm9yIHNlY3VyaXR5IHJlYXNvbiwgd2UgbmVlZCB0byByZW1hcCB0aGUgY29sb3IgbWFwIHRvIHNwYW4KKy8vIHRoZSB0b3RhbCBwb3NzaWJsZSBidW5kbGVkIHZhbHVlcywgYW5kIG5vdCBqdXN0IHRoZSBudW1fY29sb3JzLgorc3RhdGljIGludCBFeHBhbmRDb2xvck1hcChpbnQgbnVtX2NvbG9ycywgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtKSB7CisgIGludCBpOworICBjb25zdCBpbnQgZmluYWxfbnVtX2NvbG9ycyA9IDEgPDwgKDggPj4gdHJhbnNmb3JtLT5iaXRzXyk7CisgIHVpbnQzMl90KiBjb25zdCBuZXdfY29sb3JfbWFwID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KWZpbmFsX251bV9jb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbmV3X2NvbG9yX21hcCkpOworICBpZiAobmV3X2NvbG9yX21hcCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgdWludDhfdCogY29uc3QgZGF0YSA9ICh1aW50OF90Kil0cmFuc2Zvcm0tPmRhdGFfOworICAgIHVpbnQ4X3QqIGNvbnN0IG5ld19kYXRhID0gKHVpbnQ4X3QqKW5ld19jb2xvcl9tYXA7CisgICAgbmV3X2NvbG9yX21hcFswXSA9IHRyYW5zZm9ybS0+ZGF0YV9bMF07CisgICAgZm9yIChpID0gNDsgaSA8IDQgKiBudW1fY29sb3JzOyArK2kpIHsKKyAgICAgIC8vIEVxdWl2YWxlbnQgdG8gQWRkUGl4ZWxFcSgpLCBvbiBhIGJ5dGUtYmFzaXMuCisgICAgICBuZXdfZGF0YVtpXSA9IChkYXRhW2ldICsgbmV3X2RhdGFbaSAtIDRdKSAmIDB4ZmY7CisgICAgfQorICAgIGZvciAoOyBpIDwgNCAqIGZpbmFsX251bV9jb2xvcnM7ICsraSkgeworICAgICAgbmV3X2RhdGFbaV0gPSAwOyAgLy8gYmxhY2sgdGFpbC4KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHRyYW5zZm9ybS0+ZGF0YV8pOworICAgIHRyYW5zZm9ybS0+ZGF0YV8gPSBuZXdfY29sb3JfbWFwOworICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IFJlYWRUcmFuc2Zvcm0oaW50KiBjb25zdCB4c2l6ZSwgaW50IGNvbnN0KiB5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBvayA9IDE7CisgIFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyID0gJmRlYy0+YnJfOworICBWUDhMVHJhbnNmb3JtKiB0cmFuc2Zvcm0gPSAmZGVjLT50cmFuc2Zvcm1zX1tkZWMtPm5leHRfdHJhbnNmb3JtX107CisgIGNvbnN0IFZQOExJbWFnZVRyYW5zZm9ybVR5cGUgdHlwZSA9CisgICAgICAoVlA4TEltYWdlVHJhbnNmb3JtVHlwZSlWUDhMUmVhZEJpdHMoYnIsIDIpOworCisgIC8vIEVhY2ggdHJhbnNmb3JtIHR5cGUgY2FuIG9ubHkgYmUgcHJlc2VudCBvbmNlIGluIHRoZSBzdHJlYW0uCisgIGlmIChkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gJiAoMVUgPDwgdHlwZSkpIHsKKyAgICByZXR1cm4gMDsgIC8vIEFscmVhZHkgdGhlcmUsIGxldCdzIG5vdCBhY2NlcHQgdGhlIHNlY29uZCBzYW1lIHRyYW5zZm9ybS4KKyAgfQorICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gfD0gKDFVIDw8IHR5cGUpOworCisgIHRyYW5zZm9ybS0+dHlwZV8gPSB0eXBlOworICB0cmFuc2Zvcm0tPnhzaXplXyA9ICp4c2l6ZTsKKyAgdHJhbnNmb3JtLT55c2l6ZV8gPSAqeXNpemU7CisgIHRyYW5zZm9ybS0+ZGF0YV8gPSBOVUxMOworICArK2RlYy0+bmV4dF90cmFuc2Zvcm1fOworICBhc3NlcnQoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPD0gTlVNX1RSQU5TRk9STVMpOworCisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgUFJFRElDVE9SX1RSQU5TRk9STToKKyAgICBjYXNlIENST1NTX0NPTE9SX1RSQU5TRk9STToKKyAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBWUDhMUmVhZEJpdHMoYnIsIDMpICsgMjsKKyAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0oVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybS0+Yml0c18pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnlzaXplXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtLT5iaXRzXyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGRlYywgJnRyYW5zZm9ybS0+ZGF0YV8pOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk06IHsKKyAgICAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IFZQOExSZWFkQml0cyhiciwgOCkgKyAxOworICAgICAgIGNvbnN0IGludCBiaXRzID0gKG51bV9jb2xvcnMgPiAxNikgPyAwCisgICAgICAgICAgICAgICAgICAgICAgOiAobnVtX2NvbG9ycyA+IDQpID8gMQorICAgICAgICAgICAgICAgICAgICAgIDogKG51bV9jb2xvcnMgPiAyKSA/IDIKKyAgICAgICAgICAgICAgICAgICAgICA6IDM7CisgICAgICAgKnhzaXplID0gVlA4TFN1YlNhbXBsZVNpemUodHJhbnNmb3JtLT54c2l6ZV8sIGJpdHMpOworICAgICAgIHRyYW5zZm9ybS0+Yml0c18gPSBiaXRzOworICAgICAgIG9rID0gRGVjb2RlSW1hZ2VTdHJlYW0obnVtX2NvbG9ycywgMSwgMCwgZGVjLCAmdHJhbnNmb3JtLT5kYXRhXyk7CisgICAgICAgb2sgPSBvayAmJiBFeHBhbmRDb2xvck1hcChudW1fY29sb3JzLCB0cmFuc2Zvcm0pOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgU1VCVFJBQ1RfR1JFRU46CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KDApOyAgICAvLyBjYW4ndCBoYXBwZW4KKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TE1ldGFkYXRhCisKK3N0YXRpYyB2b2lkIEluaXRNZXRhZGF0YShWUDhMTWV0YWRhdGEqIGNvbnN0IGhkcikgeworICBhc3NlcnQoaGRyICE9IE5VTEwpOworICBtZW1zZXQoaGRyLCAwLCBzaXplb2YoKmhkcikpOworfQorCitzdGF0aWMgdm9pZCBDbGVhck1ldGFkYXRhKFZQOExNZXRhZGF0YSogY29uc3QgaGRyKSB7CisgIGFzc2VydChoZHIgIT0gTlVMTCk7CisKKyAgV2ViUFNhZmVGcmVlKGhkci0+aHVmZm1hbl9pbWFnZV8pOworICBXZWJQU2FmZUZyZWUoaGRyLT5odWZmbWFuX3RhYmxlc18pOworICBWUDhMSHRyZWVHcm91cHNGcmVlKGhkci0+aHRyZWVfZ3JvdXBzXyk7CisgIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhkci0+Y29sb3JfY2FjaGVfKTsKKyAgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGRyLT5zYXZlZF9jb2xvcl9jYWNoZV8pOworICBJbml0TWV0YWRhdGEoaGRyKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExEZWNvZGVyCisKK1ZQOExEZWNvZGVyKiBWUDhMTmV3KHZvaWQpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IChWUDhMRGVjb2RlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkZWMpKTsKKyAgaWYgKGRlYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgZGVjLT5zdGF0ZV8gPSBSRUFEX0RJTTsKKworICBWUDhMRHNwSW5pdCgpOyAgLy8gSW5pdCBjcml0aWNhbCBmdW5jdGlvbiBwb2ludGVycy4KKworICByZXR1cm4gZGVjOworfQorCit2b2lkIFZQOExDbGVhcihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGludCBpOworICBpZiAoZGVjID09IE5VTEwpIHJldHVybjsKKyAgQ2xlYXJNZXRhZGF0YSgmZGVjLT5oZHJfKTsKKworICBXZWJQU2FmZUZyZWUoZGVjLT5waXhlbHNfKTsKKyAgZGVjLT5waXhlbHNfID0gTlVMTDsKKyAgZm9yIChpID0gMDsgaSA8IGRlYy0+bmV4dF90cmFuc2Zvcm1fOyArK2kpIHsKKyAgICBDbGVhclRyYW5zZm9ybSgmZGVjLT50cmFuc2Zvcm1zX1tpXSk7CisgIH0KKyAgZGVjLT5uZXh0X3RyYW5zZm9ybV8gPSAwOworICBkZWMtPnRyYW5zZm9ybXNfc2Vlbl8gPSAwOworCisgIFdlYlBTYWZlRnJlZShkZWMtPnJlc2NhbGVyX21lbW9yeSk7CisgIGRlYy0+cmVzY2FsZXJfbWVtb3J5ID0gTlVMTDsKKworICBkZWMtPm91dHB1dF8gPSBOVUxMOyAgIC8vIGxlYXZlIG5vIHRyYWNlIGJlaGluZAorfQorCit2b2lkIFZQOExEZWxldGUoVlA4TERlY29kZXIqIGNvbnN0IGRlYykgeworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBWUDhMQ2xlYXIoZGVjKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBVcGRhdGVEZWNvZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBWUDhMTWV0YWRhdGEqIGNvbnN0IGhkciA9ICZkZWMtPmhkcl87CisgIGNvbnN0IGludCBudW1fYml0cyA9IGhkci0+aHVmZm1hbl9zdWJzYW1wbGVfYml0c187CisgIGRlYy0+d2lkdGhfID0gd2lkdGg7CisgIGRlYy0+aGVpZ2h0XyA9IGhlaWdodDsKKworICBoZHItPmh1ZmZtYW5feHNpemVfID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIG51bV9iaXRzKTsKKyAgaGRyLT5odWZmbWFuX21hc2tfID0gKG51bV9iaXRzID09IDApID8gfjAgOiAoMSA8PCBudW1fYml0cykgLSAxOworfQorCitzdGF0aWMgaW50IERlY29kZUltYWdlU3RyZWFtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfbGV2ZWwwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRGVjb2RlciogY29uc3QgZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCoqIGNvbnN0IGRlY29kZWRfZGF0YSkgeworICBpbnQgb2sgPSAxOworICBpbnQgdHJhbnNmb3JtX3hzaXplID0geHNpemU7CisgIGludCB0cmFuc2Zvcm1feXNpemUgPSB5c2l6ZTsKKyAgVlA4TEJpdFJlYWRlciogY29uc3QgYnIgPSAmZGVjLT5icl87CisgIFZQOExNZXRhZGF0YSogY29uc3QgaGRyID0gJmRlYy0+aGRyXzsKKyAgdWludDMyX3QqIGRhdGEgPSBOVUxMOworICBpbnQgY29sb3JfY2FjaGVfYml0cyA9IDA7CisKKyAgLy8gUmVhZCB0aGUgdHJhbnNmb3JtcyAobWF5IHJlY3Vyc2UpLgorICBpZiAoaXNfbGV2ZWwwKSB7CisgICAgd2hpbGUgKG9rICYmIFZQOExSZWFkQml0cyhiciwgMSkpIHsKKyAgICAgIG9rID0gUmVhZFRyYW5zZm9ybSgmdHJhbnNmb3JtX3hzaXplLCAmdHJhbnNmb3JtX3lzaXplLCBkZWMpOworICAgIH0KKyAgfQorCisgIC8vIENvbG9yIGNhY2hlCisgIGlmIChvayAmJiBWUDhMUmVhZEJpdHMoYnIsIDEpKSB7CisgICAgY29sb3JfY2FjaGVfYml0cyA9IFZQOExSZWFkQml0cyhiciwgNCk7CisgICAgb2sgPSAoY29sb3JfY2FjaGVfYml0cyA+PSAxICYmIGNvbG9yX2NhY2hlX2JpdHMgPD0gTUFYX0NBQ0hFX0JJVFMpOworICAgIGlmICghb2spIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOworICAgICAgZ290byBFbmQ7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCB0aGUgSHVmZm1hbiBjb2RlcyAobWF5IHJlY3Vyc2UpLgorICBvayA9IG9rICYmIFJlYWRIdWZmbWFuQ29kZXMoZGVjLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yX2NhY2hlX2JpdHMsIGlzX2xldmVsMCk7CisgIGlmICghb2spIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIC8vIEZpbmlzaCBzZXR0aW5nIHVwIHRoZSBjb2xvci1jYWNoZQorICBpZiAoY29sb3JfY2FjaGVfYml0cyA+IDApIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMSA8PCBjb2xvcl9jYWNoZV9iaXRzOworICAgIGlmICghVlA4TENvbG9yQ2FjaGVJbml0KCZoZHItPmNvbG9yX2NhY2hlXywgY29sb3JfY2FjaGVfYml0cykpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgIG9rID0gMDsKKyAgICAgIGdvdG8gRW5kOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBoZHItPmNvbG9yX2NhY2hlX3NpemVfID0gMDsKKyAgfQorICBVcGRhdGVEZWNvZGVyKGRlYywgdHJhbnNmb3JtX3hzaXplLCB0cmFuc2Zvcm1feXNpemUpOworCisgIGlmIChpc19sZXZlbDApIHsgICAvLyBsZXZlbCAwIGNvbXBsZXRlCisgICAgZGVjLT5zdGF0ZV8gPSBSRUFEX0hEUjsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIHsKKyAgICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gKHVpbnQ2NF90KXRyYW5zZm9ybV94c2l6ZSAqIHRyYW5zZm9ybV95c2l6ZTsKKyAgICBkYXRhID0gKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyh0b3RhbF9zaXplLCBzaXplb2YoKmRhdGEpKTsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CisgICAgICBvayA9IDA7CisgICAgICBnb3RvIEVuZDsKKyAgICB9CisgIH0KKworICAvLyBVc2UgdGhlIEh1ZmZtYW4gdHJlZXMgdG8gZGVjb2RlIHRoZSBMWjc3IGVuY29kZWQgZGF0YS4KKyAgb2sgPSBEZWNvZGVJbWFnZURhdGEoZGVjLCBkYXRhLCB0cmFuc2Zvcm1feHNpemUsIHRyYW5zZm9ybV95c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX3lzaXplLCBOVUxMKTsKKyAgb2sgPSBvayAmJiAhYnItPmVvc187CisKKyBFbmQ6CisgIGlmICghb2spIHsKKyAgICBXZWJQU2FmZUZyZWUoZGF0YSk7CisgICAgQ2xlYXJNZXRhZGF0YShoZHIpOworICB9IGVsc2UgeworICAgIGlmIChkZWNvZGVkX2RhdGEgIT0gTlVMTCkgeworICAgICAgKmRlY29kZWRfZGF0YSA9IGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFdlIGFsbG9jYXRlIGltYWdlIGRhdGEgaW4gdGhpcyBmdW5jdGlvbiBvbmx5IGZvciB0cmFuc2Zvcm1zLiBBdCBsZXZlbCAwCisgICAgICAvLyAodGhhdCBpczogbm90IHRoZSB0cmFuc2Zvcm1zKSwgd2Ugc2hvdWxkbid0IGhhdmUgYWxsb2NhdGVkIGFueXRoaW5nLgorICAgICAgYXNzZXJ0KGRhdGEgPT0gTlVMTCk7CisgICAgICBhc3NlcnQoaXNfbGV2ZWwwKTsKKyAgICB9CisgICAgZGVjLT5sYXN0X3BpeGVsXyA9IDA7ICAvLyBSZXNldCBmb3IgZnV0dXJlIERFQ09ERV9EQVRBX0ZVTkMoKSBjYWxscy4KKyAgICBpZiAoIWlzX2xldmVsMCkgQ2xlYXJNZXRhZGF0YShoZHIpOyAgLy8gQ2xlYW4gdXAgdGVtcG9yYXJ5IGRhdGEgYmVoaW5kLgorICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFsbG9jYXRlIGludGVybmFsIGJ1ZmZlcnMgZGVjLT5waXhlbHNfIGFuZCBkZWMtPmFyZ2JfY2FjaGVfLgorc3RhdGljIGludCBBbGxvY2F0ZUludGVybmFsQnVmZmVyczMyYihWUDhMRGVjb2RlciogY29uc3QgZGVjLCBpbnQgZmluYWxfd2lkdGgpIHsKKyAgY29uc3QgdWludDY0X3QgbnVtX3BpeGVscyA9ICh1aW50NjRfdClkZWMtPndpZHRoXyAqIGRlYy0+aGVpZ2h0XzsKKyAgLy8gU2NyYXRjaCBidWZmZXIgY29ycmVzcG9uZGluZyB0byB0b3AtcHJlZGljdGlvbiByb3cgZm9yIHRyYW5zZm9ybWluZyB0aGUKKyAgLy8gZmlyc3Qgcm93IGluIHRoZSByb3ctYmxvY2tzLiBOb3QgbmVlZGVkIGZvciBwYWxldHRlZCBhbHBoYS4KKyAgY29uc3QgdWludDY0X3QgY2FjaGVfdG9wX3BpeGVscyA9ICh1aW50MTZfdClmaW5hbF93aWR0aDsKKyAgLy8gU2NyYXRjaCBidWZmZXIgZm9yIHRlbXBvcmFyeSBCR1JBIHN0b3JhZ2UuIE5vdCBuZWVkZWQgZm9yIHBhbGV0dGVkIGFscGhhLgorICBjb25zdCB1aW50NjRfdCBjYWNoZV9waXhlbHMgPSAodWludDY0X3QpZmluYWxfd2lkdGggKiBOVU1fQVJHQl9DQUNIRV9ST1dTOworICBjb25zdCB1aW50NjRfdCB0b3RhbF9udW1fcGl4ZWxzID0KKyAgICAgIG51bV9waXhlbHMgKyBjYWNoZV90b3BfcGl4ZWxzICsgY2FjaGVfcGl4ZWxzOworCisgIGFzc2VydChkZWMtPndpZHRoXyA8PSBmaW5hbF93aWR0aCk7CisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQzMl90KSk7CisgIGlmIChkZWMtPnBpeGVsc18gPT0gTlVMTCkgeworICAgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBkZWMtPnBpeGVsc18gKyBudW1fcGl4ZWxzICsgY2FjaGVfdG9wX3BpeGVsczsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnM4YihWUDhMRGVjb2RlciogY29uc3QgZGVjKSB7CisgIGNvbnN0IHVpbnQ2NF90IHRvdGFsX251bV9waXhlbHMgPSAodWludDY0X3QpZGVjLT53aWR0aF8gKiBkZWMtPmhlaWdodF87CisgIGRlYy0+YXJnYl9jYWNoZV8gPSBOVUxMOyAgICAvLyBmb3Igc2FuaXR5IGNoZWNrCisgIGRlYy0+cGl4ZWxzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfbnVtX3BpeGVscywgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgaWYgKGRlYy0+cGl4ZWxzXyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PVVRfT0ZfTUVNT1JZOworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBTcGVjaWFsIHJvdy1wcm9jZXNzaW5nIHRoYXQgb25seSBzdG9yZXMgdGhlIGFscGhhIGRhdGEuCitzdGF0aWMgdm9pZCBFeHRyYWN0QWxwaGFSb3dzKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIGludCBsYXN0X3JvdykgeworICBpbnQgY3VyX3JvdyA9IGRlYy0+bGFzdF9yb3dfOworICBpbnQgbnVtX3Jvd3MgPSBsYXN0X3JvdyAtIGN1cl9yb3c7CisgIGNvbnN0IHVpbnQzMl90KiBpbiA9IGRlYy0+cGl4ZWxzXyArIGRlYy0+d2lkdGhfICogY3VyX3JvdzsKKworICBhc3NlcnQobGFzdF9yb3cgPD0gZGVjLT5pb18tPmNyb3BfYm90dG9tKTsKKyAgd2hpbGUgKG51bV9yb3dzID4gMCkgeworICAgIGNvbnN0IGludCBudW1fcm93c190b19wcm9jZXNzID0KKyAgICAgICAgKG51bV9yb3dzID4gTlVNX0FSR0JfQ0FDSEVfUk9XUykgPyBOVU1fQVJHQl9DQUNIRV9ST1dTIDogbnVtX3Jvd3M7CisgICAgLy8gRXh0cmFjdCBhbHBoYSAod2hpY2ggaXMgc3RvcmVkIGluIHRoZSBncmVlbiBwbGFuZSkuCisgICAgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjID0gKEFMUEhEZWNvZGVyKilkZWMtPmlvXy0+b3BhcXVlOworICAgIHVpbnQ4X3QqIGNvbnN0IG91dHB1dCA9IGFscGhfZGVjLT5vdXRwdXRfOworICAgIGNvbnN0IGludCB3aWR0aCA9IGRlYy0+aW9fLT53aWR0aDsgICAgICAvLyB0aGUgZmluYWwgd2lkdGggKCE9IGRlYy0+d2lkdGhfKQorICAgIGNvbnN0IGludCBjYWNoZV9waXhzID0gd2lkdGggKiBudW1fcm93c190b19wcm9jZXNzOworICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IG91dHB1dCArIHdpZHRoICogY3VyX3JvdzsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gZGVjLT5hcmdiX2NhY2hlXzsKKyAgICBBcHBseUludmVyc2VUcmFuc2Zvcm1zKGRlYywgbnVtX3Jvd3NfdG9fcHJvY2VzcywgaW4pOworICAgIFdlYlBFeHRyYWN0R3JlZW4oc3JjLCBkc3QsIGNhY2hlX3BpeHMpOworICAgIEFscGhhQXBwbHlGaWx0ZXIoYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICBjdXJfcm93LCBjdXJfcm93ICsgbnVtX3Jvd3NfdG9fcHJvY2VzcywgZHN0LCB3aWR0aCk7CisgICAgbnVtX3Jvd3MgLT0gbnVtX3Jvd3NfdG9fcHJvY2VzczsKKyAgICBpbiArPSBudW1fcm93c190b19wcm9jZXNzICogZGVjLT53aWR0aF87CisgICAgY3VyX3JvdyArPSBudW1fcm93c190b19wcm9jZXNzOworICB9CisgIGFzc2VydChjdXJfcm93ID09IGxhc3Rfcm93KTsKKyAgZGVjLT5sYXN0X3Jvd18gPSBkZWMtPmxhc3Rfb3V0X3Jvd18gPSBsYXN0X3JvdzsKK30KKworaW50IFZQOExEZWNvZGVBbHBoYUhlYWRlcihBTFBIRGVjb2RlciogY29uc3QgYWxwaF9kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4TERlY29kZXIqIGRlYyA9IFZQOExOZXcoKTsKKworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChhbHBoX2RlYyAhPSBOVUxMKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IGRlYzsKKworICBkZWMtPndpZHRoXyA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aGVpZ2h0XyA9IGFscGhfZGVjLT5oZWlnaHRfOworICBkZWMtPmlvXyA9ICZhbHBoX2RlYy0+aW9fOworICBkZWMtPmlvXy0+b3BhcXVlID0gYWxwaF9kZWM7CisgIGRlYy0+aW9fLT53aWR0aCA9IGFscGhfZGVjLT53aWR0aF87CisgIGRlYy0+aW9fLT5oZWlnaHQgPSBhbHBoX2RlYy0+aGVpZ2h0XzsKKworICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX09LOworICBWUDhMSW5pdEJpdFJlYWRlcigmZGVjLT5icl8sIGRhdGEsIGRhdGFfc2l6ZSk7CisKKyAgaWYgKCFEZWNvZGVJbWFnZVN0cmVhbShhbHBoX2RlYy0+d2lkdGhfLCBhbHBoX2RlYy0+aGVpZ2h0XywgMSwgZGVjLCBOVUxMKSkgeworICAgIGdvdG8gRXJyOworICB9CisKKyAgLy8gU3BlY2lhbCBjYXNlOiBpZiBhbHBoYSBkYXRhIHVzZXMgb25seSB0aGUgY29sb3IgaW5kZXhpbmcgdHJhbnNmb3JtIGFuZAorICAvLyBkb2Vzbid0IHVzZSBjb2xvciBjYWNoZSAoYSBmcmVxdWVudCBjYXNlKSwgd2Ugd2lsbCB1c2UgRGVjb2RlQWxwaGFEYXRhKCkKKyAgLy8gbWV0aG9kIHRoYXQgb25seSBuZWVkcyBhbGxvY2F0aW9uIG9mIDEgYnl0ZSBwZXIgcGl4ZWwgKGFscGhhIGNoYW5uZWwpLgorICBpZiAoZGVjLT5uZXh0X3RyYW5zZm9ybV8gPT0gMSAmJgorICAgICAgZGVjLT50cmFuc2Zvcm1zX1swXS50eXBlXyA9PSBDT0xPUl9JTkRFWElOR19UUkFOU0ZPUk0gJiYKKyAgICAgIElzOGJPcHRpbWl6YWJsZSgmZGVjLT5oZHJfKSkgeworICAgIGFscGhfZGVjLT51c2VfOGJfZGVjb2RlXyA9IDE7CisgICAgb2sgPSBBbGxvY2F0ZUludGVybmFsQnVmZmVyczhiKGRlYyk7CisgIH0gZWxzZSB7CisgICAgLy8gQWxsb2NhdGUgaW50ZXJuYWwgYnVmZmVycyAobm90ZSB0aGF0IGRlYy0+d2lkdGhfIG1heSBoYXZlIGNoYW5nZWQgaGVyZSkuCisgICAgYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID0gMDsKKyAgICBvayA9IEFsbG9jYXRlSW50ZXJuYWxCdWZmZXJzMzJiKGRlYywgYWxwaF9kZWMtPndpZHRoXyk7CisgIH0KKworICBpZiAoIW9rKSBnb3RvIEVycjsKKworICByZXR1cm4gMTsKKworIEVycjoKKyAgVlA4TERlbGV0ZShhbHBoX2RlYy0+dnA4bF9kZWNfKTsKKyAgYWxwaF9kZWMtPnZwOGxfZGVjXyA9IE5VTEw7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUFscGhhSW1hZ2VTdHJlYW0oQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLCBpbnQgbGFzdF9yb3cpIHsKKyAgVlA4TERlY29kZXIqIGNvbnN0IGRlYyA9IGFscGhfZGVjLT52cDhsX2RlY187CisgIGFzc2VydChkZWMgIT0gTlVMTCk7CisgIGFzc2VydChsYXN0X3JvdyA8PSBkZWMtPmhlaWdodF8pOworCisgIGlmIChkZWMtPmxhc3Rfcm93XyA+PSBsYXN0X3JvdykgeworICAgIHJldHVybiAxOyAgLy8gZG9uZQorICB9CisKKyAgaWYgKCFhbHBoX2RlYy0+dXNlXzhiX2RlY29kZV8pIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisKKyAgLy8gRGVjb2RlICh3aXRoIHNwZWNpYWwgcm93IHByb2Nlc3NpbmcpLgorICByZXR1cm4gYWxwaF9kZWMtPnVzZV84Yl9kZWNvZGVfID8KKyAgICAgIERlY29kZUFscGhhRGF0YShkZWMsICh1aW50OF90KilkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgbGFzdF9yb3cpIDoKKyAgICAgIERlY29kZUltYWdlRGF0YShkZWMsIGRlYy0+cGl4ZWxzXywgZGVjLT53aWR0aF8sIGRlYy0+aGVpZ2h0XywKKyAgICAgICAgICAgICAgICAgICAgICBsYXN0X3JvdywgRXh0cmFjdEFscGhhUm93cyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhMRGVjb2RlSGVhZGVyKFZQOExEZWNvZGVyKiBjb25zdCBkZWMsIFZQOElvKiBjb25zdCBpbykgeworICBpbnQgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhOworCisgIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChpbyA9PSBOVUxMKSB7CisgICAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNOworICAgIHJldHVybiAwOworICB9CisKKyAgZGVjLT5pb18gPSBpbzsKKyAgZGVjLT5zdGF0dXNfID0gVlA4X1NUQVRVU19PSzsKKyAgVlA4TEluaXRCaXRSZWFkZXIoJmRlYy0+YnJfLCBpby0+ZGF0YSwgaW8tPmRhdGFfc2l6ZSk7CisgIGlmICghUmVhZEltYWdlSW5mbygmZGVjLT5icl8sICZ3aWR0aCwgJmhlaWdodCwgJmhhc19hbHBoYSkpIHsKKyAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGRlYy0+c3RhdGVfID0gUkVBRF9ESU07CisgIGlvLT53aWR0aCA9IHdpZHRoOworICBpby0+aGVpZ2h0ID0gaGVpZ2h0OworCisgIGlmICghRGVjb2RlSW1hZ2VTdHJlYW0od2lkdGgsIGhlaWdodCwgMSwgZGVjLCBOVUxMKSkgZ290byBFcnJvcjsKKyAgcmV0dXJuIDE7CisKKyBFcnJvcjoKKyAgVlA4TENsZWFyKGRlYyk7CisgIGFzc2VydChkZWMtPnN0YXR1c18gIT0gVlA4X1NUQVRVU19PSyk7CisgIHJldHVybiAwOworfQorCitpbnQgVlA4TERlY29kZUltYWdlKFZQOExEZWNvZGVyKiBjb25zdCBkZWMpIHsKKyAgVlA4SW8qIGlvID0gTlVMTDsKKyAgV2ViUERlY1BhcmFtcyogcGFyYW1zID0gTlVMTDsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworCisgIGFzc2VydChkZWMtPmhkcl8uaHVmZm1hbl90YWJsZXNfICE9IE5VTEwpOworICBhc3NlcnQoZGVjLT5oZHJfLmh0cmVlX2dyb3Vwc18gIT0gTlVMTCk7CisgIGFzc2VydChkZWMtPmhkcl8ubnVtX2h0cmVlX2dyb3Vwc18gPiAwKTsKKworICBpbyA9IGRlYy0+aW9fOworICBhc3NlcnQoaW8gIT0gTlVMTCk7CisgIHBhcmFtcyA9IChXZWJQRGVjUGFyYW1zKilpby0+b3BhcXVlOworICBhc3NlcnQocGFyYW1zICE9IE5VTEwpOworCisgIC8vIEluaXRpYWxpemF0aW9uLgorICBpZiAoZGVjLT5zdGF0ZV8gIT0gUkVBRF9EQVRBKSB7CisgICAgZGVjLT5vdXRwdXRfID0gcGFyYW1zLT5vdXRwdXQ7CisgICAgYXNzZXJ0KGRlYy0+b3V0cHV0XyAhPSBOVUxMKTsKKworICAgIGlmICghV2ViUElvSW5pdEZyb21PcHRpb25zKHBhcmFtcy0+b3B0aW9ucywgaW8sIE1PREVfQkdSQSkpIHsKKyAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfSU5WQUxJRF9QQVJBTTsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKworICAgIGlmICghQWxsb2NhdGVJbnRlcm5hbEJ1ZmZlcnMzMmIoZGVjLCBpby0+d2lkdGgpKSBnb3RvIEVycjsKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgICAgaWYgKGlvLT51c2Vfc2NhbGluZyAmJiAhQWxsb2NhdGVBbmRJbml0UmVzY2FsZXIoZGVjLCBpbykpIGdvdG8gRXJyOworI2Vsc2UKKyAgICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7CisgICAgICBkZWMtPnN0YXR1c18gPSBWUDhfU1RBVFVTX0lOVkFMSURfUEFSQU07CisgICAgICBnb3RvIEVycjsKKyAgICB9CisjZW5kaWYKKyAgICBpZiAoaW8tPnVzZV9zY2FsaW5nIHx8IFdlYlBJc1ByZW11bHRpcGxpZWRNb2RlKGRlYy0+b3V0cHV0Xy0+Y29sb3JzcGFjZSkpIHsKKyAgICAgIC8vIG5lZWQgdGhlIGFscGhhLW11bHRpcGx5IGZ1bmN0aW9ucyBmb3IgcHJlbXVsdGlwbGllZCBvdXRwdXQgb3IgcmVzY2FsaW5nCisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworICAgIH0KKworICAgIGlmICghV2ViUElzUkdCTW9kZShkZWMtPm91dHB1dF8tPmNvbG9yc3BhY2UpKSB7CisgICAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYoKTsKKyAgICAgIGlmIChkZWMtPm91dHB1dF8tPnUuWVVWQS5hICE9IE5VTEwpIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgfQorICAgIGlmIChkZWMtPmluY3JlbWVudGFsXykgeworICAgICAgaWYgKGRlYy0+aGRyXy5jb2xvcl9jYWNoZV9zaXplXyA+IDAgJiYKKyAgICAgICAgICBkZWMtPmhkcl8uc2F2ZWRfY29sb3JfY2FjaGVfLmNvbG9yc18gPT0gTlVMTCkgeworICAgICAgICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmZGVjLT5oZHJfLnNhdmVkX2NvbG9yX2NhY2hlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjLT5oZHJfLmNvbG9yX2NhY2hlXy5oYXNoX2JpdHNfKSkgeworICAgICAgICAgIGRlYy0+c3RhdHVzXyA9IFZQOF9TVEFUVVNfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBkZWMtPnN0YXRlXyA9IFJFQURfREFUQTsKKyAgfQorCisgIC8vIERlY29kZS4KKyAgaWYgKCFEZWNvZGVJbWFnZURhdGEoZGVjLCBkZWMtPnBpeGVsc18sIGRlYy0+d2lkdGhfLCBkZWMtPmhlaWdodF8sCisgICAgICAgICAgICAgICAgICAgICAgIGlvLT5jcm9wX2JvdHRvbSwgUHJvY2Vzc1Jvd3MpKSB7CisgICAgZ290byBFcnI7CisgIH0KKworICBwYXJhbXMtPmxhc3RfeSA9IGRlYy0+bGFzdF9vdXRfcm93XzsKKyAgcmV0dXJuIDE7CisKKyBFcnI6CisgIFZQOExDbGVhcihkZWMpOworICBhc3NlcnQoZGVjLT5zdGF0dXNfICE9IFZQOF9TVEFUVVNfT0spOworICByZXR1cm4gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy92cDhsaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhsaV9kZWMuaApzaW1pbGFyaXR5IGluZGV4IDY4JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4bGkuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy92cDhsaV9kZWMuaAppbmRleCBkYmRkOWMxLi5jZWEyMmY3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvdnA4bGkuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3ZwOGxpX2RlYy5oCkBAIC0xMiwyMiArMTIsMTggQEAKIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAvLyAgICAgICAgIFZpa2FzIEFyb3JhKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCiAKLSNpZm5kZWYgV0VCUF9ERUNfVlA4TElfSF8KLSNkZWZpbmUgV0VCUF9ERUNfVlA4TElfSF8KKyNpZm5kZWYgV0VCUF9ERUNfVlA4TElfREVDX0hfCisjZGVmaW5lIFdFQlBfREVDX1ZQOExJX0RFQ19IXwogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSA8c3RyaW5nLmg+ICAgICAvLyBmb3IgbWVtY3B5KCkKICNlbmRpZgorI2luY2x1ZGUgInNyYy9kZWMvd2VicGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oIgogCi0jaW5jbHVkZSAiLi93ZWJwaS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2JpdF9yZWFkZXIuaCIKLSNpbmNsdWRlICIuLi91dGlscy9jb2xvcl9jYWNoZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL2h1ZmZtYW4uaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIApAQCAtNDcsMTIgKzQzLDkgQEAKIH07CiAKIHR5cGVkZWYgc3RydWN0IHsKLSAgSHVmZm1hblRyZWUgaHRyZWVzX1tIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdOwotfSBIVHJlZUdyb3VwOwotCi10eXBlZGVmIHN0cnVjdCB7CiAgIGludCAgICAgICAgICAgICBjb2xvcl9jYWNoZV9zaXplXzsKICAgVlA4TENvbG9yQ2FjaGUgIGNvbG9yX2NhY2hlXzsKKyAgVlA4TENvbG9yQ2FjaGUgIHNhdmVkX2NvbG9yX2NhY2hlXzsgIC8vIGZvciBpbmNyZW1lbnRhbAogCiAgIGludCAgICAgICAgICAgICBodWZmbWFuX21hc2tfOwogICBpbnQgICAgICAgICAgICAgaHVmZm1hbl9zdWJzYW1wbGVfYml0c187CkBAIC02MCwxMSArNTMsMTIgQEAKICAgdWludDMyX3QgICAgICAgKmh1ZmZtYW5faW1hZ2VfOwogICBpbnQgICAgICAgICAgICAgbnVtX2h0cmVlX2dyb3Vwc187CiAgIEhUcmVlR3JvdXAgICAgICpodHJlZV9ncm91cHNfOworICBIdWZmbWFuQ29kZSAgICAqaHVmZm1hbl90YWJsZXNfOwogfSBWUDhMTWV0YWRhdGE7CiAKLXR5cGVkZWYgc3RydWN0IHsKK3R5cGVkZWYgc3RydWN0IFZQOExEZWNvZGVyIFZQOExEZWNvZGVyOworc3RydWN0IFZQOExEZWNvZGVyIHsKICAgVlA4U3RhdHVzQ29kZSAgICBzdGF0dXNfOwotICBWUDhMRGVjb2RlU3RhdGUgIGFjdGlvbl87CiAgIFZQOExEZWNvZGVTdGF0ZSAgc3RhdGVfOwogICBWUDhJbyAgICAgICAgICAgKmlvXzsKIApAQCAtNzUsMTAgKzY5LDE2IEBACiAgIHVpbnQzMl90ICAgICAgICAqYXJnYl9jYWNoZV87ICAgIC8vIFNjcmF0Y2ggYnVmZmVyIGZvciB0ZW1wb3JhcnkgQkdSQSBzdG9yYWdlLgogCiAgIFZQOExCaXRSZWFkZXIgICAgYnJfOworICBpbnQgICAgICAgICAgICAgIGluY3JlbWVudGFsXzsgICAvLyBpZiB0cnVlLCBpbmNyZW1lbnRhbCBkZWNvZGluZyBpcyBleHBlY3RlZAorICBWUDhMQml0UmVhZGVyICAgIHNhdmVkX2JyXzsgICAgICAvLyBub3RlOiBjb3VsZCBiZSBsb2NhbCB2YXJpYWJsZXMgdG9vCisgIGludCAgICAgICAgICAgICAgc2F2ZWRfbGFzdF9waXhlbF87CiAKICAgaW50ICAgICAgICAgICAgICB3aWR0aF87CiAgIGludCAgICAgICAgICAgICAgaGVpZ2h0XzsKICAgaW50ICAgICAgICAgICAgICBsYXN0X3Jvd187ICAgICAgLy8gbGFzdCBpbnB1dCByb3cgZGVjb2RlZCBzbyBmYXIuCisgIGludCAgICAgICAgICAgICAgbGFzdF9waXhlbF87ICAgIC8vIGxhc3QgcGl4ZWwgZGVjb2RlZCBzbyBmYXIuIEhvd2V2ZXIsIGl0IG1heQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYmUgdHJhbnNmb3JtZWQsIHNjYWxlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3ItY29udmVydGVkIHlldC4KICAgaW50ICAgICAgICAgICAgICBsYXN0X291dF9yb3dfOyAgLy8gbGFzdCByb3cgb3V0cHV0IHNvIGZhci4KIAogICBWUDhMTWV0YWRhdGEgICAgIGhkcl87CkBAIC05MCwxOCArOTAsMjYgQEAKIAogICB1aW50OF90ICAgICAgICAgKnJlc2NhbGVyX21lbW9yeTsgIC8vIFdvcmtpbmcgbWVtb3J5IGZvciByZXNjYWxpbmcgd29yay4KICAgV2ViUFJlc2NhbGVyICAgICpyZXNjYWxlcjsgICAgICAgICAvLyBDb21tb24gcmVzY2FsZXIgZm9yIGFsbCBjaGFubmVscy4KLX0gVlA4TERlY29kZXI7Cit9OwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gaW50ZXJuYWwgZnVuY3Rpb25zLiBOb3QgcHVibGljLgogCitzdHJ1Y3QgQUxQSERlY29kZXI7ICAvLyBEZWZpbmVkIGluIGRlYy9hbHBoYWkuaC4KKwogLy8gaW4gdnA4bC5jCiAKLS8vIERlY29kZXMgYSByYXcgaW1hZ2Ugc3RyZWFtICh3aXRob3V0IGhlYWRlcikgYW5kIHN0b3JlIHRoZSBhbHBoYSBkYXRhCi0vLyBpbnRvICpvdXRwdXQsIHdoaWNoIG11c3QgYmUgb2Ygc2l6ZSB3aWR0aCB4IGhlaWdodC4gUmV0dXJucyBmYWxzZSBpbiBjYXNlCi0vLyBvZiBlcnJvci4KLWludCBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDhfdCogY29uc3Qgb3V0cHV0KTsKKy8vIERlY29kZXMgaW1hZ2UgaGVhZGVyIGZvciBhbHBoYSBkYXRhIHN0b3JlZCB1c2luZyBsb3NzbGVzcyBjb21wcmVzc2lvbi4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK2ludCBWUDhMRGVjb2RlQWxwaGFIZWFkZXIoc3RydWN0IEFMUEhEZWNvZGVyKiBjb25zdCBhbHBoX2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CisKKy8vIERlY29kZXMgKmF0IGxlYXN0KiAnbGFzdF9yb3cnIHJvd3Mgb2YgYWxwaGEuIElmIHNvbWUgb2YgdGhlIGluaXRpYWwgcm93cyBhcmUKKy8vIGFscmVhZHkgZGVjb2RlZCBpbiBwcmV2aW91cyBjYWxsKHMpLCBpdCB3aWxsIHJlc3VtZSBkZWNvZGluZyBmcm9tIHdoZXJlIGl0CisvLyB3YXMgcGF1c2VkLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGJpdHN0cmVhbSBlcnJvci4KK2ludCBWUDhMRGVjb2RlQWxwaGFJbWFnZVN0cmVhbShzdHJ1Y3QgQUxQSERlY29kZXIqIGNvbnN0IGFscGhfZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYXN0X3Jvdyk7CiAKIC8vIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZSBhIG5ldyBsb3NzbGVzcyBkZWNvZGVyIGluc3RhbmNlLgogVlA4TERlY29kZXIqIFZQOExOZXcodm9pZCk7CkBAIC0xMjIsOCArMTMwLDggQEAKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvKiBXRUJQX0RFQ19WUDhMSV9IXyAqLworI2VuZGlmICAvKiBXRUJQX0RFQ19WUDhMSV9ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy93ZWJwLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3dlYnBfZGVjLmMKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVjL3dlYnAuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwX2RlYy5jCmluZGV4IDMzNjRhYjguLjI0ZDQyMjcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy93ZWJwLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwX2RlYy5jCkBAIC0xMiwyMCArMTIsMTggQEAKIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2Vsc2UKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAiLi92cDhpLmgiCi0jaW5jbHVkZSAiLi92cDhsaS5oIgotI2luY2x1ZGUgIi4vd2VicGkuaCIKLSNpbmNsdWRlICIuLi93ZWJwL211eF90eXBlcy5oIiAgLy8gQUxQSEFfRkxBRwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3dlYnBpX2RlYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL211eF90eXBlcy5oIiAgLy8gQUxQSEFfRkxBRwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUklGRiBsYXlvdXQgaXM6CkBAIC00NywzOCArNDUsMzEgQEAKIC8vICAgMjAuLjIzICBWUDhYIGZsYWdzIGJpdC1tYXAgY29ycmVzcG9uZGluZyB0byB0aGUgY2h1bmstdHlwZXMgcHJlc2VudC4KIC8vICAgMjQuLjI2ICBXaWR0aCBvZiB0aGUgQ2FudmFzIEltYWdlLgogLy8gICAyNy4uMjkgIEhlaWdodCBvZiB0aGUgQ2FudmFzIEltYWdlLgotLy8gVGhlcmUgY2FuIGJlIGV4dHJhIGNodW5rcyBhZnRlciB0aGUgIlZQOFgiIGNodW5rIChJQ0NQLCBGUkdNLCBBTk1GLCBWUDgsCi0vLyBWUDhMLCBYTVAsIEVYSUYgIC4uLikKKy8vIFRoZXJlIGNhbiBiZSBleHRyYSBjaHVua3MgYWZ0ZXIgdGhlICJWUDhYIiBjaHVuayAoSUNDUCwgQU5NRiwgVlA4LCBWUDhMLAorLy8gWE1QLCBFWElGICAuLi4pCiAvLyBBbGwgc2l6ZXMgYXJlIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCiAvLyBOb3RlOiBjaHVuayBkYXRhIHNpemUgbXVzdCBiZSBwYWRkZWQgdG8gbXVsdGlwbGUgb2YgMiB3aGVuIHdyaXR0ZW4uCiAKLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBnZXRfbGUyNChjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7Ci0gIHJldHVybiBkYXRhWzBdIHwgKGRhdGFbMV0gPDwgOCkgfCAoZGF0YVsyXSA8PCAxNik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBnZXRfbGUzMihjb25zdCB1aW50OF90KiBjb25zdCBkYXRhKSB7Ci0gIHJldHVybiAodWludDMyX3QpZ2V0X2xlMjQoZGF0YSkgfCAoZGF0YVszXSA8PCAyNCk7Ci19Ci0KIC8vIFZhbGlkYXRlcyB0aGUgUklGRiBjb250YWluZXIgKGlmIGRldGVjdGVkKSBhbmQgc2tpcHMgb3ZlciBpdC4KLS8vIElmIGEgUklGRiBjb250YWluZXIgaXMgZGV0ZWN0ZWQsCi0vLyBSZXR1cm5zIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SIGZvciBpbnZhbGlkIGhlYWRlciwgYW5kCi0vLyAgICAgICAgIFZQOF9TVEFUVVNfT0sgb3RoZXJ3aXNlLgorLy8gSWYgYSBSSUZGIGNvbnRhaW5lciBpcyBkZXRlY3RlZCwgcmV0dXJuczoKKy8vICAgICBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUiBmb3IgaW52YWxpZCBoZWFkZXIsCisvLyAgICAgVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgZm9yIHRydW5jYXRlZCBkYXRhIGlmIGhhdmVfYWxsX2RhdGEgaXMgdHJ1ZSwKKy8vIGFuZCBWUDhfU1RBVFVTX09LIG90aGVyd2lzZS4KIC8vIEluIGNhc2UgdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgKHBhcnRpYWwgUklGRiBjb250YWluZXIpLCByZXR1cm4gMCBmb3IKIC8vICpyaWZmX3NpemUuIEVsc2UgcmV0dXJuIHRoZSBSSUZGIHNpemUgZXh0cmFjdGVkIGZyb20gdGhlIGhlYWRlci4KIHN0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlUklGRihjb25zdCB1aW50OF90KiogY29uc3QgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGNvbnN0IGRhdGFfc2l6ZSwgaW50IGhhdmVfYWxsX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCByaWZmX3NpemUpIHsKLSAgU0JfRENIRUNLKGRhdGEgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhkYXRhX3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhyaWZmX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQocmlmZl9zaXplICE9IE5VTEwpOwogCiAgICpyaWZmX3NpemUgPSAwOyAgLy8gRGVmYXVsdDogbm8gUklGRiBwcmVzZW50LgotICBpZiAoKmRhdGFfc2l6ZSA+PSBSSUZGX0hFQURFUl9TSVpFICYmICFTYk1lbW9yeUNvbXBhcmUoKmRhdGEsICJSSUZGIiwgVEFHX1NJWkUpKSB7Ci0gICAgaWYgKFNiTWVtb3J5Q29tcGFyZSgqZGF0YSArIDgsICJXRUJQIiwgVEFHX1NJWkUpKSB7CisgIGlmICgqZGF0YV9zaXplID49IFJJRkZfSEVBREVSX1NJWkUgJiYgIW1lbWNtcCgqZGF0YSwgIlJJRkYiLCBUQUdfU0laRSkpIHsKKyAgICBpZiAobWVtY21wKCpkYXRhICsgOCwgIldFQlAiLCBUQUdfU0laRSkpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIFdyb25nIGltYWdlIGZpbGUgc2lnbmF0dXJlLgogICAgIH0gZWxzZSB7Ci0gICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gZ2V0X2xlMzIoKmRhdGEgKyBUQUdfU0laRSk7CisgICAgICBjb25zdCB1aW50MzJfdCBzaXplID0gR2V0TEUzMigqZGF0YSArIFRBR19TSVpFKTsKICAgICAgIC8vIENoZWNrIHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2h1bmsgKGkuZSAiV0VCUCIgKyAiVlA4P25ubm4iKS4KICAgICAgIGlmIChzaXplIDwgVEFHX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRSkgewogICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7CkBAIC04Niw2ICs3Nyw5IEBACiAgICAgICBpZiAoc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CiAgICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgICAgIH0KKyAgICAgIGlmIChoYXZlX2FsbF9kYXRhICYmIChzaXplID4gKmRhdGFfc2l6ZSAtIENIVU5LX0hFQURFUl9TSVpFKSkgeworICAgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7ICAvLyBUcnVuY2F0ZWQgYml0c3RyZWFtLgorICAgICAgfQogICAgICAgLy8gV2UgaGF2ZSBhIFJJRkYgY29udGFpbmVyLiBTa2lwIGl0LgogICAgICAgKnJpZmZfc2l6ZSA9IHNpemU7CiAgICAgICAqZGF0YSArPSBSSUZGX0hFQURFUl9TSVpFOwpAQCAtMTA4LDkgKzEwMiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB3aWR0aF9wdHIsIGludCogY29uc3QgaGVpZ2h0X3B0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgZmxhZ3NfcHRyKSB7CiAgIGNvbnN0IHVpbnQzMl90IHZwOHhfc2l6ZSA9IENIVU5LX0hFQURFUl9TSVpFICsgVlA4WF9DSFVOS19TSVpFOwotICBTQl9EQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGRhdGFfc2l6ZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGZvdW5kX3ZwOHggIT0gTlVMTCk7CisgIGFzc2VydChkYXRhICE9IE5VTEwpOworICBhc3NlcnQoZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQoZm91bmRfdnA4eCAhPSBOVUxMKTsKIAogICAqZm91bmRfdnA4eCA9IDA7CiAKQEAgLTExOCwxMCArMTEyLDEwIEBACiAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCiAgIH0KIAotICBpZiAoIVNiTWVtb3J5Q29tcGFyZSgqZGF0YSwgIlZQOFgiLCBUQUdfU0laRSkpIHsKKyAgaWYgKCFtZW1jbXAoKmRhdGEsICJWUDhYIiwgVEFHX1NJWkUpKSB7CiAgICAgaW50IHdpZHRoLCBoZWlnaHQ7CiAgICAgdWludDMyX3QgZmxhZ3M7Ci0gICAgY29uc3QgdWludDMyX3QgY2h1bmtfc2l6ZSA9IGdldF9sZTMyKCpkYXRhICsgVEFHX1NJWkUpOworICAgIGNvbnN0IHVpbnQzMl90IGNodW5rX3NpemUgPSBHZXRMRTMyKCpkYXRhICsgVEFHX1NJWkUpOwogICAgIGlmIChjaHVua19zaXplICE9IFZQOFhfQ0hVTktfU0laRSkgewogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOyAgLy8gV3JvbmcgY2h1bmsgc2l6ZS4KICAgICB9CkBAIC0xMzAsOSArMTI0LDkgQEAKICAgICBpZiAoKmRhdGFfc2l6ZSA8IHZwOHhfc2l6ZSkgewogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOyAgLy8gSW5zdWZmaWNpZW50IGRhdGEuCiAgICAgfQotICAgIGZsYWdzID0gZ2V0X2xlMzIoKmRhdGEgKyA4KTsKLSAgICB3aWR0aCA9IDEgKyBnZXRfbGUyNCgqZGF0YSArIDEyKTsKLSAgICBoZWlnaHQgPSAxICsgZ2V0X2xlMjQoKmRhdGEgKyAxNSk7CisgICAgZmxhZ3MgPSBHZXRMRTMyKCpkYXRhICsgOCk7CisgICAgd2lkdGggPSAxICsgR2V0TEUyNCgqZGF0YSArIDEyKTsKKyAgICBoZWlnaHQgPSAxICsgR2V0TEUyNCgqZGF0YSArIDE1KTsKICAgICBpZiAod2lkdGggKiAodWludDY0X3QpaGVpZ2h0ID49IE1BWF9JTUFHRV9BUkVBKSB7CiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19CSVRTVFJFQU1fRVJST1I7ICAvLyBpbWFnZSBpcyB0b28gbGFyZ2UKICAgICB9CkBAIC0xNjUsMTMgKzE1OSwxMyBAQAogICB1aW50MzJfdCB0b3RhbF9zaXplID0gVEFHX1NJWkUgKyAgICAgICAgICAgLy8gIldFQlAiLgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hVTktfSEVBREVSX1NJWkUgKyAgLy8gIlZQOFhubm5uIi4KICAgICAgICAgICAgICAgICAgICAgICAgIFZQOFhfQ0hVTktfU0laRTsgICAgIC8vIGRhdGEuCi0gIFNCX0RDSEVDSyhkYXRhICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soZGF0YV9zaXplICE9IE5VTEwpOworICBhc3NlcnQoZGF0YSAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGFfc2l6ZSAhPSBOVUxMKTsKICAgYnVmID0gKmRhdGE7CiAgIGJ1Zl9zaXplID0gKmRhdGFfc2l6ZTsKIAotICBTQl9EQ0hFQ0soYWxwaGFfZGF0YSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGFscGhhX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChhbHBoYV9kYXRhICE9IE5VTEwpOworICBhc3NlcnQoYWxwaGFfc2l6ZSAhPSBOVUxMKTsKICAgKmFscGhhX2RhdGEgPSBOVUxMOwogICAqYWxwaGFfc2l6ZSA9IDA7CiAKQEAgLTE4Niw3ICsxODAsNyBAQAogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOwogICAgIH0KIAotICAgIGNodW5rX3NpemUgPSBnZXRfbGUzMihidWYgKyBUQUdfU0laRSk7CisgICAgY2h1bmtfc2l6ZSA9IEdldExFMzIoYnVmICsgVEFHX1NJWkUpOwogICAgIGlmIChjaHVua19zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgICAgICAgICAgLy8gTm90IGEgdmFsaWQgY2h1bmsgc2l6ZS4KICAgICB9CkBAIC0yMDMsOCArMTk3LDggQEAKICAgICAvLyBwYXJzZWQgYWxsIHRoZSBvcHRpb25hbCBjaHVua3MuCiAgICAgLy8gTm90ZTogVGhpcyBjaGVjayBtdXN0IG9jY3VyIGJlZm9yZSB0aGUgY2hlY2sgJ2J1Zl9zaXplIDwgZGlza19jaHVua19zaXplJwogICAgIC8vIGJlbG93IHRvIGFsbG93IGluY29tcGxldGUgVlA4L1ZQOEwgY2h1bmtzLgotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKGJ1ZiwgIlZQOCAiLCBUQUdfU0laRSkgfHwKLSAgICAgICAgIVNiTWVtb3J5Q29tcGFyZShidWYsICJWUDhMIiwgVEFHX1NJWkUpKSB7CisgICAgaWYgKCFtZW1jbXAoYnVmLCAiVlA4ICIsIFRBR19TSVpFKSB8fAorICAgICAgICAhbWVtY21wKGJ1ZiwgIlZQOEwiLCBUQUdfU0laRSkpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX09LOwogICAgIH0KIApAQCAtMjEyLDcgKzIwNiw3IEBACiAgICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgaWYgKCFTYk1lbW9yeUNvbXBhcmUoYnVmLCAiQUxQSCIsIFRBR19TSVpFKSkgeyAgICAgICAgIC8vIEEgdmFsaWQgQUxQSCBoZWFkZXIuCisgICAgaWYgKCFtZW1jbXAoYnVmLCAiQUxQSCIsIFRBR19TSVpFKSkgeyAgICAgICAgIC8vIEEgdmFsaWQgQUxQSCBoZWFkZXIuCiAgICAgICAqYWxwaGFfZGF0YSA9IGJ1ZiArIENIVU5LX0hFQURFUl9TSVpFOwogICAgICAgKmFscGhhX3NpemUgPSBjaHVua19zaXplOwogICAgIH0KQEAgLTIzMiwyMCArMjI2LDE5IEBACiAvLyBleHRyYWN0ZWQgZnJvbSB0aGUgVlA4L1ZQOEwgY2h1bmsgaGVhZGVyLgogLy8gVGhlIGZsYWcgJyppc19sb3NzbGVzcycgaXMgc2V0IHRvIDEgaW4gY2FzZSBvZiBWUDhMIGNodW5rIC8gcmF3IFZQOEwgZGF0YS4KIHN0YXRpYyBWUDhTdGF0dXNDb2RlIFBhcnNlVlA4SGVhZGVyKGNvbnN0IHVpbnQ4X3QqKiBjb25zdCBkYXRhX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJpZmZfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgY2h1bmtfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgZGF0YV9zaXplLCBpbnQgaGF2ZV9hbGxfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsIHNpemVfdCogY29uc3QgY2h1bmtfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaXNfbG9zc2xlc3MpIHsKICAgY29uc3QgdWludDhfdCogY29uc3QgZGF0YSA9ICpkYXRhX3B0cjsKLSAgY29uc3QgaW50IGlzX3ZwOCA9ICFTYk1lbW9yeUNvbXBhcmUoZGF0YSwgIlZQOCAiLCBUQUdfU0laRSk7Ci0gIGNvbnN0IGludCBpc192cDhsID0gIVNiTWVtb3J5Q29tcGFyZShkYXRhLCAiVlA4TCIsIFRBR19TSVpFKTsKKyAgY29uc3QgaW50IGlzX3ZwOCA9ICFtZW1jbXAoZGF0YSwgIlZQOCAiLCBUQUdfU0laRSk7CisgIGNvbnN0IGludCBpc192cDhsID0gIW1lbWNtcChkYXRhLCAiVlA4TCIsIFRBR19TSVpFKTsKICAgY29uc3QgdWludDMyX3QgbWluaW1hbF9zaXplID0KICAgICAgIFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkU7ICAvLyAiV0VCUCIgKyAiVlA4IG5ubm4iIE9SCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIldFQlAiICsgIlZQOExubm5uIgotICBTQl9EQ0hFQ0soZGF0YSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGRhdGFfc2l6ZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGNodW5rX3NpemUgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhpc19sb3NzbGVzcyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChjaHVua19zaXplICE9IE5VTEwpOworICBhc3NlcnQoaXNfbG9zc2xlc3MgIT0gTlVMTCk7CiAKICAgaWYgKCpkYXRhX3NpemUgPCBDSFVOS19IRUFERVJfU0laRSkgewogICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIEluc3VmZmljaWVudCBkYXRhLgpAQCAtMjUzLDEwICsyNDYsMTMgQEAKIAogICBpZiAoaXNfdnA4IHx8IGlzX3ZwOGwpIHsKICAgICAvLyBCaXRzdHJlYW0gY29udGFpbnMgVlA4L1ZQOEwgaGVhZGVyLgotICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBnZXRfbGUzMihkYXRhICsgVEFHX1NJWkUpOworICAgIGNvbnN0IHVpbnQzMl90IHNpemUgPSBHZXRMRTMyKGRhdGEgKyBUQUdfU0laRSk7CiAgICAgaWYgKChyaWZmX3NpemUgPj0gbWluaW1hbF9zaXplKSAmJiAoc2l6ZSA+IHJpZmZfc2l6ZSAtIG1pbmltYWxfc2l6ZSkpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsgIC8vIEluY29uc2lzdGVudCBzaXplIGluZm9ybWF0aW9uLgogICAgIH0KKyAgICBpZiAoaGF2ZV9hbGxfZGF0YSAmJiAoc2l6ZSA+ICpkYXRhX3NpemUgLSBDSFVOS19IRUFERVJfU0laRSkpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsgIC8vIFRydW5jYXRlZCBiaXRzdHJlYW0uCisgICAgfQogICAgIC8vIFNraXAgb3ZlciBDSFVOS19IRUFERVJfU0laRSBieXRlcyBmcm9tIFZQOC9WUDhMIEhlYWRlci4KICAgICAqY2h1bmtfc2l6ZSA9IHNpemU7CiAgICAgKmRhdGFfcHRyICs9IENIVU5LX0hFQURFUl9TSVpFOwpAQCAtMjkwLDIxICsyODYsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBoYXNfYWxwaGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGhhc19hbmltYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBIZWFkZXJTdHJ1Y3R1cmUqIGNvbnN0IGhlYWRlcnMpIHsKKyAgaW50IGNhbnZhc193aWR0aCA9IDA7CisgIGludCBjYW52YXNfaGVpZ2h0ID0gMDsKKyAgaW50IGltYWdlX3dpZHRoID0gMDsKKyAgaW50IGltYWdlX2hlaWdodCA9IDA7CiAgIGludCBmb3VuZF9yaWZmID0gMDsKICAgaW50IGZvdW5kX3ZwOHggPSAwOworICBpbnQgYW5pbWF0aW9uX3ByZXNlbnQgPSAwOworICBjb25zdCBpbnQgaGF2ZV9hbGxfZGF0YSA9IChoZWFkZXJzICE9IE5VTEwpID8gaGVhZGVycy0+aGF2ZV9hbGxfZGF0YSA6IDA7CisKICAgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CiAgIFdlYlBIZWFkZXJTdHJ1Y3R1cmUgaGRyczsKIAogICBpZiAoZGF0YSA9PSBOVUxMIHx8IGRhdGFfc2l6ZSA8IFJJRkZfSEVBREVSX1NJWkUpIHsKICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CiAgIH0KLSAgU2JNZW1vcnlTZXQoJmhkcnMsIDAsIHNpemVvZihoZHJzKSk7CisgIG1lbXNldCgmaGRycywgMCwgc2l6ZW9mKGhkcnMpKTsKICAgaGRycy5kYXRhID0gZGF0YTsKICAgaGRycy5kYXRhX3NpemUgPSBkYXRhX3NpemU7CiAKICAgLy8gU2tpcCBvdmVyIFJJRkYgaGVhZGVyLgotICBzdGF0dXMgPSBQYXJzZVJJRkYoJmRhdGEsICZkYXRhX3NpemUsICZoZHJzLnJpZmZfc2l6ZSk7CisgIHN0YXR1cyA9IFBhcnNlUklGRigmZGF0YSwgJmRhdGFfc2l6ZSwgaGF2ZV9hbGxfZGF0YSwgJmhkcnMucmlmZl9zaXplKTsKICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CiAgICAgcmV0dXJuIHN0YXR1czsgICAvLyBXcm9uZyBSSUZGIGhlYWRlciAvIGluc3VmZmljaWVudCBkYXRhLgogICB9CkBAIC0zMTMsODYgKzMxNywxMTkgQEAKICAgLy8gU2tpcCBvdmVyIFZQOFguCiAgIHsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgc3RhdHVzID0gUGFyc2VWUDhYKCZkYXRhLCAmZGF0YV9zaXplLCAmZm91bmRfdnA4eCwgd2lkdGgsIGhlaWdodCwgJmZsYWdzKTsKKyAgICBzdGF0dXMgPSBQYXJzZVZQOFgoJmRhdGEsICZkYXRhX3NpemUsICZmb3VuZF92cDh4LAorICAgICAgICAgICAgICAgICAgICAgICAmY2FudmFzX3dpZHRoLCAmY2FudmFzX2hlaWdodCwgJmZsYWdzKTsKICAgICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKICAgICAgIHJldHVybiBzdGF0dXM7ICAvLyBXcm9uZyBWUDhYIC8gaW5zdWZmaWNpZW50IGRhdGEuCiAgICAgfQorICAgIGFuaW1hdGlvbl9wcmVzZW50ID0gISEoZmxhZ3MgJiBBTklNQVRJT05fRkxBRyk7CiAgICAgaWYgKCFmb3VuZF9yaWZmICYmIGZvdW5kX3ZwOHgpIHsKICAgICAgIC8vIE5vdGU6IFRoaXMgcmVzdHJpY3Rpb24gbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSwgaWYgaXQgYmVjb21lcwogICAgICAgLy8gbmVjZXNzYXJ5IHRvIHNlbmQgVlA4WCBjaHVuayB0byB0aGUgZGVjb2Rlci4KICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgICB9CiAgICAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSAqaGFzX2FscGhhID0gISEoZmxhZ3MgJiBBTFBIQV9GTEFHKTsKLSAgICBpZiAoaGFzX2FuaW1hdGlvbiAhPSBOVUxMKSAqaGFzX2FuaW1hdGlvbiA9ICEhKGZsYWdzICYgQU5JTUFUSU9OX0ZMQUcpOwotICAgIGlmIChmb3VuZF92cDh4ICYmIGhlYWRlcnMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7ICAvLyBSZXR1cm4gZmVhdHVyZXMgZnJvbSBWUDhYIGhlYWRlci4KKyAgICBpZiAoaGFzX2FuaW1hdGlvbiAhPSBOVUxMKSAqaGFzX2FuaW1hdGlvbiA9IGFuaW1hdGlvbl9wcmVzZW50OworICAgIGlmIChmb3JtYXQgIT0gTlVMTCkgKmZvcm1hdCA9IDA7ICAgLy8gZGVmYXVsdCA9IHVuZGVmaW5lZAorCisgICAgaW1hZ2Vfd2lkdGggPSBjYW52YXNfd2lkdGg7CisgICAgaW1hZ2VfaGVpZ2h0ID0gY2FudmFzX2hlaWdodDsKKyAgICBpZiAoZm91bmRfdnA4eCAmJiBhbmltYXRpb25fcHJlc2VudCAmJiBoZWFkZXJzID09IE5VTEwpIHsKKyAgICAgIHN0YXR1cyA9IFZQOF9TVEFUVVNfT0s7CisgICAgICBnb3RvIFJldHVybldpZHRoSGVpZ2h0OyAgLy8gSnVzdCByZXR1cm4gZmVhdHVyZXMgZnJvbSBWUDhYIGhlYWRlci4KICAgICB9CiAgIH0KIAotICBpZiAoZGF0YV9zaXplIDwgVEFHX1NJWkUpIHJldHVybiBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKKyAgaWYgKGRhdGFfc2l6ZSA8IFRBR19TSVpFKSB7CisgICAgc3RhdHVzID0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsKKyAgfQogCiAgIC8vIFNraXAgb3ZlciBvcHRpb25hbCBjaHVua3MgaWYgZGF0YSBzdGFydGVkIHdpdGggIlJJRkYgKyBWUDhYIiBvciAiQUxQSCIuCiAgIGlmICgoZm91bmRfcmlmZiAmJiBmb3VuZF92cDh4KSB8fAotICAgICAgKCFmb3VuZF9yaWZmICYmICFmb3VuZF92cDh4ICYmICFTYk1lbW9yeUNvbXBhcmUoZGF0YSwgIkFMUEgiLCBUQUdfU0laRSkpKSB7CisgICAgICAoIWZvdW5kX3JpZmYgJiYgIWZvdW5kX3ZwOHggJiYgIW1lbWNtcChkYXRhLCAiQUxQSCIsIFRBR19TSVpFKSkpIHsKICAgICBzdGF0dXMgPSBQYXJzZU9wdGlvbmFsQ2h1bmtzKCZkYXRhLCAmZGF0YV9zaXplLCBoZHJzLnJpZmZfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZHJzLmFscGhhX2RhdGEsICZoZHJzLmFscGhhX2RhdGFfc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7Ci0gICAgICByZXR1cm4gc3RhdHVzOyAgLy8gRm91bmQgYW4gaW52YWxpZCBjaHVuayBzaXplIC8gaW5zdWZmaWNpZW50IGRhdGEuCisgICAgICBnb3RvIFJldHVybldpZHRoSGVpZ2h0OyAgLy8gSW52YWxpZCBjaHVuayBzaXplIC8gaW5zdWZmaWNpZW50IGRhdGEuCiAgICAgfQogICB9CiAKICAgLy8gU2tpcCBvdmVyIFZQOC9WUDhMIGhlYWRlci4KLSAgc3RhdHVzID0gUGFyc2VWUDhIZWFkZXIoJmRhdGEsICZkYXRhX3NpemUsIGhkcnMucmlmZl9zaXplLAorICBzdGF0dXMgPSBQYXJzZVZQOEhlYWRlcigmZGF0YSwgJmRhdGFfc2l6ZSwgaGF2ZV9hbGxfZGF0YSwgaGRycy5yaWZmX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZoZHJzLmNvbXByZXNzZWRfc2l6ZSwgJmhkcnMuaXNfbG9zc2xlc3MpOwogICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKLSAgICByZXR1cm4gc3RhdHVzOyAgLy8gV3JvbmcgVlA4L1ZQOEwgY2h1bmstaGVhZGVyIC8gaW5zdWZmaWNpZW50IGRhdGEuCisgICAgZ290byBSZXR1cm5XaWR0aEhlaWdodDsgIC8vIFdyb25nIFZQOC9WUDhMIGNodW5rLWhlYWRlciAvIGluc3VmZmljaWVudCBkYXRhLgogICB9CiAgIGlmIChoZHJzLmNvbXByZXNzZWRfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CiAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwogICB9CiAKKyAgaWYgKGZvcm1hdCAhPSBOVUxMICYmICFhbmltYXRpb25fcHJlc2VudCkgeworICAgICpmb3JtYXQgPSBoZHJzLmlzX2xvc3NsZXNzID8gMiA6IDE7CisgIH0KKwogICBpZiAoIWhkcnMuaXNfbG9zc2xlc3MpIHsKICAgICBpZiAoZGF0YV9zaXplIDwgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKSB7Ci0gICAgICByZXR1cm4gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgICBzdGF0dXMgPSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQTsKKyAgICAgIGdvdG8gUmV0dXJuV2lkdGhIZWlnaHQ7CiAgICAgfQogICAgIC8vIFZhbGlkYXRlcyByYXcgVlA4IGRhdGEuCi0gICAgaWYgKCFWUDhHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KWhkcnMuY29tcHJlc3NlZF9zaXplLCB3aWR0aCwgaGVpZ2h0KSkgeworICAgIGlmICghVlA4R2V0SW5mbyhkYXRhLCBkYXRhX3NpemUsICh1aW50MzJfdCloZHJzLmNvbXByZXNzZWRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmltYWdlX3dpZHRoLCAmaW1hZ2VfaGVpZ2h0KSkgewogICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfQklUU1RSRUFNX0VSUk9SOwogICAgIH0KICAgfSBlbHNlIHsKICAgICBpZiAoZGF0YV9zaXplIDwgVlA4TF9GUkFNRV9IRUFERVJfU0laRSkgewotICAgICAgcmV0dXJuIFZQOF9TVEFUVVNfTk9UX0VOT1VHSF9EQVRBOworICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEE7CisgICAgICBnb3RvIFJldHVybldpZHRoSGVpZ2h0OwogICAgIH0KICAgICAvLyBWYWxpZGF0ZXMgcmF3IFZQOEwgZGF0YS4KLSAgICBpZiAoIVZQOExHZXRJbmZvKGRhdGEsIGRhdGFfc2l6ZSwgd2lkdGgsIGhlaWdodCwgaGFzX2FscGhhKSkgeworICAgIGlmICghVlA4TEdldEluZm8oZGF0YSwgZGF0YV9zaXplLCAmaW1hZ2Vfd2lkdGgsICZpbWFnZV9oZWlnaHQsIGhhc19hbHBoYSkpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKICAgICB9CiAgIH0KLQotICBpZiAoaGFzX2FscGhhICE9IE5VTEwpIHsKLSAgICAvLyBJZiB0aGUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBWUDhYL1ZQOEwgY2h1bmsgdGhlIG9ubHkgZGVmaW5pdGl2ZSB3YXkKLSAgICAvLyB0byBzZXQgdGhpcyBpcyBieSBsb29raW5nIGZvciBhbHBoYSBkYXRhIChmcm9tIGFuIEFMUEggY2h1bmspLgotICAgICpoYXNfYWxwaGEgfD0gKGhkcnMuYWxwaGFfZGF0YSAhPSBOVUxMKTsKKyAgLy8gVmFsaWRhdGVzIGltYWdlIHNpemUgY29oZXJlbmN5LgorICBpZiAoZm91bmRfdnA4eCkgeworICAgIGlmIChjYW52YXNfd2lkdGggIT0gaW1hZ2Vfd2lkdGggfHwgY2FudmFzX2hlaWdodCAhPSBpbWFnZV9oZWlnaHQpIHsKKyAgICAgIHJldHVybiBWUDhfU1RBVFVTX0JJVFNUUkVBTV9FUlJPUjsKKyAgICB9CiAgIH0KICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewogICAgICpoZWFkZXJzID0gaGRyczsKICAgICBoZWFkZXJzLT5vZmZzZXQgPSBkYXRhIC0gaGVhZGVycy0+ZGF0YTsKLSAgICBTQl9EQ0hFQ0soKHVpbnQ2NF90KShkYXRhIC0gaGVhZGVycy0+ZGF0YSkgPCBNQVhfQ0hVTktfUEFZTE9BRCk7Ci0gICAgU0JfRENIRUNLKGhlYWRlcnMtPm9mZnNldCA9PSBoZWFkZXJzLT5kYXRhX3NpemUgLSBkYXRhX3NpemUpOworICAgIGFzc2VydCgodWludDY0X3QpKGRhdGEgLSBoZWFkZXJzLT5kYXRhKSA8IE1BWF9DSFVOS19QQVlMT0FEKTsKKyAgICBhc3NlcnQoaGVhZGVycy0+b2Zmc2V0ID09IGhlYWRlcnMtPmRhdGFfc2l6ZSAtIGRhdGFfc2l6ZSk7CiAgIH0KLSAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7ICAvLyBSZXR1cm4gZmVhdHVyZXMgZnJvbSBWUDggaGVhZGVyLgorIFJldHVybldpZHRoSGVpZ2h0OgorICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0sgfHwKKyAgICAgIChzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEgJiYgZm91bmRfdnA4eCAmJiBoZWFkZXJzID09IE5VTEwpKSB7CisgICAgaWYgKGhhc19hbHBoYSAhPSBOVUxMKSB7CisgICAgICAvLyBJZiB0aGUgZGF0YSBkaWQgbm90IGNvbnRhaW4gYSBWUDhYL1ZQOEwgY2h1bmsgdGhlIG9ubHkgZGVmaW5pdGl2ZSB3YXkKKyAgICAgIC8vIHRvIHNldCB0aGlzIGlzIGJ5IGxvb2tpbmcgZm9yIGFscGhhIGRhdGEgKGZyb20gYW4gQUxQSCBjaHVuaykuCisgICAgICAqaGFzX2FscGhhIHw9IChoZHJzLmFscGhhX2RhdGEgIT0gTlVMTCk7CisgICAgfQorICAgIGlmICh3aWR0aCAhPSBOVUxMKSAqd2lkdGggPSBpbWFnZV93aWR0aDsKKyAgICBpZiAoaGVpZ2h0ICE9IE5VTEwpICpoZWlnaHQgPSBpbWFnZV9oZWlnaHQ7CisgICAgcmV0dXJuIFZQOF9TVEFUVVNfT0s7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIHN0YXR1czsKKyAgfQogfQogCiBWUDhTdGF0dXNDb2RlIFdlYlBQYXJzZUhlYWRlcnMoV2ViUEhlYWRlclN0cnVjdHVyZSogY29uc3QgaGVhZGVycykgewotICBWUDhTdGF0dXNDb2RlIHN0YXR1czsKKyAgLy8gc3RhdHVzIGlzIG1hcmtlZCB2b2xhdGlsZSBhcyBhIHdvcmthcm91bmQgZm9yIGEgY2xhbmctMy44IChhYXJjaDY0KSBidWcKKyAgdm9sYXRpbGUgVlA4U3RhdHVzQ29kZSBzdGF0dXM7CiAgIGludCBoYXNfYW5pbWF0aW9uID0gMDsKLSAgU0JfRENIRUNLKGhlYWRlcnMgIT0gTlVMTCk7CisgIGFzc2VydChoZWFkZXJzICE9IE5VTEwpOwogICAvLyBmaWxsIG91dCBoZWFkZXJzLCBpZ25vcmUgd2lkdGgvaGVpZ2h0L2hhc19hbHBoYS4KICAgc3RhdHVzID0gUGFyc2VIZWFkZXJzSW50ZXJuYWwoaGVhZGVycy0+ZGF0YSwgaGVhZGVycy0+ZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCAmaGFzX2FuaW1hdGlvbiwgaGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsICZoYXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBoZWFkZXJzKTsKICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LIHx8IHN0YXR1cyA9PSBWUDhfU1RBVFVTX05PVF9FTk9VR0hfREFUQSkgewotICAgIC8vIFRPRE8oanplcm4pOiBmdWxsIHN1cHBvcnQgb2YgYW5pbWF0aW9uIGZyYW1lcyB3aWxsIHJlcXVpcmUgQVBJIGFkZGl0aW9ucy4KKyAgICAvLyBUaGUgV2ViUERlbXV4IEFQSSArIGxpYndlYnAgY2FuIGJlIHVzZWQgdG8gZGVjb2RlIGluZGl2aWR1YWwKKyAgICAvLyB1bmNvbXBvc2l0ZWQgZnJhbWVzIG9yIHRoZSBXZWJQQW5pbURlY29kZXIgY2FuIGJlIHVzZWQgdG8gZnVsbHkKKyAgICAvLyByZWNvbnN0cnVjdCB0aGVtIChzZWUgd2VicC9kZW11eC5oKS4KICAgICBpZiAoaGFzX2FuaW1hdGlvbikgewogICAgICAgc3RhdHVzID0gVlA4X1NUQVRVU19VTlNVUFBPUlRFRF9GRUFUVVJFOwogICAgIH0KQEAgLTQwNCw4ICs0NDEsOCBAQAogLy8gV2ViUERlY1BhcmFtcwogCiB2b2lkIFdlYlBSZXNldERlY1BhcmFtcyhXZWJQRGVjUGFyYW1zKiBjb25zdCBwYXJhbXMpIHsKLSAgaWYgKHBhcmFtcykgewotICAgIFNiTWVtb3J5U2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKKyAgaWYgKHBhcmFtcyAhPSBOVUxMKSB7CisgICAgbWVtc2V0KHBhcmFtcywgMCwgc2l6ZW9mKCpwYXJhbXMpKTsKICAgfQogfQogCkBAIC00MjEsMTIgKzQ1OCwxMyBAQAogCiAgIGhlYWRlcnMuZGF0YSA9IGRhdGE7CiAgIGhlYWRlcnMuZGF0YV9zaXplID0gZGF0YV9zaXplOworICBoZWFkZXJzLmhhdmVfYWxsX2RhdGEgPSAxOwogICBzdGF0dXMgPSBXZWJQUGFyc2VIZWFkZXJzKCZoZWFkZXJzKTsgICAvLyBQcm9jZXNzIFByZS1WUDggY2h1bmtzLgogICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKICAgICByZXR1cm4gc3RhdHVzOwogICB9CiAKLSAgU0JfRENIRUNLKHBhcmFtcyAhPSBOVUxMKTsKKyAgYXNzZXJ0KHBhcmFtcyAhPSBOVUxMKTsKICAgVlA4SW5pdElvKCZpbyk7CiAgIGlvLmRhdGEgPSBoZWFkZXJzLmRhdGEgKyBoZWFkZXJzLm9mZnNldDsKICAgaW8uZGF0YV9zaXplID0gaGVhZGVycy5kYXRhX3NpemUgLSBoZWFkZXJzLm9mZnNldDsKQEAgLTQzNywxMSArNDc1LDYgQEAKICAgICBpZiAoZGVjID09IE5VTEwpIHsKICAgICAgIHJldHVybiBWUDhfU1RBVFVTX09VVF9PRl9NRU1PUlk7CiAgICAgfQotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotICAgIGRlYy0+dXNlX3RocmVhZHNfID0gcGFyYW1zLT5vcHRpb25zICYmIChwYXJhbXMtPm9wdGlvbnMtPnVzZV90aHJlYWRzID4gMCk7Ci0jZWxzZQotICAgIGRlYy0+dXNlX3RocmVhZHNfID0gMDsKLSNlbmRpZgogICAgIGRlYy0+YWxwaGFfZGF0YV8gPSBoZWFkZXJzLmFscGhhX2RhdGE7CiAgICAgZGVjLT5hbHBoYV9kYXRhX3NpemVfID0gaGVhZGVycy5hbHBoYV9kYXRhX3NpemU7CiAKQEAgLTQ1Myw2ICs0ODYsMTAgQEAKICAgICAgIHN0YXR1cyA9IFdlYlBBbGxvY2F0ZURlY0J1ZmZlcihpby53aWR0aCwgaW8uaGVpZ2h0LCBwYXJhbXMtPm9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5vdXRwdXQpOwogICAgICAgaWYgKHN0YXR1cyA9PSBWUDhfU1RBVFVTX09LKSB7ICAvLyBEZWNvZGUKKyAgICAgICAgLy8gVGhpcyBjaGFuZ2UgbXVzdCBiZSBkb25lIGJlZm9yZSBjYWxsaW5nIFZQOERlY29kZSgpCisgICAgICAgIGRlYy0+bXRfbWV0aG9kXyA9IFZQOEdldFRocmVhZE1ldGhvZChwYXJhbXMtPm9wdGlvbnMsICZoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW8ud2lkdGgsIGlvLmhlaWdodCk7CisgICAgICAgIFZQOEluaXREaXRoZXJpbmcocGFyYW1zLT5vcHRpb25zLCBkZWMpOwogICAgICAgICBpZiAoIVZQOERlY29kZShkZWMsICZpbykpIHsKICAgICAgICAgICBzdGF0dXMgPSBkZWMtPnN0YXR1c187CiAgICAgICAgIH0KQEAgLTQ4MSw2ICs1MTgsMTIgQEAKIAogICBpZiAoc3RhdHVzICE9IFZQOF9TVEFUVVNfT0spIHsKICAgICBXZWJQRnJlZURlY0J1ZmZlcihwYXJhbXMtPm91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHBhcmFtcy0+b3B0aW9ucyAhPSBOVUxMICYmIHBhcmFtcy0+b3B0aW9ucy0+ZmxpcCkgeworICAgICAgLy8gVGhpcyByZXN0b3JlcyB0aGUgb3JpZ2luYWwgc3RyaWRlIHZhbHVlcyBpZiBvcHRpb25zLT5mbGlwIHdhcyB1c2VkCisgICAgICAvLyBkdXJpbmcgdGhlIGNhbGwgdG8gV2ViUEFsbG9jYXRlRGVjQnVmZmVyIGFib3ZlLgorICAgICAgc3RhdHVzID0gV2ViUEZsaXBCdWZmZXIocGFyYW1zLT5vdXRwdXQpOworICAgIH0KICAgfQogICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNjMxLDE1ICs2NzQsMTQgQEAKICAgICAqdiA9IGJ1Zi0+djsKICAgICAqc3RyaWRlID0gYnVmLT55X3N0cmlkZTsKICAgICAqdXZfc3RyaWRlID0gYnVmLT51X3N0cmlkZTsKLSAgICBTQl9EQ0hFQ0soYnVmLT51X3N0cmlkZSA9PSBidWYtPnZfc3RyaWRlKTsKKyAgICBhc3NlcnQoYnVmLT51X3N0cmlkZSA9PSBidWYtPnZfc3RyaWRlKTsKICAgfQogICByZXR1cm4gb3V0OwogfQogCiBzdGF0aWMgdm9pZCBEZWZhdWx0RmVhdHVyZXMoV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcykgewotICBTQl9EQ0hFQ0soZmVhdHVyZXMgIT0gTlVMTCk7Ci0gIFNiTWVtb3J5U2V0KGZlYXR1cmVzLCAwLCBzaXplb2YoKmZlYXR1cmVzKSk7Ci0gIGZlYXR1cmVzLT5iaXRzdHJlYW1fdmVyc2lvbiA9IDA7CisgIGFzc2VydChmZWF0dXJlcyAhPSBOVUxMKTsKKyAgbWVtc2V0KGZlYXR1cmVzLCAwLCBzaXplb2YoKmZlYXR1cmVzKSk7CiB9CiAKIHN0YXRpYyBWUDhTdGF0dXNDb2RlIEdldEZlYXR1cmVzKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCkBAIC02NTMsNyArNjk1LDcgQEAKICAgcmV0dXJuIFBhcnNlSGVhZGVyc0ludGVybmFsKGRhdGEsIGRhdGFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmZWF0dXJlcy0+d2lkdGgsICZmZWF0dXJlcy0+aGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT5oYXNfYWxwaGEsICZmZWF0dXJlcy0+aGFzX2FuaW1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZlYXR1cmVzLT5mb3JtYXQsIE5VTEwpOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjg4LDcgKzczMCw3IEBACiAgIGlmIChjb25maWcgPT0gTlVMTCkgewogICAgIHJldHVybiAwOwogICB9Ci0gIFNiTWVtb3J5U2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKKyAgbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKCpjb25maWcpKTsKICAgRGVmYXVsdEZlYXR1cmVzKCZjb25maWctPmlucHV0KTsKICAgV2ViUEluaXREZWNCdWZmZXIoJmNvbmZpZy0+b3V0cHV0KTsKICAgcmV0dXJuIDE7CkBAIC03MjQsOSArNzY2LDI0IEBACiAgIH0KIAogICBXZWJQUmVzZXREZWNQYXJhbXMoJnBhcmFtcyk7Ci0gIHBhcmFtcy5vdXRwdXQgPSAmY29uZmlnLT5vdXRwdXQ7CiAgIHBhcmFtcy5vcHRpb25zID0gJmNvbmZpZy0+b3B0aW9uczsKLSAgc3RhdHVzID0gRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpOworICBwYXJhbXMub3V0cHV0ID0gJmNvbmZpZy0+b3V0cHV0OworICBpZiAoV2ViUEF2b2lkU2xvd01lbW9yeShwYXJhbXMub3V0cHV0LCAmY29uZmlnLT5pbnB1dCkpIHsKKyAgICAvLyBkZWNvZGluZyB0byBzbG93IG1lbW9yeTogdXNlIGEgdGVtcG9yYXJ5IGluLW1lbSBidWZmZXIgdG8gZGVjb2RlIGludG8uCisgICAgV2ViUERlY0J1ZmZlciBpbl9tZW1fYnVmZmVyOworICAgIFdlYlBJbml0RGVjQnVmZmVyKCZpbl9tZW1fYnVmZmVyKTsKKyAgICBpbl9tZW1fYnVmZmVyLmNvbG9yc3BhY2UgPSBjb25maWctPm91dHB1dC5jb2xvcnNwYWNlOworICAgIGluX21lbV9idWZmZXIud2lkdGggPSBjb25maWctPmlucHV0LndpZHRoOworICAgIGluX21lbV9idWZmZXIuaGVpZ2h0ID0gY29uZmlnLT5pbnB1dC5oZWlnaHQ7CisgICAgcGFyYW1zLm91dHB1dCA9ICZpbl9tZW1fYnVmZmVyOworICAgIHN0YXR1cyA9IERlY29kZUludG8oZGF0YSwgZGF0YV9zaXplLCAmcGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzID09IFZQOF9TVEFUVVNfT0spIHsgIC8vIGRvIHRoZSBzbG93LWNvcHkKKyAgICAgIHN0YXR1cyA9IFdlYlBDb3B5RGVjQnVmZmVyUGl4ZWxzKCZpbl9tZW1fYnVmZmVyLCAmY29uZmlnLT5vdXRwdXQpOworICAgIH0KKyAgICBXZWJQRnJlZURlY0J1ZmZlcigmaW5fbWVtX2J1ZmZlcik7CisgIH0gZWxzZSB7CisgICAgc3RhdHVzID0gRGVjb2RlSW50byhkYXRhLCBkYXRhX3NpemUsICZwYXJhbXMpOworICB9CiAKICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTc0Nyw5ICs4MDQsOSBAQAogICAgIGggPSBvcHRpb25zLT5jcm9wX2hlaWdodDsKICAgICB4ID0gb3B0aW9ucy0+Y3JvcF9sZWZ0OwogICAgIHkgPSBvcHRpb25zLT5jcm9wX3RvcDsKLSAgICBpZiAoIVdlYlBJc1JHQk1vZGUoc3JjX2NvbG9yc3BhY2UpKSB7ICAgLy8gb25seSBzbmFwIGZvciBZVVY0MjAgb3IgWVVWNDIyCisgICAgaWYgKCFXZWJQSXNSR0JNb2RlKHNyY19jb2xvcnNwYWNlKSkgeyAgIC8vIG9ubHkgc25hcCBmb3IgWVVWNDIwCiAgICAgICB4ICY9IH4xOwotICAgICAgeSAmPSB+MTsgICAgLy8gVE9ETyhsYXRlcik6IG9ubHkgZm9yIFlVVjQyMCwgbm90IFlVVjQyMi4KKyAgICAgIHkgJj0gfjE7CiAgICAgfQogICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB3IDw9IDAgfHwgaCA8PSAwIHx8IHggKyB3ID4gVyB8fCB5ICsgaCA+IEgpIHsKICAgICAgIHJldHVybiAwOyAgLy8gb3V0IG9mIGZyYW1lIGJvdW5kYXJ5IGVycm9yCkBAIC03NjUsMTUgKzgyMiwxNyBAQAogICAvLyBTY2FsaW5nCiAgIGlvLT51c2Vfc2NhbGluZyA9IChvcHRpb25zICE9IE5VTEwpICYmIChvcHRpb25zLT51c2Vfc2NhbGluZyA+IDApOwogICBpZiAoaW8tPnVzZV9zY2FsaW5nKSB7Ci0gICAgaWYgKG9wdGlvbnMtPnNjYWxlZF93aWR0aCA8PSAwIHx8IG9wdGlvbnMtPnNjYWxlZF9oZWlnaHQgPD0gMCkgeworICAgIGludCBzY2FsZWRfd2lkdGggPSBvcHRpb25zLT5zY2FsZWRfd2lkdGg7CisgICAgaW50IHNjYWxlZF9oZWlnaHQgPSBvcHRpb25zLT5zY2FsZWRfaGVpZ2h0OworICAgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucyh3LCBoLCAmc2NhbGVkX3dpZHRoLCAmc2NhbGVkX2hlaWdodCkpIHsKICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpby0+c2NhbGVkX3dpZHRoID0gb3B0aW9ucy0+c2NhbGVkX3dpZHRoOwotICAgIGlvLT5zY2FsZWRfaGVpZ2h0ID0gb3B0aW9ucy0+c2NhbGVkX2hlaWdodDsKKyAgICBpby0+c2NhbGVkX3dpZHRoID0gc2NhbGVkX3dpZHRoOworICAgIGlvLT5zY2FsZWRfaGVpZ2h0ID0gc2NhbGVkX2hlaWdodDsKICAgfQogCiAgIC8vIEZpbHRlcgotICBpby0+YnlwYXNzX2ZpbHRlcmluZyA9IG9wdGlvbnMgJiYgb3B0aW9ucy0+YnlwYXNzX2ZpbHRlcmluZzsKKyAgaW8tPmJ5cGFzc19maWx0ZXJpbmcgPSAob3B0aW9ucyAhPSBOVUxMKSAmJiBvcHRpb25zLT5ieXBhc3NfZmlsdGVyaW5nOwogCiAgIC8vIEZhbmN5IHVwc2FtcGxlcgogI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKQEAgLTc5MCw3ICs4NDksMyBAQAogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlYy93ZWJwaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwaV9kZWMuaApzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicGkuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlYy93ZWJwaV9kZWMuaAppbmRleCA0YWUwYmZjLi5jMzc4YmE2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kZWMvd2VicGkuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVjL3dlYnBpX2RlYy5oCkBAIC0xMSwyMiArMTEsMjUgQEAKIC8vCiAvLyBBdXRob3I6IHNvbW5hdGhAZ29vZ2xlLmNvbSAoU29tbmF0aCBCYW5lcmplZSkKIAotI2lmbmRlZiBXRUJQX0RFQ19XRUJQSV9IXwotI2RlZmluZSBXRUJQX0RFQ19XRUJQSV9IXworI2lmbmRlZiBXRUJQX0RFQ19XRUJQSV9ERUNfSF8KKyNkZWZpbmUgV0VCUF9ERUNfV0VCUElfREVDX0hfCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNpbmNsdWRlICIuLi91dGlscy9yZXNjYWxlci5oIgotI2luY2x1ZGUgIi4vZGVjb2RlX3ZwOC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4X2RlYy5oIgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gV2ViUERlY1BhcmFtczogRGVjb2Rpbmcgb3V0cHV0IHBhcmFtZXRlcnMuIFRyYW5zaWVudCBpbnRlcm5hbCBvYmplY3QuCiAKIHR5cGVkZWYgc3RydWN0IFdlYlBEZWNQYXJhbXMgV2ViUERlY1BhcmFtczsKIHR5cGVkZWYgaW50ICgqT3V0cHV0RnVuYykoY29uc3QgVlA4SW8qIGNvbnN0IGlvLCBXZWJQRGVjUGFyYW1zKiBjb25zdCBwKTsKLXR5cGVkZWYgaW50ICgqT3V0cHV0Um93RnVuYykoV2ViUERlY1BhcmFtcyogY29uc3QgcCwgaW50IHlfcG9zKTsKK3R5cGVkZWYgaW50ICgqT3V0cHV0QWxwaGFGdW5jKShjb25zdCBWUDhJbyogY29uc3QgaW8sIFdlYlBEZWNQYXJhbXMqIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX251bV9vdXRfbGluZXMpOwordHlwZWRlZiBpbnQgKCpPdXRwdXRSb3dGdW5jKShXZWJQRGVjUGFyYW1zKiBjb25zdCBwLCBpbnQgeV9wb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfb3V0X2xpbmVzKTsKIAogc3RydWN0IFdlYlBEZWNQYXJhbXMgewogICBXZWJQRGVjQnVmZmVyKiBvdXRwdXQ7ICAgICAgICAgICAgIC8vIG91dHB1dCBidWZmZXIuCkBAIC0zNSwxMiArMzgsMTIgQEAKIAogICBpbnQgbGFzdF95OyAgICAgICAgICAgICAgICAgLy8gY29vcmRpbmF0ZSBvZiB0aGUgbGluZSB0aGF0IHdhcyBsYXN0IG91dHB1dAogICBjb25zdCBXZWJQRGVjb2Rlck9wdGlvbnMqIG9wdGlvbnM7ICAvLyBpZiBub3QgTlVMTCwgdXNlIGFsdCBkZWNvZGluZyBmZWF0dXJlcwotICAvLyByZXNjYWxlcnMKLSAgV2ViUFJlc2NhbGVyIHNjYWxlcl95LCBzY2FsZXJfdSwgc2NhbGVyX3YsIHNjYWxlcl9hOworCisgIFdlYlBSZXNjYWxlciogc2NhbGVyX3ksICpzY2FsZXJfdSwgKnNjYWxlcl92LCAqc2NhbGVyX2E7ICAvLyByZXNjYWxlcnMKICAgdm9pZCogbWVtb3J5OyAgICAgICAgICAgICAgICAgIC8vIG92ZXJhbGwgc2NyYXRjaCBtZW1vcnkgZm9yIHRoZSBvdXRwdXQgd29yay4KIAogICBPdXRwdXRGdW5jIGVtaXQ7ICAgICAgICAgICAgICAgLy8gb3V0cHV0IFJHQiBvciBZVVYgc2FtcGxlcwotICBPdXRwdXRGdW5jIGVtaXRfYWxwaGE7ICAgICAgICAgLy8gb3V0cHV0IGFscGhhIGNoYW5uZWwKKyAgT3V0cHV0QWxwaGFGdW5jIGVtaXRfYWxwaGE7ICAgIC8vIG91dHB1dCBhbHBoYSBjaGFubmVsCiAgIE91dHB1dFJvd0Z1bmMgZW1pdF9hbHBoYV9yb3c7ICAvLyBvdXRwdXQgb25lIGxpbmUgb2YgcmVzY2FsZWQgYWxwaGEgdmFsdWVzCiB9OwogCkBAIC01NCw2ICs1Nyw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7ICAgICAgICAgLy8gaW5wdXQgYnVmZmVyCiAgIHNpemVfdCBkYXRhX3NpemU7ICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIHNpemUKKyAgaW50IGhhdmVfYWxsX2RhdGE7ICAgICAgICAgICAvLyB0cnVlIGlmIGFsbCBkYXRhIGlzIGtub3duIHRvIGJlIGF2YWlsYWJsZQogICBzaXplX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBtYWluIGRhdGEgY2h1bmsgKFZQOCBvciBWUDhMKQogICBjb25zdCB1aW50OF90KiBhbHBoYV9kYXRhOyAgIC8vIHBvaW50cyB0byBhbHBoYSBjaHVuayAoaWYgcHJlc2VudCkKICAgc2l6ZV90IGFscGhhX2RhdGFfc2l6ZTsgICAgICAvLyBhbHBoYSBjaHVuayBzaXplCkBAIC05MywyNCArOTcsMzcgQEAKIC8vIGRpbWVuc2lvbiAvIGV0Yy4pLiBJZiAqb3B0aW9ucyBpcyBub3QgTlVMTCwgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgb3B0aW9ucycKIC8vIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGFuZCBhcHBseSB0aGVtIHRvIHRoZSB3aWR0aC9oZWlnaHQgZGltZW5zaW9ucyBvZiB0aGUKIC8vIG91dHB1dCBidWZmZXIuIFRoaXMgdGFrZXMgY3JvcHBpbmcgLyBzY2FsaW5nIC8gcm90YXRpb24gaW50byBhY2NvdW50LgorLy8gQWxzbyBpbmNvcnBvcmF0ZXMgdGhlIG9wdGlvbnMtPmZsaXAgZmxhZyB0byBmbGlwIHRoZSBidWZmZXIgcGFyYW1ldGVycyBpZgorLy8gbmVlZGVkLgogVlA4U3RhdHVzQ29kZSBXZWJQQWxsb2NhdGVEZWNCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUERlY29kZXJPcHRpb25zKiBjb25zdCBvcHRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgYnVmZmVyKTsKIAorLy8gRmxpcCBidWZmZXIgdmVydGljYWxseSBieSBuZWdhdGluZyB0aGUgdmFyaW91cyBzdHJpZGVzLgorVlA4U3RhdHVzQ29kZSBXZWJQRmxpcEJ1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBidWZmZXIpOworCiAvLyBDb3B5ICdzcmMnIGludG8gJ2RzdCcgYnVmZmVyLCBtYWtpbmcgc3VyZSAnZHN0JyBpcyBub3QgbWFya2VkIGFzIG93bmVyIG9mIHRoZQotLy8gbWVtb3J5IChzdGlsbCBoZWxkIGJ5ICdzcmMnKS4KKy8vIG1lbW9yeSAoc3RpbGwgaGVsZCBieSAnc3JjJykuIE5vIHBpeGVscyBhcmUgY29waWVkLgogdm9pZCBXZWJQQ29weURlY0J1ZmZlcihjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCk7CiAKIC8vIENvcHkgYW5kIHRyYW5zZmVyIG93bmVyc2hpcCBmcm9tIHNyYyB0byBkc3QgKGJld2FyZSBvZiBwYXJhbWV0ZXIgb3JkZXIhKQogdm9pZCBXZWJQR3JhYkRlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBjb25zdCBzcmMsIFdlYlBEZWNCdWZmZXIqIGNvbnN0IGRzdCk7CiAKKy8vIENvcHkgcGl4ZWxzIGZyb20gJ3NyYycgaW50byBhICpwcmVhbGxvY2F0ZWQqICdkc3QnIGJ1ZmZlci4gUmV0dXJucworLy8gVlA4X1NUQVRVU19JTlZBTElEX1BBUkFNIGlmIHRoZSAnZHN0JyBpcyBub3Qgc2V0IHVwIGNvcnJlY3RseSBmb3IgdGhlIGNvcHkuCitWUDhTdGF0dXNDb2RlIFdlYlBDb3B5RGVjQnVmZmVyUGl4ZWxzKGNvbnN0IFdlYlBEZWNCdWZmZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY0J1ZmZlciogY29uc3QgZHN0KTsKIAorLy8gUmV0dXJucyB0cnVlIGlmIGRlY29kaW5nIHdpbGwgYmUgc2xvdyB3aXRoIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKy8vIGFuZCBiaXRzdHJlYW0gZmVhdHVyZXMuCitpbnQgV2ViUEF2b2lkU2xvd01lbW9yeShjb25zdCBXZWJQRGVjQnVmZmVyKiBjb25zdCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQQml0c3RyZWFtRmVhdHVyZXMqIGNvbnN0IGZlYXR1cmVzKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIAotI2VuZGlmICAvKiBXRUJQX0RFQ19XRUJQSV9IXyAqLworI2VuZGlmICAvKiBXRUJQX0RFQ19XRUJQSV9ERUNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTgwYmRjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMTggQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbGliX0xUTElCUkFSSUVTID0gbGlid2VicGRlbXV4LmxhCisKK2xpYndlYnBkZW11eF9sYV9TT1VSQ0VTID0KK2xpYndlYnBkZW11eF9sYV9TT1VSQ0VTICs9IGFuaW1fZGVjb2RlLmMgZGVtdXguYworCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgPQorbGlid2VicGRlbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvZGVjb2RlLmgKK2xpYndlYnBkZW11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL2RlbXV4LmgKK2xpYndlYnBkZW11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL211eF90eXBlcy5oCitsaWJ3ZWJwZGVtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC90eXBlcy5oCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitsaWJ3ZWJwZGVtdXhfbGFfTElCQUREID0gLi4vbGlid2VicC5sYQorbGlid2VicGRlbXV4X2xhX0xERkxBR1MgPSAtbm8tdW5kZWZpbmVkIC12ZXJzaW9uLWluZm8gMjo0OjAKK2xpYndlYnBkZW11eGluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKK3BrZ2NvbmZpZ19EQVRBID0gbGlid2VicGRlbXV4LnBjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvYW5pbV9kZWNvZGUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9hbmltX2RlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZTMxMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvYW5pbV9kZWNvZGUuYwpAQCAtMCwwICsxLDQ1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBBbmltRGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KKy8vCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2RlbXV4LmgiCisKKyNkZWZpbmUgTlVNX0NIQU5ORUxTIDQKKwordHlwZWRlZiB2b2lkICgqQmxlbmRSb3dGdW5jKSh1aW50MzJfdCogY29uc3QsIGNvbnN0IHVpbnQzMl90KiBjb25zdCwgaW50KTsKK3N0YXRpYyB2b2lkIEJsZW5kUGl4ZWxSb3dOb25QcmVtdWx0KHVpbnQzMl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0LCBpbnQgbnVtX3BpeGVscyk7CitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93UHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLCBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpOworCitzdHJ1Y3QgV2ViUEFuaW1EZWNvZGVyIHsKKyAgV2ViUERlbXV4ZXIqIGRlbXV4XzsgICAgICAgICAgICAgLy8gRGVtdXhlciBjcmVhdGVkIGZyb20gZ2l2ZW4gV2ViUCBiaXRzdHJlYW0uCisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZ187ICAgICAgIC8vIERlY29kZXIgY29uZmlnLgorICAvLyBOb3RlOiB3ZSB1c2UgYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24gYmxlbmRpbmcgbXVsdGlwbGUgcGl4ZWxzIGF0IGEgdGltZSB0bworICAvLyBhbGxvdyBwb3NzaWJsZSBpbmxpbmluZyBvZiBwZXItcGl4ZWwgYmxlbmRpbmcgZnVuY3Rpb24uCisgIEJsZW5kUm93RnVuYyBibGVuZF9mdW5jXzsgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGNob3NlIGJsZW5kIHJvdyBmdW5jdGlvbi4KKyAgV2ViUEFuaW1JbmZvIGluZm9fOyAgICAgICAgICAgICAgLy8gR2xvYmFsIGluZm8gYWJvdXQgdGhlIGFuaW1hdGlvbi4KKyAgdWludDhfdCogY3Vycl9mcmFtZV87ICAgICAgICAgICAgLy8gQ3VycmVudCBjYW52YXMgKG5vdCBkaXNwb3NlZCkuCisgIHVpbnQ4X3QqIHByZXZfZnJhbWVfZGlzcG9zZWRfOyAgIC8vIFByZXZpb3VzIGNhbnZhcyAocHJvcGVybHkgZGlzcG9zZWQpLgorICBpbnQgcHJldl9mcmFtZV90aW1lc3RhbXBfOyAgICAgICAvLyBQcmV2aW91cyBmcmFtZSB0aW1lc3RhbXAgKG1pbGxpc2Vjb25kcykuCisgIFdlYlBJdGVyYXRvciBwcmV2X2l0ZXJfOyAgICAgICAgIC8vIEl0ZXJhdG9yIG9iamVjdCBmb3IgcHJldmlvdXMgZnJhbWUuCisgIGludCBwcmV2X2ZyYW1lX3dhc19rZXlmcmFtZV87ICAgIC8vIFRydWUgaWYgcHJldmlvdXMgZnJhbWUgd2FzIGEga2V5ZnJhbWUuCisgIGludCBuZXh0X2ZyYW1lXzsgICAgICAgICAgICAgICAgIC8vIEluZGV4IG9mIHRoZSBuZXh0IGZyYW1lIHRvIGJlIGRlY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHN0YXJ0aW5nIGZyb20gMSkuCit9OworCitzdGF0aWMgdm9pZCBEZWZhdWx0RGVjb2Rlck9wdGlvbnMoV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogY29uc3QgZGVjX29wdGlvbnMpIHsKKyAgZGVjX29wdGlvbnMtPmNvbG9yX21vZGUgPSBNT0RFX1JHQkE7CisgIGRlY19vcHRpb25zLT51c2VfdGhyZWFkcyA9IDA7Cit9CisKK2ludCBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdEludGVybmFsKFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGRlY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFiaV92ZXJzaW9uKSB7CisgIGlmIChkZWNfb3B0aW9ucyA9PSBOVUxMIHx8CisgICAgICBXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUoYWJpX3ZlcnNpb24sIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgRGVmYXVsdERlY29kZXJPcHRpb25zKGRlY19vcHRpb25zKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgQXBwbHlEZWNvZGVyT3B0aW9ucyhjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiBjb25zdCBkZWNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQW5pbURlY29kZXIqIGNvbnN0IGRlYykgeworICBXRUJQX0NTUF9NT0RFIG1vZGU7CisgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcgPSAmZGVjLT5jb25maWdfOworICBhc3NlcnQoZGVjX29wdGlvbnMgIT0gTlVMTCk7CisKKyAgbW9kZSA9IGRlY19vcHRpb25zLT5jb2xvcl9tb2RlOworICBpZiAobW9kZSAhPSBNT0RFX1JHQkEgJiYgbW9kZSAhPSBNT0RFX0JHUkEgJiYKKyAgICAgIG1vZGUgIT0gTU9ERV9yZ2JBICYmIG1vZGUgIT0gTU9ERV9iZ3JBKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZGVjLT5ibGVuZF9mdW5jXyA9IChtb2RlID09IE1PREVfUkdCQSB8fCBtb2RlID09IE1PREVfQkdSQSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/ICZCbGVuZFBpeGVsUm93Tm9uUHJlbXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgIDogJkJsZW5kUGl4ZWxSb3dQcmVtdWx0OworICBXZWJQSW5pdERlY29kZXJDb25maWcoY29uZmlnKTsKKyAgY29uZmlnLT5vdXRwdXQuY29sb3JzcGFjZSA9IG1vZGU7CisgIGNvbmZpZy0+b3V0cHV0LmlzX2V4dGVybmFsX21lbW9yeSA9IDE7CisgIGNvbmZpZy0+b3B0aW9ucy51c2VfdGhyZWFkcyA9IGRlY19vcHRpb25zLT51c2VfdGhyZWFkczsKKyAgLy8gTm90ZTogY29uZmlnLT5vdXRwdXQudS5SR0JBIGlzIHNldCBhdCB0aGUgdGltZSBvZiBkZWNvZGluZyBlYWNoIGZyYW1lLgorICByZXR1cm4gMTsKK30KKworV2ViUEFuaW1EZWNvZGVyKiBXZWJQQW5pbURlY29kZXJOZXdJbnRlcm5hbCgKKyAgICBjb25zdCBXZWJQRGF0YSogd2VicF9kYXRhLCBjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiBkZWNfb3B0aW9ucywKKyAgICBpbnQgYWJpX3ZlcnNpb24pIHsKKyAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyBvcHRpb25zOworICBXZWJQQW5pbURlY29kZXIqIGRlYyA9IE5VTEw7CisgIGlmICh3ZWJwX2RhdGEgPT0gTlVMTCB8fAorICAgICAgV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGFiaV92ZXJzaW9uLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgLy8gTm90ZTogY2FsbG9jKCkgc28gdGhhdCB0aGUgcG9pbnRlciBtZW1iZXJzIGFyZSBpbml0aWFsaXplZCB0byBOVUxMLgorICBkZWMgPSAoV2ViUEFuaW1EZWNvZGVyKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmRlYykpOworICBpZiAoZGVjID09IE5VTEwpIGdvdG8gRXJyb3I7CisKKyAgaWYgKGRlY19vcHRpb25zICE9IE5VTEwpIHsKKyAgICBvcHRpb25zID0gKmRlY19vcHRpb25zOworICB9IGVsc2UgeworICAgIERlZmF1bHREZWNvZGVyT3B0aW9ucygmb3B0aW9ucyk7CisgIH0KKyAgaWYgKCFBcHBseURlY29kZXJPcHRpb25zKCZvcHRpb25zLCBkZWMpKSBnb3RvIEVycm9yOworCisgIGRlYy0+ZGVtdXhfID0gV2ViUERlbXV4KHdlYnBfZGF0YSk7CisgIGlmIChkZWMtPmRlbXV4XyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGRlYy0+aW5mb18uY2FudmFzX3dpZHRoID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOworICBkZWMtPmluZm9fLmNhbnZhc19oZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGRlYy0+ZGVtdXhfLCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOworICBkZWMtPmluZm9fLmxvb3BfY291bnQgPSBXZWJQRGVtdXhHZXRJKGRlYy0+ZGVtdXhfLCBXRUJQX0ZGX0xPT1BfQ09VTlQpOworICBkZWMtPmluZm9fLmJnY29sb3IgPSBXZWJQRGVtdXhHZXRJKGRlYy0+ZGVtdXhfLCBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IpOworICBkZWMtPmluZm9fLmZyYW1lX2NvdW50ID0gV2ViUERlbXV4R2V0SShkZWMtPmRlbXV4XywgV0VCUF9GRl9GUkFNRV9DT1VOVCk7CisKKyAgLy8gTm90ZTogY2FsbG9jKCkgYmVjYXVzZSB3ZSBmaWxsIGZyYW1lIHdpdGggemVyb2VzIGFzIHdlbGwuCisgIGRlYy0+Y3Vycl9mcmFtZV8gPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2MoCisgICAgICBkZWMtPmluZm9fLmNhbnZhc193aWR0aCAqIE5VTV9DSEFOTkVMUywgZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0KTsKKyAgaWYgKGRlYy0+Y3Vycl9mcmFtZV8gPT0gTlVMTCkgZ290byBFcnJvcjsKKyAgZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXyA9ICh1aW50OF90KilXZWJQU2FmZUNhbGxvYygKKyAgICAgIGRlYy0+aW5mb18uY2FudmFzX3dpZHRoICogTlVNX0NIQU5ORUxTLCBkZWMtPmluZm9fLmNhbnZhc19oZWlnaHQpOworICBpZiAoZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXyA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIFdlYlBBbmltRGVjb2RlclJlc2V0KGRlYyk7CisgIHJldHVybiBkZWM7CisKKyBFcnJvcjoKKyAgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKGRlYyk7CisgIHJldHVybiBOVUxMOworfQorCitpbnQgV2ViUEFuaW1EZWNvZGVyR2V0SW5mbyhjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYywgV2ViUEFuaW1JbmZvKiBpbmZvKSB7CisgIGlmIChkZWMgPT0gTlVMTCB8fCBpbmZvID09IE5VTEwpIHJldHVybiAwOworICAqaW5mbyA9IGRlYy0+aW5mb187CisgIHJldHVybiAxOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZyYW1lIGNvdmVycyB0aGUgZnVsbCBjYW52YXMuCitzdGF0aWMgaW50IElzRnVsbEZyYW1lKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgcmV0dXJuICh3aWR0aCA9PSBjYW52YXNfd2lkdGggJiYgaGVpZ2h0ID09IGNhbnZhc19oZWlnaHQpOworfQorCisvLyBDbGVhciB0aGUgY2FudmFzIHRvIHRyYW5zcGFyZW50Lgorc3RhdGljIGludCBaZXJvRmlsbENhbnZhcyh1aW50OF90KiBidWYsIHVpbnQzMl90IGNhbnZhc193aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FudmFzX2hlaWdodCkgeworICBjb25zdCB1aW50NjRfdCBzaXplID0KKyAgICAgICh1aW50NjRfdCljYW52YXNfd2lkdGggKiBjYW52YXNfaGVpZ2h0ICogTlVNX0NIQU5ORUxTICogc2l6ZW9mKCpidWYpOworICBpZiAoc2l6ZSAhPSAoc2l6ZV90KXNpemUpIHJldHVybiAwOworICBtZW1zZXQoYnVmLCAwLCAoc2l6ZV90KXNpemUpOworICByZXR1cm4gMTsKK30KKworLy8gQ2xlYXIgZ2l2ZW4gZnJhbWUgcmVjdGFuZ2xlIHRvIHRyYW5zcGFyZW50Lgorc3RhdGljIHZvaWQgWmVyb0ZpbGxGcmFtZVJlY3QodWludDhfdCogYnVmLCBpbnQgYnVmX3N0cmlkZSwgaW50IHhfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfb2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IGo7CisgIGFzc2VydCh3aWR0aCAqIE5VTV9DSEFOTkVMUyA8PSBidWZfc3RyaWRlKTsKKyAgYnVmICs9IHlfb2Zmc2V0ICogYnVmX3N0cmlkZSArIHhfb2Zmc2V0ICogTlVNX0NIQU5ORUxTOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBtZW1zZXQoYnVmLCAwLCB3aWR0aCAqIE5VTV9DSEFOTkVMUyk7CisgICAgYnVmICs9IGJ1Zl9zdHJpZGU7CisgIH0KK30KKworLy8gQ29weSB3aWR0aCAqIGhlaWdodCBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0Jy4KK3N0YXRpYyBpbnQgQ29weUNhbnZhcyhjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQgKiBOVU1fQ0hBTk5FTFM7CisgIGlmIChzaXplICE9IChzaXplX3Qpc2l6ZSkgcmV0dXJuIDA7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7CisgIG1lbWNweShkc3QsIHNyYywgKHNpemVfdClzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBmcmFtZSBpcyBhIGtleS1mcmFtZS4KK3N0YXRpYyBpbnQgSXNLZXlGcmFtZShjb25zdCBXZWJQSXRlcmF0b3IqIGNvbnN0IGN1cnIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBwcmV2LAorICAgICAgICAgICAgICAgICAgICAgIGludCBwcmV2X2ZyYW1lX3dhc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc193aWR0aCwgaW50IGNhbnZhc19oZWlnaHQpIHsKKyAgaWYgKGN1cnItPmZyYW1lX251bSA9PSAxKSB7CisgICAgcmV0dXJuIDE7CisgIH0gZWxzZSBpZiAoKCFjdXJyLT5oYXNfYWxwaGEgfHwgY3Vyci0+YmxlbmRfbWV0aG9kID09IFdFQlBfTVVYX05PX0JMRU5EKSAmJgorICAgICAgICAgICAgIElzRnVsbEZyYW1lKGN1cnItPndpZHRoLCBjdXJyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX3dpZHRoLCBjYW52YXNfaGVpZ2h0KSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAocHJldi0+ZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EKSAmJgorICAgICAgICAgICAoSXNGdWxsRnJhbWUocHJldi0+d2lkdGgsIHByZXYtPmhlaWdodCwgY2FudmFzX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FudmFzX2hlaWdodCkgfHwKKyAgICAgICAgICAgIHByZXZfZnJhbWVfd2FzX2tleV9mcmFtZSk7CisgIH0KK30KKworCisvLyBCbGVuZCBhIHNpbmdsZSBjaGFubmVsIG9mICdzcmMnIG92ZXIgJ2RzdCcsIGdpdmVuIHRoZWlyIGFscGhhIGNoYW5uZWwgdmFsdWVzLgorLy8gJ3NyYycgYW5kICdkc3QnIGFyZSBhc3N1bWVkIHRvIGJlIE5PVCBwcmUtbXVsdGlwbGllZCBieSBhbHBoYS4KK3N0YXRpYyB1aW50OF90IEJsZW5kQ2hhbm5lbE5vblByZW11bHQodWludDMyX3Qgc3JjLCB1aW50OF90IHNyY19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3QsIHVpbnQ4X3QgZHN0X2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNjYWxlLCBpbnQgc2hpZnQpIHsKKyAgY29uc3QgdWludDhfdCBzcmNfY2hhbm5lbCA9IChzcmMgPj4gc2hpZnQpICYgMHhmZjsKKyAgY29uc3QgdWludDhfdCBkc3RfY2hhbm5lbCA9IChkc3QgPj4gc2hpZnQpICYgMHhmZjsKKyAgY29uc3QgdWludDMyX3QgYmxlbmRfdW5zY2FsZWQgPSBzcmNfY2hhbm5lbCAqIHNyY19hICsgZHN0X2NoYW5uZWwgKiBkc3RfYTsKKyAgYXNzZXJ0KGJsZW5kX3Vuc2NhbGVkIDwgKDFVTEwgPDwgMzIpIC8gc2NhbGUpOworICByZXR1cm4gKGJsZW5kX3Vuc2NhbGVkICogc2NhbGUpID4+IDI0OworfQorCisvLyBCbGVuZCAnc3JjJyBvdmVyICdkc3QnIGFzc3VtaW5nIHRoZXkgYXJlIE5PVCBwcmUtbXVsdGlwbGllZCBieSBhbHBoYS4KK3N0YXRpYyB1aW50MzJfdCBCbGVuZFBpeGVsTm9uUHJlbXVsdCh1aW50MzJfdCBzcmMsIHVpbnQzMl90IGRzdCkgeworICBjb25zdCB1aW50OF90IHNyY19hID0gKHNyYyA+PiAyNCkgJiAweGZmOworCisgIGlmIChzcmNfYSA9PSAwKSB7CisgICAgcmV0dXJuIGRzdDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCB1aW50OF90IGRzdF9hID0gKGRzdCA+PiAyNCkgJiAweGZmOworICAgIC8vIFRoaXMgaXMgdGhlIGFwcHJveGltYXRlIGludGVnZXIgYXJpdGhtZXRpYyBmb3IgdGhlIGFjdHVhbCBmb3JtdWxhOgorICAgIC8vIGRzdF9mYWN0b3JfYSA9IChkc3RfYSAqICgyNTUgLSBzcmNfYSkpIC8gMjU1LgorICAgIGNvbnN0IHVpbnQ4X3QgZHN0X2ZhY3Rvcl9hID0gKGRzdF9hICogKDI1NiAtIHNyY19hKSkgPj4gODsKKyAgICBjb25zdCB1aW50OF90IGJsZW5kX2EgPSBzcmNfYSArIGRzdF9mYWN0b3JfYTsKKyAgICBjb25zdCB1aW50MzJfdCBzY2FsZSA9ICgxVUwgPDwgMjQpIC8gYmxlbmRfYTsKKworICAgIGNvbnN0IHVpbnQ4X3QgYmxlbmRfciA9CisgICAgICAgIEJsZW5kQ2hhbm5lbE5vblByZW11bHQoc3JjLCBzcmNfYSwgZHN0LCBkc3RfZmFjdG9yX2EsIHNjYWxlLCAwKTsKKyAgICBjb25zdCB1aW50OF90IGJsZW5kX2cgPQorICAgICAgICBCbGVuZENoYW5uZWxOb25QcmVtdWx0KHNyYywgc3JjX2EsIGRzdCwgZHN0X2ZhY3Rvcl9hLCBzY2FsZSwgOCk7CisgICAgY29uc3QgdWludDhfdCBibGVuZF9iID0KKyAgICAgICAgQmxlbmRDaGFubmVsTm9uUHJlbXVsdChzcmMsIHNyY19hLCBkc3QsIGRzdF9mYWN0b3JfYSwgc2NhbGUsIDE2KTsKKyAgICBhc3NlcnQoc3JjX2EgKyBkc3RfZmFjdG9yX2EgPCAyNTYpOworCisgICAgcmV0dXJuIChibGVuZF9yIDw8IDApIHwKKyAgICAgICAgICAgKGJsZW5kX2cgPDwgOCkgfAorICAgICAgICAgICAoYmxlbmRfYiA8PCAxNikgfAorICAgICAgICAgICAoKHVpbnQzMl90KWJsZW5kX2EgPDwgMjQpOworICB9Cit9CisKKy8vIEJsZW5kICdudW1fcGl4ZWxzJyBpbiAnc3JjJyBvdmVyICdkc3QnIGFzc3VtaW5nIHRoZXkgYXJlIE5PVCBwcmUtbXVsdGlwbGllZAorLy8gYnkgYWxwaGEuCitzdGF0aWMgdm9pZCBCbGVuZFBpeGVsUm93Tm9uUHJlbXVsdCh1aW50MzJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdCwgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIHsKKyAgICBjb25zdCB1aW50OF90IHNyY19hbHBoYSA9IChzcmNbaV0gPj4gMjQpICYgMHhmZjsKKyAgICBpZiAoc3JjX2FscGhhICE9IDB4ZmYpIHsKKyAgICAgIHNyY1tpXSA9IEJsZW5kUGl4ZWxOb25QcmVtdWx0KHNyY1tpXSwgZHN0W2ldKTsKKyAgICB9CisgIH0KK30KKworLy8gSW5kaXZpZHVhbGx5IG11bHRpcGx5IGVhY2ggY2hhbm5lbCBpbiAncGl4JyBieSAnc2NhbGUnLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENoYW5uZWx3aXNlTXVsdGlwbHkodWludDMyX3QgcGl4LCB1aW50MzJfdCBzY2FsZSkgeworICB1aW50MzJfdCBtYXNrID0gMHgwMEZGMDBGRjsKKyAgdWludDMyX3QgcmIgPSAoKHBpeCAmIG1hc2spICogc2NhbGUpID4+IDg7CisgIHVpbnQzMl90IGFnID0gKChwaXggPj4gOCkgJiBtYXNrKSAqIHNjYWxlOworICByZXR1cm4gKHJiICYgbWFzaykgfCAoYWcgJiB+bWFzayk7Cit9CisKKy8vIEJsZW5kICdzcmMnIG92ZXIgJ2RzdCcgYXNzdW1pbmcgdGhleSBhcmUgcHJlLW11bHRpcGxpZWQgYnkgYWxwaGEuCitzdGF0aWMgdWludDMyX3QgQmxlbmRQaXhlbFByZW11bHQodWludDMyX3Qgc3JjLCB1aW50MzJfdCBkc3QpIHsKKyAgY29uc3QgdWludDhfdCBzcmNfYSA9IChzcmMgPj4gMjQpICYgMHhmZjsKKyAgcmV0dXJuIHNyYyArIENoYW5uZWx3aXNlTXVsdGlwbHkoZHN0LCAyNTYgLSBzcmNfYSk7Cit9CisKKy8vIEJsZW5kICdudW1fcGl4ZWxzJyBpbiAnc3JjJyBvdmVyICdkc3QnIGFzc3VtaW5nIHRoZXkgYXJlIHByZS1tdWx0aXBsaWVkIGJ5CisvLyBhbHBoYS4KK3N0YXRpYyB2b2lkIEJsZW5kUGl4ZWxSb3dQcmVtdWx0KHVpbnQzMl90KiBjb25zdCBzcmMsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IHVpbnQ4X3Qgc3JjX2FscGhhID0gKHNyY1tpXSA+PiAyNCkgJiAweGZmOworICAgIGlmIChzcmNfYWxwaGEgIT0gMHhmZikgeworICAgICAgc3JjW2ldID0gQmxlbmRQaXhlbFByZW11bHQoc3JjW2ldLCBkc3RbaV0pOworICAgIH0KKyAgfQorfQorCisvLyBSZXR1cm5zIHR3byByYW5nZXMgKDxsZWZ0LCB3aWR0aD4gcGFpcnMpIGF0IHJvdyAnY2FudmFzX3knLCB0aGF0IGJlbG9uZyB0bworLy8gJ3NyYycgYnV0IG5vdCAnZHN0Jy4gQSBwb2ludCByYW5nZSBpcyBlbXB0eSBpZiB0aGUgY29ycmVzcG9uZGluZyB3aWR0aCBpcyAwLgorc3RhdGljIHZvaWQgRmluZEJsZW5kUmFuZ2VBdFJvdyhjb25zdCBXZWJQSXRlcmF0b3IqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEl0ZXJhdG9yKiBjb25zdCBkc3QsIGludCBjYW52YXNfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0MSwgaW50KiBjb25zdCB3aWR0aDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdDIsIGludCogY29uc3Qgd2lkdGgyKSB7CisgIGNvbnN0IGludCBzcmNfbWF4X3ggPSBzcmMtPnhfb2Zmc2V0ICsgc3JjLT53aWR0aDsKKyAgY29uc3QgaW50IGRzdF9tYXhfeCA9IGRzdC0+eF9vZmZzZXQgKyBkc3QtPndpZHRoOworICBjb25zdCBpbnQgZHN0X21heF95ID0gZHN0LT55X29mZnNldCArIGRzdC0+aGVpZ2h0OworICBhc3NlcnQoY2FudmFzX3kgPj0gc3JjLT55X29mZnNldCAmJiBjYW52YXNfeSA8IChzcmMtPnlfb2Zmc2V0ICsgc3JjLT5oZWlnaHQpKTsKKyAgKmxlZnQxID0gLTE7CisgICp3aWR0aDEgPSAwOworICAqbGVmdDIgPSAtMTsKKyAgKndpZHRoMiA9IDA7CisKKyAgaWYgKGNhbnZhc195IDwgZHN0LT55X29mZnNldCB8fCBjYW52YXNfeSA+PSBkc3RfbWF4X3kgfHwKKyAgICAgIHNyYy0+eF9vZmZzZXQgPj0gZHN0X21heF94IHx8IHNyY19tYXhfeCA8PSBkc3QtPnhfb2Zmc2V0KSB7CisgICAgKmxlZnQxID0gc3JjLT54X29mZnNldDsKKyAgICAqd2lkdGgxID0gc3JjLT53aWR0aDsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3JjLT54X29mZnNldCA8IGRzdC0+eF9vZmZzZXQpIHsKKyAgICAqbGVmdDEgPSBzcmMtPnhfb2Zmc2V0OworICAgICp3aWR0aDEgPSBkc3QtPnhfb2Zmc2V0IC0gc3JjLT54X29mZnNldDsKKyAgfQorCisgIGlmIChzcmNfbWF4X3ggPiBkc3RfbWF4X3gpIHsKKyAgICAqbGVmdDIgPSBkc3RfbWF4X3g7CisgICAgKndpZHRoMiA9IHNyY19tYXhfeCAtIGRzdF9tYXhfeDsKKyAgfQorfQorCitpbnQgV2ViUEFuaW1EZWNvZGVyR2V0TmV4dChXZWJQQW5pbURlY29kZXIqIGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBidWZfcHRyLCBpbnQqIHRpbWVzdGFtcF9wdHIpIHsKKyAgV2ViUEl0ZXJhdG9yIGl0ZXI7CisgIHVpbnQzMl90IHdpZHRoOworICB1aW50MzJfdCBoZWlnaHQ7CisgIGludCBpc19rZXlfZnJhbWU7CisgIGludCB0aW1lc3RhbXA7CisgIEJsZW5kUm93RnVuYyBibGVuZF9yb3c7CisKKyAgaWYgKGRlYyA9PSBOVUxMIHx8IGJ1Zl9wdHIgPT0gTlVMTCB8fCB0aW1lc3RhbXBfcHRyID09IE5VTEwpIHJldHVybiAwOworICBpZiAoIVdlYlBBbmltRGVjb2Rlckhhc01vcmVGcmFtZXMoZGVjKSkgcmV0dXJuIDA7CisKKyAgd2lkdGggPSBkZWMtPmluZm9fLmNhbnZhc193aWR0aDsKKyAgaGVpZ2h0ID0gZGVjLT5pbmZvXy5jYW52YXNfaGVpZ2h0OworICBibGVuZF9yb3cgPSBkZWMtPmJsZW5kX2Z1bmNfOworCisgIC8vIEdldCBjb21wcmVzc2VkIGZyYW1lLgorICBpZiAoIVdlYlBEZW11eEdldEZyYW1lKGRlYy0+ZGVtdXhfLCBkZWMtPm5leHRfZnJhbWVfLCAmaXRlcikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB0aW1lc3RhbXAgPSBkZWMtPnByZXZfZnJhbWVfdGltZXN0YW1wXyArIGl0ZXIuZHVyYXRpb247CisKKyAgLy8gSW5pdGlhbGl6ZS4KKyAgaXNfa2V5X2ZyYW1lID0gSXNLZXlGcmFtZSgmaXRlciwgJmRlYy0+cHJldl9pdGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWMtPnByZXZfZnJhbWVfd2FzX2tleWZyYW1lXywgd2lkdGgsIGhlaWdodCk7CisgIGlmIChpc19rZXlfZnJhbWUpIHsKKyAgICBpZiAoIVplcm9GaWxsQ2FudmFzKGRlYy0+Y3Vycl9mcmFtZV8sIHdpZHRoLCBoZWlnaHQpKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIUNvcHlDYW52YXMoZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXywgZGVjLT5jdXJyX2ZyYW1lXywKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCkpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgLy8gRGVjb2RlLgorICB7CisgICAgY29uc3QgdWludDhfdCogaW4gPSBpdGVyLmZyYWdtZW50LmJ5dGVzOworICAgIGNvbnN0IHNpemVfdCBpbl9zaXplID0gaXRlci5mcmFnbWVudC5zaXplOworICAgIGNvbnN0IHNpemVfdCBvdXRfb2Zmc2V0ID0KKyAgICAgICAgKGl0ZXIueV9vZmZzZXQgKiB3aWR0aCArIGl0ZXIueF9vZmZzZXQpICogTlVNX0NIQU5ORUxTOworICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25zdCBjb25maWcgPSAmZGVjLT5jb25maWdfOworICAgIFdlYlBSR0JBQnVmZmVyKiBjb25zdCBidWYgPSAmY29uZmlnLT5vdXRwdXQudS5SR0JBOworICAgIGJ1Zi0+c3RyaWRlID0gTlVNX0NIQU5ORUxTICogd2lkdGg7CisgICAgYnVmLT5zaXplID0gYnVmLT5zdHJpZGUgKiBpdGVyLmhlaWdodDsKKyAgICBidWYtPnJnYmEgPSBkZWMtPmN1cnJfZnJhbWVfICsgb3V0X29mZnNldDsKKworICAgIGlmIChXZWJQRGVjb2RlKGluLCBpbl9zaXplLCBjb25maWcpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgLy8gRHVyaW5nIHRoZSBkZWNvZGluZyBvZiBjdXJyZW50IGZyYW1lLCB3ZSBtYXkgaGF2ZSBzZXQgc29tZSBwaXhlbHMgdG8gYmUKKyAgLy8gdHJhbnNwYXJlbnQgKGkuZS4gYWxwaGEgPCAyNTUpLiBIb3dldmVyLCB0aGUgdmFsdWUgb2YgZWFjaCBvZiB0aGVzZQorICAvLyBwaXhlbHMgc2hvdWxkIGhhdmUgYmVlbiBkZXRlcm1pbmVkIGJ5IGJsZW5kaW5nIGl0IGFnYWluc3QgdGhlIHZhbHVlIG9mCisgIC8vIHRoYXQgcGl4ZWwgaW4gdGhlIHByZXZpb3VzIGZyYW1lIGlmIGJsZW5kaW5nIG1ldGhvZCBvZiBpcyBXRUJQX01VWF9CTEVORC4KKyAgaWYgKGl0ZXIuZnJhbWVfbnVtID4gMSAmJiBpdGVyLmJsZW5kX21ldGhvZCA9PSBXRUJQX01VWF9CTEVORCAmJgorICAgICAgIWlzX2tleV9mcmFtZSkgeworICAgIGlmIChkZWMtPnByZXZfaXRlcl8uZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9OT05FKSB7CisgICAgICBpbnQgeTsKKyAgICAgIC8vIEJsZW5kIHRyYW5zcGFyZW50IHBpeGVscyB3aXRoIHBpeGVscyBpbiBwcmV2aW91cyBjYW52YXMuCisgICAgICBmb3IgKHkgPSAwOyB5IDwgaXRlci5oZWlnaHQ7ICsreSkgeworICAgICAgICBjb25zdCBzaXplX3Qgb2Zmc2V0ID0KKyAgICAgICAgICAgIChpdGVyLnlfb2Zmc2V0ICsgeSkgKiB3aWR0aCArIGl0ZXIueF9vZmZzZXQ7CisgICAgICAgIGJsZW5kX3JvdygodWludDMyX3QqKWRlYy0+Y3Vycl9mcmFtZV8gKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAodWludDMyX3QqKWRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gKyBvZmZzZXQsIGl0ZXIud2lkdGgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpbnQgeTsKKyAgICAgIGFzc2VydChkZWMtPnByZXZfaXRlcl8uZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EKTsKKyAgICAgIC8vIFdlIG5lZWQgdG8gYmxlbmQgYSB0cmFuc3BhcmVudCBwaXhlbCB3aXRoIGl0cyB2YWx1ZSBqdXN0IGFmdGVyCisgICAgICAvLyBpbml0aWFsaXphdGlvbi4gVGhhdCBpcywgYmxlbmQgaXQgd2l0aDoKKyAgICAgIC8vICogRnVsbHkgdHJhbnNwYXJlbnQgcGl4ZWwgaWYgaXQgYmVsb25ncyB0byBwcmV2UmVjdCA8LS0gTm8tb3AuCisgICAgICAvLyAqIFRoZSBwaXhlbCBpbiB0aGUgcHJldmlvdXMgY2FudmFzIG90aGVyd2lzZSA8LS0gTmVlZCBhbHBoYS1ibGVuZGluZy4KKyAgICAgIGZvciAoeSA9IDA7IHkgPCBpdGVyLmhlaWdodDsgKyt5KSB7CisgICAgICAgIGNvbnN0IGludCBjYW52YXNfeSA9IGl0ZXIueV9vZmZzZXQgKyB5OworICAgICAgICBpbnQgbGVmdDEsIHdpZHRoMSwgbGVmdDIsIHdpZHRoMjsKKyAgICAgICAgRmluZEJsZW5kUmFuZ2VBdFJvdygmaXRlciwgJmRlYy0+cHJldl9pdGVyXywgY2FudmFzX3ksICZsZWZ0MSwgJndpZHRoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGVmdDIsICZ3aWR0aDIpOworICAgICAgICBpZiAod2lkdGgxID4gMCkgeworICAgICAgICAgIGNvbnN0IHNpemVfdCBvZmZzZXQxID0gY2FudmFzX3kgKiB3aWR0aCArIGxlZnQxOworICAgICAgICAgIGJsZW5kX3JvdygodWludDMyX3QqKWRlYy0+Y3Vycl9mcmFtZV8gKyBvZmZzZXQxLAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QqKWRlYy0+cHJldl9mcmFtZV9kaXNwb3NlZF8gKyBvZmZzZXQxLCB3aWR0aDEpOworICAgICAgICB9CisgICAgICAgIGlmICh3aWR0aDIgPiAwKSB7CisgICAgICAgICAgY29uc3Qgc2l6ZV90IG9mZnNldDIgPSBjYW52YXNfeSAqIHdpZHRoICsgbGVmdDI7CisgICAgICAgICAgYmxlbmRfcm93KCh1aW50MzJfdCopZGVjLT5jdXJyX2ZyYW1lXyArIG9mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCopZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXyArIG9mZnNldDIsIHdpZHRoMik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBVcGRhdGUgaW5mbyBvZiB0aGUgcHJldmlvdXMgZnJhbWUgYW5kIGRpc3Bvc2UgaXQgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKyAgZGVjLT5wcmV2X2ZyYW1lX3RpbWVzdGFtcF8gPSB0aW1lc3RhbXA7CisgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmZGVjLT5wcmV2X2l0ZXJfKTsKKyAgZGVjLT5wcmV2X2l0ZXJfID0gaXRlcjsKKyAgZGVjLT5wcmV2X2ZyYW1lX3dhc19rZXlmcmFtZV8gPSBpc19rZXlfZnJhbWU7CisgIENvcHlDYW52YXMoZGVjLT5jdXJyX2ZyYW1lXywgZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXywgd2lkdGgsIGhlaWdodCk7CisgIGlmIChkZWMtPnByZXZfaXRlcl8uZGlzcG9zZV9tZXRob2QgPT0gV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EKSB7CisgICAgWmVyb0ZpbGxGcmFtZVJlY3QoZGVjLT5wcmV2X2ZyYW1lX2Rpc3Bvc2VkXywgd2lkdGggKiBOVU1fQ0hBTk5FTFMsCisgICAgICAgICAgICAgICAgICAgICAgZGVjLT5wcmV2X2l0ZXJfLnhfb2Zmc2V0LCBkZWMtPnByZXZfaXRlcl8ueV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGVjLT5wcmV2X2l0ZXJfLndpZHRoLCBkZWMtPnByZXZfaXRlcl8uaGVpZ2h0KTsKKyAgfQorICArK2RlYy0+bmV4dF9mcmFtZV87CisKKyAgLy8gQWxsIE9LLCBmaWxsIGluIHRoZSB2YWx1ZXMuCisgICpidWZfcHRyID0gZGVjLT5jdXJyX2ZyYW1lXzsKKyAgKnRpbWVzdGFtcF9wdHIgPSB0aW1lc3RhbXA7CisgIHJldHVybiAxOworCisgRXJyb3I6CisgIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcigmaXRlcik7CisgIHJldHVybiAwOworfQorCitpbnQgV2ViUEFuaW1EZWNvZGVySGFzTW9yZUZyYW1lcyhjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYykgeworICBpZiAoZGVjID09IE5VTEwpIHJldHVybiAwOworICByZXR1cm4gKGRlYy0+bmV4dF9mcmFtZV8gPD0gKGludClkZWMtPmluZm9fLmZyYW1lX2NvdW50KTsKK30KKwordm9pZCBXZWJQQW5pbURlY29kZXJSZXNldChXZWJQQW5pbURlY29kZXIqIGRlYykgeworICBpZiAoZGVjICE9IE5VTEwpIHsKKyAgICBkZWMtPnByZXZfZnJhbWVfdGltZXN0YW1wXyA9IDA7CisgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZkZWMtPnByZXZfaXRlcl8pOworICAgIG1lbXNldCgmZGVjLT5wcmV2X2l0ZXJfLCAwLCBzaXplb2YoZGVjLT5wcmV2X2l0ZXJfKSk7CisgICAgZGVjLT5wcmV2X2ZyYW1lX3dhc19rZXlmcmFtZV8gPSAwOworICAgIGRlYy0+bmV4dF9mcmFtZV8gPSAxOworICB9Cit9CisKK2NvbnN0IFdlYlBEZW11eGVyKiBXZWJQQW5pbURlY29kZXJHZXREZW11eGVyKGNvbnN0IFdlYlBBbmltRGVjb2RlciogZGVjKSB7CisgIGlmIChkZWMgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIHJldHVybiBkZWMtPmRlbXV4XzsKK30KKwordm9pZCBXZWJQQW5pbURlY29kZXJEZWxldGUoV2ViUEFuaW1EZWNvZGVyKiBkZWMpIHsKKyAgaWYgKGRlYyAhPSBOVUxMKSB7CisgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZkZWMtPnByZXZfaXRlcl8pOworICAgIFdlYlBEZW11eERlbGV0ZShkZWMtPmRlbXV4Xyk7CisgICAgV2ViUFNhZmVGcmVlKGRlYy0+Y3Vycl9mcmFtZV8pOworICAgIFdlYlBTYWZlRnJlZShkZWMtPnByZXZfZnJhbWVfZGlzcG9zZWRfKTsKKyAgICBXZWJQU2FmZUZyZWUoZGVjKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZGVtdXgvZGVtdXguYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9kZW11eC5jCnNpbWlsYXJpdHkgaW5kZXggNzclCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9kZW11eC5jCmluZGV4IDhiY2E2YzYuLjY4NDIxNWUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RlbXV4L2RlbXV4LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2RlbXV4LmMKQEAgLTExLDMwICsxMSwyMSBAQAogLy8KIAogI2lmZGVmIEhBVkVfQ09ORklHX0gKLSNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKICNlbmRpZgogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZW5kaWYKIAotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9kZWNvZGUuaCIgICAgIC8vIFdlYlBHZXRGZWF0dXJlcwotI2luY2x1ZGUgIi4uL3dlYnAvZGVtdXguaCIKLSNpbmNsdWRlICIuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIgICAgIC8vIFdlYlBHZXRGZWF0dXJlcworI2luY2x1ZGUgInNyYy93ZWJwL2RlbXV4LmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2RlZmluZSBETVVYX01BSl9WRVJTSU9OIDAKLSNkZWZpbmUgRE1VWF9NSU5fVkVSU0lPTiAxCi0jZGVmaW5lIERNVVhfUkVWX1ZFUlNJT04gMQorI2RlZmluZSBETVVYX01BSl9WRVJTSU9OIDEKKyNkZWZpbmUgRE1VWF9NSU5fVkVSU0lPTiAwCisjZGVmaW5lIERNVVhfUkVWX1ZFUlNJT04gMAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHNpemVfdCBzdGFydF87ICAgICAgICAvLyBzdGFydCBsb2NhdGlvbiBvZiB0aGUgZGF0YQpAQCAtNTIsMTAgKzQzLDExIEBACiB0eXBlZGVmIHN0cnVjdCBGcmFtZSB7CiAgIGludCB4X29mZnNldF8sIHlfb2Zmc2V0XzsKICAgaW50IHdpZHRoXywgaGVpZ2h0XzsKKyAgaW50IGhhc19hbHBoYV87CiAgIGludCBkdXJhdGlvbl87CiAgIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZF87Ci0gIGludCBpc19mcmFnbWVudF87ICAvLyB0aGlzIGlzIGEgZnJhbWUgZnJhZ21lbnQgKGFuZCBub3QgYSBmdWxsIGZyYW1lKS4KLSAgaW50IGZyYW1lX251bV87ICAvLyB0aGUgcmVmZXJlbnQgZnJhbWUgbnVtYmVyIGZvciB1c2UgaW4gYXNzZW1ibGluZyBmcmFnbWVudHMuCisgIFdlYlBNdXhBbmltQmxlbmQgYmxlbmRfbWV0aG9kXzsKKyAgaW50IGZyYW1lX251bV87CiAgIGludCBjb21wbGV0ZV87ICAgLy8gaW1nX2NvbXBvbmVudHNfIGNvbnRhaW5zIGEgZnVsbCBpbWFnZS4KICAgQ2h1bmtEYXRhIGltZ19jb21wb25lbnRzX1syXTsgIC8vIDA9VlA4eyxMfSAxPUFMUEgKICAgc3RydWN0IEZyYW1lKiBuZXh0XzsKQEAgLTc4LDYgKzcwLDcgQEAKICAgRnJhbWUqIGZyYW1lc187CiAgIEZyYW1lKiogZnJhbWVzX3RhaWxfOwogICBDaHVuayogY2h1bmtzXzsgIC8vIG5vbi1pbWFnZSBjaHVua3MKKyAgQ2h1bmsqKiBjaHVua3NfdGFpbF87CiB9OwogCiB0eXBlZGVmIGVudW0gewpAQCAtMTI0LDcgKzExNyw3IEBACiAKIHN0YXRpYyBpbnQgSW5pdE1lbUJ1ZmZlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBTYk1lbW9yeVNldChtZW0sIDAsIHNpemVvZigqbWVtKSk7CisgIG1lbXNldChtZW0sIDAsIHNpemVvZigqbWVtKSk7CiAgIHJldHVybiBSZW1hcE1lbUJ1ZmZlcihtZW0sIGRhdGEsIHNpemUpOwogfQogCkBAIC0xODIsMTAgKzE3NSw5IEBACiAvLyBTZWNvbmRhcnkgY2h1bmsgcGFyc2luZwogCiBzdGF0aWMgdm9pZCBBZGRDaHVuayhXZWJQRGVtdXhlciogY29uc3QgZG11eCwgQ2h1bmsqIGNvbnN0IGNodW5rKSB7Ci0gIENodW5rKiogYyA9ICZkbXV4LT5jaHVua3NfOwotICB3aGlsZSAoKmMgIT0gTlVMTCkgYyA9ICYoKmMpLT5uZXh0XzsKLSAgKmMgPSBjaHVuazsKKyAgKmRtdXgtPmNodW5rc190YWlsXyA9IGNodW5rOwogICBjaHVuay0+bmV4dF8gPSBOVUxMOworICBkbXV4LT5jaHVua3NfdGFpbF8gPSAmY2h1bmstPm5leHRfOwogfQogCiAvLyBBZGQgYSBmcmFtZSB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LCBlbnN1cmluZyB0aGUgbGFzdCBmcmFtZSBpcyBjb21wbGV0ZS4KQEAgLTIwMCwxOSArMTkyLDI5IEBACiAgIHJldHVybiAxOwogfQogCi0vLyBTdG9yZSBpbWFnZSBiZWFyaW5nIGNodW5rcyB0byAnZnJhbWUnLgotLy8gSWYgJ2hhc192cDhsX2FscGhhJyBpcyBub3QgTlVMTCwgaXQgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGUgZnJhbWUgaXMgYQotLy8gbG9zc2xlc3MgaW1hZ2Ugd2l0aCBhbHBoYS4KK3N0YXRpYyB2b2lkIFNldEZyYW1lSW5mbyhzaXplX3Qgc3RhcnRfb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfbnVtLCBpbnQgY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiBjb25zdCBmZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSogY29uc3QgZnJhbWUpIHsKKyAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5vZmZzZXRfID0gc3RhcnRfb2Zmc2V0OworICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzBdLnNpemVfID0gc2l6ZTsKKyAgZnJhbWUtPndpZHRoXyA9IGZlYXR1cmVzLT53aWR0aDsKKyAgZnJhbWUtPmhlaWdodF8gPSBmZWF0dXJlcy0+aGVpZ2h0OworICBmcmFtZS0+aGFzX2FscGhhXyB8PSBmZWF0dXJlcy0+aGFzX2FscGhhOworICBmcmFtZS0+ZnJhbWVfbnVtXyA9IGZyYW1lX251bTsKKyAgZnJhbWUtPmNvbXBsZXRlXyA9IGNvbXBsZXRlOworfQorCisvLyBTdG9yZSBpbWFnZSBiZWFyaW5nIGNodW5rcyB0byAnZnJhbWUnLiAnbWluX3NpemUnIGlzIGFuIG9wdGlvbmFsIHNpemUKKy8vIHJlcXVpcmVtZW50LCBpdCBtYXkgYmUgemVyby4KIHN0YXRpYyBQYXJzZVN0YXR1cyBTdG9yZUZyYW1lKGludCBmcmFtZV9udW0sIHVpbnQzMl90IG1pbl9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtQnVmZmVyKiBjb25zdCBtZW0sIEZyYW1lKiBjb25zdCBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgaGFzX3ZwOGxfYWxwaGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUJ1ZmZlciogY29uc3QgbWVtLCBGcmFtZSogY29uc3QgZnJhbWUpIHsKICAgaW50IGFscGhhX2NodW5rcyA9IDA7CiAgIGludCBpbWFnZV9jaHVua3MgPSAwOwotICBpbnQgZG9uZSA9IChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpOworICBpbnQgZG9uZSA9IChNZW1EYXRhU2l6ZShtZW0pIDwgQ0hVTktfSEVBREVSX1NJWkUgfHwKKyAgICAgICAgICAgICAgTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKTsKICAgUGFyc2VTdGF0dXMgc3RhdHVzID0gUEFSU0VfT0s7CiAKLSAgaWYgKGhhc192cDhsX2FscGhhICE9IE5VTEwpICpoYXNfdnA4bF9hbHBoYSA9IDA7ICAvLyBEZWZhdWx0LgotCiAgIGlmIChkb25lKSByZXR1cm4gUEFSU0VfTkVFRF9NT1JFX0RBVEE7CiAKICAgZG8gewpAQCAtMjM0LDYgKzIzNiw3IEBACiAgICAgICAgICAgKythbHBoYV9jaHVua3M7CiAgICAgICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5vZmZzZXRfID0gY2h1bmtfc3RhcnRfb2Zmc2V0OwogICAgICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0uc2l6ZV8gPSBjaHVua19zaXplOworICAgICAgICAgIGZyYW1lLT5oYXNfYWxwaGFfID0gMTsKICAgICAgICAgICBmcmFtZS0+ZnJhbWVfbnVtXyA9IGZyYW1lX251bTsKICAgICAgICAgICBTa2lwKG1lbSwgcGF5bG9hZF9hdmFpbGFibGUpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjU5LDEzICsyNjIsOCBAQAogICAgICAgICAgICAgcmV0dXJuIFBBUlNFX0VSUk9SOwogICAgICAgICAgIH0KICAgICAgICAgICArK2ltYWdlX2NodW5rczsKLSAgICAgICAgICBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzBdLm9mZnNldF8gPSBjaHVua19zdGFydF9vZmZzZXQ7Ci0gICAgICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1swXS5zaXplXyA9IGNodW5rX3NpemU7Ci0gICAgICAgICAgZnJhbWUtPndpZHRoXyA9IGZlYXR1cmVzLndpZHRoOwotICAgICAgICAgIGZyYW1lLT5oZWlnaHRfID0gZmVhdHVyZXMuaGVpZ2h0OwotICAgICAgICAgIGlmIChoYXNfdnA4bF9hbHBoYSAhPSBOVUxMKSAqaGFzX3ZwOGxfYWxwaGEgPSBmZWF0dXJlcy5oYXNfYWxwaGE7Ci0gICAgICAgICAgZnJhbWUtPmZyYW1lX251bV8gPSBmcmFtZV9udW07Ci0gICAgICAgICAgZnJhbWUtPmNvbXBsZXRlXyA9IChzdGF0dXMgPT0gUEFSU0VfT0spOworICAgICAgICAgIFNldEZyYW1lSW5mbyhjaHVua19zdGFydF9vZmZzZXQsIGNodW5rX3NpemUsIGZyYW1lX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IFBBUlNFX09LLCAmZmVhdHVyZXMsIGZyYW1lKTsKICAgICAgICAgICBTa2lwKG1lbSwgcGF5bG9hZF9hdmFpbGFibGUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIGdvdG8gRG9uZTsKQEAgLTMwMCw3ICsyOTgsNyBAQAogICBpZiAoYWN0dWFsX3NpemUgPCBtaW5fc2l6ZSkgcmV0dXJuIFBBUlNFX0VSUk9SOwogICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IG1pbl9zaXplKSAgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwogCi0gICpmcmFtZSA9IChGcmFtZSopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCoqZnJhbWUpKTsKKyAgKmZyYW1lID0gKEZyYW1lKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKipmcmFtZSkpOwogICByZXR1cm4gKCpmcmFtZSA9PSBOVUxMKSA/IFBBUlNFX0VSUk9SIDogUEFSU0VfT0s7CiB9CiAKQEAgLTMwOCw5ICszMDYsMTAgQEAKIC8vICdmcmFtZV9jaHVua19zaXplJyBpcyB0aGUgcHJldmlvdXNseSB2YWxpZGF0ZWQsIHBhZGRlZCBjaHVuayBzaXplLgogc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlQW5pbWF0aW9uRnJhbWUoCiAgICAgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsIHVpbnQzMl90IGZyYW1lX2NodW5rX3NpemUpIHsKLSAgY29uc3QgaW50IGhhc19mcmFtZXMgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgY29uc3QgaW50IGlzX2FuaW1hdGlvbiA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgQU5JTUFUSU9OX0ZMQUcpOwogICBjb25zdCB1aW50MzJfdCBhbm1mX3BheWxvYWRfc2l6ZSA9IGZyYW1lX2NodW5rX3NpemUgLSBBTk1GX0NIVU5LX1NJWkU7CiAgIGludCBhZGRlZF9mcmFtZSA9IDA7CisgIGludCBiaXRzOwogICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOwogICBGcmFtZSogZnJhbWU7CiAgIFBhcnNlU3RhdHVzIHN0YXR1cyA9CkBAIC0zMjIsMTcgKzMyMSwxOSBAQAogICBmcmFtZS0+d2lkdGhfICAgICAgICAgID0gMSArIFJlYWRMRTI0cyhtZW0pOwogICBmcmFtZS0+aGVpZ2h0XyAgICAgICAgID0gMSArIFJlYWRMRTI0cyhtZW0pOwogICBmcmFtZS0+ZHVyYXRpb25fICAgICAgID0gUmVhZExFMjRzKG1lbSk7Ci0gIGZyYW1lLT5kaXNwb3NlX21ldGhvZF8gPSAoV2ViUE11eEFuaW1EaXNwb3NlKShSZWFkQnl0ZShtZW0pICYgMSk7CisgIGJpdHMgPSBSZWFkQnl0ZShtZW0pOworICBmcmFtZS0+ZGlzcG9zZV9tZXRob2RfID0KKyAgICAgIChiaXRzICYgMSkgPyBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQgOiBXRUJQX01VWF9ESVNQT1NFX05PTkU7CisgIGZyYW1lLT5ibGVuZF9tZXRob2RfID0gKGJpdHMgJiAyKSA/IFdFQlBfTVVYX05PX0JMRU5EIDogV0VCUF9NVVhfQkxFTkQ7CiAgIGlmIChmcmFtZS0+d2lkdGhfICogKHVpbnQ2NF90KWZyYW1lLT5oZWlnaHRfID49IE1BWF9JTUFHRV9BUkVBKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGZyYW1lKTsKKyAgICBXZWJQU2FmZUZyZWUoZnJhbWUpOwogICAgIHJldHVybiBQQVJTRV9FUlJPUjsKICAgfQogCiAgIC8vIFN0b3JlIGEgZnJhbWUgb25seSBpZiB0aGUgYW5pbWF0aW9uIGZsYWcgaXMgc2V0IHRoZXJlIGlzIHNvbWUgZGF0YSBmb3IKICAgLy8gdGhpcyBmcmFtZSBpcyBhdmFpbGFibGUuCi0gIHN0YXR1cyA9IFN0b3JlRnJhbWUoZG11eC0+bnVtX2ZyYW1lc18gKyAxLCBhbm1mX3BheWxvYWRfc2l6ZSwgbWVtLCBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiBoYXNfZnJhbWVzICYmIGZyYW1lLT5mcmFtZV9udW1fID4gMCkgeworICBzdGF0dXMgPSBTdG9yZUZyYW1lKGRtdXgtPm51bV9mcmFtZXNfICsgMSwgYW5tZl9wYXlsb2FkX3NpemUsIG1lbSwgZnJhbWUpOworICBpZiAoc3RhdHVzICE9IFBBUlNFX0VSUk9SICYmIGlzX2FuaW1hdGlvbiAmJiBmcmFtZS0+ZnJhbWVfbnVtXyA+IDApIHsKICAgICBhZGRlZF9mcmFtZSA9IEFkZEZyYW1lKGRtdXgsIGZyYW1lKTsKICAgICBpZiAoYWRkZWRfZnJhbWUpIHsKICAgICAgICsrZG11eC0+bnVtX2ZyYW1lc187CkBAIC0zNDEsNTMgKzM0MiwxNyBAQAogICAgIH0KICAgfQogCi0gIGlmICghYWRkZWRfZnJhbWUpIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7CisgIGlmICghYWRkZWRfZnJhbWUpIFdlYlBTYWZlRnJlZShmcmFtZSk7CiAgIHJldHVybiBzdGF0dXM7CiB9CiAKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotLy8gUGFyc2UgYSAnRlJHTScgY2h1bmsgYW5kIGFueSBpbWFnZSBiZWFyaW5nIGNodW5rcyB0aGF0IGltbWVkaWF0ZWx5IGZvbGxvdy4KLS8vICdmcmFnbWVudF9jaHVua19zaXplJyBpcyB0aGUgcHJldmlvdXNseSB2YWxpZGF0ZWQsIHBhZGRlZCBjaHVuayBzaXplLgotc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlRnJhZ21lbnQoV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmcmFnbWVudF9jaHVua19zaXplKSB7Ci0gIGNvbnN0IGludCBmcmFtZV9udW0gPSAxOyAgLy8gQWxsIGZyYWdtZW50cyBiZWxvbmcgdG8gdGhlIDFzdCAoYW5kIG9ubHkpIGZyYW1lLgotICBjb25zdCBpbnQgaGFzX2ZyYWdtZW50cyA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgRlJBR01FTlRTX0ZMQUcpOwotICBjb25zdCB1aW50MzJfdCBmcmdtX3BheWxvYWRfc2l6ZSA9IGZyYWdtZW50X2NodW5rX3NpemUgLSBGUkdNX0NIVU5LX1NJWkU7Ci0gIGludCBhZGRlZF9mcmFnbWVudCA9IDA7Ci0gIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87Ci0gIEZyYW1lKiBmcmFtZTsKLSAgUGFyc2VTdGF0dXMgc3RhdHVzID0KLSAgICAgIE5ld0ZyYW1lKG1lbSwgRlJHTV9DSFVOS19TSVpFLCBmcmFnbWVudF9jaHVua19zaXplLCAmZnJhbWUpOwotICBpZiAoc3RhdHVzICE9IFBBUlNFX09LKSByZXR1cm4gc3RhdHVzOwotCi0gIGZyYW1lLT5pc19mcmFnbWVudF8gPSAxOwotICBmcmFtZS0+eF9vZmZzZXRfID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotICBmcmFtZS0+eV9vZmZzZXRfID0gMiAqIFJlYWRMRTI0cyhtZW0pOwotCi0gIC8vIFN0b3JlIGEgZnJhZ21lbnQgb25seSBpZiB0aGUgZnJhZ21lbnRzIGZsYWcgaXMgc2V0IHRoZXJlIGlzIHNvbWUgZGF0YSBmb3IKLSAgLy8gdGhpcyBmcmFnbWVudCBpcyBhdmFpbGFibGUuCi0gIHN0YXR1cyA9IFN0b3JlRnJhbWUoZnJhbWVfbnVtLCBmcmdtX3BheWxvYWRfc2l6ZSwgbWVtLCBmcmFtZSwgTlVMTCk7Ci0gIGlmIChzdGF0dXMgIT0gUEFSU0VfRVJST1IgJiYgaGFzX2ZyYWdtZW50cyAmJiBmcmFtZS0+ZnJhbWVfbnVtXyA+IDApIHsKLSAgICBhZGRlZF9mcmFnbWVudCA9IEFkZEZyYW1lKGRtdXgsIGZyYW1lKTsKLSAgICBpZiAoIWFkZGVkX2ZyYWdtZW50KSB7Ci0gICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgZG11eC0+bnVtX2ZyYW1lc18gPSAxOwotICAgIH0KLSAgfQotCi0gIGlmICghYWRkZWRfZnJhZ21lbnQpIFNiTWVtb3J5RGVhbGxvY2F0ZShmcmFtZSk7Ci0gIHJldHVybiBzdGF0dXM7Ci19Ci0jZW5kaWYgIC8vIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0KIC8vIEdlbmVyYWwgY2h1bmsgc3RvcmFnZSwgc3RhcnRpbmcgd2l0aCB0aGUgaGVhZGVyIGF0ICdzdGFydF9vZmZzZXQnLCBhbGxvd2luZwogLy8gdGhlIHVzZXIgdG8gcmVxdWVzdCB0aGUgcGF5bG9hZCB2aWEgYSBmb3VyY2Mgc3RyaW5nLiAnc2l6ZScgaW5jbHVkZXMgdGhlCiAvLyBoZWFkZXIgYW5kIHRoZSB1bnBhZGRlZCBwYXlsb2FkIHNpemUuCiAvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogc3RhdGljIGludCBTdG9yZUNodW5rKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAogICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydF9vZmZzZXQsIHVpbnQzMl90IHNpemUpIHsKLSAgQ2h1bmsqIGNvbnN0IGNodW5rID0gKENodW5rKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmNodW5rKSk7CisgIENodW5rKiBjb25zdCBjaHVuayA9IChDaHVuayopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpjaHVuaykpOwogICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIDA7CiAKICAgY2h1bmstPmRhdGFfLm9mZnNldF8gPSBzdGFydF9vZmZzZXQ7CkBAIC0zOTksMjAgKzM2NCwyMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFByaW1hcnkgY2h1bmsgcGFyc2luZwogCi1zdGF0aWMgaW50IFJlYWRIZWFkZXIoTWVtQnVmZmVyKiBjb25zdCBtZW0pIHsKK3N0YXRpYyBQYXJzZVN0YXR1cyBSZWFkSGVhZGVyKE1lbUJ1ZmZlciogY29uc3QgbWVtKSB7CiAgIGNvbnN0IHNpemVfdCBtaW5fc2l6ZSA9IFJJRkZfSEVBREVSX1NJWkUgKyBDSFVOS19IRUFERVJfU0laRTsKICAgdWludDMyX3QgcmlmZl9zaXplOwogCiAgIC8vIEJhc2ljIGZpbGUgbGV2ZWwgdmFsaWRhdGlvbi4KLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBtaW5fc2l6ZSkgcmV0dXJuIDA7Ci0gIGlmIChTYk1lbW9yeUNvbXBhcmUoR2V0QnVmZmVyKG1lbSksICJSSUZGIiwgQ0hVTktfU0laRV9CWVRFUykgfHwKLSAgICAgIFNiTWVtb3J5Q29tcGFyZShHZXRCdWZmZXIobWVtKSArIENIVU5LX0hFQURFUl9TSVpFLCAiV0VCUCIsIENIVU5LX1NJWkVfQllURVMpKSB7Ci0gICAgcmV0dXJuIDA7CisgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKKyAgaWYgKG1lbWNtcChHZXRCdWZmZXIobWVtKSwgIlJJRkYiLCBDSFVOS19TSVpFX0JZVEVTKSB8fAorICAgICAgbWVtY21wKEdldEJ1ZmZlcihtZW0pICsgQ0hVTktfSEVBREVSX1NJWkUsICJXRUJQIiwgQ0hVTktfU0laRV9CWVRFUykpIHsKKyAgICByZXR1cm4gUEFSU0VfRVJST1I7CiAgIH0KIAogICByaWZmX3NpemUgPSBHZXRMRTMyKEdldEJ1ZmZlcihtZW0pICsgVEFHX1NJWkUpOwotICBpZiAocmlmZl9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiAwOwotICBpZiAocmlmZl9zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHJldHVybiAwOworICBpZiAocmlmZl9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgaWYgKHJpZmZfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7CiAKICAgLy8gVGhlcmUncyBubyBwb2ludCBpbiByZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgUklGRiBjaHVuawogICBtZW0tPnJpZmZfZW5kXyA9IHJpZmZfc2l6ZSArIENIVU5LX0hFQURFUl9TSVpFOwpAQCAtNDIxLDcgKzM4Niw3IEBACiAgIH0KIAogICBTa2lwKG1lbSwgUklGRl9IRUFERVJfU0laRSk7Ci0gIHJldHVybiAxOworICByZXR1cm4gUEFSU0VfT0s7CiB9CiAKIHN0YXRpYyBQYXJzZVN0YXR1cyBQYXJzZVNpbmdsZUltYWdlKFdlYlBEZW11eGVyKiBjb25zdCBkbXV4KSB7CkBAIC00MjksMjUgKzM5NCwyNSBAQAogICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOwogICBGcmFtZSogZnJhbWU7CiAgIFBhcnNlU3RhdHVzIHN0YXR1czsKLSAgaW50IGhhc192cDhsX2FscGhhID0gMDsgIC8vIEZyYW1lIGNvbnRhaW5zIGEgbG9zc2xlc3MgaW1hZ2Ugd2l0aCBhbHBoYS4KKyAgaW50IGltYWdlX2FkZGVkID0gMDsKIAogICBpZiAoZG11eC0+ZnJhbWVzXyAhPSBOVUxMKSByZXR1cm4gUEFSU0VfRVJST1I7CiAgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgbWluX3NpemUpKSByZXR1cm4gUEFSU0VfRVJST1I7CiAgIGlmIChNZW1EYXRhU2l6ZShtZW0pIDwgbWluX3NpemUpIHJldHVybiBQQVJTRV9ORUVEX01PUkVfREFUQTsKIAotICBmcmFtZSA9IChGcmFtZSopU2JNZW1vcnlDYWxsb2MoMSwgc2l6ZW9mKCpmcmFtZSkpOworICBmcmFtZSA9IChGcmFtZSopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpmcmFtZSkpOwogICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIFBBUlNFX0VSUk9SOwogCi0gIC8vIEZvciB0aGUgc2luZ2xlIGltYWdlIGNhc2Ugd2UgYWxsb3cgcGFyc2luZyBvZiBhIHBhcnRpYWwgZnJhbWUsIGJ1dCB3ZSBuZWVkCi0gIC8vIGF0IGxlYXN0IENIVU5LX0hFQURFUl9TSVpFIGZvciBwYXJzaW5nLgotICBzdGF0dXMgPSBTdG9yZUZyYW1lKDEsIENIVU5LX0hFQURFUl9TSVpFLCAmZG11eC0+bWVtXywgZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgJmhhc192cDhsX2FscGhhKTsKKyAgLy8gRm9yIHRoZSBzaW5nbGUgaW1hZ2UgY2FzZSB3ZSBhbGxvdyBwYXJzaW5nIG9mIGEgcGFydGlhbCBmcmFtZSwgc28gbm8KKyAgLy8gbWluaW11bSBzaXplIGlzIGltcG9zZWQgaGVyZS4KKyAgc3RhdHVzID0gU3RvcmVGcmFtZSgxLCAwLCAmZG11eC0+bWVtXywgZnJhbWUpOwogICBpZiAoc3RhdHVzICE9IFBBUlNFX0VSUk9SKSB7CiAgICAgY29uc3QgaW50IGhhc19hbHBoYSA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgQUxQSEFfRkxBRyk7CiAgICAgLy8gQ2xlYXIgYW55IGFscGhhIHdoZW4gdGhlIGFscGhhIGZsYWcgaXMgbWlzc2luZy4KICAgICBpZiAoIWhhc19hbHBoYSAmJiBmcmFtZS0+aW1nX2NvbXBvbmVudHNfWzFdLnNpemVfID4gMCkgewogICAgICAgZnJhbWUtPmltZ19jb21wb25lbnRzX1sxXS5vZmZzZXRfID0gMDsKICAgICAgIGZyYW1lLT5pbWdfY29tcG9uZW50c19bMV0uc2l6ZV8gPSAwOworICAgICAgZnJhbWUtPmhhc19hbHBoYV8gPSAwOwogICAgIH0KIAogICAgIC8vIFVzZSB0aGUgZnJhbWUgd2lkdGgvaGVpZ2h0IGFzIHRoZSBjYW52YXMgdmFsdWVzIGZvciBub24tdnA4eCBmaWxlcy4KQEAgLTQ1Niw0NyArNDIxLDI2IEBACiAgICAgICBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVI7CiAgICAgICBkbXV4LT5jYW52YXNfd2lkdGhfID0gZnJhbWUtPndpZHRoXzsKICAgICAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gZnJhbWUtPmhlaWdodF87Ci0gICAgICBkbXV4LT5mZWF0dXJlX2ZsYWdzXyB8PSBoYXNfdnA4bF9hbHBoYSA/IEFMUEhBX0ZMQUcgOiAwOworICAgICAgZG11eC0+ZmVhdHVyZV9mbGFnc18gfD0gZnJhbWUtPmhhc19hbHBoYV8gPyBBTFBIQV9GTEFHIDogMDsKICAgICB9Ci0gICAgQWRkRnJhbWUoZG11eCwgZnJhbWUpOwotICAgIGRtdXgtPm51bV9mcmFtZXNfID0gMTsKLSAgfSBlbHNlIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoZnJhbWUpOworICAgIGlmICghQWRkRnJhbWUoZG11eCwgZnJhbWUpKSB7CisgICAgICBzdGF0dXMgPSBQQVJTRV9FUlJPUjsgIC8vIGxhc3QgZnJhbWUgd2FzIGxlZnQgaW5jb21wbGV0ZQorICAgIH0gZWxzZSB7CisgICAgICBpbWFnZV9hZGRlZCA9IDE7CisgICAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgfQogICB9CiAKKyAgaWYgKCFpbWFnZV9hZGRlZCkgV2ViUFNhZmVGcmVlKGZyYW1lKTsKICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlVlA4WChXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlVlA4WENodW5rcyhXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBjb25zdCBpbnQgaXNfYW5pbWF0aW9uID0gISEoZG11eC0+ZmVhdHVyZV9mbGFnc18gJiBBTklNQVRJT05fRkxBRyk7CiAgIE1lbUJ1ZmZlciogY29uc3QgbWVtID0gJmRtdXgtPm1lbV87CiAgIGludCBhbmltX2NodW5rcyA9IDA7Ci0gIHVpbnQzMl90IHZwOHhfc2l6ZTsKICAgUGFyc2VTdGF0dXMgc3RhdHVzID0gUEFSU0VfT0s7CiAKLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRtdXgtPmlzX2V4dF9mb3JtYXRfID0gMTsKLSAgU2tpcChtZW0sIFRBR19TSVpFKTsgIC8vIFZQOFgKLSAgdnA4eF9zaXplID0gUmVhZExFMzIobWVtKTsKLSAgaWYgKHZwOHhfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7Ci0gIGlmICh2cDh4X3NpemUgPCBWUDhYX0NIVU5LX1NJWkUpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgdnA4eF9zaXplICs9IHZwOHhfc2l6ZSAmIDE7Ci0gIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgdnA4eF9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOwotICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IHZwOHhfc2l6ZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCi0gIGRtdXgtPmZlYXR1cmVfZmxhZ3NfID0gUmVhZEJ5dGUobWVtKTsKLSAgU2tpcChtZW0sIDMpOyAgLy8gUmVzZXJ2ZWQuCi0gIGRtdXgtPmNhbnZhc193aWR0aF8gID0gMSArIFJlYWRMRTI0cyhtZW0pOwotICBkbXV4LT5jYW52YXNfaGVpZ2h0XyA9IDEgKyBSZWFkTEUyNHMobWVtKTsKLSAgaWYgKGRtdXgtPmNhbnZhc193aWR0aF8gKiAodWludDY0X3QpZG11eC0+Y2FudmFzX2hlaWdodF8gPj0gTUFYX0lNQUdFX0FSRUEpIHsKLSAgICByZXR1cm4gUEFSU0VfRVJST1I7ICAvLyBpbWFnZSBmaW5hbCBkaW1lbnNpb24gaXMgdG9vIGxhcmdlCi0gIH0KLSAgU2tpcChtZW0sIHZwOHhfc2l6ZSAtIFZQOFhfQ0hVTktfU0laRSk7ICAvLyBza2lwIGFueSB0cmFpbGluZyBkYXRhLgotICBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVI7Ci0KLSAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBDSFVOS19IRUFERVJfU0laRSkpIHJldHVybiBQQVJTRV9FUlJPUjsKLSAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOwotCiAgIGRvIHsKICAgICBpbnQgc3RvcmVfY2h1bmsgPSAxOwogICAgIGNvbnN0IHNpemVfdCBjaHVua19zdGFydF9vZmZzZXQgPSBtZW0tPnN0YXJ0XzsKQEAgLTUxNSw3ICs0NTksNyBAQAogICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnICcpOgogICAgICAgY2FzZSBNS0ZPVVJDQygnVicsICdQJywgJzgnLCAnTCcpOiB7CiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpc24ndCBhbiBhbmltYXRpb24gKGFsbCBmcmFtZXMgc2hvdWxkIGJlIGluIGFuIEFOTUYpLgotICAgICAgICBpZiAoYW5pbV9jaHVua3MgPiAwKSByZXR1cm4gUEFSU0VfRVJST1I7CisgICAgICAgIGlmIChhbmltX2NodW5rcyA+IDAgfHwgaXNfYW5pbWF0aW9uKSByZXR1cm4gUEFSU0VfRVJST1I7CiAKICAgICAgICAgUmV3aW5kKG1lbSwgQ0hVTktfSEVBREVSX1NJWkUpOwogICAgICAgICBzdGF0dXMgPSBQYXJzZVNpbmdsZUltYWdlKGRtdXgpOwpAQCAtNTQyLDI0ICs0ODYsMTggQEAKICAgICAgICAgc3RhdHVzID0gUGFyc2VBbmltYXRpb25GcmFtZShkbXV4LCBjaHVua19zaXplX3BhZGRlZCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgICBjYXNlIE1LRk9VUkNDKCdGJywgJ1InLCAnRycsICdNJyk6IHsKLSAgICAgICAgc3RhdHVzID0gUGFyc2VGcmFnbWVudChkbXV4LCBjaHVua19zaXplX3BhZGRlZCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotI2VuZGlmCiAgICAgICBjYXNlIE1LRk9VUkNDKCdJJywgJ0MnLCAnQycsICdQJyk6IHsKICAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIElDQ1BfRkxBRyk7CiAgICAgICAgIGdvdG8gU2tpcDsKICAgICAgIH0KLSAgICAgIGNhc2UgTUtGT1VSQ0MoJ1gnLCAnTScsICdQJywgJyAnKTogewotICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpOwotICAgICAgICBnb3RvIFNraXA7Ci0gICAgICB9CiAgICAgICBjYXNlIE1LRk9VUkNDKCdFJywgJ1gnLCAnSScsICdGJyk6IHsKICAgICAgICAgc3RvcmVfY2h1bmsgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEVYSUZfRkxBRyk7CiAgICAgICAgIGdvdG8gU2tpcDsKICAgICAgIH0KKyAgICAgIGNhc2UgTUtGT1VSQ0MoJ1gnLCAnTScsICdQJywgJyAnKTogeworICAgICAgICBzdG9yZV9jaHVuayA9ICEhKGRtdXgtPmZlYXR1cmVfZmxhZ3NfICYgWE1QX0ZMQUcpOworICAgICAgICBnb3RvIFNraXA7CisgICAgICB9CiAgU2tpcDoKICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgaWYgKGNodW5rX3NpemVfcGFkZGVkIDw9IE1lbURhdGFTaXplKG1lbSkpIHsKQEAgLTU4OCw2ICs1MjYsMzcgQEAKICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIFBhcnNlU3RhdHVzIFBhcnNlVlA4WChXZWJQRGVtdXhlciogY29uc3QgZG11eCkgeworICBNZW1CdWZmZXIqIGNvbnN0IG1lbSA9ICZkbXV4LT5tZW1fOworICB1aW50MzJfdCB2cDh4X3NpemU7CisKKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworCisgIGRtdXgtPmlzX2V4dF9mb3JtYXRfID0gMTsKKyAgU2tpcChtZW0sIFRBR19TSVpFKTsgIC8vIFZQOFgKKyAgdnA4eF9zaXplID0gUmVhZExFMzIobWVtKTsKKyAgaWYgKHZwOHhfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSByZXR1cm4gUEFSU0VfRVJST1I7CisgIGlmICh2cDh4X3NpemUgPCBWUDhYX0NIVU5LX1NJWkUpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgdnA4eF9zaXplICs9IHZwOHhfc2l6ZSAmIDE7CisgIGlmIChTaXplSXNJbnZhbGlkKG1lbSwgdnA4eF9zaXplKSkgcmV0dXJuIFBBUlNFX0VSUk9SOworICBpZiAoTWVtRGF0YVNpemUobWVtKSA8IHZwOHhfc2l6ZSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworCisgIGRtdXgtPmZlYXR1cmVfZmxhZ3NfID0gUmVhZEJ5dGUobWVtKTsKKyAgU2tpcChtZW0sIDMpOyAgLy8gUmVzZXJ2ZWQuCisgIGRtdXgtPmNhbnZhc193aWR0aF8gID0gMSArIFJlYWRMRTI0cyhtZW0pOworICBkbXV4LT5jYW52YXNfaGVpZ2h0XyA9IDEgKyBSZWFkTEUyNHMobWVtKTsKKyAgaWYgKGRtdXgtPmNhbnZhc193aWR0aF8gKiAodWludDY0X3QpZG11eC0+Y2FudmFzX2hlaWdodF8gPj0gTUFYX0lNQUdFX0FSRUEpIHsKKyAgICByZXR1cm4gUEFSU0VfRVJST1I7ICAvLyBpbWFnZSBmaW5hbCBkaW1lbnNpb24gaXMgdG9vIGxhcmdlCisgIH0KKyAgU2tpcChtZW0sIHZwOHhfc2l6ZSAtIFZQOFhfQ0hVTktfU0laRSk7ICAvLyBza2lwIGFueSB0cmFpbGluZyBkYXRhLgorICBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFRF9IRUFERVI7CisKKyAgaWYgKFNpemVJc0ludmFsaWQobWVtLCBDSFVOS19IRUFERVJfU0laRSkpIHJldHVybiBQQVJTRV9FUlJPUjsKKyAgaWYgKE1lbURhdGFTaXplKG1lbSkgPCBDSFVOS19IRUFERVJfU0laRSkgcmV0dXJuIFBBUlNFX05FRURfTU9SRV9EQVRBOworCisgIHJldHVybiBQYXJzZVZQOFhDaHVua3MoZG11eCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBGb3JtYXQgdmFsaWRhdGlvbgogCkBAIC02MDIsMzAgKzU3MSw0NyBAQAogICByZXR1cm4gMTsKIH0KIAorLy8gSWYgJ2V4YWN0JyBpcyB0cnVlLCBjaGVjayB0aGF0IHRoZSBpbWFnZSByZXNvbHV0aW9uIG1hdGNoZXMgdGhlIGNhbnZhcy4KKy8vIElmICdleGFjdCcgaXMgZmFsc2UsIGNoZWNrIHRoYXQgdGhlIHgveSBvZmZzZXRzIGRvIG5vdCBleGNlZWQgdGhlIGNhbnZhcy4KK3N0YXRpYyBpbnQgQ2hlY2tGcmFtZUJvdW5kcyhjb25zdCBGcmFtZSogY29uc3QgZnJhbWUsIGludCBleGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FudmFzX3dpZHRoLCBpbnQgY2FudmFzX2hlaWdodCkgeworICBpZiAoZXhhY3QpIHsKKyAgICBpZiAoZnJhbWUtPnhfb2Zmc2V0XyAhPSAwIHx8IGZyYW1lLT55X29mZnNldF8gIT0gMCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChmcmFtZS0+d2lkdGhfICE9IGNhbnZhc193aWR0aCB8fCBmcmFtZS0+aGVpZ2h0XyAhPSBjYW52YXNfaGVpZ2h0KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZyYW1lLT54X29mZnNldF8gPCAwIHx8IGZyYW1lLT55X29mZnNldF8gPCAwKSByZXR1cm4gMDsKKyAgICBpZiAoZnJhbWUtPndpZHRoXyArIGZyYW1lLT54X29mZnNldF8gPiBjYW52YXNfd2lkdGgpIHJldHVybiAwOworICAgIGlmIChmcmFtZS0+aGVpZ2h0XyArIGZyYW1lLT55X29mZnNldF8gPiBjYW52YXNfaGVpZ2h0KSByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKwogc3RhdGljIGludCBJc1ZhbGlkRXh0ZW5kZWRGb3JtYXQoY29uc3QgV2ViUERlbXV4ZXIqIGNvbnN0IGRtdXgpIHsKLSAgY29uc3QgaW50IGhhc19mcmFnbWVudHMgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEZSQUdNRU5UU19GTEFHKTsKLSAgY29uc3QgaW50IGhhc19mcmFtZXMgPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKLSAgY29uc3QgRnJhbWUqIGY7CisgIGNvbnN0IGludCBpc19hbmltYXRpb24gPSAhIShkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIEFOSU1BVElPTl9GTEFHKTsKKyAgY29uc3QgRnJhbWUqIGYgPSBkbXV4LT5mcmFtZXNfOwogCiAgIGlmIChkbXV4LT5zdGF0ZV8gPT0gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUikgcmV0dXJuIDE7CiAKICAgaWYgKGRtdXgtPmNhbnZhc193aWR0aF8gPD0gMCB8fCBkbXV4LT5jYW52YXNfaGVpZ2h0XyA8PSAwKSByZXR1cm4gMDsKICAgaWYgKGRtdXgtPmxvb3BfY291bnRfIDwgMCkgcmV0dXJuIDA7CiAgIGlmIChkbXV4LT5zdGF0ZV8gPT0gV0VCUF9ERU1VWF9ET05FICYmIGRtdXgtPmZyYW1lc18gPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChkbXV4LT5mZWF0dXJlX2ZsYWdzXyAmIH5BTExfVkFMSURfRkxBR1MpIHJldHVybiAwOyAgLy8gaW52YWxpZCBiaXRzdHJlYW0KIAotICBmb3IgKGYgPSBkbXV4LT5mcmFtZXNfOyBmICE9IE5VTEw7IGYgPSBmLT5uZXh0XykgeworICB3aGlsZSAoZiAhPSBOVUxMKSB7CiAgICAgY29uc3QgaW50IGN1cl9mcmFtZV9zZXQgPSBmLT5mcmFtZV9udW1fOwotICAgIGludCBmcmFtZV9jb3VudCA9IDAsIGZyYWdtZW50X2NvdW50ID0gMDsKKyAgICBpbnQgZnJhbWVfY291bnQgPSAwOwogCi0gICAgLy8gQ2hlY2sgZnJhbWUgcHJvcGVydGllcyBhbmQgaWYgdGhlIGltYWdlIGlzIGNvbXBvc2VkIG9mIGZyYWdtZW50cyB0aGF0Ci0gICAgLy8gZWFjaCBmcmFnbWVudCBjYW1lIGZyb20gYSBmcmFnbWVudC4KKyAgICAvLyBDaGVjayBmcmFtZSBwcm9wZXJ0aWVzLgogICAgIGZvciAoOyBmICE9IE5VTEwgJiYgZi0+ZnJhbWVfbnVtXyA9PSBjdXJfZnJhbWVfc2V0OyBmID0gZi0+bmV4dF8pIHsKICAgICAgIGNvbnN0IENodW5rRGF0YSogY29uc3QgaW1hZ2UgPSBmLT5pbWdfY29tcG9uZW50c187CiAgICAgICBjb25zdCBDaHVua0RhdGEqIGNvbnN0IGFscGhhID0gZi0+aW1nX2NvbXBvbmVudHNfICsgMTsKIAotICAgICAgaWYgKCFoYXNfZnJhZ21lbnRzICYmIGYtPmlzX2ZyYWdtZW50XykgcmV0dXJuIDA7Ci0gICAgICBpZiAoIWhhc19mcmFtZXMgJiYgZi0+ZnJhbWVfbnVtXyA+IDEpIHJldHVybiAwOwotICAgICAgaWYgKGYtPnhfb2Zmc2V0XyA8IDAgfHwgZi0+eV9vZmZzZXRfIDwgMCkgcmV0dXJuIDA7CisgICAgICBpZiAoIWlzX2FuaW1hdGlvbiAmJiBmLT5mcmFtZV9udW1fID4gMSkgcmV0dXJuIDA7CisKICAgICAgIGlmIChmLT5jb21wbGV0ZV8pIHsKICAgICAgICAgaWYgKGFscGhhLT5zaXplXyA9PSAwICYmIGltYWdlLT5zaXplXyA9PSAwKSByZXR1cm4gMDsKICAgICAgICAgLy8gRW5zdXJlIGFscGhhIHByZWNlZGVzIGltYWdlIGJpdHN0cmVhbS4KQEAgLTY0NywxMiArNjMzLDE0IEBACiAgICAgICAgIGlmIChmLT5uZXh0XyAhPSBOVUxMKSByZXR1cm4gMDsKICAgICAgIH0KIAotICAgICAgZnJhZ21lbnRfY291bnQgKz0gZi0+aXNfZnJhZ21lbnRfOworICAgICAgaWYgKGYtPndpZHRoXyA+IDAgJiYgZi0+aGVpZ2h0XyA+IDAgJiYKKyAgICAgICAgICAhQ2hlY2tGcmFtZUJvdW5kcyhmLCAhaXNfYW5pbWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRtdXgtPmNhbnZhc193aWR0aF8sIGRtdXgtPmNhbnZhc19oZWlnaHRfKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKwogICAgICAgKytmcmFtZV9jb3VudDsKICAgICB9Ci0gICAgaWYgKCFoYXNfZnJhZ21lbnRzICYmIGZyYW1lX2NvdW50ID4gMSkgcmV0dXJuIDA7Ci0gICAgaWYgKGZyYWdtZW50X2NvdW50ID4gMCAmJiBmcmFtZV9jb3VudCAhPSBmcmFnbWVudF9jb3VudCkgcmV0dXJuIDA7Ci0gICAgaWYgKGYgPT0gTlVMTCkgYnJlYWs7CiAgIH0KICAgcmV0dXJuIDE7CiB9CkBAIC02NjcsOSArNjU1LDQ1IEBACiAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSAtMTsKICAgZG11eC0+Y2FudmFzX2hlaWdodF8gPSAtMTsKICAgZG11eC0+ZnJhbWVzX3RhaWxfID0gJmRtdXgtPmZyYW1lc187CisgIGRtdXgtPmNodW5rc190YWlsXyA9ICZkbXV4LT5jaHVua3NfOwogICBkbXV4LT5tZW1fID0gKm1lbTsKIH0KIAorc3RhdGljIFBhcnNlU3RhdHVzIENyZWF0ZVJhd0ltYWdlRGVtdXhlcihNZW1CdWZmZXIqIGNvbnN0IG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlbXV4ZXIqKiBkZW11eGVyKSB7CisgIFdlYlBCaXRzdHJlYW1GZWF0dXJlcyBmZWF0dXJlczsKKyAgY29uc3QgVlA4U3RhdHVzQ29kZSBzdGF0dXMgPQorICAgICAgV2ViUEdldEZlYXR1cmVzKG1lbS0+YnVmXywgbWVtLT5idWZfc2l6ZV8sICZmZWF0dXJlcyk7CisgICpkZW11eGVyID0gTlVMTDsKKyAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LKSB7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gVlA4X1NUQVRVU19OT1RfRU5PVUdIX0RBVEEpID8gUEFSU0VfTkVFRF9NT1JFX0RBVEEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBQQVJTRV9FUlJPUjsKKyAgfQorCisgIHsKKyAgICBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CisgICAgRnJhbWUqIGNvbnN0IGZyYW1lID0gKEZyYW1lKilXZWJQU2FmZUNhbGxvYygxVUxMLCBzaXplb2YoKmZyYW1lKSk7CisgICAgaWYgKGRtdXggPT0gTlVMTCB8fCBmcmFtZSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIEluaXREZW11eChkbXV4LCBtZW0pOworICAgIFNldEZyYW1lSW5mbygwLCBtZW0tPmJ1Zl9zaXplXywgMSAvKmZyYW1lX251bSovLCAxIC8qY29tcGxldGUqLywgJmZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBmcmFtZSk7CisgICAgaWYgKCFBZGRGcmFtZShkbXV4LCBmcmFtZSkpIGdvdG8gRXJyb3I7CisgICAgZG11eC0+c3RhdGVfID0gV0VCUF9ERU1VWF9ET05FOworICAgIGRtdXgtPmNhbnZhc193aWR0aF8gPSBmcmFtZS0+d2lkdGhfOworICAgIGRtdXgtPmNhbnZhc19oZWlnaHRfID0gZnJhbWUtPmhlaWdodF87CisgICAgZG11eC0+ZmVhdHVyZV9mbGFnc18gfD0gZnJhbWUtPmhhc19hbHBoYV8gPyBBTFBIQV9GTEFHIDogMDsKKyAgICBkbXV4LT5udW1fZnJhbWVzXyA9IDE7CisgICAgYXNzZXJ0KElzVmFsaWRTaW1wbGVGb3JtYXQoZG11eCkpOworICAgICpkZW11eGVyID0gZG11eDsKKyAgICByZXR1cm4gUEFSU0VfT0s7CisKKyBFcnJvcjoKKyAgICBXZWJQU2FmZUZyZWUoZG11eCk7CisgICAgV2ViUFNhZmVGcmVlKGZyYW1lKTsKKyAgICByZXR1cm4gUEFSU0VfRVJST1I7CisgIH0KK30KKwogV2ViUERlbXV4ZXIqIFdlYlBEZW11eEludGVybmFsKGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBpbnQgYWxsb3dfcGFydGlhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGVtdXhTdGF0ZSogc3RhdGUsIGludCB2ZXJzaW9uKSB7CiAgIGNvbnN0IENodW5rUGFyc2VyKiBwYXJzZXI7CkBAIC02NzgsMjkgKzcwMiw0OSBAQAogICBNZW1CdWZmZXIgbWVtOwogICBXZWJQRGVtdXhlciogZG11eDsKIAorICBpZiAoc3RhdGUgIT0gTlVMTCkgKnN0YXRlID0gV0VCUF9ERU1VWF9QQVJTRV9FUlJPUjsKKwogICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pKSByZXR1cm4gTlVMTDsKICAgaWYgKGRhdGEgPT0gTlVMTCB8fCBkYXRhLT5ieXRlcyA9PSBOVUxMIHx8IGRhdGEtPnNpemUgPT0gMCkgcmV0dXJuIE5VTEw7CiAKICAgaWYgKCFJbml0TWVtQnVmZmVyKCZtZW0sIGRhdGEtPmJ5dGVzLCBkYXRhLT5zaXplKSkgcmV0dXJuIE5VTEw7Ci0gIGlmICghUmVhZEhlYWRlcigmbWVtKSkgcmV0dXJuIE5VTEw7CisgIHN0YXR1cyA9IFJlYWRIZWFkZXIoJm1lbSk7CisgIGlmIChzdGF0dXMgIT0gUEFSU0VfT0spIHsKKyAgICAvLyBJZiBwYXJzaW5nIG9mIHRoZSB3ZWJwIGZpbGUgaGVhZGVyIGZhaWxzIGF0dGVtcHQgdG8gaGFuZGxlIGEgcmF3CisgICAgLy8gVlA4L1ZQOEwgZnJhbWUuIE5vdGUgJ2FsbG93X3BhcnRpYWwnIGlzIGlnbm9yZWQgaW4gdGhpcyBjYXNlLgorICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfRVJST1IpIHsKKyAgICAgIHN0YXR1cyA9IENyZWF0ZVJhd0ltYWdlRGVtdXhlcigmbWVtLCAmZG11eCk7CisgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX09LKSB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBOVUxMKSAqc3RhdGUgPSBXRUJQX0RFTVVYX0RPTkU7CisgICAgICAgIHJldHVybiBkbXV4OworICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdGUgIT0gTlVMTCkgeworICAgICAgKnN0YXRlID0gKHN0YXR1cyA9PSBQQVJTRV9ORUVEX01PUkVfREFUQSkgPyBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFdFQlBfREVNVVhfUEFSU0VfRVJST1I7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CiAKICAgcGFydGlhbCA9IChtZW0uYnVmX3NpemVfIDwgbWVtLnJpZmZfZW5kXyk7CiAgIGlmICghYWxsb3dfcGFydGlhbCAmJiBwYXJ0aWFsKSByZXR1cm4gTlVMTDsKIAotICBkbXV4ID0gKFdlYlBEZW11eGVyKilTYk1lbW9yeUNhbGxvYygxLCBzaXplb2YoKmRtdXgpKTsKKyAgZG11eCA9IChXZWJQRGVtdXhlciopV2ViUFNhZmVDYWxsb2MoMVVMTCwgc2l6ZW9mKCpkbXV4KSk7CiAgIGlmIChkbXV4ID09IE5VTEwpIHJldHVybiBOVUxMOwogICBJbml0RGVtdXgoZG11eCwgJm1lbSk7CiAKKyAgc3RhdHVzID0gUEFSU0VfRVJST1I7CiAgIGZvciAocGFyc2VyID0ga01hc3RlckNodW5rczsgcGFyc2VyLT5wYXJzZSAhPSBOVUxMOyArK3BhcnNlcikgewotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKHBhcnNlci0+aWQsIEdldEJ1ZmZlcigmZG11eC0+bWVtXyksIFRBR19TSVpFKSkgeworICAgIGlmICghbWVtY21wKHBhcnNlci0+aWQsIEdldEJ1ZmZlcigmZG11eC0+bWVtXyksIFRBR19TSVpFKSkgewogICAgICAgc3RhdHVzID0gcGFyc2VyLT5wYXJzZShkbXV4KTsKICAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfT0spIGRtdXgtPnN0YXRlXyA9IFdFQlBfREVNVVhfRE9ORTsKICAgICAgIGlmIChzdGF0dXMgPT0gUEFSU0VfTkVFRF9NT1JFX0RBVEEgJiYgIXBhcnRpYWwpIHN0YXR1cyA9IFBBUlNFX0VSUk9SOwogICAgICAgaWYgKHN0YXR1cyAhPSBQQVJTRV9FUlJPUiAmJiAhcGFyc2VyLT52YWxpZChkbXV4KSkgc3RhdHVzID0gUEFSU0VfRVJST1I7CisgICAgICBpZiAoc3RhdHVzID09IFBBUlNFX0VSUk9SKSBkbXV4LT5zdGF0ZV8gPSBXRUJQX0RFTVVYX1BBUlNFX0VSUk9SOwogICAgICAgYnJlYWs7CiAgICAgfQogICB9Ci0gIGlmIChzdGF0ZSkgKnN0YXRlID0gZG11eC0+c3RhdGVfOworICBpZiAoc3RhdGUgIT0gTlVMTCkgKnN0YXRlID0gZG11eC0+c3RhdGVfOwogCiAgIGlmIChzdGF0dXMgPT0gUEFSU0VfRVJST1IpIHsKICAgICBXZWJQRGVtdXhEZWxldGUoZG11eCk7CkBAIC03MTcsMTQgKzc2MSwxNCBAQAogICBmb3IgKGYgPSBkbXV4LT5mcmFtZXNfOyBmICE9IE5VTEw7KSB7CiAgICAgRnJhbWUqIGNvbnN0IGN1cl9mcmFtZSA9IGY7CiAgICAgZiA9IGYtPm5leHRfOwotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShjdXJfZnJhbWUpOworICAgIFdlYlBTYWZlRnJlZShjdXJfZnJhbWUpOwogICB9CiAgIGZvciAoYyA9IGRtdXgtPmNodW5rc187IGMgIT0gTlVMTDspIHsKICAgICBDaHVuayogY29uc3QgY3VyX2NodW5rID0gYzsKICAgICBjID0gYy0+bmV4dF87Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGN1cl9jaHVuayk7CisgICAgV2ViUFNhZmVGcmVlKGN1cl9jaHVuayk7CiAgIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGRtdXgpOworICBXZWJQU2FmZUZyZWUoZG11eCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC03NDYsOCArNzkwLDYgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBGcmFtZSBpdGVyYXRpb24KIAotLy8gRmluZCB0aGUgZmlyc3QgJ2ZyYW1lX251bScgZnJhbWUuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBzdWNoIGZyYW1lcyBpbiBhCi0vLyBmcmFnbWVudGVkIGZyYW1lLgogc3RhdGljIGNvbnN0IEZyYW1lKiBHZXRGcmFtZShjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCwgaW50IGZyYW1lX251bSkgewogICBjb25zdCBGcmFtZSogZjsKICAgZm9yIChmID0gZG11eC0+ZnJhbWVzXzsgZiAhPSBOVUxMOyBmID0gZi0+bmV4dF8pIHsKQEAgLTc1NiwyMSArNzk4LDYgQEAKICAgcmV0dXJuIGY7CiB9CiAKLS8vIFJldHVybnMgZnJhZ21lbnQgJ2ZyYWdtZW50X251bScgYW5kIHRoZSB0b3RhbCBjb3VudC4KLXN0YXRpYyBjb25zdCBGcmFtZSogR2V0RnJhZ21lbnQoCi0gICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lX3NldCwgaW50IGZyYWdtZW50X251bSwgaW50KiBjb25zdCBjb3VudCkgewotICBjb25zdCBpbnQgdGhpc19mcmFtZSA9IGZyYW1lX3NldC0+ZnJhbWVfbnVtXzsKLSAgY29uc3QgRnJhbWUqIGYgPSBmcmFtZV9zZXQ7Ci0gIGNvbnN0IEZyYW1lKiBmcmFnbWVudCA9IE5VTEw7Ci0gIGludCB0b3RhbDsKLQotICBmb3IgKHRvdGFsID0gMDsgZiAhPSBOVUxMICYmIGYtPmZyYW1lX251bV8gPT0gdGhpc19mcmFtZTsgZiA9IGYtPm5leHRfKSB7Ci0gICAgaWYgKCsrdG90YWwgPT0gZnJhZ21lbnRfbnVtKSBmcmFnbWVudCA9IGY7Ci0gIH0KLSAgKmNvdW50ID0gdG90YWw7Ci0gIHJldHVybiBmcmFnbWVudDsKLX0KLQogc3RhdGljIGNvbnN0IHVpbnQ4X3QqIEdldEZyYW1lUGF5bG9hZChjb25zdCB1aW50OF90KiBjb25zdCBtZW1fYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgZGF0YV9zaXplKSB7CkBAIC03OTcsMzIgKzgyNCwyNyBAQAogCiAvLyBDcmVhdGUgYSB3aG9sZSAnZnJhbWUnIGZyb20gVlA4ICgrIGFscGhhKSBvciBsb3NzbGVzcy4KIHN0YXRpYyBpbnQgU3ludGhlc2l6ZUZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBjb25zdCBkbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWUqIGNvbnN0IGZpcnN0X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYWdtZW50X251bSwgV2ViUEl0ZXJhdG9yKiBjb25zdCBpdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZSogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQSXRlcmF0b3IqIGNvbnN0IGl0ZXIpIHsKICAgY29uc3QgdWludDhfdCogY29uc3QgbWVtX2J1ZiA9IGRtdXgtPm1lbV8uYnVmXzsKLSAgaW50IG51bV9mcmFnbWVudHM7CiAgIHNpemVfdCBwYXlsb2FkX3NpemUgPSAwOwotICBjb25zdCBGcmFtZSogY29uc3QgZnJhZ21lbnQgPQotICAgICAgR2V0RnJhZ21lbnQoZmlyc3RfZnJhbWUsIGZyYWdtZW50X251bSwgJm51bV9mcmFnbWVudHMpOwotICBjb25zdCB1aW50OF90KiBjb25zdCBwYXlsb2FkID0KLSAgICAgIEdldEZyYW1lUGF5bG9hZChtZW1fYnVmLCBmcmFnbWVudCwgJnBheWxvYWRfc2l6ZSk7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHBheWxvYWQgPSBHZXRGcmFtZVBheWxvYWQobWVtX2J1ZiwgZnJhbWUsICZwYXlsb2FkX3NpemUpOwogICBpZiAocGF5bG9hZCA9PSBOVUxMKSByZXR1cm4gMDsKLSAgU0JfRENIRUNLKGZpcnN0X2ZyYW1lICE9IE5VTEwpOworICBhc3NlcnQoZnJhbWUgIT0gTlVMTCk7CiAKLSAgaXRlci0+ZnJhbWVfbnVtICAgICAgPSBmaXJzdF9mcmFtZS0+ZnJhbWVfbnVtXzsKKyAgaXRlci0+ZnJhbWVfbnVtICAgICAgPSBmcmFtZS0+ZnJhbWVfbnVtXzsKICAgaXRlci0+bnVtX2ZyYW1lcyAgICAgPSBkbXV4LT5udW1fZnJhbWVzXzsKLSAgaXRlci0+ZnJhZ21lbnRfbnVtICAgPSBmcmFnbWVudF9udW07Ci0gIGl0ZXItPm51bV9mcmFnbWVudHMgID0gbnVtX2ZyYWdtZW50czsKLSAgaXRlci0+eF9vZmZzZXQgICAgICAgPSBmcmFnbWVudC0+eF9vZmZzZXRfOwotICBpdGVyLT55X29mZnNldCAgICAgICA9IGZyYWdtZW50LT55X29mZnNldF87Ci0gIGl0ZXItPndpZHRoICAgICAgICAgID0gZnJhZ21lbnQtPndpZHRoXzsKLSAgaXRlci0+aGVpZ2h0ICAgICAgICAgPSBmcmFnbWVudC0+aGVpZ2h0XzsKLSAgaXRlci0+ZHVyYXRpb24gICAgICAgPSBmcmFnbWVudC0+ZHVyYXRpb25fOwotICBpdGVyLT5kaXNwb3NlX21ldGhvZCA9IGZyYWdtZW50LT5kaXNwb3NlX21ldGhvZF87Ci0gIGl0ZXItPmNvbXBsZXRlICAgICAgID0gZnJhZ21lbnQtPmNvbXBsZXRlXzsKKyAgaXRlci0+eF9vZmZzZXQgICAgICAgPSBmcmFtZS0+eF9vZmZzZXRfOworICBpdGVyLT55X29mZnNldCAgICAgICA9IGZyYW1lLT55X29mZnNldF87CisgIGl0ZXItPndpZHRoICAgICAgICAgID0gZnJhbWUtPndpZHRoXzsKKyAgaXRlci0+aGVpZ2h0ICAgICAgICAgPSBmcmFtZS0+aGVpZ2h0XzsKKyAgaXRlci0+aGFzX2FscGhhICAgICAgPSBmcmFtZS0+aGFzX2FscGhhXzsKKyAgaXRlci0+ZHVyYXRpb24gICAgICAgPSBmcmFtZS0+ZHVyYXRpb25fOworICBpdGVyLT5kaXNwb3NlX21ldGhvZCA9IGZyYW1lLT5kaXNwb3NlX21ldGhvZF87CisgIGl0ZXItPmJsZW5kX21ldGhvZCAgID0gZnJhbWUtPmJsZW5kX21ldGhvZF87CisgIGl0ZXItPmNvbXBsZXRlICAgICAgID0gZnJhbWUtPmNvbXBsZXRlXzsKICAgaXRlci0+ZnJhZ21lbnQuYnl0ZXMgPSBwYXlsb2FkOwogICBpdGVyLT5mcmFnbWVudC5zaXplICA9IHBheWxvYWRfc2l6ZTsKLSAgLy8gVE9ETyhqemVybik6IGFkanVzdCBvZmZzZXRzIGZvciAnRlJHTSdzIGVtYmVkZGVkIGluICdBTk1GJ3MKICAgcmV0dXJuIDE7CiB9CiAKQEAgLTgzNiwxMyArODU4LDEzIEBACiAgIGZyYW1lID0gR2V0RnJhbWUoZG11eCwgZnJhbWVfbnVtKTsKICAgaWYgKGZyYW1lID09IE5VTEwpIHJldHVybiAwOwogCi0gIHJldHVybiBTeW50aGVzaXplRnJhbWUoZG11eCwgZnJhbWUsIDEsIGl0ZXIpOworICByZXR1cm4gU3ludGhlc2l6ZUZyYW1lKGRtdXgsIGZyYW1lLCBpdGVyKTsKIH0KIAogaW50IFdlYlBEZW11eEdldEZyYW1lKGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBpbnQgZnJhbWUsIFdlYlBJdGVyYXRvciogaXRlcikgewogICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKIAotICBTYk1lbW9yeVNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKKyAgbWVtc2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOwogICBpdGVyLT5wcml2YXRlXyA9ICh2b2lkKilkbXV4OwogICByZXR1cm4gU2V0RnJhbWUoZnJhbWUsIGl0ZXIpOwogfQpAQCAtODU4LDE3ICs4ODAsNiBAQAogICByZXR1cm4gU2V0RnJhbWUoaXRlci0+ZnJhbWVfbnVtIC0gMSwgaXRlcik7CiB9CiAKLWludCBXZWJQRGVtdXhTZWxlY3RGcmFnbWVudChXZWJQSXRlcmF0b3IqIGl0ZXIsIGludCBmcmFnbWVudF9udW0pIHsKLSAgaWYgKGl0ZXIgIT0gTlVMTCAmJiBpdGVyLT5wcml2YXRlXyAhPSBOVUxMICYmIGZyYWdtZW50X251bSA+IDApIHsKLSAgICBjb25zdCBXZWJQRGVtdXhlciogY29uc3QgZG11eCA9IChXZWJQRGVtdXhlciopaXRlci0+cHJpdmF0ZV87Ci0gICAgY29uc3QgRnJhbWUqIGNvbnN0IGZyYW1lID0gR2V0RnJhbWUoZG11eCwgaXRlci0+ZnJhbWVfbnVtKTsKLSAgICBpZiAoZnJhbWUgPT0gTlVMTCkgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gU3ludGhlc2l6ZUZyYW1lKGRtdXgsIGZyYW1lLCBmcmFnbWVudF9udW0sIGl0ZXIpOwotICB9Ci0gIHJldHVybiAwOwotfQotCiB2b2lkIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihXZWJQSXRlcmF0b3IqIGl0ZXIpIHsKICAgKHZvaWQpaXRlcjsKIH0KQEAgLTg4Miw3ICs4OTMsNyBAQAogICBpbnQgY291bnQgPSAwOwogICBmb3IgKGMgPSBkbXV4LT5jaHVua3NfOyBjICE9IE5VTEw7IGMgPSBjLT5uZXh0XykgewogICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGhlYWRlciA9IG1lbV9idWYgKyBjLT5kYXRhXy5vZmZzZXRfOwotICAgIGlmICghU2JNZW1vcnlDb21wYXJlKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7CisgICAgaWYgKCFtZW1jbXAoaGVhZGVyLCBmb3VyY2MsIFRBR19TSVpFKSkgKytjb3VudDsKICAgfQogICByZXR1cm4gY291bnQ7CiB9CkBAIC04OTQsNyArOTA1LDcgQEAKICAgaW50IGNvdW50ID0gMDsKICAgZm9yIChjID0gZG11eC0+Y2h1bmtzXzsgYyAhPSBOVUxMOyBjID0gYy0+bmV4dF8pIHsKICAgICBjb25zdCB1aW50OF90KiBjb25zdCBoZWFkZXIgPSBtZW1fYnVmICsgYy0+ZGF0YV8ub2Zmc2V0XzsKLSAgICBpZiAoIVNiTWVtb3J5Q29tcGFyZShoZWFkZXIsIGZvdXJjYywgVEFHX1NJWkUpKSArK2NvdW50OworICAgIGlmICghbWVtY21wKGhlYWRlciwgZm91cmNjLCBUQUdfU0laRSkpICsrY291bnQ7CiAgICAgaWYgKGNvdW50ID09IGNodW5rX251bSkgYnJlYWs7CiAgIH0KICAgcmV0dXJuIGM7CkBAIC05MjcsNyArOTM4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJdGVyYXRvciogaXRlcikgewogICBpZiAoaXRlciA9PSBOVUxMKSByZXR1cm4gMDsKIAotICBTYk1lbW9yeVNldChpdGVyLCAwLCBzaXplb2YoKml0ZXIpKTsKKyAgbWVtc2V0KGl0ZXIsIDAsIHNpemVvZigqaXRlcikpOwogICBpdGVyLT5wcml2YXRlXyA9ICh2b2lkKilkbXV4OwogICByZXR1cm4gU2V0Q2h1bmsoZm91cmNjLCBjaHVua19udW0sIGl0ZXIpOwogfQpAQCAtOTU0LDYgKzk2NSwzIEBACiAgICh2b2lkKWl0ZXI7CiB9CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kZW11eC9saWJ3ZWJwZGVtdXgucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZmJiYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJ3ZWJwZGVtdXgKK0Rlc2NyaXB0aW9uOiBMaWJyYXJ5IGZvciBwYXJzaW5nIHRoZSBXZWJQIGdyYXBoaWNzIGZvcm1hdCBjb250YWluZXIKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitSZXF1aXJlczogbGlid2VicCA+PSAwLjIuMAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sd2VicGRlbXV4CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZGVtdXgvbGlid2VicGRlbXV4LnJjIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDRhOGIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RlbXV4L2xpYndlYnBkZW11eC5yYwpAQCAtMCwwICsxLDQxIEBACisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIDEsMCwwLDAKKyBQUk9EVUNUVkVSU0lPTiAxLDAsMCwwCisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDFMCisjZWxzZQorIEZJTEVGTEFHUyAweDBMCisjZW5kaWYKKyBGSUxFT1MgMHg0MDAwNEwKKyBGSUxFVFlQRSAweDJMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIkdvb2dsZSwgSW5jLiIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAibGlid2VicGRlbXV4IERMTCIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAibGlid2VicGRlbXV4LmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTgiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJ3ZWJwZGVtdXguZGxsIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIldlYlAgSW1hZ2UgRGVtdXhlciIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsICIxLjAuMCIKKyAgICAgICAgRU5ECisgICAgRU5ECisgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIFZBTFVFICJUcmFuc2xhdGlvbiIsIDB4NDA5LCAxMjAwCisgICAgRU5ECitFTkQKKworI2VuZGlmICAgIC8vIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpIHJlc291cmNlcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgzNmQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxNjMgQEAKK0FNX0NQUEZMQUdTICs9IC1JJCh0b3BfYnVpbGRkaXIpIC1JJCh0b3Bfc3JjZGlyKQorbm9pbnN0X0xUTElCUkFSSUVTID0KK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcF9hdngyLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcF9zc2UyLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcGRlY29kZV9zc2UyLmxhCitub2luc3RfTFRMSUJSQVJJRVMgKz0gbGlid2VicGRzcF9zc2U0MS5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BkZWNvZGVfc3NlNDEubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwX25lb24ubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwZGVjb2RlX25lb24ubGEKK25vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwX21zYS5sYQorbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnBkc3BkZWNvZGVfbXNhLmxhCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIG5vaW5zdF9MVExJQlJBUklFUyArPSBsaWJ3ZWJwZHNwZGVjb2RlLmxhCitlbmRpZgorCitjb21tb25fSEVBREVSUyA9IC4uL3dlYnAvdHlwZXMuaAorY29tbW9uZGlyID0gJChpbmNsdWRlZGlyKS93ZWJwCisKK0NPTU1PTl9TT1VSQ0VTID0KK0NPTU1PTl9TT1VSQ0VTICs9IGFscGhhX3Byb2Nlc3NpbmcuYworQ09NTU9OX1NPVVJDRVMgKz0gYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSBjb21tb25fc3NlMi5oCitDT01NT05fU09VUkNFUyArPSBjcHUuYworQ09NTU9OX1NPVVJDRVMgKz0gZGVjLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGRlY19jbGlwX3RhYmxlcy5jCitDT01NT05fU09VUkNFUyArPSBkZWNfbWlwczMyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGRlY19taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSBkc3AuaAorQ09NTU9OX1NPVVJDRVMgKz0gZmlsdGVycy5jCitDT01NT05fU09VUkNFUyArPSBmaWx0ZXJzX21pcHNfZHNwX3IyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGxvc3NsZXNzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGxvc3NsZXNzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGxvc3NsZXNzX2NvbW1vbi5oCitDT01NT05fU09VUkNFUyArPSBsb3NzbGVzc19taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSBtaXBzX21hY3JvLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHJlc2NhbGVyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHJlc2NhbGVyX21pcHMzMi5jCitDT01NT05fU09VUkNFUyArPSByZXNjYWxlcl9taXBzX2RzcF9yMi5jCitDT01NT05fU09VUkNFUyArPSB1cHNhbXBsaW5nLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHVwc2FtcGxpbmdfbWlwc19kc3BfcjIuYworQ09NTU9OX1NPVVJDRVMgKz0geXV2LmMKK0NPTU1PTl9TT1VSQ0VTICs9IHl1di5oCitDT01NT05fU09VUkNFUyArPSB5dXZfbWlwczMyLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHl1dl9taXBzX2RzcF9yMi5jCisKK0VOQ19TT1VSQ0VTID0KK0VOQ19TT1VSQ0VTICs9IGNvc3QuYworRU5DX1NPVVJDRVMgKz0gY29zdF9taXBzMzIuYworRU5DX1NPVVJDRVMgKz0gY29zdF9taXBzX2RzcF9yMi5jCitFTkNfU09VUkNFUyArPSBlbmMuYworRU5DX1NPVVJDRVMgKz0gZW5jX21pcHMzMi5jCitFTkNfU09VUkNFUyArPSBlbmNfbWlwc19kc3BfcjIuYworRU5DX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jLmMKK0VOQ19TT1VSQ0VTICs9IGxvc3NsZXNzX2VuY19taXBzMzIuYworRU5DX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMKK0VOQ19TT1VSQ0VTICs9IHNzaW0uYworCitsaWJ3ZWJwZHNwX2F2eDJfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwX2F2eDJfbGFfU09VUkNFUyArPSBlbmNfYXZ4Mi5jCitsaWJ3ZWJwZHNwX2F2eDJfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwX2F2eDJfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoQVZYMl9GTEFHUykKKworbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfU09VUkNFUyArPSBhbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlNDFfbGFfU09VUkNFUyArPSBkZWNfc3NlNDEuYworbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9TT1VSQ0VTICs9IHVwc2FtcGxpbmdfc3NlNDEuYworbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9TT1VSQ0VTICs9IHl1dl9zc2U0MS5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTQxX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcGRlY29kZV9zc2U0MV9sYV9DRkxBR1MgPSAkKEFNX0NGTEFHUykgJChTU0U0MV9GTEFHUykKKworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IGRlY19zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IGZpbHRlcnNfc3NlMi5jCitsaWJ3ZWJwZHNwZGVjb2RlX3NzZTJfbGFfU09VUkNFUyArPSBsb3NzbGVzc19zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IHJlc2NhbGVyX3NzZTIuYworbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX1NPVVJDRVMgKz0gdXBzYW1wbGluZ19zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9TT1VSQ0VTICs9IHl1dl9zc2UyLmMKK2xpYndlYnBkc3BkZWNvZGVfc3NlMl9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9zc2UyX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcGRlY29kZV9zc2UyX2xhX0NGTEFHUyA9ICQobGlid2VicGRzcF9zc2UyX2xhX0NGTEFHUykKKworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gYWxwaGFfcHJvY2Vzc2luZ19uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IGRlY19uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IGZpbHRlcnNfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSBsb3NzbGVzc19uZW9uLmMKK2xpYndlYnBkc3BkZWNvZGVfbmVvbl9sYV9TT1VSQ0VTICs9IG5lb24uaAorbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0gcmVzY2FsZXJfbmVvbi5jCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfU09VUkNFUyArPSB1cHNhbXBsaW5nX25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX1NPVVJDRVMgKz0geXV2X25lb24uYworbGlid2VicGRzcGRlY29kZV9uZW9uX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX25lb25fbGFfQ1BQRkxBR1MpCitsaWJ3ZWJwZHNwZGVjb2RlX25lb25fbGFfQ0ZMQUdTID0gJChsaWJ3ZWJwZHNwX25lb25fbGFfQ0ZMQUdTKQorCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gZGVjX21zYS5jCitsaWJ3ZWJwZHNwZGVjb2RlX21zYV9sYV9TT1VSQ0VTICs9IGZpbHRlcnNfbXNhLmMKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfbXNhLmMKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gbXNhX21hY3JvLmgKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gcmVzY2FsZXJfbXNhLmMKK2xpYndlYnBkc3BkZWNvZGVfbXNhX2xhX1NPVVJDRVMgKz0gdXBzYW1wbGluZ19tc2EuYworbGlid2VicGRzcGRlY29kZV9tc2FfbGFfQ1BQRkxBR1MgPSAkKGxpYndlYnBkc3BfbXNhX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcGRlY29kZV9tc2FfbGFfQ0ZMQUdTID0gJChsaWJ3ZWJwZHNwX21zYV9sYV9DRkxBR1MpCisKK2xpYndlYnBkc3Bfc3NlMl9sYV9TT1VSQ0VTID0KK2xpYndlYnBkc3Bfc3NlMl9sYV9TT1VSQ0VTICs9IGNvc3Rfc3NlMi5jCitsaWJ3ZWJwZHNwX3NzZTJfbGFfU09VUkNFUyArPSBlbmNfc3NlMi5jCitsaWJ3ZWJwZHNwX3NzZTJfbGFfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfc3NlMi5jCitsaWJ3ZWJwZHNwX3NzZTJfbGFfU09VUkNFUyArPSBzc2ltX3NzZTIuYworbGlid2VicGRzcF9zc2UyX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcF9zc2UyX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKFNTRTJfRkxBR1MpCitsaWJ3ZWJwZHNwX3NzZTJfbGFfTElCQUREID0gbGlid2VicGRzcGRlY29kZV9zc2UyLmxhCisKK2xpYndlYnBkc3Bfc3NlNDFfbGFfU09VUkNFUyA9CitsaWJ3ZWJwZHNwX3NzZTQxX2xhX1NPVVJDRVMgKz0gZW5jX3NzZTQxLmMKK2xpYndlYnBkc3Bfc3NlNDFfbGFfU09VUkNFUyArPSBsb3NzbGVzc19lbmNfc3NlNDEuYworbGlid2VicGRzcF9zc2U0MV9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3Bfc3NlNDFfbGFfQ0ZMQUdTID0gJChBTV9DRkxBR1MpICQoU1NFNDFfRkxBR1MpCitsaWJ3ZWJwZHNwX3NzZTQxX2xhX0xJQkFERCA9IGxpYndlYnBkc3BkZWNvZGVfc3NlNDEubGEKKworbGlid2VicGRzcF9uZW9uX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcF9uZW9uX2xhX1NPVVJDRVMgKz0gZW5jX25lb24uYworbGlid2VicGRzcF9uZW9uX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX25lb24uYworbGlid2VicGRzcF9uZW9uX2xhX0NQUEZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTKQorbGlid2VicGRzcF9uZW9uX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKSAkKE5FT05fRkxBR1MpCitsaWJ3ZWJwZHNwX25lb25fbGFfTElCQUREID0gbGlid2VicGRzcGRlY29kZV9uZW9uLmxhCisKK2xpYndlYnBkc3BfbXNhX2xhX1NPVVJDRVMgPQorbGlid2VicGRzcF9tc2FfbGFfU09VUkNFUyArPSBlbmNfbXNhLmMKK2xpYndlYnBkc3BfbXNhX2xhX1NPVVJDRVMgKz0gbG9zc2xlc3NfZW5jX21zYS5jCitsaWJ3ZWJwZHNwX21zYV9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKK2xpYndlYnBkc3BfbXNhX2xhX0NGTEFHUyA9ICQoQU1fQ0ZMQUdTKQorbGlid2VicGRzcF9tc2FfbGFfTElCQUREID0gbGlid2VicGRzcGRlY29kZV9tc2EubGEKKworbGlid2VicGRzcF9sYV9TT1VSQ0VTID0gJChDT01NT05fU09VUkNFUykgJChFTkNfU09VUkNFUykKKworbm9pbnN0X0hFQURFUlMgPQorbm9pbnN0X0hFQURFUlMgKz0gLi4vZGVjL3ZwOF9kZWMuaAorbm9pbnN0X0hFQURFUlMgKz0gLi4vd2VicC9kZWNvZGUuaAorCitsaWJ3ZWJwZHNwX2xhX0NQUEZMQUdTID0KK2xpYndlYnBkc3BfbGFfQ1BQRkxBR1MgKz0gJChBTV9DUFBGTEFHUykKK2xpYndlYnBkc3BfbGFfQ1BQRkxBR1MgKz0gJChVU0VfU1dBUF8xNkJJVF9DU1ApCitsaWJ3ZWJwZHNwX2xhX0xERkxBR1MgPSAtbG0KK2xpYndlYnBkc3BfbGFfTElCQUREID0KK2xpYndlYnBkc3BfbGFfTElCQUREICs9IGxpYndlYnBkc3BfYXZ4Mi5sYQorbGlid2VicGRzcF9sYV9MSUJBREQgKz0gbGlid2VicGRzcF9zc2UyLmxhCitsaWJ3ZWJwZHNwX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwX3NzZTQxLmxhCitsaWJ3ZWJwZHNwX2xhX0xJQkFERCArPSBsaWJ3ZWJwZHNwX25lb24ubGEKK2xpYndlYnBkc3BfbGFfTElCQUREICs9IGxpYndlYnBkc3BfbXNhLmxhCisKK2lmIEJVSUxEX0xJQldFQlBERUNPREVSCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfU09VUkNFUyA9ICQoQ09NTU9OX1NPVVJDRVMpCisKKyAgbGlid2VicGRzcGRlY29kZV9sYV9DUFBGTEFHUyA9ICQobGlid2VicGRzcF9sYV9DUFBGTEFHUykKKyAgbGlid2VicGRzcGRlY29kZV9sYV9MREZMQUdTID0gJChsaWJ3ZWJwZHNwX2xhX0xERkxBR1MpCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTElCQUREID0KKyAgbGlid2VicGRzcGRlY29kZV9sYV9MSUJBREQgKz0gbGlid2VicGRzcGRlY29kZV9zc2UyLmxhCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTElCQUREICs9IGxpYndlYnBkc3BkZWNvZGVfc3NlNDEubGEKKyAgbGlid2VicGRzcGRlY29kZV9sYV9MSUJBREQgKz0gbGlid2VicGRzcGRlY29kZV9uZW9uLmxhCisgIGxpYndlYnBkc3BkZWNvZGVfbGFfTElCQUREICs9IGxpYndlYnBkc3BkZWNvZGVfbXNhLmxhCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTlkMTM5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nLmMKQEAgLTAsMCArMSw0NzIgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbC4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworLy8gVGFibGVzIGNhbiBiZSBmYXN0ZXIgb24gc29tZSBwbGF0Zm9ybSBidXQgaW5jdXIgc29tZSBleHRyYSBiaW5hcnkgc2l6ZSAofjJrKS4KKyNpZiAhZGVmaW5lZChVU0VfVEFCTEVTX0ZPUl9BTFBIQV9NVUxUKQorI2RlZmluZSBVU0VfVEFCTEVTX0ZPUl9BTFBIQV9NVUxUIDAgICAvLyBBTFRFUk5BVEVfQ09ERQorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBNRklYIDI0ICAgIC8vIDI0Yml0IGZpeGVkLXBvaW50IGFyaXRobWV0aWMKKyNkZWZpbmUgSEFMRiAoKDF1IDw8IE1GSVgpID4+IDEpCisjZGVmaW5lIEtJTlZfMjU1ICgoMXUgPDwgTUZJWCkgLyAyNTV1KQorCitzdGF0aWMgdWludDMyX3QgTXVsdCh1aW50OF90IHgsIHVpbnQzMl90IG11bHQpIHsKKyAgY29uc3QgdWludDMyX3QgdiA9ICh4ICogbXVsdCArIEhBTEYpID4+IE1GSVg7CisgIGFzc2VydCh2IDw9IDI1NSk7ICAvLyA8LSAyNGJpdCBwcmVjaXNpb24gaXMgZW5vdWdoIHRvIGVuc3VyZSB0aGF0LgorICByZXR1cm4gdjsKK30KKworI2lmIChVU0VfVEFCTEVTX0ZPUl9BTFBIQV9NVUxUID09IDEpCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTXVsdFRhYmxlc1syXVsyNTZdID0geworICB7ICAgIC8vICgyNTV1IDw8IE1GSVgpIC8gYWxwaGEKKyAgICAweDAwMDAwMDAwLCAweGZmMDAwMDAwLCAweDdmODAwMDAwLCAweDU1MDAwMDAwLCAweDNmYzAwMDAwLCAweDMzMDAwMDAwLAorICAgIDB4MmE4MDAwMDAsIDB4MjQ2ZGI2ZGIsIDB4MWZlMDAwMDAsIDB4MWM1NTU1NTUsIDB4MTk4MDAwMDAsIDB4MTcyZThiYTIsCisgICAgMHgxNTQwMDAwMCwgMHgxMzlkODlkOCwgMHgxMjM2ZGI2ZCwgMHgxMTAwMDAwMCwgMHgwZmYwMDAwMCwgMHgwZjAwMDAwMCwKKyAgICAweDBlMmFhYWFhLCAweDBkNmJjYTFhLCAweDBjYzAwMDAwLCAweDBjMjQ5MjQ5LCAweDBiOTc0NWQxLCAweDBiMTY0MmM4LAorICAgIDB4MGFhMDAwMDAsIDB4MGEzMzMzMzMsIDB4MDljZWM0ZWMsIDB4MDk3MWM3MWMsIDB4MDkxYjZkYjYsIDB4MDhjYjA4ZDMsCisgICAgMHgwODgwMDAwMCwgMHgwODM5Y2U3MywgMHgwN2Y4MDAwMCwgMHgwN2JhMmU4YiwgMHgwNzgwMDAwMCwgMHgwNzQ5MjQ5MiwKKyAgICAweDA3MTU1NTU1LCAweDA2ZTQ1MzA2LCAweDA2YjVlNTBkLCAweDA2ODlkODlkLCAweDA2NjAwMDAwLCAweDA2MzgzMWYzLAorICAgIDB4MDYxMjQ5MjQsIDB4MDVlZTIzYjgsIDB4MDVjYmEyZTgsIDB4MDVhYWFhYWEsIDB4MDU4YjIxNjQsIDB4MDU2Y2VmYTgsCisgICAgMHgwNTUwMDAwMCwgMHgwNTM0M2ViMSwgMHgwNTE5OTk5OSwgMHgwNTAwMDAwMCwgMHgwNGU3NjI3NiwgMHgwNGNmYjJiNywKKyAgICAweDA0YjhlMzhlLCAweDA0YTJlOGJhLCAweDA0OGRiNmRiLCAweDA0Nzk0MzVlLCAweDA0NjU4NDY5LCAweDA0NTI3MGQwLAorICAgIDB4MDQ0MDAwMDAsIDB4MDQyZTI5ZjcsIDB4MDQxY2U3MzksIDB4MDQwYzMwYzMsIDB4MDNmYzAwMDAsIDB4MDNlYzRlYzQsCisgICAgMHgwM2RkMTc0NSwgMHgwM2NlNTQwZiwgMHgwM2MwMDAwMCwgMHgwM2IyMTY0MiwgMHgwM2E0OTI0OSwgMHgwMzk3NmZjNiwKKyAgICAweDAzOGFhYWFhLCAweDAzN2UzZjFmLCAweDAzNzIyOTgzLCAweDAzNjY2NjY2LCAweDAzNWFmMjg2LCAweDAzNGZjYWNlLAorICAgIDB4MDM0NGVjNGUsIDB4MDMzYTU0NDAsIDB4MDMzMDAwMDAsIDB4MDMyNWVkMDksIDB4MDMxYzE4ZjksIDB4MDMxMjgxOGEsCisgICAgMHgwMzA5MjQ5MiwgMHgwMzAwMDAwMCwgMHgwMmY3MTFkYywgMHgwMmVlNTg0NiwgMHgwMmU1ZDE3NCwgMHgwMmRkN2JhZiwKKyAgICAweDAyZDU1NTU1LCAweDAyY2Q1Y2Q1LCAweDAyYzU5MGIyLCAweDAyYmRlZjdiLCAweDAyYjY3N2Q0LCAweDAyYWYyODZiLAorICAgIDB4MDJhODAwMDAsIDB4MDJhMGZkNWMsIDB4MDI5YTFmNTgsIDB4MDI5MzY0ZDksIDB4MDI4Y2NjY2MsIDB4MDI4NjU2MmQsCisgICAgMHgwMjgwMDAwMCwgMHgwMjc5Yzk1MiwgMHgwMjczYjEzYiwgMHgwMjZkYjZkYiwgMHgwMjY3ZDk1YiwgMHgwMjYyMTdlYywKKyAgICAweDAyNWM3MWM3LCAweDAyNTZlNjJhLCAweDAyNTE3NDVkLCAweDAyNGMxYmFjLCAweDAyNDZkYjZkLCAweDAyNDFiMmY5LAorICAgIDB4MDIzY2ExYWYsIDB4MDIzN2E2ZjQsIDB4MDIzMmMyMzQsIDB4MDIyZGYyZGYsIDB4MDIyOTM4NjgsIDB4MDIyNDkyNDksCisgICAgMHgwMjIwMDAwMCwgMHgwMjFiODEwZSwgMHgwMjE3MTRmYiwgMHgwMjEyYmI1MSwgMHgwMjBlNzM5YywgMHgwMjBhM2Q3MCwKKyAgICAweDAyMDYxODYxLCAweDAyMDIwNDA4LCAweDAxZmUwMDAwLCAweDAxZmEwYmU4LCAweDAxZjYyNzYyLCAweDAxZjI1MjEzLAorICAgIDB4MDFlZThiYTIsIDB4MDFlYWQzYmEsIDB4MDFlNzJhMDcsIDB4MDFlMzhlMzgsIDB4MDFlMDAwMDAsIDB4MDFkYzdmMTAsCisgICAgMHgwMWQ5MGIyMSwgMHgwMWQ1YTNlOSwgMHgwMWQyNDkyNCwgMHgwMWNlZmE4ZCwgMHgwMWNiYjdlMywgMHgwMWM4ODBlNSwKKyAgICAweDAxYzU1NTU1LCAweDAxYzIzNGY3LCAweDAxYmYxZjhmLCAweDAxYmMxNGU1LCAweDAxYjkxNGMxLCAweDAxYjYxZWVkLAorICAgIDB4MDFiMzMzMzMsIDB4MDFiMDUxNjAsIDB4MDFhZDc5NDMsIDB4MDFhYWFhYWEsIDB4MDFhN2U1NjcsIDB4MDFhNTI5NGEsCisgICAgMHgwMWEyNzYyNywgMHgwMTlmY2JkMiwgMHgwMTlkMmEyMCwgMHgwMTlhOTBlNywgMHgwMTk4MDAwMCwgMHgwMTk1Nzc0MSwKKyAgICAweDAxOTJmNjg0LCAweDAxOTA3ZGE0LCAweDAxOGUwYzdjLCAweDAxOGJhMmU4LCAweDAxODk0MGM1LCAweDAxODZlNWYwLAorICAgIDB4MDE4NDkyNDksIDB4MDE4MjQ1YWUsIDB4MDE4MDAwMDAsIDB4MDE3ZGMxMWYsIDB4MDE3Yjg4ZWUsIDB4MDE3OTU3NGUsCisgICAgMHgwMTc3MmMyMywgMHgwMTc1MDc1MCwgMHgwMTcyZThiYSwgMHgwMTcwZDA0NSwgMHgwMTZlYmRkNywgMHgwMTZjYjE1NywKKyAgICAweDAxNmFhYWFhLCAweDAxNjhhOWI5LCAweDAxNjZhZTZhLCAweDAxNjRiOGE3LCAweDAxNjJjODU5LCAweDAxNjBkZDY3LAorICAgIDB4MDE1ZWY3YmQsIDB4MDE1ZDE3NDUsIDB4MDE1YjNiZWEsIDB4MDE1OTY1OTYsIDB4MDE1Nzk0MzUsIDB4MDE1NWM3YjQsCisgICAgMHgwMTU0MDAwMCwgMHgwMTUyM2QwMywgMHgwMTUwN2VhZSwgMHgwMTRlYzRlYywgMHgwMTRkMGZhYywgMHgwMTRiNWVkYywKKyAgICAweDAxNDliMjZjLCAweDAxNDgwYTRhLCAweDAxNDY2NjY2LCAweDAxNDRjNmFmLCAweDAxNDMyYjE2LCAweDAxNDE5MzhiLAorICAgIDB4MDE0MDAwMDAsIDB4MDEzZTcwNjMsIDB4MDEzY2U0YTksIDB4MDEzYjVjYzAsIDB4MDEzOWQ4OWQsIDB4MDEzODU4MzAsCisgICAgMHgwMTM2ZGI2ZCwgMHgwMTM1NjI0NiwgMHgwMTMzZWNhZCwgMHgwMTMyN2E5NywgMHgwMTMxMGJmNiwgMHgwMTJmYTBiZSwKKyAgICAweDAxMmUzOGUzLCAweDAxMmNkNDU5LCAweDAxMmI3MzE1LCAweDAxMmExNTBhLCAweDAxMjhiYTJlLCAweDAxMjc2Mjc2LAorICAgIDB4MDEyNjBkZDYsIDB4MDEyNGJjNDQsIDB4MDEyMzZkYjYsIDB4MDEyMjIyMjIsIDB4MDEyMGQ5N2MsIDB4MDExZjkzYmMsCisgICAgMHgwMTFlNTBkNywgMHgwMTFkMTBjNCwgMHgwMTFiZDM3YSwgMHgwMTFhOThlZiwgMHgwMTE5NjExYSwgMHgwMTE4MmJmMiwKKyAgICAweDAxMTZmOTZmLCAweDAxMTVjOTg4LCAweDAxMTQ5YzM0LCAweDAxMTM3MTZhLCAweDAxMTI0OTI0LCAweDAxMTEyMzU4LAorICAgIDB4MDExMDAwMDAsIDB4MDEwZWRmMTIsIDB4MDEwZGMwODcsIDB4MDEwY2E0NTgsIDB4MDEwYjhhN2QsIDB4MDEwYTcyZjAsCisgICAgMHgwMTA5NWRhOCwgMHgwMTA4NGE5ZiwgMHgwMTA3MzljZSwgMHgwMTA2MmIyZSwgMHgwMTA1MWViOCwgMHgwMTA0MTQ2NSwKKyAgICAweDAxMDMwYzMwLCAweDAxMDIwNjEyLCAweDAxMDEwMjA0LCAweDAxMDAwMDAwIH0sCisgIHsgICAvLyBhbHBoYSAqIEtJTlZfMjU1CisgICAgMHgwMDAwMDAwMCwgMHgwMDAxMDEwMSwgMHgwMDAyMDIwMiwgMHgwMDAzMDMwMywgMHgwMDA0MDQwNCwgMHgwMDA1MDUwNSwKKyAgICAweDAwMDYwNjA2LCAweDAwMDcwNzA3LCAweDAwMDgwODA4LCAweDAwMDkwOTA5LCAweDAwMGEwYTBhLCAweDAwMGIwYjBiLAorICAgIDB4MDAwYzBjMGMsIDB4MDAwZDBkMGQsIDB4MDAwZTBlMGUsIDB4MDAwZjBmMGYsIDB4MDAxMDEwMTAsIDB4MDAxMTExMTEsCisgICAgMHgwMDEyMTIxMiwgMHgwMDEzMTMxMywgMHgwMDE0MTQxNCwgMHgwMDE1MTUxNSwgMHgwMDE2MTYxNiwgMHgwMDE3MTcxNywKKyAgICAweDAwMTgxODE4LCAweDAwMTkxOTE5LCAweDAwMWExYTFhLCAweDAwMWIxYjFiLCAweDAwMWMxYzFjLCAweDAwMWQxZDFkLAorICAgIDB4MDAxZTFlMWUsIDB4MDAxZjFmMWYsIDB4MDAyMDIwMjAsIDB4MDAyMTIxMjEsIDB4MDAyMjIyMjIsIDB4MDAyMzIzMjMsCisgICAgMHgwMDI0MjQyNCwgMHgwMDI1MjUyNSwgMHgwMDI2MjYyNiwgMHgwMDI3MjcyNywgMHgwMDI4MjgyOCwgMHgwMDI5MjkyOSwKKyAgICAweDAwMmEyYTJhLCAweDAwMmIyYjJiLCAweDAwMmMyYzJjLCAweDAwMmQyZDJkLCAweDAwMmUyZTJlLCAweDAwMmYyZjJmLAorICAgIDB4MDAzMDMwMzAsIDB4MDAzMTMxMzEsIDB4MDAzMjMyMzIsIDB4MDAzMzMzMzMsIDB4MDAzNDM0MzQsIDB4MDAzNTM1MzUsCisgICAgMHgwMDM2MzYzNiwgMHgwMDM3MzczNywgMHgwMDM4MzgzOCwgMHgwMDM5MzkzOSwgMHgwMDNhM2EzYSwgMHgwMDNiM2IzYiwKKyAgICAweDAwM2MzYzNjLCAweDAwM2QzZDNkLCAweDAwM2UzZTNlLCAweDAwM2YzZjNmLCAweDAwNDA0MDQwLCAweDAwNDE0MTQxLAorICAgIDB4MDA0MjQyNDIsIDB4MDA0MzQzNDMsIDB4MDA0NDQ0NDQsIDB4MDA0NTQ1NDUsIDB4MDA0NjQ2NDYsIDB4MDA0NzQ3NDcsCisgICAgMHgwMDQ4NDg0OCwgMHgwMDQ5NDk0OSwgMHgwMDRhNGE0YSwgMHgwMDRiNGI0YiwgMHgwMDRjNGM0YywgMHgwMDRkNGQ0ZCwKKyAgICAweDAwNGU0ZTRlLCAweDAwNGY0ZjRmLCAweDAwNTA1MDUwLCAweDAwNTE1MTUxLCAweDAwNTI1MjUyLCAweDAwNTM1MzUzLAorICAgIDB4MDA1NDU0NTQsIDB4MDA1NTU1NTUsIDB4MDA1NjU2NTYsIDB4MDA1NzU3NTcsIDB4MDA1ODU4NTgsIDB4MDA1OTU5NTksCisgICAgMHgwMDVhNWE1YSwgMHgwMDViNWI1YiwgMHgwMDVjNWM1YywgMHgwMDVkNWQ1ZCwgMHgwMDVlNWU1ZSwgMHgwMDVmNWY1ZiwKKyAgICAweDAwNjA2MDYwLCAweDAwNjE2MTYxLCAweDAwNjI2MjYyLCAweDAwNjM2MzYzLCAweDAwNjQ2NDY0LCAweDAwNjU2NTY1LAorICAgIDB4MDA2NjY2NjYsIDB4MDA2NzY3NjcsIDB4MDA2ODY4NjgsIDB4MDA2OTY5NjksIDB4MDA2YTZhNmEsIDB4MDA2YjZiNmIsCisgICAgMHgwMDZjNmM2YywgMHgwMDZkNmQ2ZCwgMHgwMDZlNmU2ZSwgMHgwMDZmNmY2ZiwgMHgwMDcwNzA3MCwgMHgwMDcxNzE3MSwKKyAgICAweDAwNzI3MjcyLCAweDAwNzM3MzczLCAweDAwNzQ3NDc0LCAweDAwNzU3NTc1LCAweDAwNzY3Njc2LCAweDAwNzc3Nzc3LAorICAgIDB4MDA3ODc4NzgsIDB4MDA3OTc5NzksIDB4MDA3YTdhN2EsIDB4MDA3YjdiN2IsIDB4MDA3YzdjN2MsIDB4MDA3ZDdkN2QsCisgICAgMHgwMDdlN2U3ZSwgMHgwMDdmN2Y3ZiwgMHgwMDgwODA4MCwgMHgwMDgxODE4MSwgMHgwMDgyODI4MiwgMHgwMDgzODM4MywKKyAgICAweDAwODQ4NDg0LCAweDAwODU4NTg1LCAweDAwODY4Njg2LCAweDAwODc4Nzg3LCAweDAwODg4ODg4LCAweDAwODk4OTg5LAorICAgIDB4MDA4YThhOGEsIDB4MDA4YjhiOGIsIDB4MDA4YzhjOGMsIDB4MDA4ZDhkOGQsIDB4MDA4ZThlOGUsIDB4MDA4ZjhmOGYsCisgICAgMHgwMDkwOTA5MCwgMHgwMDkxOTE5MSwgMHgwMDkyOTI5MiwgMHgwMDkzOTM5MywgMHgwMDk0OTQ5NCwgMHgwMDk1OTU5NSwKKyAgICAweDAwOTY5Njk2LCAweDAwOTc5Nzk3LCAweDAwOTg5ODk4LCAweDAwOTk5OTk5LCAweDAwOWE5YTlhLCAweDAwOWI5YjliLAorICAgIDB4MDA5YzljOWMsIDB4MDA5ZDlkOWQsIDB4MDA5ZTllOWUsIDB4MDA5ZjlmOWYsIDB4MDBhMGEwYTAsIDB4MDBhMWExYTEsCisgICAgMHgwMGEyYTJhMiwgMHgwMGEzYTNhMywgMHgwMGE0YTRhNCwgMHgwMGE1YTVhNSwgMHgwMGE2YTZhNiwgMHgwMGE3YTdhNywKKyAgICAweDAwYThhOGE4LCAweDAwYTlhOWE5LCAweDAwYWFhYWFhLCAweDAwYWJhYmFiLCAweDAwYWNhY2FjLCAweDAwYWRhZGFkLAorICAgIDB4MDBhZWFlYWUsIDB4MDBhZmFmYWYsIDB4MDBiMGIwYjAsIDB4MDBiMWIxYjEsIDB4MDBiMmIyYjIsIDB4MDBiM2IzYjMsCisgICAgMHgwMGI0YjRiNCwgMHgwMGI1YjViNSwgMHgwMGI2YjZiNiwgMHgwMGI3YjdiNywgMHgwMGI4YjhiOCwgMHgwMGI5YjliOSwKKyAgICAweDAwYmFiYWJhLCAweDAwYmJiYmJiLCAweDAwYmNiY2JjLCAweDAwYmRiZGJkLCAweDAwYmViZWJlLCAweDAwYmZiZmJmLAorICAgIDB4MDBjMGMwYzAsIDB4MDBjMWMxYzEsIDB4MDBjMmMyYzIsIDB4MDBjM2MzYzMsIDB4MDBjNGM0YzQsIDB4MDBjNWM1YzUsCisgICAgMHgwMGM2YzZjNiwgMHgwMGM3YzdjNywgMHgwMGM4YzhjOCwgMHgwMGM5YzljOSwgMHgwMGNhY2FjYSwgMHgwMGNiY2JjYiwKKyAgICAweDAwY2NjY2NjLCAweDAwY2RjZGNkLCAweDAwY2VjZWNlLCAweDAwY2ZjZmNmLCAweDAwZDBkMGQwLCAweDAwZDFkMWQxLAorICAgIDB4MDBkMmQyZDIsIDB4MDBkM2QzZDMsIDB4MDBkNGQ0ZDQsIDB4MDBkNWQ1ZDUsIDB4MDBkNmQ2ZDYsIDB4MDBkN2Q3ZDcsCisgICAgMHgwMGQ4ZDhkOCwgMHgwMGQ5ZDlkOSwgMHgwMGRhZGFkYSwgMHgwMGRiZGJkYiwgMHgwMGRjZGNkYywgMHgwMGRkZGRkZCwKKyAgICAweDAwZGVkZWRlLCAweDAwZGZkZmRmLCAweDAwZTBlMGUwLCAweDAwZTFlMWUxLCAweDAwZTJlMmUyLCAweDAwZTNlM2UzLAorICAgIDB4MDBlNGU0ZTQsIDB4MDBlNWU1ZTUsIDB4MDBlNmU2ZTYsIDB4MDBlN2U3ZTcsIDB4MDBlOGU4ZTgsIDB4MDBlOWU5ZTksCisgICAgMHgwMGVhZWFlYSwgMHgwMGViZWJlYiwgMHgwMGVjZWNlYywgMHgwMGVkZWRlZCwgMHgwMGVlZWVlZSwgMHgwMGVmZWZlZiwKKyAgICAweDAwZjBmMGYwLCAweDAwZjFmMWYxLCAweDAwZjJmMmYyLCAweDAwZjNmM2YzLCAweDAwZjRmNGY0LCAweDAwZjVmNWY1LAorICAgIDB4MDBmNmY2ZjYsIDB4MDBmN2Y3ZjcsIDB4MDBmOGY4ZjgsIDB4MDBmOWY5ZjksIDB4MDBmYWZhZmEsIDB4MDBmYmZiZmIsCisgICAgMHgwMGZjZmNmYywgMHgwMGZkZmRmZCwgMHgwMGZlZmVmZSwgMHgwMGZmZmZmZiB9Cit9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0U2NhbGUodWludDMyX3QgYSwgaW50IGludmVyc2UpIHsKKyAgcmV0dXJuIGtNdWx0VGFibGVzWyFpbnZlcnNlXVthXTsKK30KKworI2Vsc2UKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldFNjYWxlKHVpbnQzMl90IGEsIGludCBpbnZlcnNlKSB7CisgIHJldHVybiBpbnZlcnNlID8gKDI1NXUgPDwgTUZJWCkgLyBhIDogYSAqIEtJTlZfMjU1OworfQorCisjZW5kaWYgIC8vIFVTRV9UQUJMRVNfRk9SX0FMUEhBX01VTFQKKwordm9pZCBXZWJQTXVsdEFSR0JSb3dfQyh1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBwdHJbeF07CisgICAgaWYgKGFyZ2IgPCAweGZmMDAwMDAwdSkgeyAgICAgIC8vIGFscGhhIDwgMjU1CisgICAgICBpZiAoYXJnYiA8PSAweDAwZmZmZmZmdSkgeyAgIC8vIGFscGhhID09IDAKKyAgICAgICAgcHRyW3hdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhID0gKGFyZ2IgPj4gMjQpICYgMHhmZjsKKyAgICAgICAgY29uc3QgdWludDMyX3Qgc2NhbGUgPSBHZXRTY2FsZShhbHBoYSwgaW52ZXJzZSk7CisgICAgICAgIHVpbnQzMl90IG91dCA9IGFyZ2IgJiAweGZmMDAwMDAwdTsKKyAgICAgICAgb3V0IHw9IE11bHQoYXJnYiA+PiAgMCwgc2NhbGUpIDw8ICAwOworICAgICAgICBvdXQgfD0gTXVsdChhcmdiID4+ICA4LCBzY2FsZSkgPDwgIDg7CisgICAgICAgIG91dCB8PSBNdWx0KGFyZ2IgPj4gMTYsIHNjYWxlKSA8PCAxNjsKKyAgICAgICAgcHRyW3hdID0gb3V0OworICAgICAgfQorICAgIH0KKyAgfQorfQorCit2b2lkIFdlYlBNdWx0Um93X0ModWludDhfdCogY29uc3QgcHRyLCBjb25zdCB1aW50OF90KiBjb25zdCBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhbHBoYVt4XTsKKyAgICBpZiAoYSAhPSAyNTUpIHsKKyAgICAgIGlmIChhID09IDApIHsKKyAgICAgICAgcHRyW3hdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gR2V0U2NhbGUoYSwgaW52ZXJzZSk7CisgICAgICAgIHB0clt4XSA9IE11bHQocHRyW3hdLCBzY2FsZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBLSU5WXzI1NQorI3VuZGVmIEhBTEYKKyN1bmRlZiBNRklYCisKK3ZvaWQgKCpXZWJQTXVsdEFSR0JSb3cpKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpOwordm9pZCAoKldlYlBNdWx0Um93KSh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBpbnZlcnNlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdlbmVyaWMgcGVyLXBsYW5lIGNhbGxzCisKK3ZvaWQgV2ViUE11bHRBUkdCUm93cyh1aW50OF90KiBwdHIsIGludCBzdHJpZGUsIGludCB3aWR0aCwgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpbnZlcnNlKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgbnVtX3Jvd3M7ICsrbikgeworICAgIFdlYlBNdWx0QVJHQlJvdygodWludDMyX3QqKXB0ciwgd2lkdGgsIGludmVyc2UpOworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKwordm9pZCBXZWJQTXVsdFJvd3ModWludDhfdCogcHRyLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBudW1fcm93cywgaW50IGludmVyc2UpIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCBudW1fcm93czsgKytuKSB7CisgICAgV2ViUE11bHRSb3cocHRyLCBhbHBoYSwgd2lkdGgsIGludmVyc2UpOworICAgIHB0ciArPSBzdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVtdWx0aXBsaWVkIG1vZGVzCisKKy8vIG5vbiBkaXRoZXJlZC1tb2RlcworCisvLyAoeCAqIGEgKiAzMjg5NykgPj4gMjMgaXMgYml0LXdpc2UgZXF1aXZhbGVudCB0byAoaW50KSh4ICogYSAvIDI1NS4pCisvLyBmb3IgYWxsIDhiaXQgeCBvciBhLiBGb3IgYml0LXdpc2UgZXF1aXZhbGVuY2UgdG8gKGludCkoeCAqIGEgLyAyNTUuICsgLjUpLAorLy8gb25lIGNhbiB1c2UgaW5zdGVhZDogKHggKiBhICogNjU3OTMgKyAoMSA8PCAyMykpID4+IDI0CisjaWYgMSAgICAgLy8gKGludCkoeCAqIGEgLyAyNTUuKQorI2RlZmluZSBNVUxUSVBMSUVSKGEpICAgKChhKSAqIDMyODk3VSkKKyNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkpID4+IDIzKQorI2Vsc2UgICAgIC8vIChpbnQpKHggKiBhIC8gMjU1LiArIC41KQorI2RlZmluZSBNVUxUSVBMSUVSKGEpICgoYSkgKiA2NTc5M1UpCisjZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pICsgKDFVIDw8IDIzKSkgPj4gMjQpCisjZW5kaWYKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseV9DKHVpbnQ4X3QqIHJnYmEsIGludCBhbHBoYV9maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworICB3aGlsZSAoaC0tID4gMCkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHJnYiA9IHJnYmEgKyAoYWxwaGFfZmlyc3QgPyAxIDogMCk7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhbHBoYVs0ICogaV07CisgICAgICBpZiAoYSAhPSAweGZmKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG11bHQgPSBNVUxUSVBMSUVSKGEpOworICAgICAgICByZ2JbNCAqIGkgKyAwXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDBdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMV0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAxXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDJdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMl0sIG11bHQpOworICAgICAgfQorICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisjdW5kZWYgTVVMVElQTElFUgorI3VuZGVmIFBSRU1VTFRJUExZCisKKy8vIHJnYkE0NDQ0CisKKyNkZWZpbmUgTVVMVElQTElFUihhKSAgKChhKSAqIDB4MTExMSkgICAgLy8gMHgxMTExIH49ICgxIDw8IDE2KSAvIDE1CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGRpdGhlcl9oaSh1aW50OF90IHgpIHsKKyAgcmV0dXJuICh4ICYgMHhmMCkgfCAoeCA+PiA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgZGl0aGVyX2xvKHVpbnQ4X3QgeCkgeworICByZXR1cm4gKHggJiAweDBmKSB8ICh4IDw8IDQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBtdWx0aXBseSh1aW50OF90IHgsIHVpbnQzMl90IG0pIHsKKyAgcmV0dXJuICh4ICogbSkgPj4gMTY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDRfQyh1aW50OF90KiByZ2JhNDQ0NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnX2J5dGVfcG9zIC8qIDAgb3IgMSAqLykgeworICB3aGlsZSAoaC0tID4gMCkgeworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3OyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHJnID0gcmdiYTQ0NDRbMiAqIGkgKyByZ19ieXRlX3Bvc107CisgICAgICBjb25zdCB1aW50MzJfdCBiYSA9IHJnYmE0NDQ0WzIgKiBpICsgKHJnX2J5dGVfcG9zIF4gMSldOworICAgICAgY29uc3QgdWludDhfdCBhID0gYmEgJiAweDBmOworICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICBjb25zdCB1aW50OF90IHIgPSBtdWx0aXBseShkaXRoZXJfaGkocmcpLCBtdWx0KTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IG11bHRpcGx5KGRpdGhlcl9sbyhyZyksIG11bHQpOworICAgICAgY29uc3QgdWludDhfdCBiID0gbXVsdGlwbHkoZGl0aGVyX2hpKGJhKSwgbXVsdCk7CisgICAgICByZ2JhNDQ0NFsyICogaSArIHJnX2J5dGVfcG9zXSA9IChyICYgMHhmMCkgfCAoKGcgPj4gNCkgJiAweDBmKTsKKyAgICAgIHJnYmE0NDQ0WzIgKiBpICsgKHJnX2J5dGVfcG9zIF4gMSldID0gKGIgJiAweGYwKSB8IGE7CisgICAgfQorICAgIHJnYmE0NDQ0ICs9IHN0cmlkZTsKKyAgfQorfQorI3VuZGVmIE1VTFRJUExJRVIKKworc3RhdGljIHZvaWQgQXBwbHlBbHBoYU11bHRpcGx5XzE2Yl9DKHVpbnQ4X3QqIHJnYmE0NDQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCwgaW50IHN0cmlkZSkgeworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDRfQyhyZ2JhNDQ0NCwgdywgaCwgc3RyaWRlLCAxKTsKKyNlbHNlCisgIEFwcGx5QWxwaGFNdWx0aXBseTQ0NDRfQyhyZ2JhNDQ0NCwgdywgaCwgc3RyaWRlLCAwKTsKKyNlbmRpZgorfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIGludCBEaXNwYXRjaEFscGhhX0MoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweGZmOworICBpbnQgaSwgajsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgYWxwaGFfdmFsdWUgPSBhbHBoYVtpXTsKKyAgICAgIGRzdFs0ICogaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorCisgIHJldHVybiAoYWxwaGFfbWFzayAhPSAweGZmKTsKK30KKworc3RhdGljIHZvaWQgRGlzcGF0Y2hBbHBoYVRvR3JlZW5fQyhjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICBpbnQgaSwgajsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGRzdFtpXSA9IGFscGhhW2ldIDw8IDg7ICAvLyBsZWF2ZSBBL1IvQiBjaGFubmVscyB6ZXJvJ2QuCisgICAgfQorICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgICBkc3QgKz0gZHN0X3N0cmlkZTsKKyAgfQorfQorCitzdGF0aWMgaW50IEV4dHJhY3RBbHBoYV9DKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSkgeworICB1aW50OF90IGFscGhhX21hc2sgPSAweGZmOworICBpbnQgaSwgajsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgeworICAgICAgY29uc3QgdWludDhfdCBhbHBoYV92YWx1ZSA9IGFyZ2JbNCAqIGldOworICAgICAgYWxwaGFbaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX21hc2sgJj0gYWxwaGFfdmFsdWU7CisgICAgfQorICAgIGFyZ2IgKz0gYXJnYl9zdHJpZGU7CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICB9CisgIHJldHVybiAoYWxwaGFfbWFzayA9PSAweGZmKTsKK30KKworc3RhdGljIHZvaWQgRXh0cmFjdEdyZWVuX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIGFscGhhLCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgYWxwaGFbaV0gPSBhcmdiW2ldID4+IDg7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBIYXNBbHBoYThiX0MoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKSB7CisgIHdoaWxlIChsZW5ndGgtLSA+IDApIGlmICgqc3JjKysgIT0gMHhmZikgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEhhc0FscGhhMzJiX0MoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKSB7CisgIGludCB4OworICBmb3IgKHggPSAwOyBsZW5ndGgtLSA+IDA7IHggKz0gNCkgaWYgKHNyY1t4XSAhPSAweGZmKSByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgY2hhbm5lbCBtYW5pcHVsYXRpb25zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTWFrZUFSR0IzMihpbnQgYSwgaW50IHIsIGludCBnLCBpbnQgYikgeworICByZXR1cm4gKCgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCitzdGF0aWMgdm9pZCBQYWNrQVJHQl9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIG91dFtpXSA9IE1ha2VBUkdCMzIoYVs0ICogaV0sIHJbNCAqIGldLCBnWzQgKiBpXSwgYls0ICogaV0pOworICB9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgUGFja1JHQl9DKGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsIGNvbnN0IHVpbnQ4X3QqIGIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGksIG9mZnNldCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIG91dFtpXSA9IE1ha2VBUkdCMzIoMHhmZiwgcltvZmZzZXRdLCBnW29mZnNldF0sIGJbb2Zmc2V0XSk7CisgICAgb2Zmc2V0ICs9IHN0ZXA7CisgIH0KK30KKwordm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHkpKHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCBpbnQpOwordm9pZCAoKldlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KSh1aW50OF90KiwgaW50LCBpbnQsIGludCk7CitpbnQgKCpXZWJQRGlzcGF0Y2hBbHBoYSkoY29uc3QgdWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQ4X3QqLCBpbnQpOwordm9pZCAoKldlYlBEaXNwYXRjaEFscGhhVG9HcmVlbikoY29uc3QgdWludDhfdCosIGludCwgaW50LCBpbnQsIHVpbnQzMl90KiwgaW50KTsKK2ludCAoKldlYlBFeHRyYWN0QWxwaGEpKGNvbnN0IHVpbnQ4X3QqLCBpbnQsIGludCwgaW50LCB1aW50OF90KiwgaW50KTsKK3ZvaWQgKCpXZWJQRXh0cmFjdEdyZWVuKShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogYWxwaGEsIGludCBzaXplKTsKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KK3ZvaWQgKCpXZWJQUGFja0FSR0IpKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIHIsIGNvbnN0IHVpbnQ4X3QqIGcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBiLCBpbnQsIHVpbnQzMl90Kik7CisjZW5kaWYKK3ZvaWQgKCpXZWJQUGFja1JHQikoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpOworCitpbnQgKCpXZWJQSGFzQWxwaGE4YikoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKTsKK2ludCAoKldlYlBIYXNBbHBoYTMyYikoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXQgZnVuY3Rpb24KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdORU9OKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcpIHsKKyAgV2ViUE11bHRBUkdCUm93ID0gV2ViUE11bHRBUkdCUm93X0M7CisgIFdlYlBNdWx0Um93ID0gV2ViUE11bHRSb3dfQzsKKyAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQgPSBBcHBseUFscGhhTXVsdGlwbHlfMTZiX0M7CisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyAgV2ViUFBhY2tBUkdCID0gUGFja0FSR0JfQzsKKyNlbmRpZgorICBXZWJQUGFja1JHQiA9IFBhY2tSR0JfQzsKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkgPSBBcHBseUFscGhhTXVsdGlwbHlfQzsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhX0M7CisgIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbiA9IERpc3BhdGNoQWxwaGFUb0dyZWVuX0M7CisgIFdlYlBFeHRyYWN0QWxwaGEgPSBFeHRyYWN0QWxwaGFfQzsKKyAgV2ViUEV4dHJhY3RHcmVlbiA9IEV4dHJhY3RHcmVlbl9DOworI2VuZGlmCisKKyAgV2ViUEhhc0FscGhhOGIgPSBIYXNBbHBoYThiX0M7CisgIFdlYlBIYXNBbHBoYTMyYiA9IEhhc0FscGhhMzJiX0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMigpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKCk7CisgICAgICB9CisjZW5kaWYKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdORU9OKCk7CisgIH0KKyNlbmRpZgorCisgIGFzc2VydChXZWJQTXVsdEFSR0JSb3cgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQTXVsdFJvdyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBBcHBseUFscGhhTXVsdGlwbHkgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQXBwbHlBbHBoYU11bHRpcGx5NDQ0NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBEaXNwYXRjaEFscGhhICE9IE5VTEwpOworICBhc3NlcnQoV2ViUERpc3BhdGNoQWxwaGFUb0dyZWVuICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEV4dHJhY3RBbHBoYSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBFeHRyYWN0R3JlZW4gIT0gTlVMTCk7CisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisgIGFzc2VydChXZWJQUGFja0FSR0IgIT0gTlVMTCk7CisjZW5kaWYKKyAgYXNzZXJ0KFdlYlBQYWNrUkdCICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEhhc0FscGhhOGIgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQSGFzQWxwaGEzMmIgIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTBlODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDIyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLgorLy8KKy8vIEF1dGhvcihzKTogQnJhbmltaXIgVmFzaWMgKGJyYW5pbWlyLnZhc2ljQGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworc3RhdGljIGludCBEaXNwYXRjaEFscGhhX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweGZmZmZmZmZmOworICBpbnQgaSwgaiwgdGVtcDA7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgdWludDhfdCogcGRzdCA9IGRzdDsKKyAgICBjb25zdCB1aW50OF90KiBwYWxwaGEgPSBhbHBoYTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHdpZHRoID4+IDIpOyArK2kpIHsKKyAgICAgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgInVsdyAgICAlW3RlbXAwXSwgICAgICAwKCVbcGFscGhhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3BhbHBoYV0sICAgICAlW3BhbHBoYV0sICAgICA0ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3Bkc3RdLCAgICAgICAlW3Bkc3RdLCAgICAgICAxNiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAlW3RlbXAxXSwgICAgICAlW3RlbXAwXSwgICAgICA4ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAlW3RlbXAyXSwgICAgICAlW3RlbXAwXSwgICAgICAxNiAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNybCAgICAlW3RlbXAzXSwgICAgICAlW3RlbXAwXSwgICAgICAyNCAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCAlW3RlbXAwXSAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAlW3RlbXAwXSwgICAgICAtMTYoJVtwZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAlW3RlbXAxXSwgICAgICAtMTIoJVtwZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAlW3RlbXAyXSwgICAgICAtOCglW3Bkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAlW3RlbXAzXSwgICAgICAtNCglW3Bkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtwYWxwaGFdIityIihwYWxwaGEpLCBbcGRzdF0iK3IiKHBkc3QpLAorICAgICAgICAgIFthbHBoYV9tYXNrXSIrciIoYWxwaGFfbWFzaykKKyAgICAgICAgOgorICAgICAgICA6ICJtZW1vcnkiCisgICAgICApOworICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPCAod2lkdGggJiAzKTsgKytpKSB7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxidSAgICAlW3RlbXAwXSwgICAgICAwKCVbcGFscGhhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3BhbHBoYV0sICAgICAlW3BhbHBoYV0sICAgICAxICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAlW3RlbXAwXSwgICAgICAwKCVbcGRzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCAlW3RlbXAwXSAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAlW3Bkc3RdLCAgICAgICAlW3Bkc3RdLCAgICAgICA0ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbcGFscGhhXSIrciIocGFscGhhKSwgW3Bkc3RdIityIihwZHN0KSwKKyAgICAgICAgICBbYWxwaGFfbWFza10iK3IiKGFscGhhX21hc2spCisgICAgICAgIDoKKyAgICAgICAgOiAibWVtb3J5IgorICAgICAgKTsKKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImV4dCAgICAlW3RlbXAwXSwgICAgICAlW2FscGhhX21hc2tdLCAwLCAxNiAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCAxNiAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFuZCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAlW3RlbXAwXSwgICAgICAlW2FscGhhX21hc2tdLCAwLCA4ICAgICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCA4ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFuZCAgICAlW2FscGhhX21hc2tdLCAlW2FscGhhX21hc2tdLCAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbYWxwaGFfbWFza10iK3IiKGFscGhhX21hc2spCisgICAgOgorICApOworCisgIHJldHVybiAoYWxwaGFfbWFzayAhPSAweGZmKTsKK30KKworc3RhdGljIHZvaWQgTXVsdEFSR0JSb3dfTUlQU2RzcFIyKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSkgeworICBpbnQgeDsKKyAgY29uc3QgdWludDMyX3QgY18wMGZmZmZmZiA9IDB4MDBmZmZmZmZ1OworICBjb25zdCB1aW50MzJfdCBjX2ZmMDAwMDAwID0gMHhmZjAwMDAwMHU7CisgIGNvbnN0IHVpbnQzMl90IGNfODAwMDAwMCAgPSAweDAwODAwMDAwdTsKKyAgY29uc3QgdWludDMyX3QgY184MDAwMDgwICA9IDB4MDA4MDAwODB1OworICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBwdHJbeF07CisgICAgaWYgKGFyZ2IgPCAweGZmMDAwMDAwdSkgeyAgICAgIC8vIGFscGhhIDwgMjU1CisgICAgICBpZiAoYXJnYiA8PSAweDAwZmZmZmZmdSkgeyAgIC8vIGFscGhhID09IDAKKyAgICAgICAgcHRyW3hdID0gMDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgYWxwaGE7CisgICAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAgICJzcmwgICAgICAgICAgJVthbHBoYV0sICAgJVthcmdiXSwgICAgICAgMjQgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbYWxwaGFdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImFuZCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgICAlW2NfMDBmZmZmZmZdICAgICBcblx0IgorICAgICAgICAgICJiZXF6ICAgICAgICAgJVtpbnZlcnNlXSwgMGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAiZGl2dSAgICAgICAgICR6ZXJvLCAgICAgICVbY19mZjAwMDAwMF0sICVbYWxwaGFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgIm1mbG8gICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgICAiYW5kaSAgICAgICAgICVbdGVtcDFdLCAgICVbYXJnYl0sICAgICAgIDB4ZmYgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImV4dCAgICAgICAgICAlW3RlbXAyXSwgICAlW2FyZ2JdLCAgICAgICA4LCAgICAgICAgICAgICA4ICBcblx0IgorICAgICAgICAgICJleHQgICAgICAgICAgJVt0ZW1wM10sICAgJVthcmdiXSwgICAgICAgMTYsICAgICAgICAgICAgOCAgXG5cdCIKKyAgICAgICAgICAibXVsICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICVbdGVtcDBdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgIm11bCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgICAlW3RlbXAwXSAgICAgICAgICBcblx0IgorICAgICAgICAgICJtdWwgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgJVt0ZW1wMF0gICAgICAgICAgXG5cdCIKKyAgICAgICAgICAicHJlY3JxLnBoLncgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICAgICVbdGVtcDFdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgImFkZHUgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICAlW2NfODAwMDAwMF0gICAgICBcblx0IgorICAgICAgICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgJVtjXzgwMDAwODBdICAgICAgXG5cdCIKKyAgICAgICAgICAicHJlY3JxLnBoLncgICVbdGVtcDNdLCAgICVbYXJnYl0sICAgICAgICVbdGVtcDNdICAgICAgICAgIFxuXHQiCisgICAgICAgICAgInByZWNycS5xYi5waCAlW3RlbXAxXSwgICAlW3RlbXAzXSwgICAgICAlW3RlbXAxXSAgICAgICAgICBcblx0IgorICAgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgICAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFthbHBoYV0iPSZyIihhbHBoYSkKKyAgICAgICAgICA6IFtpbnZlcnNlXSJyIihpbnZlcnNlKSwgW2NfMDBmZmZmZmZdInIiKGNfMDBmZmZmZmYpLAorICAgICAgICAgICAgW2NfODAwMDAwMF0iciIoY184MDAwMDAwKSwgW2NfODAwMDA4MF0iciIoY184MDAwMDgwKSwKKyAgICAgICAgICAgIFtjX2ZmMDAwMDAwXSJyIihjX2ZmMDAwMDAwKSwgW2FyZ2JdInIiKGFyZ2IpCisgICAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICAgICApOworICAgICAgICBwdHJbeF0gPSB0ZW1wMTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorc3RhdGljIHZvaWQgUGFja0FSR0JfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgb2Zmc2V0OworICBjb25zdCBpbnQgcmVzdCA9IGxlbiAmIDE7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBsb29wX2VuZCA9IG91dCArIGxlbiAtIHJlc3Q7CisgIGNvbnN0IGludCBzdGVwID0gNDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInhvciAgICAgICAgICAlW29mZnNldF0sICAgJVtvZmZzZXRdLCAlW29mZnNldF0gICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbbG9vcF9lbmRdLCAlW291dF0sICAgIDBmICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAwXSwgICAgJVtvZmZzZXRdKCVbYV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDFdLCAgICAlW29mZnNldF0oJVtyXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMl0sICAgICVbb2Zmc2V0XSglW2ddKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAzXSwgICAgJVtvZmZzZXRdKCVbYl0pICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAwXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAlW291dF0sICAgICAgJVtvdXRdLCAgICA0ICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICVbdGVtcDNdICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbb3V0XSkgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW29mZnNldF0sICAgJVtvZmZzZXRdLCAlW3N0ZXBdICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAgICVbbG9vcF9lbmRdLCAlW291dF0sICAgIDJiICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgICAlW3Jlc3RdLCAgICAgJHplcm8sICAgICAxZiAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDBdLCAgICAlW29mZnNldF0oJVthXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMV0sICAgICVbb2Zmc2V0XSglW3JdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAyXSwgICAgJVtvZmZzZXRdKCVbZ10pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDNdLCAgICAlW29mZnNldF0oJVtiXSkgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdLCAgMTYsICAgICAxNiAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICVbdGVtcDNdICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtvdXRdKSAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbb2Zmc2V0XSI9JnIiKG9mZnNldCksIFtvdXRdIismciIob3V0KQorICAgIDogW2FdInIiKGEpLCBbcl0iciIociksIFtnXSJyIihnKSwgW2JdInIiKGIpLCBbc3RlcF0iciIoc3RlcCksCisgICAgICBbbG9vcF9lbmRdInIiKGxvb3BfZW5kKSwgW3Jlc3RdInIiKHJlc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorI2VuZGlmICAvLyBXT1JEU19CSUdFTkRJQU4KKworc3RhdGljIHZvaWQgUGFja1JHQl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogciwgY29uc3QgdWludDhfdCogZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGIsIGludCBsZW4sIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgb2Zmc2V0OworICBjb25zdCBpbnQgcmVzdCA9IGxlbiAmIDE7CisgIGNvbnN0IGludCBhID0gMHhmZjsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGxvb3BfZW5kID0gb3V0ICsgbGVuIC0gcmVzdDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInhvciAgICAgICAgICAlW29mZnNldF0sICAgJVtvZmZzZXRdLCAlW29mZnNldF0gICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICVbbG9vcF9lbmRdLCAlW291dF0sICAgIDBmICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAwXSwgICAgJVtvZmZzZXRdKCVbcl0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDFdLCAgICAlW29mZnNldF0oJVtnXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMl0sICAgICVbb2Zmc2V0XSglW2JdKSAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAwXSwgICAgJVthXSwgICAgICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAxXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgJVtvdXRdLCAgICAgICVbb3V0XSwgICAgNCAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAlW3RlbXAyXSAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICVbdGVtcDBdLCAgICAtNCglW291dF0pICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVtvZmZzZXRdLCAgICVbb2Zmc2V0XSwgJVtzdGVwXSAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgICAlW2xvb3BfZW5kXSwgJVtvdXRdLCAgICAyYiAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgJVtyZXN0XSwgICAgICR6ZXJvLCAgICAgMWYgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAgICAlW3RlbXAwXSwgICAgJVtvZmZzZXRdKCVbcl0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICAgICVbdGVtcDFdLCAgICAlW29mZnNldF0oJVtnXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgICAgJVt0ZW1wMl0sICAgICVbb2Zmc2V0XSglW2JdKSAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAlW3RlbXAwXSwgICAgJVthXSwgICAgICAxNiwgICAgIDE2ICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAxXSwgIDE2LCAgICAgMTYgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgIFxuXHQiCisgICAgInN3ICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW291dF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFtvZmZzZXRdIj0mciIob2Zmc2V0KSwgW291dF0iKyZyIihvdXQpCisgICAgOiBbYV0iciIoYSksIFtyXSJyIihyKSwgW2ddInIiKGcpLCBbYl0iciIoYiksIFtzdGVwXSJyIihzdGVwKSwKKyAgICAgIFtsb29wX2VuZF0iciIobG9vcF9lbmQpLCBbcmVzdF0iciIocmVzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUERpc3BhdGNoQWxwaGEgPSBEaXNwYXRjaEFscGhhX01JUFNkc3BSMjsKKyAgV2ViUE11bHRBUkdCUm93ID0gTXVsdEFSR0JSb3dfTUlQU2RzcFIyOworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICBXZWJQUGFja0FSR0IgPSBQYWNrQVJHQl9NSVBTZHNwUjI7CisjZW5kaWYKKyAgV2ViUFBhY2tSR0IgPSBQYWNrUkdCX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNTU0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2FscGhhX3Byb2Nlc3NpbmdfbmVvbi5jCkBAIC0wLDAgKzEsMTkxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gVXRpbGl0aWVzIGZvciBwcm9jZXNzaW5nIHRyYW5zcGFyZW50IGNoYW5uZWwsIE5FT04gdmVyc2lvbi4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1VTFRJUExJRVIoYSkgKChhKSAqIDB4ODA4MSkKKyNkZWZpbmUgUFJFTVVMVElQTFkoeCwgbSkgKCgoeCkgKiAobSkpID4+IDIzKQorCisjZGVmaW5lIE1VTFRJUExZX0JZX0FMUEhBKFYsIEFMUEhBLCBPVEhFUikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4OF90IGFscGhhID0gKFYpLnZhbFsoQUxQSEEpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IHIxID0gdm11bGxfdTgoKFYpLnZhbFsxXSwgYWxwaGEpOyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgZzEgPSB2bXVsbF91OCgoVikudmFsWzJdLCBhbHBoYSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBiMSA9IHZtdWxsX3U4KChWKS52YWxbKE9USEVSKV0sIGFscGhhKTsgICAgICAgICAgICAgXAorICAvKiB3ZSB1c2U6IHYgLyAyNTUgPSAodiArIDEgKyAodiA+PiA4KSkgPj4gOCAqLyAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgcjIgPSB2c3JhcV9uX3UxNihyMSwgcjEsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBnMiA9IHZzcmFxX25fdTE2KGcxLCBnMSwgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGIyID0gdnNyYXFfbl91MTYoYjEsIGIxLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgcjMgPSB2YWRkcV91MTYocjIsIGtPbmUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDE2eDhfdCBnMyA9IHZhZGRxX3UxNihnMiwga09uZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IGIzID0gdmFkZHFfdTE2KGIyLCBrT25lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChWKS52YWxbMV0gPSB2c2hybl9uX3UxNihyMywgOCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKFYpLnZhbFsyXSA9IHZzaHJuX25fdTE2KGczLCA4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoVikudmFsWyhPVEhFUildID0gdnNocm5fbl91MTYoYjMsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHlfTkVPTih1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgY29uc3QgdWludDE2eDhfdCBrT25lID0gdmR1cHFfbl91MTYoMXUpOworICB3aGlsZSAoaC0tID4gMCkgeworICAgIHVpbnQzMl90KiBjb25zdCByZ2J4ID0gKHVpbnQzMl90KilyZ2JhOworICAgIGludCBpID0gMDsKKyAgICBpZiAoYWxwaGFfZmlyc3QpIHsKKyAgICAgIGZvciAoOyBpICsgOCA8PSB3OyBpICs9IDgpIHsKKyAgICAgICAgLy8gbG9hZCBhYWFhLi4ufHJycnIuLi58Z2dnZy4uLnxiYmJiLi4uCisgICAgICAgIHVpbnQ4eDh4NF90IFJHQlggPSB2bGQ0X3U4KChjb25zdCB1aW50OF90KikocmdieCArIGkpKTsKKyAgICAgICAgTVVMVElQTFlfQllfQUxQSEEoUkdCWCwgMCwgMyk7CisgICAgICAgIHZzdDRfdTgoKHVpbnQ4X3QqKShyZ2J4ICsgaSksIFJHQlgpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKDsgaSArIDggPD0gdzsgaSArPSA4KSB7CisgICAgICAgIHVpbnQ4eDh4NF90IFJHQlggPSB2bGQ0X3U4KChjb25zdCB1aW50OF90KikocmdieCArIGkpKTsKKyAgICAgICAgTVVMVElQTFlfQllfQUxQSEEoUkdCWCwgMywgMCk7CisgICAgICAgIHZzdDRfdTgoKHVpbnQ4X3QqKShyZ2J4ICsgaSksIFJHQlgpOworICAgICAgfQorICAgIH0KKyAgICAvLyBGaW5pc2ggd2l0aCBsZWZ0LW92ZXJzLgorICAgIGZvciAoOyBpIDwgdzsgKytpKSB7CisgICAgICB1aW50OF90KiBjb25zdCByZ2IgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMSA6IDApOworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEgPSByZ2JhICsgKGFscGhhX2ZpcnN0ID8gMCA6IDMpOworICAgICAgY29uc3QgdWludDMyX3QgYSA9IGFscGhhWzQgKiBpXTsKKyAgICAgIGlmIChhICE9IDB4ZmYpIHsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbXVsdCA9IE1VTFRJUExJRVIoYSk7CisgICAgICAgIHJnYls0ICogaSArIDBdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMF0sIG11bHQpOworICAgICAgICByZ2JbNCAqIGkgKyAxXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDFdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMl0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAyXSwgbXVsdCk7CisgICAgICB9CisgICAgfQorICAgIHJnYmEgKz0gc3RyaWRlOworICB9Cit9CisjdW5kZWYgTVVMVElQTFlfQllfQUxQSEEKKyN1bmRlZiBNVUxUSVBMSUVSCisjdW5kZWYgUFJFTVVMVElQTFkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBEaXNwYXRjaEFscGhhX05FT04oY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIHVpbnQzMl90IGFscGhhX21hc2sgPSAweGZmZmZmZmZmdTsKKyAgdWludDh4OF90IG1hc2s4ID0gdmR1cF9uX3U4KDB4ZmYpOworICB1aW50MzJfdCB0bXBbMl07CisgIGludCBpLCBqOworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICAvLyBXZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIGZpcnN0IG9yIGxhc3QgaW4gZHN0W10gKGRlcGVuZGluZyBvbiByZ2JBL0FyZ2IKKyAgICAvLyBtb2RlKS4gU28gd2UgbXVzdCBiZSBzdXJlIGRzdFs0KmkgKyA4IC0gMV0gaXMgd3JpdGFibGUgZm9yIHRoZSBzdG9yZS4KKyAgICAvLyBIZW5jZSB0aGUgdGVzdCB3aXRoICd3aWR0aCAtIDEnIGluc3RlYWQgb2YganVzdCAnd2lkdGgnLgorICAgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoIC0gMTsgaSArPSA4KSB7CisgICAgICB1aW50OHg4eDRfdCByZ2JYID0gdmxkNF91OCgoY29uc3QgdWludDhfdCopKGRzdCArIDQgKiBpKSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgYWxwaGFzID0gdmxkMV91OChhbHBoYSArIGkpOworICAgICAgcmdiWC52YWxbMF0gPSBhbHBoYXM7CisgICAgICB2c3Q0X3U4KCh1aW50OF90KikoZHN0ICsgNCAqIGkpLCByZ2JYKTsKKyAgICAgIG1hc2s4ID0gdmFuZF91OChtYXNrOCwgYWxwaGFzKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOworICAgICAgZHN0WzQgKiBpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYWxwaGEgKz0gYWxwaGFfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9CisgIHZzdDFfdTgoKHVpbnQ4X3QqKXRtcCwgbWFzazgpOworICBhbHBoYV9tYXNrICY9IHRtcFswXTsKKyAgYWxwaGFfbWFzayAmPSB0bXBbMV07CisgIHJldHVybiAoYWxwaGFfbWFzayAhPSAweGZmZmZmZmZmdSk7Cit9CisKK3N0YXRpYyB2b2lkIERpc3BhdGNoQWxwaGFUb0dyZWVuX05FT04oY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIHVpbnQ4eDh4NF90IGdyZWVuczsgICAvLyBsZWF2ZSBBL1IvQiBjaGFubmVscyB6ZXJvJ2QuCisgIGdyZWVucy52YWxbMF0gPSB2ZHVwX25fdTgoMCk7CisgIGdyZWVucy52YWxbMl0gPSB2ZHVwX25fdTgoMCk7CisgIGdyZWVucy52YWxbM10gPSB2ZHVwX25fdTgoMCk7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgpIHsKKyAgICAgIGdyZWVucy52YWxbMV0gPSB2bGQxX3U4KGFscGhhICsgaSk7CisgICAgICB2c3Q0X3U4KCh1aW50OF90KikoZHN0ICsgaSksIGdyZWVucyk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgZHN0W2ldID0gYWxwaGFbaV0gPDwgODsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KK30KKworc3RhdGljIGludCBFeHRyYWN0QWxwaGFfTkVPTihjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUpIHsKKyAgdWludDMyX3QgYWxwaGFfbWFzayA9IDB4ZmZmZmZmZmZ1OworICB1aW50OHg4X3QgbWFzazggPSB2ZHVwX25fdTgoMHhmZik7CisgIHVpbnQzMl90IHRtcFsyXTsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIC8vIFdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgZmlyc3Qgb3IgbGFzdCBpbiBkc3RbXSAoZGVwZW5kaW5nIG9uIHJnYkEvQXJnYgorICAgIC8vIG1vZGUpLiBTbyB3ZSBtdXN0IGJlIHN1cmUgZHN0WzQqaSArIDggLSAxXSBpcyB3cml0YWJsZSBmb3IgdGhlIHN0b3JlLgorICAgIC8vIEhlbmNlIHRoZSB0ZXN0IHdpdGggJ3dpZHRoIC0gMScgaW5zdGVhZCBvZiBqdXN0ICd3aWR0aCcuCisgICAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGggLSAxOyBpICs9IDgpIHsKKyAgICAgIGNvbnN0IHVpbnQ4eDh4NF90IHJnYlggPSB2bGQ0X3U4KChjb25zdCB1aW50OF90KikoYXJnYiArIDQgKiBpKSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgYWxwaGFzID0gcmdiWC52YWxbMF07CisgICAgICB2c3QxX3U4KCh1aW50OF90KikoYWxwaGEgKyBpKSwgYWxwaGFzKTsKKyAgICAgIG1hc2s4ID0gdmFuZF91OChtYXNrOCwgYWxwaGFzKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBhbHBoYVtpXSA9IGFyZ2JbNCAqIGldOworICAgICAgYWxwaGFfbWFzayAmPSBhbHBoYVtpXTsKKyAgICB9CisgICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KKyAgdnN0MV91OCgodWludDhfdCopdG1wLCBtYXNrOCk7CisgIGFscGhhX21hc2sgJj0gdG1wWzBdOworICBhbHBoYV9tYXNrICY9IHRtcFsxXTsKKyAgcmV0dXJuIChhbHBoYV9tYXNrID09IDB4ZmZmZmZmZmZ1KTsKK30KKworc3RhdGljIHZvaWQgRXh0cmFjdEdyZWVuX05FT04oY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBhbHBoYSwgaW50IHNpemUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyAxNiA8PSBzaXplOyBpICs9IDE2KSB7CisgICAgY29uc3QgdWludDh4MTZ4NF90IHJnYlggPSB2bGQ0cV91OCgoY29uc3QgdWludDhfdCopKGFyZ2IgKyBpKSk7CisgICAgY29uc3QgdWludDh4MTZfdCBncmVlbnMgPSByZ2JYLnZhbFsxXTsKKyAgICB2c3QxcV91OChhbHBoYSArIGksIGdyZWVucyk7CisgIH0KKyAgZm9yICg7IGkgPCBzaXplOyArK2kpIGFscGhhW2ldID0gKGFyZ2JbaV0gPj4gOCkgJiAweGZmOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ05FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ05FT04odm9pZCkgeworICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5ID0gQXBwbHlBbHBoYU11bHRpcGx5X05FT047CisgIFdlYlBEaXNwYXRjaEFscGhhID0gRGlzcGF0Y2hBbHBoYV9ORU9OOworICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4gPSBEaXNwYXRjaEFscGhhVG9HcmVlbl9ORU9OOworICBXZWJQRXh0cmFjdEFscGhhID0gRXh0cmFjdEFscGhhX05FT047CisgIFdlYlBFeHRyYWN0R3JlZW4gPSBFeHRyYWN0R3JlZW5fTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ05FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ODcwMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2UyLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbC4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBEaXNwYXRjaEFscGhhX1NTRTIoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlKSB7CisgIC8vIGFscGhhX2FuZCBzdG9yZXMgYW4gJ2FuZCcgb3BlcmF0aW9uIG9mIGFsbCB0aGUgYWxwaGFbXSB2YWx1ZXMuIFRoZSBmaW5hbAorICAvLyB2YWx1ZSBpcyBub3QgMHhmZiBpZiBhbnkgb2YgdGhlIGFscGhhW10gaXMgbm90IGVxdWFsIHRvIDB4ZmYuCisgIHVpbnQzMl90IGFscGhhX2FuZCA9IDB4ZmY7CisgIGludCBpLCBqOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHJnYl9tYXNrID0gX21tX3NldDFfZXBpMzIoMHhmZmZmZmYwMHUpOyAgLy8gdG8gcHJlc2VydmUgUkdCCisgIGNvbnN0IF9fbTEyOGkgYWxsXzB4ZmYgPSBfbW1fc2V0X2VwaTMyKDAsIDAsIH4wdSwgfjB1KTsKKyAgX19tMTI4aSBhbGxfYWxwaGFzID0gYWxsXzB4ZmY7CisKKyAgLy8gV2UgbXVzdCBiZSBhYmxlIHRvIGFjY2VzcyAzIGV4dHJhIGJ5dGVzIGFmdGVyIHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZQorICAvLyAnZHN0WzQgKiB3aWR0aCAtIDRdJywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIHRoZSBmaXJzdCBvciB0aGUKKyAgLy8gbGFzdCBieXRlIG9mIHRoZSBxdWFkcnVwbGV0LgorICBjb25zdCBpbnQgbGltaXQgPSAod2lkdGggLSAxKSAmIH43OworCisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIF9fbTEyOGkqIG91dCA9IChfX20xMjhpKilkc3Q7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpICs9IDgpIHsKKyAgICAgIC8vIGxvYWQgOCBhbHBoYSBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFscGhhW2ldKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fdW5wYWNrbG9fZXBpOChhMCwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGEyX2xvID0gX21tX3VucGFja2xvX2VwaTE2KGExLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoYTEsIHplcm8pOworICAgICAgLy8gbG9hZCA4IGRzdCBwaXhlbHMgKDMyIGJ5dGVzKQorICAgICAgY29uc3QgX19tMTI4aSBiMF9sbyA9IF9tbV9sb2FkdV9zaTEyOChvdXQgKyAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjBfaGkgPSBfbW1fbG9hZHVfc2kxMjgob3V0ICsgMSk7CisgICAgICAvLyBtYXNrIGRzdCBhbHBoYSB2YWx1ZXMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjFfbG8gPSBfbW1fYW5kX3NpMTI4KGIwX2xvLCByZ2JfbWFzayk7CisgICAgICBjb25zdCBfX20xMjhpIGIxX2hpID0gX21tX2FuZF9zaTEyOChiMF9oaSwgcmdiX21hc2spOworICAgICAgLy8gY29tYmluZQorICAgICAgY29uc3QgX19tMTI4aSBiMl9sbyA9IF9tbV9vcl9zaTEyOChiMV9sbywgYTJfbG8pOworICAgICAgY29uc3QgX19tMTI4aSBiMl9oaSA9IF9tbV9vcl9zaTEyOChiMV9oaSwgYTJfaGkpOworICAgICAgLy8gc3RvcmUKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMCwgYjJfbG8pOworICAgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAxLCBiMl9oaSk7CisgICAgICAvLyBhY2N1bXVsYXRlIGVpZ2h0IGFscGhhICdhbmQnIGluIHBhcmFsbGVsCisgICAgICBhbGxfYWxwaGFzID0gX21tX2FuZF9zaTEyOChhbGxfYWxwaGFzLCBhMCk7CisgICAgICBvdXQgKz0gMjsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFscGhhW2ldOworICAgICAgZHN0WzQgKiBpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfYW5kICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KKyAgLy8gQ29tYmluZSB0aGUgZWlnaHQgYWxwaGEgJ2FuZCcgaW50byBhIDgtYml0IG1hc2suCisgIGFscGhhX2FuZCAmPSBfbW1fbW92ZW1hc2tfZXBpOChfbW1fY21wZXFfZXBpOChhbGxfYWxwaGFzLCBhbGxfMHhmZikpOworICByZXR1cm4gKGFscGhhX2FuZCAhPSAweGZmKTsKK30KKworc3RhdGljIHZvaWQgRGlzcGF0Y2hBbHBoYVRvR3JlZW5fU1NFMihjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IGFscGhhX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSkgeworICBpbnQgaSwgajsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgaW50IGxpbWl0ID0gd2lkdGggJiB+MTU7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSArPSAxNikgeyAgIC8vIHByb2Nlc3MgMTYgYWxwaGEgYnl0ZXMKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhbHBoYVtpXSk7CisgICAgICBjb25zdCBfX20xMjhpIGExID0gX21tX3VucGFja2xvX2VwaTgoemVybywgYTApOyAgLy8gbm90ZSB0aGUgJ3plcm8nIGZpcnN0IQorICAgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sIGEwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTEsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBiMl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNihiMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX3VucGFja2hpX2VwaTE2KGExLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjJfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoYjEsIHplcm8pOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgIDBdLCBhMl9sbyk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAgNF0sIGEyX2hpKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbaSArICA4XSwgYjJfbG8pOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFtpICsgMTJdLCBiMl9oaSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgZHN0W2ldID0gYWxwaGFbaV0gPDwgODsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KK30KKworc3RhdGljIGludCBFeHRyYWN0QWxwaGFfU1NFMihjb25zdCB1aW50OF90KiBhcmdiLCBpbnQgYXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUpIHsKKyAgLy8gYWxwaGFfYW5kIHN0b3JlcyBhbiAnYW5kJyBvcGVyYXRpb24gb2YgYWxsIHRoZSBhbHBoYVtdIHZhbHVlcy4gVGhlIGZpbmFsCisgIC8vIHZhbHVlIGlzIG5vdCAweGZmIGlmIGFueSBvZiB0aGUgYWxwaGFbXSBpcyBub3QgZXF1YWwgdG8gMHhmZi4KKyAgdWludDMyX3QgYWxwaGFfYW5kID0gMHhmZjsKKyAgaW50IGksIGo7CisgIGNvbnN0IF9fbTEyOGkgYV9tYXNrID0gX21tX3NldDFfZXBpMzIoMHhmZnUpOyAgLy8gdG8gcHJlc2VydmUgYWxwaGEKKyAgY29uc3QgX19tMTI4aSBhbGxfMHhmZiA9IF9tbV9zZXRfZXBpMzIoMCwgMCwgfjB1LCB+MHUpOworICBfX20xMjhpIGFsbF9hbHBoYXMgPSBhbGxfMHhmZjsKKworICAvLyBXZSBtdXN0IGJlIGFibGUgdG8gYWNjZXNzIDMgZXh0cmEgYnl0ZXMgYWZ0ZXIgdGhlIGxhc3Qgd3JpdHRlbiBieXRlCisgIC8vICdzcmNbNCAqIHdpZHRoIC0gNF0nLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgaWYgYWxwaGEgaXMgdGhlIGZpcnN0IG9yIHRoZQorICAvLyBsYXN0IGJ5dGUgb2YgdGhlIHF1YWRydXBsZXQuCisgIGNvbnN0IGludCBsaW1pdCA9ICh3aWR0aCAtIDEpICYgfjc7CisKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgY29uc3QgX19tMTI4aSogc3JjID0gKGNvbnN0IF9fbTEyOGkqKWFyZ2I7CisgICAgZm9yIChpID0gMDsgaSA8IGxpbWl0OyBpICs9IDgpIHsKKyAgICAgIC8vIGxvYWQgMzIgYXJnYiBieXRlcworICAgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMSk7CisgICAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FuZF9zaTEyOChhMCwgYV9tYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYW5kX3NpMTI4KGExLCBhX21hc2spOworICAgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9wYWNrc19lcGkzMihiMCwgYjEpOworICAgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9wYWNrdXNfZXBpMTYoYzAsIGMwKTsKKyAgICAgIC8vIHN0b3JlCisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmYWxwaGFbaV0sIGQwKTsKKyAgICAgIC8vIGFjY3VtdWxhdGUgZWlnaHQgYWxwaGEgJ2FuZCcgaW4gcGFyYWxsZWwKKyAgICAgIGFsbF9hbHBoYXMgPSBfbW1fYW5kX3NpMTI4KGFsbF9hbHBoYXMsIGQwKTsKKyAgICAgIHNyYyArPSAyOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFscGhhX3ZhbHVlID0gYXJnYls0ICogaV07CisgICAgICBhbHBoYVtpXSA9IGFscGhhX3ZhbHVlOworICAgICAgYWxwaGFfYW5kICY9IGFscGhhX3ZhbHVlOworICAgIH0KKyAgICBhcmdiICs9IGFyZ2Jfc3RyaWRlOworICAgIGFscGhhICs9IGFscGhhX3N0cmlkZTsKKyAgfQorICAvLyBDb21iaW5lIHRoZSBlaWdodCBhbHBoYSAnYW5kJyBpbnRvIGEgOC1iaXQgbWFzay4KKyAgYWxwaGFfYW5kICY9IF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KGFsbF9hbHBoYXMsIGFsbF8weGZmKSk7CisgIHJldHVybiAoYWxwaGFfYW5kID09IDB4ZmYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTm9uLWRpdGhlciBwcmVtdWx0aXBsaWVkIG1vZGVzCisKKyNkZWZpbmUgTVVMVElQTElFUihhKSAgICgoYSkgKiAweDgwODEpCisjZGVmaW5lIFBSRU1VTFRJUExZKHgsIG0pICgoKHgpICogKG0pKSA+PiAyMykKKworLy8gV2UgY2FuJ3QgdXNlIGEgJ2NvbnN0IGludCcgZm9yIHRoZSBTSFVGRkxFIHZhbHVlLCBiZWNhdXNlIGl0IGhhcyB0byBiZSBhbgorLy8gaW1tZWRpYXRlIGluIHRoZSBfbW1fc2h1ZmZsZXh4X2VwaTE2KCkgaW5zdHJ1Y3Rpb24uIFdlIHJlYWxseSBuZWVkIGEgbWFjcm8uCisvLyBXZSB1c2U6IHYgLyAyNTUgPSAodiAqIDB4ODA4MSkgPj4gMjMsIHdoZXJlIHYgPSBhbHBoYSAqIHtyLGcsYn0gaXMgYSAxNmJpdAorLy8gdmFsdWUuCisjZGVmaW5lIEFQUExZX0FMUEhBKFJHQlgsIFNIVUZGTEUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoUkdCWCkpOyAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjFfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChhcmdiMCwgemVybyk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYXJnYjFfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChhcmdiMCwgemVybyk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGEwX2xvID0gX21tX29yX3NpMTI4KGFyZ2IxX2xvLCBrTWFzayk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGEwX2hpID0gX21tX29yX3NpMTI4KGFyZ2IxX2hpLCBrTWFzayk7ICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGExX2xvID0gX21tX3NodWZmbGVsb19lcGkxNihhbHBoYTBfbG8sIFNIVUZGTEUpOyBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGExX2hpID0gX21tX3NodWZmbGVsb19lcGkxNihhbHBoYTBfaGksIFNIVUZGTEUpOyBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGEyX2xvID0gX21tX3NodWZmbGVoaV9lcGkxNihhbHBoYTFfbG8sIFNIVUZGTEUpOyBcCisgIGNvbnN0IF9fbTEyOGkgYWxwaGEyX2hpID0gX21tX3NodWZmbGVoaV9lcGkxNihhbHBoYTFfaGksIFNIVUZGTEUpOyBcCisgIC8qIGFscGhhMiA9IFtmZiBhMCBhMCBhMF1bZmYgYTEgYTEgYTFdICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTBfbG8gPSBfbW1fbXVsbG9fZXBpMTYoYWxwaGEyX2xvLCBhcmdiMV9sbyk7ICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTBfaGkgPSBfbW1fbXVsbG9fZXBpMTYoYWxwaGEyX2hpLCBhcmdiMV9oaSk7ICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTFfbG8gPSBfbW1fbXVsaGlfZXB1MTYoQTBfbG8sIGtNdWx0KTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTFfaGkgPSBfbW1fbXVsaGlfZXB1MTYoQTBfaGksIGtNdWx0KTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTJfbG8gPSBfbW1fc3JsaV9lcGkxNihBMV9sbywgNyk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTJfaGkgPSBfbW1fc3JsaV9lcGkxNihBMV9oaSwgNyk7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fcGFja3VzX2VwaTE2KEEyX2xvLCBBMl9oaSk7ICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSYoUkdCWCksIEEzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBBcHBseUFscGhhTXVsdGlwbHlfU1NFMih1aW50OF90KiByZ2JhLCBpbnQgYWxwaGFfZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBrTXVsdCA9IF9tbV9zZXQxX2VwaTE2KDB4ODA4MXUpOworICBjb25zdCBfX20xMjhpIGtNYXNrID0gX21tX3NldF9lcGkxNigwLCAweGZmLCAweGZmLCAwLCAwLCAweGZmLCAweGZmLCAwKTsKKyAgY29uc3QgaW50IGtTcGFuID0gNDsKKyAgd2hpbGUgKGgtLSA+IDApIHsKKyAgICB1aW50MzJfdCogY29uc3QgcmdieCA9ICh1aW50MzJfdCopcmdiYTsKKyAgICBpbnQgaTsKKyAgICBpZiAoIWFscGhhX2ZpcnN0KSB7CisgICAgICBmb3IgKGkgPSAwOyBpICsga1NwYW4gPD0gdzsgaSArPSBrU3BhbikgeworICAgICAgICBBUFBMWV9BTFBIQShyZ2J4W2ldLCBfTU1fU0hVRkZMRSgyLCAzLCAzLCAzKSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgKyBrU3BhbiA8PSB3OyBpICs9IGtTcGFuKSB7CisgICAgICAgIEFQUExZX0FMUEhBKHJnYnhbaV0sIF9NTV9TSFVGRkxFKDAsIDAsIDAsIDEpKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRmluaXNoIHdpdGggbGVmdC1vdmVycy4KKyAgICBmb3IgKDsgaSA8IHc7ICsraSkgeworICAgICAgdWludDhfdCogY29uc3QgcmdiID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDEgOiAwKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhID0gcmdiYSArIChhbHBoYV9maXJzdCA/IDAgOiAzKTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGEgPSBhbHBoYVs0ICogaV07CisgICAgICBpZiAoYSAhPSAweGZmKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG11bHQgPSBNVUxUSVBMSUVSKGEpOworICAgICAgICByZ2JbNCAqIGkgKyAwXSA9IFBSRU1VTFRJUExZKHJnYls0ICogaSArIDBdLCBtdWx0KTsKKyAgICAgICAgcmdiWzQgKiBpICsgMV0gPSBQUkVNVUxUSVBMWShyZ2JbNCAqIGkgKyAxXSwgbXVsdCk7CisgICAgICAgIHJnYls0ICogaSArIDJdID0gUFJFTVVMVElQTFkocmdiWzQgKiBpICsgMl0sIG11bHQpOworICAgICAgfQorICAgIH0KKyAgICByZ2JhICs9IHN0cmlkZTsKKyAgfQorfQorI3VuZGVmIE1VTFRJUExJRVIKKyN1bmRlZiBQUkVNVUxUSVBMWQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxwaGEgZGV0ZWN0aW9uCisKK3N0YXRpYyBpbnQgSGFzQWxwaGE4Yl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IGxlbmd0aCkgeworICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldDFfZXBpOCgweGZmKTsKKyAgaW50IGkgPSAwOworICBmb3IgKDsgaSArIDE2IDw9IGxlbmd0aDsgaSArPSAxNikgeworICAgIGNvbnN0IF9fbTEyOGkgdiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIGJpdHMgPSBfbW1fY21wZXFfZXBpOCh2LCBhbGxfMHhmZik7CisgICAgY29uc3QgaW50IG1hc2sgPSBfbW1fbW92ZW1hc2tfZXBpOChiaXRzKTsKKyAgICBpZiAobWFzayAhPSAweGZmZmYpIHJldHVybiAxOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIGlmIChzcmNbaV0gIT0gMHhmZikgcmV0dXJuIDE7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IEhhc0FscGhhMzJiX1NTRTIoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKSB7CisgIGNvbnN0IF9fbTEyOGkgYWxwaGFfbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYpOworICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldDFfZXBpOCgweGZmKTsKKyAgaW50IGkgPSAwOworICAvLyBXZSBkb24ndCBrbm93IGlmIHdlIGNhbiBhY2Nlc3MgdGhlIGxhc3QgMyBieXRlcyBhZnRlciB0aGUgbGFzdCBhbHBoYQorICAvLyB2YWx1ZSAnc3JjWzQgKiBsZW5ndGggLSA0XScgKGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiBhbHBoYSBpcyB0aGUgZmlyc3QKKyAgLy8gb3IgdGhlIGxhc3QgYnl0ZSBvZiB0aGUgcXVhZHJ1cGxldCkuIEhlbmNlIHRoZSAnLTMnIHByb3RlY3Rpb24gYmVsb3cuCisgIGxlbmd0aCA9IGxlbmd0aCAqIDQgLSAzOyAgIC8vIHNpemUgaW4gYnl0ZXMKKyAgZm9yICg7IGkgKyA2NCA8PSBsZW5ndGg7IGkgKz0gNjQpIHsKKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArICAwKSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAxNikpOworICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMzIpKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDQ4KSk7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9hbmRfc2kxMjgoYTAsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fYW5kX3NpMTI4KGExLCBhbHBoYV9tYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX2FuZF9zaTEyOChhMiwgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9hbmRfc2kxMjgoYTMsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fcGFja3NfZXBpMzIoYjAsIGIxKTsKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX3BhY2tzX2VwaTMyKGIyLCBiMyk7CisgICAgY29uc3QgX19tMTI4aSBkICA9IF9tbV9wYWNrdXNfZXBpMTYoYzAsIGMxKTsKKyAgICBjb25zdCBfX20xMjhpIGJpdHMgPSBfbW1fY21wZXFfZXBpOChkLCBhbGxfMHhmZik7CisgICAgY29uc3QgaW50IG1hc2sgPSBfbW1fbW92ZW1hc2tfZXBpOChiaXRzKTsKKyAgICBpZiAobWFzayAhPSAweGZmZmYpIHJldHVybiAxOworICB9CisgIGZvciAoOyBpICsgMzIgPD0gbGVuZ3RoOyBpICs9IDMyKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgMTYpKTsKKyAgICBjb25zdCBfX20xMjhpIGIwID0gX21tX2FuZF9zaTEyOChhMCwgYWxwaGFfbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hbmRfc2kxMjgoYTEsIGFscGhhX21hc2spOworICAgIGNvbnN0IF9fbTEyOGkgYyAgPSBfbW1fcGFja3NfZXBpMzIoYjAsIGIxKTsKKyAgICBjb25zdCBfX20xMjhpIGQgID0gX21tX3BhY2t1c19lcGkxNihjLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIGJpdHMgPSBfbW1fY21wZXFfZXBpOChkLCBhbGxfMHhmZik7CisgICAgY29uc3QgaW50IG1hc2sgPSBfbW1fbW92ZW1hc2tfZXBpOChiaXRzKTsKKyAgICBpZiAobWFzayAhPSAweGZmZmYpIHJldHVybiAxOworICB9CisgIGZvciAoOyBpIDw9IGxlbmd0aDsgaSArPSA0KSBpZiAoc3JjW2ldICE9IDB4ZmYpIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFwcGx5IGFscGhhIHZhbHVlIHRvIHJvd3MKKworc3RhdGljIHZvaWQgTXVsdEFSR0JSb3dfU1NFMih1aW50MzJfdCogY29uc3QgcHRyLCBpbnQgd2lkdGgsIGludCBpbnZlcnNlKSB7CisgIGludCB4ID0gMDsKKyAgaWYgKCFpbnZlcnNlKSB7CisgICAgY29uc3QgaW50IGtTcGFuID0gMjsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIGNvbnN0IF9fbTEyOGkgazEyOCA9IF9tbV9zZXQxX2VwaTE2KDEyOCk7CisgICAgY29uc3QgX19tMTI4aSBrTXVsdCA9IF9tbV9zZXQxX2VwaTE2KDB4MDEwMSk7CisgICAgY29uc3QgX19tMTI4aSBrTWFzayA9IF9tbV9zZXRfZXBpMTYoMCwgMHhmZiwgMCwgMCwgMCwgMHhmZiwgMCwgMCk7CisgICAgZm9yICh4ID0gMDsgeCArIGtTcGFuIDw9IHdpZHRoOyB4ICs9IGtTcGFuKSB7CisgICAgICAvLyBUbyBjb21wdXRlICdyZXN1bHQgPSAoaW50KShhICogeCAvIDI1NS4gKyAuNSknLCB3ZSB1c2U6CisgICAgICAvLyAgIHRtcCA9IGEgKiB2ICsgMTI4LCByZXN1bHQgPSAodG1wICogMHgwMTAxdSkgPj4gMTYKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZwdHJbeF0pOworICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV91bnBhY2tsb19lcGk4KEEwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fb3Jfc2kxMjgoQTEsIGtNYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTMgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEEyLCBfTU1fU0hVRkZMRSgyLCAzLCAzLCAzKSk7CisgICAgICBjb25zdCBfX20xMjhpIEE0ID0gX21tX3NodWZmbGVoaV9lcGkxNihBMywgX01NX1NIVUZGTEUoMiwgMywgMywgMykpOworICAgICAgLy8gaGVyZSwgQTQgPSBbZmYgYTAgYTAgYTBdW2ZmIGExIGExIGExXQorICAgICAgY29uc3QgX19tMTI4aSBBNSA9IF9tbV9tdWxsb19lcGkxNihBNCwgQTEpOworICAgICAgY29uc3QgX19tMTI4aSBBNiA9IF9tbV9hZGRfZXBpMTYoQTUsIGsxMjgpOworICAgICAgY29uc3QgX19tMTI4aSBBNyA9IF9tbV9tdWxoaV9lcHUxNihBNiwga011bHQpOworICAgICAgY29uc3QgX19tMTI4aSBBMTAgPSBfbW1fcGFja3VzX2VwaTE2KEE3LCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZwdHJbeF0sIEExMCk7CisgICAgfQorICB9CisgIHdpZHRoIC09IHg7CisgIGlmICh3aWR0aCA+IDApIFdlYlBNdWx0QVJHQlJvd19DKHB0ciArIHgsIHdpZHRoLCBpbnZlcnNlKTsKK30KKworc3RhdGljIHZvaWQgTXVsdFJvd19TU0UyKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgeCA9IDA7CisgIGlmICghaW52ZXJzZSkgeworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgY29uc3QgX19tMTI4aSBrMTI4ID0gX21tX3NldDFfZXBpMTYoMTI4KTsKKyAgICBjb25zdCBfX20xMjhpIGtNdWx0ID0gX21tX3NldDFfZXBpMTYoMHgwMTAxKTsKKyAgICBmb3IgKHggPSAwOyB4ICsgOCA8PSB3aWR0aDsgeCArPSA4KSB7CisgICAgICBjb25zdCBfX20xMjhpIHYwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmcHRyW3hdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhbHBoYVt4XSk7CisgICAgICBjb25zdCBfX20xMjhpIHYxID0gX21tX3VucGFja2xvX2VwaTgodjAsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV91bnBhY2tsb19lcGk4KGEwLCB6ZXJvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjIgPSBfbW1fbXVsbG9fZXBpMTYodjEsIGExKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjMgPSBfbW1fYWRkX2VwaTE2KHYyLCBrMTI4KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjQgPSBfbW1fbXVsaGlfZXB1MTYodjMsIGtNdWx0KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdjUgPSBfbW1fcGFja3VzX2VwaTE2KHY0LCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZwdHJbeF0sIHY1KTsKKyAgICB9CisgIH0KKyAgd2lkdGggLT0geDsKKyAgaWYgKHdpZHRoID4gMCkgV2ViUE11bHRSb3dfQyhwdHIgKyB4LCBhbHBoYSArIHgsIHdpZHRoLCBpbnZlcnNlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFMih2b2lkKSB7CisgIFdlYlBNdWx0QVJHQlJvdyA9IE11bHRBUkdCUm93X1NTRTI7CisgIFdlYlBNdWx0Um93ID0gTXVsdFJvd19TU0UyOworICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5ID0gQXBwbHlBbHBoYU11bHRpcGx5X1NTRTI7CisgIFdlYlBEaXNwYXRjaEFscGhhID0gRGlzcGF0Y2hBbHBoYV9TU0UyOworICBXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4gPSBEaXNwYXRjaEFscGhhVG9HcmVlbl9TU0UyOworICBXZWJQRXh0cmFjdEFscGhhID0gRXh0cmFjdEFscGhhX1NTRTI7CisKKyAgV2ViUEhhc0FscGhhOGIgPSBIYXNBbHBoYThiX1NTRTI7CisgIFdlYlBIYXNBbHBoYTMyYiA9IEhhc0FscGhhMzJiX1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0UyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9hbHBoYV9wcm9jZXNzaW5nX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwNDBmOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvYWxwaGFfcHJvY2Vzc2luZ19zc2U0MS5jCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIHByb2Nlc3NpbmcgdHJhbnNwYXJlbnQgY2hhbm5lbCwgU1NFNC4xIHZhcmlhbnQuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisjaW5jbHVkZSA8c21taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgRXh0cmFjdEFscGhhX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlKSB7CisgIC8vIGFscGhhX2FuZCBzdG9yZXMgYW4gJ2FuZCcgb3BlcmF0aW9uIG9mIGFsbCB0aGUgYWxwaGFbXSB2YWx1ZXMuIFRoZSBmaW5hbAorICAvLyB2YWx1ZSBpcyBub3QgMHhmZiBpZiBhbnkgb2YgdGhlIGFscGhhW10gaXMgbm90IGVxdWFsIHRvIDB4ZmYuCisgIHVpbnQzMl90IGFscGhhX2FuZCA9IDB4ZmY7CisgIGludCBpLCBqOworICBjb25zdCBfX20xMjhpIGFsbF8weGZmID0gX21tX3NldDFfZXBpMzIofjB1KTsKKyAgX19tMTI4aSBhbGxfYWxwaGFzID0gYWxsXzB4ZmY7CisKKyAgLy8gV2UgbXVzdCBiZSBhYmxlIHRvIGFjY2VzcyAzIGV4dHJhIGJ5dGVzIGFmdGVyIHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZQorICAvLyAnc3JjWzQgKiB3aWR0aCAtIDRdJywgYmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIGFscGhhIGlzIHRoZSBmaXJzdCBvciB0aGUKKyAgLy8gbGFzdCBieXRlIG9mIHRoZSBxdWFkcnVwbGV0LgorICBjb25zdCBpbnQgbGltaXQgPSAod2lkdGggLSAxKSAmIH4xNTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0QWxwaGEwID0gX21tX3NldF9lcGk4KC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAxMiwgOCwgNCwgMCk7CisgIGNvbnN0IF9fbTEyOGkga0NzdEFscGhhMSA9IF9tbV9zZXRfZXBpOCgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgOCwgNCwgMCwgLTEsIC0xLCAtMSwgLTEpOworICBjb25zdCBfX20xMjhpIGtDc3RBbHBoYTIgPSBfbW1fc2V0X2VwaTgoLTEsIC0xLCAtMSwgLTEsIDEyLCA4LCA0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgY29uc3QgX19tMTI4aSBrQ3N0QWxwaGEzID0gX21tX3NldF9lcGk4KDEyLCA4LCA0LCAwLCAtMSwgLTEsIC0xLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgIGZvciAoaiA9IDA7IGogPCBoZWlnaHQ7ICsraikgeworICAgIGNvbnN0IF9fbTEyOGkqIHNyYyA9IChjb25zdCBfX20xMjhpKilhcmdiOworICAgIGZvciAoaSA9IDA7IGkgPCBsaW1pdDsgaSArPSAxNikgeworICAgICAgLy8gbG9hZCA2NCBhcmdiIGJ5dGVzCisgICAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDApOworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOChzcmMgKyAxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYTIgPSBfbW1fbG9hZHVfc2kxMjgoc3JjICsgMik7CisgICAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KHNyYyArIDMpOworICAgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9zaHVmZmxlX2VwaTgoYTAsIGtDc3RBbHBoYTApOworICAgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9zaHVmZmxlX2VwaTgoYTEsIGtDc3RBbHBoYTEpOworICAgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9zaHVmZmxlX2VwaTgoYTIsIGtDc3RBbHBoYTIpOworICAgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9zaHVmZmxlX2VwaTgoYTMsIGtDc3RBbHBoYTMpOworICAgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9vcl9zaTEyOChiMCwgYjEpOworICAgICAgY29uc3QgX19tMTI4aSBjMSA9IF9tbV9vcl9zaTEyOChiMiwgYjMpOworICAgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9vcl9zaTEyOChjMCwgYzEpOworICAgICAgLy8gc3RvcmUKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZhbHBoYVtpXSwgZDApOworICAgICAgLy8gYWNjdW11bGF0ZSBzaXh0ZWVuIGFscGhhICdhbmQnIGluIHBhcmFsbGVsCisgICAgICBhbGxfYWxwaGFzID0gX21tX2FuZF9zaTEyOChhbGxfYWxwaGFzLCBkMCk7CisgICAgICBzcmMgKz0gNDsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhbHBoYV92YWx1ZSA9IGFyZ2JbNCAqIGldOworICAgICAgYWxwaGFbaV0gPSBhbHBoYV92YWx1ZTsKKyAgICAgIGFscGhhX2FuZCAmPSBhbHBoYV92YWx1ZTsKKyAgICB9CisgICAgYXJnYiArPSBhcmdiX3N0cmlkZTsKKyAgICBhbHBoYSArPSBhbHBoYV9zdHJpZGU7CisgIH0KKyAgLy8gQ29tYmluZSB0aGUgc2l4dGVlbiBhbHBoYSAnYW5kJyBpbnRvIGFuIDgtYml0IG1hc2suCisgIGFscGhhX2FuZCB8PSAweGZmMDB1OyAgLy8gcHJldGVuZCB0aGUgdXBwZXIgYml0cyBbOC4uMTVdIHdlcmUgdGVzdGVkIG9rLgorICBhbHBoYV9hbmQgJj0gX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgoYWxsX2FscGhhcywgYWxsXzB4ZmYpKTsKKyAgcmV0dXJuIChhbHBoYV9hbmQgPT0gMHhmZmZmdSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZ1NTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmdTU0U0MSh2b2lkKSB7CisgIFdlYlBFeHRyYWN0QWxwaGEgPSBFeHRyYWN0QWxwaGFfU1NFNDE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFNDEKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nU1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTIuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWYxZWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb21tb25fc3NlMi5oCkBAIC0wLDAgKzEsMTk0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiBjb2RlIGNvbW1vbiB0byBzZXZlcmFsIGZpbGVzLgorLy8KKy8vIEF1dGhvcjogVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9DT01NT05fU1NFMl9IXworI2RlZmluZSBXRUJQX0RTUF9DT01NT05fU1NFMl9IXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1aXRlIHVzZWZ1bCBtYWNybyBmb3IgZGVidWdnaW5nLiBMZWZ0IGhlcmUgZm9yIGNvbnZlbmllbmNlLgorCisjaWYgMAorI2luY2x1ZGUgPHN0ZGlvLmg+CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmludFJlZyhjb25zdCBfX20xMjhpIHIsIGNvbnN0IGNoYXIqIGNvbnN0IG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgeworICBpbnQgbjsKKyAgdW5pb24geworICAgIF9fbTEyOGkgcjsKKyAgICB1aW50OF90IGk4WzE2XTsKKyAgICB1aW50MTZfdCBpMTZbOF07CisgICAgdWludDMyX3QgaTMyWzRdOworICAgIHVpbnQ2NF90IGk2NFsyXTsKKyAgfSB0bXA7CisgIHRtcC5yID0gcjsKKyAgZnByaW50ZihzdGRlcnIsICIlc1x0OiAiLCBuYW1lKTsKKyAgaWYgKHNpemUgPT0gOCkgeworICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuMnggIiwgdG1wLmk4W25dKTsKKyAgfSBlbHNlIGlmIChzaXplID09IDE2KSB7CisgICAgZm9yIChuID0gMDsgbiA8IDg7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjR4ICIsIHRtcC5pMTZbbl0pOworICB9IGVsc2UgaWYgKHNpemUgPT0gMzIpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgNDsgKytuKSBmcHJpbnRmKHN0ZGVyciwgIiUuOHggIiwgdG1wLmkzMltuXSk7CisgIH0gZWxzZSB7CisgICAgZm9yIChuID0gMDsgbiA8IDI7ICsrbikgZnByaW50ZihzdGRlcnIsICIlLjE2bHggIiwgdG1wLmk2NFtuXSk7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYXRoIGZ1bmN0aW9ucy4KKworLy8gUmV0dXJuIHRoZSBzdW0gb2YgYWxsIHRoZSA4YiBpbiB0aGUgcmVnaXN0ZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEhvcml6b250YWxBZGQ4Yihjb25zdCBfX20xMjhpKiBjb25zdCBhKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgc2FkOHgyID0gX21tX3NhZF9lcHU4KCphLCB6ZXJvKTsKKyAgLy8gc3VtIHRoZSB0d28gc2Fkczogc2FkOHgyWzA6MV0gKyBzYWQ4eDJbODo5XQorICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMzIoc2FkOHgyLCBfbW1fc2h1ZmZsZV9lcGkzMihzYWQ4eDIsIDIpKTsKKyAgcmV0dXJuIF9tbV9jdnRzaTEyOF9zaTMyKHN1bSk7Cit9CisKKy8vIFRyYW5zcG9zZSB0d28gNHg0IDE2YiBtYXRyaWNlcyBob3Jpem9udGFsbHkgc3RvcmVkIGluIHJlZ2lzdGVycy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoCisgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4wLCBjb25zdCBfX20xMjhpKiBjb25zdCBpbjEsCisgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4yLCBjb25zdCBfX20xMjhpKiBjb25zdCBpbjMsIF9fbTEyOGkqIGNvbnN0IG91dDAsCisgICAgX19tMTI4aSogY29uc3Qgb3V0MSwgX19tMTI4aSogY29uc3Qgb3V0MiwgX19tMTI4aSogY29uc3Qgb3V0MykgeworICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAvLyBhMTAgYTExIGExMiBhMTMgICBiMTAgYjExIGIxMiBiMTMKKyAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMCA9IF9tbV91bnBhY2tsb19lcGkxNigqaW4wLCAqaW4xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UwXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoKmluMiwgKmluMyk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMF8yID0gX21tX3VucGFja2hpX2VwaTE2KCppbjAsICppbjEpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTBfMyA9IF9tbV91bnBhY2toaV9lcGkxNigqaW4yLCAqaW4zKTsKKyAgLy8gYTAwIGExMCBhMDEgYTExICAgYTAyIGExMiBhMDMgYTEzCisgIC8vIGEyMCBhMzAgYTIxIGEzMSAgIGEyMiBhMzIgYTIzIGEzMworICAvLyBiMDAgYjEwIGIwMSBiMTEgICBiMDIgYjEyIGIwMyBiMTMKKyAgLy8gYjIwIGIzMCBiMjEgYjMxICAgYjIyIGIzMiBiMjMgYjMzCisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8wID0gX21tX3VucGFja2xvX2VwaTMyKHRyYW5zcG9zZTBfMCwgdHJhbnNwb3NlMF8xKTsKKyAgY29uc3QgX19tMTI4aSB0cmFuc3Bvc2UxXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIodHJhbnNwb3NlMF8yLCB0cmFuc3Bvc2UwXzMpOworICBjb25zdCBfX20xMjhpIHRyYW5zcG9zZTFfMiA9IF9tbV91bnBhY2toaV9lcGkzMih0cmFuc3Bvc2UwXzAsIHRyYW5zcG9zZTBfMSk7CisgIGNvbnN0IF9fbTEyOGkgdHJhbnNwb3NlMV8zID0gX21tX3VucGFja2hpX2VwaTMyKHRyYW5zcG9zZTBfMiwgdHJhbnNwb3NlMF8zKTsKKyAgLy8gYTAwIGExMCBhMjAgYTMwIGEwMSBhMTEgYTIxIGEzMQorICAvLyBiMDAgYjEwIGIyMCBiMzAgYjAxIGIxMSBiMjEgYjMxCisgIC8vIGEwMiBhMTIgYTIyIGEzMiBhMDMgYTEzIGEyMyBhMzMKKyAgLy8gYjAyIGIxMiBhMjIgYjMyIGIwMyBiMTMgYjIzIGIzMworICAqb3V0MCA9IF9tbV91bnBhY2tsb19lcGk2NCh0cmFuc3Bvc2UxXzAsIHRyYW5zcG9zZTFfMSk7CisgICpvdXQxID0gX21tX3VucGFja2hpX2VwaTY0KHRyYW5zcG9zZTFfMCwgdHJhbnNwb3NlMV8xKTsKKyAgKm91dDIgPSBfbW1fdW5wYWNrbG9fZXBpNjQodHJhbnNwb3NlMV8yLCB0cmFuc3Bvc2UxXzMpOworICAqb3V0MyA9IF9tbV91bnBhY2toaV9lcGk2NCh0cmFuc3Bvc2UxXzIsIHRyYW5zcG9zZTFfMyk7CisgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKKyAgLy8gYTAyIGExMiBhMjIgYTMyICAgYjAyIGIxMiBiMjIgYjMyCisgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hhbm5lbCBtaXhpbmcuCisKKy8vIEZ1bmN0aW9uIHVzZWQgc2V2ZXJhbCB0aW1lcyBpbiBWUDhQbGFuYXJUbzI0Yi4KKy8vIEl0IHNhbXBsZXMgdGhlIGluIGJ1ZmZlciBhcyBmb2xsb3dzOiBvbmUgZXZlcnkgdHdvIHVuc2lnbmVkIGNoYXIgaXMgc3RvcmVkCisvLyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIsIHdoaWxlIHRoZSBvdGhlciBoYWxmIGlzIHN0b3JlZCBhdCB0aGUgZW5kLgorI2RlZmluZSBWUDhQbGFuYXJUbzI0YkhlbHBlcihJTiwgT1VUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHZfbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4MDBmZik7ICAgICAgICAgICAgICAgXAorICAgIC8qIFRha2Ugb25lIGV2ZXJ5IHR3byB1cHBlciA4YiB2YWx1ZXMuKi8gICAgICAgICAgICAgICAgICAgICBcCisgICAgKE9VVCMjMCkgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hbmRfc2kxMjgoKElOIyMwKSwgdl9tYXNrKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2FuZF9zaTEyOCgoSU4jIzEpLCB2X21hc2spKTsgXAorICAgIChPVVQjIzEpID0gX21tX3BhY2t1c19lcGkxNihfbW1fYW5kX3NpMTI4KChJTiMjMiksIHZfbWFzayksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9hbmRfc2kxMjgoKElOIyMzKSwgdl9tYXNrKSk7IFwKKyAgICAoT1VUIyMyKSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FuZF9zaTEyOCgoSU4jIzQpLCB2X21hc2spLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fYW5kX3NpMTI4KChJTiMjNSksIHZfbWFzaykpOyBcCisgICAgLyogVGFrZSBvbmUgZXZlcnkgdHdvIGxvd2VyIDhiIHZhbHVlcy4qLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoT1VUIyMzKSA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX3NybGlfZXBpMTYoKElOIyMwKSwgOCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fc3JsaV9lcGkxNigoSU4jIzEpLCA4KSk7ICAgICBcCisgICAgKE9VVCMjNCkgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9zcmxpX2VwaTE2KChJTiMjMiksIDgpLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX3NybGlfZXBpMTYoKElOIyMzKSwgOCkpOyAgICAgXAorICAgIChPVVQjIzUpID0gX21tX3BhY2t1c19lcGkxNihfbW1fc3JsaV9lcGkxNigoSU4jIzQpLCA4KSwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9zcmxpX2VwaTE2KChJTiMjNSksIDgpKTsgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8gUGFjayB0aGUgcGxhbmFyIGJ1ZmZlcnMKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gdHJpcGxldCBieSB0cmlwbGV0IGluIHRoZSBvdXRwdXQgYnVmZmVyIHJnYiBhcyByZ2JyZ2JyZ2JyZ2IgLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhQbGFuYXJUbzI0Yl9TU0UyKAorICAgIF9fbTEyOGkqIGNvbnN0IGluMCwgX19tMTI4aSogY29uc3QgaW4xLCBfX20xMjhpKiBjb25zdCBpbjIsCisgICAgX19tMTI4aSogY29uc3QgaW4zLCBfX20xMjhpKiBjb25zdCBpbjQsIF9fbTEyOGkqIGNvbnN0IGluNSkgeworICAvLyBUaGUgaW5wdXQgaXMgNiByZWdpc3RlcnMgb2Ygc2l4dGVlbiA4YiBidXQgZm9yIHRoZSBzYWtlIG9mIGV4cGxhbmF0aW9uLAorICAvLyBsZXQncyB0YWtlIDYgcmVnaXN0ZXJzIG9mIGZvdXIgOGIgdmFsdWVzLgorICAvLyBUbyBwYWNrLCB3ZSB3aWxsIGtlZXAgdGFraW5nIG9uZSBldmVyeSB0d28gOGIgaW50ZWdlciBhbmQgbW92ZSBpdAorICAvLyBhcm91bmQgYXMgZm9sbG93czoKKyAgLy8gSW5wdXQ6CisgIC8vICAgcjByMXIycjMgfCByNHI1cjZyNyB8IGcwZzFnMmczIHwgZzRnNWc2ZzcgfCBiMGIxYjJiMyB8IGI0YjViNmI3CisgIC8vIFNwbGl0IHRoZSA2IHJlZ2lzdGVycyBpbiB0d28gc2V0cyBvZiAzIHJlZ2lzdGVyczogdGhlIGZpcnN0IHNldCBhcyB0aGUgZXZlbgorICAvLyA4YiBieXRlcywgdGhlIHNlY29uZCB0aGUgb2RkIG9uZXM6CisgIC8vICAgcjByMnI0cjYgfCBnMGcyZzRnNiB8IGIwYjJiNGI2IHwgcjFyM3I1cjcgfCBnMWczZzVnNyB8IGIxYjNiNWI3CisgIC8vIFJlcGVhdCB0aGUgc2FtZSBwZXJtdXRhdGlvbnMgdHdpY2UgbW9yZToKKyAgLy8gICByMHI0ZzBnNCB8IGIwYjRyMXI1IHwgZzFnNWIxYjUgfCByMnI2ZzJnNiB8IGIyYjZyM3I3IHwgZzNnN2IzYjcKKyAgLy8gICByMGcwYjByMSB8IGcxYjFyMmcyIHwgYjJyM2czYjMgfCByNGc0YjRyNSB8IGc1YjVyNmc2IHwgYjZyN2c3YjcKKyAgX19tMTI4aSB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICBWUDhQbGFuYXJUbzI0YkhlbHBlcigqaW4sIHRtcCk7CisgIFZQOFBsYW5hclRvMjRiSGVscGVyKHRtcCwgKmluKTsKKyAgVlA4UGxhbmFyVG8yNGJIZWxwZXIoKmluLCB0bXApOworICAvLyBXZSBuZWVkIHRvIGRvIGl0IHR3byBtb3JlIHRpbWVzIHRoYW4gdGhlIGV4YW1wbGUgYXMgd2UgaGF2ZSBzaXh0ZWVuIGJ5dGVzLgorICB7CisgICAgX19tMTI4aSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBvdXQ0LCBvdXQ1OworICAgIFZQOFBsYW5hclRvMjRiSGVscGVyKHRtcCwgb3V0KTsKKyAgICBWUDhQbGFuYXJUbzI0YkhlbHBlcihvdXQsICppbik7CisgIH0KK30KKworI3VuZGVmIFZQOFBsYW5hclRvMjRiSGVscGVyCisKKy8vIENvbnZlcnQgZm91ciBwYWNrZWQgZm91ci1jaGFubmVsIGJ1ZmZlcnMgbGlrZSBhcmdiYXJnYmFyZ2JhcmdiLi4uIGludG8gdGhlCisvLyBzcGxpdCBjaGFubmVscyBhYWFhYSAuLi4gcnJyciAuLi4gZ2dnZyAuLi4uIGJiYmJiIC4uLi4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TDMyYlRvUGxhbmFyX1NTRTIoX19tMTI4aSogY29uc3QgaW4wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4zKSB7CisgIC8vIENvbHVtbi13aXNlIHRyYW5zcG9zZS4KKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV91bnBhY2tsb19lcGk4KCppbjAsICppbjEpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2hpX2VwaTgoKmluMCwgKmluMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fdW5wYWNrbG9fZXBpOCgqaW4yLCAqaW4zKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV91bnBhY2toaV9lcGk4KCppbjIsICppbjMpOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGk4KEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fdW5wYWNrbG9fZXBpOChBMiwgQTMpOworICBjb25zdCBfX20xMjhpIEIzID0gX21tX3VucGFja2hpX2VwaTgoQTIsIEEzKTsKKyAgLy8gQzAgPSBnNyBnNiAuLi4gZzEgZzAgfCBiNyBiNiAuLi4gYjEgYjAKKyAgLy8gQzEgPSBhNyBhNiAuLi4gYTEgYTAgfCByNyByNiAuLi4gcjEgcjAKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KEIwLCBCMSk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNraGlfZXBpOChCMCwgQjEpOworICBjb25zdCBfX20xMjhpIEMyID0gX21tX3VucGFja2xvX2VwaTgoQjIsIEIzKTsKKyAgY29uc3QgX19tMTI4aSBDMyA9IF9tbV91bnBhY2toaV9lcGk4KEIyLCBCMyk7CisgIC8vIEdhdGhlciB0aGUgY2hhbm5lbHMuCisgICppbjAgPSBfbW1fdW5wYWNraGlfZXBpNjQoQzEsIEMzKTsKKyAgKmluMSA9IF9tbV91bnBhY2tsb19lcGk2NChDMSwgQzMpOworICAqaW4yID0gX21tX3VucGFja2hpX2VwaTY0KEMwLCBDMik7CisgICppbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQzAsIEMyKTsKK30KKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfQ09NTU9OX1NTRTJfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29tbW9uX3NzZTQxLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2U0MS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTczYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NvbW1vbl9zc2U0MS5oCkBAIC0wLDAgKzEsMTMyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNCBjb2RlIGNvbW1vbiB0byBzZXZlcmFsIGZpbGVzLgorLy8KKy8vIEF1dGhvcjogVmluY2VudCBSYWJhdWQgKHZyYWJhdWRAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9DT01NT05fU1NFNDFfSF8KKyNkZWZpbmUgV0VCUF9EU1BfQ09NTU9OX1NTRTQxX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisjaW5jbHVkZSA8c21taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaGFubmVsIG1peGluZy4KKy8vIFNodWZmbGVzIHRoZSBpbnB1dCBidWZmZXIgYXMgQTAgMCAwIEExIDAgMCBBMiAuLi4KKyNkZWZpbmUgV0VCUF9TU0U0MV9TSFVGRihPVVQsIElOMCwgSU4xKSAgICBcCisgIE9VVCMjMCA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMCwgc2h1ZmYwKTsgXAorICBPVVQjIzEgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjAsIHNodWZmMSk7IFwKKyAgT1VUIyMyID0gX21tX3NodWZmbGVfZXBpOCgqSU4wLCBzaHVmZjIpOyBcCisgIE9VVCMjMyA9IF9tbV9zaHVmZmxlX2VwaTgoKklOMSwgc2h1ZmYwKTsgXAorICBPVVQjIzQgPSBfbW1fc2h1ZmZsZV9lcGk4KCpJTjEsIHNodWZmMSk7IFwKKyAgT1VUIyM1ID0gX21tX3NodWZmbGVfZXBpOCgqSU4xLCBzaHVmZjIpOworCisvLyBQYWNrIHRoZSBwbGFuYXIgYnVmZmVycworLy8gcnJyci4uLiBycnJyLi4uIGdnZ2cuLi4gZ2dnZy4uLiBiYmJiLi4uIGJiYmIuLi4uCisvLyB0cmlwbGV0IGJ5IHRyaXBsZXQgaW4gdGhlIG91dHB1dCBidWZmZXIgcmdiIGFzIHJnYnJnYnJnYnJnYiAuLi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFBsYW5hclRvMjRiX1NTRTQxKAorICAgIF9fbTEyOGkqIGNvbnN0IGluMCwgX19tMTI4aSogY29uc3QgaW4xLCBfX20xMjhpKiBjb25zdCBpbjIsCisgICAgX19tMTI4aSogY29uc3QgaW4zLCBfX20xMjhpKiBjb25zdCBpbjQsIF9fbTEyOGkqIGNvbnN0IGluNSkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBSNCwgUjU7CisgIF9fbTEyOGkgRzAsIEcxLCBHMiwgRzMsIEc0LCBHNTsKKyAgX19tMTI4aSBCMCwgQjEsIEIyLCBCMywgQjQsIEI1OworCisgIC8vIFByb2Nlc3MgUi4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICA1LCAtMSwgLTEsIDQsIC0xLCAtMSwgMywgLTEsIC0xLCAyLCAtMSwgLTEsIDEsIC0xLCAtMSwgMCk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAxMCwgLTEsIC0xLCA5LCAtMSwgLTEsIDgsIC0xLCAtMSwgNywgLTEsIC0xLCA2LCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAtMSwgLTEsIDE1LCAtMSwgLTEsIDE0LCAtMSwgLTEsIDEzLCAtMSwgLTEsIDEyLCAtMSwgLTEsIDExLCAtMSk7CisgICAgV0VCUF9TU0U0MV9TSFVGRihSLCBpbjAsIGluMSkKKyAgfQorCisgIC8vIFByb2Nlc3MgRy4KKyAgeworICAgIC8vIFNhbWUgYXMgYmVmb3JlLCBqdXN0IHNoaWZ0ZWQgdG8gdGhlIGxlZnQgYnkgb25lIGFuZCBpbmNsdWRpbmcgdGhlIHJpZ2h0CisgICAgLy8gcGFkZGluZy4KKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCA0LCAtMSwgLTEsIDMsIC0xLCAtMSwgMiwgLTEsIC0xLCAxLCAtMSwgLTEsIDAsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgMTAsIC0xLCAtMSwgOSwgLTEsIC0xLCA4LCAtMSwgLTEsIDcsIC0xLCAtMSwgNiwgLTEsIC0xLCA1KTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgLTEsIDE1LCAtMSwgLTEsIDE0LCAtMSwgLTEsIDEzLCAtMSwgLTEsIDEyLCAtMSwgLTEsIDExLCAtMSwgLTEpOworICAgIFdFQlBfU1NFNDFfU0hVRkYoRywgaW4yLCBpbjMpCisgIH0KKworICAvLyBQcm9jZXNzIEIuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIDQsIC0xLCAtMSwgMywgLTEsIC0xLCAyLCAtMSwgLTEsIDEsIC0xLCAtMSwgMCwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMSA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCA5LCAtMSwgLTEsIDgsIC0xLCAtMSwgNywgLTEsIC0xLCA2LCAtMSwgLTEsIDUsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMiA9IF9tbV9zZXRfZXBpOCgKKyAgICAgIDE1LCAtMSwgLTEsIDE0LCAtMSwgLTEsIDEzLCAtMSwgLTEsIDEyLCAtMSwgLTEsIDExLCAtMSwgLTEsIDEwKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKEIsIGluNCwgaW41KQorICB9CisKKyAgLy8gT1IgdGhlIGRpZmZlcmVudCBjaGFubmVscy4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgUkcwID0gX21tX29yX3NpMTI4KFIwLCBHMCk7CisgICAgY29uc3QgX19tMTI4aSBSRzEgPSBfbW1fb3Jfc2kxMjgoUjEsIEcxKTsKKyAgICBjb25zdCBfX20xMjhpIFJHMiA9IF9tbV9vcl9zaTEyOChSMiwgRzIpOworICAgIGNvbnN0IF9fbTEyOGkgUkczID0gX21tX29yX3NpMTI4KFIzLCBHMyk7CisgICAgY29uc3QgX19tMTI4aSBSRzQgPSBfbW1fb3Jfc2kxMjgoUjQsIEc0KTsKKyAgICBjb25zdCBfX20xMjhpIFJHNSA9IF9tbV9vcl9zaTEyOChSNSwgRzUpOworICAgICppbjAgPSBfbW1fb3Jfc2kxMjgoUkcwLCBCMCk7CisgICAgKmluMSA9IF9tbV9vcl9zaTEyOChSRzEsIEIxKTsKKyAgICAqaW4yID0gX21tX29yX3NpMTI4KFJHMiwgQjIpOworICAgICppbjMgPSBfbW1fb3Jfc2kxMjgoUkczLCBCMyk7CisgICAgKmluNCA9IF9tbV9vcl9zaTEyOChSRzQsIEI0KTsKKyAgICAqaW41ID0gX21tX29yX3NpMTI4KFJHNSwgQjUpOworICB9Cit9CisKKyN1bmRlZiBXRUJQX1NTRTQxX1NIVUZGCisKKy8vIENvbnZlcnQgZm91ciBwYWNrZWQgZm91ci1jaGFubmVsIGJ1ZmZlcnMgbGlrZSBhcmdiYXJnYmFyZ2JhcmdiLi4uIGludG8gdGhlCisvLyBzcGxpdCBjaGFubmVscyBhYWFhYSAuLi4gcnJyciAuLi4gZ2dnZyAuLi4uIGJiYmJiIC4uLi4uLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TDMyYlRvUGxhbmFyX1NTRTQxKF9fbTEyOGkqIGNvbnN0IGluMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IGluMykgeworICAvLyBhYWFhcnJycmdnZ2diYmJiCisgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0KKyAgICAgIF9tbV9zZXRfZXBpOCgxNSwgMTEsIDcsIDMsIDE0LCAxMCwgNiwgMiwgMTMsIDksIDUsIDEsIDEyLCA4LCA0LCAwKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zaHVmZmxlX2VwaTgoKmluMCwgc2h1ZmYwKTsKKyAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zaHVmZmxlX2VwaTgoKmluMSwgc2h1ZmYwKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zaHVmZmxlX2VwaTgoKmluMiwgc2h1ZmYwKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zaHVmZmxlX2VwaTgoKmluMywgc2h1ZmYwKTsKKyAgLy8gQTBBMVIwUjEKKyAgLy8gRzBHMUIwQjEKKyAgLy8gQTJBM1IyUjMKKyAgLy8gRzBHMUIwQjEKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGkzMihBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX3VucGFja2hpX2VwaTMyKEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQTIsIEEzKTsKKyAgY29uc3QgX19tMTI4aSBCMyA9IF9tbV91bnBhY2toaV9lcGkzMihBMiwgQTMpOworICAqaW4zID0gX21tX3VucGFja2xvX2VwaTY0KEIwLCBCMik7CisgICppbjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoQjAsIEIyKTsKKyAgKmluMSA9IF9tbV91bnBhY2tsb19lcGk2NChCMSwgQjMpOworICAqaW4wID0gX21tX3VucGFja2hpX2VwaTY0KEIxLCBCMyk7Cit9CisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0RTUF9DT01NT05fU1NFNDFfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9jb3N0LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3QuYwpzaW1pbGFyaXR5IGluZGV4IDYxJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3QuYwppbmRleCBkNDkxNmQ3Li40OGZiM2RiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvY29zdC5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdC5jCkBAIC0xLDQgKzEsNCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAvLwogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQogLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCkBAIC03LDE2ICs3LDE2IEBACiAvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLwotLy8gQ29zdCB0YWJsZXMgZm9yIGxldmVsIGFuZCBtb2RlcwotLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpbmNsdWRlICIuL2Nvc3QuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgeworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKICNlbmRpZgogCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBCb29sZWFuLWNvc3QgY29zdCB0YWJsZQogCkBAIC01MiwyOSArNTIsNiBAQAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIExldmVsIGNvc3QgdGFibGVzCiAKLS8vIEZvciBlYWNoIGdpdmVuIGxldmVsLCB0aGUgZm9sbG93aW5nIHRhYmxlIGdpdmVzIHRoZSBwYXR0ZXJuIG9mIGNvbnRleHRzIHRvCi0vLyB1c2UgZm9yIGNvZGluZyBpdCAoaW4gW11bMF0pIGFzIHdlbGwgYXMgdGhlIGJpdCB2YWx1ZSB0byB1c2UgZm9yIGVhY2gKLS8vIGNvbnRleHQgKGluIFtdWzFdKS4KLWNvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXSA9IHsKLSAgICAgICAgICAgICAgICAgIHsweDAwMSwgMHgwMDB9LCB7MHgwMDcsIDB4MDAxfSwgezB4MDBmLCAweDAwNX0sCi0gIHsweDAwZiwgMHgwMGR9LCB7MHgwMzMsIDB4MDAzfSwgezB4MDMzLCAweDAwM30sIHsweDAzMywgMHgwMjN9LAotICB7MHgwMzMsIDB4MDIzfSwgezB4MDMzLCAweDAyM30sIHsweDAzMywgMHgwMjN9LCB7MHgwZDMsIDB4MDEzfSwKLSAgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sCi0gIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwOTN9LAotICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKLSAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCi0gIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAotICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAotICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKLSAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCi0gIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgxNTN9Ci19OwotCiAvLyBmaXhlZCBjb3N0cyBmb3IgY29kaW5nIGxldmVscywgZGVkdWNlIGZyb20gdGhlIGNvZGluZyB0cmVlLgogLy8gVGhpcyBpcyBvbmx5IHRoZSBwYXJ0IHRoYXQgZG9lc24ndCBkZXBlbmQgb24gdGhlIHByb2JhYmlsaXR5IHN0YXRlLgogY29uc3QgdWludDE2X3QgVlA4TGV2ZWxGaXhlZENvc3RzW01BWF9MRVZFTCArIDFdID0gewpAQCAtMzM2LDE2MSArMzEzLDk4IEBACiAgIDc2OTQsIDc3MDMsIDc3MDksIDc3MjksIDc3MzUsIDc3NDQsIDc3NTAsIDc3NjEKIH07CiAKLXN0YXRpYyBpbnQgVmFyaWFibGVMZXZlbENvc3QoaW50IGxldmVsLCBjb25zdCB1aW50OF90IHByb2Jhc1tOVU1fUFJPQkFTXSkgewotICBpbnQgcGF0dGVybiA9IFZQOExldmVsQ29kZXNbbGV2ZWwgLSAxXVswXTsKLSAgaW50IGJpdHMgPSBWUDhMZXZlbENvZGVzW2xldmVsIC0gMV1bMV07Ci0gIGludCBjb3N0ID0gMDsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDI7IHBhdHRlcm47ICsraSkgewotICAgIGlmIChwYXR0ZXJuICYgMSkgewotICAgICAgY29zdCArPSBWUDhCaXRDb3N0KGJpdHMgJiAxLCBwcm9iYXNbaV0pOworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlcyBmb3IgbGV2ZWwgY29kaW5nCisKK2NvbnN0IHVpbnQ4X3QgVlA4RW5jQmFuZHNbMTYgKyAxXSA9IHsKKyAgMCwgMSwgMiwgMywgNiwgNCwgNSwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwgNywKKyAgMCAgLy8gc2VudGluZWwKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNb2RlIGNvc3RzCisKK3N0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0X0MoaW50IGN0eDAsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGNvbnN0IGludCBwMCA9IHJlcy0+cHJvYltuXVtjdHgwXVswXTsKKyAgQ29zdEFycmF5UHRyIGNvbnN0IGNvc3RzID0gcmVzLT5jb3N0czsKKyAgY29uc3QgdWludDE2X3QqIHQgPSBjb3N0c1tuXVtjdHgwXTsKKyAgLy8gYml0X2Nvc3QoMSwgcDApIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGluIHRbXSB0YWJsZXMsIGJ1dCBvbmx5IGlmIGN0eCAhPSAwCisgIC8vIChhcyByZXF1aXJlZCBieSB0aGUgc3ludGF4KS4gRm9yIGN0eDAgPT0gMCwgd2UgbmVlZCB0byBhZGQgaXQgaGVyZSBvciBpdCdsbAorICAvLyBiZSBtaXNzaW5nIGR1cmluZyB0aGUgbG9vcC4KKyAgaW50IGNvc3QgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgcDApIDogMDsKKworICBpZiAocmVzLT5sYXN0IDwgMCkgeworICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKKyAgfQorICBmb3IgKDsgbiA8IHJlcy0+bGFzdDsgKytuKSB7CisgICAgY29uc3QgaW50IHYgPSBhYnMocmVzLT5jb2VmZnNbbl0pOworICAgIGNvbnN0IGludCBjdHggPSAodiA+PSAyKSA/IDIgOiB2OworICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOworICAgIHQgPSBjb3N0c1tuICsgMV1bY3R4XTsKKyAgfQorICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IHYgPSBhYnMocmVzLT5jb2VmZnNbbl0pOworICAgIGFzc2VydCh2ICE9IDApOworICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9ICh2ID09IDEpID8gMSA6IDI7CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOwogICAgIH0KLSAgICBiaXRzID4+PSAxOwotICAgIHBhdHRlcm4gPj49IDE7CiAgIH0KICAgcmV0dXJuIGNvc3Q7CiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcmUtY2FsYyBsZXZlbCBjb3N0cyBvbmNlIGZvciBhbGwKLQotdm9pZCBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKFZQOFByb2JhKiBjb25zdCBwcm9iYSkgewotICBpbnQgY3R5cGUsIGJhbmQsIGN0eDsKLQotICBpZiAoIXByb2JhLT5kaXJ0eV8pIHJldHVybjsgIC8vIG5vdGhpbmcgdG8gZG8uCi0KLSAgZm9yIChjdHlwZSA9IDA7IGN0eXBlIDwgTlVNX1RZUEVTOyArK2N0eXBlKSB7Ci0gICAgZm9yIChiYW5kID0gMDsgYmFuZCA8IE5VTV9CQU5EUzsgKytiYW5kKSB7Ci0gICAgICBmb3IgKGN0eCA9IDA7IGN0eCA8IE5VTV9DVFg7ICsrY3R4KSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBwcm9iYS0+Y29lZmZzX1tjdHlwZV1bYmFuZF1bY3R4XTsKLSAgICAgICAgdWludDE2X3QqIGNvbnN0IHRhYmxlID0gcHJvYmEtPmxldmVsX2Nvc3RfW2N0eXBlXVtiYW5kXVtjdHhdOwotICAgICAgICBjb25zdCBpbnQgY29zdF9iYXNlID0gVlA4Qml0Q29zdCgxLCBwWzFdKTsKLSAgICAgICAgaW50IHY7Ci0gICAgICAgIHRhYmxlWzBdID0gVlA4Qml0Q29zdCgwLCBwWzFdKTsKLSAgICAgICAgZm9yICh2ID0gMTsgdiA8PSBNQVhfVkFSSUFCTEVfTEVWRUw7ICsrdikgewotICAgICAgICAgIHRhYmxlW3ZdID0gY29zdF9iYXNlICsgVmFyaWFibGVMZXZlbENvc3QodiwgcCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU3RhcnRpbmcgYXQgbGV2ZWwgNjcgYW5kIHVwLCB0aGUgdmFyaWFibGUgcGFydCBvZiB0aGUgY29zdCBpcwotICAgICAgICAvLyBhY3R1YWxseSBjb25zdGFudC4KLSAgICAgIH0KK3N0YXRpYyB2b2lkIFNldFJlc2lkdWFsQ29lZmZzX0MoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCBuOworICByZXMtPmxhc3QgPSAtMTsKKyAgYXNzZXJ0KHJlcy0+Zmlyc3QgPT0gMCB8fCBjb2VmZnNbMF0gPT0gMCk7CisgIGZvciAobiA9IDE1OyBuID49IDA7IC0tbikgeworICAgIGlmIChjb2VmZnNbbl0pIHsKKyAgICAgIHJlcy0+bGFzdCA9IG47CisgICAgICBicmVhazsKICAgICB9CiAgIH0KLSAgcHJvYmEtPmRpcnR5XyA9IDA7CisgIHJlcy0+Y29lZmZzID0gY29lZmZzOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTW9kZSBjb3N0IHRhYmxlcy4KKy8vIGluaXQgZnVuY3Rpb24KIAotLy8gVGhlc2UgYXJlIHRoZSBmaXhlZCBwcm9iYWJpbGl0aWVzIChpbiB0aGUgY29kaW5nIHRyZWVzKSB0dXJuZWQgaW50byBiaXQtY29zdAotLy8gYnkgY2FsbGluZyBWUDhCaXRDb3N0KCkuCi1jb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF0gPSB7IDMwMiwgOTg0LCA0MzksIDY0MiB9OwotLy8gbm90ZTogdGhlc2UgdmFsdWVzIGluY2x1ZGUgdGhlIGZpeGVkIFZQOEJpdENvc3QoMSwgMTQ1KSBtb2RlIHNlbGVjdGlvbiBjb3N0LgotY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XSA9IHsgNjYzLCA5MTksIDg3MiwgOTE5IH07Ci1jb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU10gPSB7Ci0gIHsgeyAgMjUxLCAxMzYyLCAxOTM0LCAyMDg1LCAyMzE0LCAyMjMwLCAxODM5LCAxOTg4LCAyNDM3LCAyMzQ4IH0sCi0gICAgeyAgNDAzLCAgNjgwLCAxNTA3LCAxNTE5LCAyMDYwLCAyMDA1LCAxOTkyLCAxOTE0LCAxOTI0LCAxNzMzIH0sCi0gICAgeyAgMzUzLCAxMTIxLCAgOTczLCAxODk1LCAyMDYwLCAxNzg3LCAxNjcxLCAxNTE2LCAyMDEyLCAxODY4IH0sCi0gICAgeyAgNzcwLCAgODUyLCAxNTgxLCAgNjMyLCAxMzkzLCAxNzgwLCAxODIzLCAxOTM2LCAxMDc0LCAxMjE4IH0sCi0gICAgeyAgNTEwLCAxMjcwLCAxNDY3LCAxMzE5LCAgODQ3LCAxMjc5LCAxNzkyLCAyMDk0LCAxMDgwLCAxMzUzIH0sCi0gICAgeyAgNDg4LCAxMzIyLCAgOTE4LCAxNTczLCAxMzAwLCAgODgzLCAxODE0LCAxNzUyLCAxNzU2LCAxNTAyIH0sCi0gICAgeyAgNDI1LCAgOTkyLCAxODIwLCAxNTE0LCAxODQzLCAyNDQwLCAgOTM3LCAxNzcxLCAxOTI0LCAxMTI5IH0sCi0gICAgeyAgMzYzLCAxMjQ4LCAxMjU3LCAxOTcwLCAyMTk0LCAyMzg1LCAxNTY5LCAgOTUzLCAxOTUxLCAxNjAxIH0sCi0gICAgeyAgNzIzLCAxMjU3LCAxNjMxLCAgOTY0LCAgOTYzLCAxNTA4LCAxNjk3LCAxODI0LCAgNjcxLCAxNDE4IH0sCi0gICAgeyAgNjM1LCAxMDM4LCAxNTczLCAgOTMwLCAxNjczLCAxNDEzLCAxNDEwLCAxNjg3LCAxNDEwLCAgNzQ5IH0gfSwKLSAgeyB7ICA0NTEsICA2MTMsIDEzNDUsIDE3MDIsIDE4NzAsIDE3MTYsIDE3MjgsIDE3NjYsIDIxOTAsIDIzMTAgfSwKLSAgICB7ICA2NzgsICA0NTMsIDExNzEsIDE0NDMsIDE5MjUsIDE4MzEsIDIwNDUsIDE3ODEsIDE4ODcsIDE2MDIgfSwKLSAgICB7ICA3MTEsICA2NjYsICA2NzQsIDE3MTgsIDE5MTAsIDE0OTMsIDE3NzUsIDExOTMsIDIzMjUsIDIzMjUgfSwKLSAgICB7ICA4ODMsICA4NTQsIDE1ODMsICA1NDIsIDE4MDAsIDE4NzgsIDE2NjQsIDIxNDksIDEyMDcsIDEwODcgfSwKLSAgICB7ICA2NjksICA5OTQsIDEyNDgsIDExMjIsICA5NDksIDExNzksIDEzNzYsIDE3MjksIDEwNzAsIDEyNDQgfSwKLSAgICB7ICA3MTUsIDEwMjYsICA3MTUsIDEzNTAsIDE0MzAsICA5MzAsIDE3MTcsIDEyOTYsIDE0NzksIDE0NzkgfSwKLSAgICB7ICA1NDQsICA4NDEsIDE2NTYsIDE0NTAsIDIwOTQsIDM4ODMsIDEwMTAsIDE3NTksIDIwNzYsICA4MDkgfSwKLSAgICB7ICA2MTAsICA4NTUsICA5NTcsIDE1NTMsIDIwNjcsIDE1NjEsIDE3MDQsICA4MjQsIDIwNjYsIDEyMjYgfSwKLSAgICB7ICA4MzMsICA5NjAsIDE0MTYsICA4MTksIDEyNzcsIDE2MTksIDE1MDEsIDE2MTcsICA3NTcsIDExODIgfSwKLSAgICB7ICA3MTEsICA5NjQsIDEyNTIsICA4NzksIDE0NDEsIDE4MjgsIDE1MDgsIDE2MzYsIDE1OTQsICA3MzQgfSB9LAotICB7IHsgIDYwNSwgIDc2NCwgIDczNCwgMTcxMywgMTc0NywgMTE5MiwgMTgxOSwgMTM1MywgMTg3NywgMjM5MiB9LAotICAgIHsgIDg2NiwgIDY0MSwgIDU4NiwgMTYyMiwgMjA3MiwgMTQzMSwgMTg4OCwgMTM0NiwgMjE4OSwgMTc2NCB9LAotICAgIHsgIDkwMSwgIDg1MSwgIDQ1NiwgMjE2NSwgMjI4MSwgMTQwNSwgMTczOSwgMTE5MywgMjE4MywgMjQ0MyB9LAotICAgIHsgIDc3MCwgMTA0NSwgIDk1MiwgMTA3OCwgMTM0MiwgMTE5MSwgMTQzNiwgMTA2MywgMTMwMywgIDk5NSB9LAotICAgIHsgIDkwMSwgMTA4NiwgIDcyNywgMTE3MCwgIDg4NCwgMTEwNSwgMTI2NywgMTQwMSwgMTczOSwgMTMzNyB9LAotICAgIHsgIDk1MSwgMTE2MiwgIDU5NSwgMTQ4OCwgMTM4OCwgIDcwMywgMTc5MCwgMTM2NiwgMjA1NywgMTcyNCB9LAotICAgIHsgIDUzNCwgIDk4NiwgMTI3MywgMTk4NywgMzI3MywgMTQ4NSwgMTAyNCwgMTM5OSwgMTU4MywgIDg2NiB9LAotICAgIHsgIDY5OSwgMTE4MiwgIDY5NSwgMTk3OCwgMTcyNiwgMTk4NiwgMTMyNiwgIDcxNCwgMTc1MCwgMTY3MiB9LAotICAgIHsgIDk1MSwgMTIxNywgMTIwOSwgIDkyMCwgMTA2MiwgMTQ0MSwgMTU0OCwgIDk5OSwgIDk1MiwgIDkzMiB9LAotICAgIHsgIDczMywgMTI4NCwgIDc4NCwgMTI1NiwgMTU1NywgMTA5OCwgMTI1NywgMTM1NywgMTQxNCwgIDkwOCB9IH0sCi0gIHsgeyAgMzE2LCAxMDc1LCAxNjUzLCAxMjIwLCAyMTQ1LCAyMDUxLCAxNzMwLCAyMTMxLCAxODg0LCAxNzkwIH0sCi0gICAgeyAgNzQ1LCAgNTE2LCAxNDA0LCAgODk0LCAxNTk5LCAyMzc1LCAyMDEzLCAyMTA1LCAxNDc1LCAxMzgxIH0sCi0gICAgeyAgNTE2LCAgNzI5LCAxMDg4LCAxMzE5LCAxNjM3LCAzNDI2LCAxNjM2LCAxMjc1LCAxNTMxLCAxNDUzIH0sCi0gICAgeyAgODk0LCAgOTQzLCAyMTM4LCAgNDY4LCAxNzA0LCAyMjU5LCAyMDY5LCAxNzYzLCAxMjY2LCAxMTU4IH0sCi0gICAgeyAgNjA1LCAxMDI1LCAxMjM1LCAgODcxLCAxMTcwLCAxNzY3LCAxNDkzLCAxNTAwLCAxMTA0LCAxMjU4IH0sCi0gICAgeyAgNzM5LCAgODI2LCAxMjA3LCAxMTUxLCAxNDEyLCAgODQ2LCAxMzA1LCAyNzI2LCAxMDE0LCAxNTY5IH0sCi0gICAgeyAgNTU4LCAgODI1LCAxODIwLCAxMzk4LCAzMzQ0LCAxNTU2LCAxMjE4LCAxNTUwLCAxMjI4LCAgODc4IH0sCi0gICAgeyAgNDI5LCAgOTUxLCAxMDg5LCAxODE2LCAzODYxLCAzODYxLCAxNTU2LCAgOTY5LCAxNTY4LCAxODI4IH0sCi0gICAgeyAgODgzLCAgOTYxLCAxNzUyLCAgNzY5LCAxNDY4LCAxODEwLCAyMDgxLCAyMzQ2LCAgNjEzLCAxMjk4IH0sCi0gICAgeyAgODAzLCAgODk1LCAxMzcyLCAgNjQxLCAxMzAzLCAxNzA4LCAxNjg2LCAxNzAwLCAxMzA2LCAxMDMzIH0gfSwKLSAgeyB7ICA0MzksIDEyNjcsIDEyNzAsIDE1NzksICA5NjMsIDExOTMsIDE3MjMsIDE3MjksIDExOTgsIDE5OTMgfSwKLSAgICB7ICA3MDUsICA3MjUsIDEwMjksIDExNTMsIDExNzYsIDExMDMsIDE4MjEsIDE1NjcsIDEyNTksIDE1NzQgfSwKLSAgICB7ICA3MjMsICA4NTksICA4MDIsIDEyNTMsICA5NzIsIDEyMDIsIDE0MDcsIDE2NjUsIDE1MjAsIDE2NzQgfSwKLSAgICB7ICA4OTQsICA5NjAsIDEyNTQsICA4ODcsIDEwNTIsIDE2MDcsIDEzNDQsIDEzNDksICA4NjUsIDExNTAgfSwKLSAgICB7ICA4MzMsIDEzMTIsIDEzMzcsIDEyMDUsICA1NzIsIDEyODgsIDE0MTQsIDE1MjksIDEwODgsIDE0MzAgfSwKLSAgICB7ICA4NDIsIDEyNzksIDEwNjgsIDE4NjEsICA4NjIsICA2ODgsIDE4NjEsIDE2MzAsIDEwMzksIDEzODEgfSwKLSAgICB7ICA3NjYsICA5MzgsIDEyNzksIDE1NDYsIDMzMzgsIDE1NTAsIDEwMzEsIDE1NDIsIDEyODgsICA2NDAgfSwKLSAgICB7ICA3MTUsIDEwOTAsICA4MzUsIDE2MDksIDExMDAsIDExMDAsIDE2MDMsIDEwMTksIDExMDIsIDE2MTcgfSwKLSAgICB7ICA4OTQsIDE4MTMsIDE1MDAsIDExODgsICA3ODksIDExOTQsIDE0OTEsIDE5MTksICA2MTcsIDEzMzMgfSwKLSAgICB7ICA2MTAsIDEwNzYsIDE2NDQsIDEyODEsIDEyODMsICA5NzUsIDExNzksIDE2ODgsIDE0MzQsICA4ODkgfSB9LAotICB7IHsgIDU0NCwgIDk3MSwgMTE0NiwgMTg0OSwgMTIyMSwgIDc0MCwgMTg1NywgMTYyMSwgMTY4MywgMjQzMCB9LAotICAgIHsgIDcyMywgIDcwNSwgIDk2MSwgMTM3MSwgMTQyNiwgIDgyMSwgMjA4MSwgMjA3OSwgMTgzOSwgMTM4MCB9LAotICAgIHsgIDc4MywgIDg1NywgIDcwMywgMjE0NSwgMTQxOSwgIDgxNCwgMTc5MSwgMTMxMCwgMTYwOSwgMjIwNiB9LAotICAgIHsgIDk5NywgMTAwMCwgMTE1MywgIDc5MiwgMTIyOSwgMTE2MiwgMTgxMCwgMTQxOCwgIDk0MiwgIDk3OSB9LAotICAgIHsgIDkwMSwgMTIyNiwgIDg4MywgMTI4OSwgIDc5MywgIDcxNSwgMTkwNCwgMTY0OSwgMTMxOSwgMzEwOCB9LAotICAgIHsgIDk3OSwgMTQ3OCwgIDc4MiwgMjIxNiwgMTQ1NCwgIDQ1NSwgMzA5MiwgMTU5MSwgMTk5NywgMTY2NCB9LAotICAgIHsgIDY2MywgMTExMCwgMTUwNCwgMTExNCwgMTUyMiwgMzMxMSwgIDY3NiwgMTUyMiwgMTUzMCwgMTAyNCB9LAotICAgIHsgIDYwNSwgMTEzOCwgMTE1MywgMTMxNCwgMTU2OSwgMTMxNSwgMTE1NywgIDgwNCwgMTU3NCwgMTMyMCB9LAotICAgIHsgIDc3MCwgMTIxNiwgMTIxOCwgMTIyNywgIDg2OSwgMTM4NCwgMTIzMiwgMTM3NSwgIDgzNCwgMTIzOSB9LAotICAgIHsgIDc3NSwgMTAwNywgIDg0MywgMTIxNiwgMTIyNSwgMTA3NCwgMjUyNywgMTQ3OSwgMTE0OSwgIDk3NSB9IH0sCi0gIHsgeyAgNDc3LCAgODE3LCAxMzA5LCAxNDM5LCAxNzA4LCAxNDU0LCAxMTU5LCAxMjQxLCAxOTQ1LCAxNjcyIH0sCi0gICAgeyAgNTc3LCAgNzk2LCAxMTEyLCAxMjcxLCAxNjE4LCAxNDU4LCAxMDg3LCAxMzQ1LCAxODMxLCAxMjY1IH0sCi0gICAgeyAgNjYzLCAgNzc2LCAgNzUzLCAxOTQwLCAxNjkwLCAxNjkwLCAxMjI3LCAxMDk3LCAzMTQ5LCAxMzYxIH0sCi0gICAgeyAgNzY2LCAxMjk5LCAxNzQ0LCAxMTYxLCAxNTY1LCAxMTA2LCAxMDQ1LCAxMjMwLCAxMjMyLCAgNzA3IH0sCi0gICAgeyAgOTE1LCAxMDI2LCAxNDA0LCAxMTgyLCAxMTg0LCAgODUxLCAxNDI4LCAyNDI1LCAxMDQzLCAgNzg5IH0sCi0gICAgeyAgODgzLCAxNDU2LCAgNzkwLCAxMDgyLCAxMDg2LCAgOTg1LCAxMDgzLCAxNDg0LCAxMjM4LCAxMTYwIH0sCi0gICAgeyAgNTA3LCAxMzQ1LCAyMjYxLCAxOTk1LCAxODQ3LCAzNjM2LCAgNjUzLCAxNzYxLCAyMjg3LCAgOTMzIH0sCi0gICAgeyAgNTUzLCAxMTkzLCAxNDcwLCAyMDU3LCAyMDU5LCAyMDU5LCAgODMzLCAgNzc5LCAyMDU4LCAxMjYzIH0sCi0gICAgeyAgNzY2LCAxMjc1LCAxNTE1LCAxMDM5LCAgOTU3LCAxNTU0LCAxMjg2LCAxNTQwLCAxMjg5LCAgNzA1IH0sCi0gICAgeyAgNDk5LCAxMzc4LCAxNDk2LCAxMzg1LCAxODUwLCAxODUwLCAxMDQ0LCAyNDY1LCAxNTE1LCAgNzIwIH0gfSwKLSAgeyB7ICA1NTMsICA5MzAsICA5NzgsIDIwNzcsIDE5NjgsIDE0ODEsIDE0NTcsICA3NjEsIDE5NTcsIDIzNjIgfSwKLSAgICB7ICA2OTQsICA4NjQsICA5MDUsIDE3MjAsIDE2NzAsIDE2MjEsIDE0MjksICA3MTgsIDIxMjUsIDE0NzcgfSwKLSAgICB7ICA2OTksICA5NjgsICA2NTgsIDMxOTAsIDIwMjQsIDE0NzksIDE4NjUsICA3NTAsIDIwNjAsIDIzMjAgfSwKLSAgICB7ICA3MzMsIDEzMDgsIDEyOTYsIDEwNjIsIDE1NzYsIDEzMjIsIDEwNjIsIDExMTIsIDExNzIsICA4MTYgfSwKLSAgICB7ICA5MjAsICA5MjcsIDEwNTIsICA5MzksICA5NDcsIDExNTYsIDExNTIsIDEwNzMsIDMwNTYsIDEyNjggfSwKLSAgICB7ICA3MjMsIDE1MzQsICA3MTEsIDE1NDcsIDEyOTQsICA4OTIsIDE1NTMsICA5MjgsIDE4MTUsIDE1NjEgfSwKLSAgICB7ICA2NjMsIDEzNjYsIDE1ODMsIDIxMTEsIDE3MTIsIDM1MDEsICA1MjIsIDExNTUsIDIxMzAsIDExMzMgfSwKLSAgICB7ICA2MTQsIDE3MzEsIDExODgsIDIzNDMsIDE5NDQsIDM3MzMsIDEyODcsICA0ODcsIDM1NDYsIDE3NTggfSwKLSAgICB7ICA3NzAsIDE1ODUsIDEzMTIsICA4MjYsICA4ODQsIDI2NzMsIDExODUsIDEwMDYsIDExOTUsIDExOTUgfSwKLSAgICB7ICA3NTgsIDEzMzMsIDEyNzMsIDEwMjMsIDE2MjEsIDExNjIsIDEzNTEsICA4MzMsIDE0NzksICA4NjIgfSB9LAotICB7IHsgIDM3NiwgMTE5MywgMTQ0NiwgMTE0OSwgMTU0NSwgMTU3NywgMTg3MCwgMTc4OSwgMTE3NSwgMTgyMyB9LAotICAgIHsgIDgwMywgIDYzMywgMTEzNiwgMTA1OCwgMTM1MCwgMTMyMywgMTU5OCwgMjI0NywgMTA3MiwgMTI1MiB9LAotICAgIHsgIDYxNCwgMTA0OCwgIDk0MywgIDk4MSwgMTE1MiwgMTg2OSwgMTQ2MSwgMTAyMCwgMTYxOCwgMTYxOCB9LAotICAgIHsgMTEwNywgMTA4NSwgMTI4MiwgIDU5MiwgMTc3OSwgMTkzMywgMTY0OCwgMjQwMywgIDY5MSwgMTI0NiB9LAotICAgIHsgIDg1MSwgMTMwOSwgMTIyMywgMTI0MywgIDg5NSwgMTU5MywgMTc5MiwgMjMxNywgIDYyNywgMTA3NiB9LAotICAgIHsgIDc3MCwgMTIxNiwgMTAzMCwgMTEyNSwgIDkyMSwgIDk4MSwgMTYyOSwgMTEzMSwgMTA0OSwgMTY0NiB9LAotICAgIHsgIDYyNiwgMTQ2OSwgMTQ1NiwgMTA4MSwgMTQ4OSwgMzI3OCwgIDk4MSwgMTIzMiwgMTQ5OCwgIDczMyB9LAotICAgIHsgIDYxNywgMTIwMSwgIDgxMiwgMTIyMCwgMTQ3NiwgMTQ3NiwgMTQ3OCwgIDk3MCwgMTIyOCwgMTQ4OCB9LAotICAgIHsgMTE3OSwgMTM5MywgMTU0MCwgIDk5OSwgMTI0MywgMTUwMywgMTkxNiwgMTkyNSwgIDQxNCwgMTYxNCB9LAotICAgIHsgIDk0MywgMTA4OCwgMTQ5MCwgIDY4MiwgMTExMiwgMTM3MiwgMTc1NiwgMTUwNSwgIDk2NiwgIDk2NiB9IH0sCi0gIHsgeyAgMzIyLCAxMTQyLCAxNTg5LCAxMzk2LCAyMTQ0LCAxODU5LCAxMzU5LCAxOTI1LCAyMDg0LCAxNTE4IH0sCi0gICAgeyAgNjE3LCAgNjI1LCAxMjQxLCAxMjM0LCAyMTIxLCAxNjE1LCAxNTI0LCAxODU4LCAxNzIwLCAxMDA0IH0sCi0gICAgeyAgNTUzLCAgODUxLCAgNzg2LCAxMjk5LCAxNDUyLCAxNTYwLCAxMzcyLCAxNTYxLCAxOTY3LCAxNzEzIH0sCi0gICAgeyAgNzcwLCAgOTc3LCAxMzk2LCAgNTY4LCAxODkzLCAxNjM5LCAxNTQwLCAyMTA4LCAxNDMwLCAxMDEzIH0sCi0gICAgeyAgNjg0LCAxMTIwLCAxMzc1LCAgOTgyLCAgOTMwLCAyNzE5LCAxNjM4LCAxNjQzLCAgOTMzLCAgOTkzIH0sCi0gICAgeyAgNTUzLCAxMTAzLCAgOTk2LCAxMzU2LCAxMzYxLCAxMDA1LCAxNTA3LCAxNzYxLCAxMTg0LCAxMjY4IH0sCi0gICAgeyAgNDE5LCAxMjQ3LCAxNTM3LCAxNTU0LCAxODE3LCAzNjA2LCAxMDI2LCAxNjY2LCAxODI5LCAgOTIzIH0sCi0gICAgeyAgNDM5LCAxMTM5LCAxMTAxLCAxMjU3LCAzNzEwLCAxOTIyLCAxMjA1LCAxMDQwLCAxOTMxLCAxNTI5IH0sCi0gICAgeyAgOTc5LCAgOTM1LCAxMjY5LCAgODQ3LCAxMjAyLCAxMjg2LCAxNTMwLCAxNTM1LCAgODI3LCAxMDM2IH0sCi0gICAgeyAgNTE2LCAxMzc4LCAxNTY5LCAxMTEwLCAxNzk4LCAxNzk4LCAxMTk4LCAyMTk5LCAxNTQzLCAgNzEyIH0gfSwKLX07CitWUDhHZXRSZXNpZHVhbENvc3RGdW5jIFZQOEdldFJlc2lkdWFsQ29zdDsKK1ZQOFNldFJlc2lkdWFsQ29lZmZzRnVuYyBWUDhTZXRSZXNpZHVhbENvZWZmczsKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0U1NFMih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOEVuY0RzcENvc3RJbml0KSB7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdF9DOworICBWUDhTZXRSZXNpZHVhbENvZWZmcyA9IFNldFJlc2lkdWFsQ29lZmZzX0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4RW5jRHNwQ29zdEluaXRTU0UyKCk7CisgICAgfQorI2VuZGlmCisgIH0KK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2Nvc3RfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjNThlMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzMzIuYwpAQCAtMCwwICsxLDE1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogRGpvcmRqZSBQZXN1dCAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKK3N0YXRpYyBpbnQgR2V0UmVzaWR1YWxDb3N0X01JUFMzMihpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICBpbnQgdGVtcDAsIHRlbXAxOworICBpbnQgdl9yZWcsIGN0eF9yZWc7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHByb2JbVlA4RW5jQmFuZHNbbl1dLCBidXQgaXQncyBlcXVpdmFsZW50IGZvciBuPTAgb3IgMQorICBpbnQgcDAgPSByZXMtPnByb2Jbbl1bY3R4MF1bMF07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9IHJlcy0+Y29zdHM7CisgIGNvbnN0IHVpbnQxNl90KiB0ID0gY29zdHNbbl1bY3R4MF07CisgIC8vIGJpdF9jb3N0KDEsIHAwKSBpcyBhbHJlYWR5IGluY29ycG9yYXRlZCBpbiB0W10gdGFibGVzLCBidXQgb25seSBpZiBjdHggIT0gMAorICAvLyAoYXMgcmVxdWlyZWQgYnkgdGhlIHN5bnRheCkuIEZvciBjdHgwID09IDAsIHdlIG5lZWQgdG8gYWRkIGl0IGhlcmUgb3IgaXQnbGwKKyAgLy8gYmUgbWlzc2luZyBkdXJpbmcgdGhlIGxvb3AuCisgIGludCBjb3N0ID0gKGN0eDAgPT0gMCkgPyBWUDhCaXRDb3N0KDEsIHAwKSA6IDA7CisgIGNvbnN0IGludDE2X3QqIHJlc19jb2VmZnMgPSByZXMtPmNvZWZmczsKKyAgY29uc3QgaW50IHJlc19sYXN0ID0gcmVzLT5sYXN0OworICBjb25zdCBpbnQgY29uc3RfbWF4X2xldmVsID0gTUFYX1ZBUklBQkxFX0xFVkVMOworICBjb25zdCBpbnQgY29uc3RfMiA9IDI7CisgIGNvbnN0IHVpbnQxNl90KiogcF9jb3N0cyA9ICZjb3N0c1tuXVswXTsKKyAgY29uc3Qgc2l6ZV90IGluY19wX2Nvc3RzID0gTlVNX0NUWCAqIHNpemVvZigqcF9jb3N0cyk7CisKKyAgaWYgKHJlcy0+bGFzdCA8IDApIHsKKyAgICByZXR1cm4gVlA4Qml0Q29zdCgwLCBwMCk7CisgIH0KKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgICVbbl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDBdLCAgICAgICAgJVtuXSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJsZXogICAgICAlW3RlbXAxXSwgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkdSAgICAgJVtyZXNfY29lZmZzXSwgICAlW3Jlc19jb2VmZnNdLCAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICAlW3ZfcmVnXSwgICAgICAgIDAoJVtyZXNfY29lZmZzXSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtuXSwgICAgICAgICAgICAlW25dLCAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdGkgICAgICAlW3RlbXAxXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3ZuICAgICAgJVt2X3JlZ10sICAgICAgICAlW3RlbXAwXSwgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0aXUgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAyICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdmUgICAgICAlW2N0eF9yZWddLCAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2NvbnN0XzJdLCAgICAgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDFdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgJVtWUDhMZXZlbEZpeGVkQ29zdHNdICBcblx0IgorICAgICJsaHUgICAgICAgJVt0ZW1wMV0sICAgICAgICAwKCVbdGVtcDFdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2x0ICAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAlW2NvbnN0X21heF9sZXZlbF0gICAgIFxuXHQiCisgICAgIm1vdnogICAgICAlW3ZfcmVnXSwgICAgICAgICVbY29uc3RfbWF4X2xldmVsXSwgJVt0ZW1wMF0gICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtjb3N0XSwgICAgICAgICAlW2Nvc3RdLCAgICAgICAgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdl9yZWddLCAgICAgICAgJVt2X3JlZ10sICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW2N0eF9yZWddLCAgICAgICVbY3R4X3JlZ10sICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt2X3JlZ10sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgICVbdF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh1ICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW3ZfcmVnXSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3BfY29zdHNdLCAgICAgICVbcF9jb3N0c10sICAgICAgICAgJVtpbmNfcF9jb3N0c10gICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0XSwgICAgICAgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbY3R4X3JlZ10gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbY29zdF0sICAgICAgICAgJVtjb3N0XSwgICAgICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3Jlc19jb2VmZnNdLCAgICVbcmVzX2NvZWZmc10sICAgICAgMiAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgJVtuXSwgICAgICAgICAgICAlW3Jlc19sYXN0XSwgICAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGx3ICAgICAgICVbdF0sICAgICAgICAgICAgMCglW3RdKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtjb3N0XSIrJnIiKGNvc3QpLCBbdF0iKyZyIih0KSwgW25dIismciIobiksIFt2X3JlZ10iPSZyIih2X3JlZyksCisgICAgICBbY3R4X3JlZ10iPSZyIihjdHhfcmVnKSwgW3BfY29zdHNdIismciIocF9jb3N0cyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpLCBbcmVzX2NvZWZmc10iKyZyIihyZXNfY29lZmZzKQorICAgIDogW2NvbnN0XzJdInIiKGNvbnN0XzIpLCBbY29uc3RfbWF4X2xldmVsXSJyIihjb25zdF9tYXhfbGV2ZWwpLAorICAgICAgW1ZQOExldmVsRml4ZWRDb3N0c10iciIoVlA4TGV2ZWxGaXhlZENvc3RzKSwgW3Jlc19sYXN0XSJyIihyZXNfbGFzdCksCisgICAgICBbaW5jX3BfY29zdHNdInIiKGluY19wX2Nvc3RzKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKworICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IHYgPSBhYnMocmVzLT5jb2VmZnNbbl0pOworICAgIGFzc2VydCh2ICE9IDApOworICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9ICh2ID09IDEpID8gMSA6IDI7CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOworICAgIH0KKyAgfQorICByZXR1cm4gY29zdDsKK30KKworc3RhdGljIHZvaWQgU2V0UmVzaWR1YWxDb2VmZnNfTUlQUzMyKGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGNvbnN0IGludDE2X3QqIHBfY29lZmZzID0gKGludDE2X3QqKWNvZWZmczsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIG4sIG4xOworICBhc3NlcnQocmVzLT5maXJzdCA9PSAwIHx8IGNvZWZmc1swXSA9PSAwKTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVtwX2NvZWZmc10sICAgJVtwX2NvZWZmc10sICAgIDI4ICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgJVtuXSwgICAgICAgICAgMTUgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgJVt0ZW1wMl0sICAgICAgLTEgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgJVt0ZW1wMF0sICAgICAgMCglW3BfY29lZmZzXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMF0sICAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNpZiBkZWZpbmVkKFdPUkRTX0JJR0VORElBTikKKyAgICAiIHNsbCAgICAgJVt0ZW1wMV0sICAgICAgJVt0ZW1wMF0sICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIiBzcmwgICAgICVbdGVtcDFdLCAgICAgICVbdGVtcDBdLCAgICAgICAxNiAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYWRkaXUgICAgJVtuMV0sICAgICAgICAgJVtuXSwgICAgICAgICAgIC0xICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMF0sICAgICAgJVtuMV0sICAgICAgICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAibW92biAgICAgJVt0ZW1wMF0sICAgICAgJVtuXSwgICAgICAgICAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiaiAgICAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgJVt0ZW1wMl0sICAgICAgJVt0ZW1wMF0sICAgICAgIDAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVtuXSwgICAgICAgICAgJVtuXSwgICAgICAgICAgIC0yICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgJVtuXSwgICAgICAgICAgMGIgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgJVtwX2NvZWZmc10sICAgJVtwX2NvZWZmc10sICAgIC00ICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFtwX2NvZWZmc10iKyZyIihwX2NvZWZmcyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW25dIj0mciIobiksIFtuMV0iPSZyIihuMSkKKyAgICA6CisgICAgOiAibWVtb3J5IgorICApOworICByZXMtPmxhc3QgPSB0ZW1wMjsKKyAgcmVzLT5jb2VmZnMgPSBjb2VmZnM7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQUzMyKHZvaWQpIHsKKyAgVlA4R2V0UmVzaWR1YWxDb3N0ID0gR2V0UmVzaWR1YWxDb3N0X01JUFMzMjsKKyAgVlA4U2V0UmVzaWR1YWxDb2VmZnMgPSBTZXRSZXNpZHVhbENvZWZmc19NSVBTMzI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BDb3N0SW5pdE1JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU3MTUxOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMTEyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQXV0aG9yOiBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCitzdGF0aWMgaW50IEdldFJlc2lkdWFsQ29zdF9NSVBTZHNwUjIoaW50IGN0eDAsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMTsKKyAgaW50IHZfcmVnLCBjdHhfcmVnOworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgaW50IHAwID0gcmVzLT5wcm9iW25dW2N0eDBdWzBdOworICBDb3N0QXJyYXlQdHIgY29uc3QgY29zdHMgPSByZXMtPmNvc3RzOworICBjb25zdCB1aW50MTZfdCogdCA9IGNvc3RzW25dW2N0eDBdOworICAvLyBiaXRfY29zdCgxLCBwMCkgaXMgYWxyZWFkeSBpbmNvcnBvcmF0ZWQgaW4gdFtdIHRhYmxlcywgYnV0IG9ubHkgaWYgY3R4ICE9IDAKKyAgLy8gKGFzIHJlcXVpcmVkIGJ5IHRoZSBzeW50YXgpLiBGb3IgY3R4MCA9PSAwLCB3ZSBuZWVkIHRvIGFkZCBpdCBoZXJlIG9yIGl0J2xsCisgIC8vIGJlIG1pc3NpbmcgZHVyaW5nIHRoZSBsb29wLgorICBpbnQgY29zdCA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBwMCkgOiAwOworICBjb25zdCBpbnQxNl90KiByZXNfY29lZmZzID0gcmVzLT5jb2VmZnM7CisgIGNvbnN0IGludCByZXNfbGFzdCA9IHJlcy0+bGFzdDsKKyAgY29uc3QgaW50IGNvbnN0X21heF9sZXZlbCA9IE1BWF9WQVJJQUJMRV9MRVZFTDsKKyAgY29uc3QgaW50IGNvbnN0XzIgPSAyOworICBjb25zdCB1aW50MTZfdCoqIHBfY29zdHMgPSAmY29zdHNbbl1bMF07CisgIGNvbnN0IHNpemVfdCBpbmNfcF9jb3N0cyA9IE5VTV9DVFggKiBzaXplb2YoKnBfY29zdHMpOworCisgIGlmIChyZXMtPmxhc3QgPCAwKSB7CisgICAgcmV0dXJuIFZQOEJpdENvc3QoMCwgcDApOworICB9CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgICAgICAgJVtyZXNfbGFzdF0sICAgICAgICAlW25dICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJsZXogICAgICAlW3RlbXAxXSwgICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbbl0sICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHggICAgICAgJVt2X3JlZ10sICAgICAgICAlW3RlbXAwXSglW3Jlc19jb2VmZnNdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbbl0sICAgICAgICAgICAgJVtuXSwgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3ZfcmVnXSwgICAgICAgICVbdl9yZWddICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbHRpdSAgICAgJVt0ZW1wMF0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92ZSAgICAgICVbY3R4X3JlZ10sICAgICAgJVt2X3JlZ10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICAlW2N0eF9yZWddLCAgICAgICVbY29uc3RfMl0sICAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMV0sICAgICAgICAlW3ZfcmVnXSwgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh4ICAgICAgICVbdGVtcDFdLCAgICAgICAgJVt0ZW1wMV0oJVtWUDhMZXZlbEZpeGVkQ29zdHNdKSAgICAgICAgIFxuXHQiCisgICAgInNsdCAgICAgICAlW3RlbXAwXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgJVtjb25zdF9tYXhfbGV2ZWxdICBcblx0IgorICAgICJtb3Z6ICAgICAgJVt2X3JlZ10sICAgICAgICAlW2NvbnN0X21heF9sZXZlbF0sICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbY29zdF0sICAgICAgICAgJVtjb3N0XSwgICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3ZfcmVnXSwgICAgICAgICVbdl9yZWddLCAgICAgICAgICAgMSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVtjdHhfcmVnXSwgICAgICAlW2N0eF9yZWddLCAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh4ICAgICAgICVbdGVtcDBdLCAgICAgICAgJVt2X3JlZ10oJVt0XSkgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3BfY29zdHNdLCAgICAgICVbcF9jb3N0c10sICAgICAgICAgJVtpbmNfcF9jb3N0c10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0XSwgICAgICAgICAgICAlW3BfY29zdHNdLCAgICAgICAgICVbY3R4X3JlZ10gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbY29zdF0sICAgICAgICAgJVtjb3N0XSwgICAgICAgICAgICAlW3RlbXAwXSAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAlW25dLCAgICAgICAgICAgICVbcmVzX2xhc3RdLCAgICAgICAgMWIgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgbHcgICAgICAgJVt0XSwgICAgICAgICAgICAwKCVbdF0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW2Nvc3RdIismciIoY29zdCksIFt0XSIrJnIiKHQpLCBbbl0iKyZyIihuKSwgW3ZfcmVnXSI9JnIiKHZfcmVnKSwKKyAgICAgIFtjdHhfcmVnXSI9JnIiKGN0eF9yZWcpLCBbcF9jb3N0c10iKyZyIihwX2Nvc3RzKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSkKKyAgICA6IFtjb25zdF8yXSJyIihjb25zdF8yKSwgW2NvbnN0X21heF9sZXZlbF0iciIoY29uc3RfbWF4X2xldmVsKSwKKyAgICAgIFtWUDhMZXZlbEZpeGVkQ29zdHNdInIiKFZQOExldmVsRml4ZWRDb3N0cyksIFtyZXNfbGFzdF0iciIocmVzX2xhc3QpLAorICAgICAgW3Jlc19jb2VmZnNdInIiKHJlc19jb2VmZnMpLCBbaW5jX3BfY29zdHNdInIiKGluY19wX2Nvc3RzKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKworICAvLyBMYXN0IGNvZWZmaWNpZW50IGlzIGFsd2F5cyBub24temVybworICB7CisgICAgY29uc3QgaW50IHYgPSBhYnMocmVzLT5jb2VmZnNbbl0pOworICAgIGFzc2VydCh2ICE9IDApOworICAgIGNvc3QgKz0gVlA4TGV2ZWxDb3N0KHQsIHYpOworICAgIGlmIChuIDwgMTUpIHsKKyAgICAgIGNvbnN0IGludCBiID0gVlA4RW5jQmFuZHNbbiArIDFdOworICAgICAgY29uc3QgaW50IGN0eCA9ICh2ID09IDEpID8gMSA6IDI7CisgICAgICBjb25zdCBpbnQgbGFzdF9wMCA9IHJlcy0+cHJvYltiXVtjdHhdWzBdOworICAgICAgY29zdCArPSBWUDhCaXRDb3N0KDAsIGxhc3RfcDApOworICAgIH0KKyAgfQorICByZXR1cm4gY29zdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcENvc3RJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwQ29zdEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhHZXRSZXNpZHVhbENvc3QgPSBHZXRSZXNpZHVhbENvc3RfTUlQU2RzcFIyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFNfRFNQX1IyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BDb3N0SW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jb3N0X3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliMDAwMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvY29zdF9zc2UyLmMKQEAgLTAsMCArMSwxMjMgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2YgY29zdCBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIFNldFJlc2lkdWFsQ29lZmZzX1NTRTIoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShjb2VmZnMgKyAwKSk7CisgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShjb2VmZnMgKyA4KSk7CisgIC8vIFVzZSBTU0UyIHRvIGNvbXBhcmUgMTYgdmFsdWVzIHdpdGggYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbTAgPSBfbW1fcGFja3NfZXBpMTYoYzAsIGMxKTsKKyAgY29uc3QgX19tMTI4aSBtMSA9IF9tbV9jbXBlcV9lcGk4KG0wLCB6ZXJvKTsKKyAgLy8gR2V0IHRoZSBjb21wYXJpc29uIHJlc3VsdHMgYXMgYSBiaXRtYXNrIGludG8gMTZiaXRzLiBOZWdhdGUgdGhlIG1hc2sgdG8gZ2V0CisgIC8vIHRoZSBwb3NpdGlvbiBvZiBlbnRyaWVzIHRoYXQgYXJlIG5vdCBlcXVhbCB0byB6ZXJvLiBXZSBkb24ndCBuZWVkIHRvIG1hc2sKKyAgLy8gb3V0IGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYWNjb3JkaW5nIHRvIHJlcy0+Zmlyc3QsIHNpbmNlIGNvZWZmc1swXSBpcyAwCisgIC8vIGlmIHJlcy0+Zmlyc3QgPiAwLgorICBjb25zdCB1aW50MzJfdCBtYXNrID0gMHgwMDAwZmZmZnUgXiAodWludDMyX3QpX21tX21vdmVtYXNrX2VwaTgobTEpOworICAvLyBUaGUgcG9zaXRpb24gb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgbm9uLXplcm8gYml0IGluZGljYXRlcyB0aGUgcG9zaXRpb24gb2YKKyAgLy8gdGhlIGxhc3Qgbm9uLXplcm8gdmFsdWUuCisgIGFzc2VydChyZXMtPmZpcnN0ID09IDAgfHwgY29lZmZzWzBdID09IDApOworICByZXMtPmxhc3QgPSBtYXNrID8gQml0c0xvZzJGbG9vcihtYXNrKSA6IC0xOworICByZXMtPmNvZWZmcyA9IGNvZWZmczsKK30KKworc3RhdGljIGludCBHZXRSZXNpZHVhbENvc3RfU1NFMihpbnQgY3R4MCwgY29uc3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcykgeworICB1aW50OF90IGxldmVsc1sxNl0sIGN0eHNbMTZdOworICB1aW50MTZfdCBhYnNfbGV2ZWxzWzE2XTsKKyAgaW50IG4gPSByZXMtPmZpcnN0OworICAvLyBzaG91bGQgYmUgcHJvYltWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIGNvbnN0IGludCBwMCA9IHJlcy0+cHJvYltuXVtjdHgwXVswXTsKKyAgQ29zdEFycmF5UHRyIGNvbnN0IGNvc3RzID0gcmVzLT5jb3N0czsKKyAgY29uc3QgdWludDE2X3QqIHQgPSBjb3N0c1tuXVtjdHgwXTsKKyAgLy8gYml0X2Nvc3QoMSwgcDApIGlzIGFscmVhZHkgaW5jb3Jwb3JhdGVkIGluIHRbXSB0YWJsZXMsIGJ1dCBvbmx5IGlmIGN0eCAhPSAwCisgIC8vIChhcyByZXF1aXJlZCBieSB0aGUgc3ludGF4KS4gRm9yIGN0eDAgPT0gMCwgd2UgbmVlZCB0byBhZGQgaXQgaGVyZSBvciBpdCdsbAorICAvLyBiZSBtaXNzaW5nIGR1cmluZyB0aGUgbG9vcC4KKyAgaW50IGNvc3QgPSAoY3R4MCA9PSAwKSA/IFZQOEJpdENvc3QoMSwgcDApIDogMDsKKworICBpZiAocmVzLT5sYXN0IDwgMCkgeworICAgIHJldHVybiBWUDhCaXRDb3N0KDAsIHAwKTsKKyAgfQorCisgIHsgICAvLyBwcmVjb21wdXRlIGNsYW1wZWQgbGV2ZWxzIGFuZCBjb250ZXh0cywgcGFja2VkIHRvIDhiLgorICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgY29uc3QgX19tMTI4aSBrQ3N0MiA9IF9tbV9zZXQxX2VwaTgoMik7CisgICAgY29uc3QgX19tMTI4aSBrQ3N0NjcgPSBfbW1fc2V0MV9lcGk4KE1BWF9WQVJJQUJMRV9MRVZFTCk7CisgICAgY29uc3QgX19tMTI4aSBjMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlcy0+Y29lZmZzWzBdKTsKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVzLT5jb2VmZnNbOF0pOworICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fc3ViX2VwaTE2KHplcm8sIGMwKTsKKyAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBjMSk7CisgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9tYXhfZXBpMTYoYzAsIEQwKTsgICAvLyBhYnModiksIDE2YgorICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fbWF4X2VwaTE2KGMxLCBEMSk7CisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX3BhY2tzX2VwaTE2KEUwLCBFMSk7CisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX21pbl9lcHU4KEYsIGtDc3QyKTsgICAgLy8gY29udGV4dCA9IDAsMSwyCisgICAgY29uc3QgX19tMTI4aSBIID0gX21tX21pbl9lcHU4KEYsIGtDc3Q2Nyk7ICAgLy8gY2xhbXBfbGV2ZWwgaW4gWzAuLjY3XQorCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmN0eHNbMF0sIEcpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZsZXZlbHNbMF0sIEgpOworCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmFic19sZXZlbHNbMF0sIEUwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYWJzX2xldmVsc1s4XSwgRTEpOworICB9CisgIGZvciAoOyBuIDwgcmVzLT5sYXN0OyArK24pIHsKKyAgICBjb25zdCBpbnQgY3R4ID0gY3R4c1tuXTsKKyAgICBjb25zdCBpbnQgbGV2ZWwgPSBsZXZlbHNbbl07CisgICAgY29uc3QgaW50IGZsZXZlbCA9IGFic19sZXZlbHNbbl07ICAgLy8gZnVsbCBsZXZlbAorICAgIGNvc3QgKz0gVlA4TGV2ZWxGaXhlZENvc3RzW2ZsZXZlbF0gKyB0W2xldmVsXTsgIC8vIHNpbXBsaWZpZWQgVlA4TGV2ZWxDb3N0KCkKKyAgICB0ID0gY29zdHNbbiArIDFdW2N0eF07CisgIH0KKyAgLy8gTGFzdCBjb2VmZmljaWVudCBpcyBhbHdheXMgbm9uLXplcm8KKyAgeworICAgIGNvbnN0IGludCBsZXZlbCA9IGxldmVsc1tuXTsKKyAgICBjb25zdCBpbnQgZmxldmVsID0gYWJzX2xldmVsc1tuXTsKKyAgICBhc3NlcnQoZmxldmVsICE9IDApOworICAgIGNvc3QgKz0gVlA4TGV2ZWxGaXhlZENvc3RzW2ZsZXZlbF0gKyB0W2xldmVsXTsKKyAgICBpZiAobiA8IDE1KSB7CisgICAgICBjb25zdCBpbnQgYiA9IFZQOEVuY0JhbmRzW24gKyAxXTsKKyAgICAgIGNvbnN0IGludCBjdHggPSBjdHhzW25dOworICAgICAgY29uc3QgaW50IGxhc3RfcDAgPSByZXMtPnByb2JbYl1bY3R4XVswXTsKKyAgICAgIGNvc3QgKz0gVlA4Qml0Q29zdCgwLCBsYXN0X3AwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BDb3N0SW5pdFNTRTIodm9pZCkgeworICBWUDhTZXRSZXNpZHVhbENvZWZmcyA9IFNldFJlc2lkdWFsQ29lZmZzX1NTRTI7CisgIFZQOEdldFJlc2lkdWFsQ29zdCA9IEdldFJlc2lkdWFsQ29zdF9TU0UyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcENvc3RJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2NwdS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jcHUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQwZmVlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9jcHUuYwpAQCAtMCwwICsxLDIyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENQVSBkZXRlY3Rpb24KKy8vCisvLyBBdXRob3I6IENocmlzdGlhbiBEdXZpdmllciAoY2R1dml2aWVyQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX0hBVkVfTkVPTl9SVENEKQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9BTkRST0lEX05FT04pCisjaW5jbHVkZSA8Y3B1LWZlYXR1cmVzLmg+CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTRTIgZGV0ZWN0aW9uLgorLy8KKworLy8gYXBwbGUvZGFyd2luIGdjYy00LjAuMSBkZWZpbmVzIF9fUElDX18sIGJ1dCBub3QgX19waWNfXyB3aXRoIC1mUElDLgorI2lmIChkZWZpbmVkKF9fcGljX18pIHx8IGRlZmluZWQoX19QSUNfXykpICYmIGRlZmluZWQoX19pMzg2X18pCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibW92ICUlZWJ4LCAlJWVkaVxuIgorICAgICJjcHVpZFxuIgorICAgICJ4Y2hnICUlZWRpLCAlJWVieFxuIgorICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9RCIoY3B1X2luZm9bMV0pLCAiPWMiKGNwdV9pbmZvWzJdKSwgIj1kIihjcHVfaW5mb1szXSkKKyAgICA6ICJhIihpbmZvX3R5cGUpLCAiYyIoMCkpOworfQorI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKSAmJiBcCisgICAgICAoZGVmaW5lZChfX2NvZGVfbW9kZWxfbWVkaXVtX18pIHx8IGRlZmluZWQoX19jb2RlX21vZGVsX2xhcmdlX18pKSAmJiBcCisgICAgICBkZWZpbmVkKF9fUElDX18pCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAieGNoZ3txfVx0eyUlcmJ4fSwgJXExXG4iCisgICAgImNwdWlkXG4iCisgICAgInhjaGd7cX1cdHslJXJieH0sICVxMVxuIgorICAgIDogIj1hIihjcHVfaW5mb1swXSksICI9JnIiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksCisgICAgICAiPWQiKGNwdV9pbmZvWzNdKQorICAgIDogImEiKGluZm9fdHlwZSksICJjIigwKSk7Cit9CisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBHZXRDUFVJbmZvKGludCBjcHVfaW5mb1s0XSwgaW50IGluZm9fdHlwZSkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiY3B1aWRcbiIKKyAgICA6ICI9YSIoY3B1X2luZm9bMF0pLCAiPWIiKGNwdV9pbmZvWzFdKSwgIj1jIihjcHVfaW5mb1syXSksICI9ZCIoY3B1X2luZm9bM10pCisgICAgOiAiYSIoaW5mb190eXBlKSwgImMiKDApKTsKK30KKyNlbGlmIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkgJiYgXAorICAgICAgZGVmaW5lZChfTVNDX0ZVTExfVkVSKSAmJiBfTVNDX0ZVTExfVkVSID49IDE1MDAzMDcyOSAgLy8gPj0gVlMyMDA4IFNQMQorI2luY2x1ZGUgPGludHJpbi5oPgorI2RlZmluZSBHZXRDUFVJbmZvKGluZm8sIHR5cGUpIF9fY3B1aWRleChpbmZvLCB0eXBlLCAwKSAgLy8gc2V0IGVjeD0wCisjZWxpZiBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpCisjZGVmaW5lIEdldENQVUluZm8gX19jcHVpZAorI2VuZGlmCisKKy8vIE5hQ2wgaGFzIG5vIHN1cHBvcnQgZm9yIHhnZXRidiBvciB0aGUgcmF3IG9wY29kZS4KKyNpZiAhZGVmaW5lZChfX25hdGl2ZV9jbGllbnRfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgeGdldGJ2KHZvaWQpIHsKKyAgY29uc3QgdWludDMyX3QgZWN4ID0gMDsKKyAgdWludDMyX3QgZWF4LCBlZHg7CisgIC8vIFVzZSB0aGUgcmF3IG9wY29kZSBmb3IgeGdldGJ2IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdG9vbGNoYWlucy4KKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5ieXRlIDB4MGYsIDB4MDEsIDB4ZDBcbiIKKyAgICA6ICI9YSIoZWF4KSwgIj1kIihlZHgpIDogImMiIChlY3gpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZWR4IDw8IDMyKSB8IGVheDsKK30KKyNlbGlmIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkgJiYgXAorICAgICAgZGVmaW5lZChfTVNDX0ZVTExfVkVSKSAmJiBfTVNDX0ZVTExfVkVSID49IDE2MDA0MDIxOSAgLy8gPj0gVlMyMDEwIFNQMQorI2luY2x1ZGUgPGltbWludHJpbi5oPgorI2RlZmluZSB4Z2V0YnYoKSBfeGdldGJ2KDApCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9NX0lYODYpCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgeGdldGJ2KHZvaWQpIHsKKyAgdWludDMyX3QgZWF4XywgZWR4XzsKKyAgX19hc20geworICAgIHhvciBlY3gsIGVjeCAgLy8gZWN4ID0gMAorICAgIC8vIFVzZSB0aGUgcmF3IG9wY29kZSBmb3IgeGdldGJ2IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgdG9vbGNoYWlucy4KKyAgICBfX2FzbSBfZW1pdCAweDBmIF9fYXNtIF9lbWl0IDB4MDEgX19hc20gX2VtaXQgMHhkMAorICAgIG1vdiBlYXhfLCBlYXgKKyAgICBtb3YgZWR4XywgZWR4CisgIH0KKyAgcmV0dXJuICgodWludDY0X3QpZWR4XyA8PCAzMikgfCBlYXhfOworfQorI2Vsc2UKKyNkZWZpbmUgeGdldGJ2KCkgMFUgIC8vIG5vIEFWWCBmb3Igb2xkZXIgeDY0IG9yIHVucmVjb2duaXplZCB0b29sY2hhaW5zLgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoV0VCUF9NU0NfU1NFMikKKworLy8gaGVscGVyIGZ1bmN0aW9uIGZvciBydW4tdGltZSBkZXRlY3Rpb24gb2Ygc2xvdyBTU1NFMyBwbGF0Zm9ybXMKK3N0YXRpYyBpbnQgQ2hlY2tTbG93TW9kZWwoaW50IGluZm8pIHsKKyAgLy8gVGFibGUgbGlzdGluZyBkaXNwbGF5IG1vZGVscyB3aXRoIGxvbmdlciBsYXRlbmNpZXMgZm9yIHRoZSBic3IgaW5zdHJ1Y3Rpb24KKyAgLy8gKGllIDIgY3ljbGVzIHZzIDEwLzE2IGN5Y2xlcykgYW5kIHNvbWUgU1NTRTMgaW5zdHJ1Y3Rpb25zIGxpa2UgcHNodWZiLgorICAvLyBSZWZlciB0byBJbnRlbCA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBPcHRpbWl6YXRpb24gUmVmZXJlbmNlIE1hbnVhbC4KKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Nsb3dNb2RlbHNbXSA9IHsKKyAgICAweDM3LCAweDRhLCAweDRkLCAgLy8gU2lsdmVybW9udCBNaWNyb2FyY2hpdGVjdHVyZQorICAgIDB4MWMsIDB4MjYsIDB4MjcgICAvLyBBdG9tIE1pY3JvYXJjaGl0ZWN0dXJlCisgIH07CisgIGNvbnN0IHVpbnQzMl90IG1vZGVsID0gKChpbmZvICYgMHhmMDAwMCkgPj4gMTIpIHwgKChpbmZvID4+IDQpICYgMHhmKTsKKyAgY29uc3QgdWludDMyX3QgZmFtaWx5ID0gKGluZm8gPj4gOCkgJiAweGY7CisgIGlmIChmYW1pbHkgPT0gMHgwNikgeworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa1Nsb3dNb2RlbHMpIC8gc2l6ZW9mKGtTbG93TW9kZWxzWzBdKTsgKytpKSB7CisgICAgICBpZiAobW9kZWwgPT0ga1Nsb3dNb2RlbHNbaV0pIHJldHVybiAxOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4ODZDUFVJbmZvKENQVUZlYXR1cmUgZmVhdHVyZSkgeworICBpbnQgbWF4X2NwdWlkX3ZhbHVlOworICBpbnQgY3B1X2luZm9bNF07CisgIGludCBpc19pbnRlbCA9IDA7CisKKyAgLy8gZ2V0IHRoZSBoaWdoZXN0IGZlYXR1cmUgdmFsdWUgY3B1aWQgc3VwcG9ydHMKKyAgR2V0Q1BVSW5mbyhjcHVfaW5mbywgMCk7CisgIG1heF9jcHVpZF92YWx1ZSA9IGNwdV9pbmZvWzBdOworICBpZiAobWF4X2NwdWlkX3ZhbHVlIDwgMSkgeworICAgIHJldHVybiAwOworICB9IGVsc2UgeworICAgIGNvbnN0IGludCBWRU5ET1JfSURfSU5URUxfRUJYID0gMHg3NTZlNjU0NzsgIC8vIHVuZUcKKyAgICBjb25zdCBpbnQgVkVORE9SX0lEX0lOVEVMX0VEWCA9IDB4NDk2NTZlNjk7ICAvLyBJZW5pCisgICAgY29uc3QgaW50IFZFTkRPUl9JRF9JTlRFTF9FQ1ggPSAweDZjNjU3NDZlOyAgLy8gbGV0bgorICAgIGlzX2ludGVsID0gKGNwdV9pbmZvWzFdID09IFZFTkRPUl9JRF9JTlRFTF9FQlggJiYKKyAgICAgICAgICAgICAgICBjcHVfaW5mb1syXSA9PSBWRU5ET1JfSURfSU5URUxfRUNYICYmCisgICAgICAgICAgICAgICAgY3B1X2luZm9bM10gPT0gVkVORE9SX0lEX0lOVEVMX0VEWCk7ICAgIC8vIGdlbnVpbmUgSW50ZWw/CisgIH0KKworICBHZXRDUFVJbmZvKGNwdV9pbmZvLCAxKTsKKyAgaWYgKGZlYXR1cmUgPT0ga1NTRTIpIHsKKyAgICByZXR1cm4gISEoY3B1X2luZm9bM10gJiAoMSA8PCAyNikpOworICB9CisgIGlmIChmZWF0dXJlID09IGtTU0UzKSB7CisgICAgcmV0dXJuICEhKGNwdV9pbmZvWzJdICYgKDEgPDwgMCkpOworICB9CisgIGlmIChmZWF0dXJlID09IGtTbG93U1NTRTMpIHsKKyAgICBpZiAoaXNfaW50ZWwgJiYgKGNwdV9pbmZvWzJdICYgKDEgPDwgOSkpKSB7ICAgLy8gU1NTRTM/CisgICAgICByZXR1cm4gQ2hlY2tTbG93TW9kZWwoY3B1X2luZm9bMF0pOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChmZWF0dXJlID09IGtTU0U0XzEpIHsKKyAgICByZXR1cm4gISEoY3B1X2luZm9bMl0gJiAoMSA8PCAxOSkpOworICB9CisgIGlmIChmZWF0dXJlID09IGtBVlgpIHsKKyAgICAvLyBiaXRzIDI3IChPU1hTQVZFKSAmIDI4ICgyNTYtYml0IEFWWCkKKyAgICBpZiAoKGNwdV9pbmZvWzJdICYgMHgxODAwMDAwMCkgPT0gMHgxODAwMDAwMCkgeworICAgICAgLy8gWE1NIHN0YXRlIGFuZCBZTU0gc3RhdGUgZW5hYmxlZCBieSB0aGUgT1MuCisgICAgICByZXR1cm4gKHhnZXRidigpICYgMHg2KSA9PSAweDY7CisgICAgfQorICB9CisgIGlmIChmZWF0dXJlID09IGtBVlgyKSB7CisgICAgaWYgKHg4NkNQVUluZm8oa0FWWCkgJiYgbWF4X2NwdWlkX3ZhbHVlID49IDcpIHsKKyAgICAgIEdldENQVUluZm8oY3B1X2luZm8sIDcpOworICAgICAgcmV0dXJuICEhKGNwdV9pbmZvWzFdICYgKDEgPDwgNSkpOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KK1ZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IHg4NkNQVUluZm87CisjZWxpZiBkZWZpbmVkKFdFQlBfQU5EUk9JRF9ORU9OKSAgLy8gTkI6IG5lZWRzIHRvIGJlIGJlZm9yZSBnZW5lcmljIE5FT04gdGVzdC4KK3N0YXRpYyBpbnQgQW5kcm9pZENQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7CisgIGNvbnN0IEFuZHJvaWRDcHVGYW1pbHkgY3B1X2ZhbWlseSA9IGFuZHJvaWRfZ2V0Q3B1RmFtaWx5KCk7CisgIGNvbnN0IHVpbnQ2NF90IGNwdV9mZWF0dXJlcyA9IGFuZHJvaWRfZ2V0Q3B1RmVhdHVyZXMoKTsKKyAgaWYgKGZlYXR1cmUgPT0ga05FT04pIHsKKyAgICByZXR1cm4gKGNwdV9mYW1pbHkgPT0gQU5EUk9JRF9DUFVfRkFNSUxZX0FSTSAmJgorICAgICAgICAgICAgMCAhPSAoY3B1X2ZlYXR1cmVzICYgQU5EUk9JRF9DUFVfQVJNX0ZFQVRVUkVfTkVPTikpOworICB9CisgIHJldHVybiAwOworfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gQW5kcm9pZENQVUluZm87CisjZWxpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisvLyBkZWZpbmUgYSBkdW1teSBmdW5jdGlvbiB0byBlbmFibGUgdHVybmluZyBvZmYgTkVPTiBhdCBydW50aW1lIGJ5IHNldHRpbmcKKy8vIFZQOERlY0dldENQVUluZm8gPSBOVUxMCitzdGF0aWMgaW50IGFybUNQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7CisgIGlmIChmZWF0dXJlICE9IGtORU9OKSByZXR1cm4gMDsKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgZGVmaW5lZChXRUJQX0hBVkVfTkVPTl9SVENEKQorICB7CisgICAgaW50IGhhc19uZW9uID0gMDsKKyAgICBjaGFyIGxpbmVbMjAwXTsKKyAgICBGSUxFKiBjb25zdCBjcHVpbmZvID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpOworICAgIGlmIChjcHVpbmZvID09IE5VTEwpIHJldHVybiAwOworICAgIHdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGNwdWluZm8pKSB7CisgICAgICBpZiAoIXN0cm5jbXAobGluZSwgIkZlYXR1cmVzIiwgOCkpIHsKKyAgICAgICAgaWYgKHN0cnN0cihsaW5lLCAiIG5lb24gIikgIT0gTlVMTCkgeworICAgICAgICAgIGhhc19uZW9uID0gMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBmY2xvc2UoY3B1aW5mbyk7CisgICAgcmV0dXJuIGhhc19uZW9uOworICB9CisjZWxzZQorICByZXR1cm4gMTsKKyNlbmRpZgorfQorVlA4Q1BVSW5mbyBWUDhHZXRDUFVJbmZvID0gYXJtQ1BVSW5mbzsKKyNlbGlmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKSB8fCBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKSB8fCBcCisgICAgICBkZWZpbmVkKFdFQlBfVVNFX01TQSkKK3N0YXRpYyBpbnQgbWlwc0NQVUluZm8oQ1BVRmVhdHVyZSBmZWF0dXJlKSB7CisgIGlmICgoZmVhdHVyZSA9PSBrTUlQUzMyKSB8fCAoZmVhdHVyZSA9PSBrTUlQU2RzcFIyKSB8fCAoZmVhdHVyZSA9PSBrTVNBKSkgeworICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisKK30KK1ZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IG1pcHNDUFVJbmZvOworI2Vsc2UKK1ZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbyA9IE5VTEw7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMjA3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlYy5jCkBAIC0wLDAgKzEsODkxIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU3BlZWQtY3JpdGljYWwgZGVjb2RpbmcgZnVuY3Rpb25zLCBkZWZhdWx0IHBsYWluLUMgaW1wbGVtZW50YXRpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IGNsaXBfOGIoaW50IHYpIHsKKyAgcmV0dXJuICghKHYgJiB+MHhmZikpID8gdiA6ICh2IDwgMCkgPyAwIDogMjU1OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCisKKyNkZWZpbmUgU1RPUkUoeCwgeSwgdikgXAorICBkc3RbKHgpICsgKHkpICogQlBTXSA9IGNsaXBfOGIoZHN0Wyh4KSArICh5KSAqIEJQU10gKyAoKHYpID4+IDMpKQorCisjZGVmaW5lIFNUT1JFMih5LCBkYywgZCwgYykgZG8geyAgICBcCisgIGNvbnN0IGludCBEQyA9IChkYyk7ICAgICAgICAgICAgICBcCisgIFNUT1JFKDAsIHksIERDICsgKGQpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDEsIHksIERDICsgKGMpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDIsIHksIERDIC0gKGMpKTsgICAgICAgICAgICBcCisgIFNUT1JFKDMsIHksIERDIC0gKGQpKTsgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1VTDEoYSkgKCgoKGEpICogMjAwOTEpID4+IDE2KSArIChhKSkKKyNkZWZpbmUgTVVMMihhKSAoKChhKSAqIDM1NDY4KSA+PiAxNikKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZV9DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IENbNCAqIDRdLCAqdG1wOworICBpbnQgaTsKKyAgdG1wID0gQzsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeyAgICAvLyB2ZXJ0aWNhbCBwYXNzCisgICAgY29uc3QgaW50IGEgPSBpblswXSArIGluWzhdOyAgICAvLyBbLTQwOTYsIDQwOTRdCisgICAgY29uc3QgaW50IGIgPSBpblswXSAtIGluWzhdOyAgICAvLyBbLTQwOTUsIDQwOTVdCisgICAgY29uc3QgaW50IGMgPSBNVUwyKGluWzRdKSAtIE1VTDEoaW5bMTJdKTsgICAvLyBbLTM3ODMsIDM3ODNdCisgICAgY29uc3QgaW50IGQgPSBNVUwxKGluWzRdKSArIE1VTDIoaW5bMTJdKTsgICAvLyBbLTM3ODUsIDM3ODFdCisgICAgdG1wWzBdID0gYSArIGQ7ICAgLy8gWy03ODgxLCA3ODc1XQorICAgIHRtcFsxXSA9IGIgKyBjOyAgIC8vIFstNzg3OCwgNzg3OF0KKyAgICB0bXBbMl0gPSBiIC0gYzsgICAvLyBbLTc4NzgsIDc4NzhdCisgICAgdG1wWzNdID0gYSAtIGQ7ICAgLy8gWy03ODc3LCA3ODc5XQorICAgIHRtcCArPSA0OworICAgIGluKys7CisgIH0KKyAgLy8gRWFjaCBwYXNzIGlzIGV4cGFuZGluZyB0aGUgZHluYW1pYyByYW5nZSBieSB+My44NSAodXBwZXIgYm91bmQpLgorICAvLyBUaGUgZXhhY3QgdmFsdWUgaXMgKDIuICsgKDIwMDkxICsgMzU0NjgpIC8gNjU1MzYpLgorICAvLyBBZnRlciB0aGUgc2Vjb25kIHBhc3MsIG1heGltdW0gaW50ZXJ2YWwgaXMgWy0zNzk0LCAzNzk0XSwgYXNzdW1pbmcKKyAgLy8gYW4gaW5wdXQgaW4gWy0yMDQ4LCAyMDQ3XSBpbnRlcnZhbC4gV2UgdGhlbiBuZWVkIHRvIGFkZCBhIGRzdCB2YWx1ZQorICAvLyBpbiB0aGUgWzAsIDI1NV0gcmFuZ2UuCisgIC8vIEluIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvLCB0aGUgaW5wdXQgdG8gY2xpcF84YigpIGNhbiBiZSBhcyBsYXJnZSBhcworICAvLyBbLTYwNzEzLCA2MDk2OF0uCisgIHRtcCA9IEM7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsgICAgLy8gaG9yaXpvbnRhbCBwYXNzCisgICAgY29uc3QgaW50IGRjID0gdG1wWzBdICsgNDsKKyAgICBjb25zdCBpbnQgYSA9ICBkYyArICB0bXBbOF07CisgICAgY29uc3QgaW50IGIgPSAgZGMgLSAgdG1wWzhdOworICAgIGNvbnN0IGludCBjID0gTVVMMih0bXBbNF0pIC0gTVVMMSh0bXBbMTJdKTsKKyAgICBjb25zdCBpbnQgZCA9IE1VTDEodG1wWzRdKSArIE1VTDIodG1wWzEyXSk7CisgICAgU1RPUkUoMCwgMCwgYSArIGQpOworICAgIFNUT1JFKDEsIDAsIGIgKyBjKTsKKyAgICBTVE9SRSgyLCAwLCBiIC0gYyk7CisgICAgU1RPUkUoMywgMCwgYSAtIGQpOworICAgIHRtcCsrOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8gU2ltcGxpZmllZCB0cmFuc2Zvcm0gd2hlbiBvbmx5IGluWzBdLCBpblsxXSBhbmQgaW5bNF0gYXJlIG5vbi16ZXJvCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1BQzNfQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBhID0gaW5bMF0gKyA0OworICBjb25zdCBpbnQgYzQgPSBNVUwyKGluWzRdKTsKKyAgY29uc3QgaW50IGQ0ID0gTVVMMShpbls0XSk7CisgIGNvbnN0IGludCBjMSA9IE1VTDIoaW5bMV0pOworICBjb25zdCBpbnQgZDEgPSBNVUwxKGluWzFdKTsKKyAgU1RPUkUyKDAsIGEgKyBkNCwgZDEsIGMxKTsKKyAgU1RPUkUyKDEsIGEgKyBjNCwgZDEsIGMxKTsKKyAgU1RPUkUyKDIsIGEgLSBjNCwgZDEsIGMxKTsKKyAgU1RPUkUyKDMsIGEgLSBkNCwgZDEsIGMxKTsKK30KKyN1bmRlZiBNVUwxCisjdW5kZWYgTVVMMgorI3VuZGVmIFNUT1JFMgorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud29fQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIFRyYW5zZm9ybU9uZV9DKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lX0MoaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1VVl9DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgVlA4VHJhbnNmb3JtKGluICsgMCAqIDE2LCBkc3QsIDEpOworICBWUDhUcmFuc2Zvcm0oaW4gKyAyICogMTYsIGRzdCArIDQgKiBCUFMsIDEpOworfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVHJhbnNmb3JtRENfQyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludCBEQyA9IGluWzBdICsgNDsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICBTVE9SRShpLCBqLCBEQyk7CisgICAgfQorICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtRENVVl9DKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaWYgKGluWzAgKiAxNl0pIFZQOFRyYW5zZm9ybURDKGluICsgMCAqIDE2LCBkc3QpOworICBpZiAoaW5bMSAqIDE2XSkgVlA4VHJhbnNmb3JtREMoaW4gKyAxICogMTYsIGRzdCArIDQpOworICBpZiAoaW5bMiAqIDE2XSkgVlA4VHJhbnNmb3JtREMoaW4gKyAyICogMTYsIGRzdCArIDQgKiBCUFMpOworICBpZiAoaW5bMyAqIDE2XSkgVlA4VHJhbnNmb3JtREMoaW4gKyAzICogMTYsIGRzdCArIDQgKiBCUFMgKyA0KTsKK30KKworI3VuZGVmIFNUT1JFCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYXJhZ3JhcGggMTQuMworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVHJhbnNmb3JtV0hUX0MoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICBpbnQgdG1wWzE2XTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBpbnQgYTAgPSBpblswICsgaV0gKyBpblsxMiArIGldOworICAgIGNvbnN0IGludCBhMSA9IGluWzQgKyBpXSArIGluWyA4ICsgaV07CisgICAgY29uc3QgaW50IGEyID0gaW5bNCArIGldIC0gaW5bIDggKyBpXTsKKyAgICBjb25zdCBpbnQgYTMgPSBpblswICsgaV0gLSBpblsxMiArIGldOworICAgIHRtcFswICArIGldID0gYTAgKyBhMTsKKyAgICB0bXBbOCAgKyBpXSA9IGEwIC0gYTE7CisgICAgdG1wWzQgICsgaV0gPSBhMyArIGEyOworICAgIHRtcFsxMiArIGldID0gYTMgLSBhMjsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgY29uc3QgaW50IGRjID0gdG1wWzAgKyBpICogNF0gKyAzOyAgICAvLyB3LyByb3VuZGVyCisgICAgY29uc3QgaW50IGEwID0gZGMgICAgICAgICAgICAgKyB0bXBbMyArIGkgKiA0XTsKKyAgICBjb25zdCBpbnQgYTEgPSB0bXBbMSArIGkgKiA0XSArIHRtcFsyICsgaSAqIDRdOworICAgIGNvbnN0IGludCBhMiA9IHRtcFsxICsgaSAqIDRdIC0gdG1wWzIgKyBpICogNF07CisgICAgY29uc3QgaW50IGEzID0gZGMgICAgICAgICAgICAgLSB0bXBbMyArIGkgKiA0XTsKKyAgICBvdXRbIDBdID0gKGEwICsgYTEpID4+IDM7CisgICAgb3V0WzE2XSA9IChhMyArIGEyKSA+PiAzOworICAgIG91dFszMl0gPSAoYTAgLSBhMSkgPj4gMzsKKyAgICBvdXRbNDhdID0gKGEzIC0gYTIpID4+IDM7CisgICAgb3V0ICs9IDY0OworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKwordm9pZCAoKlZQOFRyYW5zZm9ybVdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbih1aW50OF90KiBkc3QsIGludCBzaXplKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IGRzdCAtIEJQUzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcDAgPSBWUDhrY2xpcDEgLSB0b3BbLTFdOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXAgPSBjbGlwMCArIGRzdFstMV07CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHNpemU7ICsreCkgeworICAgICAgZHN0W3hdID0gY2xpcFt0b3BbeF1dOworICAgIH0KKyAgICBkc3QgKz0gQlBTOworICB9Cit9CitzdGF0aWMgdm9pZCBUTTRfQyh1aW50OF90KiBkc3QpICAgeyBUcnVlTW90aW9uKGRzdCwgNCk7IH0KK3N0YXRpYyB2b2lkIFRNOHV2X0ModWludDhfdCogZHN0KSB7IFRydWVNb3Rpb24oZHN0LCA4KTsgfQorc3RhdGljIHZvaWQgVE0xNl9DKHVpbnQ4X3QqIGRzdCkgIHsgVHJ1ZU1vdGlvbihkc3QsIDE2KTsgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMTZ4MTYKKworc3RhdGljIHZvaWQgVkUxNl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gdmVydGljYWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgbWVtY3B5KGRzdCArIGogKiBCUFMsIGRzdCAtIEJQUywgMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFMTZfQyh1aW50OF90KiBkc3QpIHsgICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDE2OyBqID4gMDsgLS1qKSB7CisgICAgbWVtc2V0KGRzdCwgZHN0Wy0xXSwgMTYpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0MTYoaW50IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBtZW1zZXQoZHN0ICsgaiAqIEJQUywgdiwgMTYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDMTZfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gREMKKyAgaW50IERDID0gMTY7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIERDICs9IGRzdFstMSArIGogKiBCUFNdICsgZHN0W2ogLSBCUFNdOworICB9CisgIFB1dDE2KERDID4+IDUsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggdG9wIHNhbXBsZXMgbm90IGF2YWlsYWJsZQorICBpbnQgREMgPSA4OworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBEQyArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICBQdXQxNihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0X0ModWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIGxlZnQgc2FtcGxlcyBub3QgYXZhaWxhYmxlCisgIGludCBEQyA9IDg7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIERDICs9IGRzdFtpIC0gQlBTXTsKKyAgfQorICBQdXQxNihEQyA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BMZWZ0X0ModWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIG5vIHRvcCBhbmQgbGVmdCBzYW1wbGVzCisgIFB1dDE2KDB4ODAsIGRzdCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworVlA4UHJlZEZ1bmMgVlA4UHJlZEx1bWExNltOVU1fQl9EQ19NT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQKKworI2RlZmluZSBBVkczKGEsIGIsIGMpICgodWludDhfdCkoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKSkKKyNkZWZpbmUgQVZHMihhLCBiKSAoKChhKSArIChiKSArIDEpID4+IDEpCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBWRTRfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOworICBjb25zdCB1aW50OF90IHZhbHNbNF0gPSB7CisgICAgQVZHMyh0b3BbLTFdLCB0b3BbMF0sIHRvcFsxXSksCisgICAgQVZHMyh0b3BbIDBdLCB0b3BbMV0sIHRvcFsyXSksCisgICAgQVZHMyh0b3BbIDFdLCB0b3BbMl0sIHRvcFszXSksCisgICAgQVZHMyh0b3BbIDJdLCB0b3BbM10sIHRvcFs0XSkKKyAgfTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBtZW1jcHkoZHN0ICsgaSAqIEJQUywgdmFscywgc2l6ZW9mKHZhbHMpKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIEhFNF9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBob3Jpem9udGFsCisgIGNvbnN0IGludCBBID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbLTFdOworICBjb25zdCBpbnQgQyA9IGRzdFstMSArIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBFID0gZHN0Wy0xICsgMyAqIEJQU107CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoQSwgQiwgQykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEIsIEMsIEQpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhDLCBELCBFKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoRCwgRSwgRSkpOworfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgREM0X0ModWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgdWludDMyX3QgZGMgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgZGMgKz0gZHN0W2kgLSBCUFNdICsgZHN0Wy0xICsgaSAqIEJQU107CisgIGRjID4+PSAzOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBtZW1zZXQoZHN0ICsgaSAqIEJQUywgZGMsIDQpOworfQorCitzdGF0aWMgdm9pZCBSRDRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLXJpZ2h0CisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgaW50IEEgPSBkc3RbMCAtIEJQU107CisgIGNvbnN0IGludCBCID0gZHN0WzEgLSBCUFNdOworICBjb25zdCBpbnQgQyA9IGRzdFsyIC0gQlBTXTsKKyAgY29uc3QgaW50IEQgPSBkc3RbMyAtIEJQU107CisgIERTVCgwLCAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgxLCAzKSA9IERTVCgwLCAyKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoSSwgSiwgSyk7CisgIERTVCgyLCAzKSA9IERTVCgxLCAyKSA9IERTVCgwLCAxKSAgICAgICAgICAgICA9IEFWRzMoWCwgSSwgSik7CisgIERTVCgzLCAzKSA9IERTVCgyLCAyKSA9IERTVCgxLCAxKSA9IERTVCgwLCAwKSA9IEFWRzMoQSwgWCwgSSk7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IERTVCgyLCAxKSA9IERTVCgxLCAwKSA9IEFWRzMoQiwgQSwgWCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIERTVCgzLCAxKSA9IERTVCgyLCAwKSA9IEFWRzMoQywgQiwgQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTVCgzLCAwKSA9IEFWRzMoRCwgQywgQik7Cit9CisKK3N0YXRpYyB2b2lkIExENF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107CisgIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOworICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKKyAgY29uc3QgaW50IEUgPSBkc3RbNCAtIEJQU107CisgIGNvbnN0IGludCBGID0gZHN0WzUgLSBCUFNdOworICBjb25zdCBpbnQgRyA9IGRzdFs2IC0gQlBTXTsKKyAgY29uc3QgaW50IEggPSBkc3RbNyAtIEJQU107CisgIERTVCgwLCAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAwKSA9IERTVCgwLCAxKSAgICAgICAgICAgICAgICAgICAgICAgICA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAwKSA9IERTVCgxLCAxKSA9IERTVCgwLCAyKSAgICAgICAgICAgICA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAwKSA9IERTVCgyLCAxKSA9IERTVCgxLCAyKSA9IERTVCgwLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAxKSA9IERTVCgyLCAyKSA9IERTVCgxLCAzKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIERTVCgzLCAyKSA9IERTVCgyLCAzKSA9IEFWRzMoRiwgRywgSCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRywgSCwgSCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworc3RhdGljIHZvaWQgVlI0X0ModWludDhfdCogZHN0KSB7ICAgLy8gVmVydGljYWwtUmlnaHQKKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107CisgIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOworICBjb25zdCBpbnQgRCA9IGRzdFszIC0gQlBTXTsKKyAgRFNUKDAsIDApID0gRFNUKDEsIDIpID0gQVZHMihYLCBBKTsKKyAgRFNUKDEsIDApID0gRFNUKDIsIDIpID0gQVZHMihBLCBCKTsKKyAgRFNUKDIsIDApID0gRFNUKDMsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMihDLCBEKTsKKworICBEU1QoMCwgMykgPSAgICAgICAgICAgICBBVkczKEssIEosIEkpOworICBEU1QoMCwgMikgPSAgICAgICAgICAgICBBVkczKEosIEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEksIFgsIEEpOworICBEU1QoMSwgMSkgPSBEU1QoMiwgMykgPSBBVkczKFgsIEEsIEIpOworICBEU1QoMiwgMSkgPSBEU1QoMywgMykgPSBBVkczKEEsIEIsIEMpOworICBEU1QoMywgMSkgPSAgICAgICAgICAgICBBVkczKEIsIEMsIEQpOworfQorCitzdGF0aWMgdm9pZCBWTDRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBWZXJ0aWNhbC1MZWZ0CisgIGNvbnN0IGludCBBID0gZHN0WzAgLSBCUFNdOworICBjb25zdCBpbnQgQiA9IGRzdFsxIC0gQlBTXTsKKyAgY29uc3QgaW50IEMgPSBkc3RbMiAtIEJQU107CisgIGNvbnN0IGludCBEID0gZHN0WzMgLSBCUFNdOworICBjb25zdCBpbnQgRSA9IGRzdFs0IC0gQlBTXTsKKyAgY29uc3QgaW50IEYgPSBkc3RbNSAtIEJQU107CisgIGNvbnN0IGludCBHID0gZHN0WzYgLSBCUFNdOworICBjb25zdCBpbnQgSCA9IGRzdFs3IC0gQlBTXTsKKyAgRFNUKDAsIDApID0gICAgICAgICAgICAgQVZHMihBLCBCKTsKKyAgRFNUKDEsIDApID0gRFNUKDAsIDIpID0gQVZHMihCLCBDKTsKKyAgRFNUKDIsIDApID0gRFNUKDEsIDIpID0gQVZHMihDLCBEKTsKKyAgRFNUKDMsIDApID0gRFNUKDIsIDIpID0gQVZHMihELCBFKTsKKworICBEU1QoMCwgMSkgPSAgICAgICAgICAgICBBVkczKEEsIEIsIEMpOworICBEU1QoMSwgMSkgPSBEU1QoMCwgMykgPSBBVkczKEIsIEMsIEQpOworICBEU1QoMiwgMSkgPSBEU1QoMSwgMykgPSBBVkczKEMsIEQsIEUpOworICBEU1QoMywgMSkgPSBEU1QoMiwgMykgPSBBVkczKEQsIEUsIEYpOworICAgICAgICAgICAgICBEU1QoMywgMikgPSBBVkczKEUsIEYsIEcpOworICAgICAgICAgICAgICBEU1QoMywgMykgPSBBVkczKEYsIEcsIEgpOworfQorCitzdGF0aWMgdm9pZCBIVTRfQyh1aW50OF90KiBkc3QpIHsgICAvLyBIb3Jpem9udGFsLVVwCisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgICAgRFNUKDAsIDMpID0gRFNUKDEsIDMpID0gRFNUKDIsIDMpID0gRFNUKDMsIDMpID0gTDsKK30KKworc3RhdGljIHZvaWQgSEQ0X0ModWludDhfdCogZHN0KSB7ICAvLyBIb3Jpem9udGFsLURvd24KKyAgY29uc3QgaW50IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgaW50IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgaW50IEsgPSBkc3RbLTEgKyAyICogQlBTXTsKKyAgY29uc3QgaW50IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgY29uc3QgaW50IFggPSBkc3RbLTEgLSBCUFNdOworICBjb25zdCBpbnQgQSA9IGRzdFswIC0gQlBTXTsKKyAgY29uc3QgaW50IEIgPSBkc3RbMSAtIEJQU107CisgIGNvbnN0IGludCBDID0gZHN0WzIgLSBCUFNdOworCisgIERTVCgwLCAwKSA9IERTVCgyLCAxKSA9IEFWRzIoSSwgWCk7CisgIERTVCgwLCAxKSA9IERTVCgyLCAyKSA9IEFWRzIoSiwgSSk7CisgIERTVCgwLCAyKSA9IERTVCgyLCAzKSA9IEFWRzIoSywgSik7CisgIERTVCgwLCAzKSAgICAgICAgICAgICA9IEFWRzIoTCwgSyk7CisKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDIsIDApICAgICAgICAgICAgID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDEsIDApID0gRFNUKDMsIDEpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDMsIDIpID0gQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDEsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDEsIDMpICAgICAgICAgICAgID0gQVZHMyhMLCBLLCBKKTsKK30KKworI3VuZGVmIERTVAorI3VuZGVmIEFWRzMKKyN1bmRlZiBBVkcyCisKK1ZQOFByZWRGdW5jIFZQOFByZWRMdW1hNFtOVU1fQk1PREVTXTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVkU4dXZfQyh1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBtZW1jcHkoZHN0ICsgaiAqIEJQUywgZHN0IC0gQlBTLCA4KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTh1dl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbWVtc2V0KGRzdCwgZHN0Wy0xXSwgOCk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCisvLyBoZWxwZXIgZm9yIGNocm9tYS1EQyBwcmVkaWN0aW9ucworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0OHg4dXYodWludDhfdCB2YWx1ZSwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIHZhbHVlLCA4KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzh1dl9DKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gREMKKyAgaW50IGRjMCA9IDg7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMwICs9IGRzdFtpIC0gQlBTXSArIGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIFB1dDh4OHV2KGRjMCA+PiA0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdF9DKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDIHdpdGggbm8gbGVmdCBzYW1wbGVzCisgIGludCBkYzAgPSA0OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworICAgIGRjMCArPSBkc3RbaSAtIEJQU107CisgIH0KKyAgUHV0OHg4dXYoZGMwID4+IDMsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BfQyh1aW50OF90KiBkc3QpIHsgIC8vIERDIHdpdGggbm8gdG9wIHNhbXBsZXMKKyAgaW50IGRjMCA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMwICs9IGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIFB1dDh4OHV2KGRjMCA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wTGVmdF9DKHVpbnQ4X3QqIGRzdCkgeyAgICAvLyBEQyB3aXRoIG5vdGhpbmcKKyAgUHV0OHg4dXYoMHg4MCwgZHN0KTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCitWUDhQcmVkRnVuYyBWUDhQcmVkQ2hyb21hOFtOVU1fQl9EQ19NT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFZGdlIGZpbHRlcmluZyBmdW5jdGlvbnMKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXIyX0ModWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKSArIFZQOGtzY2xpcDFbcDEgLSBxMV07ICAvLyBpbiBbLTg5Myw4OTJdCisgIGNvbnN0IGludCBhMSA9IFZQOGtzY2xpcDJbKGEgKyA0KSA+PiAzXTsgICAgICAgICAgICAvLyBpbiBbLTE2LDE1XQorICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIHBbLXN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAwXSA9IFZQOGtjbGlwMVtxMCAtIGExXTsKK30KKworLy8gNCBwaXhlbHMgaW4sIDQgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9GaWx0ZXI0X0ModWludDhfdCogcCwgaW50IHN0ZXApIHsKKyAgY29uc3QgaW50IHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKTsKKyAgY29uc3QgaW50IGExID0gVlA4a3NjbGlwMlsoYSArIDQpID4+IDNdOworICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIGNvbnN0IGludCBhMyA9IChhMSArIDEpID4+IDE7CisgIHBbLTIqc3RlcF0gPSBWUDhrY2xpcDFbcDEgKyBhM107CisgIHBbLSAgc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMl07CisgIHBbICAgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07CisgIHBbICAgc3RlcF0gPSBWUDhrY2xpcDFbcTEgLSBhM107Cit9CisKKy8vIDYgcGl4ZWxzIGluLCA2IHBpeGVscyBvdXQKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvRmlsdGVyNl9DKHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMiA9IHBbLTMqc3RlcF0sIHAxID0gcFstMipzdGVwXSwgcDAgPSBwWy1zdGVwXTsKKyAgY29uc3QgaW50IHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMipzdGVwXTsKKyAgY29uc3QgaW50IGEgPSBWUDhrc2NsaXAxWzMgKiAocTAgLSBwMCkgKyBWUDhrc2NsaXAxW3AxIC0gcTFdXTsKKyAgLy8gYSBpcyBpbiBbLTEyOCwxMjddLCBhMSBpbiBbLTI3LDI3XSwgYTIgaW4gWy0xOCwxOF0gYW5kIGEzIGluIFstOSw5XQorICBjb25zdCBpbnQgYTEgPSAoMjcgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgzICogYSArIDcpICogOSkgPj4gNworICBjb25zdCBpbnQgYTIgPSAoMTggKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgyICogYSArIDcpICogOSkgPj4gNworICBjb25zdCBpbnQgYTMgPSAoOSAgKiBhICsgNjMpID4+IDc7ICAvLyBlcS4gdG8gKCgxICogYSArIDcpICogOSkgPj4gNworICBwWy0zKnN0ZXBdID0gVlA4a2NsaXAxW3AyICsgYTNdOworICBwWy0yKnN0ZXBdID0gVlA4a2NsaXAxW3AxICsgYTJdOworICBwWy0gIHN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTFdOworICBwWyAgICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworICBwWyAgIHN0ZXBdID0gVlA4a2NsaXAxW3ExIC0gYTJdOworICBwWyAyKnN0ZXBdID0gVlA4a2NsaXAxW3EyIC0gYTNdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEhldihjb25zdCB1aW50OF90KiBwLCBpbnQgc3RlcCwgaW50IHRocmVzaCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yKnN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgcmV0dXJuIChWUDhrYWJzMFtwMSAtIHAwXSA+IHRocmVzaCkgfHwgKFZQOGthYnMwW3ExIC0gcTBdID4gdGhyZXNoKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE5lZWRzRmlsdGVyX0MoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0KSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIHJldHVybiAoKDQgKiBWUDhrYWJzMFtwMCAtIHEwXSArIFZQOGthYnMwW3AxIC0gcTFdKSA8PSB0KTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE5lZWRzRmlsdGVyMl9DKGNvbnN0IHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgdCwgaW50IGl0KSB7CisgIGNvbnN0IGludCBwMyA9IHBbLTQgKiBzdGVwXSwgcDIgPSBwWy0zICogc3RlcF0sIHAxID0gcFstMiAqIHN0ZXBdOworICBjb25zdCBpbnQgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdOworICBjb25zdCBpbnQgcTEgPSBwW3N0ZXBdLCBxMiA9IHBbMiAqIHN0ZXBdLCBxMyA9IHBbMyAqIHN0ZXBdOworICBpZiAoKDQgKiBWUDhrYWJzMFtwMCAtIHEwXSArIFZQOGthYnMwW3AxIC0gcTFdKSA+IHQpIHJldHVybiAwOworICByZXR1cm4gVlA4a2FiczBbcDMgLSBwMl0gPD0gaXQgJiYgVlA4a2FiczBbcDIgLSBwMV0gPD0gaXQgJiYKKyAgICAgICAgIFZQOGthYnMwW3AxIC0gcDBdIDw9IGl0ICYmIFZQOGthYnMwW3EzIC0gcTJdIDw9IGl0ICYmCisgICAgICAgICBWUDhrYWJzMFtxMiAtIHExXSA8PSBpdCAmJiBWUDhrYWJzMFtxMSAtIHEwXSA8PSBpdDsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2X0ModWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAoTmVlZHNGaWx0ZXJfQyhwICsgaSwgc3RyaWRlLCB0aHJlc2gyKSkgeworICAgICAgRG9GaWx0ZXIyX0MocCArIGksIHN0cmlkZSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNl9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKE5lZWRzRmlsdGVyX0MocCArIGkgKiBzdHJpZGUsIDEsIHRocmVzaDIpKSB7CisgICAgICBEb0ZpbHRlcjJfQyhwICsgaSAqIHN0cmlkZSwgMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmlfQyh1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIFNpbXBsZVZGaWx0ZXIxNl9DKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpX0ModWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTZfQyhwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbHRlckxvb3AyNl9DKHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChOZWVkc0ZpbHRlcjJfQyhwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKEhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBEb0ZpbHRlcjJfQyhwLCBoc3RyaWRlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERvRmlsdGVyNl9DKHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0X0ModWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoc3RyaWRlLCBpbnQgdnN0cmlkZSwgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZXZfdGhyZXNoKSB7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIHdoaWxlIChzaXplLS0gPiAwKSB7CisgICAgaWYgKE5lZWRzRmlsdGVyMl9DKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoSGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIERvRmlsdGVyMl9DKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRG9GaWx0ZXI0X0MocCwgaHN0cmlkZSk7CisgICAgICB9CisgICAgfQorICAgIHAgKz0gdnN0cmlkZTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNl9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2X0MocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2X0ModWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjZfQyhwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlcjE2aV9DKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIEZpbHRlckxvb3AyNF9DKHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpX0ModWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgRmlsdGVyTG9vcDI0X0MocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4X0ModWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNl9DKHUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2X0Modiwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4X0ModWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNl9DKHUsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2X0ModiwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aV9DKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0X0ModSArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI0X0ModiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCitzdGF0aWMgdm9pZCBIRmlsdGVyOGlfQyh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNF9DKHUgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNF9DKHYgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBEaXRoZXJDb21iaW5lOHg4X0MoY29uc3QgdWludDhfdCogZGl0aGVyLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgICBjb25zdCBpbnQgZGVsdGEwID0gZGl0aGVyW2ldIC0gVlA4X0RJVEhFUl9BTVBfQ0VOVEVSOworICAgICAgY29uc3QgaW50IGRlbHRhMSA9CisgICAgICAgICAgKGRlbHRhMCArIFZQOF9ESVRIRVJfREVTQ0FMRV9ST1VOREVSKSA+PiBWUDhfRElUSEVSX0RFU0NBTEU7CisgICAgICBkc3RbaV0gPSBjbGlwXzhiKChpbnQpZHN0W2ldICsgZGVsdGExKTsKKyAgICB9CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgICAgZGl0aGVyICs9IDg7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4RGVjSWRjdDIgVlA4VHJhbnNmb3JtOworVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1BQzM7CitWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybVVWOworVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQzsKK1ZQOERlY0lkY3QgVlA4VHJhbnNmb3JtRENVVjsKKworVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OworVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2OworVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhWRmlsdGVyODsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7CitWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOworVlA4THVtYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjE2aTsKK1ZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOworVlA4Q2hyb21hRmlsdGVyRnVuYyBWUDhIRmlsdGVyOGk7CitWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZVZGaWx0ZXIxNjsKK1ZQOFNpbXBsZUZpbHRlckZ1bmMgVlA4U2ltcGxlSEZpbHRlcjE2OworVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOworVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTZpOworCit2b2lkICgqVlA4RGl0aGVyQ29tYmluZTh4OCkoY29uc3QgdWludDhfdCogZGl0aGVyLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUpOworCitleHRlcm4gdm9pZCBWUDhEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4RHNwSW5pdCkgeworICBWUDhJbml0Q2xpcFRhYmxlcygpOworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhUcmFuc2Zvcm1XSFQgPSBUcmFuc2Zvcm1XSFRfQzsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvX0M7CisgIFZQOFRyYW5zZm9ybURDID0gVHJhbnNmb3JtRENfQzsKKyAgVlA4VHJhbnNmb3JtQUMzID0gVHJhbnNmb3JtQUMzX0M7CisjZW5kaWYKKyAgVlA4VHJhbnNmb3JtVVYgPSBUcmFuc2Zvcm1VVl9DOworICBWUDhUcmFuc2Zvcm1EQ1VWID0gVHJhbnNmb3JtRENVVl9DOworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTZfQzsKKyAgVlA4VkZpbHRlcjE2aSA9IFZGaWx0ZXIxNmlfQzsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2X0M7CisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjhfQzsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpX0M7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNl9DOworICBWUDhTaW1wbGVIRmlsdGVyMTYgPSBTaW1wbGVIRmlsdGVyMTZfQzsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmlfQzsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmlfQzsKKyNlbmRpZgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpX0M7CisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjhfQzsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpX0M7CisjZW5kaWYKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4UHJlZEx1bWE0WzBdID0gREM0X0M7CisgIFZQOFByZWRMdW1hNFsxXSA9IFRNNF9DOworICBWUDhQcmVkTHVtYTRbMl0gPSBWRTRfQzsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0X0M7CisgIFZQOFByZWRMdW1hNFs2XSA9IExENF9DOworI2VuZGlmCisKKyAgVlA4UHJlZEx1bWE0WzNdID0gSEU0X0M7CisgIFZQOFByZWRMdW1hNFs1XSA9IFZSNF9DOworICBWUDhQcmVkTHVtYTRbN10gPSBWTDRfQzsKKyAgVlA4UHJlZEx1bWE0WzhdID0gSEQ0X0M7CisgIFZQOFByZWRMdW1hNFs5XSA9IEhVNF9DOworCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBWUDhQcmVkTHVtYTE2WzBdID0gREMxNl9DOworICBWUDhQcmVkTHVtYTE2WzFdID0gVE0xNl9DOworICBWUDhQcmVkTHVtYTE2WzJdID0gVkUxNl9DOworICBWUDhQcmVkTHVtYTE2WzNdID0gSEUxNl9DOworICBWUDhQcmVkTHVtYTE2WzRdID0gREMxNk5vVG9wX0M7CisgIFZQOFByZWRMdW1hMTZbNV0gPSBEQzE2Tm9MZWZ0X0M7CisgIFZQOFByZWRMdW1hMTZbNl0gPSBEQzE2Tm9Ub3BMZWZ0X0M7CisKKyAgVlA4UHJlZENocm9tYThbMF0gPSBEQzh1dl9DOworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRNOHV2X0M7CisgIFZQOFByZWRDaHJvbWE4WzJdID0gVkU4dXZfQzsKKyAgVlA4UHJlZENocm9tYThbM10gPSBIRTh1dl9DOworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3BfQzsKKyAgVlA4UHJlZENocm9tYThbNV0gPSBEQzh1dk5vTGVmdF9DOworICBWUDhQcmVkQ2hyb21hOFs2XSA9IERDOHV2Tm9Ub3BMZWZ0X0M7CisjZW5kaWYKKworICBWUDhEaXRoZXJDb21iaW5lOHg4ID0gRGl0aGVyQ29tYmluZTh4OF9DOworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhEc3BJbml0U1NFMigpOworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgICBWUDhEc3BJbml0U1NFNDEoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBWUDhEc3BJbml0TUlQUzMyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgVlA4RHNwSW5pdE1JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNU0EpKSB7CisgICAgICBWUDhEc3BJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBWUDhEc3BJbml0TkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoVlA4VHJhbnNmb3JtV0hUICE9IE5VTEwpOworICBhc3NlcnQoVlA4VHJhbnNmb3JtICE9IE5VTEwpOworICBhc3NlcnQoVlA4VHJhbnNmb3JtREMgIT0gTlVMTCk7CisgIGFzc2VydChWUDhUcmFuc2Zvcm1BQzMgIT0gTlVMTCk7CisgIGFzc2VydChWUDhUcmFuc2Zvcm1VViAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFRyYW5zZm9ybURDVVYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhWRmlsdGVyMTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhIRmlsdGVyMTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhWRmlsdGVyOCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEhGaWx0ZXI4ICE9IE5VTEwpOworICBhc3NlcnQoVlA4VkZpbHRlcjE2aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEhGaWx0ZXIxNmkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhWRmlsdGVyOGkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhIRmlsdGVyOGkgIT0gTlVMTCk7CisgIGFzc2VydChWUDhTaW1wbGVWRmlsdGVyMTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhTaW1wbGVIRmlsdGVyMTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhTaW1wbGVWRmlsdGVyMTZpICE9IE5VTEwpOworICBhc3NlcnQoVlA4U2ltcGxlSEZpbHRlcjE2aSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFswXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFsxXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFsyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFszXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs2XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs3XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs4XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hNFs5XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNlsyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkTHVtYTE2WzRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZEx1bWExNls1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRMdW1hMTZbNl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFswXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFszXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFByZWRDaHJvbWE4WzRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4UHJlZENocm9tYThbNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhQcmVkQ2hyb21hOFs2XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOERpdGhlckNvbWJpbmU4eDggIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19jbGlwX3RhYmxlcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdiNzRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfY2xpcF90YWJsZXMuYwpAQCAtMCwwICsxLDM2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIENsaXBwaW5nIHRhYmxlcyBmb3IgZmlsdGVyaW5nCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKy8vIGRlZmluZSB0byAwIHRvIGhhdmUgcnVuLXRpbWUgdGFibGUgaW5pdGlhbGl6YXRpb24KKyNpZiAhZGVmaW5lZChVU0VfU1RBVElDX1RBQkxFUykKKyNkZWZpbmUgVVNFX1NUQVRJQ19UQUJMRVMgMSAgIC8vIEFMVEVSTkFURV9DT0RFCisjZW5kaWYKKworI2lmIChVU0VfU1RBVElDX1RBQkxFUyA9PSAxKQorCitzdGF0aWMgY29uc3QgdWludDhfdCBhYnMwWzI1NSArIDI1NSArIDFdID0geworICAweGZmLCAweGZlLCAweGZkLCAweGZjLCAweGZiLCAweGZhLCAweGY5LCAweGY4LCAweGY3LCAweGY2LCAweGY1LCAweGY0LAorICAweGYzLCAweGYyLCAweGYxLCAweGYwLCAweGVmLCAweGVlLCAweGVkLCAweGVjLCAweGViLCAweGVhLCAweGU5LCAweGU4LAorICAweGU3LCAweGU2LCAweGU1LCAweGU0LCAweGUzLCAweGUyLCAweGUxLCAweGUwLCAweGRmLCAweGRlLCAweGRkLCAweGRjLAorICAweGRiLCAweGRhLCAweGQ5LCAweGQ4LCAweGQ3LCAweGQ2LCAweGQ1LCAweGQ0LCAweGQzLCAweGQyLCAweGQxLCAweGQwLAorICAweGNmLCAweGNlLCAweGNkLCAweGNjLCAweGNiLCAweGNhLCAweGM5LCAweGM4LCAweGM3LCAweGM2LCAweGM1LCAweGM0LAorICAweGMzLCAweGMyLCAweGMxLCAweGMwLCAweGJmLCAweGJlLCAweGJkLCAweGJjLCAweGJiLCAweGJhLCAweGI5LCAweGI4LAorICAweGI3LCAweGI2LCAweGI1LCAweGI0LCAweGIzLCAweGIyLCAweGIxLCAweGIwLCAweGFmLCAweGFlLCAweGFkLCAweGFjLAorICAweGFiLCAweGFhLCAweGE5LCAweGE4LCAweGE3LCAweGE2LCAweGE1LCAweGE0LCAweGEzLCAweGEyLCAweGExLCAweGEwLAorICAweDlmLCAweDllLCAweDlkLCAweDljLCAweDliLCAweDlhLCAweDk5LCAweDk4LCAweDk3LCAweDk2LCAweDk1LCAweDk0LAorICAweDkzLCAweDkyLCAweDkxLCAweDkwLCAweDhmLCAweDhlLCAweDhkLCAweDhjLCAweDhiLCAweDhhLCAweDg5LCAweDg4LAorICAweDg3LCAweDg2LCAweDg1LCAweDg0LCAweDgzLCAweDgyLCAweDgxLCAweDgwLCAweDdmLCAweDdlLCAweDdkLCAweDdjLAorICAweDdiLCAweDdhLCAweDc5LCAweDc4LCAweDc3LCAweDc2LCAweDc1LCAweDc0LCAweDczLCAweDcyLCAweDcxLCAweDcwLAorICAweDZmLCAweDZlLCAweDZkLCAweDZjLCAweDZiLCAweDZhLCAweDY5LCAweDY4LCAweDY3LCAweDY2LCAweDY1LCAweDY0LAorICAweDYzLCAweDYyLCAweDYxLCAweDYwLCAweDVmLCAweDVlLCAweDVkLCAweDVjLCAweDViLCAweDVhLCAweDU5LCAweDU4LAorICAweDU3LCAweDU2LCAweDU1LCAweDU0LCAweDUzLCAweDUyLCAweDUxLCAweDUwLCAweDRmLCAweDRlLCAweDRkLCAweDRjLAorICAweDRiLCAweDRhLCAweDQ5LCAweDQ4LCAweDQ3LCAweDQ2LCAweDQ1LCAweDQ0LCAweDQzLCAweDQyLCAweDQxLCAweDQwLAorICAweDNmLCAweDNlLCAweDNkLCAweDNjLCAweDNiLCAweDNhLCAweDM5LCAweDM4LCAweDM3LCAweDM2LCAweDM1LCAweDM0LAorICAweDMzLCAweDMyLCAweDMxLCAweDMwLCAweDJmLCAweDJlLCAweDJkLCAweDJjLCAweDJiLCAweDJhLCAweDI5LCAweDI4LAorICAweDI3LCAweDI2LCAweDI1LCAweDI0LCAweDIzLCAweDIyLCAweDIxLCAweDIwLCAweDFmLCAweDFlLCAweDFkLCAweDFjLAorICAweDFiLCAweDFhLCAweDE5LCAweDE4LCAweDE3LCAweDE2LCAweDE1LCAweDE0LCAweDEzLCAweDEyLCAweDExLCAweDEwLAorICAweDBmLCAweDBlLCAweDBkLCAweDBjLCAweDBiLCAweDBhLCAweDA5LCAweDA4LCAweDA3LCAweDA2LCAweDA1LCAweDA0LAorICAweDAzLCAweDAyLCAweDAxLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LCAweDA4LAorICAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LAorICAweDE1LCAweDE2LCAweDE3LCAweDE4LCAweDE5LCAweDFhLCAweDFiLCAweDFjLCAweDFkLCAweDFlLCAweDFmLCAweDIwLAorICAweDIxLCAweDIyLCAweDIzLCAweDI0LCAweDI1LCAweDI2LCAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDJiLCAweDJjLAorICAweDJkLCAweDJlLCAweDJmLCAweDMwLCAweDMxLCAweDMyLCAweDMzLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LAorICAweDM5LCAweDNhLCAweDNiLCAweDNjLCAweDNkLCAweDNlLCAweDNmLCAweDQwLCAweDQxLCAweDQyLCAweDQzLCAweDQ0LAorICAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LCAweDQ5LCAweDRhLCAweDRiLCAweDRjLCAweDRkLCAweDRlLCAweDRmLCAweDUwLAorICAweDUxLCAweDUyLCAweDUzLCAweDU0LCAweDU1LCAweDU2LCAweDU3LCAweDU4LCAweDU5LCAweDVhLCAweDViLCAweDVjLAorICAweDVkLCAweDVlLCAweDVmLCAweDYwLCAweDYxLCAweDYyLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAweDY5LCAweDZhLCAweDZiLCAweDZjLCAweDZkLCAweDZlLCAweDZmLCAweDcwLCAweDcxLCAweDcyLCAweDczLCAweDc0LAorICAweDc1LCAweDc2LCAweDc3LCAweDc4LCAweDc5LCAweDdhLCAweDdiLCAweDdjLCAweDdkLCAweDdlLCAweDdmLCAweDgwLAorICAweDgxLCAweDgyLCAweDgzLCAweDg0LCAweDg1LCAweDg2LCAweDg3LCAweDg4LCAweDg5LCAweDhhLCAweDhiLCAweDhjLAorICAweDhkLCAweDhlLCAweDhmLCAweDkwLCAweDkxLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAweDk5LCAweDlhLCAweDliLCAweDljLCAweDlkLCAweDllLCAweDlmLCAweGEwLCAweGExLCAweGEyLCAweGEzLCAweGE0LAorICAweGE1LCAweGE2LCAweGE3LCAweGE4LCAweGE5LCAweGFhLCAweGFiLCAweGFjLCAweGFkLCAweGFlLCAweGFmLCAweGIwLAorICAweGIxLCAweGIyLCAweGIzLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGJiLCAweGJjLAorICAweGJkLCAweGJlLCAweGJmLCAweGMwLCAweGMxLCAweGMyLCAweGMzLCAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LAorICAweGM5LCAweGNhLCAweGNiLCAweGNjLCAweGNkLCAweGNlLCAweGNmLCAweGQwLCAweGQxLCAweGQyLCAweGQzLCAweGQ0LAorICAweGQ1LCAweGQ2LCAweGQ3LCAweGQ4LCAweGQ5LCAweGRhLCAweGRiLCAweGRjLCAweGRkLCAweGRlLCAweGRmLCAweGUwLAorICAweGUxLCAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGViLCAweGVjLAorICAweGVkLCAweGVlLCAweGVmLCAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAweGY5LCAweGZhLCAweGZiLCAweGZjLCAweGZkLCAweGZlLCAweGZmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBzY2xpcDFbMTAyMCArIDEwMjAgKyAxXSA9IHsKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKKyAgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywKKyAgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwKKyAgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwKKyAgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywKKyAgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywKKyAgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwKKyAgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwKKyAgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywKKyAgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywKKyAgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwKKyAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwKKyAgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwgMHgxNSwgMHgxNiwgMHgxNywKKyAgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwgMHgyMSwgMHgyMiwgMHgyMywKKyAgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywgMHgyZCwgMHgyZSwgMHgyZiwKKyAgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwgMHgzOSwgMHgzYSwgMHgzYiwKKyAgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NSwgMHg0NiwgMHg0NywKKyAgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwgMHg1MSwgMHg1MiwgMHg1MywKKyAgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywgMHg1ZCwgMHg1ZSwgMHg1ZiwKKyAgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwgMHg2OSwgMHg2YSwgMHg2YiwKKyAgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwgMHg3NSwgMHg3NiwgMHg3NywKKyAgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwKKyAgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZiwgMHg3ZgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc2NsaXAyWzExMiArIDExMiArIDFdID0geworICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLCAweGYwLAorICAweGYwLCAweGYxLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LCAweGY5LCAweGZhLCAweGZiLAorICAweGZjLCAweGZkLCAweGZlLCAweGZmLCAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LCAweDA2LCAweDA3LAorICAweDA4LCAweDA5LCAweDBhLCAweDBiLCAweDBjLCAweDBkLCAweDBlLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLAorICAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmLCAweDBmCit9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBjbGlwMVsyNTUgKyA1MTEgKyAxXSA9IHsKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwKKyAgMHgwOSwgMHgwYSwgMHgwYiwgMHgwYywgMHgwZCwgMHgwZSwgMHgwZiwgMHgxMCwgMHgxMSwgMHgxMiwgMHgxMywgMHgxNCwKKyAgMHgxNSwgMHgxNiwgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgxYiwgMHgxYywgMHgxZCwgMHgxZSwgMHgxZiwgMHgyMCwKKyAgMHgyMSwgMHgyMiwgMHgyMywgMHgyNCwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgyYiwgMHgyYywKKyAgMHgyZCwgMHgyZSwgMHgyZiwgMHgzMCwgMHgzMSwgMHgzMiwgMHgzMywgMHgzNCwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgMHgzOSwgMHgzYSwgMHgzYiwgMHgzYywgMHgzZCwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0MSwgMHg0MiwgMHg0MywgMHg0NCwKKyAgMHg0NSwgMHg0NiwgMHg0NywgMHg0OCwgMHg0OSwgMHg0YSwgMHg0YiwgMHg0YywgMHg0ZCwgMHg0ZSwgMHg0ZiwgMHg1MCwKKyAgMHg1MSwgMHg1MiwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg1YiwgMHg1YywKKyAgMHg1ZCwgMHg1ZSwgMHg1ZiwgMHg2MCwgMHg2MSwgMHg2MiwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgMHg2OSwgMHg2YSwgMHg2YiwgMHg2YywgMHg2ZCwgMHg2ZSwgMHg2ZiwgMHg3MCwgMHg3MSwgMHg3MiwgMHg3MywgMHg3NCwKKyAgMHg3NSwgMHg3NiwgMHg3NywgMHg3OCwgMHg3OSwgMHg3YSwgMHg3YiwgMHg3YywgMHg3ZCwgMHg3ZSwgMHg3ZiwgMHg4MCwKKyAgMHg4MSwgMHg4MiwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwgMHg4YSwgMHg4YiwgMHg4YywKKyAgMHg4ZCwgMHg4ZSwgMHg4ZiwgMHg5MCwgMHg5MSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwgMHg5NywgMHg5OCwKKyAgMHg5OSwgMHg5YSwgMHg5YiwgMHg5YywgMHg5ZCwgMHg5ZSwgMHg5ZiwgMHhhMCwgMHhhMSwgMHhhMiwgMHhhMywgMHhhNCwKKyAgMHhhNSwgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhhYiwgMHhhYywgMHhhZCwgMHhhZSwgMHhhZiwgMHhiMCwKKyAgMHhiMSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhiYiwgMHhiYywKKyAgMHhiZCwgMHhiZSwgMHhiZiwgMHhjMCwgMHhjMSwgMHhjMiwgMHhjMywgMHhjNCwgMHhjNSwgMHhjNiwgMHhjNywgMHhjOCwKKyAgMHhjOSwgMHhjYSwgMHhjYiwgMHhjYywgMHhjZCwgMHhjZSwgMHhjZiwgMHhkMCwgMHhkMSwgMHhkMiwgMHhkMywgMHhkNCwKKyAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhkYiwgMHhkYywgMHhkZCwgMHhkZSwgMHhkZiwgMHhlMCwKKyAgMHhlMSwgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywKKyAgMHhlZCwgMHhlZSwgMHhlZiwgMHhmMCwgMHhmMSwgMHhmMiwgMHhmMywgMHhmNCwgMHhmNSwgMHhmNiwgMHhmNywgMHhmOCwKKyAgMHhmOSwgMHhmYSwgMHhmYiwgMHhmYywgMHhmZCwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKyAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworI2Vsc2UKKworLy8gdW5pbml0aWFsaXplZCB0YWJsZXMKK3N0YXRpYyB1aW50OF90IGFiczBbMjU1ICsgMjU1ICsgMV07CitzdGF0aWMgaW50OF90IHNjbGlwMVsxMDIwICsgMTAyMCArIDFdOworc3RhdGljIGludDhfdCBzY2xpcDJbMTEyICsgMTEyICsgMV07CitzdGF0aWMgdWludDhfdCBjbGlwMVsyNTUgKyA1MTEgKyAxXTsKKworLy8gV2UgZGVjbGFyZSB0aGlzIHZhcmlhYmxlICd2b2xhdGlsZScgdG8gcHJldmVudCBpbnN0cnVjdGlvbiByZW9yZGVyaW5nCisvLyBhbmQgbWFrZSBzdXJlIGl0J3Mgc2V0IHRvIHRydWUgX2xhc3RfIChzbyBhcyB0byBiZSB0aHJlYWQtc2FmZSkKK3N0YXRpYyB2b2xhdGlsZSBpbnQgdGFibGVzX29rID0gMDsKKworI2VuZGlmICAgIC8vIFVTRV9TVEFUSUNfVEFCTEVTCisKK2NvbnN0IGludDhfdCogY29uc3QgVlA4a3NjbGlwMSA9IChjb25zdCBpbnQ4X3QqKSZzY2xpcDFbMTAyMF07Citjb25zdCBpbnQ4X3QqIGNvbnN0IFZQOGtzY2xpcDIgPSAoY29uc3QgaW50OF90Kikmc2NsaXAyWzExMl07Citjb25zdCB1aW50OF90KiBjb25zdCBWUDhrY2xpcDEgPSAmY2xpcDFbMjU1XTsKK2NvbnN0IHVpbnQ4X3QqIGNvbnN0IFZQOGthYnMwID0gJmFiczBbMjU1XTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEluaXRDbGlwVGFibGVzKHZvaWQpIHsKKyNpZiAoVVNFX1NUQVRJQ19UQUJMRVMgPT0gMCkKKyAgaW50IGk7CisgIGlmICghdGFibGVzX29rKSB7CisgICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTU7ICsraSkgeworICAgICAgYWJzMFsyNTUgKyBpXSA9IChpIDwgMCkgPyAtaSA6IGk7CisgICAgfQorICAgIGZvciAoaSA9IC0xMDIwOyBpIDw9IDEwMjA7ICsraSkgeworICAgICAgc2NsaXAxWzEwMjAgKyBpXSA9IChpIDwgLTEyOCkgPyAtMTI4IDogKGkgPiAxMjcpID8gMTI3IDogaTsKKyAgICB9CisgICAgZm9yIChpID0gLTExMjsgaSA8PSAxMTI7ICsraSkgeworICAgICAgc2NsaXAyWzExMiArIGldID0gKGkgPCAtMTYpID8gLTE2IDogKGkgPiAxNSkgPyAxNSA6IGk7CisgICAgfQorICAgIGZvciAoaSA9IC0yNTU7IGkgPD0gMjU1ICsgMjU1OyArK2kpIHsKKyAgICAgIGNsaXAxWzI1NSArIGldID0gKGkgPCAwKSA/IDAgOiAoaSA+IDI1NSkgPyAyNTUgOiBpOworICAgIH0KKyAgICB0YWJsZXNfb2sgPSAxOworICB9CisjZW5kaWYgICAgLy8gVVNFX1NUQVRJQ19UQUJMRVMKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHMzMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwczMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRlNzA5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHMzMi5jCkBAIC0wLDAgKzEsNTg3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIGRzcCBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlICJzcmMvZHNwL21pcHNfbWFjcm8uaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgYWJzX21pcHMzMihpbnQgeCkgeworICBjb25zdCBpbnQgc2lnbiA9IHggPj4gMzE7CisgIHJldHVybiAoeCBeIHNpZ24pIC0gc2lnbjsKK30KKworLy8gNCBwaXhlbHMgaW4sIDIgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyMih1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICBjb25zdCBpbnQgYSA9IDMgKiAocTAgLSBwMCkgKyBWUDhrc2NsaXAxW3AxIC0gcTFdOworICBjb25zdCBpbnQgYTEgPSBWUDhrc2NsaXAyWyhhICsgNCkgPj4gM107CisgIGNvbnN0IGludCBhMiA9IFZQOGtzY2xpcDJbKGEgKyAzKSA+PiAzXTsKKyAgcFstc3RlcF0gPSBWUDhrY2xpcDFbcDAgKyBhMl07CisgIHBbICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworfQorCisvLyA0IHBpeGVscyBpbiwgNCBwaXhlbHMgb3V0CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBkb19maWx0ZXI0KHVpbnQ4X3QqIHAsIGludCBzdGVwKSB7CisgIGNvbnN0IGludCBwMSA9IHBbLTIgKiBzdGVwXSwgcDAgPSBwWy1zdGVwXSwgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF07CisgIGNvbnN0IGludCBhID0gMyAqIChxMCAtIHAwKTsKKyAgY29uc3QgaW50IGExID0gVlA4a3NjbGlwMlsoYSArIDQpID4+IDNdOworICBjb25zdCBpbnQgYTIgPSBWUDhrc2NsaXAyWyhhICsgMykgPj4gM107CisgIGNvbnN0IGludCBhMyA9IChhMSArIDEpID4+IDE7CisgIHBbLTIgKiBzdGVwXSA9IFZQOGtjbGlwMVtwMSArIGEzXTsKKyAgcFstICAgIHN0ZXBdID0gVlA4a2NsaXAxW3AwICsgYTJdOworICBwWyAgICAgICAgMF0gPSBWUDhrY2xpcDFbcTAgLSBhMV07CisgIHBbICAgICBzdGVwXSA9IFZQOGtjbGlwMVtxMSAtIGEzXTsKK30KKworLy8gNiBwaXhlbHMgaW4sIDYgcGl4ZWxzIG91dAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgZG9fZmlsdGVyNih1aW50OF90KiBwLCBpbnQgc3RlcCkgeworICBjb25zdCBpbnQgcDIgPSBwWy0zICogc3RlcF0sIHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdOworICBjb25zdCBpbnQgcTAgPSBwWzBdLCBxMSA9IHBbc3RlcF0sIHEyID0gcFsyICogc3RlcF07CisgIGNvbnN0IGludCBhID0gVlA4a3NjbGlwMVszICogKHEwIC0gcDApICsgVlA4a3NjbGlwMVtwMSAtIHExXV07CisgIC8vIGEgaXMgaW4gWy0xMjgsMTI3XSwgYTEgaW4gWy0yNywyN10sIGEyIGluIFstMTgsMThdIGFuZCBhMyBpbiBbLTksOV0KKyAgY29uc3QgaW50IGExID0gKDI3ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMyAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEyID0gKDE4ICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMiAqIGEgKyA3KSAqIDkpID4+IDcKKyAgY29uc3QgaW50IGEzID0gKDkgICogYSArIDYzKSA+PiA3OyAgLy8gZXEuIHRvICgoMSAqIGEgKyA3KSAqIDkpID4+IDcKKyAgcFstMyAqIHN0ZXBdID0gVlA4a2NsaXAxW3AyICsgYTNdOworICBwWy0yICogc3RlcF0gPSBWUDhrY2xpcDFbcDEgKyBhMl07CisgIHBbLSAgICBzdGVwXSA9IFZQOGtjbGlwMVtwMCArIGExXTsKKyAgcFsgICAgICAgIDBdID0gVlA4a2NsaXAxW3EwIC0gYTFdOworICBwWyAgICAgc3RlcF0gPSBWUDhrY2xpcDFbcTEgLSBhMl07CisgIHBbIDIgKiBzdGVwXSA9IFZQOGtjbGlwMVtxMiAtIGEzXTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBoZXYoY29uc3QgdWludDhfdCogcCwgaW50IHN0ZXAsIGludCB0aHJlc2gpIHsKKyAgY29uc3QgaW50IHAxID0gcFstMiAqIHN0ZXBdLCBwMCA9IHBbLXN0ZXBdLCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXTsKKyAgcmV0dXJuIChhYnNfbWlwczMyKHAxIC0gcDApID4gdGhyZXNoKSB8fCAoYWJzX21pcHMzMihxMSAtIHEwKSA+IHRocmVzaCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgbmVlZHNfZmlsdGVyKGNvbnN0IHVpbnQ4X3QqIHAsIGludCBzdGVwLCBpbnQgdCkgeworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF0sIHEwID0gcFswXSwgcTEgPSBwW3N0ZXBdOworICByZXR1cm4gKCg0ICogYWJzX21pcHMzMihwMCAtIHEwKSArIGFic19taXBzMzIocDEgLSBxMSkpIDw9IHQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IG5lZWRzX2ZpbHRlcjIoY29uc3QgdWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHQsIGludCBpdCkgeworICBjb25zdCBpbnQgcDMgPSBwWy00ICogc3RlcF0sIHAyID0gcFstMyAqIHN0ZXBdOworICBjb25zdCBpbnQgcDEgPSBwWy0yICogc3RlcF0sIHAwID0gcFstc3RlcF07CisgIGNvbnN0IGludCBxMCA9IHBbMF0sIHExID0gcFtzdGVwXSwgcTIgPSBwWzIgKiBzdGVwXSwgcTMgPSBwWzMgKiBzdGVwXTsKKyAgaWYgKCg0ICogYWJzX21pcHMzMihwMCAtIHEwKSArIGFic19taXBzMzIocDEgLSBxMSkpID4gdCkgeworICAgIHJldHVybiAwOworICB9CisgIHJldHVybiBhYnNfbWlwczMyKHAzIC0gcDIpIDw9IGl0ICYmIGFic19taXBzMzIocDIgLSBwMSkgPD0gaXQgJiYKKyAgICAgICAgIGFic19taXBzMzIocDEgLSBwMCkgPD0gaXQgJiYgYWJzX21pcHMzMihxMyAtIHEyKSA8PSBpdCAmJgorICAgICAgICAgYWJzX21pcHMzMihxMiAtIHExKSA8PSBpdCAmJiBhYnNfbWlwczMyKHExIC0gcTApIDw9IGl0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjYodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCBpbnQgdGhyZXNoMiA9IDIgKiB0aHJlc2ggKyAxOworICB3aGlsZSAoc2l6ZS0tID4gMCkgeworICAgIGlmIChuZWVkc19maWx0ZXIyKHAsIGhzdHJpZGUsIHRocmVzaDIsIGl0aHJlc2gpKSB7CisgICAgICBpZiAoaGV2KHAsIGhzdHJpZGUsIGhldl90aHJlc2gpKSB7CisgICAgICAgIGRvX2ZpbHRlcjIocCwgaHN0cmlkZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBkb19maWx0ZXI2KHAsIGhzdHJpZGUpOworICAgICAgfQorICAgIH0KKyAgICBwICs9IHZzdHJpZGU7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI0KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgd2hpbGUgKHNpemUtLSA+IDApIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyMihwLCBoc3RyaWRlLCB0aHJlc2gyLCBpdGhyZXNoKSkgeworICAgICAgaWYgKGhldihwLCBoc3RyaWRlLCBoZXZfdGhyZXNoKSkgeworICAgICAgICBkb19maWx0ZXIyKHAsIGhzdHJpZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZG9fZmlsdGVyNChwLCBoc3RyaWRlKTsKKyAgICAgIH0KKyAgICB9CisgICAgcCArPSB2c3RyaWRlOworICB9Cit9CisKKy8vIG9uIG1hY3JvYmxvY2sgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNihwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnQsIGZvciBjaHJvbWEgZmlsdGVyaW5nCitzdGF0aWMgdm9pZCBWRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4KHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHUsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgRmlsdGVyTG9vcDI2KHYsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQgKiBzdHJpZGUsIHN0cmlkZSwgMSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNCh1ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjQodiArIDQsIDEsIHN0cmlkZSwgOCwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0ICogc3RyaWRlOworICAgIEZpbHRlckxvb3AyNChwLCBzdHJpZGUsIDEsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIEZpbHRlckxvb3AyNChwLCAxLCBzdHJpZGUsIDE2LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpLCBzdHJpZGUsIHRocmVzaDIpKSB7CisgICAgICBkb19maWx0ZXIyKHAgKyBpLCBzdHJpZGUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICBpZiAobmVlZHNfZmlsdGVyKHAgKyBpICogc3RyaWRlLCAxLCB0aHJlc2gyKSkgeworICAgICAgZG9fZmlsdGVyMihwICsgaSAqIHN0cmlkZSwgMSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmkodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBTaW1wbGVIRmlsdGVyMTYocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZShjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNDsKKyAgaW50IHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKyAgaW50MTZfdCogcF9pbiA9IChpbnQxNl90KilpbjsKKworICAvLyBsb29wcyB1bnJvbGxlZCBhbmQgbWVyZ2VkIHRvIGF2b2lkIHVzYWdlIG9mIHRtcCBidWZmZXIKKyAgLy8gYW5kIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3RhbGxzLiBNVUwgbWFjcm8gaXMgd3JpdHRlbgorICAvLyBpbiBhc3NlbWJsZXIgYW5kIGlubGluZWQKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibGggICAgICAgJVt0ZW1wMF0sICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA4XSwgIDE2KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDRdLCAgOCglW2luXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTJdLCAyNCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDBdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOF0sICAlW3RlbXA0XSwgICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDEyXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sICVba0MyXSAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxXSwgIDIoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDVdLCAgMTAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wOV0sICAxOCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxM10sIDI2KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMl0sICA0KCVbaW5dKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXA2XSwgIDEyKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDEwXSwgMjAoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTRdLCAyOCglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAlW3RlbXAxMl0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOF0sICAlW3RlbXAxNl0sICVbdGVtcDRdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDE2XSwgJVt0ZW1wNF0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMV0sICAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDldICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAzXSwgIDYoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxoICAgICAgICVbdGVtcDddLCAgMTQoJVtpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGggICAgICAgJVt0ZW1wMTFdLCAyMiglW2luXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaCAgICAgICAlW3RlbXAxNV0sIDMwKCVbaW5dKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEyXSwgJVt0ZW1wMF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA5XSwgICVbdGVtcDVdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTNdLCAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDldLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAxM10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDEzXSwgJVt0ZW1wMV0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDE0XSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNl0sICVbdGVtcDVdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA1XSwgICVbdGVtcDE2XSwgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE2XSwgJVt0ZW1wMl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxMF0sICVbdGVtcDZdLCAgJVtrQzJdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAlW2tDMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxNF0sICVbdGVtcDE0XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMTBdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDEwXSwgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAlW3RlbXAxNF0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxNl0sICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA2XSwgICVbdGVtcDE2XSwgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE0XSwgJVt0ZW1wMl0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxN10sICVbdGVtcDE1XSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXAzXSwgICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDExXSwgJVt0ZW1wN10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCA0ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgIDQgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgNCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTddLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMV0sICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE1XSwgJVt0ZW1wM10sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxMV0sICVbdGVtcDE2XSwgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDddLCAgJVt0ZW1wMTZdLCAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTZdLCAlW3RlbXA4XSwgICVbdGVtcDEwXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDEwXSwgJVt0ZW1wOV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxMV0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDExXSwgJVt0ZW1wMTFdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE3XSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxN10sICVbdGVtcDEwXSwgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wOV0sICAlW3RlbXAxMV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMl0sICVbdGVtcDE0XSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxMl0sICVbdGVtcDEyXSwgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTNdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wOV0sICAlW3RlbXAxNV0sICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA5XSwgICVbdGVtcDldLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMTNdLCAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0sIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA5XSwgICVbdGVtcDE0XSwgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTNdLCAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTRdLCAlW3RlbXAwXSwgICVbdGVtcDJdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMl0gICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMTNdLCAlW3RlbXAzXSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxM10sICVbdGVtcDJdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDNdLCAgJVt0ZW1wMV0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMl0sICAlW3RlbXA0XSwgICVbdGVtcDZdICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgJVt0ZW1wNl0gICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNV0sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAibXVsICAgICAgJVt0ZW1wMV0sICAlW3RlbXA3XSwgICVba0MxXSAgICAgICAgICAgICBcblx0IgorICAgICJtdWwgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVtrQzFdICAgICAgICAgICAgIFxuXHQiCisgICAgIm11bCAgICAgICVbdGVtcDddLCAgJVt0ZW1wN10sICAlW2tDMl0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wNl0sICAlW3RlbXA2XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgMTYgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAxNiAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgIDE2ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxXSwgICVbdGVtcDZdLCAgJVt0ZW1wMV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDddLCAgJVt0ZW1wNV0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wNV0sICAlW3RlbXAxNl0sICVbdGVtcDExXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDExXSwgJVt0ZW1wOF0sICAlW3RlbXAxN10gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDE3XSAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDE3XSwgJVt0ZW1wMTBdLCAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wMTBdLCAlW3RlbXAxMF0sICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNV0sICVbdGVtcDEyXSwgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTJdLCAlW3RlbXA5XSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTddLCAlW3RlbXAxN10sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDEwXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTVdLCAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMl0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA5XSwgICVbdGVtcDE0XSwgJVt0ZW1wM10gICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICVbdGVtcDE0XSwgJVt0ZW1wMTRdLCAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wM10sICAlW3RlbXAwXSwgICVbdGVtcDEzXSAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wOV0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTRdLCAlW3RlbXAxNF0sIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTNdLCAlW3RlbXAyXSwgICVbdGVtcDddICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgJVt0ZW1wN10gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDddLCAgJVt0ZW1wNF0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgJVt0ZW1wNF0sICAlW3RlbXA0XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxM10sICVbdGVtcDEzXSwgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAzICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wN10sICAlW3RlbXA3XSwgIDMgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgMyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICVbdGVtcDZdLCAgJHplcm8sICAgICAyNTUgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMV0sICAwKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wNV0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxXSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA1XSwgIDFmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE4XSwgMSswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMV0sICAwKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDExXSwgJVt0ZW1wMThdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxOF0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxMV0sIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMThdLCAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDFdLCAgMiswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMThdLCAxKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgJVt0ZW1wOF0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wMV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMThdLCAlW3RlbXAxXSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA4XSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMV0sICAlW3RlbXA2XSwgICVbdGVtcDE4XSAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDE4XSwgMyswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wMV0sICAyKzAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxOF0sICVbdGVtcDE4XSwgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMThdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxOF0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxNl0sIDRmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMThdLCAlW3RlbXAxOF0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMThdLCAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE4XSwgMyswKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMisxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTddICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAxNV0gICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDEyXSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTBdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDVmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wOF0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA4XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDZmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA4XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wOF0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiNjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wMTFdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxMV0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDE2XSwgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTZdLCAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMThdLCA3ZiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxXSAgICAgICAgICAgXG5cdCIKKyAgIjc6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxN10sIDhmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDE1XSAgICAgICAgICBcblx0IgorICAiODogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCsxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzEqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMysxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMisyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wOV0gICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXAzXSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDBdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMTRdICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wOF0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMV0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDExXSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTZdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAxNl0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDlmICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiOTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE3XSwgMTBmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA4XSwgICVbdGVtcDZdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICIxMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTJdLCAxMWYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgIjExOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA5XSwgIDEyZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAiMTI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCsyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzIqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMysyKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wNV0sICAwKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJsYnUgICAgICAlW3RlbXA4XSwgIDErMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgImxidSAgICAgICVbdGVtcDExXSwgMiszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgJVt0ZW1wMTZdLCAzKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgJVt0ZW1wMTNdICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAlW3RlbXA3XSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgJVt0ZW1wMTFdLCAlW3RlbXAxMV0sICVbdGVtcDRdICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAlW3RlbXAxNl0sICVbdGVtcDE2XSwgJVt0ZW1wMl0gICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE4XSwgJVt0ZW1wNV0sICA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMV0sICAlW3RlbXA1XSwgIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxN10sICVbdGVtcDhdLCAgOCAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDE1XSwgJVt0ZW1wOF0sICAzMSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wMTJdLCAlW3RlbXAxMV0sIDggICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAlW3RlbXAxMF0sICVbdGVtcDExXSwgMzEgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICVbdGVtcDldLCAgJVt0ZW1wMTZdLCA4ICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgJVt0ZW1wM10sICAlW3RlbXAxNl0sIDMxICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXAxOF0sIDEzZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDVdLCAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wNV0sICAlW3RlbXA2XSwgICVbdGVtcDFdICAgICAgICAgICBcblx0IgorICAiMTM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcXogICAgICVbdGVtcDE3XSwgMTRmICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICVbdGVtcDhdICAgICAgICAgICBcblx0IgorICAgICJtb3Z6ICAgICAlW3RlbXA4XSwgICVbdGVtcDZdLCAgJVt0ZW1wMTVdICAgICAgICAgIFxuXHQiCisgICIxNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgJVt0ZW1wMTJdLCAxNWYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ4b3IgICAgICAlW3RlbXAxMV0sICVbdGVtcDExXSwgJVt0ZW1wMTFdICAgICAgICAgIFxuXHQiCisgICAgIm1vdnogICAgICVbdGVtcDExXSwgJVt0ZW1wNl0sICAlW3RlbXAxMF0gICAgICAgICAgXG5cdCIKKyAgIjE1OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXF6ICAgICAlW3RlbXA5XSwgIDE2ZiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAgICVbdGVtcDE2XSwgJVt0ZW1wMTZdLCAlW3RlbXAxNl0gICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgJVt0ZW1wMTZdLCAlW3RlbXA2XSwgICVbdGVtcDNdICAgICAgICAgICBcblx0IgorICAiMTY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDVdLCAgMCszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKyAgICAic2IgICAgICAgJVt0ZW1wOF0sICAxKzMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICBcblx0IgorICAgICJzYiAgICAgICAlW3RlbXAxMV0sIDIrMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgIFxuXHQiCisgICAgInNiICAgICAgICVbdGVtcDE2XSwgMyszKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgXG5cdCIKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSksCisgICAgICBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLAorICAgICAgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksIFt0ZW1wMTddIj0mciIodGVtcDE3KSwKKyAgICAgIFt0ZW1wMThdIj0mciIodGVtcDE4KQorICAgIDogW2luXSJyIihwX2luKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtVHdvKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsIGludCBkb190d28pIHsKKyAgVHJhbnNmb3JtT25lKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lKGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOEluaXRDbGlwVGFibGVzKCk7CisKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvOworCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2OworICBWUDhWRmlsdGVyOCA9IFZGaWx0ZXI4OworICBWUDhIRmlsdGVyOCA9IEhGaWx0ZXI4OworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aTsKKyAgVlA4SEZpbHRlcjE2aSA9IEhGaWx0ZXIxNmk7CisgIFZQOFZGaWx0ZXI4aSA9IFZGaWx0ZXI4aTsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpOworCisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2OworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aTsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmk7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5MzZiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSw5OTQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorCisjaW5jbHVkZSAic3JjL2RzcC9taXBzX21hY3JvLmgiCisKK3N0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CitzdGF0aWMgY29uc3QgaW50IGtDMiA9IDM1NDY4OworCisjZGVmaW5lIE1VTChhLCBiKSAoKChhKSAqIChiKSkgPj4gMTYpCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybURDKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMDsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICAibGggICAgICAgICAgICAgICAlW3RlbXA1XSwgIDAoJVtpbl0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgNCAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMTYsIDE2ICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgMyAgICAgICAgICAgXG5cdCIKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMSwgdGVtcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDMsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0KQorICAgIFNUT1JFX1NBVF9TVU1fWDIodGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywKKyAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwgdGVtcDUsIHRlbXA1LCB0ZW1wNSwKKyAgICAgICAgICAgICAgICAgICAgIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xMCgpCisgICAgOiBbaW5dInIiKGluKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IGEgPSBpblswXSArIDQ7CisgIGludCBjNCA9IE1VTChpbls0XSwga0MyKTsKKyAgY29uc3QgaW50IGQ0ID0gTVVMKGluWzRdLCBrQzEpOworICBjb25zdCBpbnQgYzEgPSBNVUwoaW5bMV0sIGtDMik7CisgIGNvbnN0IGludCBkMSA9IE1VTChpblsxXSwga0MxKTsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAxNywgdGVtcDE4OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJpbnMgICAgICAgICAgICAgICVbYzRdLCAgICAgICVbZDRdLCAgICAgMTYsICAgICAgIDE2ICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wMV0sICAgJVthXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA0XSwgICAlW2QxXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAyLCB0ZW1wMywgdGVtcDEsIGM0KQorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDVdLCAgICVbYzFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU0hJRlRfUl9TVU1fWDIodGVtcDEsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAyLCB0ZW1wOSwgdGVtcDEwLCB0ZW1wNCwKKyAgICAgICAgICAgICAgICAgICB0ZW1wMiwgdGVtcDIsIHRlbXAzLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNCwgdGVtcDUpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMywgdGVtcDUsIHRlbXAxMSwgdGVtcDEyLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wMTMsIHRlbXAxNCwgdGVtcDMsIHRlbXAxNSwgdGVtcDUsIHRlbXAxNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTEsIHRlbXAxNywgdGVtcDMsIHRlbXA1LCB0ZW1wMTEsIHRlbXAxMikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDEyLCB0ZW1wMTgsIHRlbXA3LCB0ZW1wNiwgdGVtcDEsIHRlbXA4LCB0ZW1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDQsIHRlbXA3LCB0ZW1wNiwgdGVtcDEwLCB0ZW1wOSkKKyAgICBTVE9SRV9TQVRfU1VNX1gyKHRlbXAxMywgdGVtcDE0LCB0ZW1wMywgdGVtcDE1LCB0ZW1wNSwgdGVtcDE2LCB0ZW1wMTEsCisgICAgICAgICAgICAgICAgICAgICB0ZW1wMTcsIHRlbXAxMiwgdGVtcDE4LCB0ZW1wMSwgdGVtcDgsIHRlbXAyLCB0ZW1wNCwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXA3LCB0ZW1wNiwgZHN0LCAwLCAxLCAyLCAzLCBCUFMpCisKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCksCisgICAgICBbYzRdIismciIoYzQpCisgICAgOiBbZHN0XSJyIihkc3QpLCBbYV0iciIoYSksIFtkMV0iciIoZDEpLCBbZDRdInIiKGQ0KSwgW2MxXSJyIihjMSkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZShjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworICBpbnQgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMTcsIHRlbXAxODsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICAwKCVbaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAyXSwgICAxNiglW2luXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX0lOX1gyKHRlbXA1LCB0ZW1wNiwgMjQsIDI2KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDEsIHRlbXAyKQorICAgIExPQURfSU5fWDIodGVtcDEsIHRlbXAyLCA4LCAxMCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA3LCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LAorICAgICAgICAgICAgICAgICAgdGVtcDEwLCB0ZW1wOCwgdGVtcDksIHRlbXA3LCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNiwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMywgdGVtcDExLCB0ZW1wMTQsIHRlbXAxMikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wOCwgdGVtcDcsIHRlbXAxMCwgdGVtcDkpCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMTddLCAgNCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMThdLCAgMjAoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDgpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA2LCB0ZW1wNCwgdGVtcDcpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCkKKyAgICBMT0FEX0lOX1gyKHRlbXAxNywgdGVtcDE4LCAxMiwgMTQpCisgICAgTE9BRF9JTl9YMih0ZW1wOSwgdGVtcDEwLCAyOCwgMzApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wNCwgdGVtcDE3LAorICAgICAgICAgICAgICAgICAgdGVtcDEyLCB0ZW1wMTQsIHRlbXAxMSwgdGVtcDEzLCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDksIHRlbXAxMCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxNSwgdGVtcDQsIHRlbXAxNiwgdGVtcDE3KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMTcsIHRlbXA4LCB0ZW1wOCwgdGVtcDExKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAzLCB0ZW1wNCwgdGVtcDcsIHRlbXAxMikKKworICAgIC8vIGhvcml6b250YWwKKyAgICBTUkFfMTYodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDUsIHRlbXA2KQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXAxLCB0ZW1wNiwgdGVtcDUsIHRlbXAyKQorICAgIFNSQV8xNih0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwgdGVtcDE3LCB0ZW1wOCkKKyAgICAicmVwbC5waCAgICAgICAgICAlW3RlbXAyXSwgICAweDQgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMywgdGVtcDgsIHRlbXAxNywgdGVtcDQpCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgQUREX1NVQl9IQUxWRVModGVtcDIsIHRlbXA0LCB0ZW1wMSwgdGVtcDMpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDUsIHRlbXA3LCB0ZW1wNiwgdGVtcDgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wMSwgdGVtcDMsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsCisgICAgICAgICAgICAgICAgICB0ZW1wMywgdGVtcDEzLCB0ZW1wMSwgdGVtcDksIHRlbXA5LCB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE1LAorICAgICAgICAgICAgICAgICAgdGVtcDYsIHRlbXAxNywgdGVtcDgsIHRlbXAxOCkKKyAgICBNVUxfU0hJRlRfU1VNKHRlbXA2LCB0ZW1wOCwgdGVtcDE4LCB0ZW1wMTcsIHRlbXAxMSwgdGVtcDE1LCB0ZW1wMTIsIHRlbXAxNiwKKyAgICAgICAgICAgICAgICAgIHRlbXA4LCB0ZW1wMTUsIHRlbXA2LCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDE2LCB0ZW1wMTAsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxOCwgdGVtcDEyLCB0ZW1wMTcsIHRlbXAxNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDMsIHRlbXA5LCB0ZW1wMTMpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDYsIHRlbXA4LCB0ZW1wMTEsIHRlbXAxNSkKKyAgICBTSElGVF9SX1NVTV9YMih0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAyLCB0ZW1wNCwgdGVtcDUsIHRlbXA3LCB0ZW1wMywgdGVtcDEsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgIHRlbXA2KQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDksIHRlbXAxMiwgdGVtcDEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMTYsIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTUsIHRlbXAxNCkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxMCwgdGVtcDExLCB0ZW1wMTQsIHRlbXAxNSwgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIDIsIDMsCisgICAgICAgICAgICAgICAgICAgICAgICBCUFMpCisgICAgQ09OVkVSVF8yX0JZVEVTX1RPX0hBTEYodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDExLCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUpCisgICAgU1RPUkVfU0FUX1NVTV9YMih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgdGVtcDksIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMTMsIHRlbXAxNiwgdGVtcDMsIHRlbXA0LAorICAgICAgICAgICAgICAgICAgICAgZHN0LCAwLCAxLCAyLCAzLCBCUFMpCisKKyAgICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzE4KCkKKyAgICA6IFtkc3RdInIiKGRzdCksIFtpbl0iciIoaW4pLCBba0MxXSJyIihrQzEpLCBba0MyXSJyIihrQzIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud28oY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBUcmFuc2Zvcm1PbmUoaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBUcmFuc2Zvcm1PbmUoaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsdGVyTG9vcDI2KHVpbnQ4X3QqIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhzdHJpZGUsIGludCB2c3RyaWRlLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIGludCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wMV0sICAlW2hzdHJpZGVdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbc2l6ZV0sICAgJVtzaXplXSwgICAgICAgIC0xICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAyXSwgICVbaHN0cmlkZV0sICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wM10sICAlW3RlbXAxXSwgICAgICAgMSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDRdLCAgJVt0ZW1wMl0sICAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA1XSwgICVbdGVtcDNdLCAgICAgICAlW3RlbXAxXSAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgJVt0ZW1wN10sICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wM10sICAgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA4XSwgICVbdGVtcDVdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wOV0sICAlW3RlbXAzXSglW3BdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDEwXSwgJVt0ZW1wMV0oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxMV0sICVbdGVtcDZdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMTJdLCAlW2hzdHJpZGVdKCVbcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDEzXSwgJVt0ZW1wMl0oJVtwXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxNF0sICVbdGVtcDRdKCVbcF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAlW3RlbXAxMF0sICAgICAgJVt0ZW1wN10gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgJVt0ZW1wOV0sICAgICAgICVbdGVtcDEyXSAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAyICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMTVdLCAlW3RlbXAzXSwgICAgICAgJVt0ZW1wNF0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMTVdLCAgICAgICVbdGhyZXNoMl0gICAgIFxuXHQiCisgICAgInNsbCAgICAgICAlW3RlbXA2XSwgICVbdGVtcDFdLCAgICAgICAxICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDRdLCAgJVt0ZW1wMTFdLCAgICAgICVbdGVtcDhdICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgMjQgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXA4XSwgICAgICAgJVt0ZW1wOV0gICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDVdLCAgJVt0ZW1wOV0sICAgICAgICVbdGVtcDEwXSAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNV0sICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wM10sICAlW3RlbXAxNF0sICAgICAgJVt0ZW1wMTNdICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDNdLCAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsdCAgICAgICAlW3RlbXA1XSwgICVbaGV2X3RocmVzaF0sICAlW3RlbXA1XSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgICAgJVtpdGhyZXNoXSAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDNdLCAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzdWJ1ICAgICAlW3RlbXAzXSwgICVbdGVtcDEzXSwgICAgICAlW3RlbXAxMl0gICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wMl0sICAgICAgIDI0ICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAgICAlW2l0aHJlc2hdICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wM10sICAzZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDE1XSwgJVt0ZW1wMTJdLCAgICAgICVbdGVtcDddICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXAzXSwgICVbdGVtcDE1XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wMTVdLCAlW3RlbXAxNV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgICVbaXRocmVzaF0gICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAzXSwgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2x0ICAgICAgJVt0ZW1wMTVdLCAlW2hldl90aHJlc2hdLCAgJVt0ZW1wMTVdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgJVt0ZW1wNl0sICAgICAgICVbdGVtcDFdICAgICAgIFxuXHQiCisgICAgIm9yICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDVdLCAgICAgICAlW3RlbXAxNV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wM10gICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgICVbdGVtcDJdLCAgNGYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBzaHJhX3IudyAlW3RlbXAxXSwgICVbdGVtcDVdLCAgICAgICAzICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wMl0sICAlW3RlbXA1XSwgICAgICAgMyAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAgICAyNyAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgJVtwXSwgICAgICAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAgICAyNyAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgMjcgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDFdLCAgJVt0ZW1wN10sICAgICAgICVbdGVtcDFdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICVbdGVtcDEwXSwgICAgICAlW3RlbXAyXSAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAyXSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJqICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICVbdGVtcDFdLCAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICI0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgICAgMjQgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDE0XSwgJVtwXSwgICAgICAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxMV0sICVbdGVtcDE0XSwgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNl0sICAlW3RlbXA1XSwgICAgICAgMjQgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wNl0sICAgICAgIDMgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAxNV0sICVbdGVtcDExXSwgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMl0sICAlW3RlbXA2XSwgICAgICAgJVt0ZW1wMV0gICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMl0sICAgICAgIDEgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA0XSwgICVbdGVtcDNdLCAgICAgICAlW3RlbXAyXSAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgNjMgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgIDYzICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAgICA2MyAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgICAgNyAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgICAgIDcgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAgICA3ICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wMV0sICAlW3RlbXA4XSwgICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgJVt0ZW1wOV0sICAgICAgICVbdGVtcDNdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXA2XSwgICVbdGVtcDEwXSwgICAgICAlW3RlbXA0XSAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA3XSwgICAgICAgJVt0ZW1wNF0gICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDddLCAgJVt0ZW1wMTJdLCAgICAgICVbdGVtcDNdICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxMF0sICVbcF0sICAgICAgICAgICAlW2hzdHJpZGVdICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wOV0sICAlW3RlbXAxM10sICAgICAgJVt0ZW1wMl0gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDEyXSwgJVt0ZW1wMTBdLCAgICAgICVbaHN0cmlkZV0gICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAyXSwgICVbdGVtcDFdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wM10sICAlW3RlbXA1XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNl0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA1XSwgICVbdGVtcDhdKCVbVlA4a2NsaXAxXSkgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wNl0sICAlW3RlbXA3XSglW1ZQOGtjbGlwMV0pICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOV0oJVtWUDhrY2xpcDFdKSAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAyXSwgIDAoJVt0ZW1wMTVdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAwKCVbdGVtcDExXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDRdLCAgMCglW3RlbXAxNF0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXA1XSwgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNl0sICAwKCVbdGVtcDEwXSkgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAxMl0pICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtzaXplXSwgICAxYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZHUgICAgICVbcF0sICAgICAgJVtwXSwgICAgICAgICAgICVbdnN0cmlkZV0gICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSxbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwKKyAgICAgIFt0ZW1wN10iPSZyIih0ZW1wNyksW3RlbXA4XSI9JnIiKHRlbXA4KSxbdGVtcDldIj0mciIodGVtcDkpLAorICAgICAgW3RlbXAxMF0iPSZyIih0ZW1wMTApLFt0ZW1wMTFdIj0mciIodGVtcDExKSxbdGVtcDEyXSI9JnIiKHRlbXAxMiksCisgICAgICBbdGVtcDEzXSI9JnIiKHRlbXAxMyksW3RlbXAxNF0iPSZyIih0ZW1wMTQpLFt0ZW1wMTVdIj0mciIodGVtcDE1KSwKKyAgICAgIFtzaXplXSIrJnIiKHNpemUpLCBbcF0iKyZyIihwKQorICAgIDogW2hzdHJpZGVdInIiKGhzdHJpZGUpLCBbdGhyZXNoMl0iciIodGhyZXNoMiksCisgICAgICBbaXRocmVzaF0iciIoaXRocmVzaCksW3ZzdHJpZGVdInIiKHZzdHJpZGUpLCBbaGV2X3RocmVzaF0iciIoaGV2X3RocmVzaCksCisgICAgICBbVlA4a2NsaXAxXSJyIihWUDhrY2xpcDEpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBGaWx0ZXJMb29wMjQodWludDhfdCogcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaHN0cmlkZSwgaW50IHZzdHJpZGUsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgcDAsIHEwLCBwMSwgcTEsIHAyLCBxMiwgcDMsIHEzOworICBpbnQgc3RlcDEsIHN0ZXAyLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgdWludDhfdCogcFRlbXAwOworICB1aW50OF90KiBwVGVtcDE7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmx0eiAgICAgICVbc2l6ZV0sICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbc3RlcDFdLCAgICVbaHN0cmlkZV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAlW3EwXSwgICAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVtwMF0sICAgICAgJVtzdGVwMV0oJVtwXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgImxidXggICAgICAlW3ExXSwgICAgICAlW2hzdHJpZGVdKCVbcF0pICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wMV0sICAgJVtwMF0sICAgICAgICAgJVtxMF0gICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcDFdLCAgICAgICVbc3RlcDFdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3N0ZXAyXSwgICAlW2hzdHJpZGVdLCAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICVbcDFdLCAgICAgICAgICVbcTFdICAgICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzbGwgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA0XSwgICAlW3RlbXAyXSwgICAgICAlW3RocmVzaDJdICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtzdGVwMV0sICAgJVtzdGVwMV0sICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDRdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIiBsYnV4ICAgICAlW3AyXSwgICAgICAlW3N0ZXAxXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVtzdGVwMV0sICAgJVtzdGVwMV0sICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbcTJdLCAgICAgICVbc3RlcDJdKCVbcF0pICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3AzXSwgICAgICAlW3N0ZXAxXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAgJVtwMl0sICAgICAgICAgJVtwMV0gICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbc3RlcDJdLCAgICVbc3RlcDJdLCAgICAgICVbaHN0cmlkZV0gIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3AzXSwgICAgICAgICAlW3AyXSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDJdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3EzXSwgICAgICAlW3N0ZXAyXSglW3BdKSAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA0XSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc3VidSAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICAgJVtpdGhyZXNoXSAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcDNdLCAgICAgICVbcDFdLCAgICAgICAgICVbcDBdICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXAyXSwgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWJzcV9zLncgJVtwM10sICAgICAgJVtwM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDRdLCAgICVbcTNdLCAgICAgICAgICVbcTJdICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3BUZW1wMF0sICAlW3BdLCAgICAgICAgICAlW2hzdHJpZGVdICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICVbcDNdLCAgICAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgInNsbCAgICAgICAlW3N0ZXAxXSwgICAlW3RlbXAxXSwgICAgICAxICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wMl0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAlW3EyXSwgICAgICAgICAlW3ExXSAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFic3Ffcy53ICVbdGVtcDJdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3EzXSwgICAgICAlW3ExXSwgICAgICAgICAlW3EwXSAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVtxM10sICAgICAgJVtxM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAlW3N0ZXAxXSAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wMl0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHN1YnUgICAgICVbdGVtcDRdLCAgICVbcTNdLCAgICAgICAgICVbaXRocmVzaF0gIFxuXHQiCisgICAgInNsdCAgICAgICAlW3AzXSwgICAgICAlW2hldl90aHJlc2hdLCAlW3AzXSAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVt0ZW1wNF0sICAgMGYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNsdCAgICAgICVbcTNdLCAgICAgICVbaGV2X3RocmVzaF0sICVbcTNdICAgICAgIFxuXHQiCisgICAgIm9yICAgICAgICAlW3EzXSwgICAgICAlW3EzXSwgICAgICAgICAlW3AzXSAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtxM10sICAgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIHNocmFfci53ICVbdGVtcDJdLCAgICVbdGVtcDFdLCAgICAgIDMgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwVGVtcDFdLCAgJVtwXSwgICAgICAgICAgJVtoc3RyaWRlXSAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVtzdGVwMV0sICAgJVt0ZW1wMl0sICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbc3RlcDFdLCAgICVbc3RlcDFdLCAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3AwXSwgICAgICAlW3AwXSwgICAgICAgICAlW3RlbXAxXSAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwMV0sICAgICAgJVtwMV0sICAgICAgICAgJVtzdGVwMV0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcTBdLCAgICAgICVbcTBdLCAgICAgICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3ExXSwgICAgICAlW3ExXSwgICAgICAgICAlW3N0ZXAxXSAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMl0sICAgJVtwMF0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICVbcTBdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXA0XSwgICAlW3ExXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAgMCglW3BUZW1wMF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDFdLCAgICVbcDFdKCVbVlA4a2NsaXAxXSkgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3BUZW1wMF0sICAlW3BUZW1wMF0sICAgICVbaHN0cmlkZV0gICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wM10sICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDRdLCAgIDAoJVtwVGVtcDFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImogICAgICAgICAwZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgc2IgICAgICAgJVt0ZW1wMV0sICAgMCglW3BUZW1wMF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgICAyNCAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgMjQgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgInNocmFfci53ICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAzICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgIDI3ICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAyNyAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVtwMF0sICAgICAgJVtwMF0sICAgICAgICAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbcTBdLCAgICAgICVbcTBdLCAgICAgICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAxXSwgICAlW3AwXSglW1ZQOGtjbGlwMV0pICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wMl0sICAgJVtxMF0oJVtWUDhrY2xpcDFdKSAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDJdLCAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAxXSwgICAwKCVbcFRlbXAwXSkgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbc2l6ZV0sICAgICVbc2l6ZV0sICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3NpemVdLCAgICAyYiAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkdSAgICAgJVtwXSwgICAgICAgJVtwXSwgICAgICAgICAgJVt2c3RyaWRlXSAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3AwXSI9JnIiKHAwKSwgW3EwXSI9JnIiKHEwKSwgW3AxXSI9JnIiKHAxKSwgW3ExXSI9JnIiKHExKSwKKyAgICAgIFtwMl0iPSZyIihwMiksIFtxMl0iPSZyIihxMiksIFtwM10iPSZyIihwMyksIFtxM10iPSZyIihxMyksCisgICAgICBbc3RlcDJdIj0mciIoc3RlcDIpLCBbc3RlcDFdIj0mciIoc3RlcDEpLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwKKyAgICAgIFtwVGVtcDBdIj0mciIocFRlbXAwKSwgW3BUZW1wMV0iPSZyIihwVGVtcDEpLCBbcF0iKyZyIihwKSwKKyAgICAgIFtzaXplXSIrJnIiKHNpemUpCisgICAgOiBbdnN0cmlkZV0iciIodnN0cmlkZSksIFtpdGhyZXNoXSJyIihpdGhyZXNoKSwKKyAgICAgIFtoZXZfdGhyZXNoXSJyIihoZXZfdGhyZXNoKSwgW2hzdHJpZGVdInIiKGhzdHJpZGUpLAorICAgICAgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKSwgW3RocmVzaDJdInIiKHRocmVzaDIpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI2KHAsIHN0cmlkZSwgMSwgMTYsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKK30KKworLy8gOC1waXhlbHMgd2lkZSB2YXJpYW50LCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBGaWx0ZXJMb29wMjYodSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworICBGaWx0ZXJMb29wMjYodiwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOCh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIEZpbHRlckxvb3AyNih1LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNih2LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBGaWx0ZXJMb29wMjQocCwgc3RyaWRlLCAxLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgZm9yIChrID0gMzsgayA+IDA7IC0taykgeworICAgIHAgKz0gNDsKKyAgICBGaWx0ZXJMb29wMjQocCwgMSwgc3RyaWRlLCAxNiwgdGhyZXNoLCBpdGhyZXNoLCBoZXZfdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0KHUgKyA0ICogc3RyaWRlLCBzdHJpZGUsIDEsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNCh2ICsgNCAqIHN0cmlkZSwgc3RyaWRlLCAxLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOGkodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgRmlsdGVyTG9vcDI0KHUgKyA0LCAxLCBzdHJpZGUsIDgsIHRocmVzaCwgaXRocmVzaCwgaGV2X3RocmVzaCk7CisgIEZpbHRlckxvb3AyNCh2ICsgNCwgMSwgc3RyaWRlLCA4LCB0aHJlc2gsIGl0aHJlc2gsIGhldl90aHJlc2gpOworfQorCisjdW5kZWYgTVVMCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTYodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IHRocmVzaDIgPSAyICogdGhyZXNoICsgMTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIHVpbnQ4X3QqIHAxID0gcCAtIHN0cmlkZTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgICVbaV0sICAgICAgICAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJuZWd1ICAgICAgJVt0ZW1wNF0sICAgICVbc3RyaWRlXSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSwgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAlW3RlbXAyXSwgICAgMCglW3BdKSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wM10sICAgICVbc3RyaWRlXSglW3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA0XSglW3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidXggICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0oJVtwXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDFdLCAgICAgICAlW3RlbXAyXSAgICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDZdLCAgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wM10gICAgIFxuXHQiCisgICAgImFic3Ffcy53ICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhYnNxX3MudyAgJVt0ZW1wNV0sICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICAgMiAgICAgICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wNV0sICAgICAgICVbdGhyZXNoMl0gICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXA1XSAgICAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJndHogICAgICAlW3RlbXA1XSwgICAgMWYgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIgYWRkaXUgICAgJVtpXSwgICAgICAgICVbaV0sICAgICAgICAgICAtMSAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA4XSwgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy53ICAlW3RlbXA1XSwgICAgJVt0ZW1wNl0sICAgICAgIDI0ICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdLCAgICAgICAlW3RlbXA4XSAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSwgICAgICAgMjQgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDVdICAgICBcblx0IgorICAgICJhZGRpdSAgICAgJVt0ZW1wN10sICAgICVbdGVtcDNdLCAgICAgICAzICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgICAgMyAgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAlW3RlbXA4XSwgICAgJVt0ZW1wM10sICAgICAgIDMgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MudyAgJVt0ZW1wMF0sICAgICVbdGVtcDddLCAgICAgICAyNyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDRdLCAgICAlW3RlbXA4XSwgICAgICAgMjcgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgIDI3ICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdLCAgICAgICAyNyAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDddLCAgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMF0gICAgIFxuXHQiCisgICAgInN1YnUgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICVbdGVtcDRdICAgICBcblx0IgorICAgICJsYnV4ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDddKCVbVlA4a2NsaXAxXSkgICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSglW1ZQOGtjbGlwMV0pICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAlW3RlbXAzXSwgICAgMCglW3AxXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtwXSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAlW3AxXSwgICAgICAgJVtwMV0sICAgICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJiZ3R6ICAgICAgJVtpXSwgICAgICAgIDBiICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICVbcF0sICAgICAgICAlW3BdLCAgICAgICAgICAgMSAgICAgICAgICAgIFxuXHQiCisgICAgIiAuc2V0ICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3BdIismciIocCksIFtpXSI9JnIiKGkpLCBbcDFdIismciIocDEpCisgICAgOiBbc3RyaWRlXSJyIihzdHJpZGUpLCBbVlA4a2NsaXAxXSJyIihWUDhrY2xpcDEpLCBbdGhyZXNoMl0iciIodGhyZXNoMikKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKKy8vIFRFTVAwID0gU1JDW0EgKyBBMSAqIEJQU10KKy8vIFRFTVAxID0gU1JDW0IgKyBCMSAqIEJQU10KKy8vIFRFTVAyID0gU1JDW0MgKyBDMSAqIEJQU10KKy8vIFRFTVAzID0gU1JDW0QgKyBEMSAqIEJQU10KKyNkZWZpbmUgTE9BRF80X0JZVEVTKFRFTVAwLCBURU1QMSwgVEVNUDIsIFRFTVAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBBLCBBMSwgQiwgQjEsIEMsIEMxLCBELCBEMSwgU1JDKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICAgJVsiICNURU1QMCAiXSwgICAiICNBICIrIiAjQTEgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSBcblx0IiAgIFwKKyAgImxidSAgICAgICVbIiAjVEVNUDEgIl0sICAgIiAjQiAiKyIgI0IxICIqIiBYU1RSKEJQUykgIiglWyIgI1NSQyAiXSkgXG5cdCIgICBcCisgICJsYnUgICAgICAlWyIgI1RFTVAyICJdLCAgICIgI0MgIisiICNDMSAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pIFxuXHQiICAgXAorICAibGJ1ICAgICAgJVsiICNURU1QMyAiXSwgICAiICNEICIrIiAjRDEgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSBcblx0IiAgIFwKKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2KHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB0aHJlc2gyID0gMiAqIHRocmVzaCArIDE7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgICVbaV0sICAgICAgIDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEXzRfQllURVModGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIC0yLCAwLCAtMSwgMCwgMCwgMCwgMSwgMCwgcCkKKyAgICAic3VidSAgICAgICVbdGVtcDddLCAgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMl0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDZdLCAgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wM10gICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDRdLCAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWJzcV9zLncgICVbdGVtcDVdLCAgICAlW3RlbXA2XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICAgMiAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSwgICAgICAgJVt0aHJlc2gyXSAgXG5cdCIKKyAgICAibmVndSAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbdGVtcDVdLCAgICAxZiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICVbaV0sICAgICAgICAlW2ldLCAgICAgICAgICAgLTEgICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA4XSwgICAgICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDVdLCAgICAlW3RlbXA2XSwgICAgICAgMjQgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wOF0gICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA1XSwgICAgICAgMjQgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICVbdGVtcDddLCAgICAlW3RlbXAzXSwgICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA3XSwgICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICVbdGVtcDhdLCAgICAlW3RlbXAzXSwgICAgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDBdLCAgICAlW3RlbXA3XSwgICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICVbdGVtcDRdLCAgICAlW3RlbXA4XSwgICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSwgICAgICAgMjcgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICVbdGVtcDddLCAgICAlW3RlbXAxXSwgICAgICAgJVt0ZW1wMF0gICAgXG5cdCIKKyAgICAic3VidSAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSglW1ZQOGtjbGlwMV0pICAgICAgXG5cdCIKKyAgICAibGJ1eCAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSglW1ZQOGtjbGlwMV0pICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAtMSglW3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICVbdGVtcDRdLCAgICAwKCVbcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmd0eiAgICAgICVbaV0sICAgICAgICAwYiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZHUgICAgICVbcF0sICAgICAgICAlW3BdLCAgICAgICAgICAgJVtzdHJpZGVdICAgXG5cdCIKKyAgICAiLnNldCAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFtwXSIrJnIiKHApLCBbaV0iPSZyIihpKQorICAgIDogW3N0cmlkZV0iciIoc3RyaWRlKSwgW1ZQOGtjbGlwMV0iciIoVlA4a2NsaXAxKSwgW3RocmVzaDJdInIiKHRocmVzaDIpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaW1wbGVIRmlsdGVyMTZpKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2KHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCisvLyBEU1RbQSAqIEJQU10gICAgID0gVEVNUDAKKy8vIERTVFtCICsgQyAqIEJQU10gPSBURU1QMQorI2RlZmluZSBTVE9SRV84X0JZVEVTKFRFTVAwLCBURU1QMSwgQSwgQiwgQywgRFNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInVzdyAgICAlWyIgI1RFTVAwICJdLCAgICIgI0EgIioiIFhTVFIoQlBTKSAiKCVbIiAjRFNUICJdKSAgICAgICAgIFxuXHQiICAgICBcCisgICJ1c3cgICAgJVsiICNURU1QMSAiXSwgICAiICNCICIrIiAjQyAiKiIgWFNUUihCUFMpICIoJVsiICNEU1QgIl0pICBcblx0IgorCitzdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4X3QqIHRvcCA9IGRzdCAtIEJQUzsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIC0xKCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsaCAgICAgICAgICAgICAlW3RlbXAxXSwgICAzKCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wMl0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA1XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDRdLCAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wNCwgdGVtcDQsIDAsIDAsIDEsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXA0LCB0ZW1wNCwgMiwgMCwgMywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBEQzQodWludDhfdCogZHN0KSB7ICAgLy8gREMKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAlW3RlbXAwXSwgICAtMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICBMT0FEXzRfQllURVModGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIC0xLCAwLCAtMSwgMSwgLTEsIDIsIC0xLCAzLCBkc3QpCisgICAgImlucyAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgOCwgICAgIDggICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDNdLCAgICAxNiwgICAgOCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wNF0sICAgIDI0LCAgICA4ICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMyAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAwLCAwLCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDIsIDAsIDMsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1yaWdodAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfNF9CWVRFUyh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgLTEsIDAsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIGRzdCkKKyAgICAidWx3ICAgICAgICAgICAgJVt0ZW1wN10sICAgLTEtIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDBdLCAxNiwgMTYgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAlW3RlbXA1XSwgICAlW3RlbXA3XSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMV0sIDE2LCAxNiAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICVbdGVtcDRdLCAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgMTYsIDE2ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sIDEgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAlW3RlbXA2XSwgICAlW3RlbXA1XSwgJVt0ZW1wMV0gICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICVbdGVtcDJdICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAlW3RlbXA1XSAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgMSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICVbdGVtcDZdICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAlW3RlbXA1XSAgICAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA1XSwgJVt0ZW1wNF0gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAxICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wMF0sICVbdGVtcDhdICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICVbdGVtcDVdLCAgIDMtIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgJVt0ZW1wN10gICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sIDIgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDVdLCAwLCAgOCAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgJVt0ZW1wM10gICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICVbdGVtcDZdLCAgICVbdGVtcDhdLCAlW3RlbXAxXSAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgMiAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAyLCB0ZW1wNiwgMywgMCwgMSwgZHN0KQorICAgICJwcmVwZW5kICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXA4XSwgOCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNF0sIDggICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMiwgdGVtcDYsIDIsIDAsIDAsIGRzdCkKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8gVEVNUDAgPSBTUkNbQSAqIEJQU10KKy8vIFRFTVAxID0gU1JDW0IgKyBDICogQlBTXQorI2RlZmluZSBMT0FEXzhfQllURVMoVEVNUDAsIFRFTVAxLCBBLCBCLCBDLCBTUkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAlWyIgI1RFTVAwICJdLCAgICIgI0EgIioiIFhTVFIoQlBTKSAiKCVbIiAjU1JDICJdKSAgICAgICAgIFxuXHQiICAgICBcCisgICJ1bHcgICAgJVsiICNURU1QMSAiXSwgICAiICNCICIrIiAjQyAiKiIgWFNUUihCUFMpICIoJVsiICNTUkMgIl0pICBcblx0IgorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1MZWZ0CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfOF9CWVRFUyh0ZW1wMCwgdGVtcDEsIC0xLCA0LCAtMSwgZHN0KQorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDNdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAxICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA5XSwgICAgJVt0ZW1wM10gICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAyICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSwgICAgJVt0ZW1wN10gICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDhdICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAyICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMjQgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDldLCAgICAlW3RlbXAzXSwgICAgJVt0ZW1wOV0gICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDNdICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMiAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wOSwgdGVtcDMsIDAsIDAsIDIsIGRzdCkKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAwXSwgICAgOCAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0sICAgIDggICAgICAgICAgICAgICBcblx0IgorICAgIFNUT1JFXzhfQllURVModGVtcDksIHRlbXAzLCAxLCAwLCAzLCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hCisKK3N0YXRpYyB2b2lkIERDOHV2KHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gREMKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF84X0JZVEVTKHRlbXAwLCB0ZW1wMSwgLTEsIDQsIC0xLCBkc3QpCisgICAgTE9BRF80X0JZVEVTKHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCAtMSwgMCwgLTEsIDEsIC0xLCAyLCAtMSwgMywgZHN0KQorICAgIExPQURfNF9CWVRFUyh0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgLTEsIDQsIC0xLCA1LCAtMSwgNiwgLTEsIDcsIGRzdCkKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDRdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDhdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDAsIDQsIDAsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMSwgNCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCA0LCAyLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDMsIDQsIDMsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNCwgNCwgNCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA1LCA0LCA1LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDYsIDQsIDYsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNywgNCwgNywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb0xlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKKyAgaW50IHRlbXAwLCB0ZW1wMTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgTE9BRF84X0JZVEVTKHRlbXAwLCB0ZW1wMSwgLTEsIDQsIC0xLCBkc3QpCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMyAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMCwgNCwgMCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAxLCA0LCAxLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDIsIDQsIDIsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMywgNCwgMywgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA0LCA0LCA0LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDUsIDQsIDUsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNiwgNCwgNiwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA3LCA0LCA3LCBkc3QpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vVG9wKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfNF9CWVRFUyh0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgLTEsIDAsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIGRzdCkKKyAgICBMT0FEXzRfQllURVModGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDEsIC0xLCA0LCAtMSwgNSwgLTEsIDYsIC0xLCA3LCBkc3QpCisgICAgImFkZHUgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXA4XSwgICAlW3RlbXA4XSwgICAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICJhZGR1ICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA4XSAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJzaHJhX3IudyAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDAsIDQsIDAsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgMSwgNCwgMSwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCAyLCA0LCAyLCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDMsIDQsIDMsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNCwgNCwgNCwgZHN0KQorICAgIFNUT1JFXzhfQllURVModGVtcDAsIHRlbXAwLCA1LCA0LCA1LCBkc3QpCisgICAgU1RPUkVfOF9CWVRFUyh0ZW1wMCwgdGVtcDAsIDYsIDQsIDYsIGRzdCkKKyAgICBTVE9SRV84X0JZVEVTKHRlbXAwLCB0ZW1wMCwgNywgNCwgNywgZHN0KQorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpCisgICAgOiBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCisjdW5kZWYgTE9BRF84X0JZVEVTCisjdW5kZWYgU1RPUkVfOF9CWVRFUworI3VuZGVmIExPQURfNF9CWVRFUworCisjZGVmaW5lIENMSVBQSU5HKFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmlmICIgI1NJWkUgIiA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDNdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbZHN0XzFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmlmICIgI1NJWkUgIiA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbZHN0XzFdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW2RzdF8xXSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmlmICIgI1NJWkUgIiA9PSA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDBdLCAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyIuaWYgIiAjU0laRSAiID09IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggJVt0ZW1wMV0sICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworCisjZGVmaW5lIENMSVBfOEJfVE9fRFNUKERTVCwgVE9QLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgZHN0XzEgPSAoKGludCkoRFNUKVstMV0gPDwgMTYpICsgKERTVClbLTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA8IDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInN1YnUucGggICAgICAgICAlW2RzdF8xXSwgICAlW2RzdF8xXSwgICAgJVt0b3BfMV0gICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIENMSVBQSU5HKDQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDQoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInN1YnUucGggICAgICAgICAlW2RzdF8xXSwgICAlW2RzdF8xXSwgICAgJVt0b3BfMV0gICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIENMSVBQSU5HKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA9PSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDgoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAxMiglW3RvcF0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIENMSVBQSU5HKDgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAxMiglW2RzdF0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgOiBbZHN0XzFdIismciIoZHN0XzEpLCBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCAgICAgICAgICAgXAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFt0b3BfMV0iciIodG9wXzEpLCBbdG9wXSJyIigoVE9QKSksIFtkc3RdInIiKChEU1QpKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0xJUF9UT19EU1QoRFNULCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90KiB0b3AgPSAoRFNUKSAtIEJQUzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRvcF8xID0gKChpbnQpdG9wWy0xXSA8PCAxNikgKyB0b3BbLTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IDA7IHkgPCAoU0laRSk7ICsreSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENMSVBfOEJfVE9fRFNUKChEU1QpLCB0b3AsIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoRFNUKSArPSBCUFM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBUUlVFX01PVElPTihEU1QsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFRydWVNb3Rpb24jI1NJWkUodWludDhfdCogKERTVCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfVE9fRFNUKChEU1QpLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitUUlVFX01PVElPTihkc3QsIDQpCitUUlVFX01PVElPTihkc3QsIDgpCitUUlVFX01PVElPTihkc3QsIDE2KQorCisjdW5kZWYgVFJVRV9NT1RJT04KKyN1bmRlZiBDTElQX1RPX0RTVAorI3VuZGVmIENMSVBfOEJfVE9fRFNUCisjdW5kZWYgQ0xJUFBJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgVlA4VHJhbnNmb3JtREMgPSBUcmFuc2Zvcm1EQzsKKyAgVlA4VHJhbnNmb3JtQUMzID0gVHJhbnNmb3JtQUMzOworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1Ud287CisKKyAgVlA4VkZpbHRlcjE2ID0gVkZpbHRlcjE2OworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTY7CisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjg7CisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjg7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpOworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aTsKKyAgVlA4VkZpbHRlcjhpID0gVkZpbHRlcjhpOworICBWUDhIRmlsdGVyOGkgPSBIRmlsdGVyOGk7CisgIFZQOFNpbXBsZVZGaWx0ZXIxNiA9IFNpbXBsZVZGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ID0gU2ltcGxlSEZpbHRlcjE2OworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aTsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2aSA9IFNpbXBsZUhGaWx0ZXIxNmk7CisKKyAgVlA4UHJlZEx1bWE0WzBdID0gREM0OworICBWUDhQcmVkTHVtYTRbMV0gPSBUcnVlTW90aW9uNDsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0OworICBWUDhQcmVkTHVtYTRbNF0gPSBSRDQ7CisgIFZQOFByZWRMdW1hNFs2XSA9IExENDsKKworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2OworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRydWVNb3Rpb244OworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3A7CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnQ7CisKKyAgVlA4UHJlZEx1bWExNlsxXSA9IFRydWVNb3Rpb24xNjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDkwNjIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbXNhLmMKQEAgLTAsMCArMSwxMDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZlcnNpb24gb2YgZHNwIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcihzKTogIFByYXNoYW50IFBhdGlsICAgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zCisKKyNkZWZpbmUgSURDVF8xRF9XKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgeyAgXAorICB2NGkzMiBhMV9tLCBiMV9tLCBjMV9tLCBkMV9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIGNfdG1wMV9tLCBjX3RtcDJfbSwgZF90bXAxX20sIGRfdG1wMl9tOyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjRpMzIgY29zcGk4c3FydDJtaW51czEgPSBfX21zYV9maWxsX3coMjAwOTEpOyAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBzaW5waThzcXJ0MiA9IF9fbXNhX2ZpbGxfdygzNTQ2OCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYTFfbSA9IGluMCArIGluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBiMV9tID0gaW4wIC0gaW4yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNfdG1wMV9tID0gKGluMSAqIHNpbnBpOHNxcnQyKSA+PiAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY190bXAyX20gPSBpbjMgKyAoKGluMyAqIGNvc3BpOHNxcnQybWludXMxKSA+PiAxNik7ICAgICAgICAgICAgXAorICBjMV9tID0gY190bXAxX20gLSBjX3RtcDJfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRfdG1wMV9tID0gaW4xICsgKChpbjEgKiBjb3NwaThzcXJ0Mm1pbnVzMSkgPj4gMTYpOyAgICAgICAgICAgIFwKKyAgZF90bXAyX20gPSAoaW4zICogc2lucGk4c3FydDIpID4+IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkMV9tID0gZF90bXAxX20gKyBkX3RtcDJfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJVVFRFUkZMWV80KGExX20sIGIxX20sIGMxX20sIGQxX20sIG91dDAsIG91dDEsIG91dDIsIG91dDMpOyAgIFwKK30KKyNkZWZpbmUgTVVMVDEoYSkgKCgoKGEpICogMjAwOTEpID4+IDE2KSArIChhKSkKKyNkZWZpbmUgTVVMVDIoYSkgKCgoYSkgKiAzNTQ2OCkgPj4gMTYpCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZShjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIHY4aTE2IGlucHV0MCwgaW5wdXQxOworICB2NGkzMiBpbjAsIGluMSwgaW4yLCBpbjMsIGh6MCwgaHoxLCBoejIsIGh6MywgdnQwLCB2dDEsIHZ0MiwgdnQzOworICB2NGkzMiByZXMwLCByZXMxLCByZXMyLCByZXMzOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIHYxNmk4IGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzOworCisgIExEX1NIMihpbiwgOCwgaW5wdXQwLCBpbnB1dDEpOworICBVTlBDS19TSF9TVyhpbnB1dDAsIGluMCwgaW4xKTsKKyAgVU5QQ0tfU0hfU1coaW5wdXQxLCBpbjIsIGluMyk7CisgIElEQ1RfMURfVyhpbjAsIGluMSwgaW4yLCBpbjMsIGh6MCwgaHoxLCBoejIsIGh6Myk7CisgIFRSQU5TUE9TRTR4NF9TV19TVyhoejAsIGh6MSwgaHoyLCBoejMsIGh6MCwgaHoxLCBoejIsIGh6Myk7CisgIElEQ1RfMURfVyhoejAsIGh6MSwgaHoyLCBoejMsIHZ0MCwgdnQxLCB2dDIsIHZ0Myk7CisgIFNSQVJJX1c0X1NXKHZ0MCwgdnQxLCB2dDIsIHZ0MywgMyk7CisgIFRSQU5TUE9TRTR4NF9TV19TVyh2dDAsIHZ0MSwgdnQyLCB2dDMsIHZ0MCwgdnQxLCB2dDIsIHZ0Myk7CisgIExEX1NCNChkc3QsIEJQUywgZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDMpOworICBJTFZSX0I0X1NXKHplcm8sIGRlc3QwLCB6ZXJvLCBkZXN0MSwgemVybywgZGVzdDIsIHplcm8sIGRlc3QzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBJTFZSX0g0X1NXKHplcm8sIHJlczAsIHplcm8sIHJlczEsIHplcm8sIHJlczIsIHplcm8sIHJlczMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIEFERDQocmVzMCwgdnQwLCByZXMxLCB2dDEsIHJlczIsIHZ0MiwgcmVzMywgdnQzLCByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQ0xJUF9TVzRfMF8yNTUocmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIFBDS0VWX0IyX1NXKHJlczAsIHJlczEsIHJlczIsIHJlczMsIHZ0MCwgdnQxKTsKKyAgcmVzMCA9ICh2NGkzMilfX21zYV9wY2tldl9iKCh2MTZpOCl2dDAsICh2MTZpOCl2dDEpOworICBTVDR4NF9VQihyZXMwLCByZXMwLCAzLCAyLCAxLCAwLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybVR3byhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIFRyYW5zZm9ybU9uZShpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIFRyYW5zZm9ybU9uZShpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1XSFQoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICB2OGkxNiBpbnB1dDAsIGlucHV0MTsKKyAgY29uc3QgdjhpMTYgbWFzazAgPSB7IDAsIDEsIDIsIDMsIDgsIDksIDEwLCAxMSB9OworICBjb25zdCB2OGkxNiBtYXNrMSA9IHsgNCwgNSwgNiwgNywgMTIsIDEzLCAxNCwgMTUgfTsKKyAgY29uc3QgdjhpMTYgbWFzazIgPSB7IDAsIDQsIDgsIDEyLCAxLCA1LCA5LCAxMyB9OworICBjb25zdCB2OGkxNiBtYXNrMyA9IHsgMywgNywgMTEsIDE1LCAyLCA2LCAxMCwgMTQgfTsKKyAgdjhpMTYgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgdjhpMTYgb3V0MCwgb3V0MTsKKworICBMRF9TSDIoaW4sIDgsIGlucHV0MCwgaW5wdXQxKTsKKyAgaW5wdXQxID0gU0xESV9TSChpbnB1dDEsIGlucHV0MSwgOCk7CisgIHRtcDAgPSBpbnB1dDAgKyBpbnB1dDE7CisgIHRtcDEgPSBpbnB1dDAgLSBpbnB1dDE7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgb3V0MCA9IHRtcDIgKyB0bXAzOworICBvdXQxID0gdG1wMiAtIHRtcDM7CisgIFZTSEZfSDJfU0gob3V0MCwgb3V0MSwgb3V0MCwgb3V0MSwgbWFzazIsIG1hc2szLCBpbnB1dDAsIGlucHV0MSk7CisgIHRtcDAgPSBpbnB1dDAgKyBpbnB1dDE7CisgIHRtcDEgPSBpbnB1dDAgLSBpbnB1dDE7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazAsIG1hc2sxLCB0bXAyLCB0bXAzKTsKKyAgdG1wMCA9IHRtcDIgKyB0bXAzOworICB0bXAxID0gdG1wMiAtIHRtcDM7CisgIEFERFZJX0gyX1NIKHRtcDAsIDMsIHRtcDEsIDMsIG91dDAsIG91dDEpOworICBTUkFJX0gyX1NIKG91dDAsIG91dDEsIDMpOworICBvdXRbMF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCAwKTsKKyAgb3V0WzE2XSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDQpOworICBvdXRbMzJdID0gX19tc2FfY29weV9zX2gob3V0MSwgMCk7CisgIG91dFs0OF0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCA0KTsKKyAgb3V0WzY0XSA9IF9fbXNhX2NvcHlfc19oKG91dDAsIDEpOworICBvdXRbODBdID0gX19tc2FfY29weV9zX2gob3V0MCwgNSk7CisgIG91dFs5Nl0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCAxKTsKKyAgb3V0WzExMl0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCA1KTsKKyAgb3V0WzEyOF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCAyKTsKKyAgb3V0WzE0NF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCA2KTsKKyAgb3V0WzE2MF0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCAyKTsKKyAgb3V0WzE3Nl0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCA2KTsKKyAgb3V0WzE5Ml0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCAzKTsKKyAgb3V0WzIwOF0gPSBfX21zYV9jb3B5X3NfaChvdXQwLCA3KTsKKyAgb3V0WzIyNF0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCAzKTsKKyAgb3V0WzI0MF0gPSBfX21zYV9jb3B5X3NfaChvdXQxLCA3KTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtREMoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBpbnQgREMgPSAoaW5bMF0gKyA0KSA+PiAzOworICBjb25zdCB2OGkxNiB0bXAwID0gX19tc2FfZmlsbF9oKERDKTsKKyAgQUREQkxLX1NUNHg0X1VCKHRtcDAsIHRtcDAsIHRtcDAsIHRtcDAsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQUMzKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IGEgPSBpblswXSArIDQ7CisgIGNvbnN0IGludCBjNCA9IE1VTFQyKGluWzRdKTsKKyAgY29uc3QgaW50IGQ0ID0gTVVMVDEoaW5bNF0pOworICBjb25zdCBpbnQgaW4yID0gTVVMVDIoaW5bMV0pOworICBjb25zdCBpbnQgaW4zID0gTVVMVDEoaW5bMV0pOworICB2NGkzMiB0bXAwID0geyAwIH07CisgIHY0aTMyIG91dDAgPSBfX21zYV9maWxsX3coYSArIGQ0KTsKKyAgdjRpMzIgb3V0MSA9IF9fbXNhX2ZpbGxfdyhhICsgYzQpOworICB2NGkzMiBvdXQyID0gX19tc2FfZmlsbF93KGEgLSBjNCk7CisgIHY0aTMyIG91dDMgPSBfX21zYV9maWxsX3coYSAtIGQ0KTsKKyAgdjRpMzIgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMzsKKyAgY29uc3QgdjRpMzIgemVybyA9IHsgMCB9OworICB2MTZ1OCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0MzsKKworICBJTlNFUlRfVzRfU1coaW4zLCBpbjIsIC1pbjIsIC1pbjMsIHRtcDApOworICBBREQ0KG91dDAsIHRtcDAsIG91dDEsIHRtcDAsIG91dDIsIHRtcDAsIG91dDMsIHRtcDAsCisgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFNSQUlfVzRfU1cob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgMyk7CisgIExEX1VCNChkc3QsIEJQUywgZGVzdDAsIGRlc3QxLCBkZXN0MiwgZGVzdDMpOworICBJTFZSX0I0X1NXKHplcm8sIGRlc3QwLCB6ZXJvLCBkZXN0MSwgemVybywgZGVzdDIsIHplcm8sIGRlc3QzLAorICAgICAgICAgICAgIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBJTFZSX0g0X1NXKHplcm8sIHJlczAsIHplcm8sIHJlczEsIHplcm8sIHJlczIsIHplcm8sIHJlczMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIEFERDQocmVzMCwgb3V0MCwgcmVzMSwgb3V0MSwgcmVzMiwgb3V0MiwgcmVzMywgb3V0MywgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIENMSVBfU1c0XzBfMjU1KHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBQQ0tFVl9CMl9TVyhyZXMwLCByZXMxLCByZXMyLCByZXMzLCBvdXQwLCBvdXQxKTsKKyAgcmVzMCA9ICh2NGkzMilfX21zYV9wY2tldl9iKCh2MTZpOClvdXQwLCAodjE2aTgpb3V0MSk7CisgIFNUNHg0X1VCKHJlczAsIHJlczAsIDMsIDIsIDEsIDAsIGRzdCwgQlBTKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVkZ2UgZmlsdGVyaW5nIGZ1bmN0aW9ucworCisjZGVmaW5lIEZMSVBfU0lHTjIoaW4wLCBpbjEsIG91dDAsIG91dDEpIHsgIFwKKyAgb3V0MCA9ICh2MTZpOClfX21zYV94b3JpX2IoaW4wLCAweDgwKTsgICAgXAorICBvdXQxID0gKHYxNmk4KV9fbXNhX3hvcmlfYihpbjEsIDB4ODApOyAgICBcCit9CisKKyNkZWZpbmUgRkxJUF9TSUdONChpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIHsgIFwKKyAgRkxJUF9TSUdOMihpbjAsIGluMSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOMihpbjIsIGluMywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBGSUxUX1ZBTChxMF9tLCBwMF9tLCBtYXNrLCBmaWx0KSBkbyB7ICBcCisgIHYxNmk4IHEwX3N1Yl9wMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcTBfc3ViX3AwID0gX19tc2Ffc3Vic19zX2IocTBfbSwgcDBfbSk7ICAgICAgXAorICBmaWx0ID0gX19tc2FfYWRkc19zX2IoZmlsdCwgcTBfc3ViX3AwKTsgICAgICBcCisgIGZpbHQgPSBfX21zYV9hZGRzX3NfYihmaWx0LCBxMF9zdWJfcDApOyAgICAgIFwKKyAgZmlsdCA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIHEwX3N1Yl9wMCk7ICAgICAgXAorICBmaWx0ID0gZmlsdCAmIG1hc2s7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZJTFQyKHFfbSwgcF9tLCBxLCBwKSBkbyB7ICAgICAgICAgICAgXAorICB1X3IgPSBTUkFJX0godGVtcDEsIDcpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdV9yID0gX19tc2Ffc2F0X3NfaCh1X3IsIDcpOyAgICAgICAgICAgICAgICBcCisgIHVfbCA9IFNSQUlfSCh0ZW1wMywgNyk7ICAgICAgICAgICAgICAgICAgICAgXAorICB1X2wgPSBfX21zYV9zYXRfc19oKHVfbCwgNyk7ICAgICAgICAgICAgICAgIFwKKyAgdSA9IF9fbXNhX3Bja2V2X2IoKHYxNmk4KXVfbCwgKHYxNmk4KXVfcik7ICBcCisgIHFfbSA9IF9fbXNhX3N1YnNfc19iKHFfbSwgdSk7ICAgICAgICAgICAgICAgXAorICBwX20gPSBfX21zYV9hZGRzX3NfYihwX20sIHUpOyAgICAgICAgICAgICAgIFwKKyAgcSA9IF9fbXNhX3hvcmlfYigodjE2dTgpcV9tLCAweDgwKTsgICAgICAgICBcCisgIHAgPSBfX21zYV94b3JpX2IoKHYxNnU4KXBfbSwgMHg4MCk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMUEZfRklMVEVSNF80VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2KSBkbyB7ICBcCisgIHYxNmk4IHAxX20sIHAwX20sIHEwX20sIHExX207ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggZmlsdCwgdDEsIHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCBjbnN0NGIgPSBfX21zYV9sZGlfYig0KTsgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IGNuc3QzYiA9IF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR040KHAxLCBwMCwgcTAsIHExLCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tKTsgICBcCisgIGZpbHQgPSBfX21zYV9zdWJzX3NfYihwMV9tLCBxMV9tKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgZmlsdCA9IGZpbHQgJiBoZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGSUxUX1ZBTChxMF9tLCBwMF9tLCBtYXNrLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfYWRkc19zX2IoZmlsdCwgY25zdDRiKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBTUkFJX0IodDEsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3QzYik7ICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gU1JBSV9CKHQyLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcTBfbSA9IF9fbXNhX3N1YnNfc19iKHEwX20sIHQxKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBxMCA9IF9fbXNhX3hvcmlfYigodjE2dTgpcTBfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICBcCisgIHAwX20gPSBfX21zYV9hZGRzX3NfYihwMF9tLCB0Mik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcDAgPSBfX21zYV94b3JpX2IoKHYxNnU4KXAwX20sIDB4ODApOyAgICAgICAgICAgICAgICAgXAorICBmaWx0ID0gX19tc2Ffc3JhcmlfYih0MSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGhldiA9IF9fbXNhX3hvcmlfYihoZXYsIDB4ZmYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmlsdCA9IGZpbHQgJiBoZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBxMV9tID0gX19tc2Ffc3Vic19zX2IocTFfbSwgZmlsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgIHExID0gX19tc2FfeG9yaV9iKCh2MTZ1OClxMV9tLCAweDgwKTsgICAgICAgICAgICAgICAgIFwKKyAgcDFfbSA9IF9fbXNhX2FkZHNfc19iKHAxX20sIGZpbHQpOyAgICAgICAgICAgICAgICAgICAgXAorICBwMSA9IF9fbXNhX3hvcmlfYigodjE2dTgpcDFfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExQRl9NQkZJTFRFUihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXYpIGRvIHsgIFwKKyAgdjE2aTggcDJfbSwgcDFfbSwgcDBfbSwgcTJfbSwgcTFfbSwgcTBfbTsgICAgICAgICAgICAgICAgICAgXAorICB2MTZpOCB1LCBmaWx0LCB0MSwgdDIsIGZpbHRfc2lnbjsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IGZpbHRfciwgZmlsdF9sLCB1X3IsIHVfbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCBjbnN0NGIgPSBfX21zYV9sZGlfYig0KTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNmk4IGNuc3QzYiA9IF9fbXNhX2xkaV9iKDMpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgY25zdDloID0gX19tc2FfbGRpX2goOSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBjbnN0NjNoID0gX19tc2FfbGRpX2goNjMpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdONChwMSwgcDAsIHEwLCBxMSwgcDFfbSwgcDBfbSwgcTBfbSwgcTFfbSk7ICAgICAgICAgXAorICBmaWx0ID0gX19tc2Ffc3Vic19zX2IocDFfbSwgcTFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZJTFRfVkFMKHEwX20sIHAwX20sIG1hc2ssIGZpbHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOMihwMiwgcTIsIHAyX20sIHEyX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IGZpbHQgJiBoZXY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGZpbHRfdmFsICY9IH5oZXYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaGV2ID0gX19tc2FfeG9yaV9iKGhldiwgMHhmZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmaWx0ID0gZmlsdCAmIGhldjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfYWRkc19zX2IodDIsIGNuc3Q0Yik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBTUkFJX0IodDEsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IF9fbXNhX2FkZHNfc19iKHQyLCBjbnN0M2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gU1JBSV9CKHQyLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcTBfbSA9IF9fbXNhX3N1YnNfc19iKHEwX20sIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwMF9tID0gX19tc2FfYWRkc19zX2IocDBfbSwgdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZpbHRfc2lnbiA9IF9fbXNhX2NsdGlfc19iKGZpbHQsIDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfU0goZmlsdF9zaWduLCBmaWx0LCBmaWx0X3IsIGZpbHRfbCk7ICAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgcTIvcDIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAwID0gZmlsdF9yICogY25zdDloOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDEgPSB0ZW1wMCArIGNuc3Q2M2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMiA9IGZpbHRfbCAqIGNuc3Q5aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAzID0gdGVtcDIgKyBjbnN0NjNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRklMVDIocTJfbSwgcDJfbSwgcTIsIHAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiB1cGRhdGUgcTEvcDEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXAxID0gdGVtcDEgKyB0ZW1wMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDMgPSB0ZW1wMyArIHRlbXAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGSUxUMihxMV9tLCBwMV9tLCBxMSwgcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHVwZGF0ZSBxMC9wMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcDEgPSB0ZW1wMSArIHRlbXAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wMyA9IHRlbXAzICsgdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZJTFQyKHEwX20sIHAwX20sIHEwLCBwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTFBGX01BU0tfSEVWKHAzX2luLCBwMl9pbiwgcDFfaW4sIHAwX2luLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcTBfaW4sIHExX2luLCBxMl9pbiwgcTNfaW4sICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBsaW1pdF9pbiwgYl9saW1pdF9pbiwgdGhyZXNoX2luLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGhldl9vdXQsIG1hc2tfb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBwM19hc3ViX3AyX20sIHAyX2FzdWJfcDFfbSwgcDFfYXN1Yl9wMF9tLCBxMV9hc3ViX3EwX207ICBcCisgIHYxNnU4IHAxX2FzdWJfcTFfbSwgcDBfYXN1Yl9xMF9tLCBxM19hc3ViX3EyX20sIHEyX2FzdWJfcTFfbTsgIFwKKyAgdjE2dTggZmxhdF9vdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGFic29sdXRlIHN1YnRyYWN0aW9uIG9mIHBpeGVsIHZhbHVlcyAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgcDNfYXN1Yl9wMl9tID0gX19tc2FfYXN1Yl91X2IocDNfaW4sIHAyX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBwMl9hc3ViX3AxX20gPSBfX21zYV9hc3ViX3VfYihwMl9pbiwgcDFfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHAxX2FzdWJfcDBfbSA9IF9fbXNhX2FzdWJfdV9iKHAxX2luLCBwMF9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcTFfYXN1Yl9xMF9tID0gX19tc2FfYXN1Yl91X2IocTFfaW4sIHEwX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBxMl9hc3ViX3ExX20gPSBfX21zYV9hc3ViX3VfYihxMl9pbiwgcTFfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIHEzX2FzdWJfcTJfbSA9IF9fbXNhX2FzdWJfdV9iKHEzX2luLCBxMl9pbik7ICAgICAgICAgICAgICAgICAgIFwKKyAgcDBfYXN1Yl9xMF9tID0gX19tc2FfYXN1Yl91X2IocDBfaW4sIHEwX2luKTsgICAgICAgICAgICAgICAgICAgXAorICBwMV9hc3ViX3ExX20gPSBfX21zYV9hc3ViX3VfYihwMV9pbiwgcTFfaW4pOyAgICAgICAgICAgICAgICAgICBcCisgIC8qIGNhbGN1bGF0aW9uIG9mIGhldiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZmxhdF9vdXQgPSBfX21zYV9tYXhfdV9iKHAxX2FzdWJfcDBfbSwgcTFfYXN1Yl9xMF9tKTsgICAgICAgICAgXAorICBoZXZfb3V0ID0gKHRocmVzaF9pbiA8IGZsYXRfb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGNhbGN1bGF0aW9uIG9mIG1hc2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcDBfYXN1Yl9xMF9tID0gX19tc2FfYWRkc191X2IocDBfYXN1Yl9xMF9tLCBwMF9hc3ViX3EwX20pOyAgICAgXAorICBwMV9hc3ViX3ExX20gPSBTUkFJX0IocDFfYXN1Yl9xMV9tLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHAwX2FzdWJfcTBfbSA9IF9fbXNhX2FkZHNfdV9iKHAwX2FzdWJfcTBfbSwgcDFfYXN1Yl9xMV9tKTsgICAgIFwKKyAgbWFza19vdXQgPSAoYl9saW1pdF9pbiA8IHAwX2FzdWJfcTBfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYXNrX291dCA9IF9fbXNhX21heF91X2IoZmxhdF9vdXQsIG1hc2tfb3V0KTsgICAgICAgICAgICAgICAgICBcCisgIHAzX2FzdWJfcDJfbSA9IF9fbXNhX21heF91X2IocDNfYXN1Yl9wMl9tLCBwMl9hc3ViX3AxX20pOyAgICAgIFwKKyAgbWFza19vdXQgPSBfX21zYV9tYXhfdV9iKHAzX2FzdWJfcDJfbSwgbWFza19vdXQpOyAgICAgICAgICAgICAgXAorICBxMl9hc3ViX3ExX20gPSBfX21zYV9tYXhfdV9iKHEyX2FzdWJfcTFfbSwgcTNfYXN1Yl9xMl9tKTsgICAgICBcCisgIG1hc2tfb3V0ID0gX19tc2FfbWF4X3VfYihxMl9hc3ViX3ExX20sIG1hc2tfb3V0KTsgICAgICAgICAgICAgIFwKKyAgbWFza19vdXQgPSAobGltaXRfaW4gPCBtYXNrX291dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBtYXNrX291dCA9IF9fbXNhX3hvcmlfYihtYXNrX291dCwgMHhmZik7ICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUNngxX1VCKGluMCwgaW4wX2lkeCwgaW4xLCBpbjFfaWR4LCBwZHN0LCBzdHJpZGUpIGRvIHsgXAorICBjb25zdCB1aW50MTZfdCB0bXAwX2ggPSBfX21zYV9jb3B5X3NfaCgodjhpMTYpaW4xLCBpbjFfaWR4KTsgIFwKKyAgY29uc3QgdWludDMyX3QgdG1wMF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWluMCwgaW4wX2lkeCk7ICBcCisgIFNXKHRtcDBfdywgcGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTSCh0bXAwX2gsIHBkc3QgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1Q2eDRfVUIoaW4wLCBzdGFydF9pbjBfaWR4LCBpbjEsIHN0YXJ0X2luMV9pZHgsIHBkc3QsIHN0cmlkZSkgZG8geyBcCisgIHVpbnQ4X3QqIHB0bXAxID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVDZ4MV9VQihpbjAsIHN0YXJ0X2luMF9pZHgsIGluMSwgc3RhcnRfaW4xX2lkeCwgcHRtcDEsIDQpOyAgICAgICAgICAgICAgIFwKKyAgcHRtcDEgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUNngxX1VCKGluMCwgc3RhcnRfaW4wX2lkeCArIDEsIGluMSwgc3RhcnRfaW4xX2lkeCArIDEsIHB0bXAxLCA0KTsgICAgICAgXAorICBwdG1wMSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1Q2eDFfVUIoaW4wLCBzdGFydF9pbjBfaWR4ICsgMiwgaW4xLCBzdGFydF9pbjFfaWR4ICsgMiwgcHRtcDEsIDQpOyAgICAgICBcCisgIHB0bXAxICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVDZ4MV9VQihpbjAsIHN0YXJ0X2luMF9pZHggKyAzLCBpbjEsIHN0YXJ0X2luMV9pZHggKyAzLCBwdG1wMSwgNCk7ICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTFBGX1NJTVBMRV9GSUxUKHAxX2luLCBwMF9pbiwgcTBfaW4sIHExX2luLCBtYXNrKSBkbyB7ICAgICAgIFwKKyAgICB2MTZpOCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tLCBmaWx0LCBmaWx0MSwgZmlsdDI7ICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2MTZpOCBjbnN0NGIgPSBfX21zYV9sZGlfYig0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB2MTZpOCBjbnN0M2IgPSAgX19tc2FfbGRpX2IoMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGTElQX1NJR040KHAxX2luLCBwMF9pbiwgcTBfaW4sIHExX2luLCBwMV9tLCBwMF9tLCBxMF9tLCBxMV9tKTsgIFwKKyAgICBmaWx0ID0gX19tc2Ffc3Vic19zX2IocDFfbSwgcTFfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxUX1ZBTChxMF9tLCBwMF9tLCBtYXNrLCBmaWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0MSA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3Q0Yik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0MSA9IFNSQUlfQihmaWx0MSwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0MiA9IF9fbXNhX2FkZHNfc19iKGZpbHQsIGNuc3QzYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmaWx0MiA9IFNSQUlfQihmaWx0MiwgMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBxMF9tID0gX19tc2Ffc3Vic19zX2IocTBfbSwgZmlsdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMF9tID0gX19tc2FfYWRkc19zX2IocDBfbSwgZmlsdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBxMF9pbiA9IF9fbXNhX3hvcmlfYigodjE2dTgpcTBfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMF9pbiA9IF9fbXNhX3hvcmlfYigodjE2dTgpcDBfbSwgMHg4MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTFBGX1NJTVBMRV9NQVNLKHAxLCBwMCwgcTAsIHExLCBiX2xpbWl0LCBtYXNrKSBkbyB7ICAgIFwKKyAgICB2MTZ1OCBwMV9hX3N1Yl9xMSwgcDBfYV9zdWJfcTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMF9hX3N1Yl9xMCA9IF9fbXNhX2FzdWJfdV9iKHAwLCBxMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMV9hX3N1Yl9xMSA9IF9fbXNhX2FzdWJfdV9iKHAxLCBxMSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwMV9hX3N1Yl9xMSA9ICh2MTZ1OClfX21zYV9zcmxpX2IoKHYxNmk4KXAxX2Ffc3ViX3ExLCAxKTsgIFwKKyAgICBwMF9hX3N1Yl9xMCA9IF9fbXNhX2FkZHNfdV9iKHAwX2Ffc3ViX3EwLCBwMF9hX3N1Yl9xMCk7ICAgIFwKKyAgICBtYXNrID0gX19tc2FfYWRkc191X2IocDBfYV9zdWJfcTAsIHAxX2Ffc3ViX3ExKTsgICAgICAgICAgIFwKKyAgICBtYXNrID0gKG1hc2sgPD0gYl9saW1pdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNih1aW50OF90KiBzcmMsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB1aW50OF90KiBwdGVtcCA9IHNyYyAtIDQgKiBzdHJpZGU7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMDsKKyAgdjE2dTggbWFzaywgaGV2OworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworCisgIExEX1VCOChwdGVtcCwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX01CRklMVEVSKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldik7CisgIHB0ZW1wID0gc3JjIC0gMyAqIHN0cmlkZTsKKyAgU1RfVUI0KHAyLCBwMSwgcDAsIHEwLCBwdGVtcCwgc3RyaWRlKTsKKyAgcHRlbXAgKz0gKDQgKiBzdHJpZGUpOworICBTVF9VQjIocTEsIHEyLCBwdGVtcCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2KHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHVpbnQ4X3QqIHB0bXAgID0gc3JjIC0gNDsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwOworICB2MTZ1OCBtYXNrLCBoZXY7CisgIHYxNnU4IHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcsIHJvdzg7CisgIHYxNnU4IHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTU7CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHRtcDYsIHRtcDc7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworICBjb25zdCB2MTZ1OCBsaW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXRfaW4pOworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisKKyAgTERfVUI4KHB0bXAsIHN0cmlkZSwgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nyk7CisgIHB0bXAgKz0gKDggKiBzdHJpZGUpOworICBMRF9VQjgocHRtcCwgc3RyaWRlLCByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1KTsKKyAgVFJBTlNQT1NFMTZ4OF9VQl9VQihyb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LAorICAgICAgICAgICAgICAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUsCisgICAgICAgICAgICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9NQkZJTFRFUihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXYpOworICBJTFZSX0IyX1NIKHAxLCBwMiwgcTAsIHAwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wMywgdG1wNCk7CisgIElMVkxfQjJfU0gocDEsIHAyLCBxMCwgcDAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSCh0bXAxLCB0bXAwLCB0bXA2LCB0bXA3KTsKKyAgSUxWUkxfQjJfU0gocTIsIHExLCB0bXAyLCB0bXA1KTsKKyAgcHRtcCA9IHNyYyAtIDM7CisgIFNUNngxX1VCKHRtcDMsIDAsIHRtcDIsIDAsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wMywgMSwgdG1wMiwgMSwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXAzLCAyLCB0bXAyLCAyLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDMsIDMsIHRtcDIsIDMsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNCwgMCwgdG1wMiwgNCwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA0LCAxLCB0bXAyLCA1LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDQsIDIsIHRtcDIsIDYsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNCwgMywgdG1wMiwgNywgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA2LCAwLCB0bXA1LCAwLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDYsIDEsIHRtcDUsIDEsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNiwgMiwgdG1wNSwgMiwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA2LCAzLCB0bXA1LCAzLCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDcsIDAsIHRtcDUsIDQsIHB0bXAsIDQpOworICBwdG1wICs9IHN0cmlkZTsKKyAgU1Q2eDFfVUIodG1wNywgMSwgdG1wNSwgNSwgcHRtcCwgNCk7CisgIHB0bXAgKz0gc3RyaWRlOworICBTVDZ4MV9VQih0bXA3LCAyLCB0bXA1LCA2LCBwdG1wLCA0KTsKKyAgcHRtcCArPSBzdHJpZGU7CisgIFNUNngxX1VCKHRtcDcsIDMsIHRtcDUsIDcsIHB0bXAsIDQpOworfQorCisvLyBvbiB0aHJlZSBpbm5lciBlZGdlcworc3RhdGljIHZvaWQgVkZpbHRlckhvckVkZ2UxNmkodWludDhfdCogc3JjLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXQsIGludCBsaW1pdCwgaW50IHRocmVzaCkgeworICB2MTZ1OCBtYXNrLCBoZXY7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMDsKKyAgY29uc3QgdjE2dTggdGhyZXNoMCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoKTsKKyAgY29uc3QgdjE2dTggYl9saW1pdDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXQpOworICBjb25zdCB2MTZ1OCBsaW1pdDAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0KTsKKworICBMRF9VQjgoKHNyYyAtIDQgKiBzdHJpZGUpLCBzdHJpZGUsIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0MCwgYl9saW1pdDAsIHRocmVzaDAsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfRklMVEVSNF80VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2KTsKKyAgU1RfVUI0KHAxLCBwMCwgcTAsIHExLCAoc3JjIC0gMiAqIHN0cmlkZSksIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmkodWludDhfdCogc3JjX3ksIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBiX2xpbWl0LCBpbnQgbGltaXQsIGludCB0aHJlc2gpIHsKKyAgVkZpbHRlckhvckVkZ2UxNmkoc3JjX3kgKyAgNCAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKKyAgVkZpbHRlckhvckVkZ2UxNmkoc3JjX3kgKyAgOCAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKKyAgVkZpbHRlckhvckVkZ2UxNmkoc3JjX3kgKyAxMiAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlclZlcnRFZGdlMTZpKHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdCwgaW50IGxpbWl0LCBpbnQgdGhyZXNoKSB7CisgIHYxNnU4IG1hc2ssIGhldjsKKyAgdjE2dTggcDMsIHAyLCBwMSwgcDAsIHEzLCBxMiwgcTEsIHEwOworICB2MTZ1OCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3OworICB2MTZ1OCByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICBjb25zdCB2MTZ1OCB0aHJlc2gwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2gpOworICBjb25zdCB2MTZ1OCBiX2xpbWl0MCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdCk7CisgIGNvbnN0IHYxNnU4IGxpbWl0MCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGltaXQpOworCisgIExEX1VCOChzcmMgLSA0LCBzdHJpZGUsIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcpOworICBMRF9VQjgoc3JjIC0gNCArICg4ICogc3RyaWRlKSwgc3RyaWRlLAorICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSk7CisgIFRSQU5TUE9TRTE2eDhfVUJfVUIocm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NywKKyAgICAgICAgICAgICAgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1LAorICAgICAgICAgICAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0MCwgYl9saW1pdDAsIHRocmVzaDAsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfRklMVEVSNF80VyhwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2KTsKKyAgSUxWUl9CMl9TSChwMCwgcDEsIHExLCBxMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDIsIHRtcDMpOworICBJTFZMX0IyX1NIKHAwLCBwMSwgcTEsIHEwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wNCwgdG1wNSk7CisgIHNyYyAtPSAyOworICBTVDR4OF9VQih0bXAyLCB0bXAzLCBzcmMsIHN0cmlkZSk7CisgIHNyYyArPSAoOCAqIHN0cmlkZSk7CisgIFNUNHg4X1VCKHRtcDQsIHRtcDUsIHNyYywgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjE2aSh1aW50OF90KiBzcmNfeSwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXQsIGludCBsaW1pdCwgaW50IHRocmVzaCkgeworICBIRmlsdGVyVmVydEVkZ2UxNmkoc3JjX3kgKyAgNCwgc3RyaWRlLCBiX2xpbWl0LCBsaW1pdCwgdGhyZXNoKTsKKyAgSEZpbHRlclZlcnRFZGdlMTZpKHNyY195ICsgIDgsIHN0cmlkZSwgYl9saW1pdCwgbGltaXQsIHRocmVzaCk7CisgIEhGaWx0ZXJWZXJ0RWRnZTE2aShzcmNfeSArIDEyLCBzdHJpZGUsIGJfbGltaXQsIGxpbWl0LCB0aHJlc2gpOworfQorCisvLyA4LXBpeGVscyB3aWRlIHZhcmlhbnRzLCBmb3IgY2hyb21hIGZpbHRlcmluZworc3RhdGljIHZvaWQgVkZpbHRlcjgodWludDhfdCogc3JjX3UsIHVpbnQ4X3QqIHNyY192LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgaW50IGJfbGltaXRfaW4sIGludCBsaW1pdF9pbiwgaW50IHRocmVzaF9pbikgeworICB1aW50OF90KiBwdG1wX3NyY191ID0gc3JjX3UgLSA0ICogc3RyaWRlOworICB1aW50OF90KiBwdG1wX3NyY192ID0gc3JjX3YgLSA0ICogc3RyaWRlOworICB1aW50NjRfdCBwMl9kLCBwMV9kLCBwMF9kLCBxMF9kLCBxMV9kLCBxMl9kOworICB2MTZ1OCBwMywgcDIsIHAxLCBwMCwgcTMsIHEyLCBxMSwgcTAsIG1hc2ssIGhldjsKKyAgdjE2dTggcDNfdSwgcDJfdSwgcDFfdSwgcDBfdSwgcTNfdSwgcTJfdSwgcTFfdSwgcTBfdTsKKyAgdjE2dTggcDNfdiwgcDJfdiwgcDFfdiwgcDBfdiwgcTNfdiwgcTJfdiwgcTFfdiwgcTBfdjsKKyAgY29uc3QgdjE2dTggYl9saW1pdCA9ICh2MTZ1OClfX21zYV9maWxsX2IoYl9saW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IHRocmVzaCA9ICh2MTZ1OClfX21zYV9maWxsX2IodGhyZXNoX2luKTsKKworICBMRF9VQjgocHRtcF9zcmNfdSwgc3RyaWRlLCBwM191LCBwMl91LCBwMV91LCBwMF91LCBxMF91LCBxMV91LCBxMl91LCBxM191KTsKKyAgTERfVUI4KHB0bXBfc3JjX3YsIHN0cmlkZSwgcDNfdiwgcDJfdiwgcDFfdiwgcDBfdiwgcTBfdiwgcTFfdiwgcTJfdiwgcTNfdik7CisgIElMVlJfRDRfVUIocDNfdiwgcDNfdSwgcDJfdiwgcDJfdSwgcDFfdiwgcDFfdSwgcDBfdiwgcDBfdSwgcDMsIHAyLCBwMSwgcDApOworICBJTFZSX0Q0X1VCKHEwX3YsIHEwX3UsIHExX3YsIHExX3UsIHEyX3YsIHEyX3UsIHEzX3YsIHEzX3UsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9NQkZJTFRFUihwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBtYXNrLCBoZXYpOworICBwMl9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAyLCAwKTsKKyAgcDFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMSwgMCk7CisgIHAwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDAsIDApOworICBxMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEwLCAwKTsKKyAgcTFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMSwgMCk7CisgIHEyX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTIsIDApOworICBwdG1wX3NyY191ICs9IHN0cmlkZTsKKyAgU0Q0KHAyX2QsIHAxX2QsIHAwX2QsIHEwX2QsIHB0bXBfc3JjX3UsIHN0cmlkZSk7CisgIHB0bXBfc3JjX3UgKz0gKDQgKiBzdHJpZGUpOworICBTRChxMV9kLCBwdG1wX3NyY191KTsKKyAgcHRtcF9zcmNfdSArPSBzdHJpZGU7CisgIFNEKHEyX2QsIHB0bXBfc3JjX3UpOworICBwMl9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAyLCAxKTsKKyAgcDFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMSwgMSk7CisgIHAwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDAsIDEpOworICBxMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXEwLCAxKTsKKyAgcTFfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMSwgMSk7CisgIHEyX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTIsIDEpOworICBwdG1wX3NyY192ICs9IHN0cmlkZTsKKyAgU0Q0KHAyX2QsIHAxX2QsIHAwX2QsIHEwX2QsIHB0bXBfc3JjX3YsIHN0cmlkZSk7CisgIHB0bXBfc3JjX3YgKz0gKDQgKiBzdHJpZGUpOworICBTRChxMV9kLCBwdG1wX3NyY192KTsKKyAgcHRtcF9zcmNfdiArPSBzdHJpZGU7CisgIFNEKHEyX2QsIHB0bXBfc3JjX3YpOworfQorCitzdGF0aWMgdm9pZCBIRmlsdGVyOCh1aW50OF90KiBzcmNfdSwgdWludDhfdCogc3JjX3YsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHVpbnQ4X3QqIHB0bXBfc3JjX3UgPSBzcmNfdSAtIDQ7CisgIHVpbnQ4X3QqIHB0bXBfc3JjX3YgPSBzcmNfdiAtIDQ7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMCwgbWFzaywgaGV2OworICB2MTZ1OCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LCByb3c4OworICB2MTZ1OCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1LCB0bXA2LCB0bXA3OworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGxpbWl0X2luKTsKKyAgY29uc3QgdjE2dTggdGhyZXNoID0gKHYxNnU4KV9fbXNhX2ZpbGxfYih0aHJlc2hfaW4pOworCisgIExEX1VCOChwdG1wX3NyY191LCBzdHJpZGUsIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzcpOworICBMRF9VQjgocHRtcF9zcmNfdiwgc3RyaWRlLAorICAgICAgICAgcm93OCwgcm93OSwgcm93MTAsIHJvdzExLCByb3cxMiwgcm93MTMsIHJvdzE0LCByb3cxNSk7CisgIFRSQU5TUE9TRTE2eDhfVUJfVUIocm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93NywKKyAgICAgICAgICAgICAgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1LAorICAgICAgICAgICAgICAgICAgICAgIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMyk7CisgIExQRl9NQVNLX0hFVihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGxpbWl0LCBiX2xpbWl0LCB0aHJlc2gsCisgICAgICAgICAgICAgICBoZXYsIG1hc2spOworICBMUEZfTUJGSUxURVIocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2KTsKKyAgSUxWUl9CMl9TSChwMSwgcDIsIHEwLCBwMCwgdG1wMCwgdG1wMSk7CisgIElMVlJMX0gyX1NIKHRtcDEsIHRtcDAsIHRtcDMsIHRtcDQpOworICBJTFZMX0IyX1NIKHAxLCBwMiwgcTAsIHAwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU0godG1wMSwgdG1wMCwgdG1wNiwgdG1wNyk7CisgIElMVlJMX0IyX1NIKHEyLCBxMSwgdG1wMiwgdG1wNSk7CisgIHB0bXBfc3JjX3UgKz0gMTsKKyAgU1Q2eDRfVUIodG1wMywgMCwgdG1wMiwgMCwgcHRtcF9zcmNfdSwgc3RyaWRlKTsKKyAgcHRtcF9zcmNfdSArPSA0ICogc3RyaWRlOworICBTVDZ4NF9VQih0bXA0LCAwLCB0bXAyLCA0LCBwdG1wX3NyY191LCBzdHJpZGUpOworICBwdG1wX3NyY192ICs9IDE7CisgIFNUNng0X1VCKHRtcDYsIDAsIHRtcDUsIDAsIHB0bXBfc3JjX3YsIHN0cmlkZSk7CisgIHB0bXBfc3JjX3YgKz0gNCAqIHN0cmlkZTsKKyAgU1Q2eDRfVUIodG1wNywgMCwgdG1wNSwgNCwgcHRtcF9zcmNfdiwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgVkZpbHRlcjhpKHVpbnQ4X3QqIHNyY191LCB1aW50OF90KiBzcmNfdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHVpbnQ2NF90IHAxX2QsIHAwX2QsIHEwX2QsIHExX2Q7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMCwgbWFzaywgaGV2OworICB2MTZ1OCBwM191LCBwMl91LCBwMV91LCBwMF91LCBxM191LCBxMl91LCBxMV91LCBxMF91OworICB2MTZ1OCBwM192LCBwMl92LCBwMV92LCBwMF92LCBxM192LCBxMl92LCBxMV92LCBxMF92OworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworCisgIExEX1VCOChzcmNfdSwgc3RyaWRlLCBwM191LCBwMl91LCBwMV91LCBwMF91LCBxMF91LCBxMV91LCBxMl91LCBxM191KTsKKyAgc3JjX3UgKz0gKDUgKiBzdHJpZGUpOworICBMRF9VQjgoc3JjX3YsIHN0cmlkZSwgcDNfdiwgcDJfdiwgcDFfdiwgcDBfdiwgcTBfdiwgcTFfdiwgcTJfdiwgcTNfdik7CisgIHNyY192ICs9ICg1ICogc3RyaWRlKTsKKyAgSUxWUl9ENF9VQihwM192LCBwM191LCBwMl92LCBwMl91LCBwMV92LCBwMV91LCBwMF92LCBwMF91LCBwMywgcDIsIHAxLCBwMCk7CisgIElMVlJfRDRfVUIocTBfdiwgcTBfdSwgcTFfdiwgcTFfdSwgcTJfdiwgcTJfdSwgcTNfdiwgcTNfdSwgcTAsIHExLCBxMiwgcTMpOworICBMUEZfTUFTS19IRVYocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBsaW1pdCwgYl9saW1pdCwgdGhyZXNoLAorICAgICAgICAgICAgICAgaGV2LCBtYXNrKTsKKyAgTFBGX0ZJTFRFUjRfNFcocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldik7CisgIHAxX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcDEsIDApOworICBwMF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAwLCAwKTsKKyAgcTBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClxMCwgMCk7CisgIHExX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTEsIDApOworICBTRDQocTFfZCwgcTBfZCwgcDBfZCwgcDFfZCwgc3JjX3UsIC1zdHJpZGUpOworICBwMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXAxLCAxKTsKKyAgcDBfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClwMCwgMSk7CisgIHEwX2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcTAsIDEpOworICBxMV9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXExLCAxKTsKKyAgU0Q0KHExX2QsIHEwX2QsIHAwX2QsIHAxX2QsIHNyY192LCAtc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpKHVpbnQ4X3QqIHNyY191LCB1aW50OF90KiBzcmNfdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYl9saW1pdF9pbiwgaW50IGxpbWl0X2luLCBpbnQgdGhyZXNoX2luKSB7CisgIHYxNnU4IHAzLCBwMiwgcDEsIHAwLCBxMywgcTIsIHExLCBxMCwgbWFzaywgaGV2OworICB2MTZ1OCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LCByb3c4OworICB2MTZ1OCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1OworICB2NGkzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCB0bXA0LCB0bXA1OworICBjb25zdCB2MTZ1OCB0aHJlc2ggPSAodjE2dTgpX19tc2FfZmlsbF9iKHRocmVzaF9pbik7CisgIGNvbnN0IHYxNnU4IGxpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihsaW1pdF9pbik7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworCisgIExEX1VCOChzcmNfdSwgc3RyaWRlLCByb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3KTsKKyAgTERfVUI4KHNyY192LCBzdHJpZGUsCisgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1KTsKKyAgVFJBTlNQT1NFMTZ4OF9VQl9VQihyb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LAorICAgICAgICAgICAgICAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUsCisgICAgICAgICAgICAgICAgICAgICAgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzKTsKKyAgTFBGX01BU0tfSEVWKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywgbGltaXQsIGJfbGltaXQsIHRocmVzaCwKKyAgICAgICAgICAgICAgIGhldiwgbWFzayk7CisgIExQRl9GSUxURVI0XzRXKHAxLCBwMCwgcTAsIHExLCBtYXNrLCBoZXYpOworICBJTFZSX0IyX1NXKHAwLCBwMSwgcTEsIHEwLCB0bXAwLCB0bXAxKTsKKyAgSUxWUkxfSDJfU1codG1wMSwgdG1wMCwgdG1wMiwgdG1wMyk7CisgIElMVkxfQjJfU1cocDAsIHAxLCBxMSwgcTAsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TVyh0bXAxLCB0bXAwLCB0bXA0LCB0bXA1KTsKKyAgc3JjX3UgKz0gMjsKKyAgU1Q0eDRfVUIodG1wMiwgdG1wMiwgMCwgMSwgMiwgMywgc3JjX3UsIHN0cmlkZSk7CisgIHNyY191ICs9IDQgKiBzdHJpZGU7CisgIFNUNHg0X1VCKHRtcDMsIHRtcDMsIDAsIDEsIDIsIDMsIHNyY191LCBzdHJpZGUpOworICBzcmNfdiArPSAyOworICBTVDR4NF9VQih0bXA0LCB0bXA0LCAwLCAxLCAyLCAzLCBzcmNfdiwgc3RyaWRlKTsKKyAgc3JjX3YgKz0gNCAqIHN0cmlkZTsKKyAgU1Q0eDRfVUIodG1wNSwgdG1wNSwgMCwgMSwgMiwgMywgc3JjX3YsIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNih1aW50OF90KiBzcmMsIGludCBzdHJpZGUsIGludCBiX2xpbWl0X2luKSB7CisgIHYxNnU4IHAxLCBwMCwgcTEsIHEwLCBtYXNrOworICBjb25zdCB2MTZ1OCBiX2xpbWl0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihiX2xpbWl0X2luKTsKKworICBMRF9VQjQoc3JjIC0gMiAqIHN0cmlkZSwgc3RyaWRlLCBwMSwgcDAsIHEwLCBxMSk7CisgIExQRl9TSU1QTEVfTUFTSyhwMSwgcDAsIHEwLCBxMSwgYl9saW1pdCwgbWFzayk7CisgIExQRl9TSU1QTEVfRklMVChwMSwgcDAsIHEwLCBxMSwgbWFzayk7CisgIFNUX1VCMihwMCwgcTAsIHNyYyAtIHN0cmlkZSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2KHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwgaW50IGJfbGltaXRfaW4pIHsKKyAgdjE2dTggcDEsIHAwLCBxMSwgcTAsIG1hc2ssIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzMsIHJvdzQsIHJvdzUsIHJvdzYsIHJvdzc7CisgIHYxNnU4IHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTU7CisgIHY4aTE2IHRtcDAsIHRtcDE7CisgIGNvbnN0IHYxNnU4IGJfbGltaXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKGJfbGltaXRfaW4pOworICB1aW50OF90KiBwdGVtcF9zcmMgPSBzcmMgLSAyOworCisgIExEX1VCOChwdGVtcF9zcmMsIHN0cmlkZSwgcm93MCwgcm93MSwgcm93Miwgcm93Mywgcm93NCwgcm93NSwgcm93Niwgcm93Nyk7CisgIExEX1VCOChwdGVtcF9zcmMgKyA4ICogc3RyaWRlLCBzdHJpZGUsCisgICAgICAgICByb3c4LCByb3c5LCByb3cxMCwgcm93MTEsIHJvdzEyLCByb3cxMywgcm93MTQsIHJvdzE1KTsKKyAgVFJBTlNQT1NFMTZ4NF9VQl9VQihyb3cwLCByb3cxLCByb3cyLCByb3czLCByb3c0LCByb3c1LCByb3c2LCByb3c3LAorICAgICAgICAgICAgICAgICAgICAgIHJvdzgsIHJvdzksIHJvdzEwLCByb3cxMSwgcm93MTIsIHJvdzEzLCByb3cxNCwgcm93MTUsCisgICAgICAgICAgICAgICAgICAgICAgcDEsIHAwLCBxMCwgcTEpOworICBMUEZfU0lNUExFX01BU0socDEsIHAwLCBxMCwgcTEsIGJfbGltaXQsIG1hc2spOworICBMUEZfU0lNUExFX0ZJTFQocDEsIHAwLCBxMCwgcTEsIG1hc2spOworICBJTFZSTF9CMl9TSChxMCwgcDAsIHRtcDEsIHRtcDApOworICBwdGVtcF9zcmMgKz0gMTsKKyAgU1QyeDRfVUIodG1wMSwgMCwgcHRlbXBfc3JjLCBzdHJpZGUpOworICBwdGVtcF9zcmMgKz0gNCAqIHN0cmlkZTsKKyAgU1QyeDRfVUIodG1wMSwgNCwgcHRlbXBfc3JjLCBzdHJpZGUpOworICBwdGVtcF9zcmMgKz0gNCAqIHN0cmlkZTsKKyAgU1QyeDRfVUIodG1wMCwgMCwgcHRlbXBfc3JjLCBzdHJpZGUpOworICBwdGVtcF9zcmMgKz0gNCAqIHN0cmlkZTsKKyAgU1QyeDRfVUIodG1wMCwgNCwgcHRlbXBfc3JjLCBzdHJpZGUpOworICBwdGVtcF9zcmMgKz0gNCAqIHN0cmlkZTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aSh1aW50OF90KiBzcmNfeSwgaW50IHN0cmlkZSwgaW50IGJfbGltaXRfaW4pIHsKKyAgU2ltcGxlVkZpbHRlcjE2KHNyY195ICsgIDQgKiBzdHJpZGUsIHN0cmlkZSwgYl9saW1pdF9pbik7CisgIFNpbXBsZVZGaWx0ZXIxNihzcmNfeSArICA4ICogc3RyaWRlLCBzdHJpZGUsIGJfbGltaXRfaW4pOworICBTaW1wbGVWRmlsdGVyMTYoc3JjX3kgKyAxMiAqIHN0cmlkZSwgc3RyaWRlLCBiX2xpbWl0X2luKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aSh1aW50OF90KiBzcmNfeSwgaW50IHN0cmlkZSwgaW50IGJfbGltaXRfaW4pIHsKKyAgU2ltcGxlSEZpbHRlcjE2KHNyY195ICsgIDQsIHN0cmlkZSwgYl9saW1pdF9pbik7CisgIFNpbXBsZUhGaWx0ZXIxNihzcmNfeSArICA4LCBzdHJpZGUsIGJfbGltaXRfaW4pOworICBTaW1wbGVIRmlsdGVyMTYoc3JjX3kgKyAxMiwgc3RyaWRlLCBiX2xpbWl0X2luKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhIHByZWRpY3Rpb25zCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyA0eDQKKworc3RhdGljIHZvaWQgREM0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERDCisgIHVpbnQzMl90IGRjID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIGRjICs9IGRzdFtpIC0gQlBTXSArIGRzdFstMSArIGkgKiBCUFNdOworICBkYyA+Pj0gMzsKKyAgZGMgPSBkYyB8IChkYyA8PCA4KSB8IChkYyA8PCAxNikgfCAoZGMgPDwgMjQpOworICBTVzQoZGMsIGRjLCBkYywgZGMsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgVE00KHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBwdGVtcCA9IGRzdCAtIEJQUyAtIDE7CisgIHY4aTE2IFQsIGQsIHIwLCByMSwgcjIsIHIzOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisgIGNvbnN0IHY4aTE2IFRMID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChwdGVtcFswICogQlBTXSk7CisgIGNvbnN0IHY4aTE2IEwwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChwdGVtcFsxICogQlBTXSk7CisgIGNvbnN0IHY4aTE2IEwxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChwdGVtcFsyICogQlBTXSk7CisgIGNvbnN0IHY4aTE2IEwyID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChwdGVtcFszICogQlBTXSk7CisgIGNvbnN0IHY4aTE2IEwzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChwdGVtcFs0ICogQlBTXSk7CisgIGNvbnN0IHYxNnU4IFQxID0gTERfVUIocHRlbXAgKyAxKTsKKworICBUICA9ICh2OGkxNilfX21zYV9pbHZyX2IoemVybywgKHYxNmk4KVQxKTsKKyAgZCA9IFQgLSBUTDsKKyAgQURENChkLCBMMCwgZCwgTDEsIGQsIEwyLCBkLCBMMywgcjAsIHIxLCByMiwgcjMpOworICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgIFBDS0VWX1NUNHg0X1VCKHIwLCByMSwgcjIsIHIzLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFZFNCh1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdWludDhfdCogY29uc3QgcHRvcCA9IGRzdCAtIEJQUyAtIDE7CisgIGNvbnN0IHVpbnQzMl90IHZhbDAgPSBMVyhwdG9wICsgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDEgPSBMVyhwdG9wICsgNCk7CisgIHVpbnQzMl90IG91dDsKKyAgdjE2dTggQSA9IHsgMCB9LCBCLCBDLCBBQywgQjIsIFI7CisKKyAgSU5TRVJUX1cyX1VCKHZhbDAsIHZhbDEsIEEpOworICBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgQyA9IFNMRElfVUIoQSwgQSwgMik7CisgIEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBSID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgb3V0ID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBTVzQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIFJENCh1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLXJpZ2h0CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHB0b3AgPSBkc3QgLSAxIC0gQlBTOworICB1aW50MzJfdCB2YWwwID0gTFcocHRvcCArIDApOworICB1aW50MzJfdCB2YWwxID0gTFcocHRvcCArIDQpOworICB1aW50MzJfdCB2YWwyLCB2YWwzOworICB2MTZ1OCBBLCBCLCBDLCBBQywgQjIsIFIsIEExID0geyAwIH07CisKKyAgSU5TRVJUX1cyX1VCKHZhbDAsIHZhbDEsIEExKTsKKyAgQSA9IFNMRElfVUIoQTEsIEExLCAxMik7CisgIEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUEsIDMsIHB0b3BbMSAqIEJQU10pOworICBBID0gKHYxNnU4KV9fbXNhX2luc2VydF9iKCh2MTZpOClBLCAyLCBwdG9wWzIgKiBCUFNdKTsKKyAgQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQSwgMSwgcHRvcFszICogQlBTXSk7CisgIEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUEsIDAsIHB0b3BbNCAqIEJQU10pOworICBCID0gU0xESV9VQihBLCBBLCAxKTsKKyAgQyA9IFNMRElfVUIoQSwgQSwgMik7CisgIEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBSID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgdmFsMyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDIgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwxID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgU1c0KHZhbDAsIHZhbDEsIHZhbDIsIHZhbDMsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgTEQ0KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tTGVmdAorICBjb25zdCB1aW50OF90KiBjb25zdCBwdG9wID0gZHN0IC0gQlBTOworICB1aW50MzJfdCB2YWwwID0gTFcocHRvcCArIDApOworICB1aW50MzJfdCB2YWwxID0gTFcocHRvcCArIDQpOworICB1aW50MzJfdCB2YWwyLCB2YWwzOworICB2MTZ1OCBBID0geyAwIH0sIEIsIEMsIEFDLCBCMiwgUjsKKworICBJTlNFUlRfVzJfVUIodmFsMCwgdmFsMSwgQSk7CisgIEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBDID0gU0xESV9VQihBLCBBLCAyKTsKKyAgQyA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQywgNiwgcHRvcFs3XSk7CisgIEFDID0gX19tc2FfYXZlX3VfYihBLCBDKTsKKyAgQjIgPSBfX21zYV9hdmVfdV9iKEIsIEIpOworICBSID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgdmFsMCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgUiA9IFNMRElfVUIoUiwgUiwgMSk7CisgIHZhbDEgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUiwgMCk7CisgIFIgPSBTTERJX1VCKFIsIFIsIDEpOworICB2YWwyID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIsIDApOworICBSID0gU0xESV9VQihSLCBSLCAxKTsKKyAgdmFsMyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgU1c0KHZhbDAsIHZhbDEsIHZhbDIsIHZhbDMsIGRzdCwgQlBTKTsKK30KKworLy8gMTZ4MTYKKworc3RhdGljIHZvaWQgREMxNih1aW50OF90KiBkc3QpIHsgICAvLyBEQworICB1aW50MzJfdCBkYyA9IDE2OworICBpbnQgaTsKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHY4dTE2IGRjdG9wID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgIHYxNnU4IG91dDsKKworICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGRjICs9IGRzdFstMSArIGkgKiBCUFNdOworICB9CisgIGRjICs9IEhBRERfVUhfVTMyKGRjdG9wKTsKKyAgb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkYyA+PiA1KTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgOCAqIEJQUywgQlBTKTsKK30KKworc3RhdGljIHZvaWQgVE0xNih1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIHY4aTE2IGQxLCBkMjsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xIC0gQlBTXSk7CisgIGNvbnN0IHYxNmk4IFQgPSBMRF9TQihkc3QgLSBCUFMpOworCisgIElMVlJMX0IyX1NIKHplcm8sIFQsIGQxLCBkMik7CisgIFNVQjIoZDEsIFRMLCBkMiwgVEwsIGQxLCBkMik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7CisgICAgdjE2aTggdDAsIHQxLCB0MiwgdDM7CisgICAgdjhpMTYgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3OworICAgIGNvbnN0IHY4aTE2IEwwID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAwICogQlBTXSk7CisgICAgY29uc3QgdjhpMTYgTDEgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDEgKiBCUFNdKTsKKyAgICBjb25zdCB2OGkxNiBMMiA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMiAqIEJQU10pOworICAgIGNvbnN0IHY4aTE2IEwzID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAzICogQlBTXSk7CisgICAgQURENChkMSwgTDAsIGQxLCBMMSwgZDEsIEwyLCBkMSwgTDMsIHIwLCByMSwgcjIsIHIzKTsKKyAgICBBREQ0KGQyLCBMMCwgZDIsIEwxLCBkMiwgTDIsIGQyLCBMMywgcjQsIHI1LCByNiwgcjcpOworICAgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgICBDTElQX1NINF8wXzI1NShyNCwgcjUsIHI2LCByNyk7CisgICAgUENLRVZfQjRfU0IocjQsIHIwLCByNSwgcjEsIHI2LCByMiwgcjcsIHIzLCB0MCwgdDEsIHQyLCB0Myk7CisgICAgU1RfU0I0KHQwLCB0MSwgdDIsIHQzLCBkc3QsIEJQUyk7CisgICAgZHN0ICs9IDQgKiBCUFM7CisgIH0KK30KKworc3RhdGljIHZvaWQgVkUxNih1aW50OF90KiBkc3QpIHsgICAvLyB2ZXJ0aWNhbAorICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIoZHN0IC0gQlBTKTsKKyAgU1RfVUI4KHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIGRzdCwgQlBTKTsKKyAgU1RfVUI4KHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIHJ0b3AsIGRzdCArIDggKiBCUFMsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIEhFMTYodWludDhfdCogZHN0KSB7ICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMTY7IGogPiAwOyBqIC09IDQpIHsKKyAgICBjb25zdCB2MTZ1OCBMMCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMCAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwxID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAxICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDIgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDIgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMyA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMyAqIEJQU10pOworICAgIFNUX1VCNChMMCwgTDEsIEwyLCBMMywgZHN0LCBCUFMpOworICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIHRvcCBzYW1wbGVzIG5vdCBhdmFpbGFibGUKKyAgaW50IGo7CisgIHVpbnQzMl90IGRjID0gODsKKyAgdjE2dTggb3V0OworCisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgZGMgKz0gZHN0Wy0xICsgaiAqIEJQU107CisgIH0KKyAgb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkYyA+PiA0KTsKKyAgU1RfVUI4KG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBkc3QsIEJQUyk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgOCAqIEJQUywgQlBTKTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIGxlZnQgc2FtcGxlcyBub3QgYXZhaWxhYmxlCisgIHVpbnQzMl90IGRjID0gODsKKyAgY29uc3QgdjE2dTggcnRvcCA9IExEX1VCKGRzdCAtIEJQUyk7CisgIGNvbnN0IHY4dTE2IGRjdG9wID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgIHYxNnU4IG91dDsKKworICBkYyArPSBIQUREX1VIX1UzMihkY3RvcCk7CisgIG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoZGMgPj4gNCk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDggKiBCUFMsIEJQUyk7Cit9CisKK3N0YXRpYyB2b2lkIERDMTZOb1RvcExlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBub3RoaW5nCisgIGNvbnN0IHYxNnU4IG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoMHg4MCk7CisgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDggKiBCUFMsIEJQUyk7Cit9CisKKy8vIENocm9tYQorCisjZGVmaW5lIFNUT1JFOHg4KG91dCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICBcCisgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDAgKiBCUFMsIEJQUyk7ICBcCisgIFNENChvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDQgKiBCUFMsIEJQUyk7ICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBEQzh1dih1aW50OF90KiBkc3QpIHsgICAvLyBEQworICB1aW50MzJfdCBkYyA9IDg7CisgIGludCBpOworICB1aW50NjRfdCBvdXQ7CisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBjb25zdCB2OHUxNiB0ZW1wMCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICBjb25zdCB2NHUzMiB0ZW1wMSA9IF9fbXNhX2hhZGRfdV93KHRlbXAwLCB0ZW1wMCk7CisgIGNvbnN0IHYydTY0IHRlbXAyID0gX19tc2FfaGFkZF91X2QodGVtcDEsIHRlbXAxKTsKKyAgdjE2dTggZGN0ZW1wOworCisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYyArPSBkc3RbLTEgKyBpICogQlBTXTsKKyAgfQorICBkYyArPSBfX21zYV9jb3B5X3NfdygodjRpMzIpdGVtcDIsIDApOworICBkY3RlbXAgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRjID4+IDQpOworICBvdXQgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZGN0ZW1wLCAwKTsKKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBUTTh1dih1aW50OF90KiBkc3QpIHsKKyAgaW50IGo7CisgIGNvbnN0IHYxNmk4IFQxID0gTERfU0IoZHN0IC0gQlBTKTsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiBUICA9ICh2OGkxNilfX21zYV9pbHZyX2IoemVybywgVDEpOworICBjb25zdCB2OGkxNiBUTCA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xIC0gQlBTXSk7CisgIGNvbnN0IHY4aTE2IGQgPSBUIC0gVEw7CisKKyAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gNCkgeworICAgIHYxNmk4IHQwLCB0MTsKKyAgICB2OGkxNiByMCA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMCAqIEJQU10pOworICAgIHY4aTE2IHIxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaChkc3RbLTEgKyAxICogQlBTXSk7CisgICAgdjhpMTYgcjIgPSAodjhpMTYpX19tc2FfZmlsbF9oKGRzdFstMSArIDIgKiBCUFNdKTsKKyAgICB2OGkxNiByMyA9ICh2OGkxNilfX21zYV9maWxsX2goZHN0Wy0xICsgMyAqIEJQU10pOworICAgIEFERDQoZCwgcjAsIGQsIHIxLCBkLCByMiwgZCwgcjMsIHIwLCByMSwgcjIsIHIzKTsKKyAgICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgICAgUENLRVZfQjJfU0IocjEsIHIwLCByMywgcjIsIHQwLCB0MSk7CisgICAgU1Q0eDRfVUIodDAsIHQxLCAwLCAyLCAwLCAyLCBkc3QsIEJQUyk7CisgICAgU1Q0eDRfVUIodDAsIHQxLCAxLCAzLCAxLCAzLCBkc3QgKyA0LCBCUFMpOworICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFZFOHV2KHVpbnQ4X3QqIGRzdCkgeyAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBjb25zdCB1aW50NjRfdCBvdXQgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpcnRvcCwgMCk7CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgSEU4dXYodWludDhfdCogZHN0KSB7ICAgLy8gaG9yaXpvbnRhbAorICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDg7IGogKz0gNCkgeworICAgIGNvbnN0IHYxNnU4IEwwID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAwICogQlBTXSk7CisgICAgY29uc3QgdjE2dTggTDEgPSAodjE2dTgpX19tc2FfZmlsbF9iKGRzdFstMSArIDEgKiBCUFNdKTsKKyAgICBjb25zdCB2MTZ1OCBMMiA9ICh2MTZ1OClfX21zYV9maWxsX2IoZHN0Wy0xICsgMiAqIEJQU10pOworICAgIGNvbnN0IHYxNnU4IEwzID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkc3RbLTEgKyAzICogQlBTXSk7CisgICAgY29uc3QgdWludDY0X3Qgb3V0MCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMCwgMCk7CisgICAgY29uc3QgdWludDY0X3Qgb3V0MSA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMSwgMCk7CisgICAgY29uc3QgdWludDY0X3Qgb3V0MiA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMiwgMCk7CisgICAgY29uc3QgdWludDY0X3Qgb3V0MyA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMywgMCk7CisgICAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIGRzdCwgQlBTKTsKKyAgICBkc3QgKz0gNCAqIEJQUzsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzh1dk5vTGVmdCh1aW50OF90KiBkc3QpIHsgICAvLyBEQyB3aXRoIG5vIGxlZnQgc2FtcGxlcworICBjb25zdCB1aW50MzJfdCBkYyA9IDQ7CisgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQihkc3QgLSBCUFMpOworICBjb25zdCB2OHUxNiB0ZW1wMCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICBjb25zdCB2NHUzMiB0ZW1wMSA9IF9fbXNhX2hhZGRfdV93KHRlbXAwLCB0ZW1wMCk7CisgIGNvbnN0IHYydTY0IHRlbXAyID0gX19tc2FfaGFkZF91X2QodGVtcDEsIHRlbXAxKTsKKyAgY29uc3QgdWludDMyX3Qgc3VtX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpdGVtcDIsIDApOworICBjb25zdCB2MTZ1OCBkY3ZhbCA9ICh2MTZ1OClfX21zYV9maWxsX2IoKGRjICsgc3VtX20pID4+IDMpOworICBjb25zdCB1aW50NjRfdCBvdXQgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZGN2YWwsIDApOworICBTVE9SRTh4OChvdXQsIGRzdCk7Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3AodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICB1aW50NjRfdCBvdXQ7CisgIHYxNnU4IGRjdGVtcDsKKworICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7CisgICAgZGMgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgZGN0ZW1wID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihkYyA+PiAzKTsKKyAgb3V0ID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRjdGVtcCwgMCk7CisgIFNUT1JFOHg4KG91dCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcExlZnQodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBub3RoaW5nCisgIGNvbnN0IHVpbnQ2NF90IG91dCA9IDB4ODA4MDgwODA4MDgwODA4MFVMTDsKKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRNU0Eodm9pZCkgeworICBWUDhUcmFuc2Zvcm1XSFQgPSBUcmFuc2Zvcm1XSFQ7CisgIFZQOFRyYW5zZm9ybSA9IFRyYW5zZm9ybVR3bzsKKyAgVlA4VHJhbnNmb3JtREMgPSBUcmFuc2Zvcm1EQzsKKyAgVlA4VHJhbnNmb3JtQUMzID0gVHJhbnNmb3JtQUMzOworCisgIFZQOFZGaWx0ZXIxNiAgPSBWRmlsdGVyMTY7CisgIFZQOEhGaWx0ZXIxNiAgPSBIRmlsdGVyMTY7CisgIFZQOFZGaWx0ZXIxNmkgPSBWRmlsdGVyMTZpOworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aTsKKyAgVlA4VkZpbHRlcjggID0gVkZpbHRlcjg7CisgIFZQOEhGaWx0ZXI4ICA9IEhGaWx0ZXI4OworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGk7CisgIFZQOEhGaWx0ZXI4aSA9IEhGaWx0ZXI4aTsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ICA9IFNpbXBsZVZGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlSEZpbHRlcjE2ICA9IFNpbXBsZUhGaWx0ZXIxNjsKKyAgVlA4U2ltcGxlVkZpbHRlcjE2aSA9IFNpbXBsZVZGaWx0ZXIxNmk7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNmkgPSBTaW1wbGVIRmlsdGVyMTZpOworCisgIFZQOFByZWRMdW1hNFswXSA9IERDNDsKKyAgVlA4UHJlZEx1bWE0WzFdID0gVE00OworICBWUDhQcmVkTHVtYTRbMl0gPSBWRTQ7CisgIFZQOFByZWRMdW1hNFs0XSA9IFJENDsKKyAgVlA4UHJlZEx1bWE0WzZdID0gTEQ0OworICBWUDhQcmVkTHVtYTE2WzBdID0gREMxNjsKKyAgVlA4UHJlZEx1bWExNlsxXSA9IFRNMTY7CisgIFZQOFByZWRMdW1hMTZbMl0gPSBWRTE2OworICBWUDhQcmVkTHVtYTE2WzNdID0gSEUxNjsKKyAgVlA4UHJlZEx1bWExNls0XSA9IERDMTZOb1RvcDsKKyAgVlA4UHJlZEx1bWExNls1XSA9IERDMTZOb0xlZnQ7CisgIFZQOFByZWRMdW1hMTZbNl0gPSBEQzE2Tm9Ub3BMZWZ0OworICBWUDhQcmVkQ2hyb21hOFswXSA9IERDOHV2OworICBWUDhQcmVkQ2hyb21hOFsxXSA9IFRNOHV2OworICBWUDhQcmVkQ2hyb21hOFsyXSA9IFZFOHV2OworICBWUDhQcmVkQ2hyb21hOFszXSA9IEhFOHV2OworICBWUDhQcmVkQ2hyb21hOFs0XSA9IERDOHV2Tm9Ub3A7CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnQ7CisgIFZQOFByZWRDaHJvbWE4WzZdID0gREM4dXZOb1RvcExlZnQ7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTY5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19uZW9uLmMKQEAgLTAsMCArMSwxNjUyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQVJNIE5FT04gdmVyc2lvbiBvZiBkc3AgZnVuY3Rpb25zIGFuZCBsb29wIGZpbHRlcmluZy4KKy8vCisvLyBBdXRob3JzOiBTb21uYXRoIEJhbmVyamVlIChzb21uYXRoQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBKb2hhbm4gS29lbmlnIChqb2hhbm5rb2VuaWdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOeE0gTG9hZGluZyBmdW5jdGlvbnMKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworLy8gVGhpcyBpbnRyaW5zaWNzIHZlcnNpb24gbWFrZXMgZ2NjLTQuNi4zIGNyYXNoIGR1cmluZyBMb2FkNHg/PygpIGNvbXBpbGF0aW9uCisvLyAocmVnaXN0ZXIgYWxsb2MsIHByb2JhYmx5KS4gVGhlIHZhcmlhbnRzIHNvbWV3aGF0IG1pdGlnYXRlIHRoZSBwcm9ibGVtLCBidXQKKy8vIG5vdCBxdWl0ZS4gSEZpbHRlcjE2aSgpIHJlbWFpbnMgcHJvYmxlbWF0aWMuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4OHg0X3QgTG9hZDR4OF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICBjb25zdCB1aW50OHg4X3QgemVybyA9IHZkdXBfbl91OCgwKTsKKyAgdWludDh4OHg0X3Qgb3V0OworICBJTklUX1ZFQ1RPUjQob3V0LCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvKTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDAgKiBzdHJpZGUsIG91dCwgMCk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyAxICogc3RyaWRlLCBvdXQsIDEpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgMiAqIHN0cmlkZSwgb3V0LCAyKTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDMgKiBzdHJpZGUsIG91dCwgMyk7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyA0ICogc3RyaWRlLCBvdXQsIDQpOworICBvdXQgPSB2bGQ0X2xhbmVfdTgoc3JjICsgNSAqIHN0cmlkZSwgb3V0LCA1KTsKKyAgb3V0ID0gdmxkNF9sYW5lX3U4KHNyYyArIDYgKiBzdHJpZGUsIG91dCwgNik7CisgIG91dCA9IHZsZDRfbGFuZV91OChzcmMgKyA3ICogc3RyaWRlLCBvdXQsIDcpOworICByZXR1cm4gb3V0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkNHgxNl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTEpIHsKKyAgLy8gcm93MCA9IHAxWzAuLjddfHAwWzAuLjddfHEwWzAuLjddfHExWzAuLjddCisgIC8vIHJvdzggPSBwMVs4Li4xNV18cDBbOC4uMTVdfHEwWzguLjE1XXxxMVs4Li4xNV0KKyAgY29uc3QgdWludDh4OHg0X3Qgcm93MCA9IExvYWQ0eDhfTkVPTihzcmMgLSAyICsgMCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgY29uc3QgdWludDh4OHg0X3Qgcm93OCA9IExvYWQ0eDhfTkVPTihzcmMgLSAyICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgKnAxID0gdmNvbWJpbmVfdTgocm93MC52YWxbMF0sIHJvdzgudmFsWzBdKTsKKyAgKnAwID0gdmNvbWJpbmVfdTgocm93MC52YWxbMV0sIHJvdzgudmFsWzFdKTsKKyAgKnEwID0gdmNvbWJpbmVfdTgocm93MC52YWxbMl0sIHJvdzgudmFsWzJdKTsKKyAgKnExID0gdmNvbWJpbmVfdTgocm93MC52YWxbM10sIHJvdzgudmFsWzNdKTsKK30KKworI2Vsc2UgIC8vIFdPUktfQVJPVU5EX0dDQworCisjZGVmaW5lIExPQURRX0xBTkVfMzJiKFZBTFVFLCBMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChWQUxVRSkgPSB2bGQxcV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKXNyYywgKFZBTFVFKSwgKExBTkUpKTsgICBcCisgIHNyYyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkNHgxNl9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTEpIHsKKyAgY29uc3QgdWludDMyeDRfdCB6ZXJvID0gdmR1cHFfbl91MzIoMCk7CisgIHVpbnQzMng0eDRfdCBpbjsKKyAgSU5JVF9WRUNUT1I0KGluLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvKTsKKyAgc3JjIC09IDI7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFswXSwgMCk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsxXSwgMCk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsyXSwgMCk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFszXSwgMCk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFswXSwgMSk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsxXSwgMSk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsyXSwgMSk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFszXSwgMSk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFswXSwgMik7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsxXSwgMik7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsyXSwgMik7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFszXSwgMik7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFswXSwgMyk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsxXSwgMyk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFsyXSwgMyk7CisgIExPQURRX0xBTkVfMzJiKGluLnZhbFszXSwgMyk7CisgIC8vIFRyYW5zcG9zZSBmb3VyIDR4NCBwYXJ0czoKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3cwMSA9IHZ0cm5xX3U4KHZyZWludGVycHJldHFfdThfdTMyKGluLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91OF91MzIoaW4udmFsWzFdKSk7CisgICAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzIzID0gdnRybnFfdTgodnJlaW50ZXJwcmV0cV91OF91MzIoaW4udmFsWzJdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3U4X3UzMihpbi52YWxbM10pKTsKKyAgICBjb25zdCB1aW50MTZ4OHgyX3Qgcm93MDIgPSB2dHJucV91MTYodnJlaW50ZXJwcmV0cV91MTZfdTgocm93MDEudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93MjMudmFsWzBdKSk7CisgICAgY29uc3QgdWludDE2eDh4Ml90IHJvdzEzID0gdnRybnFfdTE2KHZyZWludGVycHJldHFfdTE2X3U4KHJvdzAxLnZhbFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTE2X3U4KHJvdzIzLnZhbFsxXSkpOworICAgICpwMSA9IHZyZWludGVycHJldHFfdThfdTE2KHJvdzAyLnZhbFswXSk7CisgICAgKnAwID0gdnJlaW50ZXJwcmV0cV91OF91MTYocm93MTMudmFsWzBdKTsKKyAgICAqcTAgPSB2cmVpbnRlcnByZXRxX3U4X3UxNihyb3cwMi52YWxbMV0pOworICAgICpxMSA9IHZyZWludGVycHJldHFfdThfdTE2KHJvdzEzLnZhbFsxXSk7CisgIH0KK30KKyN1bmRlZiBMT0FEUV9MQU5FXzMyYgorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDh4MTZfTkVPTigKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBzdHJpZGUsCisgICAgdWludDh4MTZfdCogY29uc3QgcDMsIHVpbnQ4eDE2X3QqIGNvbnN0IHAyLCB1aW50OHgxNl90KiBjb25zdCBwMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMCwgdWludDh4MTZfdCogY29uc3QgcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IHExLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHEyLCB1aW50OHgxNl90KiBjb25zdCBxMykgeworICBMb2FkNHgxNl9ORU9OKHNyYyAtIDIsIHN0cmlkZSwgcDMsIHAyLCBwMSwgcDApOworICBMb2FkNHgxNl9ORU9OKHNyYyArIDIsIHN0cmlkZSwgcTAsIHExLCBxMiwgcTMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkMTZ4NF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OHgxNl90KiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3QgcTEpIHsKKyAgKnAxID0gdmxkMXFfdTgoc3JjIC0gMiAqIHN0cmlkZSk7CisgICpwMCA9IHZsZDFxX3U4KHNyYyAtIDEgKiBzdHJpZGUpOworICAqcTAgPSB2bGQxcV91OChzcmMgKyAwICogc3RyaWRlKTsKKyAgKnExID0gdmxkMXFfdTgoc3JjICsgMSAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQxNng4X05FT04oCisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLCBpbnQgc3RyaWRlLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAzLCB1aW50OHgxNl90KiBjb25zdCBwMiwgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgdWludDh4MTZfdCogY29uc3QgcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLCB1aW50OHgxNl90KiBjb25zdCBxMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBxMiwgdWludDh4MTZfdCogY29uc3QgcTMpIHsKKyAgTG9hZDE2eDRfTkVPTihzcmMgLSAyICAqIHN0cmlkZSwgc3RyaWRlLCBwMywgcDIsIHAxLCBwMCk7CisgIExvYWQxNng0X05FT04oc3JjICsgMiAgKiBzdHJpZGUsIHN0cmlkZSwgcTAsIHExLCBxMiwgcTMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkOHg4eDJfTkVPTigKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB1LCBjb25zdCB1aW50OF90KiBjb25zdCB2LCBpbnQgc3RyaWRlLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAzLCB1aW50OHgxNl90KiBjb25zdCBwMiwgdWludDh4MTZfdCogY29uc3QgcDEsCisgICAgdWludDh4MTZfdCogY29uc3QgcDAsIHVpbnQ4eDE2X3QqIGNvbnN0IHEwLCB1aW50OHgxNl90KiBjb25zdCBxMSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBxMiwgdWludDh4MTZfdCogY29uc3QgcTMpIHsKKyAgLy8gV2UgcGFjayB0aGUgOHg4IHUtc2FtcGxlcyBpbiB0aGUgbG93ZXIgaGFsZiBvZiB0aGUgdWludDh4MTZfdCBkZXN0aW5hdGlvbgorICAvLyBhbmQgdGhlIHYtc2FtcGxlcyBvbiB0aGUgaGlnaGVyIGhhbGYuCisgICpwMyA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSAtIDQgKiBzdHJpZGUpLCB2bGQxX3U4KHYgLSA0ICogc3RyaWRlKSk7CisgICpwMiA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSAtIDMgKiBzdHJpZGUpLCB2bGQxX3U4KHYgLSAzICogc3RyaWRlKSk7CisgICpwMSA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSAtIDIgKiBzdHJpZGUpLCB2bGQxX3U4KHYgLSAyICogc3RyaWRlKSk7CisgICpwMCA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSAtIDEgKiBzdHJpZGUpLCB2bGQxX3U4KHYgLSAxICogc3RyaWRlKSk7CisgICpxMCA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSArIDAgKiBzdHJpZGUpLCB2bGQxX3U4KHYgKyAwICogc3RyaWRlKSk7CisgICpxMSA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSArIDEgKiBzdHJpZGUpLCB2bGQxX3U4KHYgKyAxICogc3RyaWRlKSk7CisgICpxMiA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSArIDIgKiBzdHJpZGUpLCB2bGQxX3U4KHYgKyAyICogc3RyaWRlKSk7CisgICpxMyA9IHZjb21iaW5lX3U4KHZsZDFfdTgodSArIDMgKiBzdHJpZGUpLCB2bGQxX3U4KHYgKyAzICogc3RyaWRlKSk7Cit9CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisKKyNkZWZpbmUgTE9BRF9VVl84KFJPVykgXAorICB2Y29tYmluZV91OCh2bGQxX3U4KHUgLSA0ICsgKFJPVykgKiBzdHJpZGUpLCB2bGQxX3U4KHYgLSA0ICsgKFJPVykgKiBzdHJpZGUpKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBMb2FkOHg4eDJUX05FT04oCisgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwgY29uc3QgdWludDhfdCogY29uc3QgdiwgaW50IHN0cmlkZSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBwMywgdWludDh4MTZfdCogY29uc3QgcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IHAxLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IHAwLCB1aW50OHgxNl90KiBjb25zdCBxMCwgdWludDh4MTZfdCogY29uc3QgcTEsCisgICAgdWludDh4MTZfdCogY29uc3QgcTIsIHVpbnQ4eDE2X3QqIGNvbnN0IHEzKSB7CisgIC8vIFdlIHBhY2sgdGhlIDh4OCB1LXNhbXBsZXMgaW4gdGhlIGxvd2VyIGhhbGYgb2YgdGhlIHVpbnQ4eDE2X3QgZGVzdGluYXRpb24KKyAgLy8gYW5kIHRoZSB2LXNhbXBsZXMgb24gdGhlIGhpZ2hlciBoYWxmLgorICBjb25zdCB1aW50OHgxNl90IHJvdzAgPSBMT0FEX1VWXzgoMCk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MSA9IExPQURfVVZfOCgxKTsKKyAgY29uc3QgdWludDh4MTZfdCByb3cyID0gTE9BRF9VVl84KDIpOworICBjb25zdCB1aW50OHgxNl90IHJvdzMgPSBMT0FEX1VWXzgoMyk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93NCA9IExPQURfVVZfOCg0KTsKKyAgY29uc3QgdWludDh4MTZfdCByb3c1ID0gTE9BRF9VVl84KDUpOworICBjb25zdCB1aW50OHgxNl90IHJvdzYgPSBMT0FEX1VWXzgoNik7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93NyA9IExPQURfVVZfOCg3KTsKKyAgLy8gUGVyZm9ybSB0d28gc2lkZS1ieS1zaWRlIDh4OCB0cmFuc3Bvc2VzCisgIC8vIHUwMCB1MDEgdTAyIHUwMyB1MDQgdTA1IHUwNiB1MDcgfCB2MDAgdjAxIHYwMiB2MDMgdjA0IHYwNSB2MDYgdjA3CisgIC8vIHUxMCB1MTEgdTEyIHUxMyB1MTQgdTE1IHUxNiB1MTcgfCB2MTAgdjExIHYxMiAuLi4KKyAgLy8gdTIwIHUyMSB1MjIgdTIzIHUyNCB1MjUgdTI2IHUyNyB8IHYyMCB2MjEgLi4uCisgIC8vIHUzMCB1MzEgdTMyIHUzMyB1MzQgdTM1IHUzNiB1MzcgfCAuLi4KKyAgLy8gdTQwIHU0MSB1NDIgdTQzIHU0NCB1NDUgdTQ2IHU0NyB8IC4uLgorICAvLyB1NTAgdTUxIHU1MiB1NTMgdTU0IHU1NSB1NTYgdTU3IHwgLi4uCisgIC8vIHU2MCB1NjEgdTYyIHU2MyB1NjQgdTY1IHU2NiB1NjcgfCB2NjAgLi4uCisgIC8vIHU3MCB1NzEgdTcyIHU3MyB1NzQgdTc1IHU3NiB1NzcgfCB2NzAgdjcxIHY3MiAuLi4KKyAgY29uc3QgdWludDh4MTZ4Ml90IHJvdzAxID0gdnRybnFfdTgocm93MCwgcm93MSk7ICAvLyB1MDAgdTEwIHUwMiB1MTIgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdTAxIHUxMSB1MDMgdTEzIC4uLgorICBjb25zdCB1aW50OHgxNngyX3Qgcm93MjMgPSB2dHJucV91OChyb3cyLCByb3czKTsgIC8vIHUyMCB1MzAgdTIyIHUzMiAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1MjEgdTMxIHUyMyB1MzMgLi4uCisgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3c0NSA9IHZ0cm5xX3U4KHJvdzQsIHJvdzUpOyAgLy8gLi4uCisgIGNvbnN0IHVpbnQ4eDE2eDJfdCByb3c2NyA9IHZ0cm5xX3U4KHJvdzYsIHJvdzcpOyAgLy8gLi4uCisgIGNvbnN0IHVpbnQxNng4eDJfdCByb3cwMiA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3cwMS52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93MjMudmFsWzBdKSk7CisgIGNvbnN0IHVpbnQxNng4eDJfdCByb3cxMyA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3cwMS52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93MjMudmFsWzFdKSk7CisgIGNvbnN0IHVpbnQxNng4eDJfdCByb3c0NiA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3c0NS52YWxbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93NjcudmFsWzBdKSk7CisgIGNvbnN0IHVpbnQxNng4eDJfdCByb3c1NyA9IHZ0cm5xX3UxNih2cmVpbnRlcnByZXRxX3UxNl91OChyb3c0NS52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfdTgocm93NjcudmFsWzFdKSk7CisgIGNvbnN0IHVpbnQzMng0eDJfdCByb3cwNCA9IHZ0cm5xX3UzMih2cmVpbnRlcnByZXRxX3UzMl91MTYocm93MDIudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTMyX3UxNihyb3c0Ni52YWxbMF0pKTsKKyAgY29uc3QgdWludDMyeDR4Ml90IHJvdzI2ID0gdnRybnFfdTMyKHZyZWludGVycHJldHFfdTMyX3UxNihyb3cwMi52YWxbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzQ2LnZhbFsxXSkpOworICBjb25zdCB1aW50MzJ4NHgyX3Qgcm93MTUgPSB2dHJucV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTE2KHJvdzEzLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3UzMl91MTYocm93NTcudmFsWzBdKSk7CisgIGNvbnN0IHVpbnQzMng0eDJfdCByb3czNyA9IHZ0cm5xX3UzMih2cmVpbnRlcnByZXRxX3UzMl91MTYocm93MTMudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfdTMyX3UxNihyb3c1Ny52YWxbMV0pKTsKKyAgKnAzID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MDQudmFsWzBdKTsKKyAgKnAyID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MTUudmFsWzBdKTsKKyAgKnAxID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MjYudmFsWzBdKTsKKyAgKnAwID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MzcudmFsWzBdKTsKKyAgKnEwID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MDQudmFsWzFdKTsKKyAgKnExID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MTUudmFsWzFdKTsKKyAgKnEyID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MjYudmFsWzFdKTsKKyAgKnEzID0gdnJlaW50ZXJwcmV0cV91OF91MzIocm93MzcudmFsWzFdKTsKK30KKyN1bmRlZiBMT0FEX1VWXzgKKworI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlMng4X05FT04oY29uc3QgdWludDh4OHgyX3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIHZzdDJfbGFuZV91OChkc3QgKyAwICogc3RyaWRlLCB2LCAwKTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDEgKiBzdHJpZGUsIHYsIDEpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgMiAqIHN0cmlkZSwgdiwgMik7CisgIHZzdDJfbGFuZV91OChkc3QgKyAzICogc3RyaWRlLCB2LCAzKTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDQgKiBzdHJpZGUsIHYsIDQpOworICB2c3QyX2xhbmVfdTgoZHN0ICsgNSAqIHN0cmlkZSwgdiwgNSk7CisgIHZzdDJfbGFuZV91OChkc3QgKyA2ICogc3RyaWRlLCB2LCA2KTsKKyAgdnN0Ml9sYW5lX3U4KGRzdCArIDcgKiBzdHJpZGUsIHYsIDcpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTJ4MTZfTkVPTihjb25zdCB1aW50OHgxNl90IHAwLCBjb25zdCB1aW50OHgxNl90IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIHVpbnQ4eDh4Ml90IGxvLCBoaTsKKyAgbG8udmFsWzBdID0gdmdldF9sb3dfdTgocDApOworICBsby52YWxbMV0gPSB2Z2V0X2xvd191OChxMCk7CisgIGhpLnZhbFswXSA9IHZnZXRfaGlnaF91OChwMCk7CisgIGhpLnZhbFsxXSA9IHZnZXRfaGlnaF91OChxMCk7CisgIFN0b3JlMng4X05FT04obG8sIGRzdCAtIDEgKyAwICogc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTJ4OF9ORU9OKGhpLCBkc3QgLSAxICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKK30KKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlNHg4X05FT04oY29uc3QgdWludDh4OHg0X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIHZzdDRfbGFuZV91OChkc3QgKyAwICogc3RyaWRlLCB2LCAwKTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDEgKiBzdHJpZGUsIHYsIDEpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgMiAqIHN0cmlkZSwgdiwgMik7CisgIHZzdDRfbGFuZV91OChkc3QgKyAzICogc3RyaWRlLCB2LCAzKTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDQgKiBzdHJpZGUsIHYsIDQpOworICB2c3Q0X2xhbmVfdTgoZHN0ICsgNSAqIHN0cmlkZSwgdiwgNSk7CisgIHZzdDRfbGFuZV91OChkc3QgKyA2ICogc3RyaWRlLCB2LCA2KTsKKyAgdnN0NF9sYW5lX3U4KGRzdCArIDcgKiBzdHJpZGUsIHYsIDcpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTR4MTZfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IHN0cmlkZSkgeworICB1aW50OHg4eDRfdCBsbywgaGk7CisgIElOSVRfVkVDVE9SNChsbywKKyAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KHAxKSwgdmdldF9sb3dfdTgocDApLAorICAgICAgICAgICAgICAgdmdldF9sb3dfdTgocTApLCB2Z2V0X2xvd191OChxMSkpOworICBJTklUX1ZFQ1RPUjQoaGksCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgocDEpLCB2Z2V0X2hpZ2hfdTgocDApLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KHEwKSwgdmdldF9oaWdoX3U4KHExKSk7CisgIFN0b3JlNHg4X05FT04obG8sIGRzdCAtIDIgKyAwICogc3RyaWRlLCBzdHJpZGUpOworICBTdG9yZTR4OF9ORU9OKGhpLCBkc3QgLSAyICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKK30KKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTE2eDJfTkVPTihjb25zdCB1aW50OHgxNl90IHAwLCBjb25zdCB1aW50OHgxNl90IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LCBpbnQgc3RyaWRlKSB7CisgIHZzdDFxX3U4KGRzdCAtIHN0cmlkZSwgcDApOworICB2c3QxcV91OChkc3QsIHEwKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUxNng0X05FT04oY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsIGludCBzdHJpZGUpIHsKKyAgU3RvcmUxNngyX05FT04ocDEsIHAwLCBkc3QgLSBzdHJpZGUsIHN0cmlkZSk7CisgIFN0b3JlMTZ4Ml9ORU9OKHEwLCBxMSwgZHN0ICsgc3RyaWRlLCBzdHJpZGUpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTh4MngyX05FT04oY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHUsIHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICAvLyBwMCBhbmQgcTAgY29udGFpbiB0aGUgdSt2IHNhbXBsZXMgcGFja2VkIGluIGxvdy9oaWdoIGhhbHZlcy4KKyAgdnN0MV91OCh1IC0gc3RyaWRlLCB2Z2V0X2xvd191OChwMCkpOworICB2c3QxX3U4KHUsICAgICAgICAgIHZnZXRfbG93X3U4KHEwKSk7CisgIHZzdDFfdTgodiAtIHN0cmlkZSwgdmdldF9oaWdoX3U4KHAwKSk7CisgIHZzdDFfdTgodiwgICAgICAgICAgdmdldF9oaWdoX3U4KHEwKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFN0b3JlOHg0eDJfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHUsIHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSkgeworICAvLyBUaGUgcDEuLi5xMSByZWdpc3RlcnMgY29udGFpbiB0aGUgdSt2IHNhbXBsZXMgcGFja2VkIGluIGxvdy9oaWdoIGhhbHZlcy4KKyAgU3RvcmU4eDJ4Ml9ORU9OKHAxLCBwMCwgdSAtIHN0cmlkZSwgdiAtIHN0cmlkZSwgc3RyaWRlKTsKKyAgU3RvcmU4eDJ4Ml9ORU9OKHEwLCBxMSwgdSArIHN0cmlkZSwgdiArIHN0cmlkZSwgc3RyaWRlKTsKK30KKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworI2RlZmluZSBTVE9SRTZfTEFORShEU1QsIFZBTDAsIFZBTDEsIExBTkUpIGRvIHsgICBcCisgIHZzdDNfbGFuZV91OCgoRFNUKSAtIDMsIChWQUwwKSwgKExBTkUpKTsgICAgICAgIFwKKyAgdnN0M19sYW5lX3U4KChEU1QpICsgMCwgKFZBTDEpLCAoTEFORSkpOyAgICAgICAgXAorICAoRFNUKSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdG9yZTZ4OHgyX05FT04oCisgICAgY29uc3QgdWludDh4MTZfdCBwMiwgY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLCBjb25zdCB1aW50OHgxNl90IHEyLAorICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUpIHsKKyAgdWludDh4OHgzX3QgdTAsIHUxLCB2MCwgdjE7CisgIElOSVRfVkVDVE9SMyh1MCwgdmdldF9sb3dfdTgocDIpLCB2Z2V0X2xvd191OChwMSksIHZnZXRfbG93X3U4KHAwKSk7CisgIElOSVRfVkVDVE9SMyh1MSwgdmdldF9sb3dfdTgocTApLCB2Z2V0X2xvd191OChxMSksIHZnZXRfbG93X3U4KHEyKSk7CisgIElOSVRfVkVDVE9SMyh2MCwgdmdldF9oaWdoX3U4KHAyKSwgdmdldF9oaWdoX3U4KHAxKSwgdmdldF9oaWdoX3U4KHAwKSk7CisgIElOSVRfVkVDVE9SMyh2MSwgdmdldF9oaWdoX3U4KHEwKSwgdmdldF9oaWdoX3U4KHExKSwgdmdldF9oaWdoX3U4KHEyKSk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgMCk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgMSk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgMik7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgMyk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgNCk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgNSk7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgNik7CisgIFNUT1JFNl9MQU5FKHUsIHUwLCB1MSwgNyk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgMCk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgMSk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgMik7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgMyk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgNCk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgNSk7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgNik7CisgIFNUT1JFNl9MQU5FKHYsIHYwLCB2MSwgNyk7Cit9CisjdW5kZWYgU1RPUkU2X0xBTkUKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU0eDh4Ml9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgdSwgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIHVpbnQ4eDh4NF90IHUwLCB2MDsKKyAgSU5JVF9WRUNUT1I0KHUwLAorICAgICAgICAgICAgICAgdmdldF9sb3dfdTgocDEpLCB2Z2V0X2xvd191OChwMCksCisgICAgICAgICAgICAgICB2Z2V0X2xvd191OChxMCksIHZnZXRfbG93X3U4KHExKSk7CisgIElOSVRfVkVDVE9SNCh2MCwKKyAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChwMSksIHZnZXRfaGlnaF91OChwMCksCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfdTgocTApLCB2Z2V0X2hpZ2hfdTgocTEpKTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgMCAqIHN0cmlkZSwgdTAsIDApOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyAxICogc3RyaWRlLCB1MCwgMSk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDIgKiBzdHJpZGUsIHUwLCAyKTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgMyAqIHN0cmlkZSwgdTAsIDMpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyA0ICogc3RyaWRlLCB1MCwgNCk7CisgIHZzdDRfbGFuZV91OCh1IC0gMiArIDUgKiBzdHJpZGUsIHUwLCA1KTsKKyAgdnN0NF9sYW5lX3U4KHUgLSAyICsgNiAqIHN0cmlkZSwgdTAsIDYpOworICB2c3Q0X2xhbmVfdTgodSAtIDIgKyA3ICogc3RyaWRlLCB1MCwgNyk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDAgKiBzdHJpZGUsIHYwLCAwKTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgMSAqIHN0cmlkZSwgdjAsIDEpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyAyICogc3RyaWRlLCB2MCwgMik7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDMgKiBzdHJpZGUsIHYwLCAzKTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgNCAqIHN0cmlkZSwgdjAsIDQpOworICB2c3Q0X2xhbmVfdTgodiAtIDIgKyA1ICogc3RyaWRlLCB2MCwgNSk7CisgIHZzdDRfbGFuZV91OCh2IC0gMiArIDYgKiBzdHJpZGUsIHYwLCA2KTsKKyAgdnN0NF9sYW5lX3U4KHYgLSAyICsgNyAqIHN0cmlkZSwgdjAsIDcpOworfQorCisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8gWmVybyBleHRlbmQgJ3YnIHRvIGFuIGludDE2eDhfdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4X3QgQ29udmVydFU4VG9TMTZfTkVPTih1aW50OHg4X3QgdikgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZtb3ZsX3U4KHYpKTsKK30KKworLy8gUGVyZm9ybXMgdW5zaWduZWQgOGIgc2F0dXJhdGlvbiBvbiAnZHN0MDEnIGFuZCAnZHN0MjMnIHN0b3JpbmcgdGhlIHJlc3VsdAorLy8gdG8gdGhlIGNvcnJlc3BvbmRpbmcgcm93cyBvZiAnZHN0Jy4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNhdHVyYXRlQW5kU3RvcmU0eDRfTkVPTih1aW50OF90KiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGRzdDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDhfdCBkc3QyMykgeworICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgY29uc3QgdWludDh4OF90IGRzdDAxX3U4ID0gdnFtb3Z1bl9zMTYoZHN0MDEpOworICBjb25zdCB1aW50OHg4X3QgZHN0MjNfdTggPSB2cW1vdnVuX3MxNihkc3QyMyk7CisKKyAgLy8gU3RvcmUgdGhlIHJlc3VsdHMuCisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MDFfdTgpLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QwMV91OCksIDEpOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDIzX3U4KSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MjNfdTgpLCAxKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQWRkNHg0X05FT04oY29uc3QgaW50MTZ4OF90IHJvdzAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IHJvdzIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIHVpbnQzMngyX3QgZHN0MDEgPSB2ZHVwX25fdTMyKDApOworICB1aW50MzJ4Ml90IGRzdDIzID0gdmR1cF9uX3UzMigwKTsKKworICAvLyBMb2FkIHRoZSBzb3VyY2UgcGl4ZWxzLgorICBkc3QwMSA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIGRzdDAxLCAwKTsKKyAgZHN0MjMgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCBkc3QyMywgMCk7CisgIGRzdDAxID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgZHN0MDEsIDEpOworICBkc3QyMyA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIGRzdDIzLCAxKTsKKworICB7CisgICAgLy8gQ29udmVydCB0byAxNmIuCisgICAgY29uc3QgaW50MTZ4OF90IGRzdDAxX3MxNiA9IENvbnZlcnRVOFRvUzE2X05FT04odnJlaW50ZXJwcmV0X3U4X3UzMihkc3QwMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBkc3QyM19zMTYgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZyZWludGVycHJldF91OF91MzIoZHN0MjMpKTsKKworICAgIC8vIERlc2NhbGUgd2l0aCByb3VuZGluZy4KKyAgICBjb25zdCBpbnQxNng4X3Qgb3V0MDEgPSB2cnNyYXFfbl9zMTYoZHN0MDFfczE2LCByb3cwMSwgMyk7CisgICAgY29uc3QgaW50MTZ4OF90IG91dDIzID0gdnJzcmFxX25fczE2KGRzdDIzX3MxNiwgcm93MjMsIDMpOworICAgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0uCisgICAgU2F0dXJhdGVBbmRTdG9yZTR4NF9ORU9OKGRzdCwgb3V0MDEsIG91dDIzKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGUgSW4tbG9vcCBmaWx0ZXJpbmcgKFBhcmFncmFwaCAxNS4yKQorCitzdGF0aWMgdWludDh4MTZfdCBOZWVkc0ZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcTAsIGNvbnN0IHVpbnQ4eDE2X3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gpIHsKKyAgY29uc3QgdWludDh4MTZfdCB0aHJlc2hfdiA9IHZkdXBxX25fdTgoKHVpbnQ4X3QpdGhyZXNoKTsKKyAgY29uc3QgdWludDh4MTZfdCBhX3AwX3EwID0gdmFiZHFfdTgocDAsIHEwKTsgICAgICAgICAgICAgICAvLyBhYnMocDAtcTApCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMV9xMSA9IHZhYmRxX3U4KHAxLCBxMSk7ICAgICAgICAgICAgICAgLy8gYWJzKHAxLXExKQorICBjb25zdCB1aW50OHgxNl90IGFfcDBfcTBfMiA9IHZxYWRkcV91OChhX3AwX3EwLCBhX3AwX3EwKTsgIC8vIDIgKiBhYnMocDAtcTApCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMV9xMV8yID0gdnNocnFfbl91OChhX3AxX3ExLCAxKTsgICAgICAgLy8gYWJzKHAxLXExKSAvIDIKKyAgY29uc3QgdWludDh4MTZfdCBzdW0gPSB2cWFkZHFfdTgoYV9wMF9xMF8yLCBhX3AxX3ExXzIpOworICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSB2Y2dlcV91OCh0aHJlc2hfdiwgc3VtKTsKKyAgcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQ4eDE2X3QgRmxpcFNpZ25fTkVPTihjb25zdCB1aW50OHgxNl90IHYpIHsKKyAgY29uc3QgdWludDh4MTZfdCBzaWduX2JpdCA9IHZkdXBxX25fdTgoMHg4MCk7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3M4X3U4KHZlb3JxX3U4KHYsIHNpZ25fYml0KSk7Cit9CisKK3N0YXRpYyB1aW50OHgxNl90IEZsaXBTaWduQmFja19ORU9OKGNvbnN0IGludDh4MTZfdCB2KSB7CisgIGNvbnN0IGludDh4MTZfdCBzaWduX2JpdCA9IHZkdXBxX25fczgoMHg4MCk7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3M4KHZlb3JxX3M4KHYsIHNpZ25fYml0KSk7Cit9CisKK3N0YXRpYyBpbnQ4eDE2X3QgR2V0QmFzZURlbHRhX05FT04oY29uc3QgaW50OHgxNl90IHAxLCBjb25zdCBpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDh4MTZfdCBxMCwgY29uc3QgaW50OHgxNl90IHExKSB7CisgIGNvbnN0IGludDh4MTZfdCBxMF9wMCA9IHZxc3VicV9zOChxMCwgcDApOyAgICAgIC8vIChxMC1wMCkKKyAgY29uc3QgaW50OHgxNl90IHAxX3ExID0gdnFzdWJxX3M4KHAxLCBxMSk7ICAgICAgLy8gKHAxLXExKQorICBjb25zdCBpbnQ4eDE2X3QgczEgPSB2cWFkZHFfczgocDFfcTEsIHEwX3AwKTsgICAvLyAocDEtcTEpICsgMSAqIChxMCAtIHAwKQorICBjb25zdCBpbnQ4eDE2X3QgczIgPSB2cWFkZHFfczgocTBfcDAsIHMxKTsgICAgICAvLyAocDEtcTEpICsgMiAqIChxMCAtIHAwKQorICBjb25zdCBpbnQ4eDE2X3QgczMgPSB2cWFkZHFfczgocTBfcDAsIHMyKTsgICAgICAvLyAocDEtcTEpICsgMyAqIChxMCAtIHAwKQorICByZXR1cm4gczM7Cit9CisKK3N0YXRpYyBpbnQ4eDE2X3QgR2V0QmFzZURlbHRhMF9ORU9OKGNvbnN0IGludDh4MTZfdCBwMCwgY29uc3QgaW50OHgxNl90IHEwKSB7CisgIGNvbnN0IGludDh4MTZfdCBxMF9wMCA9IHZxc3VicV9zOChxMCwgcDApOyAgICAgIC8vIChxMC1wMCkKKyAgY29uc3QgaW50OHgxNl90IHMxID0gdnFhZGRxX3M4KHEwX3AwLCBxMF9wMCk7ICAgLy8gMiAqIChxMCAtIHAwKQorICBjb25zdCBpbnQ4eDE2X3QgczIgPSB2cWFkZHFfczgocTBfcDAsIHMxKTsgICAgICAvLyAzICogKHEwIC0gcDApCisgIHJldHVybiBzMjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXIyTm9GbGlwX05FT04oY29uc3QgaW50OHgxNl90IHAwcywgY29uc3QgaW50OHgxNl90IHEwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDh4MTZfdCogY29uc3Qgb3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50OHgxNl90KiBjb25zdCBvcTApIHsKKyAgY29uc3QgaW50OHgxNl90IGtDc3QzID0gdmR1cHFfbl9zOCgweDAzKTsKKyAgY29uc3QgaW50OHgxNl90IGtDc3Q0ID0gdmR1cHFfbl9zOCgweDA0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhX3AzID0gdnFhZGRxX3M4KGRlbHRhLCBrQ3N0Myk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YV9wNCA9IHZxYWRkcV9zOChkZWx0YSwga0NzdDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEzID0gdnNocnFfbl9zOChkZWx0YV9wMywgMyk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTQgPSB2c2hycV9uX3M4KGRlbHRhX3A0LCAzKTsKKyAgKm9wMCA9IHZxYWRkcV9zOChwMHMsIGRlbHRhMyk7CisgICpvcTAgPSB2cXN1YnFfczgocTBzLCBkZWx0YTQpOworfQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9JTlRSSU5TSUNTKQorCitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcjJfTkVPTihjb25zdCBpbnQ4eDE2X3QgcDBzLCBjb25zdCBpbnQ4eDE2X3QgcTBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OHgxNl90IGRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3Qgb3AwLCB1aW50OHgxNl90KiBjb25zdCBvcTApIHsKKyAgY29uc3QgaW50OHgxNl90IGtDc3QzID0gdmR1cHFfbl9zOCgweDAzKTsKKyAgY29uc3QgaW50OHgxNl90IGtDc3Q0ID0gdmR1cHFfbl9zOCgweDA0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhX3AzID0gdnFhZGRxX3M4KGRlbHRhLCBrQ3N0Myk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YV9wNCA9IHZxYWRkcV9zOChkZWx0YSwga0NzdDQpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEzID0gdnNocnFfbl9zOChkZWx0YV9wMywgMyk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTQgPSB2c2hycV9uX3M4KGRlbHRhX3A0LCAzKTsKKyAgY29uc3QgaW50OHgxNl90IHNwMCA9IHZxYWRkcV9zOChwMHMsIGRlbHRhMyk7CisgIGNvbnN0IGludDh4MTZfdCBzcTAgPSB2cXN1YnFfczgocTBzLCBkZWx0YTQpOworICAqb3AwID0gRmxpcFNpZ25CYWNrX05FT04oc3AwKTsKKyAgKm9xMCA9IEZsaXBTaWduQmFja19ORU9OKHNxMCk7Cit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyMl9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDh4MTZfdCogY29uc3Qgb3AwLCB1aW50OHgxNl90KiBjb25zdCBvcTApIHsKKyAgY29uc3QgaW50OHgxNl90IHAxcyA9IEZsaXBTaWduX05FT04ocDEpOworICBjb25zdCBpbnQ4eDE2X3QgcDBzID0gRmxpcFNpZ25fTkVPTihwMCk7CisgIGNvbnN0IGludDh4MTZfdCBxMHMgPSBGbGlwU2lnbl9ORU9OKHEwKTsKKyAgY29uc3QgaW50OHgxNl90IHExcyA9IEZsaXBTaWduX05FT04ocTEpOworICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEwID0gR2V0QmFzZURlbHRhX05FT04ocDFzLCBwMHMsIHEwcywgcTFzKTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMSA9IHZhbmRxX3M4KGRlbHRhMCwgdnJlaW50ZXJwcmV0cV9zOF91OChtYXNrKSk7CisgIEFwcGx5RmlsdGVyMl9ORU9OKHAwcywgcTBzLCBkZWx0YTEsIG9wMCwgb3EwKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICB1aW50OHgxNl90IHAxLCBwMCwgcTAsIHExLCBvcDAsIG9xMDsKKyAgTG9hZDE2eDRfTkVPTihwLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcl9ORU9OKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpOworICAgIERvRmlsdGVyMl9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCAmb3AwLCAmb3EwKTsKKyAgfQorICBTdG9yZTE2eDJfTkVPTihvcDAsIG9xMCwgcCwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICB1aW50OHgxNl90IHAxLCBwMCwgcTAsIHExLCBvcTAsIG9wMDsKKyAgTG9hZDR4MTZfTkVPTihwLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcl9ORU9OKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpOworICAgIERvRmlsdGVyMl9ORU9OKHAxLCBwMCwgcTAsIHExLCBtYXNrLCAmb3AwLCAmb3EwKTsKKyAgfQorICBTdG9yZTJ4MTZfTkVPTihvcDAsIG9xMCwgcCwgc3RyaWRlKTsKK30KKworI2Vsc2UKKworLy8gTG9hZC9TdG9yZSB2ZXJ0aWNhbCBlZGdlCisjZGVmaW5lIExPQUQ4eDQoYzEsIGMyLCBjMywgYzQsIGIxLCBiMiwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidmxkNC44IHsiICNjMSAiWzBdLCIgI2MyICJbMF0sIiAjYzMgIlswXSwiICNjNCAiWzBdfSwiICNiMSAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIlsxXSwiICNjMiAiWzFdLCIgI2MzICJbMV0sIiAjYzQgIlsxXX0sIiAjYjIgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbMl0sIiAjYzIgIlsyXSwiICNjMyAiWzJdLCIgI2M0ICJbMl19LCIgI2IxICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzNdLCIgI2MyICJbM10sIiAjYzMgIlszXSwiICNjNCAiWzNdfSwiICNiMiAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIls0XSwiICNjMiAiWzRdLCIgI2MzICJbNF0sIiAjYzQgIls0XX0sIiAjYjEgIiwiICNzdHJpZGUgIlxuIiBcCisgICJ2bGQ0LjggeyIgI2MxICJbNV0sIiAjYzIgIls1XSwiICNjMyAiWzVdLCIgI2M0ICJbNV19LCIgI2IyICIsIiAjc3RyaWRlICJcbiIgXAorICAidmxkNC44IHsiICNjMSAiWzZdLCIgI2MyICJbNl0sIiAjYzMgIls2XSwiICNjNCAiWzZdfSwiICNiMSAiLCIgI3N0cmlkZSAiXG4iIFwKKyAgInZsZDQuOCB7IiAjYzEgIls3XSwiICNjMiAiWzddLCIgI2MzICJbN10sIiAjYzQgIls3XX0sIiAjYjIgIiwiICNzdHJpZGUgIlxuIgorCisjZGVmaW5lIFNUT1JFOHgyKGMxLCBjMiwgcCwgc3RyaWRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbMF0sICIgI2MyICJbMF19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzFdLCAiICNjMiAiWzFdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIlsyXSwgIiAjYzIgIlsyXX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbM10sICIgI2MyICJbM119LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzRdLCAiICNjMiAiWzRdfSwiICNwICIsIiAjc3RyaWRlICIgXG4iICAgICAgICAgICAgICAgICAgICBcCisgICJ2c3QyLjggICB7IiAjYzEgIls1XSwgIiAjYzIgIls1XX0sIiAjcCAiLCIgI3N0cmlkZSAiIFxuIiAgICAgICAgICAgICAgICAgICAgXAorICAidnN0Mi44ICAgeyIgI2MxICJbNl0sICIgI2MyICJbNl19LCIgI3AgIiwiICNzdHJpZGUgIiBcbiIgICAgICAgICAgICAgICAgICAgIFwKKyAgInZzdDIuOCAgIHsiICNjMSAiWzddLCAiICNjMiAiWzddfSwiICNwICIsIiAjc3RyaWRlICIgXG4iCisKKyNkZWZpbmUgUVJlZ3MgInEwIiwgInExIiwgInEyIiwgInEzIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICJxOCIsICJxOSIsICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiLCAicTE0IiwgInExNSIKKworI2RlZmluZSBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZlb3IgICAgICIgI2EgIiwiICNhICIsIiAjcyAiICAgICAgICAgICAgICAgXG4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2ZW9yICAgICAiICNiICIsIiAjYiAiLCIgI3MgIiAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIEZMSVBfU0lHTl9CSVQ0KGEsIGIsIGMsIGQsIHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihhLCBiLCBzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDIoYywgZCwgcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIG1hc2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2YWJkLnU4ICAgIHExNSwiICNwMCAiLCIgI3EwICIgICAgICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqLyAgICAgICAgICAgICAgXAorICAidmFiZC51OCAgICBxMTQsIiAjcDEgIiwiICNxMSAiICAgICAgICAgXG4iICAvKiBhYnMocDEgLSBxMSkgKi8gICAgICAgICAgICAgIFwKKyAgInZxYWRkLnU4ICAgcTE1LCBxMTUsIHExNSAgICAgICAgICAgICAgIFxuIiAgLyogYWJzKHAwIC0gcTApICogMiAqLyAgICAgICAgICBcCisgICJ2c2hyLnU4ICAgIHExNCwgcTE0LCAjMSAgICAgICAgICAgICAgICBcbiIgIC8qIGFicyhwMSAtIHExKSAvIDIgKi8gICAgICAgICAgXAorICAidnFhZGQudTggICBxMTUsIHExNSwgcTE0ICAgICBcbiIgIC8qIGFicyhwMCAtIHEwKSAqIDIgKyBhYnMocDEgLSBxMSkgLyAyICovIFwKKyAgInZkdXAuOCAgICAgcTE0LCAiICN0aHJlc2ggIiAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2Y2dlLnU4ICAgIiAjbWFzayAiLCBxMTQsIHExNSAgICAgICAgICBcbiIgIC8qIG1hc2sgPD0gdGhyZXNoICovCisKKyNkZWZpbmUgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIG8pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2cXN1Yi5zOCAgIHExNSwiICNxMCAiLCIgI3AwICIgICAgICAgICBcbiIgIC8qIChxMCAtIHAwKSAqLyAgICAgICAgICAgICAgICAgXAorICAidnFzdWIuczggICIgI28gIiwiICNwMSAiLCIgI3ExICIgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKi8gICAgICAgICAgICAgICAgIFwKKyAgInZxYWRkLnM4ICAiICNvICIsIiAjbyAiLCBxMTUgICAgICAgICAgIFxuIiAgLyogKHAxIC0gcTEpICsgMSAqIChwMCAtIHEwKSAqLyBcCisgICJ2cWFkZC5zOCAgIiAjbyAiLCIgI28gIiwgcTE1ICAgICAgICAgICBcbiIgIC8qIChwMSAtIHExKSArIDIgKiAocDAgLSBxMCkgKi8gXAorICAidnFhZGQuczggICIgI28gIiwiICNvICIsIHExNSAgICAgICAgICAgXG4iICAvKiAocDEgLSBxMSkgKyAzICogKHAwIC0gcTApICovCisKKyNkZWZpbmUgRE9fU0lNUExFX0ZJTFRFUihwMCwgcTAsIGZsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2bW92Lmk4ICAgIHExNSwgIzB4MDMgICAgICAgICAgICAgICAgICBcbiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidnFhZGQuczggICBxMTUsIHExNSwgIiAjZmwgIiAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIxID0gZmlsdGVyICsgMyAqLyAgICAgIFwKKyAgInZzaHIuczggICAgcTE1LCBxMTUsICMzICAgICAgICAgICAgICAgIFxuIiAgLyogZmlsdGVyMSA+PiAzICovICAgICAgICAgICAgICBcCisgICJ2cWFkZC5zOCAgIiAjcDAgIiwiICNwMCAiLCBxMTUgICAgICAgICBcbiIgIC8qIHAwICs9IGZpbHRlcjEgKi8gICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInZtb3YuaTggICAgcTE1LCAjMHgwNCAgICAgICAgICAgICAgICAgIFxuIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJ2cWFkZC5zOCAgIHExNSwgcTE1LCAiICNmbCAiICAgICAgICAgICBcbiIgIC8qIGZpbHRlcjEgPSBmaWx0ZXIgKyA0ICovICAgICAgXAorICAidnNoci5zOCAgICBxMTUsIHExNSwgIzMgICAgICAgICAgICAgICAgXG4iICAvKiBmaWx0ZXIyID4+IDMgKi8gICAgICAgICAgICAgIFwKKyAgInZxc3ViLnM4ICAiICNxMCAiLCIgI3EwICIsIHExNSAgICAgICAgIFxuIiAgLyogcTAgLT0gZmlsdGVyMiAqLworCisvLyBBcHBsaWVzIGZpbHRlciBvbiAyIHBpeGVscyAocDAgYW5kIHEwKQorI2RlZmluZSBET19GSUxURVIyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTkVFRFNfRklMVEVSKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsIHE5KSAgICAgLyogZmlsdGVyIG1hc2sgaW4gcTkgKi8gICAgICAgICBcCisgICJ2bW92Lmk4ICAgIHExMCwgIzB4ODAgICAgICAgICAgICAgICAgICBcbiIgIC8qIHNpZ24gYml0ICovICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUNChwMSwgcDAsIHEwLCBxMSwgcTEwKSAgICAgICAgICAvKiBjb252ZXJ0IHRvIHNpZ25lZCB2YWx1ZSAqLyAgIFwKKyAgR0VUX0JBU0VfREVMVEEocDEsIHAwLCBxMCwgcTEsIHExMSkgICAgICAgICAgLyogZ2V0IGZpbHRlciBsZXZlbCAgKi8gICAgICAgICBcCisgICJ2YW5kICAgICAgIHE5LCBxOSwgcTExICAgICAgICAgICAgICAgICBcbiIgIC8qIGFwcGx5IGZpbHRlciBtYXNrICovICAgICAgICAgXAorICBET19TSU1QTEVfRklMVEVSKHAwLCBxMCwgcTkpICAgICAgICAgICAgICAgICAvKiBhcHBseSBmaWx0ZXIgKi8gICAgICAgICAgICAgIFwKKyAgRkxJUF9TSUdOX0JJVDIocDAsIHEwLCBxMTApCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInN1YiAgICAgICAgJVtwXSwgJVtwXSwgJVtzdHJpZGVdLCBsc2wgIzEgIFxuIiAgLy8gcCAtPSAyICogc3RyaWRlCisKKyAgICAidmxkMS51OCAgICB7cTF9LCBbJVtwXV0sICVbc3RyaWRlXSAgICAgICAgXG4iICAvLyBwMQorICAgICJ2bGQxLnU4ICAgIHtxMn0sIFslW3BdXSwgJVtzdHJpZGVdICAgICAgICBcbiIgIC8vIHAwCisgICAgInZsZDEudTggICAge3EzfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gcTAKKyAgICAidmxkMS51OCAgICB7cTEyfSwgWyVbcF1dICAgICAgICAgICAgICAgICAgXG4iICAvLyBxMQorCisgICAgRE9fRklMVEVSMihxMSwgcTIsIHEzLCBxMTIsICVbdGhyZXNoXSkKKworICAgICJzdWIgICAgICAgICVbcF0sICVbcF0sICVbc3RyaWRlXSwgbHNsICMxICBcbiIgIC8vIHAgLT0gMiAqIHN0cmlkZQorCisgICAgInZzdDEudTggICAge3EyfSwgWyVbcF1dLCAlW3N0cmlkZV0gICAgICAgIFxuIiAgLy8gc3RvcmUgb3AwCisgICAgInZzdDEudTggICAge3EzfSwgWyVbcF1dICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gc3RvcmUgb3EwCisgICAgOiBbcF0gIityIihwKQorICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCisgICAgOiAibWVtb3J5IiwgUVJlZ3MKKyAgKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2X05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAic3ViICAgICAgICByNCwgJVtwXSwgIzIgICAgICAgICAgICAgICAgICAgXG4iICAvLyBiYXNlMSA9IHAgLSAyCisgICAgImxzbCAgICAgICAgcjYsICVbc3RyaWRlXSwgIzEgICAgICAgICAgICAgIFxuIiAgLy8gcjYgPSAyICogc3RyaWRlCisgICAgImFkZCAgICAgICAgcjUsIHI0LCAlW3N0cmlkZV0gICAgICAgICAgICAgIFxuIiAgLy8gYmFzZTIgPSBiYXNlMSArIHN0cmlkZQorCisgICAgTE9BRDh4NChkMiwgZDMsIGQ0LCBkNSwgW3I0XSwgW3I1XSwgcjYpCisgICAgTE9BRDh4NChkMjQsIGQyNSwgZDI2LCBkMjcsIFtyNF0sIFtyNV0sIHI2KQorICAgICJ2c3dwICAgICAgIGQzLCBkMjQgICAgICAgICAgICAgICAgICAgICAgICBcbiIgIC8vIHAxOnExIHAwOnEzCisgICAgInZzd3AgICAgICAgZDUsIGQyNiAgICAgICAgICAgICAgICAgICAgICAgIFxuIiAgLy8gcTA6cTIgcTE6cTQKKyAgICAidnN3cCAgICAgICBxMiwgcTEyICAgICAgICAgICAgICAgICAgICAgICAgXG4iICAvLyBwMTpxMSBwMDpxMiBxMDpxMyBxMTpxNAorCisgICAgRE9fRklMVEVSMihxMSwgcTIsIHExMiwgcTEzLCAlW3RocmVzaF0pCisKKyAgICAic3ViICAgICAgICAlW3BdLCAlW3BdLCAjMSAgICAgICAgICAgICAgICAgXG4iICAvLyBwIC0gMQorCisgICAgInZzd3AgICAgICAgIGQ1LCBkMjQgICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgIFNUT1JFOHgyKGQ0LCBkNSwgWyVbcF1dLCAlW3N0cmlkZV0pCisgICAgU1RPUkU4eDIoZDI0LCBkMjUsIFslW3BdXSwgJVtzdHJpZGVdKQorCisgICAgOiBbcF0gIityIihwKQorICAgIDogW3N0cmlkZV0gInIiKHN0cmlkZSksIFt0aHJlc2hdICJyIih0aHJlc2gpCisgICAgOiAibWVtb3J5IiwgInI0IiwgInI1IiwgInI2IiwgUVJlZ3MKKyAgKTsKK30KKworI3VuZGVmIExPQUQ4eDQKKyN1bmRlZiBTVE9SRTh4MgorCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfSU5UUklOU0lDUworCitzdGF0aWMgdm9pZCBTaW1wbGVWRmlsdGVyMTZpX05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCkgeworICB1aW50MzJfdCBrOworICBmb3IgKGsgPSAzOyBrICE9IDA7IC0taykgeworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBTaW1wbGVWRmlsdGVyMTZfTkVPTihwLCBzdHJpZGUsIHRocmVzaCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2ltcGxlSEZpbHRlcjE2aV9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgdWludDMyX3QgazsKKyAgZm9yIChrID0gMzsgayAhPSAwOyAtLWspIHsKKyAgICBwICs9IDQ7CisgICAgU2ltcGxlSEZpbHRlcjE2X05FT04ocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb21wbGV4IEluLWxvb3AgZmlsdGVyaW5nIChQYXJhZ3JhcGggMTUuMykKKworc3RhdGljIHVpbnQ4eDE2X3QgTmVlZHNIZXZfTkVPTihjb25zdCB1aW50OHgxNl90IHAxLCBjb25zdCB1aW50OHgxNl90IHAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGV2X3RocmVzaCkgeworICBjb25zdCB1aW50OHgxNl90IGhldl90aHJlc2hfdiA9IHZkdXBxX25fdTgoKHVpbnQ4X3QpaGV2X3RocmVzaCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMV9wMCA9IHZhYmRxX3U4KHAxLCBwMCk7ICAvLyBhYnMocDEgLSBwMCkKKyAgY29uc3QgdWludDh4MTZfdCBhX3ExX3EwID0gdmFiZHFfdTgocTEsIHEwKTsgIC8vIGFicyhxMSAtIHEwKQorICBjb25zdCB1aW50OHgxNl90IGFfbWF4ID0gdm1heHFfdTgoYV9wMV9wMCwgYV9xMV9xMCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IHZjZ3RxX3U4KGFfbWF4LCBoZXZfdGhyZXNoX3YpOworICByZXR1cm4gbWFzazsKK30KKworc3RhdGljIHVpbnQ4eDE2X3QgTmVlZHNGaWx0ZXIyX05FT04oY29uc3QgdWludDh4MTZfdCBwMywgY29uc3QgdWludDh4MTZfdCBwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4MTZfdCBxMiwgY29uc3QgdWludDh4MTZfdCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGhyZXNoLCBpbnQgdGhyZXNoKSB7CisgIGNvbnN0IHVpbnQ4eDE2X3QgaXRocmVzaF92ID0gdmR1cHFfbl91OCgodWludDhfdClpdGhyZXNoKTsKKyAgY29uc3QgdWludDh4MTZfdCBhX3AzX3AyID0gdmFiZHFfdTgocDMsIHAyKTsgIC8vIGFicyhwMyAtIHAyKQorICBjb25zdCB1aW50OHgxNl90IGFfcDJfcDEgPSB2YWJkcV91OChwMiwgcDEpOyAgLy8gYWJzKHAyIC0gcDEpCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9wMV9wMCA9IHZhYmRxX3U4KHAxLCBwMCk7ICAvLyBhYnMocDEgLSBwMCkKKyAgY29uc3QgdWludDh4MTZfdCBhX3EzX3EyID0gdmFiZHFfdTgocTMsIHEyKTsgIC8vIGFicyhxMyAtIHEyKQorICBjb25zdCB1aW50OHgxNl90IGFfcTJfcTEgPSB2YWJkcV91OChxMiwgcTEpOyAgLy8gYWJzKHEyIC0gcTEpCisgIGNvbnN0IHVpbnQ4eDE2X3QgYV9xMV9xMCA9IHZhYmRxX3U4KHExLCBxMCk7ICAvLyBhYnMocTEgLSBxMCkKKyAgY29uc3QgdWludDh4MTZfdCBtYXgxID0gdm1heHFfdTgoYV9wM19wMiwgYV9wMl9wMSk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWF4MiA9IHZtYXhxX3U4KGFfcDFfcDAsIGFfcTNfcTIpOworICBjb25zdCB1aW50OHgxNl90IG1heDMgPSB2bWF4cV91OChhX3EyX3ExLCBhX3ExX3EwKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXgxMiA9IHZtYXhxX3U4KG1heDEsIG1heDIpOworICBjb25zdCB1aW50OHgxNl90IG1heDEyMyA9IHZtYXhxX3U4KG1heDEyLCBtYXgzKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXNrMiA9IHZjZ2VxX3U4KGl0aHJlc2hfdiwgbWF4MTIzKTsKKyAgY29uc3QgdWludDh4MTZfdCBtYXNrMSA9IE5lZWRzRmlsdGVyX05FT04ocDEsIHAwLCBxMCwgcTEsIHRocmVzaCk7CisgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IHZhbmRxX3U4KG1hc2sxLCBtYXNrMik7CisgIHJldHVybiBtYXNrOworfQorCisvLyAgNC1wb2ludHMgZmlsdGVyCisKK3N0YXRpYyB2b2lkIEFwcGx5RmlsdGVyNF9ORU9OKAorICAgIGNvbnN0IGludDh4MTZfdCBwMSwgY29uc3QgaW50OHgxNl90IHAwLAorICAgIGNvbnN0IGludDh4MTZfdCBxMCwgY29uc3QgaW50OHgxNl90IHExLAorICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YTAsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3AxLCB1aW50OHgxNl90KiBjb25zdCBvcDAsCisgICAgdWludDh4MTZfdCogY29uc3Qgb3EwLCB1aW50OHgxNl90KiBjb25zdCBvcTEpIHsKKyAgY29uc3QgaW50OHgxNl90IGtDc3QzID0gdmR1cHFfbl9zOCgweDAzKTsKKyAgY29uc3QgaW50OHgxNl90IGtDc3Q0ID0gdmR1cHFfbl9zOCgweDA0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMSA9IHZxYWRkcV9zOChkZWx0YTAsIGtDc3Q0KTsKKyAgY29uc3QgaW50OHgxNl90IGRlbHRhMiA9IHZxYWRkcV9zOChkZWx0YTAsIGtDc3QzKTsKKyAgY29uc3QgaW50OHgxNl90IGExID0gdnNocnFfbl9zOChkZWx0YTEsIDMpOworICBjb25zdCBpbnQ4eDE2X3QgYTIgPSB2c2hycV9uX3M4KGRlbHRhMiwgMyk7CisgIGNvbnN0IGludDh4MTZfdCBhMyA9IHZyc2hycV9uX3M4KGExLCAxKTsgICAvLyBhMyA9IChhMSArIDEpID4+IDEKKyAgKm9wMCA9IEZsaXBTaWduQmFja19ORU9OKHZxYWRkcV9zOChwMCwgYTIpKTsgIC8vIGNsaXAocDAgKyBhMikKKyAgKm9xMCA9IEZsaXBTaWduQmFja19ORU9OKHZxc3VicV9zOChxMCwgYTEpKTsgIC8vIGNsaXAocTAgLSBhMSkKKyAgKm9wMSA9IEZsaXBTaWduQmFja19ORU9OKHZxYWRkcV9zOChwMSwgYTMpKTsgIC8vIGNsaXAocDEgKyBhMykKKyAgKm9xMSA9IEZsaXBTaWduQmFja19ORU9OKHZxc3VicV9zOChxMSwgYTMpKTsgIC8vIGNsaXAocTEgLSBhMykKK30KKworc3RhdGljIHZvaWQgRG9GaWx0ZXI0X05FT04oCisgICAgY29uc3QgdWludDh4MTZfdCBwMSwgY29uc3QgdWludDh4MTZfdCBwMCwKKyAgICBjb25zdCB1aW50OHgxNl90IHEwLCBjb25zdCB1aW50OHgxNl90IHExLAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzaywgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzaywKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcDEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMSkgeworICAvLyBUaGlzIGlzIGEgZnVzZWQgdmVyc2lvbiBvZiBEb0ZpbHRlcjIoKSBjYWxsaW5nIEFwcGx5RmlsdGVyMiBkaXJlY3RseQorICBjb25zdCBpbnQ4eDE2X3QgcDFzID0gRmxpcFNpZ25fTkVPTihwMSk7CisgIGludDh4MTZfdCBwMHMgPSBGbGlwU2lnbl9ORU9OKHAwKTsKKyAgaW50OHgxNl90IHEwcyA9IEZsaXBTaWduX05FT04ocTApOworICBjb25zdCBpbnQ4eDE2X3QgcTFzID0gRmxpcFNpZ25fTkVPTihxMSk7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2ltcGxlX2xmX21hc2sgPSB2YW5kcV91OChtYXNrLCBoZXZfbWFzayk7CisKKyAgLy8gZG9fZmlsdGVyMiBwYXJ0IChzaW1wbGUgbG9vcGZpbHRlciBvbiBwaXhlbHMgd2l0aCBoZXYpCisgIHsKKyAgICBjb25zdCBpbnQ4eDE2X3QgZGVsdGEgPSBHZXRCYXNlRGVsdGFfTkVPTihwMXMsIHAwcywgcTBzLCBxMXMpOworICAgIGNvbnN0IGludDh4MTZfdCBzaW1wbGVfbGZfZGVsdGEgPQorICAgICAgICB2YW5kcV9zOChkZWx0YSwgdnJlaW50ZXJwcmV0cV9zOF91OChzaW1wbGVfbGZfbWFzaykpOworICAgIEFwcGx5RmlsdGVyMk5vRmxpcF9ORU9OKHAwcywgcTBzLCBzaW1wbGVfbGZfZGVsdGEsICZwMHMsICZxMHMpOworICB9CisKKyAgLy8gZG9fZmlsdGVyNCBwYXJ0IChjb21wbGV4IGxvb3BmaWx0ZXIgb24gcGl4ZWxzIHdpdGhvdXQgaGV2KQorICB7CisgICAgY29uc3QgaW50OHgxNl90IGRlbHRhMCA9IEdldEJhc2VEZWx0YTBfTkVPTihwMHMsIHEwcyk7CisgICAgLy8gd2UgdXNlOiAobWFzayAmIGhldl9tYXNrKSBeIG1hc2sgPSBtYXNrICYgIWhldl9tYXNrCisgICAgY29uc3QgdWludDh4MTZfdCBjb21wbGV4X2xmX21hc2sgPSB2ZW9ycV91OChzaW1wbGVfbGZfbWFzaywgbWFzayk7CisgICAgY29uc3QgaW50OHgxNl90IGNvbXBsZXhfbGZfZGVsdGEgPQorICAgICAgICB2YW5kcV9zOChkZWx0YTAsIHZyZWludGVycHJldHFfczhfdTgoY29tcGxleF9sZl9tYXNrKSk7CisgICAgQXBwbHlGaWx0ZXI0X05FT04ocDFzLCBwMHMsIHEwcywgcTFzLCBjb21wbGV4X2xmX2RlbHRhLCBvcDEsIG9wMCwgb3EwLCBvcTEpOworICB9Cit9CisKKy8vICA2LXBvaW50cyBmaWx0ZXIKKworc3RhdGljIHZvaWQgQXBwbHlGaWx0ZXI2X05FT04oCisgICAgY29uc3QgaW50OHgxNl90IHAyLCBjb25zdCBpbnQ4eDE2X3QgcDEsIGNvbnN0IGludDh4MTZfdCBwMCwKKyAgICBjb25zdCBpbnQ4eDE2X3QgcTAsIGNvbnN0IGludDh4MTZfdCBxMSwgY29uc3QgaW50OHgxNl90IHEyLAorICAgIGNvbnN0IGludDh4MTZfdCBkZWx0YSwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcDIsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMSwgdWludDh4MTZfdCogY29uc3Qgb3AwLAorICAgIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMCwgdWludDh4MTZfdCogY29uc3Qgb3ExLCB1aW50OHgxNl90KiBjb25zdCBvcTIpIHsKKyAgLy8gV2UgaGF2ZSB0byBjb21wdXRlOiBYID0gKDkqYSs2MykgPj4gNywgWSA9ICgxOCphKzYzKT4+NywgWiA9ICgyNyphKzYzKSA+PiA3CisgIC8vIFR1cm5zIG91dCwgdGhlcmUncyBhIGNvbW1vbiBzdWItZXhwcmVzc2lvbiBTPTkgKiBhIC0gMSB0aGF0IGNhbiBiZSB1c2VkCisgIC8vIHdpdGggdGhlIHNwZWNpYWwgdnFyc2hybl9uX3MxNiByb3VuZGluZy1zaGlmdC1hbmQtbmFycm93IGluc3RydWN0aW9uOgorICAvLyAgIFggPSAoUyArIDY0KSA+PiA3LCBZID0gKFMgKyAzMikgPj4gNiwgWiA9ICgxOCAqIGEgKyBTICsgNjQpID4+IDcKKyAgY29uc3QgaW50OHg4X3QgZGVsdGFfbG8gPSB2Z2V0X2xvd19zOChkZWx0YSk7CisgIGNvbnN0IGludDh4OF90IGRlbHRhX2hpID0gdmdldF9oaWdoX3M4KGRlbHRhKTsKKyAgY29uc3QgaW50OHg4X3Qga0NzdDkgPSB2ZHVwX25fczgoOSk7CisgIGNvbnN0IGludDE2eDhfdCBrQ3N0bTEgPSB2ZHVwcV9uX3MxNigtMSk7CisgIGNvbnN0IGludDh4OF90IGtDc3QxOCA9IHZkdXBfbl9zOCgxOCk7CisgIGNvbnN0IGludDE2eDhfdCBTX2xvID0gdm1sYWxfczgoa0NzdG0xLCBrQ3N0OSwgZGVsdGFfbG8pOyAgLy8gUyA9IDkgKiBhIC0gMQorICBjb25zdCBpbnQxNng4X3QgU19oaSA9IHZtbGFsX3M4KGtDc3RtMSwga0NzdDksIGRlbHRhX2hpKTsKKyAgY29uc3QgaW50MTZ4OF90IFpfbG8gPSB2bWxhbF9zOChTX2xvLCBrQ3N0MTgsIGRlbHRhX2xvKTsgICAvLyBTICsgMTggKiBhCisgIGNvbnN0IGludDE2eDhfdCBaX2hpID0gdm1sYWxfczgoU19oaSwga0NzdDE4LCBkZWx0YV9oaSk7CisgIGNvbnN0IGludDh4OF90IGEzX2xvID0gdnFyc2hybl9uX3MxNihTX2xvLCA3KTsgICAvLyAoOSAqIGEgKyA2MykgPj4gNworICBjb25zdCBpbnQ4eDhfdCBhM19oaSA9IHZxcnNocm5fbl9zMTYoU19oaSwgNyk7CisgIGNvbnN0IGludDh4OF90IGEyX2xvID0gdnFyc2hybl9uX3MxNihTX2xvLCA2KTsgICAvLyAoOSAqIGEgKyAzMSkgPj4gNgorICBjb25zdCBpbnQ4eDhfdCBhMl9oaSA9IHZxcnNocm5fbl9zMTYoU19oaSwgNik7CisgIGNvbnN0IGludDh4OF90IGExX2xvID0gdnFyc2hybl9uX3MxNihaX2xvLCA3KTsgICAvLyAoMjcgKiBhICsgNjMpID4+IDcKKyAgY29uc3QgaW50OHg4X3QgYTFfaGkgPSB2cXJzaHJuX25fczE2KFpfaGksIDcpOworICBjb25zdCBpbnQ4eDE2X3QgYTEgPSB2Y29tYmluZV9zOChhMV9sbywgYTFfaGkpOworICBjb25zdCBpbnQ4eDE2X3QgYTIgPSB2Y29tYmluZV9zOChhMl9sbywgYTJfaGkpOworICBjb25zdCBpbnQ4eDE2X3QgYTMgPSB2Y29tYmluZV9zOChhM19sbywgYTNfaGkpOworCisgICpvcDAgPSBGbGlwU2lnbkJhY2tfTkVPTih2cWFkZHFfczgocDAsIGExKSk7ICAvLyBjbGlwKHAwICsgYTEpCisgICpvcTAgPSBGbGlwU2lnbkJhY2tfTkVPTih2cXN1YnFfczgocTAsIGExKSk7ICAvLyBjbGlwKHEwIC0gcTEpCisgICpvcTEgPSBGbGlwU2lnbkJhY2tfTkVPTih2cXN1YnFfczgocTEsIGEyKSk7ICAvLyBjbGlwKHExIC0gYTIpCisgICpvcDEgPSBGbGlwU2lnbkJhY2tfTkVPTih2cWFkZHFfczgocDEsIGEyKSk7ICAvLyBjbGlwKHAxICsgYTIpCisgICpvcTIgPSBGbGlwU2lnbkJhY2tfTkVPTih2cXN1YnFfczgocTIsIGEzKSk7ICAvLyBjbGlwKHEyIC0gYTMpCisgICpvcDIgPSBGbGlwU2lnbkJhY2tfTkVPTih2cWFkZHFfczgocDIsIGEzKSk7ICAvLyBjbGlwKHAyICsgYTMpCit9CisKK3N0YXRpYyB2b2lkIERvRmlsdGVyNl9ORU9OKAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcDIsIGNvbnN0IHVpbnQ4eDE2X3QgcDEsIGNvbnN0IHVpbnQ4eDE2X3QgcDAsCisgICAgY29uc3QgdWludDh4MTZfdCBxMCwgY29uc3QgdWludDh4MTZfdCBxMSwgY29uc3QgdWludDh4MTZfdCBxMiwKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2ssIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2ssCisgICAgdWludDh4MTZfdCogY29uc3Qgb3AyLCB1aW50OHgxNl90KiBjb25zdCBvcDEsIHVpbnQ4eDE2X3QqIGNvbnN0IG9wMCwKKyAgICB1aW50OHgxNl90KiBjb25zdCBvcTAsIHVpbnQ4eDE2X3QqIGNvbnN0IG9xMSwgdWludDh4MTZfdCogY29uc3Qgb3EyKSB7CisgIC8vIFRoaXMgaXMgYSBmdXNlZCB2ZXJzaW9uIG9mIERvRmlsdGVyMigpIGNhbGxpbmcgQXBwbHlGaWx0ZXIyIGRpcmVjdGx5CisgIGNvbnN0IGludDh4MTZfdCBwMnMgPSBGbGlwU2lnbl9ORU9OKHAyKTsKKyAgY29uc3QgaW50OHgxNl90IHAxcyA9IEZsaXBTaWduX05FT04ocDEpOworICBpbnQ4eDE2X3QgcDBzID0gRmxpcFNpZ25fTkVPTihwMCk7CisgIGludDh4MTZfdCBxMHMgPSBGbGlwU2lnbl9ORU9OKHEwKTsKKyAgY29uc3QgaW50OHgxNl90IHExcyA9IEZsaXBTaWduX05FT04ocTEpOworICBjb25zdCBpbnQ4eDE2X3QgcTJzID0gRmxpcFNpZ25fTkVPTihxMik7CisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2ltcGxlX2xmX21hc2sgPSB2YW5kcV91OChtYXNrLCBoZXZfbWFzayk7CisgIGNvbnN0IGludDh4MTZfdCBkZWx0YTAgPSBHZXRCYXNlRGVsdGFfTkVPTihwMXMsIHAwcywgcTBzLCBxMXMpOworCisgIC8vIGRvX2ZpbHRlcjIgcGFydCAoc2ltcGxlIGxvb3BmaWx0ZXIgb24gcGl4ZWxzIHdpdGggaGV2KQorICB7CisgICAgY29uc3QgaW50OHgxNl90IHNpbXBsZV9sZl9kZWx0YSA9CisgICAgICAgIHZhbmRxX3M4KGRlbHRhMCwgdnJlaW50ZXJwcmV0cV9zOF91OChzaW1wbGVfbGZfbWFzaykpOworICAgIEFwcGx5RmlsdGVyMk5vRmxpcF9ORU9OKHAwcywgcTBzLCBzaW1wbGVfbGZfZGVsdGEsICZwMHMsICZxMHMpOworICB9CisKKyAgLy8gZG9fZmlsdGVyNiBwYXJ0IChjb21wbGV4IGxvb3BmaWx0ZXIgb24gcGl4ZWxzIHdpdGhvdXQgaGV2KQorICB7CisgICAgLy8gd2UgdXNlOiAobWFzayAmIGhldl9tYXNrKSBeIG1hc2sgPSBtYXNrICYgIWhldl9tYXNrCisgICAgY29uc3QgdWludDh4MTZfdCBjb21wbGV4X2xmX21hc2sgPSB2ZW9ycV91OChzaW1wbGVfbGZfbWFzaywgbWFzayk7CisgICAgY29uc3QgaW50OHgxNl90IGNvbXBsZXhfbGZfZGVsdGEgPQorICAgICAgICB2YW5kcV9zOChkZWx0YTAsIHZyZWludGVycHJldHFfczhfdTgoY29tcGxleF9sZl9tYXNrKSk7CisgICAgQXBwbHlGaWx0ZXI2X05FT04ocDJzLCBwMXMsIHAwcywgcTBzLCBxMXMsIHEycywgY29tcGxleF9sZl9kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyKTsKKyAgfQorfQorCisvLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCisKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIExvYWQxNng4X05FT04ocCwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyOworICAgIERvRmlsdGVyNl9ORU9OKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldl9tYXNrLAorICAgICAgICAgICAgICAgICAgICZvcDIsICZvcDEsICZvcDAsICZvcTAsICZvcTEsICZvcTIpOworICAgIFN0b3JlMTZ4Ml9ORU9OKG9wMiwgb3AxLCBwIC0gMiAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgICBTdG9yZTE2eDJfTkVPTihvcDAsIG9xMCwgcCArIDAgKiBzdHJpZGUsIHN0cmlkZSk7CisgICAgU3RvcmUxNngyX05FT04ob3ExLCBvcTIsIHAgKyAyICogc3RyaWRlLCBzdHJpZGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNl9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIExvYWQ4eDE2X05FT04ocCwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyOworICAgIERvRmlsdGVyNl9ORU9OKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldl9tYXNrLAorICAgICAgICAgICAgICAgICAgICZvcDIsICZvcDEsICZvcDAsICZvcTAsICZvcTEsICZvcTIpOworICAgIFN0b3JlMngxNl9ORU9OKG9wMiwgb3AxLCBwIC0gMiwgc3RyaWRlKTsKKyAgICBTdG9yZTJ4MTZfTkVPTihvcDAsIG9xMCwgcCArIDAsIHN0cmlkZSk7CisgICAgU3RvcmUyeDE2X05FT04ob3ExLCBvcTIsIHAgKyAyLCBzdHJpZGUpOworICB9Cit9CisKKy8vIG9uIHRocmVlIGlubmVyIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZpX05FT04odWludDhfdCogcCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDMyX3QgazsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMDsKKyAgTG9hZDE2eDRfTkVPTihwICsgMiAgKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKKyAgZm9yIChrID0gMzsgayAhPSAwOyAtLWspIHsKKyAgICB1aW50OHgxNl90IHEwLCBxMSwgcTIsIHEzOworICAgIHAgKz0gNCAqIHN0cmlkZTsKKyAgICBMb2FkMTZ4NF9ORU9OKHAgKyAyICAqIHN0cmlkZSwgc3RyaWRlLCAmcTAsICZxMSwgJnEyLCAmcTMpOworICAgIHsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9CisgICAgICAgICAgTmVlZHNGaWx0ZXIyX05FT04ocDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzLCBpdGhyZXNoLCB0aHJlc2gpOworICAgICAgY29uc3QgdWludDh4MTZfdCBoZXZfbWFzayA9IE5lZWRzSGV2X05FT04ocDEsIHAwLCBxMCwgcTEsIGhldl90aHJlc2gpOworICAgICAgLy8gcDMgYW5kIHAyIGFyZSBub3QganVzdCB0ZW1wb3JhcnkgdmFyaWFibGVzIGhlcmU6IHRoZXkgd2lsbCBiZQorICAgICAgLy8gcmUtdXNlZCBmb3IgbmV4dCBzcGFuLiBBbmQgcTIvcTMgd2lsbCBiZWNvbWUgcDEvcDAgYWNjb3JkaW5nbHkuCisgICAgICBEb0ZpbHRlcjRfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2X21hc2ssICZwMSwgJnAwLCAmcDMsICZwMik7CisgICAgICBTdG9yZTE2eDRfTkVPTihwMSwgcDAsIHAzLCBwMiwgcCwgc3RyaWRlKTsKKyAgICAgIHAxID0gcTI7CisgICAgICBwMCA9IHEzOworICAgIH0KKyAgfQorfQorCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorc3RhdGljIHZvaWQgSEZpbHRlcjE2aV9ORU9OKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQzMl90IGs7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDA7CisgIExvYWQ0eDE2X05FT04ocCArIDIsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKKyAgZm9yIChrID0gMzsgayAhPSAwOyAtLWspIHsKKyAgICB1aW50OHgxNl90IHEwLCBxMSwgcTIsIHEzOworICAgIHAgKz0gNDsKKyAgICBMb2FkNHgxNl9ORU9OKHAgKyAyLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7CisgICAgeworICAgICAgY29uc3QgdWludDh4MTZfdCBtYXNrID0KKyAgICAgICAgICBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsIGl0aHJlc2gsIHRocmVzaCk7CisgICAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgICBEb0ZpbHRlcjRfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2X21hc2ssICZwMSwgJnAwLCAmcDMsICZwMik7CisgICAgICBTdG9yZTR4MTZfTkVPTihwMSwgcDAsIHAzLCBwMiwgcCwgc3RyaWRlKTsKKyAgICAgIHAxID0gcTI7CisgICAgICBwMCA9IHEzOworICAgIH0KKyAgfQorfQorI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4X05FT04odWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICBMb2FkOHg4eDJfTkVPTih1LCB2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMiwgb3AxLCBvcDAsIG9xMCwgb3ExLCBvcTI7CisgICAgRG9GaWx0ZXI2X05FT04ocDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgbWFzaywgaGV2X21hc2ssCisgICAgICAgICAgICAgICAgICAgJm9wMiwgJm9wMSwgJm9wMCwgJm9xMCwgJm9xMSwgJm9xMik7CisgICAgU3RvcmU4eDJ4Ml9ORU9OKG9wMiwgb3AxLCB1IC0gMiAqIHN0cmlkZSwgdiAtIDIgKiBzdHJpZGUsIHN0cmlkZSk7CisgICAgU3RvcmU4eDJ4Ml9ORU9OKG9wMCwgb3EwLCB1ICsgMCAqIHN0cmlkZSwgdiArIDAgKiBzdHJpZGUsIHN0cmlkZSk7CisgICAgU3RvcmU4eDJ4Ml9ORU9OKG9xMSwgb3EyLCB1ICsgMiAqIHN0cmlkZSwgdiArIDIgKiBzdHJpZGUsIHN0cmlkZSk7CisgIH0KK30KK3N0YXRpYyB2b2lkIFZGaWx0ZXI4aV9ORU9OKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIHUgKz0gNCAqIHN0cmlkZTsKKyAgdiArPSA0ICogc3RyaWRlOworICBMb2FkOHg4eDJfTkVPTih1LCB2LCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgbWFzayA9IE5lZWRzRmlsdGVyMl9ORU9OKHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGhyZXNoLCB0aHJlc2gpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaGV2X21hc2sgPSBOZWVkc0hldl9ORU9OKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoKTsKKyAgICB1aW50OHgxNl90IG9wMSwgb3AwLCBvcTAsIG9xMTsKKyAgICBEb0ZpbHRlcjRfTkVPTihwMSwgcDAsIHEwLCBxMSwgbWFzaywgaGV2X21hc2ssICZvcDEsICZvcDAsICZvcTAsICZvcTEpOworICAgIFN0b3JlOHg0eDJfTkVPTihvcDEsIG9wMCwgb3EwLCBvcTEsIHUsIHYsIHN0cmlkZSk7CisgIH0KK30KKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4X05FT04odWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIHVpbnQ4eDE2X3QgcDMsIHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIHEzOworICBMb2FkOHg4eDJUX05FT04odSwgdiwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyOworICAgIERvRmlsdGVyNl9ORU9OKHAyLCBwMSwgcDAsIHEwLCBxMSwgcTIsIG1hc2ssIGhldl9tYXNrLAorICAgICAgICAgICAgICAgICAgICZvcDIsICZvcDEsICZvcDAsICZvcTAsICZvcTEsICZvcTIpOworICAgIFN0b3JlNng4eDJfTkVPTihvcDIsIG9wMSwgb3AwLCBvcTAsIG9xMSwgb3EyLCB1LCB2LCBzdHJpZGUpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4aV9ORU9OKHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgdWludDh4MTZfdCBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisgIHUgKz0gNDsKKyAgdiArPSA0OworICBMb2FkOHg4eDJUX05FT04odSwgdiwgc3RyaWRlLCAmcDMsICZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIHsKKyAgICBjb25zdCB1aW50OHgxNl90IG1hc2sgPSBOZWVkc0ZpbHRlcjJfTkVPTihwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRocmVzaCwgdGhyZXNoKTsKKyAgICBjb25zdCB1aW50OHgxNl90IGhldl9tYXNrID0gTmVlZHNIZXZfTkVPTihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCk7CisgICAgdWludDh4MTZfdCBvcDEsIG9wMCwgb3EwLCBvcTE7CisgICAgRG9GaWx0ZXI0X05FT04ocDEsIHAwLCBxMCwgcTEsIG1hc2ssIGhldl9tYXNrLCAmb3AxLCAmb3AwLCAmb3EwLCAmb3ExKTsKKyAgICBTdG9yZTR4OHgyX05FT04ob3AxLCBvcDAsIG9xMCwgb3ExLCB1LCB2LCBzdHJpZGUpOworICB9Cit9CisjZW5kaWYgIC8vICFXT1JLX0FST1VORF9HQ0MKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW52ZXJzZSB0cmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworLy8gVGVjaG5pY2FsbHkgdGhlc2UgYXJlIHVuc2lnbmVkIGJ1dCB2cWRtdWxoIGlzIG9ubHkgYXZhaWxhYmxlIGluIHNpZ25lZC4KKy8vIHZxZG11bGggcmV0dXJucyBoaWdoIGhhbGYgKGVmZmVjdGl2ZWx5ID4+IDE2KSBidXQgYWxzbyBkb3VibGVzIHRoZSB2YWx1ZSwKKy8vIGNoYW5naW5nIHRoZSA+PiAxNiB0byA+PiAxNSBhbmQgcmVxdWlyaW5nIGFuIGFkZGl0aW9uYWwgPj4gMS4KKy8vIFdlIHVzZSB0aGlzIHRvIG91ciBhZHZhbnRhZ2Ugd2l0aCBrQzIuIFRoZSBjYW5vbmljYWwgdmFsdWUgaXMgMzU0NjguCisvLyBIb3dldmVyLCB0aGUgaGlnaCBiaXQgaXMgc2V0IHNvIHRyZWF0aW5nIGl0IGFzIHNpZ25lZCB3aWxsIGdpdmUgaW5jb3JyZWN0CisvLyByZXN1bHRzLiBXZSBhdm9pZCB0aGlzIGJ5IGRvd24gc2hpZnRpbmcgYnkgMSBoZXJlIHRvIGNsZWFyIHRoZSBoaWdoZXN0IGJpdC4KKy8vIENvbWJpbmVkIHdpdGggdGhlIGRvdWJsaW5nIGVmZmVjdCBvZiB2cWRtdWxoIHdlIGdldCA+PiAxNi4KKy8vIFRoaXMgY2FuIG5vdCBiZSBhcHBsaWVkIHRvIGtDMSBiZWNhdXNlIHRoZSBsb3dlc3QgYml0IGlzIHNldC4gRG93biBzaGlmdGluZworLy8gdGhlIGNvbnN0YW50IHdvdWxkIHJlZHVjZSBwcmVjaXNpb24uCisKKy8vIGxpYndlYnAgdXNlcyBhIHRyaWNrIHRvIGF2b2lkIHNvbWUgZXh0cmEgYWRkaXRpb24gdGhhdCBsaWJ2cHggZG9lcy4KKy8vIEluc3RlYWQgb2Y6CisvLyB0ZW1wMiA9IGlwWzEyXSArICgoaXBbMTJdICogY29zcGk4c3FydDJtaW51czEpID4+IDE2KTsKKy8vIGxpYndlYnAgYWRkcyAxIDw8IDE2IHRvIGNvc3BpOHNxcnQybWludXMxIChrQzEpLiBIb3dldmVyLCB0aGlzIGNhdXNlcyB0aGUKKy8vIHNhbWUgaXNzdWUgd2l0aCBrQzEgYW5kIHZxZG11bGggdGhhdCB3ZSB3b3JrIGFyb3VuZCBieSBkb3duIHNoaWZ0aW5nIGtDMgorCitzdGF0aWMgY29uc3QgaW50MTZfdCBrQzEgPSAyMDA5MTsKK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDMiA9IDE3NzM0OyAgLy8gaGFsZiBvZiBrQzIsIGFjdHVhbGx5LiBTZWUgY29tbWVudCBhYm92ZS4KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfSU5UUklOU0lDUykKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRyYW5zcG9zZTh4Ml9ORU9OKGNvbnN0IGludDE2eDhfdCBpbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZ4OHgyX3QqIGNvbnN0IG91dCkgeworICAvLyBhMCBhMSBhMiBhMyB8IGIwIGIxIGIyIGIzICAgPT4gYTAgYjAgYzAgZDAgfCBhMSBiMSBjMSBkMQorICAvLyBjMCBjMSBjMiBjMyB8IGQwIGQxIGQyIGQzICAgICAgYTIgYjIgYzIgZDIgfCBhMyBiMyBjMyBkMworICBjb25zdCBpbnQxNng4eDJfdCB0bXAwID0gdnppcHFfczE2KGluMCwgaW4xKTsgICAvLyBhMCBjMCBhMSBjMSBhMiBjMiAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYjAgZDAgYjEgZDEgYjIgZDIgLi4uCisgICpvdXQgPSB2emlwcV9zMTYodG1wMC52YWxbMF0sIHRtcDAudmFsWzFdKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJhbnNmb3JtUGFzc19ORU9OKGludDE2eDh4Ml90KiBjb25zdCByb3dzKSB7CisgIC8vIHtyb3dzfSA9IGluMCB8IGluNAorICAvLyAgICAgICAgICBpbjggfCBpbjEyCisgIC8vIEIxID0gaW40IHwgaW4xMgorICBjb25zdCBpbnQxNng4X3QgQjEgPQorICAgICAgdmNvbWJpbmVfczE2KHZnZXRfaGlnaF9zMTYocm93cy0+dmFsWzBdKSwgdmdldF9oaWdoX3MxNihyb3dzLT52YWxbMV0pKTsKKyAgLy8gQzAgPSBrQzEgKiBpbjQgfCBrQzEgKiBpbjEyCisgIC8vIEMxID0ga0MyICogaW40IHwga0MyICogaW4xMgorICBjb25zdCBpbnQxNng4X3QgQzAgPSB2c3JhcV9uX3MxNihCMSwgdnFkbXVsaHFfbl9zMTYoQjEsIGtDMSksIDEpOworICBjb25zdCBpbnQxNng4X3QgQzEgPSB2cWRtdWxocV9uX3MxNihCMSwga0MyKTsKKyAgY29uc3QgaW50MTZ4NF90IGEgPSB2cWFkZF9zMTYodmdldF9sb3dfczE2KHJvd3MtPnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNihyb3dzLT52YWxbMV0pKTsgICAvLyBpbjAgKyBpbjgKKyAgY29uc3QgaW50MTZ4NF90IGIgPSB2cXN1Yl9zMTYodmdldF9sb3dfczE2KHJvd3MtPnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNihyb3dzLT52YWxbMV0pKTsgICAvLyBpbjAgLSBpbjgKKyAgLy8gYyA9IGtDMiAqIGluNCAtIGtDMSAqIGluMTIKKyAgLy8gZCA9IGtDMSAqIGluNCArIGtDMiAqIGluMTIKKyAgY29uc3QgaW50MTZ4NF90IGMgPSB2cXN1Yl9zMTYodmdldF9sb3dfczE2KEMxKSwgdmdldF9oaWdoX3MxNihDMCkpOworICBjb25zdCBpbnQxNng0X3QgZCA9IHZxYWRkX3MxNih2Z2V0X2xvd19zMTYoQzApLCB2Z2V0X2hpZ2hfczE2KEMxKSk7CisgIGNvbnN0IGludDE2eDhfdCBEMCA9IHZjb21iaW5lX3MxNihhLCBiKTsgICAgICAvLyBEMCA9IGEgfCBiCisgIGNvbnN0IGludDE2eDhfdCBEMSA9IHZjb21iaW5lX3MxNihkLCBjKTsgICAgICAvLyBEMSA9IGQgfCBjCisgIGNvbnN0IGludDE2eDhfdCBFMCA9IHZxYWRkcV9zMTYoRDAsIEQxKTsgICAgICAvLyBhK2QgfCBiK2MKKyAgY29uc3QgaW50MTZ4OF90IEVfdG1wID0gdnFzdWJxX3MxNihEMCwgRDEpOyAgIC8vIGEtZCB8IGItYworICBjb25zdCBpbnQxNng4X3QgRTEgPSB2Y29tYmluZV9zMTYodmdldF9oaWdoX3MxNihFX3RtcCksIHZnZXRfbG93X3MxNihFX3RtcCkpOworICBUcmFuc3Bvc2U4eDJfTkVPTihFMCwgRTEsIHJvd3MpOworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1PbmVfTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGludDE2eDh4Ml90IHJvd3M7CisgIElOSVRfVkVDVE9SMihyb3dzLCB2bGQxcV9zMTYoaW4gKyAwKSwgdmxkMXFfczE2KGluICsgOCkpOworICBUcmFuc2Zvcm1QYXNzX05FT04oJnJvd3MpOworICBUcmFuc2Zvcm1QYXNzX05FT04oJnJvd3MpOworICBBZGQ0eDRfTkVPTihyb3dzLnZhbFswXSwgcm93cy52YWxbMV0sIGRzdCk7Cit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybU9uZV9ORU9OKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IGtCUFMgPSBCUFM7CisgIC8vIGtDMSwga0MyLiBQYWRkZWQgYmVjYXVzZSB2bGQxLjE2IGxvYWRzIDggYnl0ZXMKKyAgY29uc3QgaW50MTZfdCBjb25zdGFudHNbNF0gPSB7IGtDMSwga0MyLCAwLCAwIH07CisgIC8qIEFkYXB0ZWQgZnJvbSBsaWJ2cHg6IHZwOC9jb21tb24vYXJtL25lb24vc2hvcnRpZGN0NHg0bGxtX25lb24uYXNtICovCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ2bGQxLjE2ICAgICAgICAge3ExLCBxMn0sIFslW2luXV0gICAgICAgICAgIFxuIgorICAgICJ2bGQxLjE2ICAgICAgICAge2QwfSwgWyVbY29uc3RhbnRzXV0gICAgICAgIFxuIgorCisgICAgLyogZDI6IGluWzBdCisgICAgICogZDM6IGluWzhdCisgICAgICogZDQ6IGluWzRdCisgICAgICogZDU6IGluWzEyXQorICAgICAqLworICAgICJ2c3dwICAgICAgICAgICAgZDMsIGQ0ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogcTggPSB7aW5bNF0sIGluWzEyXX0gKiBrQzEgKiAyID4+IDE2CisgICAgICogcTkgPSB7aW5bNF0sIGluWzEyXX0gKiBrQzIgPj4gMTYKKyAgICAgKi8KKyAgICAidnFkbXVsaC5zMTYgICAgIHE4LCBxMiwgZDBbMF0gICAgICAgICAgICAgICBcbiIKKyAgICAidnFkbXVsaC5zMTYgICAgIHE5LCBxMiwgZDBbMV0gICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyMiA9IGEgPSBpblswXSArIGluWzhdCisgICAgICogZDIzID0gYiA9IGluWzBdIC0gaW5bOF0KKyAgICAgKi8KKyAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIFRoZSBtdWx0aXBsaWNhdGlvbiBzaG91bGQgYmUgeCAqIGtDMSA+PiAxNgorICAgICAqIEhvd2V2ZXIsIHdpdGggdnFkbXVsaCB3ZSBnZXQgeCAqIGtDMSAqIDIgPj4gMTYKKyAgICAgKiAobXVsdGlwbHksIGRvdWJsZSwgcmV0dXJuIGhpZ2ggaGFsZikKKyAgICAgKiBXZSBhdm9pZGVkIHRoaXMgaW4ga0MyIGJ5IHByZS1zaGlmdGluZyB0aGUgY29uc3RhbnQuCisgICAgICogcTggPSBpbls0XS9bMTJdICoga0MxID4+IDE2CisgICAgICovCisgICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBBZGQge2luWzRdLCBpblsxMl19IGJhY2sgYWZ0ZXIgdGhlIG11bHRpcGxpY2F0aW9uLiBUaGlzIGlzIGhhbmRsZWQgYnkKKyAgICAgKiBhZGRpbmcgMSA8PCAxNiB0byBrQzEgaW4gdGhlIGxpYndlYnAgQyBjb2RlLgorICAgICAqLworICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKKyAgICAgKiBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgorICAgICAqLworICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIgPSB0bXBbMF0gPSBhICsgZAorICAgICAqIGQzID0gdG1wWzFdID0gYiArIGMKKyAgICAgKiBkNCA9IHRtcFsyXSA9IGIgLSBjCisgICAgICogZDUgPSB0bXBbM10gPSBhIC0gZAorICAgICAqLworICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIHE4ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzEgKiAyID4+IDE2CisgICAgICogcTkgPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMiA+PiAxNgorICAgICAqLworICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLyogZDIyID0gYSA9IHRtcFswXSArIHRtcFs4XQorICAgICAqIGQyMyA9IGIgPSB0bXBbMF0gLSB0bXBbOF0KKyAgICAgKi8KKyAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIFNlZSBsb25nIHdpbmRlZCBleHBsYW5hdGlvbnMgcHJpb3IgKi8KKyAgICAidnNoci5zMTYgICAgICAgIHE4LCBxOCwgIzEgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIHE4LCBxMiwgcTggICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyMCA9IGMgPSBpbls0XSprQzIgLSBpblsxMl0qa0MxCisgICAgICogZDIxID0gZCA9IGluWzRdKmtDMSArIGluWzEyXSprQzIKKyAgICAgKi8KKyAgICAidnFzdWIuczE2ICAgICAgIGQyMCwgZDE4LCBkMTcgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQyMSwgZDE5LCBkMTYgICAgICAgICAgICAgICBcbiIKKworICAgIC8qIGQyID0gdG1wWzBdID0gYSArIGQKKyAgICAgKiBkMyA9IHRtcFsxXSA9IGIgKyBjCisgICAgICogZDQgPSB0bXBbMl0gPSBiIC0gYworICAgICAqIGQ1ID0gdG1wWzNdID0gYSAtIGQKKyAgICAgKi8KKyAgICAidnFhZGQuczE2ICAgICAgIGQyLCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFhZGQuczE2ICAgICAgIGQzLCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ0LCBkMjMsIGQyMCAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQ1LCBkMjIsIGQyMSAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2bGQxLjMyICAgICAgICAgZDZbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDZbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDdbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2bGQxLjMyICAgICAgICAgZDdbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorCisgICAgInN1YiAgICAgICAgICVbZHN0XSwgJVtkc3RdLCAlW2tCUFNdLCBsc2wgIzIgXG4iCisKKyAgICAvKiAodmFsKSArIDQgPj4gMyAqLworICAgICJ2cnNoci5zMTYgICAgICAgZDIsIGQyLCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDMsIGQzLCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDQsIGQ0LCAjMyAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cnNoci5zMTYgICAgICAgZDUsIGQ1LCAjMyAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvKiBNdXN0IGFjY3VtdWxhdGUgYmVmb3JlIHNhdHVyYXRpbmcgKi8KKyAgICAidm1vdmwudTggICAgICAgIHE4LCBkNiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidm1vdmwudTggICAgICAgIHE5LCBkNyAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2cWFkZC5zMTYgICAgICAgcTEsIHExLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgcTIsIHEyLCBxOSAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZxbW92dW4uczE2ICAgICBkMCwgcTEgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxbW92dW4uczE2ICAgICBkMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnN0MS4zMiAgICAgICAgIGQwWzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQwWzFdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQxWzBdLCBbJVtkc3RdXSwgJVtrQlBTXSAgICBcbiIKKyAgICAidnN0MS4zMiAgICAgICAgIGQxWzFdLCBbJVtkc3RdXSAgICAgICAgICAgICBcbiIKKworICAgIDogW2luXSAiK3IiKGluKSwgW2RzdF0gIityIihkc3QpICAvKiBtb2RpZmllZCByZWdpc3RlcnMgKi8KKyAgICA6IFtrQlBTXSAiciIoa0JQUyksIFtjb25zdGFudHNdICJyIihjb25zdGFudHMpICAvKiBjb25zdGFudHMgKi8KKyAgICA6ICJtZW1vcnkiLCAicTAiLCAicTEiLCAicTIiLCAicTgiLCAicTkiLCAicTEwIiwgInExMSIgIC8qIGNsb2JiZXJlZCAqLworICApOworfQorCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfSU5UUklOU0lDUworCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Ud29fTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LCBpbnQgZG9fdHdvKSB7CisgIFRyYW5zZm9ybU9uZV9ORU9OKGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgVHJhbnNmb3JtT25lX05FT04oaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtRENfTkVPTihjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IGludDE2eDhfdCBEQyA9IHZkdXBxX25fczE2KGluWzBdKTsKKyAgQWRkNHg0X05FT04oREMsIERDLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFNUT1JFX1dIVChkc3QsIGNvbCwgcm93cykgZG8geyAgICAgICAgICAgICAgICAgIFwKKyAgKmRzdCA9IHZnZXRxX2xhbmVfczMyKHJvd3MudmFsWzBdLCBjb2wpOyAoZHN0KSArPSAxNjsgXAorICAqZHN0ID0gdmdldHFfbGFuZV9zMzIocm93cy52YWxbMV0sIGNvbCk7IChkc3QpICs9IDE2OyBcCisgICpkc3QgPSB2Z2V0cV9sYW5lX3MzMihyb3dzLnZhbFsyXSwgY29sKTsgKGRzdCkgKz0gMTY7IFwKKyAgKmRzdCA9IHZnZXRxX2xhbmVfczMyKHJvd3MudmFsWzNdLCBjb2wpOyAoZHN0KSArPSAxNjsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtV0hUX05FT04oY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICBpbnQzMng0eDRfdCB0bXA7CisKKyAgeworICAgIC8vIExvYWQgdGhlIHNvdXJjZS4KKyAgICBjb25zdCBpbnQxNng0X3QgaW4wMF8wMyA9IHZsZDFfczE2KGluICsgMCk7CisgICAgY29uc3QgaW50MTZ4NF90IGluMDRfMDcgPSB2bGQxX3MxNihpbiArIDQpOworICAgIGNvbnN0IGludDE2eDRfdCBpbjA4XzExID0gdmxkMV9zMTYoaW4gKyA4KTsKKyAgICBjb25zdCBpbnQxNng0X3QgaW4xMl8xNSA9IHZsZDFfczE2KGluICsgMTIpOworICAgIGNvbnN0IGludDMyeDRfdCBhMCA9IHZhZGRsX3MxNihpbjAwXzAzLCBpbjEyXzE1KTsgIC8vIGluWzAuLjNdICsgaW5bMTIuLjE1XQorICAgIGNvbnN0IGludDMyeDRfdCBhMSA9IHZhZGRsX3MxNihpbjA0XzA3LCBpbjA4XzExKTsgIC8vIGluWzQuLjddICsgaW5bOC4uMTFdCisgICAgY29uc3QgaW50MzJ4NF90IGEyID0gdnN1YmxfczE2KGluMDRfMDcsIGluMDhfMTEpOyAgLy8gaW5bNC4uN10gLSBpbls4Li4xMV0KKyAgICBjb25zdCBpbnQzMng0X3QgYTMgPSB2c3VibF9zMTYoaW4wMF8wMywgaW4xMl8xNSk7ICAvLyBpblswLi4zXSAtIGluWzEyLi4xNV0KKyAgICB0bXAudmFsWzBdID0gdmFkZHFfczMyKGEwLCBhMSk7CisgICAgdG1wLnZhbFsxXSA9IHZhZGRxX3MzMihhMywgYTIpOworICAgIHRtcC52YWxbMl0gPSB2c3VicV9zMzIoYTAsIGExKTsKKyAgICB0bXAudmFsWzNdID0gdnN1YnFfczMyKGEzLCBhMik7CisgICAgLy8gQXJyYW5nZSB0aGUgdGVtcG9yYXJ5IHJlc3VsdHMgY29sdW1uLXdpc2UuCisgICAgdG1wID0gVHJhbnNwb3NlNHg0X05FT04odG1wKTsKKyAgfQorCisgIHsKKyAgICBjb25zdCBpbnQzMng0X3Qga0NzdDMgPSB2ZHVwcV9uX3MzMigzKTsKKyAgICBjb25zdCBpbnQzMng0X3QgZGMgPSB2YWRkcV9zMzIodG1wLnZhbFswXSwga0NzdDMpOyAgLy8gYWRkIHJvdW5kZXIKKyAgICBjb25zdCBpbnQzMng0X3QgYTAgPSB2YWRkcV9zMzIoZGMsIHRtcC52YWxbM10pOworICAgIGNvbnN0IGludDMyeDRfdCBhMSA9IHZhZGRxX3MzMih0bXAudmFsWzFdLCB0bXAudmFsWzJdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTIgPSB2c3VicV9zMzIodG1wLnZhbFsxXSwgdG1wLnZhbFsyXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEzID0gdnN1YnFfczMyKGRjLCB0bXAudmFsWzNdKTsKKworICAgIHRtcC52YWxbMF0gPSB2YWRkcV9zMzIoYTAsIGExKTsKKyAgICB0bXAudmFsWzFdID0gdmFkZHFfczMyKGEzLCBhMik7CisgICAgdG1wLnZhbFsyXSA9IHZzdWJxX3MzMihhMCwgYTEpOworICAgIHRtcC52YWxbM10gPSB2c3VicV9zMzIoYTMsIGEyKTsKKworICAgIC8vIHJpZ2h0IHNoaWZ0IHRoZSByZXN1bHRzIGJ5IDMuCisgICAgdG1wLnZhbFswXSA9IHZzaHJxX25fczMyKHRtcC52YWxbMF0sIDMpOworICAgIHRtcC52YWxbMV0gPSB2c2hycV9uX3MzMih0bXAudmFsWzFdLCAzKTsKKyAgICB0bXAudmFsWzJdID0gdnNocnFfbl9zMzIodG1wLnZhbFsyXSwgMyk7CisgICAgdG1wLnZhbFszXSA9IHZzaHJxX25fczMyKHRtcC52YWxbM10sIDMpOworCisgICAgU1RPUkVfV0hUKG91dCwgMCwgdG1wKTsKKyAgICBTVE9SRV9XSFQob3V0LCAxLCB0bXApOworICAgIFNUT1JFX1dIVChvdXQsIDIsIHRtcCk7CisgICAgU1RPUkVfV0hUKG91dCwgMywgdG1wKTsKKyAgfQorfQorCisjdW5kZWYgU1RPUkVfV0hUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTVVMKGEsIGIpICgoKGEpICogKGIpKSA+PiAxNikKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDM19ORU9OKGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgc3RhdGljIGNvbnN0IGludCBrQzFfZnVsbCA9IDIwMDkxICsgKDEgPDwgMTYpOworICBzdGF0aWMgY29uc3QgaW50IGtDMl9mdWxsID0gMzU0Njg7CisgIGNvbnN0IGludDE2eDRfdCBBID0gdmxkMV9kdXBfczE2KGluKTsKKyAgY29uc3QgaW50MTZ4NF90IGM0ID0gdmR1cF9uX3MxNihNVUwoaW5bNF0sIGtDMl9mdWxsKSk7CisgIGNvbnN0IGludDE2eDRfdCBkNCA9IHZkdXBfbl9zMTYoTVVMKGluWzRdLCBrQzFfZnVsbCkpOworICBjb25zdCBpbnQgYzEgPSBNVUwoaW5bMV0sIGtDMl9mdWxsKTsKKyAgY29uc3QgaW50IGQxID0gTVVMKGluWzFdLCBrQzFfZnVsbCk7CisgIGNvbnN0IHVpbnQ2NF90IGNkID0gKHVpbnQ2NF90KSggZDEgJiAweGZmZmYpIDw8ICAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKCBjMSAmIDB4ZmZmZikgPDwgMTYgfAorICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCkoLWMxICYgMHhmZmZmKSA8PCAzMiB8CisgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90KSgtZDEgJiAweGZmZmYpIDw8IDQ4OworICBjb25zdCBpbnQxNng0X3QgQ0QgPSB2Y3JlYXRlX3MxNihjZCk7CisgIGNvbnN0IGludDE2eDRfdCBCID0gdnFhZGRfczE2KEEsIENEKTsKKyAgY29uc3QgaW50MTZ4OF90IG0wX20xID0gdmNvbWJpbmVfczE2KHZxYWRkX3MxNihCLCBkNCksIHZxYWRkX3MxNihCLCBjNCkpOworICBjb25zdCBpbnQxNng4X3QgbTJfbTMgPSB2Y29tYmluZV9zMTYodnFzdWJfczE2KEIsIGM0KSwgdnFzdWJfczE2KEIsIGQ0KSk7CisgIEFkZDR4NF9ORU9OKG0wX20xLCBtMl9tMywgZHN0KTsKK30KKyN1bmRlZiBNVUwKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDR4NAorCitzdGF0aWMgdm9pZCBEQzRfTkVPTih1aW50OF90KiBkc3QpIHsgICAgLy8gREMKKyAgY29uc3QgdWludDh4OF90IEEgPSB2bGQxX3U4KGRzdCAtIEJQUyk7ICAvLyB0b3Agcm93CisgIGNvbnN0IHVpbnQxNng0X3QgcDAgPSB2cGFkZGxfdTgoQSk7ICAvLyBjYXNjYWRpbmcgc3VtbWF0aW9uIG9mIHRoZSB0b3AKKyAgY29uc3QgdWludDE2eDRfdCBwMSA9IHZwYWRkX3UxNihwMCwgcDApOworICBjb25zdCB1aW50MTZ4OF90IEwwID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAwICogQlBTIC0gMSkpOworICBjb25zdCB1aW50MTZ4OF90IEwxID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAxICogQlBTIC0gMSkpOworICBjb25zdCB1aW50MTZ4OF90IEwyID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAyICogQlBTIC0gMSkpOworICBjb25zdCB1aW50MTZ4OF90IEwzID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAzICogQlBTIC0gMSkpOworICBjb25zdCB1aW50MTZ4OF90IHMwID0gdmFkZHFfdTE2KEwwLCBMMSk7CisgIGNvbnN0IHVpbnQxNng4X3QgczEgPSB2YWRkcV91MTYoTDIsIEwzKTsKKyAgY29uc3QgdWludDE2eDhfdCBzMDEgPSB2YWRkcV91MTYoczAsIHMxKTsKKyAgY29uc3QgdWludDE2eDhfdCBzdW0gPSB2YWRkcV91MTYoczAxLCB2Y29tYmluZV91MTYocDEsIHAxKSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBkYzAgPSB2cnNocm5fbl91MTYoc3VtLCAzKTsgIC8vIChzdW0gKyA0KSA+PiAzCisgIGNvbnN0IHVpbnQ4eDhfdCBkYyA9IHZkdXBfbGFuZV91OChkYzAsIDApOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgeworICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgaSAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZGMpLCAwKTsKKyAgfQorfQorCisvLyBUcnVlTW90aW9uICg0eDQgKyA4eDgpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uX05FT04odWludDhfdCogZHN0LCBpbnQgc2l6ZSkgeworICBjb25zdCB1aW50OHg4X3QgVEwgPSB2bGQxX2R1cF91OChkc3QgLSBCUFMgLSAxKTsgIC8vIHRvcC1sZWZ0IHBpeGVsICdBWy0xXScKKyAgY29uc3QgdWludDh4OF90IFQgPSB2bGQxX3U4KGRzdCAtIEJQUyk7ICAvLyB0b3Agcm93ICdBWzAuLjNdJworICBjb25zdCBpbnQxNng4X3QgZCA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OChULCBUTCkpOyAgLy8gQVtjXSAtIEFbLTFdCisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgeSArPSA0KSB7CisgICAgLy8gbGVmdCBlZGdlCisgICAgY29uc3QgaW50MTZ4OF90IEwwID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAwICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMSA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMSAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDIgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDIgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwzID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAzICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCByMCA9IHZhZGRxX3MxNihMMCwgZCk7ICAvLyBMW3JdICsgQVtjXSAtIEFbLTFdCisgICAgY29uc3QgaW50MTZ4OF90IHIxID0gdmFkZHFfczE2KEwxLCBkKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjIgPSB2YWRkcV9zMTYoTDIsIGQpOworICAgIGNvbnN0IGludDE2eDhfdCByMyA9IHZhZGRxX3MxNihMMywgZCk7CisgICAgLy8gU2F0dXJhdGUgYW5kIHN0b3JlIHRoZSByZXN1bHQuCisgICAgY29uc3QgdWludDMyeDJfdCByMF91MzIgPSB2cmVpbnRlcnByZXRfdTMyX3U4KHZxbW92dW5fczE2KHIwKSk7CisgICAgY29uc3QgdWludDMyeDJfdCByMV91MzIgPSB2cmVpbnRlcnByZXRfdTMyX3U4KHZxbW92dW5fczE2KHIxKSk7CisgICAgY29uc3QgdWludDMyeDJfdCByMl91MzIgPSB2cmVpbnRlcnByZXRfdTMyX3U4KHZxbW92dW5fczE2KHIyKSk7CisgICAgY29uc3QgdWludDMyeDJfdCByM191MzIgPSB2cmVpbnRlcnByZXRfdTMyX3U4KHZxbW92dW5fczE2KHIzKSk7CisgICAgaWYgKHNpemUgPT0gNCkgeworICAgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgcjBfdTMyLCAwKTsKKyAgICAgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMSAqIEJQUyksIHIxX3UzMiwgMCk7CisgICAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCByMl91MzIsIDApOworICAgICAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgcjNfdTMyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgdnN0MV91MzIoKHVpbnQzMl90KikoZHN0ICsgMCAqIEJQUyksIHIwX3UzMik7CisgICAgICB2c3QxX3UzMigodWludDMyX3QqKShkc3QgKyAxICogQlBTKSwgcjFfdTMyKTsKKyAgICAgIHZzdDFfdTMyKCh1aW50MzJfdCopKGRzdCArIDIgKiBCUFMpLCByMl91MzIpOworICAgICAgdnN0MV91MzIoKHVpbnQzMl90KikoZHN0ICsgMyAqIEJQUyksIHIzX3UzMik7CisgICAgfQorICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFRNNF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uX05FT04oZHN0LCA0KTsgfQorCitzdGF0aWMgdm9pZCBWRTRfTkVPTih1aW50OF90KiBkc3QpIHsgICAgLy8gdmVydGljYWwKKyAgLy8gTkI6IGF2b2lkIHZsZDFfdTY0IGhlcmUgYXMgYW4gYWxpZ25tZW50IGhpbnQgbWF5IGJlIGFkZGVkIC0+IFNJR0JVUy4KKyAgY29uc3QgdWludDY0eDFfdCBBMCA9IHZyZWludGVycHJldF91NjRfdTgodmxkMV91OChkc3QgLSBCUFMgLSAxKSk7ICAvLyB0b3Agcm93CisgIGNvbnN0IHVpbnQ2NHgxX3QgQTEgPSB2c2hyX25fdTY0KEEwLCA4KTsKKyAgY29uc3QgdWludDY0eDFfdCBBMiA9IHZzaHJfbl91NjQoQTAsIDE2KTsKKyAgY29uc3QgdWludDh4OF90IEFCQ0RFRkdIID0gdnJlaW50ZXJwcmV0X3U4X3U2NChBMCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBCQ0RFRkdIMCA9IHZyZWludGVycHJldF91OF91NjQoQTEpOworICBjb25zdCB1aW50OHg4X3QgQ0RFRkdIMDAgPSB2cmVpbnRlcnByZXRfdThfdTY0KEEyKTsKKyAgY29uc3QgdWludDh4OF90IGIgPSB2aGFkZF91OChBQkNERUZHSCwgQ0RFRkdIMDApOworICBjb25zdCB1aW50OHg4X3QgYXZnID0gdnJoYWRkX3U4KGIsIEJDREVGR0gwKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIGkgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGF2ZyksIDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFJENF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgIC8vIERvd24tcmlnaHQKKyAgY29uc3QgdWludDh4OF90IFhBQkNEX3U4ID0gdmxkMV91OChkc3QgLSBCUFMgLSAxKTsKKyAgY29uc3QgdWludDY0eDFfdCBYQUJDRCA9IHZyZWludGVycHJldF91NjRfdTgoWEFCQ0RfdTgpOworICBjb25zdCB1aW50NjR4MV90IF9fX19YQUJDID0gdnNobF9uX3U2NChYQUJDRCwgMzIpOworICBjb25zdCB1aW50MzJfdCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEogPSBkc3RbLTEgKyAxICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgSyA9IGRzdFstMSArIDIgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBMID0gZHN0Wy0xICsgMyAqIEJQU107CisgIGNvbnN0IHVpbnQ2NHgxX3QgTEtKSV9fX18gPSB2Y3JlYXRlX3U2NChMIHwgKEsgPDwgOCkgfCAoSiA8PCAxNikgfCAoSSA8PCAyNCkpOworICBjb25zdCB1aW50NjR4MV90IExLSklYQUJDID0gdm9ycl91NjQoTEtKSV9fX18sIF9fX19YQUJDKTsKKyAgY29uc3QgdWludDh4OF90IEtKSVhBQkNfID0gdnJlaW50ZXJwcmV0X3U4X3U2NCh2c2hyX25fdTY0KExLSklYQUJDLCA4KSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBKSVhBQkNfXyA9IHZyZWludGVycHJldF91OF91NjQodnNocl9uX3U2NChMS0pJWEFCQywgMTYpKTsKKyAgY29uc3QgdWludDhfdCBEID0gdmdldF9sYW5lX3U4KFhBQkNEX3U4LCA0KTsKKyAgY29uc3QgdWludDh4OF90IEpJWEFCQ0RfID0gdnNldF9sYW5lX3U4KEQsIEpJWEFCQ19fLCA2KTsKKyAgY29uc3QgdWludDh4OF90IExLSklYQUJDX3U4ID0gdnJlaW50ZXJwcmV0X3U4X3U2NChMS0pJWEFCQyk7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcxID0gdmhhZGRfdTgoSklYQUJDRF8sIExLSklYQUJDX3U4KTsKKyAgY29uc3QgdWludDh4OF90IGF2ZzIgPSB2cmhhZGRfdTgoYXZnMSwgS0pJWEFCQ18pOworICBjb25zdCB1aW50NjR4MV90IGF2ZzJfdTY0ID0gdnJlaW50ZXJwcmV0X3U2NF91OChhdmcyKTsKKyAgY29uc3QgdWludDMyeDJfdCByMyA9IHZyZWludGVycHJldF91MzJfdTgoYXZnMik7CisgIGNvbnN0IHVpbnQzMngyX3QgcjIgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCA4KSk7CisgIGNvbnN0IHVpbnQzMngyX3QgcjEgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCAxNikpOworICBjb25zdCB1aW50MzJ4Ml90IHIwID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgMjQpKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgcjAsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCByMSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHIyLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgcjMsIDApOworfQorCitzdGF0aWMgdm9pZCBMRDRfTkVPTih1aW50OF90KiBkc3QpIHsgICAgLy8gRG93bi1sZWZ0CisgIC8vIE5vdGUgdXNpbmcgdGhlIHNhbWUgc2hpZnQgdHJpY2sgYXMgVkU0KCkgaXMgc2xvd2VyIGhlcmUuCisgIGNvbnN0IHVpbnQ4eDhfdCBBQkNERUZHSCA9IHZsZDFfdTgoZHN0IC0gQlBTICsgMCk7CisgIGNvbnN0IHVpbnQ4eDhfdCBCQ0RFRkdIMCA9IHZsZDFfdTgoZHN0IC0gQlBTICsgMSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBDREVGR0gwMCA9IHZsZDFfdTgoZHN0IC0gQlBTICsgMik7CisgIGNvbnN0IHVpbnQ4eDhfdCBDREVGR0hIMCA9IHZzZXRfbGFuZV91OChkc3RbLUJQUyArIDddLCBDREVGR0gwMCwgNik7CisgIGNvbnN0IHVpbnQ4eDhfdCBhdmcxID0gdmhhZGRfdTgoQUJDREVGR0gsIENERUZHSEgwKTsKKyAgY29uc3QgdWludDh4OF90IGF2ZzIgPSB2cmhhZGRfdTgoYXZnMSwgQkNERUZHSDApOworICBjb25zdCB1aW50NjR4MV90IGF2ZzJfdTY0ID0gdnJlaW50ZXJwcmV0X3U2NF91OChhdmcyKTsKKyAgY29uc3QgdWludDMyeDJfdCByMCA9IHZyZWludGVycHJldF91MzJfdTgoYXZnMik7CisgIGNvbnN0IHVpbnQzMngyX3QgcjEgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCA4KSk7CisgIGNvbnN0IHVpbnQzMngyX3QgcjIgPSB2cmVpbnRlcnByZXRfdTMyX3U2NCh2c2hyX25fdTY0KGF2ZzJfdTY0LCAxNikpOworICBjb25zdCB1aW50MzJ4Ml90IHIzID0gdnJlaW50ZXJwcmV0X3UzMl91NjQodnNocl9uX3U2NChhdmcyX3U2NCwgMjQpKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgcjAsIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCByMSwgMCk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHIyLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgcjMsIDApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hCisKK3N0YXRpYyB2b2lkIFZFOHV2X05FT04odWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IHVpbnQ4eDhfdCB0b3AgPSB2bGQxX3U4KGRzdCAtIEJQUyk7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgdnN0MV91OChkc3QgKyBqICogQlBTLCB0b3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFOHV2X05FT04odWludDhfdCogZHN0KSB7ICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBjb25zdCB1aW50OHg4X3QgbGVmdCA9IHZsZDFfZHVwX3U4KGRzdCAtIDEpOworICAgIHZzdDFfdTgoZHN0LCBsZWZ0KTsKKyAgICBkc3QgKz0gQlBTOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOF9ORU9OKHVpbnQ4X3QqIGRzdCwgaW50IGRvX3RvcCwgaW50IGRvX2xlZnQpIHsKKyAgdWludDE2eDhfdCBzdW1fdG9wOworICB1aW50MTZ4OF90IHN1bV9sZWZ0OworICB1aW50OHg4X3QgZGMwOworCisgIGlmIChkb190b3ApIHsKKyAgICBjb25zdCB1aW50OHg4X3QgQSA9IHZsZDFfdTgoZHN0IC0gQlBTKTsgIC8vIHRvcCByb3cKKyAgICBjb25zdCB1aW50MTZ4NF90IHAwID0gdnBhZGRsX3U4KEEpOyAgLy8gY2FzY2FkaW5nIHN1bW1hdGlvbiBvZiB0aGUgdG9wCisgICAgY29uc3QgdWludDE2eDRfdCBwMSA9IHZwYWRkX3UxNihwMCwgcDApOworICAgIGNvbnN0IHVpbnQxNng0X3QgcDIgPSB2cGFkZF91MTYocDEsIHAxKTsKKyAgICBzdW1fdG9wID0gdmNvbWJpbmVfdTE2KHAyLCBwMik7CisgIH0KKworICBpZiAoZG9fbGVmdCkgeworICAgIGNvbnN0IHVpbnQxNng4X3QgTDAgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDAgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMMSA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgMSAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEwyID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAyICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDMgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDMgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMNCA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgNCAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEw1ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyA1ICogQlBTIC0gMSkpOworICAgIGNvbnN0IHVpbnQxNng4X3QgTDYgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIDYgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgdWludDE2eDhfdCBMNyA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgNyAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMwID0gdmFkZHFfdTE2KEwwLCBMMSk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMSA9IHZhZGRxX3UxNihMMiwgTDMpOworICAgIGNvbnN0IHVpbnQxNng4X3QgczIgPSB2YWRkcV91MTYoTDQsIEw1KTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMzID0gdmFkZHFfdTE2KEw2LCBMNyk7CisgICAgY29uc3QgdWludDE2eDhfdCBzMDEgPSB2YWRkcV91MTYoczAsIHMxKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IHMyMyA9IHZhZGRxX3UxNihzMiwgczMpOworICAgIHN1bV9sZWZ0ID0gdmFkZHFfdTE2KHMwMSwgczIzKTsKKyAgfQorCisgIGlmIChkb190b3AgJiYgZG9fbGVmdCkgeworICAgIGNvbnN0IHVpbnQxNng4X3Qgc3VtID0gdmFkZHFfdTE2KHN1bV9sZWZ0LCBzdW1fdG9wKTsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtLCA0KTsKKyAgfSBlbHNlIGlmIChkb190b3ApIHsKKyAgICBkYzAgPSB2cnNocm5fbl91MTYoc3VtX3RvcCwgMyk7CisgIH0gZWxzZSBpZiAoZG9fbGVmdCkgeworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW1fbGVmdCwgMyk7CisgIH0gZWxzZSB7CisgICAgZGMwID0gdmR1cF9uX3U4KDB4ODApOworICB9CisKKyAgeworICAgIGNvbnN0IHVpbnQ4eDhfdCBkYyA9IHZkdXBfbGFuZV91OChkYzAsIDApOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgIHZzdDFfdTMyKCh1aW50MzJfdCopKGRzdCArIGkgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRjKSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2X05FT04odWludDhfdCogZHN0KSB7IERDOF9ORU9OKGRzdCwgMSwgMSk7IH0KK3N0YXRpYyB2b2lkIERDOHV2Tm9Ub3BfTkVPTih1aW50OF90KiBkc3QpIHsgREM4X05FT04oZHN0LCAwLCAxKTsgfQorc3RhdGljIHZvaWQgREM4dXZOb0xlZnRfTkVPTih1aW50OF90KiBkc3QpIHsgREM4X05FT04oZHN0LCAxLCAwKTsgfQorc3RhdGljIHZvaWQgREM4dXZOb1RvcExlZnRfTkVPTih1aW50OF90KiBkc3QpIHsgREM4X05FT04oZHN0LCAwLCAwKTsgfQorCitzdGF0aWMgdm9pZCBUTTh1dl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBUcnVlTW90aW9uX05FT04oZHN0LCA4KTsgfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gMTZ4MTYKKworc3RhdGljIHZvaWQgVkUxNl9ORU9OKHVpbnQ4X3QqIGRzdCkgeyAgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdWludDh4MTZfdCB0b3AgPSB2bGQxcV91OChkc3QgLSBCUFMpOworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICB2c3QxcV91OChkc3QgKyBqICogQlBTLCB0b3ApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhFMTZfTkVPTih1aW50OF90KiBkc3QpIHsgICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgY29uc3QgdWludDh4MTZfdCBsZWZ0ID0gdmxkMXFfZHVwX3U4KGRzdCAtIDEpOworICAgIHZzdDFxX3U4KGRzdCwgbGVmdCk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2X05FT04odWludDhfdCogZHN0LCBpbnQgZG9fdG9wLCBpbnQgZG9fbGVmdCkgeworICB1aW50MTZ4OF90IHN1bV90b3A7CisgIHVpbnQxNng4X3Qgc3VtX2xlZnQ7CisgIHVpbnQ4eDhfdCBkYzA7CisKKyAgaWYgKGRvX3RvcCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQSA9IHZsZDFxX3U4KGRzdCAtIEJQUyk7ICAvLyB0b3Agcm93CisgICAgY29uc3QgdWludDE2eDhfdCBwMCA9IHZwYWRkbHFfdTgoQSk7ICAvLyBjYXNjYWRpbmcgc3VtbWF0aW9uIG9mIHRoZSB0b3AKKyAgICBjb25zdCB1aW50MTZ4NF90IHAxID0gdmFkZF91MTYodmdldF9sb3dfdTE2KHAwKSwgdmdldF9oaWdoX3UxNihwMCkpOworICAgIGNvbnN0IHVpbnQxNng0X3QgcDIgPSB2cGFkZF91MTYocDEsIHAxKTsKKyAgICBjb25zdCB1aW50MTZ4NF90IHAzID0gdnBhZGRfdTE2KHAyLCBwMik7CisgICAgc3VtX3RvcCA9IHZjb21iaW5lX3UxNihwMywgcDMpOworICB9CisKKyAgaWYgKGRvX2xlZnQpIHsKKyAgICBpbnQgaTsKKyAgICBzdW1fbGVmdCA9IHZkdXBxX25fdTE2KDApOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgaSArPSA4KSB7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEwwID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDApICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMMSA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyAxKSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDIgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgMikgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEwzID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDMpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMNCA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyA0KSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgTDUgPSB2bW92bF91OCh2bGQxX3U4KGRzdCArIChpICsgNSkgKiBCUFMgLSAxKSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IEw2ID0gdm1vdmxfdTgodmxkMV91OChkc3QgKyAoaSArIDYpICogQlBTIC0gMSkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBMNyA9IHZtb3ZsX3U4KHZsZDFfdTgoZHN0ICsgKGkgKyA3KSAqIEJQUyAtIDEpKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczAgPSB2YWRkcV91MTYoTDAsIEwxKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczEgPSB2YWRkcV91MTYoTDIsIEwzKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczIgPSB2YWRkcV91MTYoTDQsIEw1KTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczMgPSB2YWRkcV91MTYoTDYsIEw3KTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgczAxID0gdmFkZHFfdTE2KHMwLCBzMSk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IHMyMyA9IHZhZGRxX3UxNihzMiwgczMpOworICAgICAgY29uc3QgdWludDE2eDhfdCBzdW0gPSB2YWRkcV91MTYoczAxLCBzMjMpOworICAgICAgc3VtX2xlZnQgPSB2YWRkcV91MTYoc3VtX2xlZnQsIHN1bSk7CisgICAgfQorICB9CisKKyAgaWYgKGRvX3RvcCAmJiBkb19sZWZ0KSB7CisgICAgY29uc3QgdWludDE2eDhfdCBzdW0gPSB2YWRkcV91MTYoc3VtX2xlZnQsIHN1bV90b3ApOworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW0sIDUpOworICB9IGVsc2UgaWYgKGRvX3RvcCkgeworICAgIGRjMCA9IHZyc2hybl9uX3UxNihzdW1fdG9wLCA0KTsKKyAgfSBlbHNlIGlmIChkb19sZWZ0KSB7CisgICAgZGMwID0gdnJzaHJuX25fdTE2KHN1bV9sZWZ0LCA0KTsKKyAgfSBlbHNlIHsKKyAgICBkYzAgPSB2ZHVwX25fdTgoMHg4MCk7CisgIH0KKworICB7CisgICAgY29uc3QgdWludDh4MTZfdCBkYyA9IHZkdXBxX2xhbmVfdTgoZGMwLCAwKTsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgICAgdnN0MXFfdTgoZHN0ICsgaSAqIEJQUywgZGMpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBEQzE2VG9wTGVmdF9ORU9OKHVpbnQ4X3QqIGRzdCkgeyBEQzE2X05FT04oZHN0LCAxLCAxKTsgfQorc3RhdGljIHZvaWQgREMxNk5vVG9wX05FT04odWludDhfdCogZHN0KSB7IERDMTZfTkVPTihkc3QsIDAsIDEpOyB9CitzdGF0aWMgdm9pZCBEQzE2Tm9MZWZ0X05FT04odWludDhfdCogZHN0KSB7IERDMTZfTkVPTihkc3QsIDEsIDApOyB9CitzdGF0aWMgdm9pZCBEQzE2Tm9Ub3BMZWZ0X05FT04odWludDhfdCogZHN0KSB7IERDMTZfTkVPTihkc3QsIDAsIDApOyB9CisKK3N0YXRpYyB2b2lkIFRNMTZfTkVPTih1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDh4OF90IFRMID0gdmxkMV9kdXBfdTgoZHN0IC0gQlBTIC0gMSk7ICAvLyB0b3AtbGVmdCBwaXhlbCAnQVstMV0nCisgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IHZsZDFxX3U4KGRzdCAtIEJQUyk7ICAvLyB0b3Agcm93ICdBWzAuLjE1XScKKyAgLy8gQVtjXSAtIEFbLTFdCisgIGNvbnN0IGludDE2eDhfdCBkX2xvID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KHZnZXRfbG93X3U4KFQpLCBUTCkpOworICBjb25zdCBpbnQxNng4X3QgZF9oaSA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh2Z2V0X2hpZ2hfdTgoVCksIFRMKSk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTY7IHkgKz0gNCkgeworICAgIC8vIGxlZnQgZWRnZQorICAgIGNvbnN0IGludDE2eDhfdCBMMCA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMCAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgTDEgPSBDb252ZXJ0VThUb1MxNl9ORU9OKHZsZDFfZHVwX3U4KGRzdCArIDEgKiBCUFMgLSAxKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEwyID0gQ29udmVydFU4VG9TMTZfTkVPTih2bGQxX2R1cF91OChkc3QgKyAyICogQlBTIC0gMSkpOworICAgIGNvbnN0IGludDE2eDhfdCBMMyA9IENvbnZlcnRVOFRvUzE2X05FT04odmxkMV9kdXBfdTgoZHN0ICsgMyAqIEJQUyAtIDEpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjBfbG8gPSB2YWRkcV9zMTYoTDAsIGRfbG8pOyAgLy8gTFtyXSArIEFbY10gLSBBWy0xXQorICAgIGNvbnN0IGludDE2eDhfdCByMV9sbyA9IHZhZGRxX3MxNihMMSwgZF9sbyk7CisgICAgY29uc3QgaW50MTZ4OF90IHIyX2xvID0gdmFkZHFfczE2KEwyLCBkX2xvKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjNfbG8gPSB2YWRkcV9zMTYoTDMsIGRfbG8pOworICAgIGNvbnN0IGludDE2eDhfdCByMF9oaSA9IHZhZGRxX3MxNihMMCwgZF9oaSk7CisgICAgY29uc3QgaW50MTZ4OF90IHIxX2hpID0gdmFkZHFfczE2KEwxLCBkX2hpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgcjJfaGkgPSB2YWRkcV9zMTYoTDIsIGRfaGkpOworICAgIGNvbnN0IGludDE2eDhfdCByM19oaSA9IHZhZGRxX3MxNihMMywgZF9oaSk7CisgICAgLy8gU2F0dXJhdGUgYW5kIHN0b3JlIHRoZSByZXN1bHQuCisgICAgY29uc3QgdWludDh4MTZfdCByb3cwID0gdmNvbWJpbmVfdTgodnFtb3Z1bl9zMTYocjBfbG8pLCB2cW1vdnVuX3MxNihyMF9oaSkpOworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgcm93MSA9IHZjb21iaW5lX3U4KHZxbW92dW5fczE2KHIxX2xvKSwgdnFtb3Z1bl9zMTYocjFfaGkpKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHJvdzIgPSB2Y29tYmluZV91OCh2cW1vdnVuX3MxNihyMl9sbyksIHZxbW92dW5fczE2KHIyX2hpKSk7CisgICAgY29uc3QgdWludDh4MTZfdCByb3czID0gdmNvbWJpbmVfdTgodnFtb3Z1bl9zMTYocjNfbG8pLCB2cW1vdnVuX3MxNihyM19oaSkpOworICAgIHZzdDFxX3U4KGRzdCArIDAgKiBCUFMsIHJvdzApOworICAgIHZzdDFxX3U4KGRzdCArIDEgKiBCUFMsIHJvdzEpOworICAgIHZzdDFxX3U4KGRzdCArIDIgKiBCUFMsIHJvdzIpOworICAgIHZzdDFxX3U4KGRzdCArIDMgKiBCUFMsIHJvdzMpOworICAgIGRzdCArPSA0ICogQlBTOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhEc3BJbml0TkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRORU9OKHZvaWQpIHsKKyAgVlA4VHJhbnNmb3JtID0gVHJhbnNmb3JtVHdvX05FT047CisgIFZQOFRyYW5zZm9ybUFDMyA9IFRyYW5zZm9ybUFDM19ORU9OOworICBWUDhUcmFuc2Zvcm1EQyA9IFRyYW5zZm9ybURDX05FT047CisgIFZQOFRyYW5zZm9ybVdIVCA9IFRyYW5zZm9ybVdIVF9ORU9OOworCisgIFZQOFZGaWx0ZXIxNiA9IFZGaWx0ZXIxNl9ORU9OOworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aV9ORU9OOworICBWUDhIRmlsdGVyMTYgPSBIRmlsdGVyMTZfTkVPTjsKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisgIFZQOEhGaWx0ZXIxNmkgPSBIRmlsdGVyMTZpX05FT047CisjZW5kaWYKKyAgVlA4VkZpbHRlcjggPSBWRmlsdGVyOF9ORU9OOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGlfTkVPTjsKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisgIFZQOEhGaWx0ZXI4ID0gSEZpbHRlcjhfTkVPTjsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpX05FT047CisjZW5kaWYKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2X05FT047CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNl9ORU9OOworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aV9ORU9OOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aV9ORU9OOworCisgIFZQOFByZWRMdW1hNFswXSA9IERDNF9ORU9OOworICBWUDhQcmVkTHVtYTRbMV0gPSBUTTRfTkVPTjsKKyAgVlA4UHJlZEx1bWE0WzJdID0gVkU0X05FT047CisgIFZQOFByZWRMdW1hNFs0XSA9IFJENF9ORU9OOworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDRfTkVPTjsKKworICBWUDhQcmVkTHVtYTE2WzBdID0gREMxNlRvcExlZnRfTkVPTjsKKyAgVlA4UHJlZEx1bWExNlsxXSA9IFRNMTZfTkVPTjsKKyAgVlA4UHJlZEx1bWExNlsyXSA9IFZFMTZfTkVPTjsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTZfTkVPTjsKKyAgVlA4UHJlZEx1bWExNls0XSA9IERDMTZOb1RvcF9ORU9OOworICBWUDhQcmVkTHVtYTE2WzVdID0gREMxNk5vTGVmdF9ORU9OOworICBWUDhQcmVkTHVtYTE2WzZdID0gREMxNk5vVG9wTGVmdF9ORU9OOworCisgIFZQOFByZWRDaHJvbWE4WzBdID0gREM4dXZfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUTTh1dl9ORU9OOworICBWUDhQcmVkQ2hyb21hOFsyXSA9IFZFOHV2X05FT047CisgIFZQOFByZWRDaHJvbWE4WzNdID0gSEU4dXZfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbNF0gPSBEQzh1dk5vVG9wX05FT047CisgIFZQOFByZWRDaHJvbWE4WzVdID0gREM4dXZOb0xlZnRfTkVPTjsKKyAgVlA4UHJlZENocm9tYThbNl0gPSBEQzh1dk5vVG9wTGVmdF9ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOERzcEluaXRORU9OKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZGVjX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg0MGZhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlMi5jCkBAIC0wLDAgKzEsMTIyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmVyc2lvbiBvZiBzb21lIGRlY29kaW5nIGZ1bmN0aW9ucyAoaWRjdCwgbG9vcCBmaWx0ZXJpbmcpLgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorLy8gICAgICAgICBjZHV2aXZpZXJAZ29vZ2xlLmNvbSAoQ2hyaXN0aWFuIER1dml2aWVyKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKworLy8gVGhlIDMtY29lZmYgc3BhcnNlIHRyYW5zZm9ybSBpbiBTU0UyIGlzIG5vdCByZWFsbHkgZmFzdGVyIHRoYW4gdGhlIHBsYWluLUMKKy8vIG9uZSBpdCBzZWVtcyA9PiBkaXNhYmxlIGl0IGJ5IGRlZmF1bHQuIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIHRvIGVuYWJsZToKKyNpZiAhZGVmaW5lZChVU0VfVFJBTlNGT1JNX0FDMykKKyNkZWZpbmUgVVNFX1RSQU5TRk9STV9BQzMgMCAgIC8vIEFMVEVSTkFURV9DT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPGVtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtX1NTRTIoY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIG1ha2VzIHVzZSBvZiAxNi1iaXQgZml4ZWQgcG9pbnQgdmVyc2lvbnMgb2YgdHdvCisgIC8vIG11bHRpcGx5IGNvbnN0YW50czoKKyAgLy8gICAgSzEgPSBzcXJ0KDIpICogY29zIChwaS84KSB+PSA4NTYyNyAvIDJeMTYKKyAgLy8gICAgSzIgPSBzcXJ0KDIpICogc2luIChwaS84KSB+PSAzNTQ2OCAvIDJeMTYKKyAgLy8KKyAgLy8gVG8gYmUgYWJsZSB0byB1c2Ugc2lnbmVkIDE2LWJpdCBpbnRlZ2Vycywgd2UgdXNlIHRoZSBmb2xsb3dpbmcgdHJpY2sgdG8KKyAgLy8gaGF2ZSBjb25zdGFudHMgd2l0aGluIHJhbmdlOgorICAvLyAtIEFzc29jaWF0ZWQgY29uc3RhbnRzIGFyZSBvYnRhaW5lZCBieSBzdWJ0cmFjdGluZyB0aGUgMTYtYml0IGZpeGVkIHBvaW50CisgIC8vICAgdmVyc2lvbiBvZiBvbmU6CisgIC8vICAgICAgayA9IEsgLSAoMSA8PCAxNikgID0+ICBLID0gayArICgxIDw8IDE2KQorICAvLyAgICAgIEsxID0gODUyNjcgID0+ICBrMSA9ICAyMDA5MQorICAvLyAgICAgIEsyID0gMzU0NjggID0+ICBrMiA9IC0zMDA2OAorICAvLyAtIFRoZSBtdWx0aXBsaWNhdGlvbiBvZiBhIHZhcmlhYmxlIGJ5IGEgY29uc3RhbnQgYmVjb21lIHRoZSBzdW0gb2YgdGhlCisgIC8vICAgdmFyaWFibGUgYW5kIHRoZSBtdWx0aXBsaWNhdGlvbiBvZiB0aGF0IHZhcmlhYmxlIGJ5IHRoZSBhc3NvY2lhdGVkCisgIC8vICAgY29uc3RhbnQ6CisgIC8vICAgICAgKHggKiBLKSA+PiAxNiA9ICh4ICogKGsgKyAoMSA8PCAxNikpKSA+PiAxNiA9ICgoeCAqIGsgKSA+PiAxNikgKyB4CisgIGNvbnN0IF9fbTEyOGkgazEgPSBfbW1fc2V0MV9lcGkxNigyMDA5MSk7CisgIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigtMzAwNjgpOworICBfX20xMjhpIFQwLCBUMSwgVDIsIFQzOworCisgIC8vIExvYWQgYW5kIGNvbmNhdGVuYXRlIHRoZSB0cmFuc2Zvcm0gY29lZmZpY2llbnRzICh3ZSdsbCBkbyB0d28gdHJhbnNmb3JtcworICAvLyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIHRyYW5zZm9ybSwgdGhlIHNlY29uZCBoYWxmIG9mIHRoZQorICAvLyB2ZWN0b3JzIHdpbGwganVzdCBjb250YWluIHJhbmRvbSB2YWx1ZSB3ZSdsbCBuZXZlciB1c2Ugbm9yIHN0b3JlLgorICBfX20xMjhpIGluMCwgaW4xLCBpbjIsIGluMzsKKyAgeworICAgIGluMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzBdKTsKKyAgICBpbjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls0XSk7CisgICAgaW4yID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bOF0pOworICAgIGluMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzEyXSk7CisgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgeCB4IHggeAorICAgIC8vIGEwMSBhMTEgYTIxIGEzMSAgIHggeCB4IHgKKyAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICB4IHggeCB4CisgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgeCB4IHggeAorICAgIGlmIChkb190d28pIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjRdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzI4XSk7CisgICAgICBpbjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4wLCBpbkIwKTsKKyAgICAgIGluMSA9IF9tbV91bnBhY2tsb19lcGk2NChpbjEsIGluQjEpOworICAgICAgaW4yID0gX21tX3VucGFja2xvX2VwaTY0KGluMiwgaW5CMik7CisgICAgICBpbjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4zLCBpbkIzKTsKKyAgICAgIC8vIGEwMCBhMTAgYTIwIGEzMCAgIGIwMCBiMTAgYjIwIGIzMAorICAgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgYjAxIGIxMSBiMjEgYjMxCisgICAgICAvLyBhMDIgYTEyIGEyMiBhMzIgICBiMDIgYjEyIGIyMiBiMzIKKyAgICAgIC8vIGEwMyBhMTMgYTIzIGEzMyAgIGIwMyBiMTMgYjIzIGIzMworICAgIH0KKyAgfQorCisgIC8vIFZlcnRpY2FsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hZGRfZXBpMTYoaW4wLCBpbjIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJfZXBpMTYoaW4wLCBpbjIpOworICAgIC8vIGMgPSBNVUwoaW4xLCBLMikgLSBNVUwoaW4zLCBLMSkgPSBNVUwoaW4xLCBrMikgLSBNVUwoaW4zLCBrMSkgKyBpbjEgLSBpbjMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KGluMSwgazIpOworICAgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc3ViX2VwaTE2KGMxLCBjMik7CisgICAgY29uc3QgX19tMTI4aSBjID0gX21tX2FkZF9lcGkxNihjMywgYzQpOworICAgIC8vIGQgPSBNVUwoaW4xLCBLMSkgKyBNVUwoaW4zLCBLMikgPSBNVUwoaW4xLCBrMSkgKyBNVUwoaW4zLCBrMikgKyBpbjEgKyBpbjMKKyAgICBjb25zdCBfX20xMjhpIGQxID0gX21tX211bGhpX2VwaTE2KGluMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoaW4zLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoaW4xLCBpbjMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKworICAgIC8vIFRyYW5zcG9zZSB0aGUgdHdvIDR4NC4KKyAgICBWUDhUcmFuc3Bvc2VfMl80eDRfMTZiKCZ0bXAwLCAmdG1wMSwgJnRtcDIsICZ0bXAzLCAmVDAsICZUMSwgJlQyLCAmVDMpOworICB9CisKKyAgLy8gSG9yaXpvbnRhbCBwYXNzIGFuZCBzdWJzZXF1ZW50IHRyYW5zcG9zZS4KKyAgeworICAgIC8vIEZpcnN0IHBhc3MsIGMgYW5kIGQgY2FsY3VsYXRpb25zIGFyZSBsb25nZXIgYmVjYXVzZSBvZiB0aGUgInRyaWNrIgorICAgIC8vIG11bHRpcGxpY2F0aW9ucy4KKyAgICBjb25zdCBfX20xMjhpIGZvdXIgPSBfbW1fc2V0MV9lcGkxNig0KTsKKyAgICBjb25zdCBfX20xMjhpIGRjID0gX21tX2FkZF9lcGkxNihUMCwgZm91cik7CisgICAgY29uc3QgX19tMTI4aSBhID0gIF9tbV9hZGRfZXBpMTYoZGMsIFQyKTsKKyAgICBjb25zdCBfX20xMjhpIGIgPSAgX21tX3N1Yl9lcGkxNihkYywgVDIpOworICAgIC8vIGMgPSBNVUwoVDEsIEsyKSAtIE1VTChUMywgSzEpID0gTVVMKFQxLCBrMikgLSBNVUwoVDMsIGsxKSArIFQxIC0gVDMKKyAgICBjb25zdCBfX20xMjhpIGMxID0gX21tX211bGhpX2VwaTE2KFQxLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihUMywgazEpOworICAgIGNvbnN0IF9fbTEyOGkgYzMgPSBfbW1fc3ViX2VwaTE2KFQxLCBUMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChUMSwgSzEpICsgTVVMKFQzLCBLMikgPSBNVUwoVDEsIGsxKSArIE1VTChUMywgazIpICsgVDEgKyBUMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBkMyA9IF9tbV9hZGRfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX2FkZF9lcGkxNihkMSwgZDIpOworICAgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9hZGRfZXBpMTYoZDMsIGQ0KTsKKworICAgIC8vIFNlY29uZCBwYXNzLgorICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9hZGRfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FkZF9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1fc3ViX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9zdWJfZXBpMTYoYSwgZCk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMCA9IF9tbV9zcmFpX2VwaTE2KHRtcDAsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDEgPSBfbW1fc3JhaV9lcGkxNih0bXAxLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQyID0gX21tX3NyYWlfZXBpMTYodG1wMiwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMyA9IF9tbV9zcmFpX2VwaTE2KHRtcDMsIDMpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnNoaWZ0ZWQwLCAmc2hpZnRlZDEsICZzaGlmdGVkMiwgJnNoaWZ0ZWQzLCAmVDAsICZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZUMiwgJlQzKTsKKyAgfQorCisgIC8vIEFkZCBpbnZlcnNlIHRyYW5zZm9ybSB0byAnZHN0JyBhbmQgc3RvcmUuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIC8vIExvYWQgdGhlIHJlZmVyZW5jZShzKS4KKyAgICBfX20xMjhpIGRzdDAsIGRzdDEsIGRzdDIsIGRzdDM7CisgICAgaWYgKGRvX3R3bykgeworICAgICAgLy8gTG9hZCBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBkc3QwID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMCAqIEJQUykpOworICAgICAgZHN0MSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDEgKiBCUFMpKTsKKyAgICAgIGRzdDIgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAyICogQlBTKSk7CisgICAgICBkc3QzID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMyAqIEJQUykpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgZHN0MCA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAwICogQlBTKSk7CisgICAgICBkc3QxID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCArIDEgKiBCUFMpKTsKKyAgICAgIGRzdDIgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoZHN0ICsgMiAqIEJQUykpOworICAgICAgZHN0MyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAzICogQlBTKSk7CisgICAgfQorICAgIC8vIENvbnZlcnQgdG8gMTZiLgorICAgIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QwLCB6ZXJvKTsKKyAgICBkc3QxID0gX21tX3VucGFja2xvX2VwaTgoZHN0MSwgemVybyk7CisgICAgZHN0MiA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDIsIHplcm8pOworICAgIGRzdDMgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QzLCB6ZXJvKTsKKyAgICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtKHMpLgorICAgIGRzdDAgPSBfbW1fYWRkX2VwaTE2KGRzdDAsIFQwKTsKKyAgICBkc3QxID0gX21tX2FkZF9lcGkxNihkc3QxLCBUMSk7CisgICAgZHN0MiA9IF9tbV9hZGRfZXBpMTYoZHN0MiwgVDIpOworICAgIGRzdDMgPSBfbW1fYWRkX2VwaTE2KGRzdDMsIFQzKTsKKyAgICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgICBkc3QwID0gX21tX3BhY2t1c19lcGkxNihkc3QwLCBkc3QwKTsKKyAgICBkc3QxID0gX21tX3BhY2t1c19lcGkxNihkc3QxLCBkc3QxKTsKKyAgICBkc3QyID0gX21tX3BhY2t1c19lcGkxNihkc3QyLCBkc3QyKTsKKyAgICBkc3QzID0gX21tX3BhY2t1c19lcGkxNihkc3QzLCBkc3QzKTsKKyAgICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICAvLyBTdG9yZSBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMCAqIEJQUyksIGRzdDApOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIDEgKiBCUFMpLCBkc3QxKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAyICogQlBTKSwgZHN0Mik7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgMyAqIEJQUyksIGRzdDMpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTdG9yZSBmb3VyIGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QwKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MSkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKGRzdDIpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihkc3QzKSk7CisgICAgfQorICB9Cit9CisKKyNpZiAoVVNFX1RSQU5TRk9STV9BQzMgPT0gMSkKKyNkZWZpbmUgTVVMKGEsIGIpICgoKGEpICogKGIpKSA+PiAxNikKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUFDMyhjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0KSB7CisgIHN0YXRpYyBjb25zdCBpbnQga0MxID0gMjAwOTEgKyAoMSA8PCAxNik7CisgIHN0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9zZXQxX2VwaTE2KGluWzBdICsgNCk7CisgIGNvbnN0IF9fbTEyOGkgYzQgPSBfbW1fc2V0MV9lcGkxNihNVUwoaW5bNF0sIGtDMikpOworICBjb25zdCBfX20xMjhpIGQ0ID0gX21tX3NldDFfZXBpMTYoTVVMKGluWzRdLCBrQzEpKTsKKyAgY29uc3QgaW50IGMxID0gTVVMKGluWzFdLCBrQzIpOworICBjb25zdCBpbnQgZDEgPSBNVUwoaW5bMV0sIGtDMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0QgPSBfbW1fc2V0X2VwaTE2KDAsIDAsIDAsIDAsIC1kMSwgLWMxLCBjMSwgZDEpOworICBjb25zdCBfX20xMjhpIEIgPSBfbW1fYWRkc19lcGkxNihBLCBDRCk7CisgIGNvbnN0IF9fbTEyOGkgbTAgPSBfbW1fYWRkc19lcGkxNihCLCBkNCk7CisgIGNvbnN0IF9fbTEyOGkgbTEgPSBfbW1fYWRkc19lcGkxNihCLCBjNCk7CisgIGNvbnN0IF9fbTEyOGkgbTIgPSBfbW1fc3Vic19lcGkxNihCLCBjNCk7CisgIGNvbnN0IF9fbTEyOGkgbTMgPSBfbW1fc3Vic19lcGkxNihCLCBkNCk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIC8vIExvYWQgdGhlIHNvdXJjZSBwaXhlbHMuCisgIF9fbTEyOGkgZHN0MCA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAwICogQlBTKSk7CisgIF9fbTEyOGkgZHN0MSA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAxICogQlBTKSk7CisgIF9fbTEyOGkgZHN0MiA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAyICogQlBTKSk7CisgIF9fbTEyOGkgZHN0MyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMihkc3QgKyAzICogQlBTKSk7CisgIC8vIENvbnZlcnQgdG8gMTZiLgorICBkc3QwID0gX21tX3VucGFja2xvX2VwaTgoZHN0MCwgemVybyk7CisgIGRzdDEgPSBfbW1fdW5wYWNrbG9fZXBpOChkc3QxLCB6ZXJvKTsKKyAgZHN0MiA9IF9tbV91bnBhY2tsb19lcGk4KGRzdDIsIHplcm8pOworICBkc3QzID0gX21tX3VucGFja2xvX2VwaTgoZHN0MywgemVybyk7CisgIC8vIEFkZCB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0uCisgIGRzdDAgPSBfbW1fYWRkc19lcGkxNihkc3QwLCBfbW1fc3JhaV9lcGkxNihtMCwgMykpOworICBkc3QxID0gX21tX2FkZHNfZXBpMTYoZHN0MSwgX21tX3NyYWlfZXBpMTYobTEsIDMpKTsKKyAgZHN0MiA9IF9tbV9hZGRzX2VwaTE2KGRzdDIsIF9tbV9zcmFpX2VwaTE2KG0yLCAzKSk7CisgIGRzdDMgPSBfbW1fYWRkc19lcGkxNihkc3QzLCBfbW1fc3JhaV9lcGkxNihtMywgMykpOworICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgZHN0MCA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MCwgZHN0MCk7CisgIGRzdDEgPSBfbW1fcGFja3VzX2VwaTE2KGRzdDEsIGRzdDEpOworICBkc3QyID0gX21tX3BhY2t1c19lcGkxNihkc3QyLCBkc3QyKTsKKyAgZHN0MyA9IF9tbV9wYWNrdXNfZXBpMTYoZHN0MywgZHN0Myk7CisgIC8vIFN0b3JlIHRoZSByZXN1bHRzLgorICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MikpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoZHN0MykpOworfQorI3VuZGVmIE1VTAorI2VuZGlmICAgLy8gVVNFX1RSQU5TRk9STV9BQzMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExvb3AgRmlsdGVyIChQYXJhZ3JhcGggMTUpCisKKy8vIENvbXB1dGUgYWJzKHAgLSBxKSA9IHN1YnMocCAtIHEpIE9SIHN1YnMocSAtIHApCisjZGVmaW5lIE1NX0FCUyhwLCBxKSAgX21tX29yX3NpMTI4KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdWJzX2VwdTgoKHEpLCAocCkpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3Vic19lcHU4KChwKSwgKHEpKSkKKworLy8gU2hpZnQgZWFjaCBieXRlIG9mICJ4IiBieSAzIGJpdHMgd2hpbGUgcHJlc2VydmluZyBieSB0aGUgc2lnbiBiaXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTaWduZWRTaGlmdDhiX1NTRTIoX19tMTI4aSogY29uc3QgeCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIGxvXzAgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCAqeCk7CisgIGNvbnN0IF9fbTEyOGkgaGlfMCA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sICp4KTsKKyAgY29uc3QgX19tMTI4aSBsb18xID0gX21tX3NyYWlfZXBpMTYobG9fMCwgMyArIDgpOworICBjb25zdCBfX20xMjhpIGhpXzEgPSBfbW1fc3JhaV9lcGkxNihoaV8wLCAzICsgOCk7CisgICp4ID0gX21tX3BhY2tzX2VwaTE2KGxvXzEsIGhpXzEpOworfQorCisjZGVmaW5lIEZMSVBfU0lHTl9CSVQyKGEsIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoYSkgPSBfbW1feG9yX3NpMTI4KGEsIHNpZ25fYml0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGIpID0gX21tX3hvcl9zaTEyOChiLCBzaWduX2JpdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgRkxJUF9TSUdOX0JJVDQoYSwgYiwgYywgZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZMSVBfU0lHTl9CSVQyKGEsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGTElQX1NJR05fQklUMihjLCBkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gaW5wdXQvb3V0cHV0IGlzIHVpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldE5vdEhFVl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gsIF9fbTEyOGkqIGNvbnN0IG5vdF9oZXYpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0XzEgPSBNTV9BQlMoKnAxLCAqcDApOworICBjb25zdCBfX20xMjhpIHRfMiA9IE1NX0FCUygqcTEsICpxMCk7CisKKyAgY29uc3QgX19tMTI4aSBoID0gX21tX3NldDFfZXBpOChoZXZfdGhyZXNoKTsKKyAgY29uc3QgX19tMTI4aSB0X21heCA9IF9tbV9tYXhfZXB1OCh0XzEsIHRfMik7CisKKyAgY29uc3QgX19tMTI4aSB0X21heF9oID0gX21tX3N1YnNfZXB1OCh0X21heCwgaCk7CisgICpub3RfaGV2ID0gX21tX2NtcGVxX2VwaTgodF9tYXhfaCwgemVybyk7ICAvLyBub3RfaGV2IDw9IHQxICYmIG5vdF9oZXYgPD0gdDIKK30KKworLy8gaW5wdXQgcGl4ZWxzIGFyZSBpbnQ4X3QKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldEJhc2VEZWx0YV9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgZGVsdGEpIHsKKyAgLy8gYmV3YXJlIG9mIGFkZGl0aW9uIG9yZGVyLCBmb3Igc2F0dXJhdGlvbiEKKyAgY29uc3QgX19tMTI4aSBwMV9xMSA9IF9tbV9zdWJzX2VwaTgoKnAxLCAqcTEpOyAgIC8vIHAxIC0gcTEKKyAgY29uc3QgX19tMTI4aSBxMF9wMCA9IF9tbV9zdWJzX2VwaTgoKnEwLCAqcDApOyAgIC8vIHEwIC0gcDAKKyAgY29uc3QgX19tMTI4aSBzMSA9IF9tbV9hZGRzX2VwaTgocDFfcTEsIHEwX3AwKTsgIC8vIHAxIC0gcTEgKyAxICogKHEwIC0gcDApCisgIGNvbnN0IF9fbTEyOGkgczIgPSBfbW1fYWRkc19lcGk4KHEwX3AwLCBzMSk7ICAgICAvLyBwMSAtIHExICsgMiAqIChxMCAtIHAwKQorICBjb25zdCBfX20xMjhpIHMzID0gX21tX2FkZHNfZXBpOChxMF9wMCwgczIpOyAgICAgLy8gcDEgLSBxMSArIDMgKiAocTAgLSBwMCkKKyAgKmRlbHRhID0gczM7Cit9CisKKy8vIGlucHV0IGFuZCBvdXRwdXQgYXJlIGludDhfdAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9TaW1wbGVGaWx0ZXJfU1NFMihfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IGZsKSB7CisgIGNvbnN0IF9fbTEyOGkgazMgPSBfbW1fc2V0MV9lcGk4KDMpOworICBjb25zdCBfX20xMjhpIGs0ID0gX21tX3NldDFfZXBpOCg0KTsKKyAgX19tMTI4aSB2MyA9IF9tbV9hZGRzX2VwaTgoKmZsLCBrMyk7CisgIF9fbTEyOGkgdjQgPSBfbW1fYWRkc19lcGk4KCpmbCwgazQpOworCisgIFNpZ25lZFNoaWZ0OGJfU1NFMigmdjQpOyAgICAgICAgICAgICAvLyB2NCA+PiAzCisgIFNpZ25lZFNoaWZ0OGJfU1NFMigmdjMpOyAgICAgICAgICAgICAvLyB2MyA+PiAzCisgICpxMCA9IF9tbV9zdWJzX2VwaTgoKnEwLCB2NCk7ICAgICAgICAvLyBxMCAtPSB2NAorICAqcDAgPSBfbW1fYWRkc19lcGk4KCpwMCwgdjMpOyAgICAgICAgLy8gcDAgKz0gdjMKK30KKworLy8gVXBkYXRlcyB2YWx1ZXMgb2YgMiBwaXhlbHMgYXQgTUIgZWRnZSBkdXJpbmcgY29tcGxleCBmaWx0ZXJpbmcuCisvLyBVcGRhdGUgb3BlcmF0aW9uczoKKy8vIHEgPSBxIC0gZGVsdGEgYW5kIHAgPSBwICsgZGVsdGE7IHdoZXJlIGRlbHRhID0gWyhhX2hpID4+IDcpLCAoYV9sbyA+PiA3KV0KKy8vIFBpeGVscyAncGknIGFuZCAncWknIGFyZSBpbnQ4X3Qgb24gaW5wdXQsIHVpbnQ4X3Qgb24gb3V0cHV0IChzaWduIGZsaXApLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlMlBpeGVsc19TU0UyKF9fbTEyOGkqIGNvbnN0IHBpLCBfX20xMjhpKiBjb25zdCBxaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBhMF9sbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBhMF9oaSkgeworICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX3NyYWlfZXBpMTYoKmEwX2xvLCA3KTsKKyAgY29uc3QgX19tMTI4aSBhMV9oaSA9IF9tbV9zcmFpX2VwaTE2KCphMF9oaSwgNyk7CisgIGNvbnN0IF9fbTEyOGkgZGVsdGEgPSBfbW1fcGFja3NfZXBpMTYoYTFfbG8sIGExX2hpKTsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgICpwaSA9IF9tbV9hZGRzX2VwaTgoKnBpLCBkZWx0YSk7CisgICpxaSA9IF9tbV9zdWJzX2VwaTgoKnFpLCBkZWx0YSk7CisgIEZMSVBfU0lHTl9CSVQyKCpwaSwgKnFpKTsKK30KKworLy8gaW5wdXQgcGl4ZWxzIGFyZSB1aW50OF90CitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBOZWVkc0ZpbHRlcl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBfX20xMjhpKiBjb25zdCBtYXNrKSB7CisgIGNvbnN0IF9fbTEyOGkgbV90aHJlc2ggPSBfbW1fc2V0MV9lcGk4KHRocmVzaCk7CisgIGNvbnN0IF9fbTEyOGkgdDEgPSBNTV9BQlMoKnAxLCAqcTEpOyAgICAgICAgLy8gYWJzKHAxIC0gcTEpCisgIGNvbnN0IF9fbTEyOGkga0ZFID0gX21tX3NldDFfZXBpOCgweEZFKTsKKyAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9hbmRfc2kxMjgodDEsIGtGRSk7ICAvLyBzZXQgbHNiIG9mIGVhY2ggYnl0ZSB0byB6ZXJvCisgIGNvbnN0IF9fbTEyOGkgdDMgPSBfbW1fc3JsaV9lcGkxNih0MiwgMSk7ICAgLy8gYWJzKHAxIC0gcTEpIC8gMgorCisgIGNvbnN0IF9fbTEyOGkgdDQgPSBNTV9BQlMoKnAwLCAqcTApOyAgICAgICAgLy8gYWJzKHAwIC0gcTApCisgIGNvbnN0IF9fbTEyOGkgdDUgPSBfbW1fYWRkc19lcHU4KHQ0LCB0NCk7ICAgLy8gYWJzKHAwIC0gcTApICogMgorICBjb25zdCBfX20xMjhpIHQ2ID0gX21tX2FkZHNfZXB1OCh0NSwgdDMpOyAgIC8vIGFicyhwMC1xMCkqMiArIGFicyhwMS1xMSkvMgorCisgIGNvbnN0IF9fbTEyOGkgdDcgPSBfbW1fc3Vic19lcHU4KHQ2LCBtX3RocmVzaCk7ICAvLyBtYXNrIDw9IG1fdGhyZXNoCisgICptYXNrID0gX21tX2NtcGVxX2VwaTgodDcsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRWRnZSBmaWx0ZXJpbmcgZnVuY3Rpb25zCisKKy8vIEFwcGxpZXMgZmlsdGVyIG9uIDIgcGl4ZWxzIChwMCBhbmQgcTApCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjJfU1NFMihfX20xMjhpKiBjb25zdCBwMSwgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMCwgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoKSB7CisgIF9fbTEyOGkgYSwgbWFzazsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgIC8vIGNvbnZlcnQgcDEvcTEgdG8gaW50OF90IChmb3IgR2V0QmFzZURlbHRhX1NTRTIpCisgIGNvbnN0IF9fbTEyOGkgcDFzID0gX21tX3hvcl9zaTEyOCgqcDEsIHNpZ25fYml0KTsKKyAgY29uc3QgX19tMTI4aSBxMXMgPSBfbW1feG9yX3NpMTI4KCpxMSwgc2lnbl9iaXQpOworCisgIE5lZWRzRmlsdGVyX1NTRTIocDEsIHAwLCBxMCwgcTEsIHRocmVzaCwgJm1hc2spOworCisgIEZMSVBfU0lHTl9CSVQyKCpwMCwgKnEwKTsKKyAgR2V0QmFzZURlbHRhX1NTRTIoJnAxcywgcDAsIHEwLCAmcTFzLCAmYSk7CisgIGEgPSBfbW1fYW5kX3NpMTI4KGEsIG1hc2spOyAgICAgLy8gbWFzayBmaWx0ZXIgdmFsdWVzIHdlIGRvbid0IGNhcmUgYWJvdXQKKyAgRG9TaW1wbGVGaWx0ZXJfU1NFMihwMCwgcTAsICZhKTsKKyAgRkxJUF9TSUdOX0JJVDIoKnAwLCAqcTApOworfQorCisvLyBBcHBsaWVzIGZpbHRlciBvbiA0IHBpeGVscyAocDEsIHAwLCBxMCBhbmQgcTEpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjRfU1NFMihfX20xMjhpKiBjb25zdCBwMSwgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMCwgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgIGNvbnN0IF9fbTEyOGkgazY0ID0gX21tX3NldDFfZXBpOCg2NCk7CisgIGNvbnN0IF9fbTEyOGkgazMgPSBfbW1fc2V0MV9lcGk4KDMpOworICBjb25zdCBfX20xMjhpIGs0ID0gX21tX3NldDFfZXBpOCg0KTsKKyAgX19tMTI4aSBub3RfaGV2OworICBfX20xMjhpIHQxLCB0MiwgdDM7CisKKyAgLy8gY29tcHV0ZSBoZXYgbWFzaworICBHZXROb3RIRVZfU1NFMihwMSwgcDAsIHEwLCBxMSwgaGV2X3RocmVzaCwgJm5vdF9oZXYpOworCisgIC8vIGNvbnZlcnQgdG8gc2lnbmVkIHZhbHVlcworICBGTElQX1NJR05fQklUNCgqcDEsICpwMCwgKnEwLCAqcTEpOworCisgIHQxID0gX21tX3N1YnNfZXBpOCgqcDEsICpxMSk7ICAgICAgICAvLyBwMSAtIHExCisgIHQxID0gX21tX2FuZG5vdF9zaTEyOChub3RfaGV2LCB0MSk7ICAvLyBoZXYocDEgLSBxMSkKKyAgdDIgPSBfbW1fc3Vic19lcGk4KCpxMCwgKnAwKTsgICAgICAgIC8vIHEwIC0gcDAKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDEgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDIgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYWRkc19lcGk4KHQxLCB0Mik7ICAgICAgICAgIC8vIGhldihwMSAtIHExKSArIDMgKiAocTAgLSBwMCkKKyAgdDEgPSBfbW1fYW5kX3NpMTI4KHQxLCAqbWFzayk7ICAgICAgIC8vIG1hc2sgZmlsdGVyIHZhbHVlcyB3ZSBkb24ndCBjYXJlIGFib3V0CisKKyAgdDIgPSBfbW1fYWRkc19lcGk4KHQxLCBrMyk7ICAgICAgICAvLyAzICogKHEwIC0gcDApICsgaGV2KHAxIC0gcTEpICsgMworICB0MyA9IF9tbV9hZGRzX2VwaTgodDEsIGs0KTsgICAgICAgIC8vIDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0CisgIFNpZ25lZFNoaWZ0OGJfU1NFMigmdDIpOyAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyAzKSA+PiAzCisgIFNpZ25lZFNoaWZ0OGJfU1NFMigmdDMpOyAgICAgICAgICAgLy8gKDMgKiAocTAgLSBwMCkgKyBoZXYocDEgLSBxMSkgKyA0KSA+PiAzCisgICpwMCA9IF9tbV9hZGRzX2VwaTgoKnAwLCB0Mik7ICAgICAgLy8gcDAgKz0gdDIKKyAgKnEwID0gX21tX3N1YnNfZXBpOCgqcTAsIHQzKTsgICAgICAvLyBxMCAtPSB0MworICBGTElQX1NJR05fQklUMigqcDAsICpxMCk7CisKKyAgLy8gdGhpcyBpcyBlcXVpdmFsZW50IHRvIHNpZ25lZCAoYSArIDEpID4+IDEgY2FsY3VsYXRpb24KKyAgdDIgPSBfbW1fYWRkX2VwaTgodDMsIHNpZ25fYml0KTsKKyAgdDMgPSBfbW1fYXZnX2VwdTgodDIsIHplcm8pOworICB0MyA9IF9tbV9zdWJfZXBpOCh0MywgazY0KTsKKworICB0MyA9IF9tbV9hbmRfc2kxMjgobm90X2hldiwgdDMpOyAgIC8vIGlmICFoZXYKKyAgKnExID0gX21tX3N1YnNfZXBpOCgqcTEsIHQzKTsgICAgICAvLyBxMSAtPSB0MworICAqcDEgPSBfbW1fYWRkc19lcGk4KCpwMSwgdDMpOyAgICAgIC8vIHAxICs9IHQzCisgIEZMSVBfU0lHTl9CSVQyKCpwMSwgKnExKTsKK30KKworLy8gQXBwbGllcyBmaWx0ZXIgb24gNiBwaXhlbHMgKHAyLCBwMSwgcDAsIHEwLCBxMSBhbmQgcTIpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb0ZpbHRlcjZfU1NFMihfX20xMjhpKiBjb25zdCBwMiwgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBwMCwgX19tMTI4aSogY29uc3QgcTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBxMSwgX19tMTI4aSogY29uc3QgcTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBtYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhldl90aHJlc2gpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzaWduX2JpdCA9IF9tbV9zZXQxX2VwaTgoMHg4MCk7CisgIF9fbTEyOGkgYSwgbm90X2hldjsKKworICAvLyBjb21wdXRlIGhldiBtYXNrCisgIEdldE5vdEhFVl9TU0UyKHAxLCBwMCwgcTAsIHExLCBoZXZfdGhyZXNoLCAmbm90X2hldik7CisKKyAgRkxJUF9TSUdOX0JJVDQoKnAxLCAqcDAsICpxMCwgKnExKTsKKyAgRkxJUF9TSUdOX0JJVDIoKnAyLCAqcTIpOworICBHZXRCYXNlRGVsdGFfU1NFMihwMSwgcDAsIHEwLCBxMSwgJmEpOworCisgIHsgLy8gZG8gc2ltcGxlIGZpbHRlciBvbiBwaXhlbHMgd2l0aCBoZXYKKyAgICBjb25zdCBfX20xMjhpIG0gPSBfbW1fYW5kbm90X3NpMTI4KG5vdF9oZXYsICptYXNrKTsKKyAgICBjb25zdCBfX20xMjhpIGYgPSBfbW1fYW5kX3NpMTI4KGEsIG0pOworICAgIERvU2ltcGxlRmlsdGVyX1NTRTIocDAsIHEwLCAmZik7CisgIH0KKworICB7IC8vIGRvIHN0cm9uZyBmaWx0ZXIgb24gcGl4ZWxzIHdpdGggbm90IGhldgorICAgIGNvbnN0IF9fbTEyOGkgazkgPSBfbW1fc2V0MV9lcGkxNigweDA5MDApOworICAgIGNvbnN0IF9fbTEyOGkgazYzID0gX21tX3NldDFfZXBpMTYoNjMpOworCisgICAgY29uc3QgX19tMTI4aSBtID0gX21tX2FuZF9zaTEyOChub3RfaGV2LCAqbWFzayk7CisgICAgY29uc3QgX19tMTI4aSBmID0gX21tX2FuZF9zaTEyOChhLCBtKTsKKworICAgIGNvbnN0IF9fbTEyOGkgZl9sbyA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIGYpOworICAgIGNvbnN0IF9fbTEyOGkgZl9oaSA9IF9tbV91bnBhY2toaV9lcGk4KHplcm8sIGYpOworCisgICAgY29uc3QgX19tMTI4aSBmOV9sbyA9IF9tbV9tdWxoaV9lcGkxNihmX2xvLCBrOSk7ICAgIC8vIEZpbHRlciAobG8pICogOQorICAgIGNvbnN0IF9fbTEyOGkgZjlfaGkgPSBfbW1fbXVsaGlfZXBpMTYoZl9oaSwgazkpOyAgICAvLyBGaWx0ZXIgKGhpKSAqIDkKKworICAgIGNvbnN0IF9fbTEyOGkgYTJfbG8gPSBfbW1fYWRkX2VwaTE2KGY5X2xvLCBrNjMpOyAgICAvLyBGaWx0ZXIgKiA5ICsgNjMKKyAgICBjb25zdCBfX20xMjhpIGEyX2hpID0gX21tX2FkZF9lcGkxNihmOV9oaSwgazYzKTsgICAgLy8gRmlsdGVyICogOSArIDYzCisKKyAgICBjb25zdCBfX20xMjhpIGExX2xvID0gX21tX2FkZF9lcGkxNihhMl9sbywgZjlfbG8pOyAgLy8gRmlsdGVyICogMTggKyA2MworICAgIGNvbnN0IF9fbTEyOGkgYTFfaGkgPSBfbW1fYWRkX2VwaTE2KGEyX2hpLCBmOV9oaSk7ICAvLyBGaWx0ZXIgKiAxOCArIDYzCisKKyAgICBjb25zdCBfX20xMjhpIGEwX2xvID0gX21tX2FkZF9lcGkxNihhMV9sbywgZjlfbG8pOyAgLy8gRmlsdGVyICogMjcgKyA2MworICAgIGNvbnN0IF9fbTEyOGkgYTBfaGkgPSBfbW1fYWRkX2VwaTE2KGExX2hpLCBmOV9oaSk7ICAvLyBGaWx0ZXIgKiAyNyArIDYzCisKKyAgICBVcGRhdGUyUGl4ZWxzX1NTRTIocDIsIHEyLCAmYTJfbG8sICZhMl9oaSk7CisgICAgVXBkYXRlMlBpeGVsc19TU0UyKHAxLCBxMSwgJmExX2xvLCAmYTFfaGkpOworICAgIFVwZGF0ZTJQaXhlbHNfU1NFMihwMCwgcTAsICZhMF9sbywgJmEwX2hpKTsKKyAgfQorfQorCisvLyByZWFkcyA4IHJvd3MgYWNyb3NzIGEgdmVydGljYWwgZWRnZS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWQ4eDRfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHAsIF9fbTEyOGkqIGNvbnN0IHEpIHsKKyAgLy8gQTAgPSA2MyA2MiA2MSA2MCAyMyAyMiAyMSAyMCA0MyA0MiA0MSA0MCAwMyAwMiAwMSAwMAorICAvLyBBMSA9IDczIDcyIDcxIDcwIDMzIDMyIDMxIDMwIDUzIDUyIDUxIDUwIDEzIDEyIDExIDEwCisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc2V0X2VwaTMyKAorICAgICAgV2ViUE1lbVRvVWludDMyKCZiWzYgKiBzdHJpZGVdKSwgV2ViUE1lbVRvVWludDMyKCZiWzIgKiBzdHJpZGVdKSwKKyAgICAgIFdlYlBNZW1Ub1VpbnQzMigmYls0ICogc3RyaWRlXSksIFdlYlBNZW1Ub1VpbnQzMigmYlswICogc3RyaWRlXSkpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3NldF9lcGkzMigKKyAgICAgIFdlYlBNZW1Ub1VpbnQzMigmYls3ICogc3RyaWRlXSksIFdlYlBNZW1Ub1VpbnQzMigmYlszICogc3RyaWRlXSksCisgICAgICBXZWJQTWVtVG9VaW50MzIoJmJbNSAqIHN0cmlkZV0pLCBXZWJQTWVtVG9VaW50MzIoJmJbMSAqIHN0cmlkZV0pKTsKKworICAvLyBCMCA9IDUzIDQzIDUyIDQyIDUxIDQxIDUwIDQwIDEzIDAzIDEyIDAyIDExIDAxIDEwIDAwCisgIC8vIEIxID0gNzMgNjMgNzIgNjIgNzEgNjEgNzAgNjAgMzMgMjMgMzIgMjIgMzEgMjEgMzAgMjAKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGk4KEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNraGlfZXBpOChBMCwgQTEpOworCisgIC8vIEMwID0gMzMgMjMgMTMgMDMgMzIgMjIgMTIgMDIgMzEgMjEgMTEgMDEgMzAgMjAgMTAgMDAKKyAgLy8gQzEgPSA3MyA2MyA1MyA0MyA3MiA2MiA1MiA0MiA3MSA2MSA1MSA0MSA3MCA2MCA1MCA0MAorICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTE2KEIwLCBCMSk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNraGlfZXBpMTYoQjAsIEIxKTsKKworICAvLyAqcCA9IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxIDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCisgIC8vICpxID0gNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgKnAgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQzAsIEMxKTsKKyAgKnEgPSBfbW1fdW5wYWNraGlfZXBpMzIoQzAsIEMxKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTG9hZDE2eDRfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCByMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IHAxLCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcTAsIF9fbTEyOGkqIGNvbnN0IHExKSB7CisgIC8vIEFzc3VtZSB0aGUgcGl4ZWxzIGFyb3VuZCB0aGUgZWRnZSAofCkgYXJlIG51bWJlcmVkIGFzIGZvbGxvd3MKKyAgLy8gICAgICAgICAgICAgICAgMDAgMDEgfCAwMiAwMworICAvLyAgICAgICAgICAgICAgICAxMCAxMSB8IDEyIDEzCisgIC8vICAgICAgICAgICAgICAgICAuLi4gIHwgIC4uLgorICAvLyAgICAgICAgICAgICAgICBlMCBlMSB8IGUyIGUzCisgIC8vICAgICAgICAgICAgICAgIGYwIGYxIHwgZjIgZjMKKyAgLy8KKyAgLy8gcjAgaXMgcG9pbnRpbmcgdG8gdGhlIDB0aCByb3cgKDAwKQorICAvLyByOCBpcyBwb2ludGluZyB0byB0aGUgOHRoIHJvdyAoODApCisKKyAgLy8gTG9hZAorICAvLyBwMSA9IDcxIDYxIDUxIDQxIDMxIDIxIDExIDAxIDcwIDYwIDUwIDQwIDMwIDIwIDEwIDAwCisgIC8vIHEwID0gNzMgNjMgNTMgNDMgMzMgMjMgMTMgMDMgNzIgNjIgNTIgNDIgMzIgMjIgMTIgMDIKKyAgLy8gcDAgPSBmMSBlMSBkMSBjMSBiMSBhMSA5MSA4MSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MAorICAvLyBxMSA9IGYzIGUzIGQzIGMzIGIzIGEzIDkzIDgzIGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyCisgIExvYWQ4eDRfU1NFMihyMCwgc3RyaWRlLCBwMSwgcTApOworICBMb2FkOHg0X1NTRTIocjgsIHN0cmlkZSwgcDAsIHExKTsKKworICB7CisgICAgLy8gcDEgPSBmMCBlMCBkMCBjMCBiMCBhMCA5MCA4MCA3MCA2MCA1MCA0MCAzMCAyMCAxMCAwMAorICAgIC8vIHAwID0gZjEgZTEgZDEgYzEgYjEgYTEgOTEgODEgNzEgNjEgNTEgNDEgMzEgMjEgMTEgMDEKKyAgICAvLyBxMCA9IGYyIGUyIGQyIGMyIGIyIGEyIDkyIDgyIDcyIDYyIDUyIDQyIDMyIDIyIDEyIDAyCisgICAgLy8gcTEgPSBmMyBlMyBkMyBjMyBiMyBhMyA5MyA4MyA3MyA2MyA1MyA0MyAzMyAyMyAxMyAwMworICAgIGNvbnN0IF9fbTEyOGkgdDEgPSAqcDE7CisgICAgY29uc3QgX19tMTI4aSB0MiA9ICpxMDsKKyAgICAqcDEgPSBfbW1fdW5wYWNrbG9fZXBpNjQodDEsICpwMCk7CisgICAgKnAwID0gX21tX3VucGFja2hpX2VwaTY0KHQxLCAqcDApOworICAgICpxMCA9IF9tbV91bnBhY2tsb19lcGk2NCh0MiwgKnExKTsKKyAgICAqcTEgPSBfbW1fdW5wYWNraGlfZXBpNjQodDIsICpxMSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmU0eDRfU1NFMihfX20xMjhpKiBjb25zdCB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBzdHJpZGUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2ksIGRzdCArPSBzdHJpZGUpIHsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0LCBfbW1fY3Z0c2kxMjhfc2kzMigqeCkpOworICAgICp4ID0gX21tX3NybGlfc2kxMjgoKngsIDQpOworICB9Cit9CisKKy8vIFRyYW5zcG9zZSBiYWNrIGFuZCBzdG9yZQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3RvcmUxNng0X1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByMCwgdWludDhfdCogcjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlKSB7CisgIF9fbTEyOGkgdDEsIHAxX3MsIHAwX3MsIHEwX3MsIHExX3M7CisKKyAgLy8gcDAgPSA3MSA3MCA2MSA2MCA1MSA1MCA0MSA0MCAzMSAzMCAyMSAyMCAxMSAxMCAwMSAwMAorICAvLyBwMSA9IGYxIGYwIGUxIGUwIGQxIGQwIGMxIGMwIGIxIGIwIGExIGEwIDkxIDkwIDgxIDgwCisgIHQxID0gKnAwOworICBwMF9zID0gX21tX3VucGFja2xvX2VwaTgoKnAxLCB0MSk7CisgIHAxX3MgPSBfbW1fdW5wYWNraGlfZXBpOCgqcDEsIHQxKTsKKworICAvLyBxMCA9IDczIDcyIDYzIDYyIDUzIDUyIDQzIDQyIDMzIDMyIDIzIDIyIDEzIDEyIDAzIDAyCisgIC8vIHExID0gZjMgZjIgZTMgZTIgZDMgZDIgYzMgYzIgYjMgYjIgYTMgYTIgOTMgOTIgODMgODIKKyAgdDEgPSAqcTA7CisgIHEwX3MgPSBfbW1fdW5wYWNrbG9fZXBpOCh0MSwgKnExKTsKKyAgcTFfcyA9IF9tbV91bnBhY2toaV9lcGk4KHQxLCAqcTEpOworCisgIC8vIHAwID0gMzMgMzIgMzEgMzAgMjMgMjIgMjEgMjAgMTMgMTIgMTEgMTAgMDMgMDIgMDEgMDAKKyAgLy8gcTAgPSA3MyA3MiA3MSA3MCA2MyA2MiA2MSA2MCA1MyA1MiA1MSA1MCA0MyA0MiA0MSA0MAorICB0MSA9IHAwX3M7CisgIHAwX3MgPSBfbW1fdW5wYWNrbG9fZXBpMTYodDEsIHEwX3MpOworICBxMF9zID0gX21tX3VucGFja2hpX2VwaTE2KHQxLCBxMF9zKTsKKworICAvLyBwMSA9IGIzIGIyIGIxIGIwIGEzIGEyIGExIGEwIDkzIDkyIDkxIDkwIDgzIDgyIDgxIDgwCisgIC8vIHExID0gZjMgZjIgZjEgZjAgZTMgZTIgZTEgZTAgZDMgZDIgZDEgZDAgYzMgYzIgYzEgYzAKKyAgdDEgPSBwMV9zOworICBwMV9zID0gX21tX3VucGFja2xvX2VwaTE2KHQxLCBxMV9zKTsKKyAgcTFfcyA9IF9tbV91bnBhY2toaV9lcGkxNih0MSwgcTFfcyk7CisKKyAgU3RvcmU0eDRfU1NFMigmcDBfcywgcjAsIHN0cmlkZSk7CisgIHIwICs9IDQgKiBzdHJpZGU7CisgIFN0b3JlNHg0X1NTRTIoJnEwX3MsIHIwLCBzdHJpZGUpOworCisgIFN0b3JlNHg0X1NTRTIoJnAxX3MsIHI4LCBzdHJpZGUpOworICByOCArPSA0ICogc3RyaWRlOworICBTdG9yZTR4NF9TU0UyKCZxMV9zLCByOCwgc3RyaWRlKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNpbXBsZSBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjIpCisKK3N0YXRpYyB2b2lkIFNpbXBsZVZGaWx0ZXIxNl9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgLy8gTG9hZAorICBfX20xMjhpIHAxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0pOworICBfX20xMjhpIHAwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmcFstc3RyaWRlXSk7CisgIF9fbTEyOGkgcTAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZwWzBdKTsKKyAgX19tMTI4aSBxMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnBbc3RyaWRlXSk7CisKKyAgRG9GaWx0ZXIyX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gpOworCisgIC8vIFN0b3JlCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy1zdHJpZGVdLCBwMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWzBdLCBxMCk7Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNl9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgX19tMTI4aSBwMSwgcDAsIHEwLCBxMTsKKworICBwIC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKKworICBMb2FkMTZ4NF9TU0UyKHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMSwgJnAwLCAmcTAsICZxMSk7CisgIERvRmlsdGVyMl9TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoKTsKKyAgU3RvcmUxNng0X1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCBwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgU2ltcGxlVkZpbHRlcjE2aV9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsIGludCB0aHJlc2gpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBwICs9IDQgKiBzdHJpZGU7CisgICAgU2ltcGxlVkZpbHRlcjE2X1NTRTIocCwgc3RyaWRlLCB0aHJlc2gpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNpbXBsZUhGaWx0ZXIxNmlfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLCBpbnQgdGhyZXNoKSB7CisgIGludCBrOworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgcCArPSA0OworICAgIFNpbXBsZUhGaWx0ZXIxNl9TU0UyKHAsIHN0cmlkZSwgdGhyZXNoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29tcGxleCBJbi1sb29wIGZpbHRlcmluZyAoUGFyYWdyYXBoIDE1LjMpCisKKyNkZWZpbmUgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IE1NX0FCUyhwMSwgcDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAzLCBwMikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMiwgcDEpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1BWF9ESUZGMihwMywgcDIsIHAxLCBwMCwgbSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAobSkgPSBfbW1fbWF4X2VwdTgobSwgTU1fQUJTKHAxLCBwMCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKG0pID0gX21tX21heF9lcHU4KG0sIE1NX0FCUyhwMywgcDIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChtKSA9IF9tbV9tYXhfZXB1OChtLCBNTV9BQlMocDIsIHAxKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgZTEsIGUyLCBlMywgZTQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGUxKSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVswICogKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChlMikgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSYocClbMSAqIChzdHJpZGUpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoZTMpID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmKHApWzIgKiAoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKGU0KSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJihwKVszICogKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgTE9BRFVWX0hfRURHRShwLCB1LCB2LCBzdHJpZGUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVSA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJih1KVsoc3RyaWRlKV0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSYodilbKHN0cmlkZSldKTsgICAgICAgICAgICAgICAgIFwKKyAgKHApID0gX21tX3VucGFja2xvX2VwaTY0KFUsIFYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIExPQURVVl9IX0VER0VTNCh1LCB2LCBzdHJpZGUsIGUxLCBlMiwgZTMsIGU0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGUxLCB1LCB2LCAwICogKHN0cmlkZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTE9BRFVWX0hfRURHRShlMiwgdSwgdiwgMSAqIChzdHJpZGUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExPQURVVl9IX0VER0UoZTMsIHUsIHYsIDIgKiAoc3RyaWRlKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMT0FEVVZfSF9FREdFKGU0LCB1LCB2LCAzICogKHN0cmlkZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBTVE9SRVVWKHAsIHUsIHYsIHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJih1KVsoc3RyaWRlKV0sIHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwKSA9IF9tbV9zcmxpX3NpMTI4KHAsIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmKHYpWyhzdHJpZGUpXSwgcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29tcGxleE1hc2tfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IHEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG1hc2spIHsKKyAgY29uc3QgX19tMTI4aSBpdCA9IF9tbV9zZXQxX2VwaTgoaXRocmVzaCk7CisgIGNvbnN0IF9fbTEyOGkgZGlmZiA9IF9tbV9zdWJzX2VwdTgoKm1hc2ssIGl0KTsKKyAgY29uc3QgX19tMTI4aSB0aHJlc2hfbWFzayA9IF9tbV9jbXBlcV9lcGk4KGRpZmYsIF9tbV9zZXR6ZXJvX3NpMTI4KCkpOworICBfX20xMjhpIGZpbHRlcl9tYXNrOworICBOZWVkc0ZpbHRlcl9TU0UyKHAxLCBwMCwgcTAsIHExLCB0aHJlc2gsICZmaWx0ZXJfbWFzayk7CisgICptYXNrID0gX21tX2FuZF9zaTEyOCh0aHJlc2hfbWFzaywgZmlsdGVyX21hc2spOworfQorCisvLyBvbiBtYWNyb2Jsb2NrIGVkZ2VzCitzdGF0aWMgdm9pZCBWRmlsdGVyMTZfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgdDE7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyOworCisgIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKKyAgTE9BRF9IX0VER0VTNChwIC0gNCAqIHN0cmlkZSwgc3RyaWRlLCB0MSwgcDIsIHAxLCBwMCk7CisgIE1BWF9ESUZGMSh0MSwgcDIsIHAxLCBwMCwgbWFzayk7CisKKyAgLy8gTG9hZCBxMCwgcTEsIHEyLCBxMworICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcTAsIHExLCBxMiwgdDEpOworICBNQVhfRElGRjIodDEsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI2X1NTRTIoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIC8vIFN0b3JlCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWy0zICogc3RyaWRlXSwgcDIpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFstMiAqIHN0cmlkZV0sIHAxKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbLTEgKiBzdHJpZGVdLCBwMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZwWyswICogc3RyaWRlXSwgcTApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmcFsrMSAqIHN0cmlkZV0sIHExKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnBbKzIgKiBzdHJpZGVdLCBxMik7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNl9TU0UyKHVpbnQ4X3QqIHAsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNoLCBpbnQgaXRocmVzaCwgaW50IGhldl90aHJlc2gpIHsKKyAgX19tMTI4aSBtYXNrOworICBfX20xMjhpIHAzLCBwMiwgcDEsIHAwLCBxMCwgcTEsIHEyLCBxMzsKKworICB1aW50OF90KiBjb25zdCBiID0gcCAtIDQ7CisgIExvYWQxNng0X1NTRTIoYiwgYiArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKKyAgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICBMb2FkMTZ4NF9TU0UyKHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZxMCwgJnExLCAmcTIsICZxMyk7CisgIE1BWF9ESUZGMihxMywgcTIsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjZfU1NFMigmcDIsICZwMSwgJnAwLCAmcTAsICZxMSwgJnEyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgU3RvcmUxNng0X1NTRTIoJnAzLCAmcDIsICZwMSwgJnAwLCBiLCBiICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKKyAgU3RvcmUxNng0X1NTRTIoJnEwLCAmcTEsICZxMiwgJnEzLCBwLCBwICsgOCAqIHN0cmlkZSwgc3RyaWRlKTsKK30KKworLy8gb24gdGhyZWUgaW5uZXIgZWRnZXMKK3N0YXRpYyB2b2lkIFZGaWx0ZXIxNmlfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMDsgICAvLyBsb29wIGludmFyaWFudHMKKworICBMT0FEX0hfRURHRVM0KHAsIHN0cmlkZSwgcDMsIHAyLCBwMSwgcDApOyAgLy8gcHJvbG9ndWUKKworICBmb3IgKGsgPSAzOyBrID4gMDsgLS1rKSB7CisgICAgX19tMTI4aSBtYXNrLCB0bXAxLCB0bXAyOworICAgIHVpbnQ4X3QqIGNvbnN0IGIgPSBwICsgMiAqIHN0cmlkZTsgICAvLyBiZWdpbm5pbmcgb2YgcDEKKyAgICBwICs9IDQgKiBzdHJpZGU7CisKKyAgICBNQVhfRElGRjEocDMsIHAyLCBwMSwgcDAsIG1hc2spOyAgIC8vIGNvbXB1dGUgcGFydGlhbCBtYXNrCisgICAgTE9BRF9IX0VER0VTNChwLCBzdHJpZGUsIHAzLCBwMiwgdG1wMSwgdG1wMik7CisgICAgTUFYX0RJRkYyKHAzLCBwMiwgdG1wMSwgdG1wMiwgbWFzayk7CisKKyAgICAvLyBwMyBhbmQgcDIgYXJlIG5vdCBqdXN0IHRlbXBvcmFyeSB2YXJpYWJsZXMgaGVyZTogdGhleSB3aWxsIGJlCisgICAgLy8gcmUtdXNlZCBmb3IgbmV4dCBzcGFuLiBBbmQgcTIvcTMgd2lsbCBiZWNvbWUgcDEvcDAgYWNjb3JkaW5nbHkuCisgICAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnAzLCAmcDIsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICAgIERvRmlsdGVyNF9TU0UyKCZwMSwgJnAwLCAmcDMsICZwMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgICAgLy8gU3RvcmUKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYlswICogc3RyaWRlXSwgcDEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZiWzEgKiBzdHJpZGVdLCBwMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmJbMiAqIHN0cmlkZV0sIHAzKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYlszICogc3RyaWRlXSwgcDIpOworCisgICAgLy8gcm90YXRlIHNhbXBsZXMKKyAgICBwMSA9IHRtcDE7CisgICAgcDAgPSB0bXAyOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXIxNmlfU1NFMih1aW50OF90KiBwLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBpbnQgazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMDsgICAvLyBsb29wIGludmFyaWFudHMKKworICBMb2FkMTZ4NF9TU0UyKHAsIHAgKyA4ICogc3RyaWRlLCBzdHJpZGUsICZwMywgJnAyLCAmcDEsICZwMCk7ICAvLyBwcm9sb2d1ZQorCisgIGZvciAoayA9IDM7IGsgPiAwOyAtLWspIHsKKyAgICBfX20xMjhpIG1hc2ssIHRtcDEsIHRtcDI7CisgICAgdWludDhfdCogY29uc3QgYiA9IHAgKyAyOyAgIC8vIGJlZ2lubmluZyBvZiBwMQorCisgICAgcCArPSA0OyAgLy8gYmVnaW5uaW5nIG9mIHEwIChhbmQgbmV4dCBzcGFuKQorCisgICAgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtYXNrKTsgICAvLyBjb21wdXRlIHBhcnRpYWwgbWFzaworICAgIExvYWQxNng0X1NTRTIocCwgcCArIDggKiBzdHJpZGUsIHN0cmlkZSwgJnAzLCAmcDIsICZ0bXAxLCAmdG1wMik7CisgICAgTUFYX0RJRkYyKHAzLCBwMiwgdG1wMSwgdG1wMiwgbWFzayk7CisKKyAgICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcDMsICZwMiwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgICAgRG9GaWx0ZXI0X1NTRTIoJnAxLCAmcDAsICZwMywgJnAyLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgICBTdG9yZTE2eDRfU1NFMigmcDEsICZwMCwgJnAzLCAmcDIsIGIsIGIgKyA4ICogc3RyaWRlLCBzdHJpZGUpOworCisgICAgLy8gcm90YXRlIHNhbXBsZXMKKyAgICBwMSA9IHRtcDE7CisgICAgcDAgPSB0bXAyOworICB9Cit9CisKKy8vIDgtcGl4ZWxzIHdpZGUgdmFyaWFudCwgZm9yIGNocm9tYSBmaWx0ZXJpbmcKK3N0YXRpYyB2b2lkIFZGaWx0ZXI4X1NTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSB0MSwgcDIsIHAxLCBwMCwgcTAsIHExLCBxMjsKKworICAvLyBMb2FkIHAzLCBwMiwgcDEsIHAwCisgIExPQURVVl9IX0VER0VTNCh1IC0gNCAqIHN0cmlkZSwgdiAtIDQgKiBzdHJpZGUsIHN0cmlkZSwgdDEsIHAyLCBwMSwgcDApOworICBNQVhfRElGRjEodDEsIHAyLCBwMSwgcDAsIG1hc2spOworCisgIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKKyAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgcTAsIHExLCBxMiwgdDEpOworICBNQVhfRElGRjIodDEsIHEyLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI2X1NTRTIoJnAyLCAmcDEsICZwMCwgJnEwLCAmcTEsICZxMiwgJm1hc2ssIGhldl90aHJlc2gpOworCisgIC8vIFN0b3JlCisgIFNUT1JFVVYocDIsIHUsIHYsIC0zICogc3RyaWRlKTsKKyAgU1RPUkVVVihwMSwgdSwgdiwgLTIgKiBzdHJpZGUpOworICBTVE9SRVVWKHAwLCB1LCB2LCAtMSAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTAsIHUsIHYsIDAgKiBzdHJpZGUpOworICBTVE9SRVVWKHExLCB1LCB2LCAxICogc3RyaWRlKTsKKyAgU1RPUkVVVihxMiwgdSwgdiwgMiAqIHN0cmlkZSk7Cit9CisKK3N0YXRpYyB2b2lkIEhGaWx0ZXI4X1NTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSBwMywgcDIsIHAxLCBwMCwgcTAsIHExLCBxMiwgcTM7CisKKyAgdWludDhfdCogY29uc3QgdHUgPSB1IC0gNDsKKyAgdWludDhfdCogY29uc3QgdHYgPSB2IC0gNDsKKyAgTG9hZDE2eDRfU1NFMih0dSwgdHYsIHN0cmlkZSwgJnAzLCAmcDIsICZwMSwgJnAwKTsKKyAgTUFYX0RJRkYxKHAzLCBwMiwgcDEsIHAwLCBtYXNrKTsKKworICBMb2FkMTZ4NF9TU0UyKHUsIHYsIHN0cmlkZSwgJnEwLCAmcTEsICZxMiwgJnEzKTsKKyAgTUFYX0RJRkYyKHEzLCBxMiwgcTEsIHEwLCBtYXNrKTsKKworICBDb21wbGV4TWFza19TU0UyKCZwMSwgJnAwLCAmcTAsICZxMSwgdGhyZXNoLCBpdGhyZXNoLCAmbWFzayk7CisgIERvRmlsdGVyNl9TU0UyKCZwMiwgJnAxLCAmcDAsICZxMCwgJnExLCAmcTIsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICBTdG9yZTE2eDRfU1NFMigmcDMsICZwMiwgJnAxLCAmcDAsIHR1LCB0diwgc3RyaWRlKTsKKyAgU3RvcmUxNng0X1NTRTIoJnEwLCAmcTEsICZxMiwgJnEzLCB1LCB2LCBzdHJpZGUpOworfQorCitzdGF0aWMgdm9pZCBWRmlsdGVyOGlfU1NFMih1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdGhyZXNoKSB7CisgIF9fbTEyOGkgbWFzazsKKyAgX19tMTI4aSB0MSwgdDIsIHAxLCBwMCwgcTAsIHExOworCisgIC8vIExvYWQgcDMsIHAyLCBwMSwgcDAKKyAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgdDIsIHQxLCBwMSwgcDApOworICBNQVhfRElGRjEodDIsIHQxLCBwMSwgcDAsIG1hc2spOworCisgIHUgKz0gNCAqIHN0cmlkZTsKKyAgdiArPSA0ICogc3RyaWRlOworCisgIC8vIExvYWQgcTAsIHExLCBxMiwgcTMKKyAgTE9BRFVWX0hfRURHRVM0KHUsIHYsIHN0cmlkZSwgcTAsIHExLCB0MSwgdDIpOworICBNQVhfRElGRjIodDIsIHQxLCBxMSwgcTAsIG1hc2spOworCisgIENvbXBsZXhNYXNrX1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCB0aHJlc2gsIGl0aHJlc2gsICZtYXNrKTsKKyAgRG9GaWx0ZXI0X1NTRTIoJnAxLCAmcDAsICZxMCwgJnExLCAmbWFzaywgaGV2X3RocmVzaCk7CisKKyAgLy8gU3RvcmUKKyAgU1RPUkVVVihwMSwgdSwgdiwgLTIgKiBzdHJpZGUpOworICBTVE9SRVVWKHAwLCB1LCB2LCAtMSAqIHN0cmlkZSk7CisgIFNUT1JFVVYocTAsIHUsIHYsIDAgKiBzdHJpZGUpOworICBTVE9SRVVWKHExLCB1LCB2LCAxICogc3RyaWRlKTsKK30KKworc3RhdGljIHZvaWQgSEZpbHRlcjhpX1NTRTIodWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aHJlc2gsIGludCBpdGhyZXNoLCBpbnQgaGV2X3RocmVzaCkgeworICBfX20xMjhpIG1hc2s7CisgIF9fbTEyOGkgdDEsIHQyLCBwMSwgcDAsIHEwLCBxMTsKKyAgTG9hZDE2eDRfU1NFMih1LCB2LCBzdHJpZGUsICZ0MiwgJnQxLCAmcDEsICZwMCk7ICAgLy8gcDMsIHAyLCBwMSwgcDAKKyAgTUFYX0RJRkYxKHQyLCB0MSwgcDEsIHAwLCBtYXNrKTsKKworICB1ICs9IDQ7ICAvLyBiZWdpbm5pbmcgb2YgcTAKKyAgdiArPSA0OworICBMb2FkMTZ4NF9TU0UyKHUsIHYsIHN0cmlkZSwgJnEwLCAmcTEsICZ0MSwgJnQyKTsgIC8vIHEwLCBxMSwgcTIsIHEzCisgIE1BWF9ESUZGMih0MiwgdDEsIHExLCBxMCwgbWFzayk7CisKKyAgQ29tcGxleE1hc2tfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHRocmVzaCwgaXRocmVzaCwgJm1hc2spOworICBEb0ZpbHRlcjRfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsICZtYXNrLCBoZXZfdGhyZXNoKTsKKworICB1IC09IDI7ICAvLyBiZWdpbm5pbmcgb2YgcDEKKyAgdiAtPSAyOworICBTdG9yZTE2eDRfU1NFMigmcDEsICZwMCwgJnEwLCAmcTEsIHUsIHYsIHN0cmlkZSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyA0eDQgcHJlZGljdGlvbnMKKworI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KKyNkZWZpbmUgQVZHMyhhLCBiLCBjKSAoKChhKSArIDIgKiAoYikgKyAoYykgKyAyKSA+PiAyKQorCisvLyBXZSB1c2UgdGhlIGZvbGxvd2luZyA4Yi1hcml0aG1ldGljIHRyaWNrczoKKy8vICAgICAoYSArIDIgKiBiICsgYyArIDIpID4+IDIgPSAoQUMgKyBiICsgMSkgPj4gMQorLy8gICB3aGVyZTogQUMgPSAoYSArIGMpID4+IDEgPSBbKGEgKyBjICsgMSkgPj4gMV0gLSBbKGFeYykgJiAxXQorLy8gYW5kOgorLy8gICAgIChhICsgMiAqIGIgKyBjICsgMikgPj4gMiA9IChBQiArIEJDICsgMSkgPj4gMSAtIChhYnxiYykmbHNiCisvLyAgIHdoZXJlOiBBQyA9IChhICsgYiArIDEpID4+IDEsICAgQkMgPSAoYiArIGMgKyAxKSA+PiAxCisvLyAgIGFuZCBhYiA9IGEgXiBiLCBiYyA9IGIgXiBjLCBsc2IgPSAoQUNeQkMpJjEKKworc3RhdGljIHZvaWQgVkU0X1NTRTIodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUyAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0gwMCA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBhID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0gwMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0gwMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9zdWJzX2VwdTgoYSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhdmcgPSBfbW1fYXZnX2VwdTgoYiwgQkNERUZHSDApOworICBjb25zdCB1aW50MzJfdCB2YWxzID0gX21tX2N2dHNpMTI4X3NpMzIoYXZnKTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBXZWJQVWludDMyVG9NZW0oZHN0ICsgaSAqIEJQUywgdmFscyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgTEQ0X1NTRTIodWludDhfdCogZHN0KSB7ICAgLy8gRG93bi1MZWZ0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIENERUZHSEgwID0gX21tX2luc2VydF9lcGkxNihDREVGR0gwMCwgZHN0Wy1CUFMgKyA3XSwgMyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQ0RFRkdISDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQ0RFRkdISDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYWJjZGVmZyA9IF9tbV9hdmdfZXB1OChhdmcyLCBCQ0RFRkdIMCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkZWZnICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDIpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAzKSkpOworfQorCitzdGF0aWMgdm9pZCBWUjRfU1NFMih1aW50OF90KiBkc3QpIHsgICAvLyBWZXJ0aWNhbC1SaWdodAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IGludCBJID0gZHN0Wy0xICsgMCAqIEJQU107CisgIGNvbnN0IGludCBKID0gZHN0Wy0xICsgMSAqIEJQU107CisgIGNvbnN0IGludCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IGludCBYID0gZHN0Wy0xIC0gQlBTXTsKKyAgY29uc3QgX19tMTI4aSBYQUJDRCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUyAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBBQkNEMCA9IF9tbV9zcmxpX3NpMTI4KFhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkID0gX21tX2F2Z19lcHU4KFhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgX1hBQkNEID0gX21tX3NsbGlfc2kxMjgoWEFCQ0QsIDEpOworICBjb25zdCBfX20xMjhpIElYQUJDRCA9IF9tbV9pbnNlcnRfZXBpMTYoX1hBQkNELCBJIHwgKFggPDwgOCksIDApOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoSVhBQkNELCBBQkNEMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KElYQUJDRCwgQUJDRDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgZWZnaCA9IF9tbV9hdmdfZXB1OChhdmcyLCBYQUJDRCk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAwICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhYmNkICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMSAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgZWZnaCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zbGxpX3NpMTI4KGFiY2QsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAzICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2xsaV9zaTEyOChlZmdoLCAxKSkpOworCisgIC8vIHRoZXNlIHR3byBhcmUgaGFyZCB0byBpbXBsZW1lbnQgaW4gU1NFMiwgc28gd2Uga2VlcCB0aGUgQy12ZXJzaW9uOgorICBEU1QoMCwgMikgPSBBVkczKEosIEksIFgpOworICBEU1QoMCwgMykgPSBBVkczKEssIEosIEkpOworfQorCitzdGF0aWMgdm9pZCBWTDRfU1NFMih1aW50OF90KiBkc3QpIHsgICAvLyBWZXJ0aWNhbC1MZWZ0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUykpOworICBjb25zdCBfX20xMjhpIEJDREVGR0hfID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSF9fID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQUJDREVGR0gsIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX2F2Z19lcHU4KENERUZHSF9fLCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMyA9IF9tbV9hdmdfZXB1OChhdmcxLCBhdmcyKTsKKyAgY29uc3QgX19tMTI4aSBsc2IxID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KGF2ZzEsIGF2ZzIpLCBvbmUpOworICBjb25zdCBfX20xMjhpIGFiID0gX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChDREVGR0hfXywgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGFiYmMgPSBfbW1fb3Jfc2kxMjgoYWIsIGJjKTsKKyAgY29uc3QgX19tMTI4aSBsc2IyID0gX21tX2FuZF9zaTEyOChhYmJjLCBsc2IxKTsKKyAgY29uc3QgX19tMTI4aSBhdmc0ID0gX21tX3N1YnNfZXB1OChhdmczLCBsc2IyKTsKKyAgY29uc3QgdWludDMyX3QgZXh0cmFfb3V0ID0gX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgNCkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYXZnMSAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGF2ZzQgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhdmcxLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnNCwgMSkpKTsKKworICAvLyB0aGVzZSB0d28gYXJlIGhhcmQgdG8gZ2V0IGFuZCBpcnJlZ3VsYXIKKyAgRFNUKDMsIDIpID0gKGV4dHJhX291dCA+PiAwKSAmIDB4ZmY7CisgIERTVCgzLCAzKSA9IChleHRyYV9vdXQgPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgdm9pZCBSRDRfU1NFMih1aW50OF90KiBkc3QpIHsgICAvLyBEb3duLXJpZ2h0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBYQUJDRCA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopKGRzdCAtIEJQUyAtIDEpKTsKKyAgY29uc3QgX19tMTI4aSBfX19fWEFCQ0QgPSBfbW1fc2xsaV9zaTEyOChYQUJDRCwgNCk7CisgIGNvbnN0IHVpbnQzMl90IEkgPSBkc3RbLTEgKyAwICogQlBTXTsKKyAgY29uc3QgdWludDMyX3QgSiA9IGRzdFstMSArIDEgKiBCUFNdOworICBjb25zdCB1aW50MzJfdCBLID0gZHN0Wy0xICsgMiAqIEJQU107CisgIGNvbnN0IHVpbnQzMl90IEwgPSBkc3RbLTEgKyAzICogQlBTXTsKKyAgY29uc3QgX19tMTI4aSBMS0pJX19fX18gPQorICAgICAgX21tX2N2dHNpMzJfc2kxMjgoTCB8IChLIDw8IDgpIHwgKEogPDwgMTYpIHwgKEkgPDwgMjQpKTsKKyAgY29uc3QgX19tMTI4aSBMS0pJWEFCQ0QgPSBfbW1fb3Jfc2kxMjgoTEtKSV9fX19fLCBfX19fWEFCQ0QpOworICBjb25zdCBfX20xMjhpIEtKSVhBQkNEXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgSklYQUJDRF9fID0gX21tX3NybGlfc2kxMjgoTEtKSVhBQkNELCAyKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoSklYQUJDRF9fLCBMS0pJWEFCQ0QpLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYWJjZGVmZyA9IF9tbV9hdmdfZXB1OChhdmcyLCBLSklYQUJDRF8pOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZGVmZyAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAyKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMykpKTsKK30KKworI3VuZGVmIERTVAorI3VuZGVmIEFWRzMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx1bWEgMTZ4MTYKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJ1ZU1vdGlvbl9TU0UyKHVpbnQ4X3QqIGRzdCwgaW50IHNpemUpIHsKKyAgY29uc3QgdWludDhfdCogdG9wID0gZHN0IC0gQlBTOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBpbnQgeTsKKyAgaWYgKHNpemUgPT0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMih0b3ApKTsKKyAgICBjb25zdCBfX20xMjhpIHRvcF9iYXNlID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSwgZHN0ICs9IEJQUykgeworICAgICAgY29uc3QgaW50IHZhbCA9IGRzdFstMV0gLSB0b3BbLTFdOworICAgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihfbW1fYWRkX2VwaTE2KGJhc2UsIHRvcF9iYXNlKSwgemVybyk7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0LCBfbW1fY3Z0c2kxMjhfc2kzMihvdXQpKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoc2l6ZSA9PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2UgPSBfbW1fdW5wYWNrbG9fZXBpOCh0b3BfdmFsdWVzLCB6ZXJvKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgODsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gZHN0Wy0xXSAtIHRvcFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKWRzdCwgb3V0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKil0b3ApOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMCA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgdG9wX2Jhc2VfMSA9IF9tbV91bnBhY2toaV9lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCAxNjsgKyt5LCBkc3QgKz0gQlBTKSB7CisgICAgICBjb25zdCBpbnQgdmFsID0gZHN0Wy0xXSAtIHRvcFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXRfMCA9IF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2VfMCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dF8xID0gX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZV8xKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihvdXRfMCwgb3V0XzEpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCBvdXQpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBUTTRfU1NFMih1aW50OF90KiBkc3QpICAgeyBUcnVlTW90aW9uX1NTRTIoZHN0LCA0KTsgfQorc3RhdGljIHZvaWQgVE04dXZfU1NFMih1aW50OF90KiBkc3QpIHsgVHJ1ZU1vdGlvbl9TU0UyKGRzdCwgOCk7IH0KK3N0YXRpYyB2b2lkIFRNMTZfU1NFMih1aW50OF90KiBkc3QpICB7IFRydWVNb3Rpb25fU1NFMihkc3QsIDE2KTsgfQorCitzdGF0aWMgdm9pZCBWRTE2X1NTRTIodWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyBqICogQlBTKSwgdG9wKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBIRTE2X1NTRTIodWludDhfdCogZHN0KSB7ICAgICAvLyBob3Jpem9udGFsCisgIGludCBqOworICBmb3IgKGogPSAxNjsgaiA+IDA7IC0taikgeworICAgIGNvbnN0IF9fbTEyOGkgdmFsdWVzID0gX21tX3NldDFfZXBpOChkc3RbLTFdKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQxNl9TU0UyKHVpbnQ4X3QgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgodik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB2YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDMTZfU1NFMih1aW50OF90KiBkc3QpIHsgIC8vIERDCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgc2FkOHgyID0gX21tX3NhZF9lcHU4KHRvcCwgemVybyk7CisgIC8vIHN1bSB0aGUgdHdvIHNhZHM6IHNhZDh4MlswOjFdICsgc2FkOHgyWzg6OV0KKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KHNhZDh4MiwgX21tX3NodWZmbGVfZXBpMzIoc2FkOHgyLCAyKSk7CisgIGludCBsZWZ0ID0gMDsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgbGVmdCArPSBkc3RbLTEgKyBqICogQlBTXTsKKyAgfQorICB7CisgICAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIGxlZnQgKyAxNjsKKyAgICBQdXQxNl9TU0UyKERDID4+IDUsIGRzdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wX1NTRTIodWludDhfdCogZHN0KSB7ICAvLyBEQyB3aXRoIHRvcCBzYW1wbGVzIHVuYXZhaWxhYmxlCisgIGludCBEQyA9IDg7CisgIGludCBqOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIERDICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIFB1dDE2X1NTRTIoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBsZWZ0IHNhbXBsZXMgdW5hdmFpbGFibGUKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzYWQ4eDIgPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgLy8gc3VtIHRoZSB0d28gc2Fkczogc2FkOHgyWzA6MV0gKyBzYWQ4eDJbODo5XQorICBjb25zdCBfX20xMjhpIHN1bSA9IF9tbV9hZGRfZXBpMTYoc2FkOHgyLCBfbW1fc2h1ZmZsZV9lcGkzMihzYWQ4eDIsIDIpKTsKKyAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIDg7CisgIFB1dDE2X1NTRTIoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREMxNk5vVG9wTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3AgJiBsZWZ0IHNhbXBsZXMKKyAgUHV0MTZfU1NFMigweDgwLCBkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2hyb21hCisKK3N0YXRpYyB2b2lkIFZFOHV2X1NTRTIodWludDhfdCogZHN0KSB7ICAgIC8vIHZlcnRpY2FsCisgIGludCBqOworICBjb25zdCBfX20xMjhpIHRvcCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKGRzdCAtIEJQUykpOworICBmb3IgKGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB0b3ApOworICB9Cit9CisKKy8vIGhlbHBlciBmb3IgY2hyb21hLURDIHByZWRpY3Rpb25zCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQ4eDh1dl9TU0UyKHVpbnQ4X3QgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgodik7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIHZvaWQgREM4dXZfU1NFMih1aW50OF90KiBkc3QpIHsgICAgIC8vIERDCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoZHN0IC0gQlBTKSk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX3NhZF9lcHU4KHRvcCwgemVybyk7CisgIGludCBsZWZ0ID0gMDsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBsZWZ0ICs9IGRzdFstMSArIGogKiBCUFNdOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgbGVmdCArIDg7CisgICAgUHV0OHg4dXZfU1NFMihEQyA+PiA0LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERDOHV2Tm9MZWZ0X1NTRTIodWludDhfdCogZHN0KSB7ICAgLy8gREMgd2l0aCBubyBsZWZ0IHNhbXBsZXMKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSB0b3AgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShkc3QgLSBCUFMpKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fc2FkX2VwdTgodG9wLCB6ZXJvKTsKKyAgY29uc3QgaW50IERDID0gX21tX2N2dHNpMTI4X3NpMzIoc3VtKSArIDQ7CisgIFB1dDh4OHV2X1NTRTIoREMgPj4gMywgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcF9TU0UyKHVpbnQ4X3QqIGRzdCkgeyAgLy8gREMgd2l0aCBubyB0b3Agc2FtcGxlcworICBpbnQgZGMwID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICBkYzAgKz0gZHN0Wy0xICsgaSAqIEJQU107CisgIH0KKyAgUHV0OHg4dXZfU1NFMihkYzAgPj4gMywgZHN0KTsKK30KKworc3RhdGljIHZvaWQgREM4dXZOb1RvcExlZnRfU1NFMih1aW50OF90KiBkc3QpIHsgICAgLy8gREMgd2l0aCBub3RoaW5nCisgIFB1dDh4OHV2X1NTRTIoMHg4MCwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RHNwSW5pdFNTRTIodm9pZCkgeworICBWUDhUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1fU1NFMjsKKyNpZiAoVVNFX1RSQU5TRk9STV9BQzMgPT0gMSkKKyAgVlA4VHJhbnNmb3JtQUMzID0gVHJhbnNmb3JtQUMzX1NTRTI7CisjZW5kaWYKKworICBWUDhWRmlsdGVyMTYgPSBWRmlsdGVyMTZfU1NFMjsKKyAgVlA4SEZpbHRlcjE2ID0gSEZpbHRlcjE2X1NTRTI7CisgIFZQOFZGaWx0ZXI4ID0gVkZpbHRlcjhfU1NFMjsKKyAgVlA4SEZpbHRlcjggPSBIRmlsdGVyOF9TU0UyOworICBWUDhWRmlsdGVyMTZpID0gVkZpbHRlcjE2aV9TU0UyOworICBWUDhIRmlsdGVyMTZpID0gSEZpbHRlcjE2aV9TU0UyOworICBWUDhWRmlsdGVyOGkgPSBWRmlsdGVyOGlfU1NFMjsKKyAgVlA4SEZpbHRlcjhpID0gSEZpbHRlcjhpX1NTRTI7CisKKyAgVlA4U2ltcGxlVkZpbHRlcjE2ID0gU2ltcGxlVkZpbHRlcjE2X1NTRTI7CisgIFZQOFNpbXBsZUhGaWx0ZXIxNiA9IFNpbXBsZUhGaWx0ZXIxNl9TU0UyOworICBWUDhTaW1wbGVWRmlsdGVyMTZpID0gU2ltcGxlVkZpbHRlcjE2aV9TU0UyOworICBWUDhTaW1wbGVIRmlsdGVyMTZpID0gU2ltcGxlSEZpbHRlcjE2aV9TU0UyOworCisgIFZQOFByZWRMdW1hNFsxXSA9IFRNNF9TU0UyOworICBWUDhQcmVkTHVtYTRbMl0gPSBWRTRfU1NFMjsKKyAgVlA4UHJlZEx1bWE0WzRdID0gUkQ0X1NTRTI7CisgIFZQOFByZWRMdW1hNFs1XSA9IFZSNF9TU0UyOworICBWUDhQcmVkTHVtYTRbNl0gPSBMRDRfU1NFMjsKKyAgVlA4UHJlZEx1bWE0WzddID0gVkw0X1NTRTI7CisKKyAgVlA4UHJlZEx1bWExNlswXSA9IERDMTZfU1NFMjsKKyAgVlA4UHJlZEx1bWExNlsxXSA9IFRNMTZfU1NFMjsKKyAgVlA4UHJlZEx1bWExNlsyXSA9IFZFMTZfU1NFMjsKKyAgVlA4UHJlZEx1bWExNlszXSA9IEhFMTZfU1NFMjsKKyAgVlA4UHJlZEx1bWExNls0XSA9IERDMTZOb1RvcF9TU0UyOworICBWUDhQcmVkTHVtYTE2WzVdID0gREMxNk5vTGVmdF9TU0UyOworICBWUDhQcmVkTHVtYTE2WzZdID0gREMxNk5vVG9wTGVmdF9TU0UyOworCisgIFZQOFByZWRDaHJvbWE4WzBdID0gREM4dXZfU1NFMjsKKyAgVlA4UHJlZENocm9tYThbMV0gPSBUTTh1dl9TU0UyOworICBWUDhQcmVkQ2hyb21hOFsyXSA9IFZFOHV2X1NTRTI7CisgIFZQOFByZWRDaHJvbWE4WzRdID0gREM4dXZOb1RvcF9TU0UyOworICBWUDhQcmVkQ2hyb21hOFs1XSA9IERDOHV2Tm9MZWZ0X1NTRTI7CisgIFZQOFByZWRDaHJvbWE4WzZdID0gREM4dXZOb1RvcExlZnRfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RlY19zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE4NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9kZWNfc3NlNDEuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFNCB2ZXJzaW9uIG9mIHNvbWUgZGVjb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kZWMvdnA4aV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworc3RhdGljIHZvaWQgSEUxNl9TU0U0MSh1aW50OF90KiBkc3QpIHsgICAgIC8vIGhvcml6b250YWwKKyAgaW50IGo7CisgIGNvbnN0IF9fbTEyOGkga1NodWZmbGUzID0gX21tX3NldDFfZXBpOCgzKTsKKyAgZm9yIChqID0gMTY7IGogPiAwOyAtLWopIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKGRzdCAtIDQpKTsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zaHVmZmxlX2VwaTgoaW4sIGtTaHVmZmxlMyk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOERzcEluaXRTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOERzcEluaXRTU0U0MSh2b2lkKSB7CisgIFZQOFByZWRMdW1hMTZbM10gPSBIRTE2X1NTRTQxOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhEc3BJbml0U1NFNDEpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZHNwLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RzcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOWJiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2RzcC5oCkBAIC0wLDAgKzEsNjkzIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9EU1BfSF8KKyNkZWZpbmUgV0VCUF9EU1BfRFNQX0hfCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBCUFMgMzIgICAvLyB0aGlzIGlzIHRoZSBjb21tb24gc3RyaWRlIGZvciBlbmMvZGVjCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDUFUgZGV0ZWN0aW9uCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgTE9DQUxfR0NDX1ZFUlNJT04gKChfX0dOVUNfXyA8PCA4KSB8IF9fR05VQ19NSU5PUl9fKQorIyBkZWZpbmUgTE9DQUxfR0NDX1BSRVJFUShtYWosIG1pbikgXAorICAgIChMT0NBTF9HQ0NfVkVSU0lPTiA+PSAoKChtYWopIDw8IDgpIHwgKG1pbikpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0dDQ19WRVJTSU9OIDAKKyMgZGVmaW5lIExPQ0FMX0dDQ19QUkVSRVEobWFqLCBtaW4pIDAKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjIGRlZmluZSBMT0NBTF9DTEFOR19WRVJTSU9OICgoX19jbGFuZ19tYWpvcl9fIDw8IDgpIHwgX19jbGFuZ19taW5vcl9fKQorIyBkZWZpbmUgTE9DQUxfQ0xBTkdfUFJFUkVRKG1haiwgbWluKSBcCisgICAgKExPQ0FMX0NMQU5HX1ZFUlNJT04gPj0gKCgobWFqKSA8PCA4KSB8IChtaW4pKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9DTEFOR19WRVJTSU9OIDAKKyMgZGVmaW5lIExPQ0FMX0NMQU5HX1BSRVJFUShtYWosIG1pbikgMAorI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfYnVpbHRpbgorIyBkZWZpbmUgX19oYXNfYnVpbHRpbih4KSAwCisjZW5kaWYKKworLy8gZm9yIG5vdywgbm9uZSBvZiB0aGUgb3B0aW1pemF0aW9ucyBiZWxvdyBhcmUgYXZhaWxhYmxlIGluIGVtc2NyaXB0ZW4KKyNpZiAhZGVmaW5lZChFTVNDUklQVEVOKQorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPiAxMzEwICYmIFwKKyAgICAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpCisjZGVmaW5lIFdFQlBfTVNDX1NTRTIgIC8vIFZpc3VhbCBDKysgU1NFMiB0YXJnZXRzCisjZW5kaWYKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE1MDAgJiYgXAorICAgIChkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9JWDg2KSkKKyNkZWZpbmUgV0VCUF9NU0NfU1NFNDEgIC8vIFZpc3VhbCBDKysgU1NFNC4xIHRhcmdldHMKKyNlbmRpZgorCisvLyBXRUJQX0hBVkVfKiBhcmUgdXNlZCB0byBpbmRpY2F0ZSB0aGUgcHJlc2VuY2Ugb2YgdGhlIGluc3RydWN0aW9uIHNldCBpbiBkc3AKKy8vIGZpbGVzIHdpdGhvdXQgaW50cmluc2ljcywgYWxsb3dpbmcgdGhlIGNvcnJlc3BvbmRpbmcgSW5pdCgpIHRvIGJlIGNhbGxlZC4KKy8vIEZpbGVzIGNvbnRhaW5pbmcgaW50cmluc2ljcyB3aWxsIG5lZWQgdG8gYmUgYnVpbHQgdGFyZ2V0aW5nIHRoZSBpbnN0cnVjdGlvbgorLy8gc2V0IHNvIHNob3VsZCBzdWNjZWVkIG9uIG9uZSBvZiB0aGUgZWFybGllciB0ZXN0cy4KKyNpZiBkZWZpbmVkKF9fU1NFMl9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTIpIHx8IGRlZmluZWQoV0VCUF9IQVZFX1NTRTIpCisjZGVmaW5lIFdFQlBfVVNFX1NTRTIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1NTRTRfMV9fKSB8fCBkZWZpbmVkKFdFQlBfTVNDX1NTRTQxKSB8fCBkZWZpbmVkKFdFQlBfSEFWRV9TU0U0MSkKKyNkZWZpbmUgV0VCUF9VU0VfU1NFNDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX0FWWDJfXykgfHwgZGVmaW5lZChXRUJQX0hBVkVfQVZYMikKKyNkZWZpbmUgV0VCUF9VU0VfQVZYMgorI2VuZGlmCisKKy8vIFRoZSBpbnRyaW5zaWNzIGN1cnJlbnRseSBjYXVzZSBjb21waWxlciBlcnJvcnMgd2l0aCBhcm0tbmFjbC1nY2MgYW5kIHRoZQorLy8gaW5saW5lIGFzc2VtYmx5IHdvdWxkIG5lZWQgdG8gYmUgbW9kaWZpZWQgZm9yIHVzZSB3aXRoIE5hdGl2ZSBDbGllbnQuCisjaWYgKGRlZmluZWQoX19BUk1fTkVPTl9fKSB8fCBcCisgICAgIGRlZmluZWQoX19hYXJjaDY0X18pIHx8IGRlZmluZWQoV0VCUF9IQVZFX05FT04pKSAmJiBcCisgICAgIWRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisjZGVmaW5lIFdFQlBfVVNFX05FT04KKyNlbmRpZgorCisjaWYgIWRlZmluZWQoV0VCUF9VU0VfTkVPTikgJiYgZGVmaW5lZChfX0FORFJPSURfXykgJiYgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKSAmJiBkZWZpbmVkKEhBVkVfQ1BVX0ZFQVRVUkVTX0gpCisjZGVmaW5lIFdFQlBfQU5EUk9JRF9ORU9OICAvLyBBbmRyb2lkIHRhcmdldHMgdGhhdCBtYXkgaGF2ZSBORU9OCisjZGVmaW5lIFdFQlBfVVNFX05FT04KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTcwMCAmJiBkZWZpbmVkKF9NX0FSTSkKKyNkZWZpbmUgV0VCUF9VU0VfTkVPTgorI2RlZmluZSBXRUJQX1VTRV9JTlRSSU5TSUNTCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19taXBzX18pICYmICFkZWZpbmVkKF9fbWlwczY0KSAmJiBcCisgICAgZGVmaW5lZChfX21pcHNfaXNhX3JldikgJiYgKF9fbWlwc19pc2FfcmV2ID49IDEpICYmIChfX21pcHNfaXNhX3JldiA8IDYpCisjZGVmaW5lIFdFQlBfVVNFX01JUFMzMgorI2lmIChfX21pcHNfaXNhX3JldiA+PSAyKQorI2RlZmluZSBXRUJQX1VTRV9NSVBTMzJfUjIKKyNpZiBkZWZpbmVkKF9fbWlwc19kc3ByMikgfHwgKGRlZmluZWQoX19taXBzX2RzcF9yZXYpICYmIF9fbWlwc19kc3BfcmV2ID49IDIpCisjZGVmaW5lIFdFQlBfVVNFX01JUFNfRFNQX1IyCisjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fbWlwc19tc2EpICYmIGRlZmluZWQoX19taXBzX2lzYV9yZXYpICYmIChfX21pcHNfaXNhX3JldiA+PSA1KQorI2RlZmluZSBXRUJQX1VTRV9NU0EKKyNlbmRpZgorCisjZW5kaWYgIC8qIEVNU0NSSVBURU4gKi8KKworI2lmbmRlZiBXRUJQX0RTUF9PTUlUX0NfQ09ERQorI2RlZmluZSBXRUJQX0RTUF9PTUlUX0NfQ09ERSAxCisjZW5kaWYKKworI2lmIChkZWZpbmVkKF9fYWFyY2g2NF9fKSB8fCBkZWZpbmVkKF9fQVJNX05FT05fXykpICYmIFdFQlBfRFNQX09NSVRfQ19DT0RFCisjZGVmaW5lIFdFQlBfTkVPTl9PTUlUX0NfQ09ERSAxCisjZWxzZQorI2RlZmluZSBXRUJQX05FT05fT01JVF9DX0NPREUgMAorI2VuZGlmCisKKyNpZiAhKExPQ0FMX0NMQU5HX1BSRVJFUSgzLDgpIHx8IExPQ0FMX0dDQ19QUkVSRVEoNCw4KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSkKKyNkZWZpbmUgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQyAxCisjZWxzZQorI2RlZmluZSBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDIDAKKyNlbmRpZgorCisvLyBUaGlzIG1hY3JvIHByZXZlbnRzIHRocmVhZF9zYW5pdGl6ZXIgZnJvbSByZXBvcnRpbmcga25vd24gY29uY3VycmVudCB3cml0ZXMuCisjZGVmaW5lIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04KKyNpZiBkZWZpbmVkKF9faGFzX2ZlYXR1cmUpCisjaWYgX19oYXNfZmVhdHVyZSh0aHJlYWRfc2FuaXRpemVyKQorI3VuZGVmIFdFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04KKyNkZWZpbmUgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiBfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZV90aHJlYWQpKQorI2VuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfVEhSRUFEKSAmJiAhZGVmaW5lZChfV0lOMzIpCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorLy8gVE9ETzogSWYgbm90IGluY2x1ZGluZyB0aGlzIGlzIGEgcHJvYmxlbSBvbiBhIFN0YXJib2FyZCBwbGF0Zm9ybSwgdGhlbgorLy8gICAgICAgd2Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2l0aCBTdGFyYm9hcmQgdGhyZWFkaW5nCisvLyAgICAgICBwcmltaXRpdmVzIGluc3RlYWQuCisjaW5jbHVkZSA8cHRocmVhZC5oPiAgLy8gTk9MSU5UCisjZW5kaWYKKworI2RlZmluZSBXRUJQX0RTUF9JTklUKGZ1bmMpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2xhdGlsZSBWUDhDUFVJbmZvIGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkID0gICAgICAgICAgIFwKKyAgICAgIChWUDhDUFVJbmZvKSZmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZDsgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgcHRocmVhZF9tdXRleF90IGZ1bmMgIyMgX2xvY2sgPSBQVEhSRUFEX01VVEVYX0lOSVRJQUxJWkVSOyBcCisgIGlmIChwdGhyZWFkX211dGV4X2xvY2soJmZ1bmMgIyMgX2xvY2spKSBicmVhazsgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkICE9IFZQOEdldENQVUluZm8pIGZ1bmMoKTsgICAgICAgICAgXAorICBmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCA9IFZQOEdldENQVUluZm87ICAgICAgICAgICAgICAgICAgICAgICBcCisgICh2b2lkKXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZmdW5jICMjIF9sb2NrKTsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZWxzZSAgLy8gIShkZWZpbmVkKFdFQlBfVVNFX1RIUkVBRCkgJiYgIWRlZmluZWQoX1dJTjMyKSkKKyNkZWZpbmUgV0VCUF9EU1BfSU5JVChmdW5jKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9sYXRpbGUgVlA4Q1BVSW5mbyBmdW5jICMjIF9sYXN0X2NwdWluZm9fdXNlZCA9ICAgICAgICAgICBcCisgICAgICAoVlA4Q1BVSW5mbykmZnVuYyAjIyBfbGFzdF9jcHVpbmZvX3VzZWQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkID09IFZQOEdldENQVUluZm8pIGJyZWFrOyAgICAgICAgICAgXAorICBmdW5jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZ1bmMgIyMgX2xhc3RfY3B1aW5mb191c2VkID0gVlA4R2V0Q1BVSW5mbzsgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZW5kaWYgIC8vIGRlZmluZWQoV0VCUF9VU0VfVEhSRUFEKSAmJiAhZGVmaW5lZChfV0lOMzIpCisKKy8vIERlZmluZXMgYW4gSW5pdCArIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNvbnRyb2wgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb24gb2YKKy8vIGZ1bmN0aW9uIHBvaW50ZXJzIC8gdGFibGVzLgorLyogVXNhZ2U6CisgICBXRUJQX0RTUF9JTklUX0ZVTkMoSW5pdEZ1bmMpIHsKKyAgICAgLi4uZnVuY3Rpb24gYm9keQorICAgfQorKi8KKyNkZWZpbmUgV0VCUF9EU1BfSU5JVF9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgbmFtZSAjIyBfYm9keSh2b2lkKTsgXAorICBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgbmFtZSh2b2lkKSB7ICAgICAgICAgICAgICAgIFwKKyAgICBXRUJQX0RTUF9JTklUKG5hbWUgIyMgX2JvZHkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIG5hbWUgIyMgX2JvZHkodm9pZCkKKworI2RlZmluZSBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRgorI2RlZmluZSBXRUJQX1VCU0FOX0lHTk9SRV9VTlNJR05FRF9PVkVSRkxPVworI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2F0dHJpYnV0ZSkKKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9fc2FuaXRpemUpCisvLyBUaGlzIG1hY3JvIHByZXZlbnRzIHRoZSB1bmRlZmluZWQgYmVoYXZpb3Igc2FuaXRpemVyIGZyb20gcmVwb3J0aW5nCisvLyBmYWlsdXJlcy4gVGhpcyBpcyBvbmx5IG1lYW50IHRvIHNpbGVuY2UgdW5hbGlnbmVkIGxvYWRzIG9uIHBsYXRmb3JtcyB0aGF0CisvLyBhcmUga25vd24gdG8gc3VwcG9ydCB0aGVtLgorI3VuZGVmIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOREVGIFwKKyAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInVuZGVmaW5lZCIpKSkKKworLy8gVGhpcyBtYWNybyBwcmV2ZW50cyB0aGUgdW5kZWZpbmVkIGJlaGF2aW9yIHNhbml0aXplciBmcm9tIHJlcG9ydGluZworLy8gZmFpbHVyZXMgcmVsYXRlZCB0byB1bnNpZ25lZCBpbnRlZ2VyIG92ZXJmbG93cy4gVGhpcyBpcyBvbmx5IG1lYW50IHRvCisvLyBzaWxlbmNlIGNhc2VzIHdoZXJlIHRoaXMgd2VsbCBkZWZpbmVkIGJlaGF2aW9yIGlzIGV4cGVjdGVkLgorI3VuZGVmIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XCisjZGVmaW5lIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XIFwKKyAgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCisjZW5kaWYKKyNlbmRpZgorCisvLyBSZWd1bGFyaXplIHRoZSBkZWZpbml0aW9uIG9mIFdFQlBfU1dBUF8xNkJJVF9DU1AgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpCisjaWYgIWRlZmluZWQoV0VCUF9TV0FQXzE2QklUX0NTUCkKKyNkZWZpbmUgV0VCUF9TV0FQXzE2QklUX0NTUCAwCisjZW5kaWYKKworLy8gc29tZSBlbmRpYW4gZml4IChlLmcuOiBtaXBzLWdjYyBkb2Vzbid0IGRlZmluZSBfX0JJR19FTkRJQU5fXykKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpZiBTQl9JUyhCSUdfRU5ESUFOKQorI2RlZmluZSBXT1JEU19CSUdFTkRJQU4KKyNlbmRpZgorI2Vsc2UKKyNpZiAhZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pICYmIFwKKyAgICAoZGVmaW5lZChfX0JJR19FTkRJQU5fXykgfHwgZGVmaW5lZChfTV9QUEMpIHx8IFwKKyAgICAgKGRlZmluZWQoX19CWVRFX09SREVSX18pICYmIChfX0JZVEVfT1JERVJfXyA9PSBfX09SREVSX0JJR19FTkRJQU5fXykpKQorI2RlZmluZSBXT1JEU19CSUdFTkRJQU4KKyNlbmRpZgorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKwordHlwZWRlZiBlbnVtIHsKKyAga1NTRTIsCisgIGtTU0UzLAorICBrU2xvd1NTU0UzLCAgLy8gc3BlY2lhbCBmZWF0dXJlIGZvciBzbG93IFNTU0UzIGFyY2hpdGVjdHVyZXMKKyAga1NTRTRfMSwKKyAga0FWWCwKKyAga0FWWDIsCisgIGtORU9OLAorICBrTUlQUzMyLAorICBrTUlQU2RzcFIyLAorICBrTVNBCit9IENQVUZlYXR1cmU7CisvLyByZXR1cm5zIHRydWUgaWYgdGhlIENQVSBzdXBwb3J0cyB0aGUgZmVhdHVyZS4KK3R5cGVkZWYgaW50ICgqVlA4Q1BVSW5mbykoQ1BVRmVhdHVyZSBmZWF0dXJlKTsKK1dFQlBfRVhURVJOIFZQOENQVUluZm8gVlA4R2V0Q1BVSW5mbzsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXQgc3R1YiBnZW5lcmF0b3IKKworLy8gRGVmaW5lcyBhbiBpbml0IGZ1bmN0aW9uIHN0dWIgdG8gZW5zdXJlIGVhY2ggbW9kdWxlIGV4cG9zZXMgYSBzeW1ib2wsCisvLyBhdm9pZGluZyBhIGNvbXBpbGVyIHdhcm5pbmcuCisjZGVmaW5lIFdFQlBfRFNQX0lOSVRfU1RVQihmdW5jKSBcCisgIGV4dGVybiB2b2lkIGZ1bmModm9pZCk7IFwKKyAgdm9pZCBmdW5jKHZvaWQpIHt9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbmNvZGluZworCisvLyBUcmFuc2Zvcm1zCisvLyBWUDhJZGN0OiBEb2VzIG9uZSBvZiB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLiBJZiBkb190d28gaXMgc2V0LCB0aGUgdHJhbnNmb3JtcworLy8gICAgICAgICAgd2lsbCBiZSBkb25lIGZvciAocmVmLCBpbiwgZHN0KSBhbmQgKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpLgordHlwZWRlZiB2b2lkICgqVlA4SWRjdCkoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3byk7Cit0eXBlZGVmIHZvaWQgKCpWUDhGZGN0KShjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50MTZfdCogb3V0KTsKK3R5cGVkZWYgdm9pZCAoKlZQOFdIVCkoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCk7CitleHRlcm4gVlA4SWRjdCBWUDhJVHJhbnNmb3JtOworZXh0ZXJuIFZQOEZkY3QgVlA4RlRyYW5zZm9ybTsKK2V4dGVybiBWUDhGZGN0IFZQOEZUcmFuc2Zvcm0yOyAgIC8vIHBlcmZvcm1zIHR3byB0cmFuc2Zvcm1zIGF0IGEgdGltZQorZXh0ZXJuIFZQOFdIVCBWUDhGVHJhbnNmb3JtV0hUOworLy8gUHJlZGljdGlvbnMKKy8vICpkc3QgaXMgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLiAqdG9wIGFuZCAqbGVmdCBjYW4gYmUgTlVMTC4KK3R5cGVkZWYgdm9pZCAoKlZQOEludHJhUHJlZHMpKHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhJbnRyYTRQcmVkcykodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90KiB0b3ApOworZXh0ZXJuIFZQOEludHJhNFByZWRzIFZQOEVuY1ByZWRMdW1hNDsKK2V4dGVybiBWUDhJbnRyYVByZWRzIFZQOEVuY1ByZWRMdW1hMTY7CitleHRlcm4gVlA4SW50cmFQcmVkcyBWUDhFbmNQcmVkQ2hyb21hODsKKwordHlwZWRlZiBpbnQgKCpWUDhNZXRyaWMpKGNvbnN0IHVpbnQ4X3QqIHBpeCwgY29uc3QgdWludDhfdCogcmVmKTsKK2V4dGVybiBWUDhNZXRyaWMgVlA4U1NFMTZ4MTYsIFZQOFNTRTE2eDgsIFZQOFNTRTh4OCwgVlA4U1NFNHg0OwordHlwZWRlZiBpbnQgKCpWUDhXTWV0cmljKShjb25zdCB1aW50OF90KiBwaXgsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHdlaWdodHMpOworLy8gVGhlIHdlaWdodHMgZm9yIFZQOFREaXN0bzR4NCBhbmQgVlA4VERpc3RvMTZ4MTYgY29udGFpbiBhIHJvdy1tYWpvcgorLy8gNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitleHRlcm4gVlA4V01ldHJpYyBWUDhURGlzdG80eDQsIFZQOFREaXN0bzE2eDE2OworCisvLyBDb21wdXRlIHRoZSBhdmVyYWdlIChEQykgb2YgZm91ciA0eDQgYmxvY2tzLgorLy8gRWFjaCBzdWItNHg0IGJsb2NrICNpIHN1bSBpcyBzdG9yZWQgaW4gZGNbaV0uCit0eXBlZGVmIHZvaWQgKCpWUDhNZWFuTWV0cmljKShjb25zdCB1aW50OF90KiByZWYsIHVpbnQzMl90IGRjWzRdKTsKK2V4dGVybiBWUDhNZWFuTWV0cmljIFZQOE1lYW4xNng0OworCit0eXBlZGVmIHZvaWQgKCpWUDhCbG9ja0NvcHkpKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KTsKK2V4dGVybiBWUDhCbG9ja0NvcHkgVlA4Q29weTR4NDsKK2V4dGVybiBWUDhCbG9ja0NvcHkgVlA4Q29weTE2eDg7CisvLyBRdWFudGl6YXRpb24KK3N0cnVjdCBWUDhNYXRyaXg7ICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgordHlwZWRlZiBpbnQgKCpWUDhRdWFudGl6ZUJsb2NrKShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4TWF0cml4KiBjb25zdCBtdHgpOworLy8gU2FtZSBhcyBWUDhRdWFudGl6ZUJsb2NrLCBidXQgcXVhbnRpemVzIHR3byBjb25zZWN1dGl2ZSBibG9ja3MuCit0eXBlZGVmIGludCAoKlZQOFF1YW50aXplMkJsb2NrcykoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgVlA4TWF0cml4KiBjb25zdCBtdHgpOworCitleHRlcm4gVlA4UXVhbnRpemVCbG9jayBWUDhFbmNRdWFudGl6ZUJsb2NrOworZXh0ZXJuIFZQOFF1YW50aXplMkJsb2NrcyBWUDhFbmNRdWFudGl6ZTJCbG9ja3M7CisKKy8vIHNwZWNpZmljIHRvIDJuZCB0cmFuc2Zvcm06Cit0eXBlZGVmIGludCAoKlZQOFF1YW50aXplQmxvY2tXSFQpKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBWUDhNYXRyaXgqIGNvbnN0IG10eCk7CitleHRlcm4gVlA4UXVhbnRpemVCbG9ja1dIVCBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUOworCitleHRlcm4gY29uc3QgaW50IFZQOERzcFNjYW5bMTYgKyA0ICsgNF07CisKKy8vIENvbGxlY3QgaGlzdG9ncmFtIGZvciBzdXNjZXB0aWJpbGl0eSBjYWxjdWxhdGlvbi4KKyNkZWZpbmUgTUFYX0NPRUZGX1RIUkVTSCAgIDMxICAgLy8gc2l6ZSBvZiBoaXN0b2dyYW0gdXNlZCBieSBDb2xsZWN0SGlzdG9ncmFtLgordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBXZSBvbmx5IG5lZWQgdG8gc3RvcmUgbWF4X3ZhbHVlIGFuZCBsYXN0X25vbl96ZXJvLCBub3QgdGhlIGRpc3RyaWJ1dGlvbi4KKyAgaW50IG1heF92YWx1ZTsKKyAgaW50IGxhc3Rfbm9uX3plcm87Cit9IFZQOEhpc3RvZ3JhbTsKK3R5cGVkZWYgdm9pZCAoKlZQOENIaXN0bykoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworZXh0ZXJuIFZQOENIaXN0byBWUDhDb2xsZWN0SGlzdG9ncmFtOworLy8gR2VuZXJhbC1wdXJwb3NlIHV0aWwgZnVuY3Rpb24gdG8gaGVscCBWUDhDb2xsZWN0SGlzdG9ncmFtKCkuCit2b2lkIFZQOFNldEhpc3RvZ3JhbURhdGEoY29uc3QgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0byk7CisKKy8vIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBhbnkgb2YgdGhlIGFib3ZlCit2b2lkIFZQOEVuY0RzcEluaXQodm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBjb3N0IGZ1bmN0aW9ucyAoZW5jb2RpbmcpCisKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhFbnRyb3B5Q29zdFsyNTZdOyAgICAgICAgLy8gOGJpdCBmaXhlZC1wb2ludCBsb2cocCkKKy8vIGFwcHJveGltYXRlIGNvc3QgcGVyIGxldmVsOgorZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsRml4ZWRDb3N0c1syMDQ3IC8qTUFYX0xFVkVMKi8gKyAxXTsKK2V4dGVybiBjb25zdCB1aW50OF90IFZQOEVuY0JhbmRzWzE2ICsgMV07CisKK3N0cnVjdCBWUDhSZXNpZHVhbDsKK3R5cGVkZWYgdm9pZCAoKlZQOFNldFJlc2lkdWFsQ29lZmZzRnVuYykoY29uc3QgaW50MTZfdCogY29uc3QgY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVlA4UmVzaWR1YWwqIGNvbnN0IHJlcyk7CitleHRlcm4gVlA4U2V0UmVzaWR1YWxDb2VmZnNGdW5jIFZQOFNldFJlc2lkdWFsQ29lZmZzOworCisvLyBDb3N0IGNhbGN1bGF0aW9uIGZ1bmN0aW9uLgordHlwZWRlZiBpbnQgKCpWUDhHZXRSZXNpZHVhbENvc3RGdW5jKShpbnQgY3R4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpOworZXh0ZXJuIFZQOEdldFJlc2lkdWFsQ29zdEZ1bmMgVlA4R2V0UmVzaWR1YWxDb3N0OworCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55dGhpbmcgdXNpbmcgdGhlIGFib3ZlCit2b2lkIFZQOEVuY0RzcENvc3RJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NJTSAvIFBTTlIgdXRpbHMKKworLy8gc3RydWN0IGZvciBhY2N1bXVsYXRpbmcgc3RhdGlzdGljYWwgbW9tZW50cwordHlwZWRlZiBzdHJ1Y3QgeworICB1aW50MzJfdCB3OyAgICAgICAgICAgICAgLy8gc3VtKHdfaSkgOiBzdW0gb2Ygd2VpZ2h0cworICB1aW50MzJfdCB4bSwgeW07ICAgICAgICAgLy8gc3VtKHdfaSAqIHhfaSksIHN1bSh3X2kgKiB5X2kpCisgIHVpbnQzMl90IHh4bSwgeHltLCB5eW07ICAvLyBzdW0od19pICogeF9pICogeF9pKSwgZXRjLgorfSBWUDhEaXN0b1N0YXRzOworCisvLyBDb21wdXRlIHRoZSBmaW5hbCBTU0lNIHZhbHVlCisvLyBUaGUgbm9uLWNsaXBwZWQgdmVyc2lvbiBhc3N1bWVzIHN0YXRzLT53ID0gKDIgKiBWUDhfU1NJTV9LRVJORUwgKyAxKV4yLgorZG91YmxlIFZQOFNTSU1Gcm9tU3RhdHMoY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMpOworZG91YmxlIFZQOFNTSU1Gcm9tU3RhdHNDbGlwcGVkKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKKworI2RlZmluZSBWUDhfU1NJTV9LRVJORUwgMyAgIC8vIHRvdGFsIHNpemUgb2YgdGhlIGtlcm5lbDogMiAqIFZQOF9TU0lNX0tFUk5FTCArIDEKK3R5cGVkZWYgZG91YmxlICgqVlA4U1NJTUdldENsaXBwZWRGdW5jKShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeG8sIGludCB5bywgIC8vIGNlbnRlciBwb3NpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBXLCBpbnQgSCk7ICAgLy8gcGxhbmUgZGltZW5zaW9uCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorLy8gVGhpcyB2ZXJzaW9uIGlzIGNhbGxlZCB3aXRoIHRoZSBndWFyYW50ZWUgdGhhdCB5b3UgY2FuIGxvYWQgOCBieXRlcyBhbmQKKy8vIDggcm93cyBhdCBvZmZzZXQgc3JjMSBhbmQgc3JjMgordHlwZWRlZiBkb3VibGUgKCpWUDhTU0lNR2V0RnVuYykoY29uc3QgdWludDhfdCogc3JjMSwgaW50IHN0cmlkZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMik7CisKK2V4dGVybiBWUDhTU0lNR2V0RnVuYyBWUDhTU0lNR2V0OyAgICAgICAgIC8vIHVuY2xpcHBlZCAvIHVuY2hlY2tlZAorZXh0ZXJuIFZQOFNTSU1HZXRDbGlwcGVkRnVuYyBWUDhTU0lNR2V0Q2xpcHBlZDsgICAvLyB3aXRoIGNsaXBwaW5nCisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK3R5cGVkZWYgdWludDMyX3QgKCpWUDhBY2N1bXVsYXRlU1NFRnVuYykoY29uc3QgdWludDhfdCogc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IGxlbik7CitleHRlcm4gVlA4QWNjdW11bGF0ZVNTRUZ1bmMgVlA4QWNjdW11bGF0ZVNTRTsKKyNlbmRpZgorCisvLyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXNpbmcgYW55IG9mIHRoZSBhYm92ZSBkaXJlY3RseQordm9pZCBWUDhTU0lNRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kaW5nCisKK3R5cGVkZWYgdm9pZCAoKlZQOERlY0lkY3QpKGNvbnN0IGludDE2X3QqIGNvZWZmcywgdWludDhfdCogZHN0KTsKKy8vIHdoZW4gZG9pbmcgdHdvIHRyYW5zZm9ybXMsIGNvZWZmcyBpcyBhY3R1YWxseSBpbnQxNl90WzJdWzE2XS4KK3R5cGVkZWYgdm9pZCAoKlZQOERlY0lkY3QyKShjb25zdCBpbnQxNl90KiBjb2VmZnMsIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3byk7CitleHRlcm4gVlA4RGVjSWRjdDIgVlA4VHJhbnNmb3JtOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtQUMzOworZXh0ZXJuIFZQOERlY0lkY3QgVlA4VHJhbnNmb3JtVVY7CitleHRlcm4gVlA4RGVjSWRjdCBWUDhUcmFuc2Zvcm1EQzsKK2V4dGVybiBWUDhEZWNJZGN0IFZQOFRyYW5zZm9ybURDVVY7CitleHRlcm4gVlA4V0hUIFZQOFRyYW5zZm9ybVdIVDsKKworLy8gKmRzdCBpcyB0aGUgZGVzdGluYXRpb24gYmxvY2ssIHdpdGggc3RyaWRlIEJQUy4gQm91bmRhcnkgc2FtcGxlcyBhcmUKKy8vIGFzc3VtZWQgYWNjZXNzaWJsZSB3aGVuIG5lZWRlZC4KK3R5cGVkZWYgdm9pZCAoKlZQOFByZWRGdW5jKSh1aW50OF90KiBkc3QpOworZXh0ZXJuIFZQOFByZWRGdW5jIFZQOFByZWRMdW1hMTZbLyogTlVNX0JfRENfTU9ERVMgKi9dOworZXh0ZXJuIFZQOFByZWRGdW5jIFZQOFByZWRDaHJvbWE4Wy8qIE5VTV9CX0RDX01PREVTICovXTsKK2V4dGVybiBWUDhQcmVkRnVuYyBWUDhQcmVkTHVtYTRbLyogTlVNX0JNT0RFUyAqL107CisKKy8vIGNsaXBwaW5nIHRhYmxlcyAoZm9yIGZpbHRlcmluZykKK2V4dGVybiBjb25zdCBpbnQ4X3QqIGNvbnN0IFZQOGtzY2xpcDE7ICAvLyBjbGlwcyBbLTEwMjAsIDEwMjBdIHRvIFstMTI4LCAxMjddCitleHRlcm4gY29uc3QgaW50OF90KiBjb25zdCBWUDhrc2NsaXAyOyAgLy8gY2xpcHMgWy0xMTIsIDExMl0gdG8gWy0xNiwgMTVdCitleHRlcm4gY29uc3QgdWludDhfdCogY29uc3QgVlA4a2NsaXAxOyAgLy8gY2xpcHMgWy0yNTUsNTExXSB0byBbMCwyNTVdCitleHRlcm4gY29uc3QgdWludDhfdCogY29uc3QgVlA4a2FiczA7ICAgLy8gYWJzKHgpIGZvciB4IGluIFstMjU1LDI1NV0KKy8vIG11c3QgYmUgY2FsbGVkIGZpcnN0Cit2b2lkIFZQOEluaXRDbGlwVGFibGVzKHZvaWQpOworCisvLyBzaW1wbGUgZmlsdGVyIChvbmx5IGZvciBsdW1hKQordHlwZWRlZiB2b2lkICgqVlA4U2ltcGxlRmlsdGVyRnVuYykodWludDhfdCogcCwgaW50IHN0cmlkZSwgaW50IHRocmVzaCk7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTY7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVIRmlsdGVyMTY7CitleHRlcm4gVlA4U2ltcGxlRmlsdGVyRnVuYyBWUDhTaW1wbGVWRmlsdGVyMTZpOyAgLy8gZmlsdGVyIDMgaW5uZXIgZWRnZXMKK2V4dGVybiBWUDhTaW1wbGVGaWx0ZXJGdW5jIFZQOFNpbXBsZUhGaWx0ZXIxNmk7CisKKy8vIHJlZ3VsYXIgZmlsdGVyIChvbiBib3RoIG1hY3JvYmxvY2sgZWRnZXMgYW5kIGlubmVyIGVkZ2VzKQordHlwZWRlZiB2b2lkICgqVlA4THVtYUZpbHRlckZ1bmMpKHVpbnQ4X3QqIGx1bWEsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7Cit0eXBlZGVmIHZvaWQgKCpWUDhDaHJvbWFGaWx0ZXJGdW5jKSh1aW50OF90KiB1LCB1aW50OF90KiB2LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaCwgaW50IGl0aHJlc2gsIGludCBoZXZfdCk7CisvLyBvbiBvdXRlciBlZGdlCitleHRlcm4gVlA4THVtYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjE2OworZXh0ZXJuIFZQOEx1bWFGaWx0ZXJGdW5jIFZQOEhGaWx0ZXIxNjsKK2V4dGVybiBWUDhDaHJvbWFGaWx0ZXJGdW5jIFZQOFZGaWx0ZXI4OworZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjg7CisKKy8vIG9uIGlubmVyIGVkZ2UKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhWRmlsdGVyMTZpOyAgIC8vIGZpbHRlcmluZyAzIGlubmVyIGVkZ2VzIGFsdG9nZXRoZXIKK2V4dGVybiBWUDhMdW1hRmlsdGVyRnVuYyBWUDhIRmlsdGVyMTZpOworZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4VkZpbHRlcjhpOyAgLy8gZmlsdGVyaW5nIHUgYW5kIHYgYWx0b2dldGhlcgorZXh0ZXJuIFZQOENocm9tYUZpbHRlckZ1bmMgVlA4SEZpbHRlcjhpOworCisvLyBEaXRoZXJpbmcuIENvbWJpbmVzIGRpdGhlcmluZyB2YWx1ZXMgKGNlbnRlcmVkIGFyb3VuZCAxMjgpIHdpdGggZHN0W10sCisvLyBhY2NvcmRpbmcgdG86IGRzdFtdID0gY2xpcChkc3RbXSArICgoKGRpdGhlcltdLTEyOCkgKyA4KSA+PiA0KQorI2RlZmluZSBWUDhfRElUSEVSX0RFU0NBTEUgNAorI2RlZmluZSBWUDhfRElUSEVSX0RFU0NBTEVfUk9VTkRFUiAoMSA8PCAoVlA4X0RJVEhFUl9ERVNDQUxFIC0gMSkpCisjZGVmaW5lIFZQOF9ESVRIRVJfQU1QX0JJVFMgNworI2RlZmluZSBWUDhfRElUSEVSX0FNUF9DRU5URVIgKDEgPDwgVlA4X0RJVEhFUl9BTVBfQklUUykKK2V4dGVybiB2b2lkICgqVlA4RGl0aGVyQ29tYmluZTh4OCkoY29uc3QgdWludDhfdCogZGl0aGVyLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RyaWRlKTsKKworLy8gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueXRoaW5nIHVzaW5nIHRoZSBhYm92ZQordm9pZCBWUDhEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUCBJL08KKworI2RlZmluZSBGQU5DWV9VUFNBTVBMSU5HICAgLy8gdW5kZWZpbmVkIHRvIHJlbW92ZSBmYW5jeSB1cHNhbXBsaW5nIHN1cHBvcnQKKworLy8gQ29udmVydCBhIHBhaXIgb2YgeS91L3YgbGluZXMgdG9nZXRoZXIgdG8gdGhlIG91dHB1dCByZ2IvYSBjb2xvcnNwYWNlLgorLy8gYm90dG9tX3kgY2FuIGJlIE5VTEwgaWYgb25seSBvbmUgbGluZSBvZiBvdXRwdXQgaXMgbmVlZGVkIChhdCB0b3AvYm90dG9tKS4KK3R5cGVkZWYgdm9pZCAoKldlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYykoCisgICAgY29uc3QgdWludDhfdCogdG9wX3ksIGNvbnN0IHVpbnQ4X3QqIGJvdHRvbV95LAorICAgIGNvbnN0IHVpbnQ4X3QqIHRvcF91LCBjb25zdCB1aW50OF90KiB0b3BfdiwKKyAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsCisgICAgdWludDhfdCogdG9wX2RzdCwgdWludDhfdCogYm90dG9tX2RzdCwgaW50IGxlbik7CisKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisKKy8vIEZhbmN5IHVwc2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgWVVWIHRvIFJHQihBKSBtb2RlcworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCisjZW5kaWYgICAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLyBQZXItcm93IHBvaW50LXNhbXBsaW5nIG1ldGhvZHMuCit0eXBlZGVmIHZvaWQgKCpXZWJQU2FtcGxlclJvd0Z1bmMpKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7CisvLyBHZW5lcmljIGZ1bmN0aW9uIHRvIGFwcGx5ICdXZWJQU2FtcGxlclJvd0Z1bmMnIHRvIHRoZSB3aG9sZSBwbGFuZToKK3ZvaWQgV2ViUFNhbXBsZXJQcm9jZXNzUGxhbmUoY29uc3QgdWludDhfdCogeSwgaW50IHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCBpbnQgdXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIFdlYlBTYW1wbGVyUm93RnVuYyBmdW5jKTsKKworLy8gU2FtcGxpbmcgZnVuY3Rpb25zIHRvIGNvbnZlcnQgcm93cyBvZiBZVVYgdG8gUkdCKEEpCitleHRlcm4gV2ViUFNhbXBsZXJSb3dGdW5jIFdlYlBTYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCisvLyBHZW5lcmFsIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHR3byBsaW5lcyBvZiBBUkdCIG9yIFJHQkEuCisvLyAnYWxwaGFfaXNfbGFzdCcgc2hvdWxkIGJlIHRydWUgaWYgMHhmZjAwMDAwMCBpcyBzdG9yZWQgaW4gbWVtb3J5IGFzCisvLyBhcyAweDAwLCAweDAwLCAweDAwLCAweGZmIChsaXR0bGUgZW5kaWFuKS4KK1dlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQR2V0TGluZVBhaXJDb252ZXJ0ZXIoaW50IGFscGhhX2lzX2xhc3QpOworCisvLyBZVVY0NDQtPlJHQiBjb252ZXJ0ZXJzCit0eXBlZGVmIHZvaWQgKCpXZWJQWVVWNDQ0Q29udmVydGVyKShjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7CisKK2V4dGVybiBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzWy8qIE1PREVfTEFTVCAqL107CisKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyB0aGUgV2ViUFVwc2FtcGxlcnNbXSAoYW5kIGZvciBwcmVtdWx0aXBsaWVkCisvLyBjb2xvcnNwYWNlcyBsaWtlIHJnYkEsIHJnYkE0NDQ0LCBldGMpCit2b2lkIFdlYlBJbml0VXBzYW1wbGVycyh2b2lkKTsKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyBXZWJQU2FtcGxlcnNbXQordm9pZCBXZWJQSW5pdFNhbXBsZXJzKHZvaWQpOworLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVzaW5nIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW10KK3ZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVJHQiAtPiBZVVYgY29udmVydGVycworCisvLyBDb252ZXJ0IEFSR0Igc2FtcGxlcyB0byBsdW1hIFkuCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvWSkoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7CisvLyBDb252ZXJ0IEFSR0Igc2FtcGxlcyB0byBVL1Ygd2l0aCBkb3duc2FtcGxpbmcuIGRvX3N0b3JlIHNob3VsZCBiZSAnMScgZm9yCisvLyBldmVuIGxpbmVzIGFuZCAnMCcgZm9yIG9kZCBvbmVzLiAnc3JjX3dpZHRoJyBpcyB0aGUgb3JpZ2luYWwgd2lkdGgsIG5vdAorLy8gdGhlIFUvViBvbmUuCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvVVYpKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpOworCisvLyBDb252ZXJ0IGEgcm93IG9mIGFjY3VtdWxhdGVkIChmb3VyLXZhbHVlcykgb2YgcmdiYTMyIHRvd2FyZCBVL1YKK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRSR0JBMzJUb1VWKShjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsIGludCB3aWR0aCk7CisKKy8vIENvbnZlcnQgUkdCIG9yIEJHUiB0byBZCitleHRlcm4gdm9pZCAoKldlYlBDb252ZXJ0UkdCMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK2V4dGVybiB2b2lkICgqV2ViUENvbnZlcnRCR1IyNFRvWSkoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpOworCisvLyB1c2VkIGZvciBwbGFpbi1DIGZhbGxiYWNrLgorZXh0ZXJuIHZvaWQgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSk7CitleHRlcm4gdm9pZCBXZWJQQ29udmVydFJHQkEzMlRvVVZfQyhjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKTsKKworLy8gdXRpbGl0aWVzIGZvciBhY2N1cmF0ZSBSR0ItPllVViBjb252ZXJzaW9uCitleHRlcm4gdWludDY0X3QgKCpXZWJQU2hhcnBZVVZVcGRhdGVZKShjb25zdCB1aW50MTZfdCogc3JjLCBjb25zdCB1aW50MTZfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IGxlbik7CitleHRlcm4gdm9pZCAoKldlYlBTaGFycFlVVlVwZGF0ZVJHQikoY29uc3QgaW50MTZfdCogc3JjLCBjb25zdCBpbnQxNl90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogZHN0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkICgqV2ViUFNoYXJwWVVWRmlsdGVyUm93KShjb25zdCBpbnQxNl90KiBBLCBjb25zdCBpbnQxNl90KiBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGJlc3RfeSwgdWludDE2X3QqIG91dCk7CisKKy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1c2luZyB0aGUgYWJvdmUuCit2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVih2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlc2NhbGVyCisKK3N0cnVjdCBXZWJQUmVzY2FsZXI7CisKKy8vIEltcG9ydCBhIHJvdyBvZiBkYXRhIGFuZCBzYXZlIGl0cyBjb250cmlidXRpb24gaW4gdGhlIHJlc2NhbGVyLgorLy8gJ2NoYW5uZWwnIGRlbm90ZXMgdGhlIGNoYW5uZWwgbnVtYmVyIHRvIGJlIGltcG9ydGVkLiAnRXhwYW5kJyBjb3JyZXNwb25kcyB0bworLy8gdGhlIHdyay0+eF9leHBhbmQgY2FzZS4gT3RoZXJ3aXNlLCAnU2hyaW5rJyBpcyB0byBiZSB1c2VkLgordHlwZWRlZiB2b2lkICgqV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYykoc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKTsKKworZXh0ZXJuIFdlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kOworZXh0ZXJuIFdlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rOworCisvLyBFeHBvcnQgb25lIHJvdyAoc3RhcnRpbmcgYXQgeF9vdXQgcG9zaXRpb24pIGZyb20gcmVzY2FsZXIuCisvLyAnRXhwYW5kJyBjb3JyZXNwb25kcyB0byB0aGUgd3JrLT55X2V4cGFuZCBjYXNlLgorLy8gT3RoZXJ3aXNlICdTaHJpbmsnIGlzIHRvIGJlIHVzZWQKK3R5cGVkZWYgdm9pZCAoKldlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMpKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7CitleHRlcm4gV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQ7CitleHRlcm4gV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbms7CisKKy8vIFBsYWluLUMgaW1wbGVtZW50YXRpb24sIGFzIGZhbGwtYmFjay4KK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9DKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfQyhzdHJ1Y3QgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX0Moc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19DKHN0cnVjdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7CisKKy8vIE1haW4gZW50cnkgY2FsbHM6CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYyk7CisvLyBFeHBvcnQgb25lIHJvdyAoc3RhcnRpbmcgYXQgeF9vdXQgcG9zaXRpb24pIGZyb20gcmVzY2FsZXIuCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3coc3RydWN0IFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKTsKKworLy8gTXVzdCBiZSBjYWxsZWQgZmlyc3QgYmVmb3JlIHVzaW5nIHRoZSBhYm92ZS4KK3ZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdCh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFV0aWxpdGllcyBmb3IgcHJvY2Vzc2luZyB0cmFuc3BhcmVudCBjaGFubmVsLgorCisvLyBBcHBseSBhbHBoYSBwcmUtbXVsdGlwbHkgb24gYW4gcmdiYSwgYmdyYSBvciBhcmdiIHBsYW5lIG9mIHNpemUgdyAqIGguCisvLyBhbHBoYV9maXJzdCBzaG91bGQgYmUgMCBmb3IgYXJnYiwgMSBmb3IgcmdiYSBvciBiZ3JhICh3aGVyZSBhbHBoYSBpcyBsYXN0KS4KK2V4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseSkoCisgICAgdWludDhfdCogcmdiYSwgaW50IGFscGhhX2ZpcnN0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOworCisvLyBTYW1lLCBidWYgc3BlY2lmaWNhbGx5IGZvciBSR0JBNDQ0NCBmb3JtYXQKK2V4dGVybiB2b2lkICgqV2ViUEFwcGx5QWxwaGFNdWx0aXBseTQ0NDQpKAorICAgIHVpbnQ4X3QqIHJnYmE0NDQ0LCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpOworCisvLyBEaXNwYXRjaCB0aGUgdmFsdWVzIGZyb20gYWxwaGFbXSBwbGFuZSB0byB0aGUgQVJHQiBkZXN0aW5hdGlvbiAnZHN0Jy4KKy8vIFJldHVybnMgdHJ1ZSBpZiBhbHBoYVtdIHBsYW5lIGhhcyBub24tdHJpdmlhbCB2YWx1ZXMgZGlmZmVyZW50IGZyb20gMHhmZi4KK2V4dGVybiBpbnQgKCpXZWJQRGlzcGF0Y2hBbHBoYSkoY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisKKy8vIFRyYW5zZmVyIHBhY2tlZCA4YiBhbHBoYVtdIHZhbHVlcyB0byBncmVlbiBjaGFubmVsIGluIGRzdFtdLCB6ZXJvJ2luZyB0aGUKKy8vIEEvUi9CIHZhbHVlcy4gJ2RzdF9zdHJpZGUnIGlzIHRoZSBzdHJpZGUgZm9yIGRzdFtdIGluIHVpbnQzMl90IHVuaXRzLgorZXh0ZXJuIHZvaWQgKCpXZWJQRGlzcGF0Y2hBbHBoYVRvR3JlZW4pKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgYWxwaGFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSk7CisKKy8vIEV4dHJhY3QgdGhlIGFscGhhIHZhbHVlcyBmcm9tIDMyYiB2YWx1ZXMgaW4gYXJnYltdIGFuZCBwYWNrIHRoZW0gaW50byBhbHBoYVtdCisvLyAodGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgV2ViUERpc3BhdGNoQWxwaGEpLgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlJ3Mgb25seSB0cml2aWFsIDB4ZmYgYWxwaGEgdmFsdWVzLgorZXh0ZXJuIGludCAoKldlYlBFeHRyYWN0QWxwaGEpKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUpOworCisvLyBFeHRyYWN0IHRoZSBncmVlbiB2YWx1ZXMgZnJvbSAzMmIgdmFsdWVzIGluIGFyZ2JbXSBhbmQgcGFjayB0aGVtIGludG8gYWxwaGFbXQorLy8gKHRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbikuCitleHRlcm4gdm9pZCAoKldlYlBFeHRyYWN0R3JlZW4pKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiBhbHBoYSwgaW50IHNpemUpOworCisvLyBQcmUtTXVsdGlwbHkgb3BlcmF0aW9uIHRyYW5zZm9ybXMgeCBpbnRvIHggKiBBIC8gMjU1ICAod2hlcmUgeD1ZLFIsRyBvciBCKS4KKy8vIFVuLU11bHRpcGx5IG9wZXJhdGlvbiB0cmFuc2Zvcm1zIHggaW50byB4ICogMjU1IC8gQS4KKworLy8gUHJlLU11bHRpcGx5IG9yIFVuLU11bHRpcGx5IChpZiAnaW52ZXJzZScgaXMgdHJ1ZSkgYXJnYiB2YWx1ZXMgaW4gYSByb3cuCitleHRlcm4gdm9pZCAoKldlYlBNdWx0QVJHQlJvdykodWludDMyX3QqIGNvbnN0IHB0ciwgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKy8vIFNhbWUgYSBXZWJQTXVsdEFSR0JSb3coKSwgYnV0IGZvciBzZXZlcmFsIHJvd3MuCit2b2lkIFdlYlBNdWx0QVJHQlJvd3ModWludDhfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgd2lkdGgsIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSk7CisKKy8vIFNhbWUgZm9yIGEgcm93IG9mIHNpbmdsZSB2YWx1ZXMsIHdpdGggc2lkZSBhbHBoYSB2YWx1ZXMuCitleHRlcm4gdm9pZCAoKldlYlBNdWx0Um93KSh1aW50OF90KiBjb25zdCBwdHIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7CisKKy8vIFNhbWUgYSBXZWJQTXVsdFJvdygpLCBidXQgZm9yIHNldmVyYWwgJ251bV9yb3dzJyByb3dzLgordm9pZCBXZWJQTXVsdFJvd3ModWludDhfdCogcHRyLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWxwaGEsIGludCBhbHBoYV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBudW1fcm93cywgaW50IGludmVyc2UpOworCisvLyBQbGFpbi1DIHZlcnNpb25zLCB1c2VkIGFzIGZhbGxiYWNrIGJ5IHNvbWUgaW1wbGVtZW50YXRpb25zLgordm9pZCBXZWJQTXVsdFJvd19DKHVpbnQ4X3QqIGNvbnN0IHB0ciwgY29uc3QgdWludDhfdCogY29uc3QgYWxwaGEsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaW52ZXJzZSk7Cit2b2lkIFdlYlBNdWx0QVJHQlJvd19DKHVpbnQzMl90KiBjb25zdCBwdHIsIGludCB3aWR0aCwgaW50IGludmVyc2UpOworCisjaWZkZWYgV09SRFNfQklHRU5ESUFOCisvLyBBUkdCIHBhY2tpbmcgZnVuY3Rpb246IGEvci9nL2IgaW5wdXQgaXMgcmdiYSBvciBiZ3JhIG9yZGVyLgorZXh0ZXJuIHZvaWQgKCpXZWJQUGFja0FSR0IpKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZywgY29uc3QgdWludDhfdCogYiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KTsKKyNlbmRpZgorCisvLyBSR0IgcGFja2luZyBmdW5jdGlvbi4gJ3N0ZXAnIGNhbiBiZSAzIG9yIDQuIHIvZy9iIGlucHV0IGlzIHJnYiBvciBiZ3Igb3JkZXIuCitleHRlcm4gdm9pZCAoKldlYlBQYWNrUkdCKShjb25zdCB1aW50OF90KiByLCBjb25zdCB1aW50OF90KiBnLCBjb25zdCB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiwgaW50IHN0ZXAsIHVpbnQzMl90KiBvdXQpOworCisvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBzcmNbaV0gY29udGFpbnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAweGZmLgorZXh0ZXJuIGludCAoKldlYlBIYXNBbHBoYThiKShjb25zdCB1aW50OF90KiBzcmMsIGludCBsZW5ndGgpOworLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgc3JjWzQqaV0gY29udGFpbnMgYSB2YWx1ZSBkaWZmZXJlbnQgZnJvbSAweGZmLgorZXh0ZXJuIGludCAoKldlYlBIYXNBbHBoYTMyYikoY29uc3QgdWludDhfdCogc3JjLCBpbnQgbGVuZ3RoKTsKKworLy8gVG8gYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB1c2luZyB0aGUgYWJvdmUuCit2b2lkIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmlsdGVyIGZ1bmN0aW9ucworCit0eXBlZGVmIGVudW0geyAgICAgLy8gRmlsdGVyIHR5cGVzLgorICBXRUJQX0ZJTFRFUl9OT05FID0gMCwKKyAgV0VCUF9GSUxURVJfSE9SSVpPTlRBTCwKKyAgV0VCUF9GSUxURVJfVkVSVElDQUwsCisgIFdFQlBfRklMVEVSX0dSQURJRU5ULAorICBXRUJQX0ZJTFRFUl9MQVNUID0gV0VCUF9GSUxURVJfR1JBRElFTlQgKyAxLCAgLy8gZW5kIG1hcmtlcgorICBXRUJQX0ZJTFRFUl9CRVNULCAgICAvLyBtZXRhLXR5cGVzCisgIFdFQlBfRklMVEVSX0ZBU1QKK30gV0VCUF9GSUxURVJfVFlQRTsKKwordHlwZWRlZiB2b2lkICgqV2ViUEZpbHRlckZ1bmMpKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogb3V0KTsKKy8vIEluLXBsYWNlIHVuLWZpbHRlcmluZy4KKy8vIFdhcm5pbmchICdwcmV2X2xpbmUnIHBvaW50ZXIgY2FuIGJlIGVxdWFsIHRvICdjdXJfbGluZScgb3IgJ3ByZWRzJy4KK3R5cGVkZWYgdm9pZCAoKldlYlBVbmZpbHRlckZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHByZXZfbGluZSwgY29uc3QgdWludDhfdCogcHJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjdXJfbGluZSwgaW50IHdpZHRoKTsKKworLy8gRmlsdGVyIHRoZSBnaXZlbiBkYXRhIHVzaW5nIHRoZSBnaXZlbiBwcmVkaWN0b3IuCisvLyAnaW4nIGNvcnJlc3BvbmRzIHRvIGEgMi1kaW1lbnNpb25hbCBwaXhlbCBhcnJheSBvZiBzaXplIChzdHJpZGUgKiBoZWlnaHQpCisvLyBpbiByYXN0ZXIgb3JkZXIuCisvLyAnc3RyaWRlJyBpcyBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW4gbGluZSAod2l0aCBwb3NzaWJsZSBwYWRkaW5nKS4KKy8vICdvdXQnIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkLgorZXh0ZXJuIFdlYlBGaWx0ZXJGdW5jIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOworCisvLyBJbi1wbGFjZSByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWx0ZXJlZCBkYXRhLgorLy8gVGhlIHJlY29uc3RydWN0aW9uIHdpbGwgYmUgZG9uZSBmb3IgJ251bV9yb3dzJyByb3dzIHN0YXJ0aW5nIGZyb20gJ3JvdycKKy8vIChhc3N1bWluZyByb3dzIHVwdG8gJ3JvdyAtIDEnIGFyZSBhbHJlYWR5IHJlY29uc3RydWN0ZWQpLgorZXh0ZXJuIFdlYlBVbmZpbHRlckZ1bmMgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKKworLy8gVG8gYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB1c2luZyB0aGUgYWJvdmUuCit2b2lkIFZQOEZpbHRlcnNJbml0KHZvaWQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9EU1BfRFNQX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuYy5jCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2RzcC9lbmMuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmMuYwppbmRleCBmYWU4ZDkzLi5mOTZlMTljIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9kc3AvZW5jLmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmMuYwpAQCAtMTIsMjYgKzEyLDI2IEBACiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQogI2VuZGlmCiAKLSNpbmNsdWRlICIuL2RzcC5oIgotI2luY2x1ZGUgIi4uL2VuYy92cDhlbmNpLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgogCiBzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBjbGlwXzhiKGludCB2KSB7CiAgIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/IHYgOiAodiA8IDApID8gMCA6IDI1NTsKIH0KIAorI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcF9tYXgoaW50IHYsIGludCBtYXgpIHsKICAgcmV0dXJuICh2ID4gbWF4KSA/IG1heCA6IHY7CiB9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIENvbXB1dGUgc3VzY2VwdGliaWxpdHkgYmFzZWQgb24gRENULWNvZWZmIGhpc3RvZ3JhbXM6CkBAIC00OCwxMCArNDgsMjggQEAKICAgOCArIDAgKiBCUFMsICAxMiArIDAgKiBCUFMsIDggKyA0ICogQlBTLCAxMiArIDQgKiBCUFMgICAgIC8vIFYKIH07CiAKLXN0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW0oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKy8vIGdlbmVyYWwtcHVycG9zZSB1dGlsIGZ1bmN0aW9uCit2b2lkIFZQOFNldEhpc3RvZ3JhbURhdGEoY29uc3QgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBpbnQgbWF4X3ZhbHVlID0gMCwgbGFzdF9ub25femVybyA9IDE7CisgIGludCBrOworICBmb3IgKGsgPSAwOyBrIDw9IE1BWF9DT0VGRl9USFJFU0g7ICsraykgeworICAgIGNvbnN0IGludCB2YWx1ZSA9IGRpc3RyaWJ1dGlvbltrXTsKKyAgICBpZiAodmFsdWUgPiAwKSB7CisgICAgICBpZiAodmFsdWUgPiBtYXhfdmFsdWUpIG1heF92YWx1ZSA9IHZhbHVlOworICAgICAgbGFzdF9ub25femVybyA9IGs7CisgICAgfQorICB9CisgIGhpc3RvLT5tYXhfdmFsdWUgPSBtYXhfdmFsdWU7CisgIGhpc3RvLT5sYXN0X25vbl96ZXJvID0gbGFzdF9ub25femVybzsKK30KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fQyhjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKICAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CiAgIGZvciAoaiA9IHN0YXJ0X2Jsb2NrOyBqIDwgZW5kX2Jsb2NrOyArK2opIHsKICAgICBpbnQgazsKICAgICBpbnQxNl90IG91dFsxNl07CkBAIC02MCwxMiArNzgsMTQgQEAKIAogICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgewotICAgICAgY29uc3QgaW50IHYgPSBhYnMob3V0W2tdKSA+PiAzOyAgLy8gVE9ETyhza2FsKTogYWRkIHJvdW5kaW5nPworICAgICAgY29uc3QgaW50IHYgPSBhYnMob3V0W2tdKSA+PiAzOwogICAgICAgY29uc3QgaW50IGNsaXBwZWRfdmFsdWUgPSBjbGlwX21heCh2LCBNQVhfQ09FRkZfVEhSRVNIKTsKLSAgICAgIGhpc3RvLT5kaXN0cmlidXRpb25bY2xpcHBlZF92YWx1ZV0rKzsKKyAgICAgICsrZGlzdHJpYnV0aW9uW2NsaXBwZWRfdmFsdWVdOwogICAgIH0KICAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOwogfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBydW4tdGltZSB0YWJsZXMgKH40aykKQEAgLTc2LDcgKzk2LDcgQEAKIC8vIGFuZCBtYWtlIHN1cmUgaXQncyBzZXQgdG8gdHJ1ZSBfbGFzdF8gKHNvIGFzIHRvIGJlIHRocmVhZC1zYWZlKQogc3RhdGljIHZvbGF0aWxlIGludCB0YWJsZXNfb2sgPSAwOwogCi1zdGF0aWMgdm9pZCBJbml0VGFibGVzKHZvaWQpIHsKK3N0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgSW5pdFRhYmxlcyh2b2lkKSB7CiAgIGlmICghdGFibGVzX29rKSB7CiAgICAgaW50IGk7CiAgICAgZm9yIChpID0gLTI1NTsgaSA8PSAyNTUgKyAyNTU7ICsraSkgewpAQCAtOTAsNiArMTEwLDggQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUcmFuc2Zvcm1zIChQYXJhZ3JhcGggMTQuNCkKIAorI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKwogI2RlZmluZSBTVE9SRSh4LCB5LCB2KSBcCiAgIGRzdFsoeCkgKyAoeSkgKiBCUFNdID0gY2xpcF84YihyZWZbKHgpICsgKHkpICogQlBTXSArICgodikgPj4gMykpCiAKQEAgLTEzMCwxNSArMTUyLDE1IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgSVRyYW5zZm9ybShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fQyhjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgewogICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CiAgIGlmIChkb190d28pIHsKICAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOwogICB9CiB9CiAKLXN0YXRpYyB2b2lkIEZUcmFuc2Zvcm0oY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsIGludDE2X3QqIG91dCkgeworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLCBpbnQxNl90KiBvdXQpIHsKICAgaW50IGk7CiAgIGludCB0bXBbMTZdOwogICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpLCBzcmMgKz0gQlBTLCByZWYgKz0gQlBTKSB7CkBAIC0xNjYsMzcgKzE4OCwxOCBAQAogICAgIG91dFsxMisgaV0gPSAoKGEzICogMjIxNyAtIGEyICogNTM1MiArIDUxMDAwKSA+PiAxNik7CiAgIH0KIH0KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogCi1zdGF0aWMgdm9pZCBJVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKLSAgaW50IHRtcFsxNl07Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgY29uc3QgaW50IGEwID0gaW5bMCArIGldICsgaW5bMTIgKyBpXTsKLSAgICBjb25zdCBpbnQgYTEgPSBpbls0ICsgaV0gKyBpblsgOCArIGldOwotICAgIGNvbnN0IGludCBhMiA9IGluWzQgKyBpXSAtIGluWyA4ICsgaV07Ci0gICAgY29uc3QgaW50IGEzID0gaW5bMCArIGldIC0gaW5bMTIgKyBpXTsKLSAgICB0bXBbMCAgKyBpXSA9IGEwICsgYTE7Ci0gICAgdG1wWzggICsgaV0gPSBhMCAtIGExOwotICAgIHRtcFs0ICArIGldID0gYTMgKyBhMjsKLSAgICB0bXBbMTIgKyBpXSA9IGEzIC0gYTI7Ci0gIH0KLSAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIGNvbnN0IGludCBkYyA9IHRtcFswICsgaSAqIDRdICsgMzsgICAgLy8gdy8gcm91bmRlcgotICAgIGNvbnN0IGludCBhMCA9IGRjICAgICAgICAgICAgICsgdG1wWzMgKyBpICogNF07Ci0gICAgY29uc3QgaW50IGExID0gdG1wWzEgKyBpICogNF0gKyB0bXBbMiArIGkgKiA0XTsKLSAgICBjb25zdCBpbnQgYTIgPSB0bXBbMSArIGkgKiA0XSAtIHRtcFsyICsgaSAqIDRdOwotICAgIGNvbnN0IGludCBhMyA9IGRjICAgICAgICAgICAgIC0gdG1wWzMgKyBpICogNF07Ci0gICAgb3V0WyAwXSA9IChhMCArIGExKSA+PiAzOwotICAgIG91dFsxNl0gPSAoYTMgKyBhMikgPj4gMzsKLSAgICBvdXRbMzJdID0gKGEwIC0gYTEpID4+IDM7Ci0gICAgb3V0WzQ4XSA9IChhMyAtIGEyKSA+PiAzOwotICAgIG91dCArPSA2NDsKLSAgfQorc3RhdGljIHZvaWQgRlRyYW5zZm9ybTJfQyhjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIFZQOEZUcmFuc2Zvcm0oc3JjLCByZWYsIG91dCk7CisgIFZQOEZUcmFuc2Zvcm0oc3JjICsgNCwgcmVmICsgNCwgb3V0ICsgMTYpOwogfQogCi1zdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX0MoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgewogICAvLyBpbnB1dCBpcyAxMmIgc2lnbmVkCi0gIGludDE2X3QgdG1wWzE2XTsKKyAgaW50MzJfdCB0bXBbMTZdOwogICBpbnQgaTsKICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSwgaW4gKz0gNjQpIHsKICAgICBjb25zdCBpbnQgYTAgPSAoaW5bMCAqIDE2XSArIGluWzIgKiAxNl0pOyAgLy8gMTNiCkBAIC0yMjMsNiArMjI2LDcgQEAKICAgICBvdXRbMTIgKyBpXSA9IGIzID4+IDE7CiAgIH0KIH0KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQogCiAjdW5kZWYgTVVMCiAjdW5kZWYgU1RPUkUKQEAgLTIzMCwyMCArMjM0LDE4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSW50cmEgcHJlZGljdGlvbnMKIAotI2RlZmluZSBEU1QoeCwgeSkgZHN0Wyh4KSArICh5KSAqIEJQU10KLQogc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRmlsbCh1aW50OF90KiBkc3QsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKICAgaW50IGo7CiAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIHsKLSAgICBTYk1lbW9yeVNldChkc3QgKyBqICogQlBTLCB2YWx1ZSwgc2l6ZSk7CisgICAgbWVtc2V0KGRzdCArIGogKiBCUFMsIHZhbHVlLCBzaXplKTsKICAgfQogfQogCiBzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWZXJ0aWNhbFByZWQodWludDhfdCogZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwgaW50IHNpemUpIHsKICAgaW50IGo7Ci0gIGlmICh0b3ApIHsKLSAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBTYk1lbW9yeUNvcHkoZHN0ICsgaiAqIEJQUywgdG9wLCBzaXplKTsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgZm9yIChqID0gMDsgaiA8IHNpemU7ICsraikgbWVtY3B5KGRzdCArIGogKiBCUFMsIHRvcCwgc2l6ZSk7CiAgIH0gZWxzZSB7CiAgICAgRmlsbChkc3QsIDEyNywgc2l6ZSk7CiAgIH0KQEAgLTI1MSwxMCArMjUzLDEwIEBACiAKIHN0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkKHVpbnQ4X3QqIGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGludCBzaXplKSB7Ci0gIGlmIChsZWZ0KSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKICAgICBpbnQgajsKICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSB7Ci0gICAgICBTYk1lbW9yeVNldChkc3QgKyBqICogQlBTLCBsZWZ0W2pdLCBzaXplKTsKKyAgICAgIG1lbXNldChkc3QgKyBqICogQlBTLCBsZWZ0W2pdLCBzaXplKTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgRmlsbChkc3QsIDEyOSwgc2l6ZSk7CkBAIC0yNjQsOCArMjY2LDggQEAKIHN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24odWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3AsIGludCBzaXplKSB7CiAgIGludCB5OwotICBpZiAobGVmdCkgewotICAgIGlmICh0b3ApIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmICh0b3AgIT0gTlVMTCkgewogICAgICAgY29uc3QgdWludDhfdCogY29uc3QgY2xpcCA9IGNsaXAxICsgMjU1IC0gbGVmdFstMV07CiAgICAgICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGNsaXBfdGFibGUgPSBjbGlwICsgbGVmdFt5XTsKQEAgLTI4Myw3ICsyODUsNyBAQAogICAgIC8vIGlzIGVxdWl2YWxlbnQgdG8gVkUgcHJlZGljdGlvbiB3aGVyZSB5b3UganVzdCBjb3B5IHRoZSB0b3Agc2FtcGxlcy4KICAgICAvLyBOb3RlIHRoYXQgaWYgdG9wIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IHZhbHVlIGlzCiAgICAgLy8gdGhlbiAxMjksIGFuZCBub3QgMTI3IGFzIGluIHRoZSBWZXJ0aWNhbFByZWQgY2FzZS4KLSAgICBpZiAodG9wKSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CiAgICAgICBWZXJ0aWNhbFByZWQoZHN0LCB0b3AsIHNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICBGaWxsKGRzdCwgMTI5LCBzaXplKTsKQEAgLTI5NiwxNSArMjk4LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsIGludCByb3VuZCwgaW50IHNoaWZ0KSB7CiAgIGludCBEQyA9IDA7CiAgIGludCBqOwotICBpZiAodG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgewogICAgIGZvciAoaiA9IDA7IGogPCBzaXplOyArK2opIERDICs9IHRvcFtqXTsKLSAgICBpZiAobGVmdCkgeyAgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CisgICAgaWYgKGxlZnQgIT0gTlVMTCkgeyAgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CiAgICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSBsZWZ0W2pdOwogICAgIH0gZWxzZSB7ICAgICAgLy8gdG9wLCBidXQgbm8gbGVmdAogICAgICAgREMgKz0gREM7CiAgICAgfQogICAgIERDID0gKERDICsgcm91bmQpID4+IHNoaWZ0OwotICB9IGVsc2UgaWYgKGxlZnQpIHsgICAvLyBsZWZ0IGJ1dCBubyB0b3AKKyAgfSBlbHNlIGlmIChsZWZ0ICE9IE5VTEwpIHsgICAvLyBsZWZ0IGJ1dCBubyB0b3AKICAgICBmb3IgKGogPSAwOyBqIDwgc2l6ZTsgKytqKSBEQyArPSBsZWZ0W2pdOwogICAgIERDICs9IERDOwogICAgIERDID0gKERDICsgcm91bmQpID4+IHNoaWZ0OwpAQCAtMzE3LDggKzMxOSw4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQ2hyb21hIDh4OCBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMikKIAotc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkcyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworc3RhdGljIHZvaWQgSW50cmFDaHJvbWFQcmVkc19DKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKICAgLy8gVSBibG9jawogICBEQ01vZGUoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCwgOCwgOCwgNCk7CiAgIFZlcnRpY2FsUHJlZChDOFZFOCArIGRzdCwgdG9wLCA4KTsKQEAgLTMyNiw4ICszMjgsOCBAQAogICBUcnVlTW90aW9uKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOwogICAvLyBWIGJsb2NrCiAgIGRzdCArPSA4OwotICBpZiAodG9wKSB0b3AgKz0gODsKLSAgaWYgKGxlZnQpIGxlZnQgKz0gMTY7CisgIGlmICh0b3AgIT0gTlVMTCkgdG9wICs9IDg7CisgIGlmIChsZWZ0ICE9IE5VTEwpIGxlZnQgKz0gMTY7CiAgIERDTW9kZShDOERDOCArIGRzdCwgbGVmdCwgdG9wLCA4LCA4LCA0KTsKICAgVmVydGljYWxQcmVkKEM4VkU4ICsgZHN0LCB0b3AsIDgpOwogICBIb3Jpem9udGFsUHJlZChDOEhFOCArIGRzdCwgbGVmdCwgOCk7CkBAIC0zMzcsOCArMzM5LDggQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQogCi1zdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHModWludDhfdCogZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworc3RhdGljIHZvaWQgSW50cmExNlByZWRzX0ModWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgY29uc3QgdWludDhfdCogdG9wKSB7CiAgIERDTW9kZShJMTZEQzE2ICsgZHN0LCBsZWZ0LCB0b3AsIDE2LCAxNiwgNSk7CiAgIFZlcnRpY2FsUHJlZChJMTZWRTE2ICsgZHN0LCB0b3AsIDE2KTsKICAgSG9yaXpvbnRhbFByZWQoSTE2SEUxNiArIGRzdCwgbGVmdCwgMTYpOwpAQCAtMzQ4LDcgKzM1MCw4IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gbHVtYSA0eDQgcHJlZGljdGlvbgogCi0jZGVmaW5lIEFWRzMoYSwgYiwgYykgKCgoYSkgKyAyICogKGIpICsgKGMpICsgMikgPj4gMikKKyNkZWZpbmUgRFNUKHgsIHkpIGRzdFsoeCkgKyAoeSkgKiBCUFNdCisjZGVmaW5lIEFWRzMoYSwgYiwgYykgKCh1aW50OF90KSgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpKQogI2RlZmluZSBBVkcyKGEsIGIpICgoKGEpICsgKGIpICsgMSkgPj4gMSkKIAogc3RhdGljIHZvaWQgVkU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7ICAgIC8vIHZlcnRpY2FsCkBAIC0zNjAsNyArMzYzLDcgQEAKICAgfTsKICAgaW50IGk7CiAgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBTYk1lbW9yeUNvcHkoZHN0ICsgaSAqIEJQUywgdmFscywgNCk7CisgICAgbWVtY3B5KGRzdCArIGkgKiBCUFMsIHZhbHMsIDQpOwogICB9CiB9CiAKQEAgLTM3MCwxMCArMzczLDEwIEBACiAgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKICAgY29uc3QgaW50IEsgPSB0b3BbLTRdOwogICBjb25zdCBpbnQgTCA9IHRvcFstNV07Ci0gICoodWludDMyX3QqKShkc3QgKyAwICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKTsKLSAgKih1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpID0gMHgwMTAxMDEwMVUgKiBBVkczKEksIEosIEspOwotICAqKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUykgPSAweDAxMDEwMTAxVSAqIEFWRzMoSiwgSywgTCk7Ci0gICoodWludDMyX3QqKShkc3QgKyAzICogQlBTKSA9IDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSSwgSiwgSykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKSk7CiB9CiAKIHN0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewpAQCAtNTIwLDcgKzUyMyw3IEBACiAKIC8vIExlZnQgc2FtcGxlcyBhcmUgdG9wWy01IC4uIC0yXSwgdG9wX2xlZnQgaXMgdG9wWy0xXSwgdG9wIGFyZQogLy8gbG9jYXRlZCBhdCB0b3BbMC4uM10sIGFuZCB0b3AgcmlnaHQgaXMgdG9wWzQuLjddCi1zdGF0aWMgdm9pZCBJbnRyYTRQcmVkcyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworc3RhdGljIHZvaWQgSW50cmE0UHJlZHNfQyh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgewogICBEQzQoSTREQzQgKyBkc3QsIHRvcCk7CiAgIFRNNChJNFRNNCArIGRzdCwgdG9wKTsKICAgVkU0KEk0VkU0ICsgZHN0LCB0b3ApOwpAQCAtNTM2LDYgKzUzOSw3IEBACiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWV0cmljCiAKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiBzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldFNTRShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CiAgIGludCBjb3VudCA9IDA7CkBAIC01NTEsMTggKzU1NSwzMyBAQAogICByZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBpbnQgU1NFMTZ4MTYoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworc3RhdGljIGludCBTU0UxNngxNl9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKICAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgMTYpOwogfQotc3RhdGljIGludCBTU0UxNng4KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKK3N0YXRpYyBpbnQgU1NFMTZ4OF9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKICAgcmV0dXJuIEdldFNTRShhLCBiLCAxNiwgOCk7CiB9Ci1zdGF0aWMgaW50IFNTRTh4OChjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CitzdGF0aWMgaW50IFNTRTh4OF9DKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKICAgcmV0dXJuIEdldFNTRShhLCBiLCA4LCA4KTsKIH0KLXN0YXRpYyBpbnQgU1NFNHg0KGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKK3N0YXRpYyBpbnQgU1NFNHg0X0MoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgewogICByZXR1cm4gR2V0U1NFKGEsIGIsIDQsIDQpOwogfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIE1lYW4xNng0X0MoY29uc3QgdWludDhfdCogcmVmLCB1aW50MzJfdCBkY1s0XSkgeworICBpbnQgaywgeCwgeTsKKyAgZm9yIChrID0gMDsgayA8IDQ7ICsraykgeworICAgIHVpbnQzMl90IGF2ZyA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDQ7ICsreCkgeworICAgICAgICBhdmcgKz0gcmVmW3ggKyB5ICogQlBTXTsKKyAgICAgIH0KKyAgICB9CisgICAgZGNba10gPSBhdmc7CisgICAgcmVmICs9IDQ7ICAgLy8gZ28gdG8gbmV4dCA0eDQgYmxvY2suCisgIH0KK30KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFRleHR1cmUgZGlzdG9ydGlvbgpAQCAtNTcwLDggKzU4OSwxMCBAQAogLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCiAvLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCiAKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiAvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KIC8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgogc3RhdGljIGludCBUVHJhbnNmb3JtKGNvbnN0IHVpbnQ4X3QqIGluLCBjb25zdCB1aW50MTZfdCogdykgewogICBpbnQgc3VtID0gMDsKICAgaW50IHRtcFsxNl07CkBAIC02MDYsMjQgKzYyNywyNSBAQAogICByZXR1cm4gc3VtOwogfQogCi1zdGF0aWMgaW50IERpc3RvNHg0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CitzdGF0aWMgaW50IERpc3RvNHg0X0MoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewogICBjb25zdCBpbnQgc3VtMSA9IFRUcmFuc2Zvcm0oYSwgdyk7CiAgIGNvbnN0IGludCBzdW0yID0gVFRyYW5zZm9ybShiLCB3KTsKICAgcmV0dXJuIGFicyhzdW0yIC0gc3VtMSkgPj4gNTsKIH0KIAotc3RhdGljIGludCBEaXN0bzE2eDE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9DKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgewogICBpbnQgRCA9IDA7CiAgIGludCB4LCB5OwogICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgewogICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7Ci0gICAgICBEICs9IERpc3RvNHg0KGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICAgIEQgKz0gRGlzdG80eDRfQyhhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CiAgICAgfQogICB9CiAgIHJldHVybiBEOwogfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBRdWFudGl6YXRpb24KQEAgLTYzNCwyMiArNjU2LDI0IEBACiB9OwogCiAvLyBTaW1wbGUgcXVhbnRpemF0aW9uCi1zdGF0aWMgaW50IFF1YW50aXplQmxvY2soaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiwgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19DKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgewogICBpbnQgbGFzdCA9IC0xOwotICBmb3IgKDsgbiA8IDE2OyArK24pIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7CiAgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOwogICAgIGNvbnN0IGludCBzaWduID0gKGluW2pdIDwgMCk7Ci0gICAgY29uc3QgaW50IGNvZWZmID0gKHNpZ24gPyAtaW5bal0gOiBpbltqXSkgKyBtdHgtPnNoYXJwZW5fW2pdOworICAgIGNvbnN0IHVpbnQzMl90IGNvZWZmID0gKHNpZ24gPyAtaW5bal0gOiBpbltqXSkgKyBtdHgtPnNoYXJwZW5fW2pdOwogICAgIGlmIChjb2VmZiA+IG10eC0+enRocmVzaF9bal0pIHsKLSAgICAgIGNvbnN0IGludCBRID0gbXR4LT5xX1tqXTsKLSAgICAgIGNvbnN0IGludCBpUSA9IG10eC0+aXFfW2pdOwotICAgICAgY29uc3QgaW50IEIgPSBtdHgtPmJpYXNfW2pdOwotICAgICAgb3V0W25dID0gUVVBTlRESVYoY29lZmYsIGlRLCBCKTsKLSAgICAgIGlmIChvdXRbbl0gPiBNQVhfTEVWRUwpIG91dFtuXSA9IE1BWF9MRVZFTDsKLSAgICAgIGlmIChzaWduKSBvdXRbbl0gPSAtb3V0W25dOwotICAgICAgaW5bal0gPSBvdXRbbl0gKiBROwotICAgICAgaWYgKG91dFtuXSkgbGFzdCA9IG47CisgICAgICBjb25zdCB1aW50MzJfdCBRID0gbXR4LT5xX1tqXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGlRID0gbXR4LT5pcV9bal07CisgICAgICBjb25zdCB1aW50MzJfdCBCID0gbXR4LT5iaWFzX1tqXTsKKyAgICAgIGludCBsZXZlbCA9IFFVQU5URElWKGNvZWZmLCBpUSwgQik7CisgICAgICBpZiAobGV2ZWwgPiBNQVhfTEVWRUwpIGxldmVsID0gTUFYX0xFVkVMOworICAgICAgaWYgKHNpZ24pIGxldmVsID0gLWxldmVsOworICAgICAgaW5bal0gPSBsZXZlbCAqIChpbnQpUTsKKyAgICAgIG91dFtuXSA9IGxldmVsOworICAgICAgaWYgKGxldmVsKSBsYXN0ID0gbjsKICAgICB9IGVsc2UgewogICAgICAgb3V0W25dID0gMDsKICAgICAgIGluW2pdID0gMDsKQEAgLTY1OCwxOSArNjgyLDM1IEBACiAgIHJldHVybiAobGFzdCA+PSAwKTsKIH0KIAorI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUgfHwgV0VCUF9ORU9OX1dPUktfQVJPVU5EX0dDQworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfQyhpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFZQOEVuY1F1YW50aXplQmxvY2soaW4gKyAwICogMTYsIG91dCArIDAgKiAxNiwgbXR4KSA8PCAwOworICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFIHx8IFdFQlBfTkVPTl9XT1JLX0FST1VORF9HQ0MKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEJsb2NrIGNvcHkKIAotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29weShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHNpemUpIHsKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvcHkoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCB3LCBpbnQgaCkgewogICBpbnQgeTsKLSAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgc2l6ZSk7CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOwogICAgIHNyYyArPSBCUFM7CiAgICAgZHN0ICs9IEJQUzsKICAgfQogfQogCi1zdGF0aWMgdm9pZCBDb3B5NHg0KGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0KSB7IENvcHkoc3JjLCBkc3QsIDQpOyB9CitzdGF0aWMgdm9pZCBDb3B5NHg0X0MoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgQ29weShzcmMsIGRzdCwgNCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIENvcHkxNng4X0MoY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QpIHsKKyAgQ29weShzcmMsIGRzdCwgMTYsIDgpOworfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSW5pdGlhbGl6YXRpb24KQEAgLTY4MCw3ICs3MjAsNyBAQAogVlA4Q0hpc3RvIFZQOENvbGxlY3RIaXN0b2dyYW07CiBWUDhJZGN0IFZQOElUcmFuc2Zvcm07CiBWUDhGZGN0IFZQOEZUcmFuc2Zvcm07Ci1WUDhXSFQgVlA4SVRyYW5zZm9ybVdIVDsKK1ZQOEZkY3QgVlA4RlRyYW5zZm9ybTI7CiBWUDhXSFQgVlA4RlRyYW5zZm9ybVdIVDsKIFZQOEludHJhNFByZWRzIFZQOEVuY1ByZWRMdW1hNDsKIFZQOEludHJhUHJlZHMgVlA4RW5jUHJlZEx1bWExNjsKQEAgLTY5MSw0NyArNzMxLDExMiBAQAogVlA4TWV0cmljIFZQOFNTRTR4NDsKIFZQOFdNZXRyaWMgVlA4VERpc3RvNHg0OwogVlA4V01ldHJpYyBWUDhURGlzdG8xNngxNjsKK1ZQOE1lYW5NZXRyaWMgVlA4TWVhbjE2eDQ7CiBWUDhRdWFudGl6ZUJsb2NrIFZQOEVuY1F1YW50aXplQmxvY2s7CitWUDhRdWFudGl6ZTJCbG9ja3MgVlA4RW5jUXVhbnRpemUyQmxvY2tzOworVlA4UXVhbnRpemVCbG9ja1dIVCBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUOwogVlA4QmxvY2tDb3B5IFZQOENvcHk0eDQ7CitWUDhCbG9ja0NvcHkgVlA4Q29weTE2eDg7CiAKIGV4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdFNTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdEFWWDIodm9pZCk7CiBleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTMzIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1TQSh2b2lkKTsKIAotdm9pZCBWUDhFbmNEc3BJbml0KHZvaWQpIHsKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhFbmNEc3BJbml0KSB7CisgIFZQOERzcEluaXQoKTsgIC8vIGNvbW1vbiBpbnZlcnNlIHRyYW5zZm9ybXMKICAgSW5pdFRhYmxlcygpOwogCiAgIC8vIGRlZmF1bHQgQyBpbXBsZW1lbnRhdGlvbnMKLSAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW07Ci0gIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtOwotICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybTsKLSAgVlA4SVRyYW5zZm9ybVdIVCA9IElUcmFuc2Zvcm1XSFQ7Ci0gIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUOwotICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkczsKLSAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkczsKLSAgVlA4RW5jUHJlZENocm9tYTggPSBJbnRyYUNocm9tYVByZWRzOwotICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2OwotICBWUDhTU0U4eDggPSBTU0U4eDg7Ci0gIFZQOFNTRTE2eDggPSBTU0UxNng4OwotICBWUDhTU0U0eDQgPSBTU0U0eDQ7Ci0gIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0OwotICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTY7Ci0gIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrOwotICBWUDhDb3B5NHg0ID0gQ29weTR4NDsKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX0M7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX0M7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX0M7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X0M7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9DOworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9DOworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X0M7CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X0M7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9DOworICBWUDhTU0U0eDQgPSBTU0U0eDRfQzsKKyNlbmRpZgorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fCBXRUJQX05FT05fV09SS19BUk9VTkRfR0NDCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX0M7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19DOworI2VuZGlmCisKKyAgVlA4RlRyYW5zZm9ybTIgPSBGVHJhbnNmb3JtMl9DOworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkc19DOworICBWUDhFbmNQcmVkTHVtYTE2ID0gSW50cmExNlByZWRzX0M7CisgIFZQOEVuY1ByZWRDaHJvbWE4ID0gSW50cmFDaHJvbWFQcmVkc19DOworICBWUDhNZWFuMTZ4NCA9IE1lYW4xNng0X0M7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrX0M7CisgIFZQOENvcHk0eDQgPSBDb3B5NHg0X0M7CisgIFZQOENvcHkxNng4ID0gQ29weTE2eDhfQzsKIAogICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgotICBpZiAoVlA4R2V0Q1BVSW5mbykgeworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CiAjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQogICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgewogICAgICAgVlA4RW5jRHNwSW5pdFNTRTIoKTsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgICAgVlA4RW5jRHNwSW5pdFNTRTQxKCk7CisgICAgICB9CisjZW5kaWYKICAgICB9Ci0jZWxpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCi0gICAgaWYgKFZQOEdldENQVUluZm8oa05FT04pKSB7Ci0gICAgICBWUDhFbmNEc3BJbml0TkVPTigpOworI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9BVlgyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtBVlgyKSkgeworICAgICAgVlA4RW5jRHNwSW5pdEFWWDIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgVlA4RW5jRHNwSW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOEVuY0RzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgVlA4RW5jRHNwSW5pdE1TQSgpOwogICAgIH0KICNlbmRpZgogICB9Ci19CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgVlA4RW5jRHNwSW5pdE5FT04oKTsKKyAgfQogI2VuZGlmCisKKyAgYXNzZXJ0KFZQOElUcmFuc2Zvcm0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhGVHJhbnNmb3JtICE9IE5VTEwpOworICBhc3NlcnQoVlA4RlRyYW5zZm9ybVdIVCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFREaXN0bzR4NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFREaXN0bzE2eDE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4Q29sbGVjdEhpc3RvZ3JhbSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNTRTE2eDE2ICE9IE5VTEwpOworICBhc3NlcnQoVlA4U1NFMTZ4OCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNTRTh4OCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOFNTRTR4NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1F1YW50aXplQmxvY2sgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNRdWFudGl6ZTJCbG9ja3MgIT0gTlVMTCk7CisgIGFzc2VydChWUDhGVHJhbnNmb3JtMiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1ByZWRMdW1hNCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOEVuY1ByZWRMdW1hMTYgIT0gTlVMTCk7CisgIGFzc2VydChWUDhFbmNQcmVkQ2hyb21hOCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOE1lYW4xNng0ICE9IE5VTEwpOworICBhc3NlcnQoVlA4RW5jUXVhbnRpemVCbG9ja1dIVCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOENvcHk0eDQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhDb3B5MTZ4OCAhPSBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX2F2eDIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX2F2eDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM1Nzk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfYXZ4Mi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBVlgyIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfQVZYMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9BVlgyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdEFWWDIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxOGYwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzMzIuYwpAQCAtMCwwICsxLDY3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBzcGVlZC1jcml0aWNhbCBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yKHMpOiBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgU2xvYm9kYW4gUHJpamljICAoc2xvYm9kYW4ucHJpamljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpbmNsdWRlICJzcmMvZHNwL21pcHNfbWFjcm8uaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorCitzdGF0aWMgY29uc3QgaW50IGtDMSA9IDIwMDkxICsgKDEgPDwgMTYpOworc3RhdGljIGNvbnN0IGludCBrQzIgPSAzNTQ2ODsKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIElUcmFuc2Zvcm1PbmUKKy8vIE1VTCBtYWNybyBpbmxpbmVkCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQS4uRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIGluIGJ1ZmZlcgorLy8gVEVNUDAuLlRFTVAzIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworLy8gVEVNUDQuLlRFTVA1IC0gdGVtcG9yYXJ5IHJlZ2lzdGVycworI2RlZmluZSBWRVJUSUNBTF9QQVNTKEEsIEIsIEMsIEQsIFRFTVA0LCBURU1QMCwgVEVNUDEsIFRFTVAyLCBURU1QMykgICAgICAgIFwKKyAgImxoICAgICAgJVt0ZW1wMTZdLCAgICAgICIgI0EgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsaCAgICAgICVbdGVtcDE4XSwgICAgICAiICNCICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGggICAgICAlW3RlbXAxN10sICAgICAgIiAjQyAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgImxoICAgICAgJVt0ZW1wMTldLCAgICAgICIgI0QgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDQgIl0sICAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxOF0gICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAlW3RlbXAxNl0sICAgICAgJVt0ZW1wMTZdLCAgICAgICVbdGVtcDE4XSAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVsiICNURU1QMCAiXSwgICAgJVt0ZW1wMTddLCAgICAgICVba0MyXSAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbdGVtcDE4XSwgICAgICAlW3RlbXAxOV0sICAgICAgJVtrQzFdICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAlW3RlbXAxN10sICAgICAgJVt0ZW1wMTddLCAgICAgICVba0MxXSAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgJVt0ZW1wMTldLCAgICAgICVbdGVtcDE5XSwgICAgICAlW2tDMl0gICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDAgIl0sICAgIDE2ICAgICAgICAgICAgXG5cbiIgICAgICAgICAgXAorICAic3JhICAgICAlW3RlbXAxOF0sICAgICAgJVt0ZW1wMThdLCAgICAgIDE2ICAgICAgICAgICAgICAgIFxuXG4iICAgICAgICAgIFwKKyAgInNyYSAgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE3XSwgICAgICAxNiAgICAgICAgICAgICAgICBcblxuIiAgICAgICAgICBcCisgICJzcmEgICAgICVbdGVtcDE5XSwgICAgICAlW3RlbXAxOV0sICAgICAgMTYgICAgICAgICAgICAgICAgXG5cbiIgICAgICAgICAgXAorICAic3VidSAgICAlWyIgI1RFTVAyICJdLCAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAxOF0gICAgIFxuXHQiICAgICAgICAgIFwKKyAgImFkZHUgICAgJVsiICNURU1QMyAiXSwgICAgJVt0ZW1wMTddLCAgICAgICVbdGVtcDE5XSAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDMgIl0gXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAlWyIgI1RFTVAxICJdLCAgICAlW3RlbXAxNl0sICAgICAgJVsiICNURU1QMiAiXSAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgJVsiICNURU1QMiAiXSwgICAgJVt0ZW1wMTZdLCAgICAgICVbIiAjVEVNUDIgIl0gICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDMgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDMgIl0gXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSBob3Jpem9udGFsIHBhc3MgaW4gSVRyYW5zZm9ybU9uZQorLy8gTVVMIGFuZCBTVE9SRSBtYWNyb3MgaW5saW5lZAorLy8gYSA9IGNsaXBfOGIoYSkgaXMgcmVwbGFjZWQgd2l0aDogYSA9IG1heChhLCAwKTsgYSA9IG1pbihhLCAyNTUpCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQSAtIG9mZnNldCBpbiBieXRlcyB0byBsb2FkIGZyb20gcmVmIGFuZCBzdG9yZSB0byBkc3QgYnVmZmVyCisvLyBURU1QMCwgVEVNUDQsIFRFTVA4IGFuZCBURU1QMTIgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTUyhBLCBURU1QMCwgVEVNUDQsIFRFTVA4LCBURU1QMTIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDAgIl0sICAgIDQgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA4ICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDE3XSwgICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA4ICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgICVba0MyXSAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDggIl0sICAgICVbIiAjVEVNUDEyICJdLCAgICVba0MxXSAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgICVba0MxXSAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICVbIiAjVEVNUDEyICJdLCAgICVbIiAjVEVNUDEyICJdLCAgICVba0MyXSAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDAgIl0sICAgIDE2ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDggIl0sICAgICVbIiAjVEVNUDggIl0sICAgIDE2ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgIDE2ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDEyICJdLCAgICVbIiAjVEVNUDEyICJdLCAgIDE2ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDE4XSwgICAgICAlWyIgI1RFTVAwICJdLCAgICAlWyIgI1RFTVA4ICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbdGVtcDE5XSwgICAgICAlWyIgI1RFTVA0ICJdLCAgICAlWyIgI1RFTVAxMiAiXSAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxOV0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDQgIl0sICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDggIl0sICAgICVbdGVtcDE3XSwgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICVbIiAjVEVNUDEyICJdLCAgICVbdGVtcDE2XSwgICAgICAlW3RlbXAxOV0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsdyAgICAgICVbdGVtcDIwXSwgICAgICAwKCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDAgIl0sICAgICVbIiAjVEVNUDAgIl0sICAgIDMgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDQgIl0sICAgICVbIiAjVEVNUDQgIl0sICAgIDMgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDggIl0sICAgICVbIiAjVEVNUDggIl0sICAgIDMgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmEgICAgICVbIiAjVEVNUDEyICJdLCAgICVbIiAjVEVNUDEyICJdLCAgIDMgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDE2XSwgICAgICAwKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDIwXSkgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDE3XSwgICAgICAxKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDIwXSkgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDE4XSwgICAgICAyKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDIwXSkgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICVbdGVtcDE5XSwgICAgICAzKyIgWFNUUihCUFMpICIqIiAjQSAiKCVbdGVtcDIwXSkgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAwICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDQgIl0sICAgICVbdGVtcDE3XSwgICAgICAlWyIgI1RFTVA0ICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDggIl0sICAgICVbdGVtcDE4XSwgICAgICAlWyIgI1RFTVA4ICJdICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICVbIiAjVEVNUDEyICJdLCAgICVbdGVtcDE5XSwgICAgICAlWyIgI1RFTVAxMiAiXSAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAwICJdLCAgICAkemVybyAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE3XSwgICAgICAlWyIgI1RFTVA0ICJdLCAgICAkemVybyAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE4XSwgICAgICAlWyIgI1RFTVA4ICJdLCAgICAkemVybyAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE5XSwgICAgICAlWyIgI1RFTVAxMiAiXSwgICAkemVybyAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3ZuICAgICVbIiAjVEVNUDAgIl0sICAgICR6ZXJvLCAgICAgICAgICAlW3RlbXAxNl0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3ZuICAgICVbIiAjVEVNUDQgIl0sICAgICR6ZXJvLCAgICAgICAgICAlW3RlbXAxN10gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3ZuICAgICVbIiAjVEVNUDggIl0sICAgICR6ZXJvLCAgICAgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3ZuICAgICVbIiAjVEVNUDEyICJdLCAgICR6ZXJvLCAgICAgICAgICAlW3RlbXAxOV0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGRpdSAgICVbdGVtcDIwXSwgICAgICAkemVybywgICAgICAgICAgMjU1ICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE2XSwgICAgICAlWyIgI1RFTVAwICJdLCAgICAlW3RlbXAyMF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE3XSwgICAgICAlWyIgI1RFTVA0ICJdLCAgICAlW3RlbXAyMF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE4XSwgICAgICAlWyIgI1RFTVA4ICJdLCAgICAlW3RlbXAyMF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzbHQgICAgICVbdGVtcDE5XSwgICAgICAlWyIgI1RFTVAxMiAiXSwgICAlW3RlbXAyMF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3Z6ICAgICVbIiAjVEVNUDAgIl0sICAgICVbdGVtcDIwXSwgICAgICAlW3RlbXAxNl0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3Z6ICAgICVbIiAjVEVNUDQgIl0sICAgICVbdGVtcDIwXSwgICAgICAlW3RlbXAxN10gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsdyAgICAgICVbdGVtcDE2XSwgICAgICA4KCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3Z6ICAgICVbIiAjVEVNUDggIl0sICAgICVbdGVtcDIwXSwgICAgICAlW3RlbXAxOF0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtb3Z6ICAgICVbIiAjVEVNUDEyICJdLCAgICVbdGVtcDIwXSwgICAgICAlW3RlbXAxOV0gICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICVbIiAjVEVNUDAgIl0sICAgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMTZdKSBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICVbIiAjVEVNUDQgIl0sICAgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMTZdKSBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICVbIiAjVEVNUDggIl0sICAgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMTZdKSBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICVbIiAjVEVNUDEyICJdLCAgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVt0ZW1wMTZdKSBcblx0IgorCisvLyBEb2VzIG9uZSBvciB0d28gaW52ZXJzZSB0cmFuc2Zvcm1zLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSVRyYW5zZm9ybU9uZV9NSVBTMzIoY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICBpbnQgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzOworICBpbnQgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxOSwgdGVtcDIwOworICBjb25zdCBpbnQqIGFyZ3NbM10gPSB7KGNvbnN0IGludCopcmVmLCAoY29uc3QgaW50KilpbiwgKGNvbnN0IGludCopZHN0fTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJsdyAgICAgICVbdGVtcDIwXSwgICAgICA0KCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgVkVSVElDQUxfUEFTUygwLCAxNiwgIDgsIDI0LCB0ZW1wNCwgIHRlbXAwLCAgdGVtcDEsICB0ZW1wMiwgIHRlbXAzKQorICAgIFZFUlRJQ0FMX1BBU1MoMiwgMTgsIDEwLCAyNiwgdGVtcDgsICB0ZW1wNCwgIHRlbXA1LCAgdGVtcDYsICB0ZW1wNykKKyAgICBWRVJUSUNBTF9QQVNTKDQsIDIwLCAxMiwgMjgsIHRlbXAxMiwgdGVtcDgsICB0ZW1wOSwgIHRlbXAxMCwgdGVtcDExKQorICAgIFZFUlRJQ0FMX1BBU1MoNiwgMjIsIDE0LCAzMCwgdGVtcDIwLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUpCisKKyAgICBIT1JJWk9OVEFMX1BBU1MoMCwgdGVtcDAsIHRlbXA0LCB0ZW1wOCwgIHRlbXAxMikKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgdGVtcDEsIHRlbXA1LCB0ZW1wOSwgIHRlbXAxMykKKyAgICBIT1JJWk9OVEFMX1BBU1MoMiwgdGVtcDIsIHRlbXA2LCB0ZW1wMTAsIHRlbXAxNCkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgdGVtcDMsIHRlbXA3LCB0ZW1wMTEsIHRlbXAxNSkKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSksCisgICAgICBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLAorICAgICAgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksIFt0ZW1wMTddIj0mciIodGVtcDE3KSwKKyAgICAgIFt0ZW1wMThdIj0mciIodGVtcDE4KSwgW3RlbXAxOV0iPSZyIih0ZW1wMTkpLCBbdGVtcDIwXSI9JnIiKHRlbXAyMCkKKyAgICA6IFthcmdzXSJyIihhcmdzKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybV9NSVBTMzIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lX01JUFMzMihyZWYsIGluLCBkc3QpOworICBpZiAoZG9fdHdvKSB7CisgICAgSVRyYW5zZm9ybU9uZV9NSVBTMzIocmVmICsgNCwgaW4gKyAxNiwgZHN0ICsgNCk7CisgIH0KK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1MKKyN1bmRlZiBIT1JJWk9OVEFMX1BBU1MKKworLy8gbWFjcm8gZm9yIG9uZSBwYXNzIHRocm91Z2ggZm9yIGxvb3AgaW4gUXVhbnRpemVCbG9jaworLy8gUVVBTlRESVYgbWFjcm8gaW5saW5lZAorLy8gSiAtIG9mZnNldCBpbiBieXRlcyAoa1ppZ3phZ1tuXSAqIDIpCisvLyBLIC0gb2Zmc2V0IGluIGJ5dGVzIChrWmlnemFnW25dICogNCkKKy8vIE4gLSBvZmZzZXQgaW4gYnl0ZXMgKG4gKiAyKQorI2RlZmluZSBRVUFOVElaRV9PTkUoSiwgSywgTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAlW3RlbXAwXSwgICAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsaHUgICAgICAgICAgJVt0ZW1wMV0sICAgICAgICIgI0ogIiglW3Bwc2hhcnBlbl0pICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibHcgICAgICAgICAgICVbdGVtcDJdLCAgICAgICAiICNLICIoJVtwcHp0aHJlc2hdKSAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNyYSAgICAgICAgICAlW3NpZ25dLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAxNSAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJ4b3IgICAgICAgICAgJVtjb2VmZl0sICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAic3VidSAgICAgICAgICVbY29lZmZdLCAgICAgICAlW2NvZWZmXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgImFkZHUgICAgICAgICAlW2NvZWZmXSwgICAgICAgJVtjb2VmZl0sICAgICAgICAgICAlW3RlbXAxXSAgICAgICAgXG5cdCIgICBcCisgICJzbHQgICAgICAgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgJVtjb2VmZl0gICAgICAgIFxuXHQiICAgXAorICAiYWRkaXUgICAgICAgICVbdGVtcDVdLCAgICAgICAkemVybywgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImFkZGl1ICAgICAgICAlW2xldmVsXSwgICAgICAgJHplcm8sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJiZXF6ICAgICAgICAgJVt0ZW1wNF0sICAgICAgIDJmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibGh1ICAgICAgICAgICVbdGVtcDFdLCAgICAgICAiICNKICIoJVtwcGlxXSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgImx3ICAgICAgICAgICAlW3RlbXAyXSwgICAgICAgIiAjSyAiKCVbcHBiaWFzXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICBcCisgICJsaHUgICAgICAgICAgJVt0ZW1wM10sICAgICAgICIgI0ogIiglW3BwcV0pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAibXVsICAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2NvZWZmXSwgICAgICAgICAgICVbdGVtcDFdICAgICAgICBcblx0IiAgIFwKKyAgImFkZHUgICAgICAgICAlW2xldmVsXSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIgICBcCisgICJzcmEgICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic2x0ICAgICAgICAgICVbdGVtcDRdLCAgICAgICAlW21heF9sZXZlbF0sICAgICAgICVbbGV2ZWxdICAgICAgICBcblx0IiAgIFwKKyAgIm1vdm4gICAgICAgICAlW2xldmVsXSwgICAgICAgJVttYXhfbGV2ZWxdLCAgICAgICAlW3RlbXA0XSAgICAgICAgXG5cdCIgICBcCisgICJ4b3IgICAgICAgICAgJVtsZXZlbF0sICAgICAgICVbbGV2ZWxdLCAgICAgICAgICAgJVtzaWduXSAgICAgICAgIFxuXHQiICAgXAorICAic3VidSAgICAgICAgICVbbGV2ZWxdLCAgICAgICAlW2xldmVsXSwgICAgICAgICAgICVbc2lnbl0gICAgICAgICBcblx0IiAgIFwKKyAgIm11bCAgICAgICAgICAlW3RlbXA1XSwgICAgICAgJVtsZXZlbF0sICAgICAgICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICBcCisiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgXAorICAic2ggICAgICAgICAgICVbdGVtcDVdLCAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgICAgICBcblx0IiAgIFwKKyAgInNoICAgICAgICAgICAlW2xldmVsXSwgICAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX01JUFMzMihpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgaW50IHNpZ24sIGNvZWZmLCBsZXZlbCwgaTsKKyAgaW50IG1heF9sZXZlbCA9IE1BWF9MRVZFTDsKKworICBpbnQxNl90KiBwcGluICAgICAgICAgICAgID0gJmluWzBdOworICBpbnQxNl90KiBwb3V0ICAgICAgICAgICAgID0gJm91dFswXTsKKyAgY29uc3QgdWludDE2X3QqIHBwc2hhcnBlbiA9ICZtdHgtPnNoYXJwZW5fWzBdOworICBjb25zdCB1aW50MzJfdCogcHB6dGhyZXNoID0gJm10eC0+enRocmVzaF9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHEgICAgICAgPSAmbXR4LT5xX1swXTsKKyAgY29uc3QgdWludDE2X3QqIHBwaXEgICAgICA9ICZtdHgtPmlxX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwYmlhcyAgICA9ICZtdHgtPmJpYXNfWzBdOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgUVVBTlRJWkVfT05FKCAwLCAgMCwgIDApCisgICAgUVVBTlRJWkVfT05FKCAyLCAgNCwgIDIpCisgICAgUVVBTlRJWkVfT05FKCA4LCAxNiwgIDQpCisgICAgUVVBTlRJWkVfT05FKDE2LCAzMiwgIDYpCisgICAgUVVBTlRJWkVfT05FKDEwLCAyMCwgIDgpCisgICAgUVVBTlRJWkVfT05FKCA0LCAgOCwgMTApCisgICAgUVVBTlRJWkVfT05FKCA2LCAxMiwgMTIpCisgICAgUVVBTlRJWkVfT05FKDEyLCAyNCwgMTQpCisgICAgUVVBTlRJWkVfT05FKDE4LCAzNiwgMTYpCisgICAgUVVBTlRJWkVfT05FKDI0LCA0OCwgMTgpCisgICAgUVVBTlRJWkVfT05FKDI2LCA1MiwgMjApCisgICAgUVVBTlRJWkVfT05FKDIwLCA0MCwgMjIpCisgICAgUVVBTlRJWkVfT05FKDE0LCAyOCwgMjQpCisgICAgUVVBTlRJWkVfT05FKDIyLCA0NCwgMjYpCisgICAgUVVBTlRJWkVfT05FKDI4LCA1NiwgMjgpCisgICAgUVVBTlRJWkVfT05FKDMwLCA2MCwgMzApCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtzaWduXSI9JnIiKHNpZ24pLCBbY29lZmZdIj0mciIoY29lZmYpLAorICAgICAgW2xldmVsXSI9JnIiKGxldmVsKQorICAgIDogW3BvdXRdInIiKHBvdXQpLCBbcHBpbl0iciIocHBpbiksCisgICAgICBbcHBpcV0iciIocHBpcSksIFttYXhfbGV2ZWxdInIiKG1heF9sZXZlbCksCisgICAgICBbcHBiaWFzXSJyIihwcGJpYXMpLCBbcHB6dGhyZXNoXSJyIihwcHp0aHJlc2gpLAorICAgICAgW3Bwc2hhcnBlbl0iciIocHBzaGFycGVuKSwgW3BwcV0iciIocHBxKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICAvLyBtb3ZlZCBvdXQgZnJvbSBtYWNybyB0byBpbmNyZWFzZSBwb3NzaWJpbGl0eSBmb3IgZWFybGllciBicmVha2luZworICBmb3IgKGkgPSAxNTsgaSA+PSAwOyBpLS0pIHsKKyAgICBpZiAob3V0W2ldKSByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfTUlQUzMyKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBueiAgPSBRdWFudGl6ZUJsb2NrX01JUFMzMihpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFF1YW50aXplQmxvY2tfTUlQUzMyKGluICsgMSAqIDE2LCBvdXQgKyAxICogMTYsIG10eCkgPDwgMTsKKyAgcmV0dXJuIG56OworfQorCisjdW5kZWYgUVVBTlRJWkVfT05FCisKKy8vIG1hY3JvIGZvciBvbmUgaG9yaXpvbnRhbCBwYXNzIGluIERpc3RvNHg0IChUVHJhbnNmb3JtKQorLy8gdHdvIGNhbGxzIG9mIGZ1bmN0aW9uIFRUcmFuc2Zvcm0gYXJlIG1lcmdlZCBpbnRvIHNpbmdsZSBvbmUKKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIGEgYW5kIGIgYnVmZmVycworLy8gRS4uSCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgZmlyc3QgcmVzdWx0cyB0byB0bXAgYnVmZmVyCisvLyBFMS4uSDEgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHNlY29uZCByZXN1bHRzIHRvIHRtcCBidWZmZXIKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTKEEsIEUsIEYsIEcsIEgsIEUxLCBGMSwgRzEsIEgxKSAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAwXSwgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAxXSwgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAyXSwgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXAzXSwgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVthXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA0XSwgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA1XSwgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA2XSwgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAlW3RlbXA3XSwgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVtiXSkgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAyXSwgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDRdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA2XSwgICVbdGVtcDVdLCAgICAlW3RlbXA3XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgICAlW3RlbXA3XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA3XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDNdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA2XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA2XSwgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA0XSwgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA3XSwgICIgI0UgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAyXSwgICIgI0ggIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA4XSwgICIgI0YgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAwXSwgICIgI0cgIiglW3RtcF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAxXSwgICIgI0UxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXAzXSwgICIgI0gxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA2XSwgICIgI0YxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAlW3RlbXA0XSwgICIgI0cxICIoJVt0bXBdKSAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBEaXN0bzR4NCAoVFRyYW5zZm9ybSkKKy8vIHR3byBjYWxscyBvZiBmdW5jdGlvbiBUVHJhbnNmb3JtIGFyZSBtZXJnZWQgaW50byBzaW5nbGUgb25lCisvLyBzaW5jZSBvbmx5IG9uZSBhY2N1IGlzIGF2YWlsYWJsZSBpbiBtaXBzMzJyMSBpbnN0cnVjdGlvbiBzZXQKKy8vICAgZmlyc3QgaXMgZG9uZSBzZWNvbmQgY2FsbCBvZiBmdW5jdGlvbiBUVHJhbnNmb3JtIGFuZCBhZnRlcgorLy8gICB0aGF0IGZpcnN0IG9uZS4KKy8vICAgY29uc3QgaW50IHN1bTEgPSBUVHJhbnNmb3JtKGEsIHcpOworLy8gICBjb25zdCBpbnQgc3VtMiA9IFRUcmFuc2Zvcm0oYiwgdyk7CisvLyAgIHJldHVybiBhYnMoc3VtMiAtIHN1bTEpID4+IDU7CisvLyAgIChzdW0yIC0gc3VtMSkgaXMgY2FsY3VsYXRlZCB3aXRoIG1hZGRzIChzdWIyKSBhbmQgbXN1YnMgKHN1YjEpCisvLyBBLi5EIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZpcnN0IHJlc3VsdHMgZnJvbSB0bXAgYnVmZmVyCisvLyBBMS4uRDEgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgc2Vjb25kIHJlc3VsdHMgZnJvbSB0bXAgYnVmZmVyCisvLyBFLi5IIC0gb2Zmc2V0cyBpbiBieXRlcyB0byBsb2FkIGZyb20gdyBidWZmZXIKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBBMSwgQjEsIEMxLCBEMSwgRSwgRiwgRywgSCkgICAgIFwKKyAgImx3ICAgICAlW3RlbXAwXSwgICIgI0ExICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAxXSwgICIgI0MxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAyXSwgICIgI0IxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAzXSwgICIgI0QxICIoJVt0bXBdKSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA0XSwgICVbdGVtcDNdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA1XSwgICVbdGVtcDFdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA2XSwgICVbdGVtcDBdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA3XSwgICVbdGVtcDhdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXA2XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXA2XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXA3XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA0XSwgICIgI0UgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA1XSwgICIgI0YgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA2XSwgICIgI0cgIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImxodSAgICAlW3RlbXA3XSwgICIgI0ggIiglW3ddKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA0XSwgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA1XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA2XSwgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1hZGQgICAlW3RlbXA3XSwgICVbdGVtcDhdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAwXSwgICIgI0EgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAxXSwgICIgI0MgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAyXSwgICIgI0IgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlW3RlbXAzXSwgICIgI0QgIiglW3RtcF0pICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAxXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXAzXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDhdLCAgICAlW3RlbXAxXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAlW3RlbXA4XSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAyXSwgICVbdGVtcDNdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA0XSwgICVbdGVtcDNdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAyXSwgICVbdGVtcDhdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXAzXSwgICVbdGVtcDBdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAlW3RlbXA0XSwgICVbdGVtcDFdLCAgICAzMSAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInhvciAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAlW3RlbXAyXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3RlbXAzXSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgInN1YnUgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAlW3RlbXA0XSAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA1XSwgICVbdGVtcDhdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA2XSwgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgIFwKKyAgIm1zdWIgICAlW3RlbXA3XSwgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyBpbnQgRGlzdG80eDRfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgdG1wWzMyXTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICBIT1JJWk9OVEFMX1BBU1MoMCwgICAwLCAgNCwgIDgsIDEyLCAgICA2NCwgIDY4LCAgNzIsICA3NikKKyAgICBIT1JJWk9OVEFMX1BBU1MoMSwgIDE2LCAyMCwgMjQsIDI4LCAgICA4MCwgIDg0LCAgODgsICA5MikKKyAgICBIT1JJWk9OVEFMX1BBU1MoMiwgIDMyLCAzNiwgNDAsIDQ0LCAgICA5NiwgMTAwLCAxMDQsIDEwOCkKKyAgICBIT1JJWk9OVEFMX1BBU1MoMywgIDQ4LCA1MiwgNTYsIDYwLCAgIDExMiwgMTE2LCAxMjAsIDEyNCkKKyAgICAibXRoaSAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtdGxvICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgVkVSVElDQUxfUEFTUyggMCwgMTYsIDMyLCA0OCwgICAgIDY0LCA4MCwgIDk2LCAxMTIsICAgMCwgIDgsIDE2LCAyNCkKKyAgICBWRVJUSUNBTF9QQVNTKCA0LCAyMCwgMzYsIDUyLCAgICAgNjgsIDg0LCAxMDAsIDExNiwgICAyLCAxMCwgMTgsIDI2KQorICAgIFZFUlRJQ0FMX1BBU1MoIDgsIDI0LCA0MCwgNTYsICAgICA3MiwgODgsIDEwNCwgMTIwLCAgIDQsIDEyLCAyMCwgMjgpCisgICAgVkVSVElDQUxfUEFTUygxMiwgMjgsIDQ0LCA2MCwgICAgIDc2LCA5MiwgMTA4LCAxMjQsICAgNiwgMTQsIDIyLCAzMCkKKyAgICAibWZsbyAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmEgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgIDMxICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgXG5cdCIKKyAgICAic3VidSAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAlW3RlbXAxXSAgICBcblx0IgorICAgICJzcmEgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgIDUgICAgICAgICAgIFxuXHQiCisKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYiksIFt3XSJyIih3KSwgW3RtcF0iciIodG1wKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKworICByZXR1cm4gdGVtcDA7Cit9CisKKyN1bmRlZiBWRVJUSUNBTF9QQVNTCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTCisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9NSVBTMzIoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9NSVBTMzIoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8gbWFjcm8gZm9yIG9uZSBob3Jpem9udGFsIHBhc3MgaW4gRlRyYW5zZm9ybQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIHNyYyBhbmQgcmVmIGJ1ZmZlcnMKKy8vIFRFTVAwLi5URU1QMyAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTKEEsIFRFTVAwLCBURU1QMSwgVEVNUDIsIFRFTVAzKSAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAlWyIgI1RFTVAxICJdLCAgMCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImx3ICAgICAlWyIgI1RFTVAyICJdLCAgNCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxNl0sICAgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxN10sICAgIDArIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMiAiXSkgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxOF0sICAgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxOV0sICAgIDErIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMiAiXSkgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAyMF0sICAgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTddICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxNl0sICAgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxN10sICAgIDIrIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMiAiXSkgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVAwICJdLCAgJVt0ZW1wMThdLCAgICAlW3RlbXAxOV0gICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxOF0sICAgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMSAiXSkgIFxuXHQiICAgIFwKKyAgImxidSAgICAlW3RlbXAxOV0sICAgIDMrIiBYU1RSKEJQUykgIioiICNBICIoJVsiICNURU1QMiAiXSkgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVAxICJdLCAgJVt0ZW1wMTZdLCAgICAlW3RlbXAxN10gICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVAyICJdLCAgJVt0ZW1wMThdLCAgICAlW3RlbXAxOV0gICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAzICJdLCAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAyICJdICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVAyICJdLCAgJVt0ZW1wMjBdLCAgICAlWyIgI1RFTVAyICJdICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlW3RlbXAyMF0sICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAxICJdICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEgIl0gICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxNl0sICAgICVbIiAjVEVNUDIgIl0sICAlW2M1MzUyXSAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxN10sICAgICVbIiAjVEVNUDIgIl0sICAlW2MyMjE3XSAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxOF0sICAgICVbIiAjVEVNUDAgIl0sICAlW2M1MzUyXSAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgIm11bCAgICAlW3RlbXAxOV0sICAgICVbIiAjVEVNUDAgIl0sICAlW2MyMjE3XSAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlWyIgI1RFTVAxICJdLCAgJVsiICNURU1QMyAiXSwgICVbdGVtcDIwXSAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAyMF0sICAgICVbIiAjVEVNUDMgIl0sICAlW3RlbXAyMF0gICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNsbCAgICAlWyIgI1RFTVAwICJdLCAgJVsiICNURU1QMSAiXSwgIDMgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNsbCAgICAlWyIgI1RFTVAyICJdLCAgJVt0ZW1wMjBdLCAgICAzICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxNl0sICAgICVbdGVtcDE2XSwgICAgMTgxMiAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZGl1ICAlW3RlbXAxN10sICAgICVbdGVtcDE3XSwgICAgOTM3ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgImFkZHUgICAlW3RlbXAxNl0sICAgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTldICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInN1YnUgICAlW3RlbXAxN10sICAgICVbdGVtcDE3XSwgICAgJVt0ZW1wMThdICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAxICJdLCAgJVt0ZW1wMTZdLCAgICA5ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgIFwKKyAgInNyYSAgICAlWyIgI1RFTVAzICJdLCAgJVt0ZW1wMTddLCAgICA5ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIG1hY3JvIGZvciBvbmUgdmVydGljYWwgcGFzcyBpbiBGVHJhbnNmb3JtCisvLyB0ZW1wMC4udGVtcDE1IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQS4uRCAtIG9mZnNldHMgaW4gYnl0ZXMgdG8gc3RvcmUgdG8gb3V0IGJ1ZmZlcgorLy8gVEVNUDAsIFRFTVA0LCBURU1QOCBhbmQgVEVNUDEyIC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBWRVJUSUNBTF9QQVNTKEEsIEIsIEMsIEQsIFRFTVAwLCBURU1QNCwgVEVNUDgsIFRFTVAxMikgICAgXAorICAiYWRkdSAgICVbdGVtcDE2XSwgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEyICJdICAgXG5cdCIgICAgXAorICAic3VidSAgICVbdGVtcDE5XSwgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDEyICJdICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbdGVtcDE3XSwgICAgJVsiICNURU1QNCAiXSwgICVbIiAjVEVNUDggIl0gICAgXG5cdCIgICAgXAorICAic3VidSAgICVbdGVtcDE4XSwgICAgJVsiICNURU1QNCAiXSwgICVbIiAjVEVNUDggIl0gICAgXG5cdCIgICAgXAorICAibXVsICAgICVbIiAjVEVNUDggIl0sICAlW3RlbXAxOV0sICAgICVbYzIyMTddICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbIiAjVEVNUDEyICJdLCAlW3RlbXAxOF0sICAgICVbYzIyMTddICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbIiAjVEVNUDQgIl0sICAlW3RlbXAxOV0sICAgICVbYzUzNTJdICAgICAgICAgXG5cdCIgICAgXAorICAibXVsICAgICVbdGVtcDE4XSwgICAgJVt0ZW1wMThdLCAgICAlW2M1MzUyXSAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbdGVtcDE2XSwgICAgJVt0ZW1wMTZdLCAgICA3ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbIiAjVEVNUDAgIl0sICAlW3RlbXAxNl0sICAgICVbdGVtcDE3XSAgICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVAwICJdLCAgNCAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkdSAgICVbIiAjVEVNUDEyICJdLCAlWyIgI1RFTVAxMiAiXSwgJVsiICNURU1QNCAiXSAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDQgIl0sICAlW3RlbXAxNl0sICAgICVbdGVtcDE3XSAgICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA0ICJdLCAgNCAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbIiAjVEVNUDggIl0sICAlWyIgI1RFTVA4ICJdLCAgMzAwMDAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbIiAjVEVNUDEyICJdLCAlWyIgI1RFTVAxMiAiXSwgMTIwMDAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbIiAjVEVNUDggIl0sICAlWyIgI1RFTVA4ICJdLCAgMjEwMDAgICAgICAgICAgXG5cdCIgICAgXAorICAic3VidSAgICVbIiAjVEVNUDggIl0sICAlWyIgI1RFTVA4ICJdLCAgJVt0ZW1wMThdICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDEyICJdLCAlWyIgI1RFTVAxMiAiXSwgMTYgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic3JhICAgICVbIiAjVEVNUDggIl0sICAlWyIgI1RFTVA4ICJdLCAgMTYgICAgICAgICAgICAgXG5cdCIgICAgXAorICAiYWRkaXUgICVbdGVtcDE2XSwgICAgJVsiICNURU1QMTIgIl0sIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAibW92biAgICVbIiAjVEVNUDEyICJdLCAlW3RlbXAxNl0sICAgICVbdGVtcDE5XSAgICAgICAgXG5cdCIgICAgXAorICAic2ggICAgICVbIiAjVEVNUDAgIl0sICAiICNBICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic2ggICAgICVbIiAjVEVNUDQgIl0sICAiICNDICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic2ggICAgICVbIiAjVEVNUDggIl0sICAiICNEICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgXG5cdCIgICAgXAorICAic2ggICAgICVbIiAjVEVNUDEyICJdLCAiICNCICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9NSVBTMzIoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDg7CisgIGludCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2OworICBpbnQgdGVtcDE3LCB0ZW1wMTgsIHRlbXAxOSwgdGVtcDIwOworICBjb25zdCBpbnQgYzIyMTcgPSAyMjE3OworICBjb25zdCBpbnQgYzUzNTIgPSA1MzUyOworICBjb25zdCBpbnQqIGNvbnN0IGFyZ3NbM10gPQorICAgICAgeyAoY29uc3QgaW50KilzcmMsIChjb25zdCBpbnQqKXJlZiwgKGNvbnN0IGludCopb3V0IH07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICBIT1JJWk9OVEFMX1BBU1MoMCwgdGVtcDAsICB0ZW1wMSwgIHRlbXAyLCAgdGVtcDMpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsIHRlbXA0LCAgdGVtcDUsICB0ZW1wNiwgIHRlbXA3KQorICAgIEhPUklaT05UQUxfUEFTUygyLCB0ZW1wOCwgIHRlbXA5LCAgdGVtcDEwLCB0ZW1wMTEpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSkKKyAgICAibHcgICAlW3RlbXAyMF0sICAgIDgoJVthcmdzXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIFZFUlRJQ0FMX1BBU1MoMCwgIDgsIDE2LCAyNCwgdGVtcDAsIHRlbXA0LCB0ZW1wOCwgIHRlbXAxMikKKyAgICBWRVJUSUNBTF9QQVNTKDIsIDEwLCAxOCwgMjYsIHRlbXAxLCB0ZW1wNSwgdGVtcDksICB0ZW1wMTMpCisgICAgVkVSVElDQUxfUEFTUyg0LCAxMiwgMjAsIDI4LCB0ZW1wMiwgdGVtcDYsIHRlbXAxMCwgdGVtcDE0KQorICAgIFZFUlRJQ0FMX1BBU1MoNiwgMTQsIDIyLCAzMCwgdGVtcDMsIHRlbXA3LCB0ZW1wMTEsIHRlbXAxNSkKKworICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KSwgW3RlbXAxMF0iPSZyIih0ZW1wMTApLCBbdGVtcDExXSI9JnIiKHRlbXAxMSksCisgICAgICBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgW3RlbXAxNF0iPSZyIih0ZW1wMTQpLAorICAgICAgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksIFt0ZW1wMTddIj0mciIodGVtcDE3KSwKKyAgICAgIFt0ZW1wMThdIj0mciIodGVtcDE4KSwgW3RlbXAxOV0iPSZyIih0ZW1wMTkpLCBbdGVtcDIwXSI9JnIiKHRlbXAyMCkKKyAgICA6IFthcmdzXSJyIihhcmdzKSwgW2MyMjE3XSJyIihjMjIxNyksIFtjNTM1Ml0iciIoYzUzNTIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCisjdW5kZWYgVkVSVElDQUxfUEFTUworI3VuZGVmIEhPUklaT05UQUxfUEFTUworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCisjZGVmaW5lIEdFVF9TU0VfSU5ORVIoQSwgQiwgQywgRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAwXSwgICAgIiAjQSAiKCVbYV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wMV0sICAgICIgI0EgIiglW2JdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDJdLCAgICAiICNCICIoJVthXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXAzXSwgICAgIiAjQiAiKCVbYl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wNF0sICAgICIgI0MgIiglW2FdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJsYnUgICAgICVbdGVtcDVdLCAgICAiICNDICIoJVtiXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibGJ1ICAgICAlW3RlbXA2XSwgICAgIiAjRCAiKCVbYV0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImxidSAgICAgJVt0ZW1wN10sICAgICIgI0QgIiglW2JdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgICVbdGVtcDFdICAgICAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAlW3RlbXAzXSAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgJVt0ZW1wNF0sICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNV0gICAgICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICVbdGVtcDZdLCAgICAlW3RlbXA2XSwgICAgICVbdGVtcDddICAgICAgIFxuXHQiICAgICAgXAorICAibWFkZCAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgIm1hZGQgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJtYWRkICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAibWFkZCAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIEdFVF9TU0UoQSwgQiwgQywgRCkgICAgICAgICAgICAgICBcCisgIEdFVF9TU0VfSU5ORVIoQSwgQSArIDEsIEEgKyAyLCBBICsgMykgICBcCisgIEdFVF9TU0VfSU5ORVIoQiwgQiArIDEsIEIgKyAyLCBCICsgMykgICBcCisgIEdFVF9TU0VfSU5ORVIoQywgQyArIDEsIEMgKyAyLCBDICsgMykgICBcCisgIEdFVF9TU0VfSU5ORVIoRCwgRCArIDEsIEQgKyAyLCBEICsgMykKKworc3RhdGljIGludCBTU0UxNngxNl9NSVBTMzIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworICAgICBHRVRfU1NFKCAwICogQlBTLCA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUykKKyAgICAgR0VUX1NTRSggMSAqIEJQUywgNCArICAxICogQlBTLCA4ICsgIDEgKiBCUFMsIDEyICsgIDEgKiBCUFMpCisgICAgIEdFVF9TU0UoIDIgKiBCUFMsIDQgKyAgMiAqIEJQUywgOCArICAyICogQlBTLCAxMiArICAyICogQlBTKQorICAgICBHRVRfU1NFKCAzICogQlBTLCA0ICsgIDMgKiBCUFMsIDggKyAgMyAqIEJQUywgMTIgKyAgMyAqIEJQUykKKyAgICAgR0VUX1NTRSggNCAqIEJQUywgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMpCisgICAgIEdFVF9TU0UoIDUgKiBCUFMsIDQgKyAgNSAqIEJQUywgOCArICA1ICogQlBTLCAxMiArICA1ICogQlBTKQorICAgICBHRVRfU1NFKCA2ICogQlBTLCA0ICsgIDYgKiBCUFMsIDggKyAgNiAqIEJQUywgMTIgKyAgNiAqIEJQUykKKyAgICAgR0VUX1NTRSggNyAqIEJQUywgNCArICA3ICogQlBTLCA4ICsgIDcgKiBCUFMsIDEyICsgIDcgKiBCUFMpCisgICAgIEdFVF9TU0UoIDggKiBCUFMsIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTKQorICAgICBHRVRfU1NFKCA5ICogQlBTLCA0ICsgIDkgKiBCUFMsIDggKyAgOSAqIEJQUywgMTIgKyAgOSAqIEJQUykKKyAgICAgR0VUX1NTRSgxMCAqIEJQUywgNCArIDEwICogQlBTLCA4ICsgMTAgKiBCUFMsIDEyICsgMTAgKiBCUFMpCisgICAgIEdFVF9TU0UoMTEgKiBCUFMsIDQgKyAxMSAqIEJQUywgOCArIDExICogQlBTLCAxMiArIDExICogQlBTKQorICAgICBHRVRfU1NFKDEyICogQlBTLCA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUykKKyAgICAgR0VUX1NTRSgxMyAqIEJQUywgNCArIDEzICogQlBTLCA4ICsgMTMgKiBCUFMsIDEyICsgMTMgKiBCUFMpCisgICAgIEdFVF9TU0UoMTQgKiBCUFMsIDQgKyAxNCAqIEJQUywgOCArIDE0ICogQlBTLCAxMiArIDE0ICogQlBTKQorICAgICBHRVRfU1NFKDE1ICogQlBTLCA0ICsgMTUgKiBCUFMsIDggKyAxNSAqIEJQUywgMTIgKyAxNSAqIEJQUykKKworICAgICJtZmxvICAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IFNTRTE2eDhfTUlQUzMyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyAgICAgR0VUX1NTRSggMCAqIEJQUywgNCArICAwICogQlBTLCA4ICsgIDAgKiBCUFMsIDEyICsgIDAgKiBCUFMpCisgICAgIEdFVF9TU0UoIDEgKiBCUFMsIDQgKyAgMSAqIEJQUywgOCArICAxICogQlBTLCAxMiArICAxICogQlBTKQorICAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICAgR0VUX1NTRSggMyAqIEJQUywgNCArICAzICogQlBTLCA4ICsgIDMgKiBCUFMsIDEyICsgIDMgKiBCUFMpCisgICAgIEdFVF9TU0UoIDQgKiBCUFMsIDQgKyAgNCAqIEJQUywgOCArICA0ICogQlBTLCAxMiArICA0ICogQlBTKQorICAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICAgR0VUX1NTRSggNiAqIEJQUywgNCArICA2ICogQlBTLCA4ICsgIDYgKiBCUFMsIDEyICsgIDYgKiBCUFMpCisgICAgIEdFVF9TU0UoIDcgKiBCUFMsIDQgKyAgNyAqIEJQUywgOCArICA3ICogQlBTLCAxMiArICA3ICogQlBTKQorCisgICAgIm1mbG8gICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4X01JUFMzMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgIEdFVF9TU0UoMCAqIEJQUywgNCArIDAgKiBCUFMsIDEgKiBCUFMsIDQgKyAxICogQlBTKQorICAgICBHRVRfU1NFKDIgKiBCUFMsIDQgKyAyICogQlBTLCAzICogQlBTLCA0ICsgMyAqIEJQUykKKyAgICAgR0VUX1NTRSg0ICogQlBTLCA0ICsgNCAqIEJQUywgNSAqIEJQUywgNCArIDUgKiBCUFMpCisgICAgIEdFVF9TU0UoNiAqIEJQUywgNCArIDYgKiBCUFMsIDcgKiBCUFMsIDQgKyA3ICogQlBTKQorCisgICAgIm1mbG8gICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFNHg0X01JUFMzMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisgICAgIEdFVF9TU0UoMCAqIEJQUywgMSAqIEJQUywgMiAqIEJQUywgMyAqIEJQUykKKworICAgICJtZmxvICAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbY291bnRdIj0mciIoY291bnQpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKKyAgcmV0dXJuIGNvdW50OworfQorCisjdW5kZWYgR0VUX1NTRQorI3VuZGVmIEdFVF9TU0VfSU5ORVIKKworI2VuZGlmICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX01JUFMzMjsKKyAgVlA4RlRyYW5zZm9ybSA9IEZUcmFuc2Zvcm1fTUlQUzMyOworCisgIFZQOEVuY1F1YW50aXplQmxvY2sgPSBRdWFudGl6ZUJsb2NrX01JUFMzMjsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX01JUFMzMjsKKworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9NSVBTMzI7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9NSVBTMzI7CisKKyNpZiAhZGVmaW5lZChXT1JLX0FST1VORF9HQ0MpCisgIFZQOFNTRTE2eDE2ID0gU1NFMTZ4MTZfTUlQUzMyOworICBWUDhTU0U4eDggPSBTU0U4eDhfTUlQUzMyOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9NSVBTMzI7CisgIFZQOFNTRTR4NCA9IFNTRTR4NF9NSVBTMzI7CisjZW5kaWYKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTMzIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRNSVBTMzIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDI4NzZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDE1MjIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogRGFya28gTGF1cyAoZGFya28ubGF1c0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBNaXJrbyBSYXVzIChtaXJrby5yYXVzQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9taXBzX21hY3JvLmgiCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworc3RhdGljIGNvbnN0IGludCBrQzEgPSAyMDA5MSArICgxIDw8IDE2KTsKK3N0YXRpYyBjb25zdCBpbnQga0MyID0gMzU0Njg7CisKKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIEFERF9TVUJfSEFMVkVTX1g0KE8wLCBPMSwgTzIsIE8zLCBPNCwgTzUsIE82LCBPNywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdLCAgJVsiICNJMSAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNJMCAiXSwgICVbIiAjSTEgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI08yICJdLCAgICVbIiAjSTIgIl0sICAlWyIgI0kzICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPMyAiXSwgICAlWyIgI0kyICJdLCAgJVsiICNJMyAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzQgIl0sICAgJVsiICNJNCAiXSwgICVbIiAjSTUgIl0gICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI081ICJdLCAgICVbIiAjSTQgIl0sICAlWyIgI0k1ICJdICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPNiAiXSwgICAlWyIgI0k2ICJdLCAgJVsiICNJNyAiXSAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzcgIl0sICAgJVsiICNJNiAiXSwgICVbIiAjSTcgIl0gICAgIFxuXHQiCisKKy8vIElPIC0gaW5wdXQvb3V0cHV0CisjZGVmaW5lIEFCU19YOChJTzAsIElPMSwgSU8yLCBJTzMsIElPNCwgSU81LCBJTzYsIElPNykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPMCAiXSwgICAlWyIgI0lPMCAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzEgIl0sICAgJVsiICNJTzEgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU8yICJdLCAgICVbIiAjSU8yICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPMyAiXSwgICAlWyIgI0lPMyAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzQgIl0sICAgJVsiICNJTzQgIl0gICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICAgICAgICVbIiAjSU81ICJdLCAgICVbIiAjSU81ICJdICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAgICAgICAlWyIgI0lPNiAiXSwgICAlWyIgI0lPNiAiXSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgICAgICAgJVsiICNJTzcgIl0sICAgJVsiICNJTzcgIl0gICAgICAgICAgICAgICAgXG5cdCIKKworLy8gZHBhLncucGggJGFjMCB0ZW1wMCAsdGVtcDEKKy8vICAkYWMgKz0gdGVtcDBbMzEuLjE2XSAqIHRlbXAxWzMxLi4xNl0gKyB0ZW1wMFsxNS4uMF0gKiB0ZW1wMVsxNS4uMF0KKy8vIGRwYXgudy5waCAkYWMwIHRlbXAwICx0ZW1wMQorLy8gICRhYyArPSB0ZW1wMFszMS4uMTZdICogdGVtcDFbMTUuLjBdICsgdGVtcDBbMTUuLjBdICogdGVtcDFbMzEuLjE2XQorLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgTVVMX0hBTEYoTzAsIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIEk4LCBJOSwgSTEwLCBJMTEsIEkxMiwgSTEzLCBJMTQsIEkxNSkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJtdWx0ICAgICAgICAgICAgJGFjMCwgICAgICAkemVybywgICAgICR6ZXJvICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBhLncucGggICAgICAgICRhYzAsICAgICAgJVsiICNJMiAiXSwgICVbIiAjSTAgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYXgudy5waCAgICAgICAkYWMwLCAgICAgICVbIiAjSTUgIl0sICAlWyIgI0k2ICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGEudy5waCAgICAgICAgJGFjMCwgICAgICAlWyIgI0k4ICJdLCAgJVsiICNJOSAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBheC53LnBoICAgICAgICRhYzAsICAgICAgJVsiICNJMTEgIl0sICVbIiAjSTQgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYS53LnBoICAgICAgICAkYWMwLCAgICAgICVbIiAjSTEyICJdLCAlWyIgI0k3ICJdICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJkcGF4LncucGggICAgICAgJGFjMCwgICAgICAlWyIgI0kxMyAiXSwgJVsiICNJMSAiXSAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgICAiZHBhLncucGggICAgICAgICRhYzAsICAgICAgJVsiICNJMTQgIl0sICVbIiAjSTMgIl0gICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICAgImRwYXgudy5waCAgICAgICAkYWMwLCAgICAgICVbIiAjSTE1ICJdLCAlWyIgI0kxMCAiXSAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAgICJtZmxvICAgICAgICAgICAgJVsiICNPMCAiXSwgICRhYzAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCisjZGVmaW5lIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTcoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzEwKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLCBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgICAgICAgICBcCisgIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksICAgICAgICAgXAorICBbdGVtcDE3XSI9JnIiKHRlbXAxNykKKworLy8gbWFjcm8gZm9yIG9uZSBob3Jpem9udGFsIHBhc3MgaW4gRlRyYW5zZm9ybQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEgLSBvZmZzZXQgaW4gYnl0ZXMgdG8gbG9hZCBmcm9tIHNyYyBhbmQgcmVmIGJ1ZmZlcnMKKy8vIFRFTVAwLi5URU1QMyAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgSE9SSVpPTlRBTF9QQVNTKEEsIFRFTVAwLCBURU1QMSwgVEVNUDIsIFRFTVAzKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAwKCVbYXJnc10pICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAibHcgICAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgNCglW2FyZ3NdKSAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImx3ICAgICAgICAgICAgICAlWyIgI1RFTVAyICJdLCAgICIgWFNUUihCUFMpICIqIiAjQSAiKCVbIiAjVEVNUDAgIl0pIFxuXHQiICBcCisgICJsdyAgICAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAiIFhTVFIoQlBTKSAiKiIgI0EgIiglWyIgI1RFTVAxICJdKSBcblx0IiAgXAorICAicHJlY2V1LnBoLnFibCAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMiAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInByZWNldS5waC5xYmwgICAlWyIgI1RFTVAxICJdLCAgICVbIiAjVEVNUDMgIl0gICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJwcmVjZXUucGgucWJyICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAyICJdICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAicHJlY2V1LnBoLnFiciAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMyAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAwICJdLCAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMSAiXSAgICAgIFxuXHQiICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMiAiXSwgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDMgIl0gICAgICBcblx0IiAgXAorICAicm90ciAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICAxNiAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgImFkZHEucGggICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbIiAjVEVNUDIgIl0sICAgJVsiICNURU1QMCAiXSAgICAgIFxuXHQiICBcCisgICJzdWJxLnBoICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDAgIl0gICAgICBcblx0IiAgXAorICAic2VoICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMSAiXSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNyYSAgICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAxICJdLCAgIDE2ICAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzZWggICAgICAgICAgICAgJVt0ZW1wMTldLCAgICAgJVsiICNURU1QMyAiXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVsiICNURU1QMyAiXSwgICAxNiAgICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInN1YnUgICAgICAgICAgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDAgIl0sICAgJVt0ZW1wMTZdICAgICAgICAgIFxuXHQiICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgICVbdGVtcDE2XSAgICAgICAgICBcblx0IiAgXAorICAibXVsICAgICAgICAgICAgICVbdGVtcDE3XSwgICAgICVbdGVtcDE5XSwgICAgICVbYzIyMTddICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgIm11bCAgICAgICAgICAgICAlW3RlbXAxOF0sICAgICAlWyIgI1RFTVAzICJdLCAgICVbYzUzNTJdICAgICAgICAgICAgIFxuXHQiICBcCisgICJtdWwgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlW3RlbXAxOV0sICAgICAlW2M1MzUyXSAgICAgICAgICAgICBcblx0IiAgXAorICAibXVsICAgICAgICAgICAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDMgIl0sICAgJVtjMjIxN10gICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNsbCAgICAgICAgICAgICAlWyIgI1RFTVAyICJdLCAgICVbIiAjVEVNUDIgIl0sICAgMyAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzbGwgICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAwICJdLCAgIDMgICAgICAgICAgICAgICAgICBcblx0IiAgXAorICAic3VidSAgICAgICAgICAgICVbIiAjVEVNUDMgIl0sICAgJVt0ZW1wMTddLCAgICAgJVt0ZW1wMThdICAgICAgICAgICAgXG5cdCIgIFwKKyAgImFkZHUgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgICVbdGVtcDE2XSwgICAgICVbIiAjVEVNUDEgIl0gICAgICAgIFxuXHQiICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QMyAiXSwgICAlWyIgI1RFTVAzICJdLCAgIDkzNyAgICAgICAgICAgICAgICBcblx0IiAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAgJVsiICNURU1QMSAiXSwgICAxODEyICAgICAgICAgICAgICAgXG5cdCIgIFwKKyAgInNyYSAgICAgICAgICAgICAlWyIgI1RFTVAzICJdLCAgICVbIiAjVEVNUDMgIl0sICAgOSAgICAgICAgICAgICAgICAgIFxuXHQiICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMSAiXSwgICAlWyIgI1RFTVAxICJdLCAgIDkgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBtYWNybyBmb3Igb25lIHZlcnRpY2FsIHBhc3MgaW4gRlRyYW5zZm9ybQorLy8gdGVtcDAuLnRlbXAxNSBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEuLkQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHRvIG91dCBidWZmZXIKKy8vIFRFTVAwLCBURU1QNCwgVEVNUDggYW5kIFRFTVAxMiAtIHJlZ2lzdGVycyBmb3IgY29ycmVzcG9uZGluZyB0bXAgZWxlbWVudHMKKyNkZWZpbmUgVkVSVElDQUxfUEFTUyhBLCBCLCBDLCBELCBURU1QMCwgVEVNUDQsIFRFTVA4LCBURU1QMTIpICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMTZdLCAgICAgJVsiICNURU1QMCAiXSwgICAlWyIgI1RFTVAxMiAiXSAgIFxuXHQiICAgICAgXAorICAic3VidSAgICAgICAgICAgICVbdGVtcDE5XSwgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMTIgIl0gICBcblx0IiAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAlW3RlbXAxN10sICAgICAlWyIgI1RFTVA0ICJdLCAgICVbIiAjVEVNUDggIl0gICAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgJVt0ZW1wMThdLCAgICAgJVsiICNURU1QNCAiXSwgICAlWyIgI1RFTVA4ICJdICAgIFxuXHQiICAgICAgXAorICAibXVsICAgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgJVt0ZW1wMTldLCAgICAgJVtjMjIxN10gICAgICAgICBcblx0IiAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICVbdGVtcDE4XSwgICAgICVbYzIyMTddICAgICAgICAgXG5cdCIgICAgICBcCisgICJtdWwgICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICAlW3RlbXAxOV0sICAgICAlW2M1MzUyXSAgICAgICAgIFxuXHQiICAgICAgXAorICAibXVsICAgICAgICAgICAgICVbdGVtcDE4XSwgICAgICVbdGVtcDE4XSwgICAgICVbYzUzNTJdICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlW3RlbXAxNl0sICAgICA3ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgJVsiICNURU1QMCAiXSwgICAlW3RlbXAxNl0sICAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgICAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgJVsiICNURU1QMCAiXSwgICA0ICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAlWyIgI1RFTVAxMiAiXSwgICVbIiAjVEVNUDEyICJdLCAgJVsiICNURU1QNCAiXSAgXG5cdCIgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICAlW3RlbXAxNl0sICAgICAlW3RlbXAxN10gICAgICAgIFxuXHQiICAgICAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDQgIl0sICAgJVsiICNURU1QNCAiXSwgICA0ICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgMzAwMDAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRpdSAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlWyIgI1RFTVAxMiAiXSwgIDEyMDAwICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkaXUgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgJVsiICNURU1QOCAiXSwgICAyMTAwMCAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAlWyIgI1RFTVA4ICJdLCAgICVbIiAjVEVNUDggIl0sICAgJVt0ZW1wMThdICAgICAgXG5cdCIgICAgICBcCisgICJzcmEgICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlWyIgI1RFTVAxMiAiXSwgIDE2ICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic3JhICAgICAgICAgICAgICVbIiAjVEVNUDggIl0sICAgJVsiICNURU1QOCAiXSwgICAxNiAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZGl1ICAgICAgICAgICAlW3RlbXAxNl0sICAgICAlWyIgI1RFTVAxMiAiXSwgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJtb3ZuICAgICAgICAgICAgJVsiICNURU1QMTIgIl0sICAlW3RlbXAxNl0sICAgICAlW3RlbXAxOV0gICAgICAgIFxuXHQiICAgICAgXAorICAic2ggICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAgIiAjQSAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNoICAgICAgICAgICAgICAlWyIgI1RFTVA0ICJdLCAgICIgI0MgIiglW3RlbXAyMF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaCAgICAgICAgICAgICAgJVsiICNURU1QOCAiXSwgICAiICNEICIoJVt0ZW1wMjBdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2ggICAgICAgICAgICAgICVbIiAjVEVNUDEyICJdLCAgIiAjQiAiKCVbdGVtcDIwXSkgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBjb25zdCBpbnQgYzIyMTcgPSAyMjE3OworICBjb25zdCBpbnQgYzUzNTIgPSA1MzUyOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wODsKKyAgaW50IHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTY7CisgIGludCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDE5LCB0ZW1wMjA7CisgIGNvbnN0IGludCogY29uc3QgYXJnc1szXSA9CisgICAgICB7IChjb25zdCBpbnQqKXNyYywgKGNvbnN0IGludCopcmVmLCAoY29uc3QgaW50KilvdXQgfTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBIT1JJWk9OVEFMX1BBU1MoMCwgdGVtcDAsICB0ZW1wMSwgIHRlbXAyLCAgdGVtcDMpCisgICAgSE9SSVpPTlRBTF9QQVNTKDEsIHRlbXA0LCAgdGVtcDUsICB0ZW1wNiwgIHRlbXA3KQorICAgIEhPUklaT05UQUxfUEFTUygyLCB0ZW1wOCwgIHRlbXA5LCAgdGVtcDEwLCB0ZW1wMTEpCisgICAgSE9SSVpPTlRBTF9QQVNTKDMsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSkKKyAgICAibHcgICAgICAgICAgICAlW3RlbXAyMF0sICAgICA4KCVbYXJnc10pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBWRVJUSUNBTF9QQVNTKDAsICA4LCAxNiwgMjQsIHRlbXAwLCB0ZW1wNCwgdGVtcDgsICB0ZW1wMTIpCisgICAgVkVSVElDQUxfUEFTUygyLCAxMCwgMTgsIDI2LCB0ZW1wMSwgdGVtcDUsIHRlbXA5LCAgdGVtcDEzKQorICAgIFZFUlRJQ0FMX1BBU1MoNCwgMTIsIDIwLCAyOCwgdGVtcDIsIHRlbXA2LCB0ZW1wMTAsIHRlbXAxNCkKKyAgICBWRVJUSUNBTF9QQVNTKDYsIDE0LCAyMiwgMzAsIHRlbXAzLCB0ZW1wNywgdGVtcDExLCB0ZW1wMTUpCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpLAorICAgICAgW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxOV0iPSZyIih0ZW1wMTkpLCBbdGVtcDIwXSI9JnIiKHRlbXAyMCkKKyAgICA6IFthcmdzXSJyIihhcmdzKSwgW2MyMjE3XSJyIihjMjIxNyksIFtjNTM1Ml0iciIoYzUzNTIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworfQorCisjdW5kZWYgVkVSVElDQUxfUEFTUworI3VuZGVmIEhPUklaT05UQUxfUEFTUworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBJVHJhbnNmb3JtT25lKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgaW50MTZfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3LCB0ZW1wMTg7CisKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMCglW2luXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMl0sICAgMTYoJVtpbl0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9JTl9YMih0ZW1wNSwgdGVtcDYsIDI0LCAyNikKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wMikKKyAgICBMT0FEX0lOX1gyKHRlbXAxLCB0ZW1wMiwgOCwgMTApCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwKKyAgICAgICAgICAgICAgICAgIHRlbXAxMCwgdGVtcDgsIHRlbXA5LCB0ZW1wNywgdGVtcDEsIHRlbXAyLCB0ZW1wNSwgdGVtcDYsCisgICAgICAgICAgICAgICAgICB0ZW1wMTMsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTIpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDgsIHRlbXA3LCB0ZW1wMTAsIHRlbXA5KQorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE3XSwgIDQoJVtpbl0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDE4XSwgIDIwKCVbaW5dKSAgICAgICAgICAgICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA4KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNiwgdGVtcDQsIHRlbXA3KQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA3LCB0ZW1wOCwgdGVtcDE3LCB0ZW1wMTgpCisgICAgTE9BRF9JTl9YMih0ZW1wMTcsIHRlbXAxOCwgMTIsIDE0KQorICAgIExPQURfSU5fWDIodGVtcDksIHRlbXAxMCwgMjgsIDMwKQorICAgIE1VTF9TSElGVF9TVU0odGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDQsIHRlbXAxNywKKyAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDE0LCB0ZW1wMTEsIHRlbXAxMywgdGVtcDE3LCB0ZW1wMTgsIHRlbXA5LCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICB0ZW1wMTUsIHRlbXA0LCB0ZW1wMTYsIHRlbXAxNykKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMTEsIHRlbXAxMiwgdGVtcDEzLCB0ZW1wMTQpCisgICAgQUREX1NVQl9IQUxWRVModGVtcDE3LCB0ZW1wOCwgdGVtcDgsIHRlbXAxMSkKKyAgICBBRERfU1VCX0hBTFZFUyh0ZW1wMywgdGVtcDQsIHRlbXA3LCB0ZW1wMTIpCisKKyAgICAvLyBob3Jpem9udGFsCisgICAgU1JBXzE2KHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXA1LCB0ZW1wNikKKyAgICBJTlNFUlRfSEFMRl9YMih0ZW1wMSwgdGVtcDYsIHRlbXA1LCB0ZW1wMikKKyAgICBTUkFfMTYodGVtcDEzLCB0ZW1wMTQsIHRlbXAxNSwgdGVtcDE2LCB0ZW1wMywgdGVtcDQsIHRlbXAxNywgdGVtcDgpCisgICAgInJlcGwucGggICAgICAgICAgJVt0ZW1wMl0sICAgMHg0ICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDMsIHRlbXA4LCB0ZW1wMTcsIHRlbXA0KQorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgJVt0ZW1wMl0gICAgICBcblx0IgorICAgIEFERF9TVUJfSEFMVkVTKHRlbXAyLCB0ZW1wNCwgdGVtcDEsIHRlbXAzKQorICAgIEFERF9TVUJfSEFMVkVTKHRlbXA1LCB0ZW1wNywgdGVtcDYsIHRlbXA4KQorICAgIE1VTF9TSElGVF9TVU0odGVtcDEsIHRlbXAzLCB0ZW1wNiwgdGVtcDgsIHRlbXA5LCB0ZW1wMTMsIHRlbXAxNywgdGVtcDE4LAorICAgICAgICAgICAgICAgICAgdGVtcDMsIHRlbXAxMywgdGVtcDEsIHRlbXA5LCB0ZW1wOSwgdGVtcDEzLCB0ZW1wMTEsIHRlbXAxNSwKKyAgICAgICAgICAgICAgICAgIHRlbXA2LCB0ZW1wMTcsIHRlbXA4LCB0ZW1wMTgpCisgICAgTVVMX1NISUZUX1NVTSh0ZW1wNiwgdGVtcDgsIHRlbXAxOCwgdGVtcDE3LCB0ZW1wMTEsIHRlbXAxNSwgdGVtcDEyLCB0ZW1wMTYsCisgICAgICAgICAgICAgICAgICB0ZW1wOCwgdGVtcDE1LCB0ZW1wNiwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxNiwgdGVtcDEwLCB0ZW1wMTQsCisgICAgICAgICAgICAgICAgICB0ZW1wMTgsIHRlbXAxMiwgdGVtcDE3LCB0ZW1wMTYpCisgICAgSU5TRVJUX0hBTEZfWDIodGVtcDEsIHRlbXAzLCB0ZW1wOSwgdGVtcDEzKQorICAgIElOU0VSVF9IQUxGX1gyKHRlbXA2LCB0ZW1wOCwgdGVtcDExLCB0ZW1wMTUpCisgICAgU0hJRlRfUl9TVU1fWDIodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsCisgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMiwgdGVtcDQsIHRlbXA1LCB0ZW1wNywgdGVtcDMsIHRlbXAxLCB0ZW1wOCwKKyAgICAgICAgICAgICAgICAgICB0ZW1wNikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA5LCB0ZW1wMTIsIHRlbXAxMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDE2LCB0ZW1wMTEsIHRlbXAxMCwgdGVtcDE1LCB0ZW1wMTQpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTAsIHRlbXAxMSwgdGVtcDE0LCB0ZW1wMTUsIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wMTcsIHRlbXAxOCwgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxNCwgdGVtcDE1KQorICAgIFNUT1JFX1NBVF9TVU1fWDIodGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXAxNywgdGVtcDE4LCB0ZW1wMTAsIHRlbXAxMSwKKyAgICAgICAgICAgICAgICAgICAgIHRlbXA5LCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMiwgdGVtcDEzLCB0ZW1wMTYsIHRlbXAzLCB0ZW1wNCwKKyAgICAgICAgICAgICAgICAgICAgIGRzdCwgMCwgMSwgMiwgMywgQlBTKQorCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xOCgpCisgICAgOiBbZHN0XSJyIihkc3QpLCBbaW5dInIiKGluKSwgW2tDMV0iciIoa0MxKSwgW2tDMl0iciIoa0MyKSwgW3JlZl0iciIocmVmKQorICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybV9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyBpbnQgRGlzdG80eDRfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgaW50IHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdGVtcDE3OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMiwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgIEJQUykKKyAgICBDT05WRVJUXzJfQllURVNfVE9fSEFMRih0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDksdGVtcDEwLCB0ZW1wMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEyLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyKQorICAgIFBBQ0tfMl9IQUxWRVNfVE9fV09SRCh0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMiwgdGVtcDEsIHRlbXAzLCB0ZW1wNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDcsIHRlbXAyLCB0ZW1wNCwgdGVtcDYsIHRlbXA4KQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAyLCB0ZW1wNCwgdGVtcDYsIHRlbXA4LCB0ZW1wOSwgdGVtcDEsIHRlbXAzLCB0ZW1wMTAsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDEsIHRlbXA5LCB0ZW1wMywgdGVtcDEwLCB0ZW1wNSwgdGVtcDExLCB0ZW1wNywgdGVtcDEyKQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXA1LCB0ZW1wMTEsIHRlbXA3LCB0ZW1wMiwgdGVtcDksIHRlbXAzLCB0ZW1wNiwgdGVtcDEyLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAyLCB0ZW1wOSwgdGVtcDYsIHRlbXAzLCB0ZW1wNCwgdGVtcDEsIHRlbXA4LCB0ZW1wMTApCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDEsIHRlbXA0LCB0ZW1wMTAsIHRlbXA4LCB0ZW1wNywgdGVtcDExLCB0ZW1wNSwgdGVtcDIsCisgICAgICAgICAgICAgICAgICAgICAgdGVtcDUsIHRlbXA3LCB0ZW1wMTEsIHRlbXAyLCB0ZW1wOSwgdGVtcDYsIHRlbXAzLCB0ZW1wMTIpCisgICAgQUJTX1g4KHRlbXAxLCB0ZW1wNCwgdGVtcDEwLCB0ZW1wOCwgdGVtcDcsIHRlbXAxMSwgdGVtcDUsIHRlbXAyKQorICAgIExPQURfV0lUSF9PRkZTRVRfWDQodGVtcDMsIHRlbXA2LCB0ZW1wOSwgdGVtcDEyLCB3LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAxMywgdGVtcDE0LCB0ZW1wMTUsIHRlbXAxNiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2KQorICAgIE1VTF9IQUxGKHRlbXAxNywgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LAorICAgICAgICAgICAgIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYpCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCAyLCAzLAorICAgICAgICAgICAgICAgICAgICAgICAgQlBTKQorICAgIENPTlZFUlRfMl9CWVRFU19UT19IQUxGKHRlbXA1LHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5LHRlbXAxMCwgdGVtcDExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxMiwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQpCisgICAgQUREX1NVQl9IQUxWRVNfWDQodGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTEsIHRlbXAxMikKKyAgICBQQUNLXzJfSEFMVkVTX1RPX1dPUkQodGVtcDksIHRlbXAxMCwgdGVtcDExLCB0ZW1wMTIsIHRlbXAxLCB0ZW1wMywgdGVtcDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXA3LCB0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCkKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wMiwgdGVtcDQsIHRlbXA2LCB0ZW1wOCwgdGVtcDksIHRlbXAxLCB0ZW1wMywgdGVtcDEwLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXAxLCB0ZW1wOSwgdGVtcDMsIHRlbXAxMCwgdGVtcDUsIHRlbXAxMSwgdGVtcDcsIHRlbXAxMikKKyAgICBBRERfU1VCX0hBTFZFU19YNCh0ZW1wNSwgdGVtcDExLCB0ZW1wNywgdGVtcDIsIHRlbXA5LCB0ZW1wMywgdGVtcDYsIHRlbXAxMiwKKyAgICAgICAgICAgICAgICAgICAgICB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDQsIHRlbXAxLCB0ZW1wOCwgdGVtcDEwKQorICAgIEFERF9TVUJfSEFMVkVTX1g0KHRlbXAxLCB0ZW1wNCwgdGVtcDEwLCB0ZW1wOCwgdGVtcDcsIHRlbXAxMSwgdGVtcDUsIHRlbXAyLAorICAgICAgICAgICAgICAgICAgICAgIHRlbXA1LCB0ZW1wNywgdGVtcDExLCB0ZW1wMiwgdGVtcDksIHRlbXA2LCB0ZW1wMywgdGVtcDEyKQorICAgIEFCU19YOCh0ZW1wMSwgdGVtcDQsIHRlbXAxMCwgdGVtcDgsIHRlbXA3LCB0ZW1wMTEsIHRlbXA1LCB0ZW1wMikKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAzLCB0ZW1wNiwgdGVtcDksIHRlbXAxMiwgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDQsIDgsIDEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYsIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCA0LCA4LCAxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxNikKKyAgICBNVUxfSEFMRih0ZW1wMywgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LAorICAgICAgICAgICAgIHRlbXA5LCB0ZW1wMTAsIHRlbXAxMSwgdGVtcDEyLCB0ZW1wMTMsIHRlbXAxNCwgdGVtcDE1LCB0ZW1wMTYpCisgICAgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xNygpCisgICAgOiBbYV0iciIoYSksIFtiXSJyIihiKSwgW3ddInIiKHcpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gYWJzKHRlbXAzIC0gdGVtcDE3KSA+PiA1OworfQorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfTUlQU2RzcFIyKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnRyYSBwcmVkaWN0aW9ucworCisjZGVmaW5lIEZJTExfUEFSVChKLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJ1c3cgICAgICAgICVbdmFsdWVdLCAgMCsiICNKICIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IiAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgIDQrIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICIuaWYgIiAjU0laRSAiID09IDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJ1c3cgICAgICAgICVbdmFsdWVdLCAgOCsiICNKICIqIiBYU1RSKEJQUykgIiglW2RzdF0pICBcblx0IiAgICAgIFwKKyAgICAidXN3ICAgICAgICAlW3ZhbHVlXSwgMTIrIiAjSiAiKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgXG5cdCIgICAgICBcCisgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisKKyNkZWZpbmUgRklMTF84X09SXzE2KERTVCwgVkFMVUUsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgdmFsdWUgPSAoVkFMVUUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAicmVwbHYucWIgICAlW3ZhbHVlXSwgICVbdmFsdWVdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgIEZJTExfUEFSVCggMCwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCAxLCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDIsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggMywgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA0LCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoIDUsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCggNiwgU0laRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA3LCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIi5pZiAiICNTSVpFICIgPT0gMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgIEZJTExfUEFSVCggOCwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKCA5LCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTAsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxMSwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDEyLCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGSUxMX1BBUlQoMTMsIDE2KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfUEFSVCgxNCwgMTYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMTF9QQVJUKDE1LCAxNikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgIDogW3ZhbHVlXSIrJnIiKHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbZHN0XSJyIigoRFNUKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFZFUlRJQ0FMX1BSRUQoRFNULCBUT1AsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkIyNTSVpFKHVpbnQ4X3QqIChEU1QpLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiAoVE9QKSkgeyAgICAgICAgICAgICBcCisgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoKFRPUCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGogPSAwOyBqIDwgKFNJWkUpOyArK2opIG1lbWNweSgoRFNUKSArIGogKiBCUFMsIChUT1ApLCAoU0laRSkpOyAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfOF9PUl8xNigoRFNUKSwgMTI3LCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK1ZFUlRJQ0FMX1BSRUQoZHN0LCB0b3AsIDgpCitWRVJUSUNBTF9QUkVEKGRzdCwgdG9wLCAxNikKKworI3VuZGVmIFZFUlRJQ0FMX1BSRUQKKworI2RlZmluZSBIT1JJWk9OVEFMX1BSRUQoRFNULCBMRUZULCBTSVpFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhvcml6b250YWxQcmVkIyNTSVpFKHVpbnQ4X3QqIChEU1QpLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiAoTEVGVCkpIHsgICAgICAgICAgXAorICBpZiAoTEVGVCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChqID0gMDsgaiA8IChTSVpFKTsgKytqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbWVtc2V0KChEU1QpICsgaiAqIEJQUywgKExFRlQpW2pdLCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTExfOF9PUl8xNigoRFNUKSwgMTI5LCAoU0laRSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0hPUklaT05UQUxfUFJFRChkc3QsIGxlZnQsIDgpCitIT1JJWk9OVEFMX1BSRUQoZHN0LCBsZWZ0LCAxNikKKworI3VuZGVmIEhPUklaT05UQUxfUFJFRAorCisjZGVmaW5lIENMSVBQSU5HKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAlW2xlZnRZXzFdICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVtsZWZ0WV8xXSAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiYWRkdS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbbGVmdFlfMV0gICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUucGggICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW2xlZnRZXzFdICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgIDcgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICA3ICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDBdLCAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAlW3RlbXAxXSwgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgIFxuXHQiCisKKyNkZWZpbmUgQ0xJUF84Ql9UT19EU1QoRFNULCBMRUZULCBUT1AsIFNJWkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBsZWZ0WV8xID0gKChpbnQpKExFRlQpW3ldIDw8IDE2KSArIChMRUZUKVt5XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgInJlcGx2LnBoICAgICAgICAlW2xlZnRZXzFdLCAlW2xlZnRZXzFdICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgIDQoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInN1YnUucGggICAgICAgICAlW2xlZnRZXzFdLCAlW2xlZnRZXzFdLCAlW2xlZnRfMV0gICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIENMSVBQSU5HKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbZHN0XSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmlmICIgI1NJWkUgIiA9PSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDgoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAxMiglW3RvcF0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAgIENMSVBQSU5HKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDBdLCAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICBcCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAxMiglW2RzdF0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtsZWZ0WV8xXSIrJnIiKGxlZnRZXzEpLCBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCAgICAgICBcCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogW2xlZnRfMV0iciIobGVmdF8xKSwgW3RvcF0iciIoKFRPUCkpLCBbZHN0XSJyIigoRFNUKSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1RPX0RTVChEU1QsIExFRlQsIFRPUCwgU0laRSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBsZWZ0XzEgPSAoKGludCkoTEVGVClbLTFdIDw8IDE2KSArIChMRUZUKVstMV07ICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHkgPSAwOyB5IDwgKFNJWkUpOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDTElQXzhCX1RPX0RTVCgoRFNUKSwgKExFRlQpLCAoVE9QKSwgKFNJWkUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKERTVCkgKz0gQlBTOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJVRV9NT1RJT04oRFNULCBMRUZULCBUT1AsIFNJWkUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uIyNTSVpFKHVpbnQ4X3QqIChEU1QpLCBjb25zdCB1aW50OF90KiAoTEVGVCksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiAoVE9QKSkgeyAgICAgICAgICAgICAgIFwKKyAgaWYgKChMRUZUKSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChUT1ApICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ0xJUF9UT19EU1QoKERTVCksIChMRUZUKSwgKFRPUCksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBIb3Jpem9udGFsUHJlZCMjU0laRSgoRFNUKSwgKExFRlQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogdHJ1ZSBtb3Rpb24gd2l0aG91dCBsZWZ0IHNhbXBsZXMgKGhlbmNlOiB3aXRoIGRlZmF1bHQgMTI5IHZhbHVlKSAgICAqLyAgXAorICAgIC8qIGlzIGVxdWl2YWxlbnQgdG8gVkUgcHJlZGljdGlvbiB3aGVyZSB5b3UganVzdCBjb3B5IHRoZSB0b3Agc2FtcGxlcy4gKi8gIFwKKyAgICAvKiBOb3RlIHRoYXQgaWYgdG9wIHNhbXBsZXMgYXJlIG5vdCBhdmFpbGFibGUsIHRoZSBkZWZhdWx0IHZhbHVlIGlzICAgICovICBcCisgICAgLyogdGhlbiAxMjksIGFuZCBub3QgMTI3IGFzIGluIHRoZSBWZXJ0aWNhbFByZWQgY2FzZS4gICAgICAgICAgICAgICAgICAqLyAgXAorICAgIGlmICgoVE9QKSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFZlcnRpY2FsUHJlZCMjU0laRSgoRFNUKSwgKFRPUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRklMTF84X09SXzE2KChEU1QpLCAxMjksIChTSVpFKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitUUlVFX01PVElPTihkc3QsIGxlZnQsIHRvcCwgOCkKK1RSVUVfTU9USU9OKGRzdCwgbGVmdCwgdG9wLCAxNikKKworI3VuZGVmIFRSVUVfTU9USU9OCisjdW5kZWYgQ0xJUF9UT19EU1QKKyN1bmRlZiBDTElQXzhCX1RPX0RTVAorI3VuZGVmIENMSVBQSU5HCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDTW9kZTE2KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgREMsIERDMTsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworCisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgImJlcXogICAgICAgICVbdG9wXSwgICAyZiAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgTE9BRF9XSVRIX09GRlNFVF9YNCh0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMF0sICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMV0sICVbdGVtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMl0sICVbdGVtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMF0sICVbdGVtcDBdLCAlW3RlbXAxXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMl0sICVbdGVtcDJdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbdGVtcDBdLCAlW3RlbXAyXSAgXG5cdCIKKyAgICAibW92ZSAgICAgICAgJVtEQzFdLCAgICVbRENdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgICAgJVtsZWZ0XSwgIDFmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMF0sICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMV0sICVbdGVtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMl0sICVbdGVtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMF0sICVbdGVtcDBdLCAlW3RlbXAxXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMl0sICVbdGVtcDJdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQzFdLCAgICVbdGVtcDBdLCAlW3RlbXAyXSAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgJVtEQ10sICAgICAlW0RDMV0gICAgXG5cdCIKKyAgICAiaiAgICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgICAgJVtsZWZ0XSwgIDRmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBMT0FEX1dJVEhfT0ZGU0VUX1g0KHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgNCwgOCwgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMF0sICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMV0sICVbdGVtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMl0sICVbdGVtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMF0sICVbdGVtcDBdLCAlW3RlbXAxXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVt0ZW1wMl0sICVbdGVtcDJdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbdGVtcDBdLCAlW3RlbXAyXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbRENdLCAgICAlW0RDXSAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgJVtEQ10sICAgICVbRENdLCAgICA1ICAgICAgICAgXG5cdCIKKyAgICAiaiAgICAgICAgICAgNWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgICAgJVtEQ10sICAgIDB4ODAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFtEQ10iPSZyIihEQyksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbREMxXSI9JnIiKERDMSkKKyAgICA6IFtsZWZ0XSJyIihsZWZ0KSwgW3RvcF0iciIodG9wKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKworICBGSUxMXzhfT1JfMTYoZHN0LCBEQywgMTYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGU4KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCBEQywgREMxOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAiYmVxeiAgICAgICAgJVt0b3BdLCAgIDJmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wMF0sIDAoJVt0b3BdKSAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wMV0sIDQoJVt0b3BdKSAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMF0sICVbdGVtcDBdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMV0sICVbdGVtcDFdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbdGVtcDBdLCAlW3RlbXAxXSAgXG5cdCIKKyAgICAibW92ZSAgICAgICAgJVtEQzFdLCAgICVbRENdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgICAgJVtsZWZ0XSwgIDFmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wMl0sIDAoJVtsZWZ0XSkgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wM10sIDQoJVtsZWZ0XSkgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMl0sICVbdGVtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQzFdLCAgICVbdGVtcDJdLCAlW3RlbXAzXSAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbRENdLCAgICAlW0RDMV0gICAgXG5cdCIKKyAgICAiaiAgICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxeiAgICAgICAgJVtsZWZ0XSwgIDRmICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wMl0sIDAoJVtsZWZ0XSkgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgJVt0ZW1wM10sIDQoJVtsZWZ0XSkgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wMl0sICVbdGVtcDJdICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgJVt0ZW1wM10sICVbdGVtcDNdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbdGVtcDJdLCAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgJVtEQ10sICAgICVbRENdLCAgICAlW0RDXSAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLncgICAgJVtEQ10sICVbRENdLCA0ICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiaiAgICAgICAgICAgNWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGkgICAgICAgICAgJVtEQ10sIDB4ODAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFtEQ10iPSZyIihEQyksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLCBbREMxXSI9JnIiKERDMSkKKyAgICA6IFtsZWZ0XSJyIihsZWZ0KSwgW3RvcF0iciIodG9wKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKworICBGSUxMXzhfT1JfMTYoZHN0LCBEQywgOCk7Cit9CisKK3N0YXRpYyB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxOworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICVbdGVtcDFdLCAgIC01KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAwXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdSAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgNCAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAlW3RlbXAwXSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgJVt0ZW1wMF0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICVbdGVtcDBdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAlW3RlbXAwXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVE00KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCBhMTAsIGEzMiwgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgY29uc3QgaW50IGMzNSA9IDB4ZmYwMGZmOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAxXSwgIDAoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAgJVthMTBdLCAgICAxKCVbdG9wXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgICVbdGVtcDJdLCAgMiglW3RvcF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGJ1ICAgICAgICAgICAgICAlW2EzMl0sICAgIDMoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMF0sICAtNSglW3RvcF0pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgICVbdGVtcDRdLCAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW2ExMF0sICAgICVbdGVtcDFdLCAgIDE2ICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVthMzJdLCAgICAlW3RlbXAyXSwgICAxNiAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hybC5waCAgICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDBdLCAgIDggICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFuZCAgICAgICAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAlW2MzNV0gICAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgJVt0ZW1wNF0gICAgICAgICAgXG5cdCIKKyAgICAic3VidS5waCAgICAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICVbdGVtcDRdICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAxXSwgICAxNiAgICAgICAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wMF0sICAgMTYgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAzXSwgICAlW2ExMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wM10sICAgJVthMzJdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDJdLCAgICVbYTEwXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAlW2EzMl0gICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXAwXSwgICVbdGVtcDFdLCAgICVbdGVtcDBdICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMV0sICAlW3RlbXAyXSwgICAlW3RlbXAzXSAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNV0sICAgJVthMTBdICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAzXSwgICVbdGVtcDVdLCAgICVbYTMyXSAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA0XSwgICAlW2ExMF0gICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgJVthMzJdICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICA3ICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgNyAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXA1XSwgICVbdGVtcDVdLCAgIDcgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wMl0sICAlW3RlbXAzXSwgICAlW3RlbXAyXSAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDNdLCAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0gICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAxXSwgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wMF0sICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAyXSwgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFthMTBdIj0mciIoYTEwKSwgW2EzMl0iPSZyIihhMzIpCisgICAgOiBbYzM1XSJyIihjMzUpLCBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBWRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2OworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWxoICAgICAgICAgICAgICVbdGVtcDFdLCAgIDMoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wM10sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDRdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDVdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDRdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA0XSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wNF0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDRdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNikKKyAgICA6IFt0b3BdInIiKHRvcCksIFtkc3RdInIiKGRzdCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIEhFNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDY7CisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAtNCglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJsYnUgICAgICAgICAgICAgJVt0ZW1wMV0sICAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAzXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDVdLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wNV0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA2XSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wNF0gICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnFiICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAzXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JsICAgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJyZXBsdi5xYiAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAzXSwgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDJdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBSRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGludCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTE7CisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAgLTEoJVt0b3BdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXA0XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wNF0sICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wNV0sICAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wNV0sICAgICVbdGVtcDhdICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgIDIgICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgIDIgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMyglW3RvcF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAlW3RlbXAxXSwgICAgMiglW3RvcF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImxidSAgICAgICAgICAgICAlW3RlbXAyXSwgICAgMSglW3RvcF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgImFkZHUgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDldICAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDEwXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxMF0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMTFdLCAgIDggICAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMF0sICAgIDggICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXA5XSwgICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxMF0sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksIFt0ZW1wMTFdIj0mciIodGVtcDExKQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVlI0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7CisgIGludCB0ZW1wNSwgdGVtcDYsIHRlbXA3LCB0ZW1wOCwgdGVtcDk7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgICVbdGVtcDBdLCAgIC00KCVbdG9wXSkgICAgICAgICAgICAgIFxuXHQiCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDBdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmxhICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICAlW3RlbXAxXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAibW92ZSAgICAgICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA3XSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wN10sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wOV0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAlW3RlbXA4XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDFdLCAgICVbdGVtcDFdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDhdLCAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNV0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXAyXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDhdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAiYXBwZW5kICAgICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXA2XSwgICAgOCAgICAgICAgICBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDhdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBMRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGludCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTE7CisgIF9fYXNtX18gdm9sYXRpbGUoCisgICAgInVsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDRdLCAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInBhY2tybC5waCAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDddLCAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wNl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wN10sICAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wOV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA4XSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wNF0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDExXSwgICAlW3RlbXA1XSwgICAgJVt0ZW1wOF0gICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDEwXSwgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTFdLCAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMF0sICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDExXSwgICAyICAgICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDI0ICAgICAgICAgXG5cdCIKKyAgICAic2xsICAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgMSAgICAgICAgICBcblx0IgorICAgICJyYWRkdS53LnFiICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMTBdLCAgICVbdGVtcDldICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDEwXSwgICAlW3RlbXAxMV0sICAgJVt0ZW1wMTBdICBcblx0IgorICAgICJhZGR1ICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInNocmFfci53ICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgIDIgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDldLCAgICAwKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMTBdLCAgIDIqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAlW3RlbXA5XSwgICAgJVt0ZW1wMTFdLCAgIDggICAgICAgICAgXG5cdCIKKyAgICAicHJlcGVuZCAgICAgICAgICVbdGVtcDEwXSwgICAlW3RlbXAxXSwgICAgOCAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wOV0sICAgIDEqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxMF0sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwKKyAgICAgIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwgW3RlbXAxMV0iPSZyIih0ZW1wMTEpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBWTDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgMCglW3RvcF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICA0KCVbdG9wXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wMl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA3XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wOF0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDhdLCAgICVbdGVtcDVdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNF0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDBdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wOF0sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXAzXSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDhdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAgJVt0ZW1wOF0sICAgJVt0ZW1wNl0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXAzXSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJzcmwgICAgICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInByZXBlbmQgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wNl0sICAgIDggICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA4XSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgICVbdGVtcDNdLCAgIDMqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbdG9wXSJyIih0b3ApLCBbZHN0XSJyIihkc3QpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBIRDQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNDsKKyAgaW50IHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4LCB0ZW1wOTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgInVsdyAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAidWx3ICAgICAgICAgICAgICAlW3RlbXAxXSwgICAtMSglW3RvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsYSAgICVbdGVtcDJdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAzXSwgICAlW3RlbXAxXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDFdLCAgICVbdGVtcDFdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMF0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wOV0sICAgJVt0ZW1wMl0sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcWhfci5waCAgICAgICAlW3RlbXA1XSwgICAlW3RlbXA3XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgICVbdGVtcDhdLCAgICVbdGVtcDddLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wMl0sICAgJVt0ZW1wMl0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgJVt0ZW1wN10gICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgICVbdGVtcDddLCAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDNdICAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wOF0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAlW3RlbXA5XSAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAgJVt0ZW1wN10sICAgJVt0ZW1wN10sICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJzaHJhX3IucGggICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wNl0sICAgICVbdGVtcDddICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICAlW3RlbXA1XSAgIFxuXHQiCisgICAgInByZWNycS5waC53ICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA3XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMV0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDZdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wN10sICAgMCoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA2XSwgICAxKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDVdLCAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wNF0sICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgICVbdGVtcDRdLCAgICVbdGVtcDJdLCAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgMioiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICAlW3RlbXA0XSwgICAzKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCBbdGVtcDhdIj0mciIodGVtcDgpLAorICAgICAgW3RlbXA5XSI9JnIiKHRlbXA5KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgSFU0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJ1bHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgLTUoJVt0b3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDFdLCAgICVbdGVtcDBdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAyXSwgICAlW3RlbXAwXSAgICAgICAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAicmVwbHYucWIgICAgICAgICVbdGVtcDddLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZHFoX3IucGggICAgICAlW3RlbXA0XSwgICAlW3RlbXAxXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGRxaF9yLnBoICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDNdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW3RlbXAzXSwgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wNl0sICAgJVt0ZW1wMV0sICAgICVbdGVtcDZdICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDJdLCAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW3RlbXA2XSwgICAlW3RlbXA2XSwgICAgJVt0ZW1wMl0gICBcblx0IgorICAgICJhZGR1LnBoICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wM10sICAgICVbdGVtcDBdICAgXG5cdCIKKyAgICAic2hyYV9yLnBoICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAyICAgICAgICAgIFxuXHQiCisgICAgInNocmFfci5waCAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAgMiAgICAgICAgICBcblx0IgorICAgICJwYWNrcmwucGggICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wNl0sICAgICVbdGVtcDVdICAgXG5cdCIKKyAgICAicHJlY3JxLnBoLncgICAgICVbdGVtcDJdLCAgICVbdGVtcDZdLCAgICAlW3RlbXA0XSAgIFxuXHQiCisgICAgImFwcGVuZCAgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXA1XSwgICAgMTYgICAgICAgICBcblx0IgorICAgICJwcmVjci5xYi5waCAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICVbdGVtcDJdICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgICVbdGVtcDNdLCAgIDAqIiBYU1RSKEJQUykgIiglW2RzdF0pIFxuXHQiCisgICAgInByZWNyLnFiLnBoICAgICAlW3RlbXAxXSwgICAlW3RlbXA3XSwgICAgJVt0ZW1wMF0gICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wN10sICAgMyoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICAicGFja3JsLnBoICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDFdLCAgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICAlW3RlbXAxXSwgICAyKiIgWFNUUihCUFMpICIoJVtkc3RdKSBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAgJVt0ZW1wMl0sICAgMSoiIFhTVFIoQlBTKSAiKCVbZHN0XSkgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgIDogW3RvcF0iciIodG9wKSwgW2RzdF0iciIoZHN0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYSA4eDggcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjIpCisKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHNfTUlQU2RzcFIyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICAvLyBVIGJsb2NrCisgIERDTW9kZTgoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDgoQzhWRTggKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkOChDOEhFOCArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb244KEM4VE04ICsgZHN0LCBsZWZ0LCB0b3ApOworICAvLyBWIGJsb2NrCisgIGRzdCArPSA4OworICBpZiAodG9wKSB0b3AgKz0gODsKKyAgaWYgKGxlZnQpIGxlZnQgKz0gMTY7CisgIERDTW9kZTgoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDgoQzhWRTggKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkOChDOEhFOCArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb244KEM4VE04ICsgZHN0LCBsZWZ0LCB0b3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbHVtYSAxNngxNiBwcmVkaWN0aW9uIChwYXJhZ3JhcGggMTIuMykKKworc3RhdGljIHZvaWQgSW50cmExNlByZWRzX01JUFNkc3BSMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQ01vZGUxNihJMTZEQzE2ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWQxNihJMTZWRTE2ICsgZHN0LCB0b3ApOworICBIb3Jpem9udGFsUHJlZDE2KEkxNkhFMTYgKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uMTYoSTE2VE0xNiArIGRzdCwgbGVmdCwgdG9wKTsKK30KKworLy8gTGVmdCBzYW1wbGVzIGFyZSB0b3BbLTUgLi4gLTJdLCB0b3BfbGVmdCBpcyB0b3BbLTFdLCB0b3AgYXJlCisvLyBsb2NhdGVkIGF0IHRvcFswLi4zXSwgYW5kIHRvcCByaWdodCBpcyB0b3BbNC4uN10KK3N0YXRpYyB2b2lkIEludHJhNFByZWRzX01JUFNkc3BSMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQzQoSTREQzQgKyBkc3QsIHRvcCk7CisgIFRNNChJNFRNNCArIGRzdCwgdG9wKTsKKyAgVkU0KEk0VkU0ICsgZHN0LCB0b3ApOworICBIRTQoSTRIRTQgKyBkc3QsIHRvcCk7CisgIFJENChJNFJENCArIGRzdCwgdG9wKTsKKyAgVlI0KEk0VlI0ICsgZHN0LCB0b3ApOworICBMRDQoSTRMRDQgKyBkc3QsIHRvcCk7CisgIFZMNChJNFZMNCArIGRzdCwgdG9wKTsKKyAgSEQ0KEk0SEQ0ICsgZHN0LCB0b3ApOworICBIVTQoSTRIVTQgKyBkc3QsIHRvcCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRyaWMKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKworI2RlZmluZSBHRVRfU1NFX0lOTkVSKEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICAgICAgICVbdGVtcDBdLCAgICAiICNBICIoJVthXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImx3ICAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgICIgI0EgIiglW2JdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10gICAgICAgICBcblx0IiAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSAgICAgICAgIFxuXHQiICAgICAgXAorICAiZHBhLncucGggICAgICAgICAkYWMwLCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJkcGEudy5waCAgICAgICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICBcblx0IgorCisjZGVmaW5lIEdFVF9TU0UoQSwgQiwgQywgRCkgICAgICAgICAgICAgICBcCisgIEdFVF9TU0VfSU5ORVIoQSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFVF9TU0VfSU5ORVIoQikgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFVF9TU0VfSU5ORVIoQykgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEdFVF9TU0VfSU5ORVIoRCkKKworc3RhdGljIGludCBTU0UxNngxNl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBHRVRfU1NFKCAwICogQlBTLCA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUykKKyAgICBHRVRfU1NFKCAxICogQlBTLCA0ICsgIDEgKiBCUFMsIDggKyAgMSAqIEJQUywgMTIgKyAgMSAqIEJQUykKKyAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICBHRVRfU1NFKCAzICogQlBTLCA0ICsgIDMgKiBCUFMsIDggKyAgMyAqIEJQUywgMTIgKyAgMyAqIEJQUykKKyAgICBHRVRfU1NFKCA0ICogQlBTLCA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUykKKyAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICBHRVRfU1NFKCA2ICogQlBTLCA0ICsgIDYgKiBCUFMsIDggKyAgNiAqIEJQUywgMTIgKyAgNiAqIEJQUykKKyAgICBHRVRfU1NFKCA3ICogQlBTLCA0ICsgIDcgKiBCUFMsIDggKyAgNyAqIEJQUywgMTIgKyAgNyAqIEJQUykKKyAgICBHRVRfU1NFKCA4ICogQlBTLCA0ICsgIDggKiBCUFMsIDggKyAgOCAqIEJQUywgMTIgKyAgOCAqIEJQUykKKyAgICBHRVRfU1NFKCA5ICogQlBTLCA0ICsgIDkgKiBCUFMsIDggKyAgOSAqIEJQUywgMTIgKyAgOSAqIEJQUykKKyAgICBHRVRfU1NFKDEwICogQlBTLCA0ICsgMTAgKiBCUFMsIDggKyAxMCAqIEJQUywgMTIgKyAxMCAqIEJQUykKKyAgICBHRVRfU1NFKDExICogQlBTLCA0ICsgMTEgKiBCUFMsIDggKyAxMSAqIEJQUywgMTIgKyAxMSAqIEJQUykKKyAgICBHRVRfU1NFKDEyICogQlBTLCA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUykKKyAgICBHRVRfU1NFKDEzICogQlBTLCA0ICsgMTMgKiBCUFMsIDggKyAxMyAqIEJQUywgMTIgKyAxMyAqIEJQUykKKyAgICBHRVRfU1NFKDE0ICogQlBTLCA0ICsgMTQgKiBCUFMsIDggKyAxNCAqIEJQUywgMTIgKyAxNCAqIEJQUykKKyAgICBHRVRfU1NFKDE1ICogQlBTLCA0ICsgMTUgKiBCUFMsIDggKyAxNSAqIEJQUywgMTIgKyAxNSAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4OF9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBpbnQgY291bnQ7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIm11bHQgICAkemVybywgICAgJHplcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICBHRVRfU1NFKCAwICogQlBTLCA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUykKKyAgICBHRVRfU1NFKCAxICogQlBTLCA0ICsgIDEgKiBCUFMsIDggKyAgMSAqIEJQUywgMTIgKyAgMSAqIEJQUykKKyAgICBHRVRfU1NFKCAyICogQlBTLCA0ICsgIDIgKiBCUFMsIDggKyAgMiAqIEJQUywgMTIgKyAgMiAqIEJQUykKKyAgICBHRVRfU1NFKCAzICogQlBTLCA0ICsgIDMgKiBCUFMsIDggKyAgMyAqIEJQUywgMTIgKyAgMyAqIEJQUykKKyAgICBHRVRfU1NFKCA0ICogQlBTLCA0ICsgIDQgKiBCUFMsIDggKyAgNCAqIEJQUywgMTIgKyAgNCAqIEJQUykKKyAgICBHRVRfU1NFKCA1ICogQlBTLCA0ICsgIDUgKiBCUFMsIDggKyAgNSAqIEJQUywgMTIgKyAgNSAqIEJQUykKKyAgICBHRVRfU1NFKCA2ICogQlBTLCA0ICsgIDYgKiBCUFMsIDggKyAgNiAqIEJQUywgMTIgKyAgNiAqIEJQUykKKyAgICBHRVRfU1NFKCA3ICogQlBTLCA0ICsgIDcgKiBCUFMsIDggKyAgNyAqIEJQUywgMTIgKyAgNyAqIEJQUykKKyAgICAibWZsbyAgICVbY291bnRdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgIFt0ZW1wM10iPSZyIih0ZW1wMyksIFtjb3VudF0iPSZyIihjb3VudCkKKyAgICA6IFthXSJyIihhKSwgW2JdInIiKGIpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4X01JUFNkc3BSMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGludCBjb3VudDsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIEdFVF9TU0UoMCAqIEJQUywgNCArIDAgKiBCUFMsIDEgKiBCUFMsIDQgKyAxICogQlBTKQorICAgIEdFVF9TU0UoMiAqIEJQUywgNCArIDIgKiBCUFMsIDMgKiBCUFMsIDQgKyAzICogQlBTKQorICAgIEdFVF9TU0UoNCAqIEJQUywgNCArIDQgKiBCUFMsIDUgKiBCUFMsIDQgKyA1ICogQlBTKQorICAgIEdFVF9TU0UoNiAqIEJQUywgNCArIDYgKiBCUFMsIDcgKiBCUFMsIDQgKyA3ICogQlBTKQorICAgICJtZmxvICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBTU0U0eDRfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgaW50IGNvdW50OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgR0VUX1NTRSgwICogQlBTLCAxICogQlBTLCAyICogQlBTLCAzICogQlBTKQorICAgICJtZmxvICAgJVtjb3VudF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2NvdW50XSI9JnIiKGNvdW50KQorICAgIDogW2FdInIiKGEpLCBbYl0iciIoYikKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisgIHJldHVybiBjb3VudDsKK30KKworI3VuZGVmIEdFVF9TU0UKKyN1bmRlZiBHRVRfU1NFX0lOTkVSCisKKyNlbmRpZiAgLy8gIVdPUktfQVJPVU5EX0dDQworCisjdW5kZWYgRklMTF84X09SXzE2CisjdW5kZWYgRklMTF9QQVJUCisjdW5kZWYgT1VUUFVUX0VBUkxZX0NMT0JCRVJfUkVHU18xNworI3VuZGVmIE1VTF9IQUxGCisjdW5kZWYgQUJTX1g4CisjdW5kZWYgQUREX1NVQl9IQUxWRVNfWDQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1YW50aXphdGlvbgorLy8KKworLy8gbWFjcm8gZm9yIG9uZSBwYXNzIHRocm91Z2ggZm9yIGxvb3AgaW4gUXVhbnRpemVCbG9jayByZWFkaW5nIDIgdmFsdWVzIGF0IHRpbWUKKy8vIFFVQU5URElWIG1hY3JvIGlubGluZWQKKy8vIEogLSBvZmZzZXQgaW4gYnl0ZXMgKGtaaWd6YWdbbl0gKiAyKQorLy8gSyAtIG9mZnNldCBpbiBieXRlcyAoa1ppZ3phZ1tuXSAqIDQpCisvLyBOIC0gb2Zmc2V0IGluIGJ5dGVzIChuICogMikKKy8vIE4xIC0gb2Zmc2V0IGluIGJ5dGVzICgobiArIDEpICogMikKKyNkZWZpbmUgUVVBTlRJWkVfT05FKEosIEssIE4sIE4xKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAgJVt0ZW1wMV0sICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1bHcgICAgICAgICAlW3RlbXAyXSwgICAgICIgI0ogIiglW3Bwc2hhcnBlbl0pICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSyAiKCVbcHB6dGhyZXNoXSkgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wNl0sICAgICAiICNLICIrNCglW3BwenRocmVzaF0pICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhYnNxX3MucGggICAlW3RlbXA0XSwgICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wNl0sICAgICAgICAgMTYsICAgICAgIDE2ICBcblx0IiAgICAgICAgXAorICAiYWRkdS5waCAgICAgJVtjb2VmZl0sICAgICAlW3RlbXA0XSwgICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaHJhLnBoICAgICAlW3NpZ25dLCAgICAgICVbdGVtcDFdLCAgICAgICAgIDE1ICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxpICAgICAgICAgICVbbGV2ZWxdLCAgICAgMHgxMDAwMSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiY21wLmx0LnBoICAgJVt0ZW1wM10sICAgICAlW2NvZWZmXSAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAxXSwgICAgICIgI0ogIiglW3BwaXFdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInBpY2sucGggICAgICVbdGVtcDVdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJDAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibHcgICAgICAgICAgJVt0ZW1wMl0sICAgICAiICNLICIoJVtwcGJpYXNdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJiZXF6ICAgICAgICAlW3RlbXA1XSwgICAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKCVbcHBxXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiYmVxICAgICAgICAgJVt0ZW1wNV0sICAgICAlW2xldmVsXSwgICAgICAgICAxZiAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDVdLCAgICAgICAgIDB4MSAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFuZGkgICAgICAgICVbdGVtcDRdLCAgICAgJVtjb2VmZl0sICAgICAgICAgMHhmZmZmICAgICAgICBcblx0IiAgICAgICAgXAorICAiYmVxeiAgICAgICAgJVt0ZW1wNV0sICAgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW2xldmVsXSwgICAgICVbdGVtcDRdLCAgICAgICAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjSiAiKzIoJVtwcGluXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhZGR1ICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDJdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNyYSAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMTcgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2x0ICAgICAgICAgJVt0ZW1wNF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJtb3ZuICAgICAgICAlW2xldmVsXSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbdGVtcDRdICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFuZGkgICAgICAgICVbdGVtcDZdLCAgICAgJVtzaWduXSwgICAgICAgICAgMHhmZmZmICAgICAgICBcblx0IiAgICAgICAgXAorICAieG9yICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJzdWJ1ICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbdGVtcDVdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wM10gICAgICBcblx0IiAgICAgICAgXAorICAib3IgICAgICAgICAgJVtyZXRdLCAgICAgICAlW3JldF0sICAgICAgICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW2xldmVsXSwgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbdGVtcDVdLCAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaiAgICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImxodSAgICAgICAgICVbdGVtcDFdLCAgICAgIiAjSiAiKzIoJVtwcGlxXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JsICAgICAgICAgJVt0ZW1wNV0sICAgICAlW2NvZWZmXSwgICAgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJtdWwgICAgICAgICAlW2xldmVsXSwgICAgICVbdGVtcDVdLCAgICAgICAgICVbdGVtcDFdICAgICAgXG5cdCIgICAgICAgIFwKKyAgImx3ICAgICAgICAgICVbdGVtcDJdLCAgICAgIiAjSyAiKzQoJVtwcGJpYXNdKSAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wM10sICAgICAiICNKICIrMiglW3BwcV0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhZGR1ICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDJdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNyYSAgICAgICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgMTcgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JsICAgICAgICAgJVt0ZW1wNl0sICAgICAlW3NpZ25dLCAgICAgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzbHQgICAgICAgICAlW3RlbXA0XSwgICAgICVbbWF4X2xldmVsXSwgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm1vdm4gICAgICAgICVbbGV2ZWxdLCAgICAgJVttYXhfbGV2ZWxdLCAgICAgJVt0ZW1wNF0gICAgICBcblx0IiAgICAgICAgXAorICAieG9yICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJzdWJ1ICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDZdICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbdGVtcDVdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVt0ZW1wM10gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNKICIoJVtwcGluXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAkMCwgICAgICAgICAgICIgI04gIiglW3BvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm9yICAgICAgICAgICVbcmV0XSwgICAgICAgJVtyZXRdLCAgICAgICAgICAgJVtsZXZlbF0gICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJVt0ZW1wNV0sICAgICAiICNKICIrMiglW3BwaW5dKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW2xldmVsXSwgICAgICIgI04xICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImogICAgICAgICAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaHUgICAgICAgICAlW3RlbXAxXSwgICAgICIgI0ogIiglW3BwaXFdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImx3ICAgICAgICAgICVbdGVtcDJdLCAgICAgIiAjSyAiKCVbcHBiaWFzXSkgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidWx3ICAgICAgICAgJVt0ZW1wM10sICAgICAiICNKICIoJVtwcHFdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJhbmRpICAgICAgICAlW3RlbXA1XSwgICAgICVbY29lZmZdLCAgICAgICAgIDB4ZmZmZiAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNybCAgICAgICAgICVbdGVtcDBdLCAgICAgJVtjb2VmZl0sICAgICAgICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAibGh1ICAgICAgICAgJVt0ZW1wNl0sICAgICAiICNKICIrMiglW3BwaXFdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsdyAgICAgICAgICAlW2NvZWZmXSwgICAgICIgI0sgIis0KCVbcHBiaWFzXSkgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgIm11bCAgICAgICAgICVbbGV2ZWxdLCAgICAgJVt0ZW1wNV0sICAgICAgICAgJVt0ZW1wMV0gICAgICBcblx0IiAgICAgICAgXAorICAibXVsICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXAwXSwgICAgICAgICAlW3RlbXA2XSAgICAgIFxuXHQiICAgICAgICBcCisgICJhZGR1ICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbdGVtcDJdICAgICAgXG5cdCIgICAgICAgIFwKKyAgImFkZHUgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgICAgJVtjb2VmZl0gICAgICBcblx0IiAgICAgICAgXAorICAicHJlY3JxLnBoLncgJVtsZXZlbF0sICAgICAlW3RlbXA0XSwgICAgICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJzaHJhLnBoICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgIDEgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImNtcC5sdC5waCAgICVbbWF4X2xldmVsMV0sJVtsZXZlbF0gICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicGljay5waCAgICAgJVtsZXZlbF0sICAgICAlW21heF9sZXZlbF0sICAgICAlW2xldmVsXSAgICAgIFxuXHQiICAgICAgICBcCisgICJ4b3IgICAgICAgICAlW2xldmVsXSwgICAgICVbbGV2ZWxdLCAgICAgICAgICVbc2lnbl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgInN1YnUucGggICAgICVbbGV2ZWxdLCAgICAgJVtsZXZlbF0sICAgICAgICAgJVtzaWduXSAgICAgICBcblx0IiAgICAgICAgXAorICAibXVsLnBoICAgICAgJVt0ZW1wM10sICAgICAlW2xldmVsXSwgICAgICAgICAlW3RlbXAzXSAgICAgIFxuXHQiICAgICAgICBcCisgICJvciAgICAgICAgICAlW3JldF0sICAgICAgICVbcmV0XSwgICAgICAgICAgICVbbGV2ZWxdICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICVbbGV2ZWxdLCAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JsICAgICAgICAgJVtsZXZlbF0sICAgICAlW2xldmVsXSwgICAgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzaCAgICAgICAgICAlW2xldmVsXSwgICAgICIgI04xICIoJVtwb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICVbdGVtcDNdLCAgICAgIiAjSiAiKCVbcHBpbl0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAiaiAgICAgICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNoICAgICAgICAgICQwLCAgICAgICAgICAgIiAjTiAiKCVbcG91dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic2ggICAgICAgICAgJDAsICAgICAgICAgICAiICNOMSAiKCVbcG91dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAkMCwgICAgICAgICAgICIgI0ogIiglW3BwaW5dKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfTUlQU2RzcFIyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LHRlbXA2OworICBpbnQgc2lnbiwgY29lZmYsIGxldmVsOworICBpbnQgbWF4X2xldmVsID0gTUFYX0xFVkVMOworICBpbnQgbWF4X2xldmVsMSA9IG1heF9sZXZlbCA8PCAxNiB8IG1heF9sZXZlbDsKKyAgaW50IHJldCA9IDA7CisKKyAgaW50MTZfdCogcHBpbiAgICAgICAgICAgICA9ICZpblswXTsKKyAgaW50MTZfdCogcG91dCAgICAgICAgICAgICA9ICZvdXRbMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcHNoYXJwZW4gPSAmbXR4LT5zaGFycGVuX1swXTsKKyAgY29uc3QgdWludDMyX3QqIHBwenRocmVzaCA9ICZtdHgtPnp0aHJlc2hfWzBdOworICBjb25zdCB1aW50MTZfdCogcHBxICAgICAgID0gJm10eC0+cV9bMF07CisgIGNvbnN0IHVpbnQxNl90KiBwcGlxICAgICAgPSAmbXR4LT5pcV9bMF07CisgIGNvbnN0IHVpbnQzMl90KiBwcGJpYXMgICAgPSAmbXR4LT5iaWFzX1swXTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICBRVUFOVElaRV9PTkUoIDAsICAwLCAgMCwgIDIpCisgICAgUVVBTlRJWkVfT05FKCA0LCAgOCwgMTAsIDEyKQorICAgIFFVQU5USVpFX09ORSggOCwgMTYsICA0LCAgOCkKKyAgICBRVUFOVElaRV9PTkUoMTIsIDI0LCAxNCwgMjQpCisgICAgUVVBTlRJWkVfT05FKDE2LCAzMiwgIDYsIDE2KQorICAgIFFVQU5USVpFX09ORSgyMCwgNDAsIDIyLCAyNikKKyAgICBRVUFOVElaRV9PTkUoMjQsIDQ4LCAxOCwgMjApCisgICAgUVVBTlRJWkVfT05FKDI4LCA1NiwgMjgsIDMwKQorCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksCisgICAgICBbc2lnbl0iPSZyIihzaWduKSwgW2NvZWZmXSI9JnIiKGNvZWZmKSwKKyAgICAgIFtsZXZlbF0iPSZyIihsZXZlbCksIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFtyZXRdIismciIocmV0KQorICAgIDogW3BwaW5dInIiKHBwaW4pLCBbcG91dF0iciIocG91dCksIFttYXhfbGV2ZWwxXSJyIihtYXhfbGV2ZWwxKSwKKyAgICAgIFtwcGlxXSJyIihwcGlxKSwgW21heF9sZXZlbF0iciIobWF4X2xldmVsKSwKKyAgICAgIFtwcGJpYXNdInIiKHBwYmlhcyksIFtwcHp0aHJlc2hdInIiKHBwenRocmVzaCksCisgICAgICBbcHBzaGFycGVuXSJyIihwcHNoYXJwZW4pLCBbcHBxXSJyIihwcHEpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiAocmV0ICE9IDApOworfQorCitzdGF0aWMgaW50IFF1YW50aXplMkJsb2Nrc19NSVBTZHNwUjIoaW50MTZfdCBpblszMl0sIGludDE2X3Qgb3V0WzMyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFF1YW50aXplQmxvY2tfTUlQU2RzcFIyKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIG10eCkgPDwgMDsKKyAgbnogfD0gUXVhbnRpemVCbG9ja19NSVBTZHNwUjIoaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKyN1bmRlZiBRVUFOVElaRV9PTkUKKworLy8gbWFjcm8gZm9yIG9uZSBob3Jpem9udGFsIHBhc3MgaW4gRlRyYW5zZm9ybVdIVAorLy8gdGVtcDAuLnRlbXA3IGhvbGRzIHRtcFswXS4udG1wWzE1XQorLy8gQSwgQiwgQywgRCAtIG9mZnNldCBpbiBieXRlcyB0byBsb2FkIGZyb20gaW4gYnVmZmVyCisvLyBURU1QMCwgVEVNUDEgLSByZWdpc3RlcnMgZm9yIGNvcnJlc3BvbmRpbmcgdG1wIGVsZW1lbnRzCisjZGVmaW5lIEhPUklaT05UQUxfUEFTU19XSFQoQSwgQiwgQywgRCwgVEVNUDAsIFRFTVAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAiICNBICIoJVtpbl0pICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgIiAjQiAiKCVbaW5dKSAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgJVt0ZW1wOF0sICAgICAiICNDICIoJVtpbl0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAibGggICAgICAgICAgICAgICVbdGVtcDldLCAgICAgIiAjRCAiKCVbaW5dKSAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAlWyIgI1RFTVAxICJdLCAgJVsiICNURU1QMCAiXSwgIDE2LCAgMTYgIFxuXHQiICAgICAgICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgJVt0ZW1wOV0sICAgICAlW3RlbXA4XSwgICAgIDE2LCAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICVbdGVtcDhdLCAgICAgJVsiICNURU1QMSAiXSwgICVbdGVtcDldICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAlW3RlbXA5XSwgICAgICVbIiAjVEVNUDEgIl0sICAlW3RlbXA5XSAgIFxuXHQiICAgICAgICAgICAgICBcCisgICJwcmVjcnEucGgudyAgICAgJVsiICNURU1QMCAiXSwgICVbdGVtcDhdLCAgICAgJVt0ZW1wOV0gICBcblx0IiAgICAgICAgICAgICAgXAorICAiYXBwZW5kICAgICAgICAgICVbdGVtcDhdLCAgICAgJVt0ZW1wOV0sICAgICAxNiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVAxICJdLCAgJVsiICNURU1QMCAiXSwgICVbdGVtcDhdIFxuXHQiICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDAgIl0sICAlW3RlbXA4XSBcblx0IiAgICAgICAgICAgICAgXAorICAicm90ciAgICAgICAgICAgICVbIiAjVEVNUDEgIl0sICAlWyIgI1RFTVAxICJdLCAgMTYgICAgICAgXG5cdCIKKworLy8gbWFjcm8gZm9yIG9uZSB2ZXJ0aWNhbCBwYXNzIGluIEZUcmFuc2Zvcm1XSFQKKy8vIHRlbXAwLi50ZW1wNyBob2xkcyB0bXBbMF0uLnRtcFsxNV0KKy8vIEEsIEIsIEMsIEQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIHN0b3JlIHRvIG91dCBidWZmZXIKKy8vIFRFTVAwLCBURU1QMiwgVEVNUDQgYW5kIFRFTVA2IC0gcmVnaXN0ZXJzIGZvciBjb3JyZXNwb25kaW5nIHRtcCBlbGVtZW50cworI2RlZmluZSBWRVJUSUNBTF9QQVNTX1dIVChBLCBCLCBDLCBELCBURU1QMCwgVEVNUDIsIFRFTVA0LCBURU1QNikgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAlW3RlbXA4XSwgICAgICVbIiAjVEVNUDAgIl0sICAlWyIgI1RFTVA0ICJdICAgIFxuXHQiICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgJVt0ZW1wOV0sICAgICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QNiAiXSAgICBcblx0IiAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICVbIiAjVEVNUDIgIl0sICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QNiAiXSAgXG5cdCIgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAlWyIgI1RFTVA2ICJdLCAgJVsiICNURU1QMCAiXSwgICVbIiAjVEVNUDQgIl0gIFxuXHQiICAgICAgICBcCisgICJhZGRxaC5waCAgICAgICAgJVsiICNURU1QMCAiXSwgICVbdGVtcDhdLCAgICAgJVt0ZW1wOV0gICAgICAgICBcblx0IiAgICAgICAgXAorICAic3VicWgucGggICAgICAgICVbIiAjVEVNUDQgIl0sICAlWyIgI1RFTVA2ICJdLCAgJVsiICNURU1QMiAiXSAgXG5cdCIgICAgICAgIFwKKyAgImFkZHFoLnBoICAgICAgICAlWyIgI1RFTVAyICJdLCAgJVsiICNURU1QMiAiXSwgICVbIiAjVEVNUDYgIl0gIFxuXHQiICAgICAgICBcCisgICJzdWJxaC5waCAgICAgICAgJVsiICNURU1QNiAiXSwgICVbdGVtcDhdLCAgICAgJVt0ZW1wOV0gICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgICAgICVbIiAjVEVNUDAgIl0sICAiICNBICIoJVtvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAlWyIgI1RFTVAyICJdLCAgIiAjQiAiKCVbb3V0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJ1c3cgICAgICAgICAgICAgJVsiICNURU1QNCAiXSwgICIgI0MgIiglW291dF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAidXN3ICAgICAgICAgICAgICVbIiAjVEVNUDYgIl0sICAiICNEICIoJVtvdXRdKSAgICAgICAgICAgICAgICAgXG5cdCIKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVF9NSVBTZHNwUjIoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICBpbnQgdGVtcDUsIHRlbXA2LCB0ZW1wNywgdGVtcDgsIHRlbXA5OworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIEhPUklaT05UQUxfUEFTU19XSFQoICAwLCAgMzIsICA2NCwgIDk2LCB0ZW1wMCwgdGVtcDEpCisgICAgSE9SSVpPTlRBTF9QQVNTX1dIVCgxMjgsIDE2MCwgMTkyLCAyMjQsIHRlbXAyLCB0ZW1wMykKKyAgICBIT1JJWk9OVEFMX1BBU1NfV0hUKDI1NiwgMjg4LCAzMjAsIDM1MiwgdGVtcDQsIHRlbXA1KQorICAgIEhPUklaT05UQUxfUEFTU19XSFQoMzg0LCA0MTYsIDQ0OCwgNDgwLCB0ZW1wNiwgdGVtcDcpCisgICAgVkVSVElDQUxfUEFTU19XSFQoMCwgIDgsIDE2LCAyNCwgdGVtcDAsIHRlbXAyLCB0ZW1wNCwgdGVtcDYpCisgICAgVkVSVElDQUxfUEFTU19XSFQoNCwgMTIsIDIwLCAyOCwgdGVtcDEsIHRlbXAzLCB0ZW1wNSwgdGVtcDcpCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNyksIFt0ZW1wOF0iPSZyIih0ZW1wOCksCisgICAgICBbdGVtcDldIj0mciIodGVtcDkpCisgICAgOiBbaW5dInIiKGluKSwgW291dF0iciIob3V0KQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworI3VuZGVmIFZFUlRJQ0FMX1BBU1NfV0hUCisjdW5kZWYgSE9SSVpPTlRBTF9QQVNTX1dIVAorCisvLyBtYWNybyBmb3IgY29udmVydGluZyBjb2VmZmljaWVudHMgdG8gYmluCisvLyBjb252ZXJ0IDggY29lZmZzIGF0IHRpbWUKKy8vIEEsIEIsIEMsIEQgLSBvZmZzZXRzIGluIGJ5dGVzIHRvIGxvYWQgZnJvbSBvdXQgYnVmZmVyCisjZGVmaW5lIENPTlZFUlRfQ09FRkZTX1RPX0JJTihBLCBCLCBDLCBEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAwXSwgICIgI0EgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInVsdyAgICAgICAgJVt0ZW1wMV0sICAiICNCICIoJVtvdXRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJ1bHcgICAgICAgICVbdGVtcDJdLCAgIiAjQyAiKCVbb3V0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAidWx3ICAgICAgICAlW3RlbXAzXSwgICIgI0QgIiglW291dF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wMF0sICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhYnNxX3MucGggICVbdGVtcDFdLCAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWJzcV9zLnBoICAlW3RlbXAyXSwgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFic3Ffcy5waCAgJVt0ZW1wM10sICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAzICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMyAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDMgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGxfcy5waCAgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsX3MucGggICVbdGVtcDJdLCAgJVt0ZW1wMl0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbF9zLnBoICAlW3RlbXAzXSwgICVbdGVtcDNdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaHJsLnBoICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEwICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hybC5waCAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAxMCAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNocmwucGggICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgMTAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDBdLCAgJVt0ZW1wMF0sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic2hsbC5waCAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAyICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInNobGwucGggICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMiAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzaGxsLnBoICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDIgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDBdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDRdLCAgJVt0ZW1wNF0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wNV0sICAlW3RlbXAxXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA0XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXAxXSwgICVbdGVtcDFdLCAgICAxNiwgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNF0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDBdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiZXh0ICAgICAgICAlW3RlbXA2XSwgICVbdGVtcDJdLCAgICAwLCAgICAgICAxNiAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAwXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wNV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICAgMTYsICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICVbdGVtcDZdLCAgJVt0ZW1wNl0sICAgICVbZGlzdF0gICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkaXUgICAgICAlW3RlbXA4XSwgICVbdGVtcDhdLCAgICAxICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgInN3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDVdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJsdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXAxXSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImV4dCAgICAgICAgJVt0ZW1wN10sICAlW3RlbXAzXSwgICAgMCwgICAgICAgMTYgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMV0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDZdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJleHQgICAgICAgICVbdGVtcDNdLCAgJVt0ZW1wM10sICAgIDE2LCAgICAgIDE2ICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAiYWRkdSAgICAgICAlW3RlbXA3XSwgICVbdGVtcDddLCAgICAlW2Rpc3RdICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZGl1ICAgICAgJVt0ZW1wOF0sICAlW3RlbXA4XSwgICAgMSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJzdyAgICAgICAgICVbdGVtcDhdLCAgMCglW3RlbXA2XSkgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAibHcgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgJVt0ZW1wM10sICAlW3RlbXAzXSwgICAgJVtkaXN0XSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDddKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wN10pICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgIFwKKyAgImx3ICAgICAgICAgJVt0ZW1wOF0sICAwKCVbdGVtcDNdKSAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICBcCisgICJhZGRpdSAgICAgICVbdGVtcDhdLCAgJVt0ZW1wOF0sICAgIDEgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICAgXAorICAic3cgICAgICAgICAlW3RlbXA4XSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICAgICAgIFxuXHQiCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIHJlZiwgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaW50IGo7CisgIGludCBkaXN0cmlidXRpb25bTUFYX0NPRUZGX1RIUkVTSCArIDFdID0geyAwIH07CisgIGNvbnN0IGludCBtYXhfY29lZmYgPSAoTUFYX0NPRUZGX1RIUkVTSCA8PCAxNikgKyBNQVhfQ09FRkZfVEhSRVNIOworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDcsIHRlbXA4OworCisgICAgVlA4RlRyYW5zZm9ybShyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgIENPTlZFUlRfQ09FRkZTX1RPX0JJTiggMCwgIDQsICA4LCAxMikKKyAgICAgIENPTlZFUlRfQ09FRkZTX1RPX0JJTigxNiwgMjAsIDI0LCAyOCkKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwKKyAgICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KQorICAgICAgOiBbZGlzdF0iciIoZGlzdHJpYnV0aW9uKSwgW291dF0iciIob3V0KSwgW21heF9jb2VmZl0iciIobWF4X2NvZWZmKQorICAgICAgOiAibWVtb3J5IgorICAgICk7CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworI3VuZGVmIENPTlZFUlRfQ09FRkZTX1RPX0JJTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE1JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9NSVBTZHNwUjI7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX01JUFNkc3BSMjsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1fTUlQU2RzcFIyOworCisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X01JUFNkc3BSMjsKKyAgVlA4VERpc3RvMTZ4MTYgPSBEaXN0bzE2eDE2X01JUFNkc3BSMjsKKworICBWUDhFbmNQcmVkTHVtYTE2ID0gSW50cmExNlByZWRzX01JUFNkc3BSMjsKKyAgVlA4RW5jUHJlZENocm9tYTggPSBJbnRyYUNocm9tYVByZWRzX01JUFNkc3BSMjsKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHNfTUlQU2RzcFIyOworCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X01JUFNkc3BSMjsKKyAgVlA4U1NFOHg4ID0gU1NFOHg4X01JUFNkc3BSMjsKKyAgVlA4U1NFMTZ4OCA9IFNTRTE2eDhfTUlQU2RzcFIyOworICBWUDhTU0U0eDQgPSBTU0U0eDRfTUlQU2RzcFIyOworI2VuZGlmCisKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfTUlQU2RzcFIyOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfTUlQU2RzcFIyOworCisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg1YWRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbXNhLmMKQEAgLTAsMCArMSw4OTYgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmVyc2lvbiBvZiBlbmNvZGVyIGRzcCBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiAgUHJhc2hhbnQgUGF0aWwgICAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcworCisjZGVmaW5lIElEQ1RfMURfVyhpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgdjRpMzIgYTFfbSwgYjFfbSwgYzFfbSwgZDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBjb3NwaThzcXJ0Mm1pbnVzMSA9IF9fbXNhX2ZpbGxfdygyMDA5MSk7ICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIHNpbnBpOHNxcnQyID0gX19tc2FfZmlsbF93KDM1NDY4KTsgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgY190bXAxX20gPSBpbjEgKiBzaW5waThzcXJ0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBjX3RtcDJfbSA9IGluMyAqIGNvc3BpOHNxcnQybWludXMxOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIGRfdG1wMV9tID0gaW4xICogY29zcGk4c3FydDJtaW51czE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgZF90bXAyX20gPSBpbjMgKiBzaW5waThzcXJ0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFERFNVQjIoaW4wLCBpbjIsIGExX20sIGIxX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9XMl9TVyhjX3RtcDFfbSwgY190bXAyX20sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjX3RtcDJfbSA9IGNfdG1wMl9tICsgaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGMxX20gPSBjX3RtcDFfbSAtIGNfdG1wMl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9XMl9TVyhkX3RtcDFfbSwgZF90bXAyX20sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkX3RtcDFfbSA9IGRfdG1wMV9tICsgaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGQxX20gPSBkX3RtcDFfbSArIGRfdG1wMl9tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQlVUVEVSRkxZXzQoYTFfbSwgYjFfbSwgYzFfbSwgZDFfbSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7ICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSVRyYW5zZm9ybU9uZShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IGludDE2X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgdjhpMTYgaW5wdXQwLCBpbnB1dDE7CisgIHY0aTMyIGluMCwgaW4xLCBpbjIsIGluMywgaHowLCBoejEsIGh6MiwgaHozLCB2dDAsIHZ0MSwgdnQyLCB2dDM7CisgIHY0aTMyIHJlczAsIHJlczEsIHJlczIsIHJlczM7CisgIHYxNmk4IGRlc3QwLCBkZXN0MSwgZGVzdDIsIGRlc3QzOworICBjb25zdCB2MTZpOCB6ZXJvID0geyAwIH07CisKKyAgTERfU0gyKGluLCA4LCBpbnB1dDAsIGlucHV0MSk7CisgIFVOUENLX1NIX1NXKGlucHV0MCwgaW4wLCBpbjEpOworICBVTlBDS19TSF9TVyhpbnB1dDEsIGluMiwgaW4zKTsKKyAgSURDVF8xRF9XKGluMCwgaW4xLCBpbjIsIGluMywgaHowLCBoejEsIGh6MiwgaHozKTsKKyAgVFJBTlNQT1NFNHg0X1NXX1NXKGh6MCwgaHoxLCBoejIsIGh6MywgaHowLCBoejEsIGh6MiwgaHozKTsKKyAgSURDVF8xRF9XKGh6MCwgaHoxLCBoejIsIGh6MywgdnQwLCB2dDEsIHZ0MiwgdnQzKTsKKyAgU1JBUklfVzRfU1codnQwLCB2dDEsIHZ0MiwgdnQzLCAzKTsKKyAgVFJBTlNQT1NFNHg0X1NXX1NXKHZ0MCwgdnQxLCB2dDIsIHZ0MywgdnQwLCB2dDEsIHZ0MiwgdnQzKTsKKyAgTERfU0I0KHJlZiwgQlBTLCBkZXN0MCwgZGVzdDEsIGRlc3QyLCBkZXN0Myk7CisgIElMVlJfQjRfU1coemVybywgZGVzdDAsIHplcm8sIGRlc3QxLCB6ZXJvLCBkZXN0MiwgemVybywgZGVzdDMsCisgICAgICAgICAgICAgcmVzMCwgcmVzMSwgcmVzMiwgcmVzMyk7CisgIElMVlJfSDRfU1coemVybywgcmVzMCwgemVybywgcmVzMSwgemVybywgcmVzMiwgemVybywgcmVzMywKKyAgICAgICAgICAgICByZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgQURENChyZXMwLCB2dDAsIHJlczEsIHZ0MSwgcmVzMiwgdnQyLCByZXMzLCB2dDMsIHJlczAsIHJlczEsIHJlczIsIHJlczMpOworICBDTElQX1NXNF8wXzI1NShyZXMwLCByZXMxLCByZXMyLCByZXMzKTsKKyAgUENLRVZfQjJfU1cocmVzMCwgcmVzMSwgcmVzMiwgcmVzMywgdnQwLCB2dDEpOworICByZXMwID0gKHY0aTMyKV9fbXNhX3Bja2V2X2IoKHYxNmk4KXZ0MCwgKHYxNmk4KXZ0MSk7CisgIFNUNHg0X1VCKHJlczAsIHJlczAsIDMsIDIsIDEsIDAsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIHZvaWQgSVRyYW5zZm9ybV9NU0EoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lKHJlZiwgaW4sIGRzdCk7CisgIGlmIChkb190d28pIHsKKyAgICBJVHJhbnNmb3JtT25lKHJlZiArIDQsIGluICsgMTYsIGRzdCArIDQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fTVNBKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIHVpbnQ2NF90IG91dDAsIG91dDEsIG91dDIsIG91dDM7CisgIHVpbnQzMl90IGluMCwgaW4xLCBpbjIsIGluMzsKKyAgdjRpMzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgdG1wNCwgdG1wNTsKKyAgdjhpMTYgdDAsIHQxLCB0MiwgdDM7CisgIHYxNnU4IHNyY2wwLCBzcmNsMSwgc3JjMCA9IHsgMCB9LCBzcmMxID0geyAwIH07CisgIGNvbnN0IHY4aTE2IG1hc2swID0geyAwLCA0LCA4LCAxMiwgMSwgNSwgOSwgMTMgfTsKKyAgY29uc3QgdjhpMTYgbWFzazEgPSB7IDMsIDcsIDExLCAxNSwgMiwgNiwgMTAsIDE0IH07CisgIGNvbnN0IHY4aTE2IG1hc2syID0geyA0LCAwLCA1LCAxLCA2LCAyLCA3LCAzIH07CisgIGNvbnN0IHY4aTE2IG1hc2szID0geyAwLCA0LCAxLCA1LCAyLCA2LCAzLCA3IH07CisgIGNvbnN0IHY4aTE2IGNuc3QwID0geyAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiB9OworICBjb25zdCB2OGkxNiBjbnN0MSA9IHsgNTM1MiwgMjIxNywgNTM1MiwgMjIxNywgNTM1MiwgMjIxNywgNTM1MiwgMjIxNyB9OworCisgIExXNChzcmMsIEJQUywgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgSU5TRVJUX1c0X1VCKGluMCwgaW4xLCBpbjIsIGluMywgc3JjMCk7CisgIExXNChyZWYsIEJQUywgaW4wLCBpbjEsIGluMiwgaW4zKTsKKyAgSU5TRVJUX1c0X1VCKGluMCwgaW4xLCBpbjIsIGluMywgc3JjMSk7CisgIElMVlJMX0IyX1VCKHNyYzAsIHNyYzEsIHNyY2wwLCBzcmNsMSk7CisgIEhTVUJfVUIyX1NIKHNyY2wwLCBzcmNsMSwgdDAsIHQxKTsKKyAgVlNIRl9IMl9TSCh0MCwgdDEsIHQwLCB0MSwgbWFzazAsIG1hc2sxLCB0MiwgdDMpOworICBBRERTVUIyKHQyLCB0MywgdDAsIHQxKTsKKyAgdDAgPSBTUkxJX0godDAsIDMpOworICBWU0hGX0gyX1NIKHQwLCB0MCwgdDEsIHQxLCBtYXNrMiwgbWFzazMsIHQzLCB0Mik7CisgIHRtcDAgPSBfX21zYV9oYWRkX3Nfdyh0MywgdDMpOworICB0bXAyID0gX19tc2FfaHN1Yl9zX3codDMsIHQzKTsKKyAgRklMTF9XMl9TVygxODEyLCA5MzcsIHRtcDEsIHRtcDMpOworICBEUEFERF9TSDJfU1codDIsIHQyLCBjbnN0MCwgY25zdDEsIHRtcDMsIHRtcDEpOworICBTUkFJX1cyX1NXKHRtcDEsIHRtcDMsIDkpOworICBQQ0tFVl9IMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0MCwgdDEpOworICBWU0hGX0gyX1NIKHQwLCB0MSwgdDAsIHQxLCBtYXNrMCwgbWFzazEsIHQyLCB0Myk7CisgIEFERFNVQjIodDIsIHQzLCB0MCwgdDEpOworICBWU0hGX0gyX1NIKHQwLCB0MCwgdDEsIHQxLCBtYXNrMiwgbWFzazMsIHQzLCB0Mik7CisgIHRtcDAgPSBfX21zYV9oYWRkX3Nfdyh0MywgdDMpOworICB0bXAyID0gX19tc2FfaHN1Yl9zX3codDMsIHQzKTsKKyAgQUREVklfVzJfU1codG1wMCwgNywgdG1wMiwgNywgdG1wMCwgdG1wMik7CisgIFNSQUlfVzJfU1codG1wMCwgdG1wMiwgNCk7CisgIEZJTExfVzJfU1coMTIwMDAsIDUxMDAwLCB0bXAxLCB0bXAzKTsKKyAgRFBBRERfU0gyX1NXKHQyLCB0MiwgY25zdDAsIGNuc3QxLCB0bXAzLCB0bXAxKTsKKyAgU1JBSV9XMl9TVyh0bXAxLCB0bXAzLCAxNik7CisgIFVOUENLX1JfU0hfU1codDEsIHRtcDQpOworICB0bXA1ID0gX19tc2FfY2VxaV93KHRtcDQsIDApOworICB0bXA0ID0gKHY0aTMyKV9fbXNhX25vcl92KCh2MTZ1OCl0bXA1LCAodjE2dTgpdG1wNSk7CisgIHRtcDUgPSBfX21zYV9maWxsX3coMSk7CisgIHRtcDUgPSAodjRpMzIpX19tc2FfYW5kX3YoKHYxNnU4KXRtcDUsICh2MTZ1OCl0bXA0KTsKKyAgdG1wMSArPSB0bXA1OworICBQQ0tFVl9IMl9TSCh0bXAxLCB0bXAwLCB0bXAzLCB0bXAyLCB0MCwgdDEpOworICBvdXQwID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQwLCAwKTsKKyAgb3V0MSA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MCwgMSk7CisgIG91dDIgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDEsIDApOworICBvdXQzID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQxLCAxKTsKKyAgU0Q0KG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dCwgOCk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1XSFRfTVNBKGNvbnN0IGludDE2X3QqIGluLCBpbnQxNl90KiBvdXQpIHsKKyAgdjhpMTYgaW4wID0geyAwIH07CisgIHY4aTE2IGluMSA9IHsgMCB9OworICB2OGkxNiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOworICB2OGkxNiBvdXQwLCBvdXQxOworICBjb25zdCB2OGkxNiBtYXNrMCA9IHsgMCwgMSwgMiwgMywgOCwgOSwgMTAsIDExIH07CisgIGNvbnN0IHY4aTE2IG1hc2sxID0geyA0LCA1LCA2LCA3LCAxMiwgMTMsIDE0LCAxNSB9OworICBjb25zdCB2OGkxNiBtYXNrMiA9IHsgMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzIH07CisgIGNvbnN0IHY4aTE2IG1hc2szID0geyAzLCA3LCAxMSwgMTUsIDIsIDYsIDEwLCAxNCB9OworCisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgMCwgaW5bICAwXSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgMSwgaW5bIDY0XSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgMiwgaW5bMTI4XSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgMywgaW5bMTkyXSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgNCwgaW5bIDE2XSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgNSwgaW5bIDgwXSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgNiwgaW5bMTQ0XSk7CisgIGluMCA9IF9fbXNhX2luc2VydF9oKGluMCwgNywgaW5bMjA4XSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgMCwgaW5bIDQ4XSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgMSwgaW5bMTEyXSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgMiwgaW5bMTc2XSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgMywgaW5bMjQwXSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgNCwgaW5bIDMyXSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgNSwgaW5bIDk2XSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgNiwgaW5bMTYwXSk7CisgIGluMSA9IF9fbXNhX2luc2VydF9oKGluMSwgNywgaW5bMjI0XSk7CisgIEFERFNVQjIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIEFERFNVQjIodG1wMiwgdG1wMywgdG1wMCwgdG1wMSk7CisgIFZTSEZfSDJfU0godG1wMCwgdG1wMSwgdG1wMCwgdG1wMSwgbWFzazIsIG1hc2szLCBpbjAsIGluMSk7CisgIEFERFNVQjIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2swLCBtYXNrMSwgdG1wMiwgdG1wMyk7CisgIEFERFNVQjIodG1wMiwgdG1wMywgb3V0MCwgb3V0MSk7CisgIFNSQUlfSDJfU0gob3V0MCwgb3V0MSwgMSk7CisgIFNUX1NIMihvdXQwLCBvdXQxLCBvdXQsIDgpOworfQorCitzdGF0aWMgaW50IFRUcmFuc2Zvcm1fTVNBKGNvbnN0IHVpbnQ4X3QqIGluLCBjb25zdCB1aW50MTZfdCogdykgeworICBpbnQgc3VtOworICB1aW50MzJfdCBpbjBfbSwgaW4xX20sIGluMl9tLCBpbjNfbTsKKyAgdjE2aTggc3JjMCA9IHsgMCB9OworICB2OGkxNiBpbjAsIGluMSwgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsKKyAgdjRpMzIgZHN0MCwgZHN0MTsKKyAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiBtYXNrMCA9IHsgMCwgMSwgMiwgMywgOCwgOSwgMTAsIDExIH07CisgIGNvbnN0IHY4aTE2IG1hc2sxID0geyA0LCA1LCA2LCA3LCAxMiwgMTMsIDE0LCAxNSB9OworICBjb25zdCB2OGkxNiBtYXNrMiA9IHsgMCwgNCwgOCwgMTIsIDEsIDUsIDksIDEzIH07CisgIGNvbnN0IHY4aTE2IG1hc2szID0geyAzLCA3LCAxMSwgMTUsIDIsIDYsIDEwLCAxNCB9OworCisgIExXNChpbiwgQlBTLCBpbjBfbSwgaW4xX20sIGluMl9tLCBpbjNfbSk7CisgIElOU0VSVF9XNF9TQihpbjBfbSwgaW4xX20sIGluMl9tLCBpbjNfbSwgc3JjMCk7CisgIElMVlJMX0IyX1NIKHplcm8sIHNyYzAsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2syLCBtYXNrMywgaW4wLCBpbjEpOworICBBRERTVUIyKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICBBRERTVUIyKHRtcDIsIHRtcDMsIHRtcDAsIHRtcDEpOworICBWU0hGX0gyX1NIKHRtcDAsIHRtcDEsIHRtcDAsIHRtcDEsIG1hc2syLCBtYXNrMywgaW4wLCBpbjEpOworICBBRERTVUIyKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsKKyAgVlNIRl9IMl9TSCh0bXAwLCB0bXAxLCB0bXAwLCB0bXAxLCBtYXNrMCwgbWFzazEsIHRtcDIsIHRtcDMpOworICBBRERTVUIyKHRtcDIsIHRtcDMsIHRtcDAsIHRtcDEpOworICB0bXAwID0gX19tc2FfYWRkX2FfaCh0bXAwLCAodjhpMTYpemVybyk7CisgIHRtcDEgPSBfX21zYV9hZGRfYV9oKHRtcDEsICh2OGkxNil6ZXJvKTsKKyAgTERfU0gyKHcsIDgsIHRtcDIsIHRtcDMpOworICBET1RQX1NIMl9TVyh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBkc3QwLCBkc3QxKTsKKyAgZHN0MCA9IGRzdDAgKyBkc3QxOworICBzdW0gPSBIQUREX1NXX1MzMihkc3QwKTsKKyAgcmV0dXJuIHN1bTsKK30KKworc3RhdGljIGludCBEaXN0bzR4NF9NU0EoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGNvbnN0IGludCBzdW0xID0gVFRyYW5zZm9ybV9NU0EoYSwgdyk7CisgIGNvbnN0IGludCBzdW0yID0gVFRyYW5zZm9ybV9NU0EoYiwgdyk7CisgIHJldHVybiBhYnMoc3VtMiAtIHN1bTEpID4+IDU7Cit9CisKK3N0YXRpYyBpbnQgRGlzdG8xNngxNl9NU0EoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9NU0EoYSArIHggKyB5LCBiICsgeCArIHksIHcpOworICAgIH0KKyAgfQorICByZXR1cm4gRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpc3RvZ3JhbQorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX01TQShjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIFZQOEZUcmFuc2Zvcm0ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisgICAgeworICAgICAgaW50IGs7CisgICAgICB2OGkxNiBjb2VmZjAsIGNvZWZmMTsKKyAgICAgIGNvbnN0IHY4aTE2IHplcm8gPSB7IDAgfTsKKyAgICAgIGNvbnN0IHY4aTE2IG1heF9jb2VmZl90aHIgPSBfX21zYV9sZGlfaChNQVhfQ09FRkZfVEhSRVNIKTsKKyAgICAgIExEX1NIMigmb3V0WzBdLCA4LCBjb2VmZjAsIGNvZWZmMSk7CisgICAgICBjb2VmZjAgPSBfX21zYV9hZGRfYV9oKGNvZWZmMCwgemVybyk7CisgICAgICBjb2VmZjEgPSBfX21zYV9hZGRfYV9oKGNvZWZmMSwgemVybyk7CisgICAgICBTUkFJX0gyX1NIKGNvZWZmMCwgY29lZmYxLCAzKTsKKyAgICAgIGNvZWZmMCA9IF9fbXNhX21pbl9zX2goY29lZmYwLCBtYXhfY29lZmZfdGhyKTsKKyAgICAgIGNvZWZmMSA9IF9fbXNhX21pbl9zX2goY29lZmYxLCBtYXhfY29lZmZfdGhyKTsKKyAgICAgIFNUX1NIMihjb2VmZjAsIGNvZWZmMSwgJm91dFswXSwgOCk7CisgICAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgICAgICArK2Rpc3RyaWJ1dGlvbltvdXRba11dOworICAgICAgfQorICAgIH0KKyAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50cmEgcHJlZGljdGlvbnMKKworLy8gbHVtYSA0eDQgcHJlZGljdGlvbgorCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisjZGVmaW5lIEFWRzIoYSwgYikgKCgoYSkgKyAoYikgKyAxKSA+PiAxKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgICAgLy8gdmVydGljYWwKKyAgY29uc3QgdjE2dTggQTEgPSB7IDAgfTsKKyAgY29uc3QgdWludDY0X3QgdmFsX20gPSBMRCh0b3AgLSAxKTsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfZCgodjJpNjQpQTEsIDAsIHZhbF9tKTsKKyAgY29uc3QgdjE2dTggQiA9IFNMRElfVUIoQSwgQSwgMSk7CisgIGNvbnN0IHYxNnU4IEMgPSBTTERJX1VCKEEsIEEsIDIpOworICBjb25zdCB2MTZ1OCBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIGNvbnN0IHYxNnU4IEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgY29uc3QgdjE2dTggUiA9IF9fbXNhX2F2ZXJfdV9iKEFDLCBCMik7CisgIGNvbnN0IHVpbnQzMl90IG91dCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSLCAwKTsKKyAgU1c0KG91dCwgb3V0LCBvdXQsIG91dCwgZHN0LCBCUFMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRTQodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsgICAgLy8gaG9yaXpvbnRhbAorICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSSwgSiwgSykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICB1aW50MzJfdCBkYyA9IDQ7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSBkYyArPSB0b3BbaV0gKyB0b3BbLTUgKyBpXTsKKyAgZGMgPj49IDM7CisgIGRjID0gZGMgfCAoZGMgPDwgOCkgfCAoZGMgPDwgMTYpIHwgKGRjIDw8IDI0KTsKKyAgU1c0KGRjLCBkYywgZGMsIGRjLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCB2MTZ1OCBBMiA9IHsgMCB9OworICBjb25zdCB1aW50NjRfdCB2YWxfbSA9IExEKHRvcCAtIDUpOworICBjb25zdCB2MTZ1OCBBMSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfZCgodjJpNjQpQTIsIDAsIHZhbF9tKTsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9pbnNlcnRfYigodjE2aTgpQTEsIDgsIHRvcFszXSk7CisgIGNvbnN0IHYxNnU4IEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBjb25zdCB2MTZ1OCBDID0gU0xESV9VQihBLCBBLCAyKTsKKyAgY29uc3QgdjE2dTggQUMgPSBfX21zYV9hdmVfdV9iKEEsIEMpOworICBjb25zdCB2MTZ1OCBCMiA9IF9fbXNhX2F2ZV91X2IoQiwgQik7CisgIGNvbnN0IHYxNnU4IFIwID0gX19tc2FfYXZlcl91X2IoQUMsIEIyKTsKKyAgY29uc3QgdjE2dTggUjEgPSBTTERJX1VCKFIwLCBSMCwgMSk7CisgIGNvbnN0IHYxNnU4IFIyID0gU0xESV9VQihSMSwgUjEsIDEpOworICBjb25zdCB2MTZ1OCBSMyA9IFNMRElfVUIoUjIsIFIyLCAxKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMCwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDEgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjEsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwyID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIyLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMyA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMywgMCk7CisgIFNXNCh2YWwzLCB2YWwyLCB2YWwxLCB2YWwwLCBkc3QsIEJQUyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCB2MTZ1OCBBMSA9IHsgMCB9OworICBjb25zdCB1aW50NjRfdCB2YWxfbSA9IExEKHRvcCk7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2QoKHYyaTY0KUExLCAwLCB2YWxfbSk7CisgIGNvbnN0IHYxNnU4IEIgPSBTTERJX1VCKEEsIEEsIDEpOworICBjb25zdCB2MTZ1OCBDMSA9IFNMRElfVUIoQSwgQSwgMik7CisgIGNvbnN0IHYxNnU4IEMgPSAodjE2dTgpX19tc2FfaW5zZXJ0X2IoKHYxNmk4KUMxLCA2LCB0b3BbN10pOworICBjb25zdCB2MTZ1OCBBQyA9IF9fbXNhX2F2ZV91X2IoQSwgQyk7CisgIGNvbnN0IHYxNnU4IEIyID0gX19tc2FfYXZlX3VfYihCLCBCKTsKKyAgY29uc3QgdjE2dTggUjAgPSBfX21zYV9hdmVyX3VfYihBQywgQjIpOworICBjb25zdCB2MTZ1OCBSMSA9IFNMRElfVUIoUjAsIFIwLCAxKTsKKyAgY29uc3QgdjE2dTggUjIgPSBTTERJX1VCKFIxLCBSMSwgMSk7CisgIGNvbnN0IHYxNnU4IFIzID0gU0xESV9VQihSMiwgUjIsIDEpOworICBjb25zdCB1aW50MzJfdCB2YWwwID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIwLCAwKTsKKyAgY29uc3QgdWludDMyX3QgdmFsMSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilSMSwgMCk7CisgIGNvbnN0IHVpbnQzMl90IHZhbDIgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpUjIsIDApOworICBjb25zdCB1aW50MzJfdCB2YWwzID0gX19tc2FfY29weV9zX3coKHY0aTMyKVIzLCAwKTsKKyAgU1c0KHZhbDAsIHZhbDEsIHZhbDIsIHZhbDMsIGRzdCwgQlBTKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlI0KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IGludCBYID0gdG9wWy0xXTsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgY29uc3QgaW50IEQgPSB0b3BbM107CisgIERTVCgwLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoWCwgQSk7CisgIERTVCgxLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoQSwgQik7CisgIERTVCgyLCAwKSA9IERTVCgzLCAyKSA9IEFWRzIoQiwgQyk7CisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzIoQywgRCk7CisgIERTVCgwLCAzKSA9ICAgICAgICAgICAgIEFWRzMoSywgSiwgSSk7CisgIERTVCgwLCAyKSA9ICAgICAgICAgICAgIEFWRzMoSiwgSSwgWCk7CisgIERTVCgwLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgyLCAxKSA9IERTVCgzLCAzKSA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgzLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQiwgQywgRCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZMNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgQSA9IHRvcFswXTsKKyAgY29uc3QgaW50IEIgPSB0b3BbMV07CisgIGNvbnN0IGludCBDID0gdG9wWzJdOworICBjb25zdCBpbnQgRCA9IHRvcFszXTsKKyAgY29uc3QgaW50IEUgPSB0b3BbNF07CisgIGNvbnN0IGludCBGID0gdG9wWzVdOworICBjb25zdCBpbnQgRyA9IHRvcFs2XTsKKyAgY29uc3QgaW50IEggPSB0b3BbN107CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgwLCAyKSA9IEFWRzIoQiwgQyk7CisgIERTVCgyLCAwKSA9IERTVCgxLCAyKSA9IEFWRzIoQywgRCk7CisgIERTVCgzLCAwKSA9IERTVCgyLCAyKSA9IEFWRzIoRCwgRSk7CisgIERTVCgwLCAxKSA9ICAgICAgICAgICAgIEFWRzMoQSwgQiwgQyk7CisgIERTVCgxLCAxKSA9IERTVCgwLCAzKSA9IEFWRzMoQiwgQywgRCk7CisgIERTVCgyLCAxKSA9IERTVCgxLCAzKSA9IEFWRzMoQywgRCwgRSk7CisgIERTVCgzLCAxKSA9IERTVCgyLCAzKSA9IEFWRzMoRCwgRSwgRik7CisgICAgICAgICAgICAgIERTVCgzLCAyKSA9IEFWRzMoRSwgRiwgRyk7CisgICAgICAgICAgICAgIERTVCgzLCAzKSA9IEFWRzMoRiwgRywgSCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhVNCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgTCA9IHRvcFstNV07CisgIERTVCgwLCAwKSA9ICAgICAgICAgICAgIEFWRzIoSSwgSik7CisgIERTVCgyLCAwKSA9IERTVCgwLCAxKSA9IEFWRzIoSiwgSyk7CisgIERTVCgyLCAxKSA9IERTVCgwLCAyKSA9IEFWRzIoSywgTCk7CisgIERTVCgxLCAwKSA9ICAgICAgICAgICAgIEFWRzMoSSwgSiwgSyk7CisgIERTVCgzLCAwKSA9IERTVCgxLCAxKSA9IEFWRzMoSiwgSywgTCk7CisgIERTVCgzLCAxKSA9IERTVCgxLCAyKSA9IEFWRzMoSywgTCwgTCk7CisgIERTVCgzLCAyKSA9IERTVCgyLCAyKSA9CisgIERTVCgwLCAzKSA9IERTVCgxLCAzKSA9IERTVCgyLCAzKSA9IERTVCgzLCAzKSA9IEw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhENCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKyAgRFNUKDAsIDApID0gRFNUKDIsIDEpID0gQVZHMihJLCBYKTsKKyAgRFNUKDAsIDEpID0gRFNUKDIsIDIpID0gQVZHMihKLCBJKTsKKyAgRFNUKDAsIDIpID0gRFNUKDIsIDMpID0gQVZHMihLLCBKKTsKKyAgRFNUKDAsIDMpICAgICAgICAgICAgID0gQVZHMihMLCBLKTsKKyAgRFNUKDMsIDApICAgICAgICAgICAgID0gQVZHMyhBLCBCLCBDKTsKKyAgRFNUKDIsIDApICAgICAgICAgICAgID0gQVZHMyhYLCBBLCBCKTsKKyAgRFNUKDEsIDApID0gRFNUKDMsIDEpID0gQVZHMyhJLCBYLCBBKTsKKyAgRFNUKDEsIDEpID0gRFNUKDMsIDIpID0gQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDEsIDIpID0gRFNUKDMsIDMpID0gQVZHMyhLLCBKLCBJKTsKKyAgRFNUKDEsIDMpICAgICAgICAgICAgID0gQVZHMyhMLCBLLCBKKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVE00KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKHRvcFstMV0pOworICBjb25zdCB2OGkxNiBMMCA9ICh2OGkxNilfX21zYV9maWxsX2godG9wWy0yXSk7CisgIGNvbnN0IHY4aTE2IEwxID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCh0b3BbLTNdKTsKKyAgY29uc3QgdjhpMTYgTDIgPSAodjhpMTYpX19tc2FfZmlsbF9oKHRvcFstNF0pOworICBjb25zdCB2OGkxNiBMMyA9ICh2OGkxNilfX21zYV9maWxsX2godG9wWy01XSk7CisgIGNvbnN0IHYxNnU4IFQxID0gTERfVUIodG9wKTsKKyAgY29uc3QgdjhpMTYgVCAgPSAodjhpMTYpX19tc2FfaWx2cl9iKHplcm8sICh2MTZpOClUMSk7CisgIGNvbnN0IHY4aTE2IGQgPSBUIC0gVEw7CisgIHY4aTE2IHIwLCByMSwgcjIsIHIzOworICBBREQ0KGQsIEwwLCBkLCBMMSwgZCwgTDIsIGQsIEwzLCByMCwgcjEsIHIyLCByMyk7CisgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgUENLRVZfU1Q0eDRfVUIocjAsIHIxLCByMiwgcjMsIGRzdCwgQlBTKTsKK30KKworI3VuZGVmIERTVAorI3VuZGVmIEFWRzMKKyN1bmRlZiBBVkcyCisKK3N0YXRpYyB2b2lkIEludHJhNFByZWRzX01TQSh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQzQoSTREQzQgKyBkc3QsIHRvcCk7CisgIFRNNChJNFRNNCArIGRzdCwgdG9wKTsKKyAgVkU0KEk0VkU0ICsgZHN0LCB0b3ApOworICBIRTQoSTRIRTQgKyBkc3QsIHRvcCk7CisgIFJENChJNFJENCArIGRzdCwgdG9wKTsKKyAgVlI0KEk0VlI0ICsgZHN0LCB0b3ApOworICBMRDQoSTRMRDQgKyBkc3QsIHRvcCk7CisgIFZMNChJNFZMNCArIGRzdCwgdG9wKTsKKyAgSEQ0KEk0SEQ0ICsgZHN0LCB0b3ApOworICBIVTQoSTRIVTQgKyBkc3QsIHRvcCk7Cit9CisKKy8vIGx1bWEgMTZ4MTYgcHJlZGljdGlvbgorCisjZGVmaW5lIFNUT1JFMTZ4MTYob3V0LCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCOChvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgZHN0ICsgMCAqIEJQUywgQlBTKTsgIFwKKyAgICBTVF9VQjgob3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIG91dCwgb3V0LCBvdXQsIGRzdCArIDggKiBCUFMsIEJQUyk7ICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWZXJ0aWNhbFByZWQxNngxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBjb25zdCB2MTZ1OCBvdXQgPSBMRF9VQih0b3ApOworICAgIFNUT1JFMTZ4MTYob3V0LCBkc3QpOworICB9IGVsc2UgeworICAgIGNvbnN0IHYxNnU4IG91dCA9ICh2MTZ1OClfX21zYV9maWxsX2IoMHg3Zik7CisgICAgU1RPUkUxNngxNihvdXQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSG9yaXpvbnRhbFByZWQxNngxNih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCAxNjsgaiArPSA0KSB7CisgICAgICBjb25zdCB2MTZ1OCBMMCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFswXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMSA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFsxXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMiA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFsyXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMyA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFszXSk7CisgICAgICBTVF9VQjQoTDAsIEwxLCBMMiwgTDMsIGRzdCwgQlBTKTsKKyAgICAgIGRzdCArPSA0ICogQlBTOworICAgICAgbGVmdCArPSA0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb25zdCB2MTZ1OCBvdXQgPSAodjE2dTgpX19tc2FfZmlsbF9iKDB4ODEpOworICAgIFNUT1JFMTZ4MTYob3V0LCBkc3QpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb24xNngxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIGludCBqOworICAgICAgdjhpMTYgZDEsIGQyOworICAgICAgY29uc3QgdjE2aTggemVybyA9IHsgMCB9OworICAgICAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbLTFdKTsKKyAgICAgIGNvbnN0IHYxNnU4IFQgPSBMRF9VQih0b3ApOworICAgICAgSUxWUkxfQjJfU0goemVybywgVCwgZDEsIGQyKTsKKyAgICAgIFNVQjIoZDEsIFRMLCBkMiwgVEwsIGQxLCBkMik7CisgICAgICBmb3IgKGogPSAwOyBqIDwgMTY7IGogKz0gNCkgeworICAgICAgICB2MTZpOCB0MCwgdDEsIHQyLCB0MzsKKyAgICAgICAgdjhpMTYgcjAsIHIxLCByMiwgcjMsIHI0LCByNSwgcjYsIHI3OworICAgICAgICBjb25zdCB2OGkxNiBMMCA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMF0pOworICAgICAgICBjb25zdCB2OGkxNiBMMSA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMV0pOworICAgICAgICBjb25zdCB2OGkxNiBMMiA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMl0pOworICAgICAgICBjb25zdCB2OGkxNiBMMyA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgM10pOworICAgICAgICBBREQ0KGQxLCBMMCwgZDEsIEwxLCBkMSwgTDIsIGQxLCBMMywgcjAsIHIxLCByMiwgcjMpOworICAgICAgICBBREQ0KGQyLCBMMCwgZDIsIEwxLCBkMiwgTDIsIGQyLCBMMywgcjQsIHI1LCByNiwgcjcpOworICAgICAgICBDTElQX1NINF8wXzI1NShyMCwgcjEsIHIyLCByMyk7CisgICAgICAgIENMSVBfU0g0XzBfMjU1KHI0LCByNSwgcjYsIHI3KTsKKyAgICAgICAgUENLRVZfQjRfU0IocjQsIHIwLCByNSwgcjEsIHI2LCByMiwgcjcsIHIzLCB0MCwgdDEsIHQyLCB0Myk7CisgICAgICAgIFNUX1NCNCh0MCwgdDEsIHQyLCB0MywgZHN0LCBCUFMpOworICAgICAgICBkc3QgKz0gNCAqIEJQUzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSG9yaXpvbnRhbFByZWQxNngxNihkc3QsIGxlZnQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIFZlcnRpY2FsUHJlZDE2eDE2KGRzdCwgdG9wKTsKKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgdjE2dTggb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYigweDgxKTsKKyAgICAgIFNUT1JFMTZ4MTYob3V0LCBkc3QpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQ01vZGUxNngxNih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgaW50IERDOworICB2MTZ1OCBvdXQ7CisgIGlmICh0b3AgIT0gTlVMTCAmJiBsZWZ0ICE9IE5VTEwpIHsKKyAgICBjb25zdCB2MTZ1OCBydG9wID0gTERfVUIodG9wKTsKKyAgICBjb25zdCB2OHUxNiBkY3RvcCA9IF9fbXNhX2hhZGRfdV9oKHJ0b3AsIHJ0b3ApOworICAgIGNvbnN0IHYxNnU4IHJsZWZ0ID0gTERfVUIobGVmdCk7CisgICAgY29uc3Qgdjh1MTYgZGNsZWZ0ID0gX19tc2FfaGFkZF91X2gocmxlZnQsIHJsZWZ0KTsKKyAgICBjb25zdCB2OHUxNiBkY3RlbXAgPSBkY3RvcCArIGRjbGVmdDsKKyAgICBEQyA9IEhBRERfVUhfVTMyKGRjdGVtcCk7CisgICAgREMgPSAoREMgKyAxNikgPj4gNTsKKyAgfSBlbHNlIGlmIChsZWZ0ICE9IE5VTEwpIHsgICAvLyBsZWZ0IGJ1dCBubyB0b3AKKyAgICBjb25zdCB2MTZ1OCBybGVmdCA9IExEX1VCKGxlZnQpOworICAgIGNvbnN0IHY4dTE2IGRjbGVmdCA9IF9fbXNhX2hhZGRfdV9oKHJsZWZ0LCBybGVmdCk7CisgICAgREMgPSBIQUREX1VIX1UzMihkY2xlZnQpOworICAgIERDID0gKERDICsgREMgKyAxNikgPj4gNTsKKyAgfSBlbHNlIGlmICh0b3AgIT0gTlVMTCkgeyAgIC8vIHRvcCBidXQgbm8gbGVmdAorICAgIGNvbnN0IHYxNnU4IHJ0b3AgPSBMRF9VQih0b3ApOworICAgIGNvbnN0IHY4dTE2IGRjdG9wID0gX19tc2FfaGFkZF91X2gocnRvcCwgcnRvcCk7CisgICAgREMgPSBIQUREX1VIX1UzMihkY3RvcCk7CisgICAgREMgPSAoREMgKyBEQyArIDE2KSA+PiA1OworICB9IGVsc2UgeyAgIC8vIG5vIHRvcCwgbm8gbGVmdCwgbm90aGluZy4KKyAgICBEQyA9IDB4ODA7CisgIH0KKyAgb3V0ID0gKHYxNnU4KV9fbXNhX2ZpbGxfYihEQyk7CisgIFNUT1JFMTZ4MTYob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHNfTVNBKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIERDTW9kZTE2eDE2KEkxNkRDMTYgKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDE2eDE2KEkxNlZFMTYgKyBkc3QsIHRvcCk7CisgIEhvcml6b250YWxQcmVkMTZ4MTYoSTE2SEUxNiArIGRzdCwgbGVmdCk7CisgIFRydWVNb3Rpb24xNngxNihJMTZUTTE2ICsgZHN0LCBsZWZ0LCB0b3ApOworfQorCisvLyBDaHJvbWEgOHg4IHByZWRpY3Rpb24KKworI2RlZmluZSBDQUxDX0RDOChpbiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OHUxNiB0ZW1wMCA9IF9fbXNhX2hhZGRfdV9oKGluLCBpbik7ICAgICAgICAgICAgICAgXAorICBjb25zdCB2NHUzMiB0ZW1wMSA9IF9fbXNhX2hhZGRfdV93KHRlbXAwLCB0ZW1wMCk7ICAgICAgICAgXAorICBjb25zdCB2Mmk2NCB0ZW1wMiA9ICh2Mmk2NClfX21zYV9oYWRkX3VfZCh0ZW1wMSwgdGVtcDEpOyAgXAorICBjb25zdCB2Mmk2NCB0ZW1wMyA9IF9fbXNhX3NwbGF0aV9kKHRlbXAyLCAxKTsgICAgICAgICAgICAgXAorICBjb25zdCB2Mmk2NCB0ZW1wNCA9IHRlbXAzICsgdGVtcDI7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCB0ZW1wNSA9ICh2MTZpOClfX21zYV9zcmFyaV9kKHRlbXA0LCA0KTsgICAgICAgXAorICBjb25zdCB2Mmk2NCB0ZW1wNiA9ICh2Mmk2NClfX21zYV9zcGxhdGlfYih0ZW1wNSwgMCk7ICAgICAgXAorICBvdXQgPSBfX21zYV9jb3B5X3NfZCh0ZW1wNiwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRTh4OChvdXQsIGRzdCkgZG8geyAgICAgICAgICAgICAgICAgXAorICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyAwICogQlBTLCBCUFMpOyAgXAorICBTRDQob3V0LCBvdXQsIG91dCwgb3V0LCBkc3QgKyA0ICogQlBTLCBCUFMpOyAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVmVydGljYWxQcmVkOHg4KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGNvbnN0IHVpbnQ2NF90IG91dCA9IExEKHRvcCk7CisgICAgU1RPUkU4eDgob3V0LCBkc3QpOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ2NF90IG91dCA9IDB4N2Y3ZjdmN2Y3ZjdmN2Y3ZlVMTDsKKyAgICBTVE9SRTh4OChvdXQsIGRzdCk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSG9yaXpvbnRhbFByZWQ4eDgodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSAwOyBqIDwgODsgaiArPSA0KSB7CisgICAgICBjb25zdCB2MTZ1OCBMMCA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFswXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMSA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFsxXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMiA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFsyXSk7CisgICAgICBjb25zdCB2MTZ1OCBMMyA9ICh2MTZ1OClfX21zYV9maWxsX2IobGVmdFszXSk7CisgICAgICBjb25zdCB1aW50NjRfdCBvdXQwID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwwLCAwKTsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IG91dDEgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpTDEsIDApOworICAgICAgY29uc3QgdWludDY0X3Qgb3V0MiA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClMMiwgMCk7CisgICAgICBjb25zdCB1aW50NjRfdCBvdXQzID0gX19tc2FfY29weV9zX2QoKHYyaTY0KUwzLCAwKTsKKyAgICAgIFNENChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBkc3QsIEJQUyk7CisgICAgICBkc3QgKz0gNCAqIEJQUzsKKyAgICAgIGxlZnQgKz0gNDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDY0X3Qgb3V0ID0gMHg4MTgxODE4MTgxODE4MTgxVUxMOworICAgIFNUT1JFOHg4KG91dCwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBUcnVlTW90aW9uOHg4KHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmIChsZWZ0ICE9IE5VTEwpIHsKKyAgICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICAgIGludCBqOworICAgICAgY29uc3QgdjhpMTYgVEwgPSAodjhpMTYpX19tc2FfZmlsbF9oKGxlZnRbLTFdKTsKKyAgICAgIGNvbnN0IHYxNnU4IFQxID0gTERfVUIodG9wKTsKKyAgICAgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgICAgIGNvbnN0IHY4aTE2IFQgID0gKHY4aTE2KV9fbXNhX2lsdnJfYih6ZXJvLCAodjE2aTgpVDEpOworICAgICAgY29uc3QgdjhpMTYgZCA9IFQgLSBUTDsKKyAgICAgIGZvciAoaiA9IDA7IGogPCA4OyBqICs9IDQpIHsKKyAgICAgICAgdWludDY0X3Qgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsKKyAgICAgICAgdjE2aTggdDAsIHQxOworICAgICAgICB2OGkxNiByMCA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMF0pOworICAgICAgICB2OGkxNiByMSA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMV0pOworICAgICAgICB2OGkxNiByMiA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgMl0pOworICAgICAgICB2OGkxNiByMyA9ICh2OGkxNilfX21zYV9maWxsX2gobGVmdFtqICsgM10pOworICAgICAgICBBREQ0KGQsIHIwLCBkLCByMSwgZCwgcjIsIGQsIHIzLCByMCwgcjEsIHIyLCByMyk7CisgICAgICAgIENMSVBfU0g0XzBfMjU1KHIwLCByMSwgcjIsIHIzKTsKKyAgICAgICAgUENLRVZfQjJfU0IocjEsIHIwLCByMywgcjIsIHQwLCB0MSk7CisgICAgICAgIG91dDAgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDAsIDApOworICAgICAgICBvdXQxID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXQwLCAxKTsKKyAgICAgICAgb3V0MiA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NCl0MSwgMCk7CisgICAgICAgIG91dDMgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpdDEsIDEpOworICAgICAgICBTRDQob3V0MCwgb3V0MSwgb3V0Miwgb3V0MywgZHN0LCBCUFMpOworICAgICAgICBkc3QgKz0gNCAqIEJQUzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgSG9yaXpvbnRhbFByZWQ4eDgoZHN0LCBsZWZ0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBWZXJ0aWNhbFByZWQ4eDgoZHN0LCB0b3ApOworICAgIH0gZWxzZSB7CisgICAgICBjb25zdCB1aW50NjRfdCBvdXQgPSAweDgxODE4MTgxODE4MTgxODFVTEw7CisgICAgICBTVE9SRTh4OChvdXQsIGRzdCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDTW9kZTh4OCh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIHVpbnQ2NF90IG91dDsKKyAgdjE2dTggc3JjID0geyAwIH07CisgIGlmICh0b3AgIT0gTlVMTCAmJiBsZWZ0ICE9IE5VTEwpIHsKKyAgICBjb25zdCB1aW50NjRfdCBsZWZ0X20gPSBMRChsZWZ0KTsKKyAgICBjb25zdCB1aW50NjRfdCB0b3BfbSA9IExEKHRvcCk7CisgICAgSU5TRVJUX0QyX1VCKGxlZnRfbSwgdG9wX20sIHNyYyk7CisgICAgQ0FMQ19EQzgoc3JjLCBvdXQpOworICB9IGVsc2UgaWYgKGxlZnQgIT0gTlVMTCkgeyAgIC8vIGxlZnQgYnV0IG5vIHRvcAorICAgIGNvbnN0IHVpbnQ2NF90IGxlZnRfbSA9IExEKGxlZnQpOworICAgIElOU0VSVF9EMl9VQihsZWZ0X20sIGxlZnRfbSwgc3JjKTsKKyAgICBDQUxDX0RDOChzcmMsIG91dCk7CisgIH0gZWxzZSBpZiAodG9wICE9IE5VTEwpIHsgICAvLyB0b3AgYnV0IG5vIGxlZnQKKyAgICBjb25zdCB1aW50NjRfdCB0b3BfbSA9IExEKHRvcCk7CisgICAgSU5TRVJUX0QyX1VCKHRvcF9tLCB0b3BfbSwgc3JjKTsKKyAgICBDQUxDX0RDOChzcmMsIG91dCk7CisgIH0gZWxzZSB7ICAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIHNyYyA9ICh2MTZ1OClfX21zYV9maWxsX2IoMHg4MCk7CisgICAgb3V0ID0gX19tc2FfY29weV9zX2QoKHYyaTY0KXNyYywgMCk7CisgIH0KKyAgU1RPUkU4eDgob3V0LCBkc3QpOworfQorCitzdGF0aWMgdm9pZCBJbnRyYUNocm9tYVByZWRzX01TQSh1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgLy8gVSBibG9jaworICBEQ01vZGU4eDgoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDh4OChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4eDgoQzhIRTggKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uOHg4KEM4VE04ICsgZHN0LCBsZWZ0LCB0b3ApOworICAvLyBWIGJsb2NrCisgIGRzdCArPSA4OworICBpZiAodG9wICE9IE5VTEwpIHRvcCArPSA4OworICBpZiAobGVmdCAhPSBOVUxMKSBsZWZ0ICs9IDE2OworICBEQ01vZGU4eDgoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZDh4OChDOFZFOCArIGRzdCwgdG9wKTsKKyAgSG9yaXpvbnRhbFByZWQ4eDgoQzhIRTggKyBkc3QsIGxlZnQpOworICBUcnVlTW90aW9uOHg4KEM4VE04ICsgZHN0LCBsZWZ0LCB0b3ApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWV0cmljCisKKyNkZWZpbmUgUEFDS19ET1RQX1VCNF9TVyhpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgIFwKKyAgdjE2dTggdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdG1wMiwgdG1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSFNVQl9VQjJfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9TSDJfU1codG1wMiwgdG1wMywgdG1wMiwgdG1wMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoaW4yLCBpbjMsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSFNVQl9VQjJfU0godG1wMCwgdG1wMSwgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9TSDJfU1codG1wMiwgdG1wMywgdG1wMiwgdG1wMywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgUEFDS19EUEFERF9VQjRfU1coaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIHYxNnU4IHRtcDAsIHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoaW4wLCBpbjEsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhTVUJfVUIyX1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEUEFERF9TSDJfU1codG1wMiwgdG1wMywgdG1wMiwgdG1wMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfQjJfVUIoaW4yLCBpbjMsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhTVUJfVUIyX1NIKHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBEUEFERF9TSDJfU1codG1wMiwgdG1wMywgdG1wMiwgdG1wMywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfTVNBKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyX3Qgc3VtOworICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICB2MTZ1OCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3OworICB2NGkzMiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworCisgIExEX1VCOChhLCBCUFMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICBMRF9VQjgoYiwgQlBTLCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3KTsKKyAgUEFDS19ET1RQX1VCNF9TVyhzcmMwLCByZWYwLCBzcmMxLCByZWYxLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjMiwgcmVmMiwgc3JjMywgcmVmMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzQsIHJlZjQsIHNyYzUsIHJlZjUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM2LCByZWY2LCBzcmM3LCByZWY3LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgYSArPSA4ICogQlBTOworICBiICs9IDggKiBCUFM7CisgIExEX1VCOChhLCBCUFMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICBMRF9VQjgoYiwgQlBTLCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3KTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjMCwgcmVmMCwgc3JjMSwgcmVmMSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzIsIHJlZjIsIHNyYzMsIHJlZjMsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM0LCByZWY0LCBzcmM1LCByZWY1LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjNiwgcmVmNiwgc3JjNywgcmVmNywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIG91dDAgKz0gb3V0MTsKKyAgb3V0MiArPSBvdXQzOworICBvdXQwICs9IG91dDI7CisgIHN1bSA9IEhBRERfU1dfUzMyKG91dDApOworICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IFNTRTE2eDhfTVNBKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgdWludDMyX3Qgc3VtOworICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmM0LCBzcmM1LCBzcmM2LCBzcmM3OworICB2MTZ1OCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3OworICB2NGkzMiBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOworCisgIExEX1VCOChhLCBCUFMsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNyYzQsIHNyYzUsIHNyYzYsIHNyYzcpOworICBMRF9VQjgoYiwgQlBTLCByZWYwLCByZWYxLCByZWYyLCByZWYzLCByZWY0LCByZWY1LCByZWY2LCByZWY3KTsKKyAgUEFDS19ET1RQX1VCNF9TVyhzcmMwLCByZWYwLCBzcmMxLCByZWYxLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgUEFDS19EUEFERF9VQjRfU1coc3JjMiwgcmVmMiwgc3JjMywgcmVmMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIFBBQ0tfRFBBRERfVUI0X1NXKHNyYzQsIHJlZjQsIHNyYzUsIHJlZjUsIG91dDAsIG91dDEsIG91dDIsIG91dDMpOworICBQQUNLX0RQQUREX1VCNF9TVyhzcmM2LCByZWY2LCBzcmM3LCByZWY3LCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsKKyAgb3V0MCArPSBvdXQxOworICBvdXQyICs9IG91dDM7CisgIG91dDAgKz0gb3V0MjsKKyAgc3VtID0gSEFERF9TV19TMzIob3V0MCk7CisgIHJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQgU1NFOHg4X01TQShjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMl90IHN1bTsKKyAgdjE2dTggc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNzsKKyAgdjE2dTggcmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNzsKKyAgdjE2dTggdDAsIHQxLCB0MiwgdDM7CisgIHY0aTMyIG91dDAsIG91dDEsIG91dDIsIG91dDM7CisKKyAgTERfVUI4KGEsIEJQUywgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc3JjNCwgc3JjNSwgc3JjNiwgc3JjNyk7CisgIExEX1VCOChiLCBCUFMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHJlZjQsIHJlZjUsIHJlZjYsIHJlZjcpOworICBJTFZSX0I0X1VCKHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHJlZjAsIHJlZjEsIHJlZjIsIHJlZjMsIHQwLCB0MSwgdDIsIHQzKTsKKyAgUEFDS19ET1RQX1VCNF9TVyh0MCwgdDIsIHQxLCB0Mywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIElMVlJfQjRfVUIoc3JjNCwgc3JjNSwgc3JjNiwgc3JjNywgcmVmNCwgcmVmNSwgcmVmNiwgcmVmNywgdDAsIHQxLCB0MiwgdDMpOworICBQQUNLX0RQQUREX1VCNF9TVyh0MCwgdDIsIHQxLCB0Mywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Myk7CisgIG91dDAgKz0gb3V0MTsKKyAgb3V0MiArPSBvdXQzOworICBvdXQwICs9IG91dDI7CisgIHN1bSA9IEhBRERfU1dfUzMyKG91dDApOworICByZXR1cm4gc3VtOworfQorCitzdGF0aWMgaW50IFNTRTR4NF9NU0EoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJfdCBzdW0gPSAwOworICB1aW50MzJfdCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCByZWYwLCByZWYxLCByZWYyLCByZWYzOworICB2MTZ1OCBzcmMgPSB7IDAgfSwgcmVmID0geyAwIH0sIHRtcDAsIHRtcDE7CisgIHY4aTE2IGRpZmYwLCBkaWZmMTsKKyAgdjRpMzIgb3V0MCwgb3V0MTsKKworICBMVzQoYSwgQlBTLCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgTFc0KGIsIEJQUywgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMyk7CisgIElOU0VSVF9XNF9VQihzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBzcmMpOworICBJTlNFUlRfVzRfVUIocmVmMCwgcmVmMSwgcmVmMiwgcmVmMywgcmVmKTsKKyAgSUxWUkxfQjJfVUIoc3JjLCByZWYsIHRtcDAsIHRtcDEpOworICBIU1VCX1VCMl9TSCh0bXAwLCB0bXAxLCBkaWZmMCwgZGlmZjEpOworICBET1RQX1NIMl9TVyhkaWZmMCwgZGlmZjEsIGRpZmYwLCBkaWZmMSwgb3V0MCwgb3V0MSk7CisgIG91dDAgKz0gb3V0MTsKKyAgc3VtID0gSEFERF9TV19TMzIob3V0MCk7CisgIHJldHVybiBzdW07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6YXRpb24KKworc3RhdGljIGludCBRdWFudGl6ZUJsb2NrX01TQShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgc3VtOworICB2OGkxNiBpbjAsIGluMSwgc2gwLCBzaDEsIG91dDAsIG91dDE7CisgIHY4aTE2IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDMsIHRtcDQsIHRtcDUsIHNpZ24wLCBzaWduMTsKKyAgdjRpMzIgczAsIHMxLCBzMiwgczMsIGIwLCBiMSwgYjIsIGIzLCB0MCwgdDEsIHQyLCB0MzsKKyAgY29uc3QgdjhpMTYgemVybyA9IHsgMCB9OworICBjb25zdCB2OGkxNiB6aWd6YWcwID0geyAwLCAxLCA0LCA4LCA1LCAyLCAzLCA2IH07CisgIGNvbnN0IHY4aTE2IHppZ3phZzEgPSB7IDksIDEyLCAxMywgMTAsIDcsIDExLCAxNCwgMTUgfTsKKyAgY29uc3QgdjhpMTYgbWF4bGV2ZWwgPSBfX21zYV9maWxsX2goTUFYX0xFVkVMKTsKKworICBMRF9TSDIoJmluWzBdLCA4LCBpbjAsIGluMSk7CisgIExEX1NIMigmbXR4LT5zaGFycGVuX1swXSwgOCwgc2gwLCBzaDEpOworICB0bXA0ID0gX19tc2FfYWRkX2FfaChpbjAsIHplcm8pOworICB0bXA1ID0gX19tc2FfYWRkX2FfaChpbjEsIHplcm8pOworICBJTFZSTF9IMl9TSChzaDAsIHRtcDQsIHRtcDAsIHRtcDEpOworICBJTFZSTF9IMl9TSChzaDEsIHRtcDUsIHRtcDIsIHRtcDMpOworICBIQUREX1NINF9TVyh0bXAwLCB0bXAxLCB0bXAyLCB0bXAzLCBzMCwgczEsIHMyLCBzMyk7CisgIHNpZ24wID0gKGluMCA8IHplcm8pOworICBzaWduMSA9IChpbjEgPCB6ZXJvKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduCisgIExEX1NIMigmbXR4LT5pcV9bMF0sIDgsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgIC8vIGlxCisgIElMVlJMX0gyX1NXKHplcm8sIHRtcDAsIHQwLCB0MSk7CisgIElMVlJMX0gyX1NXKHplcm8sIHRtcDEsIHQyLCB0Myk7CisgIExEX1NXNCgmbXR4LT5iaWFzX1swXSwgNCwgYjAsIGIxLCBiMiwgYjMpOyAgICAgIC8vIGJpYXMKKyAgTVVMNCh0MCwgczAsIHQxLCBzMSwgdDIsIHMyLCB0MywgczMsIHQwLCB0MSwgdDIsIHQzKTsKKyAgQURENChiMCwgdDAsIGIxLCB0MSwgYjIsIHQyLCBiMywgdDMsIGIwLCBiMSwgYjIsIGIzKTsKKyAgU1JBSV9XNF9TVyhiMCwgYjEsIGIyLCBiMywgMTcpOworICBQQ0tFVl9IMl9TSChiMSwgYjAsIGIzLCBiMiwgdG1wMiwgdG1wMyk7CisgIHRtcDAgPSAodG1wMiA+IG1heGxldmVsKTsKKyAgdG1wMSA9ICh0bXAzID4gbWF4bGV2ZWwpOworICB0bXAyID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpdG1wMiwgKHYxNnU4KW1heGxldmVsLCAodjE2dTgpdG1wMCk7CisgIHRtcDMgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl0bXAzLCAodjE2dTgpbWF4bGV2ZWwsICh2MTZ1OCl0bXAxKTsKKyAgU1VCMih6ZXJvLCB0bXAyLCB6ZXJvLCB0bXAzLCB0bXAwLCB0bXAxKTsKKyAgdG1wMiA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXRtcDIsICh2MTZ1OCl0bXAwLCAodjE2dTgpc2lnbjApOworICB0bXAzID0gKHY4aTE2KV9fbXNhX2JtbnpfdigodjE2dTgpdG1wMywgKHYxNnU4KXRtcDEsICh2MTZ1OClzaWduMSk7CisgIExEX1NXNCgmbXR4LT56dGhyZXNoX1swXSwgNCwgdDAsIHQxLCB0MiwgdDMpOyAgIC8vIHp0aHJlc2gKKyAgdDAgPSAoczAgPiB0MCk7CisgIHQxID0gKHMxID4gdDEpOworICB0MiA9IChzMiA+IHQyKTsKKyAgdDMgPSAoczMgPiB0Myk7CisgIFBDS0VWX0gyX1NIKHQxLCB0MCwgdDMsIHQyLCB0bXAwLCB0bXAxKTsKKyAgdG1wNCA9ICh2OGkxNilfX21zYV9ibW56X3YoKHYxNnU4KXplcm8sICh2MTZ1OCl0bXAyLCAodjE2dTgpdG1wMCk7CisgIHRtcDUgPSAodjhpMTYpX19tc2FfYm1uel92KCh2MTZ1OCl6ZXJvLCAodjE2dTgpdG1wMywgKHYxNnU4KXRtcDEpOworICBMRF9TSDIoJm10eC0+cV9bMF0sIDgsIHRtcDAsIHRtcDEpOworICBNVUwyKHRtcDQsIHRtcDAsIHRtcDUsIHRtcDEsIGluMCwgaW4xKTsKKyAgVlNIRl9IMl9TSCh0bXA0LCB0bXA1LCB0bXA0LCB0bXA1LCB6aWd6YWcwLCB6aWd6YWcxLCBvdXQwLCBvdXQxKTsKKyAgU1RfU0gyKGluMCwgaW4xLCAmaW5bMF0sIDgpOworICBTVF9TSDIob3V0MCwgb3V0MSwgJm91dFswXSwgOCk7CisgIG91dDAgPSBfX21zYV9hZGRfYV9oKG91dDAsIG91dDEpOworICBzdW0gPSBIQUREX1NIX1MzMihvdXQwKTsKKyAgcmV0dXJuIChzdW0gPiAwKTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfTVNBKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgpIHsKKyAgaW50IG56OworICBueiAgPSBWUDhFbmNRdWFudGl6ZUJsb2NrKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIG10eCkgPDwgMDsKKyAgbnogfD0gVlA4RW5jUXVhbnRpemVCbG9jayhpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0TVNBKHZvaWQpIHsKKyAgVlA4SVRyYW5zZm9ybSA9IElUcmFuc2Zvcm1fTVNBOworICBWUDhGVHJhbnNmb3JtID0gRlRyYW5zZm9ybV9NU0E7CisgIFZQOEZUcmFuc2Zvcm1XSFQgPSBGVHJhbnNmb3JtV0hUX01TQTsKKworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9NU0E7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9NU0E7CisgIFZQOENvbGxlY3RIaXN0b2dyYW0gPSBDb2xsZWN0SGlzdG9ncmFtX01TQTsKKworICBWUDhFbmNQcmVkTHVtYTQgPSBJbnRyYTRQcmVkc19NU0E7CisgIFZQOEVuY1ByZWRMdW1hMTYgPSBJbnRyYTE2UHJlZHNfTVNBOworICBWUDhFbmNQcmVkQ2hyb21hOCA9IEludHJhQ2hyb21hUHJlZHNfTVNBOworCisgIFZQOFNTRTE2eDE2ID0gU1NFMTZ4MTZfTVNBOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9NU0E7CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9NU0E7CisgIFZQOFNTRTR4NCA9IFNTRTR4NF9NU0E7CisKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfTVNBOworICBWUDhFbmNRdWFudGl6ZTJCbG9ja3MgPSBRdWFudGl6ZTJCbG9ja3NfTVNBOworICBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUID0gUXVhbnRpemVCbG9ja19NU0E7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYmYxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19uZW9uLmMKQEAgLTAsMCArMSw5MzggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBUk0gTkVPTiB2ZXJzaW9uIG9mIHNwZWVkLWNyaXRpY2FsIGVuY29kaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBhZGFwdGVkIGZyb20gbGlidnB4IChodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy9jb2RlLykKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgInNyYy9kc3AvbmVvbi5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRyYW5zZm9ybXMgKFBhcmFncmFwaCAxNC40KQorCisvLyBJbnZlcnNlIHRyYW5zZm9ybS4KKy8vIFRoaXMgY29kZSBpcyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyBUcmFuc2Zvcm1PbmUgaW4gdGhlIGRlY19uZW9uLmMsIGV4Y2VwdAorLy8gZm9yIHN1YnRyYWN0aW9uIHRvICpyZWYuIFNlZSB0aGUgY29tbWVudHMgdGhlcmUgZm9yIGFsZ29yaXRobWljIGV4cGxhbmF0aW9ucy4KKworc3RhdGljIGNvbnN0IGludDE2X3Qga0MxID0gMjAwOTE7CitzdGF0aWMgY29uc3QgaW50MTZfdCBrQzIgPSAxNzczNDsgIC8vIGhhbGYgb2Yga0MyLCBhY3R1YWxseS4gU2VlIGNvbW1lbnQgYWJvdmUuCisKKy8vIFRoaXMgY29kZSB3b3JrcyBidXQgaXMgKnNsb3dlciogdGhhbiB0aGUgaW5saW5lZC1hc20gdmVyc2lvbiBiZWxvdworLy8gKHdpdGggZ2NjLTQuNikuIFNvIHdlIGRpc2FibGUgaXQgZm9yIG5vdy4gTGF0ZXIsIGl0J2xsIGJlIGNvbmRpdGlvbmFsIHRvCisvLyBXRUJQX1VTRV9JTlRSSU5TSUNTIGRlZmluZS4KKy8vIFdpdGggZ2NjLTQuOCwgaXQncyBhIGxpdHRsZSBmYXN0ZXIgc3BlZWQgdGhhbiBpbmxpbmVkLWFzc2VtYmx5LgorI2lmIGRlZmluZWQoV0VCUF9VU0VfSU5UUklOU0lDUykKKworLy8gVHJlYXRzICd2JyBhcyBhbiB1aW50OHg4X3QgYW5kIHplcm8gZXh0ZW5kcyB0byBhbiBpbnQxNng4X3QuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OF90IENvbnZlcnRVOFRvUzE2X05FT04odWludDMyeDJfdCB2KSB7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3MxNl91MTYodm1vdmxfdTgodnJlaW50ZXJwcmV0X3U4X3UzMih2KSkpOworfQorCisvLyBQZXJmb3JtcyB1bnNpZ25lZCA4YiBzYXR1cmF0aW9uIG9uICdkc3QwMScgYW5kICdkc3QyMycgc3RvcmluZyB0aGUgcmVzdWx0CisvLyB0byB0aGUgY29ycmVzcG9uZGluZyByb3dzIG9mICdkc3QnLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU2F0dXJhdGVBbmRTdG9yZTR4NF9ORU9OKHVpbnQ4X3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgZHN0MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4OF90IGRzdDIzKSB7CisgIC8vIFVuc2lnbmVkIHNhdHVyYXRlIHRvIDhiLgorICBjb25zdCB1aW50OHg4X3QgZHN0MDFfdTggPSB2cW1vdnVuX3MxNihkc3QwMSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBkc3QyM191OCA9IHZxbW92dW5fczE2KGRzdDIzKTsKKworICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAwICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QwMV91OCksIDApOworICB2c3QxX2xhbmVfdTMyKCh1aW50MzJfdCopKGRzdCArIDEgKiBCUFMpLCB2cmVpbnRlcnByZXRfdTMyX3U4KGRzdDAxX3U4KSwgMSk7CisgIHZzdDFfbGFuZV91MzIoKHVpbnQzMl90KikoZHN0ICsgMiAqIEJQUyksIHZyZWludGVycHJldF91MzJfdTgoZHN0MjNfdTgpLCAwKTsKKyAgdnN0MV9sYW5lX3UzMigodWludDMyX3QqKShkc3QgKyAzICogQlBTKSwgdnJlaW50ZXJwcmV0X3UzMl91OChkc3QyM191OCksIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGQ0eDRfTkVPTihjb25zdCBpbnQxNng4X3Qgcm93MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3Qgcm93MjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgdWludDMyeDJfdCBkc3QwMSA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQzMngyX3QgZHN0MjMgPSB2ZHVwX25fdTMyKDApOworCisgIC8vIExvYWQgdGhlIHNvdXJjZSBwaXhlbHMuCisgIGRzdDAxID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShyZWYgKyAwICogQlBTKSwgZHN0MDEsIDApOworICBkc3QyMyA9IHZsZDFfbGFuZV91MzIoKHVpbnQzMl90KikocmVmICsgMiAqIEJQUyksIGRzdDIzLCAwKTsKKyAgZHN0MDEgPSB2bGQxX2xhbmVfdTMyKCh1aW50MzJfdCopKHJlZiArIDEgKiBCUFMpLCBkc3QwMSwgMSk7CisgIGRzdDIzID0gdmxkMV9sYW5lX3UzMigodWludDMyX3QqKShyZWYgKyAzICogQlBTKSwgZHN0MjMsIDEpOworCisgIHsKKyAgICAvLyBDb252ZXJ0IHRvIDE2Yi4KKyAgICBjb25zdCBpbnQxNng4X3QgZHN0MDFfczE2ID0gQ29udmVydFU4VG9TMTZfTkVPTihkc3QwMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGRzdDIzX3MxNiA9IENvbnZlcnRVOFRvUzE2X05FT04oZHN0MjMpOworCisgICAgLy8gRGVzY2FsZSB3aXRoIHJvdW5kaW5nLgorICAgIGNvbnN0IGludDE2eDhfdCBvdXQwMSA9IHZyc3JhcV9uX3MxNihkc3QwMV9zMTYsIHJvdzAxLCAzKTsKKyAgICBjb25zdCBpbnQxNng4X3Qgb3V0MjMgPSB2cnNyYXFfbl9zMTYoZHN0MjNfczE2LCByb3cyMywgMyk7CisgICAgLy8gQWRkIHRoZSBpbnZlcnNlIHRyYW5zZm9ybS4KKyAgICBTYXR1cmF0ZUFuZFN0b3JlNHg0X05FT04oZHN0LCBvdXQwMSwgb3V0MjMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRyYW5zcG9zZTh4Ml9ORU9OKGNvbnN0IGludDE2eDhfdCBpbjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNng4X3QgaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZ4OHgyX3QqIGNvbnN0IG91dCkgeworICAvLyBhMCBhMSBhMiBhMyB8IGIwIGIxIGIyIGIzICAgPT4gYTAgYjAgYzAgZDAgfCBhMSBiMSBjMSBkMQorICAvLyBjMCBjMSBjMiBjMyB8IGQwIGQxIGQyIGQzICAgICAgYTIgYjIgYzIgZDIgfCBhMyBiMyBjMyBkMworICBjb25zdCBpbnQxNng4eDJfdCB0bXAwID0gdnppcHFfczE2KGluMCwgaW4xKTsgICAvLyBhMCBjMCBhMSBjMSBhMiBjMiAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYjAgZDAgYjEgZDEgYjIgZDIgLi4uCisgICpvdXQgPSB2emlwcV9zMTYodG1wMC52YWxbMF0sIHRtcDAudmFsWzFdKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJhbnNmb3JtUGFzc19ORU9OKGludDE2eDh4Ml90KiBjb25zdCByb3dzKSB7CisgIC8vIHtyb3dzfSA9IGluMCB8IGluNAorICAvLyAgICAgICAgICBpbjggfCBpbjEyCisgIC8vIEIxID0gaW40IHwgaW4xMgorICBjb25zdCBpbnQxNng4X3QgQjEgPQorICAgICAgdmNvbWJpbmVfczE2KHZnZXRfaGlnaF9zMTYocm93cy0+dmFsWzBdKSwgdmdldF9oaWdoX3MxNihyb3dzLT52YWxbMV0pKTsKKyAgLy8gQzAgPSBrQzEgKiBpbjQgfCBrQzEgKiBpbjEyCisgIC8vIEMxID0ga0MyICogaW40IHwga0MyICogaW4xMgorICBjb25zdCBpbnQxNng4X3QgQzAgPSB2c3JhcV9uX3MxNihCMSwgdnFkbXVsaHFfbl9zMTYoQjEsIGtDMSksIDEpOworICBjb25zdCBpbnQxNng4X3QgQzEgPSB2cWRtdWxocV9uX3MxNihCMSwga0MyKTsKKyAgY29uc3QgaW50MTZ4NF90IGEgPSB2cWFkZF9zMTYodmdldF9sb3dfczE2KHJvd3MtPnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNihyb3dzLT52YWxbMV0pKTsgICAvLyBpbjAgKyBpbjgKKyAgY29uc3QgaW50MTZ4NF90IGIgPSB2cXN1Yl9zMTYodmdldF9sb3dfczE2KHJvd3MtPnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3MxNihyb3dzLT52YWxbMV0pKTsgICAvLyBpbjAgLSBpbjgKKyAgLy8gYyA9IGtDMiAqIGluNCAtIGtDMSAqIGluMTIKKyAgLy8gZCA9IGtDMSAqIGluNCArIGtDMiAqIGluMTIKKyAgY29uc3QgaW50MTZ4NF90IGMgPSB2cXN1Yl9zMTYodmdldF9sb3dfczE2KEMxKSwgdmdldF9oaWdoX3MxNihDMCkpOworICBjb25zdCBpbnQxNng0X3QgZCA9IHZxYWRkX3MxNih2Z2V0X2xvd19zMTYoQzApLCB2Z2V0X2hpZ2hfczE2KEMxKSk7CisgIGNvbnN0IGludDE2eDhfdCBEMCA9IHZjb21iaW5lX3MxNihhLCBiKTsgICAgICAvLyBEMCA9IGEgfCBiCisgIGNvbnN0IGludDE2eDhfdCBEMSA9IHZjb21iaW5lX3MxNihkLCBjKTsgICAgICAvLyBEMSA9IGQgfCBjCisgIGNvbnN0IGludDE2eDhfdCBFMCA9IHZxYWRkcV9zMTYoRDAsIEQxKTsgICAgICAvLyBhK2QgfCBiK2MKKyAgY29uc3QgaW50MTZ4OF90IEVfdG1wID0gdnFzdWJxX3MxNihEMCwgRDEpOyAgIC8vIGEtZCB8IGItYworICBjb25zdCBpbnQxNng4X3QgRTEgPSB2Y29tYmluZV9zMTYodmdldF9oaWdoX3MxNihFX3RtcCksIHZnZXRfbG93X3MxNihFX3RtcCkpOworICBUcmFuc3Bvc2U4eDJfTkVPTihFMCwgRTEsIHJvd3MpOworfQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtT25lX05FT04oY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgaW50MTZ4OHgyX3Qgcm93czsKKyAgSU5JVF9WRUNUT1IyKHJvd3MsIHZsZDFxX3MxNihpbiArIDApLCB2bGQxcV9zMTYoaW4gKyA4KSk7CisgIFRyYW5zZm9ybVBhc3NfTkVPTigmcm93cyk7CisgIFRyYW5zZm9ybVBhc3NfTkVPTigmcm93cyk7CisgIEFkZDR4NF9ORU9OKHJvd3MudmFsWzBdLCByb3dzLnZhbFsxXSwgcmVmLCBkc3QpOworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtT25lX05FT04oY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGluLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgaW50IGtCUFMgPSBCUFM7CisgIGNvbnN0IGludDE2X3Qga0MxQzJbXSA9IHsga0MxLCBrQzIsIDAsIDAgfTsKKworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAidmxkMS4xNiAgICAgICAgIHtxMSwgcTJ9LCBbJVtpbl1dICAgICAgICAgICBcbiIKKyAgICAidmxkMS4xNiAgICAgICAgIHtkMH0sIFslW2tDMUMyXV0gICAgICAgICAgICBcbiIKKworICAgIC8vIGQyOiBpblswXQorICAgIC8vIGQzOiBpbls4XQorICAgIC8vIGQ0OiBpbls0XQorICAgIC8vIGQ1OiBpblsxMl0KKyAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIHE4ID0ge2luWzRdLCBpblsxMl19ICoga0MxICogMiA+PiAxNgorICAgIC8vIHE5ID0ge2luWzRdLCBpblsxMl19ICoga0MyID4+IDE2CisgICAgInZxZG11bGguczE2ICAgICBxOCwgcTIsIGQwWzBdICAgICAgICAgICAgICAgXG4iCisgICAgInZxZG11bGguczE2ICAgICBxOSwgcTIsIGQwWzFdICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBkMjIgPSBhID0gaW5bMF0gKyBpbls4XQorICAgIC8vIGQyMyA9IGIgPSBpblswXSAtIGluWzhdCisgICAgInZxYWRkLnMxNiAgICAgICBkMjIsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxc3ViLnMxNiAgICAgICBkMjMsIGQyLCBkMyAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyAgcTggPSBpbls0XS9bMTJdICoga0MxID4+IDE2CisgICAgInZzaHIuczE2ICAgICAgICBxOCwgcTgsICMxICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBBZGQge2luWzRdLCBpblsxMl19IGJhY2sgYWZ0ZXIgdGhlIG11bHRpcGxpY2F0aW9uLgorICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKKyAgICAvLyBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIgPSB0bXBbMF0gPSBhICsgZAorICAgIC8vIGQzID0gdG1wWzFdID0gYiArIGMKKyAgICAvLyBkNCA9IHRtcFsyXSA9IGIgLSBjCisgICAgLy8gZDUgPSB0bXBbM10gPSBhIC0gZAorICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ6aXAuMTYgICAgICAgICBxMSwgcTIgICAgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnN3cCAgICAgICAgICAgIGQzLCBkNCAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIHE4ID0ge3RtcFs0XSwgdG1wWzEyXX0gKiBrQzEgKiAyID4+IDE2CisgICAgLy8gcTkgPSB7dG1wWzRdLCB0bXBbMTJdfSAqIGtDMiA+PiAxNgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTgsIHEyLCBkMFswXSAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWRtdWxoLnMxNiAgICAgcTksIHEyLCBkMFsxXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIyID0gYSA9IHRtcFswXSArIHRtcFs4XQorICAgIC8vIGQyMyA9IGIgPSB0bXBbMF0gLSB0bXBbOF0KKyAgICAidnFhZGQuczE2ICAgICAgIGQyMiwgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFzdWIuczE2ICAgICAgIGQyMywgZDIsIGQzICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c2hyLnMxNiAgICAgICAgcTgsIHE4LCAjMSAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgcTgsIHEyLCBxOCAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIwID0gYyA9IGluWzRdKmtDMiAtIGluWzEyXSprQzEKKyAgICAvLyBkMjEgPSBkID0gaW5bNF0qa0MxICsgaW5bMTJdKmtDMgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDIwLCBkMTgsIGQxNyAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDIxLCBkMTksIGQxNiAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gZDIgPSB0bXBbMF0gPSBhICsgZAorICAgIC8vIGQzID0gdG1wWzFdID0gYiArIGMKKyAgICAvLyBkNCA9IHRtcFsyXSA9IGIgLSBjCisgICAgLy8gZDUgPSB0bXBbM10gPSBhIC0gZAorICAgICJ2cWFkZC5zMTYgICAgICAgZDIsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cWFkZC5zMTYgICAgICAgZDMsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDQsIGQyMywgZDIwICAgICAgICAgICAgICAgIFxuIgorICAgICJ2cXN1Yi5zMTYgICAgICAgZDUsIGQyMiwgZDIxICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZsZDEuMzIgICAgICAgICBkNlswXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkNlsxXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkN1swXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCisgICAgInZsZDEuMzIgICAgICAgICBkN1sxXSwgWyVbcmVmXV0sICVba0JQU10gICAgXG4iCisKKyAgICAic3ViICAgICAgICAgJVtyZWZdLCAlW3JlZl0sICVba0JQU10sIGxzbCAjMiBcbiIKKworICAgIC8vICh2YWwpICsgNCA+PiAzCisgICAgInZyc2hyLnMxNiAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkMywgZDMsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkNCwgZDQsICMzICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZyc2hyLnMxNiAgICAgICBkNSwgZDUsICMzICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnppcC4xNiAgICAgICAgIHExLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIE11c3QgYWNjdW11bGF0ZSBiZWZvcmUgc2F0dXJhdGluZworICAgICJ2bW92bC51OCAgICAgICAgcTgsIGQ2ICAgICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2bW92bC51OCAgICAgICAgcTksIGQ3ICAgICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZxYWRkLnMxNiAgICAgICBxMSwgcTEsIHE4ICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZxYWRkLnMxNiAgICAgICBxMiwgcTIsIHE5ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnFtb3Z1bi5zMTYgICAgIGQwLCBxMSAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnFtb3Z1bi5zMTYgICAgIGQxLCBxMiAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgICJ2c3QxLjMyICAgICAgICAgZDBbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDBbMV0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDFbMF0sIFslW2RzdF1dLCAlW2tCUFNdICAgIFxuIgorICAgICJ2c3QxLjMyICAgICAgICAgZDFbMV0sIFslW2RzdF1dICAgICAgICAgICAgIFxuIgorCisgICAgOiBbaW5dICIrciIoaW4pLCBbZHN0XSAiK3IiKGRzdCkgICAgICAgICAgICAgICAvLyBtb2RpZmllZCByZWdpc3RlcnMKKyAgICA6IFtrQlBTXSAiciIoa0JQUyksIFtrQzFDMl0gInIiKGtDMUMyKSwgW3JlZl0gInIiKHJlZikgIC8vIGNvbnN0YW50cworICAgIDogIm1lbW9yeSIsICJxMCIsICJxMSIsICJxMiIsICJxOCIsICJxOSIsICJxMTAiLCAicTExIiAgLy8gY2xvYmJlcmVkCisgICk7Cit9CisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9JTlRSSU5TSUNTCisKK3N0YXRpYyB2b2lkIElUcmFuc2Zvcm1fTkVPTihjb25zdCB1aW50OF90KiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW4sIHVpbnQ4X3QqIGRzdCwgaW50IGRvX3R3bykgeworICBJVHJhbnNmb3JtT25lX05FT04ocmVmLCBpbiwgZHN0KTsKKyAgaWYgKGRvX3R3bykgeworICAgIElUcmFuc2Zvcm1PbmVfTkVPTihyZWYgKyA0LCBpbiArIDE2LCBkc3QgKyA0KTsKKyAgfQorfQorCisvLyBMb2FkIGFsbCA0eDQgcGl4ZWxzIGludG8gYSBzaW5nbGUgdWludDh4MTZfdCB2YXJpYWJsZS4KK3N0YXRpYyB1aW50OHgxNl90IExvYWQ0eDRfTkVPTihjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgdWludDMyeDRfdCBvdXQgPSB2ZHVwcV9uX3UzMigwKTsKKyAgb3V0ID0gdmxkMXFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90Kikoc3JjICsgMCAqIEJQUyksIG91dCwgMCk7CisgIG91dCA9IHZsZDFxX2xhbmVfdTMyKChjb25zdCB1aW50MzJfdCopKHNyYyArIDEgKiBCUFMpLCBvdXQsIDEpOworICBvdXQgPSB2bGQxcV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKShzcmMgKyAyICogQlBTKSwgb3V0LCAyKTsKKyAgb3V0ID0gdmxkMXFfbGFuZV91MzIoKGNvbnN0IHVpbnQzMl90Kikoc3JjICsgMyAqIEJQUyksIG91dCwgMyk7CisgIHJldHVybiB2cmVpbnRlcnByZXRxX3U4X3UzMihvdXQpOworfQorCisvLyBGb3J3YXJkIHRyYW5zZm9ybS4KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfSU5UUklOU0lDUykKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVHJhbnNwb3NlNHg0X1MxNl9ORU9OKGNvbnN0IGludDE2eDRfdCBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDRfdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDRfdCBDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2eDRfdCBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2eDhfdCogY29uc3Qgb3V0MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZ4OF90KiBjb25zdCBvdXQzMikgeworICBjb25zdCBpbnQxNng0eDJfdCBBQiA9IHZ0cm5fczE2KEEsIEIpOworICBjb25zdCBpbnQxNng0eDJfdCBDRCA9IHZ0cm5fczE2KEMsIEQpOworICBjb25zdCBpbnQzMngyeDJfdCB0bXAwMiA9IHZ0cm5fczMyKHZyZWludGVycHJldF9zMzJfczE2KEFCLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3MzMl9zMTYoQ0QudmFsWzBdKSk7CisgIGNvbnN0IGludDMyeDJ4Ml90IHRtcDEzID0gdnRybl9zMzIodnJlaW50ZXJwcmV0X3MzMl9zMTYoQUIudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfczMyX3MxNihDRC52YWxbMV0pKTsKKyAgKm91dDAxID0gdnJlaW50ZXJwcmV0cV9zMTZfczY0KAorICAgICAgdmNvbWJpbmVfczY0KHZyZWludGVycHJldF9zNjRfczMyKHRtcDAyLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3M2NF9zMzIodG1wMTMudmFsWzBdKSkpOworICAqb3V0MzIgPSB2cmVpbnRlcnByZXRxX3MxNl9zNjQoCisgICAgICB2Y29tYmluZV9zNjQodnJlaW50ZXJwcmV0X3M2NF9zMzIodG1wMTMudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRfczY0X3MzMih0bXAwMi52YWxbMV0pKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQxNng4X3QgRGlmZlU4VG9TMTZfTkVPTihjb25zdCB1aW50OHg4X3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHg4X3QgYikgeworICByZXR1cm4gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZzdWJsX3U4KGEsIGIpKTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybV9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dCkgeworICBpbnQxNng4X3QgZDBkMSwgZDNkMjsgICAvLyB3b3JraW5nIDR4NCBpbnQxNiB2YXJpYWJsZXMKKyAgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgUzAgPSBMb2FkNHg0X05FT04oc3JjKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFIwID0gTG9hZDR4NF9ORU9OKHJlZik7CisgICAgY29uc3QgaW50MTZ4OF90IEQwRDEgPSBEaWZmVThUb1MxNl9ORU9OKHZnZXRfbG93X3U4KFMwKSwgdmdldF9sb3dfdTgoUjApKTsKKyAgICBjb25zdCBpbnQxNng4X3QgRDJEMyA9IERpZmZVOFRvUzE2X05FT04odmdldF9oaWdoX3U4KFMwKSwgdmdldF9oaWdoX3U4KFIwKSk7CisgICAgY29uc3QgaW50MTZ4NF90IEQwID0gdmdldF9sb3dfczE2KEQwRDEpOworICAgIGNvbnN0IGludDE2eDRfdCBEMSA9IHZnZXRfaGlnaF9zMTYoRDBEMSk7CisgICAgY29uc3QgaW50MTZ4NF90IEQyID0gdmdldF9sb3dfczE2KEQyRDMpOworICAgIGNvbnN0IGludDE2eDRfdCBEMyA9IHZnZXRfaGlnaF9zMTYoRDJEMyk7CisgICAgVHJhbnNwb3NlNHg0X1MxNl9ORU9OKEQwLCBEMSwgRDIsIEQzLCAmZDBkMSwgJmQzZDIpOworICB9CisgIHsgICAgLy8gMXJzdCBwYXNzCisgICAgY29uc3QgaW50MzJ4NF90IGtDc3Q5MzcgPSB2ZHVwcV9uX3MzMig5MzcpOworICAgIGNvbnN0IGludDMyeDRfdCBrQ3N0MTgxMiA9IHZkdXBxX25fczMyKDE4MTIpOworICAgIGNvbnN0IGludDE2eDhfdCBhMGExID0gdmFkZHFfczE2KGQwZDEsIGQzZDIpOyAgIC8vIGQwK2QzIHwgZDErZDIgICAoPWEwfGExKQorICAgIGNvbnN0IGludDE2eDhfdCBhM2EyID0gdnN1YnFfczE2KGQwZDEsIGQzZDIpOyAgIC8vIGQwLWQzIHwgZDEtZDIgICAoPWEzfGEyKQorICAgIGNvbnN0IGludDE2eDhfdCBhMGExXzIgPSB2c2hscV9uX3MxNihhMGExLCAzKTsKKyAgICBjb25zdCBpbnQxNng0X3QgdG1wMCA9IHZhZGRfczE2KHZnZXRfbG93X3MxNihhMGExXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNihhMGExXzIpKTsKKyAgICBjb25zdCBpbnQxNng0X3QgdG1wMiA9IHZzdWJfczE2KHZnZXRfbG93X3MxNihhMGExXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNihhMGExXzIpKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTNfMjIxNyA9IHZtdWxsX25fczE2KHZnZXRfbG93X3MxNihhM2EyKSwgMjIxNyk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyXzIyMTcgPSB2bXVsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KGEzYTIpLCAyMjE3KTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTJfcF9hMyA9IHZtbGFsX25fczE2KGEyXzIyMTcsIHZnZXRfbG93X3MxNihhM2EyKSwgNTM1Mik7CisgICAgY29uc3QgaW50MzJ4NF90IGEzX21fYTIgPSB2bWxzbF9uX3MxNihhM18yMjE3LCB2Z2V0X2hpZ2hfczE2KGEzYTIpLCA1MzUyKTsKKyAgICBjb25zdCBpbnQxNng0X3QgdG1wMSA9IHZzaHJuX25fczMyKHZhZGRxX3MzMihhMl9wX2EzLCBrQ3N0MTgxMiksIDkpOworICAgIGNvbnN0IGludDE2eDRfdCB0bXAzID0gdnNocm5fbl9zMzIodmFkZHFfczMyKGEzX21fYTIsIGtDc3Q5MzcpLCA5KTsKKyAgICBUcmFuc3Bvc2U0eDRfUzE2X05FT04odG1wMCwgdG1wMSwgdG1wMiwgdG1wMywgJmQwZDEsICZkM2QyKTsKKyAgfQorICB7ICAgIC8vIDJuZCBwYXNzCisgICAgLy8gdGhlICgxPDwxNikgYWRkaXRpb24gaXMgZm9yIHRoZSByZXBsYWNlbWVudDogYTMhPTAgIDwtPiAxLShhMz09MCkKKyAgICBjb25zdCBpbnQzMng0X3Qga0NzdDEyMDAwID0gdmR1cHFfbl9zMzIoMTIwMDAgKyAoMSA8PCAxNikpOworICAgIGNvbnN0IGludDMyeDRfdCBrQ3N0NTEwMDAgPSB2ZHVwcV9uX3MzMig1MTAwMCk7CisgICAgY29uc3QgaW50MTZ4OF90IGEwYTEgPSB2YWRkcV9zMTYoZDBkMSwgZDNkMik7ICAgLy8gZDArZDMgfCBkMStkMiAgICg9YTB8YTEpCisgICAgY29uc3QgaW50MTZ4OF90IGEzYTIgPSB2c3VicV9zMTYoZDBkMSwgZDNkMik7ICAgLy8gZDAtZDMgfCBkMS1kMiAgICg9YTN8YTIpCisgICAgY29uc3QgaW50MTZ4NF90IGEwX2s3ID0gdmFkZF9zMTYodmdldF9sb3dfczE2KGEwYTEpLCB2ZHVwX25fczE2KDcpKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MCA9IHZzaHJfbl9zMTYodmFkZF9zMTYoYTBfazcsIHZnZXRfaGlnaF9zMTYoYTBhMSkpLCA0KTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MiA9IHZzaHJfbl9zMTYodnN1Yl9zMTYoYTBfazcsIHZnZXRfaGlnaF9zMTYoYTBhMSkpLCA0KTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTNfMjIxNyA9IHZtdWxsX25fczE2KHZnZXRfbG93X3MxNihhM2EyKSwgMjIxNyk7CisgICAgY29uc3QgaW50MzJ4NF90IGEyXzIyMTcgPSB2bXVsbF9uX3MxNih2Z2V0X2hpZ2hfczE2KGEzYTIpLCAyMjE3KTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTJfcF9hMyA9IHZtbGFsX25fczE2KGEyXzIyMTcsIHZnZXRfbG93X3MxNihhM2EyKSwgNTM1Mik7CisgICAgY29uc3QgaW50MzJ4NF90IGEzX21fYTIgPSB2bWxzbF9uX3MxNihhM18yMjE3LCB2Z2V0X2hpZ2hfczE2KGEzYTIpLCA1MzUyKTsKKyAgICBjb25zdCBpbnQxNng0X3QgdG1wMSA9IHZhZGRobl9zMzIoYTJfcF9hMywga0NzdDEyMDAwKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MyA9IHZhZGRobl9zMzIoYTNfbV9hMiwga0NzdDUxMDAwKTsKKyAgICBjb25zdCBpbnQxNng0X3QgYTNfZXFfMCA9CisgICAgICAgIHZyZWludGVycHJldF9zMTZfdTE2KHZjZXFfczE2KHZnZXRfbG93X3MxNihhM2EyKSwgdmR1cF9uX3MxNigwKSkpOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQxID0gdmFkZF9zMTYodG1wMSwgYTNfZXFfMCk7CisgICAgdnN0MV9zMTYob3V0ICsgIDAsIG91dDApOworICAgIHZzdDFfczE2KG91dCArICA0LCBvdXQxKTsKKyAgICB2c3QxX3MxNihvdXQgKyAgOCwgb3V0Mik7CisgICAgdnN0MV9zMTYob3V0ICsgMTIsIG91dDMpOworICB9Cit9CisKKyNlbHNlCisKKy8vIGFkYXB0ZWQgZnJvbSB2cDgvZW5jb2Rlci9hcm0vbmVvbi9zaG9ydGZkY3RfbmVvbi5hc20KK3N0YXRpYyBjb25zdCBpbnQxNl90IGtDb2VmZjE2W10gPSB7CisgIDUzNTIsICA1MzUyLCAgNTM1MiwgNTM1MiwgMjIxNywgIDIyMTcsICAyMjE3LCAyMjE3Cit9Oworc3RhdGljIGNvbnN0IGludDMyX3Qga0NvZWZmMzJbXSA9IHsKKyAgIDE4MTIsICAxODEyLCAgMTgxMiwgIDE4MTIsCisgICAgOTM3LCAgIDkzNywgICA5MzcsICAgOTM3LAorICAxMjAwMCwgMTIwMDAsIDEyMDAwLCAxMjAwMCwKKyAgNTEwMDAsIDUxMDAwLCA1MTAwMCwgNTEwMDAKK307CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fTkVPTihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgaW50IGtCUFMgPSBCUFM7CisgIGNvbnN0IHVpbnQ4X3QqIHNyY19wdHIgPSBzcmM7CisgIGNvbnN0IHVpbnQ4X3QqIHJlZl9wdHIgPSByZWY7CisgIGNvbnN0IGludDE2X3QqIGNvZWZmMTYgPSBrQ29lZmYxNjsKKyAgY29uc3QgaW50MzJfdCogY29lZmYzMiA9IGtDb2VmZjMyOworCisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgIC8vIGxvYWQgc3JjIGludG8gcTQsIHE1IGluIGhpZ2ggaGFsZgorICAgICJ2bGQxLjgge2Q4fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2QxMH0sIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2Q5fSwgIFslW3NyY19wdHJdXSwgJVtrQlBTXSAgICAgIFxuIgorICAgICJ2bGQxLjgge2QxMX0sIFslW3NyY19wdHJdXSAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gbG9hZCByZWYgaW50byBxNiwgcTcgaW4gaGlnaCBoYWxmCisgICAgInZsZDEuOCB7ZDEyfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDE0fSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDEzfSwgWyVbcmVmX3B0cl1dLCAlW2tCUFNdICAgICAgXG4iCisgICAgInZsZDEuOCB7ZDE1fSwgWyVbcmVmX3B0cl1dICAgICAgICAgICAgICAgXG4iCisKKyAgICAvLyBQYWNrIHRoZSBoaWdoIHZhbHVlcyBpbiB0byBxNCBhbmQgcTYKKyAgICAidnRybi4zMiAgICAgcTQsIHE1ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKyAgICAidnRybi4zMiAgICAgcTYsIHE3ICAgICAgICAgICAgICAgICAgICAgICBcbiIKKworICAgIC8vIGRbMC0zXSA9IHNyYyAtIHJlZgorICAgICJ2c3VibC51OCAgICBxMCwgZDgsIGQxMiAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2c3VibC51OCAgICBxMSwgZDksIGQxMyAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gbG9hZCBjb2VmZjE2IGludG8gcTgoZDE2PTUzNTIsIGQxNz0yMjE3KQorICAgICJ2bGQxLjE2ICAgICB7cTh9LCBbJVtjb2VmZjE2XV0gICAgICAgICAgIFxuIgorCisgICAgLy8gbG9hZCBjb2VmZjMyIGhpZ2ggaGFsZiBpbnRvIHE5ID0gMTgxMiwgcTEwID0gOTM3CisgICAgInZsZDEuMzIgICAgIHtxOSwgcTEwfSwgWyVbY29lZmYzMl1dISAgICAgXG4iCisKKyAgICAvLyBsb2FkIGNvZWZmMzIgbG93IGhhbGYgaW50byBxMTE9MTIwMDAsIHExMj01MTAwMAorICAgICJ2bGQxLjMyICAgICB7cTExLHExMn0sIFslW2NvZWZmMzJdXSAgICAgIFxuIgorCisgICAgLy8gcGFydCAxCisgICAgLy8gVHJhbnNwb3NlLiBSZWdpc3RlciBkTiBpcyB0aGUgc2FtZSBhcyBkTiBpbiBDCisgICAgInZ0cm4uMzIgICAgICAgICBkMCwgZDIgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMzIgICAgICAgICBkMSwgZDMgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMTYgICAgICAgICBkMCwgZDEgICAgICAgICAgICAgICAgICAgXG4iCisgICAgInZ0cm4uMTYgICAgICAgICBkMiwgZDMgICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTAgPSBkMCArIGQzCisgICAgInZhZGQuczE2ICAgICAgICBkNSwgZDEsIGQyICAgICAgICAgICAgICAgXG4iIC8vIGExID0gZDEgKyBkMgorICAgICJ2c3ViLnMxNiAgICAgICAgZDYsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBhMiA9IGQxIC0gZDIKKyAgICAidnN1Yi5zMTYgICAgICAgIGQ3LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTMgPSBkMCAtIGQzCisKKyAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gYTAgKyBhMQorICAgICJ2c2hsLnMxNiAgICAgICAgZDAsIGQwLCAjMyAgICAgICAgICAgICAgIFxuIiAvLyB0ZW1wWzAraSo0XSA9IChhMCthMSkgPDwgMworICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBhMCAtIGExCisgICAgInZzaGwuczE2ICAgICAgICBkMiwgZDIsICMzICAgICAgICAgICAgICAgXG4iIC8vICh0ZW1wWzIraSo0XSA9IChhMC1hMSkgPDwgMworCisgICAgInZtbGFsLnMxNiAgICAgICBxOSwgZDcsIGQxNiAgICAgICAgICAgICAgXG4iIC8vIGEzKjUzNTIgKyAxODEyCisgICAgInZtbGFsLnMxNiAgICAgICBxMTAsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcKKyAgICAidm1sYWwuczE2ICAgICAgIHE5LCBkNiwgZDE3ICAgICAgICAgICAgICBcbiIgLy8gYTIqMjIxNyArIGEzKjUzNTIgKyAxODEyCisgICAgInZtbHNsLnMxNiAgICAgICBxMTAsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGEzKjIyMTcgKyA5MzcgLSBhMio1MzUyCisKKyAgICAvLyB0ZW1wWzEraSo0XSA9IChkMioyMjE3ICsgZDMqNTM1MiArIDE4MTIpID4+IDkKKyAgICAvLyB0ZW1wWzMraSo0XSA9IChkMyoyMjE3ICsgOTM3IC0gZDIqNTM1MikgPj4gOQorICAgICJ2c2hybi5zMzIgICAgICAgZDEsIHE5LCAjOSAgICAgICAgICAgICAgIFxuIgorICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMCwgIzkgICAgICAgICAgICAgIFxuIgorCisgICAgLy8gcGFydCAyCisgICAgLy8gdHJhbnNwb3NlIGQwPWlwWzBdLCBkMT1pcFs0XSwgZDI9aXBbOF0sIGQzPWlwWzEyXQorICAgICJ2dHJuLjMyICAgICAgICAgZDAsIGQyICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjMyICAgICAgICAgZDEsIGQzICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjE2ICAgICAgICAgZDAsIGQxICAgICAgICAgICAgICAgICAgIFxuIgorICAgICJ2dHJuLjE2ICAgICAgICAgZDIsIGQzICAgICAgICAgICAgICAgICAgIFxuIgorCisgICAgInZtb3YuczE2ICAgICAgICBkMjYsICM3ICAgICAgICAgICAgICAgICAgXG4iCisKKyAgICAidmFkZC5zMTYgICAgICAgIGQ0LCBkMCwgZDMgICAgICAgICAgICAgICBcbiIgLy8gYTEgPSBpcFswXSArIGlwWzEyXQorICAgICJ2YWRkLnMxNiAgICAgICAgZDUsIGQxLCBkMiAgICAgICAgICAgICAgIFxuIiAvLyBiMSA9IGlwWzRdICsgaXBbOF0KKyAgICAidnN1Yi5zMTYgICAgICAgIGQ2LCBkMSwgZDIgICAgICAgICAgICAgICBcbiIgLy8gYzEgPSBpcFs0XSAtIGlwWzhdCisgICAgInZhZGQuczE2ICAgICAgICBkNCwgZDQsIGQyNiAgICAgICAgICAgICAgXG4iIC8vIGExICsgNworICAgICJ2c3ViLnMxNiAgICAgICAgZDcsIGQwLCBkMyAgICAgICAgICAgICAgIFxuIiAvLyBkMSA9IGlwWzBdIC0gaXBbMTJdCisKKyAgICAidmFkZC5zMTYgICAgICAgIGQwLCBkNCwgZDUgICAgICAgICAgICAgICBcbiIgLy8gb3BbMF0gPSBhMSArIGIxICsgNworICAgICJ2c3ViLnMxNiAgICAgICAgZDIsIGQ0LCBkNSAgICAgICAgICAgICAgIFxuIiAvLyBvcFs4XSA9IGExIC0gYjEgKyA3CisKKyAgICAidm1sYWwuczE2ICAgICAgIHExMSwgZDcsIGQxNiAgICAgICAgICAgICBcbiIgLy8gZDEqNTM1MiArIDEyMDAwCisgICAgInZtbGFsLnMxNiAgICAgICBxMTIsIGQ3LCBkMTcgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgKyA1MTAwMAorCisgICAgInZjZXEuczE2ICAgICAgICBkNCwgZDcsICMwICAgICAgICAgICAgICAgXG4iCisKKyAgICAidnNoci5zMTYgICAgICAgIGQwLCBkMCwgIzQgICAgICAgICAgICAgICBcbiIKKyAgICAidnNoci5zMTYgICAgICAgIGQyLCBkMiwgIzQgICAgICAgICAgICAgICBcbiIKKworICAgICJ2bWxhbC5zMTYgICAgICAgcTExLCBkNiwgZDE3ICAgICAgICAgICAgIFxuIiAvLyBjMSoyMjE3ICsgZDEqNTM1MiArIDEyMDAwCisgICAgInZtbHNsLnMxNiAgICAgICBxMTIsIGQ2LCBkMTYgICAgICAgICAgICAgXG4iIC8vIGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDAKKworICAgICJ2bXZuICAgICAgICAgICAgZDQsIGQ0ICAgICAgICAgICAgICAgICAgIFxuIiAvLyAhKGQxID09IDApCisgICAgLy8gb3BbNF0gPSAoYzEqMjIxNyArIGQxKjUzNTIgKyAxMjAwMCk+PjE2CisgICAgInZzaHJuLnMzMiAgICAgICBkMSwgcTExLCAjMTYgICAgICAgICAgICAgXG4iCisgICAgLy8gb3BbNF0gKz0gKGQxIT0wKQorICAgICJ2c3ViLnMxNiAgICAgICAgZDEsIGQxLCBkNCAgICAgICAgICAgICAgIFxuIgorICAgIC8vIG9wWzEyXT0gKGQxKjIyMTcgLSBjMSo1MzUyICsgNTEwMDApPj4xNgorICAgICJ2c2hybi5zMzIgICAgICAgZDMsIHExMiwgIzE2ICAgICAgICAgICAgIFxuIgorCisgICAgLy8gc2V0IHJlc3VsdCB0byBvdXQgYXJyYXkKKyAgICAidnN0MS4xNiAgICAgICAgIHtxMCwgcTF9LCBbJVtvdXRdXSAgIFxuIgorICAgIDogW3NyY19wdHJdICIrciIoc3JjX3B0ciksIFtyZWZfcHRyXSAiK3IiKHJlZl9wdHIpLAorICAgICAgW2NvZWZmMzJdICIrciIoY29lZmYzMikgICAgICAgICAgLy8gbW9kaWZpZWQgcmVnaXN0ZXJzCisgICAgOiBba0JQU10gInIiKGtCUFMpLCBbY29lZmYxNl0gInIiKGNvZWZmMTYpLAorICAgICAgW291dF0gInIiKG91dCkgICAgICAgICAgICAgICAgICAgLy8gY29uc3RhbnRzCisgICAgOiAibWVtb3J5IiwgInEwIiwgInExIiwgInEyIiwgInEzIiwgInE0IiwgInE1IiwgInE2IiwgInE3IiwgInE4IiwgInE5IiwKKyAgICAgICJxMTAiLCAicTExIiwgInExMiIsICJxMTMiICAgICAgIC8vIGNsb2JiZXJlZAorICApOworfQorCisjZW5kaWYKKworI2RlZmluZSBMT0FEX0xBTkVfMTZiKFZBTFVFLCBMQU5FKSBkbyB7ICAgICAgICAgICAgIFwKKyAgKFZBTFVFKSA9IHZsZDFfbGFuZV9zMTYoc3JjLCAoVkFMVUUpLCAoTEFORSkpOyAgICBcCisgIHNyYyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybVdIVF9ORU9OKGNvbnN0IGludDE2X3QqIHNyYywgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IGludCBzdHJpZGUgPSAxNjsKKyAgY29uc3QgaW50MTZ4NF90IHplcm8gPSB2ZHVwX25fczE2KDApOworICBpbnQzMng0eDRfdCB0bXAwOworICBpbnQxNng0eDRfdCBpbjsKKyAgSU5JVF9WRUNUT1I0KGluLCB6ZXJvLCB6ZXJvLCB6ZXJvLCB6ZXJvKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMF0sIDApOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsxXSwgMCk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzJdLCAwKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbM10sIDApOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFswXSwgMSk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzFdLCAxKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMl0sIDEpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFszXSwgMSk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzBdLCAyKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMV0sIDIpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsyXSwgMik7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzNdLCAyKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbMF0sIDMpOworICBMT0FEX0xBTkVfMTZiKGluLnZhbFsxXSwgMyk7CisgIExPQURfTEFORV8xNmIoaW4udmFsWzJdLCAzKTsKKyAgTE9BRF9MQU5FXzE2Yihpbi52YWxbM10sIDMpOworCisgIHsKKyAgICAvLyBhMCA9IGluWzAgKiAxNl0gKyBpblsyICogMTZdCisgICAgLy8gYTEgPSBpblsxICogMTZdICsgaW5bMyAqIDE2XQorICAgIC8vIGEyID0gaW5bMSAqIDE2XSAtIGluWzMgKiAxNl0KKyAgICAvLyBhMyA9IGluWzAgKiAxNl0gLSBpblsyICogMTZdCisgICAgY29uc3QgaW50MzJ4NF90IGEwID0gdmFkZGxfczE2KGluLnZhbFswXSwgaW4udmFsWzJdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTEgPSB2YWRkbF9zMTYoaW4udmFsWzFdLCBpbi52YWxbM10pOworICAgIGNvbnN0IGludDMyeDRfdCBhMiA9IHZzdWJsX3MxNihpbi52YWxbMV0sIGluLnZhbFszXSk7CisgICAgY29uc3QgaW50MzJ4NF90IGEzID0gdnN1YmxfczE2KGluLnZhbFswXSwgaW4udmFsWzJdKTsKKyAgICB0bXAwLnZhbFswXSA9IHZhZGRxX3MzMihhMCwgYTEpOworICAgIHRtcDAudmFsWzFdID0gdmFkZHFfczMyKGEzLCBhMik7CisgICAgdG1wMC52YWxbMl0gPSB2c3VicV9zMzIoYTMsIGEyKTsKKyAgICB0bXAwLnZhbFszXSA9IHZzdWJxX3MzMihhMCwgYTEpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQzMng0eDRfdCB0bXAxID0gVHJhbnNwb3NlNHg0X05FT04odG1wMCk7CisgICAgLy8gYTAgPSB0bXBbMCArIGldICsgdG1wWyA4ICsgaV0KKyAgICAvLyBhMSA9IHRtcFs0ICsgaV0gKyB0bXBbMTIgKyBpXQorICAgIC8vIGEyID0gdG1wWzQgKyBpXSAtIHRtcFsxMiArIGldCisgICAgLy8gYTMgPSB0bXBbMCArIGldIC0gdG1wWyA4ICsgaV0KKyAgICBjb25zdCBpbnQzMng0X3QgYTAgPSB2YWRkcV9zMzIodG1wMS52YWxbMF0sIHRtcDEudmFsWzJdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTEgPSB2YWRkcV9zMzIodG1wMS52YWxbMV0sIHRtcDEudmFsWzNdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTIgPSB2c3VicV9zMzIodG1wMS52YWxbMV0sIHRtcDEudmFsWzNdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYTMgPSB2c3VicV9zMzIodG1wMS52YWxbMF0sIHRtcDEudmFsWzJdKTsKKyAgICBjb25zdCBpbnQzMng0X3QgYjAgPSB2aGFkZHFfczMyKGEwLCBhMSk7ICAvLyAoYTAgKyBhMSkgPj4gMQorICAgIGNvbnN0IGludDMyeDRfdCBiMSA9IHZoYWRkcV9zMzIoYTMsIGEyKTsgIC8vIChhMyArIGEyKSA+PiAxCisgICAgY29uc3QgaW50MzJ4NF90IGIyID0gdmhzdWJxX3MzMihhMywgYTIpOyAgLy8gKGEzIC0gYTIpID4+IDEKKyAgICBjb25zdCBpbnQzMng0X3QgYjMgPSB2aHN1YnFfczMyKGEwLCBhMSk7ICAvLyAoYTAgLSBhMSkgPj4gMQorICAgIGNvbnN0IGludDE2eDRfdCBvdXQwID0gdm1vdm5fczMyKGIwKTsKKyAgICBjb25zdCBpbnQxNng0X3Qgb3V0MSA9IHZtb3ZuX3MzMihiMSk7CisgICAgY29uc3QgaW50MTZ4NF90IG91dDIgPSB2bW92bl9zMzIoYjIpOworICAgIGNvbnN0IGludDE2eDRfdCBvdXQzID0gdm1vdm5fczMyKGIzKTsKKworICAgIHZzdDFfczE2KG91dCArICAwLCBvdXQwKTsKKyAgICB2c3QxX3MxNihvdXQgKyAgNCwgb3V0MSk7CisgICAgdnN0MV9zMTYob3V0ICsgIDgsIG91dDIpOworICAgIHZzdDFfczE2KG91dCArIDEyLCBvdXQzKTsKKyAgfQorfQorI3VuZGVmIExPQURfTEFORV8xNmIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHR1cmUgZGlzdG9ydGlvbgorLy8KKy8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAorLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgorCisvLyBhIDAxMjMsIGIgMDEyMworLy8gYSA0NTY3LCBiIDQ1NjcKKy8vIGEgODlhYiwgYiA4OWFiCisvLyBhIGNkZWYsIGIgY2RlZgorLy8KKy8vIHRyYW5zcG9zZQorLy8KKy8vIGEgMDQ4YywgYiAwNDhjCisvLyBhIDE1OWQsIGIgMTU5ZAorLy8gYSAyNmFlLCBiIDI2YWUKKy8vIGEgMzdiZiwgYiAzN2JmCisvLworc3RhdGljIFdFQlBfSU5MSU5FIGludDE2eDh4NF90IERpc3RvVHJhbnNwb3NlNHg0UzE2X05FT04oaW50MTZ4OHg0X3QgcTRfaW4pIHsKKyAgY29uc3QgaW50MTZ4OHgyX3QgcTJfdG1wMCA9IHZ0cm5xX3MxNihxNF9pbi52YWxbMF0sIHE0X2luLnZhbFsxXSk7CisgIGNvbnN0IGludDE2eDh4Ml90IHEyX3RtcDEgPSB2dHJucV9zMTYocTRfaW4udmFsWzJdLCBxNF9pbi52YWxbM10pOworICBjb25zdCBpbnQzMng0eDJfdCBxMl90bXAyID0gdnRybnFfczMyKHZyZWludGVycHJldHFfczMyX3MxNihxMl90bXAwLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zMzJfczE2KHEyX3RtcDEudmFsWzBdKSk7CisgIGNvbnN0IGludDMyeDR4Ml90IHEyX3RtcDMgPSB2dHJucV9zMzIodnJlaW50ZXJwcmV0cV9zMzJfczE2KHEyX3RtcDAudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3MzMl9zMTYocTJfdG1wMS52YWxbMV0pKTsKKyAgcTRfaW4udmFsWzBdID0gdnJlaW50ZXJwcmV0cV9zMTZfczMyKHEyX3RtcDIudmFsWzBdKTsKKyAgcTRfaW4udmFsWzJdID0gdnJlaW50ZXJwcmV0cV9zMTZfczMyKHEyX3RtcDIudmFsWzFdKTsKKyAgcTRfaW4udmFsWzFdID0gdnJlaW50ZXJwcmV0cV9zMTZfczMyKHEyX3RtcDMudmFsWzBdKTsKKyAgcTRfaW4udmFsWzNdID0gdnJlaW50ZXJwcmV0cV9zMTZfczMyKHEyX3RtcDMudmFsWzFdKTsKKyAgcmV0dXJuIHE0X2luOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OHg0X3QgRGlzdG9Ib3Jpem9udGFsUGFzc19ORU9OKAorICAgIGNvbnN0IGludDE2eDh4NF90IHE0X2luKSB7CisgIC8vIHthMCwgYTF9ID0ge2luWzBdICsgaW5bMl0sIGluWzFdICsgaW5bM119CisgIC8vIHthMywgYTJ9ID0ge2luWzBdIC0gaW5bMl0sIGluWzFdIC0gaW5bM119CisgIGNvbnN0IGludDE2eDhfdCBxX2EwID0gdmFkZHFfczE2KHE0X2luLnZhbFswXSwgcTRfaW4udmFsWzJdKTsKKyAgY29uc3QgaW50MTZ4OF90IHFfYTEgPSB2YWRkcV9zMTYocTRfaW4udmFsWzFdLCBxNF9pbi52YWxbM10pOworICBjb25zdCBpbnQxNng4X3QgcV9hMyA9IHZzdWJxX3MxNihxNF9pbi52YWxbMF0sIHE0X2luLnZhbFsyXSk7CisgIGNvbnN0IGludDE2eDhfdCBxX2EyID0gdnN1YnFfczE2KHE0X2luLnZhbFsxXSwgcTRfaW4udmFsWzNdKTsKKyAgaW50MTZ4OHg0X3QgcTRfb3V0OworICAvLyB0bXBbMF0gPSBhMCArIGExCisgIC8vIHRtcFsxXSA9IGEzICsgYTIKKyAgLy8gdG1wWzJdID0gYTMgLSBhMgorICAvLyB0bXBbM10gPSBhMCAtIGExCisgIElOSVRfVkVDVE9SNChxNF9vdXQsCisgICAgICAgICAgICAgICB2YWJzcV9zMTYodmFkZHFfczE2KHFfYTAsIHFfYTEpKSwKKyAgICAgICAgICAgICAgIHZhYnNxX3MxNih2YWRkcV9zMTYocV9hMywgcV9hMikpLAorICAgICAgICAgICAgICAgdmFiZHFfczE2KHFfYTMsIHFfYTIpLCB2YWJkcV9zMTYocV9hMCwgcV9hMSkpOworICByZXR1cm4gcTRfb3V0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4OHg0X3QgRGlzdG9WZXJ0aWNhbFBhc3NfTkVPTihjb25zdCB1aW50OHg4eDRfdCBxNF9pbikgeworICBjb25zdCBpbnQxNng4X3QgcV9hMCA9IHZyZWludGVycHJldHFfczE2X3UxNih2YWRkbF91OChxNF9pbi52YWxbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHE0X2luLnZhbFsyXSkpOworICBjb25zdCBpbnQxNng4X3QgcV9hMSA9IHZyZWludGVycHJldHFfczE2X3UxNih2YWRkbF91OChxNF9pbi52YWxbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHE0X2luLnZhbFszXSkpOworICBjb25zdCBpbnQxNng4X3QgcV9hMiA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OChxNF9pbi52YWxbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHE0X2luLnZhbFszXSkpOworICBjb25zdCBpbnQxNng4X3QgcV9hMyA9IHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OChxNF9pbi52YWxbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHE0X2luLnZhbFsyXSkpOworICBpbnQxNng4eDRfdCBxNF9vdXQ7CisKKyAgSU5JVF9WRUNUT1I0KHE0X291dCwKKyAgICAgICAgICAgICAgIHZhZGRxX3MxNihxX2EwLCBxX2ExKSwgdmFkZHFfczE2KHFfYTMsIHFfYTIpLAorICAgICAgICAgICAgICAgdnN1YnFfczE2KHFfYTMsIHFfYTIpLCB2c3VicV9zMTYocV9hMCwgcV9hMSkpOworICByZXR1cm4gcTRfb3V0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MTZ4NHg0X3QgRGlzdG9Mb2FkV19ORU9OKGNvbnN0IHVpbnQxNl90KiB3KSB7CisgIGNvbnN0IHVpbnQxNng4X3QgcV93MDcgPSB2bGQxcV91MTYoJndbMF0pOworICBjb25zdCB1aW50MTZ4OF90IHFfdzhmID0gdmxkMXFfdTE2KCZ3WzhdKTsKKyAgaW50MTZ4NHg0X3QgZDRfdzsKKyAgSU5JVF9WRUNUT1I0KGQ0X3csCisgICAgICAgICAgICAgICB2Z2V0X2xvd19zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KHFfdzA3KSksCisgICAgICAgICAgICAgICB2Z2V0X2hpZ2hfczE2KHZyZWludGVycHJldHFfczE2X3UxNihxX3cwNykpLAorICAgICAgICAgICAgICAgdmdldF9sb3dfczE2KHZyZWludGVycHJldHFfczE2X3UxNihxX3c4ZikpLAorICAgICAgICAgICAgICAgdmdldF9oaWdoX3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYocV93OGYpKSk7CisgIHJldHVybiBkNF93OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50MzJ4Ml90IERpc3RvU3VtX05FT04oY29uc3QgaW50MTZ4OHg0X3QgcTRfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZ4NHg0X3QgZDRfdykgeworICBpbnQzMngyX3QgZF9zdW07CisgIC8vIHN1bSArPSB3WyAwXSAqIGFicyhiMCk7CisgIC8vIHN1bSArPSB3WyA0XSAqIGFicyhiMSk7CisgIC8vIHN1bSArPSB3WyA4XSAqIGFicyhiMik7CisgIC8vIHN1bSArPSB3WzEyXSAqIGFicyhiMyk7CisgIGludDMyeDRfdCBxX3N1bTAgPSB2bXVsbF9zMTYoZDRfdy52YWxbMF0sIHZnZXRfbG93X3MxNihxNF9pbi52YWxbMF0pKTsKKyAgaW50MzJ4NF90IHFfc3VtMSA9IHZtdWxsX3MxNihkNF93LnZhbFsxXSwgdmdldF9sb3dfczE2KHE0X2luLnZhbFsxXSkpOworICBpbnQzMng0X3QgcV9zdW0yID0gdm11bGxfczE2KGQ0X3cudmFsWzJdLCB2Z2V0X2xvd19zMTYocTRfaW4udmFsWzJdKSk7CisgIGludDMyeDRfdCBxX3N1bTMgPSB2bXVsbF9zMTYoZDRfdy52YWxbM10sIHZnZXRfbG93X3MxNihxNF9pbi52YWxbM10pKTsKKyAgcV9zdW0wID0gdm1sc2xfczE2KHFfc3VtMCwgZDRfdy52YWxbMF0sIHZnZXRfaGlnaF9zMTYocTRfaW4udmFsWzBdKSk7CisgIHFfc3VtMSA9IHZtbHNsX3MxNihxX3N1bTEsIGQ0X3cudmFsWzFdLCB2Z2V0X2hpZ2hfczE2KHE0X2luLnZhbFsxXSkpOworICBxX3N1bTIgPSB2bWxzbF9zMTYocV9zdW0yLCBkNF93LnZhbFsyXSwgdmdldF9oaWdoX3MxNihxNF9pbi52YWxbMl0pKTsKKyAgcV9zdW0zID0gdm1sc2xfczE2KHFfc3VtMywgZDRfdy52YWxbM10sIHZnZXRfaGlnaF9zMTYocTRfaW4udmFsWzNdKSk7CisKKyAgcV9zdW0wID0gdmFkZHFfczMyKHFfc3VtMCwgcV9zdW0xKTsKKyAgcV9zdW0yID0gdmFkZHFfczMyKHFfc3VtMiwgcV9zdW0zKTsKKyAgcV9zdW0yID0gdmFkZHFfczMyKHFfc3VtMCwgcV9zdW0yKTsKKyAgZF9zdW0gPSB2cGFkZF9zMzIodmdldF9sb3dfczMyKHFfc3VtMiksIHZnZXRfaGlnaF9zMzIocV9zdW0yKSk7CisgIGRfc3VtID0gdnBhZGRfczMyKGRfc3VtLCBkX3N1bSk7CisgIHJldHVybiBkX3N1bTsKK30KKworI2RlZmluZSBMT0FEX0xBTkVfMzJiKHNyYywgVkFMVUUsIExBTkUpIFwKKyAgICAoVkFMVUUpID0gdmxkMV9sYW5lX3UzMigoY29uc3QgdWludDMyX3QqKShzcmMpLCAoVkFMVUUpLCAoTEFORSkpCisKKy8vIEhhZGFtYXJkIHRyYW5zZm9ybQorLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCisvLyB3W10gY29udGFpbnMgYSByb3ctbWFqb3IgNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitzdGF0aWMgaW50IERpc3RvNHg0X05FT04oY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICB1aW50MzJ4Ml90IGRfaW5fYWJfMDEyMyA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQzMngyX3QgZF9pbl9hYl80NTY3ID0gdmR1cF9uX3UzMigwKTsKKyAgdWludDMyeDJfdCBkX2luX2FiXzg5YWIgPSB2ZHVwX25fdTMyKDApOworICB1aW50MzJ4Ml90IGRfaW5fYWJfY2RlZiA9IHZkdXBfbl91MzIoMCk7CisgIHVpbnQ4eDh4NF90IGQ0X2luOworCisgIC8vIGxvYWQgZGF0YSBhLCBiCisgIExPQURfTEFORV8zMmIoYSArIDAgKiBCUFMsIGRfaW5fYWJfMDEyMywgMCk7CisgIExPQURfTEFORV8zMmIoYSArIDEgKiBCUFMsIGRfaW5fYWJfNDU2NywgMCk7CisgIExPQURfTEFORV8zMmIoYSArIDIgKiBCUFMsIGRfaW5fYWJfODlhYiwgMCk7CisgIExPQURfTEFORV8zMmIoYSArIDMgKiBCUFMsIGRfaW5fYWJfY2RlZiwgMCk7CisgIExPQURfTEFORV8zMmIoYiArIDAgKiBCUFMsIGRfaW5fYWJfMDEyMywgMSk7CisgIExPQURfTEFORV8zMmIoYiArIDEgKiBCUFMsIGRfaW5fYWJfNDU2NywgMSk7CisgIExPQURfTEFORV8zMmIoYiArIDIgKiBCUFMsIGRfaW5fYWJfODlhYiwgMSk7CisgIExPQURfTEFORV8zMmIoYiArIDMgKiBCUFMsIGRfaW5fYWJfY2RlZiwgMSk7CisgIElOSVRfVkVDVE9SNChkNF9pbiwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF91MzIoZF9pbl9hYl8wMTIzKSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF91MzIoZF9pbl9hYl80NTY3KSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF91MzIoZF9pbl9hYl84OWFiKSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF91MzIoZF9pbl9hYl9jZGVmKSk7CisKKyAgeworICAgIC8vIFZlcnRpY2FsIHBhc3MgZmlyc3QgdG8gYXZvaWQgYSB0cmFuc3Bvc2UgKHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIHBhc3NlcworICAgIC8vIGFyZSBjb21tdXRhdGl2ZSBiZWNhdXNlIHcva1dlaWdodFkgaXMgc3ltbWV0cmljKSBhbmQgc3Vic2VxdWVudAorICAgIC8vIHRyYW5zcG9zZS4KKyAgICBjb25zdCBpbnQxNng4eDRfdCBxNF92ID0gRGlzdG9WZXJ0aWNhbFBhc3NfTkVPTihkNF9pbik7CisgICAgY29uc3QgaW50MTZ4NHg0X3QgZDRfdyA9IERpc3RvTG9hZFdfTkVPTih3KTsKKyAgICAvLyBob3Jpem9udGFsIHBhc3MKKyAgICBjb25zdCBpbnQxNng4eDRfdCBxNF90ID0gRGlzdG9UcmFuc3Bvc2U0eDRTMTZfTkVPTihxNF92KTsKKyAgICBjb25zdCBpbnQxNng4eDRfdCBxNF9oID0gRGlzdG9Ib3Jpem9udGFsUGFzc19ORU9OKHE0X3QpOworICAgIGludDMyeDJfdCBkX3N1bSA9IERpc3RvU3VtX05FT04ocTRfaCwgZDRfdyk7CisKKyAgICAvLyBhYnMoc3VtMiAtIHN1bTEpID4+IDUKKyAgICBkX3N1bSA9IHZhYnNfczMyKGRfc3VtKTsKKyAgICBkX3N1bSA9IHZzaHJfbl9zMzIoZF9zdW0sIDUpOworICAgIHJldHVybiB2Z2V0X2xhbmVfczMyKGRfc3VtLCAwKTsKKyAgfQorfQorI3VuZGVmIExPQURfTEFORV8zMmIKKworc3RhdGljIGludCBEaXN0bzE2eDE2X05FT04oY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCB3KSB7CisgIGludCBEID0gMDsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCAxNiAqIEJQUzsgeSArPSA0ICogQlBTKSB7CisgICAgZm9yICh4ID0gMDsgeCA8IDE2OyB4ICs9IDQpIHsKKyAgICAgIEQgKz0gRGlzdG80eDRfTkVPTihhICsgeCArIHksIGIgKyB4ICsgeSwgdyk7CisgICAgfQorICB9CisgIHJldHVybiBEOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBDb2xsZWN0SGlzdG9ncmFtX05FT04oY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9ibG9jaywgaW50IGVuZF9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhIaXN0b2dyYW0qIGNvbnN0IGhpc3RvKSB7CisgIGNvbnN0IHVpbnQxNng4X3QgbWF4X2NvZWZmX3RocmVzaCA9IHZkdXBxX25fdTE2KE1BWF9DT0VGRl9USFJFU0gpOworICBpbnQgajsKKyAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV0gPSB7IDAgfTsKKyAgZm9yIChqID0gc3RhcnRfYmxvY2s7IGogPCBlbmRfYmxvY2s7ICsraikgeworICAgIGludDE2X3Qgb3V0WzE2XTsKKyAgICBGVHJhbnNmb3JtX05FT04ocmVmICsgVlA4RHNwU2NhbltqXSwgcHJlZCArIFZQOERzcFNjYW5bal0sIG91dCk7CisgICAgeworICAgICAgaW50IGs7CisgICAgICBjb25zdCBpbnQxNng4X3QgYTAgPSB2bGQxcV9zMTYob3V0ICsgMCk7CisgICAgICBjb25zdCBpbnQxNng4X3QgYjAgPSB2bGQxcV9zMTYob3V0ICsgOCk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGExID0gdnJlaW50ZXJwcmV0cV91MTZfczE2KHZhYnNxX3MxNihhMCkpOworICAgICAgY29uc3QgdWludDE2eDhfdCBiMSA9IHZyZWludGVycHJldHFfdTE2X3MxNih2YWJzcV9zMTYoYjApKTsKKyAgICAgIGNvbnN0IHVpbnQxNng4X3QgYTIgPSB2c2hycV9uX3UxNihhMSwgMyk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGIyID0gdnNocnFfbl91MTYoYjEsIDMpOworICAgICAgY29uc3QgdWludDE2eDhfdCBhMyA9IHZtaW5xX3UxNihhMiwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICBjb25zdCB1aW50MTZ4OF90IGIzID0gdm1pbnFfdTE2KGIyLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIHZzdDFxX3MxNihvdXQgKyAwLCB2cmVpbnRlcnByZXRxX3MxNl91MTYoYTMpKTsKKyAgICAgIHZzdDFxX3MxNihvdXQgKyA4LCB2cmVpbnRlcnByZXRxX3MxNl91MTYoYjMpKTsKKyAgICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICAgICsrZGlzdHJpYnV0aW9uW291dFtrXV07CisgICAgICB9CisgICAgfQorICB9CisgIFZQOFNldEhpc3RvZ3JhbURhdGEoZGlzdHJpYnV0aW9uLCBoaXN0byk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFjY3VtdWxhdGVTU0UxNl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyeDRfdCogY29uc3Qgc3VtKSB7CisgIGNvbnN0IHVpbnQ4eDE2X3QgYTAgPSB2bGQxcV91OChhKTsKKyAgY29uc3QgdWludDh4MTZfdCBiMCA9IHZsZDFxX3U4KGIpOworICBjb25zdCB1aW50OHgxNl90IGFic19kaWZmID0gdmFiZHFfdTgoYTAsIGIwKTsKKyAgY29uc3QgdWludDE2eDhfdCBwcm9kMSA9IHZtdWxsX3U4KHZnZXRfbG93X3U4KGFic19kaWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfbG93X3U4KGFic19kaWZmKSk7CisgIGNvbnN0IHVpbnQxNng4X3QgcHJvZDIgPSB2bXVsbF91OCh2Z2V0X2hpZ2hfdTgoYWJzX2RpZmYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmdldF9oaWdoX3U4KGFic19kaWZmKSk7CisgIC8qIHBhaXItd2lzZSBhZGRzIGFuZCB3aWRlbiAqLworICBjb25zdCB1aW50MzJ4NF90IHN1bTEgPSB2cGFkZGxxX3UxNihwcm9kMSk7CisgIGNvbnN0IHVpbnQzMng0X3Qgc3VtMiA9IHZwYWRkbHFfdTE2KHByb2QyKTsKKyAgKnN1bSA9IHZhZGRxX3UzMigqc3VtLCB2YWRkcV91MzIoc3VtMSwgc3VtMikpOworfQorCisvLyBIb3Jpem9udGFsIHN1bSBvZiBhbGwgZm91ciB1aW50MzJfdCB2YWx1ZXMgaW4gJ3N1bScuCitzdGF0aWMgaW50IFN1bVRvSW50X05FT04odWludDMyeDRfdCBzdW0pIHsKKyAgY29uc3QgdWludDY0eDJfdCBzdW0yID0gdnBhZGRscV91MzIoc3VtKTsKKyAgY29uc3QgdWludDY0X3Qgc3VtMyA9IHZnZXRxX2xhbmVfdTY0KHN1bTIsIDApICsgdmdldHFfbGFuZV91NjQoc3VtMiwgMSk7CisgIHJldHVybiAoaW50KXN1bTM7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4MTZfTkVPTihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMng0X3Qgc3VtID0gdmR1cHFfbl91MzIoMCk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTY7ICsreSkgeworICAgIEFjY3VtdWxhdGVTU0UxNl9ORU9OKGEgKyB5ICogQlBTLCBiICsgeSAqIEJQUywgJnN1bSk7CisgIH0KKyAgcmV0dXJuIFN1bVRvSW50X05FT04oc3VtKTsKK30KKworc3RhdGljIGludCBTU0UxNng4X05FT04oY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICB1aW50MzJ4NF90IHN1bSA9IHZkdXBxX25fdTMyKDApOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDg7ICsreSkgeworICAgIEFjY3VtdWxhdGVTU0UxNl9ORU9OKGEgKyB5ICogQlBTLCBiICsgeSAqIEJQUywgJnN1bSk7CisgIH0KKyAgcmV0dXJuIFN1bVRvSW50X05FT04oc3VtKTsKK30KKworc3RhdGljIGludCBTU0U4eDhfTkVPTihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIHVpbnQzMng0X3Qgc3VtID0gdmR1cHFfbl91MzIoMCk7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgODsgKyt5KSB7CisgICAgY29uc3QgdWludDh4OF90IGEwID0gdmxkMV91OChhICsgeSAqIEJQUyk7CisgICAgY29uc3QgdWludDh4OF90IGIwID0gdmxkMV91OChiICsgeSAqIEJQUyk7CisgICAgY29uc3QgdWludDh4OF90IGFic19kaWZmID0gdmFiZF91OChhMCwgYjApOworICAgIGNvbnN0IHVpbnQxNng4X3QgcHJvZCA9IHZtdWxsX3U4KGFic19kaWZmLCBhYnNfZGlmZik7CisgICAgc3VtID0gdnBhZGFscV91MTYoc3VtLCBwcm9kKTsKKyAgfQorICByZXR1cm4gU3VtVG9JbnRfTkVPTihzdW0pOworfQorCitzdGF0aWMgaW50IFNTRTR4NF9ORU9OKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgY29uc3QgdWludDh4MTZfdCBhMCA9IExvYWQ0eDRfTkVPTihhKTsKKyAgY29uc3QgdWludDh4MTZfdCBiMCA9IExvYWQ0eDRfTkVPTihiKTsKKyAgY29uc3QgdWludDh4MTZfdCBhYnNfZGlmZiA9IHZhYmRxX3U4KGEwLCBiMCk7CisgIGNvbnN0IHVpbnQxNng4X3QgcHJvZDEgPSB2bXVsbF91OCh2Z2V0X2xvd191OChhYnNfZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2Z2V0X2xvd191OChhYnNfZGlmZikpOworICBjb25zdCB1aW50MTZ4OF90IHByb2QyID0gdm11bGxfdTgodmdldF9oaWdoX3U4KGFic19kaWZmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnZXRfaGlnaF91OChhYnNfZGlmZikpOworICAvKiBwYWlyLXdpc2UgYWRkcyBhbmQgd2lkZW4gKi8KKyAgY29uc3QgdWludDMyeDRfdCBzdW0xID0gdnBhZGRscV91MTYocHJvZDEpOworICBjb25zdCB1aW50MzJ4NF90IHN1bTIgPSB2cGFkZGxxX3UxNihwcm9kMik7CisgIHJldHVybiBTdW1Ub0ludF9ORU9OKHZhZGRxX3UzMihzdW0xLCBzdW0yKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIENvbXBpbGF0aW9uIHdpdGggZ2NjLTQuNi54IGlzIHByb2JsZW1hdGljIGZvciBub3cuCisjaWYgIWRlZmluZWQoV09SS19BUk9VTkRfR0NDKQorCitzdGF0aWMgaW50MTZ4OF90IFF1YW50aXplX05FT04oaW50MTZfdCogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TWF0cml4KiBjb25zdCBtdHgsIGludCBvZmZzZXQpIHsKKyAgY29uc3QgdWludDE2eDhfdCBzaGFycCA9IHZsZDFxX3UxNigmbXR4LT5zaGFycGVuX1tvZmZzZXRdKTsKKyAgY29uc3QgdWludDE2eDhfdCBxID0gdmxkMXFfdTE2KCZtdHgtPnFfW29mZnNldF0pOworICBjb25zdCB1aW50MTZ4OF90IGlxID0gdmxkMXFfdTE2KCZtdHgtPmlxX1tvZmZzZXRdKTsKKyAgY29uc3QgdWludDMyeDRfdCBiaWFzMCA9IHZsZDFxX3UzMigmbXR4LT5iaWFzX1tvZmZzZXQgKyAwXSk7CisgIGNvbnN0IHVpbnQzMng0X3QgYmlhczEgPSB2bGQxcV91MzIoJm10eC0+Ymlhc19bb2Zmc2V0ICsgNF0pOworCisgIGNvbnN0IGludDE2eDhfdCBhID0gdmxkMXFfczE2KGluICsgb2Zmc2V0KTsgICAgICAgICAgICAgICAgLy8gaW4KKyAgY29uc3QgdWludDE2eDhfdCBiID0gdnJlaW50ZXJwcmV0cV91MTZfczE2KHZhYnNxX3MxNihhKSk7ICAvLyBjb2VmZiA9IGFicyhpbikKKyAgY29uc3QgaW50MTZ4OF90IHNpZ24gPSB2c2hycV9uX3MxNihhLCAxNSk7ICAgICAgICAgICAgICAgICAvLyBzaWduCisgIGNvbnN0IHVpbnQxNng4X3QgYyA9IHZhZGRxX3UxNihiLCBzaGFycCk7ICAgICAgICAgICAgICAgICAgLy8gKyBzaGFycGVuCisgIGNvbnN0IHVpbnQzMng0X3QgbTAgPSB2bXVsbF91MTYodmdldF9sb3dfdTE2KGMpLCB2Z2V0X2xvd191MTYoaXEpKTsKKyAgY29uc3QgdWludDMyeDRfdCBtMSA9IHZtdWxsX3UxNih2Z2V0X2hpZ2hfdTE2KGMpLCB2Z2V0X2hpZ2hfdTE2KGlxKSk7CisgIGNvbnN0IHVpbnQzMng0X3QgbTIgPSB2aGFkZHFfdTMyKG0wLCBiaWFzMCk7CisgIGNvbnN0IHVpbnQzMng0X3QgbTMgPSB2aGFkZHFfdTMyKG0xLCBiaWFzMSk7ICAgICAvLyAoY29lZmYgKiBpUSArIGJpYXMpID4+IDEKKyAgY29uc3QgdWludDE2eDhfdCBjMCA9IHZjb21iaW5lX3UxNih2c2hybl9uX3UzMihtMiwgMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzaHJuX25fdTMyKG0zLCAxNikpOyAgIC8vIFFGSVg9MTcgPSAxNisxCisgIGNvbnN0IHVpbnQxNng4X3QgYzEgPSB2bWlucV91MTYoYzAsIHZkdXBxX25fdTE2KE1BWF9MRVZFTCkpOworICBjb25zdCBpbnQxNng4X3QgYzIgPSB2ZW9ycV9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTE2KGMxKSwgc2lnbik7CisgIGNvbnN0IGludDE2eDhfdCBjMyA9IHZzdWJxX3MxNihjMiwgc2lnbik7ICAgICAgICAgICAgICAgICAgLy8gcmVzdG9yZSBzaWduCisgIGNvbnN0IGludDE2eDhfdCBjNCA9IHZtdWxxX3MxNihjMywgdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHEpKTsKKyAgdnN0MXFfczE2KGluICsgb2Zmc2V0LCBjNCk7CisgIGFzc2VydChRRklYID09IDE3KTsgIC8vIHRoaXMgZnVuY3Rpb24gY2FuJ3Qgd29yayBhcyBpcyBpZiBRRklYICE9IDE2KzEKKyAgcmV0dXJuIGMzOworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrU2h1ZmZsZXNbNF1bOF0gPSB7CisgIHsgMCwgICAxLCAgMiwgIDMsICA4LCAgOSwgMTYsIDE3IH0sCisgIHsgMTAsIDExLCAgNCwgIDUsICA2LCAgNywgMTIsIDEzIH0sCisgIHsgMTgsIDE5LCAyNCwgMjUsIDI2LCAyNywgMjAsIDIxIH0sCisgIHsgMTQsIDE1LCAyMiwgMjMsIDI4LCAyOSwgMzAsIDMxIH0KK307CisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19ORU9OKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBjb25zdCBpbnQxNng4X3Qgb3V0MCA9IFF1YW50aXplX05FT04oaW4sIG10eCwgMCk7CisgIGNvbnN0IGludDE2eDhfdCBvdXQxID0gUXVhbnRpemVfTkVPTihpbiwgbXR4LCA4KTsKKyAgdWludDh4OHg0X3Qgc2h1ZmZsZXM7CisgIC8vIHZ0Ymw/X3U4IGFyZSBtYXJrZWQgdW5hdmFpbGFibGUgZm9yIGlPUyBhcm02NCB3aXRoIFhjb2RlIDwgNi4zLCB1c2UKKyAgLy8gbm9uLXN0YW5kYXJkIHZlcnNpb25zIHRoZXJlLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAmJiBcCisgICAgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykgJiYgKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fPCA2MDIwMDM3KQorICB1aW50OHgxNngyX3QgYWxsX291dDsKKyAgSU5JVF9WRUNUT1IyKGFsbF9vdXQsIHZyZWludGVycHJldHFfdThfczE2KG91dDApLCB2cmVpbnRlcnByZXRxX3U4X3MxNihvdXQxKSk7CisgIElOSVRfVkVDVE9SNChzaHVmZmxlcywKKyAgICAgICAgICAgICAgIHZ0YmwycV91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1swXSkpLAorICAgICAgICAgICAgICAgdnRibDJxX3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzFdKSksCisgICAgICAgICAgICAgICB2dGJsMnFfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMl0pKSwKKyAgICAgICAgICAgICAgIHZ0YmwycV91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1szXSkpKTsKKyNlbHNlCisgIHVpbnQ4eDh4NF90IGFsbF9vdXQ7CisgIElOSVRfVkVDVE9SNChhbGxfb3V0LAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3MxNih2Z2V0X2xvd19zMTYob3V0MCkpLAorICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0X3U4X3MxNih2Z2V0X2hpZ2hfczE2KG91dDApKSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF9zMTYodmdldF9sb3dfczE2KG91dDEpKSwKKyAgICAgICAgICAgICAgIHZyZWludGVycHJldF91OF9zMTYodmdldF9oaWdoX3MxNihvdXQxKSkpOworICBJTklUX1ZFQ1RPUjQoc2h1ZmZsZXMsCisgICAgICAgICAgICAgICB2dGJsNF91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1swXSkpLAorICAgICAgICAgICAgICAgdnRibDRfdTgoYWxsX291dCwgdmxkMV91OChrU2h1ZmZsZXNbMV0pKSwKKyAgICAgICAgICAgICAgIHZ0Ymw0X3U4KGFsbF9vdXQsIHZsZDFfdTgoa1NodWZmbGVzWzJdKSksCisgICAgICAgICAgICAgICB2dGJsNF91OChhbGxfb3V0LCB2bGQxX3U4KGtTaHVmZmxlc1szXSkpKTsKKyNlbmRpZgorICAvLyBaaWd6YWcgcmVvcmRlcmluZworICB2c3QxX3U4KCh1aW50OF90Kikob3V0ICsgIDApLCBzaHVmZmxlcy52YWxbMF0pOworICB2c3QxX3U4KCh1aW50OF90Kikob3V0ICsgIDQpLCBzaHVmZmxlcy52YWxbMV0pOworICB2c3QxX3U4KCh1aW50OF90Kikob3V0ICsgIDgpLCBzaHVmZmxlcy52YWxbMl0pOworICB2c3QxX3U4KCh1aW50OF90Kikob3V0ICsgMTIpLCBzaHVmZmxlcy52YWxbM10pOworICAvLyB0ZXN0IHplcm9zCisgIGlmICgqKHVpbnQ2NF90Kikob3V0ICsgIDApICE9IDApIHJldHVybiAxOworICBpZiAoKih1aW50NjRfdCopKG91dCArICA0KSAhPSAwKSByZXR1cm4gMTsKKyAgaWYgKCoodWludDY0X3QqKShvdXQgKyAgOCkgIT0gMCkgcmV0dXJuIDE7CisgIGlmICgqKHVpbnQ2NF90Kikob3V0ICsgMTIpICE9IDApIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfTkVPTihpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIG56ICA9IFF1YW50aXplQmxvY2tfTkVPTihpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBtdHgpIDw8IDA7CisgIG56IHw9IFF1YW50aXplQmxvY2tfTkVPTihpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworI2VuZGlmICAgLy8gIVdPUktfQVJPVU5EX0dDQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4RW5jRHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0TkVPTih2b2lkKSB7CisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX05FT047CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX05FT047CisKKyAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRfTkVPTjsKKworICBWUDhURGlzdG80eDQgPSBEaXN0bzR4NF9ORU9OOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfTkVPTjsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fTkVPTjsKKworICBWUDhTU0UxNngxNiA9IFNTRTE2eDE2X05FT047CisgIFZQOFNTRTE2eDggPSBTU0UxNng4X05FT047CisgIFZQOFNTRTh4OCA9IFNTRTh4OF9ORU9OOworICBWUDhTU0U0eDQgPSBTU0U0eDRfTkVPTjsKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfTkVPTjsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX05FT047CisjZW5kaWYKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhFbmNEc3BJbml0TkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2VuY19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQxNGY3NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTIuYwpAQCAtMCwwICsxLDEzODcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2Ygc3BlZWQtY3JpdGljYWwgZW5jb2RpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogQ2hyaXN0aWFuIER1dml2aWVyIChjZHV2aXZpZXJAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gZm9yIGFicygpCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtcyAoUGFyYWdyYXBoIDE0LjQpCisKKy8vIERvZXMgb25lIG9yIHR3byBpbnZlcnNlIHRyYW5zZm9ybXMuCitzdGF0aWMgdm9pZCBJVHJhbnNmb3JtX1NTRTIoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCBpbnQxNl90KiBpbiwgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb190d28pIHsKKyAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBtYWtlcyB1c2Ugb2YgMTYtYml0IGZpeGVkIHBvaW50IHZlcnNpb25zIG9mIHR3bworICAvLyBtdWx0aXBseSBjb25zdGFudHM6CisgIC8vICAgIEsxID0gc3FydCgyKSAqIGNvcyAocGkvOCkgfj0gODU2MjcgLyAyXjE2CisgIC8vICAgIEsyID0gc3FydCgyKSAqIHNpbiAocGkvOCkgfj0gMzU0NjggLyAyXjE2CisgIC8vCisgIC8vIFRvIGJlIGFibGUgdG8gdXNlIHNpZ25lZCAxNi1iaXQgaW50ZWdlcnMsIHdlIHVzZSB0aGUgZm9sbG93aW5nIHRyaWNrIHRvCisgIC8vIGhhdmUgY29uc3RhbnRzIHdpdGhpbiByYW5nZToKKyAgLy8gLSBBc3NvY2lhdGVkIGNvbnN0YW50cyBhcmUgb2J0YWluZWQgYnkgc3VidHJhY3RpbmcgdGhlIDE2LWJpdCBmaXhlZCBwb2ludAorICAvLyAgIHZlcnNpb24gb2Ygb25lOgorICAvLyAgICAgIGsgPSBLIC0gKDEgPDwgMTYpICA9PiAgSyA9IGsgKyAoMSA8PCAxNikKKyAgLy8gICAgICBLMSA9IDg1MjY3ICA9PiAgazEgPSAgMjAwOTEKKyAgLy8gICAgICBLMiA9IDM1NDY4ICA9PiAgazIgPSAtMzAwNjgKKyAgLy8gLSBUaGUgbXVsdGlwbGljYXRpb24gb2YgYSB2YXJpYWJsZSBieSBhIGNvbnN0YW50IGJlY29tZSB0aGUgc3VtIG9mIHRoZQorICAvLyAgIHZhcmlhYmxlIGFuZCB0aGUgbXVsdGlwbGljYXRpb24gb2YgdGhhdCB2YXJpYWJsZSBieSB0aGUgYXNzb2NpYXRlZAorICAvLyAgIGNvbnN0YW50OgorICAvLyAgICAgICh4ICogSykgPj4gMTYgPSAoeCAqIChrICsgKDEgPDwgMTYpKSkgPj4gMTYgPSAoKHggKiBrICkgPj4gMTYpICsgeAorICBjb25zdCBfX20xMjhpIGsxID0gX21tX3NldDFfZXBpMTYoMjAwOTEpOworICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoLTMwMDY4KTsKKyAgX19tMTI4aSBUMCwgVDEsIFQyLCBUMzsKKworICAvLyBMb2FkIGFuZCBjb25jYXRlbmF0ZSB0aGUgdHJhbnNmb3JtIGNvZWZmaWNpZW50cyAod2UnbGwgZG8gdHdvIGludmVyc2UKKyAgLy8gdHJhbnNmb3JtcyBpbiBwYXJhbGxlbCkuIEluIHRoZSBjYXNlIG9mIG9ubHkgb25lIGludmVyc2UgdHJhbnNmb3JtLCB0aGUKKyAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIHZlY3RvcnMgd2lsbCBqdXN0IGNvbnRhaW4gcmFuZG9tIHZhbHVlIHdlJ2xsIG5ldmVyCisgIC8vIHVzZSBub3Igc3RvcmUuCisgIF9fbTEyOGkgaW4wLCBpbjEsIGluMiwgaW4zOworICB7CisgICAgaW4wID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMF0pOworICAgIGluMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzRdKTsKKyAgICBpbjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbls4XSk7CisgICAgaW4zID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMTJdKTsKKyAgICAvLyBhMDAgYTEwIGEyMCBhMzAgICB4IHggeCB4CisgICAgLy8gYTAxIGExMSBhMjEgYTMxICAgeCB4IHggeAorICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIHggeCB4IHgKKyAgICAvLyBhMDMgYTEzIGEyMyBhMzMgICB4IHggeCB4CisgICAgaWYgKGRvX3R3bykgeworICAgICAgY29uc3QgX19tMTI4aSBpbkIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMTZdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW5CMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmluWzIwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluQjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpblsyNF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbkIzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5bMjhdKTsKKyAgICAgIGluMCA9IF9tbV91bnBhY2tsb19lcGk2NChpbjAsIGluQjApOworICAgICAgaW4xID0gX21tX3VucGFja2xvX2VwaTY0KGluMSwgaW5CMSk7CisgICAgICBpbjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoaW4yLCBpbkIyKTsKKyAgICAgIGluMyA9IF9tbV91bnBhY2tsb19lcGk2NChpbjMsIGluQjMpOworICAgICAgLy8gYTAwIGExMCBhMjAgYTMwICAgYjAwIGIxMCBiMjAgYjMwCisgICAgICAvLyBhMDEgYTExIGEyMSBhMzEgICBiMDEgYjExIGIyMSBiMzEKKyAgICAgIC8vIGEwMiBhMTIgYTIyIGEzMiAgIGIwMiBiMTIgYjIyIGIzMgorICAgICAgLy8gYTAzIGExMyBhMjMgYTMzICAgYjAzIGIxMyBiMjMgYjMzCisgICAgfQorICB9CisKKyAgLy8gVmVydGljYWwgcGFzcyBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBGaXJzdCBwYXNzLCBjIGFuZCBkIGNhbGN1bGF0aW9ucyBhcmUgbG9uZ2VyIGJlY2F1c2Ugb2YgdGhlICJ0cmljayIKKyAgICAvLyBtdWx0aXBsaWNhdGlvbnMuCisgICAgY29uc3QgX19tMTI4aSBhID0gX21tX2FkZF9lcGkxNihpbjAsIGluMik7CisgICAgY29uc3QgX19tMTI4aSBiID0gX21tX3N1Yl9lcGkxNihpbjAsIGluMik7CisgICAgLy8gYyA9IE1VTChpbjEsIEsyKSAtIE1VTChpbjMsIEsxKSA9IE1VTChpbjEsIGsyKSAtIE1VTChpbjMsIGsxKSArIGluMSAtIGluMworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMik7CisgICAgY29uc3QgX19tMTI4aSBjMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsxKTsKKyAgICBjb25zdCBfX20xMjhpIGMzID0gX21tX3N1Yl9lcGkxNihpbjEsIGluMyk7CisgICAgY29uc3QgX19tMTI4aSBjNCA9IF9tbV9zdWJfZXBpMTYoYzEsIGMyKTsKKyAgICBjb25zdCBfX20xMjhpIGMgPSBfbW1fYWRkX2VwaTE2KGMzLCBjNCk7CisgICAgLy8gZCA9IE1VTChpbjEsIEsxKSArIE1VTChpbjMsIEsyKSA9IE1VTChpbjEsIGsxKSArIE1VTChpbjMsIGsyKSArIGluMSArIGluMworICAgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fbXVsaGlfZXBpMTYoaW4xLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9tdWxoaV9lcGkxNihpbjMsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihpbjEsIGluMyk7CisgICAgY29uc3QgX19tMTI4aSBkNCA9IF9tbV9hZGRfZXBpMTYoZDEsIGQyKTsKKyAgICBjb25zdCBfX20xMjhpIGQgPSBfbW1fYWRkX2VwaTE2KGQzLCBkNCk7CisKKyAgICAvLyBTZWNvbmQgcGFzcy4KKyAgICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYWRkX2VwaTE2KGEsIGQpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hZGRfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAyID0gX21tX3N1Yl9lcGkxNihiLCBjKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fc3ViX2VwaTE2KGEsIGQpOworCisgICAgLy8gVHJhbnNwb3NlIHRoZSB0d28gNHg0LgorICAgIFZQOFRyYW5zcG9zZV8yXzR4NF8xNmIoJnRtcDAsICZ0bXAxLCAmdG1wMiwgJnRtcDMsICZUMCwgJlQxLCAmVDIsICZUMyk7CisgIH0KKworICAvLyBIb3Jpem9udGFsIHBhc3MgYW5kIHN1YnNlcXVlbnQgdHJhbnNwb3NlLgorICB7CisgICAgLy8gRmlyc3QgcGFzcywgYyBhbmQgZCBjYWxjdWxhdGlvbnMgYXJlIGxvbmdlciBiZWNhdXNlIG9mIHRoZSAidHJpY2siCisgICAgLy8gbXVsdGlwbGljYXRpb25zLgorICAgIGNvbnN0IF9fbTEyOGkgZm91ciA9IF9tbV9zZXQxX2VwaTE2KDQpOworICAgIGNvbnN0IF9fbTEyOGkgZGMgPSBfbW1fYWRkX2VwaTE2KFQwLCBmb3VyKTsKKyAgICBjb25zdCBfX20xMjhpIGEgPSAgX21tX2FkZF9lcGkxNihkYywgVDIpOworICAgIGNvbnN0IF9fbTEyOGkgYiA9ICBfbW1fc3ViX2VwaTE2KGRjLCBUMik7CisgICAgLy8gYyA9IE1VTChUMSwgSzIpIC0gTVVMKFQzLCBLMSkgPSBNVUwoVDEsIGsyKSAtIE1VTChUMywgazEpICsgVDEgLSBUMworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fbXVsaGlfZXBpMTYoVDEsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX211bGhpX2VwaTE2KFQzLCBrMSk7CisgICAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9zdWJfZXBpMTYoVDEsIFQzKTsKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX3N1Yl9lcGkxNihjMSwgYzIpOworICAgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9hZGRfZXBpMTYoYzMsIGM0KTsKKyAgICAvLyBkID0gTVVMKFQxLCBLMSkgKyBNVUwoVDMsIEsyKSA9IE1VTChUMSwgazEpICsgTVVMKFQzLCBrMikgKyBUMSArIFQzCisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9tdWxoaV9lcGkxNihUMSwgazEpOworICAgIGNvbnN0IF9fbTEyOGkgZDIgPSBfbW1fbXVsaGlfZXBpMTYoVDMsIGsyKTsKKyAgICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkxNihUMSwgVDMpOworICAgIGNvbnN0IF9fbTEyOGkgZDQgPSBfbW1fYWRkX2VwaTE2KGQxLCBkMik7CisgICAgY29uc3QgX19tMTI4aSBkID0gX21tX2FkZF9lcGkxNihkMywgZDQpOworCisgICAgLy8gU2Vjb25kIHBhc3MuCisgICAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2FkZF9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fYWRkX2VwaTE2KGIsIGMpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zdWJfZXBpMTYoYiwgYyk7CisgICAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3N1Yl9lcGkxNihhLCBkKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQwID0gX21tX3NyYWlfZXBpMTYodG1wMCwgMyk7CisgICAgY29uc3QgX19tMTI4aSBzaGlmdGVkMSA9IF9tbV9zcmFpX2VwaTE2KHRtcDEsIDMpOworICAgIGNvbnN0IF9fbTEyOGkgc2hpZnRlZDIgPSBfbW1fc3JhaV9lcGkxNih0bXAyLCAzKTsKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0ZWQzID0gX21tX3NyYWlfZXBpMTYodG1wMywgMyk7CisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2Yigmc2hpZnRlZDAsICZzaGlmdGVkMSwgJnNoaWZ0ZWQyLCAmc2hpZnRlZDMsICZUMCwgJlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJlQyLCAmVDMpOworICB9CisKKyAgLy8gQWRkIGludmVyc2UgdHJhbnNmb3JtIHRvICdyZWYnIGFuZCBzdG9yZS4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgLy8gTG9hZCB0aGUgcmVmZXJlbmNlKHMpLgorICAgIF9fbTEyOGkgcmVmMCwgcmVmMSwgcmVmMiwgcmVmMzsKKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICAvLyBMb2FkIGVpZ2h0IGJ5dGVzL3BpeGVscyBwZXIgbGluZS4KKyAgICAgIHJlZjAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMCAqIEJQU10pOworICAgICAgcmVmMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsxICogQlBTXSk7CisgICAgICByZWYyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzIgKiBCUFNdKTsKKyAgICAgIHJlZjMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyZWZbMyAqIEJQU10pOworICAgIH0gZWxzZSB7CisgICAgICAvLyBMb2FkIGZvdXIgYnl0ZXMvcGl4ZWxzIHBlciBsaW5lLgorICAgICAgcmVmMCA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMigmcmVmWzAgKiBCUFNdKSk7CisgICAgICByZWYxID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKCZyZWZbMSAqIEJQU10pKTsKKyAgICAgIHJlZjIgPSBfbW1fY3Z0c2kzMl9zaTEyOChXZWJQTWVtVG9VaW50MzIoJnJlZlsyICogQlBTXSkpOworICAgICAgcmVmMyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMigmcmVmWzMgKiBCUFNdKSk7CisgICAgfQorICAgIC8vIENvbnZlcnQgdG8gMTZiLgorICAgIHJlZjAgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYwLCB6ZXJvKTsKKyAgICByZWYxID0gX21tX3VucGFja2xvX2VwaTgocmVmMSwgemVybyk7CisgICAgcmVmMiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjIsIHplcm8pOworICAgIHJlZjMgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYzLCB6ZXJvKTsKKyAgICAvLyBBZGQgdGhlIGludmVyc2UgdHJhbnNmb3JtKHMpLgorICAgIHJlZjAgPSBfbW1fYWRkX2VwaTE2KHJlZjAsIFQwKTsKKyAgICByZWYxID0gX21tX2FkZF9lcGkxNihyZWYxLCBUMSk7CisgICAgcmVmMiA9IF9tbV9hZGRfZXBpMTYocmVmMiwgVDIpOworICAgIHJlZjMgPSBfbW1fYWRkX2VwaTE2KHJlZjMsIFQzKTsKKyAgICAvLyBVbnNpZ25lZCBzYXR1cmF0ZSB0byA4Yi4KKyAgICByZWYwID0gX21tX3BhY2t1c19lcGkxNihyZWYwLCByZWYwKTsKKyAgICByZWYxID0gX21tX3BhY2t1c19lcGkxNihyZWYxLCByZWYxKTsKKyAgICByZWYyID0gX21tX3BhY2t1c19lcGkxNihyZWYyLCByZWYyKTsKKyAgICByZWYzID0gX21tX3BhY2t1c19lcGkxNihyZWYzLCByZWYzKTsKKyAgICAvLyBTdG9yZSB0aGUgcmVzdWx0cy4KKyAgICBpZiAoZG9fdHdvKSB7CisgICAgICAvLyBTdG9yZSBlaWdodCBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzAgKiBCUFNdLCByZWYwKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZkc3RbMSAqIEJQU10sIHJlZjEpOworICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJmRzdFsyICogQlBTXSwgcmVmMik7CisgICAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikmZHN0WzMgKiBCUFNdLCByZWYzKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU3RvcmUgZm91ciBieXRlcy9waXhlbHMgcGVyIGxpbmUuCisgICAgICBXZWJQVWludDMyVG9NZW0oJmRzdFswICogQlBTXSwgX21tX2N2dHNpMTI4X3NpMzIocmVmMCkpOworICAgICAgV2ViUFVpbnQzMlRvTWVtKCZkc3RbMSAqIEJQU10sIF9tbV9jdnRzaTEyOF9zaTMyKHJlZjEpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbSgmZHN0WzIgKiBCUFNdLCBfbW1fY3Z0c2kxMjhfc2kzMihyZWYyKSk7CisgICAgICBXZWJQVWludDMyVG9NZW0oJmRzdFszICogQlBTXSwgX21tX2N2dHNpMTI4X3NpMzIocmVmMykpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtUGFzczFfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBpbjAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgaW4yMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MzIpIHsKKyAgY29uc3QgX19tMTI4aSBrOTM3ID0gX21tX3NldDFfZXBpMzIoOTM3KTsKKyAgY29uc3QgX19tMTI4aSBrMTgxMiA9IF9tbV9zZXQxX2VwaTMyKDE4MTIpOworCisgIGNvbnN0IF9fbTEyOGkgazg4cCA9IF9tbV9zZXRfZXBpMTYoOCwgOCwgOCwgOCwgOCwgOCwgOCwgOCk7CisgIGNvbnN0IF9fbTEyOGkgazg4bSA9IF9tbV9zZXRfZXBpMTYoLTgsIDgsIC04LCA4LCAtOCwgOCwgLTgsIDgpOworICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTdwID0gX21tX3NldF9lcGkxNigyMjE3LCA1MzUyLCAyMjE3LCA1MzUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCA1MzUyLCAyMjE3LCA1MzUyKTsKKyAgY29uc3QgX19tMTI4aSBrNTM1Ml8yMjE3bSA9IF9tbV9zZXRfZXBpMTYoLTUzNTIsIDIyMTcsIC01MzUyLCAyMjE3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNTM1MiwgMjIxNywgLTUzNTIsIDIyMTcpOworCisgIC8vICppbjAxID0gMDAgMDEgMTAgMTEgMDIgMDMgMTIgMTMKKyAgLy8gKmluMjMgPSAyMCAyMSAzMCAzMSAyMiAyMyAzMiAzMworICBjb25zdCBfX20xMjhpIHNodWYwMV9wID0gX21tX3NodWZmbGVoaV9lcGkxNigqaW4wMSwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICBjb25zdCBfX20xMjhpIHNodWYyM19wID0gX21tX3NodWZmbGVoaV9lcGkxNigqaW4yMywgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAvLyAwMCAwMSAxMCAxMSAwMyAwMiAxMyAxMgorICAvLyAyMCAyMSAzMCAzMSAyMyAyMiAzMyAzMgorICBjb25zdCBfX20xMjhpIHMwMSA9IF9tbV91bnBhY2tsb19lcGk2NChzaHVmMDFfcCwgc2h1ZjIzX3ApOworICBjb25zdCBfX20xMjhpIHMzMiA9IF9tbV91bnBhY2toaV9lcGk2NChzaHVmMDFfcCwgc2h1ZjIzX3ApOworICAvLyAwMCAwMSAxMCAxMSAyMCAyMSAzMCAzMQorICAvLyAwMyAwMiAxMyAxMiAyMyAyMiAzMyAzMgorICBjb25zdCBfX20xMjhpIGEwMSA9IF9tbV9hZGRfZXBpMTYoczAxLCBzMzIpOworICBjb25zdCBfX20xMjhpIGEzMiA9IF9tbV9zdWJfZXBpMTYoczAxLCBzMzIpOworICAvLyBbZDAgKyBkMyB8IGQxICsgZDIgfCAuLi5dID0gW2EwIGExIHwgYTAnIGExJyB8IC4uLiBdCisgIC8vIFtkMCAtIGQzIHwgZDEgLSBkMiB8IC4uLl0gPSBbYTMgYTIgfCBhMycgYTInIHwgLi4uIF0KKworICBjb25zdCBfX20xMjhpIHRtcDAgICA9IF9tbV9tYWRkX2VwaTE2KGEwMSwgazg4cCk7ICAvLyBbIChhMCArIGExKSA8PCAzLCAuLi4gXQorICBjb25zdCBfX20xMjhpIHRtcDIgICA9IF9tbV9tYWRkX2VwaTE2KGEwMSwgazg4bSk7ICAvLyBbIChhMCAtIGExKSA8PCAzLCAuLi4gXQorICBjb25zdCBfX20xMjhpIHRtcDFfMSA9IF9tbV9tYWRkX2VwaTE2KGEzMiwgazUzNTJfMjIxN3ApOworICBjb25zdCBfX20xMjhpIHRtcDNfMSA9IF9tbV9tYWRkX2VwaTE2KGEzMiwgazUzNTJfMjIxN20pOworICBjb25zdCBfX20xMjhpIHRtcDFfMiA9IF9tbV9hZGRfZXBpMzIodG1wMV8xLCBrMTgxMik7CisgIGNvbnN0IF9fbTEyOGkgdG1wM18yID0gX21tX2FkZF9lcGkzMih0bXAzXzEsIGs5MzcpOworICBjb25zdCBfX20xMjhpIHRtcDEgICA9IF9tbV9zcmFpX2VwaTMyKHRtcDFfMiwgOSk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMyAgID0gX21tX3NyYWlfZXBpMzIodG1wM18yLCA5KTsKKyAgY29uc3QgX19tMTI4aSBzMDMgICAgPSBfbW1fcGFja3NfZXBpMzIodG1wMCwgdG1wMik7CisgIGNvbnN0IF9fbTEyOGkgczEyICAgID0gX21tX3BhY2tzX2VwaTMyKHRtcDEsIHRtcDMpOworICBjb25zdCBfX20xMjhpIHNfbG8gICA9IF9tbV91bnBhY2tsb19lcGkxNihzMDMsIHMxMik7ICAgLy8gMCAxIDAgMSAwIDEuLi4KKyAgY29uc3QgX19tMTI4aSBzX2hpICAgPSBfbW1fdW5wYWNraGlfZXBpMTYoczAzLCBzMTIpOyAgIC8vIDIgMyAyIDMgMiAzCisgIGNvbnN0IF9fbTEyOGkgdjIzICAgID0gX21tX3VucGFja2hpX2VwaTMyKHNfbG8sIHNfaGkpOworICAqb3V0MDEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoc19sbywgc19oaSk7CisgICpvdXQzMiA9IF9tbV9zaHVmZmxlX2VwaTMyKHYyMywgX01NX1NIVUZGTEUoMSwgMCwgMywgMikpOyAgLy8gMyAyIDMgMiAzIDIuLgorfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtUGFzczJfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCB2MDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCB2MzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBzZXZlbiA9IF9tbV9zZXQxX2VwaTE2KDcpOworICBjb25zdCBfX20xMjhpIGs1MzUyXzIyMTcgPSBfbW1fc2V0X2VwaTE2KDUzNTIsICAyMjE3LCA1MzUyLCAgMjIxNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzUyLCAgMjIxNywgNTM1MiwgIDIyMTcpOworICBjb25zdCBfX20xMjhpIGsyMjE3XzUzNTIgPSBfbW1fc2V0X2VwaTE2KDIyMTcsIC01MzUyLCAyMjE3LCAtNTM1MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjE3LCAtNTM1MiwgMjIxNywgLTUzNTIpOworICBjb25zdCBfX20xMjhpIGsxMjAwMF9wbHVzX29uZSA9IF9tbV9zZXQxX2VwaTMyKDEyMDAwICsgKDEgPDwgMTYpKTsKKyAgY29uc3QgX19tMTI4aSBrNTEwMDAgPSBfbW1fc2V0MV9lcGkzMig1MTAwMCk7CisKKyAgLy8gU2FtZSBvcGVyYXRpb25zIGFyZSBkb25lIG9uIHRoZSAoMCwzKSBhbmQgKDEsMikgcGFpcnMuCisgIC8vIGEzID0gdjAgLSB2MworICAvLyBhMiA9IHYxIC0gdjIKKyAgY29uc3QgX19tMTI4aSBhMzIgPSBfbW1fc3ViX2VwaTE2KCp2MDEsICp2MzIpOworICBjb25zdCBfX20xMjhpIGEyMiA9IF9tbV91bnBhY2toaV9lcGk2NChhMzIsIGEzMik7CisKKyAgY29uc3QgX19tMTI4aSBiMjMgPSBfbW1fdW5wYWNrbG9fZXBpMTYoYTIyLCBhMzIpOworICBjb25zdCBfX20xMjhpIGMxID0gX21tX21hZGRfZXBpMTYoYjIzLCBrNTM1Ml8yMjE3KTsKKyAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9tYWRkX2VwaTE2KGIyMywgazIyMTdfNTM1Mik7CisgIGNvbnN0IF9fbTEyOGkgZDEgPSBfbW1fYWRkX2VwaTMyKGMxLCBrMTIwMDBfcGx1c19vbmUpOworICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkzMihjMywgazUxMDAwKTsKKyAgY29uc3QgX19tMTI4aSBlMSA9IF9tbV9zcmFpX2VwaTMyKGQxLCAxNik7CisgIGNvbnN0IF9fbTEyOGkgZTMgPSBfbW1fc3JhaV9lcGkzMihkMywgMTYpOworICAvLyBmMSA9ICgoYjMgKiA1MzUyICsgYjIgKiAyMjE3ICsgMTIwMDApID4+IDE2KQorICAvLyBmMyA9ICgoYjMgKiAyMjE3IC0gYjIgKiA1MzUyICsgNTEwMDApID4+IDE2KQorICBjb25zdCBfX20xMjhpIGYxID0gX21tX3BhY2tzX2VwaTMyKGUxLCBlMSk7CisgIGNvbnN0IF9fbTEyOGkgZjMgPSBfbW1fcGFja3NfZXBpMzIoZTMsIGUzKTsKKyAgLy8gZzEgPSBmMSArIChhMyAhPSAwKTsKKyAgLy8gVGhlIGNvbXBhcmUgd2lsbCByZXR1cm4gKDB4ZmZmZiwgMCkgZm9yICg9PTAsICE9MCkuIFRvIHR1cm4gdGhhdCBpbnRvIHRoZQorICAvLyBkZXNpcmVkICgwLCAxKSwgd2UgYWRkIG9uZSBlYXJsaWVyIHRocm91Z2ggazEyMDAwX3BsdXNfb25lLgorICAvLyAtPiBnMSA9IGYxICsgMSAtIChhMyA9PSAwKQorICBjb25zdCBfX20xMjhpIGcxID0gX21tX2FkZF9lcGkxNihmMSwgX21tX2NtcGVxX2VwaTE2KGEzMiwgemVybykpOworCisgIC8vIGEwID0gdjAgKyB2MworICAvLyBhMSA9IHYxICsgdjIKKyAgY29uc3QgX19tMTI4aSBhMDEgPSBfbW1fYWRkX2VwaTE2KCp2MDEsICp2MzIpOworICBjb25zdCBfX20xMjhpIGEwMV9wbHVzXzcgPSBfbW1fYWRkX2VwaTE2KGEwMSwgc2V2ZW4pOworICBjb25zdCBfX20xMjhpIGExMSA9IF9tbV91bnBhY2toaV9lcGk2NChhMDEsIGEwMSk7CisgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fYWRkX2VwaTE2KGEwMV9wbHVzXzcsIGExMSk7CisgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fc3ViX2VwaTE2KGEwMV9wbHVzXzcsIGExMSk7CisgIC8vIGQwID0gKGEwICsgYTEgKyA3KSA+PiA0OworICAvLyBkMiA9IChhMCAtIGExICsgNykgPj4gNDsKKyAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9zcmFpX2VwaTE2KGMwLCA0KTsKKyAgY29uc3QgX19tMTI4aSBkMiA9IF9tbV9zcmFpX2VwaTE2KGMyLCA0KTsKKworICBjb25zdCBfX20xMjhpIGQwX2cxID0gX21tX3VucGFja2xvX2VwaTY0KGQwLCBnMSk7CisgIGNvbnN0IF9fbTEyOGkgZDJfZjMgPSBfbW1fdW5wYWNrbG9fZXBpNjQoZDIsIGYzKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFswXSwgZDBfZzEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBkMl9mMyk7Cit9CisKK3N0YXRpYyB2b2lkIEZUcmFuc2Zvcm1fU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXQpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgLy8gTG9hZCBzcmMuCisgIGNvbnN0IF9fbTEyOGkgc3JjMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1swICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1sxICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1syICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnNyY1szICogQlBTXSk7CisgIC8vIDAwIDAxIDAyIDAzICoKKyAgLy8gMTAgMTEgMTIgMTMgKgorICAvLyAyMCAyMSAyMiAyMyAqCisgIC8vIDMwIDMxIDMyIDMzICoKKyAgLy8gU2h1ZmZsZS4KKyAgY29uc3QgX19tMTI4aSBzcmNfMCA9IF9tbV91bnBhY2tsb19lcGkxNihzcmMwLCBzcmMxKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMSA9IF9tbV91bnBhY2tsb19lcGkxNihzcmMyLCBzcmMzKTsKKyAgLy8gMDAgMDEgMTAgMTEgMDIgMDMgMTIgMTMgKiAqIC4uLgorICAvLyAyMCAyMSAzMCAzMSAyMiAyMiAzMiAzMyAqICogLi4uCisKKyAgLy8gTG9hZCByZWYuCisgIGNvbnN0IF9fbTEyOGkgcmVmMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlswICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsxICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMiA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlsyICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnJlZlszICogQlBTXSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzAgPSBfbW1fdW5wYWNrbG9fZXBpMTYocmVmMCwgcmVmMSk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzEgPSBfbW1fdW5wYWNrbG9fZXBpMTYocmVmMiwgcmVmMyk7CisKKyAgLy8gQ29udmVydCBib3RoIHRvIDE2IGJpdC4KKyAgY29uc3QgX19tMTI4aSBzcmNfMF8xNmIgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmNfMCwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzFfMTZiID0gX21tX3VucGFja2xvX2VwaTgoc3JjXzEsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8wXzE2YiA9IF9tbV91bnBhY2tsb19lcGk4KHJlZl8wLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMV8xNmIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWZfMSwgemVybyk7CisKKyAgLy8gQ29tcHV0ZSB0aGUgZGlmZmVyZW5jZS4KKyAgY29uc3QgX19tMTI4aSByb3cwMSA9IF9tbV9zdWJfZXBpMTYoc3JjXzBfMTZiLCByZWZfMF8xNmIpOworICBjb25zdCBfX20xMjhpIHJvdzIzID0gX21tX3N1Yl9lcGkxNihzcmNfMV8xNmIsIHJlZl8xXzE2Yik7CisgIF9fbTEyOGkgdjAxLCB2MzI7CisKKyAgLy8gRmlyc3QgcGFzcworICBGVHJhbnNmb3JtUGFzczFfU1NFMigmcm93MDEsICZyb3cyMywgJnYwMSwgJnYzMik7CisKKyAgLy8gU2Vjb25kIHBhc3MKKyAgRlRyYW5zZm9ybVBhc3MyX1NTRTIoJnYwMSwgJnYzMiwgb3V0KTsKK30KKworc3RhdGljIHZvaWQgRlRyYW5zZm9ybTJfU1NFMihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisKKyAgLy8gTG9hZCBzcmMgYW5kIGNvbnZlcnQgdG8gMTZiLgorICBjb25zdCBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMCAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMSAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMiAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyYzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZzcmNbMyAqIEJQU10pOworICBjb25zdCBfX20xMjhpIHNyY18wID0gX21tX3VucGFja2xvX2VwaTgoc3JjMCwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgc3JjXzEgPSBfbW1fdW5wYWNrbG9fZXBpOChzcmMxLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzcmNfMiA9IF9tbV91bnBhY2tsb19lcGk4KHNyYzIsIHplcm8pOworICBjb25zdCBfX20xMjhpIHNyY18zID0gX21tX3VucGFja2xvX2VwaTgoc3JjMywgemVybyk7CisgIC8vIExvYWQgcmVmIGFuZCBjb252ZXJ0IHRvIDE2Yi4KKyAgY29uc3QgX19tMTI4aSByZWYwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzAgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzEgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzIgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWYzID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcmVmWzMgKiBCUFNdKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMCA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjAsIHplcm8pOworICBjb25zdCBfX20xMjhpIHJlZl8xID0gX21tX3VucGFja2xvX2VwaTgocmVmMSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgcmVmXzIgPSBfbW1fdW5wYWNrbG9fZXBpOChyZWYyLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSByZWZfMyA9IF9tbV91bnBhY2tsb19lcGk4KHJlZjMsIHplcm8pOworICAvLyBDb21wdXRlIGRpZmZlcmVuY2UuIC0+IDAwIDAxIDAyIDAzICAwMCcgMDEnIDAyJyAwMycKKyAgY29uc3QgX19tMTI4aSBkaWZmMCA9IF9tbV9zdWJfZXBpMTYoc3JjXzAsIHJlZl8wKTsKKyAgY29uc3QgX19tMTI4aSBkaWZmMSA9IF9tbV9zdWJfZXBpMTYoc3JjXzEsIHJlZl8xKTsKKyAgY29uc3QgX19tMTI4aSBkaWZmMiA9IF9tbV9zdWJfZXBpMTYoc3JjXzIsIHJlZl8yKTsKKyAgY29uc3QgX19tMTI4aSBkaWZmMyA9IF9tbV9zdWJfZXBpMTYoc3JjXzMsIHJlZl8zKTsKKworICAvLyBVbnBhY2sgYW5kIHNodWZmbGUKKyAgLy8gMDAgMDEgMDIgMDMgICAwIDAgMCAwCisgIC8vIDEwIDExIDEyIDEzICAgMCAwIDAgMAorICAvLyAyMCAyMSAyMiAyMyAgIDAgMCAwIDAKKyAgLy8gMzAgMzEgMzIgMzMgICAwIDAgMCAwCisgIGNvbnN0IF9fbTEyOGkgc2h1ZjAxbCA9IF9tbV91bnBhY2tsb19lcGkzMihkaWZmMCwgZGlmZjEpOworICBjb25zdCBfX20xMjhpIHNodWYyM2wgPSBfbW1fdW5wYWNrbG9fZXBpMzIoZGlmZjIsIGRpZmYzKTsKKyAgY29uc3QgX19tMTI4aSBzaHVmMDFoID0gX21tX3VucGFja2hpX2VwaTMyKGRpZmYwLCBkaWZmMSk7CisgIGNvbnN0IF9fbTEyOGkgc2h1ZjIzaCA9IF9tbV91bnBhY2toaV9lcGkzMihkaWZmMiwgZGlmZjMpOworICBfX20xMjhpIHYwMWwsIHYzMmw7CisgIF9fbTEyOGkgdjAxaCwgdjMyaDsKKworICAvLyBGaXJzdCBwYXNzCisgIEZUcmFuc2Zvcm1QYXNzMV9TU0UyKCZzaHVmMDFsLCAmc2h1ZjIzbCwgJnYwMWwsICZ2MzJsKTsKKyAgRlRyYW5zZm9ybVBhc3MxX1NTRTIoJnNodWYwMWgsICZzaHVmMjNoLCAmdjAxaCwgJnYzMmgpOworCisgIC8vIFNlY29uZCBwYXNzCisgIEZUcmFuc2Zvcm1QYXNzMl9TU0UyKCZ2MDFsLCAmdjMybCwgb3V0ICsgMCk7CisgIEZUcmFuc2Zvcm1QYXNzMl9TU0UyKCZ2MDFoLCAmdjMyaCwgb3V0ICsgMTYpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUUm93X1NTRTIoY29uc3QgaW50MTZfdCogY29uc3QgaW4sIF9fbTEyOGkqIGNvbnN0IG91dCkgeworICBjb25zdCBfX20xMjhpIGtNdWx0ID0gX21tX3NldF9lcGkxNigtMSwgMSwgLTEsIDEsIDEsIDEsIDEsIDEpOworICBjb25zdCBfX20xMjhpIHNyYzAgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblswICogMTZdKTsKKyAgY29uc3QgX19tMTI4aSBzcmMxID0gX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKikmaW5bMSAqIDE2XSk7CisgIGNvbnN0IF9fbTEyOGkgc3JjMiA9IF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopJmluWzIgKiAxNl0pOworICBjb25zdCBfX20xMjhpIHNyYzMgPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSZpblszICogMTZdKTsKKyAgY29uc3QgX19tMTI4aSBBMDEgPSBfbW1fdW5wYWNrbG9fZXBpMTYoc3JjMCwgc3JjMSk7ICAvLyBBMCBBMSB8IC4uLgorICBjb25zdCBfX20xMjhpIEEyMyA9IF9tbV91bnBhY2tsb19lcGkxNihzcmMyLCBzcmMzKTsgIC8vIEEyIEEzIHwgLi4uCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fYWRkc19lcGkxNihBMDEsIEEyMyk7ICAgIC8vIGEwIHwgYTEgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9zdWJzX2VwaTE2KEEwMSwgQTIzKTsgICAgLy8gYTMgfCBhMiB8IC4uLgorICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTMyKEIwLCBCMSk7ICAvLyBhMCB8IGExIHwgYTMgfCBhMiB8IC4uLgorICBjb25zdCBfX20xMjhpIEMxID0gX21tX3VucGFja2xvX2VwaTMyKEIxLCBCMCk7ICAvLyBhMyB8IGEyIHwgYTAgfCBhMSB8IC4uLgorICBjb25zdCBfX20xMjhpIEQgPSBfbW1fdW5wYWNrbG9fZXBpNjQoQzAsIEMxKTsgICAvLyBhMCBhMSBhMyBhMiBhMyBhMiBhMCBhMQorICAqb3V0ID0gX21tX21hZGRfZXBpMTYoRCwga011bHQpOworfQorCitzdGF0aWMgdm9pZCBGVHJhbnNmb3JtV0hUX1NTRTIoY29uc3QgaW50MTZfdCogaW4sIGludDE2X3QqIG91dCkgeworICAvLyBJbnB1dCBpcyAxMmIgc2lnbmVkLgorICBfX20xMjhpIHJvdzAsIHJvdzEsIHJvdzIsIHJvdzM7CisgIC8vIFJvd3MgYXJlIDE0YiBzaWduZWQuCisgIEZUcmFuc2Zvcm1XSFRSb3dfU1NFMihpbiArIDAgKiA2NCwgJnJvdzApOworICBGVHJhbnNmb3JtV0hUUm93X1NTRTIoaW4gKyAxICogNjQsICZyb3cxKTsKKyAgRlRyYW5zZm9ybVdIVFJvd19TU0UyKGluICsgMiAqIDY0LCAmcm93Mik7CisgIEZUcmFuc2Zvcm1XSFRSb3dfU1NFMihpbiArIDMgKiA2NCwgJnJvdzMpOworCisgIHsKKyAgICAvLyBUaGUgYSogYXJlIDE1YiBzaWduZWQuCisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9hZGRfZXBpMzIocm93MCwgcm93Mik7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9hZGRfZXBpMzIocm93MSwgcm93Myk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMzIocm93MSwgcm93Myk7CisgICAgY29uc3QgX19tMTI4aSBhMyA9IF9tbV9zdWJfZXBpMzIocm93MCwgcm93Mik7CisgICAgY29uc3QgX19tMTI4aSBhMGEzID0gX21tX3BhY2tzX2VwaTMyKGEwLCBhMyk7CisgICAgY29uc3QgX19tMTI4aSBhMWEyID0gX21tX3BhY2tzX2VwaTMyKGExLCBhMik7CisKKyAgICAvLyBUaGUgYiogYXJlIDE2YiBzaWduZWQuCisgICAgY29uc3QgX19tMTI4aSBiMGIxID0gX21tX2FkZF9lcGkxNihhMGEzLCBhMWEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIzYjIgPSBfbW1fc3ViX2VwaTE2KGEwYTMsIGExYTIpOworICAgIGNvbnN0IF9fbTEyOGkgdG1wX2IyYjMgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjNiMiwgYjNiMik7CisgICAgY29uc3QgX19tMTI4aSBiMmIzID0gX21tX3VucGFja2xvX2VwaTY0KHRtcF9iMmIzLCBiM2IyKTsKKworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIF9tbV9zcmFpX2VwaTE2KGIwYjEsIDEpKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBfbW1fc3JhaV9lcGkxNihiMmIzLCAxKSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXB1dGUgc3VzY2VwdGliaWxpdHkgYmFzZWQgb24gRENULWNvZWZmIGhpc3RvZ3JhbXM6CisvLyB0aGUgaGlnaGVyLCB0aGUgImVhc2llciIgdGhlIG1hY3JvYmxvY2sgaXMgdG8gY29tcHJlc3MuCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fU1NFMihjb25zdCB1aW50OF90KiByZWYsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2Jsb2NrLCBpbnQgZW5kX2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfdGhyZXNoID0gX21tX3NldDFfZXBpMTYoTUFYX0NPRUZGX1RIUkVTSCk7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIGludCBrOworCisgICAgRlRyYW5zZm9ybV9TU0UyKHJlZiArIFZQOERzcFNjYW5bal0sIHByZWQgKyBWUDhEc3BTY2FuW2pdLCBvdXQpOworCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluICh3aXRoaW4gb3V0W10pLgorICAgIHsKKyAgICAgIC8vIExvYWQuCisgICAgICBjb25zdCBfX20xMjhpIG91dDAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0pOworICAgICAgY29uc3QgX19tMTI4aSBvdXQxID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3ViX2VwaTE2KHplcm8sIG91dDApOworICAgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9zdWJfZXBpMTYoemVybywgb3V0MSk7CisgICAgICBjb25zdCBfX20xMjhpIGFiczAgPSBfbW1fbWF4X2VwaTE2KG91dDAsIGQwKTsgICAvLyBhYnModiksIDE2YgorICAgICAgY29uc3QgX19tMTI4aSBhYnMxID0gX21tX21heF9lcGkxNihvdXQxLCBkMSk7CisgICAgICAvLyB2ID0gYWJzKG91dCkgPj4gMworICAgICAgY29uc3QgX19tMTI4aSB2MCA9IF9tbV9zcmFpX2VwaTE2KGFiczAsIDMpOworICAgICAgY29uc3QgX19tMTI4aSB2MSA9IF9tbV9zcmFpX2VwaTE2KGFiczEsIDMpOworICAgICAgLy8gYmluID0gbWluKHYsIE1BWF9DT0VGRl9USFJFU0gpCisgICAgICBjb25zdCBfX20xMjhpIGJpbjAgPSBfbW1fbWluX2VwaTE2KHYwLCBtYXhfY29lZmZfdGhyZXNoKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmluMSA9IF9tbV9taW5fZXBpMTYodjEsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgLy8gU3RvcmUuCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBiaW4wKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIGJpbjEpOworICAgIH0KKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbi4KKyAgICBmb3IgKGsgPSAwOyBrIDwgMTY7ICsraykgeworICAgICAgKytkaXN0cmlidXRpb25bb3V0W2tdXTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SGlzdG9ncmFtRGF0YShkaXN0cmlidXRpb24sIGhpc3RvKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludHJhIHByZWRpY3Rpb25zCisKKy8vIGhlbHBlciBmb3IgY2hyb21hLURDIHByZWRpY3Rpb25zCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXQ4eDh1dl9TU0UyKHVpbnQ4X3QgdiwgdWludDhfdCogZHN0KSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgodik7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHZhbHVlcyk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0MTZfU1NFMih1aW50OF90IHYsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgajsKKyAgY29uc3QgX19tMTI4aSB2YWx1ZXMgPSBfbW1fc2V0MV9lcGk4KHYpOworICBmb3IgKGogPSAwOyBqIDwgMTY7ICsraikgeworICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGogKiBCUFMpLCB2YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEZpbGxfU1NFMih1aW50OF90KiBkc3QsIGludCB2YWx1ZSwgaW50IHNpemUpIHsKKyAgaWYgKHNpemUgPT0gNCkgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKyAgICAgIG1lbXNldChkc3QgKyBqICogQlBTLCB2YWx1ZSwgNCk7CisgICAgfQorICB9IGVsc2UgaWYgKHNpemUgPT0gOCkgeworICAgIFB1dDh4OHV2X1NTRTIodmFsdWUsIGRzdCk7CisgIH0gZWxzZSB7CisgICAgUHV0MTZfU1NFMih2YWx1ZSwgZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWRTh1dl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGludCBqOworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHRvcF92YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZFMTZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikoZHN0ICsgaiAqIEJQUyksIHRvcF92YWx1ZXMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZlcnRpY2FsUHJlZF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwgaW50IHNpemUpIHsKKyAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgVkU4dXZfU1NFMihkc3QsIHRvcCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZFMTZfU1NFMihkc3QsIHRvcCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEZpbGxfU1NFMihkc3QsIDEyNywgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEU4dXZfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgobGVmdFtqXSk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCB2YWx1ZXMpOworICAgIGRzdCArPSBCUFM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSEUxNl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCkgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBjb25zdCBfX20xMjhpIHZhbHVlcyA9IF9tbV9zZXQxX2VwaTgobGVmdFtqXSk7CisgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilkc3QsIHZhbHVlcyk7CisgICAgZHN0ICs9IEJQUzsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIb3Jpem9udGFsUHJlZF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogbGVmdCwgaW50IHNpemUpIHsKKyAgaWYgKGxlZnQgIT0gTlVMTCkgeworICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgIEhFOHV2X1NTRTIoZHN0LCBsZWZ0KTsKKyAgICB9IGVsc2UgeworICAgICAgSEUxNl9TU0UyKGRzdCwgbGVmdCk7CisgICAgfQorICB9IGVsc2UgeworICAgIEZpbGxfU1NFMihkc3QsIDEyOSwgc2l6ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVE1fU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCwgaW50IHNpemUpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgaW50IHk7CisgIGlmIChzaXplID09IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICAgIGZvciAoeSA9IDA7IHkgPCA4OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBsZWZ0W3ldIC0gbGVmdFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2UpLCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKWRzdCwgb3V0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgX19tMTI4aSB0b3BfdmFsdWVzID0gX21tX2xvYWRfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8wID0gX21tX3VucGFja2xvX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgY29uc3QgX19tMTI4aSB0b3BfYmFzZV8xID0gX21tX3VucGFja2hpX2VwaTgodG9wX3ZhbHVlcywgemVybyk7CisgICAgZm9yICh5ID0gMDsgeSA8IDE2OyArK3ksIGRzdCArPSBCUFMpIHsKKyAgICAgIGNvbnN0IGludCB2YWwgPSBsZWZ0W3ldIC0gbGVmdFstMV07CisgICAgICBjb25zdCBfX20xMjhpIGJhc2UgPSBfbW1fc2V0MV9lcGkxNih2YWwpOworICAgICAgY29uc3QgX19tMTI4aSBvdXRfMCA9IF9tbV9hZGRfZXBpMTYoYmFzZSwgdG9wX2Jhc2VfMCk7CisgICAgICBjb25zdCBfX20xMjhpIG91dF8xID0gX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZV8xKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3BhY2t1c19lcGkxNihvdXRfMCwgb3V0XzEpOworICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKilkc3QsIG91dCk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRydWVNb3Rpb25fU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wLCBpbnQgc2l6ZSkgeworICBpZiAobGVmdCAhPSBOVUxMKSB7CisgICAgaWYgKHRvcCAhPSBOVUxMKSB7CisgICAgICBUTV9TU0UyKGRzdCwgbGVmdCwgdG9wLCBzaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgSG9yaXpvbnRhbFByZWRfU1NFMihkc3QsIGxlZnQsIHNpemUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyB0cnVlIG1vdGlvbiB3aXRob3V0IGxlZnQgc2FtcGxlcyAoaGVuY2U6IHdpdGggZGVmYXVsdCAxMjkgdmFsdWUpCisgICAgLy8gaXMgZXF1aXZhbGVudCB0byBWRSBwcmVkaWN0aW9uIHdoZXJlIHlvdSBqdXN0IGNvcHkgdGhlIHRvcCBzYW1wbGVzLgorICAgIC8vIE5vdGUgdGhhdCBpZiB0b3Agc2FtcGxlcyBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAvLyB0aGVuIDEyOSwgYW5kIG5vdCAxMjcgYXMgaW4gdGhlIFZlcnRpY2FsUHJlZCBjYXNlLgorICAgIGlmICh0b3AgIT0gTlVMTCkgeworICAgICAgVmVydGljYWxQcmVkX1NTRTIoZHN0LCB0b3AsIHNpemUpOworICAgIH0gZWxzZSB7CisgICAgICBGaWxsX1NTRTIoZHN0LCAxMjksIHNpemUpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dl9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBsZWZ0X3ZhbHVlcyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopbGVmdCk7CisgIGNvbnN0IF9fbTEyOGkgY29tYmluZWQgPSBfbW1fdW5wYWNrbG9fZXBpNjQodG9wX3ZhbHVlcywgbGVmdF92YWx1ZXMpOworICBjb25zdCBpbnQgREMgPSBWUDhIb3Jpem9udGFsQWRkOGIoJmNvbWJpbmVkKSArIDg7CisgIFB1dDh4OHV2X1NTRTIoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREM4dXZOb0xlZnRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRvcF92YWx1ZXMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKXRvcCk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX3NhZF9lcHU4KHRvcF92YWx1ZXMsIHplcm8pOworICBjb25zdCBpbnQgREMgPSBfbW1fY3Z0c2kxMjhfc2kzMihzdW0pICsgNDsKKyAgUHV0OHg4dXZfU1NFMihEQyA+PiAzLCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk5vVG9wX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIC8vICdsZWZ0JyBpcyBjb250aWd1b3VzIHNvIHdlIGNhbiByZXVzZSB0aGUgdG9wIHN1bW1hdGlvbi4KKyAgREM4dXZOb0xlZnRfU1NFMihkc3QsIGxlZnQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzh1dk5vVG9wTGVmdF9TU0UyKHVpbnQ4X3QqIGRzdCkgeworICBQdXQ4eDh1dl9TU0UyKDB4ODAsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDOHV2TW9kZV9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBpZiAodG9wICE9IE5VTEwpIHsKKyAgICBpZiAobGVmdCAhPSBOVUxMKSB7ICAvLyB0b3AgYW5kIGxlZnQgcHJlc2VudAorICAgICAgREM4dXZfU1NFMihkc3QsIGxlZnQsIHRvcCk7CisgICAgfSBlbHNlIHsgIC8vIHRvcCwgYnV0IG5vIGxlZnQKKyAgICAgIERDOHV2Tm9MZWZ0X1NTRTIoZHN0LCB0b3ApOworICAgIH0KKyAgfSBlbHNlIGlmIChsZWZ0ICE9IE5VTEwpIHsgIC8vIGxlZnQgYnV0IG5vIHRvcAorICAgIERDOHV2Tm9Ub3BfU1NFMihkc3QsIGxlZnQpOworICB9IGVsc2UgeyAgLy8gbm8gdG9wLCBubyBsZWZ0LCBub3RoaW5nLgorICAgIERDOHV2Tm9Ub3BMZWZ0X1NTRTIoZHN0KTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHRvcF9yb3cgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBsZWZ0X3JvdyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKilsZWZ0KTsKKyAgY29uc3QgaW50IERDID0KKyAgICAgIFZQOEhvcml6b250YWxBZGQ4YigmdG9wX3JvdykgKyBWUDhIb3Jpem9udGFsQWRkOGIoJmxlZnRfcm93KSArIDE2OworICBQdXQxNl9TU0UyKERDID4+IDUsIGRzdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZOb0xlZnRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBfX20xMjhpIHRvcF9yb3cgPSBfbW1fbG9hZF9zaTEyOCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgaW50IERDID0gVlA4SG9yaXpvbnRhbEFkZDhiKCZ0b3Bfcm93KSArIDg7CisgIFB1dDE2X1NTRTIoREMgPj4gNCwgZHN0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgREMxNk5vVG9wX1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiBsZWZ0KSB7CisgIC8vICdsZWZ0JyBpcyBjb250aWd1b3VzIHNvIHdlIGNhbiByZXVzZSB0aGUgdG9wIHN1bW1hdGlvbi4KKyAgREMxNk5vTGVmdF9TU0UyKGRzdCwgbGVmdCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDMTZOb1RvcExlZnRfU1NFMih1aW50OF90KiBkc3QpIHsKKyAgUHV0MTZfU1NFMigweDgwLCBkc3QpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEQzE2TW9kZV9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGlmICh0b3AgIT0gTlVMTCkgeworICAgIGlmIChsZWZ0ICE9IE5VTEwpIHsgIC8vIHRvcCBhbmQgbGVmdCBwcmVzZW50CisgICAgICBEQzE2X1NTRTIoZHN0LCBsZWZ0LCB0b3ApOworICAgIH0gZWxzZSB7ICAvLyB0b3AsIGJ1dCBubyBsZWZ0CisgICAgICBEQzE2Tm9MZWZ0X1NTRTIoZHN0LCB0b3ApOworICAgIH0KKyAgfSBlbHNlIGlmIChsZWZ0ICE9IE5VTEwpIHsgIC8vIGxlZnQgYnV0IG5vIHRvcAorICAgIERDMTZOb1RvcF9TU0UyKGRzdCwgbGVmdCk7CisgIH0gZWxzZSB7ICAvLyBubyB0b3AsIG5vIGxlZnQsIG5vdGhpbmcuCisgICAgREMxNk5vVG9wTGVmdF9TU0UyKGRzdCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDR4NCBwcmVkaWN0aW9ucworCisjZGVmaW5lIERTVCh4LCB5KSBkc3RbKHgpICsgKHkpICogQlBTXQorI2RlZmluZSBBVkczKGEsIGIsIGMpICgoKGEpICsgMiAqIChiKSArIChjKSArIDIpID4+IDIpCisjZGVmaW5lIEFWRzIoYSwgYikgKCgoYSkgKyAoYikgKyAxKSA+PiAxKQorCisvLyBXZSB1c2UgdGhlIGZvbGxvd2luZyA4Yi1hcml0aG1ldGljIHRyaWNrczoKKy8vICAgICAoYSArIDIgKiBiICsgYyArIDIpID4+IDIgPSAoQUMgKyBiICsgMSkgPj4gMQorLy8gICB3aGVyZTogQUMgPSAoYSArIGMpID4+IDEgPSBbKGEgKyBjICsgMSkgPj4gMV0gLSBbKGFeYykgJiAxXQorLy8gYW5kOgorLy8gICAgIChhICsgMiAqIGIgKyBjICsgMikgPj4gMiA9IChBQiArIEJDICsgMSkgPj4gMSAtIChhYnxiYykmbHNiCisvLyAgIHdoZXJlOiBBQyA9IChhICsgYiArIDEpID4+IDEsICAgQkMgPSAoYiArIGMgKyAxKSA+PiAxCisvLyAgIGFuZCBhYiA9IGEgXiBiLCBiYyA9IGIgXiBjLCBsc2IgPSAoQUNeQkMpJjEKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkU0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyB2ZXJ0aWNhbAorICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTgoMSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDREVGR0ggPSBfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKSh0b3AgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgQkNERUZHSDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgQ0RFRkdIMDAgPSBfbW1fc3JsaV9zaTEyOChBQkNERUZHSCwgMik7CisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9hdmdfZXB1OChBQkNERUZHSCwgQ0RFRkdIMDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChBQkNERUZHSCwgQ0RFRkdIMDApLCBvbmUpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fc3Vic19lcHU4KGEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYXZnID0gX21tX2F2Z19lcHU4KGIsIEJDREVGR0gwKTsKKyAgY29uc3QgdWludDMyX3QgdmFscyA9IF9tbV9jdnRzaTEyOF9zaTMyKGF2Zyk7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIGkgKiBCUFMsIHZhbHMpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhFNF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gaG9yaXpvbnRhbAorICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhYLCBJLCBKKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCAweDAxMDEwMTAxVSAqIEFWRzMoSSwgSiwgSykpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgMHgwMTAxMDEwMVUgKiBBVkczKEosIEssIEwpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIDB4MDEwMTAxMDFVICogQVZHMyhLLCBMLCBMKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERDNF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIHVpbnQzMl90IGRjID0gNDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIGRjICs9IHRvcFtpXSArIHRvcFstNSArIGldOworICBGaWxsX1NTRTIoZHN0LCBkYyA+PiAzLCA0KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTEQ0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBEb3duLUxlZnQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEFCQ0RFRkdIID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKil0b3ApOworICBjb25zdCBfX20xMjhpIEJDREVGR0gwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDEpOworICBjb25zdCBfX20xMjhpIENERUZHSDAwID0gX21tX3NybGlfc2kxMjgoQUJDREVGR0gsIDIpOworICBjb25zdCBfX20xMjhpIENERUZHSEgwID0gX21tX2luc2VydF9lcGkxNihDREVGR0gwMCwgdG9wWzddLCAzKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBDREVGR0hIMCk7CisgIGNvbnN0IF9fbTEyOGkgbHNiID0gX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KEFCQ0RFRkdILCBDREVGR0hIMCksIG9uZSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9zdWJzX2VwdTgoYXZnMSwgbHNiKTsKKyAgY29uc3QgX19tMTI4aSBhYmNkZWZnID0gX21tX2F2Z19lcHU4KGF2ZzIsIEJDREVGR0gwKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGFiY2RlZmcgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMikpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDMpKSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZSNF9TU0UyKHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeyAgLy8gVmVydGljYWwtUmlnaHQKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBpbnQgSSA9IHRvcFstMl07CisgIGNvbnN0IGludCBKID0gdG9wWy0zXTsKKyAgY29uc3QgaW50IEsgPSB0b3BbLTRdOworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IF9fbTEyOGkgWEFCQ0QgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSh0b3AgLSAxKSk7CisgIGNvbnN0IF9fbTEyOGkgQUJDRDAgPSBfbW1fc3JsaV9zaTEyOChYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgYWJjZCA9IF9tbV9hdmdfZXB1OChYQUJDRCwgQUJDRDApOworICBjb25zdCBfX20xMjhpIF9YQUJDRCA9IF9tbV9zbGxpX3NpMTI4KFhBQkNELCAxKTsKKyAgY29uc3QgX19tMTI4aSBJWEFCQ0QgPSBfbW1faW5zZXJ0X2VwaTE2KF9YQUJDRCwgSSB8IChYIDw8IDgpLCAwKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KElYQUJDRCwgQUJDRDApOworICBjb25zdCBfX20xMjhpIGxzYiA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChJWEFCQ0QsIEFCQ0QwKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3N1YnNfZXB1OChhdmcxLCBsc2IpOworICBjb25zdCBfX20xMjhpIGVmZ2ggPSBfbW1fYXZnX2VwdTgoYXZnMiwgWEFCQ0QpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZCAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDEgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGVmZ2ggICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAyICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc2xsaV9zaTEyOChhYmNkLCAxKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NsbGlfc2kxMjgoZWZnaCwgMSkpKTsKKworICAvLyB0aGVzZSB0d28gYXJlIGhhcmQgdG8gaW1wbGVtZW50IGluIFNTRTIsIHNvIHdlIGtlZXAgdGhlIEMtdmVyc2lvbjoKKyAgRFNUKDAsIDIpID0gQVZHMyhKLCBJLCBYKTsKKyAgRFNUKDAsIDMpID0gQVZHMyhLLCBKLCBJKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVkw0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBWZXJ0aWNhbC1MZWZ0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBBQkNERUZHSCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopdG9wKTsKKyAgY29uc3QgX19tMTI4aSBCQ0RFRkdIXyA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAxKTsKKyAgY29uc3QgX19tMTI4aSBDREVGR0hfXyA9IF9tbV9zcmxpX3NpMTI4KEFCQ0RFRkdILCAyKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEFCQ0RFRkdILCBCQ0RFRkdIXyk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IF9tbV9hdmdfZXB1OChDREVGR0hfXywgQkNERUZHSF8pOworICBjb25zdCBfX20xMjhpIGF2ZzMgPSBfbW1fYXZnX2VwdTgoYXZnMSwgYXZnMik7CisgIGNvbnN0IF9fbTEyOGkgbHNiMSA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOChhdmcxLCBhdmcyKSwgb25lKTsKKyAgY29uc3QgX19tMTI4aSBhYiA9IF9tbV94b3Jfc2kxMjgoQUJDREVGR0gsIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBiYyA9IF9tbV94b3Jfc2kxMjgoQ0RFRkdIX18sIEJDREVGR0hfKTsKKyAgY29uc3QgX19tMTI4aSBhYmJjID0gX21tX29yX3NpMTI4KGFiLCBiYyk7CisgIGNvbnN0IF9fbTEyOGkgbHNiMiA9IF9tbV9hbmRfc2kxMjgoYWJiYywgbHNiMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnNCA9IF9tbV9zdWJzX2VwdTgoYXZnMywgbHNiMik7CisgIGNvbnN0IHVpbnQzMl90IGV4dHJhX291dCA9IF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzQsIDQpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDAgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKCAgICAgICAgICAgICAgIGF2ZzEgICAgKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMiggICAgICAgICAgICAgICBhdmc0ICAgICkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMiAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYXZnMSwgMSkpKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDMgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGF2ZzQsIDEpKSk7CisKKyAgLy8gdGhlc2UgdHdvIGFyZSBoYXJkIHRvIGdldCBhbmQgaXJyZWd1bGFyCisgIERTVCgzLCAyKSA9IChleHRyYV9vdXQgPj4gMCkgJiAweGZmOworICBEU1QoMywgMykgPSAoZXh0cmFfb3V0ID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkQ0X1NTRTIodWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7ICAvLyBEb3duLXJpZ2h0CisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsKKyAgY29uc3QgX19tMTI4aSBMS0pJWEFCQyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHRvcCAtIDUpKTsKKyAgY29uc3QgX19tMTI4aSBMS0pJWEFCQ0QgPSBfbW1faW5zZXJ0X2VwaTE2KExLSklYQUJDLCB0b3BbM10sIDQpOworICBjb25zdCBfX20xMjhpIEtKSVhBQkNEXyA9IF9tbV9zcmxpX3NpMTI4KExLSklYQUJDRCwgMSk7CisgIGNvbnN0IF9fbTEyOGkgSklYQUJDRF9fID0gX21tX3NybGlfc2kxMjgoTEtKSVhBQkNELCAyKTsKKyAgY29uc3QgX19tMTI4aSBhdmcxID0gX21tX2F2Z19lcHU4KEpJWEFCQ0RfXywgTEtKSVhBQkNEKTsKKyAgY29uc3QgX19tMTI4aSBsc2IgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoSklYQUJDRF9fLCBMS0pJWEFCQ0QpLCBvbmUpOworICBjb25zdCBfX20xMjhpIGF2ZzIgPSBfbW1fc3Vic19lcHU4KGF2ZzEsIGxzYik7CisgIGNvbnN0IF9fbTEyOGkgYWJjZGVmZyA9IF9tbV9hdmdfZXB1OChhdmcyLCBLSklYQUJDRF8pOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMyAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoICAgICAgICAgICAgICAgYWJjZGVmZyAgICApKTsKKyAgV2ViUFVpbnQzMlRvTWVtKGRzdCArIDIgKiBCUFMsIF9tbV9jdnRzaTEyOF9zaTMyKF9tbV9zcmxpX3NpMTI4KGFiY2RlZmcsIDEpKSk7CisgIFdlYlBVaW50MzJUb01lbShkc3QgKyAxICogQlBTLCBfbW1fY3Z0c2kxMjhfc2kzMihfbW1fc3JsaV9zaTEyOChhYmNkZWZnLCAyKSkpOworICBXZWJQVWludDMyVG9NZW0oZHN0ICsgMCAqIEJQUywgX21tX2N2dHNpMTI4X3NpMzIoX21tX3NybGlfc2kxMjgoYWJjZGVmZywgMykpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgSFU0X1NTRTIodWludDhfdCogZHN0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgY29uc3QgaW50IEkgPSB0b3BbLTJdOworICBjb25zdCBpbnQgSiA9IHRvcFstM107CisgIGNvbnN0IGludCBLID0gdG9wWy00XTsKKyAgY29uc3QgaW50IEwgPSB0b3BbLTVdOworICBEU1QoMCwgMCkgPSAgICAgICAgICAgICBBVkcyKEksIEopOworICBEU1QoMiwgMCkgPSBEU1QoMCwgMSkgPSBBVkcyKEosIEspOworICBEU1QoMiwgMSkgPSBEU1QoMCwgMikgPSBBVkcyKEssIEwpOworICBEU1QoMSwgMCkgPSAgICAgICAgICAgICBBVkczKEksIEosIEspOworICBEU1QoMywgMCkgPSBEU1QoMSwgMSkgPSBBVkczKEosIEssIEwpOworICBEU1QoMywgMSkgPSBEU1QoMSwgMikgPSBBVkczKEssIEwsIEwpOworICBEU1QoMywgMikgPSBEU1QoMiwgMikgPQorICBEU1QoMCwgMykgPSBEU1QoMSwgMykgPSBEU1QoMiwgMykgPSBEU1QoMywgMykgPSBMOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBIRDRfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBjb25zdCBpbnQgWCA9IHRvcFstMV07CisgIGNvbnN0IGludCBJID0gdG9wWy0yXTsKKyAgY29uc3QgaW50IEogPSB0b3BbLTNdOworICBjb25zdCBpbnQgSyA9IHRvcFstNF07CisgIGNvbnN0IGludCBMID0gdG9wWy01XTsKKyAgY29uc3QgaW50IEEgPSB0b3BbMF07CisgIGNvbnN0IGludCBCID0gdG9wWzFdOworICBjb25zdCBpbnQgQyA9IHRvcFsyXTsKKworICBEU1QoMCwgMCkgPSBEU1QoMiwgMSkgPSBBVkcyKEksIFgpOworICBEU1QoMCwgMSkgPSBEU1QoMiwgMikgPSBBVkcyKEosIEkpOworICBEU1QoMCwgMikgPSBEU1QoMiwgMykgPSBBVkcyKEssIEopOworICBEU1QoMCwgMykgICAgICAgICAgICAgPSBBVkcyKEwsIEspOworCisgIERTVCgzLCAwKSAgICAgICAgICAgICA9IEFWRzMoQSwgQiwgQyk7CisgIERTVCgyLCAwKSAgICAgICAgICAgICA9IEFWRzMoWCwgQSwgQik7CisgIERTVCgxLCAwKSA9IERTVCgzLCAxKSA9IEFWRzMoSSwgWCwgQSk7CisgIERTVCgxLCAxKSA9IERTVCgzLCAyKSA9IEFWRzMoSiwgSSwgWCk7CisgIERTVCgxLCAyKSA9IERTVCgzLCAzKSA9IEFWRzMoSywgSiwgSSk7CisgIERTVCgxLCAzKSAgICAgICAgICAgICA9IEFWRzMoTCwgSywgSik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFRNNF9TU0UyKHVpbnQ4X3QqIGRzdCwgY29uc3QgdWludDhfdCogdG9wKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG9wX3ZhbHVlcyA9IF9tbV9jdnRzaTMyX3NpMTI4KFdlYlBNZW1Ub1VpbnQzMih0b3ApKTsKKyAgY29uc3QgX19tMTI4aSB0b3BfYmFzZSA9IF9tbV91bnBhY2tsb19lcGk4KHRvcF92YWx1ZXMsIHplcm8pOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSwgZHN0ICs9IEJQUykgeworICAgIGNvbnN0IGludCB2YWwgPSB0b3BbLTIgLSB5XSAtIHRvcFstMV07CisgICAgY29uc3QgX19tMTI4aSBiYXNlID0gX21tX3NldDFfZXBpMTYodmFsKTsKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9wYWNrdXNfZXBpMTYoX21tX2FkZF9lcGkxNihiYXNlLCB0b3BfYmFzZSksIHplcm8pOworICAgIFdlYlBVaW50MzJUb01lbShkc3QsIF9tbV9jdnRzaTEyOF9zaTMyKG91dCkpOworICB9Cit9CisKKyN1bmRlZiBEU1QKKyN1bmRlZiBBVkczCisjdW5kZWYgQVZHMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbHVtYSA0eDQgcHJlZGljdGlvbgorCisvLyBMZWZ0IHNhbXBsZXMgYXJlIHRvcFstNSAuLiAtMl0sIHRvcF9sZWZ0IGlzIHRvcFstMV0sIHRvcCBhcmUKKy8vIGxvY2F0ZWQgYXQgdG9wWzAuLjNdLCBhbmQgdG9wIHJpZ2h0IGlzIHRvcFs0Li43XQorc3RhdGljIHZvaWQgSW50cmE0UHJlZHNfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIHRvcCkgeworICBEQzRfU1NFMihJNERDNCArIGRzdCwgdG9wKTsKKyAgVE00X1NTRTIoSTRUTTQgKyBkc3QsIHRvcCk7CisgIFZFNF9TU0UyKEk0VkU0ICsgZHN0LCB0b3ApOworICBIRTRfU1NFMihJNEhFNCArIGRzdCwgdG9wKTsKKyAgUkQ0X1NTRTIoSTRSRDQgKyBkc3QsIHRvcCk7CisgIFZSNF9TU0UyKEk0VlI0ICsgZHN0LCB0b3ApOworICBMRDRfU1NFMihJNExENCArIGRzdCwgdG9wKTsKKyAgVkw0X1NTRTIoSTRWTDQgKyBkc3QsIHRvcCk7CisgIEhENF9TU0UyKEk0SEQ0ICsgZHN0LCB0b3ApOworICBIVTRfU1NFMihJNEhVNCArIGRzdCwgdG9wKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENocm9tYSA4eDggcHJlZGljdGlvbiAocGFyYWdyYXBoIDEyLjIpCisKK3N0YXRpYyB2b2lkIEludHJhQ2hyb21hUHJlZHNfU1NFMih1aW50OF90KiBkc3QsIGNvbnN0IHVpbnQ4X3QqIGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wKSB7CisgIC8vIFUgYmxvY2sKKyAgREM4dXZNb2RlX1NTRTIoQzhEQzggKyBkc3QsIGxlZnQsIHRvcCk7CisgIFZlcnRpY2FsUHJlZF9TU0UyKEM4VkU4ICsgZHN0LCB0b3AsIDgpOworICBIb3Jpem9udGFsUHJlZF9TU0UyKEM4SEU4ICsgZHN0LCBsZWZ0LCA4KTsKKyAgVHJ1ZU1vdGlvbl9TU0UyKEM4VE04ICsgZHN0LCBsZWZ0LCB0b3AsIDgpOworICAvLyBWIGJsb2NrCisgIGRzdCArPSA4OworICBpZiAodG9wICE9IE5VTEwpIHRvcCArPSA4OworICBpZiAobGVmdCAhPSBOVUxMKSBsZWZ0ICs9IDE2OworICBEQzh1dk1vZGVfU1NFMihDOERDOCArIGRzdCwgbGVmdCwgdG9wKTsKKyAgVmVydGljYWxQcmVkX1NTRTIoQzhWRTggKyBkc3QsIHRvcCwgOCk7CisgIEhvcml6b250YWxQcmVkX1NTRTIoQzhIRTggKyBkc3QsIGxlZnQsIDgpOworICBUcnVlTW90aW9uX1NTRTIoQzhUTTggKyBkc3QsIGxlZnQsIHRvcCwgOCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBsdW1hIDE2eDE2IHByZWRpY3Rpb24gKHBhcmFncmFwaCAxMi4zKQorCitzdGF0aWMgdm9pZCBJbnRyYTE2UHJlZHNfU1NFMih1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBsZWZ0LCBjb25zdCB1aW50OF90KiB0b3ApIHsKKyAgREMxNk1vZGVfU1NFMihJMTZEQzE2ICsgZHN0LCBsZWZ0LCB0b3ApOworICBWZXJ0aWNhbFByZWRfU1NFMihJMTZWRTE2ICsgZHN0LCB0b3AsIDE2KTsKKyAgSG9yaXpvbnRhbFByZWRfU1NFMihJMTZIRTE2ICsgZHN0LCBsZWZ0LCAxNik7CisgIFRydWVNb3Rpb25fU1NFMihJMTZUTTE2ICsgZHN0LCBsZWZ0LCB0b3AsIDE2KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1ldHJpYworCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTdWJ0cmFjdEFuZEFjY3VtdWxhdGVfU1NFMihjb25zdCBfX20xMjhpIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBzdW0pIHsKKyAgLy8gdGFrZSBhYnMoYS1iKSBpbiA4YgorICBjb25zdCBfX20xMjhpIGFfYiA9IF9tbV9zdWJzX2VwdTgoYSwgYik7CisgIGNvbnN0IF9fbTEyOGkgYl9hID0gX21tX3N1YnNfZXB1OChiLCBhKTsKKyAgY29uc3QgX19tMTI4aSBhYnNfYV9iID0gX21tX29yX3NpMTI4KGFfYiwgYl9hKTsKKyAgLy8gemVyby1leHRlbmQgdG8gMTZiCisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fdW5wYWNrbG9fZXBpOChhYnNfYV9iLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2toaV9lcGk4KGFic19hX2IsIHplcm8pOworICAvLyBtdWx0aXBseSB3aXRoIHNlbGYKKyAgY29uc3QgX19tMTI4aSBzdW0xID0gX21tX21hZGRfZXBpMTYoQzAsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBzdW0yID0gX21tX21hZGRfZXBpMTYoQzEsIEMxKTsKKyAgKnN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtMSwgc3VtMik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgU1NFXzE2eE5fU1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGFpcnMpIHsKKyAgX19tMTI4aSBzdW0gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBpbnQzMl90IHRtcFs0XTsKKyAgaW50IGk7CisKKyAgZm9yIChpID0gMDsgaSA8IG51bV9wYWlyczsgKytpKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMV0pOworICAgIF9fbTEyOGkgc3VtMSwgc3VtMjsKKyAgICBTdWJ0cmFjdEFuZEFjY3VtdWxhdGVfU1NFMihhMCwgYjAsICZzdW0xKTsKKyAgICBTdWJ0cmFjdEFuZEFjY3VtdWxhdGVfU1NFMihhMSwgYjEsICZzdW0yKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgX21tX2FkZF9lcGkzMihzdW0xLCBzdW0yKSk7CisgICAgYSArPSAyICogQlBTOworICAgIGIgKz0gMiAqIEJQUzsKKyAgfQorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKK30KKworc3RhdGljIGludCBTU0UxNngxNl9TU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIFNTRV8xNnhOX1NTRTIoYSwgYiwgOCk7Cit9CisKK3N0YXRpYyBpbnQgU1NFMTZ4OF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGEsIGNvbnN0IHVpbnQ4X3QqIGIpIHsKKyAgcmV0dXJuIFNTRV8xNnhOX1NTRTIoYSwgYiwgNCk7Cit9CisKKyNkZWZpbmUgTE9BRF84eDE2YihwdHIpIFwKKyAgX21tX3VucGFja2xvX2VwaTgoX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikocHRyKSksIHplcm8pCisKK3N0YXRpYyBpbnQgU1NFOHg4X1NTRTIoY29uc3QgdWludDhfdCogYSwgY29uc3QgdWludDhfdCogYikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBpbnQgbnVtX3BhaXJzID0gNDsKKyAgX19tMTI4aSBzdW0gPSB6ZXJvOworICBpbnQzMl90IHRtcFs0XTsKKyAgd2hpbGUgKG51bV9wYWlycy0tID4gMCkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBMT0FEXzh4MTZiKCZhW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gTE9BRF84eDE2YigmYVtCUFMgKiAxXSk7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IExPQURfOHgxNmIoJmJbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBMT0FEXzh4MTZiKCZiW0JQUyAqIDFdKTsKKyAgICAvLyBzdWJ0cmFjdAorICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fc3Vic19lcGkxNihhMCwgYjApOworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fc3Vic19lcGkxNihhMSwgYjEpOworICAgIC8vIG11bHRpcGx5L2FjY3VtdWxhdGUgd2l0aCBzZWxmCisgICAgY29uc3QgX19tMTI4aSBkMCA9IF9tbV9tYWRkX2VwaTE2KGMwLCBjMCk7CisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9tYWRkX2VwaTE2KGMxLCBjMSk7CisgICAgLy8gY29sbGVjdAorICAgIGNvbnN0IF9fbTEyOGkgc3VtMDEgPSBfbW1fYWRkX2VwaTMyKGQwLCBkMSk7CisgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIHN1bTAxKTsKKyAgICBhICs9IDIgKiBCUFM7CisgICAgYiArPSAyICogQlBTOworICB9CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgc3VtKTsKKyAgcmV0dXJuICh0bXBbM10gKyB0bXBbMl0gKyB0bXBbMV0gKyB0bXBbMF0pOworfQorI3VuZGVmIExPQURfOHgxNmIKKworc3RhdGljIGludCBTU0U0eDRfU1NFMihjb25zdCB1aW50OF90KiBhLCBjb25zdCB1aW50OF90KiBiKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisKKyAgLy8gTG9hZCB2YWx1ZXMuIE5vdGUgdGhhdCB3ZSByZWFkIDggcGl4ZWxzIGluc3RlYWQgb2YgNCwKKyAgLy8gYnV0IHRoZSBhL2IgYnVmZmVycyBhcmUgb3Zlci1hbGxvY2F0ZWQgdG8gdGhhdCBlZmZlY3QuCisgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDBdKTsKKyAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmFbQlBTICogMV0pOworICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYVtCUFMgKiAyXSk7CisgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZhW0JQUyAqIDNdKTsKKyAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogMF0pOworICBjb25zdCBfX20xMjhpIGIxID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmYltCUFMgKiAxXSk7CisgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZiW0JQUyAqIDJdKTsKKyAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJmJbQlBTICogM10pOworICAvLyBDb21iaW5lIHBhaXIgb2YgbGluZXMuCisgIGNvbnN0IF9fbTEyOGkgYTAxID0gX21tX3VucGFja2xvX2VwaTMyKGEwLCBhMSk7CisgIGNvbnN0IF9fbTEyOGkgYTIzID0gX21tX3VucGFja2xvX2VwaTMyKGEyLCBhMyk7CisgIGNvbnN0IF9fbTEyOGkgYjAxID0gX21tX3VucGFja2xvX2VwaTMyKGIwLCBiMSk7CisgIGNvbnN0IF9fbTEyOGkgYjIzID0gX21tX3VucGFja2xvX2VwaTMyKGIyLCBiMyk7CisgIC8vIENvbnZlcnQgdG8gMTZiLgorICBjb25zdCBfX20xMjhpIGEwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChhMDEsIHplcm8pOworICBjb25zdCBfX20xMjhpIGEyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChhMjMsIHplcm8pOworICBjb25zdCBfX20xMjhpIGIwMXMgPSBfbW1fdW5wYWNrbG9fZXBpOChiMDEsIHplcm8pOworICBjb25zdCBfX20xMjhpIGIyM3MgPSBfbW1fdW5wYWNrbG9fZXBpOChiMjMsIHplcm8pOworICAvLyBzdWJ0cmFjdCwgc3F1YXJlIGFuZCBhY2N1bXVsYXRlCisgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3Vic19lcGkxNihhMDFzLCBiMDFzKTsKKyAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9zdWJzX2VwaTE2KGEyM3MsIGIyM3MpOworICBjb25zdCBfX20xMjhpIGUwID0gX21tX21hZGRfZXBpMTYoZDAsIGQwKTsKKyAgY29uc3QgX19tMTI4aSBlMSA9IF9tbV9tYWRkX2VwaTE2KGQxLCBkMSk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkzMihlMCwgZTEpOworCisgIGludDMyX3QgdG1wWzRdOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgIHJldHVybiAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgTWVhbjE2eDRfU1NFMihjb25zdCB1aW50OF90KiByZWYsIHVpbnQzMl90IGRjWzRdKSB7CisgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4MDBmZik7CisgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZWZbQlBTICogMF0pOworICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcmVmW0JQUyAqIDFdKTsKKyAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnJlZltCUFMgKiAyXSk7CisgIGNvbnN0IF9fbTEyOGkgYTMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyZWZbQlBTICogM10pOworICBjb25zdCBfX20xMjhpIGIwID0gX21tX3NybGlfZXBpMTYoYTAsIDgpOyAgICAgLy8gaGkgYnl0ZQorICBjb25zdCBfX20xMjhpIGIxID0gX21tX3NybGlfZXBpMTYoYTEsIDgpOworICBjb25zdCBfX20xMjhpIGIyID0gX21tX3NybGlfZXBpMTYoYTIsIDgpOworICBjb25zdCBfX20xMjhpIGIzID0gX21tX3NybGlfZXBpMTYoYTMsIDgpOworICBjb25zdCBfX20xMjhpIGMwID0gX21tX2FuZF9zaTEyOChhMCwgbWFzayk7ICAgLy8gbG8gYnl0ZQorICBjb25zdCBfX20xMjhpIGMxID0gX21tX2FuZF9zaTEyOChhMSwgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgYzIgPSBfbW1fYW5kX3NpMTI4KGEyLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBjMyA9IF9tbV9hbmRfc2kxMjgoYTMsIG1hc2spOworICBjb25zdCBfX20xMjhpIGQwID0gX21tX2FkZF9lcGkzMihiMCwgYzApOworICBjb25zdCBfX20xMjhpIGQxID0gX21tX2FkZF9lcGkzMihiMSwgYzEpOworICBjb25zdCBfX20xMjhpIGQyID0gX21tX2FkZF9lcGkzMihiMiwgYzIpOworICBjb25zdCBfX20xMjhpIGQzID0gX21tX2FkZF9lcGkzMihiMywgYzMpOworICBjb25zdCBfX20xMjhpIGUwID0gX21tX2FkZF9lcGkzMihkMCwgZDEpOworICBjb25zdCBfX20xMjhpIGUxID0gX21tX2FkZF9lcGkzMihkMiwgZDMpOworICBjb25zdCBfX20xMjhpIGYwID0gX21tX2FkZF9lcGkzMihlMCwgZTEpOworICB1aW50MTZfdCB0bXBbOF07CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKXRtcCwgZjApOworICBkY1swXSA9IHRtcFswXSArIHRtcFsxXTsKKyAgZGNbMV0gPSB0bXBbMl0gKyB0bXBbM107CisgIGRjWzJdID0gdG1wWzRdICsgdG1wWzVdOworICBkY1szXSA9IHRtcFs2XSArIHRtcFs3XTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRleHR1cmUgZGlzdG9ydGlvbgorLy8KKy8vIFdlIHRyeSB0byBtYXRjaCB0aGUgc3BlY3RyYWwgY29udGVudCAod2VpZ2h0ZWQpIGJldHdlZW4gc291cmNlIGFuZAorLy8gcmVjb25zdHJ1Y3RlZCBzYW1wbGVzLgorCisvLyBIYWRhbWFyZCB0cmFuc2Zvcm0KKy8vIFJldHVybnMgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdHJhbnNmb3JtZWQgY29lZmZpY2llbnRzLgorLy8gd1tdIGNvbnRhaW5zIGEgcm93LW1ham9yIDQgYnkgNCBzeW1tZXRyaWMgbWF0cml4Lgorc3RhdGljIGludCBUVHJhbnNmb3JtX1NTRTIoY29uc3QgdWludDhfdCogaW5BLCBjb25zdCB1aW50OF90KiBpbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQzMl90IHN1bVs0XTsKKyAgX19tMTI4aSB0bXBfMCwgdG1wXzEsIHRtcF8yLCB0bXBfMzsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKworICAvLyBMb2FkIGFuZCBjb21iaW5lIGlucHV0cy4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogMl0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5BXzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogM10pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzIgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMl0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogM10pOworCisgICAgLy8gQ29tYmluZSBpbkEgYW5kIGluQiAod2UnbGwgZG8gdHdvIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwpLgorICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8wID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8wLCBpbkJfMCk7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzEsIGluQl8xKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMiA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMiwgaW5CXzIpOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8zID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8zLCBpbkJfMyk7CisgICAgdG1wXzAgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzAsIHplcm8pOworICAgIHRtcF8xID0gX21tX3VucGFja2xvX2VwaTgoaW5BQl8xLCB6ZXJvKTsKKyAgICB0bXBfMiA9IF9tbV91bnBhY2tsb19lcGk4KGluQUJfMiwgemVybyk7CisgICAgdG1wXzMgPSBfbW1fdW5wYWNrbG9fZXBpOChpbkFCXzMsIHplcm8pOworICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworICB9CisKKyAgLy8gVmVydGljYWwgcGFzcyBmaXJzdCB0byBhdm9pZCBhIHRyYW5zcG9zZSAodmVydGljYWwgYW5kIGhvcml6b250YWwgcGFzc2VzCisgIC8vIGFyZSBjb21tdXRhdGl2ZSBiZWNhdXNlIHcva1dlaWdodFkgaXMgc3ltbWV0cmljKSBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBDYWxjdWxhdGUgYSBhbmQgYiAodHdvIDR4NCBhdCBvbmNlKS4KKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYWRkX2VwaTE2KGEwLCBhMSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hZGRfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3N1Yl9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3ViX2VwaTE2KGEwLCBhMSk7CisgICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2YigmYjAsICZiMSwgJmIyLCAmYjMsICZ0bXBfMCwgJnRtcF8xLCAmdG1wXzIsICZ0bXBfMyk7CisgIH0KKworICAvLyBIb3Jpem9udGFsIHBhc3MgYW5kIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3Vtcy4KKyAgeworICAgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgICBjb25zdCBfX20xMjhpIHdfMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJndbMF0pOworICAgIGNvbnN0IF9fbTEyOGkgd184ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmd1s4XSk7CisKKyAgICAvLyBDYWxjdWxhdGUgYSBhbmQgYiAodHdvIDR4NCBhdCBvbmNlKS4KKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYWRkX2VwaTE2KGEwLCBhMSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hZGRfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3N1Yl9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3ViX2VwaTE2KGEwLCBhMSk7CisKKyAgICAvLyBTZXBhcmF0ZSB0aGUgdHJhbnNmb3JtcyBvZiBpbkEgYW5kIGluQi4KKyAgICBfX20xMjhpIEFfYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYjAsIGIxKTsKKyAgICBfX20xMjhpIEFfYjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYjIsIGIzKTsKKyAgICBfX20xMjhpIEJfYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjAsIGIxKTsKKyAgICBfX20xMjhpIEJfYjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjIsIGIzKTsKKworICAgIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fc3ViX2VwaTE2KHplcm8sIEFfYjApOworICAgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9zdWJfZXBpMTYoemVybywgQV9iMik7CisgICAgICBjb25zdCBfX20xMjhpIGQyID0gX21tX3N1Yl9lcGkxNih6ZXJvLCBCX2IwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZDMgPSBfbW1fc3ViX2VwaTE2KHplcm8sIEJfYjIpOworICAgICAgQV9iMCA9IF9tbV9tYXhfZXBpMTYoQV9iMCwgZDApOyAgIC8vIGFicyh2KSwgMTZiCisgICAgICBBX2IyID0gX21tX21heF9lcGkxNihBX2IyLCBkMSk7CisgICAgICBCX2IwID0gX21tX21heF9lcGkxNihCX2IwLCBkMik7CisgICAgICBCX2IyID0gX21tX21heF9lcGkxNihCX2IyLCBkMyk7CisgICAgfQorCisgICAgLy8gd2VpZ2h0ZWQgc3VtcworICAgIEFfYjAgPSBfbW1fbWFkZF9lcGkxNihBX2IwLCB3XzApOworICAgIEFfYjIgPSBfbW1fbWFkZF9lcGkxNihBX2IyLCB3XzgpOworICAgIEJfYjAgPSBfbW1fbWFkZF9lcGkxNihCX2IwLCB3XzApOworICAgIEJfYjIgPSBfbW1fbWFkZF9lcGkxNihCX2IyLCB3XzgpOworICAgIEFfYjAgPSBfbW1fYWRkX2VwaTMyKEFfYjAsIEFfYjIpOworICAgIEJfYjAgPSBfbW1fYWRkX2VwaTMyKEJfYjAsIEJfYjIpOworCisgICAgLy8gZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zCisgICAgQV9iMCA9IF9tbV9zdWJfZXBpMzIoQV9iMCwgQl9iMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnN1bVswXSwgQV9iMCk7CisgIH0KKyAgcmV0dXJuIHN1bVswXSArIHN1bVsxXSArIHN1bVsyXSArIHN1bVszXTsKK30KKworc3RhdGljIGludCBEaXN0bzR4NF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGEsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgY29uc3QgaW50IGRpZmZfc3VtID0gVFRyYW5zZm9ybV9TU0UyKGEsIGIsIHcpOworICByZXR1cm4gYWJzKGRpZmZfc3VtKSA+PiA1OworfQorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50IEQgPSAwOworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8IDE2ICogQlBTOyB5ICs9IDQgKiBCUFMpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgMTY7IHggKz0gNCkgeworICAgICAgRCArPSBEaXN0bzR4NF9TU0UyKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6YXRpb24KKy8vCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgRG9RdWFudGl6ZUJsb2NrX1NTRTIoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHNoYXJwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGNvbnN0IF9fbTEyOGkgbWF4X2NvZWZmXzIwNDcgPSBfbW1fc2V0MV9lcGkxNihNQVhfTEVWRUwpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBfX20xMjhpIGNvZWZmMCwgY29lZmY4OworICBfX20xMjhpIG91dDAsIG91dDg7CisgIF9fbTEyOGkgcGFja2VkX291dDsKKworICAvLyBMb2FkIGFsbCBpbnB1dHMuCisgIF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmaW5bMF0pOworICBfX20xMjhpIGluOCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzhdKTsKKyAgY29uc3QgX19tMTI4aSBpcTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmlxX1swXSk7CisgIGNvbnN0IF9fbTEyOGkgaXE4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5pcV9bOF0pOworICBjb25zdCBfX20xMjhpIHEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5xX1swXSk7CisgIGNvbnN0IF9fbTEyOGkgcTggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPnFfWzhdKTsKKworICAvLyBleHRyYWN0IHNpZ24oaW4pICAoMHgwMDAwIGlmIHBvc2l0aXZlLCAweGZmZmYgaWYgbmVnYXRpdmUpCisgIGNvbnN0IF9fbTEyOGkgc2lnbjAgPSBfbW1fY21wZ3RfZXBpMTYoemVybywgaW4wKTsKKyAgY29uc3QgX19tMTI4aSBzaWduOCA9IF9tbV9jbXBndF9lcGkxNih6ZXJvLCBpbjgpOworCisgIC8vIGNvZWZmID0gYWJzKGluKSA9IChpbiBeIHNpZ24pIC0gc2lnbgorICBjb2VmZjAgPSBfbW1feG9yX3NpMTI4KGluMCwgc2lnbjApOworICBjb2VmZjggPSBfbW1feG9yX3NpMTI4KGluOCwgc2lnbjgpOworICBjb2VmZjAgPSBfbW1fc3ViX2VwaTE2KGNvZWZmMCwgc2lnbjApOworICBjb2VmZjggPSBfbW1fc3ViX2VwaTE2KGNvZWZmOCwgc2lnbjgpOworCisgIC8vIGNvZWZmID0gYWJzKGluKSArIHNoYXJwZW4KKyAgaWYgKHNoYXJwZW4gIT0gTlVMTCkgeworICAgIGNvbnN0IF9fbTEyOGkgc2hhcnBlbjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzaGFycGVuWzBdKTsKKyAgICBjb25zdCBfX20xMjhpIHNoYXJwZW44ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc2hhcnBlbls4XSk7CisgICAgY29lZmYwID0gX21tX2FkZF9lcGkxNihjb2VmZjAsIHNoYXJwZW4wKTsKKyAgICBjb2VmZjggPSBfbW1fYWRkX2VwaTE2KGNvZWZmOCwgc2hhcnBlbjgpOworICB9CisKKyAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKSA+PiBRRklYCisgIHsKKyAgICAvLyBkb2luZyBjYWxjdWxhdGlvbnMgd2l0aCAzMmIgcHJlY2lzaW9uIChRRklYPTE3KQorICAgIC8vIG91dCA9IChjb2VmZiAqIGlRKQorICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVEwSCA9IF9tbV9tdWxoaV9lcHUxNihjb2VmZjAsIGlxMCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUTBMID0gX21tX211bGxvX2VwaTE2KGNvZWZmMCwgaXEwKTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lROEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmY4LCBpcTgpOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVE4TCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjgsIGlxOCk7CisgICAgX19tMTI4aSBvdXRfMDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7CisgICAgX19tMTI4aSBvdXRfMDQgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVEwTCwgY29lZmZfaVEwSCk7CisgICAgX19tMTI4aSBvdXRfMDggPSBfbW1fdW5wYWNrbG9fZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7CisgICAgX19tMTI4aSBvdXRfMTIgPSBfbW1fdW5wYWNraGlfZXBpMTYoY29lZmZfaVE4TCwgY29lZmZfaVE4SCk7CisgICAgLy8gb3V0ID0gKGNvZWZmICogaVEgKyBCKQorICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wNCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bNF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18wOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bOF0pOworICAgIGNvbnN0IF9fbTEyOGkgYmlhc18xMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+Ymlhc19bMTJdKTsKKyAgICBvdXRfMDAgPSBfbW1fYWRkX2VwaTMyKG91dF8wMCwgYmlhc18wMCk7CisgICAgb3V0XzA0ID0gX21tX2FkZF9lcGkzMihvdXRfMDQsIGJpYXNfMDQpOworICAgIG91dF8wOCA9IF9tbV9hZGRfZXBpMzIob3V0XzA4LCBiaWFzXzA4KTsKKyAgICBvdXRfMTIgPSBfbW1fYWRkX2VwaTMyKG91dF8xMiwgYmlhc18xMik7CisgICAgLy8gb3V0ID0gUVVBTlRESVYoY29lZmYsIGlRLCBCLCBRRklYKQorICAgIG91dF8wMCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wMCwgUUZJWCk7CisgICAgb3V0XzA0ID0gX21tX3NyYWlfZXBpMzIob3V0XzA0LCBRRklYKTsKKyAgICBvdXRfMDggPSBfbW1fc3JhaV9lcGkzMihvdXRfMDgsIFFGSVgpOworICAgIG91dF8xMiA9IF9tbV9zcmFpX2VwaTMyKG91dF8xMiwgUUZJWCk7CisKKyAgICAvLyBwYWNrIHJlc3VsdCBhcyAxNmIKKyAgICBvdXQwID0gX21tX3BhY2tzX2VwaTMyKG91dF8wMCwgb3V0XzA0KTsKKyAgICBvdXQ4ID0gX21tX3BhY2tzX2VwaTMyKG91dF8wOCwgb3V0XzEyKTsKKworICAgIC8vIGlmIChjb2VmZiA+IDIwNDcpIGNvZWZmID0gMjA0NworICAgIG91dDAgPSBfbW1fbWluX2VwaTE2KG91dDAsIG1heF9jb2VmZl8yMDQ3KTsKKyAgICBvdXQ4ID0gX21tX21pbl9lcGkxNihvdXQ4LCBtYXhfY29lZmZfMjA0Nyk7CisgIH0KKworICAvLyBnZXQgc2lnbiBiYWNrIChpZiAoc2lnbltqXSkgb3V0X24gPSAtb3V0X24pCisgIG91dDAgPSBfbW1feG9yX3NpMTI4KG91dDAsIHNpZ24wKTsKKyAgb3V0OCA9IF9tbV94b3Jfc2kxMjgob3V0OCwgc2lnbjgpOworICBvdXQwID0gX21tX3N1Yl9lcGkxNihvdXQwLCBzaWduMCk7CisgIG91dDggPSBfbW1fc3ViX2VwaTE2KG91dDgsIHNpZ244KTsKKworICAvLyBpbiA9IG91dCAqIFEKKyAgaW4wID0gX21tX211bGxvX2VwaTE2KG91dDAsIHEwKTsKKyAgaW44ID0gX21tX211bGxvX2VwaTE2KG91dDgsIHE4KTsKKworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmaW5bMF0sIGluMCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSwgaW44KTsKKworICAvLyB6aWd6YWcgdGhlIG91dHB1dCBiZWZvcmUgc3RvcmluZyBpdC4KKyAgLy8KKyAgLy8gVGhlIHppZ3phZyBwYXR0ZXJuIGNhbiBhbG1vc3QgYmUgcmVwcm9kdWNlZCB3aXRoIGEgc21hbGwgc2VxdWVuY2Ugb2YKKyAgLy8gc2h1ZmZsZXMuIEFmdGVyIGl0LCB3ZSBvbmx5IG5lZWQgdG8gc3dhcCB0aGUgN3RoIChlbmRpbmcgdXAgaW4gdGhpcmQKKyAgLy8gcG9zaXRpb24gaW5zdGVhZCBvZiB0d2VsZnRoKSBhbmQgOHRoIHZhbHVlcy4KKyAgeworICAgIF9fbTEyOGkgb3V0WjAsIG91dFo4OworICAgIG91dFowID0gX21tX3NodWZmbGVoaV9lcGkxNihvdXQwLCAgX01NX1NIVUZGTEUoMiwgMSwgMywgMCkpOworICAgIG91dFowID0gX21tX3NodWZmbGVfZXBpMzIgIChvdXRaMCwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkpOworICAgIG91dFowID0gX21tX3NodWZmbGVoaV9lcGkxNihvdXRaMCwgX01NX1NIVUZGTEUoMywgMSwgMCwgMikpOworICAgIG91dFo4ID0gX21tX3NodWZmbGVsb19lcGkxNihvdXQ4LCAgX01NX1NIVUZGTEUoMywgMCwgMiwgMSkpOworICAgIG91dFo4ID0gX21tX3NodWZmbGVfZXBpMzIgIChvdXRaOCwgX01NX1NIVUZGTEUoMywgMSwgMiwgMCkpOworICAgIG91dFo4ID0gX21tX3NodWZmbGVsb19lcGkxNihvdXRaOCwgX01NX1NIVUZGTEUoMSwgMywgMiwgMCkpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIG91dFowKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzhdLCBvdXRaOCk7CisgICAgcGFja2VkX291dCA9IF9tbV9wYWNrc19lcGkxNihvdXRaMCwgb3V0WjgpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQxNl90IG91dFpfMTIgPSBvdXRbMTJdOworICAgIGNvbnN0IGludDE2X3Qgb3V0Wl8zID0gb3V0WzNdOworICAgIG91dFszXSA9IG91dFpfMTI7CisgICAgb3V0WzEyXSA9IG91dFpfMzsKKyAgfQorCisgIC8vIGRldGVjdCBpZiBhbGwgJ291dCcgdmFsdWVzIGFyZSB6ZXJvZXMgb3Igbm90CisgIHJldHVybiAoX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTgocGFja2VkX291dCwgemVybykpICE9IDB4ZmZmZik7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja19TU0UyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICByZXR1cm4gRG9RdWFudGl6ZUJsb2NrX1NTRTIoaW4sIG91dCwgJm10eC0+c2hhcnBlbl9bMF0sIG10eCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemVCbG9ja1dIVF9TU0UyKGludDE2X3QgaW5bMTZdLCBpbnQxNl90IG91dFsxNl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICByZXR1cm4gRG9RdWFudGl6ZUJsb2NrX1NTRTIoaW4sIG91dCwgTlVMTCwgbXR4KTsKK30KKworc3RhdGljIGludCBRdWFudGl6ZTJCbG9ja3NfU1NFMihpbnQxNl90IGluWzMyXSwgaW50MTZfdCBvdXRbMzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuID0gJm10eC0+c2hhcnBlbl9bMF07CisgIG56ICA9IERvUXVhbnRpemVCbG9ja19TU0UyKGluICsgMCAqIDE2LCBvdXQgKyAwICogMTYsIHNoYXJwZW4sIG10eCkgPDwgMDsKKyAgbnogfD0gRG9RdWFudGl6ZUJsb2NrX1NTRTIoaW4gKyAxICogMTYsIG91dCArIDEgKiAxNiwgc2hhcnBlbiwgbXR4KSA8PCAxOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhFbmNEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOEVuY0RzcEluaXRTU0UyKHZvaWQpIHsKKyAgVlA4Q29sbGVjdEhpc3RvZ3JhbSA9IENvbGxlY3RIaXN0b2dyYW1fU1NFMjsKKyAgVlA4RW5jUHJlZEx1bWExNiA9IEludHJhMTZQcmVkc19TU0UyOworICBWUDhFbmNQcmVkQ2hyb21hOCA9IEludHJhQ2hyb21hUHJlZHNfU1NFMjsKKyAgVlA4RW5jUHJlZEx1bWE0ID0gSW50cmE0UHJlZHNfU1NFMjsKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfU1NFMjsKKyAgVlA4RW5jUXVhbnRpemUyQmxvY2tzID0gUXVhbnRpemUyQmxvY2tzX1NTRTI7CisgIFZQOEVuY1F1YW50aXplQmxvY2tXSFQgPSBRdWFudGl6ZUJsb2NrV0hUX1NTRTI7CisgIFZQOElUcmFuc2Zvcm0gPSBJVHJhbnNmb3JtX1NTRTI7CisgIFZQOEZUcmFuc2Zvcm0gPSBGVHJhbnNmb3JtX1NTRTI7CisgIFZQOEZUcmFuc2Zvcm0yID0gRlRyYW5zZm9ybTJfU1NFMjsKKyAgVlA4RlRyYW5zZm9ybVdIVCA9IEZUcmFuc2Zvcm1XSFRfU1NFMjsKKyAgVlA4U1NFMTZ4MTYgPSBTU0UxNngxNl9TU0UyOworICBWUDhTU0UxNng4ID0gU1NFMTZ4OF9TU0UyOworICBWUDhTU0U4eDggPSBTU0U4eDhfU1NFMjsKKyAgVlA4U1NFNHg0ID0gU1NFNHg0X1NTRTI7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X1NTRTI7CisgIFZQOFREaXN0bzE2eDE2ID0gRGlzdG8xNngxNl9TU0UyOworICBWUDhNZWFuMTZ4NCA9IE1lYW4xNng0X1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RW5jRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9lbmNfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFkZTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZW5jX3NzZTQxLmMKQEAgLTAsMCArMSwzNDQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0IHZlcnNpb24gb2Ygc29tZSBlbmNvZGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlMi5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbXB1dGUgc3VzY2VwdGliaWxpdHkgYmFzZWQgb24gRENULWNvZWZmIGhpc3RvZ3JhbXMuCisKK3N0YXRpYyB2b2lkIENvbGxlY3RIaXN0b2dyYW1fU1NFNDEoY29uc3QgdWludDhfdCogcmVmLCBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfYmxvY2ssIGludCBlbmRfYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgY29uc3QgX19tMTI4aSBtYXhfY29lZmZfdGhyZXNoID0gX21tX3NldDFfZXBpMTYoTUFYX0NPRUZGX1RIUkVTSCk7CisgIGludCBqOworICBpbnQgZGlzdHJpYnV0aW9uW01BWF9DT0VGRl9USFJFU0ggKyAxXSA9IHsgMCB9OworICBmb3IgKGogPSBzdGFydF9ibG9jazsgaiA8IGVuZF9ibG9jazsgKytqKSB7CisgICAgaW50MTZfdCBvdXRbMTZdOworICAgIGludCBrOworCisgICAgVlA4RlRyYW5zZm9ybShyZWYgKyBWUDhEc3BTY2FuW2pdLCBwcmVkICsgVlA4RHNwU2NhbltqXSwgb3V0KTsKKworICAgIC8vIENvbnZlcnQgY29lZmZpY2llbnRzIHRvIGJpbiAod2l0aGluIG91dFtdKS4KKyAgICB7CisgICAgICAvLyBMb2FkLgorICAgICAgY29uc3QgX19tMTI4aSBvdXQwID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0MSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSk7CisgICAgICAvLyB2ID0gYWJzKG91dCkgPj4gMworICAgICAgY29uc3QgX19tMTI4aSBhYnMwID0gX21tX2Fic19lcGkxNihvdXQwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgYWJzMSA9IF9tbV9hYnNfZXBpMTYob3V0MSk7CisgICAgICBjb25zdCBfX20xMjhpIHYwID0gX21tX3NyYWlfZXBpMTYoYWJzMCwgMyk7CisgICAgICBjb25zdCBfX20xMjhpIHYxID0gX21tX3NyYWlfZXBpMTYoYWJzMSwgMyk7CisgICAgICAvLyBiaW4gPSBtaW4odiwgTUFYX0NPRUZGX1RIUkVTSCkKKyAgICAgIGNvbnN0IF9fbTEyOGkgYmluMCA9IF9tbV9taW5fZXBpMTYodjAsIG1heF9jb2VmZl90aHJlc2gpOworICAgICAgY29uc3QgX19tMTI4aSBiaW4xID0gX21tX21pbl9lcGkxNih2MSwgbWF4X2NvZWZmX3RocmVzaCk7CisgICAgICAvLyBTdG9yZS4KKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbMF0sIGJpbjApOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFs4XSwgYmluMSk7CisgICAgfQorCisgICAgLy8gQ29udmVydCBjb2VmZmljaWVudHMgdG8gYmluLgorICAgIGZvciAoayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgICArK2Rpc3RyaWJ1dGlvbltvdXRba11dOworICAgIH0KKyAgfQorICBWUDhTZXRIaXN0b2dyYW1EYXRhKGRpc3RyaWJ1dGlvbiwgaGlzdG8pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGV4dHVyZSBkaXN0b3J0aW9uCisvLworLy8gV2UgdHJ5IHRvIG1hdGNoIHRoZSBzcGVjdHJhbCBjb250ZW50ICh3ZWlnaHRlZCkgYmV0d2VlbiBzb3VyY2UgYW5kCisvLyByZWNvbnN0cnVjdGVkIHNhbXBsZXMuCisKKy8vIEhhZGFtYXJkIHRyYW5zZm9ybQorLy8gUmV0dXJucyB0aGUgd2VpZ2h0ZWQgc3VtIG9mIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0cmFuc2Zvcm1lZCBjb2VmZmljaWVudHMuCisvLyB3W10gY29udGFpbnMgYSByb3ctbWFqb3IgNCBieSA0IHN5bW1ldHJpYyBtYXRyaXguCitzdGF0aWMgaW50IFRUcmFuc2Zvcm1fU1NFNDEoY29uc3QgdWludDhfdCogaW5BLCBjb25zdCB1aW50OF90KiBpbkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHcpIHsKKyAgaW50MzJfdCBzdW1bNF07CisgIF9fbTEyOGkgdG1wXzAsIHRtcF8xLCB0bXBfMiwgdG1wXzM7CisKKyAgLy8gTG9hZCBhbmQgY29tYmluZSBpbnB1dHMuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIGluQV8wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDBdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQV8xID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIGluQV8yID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5BW0JQUyAqIDJdKTsKKyAgICAvLyBJbiBTU0U0LjEsIHdpdGggZ2NjIDQuOCBhdCBsZWFzdCAobWF5YmUgb3RoZXIgdmVyc2lvbnMpLAorICAgIC8vIF9tbV9sb2FkdV9zaTEyOCBpcyBmYXN0ZXIgdGhhbiBfbW1fbG9hZGxfZXBpNjQuIEJ1dCBmb3IgdGhlIGxhc3QgbHVtcAorICAgIC8vIG9mIGluQSBhbmQgaW5CLCBfbW1fbG9hZGxfZXBpNjQgaXMgc3RpbGwgdXNlZCBub3QgdG8gaGF2ZSBhbiBvdXQgb2YKKyAgICAvLyBib3VuZCByZWFkLgorICAgIGNvbnN0IF9fbTEyOGkgaW5BXzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkFbQlBTICogM10pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMF0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMV0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogMl0pOworICAgIGNvbnN0IF9fbTEyOGkgaW5CXzMgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbkJbQlBTICogM10pOworCisgICAgLy8gQ29tYmluZSBpbkEgYW5kIGluQiAod2UnbGwgZG8gdHdvIHRyYW5zZm9ybXMgaW4gcGFyYWxsZWwpLgorICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8wID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8wLCBpbkJfMCk7CisgICAgY29uc3QgX19tMTI4aSBpbkFCXzEgPSBfbW1fdW5wYWNrbG9fZXBpMzIoaW5BXzEsIGluQl8xKTsKKyAgICBjb25zdCBfX20xMjhpIGluQUJfMiA9IF9tbV91bnBhY2tsb19lcGkzMihpbkFfMiwgaW5CXzIpOworICAgIGNvbnN0IF9fbTEyOGkgaW5BQl8zID0gX21tX3VucGFja2xvX2VwaTMyKGluQV8zLCBpbkJfMyk7CisgICAgdG1wXzAgPSBfbW1fY3Z0ZXB1OF9lcGkxNihpbkFCXzApOworICAgIHRtcF8xID0gX21tX2N2dGVwdThfZXBpMTYoaW5BQl8xKTsKKyAgICB0bXBfMiA9IF9tbV9jdnRlcHU4X2VwaTE2KGluQUJfMik7CisgICAgdG1wXzMgPSBfbW1fY3Z0ZXB1OF9lcGkxNihpbkFCXzMpOworICAgIC8vIGEwMCBhMDEgYTAyIGEwMyAgIGIwMCBiMDEgYjAyIGIwMworICAgIC8vIGExMCBhMTEgYTEyIGExMyAgIGIxMCBiMTEgYjEyIGIxMworICAgIC8vIGEyMCBhMjEgYTIyIGEyMyAgIGIyMCBiMjEgYjIyIGIyMworICAgIC8vIGEzMCBhMzEgYTMyIGEzMyAgIGIzMCBiMzEgYjMyIGIzMworICB9CisKKyAgLy8gVmVydGljYWwgcGFzcyBmaXJzdCB0byBhdm9pZCBhIHRyYW5zcG9zZSAodmVydGljYWwgYW5kIGhvcml6b250YWwgcGFzc2VzCisgIC8vIGFyZSBjb21tdXRhdGl2ZSBiZWNhdXNlIHcva1dlaWdodFkgaXMgc3ltbWV0cmljKSBhbmQgc3Vic2VxdWVudCB0cmFuc3Bvc2UuCisgIHsKKyAgICAvLyBDYWxjdWxhdGUgYSBhbmQgYiAodHdvIDR4NCBhdCBvbmNlKS4KKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYWRkX2VwaTE2KGEwLCBhMSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hZGRfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3N1Yl9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3ViX2VwaTE2KGEwLCBhMSk7CisgICAgLy8gYTAwIGEwMSBhMDIgYTAzICAgYjAwIGIwMSBiMDIgYjAzCisgICAgLy8gYTEwIGExMSBhMTIgYTEzICAgYjEwIGIxMSBiMTIgYjEzCisgICAgLy8gYTIwIGEyMSBhMjIgYTIzICAgYjIwIGIyMSBiMjIgYjIzCisgICAgLy8gYTMwIGEzMSBhMzIgYTMzICAgYjMwIGIzMSBiMzIgYjMzCisKKyAgICAvLyBUcmFuc3Bvc2UgdGhlIHR3byA0eDQuCisgICAgVlA4VHJhbnNwb3NlXzJfNHg0XzE2YigmYjAsICZiMSwgJmIyLCAmYjMsICZ0bXBfMCwgJnRtcF8xLCAmdG1wXzIsICZ0bXBfMyk7CisgIH0KKworICAvLyBIb3Jpem9udGFsIHBhc3MgYW5kIGRpZmZlcmVuY2Ugb2Ygd2VpZ2h0ZWQgc3Vtcy4KKyAgeworICAgIC8vIExvYWQgYWxsIGlucHV0cy4KKyAgICBjb25zdCBfX20xMjhpIHdfMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJndbMF0pOworICAgIGNvbnN0IF9fbTEyOGkgd184ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmd1s4XSk7CisKKyAgICAvLyBDYWxjdWxhdGUgYSBhbmQgYiAodHdvIDR4NCBhdCBvbmNlKS4KKyAgICBjb25zdCBfX20xMjhpIGEwID0gX21tX2FkZF9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYTEgPSBfbW1fYWRkX2VwaTE2KHRtcF8xLCB0bXBfMyk7CisgICAgY29uc3QgX19tMTI4aSBhMiA9IF9tbV9zdWJfZXBpMTYodG1wXzEsIHRtcF8zKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX3N1Yl9lcGkxNih0bXBfMCwgdG1wXzIpOworICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fYWRkX2VwaTE2KGEwLCBhMSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hZGRfZXBpMTYoYTMsIGEyKTsKKyAgICBjb25zdCBfX20xMjhpIGIyID0gX21tX3N1Yl9lcGkxNihhMywgYTIpOworICAgIGNvbnN0IF9fbTEyOGkgYjMgPSBfbW1fc3ViX2VwaTE2KGEwLCBhMSk7CisKKyAgICAvLyBTZXBhcmF0ZSB0aGUgdHJhbnNmb3JtcyBvZiBpbkEgYW5kIGluQi4KKyAgICBfX20xMjhpIEFfYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYjAsIGIxKTsKKyAgICBfX20xMjhpIEFfYjIgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYjIsIGIzKTsKKyAgICBfX20xMjhpIEJfYjAgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjAsIGIxKTsKKyAgICBfX20xMjhpIEJfYjIgPSBfbW1fdW5wYWNraGlfZXBpNjQoYjIsIGIzKTsKKworICAgIEFfYjAgPSBfbW1fYWJzX2VwaTE2KEFfYjApOworICAgIEFfYjIgPSBfbW1fYWJzX2VwaTE2KEFfYjIpOworICAgIEJfYjAgPSBfbW1fYWJzX2VwaTE2KEJfYjApOworICAgIEJfYjIgPSBfbW1fYWJzX2VwaTE2KEJfYjIpOworCisgICAgLy8gd2VpZ2h0ZWQgc3VtcworICAgIEFfYjAgPSBfbW1fbWFkZF9lcGkxNihBX2IwLCB3XzApOworICAgIEFfYjIgPSBfbW1fbWFkZF9lcGkxNihBX2IyLCB3XzgpOworICAgIEJfYjAgPSBfbW1fbWFkZF9lcGkxNihCX2IwLCB3XzApOworICAgIEJfYjIgPSBfbW1fbWFkZF9lcGkxNihCX2IyLCB3XzgpOworICAgIEFfYjAgPSBfbW1fYWRkX2VwaTMyKEFfYjAsIEFfYjIpOworICAgIEJfYjAgPSBfbW1fYWRkX2VwaTMyKEJfYjAsIEJfYjIpOworCisgICAgLy8gZGlmZmVyZW5jZSBvZiB3ZWlnaHRlZCBzdW1zCisgICAgQV9iMiA9IF9tbV9zdWJfZXBpMzIoQV9iMCwgQl9iMCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJnN1bVswXSwgQV9iMik7CisgIH0KKyAgcmV0dXJuIHN1bVswXSArIHN1bVsxXSArIHN1bVsyXSArIHN1bVszXTsKK30KKworc3RhdGljIGludCBEaXN0bzR4NF9TU0U0MShjb25zdCB1aW50OF90KiBjb25zdCBhLCBjb25zdCB1aW50OF90KiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBjb25zdCBpbnQgZGlmZl9zdW0gPSBUVHJhbnNmb3JtX1NTRTQxKGEsIGIsIHcpOworICByZXR1cm4gYWJzKGRpZmZfc3VtKSA+PiA1OworfQorCitzdGF0aWMgaW50IERpc3RvMTZ4MTZfU1NFNDEoY29uc3QgdWludDhfdCogY29uc3QgYSwgY29uc3QgdWludDhfdCogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgdykgeworICBpbnQgRCA9IDA7CisgIGludCB4LCB5OworICBmb3IgKHkgPSAwOyB5IDwgMTYgKiBCUFM7IHkgKz0gNCAqIEJQUykgeworICAgIGZvciAoeCA9IDA7IHggPCAxNjsgeCArPSA0KSB7CisgICAgICBEICs9IERpc3RvNHg0X1NTRTQxKGEgKyB4ICsgeSwgYiArIHggKyB5LCB3KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEQ7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6YXRpb24KKy8vCisKKy8vIEdlbmVyYXRlcyBhIHBzaHVmYiBjb25zdGFudCBmb3Igc2h1ZmZsaW5nIDE2YiB3b3Jkcy4KKyNkZWZpbmUgUFNIVUZCX0NTVChBLEIsQyxELEUsRixHLEgpIFwKKyAgX21tX3NldF9lcGk4KDIgKiAoSCkgKyAxLCAyICogKEgpICsgMCwgMiAqIChHKSArIDEsIDIgKiAoRykgKyAwLCBcCisgICAgICAgICAgICAgICAyICogKEYpICsgMSwgMiAqIChGKSArIDAsIDIgKiAoRSkgKyAxLCAyICogKEUpICsgMCwgXAorICAgICAgICAgICAgICAgMiAqIChEKSArIDEsIDIgKiAoRCkgKyAwLCAyICogKEMpICsgMSwgMiAqIChDKSArIDAsIFwKKyAgICAgICAgICAgICAgIDIgKiAoQikgKyAxLCAyICogKEIpICsgMCwgMiAqIChBKSArIDEsIDIgKiAoQSkgKyAwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IERvUXVhbnRpemVCbG9ja19TU0U0MShpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IHNoYXJwZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBjb25zdCBfX20xMjhpIG1heF9jb2VmZl8yMDQ3ID0gX21tX3NldDFfZXBpMTYoTUFYX0xFVkVMKTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgX19tMTI4aSBvdXQwLCBvdXQ4OworICBfX20xMjhpIHBhY2tlZF9vdXQ7CisKKyAgLy8gTG9hZCBhbGwgaW5wdXRzLgorICBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmluWzBdKTsKKyAgX19tMTI4aSBpbjggPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZpbls4XSk7CisgIGNvbnN0IF9fbTEyOGkgaXEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5pcV9bMF0pOworICBjb25zdCBfX20xMjhpIGlxOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+aXFfWzhdKTsKKyAgY29uc3QgX19tMTI4aSBxMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm10eC0+cV9bMF0pOworICBjb25zdCBfX20xMjhpIHE4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmbXR4LT5xX1s4XSk7CisKKyAgLy8gY29lZmYgPSBhYnMoaW4pCisgIF9fbTEyOGkgY29lZmYwID0gX21tX2Fic19lcGkxNihpbjApOworICBfX20xMjhpIGNvZWZmOCA9IF9tbV9hYnNfZXBpMTYoaW44KTsKKworICAvLyBjb2VmZiA9IGFicyhpbikgKyBzaGFycGVuCisgIGlmIChzaGFycGVuICE9IE5VTEwpIHsKKyAgICBjb25zdCBfX20xMjhpIHNoYXJwZW4wID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc2hhcnBlblswXSk7CisgICAgY29uc3QgX19tMTI4aSBzaGFycGVuOCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNoYXJwZW5bOF0pOworICAgIGNvZWZmMCA9IF9tbV9hZGRfZXBpMTYoY29lZmYwLCBzaGFycGVuMCk7CisgICAgY29lZmY4ID0gX21tX2FkZF9lcGkxNihjb2VmZjgsIHNoYXJwZW44KTsKKyAgfQorCisgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikgPj4gUUZJWAorICB7CisgICAgLy8gZG9pbmcgY2FsY3VsYXRpb25zIHdpdGggMzJiIHByZWNpc2lvbiAoUUZJWD0xNykKKyAgICAvLyBvdXQgPSAoY29lZmYgKiBpUSkKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lRMEggPSBfbW1fbXVsaGlfZXB1MTYoY29lZmYwLCBpcTApOworICAgIGNvbnN0IF9fbTEyOGkgY29lZmZfaVEwTCA9IF9tbV9tdWxsb19lcGkxNihjb2VmZjAsIGlxMCk7CisgICAgY29uc3QgX19tMTI4aSBjb2VmZl9pUThIID0gX21tX211bGhpX2VwdTE2KGNvZWZmOCwgaXE4KTsKKyAgICBjb25zdCBfX20xMjhpIGNvZWZmX2lROEwgPSBfbW1fbXVsbG9fZXBpMTYoY29lZmY4LCBpcTgpOworICAgIF9fbTEyOGkgb3V0XzAwID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOworICAgIF9fbTEyOGkgb3V0XzA0ID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lRMEwsIGNvZWZmX2lRMEgpOworICAgIF9fbTEyOGkgb3V0XzA4ID0gX21tX3VucGFja2xvX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOworICAgIF9fbTEyOGkgb3V0XzEyID0gX21tX3VucGFja2hpX2VwaTE2KGNvZWZmX2lROEwsIGNvZWZmX2lROEgpOworICAgIC8vIG91dCA9IChjb2VmZiAqIGlRICsgQikKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzBdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzRdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMDggPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzhdKTsKKyAgICBjb25zdCBfX20xMjhpIGJpYXNfMTIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZtdHgtPmJpYXNfWzEyXSk7CisgICAgb3V0XzAwID0gX21tX2FkZF9lcGkzMihvdXRfMDAsIGJpYXNfMDApOworICAgIG91dF8wNCA9IF9tbV9hZGRfZXBpMzIob3V0XzA0LCBiaWFzXzA0KTsKKyAgICBvdXRfMDggPSBfbW1fYWRkX2VwaTMyKG91dF8wOCwgYmlhc18wOCk7CisgICAgb3V0XzEyID0gX21tX2FkZF9lcGkzMihvdXRfMTIsIGJpYXNfMTIpOworICAgIC8vIG91dCA9IFFVQU5URElWKGNvZWZmLCBpUSwgQiwgUUZJWCkKKyAgICBvdXRfMDAgPSBfbW1fc3JhaV9lcGkzMihvdXRfMDAsIFFGSVgpOworICAgIG91dF8wNCA9IF9tbV9zcmFpX2VwaTMyKG91dF8wNCwgUUZJWCk7CisgICAgb3V0XzA4ID0gX21tX3NyYWlfZXBpMzIob3V0XzA4LCBRRklYKTsKKyAgICBvdXRfMTIgPSBfbW1fc3JhaV9lcGkzMihvdXRfMTIsIFFGSVgpOworCisgICAgLy8gcGFjayByZXN1bHQgYXMgMTZiCisgICAgb3V0MCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDAsIG91dF8wNCk7CisgICAgb3V0OCA9IF9tbV9wYWNrc19lcGkzMihvdXRfMDgsIG91dF8xMik7CisKKyAgICAvLyBpZiAoY29lZmYgPiAyMDQ3KSBjb2VmZiA9IDIwNDcKKyAgICBvdXQwID0gX21tX21pbl9lcGkxNihvdXQwLCBtYXhfY29lZmZfMjA0Nyk7CisgICAgb3V0OCA9IF9tbV9taW5fZXBpMTYob3V0OCwgbWF4X2NvZWZmXzIwNDcpOworICB9CisKKyAgLy8gcHV0IHNpZ24gYmFjaworICBvdXQwID0gX21tX3NpZ25fZXBpMTYob3V0MCwgaW4wKTsKKyAgb3V0OCA9IF9tbV9zaWduX2VwaTE2KG91dDgsIGluOCk7CisKKyAgLy8gaW4gPSBvdXQgKiBRCisgIGluMCA9IF9tbV9tdWxsb19lcGkxNihvdXQwLCBxMCk7CisgIGluOCA9IF9tbV9tdWxsb19lcGkxNihvdXQ4LCBxOCk7CisKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmluWzBdLCBpbjApOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmaW5bOF0sIGluOCk7CisKKyAgLy8gemlnemFnIHRoZSBvdXRwdXQgYmVmb3JlIHN0b3JpbmcgaXQuIFRoZSByZS1vcmRlcmluZyBpczoKKyAgLy8gICAgMCAxIDIgMyA0IDUgNiA3IHwgOCAgOSAxMCAxMSAxMiAxMyAxNCAxNQorICAvLyAtPiAwIDEgNFs4XTUgMiAzIDYgfCA5IDEyIDEzIDEwIFs3XTExIDE0IDE1CisgIC8vIFRoZXJlJ3Mgb25seSB0d28gbWlzcGxhY2VkIGVudHJpZXMgKFs4XSBhbmQgWzddKSB0aGF0IGFyZSBjcm9zc2luZyB0aGUKKyAgLy8gcmVnJ3MgYm91bmRhcmllcy4KKyAgLy8gV2UgdXNlIHBzaHVmYiBpbnN0ZWFkIG9mIHBzaHVmbG8vcHNodWZoaS4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkga0NzdF9sbyA9IFBTSFVGQl9DU1QoMCwgMSwgNCwgLTEsIDUsIDIsIDMsIDYpOworICAgIGNvbnN0IF9fbTEyOGkga0NzdF83ID0gUFNIVUZCX0NTVCgtMSwgLTEsIC0xLCAtMSwgNywgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSB0bXBfbG8gPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDAsIGtDc3RfbG8pOworICAgIGNvbnN0IF9fbTEyOGkgdG1wXzcgPSBfbW1fc2h1ZmZsZV9lcGk4KG91dDAsIGtDc3RfNyk7ICAvLyBleHRyYWN0ICM3CisgICAgY29uc3QgX19tMTI4aSBrQ3N0X2hpID0gUFNIVUZCX0NTVCgxLCA0LCA1LCAyLCAtMSwgMywgNiwgNyk7CisgICAgY29uc3QgX19tMTI4aSBrQ3N0XzggPSBQU0hVRkJfQ1NUKC0xLCAtMSwgLTEsIDAsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBjb25zdCBfX20xMjhpIHRtcF9oaSA9IF9tbV9zaHVmZmxlX2VwaTgob3V0OCwga0NzdF9oaSk7CisgICAgY29uc3QgX19tMTI4aSB0bXBfOCA9IF9tbV9zaHVmZmxlX2VwaTgob3V0OCwga0NzdF84KTsgIC8vIGV4dHJhY3QgIzgKKyAgICBjb25zdCBfX20xMjhpIG91dF96MCA9IF9tbV9vcl9zaTEyOCh0bXBfbG8sIHRtcF84KTsKKyAgICBjb25zdCBfX20xMjhpIG91dF96OCA9IF9tbV9vcl9zaTEyOCh0bXBfaGksIHRtcF83KTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0WzBdLCBvdXRfejApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbOF0sIG91dF96OCk7CisgICAgcGFja2VkX291dCA9IF9tbV9wYWNrc19lcGkxNihvdXRfejAsIG91dF96OCk7CisgIH0KKworICAvLyBkZXRlY3QgaWYgYWxsICdvdXQnIHZhbHVlcyBhcmUgemVyb2VzIG9yIG5vdAorICByZXR1cm4gKF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGk4KHBhY2tlZF9vdXQsIHplcm8pKSAhPSAweGZmZmYpOworfQorCisjdW5kZWYgUFNIVUZCX0NTVAorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tfU1NFNDEoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICByZXR1cm4gRG9RdWFudGl6ZUJsb2NrX1NTRTQxKGluLCBvdXQsICZtdHgtPnNoYXJwZW5fWzBdLCBtdHgpOworfQorCitzdGF0aWMgaW50IFF1YW50aXplQmxvY2tXSFRfU1NFNDEoaW50MTZfdCBpblsxNl0sIGludDE2X3Qgb3V0WzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICByZXR1cm4gRG9RdWFudGl6ZUJsb2NrX1NTRTQxKGluLCBvdXQsIE5VTEwsIG10eCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbnRpemUyQmxvY2tzX1NTRTQxKGludDE2X3QgaW5bMzJdLCBpbnQxNl90IG91dFszMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCkgeworICBpbnQgbno7CisgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBzaGFycGVuID0gJm10eC0+c2hhcnBlbl9bMF07CisgIG56ICA9IERvUXVhbnRpemVCbG9ja19TU0U0MShpbiArIDAgKiAxNiwgb3V0ICsgMCAqIDE2LCBzaGFycGVuLCBtdHgpIDw8IDA7CisgIG56IHw9IERvUXVhbnRpemVCbG9ja19TU0U0MShpbiArIDEgKiAxNiwgb3V0ICsgMSAqIDE2LCBzaGFycGVuLCBtdHgpIDw8IDE7CisgIHJldHVybiBuejsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhFbmNEc3BJbml0U1NFNDEodm9pZCkgeworICBWUDhDb2xsZWN0SGlzdG9ncmFtID0gQ29sbGVjdEhpc3RvZ3JhbV9TU0U0MTsKKyAgVlA4RW5jUXVhbnRpemVCbG9jayA9IFF1YW50aXplQmxvY2tfU1NFNDE7CisgIFZQOEVuY1F1YW50aXplMkJsb2NrcyA9IFF1YW50aXplMkJsb2Nrc19TU0U0MTsKKyAgVlA4RW5jUXVhbnRpemVCbG9ja1dIVCA9IFF1YW50aXplQmxvY2tXSFRfU1NFNDE7CisgIFZQOFREaXN0bzR4NCA9IERpc3RvNHg0X1NTRTQxOworICBWUDhURGlzdG8xNngxNiA9IERpc3RvMTZ4MTZfU1NFNDE7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFNDEKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEVuY0RzcEluaXRTU0U0MSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0U0MQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjlhMjJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzLmMKQEAgLTAsMCArMSwyODcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBmdWwgbWFjcm8uCisKKyMgZGVmaW5lIFNBTklUWV9DSEVDSyhpbiwgb3V0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCgoaW4pICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoKG91dCkgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHdpZHRoID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChoZWlnaHQgPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoc3RyaWRlID49IHdpZHRoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHJvdyA+PSAwICYmIG51bV9yb3dzID4gMCAmJiByb3cgKyBudW1fcm93cyA8PSBoZWlnaHQpOyAgICAgICAgICAgICAgICBcCisgICh2b2lkKWhlaWdodDsgIC8vIFNpbGVuY2UgdW51c2VkIHdhcm5pbmcuCisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQcmVkaWN0TGluZV9DKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoLCBpbnQgaW52ZXJzZSkgeworICBpbnQgaTsKKyAgaWYgKGludmVyc2UpIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSArIHByZWRbaV07CisgIH0gZWxzZSB7CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyX0MoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIHByZWRzOworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisgIHByZWRzID0gaW52ZXJzZSA/IG91dCA6IGluOworCisgIGlmIChyb3cgPT0gMCkgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHRoZSBzYW1lIGFzIGlucHV0IGZvciB0b3Btb3N0IHNjYW5saW5lLgorICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lX0MoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlLgorICAgIFByZWRpY3RMaW5lX0MoaW4sIHByZWRzIC0gc3RyaWRlLCBvdXQsIDEsIGludmVyc2UpOworICAgIFByZWRpY3RMaW5lX0MoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9WZXJ0aWNhbEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGludmVyc2UgPyBvdXQgOiBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmVfQyhpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgIHJvdyA9IDE7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0gZWxzZSB7CisgICAgLy8gV2UgYXJlIHN0YXJ0aW5nIGZyb20gaW4tYmV0d2Vlbi4gTWFrZSBzdXJlICdwcmVkcycgcG9pbnRzIHRvIHByZXYgcm93LgorICAgIHByZWRzIC09IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIFByZWRpY3RMaW5lX0MoaW4sIHByZWRzLCBvdXQsIHdpZHRoLCBpbnZlcnNlKTsKKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKyNlbmRpZiAgLy8gIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yX0ModWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9HcmFkaWVudEZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCB1aW50OF90KiBwcmVkczsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworICBwcmVkcyA9IGludmVyc2UgPyBvdXQgOiBpbjsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVfQyhpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEsIGludmVyc2UpOworICAgIHJvdyA9IDE7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgaW50IHc7CisgICAgLy8gbGVmdG1vc3QgcGl4ZWw6IHByZWRpY3QgZnJvbSBhYm92ZS4KKyAgICBQcmVkaWN0TGluZV9DKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0LCAxLCBpbnZlcnNlKTsKKyAgICBmb3IgKHcgPSAxOyB3IDwgd2lkdGg7ICsrdykgeworICAgICAgY29uc3QgaW50IHByZWQgPSBHcmFkaWVudFByZWRpY3Rvcl9DKHByZWRzW3cgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkc1t3IC0gc3RyaWRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkc1t3IC0gc3RyaWRlIC0gMV0pOworICAgICAgb3V0W3ddID0gaW5bd10gKyAoaW52ZXJzZSA/IHByZWQgOiAtcHJlZCk7CisgICAgfQorICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKK3N0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXJfQyhjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0hvcml6b250YWxGaWx0ZXJfQyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyX0MoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvVmVydGljYWxGaWx0ZXJfQyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwgMCwgZmlsdGVyZWRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyX0MoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvR3JhZGllbnRGaWx0ZXJfQyhkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwgMCwgZmlsdGVyZWRfZGF0YSk7Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyX0MoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICB1aW50OF90IHByZWQgPSAocHJldiA9PSBOVUxMKSA/IDAgOiBwcmV2WzBdOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICBvdXRbaV0gPSBwcmVkICsgaW5baV07CisgICAgcHJlZCA9IG91dFtpXTsKKyAgfQorfQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorc3RhdGljIHZvaWQgVmVydGljYWxVbmZpbHRlcl9DKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfQyhOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIG91dFtpXSA9IHByZXZbaV0gKyBpbltpXTsKKyAgfQorfQorI2VuZGlmICAvLyAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXJfQyhjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX0MoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIHVpbnQ4X3QgdG9wID0gcHJldlswXSwgdG9wX2xlZnQgPSB0b3AsIGxlZnQgPSB0b3A7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIHRvcCA9IHByZXZbaV07ICAvLyBuZWVkIHRvIHJlYWQgdGhpcyBmaXJzdCwgaW4gY2FzZSBwcmV2PT1vdXQKKyAgICAgIGxlZnQgPSBpbltpXSArIEdyYWRpZW50UHJlZGljdG9yX0MobGVmdCwgdG9wLCB0b3BfbGVmdCk7CisgICAgICB0b3BfbGVmdCA9IHRvcDsKKyAgICAgIG91dFtpXSA9IGxlZnQ7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0IGZ1bmN0aW9uCisKK1dlYlBGaWx0ZXJGdW5jIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOworV2ViUFVuZmlsdGVyRnVuYyBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOworCitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE1JUFNkc3BSMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TVNBKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRORU9OKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4RmlsdGVyc0luaXRTU0UyKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4RmlsdGVyc0luaXQpIHsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9OT05FXSA9IE5VTEw7CisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbFVuZmlsdGVyX0M7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxVbmZpbHRlcl9DOworI2VuZGlmCisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRVbmZpbHRlcl9DOworCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX05PTkVdID0gTlVMTDsKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbEZpbHRlcl9DOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcl9DOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudEZpbHRlcl9DOworI2VuZGlmCisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOEZpbHRlcnNJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOEZpbHRlcnNJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBWUDhGaWx0ZXJzSW5pdE5FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfSE9SSVpPTlRBTF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODJiMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2ZpbHRlcnNfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDQwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKKy8vCisvLyBBdXRob3Iocyk6IEJyYW5pbWlyIFZhc2ljIChicmFuaW1pci52YXNpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBEam9yZGplIFBlc3V0IChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3JvLgorCisjIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaW4gIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KG91dCAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChyb3cgPj0gMCAmJiBudW1fcm93cyA+IDAgJiYgcm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsgICAgICAgICAgICAgICAgXAorICAodm9pZCloZWlnaHQ7ICAvLyBTaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorCisjZGVmaW5lIERPX1BSRURJQ1RfTElORShTUkMsIERTVCwgTEVOR1RILCBJTlZFUlNFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4X3QqIHBzcmMgPSAodWludDhfdCopKFNSQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBwZHN0ID0gKHVpbnQ4X3QqKShEU1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IGlsZW5ndGggPSAoaW50KShMRU5HVEgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5zZXQgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzcmwgICAgICAgJVt0ZW1wMF0sICAgICVbbGVuZ3RoXSwgICAgMiAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDBdLCAgICA0ZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhbmRpICAgICAlW3RlbXA2XSwgICAgJVtsZW5ndGhdLCAgICAzICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmlmICIgI0lOVkVSU0UgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAxXSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMl0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDNdLCAgICAxKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXA0XSwgICAgMiglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wNV0sICAgIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZHUgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAzXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICAgJVt0ZW1wNF0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAzXSwgICAgICVbdGVtcDVdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXAxXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzYiAgICAgICAgJVt0ZW1wMl0sICAgIDEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAyKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNiICAgICAgICAlW3RlbXA0XSwgICAgMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbdGVtcDBdLCAgICAlW3RlbXAwXSwgICAgIC0xICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImJuZXogICAgICAlW3RlbXAwXSwgICAgMWIgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIgYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgNCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDJdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICA0ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidS5xYiAgICVbdGVtcDNdLCAgICAlW3RlbXAyXSwgICAgICVbdGVtcDFdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVzdyAgICAgICAlW3RlbXAzXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wMF0sICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDQgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDZdLCAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDJdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuaWYgIiAjSU5WRVJTRSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJsYnUgICAgICAgJVt0ZW1wMV0sICAgIC0xKCVbc3JjXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidSAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAxXSwgICAgICVbdGVtcDJdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXA2XSwgICAgJVt0ZW1wNl0sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wNl0sICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksICAgICAgICAgXAorICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW2RzdF0iKyZyIihwZHN0KSwgW3NyY10iKyZyIihwc3JjKSAgICAgICAgICAgICAgICBcCisgICAgICA6IFtsZW5ndGhdInIiKGlsZW5ndGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKSB7CisgIERPX1BSRURJQ1RfTElORShzcmMsIGRzdCwgbGVuZ3RoLCAwKTsKK30KKworI2RlZmluZSBET19QUkVESUNUX0xJTkVfVkVSVElDQUwoU1JDLCBQUkVELCBEU1QsIExFTkdUSCwgSU5WRVJTRSkgZG8geyAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OF90KiBwc3JjID0gKHVpbnQ4X3QqKShTUkMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDhfdCogcHByZWQgPSAodWludDhfdCopKFBSRUQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIHBkc3QgPSAodWludDhfdCopKERTVCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgaWxlbmd0aCA9IChpbnQpKExFTkdUSCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLnNldCAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInNybCAgICAgICAlW3RlbXAwXSwgICAgJVtsZW5ndGhdLCAgICAweDMgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJiZXF6ICAgICAgJVt0ZW1wMF0sICAgIDRmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFuZGkgICAgICVbdGVtcDddLCAgICAlW2xlbmd0aF0sICAgIDB4NyAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidWx3ICAgICAgICVbdGVtcDJdLCAgICAwKCVbcHJlZF0pICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVsdyAgICAgICAlW3RlbXAzXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJ1bHcgICAgICAgJVt0ZW1wNF0sICAgIDQoJVtwcmVkXSkgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgIDggICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuaWYgIiAjSU5WRVJTRSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1LnFiICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkdS5xYiAgICVbdGVtcDZdLCAgICAlW3RlbXAzXSwgICAgICVbdGVtcDRdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1LnFiICAgJVt0ZW1wNV0sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic3VidS5xYiAgICVbdGVtcDZdLCAgICAlW3RlbXAzXSwgICAgICVbdGVtcDRdICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtwcmVkXSwgICAgICVbcHJlZF0sICAgICAgOCAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAidXN3ICAgICAgICVbdGVtcDVdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInVzdyAgICAgICAlW3RlbXA2XSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgLTEgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYm5leiAgICAgICVbdGVtcDBdLCAgICAxYiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICA4ICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYmVxeiAgICAgICVbdGVtcDddLCAgICAzZiAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDFdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAyXSwgICAgMCglW3ByZWRdKSAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgMSAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiYWRkaXUgICAgICVbcHJlZF0sICAgICAlW3ByZWRdLCAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIuaWYgIiAjSU5WRVJTRSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJhZGR1ICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDFdLCAgICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgIi5lbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgInN1YnUgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAyXSAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgImFkZGl1ICAgICAlW3RlbXA3XSwgICAgJVt0ZW1wN10sICAgICAtMSAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJibmV6ICAgICAgJVt0ZW1wN10sICAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiIGFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuc2V0ICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksICAgICAgICAgXAorICAgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCAgICAgICAgIFwKKyAgICAgICAgW3RlbXA2XSI9JnIiKHRlbXA2KSwgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3ByZWRdIismciIocHByZWQpLCAgICAgICAgICBcCisgICAgICAgIFtkc3RdIismciIocGRzdCksIFtzcmNdIismciIocHNyYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbbGVuZ3RoXSJyIihpbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogIm1lbW9yeSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFBSRURJQ1RfTElORV9PTkVfUEFTUyhTUkMsIFBSRUQsIERTVCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB0ZW1wMSwgdGVtcDIsIHRlbXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAibGJ1ICAgICAgICVbdGVtcDFdLCAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgImxidSAgICAgICAlW3RlbXAyXSwgICAwKCVbcHJlZF0pICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICJzdWJ1ICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wMV0sICAgJVt0ZW1wMl0gICAgXG5cdCIgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAic2IgICAgICAgICVbdGVtcDNdLCAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpICAgICAgICAgIFwKKyAgICAgIDogW3ByZWRdInIiKChQUkVEKSksIFtkc3RdInIiKChEU1QpKSwgW3NyY10iciIoKFNSQykpICAgICAgICAgICAgICAgICAgICBcCisgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhvcml6b250YWwgZmlsdGVyLgorCisjZGVmaW5lIEZJTFRFUl9MSU5FX0JZX0xJTkUgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBSRURJQ1RfTElORV9PTkVfUEFTUyhpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBET19QUkVESUNUX0xJTkUoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEsIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKytyb3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHByZWRzICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbiArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3V0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvSG9yaXpvbnRhbEZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZV9NSVBTZHNwUjIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgIHJvdyA9IDE7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgRklMVEVSX0xJTkVfQllfTElORTsKK30KKyN1bmRlZiBGSUxURVJfTElORV9CWV9MSU5FCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvSG9yaXpvbnRhbEZpbHRlcl9NSVBTZHNwUjIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIuCisKKyNkZWZpbmUgRklMVEVSX0xJTkVfQllfTElORSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRE9fUFJFRElDVF9MSU5FX1ZFUlRJQ0FMKGluLCBwcmVkcywgb3V0LCB3aWR0aCwgMCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrcm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBwcmVkcyArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW4gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIG91dCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBEb1ZlcnRpY2FsRmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93LCBpbnQgbnVtX3Jvd3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbjsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBWZXJ5IGZpcnN0IHRvcC1sZWZ0IHBpeGVsIGlzIGNvcGllZC4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgICAgUHJlZGljdExpbmVfTUlQU2RzcFIyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9IGVsc2UgeworICAgIC8vIFdlIGFyZSBzdGFydGluZyBmcm9tIGluLWJldHdlZW4uIE1ha2Ugc3VyZSAncHJlZHMnIHBvaW50cyB0byBwcmV2IHJvdy4KKyAgICBwcmVkcyAtPSBzdHJpZGU7CisgIH0KKworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICBGSUxURVJfTElORV9CWV9MSU5FOworfQorI3VuZGVmIEZJTFRFUl9MSU5FX0JZX0xJTkUKKworc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvVmVydGljYWxGaWx0ZXJfTUlQU2RzcFIyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdyYWRpZW50IGZpbHRlci4KKworc3RhdGljIGludCBHcmFkaWVudFByZWRpY3Rvcl9NSVBTZHNwUjIodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBpbnQgdGVtcDA7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICJhZGR1ICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbYV0sICAgICAgICVbYl0gICAgICAgIFxuXHQiCisgICAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgJVtjXSAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLncgICAgICAgICAlW3RlbXAwXSwgICAlW3RlbXAwXSwgICAyMyAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDBdLCAgICVbdGVtcDBdLCAgICR6ZXJvICAgICAgIFxuXHQiCisgICAgInNybCAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0ZW1wMF0sICAgMjQgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCkKKyAgICA6IFthXSJyIihhKSxbYl0iciIoYiksW2NdInIiKGMpCisgICk7CisgIHJldHVybiB0ZW1wMDsKK30KKworI2RlZmluZSBGSUxURVJfTElORV9CWV9MSU5FKFBSRURTLCBPUEVSQVRJT04pIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aGlsZSAocm93IDwgbGFzdF9yb3cpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUFJFRElDVF9MSU5FX09ORV9QQVNTKGluLCBQUkVEUyAtIHN0cmlkZSwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGZvciAodyA9IDE7IHcgPCB3aWR0aDsgKyt3KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGludCBwcmVkID0gR3JhZGllbnRQcmVkaWN0b3JfTUlQU2RzcFIyKFBSRURTW3cgLSAxXSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUkVEU1t3IC0gc3RyaWRlXSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJFRFNbdyAtIHN0cmlkZSAtIDFdKTsgICBcCisgICAgICAgIG91dFt3XSA9IGluW3ddIE9QRVJBVElPTiBwcmVkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICsrcm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbiArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgb3V0ICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIERvR3JhZGllbnRGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLCB1aW50OF90KiBvdXQpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHM7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKyAgcHJlZHMgPSBpbjsKKworICAvLyBsZWZ0IHByZWRpY3Rpb24gZm9yIHRvcCBzY2FuLWxpbmUKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgb3V0WzBdID0gaW5bMF07CisgICAgUHJlZGljdExpbmVfTUlQU2RzcFIyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIEZJTFRFUl9MSU5FX0JZX0xJTkUoaW4sIC0pOworfQorI3VuZGVmIEZJTFRFUl9MSU5FX0JZX0xJTkUKKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXJfTUlQU2RzcFIyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvR3JhZGllbnRGaWx0ZXJfTUlQU2RzcFIyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZF9kYXRhKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0LCBpbnQgd2lkdGgpIHsKKyBvdXRbMF0gPSBpblswXSArIChwcmV2ID09IE5VTEwgPyAwIDogcHJldlswXSk7CisgRE9fUFJFRElDVF9MSU5FKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxLCAxKTsKK30KKworc3RhdGljIHZvaWQgVmVydGljYWxVbmZpbHRlcl9NSVBTZHNwUjIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX01JUFNkc3BSMihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgRE9fUFJFRElDVF9MSU5FX1ZFUlRJQ0FMKGluLCBwcmV2LCBvdXQsIHdpZHRoLCAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFVuZmlsdGVyX01JUFNkc3BSMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfTUlQU2RzcFIyKE5VTEwsIGluLCBvdXQsIHdpZHRoKTsKKyAgfSBlbHNlIHsKKyAgICB1aW50OF90IHRvcCA9IHByZXZbMF0sIHRvcF9sZWZ0ID0gdG9wLCBsZWZ0ID0gdG9wOworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgICB0b3AgPSBwcmV2W2ldOyAgLy8gbmVlZCB0byByZWFkIHRoaXMgZmlyc3QsIGluIGNhc2UgcHJldj09ZHN0CisgICAgICBsZWZ0ID0gaW5baV0gKyBHcmFkaWVudFByZWRpY3Rvcl9NSVBTZHNwUjIobGVmdCwgdG9wLCB0b3BfbGVmdCk7CisgICAgICB0b3BfbGVmdCA9IHRvcDsKKyAgICAgIG91dFtpXSA9IGxlZnQ7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBET19QUkVESUNUX0xJTkVfVkVSVElDQUwKKyN1bmRlZiBQUkVESUNUX0xJTkVfT05FX1BBU1MKKyN1bmRlZiBET19QUkVESUNUX0xJTkUKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIodm9pZCkgeworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbFVuZmlsdGVyX01JUFNkc3BSMjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbFVuZmlsdGVyX01JUFNkc3BSMjsKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudFVuZmlsdGVyX01JUFNkc3BSMjsKKworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXJfTUlQU2RzcFIyOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcl9NSVBTZHNwUjI7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50RmlsdGVyX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4RmlsdGVyc0luaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19tc2EuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM0MzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX21zYS5jCkBAIC0wLDAgKzEsMjAyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZhcmlhbnQgb2YgYWxwaGEgZmlsdGVycworLy8KKy8vIEF1dGhvcjogUHJhc2hhbnQgUGF0aWwgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICJzcmMvZHNwL21zYV9tYWNyby5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lSW52ZXJzZTAoY29uc3QgdWludDhfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggc3JjMCwgcHJlZDAsIGRzdDA7CisgIGFzc2VydChsZW5ndGggPj0gMCk7CisgIHdoaWxlIChsZW5ndGggPj0gMzIpIHsKKyAgICB2MTZ1OCBzcmMxLCBwcmVkMSwgZHN0MTsKKyAgICBMRF9VQjIoc3JjLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgTERfVUIyKHByZWQsIDE2LCBwcmVkMCwgcHJlZDEpOworICAgIFNVQjIoc3JjMCwgcHJlZDAsIHNyYzEsIHByZWQxLCBkc3QwLCBkc3QxKTsKKyAgICBTVF9VQjIoZHN0MCwgZHN0MSwgZHN0LCAxNik7CisgICAgc3JjICs9IDMyOworICAgIHByZWQgKz0gMzI7CisgICAgZHN0ICs9IDMyOworICAgIGxlbmd0aCAtPSAzMjsKKyAgfQorICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCBpOworICAgIGlmIChsZW5ndGggPj0gMTYpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihzcmMpOworICAgICAgcHJlZDAgPSBMRF9VQihwcmVkKTsKKyAgICAgIGRzdDAgPSBzcmMwIC0gcHJlZDA7CisgICAgICBTVF9VQihkc3QwLCBkc3QpOworICAgICAgc3JjICs9IDE2OworICAgICAgcHJlZCArPSAxNjsKKyAgICAgIGRzdCArPSAxNjsKKyAgICAgIGxlbmd0aCAtPSAxNjsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGZ1bCBtYWNyby4KKworI2RlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgIFwKKyAgYXNzZXJ0KGluICE9IE5VTEwpOyAgICAgICAgICBcCisgIGFzc2VydChvdXQgIT0gTlVMTCk7ICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSG9ycml6b250YWwgZmlsdGVyCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXJfTVNBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgY29uc3QgdWludDhfdCogcHJlZHMgPSBkYXRhOworICBjb25zdCB1aW50OF90KiBpbiA9IGRhdGE7CisgIHVpbnQ4X3QqIG91dCA9IGZpbHRlcmVkX2RhdGE7CisgIGludCByb3cgPSAxOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisKKyAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgdGhlIHNhbWUgYXMgaW5wdXQgZm9yIHRvcG1vc3Qgc2NhbmxpbmUuCisgIG91dFswXSA9IGluWzBdOworICBQcmVkaWN0TGluZUludmVyc2UwKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgIHByZWRzICs9IHN0cmlkZTsKKyAgaW4gKz0gc3RyaWRlOworICBvdXQgKz0gc3RyaWRlOworICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgorICB3aGlsZSAocm93IDwgaGVpZ2h0KSB7CisgICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUuCisgICAgUHJlZGljdExpbmVJbnZlcnNlMChpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCwgMSk7CisgICAgUHJlZGljdExpbmVJbnZlcnNlMChpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIHByZWRzICs9IHN0cmlkZTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RMaW5lR3JhZGllbnQoY29uc3QgdWludDhfdCogcGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBwcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcG91dHB1dCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpIHsKKyAgaW50IHc7CisgIGNvbnN0IHYxNmk4IHplcm8gPSB7IDAgfTsKKyAgd2hpbGUgKHNpemUgPj0gMTYpIHsKKyAgICB2MTZ1OCBwcmVkMCwgZHN0MDsKKyAgICB2OGkxNiBhMCwgYTEsIGIwLCBiMSwgYzAsIGMxOworICAgIGNvbnN0IHYxNnU4IHRtcDAgPSBMRF9VQihwcHJlZCAtIDEpOworICAgIGNvbnN0IHYxNnU4IHRtcDEgPSBMRF9VQihwcHJlZCAtIHN0cmlkZSk7CisgICAgY29uc3QgdjE2dTggdG1wMiA9IExEX1VCKHBwcmVkIC0gc3RyaWRlIC0gMSk7CisgICAgY29uc3QgdjE2dTggc3JjMCA9IExEX1VCKHBpbnB1dCk7CisgICAgSUxWUkxfQjJfU0goemVybywgdG1wMCwgYTAsIGExKTsKKyAgICBJTFZSTF9CMl9TSCh6ZXJvLCB0bXAxLCBiMCwgYjEpOworICAgIElMVlJMX0IyX1NIKHplcm8sIHRtcDIsIGMwLCBjMSk7CisgICAgQUREMihhMCwgYjAsIGExLCBiMSwgYTAsIGExKTsKKyAgICBTVUIyKGEwLCBjMCwgYTEsIGMxLCBhMCwgYTEpOworICAgIENMSVBfU0gyXzBfMjU1KGEwLCBhMSk7CisgICAgcHJlZDAgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYTEsICh2MTZpOClhMCk7CisgICAgZHN0MCA9IHNyYzAgLSBwcmVkMDsKKyAgICBTVF9VQihkc3QwLCBwb3V0cHV0KTsKKyAgICBwcHJlZCArPSAxNjsKKyAgICBwaW5wdXQgKz0gMTY7CisgICAgcG91dHB1dCArPSAxNjsKKyAgICBzaXplIC09IDE2OworICB9CisgIGZvciAodyA9IDA7IHcgPCBzaXplOyArK3cpIHsKKyAgICBjb25zdCBpbnQgcHJlZCA9IHBwcmVkW3cgLSAxXSArIHBwcmVkW3cgLSBzdHJpZGVdIC0gcHByZWRbdyAtIHN0cmlkZSAtIDFdOworICAgIHBvdXRwdXRbd10gPSBwaW5wdXRbd10gLSAocHJlZCA8IDAgPyAwIDogcHJlZCA+IDI1NSA/IDI1NSA6IHByZWQpOworICB9Cit9CisKKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXJfTVNBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIGNvbnN0IHVpbnQ4X3QqIGluID0gZGF0YTsKKyAgY29uc3QgdWludDhfdCogcHJlZHMgPSBkYXRhOworICB1aW50OF90KiBvdXQgPSBmaWx0ZXJlZF9kYXRhOworICBpbnQgcm93ID0gMTsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworCisgIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQorICBvdXRbMF0gPSBpblswXTsKKyAgUHJlZGljdExpbmVJbnZlcnNlMChpbiArIDEsIHByZWRzLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICBwcmVkcyArPSBzdHJpZGU7CisgIGluICs9IHN0cmlkZTsKKyAgb3V0ICs9IHN0cmlkZTsKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGhlaWdodCkgeworICAgIG91dFswXSA9IGluWzBdIC0gcHJlZHNbLSBzdHJpZGVdOworICAgIFByZWRpY3RMaW5lR3JhZGllbnQocHJlZHMgKyAxLCBpbiArIDEsIG91dCArIDEsIHN0cmlkZSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBwcmVkcyArPSBzdHJpZGU7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZlcnRpY2FsIGZpbHRlcgorCitzdGF0aWMgdm9pZCBWZXJ0aWNhbEZpbHRlcl9NU0EoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgY29uc3QgdWludDhfdCogaW4gPSBkYXRhOworICBjb25zdCB1aW50OF90KiBwcmVkcyA9IGRhdGE7CisgIHVpbnQ4X3QqIG91dCA9IGZpbHRlcmVkX2RhdGE7CisgIGludCByb3cgPSAxOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisKKyAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCisgIG91dFswXSA9IGluWzBdOworICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCisgIFByZWRpY3RMaW5lSW52ZXJzZTAoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgaW4gKz0gc3RyaWRlOworICBvdXQgKz0gc3RyaWRlOworCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBoZWlnaHQpIHsKKyAgICBQcmVkaWN0TGluZUludmVyc2UwKGluLCBwcmVkcywgb3V0LCB3aWR0aCk7CisgICAgKytyb3c7CisgICAgcHJlZHMgKz0gc3RyaWRlOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOEZpbHRlcnNJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4RmlsdGVyc0luaXRNU0Eodm9pZCkgeworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXJfTVNBOworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF0gPSBWZXJ0aWNhbEZpbHRlcl9NU0E7CisgIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50RmlsdGVyX01TQTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOEZpbHRlcnNJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2YTU3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19uZW9uLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBORU9OIHZhcmlhbnQgb2YgYWxwaGEgZmlsdGVycworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3Jvcy4KKworIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGluICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChvdXQgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KGhlaWdodCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChzdHJpZGUgPj0gd2lkdGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQocm93ID49IDAgJiYgbnVtX3Jvd3MgPiAwICYmIHJvdyArIG51bV9yb3dzIDw9IGhlaWdodCk7ICAgICAgICAgICAgICAgIFwKKyAgKHZvaWQpaGVpZ2h0OyAgLy8gU2lsZW5jZSB1bnVzZWQgd2FybmluZy4KKworLy8gbG9hZCBlaWdodCB1OCBhbmQgd2lkZW4gdG8gczE2CisjZGVmaW5lIFU4X1RPX1MxNihBKSB2cmVpbnRlcnByZXRxX3MxNl91MTYodm1vdmxfdTgoQSkpCisjZGVmaW5lIExPQURfVThfVE9fUzE2KEEpIFU4X1RPX1MxNih2bGQxX3U4KEEpKQorCisvLyBzaGlmdCBsZWZ0IG9yIHJpZ2h0IGJ5IE4gYnl0ZSwgaW5zZXJ0aW5nIHplcm9zCisjZGVmaW5lIFNISUZUX1JJR0hUX05fUShBLCBOKSB2ZXh0cV91OCgoQSksIHplcm8sIChOKSkKKyNkZWZpbmUgU0hJRlRfTEVGVF9OX1EoQSwgTikgdmV4dHFfdTgoemVybywgKEEpLCAoMTYgLSAoTikpICUgMTYpCisKKy8vIHJvdGF0ZSBsZWZ0IGJ5IE4gYnl0ZXMKKyNkZWZpbmUgUk9UQVRFX0xFRlRfTihBLCBOKSAgIHZleHRfdTgoKEEpLCAoQSksIChOKSkKKy8vIHJvdGF0ZSByaWdodCBieSBOIGJ5dGVzCisjZGVmaW5lIFJPVEFURV9SSUdIVF9OKEEsIE4pICAgdmV4dF91OCgoQSksIChBKSwgKDggLSAoTikpICUgOCkKKworc3RhdGljIHZvaWQgUHJlZGljdExpbmVfTkVPTihjb25zdCB1aW50OF90KiBzcmMsIGNvbnN0IHVpbnQ4X3QqIHByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgYXNzZXJ0KGxlbmd0aCA+PSAwKTsKKyAgZm9yIChpID0gMDsgaSArIDE2IDw9IGxlbmd0aDsgaSArPSAxNikgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQSA9IHZsZDFxX3U4KCZzcmNbaV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQiA9IHZsZDFxX3U4KCZwcmVkW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IEMgPSB2c3VicV91OChBLCBCKTsKKyAgICB2c3QxcV91OCgmZHN0W2ldLCBDKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOworfQorCisvLyBTcGVjaWFsIGNhc2UgZm9yIGxlZnQtYmFzZWQgcHJlZGljdGlvbiAod2hlbiBwcmVkcz09ZHN0LTEgb3IgcHJlZHM9PXNyYy0xKS4KK3N0YXRpYyB2b2lkIFByZWRpY3RMaW5lTGVmdF9ORU9OKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIFByZWRpY3RMaW5lX05FT04oc3JjLCBzcmMgLSAxLCBkc3QsIGxlbmd0aCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyX05FT04oY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfTkVPTihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlLgorICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgUHJlZGljdExpbmVMZWZ0X05FT04oaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0hvcml6b250YWxGaWx0ZXJfTkVPTihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgorICAgIFByZWRpY3RMaW5lTGVmdF9ORU9OKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgUHJlZGljdExpbmVfTkVPTihpbiwgaW4gLSBzdHJpZGUsIG91dCwgd2lkdGgpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyX05FT04oY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvVmVydGljYWxGaWx0ZXJfTkVPTihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkX2RhdGEpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR3JhZGllbnQgZmlsdGVyLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdyYWRpZW50UHJlZGljdG9yX0ModWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFByZWRpY3REaXJlY3RfTkVPTihjb25zdCB1aW50OF90KiBjb25zdCByb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQsIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA4IDw9IGxlbmd0aDsgaSArPSA4KSB7CisgICAgY29uc3QgdWludDh4OF90IEEgPSB2bGQxX3U4KCZyb3dbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHg4X3QgQiA9IHZsZDFfdTgoJnRvcFtpICsgMF0pOworICAgIGNvbnN0IGludDE2eDhfdCBDID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZhZGRsX3U4KEEsIEIpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgRCA9IExPQURfVThfVE9fUzE2KCZ0b3BbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHg4X3QgRSA9IHZxbW92dW5fczE2KHZzdWJxX3MxNihDLCBEKSk7CisgICAgY29uc3QgdWludDh4OF90IEYgPSB2bGQxX3U4KCZyb3dbaSArIDBdKTsKKyAgICB2c3QxX3U4KCZvdXRbaV0sIHZzdWJfdTgoRiwgRSkpOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBvdXRbaV0gPSByb3dbaV0gLSBHcmFkaWVudFByZWRpY3Rvcl9DKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9HcmFkaWVudEZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByb3csIGludCBudW1fcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQpIHsKKyAgY29uc3Qgc2l6ZV90IHN0YXJ0X29mZnNldCA9IHJvdyAqIHN0cmlkZTsKKyAgY29uc3QgaW50IGxhc3Rfcm93ID0gcm93ICsgbnVtX3Jvd3M7CisgIFNBTklUWV9DSEVDSyhpbiwgb3V0KTsKKyAgaW4gKz0gc3RhcnRfb2Zmc2V0OworICBvdXQgKz0gc3RhcnRfb2Zmc2V0OworCisgIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQorICBpZiAocm93ID09IDApIHsKKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfTkVPTihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgR3JhZGllbnRQcmVkaWN0RGlyZWN0X05FT04oaW4gKyAxLCBpbiArIDEgLSBzdHJpZGUsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgKytyb3c7CisgICAgaW4gKz0gc3RyaWRlOworICAgIG91dCArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRGaWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKKyAgRG9HcmFkaWVudEZpbHRlcl9ORU9OKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKKyN1bmRlZiBTQU5JVFlfQ0hFQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEludmVyc2UgdHJhbnNmb3JtcworCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsVW5maWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBjb25zdCB1aW50OHgxNl90IHplcm8gPSB2ZHVwcV9uX3U4KDApOworICB1aW50OHgxNl90IGxhc3Q7CisgIG91dFswXSA9IGluWzBdICsgKHByZXYgPT0gTlVMTCA/IDAgOiBwcmV2WzBdKTsKKyAgaWYgKHdpZHRoIDw9IDEpIHJldHVybjsKKyAgbGFzdCA9IHZzZXRxX2xhbmVfdTgob3V0WzBdLCB6ZXJvLCAwKTsKKyAgZm9yIChpID0gMTsgaSArIDE2IDw9IHdpZHRoOyBpICs9IDE2KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBBMCA9IHZsZDFxX3U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBBMSA9IHZhZGRxX3U4KEEwLCBsYXN0KTsKKyAgICBjb25zdCB1aW50OHgxNl90IEEyID0gU0hJRlRfTEVGVF9OX1EoQTEsIDEpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTMgPSB2YWRkcV91OChBMSwgQTIpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTQgPSBTSElGVF9MRUZUX05fUShBMywgMik7CisgICAgY29uc3QgdWludDh4MTZfdCBBNSA9IHZhZGRxX3U4KEEzLCBBNCk7CisgICAgY29uc3QgdWludDh4MTZfdCBBNiA9IFNISUZUX0xFRlRfTl9RKEE1LCA0KTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE3ID0gdmFkZHFfdTgoQTUsIEE2KTsKKyAgICBjb25zdCB1aW50OHgxNl90IEE4ID0gU0hJRlRfTEVGVF9OX1EoQTcsIDgpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgQTkgPSB2YWRkcV91OChBNywgQTgpOworICAgIHZzdDFxX3U4KCZvdXRbaV0sIEE5KTsKKyAgICBsYXN0ID0gU0hJRlRfUklHSFRfTl9RKEE5LCAxNSk7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBvdXRbaV0gPSBpbltpXSArIG91dFtpIC0gMV07Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXJfTkVPTihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX05FT04oTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGFzc2VydCh3aWR0aCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpICsgMTYgPD0gd2lkdGg7IGkgKz0gMTYpIHsKKyAgICAgIGNvbnN0IHVpbnQ4eDE2X3QgQSA9IHZsZDFxX3U4KCZpbltpXSk7CisgICAgICBjb25zdCB1aW50OHgxNl90IEIgPSB2bGQxcV91OCgmcHJldltpXSk7CisgICAgICBjb25zdCB1aW50OHgxNl90IEMgPSB2YWRkcV91OChBLCBCKTsKKyAgICAgIHZzdDFxX3U4KCZvdXRbaV0sIEMpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIG91dFtpXSA9IGluW2ldICsgcHJldltpXTsKKyAgfQorfQorCisvLyBHcmFkaWVudFVuZmlsdGVyX05FT04gaXMgY29ycmVjdCBidXQgc2xvd2VyIHRoYW4gdGhlIEMtdmVyc2lvbiwKKy8vIGF0IGxlYXN0IG9uIEFSTTY0LiBGb3IgYXJtdjcsIGl0J3MgYSB3YXNoLgorLy8gU28gYmVzdCBpcyB0byBkaXNhYmxlIGl0IGZvciBub3csIGJ1dCBrZWVwIHRoZSBpZGVhIGFyb3VuZC4uLgorI2lmICFkZWZpbmVkKFVTRV9HUkFESUVOVF9VTkZJTFRFUikKKyNkZWZpbmUgVVNFX0dSQURJRU5UX1VORklMVEVSIDAgICAvLyBBTFRFUk5BVEVfQ09ERQorI2VuZGlmCisKKyNpZiAoVVNFX0dSQURJRU5UX1VORklMVEVSID09IDEpCisjZGVmaW5lIEdSQURfUFJPQ0VTU19MQU5FKEwpICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgdG1wMSA9IFJPVEFURV9SSUdIVF9OKHByZWQsIDEpOyAgLyogcm90YXRlIHByZWRpY3RvciBpbiAqLyAgIFwKKyAgY29uc3QgaW50MTZ4OF90IHRtcDIgPSB2YWRkcV9zMTYoQkMsIFU4X1RPX1MxNih0bXAxKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBkZWx0YSA9IHZxbW92dW5fczE2KHRtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcmVkID0gdmFkZF91OChELCBkZWx0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0ID0gdmV4dF91OChvdXQsIFJPVEFURV9MRUZUX04ocHJlZCwgKEwpKSwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBHcmFkaWVudFByZWRpY3RJbnZlcnNlX05FT04oY29uc3QgdWludDhfdCogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IGxlbmd0aCkgeworICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCBpOworICAgIHVpbnQ4eDhfdCBwcmVkID0gdmR1cF9uX3U4KHJvd1stMV0pOyAgIC8vIGxlZnQgc2FtcGxlCisgICAgdWludDh4OF90IG91dCA9IHZkdXBfbl91OCgwKTsKKyAgICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW5ndGg7IGkgKz0gOCkgeworICAgICAgY29uc3QgaW50MTZ4OF90IEIgPSBMT0FEX1U4X1RPX1MxNigmdG9wW2kgKyAwXSk7CisgICAgICBjb25zdCBpbnQxNng4X3QgQyA9IExPQURfVThfVE9fUzE2KCZ0b3BbaSAtIDFdKTsKKyAgICAgIGNvbnN0IGludDE2eDhfdCBCQyA9IHZzdWJxX3MxNihCLCBDKTsgIC8vIHVuY2xpcHBlZCBncmFkaWVudCBiYXNpcyBCIC0gQworICAgICAgY29uc3QgdWludDh4OF90IEQgPSB2bGQxX3U4KCZpbltpXSk7ICAgLy8gYmFzZSBpbnB1dAorICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoMCk7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSgxKTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDIpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoMyk7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSg0KTsKKyAgICAgIEdSQURfUFJPQ0VTU19MQU5FKDUpOworICAgICAgR1JBRF9QUk9DRVNTX0xBTkUoNik7CisgICAgICBHUkFEX1BST0NFU1NfTEFORSg3KTsKKyAgICAgIHZzdDFfdTgoJnJvd1tpXSwgb3V0KTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgcm93W2ldID0gaW5baV0gKyBHcmFkaWVudFByZWRpY3Rvcl9DKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgICAgfQorICB9Cit9CisjdW5kZWYgR1JBRF9QUk9DRVNTX0xBTkUKKworc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcl9ORU9OKGNvbnN0IHVpbnQ4X3QqIHByZXYsIGNvbnN0IHVpbnQ4X3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCwgaW50IHdpZHRoKSB7CisgIGlmIChwcmV2ID09IE5VTEwpIHsKKyAgICBIb3Jpem9udGFsVW5maWx0ZXJfTkVPTihOVUxMLCBpbiwgb3V0LCB3aWR0aCk7CisgIH0gZWxzZSB7CisgICAgb3V0WzBdID0gaW5bMF0gKyBwcmV2WzBdOyAgLy8gcHJlZGljdCBmcm9tIGFib3ZlCisgICAgR3JhZGllbnRQcmVkaWN0SW52ZXJzZV9ORU9OKGluICsgMSwgcHJldiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgIH0KK30KKworI2VuZGlmICAgLy8gVVNFX0dSQURJRU5UX1VORklMVEVSCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdE5FT04odm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhGaWx0ZXJzSW5pdE5FT04odm9pZCkgeworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbFVuZmlsdGVyX05FT047CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxVbmZpbHRlcl9ORU9OOworI2lmIChVU0VfR1JBRElFTlRfVU5GSUxURVIgPT0gMSkKKyAgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF0gPSBHcmFkaWVudFVuZmlsdGVyX05FT047CisjZW5kaWYKKworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXJfTkVPTjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxGaWx0ZXJfTkVPTjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXJfTkVPTjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9ORU9OCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhGaWx0ZXJzSW5pdE5FT04pCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9maWx0ZXJzX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExODg5NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvZmlsdGVyc19zc2UyLmMKQEAgLTAsMCArMSwzMzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZhcmlhbnQgb2YgYWxwaGEgZmlsdGVycworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZnVsIG1hY3JvLgorCisjIGRlZmluZSBTQU5JVFlfQ0hFQ0soaW4sIG91dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoKGluKSAhPSBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KChvdXQpICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydCh3aWR0aCA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQoaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHN0cmlkZSA+PSB3aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFzc2VydChyb3cgPj0gMCAmJiBudW1fcm93cyA+IDAgJiYgcm93ICsgbnVtX3Jvd3MgPD0gaGVpZ2h0KTsgICAgICAgICAgICAgICAgXAorICAodm9pZCloZWlnaHQ7ICAvLyBTaWxlbmNlIHVudXNlZCB3YXJuaW5nLgorCitzdGF0aWMgdm9pZCBQcmVkaWN0TGluZVRvcF9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgY29uc3QgdWludDhfdCogcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgbWF4X3BvcyA9IGxlbmd0aCAmIH4zMTsKKyAgYXNzZXJ0KGxlbmd0aCA+PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gMzIpIHsKKyAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmNbaSArIDE2XSk7CisgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnByZWRbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnByZWRbaSArIDE2XSk7CisgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9zdWJfZXBpOChBMCwgQjApOworICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fc3ViX2VwaTgoQTEsIEIxKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAgMF0sIEMwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2kgKyAxNl0sIEMxKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOworfQorCisvLyBTcGVjaWFsIGNhc2UgZm9yIGxlZnQtYmFzZWQgcHJlZGljdGlvbiAod2hlbiBwcmVkcz09ZHN0LTEgb3IgcHJlZHM9PXNyYy0xKS4KK3N0YXRpYyB2b2lkIFByZWRpY3RMaW5lTGVmdF9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIGludCBpOworICBjb25zdCBpbnQgbWF4X3BvcyA9IGxlbmd0aCAmIH4zMTsKKyAgYXNzZXJ0KGxlbmd0aCA+PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gMzIpIHsKKyAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArICAwICAgICkpOworICAgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpICsgIDAgLSAxKSk7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHNyYyArIGkgKyAxNiAgICApKTsKKyAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSArIDE2IC0gMSkpOworICAgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fc3ViX2VwaTgoQTAsIEIwKTsKKyAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX3N1Yl9lcGk4KEExLCBCMSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGkgKyAgMCksIEMwKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgaSArIDE2KSwgQzEpOworICB9CisgIGZvciAoOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSAtIHNyY1tpIC0gMV07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIb3Jpem9udGFsIGZpbHRlci4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0KSB7CisgIGNvbnN0IHNpemVfdCBzdGFydF9vZmZzZXQgPSByb3cgKiBzdHJpZGU7CisgIGNvbnN0IGludCBsYXN0X3JvdyA9IHJvdyArIG51bV9yb3dzOworICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7CisgIGluICs9IHN0YXJ0X29mZnNldDsKKyAgb3V0ICs9IHN0YXJ0X29mZnNldDsKKworICBpZiAocm93ID09IDApIHsKKyAgICAvLyBMZWZ0bW9zdCBwaXhlbCBpcyB0aGUgc2FtZSBhcyBpbnB1dCBmb3IgdG9wbW9zdCBzY2FubGluZS4KKyAgICBvdXRbMF0gPSBpblswXTsKKyAgICBQcmVkaWN0TGluZUxlZnRfU1NFMihpbiArIDEsIG91dCArIDEsIHdpZHRoIC0gMSk7CisgICAgcm93ID0gMTsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorCisgIC8vIEZpbHRlciBsaW5lLWJ5LWxpbmUuCisgIHdoaWxlIChyb3cgPCBsYXN0X3JvdykgeworICAgIC8vIExlZnRtb3N0IHBpeGVsIGlzIHByZWRpY3RlZCBmcm9tIGFib3ZlLgorICAgIG91dFswXSA9IGluWzBdIC0gaW5bLXN0cmlkZV07CisgICAgUHJlZGljdExpbmVMZWZ0X1NTRTIoaW4gKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZXJ0aWNhbCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvVmVydGljYWxGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgaWYgKHJvdyA9PSAwKSB7CisgICAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCisgICAgb3V0WzBdID0gaW5bMF07CisgICAgLy8gUmVzdCBvZiB0b3Agc2Nhbi1saW5lIGlzIGxlZnQtcHJlZGljdGVkLgorICAgIFByZWRpY3RMaW5lTGVmdF9TU0UyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgUHJlZGljdExpbmVUb3BfU1NFMihpbiwgaW4gLSBzdHJpZGUsIG91dCwgd2lkdGgpOworICAgICsrcm93OworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBHcmFkaWVudCBmaWx0ZXIuCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3JfU1NFMih1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7CisgIGNvbnN0IGludCBnID0gYSArIGIgLSBjOworICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50UHJlZGljdERpcmVjdF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG91dCwgaW50IGxlbmd0aCkgeworICBjb25zdCBpbnQgbWF4X3BvcyA9IGxlbmd0aCAmIH43OworICBpbnQgaTsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF9wb3M7IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZyb3dbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdG9wW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmcm93W2ldKTsKKyAgICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoQTAsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fdW5wYWNrbG9fZXBpOChCMCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KEMwLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fYWRkX2VwaTE2KEExLCBCMSk7CisgICAgY29uc3QgX19tMTI4aSBGID0gX21tX3N1Yl9lcGkxNihFLCBDMSk7CisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX3BhY2t1c19lcGkxNihGLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEggPSBfbW1fc3ViX2VwaTgoRCwgRyk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKG91dCArIGkpLCBIKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgb3V0W2ldID0gcm93W2ldIC0gR3JhZGllbnRQcmVkaWN0b3JfU1NFMihyb3dbaSAtIDFdLCB0b3BbaV0sIHRvcFtpIC0gMV0pOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIERvR3JhZGllbnRGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdywgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dCkgeworICBjb25zdCBzaXplX3Qgc3RhcnRfb2Zmc2V0ID0gcm93ICogc3RyaWRlOworICBjb25zdCBpbnQgbGFzdF9yb3cgPSByb3cgKyBudW1fcm93czsKKyAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOworICBpbiArPSBzdGFydF9vZmZzZXQ7CisgIG91dCArPSBzdGFydF9vZmZzZXQ7CisKKyAgLy8gbGVmdCBwcmVkaWN0aW9uIGZvciB0b3Agc2Nhbi1saW5lCisgIGlmIChyb3cgPT0gMCkgeworICAgIG91dFswXSA9IGluWzBdOworICAgIFByZWRpY3RMaW5lTGVmdF9TU0UyKGluICsgMSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICByb3cgPSAxOworICAgIGluICs9IHN0cmlkZTsKKyAgICBvdXQgKz0gc3RyaWRlOworICB9CisKKyAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KKyAgd2hpbGUgKHJvdyA8IGxhc3Rfcm93KSB7CisgICAgb3V0WzBdID0gaW5bMF0gLSBpblstc3RyaWRlXTsKKyAgICBHcmFkaWVudFByZWRpY3REaXJlY3RfU1NFMihpbiArIDEsIGluICsgMSAtIHN0cmlkZSwgb3V0ICsgMSwgd2lkdGggLSAxKTsKKyAgICArK3JvdzsKKyAgICBpbiArPSBzdHJpZGU7CisgICAgb3V0ICs9IHN0cmlkZTsKKyAgfQorfQorCisjdW5kZWYgU0FOSVRZX0NIRUNLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIEhvcml6b250YWxGaWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgeworICBEb0hvcml6b250YWxGaWx0ZXJfU1NFMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsRmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvVmVydGljYWxGaWx0ZXJfU1NFMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwgZmlsdGVyZWRfZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50RmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7CisgIERvR3JhZGllbnRGaWx0ZXJfU1NFMihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDAsIGhlaWdodCwgZmlsdGVyZWRfZGF0YSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbnZlcnNlIHRyYW5zZm9ybXMKKworc3RhdGljIHZvaWQgSG9yaXpvbnRhbFVuZmlsdGVyX1NTRTIoY29uc3QgdWludDhfdCogcHJldiwgY29uc3QgdWludDhfdCogaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgX19tMTI4aSBsYXN0OworICBvdXRbMF0gPSBpblswXSArIChwcmV2ID09IE5VTEwgPyAwIDogcHJldlswXSk7CisgIGlmICh3aWR0aCA8PSAxKSByZXR1cm47CisgIGxhc3QgPSBfbW1fc2V0X2VwaTMyKDAsIDAsIDAsIG91dFswXSk7CisgIGZvciAoaSA9IDE7IGkgKyA4IDw9IHdpZHRoOyBpICs9IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikoaW4gKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9hZGRfZXBpOChBMCwgbGFzdCk7CisgICAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zbGxpX3NpMTI4KEExLCAxKTsKKyAgICBjb25zdCBfX20xMjhpIEEzID0gX21tX2FkZF9lcGk4KEExLCBBMik7CisgICAgY29uc3QgX19tMTI4aSBBNCA9IF9tbV9zbGxpX3NpMTI4KEEzLCAyKTsKKyAgICBjb25zdCBfX20xMjhpIEE1ID0gX21tX2FkZF9lcGk4KEEzLCBBNCk7CisgICAgY29uc3QgX19tMTI4aSBBNiA9IF9tbV9zbGxpX3NpMTI4KEE1LCA0KTsKKyAgICBjb25zdCBfX20xMjhpIEE3ID0gX21tX2FkZF9lcGk4KEE1LCBBNik7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKG91dCArIGkpLCBBNyk7CisgICAgbGFzdCA9IF9tbV9zcmxpX2VwaTY0KEE3LCA1Nik7CisgIH0KKyAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBvdXRbaV0gPSBpbltpXSArIG91dFtpIC0gMV07Cit9CisKK3N0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX1NTRTIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIGludCBpOworICAgIGNvbnN0IGludCBtYXhfcG9zID0gd2lkdGggJiB+MzE7CisgICAgYXNzZXJ0KHdpZHRoID49IDApOworICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDMyKSB7CisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSArICAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baSArIDE2XSk7CisgICAgICBjb25zdCBfX20xMjhpIEIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcHJldltpICsgIDBdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZwcmV2W2kgKyAxNl0pOworICAgICAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV9hZGRfZXBpOChBMCwgQjApOworICAgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hZGRfZXBpOChBMSwgQjEpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDBdLCBDMCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAxNl0sIEMxKTsKKyAgICB9CisgICAgZm9yICg7IGkgPCB3aWR0aDsgKytpKSBvdXRbaV0gPSBpbltpXSArIHByZXZbaV07CisgIH0KK30KKworc3RhdGljIHZvaWQgR3JhZGllbnRQcmVkaWN0SW52ZXJzZV9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByb3csIGludCBsZW5ndGgpIHsKKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgaTsKKyAgICBjb25zdCBpbnQgbWF4X3BvcyA9IGxlbmd0aCAmIH43OworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgX19tMTI4aSBBID0gX21tX3NldF9lcGkzMigwLCAwLCAwLCByb3dbLTFdKTsgICAvLyBsZWZ0IHNhbXBsZQorICAgIGZvciAoaSA9IDA7IGkgPCBtYXhfcG9zOyBpICs9IDgpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnRvcFtpXSk7CisgICAgICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZ0b3BbaSAtIDFdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV91bnBhY2tsb19lcGk4KHRtcDAsIHplcm8pOworICAgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3VucGFja2xvX2VwaTgodG1wMSwgemVybyk7CisgICAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7ICAvLyBiYXNlIGlucHV0CisgICAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fc3ViX2VwaTE2KEIsIEMpOyAgLy8gdW5jbGlwcGVkIGdyYWRpZW50IGJhc2lzIEIgLSBDCisgICAgICBfX20xMjhpIG91dCA9IHplcm87ICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0b3IgZm9yIG91dHB1dAorICAgICAgX19tMTI4aSBtYXNrX2hpID0gX21tX3NldF9lcGkzMigwLCAwLCAwLCAweGZmKTsKKyAgICAgIGludCBrID0gODsKKyAgICAgIHdoaWxlICgxKSB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wMyA9IF9tbV9hZGRfZXBpMTYoQSwgRSk7ICAgICAgICAgICAvLyBkZWx0YSA9IEEgKyBCIC0gQworICAgICAgICBjb25zdCBfX20xMjhpIHRtcDQgPSBfbW1fcGFja3VzX2VwaTE2KHRtcDMsIHplcm8pOyAgLy8gc2F0dXJhdGUgZGVsdGEKKyAgICAgICAgY29uc3QgX19tMTI4aSB0bXA1ID0gX21tX2FkZF9lcGk4KHRtcDQsIEQpOyAgICAgICAgIC8vIGFkZCB0byBpbltdCisgICAgICAgIEEgPSBfbW1fYW5kX3NpMTI4KHRtcDUsIG1hc2tfaGkpOyAgICAgICAgICAgICAgICAgICAvLyAxLWNvbXBsZW1lbnQgY2xpcAorICAgICAgICBvdXQgPSBfbW1fb3Jfc2kxMjgob3V0LCBBKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjdW11bGF0ZSBvdXRwdXQKKyAgICAgICAgaWYgKC0tayA9PSAwKSBicmVhazsKKyAgICAgICAgQSA9IF9tbV9zbGxpX3NpMTI4KEEsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJvdGF0ZSBsZWZ0IHNhbXBsZQorICAgICAgICBtYXNrX2hpID0gX21tX3NsbGlfc2kxMjgobWFza19oaSwgMSk7ICAgICAgICAgICAgLy8gcm90YXRlIG1hc2sKKyAgICAgICAgQSA9IF9tbV91bnBhY2tsb19lcGk4KEEsIHplcm8pOyAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgOGItPjE2YgorICAgICAgfQorICAgICAgQSA9IF9tbV9zcmxpX3NpMTI4KEEsIDcpOyAgICAgICAvLyBwcmVwYXJlIGxlZnQgc2FtcGxlIGZvciBuZXh0IGl0ZXJhdGlvbgorICAgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopJnJvd1tpXSwgb3V0KTsKKyAgICB9CisgICAgZm9yICg7IGkgPCBsZW5ndGg7ICsraSkgeworICAgICAgcm93W2ldID0gaW5baV0gKyBHcmFkaWVudFByZWRpY3Rvcl9TU0UyKHJvd1tpIC0gMV0sIHRvcFtpXSwgdG9wW2kgLSAxXSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIEdyYWRpZW50VW5maWx0ZXJfU1NFMihjb25zdCB1aW50OF90KiBwcmV2LCBjb25zdCB1aW50OF90KiBpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXQsIGludCB3aWR0aCkgeworICBpZiAocHJldiA9PSBOVUxMKSB7CisgICAgSG9yaXpvbnRhbFVuZmlsdGVyX1NTRTIoTlVMTCwgaW4sIG91dCwgd2lkdGgpOworICB9IGVsc2UgeworICAgIG91dFswXSA9IGluWzBdICsgcHJldlswXTsgIC8vIHByZWRpY3QgZnJvbSBhYm92ZQorICAgIEdyYWRpZW50UHJlZGljdEludmVyc2VfU1NFMihpbiArIDEsIHByZXYgKyAxLCBvdXQgKyAxLCB3aWR0aCAtIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhGaWx0ZXJzSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhGaWx0ZXJzSW5pdFNTRTIodm9pZCkgeworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0hPUklaT05UQUxdID0gSG9yaXpvbnRhbFVuZmlsdGVyX1NTRTI7CisgIFdlYlBVbmZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxVbmZpbHRlcl9TU0UyOworICBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0dSQURJRU5UXSA9IEdyYWRpZW50VW5maWx0ZXJfU1NFMjsKKworICBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXSA9IEhvcml6b250YWxGaWx0ZXJfU1NFMjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfVkVSVElDQUxdID0gVmVydGljYWxGaWx0ZXJfU1NFMjsKKyAgV2ViUEZpbHRlcnNbV0VCUF9GSUxURVJfR1JBRElFTlRdID0gR3JhZGllbnRGaWx0ZXJfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhGaWx0ZXJzSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNTNlZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzLmMKQEAgLTAsMCArMSw2NjYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbWFnZSB0cmFuc2Zvcm1zIGFuZCBjb2xvciBzcGFjZSBjb252ZXJzaW9uIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGRlY29kZXIuCisvLworLy8gQXV0aG9yczogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLyAgICAgICAgICBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gICAgICAgICAgVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorCisjZGVmaW5lIE1BWF9ESUZGX0NPU1QgKDFlMzBmKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1hZ2UgdHJhbnNmb3Jtcy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UyKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSkgeworICByZXR1cm4gKCgoYTAgXiBhMSkgJiAweGZlZmVmZWZldSkgPj4gMSkgKyAoYTAgJiBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMyh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsIHVpbnQzMl90IGEyKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTIpLCBhMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlNCh1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIHJldHVybiBBdmVyYWdlMihBdmVyYWdlMihhMCwgYTEpLCBBdmVyYWdlMihhMiwgYTMpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IENsaXAyNTUodWludDMyX3QgYSkgeworICBpZiAoYSA8IDI1NikgeworICAgIHJldHVybiBhOworICB9CisgIC8vIHJldHVybiAwLCB3aGVuIGEgaXMgYSBuZWdhdGl2ZSBpbnRlZ2VyLgorICAvLyByZXR1cm4gMjU1LCB3aGVuIGEgaXMgcG9zaXRpdmUuCisgIHJldHVybiB+YSA+PiAyNDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoaW50IGEsIGludCBiLCBpbnQgYykgeworICByZXR1cm4gQ2xpcDI1NShhICsgYiAtIGMpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbCh1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCA+PiAyNCwgYzEgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiAxNikgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKChjMCA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMSA+PiA4KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiA4KSAmIDB4ZmYpOworICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChjMCAmIDB4ZmYsIGMxICYgMHhmZiwgYzIgJiAweGZmKTsKKyAgcmV0dXJuICgodWludDMyX3QpYSA8PCAyNCkgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGludCBhLCBpbnQgYikgeworICByZXR1cm4gQ2xpcDI1NShhICsgKGEgLSBiKSAvIDIpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCB1aW50MzJfdCBhdmUgPSBBdmVyYWdlMihjMCwgYzEpOworICBjb25zdCBpbnQgYSA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZihhdmUgPj4gMjQsIGMyID4+IDI0KTsKKyAgY29uc3QgaW50IHIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAxNikgJiAweGZmLCAoYzIgPj4gMTYpICYgMHhmZik7CisgIGNvbnN0IGludCBnID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKChhdmUgPj4gOCkgJiAweGZmLCAoYzIgPj4gOCkgJiAweGZmKTsKKyAgY29uc3QgaW50IGIgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiAwKSAmIDB4ZmYsIChjMiA+PiAwKSAmIDB4ZmYpOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK30KKworLy8gZ2NjIDw9IDQuOSBvbiBBUk0gZ2VuZXJhdGVzIGluY29ycmVjdCBjb2RlIGluIFNlbGVjdCgpIHdoZW4gU3ViMygpIGlzCisvLyBpbmxpbmVkLgorI2lmIGRlZmluZWQoX19hcm1fXykgJiYgTE9DQUxfR0NDX1ZFUlNJT04gPD0gMHg0MDkKKyMgZGVmaW5lIExPQ0FMX0lOTElORSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQorI2Vsc2UKKyMgZGVmaW5lIExPQ0FMX0lOTElORSBXRUJQX0lOTElORQorI2VuZGlmCisKK3N0YXRpYyBMT0NBTF9JTkxJTkUgaW50IFN1YjMoaW50IGEsIGludCBiLCBpbnQgYykgeworICBjb25zdCBpbnQgcGIgPSBiIC0gYzsKKyAgY29uc3QgaW50IHBhID0gYSAtIGM7CisgIHJldHVybiBhYnMocGIpIC0gYWJzKHBhKTsKK30KKworI3VuZGVmIExPQ0FMX0lOTElORQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgU2VsZWN0KHVpbnQzMl90IGEsIHVpbnQzMl90IGIsIHVpbnQzMl90IGMpIHsKKyAgY29uc3QgaW50IHBhX21pbnVzX3BiID0KKyAgICAgIFN1YjMoKGEgPj4gMjQpICAgICAgICwgKGIgPj4gMjQpICAgICAgICwgKGMgPj4gMjQpICAgICAgICkgKworICAgICAgU3ViMygoYSA+PiAxNikgJiAweGZmLCAoYiA+PiAxNikgJiAweGZmLCAoYyA+PiAxNikgJiAweGZmKSArCisgICAgICBTdWIzKChhID4+ICA4KSAmIDB4ZmYsIChiID4+ICA4KSAmIDB4ZmYsIChjID4+ICA4KSAmIDB4ZmYpICsKKyAgICAgIFN1YjMoKGEgICAgICApICYgMHhmZiwgKGIgICAgICApICYgMHhmZiwgKGMgICAgICApICYgMHhmZik7CisgIHJldHVybiAocGFfbWludXNfcGIgPD0gMCkgPyBhIDogYjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWRpY3RvcnMKKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjBfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKXRvcDsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIEFSR0JfQkxBQ0s7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMV9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpdG9wOworICByZXR1cm4gbGVmdDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IyX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gdG9wWzBdOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjNfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiB0b3BbMV07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNF9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFstMV07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNV9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UzKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNl9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I3X0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIobGVmdCwgdG9wWzBdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOF9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFstMV0sIHRvcFswXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjlfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbMF0sIHRvcFsxXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEwX0ModWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTQobGVmdCwgdG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMV9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IFNlbGVjdCh0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMl9DKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwobGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTNfQyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjBfQywgUHJlZGljdG9yQWRkMF9DKQorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMV9DKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50MzJfdCBsZWZ0ID0gb3V0Wy0xXTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIG91dFtpXSA9IGxlZnQgPSBWUDhMQWRkUGl4ZWxzKGluW2ldLCBsZWZ0KTsKKyAgfQorICAodm9pZCl1cHBlcjsKK30KK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yMl9DLCBQcmVkaWN0b3JBZGQyX0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjNfQywgUHJlZGljdG9yQWRkM19DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I0X0MsIFByZWRpY3RvckFkZDRfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yNV9DLCBQcmVkaWN0b3JBZGQ1X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjZfQywgUHJlZGljdG9yQWRkNl9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I3X0MsIFByZWRpY3RvckFkZDdfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yOF9DLCBQcmVkaWN0b3JBZGQ4X0MpCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjlfQywgUHJlZGljdG9yQWRkOV9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IxMF9DLCBQcmVkaWN0b3JBZGQxMF9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IxMV9DLCBQcmVkaWN0b3JBZGQxMV9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IxMl9DLCBQcmVkaWN0b3JBZGQxMl9DKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IxM19DLCBQcmVkaWN0b3JBZGQxM19DKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBJbnZlcnNlIHByZWRpY3Rpb24uCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JJbnZlcnNlVHJhbnNmb3JtX0MoY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGluLCB1aW50MzJfdCogb3V0KSB7CisgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOworICBpZiAoeV9zdGFydCA9PSAwKSB7ICAvLyBGaXJzdCBSb3cgZm9sbG93cyB0aGUgTCAobW9kZT0xKSBtb2RlLgorICAgIFByZWRpY3RvckFkZDBfQyhpbiwgTlVMTCwgMSwgb3V0KTsKKyAgICBQcmVkaWN0b3JBZGQxX0MoaW4gKyAxLCBOVUxMLCB3aWR0aCAtIDEsIG91dCArIDEpOworICAgIGluICs9IHdpZHRoOworICAgIG91dCArPSB3aWR0aDsKKyAgICArK3lfc3RhcnQ7CisgIH0KKworICB7CisgICAgaW50IHkgPSB5X3N0YXJ0OworICAgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOworICAgIGNvbnN0IGludCBtYXNrID0gdGlsZV93aWR0aCAtIDE7CisgICAgY29uc3QgaW50IHRpbGVzX3Blcl9yb3cgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtLT5iaXRzXyk7CisgICAgY29uc3QgdWludDMyX3QqIHByZWRfbW9kZV9iYXNlID0KKyAgICAgICAgdHJhbnNmb3JtLT5kYXRhXyArICh5ID4+IHRyYW5zZm9ybS0+Yml0c18pICogdGlsZXNfcGVyX3JvdzsKKworICAgIHdoaWxlICh5IDwgeV9lbmQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90KiBwcmVkX21vZGVfc3JjID0gcHJlZF9tb2RlX2Jhc2U7CisgICAgICBpbnQgeCA9IDE7CisgICAgICAvLyBGaXJzdCBwaXhlbCBmb2xsb3dzIHRoZSBUIChtb2RlPTIpIG1vZGUuCisgICAgICBQcmVkaWN0b3JBZGQyX0MoaW4sIG91dCAtIHdpZHRoLCAxLCBvdXQpOworICAgICAgLy8gLi4gdGhlIHJlc3Q6CisgICAgICB3aGlsZSAoeCA8IHdpZHRoKSB7CisgICAgICAgIGNvbnN0IFZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIHByZWRfZnVuYyA9CisgICAgICAgICAgICBWUDhMUHJlZGljdG9yc0FkZFsoKCpwcmVkX21vZGVfc3JjKyspID4+IDgpICYgMHhmXTsKKyAgICAgICAgaW50IHhfZW5kID0gKHggJiB+bWFzaykgKyB0aWxlX3dpZHRoOworICAgICAgICBpZiAoeF9lbmQgPiB3aWR0aCkgeF9lbmQgPSB3aWR0aDsKKyAgICAgICAgcHJlZF9mdW5jKGluICsgeCwgb3V0ICsgeCAtIHdpZHRoLCB4X2VuZCAtIHgsIG91dCArIHgpOworICAgICAgICB4ID0geF9lbmQ7CisgICAgICB9CisgICAgICBpbiArPSB3aWR0aDsKKyAgICAgIG91dCArPSB3aWR0aDsKKyAgICAgICsreTsKKyAgICAgIGlmICgoeSAmIG1hc2spID09IDApIHsgICAvLyBVc2UgdGhlIHNhbWUgbWFzaywgc2luY2UgdGlsZXMgYXJlIHNxdWFyZXMuCisgICAgICAgIHByZWRfbW9kZV9iYXNlICs9IHRpbGVzX3Blcl9yb3c7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIEFkZCBncmVlbiB0byBibHVlIGFuZCByZWQgY2hhbm5lbHMgKGkuZS4gcGVyZm9ybSB0aGUgaW52ZXJzZSB0cmFuc2Zvcm0gb2YKKy8vICdzdWJ0cmFjdCBncmVlbicpLgordm9pZCBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWRfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBzcmNbaV07CisgICAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSAoKGFyZ2IgPj4gOCkgJiAweGZmKTsKKyAgICB1aW50MzJfdCByZWRfYmx1ZSA9IChhcmdiICYgMHgwMGZmMDBmZnUpOworICAgIHJlZF9ibHVlICs9IChncmVlbiA8PCAxNikgfCBncmVlbjsKKyAgICByZWRfYmx1ZSAmPSAweDAwZmYwMGZmdTsKKyAgICBkc3RbaV0gPSAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IHJlZF9ibHVlOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QgY29sb3IpIHsKKyAgcmV0dXJuICgoaW50KWNvbG9yX3ByZWQgKiBjb2xvcikgPj4gNTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyh1aW50MzJfdCBjb2xvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyAgPSAoY29sb3JfY29kZSA+PiAgMCkgJiAweGZmOworICBtLT5ncmVlbl90b19ibHVlXyA9IChjb2xvcl9jb2RlID4+ICA4KSAmIDB4ZmY7CisgIG0tPnJlZF90b19ibHVlXyAgID0gKGNvbG9yX2NvZGUgPj4gMTYpICYgMHhmZjsKK30KKwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9IHNyY1tpXTsKKyAgICBjb25zdCB1aW50MzJfdCBncmVlbiA9IGFyZ2IgPj4gODsKKyAgICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICAgIGludCBuZXdfcmVkID0gcmVkICYgMHhmZjsKKyAgICBpbnQgbmV3X2JsdWUgPSBhcmdiICYgMHhmZjsKKyAgICBuZXdfcmVkICs9IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fcmVkXywgZ3JlZW4pOworICAgIG5ld19yZWQgJj0gMHhmZjsKKyAgICBuZXdfYmx1ZSArPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX2JsdWVfLCBncmVlbik7CisgICAgbmV3X2JsdWUgKz0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5yZWRfdG9fYmx1ZV8sIG5ld19yZWQpOworICAgIG5ld19ibHVlICY9IDB4ZmY7CisgICAgZHN0W2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCAobmV3X3JlZCA8PCAxNikgfCAobmV3X2JsdWUpOworICB9Cit9CisKKy8vIENvbG9yIHNwYWNlIGludmVyc2UgdHJhbnNmb3JtLgorc3RhdGljIHZvaWQgQ29sb3JTcGFjZUludmVyc2VUcmFuc2Zvcm1fQyhjb25zdCBWUDhMVHJhbnNmb3JtKiBjb25zdCB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsIHVpbnQzMl90KiBkc3QpIHsKKyAgY29uc3QgaW50IHdpZHRoID0gdHJhbnNmb3JtLT54c2l6ZV87CisgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gMSA8PCB0cmFuc2Zvcm0tPmJpdHNfOworICBjb25zdCBpbnQgbWFzayA9IHRpbGVfd2lkdGggLSAxOworICBjb25zdCBpbnQgc2FmZV93aWR0aCA9IHdpZHRoICYgfm1hc2s7CisgIGNvbnN0IGludCByZW1haW5pbmdfd2lkdGggPSB3aWR0aCAtIHNhZmVfd2lkdGg7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIHRyYW5zZm9ybS0+Yml0c18pOworICBpbnQgeSA9IHlfc3RhcnQ7CisgIGNvbnN0IHVpbnQzMl90KiBwcmVkX3JvdyA9CisgICAgICB0cmFuc2Zvcm0tPmRhdGFfICsgKHkgPj4gdHJhbnNmb3JtLT5iaXRzXykgKiB0aWxlc19wZXJfcm93OworCisgIHdoaWxlICh5IDwgeV9lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCogcHJlZCA9IHByZWRfcm93OworICAgIFZQOExNdWx0aXBsaWVycyBtID0geyAwLCAwLCAwIH07CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19zYWZlX2VuZCA9IHNyYyArIHNhZmVfd2lkdGg7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19lbmQgPSBzcmMgKyB3aWR0aDsKKyAgICB3aGlsZSAoc3JjIDwgc3JjX3NhZmVfZW5kKSB7CisgICAgICBDb2xvckNvZGVUb011bHRpcGxpZXJzKCpwcmVkKyssICZtKTsKKyAgICAgIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UoJm0sIHNyYywgdGlsZV93aWR0aCwgZHN0KTsKKyAgICAgIHNyYyArPSB0aWxlX3dpZHRoOworICAgICAgZHN0ICs9IHRpbGVfd2lkdGg7CisgICAgfQorICAgIGlmIChzcmMgPCBzcmNfZW5kKSB7ICAvLyBMZWZ0LW92ZXJzIHVzaW5nIEMtdmVyc2lvbi4KKyAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoKnByZWQrKywgJm0pOworICAgICAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSgmbSwgc3JjLCByZW1haW5pbmdfd2lkdGgsIGRzdCk7CisgICAgICBzcmMgKz0gcmVtYWluaW5nX3dpZHRoOworICAgICAgZHN0ICs9IHJlbWFpbmluZ193aWR0aDsKKyAgICB9CisgICAgKyt5OworICAgIGlmICgoeSAmIG1hc2spID09IDApIHByZWRfcm93ICs9IHRpbGVzX3Blcl9yb3c7CisgIH0KK30KKworLy8gU2VwYXJhdGUgb3V0IHBpeGVscyBwYWNrZWQgdG9nZXRoZXIgdXNpbmcgcGl4ZWwtYnVuZGxpbmcuCisvLyBXZSBkZWZpbmUgdHdvIG1ldGhvZHMgZm9yIEFSR0IgZGF0YSAodWludDMyX3QpIGFuZCBhbHBoYS1vbmx5IGRhdGEgKHVpbnQ4X3QpLgorI2RlZmluZSBDT0xPUl9JTkRFWF9JTlZFUlNFKEZVTkNfTkFNRSwgRl9OQU1FLCBTVEFUSUNfREVDTCwgVFlQRSwgQklUX1NVRkZJWCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfSU5ERVgsIEdFVF9WQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGX05BTUUoY29uc3QgVFlQRSogc3JjLCBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIFRZUEUqIGRzdCwgaW50IHlfc3RhcnQsIGludCB5X2VuZCwgaW50IHdpZHRoKSB7ICAgICAgICAgICAgIFwKKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IHlfc3RhcnQ7IHkgPCB5X2VuZDsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqZHN0KysgPSBHRVRfVkFMVUUoY29sb3JfbWFwW0dFVF9JTkRFWCgqc3JjKyspXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorU1RBVElDX0RFQ0wgdm9pZCBGVU5DX05BTUUoY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X3N0YXJ0LCBpbnQgeV9lbmQsIGNvbnN0IFRZUEUqIHNyYywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUWVBFKiBkc3QpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IGJpdHNfcGVyX3BpeGVsID0gOCA+PiB0cmFuc2Zvcm0tPmJpdHNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwID0gdHJhbnNmb3JtLT5kYXRhXzsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJpdHNfcGVyX3BpeGVsIDwgOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHBpeGVsc19wZXJfYnl0ZSA9IDEgPDwgdHJhbnNmb3JtLT5iaXRzXzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBjb3VudF9tYXNrID0gcGl4ZWxzX3Blcl9ieXRlIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCBiaXRfbWFzayA9ICgxIDw8IGJpdHNfcGVyX3BpeGVsKSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh5ID0geV9zdGFydDsgeSA8IHlfZW5kOyArK3kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdWludDMyX3QgcGFja2VkX3BpeGVscyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBXZSBuZWVkIHRvIGxvYWQgZnJlc2ggJ3BhY2tlZF9waXhlbHMnIG9uY2UgZXZlcnkgICAgICAgICAgICAgICAgKi8gIFwKKyAgICAgICAgLyogJ3BpeGVsc19wZXJfYnl0ZScgaW5jcmVtZW50cyBvZiB4LiBGb3J0dW5hdGVseSwgcGl4ZWxzX3Blcl9ieXRlICovICBcCisgICAgICAgIC8qIGlzIGEgcG93ZXIgb2YgMiwgc28gY2FuIGp1c3QgdXNlIGEgbWFzayBmb3IgdGhhdCwgaW5zdGVhZCBvZiAgICAqLyAgXAorICAgICAgICAvKiBkZWNyZW1lbnRpbmcgYSBjb3VudGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIFwKKyAgICAgICAgaWYgKCh4ICYgY291bnRfbWFzaykgPT0gMCkgcGFja2VkX3BpeGVscyA9IEdFVF9JTkRFWCgqc3JjKyspOyAgICAgICAgICBcCisgICAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbcGFja2VkX3BpeGVscyAmIGJpdF9tYXNrXSk7ICAgICAgICAgICAgICAgXAorICAgICAgICBwYWNrZWRfcGl4ZWxzID4+PSBiaXRzX3Blcl9waXhlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMTWFwQ29sb3IjI0JJVF9TVUZGSVgoc3JjLCBjb2xvcl9tYXAsIGRzdCwgeV9zdGFydCwgeV9lbmQsIHdpZHRoKTsgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitDT0xPUl9JTkRFWF9JTlZFUlNFKENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtX0MsIE1hcEFSR0JfQywgc3RhdGljLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgMzJiLCBWUDhHZXRBUkdCSW5kZXgsIFZQOEdldEFSR0JWYWx1ZSkKK0NPTE9SX0lOREVYX0lOVkVSU0UoVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEsIE1hcEFscGhhX0MsICwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCwgOGIsIFZQOEdldEFscGhhSW5kZXgsIFZQOEdldEFscGhhVmFsdWUpCisKKyN1bmRlZiBDT0xPUl9JTkRFWF9JTlZFUlNFCisKK3ZvaWQgVlA4TEludmVyc2VUcmFuc2Zvcm0oY29uc3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3N0YXJ0LCBpbnQgcm93X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGluLCB1aW50MzJfdCogY29uc3Qgb3V0KSB7CisgIGNvbnN0IGludCB3aWR0aCA9IHRyYW5zZm9ybS0+eHNpemVfOworICBhc3NlcnQocm93X3N0YXJ0IDwgcm93X2VuZCk7CisgIGFzc2VydChyb3dfZW5kIDw9IHRyYW5zZm9ybS0+eXNpemVfKTsKKyAgc3dpdGNoICh0cmFuc2Zvcm0tPnR5cGVfKSB7CisgICAgY2FzZSBTVUJUUkFDVF9HUkVFTjoKKyAgICAgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZChpbiwgKHJvd19lbmQgLSByb3dfc3RhcnQpICogd2lkdGgsIG91dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBSRURJQ1RPUl9UUkFOU0ZPUk06CisgICAgICBQcmVkaWN0b3JJbnZlcnNlVHJhbnNmb3JtX0ModHJhbnNmb3JtLCByb3dfc3RhcnQsIHJvd19lbmQsIGluLCBvdXQpOworICAgICAgaWYgKHJvd19lbmQgIT0gdHJhbnNmb3JtLT55c2l6ZV8pIHsKKyAgICAgICAgLy8gVGhlIGxhc3QgcHJlZGljdGVkIHJvdyBpbiB0aGlzIGl0ZXJhdGlvbiB3aWxsIGJlIHRoZSB0b3AtcHJlZCByb3cKKyAgICAgICAgLy8gZm9yIHRoZSBmaXJzdCByb3cgaW4gbmV4dCBpdGVyYXRpb24uCisgICAgICAgIG1lbWNweShvdXQgLSB3aWR0aCwgb3V0ICsgKHJvd19lbmQgLSByb3dfc3RhcnQgLSAxKSAqIHdpZHRoLAorICAgICAgICAgICAgICAgd2lkdGggKiBzaXplb2YoKm91dCkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBDUk9TU19DT0xPUl9UUkFOU0ZPUk06CisgICAgICBDb2xvclNwYWNlSW52ZXJzZVRyYW5zZm9ybV9DKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBpbiwgb3V0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQ09MT1JfSU5ERVhJTkdfVFJBTlNGT1JNOgorICAgICAgaWYgKGluID09IG91dCAmJiB0cmFuc2Zvcm0tPmJpdHNfID4gMCkgeworICAgICAgICAvLyBNb3ZlIHBhY2tlZCBwaXhlbHMgdG8gdGhlIGVuZCBvZiB1bnBhY2tlZCByZWdpb24sIHNvIHRoYXQgdW5wYWNraW5nCisgICAgICAgIC8vIGNhbiBvY2N1ciBzZWFtbGVzc2x5LgorICAgICAgICAvLyBBbHNvLCBub3RlIHRoYXQgdGhpcyBpcyB0aGUgb25seSB0cmFuc2Zvcm0gdGhhdCBhcHBsaWVzIG9uCisgICAgICAgIC8vIHRoZSBlZmZlY3RpdmUgd2lkdGggb2YgVlA4TFN1YlNhbXBsZVNpemUoeHNpemVfLCBiaXRzXykuIEFsbCBvdGhlcgorICAgICAgICAvLyB0cmFuc2Zvcm1zIHdvcmsgb24gZWZmZWN0aXZlIHdpZHRoIG9mIHhzaXplXy4KKyAgICAgICAgY29uc3QgaW50IG91dF9zdHJpZGUgPSAocm93X2VuZCAtIHJvd19zdGFydCkgKiB3aWR0aDsKKyAgICAgICAgY29uc3QgaW50IGluX3N0cmlkZSA9IChyb3dfZW5kIC0gcm93X3N0YXJ0KSAqCisgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh0cmFuc2Zvcm0tPnhzaXplXywgdHJhbnNmb3JtLT5iaXRzXyk7CisgICAgICAgIHVpbnQzMl90KiBjb25zdCBzcmMgPSBvdXQgKyBvdXRfc3RyaWRlIC0gaW5fc3RyaWRlOworICAgICAgICBtZW1tb3ZlKHNyYywgb3V0LCBpbl9zdHJpZGUgKiBzaXplb2YoKnNyYykpOworICAgICAgICBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybV9DKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBzcmMsIG91dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb2xvckluZGV4SW52ZXJzZVRyYW5zZm9ybV9DKHRyYW5zZm9ybSwgcm93X3N0YXJ0LCByb3dfZW5kLCBpbiwgb3V0KTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBzcGFjZSBjb252ZXJzaW9uLgorCitzdGF0aWMgaW50IGlzX2JpZ19lbmRpYW4odm9pZCkgeworICBzdGF0aWMgY29uc3QgdW5pb24geworICAgIHVpbnQxNl90IHc7CisgICAgdWludDhfdCBiWzJdOworICB9IHRtcCA9IHsgMSB9OworICByZXR1cm4gKHRtcC5iWzBdICE9IDEpOworfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCX0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgICpkc3QrKyA9IChhcmdiID4+IDE2KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDgpICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOworICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAxNikgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gIDApICYgMHhmZjsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAyNCkgJiAweGZmOworICB9Cit9CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKGFyZ2IgPj4gMTYpICYgMHhmMCkgfCAoKGFyZ2IgPj4gMTIpICYgMHhmKTsKKyAgICBjb25zdCB1aW50OF90IGJhID0gKChhcmdiID4+ICAwKSAmIDB4ZjApIHwgKChhcmdiID4+IDI4KSAmIDB4Zik7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAqZHN0KysgPSBiYTsKKyAgICAqZHN0KysgPSByZzsKKyNlbHNlCisgICAgKmRzdCsrID0gcmc7CisgICAgKmRzdCsrID0gYmE7CisjZW5kaWYKKyAgfQorfQorCit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1X0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmNfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhcmdiID0gKnNyYysrOworICAgIGNvbnN0IHVpbnQ4X3QgcmcgPSAoKGFyZ2IgPj4gMTYpICYgMHhmOCkgfCAoKGFyZ2IgPj4gMTMpICYgMHg3KTsKKyAgICBjb25zdCB1aW50OF90IGdiID0gKChhcmdiID4+ICA1KSAmIDB4ZTApIHwgKChhcmdiID4+ICAzKSAmIDB4MWYpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgKmRzdCsrID0gZ2I7CisgICAgKmRzdCsrID0gcmc7CisjZWxzZQorICAgICpkc3QrKyA9IHJnOworICAgICpkc3QrKyA9IGdiOworI2VuZGlmCisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEJHUkFUb0JHUl9DKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIHdoaWxlIChzcmMgPCBzcmNfZW5kKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYiA9ICpzcmMrKzsKKyAgICAqZHN0KysgPSAoYXJnYiA+PiAgMCkgJiAweGZmOworICAgICpkc3QrKyA9IChhcmdiID4+ICA4KSAmIDB4ZmY7CisgICAgKmRzdCsrID0gKGFyZ2IgPj4gMTYpICYgMHhmZjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb3B5T3JTd2FwKGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBzd2FwX29uX2JpZ19lbmRpYW4pIHsKKyAgaWYgKGlzX2JpZ19lbmRpYW4oKSA9PSBzd2FwX29uX2JpZ19lbmRpYW4pIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgICAgd2hpbGUgKHNyYyA8IHNyY19lbmQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSAqc3JjKys7CisgICAgICBXZWJQVWludDMyVG9NZW0oZHN0LCBCU3dhcDMyKGFyZ2IpKTsKKyAgICAgIGRzdCArPSBzaXplb2YoYXJnYik7CisgICAgfQorICB9IGVsc2UgeworICAgIG1lbWNweShkc3QsIHNyYywgbnVtX3BpeGVscyAqIHNpemVvZigqc3JjKSk7CisgIH0KK30KKwordm9pZCBWUDhMQ29udmVydEZyb21CR1JBKGNvbnN0IHVpbnQzMl90KiBjb25zdCBpbl9kYXRhLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NTUF9NT0RFIG91dF9jb2xvcnNwYWNlLCB1aW50OF90KiBjb25zdCByZ2JhKSB7CisgIHN3aXRjaCAob3V0X2NvbG9yc3BhY2UpIHsKKyAgICBjYXNlIE1PREVfUkdCOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0IoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfUkdCQToKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9yZ2JBOgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBKGluX2RhdGEsIG51bV9waXhlbHMsIHJnYmEpOworICAgICAgV2ViUEFwcGx5QWxwaGFNdWx0aXBseShyZ2JhLCAwLCBudW1fcGl4ZWxzLCAxLCAwKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9CR1I6CisgICAgICBWUDhMQ29udmVydEJHUkFUb0JHUihpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9CR1JBOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTU9ERV9iZ3JBOgorICAgICAgQ29weU9yU3dhcChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhLCAxKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHkocmdiYSwgMCwgbnVtX3BpeGVscywgMSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQVJHQjoKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfQXJnYjoKKyAgICAgIENvcHlPclN3YXAoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSwgMCk7CisgICAgICBXZWJQQXBwbHlBbHBoYU11bHRpcGx5KHJnYmEsIDEsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1JHQkFfNDQ0NDoKKyAgICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQoaW5fZGF0YSwgbnVtX3BpeGVscywgcmdiYSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE1PREVfcmdiQV80NDQ0OgorICAgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NChpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIFdlYlBBcHBseUFscGhhTXVsdGlwbHk0NDQ0KHJnYmEsIG51bV9waXhlbHMsIDEsIDApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBNT0RFX1JHQl81NjU6CisgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NShpbl9kYXRhLCBudW1fcGl4ZWxzLCByZ2JhKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBhc3NlcnQoMCk7ICAgICAgICAgIC8vIENvZGUgZmxvdyBzaG91bGQgbm90IHJlYWNoIGhlcmUuCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVlA4TFByb2Nlc3NEZWNCbHVlQW5kUmVkRnVuYyBWUDhMQWRkR3JlZW5Ub0JsdWVBbmRSZWQ7CitWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc0FkZFsxNl07CitWUDhMUHJlZGljdG9yRnVuYyBWUDhMUHJlZGljdG9yc1sxNl07CisKKy8vIGV4cG9zZWQgcGxhaW4tQyBpbXBsZW1lbnRhdGlvbnMKK1ZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzQWRkX0NbMTZdOworVlA4TFByZWRpY3RvckZ1bmMgVlA4TFByZWRpY3RvcnNfQ1sxNl07CisKK1ZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VGdW5jIFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2U7CisKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjsKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE7CitWUDhMQ29udmVydEZ1bmMgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NDsKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQjU2NTsKK1ZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb0JHUjsKKworVlA4TE1hcEFSR0JGdW5jIFZQOExNYXBDb2xvcjMyYjsKK1ZQOExNYXBBbHBoYUZ1bmMgVlA4TE1hcENvbG9yOGI7CisKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0U1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRNU0Eodm9pZCk7CisKKyNkZWZpbmUgQ09QWV9QUkVESUNUT1JfQVJSQVkoSU4sIE9VVCkgZG8geyAgICAgICAgICAgICAgICBcCisgIChPVVQpWzBdID0gSU4jIzBfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxXSA9IElOIyMxX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMl0gPSBJTiMjMl9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzNdID0gSU4jIzNfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs0XSA9IElOIyM0X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbNV0gPSBJTiMjNV9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzZdID0gSU4jIzZfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVs3XSA9IElOIyM3X0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbOF0gPSBJTiMjOF9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzldID0gSU4jIzlfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxMF0gPSBJTiMjMTBfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMTFdID0gSU4jIzExX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChPVVQpWzEyXSA9IElOIyMxMl9DOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAoT1VUKVsxM10gPSBJTiMjMTNfQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKE9VVClbMTRdID0gSU4jIzBfQzsgLyogPC0gcGFkZGluZyBzZWN1cml0eSBzZW50aW5lbHMqLyBcCisgIChPVVQpWzE1XSA9IElOIyMwX0M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhWUDhMRHNwSW5pdCkgeworICBDT1BZX1BSRURJQ1RPUl9BUlJBWShQcmVkaWN0b3IsIFZQOExQcmVkaWN0b3JzKQorICBDT1BZX1BSRURJQ1RPUl9BUlJBWShQcmVkaWN0b3IsIFZQOExQcmVkaWN0b3JzX0MpCisgIENPUFlfUFJFRElDVE9SX0FSUkFZKFByZWRpY3RvckFkZCwgVlA4TFByZWRpY3RvcnNBZGQpCisgIENPUFlfUFJFRElDVE9SX0FSUkFZKFByZWRpY3RvckFkZCwgVlA4TFByZWRpY3RvcnNBZGRfQykKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0M7CisKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VfQzsKKworICBWUDhMQ29udmVydEJHUkFUb1JHQkEgPSBWUDhMQ29udmVydEJHUkFUb1JHQkFfQzsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0IgPSBWUDhMQ29udmVydEJHUkFUb1JHQl9DOworICBWUDhMQ29udmVydEJHUkFUb0JHUiA9IFZQOExDb252ZXJ0QkdSQVRvQkdSX0M7CisjZW5kaWYKKworICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ID0gVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DOworICBWUDhMQ29udmVydEJHUkFUb1JHQjU2NSA9IFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1X0M7CisKKyAgVlA4TE1hcENvbG9yMzJiID0gTWFwQVJHQl9DOworICBWUDhMTWFwQ29sb3I4YiA9IE1hcEFscGhhX0M7CisKKyAgLy8gSWYgZGVmaW5lZCwgdXNlIENQVUluZm8oKSB0byBvdmVyd3JpdGUgc29tZSBwb2ludGVycyB3aXRoIGZhc3RlciB2ZXJzaW9ucy4KKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFZQOExEc3BJbml0U1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOExEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOExEc3BJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBWUDhMRHNwSW5pdE5FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExUcmFuc2Zvcm1Db2xvckludmVyc2UgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29udmVydEJHUkFUb1JHQkEgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29udmVydEJHUkFUb1JHQiAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb252ZXJ0QkdSQVRvQkdSICE9IE5VTEwpOworICBhc3NlcnQoVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1ICE9IE5VTEwpOworICBhc3NlcnQoVlA4TE1hcENvbG9yMzJiICE9IE5VTEwpOworICBhc3NlcnQoVlA4TE1hcENvbG9yOGIgIT0gTlVMTCk7Cit9CisjdW5kZWYgQ09QWV9QUkVESUNUT1JfQVJSQVkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmJiZGZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzcy5oCkBAIC0wLDAgKzEsMjI1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9MT1NTTEVTU19IXworI2RlZmluZSBXRUJQX0RTUF9MT1NTTEVTU19IXworCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKworI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGluZworCit0eXBlZGVmIHVpbnQzMl90ICgqVlA4TFByZWRpY3RvckZ1bmMpKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApOworZXh0ZXJuIFZQOExQcmVkaWN0b3JGdW5jIFZQOExQcmVkaWN0b3JzWzE2XTsKK2V4dGVybiBWUDhMUHJlZGljdG9yRnVuYyBWUDhMUHJlZGljdG9yc19DWzE2XTsKKy8vIFRoZXNlIEFkZC9TdWIgZnVuY3Rpb24gZXhwZWN0cyB1cHBlclstMV0gYW5kIG91dFstMV0gdG8gYmUgcmVhZGFibGUuCit0eXBlZGVmIHZvaWQgKCpWUDhMUHJlZGljdG9yQWRkU3ViRnVuYykoY29uc3QgdWludDMyX3QqIGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dCk7CitleHRlcm4gVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNBZGRbMTZdOworZXh0ZXJuIFZQOExQcmVkaWN0b3JBZGRTdWJGdW5jIFZQOExQcmVkaWN0b3JzQWRkX0NbMTZdOworCit0eXBlZGVmIHZvaWQgKCpWUDhMUHJvY2Vzc0RlY0JsdWVBbmRSZWRGdW5jKShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBkc3QpOworZXh0ZXJuIFZQOExQcm9jZXNzRGVjQmx1ZUFuZFJlZEZ1bmMgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIE5vdGU6IHRoZSBtZW1iZXJzIGFyZSB1aW50OF90LCBzbyB0aGF0IGFueSBuZWdhdGl2ZSB2YWx1ZXMgYXJlCisgIC8vIGF1dG9tYXRpY2FsbHkgY29udmVydGVkIHRvICJtb2QgMjU2IiB2YWx1ZXMuCisgIHVpbnQ4X3QgZ3JlZW5fdG9fcmVkXzsKKyAgdWludDhfdCBncmVlbl90b19ibHVlXzsKKyAgdWludDhfdCByZWRfdG9fYmx1ZV87Cit9IFZQOExNdWx0aXBsaWVyczsKK3R5cGVkZWYgdm9pZCAoKlZQOExUcmFuc2Zvcm1Db2xvckludmVyc2VGdW5jKShjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIGRzdCk7CitleHRlcm4gVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZUZ1bmMgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZTsKKworc3RydWN0IFZQOExUcmFuc2Zvcm07ICAvLyBEZWZpbmVkIGluIGRlYy92cDhsaS5oLgorCisvLyBQZXJmb3JtcyBpbnZlcnNlIHRyYW5zZm9ybSBvZiBkYXRhIGdpdmVuIHRyYW5zZm9ybSBpbmZvcm1hdGlvbiwgc3RhcnQgYW5kIGVuZAorLy8gcm93cy4gVHJhbnNmb3JtIHdpbGwgYmUgYXBwbGllZCB0byByb3dzIFtyb3dfc3RhcnQsIHJvd19lbmRbLgorLy8gVGhlICppbiBhbmQgKm91dCBwb2ludGVycyByZWZlciB0byBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRhdGEgcmVzcGVjdGl2ZWx5CisvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnRlcm1lZGlhdGUgcm93IChyb3dfc3RhcnQpLgordm9pZCBWUDhMSW52ZXJzZVRyYW5zZm9ybShjb25zdCBzdHJ1Y3QgVlA4TFRyYW5zZm9ybSogY29uc3QgdHJhbnNmb3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm93X3N0YXJ0LCBpbnQgcm93X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGluLCB1aW50MzJfdCogY29uc3Qgb3V0KTsKKworLy8gQ29sb3Igc3BhY2UgY29udmVyc2lvbi4KK3R5cGVkZWYgdm9pZCAoKlZQOExDb252ZXJ0RnVuYykoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7CitleHRlcm4gVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCOworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb1JHQkE7CitleHRlcm4gVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDQ7CitleHRlcm4gVlA4TENvbnZlcnRGdW5jIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1OworZXh0ZXJuIFZQOExDb252ZXJ0RnVuYyBWUDhMQ29udmVydEJHUkFUb0JHUjsKKworLy8gQ29udmVydHMgZnJvbSBCR1JBIHRvIG90aGVyIGNvbG9yIHNwYWNlcy4KK3ZvaWQgVlA4TENvbnZlcnRGcm9tQkdSQShjb25zdCB1aW50MzJfdCogY29uc3QgaW5fZGF0YSwgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9DU1BfTU9ERSBvdXRfY29sb3JzcGFjZSwgdWludDhfdCogY29uc3QgcmdiYSk7CisKK3R5cGVkZWYgdm9pZCAoKlZQOExNYXBBUkdCRnVuYykoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGNvbG9yX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgaW50IHlfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5X2VuZCwgaW50IHdpZHRoKTsKK3R5cGVkZWYgdm9pZCAoKlZQOExNYXBBbHBoYUZ1bmMpKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBjb2xvcl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCB5X3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfZW5kLCBpbnQgd2lkdGgpOworCitleHRlcm4gVlA4TE1hcEFSR0JGdW5jIFZQOExNYXBDb2xvcjMyYjsKK2V4dGVybiBWUDhMTWFwQWxwaGFGdW5jIFZQOExNYXBDb2xvcjhiOworCisvLyBTaW1pbGFyIHRvIHRoZSBzdGF0aWMgbWV0aG9kIENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtKCkgdGhhdCBpcyBwYXJ0IG9mCisvLyBsb3NzbGVzcy5jLCBidXQgdXNlZCBvbmx5IGZvciBhbHBoYSBkZWNvZGluZy4gSXQgdGFrZXMgdWludDhfdCAocmF0aGVyIHRoYW4KKy8vIHVpbnQzMl90KSBhcmd1bWVudHMgZm9yICdzcmMnIGFuZCAnZHN0Jy4KK3ZvaWQgVlA4TENvbG9ySW5kZXhJbnZlcnNlVHJhbnNmb3JtQWxwaGEoCisgICAgY29uc3Qgc3RydWN0IFZQOExUcmFuc2Zvcm0qIGNvbnN0IHRyYW5zZm9ybSwgaW50IHlfc3RhcnQsIGludCB5X2VuZCwKKyAgICBjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCk7CisKKy8vIEV4cG9zZSBzb21lIEMtb25seSBmYWxsYmFjayBmdW5jdGlvbnMKK3ZvaWQgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCk7CisKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9SR0JBX0MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfQyhjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1X0MoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TENvbnZlcnRCR1JBVG9CR1JfQyhjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIGFib3ZlIG1ldGhvZHMuCit2b2lkIFZQOExEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW5jb2RpbmcKKwordHlwZWRlZiB2b2lkICgqVlA4TFByb2Nlc3NFbmNCbHVlQW5kUmVkRnVuYykodWludDMyX3QqIGRzdCwgaW50IG51bV9waXhlbHMpOworZXh0ZXJuIFZQOExQcm9jZXNzRW5jQmx1ZUFuZFJlZEZ1bmMgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZDsKK3R5cGVkZWYgdm9pZCAoKlZQOExUcmFuc2Zvcm1Db2xvckZ1bmMpKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QsIGludCBudW1fcGl4ZWxzKTsKK2V4dGVybiBWUDhMVHJhbnNmb3JtQ29sb3JGdW5jIFZQOExUcmFuc2Zvcm1Db2xvcjsKK3R5cGVkZWYgdm9pZCAoKlZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc0Z1bmMpKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwgaW50IGhpc3RvW10pOworZXh0ZXJuIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zOworCit0eXBlZGVmIHZvaWQgKCpWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc0Z1bmMpKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pOworZXh0ZXJuIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zRnVuYyBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtczsKKworLy8gRXhwb3NlIHNvbWUgQy1vbmx5IGZhbGxiYWNrIGZ1bmN0aW9ucwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkYXRhLCBpbnQgbnVtX3BpeGVscyk7Cit2b2lkIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyh1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscyk7Cit2b2lkIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSk7Cit2b2lkIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGlzdG9bXSk7CisKK2V4dGVybiBWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc1N1YlsxNl07CitleHRlcm4gVlA4TFByZWRpY3RvckFkZFN1YkZ1bmMgVlA4TFByZWRpY3RvcnNTdWJfQ1sxNl07CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIdWZmbWFuLWNvc3QgcmVsYXRlZCBmdW5jdGlvbnMuCisKK3R5cGVkZWYgZG91YmxlICgqVlA4TENvc3RGdW5jKShjb25zdCB1aW50MzJfdCogcG9wdWxhdGlvbiwgaW50IGxlbmd0aCk7Cit0eXBlZGVmIGRvdWJsZSAoKlZQOExDb3N0Q29tYmluZWRGdW5jKShjb25zdCB1aW50MzJfdCogWCwgY29uc3QgdWludDMyX3QqIFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoKTsKK3R5cGVkZWYgZmxvYXQgKCpWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMpKGNvbnN0IGludCBYWzI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgWVsyNTZdKTsKKworZXh0ZXJuIFZQOExDb3N0RnVuYyBWUDhMRXh0cmFDb3N0OworZXh0ZXJuIFZQOExDb3N0Q29tYmluZWRGdW5jIFZQOExFeHRyYUNvc3RDb21iaW5lZDsKK2V4dGVybiBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weUZ1bmMgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHk7CisKK3R5cGVkZWYgc3RydWN0IHsgICAgICAgIC8vIHNtYWxsIHN0cnVjdCB0byBob2xkIGNvdW50ZXJzCisgIGludCBjb3VudHNbMl07ICAgICAgICAvLyBpbmRleDogMD16ZXJvIHN0ZWFrLCAxPW5vbi16ZXJvIHN0cmVhaworICBpbnQgc3RyZWFrc1syXVsyXTsgICAgLy8gW3plcm8vbm9uLXplcm9dW3N0cmVhazwzIC8gc3RyZWFrPj0zXQorfSBWUDhMU3RyZWFrczsKKwordHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgIC8vIHNtYWxsIHN0cnVjdCB0byBob2xkIGJpdCBlbnRyb3B5IHJlc3VsdHMKKyAgZG91YmxlIGVudHJvcHk7ICAgICAgICAgICAvLyBlbnRyb3B5CisgIHVpbnQzMl90IHN1bTsgICAgICAgICAgICAgLy8gc3VtIG9mIHRoZSBwb3B1bGF0aW9uCisgIGludCBub256ZXJvczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIG5vbi16ZXJvIGVsZW1lbnRzIGluIHRoZSBwb3B1bGF0aW9uCisgIHVpbnQzMl90IG1heF92YWw7ICAgICAgICAgLy8gbWF4aW11bSB2YWx1ZSBpbiB0aGUgcG9wdWxhdGlvbgorICB1aW50MzJfdCBub256ZXJvX2NvZGU7ICAgIC8vIGluZGV4IG9mIHRoZSBsYXN0IG5vbi16ZXJvIGluIHRoZSBwb3B1bGF0aW9uCit9IFZQOExCaXRFbnRyb3B5OworCit2b2lkIFZQOExCaXRFbnRyb3B5SW5pdChWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSk7CisKKy8vIEdldCB0aGUgY29tYmluZWQgc3ltYm9sIGJpdCBlbnRyb3B5IGFuZCBIdWZmbWFuIGNvc3Qgc3RhdHMgZm9yIHRoZQorLy8gZGlzdHJpYnV0aW9ucyAnWCcgYW5kICdZJy4gVGhvc2UgcmVzdWx0cyBjYW4gdGhlbiBiZSByZWZpbmVkIGFjY29yZGluZyB0bworLy8gY29kZWMgc3BlY2lmaWMgaGV1cmlzdGljcy4KK3R5cGVkZWYgdm9pZCAoKlZQOExHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRGdW5jKSgKKyAgICBjb25zdCB1aW50MzJfdCBYW10sIGNvbnN0IHVpbnQzMl90IFlbXSwgaW50IGxlbmd0aCwKKyAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cyk7CitleHRlcm4gVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZEZ1bmMgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZDsKKworLy8gR2V0IHRoZSBlbnRyb3B5IGZvciB0aGUgZGlzdHJpYnV0aW9uICdYJy4KK3R5cGVkZWYgdm9pZCAoKlZQOExHZXRFbnRyb3B5VW5yZWZpbmVkRnVuYykoY29uc3QgdWludDMyX3QgWFtdLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cyk7CitleHRlcm4gVlA4TEdldEVudHJvcHlVbnJlZmluZWRGdW5jIFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkOworCit2b2lkIFZQOExCaXRzRW50cm9weVVucmVmaW5lZChjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXksIGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGVudHJvcHkpOworCit0eXBlZGVmIHZvaWQgKCpWUDhMSGlzdG9ncmFtQWRkRnVuYykoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCk7CitleHRlcm4gVlA4TEhpc3RvZ3JhbUFkZEZ1bmMgVlA4TEhpc3RvZ3JhbUFkZDsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZWZpeEVuY29kZSgpCisKK3R5cGVkZWYgaW50ICgqVlA4TFZlY3Rvck1pc21hdGNoRnVuYykoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwgaW50IGxlbmd0aCk7CisvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCB3aGVyZSBhcnJheTEgYW5kIGFycmF5MiBhcmUgZGlmZmVyZW50LgorZXh0ZXJuIFZQOExWZWN0b3JNaXNtYXRjaEZ1bmMgVlA4TFZlY3Rvck1pc21hdGNoOworCit0eXBlZGVmIHZvaWQgKCpWUDhMQnVuZGxlQ29sb3JNYXBGdW5jKShjb25zdCB1aW50OF90KiBjb25zdCByb3csIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4Yml0cywgdWludDMyX3QqIGRzdCk7CitleHRlcm4gVlA4TEJ1bmRsZUNvbG9yTWFwRnVuYyBWUDhMQnVuZGxlQ29sb3JNYXA7Cit2b2lkIFZQOExCdW5kbGVDb2xvck1hcF9DKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLCBpbnQgeGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpOworCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlIGFib3ZlIG1ldGhvZHMuCit2b2lkIFZQOExFbmNEc3BJbml0KHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfTE9TU0xFU1NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyNjQ4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oCkBAIC0wLDAgKzEsMjAyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtcyBhbmQgY29sb3Igc3BhY2UgY29udmVyc2lvbiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpbmNlbnQgUmFiYXVkICh2cmFiYXVkQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9EU1BfTE9TU0xFU1NfQ09NTU9OX0hfCisjZGVmaW5lIFdFQlBfRFNQX0xPU1NMRVNTX0NPTU1PTl9IXworCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWNvZGluZworCisvLyBjb2xvciBtYXBwaW5nIHJlbGF0ZWQgZnVuY3Rpb25zLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOEdldEFSR0JJbmRleCh1aW50MzJfdCBpZHgpIHsKKyAgcmV0dXJuIChpZHggPj4gOCkgJiAweGZmOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBWUDhHZXRBbHBoYUluZGV4KHVpbnQ4X3QgaWR4KSB7CisgIHJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXRBUkdCVmFsdWUodWludDMyX3QgdmFsKSB7CisgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFZQOEdldEFscGhhVmFsdWUodWludDMyX3QgdmFsKSB7CisgIHJldHVybiAodmFsID4+IDgpICYgMHhmZjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1pc2MgbWV0aG9kcy4KKworLy8gQ29tcHV0ZXMgc2FtcGxlZCBzaXplIG9mICdzaXplJyB3aGVuIHNhbXBsaW5nIHVzaW5nICdzYW1wbGluZyBiaXRzJy4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhMU3ViU2FtcGxlU2l6ZSh1aW50MzJfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nX2JpdHMpIHsKKyAgcmV0dXJuIChzaXplICsgKDEgPDwgc2FtcGxpbmdfYml0cykgLSAxKSA+PiBzYW1wbGluZ19iaXRzOworfQorCisvLyBDb252ZXJ0cyBuZWFyIGxvc3NsZXNzIHF1YWxpdHkgaW50byBtYXggbnVtYmVyIG9mIGJpdHMgc2hhdmVkIG9mZi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TE5lYXJMb3NzbGVzc0JpdHMoaW50IG5lYXJfbG9zc2xlc3NfcXVhbGl0eSkgeworICAvLyAgICAxMDAgLT4gMAorICAvLyA4MC4uOTkgLT4gMQorICAvLyA2MC4uNzkgLT4gMgorICAvLyA0MC4uNTkgLT4gMworICAvLyAyMC4uMzkgLT4gNAorICAvLyAgMC4uMTkgLT4gNQorICByZXR1cm4gNSAtIG5lYXJfbG9zc2xlc3NfcXVhbGl0eSAvIDIwOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmFzdGVyIGxvZ2FyaXRobSBmb3IgaW50ZWdlcnMuIFNtYWxsIHZhbHVlcyB1c2UgYSBsb29rLXVwIHRhYmxlLgorCisvLyBUaGUgdGhyZXNob2xkIHRpbGwgYXBwcm94aW1hdGUgdmVyc2lvbiBvZiBsb2dfMiBjYW4gYmUgdXNlZC4KKy8vIFByYWN0aWNhbGx5LCB3ZSBjYW4gZ2V0IHJpZCBvZiB0aGUgY2FsbCB0byBsb2coKSBhcyB0aGUgdHdvIHZhbHVlcyBtYXRjaCB0bworLy8gdmVyeSBoaWdoIGRlZ3JlZSAodGhlIHJhdGlvIG9mIHRoZXNlIHR3byBpcyAwLjk5OTk5eCkuCisvLyBLZWVwaW5nIGEgaGlnaCB0aHJlc2hvbGQgZm9yIG5vdy4KKyNkZWZpbmUgQVBQUk9YX0xPR19XSVRIX0NPUlJFQ1RJT05fTUFYICA2NTUzNgorI2RlZmluZSBBUFBST1hfTE9HX01BWCAgICAgICAgICAgICAgICAgICA0MDk2CisjZGVmaW5lIExPR18yX1JFQ0lQUk9DQUwgMS40NDI2OTUwNDA4ODg5NjMzODcwMDQ2NTA5NDAwNzA4NgorI2RlZmluZSBMT0dfTE9PS1VQX0lEWF9NQVggMjU2CitleHRlcm4gY29uc3QgZmxvYXQga0xvZzJUYWJsZVtMT0dfTE9PS1VQX0lEWF9NQVhdOworZXh0ZXJuIGNvbnN0IGZsb2F0IGtTTG9nMlRhYmxlW0xPR19MT09LVVBfSURYX01BWF07Cit0eXBlZGVmIGZsb2F0ICgqVlA4TEZhc3RMb2cyU2xvd0Z1bmMpKHVpbnQzMl90IHYpOworCitleHRlcm4gVlA4TEZhc3RMb2cyU2xvd0Z1bmMgVlA4TEZhc3RMb2cyU2xvdzsKK2V4dGVybiBWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdFNMb2cyU2xvdzsKKworc3RhdGljIFdFQlBfSU5MSU5FIGZsb2F0IFZQOExGYXN0TG9nMih1aW50MzJfdCB2KSB7CisgIHJldHVybiAodiA8IExPR19MT09LVVBfSURYX01BWCkgPyBrTG9nMlRhYmxlW3ZdIDogVlA4TEZhc3RMb2cyU2xvdyh2KTsKK30KKy8vIEZhc3QgY2FsY3VsYXRpb24gb2YgdiAqIGxvZzIodikgZm9yIGludGVnZXIgaW5wdXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgZmxvYXQgVlA4TEZhc3RTTG9nMih1aW50MzJfdCB2KSB7CisgIHJldHVybiAodiA8IExPR19MT09LVVBfSURYX01BWCkgPyBrU0xvZzJUYWJsZVt2XSA6IFZQOExGYXN0U0xvZzJTbG93KHYpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHJlZml4RW5jb2RlKCkKKworLy8gU3BsaXR0aW5nIG9mIGRpc3RhbmNlIGFuZCBsZW5ndGggY29kZXMgaW50byBwcmVmaXhlcyBhbmQKKy8vIGV4dHJhIGJpdHMuIFRoZSBwcmVmaXhlcyBhcmUgZW5jb2RlZCB3aXRoIGFuIGVudHJvcHkgY29kZQorLy8gd2hpbGUgdGhlIGV4dHJhIGJpdHMgYXJlIHN0b3JlZCBqdXN0IGFzIG5vcm1hbCBiaXRzLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFByZWZpeEVuY29kZUJpdHNOb0xVVChpbnQgZGlzdGFuY2UsIGludCogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzKSB7CisgIGNvbnN0IGludCBoaWdoZXN0X2JpdCA9IEJpdHNMb2cyRmxvb3IoLS1kaXN0YW5jZSk7CisgIGNvbnN0IGludCBzZWNvbmRfaGlnaGVzdF9iaXQgPSAoZGlzdGFuY2UgPj4gKGhpZ2hlc3RfYml0IC0gMSkpICYgMTsKKyAgKmV4dHJhX2JpdHMgPSBoaWdoZXN0X2JpdCAtIDE7CisgICpjb2RlID0gMiAqIGhpZ2hlc3RfYml0ICsgc2Vjb25kX2hpZ2hlc3RfYml0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlTm9MVVQoaW50IGRpc3RhbmNlLCBpbnQqIGNvbnN0IGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c192YWx1ZSkgeworICBjb25zdCBpbnQgaGlnaGVzdF9iaXQgPSBCaXRzTG9nMkZsb29yKC0tZGlzdGFuY2UpOworICBjb25zdCBpbnQgc2Vjb25kX2hpZ2hlc3RfYml0ID0gKGRpc3RhbmNlID4+IChoaWdoZXN0X2JpdCAtIDEpKSAmIDE7CisgICpleHRyYV9iaXRzID0gaGlnaGVzdF9iaXQgLSAxOworICAqZXh0cmFfYml0c192YWx1ZSA9IGRpc3RhbmNlICYgKCgxIDw8ICpleHRyYV9iaXRzKSAtIDEpOworICAqY29kZSA9IDIgKiBoaWdoZXN0X2JpdCArIHNlY29uZF9oaWdoZXN0X2JpdDsKK30KKworI2RlZmluZSBQUkVGSVhfTE9PS1VQX0lEWF9NQVggICA1MTIKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50OF90IGNvZGVfOworICBpbnQ4X3QgZXh0cmFfYml0c187Cit9IFZQOExQcmVmaXhDb2RlOworCisvLyBUaGVzZSB0YWJsZXMgYXJlIGRlcml2ZWQgdXNpbmcgVlA4TFByZWZpeEVuY29kZU5vTFVULgorZXh0ZXJuIGNvbnN0IFZQOExQcmVmaXhDb2RlIGtQcmVmaXhFbmNvZGVDb2RlW1BSRUZJWF9MT09LVVBfSURYX01BWF07CitleHRlcm4gY29uc3QgdWludDhfdCBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbUFJFRklYX0xPT0tVUF9JRFhfTUFYXTsKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQcmVmaXhFbmNvZGVCaXRzKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBleHRyYV9iaXRzKSB7CisgIGlmIChkaXN0YW5jZSA8IFBSRUZJWF9MT09LVVBfSURYX01BWCkgeworICAgIGNvbnN0IFZQOExQcmVmaXhDb2RlIHByZWZpeF9jb2RlID0ga1ByZWZpeEVuY29kZUNvZGVbZGlzdGFuY2VdOworICAgICpjb2RlID0gcHJlZml4X2NvZGUuY29kZV87CisgICAgKmV4dHJhX2JpdHMgPSBwcmVmaXhfY29kZS5leHRyYV9iaXRzXzsKKyAgfSBlbHNlIHsKKyAgICBWUDhMUHJlZml4RW5jb2RlQml0c05vTFVUKGRpc3RhbmNlLCBjb2RlLCBleHRyYV9iaXRzKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUHJlZml4RW5jb2RlKGludCBkaXN0YW5jZSwgaW50KiBjb25zdCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGV4dHJhX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZXh0cmFfYml0c192YWx1ZSkgeworICBpZiAoZGlzdGFuY2UgPCBQUkVGSVhfTE9PS1VQX0lEWF9NQVgpIHsKKyAgICBjb25zdCBWUDhMUHJlZml4Q29kZSBwcmVmaXhfY29kZSA9IGtQcmVmaXhFbmNvZGVDb2RlW2Rpc3RhbmNlXTsKKyAgICAqY29kZSA9IHByZWZpeF9jb2RlLmNvZGVfOworICAgICpleHRyYV9iaXRzID0gcHJlZml4X2NvZGUuZXh0cmFfYml0c187CisgICAgKmV4dHJhX2JpdHNfdmFsdWUgPSBrUHJlZml4RW5jb2RlRXh0cmFCaXRzVmFsdWVbZGlzdGFuY2VdOworICB9IGVsc2UgeworICAgIFZQOExQcmVmaXhFbmNvZGVOb0xVVChkaXN0YW5jZSwgY29kZSwgZXh0cmFfYml0cywgZXh0cmFfYml0c192YWx1ZSk7CisgIH0KK30KKworLy8gU3VtIG9mIGVhY2ggY29tcG9uZW50LCBtb2QgMjU2Lgorc3RhdGljIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XIFdFQlBfSU5MSU5FCit1aW50MzJfdCBWUDhMQWRkUGl4ZWxzKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKKyAgY29uc3QgdWludDMyX3QgYWxwaGFfYW5kX2dyZWVuID0gKGEgJiAweGZmMDBmZjAwdSkgKyAoYiAmIDB4ZmYwMGZmMDB1KTsKKyAgY29uc3QgdWludDMyX3QgcmVkX2FuZF9ibHVlID0gKGEgJiAweDAwZmYwMGZmdSkgKyAoYiAmIDB4MDBmZjAwZmZ1KTsKKyAgcmV0dXJuIChhbHBoYV9hbmRfZ3JlZW4gJiAweGZmMDBmZjAwdSkgfCAocmVkX2FuZF9ibHVlICYgMHgwMGZmMDBmZnUpOworfQorCisvLyBEaWZmZXJlbmNlIG9mIGVhY2ggY29tcG9uZW50LCBtb2QgMjU2Lgorc3RhdGljIFdFQlBfVUJTQU5fSUdOT1JFX1VOU0lHTkVEX09WRVJGTE9XIFdFQlBfSU5MSU5FCit1aW50MzJfdCBWUDhMU3ViUGl4ZWxzKHVpbnQzMl90IGEsIHVpbnQzMl90IGIpIHsKKyAgY29uc3QgdWludDMyX3QgYWxwaGFfYW5kX2dyZWVuID0KKyAgICAgIDB4MDBmZjAwZmZ1ICsgKGEgJiAweGZmMDBmZjAwdSkgLSAoYiAmIDB4ZmYwMGZmMDB1KTsKKyAgY29uc3QgdWludDMyX3QgcmVkX2FuZF9ibHVlID0KKyAgICAgIDB4ZmYwMGZmMDB1ICsgKGEgJiAweDAwZmYwMGZmdSkgLSAoYiAmIDB4MDBmZjAwZmZ1KTsKKyAgcmV0dXJuIChhbHBoYV9hbmRfZ3JlZW4gJiAweGZmMDBmZjAwdSkgfCAocmVkX2FuZF9ibHVlICYgMHgwMGZmMDBmZnUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVHJhbnNmb3JtLXJlbGF0ZWQgZnVuY3Rpb25zIHVzZSBkaW4gYm90aCBlbmNvZGluZyBhbmQgZGVjb2RpbmcuCisKKy8vIE1hY3JvcyB1c2VkIHRvIGNyZWF0ZSBhIGJhdGNoIHByZWRpY3RvciB0aGF0IGl0ZXJhdGl2ZWx5IHVzZXMgYQorLy8gb25lLXBpeGVsIHByZWRpY3Rvci4KKworLy8gVGhlIHByZWRpY3RvciBpcyBhZGRlZCB0byB0aGUgb3V0cHV0IHBpeGVsICh3aGljaAorLy8gaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgYXMgYSByZXNpZHVhbCkgdG8gZ2V0IHRoZSBmaW5hbCBwcmVkaWN0aW9uLgorI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfQUREKFBSRURJQ1RPUiwgUFJFRElDVE9SX0FERCkgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUFJFRElDVE9SX0FERChjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeyAgICAgICAgICAgXAorICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHggPSAwOyB4IDwgbnVtX3BpeGVsczsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHByZWQgPSAoUFJFRElDVE9SKShvdXRbeCAtIDFdLCB1cHBlciArIHgpOyAgICAgICAgXAorICAgIG91dFt4XSA9IFZQOExBZGRQaXhlbHMoaW5beF0sIHByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBJdCBzdWJ0cmFjdHMgdGhlIHByZWRpY3Rpb24gZnJvbSB0aGUgaW5wdXQgcGl4ZWwgYW5kIHN0b3JlcyB0aGUgcmVzaWR1YWwKKy8vIGluIHRoZSBvdXRwdXQgcGl4ZWwuCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUFJFRElDVE9SLCBQUkVESUNUT1JfU1VCKSAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQUkVESUNUT1JfU1VCKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeCA9IDA7IHggPCBudW1fcGl4ZWxzOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgcHJlZCA9IChQUkVESUNUT1IpKGluW3ggLSAxXSwgdXBwZXIgKyB4KTsgICAgICAgICBcCisgICAgb3V0W3hdID0gVlA4TFN1YlBpeGVscyhpblt4XSwgcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0RTUF9MT1NTTEVTU19DT01NT05fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MDgzMjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuYy5jCkBAIC0wLDAgKzEsMTAxMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgInNyYy9kZWMvdnA4bGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisvLyBsb29rdXAgdGFibGUgZm9yIHNtYWxsIHZhbHVlcyBvZiBsb2cyKGludCkKK2NvbnN0IGZsb2F0IGtMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXSA9IHsKKyAgMC4wMDAwMDAwMDAwMDAwMDAwZiwgMC4wMDAwMDAwMDAwMDAwMDAwZiwKKyAgMS4wMDAwMDAwMDAwMDAwMDAwZiwgMS41ODQ5NjI1MDA3MjExNTYwZiwKKyAgMi4wMDAwMDAwMDAwMDAwMDAwZiwgMi4zMjE5MjgwOTQ4ODczNjIxZiwKKyAgMi41ODQ5NjI1MDA3MjExNTYwZiwgMi44MDczNTQ5MjIwNTc2MDQxZiwKKyAgMy4wMDAwMDAwMDAwMDAwMDAwZiwgMy4xNjk5MjUwMDE0NDIzMTIxZiwKKyAgMy4zMjE5MjgwOTQ4ODczNjIxZiwgMy40NTk0MzE2MTg2MzcyOTczZiwKKyAgMy41ODQ5NjI1MDA3MjExNTYwZiwgMy43MDA0Mzk3MTgxNDEwOTIxZiwKKyAgMy44MDczNTQ5MjIwNTc2MDQxZiwgMy45MDY4OTA1OTU2MDg1MTg3ZiwKKyAgNC4wMDAwMDAwMDAwMDAwMDAwZiwgNC4wODc0NjI4NDEyNTAzMzkwZiwKKyAgNC4xNjk5MjUwMDE0NDIzMTIxZiwgNC4yNDc5Mjc1MTM0NDM1ODUyZiwKKyAgNC4zMjE5MjgwOTQ4ODczNjI2ZiwgNC4zOTIzMTc0MjI3Nzg3NjA2ZiwKKyAgNC40NTk0MzE2MTg2MzcyOTczZiwgNC41MjM1NjE5NTYwNTcwMTMwZiwKKyAgNC41ODQ5NjI1MDA3MjExNTYwZiwgNC42NDM4NTYxODk3NzQ3MjQzZiwKKyAgNC43MDA0Mzk3MTgxNDEwOTE3ZiwgNC43NTQ4ODc1MDIxNjM0NjgyZiwKKyAgNC44MDczNTQ5MjIwNTc2MDM3ZiwgNC44NTc5ODA5OTUxMjc1NzE4ZiwKKyAgNC45MDY4OTA1OTU2MDg1MTg3ZiwgNC45NTQxOTYzMTAzODY4NzQ5ZiwKKyAgNS4wMDAwMDAwMDAwMDAwMDAwZiwgNS4wNDQzOTQxMTkzNTg0NTMzZiwKKyAgNS4wODc0NjI4NDEyNTAzMzkwZiwgNS4xMjkyODMwMTY5NDQ5NjYzZiwKKyAgNS4xNjk5MjUwMDE0NDIzMTIxZiwgNS4yMDk0NTMzNjU2Mjg5NTAxZiwKKyAgNS4yNDc5Mjc1MTM0NDM1ODUyZiwgNS4yODU0MDIyMTg4NjIyNDg3ZiwKKyAgNS4zMjE5MjgwOTQ4ODczNjI2ZiwgNS4zNTc1NTIwMDQ2MTgwODM3ZiwKKyAgNS4zOTIzMTc0MjI3Nzg3NjA2ZiwgNS40MjYyNjQ3NTQ3MDIwOTc5ZiwKKyAgNS40NTk0MzE2MTg2MzcyOTczZiwgNS40OTE4NTMwOTYzMjk2NzQ3ZiwKKyAgNS41MjM1NjE5NTYwNTcwMTMwZiwgNS41NTQ1ODg4NTE2Nzc2Mzc2ZiwKKyAgNS41ODQ5NjI1MDA3MjExNTYwZiwgNS42MTQ3MDk4NDQxMTUyMDgzZiwKKyAgNS42NDM4NTYxODk3NzQ3MjQzZiwgNS42NzI0MjUzNDE5NzE0OTUxZiwKKyAgNS43MDA0Mzk3MTgxNDEwOTE3ZiwgNS43Mjc5MjA0NTQ1NjMxOTg3ZiwKKyAgNS43NTQ4ODc1MDIxNjM0NjgyZiwgNS43ODEzNTk3MTM1MjQ2NTk5ZiwKKyAgNS44MDczNTQ5MjIwNTc2MDM3ZiwgNS44MzI4OTAwMTQxNjQ3NDEyZiwKKyAgNS44NTc5ODA5OTUxMjc1NzE4ZiwgNS44ODI2NDMwNDkzNjE4NDE1ZiwKKyAgNS45MDY4OTA1OTU2MDg1MTg3ZiwgNS45MzA3MzczMzc1NjI4ODY2ZiwKKyAgNS45NTQxOTYzMTAzODY4NzQ5ZiwgNS45NzcyNzk5MjM0OTk5MTY3ZiwKKyAgNi4wMDAwMDAwMDAwMDAwMDAwZiwgNi4wMjIzNjc4MTMwMjg0NTQzZiwKKyAgNi4wNDQzOTQxMTkzNTg0NTMzZiwgNi4wNjYwODkxOTA0NTc3NzIwZiwKKyAgNi4wODc0NjI4NDEyNTAzMzkwZiwgNi4xMDg1MjQ0NTY3NzgxNjkxZiwKKyAgNi4xMjkyODMwMTY5NDQ5NjYzZiwgNi4xNDk3NDcxMTk1MDQ2ODIyZiwKKyAgNi4xNjk5MjUwMDE0NDIzMTIxZiwgNi4xODk4MjQ1NTg4ODAwMTc1ZiwKKyAgNi4yMDk0NTMzNjU2Mjg5NTAxZiwgNi4yMjg4MTg2OTA0OTU4ODA0ZiwKKyAgNi4yNDc5Mjc1MTM0NDM1ODUyZiwgNi4yNjY3ODY1NDA2OTQ5MDEwZiwKKyAgNi4yODU0MDIyMTg4NjIyNDg3ZiwgNi4zMDM3ODA3NDgxNzcxMDMwZiwKKyAgNi4zMjE5MjgwOTQ4ODczNjI2ZiwgNi4zMzk4NTAwMDI4ODQ2MjQzZiwKKyAgNi4zNTc1NTIwMDQ2MTgwODM3ZiwgNi4zNzUwMzk0MzEzNDY5MjQ1ZiwKKyAgNi4zOTIzMTc0MjI3Nzg3NjA2ZiwgNi40MDkzOTA5MzYxMzc3MDE3ZiwKKyAgNi40MjYyNjQ3NTQ3MDIwOTc5ZiwgNi40NDI5NDM0OTU4NDg3Mjc5ZiwKKyAgNi40NTk0MzE2MTg2MzcyOTczZiwgNi40NzU3MzM0MzA5NjYzOTc2ZiwKKyAgNi40OTE4NTMwOTYzMjk2NzQ3ZiwgNi41MDc3OTQ2NDAxOTg2OTYzZiwKKyAgNi41MjM1NjE5NTYwNTcwMTMwZiwgNi41MzkxNTg4MTExMDgwMzA5ZiwKKyAgNi41NTQ1ODg4NTE2Nzc2Mzc2ZiwgNi41Njk4NTU2MDgzMzA5NDc4ZiwKKyAgNi41ODQ5NjI1MDA3MjExNTYwZiwgNi41OTk5MTI4NDIxODcxMjc4ZiwKKyAgNi42MTQ3MDk4NDQxMTUyMDgzZiwgNi42MjkzNTY2MjAwNzk2MDk0ZiwKKyAgNi42NDM4NTYxODk3NzQ3MjQzZiwgNi42NTgyMTE0ODI3NTE3OTQ2ZiwKKyAgNi42NzI0MjUzNDE5NzE0OTUxZiwgNi42ODY1MDA1MjcxODMyMTg1ZiwKKyAgNi43MDA0Mzk3MTgxNDEwOTE3ZiwgNi43MTQyNDU1MTc2NjYxMjI0ZiwKKyAgNi43Mjc5MjA0NTQ1NjMxOTg3ZiwgNi43NDE0NjY5ODY0MDExNDY0ZiwKKyAgNi43NTQ4ODc1MDIxNjM0NjgyZiwgNi43NjgxODQzMjQ3NzY5MjU5ZiwKKyAgNi43ODEzNTk3MTM1MjQ2NTk5ZiwgNi43OTQ0MTU4NjYzNTAxMDYxZiwKKyAgNi44MDczNTQ5MjIwNTc2MDM3ZiwgNi44MjAxNzg5NjI0MTUxODc4ZiwKKyAgNi44MzI4OTAwMTQxNjQ3NDEyZiwgNi44NDU0OTAwNTA5NDQzNzQ3ZiwKKyAgNi44NTc5ODA5OTUxMjc1NzE4ZiwgNi44NzAzNjQ3MTk1ODM0MDQ3ZiwKKyAgNi44ODI2NDMwNDkzNjE4NDE1ZiwgNi44OTQ4MTc3NjMzMDc5NDM3ZiwKKyAgNi45MDY4OTA1OTU2MDg1MTg3ZiwgNi45MTg4NjMyMzcyNzQ1OTQ2ZiwKKyAgNi45MzA3MzczMzc1NjI4ODY2ZiwgNi45NDI1MTQ1MDUzMzkyMzk4ZiwKKyAgNi45NTQxOTYzMTAzODY4NzQ5ZiwgNi45NjU3ODQyODQ2NjIwODY5ZiwKKyAgNi45NzcyNzk5MjM0OTk5MTY3ZiwgNi45ODg2ODQ2ODY3NzIxNjU0ZiwKKyAgNy4wMDAwMDAwMDAwMDAwMDAwZiwgNy4wMTEyMjcyNTU0MjMyNTM5ZiwKKyAgNy4wMjIzNjc4MTMwMjg0NTQzZiwgNy4wMzM0MjMwMDE1Mzc0NTAxZiwKKyAgNy4wNDQzOTQxMTkzNTg0NTMzZiwgNy4wNTUyODI0MzU1MDExODk4ZiwKKyAgNy4wNjYwODkxOTA0NTc3NzIwZiwgNy4wNzY4MTU1OTcwNTA4MzA4ZiwKKyAgNy4wODc0NjI4NDEyNTAzMzkwZiwgNy4wOTgwMzIwODI5NjA1MjYzZiwKKyAgNy4xMDg1MjQ0NTY3NzgxNjkxZiwgNy4xMTg5NDEwNzI3MjM1MDc2ZiwKKyAgNy4xMjkyODMwMTY5NDQ5NjYzZiwgNy4xMzk1NTEzNTIzOTg3OTM2ZiwKKyAgNy4xNDk3NDcxMTk1MDQ2ODIyZiwgNy4xNTk4NzEzMzY3NzgzODkwZiwKKyAgNy4xNjk5MjUwMDE0NDIzMTIxZiwgNy4xNzk5MDkwOTAwMTQ5MzQ0ZiwKKyAgNy4xODk4MjQ1NTg4ODAwMTc1ZiwgNy4xOTk2NzIzNDQ4MzYzNjQ0ZiwKKyAgNy4yMDk0NTMzNjU2Mjg5NTAxZiwgNy4yMTkxNjg1MjA0NjIxNjExZiwKKyAgNy4yMjg4MTg2OTA0OTU4ODA0ZiwgNy4yMzg0MDQ3MzkzMjUwNzg1ZiwKKyAgNy4yNDc5Mjc1MTM0NDM1ODUyZiwgNy4yNTczODc4NDI2OTI2NTIxZiwKKyAgNy4yNjY3ODY1NDA2OTQ5MDEwZiwgNy4yNzYxMjQ0MDUyNzQyMzc1ZiwKKyAgNy4yODU0MDIyMTg4NjIyNDg3ZiwgNy4yOTQ2MjA3NDg4OTE2MjcwZiwKKyAgNy4zMDM3ODA3NDgxNzcxMDMwZiwgNy4zMTI4ODI5NTUyODQzNTU3ZiwKKyAgNy4zMjE5MjgwOTQ4ODczNjI2ZiwgNy4zMzA5MTY4NzgxMTQ2MTY3ZiwKKyAgNy4zMzk4NTAwMDI4ODQ2MjQzZiwgNy4zNDg3MjgxNTQyMzEwNzcxZiwKKyAgNy4zNTc1NTIwMDQ2MTgwODM3ZiwgNy4zNjYzMjIyMTQyNDU4MTYwZiwKKyAgNy4zNzUwMzk0MzEzNDY5MjQ1ZiwgNy4zODM3MDQyOTI0NzQwNTE5ZiwKKyAgNy4zOTIzMTc0MjI3Nzg3NjA2ZiwgNy40MDA4Nzk0MzYyODIxODQzZiwKKyAgNy40MDkzOTA5MzYxMzc3MDE3ZiwgNy40MTc4NTI1MTQ4ODU4OTgyZiwKKyAgNy40MjYyNjQ3NTQ3MDIwOTc5ZiwgNy40MzQ2MjgyMjc2MzY3MjQ1ZiwKKyAgNy40NDI5NDM0OTU4NDg3Mjc5ZiwgNy40NTEyMTExMTE4MzIzMjg5ZiwKKyAgNy40NTk0MzE2MTg2MzcyOTczZiwgNy40Njc2MDU1NTAwODI5OTc2ZiwKKyAgNy40NzU3MzM0MzA5NjYzOTc2ZiwgNy40ODM4MTU3NzcyNjQyNTYzZiwKKyAgNy40OTE4NTMwOTYzMjk2NzQ3ZiwgNy40OTk4NDU4ODcwODMyMDU2ZiwKKyAgNy41MDc3OTQ2NDAxOTg2OTYzZiwgNy41MTU2OTk4MzgyODQwNDI3ZiwKKyAgNy41MjM1NjE5NTYwNTcwMTMwZiwgNy41MzEzODE0NjA1MTYzMTE4ZiwKKyAgNy41MzkxNTg4MTExMDgwMzA5ZiwgNy41NDY4OTQ0NTk4ODc2MzY0ZiwKKyAgNy41NTQ1ODg4NTE2Nzc2Mzc2ZiwgNy41NjIyNDI0MjQyMjEwNzI4ZiwKKyAgNy41Njk4NTU2MDgzMzA5NDc4ZiwgNy41Nzc0Mjg4MjgwMzU3NDg2ZiwKKyAgNy41ODQ5NjI1MDA3MjExNTYwZiwgNy41OTI0NTcwMzcyNjgwODA2ZiwKKyAgNy41OTk5MTI4NDIxODcxMjc4ZiwgNy42MDczMzAzMTM3NDk2MTA0ZiwKKyAgNy42MTQ3MDk4NDQxMTUyMDgzZiwgNy42MjIwNTE4MTk0NTYzNzY0ZiwKKyAgNy42MjkzNTY2MjAwNzk2MDk0ZiwgNy42MzY2MjQ2MjA1NDM2NDg3ZiwKKyAgNy42NDM4NTYxODk3NzQ3MjQzZiwgNy42NTEwNTE2OTExNzg5MjgxZiwKKyAgNy42NTgyMTE0ODI3NTE3OTQ2ZiwgNy42NjUzMzU5MTcxODUxNzY0ZiwKKyAgNy42NzI0MjUzNDE5NzE0OTUxZiwgNy42Nzk0ODAwOTk1MDU0NDY0ZiwKKyAgNy42ODY1MDA1MjcxODMyMTg1ZiwgNy42OTM0ODY5NTc0OTkzMjUyZiwKKyAgNy43MDA0Mzk3MTgxNDEwOTE3ZiwgNy43MDczNTkxMzIwODA4ODI1ZiwKKyAgNy43MTQyNDU1MTc2NjYxMjI0ZiwgNy43MjEwOTkxODg3MDcxODU1ZiwKKyAgNy43Mjc5MjA0NTQ1NjMxOTg3ZiwgNy43MzQ3MDk2MjAyMjU4MzgzZiwKKyAgNy43NDE0NjY5ODY0MDExNDY0ZiwgNy43NDgxOTI4NDk1ODk0NjA1ZiwKKyAgNy43NTQ4ODc1MDIxNjM0NjgyZiwgNy43NjE1NTEyMzI0NDQ0Nzk1ZiwKKyAgNy43NjgxODQzMjQ3NzY5MjU5ZiwgNy43NzQ3ODcwNTk2MDExNzM2ZiwKKyAgNy43ODEzNTk3MTM1MjQ2NTk5ZiwgNy43ODc5MDI1NTkzOTE0MzE3ZiwKKyAgNy43OTQ0MTU4NjYzNTAxMDYxZiwgNy44MDA4OTk4OTk5MjAzMDQ3ZiwKKyAgNy44MDczNTQ5MjIwNTc2MDM3ZiwgNy44MTM3ODExOTEyMTcwMzc0ZiwKKyAgNy44MjAxNzg5NjI0MTUxODc4ZiwgNy44MjY1NDg0ODcyOTA5MTUwZiwKKyAgNy44MzI4OTAwMTQxNjQ3NDEyZiwgNy44MzkyMDM3ODgwOTY5NDM2ZiwKKyAgNy44NDU0OTAwNTA5NDQzNzQ3ZiwgNy44NTE3NDkwNDE0MTYwNTcxZiwKKyAgNy44NTc5ODA5OTUxMjc1NzE4ZiwgNy44NjQxODYxNDQ2NTQyNzk3ZiwKKyAgNy44NzAzNjQ3MTk1ODM0MDQ3ZiwgNy44NzY1MTY5NDY1NjQ5OTkzZiwKKyAgNy44ODI2NDMwNDkzNjE4NDE1ZiwgNy44ODg3NDMyNDg4OTgyNTkxZiwKKyAgNy44OTQ4MTc3NjMzMDc5NDM3ZiwgNy45MDA4NjY4MDc5ODA3NDg2ZiwKKyAgNy45MDY4OTA1OTU2MDg1MTg3ZiwgNy45MTI4ODkzMzYyMjk5NjE5ZiwKKyAgNy45MTg4NjMyMzcyNzQ1OTQ2ZiwgNy45MjQ4MTI1MDM2MDU3ODEyZiwKKyAgNy45MzA3MzczMzc1NjI4ODY2ZiwgNy45MzY2Mzc5MzkwMDI1NzA5ZiwKKyAgNy45NDI1MTQ1MDUzMzkyMzk4ZiwgNy45NDgzNjcyMzE1ODQ2Nzc4ZiwKKyAgNy45NTQxOTYzMTAzODY4NzQ5ZiwgNy45NjAwMDE5MzIwNjgwODA1ZiwKKyAgNy45NjU3ODQyODQ2NjIwODY5ZiwgNy45NzE1NDM1NTM5NTA3NzE5ZiwKKyAgNy45NzcyNzk5MjM0OTk5MTY3ZiwgNy45ODI5OTM1NzQ2OTQzMTAzZiwKKyAgNy45ODg2ODQ2ODY3NzIxNjU0ZiwgNy45OTQzNTM0MzY4NTg4NTc3ZgorfTsKKworY29uc3QgZmxvYXQga1NMb2cyVGFibGVbTE9HX0xPT0tVUF9JRFhfTUFYXSA9IHsKKyAgMC4wMDAwMDAwMGYsICAgIDAuMDAwMDAwMDBmLCAgMi4wMDAwMDAwMGYsICAgNC43NTQ4ODc1MGYsCisgIDguMDAwMDAwMDBmLCAgIDExLjYwOTY0MDQ3ZiwgIDE1LjUwOTc3NTAwZiwgIDE5LjY1MTQ4NDQ1ZiwKKyAgMjQuMDAwMDAwMDBmLCAgMjguNTI5MzI1MDFmLCAgMzMuMjE5MjgwOTVmLCAgMzguMDUzNzQ3ODFmLAorICA0My4wMTk1NTAwMWYsICA0OC4xMDU3MTYzNGYsICA1My4zMDI5Njg5MWYsICA1OC42MDMzNTg5M2YsCisgIDY0LjAwMDAwMDAwZiwgIDY5LjQ4Njg2ODMwZiwgIDc1LjA1ODY1MDAzZiwgIDgwLjcxMDYyMjc2ZiwKKyAgODYuNDM4NTYxOTBmLCAgOTIuMjM4NjY1ODhmLCAgOTguMTA3NDk1NjFmLCAgMTA0LjA0MTkyNDk5ZiwKKyAgMTEwLjAzOTEwMDAyZiwgMTE2LjA5NjQwNDc0ZiwgMTIyLjIxMTQzMjY3ZiwgMTI4LjM4MTk2MjU2ZiwKKyAgMTM0LjYwNTkzNzgyZiwgMTQwLjg4MTQ0ODg2ZiwgMTQ3LjIwNjcxNzg3ZiwgMTUzLjU4MDA4NTYyZiwKKyAgMTYwLjAwMDAwMDAwZiwgMTY2LjQ2NTAwNTk0ZiwgMTcyLjk3MzczNjYwZiwgMTc5LjUyNDkwNTU5ZiwKKyAgMTg2LjExNzMwMDA1ZiwgMTkyLjc0OTc3NDUzZiwgMTk5LjQyMTI0NTUxZiwgMjA2LjEzMDY4NjU0ZiwKKyAgMjEyLjg3NzEyMzgwZiwgMjE5LjY1OTYzMjE5ZiwgMjI2LjQ3NzMzMTc2ZiwgMjMzLjMyOTM4NDQ1ZiwKKyAgMjQwLjIxNDk5MTIyZiwgMjQ3LjEzMzM4OTMzZiwgMjU0LjA4Mzg0OTk4ZiwgMjYxLjA2NTY3NjAzZiwKKyAgMjY4LjA3ODIwMDAzZiwgMjc1LjEyMDc4MjM2ZiwgMjgyLjE5MjgwOTQ5ZiwgMjg5LjI5MzY5MjQ0ZiwKKyAgMjk2LjQyMjg2NTM0ZiwgMzAzLjU3OTc4NDA5ZiwgMzEwLjc2MzkyNTEyZiwgMzE3Ljk3NDc4NDI0ZiwKKyAgMzI1LjIxMTg3NTY0ZiwgMzMyLjQ3NDczMDgxZiwgMzM5Ljc2Mjg5NzcyZiwgMzQ3LjA3NTkzOTkxZiwKKyAgMzU0LjQxMzQzNTc0ZiwgMzYxLjc3NDk3NzU5ZiwgMzY5LjE2MDE3MTI0ZiwgMzc2LjU2ODYzNTE4ZiwKKyAgMzg0LjAwMDAwMDAwZiwgMzkxLjQ1MzkwNzg1ZiwgMzk4LjkzMDAxMTg4ZiwgNDA2LjQyNzk3NTc2ZiwKKyAgNDEzLjk0NzQ3MzIxZiwgNDIxLjQ4ODE4NzUyZiwgNDI5LjA0OTgxMTE5ZiwgNDM2LjYzMjA0NTQ4ZiwKKyAgNDQ0LjIzNDYwMDEwZiwgNDUxLjg1NzE5MjgwZiwgNDU5LjQ5OTU0OTA2ZiwgNDY3LjE2MTQwMTc5ZiwKKyAgNDc0Ljg0MjQ5MTAyZiwgNDgyLjU0MjU2MzYzZiwgNDkwLjI2MTM3MzA3ZiwgNDk3Ljk5ODY3OTExZiwKKyAgNTA1Ljc1NDI0NzU5ZiwgNTEzLjUyNzg1MDIzZiwgNTIxLjMxOTI2NDM4ZiwgNTI5LjEyODI3MjgwZiwKKyAgNTM2Ljk1NDY2MzUxZiwgNTQ0Ljc5ODIyOTU3ZiwgNTUyLjY1ODc2ODkwZiwgNTYwLjUzNjA4NDE0ZiwKKyAgNTY4LjQyOTk4MjQ0ZiwgNTc2LjM0MDI3NTM2ZiwgNTg0LjI2Njc3ODY3ZiwgNTkyLjIwOTMxMjI2ZiwKKyAgNjAwLjE2NzY5OTk2ZiwgNjA4LjE0MTc2OTQzZiwgNjE2LjEzMTM1MjA2ZiwgNjI0LjEzNjI4Mjc5ZiwKKyAgNjMyLjE1NjQwMDA3ZiwgNjQwLjE5MTU0NTY5ZiwgNjQ4LjI0MTU2NDcyZiwgNjU2LjMwNjMwNTM5ZiwKKyAgNjY0LjM4NTYxODk4ZiwgNjcyLjQ3OTM1OTc2ZiwgNjgwLjU4NzM4NDg4ZiwgNjg4LjcwOTU1NDMwZiwKKyAgNjk2Ljg0NTczMDY5ZiwgNzA0Ljk5NTc3OTM1ZiwgNzEzLjE1OTU2ODE4ZiwgNzIxLjMzNjk2NzU0ZiwKKyAgNzI5LjUyNzg1MDIzZiwgNzM3LjczMjA5MTQwZiwgNzQ1Ljk0OTU2ODQ5ZiwgNzU0LjE4MDE2MTE2ZiwKKyAgNzYyLjQyMzc1MTI3ZiwgNzcwLjY4MDIyMjc1ZiwgNzc4Ljk0OTQ2MTYxZiwgNzg3LjIzMTM1NTg2ZiwKKyAgNzk1LjUyNTc5NTQzZiwgODAzLjgzMjY3MjE5ZiwgODEyLjE1MTg3OTgyZiwgODIwLjQ4MzMxMzgzZiwKKyAgODI4LjgyNjg3MTQ3ZiwgODM3LjE4MjQ1MTcxZiwgODQ1LjU0OTk1NTE4ZiwgODUzLjkyOTI4NDE2ZiwKKyAgODYyLjMyMDM0MjQ5ZiwgODcwLjcyMzAzNTU4ZiwgODc5LjEzNzI3MDM2ZiwgODg3LjU2Mjk1NTIyZiwKKyAgODk2LjAwMDAwMDAwZiwgOTA0LjQ0ODMxNTk1ZiwgOTEyLjkwNzgxNTY5ZiwgOTIxLjM3ODQxMzIwZiwKKyAgOTI5Ljg2MDAyMzc2ZiwgOTM4LjM1MjU2MzkyZiwgOTQ2Ljg1NTk1MTUyZiwgOTU1LjM3MDEwNTYwZiwKKyAgOTYzLjg5NDk0NjQxZiwgOTcyLjQzMDM5NTM3ZiwgOTgwLjk3NjM3NTA0ZiwgOTg5LjUzMjgwOTExZiwKKyAgOTk4LjA5OTYyMjM3ZiwgMTAwNi42NzY3NDA2OWYsIDEwMTUuMjY0MDkwOTdmLCAxMDIzLjg2MTYwMTE2ZiwKKyAgMTAzMi40NjkyMDAyMWYsIDEwNDEuMDg2ODE4MDVmLCAxMDQ5LjcxNDM4NTYwZiwgMTA1OC4zNTE4MzQ2OWYsCisgIDEwNjYuOTk5MDk4MTFmLCAxMDc1LjY1NjEwOTU1ZiwgMTA4NC4zMjI4MDM1N2YsIDEwOTIuOTk5MTE1NjRmLAorICAxMTAxLjY4NDk4MjA0ZiwgMTExMC4zODAzMzk5M2YsIDExMTkuMDg1MTI3MjdmLCAxMTI3Ljc5OTI4MjgyZiwKKyAgMTEzNi41MjI3NDYxNGYsIDExNDUuMjU1NDU3NThmLCAxMTUzLjk5NzM1ODIxZiwgMTE2Mi43NDgzODk4OWYsCisgIDExNzEuNTA4NDk1MThmLCAxMTgwLjI3NzYxNzM4ZiwgMTE4OS4wNTU3MDA0N2YsIDExOTcuODQyNjg5MTRmLAorICAxMjA2LjYzODUyODc2ZiwgMTIxNS40NDMxNjUzNWYsIDEyMjQuMjU2NTQ1NjBmLCAxMjMzLjA3ODYxNjg0ZiwKKyAgMTI0MS45MDkzMjcwM2YsIDEyNTAuNzQ4NjI0NzNmLCAxMjU5LjU5NjQ1OTE0ZiwgMTI2OC40NTI3ODAwNWYsCisgIDEyNzcuMzE3NTM3ODFmLCAxMjg2LjE5MDY4MzM4ZiwgMTI5NS4wNzIxNjgyOGYsIDEzMDMuOTYxOTQ0NTdmLAorICAxMzEyLjg1OTk2NDg4ZiwgMTMyMS43NjYxODIzNmYsIDEzMzAuNjgwNTUwNzFmLCAxMzM5LjYwMzAyNDEzZiwKKyAgMTM0OC41MzM1NTczNGYsIDEzNTcuNDcyMTA1NTZmLCAxMzY2LjQxODYyNDUyZiwgMTM3NS4zNzMwNzA0MWYsCisgIDEzODQuMzM1Mzk5OTFmLCAxMzkzLjMwNTU3MDIwZiwgMTQwMi4yODM1Mzg4N2YsIDE0MTEuMjY5MjY0MDBmLAorICAxNDIwLjI2MjcwNDEyZiwgMTQyOS4yNjM4MTgxOGYsIDE0MzguMjcyNTY1NThmLCAxNDQ3LjI4ODkwNjE1ZiwKKyAgMTQ1Ni4zMTI4MDAxNGYsIDE0NjUuMzQ0MjA4MTlmLCAxNDc0LjM4MzA5MTM4ZiwgMTQ4My40Mjk0MTExOGYsCisgIDE0OTIuNDgzMTI5NDVmLCAxNTAxLjU0NDIwODQzZiwgMTUxMC42MTI2MTA3OGYsIDE1MTkuNjg4Mjk5NDlmLAorICAxNTI4Ljc3MTIzNzk1ZiwgMTUzNy44NjEzODk5M2YsIDE1NDYuOTU4NzE5NTJmLCAxNTU2LjA2MzE5MTE5ZiwKKyAgMTU2NS4xNzQ3Njk3NmYsIDE1NzQuMjkzNDIwNDBmLCAxNTgzLjQxOTEwODYwZiwgMTU5Mi41NTE4MDAyMGYsCisgIDE2MDEuNjkxNDYxMzdmLCAxNjEwLjgzODA1ODYwZiwgMTYxOS45OTE1NTg3MWYsIDE2MjkuMTUxOTI4ODJmLAorICAxNjM4LjMxOTEzNjM3ZiwgMTY0Ny40OTMxNDkxMWYsIDE2NTYuNjczOTM1MDlmLCAxNjY1Ljg2MTQ2MjY2ZiwKKyAgMTY3NS4wNTU3MDA0N2YsIDE2ODQuMjU2NjE3NDRmLCAxNjkzLjQ2NDE4MjgwZiwgMTcwMi42NzgzNjYwNWYsCisgIDE3MTEuODk5MTM2OThmLCAxNzIxLjEyNjQ2NTYzZiwgMTczMC4zNjAzMjIzM2YsIDE3MzkuNjAwNjc3NjhmLAorICAxNzQ4Ljg0NzUwMjU0ZiwgMTc1OC4xMDA3NjgwMmYsIDE3NjcuMzYwNDQ1NTFmLCAxNzc2LjYyNjUwNjYyZiwKKyAgMTc4NS44OTg5MjMyM2YsIDE3OTUuMTc3NjY3NDdmLCAxODA0LjQ2MjcxMTcyZiwgMTgxMy43NTQwMjg1N2YsCisgIDE4MjMuMDUxNTkwODdmLCAxODMyLjM1NTM3MTcwZiwgMTg0MS42NjUzNDQzOGYsIDE4NTAuOTgxNDgyNDRmLAorICAxODYwLjMwMzc1OTY1ZiwgMTg2OS42MzIxNDk5OWYsIDE4NzguOTY2NjI3NjdmLCAxODg4LjMwNzE2NzExZiwKKyAgMTg5Ny42NTM3NDI5NWYsIDE5MDcuMDA2MzMwMDNmLCAxOTE2LjM2NDkwMzQyZiwgMTkyNS43Mjk0MzgzOGYsCisgIDE5MzUuMDk5OTEwMzdmLCAxOTQ0LjQ3NjI5NTA2ZiwgMTk1My44NTg1NjgzMWYsIDE5NjMuMjQ2NzA2MjBmLAorICAxOTcyLjY0MDY4NDk4ZiwgMTk4Mi4wNDA0ODEwOGYsIDE5OTEuNDQ2MDcxMTdmLCAyMDAwLjg1NzQzMjA0ZiwKKyAgMjAxMC4yNzQ1NDA3MmYsIDIwMTkuNjk3Mzc0NDBmLCAyMDI5LjEyNTkxMDQ0ZiwgMjAzOC41NjAxMjY0MGYKK307CisKK2NvbnN0IFZQOExQcmVmaXhDb2RlIGtQcmVmaXhFbmNvZGVDb2RlW1BSRUZJWF9MT09LVVBfSURYX01BWF0gPSB7CisgIHsgMCwgMH0sIHsgMCwgMH0sIHsgMSwgMH0sIHsgMiwgMH0sIHsgMywgMH0sIHsgNCwgMX0sIHsgNCwgMX0sIHsgNSwgMX0sCisgIHsgNSwgMX0sIHsgNiwgMn0sIHsgNiwgMn0sIHsgNiwgMn0sIHsgNiwgMn0sIHsgNywgMn0sIHsgNywgMn0sIHsgNywgMn0sCisgIHsgNywgMn0sIHsgOCwgM30sIHsgOCwgM30sIHsgOCwgM30sIHsgOCwgM30sIHsgOCwgM30sIHsgOCwgM30sIHsgOCwgM30sCisgIHsgOCwgM30sIHsgOSwgM30sIHsgOSwgM30sIHsgOSwgM30sIHsgOSwgM30sIHsgOSwgM30sIHsgOSwgM30sIHsgOSwgM30sCisgIHsgOSwgM30sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sCisgIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sIHsxMCwgNH0sCisgIHsxMCwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sCisgIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sIHsxMSwgNH0sCisgIHsxMSwgNH0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sCisgIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sCisgIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sCisgIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sIHsxMiwgNX0sCisgIHsxMiwgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sCisgIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sCisgIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sCisgIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sIHsxMywgNX0sCisgIHsxMywgNX0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sIHsxNCwgNn0sCisgIHsxNCwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sIHsxNSwgNn0sCisgIHsxNSwgNn0sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sIHsxNiwgN30sCisgIHsxNiwgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCisgIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sIHsxNywgN30sCit9OworCitjb25zdCB1aW50OF90IGtQcmVmaXhFbmNvZGVFeHRyYUJpdHNWYWx1ZVtQUkVGSVhfTE9PS1VQX0lEWF9NQVhdID0geworICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMCwgIDEsICAyLCAgMywgIDAsICAxLCAgMiwgIDMsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAgMCwgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDI2LCAyNywgMjgsIDI5LCAzMCwgMzEsCisgIDMyLCAzMywgMzQsIDM1LCAzNiwgMzcsIDM4LCAzOSwgNDAsIDQxLCA0MiwgNDMsIDQ0LCA0NSwgNDYsIDQ3LAorICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MywKKyAgIDAsICAxLCAgMiwgIDMsICA0LCAgNSwgIDYsICA3LCAgOCwgIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsCisgIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLAorICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgNDgsIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorICA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwKKyAgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsCisgIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorICAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LAorICAxMjcsCisgICAwLCAgMSwgIDIsICAzLCAgNCwgIDUsICA2LCAgNywgIDgsICA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LAorICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgMzIsIDMzLCAzNCwgMzUsIDM2LCAzNywgMzgsIDM5LCA0MCwgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsCisgIDQ4LCA0OSwgNTAsIDUxLCA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjIsIDYzLAorICA2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgNzcsIDc4LCA3OSwKKyAgODAsIDgxLCA4MiwgODMsIDg0LCA4NSwgODYsIDg3LCA4OCwgODksIDkwLCA5MSwgOTIsIDkzLCA5NCwgOTUsCisgIDk2LCA5NywgOTgsIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorICAxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2Cit9OworCitzdGF0aWMgZmxvYXQgRmFzdFNMb2cyU2xvd19DKHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICBpbnQgbG9nX2NudCA9IDA7CisgICAgdWludDMyX3QgeSA9IDE7CisgICAgaW50IGNvcnJlY3Rpb24gPSAwOworICAgIGNvbnN0IGZsb2F0IHZfZiA9IChmbG9hdCl2OworICAgIGNvbnN0IHVpbnQzMl90IG9yaWdfdiA9IHY7CisgICAgZG8geworICAgICAgKytsb2dfY250OworICAgICAgdiA9IHYgPj4gMTsKKyAgICAgIHkgPSB5IDw8IDE7CisgICAgfSB3aGlsZSAodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICAgIC8vIHZmID0gKDJebG9nX2NudCkgKiBYZjsgd2hlcmUgeSA9IDJebG9nX2NudCBhbmQgWGYgPCAyNTYKKyAgICAvLyBYZiA9IGZsb29yKFhmKSAqICgxICsgKHYgJSB5KSAvIHYpCisgICAgLy8gbG9nMihYZikgPSBsb2cyKGZsb29yKFhmKSkgKyBsb2cyKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBUaGUgY29ycmVjdGlvbiBmYWN0b3I6IGxvZygxICsgZCkgfiBkOyBmb3IgdmVyeSBzbWFsbCBkIHZhbHVlcywgc28KKyAgICAvLyBsb2cyKDEgKyAodiAlIHkpIC8gdikgfiBMT0dfMl9SRUNJUFJPQ0FMICogKHYgJSB5KS92CisgICAgLy8gTE9HXzJfUkVDSVBST0NBTCB+IDIzLzE2CisgICAgY29ycmVjdGlvbiA9ICgyMyAqIChvcmlnX3YgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICByZXR1cm4gdl9mICogKGtMb2cyVGFibGVbdl0gKyBsb2dfY250KSArIGNvcnJlY3Rpb247CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIChmbG9hdCkoTE9HXzJfUkVDSVBST0NBTCAqIHYgKiBsb2coKGRvdWJsZSl2KSk7CisgIH0KK30KKworc3RhdGljIGZsb2F0IEZhc3RMb2cyU2xvd19DKHVpbnQzMl90IHYpIHsKKyAgYXNzZXJ0KHYgPj0gTE9HX0xPT0tVUF9JRFhfTUFYKTsKKyAgaWYgKHYgPCBBUFBST1hfTE9HX1dJVEhfQ09SUkVDVElPTl9NQVgpIHsKKyAgICBpbnQgbG9nX2NudCA9IDA7CisgICAgdWludDMyX3QgeSA9IDE7CisgICAgY29uc3QgdWludDMyX3Qgb3JpZ192ID0gdjsKKyAgICBkb3VibGUgbG9nXzI7CisgICAgZG8geworICAgICAgKytsb2dfY250OworICAgICAgdiA9IHYgPj4gMTsKKyAgICAgIHkgPSB5IDw8IDE7CisgICAgfSB3aGlsZSAodiA+PSBMT0dfTE9PS1VQX0lEWF9NQVgpOworICAgIGxvZ18yID0ga0xvZzJUYWJsZVt2XSArIGxvZ19jbnQ7CisgICAgaWYgKG9yaWdfdiA+PSBBUFBST1hfTE9HX01BWCkgeworICAgICAgLy8gU2luY2UgdGhlIGRpdmlzaW9uIGlzIHN0aWxsIGV4cGVuc2l2ZSwgYWRkIHRoaXMgY29ycmVjdGlvbiBmYWN0b3Igb25seQorICAgICAgLy8gZm9yIGxhcmdlIHZhbHVlcyBvZiAndicuCisgICAgICBjb25zdCBpbnQgY29ycmVjdGlvbiA9ICgyMyAqIChvcmlnX3YgJiAoeSAtIDEpKSkgPj4gNDsKKyAgICAgIGxvZ18yICs9IChkb3VibGUpY29ycmVjdGlvbiAvIG9yaWdfdjsKKyAgICB9CisgICAgcmV0dXJuIChmbG9hdClsb2dfMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRob2RzIHRvIGNhbGN1bGF0ZSBFbnRyb3B5IChTaGFubm9uKS4KKworLy8gQ29tcHV0ZSB0aGUgY29tYmluZWQgU2hhbm9uJ3MgZW50cm9weSBmb3IgZGlzdHJpYnV0aW9uIHtYfSBhbmQge1grWX0KK3N0YXRpYyBmbG9hdCBDb21iaW5lZFNoYW5ub25FbnRyb3B5X0MoY29uc3QgaW50IFhbMjU2XSwgY29uc3QgaW50IFlbMjU2XSkgeworICBpbnQgaTsKKyAgZG91YmxlIHJldHZhbCA9IDAuOworICBpbnQgc3VtWCA9IDAsIHN1bVhZID0gMDsKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgY29uc3QgaW50IHggPSBYW2ldOworICAgIGlmICh4ICE9IDApIHsKKyAgICAgIGNvbnN0IGludCB4eSA9IHggKyBZW2ldOworICAgICAgc3VtWCArPSB4OworICAgICAgcmV0dmFsIC09IFZQOExGYXN0U0xvZzIoeCk7CisgICAgICBzdW1YWSArPSB4eTsKKyAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKHh5KTsKKyAgICB9IGVsc2UgaWYgKFlbaV0gIT0gMCkgeworICAgICAgc3VtWFkgKz0gWVtpXTsKKyAgICAgIHJldHZhbCAtPSBWUDhMRmFzdFNMb2cyKFlbaV0pOworICAgIH0KKyAgfQorICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW1YKSArIFZQOExGYXN0U0xvZzIoc3VtWFkpOworICByZXR1cm4gKGZsb2F0KXJldHZhbDsKK30KKwordm9pZCBWUDhMQml0RW50cm9weUluaXQoVlA4TEJpdEVudHJvcHkqIGNvbnN0IGVudHJvcHkpIHsKKyAgZW50cm9weS0+ZW50cm9weSA9IDAuOworICBlbnRyb3B5LT5zdW0gPSAwOworICBlbnRyb3B5LT5ub256ZXJvcyA9IDA7CisgIGVudHJvcHktPm1heF92YWwgPSAwOworICBlbnRyb3B5LT5ub256ZXJvX2NvZGUgPSBWUDhMX05PTl9UUklWSUFMX1NZTTsKK30KKwordm9pZCBWUDhMQml0c0VudHJvcHlVbnJlZmluZWQoY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5LCBpbnQgbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBlbnRyb3B5KSB7CisgIGludCBpOworCisgIFZQOExCaXRFbnRyb3B5SW5pdChlbnRyb3B5KTsKKworICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgaWYgKGFycmF5W2ldICE9IDApIHsKKyAgICAgIGVudHJvcHktPnN1bSArPSBhcnJheVtpXTsKKyAgICAgIGVudHJvcHktPm5vbnplcm9fY29kZSA9IGk7CisgICAgICArK2VudHJvcHktPm5vbnplcm9zOworICAgICAgZW50cm9weS0+ZW50cm9weSAtPSBWUDhMRmFzdFNMb2cyKGFycmF5W2ldKTsKKyAgICAgIGlmIChlbnRyb3B5LT5tYXhfdmFsIDwgYXJyYXlbaV0pIHsKKyAgICAgICAgZW50cm9weS0+bWF4X3ZhbCA9IGFycmF5W2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBlbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoZW50cm9weS0+c3VtKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigKKyAgICB1aW50MzJfdCB2YWwsIGludCBpLCB1aW50MzJfdCogY29uc3QgdmFsX3ByZXYsIGludCogY29uc3QgaV9wcmV2LAorICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGNvbnN0IGludCBzdHJlYWsgPSBpIC0gKmlfcHJldjsKKworICAvLyBHYXRoZXIgaW5mbyBmb3IgdGhlIGJpdCBlbnRyb3B5LgorICBpZiAoKnZhbF9wcmV2ICE9IDApIHsKKyAgICBiaXRfZW50cm9weS0+c3VtICs9ICgqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGJpdF9lbnRyb3B5LT5ub256ZXJvcyArPSBzdHJlYWs7CisgICAgYml0X2VudHJvcHktPm5vbnplcm9fY29kZSA9ICppX3ByZXY7CisgICAgYml0X2VudHJvcHktPmVudHJvcHkgLT0gVlA4TEZhc3RTTG9nMigqdmFsX3ByZXYpICogc3RyZWFrOworICAgIGlmIChiaXRfZW50cm9weS0+bWF4X3ZhbCA8ICp2YWxfcHJldikgeworICAgICAgYml0X2VudHJvcHktPm1heF92YWwgPSAqdmFsX3ByZXY7CisgICAgfQorICB9CisKKyAgLy8gR2F0aGVyIGluZm8gZm9yIHRoZSBIdWZmbWFuIGNvc3QuCisgIHN0YXRzLT5jb3VudHNbKnZhbF9wcmV2ICE9IDBdICs9IChzdHJlYWsgPiAzKTsKKyAgc3RhdHMtPnN0cmVha3NbKnZhbF9wcmV2ICE9IDBdWyhzdHJlYWsgPiAzKV0gKz0gc3RyZWFrOworCisgICp2YWxfcHJldiA9IHZhbDsKKyAgKmlfcHJldiA9IGk7Cit9CisKK3N0YXRpYyB2b2lkIEdldEVudHJvcHlVbnJlZmluZWRfQyhjb25zdCB1aW50MzJfdCBYW10sIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQgaTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHhfcHJldiA9IFhbMF07CisKKyAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgIFZQOExCaXRFbnRyb3B5SW5pdChiaXRfZW50cm9weSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgeCA9IFhbaV07CisgICAgaWYgKHggIT0geF9wcmV2KSB7CisgICAgICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKHgsIGksICZ4X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisgICAgfQorICB9CisgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoMCwgaSwgJnhfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKworICBiaXRfZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGJpdF9lbnRyb3B5LT5zdW0pOworfQorCitzdGF0aWMgdm9pZCBHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRfQyhjb25zdCB1aW50MzJfdCBYW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBZW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdEVudHJvcHkqIGNvbnN0IGJpdF9lbnRyb3B5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCBpID0gMTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHh5X3ByZXYgPSBYWzBdICsgWVswXTsKKworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgVlA4TEJpdEVudHJvcHlJbml0KGJpdF9lbnRyb3B5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCB4eSA9IFhbaV0gKyBZW2ldOworICAgIGlmICh4eSAhPSB4eV9wcmV2KSB7CisgICAgICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKHh5LCBpLCAmeHlfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKyAgICB9CisgIH0KKyAgR2V0RW50cm9weVVucmVmaW5lZEhlbHBlcigwLCBpLCAmeHlfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKworICBiaXRfZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGJpdF9lbnRyb3B5LT5zdW0pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfQyh1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IGludCBhcmdiID0gYXJnYl9kYXRhW2ldOworICAgIGNvbnN0IGludCBncmVlbiA9IChhcmdiID4+IDgpICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBuZXdfciA9ICgoKGFyZ2IgPj4gMTYpICYgMHhmZikgLSBncmVlbikgJiAweGZmOworICAgIGNvbnN0IHVpbnQzMl90IG5ld19iID0gKCgoYXJnYiA+PiAgMCkgJiAweGZmKSAtIGdyZWVuKSAmIDB4ZmY7CisgICAgYXJnYl9kYXRhW2ldID0gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCAobmV3X3IgPDwgMTYpIHwgbmV3X2I7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBDb2xvclRyYW5zZm9ybURlbHRhKGludDhfdCBjb2xvcl9wcmVkLCBpbnQ4X3QgY29sb3IpIHsKKyAgcmV0dXJuICgoaW50KWNvbG9yX3ByZWQgKiBjb2xvcikgPj4gNTsKK30KKwordm9pZCBWUDhMVHJhbnNmb3JtQ29sb3JfQyhjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sIHVpbnQzMl90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IGFyZ2IgPSBkYXRhW2ldOworICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICAgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7CisgICAgaW50IG5ld19yZWQgPSByZWQgJiAweGZmOworICAgIGludCBuZXdfYmx1ZSA9IGFyZ2IgJiAweGZmOworICAgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19yZWRfLCBncmVlbik7CisgICAgbmV3X3JlZCAmPSAweGZmOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+Z3JlZW5fdG9fYmx1ZV8sIGdyZWVuKTsKKyAgICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPnJlZF90b19ibHVlXywgcmVkKTsKKyAgICBuZXdfYmx1ZSAmPSAweGZmOworICAgIGRhdGFbaV0gPSAoYXJnYiAmIDB4ZmYwMGZmMDB1KSB8IChuZXdfcmVkIDw8IDE2KSB8IChuZXdfYmx1ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JSZWQodWludDhfdCBncmVlbl90b19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICBpbnQgbmV3X3JlZCA9IGFyZ2IgPj4gMTY7CisgIG5ld19yZWQgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19yZWQsIGdyZWVuKTsKKyAgcmV0dXJuIChuZXdfcmVkICYgMHhmZik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IFRyYW5zZm9ybUNvbG9yQmx1ZSh1aW50OF90IGdyZWVuX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiID4+IDE2OworICB1aW50OF90IG5ld19ibHVlID0gYXJnYjsKKyAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShncmVlbl90b19ibHVlLCBncmVlbik7CisgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEocmVkX3RvX2JsdWUsIHJlZCk7CisgIHJldHVybiAobmV3X2JsdWUgJiAweGZmKTsKK30KKwordm9pZCBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX3JlZCwgaW50IGhpc3RvW10pIHsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHRpbGVfd2lkdGg7ICsreCkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvclJlZChncmVlbl90b19yZWQsIGFyZ2JbeF0pXTsKKyAgICB9CisgICAgYXJnYiArPSBzdHJpZGU7CisgIH0KK30KKwordm9pZCBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfQyhjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pIHsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgZm9yICh4ID0gMDsgeCA8IHRpbGVfd2lkdGg7ICsreCkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvckJsdWUoZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGFyZ2JbeF0pXTsKKyAgICB9CisgICAgYXJnYiArPSBzdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWZWN0b3JNaXNtYXRjaF9DKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwgaW50IGxlbmd0aCkgeworICBpbnQgbWF0Y2hfbGVuID0gMDsKKworICB3aGlsZSAobWF0Y2hfbGVuIDwgbGVuZ3RoICYmIGFycmF5MVttYXRjaF9sZW5dID09IGFycmF5MlttYXRjaF9sZW5dKSB7CisgICAgKyttYXRjaF9sZW47CisgIH0KKyAgcmV0dXJuIG1hdGNoX2xlbjsKK30KKworLy8gQnVuZGxlcyBtdWx0aXBsZSAoMSwgMiwgNCBvciA4KSBwaXhlbHMgaW50byBhIHNpbmdsZSBwaXhlbC4KK3ZvaWQgVlA4TEJ1bmRsZUNvbG9yTWFwX0MoY29uc3QgdWludDhfdCogY29uc3Qgcm93LCBpbnQgd2lkdGgsIGludCB4Yml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgeDsKKyAgaWYgKHhiaXRzID4gMCkgeworICAgIGNvbnN0IGludCBiaXRfZGVwdGggPSAxIDw8ICgzIC0geGJpdHMpOworICAgIGNvbnN0IGludCBtYXNrID0gKDEgPDwgeGJpdHMpIC0gMTsKKyAgICB1aW50MzJfdCBjb2RlID0gMHhmZjAwMDAwMDsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgY29uc3QgaW50IHhzdWIgPSB4ICYgbWFzazsKKyAgICAgIGlmICh4c3ViID09IDApIHsKKyAgICAgICAgY29kZSA9IDB4ZmYwMDAwMDA7CisgICAgICB9CisgICAgICBjb2RlIHw9IHJvd1t4XSA8PCAoOCArIGJpdF9kZXB0aCAqIHhzdWIpOworICAgICAgZHN0W3ggPj4geGJpdHNdID0gY29kZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIGRzdFt4XSA9IDB4ZmYwMDAwMDAgfCAocm93W3hdIDw8IDgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0X0MoY29uc3QgdWludDMyX3QqIHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKKyAgaW50IGk7CisgIGRvdWJsZSBjb3N0ID0gMC47CisgIGZvciAoaSA9IDI7IGkgPCBsZW5ndGggLSAyOyArK2kpIGNvc3QgKz0gKGkgPj4gMSkgKiBwb3B1bGF0aW9uW2kgKyAyXTsKKyAgcmV0dXJuIGNvc3Q7Cit9CisKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0Q29tYmluZWRfQyhjb25zdCB1aW50MzJfdCogWCwgY29uc3QgdWludDMyX3QqIFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCkgeworICBpbnQgaTsKKyAgZG91YmxlIGNvc3QgPSAwLjsKKyAgZm9yIChpID0gMjsgaSA8IGxlbmd0aCAtIDI7ICsraSkgeworICAgIGNvbnN0IGludCB4eSA9IFhbaSArIDJdICsgWVtpICsgMl07CisgICAgY29zdCArPSAoaSA+PiAxKSAqIHh5OworICB9CisgIHJldHVybiBjb3N0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGRfQyhjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGxpdGVyYWxfc2l6ZSA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhhLT5wYWxldHRlX2NvZGVfYml0c18pOworICBhc3NlcnQoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfID09IGItPnBhbGV0dGVfY29kZV9iaXRzXyk7CisgIGlmIChiICE9IG91dCkgeworICAgIGZvciAoaSA9IDA7IGkgPCBsaXRlcmFsX3NpemU7ICsraSkgeworICAgICAgb3V0LT5saXRlcmFsX1tpXSA9IGEtPmxpdGVyYWxfW2ldICsgYi0+bGl0ZXJhbF9baV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgeworICAgICAgb3V0LT5kaXN0YW5jZV9baV0gPSBhLT5kaXN0YW5jZV9baV0gKyBiLT5kaXN0YW5jZV9baV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTElURVJBTF9DT0RFUzsgKytpKSB7CisgICAgICBvdXQtPnJlZF9baV0gPSBhLT5yZWRfW2ldICsgYi0+cmVkX1tpXTsKKyAgICAgIG91dC0+Ymx1ZV9baV0gPSBhLT5ibHVlX1tpXSArIGItPmJsdWVfW2ldOworICAgICAgb3V0LT5hbHBoYV9baV0gPSBhLT5hbHBoYV9baV0gKyBiLT5hbHBoYV9baV07CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCBsaXRlcmFsX3NpemU7ICsraSkgeworICAgICAgb3V0LT5saXRlcmFsX1tpXSArPSBhLT5saXRlcmFsX1tpXTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9ESVNUQU5DRV9DT0RFUzsgKytpKSB7CisgICAgICBvdXQtPmRpc3RhbmNlX1tpXSArPSBhLT5kaXN0YW5jZV9baV07CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fTElURVJBTF9DT0RFUzsgKytpKSB7CisgICAgICBvdXQtPnJlZF9baV0gKz0gYS0+cmVkX1tpXTsKKyAgICAgIG91dC0+Ymx1ZV9baV0gKz0gYS0+Ymx1ZV9baV07CisgICAgICBvdXQtPmFscGhhX1tpXSArPSBhLT5hbHBoYV9baV07CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbWFnZSB0cmFuc2Zvcm1zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIHJldHVybiAoKChhMCBeIGExKSAmIDB4ZmVmZWZlZmV1KSA+PiAxKSArIChhMCAmIGExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzKHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwgdWludDMyX3QgYTIpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMiksIGExKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2U0KHVpbnQzMl90IGEwLCB1aW50MzJfdCBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMiwgdWludDMyX3QgYTMpIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKEF2ZXJhZ2UyKGEwLCBhMSksIEF2ZXJhZ2UyKGEyLCBhMykpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xpcDI1NSh1aW50MzJfdCBhKSB7CisgIGlmIChhIDwgMjU2KSB7CisgICAgcmV0dXJuIGE7CisgIH0KKyAgLy8gcmV0dXJuIDAsIHdoZW4gYSBpcyBhIG5lZ2F0aXZlIGludGVnZXIuCisgIC8vIHJldHVybiAyNTUsIHdoZW4gYSBpcyBwb3NpdGl2ZS4KKyAgcmV0dXJuIH5hID4+IDI0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbChpbnQgYSwgaW50IGIsIGludCBjKSB7CisgIHJldHVybiBDbGlwMjU1KGEgKyBiIC0gYyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGMwID4+IDI0LCBjMSA+PiAyNCwgYzIgPj4gMjQpOworICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50RnVsbCgoYzAgPj4gMTYpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxID4+IDE2KSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjMiA+PiAxNikgJiAweGZmKTsKKyAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEZ1bGwoKGMwID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMxID4+IDgpICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMyID4+IDgpICYgMHhmZik7CisgIGNvbnN0IGludCBiID0gQWRkU3VidHJhY3RDb21wb25lbnRGdWxsKGMwICYgMHhmZiwgYzEgJiAweGZmLCBjMiAmIDB4ZmYpOworICByZXR1cm4gKCh1aW50MzJfdClhIDw8IDI0KSB8IChyIDw8IDE2KSB8IChnIDw8IDgpIHwgYjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoaW50IGEsIGludCBiKSB7CisgIHJldHVybiBDbGlwMjU1KGEgKyAoYSAtIGIpIC8gMik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGNvbnN0IHVpbnQzMl90IGF2ZSA9IEF2ZXJhZ2UyKGMwLCBjMSk7CisgIGNvbnN0IGludCBhID0gQWRkU3VidHJhY3RDb21wb25lbnRIYWxmKGF2ZSA+PiAyNCwgYzIgPj4gMjQpOworICBjb25zdCBpbnQgciA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDE2KSAmIDB4ZmYsIChjMiA+PiAxNikgJiAweGZmKTsKKyAgY29uc3QgaW50IGcgPSBBZGRTdWJ0cmFjdENvbXBvbmVudEhhbGYoKGF2ZSA+PiA4KSAmIDB4ZmYsIChjMiA+PiA4KSAmIDB4ZmYpOworICBjb25zdCBpbnQgYiA9IEFkZFN1YnRyYWN0Q29tcG9uZW50SGFsZigoYXZlID4+IDApICYgMHhmZiwgKGMyID4+IDApICYgMHhmZik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKHIgPDwgMTYpIHwgKGcgPDwgOCkgfCBiOworfQorCisvLyBnY2MtNC45IG9uIEFSTSBnZW5lcmF0ZXMgaW5jb3JyZWN0IGNvZGUgaW4gU2VsZWN0KCkgd2hlbiBTdWIzKCkgaXMgaW5saW5lZC4KKyNpZiBkZWZpbmVkKF9fYXJtX18pICYmIFwKKyAgICAoTE9DQUxfR0NDX1ZFUlNJT04gPT0gMHg0MDkgfHwgTE9DQUxfR0NDX1ZFUlNJT04gPT0gMHg0MDgpCisjIGRlZmluZSBMT0NBTF9JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lKSkKKyNlbHNlCisjIGRlZmluZSBMT0NBTF9JTkxJTkUgV0VCUF9JTkxJTkUKKyNlbmRpZgorCitzdGF0aWMgTE9DQUxfSU5MSU5FIGludCBTdWIzKGludCBhLCBpbnQgYiwgaW50IGMpIHsKKyAgY29uc3QgaW50IHBiID0gYiAtIGM7CisgIGNvbnN0IGludCBwYSA9IGEgLSBjOworICByZXR1cm4gYWJzKHBiKSAtIGFicyhwYSk7Cit9CisKKyN1bmRlZiBMT0NBTF9JTkxJTkUKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGNvbnN0IGludCBwYV9taW51c19wYiA9CisgICAgICBTdWIzKChhID4+IDI0KSAgICAgICAsIChiID4+IDI0KSAgICAgICAsIChjID4+IDI0KSAgICAgICApICsKKyAgICAgIFN1YjMoKGEgPj4gMTYpICYgMHhmZiwgKGIgPj4gMTYpICYgMHhmZiwgKGMgPj4gMTYpICYgMHhmZikgKworICAgICAgU3ViMygoYSA+PiAgOCkgJiAweGZmLCAoYiA+PiAgOCkgJiAweGZmLCAoYyA+PiAgOCkgJiAweGZmKSArCisgICAgICBTdWIzKChhICAgICAgKSAmIDB4ZmYsIChiICAgICAgKSAmIDB4ZmYsIChjICAgICAgKSAmIDB4ZmYpOworICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVkaWN0b3JzCisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFswXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IzKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFsxXTsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I0KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHRvcFstMV07Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMyhsZWZ0LCB0b3BbMF0sIHRvcFsxXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjYodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIobGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjcodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTIobGVmdCwgdG9wWzBdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOCh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMih0b3BbLTFdLCB0b3BbMF0pOworICAodm9pZClsZWZ0OworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I5KHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyKHRvcFswXSwgdG9wWzFdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTAodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQXZlcmFnZTQobGVmdCwgdG9wWy0xXSwgdG9wWzBdLCB0b3BbMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMSh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBTZWxlY3QodG9wWzBdLCBsZWZ0LCB0b3BbLTFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICBjb25zdCB1aW50MzJfdCBwcmVkID0gQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbChsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMyh1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBDbGFtcGVkQWRkU3VidHJhY3RIYWxmKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIwX0MoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fcGl4ZWxzOyArK2kpIG91dFtpXSA9IFZQOExTdWJQaXhlbHMoaW5baV0sIEFSR0JfQkxBQ0spOworICAodm9pZCl1cHBlcjsKK30KKworc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMV9DKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgKytpKSBvdXRbaV0gPSBWUDhMU3ViUGl4ZWxzKGluW2ldLCBpbltpIC0gMV0pOworICAodm9pZCl1cHBlcjsKK30KKworR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IyLCBQcmVkaWN0b3JTdWIyX0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjMsIFByZWRpY3RvclN1YjNfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yNCwgUHJlZGljdG9yU3ViNF9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I1LCBQcmVkaWN0b3JTdWI1X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjYsIFByZWRpY3RvclN1YjZfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yNywgUHJlZGljdG9yU3ViN19DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3I4LCBQcmVkaWN0b3JTdWI4X0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjksIFByZWRpY3RvclN1YjlfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMTAsIFByZWRpY3RvclN1YjEwX0MpCitHRU5FUkFURV9QUkVESUNUT1JfU1VCKFByZWRpY3RvcjExLCBQcmVkaWN0b3JTdWIxMV9DKQorR0VORVJBVEVfUFJFRElDVE9SX1NVQihQcmVkaWN0b3IxMiwgUHJlZGljdG9yU3ViMTJfQykKK0dFTkVSQVRFX1BSRURJQ1RPUl9TVUIoUHJlZGljdG9yMTMsIFByZWRpY3RvclN1YjEzX0MpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1ZQOExQcm9jZXNzRW5jQmx1ZUFuZFJlZEZ1bmMgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZDsKKworVlA4TFRyYW5zZm9ybUNvbG9yRnVuYyBWUDhMVHJhbnNmb3JtQ29sb3I7CisKK1ZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc0Z1bmMgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zOworVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNGdW5jIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zOworCitWUDhMRmFzdExvZzJTbG93RnVuYyBWUDhMRmFzdExvZzJTbG93OworVlA4TEZhc3RMb2cyU2xvd0Z1bmMgVlA4TEZhc3RTTG9nMlNsb3c7CisKK1ZQOExDb3N0RnVuYyBWUDhMRXh0cmFDb3N0OworVlA4TENvc3RDb21iaW5lZEZ1bmMgVlA4TEV4dHJhQ29zdENvbWJpbmVkOworVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHlGdW5jIFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5OworCitWUDhMR2V0RW50cm9weVVucmVmaW5lZEZ1bmMgVlA4TEdldEVudHJvcHlVbnJlZmluZWQ7CitWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkRnVuYyBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkOworCitWUDhMSGlzdG9ncmFtQWRkRnVuYyBWUDhMSGlzdG9ncmFtQWRkOworCitWUDhMVmVjdG9yTWlzbWF0Y2hGdW5jIFZQOExWZWN0b3JNaXNtYXRjaDsKK1ZQOExCdW5kbGVDb2xvck1hcEZ1bmMgVlA4TEJ1bmRsZUNvbG9yTWFwOworCitWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc1N1YlsxNl07CitWUDhMUHJlZGljdG9yQWRkU3ViRnVuYyBWUDhMUHJlZGljdG9yc1N1Yl9DWzE2XTsKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBWUDhMRW5jRHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFZQOExFbmNEc3BJbml0KSB7CisgIFZQOExEc3BJbml0KCk7CisKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX0M7CisKKyAgVlA4TFRyYW5zZm9ybUNvbG9yID0gVlA4TFRyYW5zZm9ybUNvbG9yX0M7CisjZW5kaWYKKworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgPSBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfQzsKKyAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgPSBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DOworCisgIFZQOExGYXN0TG9nMlNsb3cgPSBGYXN0TG9nMlNsb3dfQzsKKyAgVlA4TEZhc3RTTG9nMlNsb3cgPSBGYXN0U0xvZzJTbG93X0M7CisKKyAgVlA4TEV4dHJhQ29zdCA9IEV4dHJhQ29zdF9DOworICBWUDhMRXh0cmFDb3N0Q29tYmluZWQgPSBFeHRyYUNvc3RDb21iaW5lZF9DOworICBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSA9IENvbWJpbmVkU2hhbm5vbkVudHJvcHlfQzsKKworICBWUDhMR2V0RW50cm9weVVucmVmaW5lZCA9IEdldEVudHJvcHlVbnJlZmluZWRfQzsKKyAgVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZCA9IEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZF9DOworCisgIFZQOExIaXN0b2dyYW1BZGQgPSBIaXN0b2dyYW1BZGRfQzsKKworICBWUDhMVmVjdG9yTWlzbWF0Y2ggPSBWZWN0b3JNaXNtYXRjaF9DOworICBWUDhMQnVuZGxlQ29sb3JNYXAgPSBWUDhMQnVuZGxlQ29sb3JNYXBfQzsKKworICBWUDhMUHJlZGljdG9yc1N1YlswXSA9IFByZWRpY3RvclN1YjBfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMV0gPSBQcmVkaWN0b3JTdWIxX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzJdID0gUHJlZGljdG9yU3ViMl9DOworICBWUDhMUHJlZGljdG9yc1N1YlszXSA9IFByZWRpY3RvclN1YjNfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNF0gPSBQcmVkaWN0b3JTdWI0X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzVdID0gUHJlZGljdG9yU3ViNV9DOworICBWUDhMUHJlZGljdG9yc1N1Yls2XSA9IFByZWRpY3RvclN1YjZfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbN10gPSBQcmVkaWN0b3JTdWI3X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViWzhdID0gUHJlZGljdG9yU3ViOF9DOworICBWUDhMUHJlZGljdG9yc1N1Yls5XSA9IFByZWRpY3RvclN1YjlfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTBdID0gUHJlZGljdG9yU3ViMTBfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTFdID0gUHJlZGljdG9yU3ViMTFfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTJdID0gUHJlZGljdG9yU3ViMTJfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTNdID0gUHJlZGljdG9yU3ViMTNfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTRdID0gUHJlZGljdG9yU3ViMF9DOyAgLy8gPC0gcGFkZGluZyBzZWN1cml0eSBzZW50aW5lbHMKKyAgVlA4TFByZWRpY3RvcnNTdWJbMTVdID0gUHJlZGljdG9yU3ViMF9DOworCisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMF0gPSBQcmVkaWN0b3JTdWIwX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMV0gPSBQcmVkaWN0b3JTdWIxX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMl0gPSBQcmVkaWN0b3JTdWIyX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbM10gPSBQcmVkaWN0b3JTdWIzX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbNF0gPSBQcmVkaWN0b3JTdWI0X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbNV0gPSBQcmVkaWN0b3JTdWI1X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbNl0gPSBQcmVkaWN0b3JTdWI2X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbN10gPSBQcmVkaWN0b3JTdWI3X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbOF0gPSBQcmVkaWN0b3JTdWI4X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbOV0gPSBQcmVkaWN0b3JTdWI5X0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTBdID0gUHJlZGljdG9yU3ViMTBfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMV0gPSBQcmVkaWN0b3JTdWIxMV9DOworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEyXSA9IFByZWRpY3RvclN1YjEyX0M7CisgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTNdID0gUHJlZGljdG9yU3ViMTNfQzsKKyAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxNF0gPSBQcmVkaWN0b3JTdWIwX0M7ICAvLyA8LSBwYWRkaW5nIHNlY3VyaXR5IHNlbnRpbmVscworICBWUDhMUHJlZGljdG9yc1N1Yl9DWzE1XSA9IFByZWRpY3RvclN1YjBfQzsKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgVlA4TEVuY0RzcEluaXRTU0UyKCk7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICAgIFZQOExFbmNEc3BJbml0U1NFNDEoKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTMzIpKSB7CisgICAgICBWUDhMRW5jRHNwSW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFZQOExFbmNEc3BJbml0TVNBKCk7CisgICAgfQorI2VuZGlmCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBWUDhMRW5jRHNwSW5pdE5FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMVHJhbnNmb3JtQ29sb3IgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3JtcyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExGYXN0TG9nMlNsb3cgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMRmFzdFNMb2cyU2xvdyAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExFeHRyYUNvc3QgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMRXh0cmFDb3N0Q29tYmluZWQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExHZXRFbnRyb3B5VW5yZWZpbmVkICE9IE5VTEwpOworICBhc3NlcnQoVlA4TEdldENvbWJpbmVkRW50cm9weVVucmVmaW5lZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExIaXN0b2dyYW1BZGQgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMVmVjdG9yTWlzbWF0Y2ggIT0gTlVMTCk7CisgIGFzc2VydChWUDhMQnVuZGxlQ29sb3JNYXAgIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlswXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1YlszXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbNV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls2XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzddICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJbOF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yls5XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzEwXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzExXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzEyXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzEzXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzE0XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViWzE1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMF0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1syXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbM10gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s1XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbNl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzddICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1s4XSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbOV0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzEwXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTFdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxMl0gIT0gTlVMTCk7CisgIGFzc2VydChWUDhMUHJlZGljdG9yc1N1Yl9DWzEzXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFZQOExQcmVkaWN0b3JzU3ViX0NbMTRdICE9IE5VTEwpOworICBhc3NlcnQoVlA4TFByZWRpY3RvcnNTdWJfQ1sxNV0gIT0gTlVMTCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODNhYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzMzIuYwpAQCAtMCwwICsxLDQzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBsb3NzbGVzcyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzIpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisKK3N0YXRpYyBmbG9hdCBGYXN0U0xvZzJTbG93X01JUFMzMih1aW50MzJfdCB2KSB7CisgIGFzc2VydCh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgIGlmICh2IDwgQVBQUk9YX0xPR19XSVRIX0NPUlJFQ1RJT05fTUFYKSB7CisgICAgdWludDMyX3QgbG9nX2NudCwgeSwgY29ycmVjdGlvbjsKKyAgICBjb25zdCBpbnQgYzI0ID0gMjQ7CisgICAgY29uc3QgZmxvYXQgdl9mID0gKGZsb2F0KXY7CisgICAgdWludDMyX3QgdGVtcDsKKworICAgIC8vIFhmID0gMjU2ID0gMl44CisgICAgLy8gbG9nX2NudCBpcyBpbmRleCBvZiBsZWFkaW5nIG9uZSBpbiB1cHBlciAyNCBiaXRzCisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICJjbHogICAgICAlW2xvZ19jbnRdLCAlW3ZdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICAgJVt5XSwgICAgICAgJHplcm8sICAgICAgICAxICAgICAgICAgICBcblx0IgorICAgICAgInN1YnUgICAgICVbbG9nX2NudF0sICVbYzI0XSwgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzbGx2ICAgICAlW3ldLCAgICAgICAlW3ldLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICAic3JsdiAgICAgJVt0ZW1wXSwgICAgJVt2XSwgICAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgOiBbbG9nX2NudF0iPSZyIihsb2dfY250KSwgW3ldIj0mciIoeSksCisgICAgICAgIFt0ZW1wXSI9ciIodGVtcCkKKyAgICAgIDogW2MyNF0iciIoYzI0KSwgW3ZdInIiKHYpCisgICAgKTsKKworICAgIC8vIHZmID0gKDJebG9nX2NudCkgKiBYZjsgd2hlcmUgeSA9IDJebG9nX2NudCBhbmQgWGYgPCAyNTYKKyAgICAvLyBYZiA9IGZsb29yKFhmKSAqICgxICsgKHYgJSB5KSAvIHYpCisgICAgLy8gbG9nMihYZikgPSBsb2cyKGZsb29yKFhmKSkgKyBsb2cyKDEgKyAodiAlIHkpIC8gdikKKyAgICAvLyBUaGUgY29ycmVjdGlvbiBmYWN0b3I6IGxvZygxICsgZCkgfiBkOyBmb3IgdmVyeSBzbWFsbCBkIHZhbHVlcywgc28KKyAgICAvLyBsb2cyKDEgKyAodiAlIHkpIC8gdikgfiBMT0dfMl9SRUNJUFJPQ0FMICogKHYgJSB5KS92CisgICAgLy8gTE9HXzJfUkVDSVBST0NBTCB+IDIzLzE2CisKKyAgICAvLyAodiAlIHkpID0gKHYgJSAyXmxvZ19jbnQpID0gdiAmICgyXmxvZ19jbnQgLSAxKQorICAgIGNvcnJlY3Rpb24gPSAoMjMgKiAodiAmICh5IC0gMSkpKSA+PiA0OworICAgIHJldHVybiB2X2YgKiAoa0xvZzJUYWJsZVt0ZW1wXSArIGxvZ19jbnQpICsgY29ycmVjdGlvbjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogdiAqIGxvZygoZG91YmxlKXYpKTsKKyAgfQorfQorCitzdGF0aWMgZmxvYXQgRmFzdExvZzJTbG93X01JUFMzMih1aW50MzJfdCB2KSB7CisgIGFzc2VydCh2ID49IExPR19MT09LVVBfSURYX01BWCk7CisgIGlmICh2IDwgQVBQUk9YX0xPR19XSVRIX0NPUlJFQ1RJT05fTUFYKSB7CisgICAgdWludDMyX3QgbG9nX2NudCwgeTsKKyAgICBjb25zdCBpbnQgYzI0ID0gMjQ7CisgICAgZG91YmxlIGxvZ18yOworICAgIHVpbnQzMl90IHRlbXA7CisKKyAgICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICAgImNseiAgICAgICVbbG9nX2NudF0sICVbdl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW3ldLCAgICAgICAkemVybywgICAgICAgIDEgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICAgJVtsb2dfY250XSwgJVtjMjRdLCAgICAgICAlW2xvZ19jbnRdICBcblx0IgorICAgICAgInNsbHYgICAgICVbeV0sICAgICAgICVbeV0sICAgICAgICAgJVtsb2dfY250XSAgXG5cdCIKKyAgICAgICJzcmx2ICAgICAlW3RlbXBdLCAgICAlW3ZdLCAgICAgICAgICVbbG9nX2NudF0gIFxuXHQiCisgICAgICA6IFtsb2dfY250XSI9JnIiKGxvZ19jbnQpLCBbeV0iPSZyIih5KSwKKyAgICAgICAgW3RlbXBdIj1yIih0ZW1wKQorICAgICAgOiBbYzI0XSJyIihjMjQpLCBbdl0iciIodikKKyAgICApOworCisgICAgbG9nXzIgPSBrTG9nMlRhYmxlW3RlbXBdICsgbG9nX2NudDsKKyAgICBpZiAodiA+PSBBUFBST1hfTE9HX01BWCkgeworICAgICAgLy8gU2luY2UgdGhlIGRpdmlzaW9uIGlzIHN0aWxsIGV4cGVuc2l2ZSwgYWRkIHRoaXMgY29ycmVjdGlvbiBmYWN0b3Igb25seQorICAgICAgLy8gZm9yIGxhcmdlIHZhbHVlcyBvZiAndicuCisKKyAgICAgIGNvbnN0IHVpbnQzMl90IGNvcnJlY3Rpb24gPSAoMjMgKiAodiAmICh5IC0gMSkpKSA+PiA0OworICAgICAgbG9nXzIgKz0gKGRvdWJsZSljb3JyZWN0aW9uIC8gdjsKKyAgICB9CisgICAgcmV0dXJuIChmbG9hdClsb2dfMjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKGZsb2F0KShMT0dfMl9SRUNJUFJPQ0FMICogbG9nKChkb3VibGUpdikpOworICB9Cit9CisKKy8vIEMgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uOgorLy8gICBpbnQgaSA9IDA7CisvLyAgIGludDY0X3QgY29zdCA9IDA7CisvLyAgIGNvbnN0IHVpbnQzMl90KiBwb3AgPSAmcG9wdWxhdGlvbls0XTsKKy8vICAgY29uc3QgdWludDMyX3QqIExvb3BFbmQgPSAmcG9wdWxhdGlvbltsZW5ndGhdOworLy8gICB3aGlsZSAocG9wICE9IExvb3BFbmQpIHsKKy8vICAgICArK2k7CisvLyAgICAgY29zdCArPSBpICogKnBvcDsKKy8vICAgICBjb3N0ICs9IGkgKiAqKHBvcCArIDEpOworLy8gICAgIHBvcCArPSAyOworLy8gICB9CisvLyAgIHJldHVybiAoZG91YmxlKWNvc3Q7CitzdGF0aWMgZG91YmxlIEV4dHJhQ29zdF9NSVBTMzIoY29uc3QgdWludDMyX3QqIGNvbnN0IHBvcHVsYXRpb24sIGludCBsZW5ndGgpIHsKKyAgaW50IGksIHRlbXAwLCB0ZW1wMTsKKyAgY29uc3QgdWludDMyX3QqIHBvcCA9ICZwb3B1bGF0aW9uWzRdOworICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9ICZwb3B1bGF0aW9uW2xlbmd0aF07CisKKyAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAibXVsdCAgICR6ZXJvLCAgICAkemVybyAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInhvciAgICAlW2ldLCAgICAgJVtpXSwgICAgICAgJVtpXSAgICAgICBcblx0IgorICAgICJiZXEgICAgJVtwb3BdLCAgICVbTG9vcEVuZF0sIDJmICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAwXSwgMCglW3BvcF0pICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMV0sIDQoJVtwb3BdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICVbaV0sICAgICAlW2ldLCAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAlW3BvcF0sICAgJVtwb3BdLCAgICAgOCAgICAgICAgICBcblx0IgorICAgICJtYWRkICAgJVtpXSwgICAgICVbdGVtcDBdICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWFkZCAgICVbaV0sICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAlW3BvcF0sICAgJVtMb29wRW5kXSwgMWIgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibWZoaSAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1mbG8gICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgIFtpXSI9JnIiKGkpLCBbcG9wXSIrciIocG9wKQorICAgIDogW0xvb3BFbmRdInIiKExvb3BFbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIHJldHVybiAoZG91YmxlKSgoaW50NjRfdCl0ZW1wMCA8PCAzMiB8IHRlbXAxKTsKK30KKworLy8gQyB2ZXJzaW9uIG9mIHRoaXMgZnVuY3Rpb246CisvLyAgIGludCBpID0gMDsKKy8vICAgaW50NjRfdCBjb3N0ID0gMDsKKy8vICAgY29uc3QgdWludDMyX3QqIHBYID0gJlhbNF07CisvLyAgIGNvbnN0IHVpbnQzMl90KiBwWSA9ICZZWzRdOworLy8gICBjb25zdCB1aW50MzJfdCogTG9vcEVuZCA9ICZYW2xlbmd0aF07CisvLyAgIHdoaWxlIChwWCAhPSBMb29wRW5kKSB7CisvLyAgICAgY29uc3QgdWludDMyX3QgeHkwID0gKnBYICsgKnBZOworLy8gICAgIGNvbnN0IHVpbnQzMl90IHh5MSA9ICoocFggKyAxKSArICoocFkgKyAxKTsKKy8vICAgICArK2k7CisvLyAgICAgY29zdCArPSBpICogeHkwOworLy8gICAgIGNvc3QgKz0gaSAqIHh5MTsKKy8vICAgICBwWCArPSAyOworLy8gICAgIHBZICs9IDI7CisvLyAgIH0KKy8vICAgcmV0dXJuIChkb3VibGUpY29zdDsKK3N0YXRpYyBkb3VibGUgRXh0cmFDb3N0Q29tYmluZWRfTUlQUzMyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IFksIGludCBsZW5ndGgpIHsKKyAgaW50IGksIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBjb25zdCB1aW50MzJfdCogcFggPSAmWFs0XTsKKyAgY29uc3QgdWludDMyX3QqIHBZID0gJllbNF07CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBMb29wRW5kID0gJlhbbGVuZ3RoXTsKKworICBfX2FzbV9fIHZvbGF0aWxlKAorICAgICJtdWx0ICAgJHplcm8sICAgICR6ZXJvICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAieG9yICAgICVbaV0sICAgICAlW2ldLCAgICAgICAlW2ldICAgICAgIFxuXHQiCisgICAgImJlcSAgICAlW3BYXSwgICAgJVtMb29wRW5kXSwgMmYgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDBdLCAwKCVbcFhdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAlW3RlbXAxXSwgMCglW3BZXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgJVt0ZW1wMl0sIDQoJVtwWF0pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICVbdGVtcDNdLCA0KCVbcFldKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAlW2ldLCAgICAgJVtpXSwgICAgICAgMSAgICAgICAgICBcblx0IgorICAgICJhZGR1ICAgJVt0ZW1wMF0sICVbdGVtcDBdLCAgICVbdGVtcDFdICAgXG5cdCIKKyAgICAiYWRkdSAgICVbdGVtcDJdLCAlW3RlbXAyXSwgICAlW3RlbXAzXSAgIFxuXHQiCisgICAgImFkZGl1ICAlW3BYXSwgICAgJVtwWF0sICAgICAgOCAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgJVtwWV0sICAgICVbcFldLCAgICAgIDggICAgICAgICAgXG5cdCIKKyAgICAibWFkZCAgICVbaV0sICAgICAlW3RlbXAwXSAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1hZGQgICAlW2ldLCAgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgJVtwWF0sICAgICVbTG9vcEVuZF0sIDFiICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIm1maGkgICAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJtZmxvICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW2ldIj0mciIoaSksIFtwWF0iK3IiKHBYKSwgW3BZXSIrciIocFkpCisgICAgOiBbTG9vcEVuZF0iciIoTG9vcEVuZCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgcmV0dXJuIChkb3VibGUpKChpbnQ2NF90KXRlbXAwIDw8IDMyIHwgdGVtcDEpOworfQorCisjZGVmaW5lIEhVRkZNQU5fQ09TVF9QQVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfX2FzbV9fIHZvbGF0aWxlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAic2xsICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgICAgMyAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImFkZGl1ICVbdGVtcDNdLCAgJVtzdHJlYWtdLCAgIC0zICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGR1ICAlW3RlbXAyXSwgICVbcHN0cmVha3NdLCAlW3RlbXAxXSAgICBcblx0IiAgICAgIFwKKyAgICAiYmxleiAgJVt0ZW1wM10sICAxZiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgInNybCAgICVbdGVtcDFdLCAgJVt0ZW1wMV0sICAgIDEgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGR1ICAlW3RlbXAzXSwgICVbcGNudHNdLCAgICAlW3RlbXAxXSAgICBcblx0IiAgICAgIFwKKyAgICAibHcgICAgJVt0ZW1wMF0sICA0KCVbdGVtcDJdKSAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgImx3ICAgICVbdGVtcDFdLCAgMCglW3RlbXAzXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJhZGR1ICAlW3RlbXAwXSwgICVbdGVtcDBdLCAgICAlW3N0cmVha10gICBcblx0IiAgICAgIFwKKyAgICAiYWRkaXUgJVt0ZW1wMV0sICAlW3RlbXAxXSwgICAgMSAgICAgICAgICAgXG5cdCIgICAgICBcCisgICAgInN3ICAgICVbdGVtcDBdLCAgNCglW3RlbXAyXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJzdyAgICAlW3RlbXAxXSwgIDAoJVt0ZW1wM10pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYiAgICAgMmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAgICJsdyAgICAlW3RlbXAwXSwgIDAoJVt0ZW1wMl0pICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICAiYWRkdSAgJVt0ZW1wMF0sICAlW3RlbXAwXSwgICAgJVtzdHJlYWtdICAgXG5cdCIgICAgICBcCisgICAgInN3ICAgICVbdGVtcDBdLCAgMCglW3RlbXAyXSkgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksICAgICAgICAgICBcCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDBdIityIih0ZW1wMCkgICAgICAgICAgICAgXAorICAgIDogW3BzdHJlYWtzXSJyIihwc3RyZWFrcyksIFtwY250c10iciIocGNudHMpLCAgICAgICAgIFwKKyAgICAgIFtzdHJlYWtdInIiKHN0cmVhaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiAibWVtb3J5IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICApOworCisvLyBSZXR1cm5zIHRoZSB2YXJpb3VzIFJMRSBjb3VudHMKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoCisgICAgdWludDMyX3QgdmFsLCBpbnQgaSwgdWludDMyX3QqIGNvbnN0IHZhbF9wcmV2LCBpbnQqIGNvbnN0IGlfcHJldiwKKyAgICBWUDhMQml0RW50cm9weSogY29uc3QgYml0X2VudHJvcHksIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQqIGNvbnN0IHBzdHJlYWtzID0gJnN0YXRzLT5zdHJlYWtzWzBdWzBdOworICBpbnQqIGNvbnN0IHBjbnRzID0gJnN0YXRzLT5jb3VudHNbMF07CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsKKyAgY29uc3QgaW50IHN0cmVhayA9IGkgLSAqaV9wcmV2OworCisgIC8vIEdhdGhlciBpbmZvIGZvciB0aGUgYml0IGVudHJvcHkuCisgIGlmICgqdmFsX3ByZXYgIT0gMCkgeworICAgIGJpdF9lbnRyb3B5LT5zdW0gKz0gKCp2YWxfcHJldikgKiBzdHJlYWs7CisgICAgYml0X2VudHJvcHktPm5vbnplcm9zICs9IHN0cmVhazsKKyAgICBiaXRfZW50cm9weS0+bm9uemVyb19jb2RlID0gKmlfcHJldjsKKyAgICBiaXRfZW50cm9weS0+ZW50cm9weSAtPSBWUDhMRmFzdFNMb2cyKCp2YWxfcHJldikgKiBzdHJlYWs7CisgICAgaWYgKGJpdF9lbnRyb3B5LT5tYXhfdmFsIDwgKnZhbF9wcmV2KSB7CisgICAgICBiaXRfZW50cm9weS0+bWF4X3ZhbCA9ICp2YWxfcHJldjsKKyAgICB9CisgIH0KKworICAvLyBHYXRoZXIgaW5mbyBmb3IgdGhlIEh1ZmZtYW4gY29zdC4KKyAgdGVtcDAgPSAoKnZhbF9wcmV2ICE9IDApOworICBIVUZGTUFOX0NPU1RfUEFTUworCisgICp2YWxfcHJldiA9IHZhbDsKKyAgKmlfcHJldiA9IGk7Cit9CisKK3N0YXRpYyB2b2lkIEdldEVudHJvcHlVbnJlZmluZWRfTUlQUzMyKGNvbnN0IHVpbnQzMl90IFhbXSwgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRFbnRyb3B5KiBjb25zdCBiaXRfZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExTdHJlYWtzKiBjb25zdCBzdGF0cykgeworICBpbnQgaTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHhfcHJldiA9IFhbMF07CisKKyAgbWVtc2V0KHN0YXRzLCAwLCBzaXplb2YoKnN0YXRzKSk7CisgIFZQOExCaXRFbnRyb3B5SW5pdChiaXRfZW50cm9weSk7CisKKyAgZm9yIChpID0gMTsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgeCA9IFhbaV07CisgICAgaWYgKHggIT0geF9wcmV2KSB7CisgICAgICBHZXRFbnRyb3B5VW5yZWZpbmVkSGVscGVyKHgsIGksICZ4X3ByZXYsICZpX3ByZXYsIGJpdF9lbnRyb3B5LCBzdGF0cyk7CisgICAgfQorICB9CisgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoMCwgaSwgJnhfcHJldiwgJmlfcHJldiwgYml0X2VudHJvcHksIHN0YXRzKTsKKworICBiaXRfZW50cm9weS0+ZW50cm9weSArPSBWUDhMRmFzdFNMb2cyKGJpdF9lbnRyb3B5LT5zdW0pOworfQorCitzdGF0aWMgdm9pZCBHZXRDb21iaW5lZEVudHJvcHlVbnJlZmluZWRfTUlQUzMyKGNvbnN0IHVpbnQzMl90IFhbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgWVtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0RW50cm9weSogY29uc3QgZW50cm9weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN0cmVha3MqIGNvbnN0IHN0YXRzKSB7CisgIGludCBpID0gMTsKKyAgaW50IGlfcHJldiA9IDA7CisgIHVpbnQzMl90IHh5X3ByZXYgPSBYWzBdICsgWVswXTsKKworICBtZW1zZXQoc3RhdHMsIDAsIHNpemVvZigqc3RhdHMpKTsKKyAgVlA4TEJpdEVudHJvcHlJbml0KGVudHJvcHkpOworCisgIGZvciAoaSA9IDE7IGkgPCBsZW5ndGg7ICsraSkgeworICAgIGNvbnN0IHVpbnQzMl90IHh5ID0gWFtpXSArIFlbaV07CisgICAgaWYgKHh5ICE9IHh5X3ByZXYpIHsKKyAgICAgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoeHksIGksICZ4eV9wcmV2LCAmaV9wcmV2LCBlbnRyb3B5LCBzdGF0cyk7CisgICAgfQorICB9CisgIEdldEVudHJvcHlVbnJlZmluZWRIZWxwZXIoMCwgaSwgJnh5X3ByZXYsICZpX3ByZXYsIGVudHJvcHksIHN0YXRzKTsKKworICBlbnRyb3B5LT5lbnRyb3B5ICs9IFZQOExGYXN0U0xvZzIoZW50cm9weS0+c3VtKTsKK30KKworI2RlZmluZSBBU01fU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9fYXNtX18gdm9sYXRpbGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiLnNldCAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgXAorICAgICIuc2V0ICAgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICAgIi5zZXQgICBtYWNybyAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gUDIgPSBQMCArIFAxCisvLyBBLi5EIC0gb2Zmc2V0cworLy8gRSAtIHRlbXAgdmFyaWFibGUgdG8gdGVsbCBtYWNybworLy8gICAgIGlmIHBvaW50ZXIgc2hvdWxkIGJlIGluY3JlbWVudGVkCisvLyBsaXRlcmFsXyBhbmQgc3VjY2Vzc2l2ZSBoaXN0b2dyYW1zIGNvdWxkIGJlIHVuYWxpZ25lZAorLy8gc28gd2UgbXVzdCB1c2UgdWx3IGFuZCB1c3cKKyNkZWZpbmUgQUREX1RPX09VVChBLCBCLCBDLCBELCBFLCBQMCwgUDEsIFAyKSAgICAgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wMF0sICIgI0EgIiglWyIgI1AwICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXAxXSwgIiAjQiAiKCVbIiAjUDAgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDJdLCAiICNDICIoJVsiICNQMCAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wM10sICIgI0QgIiglWyIgI1AwICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXA0XSwgIiAjQSAiKCVbIiAjUDEgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidWx3ICAgICVbdGVtcDVdLCAiICNCICIoJVsiICNQMSAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1bHcgICAgJVt0ZW1wNl0sICIgI0MgIiglWyIgI1AxICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVsdyAgICAlW3RlbXA3XSwgIiAjRCAiKCVbIiAjUDEgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAiYWRkdSAgICVbdGVtcDRdLCAlW3RlbXA0XSwgICAlW3RlbXAwXSAgXG5cdCIgICAgICAgXAorICAgICJhZGR1ICAgJVt0ZW1wNV0sICVbdGVtcDVdLCAgICVbdGVtcDFdICBcblx0IiAgICAgICBcCisgICAgImFkZHUgICAlW3RlbXA2XSwgJVt0ZW1wNl0sICAgJVt0ZW1wMl0gIFxuXHQiICAgICAgIFwKKyAgICAiYWRkdSAgICVbdGVtcDddLCAlW3RlbXA3XSwgICAlW3RlbXAzXSAgXG5cdCIgICAgICAgXAorICAgICJhZGRpdSAgJVsiICNQMCAiXSwgICVbIiAjUDAgIl0sICAxNiAgICBcblx0IiAgICAgICBcCisgICIuaWYgIiAjRSAiID09IDEgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKyAgICAiYWRkaXUgICVbIiAjUDEgIl0sICAlWyIgI1AxICJdLCAgMTYgICAgXG5cdCIgICAgICAgXAorICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICBcCisgICAgInVzdyAgICAlW3RlbXA0XSwgIiAjQSAiKCVbIiAjUDIgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAidXN3ICAgICVbdGVtcDVdLCAiICNCICIoJVsiICNQMiAiXSkgICAgXG5cdCIgICAgICAgXAorICAgICJ1c3cgICAgJVt0ZW1wNl0sICIgI0MgIiglWyIgI1AyICJdKSAgICBcblx0IiAgICAgICBcCisgICAgInVzdyAgICAlW3RlbXA3XSwgIiAjRCAiKCVbIiAjUDIgIl0pICAgIFxuXHQiICAgICAgIFwKKyAgICAiYWRkaXUgICVbIiAjUDIgIl0sICVbIiAjUDIgIl0sICAgMTYgICAgXG5cdCIgICAgICAgXAorICAgICJibmUgICAgJVsiICNQMCAiXSwgJVtMb29wRW5kXSwgMWIgICAgICBcblx0IiAgICAgICBcCisgICAgIi5zZXQgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgIFwKKworI2RlZmluZSBBU01fRU5EX0NPTU1PTl8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCAgICAgICAgIFwKKyAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksICAgICAgICAgXAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgICAgICAgICBcCisgICAgICBbdGVtcDZdIj0mciIodGVtcDYpLCBbdGVtcDddIj0mciIodGVtcDcpLCAgICAgICAgIFwKKyAgICAgIFtwYV0iK3IiKHBhKSwgW3BvdXRdIityIihwb3V0KQorCisjZGVmaW5lIEFTTV9FTkRfQ09NTU9OXzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICA6IFtMb29wRW5kXSJyIihMb29wRW5kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDogIm1lbW9yeSIsICJhdCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICk7CisKKyNkZWZpbmUgQVNNX0VORF8wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTTV9FTkRfQ09NTU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAsIFtwYl0iK3IiKHBiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBU01fRU5EX0NPTU1PTl8xCisKKyNkZWZpbmUgQVNNX0VORF8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFTTV9FTkRfQ09NTU9OXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVNNX0VORF9DT01NT05fMQorCisjZGVmaW5lIEFERF9WRUNUT1IoQSwgQiwgT1VULCBTSVpFLCBFWFRSQV9TSVpFKSAgZG8geyAgIFwKKyAgY29uc3QgdWludDMyX3QqIHBhID0gKGNvbnN0IHVpbnQzMl90KikoQSk7ICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCogcGIgPSAoY29uc3QgdWludDMyX3QqKShCKTsgICAgICAgICAgICBcCisgIHVpbnQzMl90KiBwb3V0ID0gKHVpbnQzMl90KikoT1VUKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IExvb3BFbmQgPSBwYSArIChTSVpFKTsgICAgICAgICAgXAorICBhc3NlcnQoKFNJWkUpICUgNCA9PSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTTV9TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREX1RPX09VVCgwLCA0LCA4LCAxMiwgMSwgcGEsIHBiLCBwb3V0KSAgICAgICAgICAgICAgXAorICBBU01fRU5EXzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICgoRVhUUkFfU0laRSkgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgbGFzdCA9IChFWFRSQV9TSVpFKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IGxhc3Q7ICsraSkgcG91dFtpXSA9IHBhW2ldICsgcGJbaV07IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBRERfVkVDVE9SX0VRKEEsIE9VVCwgU0laRSwgRVhUUkFfU0laRSkgIGRvIHsgICBcCisgIGNvbnN0IHVpbnQzMl90KiBwYSA9IChjb25zdCB1aW50MzJfdCopKEEpOyAgICAgICAgICAgIFwKKyAgdWludDMyX3QqIHBvdXQgPSAodWludDMyX3QqKShPVVQpOyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCogY29uc3QgTG9vcEVuZCA9IHBhICsgKFNJWkUpOyAgICAgICAgICBcCisgIGFzc2VydCgoU0laRSkgJSA0ID09IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNNX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRERfVE9fT1VUKDAsIDQsIDgsIDEyLCAwLCBwYSwgcG91dCwgcG91dCkgICAgICAgICAgICBcCisgIEFTTV9FTkRfMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKChFWFRSQV9TSVpFKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsYXN0ID0gKEVYVFJBX1NJWkUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGFzdDsgKytpKSBwb3V0W2ldICs9IHBhW2ldOyAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1BZGRfTUlQUzMyKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCkgeworICB1aW50MzJfdCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNiwgdGVtcDc7CisgIGNvbnN0IGludCBleHRyYV9jYWNoZV9zaXplID0gVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGEtPnBhbGV0dGVfY29kZV9iaXRzXykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTKTsKKyAgYXNzZXJ0KGEtPnBhbGV0dGVfY29kZV9iaXRzXyA9PSBiLT5wYWxldHRlX2NvZGVfYml0c18pOworCisgIGlmIChiICE9IG91dCkgeworICAgIEFERF9WRUNUT1IoYS0+bGl0ZXJhbF8sIGItPmxpdGVyYWxfLCBvdXQtPmxpdGVyYWxfLAorICAgICAgICAgICAgICAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTLCBleHRyYV9jYWNoZV9zaXplKTsKKyAgICBBRERfVkVDVE9SKGEtPmRpc3RhbmNlXywgYi0+ZGlzdGFuY2VfLCBvdXQtPmRpc3RhbmNlXywKKyAgICAgICAgICAgICAgIE5VTV9ESVNUQU5DRV9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUihhLT5yZWRfLCBiLT5yZWRfLCBvdXQtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCAwKTsKKyAgICBBRERfVkVDVE9SKGEtPmJsdWVfLCBiLT5ibHVlXywgb3V0LT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1IoYS0+YWxwaGFfLCBiLT5hbHBoYV8sIG91dC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgIH0gZWxzZSB7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5saXRlcmFsXywgb3V0LT5saXRlcmFsXywKKyAgICAgICAgICAgICAgICAgIE5VTV9MSVRFUkFMX0NPREVTICsgTlVNX0xFTkdUSF9DT0RFUywgZXh0cmFfY2FjaGVfc2l6ZSk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5kaXN0YW5jZV8sIG91dC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1JfRVEoYS0+cmVkXywgb3V0LT5yZWRfLCBOVU1fTElURVJBTF9DT0RFUywgMCk7CisgICAgQUREX1ZFQ1RPUl9FUShhLT5ibHVlXywgb3V0LT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICAgIEFERF9WRUNUT1JfRVEoYS0+YWxwaGFfLCBvdXQtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsIDApOworICB9Cit9CisKKyN1bmRlZiBBRERfVkVDVE9SX0VRCisjdW5kZWYgQUREX1ZFQ1RPUgorI3VuZGVmIEFTTV9FTkRfMQorI3VuZGVmIEFTTV9FTkRfMAorI3VuZGVmIEFTTV9FTkRfQ09NTU9OXzEKKyN1bmRlZiBBU01fRU5EX0NPTU1PTl8wCisjdW5kZWYgQUREX1RPX09VVAorI3VuZGVmIEFTTV9TVEFSVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTMzIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdE1JUFMzMih2b2lkKSB7CisgIFZQOExGYXN0U0xvZzJTbG93ID0gRmFzdFNMb2cyU2xvd19NSVBTMzI7CisgIFZQOExGYXN0TG9nMlNsb3cgPSBGYXN0TG9nMlNsb3dfTUlQUzMyOworICBWUDhMRXh0cmFDb3N0ID0gRXh0cmFDb3N0X01JUFMzMjsKKyAgVlA4TEV4dHJhQ29zdENvbWJpbmVkID0gRXh0cmFDb3N0Q29tYmluZWRfTUlQUzMyOworICBWUDhMR2V0RW50cm9weVVucmVmaW5lZCA9IEdldEVudHJvcHlVbnJlZmluZWRfTUlQUzMyOworICBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkID0gR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkX01JUFMzMjsKKyAgVlA4TEhpc3RvZ3JhbUFkZCA9IEhpc3RvZ3JhbUFkZF9NSVBTMzI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdE1JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NTVlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMjgxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW1hZ2UgdHJhbnNmb3JtIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIuCisvLworLy8gQXV0aG9yKHMpOiAgRGpvcmRqZSBQZXN1dCAgICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICAgSm92YW4gWmVsaW5jZXZpYyAoam92YW4uemVsaW5jZXZpY0BpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9NSVBTZHNwUjIodWludDMyX3QqIGFyZ2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgdWludDMyX3QgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OworICB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBhcmdiX2RhdGEgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gcF9sb29wMV9lbmQgKyAobnVtX3BpeGVscyAmIDMpOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMV9lbmRdLCAgICAgM2YgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgICAgIDQoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgICAgIDgoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgICAgIDEyKCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbYXJnYl9kYXRhXSwgICAgICAgMTYgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA1XSwgICAgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA2XSwgICAgICAgICVbdGVtcDZdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA3XSwgICAgICAgICVbdGVtcDddICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAxXSwgICAgICAgICVbdGVtcDFdLCAgICAgICAgICAgJVt0ZW1wNV0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAyXSwgICAgICAgICVbdGVtcDJdLCAgICAgICAgICAgJVt0ZW1wNl0gXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAzXSwgICAgICAgICVbdGVtcDNdLCAgICAgICAgICAgJVt0ZW1wN10gXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAwXSwgICAgICAgIC0xNiglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAxXSwgICAgICAgIC0xMiglW2FyZ2JfZGF0YV0pICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAlW3RlbXAyXSwgICAgICAgIC04KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMV9lbmRdLCAgICAgMGIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAzXSwgICAgICAgIC00KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMl9lbmRdLCAgICAgMmYgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgICAgIDAoJVthcmdiX2RhdGFdKSAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbYXJnYl9kYXRhXSwgICAgICAgNCAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgOCwgICAgOCAgXG5cdCIKKyAgICAicmVwbHYucGggICAlW3RlbXA0XSwgICAgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAlW3RlbXAwXSwgICAgICAgICVbdGVtcDBdLCAgICAgICAgICAgJVt0ZW1wNF0gXG5cdCIKKyAgICAiYm5lICAgICAgICAlW2FyZ2JfZGF0YV0sICAgICVbcF9sb29wMl9lbmRdLCAgICAgMWIgICAgICAgXG5cdCIKKyAgICAiIHN3ICAgICAgICAlW3RlbXAwXSwgICAgICAgIC00KCVbYXJnYl9kYXRhXSkgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFthcmdiX2RhdGFdIismciIoYXJnYl9kYXRhKSwgW3RlbXAwXSI9JnIiKHRlbXAwKSwKKyAgICAgIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpLAorICAgICAgW3RlbXA3XSI9JnIiKHRlbXA3KQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ29sb3JUcmFuc2Zvcm1EZWx0YShpbnQ4X3QgY29sb3JfcHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCBjb2xvcikgeworICByZXR1cm4gKHVpbnQzMl90KSgoaW50KShjb2xvcl9wcmVkKSAqIGNvbG9yKSA+PiA1OworfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvcl9NSVBTZHNwUjIoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkYXRhLCBpbnQgbnVtX3BpeGVscykgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgdWludDMyX3QgYXJnYiwgYXJnYjEsIG5ld19yZWQsIG5ld19yZWQxOworICBjb25zdCB1aW50MzJfdCBHX3RvX1IgPSBtLT5ncmVlbl90b19yZWRfOworICBjb25zdCB1aW50MzJfdCBHX3RvX0IgPSBtLT5ncmVlbl90b19ibHVlXzsKKyAgY29uc3QgdWludDMyX3QgUl90b19CID0gbS0+cmVkX3RvX2JsdWVfOworICB1aW50MzJfdCogY29uc3QgcF9sb29wX2VuZCA9IGRhdGEgKyAobnVtX3BpeGVscyAmIH4xKTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAgJVtkYXRhXSwgICAgICAlW3BfbG9vcF9lbmRdLCAgMWYgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDBdLCAgICAgJVtHX3RvX1JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMV0sICAgICAlW0dfdG9fQl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAyXSwgICAgICVbUl90b19CXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAxXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAyXSwgICAgICVbdGVtcDJdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAxXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAyXSwgICAgICVbdGVtcDJdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAgJVthcmdiXSwgICAgICAwKCVbZGF0YV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgIDQoJVtkYXRhXSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibGh1ICAgICAgICAgICAgICVbbmV3X3JlZF0sICAgMiglW2RhdGFdKSAgICAgICAgICAgICAgICBcblx0IgorICAgICJsaHUgICAgICAgICAgICAgJVtuZXdfcmVkMV0sICA2KCVbZGF0YV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNycS5xYi5waCAgICAlW3RlbXAzXSwgICAgICVbYXJnYl0sICAgICAgICAlW2FyZ2IxXSAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgICVbdGVtcDRdLCAgICAgJVthcmdiXSwgICAgICAgICVbYXJnYjFdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmxhICAlW3RlbXA0XSwgICAgICVbdGVtcDRdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXAzXSwgICAgICAgJVt0ZW1wMF0gIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXAxXSAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgICVbdGVtcDJdICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAgJVtkYXRhXSwgICAgICAlW2RhdGFdLCAgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAlW25ld19yZWQxXSwgICVbbmV3X3JlZF0sICAgICAxNiwgICAxNiAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiXSwgICAgICAgIDE2LCAgIDE2ICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNV0sICAgICAlW3RlbXA1XSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAzXSwgICAgICVbdGVtcDNdLCAgICAgICA1ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgJVtuZXdfcmVkMV0sICAlW25ld19yZWQxXSwgICAgJVt0ZW1wNV0gIFxuXHQiCisgICAgInN1YnUucGggICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYjFdLCAgICAgICAlW3RlbXAzXSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDVdLCAgICAgJVtuZXdfcmVkMV0gICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1LnBoICAgICAgICAgJVthcmdiMV0sICAgICAlW2FyZ2IxXSwgICAgICAgJVt0ZW1wNF0gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXAzXSwgICAgICVbYXJnYjFdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2IgICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgLTIoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wM10sICAgICAtNCglW2RhdGFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDVdLCAgICAgICAxNiAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDE2ICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAtNiglW2RhdGFdKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgICAgICAlW2RhdGFdLCAgICAgICVbcF9sb29wX2VuZF0sICAwYiAgICAgICAgXG5cdCIKKyAgICAiIHNiICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgLTgoJVtkYXRhXSkgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW25ld19yZWQxXSI9JnIiKG5ld19yZWQxKSwgW25ld19yZWRdIj0mciIobmV3X3JlZCksCisgICAgICBbYXJnYl0iPSZyIihhcmdiKSwgW2FyZ2IxXSI9JnIiKGFyZ2IxKSwgW2RhdGFdIismciIoZGF0YSkKKyAgICA6IFtHX3RvX1JdInIiKEdfdG9fUiksIFtSX3RvX0JdInIiKFJfdG9fQiksCisgICAgICBbR190b19CXSJyIihHX3RvX0IpLCBbcF9sb29wX2VuZF0iciIocF9sb29wX2VuZCkKKyAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICk7CisKKyAgaWYgKG51bV9waXhlbHMgJiAxKSB7CisgICAgY29uc3QgdWludDMyX3QgYXJnYl8gPSBkYXRhWzBdOworICAgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYl8gPj4gODsKKyAgICBjb25zdCB1aW50MzJfdCByZWQgPSBhcmdiXyA+PiAxNjsKKyAgICB1aW50MzJfdCBuZXdfYmx1ZSA9IGFyZ2JfOworICAgIG5ld19yZWQgPSByZWQ7CisgICAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKG0tPmdyZWVuX3RvX3JlZF8sIGdyZWVuKTsKKyAgICBuZXdfcmVkICY9IDB4ZmY7CisgICAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShtLT5ncmVlbl90b19ibHVlXywgZ3JlZW4pOworICAgIG5ld19ibHVlIC09IENvbG9yVHJhbnNmb3JtRGVsdGEobS0+cmVkX3RvX2JsdWVfLCByZWQpOworICAgIG5ld19ibHVlICY9IDB4ZmY7CisgICAgZGF0YVswXSA9IChhcmdiXyAmIDB4ZmYwMGZmMDB1KSB8IChuZXdfcmVkIDw8IDE2KSB8IChuZXdfYmx1ZSk7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JCbHVlKHVpbnQ4X3QgZ3JlZW5fdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSBhcmdiID4+IDg7CisgIGNvbnN0IHVpbnQzMl90IHJlZCA9IGFyZ2IgPj4gMTY7CisgIHVpbnQ4X3QgbmV3X2JsdWUgPSBhcmdiOworICBuZXdfYmx1ZSAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX2JsdWUsIGdyZWVuKTsKKyAgbmV3X2JsdWUgLT0gQ29sb3JUcmFuc2Zvcm1EZWx0YShyZWRfdG9fYmx1ZSwgcmVkKTsKKyAgcmV0dXJuIChuZXdfYmx1ZSAmIDB4ZmYpOworfQorCitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IGludCBydGIgPSAocmVkX3RvX2JsdWUgPDwgMTYpIHwgKHJlZF90b19ibHVlICYgMHhmZmZmKTsKKyAgY29uc3QgaW50IGd0YiA9IChncmVlbl90b19ibHVlIDw8IDE2KSB8IChncmVlbl90b19ibHVlICYgMHhmZmZmKTsKKyAgY29uc3QgdWludDMyX3QgbWFzayA9IDB4ZmYwMGZmdTsKKyAgd2hpbGUgKHRpbGVfaGVpZ2h0LS0gPiAwKSB7CisgICAgaW50IHg7CisgICAgY29uc3QgdWludDMyX3QqIHBfYXJnYiA9IGFyZ2I7CisgICAgYXJnYiArPSBzdHJpZGU7CisgICAgZm9yICh4ID0gMDsgeCA8ICh0aWxlX3dpZHRoID4+IDEpOyArK3gpIHsKKyAgICAgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCB0ZW1wNjsKKyAgICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgICAibHcgICAgICAgICAgICVbdGVtcDBdLCAgMCglW3BfYXJnYl0pICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMV0sICA0KCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInByZWNyLnFiLnBoICAlW3RlbXAyXSwgICVbdGVtcDBdLCAgJVt0ZW1wMV0gICAgICBcblx0IgorICAgICAgICAiaW5zICAgICAgICAgICVbdGVtcDFdLCAgJVt0ZW1wMF0sICAxNiwgICAgMTYgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnBoICAgICAgICVbdGVtcDVdLCAgJVt0ZW1wMl0sICAlW3J0Yl0gICAgICAgIFxuXHQiCisgICAgICAgICJtdWwucGggICAgICAgJVt0ZW1wNl0sICAlW3RlbXAzXSwgICVbZ3RiXSAgICAgICAgXG5cdCIKKyAgICAgICAgImFuZCAgICAgICAgICAlW3RlbXA0XSwgICVbdGVtcDFdLCAgJVttYXNrXSAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgICAgICVbcF9hcmdiXSwgJVtwX2FyZ2JdLCA4ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzaHJhLnBoICAgICAgJVt0ZW1wNV0sICAlW3RlbXA1XSwgIDUgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXA2XSwgICVbdGVtcDZdLCAgNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidS5xYiAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNF0sICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMl0sICAlW3RlbXAyXSwgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICAgOiBbcF9hcmdiXSIrJnIiKHBfYXJnYiksIFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksCisgICAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwKKyAgICAgICAgICBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpCisgICAgICAgIDogW3J0Yl0iciIocnRiKSwgW2d0Yl0iciIoZ3RiKSwgW21hc2tdInIiKG1hc2spCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICk7CisgICAgICArK2hpc3RvWyh1aW50OF90KSh0ZW1wMiA+PiAxNildOworICAgICAgKytoaXN0b1sodWludDhfdCl0ZW1wMl07CisgICAgfQorICAgIGlmICh0aWxlX3dpZHRoICYgMSkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvckJsdWUoZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsICpwX2FyZ2IpXTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgVHJhbnNmb3JtQ29sb3JSZWQodWludDhfdCBncmVlbl90b19yZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhcmdiKSB7CisgIGNvbnN0IHVpbnQzMl90IGdyZWVuID0gYXJnYiA+PiA4OworICB1aW50MzJfdCBuZXdfcmVkID0gYXJnYiA+PiAxNjsKKyAgbmV3X3JlZCAtPSBDb2xvclRyYW5zZm9ybURlbHRhKGdyZWVuX3RvX3JlZCwgZ3JlZW4pOworICByZXR1cm4gKG5ld19yZWQgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgaW50IGd0ciA9IChncmVlbl90b19yZWQgPDwgMTYpIHwgKGdyZWVuX3RvX3JlZCAmIDB4ZmZmZik7CisgIHdoaWxlICh0aWxlX2hlaWdodC0tID4gMCkgeworICAgIGludCB4OworICAgIGNvbnN0IHVpbnQzMl90KiBwX2FyZ2IgPSBhcmdiOworICAgIGFyZ2IgKz0gc3RyaWRlOworICAgIGZvciAoeCA9IDA7IHggPCAodGlsZV93aWR0aCA+PiAxKTsgKyt4KSB7CisgICAgICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsdyAgICAgICAgICAgJVt0ZW1wMF0sICAwKCVbcF9hcmdiXSkgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICAgICAlW3RlbXAxXSwgIDQoJVtwX2FyZ2JdKSAgICAgICAgICAgICBcblx0IgorICAgICAgICAicHJlY3JxLnBoLncgICVbdGVtcDRdLCAgJVt0ZW1wMF0sICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJpbnMgICAgICAgICAgJVt0ZW1wMV0sICAlW3RlbXAwXSwgIDE2LCAgICAxNiAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAzXSwgICVbdGVtcDFdLCAgOCAgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsLnBoICAgICAgICVbdGVtcDJdLCAgJVt0ZW1wM10sICAlW2d0cl0gICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAgICAgJVtwX2FyZ2JdLCAlW3BfYXJnYl0sIDggICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNocmEucGggICAgICAlW3RlbXAyXSwgICVbdGVtcDJdLCAgNSAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3VidS5xYiAgICAgICVbdGVtcDJdLCAgJVt0ZW1wNF0sICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgIDogW3BfYXJnYl0iKyZyIihwX2FyZ2IpLCBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLAorICAgICAgICAgIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksIFt0ZW1wNF0iPSZyIih0ZW1wNCkKKyAgICAgICAgOiBbZ3RyXSJyIihndHIpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICAgICk7CisgICAgICArK2hpc3RvWyh1aW50OF90KSh0ZW1wMiA+PiAxNildOworICAgICAgKytoaXN0b1sodWludDhfdCl0ZW1wMl07CisgICAgfQorICAgIGlmICh0aWxlX3dpZHRoICYgMSkgeworICAgICAgKytoaXN0b1tUcmFuc2Zvcm1Db2xvclJlZChncmVlbl90b19yZWQsICpwX2FyZ2IpXTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX01JUFNkc3BSMjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9yID0gVHJhbnNmb3JtQ29sb3JfTUlQU2RzcFIyOworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19NSVBTZHNwUjI7CisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19NSVBTZHNwUjI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQU19EU1BfUjIKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0TUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGRkZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19tc2EuYwpAQCAtMCwwICsxLDE0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2YXJpYW50IG9mIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFByYXNoYW50IFBhdGlsIChQcmFzaGFudC5QYXRpbEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbXNhX21hY3JvLmgiCisKKyNkZWZpbmUgVFJBTlNGT1JNX0NPTE9SXzgoc3JjMCwgc3JjMSwgZHN0MCwgZHN0MSwgYzAsIGMxLCBtYXNrMCwgbWFzazEpIGRvIHsgIFwKKyAgdjhpMTYgZzAsIGcxLCB0MCwgdDEsIHQyLCB0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjRpMzIgdDQsIHQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9TSChzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIGcwLCBnMSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9TQjJfU0goZzAsIGcxLCBjMCwgYzAsIHQwLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSCh0MCwgdDEsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9zdWJ2X2goKHY4aTE2KXNyYzAsIHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBfX21zYV9zdWJ2X2goKHY4aTE2KXNyYzEsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDQgPSBfX21zYV9zcmxpX3coKHY0aTMyKXNyYzAsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDUgPSBfX21zYV9zcmxpX3coKHY0aTMyKXNyYzEsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9TQjJfU0godDQsIHQ1LCBjMSwgYzEsIHQyLCB0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9IMl9TSCh0MiwgdDMsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1VCMih0MCwgdDIsIHQxLCB0MywgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQihzcmMwLCB0MCwgc3JjMSwgdDEsIG1hc2sxLCBtYXNrMSwgZHN0MCwgZHN0MSk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgVFJBTlNGT1JNX0NPTE9SXzQoc3JjLCBkc3QsIGMwLCBjMSwgbWFzazAsIG1hc2sxKSBkbyB7ICBcCisgIGNvbnN0IHYxNmk4IGcwID0gVlNIRl9TQihzcmMsIHNyYywgbWFzazApOyAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0MCA9IF9fbXNhX2RvdHBfc19oKGMwLCBnMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjhpMTYgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MCA9IFNSQUlfSCh0MCwgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9zdWJ2X2goKHY4aTE2KXNyYywgdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gX19tc2Ffc3JsaV93KCh2NGkzMilzcmMsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX2RvdHBfc19oKGMxLCAodjE2aTgpdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDEgPSBTUkFJX0godDEsIDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gdDAgLSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSBWU0hGX1VCKHNyYywgdDAsIG1hc2sxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9yX01TQShjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sIHVpbnQzMl90KiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzKSB7CisgIHYxNnU4IHNyYzAsIGRzdDA7CisgIGNvbnN0IHYxNmk4IGcyYnIgPSAodjE2aTgpX19tc2FfZmlsbF93KG0tPmdyZWVuX3RvX2JsdWVfIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0tPmdyZWVuX3RvX3JlZF8gPDwgMTYpKTsKKyAgY29uc3QgdjE2aTggcjJiID0gKHYxNmk4KV9fbXNhX2ZpbGxfdyhtLT5yZWRfdG9fYmx1ZV8pOworICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEzLCAyNTUsIDEzLCAyNTUgfTsKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDE2LCAxLCAxOCwgMywgMjAsIDUsIDIyLCA3LCAyNCwgOSwgMjYsIDExLAorICAgICAgICAgICAgICAgICAgICAgICAgMjgsIDEzLCAzMCwgMTUgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgdjE2dTggc3JjMSwgZHN0MTsKKyAgICBMRF9VQjIoZGF0YSwgNCwgc3JjMCwgc3JjMSk7CisgICAgVFJBTlNGT1JNX0NPTE9SXzgoc3JjMCwgc3JjMSwgZHN0MCwgZHN0MSwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBkYXRhLCA0KTsKKyAgICBkYXRhICs9IDg7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihkYXRhKTsKKyAgICAgIFRSQU5TRk9STV9DT0xPUl80KHNyYzAsIGRzdDAsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICAgIFNUX1VCKGRzdDAsIGRhdGEpOworICAgICAgZGF0YSArPSA0OworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICAgIHNyYzAgPSBMRF9VQihkYXRhKTsKKyAgICAgIFRSQU5TRk9STV9DT0xPUl80KHNyYzAsIGRzdDAsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICAgIGlmIChudW1fcGl4ZWxzID09IDMpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MCwgMCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDAsIDIpOworICAgICAgICBTRChwaXhfZCwgZGF0YSArIDApOworICAgICAgICBTVyhwaXhfdywgZGF0YSArIDIpOworICAgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID09IDIpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MCwgMCk7CisgICAgICAgIFNEKHBpeF9kLCBkYXRhKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDAsIDApOworICAgICAgICBTVyhwaXhfdywgZGF0YSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9NU0EodWludDMyX3QqIGFyZ2JfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIHVpbnQ4X3QqIHB0ZW1wX2RhdGEgPSAodWludDhfdCopYXJnYl9kYXRhOworICB2MTZ1OCBzcmMwLCBkc3QwLCB0bXAwOworICBjb25zdCB2MTZ1OCBtYXNrID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAxMywgMjU1LCAxMywgMjU1IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIHYxNnU4IHNyYzEsIGRzdDEsIHRtcDE7CisgICAgTERfVUIyKHB0ZW1wX2RhdGEsIDE2LCBzcmMwLCBzcmMxKTsKKyAgICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzAsIG1hc2ssIG1hc2ssIHRtcDAsIHRtcDEpOworICAgIFNVQjIoc3JjMCwgdG1wMCwgc3JjMSwgdG1wMSwgZHN0MCwgZHN0MSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIHB0ZW1wX2RhdGEsIDE2KTsKKyAgICBwdGVtcF9kYXRhICs9IDggKiA0OworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBzcmMwID0gTERfVUIocHRlbXBfZGF0YSk7CisgICAgICB0bXAwID0gVlNIRl9VQihzcmMwLCBzcmMwLCBtYXNrKTsKKyAgICAgIGRzdDAgPSBzcmMwIC0gdG1wMDsKKyAgICAgIFNUX1VCKGRzdDAsIHB0ZW1wX2RhdGEpOworICAgICAgcHRlbXBfZGF0YSArPSA0ICogNDsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeworICAgICAgY29uc3QgdWludDhfdCBiID0gcHRlbXBfZGF0YVswXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgZyA9IHB0ZW1wX2RhdGFbMV07CisgICAgICBjb25zdCB1aW50OF90IHIgPSBwdGVtcF9kYXRhWzJdOworICAgICAgcHRlbXBfZGF0YVswXSA9IChiIC0gZykgJiAweGZmOworICAgICAgcHRlbXBfZGF0YVsyXSA9IChyIC0gZykgJiAweGZmOworICAgICAgcHRlbXBfZGF0YSArPSA0OworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRNU0Eodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRW5jRHNwSW5pdE1TQSh2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTVNBOworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBUcmFuc2Zvcm1Db2xvcl9NU0E7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTVNBCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdE1TQSkKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdiNzNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfbmVvbi5jCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTkVPTiB2YXJpYW50IG9mIG1ldGhvZHMgZm9yIGxvc3NsZXNzIGVuY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworLy8gdnRibD9fdTggYXJlIG1hcmtlZCB1bmF2YWlsYWJsZSBmb3IgaU9TIGFybTY0IHdpdGggWGNvZGUgPCA2LjMsIHVzZQorLy8gbm9uLXN0YW5kYXJkIHZlcnNpb25zIHRoZXJlLgorI2lmIGRlZmluZWQoX19BUFBMRV9fKSAmJiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAmJiBcCisgICAgZGVmaW5lZChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXykgJiYgKF9fYXBwbGVfYnVpbGRfdmVyc2lvbl9fPCA2MDIwMDM3KQorI2RlZmluZSBVU0VfVlRCTFEKKyNlbmRpZgorCisjaWZkZWYgVVNFX1ZUQkxRCisvLyAyNTUgPSBieXRlIHdpbGwgYmUgemVyb2VkCitzdGF0aWMgY29uc3QgdWludDhfdCBrR3JlZW5TaHVmZmxlWzE2XSA9IHsKKyAgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwgMTMsIDI1NSwgMTMsIDI1NQorfTsKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4eDE2X3QgRG9HcmVlblNodWZmbGVfTkVPTihjb25zdCB1aW50OHgxNl90IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSkgeworICByZXR1cm4gdmNvbWJpbmVfdTgodnRibDFxX3U4KGFyZ2IsIHZnZXRfbG93X3U4KHNodWZmbGUpKSwKKyAgICAgICAgICAgICAgICAgICAgIHZ0YmwxcV91OChhcmdiLCB2Z2V0X2hpZ2hfdTgoc2h1ZmZsZSkpKTsKK30KKyNlbHNlICAvLyAhVVNFX1ZUQkxRCisvLyAyNTUgPSBieXRlIHdpbGwgYmUgemVyb2VkCitzdGF0aWMgY29uc3QgdWludDhfdCBrR3JlZW5TaHVmZmxlWzhdID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUgIH07CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHgxNl90IERvR3JlZW5TaHVmZmxlX05FT04oY29uc3QgdWludDh4MTZfdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSkgeworICByZXR1cm4gdmNvbWJpbmVfdTgodnRibDFfdTgodmdldF9sb3dfdTgoYXJnYiksIHNodWZmbGUpLAorICAgICAgICAgICAgICAgICAgICAgdnRibDFfdTgodmdldF9oaWdoX3U4KGFyZ2IpLCBzaHVmZmxlKSk7Cit9CisjZW5kaWYgIC8vIFVTRV9WVEJMUQorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfTkVPTih1aW50MzJfdCogYXJnYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IGFyZ2JfZGF0YSArIChudW1fcGl4ZWxzICYgfjMpOworI2lmZGVmIFVTRV9WVEJMUQorICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUgPSB2bGQxcV91OChrR3JlZW5TaHVmZmxlKTsKKyNlbHNlCisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlID0gdmxkMV91OChrR3JlZW5TaHVmZmxlKTsKKyNlbmRpZgorICBmb3IgKDsgYXJnYl9kYXRhIDwgZW5kOyBhcmdiX2RhdGEgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiA9IHZsZDFxX3U4KCh1aW50OF90KilhcmdiX2RhdGEpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZ3JlZW5zID0gRG9HcmVlblNodWZmbGVfTkVPTihhcmdiLCBzaHVmZmxlKTsKKyAgICB2c3QxcV91OCgodWludDhfdCopYXJnYl9kYXRhLCB2c3VicV91OChhcmdiLCBncmVlbnMpKTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKGFyZ2JfZGF0YSwgbnVtX3BpeGVscyAmIDMpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIFRyYW5zZm9ybUNvbG9yX05FT04oY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogYXJnYl9kYXRhLCBpbnQgbnVtX3BpeGVscykgeworICAvLyBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNi4KKyNkZWZpbmUgQ1NUKFgpICAoKChpbnQxNl90KShtLT5YIDw8IDgpKSA+PiA2KQorICBjb25zdCBpbnQxNl90IHJiWzhdID0geworICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKQorICB9OworICBjb25zdCBpbnQxNng4X3QgbXVsdHNfcmIgPSB2bGQxcV9zMTYocmIpOworICBjb25zdCBpbnQxNl90IGIyWzhdID0geworICAgIDAsIENTVChyZWRfdG9fYmx1ZV8pLCAwLCBDU1QocmVkX3RvX2JsdWVfKSwKKyAgICAwLCBDU1QocmVkX3RvX2JsdWVfKSwgMCwgQ1NUKHJlZF90b19ibHVlXyksCisgIH07CisgIGNvbnN0IGludDE2eDhfdCBtdWx0c19iMiA9IHZsZDFxX3MxNihiMik7CisjdW5kZWYgQ1NUCisjaWZkZWYgVVNFX1ZUQkxRCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGtnMGcwWzE2XSA9IHsKKyAgICAyNTUsIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsIDEzLCAyNTUsIDEzCisgIH07CisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSA9IHZsZDFxX3U4KGtnMGcwKTsKKyNlbHNlCisgIHN0YXRpYyBjb25zdCB1aW50OF90IGswZzBnWzhdID0geyAyNTUsIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUgfTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUgPSB2bGQxX3U4KGswZzBnKTsKKyNlbmRpZgorICBjb25zdCB1aW50MzJ4NF90IG1hc2tfcmIgPSB2ZHVwcV9uX3UzMigweDAwZmYwMGZmdSk7ICAvLyByZWQtYmx1ZSBtYXNrcworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBpbiA9IHZsZDFxX3U4KCh1aW50OF90KikoYXJnYl9kYXRhICsgaSkpOworICAgIC8vIDAgZyAwIGcKKyAgICBjb25zdCB1aW50OHgxNl90IGdyZWVucyA9IERvR3JlZW5TaHVmZmxlX05FT04oaW4sIHNodWZmbGUpOworICAgIC8vIHggZHIgIHggZGIxCisgICAgY29uc3QgaW50MTZ4OF90IEEgPSB2cWRtdWxocV9zMTYodnJlaW50ZXJwcmV0cV9zMTZfdTgoZ3JlZW5zKSwgbXVsdHNfcmIpOworICAgIC8vIHIgMCAgIGIgICAwCisgICAgY29uc3QgaW50MTZ4OF90IEIgPSB2c2hscV9uX3MxNih2cmVpbnRlcnByZXRxX3MxNl91OChpbiksIDgpOworICAgIC8vIHggZGIyIDAgICAwCisgICAgY29uc3QgaW50MTZ4OF90IEMgPSB2cWRtdWxocV9zMTYoQiwgbXVsdHNfYjIpOworICAgIC8vIDAgMCAgIHggZGIyCisgICAgY29uc3QgdWludDMyeDRfdCBEID0gdnNocnFfbl91MzIodnJlaW50ZXJwcmV0cV91MzJfczE2KEMpLCAxNik7CisgICAgLy8geCBkciAgeCAgZGIKKyAgICBjb25zdCBpbnQ4eDE2X3QgRSA9IHZhZGRxX3M4KHZyZWludGVycHJldHFfczhfdTMyKEQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zOF9zMTYoQSkpOworICAgIC8vIDAgZHIgIDAgIGRiCisgICAgY29uc3QgdWludDMyeDRfdCBGID0gdmFuZHFfdTMyKHZyZWludGVycHJldHFfdTMyX3M4KEUpLCBtYXNrX3JiKTsKKyAgICBjb25zdCBpbnQ4eDE2X3Qgb3V0ID0gdnN1YnFfczgodnJlaW50ZXJwcmV0cV9zOF91OChpbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczhfdTMyKEYpKTsKKyAgICB2c3QxcV9zOCgoaW50OF90KikoYXJnYl9kYXRhICsgaSksIG91dCk7CisgIH0KKyAgLy8gZmFsbHRocm91Z2ggYW5kIGZpbmlzaCBvZmYgd2l0aCBwbGFpbi1DCisgIFZQOExUcmFuc2Zvcm1Db2xvcl9DKG0sIGFyZ2JfZGF0YSArIGksIG51bV9waXhlbHMgLSBpKTsKK30KKworI3VuZGVmIFVTRV9WVEJMUQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TEVuY0RzcEluaXRORU9OKHZvaWQpIHsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZCA9IFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9ORU9OOworICBWUDhMVHJhbnNmb3JtQ29sb3IgPSBUcmFuc2Zvcm1Db2xvcl9ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExFbmNEc3BJbml0TkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX2VuY19zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0YTk5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTIuYwpAQCAtMCwwICsxLDcwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvY29tbW9uX3NzZTIuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorCisvLyBGb3Igc2lnbi1leHRlbmRlZCBtdWx0aXBseWluZyBjb25zdGFudHMsIHByZS1zaGlmdGVkIGJ5IDU6CisjZGVmaW5lIENTVF81YihYKSAgKCgoaW50MTZfdCkoKHVpbnQxNl90KShYKSA8PCA4KSkgPj4gNSkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFN1YnRyYWN0LUdyZWVuIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfU1NFMih1aW50MzJfdCogYXJnYl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZhcmdiX2RhdGFbaV0pOyAvLyBhcmdiCisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX3NybGlfZXBpMTYoaW4sIDgpOyAgICAgLy8gMCBhIDAgZworICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gMGcwZworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3N1Yl9lcGk4KGluLCBDKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKGFyZ2JfZGF0YSArIGksIG51bV9waXhlbHMgLSBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgVHJhbnNmb3JtCisKKyNkZWZpbmUgTUtfQ1NUXzE2KEhJLCBMTykgXAorICBfbW1fc2V0MV9lcGkzMigoaW50KSgoKHVpbnQzMl90KShISSkgPDwgMTYpIHwgKChMTykgJiAweGZmZmYpKSkKKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JfU1NFMihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiX2RhdGEsIGludCBudW1fcGl4ZWxzKSB7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfcmIgPSBNS19DU1RfMTYoQ1NUXzViKG0tPmdyZWVuX3RvX3JlZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTVF81YihtLT5ncmVlbl90b19ibHVlXykpOworICBjb25zdCBfX20xMjhpIG11bHRzX2IyID0gTUtfQ1NUXzE2KENTVF81YihtLT5yZWRfdG9fYmx1ZV8pLCAwKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2FnID0gX21tX3NldDFfZXBpMzIoMHhmZjAwZmYwMCk7ICAvLyBhbHBoYS1ncmVlbiBtYXNrcworICBjb25zdCBfX20xMjhpIG1hc2tfcmIgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMGZmKTsgIC8vIHJlZC1ibHVlIG1hc2tzCisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldKTsgLy8gYXJnYgorICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9hbmRfc2kxMjgoaW4sIG1hc2tfYWcpOyAgICAgLy8gYSAgIDAgICBnICAgMAorICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gZzBnMAorICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tdWxoaV9lcGkxNihDLCBtdWx0c19yYik7ICAgIC8vIHggZHIgIHggZGIxCisgICAgY29uc3QgX19tMTI4aSBFID0gX21tX3NsbGlfZXBpMTYoaW4sIDgpOyAgICAgICAgICAgLy8gciAwICAgYiAgIDAKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fbXVsaGlfZXBpMTYoRSwgbXVsdHNfYjIpOyAgICAvLyB4IGRiMiAwICAgMAorICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9zcmxpX2VwaTMyKEYsIDE2KTsgICAgICAgICAgIC8vIDAgMCAgIHggZGIyCisgICAgY29uc3QgX19tMTI4aSBIID0gX21tX2FkZF9lcGk4KEcsIEQpOyAgICAgICAgICAgICAgLy8geCBkciAgeCAgZGIKKyAgICBjb25zdCBfX20xMjhpIEkgPSBfbW1fYW5kX3NpMTI4KEgsIG1hc2tfcmIpOyAgICAgICAvLyAwIGRyICAwICBkYgorICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3N1Yl9lcGk4KGluLCBJKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFRyYW5zZm9ybUNvbG9yX0MobSwgYXJnYl9kYXRhICsgaSwgbnVtX3BpeGVscyAtIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIFNQQU4gOAorc3RhdGljIHZvaWQgQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfU1NFMihjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVuX3RvX2JsdWUsIGludCByZWRfdG9fYmx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19yID0gTUtfQ1NUXzE2KENTVF81YihyZWRfdG9fYmx1ZSksIDApOworICBjb25zdCBfX20xMjhpIG11bHRzX2cgPSBNS19DU1RfMTYoMCwgQ1NUXzViKGdyZWVuX3RvX2JsdWUpKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2cgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMCk7ICAvLyBncmVlbiBtYXNrCisgIGNvbnN0IF9fbTEyOGkgbWFza19iID0gX21tX3NldDFfZXBpMzIoMHgwMDAwZmYpOyAgLy8gYmx1ZSBtYXNrCisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgdGlsZV9oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBhcmdiICsgeSAqIHN0cmlkZTsKKyAgICBpbnQgaSwgeDsKKyAgICBmb3IgKHggPSAwOyB4ICsgU1BBTiA8PSB0aWxlX3dpZHRoOyB4ICs9IFNQQU4pIHsKKyAgICAgIHVpbnQxNl90IHZhbHVlc1tTUEFOXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyAgICAgICAgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIFNQQU4gLyAyXSk7CisgICAgICBjb25zdCBfX20xMjhpIEEwID0gX21tX3NsbGlfZXBpMTYoaW4wLCA4KTsgICAgICAgIC8vIHIgMCAgfCBiIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fc2xsaV9lcGkxNihpbjEsIDgpOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBtYXNrX2cpOyAgICAvLyAwIDAgIHwgZyAwCisgICAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX2FuZF9zaTEyOChpbjEsIG1hc2tfZyk7CisgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX211bGhpX2VwaTE2KEEwLCBtdWx0c19yKTsgIC8vIHggZGIgfCAwIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fbXVsaGlfZXBpMTYoQTEsIG11bHRzX3IpOworICAgICAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9tdWxoaV9lcGkxNihCMCwgbXVsdHNfZyk7ICAvLyAwIDAgIHwgeCBkYgorICAgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9tdWxoaV9lcGkxNihCMSwgbXVsdHNfZyk7CisgICAgICBjb25zdCBfX20xMjhpIEUwID0gX21tX3N1Yl9lcGk4KGluMCwgRDApOyAgICAgICAgIC8vIHggeCAgfCB4IGInCisgICAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX3N1Yl9lcGk4KGluMSwgRDEpOworICAgICAgY29uc3QgX19tMTI4aSBGMCA9IF9tbV9zcmxpX2VwaTMyKEMwLCAxNik7ICAgICAgICAvLyAwIDAgIHwgeCBkYgorICAgICAgY29uc3QgX19tMTI4aSBGMSA9IF9tbV9zcmxpX2VwaTMyKEMxLCAxNik7CisgICAgICBjb25zdCBfX20xMjhpIEcwID0gX21tX3N1Yl9lcGk4KEUwLCBGMCk7ICAgICAgICAgIC8vIDAgMCAgfCB4IGInCisgICAgICBjb25zdCBfX20xMjhpIEcxID0gX21tX3N1Yl9lcGk4KEUxLCBGMSk7CisgICAgICBjb25zdCBfX20xMjhpIEgwID0gX21tX2FuZF9zaTEyOChHMCwgbWFza19iKTsgICAgIC8vIDAgMCAgfCAwIGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgSDEgPSBfbW1fYW5kX3NpMTI4KEcxLCBtYXNrX2IpOworICAgICAgY29uc3QgX19tMTI4aSBJID0gX21tX3BhY2tzX2VwaTMyKEgwLCBIMSk7ICAgICAgICAvLyAwIGInIHwgMCBiJworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdmFsdWVzLCBJKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTUEFOOyArK2kpICsraGlzdG9bdmFsdWVzW2ldXTsKKyAgICB9CisgIH0KKyAgeworICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSB0aWxlX3dpZHRoICYgKFNQQU4gLSAxKTsKKyAgICBpZiAobGVmdF9vdmVyID4gMCkgeworICAgICAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zX0MoYXJnYiArIHRpbGVfd2lkdGggLSBsZWZ0X292ZXIsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfb3ZlciwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl90b19ibHVlLCByZWRfdG9fYmx1ZSwgaGlzdG8pOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX1NTRTIoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfd2lkdGgsIGludCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fcmVkLCBpbnQgaGlzdG9bXSkgeworICBjb25zdCBfX20xMjhpIG11bHRzX2cgPSBNS19DU1RfMTYoMCwgQ1NUXzViKGdyZWVuX3RvX3JlZCkpOworICBjb25zdCBfX20xMjhpIG1hc2tfZyA9IF9tbV9zZXQxX2VwaTMyKDB4MDBmZjAwKTsgIC8vIGdyZWVuIG1hc2sKKyAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX3NldDFfZXBpMzIoMHhmZik7CisKKyAgaW50IHk7CisgIGZvciAoeSA9IDA7IHkgPCB0aWxlX2hlaWdodDsgKyt5KSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYyA9IGFyZ2IgKyB5ICogc3RyaWRlOworICAgIGludCBpLCB4OworICAgIGZvciAoeCA9IDA7IHggKyBTUEFOIDw9IHRpbGVfd2lkdGg7IHggKz0gU1BBTikgeworICAgICAgdWludDE2X3QgdmFsdWVzW1NQQU5dOworICAgICAgY29uc3QgX19tMTI4aSBpbjAgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArICAgICAgICAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgU1BBTiAvIDJdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fYW5kX3NpMTI4KGluMCwgbWFza19nKTsgICAgLy8gMCAwICB8IGcgMAorICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9hbmRfc2kxMjgoaW4xLCBtYXNrX2cpOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9zcmxpX2VwaTMyKGluMCwgMTYpOyAgICAgICAvLyAwIDAgIHwgeCByCisgICAgICBjb25zdCBfX20xMjhpIEIxID0gX21tX3NybGlfZXBpMzIoaW4xLCAxNik7CisgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX211bGhpX2VwaTE2KEEwLCBtdWx0c19nKTsgIC8vIDAgMCAgfCB4IGRyCisgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX211bGhpX2VwaTE2KEExLCBtdWx0c19nKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fc3ViX2VwaTgoQjAsIEMwKTsgICAgICAgICAgLy8geCB4ICB8IHggcicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRTEgPSBfbW1fc3ViX2VwaTgoQjEsIEMxKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjAgPSBfbW1fYW5kX3NpMTI4KEUwLCBtYXNrKTsgICAgICAgLy8gMCAwICB8IDAgcicKKyAgICAgIGNvbnN0IF9fbTEyOGkgRjEgPSBfbW1fYW5kX3NpMTI4KEUxLCBtYXNrKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgSSA9IF9tbV9wYWNrc19lcGkzMihGMCwgRjEpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdmFsdWVzLCBJKTsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBTUEFOOyArK2kpICsraGlzdG9bdmFsdWVzW2ldXTsKKyAgICB9CisgIH0KKyAgeworICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSB0aWxlX3dpZHRoICYgKFNQQU4gLSAxKTsKKyAgICBpZiAobGVmdF9vdmVyID4gMCkgeworICAgICAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfQyhhcmdiICsgdGlsZV93aWR0aCAtIGxlZnRfb3Zlciwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0X292ZXIsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVlbl90b19yZWQsIGhpc3RvKTsKKyAgICB9CisgIH0KK30KKyN1bmRlZiBTUEFOCisjdW5kZWYgTUtfQ1NUXzE2CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTElORV9TSVpFIDE2ICAgIC8vIDggb3IgMTYKK3N0YXRpYyB2b2lkIEFkZFZlY3Rvcl9TU0UyKGNvbnN0IHVpbnQzMl90KiBhLCBjb25zdCB1aW50MzJfdCogYiwgdWludDMyX3QqIG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKSB7CisgIGludCBpOworICBhc3NlcnQoc2l6ZSAlIExJTkVfU0laRSA9PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gTElORV9TSVpFKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICA0XSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDhdKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgMTJdKTsKKyNlbmRpZgorICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAgMF0pOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZiW2kgKyAgNF0pOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgY29uc3QgX19tMTI4aSBiMiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbaSArICA4XSk7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmJbaSArIDEyXSk7CisjZW5kaWYKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgMF0sIF9tbV9hZGRfZXBpMzIoYTAsIGIwKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDRdLCBfbW1fYWRkX2VwaTMyKGExLCBiMSkpOworI2lmIChMSU5FX1NJWkUgPT0gMTYpCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgIDhdLCBfbW1fYWRkX2VwaTMyKGEyLCBiMikpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArIDEyXSwgX21tX2FkZF9lcGkzMihhMywgYjMpKTsKKyNlbmRpZgorICB9Cit9CisKK3N0YXRpYyB2b2lkIEFkZFZlY3RvckVxX1NTRTIoY29uc3QgdWludDMyX3QqIGEsIHVpbnQzMl90KiBvdXQsIGludCBzaXplKSB7CisgIGludCBpOworICBhc3NlcnQoc2l6ZSAlIExJTkVfU0laRSA9PSAwKTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkgKz0gTElORV9TSVpFKSB7CisgICAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFbaSArICA0XSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBjb25zdCBfX20xMjhpIGEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgIDhdKTsKKyAgICBjb25zdCBfX20xMjhpIGEzID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYVtpICsgMTJdKTsKKyNlbmRpZgorICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZvdXRbaSArICAwXSk7CisgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgIDRdKTsKKyNpZiAoTElORV9TSVpFID09IDE2KQorICAgIGNvbnN0IF9fbTEyOGkgYjIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZvdXRbaSArICA4XSk7CisgICAgY29uc3QgX19tMTI4aSBiMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJm91dFtpICsgMTJdKTsKKyNlbmRpZgorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaSArICAwXSwgX21tX2FkZF9lcGkzMihhMCwgYjApKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgNF0sIF9tbV9hZGRfZXBpMzIoYTEsIGIxKSk7CisjaWYgKExJTkVfU0laRSA9PSAxNikKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2kgKyAgOF0sIF9tbV9hZGRfZXBpMzIoYTIsIGIyKSk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpICsgMTJdLCBfbW1fYWRkX2VwaTMyKGEzLCBiMykpOworI2VuZGlmCisgIH0KK30KKyN1bmRlZiBMSU5FX1NJWkUKKworLy8gTm90ZSB3ZSBhcmUgYWRkaW5nIHVpbnQzMl90J3MgYXMgKnNpZ25lZCogaW50MzIncyAodXNpbmcgX21tX2FkZF9lcGkzMikuIEJ1dAorLy8gdGhhdCdzIG9rIHNpbmNlIHRoZSBoaXN0b2dyYW0gdmFsdWVzIGFyZSBsZXNzIHRoYW4gMTw8MjggKG1heCBwaWN0dXJlIHNpemUpLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQWRkX1NTRTIoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBsaXRlcmFsX3NpemUgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoYS0+cGFsZXR0ZV9jb2RlX2JpdHNfKTsKKyAgYXNzZXJ0KGEtPnBhbGV0dGVfY29kZV9iaXRzXyA9PSBiLT5wYWxldHRlX2NvZGVfYml0c18pOworICBpZiAoYiAhPSBvdXQpIHsKKyAgICBBZGRWZWN0b3JfU1NFMihhLT5saXRlcmFsXywgYi0+bGl0ZXJhbF8sIG91dC0+bGl0ZXJhbF8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JfU1NFMihhLT5yZWRfLCBiLT5yZWRfLCBvdXQtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JfU1NFMihhLT5ibHVlXywgYi0+Ymx1ZV8sIG91dC0+Ymx1ZV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JfU1NFMihhLT5hbHBoYV8sIGItPmFscGhhXywgb3V0LT5hbHBoYV8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgfSBlbHNlIHsKKyAgICBBZGRWZWN0b3JFcV9TU0UyKGEtPmxpdGVyYWxfLCBvdXQtPmxpdGVyYWxfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yRXFfU1NFMihhLT5yZWRfLCBvdXQtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTKTsKKyAgICBBZGRWZWN0b3JFcV9TU0UyKGEtPmJsdWVfLCBvdXQtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgICAgQWRkVmVjdG9yRXFfU1NFMihhLT5hbHBoYV8sIG91dC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUyk7CisgIH0KKyAgZm9yIChpID0gTlVNX0xJVEVSQUxfQ09ERVM7IGkgPCBsaXRlcmFsX3NpemU7ICsraSkgeworICAgIG91dC0+bGl0ZXJhbF9baV0gPSBhLT5saXRlcmFsX1tpXSArIGItPmxpdGVyYWxfW2ldOworICB9CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fRElTVEFOQ0VfQ09ERVM7ICsraSkgeworICAgIG91dC0+ZGlzdGFuY2VfW2ldID0gYS0+ZGlzdGFuY2VfW2ldICsgYi0+ZGlzdGFuY2VfW2ldOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyb3B5CisKKy8vIENoZWNrcyB3aGV0aGVyIHRoZSBYIG9yIFkgY29udHJpYnV0aW9uIGlzIHdvcnRoIGNvbXB1dGluZyBhbmQgYWRkaW5nLgorLy8gVXNlZCBpbiBsb29wIHVucm9sbGluZy4KKyNkZWZpbmUgQU5BTFlaRV9YX09SX1koeF9vcl95LCBqKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICgoeF9vcl95KVtpICsgKGopXSAhPSAwKSByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMigoeF9vcl95KVtpICsgKGopXSk7IFwKKyAgfSB3aGlsZSAoMCkKKworLy8gQ2hlY2tzIHdoZXRoZXIgdGhlIFggKyBZIGNvbnRyaWJ1dGlvbiBpcyB3b3J0aCBjb21wdXRpbmcgYW5kIGFkZGluZy4KKy8vIFVzZWQgaW4gbG9vcCB1bnJvbGxpbmcuCisjZGVmaW5lIEFOQUxZWkVfWFkoaikgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHRtcFtqXSAhPSAwKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICByZXR2YWwgLT0gVlA4TEZhc3RTTG9nMih0bXBbal0pOyBcCisgICAgICBBTkFMWVpFX1hfT1JfWShYLCBqKTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCisKK3N0YXRpYyBmbG9hdCBDb21iaW5lZFNoYW5ub25FbnRyb3B5X1NTRTIoY29uc3QgaW50IFhbMjU2XSwgY29uc3QgaW50IFlbMjU2XSkgeworICBpbnQgaTsKKyAgZG91YmxlIHJldHZhbCA9IDAuOworICBpbnQgc3VtWCwgc3VtWFk7CisgIGludDMyX3QgdG1wWzRdOworICBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAvLyBTdW1zIHVwIFggKyBZLCA0IGludHMgYXQgYSB0aW1lIChhbmQgd2lsbCBtZXJnZSBpdCBhdCB0aGUgZW5kIGZvciBzdW1YWSkuCisgIF9fbTEyOGkgc3VtWFlfMTI4ID0gemVybzsKKyAgX19tMTI4aSBzdW1YXzEyOCA9IHplcm87CisKKyAgZm9yIChpID0gMDsgaSA8IDI1NjsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSB4ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoWCArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIHkgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShZICsgaSkpOworCisgICAgLy8gQ2hlY2sgaWYgYW55IFggaXMgbm9uLXplcm86IHRoaXMgYWN0dWFsbHkgcHJvdmlkZXMgYSBzcGVlZHVwIGFzIFggaXMKKyAgICAvLyB1c3VhbGx5IHNwYXJzZS4KKyAgICBpZiAoX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTMyKHgsIHplcm8pKSAhPSAweEZGRkYpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgeHlfMTI4ID0gX21tX2FkZF9lcGkzMih4LCB5KTsKKyAgICAgIHN1bVhZXzEyOCA9IF9tbV9hZGRfZXBpMzIoc3VtWFlfMTI4LCB4eV8xMjgpOworCisgICAgICBzdW1YXzEyOCA9IF9tbV9hZGRfZXBpMzIoc3VtWF8xMjgsIHgpOworCisgICAgICAvLyBBbmFseXplIHRoZSBkaWZmZXJlbnQgWCArIFkuCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHh5XzEyOCk7CisKKyAgICAgIEFOQUxZWkVfWFkoMCk7CisgICAgICBBTkFMWVpFX1hZKDEpOworICAgICAgQU5BTFlaRV9YWSgyKTsKKyAgICAgIEFOQUxZWkVfWFkoMyk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFggaXMgZnVsbHkgMCwgc28gb25seSBkZWFsIHdpdGggWS4KKyAgICAgIHN1bVhZXzEyOCA9IF9tbV9hZGRfZXBpMzIoc3VtWFlfMTI4LCB5KTsKKworICAgICAgQU5BTFlaRV9YX09SX1koWSwgMCk7CisgICAgICBBTkFMWVpFX1hfT1JfWShZLCAxKTsKKyAgICAgIEFOQUxZWkVfWF9PUl9ZKFksIDIpOworICAgICAgQU5BTFlaRV9YX09SX1koWSwgMyk7CisgICAgfQorICB9CisKKyAgLy8gU3VtIHVwIHN1bVhfMTI4IHRvIGdldCBzdW1YLgorICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bVhfMTI4KTsKKyAgc3VtWCA9IHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXTsKKworICAvLyBTdW0gdXAgc3VtWFlfMTI4IHRvIGdldCBzdW1YWS4KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW1YWV8xMjgpOworICBzdW1YWSA9IHRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXTsKKworICByZXR2YWwgKz0gVlA4TEZhc3RTTG9nMihzdW1YKSArIFZQOExGYXN0U0xvZzIoc3VtWFkpOworICByZXR1cm4gKGZsb2F0KXJldHZhbDsKK30KKyN1bmRlZiBBTkFMWVpFX1hfT1JfWQorI3VuZGVmIEFOQUxZWkVfWFkKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGludCBWZWN0b3JNaXNtYXRjaF9TU0UyKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcnJheTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwgaW50IGxlbmd0aCkgeworICBpbnQgbWF0Y2hfbGVuOworCisgIGlmIChsZW5ndGggPj0gMTIpIHsKKyAgICBfX20xMjhpIEEwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkxWzBdKTsKKyAgICBfX20xMjhpIEExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmYXJyYXkyWzBdKTsKKyAgICBtYXRjaF9sZW4gPSAwOworICAgIGRvIHsKKyAgICAgIC8vIExvb3AgdW5yb2xsaW5nIGFuZCBlYXJseSBsb2FkIGJvdGggcHJvdmlkZSBhIHNwZWVkdXAgb2YgMTAlIGZvciB0aGUKKyAgICAgIC8vIGN1cnJlbnQgZnVuY3Rpb24uIEFsc28sIG1heF9saW1pdCBjYW4gYmUgTUFYX0xFTkdUSD00MDk2IGF0IG1vc3QuCisgICAgICBjb25zdCBfX20xMjhpIGNtcEEgPSBfbW1fY21wZXFfZXBpMzIoQTAsIEExKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQjAgPQorICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVttYXRjaF9sZW4gKyA0XSk7CisgICAgICBjb25zdCBfX20xMjhpIEIxID0KKyAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbbWF0Y2hfbGVuICsgNF0pOworICAgICAgaWYgKF9tbV9tb3ZlbWFza19lcGk4KGNtcEEpICE9IDB4ZmZmZikgYnJlYWs7CisgICAgICBtYXRjaF9sZW4gKz0gNDsKKworICAgICAgeworICAgICAgICBjb25zdCBfX20xMjhpIGNtcEIgPSBfbW1fY21wZXFfZXBpMzIoQjAsIEIxKTsKKyAgICAgICAgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbbWF0Y2hfbGVuICsgNF0pOworICAgICAgICBBMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MlttYXRjaF9sZW4gKyA0XSk7CisgICAgICAgIGlmIChfbW1fbW92ZW1hc2tfZXBpOChjbXBCKSAhPSAweGZmZmYpIGJyZWFrOworICAgICAgICBtYXRjaF9sZW4gKz0gNDsKKyAgICAgIH0KKyAgICB9IHdoaWxlIChtYXRjaF9sZW4gKyAxMiA8IGxlbmd0aCk7CisgIH0gZWxzZSB7CisgICAgbWF0Y2hfbGVuID0gMDsKKyAgICAvLyBVbnJvbGwgdGhlIHBvdGVudGlhbCBmaXJzdCB0d28gbG9vcHMuCisgICAgaWYgKGxlbmd0aCA+PSA0ICYmCisgICAgICAgIF9tbV9tb3ZlbWFza19lcGk4KF9tbV9jbXBlcV9lcGkzMigKKyAgICAgICAgICAgIF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmFycmF5MVswXSksCisgICAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbMF0pKSkgPT0gMHhmZmZmKSB7CisgICAgICBtYXRjaF9sZW4gPSA0OworICAgICAgaWYgKGxlbmd0aCA+PSA4ICYmCisgICAgICAgICAgX21tX21vdmVtYXNrX2VwaTgoX21tX2NtcGVxX2VwaTMyKAorICAgICAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTFbNF0pLAorICAgICAgICAgICAgICBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZhcnJheTJbNF0pKSkgPT0gMHhmZmZmKSB7CisgICAgICAgIG1hdGNoX2xlbiA9IDg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgd2hpbGUgKG1hdGNoX2xlbiA8IGxlbmd0aCAmJiBhcnJheTFbbWF0Y2hfbGVuXSA9PSBhcnJheTJbbWF0Y2hfbGVuXSkgeworICAgICsrbWF0Y2hfbGVuOworICB9CisgIHJldHVybiBtYXRjaF9sZW47Cit9CisKKy8vIEJ1bmRsZXMgbXVsdGlwbGUgKDEsIDIsIDQgb3IgOCkgcGl4ZWxzIGludG8gYSBzaW5nbGUgcGl4ZWwuCitzdGF0aWMgdm9pZCBCdW5kbGVDb2xvck1hcF9TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJvdywgaW50IHdpZHRoLCBpbnQgeGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IHg7CisgIGFzc2VydCh4Yml0cyA+PSAwKTsKKyAgYXNzZXJ0KHhiaXRzIDw9IDMpOworICBzd2l0Y2ggKHhiaXRzKSB7CisgICAgY2FzZSAwOiB7CisgICAgICBjb25zdCBfX20xMjhpIGZmID0gX21tX3NldDFfZXBpMTYoMHhmZjAwKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAvLyBTdG9yZSAweGZmMDAwMDAwIHwgKHJvd1t4XSA8PCA4KS4KKyAgICAgIGZvciAoeCA9IDA7IHggKyAxNiA8PSB3aWR0aDsgeCArPSAxNiwgZHN0ICs9IDE2KSB7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyb3dbeF0pOworICAgICAgICBjb25zdCBfX20xMjhpIGluX2xvID0gX21tX3VucGFja2xvX2VwaTgoemVybywgaW4pOworICAgICAgICBjb25zdCBfX20xMjhpIGRzdDAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoaW5fbG8sIGZmKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBkc3QxID0gX21tX3VucGFja2hpX2VwaTE2KGluX2xvLCBmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW5faGkgPSBfbW1fdW5wYWNraGlfZXBpOCh6ZXJvLCBpbik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MiA9IF9tbV91bnBhY2tsb19lcGkxNihpbl9oaSwgZmYpOworICAgICAgICBjb25zdCBfX20xMjhpIGRzdDMgPSBfbW1fdW5wYWNraGlfZXBpMTYoaW5faGksIGZmKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFswXSwgZHN0MCk7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbNF0sIGRzdDEpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzhdLCBkc3QyKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJmRzdFsxMl0sIGRzdDMpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgMTogeworICAgICAgY29uc3QgX19tMTI4aSBmZiA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYwMCk7CisgICAgICBjb25zdCBfX20xMjhpIG11bCA9IF9tbV9zZXQxX2VwaTE2KDB4MTEwKTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyAxNiA8PSB3aWR0aDsgeCArPSAxNiwgZHN0ICs9IDgpIHsKKyAgICAgICAgLy8gMGEwYiB8ICh3aGVyZSBhL2IgYXJlIDQgYml0cykuCisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyb3dbeF0pOworICAgICAgICBjb25zdCBfX20xMjhpIHRtcCA9IF9tbV9tdWxsb19lcGkxNihpbiwgbXVsKTsgIC8vIGFiYTAKKyAgICAgICAgY29uc3QgX19tMTI4aSBwYWNrID0gX21tX2FuZF9zaTEyOCh0bXAsIGZmKTsgICAvLyBhYjAwCisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MCA9IF9tbV91bnBhY2tsb19lcGkxNihwYWNrLCBmZik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgZHN0MSA9IF9tbV91bnBhY2toaV9lcGkxNihwYWNrLCBmZik7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZkc3RbMF0sIGRzdDApOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0WzRdLCBkc3QxKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDI6IHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbWFza19vciA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYwMDAwMDApOworICAgICAgY29uc3QgX19tMTI4aSBtdWxfY3N0ID0gX21tX3NldDFfZXBpMTYoMHgwMTA0KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbWFza19tdWwgPSBfbW1fc2V0MV9lcGkxNigweDBmMDApOworICAgICAgZm9yICh4ID0gMDsgeCArIDE2IDw9IHdpZHRoOyB4ICs9IDE2LCBkc3QgKz0gNCkgeworICAgICAgICAvLyAwMDBhMDAwYjAwMGMwMDBkIHwgKHdoZXJlIGEvYi9jL2QgYXJlIDIgYml0cykuCisgICAgICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZyb3dbeF0pOworICAgICAgICBjb25zdCBfX20xMjhpIG11bCA9IF9tbV9tdWxsb19lcGkxNihpbiwgbXVsX2NzdCk7ICAvLyAwMGFiMDBiMDAwY2QwMGQwCisgICAgICAgIGNvbnN0IF9fbTEyOGkgdG1wID0gX21tX2FuZF9zaTEyOChtdWwsIG1hc2tfbXVsKTsgIC8vIDAwYWIwMDAwMDBjZDAwMDAKKyAgICAgICAgY29uc3QgX19tMTI4aSBzaGlmdCA9IF9tbV9zcmxpX2VwaTMyKHRtcCwgMTIpOyAgICAgLy8gMDAwMDAwMDBhYjAwMDAwMAorICAgICAgICBjb25zdCBfX20xMjhpIHBhY2sgPSBfbW1fb3Jfc2kxMjgoc2hpZnQsIHRtcCk7ICAgICAvLyAwMDAwMDAwMGFiY2QwMDAwCisgICAgICAgIC8vIENvbnZlcnQgdG8gMHhmZjAwKiowMC4KKyAgICAgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fb3Jfc2kxMjgocGFjaywgbWFza19vcik7CisgICAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgcmVzKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiB7CisgICAgICBhc3NlcnQoeGJpdHMgPT0gMyk7CisgICAgICBmb3IgKHggPSAwOyB4ICsgMTYgPD0gd2lkdGg7IHggKz0gMTYsIGRzdCArPSAyKSB7CisgICAgICAgIC8vIDAwMDAwMDBhMDAwMDAwMDBiLi4uIHwgKHdoZXJlIGEvYiBhcmUgMSBiaXQpLgorICAgICAgICBjb25zdCBfX20xMjhpIGluID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmcm93W3hdKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBzaGlmdCA9IF9tbV9zbGxpX2VwaTY0KGluLCA3KTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgbW92ZSA9IF9tbV9tb3ZlbWFza19lcGk4KHNoaWZ0KTsKKyAgICAgICAgZHN0WzBdID0gMHhmZjAwMDAwMCB8ICgobW92ZSAmIDB4ZmYpIDw8IDgpOworICAgICAgICBkc3RbMV0gPSAweGZmMDAwMDAwIHwgKG1vdmUgJiAweGZmMDApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmICh4ICE9IHdpZHRoKSB7CisgICAgVlA4TEJ1bmRsZUNvbG9yTWFwX0Mocm93ICsgeCwgd2lkdGggLSB4LCB4Yml0cywgZHN0KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmF0Y2ggdmVyc2lvbiBvZiBQcmVkaWN0b3IgVHJhbnNmb3JtIHN1YnRyYWN0aW9uCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEF2ZXJhZ2UyX20xMjhpKGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBhdmcpIHsKKyAgLy8gKGEgKyBiKSA+PiAxID0gKChhICsgYiArIDEpID4+IDEpIC0gKChhIF4gYikgJiAxKQorICBjb25zdCBfX20xMjhpIG9uZXMgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoKmEwLCAqYTEpOworICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOCgqYTAsICphMSksIG9uZXMpOworICAqYXZnID0gX21tX3N1Yl9lcGk4KGF2ZzEsIG9uZSk7Cit9CisKKy8vIFByZWRpY3RvcjA6IEFSR0JfQkxBQ0suCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JTdWIwX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgYmxhY2sgPSBfbW1fc2V0MV9lcGkzMihBUkdCX0JMQUNLKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBibGFjayk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1swXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzEoWCwgSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YiMjWCMjX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHByZWQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoSU4pKTsgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworR0VORVJBVEVfUFJFRElDVE9SXzEoMSwgaW5baSAtIDFdKSAgICAgICAvLyBQcmVkaWN0b3IxOiBMCitHRU5FUkFURV9QUkVESUNUT1JfMSgyLCB1cHBlcltpXSkgICAgICAgIC8vIFByZWRpY3RvcjI6IFQKK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDMsIHVwcGVyW2kgKyAxXSkgICAgLy8gUHJlZGljdG9yMzogVFIKK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDQsIHVwcGVyW2kgLSAxXSkgICAgLy8gUHJlZGljdG9yNDogVEwKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMQorCisvLyBQcmVkaWN0b3I1OiBhdmcyKGF2ZzIoTCwgVFIpLCBUKQorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViNV9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRSID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSArIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBfX20xMjhpIGF2ZywgcHJlZCwgcmVzOworICAgIEF2ZXJhZ2UyX20xMjhpKCZMLCAmVFIsICZhdmcpOworICAgIEF2ZXJhZ2UyX20xMjhpKCZhdmcsICZULCAmcHJlZCk7CisgICAgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopJm91dFtpXSwgcmVzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1s1XShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzIoWCwgQSwgQikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YiMjWCMjX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHRBID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKEEpKTsgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHRCID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKEIpKTsgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsgICAgICAgICAgICAgIFwKKyAgICBfX20xMjhpIHByZWQsIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBdmVyYWdlMl9tMTI4aSgmdEEsICZ0QiwgJnByZWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworR0VORVJBVEVfUFJFRElDVE9SXzIoNiwgaW5baSAtIDFdLCB1cHBlcltpIC0gMV0pICAgLy8gUHJlZGljdG9yNjogYXZnKEwsIFRMKQorR0VORVJBVEVfUFJFRElDVE9SXzIoNywgaW5baSAtIDFdLCB1cHBlcltpXSkgICAgICAgLy8gUHJlZGljdG9yNzogYXZnKEwsIFQpCitHRU5FUkFURV9QUkVESUNUT1JfMig4LCB1cHBlcltpIC0gMV0sIHVwcGVyW2ldKSAgICAvLyBQcmVkaWN0b3I4OiBhdmcoVEwsIFQpCitHRU5FUkFURV9QUkVESUNUT1JfMig5LCB1cHBlcltpXSwgdXBwZXJbaSArIDFdKSAgICAvLyBQcmVkaWN0b3I5OiBhdmVyYWdlKFQsIFRSKQorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8yCisKKy8vIFByZWRpY3RvcjEwOiBhdmcoYXZnKEwsVEwpLCBhdmcoVCwgVFIpKS4KK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjEwX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRSID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSArIDFdKTsKKyAgICBfX20xMjhpIGF2Z1RUUiwgYXZnTFRMLCBhdmcsIHJlczsKKyAgICBBdmVyYWdlMl9tMTI4aSgmVCwgJlRSLCAmYXZnVFRSKTsKKyAgICBBdmVyYWdlMl9tMTI4aSgmTCwgJlRMLCAmYXZnTFRMKTsKKyAgICBBdmVyYWdlMl9tMTI4aSgmYXZnVFRSLCAmYXZnTFRMLCAmYXZnKTsKKyAgICByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBhdmcpOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTBdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8gUHJlZGljdG9yMTE6IHNlbGVjdC4KK3N0YXRpYyB2b2lkIEdldFN1bUFic0RpZmYzMl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEsIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQpIHsKKyAgLy8gV2UgY2FuIHVucGFjayB3aXRoIGFueSB2YWx1ZSBvbiB0aGUgdXBwZXIgMzIgYml0cywgcHJvdmlkZWQgaXQncyB0aGUgc2FtZQorICAvLyBvbiBib3RoIG9wZXJhbmRzICh0byB0aGF0IHRoZWlyIHN1bSBvZiBhYnMgZGlmZiBpcyB6ZXJvKS4gSGVyZSB3ZSB1c2UgKkEuCisgIGNvbnN0IF9fbTEyOGkgQV9sbyA9IF9tbV91bnBhY2tsb19lcGkzMigqQSwgKkEpOworICBjb25zdCBfX20xMjhpIEJfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoKkIsICpBKTsKKyAgY29uc3QgX19tMTI4aSBBX2hpID0gX21tX3VucGFja2hpX2VwaTMyKCpBLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgQl9oaSA9IF9tbV91bnBhY2toaV9lcGkzMigqQiwgKkEpOworICBjb25zdCBfX20xMjhpIHNfbG8gPSBfbW1fc2FkX2VwdTgoQV9sbywgQl9sbyk7CisgIGNvbnN0IF9fbTEyOGkgc19oaSA9IF9tbV9zYWRfZXB1OChBX2hpLCBCX2hpKTsKKyAgKm91dCA9IF9tbV9wYWNrc19lcGkzMihzX2xvLCBzX2hpKTsKK30KKworc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMTFfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgTCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2kgLSAxXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIF9fbTEyOGkgcGEsIHBiOworICAgIEdldFN1bUFic0RpZmYzMl9TU0UyKCZULCAmVEwsICZwYSk7ICAgLy8gcGEgPSBzdW0gfFQtVEx8CisgICAgR2V0U3VtQWJzRGlmZjMyX1NTRTIoJkwsICZUTCwgJnBiKTsgICAvLyBwYiA9IHN1bSB8TC1UTHwKKyAgICB7CisgICAgICBjb25zdCBfX20xMjhpIG1hc2sgPSBfbW1fY21wZ3RfZXBpMzIocGIsIHBhKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9hbmRfc2kxMjgobWFzaywgTCk7CisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fYW5kbm90X3NpMTI4KG1hc2ssIFQpOworICAgICAgY29uc3QgX19tMTI4aSBwcmVkID0gX21tX29yX3NpMTI4KEEsIEIpOyAgICAvLyBwcmVkID0gKEwgPiBUKT8gTCA6IFQKKyAgICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX3N1Yl9lcGk4KHNyYywgcHJlZCk7CisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICAgIH0KKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNTdWJfQ1sxMV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLyBQcmVkaWN0b3IxMjogQ2xhbXBlZFN1YlN1YnRyYWN0RnVsbC4KK3N0YXRpYyB2b2lkIFByZWRpY3RvclN1YjEyX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgTF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgTF9oaSA9IF9tbV91bnBhY2toaV9lcGk4KEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChULCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChULCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFRMX2xvID0gX21tX3VucGFja2xvX2VwaTgoVEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVExfaGkgPSBfbW1fdW5wYWNraGlfZXBpOChUTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBkaWZmX2xvID0gX21tX3N1Yl9lcGkxNihUX2xvLCBUTF9sbyk7CisgICAgY29uc3QgX19tMTI4aSBkaWZmX2hpID0gX21tX3N1Yl9lcGkxNihUX2hpLCBUTF9oaSk7CisgICAgY29uc3QgX19tMTI4aSBwcmVkX2xvID0gX21tX2FkZF9lcGkxNihMX2xvLCBkaWZmX2xvKTsKKyAgICBjb25zdCBfX20xMjhpIHByZWRfaGkgPSBfbW1fYWRkX2VwaTE2KExfaGksIGRpZmZfaGkpOworICAgIGNvbnN0IF9fbTEyOGkgcHJlZCA9IF9tbV9wYWNrdXNfZXBpMTYocHJlZF9sbywgcHJlZF9oaSk7CisgICAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fc3ViX2VwaTgoc3JjLCBwcmVkKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc1N1Yl9DWzEyXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vIFByZWRpY3RvcnMxMzogQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZgorc3RhdGljIHZvaWQgUHJlZGljdG9yU3ViMTNfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGZvciAoaSA9IDA7IGkgKyAyIDw9IG51bV9waXhlbHM7IGkgKz0gMikgeworICAgIC8vIHdlIGNhbiBvbmx5IHByb2Nlc3MgdHdvIHBpeGVscyBhdCBhIHRpbWUKKyAgICBjb25zdCBfX20xMjhpIEwgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKSZpbltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgVCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2ldKTsKKyAgICBjb25zdCBfX20xMjhpIFRMID0gX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChMLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChULCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIFRMX2xvID0gX21tX3VucGFja2xvX2VwaTgoVEwsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihUX2xvLCBMX2xvKTsKKyAgICBjb25zdCBfX20xMjhpIGF2ZyA9IF9tbV9zcmxpX2VwaTE2KHN1bSwgMSk7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zdWJfZXBpMTYoYXZnLCBUTF9sbyk7CisgICAgY29uc3QgX19tMTI4aSBiaXRfZml4ID0gX21tX2NtcGd0X2VwaTE2KFRMX2xvLCBhdmcpOworICAgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc3ViX2VwaTE2KEExLCBiaXRfZml4KTsKKyAgICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NyYWlfZXBpMTYoQTIsIDEpOworICAgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fYWRkX2VwaTE2KGF2ZywgQTMpOworICAgIGNvbnN0IF9fbTEyOGkgcHJlZCA9IF9tbV9wYWNrdXNfZXBpMTYoQTQsIEE0KTsKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9zdWJfZXBpOChzcmMsIHByZWQpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzU3ViX0NbMTNdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExFbmNEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0U1NFMih2b2lkKSB7CisgIFZQOExTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWQgPSBTdWJ0cmFjdEdyZWVuRnJvbUJsdWVBbmRSZWRfU1NFMjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9yID0gVHJhbnNmb3JtQ29sb3JfU1NFMjsKKyAgVlA4TENvbGxlY3RDb2xvckJsdWVUcmFuc2Zvcm1zID0gQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfU1NFMjsKKyAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX1NTRTI7CisgIFZQOExIaXN0b2dyYW1BZGQgPSBIaXN0b2dyYW1BZGRfU1NFMjsKKyAgVlA4TENvbWJpbmVkU2hhbm5vbkVudHJvcHkgPSBDb21iaW5lZFNoYW5ub25FbnRyb3B5X1NTRTI7CisgIFZQOExWZWN0b3JNaXNtYXRjaCA9IFZlY3Rvck1pc21hdGNoX1NTRTI7CisgIFZQOExCdW5kbGVDb2xvck1hcCA9IEJ1bmRsZUNvbG9yTWFwX1NTRTI7CisKKyAgVlA4TFByZWRpY3RvcnNTdWJbMF0gPSBQcmVkaWN0b3JTdWIwX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzFdID0gUHJlZGljdG9yU3ViMV9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1YlsyXSA9IFByZWRpY3RvclN1YjJfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbM10gPSBQcmVkaWN0b3JTdWIzX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzRdID0gUHJlZGljdG9yU3ViNF9TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls1XSA9IFByZWRpY3RvclN1YjVfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbNl0gPSBQcmVkaWN0b3JTdWI2X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzddID0gUHJlZGljdG9yU3ViN19TU0UyOworICBWUDhMUHJlZGljdG9yc1N1Yls4XSA9IFByZWRpY3RvclN1YjhfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNTdWJbOV0gPSBQcmVkaWN0b3JTdWI5X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEwXSA9IFByZWRpY3RvclN1YjEwX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzExXSA9IFByZWRpY3RvclN1YjExX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEyXSA9IFByZWRpY3RvclN1YjEyX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzEzXSA9IFByZWRpY3RvclN1YjEzX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzU3ViWzE0XSA9IFByZWRpY3RvclN1YjBfU1NFMjsgIC8vIDwtIHBhZGRpbmcgc2VjdXJpdHkgc2VudGluZWxzCisgIFZQOExQcmVkaWN0b3JzU3ViWzE1XSA9IFByZWRpY3RvclN1YjBfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19lbmNfc3NlNDEuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxMmE3MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfZW5jX3NzZTQxLmMKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0LjEgdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHNtbWludHJpbi5oPgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKworLy8gRm9yIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA1OgorI2RlZmluZSBDU1RfNWIoWCkgICgoKGludDE2X3QpKCh1aW50MTZfdCkoWCkgPDwgOCkpID4+IDUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTdWJ0cmFjdC1HcmVlbiBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX1NTRTQxKHVpbnQzMl90KiBhcmdiX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMpIHsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkga0NzdFNodWZmbGUgPSBfbW1fc2V0X2VwaTgoLTEsIDEzLCAtMSwgMTMsIC0xLCA5LCAtMSwgOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgIDUsIC0xLCAgNSwgLTEsIDEsIC0xLCAxKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgX19tMTI4aSBpbiA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJmFyZ2JfZGF0YVtpXSk7CisgICAgY29uc3QgX19tMTI4aSBpbl8wZzBnID0gX21tX3NodWZmbGVfZXBpOChpbiwga0NzdFNodWZmbGUpOworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX3N1Yl9lcGk4KGluLCBpbl8wZzBnKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmYXJnYl9kYXRhW2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZF9DKGFyZ2JfZGF0YSArIGksIG51bV9waXhlbHMgLSBpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgVHJhbnNmb3JtCisKKyNkZWZpbmUgU1BBTiA4CitzdGF0aWMgdm9pZCBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19TU0U0MShjb25zdCB1aW50MzJfdCogYXJnYiwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvW10pIHsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19yID0gX21tX3NldDFfZXBpMTYoQ1NUXzViKHJlZF90b19ibHVlKSk7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfZyA9IF9tbV9zZXQxX2VwaTE2KENTVF81YihncmVlbl90b19ibHVlKSk7CisgIGNvbnN0IF9fbTEyOGkgbWFza19nID0gX21tX3NldDFfZXBpMTYoMHhmZjAwKTsgICAvLyBncmVlbiBtYXNrCisgIGNvbnN0IF9fbTEyOGkgbWFza19nYiA9IF9tbV9zZXQxX2VwaTMyKDB4ZmZmZik7ICAvLyBncmVlbi9ibHVlIG1hc2sKKyAgY29uc3QgX19tMTI4aSBtYXNrX2IgPSBfbW1fc2V0MV9lcGkxNigweDAwZmYpOyAgIC8vIGJsdWUgbWFzaworICBjb25zdCBfX20xMjhpIHNodWZmbGVyX2xvID0gX21tX3NldHJfZXBpOCgtMSwgMiwgLTEsIDYsIC0xLCAxMCwgLTEsIDE0LCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICBjb25zdCBfX20xMjhpIHNodWZmbGVyX2hpID0gX21tX3NldHJfZXBpOCgtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAtMSwgNiwgLTEsIDEwLCAtMSwgMTQpOworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHRpbGVfaGVpZ2h0OyArK3kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjID0gYXJnYiArIHkgKiBzdHJpZGU7CisgICAgaW50IGksIHg7CisgICAgZm9yICh4ID0gMDsgeCArIFNQQU4gPD0gdGlsZV93aWR0aDsgeCArPSBTUEFOKSB7CisgICAgICB1aW50MTZfdCB2YWx1ZXNbU1BBTl07CisgICAgICBjb25zdCBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgMF0pOworICAgICAgY29uc3QgX19tMTI4aSBpbjEgPSBfbW1fbG9hZHVfc2kxMjgoKF9fbTEyOGkqKSZzcmNbeCArIFNQQU4gLyAyXSk7CisgICAgICBjb25zdCBfX20xMjhpIHIwID0gX21tX3NodWZmbGVfZXBpOChpbjAsIHNodWZmbGVyX2xvKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgcjEgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMSwgc2h1ZmZsZXJfaGkpOworICAgICAgY29uc3QgX19tMTI4aSByID0gX21tX29yX3NpMTI4KHIwLCByMSk7ICAgICAgICAgLy8gciAwCisgICAgICBjb25zdCBfX20xMjhpIGdiMCA9IF9tbV9hbmRfc2kxMjgoaW4wLCBtYXNrX2diKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZ2IxID0gX21tX2FuZF9zaTEyOChpbjEsIG1hc2tfZ2IpOworICAgICAgY29uc3QgX19tMTI4aSBnYiA9IF9tbV9wYWNrdXNfZXBpMzIoZ2IwLCBnYjEpOyAgLy8gZyBiCisgICAgICBjb25zdCBfX20xMjhpIGcgPSBfbW1fYW5kX3NpMTI4KGdiLCBtYXNrX2cpOyAgICAvLyBnIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9tdWxoaV9lcGkxNihyLCBtdWx0c19yKTsgIC8vIHggZGJyCisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fbXVsaGlfZXBpMTYoZywgbXVsdHNfZyk7ICAvLyB4IGRiZworICAgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3N1Yl9lcGk4KGdiLCBCKTsgICAgICAgICAgLy8geCBiJworICAgICAgY29uc3QgX19tMTI4aSBEID0gX21tX3N1Yl9lcGk4KEMsIEEpOyAgICAgICAgICAgLy8geCBiJycKKyAgICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9hbmRfc2kxMjgoRCwgbWFza19iKTsgICAgIC8vIDAgYicnCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil2YWx1ZXMsIEUpOworICAgICAgZm9yIChpID0gMDsgaSA8IFNQQU47ICsraSkgKytoaXN0b1t2YWx1ZXNbaV1dOworICAgIH0KKyAgfQorICB7CisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHRpbGVfd2lkdGggJiAoU1BBTiAtIDEpOworICAgIGlmIChsZWZ0X292ZXIgPiAwKSB7CisgICAgICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXNfQyhhcmdiICsgdGlsZV93aWR0aCAtIGxlZnRfb3Zlciwgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9vdmVyLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX2JsdWUsIHJlZF90b19ibHVlLCBoaXN0byk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXNfU1NFNDEoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBncmVlbl90b19yZWQsIGludCBoaXN0b1tdKSB7CisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfZyA9IF9tbV9zZXQxX2VwaTE2KENTVF81YihncmVlbl90b19yZWQpKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2cgPSBfbW1fc2V0MV9lcGkzMigweDAwZmYwMCk7ICAvLyBncmVlbiBtYXNrCisgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9zZXQxX2VwaTE2KDB4ZmYpOworCisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgdGlsZV9oZWlnaHQ7ICsreSkgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBzcmMgPSBhcmdiICsgeSAqIHN0cmlkZTsKKyAgICBpbnQgaSwgeDsKKyAgICBmb3IgKHggPSAwOyB4ICsgU1BBTiA8PSB0aWxlX3dpZHRoOyB4ICs9IFNQQU4pIHsKKyAgICAgIHVpbnQxNl90IHZhbHVlc1tTUEFOXTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgaW4wID0gX21tX2xvYWR1X3NpMTI4KChfX20xMjhpKikmc3JjW3ggKyAwXSk7CisgICAgICBjb25zdCBfX20xMjhpIGluMSA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopJnNyY1t4ICsgU1BBTiAvIDJdKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZzAgPSBfbW1fYW5kX3NpMTI4KGluMCwgbWFza19nKTsgIC8vIDAgMCAgfCBnIDAKKyAgICAgIGNvbnN0IF9fbTEyOGkgZzEgPSBfbW1fYW5kX3NpMTI4KGluMSwgbWFza19nKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZyA9IF9tbV9wYWNrdXNfZXBpMzIoZzAsIGcxKTsgICAgIC8vIGcgMAorICAgICAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zcmxpX2VwaTMyKGluMCwgMTYpOyAgICAgLy8gMCAwICB8IHggcgorICAgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9zcmxpX2VwaTMyKGluMSwgMTYpOworICAgICAgY29uc3QgX19tMTI4aSBBID0gX21tX3BhY2t1c19lcGkzMihBMCwgQTEpOyAgICAgLy8geCByCisgICAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fbXVsaGlfZXBpMTYoZywgbXVsdHNfZyk7ICAvLyB4IGRyCisgICAgICBjb25zdCBfX20xMjhpIEMgPSBfbW1fc3ViX2VwaTgoQSwgQik7ICAgICAgICAgICAvLyB4IHInCisgICAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fYW5kX3NpMTI4KEMsIG1hc2spOyAgICAgICAvLyAwIHInCisgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil2YWx1ZXMsIEQpOworICAgICAgZm9yIChpID0gMDsgaSA8IFNQQU47ICsraSkgKytoaXN0b1t2YWx1ZXNbaV1dOworICAgIH0KKyAgfQorICB7CisgICAgY29uc3QgaW50IGxlZnRfb3ZlciA9IHRpbGVfd2lkdGggJiAoU1BBTiAtIDEpOworICAgIGlmIChsZWZ0X292ZXIgPiAwKSB7CisgICAgICBWUDhMQ29sbGVjdENvbG9yUmVkVHJhbnNmb3Jtc19DKGFyZ2IgKyB0aWxlX3dpZHRoIC0gbGVmdF9vdmVyLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfb3ZlciwgdGlsZV9oZWlnaHQsIGdyZWVuX3RvX3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG8pOworICAgIH0KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TEVuY0RzcEluaXRTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFZQOExFbmNEc3BJbml0U1NFNDEodm9pZCkgeworICBWUDhMU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkID0gU3VidHJhY3RHcmVlbkZyb21CbHVlQW5kUmVkX1NTRTQxOworICBWUDhMQ29sbGVjdENvbG9yQmx1ZVRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3Jtc19TU0U0MTsKKyAgVlA4TENvbGxlY3RDb2xvclJlZFRyYW5zZm9ybXMgPSBDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zX1NTRTQxOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX1NTRTQxCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRW5jRHNwSW5pdFNTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg4ODg1NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbWlwc19kc3BfcjIuYwpAQCAtMCwwICsxLDY5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybXMgYW5kIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2Rlci4KKy8vCisvLyBBdXRob3Iocyk6ICBEam9yZGplIFBlc3V0ICAgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisvLyAgICAgICAgICAgICBKb3ZhbiBaZWxpbmNldmljIChqb3Zhbi56ZWxpbmNldmljQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorCisjZGVmaW5lIE1BUF9DT0xPUl9GVU5DUyhGVU5DX05BTUUsIFRZUEUsIEdFVF9JTkRFWCwgR0VUX1ZBTFVFKSAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IFRZUEUqIHNyYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY29sb3JfbWFwLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgVFlQRSogZHN0LCBpbnQgeV9zdGFydCwgaW50IHlfZW5kLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoeSA9IHlfc3RhcnQ7IHkgPCB5X2VuZDsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHggPSAwOyB4IDwgKHdpZHRoID4+IDIpOyArK3gpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgdG1wMSwgdG1wMiwgdG1wMywgdG1wNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuaWZjICAgICAgICAiICNUWVBFICIsICB1aW50OF90ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsYnUgICAgICAgJVt0bXAxXSwgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibGJ1ICAgICAgICVbdG1wMl0sICAxKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImxidSAgICAgICAlW3RtcDNdLCAgMiglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsYnUgICAgICAgJVt0bXA0XSwgIDMoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkaXUgICAgICVbc3JjXSwgICAlW3NyY10sICAgICAgNCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmlmYyAgICAgICAgIiAjVFlQRSAiLCAgdWludDMyX3QgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHcgICAgICAgICVbdG1wMV0sICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3ICAgICAgICAlW3RtcDJdLCAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsdyAgICAgICAgJVt0bXAzXSwgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHcgICAgICAgICVbdG1wNF0sICAxMiglW3NyY10pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDFdLCAgJVt0bXAxXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAyXSwgICVbdG1wMl0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wM10sICAlW3RtcDNdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDRdLCAgJVt0bXA0XSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJhZGRpdSAgICAgJVtzcmNdLCAgICVbc3JjXSwgICAgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNsbCAgICAgICAlW3RtcDFdLCAgJVt0bXAxXSwgICAgIDIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzbGwgICAgICAgJVt0bXAyXSwgICVbdG1wMl0sICAgICAyICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2xsICAgICAgICVbdG1wM10sICAlW3RtcDNdLCAgICAgMiAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNsbCAgICAgICAlW3RtcDRdLCAgJVt0bXA0XSwgICAgIDIgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsd3ggICAgICAgJVt0bXAxXSwgICVbdG1wMV0oJVtjb2xvcl9tYXBdKSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAibHd4ICAgICAgICVbdG1wMl0sICAlW3RtcDJdKCVbY29sb3JfbWFwXSkgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImx3eCAgICAgICAlW3RtcDNdLCAgJVt0bXAzXSglW2NvbG9yX21hcF0pICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJsd3ggICAgICAgJVt0bXA0XSwgICVbdG1wNF0oJVtjb2xvcl9tYXBdKSAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgIi5pZmMgICAgICAgICIgI1RZUEUgIiwgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDFdLCAgJVt0bXAxXSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJleHQgICAgICAgJVt0bXAyXSwgICVbdG1wMl0sICAgICA4LCAgICAgICAgOCAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiZXh0ICAgICAgICVbdG1wM10sICAlW3RtcDNdLCAgICAgOCwgICAgICAgIDggICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImV4dCAgICAgICAlW3RtcDRdLCAgJVt0bXA0XSwgICAgIDgsICAgICAgICA4ICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzYiAgICAgICAgJVt0bXAxXSwgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic2IgICAgICAgICVbdG1wMl0sICAxKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInNiICAgICAgICAlW3RtcDNdLCAgMiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzYiAgICAgICAgJVt0bXA0XSwgIDMoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiYWRkaXUgICAgICVbZHN0XSwgICAlW2RzdF0sICAgICAgNCAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIuZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmlmYyAgICAgICAgIiAjVFlQRSAiLCAgdWludDMyX3QgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic3cgICAgICAgICVbdG1wMV0sICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgInN3ICAgICAgICAlW3RtcDJdLCAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJzdyAgICAgICAgJVt0bXAzXSwgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICAic3cgICAgICAgICVbdG1wNF0sICAxMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgImFkZGl1ICAgICAlW2RzdF0sICAgJVtkc3RdLCAgICAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICAgICAgICBcCisgICAgICAiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6IFt0bXAxXSI9JnIiKHRtcDEpLCBbdG1wMl0iPSZyIih0bXAyKSwgW3RtcDNdIj0mciIodG1wMyksICAgICAgICAgICAgIFwKKyAgICAgICAgICBbdG1wNF0iPSZyIih0bXA0KSwgW3NyY10iKyZyIihzcmMpLCBbZHN0XSIrciIoZHN0KSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIDogW2NvbG9yX21hcF0iciIoY29sb3JfbWFwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA6ICJtZW1vcnkiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCAod2lkdGggJiAzKTsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICpkc3QrKyA9IEdFVF9WQUxVRShjb2xvcl9tYXBbR0VUX0lOREVYKCpzcmMrKyldKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworTUFQX0NPTE9SX0ZVTkNTKE1hcEFSR0JfTUlQU2RzcFIyLCB1aW50MzJfdCwgVlA4R2V0QVJHQkluZGV4LCBWUDhHZXRBUkdCVmFsdWUpCitNQVBfQ09MT1JfRlVOQ1MoTWFwQWxwaGFfTUlQU2RzcFIyLCB1aW50OF90LCBWUDhHZXRBbHBoYUluZGV4LCBWUDhHZXRBbHBoYVZhbHVlKQorCisjdW5kZWYgTUFQX0NPTE9SX0ZVTkNTCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKHVpbnQzMl90IGMwLCB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMyKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAicHJlY2V1LnBoLnFiciAgICVbdGVtcDFdLCAgICVbYzBdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJsICAgJVt0ZW1wMl0sICAgJVtjMF0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYnIgICAlW3RlbXAzXSwgICAlW2MxXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICVbdGVtcDRdLCAgICVbYzFdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgJVt0ZW1wNV0sICAgJVtjMl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAlW3RlbXAwXSwgICAlW2MyXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3VicS5waCAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbdGVtcDVdICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgJVt0ZW1wMF0gIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDRdICBcblx0IgorICAgICJzaGxsX3MucGggICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3JxdV9zLnFiLnBoICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDFdICBcblx0IgorICAgIDogW3RlbXAwXSI9ciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KQorICAgIDogW2MwXSJyIihjMCksIFtjMV0iciIoYzEpLCBbYzJdInIiKGMyKQorICAgIDogIm1lbW9yeSIKKyAgKTsKKyAgcmV0dXJuIHRlbXAyOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZih1aW50MzJfdCBjMCwgdWludDMyX3QgYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImFkZHVoLnFiICAgICAgICAgJVt0ZW1wNV0sICAgJVtjMF0sICAgICAgJVtjMV0gICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFiciAgICAlW3RlbXAzXSwgICAlW2MyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJwcmVjZXUucGgucWJyICAgICVbdGVtcDFdLCAgICVbdGVtcDVdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInByZWNldS5waC5xYmwgICAgJVt0ZW1wMl0sICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFibCAgICAlW3RlbXA0XSwgICAlW2MyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJxLnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDFdLCAgICVbdGVtcDNdICAgIFxuXHQiCisgICAgInN1YnEucGggICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wMl0sICAgJVt0ZW1wNF0gICAgXG5cdCIKKyAgICAic2hybC5waCAgICAgICAgICAlW3RlbXA1XSwgICAlW3RlbXAzXSwgICAxNSAgICAgICAgICBcblx0IgorICAgICJzaHJsLnBoICAgICAgICAgICVbdGVtcDBdLCAgICVbdGVtcDRdLCAgIDE1ICAgICAgICAgIFxuXHQiCisgICAgImFkZHEucGggICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgJVt0ZW1wNV0gICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXAwXSwgICAlW3RlbXA0XSAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgIDEgICAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAgJVt0ZW1wNF0sICAgJVt0ZW1wNF0sICAgMSAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkcS5waCAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAlW3RlbXAzXSAgICBcblx0IgorICAgICJhZGRxLnBoICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICVbdGVtcDRdICAgIFxuXHQiCisgICAgInNobGxfcy5waCAgICAgICAgJVt0ZW1wMV0sICAgJVt0ZW1wMV0sICAgNyAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbF9zLnBoICAgICAgICAlW3RlbXAyXSwgICAlW3RlbXAyXSwgICA3ICAgICAgICAgICBcblx0IgorICAgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDFdLCAgICVbdGVtcDJdLCAgICVbdGVtcDFdICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj1yIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj1yIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSkKKyAgICA6IFtjMF0iciIoYzApLCBbYzFdInIiKGMxKSwgW2MyXSJyIihjMikKKyAgICA6ICJtZW1vcnkiCisgICk7CisgIHJldHVybiB0ZW1wMTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFNlbGVjdCh1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiY21wZ2R1Lmx0LnFiICVbdGVtcDFdLCAlW2NdLCAgICAgJVtiXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wMV0sICVbYl0sICAgICAlW2NdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXAyXSwgJVtjXSwgICAgICVbYl0gICAgICAgICAgICAgXG5cdCIKKyAgICAiY21wZ2R1Lmx0LnFiICVbdGVtcDRdLCAlW2NdLCAgICAgJVthXSAgICAgICAgICAgICBcblx0IgorICAgICJwaWNrLnFiICAgICAgJVt0ZW1wNF0sICVbYV0sICAgICAlW2NdICAgICAgICAgICAgIFxuXHQiCisgICAgInBpY2sucWIgICAgICAlW3RlbXA1XSwgJVtjXSwgICAgICVbYV0gICAgICAgICAgICAgXG5cdCIKKyAgICAic3VidS5xYiAgICAgICVbdGVtcDNdLCAlW3RlbXAxXSwgJVt0ZW1wMl0gICAgICAgICBcblx0IgorICAgICJzdWJ1LnFiICAgICAgJVt0ZW1wMF0sICVbdGVtcDRdLCAlW3RlbXA1XSAgICAgICAgIFxuXHQiCisgICAgInJhZGR1LncucWIgICAlW3RlbXAzXSwgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmFkZHUudy5xYiAgICVbdGVtcDBdLCAlW3RlbXAwXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdWJ1ICAgICAgICAgJVt0ZW1wM10sICVbdGVtcDNdLCAlW3RlbXAwXSAgICAgICAgIFxuXHQiCisgICAgInNsdGkgICAgICAgICAlW3RlbXAwXSwgJVt0ZW1wM10sIDB4MSAgICAgICAgICAgICAgXG5cdCIKKyAgICAibW92eiAgICAgICAgICVbYV0sICAgICAlW2JdLCAgICAgJVt0ZW1wMF0gICAgICAgICBcblx0IgorICAgIDogW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbYV0iKyZyIihhKQorICAgIDogW2JdInIiKGIpLCBbY10iciIoYykKKyAgKTsKKyAgcmV0dXJuIGE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBdmVyYWdlMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgImFkZHVoLnFiICAgICVbYTBdLCAlW2EwXSwgJVthMV0gICAgICAgXG5cdCIKKyAgICA6IFthMF0iK3IiKGEwKQorICAgIDogW2ExXSJyIihhMSkKKyAgKTsKKyAgcmV0dXJuIGEwOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTModWludDMyX3QgYTAsIHVpbnQzMl90IGExLCB1aW50MzJfdCBhMikgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGEyKSwgYTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTQodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGEyLCB1aW50MzJfdCBhMykgeworICByZXR1cm4gQXZlcmFnZTIoQXZlcmFnZTIoYTAsIGExKSwgQXZlcmFnZTIoYTIsIGEzKSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I1X01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlMyhsZWZ0LCB0b3BbMF0sIHRvcFsxXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I2X01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlMihsZWZ0LCB0b3BbLTFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjdfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UyKGxlZnQsIHRvcFswXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3I4X01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBBdmVyYWdlMih0b3BbLTFdLCB0b3BbMF0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yOV9NSVBTZHNwUjIodWludDMyX3QgbGVmdCwgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICAodm9pZClsZWZ0OworICByZXR1cm4gQXZlcmFnZTIodG9wWzBdLCB0b3BbMV0pOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTBfTUlQU2RzcFIyKHVpbnQzMl90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2U0KGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjExX01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBTZWxlY3QodG9wWzBdLCBsZWZ0LCB0b3BbLTFdKTsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjEyX01JUFNkc3BSMih1aW50MzJfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBDbGFtcGVkQWRkU3VidHJhY3RGdWxsKGxlZnQsIHRvcFswXSwgdG9wWy0xXSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxM19NSVBTZHNwUjIodWludDMyX3QgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRvcCkgeworICByZXR1cm4gQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworfQorCisvLyBBZGQgZ3JlZW4gdG8gYmx1ZSBhbmQgcmVkIGNoYW5uZWxzIChpLmUuIHBlcmZvcm0gdGhlIGludmVyc2UgdHJhbnNmb3JtIG9mCisvLyAnc3VidHJhY3QgZ3JlZW4nKS4KK3N0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkX01JUFNkc3BSMihjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIHVpbnQzMl90IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIHRlbXA2LCB0ZW1wNzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDFfZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AyX2VuZCA9IHNyYyArIG51bV9waXhlbHM7CisgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICIuc2V0ICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAgICAgJVtwX2xvb3AxX2VuZF0sICAgICAzZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAgICAgJVtzcmNdLCAgICAgICAgICAgICAxNiAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZHN0XSwgICAgICAgICAgJVtkc3RdLCAgICAgICAgICAgICAxNiAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDVdLCAgICAgICAgJVt0ZW1wNV0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDZdLCAgICAgICAgJVt0ZW1wNl0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDddLCAgICAgICAgJVt0ZW1wN10gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDFdLCAgICAgICAgJVt0ZW1wMV0sICAgICAgICAgICAlW3RlbXA1XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDJdLCAgICAgICAgJVt0ZW1wMl0sICAgICAgICAgICAlW3RlbXA2XSBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDNdLCAgICAgICAgJVt0ZW1wM10sICAgICAgICAgICAlW3RlbXA3XSBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTE2KCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDFdLCAgICAgICAgLTEyKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICVbdGVtcDJdLCAgICAgICAgLTgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAgICAgJVtwX2xvb3AxX2VuZF0sICAgICAwYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDNdLCAgICAgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAgICAgJVtwX2xvb3AyX2VuZF0sICAgICAyZiAgICAgICBcblx0IgorICAgICIgbm9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAgICAgJVtzcmNdLCAgICAgICAgICAgICA0ICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZHN0XSwgICAgICAgICAgJVtkc3RdLCAgICAgICAgICAgICA0ICAgICAgICBcblx0IgorICAgICJleHQgICAgICAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICA4LCAgICA4ICBcblx0IgorICAgICJyZXBsdi5waCAgICVbdGVtcDRdLCAgICAgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJhZGR1LnFiICAgICVbdGVtcDBdLCAgICAgICAgJVt0ZW1wMF0sICAgICAgICAgICAlW3RlbXA0XSBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAgICAgJVtwX2xvb3AyX2VuZF0sICAgICAxYiAgICAgICBcblx0IgorICAgICIgc3cgICAgICAgICVbdGVtcDBdLCAgICAgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgIDogW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYyksIFt0ZW1wMF0iPSZyIih0ZW1wMCksCisgICAgICBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW3RlbXA2XSI9JnIiKHRlbXA2KSwKKyAgICAgIFt0ZW1wN10iPSZyIih0ZW1wNykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JJbnZlcnNlX01JUFNkc3BSMihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBudW1fcGl4ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICB1aW50MzJfdCBhcmdiLCBhcmdiMSwgbmV3X3JlZDsKKyAgY29uc3QgdWludDMyX3QgR190b19SID0gbS0+Z3JlZW5fdG9fcmVkXzsKKyAgY29uc3QgdWludDMyX3QgR190b19CID0gbS0+Z3JlZW5fdG9fYmx1ZV87CisgIGNvbnN0IHVpbnQzMl90IFJfdG9fQiA9IG0tPnJlZF90b19ibHVlXzsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcF9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4xKTsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAgJVtzcmNdLCAgICAgICAlW3BfbG9vcF9lbmRdLCAgMWYgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAicmVwbHYucGggICAgICAgICVbdGVtcDBdLCAgICAgJVtHX3RvX1JdICAgICAgICAgICAgICAgICBcblx0IgorICAgICJyZXBsdi5waCAgICAgICAgJVt0ZW1wMV0sICAgICAlW0dfdG9fQl0gICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJlcGx2LnBoICAgICAgICAlW3RlbXAyXSwgICAgICVbUl90b19CXSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaGxsLnBoICAgICAgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAxXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXAyXSwgICAgICVbdGVtcDJdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDBdLCAgICAgJVt0ZW1wMF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wMV0sICAgICAlW3RlbXAxXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgInNocmEucGggICAgICAgICAlW3RlbXAyXSwgICAgICVbdGVtcDJdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAgJVthcmdiXSwgICAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3cgICAgICAgICAgICAgICVbYXJnYl0sICAgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzdyAgICAgICAgICAgICAgJVthcmdiMV0sICAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICAlW3NyY10sICAgICAgICVbc3JjXSwgICAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAgICAgICVbZHN0XSwgICAgICAgJVtkc3RdLCAgICAgICAgIDggICAgICAgICBcblx0IgorICAgICJwcmVjcnEucWIucGggICAgJVt0ZW1wM10sICAgICAlW2FyZ2JdLCAgICAgICAgJVthcmdiMV0gIFxuXHQiCisgICAgInByZWNldS5waC5xYnJhICAlW3RlbXAzXSwgICAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic2hsbC5waCAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgOCAgICAgICAgIFxuXHQiCisgICAgIm11bC5waCAgICAgICAgICAlW3RlbXA1XSwgICAgICVbdGVtcDNdLCAgICAgICAlW3RlbXAwXSAgXG5cdCIKKyAgICAibXVsLnBoICAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgICVbdGVtcDFdICBcblx0IgorICAgICJwcmVjcnEucGgudyAgICAgJVtuZXdfcmVkXSwgICAlW2FyZ2JdLCAgICAgICAgJVthcmdiMV0gIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYl0sICAgICAgICAxNiwgICAxNiAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgIDUgICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wM10sICAgICAlW3RlbXAzXSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW25ld19yZWRdLCAgICVbbmV3X3JlZF0sICAgICAlW3RlbXA1XSAgXG5cdCIKKyAgICAiYWRkdS5waCAgICAgICAgICVbYXJnYjFdLCAgICAgJVthcmdiMV0sICAgICAgICVbdGVtcDNdICBcblx0IgorICAgICJwcmVjZXUucGgucWJyYSAgJVt0ZW1wNV0sICAgICAlW25ld19yZWRdICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNobGwucGggICAgICAgICAlW3RlbXA0XSwgICAgICVbdGVtcDVdLCAgICAgICA4ICAgICAgICAgXG5cdCIKKyAgICAic2hyYS5waCAgICAgICAgICVbdGVtcDRdLCAgICAgJVt0ZW1wNF0sICAgICAgIDggICAgICAgICBcblx0IgorICAgICJtdWwucGggICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgJVt0ZW1wMl0gIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXA1XSwgICAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAgICAgICVbdGVtcDVdLCAgICAgJVt0ZW1wNV0sICAgICAgIDE2ICAgICAgICBcblx0IgorICAgICJzaHJhLnBoICAgICAgICAgJVt0ZW1wNF0sICAgICAlW3RlbXA0XSwgICAgICAgNSAgICAgICAgIFxuXHQiCisgICAgImFkZHUucGggICAgICAgICAlW2FyZ2IxXSwgICAgICVbYXJnYjFdLCAgICAgICAlW3RlbXA0XSAgXG5cdCIKKyAgICAicHJlY2V1LnBoLnFicmEgICVbdGVtcDNdLCAgICAgJVthcmdiMV0gICAgICAgICAgICAgICAgICBcblx0IgorICAgICJzYiAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgICAtNiglW2RzdF0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNiICAgICAgICAgICAgICAlW3RlbXAzXSwgICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAgICAgICVbdGVtcDNdLCAgICAgJVt0ZW1wM10sICAgICAgIDE2ICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICAgICAgJVtzcmNdLCAgICAgICAlW3BfbG9vcF9lbmRdLCAgMGIgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAgICAgICAlW3RlbXAzXSwgICAgIC04KCVbZHN0XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtuZXdfcmVkXSI9JnIiKG5ld19yZWQpLCBbYXJnYl0iPSZyIihhcmdiKSwKKyAgICAgIFthcmdiMV0iPSZyIihhcmdiMSksIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbR190b19SXSJyIihHX3RvX1IpLCBbUl90b19CXSJyIihSX3RvX0IpLAorICAgICAgW0dfdG9fQl0iciIoR190b19CKSwgW3BfbG9vcF9lbmRdInIiKHBfbG9vcF9lbmQpCisgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICApOworCisgIC8vIEZhbGwtYmFjayB0byBDLXZlcnNpb24gZm9yIGxlZnQtb3ZlcnMuCisgIGlmIChudW1fcGl4ZWxzICYgMSkgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DKG0sIHNyYywgMSwgZHN0KTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQl9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgbm9yZW9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMl0sICAgIDgoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDJdLCAgICAgICAgICAyNCwgICA4ICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgInJvdHIgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDFdLCAgICAgICAgICAwLCAgICAxNiAgIFxuXHQiCisgICAgInNsbCAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgICAgICA4ICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJhbGlnbiAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgICAgICAgICAxICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wM10sICAgIDgoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInJvdHIgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMl0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAxMiAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtzcmNdLCAgICAgICVbc3JjXSwgICAgICAgICAgICA0ICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDBdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAzICAgICAgICAgIFxuXHQiCisgICAgInVzaCAgICAgICAgJVt0ZW1wMV0sICAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInNyYSAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAxNiAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAgJVt0ZW1wMF0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkFfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAxXSwgICAgNCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAxXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAyXSwgICAgOCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgIjM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYm5lICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbZHN0XSIrJnIiKGRzdCksIFtzcmNdIismciIoc3JjKQorICAgIDogW3BfbG9vcDFfZW5kXSJyIihwX2xvb3AxX2VuZCksIFtwX2xvb3AyX2VuZF0iciIocF9sb29wMl9lbmQpCisgICAgOiAibWVtb3J5IgorICApOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzLCB0ZW1wNCwgdGVtcDU7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwX2xvb3AxX2VuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjMpOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMl9lbmQgPSBzcmMgKyBudW1fcGl4ZWxzOworICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAiLnNldCAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIi5zZXQgICAgICAgICAgIG5vcmVvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDNmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDJdLCAgICA4KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAzXSwgICAgMTIoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDFdLCAgICAgICAgICAyOCwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDE2LCAgIDQgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDJdLCAgICAgICAgICAxMiwgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA0XSwgICAgICAgICAgMCwgICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wM10sICAgICAgICAgIDI4LCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDVdLCAgICAgICAgICAxNiwgICA0ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAzXSwgICAgICAgICAgMTIsICAgNCAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDAsICAgIDQgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdLCAgICAgICAgICAlW3RlbXAwXSAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAgICAlW3RlbXAyXSAgIFxuXHQiCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMV0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDNdLCAgICA0KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorI2Vsc2UKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDFdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXAzXSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAxXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wM10sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgOCAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgMjgsICAgNCAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDEyLCAgIDQgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDRdLCAgICAgICAgICAwLCAgICA0ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMTYsICAgNCAgICBcblx0IgorICAgICJhZGRpdSAgICAgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgXG5cdCIKKyAgICAicHJlY3IucWIucGggICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAlW3RlbXAwXSAgIFxuXHQiCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXNoICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZW5kaWYKKyAgICAiYm5lICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAxYiAgICAgICAgIFxuXHQiCisgICAgIiBhZGRpdSAgICAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMiAgICAgICAgICBcblx0IgorICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICAgICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwKKyAgICAgIFtkc3RdIismciIoZHN0KSwgW3NyY10iKyZyIihzcmMpCisgICAgOiBbcF9sb29wMV9lbmRdInIiKHBfbG9vcDFfZW5kKSwgW3BfbG9vcDJfZW5kXSJyIihwX2xvb3AyX2VuZCkKKyAgICA6ICJtZW1vcnkiCisgICk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0I1NjVfTUlQU2RzcFIyKGNvbnN0IHVpbnQzMl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQsIHRlbXA1OworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgICAgIHB1c2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYmVxICAgICAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAzZiAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgICAgICVbdGVtcDFdLCAgICA0KCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXAwXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDBdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDUsICAgIDExICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXAxXSwgICAgICAgICAgOCwgICAgMTYgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAyXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wMV0sICAgICVbdGVtcDJdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMywgICAgNSAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wNV0sICAgICAgICAgIDAsICAgIDExICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNV0sICAgICVbdGVtcDNdLCAgICAgICAgICA1LCAgICAxMSAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMCwgICAgNSAgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wM10sICAgICAgICAgIDgsICAgIDE2ICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDNdLCAgICAgICAgICAzLCAgICA1ICAgIFxuXHQiCisgICAgImlucyAgICAgICAgICAgICVbdGVtcDJdLCAgICAlW3RlbXA1XSwgICAgICAgICAgMCwgICAgMTEgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wNF0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDNdLCAgICAgICAgICAwLCAgICA1ICAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICBcblx0IgorICAgICJhcHBlbmQgICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDE2ICAgICAgICAgXG5cdCIKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAgICAgJVt0ZW1wMl0sICAgIDQoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisjZWxzZQorICAgICJ3c2JoICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAid3NiaCAgICAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICAgICAlW3RlbXAyXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJibmUgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AxX2VuZF0sICAgIDBiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICA4ICAgICAgICAgIFxuXHQiCisgICIzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDJmICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICAgICAlW3RlbXAwXSwgICAgMCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiZXh0ICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDBdLCAgICAgICAgICA4LCAgICAxNiAgIFxuXHQiCisgICAgImV4dCAgICAgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXAwXSwgICAgICAgICAgNSwgICAgMTEgICBcblx0IgorICAgICJleHQgICAgICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDMsICAgIDUgICAgXG5cdCIKKyAgICAiaW5zICAgICAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdLCAgICAgICAgICAwLCAgICAxMSAgIFxuXHQiCisgICAgImFkZGl1ICAgICAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgNCAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDAsICAgIDUgICAgXG5cdCIKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXA0XSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbHNlCisgICAgIndzYmggICAgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c2ggICAgICAgICAgICAlW3RlbXA0XSwgICAgMCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyNlbmRpZgorICAgICJibmUgICAgICAgICAgICAlW3NyY10sICAgICAgJVtwX2xvb3AyX2VuZF0sICAgIDFiICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICAgICAgICAyICAgICAgICAgIFxuXHQiCisgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksCisgICAgICBbdGVtcDNdIj0mciIodGVtcDMpLCBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLAorICAgICAgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUl9NSVBTZHNwUjIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgaW50IHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzOworICBjb25zdCB1aW50MzJfdCogY29uc3QgcF9sb29wMV9lbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4zKTsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHBfbG9vcDJfZW5kID0gc3JjICsgbnVtX3BpeGVsczsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIi5zZXQgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiLnNldCAgICAgICBub3Jlb3JkZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJiZXEgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDFfZW5kXSwgICAgM2YgICAgICAgICAgIFxuXHQiCisgICAgIiBub3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDBdLCAgICAwKCVbc3JjXSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAibHcgICAgICAgICAlW3RlbXAyXSwgICAgOCglW3NyY10pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJsdyAgICAgICAgICVbdGVtcDNdLCAgICAxMiglW3NyY10pICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImlucyAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdLCAgICAgICAgICAyNCwgICAgOCAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wMV0sICAgICAgICAgIDggICAgICAgICAgICBcblx0IgorICAgICJpbnMgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXAyXSwgICAgICAgICAgMTYsICAgIDE2ICAgIFxuXHQiCisgICAgInNsbCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDJdLCAgICAgICAgICA4ICAgICAgICAgICAgXG5cdCIKKyAgICAiYmFsaWduICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wMl0sICAgICAgICAgIDEgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbc3JjXSwgICAgICAlW3NyY10sICAgICAgICAgICAgMTYgICAgICAgICAgIFxuXHQiCisgICAgInVzdyAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtkc3RdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAidXN3ICAgICAgICAlW3RlbXAxXSwgICAgNCglW2RzdF0pICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICJ1c3cgICAgICAgICVbdGVtcDNdLCAgICA4KCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJuZSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMV9lbmRdLCAgICAwYiAgICAgICAgICAgXG5cdCIKKyAgICAiIGFkZGl1ICAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgICAgICAgIDEyICAgICAgICAgICBcblx0IgorICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImJlcSAgICAgICAgJVtzcmNdLCAgICAgICVbcF9sb29wMl9lbmRdLCAgICAyZiAgICAgICAgICAgXG5cdCIKKyAgICAiIG5vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgImx3ICAgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtzcmNdKSAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiYWRkaXUgICAgICAlW3NyY10sICAgICAgJVtzcmNdLCAgICAgICAgICAgIDQgICAgICAgICAgICBcblx0IgorICAgICJhZGRpdSAgICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgICAgICAgMyAgICAgICAgICAgIFxuXHQiCisgICAgInVzaCAgICAgICAgJVt0ZW1wMF0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAic3JhICAgICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICAgICAgIDE2ICAgICAgICAgICBcblx0IgorICAgICJibmUgICAgICAgICVbc3JjXSwgICAgICAlW3BfbG9vcDJfZW5kXSwgICAgMWIgICAgICAgICAgIFxuXHQiCisgICAgIiBzYiAgICAgICAgJVt0ZW1wMF0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgIjI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIuc2V0ICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLAorICAgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW2RzdF0iKyZyIihkc3QpLCBbc3JjXSIrJnIiKHNyYykKKyAgICA6IFtwX2xvb3AxX2VuZF0iciIocF9sb29wMV9lbmQpLCBbcF9sb29wMl9lbmRdInIiKHBfbG9vcDJfZW5kKQorICAgIDogIm1lbW9yeSIKKyAgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TERzcEluaXRNSVBTZHNwUjIodm9pZCkgeworICBWUDhMTWFwQ29sb3IzMmIgPSBNYXBBUkdCX01JUFNkc3BSMjsKKyAgVlA4TE1hcENvbG9yOGIgPSBNYXBBbHBoYV9NSVBTZHNwUjI7CisKKyAgVlA4TFByZWRpY3RvcnNbNV0gPSBQcmVkaWN0b3I1X01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbNl0gPSBQcmVkaWN0b3I2X01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbN10gPSBQcmVkaWN0b3I3X01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbOF0gPSBQcmVkaWN0b3I4X01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbOV0gPSBQcmVkaWN0b3I5X01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbMTBdID0gUHJlZGljdG9yMTBfTUlQU2RzcFIyOworICBWUDhMUHJlZGljdG9yc1sxMV0gPSBQcmVkaWN0b3IxMV9NSVBTZHNwUjI7CisgIFZQOExQcmVkaWN0b3JzWzEyXSA9IFByZWRpY3RvcjEyX01JUFNkc3BSMjsKKyAgVlA4TFByZWRpY3RvcnNbMTNdID0gUHJlZGljdG9yMTNfTUlQU2RzcFIyOworCisgIFZQOExBZGRHcmVlblRvQmx1ZUFuZFJlZCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkX01JUFNkc3BSMjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9NSVBTZHNwUjI7CisKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0IgPSBDb252ZXJ0QkdSQVRvUkdCX01JUFNkc3BSMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JBID0gQ29udmVydEJHUkFUb1JHQkFfTUlQU2RzcFIyOworICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ID0gQ29udmVydEJHUkFUb1JHQkE0NDQ0X01JUFNkc3BSMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjUgPSBDb252ZXJ0QkdSQVRvUkdCNTY1X01JUFNkc3BSMjsKKyAgVlA4TENvbnZlcnRCR1JBVG9CR1IgPSBDb252ZXJ0QkdSQVRvQkdSX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoVlA4TERzcEluaXRNSVBTZHNwUjIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQU19EU1BfUjIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3NfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21zYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTQ3MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX21zYS5jCkBAIC0wLDAgKzEsMzU2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTVNBIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogUHJhc2hhbnQgUGF0aWwgKHByYXNoYW50LnBhdGlsQGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMKKworI2RlZmluZSBDT05WRVJUMTZfQkdSQV9YWFgocHNyYywgcGRzdCwgbTAsIG0xLCBtMikgZG8geyAgICBcCisgIHYxNnU4IHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIGRzdDAsIGRzdDEsIGRzdDI7ICAgICAgICAgIFwKKyAgTERfVUI0KHBzcmMsIDE2LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHNyYzAsIHNyYzEsIHNyYzEsIHNyYzIsIG0wLCBtMSwgZHN0MCwgZHN0MSk7ICBcCisgIGRzdDIgPSBWU0hGX1VCKHNyYzIsIHNyYzMsIG0yKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIyKGRzdDAsIGRzdDEsIHBkc3QsIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihkc3QyLCBwZHN0ICsgMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQxMl9CR1JBX1hYWChwc3JjLCBwZHN0LCBtMCwgbTEsIG0yKSBkbyB7ICAgIFwKKyAgdWludDMyX3QgcGl4X3c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyLCBkc3QwLCBkc3QxLCBkc3QyOyAgICAgICAgICAgICAgICBcCisgIExEX1VCMyhwc3JjLCAxNiwgc3JjMCwgc3JjMSwgc3JjMik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBtMCwgbTEsIGRzdDAsIGRzdDEpOyAgXAorICBkc3QyID0gVlNIRl9VQihzcmMyLCBzcmMyLCBtMik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCMihkc3QwLCBkc3QxLCBwZHN0LCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MiwgMCk7ICAgICAgICAgICAgICAgICAgXAorICBTVyhwaXhfdywgcGRzdCArIDMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENPTlZFUlQ4X0JHUkFfWFhYKHBzcmMsIHBkc3QsIG0wLCBtMSkgZG8geyAgICAgICAgIFwKKyAgdWludDY0X3QgcGl4X2Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBzcmMwLCBzcmMxLCBzcmMyID0geyAwIH0sIGRzdDAsIGRzdDE7ICAgICAgICAgICAgICBcCisgIExEX1VCMihwc3JjLCAxNiwgc3JjMCwgc3JjMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMyLCBtMCwgbTEsIGRzdDAsIGRzdDEpOyAgXAorICBTVF9VQihkc3QwLCBwZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDEsIDApOyAgICAgICAgICAgICAgICAgIFwKKyAgU0QocGl4X2QsIHBkc3QgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUNF9CR1JBX1hYWChwc3JjLCBwZHN0LCBtKSBkbyB7ICAgICAgIFwKKyAgY29uc3QgdjE2dTggc3JjMCA9IExEX1VCKHBzcmMpOyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGRzdDAgPSBWU0hGX1VCKHNyYzAsIHNyYzAsIG0pOyAgICAgICAgXAorICB1aW50NjRfdCBwaXhfZCA9IF9fbXNhX2NvcHlfc19kKCh2Mmk2NClkc3QwLCAwKTsgIFwKKyAgdWludDMyX3QgcGl4X3cgPSBfX21zYV9jb3B5X3NfdygodjRpMzIpZHN0MCwgMik7ICBcCisgIFNEKHBpeF9kLCBwZHN0ICsgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhwaXhfdywgcGRzdCArIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ09OVkVSVDFfQkdSQV9CR1IocHNyYywgcGRzdCkgZG8geyAgXAorICBjb25zdCBpbnQzMl90IGIgPSAocHNyYylbMF07ICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDMyX3QgZyA9IChwc3JjKVsxXTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MzJfdCByID0gKHBzcmMpWzJdOyAgICAgICAgICAgICAgXAorICAocGRzdClbMF0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIChwZHN0KVsxXSA9IGc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzJdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUMV9CR1JBX1JHQihwc3JjLCBwZHN0KSBkbyB7ICBcCisgIGNvbnN0IGludDMyX3QgYiA9IChwc3JjKVswXTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MzJfdCBnID0gKHBzcmMpWzFdOyAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQzMl90IHIgPSAocHNyYylbMl07ICAgICAgICAgICAgICBcCisgIChwZHN0KVswXSA9IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHBkc3QpWzFdID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAocGRzdClbMl0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQU5TRk9STV9DT0xPUl9JTlZFUlNFXzgoc3JjMCwgc3JjMSwgZHN0MCwgZHN0MSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMCwgYzEsIG1hc2swLCBtYXNrMSkgZG8geyAgXAorICB2OGkxNiBnMCwgZzEsIHQwLCB0MSwgdDIsIHQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHQ0LCB0NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVlNIRl9CMl9TSChzcmMwLCBzcmMwLCBzcmMxLCBzcmMxLCBtYXNrMCwgbWFzazAsIGcwLCBnMSk7ICAgXAorICBET1RQX1NCMl9TSChnMCwgZzEsIGMwLCBjMCwgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0godDAsIHQxLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9hZGR2X2godDAsICh2OGkxNilzcmMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MSA9IF9fbXNhX2FkZHZfaCh0MSwgKHY4aTE2KXNyYzEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQ0ID0gX19tc2Ffc3JsaV93KCh2NGkzMil0MCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDUgPSBfX21zYV9zcmxpX3coKHY0aTMyKXQxLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBET1RQX1NCMl9TSCh0NCwgdDUsIGMxLCBjMSwgdDIsIHQzKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0godDIsIHQzLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQUREMih0MCwgdDIsIHQxLCB0MywgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWU0hGX0IyX1VCKHNyYzAsIHQwLCBzcmMxLCB0MSwgbWFzazEsIG1hc2sxLCBkc3QwLCBkc3QxKTsgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFRSQU5TRk9STV9DT0xPUl9JTlZFUlNFXzQoc3JjLCBkc3QsIGMwLCBjMSwgbWFzazAsIG1hc2sxKSBkbyB7ICBcCisgIGNvbnN0IHYxNmk4IGcwID0gVlNIRl9TQihzcmMsIHNyYywgbWFzazApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHQwID0gX19tc2FfZG90cF9zX2goYzAsIGcwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0aTMyIHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gU1JBSV9IKHQwLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfYWRkdl9oKHQwLCAodjhpMTYpc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQyID0gX19tc2Ffc3JsaV93KCh2NGkzMil0MCwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfZG90cF9zX2goYzEsICh2MTZpOCl0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gU1JBSV9IKHQxLCA1KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gdDAgKyB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9IFZTSEZfVUIoc3JjLCB0MCwgbWFzazEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQV9NU0EoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGludCBpOworICBjb25zdCB1aW50OF90KiBwdGVtcF9zcmMgPSAoY29uc3QgdWludDhfdCopc3JjOworICB1aW50OF90KiBwdGVtcF9kc3QgPSAodWludDhfdCopZHN0OworICB2MTZ1OCBzcmMwLCBkc3QwOworICBjb25zdCB2MTZ1OCBtYXNrID0geyAyLCAxLCAwLCAzLCA2LCA1LCA0LCA3LCAxMCwgOSwgOCwgMTEsIDE0LCAxMywgMTIsIDE1IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIHYxNnU4IHNyYzEsIGRzdDE7CisgICAgTERfVUIyKHB0ZW1wX3NyYywgMTYsIHNyYzAsIHNyYzEpOworICAgIFZTSEZfQjJfVUIoc3JjMCwgc3JjMCwgc3JjMSwgc3JjMSwgbWFzaywgbWFzaywgZHN0MCwgZHN0MSk7CisgICAgU1RfVUIyKGRzdDAsIGRzdDEsIHB0ZW1wX2RzdCwgMTYpOworICAgIHB0ZW1wX3NyYyArPSAzMjsKKyAgICBwdGVtcF9kc3QgKz0gMzI7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihwdGVtcF9zcmMpOworICAgICAgZHN0MCA9IFZTSEZfVUIoc3JjMCwgc3JjMCwgbWFzayk7CisgICAgICBTVF9VQihkc3QwLCBwdGVtcF9kc3QpOworICAgICAgcHRlbXBfc3JjICs9IDE2OworICAgICAgcHRlbXBfZHN0ICs9IDE2OworICAgICAgbnVtX3BpeGVscyAtPSA0OworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3BpeGVsczsgaSsrKSB7CisgICAgICBjb25zdCB1aW50OF90IGIgPSBwdGVtcF9zcmNbMl07CisgICAgICBjb25zdCB1aW50OF90IGcgPSBwdGVtcF9zcmNbMV07CisgICAgICBjb25zdCB1aW50OF90IHIgPSBwdGVtcF9zcmNbMF07CisgICAgICBjb25zdCB1aW50OF90IGEgPSBwdGVtcF9zcmNbM107CisgICAgICBwdGVtcF9kc3RbMF0gPSBiOworICAgICAgcHRlbXBfZHN0WzFdID0gZzsKKyAgICAgIHB0ZW1wX2RzdFsyXSA9IHI7CisgICAgICBwdGVtcF9kc3RbM10gPSBhOworICAgICAgcHRlbXBfc3JjICs9IDQ7CisgICAgICBwdGVtcF9kc3QgKz0gNDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb0JHUl9NU0EoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDhfdCogcHRlbXBfc3JjID0gKGNvbnN0IHVpbnQ4X3QqKXNyYzsKKyAgdWludDhfdCogcHRlbXBfZHN0ID0gKHVpbnQ4X3QqKWRzdDsKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDAsIDEsIDIsIDQsIDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgMTYsIDE3LCAxOCwgMjAgfTsKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDUsIDYsIDgsIDksIDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4LCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIxLCAyMiwgMjQsIDI1IH07CisgIGNvbnN0IHYxNnU4IG1hc2syID0geyAxMCwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOCwgMjAsIDIxLCAyMiwgMjQsIDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgMjYsIDI4LCAyOSwgMzAgfTsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSAxNikgeworICAgIENPTlZFUlQxNl9CR1JBX1hYWChwdGVtcF9zcmMsIHB0ZW1wX2RzdCwgbWFzazAsIG1hc2sxLCBtYXNrMik7CisgICAgcHRlbXBfc3JjICs9IDY0OworICAgIHB0ZW1wX2RzdCArPSA0ODsKKyAgICBudW1fcGl4ZWxzIC09IDE2OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDEyKSB7CisgICAgICBDT05WRVJUMTJfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgcHRlbXBfc3JjICs9IDQ4OworICAgICAgcHRlbXBfZHN0ICs9IDM2OworICAgICAgbnVtX3BpeGVscyAtPSAxMjsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPj0gOCkgeworICAgICAgQ09OVkVSVDhfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSk7CisgICAgICBwdGVtcF9zcmMgKz0gMzI7CisgICAgICBwdGVtcF9kc3QgKz0gMjQ7CisgICAgICBudW1fcGl4ZWxzIC09IDg7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIENPTlZFUlQ0X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCk7CisgICAgICBwdGVtcF9zcmMgKz0gMTY7CisgICAgICBwdGVtcF9kc3QgKz0gMTI7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGlmIChudW1fcGl4ZWxzID09IDMpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfQkdSKHB0ZW1wX3NyYyArIDAsIHB0ZW1wX2RzdCArIDApOworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjICsgNCwgcHRlbXBfZHN0ICsgMyk7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMgKyA4LCBwdGVtcF9kc3QgKyA2KTsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMikgeworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjICsgMCwgcHRlbXBfZHN0ICsgMCk7CisgICAgICBDT05WRVJUMV9CR1JBX0JHUihwdGVtcF9zcmMgKyA0LCBwdGVtcF9kc3QgKyAzKTsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMSkgeworICAgICAgQ09OVkVSVDFfQkdSQV9CR1IocHRlbXBfc3JjLCBwdGVtcF9kc3QpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCX01TQShjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50OF90KiBwdGVtcF9zcmMgPSAoY29uc3QgdWludDhfdCopc3JjOworICB1aW50OF90KiBwdGVtcF9kc3QgPSAodWludDhfdCopZHN0OworICBjb25zdCB2MTZ1OCBtYXNrMCA9IHsgMiwgMSwgMCwgNiwgNSwgNCwgMTAsIDksIDgsIDE0LCAxMywgMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxOCwgMTcsIDE2LCAyMiB9OworICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgNSwgNCwgMTAsIDksIDgsIDE0LCAxMywgMTIsIDE4LCAxNywgMTYsIDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgMjEsIDIwLCAyNiwgMjUgfTsKKyAgY29uc3QgdjE2dTggbWFzazIgPSB7IDgsIDE0LCAxMywgMTIsIDE4LCAxNywgMTYsIDIyLCAyMSwgMjAsIDI2LCAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDI0LCAzMCwgMjksIDI4IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gMTYpIHsKKyAgICBDT05WRVJUMTZfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgIHB0ZW1wX3NyYyArPSA2NDsKKyAgICBwdGVtcF9kc3QgKz0gNDg7CisgICAgbnVtX3BpeGVscyAtPSAxNjsKKyAgfQorICBpZiAobnVtX3BpeGVscykgeworICAgIGlmIChudW1fcGl4ZWxzID49IDEyKSB7CisgICAgICBDT05WRVJUMTJfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSwgbWFzazIpOworICAgICAgcHRlbXBfc3JjICs9IDQ4OworICAgICAgcHRlbXBfZHN0ICs9IDM2OworICAgICAgbnVtX3BpeGVscyAtPSAxMjsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPj0gOCkgeworICAgICAgQ09OVkVSVDhfQkdSQV9YWFgocHRlbXBfc3JjLCBwdGVtcF9kc3QsIG1hc2swLCBtYXNrMSk7CisgICAgICBwdGVtcF9zcmMgKz0gMzI7CisgICAgICBwdGVtcF9kc3QgKz0gMjQ7CisgICAgICBudW1fcGl4ZWxzIC09IDg7CisgICAgfSBlbHNlIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIENPTlZFUlQ0X0JHUkFfWFhYKHB0ZW1wX3NyYywgcHRlbXBfZHN0LCBtYXNrMCk7CisgICAgICBwdGVtcF9zcmMgKz0gMTY7CisgICAgICBwdGVtcF9kc3QgKz0gMTI7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGlmIChudW1fcGl4ZWxzID09IDMpIHsKKyAgICAgIENPTlZFUlQxX0JHUkFfUkdCKHB0ZW1wX3NyYyArIDAsIHB0ZW1wX2RzdCArIDApOworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjICsgNCwgcHRlbXBfZHN0ICsgMyk7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMgKyA4LCBwdGVtcF9kc3QgKyA2KTsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMikgeworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjICsgMCwgcHRlbXBfZHN0ICsgMCk7CisgICAgICBDT05WRVJUMV9CR1JBX1JHQihwdGVtcF9zcmMgKyA0LCBwdGVtcF9kc3QgKyAzKTsKKyAgICB9IGVsc2UgaWYgKG51bV9waXhlbHMgPT0gMSkgeworICAgICAgQ09OVkVSVDFfQkdSQV9SR0IocHRlbXBfc3JjLCBwdGVtcF9kc3QpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBBZGRHcmVlblRvQmx1ZUFuZFJlZF9NU0EoY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBpbnQgaTsKKyAgY29uc3QgdWludDhfdCogaW4gPSAoY29uc3QgdWludDhfdCopc3JjOworICB1aW50OF90KiBvdXQgPSAodWludDhfdCopZHN0OworICB2MTZ1OCBzcmMwLCBkc3QwLCB0bXAwOworICBjb25zdCB2MTZ1OCBtYXNrID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAxMywgMjU1LCAxMywgMjU1IH07CisKKyAgd2hpbGUgKG51bV9waXhlbHMgPj0gOCkgeworICAgIHYxNnU4IHNyYzEsIGRzdDEsIHRtcDE7CisgICAgTERfVUIyKGluLCAxNiwgc3JjMCwgc3JjMSk7CisgICAgVlNIRl9CMl9VQihzcmMwLCBzcmMxLCBzcmMxLCBzcmMwLCBtYXNrLCBtYXNrLCB0bXAwLCB0bXAxKTsKKyAgICBBREQyKHNyYzAsIHRtcDAsIHNyYzEsIHRtcDEsIGRzdDAsIGRzdDEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBvdXQsIDE2KTsKKyAgICBpbiArPSAzMjsKKyAgICBvdXQgKz0gMzI7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIGlmIChudW1fcGl4ZWxzID49IDQpIHsKKyAgICAgIHNyYzAgPSBMRF9VQihpbik7CisgICAgICB0bXAwID0gVlNIRl9VQihzcmMwLCBzcmMwLCBtYXNrKTsKKyAgICAgIGRzdDAgPSBzcmMwICsgdG1wMDsKKyAgICAgIFNUX1VCKGRzdDAsIG91dCk7CisgICAgICBpbiArPSAxNjsKKyAgICAgIG91dCArPSAxNjsKKyAgICAgIG51bV9waXhlbHMgLT0gNDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9waXhlbHM7IGkrKykgeworICAgICAgY29uc3QgdWludDhfdCBiID0gaW5bMF07CisgICAgICBjb25zdCB1aW50OF90IGcgPSBpblsxXTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgciA9IGluWzJdOworICAgICAgb3V0WzBdID0gKGIgKyBnKSAmIDB4ZmY7CisgICAgICBvdXRbMV0gPSBnOworICAgICAgb3V0WzJdID0gKHIgKyBnKSAmIDB4ZmY7CisgICAgICBvdXRbNF0gPSBpbls0XTsKKyAgICAgIG91dCArPSA0OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvckludmVyc2VfTVNBKGNvbnN0IFZQOExNdWx0aXBsaWVycyogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgdjE2dTggc3JjMCwgZHN0MDsKKyAgY29uc3QgdjE2aTggZzJiciA9ICh2MTZpOClfX21zYV9maWxsX3cobS0+Z3JlZW5fdG9fYmx1ZV8gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobS0+Z3JlZW5fdG9fcmVkXyA8PCAxNikpOworICBjb25zdCB2MTZpOCByMmIgPSAodjE2aTgpX19tc2FfZmlsbF93KG0tPnJlZF90b19ibHVlXyk7CisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAxLCAyNTUsIDEsIDI1NSwgNSwgMjU1LCA1LCAyNTUsIDksIDI1NSwgOSwgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDI1NSwgMTMsIDI1NSB9OworICBjb25zdCB2MTZ1OCBtYXNrMSA9IHsgMTYsIDEsIDE4LCAzLCAyMCwgNSwgMjIsIDcsIDI0LCA5LCAyNiwgMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAyOCwgMTMsIDMwLCAxNSB9OworCisgIHdoaWxlIChudW1fcGl4ZWxzID49IDgpIHsKKyAgICB2MTZ1OCBzcmMxLCBkc3QxOworICAgIExEX1VCMihzcmMsIDQsIHNyYzAsIHNyYzEpOworICAgIFRSQU5TRk9STV9DT0xPUl9JTlZFUlNFXzgoc3JjMCwgc3JjMSwgZHN0MCwgZHN0MSwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgIFNUX1VCMihkc3QwLCBkc3QxLCBkc3QsIDQpOworICAgIHNyYyArPSA4OworICAgIGRzdCArPSA4OworICAgIG51bV9waXhlbHMgLT0gODsKKyAgfQorICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBpZiAobnVtX3BpeGVscyA+PSA0KSB7CisgICAgICBzcmMwID0gTERfVUIoc3JjKTsKKyAgICAgIFRSQU5TRk9STV9DT0xPUl9JTlZFUlNFXzQoc3JjMCwgZHN0MCwgZzJiciwgcjJiLCBtYXNrMCwgbWFzazEpOworICAgICAgU1RfVUIoZHN0MCwgZHN0KTsKKyAgICAgIHNyYyArPSA0OworICAgICAgZHN0ICs9IDQ7CisgICAgICBudW1fcGl4ZWxzIC09IDQ7CisgICAgfQorICAgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgICAgc3JjMCA9IExEX1VCKHNyYyk7CisgICAgICBUUkFOU0ZPUk1fQ09MT1JfSU5WRVJTRV80KHNyYzAsIGRzdDAsIGcyYnIsIHIyYiwgbWFzazAsIG1hc2sxKTsKKyAgICAgIGlmIChudW1fcGl4ZWxzID09IDMpIHsKKyAgICAgICAgY29uc3QgdWludDY0X3QgcGl4X2QgPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpZHN0MCwgMCk7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDAsIDIpOworICAgICAgICBTRChwaXhfZCwgZHN0ICsgMCk7CisgICAgICAgIFNXKHBpeF93LCBkc3QgKyAyKTsKKyAgICAgIH0gZWxzZSBpZiAobnVtX3BpeGVscyA9PSAyKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IHBpeF9kID0gX19tc2FfY29weV9zX2QoKHYyaTY0KWRzdDAsIDApOworICAgICAgICBTRChwaXhfZCwgZHN0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IHBpeF93ID0gX19tc2FfY29weV9zX3coKHY0aTMyKWRzdDAsIDApOworICAgICAgICBTVyhwaXhfdywgZHN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFZQOExEc3BJbml0TVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TERzcEluaXRNU0Eodm9pZCkgeworICBWUDhMQ29udmVydEJHUkFUb1JHQkEgPSBDb252ZXJ0QkdSQVRvUkdCQV9NU0E7CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSID0gQ29udmVydEJHUkFUb0JHUl9NU0E7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gQ29udmVydEJHUkFUb1JHQl9NU0E7CisKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTVNBOworICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlID0gVHJhbnNmb3JtQ29sb3JJbnZlcnNlX01TQTsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExEc3BJbml0TVNBKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX25lb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmExYjZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9sb3NzbGVzc19uZW9uLmMKQEAgLTAsMCArMSw2NDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBORU9OIHZhcmlhbnQgb2YgbWV0aG9kcyBmb3IgbG9zc2xlc3MgZGVjb2RlcgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbnMKKworI2lmICFkZWZpbmVkKFdPUktfQVJPVU5EX0dDQykKKy8vIGdjYyA0LjYuMCBoYWQgc29tZSB0cm91YmxlIChOREstcjkpIHdpdGggdGhpcyBjb2RlLiBXZSBvbmx5IHVzZSBpdCBmb3IKKy8vIGdjYy00LjgueCBhdCBsZWFzdC4KK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JBX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+MTUpOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gMTYpIHsKKyAgICB1aW50OHgxNng0X3QgcGl4ZWwgPSB2bGQ0cV91OCgodWludDhfdCopc3JjKTsKKyAgICAvLyBzd2FwIEIgYW5kIFIuIChWU1dQIGQwLGQyIGhhcyBubyBpbnRyaW5zaWNzIGVxdWl2YWxlbnQhKQorICAgIGNvbnN0IHVpbnQ4eDE2X3QgdG1wID0gcGl4ZWwudmFsWzBdOworICAgIHBpeGVsLnZhbFswXSA9IHBpeGVsLnZhbFsyXTsKKyAgICBwaXhlbC52YWxbMl0gPSB0bXA7CisgICAgdnN0NHFfdTgoZHN0LCBwaXhlbCk7CisgICAgZHN0ICs9IDY0OworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKHNyYywgbnVtX3BpeGVscyAmIDE1LCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4xNSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSAxNikgeworICAgIGNvbnN0IHVpbnQ4eDE2eDRfdCBwaXhlbCA9IHZsZDRxX3U4KCh1aW50OF90KilzcmMpOworICAgIGNvbnN0IHVpbnQ4eDE2eDNfdCB0bXAgPSB7IHsgcGl4ZWwudmFsWzBdLCBwaXhlbC52YWxbMV0sIHBpeGVsLnZhbFsyXSB9IH07CisgICAgdnN0M3FfdTgoZHN0LCB0bXApOworICAgIGRzdCArPSA0ODsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb0JHUl9DKHNyYywgbnVtX3BpeGVscyAmIDE1LCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4xNSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSAxNikgeworICAgIGNvbnN0IHVpbnQ4eDE2eDRfdCBwaXhlbCA9IHZsZDRxX3U4KCh1aW50OF90KilzcmMpOworICAgIGNvbnN0IHVpbnQ4eDE2eDNfdCB0bXAgPSB7IHsgcGl4ZWwudmFsWzJdLCBwaXhlbC52YWxbMV0sIHBpeGVsLnZhbFswXSB9IH07CisgICAgdnN0M3FfdTgoZHN0LCB0bXApOworICAgIGRzdCArPSA0ODsKKyAgfQorICBWUDhMQ29udmVydEJHUkFUb1JHQl9DKHNyYywgbnVtX3BpeGVscyAmIDE1LCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCisjZWxzZSAgLy8gV09SS19BUk9VTkRfR0NDCisKKy8vIGdjYy00LjYuMCBmYWxsYmFjaworCitzdGF0aWMgY29uc3QgdWludDhfdCBrUkdCQVNodWZmbGVbOF0gPSB7IDIsIDEsIDAsIDMsIDYsIDUsIDQsIDcgfTsKKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkFfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH4xKTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUgPSB2bGQxX3U4KGtSR0JBU2h1ZmZsZSk7CisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSAyKSB7CisgICAgY29uc3QgdWludDh4OF90IHBpeGVscyA9IHZsZDFfdTgoKHVpbnQ4X3QqKXNyYyk7CisgICAgdnN0MV91OChkc3QsIHZ0YmwxX3U4KHBpeGVscywgc2h1ZmZsZSkpOworICAgIGRzdCArPSA4OworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCQV9DKHNyYywgbnVtX3BpeGVscyAmIDEsIGRzdCk7ICAvLyBsZWZ0LW92ZXJzCit9CisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtCR1JTaHVmZmxlWzNdWzhdID0geworICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDYsICA4LCAgOSB9LAorICB7IDEwLCAxMiwgMTMsIDE0LCAxNiwgMTcsIDE4LCAyMCB9LAorICB7IDIxLCAyMiwgMjQsIDI1LCAyNiwgMjgsIDI5LCAzMCB9Cit9OworCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSX05FT04oY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBlbmQgPSBzcmMgKyAobnVtX3BpeGVscyAmIH43KTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUwID0gdmxkMV91OChrQkdSU2h1ZmZsZVswXSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMSA9IHZsZDFfdTgoa0JHUlNodWZmbGVbMV0pOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTIgPSB2bGQxX3U4KGtCR1JTaHVmZmxlWzJdKTsKKyAgZm9yICg7IHNyYyA8IGVuZDsgc3JjICs9IDgpIHsKKyAgICB1aW50OHg4eDRfdCBwaXhlbHM7CisgICAgSU5JVF9WRUNUT1I0KHBpeGVscywKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDApKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDIpKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDQpKSwKKyAgICAgICAgICAgICAgICAgdmxkMV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIDYpKSk7CisgICAgdnN0MV91OChkc3QgKyAgMCwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMCkpOworICAgIHZzdDFfdTgoZHN0ICsgIDgsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTEpKTsKKyAgICB2c3QxX3U4KGRzdCArIDE2LCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUyKSk7CisgICAgZHN0ICs9IDggKiAzOworICB9CisgIFZQOExDb252ZXJ0QkdSQVRvQkdSX0Moc3JjLCBudW1fcGl4ZWxzICYgNywgZHN0KTsgIC8vIGxlZnQtb3ZlcnMKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1JHQlNodWZmbGVbM11bOF0gPSB7CisgIHsgIDIsICAxLCAgMCwgIDYsICA1LCAgNCwgMTAsICA5IH0sCisgIHsgIDgsIDE0LCAxMywgMTIsIDE4LCAxNywgMTYsIDIyIH0sCisgIHsgMjEsIDIwLCAyNiwgMjUsIDI0LCAzMCwgMjksIDI4IH0KK307CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0JfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IGVuZCA9IHNyYyArIChudW1fcGl4ZWxzICYgfjcpOworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZTAgPSB2bGQxX3U4KGtSR0JTaHVmZmxlWzBdKTsKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUxID0gdmxkMV91OChrUkdCU2h1ZmZsZVsxXSk7CisgIGNvbnN0IHVpbnQ4eDhfdCBzaHVmZmxlMiA9IHZsZDFfdTgoa1JHQlNodWZmbGVbMl0pOworICBmb3IgKDsgc3JjIDwgZW5kOyBzcmMgKz0gOCkgeworICAgIHVpbnQ4eDh4NF90IHBpeGVsczsKKyAgICBJTklUX1ZFQ1RPUjQocGl4ZWxzLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgMCkpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgMikpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgNCkpLAorICAgICAgICAgICAgICAgICB2bGQxX3U4KChjb25zdCB1aW50OF90Kikoc3JjICsgNikpKTsKKyAgICB2c3QxX3U4KGRzdCArICAwLCB2dGJsNF91OChwaXhlbHMsIHNodWZmbGUwKSk7CisgICAgdnN0MV91OChkc3QgKyAgOCwgdnRibDRfdTgocGl4ZWxzLCBzaHVmZmxlMSkpOworICAgIHZzdDFfdTgoZHN0ICsgMTYsIHZ0Ymw0X3U4KHBpeGVscywgc2h1ZmZsZTIpKTsKKyAgICBkc3QgKz0gOCAqIDM7CisgIH0KKyAgVlA4TENvbnZlcnRCR1JBVG9SR0JfQyhzcmMsIG51bV9waXhlbHMgJiA3LCBkc3QpOyAgLy8gbGVmdC1vdmVycworfQorCisjZW5kaWYgICAvLyAhV09SS19BUk9VTkRfR0NDCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVkaWN0b3IgVHJhbnNmb3JtCisKKyNkZWZpbmUgTE9BRF9VMzJfQVNfVTgoSU4pIHZyZWludGVycHJldF91OF91MzIodmR1cF9uX3UzMigoSU4pKSkKKyNkZWZpbmUgTE9BRF9VMzJQX0FTX1U4KElOKSB2cmVpbnRlcnByZXRfdThfdTMyKHZsZDFfdTMyKChJTikpKQorI2RlZmluZSBMT0FEUV9VMzJfQVNfVTgoSU4pIHZyZWludGVycHJldHFfdThfdTMyKHZkdXBxX25fdTMyKChJTikpKQorI2RlZmluZSBMT0FEUV9VMzJQX0FTX1U4KElOKSB2cmVpbnRlcnByZXRxX3U4X3UzMih2bGQxcV91MzIoKElOKSkpCisjZGVmaW5lIEdFVF9VOF9BU19VMzIoSU4pIHZnZXRfbGFuZV91MzIodnJlaW50ZXJwcmV0X3UzMl91OCgoSU4pKSwgMCk7CisjZGVmaW5lIEdFVFFfVThfQVNfVTMyKElOKSB2Z2V0cV9sYW5lX3UzMih2cmVpbnRlcnByZXRxX3UzMl91OCgoSU4pKSwgMCk7CisjZGVmaW5lIFNUT1JFUV9VOF9BU19VMzJQKE9VVCwgSU4pIHZzdDFxX3UzMigoT1VUKSwgdnJlaW50ZXJwcmV0cV91MzJfdTgoKElOKSkpOworI2RlZmluZSBST1RBVEUzMl9MRUZUKEwpIHZleHRxX3U4KChMKSwgKEwpLCAxMikgICAgLy8gRHxDfEJ8QSAtPiBDfEJ8QXxECisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHg4X3QgQXZlcmFnZTJfdThfTkVPTih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgY29uc3QgdWludDh4OF90IEEwID0gTE9BRF9VMzJfQVNfVTgoYTApOworICBjb25zdCB1aW50OHg4X3QgQTEgPSBMT0FEX1UzMl9BU19VOChhMSk7CisgIHJldHVybiB2aGFkZF91OChBMCwgQTEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZl9ORU9OKHVpbnQzMl90IGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgdWludDh4OF90IGF2ZyA9IEF2ZXJhZ2UyX3U4X05FT04oYzAsIGMxKTsKKyAgLy8gUmVtb3ZlIG9uZSB0byBjMiB3aGVuIGJpZ2dlciB0aGFuIGF2Zy4KKyAgY29uc3QgdWludDh4OF90IEMyID0gTE9BRF9VMzJfQVNfVTgoYzIpOworICBjb25zdCB1aW50OHg4X3QgY21wID0gdmNndF91OChDMiwgYXZnKTsKKyAgY29uc3QgdWludDh4OF90IEMyXzEgPSB2YWRkX3U4KEMyLCBjbXApOworICAvLyBDb21wdXRlIGhhbGYgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhdmcgYW5kIGMyLgorICBjb25zdCBpbnQ4eDhfdCBkaWZmX2F2ZyA9IHZyZWludGVycHJldF9zOF91OCh2aHN1Yl91OChhdmcsIEMyXzEpKTsKKyAgLy8gQ29tcHV0ZSB0aGUgc3VtIHdpdGggYXZnIGFuZCBzYXR1cmF0ZS4KKyAgY29uc3QgaW50MTZ4OF90IGF2Z18xNiA9IHZyZWludGVycHJldHFfczE2X3UxNih2bW92bF91OChhdmcpKTsKKyAgY29uc3QgdWludDh4OF90IHJlcyA9IHZxbW92dW5fczE2KHZhZGR3X3M4KGF2Z18xNiwgZGlmZl9hdmcpKTsKKyAgY29uc3QgdWludDMyX3Qgb3V0cHV0ID0gR0VUX1U4X0FTX1UzMihyZXMpOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTJfTkVPTih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgY29uc3QgdWludDh4OF90IGF2Z191OHg4ID0gQXZlcmFnZTJfdThfTkVPTihhMCwgYTEpOworICBjb25zdCB1aW50MzJfdCBhdmcgPSBHRVRfVThfQVNfVTMyKGF2Z191OHg4KTsKKyAgcmV0dXJuIGF2ZzsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2UzX05FT04odWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIpIHsKKyAgY29uc3QgdWludDh4OF90IGF2ZzAgPSBBdmVyYWdlMl91OF9ORU9OKGEwLCBhMik7CisgIGNvbnN0IHVpbnQ4eDhfdCBBMSA9IExPQURfVTMyX0FTX1U4KGExKTsKKyAgY29uc3QgdWludDMyX3QgYXZnID0gR0VUX1U4X0FTX1UzMih2aGFkZF91OChhdmcwLCBBMSkpOworICByZXR1cm4gYXZnOworfQorCitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNV9ORU9OKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgcmV0dXJuIEF2ZXJhZ2UzX05FT04obGVmdCwgdG9wWzBdLCB0b3BbMV0pOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjZfTkVPTih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlMl9ORU9OKGxlZnQsIHRvcFstMV0pOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjdfTkVPTih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBBdmVyYWdlMl9ORU9OKGxlZnQsIHRvcFswXSk7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTNfTkVPTih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIHJldHVybiBDbGFtcGVkQWRkU3VidHJhY3RIYWxmX05FT04obGVmdCwgdG9wWzBdLCB0b3BbLTFdKTsKK30KKworLy8gQmF0Y2ggdmVyc2lvbnMgb2YgdGhvc2UgZnVuY3Rpb25zLgorCisvLyBQcmVkaWN0b3IwOiBBUkdCX0JMQUNLLgorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMF9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCB1aW50OHgxNl90IGJsYWNrID0gdnJlaW50ZXJwcmV0cV91OF91MzIodmR1cHFfbl91MzIoQVJHQl9CTEFDSykpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZhZGRxX3U4KHNyYywgYmxhY2spOworICAgIFNUT1JFUV9VOF9BU19VMzJQKCZvdXRbaV0sIHJlcyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1swXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorCisvLyBQcmVkaWN0b3IxOiBsZWZ0Lgorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMV9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCB1aW50OHgxNl90IHplcm8gPSBMT0FEUV9VMzJfQVNfVTgoMCk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIC8vIGEgfCBiIHwgYyB8IGQKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICAvLyAwIHwgYSB8IGIgfCBjCisgICAgY29uc3QgdWludDh4MTZfdCBzaGlmdDAgPSB2ZXh0cV91OCh6ZXJvLCBzcmMsIDEyKTsKKyAgICAvLyBhIHwgYSArIGIgfCBiICsgYyB8IGMgKyBkCisgICAgY29uc3QgdWludDh4MTZfdCBzdW0wID0gdmFkZHFfdTgoc3JjLCBzaGlmdDApOworICAgIC8vIDAgfCAwIHwgYSB8IGEgKyBiCisgICAgY29uc3QgdWludDh4MTZfdCBzaGlmdDEgPSB2ZXh0cV91OCh6ZXJvLCBzdW0wLCA4KTsKKyAgICAvLyBhIHwgYSArIGIgfCBhICsgYiArIGMgfCBhICsgYiArIGMgKyBkCisgICAgY29uc3QgdWludDh4MTZfdCBzdW0xID0gdmFkZHFfdTgoc3VtMCwgc2hpZnQxKTsKKyAgICBjb25zdCB1aW50OHgxNl90IHByZXYgPSBMT0FEUV9VMzJfQVNfVTgob3V0W2kgLSAxXSk7CisgICAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChzdW0xLCBwcmV2KTsKKyAgICBTVE9SRVFfVThfQVNfVTMyUCgmb3V0W2ldLCByZXMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKworLy8gTWFjcm8gdGhhdCBhZGRzIDMyLWJpdCBpbnRlZ2VycyBmcm9tIElOIHVzaW5nIG1vZCAyNTYgYXJpdGhtZXRpYworLy8gcGVyIDggYml0IGNoYW5uZWwuCisjZGVmaW5lIEdFTkVSQVRFX1BSRURJQ1RPUl8xKFgsIElOKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZCMjWCMjX05FT04oY29uc3QgdWludDMyX3QqIGluLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdXBwZXIsIGludCBudW1fcGl4ZWxzLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IG90aGVyID0gTE9BRFFfVTMyUF9BU19VOCgmKElOKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoc3JjLCBvdGhlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RPUkVRX1U4X0FTX1UzMlAoJm91dFtpXSwgcmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBWUDhMUHJlZGljdG9yc0FkZF9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICBcCit9CisvLyBQcmVkaWN0b3IyOiBUb3AuCitHRU5FUkFURV9QUkVESUNUT1JfMSgyLCB1cHBlcltpXSkKKy8vIFByZWRpY3RvcjM6IFRvcC1yaWdodC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDMsIHVwcGVyW2kgKyAxXSkKKy8vIFByZWRpY3RvcjQ6IFRvcC1sZWZ0LgorR0VORVJBVEVfUFJFRElDVE9SXzEoNCwgdXBwZXJbaSAtIDFdKQorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8xCisKKy8vIFByZWRpY3RvcjU6IGF2ZXJhZ2UoYXZlcmFnZShsZWZ0LCBUUiksIFQpCisjZGVmaW5lIERPX1BSRUQ1KExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2Z0xUUiA9IHZoYWRkcV91OChMLCBUUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmcgPSB2aGFkZHFfdTgoYXZnTFRSLCBUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoYXZnLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxcV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRxX3UzMl91OChyZXMpLCAoTEFORSkpOyAgIFwKKyAgTCA9IFJPVEFURTMyX0xFRlQocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQ1X05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSArIDBdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFRSID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSArIDFdKTsKKyAgICBET19QUkVENSgwKTsKKyAgICBET19QUkVENSgxKTsKKyAgICBET19QUkVENSgyKTsKKyAgICBET19QUkVENSgzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzVdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDUKKworI2RlZmluZSBET19QUkVENjcoTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmcgPSB2aGFkZHFfdTgoTCwgdG9wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoYXZnLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxcV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRxX3UzMl91OChyZXMpLCAoTEFORSkpOyAgIFwKKyAgTCA9IFJPVEFURTMyX0xFRlQocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBQcmVkaWN0b3I2OiBhdmVyYWdlKGxlZnQsIFRMKQorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkNl9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgdG9wID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSAtIDFdKTsKKyAgICBET19QUkVENjcoMCk7CisgICAgRE9fUFJFRDY3KDEpOworICAgIERPX1BSRUQ2NygyKTsKKyAgICBET19QUkVENjcoMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1s2XShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorCisvLyBQcmVkaWN0b3I3OiBhdmVyYWdlKGxlZnQsIFQpCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQ3X05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBzcmMgPSBMT0FEUV9VMzJQX0FTX1U4KCZpbltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCB0b3AgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7CisgICAgRE9fUFJFRDY3KDApOworICAgIERPX1BSRUQ2NygxKTsKKyAgICBET19QUkVENjcoMik7CisgICAgRE9fUFJFRDY3KDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbN10oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVENjcKKworI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMihYLCBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQjI1gjI19ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHVwcGVyLCBpbnQgbnVtX3BpeGVscywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCBUb3RoZXIgPSBMT0FEUV9VMzJQX0FTX1U4KCYoSU4pKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDE2X3QgYXZnID0gdmhhZGRxX3U4KFQsIFRvdGhlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDh4MTZfdCByZXMgPSB2YWRkcV91OChhdmcsIHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVE9SRVFfVThfQVNfVTMyUCgmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZQOExQcmVkaWN0b3JzQWRkX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgIFwKK30KKy8vIFByZWRpY3Rvcjg6IGF2ZXJhZ2UgVEwgVC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDgsIHVwcGVyW2kgLSAxXSkKKy8vIFByZWRpY3Rvcjk6IGF2ZXJhZ2UgVCBUUi4KK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDksIHVwcGVyW2kgKyAxXSkKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMgorCisvLyBQcmVkaWN0b3IxMDogYXZlcmFnZSBvZiAoYXZlcmFnZSBvZiAoTCxUTCksIGF2ZXJhZ2Ugb2YgKFQsIFRSKSkuCisjZGVmaW5lIERPX1BSRUQxMChMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2Z0xUTCA9IHZoYWRkcV91OChMLCBUTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBhdmcgPSB2aGFkZHFfdTgoYXZnVFRSLCBhdmdMVEwpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcmVzID0gdmFkZHFfdTgoYXZnLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxcV9sYW5lX3UzMigmb3V0W2kgKyAoTEFORSldLCB2cmVpbnRlcnByZXRxX3UzMl91OChyZXMpLCAoTEFORSkpOyAgIFwKKyAgTCA9IFJPVEFURTMyX0xFRlQocmVzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMF9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDh4MTZfdCBMID0gTE9BRFFfVTMyX0FTX1U4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBjb25zdCB1aW50OHgxNl90IHNyYyA9IExPQURRX1UzMlBfQVNfVTgoJmluW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFRMID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFQgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBUUiA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2kgKyAxXSk7CisgICAgY29uc3QgdWludDh4MTZfdCBhdmdUVFIgPSB2aGFkZHFfdTgoVCwgVFIpOworICAgIERPX1BSRUQxMCgwKTsKKyAgICBET19QUkVEMTAoMSk7CisgICAgRE9fUFJFRDEwKDIpOworICAgIERPX1BSRUQxMCgzKTsKKyAgfQorICBWUDhMUHJlZGljdG9yc0FkZF9DWzEwXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworfQorI3VuZGVmIERPX1BSRUQxMAorCisvLyBQcmVkaWN0b3IxMTogc2VsZWN0LgorI2RlZmluZSBET19QUkVEMTEoTEFORSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBzdW1MaW4gPSB2YWRkcV91OChMLCBzcmMpOyAgLyogaW4gKyBMICovICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgcExUTCA9IHZhYmRxX3U4KEwsIFRMKTsgIC8qIHxMIC0gVEx8ICovICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MTZ4OF90IHN1bV9MVEwgPSB2cGFkZGxxX3U4KHBMVEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyeDRfdCBwYSA9IHZwYWRkbHFfdTE2KHN1bV9MVEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMng0X3QgbWFzayA9IHZjbGVxX3UzMihwYSwgcGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IHJlcyA9IHZic2xxX3U4KHZyZWludGVycHJldHFfdThfdTMyKG1hc2spLCBzdW1UaW4sIHN1bUxpbik7IFwKKyAgdnN0MXFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0cV91MzJfdTgocmVzKSwgKExBTkUpKTsgICAgICAgICBcCisgIEwgPSBST1RBVEUzMl9MRUZUKHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTFfTkVPTihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIHVpbnQ4eDE2X3QgTCA9IExPQURRX1UzMl9BU19VOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgY29uc3QgdWludDh4MTZfdCBUID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVEwgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgcFRUTCA9IHZhYmRxX3U4KFQsIFRMKTsgICAvLyB8VCAtIFRMfAorICAgIGNvbnN0IHVpbnQxNng4X3Qgc3VtX1RUTCA9IHZwYWRkbHFfdTgocFRUTCk7CisgICAgY29uc3QgdWludDMyeDRfdCBwYiA9IHZwYWRkbHFfdTE2KHN1bV9UVEwpOworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3VtVGluID0gdmFkZHFfdTgoVCwgc3JjKTsgICAvLyBpbiArIFQKKyAgICBET19QUkVEMTEoMCk7CisgICAgRE9fUFJFRDExKDEpOworICAgIERPX1BSRUQxMSgyKTsKKyAgICBET19QUkVEMTEoMyk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVEMTEKKworLy8gUHJlZGljdG9yMTI6IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGwuCisjZGVmaW5lIERPX1BSRUQxMihESUZGLCBMQU5FKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgcHJlZCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHZxbW92dW5fczE2KHZhZGRxX3MxNih2cmVpbnRlcnByZXRxX3MxNl91MTYoTCksIChESUZGKSkpOyAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCByZXMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdmFkZF91OChwcmVkLCAoTEFORSA8PSAxKSA/IHZnZXRfbG93X3U4KHNyYykgOiB2Z2V0X2hpZ2hfdTgoc3JjKSk7IFwKKyAgY29uc3QgdWludDE2eDhfdCByZXMxNiA9IHZtb3ZsX3U4KHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0X3UzMl91OChyZXMpLCAoTEFORSkgJiAxKTsgXAorICAvKiByb3RhdGUgaW4gdGhlIGxlZnQgcHJlZGljdG9yIGZvciBuZXh0IGl0ZXJhdGlvbiAqLyAgICAgICAgICAgICAgICAgIFwKKyAgTCA9IHZleHRxX3UxNihyZXMxNiwgcmVzMTYsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBQcmVkaWN0b3JBZGQxMl9ORU9OKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDMyX3QqIG91dCkgeworICBpbnQgaTsKKyAgdWludDE2eDhfdCBMID0gdm1vdmxfdTgoTE9BRF9VMzJfQVNfVTgob3V0Wy0xXSkpOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICAvLyBsb2FkIGZvdXIgcGl4ZWxzIG9mIHNvdXJjZQorICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIC8vIHByZWNvbXB1dGUgdGhlIGRpZmZlcmVuY2UgVCAtIFRMIG9uY2UgZm9yIGFsbCwgc3RvcmVkIGFzIHMxNgorICAgIGNvbnN0IHVpbnQ4eDE2X3QgVEwgPSBMT0FEUV9VMzJQX0FTX1U4KCZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZGlmZl9sbyA9CisgICAgICAgIHZyZWludGVycHJldHFfczE2X3UxNih2c3VibF91OCh2Z2V0X2xvd191OChUKSwgdmdldF9sb3dfdTgoVEwpKSk7CisgICAgY29uc3QgaW50MTZ4OF90IGRpZmZfaGkgPQorICAgICAgICB2cmVpbnRlcnByZXRxX3MxNl91MTYodnN1YmxfdTgodmdldF9oaWdoX3U4KFQpLCB2Z2V0X2hpZ2hfdTgoVEwpKSk7CisgICAgLy8gbG9vcCBvdmVyIHRoZSBmb3VyIHJlY29uc3RydWN0ZWQgcGl4ZWxzCisgICAgRE9fUFJFRDEyKGRpZmZfbG8sIDApOworICAgIERPX1BSRUQxMihkaWZmX2xvLCAxKTsKKyAgICBET19QUkVEMTIoZGlmZl9oaSwgMik7CisgICAgRE9fUFJFRDEyKGRpZmZfaGksIDMpOworICB9CisgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTJdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7Cit9CisjdW5kZWYgRE9fUFJFRDEyCisKKy8vIFByZWRpY3RvcjEzOiBDbGFtcGVkQWRkU3VidHJhY3RIYWxmCisjZGVmaW5lIERPX1BSRUQxMyhMQU5FLCBMT1dfT1JfSEkpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHgxNl90IGF2ZyA9IHZoYWRkcV91OChMLCBUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCBjbXAgPSB2Y2d0cV91OChUTCwgYXZnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDE2X3QgVExfMSA9IHZhZGRxX3U4KFRMLCBjbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBDb21wdXRlIGhhbGYgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBhdmcgYW5kIFRMJy4gKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50OHg4X3QgZGlmZl9hdmcgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB2cmVpbnRlcnByZXRfczhfdTgoTE9XX09SX0hJKHZoc3VicV91OChhdmcsIFRMXzEpKSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBDb21wdXRlIHRoZSBzdW0gd2l0aCBhdmcgYW5kIHNhdHVyYXRlLiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50MTZ4OF90IGF2Z18xNiA9IHZyZWludGVycHJldHFfczE2X3UxNih2bW92bF91OChMT1dfT1JfSEkoYXZnKSkpOyAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBkZWx0YSA9IHZxbW92dW5fczE2KHZhZGR3X3M4KGF2Z18xNiwgZGlmZl9hdmcpKTsgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgcmVzID0gdmFkZF91OChMT1dfT1JfSEkoc3JjKSwgZGVsdGEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDh4MTZfdCByZXMyID0gdmNvbWJpbmVfdTgocmVzLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDFfbGFuZV91MzIoJm91dFtpICsgKExBTkUpXSwgdnJlaW50ZXJwcmV0X3UzMl91OChyZXMpLCAoTEFORSkgJiAxKTsgICAgICAgXAorICBMID0gUk9UQVRFMzJfTEVGVChyZXMyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDEzX05FT04oY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICB1aW50OHgxNl90IEwgPSBMT0FEUV9VMzJfQVNfVTgob3V0Wy0xXSk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3Qgc3JjID0gTE9BRFFfVTMyUF9BU19VOCgmaW5baV0pOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgVCA9IExPQURRX1UzMlBfQVNfVTgoJnVwcGVyW2ldKTsKKyAgICBjb25zdCB1aW50OHgxNl90IFRMID0gTE9BRFFfVTMyUF9BU19VOCgmdXBwZXJbaSAtIDFdKTsKKyAgICBET19QUkVEMTMoMCwgdmdldF9sb3dfdTgpOworICAgIERPX1BSRUQxMygxLCB2Z2V0X2xvd191OCk7CisgICAgRE9fUFJFRDEzKDIsIHZnZXRfaGlnaF91OCk7CisgICAgRE9fUFJFRDEzKDMsIHZnZXRfaGlnaF91OCk7CisgIH0KKyAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxM10oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKK30KKyN1bmRlZiBET19QUkVEMTMKKworI3VuZGVmIExPQURfVTMyX0FTX1U4CisjdW5kZWYgTE9BRF9VMzJQX0FTX1U4CisjdW5kZWYgTE9BRFFfVTMyX0FTX1U4CisjdW5kZWYgTE9BRFFfVTMyUF9BU19VOAorI3VuZGVmIEdFVF9VOF9BU19VMzIKKyN1bmRlZiBHRVRRX1U4X0FTX1UzMgorI3VuZGVmIFNUT1JFUV9VOF9BU19VMzJQCisjdW5kZWYgUk9UQVRFMzJfTEVGVAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKKy8vIHZ0Ymw/X3U4IGFyZSBtYXJrZWQgdW5hdmFpbGFibGUgZm9yIGlPUyBhcm02NCB3aXRoIFhjb2RlIDwgNi4zLCB1c2UKKy8vIG5vbi1zdGFuZGFyZCB2ZXJzaW9ucyB0aGVyZS4KKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgZGVmaW5lZChfX2FhcmNoNjRfXykgJiYgXAorICAgIGRlZmluZWQoX19hcHBsZV9idWlsZF92ZXJzaW9uX18pICYmIChfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXzwgNjAyMDAzNykKKyNkZWZpbmUgVVNFX1ZUQkxRCisjZW5kaWYKKworI2lmZGVmIFVTRV9WVEJMUQorLy8gMjU1ID0gYnl0ZSB3aWxsIGJlIHplcm9lZAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0dyZWVuU2h1ZmZsZVsxNl0gPSB7CisgIDEsIDI1NSwgMSwgMjU1LCA1LCAyNTUsIDUsIDI1NSwgOSwgMjU1LCA5LCAyNTUsIDEzLCAyNTUsIDEzLCAyNTUKK307CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OHgxNl90IERvR3JlZW5TaHVmZmxlX05FT04oY29uc3QgdWludDh4MTZfdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OHgxNl90IHNodWZmbGUpIHsKKyAgcmV0dXJuIHZjb21iaW5lX3U4KHZ0YmwxcV91OChhcmdiLCB2Z2V0X2xvd191OChzaHVmZmxlKSksCisgICAgICAgICAgICAgICAgICAgICB2dGJsMXFfdTgoYXJnYiwgdmdldF9oaWdoX3U4KHNodWZmbGUpKSk7Cit9CisjZWxzZSAgLy8gIVVTRV9WVEJMUQorLy8gMjU1ID0gYnl0ZSB3aWxsIGJlIHplcm9lZAorc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0dyZWVuU2h1ZmZsZVs4XSA9IHsgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1ICB9OworCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDh4MTZfdCBEb0dyZWVuU2h1ZmZsZV9ORU9OKGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4OF90IHNodWZmbGUpIHsKKyAgcmV0dXJuIHZjb21iaW5lX3U4KHZ0YmwxX3U4KHZnZXRfbG93X3U4KGFyZ2IpLCBzaHVmZmxlKSwKKyAgICAgICAgICAgICAgICAgICAgIHZ0YmwxX3U4KHZnZXRfaGlnaF91OChhcmdiKSwgc2h1ZmZsZSkpOworfQorI2VuZGlmICAvLyBVU0VfVlRCTFEKKworc3RhdGljIHZvaWQgQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTkVPTihjb25zdCB1aW50MzJfdCogc3JjLCBpbnQgbnVtX3BpeGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCkgeworICBjb25zdCB1aW50MzJfdCogY29uc3QgZW5kID0gc3JjICsgKG51bV9waXhlbHMgJiB+Myk7CisjaWZkZWYgVVNFX1ZUQkxRCisgIGNvbnN0IHVpbnQ4eDE2X3Qgc2h1ZmZsZSA9IHZsZDFxX3U4KGtHcmVlblNodWZmbGUpOworI2Vsc2UKKyAgY29uc3QgdWludDh4OF90IHNodWZmbGUgPSB2bGQxX3U4KGtHcmVlblNodWZmbGUpOworI2VuZGlmCisgIGZvciAoOyBzcmMgPCBlbmQ7IHNyYyArPSA0LCBkc3QgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgYXJnYiA9IHZsZDFxX3U4KChjb25zdCB1aW50OF90KilzcmMpOworICAgIGNvbnN0IHVpbnQ4eDE2X3QgZ3JlZW5zID0gRG9HcmVlblNodWZmbGVfTkVPTihhcmdiLCBzaHVmZmxlKTsKKyAgICB2c3QxcV91OCgodWludDhfdCopZHN0LCB2YWRkcV91OChhcmdiLCBncmVlbnMpKTsKKyAgfQorICAvLyBmYWxsdGhyb3VnaCBhbmQgZmluaXNoIG9mZiB3aXRoIHBsYWluLUMKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0Moc3JjLCBudW1fcGl4ZWxzICYgMywgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbG9yIFRyYW5zZm9ybQorCitzdGF0aWMgdm9pZCBUcmFuc2Zvcm1Db2xvckludmVyc2VfTkVPTihjb25zdCBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBkc3QpIHsKKy8vIHNpZ24tZXh0ZW5kZWQgbXVsdGlwbHlpbmcgY29uc3RhbnRzLCBwcmUtc2hpZnRlZCBieSA2LgorI2RlZmluZSBDU1QoWCkgICgoKGludDE2X3QpKG0tPlggPDwgOCkpID4+IDYpCisgIGNvbnN0IGludDE2X3QgcmJbOF0gPSB7CisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pLAorICAgIENTVChncmVlbl90b19ibHVlXyksIENTVChncmVlbl90b19yZWRfKSwKKyAgICBDU1QoZ3JlZW5fdG9fYmx1ZV8pLCBDU1QoZ3JlZW5fdG9fcmVkXyksCisgICAgQ1NUKGdyZWVuX3RvX2JsdWVfKSwgQ1NUKGdyZWVuX3RvX3JlZF8pCisgIH07CisgIGNvbnN0IGludDE2eDhfdCBtdWx0c19yYiA9IHZsZDFxX3MxNihyYik7CisgIGNvbnN0IGludDE2X3QgYjJbOF0gPSB7CisgICAgMCwgQ1NUKHJlZF90b19ibHVlXyksIDAsIENTVChyZWRfdG9fYmx1ZV8pLAorICAgIDAsIENTVChyZWRfdG9fYmx1ZV8pLCAwLCBDU1QocmVkX3RvX2JsdWVfKSwKKyAgfTsKKyAgY29uc3QgaW50MTZ4OF90IG11bHRzX2IyID0gdmxkMXFfczE2KGIyKTsKKyN1bmRlZiBDU1QKKyNpZmRlZiBVU0VfVlRCTFEKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga2cwZzBbMTZdID0geworICAgIDI1NSwgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSwgMjU1LCA5LCAyNTUsIDksIDI1NSwgMTMsIDI1NSwgMTMKKyAgfTsKKyAgY29uc3QgdWludDh4MTZfdCBzaHVmZmxlID0gdmxkMXFfdTgoa2cwZzApOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgazBnMGdbOF0gPSB7IDI1NSwgMSwgMjU1LCAxLCAyNTUsIDUsIDI1NSwgNSB9OworICBjb25zdCB1aW50OHg4X3Qgc2h1ZmZsZSA9IHZsZDFfdTgoazBnMGcpOworI2VuZGlmCisgIGNvbnN0IHVpbnQzMng0X3QgbWFza19hZyA9IHZkdXBxX25fdTMyKDB4ZmYwMGZmMDB1KTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IHVpbnQ4eDE2X3QgaW4gPSB2bGQxcV91OCgoY29uc3QgdWludDhfdCopKHNyYyArIGkpKTsKKyAgICBjb25zdCB1aW50MzJ4NF90IGEwZzAgPSB2YW5kcV91MzIodnJlaW50ZXJwcmV0cV91MzJfdTgoaW4pLCBtYXNrX2FnKTsKKyAgICAvLyAwIGcgMCBnCisgICAgY29uc3QgdWludDh4MTZfdCBncmVlbnMgPSBEb0dyZWVuU2h1ZmZsZV9ORU9OKGluLCBzaHVmZmxlKTsKKyAgICAvLyB4IGRyICB4IGRiMQorICAgIGNvbnN0IGludDE2eDhfdCBBID0gdnFkbXVsaHFfczE2KHZyZWludGVycHJldHFfczE2X3U4KGdyZWVucyksIG11bHRzX3JiKTsKKyAgICAvLyB4IHInICB4ICAgYicKKyAgICBjb25zdCBpbnQ4eDE2X3QgQiA9IHZhZGRxX3M4KHZyZWludGVycHJldHFfczhfdTgoaW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zOF9zMTYoQSkpOworICAgIC8vIHInIDAgICBiJyAwCisgICAgY29uc3QgaW50MTZ4OF90IEMgPSB2c2hscV9uX3MxNih2cmVpbnRlcnByZXRxX3MxNl9zOChCKSwgOCk7CisgICAgLy8geCBkYjIgIDAgIDAKKyAgICBjb25zdCBpbnQxNng4X3QgRCA9IHZxZG11bGhxX3MxNihDLCBtdWx0c19iMik7CisgICAgLy8gMCAgeCBkYjIgIDAKKyAgICBjb25zdCB1aW50MzJ4NF90IEUgPSB2c2hycV9uX3UzMih2cmVpbnRlcnByZXRxX3UzMl9zMTYoRCksIDgpOworICAgIC8vIHInIHggIGInJyAwCisgICAgY29uc3QgaW50OHgxNl90IEYgPSB2YWRkcV9zOCh2cmVpbnRlcnByZXRxX3M4X3UzMihFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZyZWludGVycHJldHFfczhfczE2KEMpKTsKKyAgICAvLyAwICByJyAgMCAgYicnCisgICAgY29uc3QgdWludDE2eDhfdCBHID0gdnNocnFfbl91MTYodnJlaW50ZXJwcmV0cV91MTZfczgoRiksIDgpOworICAgIGNvbnN0IHVpbnQzMng0X3Qgb3V0ID0gdm9ycnFfdTMyKHZyZWludGVycHJldHFfdTMyX3UxNihHKSwgYTBnMCk7CisgICAgdnN0MXFfdTMyKGRzdCArIGksIG91dCk7CisgIH0KKyAgLy8gRmFsbC1iYWNrIHRvIEMtdmVyc2lvbiBmb3IgbGVmdC1vdmVycy4KKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9DKG0sIHNyYyArIGksIG51bV9waXhlbHMgLSBpLCBkc3QgKyBpKTsKK30KKworI3VuZGVmIFVTRV9WVEJMUQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgVlA4TERzcEluaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgVlA4TERzcEluaXRORU9OKHZvaWQpIHsKKyAgVlA4TFByZWRpY3RvcnNbNV0gPSBQcmVkaWN0b3I1X05FT047CisgIFZQOExQcmVkaWN0b3JzWzZdID0gUHJlZGljdG9yNl9ORU9OOworICBWUDhMUHJlZGljdG9yc1s3XSA9IFByZWRpY3RvcjdfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNbMTNdID0gUHJlZGljdG9yMTNfTkVPTjsKKworICBWUDhMUHJlZGljdG9yc0FkZFswXSA9IFByZWRpY3RvckFkZDBfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMV0gPSBQcmVkaWN0b3JBZGQxX05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzJdID0gUHJlZGljdG9yQWRkMl9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFszXSA9IFByZWRpY3RvckFkZDNfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNF0gPSBQcmVkaWN0b3JBZGQ0X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzVdID0gUHJlZGljdG9yQWRkNV9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs2XSA9IFByZWRpY3RvckFkZDZfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbN10gPSBQcmVkaWN0b3JBZGQ3X05FT047CisgIFZQOExQcmVkaWN0b3JzQWRkWzhdID0gUHJlZGljdG9yQWRkOF9ORU9OOworICBWUDhMUHJlZGljdG9yc0FkZFs5XSA9IFByZWRpY3RvckFkZDlfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTBdID0gUHJlZGljdG9yQWRkMTBfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTFdID0gUHJlZGljdG9yQWRkMTFfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTJdID0gUHJlZGljdG9yQWRkMTJfTkVPTjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbMTNdID0gUHJlZGljdG9yQWRkMTNfTkVPTjsKKworICBWUDhMQ29udmVydEJHUkFUb1JHQkEgPSBDb252ZXJ0QkdSQVRvUkdCQV9ORU9OOworICBWUDhMQ29udmVydEJHUkFUb0JHUiA9IENvbnZlcnRCR1JBVG9CR1JfTkVPTjsKKyAgVlA4TENvbnZlcnRCR1JBVG9SR0IgPSBDb252ZXJ0QkdSQVRvUkdCX05FT047CisKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWRfTkVPTjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9ORU9OOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFZQOExEc3BJbml0TkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbG9zc2xlc3Nfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDc1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL2xvc3NsZXNzX3NzZTIuYwpAQCAtMCwwICsxLDcwNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFNTRTIgdmFyaWFudCBvZiBtZXRob2RzIGZvciBsb3NzbGVzcyBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQcmVkaWN0b3IgVHJhbnNmb3JtCisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBDbGFtcGVkQWRkU3VidHJhY3RGdWxsX1NTRTIodWludDMyX3QgYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzApLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMxKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMiksIHplcm8pOworICBjb25zdCBfX20xMjhpIFYxID0gX21tX2FkZF9lcGkxNihDMCwgQzEpOworICBjb25zdCBfX20xMjhpIFYyID0gX21tX3N1Yl9lcGkxNihWMSwgQzIpOworICBjb25zdCBfX20xMjhpIGIgPSBfbW1fcGFja3VzX2VwaTE2KFYyLCBWMik7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKGIpOworICByZXR1cm4gb3V0cHV0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQ2xhbXBlZEFkZFN1YnRyYWN0SGFsZl9TU0UyKHVpbnQzMl90IGMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYzIpIHsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBDMCA9IF9tbV91bnBhY2tsb19lcGk4KF9tbV9jdnRzaTMyX3NpMTI4KGMwKSwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChjMSksIHplcm8pOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYzIpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBhdmcgPSBfbW1fYWRkX2VwaTE2KEMxLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fc3JsaV9lcGkxNihhdmcsIDEpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3N1Yl9lcGkxNihBMCwgQjApOworICBjb25zdCBfX20xMjhpIEJndEEgPSBfbW1fY21wZ3RfZXBpMTYoQjAsIEEwKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9zdWJfZXBpMTYoQTEsIEJndEEpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NyYWlfZXBpMTYoQTIsIDEpOworICBjb25zdCBfX20xMjhpIEE0ID0gX21tX2FkZF9lcGkxNihBMCwgQTMpOworICBjb25zdCBfX20xMjhpIEE1ID0gX21tX3BhY2t1c19lcGkxNihBNCwgQTQpOworICBjb25zdCB1aW50MzJfdCBvdXRwdXQgPSBfbW1fY3Z0c2kxMjhfc2kzMihBNSk7CisgIHJldHVybiBvdXRwdXQ7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWxlY3RfU1NFMih1aW50MzJfdCBhLCB1aW50MzJfdCBiLCB1aW50MzJfdCBjKSB7CisgIGludCBwYV9taW51c19wYjsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9jdnRzaTMyX3NpMTI4KGEpOworICBjb25zdCBfX20xMjhpIEIwID0gX21tX2N2dHNpMzJfc2kxMjgoYik7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fY3Z0c2kzMl9zaTEyOChjKTsKKyAgY29uc3QgX19tMTI4aSBBQzAgPSBfbW1fc3Vic19lcHU4KEEwLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgQ0EwID0gX21tX3N1YnNfZXB1OChDMCwgQTApOworICBjb25zdCBfX20xMjhpIEJDMCA9IF9tbV9zdWJzX2VwdTgoQjAsIEMwKTsKKyAgY29uc3QgX19tMTI4aSBDQjAgPSBfbW1fc3Vic19lcHU4KEMwLCBCMCk7CisgIGNvbnN0IF9fbTEyOGkgQUMgPSBfbW1fb3Jfc2kxMjgoQUMwLCBDQTApOworICBjb25zdCBfX20xMjhpIEJDID0gX21tX29yX3NpMTI4KEJDMCwgQ0IwKTsKKyAgY29uc3QgX19tMTI4aSBwYSA9IF9tbV91bnBhY2tsb19lcGk4KEFDLCB6ZXJvKTsgIC8vIHxhIC0gY3wKKyAgY29uc3QgX19tMTI4aSBwYiA9IF9tbV91bnBhY2tsb19lcGk4KEJDLCB6ZXJvKTsgIC8vIHxiIC0gY3wKKyAgY29uc3QgX19tMTI4aSBkaWZmID0gX21tX3N1Yl9lcGkxNihwYiwgcGEpOworICB7CisgICAgaW50MTZfdCBvdXRbOF07CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopb3V0LCBkaWZmKTsKKyAgICBwYV9taW51c19wYiA9IG91dFswXSArIG91dFsxXSArIG91dFsyXSArIG91dFszXTsKKyAgfQorICByZXR1cm4gKHBhX21pbnVzX3BiIDw9IDApID8gYSA6IGI7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEF2ZXJhZ2UyX20xMjhpKGNvbnN0IF9fbTEyOGkqIGNvbnN0IGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBhdmcpIHsKKyAgLy8gKGEgKyBiKSA+PiAxID0gKChhICsgYiArIDEpID4+IDEpIC0gKChhIF4gYikgJiAxKQorICBjb25zdCBfX20xMjhpIG9uZXMgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoKmEwLCAqYTEpOworICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9hbmRfc2kxMjgoX21tX3hvcl9zaTEyOCgqYTAsICphMSksIG9uZXMpOworICAqYXZnID0gX21tX3N1Yl9lcGk4KGF2ZzEsIG9uZSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEF2ZXJhZ2UyX3VpbnQzMl9TU0UyKGNvbnN0IHVpbnQzMl90IGEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBhdmcpIHsKKyAgLy8gKGEgKyBiKSA+PiAxID0gKChhICsgYiArIDEpID4+IDEpIC0gKChhIF4gYikgJiAxKQorICBjb25zdCBfX20xMjhpIG9uZXMgPSBfbW1fc2V0MV9lcGk4KDEpOworICBjb25zdCBfX20xMjhpIEEwID0gX21tX2N2dHNpMzJfc2kxMjgoYTApOworICBjb25zdCBfX20xMjhpIEExID0gX21tX2N2dHNpMzJfc2kxMjgoYTEpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBfbW1fYXZnX2VwdTgoQTAsIEExKTsKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgoQTAsIEExKSwgb25lcyk7CisgICphdmcgPSBfbW1fc3ViX2VwaTgoYXZnMSwgb25lKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgQXZlcmFnZTJfdWludDMyXzE2X1NTRTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fdW5wYWNrbG9fZXBpOChfbW1fY3Z0c2kzMl9zaTEyOChhMCksIHplcm8pOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYTEpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KEExLCBBMCk7CisgIHJldHVybiBfbW1fc3JsaV9lcGkxNihzdW0sIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTJfU1NFMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEpIHsKKyAgX19tMTI4aSBvdXRwdXQ7CisgIEF2ZXJhZ2UyX3VpbnQzMl9TU0UyKGEwLCBhMSwgJm91dHB1dCk7CisgIHJldHVybiBfbW1fY3Z0c2kxMjhfc2kzMihvdXRwdXQpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgQXZlcmFnZTNfU1NFMih1aW50MzJfdCBhMCwgdWludDMyX3QgYTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhMikgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIGF2ZzEgPSBBdmVyYWdlMl91aW50MzJfMTZfU1NFMihhMCwgYTIpOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3VucGFja2xvX2VwaTgoX21tX2N2dHNpMzJfc2kxMjgoYTEpLCB6ZXJvKTsKKyAgY29uc3QgX19tMTI4aSBzdW0gPSBfbW1fYWRkX2VwaTE2KGF2ZzEsIEExKTsKKyAgY29uc3QgX19tMTI4aSBhdmcyID0gX21tX3NybGlfZXBpMTYoc3VtLCAxKTsKKyAgY29uc3QgX19tMTI4aSBBMiA9IF9tbV9wYWNrdXNfZXBpMTYoYXZnMiwgYXZnMik7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKEEyKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEF2ZXJhZ2U0X1NTRTIodWludDMyX3QgYTAsIHVpbnQzMl90IGExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYTIsIHVpbnQzMl90IGEzKSB7CisgIGNvbnN0IF9fbTEyOGkgYXZnMSA9IEF2ZXJhZ2UyX3VpbnQzMl8xNl9TU0UyKGEwLCBhMSk7CisgIGNvbnN0IF9fbTEyOGkgYXZnMiA9IEF2ZXJhZ2UyX3VpbnQzMl8xNl9TU0UyKGEyLCBhMyk7CisgIGNvbnN0IF9fbTEyOGkgc3VtID0gX21tX2FkZF9lcGkxNihhdmcyLCBhdmcxKTsKKyAgY29uc3QgX19tMTI4aSBhdmczID0gX21tX3NybGlfZXBpMTYoc3VtLCAxKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9wYWNrdXNfZXBpMTYoYXZnMywgYXZnMyk7CisgIGNvbnN0IHVpbnQzMl90IG91dHB1dCA9IF9tbV9jdnRzaTEyOF9zaTMyKEEwKTsKKyAgcmV0dXJuIG91dHB1dDsKK30KKworc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjVfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlM19TU0UyKGxlZnQsIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yNl9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IEF2ZXJhZ2UyX1NTRTIobGVmdCwgdG9wWy0xXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjdfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMl9TU0UyKGxlZnQsIHRvcFswXSk7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjhfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMl9TU0UyKHRvcFstMV0sIHRvcFswXSk7CisgICh2b2lkKWxlZnQ7CisgIHJldHVybiBwcmVkOworfQorc3RhdGljIHVpbnQzMl90IFByZWRpY3RvcjlfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlMl9TU0UyKHRvcFswXSwgdG9wWzFdKTsKKyAgKHZvaWQpbGVmdDsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTBfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBBdmVyYWdlNF9TU0UyKGxlZnQsIHRvcFstMV0sIHRvcFswXSwgdG9wWzFdKTsKKyAgcmV0dXJuIHByZWQ7Cit9CitzdGF0aWMgdWludDMyX3QgUHJlZGljdG9yMTFfU1NFMih1aW50MzJfdCBsZWZ0LCBjb25zdCB1aW50MzJfdCogY29uc3QgdG9wKSB7CisgIGNvbnN0IHVpbnQzMl90IHByZWQgPSBTZWxlY3RfU1NFMih0b3BbMF0sIGxlZnQsIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxMl9TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEZ1bGxfU1NFMihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KK3N0YXRpYyB1aW50MzJfdCBQcmVkaWN0b3IxM19TU0UyKHVpbnQzMl90IGxlZnQsIGNvbnN0IHVpbnQzMl90KiBjb25zdCB0b3ApIHsKKyAgY29uc3QgdWludDMyX3QgcHJlZCA9IENsYW1wZWRBZGRTdWJ0cmFjdEhhbGZfU1NFMihsZWZ0LCB0b3BbMF0sIHRvcFstMV0pOworICByZXR1cm4gcHJlZDsKK30KKworLy8gQmF0Y2ggdmVyc2lvbnMgb2YgdGhvc2UgZnVuY3Rpb25zLgorCisvLyBQcmVkaWN0b3IwOiBBUkdCX0JMQUNLLgorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMF9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIGJsYWNrID0gX21tX3NldDFfZXBpMzIoQVJHQl9CTEFDSyk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX2FkZF9lcGk4KHNyYywgYmxhY2spOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbMF0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorCisvLyBQcmVkaWN0b3IxOiBsZWZ0Lgorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMV9TU0UyKGNvbnN0IHVpbnQzMl90KiBpbiwgY29uc3QgdWludDMyX3QqIHVwcGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBfX20xMjhpIHByZXYgPSBfbW1fc2V0MV9lcGkzMihvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgLy8gYSB8IGIgfCBjIHwgZAorICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIC8vIDAgfCBhIHwgYiB8IGMKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0MCA9IF9tbV9zbGxpX3NpMTI4KHNyYywgNCk7CisgICAgLy8gYSB8IGEgKyBiIHwgYiArIGMgfCBjICsgZAorICAgIGNvbnN0IF9fbTEyOGkgc3VtMCA9IF9tbV9hZGRfZXBpOChzcmMsIHNoaWZ0MCk7CisgICAgLy8gMCB8IDAgfCBhIHwgYSArIGIKKyAgICBjb25zdCBfX20xMjhpIHNoaWZ0MSA9IF9tbV9zbGxpX3NpMTI4KHN1bTAsIDgpOworICAgIC8vIGEgfCBhICsgYiB8IGEgKyBiICsgYyB8IGEgKyBiICsgYyArIGQKKyAgICBjb25zdCBfX20xMjhpIHN1bTEgPSBfbW1fYWRkX2VwaTgoc3VtMCwgc2hpZnQxKTsKKyAgICBjb25zdCBfX20xMjhpIHJlcyA9IF9tbV9hZGRfZXBpOChzdW0xLCBwcmV2KTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOworICAgIC8vIHJlcGxpY2F0ZSBwcmV2IG91dHB1dCBvbiB0aGUgZm91ciBsYW5lcworICAgIHByZXYgPSBfbW1fc2h1ZmZsZV9lcGkzMihyZXMsICgzIDw8IDApIHwgKDMgPDwgMikgfCAoMyA8PCA0KSB8ICgzIDw8IDYpKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisKKy8vIE1hY3JvIHRoYXQgYWRkcyAzMi1iaXQgaW50ZWdlcnMgZnJvbSBJTiB1c2luZyBtb2QgMjU2IGFyaXRobWV0aWMKKy8vIHBlciA4IGJpdCBjaGFubmVsLgorI2RlZmluZSBHRU5FUkFURV9QUkVESUNUT1JfMShYLCBJTikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkIyNYIyNfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7ICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgb3RoZXIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYoSU4pKTsgICAgICAgICAgICAgXAorICAgIGNvbnN0IF9fbTEyOGkgcmVzID0gX21tX2FkZF9lcGk4KHNyYywgb3RoZXIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKSZvdXRbaV0sIHJlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbKFgpXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOyAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBQcmVkaWN0b3IyOiBUb3AuCitHRU5FUkFURV9QUkVESUNUT1JfMSgyLCB1cHBlcltpXSkKKy8vIFByZWRpY3RvcjM6IFRvcC1yaWdodC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8xKDMsIHVwcGVyW2kgKyAxXSkKKy8vIFByZWRpY3RvcjQ6IFRvcC1sZWZ0LgorR0VORVJBVEVfUFJFRElDVE9SXzEoNCwgdXBwZXJbaSAtIDFdKQorI3VuZGVmIEdFTkVSQVRFX1BSRURJQ1RPUl8xCisKKy8vIER1ZSB0byBhdmVyYWdlcyB3aXRoIGludGVnZXJzLCB2YWx1ZXMgY2Fubm90IGJlIGFjY3VtdWxhdGVkIGluIHBhcmFsbGVsIGZvcgorLy8gcHJlZGljdG9ycyA1IHRvIDcuCitHRU5FUkFURV9QUkVESUNUT1JfQUREKFByZWRpY3RvcjVfU1NFMiwgUHJlZGljdG9yQWRkNV9TU0UyKQorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3I2X1NTRTIsIFByZWRpY3RvckFkZDZfU1NFMikKK0dFTkVSQVRFX1BSRURJQ1RPUl9BREQoUHJlZGljdG9yN19TU0UyLCBQcmVkaWN0b3JBZGQ3X1NTRTIpCisKKyNkZWZpbmUgR0VORVJBVEVfUFJFRElDVE9SXzIoWCwgSU4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZCMjWCMjX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIFRvdGhlciA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihJTikpOyAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7ICAgICAgICAgICAgIFwKKyAgICBjb25zdCBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsgICAgICAgICAgICAgIFwKKyAgICBfX20xMjhpIGF2ZywgcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBdmVyYWdlMl9tMTI4aSgmVCwgJlRvdGhlciwgJmF2Zyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXMgPSBfbW1fYWRkX2VwaTgoYXZnLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmb3V0W2ldLCByZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWyhYKV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFByZWRpY3Rvcjg6IGF2ZXJhZ2UgVEwgVC4KK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDgsIHVwcGVyW2kgLSAxXSkKKy8vIFByZWRpY3Rvcjk6IGF2ZXJhZ2UgVCBUUi4KK0dFTkVSQVRFX1BSRURJQ1RPUl8yKDksIHVwcGVyW2kgKyAxXSkKKyN1bmRlZiBHRU5FUkFURV9QUkVESUNUT1JfMgorCisvLyBQcmVkaWN0b3IxMDogYXZlcmFnZSBvZiAoYXZlcmFnZSBvZiAoTCxUTCksIGF2ZXJhZ2Ugb2YgKFQsIFRSKSkuCisjZGVmaW5lIERPX1BSRUQxMChPVVQpIGRvIHsgICAgICAgICAgICAgICBcCisgIF9fbTEyOGkgYXZnTFRMLCBhdmc7ICAgICAgICAgICAgICAgICAgICBcCisgIEF2ZXJhZ2UyX20xMjhpKCZMLCAmVEwsICZhdmdMVEwpOyAgICAgICBcCisgIEF2ZXJhZ2UyX20xMjhpKCZhdmdUVFIsICZhdmdMVEwsICZhdmcpOyBcCisgIEwgPSBfbW1fYWRkX2VwaTgoYXZnLCBzcmMpOyAgICAgICAgICAgICBcCisgIG91dFtpICsgKE9VVCldID0gX21tX2N2dHNpMTI4X3NpMzIoTCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIERPX1BSRUQxMF9TSElGVCBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogUm90YXRlIHRoZSBwcmUtY29tcHV0ZWQgdmFsdWVzIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uKi8gXAorICBhdmdUVFIgPSBfbW1fc3JsaV9zaTEyOChhdmdUVFIsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFRMID0gX21tX3NybGlfc2kxMjgoVEwsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3JjID0gX21tX3NybGlfc2kxMjgoc3JjLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgUHJlZGljdG9yQWRkMTBfU1NFMihjb25zdCB1aW50MzJfdCogaW4sIGNvbnN0IHVpbnQzMl90KiB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQzMl90KiBvdXQpIHsKKyAgaW50IGk7CisgIF9fbTEyOGkgTCA9IF9tbV9jdnRzaTMyX3NpMTI4KG91dFstMV0pOworICBmb3IgKGkgPSAwOyBpICsgNCA8PSBudW1fcGl4ZWxzOyBpICs9IDQpIHsKKyAgICBfX20xMjhpIHNyYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJmluW2ldKTsKKyAgICBfX20xMjhpIFRMID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaSAtIDFdKTsKKyAgICBjb25zdCBfX20xMjhpIFQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUUiA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnVwcGVyW2kgKyAxXSk7CisgICAgX19tMTI4aSBhdmdUVFI7CisgICAgQXZlcmFnZTJfbTEyOGkoJlQsICZUUiwgJmF2Z1RUUik7CisgICAgRE9fUFJFRDEwKDApOworICAgIERPX1BSRUQxMF9TSElGVDsKKyAgICBET19QUkVEMTAoMSk7CisgICAgRE9fUFJFRDEwX1NISUZUOworICAgIERPX1BSRUQxMCgyKTsKKyAgICBET19QUkVEMTBfU0hJRlQ7CisgICAgRE9fUFJFRDEwKDMpOworICB9CisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMUHJlZGljdG9yc0FkZF9DWzEwXShpbiArIGksIHVwcGVyICsgaSwgbnVtX3BpeGVscyAtIGksIG91dCArIGkpOworICB9Cit9CisjdW5kZWYgRE9fUFJFRDEwCisjdW5kZWYgRE9fUFJFRDEwX1NISUZUCisKKy8vIFByZWRpY3RvcjExOiBzZWxlY3QuCisjZGVmaW5lIERPX1BSRUQxMShPVVQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBMX2xvID0gX21tX3VucGFja2xvX2VwaTMyKEwsIFQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFRMX2xvID0gX21tX3VucGFja2xvX2VwaTMyKFRMLCBUKTsgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgcGIgPSBfbW1fc2FkX2VwdTgoTF9sbywgVExfbG8pOyAvKiBwYiA9IHN1bSB8TC1UTHwqLyAgIFwKKyAgY29uc3QgX19tMTI4aSBtYXNrID0gX21tX2NtcGd0X2VwaTMyKHBiLCBwYSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIEEgPSBfbW1fYW5kX3NpMTI4KG1hc2ssIEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9hbmRub3Rfc2kxMjgobWFzaywgVCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBwcmVkID0gX21tX29yX3NpMTI4KEEsIEIpOyAvKiBwcmVkID0gKHBhID4gYik/IEwgOiBUKi8gXAorICBMID0gX21tX2FkZF9lcGk4KHNyYywgcHJlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dFtpICsgKE9VVCldID0gX21tX2N2dHNpMTI4X3NpMzIoTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRE9fUFJFRDExX1NISUZUIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogU2hpZnQgdGhlIHByZS1jb21wdXRlZCB2YWx1ZSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLiovIFwKKyAgVCA9IF9tbV9zcmxpX3NpMTI4KFQsIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgVEwgPSBfbW1fc3JsaV9zaTEyOChUTCwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3JjID0gX21tX3NybGlfc2kxMjgoc3JjLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGEgPSBfbW1fc3JsaV9zaTEyOChwYSwgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDExX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBfX20xMjhpIHBhOworICBfX20xMjhpIEwgPSBfbW1fY3Z0c2kzMl9zaTEyOChvdXRbLTFdKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIF9fbTEyOGkgc3JjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmaW5baV0pOworICAgIHsKKyAgICAgIC8vIFdlIGNhbiB1bnBhY2sgd2l0aCBhbnkgdmFsdWUgb24gdGhlIHVwcGVyIDMyIGJpdHMsIHByb3ZpZGVkIGl0J3MgdGhlCisgICAgICAvLyBzYW1lIG9uIGJvdGggb3BlcmFuZHMgKHNvIHRoYXQgdGhlaXIgc3VtIG9mIGFicyBkaWZmIGlzIHplcm8pLiBIZXJlIHdlCisgICAgICAvLyB1c2UgVC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgVF9sbyA9IF9tbV91bnBhY2tsb19lcGkzMihULCBUKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgVExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMzIoVEwsIFQpOworICAgICAgY29uc3QgX19tMTI4aSBUX2hpID0gX21tX3VucGFja2hpX2VwaTMyKFQsIFQpOworICAgICAgY29uc3QgX19tMTI4aSBUTF9oaSA9IF9tbV91bnBhY2toaV9lcGkzMihUTCwgVCk7CisgICAgICBjb25zdCBfX20xMjhpIHNfbG8gPSBfbW1fc2FkX2VwdTgoVF9sbywgVExfbG8pOworICAgICAgY29uc3QgX19tMTI4aSBzX2hpID0gX21tX3NhZF9lcHU4KFRfaGksIFRMX2hpKTsKKyAgICAgIHBhID0gX21tX3BhY2tzX2VwaTMyKHNfbG8sIHNfaGkpOyAgLy8gcGEgPSBzdW0gfFQtVEx8CisgICAgfQorICAgIERPX1BSRUQxMSgwKTsKKyAgICBET19QUkVEMTFfU0hJRlQ7CisgICAgRE9fUFJFRDExKDEpOworICAgIERPX1BSRUQxMV9TSElGVDsKKyAgICBET19QUkVEMTEoMik7CisgICAgRE9fUFJFRDExX1NISUZUOworICAgIERPX1BSRUQxMSgzKTsKKyAgfQorICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TFByZWRpY3RvcnNBZGRfQ1sxMV0oaW4gKyBpLCB1cHBlciArIGksIG51bV9waXhlbHMgLSBpLCBvdXQgKyBpKTsKKyAgfQorfQorI3VuZGVmIERPX1BSRUQxMQorI3VuZGVmIERPX1BSRUQxMV9TSElGVAorCisvLyBQcmVkaWN0b3IxMjogQ2xhbXBlZEFkZFN1YnRyYWN0RnVsbC4KKyNkZWZpbmUgRE9fUFJFRDEyKERJRkYsIExBTkUsIE9VVCkgZG8geyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbGwgPSBfbW1fYWRkX2VwaTE2KEwsIChESUZGKSk7ICAgIFwKKyAgY29uc3QgX19tMTI4aSBhbGxzID0gX21tX3BhY2t1c19lcGkxNihhbGwsIGFsbCk7IFwKKyAgY29uc3QgX19tMTI4aSByZXMgPSBfbW1fYWRkX2VwaTgoc3JjLCBhbGxzKTsgICAgIFwKKyAgb3V0W2kgKyAoT1VUKV0gPSBfbW1fY3Z0c2kxMjhfc2kzMihyZXMpOyAgICAgICAgIFwKKyAgTCA9IF9tbV91bnBhY2tsb19lcGk4KHJlcywgemVybyk7ICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRE9fUFJFRDEyX1NISUZUKERJRkYsIExBTkUpIGRvIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogU2hpZnQgdGhlIHByZS1jb21wdXRlZCB2YWx1ZSBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLiovIFwKKyAgaWYgKChMQU5FKSA9PSAwKSAoRElGRikgPSBfbW1fc3JsaV9zaTEyOCgoRElGRiksIDgpOyAgICAgIFwKKyAgc3JjID0gX21tX3NybGlfc2kxMjgoc3JjLCA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIFByZWRpY3RvckFkZDEyX1NTRTIoY29uc3QgdWludDMyX3QqIGluLCBjb25zdCB1aW50MzJfdCogdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEw4ID0gX21tX2N2dHNpMzJfc2kxMjgob3V0Wy0xXSk7CisgIF9fbTEyOGkgTCA9IF9tbV91bnBhY2tsb19lcGk4KEw4LCB6ZXJvKTsKKyAgZm9yIChpID0gMDsgaSArIDQgPD0gbnVtX3BpeGVsczsgaSArPSA0KSB7CisgICAgLy8gTG9hZCA0IHBpeGVscyBhdCBhIHRpbWUuCisgICAgX19tMTI4aSBzcmMgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZpbltpXSk7CisgICAgY29uc3QgX19tMTI4aSBUID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmdXBwZXJbaV0pOworICAgIGNvbnN0IF9fbTEyOGkgVF9sbyA9IF9tbV91bnBhY2tsb19lcGk4KFQsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVF9oaSA9IF9tbV91bnBhY2toaV9lcGk4KFQsIHplcm8pOworICAgIGNvbnN0IF9fbTEyOGkgVEwgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZ1cHBlcltpIC0gMV0pOworICAgIGNvbnN0IF9fbTEyOGkgVExfbG8gPSBfbW1fdW5wYWNrbG9fZXBpOChUTCwgemVybyk7CisgICAgY29uc3QgX19tMTI4aSBUTF9oaSA9IF9tbV91bnBhY2toaV9lcGk4KFRMLCB6ZXJvKTsKKyAgICBfX20xMjhpIGRpZmZfbG8gPSBfbW1fc3ViX2VwaTE2KFRfbG8sIFRMX2xvKTsKKyAgICBfX20xMjhpIGRpZmZfaGkgPSBfbW1fc3ViX2VwaTE2KFRfaGksIFRMX2hpKTsKKyAgICBET19QUkVEMTIoZGlmZl9sbywgMCwgMCk7CisgICAgRE9fUFJFRDEyX1NISUZUKGRpZmZfbG8sIDApOworICAgIERPX1BSRUQxMihkaWZmX2xvLCAxLCAxKTsKKyAgICBET19QUkVEMTJfU0hJRlQoZGlmZl9sbywgMSk7CisgICAgRE9fUFJFRDEyKGRpZmZfaGksIDAsIDIpOworICAgIERPX1BSRUQxMl9TSElGVChkaWZmX2hpLCAwKTsKKyAgICBET19QUkVEMTIoZGlmZl9oaSwgMSwgMyk7CisgIH0KKyAgaWYgKGkgIT0gbnVtX3BpeGVscykgeworICAgIFZQOExQcmVkaWN0b3JzQWRkX0NbMTJdKGluICsgaSwgdXBwZXIgKyBpLCBudW1fcGl4ZWxzIC0gaSwgb3V0ICsgaSk7CisgIH0KK30KKyN1bmRlZiBET19QUkVEMTIKKyN1bmRlZiBET19QUkVEMTJfU0hJRlQKKworLy8gRHVlIHRvIGF2ZXJhZ2VzIHdpdGggaW50ZWdlcnMsIHZhbHVlcyBjYW5ub3QgYmUgYWNjdW11bGF0ZWQgaW4gcGFyYWxsZWwgZm9yCisvLyBwcmVkaWN0b3JzIDEzLgorR0VORVJBVEVfUFJFRElDVE9SX0FERChQcmVkaWN0b3IxM19TU0UyLCBQcmVkaWN0b3JBZGQxM19TU0UyKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3VidHJhY3QtR3JlZW4gVHJhbnNmb3JtCisKK3N0YXRpYyB2b2lkIEFkZEdyZWVuVG9CbHVlQW5kUmVkX1NTRTIoY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBkc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmNbaV0pOyAvLyBhcmdiCisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX3NybGlfZXBpMTYoaW4sIDgpOyAgICAgLy8gMCBhIDAgZworICAgIGNvbnN0IF9fbTEyOGkgQiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYoQSwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoQiwgX01NX1NIVUZGTEUoMiwgMiwgMCwgMCkpOyAgLy8gMGcwZworICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX2FkZF9lcGk4KGluLCBDKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2ldLCBvdXQpOworICB9CisgIC8vIGZhbGx0aHJvdWdoIGFuZCBmaW5pc2ggb2ZmIHdpdGggcGxhaW4tQworICBpZiAoaSAhPSBudW1fcGl4ZWxzKSB7CisgICAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkX0Moc3JjICsgaSwgbnVtX3BpeGVscyAtIGksIGRzdCArIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvciBUcmFuc2Zvcm0KKworc3RhdGljIHZvaWQgVHJhbnNmb3JtQ29sb3JJbnZlcnNlX1NTRTIoY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50MzJfdCogZHN0KSB7CisvLyBzaWduLWV4dGVuZGVkIG11bHRpcGx5aW5nIGNvbnN0YW50cywgcHJlLXNoaWZ0ZWQgYnkgNS4KKyNkZWZpbmUgQ1NUKFgpICAoKChpbnQxNl90KShtLT5YIDw8IDgpKSA+PiA1KSAgIC8vIHNpZ24tZXh0ZW5kCisjZGVmaW5lIE1LX0NTVF8xNihISSwgTE8pIFwKKyAgX21tX3NldDFfZXBpMzIoKGludCkoKCh1aW50MzJfdCkoSEkpIDw8IDE2KSB8ICgoTE8pICYgMHhmZmZmKSkpCisgIGNvbnN0IF9fbTEyOGkgbXVsdHNfcmIgPSBNS19DU1RfMTYoQ1NUKGdyZWVuX3RvX3JlZF8pLCBDU1QoZ3JlZW5fdG9fYmx1ZV8pKTsKKyAgY29uc3QgX19tMTI4aSBtdWx0c19iMiA9IE1LX0NTVF8xNihDU1QocmVkX3RvX2JsdWVfKSwgMCk7CisjdW5kZWYgTUtfQ1NUXzE2CisjdW5kZWYgQ1NUCisgIGNvbnN0IF9fbTEyOGkgbWFza19hZyA9IF9tbV9zZXQxX2VwaTMyKDB4ZmYwMGZmMDApOyAgLy8gYWxwaGEtZ3JlZW4gbWFza3MKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyA0IDw9IG51bV9waXhlbHM7IGkgKz0gNCkgeworICAgIGNvbnN0IF9fbTEyOGkgaW4gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmNbaV0pOyAvLyBhcmdiCisgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2FuZF9zaTEyOChpbiwgbWFza19hZyk7ICAgICAvLyBhICAgMCAgIGcgICAwCisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX3NodWZmbGVsb19lcGkxNihBLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX3NodWZmbGVoaV9lcGkxNihCLCBfTU1fU0hVRkZMRSgyLCAyLCAwLCAwKSk7ICAvLyBnMGcwCisgICAgY29uc3QgX19tMTI4aSBEID0gX21tX211bGhpX2VwaTE2KEMsIG11bHRzX3JiKTsgICAgLy8geCBkciAgeCBkYjEKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fYWRkX2VwaTgoaW4sIEQpOyAgICAgICAgICAgICAvLyB4IHInICB4ICAgYicKKyAgICBjb25zdCBfX20xMjhpIEYgPSBfbW1fc2xsaV9lcGkxNihFLCA4KTsgICAgICAgICAgICAvLyByJyAwICAgYicgMAorICAgIGNvbnN0IF9fbTEyOGkgRyA9IF9tbV9tdWxoaV9lcGkxNihGLCBtdWx0c19iMik7ICAgIC8vIHggZGIyICAwICAwCisgICAgY29uc3QgX19tMTI4aSBIID0gX21tX3NybGlfZXBpMzIoRywgOCk7ICAgICAgICAgICAgLy8gMCAgeCBkYjIgIDAKKyAgICBjb25zdCBfX20xMjhpIEkgPSBfbW1fYWRkX2VwaTgoSCwgRik7ICAgICAgICAgICAgICAvLyByJyB4ICBiJycgMAorICAgIGNvbnN0IF9fbTEyOGkgSiA9IF9tbV9zcmxpX2VwaTE2KEksIDgpOyAgICAgICAgICAgIC8vIDAgIHInICAwICBiJycKKyAgICBjb25zdCBfX20xMjhpIG91dCA9IF9tbV9vcl9zaTEyOChKLCBBKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikmZHN0W2ldLCBvdXQpOworICB9CisgIC8vIEZhbGwtYmFjayB0byBDLXZlcnNpb24gZm9yIGxlZnQtb3ZlcnMuCisgIGlmIChpICE9IG51bV9waXhlbHMpIHsKKyAgICBWUDhMVHJhbnNmb3JtQ29sb3JJbnZlcnNlX0MobSwgc3JjICsgaSwgbnVtX3BpeGVscyAtIGksIGRzdCArIGkpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2xvci1zcGFjZSBjb252ZXJzaW9uIGZ1bmN0aW9ucworCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCX1NTRTIoY29uc3QgdWludDMyX3QqIHNyYywgaW50IG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkqIGluID0gKGNvbnN0IF9fbTEyOGkqKXNyYzsKKyAgX19tMTI4aSogb3V0ID0gKF9fbTEyOGkqKWRzdDsKKworICB3aGlsZSAobnVtX3BpeGVscyA+PSAzMikgeworICAgIC8vIExvYWQgdGhlIEJHUkEgYnVmZmVycy4KKyAgICBfX20xMjhpIGluMCA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDApOworICAgIF9fbTEyOGkgaW4xID0gX21tX2xvYWR1X3NpMTI4KGluICsgMSk7CisgICAgX19tMTI4aSBpbjIgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyAyKTsKKyAgICBfX20xMjhpIGluMyA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDMpOworICAgIF9fbTEyOGkgaW40ID0gX21tX2xvYWR1X3NpMTI4KGluICsgNCk7CisgICAgX19tMTI4aSBpbjUgPSBfbW1fbG9hZHVfc2kxMjgoaW4gKyA1KTsKKyAgICBfX20xMjhpIGluNiA9IF9tbV9sb2FkdV9zaTEyOChpbiArIDYpOworICAgIF9fbTEyOGkgaW43ID0gX21tX2xvYWR1X3NpMTI4KGluICsgNyk7CisgICAgVlA4TDMyYlRvUGxhbmFyX1NTRTIoJmluMCwgJmluMSwgJmluMiwgJmluMyk7CisgICAgVlA4TDMyYlRvUGxhbmFyX1NTRTIoJmluNCwgJmluNSwgJmluNiwgJmluNyk7CisgICAgLy8gQXQgdGhpcyBwb2ludHMsIGluMS9pbjUgY29udGFpbnMgcmVkIG9ubHksIGluMi9pbjYgZ3JlZW4gb25seSAuLi4KKyAgICAvLyBQYWNrIHRoZSBjb2xvcnMgaW4gMjRiIFJHQi4KKyAgICBWUDhQbGFuYXJUbzI0Yl9TU0UyKCZpbjEsICZpbjUsICZpbjIsICZpbjYsICZpbjMsICZpbjcpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMCwgaW4xKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDEsIGluNSk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyAyLCBpbjIpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0ICsgMywgaW42KTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KG91dCArIDQsIGluMyk7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQgKyA1LCBpbjcpOworICAgIGluICs9IDg7CisgICAgb3V0ICs9IDY7CisgICAgbnVtX3BpeGVscyAtPSAzMjsKKyAgfQorICAvLyBsZWZ0LW92ZXJzCisgIGlmIChudW1fcGl4ZWxzID4gMCkgeworICAgIFZQOExDb252ZXJ0QkdSQVRvUkdCX0MoKGNvbnN0IHVpbnQzMl90KilpbiwgbnVtX3BpeGVscywgKHVpbnQ4X3QqKW91dCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUkFUb1JHQkFfU1NFMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgcmVkX2JsdWVfbWFzayA9IF9tbV9zZXQxX2VwaTMyKDB4MDBmZjAwZmZ1KTsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBBMSA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsKKyAgICBjb25zdCBfX20xMjhpIEEyID0gX21tX2xvYWR1X3NpMTI4KGluKyspOworICAgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fYW5kX3NpMTI4KEExLCByZWRfYmx1ZV9tYXNrKTsgICAgIC8vIFIgMCBCIDAKKyAgICBjb25zdCBfX20xMjhpIEIyID0gX21tX2FuZF9zaTEyOChBMiwgcmVkX2JsdWVfbWFzayk7ICAgICAvLyBSIDAgQiAwCisgICAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hbmRub3Rfc2kxMjgocmVkX2JsdWVfbWFzaywgQTEpOyAgLy8gMCBHIDAgQQorICAgIGNvbnN0IF9fbTEyOGkgQzIgPSBfbW1fYW5kbm90X3NpMTI4KHJlZF9ibHVlX21hc2ssIEEyKTsgIC8vIDAgRyAwIEEKKyAgICBjb25zdCBfX20xMjhpIEQxID0gX21tX3NodWZmbGVsb19lcGkxNihCMSwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KEIyLCBfTU1fU0hVRkZMRSgyLCAzLCAwLCAxKSk7CisgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zaHVmZmxlaGlfZXBpMTYoRDEsIF9NTV9TSFVGRkxFKDIsIDMsIDAsIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIEUyID0gX21tX3NodWZmbGVoaV9lcGkxNihEMiwgX01NX1NIVUZGTEUoMiwgMywgMCwgMSkpOworICAgIGNvbnN0IF9fbTEyOGkgRjEgPSBfbW1fb3Jfc2kxMjgoRTEsIEMxKTsKKyAgICBjb25zdCBfX20xMjhpIEYyID0gX21tX29yX3NpMTI4KEUyLCBDMik7CisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgRjEpOworICAgIF9tbV9zdG9yZXVfc2kxMjgob3V0KyssIEYyKTsKKyAgICBudW1fcGl4ZWxzIC09IDg7CisgIH0KKyAgLy8gbGVmdC1vdmVycworICBpZiAobnVtX3BpeGVscyA+IDApIHsKKyAgICBWUDhMQ29udmVydEJHUkFUb1JHQkFfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvUkdCQTQ0NDRfU1NFMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9waXhlbHMsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIG1hc2tfMHgwZiA9IF9tbV9zZXQxX2VwaTgoMHgwZik7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weGYwID0gX21tX3NldDFfZXBpOCgweGYwKTsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBiZ3JhMCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmEwfGJncmExfGJncmEyfGJncmEzCisgICAgY29uc3QgX19tMTI4aSBiZ3JhNCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmE0fGJncmE1fGJncmE2fGJncmE3CisgICAgY29uc3QgX19tMTI4aSB2MGwgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjBiNGcwZzRyMHI0YTBhNC4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjBoID0gX21tX3VucGFja2hpX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIyYjZnMmc2cjJyNmEyYTYuLi4KKyAgICBjb25zdCBfX20xMjhpIHYxbCA9IF9tbV91bnBhY2tsb19lcGk4KHYwbCwgdjBoKTsgICAgLy8gYjBiMmI0YjZnMGcyZzRnNi4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjFoID0gX21tX3VucGFja2hpX2VwaTgodjBsLCB2MGgpOyAgICAvLyBiMWIzYjViN2cxZzNnNWc3Li4uCisgICAgY29uc3QgX19tMTI4aSB2MmwgPSBfbW1fdW5wYWNrbG9fZXBpOCh2MWwsIHYxaCk7ICAgIC8vIGIwLi4uYjcgfCBnMC4uLmc3CisgICAgY29uc3QgX19tMTI4aSB2MmggPSBfbW1fdW5wYWNraGlfZXBpOCh2MWwsIHYxaCk7ICAgIC8vIHIwLi4ucjcgfCBhMC4uLmE3CisgICAgY29uc3QgX19tMTI4aSBnYTAgPSBfbW1fdW5wYWNraGlfZXBpNjQodjJsLCB2MmgpOyAgIC8vIGcwLi4uZzcgfCBhMC4uLmE3CisgICAgY29uc3QgX19tMTI4aSByYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQodjJoLCB2MmwpOyAgIC8vIHIwLi4ucjcgfCBiMC4uLmI3CisgICAgY29uc3QgX19tMTI4aSBnYTEgPSBfbW1fc3JsaV9lcGkxNihnYTAsIDQpOyAgICAgICAgIC8vIGcwLXxnMS18Li4ufGE2LXxhNy0KKyAgICBjb25zdCBfX20xMjhpIHJiMSA9IF9tbV9hbmRfc2kxMjgocmIwLCBtYXNrXzB4ZjApOyAgLy8gLXIwfC1yMXwuLi58LWI2fC1hNworICAgIGNvbnN0IF9fbTEyOGkgZ2EyID0gX21tX2FuZF9zaTEyOChnYTEsIG1hc2tfMHgwZik7ICAvLyBnMC18ZzEtfC4uLnxhNi18YTctCisgICAgY29uc3QgX19tMTI4aSByZ2JhMCA9IF9tbV9vcl9zaTEyOChnYTIsIHJiMSk7ICAgICAgIC8vIHJnMC4ucmc3IHwgYmEwLi5iYTcKKyAgICBjb25zdCBfX20xMjhpIHJnYmExID0gX21tX3NybGlfc2kxMjgocmdiYTAsIDgpOyAgICAgLy8gYmEwLi5iYTcgfCAwCisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBjb25zdCBfX20xMjhpIHJnYmEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JhMSwgcmdiYTApOyAgLy8gYmFyZzAuLi5iYXJnNworI2Vsc2UKKyAgICBjb25zdCBfX20xMjhpIHJnYmEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZ2JhMCwgcmdiYTEpOyAgLy8gcmdiYTAuLi5yZ2JhNworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgcmdiYSk7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgVlA4TENvbnZlcnRCR1JBVG9SR0JBNDQ0NF9DKChjb25zdCB1aW50MzJfdCopaW4sIG51bV9waXhlbHMsICh1aW50OF90KilvdXQpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRCR1JBVG9SR0I1NjVfU1NFMihjb25zdCB1aW50MzJfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBtYXNrXzB4ZTAgPSBfbW1fc2V0MV9lcGk4KDB4ZTApOworICBjb25zdCBfX20xMjhpIG1hc2tfMHhmOCA9IF9tbV9zZXQxX2VwaTgoMHhmOCk7CisgIGNvbnN0IF9fbTEyOGkgbWFza18weDA3ID0gX21tX3NldDFfZXBpOCgweDA3KTsKKyAgY29uc3QgX19tMTI4aSogaW4gPSAoY29uc3QgX19tMTI4aSopc3JjOworICBfX20xMjhpKiBvdXQgPSAoX19tMTI4aSopZHN0OworICB3aGlsZSAobnVtX3BpeGVscyA+PSA4KSB7CisgICAgY29uc3QgX19tMTI4aSBiZ3JhMCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmEwfGJncmExfGJncmEyfGJncmEzCisgICAgY29uc3QgX19tMTI4aSBiZ3JhNCA9IF9tbV9sb2FkdV9zaTEyOChpbisrKTsgICAgIC8vIGJncmE0fGJncmE1fGJncmE2fGJncmE3CisgICAgY29uc3QgX19tMTI4aSB2MGwgPSBfbW1fdW5wYWNrbG9fZXBpOChiZ3JhMCwgYmdyYTQpOyAgLy8gYjBiNGcwZzRyMHI0YTBhNC4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjBoID0gX21tX3VucGFja2hpX2VwaTgoYmdyYTAsIGJncmE0KTsgIC8vIGIyYjZnMmc2cjJyNmEyYTYuLi4KKyAgICBjb25zdCBfX20xMjhpIHYxbCA9IF9tbV91bnBhY2tsb19lcGk4KHYwbCwgdjBoKTsgICAgICAvLyBiMGIyYjRiNmcwZzJnNGc2Li4uCisgICAgY29uc3QgX19tMTI4aSB2MWggPSBfbW1fdW5wYWNraGlfZXBpOCh2MGwsIHYwaCk7ICAgICAgLy8gYjFiM2I1YjdnMWczZzVnNy4uLgorICAgIGNvbnN0IF9fbTEyOGkgdjJsID0gX21tX3VucGFja2xvX2VwaTgodjFsLCB2MWgpOyAgICAgIC8vIGIwLi4uYjcgfCBnMC4uLmc3CisgICAgY29uc3QgX19tMTI4aSB2MmggPSBfbW1fdW5wYWNraGlfZXBpOCh2MWwsIHYxaCk7ICAgICAgLy8gcjAuLi5yNyB8IGEwLi4uYTcKKyAgICBjb25zdCBfX20xMjhpIGdhMCA9IF9tbV91bnBhY2toaV9lcGk2NCh2MmwsIHYyaCk7ICAgICAvLyBnMC4uLmc3IHwgYTAuLi5hNworICAgIGNvbnN0IF9fbTEyOGkgcmIwID0gX21tX3VucGFja2xvX2VwaTY0KHYyaCwgdjJsKTsgICAgIC8vIHIwLi4ucjcgfCBiMC4uLmI3CisgICAgY29uc3QgX19tMTI4aSByYjEgPSBfbW1fYW5kX3NpMTI4KHJiMCwgbWFza18weGY4KTsgICAgLy8gLXIwLi4tcjd8LWIwLi4tYjcKKyAgICBjb25zdCBfX20xMjhpIGdfbG8xID0gX21tX3NybGlfZXBpMTYoZ2EwLCA1KTsKKyAgICBjb25zdCBfX20xMjhpIGdfbG8yID0gX21tX2FuZF9zaTEyOChnX2xvMSwgbWFza18weDA3KTsgIC8vIGcwLS4uLmc3LXx4eCAoM2IpCisgICAgY29uc3QgX19tMTI4aSBnX2hpMSA9IF9tbV9zbGxpX2VwaTE2KGdhMCwgMyk7CisgICAgY29uc3QgX19tMTI4aSBnX2hpMiA9IF9tbV9hbmRfc2kxMjgoZ19oaTEsIG1hc2tfMHhlMCk7ICAvLyAtZzAuLi4tZzd8eHggKDNiKQorICAgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fc3JsaV9zaTEyOChyYjEsIDgpOyAgICAgICAgICAgICAgLy8gLWIwLi4uLWI3fDAKKyAgICBjb25zdCBfX20xMjhpIHJnMSA9IF9tbV9vcl9zaTEyOChyYjEsIGdfbG8yKTsgICAgICAgICAgIC8vIGdyMC4uLmdyN3x4eAorICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fc3JsaV9lcGkxNihiMCwgMyk7CisgICAgY29uc3QgX19tMTI4aSBnYjEgPSBfbW1fb3Jfc2kxMjgoYjEsIGdfaGkyKTsgICAgICAgICAgICAvLyBiZzAuLi5iZzd8eHgKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIGNvbnN0IF9fbTEyOGkgcmdiYSA9IF9tbV91bnBhY2tsb19lcGk4KGdiMSwgcmcxKTsgICAgIC8vIHJnZ2IwLi4ucmdnYjcKKyNlbHNlCisgICAgY29uc3QgX19tMTI4aSByZ2JhID0gX21tX3VucGFja2xvX2VwaTgocmcxLCBnYjEpOyAgICAgLy8gYmdyYjAuLi5iZ3JiNworI2VuZGlmCisgICAgX21tX3N0b3JldV9zaTEyOChvdXQrKywgcmdiYSk7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgVlA4TENvbnZlcnRCR1JBVG9SR0I1NjVfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCAodWludDhfdCopb3V0KTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSQVRvQkdSX1NTRTIoY29uc3QgdWludDMyX3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3BpeGVscywgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgbWFza19sID0gX21tX3NldF9lcGkzMigwLCAweDAwZmZmZmZmLCAwLCAweDAwZmZmZmZmKTsKKyAgY29uc3QgX19tMTI4aSBtYXNrX2ggPSBfbW1fc2V0X2VwaTMyKDB4MDBmZmZmZmYsIDAsIDB4MDBmZmZmZmYsIDApOworICBjb25zdCBfX20xMjhpKiBpbiA9IChjb25zdCBfX20xMjhpKilzcmM7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZCA9IGRzdCArIG51bV9waXhlbHMgKiAzOworICAvLyB0aGUgbGFzdCBzdG9yZWxfZXBpNjQgYmVsb3cgd3JpdGVzIDggYnl0ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDE4CisgIHdoaWxlIChkc3QgKyAyNiA8PSBlbmQpIHsKKyAgICBjb25zdCBfX20xMjhpIGJncmEwID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTB8YmdyYTF8YmdyYTJ8YmdyYTMKKyAgICBjb25zdCBfX20xMjhpIGJncmE0ID0gX21tX2xvYWR1X3NpMTI4KGluKyspOyAgICAgLy8gYmdyYTR8YmdyYTV8YmdyYTZ8YmdyYTcKKyAgICBjb25zdCBfX20xMjhpIGEwbCA9IF9tbV9hbmRfc2kxMjgoYmdyYTAsIG1hc2tfbCk7ICAgLy8gYmdyMHwwfGJncjB8MAorICAgIGNvbnN0IF9fbTEyOGkgYTRsID0gX21tX2FuZF9zaTEyOChiZ3JhNCwgbWFza19sKTsgICAvLyBiZ3IwfDB8YmdyMHwwCisgICAgY29uc3QgX19tMTI4aSBhMGggPSBfbW1fYW5kX3NpMTI4KGJncmEwLCBtYXNrX2gpOyAgIC8vIDB8YmdyMHwwfGJncjAKKyAgICBjb25zdCBfX20xMjhpIGE0aCA9IF9tbV9hbmRfc2kxMjgoYmdyYTQsIG1hc2tfaCk7ICAgLy8gMHxiZ3IwfDB8YmdyMAorICAgIGNvbnN0IF9fbTEyOGkgYjBoID0gX21tX3NybGlfZXBpNjQoYTBoLCA4KTsgICAgICAgICAvLyAwMDBifGdyMDB8MDAwYnxncjAwCisgICAgY29uc3QgX19tMTI4aSBiNGggPSBfbW1fc3JsaV9lcGk2NChhNGgsIDgpOyAgICAgICAgIC8vIDAwMGJ8Z3IwMHwwMDBifGdyMDAKKyAgICBjb25zdCBfX20xMjhpIGMwID0gX21tX29yX3NpMTI4KGEwbCwgYjBoKTsgICAgICAgICAgLy8gcmdicmdiMDB8cmdicmdiMDAKKyAgICBjb25zdCBfX20xMjhpIGM0ID0gX21tX29yX3NpMTI4KGE0bCwgYjRoKTsgICAgICAgICAgLy8gcmdicmdiMDB8cmdicmdiMDAKKyAgICBjb25zdCBfX20xMjhpIGMyID0gX21tX3NybGlfc2kxMjgoYzAsIDgpOworICAgIGNvbnN0IF9fbTEyOGkgYzYgPSBfbW1fc3JsaV9zaTEyOChjNCwgOCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAgMCksIGMwKTsKKyAgICBfbW1fc3RvcmVsX2VwaTY0KChfX20xMjhpKikoZHN0ICsgICA2KSwgYzIpOworICAgIF9tbV9zdG9yZWxfZXBpNjQoKF9fbTEyOGkqKShkc3QgKyAgMTIpLCBjNCk7CisgICAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopKGRzdCArICAxOCksIGM2KTsKKyAgICBkc3QgKz0gMjQ7CisgICAgbnVtX3BpeGVscyAtPSA4OworICB9CisgIC8vIGxlZnQtb3ZlcnMKKyAgaWYgKG51bV9waXhlbHMgPiAwKSB7CisgICAgVlA4TENvbnZlcnRCR1JBVG9CR1JfQygoY29uc3QgdWludDMyX3QqKWluLCBudW1fcGl4ZWxzLCBkc3QpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBWUDhMRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhMRHNwSW5pdFNTRTIodm9pZCkgeworICBWUDhMUHJlZGljdG9yc1s1XSA9IFByZWRpY3RvcjVfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbNl0gPSBQcmVkaWN0b3I2X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzddID0gUHJlZGljdG9yN19TU0UyOworICBWUDhMUHJlZGljdG9yc1s4XSA9IFByZWRpY3RvcjhfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNbOV0gPSBQcmVkaWN0b3I5X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzEwXSA9IFByZWRpY3RvcjEwX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzExXSA9IFByZWRpY3RvcjExX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzEyXSA9IFByZWRpY3RvcjEyX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzWzEzXSA9IFByZWRpY3RvcjEzX1NTRTI7CisKKyAgVlA4TFByZWRpY3RvcnNBZGRbMF0gPSBQcmVkaWN0b3JBZGQwX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzFdID0gUHJlZGljdG9yQWRkMV9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFsyXSA9IFByZWRpY3RvckFkZDJfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbM10gPSBQcmVkaWN0b3JBZGQzX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzRdID0gUHJlZGljdG9yQWRkNF9TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs1XSA9IFByZWRpY3RvckFkZDVfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbNl0gPSBQcmVkaWN0b3JBZGQ2X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzddID0gUHJlZGljdG9yQWRkN19TU0UyOworICBWUDhMUHJlZGljdG9yc0FkZFs4XSA9IFByZWRpY3RvckFkZDhfU1NFMjsKKyAgVlA4TFByZWRpY3RvcnNBZGRbOV0gPSBQcmVkaWN0b3JBZGQ5X1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzEwXSA9IFByZWRpY3RvckFkZDEwX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzExXSA9IFByZWRpY3RvckFkZDExX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzEyXSA9IFByZWRpY3RvckFkZDEyX1NTRTI7CisgIFZQOExQcmVkaWN0b3JzQWRkWzEzXSA9IFByZWRpY3RvckFkZDEzX1NTRTI7CisKKyAgVlA4TEFkZEdyZWVuVG9CbHVlQW5kUmVkID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWRfU1NFMjsKKyAgVlA4TFRyYW5zZm9ybUNvbG9ySW52ZXJzZSA9IFRyYW5zZm9ybUNvbG9ySW52ZXJzZV9TU0UyOworCisgIFZQOExDb252ZXJ0QkdSQVRvUkdCID0gQ29udmVydEJHUkFUb1JHQl9TU0UyOworICBWUDhMQ29udmVydEJHUkFUb1JHQkEgPSBDb252ZXJ0QkdSQVRvUkdCQV9TU0UyOworICBWUDhMQ29udmVydEJHUkFUb1JHQkE0NDQ0ID0gQ29udmVydEJHUkFUb1JHQkE0NDQ0X1NTRTI7CisgIFZQOExDb252ZXJ0QkdSQVRvUkdCNTY1ID0gQ29udmVydEJHUkFUb1JHQjU2NV9TU0UyOworICBWUDhMQ29udmVydEJHUkFUb0JHUiA9IENvbnZlcnRCR1JBVG9CR1JfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhMRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9taXBzX21hY3JvLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21pcHNfbWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGFiYTliCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9taXBzX21hY3JvLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIGNvbW1vbiBtYWNyb3MKKworI2lmbmRlZiBXRUJQX0RTUF9NSVBTX01BQ1JPX0hfCisjZGVmaW5lIFdFQlBfRFNQX01JUFNfTUFDUk9fSF8KKworI2lmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19BTkRST0lEX18pICYmIExPQ0FMX0dDQ19WRVJTSU9OID09IDB4NDA5CisjZGVmaW5lIFdPUktfQVJPVU5EX0dDQworI2VuZGlmCisKKyNkZWZpbmUgU1RSKHMpICNzCisjZGVmaW5lIFhTVFIocykgU1RSKHMpCisKKy8vIE8wWzMxLi4xNiB8IDE1Li4wXSA9IEkwWzMxLi4xNiB8IDE1Li4wXSArIEkxWzMxLi4xNiB8IDE1Li4wXQorLy8gTzFbMzEuLjE2IHwgMTUuLjBdID0gSTBbMzEuLjE2IHwgMTUuLjBdIC0gSTFbMzEuLjE2IHwgMTUuLjBdCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBBRERfU1VCX0hBTFZFUyhPMCwgTzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSwgICVbIiAjSTEgIl0gICAgICAgICAgIFxuXHQiICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0sICAlWyIgI0kxICJdICAgICAgICAgICBcblx0IgorCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorLy8gSVswLzFdIC0gb2Zmc2V0IGluIGJ5dGVzCisjZGVmaW5lIExPQURfSU5fWDIoTzAsIE8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIEkwLCBJMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxoICAgICAgICAgICAgICAgJVsiICNPMCAiXSwgICAiICNJMCAiKCVbaW5dKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJsaCAgICAgICAgICAgICAgICVbIiAjTzEgIl0sICAgIiAjSTEgIiglW2luXSkgICAgICAgICAgICAgICAgICBcblx0IgorCisvLyBJMCAtIGxvY2F0aW9uCisvLyBJMS4uSTkgLSBvZmZzZXRzIGluIGJ5dGVzCisjZGVmaW5lIExPQURfV0lUSF9PRkZTRVRfWDQoTzAsIE8xLCBPMiwgTzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNywgSTgsIEk5KSAgICAgICAgICAgIFwKKyAgInVsdyAgICAlWyIgI08wICJdLCAgICAiICNJMSAiKyIgWFNUUihJOSkgIioiICNJNSAiKCVbIiAjSTAgIl0pICAgICAgIFxuXHQiICBcCisgICJ1bHcgICAgJVsiICNPMSAiXSwgICAgIiAjSTIgIisiIFhTVFIoSTkpICIqIiAjSTYgIiglWyIgI0kwICJdKSAgICAgICBcblx0IiAgXAorICAidWx3ICAgICVbIiAjTzIgIl0sICAgICIgI0kzICIrIiBYU1RSKEk5KSAiKiIgI0k3ICIoJVsiICNJMCAiXSkgICAgICAgXG5cdCIgIFwKKyAgInVsdyAgICAlWyIgI08zICJdLCAgICAiICNJNCAiKyIgWFNUUihJOSkgIioiICNJOCAiKCVbIiAjSTAgIl0pICAgICAgIFxuXHQiCisKKy8vIE8gLSBvdXRwdXQKKy8vIElPIC0gaW5wdXQvb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBNVUxfU0hJRlRfU1VNKE8wLCBPMSwgTzIsIE8zLCBPNCwgTzUsIE82LCBPNywgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTzAsIElPMSwgSU8yLCBJTzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMsIEk0LCBJNSwgSTYsIEk3KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0sICAgJVtrQzJdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI0kwICJdLCAgICVba0MxXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzIgIl0sICAgJVsiICNJMSAiXSwgICAlW2tDMl0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI08zICJdLCAgICVbIiAjSTEgIl0sICAgJVtrQzFdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPNCAiXSwgICAlWyIgI0kyICJdLCAgICVba0MyXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbIiAjTzUgIl0sICAgJVsiICNJMiAiXSwgICAlW2tDMV0gICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlWyIgI082ICJdLCAgICVbIiAjSTMgIl0sICAgJVtrQzJdICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVsiICNPNyAiXSwgICAlWyIgI0kzICJdLCAgICVba0MxXSAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzAgIl0sICAgJVsiICNPMCAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08xICJdLCAgICVbIiAjTzEgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMiAiXSwgICAlWyIgI08yICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzMgIl0sICAgJVsiICNPMyAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI080ICJdLCAgICVbIiAjTzQgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPNSAiXSwgICAlWyIgI081ICJdLCAgIDE2ICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzYgIl0sICAgJVsiICNPNiAiXSwgICAxNiAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI083ICJdLCAgICVbIiAjTzcgIl0sICAgMTYgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVsiICNJTzAgIl0sICAlWyIgI0lPMCAiXSwgICVbIiAjSTQgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbIiAjSU8xICJdLCAgJVsiICNJTzEgIl0sICAlWyIgI0k1ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlWyIgI0lPMiAiXSwgICVbIiAjSU8yICJdLCAgJVsiICNJNiAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVsiICNJTzMgIl0sICAlWyIgI0lPMyAiXSwgICVbIiAjSTcgIl0gICAgXG5cdCIKKworLy8gTyAtIG91dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgSU5TRVJUX0hBTEZfWDIoTzAsIE8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjSTAgIl0sIDE2LCAgICAxNiAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI0kxICJdLCAxNiwgICAgMTYgICAgICAgICAgIFxuXHQiCisKKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIFNSQV8xNihPMCwgTzEsIE8yLCBPMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMCAiXSwgICVbIiAjSTAgIl0sICAxNiAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJzcmEgICAgICAgICAgICAgICVbIiAjTzEgIl0sICAlWyIgI0kxICJdLCAgMTYgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAic3JhICAgICAgICAgICAgICAlWyIgI08yICJdLCAgJVsiICNJMiAiXSwgIDE2ICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInNyYSAgICAgICAgICAgICAgJVsiICNPMyAiXSwgICVbIiAjSTMgIl0sICAxNiAgICAgICAgICAgICAgICAgIFxuXHQiCisKKy8vIHRlbXAwWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXA4WzMxLi4xNiB8IDE1Li4wXSArIHRlbXAxMlszMS4uMTYgfCAxNS4uMF0KKy8vIHRlbXAxWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXA4WzMxLi4xNiB8IDE1Li4wXSAtIHRlbXAxMlszMS4uMTYgfCAxNS4uMF0KKy8vIHRlbXAwWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXAwWzMxLi4xNiA+PiAzIHwgMTUuLjAgPj4gM10KKy8vIHRlbXAxWzMxLi4xNiB8IDE1Li4wXSA9IHRlbXAxWzMxLi4xNiA+PiAzIHwgMTUuLjAgPj4gM10KKy8vIE8gLSBvdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIFNISUZUX1JfU1VNX1gyKE8wLCBPMSwgTzIsIE8zLCBPNCwgTzUsIE82LCBPNywgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBJMCwgSTEsIEkyLCBJMywgSTQsIEk1LCBJNiwgSTcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPMCAiXSwgICAlWyIgI0kwICJdLCAgICVbIiAjSTQgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzEgIl0sICAgJVsiICNJMCAiXSwgICAlWyIgI0k0ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI08yICJdLCAgICVbIiAjSTEgIl0sICAgJVsiICNJNSAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInN1YnEucGggICAgICAgICAgJVsiICNPMyAiXSwgICAlWyIgI0kxICJdLCAgICVbIiAjSTUgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjTzQgIl0sICAgJVsiICNJMiAiXSwgICAlWyIgI0k2ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic3VicS5waCAgICAgICAgICAlWyIgI081ICJdLCAgICVbIiAjSTIgIl0sICAgJVsiICNJNiAiXSAgICBcblx0IiAgICAgICAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNPNiAiXSwgICAlWyIgI0kzICJdLCAgICVbIiAjSTcgIl0gICAgXG5cdCIgICAgICAgICAgICBcCisgICJzdWJxLnBoICAgICAgICAgICVbIiAjTzcgIl0sICAgJVsiICNJMyAiXSwgICAlWyIgI0k3ICJdICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI08wICJdLCAgICVbIiAjTzAgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPMSAiXSwgICAlWyIgI08xICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzIgIl0sICAgJVsiICNPMiAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI08zICJdLCAgICVbIiAjTzMgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPNCAiXSwgICAlWyIgI080ICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgICBcCisgICJzaHJhLnBoICAgICAgICAgICVbIiAjTzUgIl0sICAgJVsiICNPNSAiXSwgICAzICAgICAgICAgICAgIFxuXHQiICAgICAgICAgICAgXAorICAic2hyYS5waCAgICAgICAgICAlWyIgI082ICJdLCAgICVbIiAjTzYgIl0sICAgMyAgICAgICAgICAgICBcblx0IiAgICAgICAgICAgIFwKKyAgInNocmEucGggICAgICAgICAgJVsiICNPNyAiXSwgICAlWyIgI083ICJdLCAgIDMgICAgICAgICAgICAgXG5cdCIKKworLy8gcHJlY3JxLnBoLncgdGVtcDAsIHRlbXA4LCB0ZW1wMgorLy8gICB0ZW1wMCA9IHRlbXA4WzMxLi4xNl0gfCB0ZW1wMlszMS4uMTZdCisvLyBpbnMgdGVtcDIsIHRlbXA4LCAxNiwgMTYKKy8vICAgdGVtcDIgPSB0ZW1wOFszMS4uMTZdIHwgdGVtcDJbMTUuLjBdCisvLyBPIC0gb3V0cHV0CisvLyBJTyAtIGlucHV0L291dHB1dAorLy8gSSAtIGlucHV0IChtYWNybyBkb2Vzbid0IGNoYW5nZSBpdCkKKyNkZWZpbmUgUEFDS18yX0hBTFZFU19UT19XT1JEKE8wLCBPMSwgTzIsIE8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTzAsIElPMSwgSU8yLCBJTzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgInByZWNycS5waC53ICAgICAgJVsiICNPMCAiXSwgICAgJVsiICNJMCAiXSwgICVbIiAjSU8wICJdICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjcnEucGgudyAgICAgICVbIiAjTzEgIl0sICAgICVbIiAjSTEgIl0sICAlWyIgI0lPMSAiXSAgICAgICBcblx0IiAgICAgICAgXAorICAiaW5zICAgICAgICAgICAgICAlWyIgI0lPMCAiXSwgICAlWyIgI0kwICJdLCAgMTYsICAgIDE2ICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNJTzEgIl0sICAgJVsiICNJMSAiXSwgIDE2LCAgICAxNiAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjcnEucGgudyAgICAgICVbIiAjTzIgIl0sICAgICVbIiAjSTIgIl0sICAlWyIgI0lPMiAiXSAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY3JxLnBoLncgICAgICAlWyIgI08zICJdLCAgICAlWyIgI0kzICJdLCAgJVsiICNJTzMgIl0gICAgICAgXG5cdCIgICAgICAgIFwKKyAgImlucyAgICAgICAgICAgICAgJVsiICNJTzIgIl0sICAgJVsiICNJMiAiXSwgIDE2LCAgICAxNiAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJpbnMgICAgICAgICAgICAgICVbIiAjSU8zICJdLCAgICVbIiAjSTMgIl0sICAxNiwgICAgMTYgICAgICAgICBcblx0IgorCisvLyBwcmVjZXUucGgucWJyIHRlbXAwLCB0ZW1wOAorLy8gICB0ZW1wMCA9IDAgfCAwIHwgdGVtcDhbMjMuLjE2XSB8IHRlbXA4WzcuLjBdCisvLyBwcmVjZXUucGgucWJsIHRlbXAxLCB0ZW1wOAorLy8gICB0ZW1wMSA9IHRlbXA4WzIzLi4xNl0gfCB0ZW1wOFs3Li4wXSB8IDAgfCAwCisvLyBPIC0gb3V0cHV0CisvLyBJIC0gaW5wdXQgKG1hY3JvIGRvZXNuJ3QgY2hhbmdlIGl0KQorI2RlZmluZSBDT05WRVJUXzJfQllURVNfVE9fSEFMRihPMCwgTzEsIE8yLCBPMywgTzQsIE81LCBPNiwgTzcsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSTAsIEkxLCBJMiwgSTMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbIiAjTzAgIl0sICAgJVsiICNJMCAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlWyIgI08xICJdLCAgICVbIiAjSTAgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYnIgICAgJVsiICNPMiAiXSwgICAlWyIgI0kxICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJsICAgICVbIiAjTzMgIl0sICAgJVsiICNJMSAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFiciAgICAlWyIgI080ICJdLCAgICVbIiAjSTIgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgIFwKKyAgInByZWNldS5waC5xYmwgICAgJVsiICNPNSAiXSwgICAlWyIgI0kyICJdICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICBcCisgICJwcmVjZXUucGgucWJyICAgICVbIiAjTzYgIl0sICAgJVsiICNJMyAiXSAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgXAorICAicHJlY2V1LnBoLnFibCAgICAlWyIgI083ICJdLCAgICVbIiAjSTMgIl0gICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKworLy8gdGVtcDBbMzEuLjE2IHwgMTUuLjBdID0gdGVtcDBbMzEuLjE2IHwgMTUuLjBdICsgdGVtcDhbMzEuLjE2IHwgMTUuLjBdCisvLyB0ZW1wMFszMS4uMTYgfCAxNS4uMF0gPSB0ZW1wMFszMS4uMTYgPDwocykgNyB8IDE1Li4wIDw8KHMpIDddCisvLyB0ZW1wMS4udGVtcDcgc2FtZSBhcyB0ZW1wMAorLy8gcHJlY3JxdV9zLnFiLnBoIHRlbXAwLCB0ZW1wMSwgdGVtcDA6CisvLyAgIHRlbXAwID0gdGVtcDFbMzEuLjI0XSB8IHRlbXAxWzE1Li44XSB8IHRlbXAwWzMxLi4yNF0gfCB0ZW1wMFsxNS4uOF0KKy8vIHN0b3JlIHRlbXAwIHRvIGRzdAorLy8gSU8gLSBpbnB1dC9vdXRwdXQKKy8vIEkgLSBpbnB1dCAobWFjcm8gZG9lc24ndCBjaGFuZ2UgaXQpCisjZGVmaW5lIFNUT1JFX1NBVF9TVU1fWDIoSU8wLCBJTzEsIElPMiwgSU8zLCBJTzQsIElPNSwgSU82LCBJTzcsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEkwLCBJMSwgSTIsIEkzLCBJNCwgSTUsIEk2LCBJNywgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJOCwgSTksIEkxMCwgSTExLCBJMTIsIEkxMykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU8wICJdLCAgJVsiICNJTzAgIl0sICAlWyIgI0kwICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPMSAiXSwgICVbIiAjSU8xICJdLCAgJVsiICNJMSAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzIgIl0sICAlWyIgI0lPMiAiXSwgICVbIiAjSTIgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU8zICJdLCAgJVsiICNJTzMgIl0sICAlWyIgI0kzICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPNCAiXSwgICVbIiAjSU80ICJdLCAgJVsiICNJNCAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgImFkZHEucGggICAgICAgICAgJVsiICNJTzUgIl0sICAlWyIgI0lPNSAiXSwgICVbIiAjSTUgIl0gICAgICAgICAgXG5cdCIgICAgICBcCisgICJhZGRxLnBoICAgICAgICAgICVbIiAjSU82ICJdLCAgJVsiICNJTzYgIl0sICAlWyIgI0k2ICJdICAgICAgICAgIFxuXHQiICAgICAgXAorICAiYWRkcS5waCAgICAgICAgICAlWyIgI0lPNyAiXSwgICVbIiAjSU83ICJdLCAgJVsiICNJNyAiXSAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzAgIl0sICAlWyIgI0lPMCAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU8xICJdLCAgJVsiICNJTzEgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPMiAiXSwgICVbIiAjSU8yICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzMgIl0sICAlWyIgI0lPMyAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU80ICJdLCAgJVsiICNJTzQgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAic2hsbF9zLnBoICAgICAgICAlWyIgI0lPNSAiXSwgICVbIiAjSU81ICJdLCAgNyAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgIFwKKyAgInNobGxfcy5waCAgICAgICAgJVsiICNJTzYgIl0sICAlWyIgI0lPNiAiXSwgIDcgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICBcCisgICJzaGxsX3MucGggICAgICAgICVbIiAjSU83ICJdLCAgJVsiICNJTzcgIl0sICA3ICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0lPMCAiXSwgICVbIiAjSU8xICJdLCAgJVsiICNJTzAgIl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVsiICNJTzIgIl0sICAlWyIgI0lPMyAiXSwgICVbIiAjSU8yICJdICAgICAgICAgXG5cdCIgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbIiAjSU80ICJdLCAgJVsiICNJTzUgIl0sICAlWyIgI0lPNCAiXSAgICAgICAgIFxuXHQiICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0lPNiAiXSwgICVbIiAjSU83ICJdLCAgJVsiICNJTzYgIl0gICAgICAgICBcblx0IiAgICAgIFwKKyAgInVzdyAgICAgICAgICAgICAgJVsiICNJTzAgIl0sICAiIFhTVFIoSTEzKSAiKiIgI0k5ICIoJVsiICNJOCAiXSkgICBcblx0IiAgICBcCisgICJ1c3cgICAgICAgICAgICAgICVbIiAjSU8yICJdLCAgIiBYU1RSKEkxMykgIioiICNJMTAgIiglWyIgI0k4ICJdKSAgXG5cdCIgICAgXAorICAidXN3ICAgICAgICAgICAgICAlWyIgI0lPNCAiXSwgICIgWFNUUihJMTMpICIqIiAjSTExICIoJVsiICNJOCAiXSkgIFxuXHQiICAgIFwKKyAgInVzdyAgICAgICAgICAgICAgJVsiICNJTzYgIl0sICAiIFhTVFIoSTEzKSAiKiIgI0kxMiAiKCVbIiAjSTggIl0pICBcblx0IgorCisjZGVmaW5lIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTAoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICA6IFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wMl0iPSZyIih0ZW1wMiksIFt0ZW1wM10iPSZyIih0ZW1wMyksICAgICAgICAgICAgIFwKKyAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbdGVtcDZdIj0mciIodGVtcDYpLCAgICAgICAgICAgICBcCisgICAgW3RlbXA3XSI9JnIiKHRlbXA3KSwgW3RlbXA4XSI9JnIiKHRlbXA4KSwgW3RlbXA5XSI9JnIiKHRlbXA5KSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wMTBdIj0mciIodGVtcDEwKQorCisjZGVmaW5lIE9VVFBVVF9FQVJMWV9DTE9CQkVSX1JFR1NfMTgoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBPVVRQVVRfRUFSTFlfQ0xPQkJFUl9SRUdTXzEwKCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLCBbdGVtcDEyXSI9JnIiKHRlbXAxMiksIFt0ZW1wMTNdIj0mciIodGVtcDEzKSwgICAgICAgICBcCisgIFt0ZW1wMTRdIj0mciIodGVtcDE0KSwgW3RlbXAxNV0iPSZyIih0ZW1wMTUpLCBbdGVtcDE2XSI9JnIiKHRlbXAxNiksICAgICAgICAgXAorICBbdGVtcDE3XSI9JnIiKHRlbXAxNyksIFt0ZW1wMThdIj0mciIodGVtcDE4KQorCisjZW5kaWYgIC8vIFdFQlBfRFNQX01JUFNfTUFDUk9fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvbXNhX21hY3JvLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21zYV9tYWNyby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWNkYTYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL21zYV9tYWNyby5oCkBAIC0wLDAgKzEsMTM5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSBjb21tb24gbWFjcm9zCisvLworLy8gQXV0aG9yKHMpOiAgUHJhc2hhbnQgUGF0aWwgICAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9NU0FfTUFDUk9fSF8KKyNkZWZpbmUgV0VCUF9EU1BfTVNBX01BQ1JPX0hfCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxtc2EuaD4KKworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorICAjZGVmaW5lIENMQU5HX0JVSUxECisjZW5kaWYKKworI2lmZGVmIENMQU5HX0JVSUxECisgICNkZWZpbmUgQUxQSEFWQUwgICgtMSkKKyAgI2RlZmluZSBBRERWSV9IKGEsIGIpICBfX21zYV9hZGR2aV9oKCh2OGkxNilhLCBiKQorICAjZGVmaW5lIEFERFZJX1coYSwgYikgIF9fbXNhX2FkZHZpX3coKHY0aTMyKWEsIGIpCisgICNkZWZpbmUgU1JBSV9CKGEsIGIpICBfX21zYV9zcmFpX2IoKHYxNmk4KWEsIGIpCisgICNkZWZpbmUgU1JBSV9IKGEsIGIpICBfX21zYV9zcmFpX2goKHY4aTE2KWEsIGIpCisgICNkZWZpbmUgU1JBSV9XKGEsIGIpICBfX21zYV9zcmFpX3coKHY0aTMyKWEsIGIpCisgICNkZWZpbmUgU1JMSV9IKGEsIGIpICBfX21zYV9zcmxpX2goKHY4aTE2KWEsIGIpCisgICNkZWZpbmUgU0xMSV9CKGEsIGIpICBfX21zYV9zbGxpX2IoKHY0aTMyKWEsIGIpCisgICNkZWZpbmUgQU5ESV9CKGEsIGIpICBfX21zYV9hbmRpX2IoKHYxNnU4KWEsIGIpCisgICNkZWZpbmUgT1JJX0IoYSwgYikgICBfX21zYV9vcmlfYigodjE2dTgpYSwgYikKKyNlbHNlCisgICNkZWZpbmUgQUxQSEFWQUwgICgweGZmKQorICAjZGVmaW5lIEFERFZJX0goYSwgYikgIChhICsgYikKKyAgI2RlZmluZSBBRERWSV9XKGEsIGIpICAoYSArIGIpCisgICNkZWZpbmUgU1JBSV9CKGEsIGIpICAoYSA+PiBiKQorICAjZGVmaW5lIFNSQUlfSChhLCBiKSAgKGEgPj4gYikKKyAgI2RlZmluZSBTUkFJX1coYSwgYikgIChhID4+IGIpCisgICNkZWZpbmUgU1JMSV9IKGEsIGIpICAoYSA8PCBiKQorICAjZGVmaW5lIFNMTElfQihhLCBiKSAgKGEgPDwgYikKKyAgI2RlZmluZSBBTkRJX0IoYSwgYikgIChhICYgYikKKyAgI2RlZmluZSBPUklfQihhLCBiKSAgIChhIHwgYikKKyNlbmRpZgorCisjZGVmaW5lIExEX0IoUlRZUEUsIHBzcmMpICooKFJUWVBFKikocHNyYykpCisjZGVmaW5lIExEX1VCKC4uLikgTERfQih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCKC4uLikgTERfQih2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfSChSVFlQRSwgcHNyYykgKigoUlRZUEUqKShwc3JjKSkKKyNkZWZpbmUgTERfVUgoLi4uKSBMRF9IKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0goLi4uKSBMRF9IKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9XKFJUWVBFLCBwc3JjKSAqKChSVFlQRSopKHBzcmMpKQorI2RlZmluZSBMRF9VVyguLi4pIExEX1codjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TVyguLi4pIExEX1codjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNUX0IoUlRZUEUsIGluLCBwZHN0KSAqKChSVFlQRSopKHBkc3QpKSA9IGluCisjZGVmaW5lIFNUX1VCKC4uLikgU1RfQih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NCKC4uLikgU1RfQih2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfSChSVFlQRSwgaW4sIHBkc3QpICooKFJUWVBFKikocGRzdCkpID0gaW4KKyNkZWZpbmUgU1RfVUgoLi4uKSBTVF9IKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU0goLi4uKSBTVF9IKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9XKFJUWVBFLCBpbiwgcGRzdCkgKigoUlRZUEUqKShwZHN0KSkgPSBpbgorI2RlZmluZSBTVF9VVyguLi4pIFNUX1codjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TVyguLi4pIFNUX1codjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIE1TQV9MT0FEX0ZVTkMoVFlQRSwgSU5TVFIsIEZVTkNfTkFNRSkgICAgICAgICAgICAgXAorICBzdGF0aWMgaW5saW5lIFRZUEUgRlVOQ19OQU1FKGNvbnN0IHZvaWQqIGNvbnN0IHBzcmMpIHsgIFwKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBwc3JjX20gPSAoY29uc3QgdWludDhfdCopcHNyYzsgICBcCisgICAgVFlQRSB2YWxfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzbSB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICIiICNJTlNUUiAiICVbdmFsX21dLCAlW3BzcmNfbV0gIFxuXHQiICAgICAgICAgICAgICBcCisgICAgICA6IFt2YWxfbV0gIj1yIiAodmFsX20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBbcHNyY19tXSAibSIgKCpwc3JjX20pKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdmFsX207ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBNU0FfTE9BRChwc3JjLCBGVU5DX05BTUUpICBGVU5DX05BTUUocHNyYykKKworI2RlZmluZSBNU0FfU1RPUkVfRlVOQyhUWVBFLCBJTlNUUiwgRlVOQ19OQU1FKSAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIGlubGluZSB2b2lkIEZVTkNfTkFNRShUWVBFIHZhbCwgdm9pZCogY29uc3QgcGRzdCkgeyBcCisgICAgdWludDhfdCogY29uc3QgcGRzdF9tID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgdmFsX20gPSB2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc20gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAiICIgI0lOU1RSICIgICVbdmFsX21dLCAgJVtwZHN0X21dICBcblx0IiAgICAgICAgICAgICAgXAorICAgICAgOiBbcGRzdF9tXSAiPW0iICgqcGRzdF9tKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogW3ZhbF9tXSAiciIgKHZhbF9tKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBNU0FfU1RPUkUodmFsLCBwZHN0LCBGVU5DX05BTUUpICBGVU5DX05BTUUodmFsLCBwZHN0KQorCisjaWYgKF9fbWlwc19pc2FfcmV2ID49IDYpCisgIE1TQV9MT0FEX0ZVTkModWludDE2X3QsIGxoLCBtc2FfbGgpOworICAjZGVmaW5lIExIKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfbGgpCisgIE1TQV9MT0FEX0ZVTkModWludDMyX3QsIGx3LCBtc2FfbHcpOworICAjZGVmaW5lIExXKHBzcmMpICBNU0FfTE9BRChwc3JjLCBtc2FfbHcpCisgICNpZiAoX19taXBzID09IDY0KQorICAgIE1TQV9MT0FEX0ZVTkModWludDY0X3QsIGxkLCBtc2FfbGQpOworICAgICNkZWZpbmUgTEQocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV9sZCkKKyAgI2Vsc2UgIC8vICEoX19taXBzID09IDY0KQorICAgICNkZWZpbmUgTEQocHNyYykgICgoKCh1aW50NjRfdClNU0FfTE9BRChwc3JjICsgNCwgbXNhX2x3KSkgPDwgMzIpIHwgXAorICAgICAgICAgICAgICAgICAgICAgICBNU0FfTE9BRChwc3JjLCBtc2FfbHcpKQorICAjZW5kaWYgIC8vIChfX21pcHMgPT0gNjQpCisKKyAgTVNBX1NUT1JFX0ZVTkModWludDE2X3QsIHNoLCBtc2Ffc2gpOworICAjZGVmaW5lIFNIKHZhbCwgcGRzdCkgIE1TQV9TVE9SRSh2YWwsIHBkc3QsIG1zYV9zaCkKKyAgTVNBX1NUT1JFX0ZVTkModWludDMyX3QsIHN3LCBtc2Ffc3cpOworICAjZGVmaW5lIFNXKHZhbCwgcGRzdCkgIE1TQV9TVE9SRSh2YWwsIHBkc3QsIG1zYV9zdykKKyAgTVNBX1NUT1JFX0ZVTkModWludDY0X3QsIHNkLCBtc2Ffc2QpOworICAjZGVmaW5lIFNEKHZhbCwgcGRzdCkgIE1TQV9TVE9SRSh2YWwsIHBkc3QsIG1zYV9zZCkKKyNlbHNlICAvLyAhKF9fbWlwc19pc2FfcmV2ID49IDYpCisgIE1TQV9MT0FEX0ZVTkModWludDE2X3QsIHVsaCwgbXNhX3VsaCk7CisgICNkZWZpbmUgTEgocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV91bGgpCisgIE1TQV9MT0FEX0ZVTkModWludDMyX3QsIHVsdywgbXNhX3Vsdyk7CisgICNkZWZpbmUgTFcocHNyYykgIE1TQV9MT0FEKHBzcmMsIG1zYV91bHcpCisgICNpZiAoX19taXBzID09IDY0KQorICAgIE1TQV9MT0FEX0ZVTkModWludDY0X3QsIHVsZCwgbXNhX3VsZCk7CisgICAgI2RlZmluZSBMRChwc3JjKSAgTVNBX0xPQUQocHNyYywgbXNhX3VsZCkKKyAgI2Vsc2UgIC8vICEoX19taXBzID09IDY0KQorICAgICNkZWZpbmUgTEQocHNyYykgICgoKCh1aW50NjRfdClNU0FfTE9BRChwc3JjICsgNCwgbXNhX3VsdykpIDw8IDMyKSB8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1TQV9MT0FEKHBzcmMsIG1zYV91bHcpKQorICAjZW5kaWYgIC8vIChfX21pcHMgPT0gNjQpCisKKyAgTVNBX1NUT1JFX0ZVTkModWludDE2X3QsIHVzaCwgbXNhX3VzaCk7CisgICNkZWZpbmUgU0godmFsLCBwZHN0KSAgTVNBX1NUT1JFKHZhbCwgcGRzdCwgbXNhX3VzaCkKKyAgTVNBX1NUT1JFX0ZVTkModWludDMyX3QsIHVzdywgbXNhX3Vzdyk7CisgICNkZWZpbmUgU1codmFsLCBwZHN0KSAgTVNBX1NUT1JFKHZhbCwgcGRzdCwgbXNhX3VzdykKKyAgI2RlZmluZSBTRCh2YWwsIHBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCBwZHN0X3NkX20gPSAodWludDhfdCopKHBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB2YWwwX20gPSAodWludDMyX3QpKHZhbCAmIDB4MDAwMDAwMDBGRkZGRkZGRik7ICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB2YWwxX20gPSAodWludDMyX3QpKCh2YWwgPj4gMzIpICYgMHgwMDAwMDAwMEZGRkZGRkZGKTsgIFwKKyAgICBTVyh2YWwwX20sIHBkc3Rfc2RfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVyh2YWwxX20sIHBkc3Rfc2RfbSArIDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZiAgLy8gKF9fbWlwc19pc2FfcmV2ID49IDYpCisKKy8qIERlc2NyaXB0aW9uIDogTG9hZCA0IHdvcmRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBwc3JjLCBzdHJpZGUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKKyAqIERldGFpbHMgICAgIDogTG9hZCB3b3JkIGluICdvdXQwJyBmcm9tIChwc3JjKQorICogICAgICAgICAgICAgICBMb2FkIHdvcmQgaW4gJ291dDEnIGZyb20gKHBzcmMgKyBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIExvYWQgd29yZCBpbiAnb3V0MicgZnJvbSAocHNyYyArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIExvYWQgd29yZCBpbiAnb3V0MycgZnJvbSAocHNyYyArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgTFc0KHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICBjb25zdCB1aW50OF90KiBwdG1wID0gKGNvbnN0IHVpbnQ4X3QqKXBzcmM7ICAgICAgICAgICBcCisgIG91dDAgPSBMVyhwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gTFcocHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IExXKHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDMgPSBMVyhwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgd29yZHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogU3RvcmUgd29yZCBmcm9tICdpbjAnIHRvIChwZHN0KQorICogICAgICAgICAgICAgICBTdG9yZSB3b3JkIGZyb20gJ2luMScgdG8gKHBkc3QgKyBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIHdvcmQgZnJvbSAnaW4yJyB0byAocGRzdCArIDIgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIHdvcmQgZnJvbSAnaW4zJyB0byAocGRzdCArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1c0KGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQ4X3QqIHB0bXAgPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjAsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNXKGluMSwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4yLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjMsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1czKGluMCwgaW4xLCBpbjIsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50OF90KiBwdG1wID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICBcCisgIFNXKGluMCwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjEsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1coaW4yLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVzIoaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB1aW50OF90KiBwdG1wID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgXAorICBTVyhpbjAsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVyhpbjEsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSA0IGRvdWJsZSB3b3JkcyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBTdG9yZSBkb3VibGUgd29yZCBmcm9tICdpbjAnIHRvIChwZHN0KQorICogICAgICAgICAgICAgICBTdG9yZSBkb3VibGUgd29yZCBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSBkb3VibGUgd29yZCBmcm9tICdpbjInIHRvIChwZHN0ICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgZG91YmxlIHdvcmQgZnJvbSAnaW4zJyB0byAocGRzdCArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU0Q0KGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQ4X3QqIHB0bXAgPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgXAorICBTRChpbjAsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHRtcCArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNEKGluMSwgcHRtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwdG1wICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0QoaW4yLCBwdG1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHB0bXAgKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTRChpbjMsIHB0bXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogTG9hZCB2ZWN0b3JzIHdpdGggMTYgYnl0ZSBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gcHNyYywgc3RyaWRlCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IExvYWQgMTYgYnl0ZSBlbGVtZW50cyBpbiAnb3V0MCcgZnJvbSAocHNyYykKKyAqICAgICAgICAgICAgICAgTG9hZCAxNiBieXRlIGVsZW1lbnRzIGluICdvdXQxJyBmcm9tIChwc3JjICsgc3RyaWRlKQorICovCisjZGVmaW5lIExEX0IyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IExEX0IoUlRZUEUsIHBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gTERfQihSVFlQRSwgcHNyYyArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VQjIoLi4uKSBMRF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NCMiguLi4pIExEX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9CMyhSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyKSBkbyB7ICBcCisgIExEX0IyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IExEX0IoUlRZUEUsIHBzcmMgKyAyICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVUIzKC4uLikgTERfQjModjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TQjMoLi4uKSBMRF9CMyh2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfQjQoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICBMRF9CMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExEX0IyKFJUWVBFLCBwc3JjICsgMiAqIHN0cmlkZSAsIHN0cmlkZSwgb3V0Miwgb3V0Myk7ICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VCNCguLi4pIExEX0I0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0I0KC4uLikgTERfQjQodjE2aTgsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIExEX0I4KFJUWVBFLCBwc3JjLCBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NykgZG8geyAgXAorICBMRF9CNChSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCisgIExEX0I0KFJUWVBFLCBwc3JjICsgNCAqIHN0cmlkZSwgc3RyaWRlLCBvdXQ0LCBvdXQ1LCBvdXQ2LCBvdXQ3KTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VCOCguLi4pIExEX0I4KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU0I4KC4uLikgTERfQjgodjE2aTgsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IExvYWQgdmVjdG9ycyB3aXRoIDggaGFsZndvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIHBzcmMsIHN0cmlkZQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBMb2FkIDggaGFsZndvcmQgZWxlbWVudHMgaW4gJ291dDAnIGZyb20gKHBzcmMpCisgKiAgICAgICAgICAgICAgIExvYWQgOCBoYWxmd29yZCBlbGVtZW50cyBpbiAnb3V0MScgZnJvbSAocHNyYyArIHN0cmlkZSkKKyAqLworI2RlZmluZSBMRF9IMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBMRF9IKFJUWVBFLCBwc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IExEX0goUlRZUEUsIHBzcmMgKyBzdHJpZGUpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVUgyKC4uLikgTERfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TSDIoLi4uKSBMRF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogTG9hZCB2ZWN0b3JzIHdpdGggNCB3b3JkIGVsZW1lbnRzIHdpdGggc3RyaWRlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBwc3JjLCBzdHJpZGUKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKKyAqIERldGFpbHMgICAgIDogTG9hZCA0IHdvcmQgZWxlbWVudHMgaW4gJ291dDAnIGZyb20gKHBzcmMgKyAwICogc3RyaWRlKQorICogICAgICAgICAgICAgICBMb2FkIDQgd29yZCBlbGVtZW50cyBpbiAnb3V0MScgZnJvbSAocHNyYyArIDEgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIExvYWQgNCB3b3JkIGVsZW1lbnRzIGluICdvdXQyJyBmcm9tIChwc3JjICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgTG9hZCA0IHdvcmQgZWxlbWVudHMgaW4gJ291dDMnIGZyb20gKHBzcmMgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIExEX1cyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IExEX1coUlRZUEUsIHBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gTERfVyhSVFlQRSwgcHNyYyArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBMRF9VVzIoLi4uKSBMRF9XMih2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIExEX1NXMiguLi4pIExEX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBMRF9XMyhSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxLCBvdXQyKSBkbyB7ICBcCisgIExEX1cyKFJUWVBFLCBwc3JjLCBzdHJpZGUsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IExEX1coUlRZUEUsIHBzcmMgKyAyICogc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgTERfVVczKC4uLikgTERfVzModjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBMRF9TVzMoLi4uKSBMRF9XMyh2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgTERfVzQoUlRZUEUsIHBzcmMsIHN0cmlkZSwgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICBMRF9XMihSVFlQRSwgcHNyYywgc3RyaWRlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIExEX1cyKFJUWVBFLCBwc3JjICsgMiAqIHN0cmlkZSwgc3RyaWRlLCBvdXQyLCBvdXQzKTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIExEX1VXNCguLi4pIExEX1c0KHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTERfU1c0KC4uLikgTERfVzQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIHZlY3RvcnMgb2YgMTYgYnl0ZSBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IFN0b3JlIDE2IGJ5dGUgZWxlbWVudHMgZnJvbSAnaW4wJyB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgU3RvcmUgMTYgYnl0ZSBlbGVtZW50cyBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQorICovCisjZGVmaW5lIFNUX0IyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX0IoUlRZUEUsIGluMCwgcGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX0IoUlRZUEUsIGluMSwgcGRzdCArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VQjIoLi4uKSBTVF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NCMiguLi4pIFNUX0IyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9CNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgU1RfQjIoUlRZUEUsIGluMCwgaW4xLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX0IyKFJUWVBFLCBpbjIsIGluMywgcGRzdCArIDIgKiBzdHJpZGUsIHN0cmlkZSk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVUI0KC4uLikgU1RfQjQodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TQjQoLi4uKSBTVF9CNCh2MTZpOCwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfQjgoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgICBcCisgICAgICAgICAgICAgIHBkc3QsIHN0cmlkZSkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9CNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUpOyAgICAgICAgICAgICAgIFwKKyAgU1RfQjQoUlRZUEUsIGluNCwgaW41LCBpbjYsIGluNywgcGRzdCArIDQgKiBzdHJpZGUsIHN0cmlkZSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VQjgoLi4uKSBTVF9COCh2MTZ1OCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU3RvcmUgdmVjdG9ycyBvZiA0IHdvcmQgZWxlbWVudHMgd2l0aCBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogU3RvcmUgNCB3b3JkIGVsZW1lbnRzIGZyb20gJ2luMCcgdG8gKHBkc3QgKyAwICogc3RyaWRlKQorICogICAgICAgICAgICAgICBTdG9yZSA0IHdvcmQgZWxlbWVudHMgZnJvbSAnaW4xJyB0byAocGRzdCArIDEgKiBzdHJpZGUpCisgKiAgICAgICAgICAgICAgIFN0b3JlIDQgd29yZCBlbGVtZW50cyBmcm9tICdpbjInIHRvIChwZHN0ICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgU3RvcmUgNCB3b3JkIGVsZW1lbnRzIGZyb20gJ2luMycgdG8gKHBkc3QgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIFNUX1cyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX1coUlRZUEUsIGluMCwgcGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1coUlRZUEUsIGluMSwgcGRzdCArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VVzIoLi4uKSBTVF9XMih2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NXMiguLi4pIFNUX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTVF9XMyhSVFlQRSwgaW4wLCBpbjEsIGluMiwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX1cyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgICAgICAgIFwKKyAgU1RfVyhSVFlQRSwgaW4yLCBwZHN0ICsgMiAqIHN0cmlkZSk7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1RfVVczKC4uLikgU1RfVzModjR1MzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTVF9TVzMoLi4uKSBTVF9XMyh2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1RfVzQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX1cyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9XMihSVFlQRSwgaW4yLCBpbjMsIHBkc3QgKyAyICogc3RyaWRlLCBzdHJpZGUpOyAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNUX1VXNCguLi4pIFNUX1c0KHY0dTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1RfU1c0KC4uLikgU1RfVzQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFN0b3JlIHZlY3RvcnMgb2YgOCBoYWxmd29yZCBlbGVtZW50cyB3aXRoIHN0cmlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgcGRzdCwgc3RyaWRlCisgKiBEZXRhaWxzICAgICA6IFN0b3JlIDggaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnaW4wJyB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgU3RvcmUgOCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdpbjEnIHRvIChwZHN0ICsgc3RyaWRlKQorICovCisjZGVmaW5lIFNUX0gyKFJUWVBFLCBpbjAsIGluMSwgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIFNUX0goUlRZUEUsIGluMCwgcGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX0goUlRZUEUsIGluMSwgcGRzdCArIHN0cmlkZSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVF9VSDIoLi4uKSBTVF9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNUX1NIMiguLi4pIFNUX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSAyeDQgYnl0ZSBibG9jayB0byBkZXN0aW5hdGlvbiBtZW1vcnkgZnJvbSBpbnB1dCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4sIHN0aWR4LCBwZHN0LCBzdHJpZGUKKyAqIERldGFpbHMgICAgIDogSW5kZXggJ3N0aWR4JyBoYWxmd29yZCBlbGVtZW50IGZyb20gJ2luJyB2ZWN0b3IgaXMgY29waWVkIHRvCisgKiAgICAgICAgICAgICAgIHRoZSBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0KQorICogICAgICAgICAgICAgICBJbmRleCAnc3RpZHgrMScgaGFsZndvcmQgZWxlbWVudCBmcm9tICdpbicgdmVjdG9yIGlzIGNvcGllZCB0bworICogICAgICAgICAgICAgICB0aGUgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgSW5kZXggJ3N0aWR4KzInIGhhbGZ3b3JkIGVsZW1lbnQgZnJvbSAnaW4nIHZlY3RvciBpcyBjb3BpZWQgdG8KKyAqICAgICAgICAgICAgICAgdGhlIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyAyICogc3RyaWRlKQorICogICAgICAgICAgICAgICBJbmRleCAnc3RpZHgrMycgaGFsZndvcmQgZWxlbWVudCBmcm9tICdpbicgdmVjdG9yIGlzIGNvcGllZCB0bworICogICAgICAgICAgICAgICB0aGUgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCArIDMgKiBzdHJpZGUpCisgKi8KKyNkZWZpbmUgU1QyeDRfVUIoaW4sIHN0aWR4LCBwZHN0LCBzdHJpZGUpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90KiBwYmxrXzJ4NF9tID0gKHVpbnQ4X3QqKXBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNl90IG91dDBfbSA9IF9fbXNhX2NvcHlfc19oKCh2OGkxNilpbiwgc3RpZHgpOyAgICAgIFwKKyAgY29uc3QgdWludDE2X3Qgb3V0MV9tID0gX19tc2FfY29weV9zX2goKHY4aTE2KWluLCBzdGlkeCArIDEpOyAgXAorICBjb25zdCB1aW50MTZfdCBvdXQyX20gPSBfX21zYV9jb3B5X3NfaCgodjhpMTYpaW4sIHN0aWR4ICsgMik7ICBcCisgIGNvbnN0IHVpbnQxNl90IG91dDNfbSA9IF9fbXNhX2NvcHlfc19oKCh2OGkxNilpbiwgc3RpZHggKyAzKTsgIFwKKyAgU0gob3V0MF9tLCBwYmxrXzJ4NF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwYmxrXzJ4NF9tICs9IHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNIKG91dDFfbSwgcGJsa18yeDRfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcGJsa18yeDRfbSArPSBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTSChvdXQyX20sIHBibGtfMng0X20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHBibGtfMng0X20gKz0gc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0gob3V0M19tLCBwYmxrXzJ4NF9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTdG9yZSA0eDQgYnl0ZSBibG9jayB0byBkZXN0aW5hdGlvbiBtZW1vcnkgZnJvbSBpbnB1dCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiAnSWR4MCcgd29yZCBlbGVtZW50IGZyb20gaW5wdXQgdmVjdG9yICdpbjAnIGlzIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgR1AgcmVnaXN0ZXIgYW5kIHN0b3JlZCB0byAocGRzdCkKKyAqICAgICAgICAgICAgICAgJ0lkeDEnIHdvcmQgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciAnaW4wJyBpcyBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyBzdHJpZGUpCisgKiAgICAgICAgICAgICAgICdJZHgyJyB3b3JkIGVsZW1lbnQgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luMCcgaXMgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICBHUCByZWdpc3RlciBhbmQgc3RvcmVkIHRvIChwZHN0ICsgMiAqIHN0cmlkZSkKKyAqICAgICAgICAgICAgICAgJ0lkeDMnIHdvcmQgZWxlbWVudCBmcm9tIGlucHV0IHZlY3RvciAnaW4wJyBpcyBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIEdQIHJlZ2lzdGVyIGFuZCBzdG9yZWQgdG8gKHBkc3QgKyAzICogc3RyaWRlKQorICovCisjZGVmaW5lIFNUNHg0X1VCKGluMCwgaW4xLCBpZHgwLCBpZHgxLCBpZHgyLCBpZHgzLCBwZHN0LCBzdHJpZGUpIGRvIHsgIFwKKyAgdWludDhfdCogY29uc3QgcGJsa180eDRfbSA9ICh1aW50OF90KilwZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCBvdXQwX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpaW4wLCBpZHgwKTsgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IG91dDFfbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilpbjAsIGlkeDEpOyAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3Qgb3V0Ml9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKWluMSwgaWR4Mik7ICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCBvdXQzX20gPSBfX21zYV9jb3B5X3NfdygodjRpMzIpaW4xLCBpZHgzKTsgICAgICAgICAgICBcCisgIFNXNChvdXQwX20sIG91dDFfbSwgb3V0Ml9tLCBvdXQzX20sIHBibGtfNHg0X20sIHN0cmlkZSk7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1Q0eDhfVUIoaW4wLCBpbjEsIHBkc3QsIHN0cmlkZSkgZG8geyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCogY29uc3QgcGJsa180eDggPSAodWludDhfdCopcGRzdDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1Q0eDRfVUIoaW4wLCBpbjAsIDAsIDEsIDIsIDMsIHBibGtfNHg4LCBzdHJpZGUpOyAgICAgICAgICAgICAgIFwKKyAgU1Q0eDRfVUIoaW4xLCBpbjEsIDAsIDEsIDIsIDMsIHBibGtfNHg4ICsgNCAqIHN0cmlkZSwgc3RyaWRlKTsgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogSW1tZWRpYXRlIG51bWJlciBvZiBlbGVtZW50cyB0byBzbGlkZQorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNsaWRlX3ZhbAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0CisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEJ5dGUgZWxlbWVudHMgZnJvbSAnaW4xJyB2ZWN0b3IgYXJlIHNsaWQgaW50byAnaW4wJyBieQorICogICAgICAgICAgICAgICB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlICdzbGlkZV92YWwnCisgKi8KKyNkZWZpbmUgU0xESV9CKFJUWVBFLCBpbjAsIGluMSwgc2xpZGVfdmFsKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChSVFlQRSlfX21zYV9zbGRpX2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSwgc2xpZGVfdmFsKSAgXAorCisjZGVmaW5lIFNMRElfVUIoLi4uKSBTTERJX0IodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTTERJX1NCKC4uLikgU0xESV9CKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU0xESV9TSCguLi4pIFNMRElfQih2OGkxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU2h1ZmZsZSBieXRlIHZlY3RvciBlbGVtZW50cyBhcyBwZXIgbWFzayB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgbWFzazAsIG1hc2sxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEJ5dGUgZWxlbWVudHMgZnJvbSAnaW4wJyAmICdpbjEnIGFyZSBjb3BpZWQgc2VsZWN0aXZlbHkgdG8KKyAqICAgICAgICAgICAgICAgJ291dDAnIGFzIHBlciBjb250cm9sIHZlY3RvciAnbWFzazAnCisgKi8KKyNkZWZpbmUgVlNIRl9CKFJUWVBFLCBpbjAsIGluMSwgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChSVFlQRSlfX21zYV92c2hmX2IoKHYxNmk4KW1hc2ssICh2MTZpOClpbjEsICh2MTZpOClpbjApCisKKyNkZWZpbmUgVlNIRl9VQiguLi4pIFZTSEZfQih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfU0IoLi4uKSBWU0hGX0IodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX1VIKC4uLikgVlNIRl9CKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9TSCguLi4pIFZTSEZfQih2OGkxNiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgVlNIRl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBtYXNrMCwgbWFzazEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IFZTSEZfQihSVFlQRSwgaW4wLCBpbjEsIG1hc2swKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IFZTSEZfQihSVFlQRSwgaW4yLCBpbjMsIG1hc2sxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFZTSEZfQjJfVUIoLi4uKSBWU0hGX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgVlNIRl9CMl9TQiguLi4pIFZTSEZfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBWU0hGX0IyX1VIKC4uLikgVlNIRl9CMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfQjJfU0goLi4uKSBWU0hGX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTaHVmZmxlIGhhbGZ3b3JkIHZlY3RvciBlbGVtZW50cyBhcyBwZXIgbWFzayB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywgbWFzazAsIG1hc2sxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gJ2luMCcgJiAnaW4xJyBhcmUgY29waWVkIHNlbGVjdGl2ZWx5IHRvCisgKiAgICAgICAgICAgICAgICdvdXQwJyBhcyBwZXIgY29udHJvbCB2ZWN0b3IgJ21hc2swJworICovCisjZGVmaW5lIFZTSEZfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgbWFzazAsIG1hc2sxLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfdnNoZl9oKCh2OGkxNiltYXNrMCwgKHY4aTE2KWluMSwgKHY4aTE2KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfdnNoZl9oKCh2OGkxNiltYXNrMSwgKHY4aTE2KWluMywgKHY4aTE2KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBWU0hGX0gyX1VIKC4uLikgVlNIRl9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFZTSEZfSDJfU0goLi4uKSBWU0hGX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBEb3QgcHJvZHVjdCBvZiBieXRlIHZlY3RvciBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogU2lnbmVkIGJ5dGUgZWxlbWVudHMgZnJvbSAnbXVsdDAnIGFyZSBtdWx0aXBsaWVkIHdpdGgKKyAqICAgICAgICAgICAgICAgc2lnbmVkIGJ5dGUgZWxlbWVudHMgZnJvbSAnY25zdDAnIHByb2R1Y2luZyBhIHJlc3VsdAorICogICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCBoYWxmd29yZC4KKyAqICAgICAgICAgICAgICAgVGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiBhZGphY2VudCBvZGQtZXZlbiBlbGVtZW50cworICogICAgICAgICAgICAgICBhcmUgYWRkZWQgdG9nZXRoZXIgYW5kIHdyaXR0ZW4gdG8gdGhlICdvdXQwJyB2ZWN0b3IKKyovCisjZGVmaW5lIERPVFBfU0IyKFJUWVBFLCBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2RvdHBfc19oKCh2MTZpOCltdWx0MCwgKHYxNmk4KWNuc3QwKTsgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9kb3RwX3NfaCgodjE2aTgpbXVsdDEsICh2MTZpOCljbnN0MSk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBET1RQX1NCMl9TSCguLi4pIERPVFBfU0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBEb3QgcHJvZHVjdCBvZiBoYWxmd29yZCB2ZWN0b3IgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdtdWx0MCcgYXJlIG11bHRpcGxpZWQgd2l0aAorICogICAgICAgICAgICAgICBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnY25zdDAnIHByb2R1Y2luZyBhIHJlc3VsdAorICogICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCB3b3JkLgorICogICAgICAgICAgICAgICBUaGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IG9mIGFkamFjZW50IG9kZC1ldmVuIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgIGFyZSBhZGRlZCB0b2dldGhlciBhbmQgd3JpdHRlbiB0byB0aGUgJ291dDAnIHZlY3RvcgorICovCisjZGVmaW5lIERPVFBfU0gyKFJUWVBFLCBtdWx0MCwgbXVsdDEsIGNuc3QwLCBjbnN0MSwgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2RvdHBfc193KCh2OGkxNiltdWx0MCwgKHY4aTE2KWNuc3QwKTsgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9kb3RwX3NfdygodjhpMTYpbXVsdDEsICh2OGkxNiljbnN0MSk7ICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBET1RQX1NIMl9TVyguLi4pIERPVFBfU0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBEb3QgcHJvZHVjdCBvZiB1bnNpZ25lZCB3b3JkIHZlY3RvciBlbGVtZW50cworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogVW5zaWduZWQgd29yZCBlbGVtZW50cyBmcm9tICdtdWx0MCcgYXJlIG11bHRpcGxpZWQgd2l0aAorICogICAgICAgICAgICAgICB1bnNpZ25lZCB3b3JkIGVsZW1lbnRzIGZyb20gJ2Nuc3QwJyBwcm9kdWNpbmcgYSByZXN1bHQKKyAqICAgICAgICAgICAgICAgdHdpY2UgdGhlIHNpemUgb2YgaW5wdXQgaS5lLiB1bnNpZ25lZCBkb3VibGUgd29yZC4KKyAqICAgICAgICAgICAgICAgVGhlIG11bHRpcGxpY2F0aW9uIHJlc3VsdCBvZiBhZGphY2VudCBvZGQtZXZlbiBlbGVtZW50cworICogICAgICAgICAgICAgICBhcmUgYWRkZWQgdG9nZXRoZXIgYW5kIHdyaXR0ZW4gdG8gdGhlICdvdXQwJyB2ZWN0b3IKKyAqLworI2RlZmluZSBET1RQX1VXMihSVFlQRSwgbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9kb3RwX3VfZCgodjR1MzIpbXVsdDAsICh2NHUzMiljbnN0MCk7ICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfZG90cF91X2QoKHY0dTMyKW11bHQxLCAodjR1MzIpY25zdDEpOyAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRE9UUF9VVzJfVUQoLi4uKSBET1RQX1VXMih2MnU2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogRG90IHByb2R1Y3QgJiBhZGRpdGlvbiBvZiBoYWxmd29yZCB2ZWN0b3IgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIG11bHQwLCBtdWx0MSwgY25zdDAsIGNuc3QxCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFNpZ25lZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tICdtdWx0MCcgYXJlIG11bHRpcGxpZWQgd2l0aAorICogICAgICAgICAgICAgICBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgZnJvbSAnY25zdDAnIHByb2R1Y2luZyBhIHJlc3VsdAorICogICAgICAgICAgICAgICB0d2ljZSB0aGUgc2l6ZSBvZiBpbnB1dCBpLmUuIHNpZ25lZCB3b3JkLgorICogICAgICAgICAgICAgICBUaGUgbXVsdGlwbGljYXRpb24gcmVzdWx0IG9mIGFkamFjZW50IG9kZC1ldmVuIGVsZW1lbnRzCisgKiAgICAgICAgICAgICAgIGFyZSBhZGRlZCB0byB0aGUgJ291dDAnIHZlY3RvcgorICovCisjZGVmaW5lIERQQUREX1NIMihSVFlQRSwgbXVsdDAsIG11bHQxLCBjbnN0MCwgY25zdDEsIG91dDAsIG91dDEpIGRvIHsgICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfZHBhZGRfc193KCh2NGkzMilvdXQwLCAodjhpMTYpbXVsdDAsICh2OGkxNiljbnN0MCk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfZHBhZGRfc193KCh2NGkzMilvdXQxLCAodjhpMTYpbXVsdDEsICh2OGkxNiljbnN0MSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBEUEFERF9TSDJfU1coLi4uKSBEUEFERF9TSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IENsaXBzIGFsbCBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yCisgKiAgICAgICAgICAgICAgIGJldHdlZW4gMCAmIDI1NQorICogQXJndW1lbnRzICAgOiBJbnB1dC9vdXRwdXQgIC0gdmFsCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIGhhbGZ3b3JkCisgKi8KKyNkZWZpbmUgQ0xJUF9TSF8wXzI1NSh2YWwpIGRvIHsgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiBtYXhfbSA9IF9fbXNhX2xkaV9oKDI1NSk7ICAgICAgICAgICBcCisgIHZhbCA9IF9fbXNhX21heGlfc19oKCh2OGkxNil2YWwsIDApOyAgICAgICAgICAgIFwKKyAgdmFsID0gX19tc2FfbWluX3NfaChtYXhfbSwgKHY4aTE2KXZhbCk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1NIMl8wXzI1NShpbjAsIGluMSkgZG8geyAgXAorICBDTElQX1NIXzBfMjU1KGluMCk7ICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NIXzBfMjU1KGluMSk7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1NINF8wXzI1NShpbjAsIGluMSwgaW4yLCBpbjMpIGRvIHsgIFwKKyAgQ0xJUF9TSDJfMF8yNTUoaW4wLCBpbjEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0gyXzBfMjU1KGluMiwgaW4zKTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBDbGlwcyBhbGwgdW5zaWduZWQgaGFsZndvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yCisgKiAgICAgICAgICAgICAgIGJldHdlZW4gMCAmIDI1NQorICogQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbgorICogICAgICAgICAgICAgICBPdXRwdXQgLSBvdXRfbQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGhhbGZ3b3JkCisgKi8KKyNkZWZpbmUgQ0xJUF9VSF8wXzI1NShpbikgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2OHUxNiBtYXhfbSA9ICh2OHUxNilfX21zYV9sZGlfaCgyNTUpOyAgICBcCisgIGluID0gX19tc2FfbWF4aV91X2goKHY4dTE2KSBpbiwgMCk7ICAgICAgICAgICAgIFwKKyAgaW4gPSBfX21zYV9taW5fdV9oKCh2OHUxNikgbWF4X20sICh2OHUxNikgaW4pOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDTElQX1VIMl8wXzI1NShpbjAsIGluMSkgZG8geyAgXAorICBDTElQX1VIXzBfMjU1KGluMCk7ICAgICAgICAgICAgICAgICAgXAorICBDTElQX1VIXzBfMjU1KGluMSk7ICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBDbGlwcyBhbGwgc2lnbmVkIHdvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yCisgKiAgICAgICAgICAgICAgIGJldHdlZW4gMCAmIDI1NQorICogQXJndW1lbnRzICAgOiBJbnB1dC9vdXRwdXQgIC0gdmFsCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKKyAqLworI2RlZmluZSBDTElQX1NXXzBfMjU1KHZhbCkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY0aTMyIG1heF9tID0gX19tc2FfbGRpX3coMjU1KTsgICAgICAgICAgIFwKKyAgdmFsID0gX19tc2FfbWF4aV9zX3coKHY0aTMyKXZhbCwgMCk7ICAgICAgICAgICAgXAorICB2YWwgPSBfX21zYV9taW5fc193KG1heF9tLCAodjRpMzIpdmFsKTsgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENMSVBfU1c0XzBfMjU1KGluMCwgaW4xLCBpbjIsIGluMykgZG8geyAgIFwKKyAgQ0xJUF9TV18wXzI1NShpbjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDTElQX1NXXzBfMjU1KGluMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU1dfMF8yNTUoaW4yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TV18wXzI1NShpbjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBIb3Jpem9udGFsIGFkZGl0aW9uIG9mIDQgc2lnbmVkIHdvcmQgZWxlbWVudHMgb2YgaW5wdXQgdmVjdG9yCisgKiBBcmd1bWVudHMgICA6IElucHV0ICAtIGluICAgICAgIChzaWduZWQgd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIHN1bV9tICAgIChpMzIgc3VtKQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkIChHUCkKKyAqIERldGFpbHMgICAgIDogNCBzaWduZWQgd29yZCBlbGVtZW50cyBvZiAnaW4nIHZlY3RvciBhcmUgYWRkZWQgdG9nZXRoZXIgYW5kCisgKiAgICAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgaW50ZWdlciBzdW0gaXMgcmV0dXJuZWQKKyAqLworc3RhdGljIFdFQlBfSU5MSU5FIGludDMyX3QgZnVuY19oYWRkX3N3X3MzMih2NGkzMiBpbikgeworICBjb25zdCB2Mmk2NCByZXMwX20gPSBfX21zYV9oYWRkX3NfZCgodjRpMzIpaW4sICh2NGkzMilpbik7CisgIGNvbnN0IHYyaTY0IHJlczFfbSA9IF9fbXNhX3NwbGF0aV9kKHJlczBfbSwgMSk7CisgIGNvbnN0IHYyaTY0IG91dCA9IHJlczBfbSArIHJlczFfbTsKKyAgaW50MzJfdCBzdW1fbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilvdXQsIDApOworICByZXR1cm4gc3VtX207Cit9CisjZGVmaW5lIEhBRERfU1dfUzMyKGluKSBmdW5jX2hhZGRfc3dfczMyKGluKQorCisvKiBEZXNjcmlwdGlvbiA6IEhvcml6b250YWwgYWRkaXRpb24gb2YgOCBzaWduZWQgaGFsZndvcmQgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgIC0gaW4gICAgICAgKHNpZ25lZCBoYWxmd29yZCB2ZWN0b3IpCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIHN1bV9tICAgIChzMzIgc3VtKQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHNpZ25lZCB3b3JkCisgKiBEZXRhaWxzICAgICA6IDggc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvciBhcmUgYWRkZWQKKyAqICAgICAgICAgICAgICAgdG9nZXRoZXIgYW5kIHRoZSByZXN1bHRpbmcgaW50ZWdlciBzdW0gaXMgcmV0dXJuZWQKKyAqLworc3RhdGljIFdFQlBfSU5MSU5FIGludDMyX3QgZnVuY19oYWRkX3NoX3MzMih2OGkxNiBpbikgeworICBjb25zdCB2NGkzMiByZXMgPSBfX21zYV9oYWRkX3NfdyhpbiwgaW4pOworICBjb25zdCB2Mmk2NCByZXMwID0gX19tc2FfaGFkZF9zX2QocmVzLCByZXMpOworICBjb25zdCB2Mmk2NCByZXMxID0gX19tc2Ffc3BsYXRpX2QocmVzMCwgMSk7CisgIGNvbnN0IHYyaTY0IHJlczIgPSByZXMwICsgcmVzMTsKKyAgY29uc3QgaW50MzJfdCBzdW1fbSA9IF9fbXNhX2NvcHlfc193KCh2NGkzMilyZXMyLCAwKTsKKyAgcmV0dXJuIHN1bV9tOworfQorI2RlZmluZSBIQUREX1NIX1MzMihpbikgZnVuY19oYWRkX3NoX3MzMihpbikKKworLyogRGVzY3JpcHRpb24gOiBIb3Jpem9udGFsIGFkZGl0aW9uIG9mIDggdW5zaWduZWQgaGFsZndvcmQgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgIC0gaW4gICAgICAgKHVuc2lnbmVkIGhhbGZ3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgT3V0cHV0IC0gc3VtX20gICAgKHUzMiBzdW0pCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgd29yZAorICogRGV0YWlscyAgICAgOiA4IHVuc2lnbmVkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mIGlucHV0IHZlY3RvciBhcmUgYWRkZWQKKyAqICAgICAgICAgICAgICAgdG9nZXRoZXIgYW5kIHRoZSByZXN1bHRpbmcgaW50ZWdlciBzdW0gaXMgcmV0dXJuZWQKKyAqLworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IGZ1bmNfaGFkZF91aF91MzIodjh1MTYgaW4pIHsKKyAgdWludDMyX3Qgc3VtX207CisgIGNvbnN0IHY0dTMyIHJlc19tID0gX19tc2FfaGFkZF91X3coaW4sIGluKTsKKyAgdjJ1NjQgcmVzMF9tID0gX19tc2FfaGFkZF91X2QocmVzX20sIHJlc19tKTsKKyAgdjJ1NjQgcmVzMV9tID0gKHYydTY0KV9fbXNhX3NwbGF0aV9kKCh2Mmk2NClyZXMwX20sIDEpOworICByZXMwX20gPSByZXMwX20gKyByZXMxX207CisgIHN1bV9tID0gX19tc2FfY29weV9zX3coKHY0aTMyKXJlczBfbSwgMCk7CisgIHJldHVybiBzdW1fbTsKK30KKyNkZWZpbmUgSEFERF9VSF9VMzIoaW4pIGZ1bmNfaGFkZF91aF91MzIoaW4pCisKKy8qIERlc2NyaXB0aW9uIDogSG9yaXpvbnRhbCBhZGRpdGlvbiBvZiBzaWduZWQgaGFsZiB3b3JkIHZlY3RvciBlbGVtZW50cworICAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKKyAgICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAgICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAgIERldGFpbHMgICAgIDogRWFjaCBzaWduZWQgb2RkIGhhbGYgd29yZCBlbGVtZW50IGZyb20gJ2luMCcgaXMgYWRkZWQgdG8KKyAgICAgICAgICAgICAgICAgZXZlbiBzaWduZWQgaGFsZiB3b3JkIGVsZW1lbnQgZnJvbSAnaW4wJyAocGFpcndpc2UpIGFuZCB0aGUKKyAgICAgICAgICAgICAgICAgaGFsZndvcmQgcmVzdWx0IGlzIHdyaXR0ZW4gaW4gJ291dDAnCisqLworI2RlZmluZSBIQUREX1NIMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgICAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2hhZGRfc193KCh2OGkxNilpbjAsICh2OGkxNilpbjApOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2hhZGRfc193KCh2OGkxNilpbjEsICh2OGkxNilpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSEFERF9TSDJfU1coLi4uKSBIQUREX1NIMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSEFERF9TSDQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICBIQUREX1NIMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEhBRERfU0gyKFJUWVBFLCBpbjIsIGluMywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEhBRERfU0g0X1NXKC4uLikgSEFERF9TSDQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEhvcml6b250YWwgc3VidHJhY3Rpb24gb2YgdW5zaWduZWQgYnl0ZSB2ZWN0b3IgZWxlbWVudHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggdW5zaWduZWQgb2RkIGJ5dGUgZWxlbWVudCBmcm9tICdpbjAnIGlzIHN1YnRyYWN0ZWQgZnJvbQorICogICAgICAgICAgICAgICBldmVuIHVuc2lnbmVkIGJ5dGUgZWxlbWVudCBmcm9tICdpbjAnIChwYWlyd2lzZSkgYW5kIHRoZQorICogICAgICAgICAgICAgICBoYWxmd29yZCByZXN1bHQgaXMgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBIU1VCX1VCMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgICAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2hzdWJfdV9oKCh2MTZ1OClpbjAsICh2MTZ1OClpbjApOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2hzdWJfdV9oKCh2MTZ1OClpbjEsICh2MTZ1OClpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSFNVQl9VQjJfVUgoLi4uKSBIU1VCX1VCMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIEhTVUJfVUIyX1NIKC4uLikgSFNVQl9VQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBIU1VCX1VCMl9TVyguLi4pIEhTVUJfVUIyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBTZXQgZWxlbWVudCBuIGlucHV0IHZlY3RvciB0byBHUFIgdmFsdWUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIG91dAorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBTZXQgZWxlbWVudCAwIGluIHZlY3RvciAnb3V0JyB0byB2YWx1ZSBzcGVjaWZpZWQgaW4gJ2luMCcKKyAqLworI2RlZmluZSBJTlNFUlRfVzIoUlRZUEUsIGluMCwgaW4xLCBvdXQpIGRvIHsgICAgICAgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDAsIGluMCk7ICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAxLCBpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSU5TRVJUX1cyX1VCKC4uLikgSU5TRVJUX1cyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5TRVJUX1cyX1NCKC4uLikgSU5TRVJUX1cyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTlNFUlRfVzQoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0KSBkbyB7ICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAwLCBpbjApOyAgICAgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF93KCh2NGkzMilvdXQsIDEsIGluMSk7ICAgICAgXAorICBvdXQgPSAoUlRZUEUpX19tc2FfaW5zZXJ0X3coKHY0aTMyKW91dCwgMiwgaW4yKTsgICAgICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfdygodjRpMzIpb3V0LCAzLCBpbjMpOyAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElOU0VSVF9XNF9VQiguLi4pIElOU0VSVF9XNCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElOU0VSVF9XNF9TQiguLi4pIElOU0VSVF9XNCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElOU0VSVF9XNF9TVyguLi4pIElOU0VSVF9XNCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogU2V0IGVsZW1lbnQgbiBvZiBkb3VibGUgd29yZCBpbnB1dCB2ZWN0b3IgdG8gR1BSIHZhbHVlCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAtIGluMCwgaW4xCisgKiAgICAgICAgICAgICAgIE91dHB1dCAtIG91dAorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBTZXQgZWxlbWVudCAwIGluIHZlY3RvciAnb3V0JyB0byBHUFIgdmFsdWUgc3BlY2lmaWVkIGluICdpbjAnCisgKiAgICAgICAgICAgICAgIFNldCBlbGVtZW50IDEgaW4gdmVjdG9yICdvdXQnIHRvIEdQUiB2YWx1ZSBzcGVjaWZpZWQgaW4gJ2luMScKKyAqLworI2RlZmluZSBJTlNFUlRfRDIoUlRZUEUsIGluMCwgaW4xLCBvdXQpIGRvIHsgICAgICAgIFwKKyAgb3V0ID0gKFJUWVBFKV9fbXNhX2luc2VydF9kKCh2Mmk2NClvdXQsIDAsIGluMCk7ICBcCisgIG91dCA9IChSVFlQRSlfX21zYV9pbnNlcnRfZCgodjJpNjQpb3V0LCAxLCBpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSU5TRVJUX0QyX1VCKC4uLikgSU5TRVJUX0QyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSU5TRVJUX0QyX1NCKC4uLikgSU5TRVJUX0QyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4gYnl0ZSBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIGJ5dGUgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZFVl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfYigodjE2aTgpaW4xLCAodjE2aTgpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZldl9iKCh2MTZpOClpbjMsICh2MTZpOClpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZfQjJfVUIoLi4uKSBJTFZFVl9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0IyX1NCKC4uLikgSUxWRVZfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9CMl9VSCguLi4pIElMVkVWX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfQjJfU0goLi4uKSBJTFZFVl9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0IyX1NEKC4uLikgSUxWRVZfQjIodjJpNjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgb2RkIGJ5dGUgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogT2RkIGJ5dGUgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZPRF9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2b2RfYigodjE2aTgpaW4xLCAodjE2aTgpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZvZF9iKCh2MTZpOClpbjMsICh2MTZpOClpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWT0RfQjJfVUIoLi4uKSBJTFZPRF9CMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0IyX1NCKC4uLikgSUxWT0RfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9CMl9VSCguLi4pIElMVk9EX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfQjJfU0goLi4uKSBJTFZPRF9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0IyX1NEKC4uLikgSUxWT0RfQjIodjJpNjQsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgZXZlbiBoYWxmd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgSUxWRVZfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X2goKHY4aTE2KWluMSwgKHY4aTE2KWluMCk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2ZXZfaCgodjhpMTYpaW4zLCAodjhpMTYpaW4yKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVkVWX0gyX1VCKC4uLikgSUxWRVZfSDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9IMl9VSCguLi4pIElMVkVWX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfSDJfU0goLi4uKSBJTFZFVl9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0gyX1NXKC4uLikgSUxWRVZfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEludGVybGVhdmUgb2RkIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IE9kZCBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVk9EX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZvZF9oKCh2OGkxNilpbjEsICh2OGkxNilpbjApOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdm9kX2goKHY4aTE2KWluMywgKHY4aTE2KWluMik7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZPRF9IMl9VQiguLi4pIElMVk9EX0gyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWT0RfSDJfVUgoLi4uKSBJTFZPRF9IMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVk9EX0gyX1NIKC4uLikgSUxWT0RfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZPRF9IMl9TVyguLi4pIElMVk9EX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGV2ZW4gd29yZCBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIHdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZFVl9XMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfdygodjRpMzIpaW4xLCAodjRpMzIpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZldl93KCh2NGkzMilpbjMsICh2NGkzMilpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZfVzJfVUIoLi4uKSBJTFZFVl9XMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX1cyX1NCKC4uLikgSUxWRVZfVzIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9XMl9VSCguLi4pIElMVkVWX1cyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfVzJfU0QoLi4uKSBJTFZFVl9XMih2Mmk2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuLW9kZCB3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJworICogICAgICAgICAgICAgICBPZGQgd29yZCBlbGVtZW50cyBvZiAnaW4yJyBhbmQgJ2luMycgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQxJworICovCisjZGVmaW5lIElMVkVWT0RfVzIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X3coKHY0aTMyKWluMSwgKHY0aTMyKWluMCk7ICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZvZF93KCh2NGkzMilpbjMsICh2NGkzMilpbjIpOyAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVk9EX1cyX1VCKC4uLikgSUxWRVZPRF9XMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfVzJfVUgoLi4uKSBJTFZFVk9EX1cyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9XMl9TSCguLi4pIElMVkVWT0RfVzIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX1cyX1NXKC4uLikgSUxWRVZPRF9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuLW9kZCBoYWxmLXdvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRXZlbiBoYWxmLXdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqICAgICAgICAgICAgICAgT2RkIGhhbGYtd29yZCBlbGVtZW50cyBvZiAnaW4yJyBhbmQgJ2luMycgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQxJworICovCisjZGVmaW5lIElMVkVWT0RfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdmV2X2goKHY4aTE2KWluMSwgKHY4aTE2KWluMCk7ICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZvZF9oKCh2OGkxNilpbjMsICh2OGkxNilpbjIpOyAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZFVk9EX0gyX1VCKC4uLikgSUxWRVZPRF9IMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWT0RfSDJfVUgoLi4uKSBJTFZFVk9EX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZPRF9IMl9TSCguLi4pIElMVkVWT0RfSDIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVk9EX0gyX1NXKC4uLikgSUxWRVZPRF9IMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBldmVuIGRvdWJsZSB3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEV2ZW4gZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZSBpbnRlcmxlYXZlZAorICogICAgICAgICAgICAgICBhbmQgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBJTFZFVl9EMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2ZXZfZCgodjJpNjQpaW4xLCAodjJpNjQpaW4wKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZldl9kKCh2Mmk2NClpbjMsICh2Mmk2NClpbjIpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWRVZfRDJfVUIoLi4uKSBJTFZFVl9EMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkVWX0QyX1NCKC4uLikgSUxWRVZfRDIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZFVl9EMl9TVyguLi4pIElMVkVWX0QyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWRVZfRDJfU0QoLi4uKSBJTFZFVl9EMih2Mmk2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSBsZWZ0IGhhbGYgb2YgYnl0ZSBlbGVtZW50cyBmcm9tIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBMZWZ0IGhhbGYgb2YgYnl0ZSBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlIGludGVybGVhdmVkCisgKiAgICAgICAgICAgICAgIGFuZCB3cml0dGVuIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBJTFZMX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZsX2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2bF9iKCh2MTZpOClpbjIsICh2MTZpOClpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWTF9CMl9VQiguLi4pIElMVkxfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZMX0IyX1NCKC4uLikgSUxWTF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVkxfQjJfVUgoLi4uKSBJTFZMX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWTF9CMl9TSCguLi4pIElMVkxfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZMX0IyX1NXKC4uLikgSUxWTF9CMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSByaWdodCBoYWxmIG9mIGJ5dGUgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogUmlnaHQgaGFsZiBvZiBieXRlIGVsZW1lbnRzIG9mICdpbjAnIGFuZCAnaW4xJyBhcmUgaW50ZXJsZWF2ZWQKKyAqICAgICAgICAgICAgICAgYW5kIHdyaXR0ZW4gdG8gb3V0MC4KKyAqLworI2RlZmluZSBJTFZSX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2cl9iKCh2MTZpOClpbjIsICh2MTZpOClpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9CMl9VQiguLi4pIElMVlJfQjIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0IyX1NCKC4uLikgSUxWUl9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjJfVUgoLi4uKSBJTFZSX0IyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CMl9TSCguLi4pIElMVlJfQjIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0IyX1NXKC4uLikgSUxWUl9CMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSUxWUl9CNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSX0IyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgSUxWUl9CMihSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0I0X1VCKC4uLikgSUxWUl9CNCh2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjRfU0IoLi4uKSBJTFZSX0I0KHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9CNF9VSCguLi4pIElMVlJfQjQodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0I0X1NIKC4uLikgSUxWUl9CNCh2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfQjRfU1coLi4uKSBJTFZSX0I0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIHJpZ2h0IGhhbGYgb2YgaGFsZndvcmQgZWxlbWVudHMgZnJvbSB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogUmlnaHQgaGFsZiBvZiBoYWxmd29yZCBlbGVtZW50cyBvZiAnaW4wJyBhbmQgJ2luMScgYXJlCisgKiAgICAgICAgICAgICAgIGludGVybGVhdmVkIGFuZCB3cml0dGVuIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBJTFZSX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX2goKHY4aTE2KWluMCwgKHY4aTE2KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2cl9oKCh2OGkxNilpbjIsICh2OGkxNilpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUl9IMl9VQiguLi4pIElMVlJfSDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0gyX1NIKC4uLikgSUxWUl9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfSDJfU1coLi4uKSBJTFZSX0gyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTFZSX0g0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICAgICBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBJTFZSX0gyKFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfSDRfVUIoLi4uKSBJTFZSX0g0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9INF9TSCguLi4pIElMVlJfSDQodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0g0X1NXKC4uLikgSUxWUl9INCh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogSW50ZXJsZWF2ZSByaWdodCBoYWxmIG9mIGRvdWJsZSB3b3JkIGVsZW1lbnRzIGZyb20gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IFJpZ2h0IGhhbGYgb2YgZG91YmxlIHdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYW5kICdpbjEnIGFyZQorICogICAgICAgICAgICAgICBpbnRlcmxlYXZlZCBhbmQgd3JpdHRlbiB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgSUxWUl9EMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9kKCh2Mmk2NClpbjAsICh2Mmk2NClpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdnJfZCgodjJpNjQpaW4yLCAodjJpNjQpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJfRDJfVUIoLi4uKSBJTFZSX0QyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUl9EMl9TQiguLi4pIElMVlJfRDIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSX0QyX1NIKC4uLikgSUxWUl9EMih2OGkxNiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSUxWUl9ENChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSX0QyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgIFwKKyAgSUxWUl9EMihSVFlQRSwgaW40LCBpbjUsIGluNiwgaW43LCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSX0Q0X1NCKC4uLikgSUxWUl9ENCh2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJfRDRfVUIoLi4uKSBJTFZSX0Q0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBJbnRlcmxlYXZlIGJvdGggbGVmdCBhbmQgcmlnaHQgaGFsZiBvZiBpbnB1dCB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBSaWdodCBoYWxmIG9mIGJ5dGUgZWxlbWVudHMgZnJvbSAnaW4wJyBhbmQgJ2luMScgYXJlCisgKiAgICAgICAgICAgICAgIGludGVybGVhdmVkIGFuZCB3cml0dGVuIHRvICdvdXQwJworICovCisjZGVmaW5lIElMVlJMX0IyKFJUWVBFLCBpbjAsIGluMSwgb3V0MCwgb3V0MSkgZG8geyAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfYigodjE2aTgpaW4wLCAodjE2aTgpaW4xKTsgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9pbHZsX2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSk7ICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBJTFZSTF9CMl9VQiguLi4pIElMVlJMX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfQjJfU0IoLi4uKSBJTFZSTF9CMih2MTZpOCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0IyX1VIKC4uLikgSUxWUkxfQjIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9CMl9TSCguLi4pIElMVlJMX0IyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfQjJfU1coLi4uKSBJTFZSTF9CMih2NGkzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgSUxWUkxfSDIoUlRZUEUsIGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICAgICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfaWx2cl9oKCh2OGkxNilpbjAsICh2OGkxNilpbjEpOyAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX2lsdmxfaCgodjhpMTYpaW4wLCAodjhpMTYpaW4xKTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIElMVlJMX0gyX1VCKC4uLikgSUxWUkxfSDIodjE2dTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9IMl9TQiguLi4pIElMVlJMX0gyKHYxNmk4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfSDJfU0goLi4uKSBJTFZSTF9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX0gyX1NXKC4uLikgSUxWUkxfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9IMl9VVyguLi4pIElMVlJMX0gyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBJTFZSTF9XMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgICAgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9pbHZyX3coKHY0aTMyKWluMCwgKHY0aTMyKWluMSk7ICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2bF93KCh2NGkzMilpbjAsICh2NGkzMilpbjEpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgSUxWUkxfVzJfVUIoLi4uKSBJTFZSTF9XMih2MTZ1OCwgX19WQV9BUkdTX18pCisjZGVmaW5lIElMVlJMX1cyX1NIKC4uLikgSUxWUkxfVzIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBJTFZSTF9XMl9TVyguLi4pIElMVlJMX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgSUxWUkxfVzJfVVcoLi4uKSBJTFZSTF9XMih2NHUzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogUGFjayBldmVuIGJ5dGUgZWxlbWVudHMgb2YgdmVjdG9yIHBhaXJzCisgKiAgQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqICBEZXRhaWxzICAgICA6IEV2ZW4gYnl0ZSBlbGVtZW50cyBvZiAnaW4wJyBhcmUgY29waWVkIHRvIHRoZSBsZWZ0IGhhbGYgb2YKKyAqICAgICAgICAgICAgICAgICdvdXQwJyAmIGV2ZW4gYnl0ZSBlbGVtZW50cyBvZiAnaW4xJyBhcmUgY29waWVkIHRvIHRoZSByaWdodAorICogICAgICAgICAgICAgICAgaGFsZiBvZiAnb3V0MCcuCisgKi8KKyNkZWZpbmUgUENLRVZfQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX3Bja2V2X2IoKHYxNmk4KWluMCwgKHYxNmk4KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfcGNrZXZfYigodjE2aTgpaW4yLCAodjE2aTgpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBDS0VWX0IyX1NCKC4uLikgUENLRVZfQjIodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CMl9VQiguLi4pIFBDS0VWX0IyKHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjJfU0goLi4uKSBQQ0tFVl9CMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0IyX1NXKC4uLikgUENLRVZfQjIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFBDS0VWX0I0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywgIFwKKyAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyKFJUWVBFLCBpbjQsIGluNSwgaW42LCBpbjcsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBDS0VWX0I0X1NCKC4uLikgUENLRVZfQjQodjE2aTgsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9CNF9VQiguLi4pIFBDS0VWX0I0KHYxNnU4LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfQjRfU0goLi4uKSBQQ0tFVl9CNCh2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0I0X1NXKC4uLikgUENLRVZfQjQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFBhY2sgZXZlbiBoYWxmd29yZCBlbGVtZW50cyBvZiB2ZWN0b3IgcGFpcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFyZSBjb3BpZWQgdG8gdGhlIGxlZnQgaGFsZiBvZgorICogICAgICAgICAgICAgICAnb3V0MCcgJiBldmVuIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjEnIGFyZSBjb3BpZWQgdG8gdGhlCisgKiAgICAgICAgICAgICAgIHJpZ2h0IGhhbGYgb2YgJ291dDAnLgorICovCisjZGVmaW5lIFBDS0VWX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9wY2tldl9oKCh2OGkxNilpbjAsICh2OGkxNilpbjEpOyAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKV9fbXNhX3Bja2V2X2goKHY4aTE2KWluMiwgKHY4aTE2KWluMyk7ICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBQQ0tFVl9IMl9VSCguLi4pIFBDS0VWX0gyKHY4dTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfSDJfU0goLi4uKSBQQ0tFVl9IMih2OGkxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX0gyX1NXKC4uLikgUENLRVZfSDIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9IMl9VVyguLi4pIFBDS0VWX0gyKHY0dTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBQYWNrIGV2ZW4gd29yZCBlbGVtZW50cyBvZiB2ZWN0b3IgcGFpcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFdmVuIHdvcmQgZWxlbWVudHMgb2YgJ2luMCcgYXJlIGNvcGllZCB0byB0aGUgbGVmdCBoYWxmIG9mCisgKiAgICAgICAgICAgICAgICdvdXQwJyAmIGV2ZW4gd29yZCBlbGVtZW50cyBvZiAnaW4xJyBhcmUgY29waWVkIHRvIHRoZQorICogICAgICAgICAgICAgICByaWdodCBoYWxmIG9mICdvdXQwJy4KKyAqLworI2RlZmluZSBQQ0tFVl9XMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpX19tc2FfcGNrZXZfdygodjRpMzIpaW4wLCAodjRpMzIpaW4xKTsgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9wY2tldl93KCh2NGkzMilpbjIsICh2NGkzMilpbjMpOyAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgUENLRVZfVzJfVUgoLi4uKSBQQ0tFVl9XMih2OHUxNiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS0VWX1cyX1NIKC4uLikgUENLRVZfVzIodjhpMTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tFVl9XMl9TVyguLi4pIFBDS0VWX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLRVZfVzJfVVcoLi4uKSBQQ0tFVl9XMih2NHUzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogUGFjayBvZGQgaGFsZndvcmQgZWxlbWVudHMgb2YgdmVjdG9yIHBhaXJzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogT2RkIGhhbGZ3b3JkIGVsZW1lbnRzIG9mICdpbjAnIGFyZSBjb3BpZWQgdG8gdGhlIGxlZnQgaGFsZiBvZgorICogICAgICAgICAgICAgICAnb3V0MCcgJiBvZGQgaGFsZndvcmQgZWxlbWVudHMgb2YgJ2luMScgYXJlIGNvcGllZCB0byB0aGUKKyAqICAgICAgICAgICAgICAgcmlnaHQgaGFsZiBvZiAnb3V0MCcuCisgKi8KKyNkZWZpbmUgUENLT0RfSDIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX3Bja29kX2goKHY4aTE2KWluMCwgKHY4aTE2KWluMSk7ICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfcGNrb2RfaCgodjhpMTYpaW4yLCAodjhpMTYpaW4zKTsgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFBDS09EX0gyX1VIKC4uLikgUENLT0RfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorI2RlZmluZSBQQ0tPRF9IMl9TSCguLi4pIFBDS09EX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgUENLT0RfSDJfU1coLi4uKSBQQ0tPRF9IMih2NGkzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFBDS09EX0gyX1VXKC4uLikgUENLT0RfSDIodjR1MzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFyaXRobWV0aWMgaW1tZWRpYXRlIHNoaWZ0IHJpZ2h0IGFsbCBlbGVtZW50cyBvZiB3b3JkIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIHNoaWZ0CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBpbiBwbGFjZSBvcGVyYXRpb24KKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgaW5wdXQgdmVjdG9yIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBvZiB2ZWN0b3IgJ2luMCcgaXMgcmlnaHQgc2hpZnRlZCBieSAnc2hpZnQnIGFuZAorICogICAgICAgICAgICAgICB0aGUgcmVzdWx0IGlzIHdyaXR0ZW4gaW4tcGxhY2UuICdzaGlmdCcgaXMgYSBHUCB2YXJpYWJsZS4KKyAqLworI2RlZmluZSBTUkFJX1cyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnRfdmFsKSBkbyB7ICBcCisgIGluMCA9IChSVFlQRSlTUkFJX1coaW4wLCBzaGlmdF92YWwpOyAgICAgICAgICAgIFwKKyAgaW4xID0gKFJUWVBFKVNSQUlfVyhpbjEsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBSV9XMl9TVyguLi4pIFNSQUlfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFJX1cyX1VXKC4uLikgU1JBSV9XMih2NHUzMiwgX19WQV9BUkdTX18pCisKKyNkZWZpbmUgU1JBSV9XNChSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBzaGlmdF92YWwpIGRvIHsgIFwKKyAgU1JBSV9XMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBSV9XMihSVFlQRSwgaW4yLCBpbjMsIHNoaWZ0X3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQUlfVzRfU1coLi4uKSBTUkFJX1c0KHY0aTMyLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBSV9XNF9VVyguLi4pIFNSQUlfVzQodjR1MzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFyaXRobWV0aWMgc2hpZnQgcmlnaHQgYWxsIGVsZW1lbnRzIG9mIGhhbGYtd29yZCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzaGlmdAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4gcGxhY2Ugb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIGlucHV0IHZlY3RvciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgb2YgdmVjdG9yICdpbjAnIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgJ3NoaWZ0JyBhbmQKKyAqICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGluLXBsYWNlLiAnc2hpZnQnIGlzIGEgR1AgdmFyaWFibGUuCisgKi8KKyNkZWZpbmUgU1JBSV9IMihSVFlQRSwgaW4wLCBpbjEsIHNoaWZ0X3ZhbCkgZG8geyAgXAorICBpbjAgPSAoUlRZUEUpU1JBSV9IKGluMCwgc2hpZnRfdmFsKTsgICAgICAgICAgICBcCisgIGluMSA9IChSVFlQRSlTUkFJX0goaW4xLCBzaGlmdF92YWwpOyAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQUlfSDJfU0goLi4uKSBTUkFJX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBSV9IMl9VSCguLi4pIFNSQUlfSDIodjh1MTYsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IEFyaXRobWV0aWMgcm91bmRlZCBzaGlmdCByaWdodCBhbGwgZWxlbWVudHMgb2Ygd29yZCB2ZWN0b3IKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzaGlmdAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4gcGxhY2Ugb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIGlucHV0IHZlY3RvciBSVFlQRQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgb2YgdmVjdG9yICdpbjAnIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgJ3NoaWZ0JyBhbmQKKyAqICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBpcyB3cml0dGVuIGluLXBsYWNlLiAnc2hpZnQnIGlzIGEgR1AgdmFyaWFibGUuCisgKi8KKyNkZWZpbmUgU1JBUklfVzIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdCkgZG8geyAgICAgXAorICBpbjAgPSAoUlRZUEUpX19tc2Ffc3JhcmlfdygodjRpMzIpaW4wLCBzaGlmdCk7ICBcCisgIGluMSA9IChSVFlQRSlfX21zYV9zcmFyaV93KCh2NGkzMilpbjEsIHNoaWZ0KTsgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFNSQVJJX1cyX1NXKC4uLikgU1JBUklfVzIodjRpMzIsIF9fVkFfQVJHU19fKQorCisjZGVmaW5lIFNSQVJJX1c0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHNoaWZ0KSBkbyB7ICBcCisgIFNSQVJJX1cyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICBcCisgIFNSQVJJX1cyKFJUWVBFLCBpbjIsIGluMywgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTUkFSSV9XNF9TSCguLi4pIFNSQVJJX1c0KHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgU1JBUklfVzRfVVcoLi4uKSBTUkFSSV9XNCh2NHUzMiwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQVJJX1c0X1NXKC4uLikgU1JBUklfVzQodjRpMzIsIF9fVkFfQVJHU19fKQorCisvKiBEZXNjcmlwdGlvbiA6IFNoaWZ0IHJpZ2h0IGFyaXRobWV0aWMgcm91bmRlZCBkb3VibGUgd29yZHMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBzaGlmdAorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gaW4gcGxhY2Ugb3BlcmF0aW9uCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gYXMgcGVyIFJUWVBFCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBvZiB2ZWN0b3IgJ2luMCcgaXMgc2hpZnRlZCByaWdodCBhcml0aG1ldGljYWxseSBieQorICogICAgICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBpbiB0aGUgdmVjdG9yCisgKiAgICAgICAgICAgICAgICdzaGlmdCcuIFRoZSBsYXN0IGRpc2NhcmRlZCBiaXQgaXMgYWRkZWQgdG8gc2hpZnRlZCB2YWx1ZSBmb3IKKyAqICAgICAgICAgICAgICAgcm91bmRpbmcgYW5kIHRoZSByZXN1bHQgaXMgd3JpdHRlbiBpbi1wbGFjZS4KKyAqICAgICAgICAgICAgICAgJ3NoaWZ0JyBpcyBhIHZlY3Rvci4KKyAqLworI2RlZmluZSBTUkFSX0QyKFJUWVBFLCBpbjAsIGluMSwgc2hpZnQpIGRvIHsgICAgICAgICAgICBcCisgIGluMCA9IChSVFlQRSlfX21zYV9zcmFyX2QoKHYyaTY0KWluMCwgKHYyaTY0KXNoaWZ0KTsgIFwKKyAgaW4xID0gKFJUWVBFKV9fbXNhX3NyYXJfZCgodjJpNjQpaW4xLCAodjJpNjQpc2hpZnQpOyAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBUl9EMl9TVyguLi4pIFNSQVJfRDIodjRpMzIsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFSX0QyX1NEKC4uLikgU1JBUl9EMih2Mmk2NCwgX19WQV9BUkdTX18pCisjZGVmaW5lIFNSQVJfRDJfVUQoLi4uKSBTUkFSX0QyKHYydTY0LCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBTUkFSX0Q0KFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIHNoaWZ0KSBkbyB7ICBcCisgIFNSQVJfRDIoUlRZUEUsIGluMCwgaW4xLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1JBUl9EMihSVFlQRSwgaW4yLCBpbjMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgU1JBUl9ENF9TRCguLi4pIFNSQVJfRDQodjJpNjQsIF9fVkFfQVJHU19fKQorI2RlZmluZSBTUkFSX0Q0X1VEKC4uLikgU1JBUl9ENCh2MnU2NCwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQWRkaXRpb24gb2YgMiBwYWlycyBvZiBoYWxmLXdvcmQgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zCisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxCisgKiBEZXRhaWxzICAgICA6IEVhY2ggZWxlbWVudCBpbiAnaW4wJyBpcyBhZGRlZCB0byAnaW4xJyBhbmQgcmVzdWx0IGlzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgdG8gJ291dDAnLgorICovCisjZGVmaW5lIEFERFZJX0gyKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlBRERWSV9IKGluMCwgaW4xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gKFJUWVBFKUFERFZJX0goaW4yLCBpbjMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBBRERWSV9IMl9TSCguLi4pIEFERFZJX0gyKHY4aTE2LCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUREVklfSDJfVUgoLi4uKSBBRERWSV9IMih2OHUxNiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQWRkaXRpb24gb2YgMiBwYWlycyBvZiB3b3JkIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgaW4gJ2luMCcgaXMgYWRkZWQgdG8gJ2luMScgYW5kIHJlc3VsdCBpcyB3cml0dGVuCisgKiAgICAgICAgICAgICAgIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBBRERWSV9XMihSVFlQRSwgaW4wLCBpbjEsIGluMiwgaW4zLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSAoUlRZUEUpQUREVklfVyhpbjAsIGluMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlBRERWSV9XKGluMiwgaW4zKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgQUREVklfVzJfU1coLi4uKSBBRERWSV9XMih2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogRmlsbCAyIHBhaXJzIG9mIHdvcmQgdmVjdG9ycyB3aXRoIEdQIHJlZ2lzdGVycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogR1AgcmVnaXN0ZXIgaW4wIGlzIHJlcGxpY2F0ZWQgaW4gZWFjaCB3b3JkIGVsZW1lbnQgb2Ygb3V0MAorICogICAgICAgICAgICAgICBHUCByZWdpc3RlciBpbjEgaXMgcmVwbGljYXRlZCBpbiBlYWNoIHdvcmQgZWxlbWVudCBvZiBvdXQxCisgKi8KKyNkZWZpbmUgRklMTF9XMihSVFlQRSwgaW4wLCBpbjEsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IChSVFlQRSlfX21zYV9maWxsX3coaW4wKTsgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IChSVFlQRSlfX21zYV9maWxsX3coaW4xKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEZJTExfVzJfU1coLi4uKSBGSUxMX1cyKHY0aTMyLCBfX1ZBX0FSR1NfXykKKworLyogRGVzY3JpcHRpb24gOiBBZGRpdGlvbiBvZiAyIHBhaXJzIG9mIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgaW4gJ2luMCcgaXMgYWRkZWQgdG8gJ2luMScgYW5kIHJlc3VsdCBpcyB3cml0dGVuCisgKiAgICAgICAgICAgICAgIHRvICdvdXQwJy4KKyAqLworI2RlZmluZSBBREQyKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gaW4wICsgaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4yICsgaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBBREQ0KGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgXAorICBBREQyKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBBREQyKGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTdWJ0cmFjdGlvbiBvZiAyIHBhaXJzIG9mIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMworICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MQorICogRGV0YWlscyAgICAgOiBFYWNoIGVsZW1lbnQgaW4gJ2luMScgaXMgc3VidHJhY3RlZCBmcm9tICdpbjAnIGFuZCByZXN1bHQgaXMKKyAqICAgICAgICAgICAgICAgd3JpdHRlbiB0byAnb3V0MCcuCisgKi8KKyNkZWZpbmUgU1VCMihpbjAsIGluMSwgaW4yLCBpbjMsIG91dDAsIG91dDEpIGRvIHsgIFwKKyAgb3V0MCA9IGluMCAtIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMiAtIGluMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1VCMyhpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBvdXQwLCBvdXQxLCBvdXQyKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgLSBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4yIC0gaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IGluNCAtIGluNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNVQjQoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICBcCisgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICBcCisgIG91dDAgPSBpbjAgLSBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSBpbjIgLSBpbjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBpbjQgLSBpbjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDMgPSBpbjYgLSBpbjc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IEFkZGl0aW9uIC0gU3VidHJhY3Rpb24gb2YgaW5wdXQgdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGluICdpbjEnIGlzIGFkZGVkIHRvICdpbjAnIGFuZCByZXN1bHQgaXMKKyAqICAgICAgICAgICAgICAgd3JpdHRlbiB0byAnb3V0MCcuCisgKiAgICAgICAgICAgICAgIEVhY2ggZWxlbWVudCBpbiAnaW4xJyBpcyBzdWJ0cmFjdGVkIGZyb20gJ2luMCcgYW5kIHJlc3VsdCBpcworICogICAgICAgICAgICAgICB3cml0dGVuIHRvICdvdXQxJy4KKyAqLworI2RlZmluZSBBRERTVUIyKGluMCwgaW4xLCBvdXQwLCBvdXQxKSBkbyB7ICBcCisgIG91dDAgPSBpbjAgKyBpbjE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMCAtIGluMTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBNdWx0aXBsaWNhdGlvbiBvZiBwYWlycyBvZiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqIERldGFpbHMgICAgIDogRWFjaCBlbGVtZW50IGZyb20gJ2luMCcgaXMgbXVsdGlwbGllZCB3aXRoIGVsZW1lbnRzIGZyb20gJ2luMScKKyAqICAgICAgICAgICAgICAgYW5kIHRoZSByZXN1bHQgaXMgd3JpdHRlbiB0byAnb3V0MCcKKyAqLworI2RlZmluZSBNVUwyKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gaW4wICogaW4xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gaW4yICogaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNVUw0KGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgXAorICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMpIGRvIHsgICAgICAgICAgICAgXAorICBNVUwyKGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgXAorICBNVUwyKGluNCwgaW41LCBpbjYsIGluNywgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBTaWduIGV4dGVuZCBoYWxmd29yZCBlbGVtZW50cyBmcm9tIHJpZ2h0IGhhbGYgb2YgdGhlIHZlY3RvcgorICogQXJndW1lbnRzICAgOiBJbnB1dCAgLSBpbiAgICAoaGFsZndvcmQgdmVjdG9yKQorICogICAgICAgICAgICAgICBPdXRwdXQgLSBvdXQgICAoc2lnbiBleHRlbmRlZCB3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBzaWduZWQgd29yZAorICogRGV0YWlscyAgICAgOiBTaWduIGJpdCBvZiBoYWxmd29yZCBlbGVtZW50cyBmcm9tIGlucHV0IHZlY3RvciAnaW4nIGlzCisgKiAgICAgICAgICAgICAgIGV4dHJhY3RlZCBhbmQgaW50ZXJsZWF2ZWQgd2l0aCBzYW1lIHZlY3RvciAnaW4wJyB0byBnZW5lcmF0ZQorICogICAgICAgICAgICAgICA0IHdvcmQgZWxlbWVudHMga2VlcGluZyBzaWduIGludGFjdAorICovCisjZGVmaW5lIFVOUENLX1JfU0hfU1coaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4aTE2IHNpZ25fbSA9IF9fbXNhX2NsdGlfc19oKCh2OGkxNilpbiwgMCk7ICBcCisgIG91dCA9ICh2NGkzMilfX21zYV9pbHZyX2goc2lnbl9tLCAodjhpMTYpaW4pOyAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFNpZ24gZXh0ZW5kIGhhbGZ3b3JkIGVsZW1lbnRzIGZyb20gaW5wdXQgdmVjdG9yIGFuZCByZXR1cm4KKyAqICAgICAgICAgICAgICAgdGhlIHJlc3VsdCBpbiBwYWlyIG9mIHZlY3RvcnMKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXQgICAtIGluICAgICAgICAgICAgKGhhbGZ3b3JkIHZlY3RvcikKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEgICAoc2lnbiBleHRlbmRlZCB3b3JkIHZlY3RvcnMpCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gc2lnbmVkIHdvcmQKKyAqIERldGFpbHMgICAgIDogU2lnbiBiaXQgb2YgaGFsZndvcmQgZWxlbWVudHMgZnJvbSBpbnB1dCB2ZWN0b3IgJ2luJyBpcworICogICAgICAgICAgICAgICBleHRyYWN0ZWQgYW5kIGludGVybGVhdmVkIHJpZ2h0IHdpdGggc2FtZSB2ZWN0b3IgJ2luMCcgdG8KKyAqICAgICAgICAgICAgICAgZ2VuZXJhdGUgNCBzaWduZWQgd29yZCBlbGVtZW50cyBpbiAnb3V0MCcKKyAqICAgICAgICAgICAgICAgVGhlbiBpbnRlcmxlYXZlZCBsZWZ0IHdpdGggc2FtZSB2ZWN0b3IgJ2luMCcgdG8KKyAqICAgICAgICAgICAgICAgZ2VuZXJhdGUgNCBzaWduZWQgd29yZCBlbGVtZW50cyBpbiAnb3V0MScKKyAqLworI2RlZmluZSBVTlBDS19TSF9TVyhpbiwgb3V0MCwgb3V0MSkgZG8geyAgICAgICAgICAgICAgXAorICBjb25zdCB2OGkxNiB0bXBfbSA9IF9fbXNhX2NsdGlfc19oKCh2OGkxNilpbiwgMCk7ICAgXAorICBJTFZSTF9IMl9TVyh0bXBfbSwgaW4sIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBCdXR0ZXJmbHkgb2YgNCBpbnB1dCB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEsIG91dDIsIG91dDMKKyAqIERldGFpbHMgICAgIDogQnV0dGVyZmx5IG9wZXJhdGlvbgorICovCisjZGVmaW5lIEJVVFRFUkZMWV80KGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgXAorICBvdXQwID0gaW4wICsgaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MSA9IGluMSArIGluMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDIgPSBpbjEgLSBpbjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQzID0gaW4wIC0gaW4zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogVHJhbnNwb3NlIDE2eDQgYmxvY2sgaW50byA0eDE2IHdpdGggYnl0ZSBlbGVtZW50cyBpbiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41LCBpbjYsIGluNywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGluOCwgaW45LCBpbjEwLCBpbjExLCBpbjEyLCBpbjEzLCBpbjE0LCBpbjE1CisgKiAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzCisgKiAgICAgICAgICAgICAgIFJldHVybiBUeXBlIC0gdW5zaWduZWQgYnl0ZQorICovCisjZGVmaW5lIFRSQU5TUE9TRTE2eDRfVUJfVUIoaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW44LCBpbjksIGluMTAsIGluMTEsIGluMTIsIGluMTMsIGluMTQsIGluMTUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICBcCisgIHYyaTY0IHRtcDBfbSwgdG1wMV9tLCB0bXAyX20sIHRtcDNfbSwgdG1wNF9tLCB0bXA1X207ICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX1cyX1NEKGluMCwgaW40LCBpbjgsIGluMTIsIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX1cyX1NEKGluMSwgaW41LCBpbjksIGluMTMsIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1VCKHRtcDJfbSwgdG1wM19tLCB0bXAwX20sIHRtcDFfbSwgb3V0MSwgb3V0Myk7ICAgICAgICAgICAgICAgICBcCisgIElMVkVWX1cyX1NEKGluMiwgaW42LCBpbjEwLCBpbjE0LCB0bXA0X20sIHRtcDVfbSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX1cyX1NEKGluMywgaW43LCBpbjExLCBpbjE1LCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVkVWX0QyX1NEKHRtcDRfbSwgdG1wNV9tLCB0bXAwX20sIHRtcDFfbSwgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICBcCisgIElMVkVWX0IyX1NEKG91dDEsIG91dDMsIHRtcDJfbSwgdG1wM19tLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICBcCisgIElMVkVWT0RfSDJfVUIodG1wMF9tLCB0bXAxX20sIHRtcDBfbSwgdG1wMV9tLCBvdXQwLCBvdXQyKTsgICAgICAgICAgICAgICBcCisgIElMVk9EX0IyX1NEKG91dDEsIG91dDMsIHRtcDJfbSwgdG1wM19tLCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICBcCisgIElMVkVWT0RfSDJfVUIodG1wMF9tLCB0bXAxX20sIHRtcDBfbSwgdG1wMV9tLCBvdXQxLCBvdXQzKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvKiBEZXNjcmlwdGlvbiA6IFRyYW5zcG9zZSAxNng4IGJsb2NrIGludG8gOHgxNiB3aXRoIGJ5dGUgZWxlbWVudHMgaW4gdmVjdG9ycworICogQXJndW1lbnRzICAgOiBJbnB1dHMgIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBpbjQsIGluNSwgaW42LCBpbjcsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbjgsIGluOSwgaW4xMCwgaW4xMSwgaW4xMiwgaW4xMywgaW4xNCwgaW4xNQorICogICAgICAgICAgICAgICBPdXRwdXRzIC0gb3V0MCwgb3V0MSwgb3V0Miwgb3V0Mywgb3V0NCwgb3V0NSwgb3V0Niwgb3V0NworICogICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIHVuc2lnbmVkIGJ5dGUKKyAqLworI2RlZmluZSBUUkFOU1BPU0UxNng4X1VCX1VCKGluMCwgaW4xLCBpbjIsIGluMywgaW40LCBpbjUsIGluNiwgaW43LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluOCwgaW45LCBpbjEwLCBpbjExLCBpbjEyLCBpbjEzLCBpbjE0LCBpbjE1LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDAsIG91dDEsIG91dDIsIG91dDMsIG91dDQsIG91dDUsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dDYsIG91dDcpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiB0bXAwX20sIHRtcDFfbSwgdG1wNF9tLCB0bXA1X20sIHRtcDZfbSwgdG1wN19tOyAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiB0bXAyX20sIHRtcDNfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9VQihpbjAsIGluOCwgaW4xLCBpbjksIG91dDcsIG91dDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9VQihpbjIsIGluMTAsIGluMywgaW4xMSwgb3V0NSwgb3V0NCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9VQihpbjQsIGluMTIsIGluNSwgaW4xMywgb3V0Mywgb3V0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9EMl9VQihpbjYsIGluMTQsIGluNywgaW4xNSwgb3V0MSwgb3V0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9CMl9TSChvdXQ3LCBvdXQ2LCBvdXQ1LCBvdXQ0LCB0bXAwX20sIHRtcDFfbSk7ICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZPRF9CMl9TSChvdXQ3LCBvdXQ2LCBvdXQ1LCBvdXQ0LCB0bXA0X20sIHRtcDVfbSk7ICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9CMl9VQihvdXQzLCBvdXQyLCBvdXQxLCBvdXQwLCBvdXQ1LCBvdXQ3KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZPRF9CMl9TSChvdXQzLCBvdXQyLCBvdXQxLCBvdXQwLCB0bXA2X20sIHRtcDdfbSk7ICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZFVl9IMl9TVyh0bXAwX20sIHRtcDFfbSwgb3V0NSwgb3V0NywgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICAgICAgXAorICBJTFZFVk9EX1cyX1VCKHRtcDJfbSwgdG1wM19tLCB0bXAyX20sIHRtcDNfbSwgb3V0MCwgb3V0NCk7ICAgICAgICAgICAgICAgXAorICBJTFZPRF9IMl9TVyh0bXAwX20sIHRtcDFfbSwgb3V0NSwgb3V0NywgdG1wMl9tLCB0bXAzX20pOyAgICAgICAgICAgICAgICAgXAorICBJTFZFVk9EX1cyX1VCKHRtcDJfbSwgdG1wM19tLCB0bXAyX20sIHRtcDNfbSwgb3V0Miwgb3V0Nik7ICAgICAgICAgICAgICAgXAorICBJTFZFVl9IMl9TVyh0bXA0X20sIHRtcDVfbSwgdG1wNl9tLCB0bXA3X20sIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgXAorICBJTFZFVk9EX1cyX1VCKHRtcDJfbSwgdG1wM19tLCB0bXAyX20sIHRtcDNfbSwgb3V0MSwgb3V0NSk7ICAgICAgICAgICAgICAgXAorICBJTFZPRF9IMl9TVyh0bXA0X20sIHRtcDVfbSwgdG1wNl9tLCB0bXA3X20sIHRtcDJfbSwgdG1wM19tKTsgICAgICAgICAgICAgXAorICBJTFZFVk9EX1cyX1VCKHRtcDJfbSwgdG1wM19tLCB0bXAyX20sIHRtcDNfbSwgb3V0Mywgb3V0Nyk7ICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBUcmFuc3Bvc2UgNHg0IGJsb2NrIHdpdGggd29yZCBlbGVtZW50cyBpbiB2ZWN0b3JzCisgKiBBcmd1bWVudHMgICA6IElucHV0cyAgLSBpbjAsIGluMSwgaW4yLCBpbjMKKyAqICAgICAgICAgICAgICAgIE91dHB1dHMgLSBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzCisgKiAgICAgICAgICAgICAgICBSZXR1cm4gVHlwZSAtIGFzIHBlciBSVFlQRQorICovCisjZGVmaW5lIFRSQU5TUE9TRTR4NF9XKFJUWVBFLCBpbjAsIGluMSwgaW4yLCBpbjMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NGkzMiBzMF9tLCBzMV9tLCBzMl9tLCBzM19tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1NXKGluMSwgaW4wLCBzMF9tLCBzMV9tKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfU1coaW4zLCBpbjIsIHMyX20sIHMzX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2lsdnJfZCgodjJpNjQpczJfbSwgKHYyaTY0KXMwX20pOyAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfaWx2bF9kKCh2Mmk2NClzMl9tLCAodjJpNjQpczBfbSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IChSVFlQRSlfX21zYV9pbHZyX2QoKHYyaTY0KXMzX20sICh2Mmk2NClzMV9tKTsgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQzID0gKFJUWVBFKV9fbXNhX2lsdmxfZCgodjJpNjQpczNfbSwgKHYyaTY0KXMxX20pOyAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2RlZmluZSBUUkFOU1BPU0U0eDRfU1dfU1coLi4uKSBUUkFOU1BPU0U0eDRfVyh2NGkzMiwgX19WQV9BUkdTX18pCisKKy8qIERlc2NyaXB0aW9uIDogQWRkIGJsb2NrIDR4NAorICogQXJndW1lbnRzICAgOiBJbnB1dHMgLSBpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZQorICogRGV0YWlscyAgICAgOiBMZWFzdCBzaWduaWZpY2FudCA0IGJ5dGVzIGZyb20gZWFjaCBpbnB1dCB2ZWN0b3IgYXJlIGFkZGVkIHRvCisgKiAgICAgICAgICAgICAgIHRoZSBkZXN0aW5hdGlvbiBieXRlcywgY2xpcHBlZCBiZXR3ZWVuIDAtMjU1IGFuZCBzdG9yZWQuCisgKi8KKyNkZWZpbmUgQUREQkxLX1NUNHg0X1VCKGluMCwgaW4xLCBpbjIsIGluMywgcGRzdCwgc3RyaWRlKSBkbyB7ICBcCisgIHVpbnQzMl90IHNyYzBfbSwgc3JjMV9tLCBzcmMyX20sIHNyYzNfbTsgICAgICAgICAgICAgICAgICAgICAgXAorICB2OGkxNiBpbnAwX20sIGlucDFfbSwgcmVzMF9tLCByZXMxX207ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggZHN0MF9tID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IGRzdDFfbSA9IHsgMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZpOCB6ZXJvX20gPSB7IDAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUl9EMl9TSChpbjEsIGluMCwgaW4zLCBpbjIsIGlucDBfbSwgaW5wMV9tKTsgICAgICAgICAgICAgICBcCisgIExXNChwZHN0LCBzdHJpZGUsIHNyYzBfbSwgc3JjMV9tLCBzcmMyX20sIHNyYzNfbSk7ICAgICAgICAgICAgXAorICBJTlNFUlRfVzJfU0Ioc3JjMF9tLCBzcmMxX20sIGRzdDBfbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TRVJUX1cyX1NCKHNyYzJfbSwgc3JjM19tLCBkc3QxX20pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJfQjJfU0goemVyb19tLCBkc3QwX20sIHplcm9fbSwgZHN0MV9tLCByZXMwX20sIHJlczFfbSk7ICAgXAorICBBREQyKHJlczBfbSwgaW5wMF9tLCByZXMxX20sIGlucDFfbSwgcmVzMF9tLCByZXMxX20pOyAgICAgICAgIFwKKyAgQ0xJUF9TSDJfMF8yNTUocmVzMF9tLCByZXMxX20pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1NCKHJlczBfbSwgcmVzMF9tLCByZXMxX20sIHJlczFfbSwgZHN0MF9tLCBkc3QxX20pOyAgXAorICBTVDR4NF9VQihkc3QwX20sIGRzdDFfbSwgMCwgMSwgMCwgMSwgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8qIERlc2NyaXB0aW9uIDogUGFjayBldmVuIGJ5dGUgZWxlbWVudHMsIGV4dHJhY3QgMCAmIDIgaW5kZXggd29yZHMgZnJvbSBwYWlyCisgKiAgICAgICAgICAgICAgIG9mIHJlc3VsdHMgYW5kIHN0b3JlIDQgd29yZHMgaW4gZGVzdGluYXRpb24gbWVtb3J5IGFzIHBlcgorICogICAgICAgICAgICAgICBzdHJpZGUKKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzIC0gaW4wLCBpbjEsIGluMiwgaW4zLCBwZHN0LCBzdHJpZGUKKyAqLworI2RlZmluZSBQQ0tFVl9TVDR4NF9VQihpbjAsIGluMSwgaW4yLCBpbjMsIHBkc3QsIHN0cmlkZSkgZG8geyAgXAorICB2MTZpOCB0bXAwX20sIHRtcDFfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tFVl9CMl9TQihpbjEsIGluMCwgaW4zLCBpbjIsIHRtcDBfbSwgdG1wMV9tKTsgICAgICAgICAgICAgXAorICBTVDR4NF9VQih0bXAwX20sIHRtcDFfbSwgMCwgMiwgMCwgMiwgcGRzdCwgc3RyaWRlKTsgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLyogRGVzY3JpcHRpb24gOiBhdmVyYWdlIHdpdGggcm91bmRpbmcgKGluMCArIGluMSArIDEpIC8gMi4KKyAqIEFyZ3VtZW50cyAgIDogSW5wdXRzICAtIGluMCwgaW4xLCBpbjIsIGluMywKKyAqICAgICAgICAgICAgICAgT3V0cHV0cyAtIG91dDAsIG91dDEKKyAqICAgICAgICAgICAgICAgUmV0dXJuIFR5cGUgLSBhcyBwZXIgUlRZUEUKKyAqIERldGFpbHMgICAgIDogRWFjaCB1bnNpZ25lZCBieXRlIGVsZW1lbnQgZnJvbSAnaW4wJyB2ZWN0b3IgaXMgYWRkZWQgd2l0aAorICogICAgICAgICAgICAgICBlYWNoIHVuc2lnbmVkIGJ5dGUgZWxlbWVudCBmcm9tICdpbjEnIHZlY3Rvci4gVGhlbiB0aGUgYXZlcmFnZQorICogICAgICAgICAgICAgICB3aXRoIHJvdW5kaW5nIGlzIGNhbGN1bGF0ZWQgYW5kIHdyaXR0ZW4gdG8gJ291dDAnCisgKi8KKyNkZWZpbmUgQVZFUl9VQjIoUlRZUEUsIGluMCwgaW4xLCBpbjIsIGluMywgb3V0MCwgb3V0MSkgZG8geyAgXAorICBvdXQwID0gKFJUWVBFKV9fbXNhX2F2ZXJfdV9iKCh2MTZ1OClpbjAsICh2MTZ1OClpbjEpOyAgICAgICBcCisgIG91dDEgPSAoUlRZUEUpX19tc2FfYXZlcl91X2IoKHYxNnU4KWluMiwgKHYxNnU4KWluMyk7ICAgICAgIFwKK30gd2hpbGUgKDApCisjZGVmaW5lIEFWRVJfVUIyX1VCKC4uLikgQVZFUl9VQjIodjE2dTgsIF9fVkFfQVJHU19fKQorCisjZW5kaWYgIC8qIFdFQlBfRFNQX01TQV9NQUNST19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9uZW9uLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL25lb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFkZWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9uZW9uLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgTkVPTiBjb21tb24gY29kZS4KKworI2lmbmRlZiBXRUJQX0RTUF9ORU9OX0hfCisjZGVmaW5lIFdFQlBfRFNQX05FT05fSF8KKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisvLyBSaWdodCBub3csIHNvbWUgaW50cmluc2ljcyBmdW5jdGlvbnMgc2VlbSBzbG93ZXIsIHNvIHdlIGRpc2FibGUgdGhlbQorLy8gZXZlcnl3aGVyZSBleGNlcHQgbmV3ZXIgY2xhbmcvZ2NjIG9yIGFhcmNoNjQgd2hlcmUgdGhlIGlubGluZSBhc3NlbWJseSBpcworLy8gaW5jb21wYXRpYmxlLgorI2lmIExPQ0FMX0NMQU5HX1BSRVJFUSgzLDgpIHx8IExPQ0FMX0dDQ19QUkVSRVEoNCw5KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKQorI2RlZmluZSBXRUJQX1VTRV9JTlRSSU5TSUNTICAgLy8gdXNlIGludHJpbnNpY3Mgd2hlbiBwb3NzaWJsZQorI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9WRUNUT1IyKHYsIGEsIGIpIGRvIHsgIFwKKyAgdi52YWxbMF0gPSBhOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbMV0gPSBiOyAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9WRUNUT1IzKHYsIGEsIGIsIGMpIGRvIHsgIFwKKyAgdi52YWxbMF0gPSBhOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbMV0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbMl0gPSBjOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSU5JVF9WRUNUT1I0KHYsIGEsIGIsIGMsIGQpIGRvIHsgIFwKKyAgdi52YWxbMF0gPSBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbMV0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbMl0gPSBjOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdi52YWxbM10gPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKy8vIGlmIHVzaW5nIGludHJpbnNpY3MsIHRoaXMgZmxhZyBhdm9pZHMgc29tZSBmdW5jdGlvbnMgdGhhdCBtYWtlIGdjYy00LjYuMworLy8gY3Jhc2ggKCJpbnRlcm5hbCBjb21waWxlciBlcnJvcjogaW4gaW1tZWRfZG91YmxlX2NvbnN0LCBhdCBlbWl0LXJ0bC4iKS4KKy8vIChwcm9iYWJseSBzaW1pbGFyIHRvIGdjYy5nbnUub3JnL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD00ODE4MykKKyNpZiAhKExPQ0FMX0NMQU5HX1BSRVJFUSgzLDgpIHx8IExPQ0FMX0dDQ19QUkVSRVEoNCw4KSB8fCBkZWZpbmVkKF9fYWFyY2g2NF9fKSkKKyNkZWZpbmUgV09SS19BUk9VTkRfR0NDCisjZW5kaWYKKworc3RhdGljIFdFQlBfSU5MSU5FIGludDMyeDR4NF90IFRyYW5zcG9zZTR4NF9ORU9OKGNvbnN0IGludDMyeDR4NF90IHJvd3MpIHsKKyAgdWludDY0eDJ4Ml90IHJvdzAxLCByb3cyMzsKKworICByb3cwMS52YWxbMF0gPSB2cmVpbnRlcnByZXRxX3U2NF9zMzIocm93cy52YWxbMF0pOworICByb3cwMS52YWxbMV0gPSB2cmVpbnRlcnByZXRxX3U2NF9zMzIocm93cy52YWxbMV0pOworICByb3cyMy52YWxbMF0gPSB2cmVpbnRlcnByZXRxX3U2NF9zMzIocm93cy52YWxbMl0pOworICByb3cyMy52YWxbMV0gPSB2cmVpbnRlcnByZXRxX3U2NF9zMzIocm93cy52YWxbM10pOworICAvLyBUcmFuc3Bvc2UgNjQtYml0IHZhbHVlcyAodGhlcmUncyBubyB2c3dwIGVxdWl2YWxlbnQpCisgIHsKKyAgICBjb25zdCB1aW50NjR4MV90IHJvdzBoID0gdmdldF9oaWdoX3U2NChyb3cwMS52YWxbMF0pOworICAgIGNvbnN0IHVpbnQ2NHgxX3Qgcm93MmwgPSB2Z2V0X2xvd191NjQocm93MjMudmFsWzBdKTsKKyAgICBjb25zdCB1aW50NjR4MV90IHJvdzFoID0gdmdldF9oaWdoX3U2NChyb3cwMS52YWxbMV0pOworICAgIGNvbnN0IHVpbnQ2NHgxX3Qgcm93M2wgPSB2Z2V0X2xvd191NjQocm93MjMudmFsWzFdKTsKKyAgICByb3cwMS52YWxbMF0gPSB2Y29tYmluZV91NjQodmdldF9sb3dfdTY0KHJvdzAxLnZhbFswXSksIHJvdzJsKTsKKyAgICByb3cyMy52YWxbMF0gPSB2Y29tYmluZV91NjQocm93MGgsIHZnZXRfaGlnaF91NjQocm93MjMudmFsWzBdKSk7CisgICAgcm93MDEudmFsWzFdID0gdmNvbWJpbmVfdTY0KHZnZXRfbG93X3U2NChyb3cwMS52YWxbMV0pLCByb3czbCk7CisgICAgcm93MjMudmFsWzFdID0gdmNvbWJpbmVfdTY0KHJvdzFoLCB2Z2V0X2hpZ2hfdTY0KHJvdzIzLnZhbFsxXSkpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQzMng0eDJfdCBvdXQwMSA9IHZ0cm5xX3MzMih2cmVpbnRlcnByZXRxX3MzMl91NjQocm93MDEudmFsWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cmVpbnRlcnByZXRxX3MzMl91NjQocm93MDEudmFsWzFdKSk7CisgICAgY29uc3QgaW50MzJ4NHgyX3Qgb3V0MjMgPSB2dHJucV9zMzIodnJlaW50ZXJwcmV0cV9zMzJfdTY0KHJvdzIzLnZhbFswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnJlaW50ZXJwcmV0cV9zMzJfdTY0KHJvdzIzLnZhbFsxXSkpOworICAgIGludDMyeDR4NF90IG91dDsKKyAgICBvdXQudmFsWzBdID0gb3V0MDEudmFsWzBdOworICAgIG91dC52YWxbMV0gPSBvdXQwMS52YWxbMV07CisgICAgb3V0LnZhbFsyXSA9IG91dDIzLnZhbFswXTsKKyAgICBvdXQudmFsWzNdID0gb3V0MjMudmFsWzFdOworICAgIHJldHVybiBvdXQ7CisgIH0KK30KKworI2lmIDAgICAgIC8vIFVzZWZ1bCBkZWJ1ZyBtYWNyby4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2RlZmluZSBQUklOVF9SRUcoUkVHLCBTSVpFKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcHJpbnRmKCIlcyBcdFslZF06IDB4IiwgI1JFRywgU0laRSk7ICAgICAgICAgICAgICAgICAgXAorICBpZiAoU0laRSA9PSA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCBfdG1wWzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2c3QxX3U4KF90bXAsIChSRUcpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHByaW50ZigiJS4yeCAiLCBfdG1wW2ldKTsgICBcCisgIH0gZWxzZSBpZiAoU0laRSA9PSAxNikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MTZfdCBfdG1wWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZzdDFfdTE2KF90bXAsIChSRUcpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yIChpID0gMDsgaSA8IDQ7ICsraSkgcHJpbnRmKCIlLjR4ICIsIF90bXBbaV0pOyAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBwcmludGYoIlxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKyNlbmRpZiAgLy8gV0VCUF9EU1BfTkVPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkM2UxNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyLmMKQEAgLTAsMCArMSwyNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wbGVtZW50YXRpb25zIG9mIGNyaXRpY2FsIGZ1bmN0aW9ucyBJbXBvcnRSb3cgLyBFeHBvcnRSb3cKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3cgaW1wb3J0CisKK3ZvaWQgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kX0MoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGludCBjaGFubmVsOworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eF9leHBhbmQpOworICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgeF9zdHJpZGU7ICsrY2hhbm5lbCkgeworICAgIGludCB4X2luID0gY2hhbm5lbDsKKyAgICBpbnQgeF9vdXQgPSBjaGFubmVsOworICAgIC8vIHNpbXBsZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCisgICAgaW50IGFjY3VtID0gd3JrLT54X2FkZDsKKyAgICBpbnQgbGVmdCA9IHNyY1t4X2luXTsKKyAgICBpbnQgcmlnaHQgPSAod3JrLT5zcmNfd2lkdGggPiAxKSA/IHNyY1t4X2luICsgeF9zdHJpZGVdIDogbGVmdDsKKyAgICB4X2luICs9IHhfc3RyaWRlOworICAgIHdoaWxlICgxKSB7CisgICAgICB3cmstPmZyb3dbeF9vdXRdID0gcmlnaHQgKiB3cmstPnhfYWRkICsgKGxlZnQgLSByaWdodCkgKiBhY2N1bTsKKyAgICAgIHhfb3V0ICs9IHhfc3RyaWRlOworICAgICAgaWYgKHhfb3V0ID49IHhfb3V0X21heCkgYnJlYWs7CisgICAgICBhY2N1bSAtPSB3cmstPnhfc3ViOworICAgICAgaWYgKGFjY3VtIDwgMCkgeworICAgICAgICBsZWZ0ID0gcmlnaHQ7CisgICAgICAgIHhfaW4gKz0geF9zdHJpZGU7CisgICAgICAgIGFzc2VydCh4X2luIDwgd3JrLT5zcmNfd2lkdGggKiB4X3N0cmlkZSk7CisgICAgICAgIHJpZ2h0ID0gc3JjW3hfaW5dOworICAgICAgICBhY2N1bSArPSB3cmstPnhfYWRkOworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQod3JrLT54X3N1YiA9PSAwIC8qIDwtIHNwZWNpYWwgY2FzZSBmb3Igc3JjX3dpZHRoPTEgKi8gfHwgYWNjdW0gPT0gMCk7CisgIH0KK30KKwordm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworICBhc3NlcnQoIXdyay0+eF9leHBhbmQpOworICBmb3IgKGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgeF9zdHJpZGU7ICsrY2hhbm5lbCkgeworICAgIGludCB4X2luID0gY2hhbm5lbDsKKyAgICBpbnQgeF9vdXQgPSBjaGFubmVsOworICAgIHVpbnQzMl90IHN1bSA9IDA7CisgICAgaW50IGFjY3VtID0gMDsKKyAgICB3aGlsZSAoeF9vdXQgPCB4X291dF9tYXgpIHsKKyAgICAgIHVpbnQzMl90IGJhc2UgPSAwOworICAgICAgYWNjdW0gKz0gd3JrLT54X2FkZDsKKyAgICAgIHdoaWxlIChhY2N1bSA+IDApIHsKKyAgICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKKyAgICAgICAgYXNzZXJ0KHhfaW4gPCB3cmstPnNyY193aWR0aCAqIHhfc3RyaWRlKTsKKyAgICAgICAgYmFzZSA9IHNyY1t4X2luXTsKKyAgICAgICAgc3VtICs9IGJhc2U7CisgICAgICAgIHhfaW4gKz0geF9zdHJpZGU7CisgICAgICB9CisgICAgICB7ICAgICAgICAvLyBFbWl0IG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KKyAgICAgICAgY29uc3QgcmVzY2FsZXJfdCBmcmFjID0gYmFzZSAqICgtYWNjdW0pOworICAgICAgICB3cmstPmZyb3dbeF9vdXRdID0gc3VtICogd3JrLT54X3N1YiAtIGZyYWM7CisgICAgICAgIC8vIGZyZXNoIGZyYWN0aW9uYWwgc3RhcnQgZm9yIG5leHQgcGl4ZWwKKyAgICAgICAgc3VtID0gKGludClNVUxUX0ZJWChmcmFjLCB3cmstPmZ4X3NjYWxlKTsKKyAgICAgIH0KKyAgICAgIHhfb3V0ICs9IHhfc3RyaWRlOworICAgIH0KKyAgICBhc3NlcnQoYWNjdW0gPT0gMCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBleHBvcnQKKwordm9pZCBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfQyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSBmcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqIGZyb3dbeF9vdXRdCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiBpcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChKLCB3cmstPmZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3ZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX0MoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHVpbnQzMl90IHlzY2FsZSA9IHdyay0+Znlfc2NhbGUgKiAoLXdyay0+eV9hY2N1bSk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KCF3cmstPnlfZXhwYW5kKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9ICh1aW50MzJfdClNVUxUX0ZJWChmcm93W3hfb3V0XSwgeXNjYWxlKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSAtIGZyYWMsIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0sIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IDA7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBNVUxUX0ZJWAorI3VuZGVmIFJPVU5ERVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gZW50cnkgY2FsbHMKKwordm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgaWYgKCF3cmstPnhfZXhwYW5kKSB7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rKHdyaywgc3JjKTsKKyAgfSBlbHNlIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQod3JrLCBzcmMpOworICB9Cit9CisKK3ZvaWQgV2ViUFJlc2NhbGVyRXhwb3J0Um93KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGlmICh3cmstPnlfYWNjdW0gPD0gMCkgeworICAgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgICBpZiAod3JrLT55X2V4cGFuZCkgeworICAgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kKHdyayk7CisgICAgfSBlbHNlIGlmICh3cmstPmZ4eV9zY2FsZSkgeworICAgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rKHdyayk7CisgICAgfSBlbHNlIHsgIC8vIHNwZWNpYWwgY2FzZQorICAgICAgaW50IGk7CisgICAgICBhc3NlcnQod3JrLT5zcmNfaGVpZ2h0ID09IHdyay0+ZHN0X2hlaWdodCAmJiB3cmstPnhfYWRkID09IDEpOworICAgICAgYXNzZXJ0KHdyay0+c3JjX3dpZHRoID09IDEgJiYgd3JrLT5kc3Rfd2lkdGggPD0gMik7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgd3JrLT5udW1fY2hhbm5lbHMgKiB3cmstPmRzdF93aWR0aDsgKytpKSB7CisgICAgICAgIHdyay0+ZHN0W2ldID0gd3JrLT5pcm93W2ldOworICAgICAgICB3cmstPmlyb3dbaV0gPSAwOworICAgICAgfQorICAgIH0KKyAgICB3cmstPnlfYWNjdW0gKz0gd3JrLT55X2FkZDsKKyAgICB3cmstPmRzdCArPSB3cmstPmRzdF9zdHJpZGU7CisgICAgKyt3cmstPmRzdF95OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1dlYlBSZXNjYWxlckltcG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kOworV2ViUFJlc2NhbGVySW1wb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbms7CisKK1dlYlBSZXNjYWxlckV4cG9ydFJvd0Z1bmMgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kOworV2ViUFJlc2NhbGVyRXhwb3J0Um93RnVuYyBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbms7CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TVNBKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04odm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQUmVzY2FsZXJEc3BJbml0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCA9IFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9DOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfQzsKKyNlbmRpZgorCisgIFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCA9IFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZF9DOworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsgPSBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfQzsKKworICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTVNBKSkgeworICAgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE1TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04oKTsKKyAgfQorI2VuZGlmCisKKyAgYXNzZXJ0KFdlYlBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBSZXNjYWxlckltcG9ydFJvd0V4cGFuZCAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBSZXNjYWxlckltcG9ydFJvd1NocmluayAhPSBOVUxMKTsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX1NJWkUKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwczMyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MmY3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX21pcHMzMi5jCkBAIC0wLDAgKzEsMjkzIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIHJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikgJiYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGltcG9ydAorCitzdGF0aWMgdm9pZCBJbXBvcnRSb3dTaHJpbmtfTUlQUzMyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMpIHsKKyAgY29uc3QgaW50IHhfc3RyaWRlID0gd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCBpbnQgZnhfc2NhbGUgPSB3cmstPmZ4X3NjYWxlOworICBjb25zdCBpbnQgeF9hZGQgPSB3cmstPnhfYWRkOworICBjb25zdCBpbnQgeF9zdWIgPSB3cmstPnhfc3ViOworICBjb25zdCBpbnQgeF9zdHJpZGUxID0geF9zdHJpZGUgPDwgMjsKKyAgaW50IGNoYW5uZWw7CisgIGFzc2VydCghd3JrLT54X2V4cGFuZCk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworCisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjMSA9IHNyYyArIGNoYW5uZWw7CisgICAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdyArIGNoYW5uZWw7CisgICAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDM7CisgICAgaW50IGJhc2UsIGZyYWMsIHN1bTsKKyAgICBpbnQgYWNjdW0sIGFjY3VtMTsKKyAgICBpbnQgbG9vcF9jID0geF9vdXRfbWF4IC0gY2hhbm5lbDsKKworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAlW3RlbXAxXSwgICAweDgwMDAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibGkgICAgICVbdGVtcDJdLCAgIDB4MTAwMDAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgJVtzdW1dLCAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAlW2FjY3VtXSwgICAwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVthY2N1bV0sICAgJVthY2N1bV0sICAgJVt4X2FkZF0gICAgICBcblx0IgorICAgICAgImxpICAgICAlW2Jhc2VdLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYmxleiAgICVbYWNjdW1dLCAgIDNmICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxidSAgICAlW2Jhc2VdLCAgICAwKCVbc3JjMV0pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbYWNjdW1dLCAgICVbYWNjdW1dLCAgICVbeF9zdWJdICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgJVt4X3N0cmlkZV0gICBcblx0IgorICAgICAgImFkZHUgICAlW3N1bV0sICAgICAlW3N1bV0sICAgICAlW2Jhc2VdICAgICAgIFxuXHQiCisgICAgICAiYmd0eiAgICVbYWNjdW1dLCAgIDJiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm5lZ3UgICAlW2FjY3VtMV0sICAlW2FjY3VtXSAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAibXVsICAgICVbZnJhY10sICAgICVbYmFzZV0sICAgICVbYWNjdW0xXSAgICAgXG5cdCIKKyAgICAgICJtdWwgICAgJVt0ZW1wM10sICAgJVtzdW1dLCAgICAgJVt4X3N1Yl0gICAgICBcblx0IgorICAgICAgInN1YnUgICAlW2xvb3BfY10sICAlW2xvb3BfY10sICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAibXVsdCAgICVbdGVtcDFdLCAgICVbdGVtcDJdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgJVtmcmFjXSwgICAgJVtmeF9zY2FsZV0gICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAlW3N1bV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAic3VidSAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICVbZnJhY10gICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgJVt0ZW1wM10sICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW2Zyb3ddLCAgICAlW2Zyb3ddLCAgICAlW3hfc3RyaWRlMV0gIFxuXHQiCisgICAgICAiYmd0eiAgICVbbG9vcF9jXSwgIDFiICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW2FjY3VtXSI9JnIiKGFjY3VtKSwgW3NyYzFdIityIihzcmMxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3N1bV0iPSZyIihzdW0pLCBbYmFzZV0iPSZyIihiYXNlKSwgW2ZyYWNdIj0mciIoZnJhYyksCisgICAgICAgIFtmcm93XSIrciIoZnJvdyksIFthY2N1bTFdIj0mciIoYWNjdW0xKSwKKyAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAxXSI9JnIiKHRlbXAxKQorICAgICAgOiBbeF9zdHJpZGVdInIiKHhfc3RyaWRlKSwgW2Z4X3NjYWxlXSJyIihmeF9zY2FsZSksCisgICAgICAgIFt4X3N1Yl0iciIoeF9zdWIpLCBbeF9hZGRdInIiKHhfYWRkKSwKKyAgICAgICAgW2xvb3BfY10iciIobG9vcF9jKSwgW3hfc3RyaWRlMV0iciIoeF9zdHJpZGUxKQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgICAgYXNzZXJ0KGFjY3VtID09IDApOworICB9Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydFJvd0V4cGFuZF9NSVBTMzIoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBpbnQgeF9zdHJpZGUgPSB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X2FkZCA9IHdyay0+eF9hZGQ7CisgIGNvbnN0IGludCB4X3N1YiA9IHdyay0+eF9zdWI7CisgIGNvbnN0IGludCBzcmNfd2lkdGggPSB3cmstPnNyY193aWR0aDsKKyAgY29uc3QgaW50IHhfc3RyaWRlMSA9IHhfc3RyaWRlIDw8IDI7CisgIGludCBjaGFubmVsOworICBhc3NlcnQod3JrLT54X2V4cGFuZCk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVySW5wdXREb25lKHdyaykpOworCisgIGZvciAoY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCB4X3N0cmlkZTsgKytjaGFubmVsKSB7CisgICAgY29uc3QgdWludDhfdCogc3JjMSA9IHNyYyArIGNoYW5uZWw7CisgICAgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdyArIGNoYW5uZWw7CisgICAgaW50IHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0OworICAgIGludCBmcmFjOworICAgIGludCBhY2N1bTsKKyAgICBpbnQgeF9vdXQgPSBjaGFubmVsOworCisgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAiYWRkaXUgICVbdGVtcDNdLCAgICVbc3JjX3dpZHRoXSwgLTEgICAgICAgICAgICBcblx0IgorICAgICAgImxidSAgICAlW3RlbXAyXSwgICAwKCVbc3JjMV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAiYmd0eiAgICVbdGVtcDNdLCAgIDBmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAlW3RlbXAxXSwgICAlW3RlbXAyXSwgICAgIDAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJiICAgICAgM2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgIjA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxidSAgICAlW3RlbXAxXSwgICAwKCVbc3JjMV0pICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAiMzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYWRkaXUgICVbYWNjdW1dLCAgICVbeF9hZGRdLCAgICAgMCAgICAgICAgICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVt0ZW1wM10sICAgJVt0ZW1wMl0sICAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAibXVsICAgICVbdGVtcDNdLCAgICVbdGVtcDNdLCAgICAgJVthY2N1bV0gICAgICBcblx0IgorICAgICAgIm11bCAgICAlW3RlbXA0XSwgICAlW3RlbXAxXSwgICAgICVbeF9hZGRdICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVt0ZW1wM10sICAgJVt0ZW1wNF0sICAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgICAic3cgICAgICVbdGVtcDNdLCAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW2Zyb3ddLCAgICAlW2Zyb3ddLCAgICAgICVbeF9zdHJpZGUxXSAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVt4X291dF0sICAgJVt4X291dF0sICAgICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAic3VidSAgICVbdGVtcDNdLCAgICVbeF9vdXRdLCAgICAgJVt4X291dF9tYXhdICBcblx0IgorICAgICAgImJnZXogICAlW3RlbXAzXSwgICAyZiAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgJVthY2N1bV0sICAgJVthY2N1bV0sICAgICAlW3hfc3ViXSAgICAgIFxuXHQiCisgICAgICAiYmdleiAgICVbYWNjdW1dLCAgIDRmICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAlW3RlbXAyXSwgICAlW3RlbXAxXSwgICAgIDAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgJVtzcmMxXSwgICAgJVtzcmMxXSwgICAgICAlW3hfc3RyaWRlXSAgIFxuXHQiCisgICAgICAibGJ1ICAgICVbdGVtcDFdLCAgIDAoJVtzcmMxXSkgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAlW2FjY3VtXSwgICAlW2FjY3VtXSwgICAgICVbeF9hZGRdICAgICAgXG5cdCIKKyAgICAiNDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAiYiAgICAgIDFiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICIyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3NyYzFdIityIihzcmMxKSwgW2FjY3VtXSI9JnIiKGFjY3VtKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwKKyAgICAgICAgW3RlbXAyXSI9JnIiKHRlbXAyKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwKKyAgICAgICAgW3hfb3V0XSIrciIoeF9vdXQpLCBbZnJhY10iPSZyIihmcmFjKSwgW2Zyb3ddIityIihmcm93KQorICAgICAgOiBbeF9zdHJpZGVdInIiKHhfc3RyaWRlKSwgW3hfYWRkXSJyIih4X2FkZCksIFt4X3N1Yl0iciIoeF9zdWIpLAorICAgICAgICBbeF9zdHJpZGUxXSJyIih4X3N0cmlkZTEpLCBbc3JjX3dpZHRoXSJyIihzcmNfd2lkdGgpLAorICAgICAgICBbeF9vdXRfbWF4XSJyIih4X291dF9tYXgpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgICBhc3NlcnQod3JrLT54X3N1YiA9PSAwIC8qIDwtIHNwZWNpYWwgY2FzZSBmb3Igc3JjX3dpZHRoPTEgKi8gfHwgYWNjdW0gPT0gMCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdyBleHBvcnQKKworc3RhdGljIHZvaWQgRXhwb3J0Um93RXhwYW5kX01JUFMzMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICB1aW50OF90KiBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAzLCB0ZW1wNCwgdGVtcDUsIGxvb3BfZW5kOworICBjb25zdCBpbnQgdGVtcDIgPSAoaW50KXdyay0+Znlfc2NhbGU7CisgIGNvbnN0IGludCB0ZW1wNiA9IHhfb3V0X21heCA8PCAyOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCh3cmstPnlfZXhwYW5kKTsKKyAgYXNzZXJ0KHdyay0+eV9zdWIgIT0gMCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIF9fYXNtX18gdm9sYXRpbGUgKAorICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZHUgICAgICVbbG9vcF9lbmRdLCAlW2Zyb3ddLCAgICAgJVt0ZW1wNl0gICAgICBcblx0IgorICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZHN0XSwgICAgICAlW2RzdF0sICAgICAgMSAgICAgICAgICAgICBcblx0IgorICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgNCAgICAgICAgICAgICBcblx0IgorICAgICAgIm11bHQgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1hZGR1ICAgICVbdGVtcDBdLCAgICAlW3RlbXAyXSAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgIm1maGkgICAgICVbdGVtcDVdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgInNiICAgICAgICVbdGVtcDVdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKQorICAgICAgOiBbdGVtcDJdInIiKHRlbXAyKSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIKKyAgICApOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW0FdLCAgICAgICAgJVt0ZW1wMF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW0JdLCAgICAgICAgJVt0ZW1wMV0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXA1XSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt0ZW1wNl0iciIodGVtcDYpLCBbQV0iciIoQSksIFtCXSJyIihCKQorICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIgorICAgICk7CisgIH0KK30KKworc3RhdGljIHZvaWQgRXhwb3J0Um93U2hyaW5rX01JUFMzMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IGludCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMywgdGVtcDQsIHRlbXA1LCBsb29wX2VuZDsKKyAgY29uc3QgaW50IHRlbXAyID0gKGludCl3cmstPmZ4eV9zY2FsZTsKKyAgY29uc3QgaW50IHRlbXA2ID0geF9vdXRfbWF4IDw8IDI7CisKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT5meHlfc2NhbGUgIT0gMCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2Zyb3ddLCAgICAgJVtmcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt5c2NhbGVdICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXAxXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdWJ1ICAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMF0sICAgICVbdGVtcDFdICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgICAlW3RlbXAxXSwgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgW2lyb3ddIityIihpcm93KSwgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt5c2NhbGVdInIiKHlzY2FsZSksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfSBlbHNlIHsKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsaSAgICAgICAlW3RlbXA0XSwgICAgMHg4MDAwICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtpcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJsdyAgICAgICAlW3RlbXAwXSwgICAgMCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDEgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtdWx0ICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtYWRkdSAgICAlW3RlbXAwXSwgICAgJVt0ZW1wMl0gICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJtZmhpICAgICAlW3RlbXA1XSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTQoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJzYiAgICAgICAlW3RlbXA1XSwgICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJibmUgICAgICAlW2lyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2lyb3ddIityIihpcm93KSwKKyAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCkKKyAgICAgIDogW3RlbXAyXSJyIih0ZW1wMiksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICA6ICJtZW1vcnkiLCAiaGkiLCAibG8iCisgICAgKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTMzIodm9pZCkgeworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmQgPSBJbXBvcnRSb3dFeHBhbmRfTUlQUzMyOworICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmsgPSBJbXBvcnRSb3dTaHJpbmtfTUlQUzMyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBFeHBvcnRSb3dFeHBhbmRfTUlQUzMyOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBFeHBvcnRSb3dTaHJpbmtfTUlQUzMyOworfQorCisjZWxzZSAgLy8gIVdFQlBfVVNFX01JUFMzMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFMzMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTMzIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbWlwc19kc3BfcjIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhhYWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMzE0IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTUlQUyB2ZXJzaW9uIG9mIHJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3Iocyk6IERqb3JkamUgUGVzdXQgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKSAmJiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVgoeCwgeSkgKCgodWludDY0X3QpKHgpICogKHkpICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGV4cG9ydAorCitzdGF0aWMgdm9pZCBFeHBvcnRSb3dTaHJpbmtfTUlQU2RzcFIyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCBpOworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IGludCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgbG9vcF9lbmQ7CisgIGNvbnN0IGludCB0ZW1wNyA9IChpbnQpd3JrLT5meHlfc2NhbGU7CisgIGNvbnN0IGludCB0ZW1wNiA9ICh4X291dF9tYXggJiB+MHgzKSA8PCAyOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPmZ4eV9zY2FsZSAhPSAwKTsKKyAgaWYgKHlzY2FsZSkgeworICAgIGlmICh4X291dF9tYXggPj0gNCkgeworICAgICAgaW50IHRlbXA4LCB0ZW1wOSwgdGVtcDEwLCB0ZW1wMTE7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICVbdGVtcDNdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgJVt0ZW1wNF0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgNCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wNV0sICAgIDEyKCVbZnJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMwLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzAsICAgICAgICAlW3RlbXAwXSwgICAgJVt5c2NhbGVdICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMSwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVt0ZW1wMV0sICAgICVbeXNjYWxlXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbdGVtcDJdLCAgICAlW3lzY2FsZV0gICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzMsICAgICAgICAlW3RlbXA1XSwgICAgJVt5c2NhbGVdICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtmcm93XSwgICAgICVbZnJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXA1XSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDhdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wOV0sICAgIDQoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxMF0sICAgOCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDExXSwgICAxMiglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUgICAgICVbdGVtcDhdLCAgICAlW3RlbXA4XSwgICAgJVt0ZW1wMF0gICAgICBcblx0IgorICAgICAgICAic3VidSAgICAgJVt0ZW1wOV0sICAgICVbdGVtcDldLCAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJzdWJ1ICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wMTBdLCAgICVbdGVtcDJdICAgICAgXG5cdCIKKyAgICAgICAgInN1YnUgICAgICVbdGVtcDExXSwgICAlW3RlbXAxMV0sICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDldLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAxMF0sICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wMTFdLCAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDhdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wOV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAxMF0sICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDExXSwgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJVt0ZW1wMF0sICAgIC0xNiglW2lyb3ddKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAlW3RlbXAxXSwgICAgLTEyKCVbaXJvd10pICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICVbdGVtcDJdLCAgICAtOCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJVt0ZW1wNV0sICAgIC00KCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXA4XSwgICAgLTQoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDldLCAgICAtMyglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMTBdLCAgIC0yKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxMV0sICAgLTEoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImJuZSAgICAgICVbZnJvd10sICAgICAlW2xvb3BfZW5kXSwgMWIgICAgICAgICAgICBcblx0IgorICAgICAgICA6IFt0ZW1wMF0iPSZyIih0ZW1wMCksIFt0ZW1wMV0iPSZyIih0ZW1wMSksIFt0ZW1wM10iPSZyIih0ZW1wMyksCisgICAgICAgICAgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgW2Zyb3ddIityIihmcm93KSwKKyAgICAgICAgICBbaXJvd10iK3IiKGlyb3cpLCBbZHN0XSIrciIoZHN0KSwgW2xvb3BfZW5kXSI9JnIiKGxvb3BfZW5kKSwKKyAgICAgICAgICBbdGVtcDhdIj0mciIodGVtcDgpLCBbdGVtcDldIj0mciIodGVtcDkpLCBbdGVtcDEwXSI9JnIiKHRlbXAxMCksCisgICAgICAgICAgW3RlbXAxMV0iPSZyIih0ZW1wMTEpLCBbdGVtcDJdIj0mciIodGVtcDIpCisgICAgICAgIDogW3RlbXA3XSJyIih0ZW1wNyksIFt5c2NhbGVdInIiKHlzY2FsZSksIFt0ZW1wNl0iciIodGVtcDYpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGZyYWMgPSAodWludDMyX3QpTVVMVF9GSVgoKmZyb3crKywgeXNjYWxlKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWCgqaXJvdyAtIGZyYWMsIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgKmRzdCsrID0gdjsKKyAgICAgICppcm93KysgPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0CisgICAgfQorICB9IGVsc2UgeworICAgIGlmICh4X291dF9tYXggPj0gNCkgeworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXAzXSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbaXJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDVdLCAgICAxMiglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtkc3RdLCAgICAgICVbZHN0XSwgICAgICA0ICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2lyb3ddLCAgICAgJVtpcm93XSwgICAgIDE2ICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA0XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXAzXSwgICAgJVt0ZW1wNF0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDVdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXA1XSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtMTYoJVtpcm93XSkgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic3cgICAgICAgJHplcm8sICAgICAgIC0xMiglW2lyb3ddKSAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzdyAgICAgICAkemVybywgICAgICAgLTgoJVtpcm93XSkgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInN3ICAgICAgICR6ZXJvLCAgICAgICAtNCglW2lyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDJdLCAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wNV0sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2lyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtpcm93XSIrciIoaXJvdyksCisgICAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iLAorICAgICAgICAgICIkYWMyaGkiLCAiJGFjMmxvIiwgIiRhYzNoaSIsICIkYWMzbG8iCisgICAgICApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHhfb3V0X21heCAmIDB4Myk7ICsraSkgeworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKCppcm93LCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgICAqaXJvdysrID0gMDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgRXhwb3J0Um93RXhwYW5kX01JUFNkc3BSMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgaTsKKyAgdWludDhfdCogZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBpbnQgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgbG9vcF9lbmQ7CisgIGNvbnN0IGludCB0ZW1wNiA9ICh4X291dF9tYXggJiB+MHgzKSA8PCAyOworICBjb25zdCBpbnQgdGVtcDcgPSAoaW50KXdyay0+Znlfc2NhbGU7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgaWYgKHhfb3V0X21heCA+PSA0KSB7CisgICAgICBfX2FzbV9fIHZvbGF0aWxlICgKKyAgICAgICAgImxpICAgICAgICVbdGVtcDRdLCAgICAweDEwMDAwICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibGkgICAgICAgJVt0ZW1wNV0sICAgIDB4ODAwMCAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGR1ICAgICAlW2xvb3BfZW5kXSwgJVtmcm93XSwgICAgICVbdGVtcDZdICAgICAgXG5cdCIKKyAgICAgICIxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMF0sICAgIDAoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAxXSwgICAgNCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDJdLCAgICA4KCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wM10sICAgIDEyKCVbZnJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMCwgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVt0ZW1wMF0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXA0XSwgICAgJVt0ZW1wNV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbdGVtcDFdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMyLCAgICAgICAgJVt0ZW1wNF0sICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzIsICAgICAgICAlW3RlbXAyXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMywgICAgICAgICVbdGVtcDRdLCAgICAlW3RlbXA1XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVt0ZW1wM10sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDBdLCAgICAkYWMwICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMV0sICAgICRhYzEgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAyXSwgICAgJGFjMiAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDNdLCAgICAkYWMzICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMF0sICAgIC00KCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAxXSwgICAgLTMoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDJdLCAgICAtMiglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wM10sICAgIC0xKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJibmUgICAgICAlW2Zyb3ddLCAgICAgJVtsb29wX2VuZF0sIDFiICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDNdIj0mciIodGVtcDMpLAorICAgICAgICAgIFt0ZW1wNF0iPSZyIih0ZW1wNCksIFt0ZW1wNV0iPSZyIih0ZW1wNSksIFtmcm93XSIrciIoZnJvdyksCisgICAgICAgICAgW2RzdF0iK3IiKGRzdCksIFtsb29wX2VuZF0iPSZyIihsb29wX2VuZCksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3RlbXA2XSJyIih0ZW1wNikKKyAgICAgICAgOiAibWVtb3J5IiwgImhpIiwgImxvIiwgIiRhYzFoaSIsICIkYWMxbG8iLAorICAgICAgICAgICIkYWMyaGkiLCAiJGFjMmxvIiwgIiRhYzNoaSIsICIkYWMzbG8iCisgICAgICApOworICAgIH0KKyAgICBmb3IgKGkgPSAwOyBpIDwgKHhfb3V0X21heCAmIDB4Myk7ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICpmcm93Kys7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoLXdyay0+eV9hY2N1bSwgd3JrLT55X3N1Yik7CisgICAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgICBpZiAoeF9vdXRfbWF4ID49IDQpIHsKKyAgICAgIGludCB0ZW1wOCwgdGVtcDksIHRlbXAxMCwgdGVtcDExOworICAgICAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgICAgICJsaSAgICAgICAlW3RlbXA4XSwgICAgMHgxMDAwMCAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImxpICAgICAgICVbdGVtcDldLCAgICAweDgwMDAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkdSAgICAgJVtsb29wX2VuZF0sICVbZnJvd10sICAgICAlW3RlbXA2XSAgICAgIFxuXHQiCisgICAgICAiMTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDBdLCAgICAwKCVbZnJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMV0sICAgIDQoJVtmcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXAyXSwgICAgOCglW2Zyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDNdLCAgICAxMiglW2Zyb3ddKSAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wNF0sICAgIDAoJVtpcm93XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJsdyAgICAgICAlW3RlbXA1XSwgICAgNCglW2lyb3ddKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgImx3ICAgICAgICVbdGVtcDEwXSwgICA4KCVbaXJvd10pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibHcgICAgICAgJVt0ZW1wMTFdLCAgIDEyKCVbaXJvd10pICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJhZGRpdSAgICAlW2RzdF0sICAgICAgJVtkc3RdLCAgICAgIDQgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAwXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMwLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDRdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzEsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMSwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAxXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMxLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDVdICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzIsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMiwgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAyXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDEwXSAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbQV0sICAgICAgICAlW3RlbXAzXSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMzLCAgICAgICAgJVtCXSwgICAgICAgICVbdGVtcDExXSAgICAgXG5cdCIKKyAgICAgICAgImFkZGl1ICAgICVbZnJvd10sICAgICAlW2Zyb3ddLCAgICAgMTYgICAgICAgICAgICBcblx0IgorICAgICAgICAiYWRkaXUgICAgJVtpcm93XSwgICAgICVbaXJvd10sICAgICAxNiAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAzXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzAsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMCwgICAgICAgICVbdGVtcDBdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtdWx0ICAgICAkYWMxLCAgICAgICAgJVt0ZW1wOF0sICAgICVbdGVtcDldICAgICAgXG5cdCIKKyAgICAgICAgIm1hZGR1ICAgICRhYzEsICAgICAgICAlW3RlbXAxXSwgICAgJVt0ZW1wN10gICAgICBcblx0IgorICAgICAgICAibXVsdCAgICAgJGFjMiwgICAgICAgICVbdGVtcDhdLCAgICAlW3RlbXA5XSAgICAgIFxuXHQiCisgICAgICAgICJtYWRkdSAgICAkYWMyLCAgICAgICAgJVt0ZW1wMl0sICAgICVbdGVtcDddICAgICAgXG5cdCIKKyAgICAgICAgIm11bHQgICAgICRhYzMsICAgICAgICAlW3RlbXA4XSwgICAgJVt0ZW1wOV0gICAgICBcblx0IgorICAgICAgICAibWFkZHUgICAgJGFjMywgICAgICAgICVbdGVtcDNdLCAgICAlW3RlbXA3XSAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAwXSwgICAgJGFjMCAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgIm1maGkgICAgICVbdGVtcDFdLCAgICAkYWMxICAgICAgICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAibWZoaSAgICAgJVt0ZW1wMl0sICAgICRhYzIgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJtZmhpICAgICAlW3RlbXAzXSwgICAgJGFjMyAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDBdLCAgICAtNCglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAic2IgICAgICAgJVt0ZW1wMV0sICAgIC0zKCVbZHN0XSkgICAgICAgICAgICAgICAgIFxuXHQiCisgICAgICAgICJzYiAgICAgICAlW3RlbXAyXSwgICAgLTIoJVtkc3RdKSAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICAgInNiICAgICAgICVbdGVtcDNdLCAgICAtMSglW2RzdF0pICAgICAgICAgICAgICAgICBcblx0IgorICAgICAgICAiYm5lICAgICAgJVtmcm93XSwgICAgICVbbG9vcF9lbmRdLCAxYiAgICAgICAgICAgIFxuXHQiCisgICAgICAgIDogW3RlbXAwXSI9JnIiKHRlbXAwKSwgW3RlbXAxXSI9JnIiKHRlbXAxKSwgW3RlbXAzXSI9JnIiKHRlbXAzKSwKKyAgICAgICAgICBbdGVtcDRdIj0mciIodGVtcDQpLCBbdGVtcDVdIj0mciIodGVtcDUpLCBbZnJvd10iK3IiKGZyb3cpLAorICAgICAgICAgIFtpcm93XSIrciIoaXJvdyksIFtkc3RdIityIihkc3QpLCBbbG9vcF9lbmRdIj0mciIobG9vcF9lbmQpLAorICAgICAgICAgIFt0ZW1wOF0iPSZyIih0ZW1wOCksIFt0ZW1wOV0iPSZyIih0ZW1wOSksIFt0ZW1wMTBdIj0mciIodGVtcDEwKSwKKyAgICAgICAgICBbdGVtcDExXSI9JnIiKHRlbXAxMSksIFt0ZW1wMl0iPSZyIih0ZW1wMikKKyAgICAgICAgOiBbdGVtcDddInIiKHRlbXA3KSwgW3RlbXA2XSJyIih0ZW1wNiksIFtBXSJyIihBKSwgW0JdInIiKEIpCisgICAgICAgIDogIm1lbW9yeSIsICJoaSIsICJsbyIsICIkYWMxaGkiLCAiJGFjMWxvIiwKKyAgICAgICAgICAiJGFjMmhpIiwgIiRhYzJsbyIsICIkYWMzaGkiLCAiJGFjM2xvIgorICAgICAgKTsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8ICh4X291dF9tYXggJiAweDMpOyArK2kpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqICpmcm93KysKKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqICppcm93Kys7CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgICpkc3QrKyA9IHY7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBNVUxUX0ZJWAorI3VuZGVmIFJPVU5ERVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0TUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gRXhwb3J0Um93RXhwYW5kX01JUFNkc3BSMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gRXhwb3J0Um93U2hyaW5rX01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUFJlc2NhbGVyRHNwSW5pdE1JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9tc2EuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiYzk5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbXNhLmMKQEAgLTAsMCArMSw0NDQgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNU0EgdmVyc2lvbiBvZiByZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBQcmFzaGFudCBQYXRpbCAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01TQSkgJiYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWF8xNihpbjAsIGluMSwgaW4yLCBpbjMsIHNjYWxlLCBzaGlmdCwgZHN0KSBkbyB7ICBcCisgIHY0dTMyIHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCB0MCwgdDEsIHQyLCB0MywgdDQsIHQ1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMCwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjEsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDIsIHRtcDMsIHNjYWxlLCBzY2FsZSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfVUIob3V0MSwgb3V0MCwgb3V0Mywgb3V0MiwgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKHplcm8sIGluMiwgdG1wMCwgdG1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyh6ZXJvLCBpbjMsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDIsIHRtcDMsIHNjYWxlLCBzY2FsZSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfVUIob3V0MSwgb3V0MCwgb3V0Mywgb3V0MiwgdDIsIHQzKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBDS0VWX0IyX1VCKHQxLCB0MCwgdDMsIHQyLCB0NCwgdDUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpdDUsICh2MTZpOCl0NCk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWF80KGluMCwgc2NhbGUsIHNoaWZ0LCBkc3QpIGRvIHsgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2aTggdDAsIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4wLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgIFwKKyAgU1JBUl9EMl9VRChvdXQwLCBvdXQxLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9wY2tldl9iKCh2MTZpOClvdXQxLCAodjE2aTgpb3V0MCk7ICAgICAgIFwKKyAgdDEgPSBfX21zYV9wY2tldl9iKHQwLCB0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDAgPSBfX21zYV9wY2tldl9iKHQxLCB0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gX19tc2FfY29weV9zX3coKHY0aTMyKXQwLCAwKTsgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWDFfMTYoaW4wLCBpbjEsIGluMiwgaW4zLCBmeXNjYWxlLCBzaGlmdCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MCwgZHN0MSwgZHN0MiwgZHN0MykgZG8geyAgICAgICAgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMSwgdG1wMiwgdG1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4wLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4xLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgZnlzY2FsZSwgZnlzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMiwgdG1wMywgZnlzY2FsZSwgZnlzY2FsZSwgb3V0Miwgb3V0Myk7ICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfVzJfVVcob3V0MSwgb3V0MCwgb3V0Mywgb3V0MiwgZHN0MCwgZHN0MSk7ICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4yLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4zLCB0bXAyLCB0bXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgZnlzY2FsZSwgZnlzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMiwgdG1wMywgZnlzY2FsZSwgZnlzY2FsZSwgb3V0Miwgb3V0Myk7ICAgICAgIFwKKyAgU1JBUl9ENF9VRChvdXQwLCBvdXQxLCBvdXQyLCBvdXQzLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfVzJfVVcob3V0MSwgb3V0MCwgb3V0Mywgb3V0MiwgZHN0MiwgZHN0Myk7ICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWDFfNChpbjAsIHNjYWxlLCBzaGlmdCwgZHN0KSBkbyB7ICAgIFwKKyAgdjR1MzIgdG1wMCwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfVzJfVVcoemVybywgaW4wLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgICAgIFwKKyAgU1JBUl9EMl9VRChvdXQwLCBvdXQxLCBzaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHY0dTMyKV9fbXNhX3Bja2V2X3coKHY0aTMyKW91dDEsICh2NGkzMilvdXQwKTsgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19NVUxUX0ZJWDJfMTYoaW4wLCBpbjEsIGluMiwgaW4zLCBtdWx0LCBzY2FsZSwgc2hpZnQsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDAsIGRzdDEpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2NHUzMiB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjJ1NjQgb3V0MCwgb3V0MSwgb3V0Miwgb3V0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKGluMCwgaW4yLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9XMl9VVyhpbjEsIGluMywgdG1wMiwgdG1wMyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQodG1wMCwgdG1wMSwgbXVsdCwgbXVsdCwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDIsIHRtcDMsIG11bHQsIG11bHQsIG91dDIsIG91dDMpOyAgICAgICAgICAgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRE9UUF9VVzJfVUQob3V0MCwgb3V0MSwgc2NhbGUsIHNjYWxlLCBvdXQwLCBvdXQxKTsgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKG91dDIsIG91dDMsIHNjYWxlLCBzY2FsZSwgb3V0Miwgb3V0Myk7ICAgICAgICAgICAgICAgXAorICBTUkFSX0Q0X1VEKG91dDAsIG91dDEsIG91dDIsIG91dDMsIHNoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUENLRVZfQjJfVUIob3V0MSwgb3V0MCwgb3V0Mywgb3V0MiwgZHN0MCwgZHN0MSk7ICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfTVVMVF9GSVgyXzQoaW4wLCBpbjEsIG11bHQsIHNjYWxlLCBzaGlmdCwgZHN0KSBkbyB7ICBcCisgIHY0dTMyIHRtcDAsIHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYydTY0IG91dDAsIG91dDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNmk4IHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX1cyX1VXKGluMCwgaW4xLCB0bXAwLCB0bXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKHRtcDAsIHRtcDEsIG11bHQsIG11bHQsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICBcCisgIFNSQVJfRDJfVUQob3V0MCwgb3V0MSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERPVFBfVVcyX1VEKG91dDAsIG91dDEsIHNjYWxlLCBzY2FsZSwgb3V0MCwgb3V0MSk7ICAgICAgICAgICAgICBcCisgIFNSQVJfRDJfVUQob3V0MCwgb3V0MSwgc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfcGNrZXZfYigodjE2aTgpb3V0MSwgKHYxNmk4KW91dDApOyAgICAgICAgICAgICAgICAgICBcCisgIHQxID0gX19tc2FfcGNrZXZfYih0MCwgdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQwID0gX19tc2FfcGNrZXZfYih0MSwgdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9IF9fbXNhX2NvcHlfc193KCh2NGkzMil0MCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBFeHBvcnRSb3dFeHBhbmRfMChjb25zdCB1aW50MzJfdCogZnJvdywgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGNvbnN0IHY0dTMyIHNjYWxlID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyh3cmstPmZ5X3NjYWxlKTsKKyAgY29uc3QgdjR1MzIgc2hpZnQgPSAodjR1MzIpX19tc2FfZmlsbF93KFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgIGNvbnN0IHY0aTMyIHplcm8gPSB7IDAgfTsKKworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZ1OCBvdXQ7CisgICAgTERfVVc0KGZyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIENBTENfTVVMVF9GSVhfMTYoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgc2NhbGUsIHNoaWZ0LCBvdXQpOworICAgIFNUX1VCKG91dCwgZHN0KTsKKyAgICBsZW5ndGggLT0gMTY7CisgICAgZnJvdyAgICs9IDE2OworICAgIGRzdCAgICArPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCB4X291dDsKKyAgICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbSwgdmFsMl9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMjsKKyAgICAgIExEX1VXMyhmcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzIsIHNjYWxlLCBzaGlmdCwgdmFsMl9tKTsKKyAgICAgIFNXMyh2YWwwX20sIHZhbDFfbSwgdmFsMl9tLCBkc3QsIDQpOworICAgICAgbGVuZ3RoIC09IDEyOworICAgICAgZnJvdyAgICs9IDEyOworICAgICAgZHN0ICAgICs9IDEyOworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDgpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMTsKKyAgICAgIExEX1VXMihmcm93LCA0LCBzcmMwLCBzcmMxKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgU1cyKHZhbDBfbSwgdmFsMV9tLCBkc3QsIDQpOworICAgICAgbGVuZ3RoIC09IDg7CisgICAgICBmcm93ICAgKz0gODsKKyAgICAgIGRzdCAgICArPSA4OworICAgIH0gZWxzZSBpZiAobGVuZ3RoID49IDQpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbTsKKyAgICAgIGNvbnN0IHY0dTMyIHNyYzAgPSBMRF9VVyhmcm93KTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBTVyh2YWwwX20sIGRzdCk7CisgICAgICBsZW5ndGggLT0gNDsKKyAgICAgIGZyb3cgICArPSA0OworICAgICAgZHN0ICAgICs9IDQ7CisgICAgfQorICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IGxlbmd0aDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9IGZyb3dbeF9vdXRdOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRXhwb3J0Um93RXhwYW5kXzEoY29uc3QgdWludDMyX3QqIGZyb3csIHVpbnQzMl90KiBpcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgY29uc3QgdWludDMyX3QgQSA9ICh1aW50MzJfdCkoV0VCUF9SRVNDQUxFUl9PTkUgLSBCKTsKKyAgY29uc3QgdjRpMzIgQjEgPSBfX21zYV9maWxsX3coQik7CisgIGNvbnN0IHY0aTMyIEExID0gX19tc2FfZmlsbF93KEEpOworICBjb25zdCB2NGkzMiBBQiA9IF9fbXNhX2lsdnJfdyhBMSwgQjEpOworICBjb25zdCB2NHUzMiBzY2FsZSA9ICh2NHUzMilfX21zYV9maWxsX3cod3JrLT5meV9zY2FsZSk7CisgIGNvbnN0IHY0dTMyIHNoaWZ0ID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyhXRUJQX1JFU0NBTEVSX1JGSVgpOworCisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICB2NHUzMiBmcm93MCwgZnJvdzEsIGZyb3cyLCBmcm93MywgaXJvdzAsIGlyb3cxLCBpcm93MiwgaXJvdzM7CisgICAgdjE2dTggdDAsIHQxLCB0MiwgdDMsIHQ0LCB0NTsKKyAgICBMRF9VVzQoZnJvdywgNCwgZnJvdzAsIGZyb3cxLCBmcm93MiwgZnJvdzMpOworICAgIExEX1VXNChpcm93LCA0LCBpcm93MCwgaXJvdzEsIGlyb3cyLCBpcm93Myk7CisgICAgQ0FMQ19NVUxUX0ZJWDJfMTYoZnJvdzAsIGZyb3cxLCBpcm93MCwgaXJvdzEsIEFCLCBzY2FsZSwgc2hpZnQsIHQwLCB0MSk7CisgICAgQ0FMQ19NVUxUX0ZJWDJfMTYoZnJvdzIsIGZyb3czLCBpcm93MiwgaXJvdzMsIEFCLCBzY2FsZSwgc2hpZnQsIHQyLCB0Myk7CisgICAgUENLRVZfQjJfVUIodDEsIHQwLCB0MywgdDIsIHQ0LCB0NSk7CisgICAgdDAgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpdDUsICh2MTZpOCl0NCk7CisgICAgU1RfVUIodDAsIGRzdCk7CisgICAgZnJvdyAgICs9IDE2OworICAgIGlyb3cgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTY7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiAwKSB7CisgICAgaW50IHhfb3V0OworICAgIGlmIChsZW5ndGggPj0gMTIpIHsKKyAgICAgIHVpbnQzMl90IHZhbDBfbSwgdmFsMV9tLCB2YWwyX207CisgICAgICB2NHUzMiBmcm93MCwgZnJvdzEsIGZyb3cyLCBpcm93MCwgaXJvdzEsIGlyb3cyOworICAgICAgTERfVVczKGZyb3csIDQsIGZyb3cwLCBmcm93MSwgZnJvdzIpOworICAgICAgTERfVVczKGlyb3csIDQsIGlyb3cwLCBpcm93MSwgaXJvdzIpOworICAgICAgQ0FMQ19NVUxUX0ZJWDJfNChmcm93MCwgaXJvdzAsIEFCLCBzY2FsZSwgc2hpZnQsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cxLCBpcm93MSwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzIsIGlyb3cyLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwyX20pOworICAgICAgU1czKHZhbDBfbSwgdmFsMV9tLCB2YWwyX20sIGRzdCwgNCk7CisgICAgICBmcm93ICAgKz0gMTI7CisgICAgICBpcm93ICAgKz0gMTI7CisgICAgICBkc3QgICAgKz0gMTI7CisgICAgICBsZW5ndGggLT0gMTI7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gOCkgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX207CisgICAgICB2NHUzMiBmcm93MCwgZnJvdzEsIGlyb3cwLCBpcm93MTsKKyAgICAgIExEX1VXMihmcm93LCA0LCBmcm93MCwgZnJvdzEpOworICAgICAgTERfVVcyKGlyb3csIDQsIGlyb3cwLCBpcm93MSk7CisgICAgICBDQUxDX01VTFRfRklYMl80KGZyb3cwLCBpcm93MCwgQUIsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzEsIGlyb3cxLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwxX20pOworICAgICAgU1cyKHZhbDBfbSwgdmFsMV9tLCBkc3QsIDQpOworICAgICAgZnJvdyAgICs9IDQ7CisgICAgICBpcm93ICAgKz0gNDsKKyAgICAgIGRzdCAgICArPSA0OworICAgICAgbGVuZ3RoIC09IDQ7CisgICAgfSBlbHNlIGlmIChsZW5ndGggPj0gNCkgeworICAgICAgdWludDMyX3QgdmFsMF9tOworICAgICAgY29uc3QgdjR1MzIgZnJvdzAgPSBMRF9VVyhmcm93ICsgMCk7CisgICAgICBjb25zdCB2NHUzMiBpcm93MCA9IExEX1VXKGlyb3cgKyAwKTsKKyAgICAgIENBTENfTVVMVF9GSVgyXzQoZnJvdzAsIGlyb3cwLCBBQiwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgU1codmFsMF9tLCBkc3QpOworICAgICAgZnJvdyAgICs9IDQ7CisgICAgICBpcm93ICAgKz0gNDsKKyAgICAgIGRzdCAgICArPSA0OworICAgICAgbGVuZ3RoIC09IDQ7CisgICAgfQorICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IGxlbmd0aDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDY0X3QgSSA9ICh1aW50NjRfdClBICogZnJvd1t4X291dF0KKyAgICAgICAgICAgICAgICAgICAgICAgKyAodWludDY0X3QpQiAqIGlyb3dbeF9vdXRdOworICAgICAgY29uc3QgdWludDMyX3QgSiA9ICh1aW50MzJfdCkoKEkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfTUlQU2RzcFIyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGFzc2VydCh3cmstPnlfc3ViICE9IDApOworICBpZiAod3JrLT55X2FjY3VtID09IDApIHsKKyAgICBFeHBvcnRSb3dFeHBhbmRfMChmcm93LCBkc3QsIHhfb3V0X21heCwgd3JrKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBvcnRSb3dFeHBhbmRfMShmcm93LCBpcm93LCBkc3QsIHhfb3V0X21heCwgd3JrKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBFeHBvcnRSb3dTaHJpbmtfMChjb25zdCB1aW50MzJfdCogZnJvdywgdWludDMyX3QqIGlyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB5c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBjb25zdCB2NHUzMiB5X3NjYWxlID0gKHY0dTMyKV9fbXNhX2ZpbGxfdyh5c2NhbGUpOworICBjb25zdCB2NHUzMiBmeHlzY2FsZSA9ICh2NHUzMilfX21zYV9maWxsX3cod3JrLT5meHlfc2NhbGUpOworICBjb25zdCB2NHUzMiBzaGlmdHZhbCA9ICh2NHUzMilfX21zYV9maWxsX3coV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgY29uc3QgdjRpMzIgemVybyA9IHsgMCB9OworCisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICB2NHUzMiBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzLCBmcmFjMCwgZnJhYzEsIGZyYWMyLCBmcmFjMzsKKyAgICB2MTZ1OCBvdXQ7CisgICAgTERfVVc0KGZyb3csIDQsIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIENBTENfTVVMVF9GSVgxXzE2KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHlfc2NhbGUsIHNoaWZ0dmFsLAorICAgICAgICAgICAgICAgICAgICAgIGZyYWMwLCBmcmFjMSwgZnJhYzIsIGZyYWMzKTsKKyAgICBMRF9VVzQoaXJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMyk7CisgICAgU1VCNChzcmMwLCBmcmFjMCwgc3JjMSwgZnJhYzEsIHNyYzIsIGZyYWMyLCBzcmMzLCBmcmFjMywKKyAgICAgICAgIHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMpOworICAgIENBTENfTVVMVF9GSVhfMTYoc3JjMCwgc3JjMSwgc3JjMiwgc3JjMywgZnh5c2NhbGUsIHNoaWZ0dmFsLCBvdXQpOworICAgIFNUX1VCKG91dCwgZHN0KTsKKyAgICBTVF9VVzQoZnJhYzAsIGZyYWMxLCBmcmFjMiwgZnJhYzMsIGlyb3csIDQpOworICAgIGZyb3cgICArPSAxNjsKKyAgICBpcm93ICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2OworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gMCkgeworICAgIGludCB4X291dDsKKyAgICBpZiAobGVuZ3RoID49IDEyKSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbSwgdmFsMl9tOworICAgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMiwgZnJhYzAsIGZyYWMxLCBmcmFjMjsKKyAgICAgIExEX1VXMyhmcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMCwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMwKTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMSwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMxKTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMiwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMyKTsKKyAgICAgIExEX1VXMyhpcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyKTsKKyAgICAgIFNVQjMoc3JjMCwgZnJhYzAsIHNyYzEsIGZyYWMxLCBzcmMyLCBmcmFjMiwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIGZ4eXNjYWxlLCBzaGlmdHZhbCwgdmFsMV9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMyLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDJfbSk7CisgICAgICBTVzModmFsMF9tLCB2YWwxX20sIHZhbDJfbSwgZHN0LCA0KTsKKyAgICAgIFNUX1VXMyhmcmFjMCwgZnJhYzEsIGZyYWMyLCBpcm93LCA0KTsKKyAgICAgIGZyb3cgICArPSAxMjsKKyAgICAgIGlyb3cgICArPSAxMjsKKyAgICAgIGRzdCAgICArPSAxMjsKKyAgICAgIGxlbmd0aCAtPSAxMjsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA4KSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzEsIGZyYWMwLCBmcmFjMTsKKyAgICAgIExEX1VXMihmcm93LCA0LCBzcmMwLCBzcmMxKTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMCwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMwKTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMSwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMxKTsKKyAgICAgIExEX1VXMihpcm93LCA0LCBzcmMwLCBzcmMxKTsKKyAgICAgIFNVQjIoc3JjMCwgZnJhYzAsIHNyYzEsIGZyYWMxLCBzcmMwLCBzcmMxKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMwLCBmeHlzY2FsZSwgc2hpZnR2YWwsIHZhbDBfbSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMSwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwxX20pOworICAgICAgU1cyKHZhbDBfbSwgdmFsMV9tLCBkc3QsIDQpOworICAgICAgU1RfVVcyKGZyYWMwLCBmcmFjMSwgaXJvdywgNCk7CisgICAgICBmcm93ICAgKz0gODsKKyAgICAgIGlyb3cgICArPSA4OworICAgICAgZHN0ICAgICs9IDg7CisgICAgICBsZW5ndGggLT0gODsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA0KSB7CisgICAgICB1aW50MzJfdCB2YWwwX207CisgICAgICB2NHUzMiBmcmFjMDsKKyAgICAgIHY0dTMyIHNyYzAgPSBMRF9VVyhmcm93KTsKKyAgICAgIENBTENfTVVMVF9GSVgxXzQoc3JjMCwgeV9zY2FsZSwgc2hpZnR2YWwsIGZyYWMwKTsKKyAgICAgIHNyYzAgPSBMRF9VVyhpcm93KTsKKyAgICAgIHNyYzAgPSBzcmMwIC0gZnJhYzA7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgZnh5c2NhbGUsIHNoaWZ0dmFsLCB2YWwwX20pOworICAgICAgU1codmFsMF9tLCBkc3QpOworICAgICAgU1RfVVcoZnJhYzAsIGlyb3cpOworICAgICAgZnJvdyAgICs9IDQ7CisgICAgICBpcm93ICAgKz0gNDsKKyAgICAgIGRzdCAgICArPSA0OworICAgICAgbGVuZ3RoIC09IDQ7CisgICAgfQorICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IGxlbmd0aDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9ICh1aW50MzJfdClNVUxUX0ZJWChmcm93W3hfb3V0XSwgeXNjYWxlKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSAtIGZyYWMsIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IGZyYWM7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEV4cG9ydFJvd1Nocmlua18xKHVpbnQzMl90KiBpcm93LCB1aW50OF90KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgY29uc3QgdjR1MzIgc2NhbGUgPSAodjR1MzIpX19tc2FfZmlsbF93KHdyay0+Znh5X3NjYWxlKTsKKyAgY29uc3QgdjR1MzIgc2hpZnQgPSAodjR1MzIpX19tc2FfZmlsbF93KFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgIGNvbnN0IHY0aTMyIHplcm8gPSB7IDAgfTsKKworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgdjR1MzIgc3JjMCwgc3JjMSwgc3JjMiwgc3JjMzsKKyAgICB2MTZ1OCBkc3QwOworICAgIExEX1VXNChpcm93LCA0LCBzcmMwLCBzcmMxLCBzcmMyLCBzcmMzKTsKKyAgICBDQUxDX01VTFRfRklYXzE2KHNyYzAsIHNyYzEsIHNyYzIsIHNyYzMsIHNjYWxlLCBzaGlmdCwgZHN0MCk7CisgICAgU1RfVUIoZHN0MCwgZHN0KTsKKyAgICBTVF9TVzQoemVybywgemVybywgemVybywgemVybywgaXJvdywgNCk7CisgICAgbGVuZ3RoIC09IDE2OworICAgIGlyb3cgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICBpbnQgeF9vdXQ7CisgICAgaWYgKGxlbmd0aCA+PSAxMikgeworICAgICAgdWludDMyX3QgdmFsMF9tLCB2YWwxX20sIHZhbDJfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzEsIHNyYzI7CisgICAgICBMRF9VVzMoaXJvdywgNCwgc3JjMCwgc3JjMSwgc3JjMik7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIENBTENfTVVMVF9GSVhfNChzcmMyLCBzY2FsZSwgc2hpZnQsIHZhbDJfbSk7CisgICAgICBTVzModmFsMF9tLCB2YWwxX20sIHZhbDJfbSwgZHN0LCA0KTsKKyAgICAgIFNUX1NXMyh6ZXJvLCB6ZXJvLCB6ZXJvLCBpcm93LCA0KTsKKyAgICAgIGxlbmd0aCAtPSAxMjsKKyAgICAgIGlyb3cgICArPSAxMjsKKyAgICAgIGRzdCAgICArPSAxMjsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA4KSB7CisgICAgICB1aW50MzJfdCB2YWwwX20sIHZhbDFfbTsKKyAgICAgIHY0dTMyIHNyYzAsIHNyYzE7CisgICAgICBMRF9VVzIoaXJvdywgNCwgc3JjMCwgc3JjMSk7CisgICAgICBDQUxDX01VTFRfRklYXzQoc3JjMCwgc2NhbGUsIHNoaWZ0LCB2YWwwX20pOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzEsIHNjYWxlLCBzaGlmdCwgdmFsMV9tKTsKKyAgICAgIFNXMih2YWwwX20sIHZhbDFfbSwgZHN0LCA0KTsKKyAgICAgIFNUX1NXMih6ZXJvLCB6ZXJvLCBpcm93LCA0KTsKKyAgICAgIGxlbmd0aCAtPSA4OworICAgICAgaXJvdyAgICs9IDg7CisgICAgICBkc3QgICAgKz0gODsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aCA+PSA0KSB7CisgICAgICB1aW50MzJfdCB2YWwwX207CisgICAgICBjb25zdCB2NHUzMiBzcmMwID0gTERfVVcoaXJvdyArIDApOworICAgICAgQ0FMQ19NVUxUX0ZJWF80KHNyYzAsIHNjYWxlLCBzaGlmdCwgdmFsMF9tKTsKKyAgICAgIFNXKHZhbDBfbSwgZHN0KTsKKyAgICAgIFNUX1NXKHplcm8sIGlyb3cpOworICAgICAgbGVuZ3RoIC09IDQ7CisgICAgICBpcm93ICAgKz0gNDsKKyAgICAgIGRzdCAgICArPSA0OworICAgIH0KKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBsZW5ndGg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSwgd3JrLT5meHlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gMDsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfTUlQU2RzcFIyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIHVpbnQ4X3QqIGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgdWludDMyX3QgeXNjYWxlID0gd3JrLT5meV9zY2FsZSAqICgtd3JrLT55X2FjY3VtKTsKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJPdXRwdXREb25lKHdyaykpOworICBhc3NlcnQod3JrLT55X2FjY3VtIDw9IDApOworICBhc3NlcnQoIXdyay0+eV9leHBhbmQpOworICBpZiAoeXNjYWxlKSB7CisgICAgRXhwb3J0Um93U2hyaW5rXzAoZnJvdywgaXJvdywgZHN0LCB4X291dF9tYXgsIHlzY2FsZSwgd3JrKTsKKyAgfSBlbHNlIHsKKyAgICBFeHBvcnRSb3dTaHJpbmtfMShpcm93LCBkc3QsIHhfb3V0X21heCwgd3JrKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE1TQSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRNU0Eodm9pZCkgeworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9NSVBTZHNwUjI7CisgIFdlYlBSZXNjYWxlckV4cG9ydFJvd1NocmluayA9IFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX01JUFNkc3BSMjsKK30KKworI2Vsc2UgICAgIC8vICFXRUJQX1VTRV9NU0EKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRNU0EpCisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9NU0EKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9uZW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VmZjlmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvcmVzY2FsZXJfbmVvbi5jCkBAIC0wLDAgKzEsMTg2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTkVPTiB2ZXJzaW9uIG9mIHJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikgJiYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFybV9uZW9uLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSAic3JjL2RzcC9uZW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisKKyNkZWZpbmUgUk9VTkRFUiAoV0VCUF9SRVNDQUxFUl9PTkUgPj4gMSkKKyNkZWZpbmUgTVVMVF9GSVhfQyh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKyNkZWZpbmUgTE9BRF8zMng0KFNSQywgRFNUKSBjb25zdCB1aW50MzJ4NF90IERTVCA9IHZsZDFxX3UzMigoU1JDKSkKKyNkZWZpbmUgTE9BRF8zMng4KFNSQywgRFNUMCwgRFNUMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTE9BRF8zMng0KFNSQyArIDAsIERTVDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExPQURfMzJ4NChTUkMgKyA0LCBEU1QxKQorCisjZGVmaW5lIFNUT1JFXzMyeDgoU1JDMCwgU1JDMSwgRFNUKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZzdDFxX3UzMigoRFNUKSArIDAsIFNSQzApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB2c3QxcV91MzIoKERTVCkgKyA0LCBTUkMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKTsKKworI2lmIChXRUJQX1JFU0NBTEVSX1JGSVggPT0gMzIpCisjZGVmaW5lIE1BS0VfSEFMRl9DU1QoQykgdmR1cHFfbl9zMzIoKGludDMyX3QpKChDKSA+PiAxKSkKKyNkZWZpbmUgTVVMVF9GSVgoQSwgQikgLyogbm90ZTogQiBpcyBhY3R1YWx5IHNjYWxlPj4xLiBTZWUgTUFLRV9IQUxGX0NTVCAqLyBcCisgICAgdnJlaW50ZXJwcmV0cV91MzJfczMyKHZxcmRtdWxocV9zMzIodnJlaW50ZXJwcmV0cV9zMzJfdTMyKChBKSksIChCKSkpCisjZWxzZQorI2Vycm9yICJNVUxUX0ZJWC9XRUJQX1JFU0NBTEVSX1JGSVggbmVlZCBzb21lIG1vcmUgd29yayIKKyNlbmRpZgorCitzdGF0aWMgdWludDMyeDRfdCBJbnRlcnBvbGF0ZV9ORU9OKGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGlyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEEsIHVpbnQzMl90IEIpIHsKKyAgTE9BRF8zMng0KGZyb3csIEEwKTsKKyAgTE9BRF8zMng0KGlyb3csIEIwKTsKKyAgY29uc3QgdWludDY0eDJfdCBDMCA9IHZtdWxsX25fdTMyKHZnZXRfbG93X3UzMihBMCksIEEpOworICBjb25zdCB1aW50NjR4Ml90IEMxID0gdm11bGxfbl91MzIodmdldF9oaWdoX3UzMihBMCksIEEpOworICBjb25zdCB1aW50NjR4Ml90IEQwID0gdm1sYWxfbl91MzIoQzAsIHZnZXRfbG93X3UzMihCMCksIEIpOworICBjb25zdCB1aW50NjR4Ml90IEQxID0gdm1sYWxfbl91MzIoQzEsIHZnZXRfaGlnaF91MzIoQjApLCBCKTsKKyAgY29uc3QgdWludDMyeDRfdCBFID0gdmNvbWJpbmVfdTMyKAorICAgICAgdnJzaHJuX25fdTY0KEQwLCBXRUJQX1JFU0NBTEVSX1JGSVgpLAorICAgICAgdnJzaHJuX25fdTY0KEQxLCBXRUJQX1JFU0NBTEVSX1JGSVgpKTsKKyAgcmV0dXJuIEU7Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kX05FT04oV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCBtYXhfc3BhbiA9IHhfb3V0X21heCAmIH43OworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCBmeV9zY2FsZSA9IHdyay0+Znlfc2NhbGU7CisgIGNvbnN0IGludDMyeDRfdCBmeV9zY2FsZV9oYWxmID0gTUFLRV9IQUxGX0NTVChmeV9zY2FsZSk7CisgIGFzc2VydCghV2ViUFJlc2NhbGVyT3V0cHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KHdyay0+eV9hY2N1bSA8PSAwKTsKKyAgYXNzZXJ0KHdyay0+eV9leHBhbmQpOworICBhc3NlcnQod3JrLT55X3N1YiAhPSAwKTsKKyAgaWYgKHdyay0+eV9hY2N1bSA9PSAwKSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbWF4X3NwYW47IHhfb3V0ICs9IDgpIHsKKyAgICAgIExPQURfMzJ4NChmcm93ICsgeF9vdXQgKyAwLCBBMCk7CisgICAgICBMT0FEXzMyeDQoZnJvdyArIHhfb3V0ICsgNCwgQTEpOworICAgICAgY29uc3QgdWludDMyeDRfdCBCMCA9IE1VTFRfRklYKEEwLCBmeV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQjEgPSBNVUxUX0ZJWChBMSwgZnlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEMwID0gdm1vdm5fdTMyKEIwKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgQzEgPSB2bW92bl91MzIoQjEpOworICAgICAgY29uc3QgdWludDh4OF90IEQgPSB2bW92bl91MTYodmNvbWJpbmVfdTE2KEMwLCBDMSkpOworICAgICAgdnN0MV91OChkc3QgKyB4X291dCwgRCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9IGZyb3dbeF9vdXRdOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYX0MoSiwgZnlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCA8IG1heF9zcGFuOyB4X291dCArPSA4KSB7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEMwID0KKyAgICAgICAgICBJbnRlcnBvbGF0ZV9ORU9OKGZyb3cgKyB4X291dCArIDAsIGlyb3cgKyB4X291dCArIDAsIEEsIEIpOworICAgICAgY29uc3QgdWludDMyeDRfdCBDMSA9CisgICAgICAgICAgSW50ZXJwb2xhdGVfTkVPTihmcm93ICsgeF9vdXQgKyA0LCBpcm93ICsgeF9vdXQgKyA0LCBBLCBCKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgRDAgPSBNVUxUX0ZJWChDMCwgZnlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEQxID0gTVVMVF9GSVgoQzEsIGZ5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDE2eDRfdCBFMCA9IHZtb3ZuX3UzMihEMCk7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEUxID0gdm1vdm5fdTMyKEQxKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBGID0gdm1vdm5fdTE2KHZjb21iaW5lX3UxNihFMCwgRTEpKTsKKyAgICAgIHZzdDFfdTgoZHN0ICsgeF9vdXQsIEYpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IHVpbnQ2NF90IEkgPSAodWludDY0X3QpQSAqIGZyb3dbeF9vdXRdCisgICAgICAgICAgICAgICAgICAgICAgICsgKHVpbnQ2NF90KUIgKiBpcm93W3hfb3V0XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IEogPSAodWludDMyX3QpKChJICsgUk9VTkRFUikgPj4gV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWF9DKEosIGZ5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rX05FT04oV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspIHsKKyAgaW50IHhfb3V0OworICB1aW50OF90KiBjb25zdCBkc3QgPSB3cmstPmRzdDsKKyAgcmVzY2FsZXJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKKyAgY29uc3QgaW50IHhfb3V0X21heCA9IHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCBtYXhfc3BhbiA9IHhfb3V0X21heCAmIH43OworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBjb25zdCB1aW50MzJfdCBmeHlfc2NhbGUgPSB3cmstPmZ4eV9zY2FsZTsKKyAgY29uc3QgdWludDMyeDRfdCB6ZXJvID0gdmR1cHFfbl91MzIoMCk7CisgIGNvbnN0IGludDMyeDRfdCB5c2NhbGVfaGFsZiA9IE1BS0VfSEFMRl9DU1QoeXNjYWxlKTsKKyAgY29uc3QgaW50MzJ4NF90IGZ4eV9zY2FsZV9oYWxmID0gTUFLRV9IQUxGX0NTVChmeHlfc2NhbGUpOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBmb3IgKHhfb3V0ID0gMDsgeF9vdXQgPCBtYXhfc3BhbjsgeF9vdXQgKz0gOCkgeworICAgICAgTE9BRF8zMng4KGZyb3cgKyB4X291dCwgaW4wLCBpbjEpOworICAgICAgTE9BRF8zMng4KGlyb3cgKyB4X291dCwgaW4yLCBpbjMpOworICAgICAgY29uc3QgdWludDMyeDRfdCBBMCA9IE1VTFRfRklYKGluMCwgeXNjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBBMSA9IE1VTFRfRklYKGluMSwgeXNjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBCMCA9IHZxc3VicV91MzIoaW4yLCBBMCk7CisgICAgICBjb25zdCB1aW50MzJ4NF90IEIxID0gdnFzdWJxX3UzMihpbjMsIEExKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQzAgPSBNVUxUX0ZJWChCMCwgZnh5X3NjYWxlX2hhbGYpOworICAgICAgY29uc3QgdWludDMyeDRfdCBDMSA9IE1VTFRfRklYKEIxLCBmeHlfc2NhbGVfaGFsZik7CisgICAgICBjb25zdCB1aW50MTZ4NF90IEQwID0gdm1vdm5fdTMyKEMwKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgRDEgPSB2bW92bl91MzIoQzEpOworICAgICAgY29uc3QgdWludDh4OF90IEUgPSB2bW92bl91MTYodmNvbWJpbmVfdTE2KEQwLCBEMSkpOworICAgICAgdnN0MV91OChkc3QgKyB4X291dCwgRSk7CisgICAgICBTVE9SRV8zMng4KEEwLCBBMSwgaXJvdyArIHhfb3V0KTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50MzJfdCBmcmFjID0gKHVpbnQzMl90KU1VTFRfRklYX0MoZnJvd1t4X291dF0sIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVhfQyhpcm93W3hfb3V0XSAtIGZyYWMsIHdyay0+Znh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgbWF4X3NwYW47IHhfb3V0ICs9IDgpIHsKKyAgICAgIExPQURfMzJ4OChpcm93ICsgeF9vdXQsIGluMCwgaW4xKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQTAgPSBNVUxUX0ZJWChpbjAsIGZ4eV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQzMng0X3QgQTEgPSBNVUxUX0ZJWChpbjEsIGZ4eV9zY2FsZV9oYWxmKTsKKyAgICAgIGNvbnN0IHVpbnQxNng0X3QgQjAgPSB2bW92bl91MzIoQTApOworICAgICAgY29uc3QgdWludDE2eDRfdCBCMSA9IHZtb3ZuX3UzMihBMSk7CisgICAgICBjb25zdCB1aW50OHg4X3QgQyA9IHZtb3ZuX3UxNih2Y29tYmluZV91MTYoQjAsIEIxKSk7CisgICAgICB2c3QxX3U4KGRzdCArIHhfb3V0LCBDKTsKKyAgICAgIFNUT1JFXzMyeDgoemVybywgemVybywgaXJvdyArIHhfb3V0KTsKKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVhfQyhpcm93W3hfb3V0XSwgZnh5X3NjYWxlKTsKKyAgICAgIGFzc2VydCh2ID49IDAgJiYgdiA8PSAyNTUpOworICAgICAgZHN0W3hfb3V0XSA9IHY7CisgICAgICBpcm93W3hfb3V0XSA9IDA7CisgICAgfQorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUFJlc2NhbGVyRHNwSW5pdE5FT04odm9pZCkgeworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmQgPSBSZXNjYWxlckV4cG9ydFJvd0V4cGFuZF9ORU9OOworICBXZWJQUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmsgPSBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19ORU9OOworfQorCisjZWxzZSAgICAgLy8gIVdFQlBfVVNFX05FT04KKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBSZXNjYWxlckRzcEluaXRORU9OKQorCisjZW5kaWYgICAgLy8gV0VCUF9VU0VfTkVPTgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Jlc2NhbGVyX3NzZTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGM1MGRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9yZXNjYWxlcl9zc2UyLmMKQEAgLTAsMCArMSwzNzMgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIFJlc2NhbGluZyBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikgJiYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyNpbmNsdWRlIDxlbW1pbnRyaW4uaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1wbGVtZW50YXRpb25zIG9mIGNyaXRpY2FsIGZ1bmN0aW9ucyBJbXBvcnRSb3cgLyBFeHBvcnRSb3cKKworI2RlZmluZSBST1VOREVSIChXRUJQX1JFU0NBTEVSX09ORSA+PiAxKQorI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKCh1aW50NjRfdCkoeCkgKiAoeSkgKyBST1VOREVSKSA+PiBXRUJQX1JFU0NBTEVSX1JGSVgpCisKKy8vIGlucHV0OiA4IGJ5dGVzIEFCQ0RFRkdIIC0+IG91dHB1dDogQTBFMEIwRjBDMEcwRDBIMAorc3RhdGljIHZvaWQgTG9hZFR3b1BpeGVsc19TU0UyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgX19tMTI4aSogb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopKHNyYykpOyAgLy8gQUJDREVGR0gKKyAgY29uc3QgX19tMTI4aSBCID0gX21tX3VucGFja2xvX2VwaTgoQSwgemVybyk7ICAgICAgICAgICAgICAvLyBBMEIwQzBEMEUwRjBHMEgwCisgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9zcmxpX3NpMTI4KEIsIDgpOyAgICAgICAgICAgICAgICAgICAgLy8gRTBGMEcwSDAKKyAgKm91dCA9IF9tbV91bnBhY2tsb19lcGkxNihCLCBDKTsKK30KKworLy8gaW5wdXQ6IDggYnl0ZXMgQUJDREVGR0ggLT4gb3V0cHV0OiBBMEIwQzBEMEUwRjBHMEgwCitzdGF0aWMgdm9pZCBMb2FkRWlnaHRQaXhlbHNfU1NFMihjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIF9fbTEyOGkqIG91dCkgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEEgPSBfbW1fbG9hZGxfZXBpNjQoKGNvbnN0IF9fbTEyOGkqKShzcmMpKTsgIC8vIEFCQ0RFRkdICisgICpvdXQgPSBfbW1fdW5wYWNrbG9fZXBpOChBLCB6ZXJvKTsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIHJlc2NhbGVyX3QqIGZyb3cgPSB3cmstPmZyb3c7CisgIGNvbnN0IHJlc2NhbGVyX3QqIGNvbnN0IGZyb3dfZW5kID0gZnJvdyArIHdyay0+ZHN0X3dpZHRoICogd3JrLT5udW1fY2hhbm5lbHM7CisgIGNvbnN0IGludCB4X2FkZCA9IHdyay0+eF9hZGQ7CisgIGludCBhY2N1bSA9IHhfYWRkOworICBfX20xMjhpIGN1cl9waXhlbHM7CisKKyAgLy8gU1NFMiBpbXBsZW1lbnRhdGlvbiBvbmx5IHdvcmtzIHdpdGggMTZiIHNpZ25lZCBhcml0aG1ldGljIGF0IG1heC4KKyAgaWYgKHdyay0+c3JjX3dpZHRoIDwgOCB8fCBhY2N1bSA+PSAoMSA8PCAxNSkpIHsKKyAgICBXZWJQUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfQyh3cmssIHNyYyk7CisgICAgcmV0dXJuOworICB9CisKKyAgYXNzZXJ0KCFXZWJQUmVzY2FsZXJJbnB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnhfZXhwYW5kKTsKKyAgaWYgKHdyay0+bnVtX2NoYW5uZWxzID09IDQpIHsKKyAgICBMb2FkVHdvUGl4ZWxzX1NTRTIoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgc3JjICs9IDQ7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9zZXQxX2VwaTMyKCgoeF9hZGQgLSBhY2N1bSkgPDwgMTYpIHwgYWNjdW0pOworICAgICAgY29uc3QgX19tMTI4aSBvdXQgPSBfbW1fbWFkZF9lcGkxNihjdXJfcGl4ZWxzLCBtdWx0KTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWZyb3csIG91dCk7CisgICAgICBmcm93ICs9IDQ7CisgICAgICBpZiAoZnJvdyA+PSBmcm93X2VuZCkgYnJlYWs7CisgICAgICBhY2N1bSAtPSB3cmstPnhfc3ViOworICAgICAgaWYgKGFjY3VtIDwgMCkgeworICAgICAgICBMb2FkVHdvUGl4ZWxzX1NTRTIoc3JjLCAmY3VyX3BpeGVscyk7CisgICAgICAgIHNyYyArPSA0OworICAgICAgICBhY2N1bSArPSB4X2FkZDsKKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgaW50IGxlZnQ7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjX2xpbWl0ID0gc3JjICsgd3JrLT5zcmNfd2lkdGggLSA4OworICAgIExvYWRFaWdodFBpeGVsc19TU0UyKHNyYywgJmN1cl9waXhlbHMpOworICAgIHNyYyArPSA3OworICAgIGxlZnQgPSA3OworICAgIHdoaWxlICgxKSB7CisgICAgICBjb25zdCBfX20xMjhpIG11bHQgPSBfbW1fY3Z0c2kzMl9zaTEyOCgoKHhfYWRkIC0gYWNjdW0pIDw8IDE2KSB8IGFjY3VtKTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgb3V0ID0gX21tX21hZGRfZXBpMTYoY3VyX3BpeGVscywgbXVsdCk7CisgICAgICBhc3NlcnQoc2l6ZW9mKCpmcm93KSA9PSBzaXplb2YodWludDMyX3QpKTsKKyAgICAgIFdlYlBVaW50MzJUb01lbSgodWludDhfdCopZnJvdywgX21tX2N2dHNpMTI4X3NpMzIob3V0KSk7CisgICAgICBmcm93ICs9IDE7CisgICAgICBpZiAoZnJvdyA+PSBmcm93X2VuZCkgYnJlYWs7CisgICAgICBhY2N1bSAtPSB3cmstPnhfc3ViOworICAgICAgaWYgKGFjY3VtIDwgMCkgeworICAgICAgICBpZiAoLS1sZWZ0KSB7CisgICAgICAgICAgY3VyX3BpeGVscyA9IF9tbV9zcmxpX3NpMTI4KGN1cl9waXhlbHMsIDIpOworICAgICAgICB9IGVsc2UgaWYgKHNyYyA8PSBzcmNfbGltaXQpIHsKKyAgICAgICAgICBMb2FkRWlnaHRQaXhlbHNfU1NFMihzcmMsICZjdXJfcGl4ZWxzKTsKKyAgICAgICAgICBzcmMgKz0gNzsKKyAgICAgICAgICBsZWZ0ID0gNzsKKyAgICAgICAgfSBlbHNlIHsgICAvLyB0YWlsCisgICAgICAgICAgY3VyX3BpeGVscyA9IF9tbV9zcmxpX3NpMTI4KGN1cl9waXhlbHMsIDIpOworICAgICAgICAgIGN1cl9waXhlbHMgPSBfbW1faW5zZXJ0X2VwaTE2KGN1cl9waXhlbHMsIHNyY1sxXSwgMSk7CisgICAgICAgICAgc3JjICs9IDE7CisgICAgICAgICAgbGVmdCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYWNjdW0gKz0geF9hZGQ7CisgICAgICB9CisgICAgfQorICB9CisgIGFzc2VydChhY2N1bSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IGludCB4X3N1YiA9IHdyay0+eF9zdWI7CisgIGludCBhY2N1bSA9IDA7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbXVsdDAgPSBfbW1fc2V0MV9lcGkxNih4X3N1Yik7CisgIGNvbnN0IF9fbTEyOGkgbXVsdDEgPSBfbW1fc2V0MV9lcGkzMih3cmstPmZ4X3NjYWxlKTsKKyAgY29uc3QgX19tMTI4aSByb3VuZGVyID0gX21tX3NldF9lcGkzMigwLCBST1VOREVSLCAwLCBST1VOREVSKTsKKyAgX19tMTI4aSBzdW0gPSB6ZXJvOworICByZXNjYWxlcl90KiBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93X2VuZCA9IHdyay0+ZnJvdyArIDQgKiB3cmstPmRzdF93aWR0aDsKKworICBpZiAod3JrLT5udW1fY2hhbm5lbHMgIT0gNCB8fCB3cmstPnhfYWRkID4gKHhfc3ViIDw8IDcpKSB7CisgICAgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rX0Mod3JrLCBzcmMpOworICAgIHJldHVybjsKKyAgfQorICBhc3NlcnQoIVdlYlBSZXNjYWxlcklucHV0RG9uZSh3cmspKTsKKyAgYXNzZXJ0KCF3cmstPnhfZXhwYW5kKTsKKworICBmb3IgKDsgZnJvdyA8IGZyb3dfZW5kOyBmcm93ICs9IDQpIHsKKyAgICBfX20xMjhpIGJhc2UgPSB6ZXJvOworICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7CisgICAgd2hpbGUgKGFjY3VtID4gMCkgeworICAgICAgY29uc3QgX19tMTI4aSBBID0gX21tX2N2dHNpMzJfc2kxMjgoV2ViUE1lbVRvVWludDMyKHNyYykpOworICAgICAgc3JjICs9IDQ7CisgICAgICBiYXNlID0gX21tX3VucGFja2xvX2VwaTgoQSwgemVybyk7CisgICAgICAvLyBUbyBhdm9pZCBvdmVyZmxvdywgd2UgbmVlZDogYmFzZSAqIHhfYWRkIC8geF9zdWIgPCAzMjc2OAorICAgICAgLy8gPT4geF9hZGQgPCB4X3N1YiA8PCA3LiBUaGF0J3MgYSAxLzEyOCByZWR1Y3Rpb24gcmF0aW8gbGltaXQuCisgICAgICBzdW0gPSBfbW1fYWRkX2VwaTE2KHN1bSwgYmFzZSk7CisgICAgICBhY2N1bSAtPSB4X3N1YjsKKyAgICB9CisgICAgeyAgICAvLyBFbWl0IG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KKyAgICAgIGNvbnN0IF9fbTEyOGkgbXVsdCA9IF9tbV9zZXQxX2VwaTE2KC1hY2N1bSk7CisgICAgICBjb25zdCBfX20xMjhpIGZyYWMwID0gX21tX211bGxvX2VwaTE2KGJhc2UsIG11bHQpOyAgLy8gMTZiIHggMTZiIC0+IDMyYgorICAgICAgY29uc3QgX19tMTI4aSBmcmFjMSA9IF9tbV9tdWxoaV9lcHUxNihiYXNlLCBtdWx0KTsKKyAgICAgIGNvbnN0IF9fbTEyOGkgZnJhYyA9IF9tbV91bnBhY2tsb19lcGkxNihmcmFjMCwgZnJhYzEpOyAgLy8gZnJhYyBpcyAzMmIKKyAgICAgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbXVsbG9fZXBpMTYoc3VtLCBtdWx0MCk7CisgICAgICBjb25zdCBfX20xMjhpIEExID0gX21tX211bGhpX2VwdTE2KHN1bSwgbXVsdDApOworICAgICAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGkxNihBMCwgQTEpOyAgICAgIC8vIHN1bSAqIHhfc3ViCisgICAgICBjb25zdCBfX20xMjhpIGZyb3dfb3V0ID0gX21tX3N1Yl9lcGkzMihCMCwgZnJhYyk7ICAgLy8gc3VtICogeF9zdWIgLSBmcmFjCisgICAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX3NybGlfZXBpNjQoZnJhYywgMzIpOworICAgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9tdWxfZXB1MzIoZnJhYywgbXVsdDEpOyAgICAgIC8vIDMyYiB4IDE2YiAtPiA2NGIKKyAgICAgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fbXVsX2VwdTMyKEQwLCBtdWx0MSk7CisgICAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX2FkZF9lcGk2NChEMSwgcm91bmRlcik7CisgICAgICBjb25zdCBfX20xMjhpIEUyID0gX21tX2FkZF9lcGk2NChEMiwgcm91bmRlcik7CisgICAgICBjb25zdCBfX20xMjhpIEYxID0gX21tX3NodWZmbGVfZXBpMzIoRTEsIDEgfCAoMyA8PCAyKSk7CisgICAgICBjb25zdCBfX20xMjhpIEYyID0gX21tX3NodWZmbGVfZXBpMzIoRTIsIDEgfCAoMyA8PCAyKSk7CisgICAgICBjb25zdCBfX20xMjhpIEcgPSBfbW1fdW5wYWNrbG9fZXBpMzIoRjEsIEYyKTsKKyAgICAgIHN1bSA9IF9tbV9wYWNrc19lcGkzMihHLCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWZyb3csIGZyb3dfb3V0KTsKKyAgICB9CisgIH0KKyAgYXNzZXJ0KGFjY3VtID09IDApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm93IGV4cG9ydAorCisvLyBsb2FkICpzcmMgYXMgZXBpNjQsIG11bHRpcGx5IGJ5IG11bHQgYW5kIHN0b3JlIHJlc3VsdCBpbiBbb3V0MCAuLi4gb3V0M10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihjb25zdCByZXNjYWxlcl90KiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgbXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBvdXQzKSB7CisgIGNvbnN0IF9fbTEyOGkgQTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyAwKSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyA0KSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc3JsaV9lcGk2NChBMCwgMzIpOworICBjb25zdCBfX20xMjhpIEEzID0gX21tX3NybGlfZXBpNjQoQTEsIDMyKTsKKyAgaWYgKG11bHQgIT0gTlVMTCkgeworICAgICpvdXQwID0gX21tX211bF9lcHUzMihBMCwgKm11bHQpOworICAgICpvdXQxID0gX21tX211bF9lcHUzMihBMSwgKm11bHQpOworICAgICpvdXQyID0gX21tX211bF9lcHUzMihBMiwgKm11bHQpOworICAgICpvdXQzID0gX21tX211bF9lcHUzMihBMywgKm11bHQpOworICB9IGVsc2UgeworICAgICpvdXQwID0gQTA7CisgICAgKm91dDEgPSBBMTsKKyAgICAqb3V0MiA9IEEyOworICAgICpvdXQzID0gQTM7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJvY2Vzc1Jvd19TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEExLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IG11bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgcm91bmRlciA9IF9tbV9zZXRfZXBpMzIoMCwgUk9VTkRFUiwgMCwgUk9VTkRFUik7CisgIGNvbnN0IF9fbTEyOGkgbWFzayA9IF9tbV9zZXRfZXBpMzIoMHhmZmZmZmZmZnUsIDAsIDB4ZmZmZmZmZmZ1LCAwKTsKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV9tdWxfZXB1MzIoKkEwLCAqbXVsdCk7CisgIGNvbnN0IF9fbTEyOGkgQjEgPSBfbW1fbXVsX2VwdTMyKCpBMSwgKm11bHQpOworICBjb25zdCBfX20xMjhpIEIyID0gX21tX211bF9lcHUzMigqQTIsICptdWx0KTsKKyAgY29uc3QgX19tMTI4aSBCMyA9IF9tbV9tdWxfZXB1MzIoKkEzLCAqbXVsdCk7CisgIGNvbnN0IF9fbTEyOGkgQzAgPSBfbW1fYWRkX2VwaTY0KEIwLCByb3VuZGVyKTsKKyAgY29uc3QgX19tMTI4aSBDMSA9IF9tbV9hZGRfZXBpNjQoQjEsIHJvdW5kZXIpOworICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FkZF9lcGk2NChCMiwgcm91bmRlcik7CisgIGNvbnN0IF9fbTEyOGkgQzMgPSBfbW1fYWRkX2VwaTY0KEIzLCByb3VuZGVyKTsKKyAgY29uc3QgX19tMTI4aSBEMCA9IF9tbV9zcmxpX2VwaTY0KEMwLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICBjb25zdCBfX20xMjhpIEQxID0gX21tX3NybGlfZXBpNjQoQzEsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisjaWYgKFdFQlBfUkVTQ0FMRVJfUkZJWCA8IDMyKQorICBjb25zdCBfX20xMjhpIEQyID0KKyAgICAgIF9tbV9hbmRfc2kxMjgoX21tX3NsbGlfZXBpNjQoQzIsIDMyIC0gV0VCUF9SRVNDQUxFUl9SRklYKSwgbWFzayk7CisgIGNvbnN0IF9fbTEyOGkgRDMgPQorICAgICAgX21tX2FuZF9zaTEyOChfbW1fc2xsaV9lcGk2NChDMywgMzIgLSBXRUJQX1JFU0NBTEVSX1JGSVgpLCBtYXNrKTsKKyNlbHNlCisgIGNvbnN0IF9fbTEyOGkgRDIgPSBfbW1fYW5kX3NpMTI4KEMyLCBtYXNrKTsKKyAgY29uc3QgX19tMTI4aSBEMyA9IF9tbV9hbmRfc2kxMjgoQzMsIG1hc2spOworI2VuZGlmCisgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fb3Jfc2kxMjgoRDAsIEQyKTsKKyAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9vcl9zaTEyOChEMSwgRDMpOworICBjb25zdCBfX20xMjhpIEYgPSBfbW1fcGFja3NfZXBpMzIoRTAsIEUxKTsKKyAgY29uc3QgX19tMTI4aSBHID0gX21tX3BhY2t1c19lcGkxNihGLCBGKTsKKyAgX21tX3N0b3JlbF9lcGk2NCgoX19tMTI4aSopZHN0LCBHKTsKK30KKworc3RhdGljIHZvaWQgUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfU1NFMihXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgeworICBpbnQgeF9vdXQ7CisgIHVpbnQ4X3QqIGNvbnN0IGRzdCA9IHdyay0+ZHN0OworICByZXNjYWxlcl90KiBjb25zdCBpcm93ID0gd3JrLT5pcm93OworICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKKyAgY29uc3QgcmVzY2FsZXJfdCogY29uc3QgZnJvdyA9IHdyay0+ZnJvdzsKKyAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX3NldF9lcGkzMigwLCB3cmstPmZ5X3NjYWxlLCAwLCB3cmstPmZ5X3NjYWxlKTsKKworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCAmJiB3cmstPnlfc3ViICsgd3JrLT55X2FjY3VtID49IDApOworICBhc3NlcnQod3JrLT55X2V4cGFuZCk7CisgIGlmICh3cmstPnlfYWNjdW0gPT0gMCkgeworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGZyb3cgKyB4X291dCwgTlVMTCwgJkEwLCAmQTEsICZBMiwgJkEzKTsKKyAgICAgIFByb2Nlc3NSb3dfU1NFMigmQTAsICZBMSwgJkEyLCAmQTMsICZtdWx0LCBkc3QgKyB4X291dCk7CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgSiA9IGZyb3dbeF9vdXRdOworICAgICAgY29uc3QgaW50IHYgPSAoaW50KU1VTFRfRklYKEosIHdyay0+Znlfc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDMyX3QgQiA9IFdFQlBfUkVTQ0FMRVJfRlJBQygtd3JrLT55X2FjY3VtLCB3cmstPnlfc3ViKTsKKyAgICBjb25zdCB1aW50MzJfdCBBID0gKHVpbnQzMl90KShXRUJQX1JFU0NBTEVSX09ORSAtIEIpOworICAgIGNvbnN0IF9fbTEyOGkgbUEgPSBfbW1fc2V0X2VwaTMyKDAsIEEsIDAsIEEpOworICAgIGNvbnN0IF9fbTEyOGkgbUIgPSBfbW1fc2V0X2VwaTMyKDAsIEIsIDAsIEIpOworICAgIGNvbnN0IF9fbTEyOGkgcm91bmRlciA9IF9tbV9zZXRfZXBpMzIoMCwgUk9VTkRFUiwgMCwgUk9VTkRFUik7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTMsIEIwLCBCMSwgQjIsIEIzOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGZyb3cgKyB4X291dCwgJm1BLCAmQTAsICZBMSwgJkEyLCAmQTMpOworICAgICAgTG9hZERpc3BhdGNoQW5kTXVsdF9TU0UyKGlyb3cgKyB4X291dCwgJm1CLCAmQjAsICZCMSwgJkIyLCAmQjMpOworICAgICAgeworICAgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk2NChBMCwgQjApOworICAgICAgICBjb25zdCBfX20xMjhpIEMxID0gX21tX2FkZF9lcGk2NChBMSwgQjEpOworICAgICAgICBjb25zdCBfX20xMjhpIEMyID0gX21tX2FkZF9lcGk2NChBMiwgQjIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMzID0gX21tX2FkZF9lcGk2NChBMywgQjMpOworICAgICAgICBjb25zdCBfX20xMjhpIEQwID0gX21tX2FkZF9lcGk2NChDMCwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDEgPSBfbW1fYWRkX2VwaTY0KEMxLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMiA9IF9tbV9hZGRfZXBpNjQoQzIsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEQzID0gX21tX2FkZF9lcGk2NChDMywgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTAgPSBfbW1fc3JsaV9lcGk2NChEMCwgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMSA9IF9tbV9zcmxpX2VwaTY0KEQxLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEUyID0gX21tX3NybGlfZXBpNjQoRDIsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRTMgPSBfbW1fc3JsaV9lcGk2NChEMywgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgUHJvY2Vzc1Jvd19TU0UyKCZFMCwgJkUxLCAmRTIsICZFMywgJm11bHQsIGRzdCArIHhfb3V0KTsKKyAgICAgIH0KKyAgICB9CisgICAgZm9yICg7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7CisgICAgICBjb25zdCB1aW50NjRfdCBJID0gKHVpbnQ2NF90KUEgKiBmcm93W3hfb3V0XQorICAgICAgICAgICAgICAgICAgICAgICArICh1aW50NjRfdClCICogaXJvd1t4X291dF07CisgICAgICBjb25zdCB1aW50MzJfdCBKID0gKHVpbnQzMl90KSgoSSArIFJPVU5ERVIpID4+IFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoSiwgd3JrLT5meV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCBSZXNjYWxlckV4cG9ydFJvd1Nocmlua19TU0UyKFdlYlBSZXNjYWxlciogY29uc3Qgd3JrKSB7CisgIGludCB4X291dDsKKyAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7CisgIHJlc2NhbGVyX3QqIGNvbnN0IGlyb3cgPSB3cmstPmlyb3c7CisgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOworICBjb25zdCByZXNjYWxlcl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OworICBjb25zdCB1aW50MzJfdCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOworICBhc3NlcnQoIVdlYlBSZXNjYWxlck91dHB1dERvbmUod3JrKSk7CisgIGFzc2VydCh3cmstPnlfYWNjdW0gPD0gMCk7CisgIGFzc2VydCghd3JrLT55X2V4cGFuZCk7CisgIGlmICh5c2NhbGUpIHsKKyAgICBjb25zdCBpbnQgc2NhbGVfeHkgPSB3cmstPmZ4eV9zY2FsZTsKKyAgICBjb25zdCBfX20xMjhpIG11bHRfeHkgPSBfbW1fc2V0X2VwaTMyKDAsIHNjYWxlX3h5LCAwLCBzY2FsZV94eSk7CisgICAgY29uc3QgX19tMTI4aSBtdWx0X3kgPSBfbW1fc2V0X2VwaTMyKDAsIHlzY2FsZSwgMCwgeXNjYWxlKTsKKyAgICBjb25zdCBfX20xMjhpIHJvdW5kZXIgPSBfbW1fc2V0X2VwaTMyKDAsIFJPVU5ERVIsIDAsIFJPVU5ERVIpOworICAgIGZvciAoeF9vdXQgPSAwOyB4X291dCArIDggPD0geF9vdXRfbWF4OyB4X291dCArPSA4KSB7CisgICAgICBfX20xMjhpIEEwLCBBMSwgQTIsIEEzLCBCMCwgQjEsIEIyLCBCMzsKKyAgICAgIExvYWREaXNwYXRjaEFuZE11bHRfU1NFMihpcm93ICsgeF9vdXQsIE5VTEwsICZBMCwgJkExLCAmQTIsICZBMyk7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoZnJvdyArIHhfb3V0LCAmbXVsdF95LCAmQjAsICZCMSwgJkIyLCAmQjMpOworICAgICAgeworICAgICAgICBjb25zdCBfX20xMjhpIEMwID0gX21tX2FkZF9lcGk2NChCMCwgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fYWRkX2VwaTY0KEIxLCByb3VuZGVyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBDMiA9IF9tbV9hZGRfZXBpNjQoQjIsIHJvdW5kZXIpOworICAgICAgICBjb25zdCBfX20xMjhpIEMzID0gX21tX2FkZF9lcGk2NChCMywgcm91bmRlcik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDAgPSBfbW1fc3JsaV9lcGk2NChDMCwgV0VCUF9SRVNDQUxFUl9SRklYKTsgICAvLyA9IGZyYWMKKyAgICAgICAgY29uc3QgX19tMTI4aSBEMSA9IF9tbV9zcmxpX2VwaTY0KEMxLCBXRUJQX1JFU0NBTEVSX1JGSVgpOworICAgICAgICBjb25zdCBfX20xMjhpIEQyID0gX21tX3NybGlfZXBpNjQoQzIsIFdFQlBfUkVTQ0FMRVJfUkZJWCk7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRDMgPSBfbW1fc3JsaV9lcGk2NChDMywgV0VCUF9SRVNDQUxFUl9SRklYKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBFMCA9IF9tbV9zdWJfZXBpNjQoQTAsIEQwKTsgICAvLyBpcm93W3hdIC0gZnJhYworICAgICAgICBjb25zdCBfX20xMjhpIEUxID0gX21tX3N1Yl9lcGk2NChBMSwgRDEpOworICAgICAgICBjb25zdCBfX20xMjhpIEUyID0gX21tX3N1Yl9lcGk2NChBMiwgRDIpOworICAgICAgICBjb25zdCBfX20xMjhpIEUzID0gX21tX3N1Yl9lcGk2NChBMywgRDMpOworICAgICAgICBjb25zdCBfX20xMjhpIEYyID0gX21tX3NsbGlfZXBpNjQoRDIsIDMyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBGMyA9IF9tbV9zbGxpX2VwaTY0KEQzLCAzMik7CisgICAgICAgIGNvbnN0IF9fbTEyOGkgRzAgPSBfbW1fb3Jfc2kxMjgoRDAsIEYyKTsKKyAgICAgICAgY29uc3QgX19tMTI4aSBHMSA9IF9tbV9vcl9zaTEyOChEMSwgRjMpOworICAgICAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoaXJvdyArIHhfb3V0ICsgMCksIEcwKTsKKyAgICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGlyb3cgKyB4X291dCArIDQpLCBHMSk7CisgICAgICAgIFByb2Nlc3NSb3dfU1NFMigmRTAsICZFMSwgJkUyLCAmRTMsICZtdWx0X3h5LCBkc3QgKyB4X291dCk7CisgICAgICB9CisgICAgfQorICAgIGZvciAoOyB4X291dCA8IHhfb3V0X21heDsgKyt4X291dCkgeworICAgICAgY29uc3QgdWludDMyX3QgZnJhYyA9IChpbnQpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7CisgICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7CisgICAgICBhc3NlcnQodiA+PSAwICYmIHYgPD0gMjU1KTsKKyAgICAgIGRzdFt4X291dF0gPSB2OworICAgICAgaXJvd1t4X291dF0gPSBmcmFjOyAgIC8vIG5ldyBmcmFjdGlvbmFsIHN0YXJ0CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gd3JrLT5meHlfc2NhbGU7CisgICAgY29uc3QgX19tMTI4aSBtdWx0ID0gX21tX3NldF9lcGkzMigwLCBzY2FsZSwgMCwgc2NhbGUpOworICAgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgZm9yICh4X291dCA9IDA7IHhfb3V0ICsgOCA8PSB4X291dF9tYXg7IHhfb3V0ICs9IDgpIHsKKyAgICAgIF9fbTEyOGkgQTAsIEExLCBBMiwgQTM7CisgICAgICBMb2FkRGlzcGF0Y2hBbmRNdWx0X1NTRTIoaXJvdyArIHhfb3V0LCBOVUxMLCAmQTAsICZBMSwgJkEyLCAmQTMpOworICAgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGlyb3cgKyB4X291dCArIDApLCB6ZXJvKTsKKyAgICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShpcm93ICsgeF9vdXQgKyA0KSwgemVybyk7CisgICAgICBQcm9jZXNzUm93X1NTRTIoJkEwLCAmQTEsICZBMiwgJkEzLCAmbXVsdCwgZHN0ICsgeF9vdXQpOworICAgIH0KKyAgICBmb3IgKDsgeF9vdXQgPCB4X291dF9tYXg7ICsreF9vdXQpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gKGludClNVUxUX0ZJWChpcm93W3hfb3V0XSwgc2NhbGUpOworICAgICAgYXNzZXJ0KHYgPj0gMCAmJiB2IDw9IDI1NSk7CisgICAgICBkc3RbeF9vdXRdID0gdjsKKyAgICAgIGlyb3dbeF9vdXRdID0gMDsKKyAgICB9CisgIH0KK30KKworI3VuZGVmIE1VTFRfRklYCisjdW5kZWYgUk9VTkRFUgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQUmVzY2FsZXJEc3BJbml0U1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBSZXNjYWxlckRzcEluaXRTU0UyKHZvaWQpIHsKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93RXhwYW5kID0gUmVzY2FsZXJJbXBvcnRSb3dFeHBhbmRfU1NFMjsKKyAgV2ViUFJlc2NhbGVySW1wb3J0Um93U2hyaW5rID0gUmVzY2FsZXJJbXBvcnRSb3dTaHJpbmtfU1NFMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93RXhwYW5kID0gUmVzY2FsZXJFeHBvcnRSb3dFeHBhbmRfU1NFMjsKKyAgV2ViUFJlc2NhbGVyRXhwb3J0Um93U2hyaW5rID0gUmVzY2FsZXJFeHBvcnRSb3dTaHJpbmtfU1NFMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQUmVzY2FsZXJEc3BJbml0U1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW0uYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OWNlODIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3NzaW0uYwpAQCAtMCwwICsxLDE1OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGRpc3RvcnRpb24gY2FsY3VsYXRpb24KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NJTSAvIFBTTlIKKworLy8gaGF0LXNoYXBlZCBmaWx0ZXIuIFN1bSBvZiBjb2VmZmljaWVudHMgaXMgZXF1YWwgdG8gMTYuCitzdGF0aWMgY29uc3QgdWludDMyX3Qga1dlaWdodFsyICogVlA4X1NTSU1fS0VSTkVMICsgMV0gPSB7CisgIDEsIDIsIDMsIDQsIDMsIDIsIDEKK307CitzdGF0aWMgY29uc3QgdWludDMyX3Qga1dlaWdodFN1bSA9IDE2ICogMTY7ICAgLy8gc3Vte2tXZWlnaHR9XjIKKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBTU0lNQ2FsY3VsYXRpb24oCisgICAgY29uc3QgVlA4RGlzdG9TdGF0cyogY29uc3Qgc3RhdHMsIHVpbnQzMl90IE4gIC8qbnVtIHNhbXBsZXMqLykgeworICBjb25zdCB1aW50MzJfdCB3MiA9ICBOICogTjsKKyAgY29uc3QgdWludDMyX3QgQzEgPSAyMCAqIHcyOworICBjb25zdCB1aW50MzJfdCBDMiA9IDYwICogdzI7CisgIGNvbnN0IHVpbnQzMl90IEMzID0gOCAqIDggKiB3MjsgICAvLyAnZGFyaycgbGltaXQgfj0gNgorICBjb25zdCB1aW50NjRfdCB4bXhtID0gKHVpbnQ2NF90KXN0YXRzLT54bSAqIHN0YXRzLT54bTsKKyAgY29uc3QgdWludDY0X3QgeW15bSA9ICh1aW50NjRfdClzdGF0cy0+eW0gKiBzdGF0cy0+eW07CisgIGlmICh4bXhtICsgeW15bSA+PSBDMykgeworICAgIGNvbnN0IGludDY0X3QgeG15bSA9IChpbnQ2NF90KXN0YXRzLT54bSAqIHN0YXRzLT55bTsKKyAgICBjb25zdCBpbnQ2NF90IHN4eSA9IChpbnQ2NF90KXN0YXRzLT54eW0gKiBOIC0geG15bTsgICAgLy8gY2FuIGJlIG5lZ2F0aXZlCisgICAgY29uc3QgdWludDY0X3Qgc3h4ID0gKHVpbnQ2NF90KXN0YXRzLT54eG0gKiBOIC0geG14bTsKKyAgICBjb25zdCB1aW50NjRfdCBzeXkgPSAodWludDY0X3Qpc3RhdHMtPnl5bSAqIE4gLSB5bXltOworICAgIC8vIHdlIGRlc2NhbGUgYnkgOCB0byBwcmV2ZW50IG92ZXJmbG93IGR1cmluZyB0aGUgZm51bS9mZGVuIG11bHRpcGx5LgorICAgIGNvbnN0IHVpbnQ2NF90IG51bV9TID0gKDIgKiAodWludDY0X3QpKHN4eSA8IDAgPyAwIDogc3h5KSArIEMyKSA+PiA4OworICAgIGNvbnN0IHVpbnQ2NF90IGRlbl9TID0gKHN4eCArIHN5eSArIEMyKSA+PiA4OworICAgIGNvbnN0IHVpbnQ2NF90IGZudW0gPSAoMiAqIHhteW0gKyBDMSkgKiBudW1fUzsKKyAgICBjb25zdCB1aW50NjRfdCBmZGVuID0gKHhteG0gKyB5bXltICsgQzEpICogZGVuX1M7CisgICAgY29uc3QgZG91YmxlIHIgPSAoZG91YmxlKWZudW0gLyBmZGVuOworICAgIGFzc2VydChyID49IDAuICYmIHIgPD0gMS4wKTsKKyAgICByZXR1cm4gcjsKKyAgfQorICByZXR1cm4gMS47ICAgLy8gYXJlYSBpcyB0b28gZGFyayB0byBjb250cmlidXRlIG1lYW5pbmdmdWxseQorfQorCitkb3VibGUgVlA4U1NJTUZyb21TdGF0cyhjb25zdCBWUDhEaXN0b1N0YXRzKiBjb25zdCBzdGF0cykgeworICByZXR1cm4gU1NJTUNhbGN1bGF0aW9uKHN0YXRzLCBrV2VpZ2h0U3VtKTsKK30KKworZG91YmxlIFZQOFNTSU1Gcm9tU3RhdHNDbGlwcGVkKGNvbnN0IFZQOERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKSB7CisgIHJldHVybiBTU0lNQ2FsY3VsYXRpb24oc3RhdHMsIHN0YXRzLT53KTsKK30KKworc3RhdGljIGRvdWJsZSBTU0lNR2V0Q2xpcHBlZF9DKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBzdHJpZGUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4bywgaW50IHlvLCBpbnQgVywgaW50IEgpIHsKKyAgVlA4RGlzdG9TdGF0cyBzdGF0cyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICBjb25zdCBpbnQgeW1pbiA9ICh5byAtIFZQOF9TU0lNX0tFUk5FTCA8IDApID8gMCA6IHlvIC0gVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgeW1heCA9ICh5byArIFZQOF9TU0lNX0tFUk5FTCA+IEggLSAxKSA/IEggLSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeW8gKyBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWluID0gKHhvIC0gVlA4X1NTSU1fS0VSTkVMIDwgMCkgPyAwIDogeG8gLSBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB4bWF4ID0gKHhvICsgVlA4X1NTSU1fS0VSTkVMID4gVyAtIDEpID8gVyAtIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB4byArIFZQOF9TU0lNX0tFUk5FTDsKKyAgaW50IHgsIHk7CisgIHNyYzEgKz0geW1pbiAqIHN0cmlkZTE7CisgIHNyYzIgKz0geW1pbiAqIHN0cmlkZTI7CisgIGZvciAoeSA9IHltaW47IHkgPD0geW1heDsgKyt5LCBzcmMxICs9IHN0cmlkZTEsIHNyYzIgKz0gc3RyaWRlMikgeworICAgIGZvciAoeCA9IHhtaW47IHggPD0geG1heDsgKyt4KSB7CisgICAgICBjb25zdCB1aW50MzJfdCB3ID0ga1dlaWdodFtWUDhfU1NJTV9LRVJORUwgKyB4IC0geG9dCisgICAgICAgICAgICAgICAgICAgICAgICoga1dlaWdodFtWUDhfU1NJTV9LRVJORUwgKyB5IC0geW9dOworICAgICAgY29uc3QgdWludDMyX3QgczEgPSBzcmMxW3hdOworICAgICAgY29uc3QgdWludDMyX3QgczIgPSBzcmMyW3hdOworICAgICAgc3RhdHMudyAgICs9IHc7CisgICAgICBzdGF0cy54bSAgKz0gdyAqIHMxOworICAgICAgc3RhdHMueW0gICs9IHcgKiBzMjsKKyAgICAgIHN0YXRzLnh4bSArPSB3ICogczEgKiBzMTsKKyAgICAgIHN0YXRzLnh5bSArPSB3ICogczEgKiBzMjsKKyAgICAgIHN0YXRzLnl5bSArPSB3ICogczIgKiBzMjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFZQOFNTSU1Gcm9tU3RhdHNDbGlwcGVkKCZzdGF0cyk7Cit9CisKK3N0YXRpYyBkb3VibGUgU1NJTUdldF9DKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIpIHsKKyAgVlA4RGlzdG9TdGF0cyBzdGF0cyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OworICBpbnQgeCwgeTsKKyAgZm9yICh5ID0gMDsgeSA8PSAyICogVlA4X1NTSU1fS0VSTkVMOyArK3ksIHNyYzEgKz0gc3RyaWRlMSwgc3JjMiArPSBzdHJpZGUyKSB7CisgICAgZm9yICh4ID0gMDsgeCA8PSAyICogVlA4X1NTSU1fS0VSTkVMOyArK3gpIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHcgPSBrV2VpZ2h0W3hdICoga1dlaWdodFt5XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMxID0gc3JjMVt4XTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHMyID0gc3JjMlt4XTsKKyAgICAgIHN0YXRzLnhtICArPSB3ICogczE7CisgICAgICBzdGF0cy55bSAgKz0gdyAqIHMyOworICAgICAgc3RhdHMueHhtICs9IHcgKiBzMSAqIHMxOworICAgICAgc3RhdHMueHltICs9IHcgKiBzMSAqIHMyOworICAgICAgc3RhdHMueXltICs9IHcgKiBzMiAqIHMyOworICAgIH0KKyAgfQorICByZXR1cm4gVlA4U1NJTUZyb21TdGF0cygmc3RhdHMpOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCitzdGF0aWMgdWludDMyX3QgQWNjdW11bGF0ZVNTRV9DKGNvbnN0IHVpbnQ4X3QqIHNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYzIsIGludCBsZW4pIHsKKyAgaW50IGk7CisgIHVpbnQzMl90IHNzZTIgPSAwOworICBhc3NlcnQobGVuIDw9IDY1NTM1KTsgIC8vIHRvIGVuc3VyZSB0aGF0IGFjY3VtdWxhdGlvbiBmaXRzIHdpdGhpbiB1aW50MzJfdAorICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQzMl90IGRpZmYgPSBzcmMxW2ldIC0gc3JjMltpXTsKKyAgICBzc2UyICs9IGRpZmYgKiBkaWZmOworICB9CisgIHJldHVybiBzc2UyOworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorVlA4U1NJTUdldEZ1bmMgVlA4U1NJTUdldDsKK1ZQOFNTSU1HZXRDbGlwcGVkRnVuYyBWUDhTU0lNR2V0Q2xpcHBlZDsKKyNlbmRpZgorI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK1ZQOEFjY3VtdWxhdGVTU0VGdW5jIFZQOEFjY3VtdWxhdGVTU0U7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgVlA4U1NJTURzcEluaXRTU0UyKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoVlA4U1NJTURzcEluaXQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICBWUDhTU0lNR2V0Q2xpcHBlZCA9IFNTSU1HZXRDbGlwcGVkX0M7CisgIFZQOFNTSU1HZXQgPSBTU0lNR2V0X0M7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgVlA4QWNjdW11bGF0ZVNTRSA9IEFjY3VtdWxhdGVTU0VfQzsKKyNlbmRpZgorCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBWUDhTU0lNRHNwSW5pdFNTRTIoKTsKKyAgICB9CisjZW5kaWYKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC9zc2ltX3NzZTIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbV9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjYjBlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3Avc3NpbV9zc2UyLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0UyIHZlcnNpb24gb2YgZGlzdG9ydGlvbiBjYWxjdWxhdGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisKKy8vIEhlbHBlciBmdW5jdGlvbgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgU3VidHJhY3RBbmRTcXVhcmVfU1NFMihjb25zdCBfX20xMjhpIGEsIGNvbnN0IF9fbTEyOGkgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgc3VtKSB7CisgIC8vIHRha2UgYWJzKGEtYikgaW4gOGIKKyAgY29uc3QgX19tMTI4aSBhX2IgPSBfbW1fc3Vic19lcHU4KGEsIGIpOworICBjb25zdCBfX20xMjhpIGJfYSA9IF9tbV9zdWJzX2VwdTgoYiwgYSk7CisgIGNvbnN0IF9fbTEyOGkgYWJzX2FfYiA9IF9tbV9vcl9zaTEyOChhX2IsIGJfYSk7CisgIC8vIHplcm8tZXh0ZW5kIHRvIDE2YgorICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIEMwID0gX21tX3VucGFja2xvX2VwaTgoYWJzX2FfYiwgemVybyk7CisgIGNvbnN0IF9fbTEyOGkgQzEgPSBfbW1fdW5wYWNraGlfZXBpOChhYnNfYV9iLCB6ZXJvKTsKKyAgLy8gbXVsdGlwbHkgd2l0aCBzZWxmCisgIGNvbnN0IF9fbTEyOGkgc3VtMSA9IF9tbV9tYWRkX2VwaTE2KEMwLCBDMCk7CisgIGNvbnN0IF9fbTEyOGkgc3VtMiA9IF9tbV9tYWRkX2VwaTE2KEMxLCBDMSk7CisgICpzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bTEsIHN1bTIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NJTSAvIFBTTlIgZW50cnkgcG9pbnQKKworc3RhdGljIHVpbnQzMl90IEFjY3VtdWxhdGVTU0VfU1NFMihjb25zdCB1aW50OF90KiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgbGVuKSB7CisgIGludCBpID0gMDsKKyAgdWludDMyX3Qgc3NlMiA9IDA7CisgIGlmIChsZW4gPj0gMTYpIHsKKyAgICBjb25zdCBpbnQgbGltaXQgPSBsZW4gLSAzMjsKKyAgICBpbnQzMl90IHRtcFs0XTsKKyAgICBfX20xMjhpIHN1bTE7CisgICAgX19tMTI4aSBzdW0gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgIF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMxW2ldKTsKKyAgICBfX20xMjhpIGIwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmc3JjMltpXSk7CisgICAgaSArPSAxNjsKKyAgICB3aGlsZSAoaSA8PSBsaW1pdCkgeworICAgICAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzFbaV0pOworICAgICAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzJbaV0pOworICAgICAgX19tMTI4aSBzdW0yOworICAgICAgaSArPSAxNjsKKyAgICAgIFN1YnRyYWN0QW5kU3F1YXJlX1NTRTIoYTAsIGIwLCAmc3VtMSk7CisgICAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgc3VtMSk7CisgICAgICBhMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJnNyYzFbaV0pOworICAgICAgYjAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSZzcmMyW2ldKTsKKyAgICAgIGkgKz0gMTY7CisgICAgICBTdWJ0cmFjdEFuZFNxdWFyZV9TU0UyKGExLCBiMSwgJnN1bTIpOworICAgICAgc3VtID0gX21tX2FkZF9lcGkzMihzdW0sIHN1bTIpOworICAgIH0KKyAgICBTdWJ0cmFjdEFuZFNxdWFyZV9TU0UyKGEwLCBiMCwgJnN1bTEpOworICAgIHN1bSA9IF9tbV9hZGRfZXBpMzIoc3VtLCBzdW0xKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIHN1bSk7CisgICAgc3NlMiArPSAodG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdKTsKKyAgfQorCisgIGZvciAoOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQzMl90IGRpZmYgPSBzcmMxW2ldIC0gc3JjMltpXTsKKyAgICBzc2UyICs9IGRpZmYgKiBkaWZmOworICB9CisgIHJldHVybiBzc2UyOworfQorI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCitzdGF0aWMgdWludDMyX3QgSG9yaXpvbnRhbEFkZDE2Yl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IG0pIHsKKyAgdWludDE2X3QgdG1wWzhdOworICBjb25zdCBfX20xMjhpIGEgPSBfbW1fc3JsaV9zaTEyOCgqbSwgOCk7CisgIGNvbnN0IF9fbTEyOGkgYiA9IF9tbV9hZGRfZXBpMTYoKm0sIGEpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKil0bXAsIGIpOworICByZXR1cm4gKHVpbnQzMl90KXRtcFszXSArIHRtcFsyXSArIHRtcFsxXSArIHRtcFswXTsKK30KKworc3RhdGljIHVpbnQzMl90IEhvcml6b250YWxBZGQzMmJfU1NFMihjb25zdCBfX20xMjhpKiBjb25zdCBtKSB7CisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9zcmxpX3NpMTI4KCptLCA4KTsKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX2FkZF9lcGkzMigqbSwgYSk7CisgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9hZGRfZXBpMzIoYiwgX21tX3NybGlfc2kxMjgoYiwgNCkpOworICByZXR1cm4gKHVpbnQzMl90KV9tbV9jdnRzaTEyOF9zaTMyKGMpOworfQorCitzdGF0aWMgY29uc3QgdWludDE2X3Qga1dlaWdodFtdID0geyAxLCAyLCAzLCA0LCAzLCAyLCAxLCAwIH07CisKKyNkZWZpbmUgQUNDVU1VTEFURV9ST1coV0VJR0hUKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogY29tcHV0ZSByb3cgd2VpZ2h0IChXeCAqIFd5KSAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBXeSA9IF9tbV9zZXQxX2VwaTE2KChXRUlHSFQpKTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBXID0gX21tX211bGxvX2VwaTE2KFd4LCBXeSk7ICAgICAgICAgICAgICAgIFwKKyAgLyogcHJvY2VzcyA4IGJ5dGVzIGF0IGEgdGltZSAoNyBieXRlcywgYWN0dWFsbHkpICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopc3JjMSk7IFwKKyAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkbF9lcGk2NCgoY29uc3QgX19tMTI4aSopc3JjMik7IFwKKyAgLyogY29udmVydCB0byAxNmIgYW5kIG11bHRpcGx5IGJ5IHdlaWdodCAqLyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBhMSA9IF9tbV91bnBhY2tsb19lcGk4KGEwLCB6ZXJvKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV91bnBhY2tsb19lcGk4KGIwLCB6ZXJvKTsgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB3YTEgPSBfbW1fbXVsbG9fZXBpMTYoYTEsIFcpOyAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB3YjEgPSBfbW1fbXVsbG9fZXBpMTYoYjEsIFcpOyAgICAgICAgICAgICAgIFwKKyAgLyogYWNjdW11bGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeG0gID0gX21tX2FkZF9lcGkxNih4bSwgd2ExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeW0gID0gX21tX2FkZF9lcGkxNih5bSwgd2IxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeHhtID0gX21tX2FkZF9lcGkzMih4eG0sIF9tbV9tYWRkX2VwaTE2KGExLCB3YTEpKTsgICAgICAgIFwKKyAgeHltID0gX21tX2FkZF9lcGkzMih4eW0sIF9tbV9tYWRkX2VwaTE2KGExLCB3YjEpKTsgICAgICAgIFwKKyAgeXltID0gX21tX2FkZF9lcGkzMih5eW0sIF9tbV9tYWRkX2VwaTE2KGIxLCB3YjEpKTsgICAgICAgIFwKKyAgc3JjMSArPSBzdHJpZGUxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3JjMiArPSBzdHJpZGUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBkb3VibGUgU1NJTUdldF9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYzEsIGludCBzdHJpZGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjMiwgaW50IHN0cmlkZTIpIHsKKyAgVlA4RGlzdG9TdGF0cyBzdGF0czsKKyAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgX19tMTI4aSB4bSA9IHplcm8sIHltID0gemVybzsgICAgICAgICAgICAgICAgLy8gMTZiIGFjY3VtcworICBfX20xMjhpIHh4bSA9IHplcm8sIHl5bSA9IHplcm8sIHh5bSA9IHplcm87ICAvLyAzMmIgYWNjdW0KKyAgY29uc3QgX19tMTI4aSBXeCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopa1dlaWdodCk7CisgIGFzc2VydCgyICogVlA4X1NTSU1fS0VSTkVMICsgMSA9PSA3KTsKKyAgQUNDVU1VTEFURV9ST1coMSk7CisgIEFDQ1VNVUxBVEVfUk9XKDIpOworICBBQ0NVTVVMQVRFX1JPVygzKTsKKyAgQUNDVU1VTEFURV9ST1coNCk7CisgIEFDQ1VNVUxBVEVfUk9XKDMpOworICBBQ0NVTVVMQVRFX1JPVygyKTsKKyAgQUNDVU1VTEFURV9ST1coMSk7CisgIHN0YXRzLnhtICA9IEhvcml6b250YWxBZGQxNmJfU1NFMigmeG0pOworICBzdGF0cy55bSAgPSBIb3Jpem9udGFsQWRkMTZiX1NTRTIoJnltKTsKKyAgc3RhdHMueHhtID0gSG9yaXpvbnRhbEFkZDMyYl9TU0UyKCZ4eG0pOworICBzdGF0cy54eW0gPSBIb3Jpem9udGFsQWRkMzJiX1NTRTIoJnh5bSk7CisgIHN0YXRzLnl5bSA9IEhvcml6b250YWxBZGQzMmJfU1NFMigmeXltKTsKKyAgcmV0dXJuIFZQOFNTSU1Gcm9tU3RhdHMoJnN0YXRzKTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCitleHRlcm4gdm9pZCBWUDhTU0lNRHNwSW5pdFNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBWUDhTU0lNRHNwSW5pdFNTRTIodm9pZCkgeworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgVlA4QWNjdW11bGF0ZVNTRSA9IEFjY3VtdWxhdGVTU0VfU1NFMjsKKyNlbmRpZgorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIFZQOFNTSU1HZXQgPSBTU0lNR2V0X1NTRTI7CisjZW5kaWYKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0UyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihWUDhTU0lNRHNwSW5pdFNTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjYwZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogc29tbmF0aEBnb29nbGUuY29tIChTb21uYXRoIEJhbmVyamVlKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYW5jeSB1cHNhbXBsZXIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworLy8gRmFuY3kgdXBzYW1wbGluZyBmdW5jdGlvbnMgdG8gY29udmVydCBZVVYgdG8gUkdCCitXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbTU9ERV9MQVNUXTsKKworLy8gR2l2ZW4gc2FtcGxlcyBsYWlkIG91dCBpbiBhIHNxdWFyZSBhczoKKy8vICBbYSBiXQorLy8gIFtjIGRdCisvLyB3ZSBpbnRlcnBvbGF0ZSB1L3YgYXM6CisvLyAgKFs5KmEgKyAzKmIgKyAzKmMgKyAgIGQgICAgMyphICsgOSpiICsgMypjICsgICBkXSArIFs4IDhdKSAvIDE2CisvLyAgKFszKmEgKyAgIGIgKyA5KmMgKyAzKmQgICAgICBhICsgMypiICsgMypjICsgOSpkXSAgIFs4IDhdKSAvIDE2CisKKy8vIFdlIHByb2Nlc3MgdSBhbmQgdiB0b2dldGhlciBzdGFzaGVkIGludG8gMzJiaXQgKDE2Yml0IGVhY2gpLgorI2RlZmluZSBMT0FEX1VWKHUsIHYpICgodSkgfCAoKHYpIDw8IDE2KSkKKworI2RlZmluZSBVUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGFzdF9waXhlbF9wYWlyID0gKGxlbiAtIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgdGxfdXYgPSBMT0FEX1VWKHRvcF91WzBdLCB0b3BfdlswXSk7ICAgLyogdG9wLWxlZnQgc2FtcGxlICovICAgICAgICBcCisgIHVpbnQzMl90IGxfdXYgID0gTE9BRF9VVihjdXJfdVswXSwgY3VyX3ZbMF0pOyAgIC8qIGxlZnQtc2FtcGxlICovICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX3kgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKGJvdHRvbV95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHggPSAxOyB4IDw9IGxhc3RfcGl4ZWxfcGFpcjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB0X3V2ID0gTE9BRF9VVih0b3BfdVt4XSwgdG9wX3ZbeF0pOyAgLyogdG9wIHNhbXBsZSAqLyAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYgICA9IExPQURfVVYoY3VyX3VbeF0sIGN1cl92W3hdKTsgIC8qIHNhbXBsZSAqLyAgICAgICAgICAgXAorICAgIC8qIHByZWNvbXB1dGUgaW52YXJpYW50IHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZmlyc3QgYW5kIHNlY29uZCBkaWFnb25hbHMqL1wKKyAgICBjb25zdCB1aW50MzJfdCBhdmcgPSB0bF91diArIHRfdXYgKyBsX3V2ICsgdXYgKyAweDAwMDgwMDA4dTsgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18xMiA9IChhdmcgKyAyICogKHRfdXYgKyBsX3V2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGRpYWdfMDMgPSAoYXZnICsgMiAqICh0bF91diArIHV2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoZGlhZ18xMiArIHRsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYxID0gKGRpYWdfMDMgKyB0X3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAoMiAqIHggLSAxKSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDApICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzAzICsgbF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18xMiArIHV2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArICgyICogeCAtIDEpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4ICsgMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4ICsgMCkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGxfdXYgPSB0X3V2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxfdXYgPSB1djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGxlbiAmIDEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95W2xlbiAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKGxlbiAtIDEpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAobGVuIC0gMSkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KKyNpZiAhV0VCUF9ORU9OX09NSVRfQ19DT0RFCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyX0MsIFZQOFl1dlRvUmdiYSwgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXJfQywgVlA4WXV2VG9CZ3JhLCA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXJfQywgVlA4WXV2VG9BcmdiLCA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyX0MsICBWUDhZdXZUb1JnYiwgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXJfQywgIFZQOFl1dlRvQmdyLCAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX0MsIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfQywgIFZQOFl1dlRvUmdiNTY1LCAgMikKKyNlbHNlCitzdGF0aWMgdm9pZCBFbXB0eVVwc2FtcGxlRnVuYyhjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjdXJfdSwgY29uc3QgdWludDhfdCogY3VyX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7CisgICh2b2lkKXRvcF95OworICAodm9pZClib3R0b21feTsKKyAgKHZvaWQpdG9wX3U7CisgICh2b2lkKXRvcF92OworICAodm9pZCljdXJfdTsKKyAgKHZvaWQpY3VyX3Y7CisgICh2b2lkKXRvcF9kc3Q7CisgICh2b2lkKWJvdHRvbV9kc3Q7CisgICh2b2lkKWxlbjsKKyAgYXNzZXJ0KDApOyAgIC8vIENPTE9SU1BBQ0UgU1VQUE9SVCBOT1QgQ09NUElMRUQKK30KKyNkZWZpbmUgVXBzYW1wbGVBcmdiTGluZVBhaXJfQyBFbXB0eVVwc2FtcGxlRnVuYworI2RlZmluZSBVcHNhbXBsZVJnYkxpbmVQYWlyX0MgRW1wdHlVcHNhbXBsZUZ1bmMKKyNkZWZpbmUgVXBzYW1wbGVCZ3JMaW5lUGFpcl9DIEVtcHR5VXBzYW1wbGVGdW5jCisjZGVmaW5lIFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9DIEVtcHR5VXBzYW1wbGVGdW5jCisjZGVmaW5lIFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfQyBFbXB0eVVwc2FtcGxlRnVuYworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyNlbmRpZgorCisjdW5kZWYgTE9BRF9VVgorI3VuZGVmIFVQU0FNUExFX0ZVTkMKKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiAhZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKQorI2RlZmluZSBEVUFMX1NBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90X3ksICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJvdF91LCBjb25zdCB1aW50OF90KiBib3RfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3RfZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICBcCisgIGNvbnN0IGludCBoYWxmX2xlbiA9IGxlbiA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF9kc3QgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciAoeCA9IDA7IHggPCBoYWxmX2xlbjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggKyAwXSwgdG9wX3VbeF0sIHRvcF92W3hdLCB0b3BfZHN0ICsgOCAqIHggKyAwKTsgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95WzIgKiB4ICsgMV0sIHRvcF91W3hdLCB0b3Bfdlt4XSwgdG9wX2RzdCArIDggKiB4ICsgNCk7ICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobGVuICYgMSkgRlVOQyh0b3BfeVsyICogeCArIDBdLCB0b3BfdVt4XSwgdG9wX3ZbeF0sIHRvcF9kc3QgKyA4ICogeCk7ICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90X2RzdCAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IgKHggPSAwOyB4IDwgaGFsZl9sZW47ICsreCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdF95WzIgKiB4ICsgMF0sIGJvdF91W3hdLCBib3Rfdlt4XSwgYm90X2RzdCArIDggKiB4ICsgMCk7ICAgICAgICAgXAorICAgICAgRlVOQyhib3RfeVsyICogeCArIDFdLCBib3RfdVt4XSwgYm90X3ZbeF0sIGJvdF9kc3QgKyA4ICogeCArIDQpOyAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGxlbiAmIDEpIEZVTkMoYm90X3lbMiAqIHggKyAwXSwgYm90X3VbeF0sIGJvdF92W3hdLCBib3RfZHN0ICsgOCAqIHgpOyAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworRFVBTF9TQU1QTEVfRlVOQyhEdWFsTGluZVNhbXBsZXJCR1JBLCBWUDhZdXZUb0JncmEpCitEVUFMX1NBTVBMRV9GVU5DKER1YWxMaW5lU2FtcGxlckFSR0IsIFZQOFl1dlRvQXJnYikKKyN1bmRlZiBEVUFMX1NBTVBMRV9GVU5DCisKKyNlbmRpZiAgLy8gIUZBTkNZX1VQU0FNUExJTkcKKworV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBHZXRMaW5lUGFpckNvbnZlcnRlcihpbnQgYWxwaGFfaXNfbGFzdCkgeworICBXZWJQSW5pdFVwc2FtcGxlcnMoKTsKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisgIHJldHVybiBXZWJQVXBzYW1wbGVyc1thbHBoYV9pc19sYXN0ID8gTU9ERV9CR1JBIDogTU9ERV9BUkdCXTsKKyNlbHNlCisgIHJldHVybiAoYWxwaGFfaXNfbGFzdCA/IER1YWxMaW5lU2FtcGxlckJHUkEgOiBEdWFsTGluZVNhbXBsZXJBUkdCKTsKKyNlbmRpZgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWVVWNDQ0IGNvbnZlcnRlcgorCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZXh0ZXJuIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgRlVOQyh5W2ldLCB1W2ldLCB2W2ldLCAmZHN0W2kgKiAoWFNURVApXSk7ICAgICAgICAgXAorfQorCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9SZ2JhX0MsICAgICBWUDhZdXZUb1JnYmEsIDQpCitZVVY0NDRfRlVOQyhXZWJQWXV2NDQ0VG9CZ3JhX0MsICAgICBWUDhZdXZUb0JncmEsIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvUmdiX0MsICAgICAgVlA4WXV2VG9SZ2IsICAzKQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvQmdyX0MsICAgICAgVlA4WXV2VG9CZ3IsICAzKQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvQXJnYl9DLCAgICAgVlA4WXV2VG9BcmdiLCA0KQorWVVWNDQ0X0ZVTkMoV2ViUFl1djQ0NFRvUmdiYTQ0NDRfQywgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1lVVjQ0NF9GVU5DKFdlYlBZdXY0NDRUb1JnYjU2NV9DLCAgIFZQOFl1dlRvUmdiNTY1LCAyKQorI2Vsc2UKK3N0YXRpYyB2b2lkIEVtcHR5WXV2NDQ0RnVuYyhjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgICh2b2lkKXk7CisgICh2b2lkKXU7CisgICh2b2lkKXY7CisgICh2b2lkKWRzdDsKKyAgKHZvaWQpbGVuOworfQorI2RlZmluZSBXZWJQWXV2NDQ0VG9SZ2JfQyBFbXB0eVl1djQ0NEZ1bmMKKyNkZWZpbmUgV2ViUFl1djQ0NFRvQmdyX0MgRW1wdHlZdXY0NDRGdW5jCisjZGVmaW5lIFdlYlBZdXY0NDRUb0FyZ2JfQyBFbXB0eVl1djQ0NEZ1bmMKKyNkZWZpbmUgV2ViUFl1djQ0NFRvUmdiYTQ0NDRfQyBFbXB0eVl1djQ0NEZ1bmMKKyNkZWZpbmUgV2ViUFl1djQ0NFRvUmdiNTY1X0MgRW1wdHlZdXY0NDRGdW5jCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIFlVVjQ0NF9GVU5DCisKK1dlYlBZVVY0NDRDb252ZXJ0ZXIgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9MQVNUXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTQxKHZvaWQpOworCitXRUJQX0RTUF9JTklUX0ZVTkMoV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzKSB7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV0gICAgICA9IFdlYlBZdXY0NDRUb1JnYmFfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JBXSAgICAgID0gV2ViUFl1djQ0NFRvQmdyYV9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl0gICAgICAgPSBXZWJQWXV2NDQ0VG9SZ2JfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JdICAgICAgID0gV2ViUFl1djQ0NFRvQmdyX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQVJHQl0gICAgICA9IFdlYlBZdXY0NDRUb0FyZ2JfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXzQ0NDRdID0gV2ViUFl1djQ0NFRvUmdiYTQ0NDRfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JfNTY1XSAgID0gV2ViUFl1djQ0NFRvUmdiNTY1X0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV0gICAgICA9IFdlYlBZdXY0NDRUb1JnYmFfQzsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9iZ3JBXSAgICAgID0gV2ViUFl1djQ0NFRvQmdyYV9DOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FyZ2JdICAgICAgPSBXZWJQWXV2NDQ0VG9BcmdiX0M7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV80NDQ0XSA9IFdlYlBZdXY0NDRUb1JnYmE0NDQ0X0M7CisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIoKTsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0U0XzEpKSB7CisgICAgICBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0U0MSgpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01JUFNkc3BSMikpIHsKKyAgICAgIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc01JUFNkc3BSMigpOworICAgIH0KKyNlbmRpZgorICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGxzCisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0U0MSh2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc05FT04odm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNSVBTZHNwUjIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNNU0Eodm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQSW5pdFVwc2FtcGxlcnMpIHsKKyNpZmRlZiBGQU5DWV9VUFNBTVBMSU5HCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9DOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgICAgICA9IFVwc2FtcGxlQmdyTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX0M7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfQzsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX0M7CisjZW5kaWYKKworICAvLyBJZiBkZWZpbmVkLCB1c2UgQ1BVSW5mbygpIHRvIG92ZXJ3cml0ZSBzb21lIHBvaW50ZXJzIHdpdGggZmFzdGVyIHZlcnNpb25zLgorICBpZiAoVlA4R2V0Q1BVSW5mbyAhPSBOVUxMKSB7CisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtTU0UyKSkgeworICAgICAgV2ViUEluaXRVcHNhbXBsZXJzU1NFMigpOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgIFdlYlBJbml0VXBzYW1wbGVyc1NTRTQxKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQU2RzcFIyKSkgeworICAgICAgV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NU0EpCisgICAgaWYgKFZQOEdldENQVUluZm8oa01TQSkpIHsKKyAgICAgIFdlYlBJbml0VXBzYW1wbGVyc01TQSgpOworICAgIH0KKyNlbmRpZgorICB9CisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX05FT04pCisgIGlmIChXRUJQX05FT05fT01JVF9DX0NPREUgfHwKKyAgICAgIChWUDhHZXRDUFVJbmZvICE9IE5VTEwgJiYgVlA4R2V0Q1BVSW5mbyhrTkVPTikpKSB7CisgICAgV2ViUEluaXRVcHNhbXBsZXJzTkVPTigpOworICB9CisjZW5kaWYKKworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAhPSBOVUxMKTsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApIHx8ICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gIT0gTlVMTCk7CisgIGFzc2VydChXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdICE9IE5VTEwpOworICBhc3NlcnQoV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSAhPSBOVUxMKTsKKyNlbmRpZgorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBkNDk5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19taXBzX2RzcF9yMi5jCkBAIC0wLDAgKzEsMjkxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6IEJyYW5pbWlyIFZhc2ljIChicmFuaW1pci52YXNpY0BpbWd0ZWMuY29tKQorLy8gICAgICAgICAgICBEam9yZGplIFBlc3V0ICAoZGpvcmRqZS5wZXN1dEBpbWd0ZWMuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQU19EU1BfUjIpCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjZGVmaW5lIFlVVl9UT19SR0IoWSwgVSwgViwgUiwgRywgQikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB0MSA9IE11bHRIaShZLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdDIgPSBNdWx0SGkoViwgMTMzMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IE11bHRIaShWLCAyNjE0OSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSBNdWx0SGkoVSwgNjQxOSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gTXVsdEhpKFUsIDMzMDUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IHQxICsgUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSB0MSAtIEc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gdDEgKyBCOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IFIgLSAxNDIzNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEcgPSBHIC0gdDIgKyA4NzA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBCID0gQiAtIDE3Njg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgInNobGxfcy53ICAgICAgICAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgIDE3ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzaGxsX3MudyAgICAgICAgICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAxNyAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic2hsbF9zLncgICAgICAgICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgMTcgICAgICAgICBcblx0IiAgICAgXAorICAgICAgInByZWNycXVfcy5xYi5waCAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgICR6ZXJvICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJwcmVjcnF1X3MucWIucGggICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAkemVybyAgICAgIFxuXHQiICAgICBcCisgICAgICAicHJlY3JxdV9zLnFiLnBoICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgJHplcm8gICAgICBcblx0IiAgICAgXAorICAgICAgInNybCAgICAgICAgICAgICAgJVsiICNSICJdLCAgICAgICVbIiAjUiAiXSwgICAgICAgIDI0ICAgICAgICAgXG5cdCIgICAgIFwKKyAgICAgICJzcmwgICAgICAgICAgICAgICVbIiAjRyAiXSwgICAgICAlWyIgI0cgIl0sICAgICAgICAyNCAgICAgICAgIFxuXHQiICAgICBcCisgICAgICAic3JsICAgICAgICAgICAgICAlWyIgI0IgIl0sICAgICAgJVsiICNCICJdLCAgICAgICAgMjQgICAgICAgICBcblx0IiAgICAgXAorICAgICAgOiBbUl0iK3IiKFIpLCBbR10iK3IiKEcpLCBbQl0iK3IiKEIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9IHdoaWxlICgwKQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9SZ2IoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgcmdiKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICByZ2JbMF0gPSByOworICByZ2JbMV0gPSBnOworICByZ2JbMl0gPSBiOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9CZ3IoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgYmdyKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICBiZ3JbMF0gPSBiOworICBiZ3JbMV0gPSBnOworICBiZ3JbMl0gPSByOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9SZ2I1NjUoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgcmdiKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICB7CisgICAgY29uc3QgaW50IHJnID0gKHIgJiAweGY4KSB8IChnID4+IDUpOworICAgIGNvbnN0IGludCBnYiA9ICgoZyA8PCAzKSAmIDB4ZTApIHwgKGIgPj4gMyk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICByZ2JbMF0gPSBnYjsKKyAgICByZ2JbMV0gPSByZzsKKyNlbHNlCisgICAgcmdiWzBdID0gcmc7CisgICAgcmdiWzFdID0gZ2I7CisjZW5kaWYKKyAgfQorfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9SZ2JhNDQ0NChpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGludCByLCBnLCBiOworICBZVVZfVE9fUkdCKHksIHUsIHYsIHIsIGcsIGIpOworICB7CisgICAgY29uc3QgaW50IHJnID0gKHIgJiAweGYwKSB8IChnID4+IDQpOworICAgIGNvbnN0IGludCBiYSA9IChiICYgMHhmMCkgfCAweDBmOyAgICAgLy8gb3ZlcndyaXRlIHRoZSBsb3dlciA0IGJpdHMKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIGFyZ2JbMF0gPSBiYTsKKyAgICBhcmdiWzFdID0gcmc7CisjZWxzZQorICAgIGFyZ2JbMF0gPSByZzsKKyAgICBhcmdiWzFdID0gYmE7CisjZW5kaWYKKyAgIH0KK30KKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbHBoYSBoYW5kbGluZyB2YXJpYW50cworCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9BcmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgYXJnYlswXSA9IDB4ZmY7CisgIGFyZ2JbMV0gPSByOworICBhcmdiWzJdID0gZzsKKyAgYXJnYlszXSA9IGI7Cit9CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFl1dlRvQmdyYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncmEpIHsKKyAgaW50IHIsIGcsIGI7CisgIFlVVl9UT19SR0IoeSwgdSwgdiwgciwgZywgYik7CisgIGJncmFbMF0gPSBiOworICBiZ3JhWzFdID0gZzsKKyAgYmdyYVsyXSA9IHI7CisgIGJncmFbM10gPSAweGZmOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgWXV2VG9SZ2JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSkgeworICBpbnQgciwgZywgYjsKKyAgWVVWX1RPX1JHQih5LCB1LCB2LCByLCBnLCBiKTsKKyAgcmdiYVswXSA9IHI7CisgIHJnYmFbMV0gPSBnOworICByZ2JhWzJdID0gYjsKKyAgcmdiYVszXSA9IDB4ZmY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGYW5jeSB1cHNhbXBsZXIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworLy8gR2l2ZW4gc2FtcGxlcyBsYWlkIG91dCBpbiBhIHNxdWFyZSBhczoKKy8vICBbYSBiXQorLy8gIFtjIGRdCisvLyB3ZSBpbnRlcnBvbGF0ZSB1L3YgYXM6CisvLyAgKFs5KmEgKyAzKmIgKyAzKmMgKyAgIGQgICAgMyphICsgOSpiICsgMypjICsgICBkXSArIFs4IDhdKSAvIDE2CisvLyAgKFszKmEgKyAgIGIgKyA5KmMgKyAzKmQgICAgICBhICsgMypiICsgMypjICsgOSpkXSAgIFs4IDhdKSAvIDE2CisKKy8vIFdlIHByb2Nlc3MgdSBhbmQgdiB0b2dldGhlciBzdGFzaGVkIGludG8gMzJiaXQgKDE2Yml0IGVhY2gpLgorI2RlZmluZSBMT0FEX1VWKHUsIHYpICgodSkgfCAoKHYpIDw8IDE2KSkKKworI2RlZmluZSBVUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90dG9tX3ksICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3R0b21fZHN0LCBpbnQgbGVuKSB7ICAgICAgICBcCisgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGFzdF9waXhlbF9wYWlyID0gKGxlbiAtIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgdGxfdXYgPSBMT0FEX1VWKHRvcF91WzBdLCB0b3BfdlswXSk7ICAgLyogdG9wLWxlZnQgc2FtcGxlICovICAgICAgICBcCisgIHVpbnQzMl90IGxfdXYgID0gTE9BRF9VVihjdXJfdVswXSwgY3VyX3ZbMF0pOyAgIC8qIGxlZnQtc2FtcGxlICovICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX3kgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiB0bF91diArIGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgICAgXAorICAgIEZVTkModG9wX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogbF91diArIHRsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKGJvdHRvbV95WzBdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgYm90dG9tX2RzdCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKHggPSAxOyB4IDw9IGxhc3RfcGl4ZWxfcGFpcjsgKyt4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB0X3V2ID0gTE9BRF9VVih0b3BfdVt4XSwgdG9wX3ZbeF0pOyAgLyogdG9wIHNhbXBsZSAqLyAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgdXYgICA9IExPQURfVVYoY3VyX3VbeF0sIGN1cl92W3hdKTsgIC8qIHNhbXBsZSAqLyAgICAgICAgICAgXAorICAgIC8qIHByZWNvbXB1dGUgaW52YXJpYW50IHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggZmlyc3QgYW5kIHNlY29uZCBkaWFnb25hbHMqL1wKKyAgICBjb25zdCB1aW50MzJfdCBhdmcgPSB0bF91diArIHRfdXYgKyBsX3V2ICsgdXYgKyAweDAwMDgwMDA4dTsgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgZGlhZ18xMiA9IChhdmcgKyAyICogKHRfdXYgKyBsX3V2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IGRpYWdfMDMgPSAoYXZnICsgMiAqICh0bF91diArIHV2KSkgPj4gMzsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djAgPSAoZGlhZ18xMiArIHRsX3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYxID0gKGRpYWdfMDMgKyB0X3V2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkModG9wX3lbMiAqIHggLSAxXSwgdXYwICYgMHhmZiwgKHV2MCA+PiAxNiksICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHRvcF9kc3QgKyAoMiAqIHggLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyh0b3BfeVsyICogeCAtIDBdLCB1djEgJiAweGZmLCAodXYxID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgdG9wX2RzdCArICgyICogeCAtIDApICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9IChkaWFnXzAzICsgbF91dikgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoZGlhZ18xMiArIHV2KSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgRlVOQyhib3R0b21feVsyICogeCAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgYm90dG9tX2RzdCArICgyICogeCAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzIgKiB4ICsgMF0sIHV2MSAmIDB4ZmYsICh1djEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3R0b21fZHN0ICsgKDIgKiB4ICsgMCkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGxfdXYgPSB0X3V2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxfdXYgPSB1djsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmICghKGxlbiAmIDEpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgICBcCisgICAgICBGVU5DKHRvcF95W2xlbiAtIDFdLCB1djAgJiAweGZmLCAodXYwID4+IDE2KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICB0b3BfZHN0ICsgKGxlbiAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgdXYwID0gKDMgKiBsX3V2ICsgdGxfdXYgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMoYm90dG9tX3lbbGVuIC0gMV0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGJvdHRvbV9kc3QgKyAobGVuIC0gMSkgKiBYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXIsICAgICBZdXZUb1JnYmEsICAgICA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpciwgICAgIFl1dlRvQmdyYSwgICAgIDQpCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyLCAgICAgIFl1dlRvUmdiLCAgICAgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXIsICAgICAgWXV2VG9CZ3IsICAgICAgMykKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXIsICAgICBZdXZUb0FyZ2IsICAgICA0KQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXIsIFl1dlRvUmdiYTQ0NDQsIDIpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiNTY1TGluZVBhaXIsICAgWXV2VG9SZ2I1NjUsICAgMikKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjdW5kZWYgTE9BRF9VVgorI3VuZGVmIFVQU0FNUExFX0ZVTkMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc01JUFNkc3BSMih2b2lkKSB7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gICAgICA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBVcHNhbXBsZUJncmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICAgICAgID0gVXBzYW1wbGVSZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gVXBzYW1wbGVCZ3JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKKyNlbmRpZiAgIC8vIFdFQlBfUkVEVUNFX0NTUAorfQorCisjZW5kaWYgIC8vIEZBTkNZX1VQU0FNUExJTkcKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVVjQ0NCBjb252ZXJ0ZXIKKworI2RlZmluZSBZVVY0NDRfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSBGVU5DKHlbaV0sIHVbaV0sIHZbaV0sICZkc3RbaSAqIFhTVEVQXSk7ICAgICAgICAgICBcCit9CisKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiYSwgICAgIFl1dlRvUmdiYSwgICAgIDQpCitZVVY0NDRfRlVOQyhZdXY0NDRUb0JncmEsICAgICBZdXZUb0JncmEsICAgICA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiLCAgICAgIFl1dlRvUmdiLCAgICAgIDMpCitZVVY0NDRfRlVOQyhZdXY0NDRUb0JnciwgICAgICBZdXZUb0JnciwgICAgICAzKQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9BcmdiLCAgICAgWXV2VG9BcmdiLCAgICAgNCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiYTQ0NDQsIFl1dlRvUmdiYTQ0NDQsIDIpCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYjU2NSwgICBZdXZUb1JnYjU2NSwgICAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBZVVY0NDRfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JBXSAgICAgID0gWXV2NDQ0VG9SZ2JhOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0JHUkFdICAgICAgPSBZdXY0NDRUb0JncmE7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV0gICAgICA9IFl1djQ0NFRvUmdiYTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9iZ3JBXSAgICAgID0gWXV2NDQ0VG9CZ3JhOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9SR0JdICAgICAgID0gWXV2NDQ0VG9SZ2I7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSXSAgICAgICA9IFl1djQ0NFRvQmdyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FSR0JdICAgICAgPSBZdXY0NDRUb0FyZ2I7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCQV80NDQ0XSA9IFl1djQ0NFRvUmdiYTQ0NDQ7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXzU2NV0gICA9IFl1djQ0NFRvUmdiNTY1OworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX0FyZ2JdICAgICAgPSBZdXY0NDRUb0FyZ2I7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV80NDQ0XSA9IFl1djQ0NFRvUmdiYTQ0NDQ7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzTUlQU2RzcFIyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFNfRFNQX1IyCisKKyNpZiAhKGRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykgJiYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRVcHNhbXBsZXJzTUlQU2RzcFIyKQorI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbXNhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDViZjRkYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19tc2EuYwpAQCAtMCwwICsxLDY5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1TQSB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBQcmFzaGFudCBQYXRpbCAocHJhc2hhbnQucGF0aWxAaW1ndGVjLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTVNBKQorCisjaW5jbHVkZSAic3JjL2RzcC9tc2FfbWFjcm8uaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisjZGVmaW5lIElMVlJfVVcyKGluLCBvdXQwLCBvdXQxKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgdDAgPSAodjhpMTYpX19tc2FfaWx2cl9iKCh2MTZpOCl6ZXJvLCAodjE2aTgpaW4pOyAgXAorICBvdXQwID0gKHY0dTMyKV9fbXNhX2lsdnJfaCgodjhpMTYpemVybywgdDApOyAgICAgICAgICAgICAgICAgICBcCisgIG91dDEgPSAodjR1MzIpX19tc2FfaWx2bF9oKCh2OGkxNil6ZXJvLCB0MCk7ICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgSUxWUkxfVVc0KGluLCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzKSBkbyB7ICBcCisgIHYxNnU4IHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQih6ZXJvLCBpbiwgdDAsIHQxKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgSUxWUkxfSDJfVVcoemVybywgdDAsIG91dDAsIG91dDEpOyAgICAgICAgICAgICAgICBcCisgIElMVlJMX0gyX1VXKHplcm8sIHQxLCBvdXQyLCBvdXQzKTsgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNVUxUSElfMTYoaW4wLCBpbjEsIGluMiwgaW4zLCBjbnN0LCBvdXQwLCBvdXQxKSBkbyB7ICAgXAorICBjb25zdCB2NGkzMiBjb25zdDAgPSAodjRpMzIpX19tc2FfZmlsbF93KGNuc3QgKiAyNTYpOyAgICAgICAgXAorICB2NHUzMiB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNVUw0KGluMCwgY29uc3QwLCBpbjEsIGNvbnN0MCwgaW4yLCBjb25zdDAsIGluMywgY29uc3QwLCAgICAgXAorICAgICAgIHRlbXAwLCB0ZW1wMSwgdGVtcDIsIHRlbXAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBQQ0tPRF9IMl9VSCh0ZW1wMSwgdGVtcDAsIHRlbXAzLCB0ZW1wMiwgb3V0MCwgb3V0MSk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNVUxUSElfOChpbjAsIGluMSwgY25zdCwgb3V0MCkgZG8geyAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2NGkzMiBjb25zdDAgPSAodjRpMzIpX19tc2FfZmlsbF93KGNuc3QgKiAyNTYpOyAgICAgXAorICB2NHUzMiB0ZW1wMCwgdGVtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNVUwyKGluMCwgY29uc3QwLCBpbjEsIGNvbnN0MCwgdGVtcDAsIHRlbXAxKTsgICAgICAgICAgICAgXAorICBvdXQwID0gKHY4dTE2KV9fbXNhX3Bja29kX2goKHY4aTE2KXRlbXAxLCAodjhpMTYpdGVtcDApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1IxNih5MCwgeTEsIHYwLCB2MSwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgY29uc3RfYSA9ICh2OGkxNilfX21zYV9maWxsX2goMTQyMzQpOyAgICAgICBcCisgIGNvbnN0IHY4aTE2IGEwID0gX19tc2FfYWRkc19zX2goKHY4aTE2KXkwLCAodjhpMTYpdjApOyAgXAorICBjb25zdCB2OGkxNiBhMSA9IF9fbXNhX2FkZHNfc19oKCh2OGkxNil5MSwgKHY4aTE2KXYxKTsgIFwKKyAgdjhpMTYgYjAgPSBfX21zYV9zdWJzX3NfaChhMCwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICBcCisgIHY4aTE2IGIxID0gX19tc2Ffc3Vic19zX2goYTEsIGNvbnN0X2EpOyAgICAgICAgICAgICAgICAgXAorICBTUkFJX0gyX1NIKGIwLCBiMSwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSDJfMF8yNTUoYjAsIGIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdCA9ICh2MTZ1OClfX21zYV9wY2tldl9iKCh2MTZpOCliMSwgKHYxNmk4KWIwKTsgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX1I4KHkwLCB2MCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgY29uc3RfYSA9ICh2OGkxNilfX21zYV9maWxsX2goMTQyMzQpOyAgICAgICBcCisgIGNvbnN0IHY4aTE2IGEwID0gX19tc2FfYWRkc19zX2goKHY4aTE2KXkwLCAodjhpMTYpdjApOyAgXAorICB2OGkxNiBiMCA9IF9fbXNhX3N1YnNfc19oKGEwLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgIFwKKyAgYjAgPSBTUkFJX0goYjAsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0hfMF8yNTUoYjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYjAsICh2MTZpOCliMCk7ICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMQ19HMTYoeTAsIHkxLCB1MCwgdTEsIHYwLCB2MSwgZHN0KSBkbyB7ICAgXAorICBjb25zdCB2OGkxNiBjb25zdF9hID0gKHY4aTE2KV9fbXNhX2ZpbGxfaCg4NzA4KTsgICBcCisgIHY4aTE2IGEwID0gX19tc2Ffc3Vic19zX2goKHY4aTE2KXkwLCAodjhpMTYpdTApOyAgIFwKKyAgdjhpMTYgYTEgPSBfX21zYV9zdWJzX3NfaCgodjhpMTYpeTEsICh2OGkxNil1MSk7ICAgXAorICBjb25zdCB2OGkxNiBiMCA9IF9fbXNhX3N1YnNfc19oKGEwLCAodjhpMTYpdjApOyAgICBcCisgIGNvbnN0IHY4aTE2IGIxID0gX19tc2Ffc3Vic19zX2goYTEsICh2OGkxNil2MSk7ICAgIFwKKyAgYTAgPSBfX21zYV9hZGRzX3NfaChiMCwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICAgXAorICBhMSA9IF9fbXNhX2FkZHNfc19oKGIxLCBjb25zdF9hKTsgICAgICAgICAgICAgICAgICBcCisgIFNSQUlfSDJfU0goYTAsIGExLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9TSDJfMF8yNTUoYTAsIGExKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYTEsICh2MTZpOClhMCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfRzgoeTAsIHUwLCB2MCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjhpMTYgY29uc3RfYSA9ICh2OGkxNilfX21zYV9maWxsX2goODcwOCk7ICAgXAorICB2OGkxNiBhMCA9IF9fbXNhX3N1YnNfc19oKCh2OGkxNil5MCwgKHY4aTE2KXUwKTsgICBcCisgIGNvbnN0IHY4aTE2IGIwID0gX19tc2Ffc3Vic19zX2goYTAsICh2OGkxNil2MCk7ICAgIFwKKyAgYTAgPSBfX21zYV9hZGRzX3NfaChiMCwgY29uc3RfYSk7ICAgICAgICAgICAgICAgICAgXAorICBhMCA9IFNSQUlfSChhMCwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfU0hfMF8yNTUoYTApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWEwLCAodjE2aTgpYTApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX0IxNih5MCwgeTEsIHUwLCB1MSwgZHN0KSBkbyB7ICAgICAgICAgICBcCisgIGNvbnN0IHY4dTE2IGNvbnN0X2EgPSAodjh1MTYpX19tc2FfZmlsbF9oKDE3Njg1KTsgIFwKKyAgY29uc3Qgdjh1MTYgYTAgPSBfX21zYV9hZGRzX3VfaCgodjh1MTYpeTAsIHUwKTsgICAgXAorICBjb25zdCB2OHUxNiBhMSA9IF9fbXNhX2FkZHNfdV9oKCh2OHUxNil5MSwgdTEpOyAgICBcCisgIHY4dTE2IGIwID0gX19tc2Ffc3Vic191X2goYTAsIGNvbnN0X2EpOyAgICAgICAgICAgIFwKKyAgdjh1MTYgYjEgPSBfX21zYV9zdWJzX3VfaChhMSwgY29uc3RfYSk7ICAgICAgICAgICAgXAorICBTUkFJX0gyX1VIKGIwLCBiMSwgNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIENMSVBfVUgyXzBfMjU1KGIwLCBiMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0ID0gKHYxNnU4KV9fbXNhX3Bja2V2X2IoKHYxNmk4KWIxLCAodjE2aTgpYjApOyAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDQUxDX0I4KHkwLCB1MCwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHY4dTE2IGNvbnN0X2EgPSAodjh1MTYpX19tc2FfZmlsbF9oKDE3Njg1KTsgIFwKKyAgY29uc3Qgdjh1MTYgYTAgPSBfX21zYV9hZGRzX3VfaCgodjh1MTYpeTAsIHUwKTsgICAgXAorICB2OHUxNiBiMCA9IF9fbXNhX3N1YnNfdV9oKGEwLCBjb25zdF9hKTsgICAgICAgICAgICBcCisgIGIwID0gU1JBSV9IKGIwLCA2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ0xJUF9VSF8wXzI1NShiMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3QgPSAodjE2dTgpX19tc2FfcGNrZXZfYigodjE2aTgpYjAsICh2MTZpOCliMCk7ICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQikgZG8geyAgICBcCisgIGNvbnN0IHYxNnU4IHplcm8gPSB7IDAgfTsgICAgICAgICAgICAgICAgICBcCisgIHY4dTE2IHkwLCB5MSwgdTAsIHUxLCB2MCwgdjE7ICAgICAgICAgICAgICBcCisgIHY0dTMyIHAwLCBwMSwgcDIsIHAzOyAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3kgPSBMRF9VQih5KTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3UgPSBMRF9VQih1KTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3YgPSBMRF9VQih2KTsgICAgICAgICAgICAgICBcCisgIElMVlJMX1VXNChpbl95LCBwMCwgcDEsIHAyLCBwMyk7ICAgICAgICAgICBcCisgIE1VTFRISV8xNihwMCwgcDEsIHAyLCBwMywgMTkwNzcsIHkwLCB5MSk7ICBcCisgIElMVlJMX1VXNChpbl92LCBwMCwgcDEsIHAyLCBwMyk7ICAgICAgICAgICBcCisgIE1VTFRISV8xNihwMCwgcDEsIHAyLCBwMywgMjYxNDksIHYwLCB2MSk7ICBcCisgIENBTENfUjE2KHkwLCB5MSwgdjAsIHYxLCBSKTsgICAgICAgICAgICAgICBcCisgIE1VTFRISV8xNihwMCwgcDEsIHAyLCBwMywgMTMzMjAsIHYwLCB2MSk7ICBcCisgIElMVlJMX1VXNChpbl91LCBwMCwgcDEsIHAyLCBwMyk7ICAgICAgICAgICBcCisgIE1VTFRISV8xNihwMCwgcDEsIHAyLCBwMywgNjQxOSwgdTAsIHUxKTsgICBcCisgIENBTENfRzE2KHkwLCB5MSwgdTAsIHUxLCB2MCwgdjEsIEcpOyAgICAgICBcCisgIE1VTFRISV8xNihwMCwgcDEsIHAyLCBwMywgMzMwNTAsIHUwLCB1MSk7ICBcCisgIENBTENfQjE2KHkwLCB5MSwgdTAsIHUxLCBCKTsgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUkdCOCh5LCB1LCB2LCBSLCBHLCBCKSBkbyB7ICBcCisgIGNvbnN0IHYxNnU4IHplcm8gPSB7IDAgfTsgICAgICAgICAgICAgICBcCisgIHY4dTE2IHkwLCB1MCwgdjA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHY0dTMyIHAwLCBwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3kgPSBMRF9VQih5KTsgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3UgPSBMRF9VQih1KTsgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IGluX3YgPSBMRF9VQih2KTsgICAgICAgICAgICBcCisgIElMVlJfVVcyKGluX3ksIHAwLCBwMSk7ICAgICAgICAgICAgICAgICBcCisgIE1VTFRISV84KHAwLCBwMSwgMTkwNzcsIHkwKTsgICAgICAgICAgICBcCisgIElMVlJfVVcyKGluX3YsIHAwLCBwMSk7ICAgICAgICAgICAgICAgICBcCisgIE1VTFRISV84KHAwLCBwMSwgMjYxNDksIHYwKTsgICAgICAgICAgICBcCisgIENBTENfUjgoeTAsIHYwLCBSKTsgICAgICAgICAgICAgICAgICAgICBcCisgIE1VTFRISV84KHAwLCBwMSwgMTMzMjAsIHYwKTsgICAgICAgICAgICBcCisgIElMVlJfVVcyKGluX3UsIHAwLCBwMSk7ICAgICAgICAgICAgICAgICBcCisgIE1VTFRISV84KHAwLCBwMSwgNjQxOSwgdTApOyAgICAgICAgICAgICBcCisgIENBTENfRzgoeTAsIHUwLCB2MCwgRyk7ICAgICAgICAgICAgICAgICBcCisgIE1VTFRISV84KHAwLCBwMSwgMzMwNTAsIHUwKTsgICAgICAgICAgICBcCisgIENBTENfQjgoeTAsIHUwLCBCKTsgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFMTZfMyhhMCwgYTEsIGEyLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggbWFzazAgPSB7IDAsIDEsIDE2LCAyLCAzLCAxNywgNCwgNSwgMTgsIDYsIDcsIDE5LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMjAsIDEwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG1hc2sxID0geyAwLCAyMSwgMSwgMiwgMjIsIDMsIDQsIDIzLCA1LCA2LCAyNCwgNywgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIDgsIDI1LCA5LCAxMCB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBtYXNrMiA9IHsgMjYsIDAsIDEsIDI3LCAyLCAzLCAyOCwgNCwgNSwgMjksIDYsIDcsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAzMCwgOCwgOSwgMzEgfTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggb3V0MCwgb3V0MSwgb3V0MiwgdG1wMCwgdG1wMSwgdG1wMjsgICAgICAgICAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihhMSwgYTAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG91dDAgPSBWU0hGX1VCKHRtcDAsIGEyLCBtYXNrMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMiA9IFNMRElfVUIodG1wMSwgdG1wMCwgMTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQxID0gVlNIRl9VQih0bXAyLCBhMiwgbWFzazEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDIgPSBTTERJX1VCKHRtcDEsIHRtcDEsIDYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0MiA9IFZTSEZfVUIodG1wMiwgYTIsIG1hc2syKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQwLCBkc3QgKyAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUX1VCKG91dDEsIGRzdCArIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MiwgZHN0ICsgMzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRThfMyhhMCwgYTEsIGEyLCBkc3QpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50NjRfdCBvdXRfbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IG1hc2swID0geyAwLCAxLCAxNiwgMiwgMywgMTcsIDQsIDUsIDE4LCA2LCA3LCAxOSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgOCwgOSwgMjAsIDEwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggbWFzazEgPSB7IDExLCAyMSwgMTIsIDEzLCAyMiwgMTQsIDE1LCAyMywgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSB9OyAgXAorICBjb25zdCB2MTZ1OCB0bXAwID0gKHYxNnU4KV9fbXNhX2lsdnJfYigodjE2aTgpYTEsICh2MTZpOClhMCk7ICAgIFwKKyAgdjE2dTggb3V0MCwgb3V0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFZTSEZfQjJfVUIodG1wMCwgYTIsIHRtcDAsIGEyLCBtYXNrMCwgbWFzazEsIG91dDAsIG91dDEpOyAgICAgICAgXAorICBTVF9VQihvdXQwLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0X20gPSBfX21zYV9jb3B5X3NfZCgodjJpNjQpb3V0MSwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNEKG91dF9tLCBkc3QgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRTE2XzQoYTAsIGExLCBhMiwgYTMsIGRzdCkgZG8geyAgXAorICB2MTZ1OCB0bXAwLCB0bXAxLCB0bXAyLCB0bXAzOyAgICAgICAgICAgICAgXAorICB2MTZ1OCBvdXQwLCBvdXQxLCBvdXQyLCBvdXQzOyAgICAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihhMSwgYTAsIHRtcDAsIHRtcDEpOyAgICAgICAgICAgXAorICBJTFZSTF9CMl9VQihhMywgYTIsIHRtcDIsIHRtcDMpOyAgICAgICAgICAgXAorICBJTFZSTF9IMl9VQih0bXAyLCB0bXAwLCBvdXQwLCBvdXQxKTsgICAgICAgXAorICBJTFZSTF9IMl9VQih0bXAzLCB0bXAxLCBvdXQyLCBvdXQzKTsgICAgICAgXAorICBTVF9VQihvdXQwLCBkc3QgKyAgMCk7ICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQxLCBkc3QgKyAxNik7ICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQyLCBkc3QgKyAzMik7ICAgICAgICAgICAgICAgICAgICAgXAorICBTVF9VQihvdXQzLCBkc3QgKyA0OCk7ICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRThfNChhMCwgYTEsIGEyLCBhMywgZHN0KSBkbyB7ICBcCisgIHYxNnU4IHRtcDAsIHRtcDEsIHRtcDIsIHRtcDM7ICAgICAgICAgICAgIFwKKyAgSUxWUl9CMl9VQihhMSwgYTAsIGEzLCBhMiwgdG1wMCwgdG1wMSk7ICAgXAorICBJTFZSTF9IMl9VQih0bXAxLCB0bXAwLCB0bXAyLCB0bXAzKTsgICAgICBcCisgIFNUX1VCKHRtcDIsIGRzdCArICAwKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgU1RfVUIodG1wMywgZHN0ICsgMTYpOyAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRTJfMTYoYTAsIGExLCBkc3QpIGRvIHsgIFwKKyAgdjE2dTggb3V0MCwgb3V0MTsgICAgICAgICAgICAgICAgICBcCisgIElMVlJMX0IyX1VCKGExLCBhMCwgb3V0MCwgb3V0MSk7ICAgXAorICBTVF9VQihvdXQwLCBkc3QgKyAgMCk7ICAgICAgICAgICAgIFwKKyAgU1RfVUIob3V0MSwgZHN0ICsgMTYpOyAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNUT1JFMl84KGEwLCBhMSwgZHN0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdjE2dTggb3V0MCA9ICh2MTZ1OClfX21zYV9pbHZyX2IoKHYxNmk4KWExLCAodjE2aTgpYTApOyAgXAorICBTVF9VQihvdXQwLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUkdCQTQ0NDQoeSwgdSwgdiwgb3V0MCwgb3V0MSwgTiwgZHN0KSBkbyB7ICBcCisgIENBTENfUkdCIyNOKHksIHUsIHYsIFIsIEcsIEIpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDAgPSBBTkRJX0IoUiwgMHhmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDEgPSBTUkFJX0IoRywgNCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJHID0gdG1wMCB8IHRtcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDAgPSBBTkRJX0IoQiwgMHhmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEJBID0gT1JJX0IodG1wMCwgMHgwZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUT1JFMl8jI04ob3V0MCwgb3V0MSwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENBTENfUkdCNTY1KHksIHUsIHYsIG91dDAsIG91dDEsIE4sIGRzdCkgZG8geyAgXAorICBDQUxDX1JHQiMjTih5LCB1LCB2LCBSLCBHLCBCKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMCA9IEFORElfQihSLCAweGY4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDEgPSBTUkFJX0IoRywgNSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBSRyA9IHRtcDAgfCB0bXAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdG1wMCA9IFNMTElfQihHLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRtcDEgPSBBTkRJX0IodG1wMCwgMHhlMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0bXAwID0gU1JBSV9CKEIsIDMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0IgPSB0bXAwIHwgdG1wMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNUT1JFMl8jI04ob3V0MCwgb3V0MSwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBDbGlwOChpbnQgdikgeworICByZXR1cm4gdiA8IDAgPyAwIDogdiA+IDI1NSA/IDI1NSA6IHY7Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiKGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICBjb25zdCBpbnQgeTEgPSBNdWx0SGkoeSwgMTkwNzcpOworICBjb25zdCBpbnQgcjEgPSB5MSArIE11bHRIaSh2LCAyNjE0OSkgLSAxNDIzNDsKKyAgY29uc3QgaW50IGcxID0geTEgLSBNdWx0SGkodSwgNjQxOSkgLSBNdWx0SGkodiwgMTMzMjApICsgODcwODsKKyAgY29uc3QgaW50IGIxID0geTEgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODU7CisgIHJnYlswXSA9IENsaXA4KHIxID4+IDYpOworICByZ2JbMV0gPSBDbGlwOChnMSA+PiA2KTsKKyAgcmdiWzJdID0gQ2xpcDgoYjEgPj4gNik7Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyKGludCB5LCBpbnQgdSwgaW50IHYsIHVpbnQ4X3QqIGNvbnN0IGJncikgeworICBjb25zdCBpbnQgeTEgPSBNdWx0SGkoeSwgMTkwNzcpOworICBjb25zdCBpbnQgcjEgPSB5MSArIE11bHRIaSh2LCAyNjE0OSkgLSAxNDIzNDsKKyAgY29uc3QgaW50IGcxID0geTEgLSBNdWx0SGkodSwgNjQxOSkgLSBNdWx0SGkodiwgMTMzMjApICsgODcwODsKKyAgY29uc3QgaW50IGIxID0geTEgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODU7CisgIGJnclswXSA9IENsaXA4KGIxID4+IDYpOworICBiZ3JbMV0gPSBDbGlwOChnMSA+PiA2KTsKKyAgYmdyWzJdID0gQ2xpcDgocjEgPj4gNik7Cit9CisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitzdGF0aWMgdm9pZCBZdXZUb1JnYjU2NShpbnQgeSwgaW50IHUsIGludCB2LCB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgY29uc3QgaW50IHkxID0gTXVsdEhpKHksIDE5MDc3KTsKKyAgY29uc3QgaW50IHIxID0geTEgKyBNdWx0SGkodiwgMjYxNDkpIC0gMTQyMzQ7CisgIGNvbnN0IGludCBnMSA9IHkxIC0gTXVsdEhpKHUsIDY0MTkpIC0gTXVsdEhpKHYsIDEzMzIwKSArIDg3MDg7CisgIGNvbnN0IGludCBiMSA9IHkxICsgTXVsdEhpKHUsIDMzMDUwKSAtIDE3Njg1OworICBjb25zdCBpbnQgciA9IENsaXA4KHIxID4+IDYpOworICBjb25zdCBpbnQgZyA9IENsaXA4KGcxID4+IDYpOworICBjb25zdCBpbnQgYiA9IENsaXA4KGIxID4+IDYpOworICBjb25zdCBpbnQgcmcgPSAociAmIDB4ZjgpIHwgKGcgPj4gNSk7CisgIGNvbnN0IGludCBnYiA9ICgoZyA8PCAzKSAmIDB4ZTApIHwgKGIgPj4gMyk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgcmdiWzBdID0gZ2I7CisgIHJnYlsxXSA9IHJnOworI2Vsc2UKKyAgcmdiWzBdID0gcmc7CisgIHJnYlsxXSA9IGdiOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiYTQ0NDQoaW50IHksIGludCB1LCBpbnQgdiwgdWludDhfdCogY29uc3QgYXJnYikgeworICBjb25zdCBpbnQgeTEgPSBNdWx0SGkoeSwgMTkwNzcpOworICBjb25zdCBpbnQgcjEgPSB5MSArIE11bHRIaSh2LCAyNjE0OSkgLSAxNDIzNDsKKyAgY29uc3QgaW50IGcxID0geTEgLSBNdWx0SGkodSwgNjQxOSkgLSBNdWx0SGkodiwgMTMzMjApICsgODcwODsKKyAgY29uc3QgaW50IGIxID0geTEgKyBNdWx0SGkodSwgMzMwNTApIC0gMTc2ODU7CisgIGNvbnN0IGludCByID0gQ2xpcDgocjEgPj4gNik7CisgIGNvbnN0IGludCBnID0gQ2xpcDgoZzEgPj4gNik7CisgIGNvbnN0IGludCBiID0gQ2xpcDgoYjEgPj4gNik7CisgIGNvbnN0IGludCByZyA9IChyICYgMHhmMCkgfCAoZyA+PiA0KTsKKyAgY29uc3QgaW50IGJhID0gKGIgJiAweGYwKSB8IDB4MGY7ICAgICAvLyBvdmVyd3JpdGUgdGhlIGxvd2VyIDQgYml0cworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIGFyZ2JbMF0gPSBiYTsKKyAgYXJnYlsxXSA9IHJnOworI2Vsc2UKKyAgYXJnYlswXSA9IHJnOworICBhcmdiWzFdID0gYmE7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgWXV2VG9BcmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsIHVpbnQ4X3QqIGNvbnN0IGFyZ2IpIHsKKyAgYXJnYlswXSA9IDB4ZmY7CisgIFl1dlRvUmdiKHksIHUsIHYsIGFyZ2IgKyAxKTsKK30KKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyYSh1aW50OF90IHksIHVpbnQ4X3QgdSwgdWludDhfdCB2LCB1aW50OF90KiBjb25zdCBiZ3JhKSB7CisgIFl1dlRvQmdyKHksIHUsIHYsIGJncmEpOworICBiZ3JhWzNdID0gMHhmZjsKK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsIHVpbnQ4X3QqIGNvbnN0IHJnYmEpIHsKKyAgWXV2VG9SZ2IoeSwgdSwgdiwgcmdiYSk7CisgIHJnYmFbM10gPSAweGZmOworfQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorc3RhdGljIHZvaWQgWXV2VG9SZ2JMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEI7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfMyhSLCBHLCBCLCBkc3QpOworICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDM7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzMgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0IxNih0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzMoUiwgRywgQiwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogMyAqIHNpemVvZigqZHN0KSk7CisgIH0gZWxzZSBpZiAobGVuZ3RoID4gMCkgeworICAgIHVpbnQ4X3QgdGVtcFszICogOF0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0I4KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFOF8zKFIsIEcsIEIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDMgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFl1dlRvQmdyTGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzMoQiwgRywgUiwgZHN0KTsKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiAzOworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFszICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCMTYodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl8zKEIsIEcsIFIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDMgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbMyAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCOCh0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRThfMyhCLCBHLCBSLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAzICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworc3RhdGljIHZvaWQgWXV2VG9SZ2JhTGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQjsKKyAgY29uc3QgdjE2dTggQSA9ICh2MTZ1OClfX21zYV9sZGlfYihBTFBIQVZBTCk7CisgIHdoaWxlIChsZW5ndGggPj0gMTYpIHsKKyAgICBDQUxDX1JHQjE2KHksIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChSLCBHLCBCLCBBLCBkc3QpOworICAgIHkgICAgICArPSAxNjsKKyAgICB1ICAgICAgKz0gMTY7CisgICAgdiAgICAgICs9IDE2OworICAgIGRzdCAgICArPSAxNiAqIDQ7CisgICAgbGVuZ3RoIC09IDE2OworICB9CisgIGlmIChsZW5ndGggPiA4KSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiAxNl0gPSB7IDAgfTsKKyAgICBtZW1jcHkodGVtcCwgeSwgbGVuZ3RoICogc2l6ZW9mKCp0ZW1wKSk7CisgICAgQ0FMQ19SR0IxNigmdGVtcFswXSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KFIsIEcsIEIsIEEsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCOCh0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRThfNChSLCBHLCBCLCBBLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JncmFMaW5lKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCwgaW50IGxlbmd0aCkgeworICB2MTZ1OCBSLCBHLCBCOworICBjb25zdCB2MTZ1OCBBID0gKHYxNnU4KV9fbXNhX2xkaV9iKEFMUEhBVkFMKTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworICAgIENBTENfUkdCMTYoeSwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KEIsIEcsIFIsIEEsIGRzdCk7CisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogNDsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjE2KHRlbXAsIHUsIHYsIFIsIEcsIEIpOworICAgIFNUT1JFMTZfNChCLCBHLCBSLCBBLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7CisgICAgdWludDhfdCB0ZW1wWzQgKiA4XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyAgICBDQUxDX1JHQjgodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkU4XzQoQiwgRywgUiwgQSwgdGVtcCk7CisgICAgbWVtY3B5KGRzdCwgdGVtcCwgbGVuZ3RoICogNCAqIHNpemVvZigqZHN0KSk7CisgIH0KK30KKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK3N0YXRpYyB2b2lkIFl1dlRvQXJnYkxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEI7CisgIGNvbnN0IHYxNnU4IEEgPSAodjE2dTgpX19tc2FfbGRpX2IoQUxQSEFWQUwpOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisgICAgQ0FMQ19SR0IxNih5LCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRTE2XzQoQSwgUiwgRywgQiwgZHN0KTsKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiA0OworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFs0ICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCMTYodGVtcCwgdSwgdiwgUiwgRywgQik7CisgICAgU1RPUkUxNl80KEEsIFIsIEcsIEIsIHRlbXApOworICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDQgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbNCAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworICAgIENBTENfUkdCOCh0ZW1wLCB1LCB2LCBSLCBHLCBCKTsKKyAgICBTVE9SRThfNChBLCBSLCBHLCBCLCB0ZW1wKTsKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiA0ICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYmE0NDQ0TGluZShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdiwgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoKSB7CisgIHYxNnU4IFIsIEcsIEIsIFJHLCBCQSwgdG1wMCwgdG1wMTsKKyAgd2hpbGUgKGxlbmd0aCA+PSAxNikgeworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0JBNDQ0NCh5LCB1LCB2LCBCQSwgUkcsIDE2LCBkc3QpOworI2Vsc2UKKyAgICBDQUxDX1JHQkE0NDQ0KHksIHUsIHYsIFJHLCBCQSwgMTYsIGRzdCk7CisjZW5kaWYKKyAgICB5ICAgICAgKz0gMTY7CisgICAgdSAgICAgICs9IDE2OworICAgIHYgICAgICArPSAxNjsKKyAgICBkc3QgICAgKz0gMTYgKiAyOworICAgIGxlbmd0aCAtPSAxNjsKKyAgfQorICBpZiAobGVuZ3RoID4gOCkgeworICAgIHVpbnQ4X3QgdGVtcFsyICogMTZdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0JBNDQ0NCh0ZW1wLCB1LCB2LCBCQSwgUkcsIDE2LCB0ZW1wKTsKKyNlbHNlCisgICAgQ0FMQ19SR0JBNDQ0NCh0ZW1wLCB1LCB2LCBSRywgQkEsIDE2LCB0ZW1wKTsKKyNlbmRpZgorICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDIgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbMiAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0JBNDQ0NCh0ZW1wLCB1LCB2LCBCQSwgUkcsIDgsIHRlbXApOworI2Vsc2UKKyAgICBDQUxDX1JHQkE0NDQ0KHRlbXAsIHUsIHYsIFJHLCBCQSwgOCwgdGVtcCk7CisjZW5kaWYKKyAgICBtZW1jcHkoZHN0LCB0ZW1wLCBsZW5ndGggKiAyICogc2l6ZW9mKCpkc3QpKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb1JnYjU2NUxpbmUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2LCB1aW50OF90KiBkc3QsIGludCBsZW5ndGgpIHsKKyAgdjE2dTggUiwgRywgQiwgUkcsIEdCLCB0bXAwLCB0bXAxOworICB3aGlsZSAobGVuZ3RoID49IDE2KSB7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMSkKKyAgICBDQUxDX1JHQjU2NSh5LCB1LCB2LCBHQiwgUkcsIDE2LCBkc3QpOworI2Vsc2UKKyAgICBDQUxDX1JHQjU2NSh5LCB1LCB2LCBSRywgR0IsIDE2LCBkc3QpOworI2VuZGlmCisgICAgeSAgICAgICs9IDE2OworICAgIHUgICAgICArPSAxNjsKKyAgICB2ICAgICAgKz0gMTY7CisgICAgZHN0ICAgICs9IDE2ICogMjsKKyAgICBsZW5ndGggLT0gMTY7CisgIH0KKyAgaWYgKGxlbmd0aCA+IDgpIHsKKyAgICB1aW50OF90IHRlbXBbMiAqIDE2XSA9IHsgMCB9OworICAgIG1lbWNweSh0ZW1wLCB5LCBsZW5ndGggKiBzaXplb2YoKnRlbXApKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICAgIENBTENfUkdCNTY1KHRlbXAsIHUsIHYsIEdCLCBSRywgMTYsIHRlbXApOworI2Vsc2UKKyAgICBDQUxDX1JHQjU2NSh0ZW1wLCB1LCB2LCBSRywgR0IsIDE2LCB0ZW1wKTsKKyNlbmRpZgorICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDIgKiBzaXplb2YoKmRzdCkpOworICB9IGVsc2UgaWYgKGxlbmd0aCA+IDApIHsKKyAgICB1aW50OF90IHRlbXBbMiAqIDhdID0geyAwIH07CisgICAgbWVtY3B5KHRlbXAsIHksIGxlbmd0aCAqIHNpemVvZigqdGVtcCkpOworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgICAgQ0FMQ19SR0I1NjUodGVtcCwgdSwgdiwgR0IsIFJHLCA4LCB0ZW1wKTsKKyNlbHNlCisgICAgQ0FMQ19SR0I1NjUodGVtcCwgdSwgdiwgUkcsIEdCLCA4LCB0ZW1wKTsKKyNlbmRpZgorICAgIG1lbWNweShkc3QsIHRlbXAsIGxlbmd0aCAqIDIgKiBzaXplb2YoKmRzdCkpOworICB9Cit9CisjZW5kaWYgIC8vIFdFQlBfUkVEVUNFX0NTUAorCisjZGVmaW5lIFVQU0FNUExFXzMyUElYRUxTKGEsIGIsIGMsIGQpIGRvIHsgICAgXAorICB2MTZ1OCBzID0gX19tc2FfYXZlcl91X2IoYSwgZCk7ICAgICAgICAgICAgIFwKKyAgdjE2dTggdCA9IF9fbXNhX2F2ZXJfdV9iKGIsIGMpOyAgICAgICAgICAgICBcCisgIGNvbnN0IHYxNnU4IHN0ID0gcyBeIHQ7ICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCBhZCA9IGEgXiBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggYmMgPSBiIF4gYzsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHQwID0gYWQgfCBiYzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2MTZ1OCB0MSA9IHQwIHwgc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggdDIgPSBBTkRJX0IodDEsIDEpOyAgICAgICAgICAgICAgICAgICBcCisgIHYxNnU4IHQzID0gX19tc2FfYXZlcl91X2IocywgdCk7ICAgICAgICAgICAgXAorICBjb25zdCB2MTZ1OCBrID0gdDMgLSB0MjsgICAgICAgICAgICAgICAgICAgIFwKKyAgdjE2dTggZGlhZzEsIGRpYWcyOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFWRVJfVUIyX1VCKHQsIGssIHMsIGssIHQwLCB0MSk7ICAgICAgICAgICAgXAorICBiYyA9IGJjICYgc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYWQgPSBhZCAmIHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQgPSB0IF4gazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzID0gcyBeIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDIgPSBiYyB8IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHQzID0gYWQgfCBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0MiA9IEFORElfQih0MiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdDMgPSBBTkRJX0IodDMsIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNVQjIodDAsIHQyLCB0MSwgdDMsIGRpYWcxLCBkaWFnMik7ICAgICAgICAgXAorICBBVkVSX1VCMl9VQihhLCBkaWFnMSwgYiwgZGlhZzIsIHQwLCB0MSk7ICAgIFwKKyAgSUxWUkxfQjJfVUIodDEsIHQwLCBhLCBiKTsgICAgICAgICAgICAgICAgICBcCisgIGlmIChwYm90X3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFWRVJfVUIyX1VCKGMsIGRpYWcyLCBkLCBkaWFnMSwgdDAsIHQxKTsgIFwKKyAgICBJTFZSTF9CMl9VQih0MSwgdDAsIGMsIGQpOyAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBVUFNBTVBMRV9GVU5DKEZVTkNfTkFNRSwgRlVOQywgWFNURVApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB0b3BfeSwgY29uc3QgdWludDhfdCogYm90X3ksICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdG9wX3UsIGNvbnN0IHVpbnQ4X3QqIHRvcF92LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGN1cl91LCBjb25zdCB1aW50OF90KiBjdXJfdiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0b3BfZHN0LCB1aW50OF90KiBib3RfZHN0LCBpbnQgbGVuKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgc2l6ZSA9IChsZW4gLSAxKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCB0ZW1wX3VbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgdGVtcF92WzY0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50MzJfdCB0bF91diA9ICgodG9wX3VbMF0pIHwgKCh0b3BfdlswXSkgPDwgMTYpKTsgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDMyX3QgbF91diA9ICgoY3VyX3VbMF0pIHwgKChjdXJfdlswXSkgPDwgMTYpKTsgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQzMl90IHV2MCA9ICgzICogdGxfdXYgKyBsX3V2ICsgMHgwMDAyMDAwMnUpID4+IDI7ICAgICAgICAgICAgXAorICBjb25zdCB1aW50OF90KiBwdG9wX3kgPSAmdG9wX3lbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCAqcHRvcF9kc3QgPSB0b3BfZHN0ICsgWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4X3QqIHBib3RfeSA9ICZib3RfeVsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90ICpwYm90X2RzdCA9IGJvdF9kc3QgKyBYU1RFUDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZVTkModG9wX3lbMF0sIHV2MCAmIDB4ZmYsICh1djAgPj4gMTYpLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90X3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB1djEgPSAoMyAqIGxfdXYgKyB0bF91diArIDB4MDAwMjAwMDJ1KSA+PiAyOyAgICAgICAgICBcCisgICAgRlVOQyhib3RfeVswXSwgdXYxICYgMHhmZiwgKHV2MSA+PiAxNiksIGJvdF9kc3QpOyAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgd2hpbGUgKHNpemUgPj0gMTYpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2dTggdHUwLCB0dTEsIHR2MCwgdHYxLCBjdTAsIGN1MSwgY3YwLCBjdjE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMih0b3BfdSwgMSwgdHUwLCB0dTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoY3VyX3UsIDEsIGN1MCwgY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKHRvcF92LCAxLCB0djAsIHR2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMihjdXJfdiwgMSwgY3YwLCBjdjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0dTAsIHR1MSwgY3UwLCBjdTEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModHYwLCB0djEsIGN2MCwgY3YxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUX1VCNCh0dTAsIHR1MSwgY3UwLCBjdTEsICZ0ZW1wX3VbMF0sIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjQodHYwLCB0djEsIGN2MCwgY3YxLCAmdGVtcF92WzBdLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyMjTGluZShwdG9wX3ksICZ0ZW1wX3VbIDBdLCAmdGVtcF92WzBdLCBwdG9wX2RzdCwgMzIpOyAgICAgICAgICAgXAorICAgIGlmIChib3RfeSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEZVTkMjI0xpbmUocGJvdF95LCAmdGVtcF91WzMyXSwgJnRlbXBfdlszMl0sIHBib3RfZHN0LCAzMik7ICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHB0b3BfeSAgICs9IDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwYm90X3kgICArPSAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcHRvcF9kc3QgKz0gWFNURVAgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBib3RfZHN0ICs9IFhTVEVQICogMzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3BfdSAgICArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG9wX3YgICAgKz0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl91ICAgICs9IDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdiAgICArPSAxNjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZSAgICAgLT0gMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKHNpemUgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdjE2dTggdHUwLCB0dTEsIHR2MCwgdHYxLCBjdTAsIGN1MSwgY3YwLCBjdjE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmdGVtcF91WyAwXSwgdG9wX3UsIDE3ICogc2l6ZW9mKHVpbnQ4X3QpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZW1jcHkoJnRlbXBfdVszMl0sIGN1cl91LCAxNyAqIHNpemVvZih1aW50OF90KSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVtY3B5KCZ0ZW1wX3ZbIDBdLCB0b3BfdiwgMTcgKiBzaXplb2YodWludDhfdCkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgmdGVtcF92WzMyXSwgY3VyX3YsIDE3ICogc2l6ZW9mKHVpbnQ4X3QpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoJnRlbXBfdVsgMF0sIDEsIHR1MCwgdHUxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTERfVUIyKCZ0ZW1wX3VbMzJdLCAxLCBjdTAsIGN1MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIExEX1VCMigmdGVtcF92WyAwXSwgMSwgdHYwLCB0djEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBMRF9VQjIoJnRlbXBfdlszMl0sIDEsIGN2MCwgY3YxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModHUwLCB0dTEsIGN1MCwgY3UxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzMyUElYRUxTKHR2MCwgdHYxLCBjdjAsIGN2MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTVF9VQjQodHUwLCB0dTEsIGN1MCwgY3UxLCAmdGVtcF91WzBdLCAxNik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU1RfVUI0KHR2MCwgdHYxLCBjdjAsIGN2MSwgJnRlbXBfdlswXSwgMTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMjI0xpbmUocHRvcF95LCAmdGVtcF91WyAwXSwgJnRlbXBfdlswXSwgcHRvcF9kc3QsIHNpemUgKiAyKTsgICAgIFwKKyAgICBpZiAoYm90X3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DIyNMaW5lKHBib3RfeSwgJnRlbXBfdVszMl0sICZ0ZW1wX3ZbMzJdLCBwYm90X2RzdCwgc2l6ZSAqIDIpOyAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3BfdSArPSBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG9wX3YgKz0gc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl91ICs9IHNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdXJfdiArPSBzaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoIShsZW4gJiAxKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1aW50MzJfdCB0MCA9ICgodG9wX3VbMF0pIHwgKCh0b3BfdlswXSkgPDwgMTYpKTsgICAgICAgICAgICAgICBcCisgICAgY29uc3QgdWludDMyX3QgYzAgID0gKChjdXJfdVswXSkgfCAoKGN1cl92WzBdKSA8PCAxNikpOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQzMl90IHRtcDAgPSAoMyAqIHQwICsgYzAgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHRvcF95W2xlbiAtIDFdLCB0bXAwICYgMHhmZiwgKHRtcDAgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG9wX2RzdCArIChsZW4gLSAxKSAqIFhTVEVQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3RfeSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQzMl90IHRtcDEgPSAoMyAqIGMwICsgdDAgKyAweDAwMDIwMDAydSkgPj4gMjsgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdF95W2xlbiAtIDFdLCB0bXAxICYgMHhmZiwgKHRtcDEgPj4gMTYpLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBib3RfZHN0ICsgKGxlbiAtIDEpICogWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlUmdiYUxpbmVQYWlyLCAgICAgWXV2VG9SZ2JhLCAgICAgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JhTGluZVBhaXIsICAgICBZdXZUb0JncmEsICAgICA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpciwgICAgICBZdXZUb1JnYiwgICAgICAzKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyLCAgICAgIFl1dlRvQmdyLCAgICAgIDMpCitVUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyLCAgICAgWXV2VG9BcmdiLCAgICAgNCkKK1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyLCBZdXZUb1JnYmE0NDQ0LCAyKQorVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyLCAgIFl1dlRvUmdiNTY1LCAgIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTVNBKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTVNBKHZvaWQpIHsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gVXBzYW1wbGVSZ2JhTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSQV0gICAgICA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBVcHNhbXBsZVJnYmFMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9iZ3JBXSAgICAgID0gVXBzYW1wbGVCZ3JhTGluZVBhaXI7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl0gICAgICAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUl0gICAgICAgPSBVcHNhbXBsZUJnckxpbmVQYWlyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BcmdiXSAgICAgID0gVXBzYW1wbGVBcmdiTGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXzU2NV0gICA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisjZW5kaWYgIC8vIFdFQlBfVVNFX01TQQorCisjaWYgIShkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpICYmIGRlZmluZWQoV0VCUF9VU0VfTVNBKSkKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFVwc2FtcGxlcnNNU0EpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19uZW9uLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDViYWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfbmVvbi5jCkBAIC0wLDAgKzEsMjkxIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTkVPTiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBtYW5zQG1hbnNyLmNvbSAoTWFucyBSdWxsZ2FyZCkKKy8vIEJhc2VkIG9uIFNTRSBjb2RlIGJ5OiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8YXJtX25lb24uaD4KKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVL1YgdXBzYW1wbGluZworCisvLyBMb2FkcyA5IHBpeGVscyBlYWNoIGZyb20gcm93cyByMSBhbmQgcjIgYW5kIGdlbmVyYXRlcyAxNiBwaXhlbHMuCisjZGVmaW5lIFVQU0FNUExFXzE2UElYRUxTKHIxLCByMiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBhID0gdmxkMV91OChyMSArIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBiID0gdmxkMV91OChyMSArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBjID0gdmxkMV91OChyMiArIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBkID0gdmxkMV91OChyMiArIDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIGEgKyBiICsgYyArIGQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYWQgPSB2YWRkbF91OChhLCAgZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYmMgPSB2YWRkbF91OChiLCAgYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYWJjZCA9IHZhZGRxX3UxNihhZCwgYmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIDNhICsgIGIgKyAgYyArIDNkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYWwgPSB2YWRkcV91MTYoYWJjZCwgdnNobHFfbl91MTYoYWQsIDEpKTsgICAgICAgICAgICBcCisgIC8qICBhICsgM2IgKyAzYyArICBkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQxNng4X3QgYmwgPSB2YWRkcV91MTYoYWJjZCwgdnNobHFfbl91MTYoYmMsIDEpKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBkaWFnMiA9IHZzaHJuX25fdTE2KGFsLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBkaWFnMSA9IHZzaHJuX25fdTE2KGJsLCAzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBBID0gdnJoYWRkX3U4KGEsIGRpYWcxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBCID0gdnJoYWRkX3U4KGIsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBDID0gdnJoYWRkX3U4KGMsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVpbnQ4eDhfdCBEID0gdnJoYWRkX3U4KGQsIGRpYWcxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4eDh4Ml90IEFfQiwgQ19EOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SMihBX0IsIEEsIEIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIElOSVRfVkVDVE9SMihDX0QsIEMsIEQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDJfdTgob3V0ICsgIDAsIEFfQik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZzdDJfdTgob3V0ICsgMzIsIENfRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBUdXJuIHRoZSBtYWNybyBpbnRvIGEgZnVuY3Rpb24gZm9yIHJlZHVjaW5nIGNvZGUtc2l6ZSB3aGVuIG5vbi1jcml0aWNhbAorc3RhdGljIHZvaWQgVXBzYW1wbGUxNlBpeGVsc19ORU9OKGNvbnN0IHVpbnQ4X3QgKnIxLCBjb25zdCB1aW50OF90ICpyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpvdXQpIHsKKyAgVVBTQU1QTEVfMTZQSVhFTFMocjEsIHIyLCBvdXQpOworfQorCisjZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICBcCisgIHVpbnQ4X3QgcjFbOV0sIHIyWzldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMSwgKHRiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIHJlcGxpY2F0ZSBsYXN0IGJ5dGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbXNldChyMSArIChudW1fcGl4ZWxzKSwgcjFbKG51bV9waXhlbHMpIC0gMV0sIDkgLSAobnVtX3BpeGVscykpOyAgICBcCisgIG1lbXNldChyMiArIChudW1fcGl4ZWxzKSwgcjJbKG51bV9waXhlbHMpIC0gMV0sIDkgLSAobnVtX3BpeGVscykpOyAgICBcCisgIFVwc2FtcGxlMTZQaXhlbHNfTkVPTihyMSwgcjIsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24KKworLy8gbm90ZTogd2UgcmVwcmVzZW50IHRoZSAzMzA1MCBsYXJnZSBjb25zdGFudCBhcyAzMjc2OCArIDI4Mgorc3RhdGljIGNvbnN0IGludDE2X3Qga0NvZWZmczFbNF0gPSB7IDE5MDc3LCAyNjE0OSwgNjQxOSwgMTMzMjAgfTsKKworI2RlZmluZSB2MjU1IHZkdXBfbl91OCgyNTUpCisKKyNkZWZpbmUgU1RPUkVfUmdiKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHgzX3Qgcl9nX2I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1IzKHJfZ19iLCByLCBnLCBiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0M191OChvdXQsIHJfZ19iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkVfQmdyKG91dCwgciwgZywgYikgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHgzX3QgYl9nX3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1IzKGJfZ19yLCBiLCBnLCByKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0M191OChvdXQsIGJfZ19yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkVfUmdiYShvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHg0X3Qgcl9nX2JfdjI1NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1I0KHJfZ19iX3YyNTUsIHIsIGcsIGIsIHYyNTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0NF91OChvdXQsIHJfZ19iX3YyNTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkVfQmdyYShvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHg0X3QgYl9nX3JfdjI1NTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1I0KGJfZ19yX3YyNTUsIGIsIGcsIHIsIHYyNTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0NF91OChvdXQsIGJfZ19yX3YyNTUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgU1RPUkVfQXJnYihvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDh4OHg0X3QgdjI1NV9yX2dfYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVF9WRUNUT1I0KHYyNTVfcl9nX2IsIHYyNTUsIHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdnN0NF91OChvdXQsIHYyNTVfcl9nX2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNpZiAhZGVmaW5lZChXRUJQX1NXQVBfMTZCSVRfQ1NQKQorI2RlZmluZSBaSVBfVTgobG8sIGhpKSB2emlwX3U4KChsbyksIChoaSkpCisjZWxzZQorI2RlZmluZSBaSVBfVTgobG8sIGhpKSB2emlwX3U4KChoaSksIChsbykpCisjZW5kaWYKKworI2RlZmluZSBTVE9SRV9SZ2JhNDQ0NChvdXQsIHIsIGcsIGIpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgcmcgPSB2c3JpX25fdTgociwgZywgNCk7ICAgICAgLyogc2hpZnQgZywgaW5zZXJ0IHIgKi8gXAorICBjb25zdCB1aW50OHg4X3QgYmEgPSB2c3JpX25fdTgoYiwgdjI1NSwgNCk7ICAgLyogc2hpZnQgYSwgaW5zZXJ0IGIgKi8gXAorICBjb25zdCB1aW50OHg4eDJfdCByZ2JhNDQ0NCA9IFpJUF9VOChyZywgYmEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxcV91OChvdXQsIHZjb21iaW5lX3U4KHJnYmE0NDQ0LnZhbFswXSwgcmdiYTQ0NDQudmFsWzFdKSk7ICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBTVE9SRV9SZ2I1NjUob3V0LCByLCBnLCBiKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1aW50OHg4X3QgcmcgPSB2c3JpX25fdTgociwgZywgNSk7ICAgLyogc2hpZnQgZyBhbmQgaW5zZXJ0IHIgKi8gXAorICBjb25zdCB1aW50OHg4X3QgZzEgPSB2c2hsX25fdTgoZywgMyk7ICAgICAgLyogcHJlLXNoaWZ0IGc6IDNiaXRzICovICAgXAorICBjb25zdCB1aW50OHg4X3QgZ2IgPSB2c3JpX25fdTgoZzEsIGIsIDMpOyAgLyogc2hpZnQgYiBhbmQgaW5zZXJ0IGcgKi8gXAorICBjb25zdCB1aW50OHg4eDJfdCByZ2I1NjUgPSBaSVBfVTgocmcsIGdiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2c3QxcV91OChvdXQsIHZjb21iaW5lX3U4KHJnYjU2NS52YWxbMF0sIHJnYjU2NS52YWxbMV0pKTsgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUOChGTVQsIFhTVEVQLCBOLCBzcmNfeSwgc3JjX3V2LCBvdXQsIGN1cl94KSBkbyB7ICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgTjsgaSArPSA4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBvZmYgPSAoKGN1cl94KSArIGkpICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCB5ICA9IHZsZDFfdTgoKHNyY195KSArIChjdXJfeCkgICsgaSk7ICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCB1ICA9IHZsZDFfdTgoKHNyY191dikgKyBpICsgIDApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCB2ICA9IHZsZDFfdTgoKHNyY191dikgKyBpICsgMTYpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBZMCA9IHZyZWludGVycHJldHFfczE2X3UxNih2c2hsbF9uX3U4KHksIDcpKTsgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBVMCA9IHZyZWludGVycHJldHFfczE2X3UxNih2c2hsbF9uX3U4KHUsIDcpKTsgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBWMCA9IHZyZWludGVycHJldHFfczE2X3UxNih2c2hsbF9uX3U4KHYsIDcpKTsgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBZMSA9IHZxZG11bGhxX2xhbmVfczE2KFkwLCBjb2VmZjEsIDApOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBSMCA9IHZxZG11bGhxX2xhbmVfczE2KFYwLCBjb2VmZjEsIDEpOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBHMCA9IHZxZG11bGhxX2xhbmVfczE2KFUwLCBjb2VmZjEsIDIpOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBHMSA9IHZxZG11bGhxX2xhbmVfczE2KFYwLCBjb2VmZjEsIDMpOyAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBCMCA9IHZxZG11bGhxX25fczE2KFUwLCAyODIpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBSMSA9IHZxYWRkcV9zMTYoWTEsIFJfUm91bmRlcik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBHMiA9IHZxYWRkcV9zMTYoWTEsIEdfUm91bmRlcik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBCMSA9IHZxYWRkcV9zMTYoWTEsIEJfUm91bmRlcik7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBSMiA9IHZxYWRkcV9zMTYoUjAsIFIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBHMyA9IHZxYWRkcV9zMTYoRzAsIEcxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBCMiA9IHZxYWRkcV9zMTYoQjAsIEIxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBHNCA9IHZxc3VicV9zMTYoRzIsIEczKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludDE2eDhfdCBCMyA9IHZxYWRkcV9zMTYoQjIsIFUwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCBSID0gdnFzaHJ1bl9uX3MxNihSMiwgWVVWX0ZJWDIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCBHID0gdnFzaHJ1bl9uX3MxNihHNCwgWVVWX0ZJWDIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVpbnQ4eDhfdCBCID0gdnFzaHJ1bl9uX3MxNihCMywgWVVWX0ZJWDIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIFNUT1JFXyAjIyBGTVQob3V0ICsgb2ZmLCBSLCBHLCBCKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBDT05WRVJUMShGVU5DLCBYU1RFUCwgTiwgc3JjX3ksIHNyY191diwgcmdiLCBjdXJfeCkgeyAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgTjsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBvZmYgPSAoKGN1cl94KSArIGkpICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB5ID0gc3JjX3lbKGN1cl94KSArIGldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1ID0gKHNyY191dilbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2ID0gKHNyY191dilbaSArIDE2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoeSwgdSwgdiwgcmdiICsgb2ZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENPTlZFUlQyUkdCXzgoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB1diwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgY3VyX3gsIGxlbikgeyAgICAgICAgICAgICAgICBcCisgIENPTlZFUlQ4KEZNVCwgWFNURVAsIGxlbiwgdG9wX3ksIHV2LCB0b3BfZHN0LCBjdXJfeCk7ICAgICAgICAgICAgICAgICBcCisgIGlmIChib3R0b21feSAhPSBOVUxMKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ09OVkVSVDgoRk1ULCBYU1RFUCwgbGVuLCBib3R0b21feSwgKHV2KSArIDMyLCBib3R0b21fZHN0LCBjdXJfeCk7ICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ09OVkVSVDJSR0JfMShGVU5DLCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCB1diwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICB0b3BfZHN0LCBib3R0b21fZHN0LCBjdXJfeCwgbGVuKSB7ICAgICAgICAgICAgICAgIFwKKyAgQ09OVkVSVDEoRlVOQywgWFNURVAsIGxlbiwgdG9wX3ksIHV2LCB0b3BfZHN0LCBjdXJfeCk7ICAgICAgICAgICAgICAgIFwKKyAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDT05WRVJUMShGVU5DLCBYU1RFUCwgbGVuLCBib3R0b21feSwgKHV2KSArIDMyLCBib3R0b21fZHN0LCBjdXJfeCk7IFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBORU9OX1VQU0FNUExFX0ZVTkMoRlVOQ19OQU1FLCBGTVQsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QgKnRvcF95LCBjb25zdCB1aW50OF90ICpib3R0b21feSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRvcF91LCBjb25zdCB1aW50OF90ICp0b3BfdiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmN1cl91LCBjb25zdCB1aW50OF90ICpjdXJfdiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnRvcF9kc3QsIHVpbnQ4X3QgKmJvdHRvbV9kc3QsIGludCBsZW4pIHsgXAorICBpbnQgYmxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiAxNiBieXRlIGFsaWduZWQgYXJyYXkgdG8gY2FjaGUgcmVjb25zdHJ1Y3RlZCB1IGFuZCB2ICovICAgICAgICAgICAgXAorICB1aW50OF90IHV2X2J1ZlsyICogMzIgKyAxNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90ICpjb25zdCByX3V2ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgXAorICBjb25zdCBpbnQgdXZfbGVuID0gKGxlbiArIDEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiA5IHBpeGVscyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbnVtX2Jsb2NrcyA9ICh1dl9sZW4gLSAxKSA+PiAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGVmdG92ZXIgPSB1dl9sZW4gLSBudW1fYmxvY2tzICogODsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgbGFzdF9wb3MgPSAxICsgMTYgKiBudW1fYmxvY2tzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdV9kaWFnID0gKCh0b3BfdVswXSArIGN1cl91WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdl9kaWFnID0gKCh0b3BfdlswXSArIGN1cl92WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng0X3QgY29lZmYxID0gdmxkMV9zMTYoa0NvZWZmczEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng4X3QgUl9Sb3VuZGVyID0gdmR1cHFfbl9zMTYoLTE0MjM0KTsgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng4X3QgR19Sb3VuZGVyID0gdmR1cHFfbl9zMTYoODcwOCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQxNng4X3QgQl9Sb3VuZGVyID0gdmR1cHFfbl9zMTYoLTE3Njg1KTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBUcmVhdCB0aGUgZmlyc3QgcGl4ZWwgaW4gcmVndWxhciB3YXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhc3NlcnQodG9wX3kgIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1MCA9ICh0b3BfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2MCA9ICh0b3BfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOFl1dlRvICMjIEZNVCh0b3BfeVswXSwgdTAsIHYwLCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1MCA9IChjdXJfdVswXSArIHVfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2MCA9IChjdXJfdlswXSArIHZfZGlhZykgPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFZQOFl1dlRvICMjIEZNVChib3R0b21feVswXSwgdTAsIHYwLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGJsb2NrID0gMDsgYmxvY2sgPCBudW1fYmxvY2tzOyArK2Jsb2NrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzE2UElYRUxTKHRvcF91LCBjdXJfdSwgcl91dik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFXzE2UElYRUxTKHRvcF92LCBjdXJfdiwgcl91diArIDE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZFUlQyUkdCXzgoRk1ULCBYU1RFUCwgdG9wX3ksIGJvdHRvbV95LCByX3V2LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgdG9wX2RzdCwgYm90dG9tX2RzdCwgMTYgKiBibG9jayArIDEsIDE2KTsgICAgICAgICAgICAgXAorICAgIHRvcF91ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl91ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvcF92ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN1cl92ICs9IDg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF91LCBjdXJfdSwgbGVmdG92ZXIsIHJfdXYpOyAgICAgICAgICAgICAgICAgICAgXAorICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92LCBjdXJfdiwgbGVmdG92ZXIsIHJfdXYgKyAxNik7ICAgICAgICAgICAgICAgXAorICBDT05WRVJUMlJHQl8xKFZQOFl1dlRvICMjIEZNVCwgWFNURVAsIHRvcF95LCBib3R0b21feSwgcl91diwgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGxhc3RfcG9zLCBsZW4gLSBsYXN0X3Bvcyk7ICAgICAgICAgXAorfQorCisvLyBORU9OIHZhcmlhbnRzIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXIuCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXJfTkVPTiwgUmdiYSwgNCkKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJncmFMaW5lUGFpcl9ORU9OLCBCZ3JhLCA0KQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyX05FT04sICBSZ2IsICAzKQorTkVPTl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyTGluZVBhaXJfTkVPTiwgIEJnciwgIDMpCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVBcmdiTGluZVBhaXJfTkVPTiwgQXJnYiwgNCkKK05FT05fVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfTkVPTiwgUmdiYTQ0NDQsIDIpCitORU9OX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9ORU9OLCBSZ2I1NjUsIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiBXZWJQVXBzYW1wbGVMaW5lUGFpckZ1bmMgV2ViUFVwc2FtcGxlcnNbLyogTU9ERV9MQVNUICovXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzTkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc05FT04odm9pZCkgeworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFdID0gVXBzYW1wbGVSZ2JhTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JBXSA9IFVwc2FtcGxlQmdyYUxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX2JnckFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfTkVPTjsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCXSAgPSBVcHNhbXBsZVJnYkxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQVJHQl0gPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9ORU9OOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0FyZ2JdID0gVXBzYW1wbGVBcmdiTGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JfNTY1XSA9IFVwc2FtcGxlUmdiNTY1TGluZVBhaXJfTkVPTjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX05FT047CisgIFdlYlBVcHNhbXBsZXJzW01PREVfcmdiQV80NDQ0XSA9IFVwc2FtcGxlUmdiYTQ0NDRMaW5lUGFpcl9ORU9OOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisjZW5kaWYgIC8vIFdFQlBfVVNFX05FT04KKworI2lmICEoZGVmaW5lZChGQU5DWV9VUFNBTVBMSU5HKSAmJiBkZWZpbmVkKFdFQlBfVVNFX05FT04pKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0VXBzYW1wbGVyc05FT04pCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AvdXBzYW1wbGluZ19zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1YTM3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlMi5jCkBAIC0wLDAgKzEsMjczIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU1NFMiB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2lmZGVmIEZBTkNZX1VQU0FNUExJTkcKKworLy8gV2UgY29tcHV0ZSAoOSphICsgMypiICsgMypjICsgZCArIDgpIC8gMTYgYXMgZm9sbG93cworLy8gdSA9ICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNgorLy8gICA9IChhICsgKGEgKyAzKmIgKyAzKmMgKyBkKSAvIDggKyAxKSAvIDIKKy8vICAgPSAoYSArIG0gKyAxKSAvIDIKKy8vIHdoZXJlIG0gPSAoYSArIDMqYiArIDMqYyArIGQpIC8gOAorLy8gICAgICAgICA9ICgoYSArIGIgKyBjICsgZCkgLyAyICsgYiArIGMpIC8gNAorLy8KKy8vIExldCdzIHNheSAgayA9IChhICsgYiArIGMgKyBkKSAvIDQuCisvLyBXZSBjYW4gY29tcHV0ZSBrIGFzCisvLyBrID0gKHMgKyB0ICsgMSkgLyAyIC0gKChhXmQpIHwgKGJeYykgfCAoc150KSkgJiAxCisvLyB3aGVyZSBzID0gKGEgKyBkICsgMSkgLyAyIGFuZCB0ID0gKGIgKyBjICsgMSkgLyAyCisvLworLy8gVGhlbiBtIGNhbiBiZSB3cml0dGVuIGFzCisvLyBtID0gKGsgKyB0ICsgMSkgLyAyIC0gKCgoYl5jKSAmIChzXnQpKSB8IChrXnQpKSAmIDEKKworLy8gQ29tcHV0ZXMgb3V0ID0gKGsgKyBpbiArIDEpIC8gMiAtICgoaWogJiAoc150KSkgfCAoa15pbikpICYgMQorI2RlZmluZSBHRVRfTShpaiwgaW4sIG91dCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX2F2Z19lcHU4KGssIChpbikpOyAgICAgLyogKGsgKyBpbiArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV9hbmRfc2kxMjgoKGlqKSwgc3QpOyAgIC8qIChpaikgJiAoc150KSAqLyAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDIgPSBfbW1feG9yX3NpMTI4KGssIChpbikpOyAgICAvKiAoa15pbikgKi8gICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX29yX3NpMTI4KHRtcDEsIHRtcDIpOyAgLyogKChpaikgJiAoc150KSkgfCAoa15pbikgKi9cCisgIGNvbnN0IF9fbTEyOGkgdG1wNCA9IF9tbV9hbmRfc2kxMjgodG1wMywgb25lKTsgIC8qICYgMSAtPiBsc2JfY29ycmVjdGlvbiAqLyAgXAorICAob3V0KSA9IF9tbV9zdWJfZXBpOCh0bXAwLCB0bXA0KTsgICAgLyogKGsgKyBpbiArIDEpIC8gMiAtIGxzYl9jb3JyZWN0aW9uICovIFwKK30gd2hpbGUgKDApCisKKy8vIHBhY2sgYW5kIHN0b3JlIHR3byBhbHRlcm5hdGluZyBwaXhlbCByb3dzCisjZGVmaW5lIFBBQ0tfQU5EX1NUT1JFKGEsIGIsIGRhLCBkYiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRfYSA9IF9tbV9hdmdfZXB1OChhLCBkYSk7ICAvKiAoOWEgKyAzYiArIDNjICsgIGQgKyA4KSAvIDE2ICovIFwKKyAgY29uc3QgX19tMTI4aSB0X2IgPSBfbW1fYXZnX2VwdTgoYiwgZGIpOyAgLyogKDNhICsgOWIgKyAgYyArIDNkICsgOCkgLyAxNiAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdF8xID0gX21tX3VucGFja2xvX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRfMiA9IF9tbV91bnBhY2toaV9lcGk4KHRfYSwgdF9iKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMCwgdF8xKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9tbV9zdG9yZV9zaTEyOCgoKF9fbTEyOGkqKShvdXQpKSArIDEsIHRfMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gTG9hZHMgMTcgcGl4ZWxzIGVhY2ggZnJvbSByb3dzIHIxIGFuZCByMiBhbmQgZ2VuZXJhdGVzIDMyIHBpeGVscy4KKyNkZWZpbmUgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgb25lID0gX21tX3NldDFfZXBpOCgxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjEpWzBdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBiID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIxKVsxXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMilbMF0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjIpWzFdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgcyA9IF9tbV9hdmdfZXB1OChhLCBkKTsgICAgICAgIC8qIHMgPSAoYSArIGQgKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHQgPSBfbW1fYXZnX2VwdTgoYiwgYyk7ICAgICAgICAvKiB0ID0gKGIgKyBjICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBzdCA9IF9tbV94b3Jfc2kxMjgocywgdCk7ICAgICAgLyogc3QgPSBzXnQgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGFkID0gX21tX3hvcl9zaTEyOChhLCBkKTsgICAgICAvKiBhZCA9IGFeZCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBiYyA9IF9tbV94b3Jfc2kxMjgoYiwgYyk7ICAgICAgLyogYmMgPSBiXmMgKi8gICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHQxID0gX21tX29yX3NpMTI4KGFkLCBiYyk7ICAgICAvKiAoYV5kKSB8IChiXmMpICovICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MiA9IF9tbV9vcl9zaTEyOCh0MSwgc3QpOyAgICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICovICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDMgPSBfbW1fYW5kX3NpMTI4KHQyLCBvbmUpOyAgIC8qIChhXmQpIHwgKGJeYykgfCAoc150KSAmIDEgKi8gXAorICBjb25zdCBfX20xMjhpIHQ0ID0gX21tX2F2Z19lcHU4KHMsIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBrID0gX21tX3N1Yl9lcGk4KHQ0LCB0Myk7ICAgICAgLyogayA9IChhICsgYiArIGMgKyBkKSAvIDQgKi8gICBcCisgIF9fbTEyOGkgZGlhZzEsIGRpYWcyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgR0VUX00oYmMsIHQsIGRpYWcxKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMSA9IChhICsgM2IgKyAzYyArIGQpIC8gOCAqLyAgICBcCisgIEdFVF9NKGFkLCBzLCBkaWFnMik7ICAgICAgICAgICAgICAgICAgLyogZGlhZzIgPSAoM2EgKyBiICsgYyArIDNkKSAvIDggKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogcGFjayB0aGUgYWx0ZXJuYXRlIHBpeGVscyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFBBQ0tfQU5EX1NUT1JFKGEsIGIsIGRpYWcxLCBkaWFnMiwgKG91dCkgKyAgICAgIDApOyAgLyogc3RvcmUgdG9wICovICAgICAgICAgXAorICBQQUNLX0FORF9TVE9SRShjLCBkLCBkaWFnMiwgZGlhZzEsIChvdXQpICsgMiAqIDMyKTsgIC8qIHN0b3JlIGJvdHRvbSAqLyAgICAgIFwKK30KKworLy8gVHVybiB0aGUgbWFjcm8gaW50byBhIGZ1bmN0aW9uIGZvciByZWR1Y2luZyBjb2RlLXNpemUgd2hlbiBub24tY3JpdGljYWwKK3N0YXRpYyB2b2lkIFVwc2FtcGxlMzJQaXhlbHNfU1NFMihjb25zdCB1aW50OF90IHIxW10sIGNvbnN0IHVpbnQ4X3QgcjJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQpIHsKKyAgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpOworfQorCisjZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHIxWzE3XSwgcjJbMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIxLCAodGIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtc2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCisgIG1lbXNldChyMiArIChudW1fcGl4ZWxzKSwgcjJbKG51bV9waXhlbHMpIC0gMV0sIDE3IC0gKG51bV9waXhlbHMpKTsgICAgICAgICAgXAorICAvKiB1c2luZyB0aGUgc2hhcmVkIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIG1hY3JvIHNhdmVzIH4zayBjb2RlIHNpemUgKi8gICAgIFwKKyAgVXBzYW1wbGUzMlBpeGVsc19TU0UyKHIxLCByMiwgb3V0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVU5DIyMzMl9TU0UyKCh0b3BfeSkgKyAoY3VyX3gpLCByX3UsIHJfdiwgKHRvcF9kc3QpICsgKGN1cl94KSAqIChYU1RFUCkpOyAgIFwKKyAgaWYgKChib3R0b21feSkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyMjMzJfU1NFMigoYm90dG9tX3kpICsgKGN1cl94KSwgcl91ICsgNjQsIHJfdiArIDY0LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKGJvdHRvbV9kc3QpICsgKGN1cl94KSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNTRTJfVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHV2X3BvcywgcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIDE2Ynl0ZS1hbGlnbmVkIGFycmF5IHRvIGNhY2hlIHJlY29uc3RydWN0ZWQgdSBhbmQgdiAqLyAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHV2X2J1ZlsxNCAqIDMyICsgMTVdID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCogY29uc3Qgcl91ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHJfdiA9IHJfdSArIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF95ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAvKiBUcmVhdCB0aGUgZmlyc3QgcGl4ZWwgaW4gcmVndWxhciB3YXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdl9kaWFnID0gKCh0b3BfdlswXSArIGN1cl92WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHUwX3QgPSAodG9wX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2MF90ID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHRvcF95WzBdLCB1MF90LCB2MF90LCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgaW50IHUwX2IgPSAoY3VyX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IGludCB2MF9iID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzBdLCB1MF9iLCB2MF9iLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIEZvciBVUFNBTVBMRV8zMlBJWEVMUywgMTcgdS92IHZhbHVlcyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgXAorICBmb3IgKHBvcyA9IDEsIHV2X3BvcyA9IDA7IHBvcyArIDMyICsgMSA8PSBsZW47IHBvcyArPSAzMiwgdXZfcG9zICs9IDE2KSB7ICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdSArIHV2X3BvcywgY3VyX3UgKyB1dl9wb3MsIHJfdSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3YgKyB1dl9wb3MsIGN1cl92ICsgdXZfcG9zLCByX3YpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHRvcF9kc3QsIGJvdHRvbV9kc3QsIHBvcyk7ICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gPiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSAoKGxlbiArIDEpID4+IDEpIC0gKHBvcyA+PiAxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfdG9wX2RzdCA9IHJfdSArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX2JvdHRvbV9kc3QgPSB0bXBfdG9wX2RzdCArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF90b3AgPSB0bXBfYm90dG9tX2RzdCArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfYm90dG9tID0gKGJvdHRvbV95ID09IE5VTEwpID8gTlVMTCA6IHRtcF90b3AgKyAzMjsgICAgICBcCisgICAgYXNzZXJ0KGxlZnRfb3ZlciA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCBsZWZ0X292ZXIsIHJfdSk7ICAgICAgIFwKKyAgICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3BvcywgbGVmdF9vdmVyLCByX3YpOyAgICAgICBcCisgICAgbWVtY3B5KHRtcF90b3AsIHRvcF95ICsgcG9zLCBsZW4gLSBwb3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSBtZW1jcHkodG1wX2JvdHRvbSwgYm90dG9tX3kgKyBwb3MsIGxlbiAtIHBvcyk7ICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG1wX3RvcCwgdG1wX2JvdHRvbSwgdG1wX3RvcF9kc3QsICAgICAgICAgICAgICBcCisgICAgICAgICB0bXBfYm90dG9tX2RzdCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSh0b3BfZHN0ICsgcG9zICogKFhTVEVQKSwgdG1wX3RvcF9kc3QsIChsZW4gLSBwb3MpICogKFhTVEVQKSk7ICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtZW1jcHkoYm90dG9tX2RzdCArIHBvcyAqIChYU1RFUCksIHRtcF9ib3R0b21fZHN0LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIChsZW4gLSBwb3MpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBTU0UyIHZhcmlhbnRzIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXIuCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JhTGluZVBhaXJfU1NFMiwgVlA4WXV2VG9SZ2JhLCA0KQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQmdyYUxpbmVQYWlyX1NTRTIsIFZQOFl1dlRvQmdyYSwgNCkKKworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYkxpbmVQYWlyX1NTRTIsICBWUDhZdXZUb1JnYiwgIDMpCitTU0UyX1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVCZ3JMaW5lUGFpcl9TU0UyLCAgVlA4WXV2VG9CZ3IsICAzKQorU1NFMl9VUFNBTVBMRV9GVU5DKFVwc2FtcGxlQXJnYkxpbmVQYWlyX1NTRTIsIFZQOFl1dlRvQXJnYiwgNCkKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfU1NFMiwgVlA4WXV2VG9SZ2JhNDQ0NCwgMikKK1NTRTJfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZVJnYjU2NUxpbmVQYWlyX1NTRTIsIFZQOFl1dlRvUmdiNTY1LCAyKQorI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBHRVRfTQorI3VuZGVmIFBBQ0tfQU5EX1NUT1JFCisjdW5kZWYgVVBTQU1QTEVfMzJQSVhFTFMKKyN1bmRlZiBVUFNBTVBMRV9MQVNUX0JMT0NLCisjdW5kZWYgQ09OVkVSVDJSR0IKKyN1bmRlZiBDT05WRVJUMlJHQl8zMgorI3VuZGVmIFNTRTJfVVBTQU1QTEVfRlVOQworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworZXh0ZXJuIFdlYlBVcHNhbXBsZUxpbmVQYWlyRnVuYyBXZWJQVXBzYW1wbGVyc1svKiBNT0RFX0xBU1QgKi9dOworCitleHRlcm4gdm9pZCBXZWJQSW5pdFVwc2FtcGxlcnNTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFMih2b2lkKSB7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfUkdCQV0gPSBVcHNhbXBsZVJnYmFMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX0JHUkFdID0gVXBzYW1wbGVCZ3JhTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXSA9IFVwc2FtcGxlUmdiYUxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfYmdyQV0gPSBVcHNhbXBsZUJncmFMaW5lUGFpcl9TU0UyOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICA9IFVwc2FtcGxlUmdiTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9CR1JdICA9IFVwc2FtcGxlQmdyTGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9BUkdCXSA9IFVwc2FtcGxlQXJnYkxpbmVQYWlyX1NTRTI7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQXJnYl0gPSBVcHNhbXBsZUFyZ2JMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQl81NjVdID0gVXBzYW1wbGVSZ2I1NjVMaW5lUGFpcl9TU0UyOworICBXZWJQVXBzYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBVcHNhbXBsZVJnYmE0NDQ0TGluZVBhaXJfU1NFMjsKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9yZ2JBXzQ0NDRdID0gVXBzYW1wbGVSZ2JhNDQ0NExpbmVQYWlyX1NTRTI7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2VuZGlmICAvLyBGQU5DWV9VUFNBTVBMSU5HCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiBXZWJQWVVWNDQ0Q29udmVydGVyIFdlYlBZVVY0NDRDb252ZXJ0ZXJzWy8qIE1PREVfTEFTVCAqL107CitleHRlcm4gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0UyKHZvaWQpOworCisjZGVmaW5lIFlVVjQ0NF9GVU5DKEZVTkNfTkFNRSwgQ0FMTCwgQ0FMTF9DLCBYU1RFUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZXh0ZXJuIHZvaWQgQ0FMTF9DKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBGVU5DX05BTUUoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCBtYXhfbGVuID0gbGVuICYgfjMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgbWF4X2xlbjsgaSArPSAzMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxMKHkgKyBpLCB1ICsgaSwgdiArIGksIGRzdCArIGkgKiAoWFNURVApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaSA8IGxlbikgeyAgLyogQy1mYWxsYmFjayAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDQUxMX0MoeSArIGksIHUgKyBpLCB2ICsgaSwgZHN0ICsgaSAqIChYU1RFUCksIGxlbiAtIGkpOyAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYmFfU1NFMiwgVlA4WXV2VG9SZ2JhMzJfU1NFMiwgV2ViUFl1djQ0NFRvUmdiYV9DLCA0KTsKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvQmdyYV9TU0UyLCBWUDhZdXZUb0JncmEzMl9TU0UyLCBXZWJQWXV2NDQ0VG9CZ3JhX0MsIDQpOworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiX1NTRTIsIFZQOFl1dlRvUmdiMzJfU1NFMiwgV2ViUFl1djQ0NFRvUmdiX0MsIDMpOworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JfU1NFMiwgVlA4WXV2VG9CZ3IzMl9TU0UyLCBXZWJQWXV2NDQ0VG9CZ3JfQywgMyk7CitZVVY0NDRfRlVOQyhZdXY0NDRUb0FyZ2JfU1NFMiwgVlA4WXV2VG9BcmdiMzJfU1NFMiwgV2ViUFl1djQ0NFRvQXJnYl9DLCA0KQorWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9SZ2JhNDQ0NF9TU0UyLCBWUDhZdXZUb1JnYmE0NDQ0MzJfU1NFMiwgXAorICAgICAgICAgICAgV2ViUFl1djQ0NFRvUmdiYTQ0NDRfQywgMikKK1lVVjQ0NF9GVU5DKFl1djQ0NFRvUmdiNTY1X1NTRTIsIFZQOFl1dlRvUmdiNTY1MzJfU1NFMiwgV2ViUFl1djQ0NFRvUmdiNTY1X0MsIDIpCisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIodm9pZCkgeworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFdICAgICAgPSBZdXY0NDRUb1JnYmFfU1NFMjsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JBXSAgICAgID0gWXV2NDQ0VG9CZ3JhX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfcmdiQV0gICAgICA9IFl1djQ0NFRvUmdiYV9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX2JnckFdICAgICAgPSBZdXY0NDRUb0JncmFfU1NFMjsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXSAgICAgICA9IFl1djQ0NFRvUmdiX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQkdSXSAgICAgICA9IFl1djQ0NFRvQmdyX1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQVJHQl0gICAgICA9IFl1djQ0NFRvQXJnYl9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBZdXY0NDRUb1JnYmE0NDQ0X1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfUkdCXzU2NV0gICA9IFl1djQ0NFRvUmdiNTY1X1NTRTI7CisgIFdlYlBZVVY0NDRDb252ZXJ0ZXJzW01PREVfQXJnYl0gICAgICA9IFl1djQ0NFRvQXJnYl9TU0UyOworICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBZdXY0NDRUb1JnYmE0NDQ0X1NTRTI7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2Vsc2UKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTIpCisKKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorCisjaWYgIShkZWZpbmVkKEZBTkNZX1VQU0FNUExJTkcpICYmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRVcHNhbXBsZXJzU1NFMikKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3Vwc2FtcGxpbmdfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM0ZGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC91cHNhbXBsaW5nX3NzZTQxLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTU0U0MSB2ZXJzaW9uIG9mIFlVViB0byBSR0IgdXBzYW1wbGluZyBmdW5jdGlvbnMuCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWZkZWYgRkFOQ1lfVVBTQU1QTElORworCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorCisvLyBXZSBjb21wdXRlICg5KmEgKyAzKmIgKyAzKmMgKyBkICsgOCkgLyAxNiBhcyBmb2xsb3dzCisvLyB1ID0gKDkqYSArIDMqYiArIDMqYyArIGQgKyA4KSAvIDE2CisvLyAgID0gKGEgKyAoYSArIDMqYiArIDMqYyArIGQpIC8gOCArIDEpIC8gMgorLy8gICA9IChhICsgbSArIDEpIC8gMgorLy8gd2hlcmUgbSA9IChhICsgMypiICsgMypjICsgZCkgLyA4CisvLyAgICAgICAgID0gKChhICsgYiArIGMgKyBkKSAvIDIgKyBiICsgYykgLyA0CisvLworLy8gTGV0J3Mgc2F5ICBrID0gKGEgKyBiICsgYyArIGQpIC8gNC4KKy8vIFdlIGNhbiBjb21wdXRlIGsgYXMKKy8vIGsgPSAocyArIHQgKyAxKSAvIDIgLSAoKGFeZCkgfCAoYl5jKSB8IChzXnQpKSAmIDEKKy8vIHdoZXJlIHMgPSAoYSArIGQgKyAxKSAvIDIgYW5kIHQgPSAoYiArIGMgKyAxKSAvIDIKKy8vCisvLyBUaGVuIG0gY2FuIGJlIHdyaXR0ZW4gYXMKKy8vIG0gPSAoayArIHQgKyAxKSAvIDIgLSAoKChiXmMpICYgKHNedCkpIHwgKGtedCkpICYgMQorCisvLyBDb21wdXRlcyBvdXQgPSAoayArIGluICsgMSkgLyAyIC0gKChpaiAmIChzXnQpKSB8IChrXmluKSkgJiAxCisjZGVmaW5lIEdFVF9NKGlqLCBpbiwgb3V0KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fYXZnX2VwdTgoaywgKGluKSk7ICAgICAvKiAoayArIGluICsgMSkgLyAyICovICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAxID0gX21tX2FuZF9zaTEyOCgoaWopLCBzdCk7ICAgLyogKGlqKSAmIChzXnQpICovICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV94b3Jfc2kxMjgoaywgKGluKSk7ICAgIC8qIChrXmluKSAqLyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHRtcDMgPSBfbW1fb3Jfc2kxMjgodG1wMSwgdG1wMik7ICAvKiAoKGlqKSAmIChzXnQpKSB8IChrXmluKSAqL1wKKyAgY29uc3QgX19tMTI4aSB0bXA0ID0gX21tX2FuZF9zaTEyOCh0bXAzLCBvbmUpOyAgLyogJiAxIC0+IGxzYl9jb3JyZWN0aW9uICovICBcCisgIChvdXQpID0gX21tX3N1Yl9lcGk4KHRtcDAsIHRtcDQpOyAgICAvKiAoayArIGluICsgMSkgLyAyIC0gbHNiX2NvcnJlY3Rpb24gKi8gXAorfSB3aGlsZSAoMCkKKworLy8gcGFjayBhbmQgc3RvcmUgdHdvIGFsdGVybmF0aW5nIHBpeGVsIHJvd3MKKyNkZWZpbmUgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGEsIGRiLCBvdXQpIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF9hID0gX21tX2F2Z19lcHU4KGEsIGRhKTsgIC8qICg5YSArIDNiICsgM2MgKyAgZCArIDgpIC8gMTYgKi8gXAorICBjb25zdCBfX20xMjhpIHRfYiA9IF9tbV9hdmdfZXB1OChiLCBkYik7ICAvKiAoM2EgKyA5YiArICBjICsgM2QgKyA4KSAvIDE2ICovIFwKKyAgY29uc3QgX19tMTI4aSB0XzEgPSBfbW1fdW5wYWNrbG9fZXBpOCh0X2EsIHRfYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdF8yID0gX21tX3VucGFja2hpX2VwaTgodF9hLCB0X2IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfbW1fc3RvcmVfc2kxMjgoKChfX20xMjhpKikob3V0KSkgKyAwLCB0XzEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgX21tX3N0b3JlX3NpMTI4KCgoX19tMTI4aSopKG91dCkpICsgMSwgdF8yKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBMb2FkcyAxNyBwaXhlbHMgZWFjaCBmcm9tIHJvd3MgcjEgYW5kIHIyIGFuZCBnZW5lcmF0ZXMgMzIgcGl4ZWxzLgorI2RlZmluZSBVUFNBTVBMRV8zMlBJWEVMUyhyMSwgcjIsIG91dCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBvbmUgPSBfbW1fc2V0MV9lcGk4KDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMSlbMF0pOyAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKSYocjEpWzFdKTsgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBjID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikmKHIyKVswXSk7ICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgZCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopJihyMilbMV0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBzID0gX21tX2F2Z19lcHU4KGEsIGQpOyAgICAgICAgLyogcyA9IChhICsgZCArIDEpIC8gMiAqLyAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdCA9IF9tbV9hdmdfZXB1OChiLCBjKTsgICAgICAgIC8qIHQgPSAoYiArIGMgKyAxKSAvIDIgKi8gICAgICAgXAorICBjb25zdCBfX20xMjhpIHN0ID0gX21tX3hvcl9zaTEyOChzLCB0KTsgICAgICAvKiBzdCA9IHNedCAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgYWQgPSBfbW1feG9yX3NpMTI4KGEsIGQpOyAgICAgIC8qIGFkID0gYV5kICovICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGJjID0gX21tX3hvcl9zaTEyOChiLCBjKTsgICAgICAvKiBiYyA9IGJeYyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdDEgPSBfbW1fb3Jfc2kxMjgoYWQsIGJjKTsgICAgIC8qIChhXmQpIHwgKGJeYykgKi8gICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIHQyID0gX21tX29yX3NpMTI4KHQxLCBzdCk7ICAgICAvKiAoYV5kKSB8IChiXmMpIHwgKHNedCkgKi8gICAgIFwKKyAgY29uc3QgX19tMTI4aSB0MyA9IF9tbV9hbmRfc2kxMjgodDIsIG9uZSk7ICAgLyogKGFeZCkgfCAoYl5jKSB8IChzXnQpICYgMSAqLyBcCisgIGNvbnN0IF9fbTEyOGkgdDQgPSBfbW1fYXZnX2VwdTgocywgdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIGsgPSBfbW1fc3ViX2VwaTgodDQsIHQzKTsgICAgICAvKiBrID0gKGEgKyBiICsgYyArIGQpIC8gNCAqLyAgIFwKKyAgX19tMTI4aSBkaWFnMSwgZGlhZzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBHRVRfTShiYywgdCwgZGlhZzEpOyAgICAgICAgICAgICAgICAgIC8qIGRpYWcxID0gKGEgKyAzYiArIDNjICsgZCkgLyA4ICovICAgIFwKKyAgR0VUX00oYWQsIHMsIGRpYWcyKTsgICAgICAgICAgICAgICAgICAvKiBkaWFnMiA9ICgzYSArIGIgKyBjICsgM2QpIC8gOCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBwYWNrIHRoZSBhbHRlcm5hdGUgcGl4ZWxzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUEFDS19BTkRfU1RPUkUoYSwgYiwgZGlhZzEsIGRpYWcyLCAob3V0KSArICAgICAgMCk7ICAvKiBzdG9yZSB0b3AgKi8gICAgICAgICBcCisgIFBBQ0tfQU5EX1NUT1JFKGMsIGQsIGRpYWcyLCBkaWFnMSwgKG91dCkgKyAyICogMzIpOyAgLyogc3RvcmUgYm90dG9tICovICAgICAgXAorfQorCisvLyBUdXJuIHRoZSBtYWNybyBpbnRvIGEgZnVuY3Rpb24gZm9yIHJlZHVjaW5nIGNvZGUtc2l6ZSB3aGVuIG5vbi1jcml0aWNhbAorc3RhdGljIHZvaWQgVXBzYW1wbGUzMlBpeGVsc19TU0U0MShjb25zdCB1aW50OF90IHIxW10sIGNvbnN0IHVpbnQ4X3QgcjJbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBvdXQpIHsKKyAgVVBTQU1QTEVfMzJQSVhFTFMocjEsIHIyLCBvdXQpOworfQorCisjZGVmaW5lIFVQU0FNUExFX0xBU1RfQkxPQ0sodGIsIGJiLCBudW1fcGl4ZWxzLCBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHIxWzE3XSwgcjJbMTddOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtY3B5KHIxLCAodGIpLCAobnVtX3BpeGVscykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG1lbWNweShyMiwgKGJiKSwgKG51bV9waXhlbHMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiByZXBsaWNhdGUgbGFzdCBieXRlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbWVtc2V0KHIxICsgKG51bV9waXhlbHMpLCByMVsobnVtX3BpeGVscykgLSAxXSwgMTcgLSAobnVtX3BpeGVscykpOyAgICAgICAgICBcCisgIG1lbXNldChyMiArIChudW1fcGl4ZWxzKSwgcjJbKG51bV9waXhlbHMpIC0gMV0sIDE3IC0gKG51bV9waXhlbHMpKTsgICAgICAgICAgXAorICAvKiB1c2luZyB0aGUgc2hhcmVkIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIG1hY3JvIHNhdmVzIH4zayBjb2RlIHNpemUgKi8gICAgIFwKKyAgVXBzYW1wbGUzMlBpeGVsc19TU0U0MShyMSwgcjIsIG91dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ09OVkVSVDJSR0JfMzIoRlVOQywgWFNURVAsIHRvcF95LCBib3R0b21feSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHRvcF9kc3QsIGJvdHRvbV9kc3QsIGN1cl94KSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICBGVU5DIyMzMl9TU0U0MSgodG9wX3kpICsgKGN1cl94KSwgcl91LCByX3YsICh0b3BfZHN0KSArIChjdXJfeCkgKiAoWFNURVApKTsgIFwKKyAgaWYgKChib3R0b21feSkgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyMjMzJfU1NFNDEoKGJvdHRvbV95KSArIChjdXJfeCksIHJfdSArIDY0LCByX3YgKyA2NCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKGJvdHRvbV9kc3QpICsgKGN1cl94KSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIFNTRTRfVVBTQU1QTEVfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHRvcF95LCBjb25zdCB1aW50OF90KiBib3R0b21feSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB0b3BfdSwgY29uc3QgdWludDhfdCogdG9wX3YsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY3VyX3UsIGNvbnN0IHVpbnQ4X3QqIGN1cl92LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRvcF9kc3QsIHVpbnQ4X3QqIGJvdHRvbV9kc3QsIGludCBsZW4pIHsgICAgICAgIFwKKyAgaW50IHV2X3BvcywgcG9zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIDE2Ynl0ZS1hbGlnbmVkIGFycmF5IHRvIGNhY2hlIHJlY29uc3RydWN0ZWQgdSBhbmQgdiAqLyAgICAgICAgICAgICAgICAgICAgXAorICB1aW50OF90IHV2X2J1ZlsxNCAqIDMyICsgMTVdID0geyAwIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDhfdCogY29uc3Qgcl91ID0gKHVpbnQ4X3QqKSgodWludHB0cl90KSh1dl9idWYgKyAxNSkgJiB+MTUpOyAgICAgICAgICAgICBcCisgIHVpbnQ4X3QqIGNvbnN0IHJfdiA9IHJfdSArIDMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXNzZXJ0KHRvcF95ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAvKiBUcmVhdCB0aGUgZmlyc3QgcGl4ZWwgaW4gcmVndWxhciB3YXkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB1X2RpYWcgPSAoKHRvcF91WzBdICsgY3VyX3VbMF0pID4+IDEpICsgMTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBpbnQgdl9kaWFnID0gKCh0b3BfdlswXSArIGN1cl92WzBdKSA+PiAxKSArIDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50IHUwX3QgPSAodG9wX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCB2MF90ID0gKHRvcF92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHRvcF95WzBdLCB1MF90LCB2MF90LCB0b3BfZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGJvdHRvbV95ICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgaW50IHUwX2IgPSAoY3VyX3VbMF0gKyB1X2RpYWcpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IGludCB2MF9iID0gKGN1cl92WzBdICsgdl9kaWFnKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBGVU5DKGJvdHRvbV95WzBdLCB1MF9iLCB2MF9iLCBib3R0b21fZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIC8qIEZvciBVUFNBTVBMRV8zMlBJWEVMUywgMTcgdS92IHZhbHVlcyBtdXN0IGJlIHJlYWQtYWJsZSBmb3IgZWFjaCBibG9jayAqLyAgXAorICBmb3IgKHBvcyA9IDEsIHV2X3BvcyA9IDA7IHBvcyArIDMyICsgMSA8PSBsZW47IHBvcyArPSAzMiwgdXZfcG9zICs9IDE2KSB7ICAgIFwKKyAgICBVUFNBTVBMRV8zMlBJWEVMUyh0b3BfdSArIHV2X3BvcywgY3VyX3UgKyB1dl9wb3MsIHJfdSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgVVBTQU1QTEVfMzJQSVhFTFModG9wX3YgKyB1dl9wb3MsIGN1cl92ICsgdXZfcG9zLCByX3YpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIENPTlZFUlQyUkdCXzMyKEZVTkMsIFhTVEVQLCB0b3BfeSwgYm90dG9tX3ksIHRvcF9kc3QsIGJvdHRvbV9kc3QsIHBvcyk7ICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gPiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGludCBsZWZ0X292ZXIgPSAoKGxlbiArIDEpID4+IDEpIC0gKHBvcyA+PiAxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfdG9wX2RzdCA9IHJfdSArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWludDhfdCogY29uc3QgdG1wX2JvdHRvbV9kc3QgPSB0bXBfdG9wX2RzdCArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF90b3AgPSB0bXBfYm90dG9tX2RzdCArIDQgKiAzMjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50OF90KiBjb25zdCB0bXBfYm90dG9tID0gKGJvdHRvbV95ID09IE5VTEwpID8gTlVMTCA6IHRtcF90b3AgKyAzMjsgICAgICBcCisgICAgYXNzZXJ0KGxlZnRfb3ZlciA+IDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFVQU0FNUExFX0xBU1RfQkxPQ0sodG9wX3UgKyB1dl9wb3MsIGN1cl91ICsgdXZfcG9zLCBsZWZ0X292ZXIsIHJfdSk7ICAgICAgIFwKKyAgICBVUFNBTVBMRV9MQVNUX0JMT0NLKHRvcF92ICsgdXZfcG9zLCBjdXJfdiArIHV2X3BvcywgbGVmdF9vdmVyLCByX3YpOyAgICAgICBcCisgICAgbWVtY3B5KHRtcF90b3AsIHRvcF95ICsgcG9zLCBsZW4gLSBwb3MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChib3R0b21feSAhPSBOVUxMKSBtZW1jcHkodG1wX2JvdHRvbSwgYm90dG9tX3kgKyBwb3MsIGxlbiAtIHBvcyk7ICAgICAgIFwKKyAgICBDT05WRVJUMlJHQl8zMihGVU5DLCBYU1RFUCwgdG1wX3RvcCwgdG1wX2JvdHRvbSwgdG1wX3RvcF9kc3QsICAgICAgICAgICAgICBcCisgICAgICAgICB0bXBfYm90dG9tX2RzdCwgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSh0b3BfZHN0ICsgcG9zICogKFhTVEVQKSwgdG1wX3RvcF9kc3QsIChsZW4gLSBwb3MpICogKFhTVEVQKSk7ICAgICAgIFwKKyAgICBpZiAoYm90dG9tX3kgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBtZW1jcHkoYm90dG9tX2RzdCArIHBvcyAqIChYU1RFUCksIHRtcF9ib3R0b21fZHN0LCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIChsZW4gLSBwb3MpICogKFhTVEVQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBTU0U0IHZhcmlhbnRzIG9mIHRoZSBmYW5jeSB1cHNhbXBsZXIuCitTU0U0X1VQU0FNUExFX0ZVTkMoVXBzYW1wbGVSZ2JMaW5lUGFpcl9TU0U0MSwgIFZQOFl1dlRvUmdiLCAgMykKK1NTRTRfVVBTQU1QTEVfRlVOQyhVcHNhbXBsZUJnckxpbmVQYWlyX1NTRTQxLCAgVlA4WXV2VG9CZ3IsICAzKQorCisjdW5kZWYgR0VUX00KKyN1bmRlZiBQQUNLX0FORF9TVE9SRQorI3VuZGVmIFVQU0FNUExFXzMyUElYRUxTCisjdW5kZWYgVVBTQU1QTEVfTEFTVF9CTE9DSworI3VuZGVmIENPTlZFUlQyUkdCCisjdW5kZWYgQ09OVkVSVDJSR0JfMzIKKyN1bmRlZiBTU0U0X1VQU0FNUExFX0ZVTkMKKworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIFdlYlBVcHNhbXBsZXJzWy8qIE1PREVfTEFTVCAqL107CisKK2V4dGVybiB2b2lkIFdlYlBJbml0VXBzYW1wbGVyc1NTRTQxKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRVcHNhbXBsZXJzU1NFNDEodm9pZCkgeworI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKKyAgV2ViUFVwc2FtcGxlcnNbTU9ERV9SR0JdICA9IFVwc2FtcGxlUmdiTGluZVBhaXJfU1NFNDE7CisgIFdlYlBVcHNhbXBsZXJzW01PREVfQkdSXSAgPSBVcHNhbXBsZUJnckxpbmVQYWlyX1NTRTQxOworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCit9CisKKyNlbmRpZiAgLy8gRkFOQ1lfVVBTQU1QTElORworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gV2ViUFlVVjQ0NENvbnZlcnRlciBXZWJQWVVWNDQ0Q29udmVydGVyc1svKiBNT0RFX0xBU1QgKi9dOworZXh0ZXJuIHZvaWQgV2ViUEluaXRZVVY0NDRDb252ZXJ0ZXJzU1NFNDEodm9pZCk7CisKKyNkZWZpbmUgWVVWNDQ0X0ZVTkMoRlVOQ19OQU1FLCBDQUxMLCBDQUxMX0MsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitleHRlcm4gdm9pZCBDQUxMX0MoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IG1heF9sZW4gPSBsZW4gJiB+MzE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaSA9IDA7IGkgPCBtYXhfbGVuOyBpICs9IDMyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBTEwoeSArIGksIHUgKyBpLCB2ICsgaSwgZHN0ICsgaSAqIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpIDwgbGVuKSB7ICAvKiBDLWZhbGxiYWNrICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENBTExfQyh5ICsgaSwgdSArIGksIHYgKyBpLCBkc3QgKyBpICogKFhTVEVQKSwgbGVuIC0gaSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitZVVY0NDRfRlVOQyhZdXY0NDRUb1JnYl9TU0U0MSwgVlA4WXV2VG9SZ2IzMl9TU0U0MSwgV2ViUFl1djQ0NFRvUmdiX0MsIDMpOworWVVWNDQ0X0ZVTkMoWXV2NDQ0VG9CZ3JfU1NFNDEsIFZQOFl1dlRvQmdyMzJfU1NFNDEsIFdlYlBZdXY0NDRUb0Jncl9DLCAzKTsKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFlVVjQ0NENvbnZlcnRlcnNTU0U0MSh2b2lkKSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorICBXZWJQWVVWNDQ0Q29udmVydGVyc1tNT0RFX1JHQl0gICAgICAgPSBZdXY0NDRUb1JnYl9TU0U0MTsKKyAgV2ViUFlVVjQ0NENvbnZlcnRlcnNbTU9ERV9CR1JdICAgICAgID0gWXV2NDQ0VG9CZ3JfU1NFNDE7CisjZW5kaWYgICAvLyBXRUJQX1JFRFVDRV9DU1AKK30KKworI2Vsc2UKKworV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0WVVWNDQ0Q29udmVydGVyc1NTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCisKKyNpZiAhKGRlZmluZWQoRkFOQ1lfVVBTQU1QTElORykgJiYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRVcHNhbXBsZXJzU1NFNDEpCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2LmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjdhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5jCkBAIC0wLDAgKzEsMzE2IEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gWVVWLT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbnMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSAic3JjL2RzcC95dXYuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQbGFpbi1DIHZlcnNpb24KKworI2RlZmluZSBST1dfRlVOQyhGVU5DX05BTUUsIEZVTkMsIFhTVEVQKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWludDhfdCogY29uc3QgZW5kID0gZHN0ICsgKGxlbiAmIH4xKSAqIChYU1RFUCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgIHdoaWxlIChkc3QgIT0gZW5kKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZVTkMoeVswXSwgdVswXSwgdlswXSwgZHN0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGVU5DKHlbMV0sIHVbMF0sIHZbMF0sIGRzdCArIChYU1RFUCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeSArPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ICs9IDIgKiAoWFNURVApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaWYgKGxlbiAmIDEpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRlVOQyh5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKy8vIEFsbCB2YXJpYW50cyBpbXBsZW1lbnRlZC4KK1JPV19GVU5DKFl1dlRvUmdiUm93LCAgICAgIFZQOFl1dlRvUmdiLCAgMykKK1JPV19GVU5DKFl1dlRvQmdyUm93LCAgICAgIFZQOFl1dlRvQmdyLCAgMykKK1JPV19GVU5DKFl1dlRvUmdiYVJvdywgICAgIFZQOFl1dlRvUmdiYSwgNCkKK1JPV19GVU5DKFl1dlRvQmdyYVJvdywgICAgIFZQOFl1dlRvQmdyYSwgNCkKK1JPV19GVU5DKFl1dlRvQXJnYlJvdywgICAgIFZQOFl1dlRvQXJnYiwgNCkKK1JPV19GVU5DKFl1dlRvUmdiYTQ0NDRSb3csIFZQOFl1dlRvUmdiYTQ0NDQsIDIpCitST1dfRlVOQyhZdXZUb1JnYjU2NVJvdywgICBWUDhZdXZUb1JnYjU2NSwgMikKKworI3VuZGVmIFJPV19GVU5DCisKKy8vIE1haW4gY2FsbCBmb3IgcHJvY2Vzc2luZyBhIHBsYW5lIHdpdGggYSBXZWJQU2FtcGxlclJvd0Z1bmMgZnVuY3Rpb246Cit2b2lkIFdlYlBTYW1wbGVyUHJvY2Vzc1BsYW5lKGNvbnN0IHVpbnQ4X3QqIHksIGludCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgaW50IHV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBXZWJQU2FtcGxlclJvd0Z1bmMgZnVuYykgeworICBpbnQgajsKKyAgZm9yIChqID0gMDsgaiA8IGhlaWdodDsgKytqKSB7CisgICAgZnVuYyh5LCB1LCB2LCBkc3QsIHdpZHRoKTsKKyAgICB5ICs9IHlfc3RyaWRlOworICAgIGlmIChqICYgMSkgeworICAgICAgdSArPSB1dl9zdHJpZGU7CisgICAgICB2ICs9IHV2X3N0cmlkZTsKKyAgICB9CisgICAgZHN0ICs9IGRzdF9zdHJpZGU7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBjYWxsCisKK1dlYlBTYW1wbGVyUm93RnVuYyBXZWJQU2FtcGxlcnNbTU9ERV9MQVNUXTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc1NTRTIodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFNDEodm9pZCk7CitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFNkc3BSMih2b2lkKTsKKworV0VCUF9EU1BfSU5JVF9GVU5DKFdlYlBJbml0U2FtcGxlcnMpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgICAgICA9IFl1dlRvUmdiUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSAgICAgID0gWXV2VG9SZ2JhUm93OworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICAgICAgID0gWXV2VG9CZ3JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdICAgICAgPSBZdXZUb0JncmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0FSR0JdICAgICAgPSBZdXZUb0FyZ2JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFfNDQ0NF0gPSBZdXZUb1JnYmE0NDQ0Um93OworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JfNTY1XSAgID0gWXV2VG9SZ2I1NjVSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX3JnYkFdICAgICAgPSBZdXZUb1JnYmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX2JnckFdICAgICAgPSBZdXZUb0JncmFSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0FyZ2JdICAgICAgPSBZdXZUb0FyZ2JSb3c7CisgIFdlYlBTYW1wbGVyc1tNT0RFX3JnYkFfNDQ0NF0gPSBZdXZUb1JnYmE0NDQ0Um93OworCisgIC8vIElmIGRlZmluZWQsIHVzZSBDUFVJbmZvKCkgdG8gb3ZlcndyaXRlIHNvbWUgcG9pbnRlcnMgd2l0aCBmYXN0ZXIgdmVyc2lvbnMuCisgIGlmIChWUDhHZXRDUFVJbmZvICE9IE5VTEwpIHsKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzU1NFMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFMgorI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisgICAgaWYgKFZQOEdldENQVUluZm8oa1NTRTRfMSkpIHsKKyAgICAgIFdlYlBJbml0U2FtcGxlcnNTU0U0MSgpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfU1NFNDEKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrTUlQUzMyKSkgeworICAgICAgV2ViUEluaXRTYW1wbGVyc01JUFMzMigpOworICAgIH0KKyNlbmRpZiAgLy8gV0VCUF9VU0VfTUlQUzMyCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQorICAgIC8vIFVuZm9ydHVuYXRlbHksIG9uIGF0IGxlYXN0IG9uZSBTdGFyYm9hcmQgTUlQUyBwbGF0Zm9ybSB0aGUgTUlQUyBEU1AgKHIyKQorICAgIC8vIGNvZGUgd2FzIGZvdW5kIHRvIHByb2R1Y2UgZXJyb25lb3VzIHJlc3VsdHMgKG1vc3QgcGl4ZWxzIGVuZCB1cCBlaXRoZXIKKyAgICAvLyB3aGl0ZSBvciBwdXJwbGUpLiAgSXQgaXMgZGlzYWJsZWQgZm9yIG5vdyBvdXQgb2YgbGFjayBvZiB0aW1lIGFuZAorICAgIC8vIHByaW9yaXR5IGZvciBpbnZlc3RpZ2F0aW9uLCBidXQgaWYgYWRkaXRpb25hbCBwZXJmb3JtYW5jZSBpcyByZXF1aXJlZCwKKyAgICAvLyB0aGUgaXNzdWUgc2hvdWxkIGJlIGludmVzdGlnYXRlZCBhbmQgZml4ZWQgcHJvcGVybHkuCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFNfRFNQX1IyKQorICAgIGlmIChWUDhHZXRDUFVJbmZvKGtNSVBTZHNwUjIpKSB7CisgICAgICBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgorI2VuZGlmCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQVJHQiAtPiBZVVYgY29udmVydGVycworCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvWV9DKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgcCA9IGFyZ2JbaV07CisgICAgeVtpXSA9IFZQOFJHQlRvWSgocCA+PiAxNikgJiAweGZmLCAocCA+PiA4KSAmIDB4ZmYsIChwID4+ICAwKSAmIDB4ZmYsCisgICAgICAgICAgICAgICAgICAgICBZVVZfSEFMRik7CisgIH0KK30KKwordm9pZCBXZWJQQ29udmVydEFSR0JUb1VWX0MoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpIHsKKyAgLy8gTm8gcm91bmRpbmcuIExhc3QgcGl4ZWwgaXMgZGVhbHQgd2l0aCBzZXBhcmF0ZWx5LgorICBjb25zdCBpbnQgdXZfd2lkdGggPSBzcmNfd2lkdGggPj4gMTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB1dl93aWR0aDsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgdjAgPSBhcmdiWzIgKiBpICsgMF07CisgICAgY29uc3QgdWludDMyX3QgdjEgPSBhcmdiWzIgKiBpICsgMV07CisgICAgLy8gVlA4UkdCVG9VL1YgZXhwZWN0cyBmb3VyIGFjY3VtdWxhdGVkIHBpeGVscy4gSGVuY2Ugd2UgbmVlZCB0bworICAgIC8vIHNjYWxlIHIvZy9iIHZhbHVlIGJ5IGEgZmFjdG9yIDIuIFdlIGp1c3Qgc2hpZnQgdjAvdjEgb25lIGJpdCBsZXNzLgorICAgIGNvbnN0IGludCByID0gKCh2MCA+PiAxNSkgJiAweDFmZSkgKyAoKHYxID4+IDE1KSAmIDB4MWZlKTsKKyAgICBjb25zdCBpbnQgZyA9ICgodjAgPj4gIDcpICYgMHgxZmUpICsgKCh2MSA+PiAgNykgJiAweDFmZSk7CisgICAgY29uc3QgaW50IGIgPSAoKHYwIDw8ICAxKSAmIDB4MWZlKSArICgodjEgPDwgIDEpICYgMHgxZmUpOworICAgIGNvbnN0IGludCB0bXBfdSA9IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBjb25zdCBpbnQgdG1wX3YgPSBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgaWYgKGRvX3N0b3JlKSB7CisgICAgICB1W2ldID0gdG1wX3U7CisgICAgICB2W2ldID0gdG1wX3Y7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFwcHJveGltYXRlZCBhdmVyYWdlLW9mLWZvdXIuIEJ1dCBpdCdzIGFuIGFjY2VwdGFibGUgZGlmZi4KKyAgICAgIHVbaV0gPSAodVtpXSArIHRtcF91ICsgMSkgPj4gMTsKKyAgICAgIHZbaV0gPSAodltpXSArIHRtcF92ICsgMSkgPj4gMTsKKyAgICB9CisgIH0KKyAgaWYgKHNyY193aWR0aCAmIDEpIHsgICAgICAgLy8gbGFzdCBwaXhlbAorICAgIGNvbnN0IHVpbnQzMl90IHYwID0gYXJnYlsyICogaSArIDBdOworICAgIGNvbnN0IGludCByID0gKHYwID4+IDE0KSAmIDB4M2ZjOworICAgIGNvbnN0IGludCBnID0gKHYwID4+ICA2KSAmIDB4M2ZjOworICAgIGNvbnN0IGludCBiID0gKHYwIDw8ICAyKSAmIDB4M2ZjOworICAgIGNvbnN0IGludCB0bXBfdSA9IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKTsKKyAgICBjb25zdCBpbnQgdG1wX3YgPSBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgICAgaWYgKGRvX3N0b3JlKSB7CisgICAgICB1W2ldID0gdG1wX3U7CisgICAgICB2W2ldID0gdG1wX3Y7CisgICAgfSBlbHNlIHsKKyAgICAgIHVbaV0gPSAodVtpXSArIHRtcF91ICsgMSkgPj4gMTsKKyAgICAgIHZbaV0gPSAodltpXSArIHRtcF92ICsgMSkgPj4gMTsKKyAgICB9CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMjRUb1lfQyhjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2ksIHJnYiArPSAzKSB7CisgICAgeVtpXSA9IFZQOFJHQlRvWShyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUjI0VG9ZX0MoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCB3aWR0aDsgKytpLCBiZ3IgKz0gMykgeworICAgIHlbaV0gPSBWUDhSR0JUb1koYmdyWzJdLCBiZ3JbMV0sIGJnclswXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3ZvaWQgV2ViUENvbnZlcnRSR0JBMzJUb1VWX0MoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gMSwgcmdiICs9IDQpIHsKKyAgICBjb25zdCBpbnQgciA9IHJnYlswXSwgZyA9IHJnYlsxXSwgYiA9IHJnYlsyXTsKKyAgICB1W2ldID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIHZbaV0gPSBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgIVdFQlBfTkVPTl9PTUlUX0NfQ09ERQorI2RlZmluZSBNQVhfWSAoKDEgPDwgMTApIC0gMSkgICAgLy8gMTBiIHByZWNpc2lvbiBvdmVyIDE2Yi1hcml0aG1ldGljCitzdGF0aWMgdWludDE2X3QgY2xpcF95KGludCB2KSB7CisgIHJldHVybiAodiA8IDApID8gMCA6ICh2ID4gTUFYX1kpID8gTUFYX1kgOiAodWludDE2X3QpdjsKK30KKworc3RhdGljIHVpbnQ2NF90IFNoYXJwWVVWVXBkYXRlWV9DKGNvbnN0IHVpbnQxNl90KiByZWYsIGNvbnN0IHVpbnQxNl90KiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IGxlbikgeworICB1aW50NjRfdCBkaWZmID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3kgPSByZWZbaV0gLSBzcmNbaV07CisgICAgY29uc3QgaW50IG5ld195ID0gKGludClkc3RbaV0gKyBkaWZmX3k7CisgICAgZHN0W2ldID0gY2xpcF95KG5ld195KTsKKyAgICBkaWZmICs9ICh1aW50NjRfdClhYnMoZGlmZl95KTsKKyAgfQorICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZVcGRhdGVSR0JfQyhjb25zdCBpbnQxNl90KiByZWYsIGNvbnN0IGludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICBjb25zdCBpbnQgZGlmZl91diA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBkc3RbaV0gKz0gZGlmZl91djsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVkZpbHRlclJvd19DKGNvbnN0IGludDE2X3QqIEEsIGNvbnN0IGludDE2X3QqIEIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90KiBiZXN0X3ksIHVpbnQxNl90KiBvdXQpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBsZW47ICsraSwgKytBLCArK0IpIHsKKyAgICBjb25zdCBpbnQgdjAgPSAoQVswXSAqIDkgKyBBWzFdICogMyArIEJbMF0gKiAzICsgQlsxXSArIDgpID4+IDQ7CisgICAgY29uc3QgaW50IHYxID0gKEFbMV0gKiA5ICsgQVswXSAqIDMgKyBCWzFdICogMyArIEJbMF0gKyA4KSA+PiA0OworICAgIG91dFsyICogaSArIDBdID0gY2xpcF95KGJlc3RfeVsyICogaSArIDBdICsgdjApOworICAgIG91dFsyICogaSArIDFdID0gY2xpcF95KGJlc3RfeVsyICogaSArIDFdICsgdjEpOworICB9Cit9CisjZW5kaWYgIC8vICFXRUJQX05FT05fT01JVF9DX0NPREUKKworI3VuZGVmIE1BWF9ZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCAoKldlYlBDb252ZXJ0UkdCMjRUb1kpKGNvbnN0IHVpbnQ4X3QqIHJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKTsKK3ZvaWQgKCpXZWJQQ29udmVydEJHUjI0VG9ZKShjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7Cit2b2lkICgqV2ViUENvbnZlcnRSR0JBMzJUb1VWKShjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKTsKKwordm9pZCAoKldlYlBDb252ZXJ0QVJHQlRvWSkoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCk7Cit2b2lkICgqV2ViUENvbnZlcnRBUkdCVG9VVikoY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKTsKKwordWludDY0X3QgKCpXZWJQU2hhcnBZVVZVcGRhdGVZKShjb25zdCB1aW50MTZfdCogcmVmLCBjb25zdCB1aW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogZHN0LCBpbnQgbGVuKTsKK3ZvaWQgKCpXZWJQU2hhcnBZVVZVcGRhdGVSR0IpKGNvbnN0IGludDE2X3QqIHJlZiwgY29uc3QgaW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogZHN0LCBpbnQgbGVuKTsKK3ZvaWQgKCpXZWJQU2hhcnBZVVZGaWx0ZXJSb3cpKGNvbnN0IGludDE2X3QqIEEsIGNvbnN0IGludDE2X3QqIEIsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYmVzdF95LCB1aW50MTZfdCogb3V0KTsKKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTQxKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWTkVPTih2b2lkKTsKK2V4dGVybiB2b2lkIFdlYlBJbml0U2hhcnBZVVZTU0UyKHZvaWQpOworZXh0ZXJuIHZvaWQgV2ViUEluaXRTaGFycFlVVk5FT04odm9pZCk7CisKK1dFQlBfRFNQX0lOSVRfRlVOQyhXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVYpIHsKKyAgV2ViUENvbnZlcnRBUkdCVG9ZID0gQ29udmVydEFSR0JUb1lfQzsKKyAgV2ViUENvbnZlcnRBUkdCVG9VViA9IFdlYlBDb252ZXJ0QVJHQlRvVVZfQzsKKworICBXZWJQQ29udmVydFJHQjI0VG9ZID0gQ29udmVydFJHQjI0VG9ZX0M7CisgIFdlYlBDb252ZXJ0QkdSMjRUb1kgPSBDb252ZXJ0QkdSMjRUb1lfQzsKKworICBXZWJQQ29udmVydFJHQkEzMlRvVVYgPSBXZWJQQ29udmVydFJHQkEzMlRvVVZfQzsKKworI2lmICFXRUJQX05FT05fT01JVF9DX0NPREUKKyAgV2ViUFNoYXJwWVVWVXBkYXRlWSA9IFNoYXJwWVVWVXBkYXRlWV9DOworICBXZWJQU2hhcnBZVVZVcGRhdGVSR0IgPSBTaGFycFlVVlVwZGF0ZVJHQl9DOworICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3cgPSBTaGFycFlVVkZpbHRlclJvd19DOworI2VuZGlmCisKKyAgaWYgKFZQOEdldENQVUluZm8gIT0gTlVMTCkgeworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFMikKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFMikpIHsKKyAgICAgIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIoKTsKKyAgICAgIFdlYlBJbml0U2hhcnBZVVZTU0UyKCk7CisgICAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0U0MSkKKyAgICBpZiAoVlA4R2V0Q1BVSW5mbyhrU1NFNF8xKSkgeworICAgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFNDEoKTsKKyAgICB9CisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCisgIH0KKworI2lmIGRlZmluZWQoV0VCUF9VU0VfTkVPTikKKyAgaWYgKFdFQlBfTkVPTl9PTUlUX0NfQ09ERSB8fAorICAgICAgKFZQOEdldENQVUluZm8gIT0gTlVMTCAmJiBWUDhHZXRDUFVJbmZvKGtORU9OKSkpIHsKKyAgICBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZORU9OKCk7CisgICAgV2ViUEluaXRTaGFycFlVVk5FT04oKTsKKyAgfQorI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCisKKyAgYXNzZXJ0KFdlYlBDb252ZXJ0QVJHQlRvWSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBDb252ZXJ0QVJHQlRvVVYgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQQ29udmVydFJHQjI0VG9ZICE9IE5VTEwpOworICBhc3NlcnQoV2ViUENvbnZlcnRCR1IyNFRvWSAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBDb252ZXJ0UkdCQTMyVG9VViAhPSBOVUxMKTsKKyAgYXNzZXJ0KFdlYlBTaGFycFlVVlVwZGF0ZVkgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQU2hhcnBZVVZVcGRhdGVSR0IgIT0gTlVMTCk7CisgIGFzc2VydChXZWJQU2hhcnBZVVZGaWx0ZXJSb3cgIT0gTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1di5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjc4NzI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXYuaApAQCAtMCwwICsxLDIxMCBAQAorLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIGlubGluZSBZVVY8LT5SR0IgY29udmVyc2lvbiBmdW5jdGlvbgorLy8KKy8vIFRoZSBleGFjdCBuYW1pbmcgaXMgWSdDYkNyLCBmb2xsb3dpbmcgdGhlIElUVS1SIEJULjYwMSBzdGFuZGFyZC4KKy8vIE1vcmUgaW5mb3JtYXRpb24gYXQ6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWUNiQ3IKKy8vIFkgPSAwLjI1NjkgKiBSICsgMC41MDQ0ICogRyArIDAuMDk3OSAqIEIgKyAxNgorLy8gVSA9IC0wLjE0ODMgKiBSIC0gMC4yOTExICogRyArIDAuNDM5NCAqIEIgKyAxMjgKKy8vIFYgPSAwLjQzOTQgKiBSIC0gMC4zNjc5ICogRyAtIDAuMDcxNSAqIEIgKyAxMjgKKy8vIFdlIHVzZSAxNmJpdCBmaXhlZCBwb2ludCBvcGVyYXRpb25zIGZvciBSR0ItPllVViBjb252ZXJzaW9uIChZVVZfRklYKS4KKy8vCisvLyBGb3IgdGhlIFknQ2JDciB0byBSR0IgY29udmVyc2lvbiwgdGhlIEJULjYwMSBzcGVjaWZpY2F0aW9uIHJlYWRzOgorLy8gICBSID0gMS4xNjQgKiAoWS0xNikgKyAxLjU5NiAqIChWLTEyOCkKKy8vICAgRyA9IDEuMTY0ICogKFktMTYpIC0gMC44MTMgKiAoVi0xMjgpIC0gMC4zOTEgKiAoVS0xMjgpCisvLyAgIEIgPSAxLjE2NCAqIChZLTE2KSAgICAgICAgICAgICAgICAgICArIDIuMDE4ICogKFUtMTI4KQorLy8gd2hlcmUgWSBpcyBpbiB0aGUgWzE2LDIzNV0gcmFuZ2UsIGFuZCBVL1YgaW4gdGhlIFsxNiwyNDBdIHJhbmdlLgorLy8KKy8vIFRoZSBmaXhlZC1wb2ludCBpbXBsZW1lbnRhdGlvbiB1c2VkIGhlcmUgaXM6CisvLyAgUiA9ICgxOTA3NyAuIHkgICAgICAgICAgICAgKyAyNjE0OSAuIHYgLSAxNDIzNCkgPj4gNgorLy8gIEcgPSAoMTkwNzcgLiB5IC0gIDY0MTkgLiB1IC0gMTMzMjAgLiB2ICsgIDg3MDgpID4+IDYKKy8vICBCID0gKDE5MDc3IC4geSArIDMzMDUwIC4gdSAgICAgICAgICAgICAtIDE3Njg1KSA+PiA2CisvLyB3aGVyZSB0aGUgJy4nIG9wZXJhdG9yIGlzIHRoZSBtdWxoaV9lcHUxNiB2YXJpYW50OgorLy8gICBhIC4gYiA9ICgoYSA8PCA4KSAqIGIpID4+IDE2CisvLyB0aGF0IHByZXNlcnZlcyA4IGJpdHMgb2YgZnJhY3Rpb25hbCBwcmVjaXNpb24gYmVmb3JlIGZpbmFsIGRlc2NhbGluZy4KKworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX0RTUF9ZVVZfSF8KKyNkZWZpbmUgV0VCUF9EU1BfWVVWX0hfCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kZWMvdnA4X2RlYy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWVVWIC0+IFJHQiBjb252ZXJzaW9uCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZW51bSB7CisgIFlVVl9GSVggPSAxNiwgICAgICAgICAgICAgICAgICAgIC8vIGZpeGVkLXBvaW50IHByZWNpc2lvbiBmb3IgUkdCLT5ZVVYKKyAgWVVWX0hBTEYgPSAxIDw8IChZVVZfRklYIC0gMSksCisKKyAgWVVWX0ZJWDIgPSA2LCAgICAgICAgICAgICAgICAgICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIFlVVi0+UkdCCisgIFlVVl9NQVNLMiA9ICgyNTYgPDwgWVVWX0ZJWDIpIC0gMQorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHNsb3dlciBvbiB4ODYgYnkgfjctOCUsIGJ1dCBiaXQtZXhhY3Qgd2l0aCB0aGUgU1NFMi9ORU9OIHZlcnNpb24KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBNdWx0SGkoaW50IHYsIGludCBjb2VmZikgeyAgIC8vIF9tbV9tdWxoaV9lcHUxNiBlbXVsYXRpb24KKyAgcmV0dXJuICh2ICogY29lZmYpID4+IDg7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Q2xpcDgoaW50IHYpIHsKKyAgcmV0dXJuICgodiAmIH5ZVVZfTUFTSzIpID09IDApID8gKHYgPj4gWVVWX0ZJWDIpIDogKHYgPCAwKSA/IDAgOiAyNTU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9SKGludCB5LCBpbnQgdikgeworICByZXR1cm4gVlA4Q2xpcDgoTXVsdEhpKHksIDE5MDc3KSArIE11bHRIaSh2LCAyNjE0OSkgLSAxNDIzNCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9HKGludCB5LCBpbnQgdSwgaW50IHYpIHsKKyAgcmV0dXJuIFZQOENsaXA4KE11bHRIaSh5LCAxOTA3NykgLSBNdWx0SGkodSwgNjQxOSkgLSBNdWx0SGkodiwgMTMzMjApICsgODcwOCk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4WVVWVG9CKGludCB5LCBpbnQgdSkgeworICByZXR1cm4gVlA4Q2xpcDgoTXVsdEhpKHksIDE5MDc3KSArIE11bHRIaSh1LCAzMzA1MCkgLSAxNzY4NSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOFl1dlRvUmdiKGludCB5LCBpbnQgdSwgaW50IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCByZ2IpIHsKKyAgcmdiWzBdID0gVlA4WVVWVG9SKHksIHYpOworICByZ2JbMV0gPSBWUDhZVVZUb0coeSwgdSwgdik7CisgIHJnYlsyXSA9IFZQOFlVVlRvQih5LCB1KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9CZ3IoaW50IHksIGludCB1LCBpbnQgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGJncikgeworICBiZ3JbMF0gPSBWUDhZVVZUb0IoeSwgdSk7CisgIGJnclsxXSA9IFZQOFlVVlRvRyh5LCB1LCB2KTsKKyAgYmdyWzJdID0gVlA4WVVWVG9SKHksIHYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb1JnYjU2NShpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiKSB7CisgIGNvbnN0IGludCByID0gVlA4WVVWVG9SKHksIHYpOyAgICAgIC8vIDUgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGcgPSBWUDhZVVZUb0coeSwgdSwgdik7ICAgLy8gNiB1c2FibGUgYml0cworICBjb25zdCBpbnQgYiA9IFZQOFlVVlRvQih5LCB1KTsgICAgICAvLyA1IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCByZyA9IChyICYgMHhmOCkgfCAoZyA+PiA1KTsKKyAgY29uc3QgaW50IGdiID0gKChnIDw8IDMpICYgMHhlMCkgfCAoYiA+PiAzKTsKKyNpZiAoV0VCUF9TV0FQXzE2QklUX0NTUCA9PSAxKQorICByZ2JbMF0gPSBnYjsKKyAgcmdiWzFdID0gcmc7CisjZWxzZQorICByZ2JbMF0gPSByZzsKKyAgcmdiWzFdID0gZ2I7CisjZW5kaWYKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhNDQ0NChpbnQgeSwgaW50IHUsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBhcmdiKSB7CisgIGNvbnN0IGludCByID0gVlA4WVVWVG9SKHksIHYpOyAgICAgICAgLy8gNCB1c2FibGUgYml0cworICBjb25zdCBpbnQgZyA9IFZQOFlVVlRvRyh5LCB1LCB2KTsgICAgIC8vIDQgdXNhYmxlIGJpdHMKKyAgY29uc3QgaW50IGIgPSBWUDhZVVZUb0IoeSwgdSk7ICAgICAgICAvLyA0IHVzYWJsZSBiaXRzCisgIGNvbnN0IGludCByZyA9IChyICYgMHhmMCkgfCAoZyA+PiA0KTsKKyAgY29uc3QgaW50IGJhID0gKGIgJiAweGYwKSB8IDB4MGY7ICAgICAvLyBvdmVyd3JpdGUgdGhlIGxvd2VyIDQgYml0cworI2lmIChXRUJQX1NXQVBfMTZCSVRfQ1NQID09IDEpCisgIGFyZ2JbMF0gPSBiYTsKKyAgYXJnYlsxXSA9IHJnOworI2Vsc2UKKyAgYXJnYlswXSA9IHJnOworICBhcmdiWzFdID0gYmE7CisjZW5kaWYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxwaGEgaGFuZGxpbmcgdmFyaWFudHMKKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9BcmdiKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYXJnYikgeworICBhcmdiWzBdID0gMHhmZjsKKyAgVlA4WXV2VG9SZ2IoeSwgdSwgdiwgYXJnYiArIDEpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhZdXZUb0JncmEodWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiZ3JhKSB7CisgIFZQOFl1dlRvQmdyKHksIHUsIHYsIGJncmEpOworICBiZ3JhWzNdID0gMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4WXV2VG9SZ2JhKHVpbnQ4X3QgeSwgdWludDhfdCB1LCB1aW50OF90IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgcmdiYSkgeworICBWUDhZdXZUb1JnYih5LCB1LCB2LCByZ2JhKTsKKyAgcmdiYVszXSA9IDB4ZmY7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTRTIgZXh0cmEgZnVuY3Rpb25zIChtb3N0bHkgZm9yIHVwc2FtcGxpbmdfc3NlMi5jKQorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9TU0UyKQorCisvLyBQcm9jZXNzIDMyIHBpeGVscyBhbmQgc3RvcmUgdGhlIHJlc3VsdCAoMTZiLCAyNGIgb3IgMzJiIHBlciBwaXhlbCkgaW4gKmRzdC4KK3ZvaWQgVlA4WXV2VG9SZ2JhMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvUmdiMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9CZ3JhMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvQmdyMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9BcmdiMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvUmdiYTQ0NDQzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCk7Cit2b2lkIFZQOFl1dlRvUmdiNTY1MzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKKworI2VuZGlmICAgIC8vIFdFQlBfVVNFX1NTRTIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU1NFNDEgZXh0cmEgZnVuY3Rpb25zIChtb3N0bHkgZm9yIHVwc2FtcGxpbmdfc3NlNDEuYykKKworI2lmIGRlZmluZWQoV0VCUF9VU0VfU1NFNDEpCisKKy8vIFByb2Nlc3MgMzIgcGl4ZWxzIGFuZCBzdG9yZSB0aGUgcmVzdWx0ICgxNmIsIDI0YiBvciAzMmIgcGVyIHBpeGVsKSBpbiAqZHN0Lgordm9pZCBWUDhZdXZUb1JnYjMyX1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KTsKK3ZvaWQgVlA4WXV2VG9CZ3IzMl9TU0U0MShjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCk7CisKKyNlbmRpZiAgICAvLyBXRUJQX1VTRV9TU0U0MQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCIC0+IFlVViBjb252ZXJzaW9uCisKKy8vIFN0dWIgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIGNhbGxlZCB3aXRoIHZhcmlvdXMgcm91bmRpbmcgdmFsdWVzOgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhDbGlwVVYoaW50IHV2LCBpbnQgcm91bmRpbmcpIHsKKyAgdXYgPSAodXYgKyByb3VuZGluZyArICgxMjggPDwgKFlVVl9GSVggKyAyKSkpID4+IChZVVZfRklYICsgMik7CisgIHJldHVybiAoKHV2ICYgfjB4ZmYpID09IDApID8gdXYgOiAodXYgPCAwKSA/IDAgOiAyNTU7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIsIGludCByb3VuZGluZykgeworICBjb25zdCBpbnQgbHVtYSA9IDE2ODM5ICogciArIDMzMDU5ICogZyArIDY0MjAgKiBiOworICByZXR1cm4gKGx1bWEgKyByb3VuZGluZyArICgxNiA8PCBZVVZfRklYKSkgPj4gWVVWX0ZJWDsgIC8vIG5vIG5lZWQgdG8gY2xpcAorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVShpbnQgciwgaW50IGcsIGludCBiLCBpbnQgcm91bmRpbmcpIHsKKyAgY29uc3QgaW50IHUgPSAtOTcxOSAqIHIgLSAxOTA4MSAqIGcgKyAyODgwMCAqIGI7CisgIHJldHVybiBWUDhDbGlwVVYodSwgcm91bmRpbmcpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiLCBpbnQgcm91bmRpbmcpIHsKKyAgY29uc3QgaW50IHYgPSArMjg4MDAgKiByIC0gMjQxMTYgKiBnIC0gNDY4NCAqIGI7CisgIHJldHVybiBWUDhDbGlwVVYodiwgcm91bmRpbmcpOworfQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9EU1BfWVVWX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzMzIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHMzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMGE4ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9taXBzMzIuYwpAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1JUFMgdmVyc2lvbiBvZiBZVVYgdG8gUkdCIHVwc2FtcGxpbmcgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcihzKTogIERqb3JkamUgUGVzdXQgICAgKGRqb3JkamUucGVzdXRAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIEpvdmFuIFplbGluY2V2aWMgKGpvdmFuLnplbGluY2V2aWNAaW1ndGVjLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX01JUFMzMikKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzaW1wbGUgcG9pbnQtc2FtcGxpbmcKKworI2RlZmluZSBST1dfRlVOQyhGVU5DX05BTUUsIFhTVEVQLCBSLCBHLCBCLCBBKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIEZVTkNfTkFNRShjb25zdCB1aW50OF90KiB5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW50IGksIHIsIGcsIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGludCB0ZW1wMCwgdGVtcDEsIHRlbXAyLCB0ZW1wMywgdGVtcDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBmb3IgKGkgPSAwOyBpIDwgKGxlbiA+PiAxKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSA9IE11bHRIaSh2WzBdLCAyNjE0OSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDMgPSBNdWx0SGkodlswXSwgMTMzMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAyID0gTXVsdEhpKHVbMF0sIDY0MTkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wNCA9IE11bHRIaSh1WzBdLCAzMzA1MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDAgPSBNdWx0SGkoeVswXSwgMTkwNzcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxIC09IDE0MjM0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyAtPSA4NzA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgKz0gdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0IC09IDE3Njg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZyA9IFZQOENsaXA4KHRlbXAwIC0gdGVtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMCA9IE11bHRIaSh5WzFdLCAxOTA3Nyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W1JdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtHXSA9IGc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbQl0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBnID0gVlA4Q2xpcDgodGVtcDAgLSB0ZW1wMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYiA9IFZQOENsaXA4KHRlbXAwICsgdGVtcDQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtSICsgWFNURVBdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbRyArIFhTVEVQXSA9IGc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0IgKyBYU1RFUF0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChBKSBkc3RbQSArIFhTVEVQXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB5ICs9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICsrdjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gMiAqIFhTVEVQOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAobGVuICYgMSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMSA9IE11bHRIaSh2WzBdLCAyNjE0OSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDMgPSBNdWx0SGkodlswXSwgMTMzMjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAyID0gTXVsdEhpKHVbMF0sIDY0MTkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wNCA9IE11bHRIaSh1WzBdLCAzMzA1MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDAgPSBNdWx0SGkoeVswXSwgMTkwNzcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXAxIC09IDE0MjM0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wMyAtPSA4NzA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcDIgKz0gdGVtcDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXA0IC09IDE3Njg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByID0gVlA4Q2xpcDgodGVtcDAgKyB0ZW1wMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZyA9IFZQOENsaXA4KHRlbXAwIC0gdGVtcDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgPSBWUDhDbGlwOCh0ZW1wMCArIHRlbXA0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbUl0gPSByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W0ddID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFtCXSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoQSkgZHN0W0FdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitST1dfRlVOQyhZdXZUb1JnYlJvd19NSVBTMzIsICAgICAgMywgMCwgMSwgMiwgMCkKK1JPV19GVU5DKFl1dlRvUmdiYVJvd19NSVBTMzIsICAgICA0LCAwLCAxLCAyLCAzKQorUk9XX0ZVTkMoWXV2VG9CZ3JSb3dfTUlQUzMyLCAgICAgIDMsIDIsIDEsIDAsIDApCitST1dfRlVOQyhZdXZUb0JncmFSb3dfTUlQUzMyLCAgICAgNCwgMiwgMSwgMCwgMykKKworI3VuZGVmIFJPV19GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTYW1wbGVyc01JUFMzMih2b2lkKSB7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl0gID0gWXV2VG9SZ2JSb3dfTUlQUzMyOworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSA9IFl1dlRvUmdiYVJvd19NSVBTMzI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3dfTUlQUzMyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JBXSA9IFl1dlRvQmdyYVJvd19NSVBTMzI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTUlQUzMyCisKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNhbXBsZXJzTUlQUzMyKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX01JUFMzMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbWlwc19kc3BfcjIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHNfZHNwX3IyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4YWZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X21pcHNfZHNwX3IyLmMKQEAgLTAsMCArMSwxMzQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNSVBTIERTUHIyIHZlcnNpb24gb2YgWVVWIHRvIFJHQiB1cHNhbXBsaW5nIGZ1bmN0aW9ucy4KKy8vCisvLyBBdXRob3Iocyk6ICBCcmFuaW1pciBWYXNpYyAoYnJhbmltaXIudmFzaWNAaW1ndGVjLmNvbSkKKy8vICAgICAgICAgICAgIERqb3JkamUgUGVzdXQgIChkam9yZGplLnBlc3V0QGltZ3RlYy5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTX0RTUF9SMikKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBzaW1wbGUgcG9pbnQtc2FtcGxpbmcKKworI2RlZmluZSBST1dfRlVOQ19QQVJUXzEoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImxidSAgICAgICAgICAgICAgJVt0ZW1wM10sICAgMCglW3ZdKSAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICAgICAgICAgICVbdGVtcDRdLCAgIDAoJVt1XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibGJ1ICAgICAgICAgICAgICAlW3RlbXAwXSwgICAwKCVbeV0pICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wMV0sICAgJVt0X2Nvbl8xXSwgICAgICVbdGVtcDNdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDNdLCAgICVbdF9jb25fMl0sICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAibXVsICAgICAgICAgICAgICAlW3RlbXAyXSwgICAlW3RfY29uXzNdLCAgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wNF0sICAgJVt0X2Nvbl80XSwgICAgICVbdGVtcDRdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJtdWwgICAgICAgICAgICAgICVbdGVtcDBdLCAgICVbdF9jb25fNV0sICAgICAlW3RlbXAwXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlW3RlbXAxXSwgICAlW3RlbXAxXSwgICAgICAgJVt0X2Nvbl82XSAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInN1YnUgICAgICAgICAgICAgJVt0ZW1wM10sICAgJVt0ZW1wM10sICAgICAgICVbdF9jb25fN10gICAgICBcblx0IiAgICAgICAgICBcCisgICJhZGR1ICAgICAgICAgICAgICVbdGVtcDJdLCAgICVbdGVtcDJdLCAgICAgICAlW3RlbXAzXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3VidSAgICAgICAgICAgICAlW3RlbXA0XSwgICAlW3RlbXA0XSwgICAgICAgJVt0X2Nvbl84XSAgICAgIFxuXHQiICAgICAgICAgIFwKKworI2RlZmluZSBST1dfRlVOQ19QQVJUXzIoUiwgRywgQiwgSykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgImFkZHUgICAgICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wMF0sICAgICAgICVbdGVtcDFdICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzdWJ1ICAgICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDBdLCAgICAgICAlW3RlbXAyXSAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAiYWRkdSAgICAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXAwXSwgICAgICAgJVt0ZW1wNF0gICAgICAgIFxuXHQiICAgICAgICAgIFwKKyIuaWYgIiAjSyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJsYnUgICAgICAgICAgICAgICVbdGVtcDBdLCAgIDEoJVt5XSkgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorIi5lbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNobGxfcy53ICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgICAgIDE3ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzaGxsX3MudyAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAgICAxNyAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorIi5pZiAiICNLICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgIm11bCAgICAgICAgICAgICAgJVt0ZW1wMF0sICAgJVt0X2Nvbl81XSwgICAgICVbdGVtcDBdICAgICAgICBcblx0IiAgICAgICAgICBcCisiLmVuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2hsbF9zLncgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgICAgMTcgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInByZWNycXVfcy5xYi5waCAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgICAgICR6ZXJvICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJwcmVjcnF1X3MucWIucGggICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAgICAkemVybyAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAicHJlY3JxdV9zLnFiLnBoICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgICAgJHplcm8gICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNybCAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgJVt0ZW1wNV0sICAgICAgIDI0ICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzcmwgICAgICAgICAgICAgICVbdGVtcDZdLCAgICVbdGVtcDZdLCAgICAgICAyNCAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic3JsICAgICAgICAgICAgICAlW3RlbXA3XSwgICAlW3RlbXA3XSwgICAgICAgMjQgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKyAgInNiICAgICAgICAgICAgICAgJVt0ZW1wNV0sICAgIiAjUiAiKCVbZHN0XSkgICAgICAgICAgICAgICAgICBcblx0IiAgICAgICAgICBcCisgICJzYiAgICAgICAgICAgICAgICVbdGVtcDZdLCAgICIgI0cgIiglW2RzdF0pICAgICAgICAgICAgICAgICAgXG5cdCIgICAgICAgICAgXAorICAic2IgICAgICAgICAgICAgICAlW3RlbXA3XSwgICAiICNCICIoJVtkc3RdKSAgICAgICAgICAgICAgICAgIFxuXHQiICAgICAgICAgIFwKKworI2RlZmluZSBBU01fQ0xPQkJFUl9MSVNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiBbdGVtcDBdIj0mciIodGVtcDApLCBbdGVtcDFdIj0mciIodGVtcDEpLCBbdGVtcDJdIj0mciIodGVtcDIpLCAgICAgICAgICAgICBcCisgICAgW3RlbXAzXSI9JnIiKHRlbXAzKSwgW3RlbXA0XSI9JnIiKHRlbXA0KSwgW3RlbXA1XSI9JnIiKHRlbXA1KSwgICAgICAgICAgICAgXAorICAgIFt0ZW1wNl0iPSZyIih0ZW1wNiksIFt0ZW1wN10iPSZyIih0ZW1wNykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgOiBbdF9jb25fMV0iciIodF9jb25fMSksIFt0X2Nvbl8yXSJyIih0X2Nvbl8yKSwgW3RfY29uXzNdInIiKHRfY29uXzMpLCAgICAgICBcCisgICAgW3RfY29uXzRdInIiKHRfY29uXzQpLCBbdF9jb25fNV0iciIodF9jb25fNSksIFt0X2Nvbl82XSJyIih0X2Nvbl82KSwgICAgICAgXAorICAgIFt1XSJyIih1KSwgW3ZdInIiKHYpLCBbeV0iciIoeSksIFtkc3RdInIiKGRzdCksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBbdF9jb25fN10iciIodF9jb25fNyksIFt0X2Nvbl84XSJyIih0X2Nvbl84KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDogIm1lbW9yeSIsICJoaSIsICJsbyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCisjZGVmaW5lIFJPV19GVU5DKEZVTkNfTkFNRSwgWFNURVAsIFIsIEcsIEIsIEEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgRlVOQ19OQU1FKGNvbnN0IHVpbnQ4X3QqIHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWludDMyX3QgdGVtcDAsIHRlbXAxLCB0ZW1wMiwgdGVtcDMsIHRlbXA0LCB0ZW1wNSwgdGVtcDYsIHRlbXA3OyAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl8xID0gMjYxNDk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fMiA9IDEzMzIwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzMgPSA2NDE5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl80ID0gMzMwNTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fNSA9IDE5MDc3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgaW50IHRfY29uXzYgPSAxNDIzNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludCB0X2Nvbl83ID0gODcwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQgdF9jb25fOCA9IDE3Njg1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yIChpID0gMDsgaSA8IChsZW4gPj4gMSk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19hc21fXyB2b2xhdGlsZSAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgUk9XX0ZVTkNfUEFSVF8xKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMihSLCBHLCBCLCAxKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzIoUiArIFhTVEVQLCBHICsgWFNURVAsIEIgKyBYU1RFUCwgMCkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQVNNX0NMT0JCRVJfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBXSA9IGRzdFtBICsgWFNURVBdID0gMHhmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHkgKz0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICArK3U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKyt2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSAyICogWFNURVA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChsZW4gJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fYXNtX18gdm9sYXRpbGUgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFJPV19GVU5DX1BBUlRfMSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBST1dfRlVOQ19QQVJUXzIoUiwgRywgQiwgMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQVNNX0NMT0JCRVJfTElTVCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEEpIGRzdFtBXSA9IDB4ZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworUk9XX0ZVTkMoWXV2VG9SZ2JSb3dfTUlQU2RzcFIyLCAgICAgIDMsIDAsIDEsIDIsIDApCitST1dfRlVOQyhZdXZUb1JnYmFSb3dfTUlQU2RzcFIyLCAgICAgNCwgMCwgMSwgMiwgMykKK1JPV19GVU5DKFl1dlRvQmdyUm93X01JUFNkc3BSMiwgICAgICAzLCAyLCAxLCAwLCAwKQorUk9XX0ZVTkMoWXV2VG9CZ3JhUm93X01JUFNkc3BSMiwgICAgIDQsIDIsIDEsIDAsIDMpCisKKyN1bmRlZiBST1dfRlVOQworI3VuZGVmIEFTTV9DTE9CQkVSX0xJU1QKKyN1bmRlZiBST1dfRlVOQ19QQVJUXzIKKyN1bmRlZiBST1dfRlVOQ19QQVJUXzEKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNNSVBTZHNwUjIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdFNhbXBsZXJzTUlQU2RzcFIyKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvd19NSVBTZHNwUjI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQkFdID0gWXV2VG9SZ2JhUm93X01JUFNkc3BSMjsKKyAgV2ViUFNhbXBsZXJzW01PREVfQkdSXSAgPSBZdXZUb0JnclJvd19NSVBTZHNwUjI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdID0gWXV2VG9CZ3JhUm93X01JUFNkc3BSMjsKK30KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9NSVBTX0RTUF9SMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTYW1wbGVyc01JUFNkc3BSMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9NSVBTX0RTUF9SMgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbmVvbi5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfbmVvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNGQ2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9uZW9uLmMKQEAgLTAsMCArMSwyODggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBZVVYtPlJHQiBjb252ZXJzaW9uIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisjaWYgZGVmaW5lZChXRUJQX1VTRV9ORU9OKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL25lb24uaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdWludDh4OF90IENvbnZlcnRSR0JUb1lfTkVPTihjb25zdCB1aW50OHg4X3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4eDhfdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDh4OF90IEIpIHsKKyAgY29uc3QgdWludDE2eDhfdCByID0gdm1vdmxfdTgoUik7CisgIGNvbnN0IHVpbnQxNng4X3QgZyA9IHZtb3ZsX3U4KEcpOworICBjb25zdCB1aW50MTZ4OF90IGIgPSB2bW92bF91OChCKTsKKyAgY29uc3QgdWludDE2eDRfdCByX2xvID0gdmdldF9sb3dfdTE2KHIpOworICBjb25zdCB1aW50MTZ4NF90IHJfaGkgPSB2Z2V0X2hpZ2hfdTE2KHIpOworICBjb25zdCB1aW50MTZ4NF90IGdfbG8gPSB2Z2V0X2xvd191MTYoZyk7CisgIGNvbnN0IHVpbnQxNng0X3QgZ19oaSA9IHZnZXRfaGlnaF91MTYoZyk7CisgIGNvbnN0IHVpbnQxNng0X3QgYl9sbyA9IHZnZXRfbG93X3UxNihiKTsKKyAgY29uc3QgdWludDE2eDRfdCBiX2hpID0gdmdldF9oaWdoX3UxNihiKTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAwX2xvID0gdm11bGxfbl91MTYoICAgICAgICAgcl9sbywgMTY4Mzl1KTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAwX2hpID0gdm11bGxfbl91MTYoICAgICAgICAgcl9oaSwgMTY4Mzl1KTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAxX2xvID0gdm1sYWxfbl91MTYodG1wMF9sbywgZ19sbywgMzMwNTl1KTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAxX2hpID0gdm1sYWxfbl91MTYodG1wMF9oaSwgZ19oaSwgMzMwNTl1KTsKKyAgY29uc3QgdWludDMyeDRfdCB0bXAyX2xvID0gdm1sYWxfbl91MTYodG1wMV9sbywgYl9sbywgNjQyMHUpOworICBjb25zdCB1aW50MzJ4NF90IHRtcDJfaGkgPSB2bWxhbF9uX3UxNih0bXAxX2hpLCBiX2hpLCA2NDIwdSk7CisgIGNvbnN0IHVpbnQxNng4X3QgWTEgPSB2Y29tYmluZV91MTYodnJzaHJuX25fdTMyKHRtcDJfbG8sIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2cnNocm5fbl91MzIodG1wMl9oaSwgMTYpKTsKKyAgY29uc3QgdWludDE2eDhfdCBZMiA9IHZhZGRxX3UxNihZMSwgdmR1cHFfbl91MTYoMTYpKTsKKyAgcmV0dXJuIHZxbW92bl91MTYoWTIpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCMjRUb1lfTkVPTihjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCwgcmdiICs9IDMgKiA4KSB7CisgICAgY29uc3QgdWludDh4OHgzX3QgUkdCID0gdmxkM191OChyZ2IpOworICAgIGNvbnN0IHVpbnQ4eDhfdCBZID0gQ29udmVydFJHQlRvWV9ORU9OKFJHQi52YWxbMF0sIFJHQi52YWxbMV0sIFJHQi52YWxbMl0pOworICAgIHZzdDFfdTgoeSArIGksIFkpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgcmdiICs9IDMpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSMjRUb1lfTkVPTihjb25zdCB1aW50OF90KiBiZ3IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCwgYmdyICs9IDMgKiA4KSB7CisgICAgY29uc3QgdWludDh4OHgzX3QgQkdSID0gdmxkM191OChiZ3IpOworICAgIGNvbnN0IHVpbnQ4eDhfdCBZID0gQ29udmVydFJHQlRvWV9ORU9OKEJHUi52YWxbMl0sIEJHUi52YWxbMV0sIEJHUi52YWxbMF0pOworICAgIHZzdDFfdTgoeSArIGksIFkpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgYmdyICs9IDMpIHsgIC8vIGxlZnQtb3ZlcgorICAgIHlbaV0gPSBWUDhSR0JUb1koYmdyWzJdLCBiZ3JbMV0sIGJnclswXSwgWVVWX0hBTEYpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9ZX05FT04oY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gd2lkdGg7IGkgKz0gOCkgeworICAgIGNvbnN0IHVpbnQ4eDh4NF90IFJHQiA9IHZsZDRfdTgoKGNvbnN0IHVpbnQ4X3QqKSZhcmdiW2ldKTsKKyAgICBjb25zdCB1aW50OHg4X3QgWSA9IENvbnZlcnRSR0JUb1lfTkVPTihSR0IudmFsWzJdLCBSR0IudmFsWzFdLCBSR0IudmFsWzBdKTsKKyAgICB2c3QxX3U4KHkgKyBpLCBZKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICBjb25zdCB1aW50MzJfdCBwID0gYXJnYltpXTsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKChwID4+IDE2KSAmIDB4ZmYsIChwID4+IDgpICYgMHhmZiwgKHAgPj4gIDApICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgIFlVVl9IQUxGKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIGNvbXB1dGVzOiBEU1RfczE2ID0gWyhDMCAqIHIgKyBDMSAqIGcgKyBDMiAqIGIpID4+IDE2XSArIENTVAorI2RlZmluZSBNVUxUSVBMWV8xNmJfUFJFQU1CTEUociwgZywgYikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGludDE2eDRfdCByX2xvID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9sb3dfdTE2KHIpKTsgIFwKKyAgY29uc3QgaW50MTZ4NF90IHJfaGkgPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2hpZ2hfdTE2KHIpKTsgXAorICBjb25zdCBpbnQxNng0X3QgZ19sbyA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfbG93X3UxNihnKSk7ICBcCisgIGNvbnN0IGludDE2eDRfdCBnX2hpID0gdnJlaW50ZXJwcmV0X3MxNl91MTYodmdldF9oaWdoX3UxNihnKSk7IFwKKyAgY29uc3QgaW50MTZ4NF90IGJfbG8gPSB2cmVpbnRlcnByZXRfczE2X3UxNih2Z2V0X2xvd191MTYoYikpOyAgXAorICBjb25zdCBpbnQxNng0X3QgYl9oaSA9IHZyZWludGVycHJldF9zMTZfdTE2KHZnZXRfaGlnaF91MTYoYikpCisKKyNkZWZpbmUgTVVMVElQTFlfMTZiKEMwLCBDMSwgQzIsIENTVCwgRFNUX3MxNikgZG8geyAgICAgICAgICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMF9sbyA9IHZtdWxsX25fczE2KCAgICAgICAgIHJfbG8sIEMwKTsgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAwX2hpID0gdm11bGxfbl9zMTYoICAgICAgICAgcl9oaSwgQzApOyAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDFfbG8gPSB2bWxhbF9uX3MxNih0bXAwX2xvLCBnX2xvLCBDMSk7ICAgICAgXAorICBjb25zdCBpbnQzMng0X3QgdG1wMV9oaSA9IHZtbGFsX25fczE2KHRtcDBfaGksIGdfaGksIEMxKTsgICAgICBcCisgIGNvbnN0IGludDMyeDRfdCB0bXAyX2xvID0gdm1sYWxfbl9zMTYodG1wMV9sbywgYl9sbywgQzIpOyAgICAgIFwKKyAgY29uc3QgaW50MzJ4NF90IHRtcDJfaGkgPSB2bWxhbF9uX3MxNih0bXAxX2hpLCBiX2hpLCBDMik7ICAgICAgXAorICBjb25zdCBpbnQxNng4X3QgdG1wMyA9IHZjb21iaW5lX3MxNih2c2hybl9uX3MzMih0bXAyX2xvLCAxNiksICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzaHJuX25fczMyKHRtcDJfaGksIDE2KSk7IFwKKyAgRFNUX3MxNiA9IHZhZGRxX3MxNih0bXAzLCB2ZHVwcV9uX3MxNihDU1QpKTsgICAgICAgICAgICAgICAgICAgXAorfSB3aGlsZSAoMCkKKworLy8gVGhpcyBuZWVkcyB0byBiZSBhIG1hY3JvLCBzaW5jZSAoMTI4IDw8IFNISUZUKSBuZWVkcyB0byBiZSBhbiBpbW1lZGlhdGUuCisjZGVmaW5lIENPTlZFUlRfUkdCX1RPX1VWKHIsIGcsIGIsIFNISUZULCBVX0RTVCwgVl9EU1QpIGRvIHsgICAgIFwKKyAgTVVMVElQTFlfMTZiX1BSRUFNQkxFKHIsIGcsIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBNVUxUSVBMWV8xNmIoLTk3MTksIC0xOTA4MSwgMjg4MDAsIDEyOCA8PCBTSElGVCwgVV9EU1QpOyAgICAgICBcCisgIE1VTFRJUExZXzE2YigyODgwMCwgLTI0MTE2LCAtNDY4NCwgMTI4IDw8IFNISUZULCBWX0RTVCk7ICAgICAgIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0JBMzJUb1VWX05FT04oY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSB3aWR0aDsgaSArPSA4LCByZ2IgKz0gNCAqIDgpIHsKKyAgICBjb25zdCB1aW50MTZ4OHg0X3QgUkdCID0gdmxkNHFfdTE2KChjb25zdCB1aW50MTZfdCopcmdiKTsKKyAgICBpbnQxNng4X3QgVSwgVjsKKyAgICBDT05WRVJUX1JHQl9UT19VVihSR0IudmFsWzBdLCBSR0IudmFsWzFdLCBSR0IudmFsWzJdLCAyLCBVLCBWKTsKKyAgICB2c3QxX3U4KHUgKyBpLCB2cXJzaHJ1bl9uX3MxNihVLCAyKSk7CisgICAgdnN0MV91OCh2ICsgaSwgdnFyc2hydW5fbl9zMTYoViwgMikpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7IGkgKz0gMSwgcmdiICs9IDQpIHsKKyAgICBjb25zdCBpbnQgciA9IHJnYlswXSwgZyA9IHJnYlsxXSwgYiA9IHJnYlsyXTsKKyAgICB1W2ldID0gVlA4UkdCVG9VKHIsIGcsIGIsIFlVVl9IQUxGIDw8IDIpOworICAgIHZbaV0gPSBWUDhSR0JUb1YociwgZywgYiwgWVVWX0hBTEYgPDwgMik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1VWX05FT04oY29uc3QgdWludDMyX3QqIGFyZ2IsIHVpbnQ4X3QqIHUsIHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgZG9fc3RvcmUpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgKyAxNiA8PSBzcmNfd2lkdGg7IGkgKz0gMTYsIHUgKz0gOCwgdiArPSA4KSB7CisgICAgY29uc3QgdWludDh4MTZ4NF90IFJHQiA9IHZsZDRxX3U4KChjb25zdCB1aW50OF90KikmYXJnYltpXSk7CisgICAgY29uc3QgdWludDE2eDhfdCBSID0gdnBhZGRscV91OChSR0IudmFsWzJdKTsgIC8vIHBhaXItd2lzZSBhZGRzCisgICAgY29uc3QgdWludDE2eDhfdCBHID0gdnBhZGRscV91OChSR0IudmFsWzFdKTsKKyAgICBjb25zdCB1aW50MTZ4OF90IEIgPSB2cGFkZGxxX3U4KFJHQi52YWxbMF0pOworICAgIGludDE2eDhfdCBVX3RtcCwgVl90bXA7CisgICAgQ09OVkVSVF9SR0JfVE9fVVYoUiwgRywgQiwgMSwgVV90bXAsIFZfdG1wKTsKKyAgICB7CisgICAgICBjb25zdCB1aW50OHg4X3QgVSA9IHZxcnNocnVuX25fczE2KFVfdG1wLCAxKTsKKyAgICAgIGNvbnN0IHVpbnQ4eDhfdCBWID0gdnFyc2hydW5fbl9zMTYoVl90bXAsIDEpOworICAgICAgaWYgKGRvX3N0b3JlKSB7CisgICAgICAgIHZzdDFfdTgodSwgVSk7CisgICAgICAgIHZzdDFfdTgodiwgVik7CisgICAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OHg4X3QgcHJldl91ID0gdmxkMV91OCh1KTsKKyAgICAgICAgY29uc3QgdWludDh4OF90IHByZXZfdiA9IHZsZDFfdTgodik7CisgICAgICAgIHZzdDFfdTgodSwgdnJoYWRkX3U4KFUsIHByZXZfdSkpOworICAgICAgICB2c3QxX3U4KHYsIHZyaGFkZF91OChWLCBwcmV2X3YpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKGkgPCBzcmNfd2lkdGgpIHsgIC8vIGxlZnQtb3ZlcgorICAgIFdlYlBDb252ZXJ0QVJHQlRvVVZfQyhhcmdiICsgaSwgdSwgdiwgc3JjX3dpZHRoIC0gaSwgZG9fc3RvcmUpOworICB9Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworZXh0ZXJuIHZvaWQgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWTkVPTih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVk5FT04odm9pZCkgeworICBXZWJQQ29udmVydFJHQjI0VG9ZID0gQ29udmVydFJHQjI0VG9ZX05FT047CisgIFdlYlBDb252ZXJ0QkdSMjRUb1kgPSBDb252ZXJ0QkdSMjRUb1lfTkVPTjsKKyAgV2ViUENvbnZlcnRBUkdCVG9ZID0gQ29udmVydEFSR0JUb1lfTkVPTjsKKyAgV2ViUENvbnZlcnRBUkdCVG9VViA9IENvbnZlcnRBUkdCVG9VVl9ORU9OOworICBXZWJQQ29udmVydFJHQkEzMlRvVVYgPSBDb252ZXJ0UkdCQTMyVG9VVl9ORU9OOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIE1BWF9ZICgoMSA8PCAxMCkgLSAxKSAgICAvLyAxMGIgcHJlY2lzaW9uIG92ZXIgMTZiLWFyaXRobWV0aWMKK3N0YXRpYyB1aW50MTZfdCBjbGlwX3lfTkVPTihpbnQgdikgeworICByZXR1cm4gKHYgPCAwKSA/IDAgOiAodiA+IE1BWF9ZKSA/IE1BWF9ZIDogKHVpbnQxNl90KXY7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBTaGFycFlVVlVwZGF0ZVlfTkVPTihjb25zdCB1aW50MTZfdCogcmVmLCBjb25zdCB1aW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IGk7CisgIGNvbnN0IGludDE2eDhfdCB6ZXJvID0gdmR1cHFfbl9zMTYoMCk7CisgIGNvbnN0IGludDE2eDhfdCBtYXggPSB2ZHVwcV9uX3MxNihNQVhfWSk7CisgIHVpbnQ2NHgyX3Qgc3VtID0gdmR1cHFfbl91NjQoMCk7CisgIHVpbnQ2NF90IGRpZmY7CisKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBpbnQxNng4X3QgQSA9IHZyZWludGVycHJldHFfczE2X3UxNih2bGQxcV91MTYocmVmICsgaSkpOworICAgIGNvbnN0IGludDE2eDhfdCBCID0gdnJlaW50ZXJwcmV0cV9zMTZfdTE2KHZsZDFxX3UxNihzcmMgKyBpKSk7CisgICAgY29uc3QgaW50MTZ4OF90IEMgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmxkMXFfdTE2KGRzdCArIGkpKTsKKyAgICBjb25zdCBpbnQxNng4X3QgRCA9IHZzdWJxX3MxNihBLCBCKTsgICAgICAgLy8gZGlmZl95CisgICAgY29uc3QgaW50MTZ4OF90IEYgPSB2YWRkcV9zMTYoQywgRCk7ICAgICAgIC8vIG5ld195CisgICAgY29uc3QgdWludDE2eDhfdCBIID0KKyAgICAgICAgdnJlaW50ZXJwcmV0cV91MTZfczE2KHZtYXhxX3MxNih2bWlucV9zMTYoRiwgbWF4KSwgemVybykpOworICAgIGNvbnN0IGludDE2eDhfdCBJID0gdmFic3FfczE2KEQpOyAgICAgICAgICAvLyBhYnMoZGlmZl95KQorICAgIHZzdDFxX3UxNihkc3QgKyBpLCBIKTsKKyAgICBzdW0gPSB2cGFkYWxxX3UzMihzdW0sIHZwYWRkbHFfdTE2KHZyZWludGVycHJldHFfdTE2X3MxNihJKSkpOworICB9CisgIGRpZmYgPSB2Z2V0cV9sYW5lX3U2NChzdW0sIDApICsgdmdldHFfbGFuZV91NjQoc3VtLCAxKTsKKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3kgPSByZWZbaV0gLSBzcmNbaV07CisgICAgY29uc3QgaW50IG5ld195ID0gKGludCkoZHN0W2ldKSArIGRpZmZfeTsKKyAgICBkc3RbaV0gPSBjbGlwX3lfTkVPTihuZXdfeSk7CisgICAgZGlmZiArPSAodWludDY0X3QpKGFicyhkaWZmX3kpKTsKKyAgfQorICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZVcGRhdGVSR0JfTkVPTihjb25zdCBpbnQxNl90KiByZWYsIGNvbnN0IGludDE2X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IGludDE2eDhfdCBBID0gdmxkMXFfczE2KHJlZiArIGkpOworICAgIGNvbnN0IGludDE2eDhfdCBCID0gdmxkMXFfczE2KHNyYyArIGkpOworICAgIGNvbnN0IGludDE2eDhfdCBDID0gdmxkMXFfczE2KGRzdCArIGkpOworICAgIGNvbnN0IGludDE2eDhfdCBEID0gdnN1YnFfczE2KEEsIEIpOyAgIC8vIGRpZmZfdXYKKyAgICBjb25zdCBpbnQxNng4X3QgRSA9IHZhZGRxX3MxNihDLCBEKTsgICAvLyBuZXdfdXYKKyAgICB2c3QxcV9zMTYoZHN0ICsgaSwgRSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBkaWZmX3V2ID0gcmVmW2ldIC0gc3JjW2ldOworICAgIGRzdFtpXSArPSBkaWZmX3V2OworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNoYXJwWVVWRmlsdGVyUm93X05FT04oY29uc3QgaW50MTZfdCogQSwgY29uc3QgaW50MTZfdCogQiwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDE2X3QqIGJlc3RfeSwgdWludDE2X3QqIG91dCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50MTZ4OF90IG1heCA9IHZkdXBxX25fczE2KE1BWF9ZKTsKKyAgY29uc3QgaW50MTZ4OF90IHplcm8gPSB2ZHVwcV9uX3MxNigwKTsKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBpbnQxNng4X3QgYTAgPSB2bGQxcV9zMTYoQSArIGkgKyAwKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTEgPSB2bGQxcV9zMTYoQSArIGkgKyAxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYjAgPSB2bGQxcV9zMTYoQiArIGkgKyAwKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYjEgPSB2bGQxcV9zMTYoQiArIGkgKyAxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgYTBiMSA9IHZhZGRxX3MxNihhMCwgYjEpOworICAgIGNvbnN0IGludDE2eDhfdCBhMWIwID0gdmFkZHFfczE2KGExLCBiMCk7CisgICAgY29uc3QgaW50MTZ4OF90IGEwYTFiMGIxID0gdmFkZHFfczE2KGEwYjEsIGExYjApOyAgLy8gQTArQTErQjArQjEKKyAgICBjb25zdCBpbnQxNng4X3QgYTBiMV8yID0gdmFkZHFfczE2KGEwYjEsIGEwYjEpOyAgICAvLyAyKihBMCtCMSkKKyAgICBjb25zdCBpbnQxNng4X3QgYTFiMF8yID0gdmFkZHFfczE2KGExYjAsIGExYjApOyAgICAvLyAyKihBMStCMCkKKyAgICBjb25zdCBpbnQxNng4X3QgYzAgPSB2c2hycV9uX3MxNih2YWRkcV9zMTYoYTBiMV8yLCBhMGExYjBiMSksIDMpOworICAgIGNvbnN0IGludDE2eDhfdCBjMSA9IHZzaHJxX25fczE2KHZhZGRxX3MxNihhMWIwXzIsIGEwYTFiMGIxKSwgMyk7CisgICAgY29uc3QgaW50MTZ4OF90IGQwID0gdmFkZHFfczE2KGMxLCBhMCk7CisgICAgY29uc3QgaW50MTZ4OF90IGQxID0gdmFkZHFfczE2KGMwLCBhMSk7CisgICAgY29uc3QgaW50MTZ4OF90IGUwID0gdnJzaHJxX25fczE2KGQwLCAxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZTEgPSB2cnNocnFfbl9zMTYoZDEsIDEpOworICAgIGNvbnN0IGludDE2eDh4Ml90IGYgPSB2emlwcV9zMTYoZTAsIGUxKTsKKyAgICBjb25zdCBpbnQxNng4X3QgZzAgPSB2cmVpbnRlcnByZXRxX3MxNl91MTYodmxkMXFfdTE2KGJlc3RfeSArIDIgKiBpICsgMCkpOworICAgIGNvbnN0IGludDE2eDhfdCBnMSA9IHZyZWludGVycHJldHFfczE2X3UxNih2bGQxcV91MTYoYmVzdF95ICsgMiAqIGkgKyA4KSk7CisgICAgY29uc3QgaW50MTZ4OF90IGgwID0gdmFkZHFfczE2KGcwLCBmLnZhbFswXSk7CisgICAgY29uc3QgaW50MTZ4OF90IGgxID0gdmFkZHFfczE2KGcxLCBmLnZhbFsxXSk7CisgICAgY29uc3QgaW50MTZ4OF90IGkwID0gdm1heHFfczE2KHZtaW5xX3MxNihoMCwgbWF4KSwgemVybyk7CisgICAgY29uc3QgaW50MTZ4OF90IGkxID0gdm1heHFfczE2KHZtaW5xX3MxNihoMSwgbWF4KSwgemVybyk7CisgICAgdnN0MXFfdTE2KG91dCArIDIgKiBpICsgMCwgdnJlaW50ZXJwcmV0cV91MTZfczE2KGkwKSk7CisgICAgdnN0MXFfdTE2KG91dCArIDIgKiBpICsgOCwgdnJlaW50ZXJwcmV0cV91MTZfczE2KGkxKSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IGludCBhMGIxID0gQVtpICsgMF0gKyBCW2kgKyAxXTsKKyAgICBjb25zdCBpbnQgYTFiMCA9IEFbaSArIDFdICsgQltpICsgMF07CisgICAgY29uc3QgaW50IGEwYTFiMGIxID0gYTBiMSArIGExYjAgKyA4OworICAgIGNvbnN0IGludCB2MCA9ICg4ICogQVtpICsgMF0gKyAyICogYTFiMCArIGEwYTFiMGIxKSA+PiA0OworICAgIGNvbnN0IGludCB2MSA9ICg4ICogQVtpICsgMV0gKyAyICogYTBiMSArIGEwYTFiMGIxKSA+PiA0OworICAgIG91dFsyICogaSArIDBdID0gY2xpcF95X05FT04oYmVzdF95WzIgKiBpICsgMF0gKyB2MCk7CisgICAgb3V0WzIgKiBpICsgMV0gPSBjbGlwX3lfTkVPTihiZXN0X3lbMiAqIGkgKyAxXSArIHYxKTsKKyAgfQorfQorI3VuZGVmIE1BWF9ZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2hhcnBZVVZORU9OKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTaGFycFlVVk5FT04odm9pZCkgeworICBXZWJQU2hhcnBZVVZVcGRhdGVZID0gU2hhcnBZVVZVcGRhdGVZX05FT047CisgIFdlYlBTaGFycFlVVlVwZGF0ZVJHQiA9IFNoYXJwWVVWVXBkYXRlUkdCX05FT047CisgIFdlYlBTaGFycFlVVkZpbHRlclJvdyA9IFNoYXJwWVVWRmlsdGVyUm93X05FT047Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfTkVPTgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWTkVPTikKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNoYXJwWVVWTkVPTikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9ORU9OCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2UyLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2UyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhNDhkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9kc3AveXV2X3NzZTIuYwpAQCAtMCwwICsxLDg3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTIpCisKKyNpbmNsdWRlICJzcmMvZHNwL2NvbW1vbl9zc2UyLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZW1taW50cmluLmg+CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvbnZlcnQgc3BhbnMgb2YgMzIgcGl4ZWxzIHRvIHZhcmlvdXMgUkdCIGZvcm1hdHMgZm9yIHRoZSBmYW5jeSB1cHNhbXBsZXIuCisKKy8vIFRoZXNlIGNvbnN0YW50cyBhcmUgMTRiIGZpeGVkLXBvaW50IHZlcnNpb24gb2YgSVRVLVIgQlQuNjAxIGNvbnN0YW50cy4KKy8vIFIgPSAoMTkwNzcgKiB5ICAgICAgICAgICAgICsgMjYxNDkgKiB2IC0gMTQyMzQpID4+IDYKKy8vIEcgPSAoMTkwNzcgKiB5IC0gIDY0MTkgKiB1IC0gMTMzMjAgKiB2ICsgIDg3MDgpID4+IDYKKy8vIEIgPSAoMTkwNzcgKiB5ICsgMzMwNTAgKiB1ICAgICAgICAgICAgIC0gMTc2ODUpID4+IDYKK3N0YXRpYyB2b2lkIENvbnZlcnRZVVY0NDRUb1JHQl9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgVTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBWMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIGsxOTA3NyA9IF9tbV9zZXQxX2VwaTE2KDE5MDc3KTsKKyAgY29uc3QgX19tMTI4aSBrMjYxNDkgPSBfbW1fc2V0MV9lcGkxNigyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgazE0MjM0ID0gX21tX3NldDFfZXBpMTYoMTQyMzQpOworICAvLyAzMzA1MCBkb2Vzbid0IGZpdCBpbiBhIHNpZ25lZCBzaG9ydDogb25seSB1c2UgdGhpcyB3aXRoIHVuc2lnbmVkIGFyaXRobWV0aWMKKyAgY29uc3QgX19tMTI4aSBrMzMwNTAgPSBfbW1fc2V0MV9lcGkxNigoc2hvcnQpMzMwNTApOworICBjb25zdCBfX20xMjhpIGsxNzY4NSA9IF9tbV9zZXQxX2VwaTE2KDE3Njg1KTsKKyAgY29uc3QgX19tMTI4aSBrNjQxOSAgPSBfbW1fc2V0MV9lcGkxNig2NDE5KTsKKyAgY29uc3QgX19tMTI4aSBrMTMzMjAgPSBfbW1fc2V0MV9lcGkxNigxMzMyMCk7CisgIGNvbnN0IF9fbTEyOGkgazg3MDggID0gX21tX3NldDFfZXBpMTYoODcwOCk7CisKKyAgY29uc3QgX19tMTI4aSBZMSA9IF9tbV9tdWxoaV9lcHUxNigqWTAsIGsxOTA3Nyk7CisKKyAgY29uc3QgX19tMTI4aSBSMCA9IF9tbV9tdWxoaV9lcHUxNigqVjAsIGsyNjE0OSk7CisgIGNvbnN0IF9fbTEyOGkgUjEgPSBfbW1fc3ViX2VwaTE2KFkxLCBrMTQyMzQpOworICBjb25zdCBfX20xMjhpIFIyID0gX21tX2FkZF9lcGkxNihSMSwgUjApOworCisgIGNvbnN0IF9fbTEyOGkgRzAgPSBfbW1fbXVsaGlfZXB1MTYoKlUwLCBrNjQxOSk7CisgIGNvbnN0IF9fbTEyOGkgRzEgPSBfbW1fbXVsaGlfZXB1MTYoKlYwLCBrMTMzMjApOworICBjb25zdCBfX20xMjhpIEcyID0gX21tX2FkZF9lcGkxNihZMSwgazg3MDgpOworICBjb25zdCBfX20xMjhpIEczID0gX21tX2FkZF9lcGkxNihHMCwgRzEpOworICBjb25zdCBfX20xMjhpIEc0ID0gX21tX3N1Yl9lcGkxNihHMiwgRzMpOworCisgIC8vIGJlIGNhcmVmdWwgd2l0aCB0aGUgc2F0dXJhdGVkICp1bnNpZ25lZCogYXJpdGhtZXRpYyBoZXJlIQorICBjb25zdCBfX20xMjhpIEIwID0gX21tX211bGhpX2VwdTE2KCpVMCwgazMzMDUwKTsKKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV9hZGRzX2VwdTE2KEIwLCBZMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fc3Vic19lcHUxNihCMSwgazE3Njg1KTsKKworICAvLyB1c2UgbG9naWNhbCBzaGlmdCBmb3IgQjIsIHdoaWNoIGNhbiBiZSBsYXJnZXIgdGhhbiAzMjc2NworICAqUiA9IF9tbV9zcmFpX2VwaTE2KFIyLCA2KTsgICAvLyByYW5nZTogWy0xNDIzNCwgMzA4MTVdCisgICpHID0gX21tX3NyYWlfZXBpMTYoRzQsIDYpOyAgIC8vIHJhbmdlOiBbLTEwOTUzLCAyNzcxMF0KKyAgKkIgPSBfbW1fc3JsaV9lcGkxNihCMiwgNik7ICAgLy8gcmFuZ2U6IFswLCAzNDIzOF0KK30KKworLy8gTG9hZCB0aGUgYnl0ZXMgaW50byB0aGUgKnVwcGVyKiBwYXJ0IG9mIDE2YiB3b3Jkcy4gVGhhdCdzICI8PCA4IiwgYmFzaWNhbGx5Lgorc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgTG9hZF9ISV8xNl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICByZXR1cm4gX21tX3VucGFja2xvX2VwaTgoemVybywgX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKilzcmMpKTsKK30KKworLy8gTG9hZCBhbmQgcmVwbGljYXRlIHRoZSBVL1Ygc2FtcGxlcworc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgTG9hZF9VVl9ISV84X1NTRTIoY29uc3QgdWludDhfdCogc3JjKSB7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMCA9IF9tbV9jdnRzaTMyX3NpMTI4KCooY29uc3QgdWludDMyX3QqKXNyYyk7CisgIGNvbnN0IF9fbTEyOGkgdG1wMSA9IF9tbV91bnBhY2tsb19lcGk4KHplcm8sIHRtcDApOworICByZXR1cm4gX21tX3VucGFja2xvX2VwaTE2KHRtcDEsIHRtcDEpOyAgIC8vIHJlcGxpY2F0ZSBzYW1wbGVzCit9CisKKy8vIENvbnZlcnQgMzIgc2FtcGxlcyBvZiBZVVY0NDQgdG8gUi9HL0IKK3N0YXRpYyB2b2lkIFlVVjQ0NFRvUkdCX1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNl9TU0UyKHkpLCBVMCA9IExvYWRfSElfMTZfU1NFMih1KSwKKyAgICAgICAgICAgICAgICBWMCA9IExvYWRfSElfMTZfU1NFMih2KTsKKyAgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTIoJlkwLCAmVTAsICZWMCwgUiwgRywgQik7Cit9CisKKy8vIENvbnZlcnQgMzIgc2FtcGxlcyBvZiBZVVY0MjAgdG8gUi9HL0IKK3N0YXRpYyB2b2lkIFlVVjQyMFRvUkdCX1NTRTIoY29uc3QgdWludDhfdCogY29uc3QgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgUiwgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNl9TU0UyKHkpLCBVMCA9IExvYWRfVVZfSElfOF9TU0UyKHUpLAorICAgICAgICAgICAgICAgIFYwID0gTG9hZF9VVl9ISV84X1NTRTIodik7CisgIENvbnZlcnRZVVY0NDRUb1JHQl9TU0UyKCZZMCwgJlUwLCAmVjAsIFIsIEcsIEIpOworfQorCisvLyBQYWNrIFIvRy9CL0EgcmVzdWx0cyBpbnRvIDMyYiBvdXRwdXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQYWNrQW5kU3RvcmU0X1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSByYiA9IF9tbV9wYWNrdXNfZXBpMTYoKlIsICpCKTsKKyAgY29uc3QgX19tMTI4aSBnYSA9IF9tbV9wYWNrdXNfZXBpMTYoKkcsICpBKTsKKyAgY29uc3QgX19tMTI4aSByZyA9IF9tbV91bnBhY2tsb19lcGk4KHJiLCBnYSk7CisgIGNvbnN0IF9fbTEyOGkgYmEgPSBfbW1fdW5wYWNraGlfZXBpOChyYiwgZ2EpOworICBjb25zdCBfX20xMjhpIFJHQkFfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYocmcsIGJhKTsKKyAgY29uc3QgX19tMTI4aSBSR0JBX2hpID0gX21tX3VucGFja2hpX2VwaTE2KHJnLCBiYSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShkc3QgKyAgMCksIFJHQkFfbG8pOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0ICsgMTYpLCBSR0JBX2hpKTsKK30KKworLy8gUGFjayBSL0cvQi9BIHJlc3VsdHMgaW50byAxNmIgb3V0cHV0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGFja0FuZFN0b3JlNDQ0NF9TU0UyKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMCkKKyAgY29uc3QgX19tMTI4aSByZzAgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgYmEwID0gX21tX3BhY2t1c19lcGkxNigqQiwgKkEpOworI2Vsc2UKKyAgY29uc3QgX19tMTI4aSByZzAgPSBfbW1fcGFja3VzX2VwaTE2KCpCLCAqQSk7CisgIGNvbnN0IF9fbTEyOGkgYmEwID0gX21tX3BhY2t1c19lcGkxNigqUiwgKkcpOworI2VuZGlmCisgIGNvbnN0IF9fbTEyOGkgbWFza18weGYwID0gX21tX3NldDFfZXBpOCgweGYwKTsKKyAgY29uc3QgX19tMTI4aSByYjEgPSBfbW1fdW5wYWNrbG9fZXBpOChyZzAsIGJhMCk7ICAvLyByYnJicmJyYnJiLi4uCisgIGNvbnN0IF9fbTEyOGkgZ2ExID0gX21tX3VucGFja2hpX2VwaTgocmcwLCBiYTApOyAgLy8gZ2FnYWdhZ2FnYS4uLgorICBjb25zdCBfX20xMjhpIHJiMiA9IF9tbV9hbmRfc2kxMjgocmIxLCBtYXNrXzB4ZjApOworICBjb25zdCBfX20xMjhpIGdhMiA9IF9tbV9zcmxpX2VwaTE2KF9tbV9hbmRfc2kxMjgoZ2ExLCBtYXNrXzB4ZjApLCA0KTsKKyAgY29uc3QgX19tMTI4aSByZ2JhNDQ0NCA9IF9tbV9vcl9zaTEyOChyYjIsIGdhMik7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgcmdiYTQ0NDQpOworfQorCisvLyBQYWNrIFIvRy9CIHJlc3VsdHMgaW50byAxNmIgb3V0cHV0Lgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUGFja0FuZFN0b3JlNTY1X1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkgcjAgPSBfbW1fcGFja3VzX2VwaTE2KCpSLCAqUik7CisgIGNvbnN0IF9fbTEyOGkgZzAgPSBfbW1fcGFja3VzX2VwaTE2KCpHLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgYjAgPSBfbW1fcGFja3VzX2VwaTE2KCpCLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgcjEgPSBfbW1fYW5kX3NpMTI4KHIwLCBfbW1fc2V0MV9lcGk4KDB4ZjgpKTsKKyAgY29uc3QgX19tMTI4aSBiMSA9IF9tbV9hbmRfc2kxMjgoX21tX3NybGlfZXBpMTYoYjAsIDMpLCBfbW1fc2V0MV9lcGk4KDB4MWYpKTsKKyAgY29uc3QgX19tMTI4aSBnMSA9IF9tbV9zcmxpX2VwaTE2KF9tbV9hbmRfc2kxMjgoZzAsIF9tbV9zZXQxX2VwaTgoMHhlMCkpLCA1KTsKKyAgY29uc3QgX19tMTI4aSBnMiA9IF9tbV9zbGxpX2VwaTE2KF9tbV9hbmRfc2kxMjgoZzAsIF9tbV9zZXQxX2VwaTgoMHgxYykpLCAzKTsKKyAgY29uc3QgX19tMTI4aSByZyA9IF9tbV9vcl9zaTEyOChyMSwgZzEpOworICBjb25zdCBfX20xMjhpIGdiID0gX21tX29yX3NpMTI4KGcyLCBiMSk7CisjaWYgKFdFQlBfU1dBUF8xNkJJVF9DU1AgPT0gMCkKKyAgY29uc3QgX19tMTI4aSByZ2I1NjUgPSBfbW1fdW5wYWNrbG9fZXBpOChyZywgZ2IpOworI2Vsc2UKKyAgY29uc3QgX19tMTI4aSByZ2I1NjUgPSBfbW1fdW5wYWNrbG9fZXBpOChnYiwgcmcpOworI2VuZGlmCisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKWRzdCwgcmdiNTY1KTsKK30KKworLy8gUGFjayB0aGUgcGxhbmFyIGJ1ZmZlcnMKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gdHJpcGxldCBieSB0cmlwbGV0IGluIHRoZSBvdXRwdXQgYnVmZmVyIHJnYiBhcyByZ2JyZ2JyZ2JyZ2IgLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQbGFuYXJUbzI0Yl9TU0UyKF9fbTEyOGkqIGNvbnN0IGluMCwgX19tMTI4aSogY29uc3QgaW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBpbjIsIF9fbTEyOGkqIGNvbnN0IGluMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgaW40LCBfX20xMjhpKiBjb25zdCBpbjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHJnYikgeworICAvLyBUaGUgaW5wdXQgaXMgNiByZWdpc3RlcnMgb2Ygc2l4dGVlbiA4YiBidXQgZm9yIHRoZSBzYWtlIG9mIGV4cGxhbmF0aW9uLAorICAvLyBsZXQncyB0YWtlIDYgcmVnaXN0ZXJzIG9mIGZvdXIgOGIgdmFsdWVzLgorICAvLyBUbyBwYWNrLCB3ZSB3aWxsIGtlZXAgdGFraW5nIG9uZSBldmVyeSB0d28gOGIgaW50ZWdlciBhbmQgbW92ZSBpdAorICAvLyBhcm91bmQgYXMgZm9sbG93czoKKyAgLy8gSW5wdXQ6CisgIC8vICAgcjByMXIycjMgfCByNHI1cjZyNyB8IGcwZzFnMmczIHwgZzRnNWc2ZzcgfCBiMGIxYjJiMyB8IGI0YjViNmI3CisgIC8vIFNwbGl0IHRoZSA2IHJlZ2lzdGVycyBpbiB0d28gc2V0cyBvZiAzIHJlZ2lzdGVyczogdGhlIGZpcnN0IHNldCBhcyB0aGUgZXZlbgorICAvLyA4YiBieXRlcywgdGhlIHNlY29uZCB0aGUgb2RkIG9uZXM6CisgIC8vICAgcjByMnI0cjYgfCBnMGcyZzRnNiB8IGIwYjJiNGI2IHwgcjFyM3I1cjcgfCBnMWczZzVnNyB8IGIxYjNiNWI3CisgIC8vIFJlcGVhdCB0aGUgc2FtZSBwZXJtdXRhdGlvbnMgdHdpY2UgbW9yZToKKyAgLy8gICByMHI0ZzBnNCB8IGIwYjRyMXI1IHwgZzFnNWIxYjUgfCByMnI2ZzJnNiB8IGIyYjZyM3I3IHwgZzNnN2IzYjcKKyAgLy8gICByMGcwYjByMSB8IGcxYjFyMmcyIHwgYjJyM2czYjMgfCByNGc0YjRyNSB8IGc1YjVyNmc2IHwgYjZyN2c3YjcKKyAgVlA4UGxhbmFyVG8yNGJfU1NFMihpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKKworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgIDApLCAqaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDE2KSwgKmluMSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAzMiksICppbjIpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgNDgpLCAqaW4zKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDY0KSwgKmluNCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA4MCksICppbjUpOworfQorCit2b2lkIFZQOFl1dlRvUmdiYTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQl9TU0UyKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigmUiwgJkcsICZCLCAma0FscGhhLCBkc3QpOworICB9Cit9CisKK3ZvaWQgVlA4WXV2VG9CZ3JhMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDMyKSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNF9TU0UyKCZCLCAmRywgJlIsICZrQWxwaGEsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb0FyZ2IzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIGNvbnN0IF9fbTEyOGkga0FscGhhID0gX21tX3NldDFfZXBpMTYoMjU1KTsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gPCAzMjsgbiArPSA4LCBkc3QgKz0gMzIpIHsKKyAgICBfX20xMjhpIFIsIEcsIEI7CisgICAgWVVWNDQ0VG9SR0JfU1NFMih5ICsgbiwgdSArIG4sIHYgKyBuLCAmUiwgJkcsICZCKTsKKyAgICBQYWNrQW5kU3RvcmU0X1NTRTIoJmtBbHBoYSwgJlIsICZHLCAmQiwgZHN0KTsKKyAgfQorfQorCit2b2lkIFZQOFl1dlRvUmdiYTQ0NDQzMl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHksIGNvbnN0IHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHYsIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBfX20xMjhpIGtBbHBoYSA9IF9tbV9zZXQxX2VwaTE2KDI1NSk7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgMzI7IG4gKz0gOCwgZHN0ICs9IDE2KSB7CisgICAgX19tMTI4aSBSLCBHLCBCOworICAgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIG4sIHUgKyBuLCB2ICsgbiwgJlIsICZHLCAmQik7CisgICAgUGFja0FuZFN0b3JlNDQ0NF9TU0UyKCZSLCAmRywgJkIsICZrQWxwaGEsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb1JnYjU2NTMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiA8IDMyOyBuICs9IDgsIGRzdCArPSAxNikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0NDRUb1JHQl9TU0UyKHkgKyBuLCB1ICsgbiwgdiArIG4sICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTU2NV9TU0UyKCZSLCAmRywgJkIsIGRzdCk7CisgIH0KK30KKwordm9pZCBWUDhZdXZUb1JnYjMyX1NTRTIoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCkgeworICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgIF9fbTEyOGkgcmdiMCwgcmdiMSwgcmdiMiwgcmdiMywgcmdiNCwgcmdiNTsKKworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAwLCB1ICsgMCwgdiArIDAsICZSMCwgJkcwLCAmQjApOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyA4LCB1ICsgOCwgdiArIDgsICZSMSwgJkcxLCAmQjEpOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAxNiwgdSArIDE2LCB2ICsgMTYsICZSMiwgJkcyLCAmQjIpOworICBZVVY0NDRUb1JHQl9TU0UyKHkgKyAyNCwgdSArIDI0LCB2ICsgMjQsICZSMywgJkczLCAmQjMpOworCisgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIFJSUlJHR0dHQkJCQi4KKyAgcmdiMCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgcmdiMSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgcmdiMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgcmdiMyA9IF9tbV9wYWNrdXNfZXBpMTYoRzIsIEczKTsKKyAgcmdiNCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgcmdiNSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKworICAvLyBQYWNrIGFzIFJHQlJHQlJHQlJHQi4KKyAgUGxhbmFyVG8yNGJfU1NFMigmcmdiMCwgJnJnYjEsICZyZ2IyLCAmcmdiMywgJnJnYjQsICZyZ2I1LCBkc3QpOworfQorCit2b2lkIFZQOFl1dlRvQmdyMzJfU1NFMihjb25zdCB1aW50OF90KiB5LCBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0KSB7CisgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgX19tMTI4aSBiZ3IwLCBiZ3IxLCBiZ3IyLCBiZ3IzLCBiZ3I0LCBiZ3I1OworCisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArICA4LCB1ICsgIDgsIHYgKyAgOCwgJlIxLCAmRzEsICZCMSk7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDE2LCB1ICsgMTYsIHYgKyAxNiwgJlIyLCAmRzIsICZCMik7CisgIFlVVjQ0NFRvUkdCX1NTRTIoeSArIDI0LCB1ICsgMjQsIHYgKyAyNCwgJlIzLCAmRzMsICZCMyk7CisKKyAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgQkJCQkdHR0dSUlJSLgorICBiZ3IwID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICBiZ3IxID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworICBiZ3IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICBiZ3IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICBiZ3I0ID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICBiZ3I1PSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisKKyAgLy8gUGFjayBhcyBCR1JCR1JCR1JCR1IuCisgIFBsYW5hclRvMjRiX1NTRTIoJmJncjAsICZiZ3IxLCAmYmdyMiwgJmJncjMsICZiZ3I0LCAmYmdyNSwgZHN0KTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXJiaXRyYXJ5LWxlbmd0aCByb3cgY29udmVyc2lvbiBmdW5jdGlvbnMKKworc3RhdGljIHZvaWQgWXV2VG9SZ2JhUm93X1NTRTIoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHksIHUsIHYsICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigmUiwgJkcsICZCLCAma0FscGhhLCBkc3QpOworICAgIHkgKz0gODsKKyAgICB1ICs9IDQ7CisgICAgdiArPSA0OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9SZ2JhKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDQ7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9CZ3JhUm93X1NTRTIoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHksIHUsIHYsICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigmQiwgJkcsICZSLCAma0FscGhhLCBkc3QpOworICAgIHkgKz0gODsKKyAgICB1ICs9IDQ7CisgICAgdiArPSA0OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9CZ3JhKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDQ7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9BcmdiUm93X1NTRTIoY29uc3QgdWludDhfdCogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgY29uc3QgX19tMTI4aSBrQWxwaGEgPSBfbW1fc2V0MV9lcGkxNigyNTUpOworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDggPD0gbGVuOyBuICs9IDgsIGRzdCArPSAzMikgeworICAgIF9fbTEyOGkgUiwgRywgQjsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHksIHUsIHYsICZSLCAmRywgJkIpOworICAgIFBhY2tBbmRTdG9yZTRfU1NFMigma0FscGhhLCAmUiwgJkcsICZCLCBkc3QpOworICAgIHkgKz0gODsKKyAgICB1ICs9IDQ7CisgICAgdiArPSA0OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9BcmdiKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDQ7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworc3RhdGljIHZvaWQgWXV2VG9SZ2JSb3dfU1NFMihjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IG47CisgIGZvciAobiA9IDA7IG4gKyAzMiA8PSBsZW47IG4gKz0gMzIsIGRzdCArPSAzMiAqIDMpIHsKKyAgICBfX20xMjhpIFIwLCBSMSwgUjIsIFIzLCBHMCwgRzEsIEcyLCBHMywgQjAsIEIxLCBCMiwgQjM7CisgICAgX19tMTI4aSByZ2IwLCByZ2IxLCByZ2IyLCByZ2IzLCByZ2I0LCByZ2I1OworCisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAgOCwgdSArICA0LCB2ICsgIDQsICZSMSwgJkcxLCAmQjEpOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArIDE2LCB1ICsgIDgsIHYgKyAgOCwgJlIyLCAmRzIsICZCMik7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgMjQsIHUgKyAxMiwgdiArIDEyLCAmUjMsICZHMywgJkIzKTsKKworICAgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIFJSUlJHR0dHQkJCQi4KKyAgICByZ2IwID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICAgIHJnYjEgPSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisgICAgcmdiMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgICByZ2IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICAgIHJnYjQgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgICAgcmdiNSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKworICAgIC8vIFBhY2sgYXMgUkdCUkdCUkdCUkdCLgorICAgIFBsYW5hclRvMjRiX1NTRTIoJnJnYjAsICZyZ2IxLCAmcmdiMiwgJnJnYjMsICZyZ2I0LCAmcmdiNSwgZHN0KTsKKworICAgIHkgKz0gMzI7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9SZ2IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gMzsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JnclJvd19TU0UyKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHUsIGNvbnN0IHVpbnQ4X3QqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDMyIDw9IGxlbjsgbiArPSAzMiwgZHN0ICs9IDMyICogMykgeworICAgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgICBfX20xMjhpIGJncjAsIGJncjEsIGJncjIsIGJncjMsIGJncjQsIGJncjU7CisKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICAgIFlVVjQyMFRvUkdCX1NTRTIoeSArICA4LCB1ICsgIDQsIHYgKyAgNCwgJlIxLCAmRzEsICZCMSk7CisgICAgWVVWNDIwVG9SR0JfU1NFMih5ICsgMTYsIHUgKyAgOCwgdiArICA4LCAmUjIsICZHMiwgJkIyKTsKKyAgICBZVVY0MjBUb1JHQl9TU0UyKHkgKyAyNCwgdSArIDEyLCB2ICsgMTIsICZSMywgJkczLCAmQjMpOworCisgICAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgQkJCQkdHR0dSUlJSLgorICAgIGJncjAgPSBfbW1fcGFja3VzX2VwaTE2KEIwLCBCMSk7CisgICAgYmdyMSA9IF9tbV9wYWNrdXNfZXBpMTYoQjIsIEIzKTsKKyAgICBiZ3IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICAgIGJncjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgICAgYmdyNCA9IF9tbV9wYWNrdXNfZXBpMTYoUjAsIFIxKTsKKyAgICBiZ3I1ID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworCisgICAgLy8gUGFjayBhcyBCR1JCR1JCR1JCR1IuCisgICAgUGxhbmFyVG8yNGJfU1NFMigmYmdyMCwgJmJncjEsICZiZ3IyLCAmYmdyMywgJmJncjQsICZiZ3I1LCBkc3QpOworCisgICAgeSArPSAzMjsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgIH0KKyAgZm9yICg7IG4gPCBsZW47ICsrbikgeyAgIC8vIEZpbmlzaCBvZmYKKyAgICBWUDhZdXZUb0Jncih5WzBdLCB1WzBdLCB2WzBdLCBkc3QpOworICAgIGRzdCArPSAzOworICAgIHkgKz0gMTsKKyAgICB1ICs9IChuICYgMSk7CisgICAgdiArPSAobiAmIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyeSBwb2ludAorCitleHRlcm4gdm9pZCBXZWJQSW5pdFNhbXBsZXJzU1NFMih2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0UyKHZvaWQpIHsKKyAgV2ViUFNhbXBsZXJzW01PREVfUkdCXSAgPSBZdXZUb1JnYlJvd19TU0UyOworICBXZWJQU2FtcGxlcnNbTU9ERV9SR0JBXSA9IFl1dlRvUmdiYVJvd19TU0UyOworICBXZWJQU2FtcGxlcnNbTU9ERV9CR1JdICA9IFl1dlRvQmdyUm93X1NTRTI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUkFdID0gWXV2VG9CZ3JhUm93X1NTRTI7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0FSR0JdID0gWXV2VG9BcmdiUm93X1NTRTI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSR0IyNC8zMiAtPiBZVVYgY29udmVydGVycworCisvLyBMb2FkIGVpZ2h0IDE2Yi13b3JkcyBmcm9tICpzcmMuCisjZGVmaW5lIExPQURfMTYoc3JjKSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMpKQorLy8gU3RvcmUgZWl0aGVyIDE2Yi13b3JkcyBpbnRvICpkc3QKKyNkZWZpbmUgU1RPUkVfMTYoViwgZHN0KSBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0KSwgKFYpKQorCisvLyBGdW5jdGlvbiB0aGF0IGluc2VydHMgYSB2YWx1ZSBvZiB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIGluIGJ1ZmZlciBpbiBiZXR3ZWVuCisvLyBldmVyeSB0d28gY2hhciBvZiB0aGUgZmlyc3QgaGFsZi4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMigKKyAgICBjb25zdCBfX20xMjhpKiBjb25zdCBpbiAvKmluWzZdKi8sIF9fbTEyOGkqIGNvbnN0IG91dCAvKm91dFs2XSovKSB7CisgIG91dFswXSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzBdLCBpblszXSk7CisgIG91dFsxXSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzBdLCBpblszXSk7CisgIG91dFsyXSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzFdLCBpbls0XSk7CisgIG91dFszXSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzFdLCBpbls0XSk7CisgIG91dFs0XSA9IF9tbV91bnBhY2tsb19lcGk4KGluWzJdLCBpbls1XSk7CisgIG91dFs1XSA9IF9tbV91bnBhY2toaV9lcGk4KGluWzJdLCBpbls1XSk7Cit9CisKKy8vIFVucGFjayB0aGUgOGIgaW5wdXQgcmdicmdicmdicmdiIC4uLiBhcyBjb250aWd1b3VzIHJlZ2lzdGVyczoKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gU2ltaWxhciB0byBQbGFuYXJUbzI0YkhlbHBlcigpLCBidXQgaW4gcmV2ZXJzZSBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFMigKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByZ2IsIF9fbTEyOGkqIGNvbnN0IG91dCAvKm91dFs2XSovKSB7CisgIF9fbTEyOGkgdG1wWzZdOworICB0bXBbMF0gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAgMCkpOworICB0bXBbMV0gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAxNikpOworICB0bXBbMl0gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAzMikpOworICB0bXBbM10gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA0OCkpOworICB0bXBbNF0gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA2NCkpOworICB0bXBbNV0gPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA4MCkpOworCisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMih0bXAsIG91dCk7CisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMihvdXQsIHRtcCk7CisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMih0bXAsIG91dCk7CisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMihvdXQsIHRtcCk7CisgIFJHQjI0UGFja2VkVG9QbGFuYXJIZWxwZXJfU1NFMih0bXAsIG91dCk7Cit9CisKKy8vIENvbnZlcnQgOCBwYWNrZWQgQVJHQiB0byByW10sIGdbXSwgYltdCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTIoY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgcmdiIC8qaW5bNl0qLykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBfX20xMjhpIGEwID0gTE9BRF8xNihhcmdiICsgMCk7CisgIF9fbTEyOGkgYTEgPSBMT0FEXzE2KGFyZ2IgKyA0KTsKKyAgX19tMTI4aSBhMiA9IExPQURfMTYoYXJnYiArIDgpOworICBfX20xMjhpIGEzID0gTE9BRF8xNihhcmdiICsgMTIpOworICBWUDhMMzJiVG9QbGFuYXJfU1NFMigmYTAsICZhMSwgJmEyLCAmYTMpOworICByZ2JbMF0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMSwgemVybyk7CisgIHJnYlsxXSA9IF9tbV91bnBhY2toaV9lcGk4KGExLCB6ZXJvKTsKKyAgcmdiWzJdID0gX21tX3VucGFja2xvX2VwaTgoYTIsIHplcm8pOworICByZ2JbM10gPSBfbW1fdW5wYWNraGlfZXBpOChhMiwgemVybyk7CisgIHJnYls0XSA9IF9tbV91bnBhY2tsb19lcGk4KGEzLCB6ZXJvKTsKKyAgcmdiWzVdID0gX21tX3VucGFja2hpX2VwaTgoYTMsIHplcm8pOworfQorCisvLyBUaGlzIG1hY3JvIGNvbXB1dGVzIChSRyAqIE1VTFRfUkcgKyBHQiAqIE1VTFRfR0IgKyBST1VOREVSKSA+PiBERVNDQUxFX0ZJWAorLy8gSXQncyBhIG1hY3JvIGFuZCBub3QgYSBmdW5jdGlvbiBiZWNhdXNlIHdlIG5lZWQgdG8gdXNlIGltbWVkaWF0ZSB2YWx1ZXMgd2l0aAorLy8gc3JhaV9lcGkzMiwgZS5nLgorI2RlZmluZSBUUkFOU0ZPUk0oUkdfTE8sIFJHX0hJLCBHQl9MTywgR0JfSEksIE1VTFRfUkcsIE1VTFRfR0IsIFwKKyAgICAgICAgICAgICAgICAgIFJPVU5ERVIsIERFU0NBTEVfRklYLCBPVVQpIGRvIHsgICAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjBfbG8gPSBfbW1fbWFkZF9lcGkxNihSR19MTywgTVVMVF9SRyk7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYwX2hpID0gX21tX21hZGRfZXBpMTYoUkdfSEksIE1VTFRfUkcpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMV9sbyA9IF9tbV9tYWRkX2VwaTE2KEdCX0xPLCBNVUxUX0dCKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjFfaGkgPSBfbW1fbWFkZF9lcGkxNihHQl9ISSwgTVVMVF9HQik7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYyX2xvID0gX21tX2FkZF9lcGkzMihWMF9sbywgVjFfbG8pOyAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMl9oaSA9IF9tbV9hZGRfZXBpMzIoVjBfaGksIFYxX2hpKTsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjNfbG8gPSBfbW1fYWRkX2VwaTMyKFYyX2xvLCBST1VOREVSKTsgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYzX2hpID0gX21tX2FkZF9lcGkzMihWMl9oaSwgUk9VTkRFUik7ICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWNV9sbyA9IF9tbV9zcmFpX2VwaTMyKFYzX2xvLCBERVNDQUxFX0ZJWCk7ICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjVfaGkgPSBfbW1fc3JhaV9lcGkzMihWM19oaSwgREVTQ0FMRV9GSVgpOyAgICAgXAorICAoT1VUKSA9IF9tbV9wYWNrc19lcGkzMihWNV9sbywgVjVfaGkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgTUtfQ1NUXzE2KEEsIEIpIF9tbV9zZXRfZXBpMTYoKEIpLCAoQSksIChCKSwgKEEpLCAoQiksIChBKSwgKEIpLCAoQSkpCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0UkdCVG9ZX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgWSkgeworICBjb25zdCBfX20xMjhpIGtSR195ID0gTUtfQ1NUXzE2KDE2ODM5LCAzMzA1OSAtIDE2Mzg0KTsKKyAgY29uc3QgX19tMTI4aSBrR0JfeSA9IE1LX0NTVF8xNigxNjM4NCwgNjQyMCk7CisgIGNvbnN0IF9fbTEyOGkga0hBTEZfWSA9IF9tbV9zZXQxX2VwaTMyKCgxNiA8PCBZVVZfRklYKSArIFlVVl9IQUxGKTsKKworICBjb25zdCBfX20xMjhpIFJHX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgUkdfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBHQl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqRywgKkIpOworICBjb25zdCBfX20xMjhpIEdCX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpHLCAqQik7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3ksIGtHQl95LCBrSEFMRl9ZLCBZVVZfRklYLCAqWSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIENvbnZlcnRSR0JUb1VWX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgVikgeworICBjb25zdCBfX20xMjhpIGtSR191ID0gTUtfQ1NUXzE2KC05NzE5LCAtMTkwODEpOworICBjb25zdCBfX20xMjhpIGtHQl91ID0gTUtfQ1NUXzE2KDAsIDI4ODAwKTsKKyAgY29uc3QgX19tMTI4aSBrUkdfdiA9IE1LX0NTVF8xNigyODgwMCwgMCk7CisgIGNvbnN0IF9fbTEyOGkga0dCX3YgPSBNS19DU1RfMTYoLTI0MTE2LCAtNDY4NCk7CisgIGNvbnN0IF9fbTEyOGkga0hBTEZfVVYgPSBfbW1fc2V0MV9lcGkzMigoKDEyOCA8PCBZVVZfRklYKSArIFlVVl9IQUxGKSA8PCAyKTsKKworICBjb25zdCBfX20xMjhpIFJHX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgUkdfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBHQl9sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqRywgKkIpOworICBjb25zdCBfX20xMjhpIEdCX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpHLCAqQik7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3UsIGtHQl91LAorICAgICAgICAgICAga0hBTEZfVVYsIFlVVl9GSVggKyAyLCAqVSk7CisgIFRSQU5TRk9STShSR19sbywgUkdfaGksIEdCX2xvLCBHQl9oaSwga1JHX3YsIGtHQl92LAorICAgICAgICAgICAga0hBTEZfVVYsIFlVVl9GSVggKyAyLCAqVik7Cit9CisKKyN1bmRlZiBNS19DU1RfMTYKKyN1bmRlZiBUUkFOU0ZPUk0KKworc3RhdGljIHZvaWQgQ29udmVydFJHQjI0VG9ZX1NTRTIoY29uc3QgdWludDhfdCogcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgcmdiICs9IDMgKiAxNiAqIDIpIHsKKyAgICBfX20xMjhpIHJnYl9wbGFuZVs2XTsKKyAgICBpbnQgajsKKworICAgIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFMihyZ2IsIHJnYl9wbGFuZSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqLCBpICs9IDE2KSB7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgX19tMTI4aSByLCBnLCBiLCBZMCwgWTE7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnIsICZnLCAmYiwgJlkwKTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIHIgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIGIgPSBfbW1fdW5wYWNraGlfZXBpOChyZ2JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFMigmciwgJmcsICZiLCAmWTEpOworCisgICAgICAvLyBDYXN0IHRvIDgtYml0IGFuZCBzdG9yZS4KKyAgICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICAgIH0KKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIHJnYiArPSAzKSB7ICAgLy8gbGVmdC1vdmVyCisgICAgeVtpXSA9IFZQOFJHQlRvWShyZ2JbMF0sIHJnYlsxXSwgcmdiWzJdLCBZVVZfSEFMRik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQ29udmVydEJHUjI0VG9ZX1NTRTIoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgYmdyICs9IDMgKiAxNiAqIDIpIHsKKyAgICBfX20xMjhpIGJncl9wbGFuZVs2XTsKKyAgICBpbnQgajsKKworICAgIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFMihiZ3IsIGJncl9wbGFuZSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqLCBpICs9IDE2KSB7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgX19tMTI4aSByLCBnLCBiLCBZMCwgWTE7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICBiID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICByID0gX21tX3VucGFja2xvX2VwaTgoYmdyX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTIoJnIsICZnLCAmYiwgJlkwKTsKKworICAgICAgLy8gQ29udmVydCB0byAxNi1iaXQgWS4KKyAgICAgIGIgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbMCArIGpdLCB6ZXJvKTsKKyAgICAgIGcgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbMiArIGpdLCB6ZXJvKTsKKyAgICAgIHIgPSBfbW1fdW5wYWNraGlfZXBpOChiZ3JfcGxhbmVbNCArIGpdLCB6ZXJvKTsKKyAgICAgIENvbnZlcnRSR0JUb1lfU1NFMigmciwgJmcsICZiLCAmWTEpOworCisgICAgICAvLyBDYXN0IHRvIDgtYml0IGFuZCBzdG9yZS4KKyAgICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICAgIH0KKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIGJnciArPSAzKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvWV9TU0UyKGNvbnN0IHVpbnQzMl90KiBhcmdiLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjE1OworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgaSArPSAxNikgeworICAgIF9fbTEyOGkgWTAsIFkxLCByZ2JbNl07CisgICAgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0UyKCZhcmdiW2ldLCByZ2IpOworICAgIENvbnZlcnRSR0JUb1lfU1NFMigmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmWTApOworICAgIENvbnZlcnRSR0JUb1lfU1NFMigmcmdiWzFdLCAmcmdiWzNdLCAmcmdiWzVdLCAmWTEpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSkgeyAgIC8vIGxlZnQtb3ZlcgorICAgIGNvbnN0IHVpbnQzMl90IHAgPSBhcmdiW2ldOworICAgIHlbaV0gPSBWUDhSR0JUb1koKHAgPj4gMTYpICYgMHhmZiwgKHAgPj4gOCkgJiAweGZmLCAocCA+PiAgMCkgJiAweGZmLAorICAgICAgICAgICAgICAgICAgICAgWVVWX0hBTEYpOworICB9Cit9CisKKy8vIEhvcml6b250YWwgYWRkIChkb3VibGVkKSBvZiB0d28gMTZiIHZhbHVlcywgcmVzdWx0IGlzIDE2Yi4KKy8vIGluOiBBIHwgQiB8IEMgfCBEIHwgLi4uIC0+IG91dDogMiooQStCKSB8IDIqKEMrRCkgfCAuLi4KK3N0YXRpYyB2b2lkIEhvcml6b250YWxBZGRQYWNrX1NTRTIoY29uc3QgX19tMTI4aSogY29uc3QgQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3Qgb3V0KSB7CisgIGNvbnN0IF9fbTEyOGkgazIgPSBfbW1fc2V0MV9lcGkxNigyKTsKKyAgY29uc3QgX19tMTI4aSBDID0gX21tX21hZGRfZXBpMTYoKkEsIGsyKTsKKyAgY29uc3QgX19tMTI4aSBEID0gX21tX21hZGRfZXBpMTYoKkIsIGsyKTsKKyAgKm91dCA9IF9tbV9wYWNrc19lcGkzMihDLCBEKTsKK30KKworc3RhdGljIHZvaWQgQ29udmVydEFSR0JUb1VWX1NTRTIoY29uc3QgdWludDMyX3QqIGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY193aWR0aCwgaW50IGRvX3N0b3JlKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSBzcmNfd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyBpICs9IDMyLCB1ICs9IDE2LCB2ICs9IDE2KSB7CisgICAgX19tMTI4aSByZ2JbNl0sIFUwLCBWMCwgVTEsIFYxOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFMigmYXJnYltpXSwgcmdiKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbMF0sICZyZ2JbMV0sICZyZ2JbMF0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYlsyXSwgJnJnYlszXSwgJnJnYlsyXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzRdLCAmcmdiWzVdLCAmcmdiWzRdKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0UyKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZVMCwgJlYwKTsKKworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFMigmYXJnYltpICsgMTZdLCByZ2IpOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTIoJnJnYlswXSwgJnJnYlsxXSwgJnJnYlswXSk7CisgICAgSG9yaXpvbnRhbEFkZFBhY2tfU1NFMigmcmdiWzJdLCAmcmdiWzNdLCAmcmdiWzJdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0UyKCZyZ2JbNF0sICZyZ2JbNV0sICZyZ2JbNF0pOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTIoJnJnYlswXSwgJnJnYlsyXSwgJnJnYls0XSwgJlUxLCAmVjEpOworCisgICAgVTAgPSBfbW1fcGFja3VzX2VwaTE2KFUwLCBVMSk7CisgICAgVjAgPSBfbW1fcGFja3VzX2VwaTE2KFYwLCBWMSk7CisgICAgaWYgKCFkb19zdG9yZSkgeworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3UgPSBMT0FEXzE2KHUpOworICAgICAgY29uc3QgX19tMTI4aSBwcmV2X3YgPSBMT0FEXzE2KHYpOworICAgICAgVTAgPSBfbW1fYXZnX2VwdTgoVTAsIHByZXZfdSk7CisgICAgICBWMCA9IF9tbV9hdmdfZXB1OChWMCwgcHJldl92KTsKKyAgICB9CisgICAgU1RPUkVfMTYoVTAsIHUpOworICAgIFNUT1JFXzE2KFYwLCB2KTsKKyAgfQorICBpZiAoaSA8IHNyY193aWR0aCkgeyAgLy8gbGVmdC1vdmVyCisgICAgV2ViUENvbnZlcnRBUkdCVG9VVl9DKGFyZ2IgKyBpLCB1LCB2LCBzcmNfd2lkdGggLSBpLCBkb19zdG9yZSk7CisgIH0KK30KKworLy8gQ29udmVydCAxNiBwYWNrZWQgQVJHQiAxNmItdmFsdWVzIHRvIHJbXSwgZ1tdLCBiW10KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJHQkEzMlBhY2tlZFRvUGxhbmFyXzE2Yl9TU0UyKAorICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCByZ2J4LAorICAgIF9fbTEyOGkqIGNvbnN0IHIsIF9fbTEyOGkqIGNvbnN0IGcsIF9fbTEyOGkqIGNvbnN0IGIpIHsKKyAgY29uc3QgX19tMTI4aSBpbjAgPSBMT0FEXzE2KHJnYnggKyAgMCk7ICAvLyByMCB8IGcwIHwgYjAgfHh8IHIxIHwgZzEgfCBiMSB8eAorICBjb25zdCBfX20xMjhpIGluMSA9IExPQURfMTYocmdieCArICA4KTsgIC8vIHIyIHwgZzIgfCBiMiB8eHwgcjMgfCBnMyB8IGIzIHx4CisgIGNvbnN0IF9fbTEyOGkgaW4yID0gTE9BRF8xNihyZ2J4ICsgMTYpOyAgLy8gcjQgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBpbjMgPSBMT0FEXzE2KHJnYnggKyAyNCk7ICAvLyByNiB8IC4uLgorICAvLyBjb2x1bW4td2lzZSB0cmFuc3Bvc2UKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV91bnBhY2tsb19lcGkxNihpbjAsIGluMSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fdW5wYWNraGlfZXBpMTYoaW4wLCBpbjEpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX3VucGFja2xvX2VwaTE2KGluMiwgaW4zKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV91bnBhY2toaV9lcGkxNihpbjIsIGluMyk7CisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQTAsIEExKTsgIC8vIHIwIHIxIHIyIHIzIHwgZzAgZzEgLi4KKyAgY29uc3QgX19tMTI4aSBCMSA9IF9tbV91bnBhY2toaV9lcGkxNihBMCwgQTEpOyAgLy8gYjAgYjEgYjIgYjMgfCB4IHggeCB4CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fdW5wYWNrbG9fZXBpMTYoQTIsIEEzKTsgIC8vIHI0IHI1IHI2IHI3IHwgZzQgZzUgLi4KKyAgY29uc3QgX19tMTI4aSBCMyA9IF9tbV91bnBhY2toaV9lcGkxNihBMiwgQTMpOyAgLy8gYjQgYjUgYjYgYjcgfCB4IHggeCB4CisgICpyID0gX21tX3VucGFja2xvX2VwaTY0KEIwLCBCMik7CisgICpnID0gX21tX3VucGFja2hpX2VwaTY0KEIwLCBCMik7CisgICpiID0gX21tX3VucGFja2xvX2VwaTY0KEIxLCBCMyk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0JBMzJUb1VWX1NTRTIoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4xNTsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGxhc3RfcmdiID0gcmdiICsgNCAqIG1heF93aWR0aDsKKyAgd2hpbGUgKHJnYiA8IGxhc3RfcmdiKSB7CisgICAgX19tMTI4aSByLCBnLCBiLCBVMCwgVjAsIFUxLCBWMTsKKyAgICBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFMihyZ2IgKyAgMCwgJnIsICZnLCAmYik7CisgICAgQ29udmVydFJHQlRvVVZfU1NFMigmciwgJmcsICZiLCAmVTAsICZWMCk7CisgICAgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTIocmdiICsgMzIsICZyLCAmZywgJmIpOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTIoJnIsICZnLCAmYiwgJlUxLCAmVjEpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoVTAsIFUxKSwgdSk7CisgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihWMCwgVjEpLCB2KTsKKyAgICB1ICs9IDE2OworICAgIHYgKz0gMTY7CisgICAgcmdiICs9IDIgKiAzMjsKKyAgfQorICBpZiAobWF4X3dpZHRoIDwgd2lkdGgpIHsgIC8vIGxlZnQtb3ZlcgorICAgIFdlYlBDb252ZXJ0UkdCQTMyVG9VVl9DKHJnYiwgdSwgdiwgd2lkdGggLSBtYXhfd2lkdGgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTIodm9pZCk7CisKK1dFQlBfVFNBTl9JR05PUkVfRlVOQ1RJT04gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0UyKHZvaWQpIHsKKyAgV2ViUENvbnZlcnRBUkdCVG9ZID0gQ29udmVydEFSR0JUb1lfU1NFMjsKKyAgV2ViUENvbnZlcnRBUkdCVG9VViA9IENvbnZlcnRBUkdCVG9VVl9TU0UyOworCisgIFdlYlBDb252ZXJ0UkdCMjRUb1kgPSBDb252ZXJ0UkdCMjRUb1lfU1NFMjsKKyAgV2ViUENvbnZlcnRCR1IyNFRvWSA9IENvbnZlcnRCR1IyNFRvWV9TU0UyOworCisgIFdlYlBDb252ZXJ0UkdCQTMyVG9VViA9IENvbnZlcnRSR0JBMzJUb1VWX1NTRTI7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX1kgKCgxIDw8IDEwKSAtIDEpICAgIC8vIDEwYiBwcmVjaXNpb24gb3ZlciAxNmItYXJpdGhtZXRpYworc3RhdGljIHVpbnQxNl90IGNsaXBfeShpbnQgdikgeworICByZXR1cm4gKHYgPCAwKSA/IDAgOiAodiA+IE1BWF9ZKSA/IE1BWF9ZIDogKHVpbnQxNl90KXY7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBTaGFycFlVVlVwZGF0ZVlfU1NFMihjb25zdCB1aW50MTZfdCogcmVmLCBjb25zdCB1aW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgdWludDY0X3QgZGlmZiA9IDA7CisgIHVpbnQzMl90IHRtcFs0XTsKKyAgaW50IGk7CisgIGNvbnN0IF9fbTEyOGkgemVybyA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgIGNvbnN0IF9fbTEyOGkgbWF4ID0gX21tX3NldDFfZXBpMTYoTUFYX1kpOworICBjb25zdCBfX20xMjhpIG9uZSA9IF9tbV9zZXQxX2VwaTE2KDEpOworICBfX20xMjhpIHN1bSA9IHplcm87CisKKyAgZm9yIChpID0gMDsgaSArIDggPD0gbGVuOyBpICs9IDgpIHsKKyAgICBjb25zdCBfX20xMjhpIEEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZWYgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBCID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoc3JjICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGRzdCArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEQgPSBfbW1fc3ViX2VwaTE2KEEsIEIpOyAgICAgICAvLyBkaWZmX3kKKyAgICBjb25zdCBfX20xMjhpIEUgPSBfbW1fY21wZ3RfZXBpMTYoemVybywgRCk7ICAvLyBzaWduICgtMSBvciAwKQorICAgIGNvbnN0IF9fbTEyOGkgRiA9IF9tbV9hZGRfZXBpMTYoQywgRCk7ICAgICAgIC8vIG5ld195CisgICAgY29uc3QgX19tMTI4aSBHID0gX21tX29yX3NpMTI4KEUsIG9uZSk7ICAgICAgLy8gLTEgb3IgMQorICAgIGNvbnN0IF9fbTEyOGkgSCA9IF9tbV9tYXhfZXBpMTYoX21tX21pbl9lcGkxNihGLCBtYXgpLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIEkgPSBfbW1fbWFkZF9lcGkxNihELCBHKTsgICAgICAvLyBzdW0oYWJzKC4uLikpCisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGkpLCBIKTsKKyAgICBzdW0gPSBfbW1fYWRkX2VwaTMyKHN1bSwgSSk7CisgIH0KKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopdG1wLCBzdW0pOworICBkaWZmID0gdG1wWzNdICsgdG1wWzJdICsgdG1wWzFdICsgdG1wWzBdOworICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfeSA9IHJlZltpXSAtIHNyY1tpXTsKKyAgICBjb25zdCBpbnQgbmV3X3kgPSAoaW50KWRzdFtpXSArIGRpZmZfeTsKKyAgICBkc3RbaV0gPSBjbGlwX3kobmV3X3kpOworICAgIGRpZmYgKz0gKHVpbnQ2NF90KWFicyhkaWZmX3kpOworICB9CisgIHJldHVybiBkaWZmOworfQorCitzdGF0aWMgdm9pZCBTaGFycFlVVlVwZGF0ZVJHQl9TU0UyKGNvbnN0IGludDE2X3QqIHJlZiwgY29uc3QgaW50MTZfdCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBkc3QsIGludCBsZW4pIHsKKyAgaW50IGkgPSAwOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgQSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJlZiArIGkpKTsKKyAgICBjb25zdCBfX20xMjhpIEIgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMgKyBpKSk7CisgICAgY29uc3QgX19tMTI4aSBDID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoZHN0ICsgaSkpOworICAgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9zdWJfZXBpMTYoQSwgQik7ICAgLy8gZGlmZl91dgorICAgIGNvbnN0IF9fbTEyOGkgRSA9IF9tbV9hZGRfZXBpMTYoQywgRCk7ICAgLy8gbmV3X3V2CisgICAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKGRzdCArIGkpLCBFKTsKKyAgfQorICBmb3IgKDsgaSA8IGxlbjsgKytpKSB7CisgICAgY29uc3QgaW50IGRpZmZfdXYgPSByZWZbaV0gLSBzcmNbaV07CisgICAgZHN0W2ldICs9IGRpZmZfdXY7CisgIH0KK30KKworc3RhdGljIHZvaWQgU2hhcnBZVVZGaWx0ZXJSb3dfU1NFMihjb25zdCBpbnQxNl90KiBBLCBjb25zdCBpbnQxNl90KiBCLCBpbnQgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogYmVzdF95LCB1aW50MTZfdCogb3V0KSB7CisgIGludCBpOworICBjb25zdCBfX20xMjhpIGtDc3Q4ID0gX21tX3NldDFfZXBpMTYoOCk7CisgIGNvbnN0IF9fbTEyOGkgbWF4ID0gX21tX3NldDFfZXBpMTYoTUFYX1kpOworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBmb3IgKGkgPSAwOyBpICsgOCA8PSBsZW47IGkgKz0gOCkgeworICAgIGNvbnN0IF9fbTEyOGkgYTAgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShBICsgaSArIDApKTsKKyAgICBjb25zdCBfX20xMjhpIGExID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoQSArIGkgKyAxKSk7CisgICAgY29uc3QgX19tMTI4aSBiMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKEIgKyBpICsgMCkpOworICAgIGNvbnN0IF9fbTEyOGkgYjEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShCICsgaSArIDEpKTsKKyAgICBjb25zdCBfX20xMjhpIGEwYjEgPSBfbW1fYWRkX2VwaTE2KGEwLCBiMSk7CisgICAgY29uc3QgX19tMTI4aSBhMWIwID0gX21tX2FkZF9lcGkxNihhMSwgYjApOworICAgIGNvbnN0IF9fbTEyOGkgYTBhMWIwYjEgPSBfbW1fYWRkX2VwaTE2KGEwYjEsIGExYjApOyAgLy8gQTArQTErQjArQjEKKyAgICBjb25zdCBfX20xMjhpIGEwYTFiMGIxXzggPSBfbW1fYWRkX2VwaTE2KGEwYTFiMGIxLCBrQ3N0OCk7CisgICAgY29uc3QgX19tMTI4aSBhMGIxXzIgPSBfbW1fYWRkX2VwaTE2KGEwYjEsIGEwYjEpOyAgICAvLyAyKihBMCtCMSkKKyAgICBjb25zdCBfX20xMjhpIGExYjBfMiA9IF9tbV9hZGRfZXBpMTYoYTFiMCwgYTFiMCk7ICAgIC8vIDIqKEExK0IwKQorICAgIGNvbnN0IF9fbTEyOGkgYzAgPSBfbW1fc3JhaV9lcGkxNihfbW1fYWRkX2VwaTE2KGEwYjFfMiwgYTBhMWIwYjFfOCksIDMpOworICAgIGNvbnN0IF9fbTEyOGkgYzEgPSBfbW1fc3JhaV9lcGkxNihfbW1fYWRkX2VwaTE2KGExYjBfMiwgYTBhMWIwYjFfOCksIDMpOworICAgIGNvbnN0IF9fbTEyOGkgZDAgPSBfbW1fYWRkX2VwaTE2KGMxLCBhMCk7CisgICAgY29uc3QgX19tMTI4aSBkMSA9IF9tbV9hZGRfZXBpMTYoYzAsIGExKTsKKyAgICBjb25zdCBfX20xMjhpIGUwID0gX21tX3NyYWlfZXBpMTYoZDAsIDEpOworICAgIGNvbnN0IF9fbTEyOGkgZTEgPSBfbW1fc3JhaV9lcGkxNihkMSwgMSk7CisgICAgY29uc3QgX19tMTI4aSBmMCA9IF9tbV91bnBhY2tsb19lcGkxNihlMCwgZTEpOworICAgIGNvbnN0IF9fbTEyOGkgZjEgPSBfbW1fdW5wYWNraGlfZXBpMTYoZTAsIGUxKTsKKyAgICBjb25zdCBfX20xMjhpIGcwID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikoYmVzdF95ICsgMiAqIGkgKyAwKSk7CisgICAgY29uc3QgX19tMTI4aSBnMSA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKGJlc3RfeSArIDIgKiBpICsgOCkpOworICAgIGNvbnN0IF9fbTEyOGkgaDAgPSBfbW1fYWRkX2VwaTE2KGcwLCBmMCk7CisgICAgY29uc3QgX19tMTI4aSBoMSA9IF9tbV9hZGRfZXBpMTYoZzEsIGYxKTsKKyAgICBjb25zdCBfX20xMjhpIGkwID0gX21tX21heF9lcGkxNihfbW1fbWluX2VwaTE2KGgwLCBtYXgpLCB6ZXJvKTsKKyAgICBjb25zdCBfX20xMjhpIGkxID0gX21tX21heF9lcGkxNihfbW1fbWluX2VwaTE2KGgxLCBtYXgpLCB6ZXJvKTsKKyAgICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikob3V0ICsgMiAqIGkgKyAwKSwgaTApOworICAgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShvdXQgKyAyICogaSArIDgpLCBpMSk7CisgIH0KKyAgZm9yICg7IGkgPCBsZW47ICsraSkgeworICAgIC8vICAgKDkgKiBBMCArIDMgKiBBMSArIDMgKiBCMCArIEIxICsgOCkgPj4gNCA9CisgICAgLy8gPSAoOCAqIEEwICsgMiAqIChBMSArIEIwKSArIChBMCArIEExICsgQjAgKyBCMSArIDgpKSA+PiA0CisgICAgLy8gV2UgcmV1c2UgdGhlIGNvbW1vbiBzdWItZXhwcmVzc2lvbnMuCisgICAgY29uc3QgaW50IGEwYjEgPSBBW2kgKyAwXSArIEJbaSArIDFdOworICAgIGNvbnN0IGludCBhMWIwID0gQVtpICsgMV0gKyBCW2kgKyAwXTsKKyAgICBjb25zdCBpbnQgYTBhMWIwYjEgPSBhMGIxICsgYTFiMCArIDg7CisgICAgY29uc3QgaW50IHYwID0gKDggKiBBW2kgKyAwXSArIDIgKiBhMWIwICsgYTBhMWIwYjEpID4+IDQ7CisgICAgY29uc3QgaW50IHYxID0gKDggKiBBW2kgKyAxXSArIDIgKiBhMGIxICsgYTBhMWIwYjEpID4+IDQ7CisgICAgb3V0WzIgKiBpICsgMF0gPSBjbGlwX3koYmVzdF95WzIgKiBpICsgMF0gKyB2MCk7CisgICAgb3V0WzIgKiBpICsgMV0gPSBjbGlwX3koYmVzdF95WzIgKiBpICsgMV0gKyB2MSk7CisgIH0KK30KKworI3VuZGVmIE1BWF9ZCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2hhcnBZVVZTU0UyKHZvaWQpOworCitXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgV2ViUEluaXRTaGFycFlVVlNTRTIodm9pZCkgeworICBXZWJQU2hhcnBZVVZVcGRhdGVZID0gU2hhcnBZVVZVcGRhdGVZX1NTRTI7CisgIFdlYlBTaGFycFlVVlVwZGF0ZVJHQiA9IFNoYXJwWVVWVXBkYXRlUkdCX1NTRTI7CisgIFdlYlBTaGFycFlVVkZpbHRlclJvdyA9IFNoYXJwWVVWRmlsdGVyUm93X1NTRTI7Cit9CisKKyNlbHNlICAvLyAhV0VCUF9VU0VfU1NFMgorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTYW1wbGVyc1NTRTIpCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWU1NFMikKK1dFQlBfRFNQX0lOSVRfU1RVQihXZWJQSW5pdFNoYXJwWVVWU1NFMikKKworI2VuZGlmICAvLyBXRUJQX1VTRV9TU0UyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZHNwL3l1dl9zc2U0MS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlNDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzlkMWY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2RzcC95dXZfc3NlNDEuYwpAQCAtMCwwICsxLDYxMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFlVVi0+UkdCIGNvbnZlcnNpb24gZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy9kc3AveXV2LmgiCisKKyNpZiBkZWZpbmVkKFdFQlBfVVNFX1NTRTQxKQorCisjaW5jbHVkZSAic3JjL2RzcC9jb21tb25fc3NlNDEuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzbW1pbnRyaW4uaD4KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29udmVydCBzcGFucyBvZiAzMiBwaXhlbHMgdG8gdmFyaW91cyBSR0IgZm9ybWF0cyBmb3IgdGhlIGZhbmN5IHVwc2FtcGxlci4KKworLy8gVGhlc2UgY29uc3RhbnRzIGFyZSAxNGIgZml4ZWQtcG9pbnQgdmVyc2lvbiBvZiBJVFUtUiBCVC42MDEgY29uc3RhbnRzLgorLy8gUiA9ICgxOTA3NyAqIHkgICAgICAgICAgICAgKyAyNjE0OSAqIHYgLSAxNDIzNCkgPj4gNgorLy8gRyA9ICgxOTA3NyAqIHkgLSAgNjQxOSAqIHUgLSAxMzMyMCAqIHYgKyAgODcwOCkgPj4gNgorLy8gQiA9ICgxOTA3NyAqIHkgKyAzMzA1MCAqIHUgICAgICAgICAgICAgLSAxNzY4NSkgPj4gNgorc3RhdGljIHZvaWQgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTQxKGNvbnN0IF9fbTEyOGkqIGNvbnN0IFkwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IFUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IFYwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBCKSB7CisgIGNvbnN0IF9fbTEyOGkgazE5MDc3ID0gX21tX3NldDFfZXBpMTYoMTkwNzcpOworICBjb25zdCBfX20xMjhpIGsyNjE0OSA9IF9tbV9zZXQxX2VwaTE2KDI2MTQ5KTsKKyAgY29uc3QgX19tMTI4aSBrMTQyMzQgPSBfbW1fc2V0MV9lcGkxNigxNDIzNCk7CisgIC8vIDMzMDUwIGRvZXNuJ3QgZml0IGluIGEgc2lnbmVkIHNob3J0OiBvbmx5IHVzZSB0aGlzIHdpdGggdW5zaWduZWQgYXJpdGhtZXRpYworICBjb25zdCBfX20xMjhpIGszMzA1MCA9IF9tbV9zZXQxX2VwaTE2KChzaG9ydCkzMzA1MCk7CisgIGNvbnN0IF9fbTEyOGkgazE3Njg1ID0gX21tX3NldDFfZXBpMTYoMTc2ODUpOworICBjb25zdCBfX20xMjhpIGs2NDE5ICA9IF9tbV9zZXQxX2VwaTE2KDY0MTkpOworICBjb25zdCBfX20xMjhpIGsxMzMyMCA9IF9tbV9zZXQxX2VwaTE2KDEzMzIwKTsKKyAgY29uc3QgX19tMTI4aSBrODcwOCAgPSBfbW1fc2V0MV9lcGkxNig4NzA4KTsKKworICBjb25zdCBfX20xMjhpIFkxID0gX21tX211bGhpX2VwdTE2KCpZMCwgazE5MDc3KTsKKworICBjb25zdCBfX20xMjhpIFIwID0gX21tX211bGhpX2VwdTE2KCpWMCwgazI2MTQ5KTsKKyAgY29uc3QgX19tMTI4aSBSMSA9IF9tbV9zdWJfZXBpMTYoWTEsIGsxNDIzNCk7CisgIGNvbnN0IF9fbTEyOGkgUjIgPSBfbW1fYWRkX2VwaTE2KFIxLCBSMCk7CisKKyAgY29uc3QgX19tMTI4aSBHMCA9IF9tbV9tdWxoaV9lcHUxNigqVTAsIGs2NDE5KTsKKyAgY29uc3QgX19tMTI4aSBHMSA9IF9tbV9tdWxoaV9lcHUxNigqVjAsIGsxMzMyMCk7CisgIGNvbnN0IF9fbTEyOGkgRzIgPSBfbW1fYWRkX2VwaTE2KFkxLCBrODcwOCk7CisgIGNvbnN0IF9fbTEyOGkgRzMgPSBfbW1fYWRkX2VwaTE2KEcwLCBHMSk7CisgIGNvbnN0IF9fbTEyOGkgRzQgPSBfbW1fc3ViX2VwaTE2KEcyLCBHMyk7CisKKyAgLy8gYmUgY2FyZWZ1bCB3aXRoIHRoZSBzYXR1cmF0ZWQgKnVuc2lnbmVkKiBhcml0aG1ldGljIGhlcmUhCisgIGNvbnN0IF9fbTEyOGkgQjAgPSBfbW1fbXVsaGlfZXB1MTYoKlUwLCBrMzMwNTApOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX2FkZHNfZXB1MTYoQjAsIFkxKTsKKyAgY29uc3QgX19tMTI4aSBCMiA9IF9tbV9zdWJzX2VwdTE2KEIxLCBrMTc2ODUpOworCisgIC8vIHVzZSBsb2dpY2FsIHNoaWZ0IGZvciBCMiwgd2hpY2ggY2FuIGJlIGxhcmdlciB0aGFuIDMyNzY3CisgICpSID0gX21tX3NyYWlfZXBpMTYoUjIsIDYpOyAgIC8vIHJhbmdlOiBbLTE0MjM0LCAzMDgxNV0KKyAgKkcgPSBfbW1fc3JhaV9lcGkxNihHNCwgNik7ICAgLy8gcmFuZ2U6IFstMTA5NTMsIDI3NzEwXQorICAqQiA9IF9tbV9zcmxpX2VwaTE2KEIyLCA2KTsgICAvLyByYW5nZTogWzAsIDM0MjM4XQorfQorCisvLyBMb2FkIHRoZSBieXRlcyBpbnRvIHRoZSAqdXBwZXIqIHBhcnQgb2YgMTZiIHdvcmRzLiBUaGF0J3MgIjw8IDgiLCBiYXNpY2FsbHkuCitzdGF0aWMgV0VCUF9JTkxJTkUgX19tMTI4aSBMb2FkX0hJXzE2X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICByZXR1cm4gX21tX3VucGFja2xvX2VwaTgoemVybywgX21tX2xvYWRsX2VwaTY0KChjb25zdCBfX20xMjhpKilzcmMpKTsKK30KKworLy8gTG9hZCBhbmQgcmVwbGljYXRlIHRoZSBVL1Ygc2FtcGxlcworc3RhdGljIFdFQlBfSU5MSU5FIF9fbTEyOGkgTG9hZF9VVl9ISV84X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHNyYykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBjb25zdCBfX20xMjhpIHRtcDAgPSBfbW1fY3Z0c2kzMl9zaTEyOCgqKGNvbnN0IHVpbnQzMl90KilzcmMpOworICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fdW5wYWNrbG9fZXBpOCh6ZXJvLCB0bXAwKTsKKyAgcmV0dXJuIF9tbV91bnBhY2tsb19lcGkxNih0bXAxLCB0bXAxKTsgICAvLyByZXBsaWNhdGUgc2FtcGxlcworfQorCisvLyBDb252ZXJ0IDMyIHNhbXBsZXMgb2YgWVVWNDQ0IHRvIFIvRy9CCitzdGF0aWMgdm9pZCBZVVY0NDRUb1JHQl9TU0U0MShjb25zdCB1aW50OF90KiBjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNl9TU0U0MSh5KSwgVTAgPSBMb2FkX0hJXzE2X1NTRTQxKHUpLAorICAgICAgICAgICAgICAgIFYwID0gTG9hZF9ISV8xNl9TU0U0MSh2KTsKKyAgQ29udmVydFlVVjQ0NFRvUkdCX1NTRTQxKCZZMCwgJlUwLCAmVjAsIFIsIEcsIEIpOworfQorCisvLyBDb252ZXJ0IDMyIHNhbXBsZXMgb2YgWVVWNDIwIHRvIFIvRy9CCitzdGF0aWMgdm9pZCBZVVY0MjBUb1JHQl9TU0U0MShjb25zdCB1aW50OF90KiBjb25zdCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBSLCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgQikgeworICBjb25zdCBfX20xMjhpIFkwID0gTG9hZF9ISV8xNl9TU0U0MSh5KSwgVTAgPSBMb2FkX1VWX0hJXzhfU1NFNDEodSksCisgICAgICAgICAgICAgICAgVjAgPSBMb2FkX1VWX0hJXzhfU1NFNDEodik7CisgIENvbnZlcnRZVVY0NDRUb1JHQl9TU0U0MSgmWTAsICZVMCwgJlYwLCBSLCBHLCBCKTsKK30KKworLy8gUGFjayB0aGUgcGxhbmFyIGJ1ZmZlcnMKKy8vIHJycnIuLi4gcnJyci4uLiBnZ2dnLi4uIGdnZ2cuLi4gYmJiYi4uLiBiYmJiLi4uLgorLy8gdHJpcGxldCBieSB0cmlwbGV0IGluIHRoZSBvdXRwdXQgYnVmZmVyIHJnYiBhcyByZ2JyZ2JyZ2JyZ2IgLi4uCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQbGFuYXJUbzI0Yl9TU0U0MSgKKyAgICBfX20xMjhpKiBjb25zdCBpbjAsIF9fbTEyOGkqIGNvbnN0IGluMSwgX19tMTI4aSogY29uc3QgaW4yLAorICAgIF9fbTEyOGkqIGNvbnN0IGluMywgX19tMTI4aSogY29uc3QgaW40LCBfX20xMjhpKiBjb25zdCBpbjUsCisgICAgdWludDhfdCogY29uc3QgcmdiKSB7CisgIC8vIFRoZSBpbnB1dCBpcyA2IHJlZ2lzdGVycyBvZiBzaXh0ZWVuIDhiIGJ1dCBmb3IgdGhlIHNha2Ugb2YgZXhwbGFuYXRpb24sCisgIC8vIGxldCdzIHRha2UgNiByZWdpc3RlcnMgb2YgZm91ciA4YiB2YWx1ZXMuCisgIC8vIFRvIHBhY2ssIHdlIHdpbGwga2VlcCB0YWtpbmcgb25lIGV2ZXJ5IHR3byA4YiBpbnRlZ2VyIGFuZCBtb3ZlIGl0CisgIC8vIGFyb3VuZCBhcyBmb2xsb3dzOgorICAvLyBJbnB1dDoKKyAgLy8gICByMHIxcjJyMyB8IHI0cjVyNnI3IHwgZzBnMWcyZzMgfCBnNGc1ZzZnNyB8IGIwYjFiMmIzIHwgYjRiNWI2YjcKKyAgLy8gU3BsaXQgdGhlIDYgcmVnaXN0ZXJzIGluIHR3byBzZXRzIG9mIDMgcmVnaXN0ZXJzOiB0aGUgZmlyc3Qgc2V0IGFzIHRoZSBldmVuCisgIC8vIDhiIGJ5dGVzLCB0aGUgc2Vjb25kIHRoZSBvZGQgb25lczoKKyAgLy8gICByMHIycjRyNiB8IGcwZzJnNGc2IHwgYjBiMmI0YjYgfCByMXIzcjVyNyB8IGcxZzNnNWc3IHwgYjFiM2I1YjcKKyAgLy8gUmVwZWF0IHRoZSBzYW1lIHBlcm11dGF0aW9ucyB0d2ljZSBtb3JlOgorICAvLyAgIHIwcjRnMGc0IHwgYjBiNHIxcjUgfCBnMWc1YjFiNSB8IHIycjZnMmc2IHwgYjJiNnIzcjcgfCBnM2c3YjNiNworICAvLyAgIHIwZzBiMHIxIHwgZzFiMXIyZzIgfCBiMnIzZzNiMyB8IHI0ZzRiNHI1IHwgZzViNXI2ZzYgfCBiNnI3ZzdiNworICBWUDhQbGFuYXJUbzI0Yl9TU0U0MShpbjAsIGluMSwgaW4yLCBpbjMsIGluNCwgaW41KTsKKworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgIDApLCAqaW4wKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDE2KSwgKmluMSk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyAzMiksICppbjIpOworICBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikocmdiICsgNDgpLCAqaW4zKTsKKyAgX21tX3N0b3JldV9zaTEyOCgoX19tMTI4aSopKHJnYiArIDY0KSwgKmluNCk7CisgIF9tbV9zdG9yZXVfc2kxMjgoKF9fbTEyOGkqKShyZ2IgKyA4MCksICppbjUpOworfQorCit2b2lkIFZQOFl1dlRvUmdiMzJfU1NFNDEoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICBfX20xMjhpIHJnYjAsIHJnYjEsIHJnYjIsIHJnYjMsIHJnYjQsIHJnYjU7CisKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDAsIHUgKyAwLCB2ICsgMCwgJlIwLCAmRzAsICZCMCk7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyA4LCB1ICsgOCwgdiArIDgsICZSMSwgJkcxLCAmQjEpOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgMTYsIHUgKyAxNiwgdiArIDE2LCAmUjIsICZHMiwgJkIyKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDI0LCB1ICsgMjQsIHYgKyAyNCwgJlIzLCAmRzMsICZCMyk7CisKKyAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgUlJSUkdHR0dCQkJCLgorICByZ2IwID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICByZ2IxID0gX21tX3BhY2t1c19lcGkxNihSMiwgUjMpOworICByZ2IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICByZ2IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICByZ2I0ID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICByZ2I1ID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworCisgIC8vIFBhY2sgYXMgUkdCUkdCUkdCUkdCLgorICBQbGFuYXJUbzI0Yl9TU0U0MSgmcmdiMCwgJnJnYjEsICZyZ2IyLCAmcmdiMywgJnJnYjQsICZyZ2I1LCBkc3QpOworfQorCit2b2lkIFZQOFl1dlRvQmdyMzJfU1NFNDEoY29uc3QgdWludDhfdCogeSwgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkc3QpIHsKKyAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICBfX20xMjhpIGJncjAsIGJncjEsIGJncjIsIGJncjMsIGJncjQsIGJncjU7CisKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArICAwLCB1ICsgIDAsIHYgKyAgMCwgJlIwLCAmRzAsICZCMCk7CisgIFlVVjQ0NFRvUkdCX1NTRTQxKHkgKyAgOCwgdSArICA4LCB2ICsgIDgsICZSMSwgJkcxLCAmQjEpOworICBZVVY0NDRUb1JHQl9TU0U0MSh5ICsgMTYsIHUgKyAxNiwgdiArIDE2LCAmUjIsICZHMiwgJkIyKTsKKyAgWVVWNDQ0VG9SR0JfU1NFNDEoeSArIDI0LCB1ICsgMjQsIHYgKyAyNCwgJlIzLCAmRzMsICZCMyk7CisKKyAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgQkJCQkdHR0dSUlJSLgorICBiZ3IwID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICBiZ3IxID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworICBiZ3IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICBiZ3IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICBiZ3I0ID0gX21tX3BhY2t1c19lcGkxNihSMCwgUjEpOworICBiZ3I1PSBfbW1fcGFja3VzX2VwaTE2KFIyLCBSMyk7CisKKyAgLy8gUGFjayBhcyBCR1JCR1JCR1JCR1IuCisgIFBsYW5hclRvMjRiX1NTRTQxKCZiZ3IwLCAmYmdyMSwgJmJncjIsICZiZ3IzLCAmYmdyNCwgJmJncjUsIGRzdCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFyYml0cmFyeS1sZW5ndGggcm93IGNvbnZlcnNpb24gZnVuY3Rpb25zCisKK3N0YXRpYyB2b2lkIFl1dlRvUmdiUm93X1NTRTQxKGNvbnN0IHVpbnQ4X3QqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1LCBjb25zdCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuICsgMzIgPD0gbGVuOyBuICs9IDMyLCBkc3QgKz0gMzIgKiAzKSB7CisgICAgX19tMTI4aSBSMCwgUjEsIFIyLCBSMywgRzAsIEcxLCBHMiwgRzMsIEIwLCBCMSwgQjIsIEIzOworICAgIF9fbTEyOGkgcmdiMCwgcmdiMSwgcmdiMiwgcmdiMywgcmdiNCwgcmdiNTsKKworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAgMCwgdSArICAwLCB2ICsgIDAsICZSMCwgJkcwLCAmQjApOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAgOCwgdSArICA0LCB2ICsgIDQsICZSMSwgJkcxLCAmQjEpOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAxNiwgdSArICA4LCB2ICsgIDgsICZSMiwgJkcyLCAmQjIpOworICAgIFlVVjQyMFRvUkdCX1NTRTQxKHkgKyAyNCwgdSArIDEyLCB2ICsgMTIsICZSMywgJkczLCAmQjMpOworCisgICAgLy8gQ2FzdCB0byA4YiBhbmQgc3RvcmUgYXMgUlJSUkdHR0dCQkJCLgorICAgIHJnYjAgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgICAgcmdiMSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKyAgICByZ2IyID0gX21tX3BhY2t1c19lcGkxNihHMCwgRzEpOworICAgIHJnYjMgPSBfbW1fcGFja3VzX2VwaTE2KEcyLCBHMyk7CisgICAgcmdiNCA9IF9tbV9wYWNrdXNfZXBpMTYoQjAsIEIxKTsKKyAgICByZ2I1ID0gX21tX3BhY2t1c19lcGkxNihCMiwgQjMpOworCisgICAgLy8gUGFjayBhcyBSR0JSR0JSR0JSR0IuCisgICAgUGxhbmFyVG8yNGJfU1NFNDEoJnJnYjAsICZyZ2IxLCAmcmdiMiwgJnJnYjMsICZyZ2I0LCAmcmdiNSwgZHN0KTsKKworICAgIHkgKz0gMzI7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICB9CisgIGZvciAoOyBuIDwgbGVuOyArK24pIHsgICAvLyBGaW5pc2ggb2ZmCisgICAgVlA4WXV2VG9SZ2IoeVswXSwgdVswXSwgdlswXSwgZHN0KTsKKyAgICBkc3QgKz0gMzsKKyAgICB5ICs9IDE7CisgICAgdSArPSAobiAmIDEpOworICAgIHYgKz0gKG4gJiAxKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBZdXZUb0JnclJvd19TU0U0MShjb25zdCB1aW50OF90KiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdSwgY29uc3QgdWludDhfdCogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbikgeworICBpbnQgbjsKKyAgZm9yIChuID0gMDsgbiArIDMyIDw9IGxlbjsgbiArPSAzMiwgZHN0ICs9IDMyICogMykgeworICAgIF9fbTEyOGkgUjAsIFIxLCBSMiwgUjMsIEcwLCBHMSwgRzIsIEczLCBCMCwgQjEsIEIyLCBCMzsKKyAgICBfX20xMjhpIGJncjAsIGJncjEsIGJncjIsIGJncjMsIGJncjQsIGJncjU7CisKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgIDAsIHUgKyAgMCwgdiArICAwLCAmUjAsICZHMCwgJkIwKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgIDgsIHUgKyAgNCwgdiArICA0LCAmUjEsICZHMSwgJkIxKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgMTYsIHUgKyAgOCwgdiArICA4LCAmUjIsICZHMiwgJkIyKTsKKyAgICBZVVY0MjBUb1JHQl9TU0U0MSh5ICsgMjQsIHUgKyAxMiwgdiArIDEyLCAmUjMsICZHMywgJkIzKTsKKworICAgIC8vIENhc3QgdG8gOGIgYW5kIHN0b3JlIGFzIEJCQkJHR0dHUlJSUi4KKyAgICBiZ3IwID0gX21tX3BhY2t1c19lcGkxNihCMCwgQjEpOworICAgIGJncjEgPSBfbW1fcGFja3VzX2VwaTE2KEIyLCBCMyk7CisgICAgYmdyMiA9IF9tbV9wYWNrdXNfZXBpMTYoRzAsIEcxKTsKKyAgICBiZ3IzID0gX21tX3BhY2t1c19lcGkxNihHMiwgRzMpOworICAgIGJncjQgPSBfbW1fcGFja3VzX2VwaTE2KFIwLCBSMSk7CisgICAgYmdyNSA9IF9tbV9wYWNrdXNfZXBpMTYoUjIsIFIzKTsKKworICAgIC8vIFBhY2sgYXMgQkdSQkdSQkdSQkdSLgorICAgIFBsYW5hclRvMjRiX1NTRTQxKCZiZ3IwLCAmYmdyMSwgJmJncjIsICZiZ3IzLCAmYmdyNCwgJmJncjUsIGRzdCk7CisKKyAgICB5ICs9IDMyOworICAgIHUgKz0gMTY7CisgICAgdiArPSAxNjsKKyAgfQorICBmb3IgKDsgbiA8IGxlbjsgKytuKSB7ICAgLy8gRmluaXNoIG9mZgorICAgIFZQOFl1dlRvQmdyKHlbMF0sIHVbMF0sIHZbMF0sIGRzdCk7CisgICAgZHN0ICs9IDM7CisgICAgeSArPSAxOworICAgIHUgKz0gKG4gJiAxKTsKKyAgICB2ICs9IChuICYgMSk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVudHJ5IHBvaW50CisKK2V4dGVybiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0U2FtcGxlcnNTU0U0MSh2b2lkKSB7CisgIFdlYlBTYW1wbGVyc1tNT0RFX1JHQl0gID0gWXV2VG9SZ2JSb3dfU1NFNDE7CisgIFdlYlBTYW1wbGVyc1tNT0RFX0JHUl0gID0gWXV2VG9CZ3JSb3dfU1NFNDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSR0IyNC8zMiAtPiBZVVYgY29udmVydGVycworCisvLyBMb2FkIGVpZ2h0IDE2Yi13b3JkcyBmcm9tICpzcmMuCisjZGVmaW5lIExPQURfMTYoc3JjKSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShzcmMpKQorLy8gU3RvcmUgZWl0aGVyIDE2Yi13b3JkcyBpbnRvICpkc3QKKyNkZWZpbmUgU1RPUkVfMTYoViwgZHN0KSBfbW1fc3RvcmV1X3NpMTI4KChfX20xMjhpKikoZHN0KSwgKFYpKQorCisjZGVmaW5lIFdFQlBfU1NFNDFfU0hVRkYoT1VUKSAgZG8geyAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXAwID0gX21tX3NodWZmbGVfZXBpOChBMCwgc2h1ZmYwKTsgXAorICBjb25zdCBfX20xMjhpIHRtcDEgPSBfbW1fc2h1ZmZsZV9lcGk4KEExLCBzaHVmZjEpOyBcCisgIGNvbnN0IF9fbTEyOGkgdG1wMiA9IF9tbV9zaHVmZmxlX2VwaTgoQTIsIHNodWZmMik7IFwKKyAgY29uc3QgX19tMTI4aSB0bXAzID0gX21tX3NodWZmbGVfZXBpOChBMywgc2h1ZmYwKTsgXAorICBjb25zdCBfX20xMjhpIHRtcDQgPSBfbW1fc2h1ZmZsZV9lcGk4KEE0LCBzaHVmZjEpOyBcCisgIGNvbnN0IF9fbTEyOGkgdG1wNSA9IF9tbV9zaHVmZmxlX2VwaTgoQTUsIHNodWZmMik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAvKiBPUiBldmVyeXRoaW5nIHRvIGdldCBvbmUgY2hhbm5lbCAqLyAgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgdG1wNiA9IF9tbV9vcl9zaTEyOCh0bXAwLCB0bXAxKTsgICAgIFwKKyAgY29uc3QgX19tMTI4aSB0bXA3ID0gX21tX29yX3NpMTI4KHRtcDMsIHRtcDQpOyAgICAgXAorICBvdXRbT1VUICsgMF0gPSBfbW1fb3Jfc2kxMjgodG1wNiwgdG1wMik7ICAgICAgICAgICBcCisgIG91dFtPVVQgKyAxXSA9IF9tbV9vcl9zaTEyOCh0bXA3LCB0bXA1KTsgICAgICAgICAgIFwKK30gd2hpbGUgKDApOworCisvLyBVbnBhY2sgdGhlIDhiIGlucHV0IHJnYnJnYnJnYnJnYiAuLi4gYXMgY29udGlndW91cyByZWdpc3RlcnM6CisvLyBycnJyLi4uIHJycnIuLi4gZ2dnZy4uLiBnZ2dnLi4uIGJiYmIuLi4gYmJiYi4uLi4KKy8vIFNpbWlsYXIgdG8gUGxhbmFyVG8yNGJIZWxwZXIoKSwgYnV0IGluIHJldmVyc2Ugb3JkZXIuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBSR0IyNFBhY2tlZFRvUGxhbmFyX1NTRTQxKAorICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJnYiwgX19tMTI4aSogY29uc3Qgb3V0IC8qb3V0WzZdKi8pIHsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArICAwKSk7CisgIGNvbnN0IF9fbTEyOGkgQTEgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyAxNikpOworICBjb25zdCBfX20xMjhpIEEyID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgMzIpKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9sb2FkdV9zaTEyOCgoY29uc3QgX19tMTI4aSopKHJnYiArIDQ4KSk7CisgIGNvbnN0IF9fbTEyOGkgQTQgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShyZ2IgKyA2NCkpOworICBjb25zdCBfX20xMjhpIEE1ID0gX21tX2xvYWR1X3NpMTI4KChjb25zdCBfX20xMjhpKikocmdiICsgODApKTsKKworICAvLyBDb21wdXRlIFJSLgorICB7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjAgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNSwgMTIsIDksIDYsIDMsIDApOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIDE0LCAxMSwgOCwgNSwgMiwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIDEzLCAxMCwgNywgNCwgMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xKTsKKyAgICBXRUJQX1NTRTQxX1NIVUZGKDApCisgIH0KKyAgLy8gQ29tcHV0ZSBHRy4KKyAgeworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDEzLCAxMCwgNywgNCwgMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjEgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgMTUsIDEyLCA5LCA2LCAzLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYyID0gX21tX3NldF9lcGk4KAorICAgICAgICAxNCwgMTEsIDgsIDUsIDIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgV0VCUF9TU0U0MV9TSFVGRigyKQorICB9CisgIC8vIENvbXB1dGUgQkIuCisgIHsKKyAgICBjb25zdCBfX20xMjhpIHNodWZmMCA9IF9tbV9zZXRfZXBpOCgKKyAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxNCwgMTEsIDgsIDUsIDIpOworICAgIGNvbnN0IF9fbTEyOGkgc2h1ZmYxID0gX21tX3NldF9lcGk4KAorICAgICAgICAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAxMywgMTAsIDcsIDQsIDEsIC0xLCAtMSwgLTEsIC0xLCAtMSk7CisgICAgY29uc3QgX19tMTI4aSBzaHVmZjIgPSBfbW1fc2V0X2VwaTgoCisgICAgICAgIDE1LCAxMiwgOSwgNiwgMywgMCwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEpOworICAgIFdFQlBfU1NFNDFfU0hVRkYoNCkKKyAgfQorfQorCisjdW5kZWYgV0VCUF9TU0U0MV9TSFVGRgorCisvLyBDb252ZXJ0IDggcGFja2VkIEFSR0IgdG8gcltdLCBnW10sIGJbXQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCMzJQYWNrZWRUb1BsYW5hcl9TU0U0MSgKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgX19tMTI4aSogY29uc3QgcmdiIC8qaW5bNl0qLykgeworICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICBfX20xMjhpIGEwID0gTE9BRF8xNihhcmdiICsgMCk7CisgIF9fbTEyOGkgYTEgPSBMT0FEXzE2KGFyZ2IgKyA0KTsKKyAgX19tMTI4aSBhMiA9IExPQURfMTYoYXJnYiArIDgpOworICBfX20xMjhpIGEzID0gTE9BRF8xNihhcmdiICsgMTIpOworICBWUDhMMzJiVG9QbGFuYXJfU1NFNDEoJmEwLCAmYTEsICZhMiwgJmEzKTsKKyAgcmdiWzBdID0gX21tX3VucGFja2xvX2VwaTgoYTEsIHplcm8pOworICByZ2JbMV0gPSBfbW1fdW5wYWNraGlfZXBpOChhMSwgemVybyk7CisgIHJnYlsyXSA9IF9tbV91bnBhY2tsb19lcGk4KGEyLCB6ZXJvKTsKKyAgcmdiWzNdID0gX21tX3VucGFja2hpX2VwaTgoYTIsIHplcm8pOworICByZ2JbNF0gPSBfbW1fdW5wYWNrbG9fZXBpOChhMywgemVybyk7CisgIHJnYls1XSA9IF9tbV91bnBhY2toaV9lcGk4KGEzLCB6ZXJvKTsKK30KKworLy8gVGhpcyBtYWNybyBjb21wdXRlcyAoUkcgKiBNVUxUX1JHICsgR0IgKiBNVUxUX0dCICsgUk9VTkRFUikgPj4gREVTQ0FMRV9GSVgKKy8vIEl0J3MgYSBtYWNybyBhbmQgbm90IGEgZnVuY3Rpb24gYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSBpbW1lZGlhdGUgdmFsdWVzIHdpdGgKKy8vIHNyYWlfZXBpMzIsIGUuZy4KKyNkZWZpbmUgVFJBTlNGT1JNKFJHX0xPLCBSR19ISSwgR0JfTE8sIEdCX0hJLCBNVUxUX1JHLCBNVUxUX0dCLCBcCisgICAgICAgICAgICAgICAgICBST1VOREVSLCBERVNDQUxFX0ZJWCwgT1VUKSBkbyB7ICAgICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYwX2xvID0gX21tX21hZGRfZXBpMTYoUkdfTE8sIE1VTFRfUkcpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMF9oaSA9IF9tbV9tYWRkX2VwaTE2KFJHX0hJLCBNVUxUX1JHKTsgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjFfbG8gPSBfbW1fbWFkZF9lcGkxNihHQl9MTywgTVVMVF9HQik7ICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYxX2hpID0gX21tX21hZGRfZXBpMTYoR0JfSEksIE1VTFRfR0IpOyAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWMl9sbyA9IF9tbV9hZGRfZXBpMzIoVjBfbG8sIFYxX2xvKTsgICAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjJfaGkgPSBfbW1fYWRkX2VwaTMyKFYwX2hpLCBWMV9oaSk7ICAgICAgICAgICAgXAorICBjb25zdCBfX20xMjhpIFYzX2xvID0gX21tX2FkZF9lcGkzMihWMl9sbywgUk9VTkRFUik7ICAgICAgICAgIFwKKyAgY29uc3QgX19tMTI4aSBWM19oaSA9IF9tbV9hZGRfZXBpMzIoVjJfaGksIFJPVU5ERVIpOyAgICAgICAgICBcCisgIGNvbnN0IF9fbTEyOGkgVjVfbG8gPSBfbW1fc3JhaV9lcGkzMihWM19sbywgREVTQ0FMRV9GSVgpOyAgICAgXAorICBjb25zdCBfX20xMjhpIFY1X2hpID0gX21tX3NyYWlfZXBpMzIoVjNfaGksIERFU0NBTEVfRklYKTsgICAgIFwKKyAgKE9VVCkgPSBfbW1fcGFja3NfZXBpMzIoVjVfbG8sIFY1X2hpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIE1LX0NTVF8xNihBLCBCKSBfbW1fc2V0X2VwaTE2KChCKSwgKEEpLCAoQiksIChBKSwgKEIpLCAoQSksIChCKSwgKEEpKQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJHQlRvWV9TU0U0MShjb25zdCBfX20xMjhpKiBjb25zdCBSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX20xMjhpKiBjb25zdCBZKSB7CisgIGNvbnN0IF9fbTEyOGkga1JHX3kgPSBNS19DU1RfMTYoMTY4MzksIDMzMDU5IC0gMTYzODQpOworICBjb25zdCBfX20xMjhpIGtHQl95ID0gTUtfQ1NUXzE2KDE2Mzg0LCA2NDIwKTsKKyAgY29uc3QgX19tMTI4aSBrSEFMRl9ZID0gX21tX3NldDFfZXBpMzIoKDE2IDw8IFlVVl9GSVgpICsgWVVWX0hBTEYpOworCisgIGNvbnN0IF9fbTEyOGkgUkdfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKlIsICpHKTsKKyAgY29uc3QgX19tMTI4aSBSR19oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIEdCX2xvID0gX21tX3VucGFja2xvX2VwaTE2KCpHLCAqQik7CisgIGNvbnN0IF9fbTEyOGkgR0JfaGkgPSBfbW1fdW5wYWNraGlfZXBpMTYoKkcsICpCKTsKKyAgVFJBTlNGT1JNKFJHX2xvLCBSR19oaSwgR0JfbG8sIEdCX2hpLCBrUkdfeSwga0dCX3ksIGtIQUxGX1ksIFlVVl9GSVgsICpZKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29udmVydFJHQlRvVVZfU1NFNDEoY29uc3QgX19tMTI4aSogY29uc3QgUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbTEyOGkqIGNvbnN0IEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfX20xMjhpKiBjb25zdCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19tMTI4aSogY29uc3QgVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IFYpIHsKKyAgY29uc3QgX19tMTI4aSBrUkdfdSA9IE1LX0NTVF8xNigtOTcxOSwgLTE5MDgxKTsKKyAgY29uc3QgX19tMTI4aSBrR0JfdSA9IE1LX0NTVF8xNigwLCAyODgwMCk7CisgIGNvbnN0IF9fbTEyOGkga1JHX3YgPSBNS19DU1RfMTYoMjg4MDAsIDApOworICBjb25zdCBfX20xMjhpIGtHQl92ID0gTUtfQ1NUXzE2KC0yNDExNiwgLTQ2ODQpOworICBjb25zdCBfX20xMjhpIGtIQUxGX1VWID0gX21tX3NldDFfZXBpMzIoKCgxMjggPDwgWVVWX0ZJWCkgKyBZVVZfSEFMRikgPDwgMik7CisKKyAgY29uc3QgX19tMTI4aSBSR19sbyA9IF9tbV91bnBhY2tsb19lcGkxNigqUiwgKkcpOworICBjb25zdCBfX20xMjhpIFJHX2hpID0gX21tX3VucGFja2hpX2VwaTE2KCpSLCAqRyk7CisgIGNvbnN0IF9fbTEyOGkgR0JfbG8gPSBfbW1fdW5wYWNrbG9fZXBpMTYoKkcsICpCKTsKKyAgY29uc3QgX19tMTI4aSBHQl9oaSA9IF9tbV91bnBhY2toaV9lcGkxNigqRywgKkIpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR191LCBrR0JfdSwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlUpOworICBUUkFOU0ZPUk0oUkdfbG8sIFJHX2hpLCBHQl9sbywgR0JfaGksIGtSR192LCBrR0JfdiwKKyAgICAgICAgICAgIGtIQUxGX1VWLCBZVVZfRklYICsgMiwgKlYpOworfQorCisjdW5kZWYgTUtfQ1NUXzE2CisjdW5kZWYgVFJBTlNGT1JNCisKK3N0YXRpYyB2b2lkIENvbnZlcnRSR0IyNFRvWV9TU0U0MShjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIGludCB3aWR0aCkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gd2lkdGggJiB+MzE7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbWF4X3dpZHRoOyByZ2IgKz0gMyAqIDE2ICogMikgeworICAgIF9fbTEyOGkgcmdiX3BsYW5lWzZdOworICAgIGludCBqOworCisgICAgUkdCMjRQYWNrZWRUb1BsYW5hcl9TU0U0MShyZ2IsIHJnYl9wbGFuZSk7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgMjsgKytqLCBpICs9IDE2KSB7CisgICAgICBjb25zdCBfX20xMjhpIHplcm8gPSBfbW1fc2V0emVyb19zaTEyOCgpOworICAgICAgX19tMTI4aSByLCBnLCBiLCBZMCwgWTE7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2xvX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyLCAmZywgJmIsICZZMCk7CisKKyAgICAgIC8vIENvbnZlcnQgdG8gMTYtYml0IFkuCisgICAgICByID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzAgKyBqXSwgemVybyk7CisgICAgICBnID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzIgKyBqXSwgemVybyk7CisgICAgICBiID0gX21tX3VucGFja2hpX2VwaTgocmdiX3BsYW5lWzQgKyBqXSwgemVybyk7CisgICAgICBDb252ZXJ0UkdCVG9ZX1NTRTQxKCZyLCAmZywgJmIsICZZMSk7CisKKyAgICAgIC8vIENhc3QgdG8gOC1iaXQgYW5kIHN0b3JlLgorICAgICAgU1RPUkVfMTYoX21tX3BhY2t1c19lcGkxNihZMCwgWTEpLCB5ICsgaSk7CisgICAgfQorICB9CisgIGZvciAoOyBpIDwgd2lkdGg7ICsraSwgcmdiICs9IDMpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKHJnYlswXSwgcmdiWzFdLCByZ2JbMl0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QkdSMjRUb1lfU1NFNDEoY29uc3QgdWludDhfdCogYmdyLCB1aW50OF90KiB5LCBpbnQgd2lkdGgpIHsKKyAgY29uc3QgaW50IG1heF93aWR0aCA9IHdpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgYmdyICs9IDMgKiAxNiAqIDIpIHsKKyAgICBfX20xMjhpIGJncl9wbGFuZVs2XTsKKyAgICBpbnQgajsKKworICAgIFJHQjI0UGFja2VkVG9QbGFuYXJfU1NFNDEoYmdyLCBiZ3JfcGxhbmUpOworCisgICAgZm9yIChqID0gMDsgaiA8IDI7ICsraiwgaSArPSAxNikgeworICAgICAgY29uc3QgX19tMTI4aSB6ZXJvID0gX21tX3NldHplcm9fc2kxMjgoKTsKKyAgICAgIF9fbTEyOGkgciwgZywgYiwgWTAsIFkxOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2tsb19lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmciwgJmcsICZiLCAmWTApOworCisgICAgICAvLyBDb252ZXJ0IHRvIDE2LWJpdCBZLgorICAgICAgYiA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVswICsgal0sIHplcm8pOworICAgICAgZyA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVsyICsgal0sIHplcm8pOworICAgICAgciA9IF9tbV91bnBhY2toaV9lcGk4KGJncl9wbGFuZVs0ICsgal0sIHplcm8pOworICAgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmciwgJmcsICZiLCAmWTEpOworCisgICAgICAvLyBDYXN0IHRvIDgtYml0IGFuZCBzdG9yZS4KKyAgICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoWTAsIFkxKSwgeSArIGkpOworICAgIH0KKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2ksIGJnciArPSAzKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICB5W2ldID0gVlA4UkdCVG9ZKGJnclsyXSwgYmdyWzFdLCBiZ3JbMF0sIFlVVl9IQUxGKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0QVJHQlRvWV9TU0U0MShjb25zdCB1aW50MzJfdCogYXJnYiwgdWludDhfdCogeSwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4xNTsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBtYXhfd2lkdGg7IGkgKz0gMTYpIHsKKyAgICBfX20xMjhpIFkwLCBZMSwgcmdiWzZdOworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFNDEoJmFyZ2JbaV0sIHJnYik7CisgICAgQ29udmVydFJHQlRvWV9TU0U0MSgmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmWTApOworICAgIENvbnZlcnRSR0JUb1lfU1NFNDEoJnJnYlsxXSwgJnJnYlszXSwgJnJnYls1XSwgJlkxKTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFkwLCBZMSksIHkgKyBpKTsKKyAgfQorICBmb3IgKDsgaSA8IHdpZHRoOyArK2kpIHsgICAvLyBsZWZ0LW92ZXIKKyAgICBjb25zdCB1aW50MzJfdCBwID0gYXJnYltpXTsKKyAgICB5W2ldID0gVlA4UkdCVG9ZKChwID4+IDE2KSAmIDB4ZmYsIChwID4+IDgpICYgMHhmZiwgKHAgPj4gIDApICYgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgIFlVVl9IQUxGKTsKKyAgfQorfQorCisvLyBIb3Jpem9udGFsIGFkZCAoZG91YmxlZCkgb2YgdHdvIDE2YiB2YWx1ZXMsIHJlc3VsdCBpcyAxNmIuCisvLyBpbjogQSB8IEIgfCBDIHwgRCB8IC4uLiAtPiBvdXQ6IDIqKEErQikgfCAyKihDK0QpIHwgLi4uCitzdGF0aWMgdm9pZCBIb3Jpem9udGFsQWRkUGFja19TU0U0MShjb25zdCBfX20xMjhpKiBjb25zdCBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19tMTI4aSogY29uc3QgQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkqIGNvbnN0IG91dCkgeworICBjb25zdCBfX20xMjhpIGsyID0gX21tX3NldDFfZXBpMTYoMik7CisgIGNvbnN0IF9fbTEyOGkgQyA9IF9tbV9tYWRkX2VwaTE2KCpBLCBrMik7CisgIGNvbnN0IF9fbTEyOGkgRCA9IF9tbV9tYWRkX2VwaTE2KCpCLCBrMik7CisgICpvdXQgPSBfbW1fcGFja3NfZXBpMzIoQywgRCk7Cit9CisKK3N0YXRpYyB2b2lkIENvbnZlcnRBUkdCVG9VVl9TU0U0MShjb25zdCB1aW50MzJfdCogYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LCB1aW50OF90KiB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBkb19zdG9yZSkgeworICBjb25zdCBpbnQgbWF4X3dpZHRoID0gc3JjX3dpZHRoICYgfjMxOworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IG1heF93aWR0aDsgaSArPSAzMiwgdSArPSAxNiwgdiArPSAxNikgeworICAgIF9fbTEyOGkgcmdiWzZdLCBVMCwgVjAsIFUxLCBWMTsKKyAgICBSR0IzMlBhY2tlZFRvUGxhbmFyX1NTRTQxKCZhcmdiW2ldLCByZ2IpOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbMF0sICZyZ2JbMV0sICZyZ2JbMF0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbMl0sICZyZ2JbM10sICZyZ2JbMl0pOworICAgIEhvcml6b250YWxBZGRQYWNrX1NTRTQxKCZyZ2JbNF0sICZyZ2JbNV0sICZyZ2JbNF0pOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTQxKCZyZ2JbMF0sICZyZ2JbMl0sICZyZ2JbNF0sICZVMCwgJlYwKTsKKworICAgIFJHQjMyUGFja2VkVG9QbGFuYXJfU1NFNDEoJmFyZ2JbaSArIDE2XSwgcmdiKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzBdLCAmcmdiWzFdLCAmcmdiWzBdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzJdLCAmcmdiWzNdLCAmcmdiWzJdKTsKKyAgICBIb3Jpem9udGFsQWRkUGFja19TU0U0MSgmcmdiWzRdLCAmcmdiWzVdLCAmcmdiWzRdKTsKKyAgICBDb252ZXJ0UkdCVG9VVl9TU0U0MSgmcmdiWzBdLCAmcmdiWzJdLCAmcmdiWzRdLCAmVTEsICZWMSk7CisKKyAgICBVMCA9IF9tbV9wYWNrdXNfZXBpMTYoVTAsIFUxKTsKKyAgICBWMCA9IF9tbV9wYWNrdXNfZXBpMTYoVjAsIFYxKTsKKyAgICBpZiAoIWRvX3N0b3JlKSB7CisgICAgICBjb25zdCBfX20xMjhpIHByZXZfdSA9IExPQURfMTYodSk7CisgICAgICBjb25zdCBfX20xMjhpIHByZXZfdiA9IExPQURfMTYodik7CisgICAgICBVMCA9IF9tbV9hdmdfZXB1OChVMCwgcHJldl91KTsKKyAgICAgIFYwID0gX21tX2F2Z19lcHU4KFYwLCBwcmV2X3YpOworICAgIH0KKyAgICBTVE9SRV8xNihVMCwgdSk7CisgICAgU1RPUkVfMTYoVjAsIHYpOworICB9CisgIGlmIChpIDwgc3JjX3dpZHRoKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICBXZWJQQ29udmVydEFSR0JUb1VWX0MoYXJnYiArIGksIHUsIHYsIHNyY193aWR0aCAtIGksIGRvX3N0b3JlKTsKKyAgfQorfQorCisvLyBDb252ZXJ0IDE2IHBhY2tlZCBBUkdCIDE2Yi12YWx1ZXMgdG8gcltdLCBnW10sIGJbXQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUkdCQTMyUGFja2VkVG9QbGFuYXJfMTZiX1NTRTQxKAorICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCByZ2J4LAorICAgIF9fbTEyOGkqIGNvbnN0IHIsIF9fbTEyOGkqIGNvbnN0IGcsIF9fbTEyOGkqIGNvbnN0IGIpIHsKKyAgY29uc3QgX19tMTI4aSBpbjAgPSBMT0FEXzE2KHJnYnggKyAgMCk7ICAvLyByMCB8IGcwIHwgYjAgfHh8IHIxIHwgZzEgfCBiMSB8eAorICBjb25zdCBfX20xMjhpIGluMSA9IExPQURfMTYocmdieCArICA4KTsgIC8vIHIyIHwgZzIgfCBiMiB8eHwgcjMgfCBnMyB8IGIzIHx4CisgIGNvbnN0IF9fbTEyOGkgaW4yID0gTE9BRF8xNihyZ2J4ICsgMTYpOyAgLy8gcjQgfCAuLi4KKyAgY29uc3QgX19tMTI4aSBpbjMgPSBMT0FEXzE2KHJnYnggKyAyNCk7ICAvLyByNiB8IC4uLgorICAvLyBhYXJyZ2diYiBhcyAxNi1iaXQuCisgIGNvbnN0IF9fbTEyOGkgc2h1ZmYwID0KKyAgICAgIF9tbV9zZXRfZXBpOCgtMSwgLTEsIC0xLCAtMSwgMTMsIDEyLCA1LCA0LCAxMSwgMTAsIDMsIDIsIDksIDgsIDEsIDApOworICBjb25zdCBfX20xMjhpIHNodWZmMSA9CisgICAgICBfbW1fc2V0X2VwaTgoMTMsIDEyLCA1LCA0LCAtMSwgLTEsIC0xLCAtMSwgMTEsIDEwLCAzLCAyLCA5LCA4LCAxLCAwKTsKKyAgY29uc3QgX19tMTI4aSBBMCA9IF9tbV9zaHVmZmxlX2VwaTgoaW4wLCBzaHVmZjApOworICBjb25zdCBfX20xMjhpIEExID0gX21tX3NodWZmbGVfZXBpOChpbjEsIHNodWZmMSk7CisgIGNvbnN0IF9fbTEyOGkgQTIgPSBfbW1fc2h1ZmZsZV9lcGk4KGluMiwgc2h1ZmYwKTsKKyAgY29uc3QgX19tMTI4aSBBMyA9IF9tbV9zaHVmZmxlX2VwaTgoaW4zLCBzaHVmZjEpOworICAvLyBSMFIxRzBHMQorICAvLyBCMEIxKioqKgorICAvLyBSMlIzRzJHMworICAvLyBCMkIzKioqKgorICAvLyAoT1IgaXMgdXNlZCB0byBmcmVlIHBvcnQgNSBmb3IgdGhlIHVucGFjaykKKyAgY29uc3QgX19tMTI4aSBCMCA9IF9tbV91bnBhY2tsb19lcGkzMihBMCwgQTEpOworICBjb25zdCBfX20xMjhpIEIxID0gX21tX29yX3NpMTI4KEEwLCBBMSk7CisgIGNvbnN0IF9fbTEyOGkgQjIgPSBfbW1fdW5wYWNrbG9fZXBpMzIoQTIsIEEzKTsKKyAgY29uc3QgX19tMTI4aSBCMyA9IF9tbV9vcl9zaTEyOChBMiwgQTMpOworICAvLyBHYXRoZXIgdGhlIGNoYW5uZWxzLgorICAqciA9IF9tbV91bnBhY2tsb19lcGk2NChCMCwgQjIpOworICAqZyA9IF9tbV91bnBhY2toaV9lcGk2NChCMCwgQjIpOworICAqYiA9IF9tbV91bnBhY2toaV9lcGk2NChCMSwgQjMpOworfQorCitzdGF0aWMgdm9pZCBDb252ZXJ0UkdCQTMyVG9VVl9TU0U0MShjb25zdCB1aW50MTZfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdSwgdWludDhfdCogdiwgaW50IHdpZHRoKSB7CisgIGNvbnN0IGludCBtYXhfd2lkdGggPSB3aWR0aCAmIH4xNTsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGxhc3RfcmdiID0gcmdiICsgNCAqIG1heF93aWR0aDsKKyAgd2hpbGUgKHJnYiA8IGxhc3RfcmdiKSB7CisgICAgX19tMTI4aSByLCBnLCBiLCBVMCwgVjAsIFUxLCBWMTsKKyAgICBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFNDEocmdiICsgIDAsICZyLCAmZywgJmIpOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTQxKCZyLCAmZywgJmIsICZVMCwgJlYwKTsKKyAgICBSR0JBMzJQYWNrZWRUb1BsYW5hcl8xNmJfU1NFNDEocmdiICsgMzIsICZyLCAmZywgJmIpOworICAgIENvbnZlcnRSR0JUb1VWX1NTRTQxKCZyLCAmZywgJmIsICZVMSwgJlYxKTsKKyAgICBTVE9SRV8xNihfbW1fcGFja3VzX2VwaTE2KFUwLCBVMSksIHUpOworICAgIFNUT1JFXzE2KF9tbV9wYWNrdXNfZXBpMTYoVjAsIFYxKSwgdik7CisgICAgdSArPSAxNjsKKyAgICB2ICs9IDE2OworICAgIHJnYiArPSAyICogMzI7CisgIH0KKyAgaWYgKG1heF93aWR0aCA8IHdpZHRoKSB7ICAvLyBsZWZ0LW92ZXIKKyAgICBXZWJQQ29udmVydFJHQkEzMlRvVVZfQyhyZ2IsIHUsIHYsIHdpZHRoIC0gbWF4X3dpZHRoKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitleHRlcm4gdm9pZCBXZWJQSW5pdENvbnZlcnRBUkdCVG9ZVVZTU0U0MSh2b2lkKTsKKworV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTQxKHZvaWQpIHsKKyAgV2ViUENvbnZlcnRBUkdCVG9ZID0gQ29udmVydEFSR0JUb1lfU1NFNDE7CisgIFdlYlBDb252ZXJ0QVJHQlRvVVYgPSBDb252ZXJ0QVJHQlRvVVZfU1NFNDE7CisKKyAgV2ViUENvbnZlcnRSR0IyNFRvWSA9IENvbnZlcnRSR0IyNFRvWV9TU0U0MTsKKyAgV2ViUENvbnZlcnRCR1IyNFRvWSA9IENvbnZlcnRCR1IyNFRvWV9TU0U0MTsKKworICBXZWJQQ29udmVydFJHQkEzMlRvVVYgPSBDb252ZXJ0UkdCQTMyVG9VVl9TU0U0MTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2Vsc2UgIC8vICFXRUJQX1VTRV9TU0U0MQorCitXRUJQX0RTUF9JTklUX1NUVUIoV2ViUEluaXRTYW1wbGVyc1NTRTQxKQorV0VCUF9EU1BfSU5JVF9TVFVCKFdlYlBJbml0Q29udmVydEFSR0JUb1lVVlNTRTQxKQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1NTRTQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Q1MjI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDQyIEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK25vaW5zdF9MVExJQlJBUklFUyA9IGxpYndlYnBlbmNvZGUubGEKKworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTID0KK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBhbHBoYV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGFuYWx5c2lzX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gYmFja3dhcmRfcmVmZXJlbmNlc19jb3N0X2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGJhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBjb25maWdfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBjb3N0X2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gY29zdF9lbmMuaAorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGZpbHRlcl9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IGZyYW1lX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gaGlzdG9ncmFtX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gaGlzdG9ncmFtX2VuYy5oCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gaXRlcmF0b3JfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSBuZWFyX2xvc3NsZXNzX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcGljdHVyZV9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHBpY3R1cmVfY3NwX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcGljdHVyZV9wc25yX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcGljdHVyZV9yZXNjYWxlX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gcGljdHVyZV90b29sc19lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHByZWRpY3Rvcl9lbmMuYworbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHF1YW50X2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gc3ludGF4X2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gdG9rZW5fZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB0cmVlX2VuYy5jCitsaWJ3ZWJwZW5jb2RlX2xhX1NPVVJDRVMgKz0gdnA4aV9lbmMuaAorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHZwOGxfZW5jLmMKK2xpYndlYnBlbmNvZGVfbGFfU09VUkNFUyArPSB2cDhsaV9lbmMuaAorbGlid2VicGVuY29kZV9sYV9TT1VSQ0VTICs9IHdlYnBfZW5jLmMKKworbGlid2VicGVuY29kZWluY2x1ZGVfSEVBREVSUyA9CitsaWJ3ZWJwZW5jb2RlaW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvZW5jb2RlLmgKK2xpYndlYnBlbmNvZGVpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC90eXBlcy5oCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorCitsaWJ3ZWJwZW5jb2RlX2xhX0xERkxBR1MgPSAtbG0KK2xpYndlYnBlbmNvZGVfbGFfQ1BQRkxBR1MgPSAkKEFNX0NQUEZMQUdTKQorbGlid2VicGVuY29kZWluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYWxwaGFfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FscGhhX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTljYTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FscGhhX2VuYy5jCkBAIC0wLDAgKzEsNDQzIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQWxwaGEtcGxhbmUgY29tcHJlc3Npb24uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2ZpbHRlcnNfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW5jb2RlcyB0aGUgZ2l2ZW4gYWxwaGEgZGF0YSB2aWEgc3BlY2lmaWVkIGNvbXByZXNzaW9uIG1ldGhvZCAnbWV0aG9kJy4KKy8vIFRoZSBwcmUtcHJvY2Vzc2luZyAocXVhbnRpemF0aW9uKSBpcyBwZXJmb3JtZWQgaWYgJ3F1YWxpdHknIGlzIGxlc3MgdGhhbiAxMDAuCisvLyBGb3Igc3VjaCBjYXNlcywgdGhlIGVuY29kaW5nIGlzIGxvc3N5LiBUaGUgdmFsaWQgcmFuZ2UgaXMgWzAsIDEwMF0gZm9yCisvLyAncXVhbGl0eScgYW5kIFswLCAxXSBmb3IgJ21ldGhvZCc6CisvLyAgICdtZXRob2QgPSAwJyAtIE5vIGNvbXByZXNzaW9uOworLy8gICAnbWV0aG9kID0gMScgLSBVc2UgbG9zc2xlc3MgY29kZXIgb24gdGhlIGFscGhhIHBsYW5lIG9ubHkKKy8vICdmaWx0ZXInIHZhbHVlcyBbMCwgNF0gY29ycmVzcG9uZCB0byBwcmVkaWN0aW9uIG1vZGVzIG5vbmUsIGhvcml6b250YWwsCisvLyB2ZXJ0aWNhbCAmIGdyYWRpZW50IGZpbHRlcnMuIFRoZSBwcmVkaWN0aW9uIG1vZGUgNCB3aWxsIHRyeSBhbGwgdGhlCisvLyBwcmVkaWN0aW9uIG1vZGVzIDAgdG8gMyBhbmQgcGljayB0aGUgYmVzdCBvbmUuCisvLyAnZWZmb3J0X2xldmVsJzogc3BlY2lmaWVzIGhvdyBtdWNoIGVmZm9ydCBtdXN0IGJlIHNwZW50IHRvIHRyeSBhbmQgcmVkdWNlCisvLyAgdGhlIGNvbXByZXNzZWQgb3V0cHV0IHNpemUuIEluIHJhbmdlIDAgKHF1aWNrKSB0byA2IChzbG93KS4KKy8vCisvLyAnb3V0cHV0JyBjb3JyZXNwb25kcyB0byB0aGUgYnVmZmVyIGNvbnRhaW5pbmcgY29tcHJlc3NlZCBhbHBoYSBkYXRhLgorLy8gICAgICAgICAgVGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkIGJ5IHRoaXMgbWV0aG9kIGFuZCBjYWxsZXIgc2hvdWxkIGNhbGwKKy8vICAgICAgICAgIFdlYlBTYWZlRnJlZSgqb3V0cHV0KSB3aGVuIGRvbmUuCisvLyAnb3V0cHV0X3NpemUnIGNvcnJlc3BvbmRzIHRvIHNpemUgb2YgdGhpcyBjb21wcmVzc2VkIGFscGhhIGJ1ZmZlci4KKy8vCisvLyBSZXR1cm5zIDEgb24gc3VjY2Vzc2Z1bGx5IGVuY29kaW5nIHRoZSBhbHBoYSBhbmQKKy8vICAgICAgICAgMCBpZiBlaXRoZXI6CisvLyAgICAgICAgICAgaW52YWxpZCBxdWFsaXR5IG9yIG1ldGhvZCwgb3IKKy8vICAgICAgICAgICBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBmYWlscy4KKworI2luY2x1ZGUgInNyYy9lbmMvdnA4bGlfZW5jLmgiCisKK3N0YXRpYyBpbnQgRW5jb2RlTG9zc2xlc3MoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWZmb3J0X2xldmVsLCAgLy8gaW4gWzAuLjZdIHJhbmdlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfcXVhbGl0eV8xMDAsIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQXV4U3RhdHMqIGNvbnN0IHN0YXRzKSB7CisgIGludCBvayA9IDA7CisgIFdlYlBDb25maWcgY29uZmlnOworICBXZWJQUGljdHVyZSBwaWN0dXJlOworCisgIFdlYlBQaWN0dXJlSW5pdCgmcGljdHVyZSk7CisgIHBpY3R1cmUud2lkdGggPSB3aWR0aDsKKyAgcGljdHVyZS5oZWlnaHQgPSBoZWlnaHQ7CisgIHBpY3R1cmUudXNlX2FyZ2IgPSAxOworICBwaWN0dXJlLnN0YXRzID0gc3RhdHM7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmcGljdHVyZSkpIHJldHVybiAwOworCisgIC8vIFRyYW5zZmVyIHRoZSBhbHBoYSB2YWx1ZXMgdG8gdGhlIGdyZWVuIGNoYW5uZWwuCisgIFdlYlBEaXNwYXRjaEFscGhhVG9HcmVlbihkYXRhLCB3aWR0aCwgcGljdHVyZS53aWR0aCwgcGljdHVyZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlLmFyZ2IsIHBpY3R1cmUuYXJnYl9zdHJpZGUpOworCisgIFdlYlBDb25maWdJbml0KCZjb25maWcpOworICBjb25maWcubG9zc2xlc3MgPSAxOworICAvLyBFbmFibGUgZXhhY3QsIG9yIGl0IHdvdWxkIGFsdGVyIFJHQiB2YWx1ZXMgb2YgdHJhbnNwYXJlbnQgYWxwaGEsIHdoaWNoIGlzCisgIC8vIG5vcm1hbGx5IE9LIGJ1dCBub3QgaGVyZSBzaW5jZSB3ZSBhcmUgbm90IGVuY29kaW5nIHRoZSBpbnB1dCBpbWFnZSBidXQgIGFuCisgIC8vIGludGVybmFsIGVuY29kaW5nLXJlbGF0ZWQgaW1hZ2UgY29udGFpbmluZyBuZWNlc3NhcnkgZXhhY3QgaW5mb3JtYXRpb24gaW4KKyAgLy8gUkdCIGNoYW5uZWxzLgorICBjb25maWcuZXhhY3QgPSAxOworICBjb25maWcubWV0aG9kID0gZWZmb3J0X2xldmVsOyAgLy8gaW1wYWN0IGlzIHZlcnkgc21hbGwKKyAgLy8gU2V0IGEgbG93IGRlZmF1bHQgcXVhbGl0eSBmb3IgZW5jb2RpbmcgYWxwaGEuIEVuc3VyZSB0aGF0IEFscGhhIHF1YWxpdHkgYXQKKyAgLy8gbG93ZXIgbWV0aG9kcyAoMyBhbmQgYmVsb3cpIGlzIGxlc3MgdGhhbiB0aGUgdGhyZXNob2xkIGZvciB0cmlnZ2VyaW5nCisgIC8vIGNvc3RseSAnQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMnLgorICAvLyBJZiB0aGUgYWxwaGEgcXVhbGl0eSBpcyBzZXQgdG8gMTAwIGFuZCB0aGUgbWV0aG9kIHRvIDYsIGFsbG93IGZvciBhIGhpZ2gKKyAgLy8gbG9zc2xlc3MgcXVhbGl0eSB0byB0cmlnZ2VyIHRoZSBjcnVuY2hlci4KKyAgY29uZmlnLnF1YWxpdHkgPQorICAgICAgKHVzZV9xdWFsaXR5XzEwMCAmJiBlZmZvcnRfbGV2ZWwgPT0gNikgPyAxMDAgOiA4LmYgKiBlZmZvcnRfbGV2ZWw7CisgIGFzc2VydChjb25maWcucXVhbGl0eSA+PSAwICYmIGNvbmZpZy5xdWFsaXR5IDw9IDEwMC5mKTsKKworICAvLyBUT0RPKHVydmFuZyk6IFRlbXBvcmFyeSBmaXggdG8gYXZvaWQgZ2VuZXJhdGluZyBpbWFnZXMgdGhhdCB0cmlnZ2VyCisgIC8vIGEgZGVjb2RlciBidWcgcmVsYXRlZCB0byBhbHBoYSB3aXRoIGNvbG9yIGNhY2hlLgorICAvLyBTZWU6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3Avd2VicC9pc3N1ZXMvZGV0YWlsP2lkPTIzOQorICAvLyBOZWVkIHRvIHJlLWVuYWJsZSB0aGlzIGxhdGVyLgorICBvayA9IChWUDhMRW5jb2RlU3RyZWFtKCZjb25maWcsICZwaWN0dXJlLCBidywgMCAvKnVzZV9jYWNoZSovKSA9PSBWUDhfRU5DX09LKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWN0dXJlKTsKKyAgb2sgPSBvayAmJiAhYnctPmVycm9yXzsKKyAgaWYgKCFvaykgeworICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KGJ3KTsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU21hbGwgc3RydWN0IHRvIGhvbGQgdGhlIHJlc3VsdCBvZiBhIGZpbHRlciBtb2RlIGNvbXByZXNzaW9uIGF0dGVtcHQuCit0eXBlZGVmIHN0cnVjdCB7CisgIHNpemVfdCBzY29yZTsKKyAgVlA4Qml0V3JpdGVyIGJ3OworICBXZWJQQXV4U3RhdHMgc3RhdHM7Cit9IEZpbHRlclRyaWFsOworCisvLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIGFuIGluaXRpYWxpemVkICdidycgb2JqZWN0LCBldmVuIHVwb24gZXJyb3IuCitzdGF0aWMgaW50IEVuY29kZUFscGhhSW50ZXJuYWwoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGludCBmaWx0ZXIsIGludCByZWR1Y2VfbGV2ZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsICAvLyBpbiBbMC4uNl0gcmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB0bXBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyVHJpYWwqIHJlc3VsdCkgeworICBpbnQgb2sgPSAwOworICBjb25zdCB1aW50OF90KiBhbHBoYV9zcmM7CisgIFdlYlBGaWx0ZXJGdW5jIGZpbHRlcl9mdW5jOworICB1aW50OF90IGhlYWRlcjsKKyAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICBjb25zdCB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBzaXplX3Qgb3V0cHV0X3NpemUgPSAwOworICBWUDhMQml0V3JpdGVyIHRtcF9idzsKKworICBhc3NlcnQoKHVpbnQ2NF90KWRhdGFfc2l6ZSA9PSAodWludDY0X3Qpd2lkdGggKiBoZWlnaHQpOyAgLy8gYXMgcGVyIHNwZWMKKyAgYXNzZXJ0KGZpbHRlciA+PSAwICYmIGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1QpOworICBhc3NlcnQobWV0aG9kID49IEFMUEhBX05PX0NPTVBSRVNTSU9OKTsKKyAgYXNzZXJ0KG1ldGhvZCA8PSBBTFBIQV9MT1NTTEVTU19DT01QUkVTU0lPTik7CisgIGFzc2VydChzaXplb2YoaGVhZGVyKSA9PSBBTFBIQV9IRUFERVJfTEVOKTsKKworICBmaWx0ZXJfZnVuYyA9IFdlYlBGaWx0ZXJzW2ZpbHRlcl07CisgIGlmIChmaWx0ZXJfZnVuYyAhPSBOVUxMKSB7CisgICAgZmlsdGVyX2Z1bmMoZGF0YSwgd2lkdGgsIGhlaWdodCwgd2lkdGgsIHRtcF9hbHBoYSk7CisgICAgYWxwaGFfc3JjID0gdG1wX2FscGhhOworICB9ICBlbHNlIHsKKyAgICBhbHBoYV9zcmMgPSBkYXRhOworICB9CisKKyAgaWYgKG1ldGhvZCAhPSBBTFBIQV9OT19DT01QUkVTU0lPTikgeworICAgIG9rID0gVlA4TEJpdFdyaXRlckluaXQoJnRtcF9idywgZGF0YV9zaXplID4+IDMpOworICAgIG9rID0gb2sgJiYgRW5jb2RlTG9zc2xlc3MoYWxwaGFfc3JjLCB3aWR0aCwgaGVpZ2h0LCBlZmZvcnRfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcmVkdWNlX2xldmVscywgJnRtcF9idywgJnJlc3VsdC0+c3RhdHMpOworICAgIGlmIChvaykgeworICAgICAgb3V0cHV0ID0gVlA4TEJpdFdyaXRlckZpbmlzaCgmdG1wX2J3KTsKKyAgICAgIG91dHB1dF9zaXplID0gVlA4TEJpdFdyaXRlck51bUJ5dGVzKCZ0bXBfYncpOworICAgICAgaWYgKG91dHB1dF9zaXplID4gZGF0YV9zaXplKSB7CisgICAgICAgIC8vIGNvbXByZXNzZWQgc2l6ZSBpcyBsYXJnZXIgdGhhbiBzb3VyY2UhIFJldmVydCB0byB1bmNvbXByZXNzZWQgbW9kZS4KKyAgICAgICAgbWV0aG9kID0gQUxQSEFfTk9fQ09NUFJFU1NJT047CisgICAgICAgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZ0bXBfYncpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBWUDhMQml0V3JpdGVyV2lwZU91dCgmdG1wX2J3KTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmIChtZXRob2QgPT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICBvdXRwdXQgPSBhbHBoYV9zcmM7CisgICAgb3V0cHV0X3NpemUgPSBkYXRhX3NpemU7CisgICAgb2sgPSAxOworICB9CisKKyAgLy8gRW1pdCBmaW5hbCByZXN1bHQuCisgIGhlYWRlciA9IG1ldGhvZCB8IChmaWx0ZXIgPDwgMik7CisgIGlmIChyZWR1Y2VfbGV2ZWxzKSBoZWFkZXIgfD0gQUxQSEFfUFJFUFJPQ0VTU0VEX0xFVkVMUyA8PCA0OworCisgIFZQOEJpdFdyaXRlckluaXQoJnJlc3VsdC0+YncsIEFMUEhBX0hFQURFUl9MRU4gKyBvdXRwdXRfc2l6ZSk7CisgIG9rID0gb2sgJiYgVlA4Qml0V3JpdGVyQXBwZW5kKCZyZXN1bHQtPmJ3LCAmaGVhZGVyLCBBTFBIQV9IRUFERVJfTEVOKTsKKyAgb2sgPSBvayAmJiBWUDhCaXRXcml0ZXJBcHBlbmQoJnJlc3VsdC0+YncsIG91dHB1dCwgb3V0cHV0X3NpemUpOworCisgIGlmIChtZXRob2QgIT0gQUxQSEFfTk9fQ09NUFJFU1NJT04pIHsKKyAgICBWUDhMQml0V3JpdGVyV2lwZU91dCgmdG1wX2J3KTsKKyAgfQorICBvayA9IG9rICYmICFyZXN1bHQtPmJ3LmVycm9yXzsKKyAgcmVzdWx0LT5zY29yZSA9IFZQOEJpdFdyaXRlclNpemUoJnJlc3VsdC0+YncpOworICByZXR1cm4gb2s7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgR2V0TnVtQ29sb3JzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUpIHsKKyAgaW50IGo7CisgIGludCBjb2xvcnMgPSAwOworICB1aW50OF90IGNvbG9yWzI1Nl0gPSB7IDAgfTsKKworICBmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyArK2opIHsKKyAgICBpbnQgaTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gZGF0YSArIGogKiBzdHJpZGU7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyArK2kpIHsKKyAgICAgIGNvbG9yW3BbaV1dID0gMTsKKyAgICB9CisgIH0KKyAgZm9yIChqID0gMDsgaiA8IDI1NjsgKytqKSB7CisgICAgaWYgKGNvbG9yW2pdID4gMCkgKytjb2xvcnM7CisgIH0KKyAgcmV0dXJuIGNvbG9yczsKK30KKworI2RlZmluZSBGSUxURVJfVFJZX05PTkUgKDEgPDwgV0VCUF9GSUxURVJfTk9ORSkKKyNkZWZpbmUgRklMVEVSX1RSWV9BTEwgKCgxIDw8IFdFQlBfRklMVEVSX0xBU1QpIC0gMSkKKworLy8gR2l2ZW4gdGhlIGlucHV0ICdmaWx0ZXInIG9wdGlvbiwgcmV0dXJuIGFuIE9SJ2QgYml0LXNldCBvZiBmaWx0ZXJzIHRvIHRyeS4KK3N0YXRpYyB1aW50MzJfdCBHZXRGaWx0ZXJNYXAoY29uc3QgdWludDhfdCogYWxwaGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpbHRlciwgaW50IGVmZm9ydF9sZXZlbCkgeworICB1aW50MzJfdCBiaXRfbWFwID0gMFU7CisgIGlmIChmaWx0ZXIgPT0gV0VCUF9GSUxURVJfRkFTVCkgeworICAgIC8vIFF1aWNrIGVzdGltYXRlIG9mIHRoZSBiZXN0IGNhbmRpZGF0ZS4KKyAgICBpbnQgdHJ5X2ZpbHRlcl9ub25lID0gKGVmZm9ydF9sZXZlbCA+IDMpOworICAgIGNvbnN0IGludCBrTWluQ29sb3JzRm9yRmlsdGVyTm9uZSA9IDE2OworICAgIGNvbnN0IGludCBrTWF4Q29sb3JzRm9yRmlsdGVyTm9uZSA9IDE5MjsKKyAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IEdldE51bUNvbG9ycyhhbHBoYSwgd2lkdGgsIGhlaWdodCwgd2lkdGgpOworICAgIC8vIEZvciBsb3cgbnVtYmVyIG9mIGNvbG9ycywgTk9ORSB5aWVsZHMgYmV0dGVyIGNvbXByZXNzaW9uLgorICAgIGZpbHRlciA9IChudW1fY29sb3JzIDw9IGtNaW5Db2xvcnNGb3JGaWx0ZXJOb25lKQorICAgICAgICA/IFdFQlBfRklMVEVSX05PTkUKKyAgICAgICAgOiBXZWJQRXN0aW1hdGVCZXN0RmlsdGVyKGFscGhhLCB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7CisgICAgYml0X21hcCB8PSAxIDw8IGZpbHRlcjsKKyAgICAvLyBGb3IgbGFyZ2UgbnVtYmVyIG9mIGNvbG9ycywgdHJ5IEZJTFRFUl9OT05FIGluIGFkZGl0aW9uIHRvIHRoZSBiZXN0CisgICAgLy8gZmlsdGVyIGFzIHdlbGwuCisgICAgaWYgKHRyeV9maWx0ZXJfbm9uZSB8fCBudW1fY29sb3JzID4ga01heENvbG9yc0ZvckZpbHRlck5vbmUpIHsKKyAgICAgIGJpdF9tYXAgfD0gRklMVEVSX1RSWV9OT05FOworICAgIH0KKyAgfSBlbHNlIGlmIChmaWx0ZXIgPT0gV0VCUF9GSUxURVJfTk9ORSkgeworICAgIGJpdF9tYXAgPSBGSUxURVJfVFJZX05PTkU7CisgIH0gZWxzZSB7ICAvLyBXRUJQX0ZJTFRFUl9CRVNUIC0+IHRyeSBhbGwKKyAgICBiaXRfbWFwID0gRklMVEVSX1RSWV9BTEw7CisgIH0KKyAgcmV0dXJuIGJpdF9tYXA7Cit9CisKK3N0YXRpYyB2b2lkIEluaXRGaWx0ZXJUcmlhbChGaWx0ZXJUcmlhbCogY29uc3Qgc2NvcmUpIHsKKyAgc2NvcmUtPnNjb3JlID0gKHNpemVfdCl+MFU7CisgIFZQOEJpdFdyaXRlckluaXQoJnNjb3JlLT5idywgMCk7Cit9CisKK3N0YXRpYyBpbnQgQXBwbHlGaWx0ZXJzQW5kRW5jb2RlKGNvbnN0IHVpbnQ4X3QqIGFscGhhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZGF0YV9zaXplLCBpbnQgbWV0aG9kLCBpbnQgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlZHVjZV9sZXZlbHMsIGludCBlZmZvcnRfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogY29uc3Qgb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb25zdCBvdXRwdXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBBdXhTdGF0cyogY29uc3Qgc3RhdHMpIHsKKyAgaW50IG9rID0gMTsKKyAgRmlsdGVyVHJpYWwgYmVzdDsKKyAgdWludDMyX3QgdHJ5X21hcCA9CisgICAgICBHZXRGaWx0ZXJNYXAoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIGZpbHRlciwgZWZmb3J0X2xldmVsKTsKKyAgSW5pdEZpbHRlclRyaWFsKCZiZXN0KTsKKworICBpZiAodHJ5X21hcCAhPSBGSUxURVJfVFJZX05PTkUpIHsKKyAgICB1aW50OF90KiBmaWx0ZXJlZF9hbHBoYSA9ICAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgZGF0YV9zaXplKTsKKyAgICBpZiAoZmlsdGVyZWRfYWxwaGEgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgICBmb3IgKGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7IG9rICYmIHRyeV9tYXA7ICsrZmlsdGVyLCB0cnlfbWFwID4+PSAxKSB7CisgICAgICBpZiAodHJ5X21hcCAmIDEpIHsKKyAgICAgICAgRmlsdGVyVHJpYWwgdHJpYWw7CisgICAgICAgIG9rID0gRW5jb2RlQWxwaGFJbnRlcm5hbChhbHBoYSwgd2lkdGgsIGhlaWdodCwgbWV0aG9kLCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VfbGV2ZWxzLCBlZmZvcnRfbGV2ZWwsIGZpbHRlcmVkX2FscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyaWFsKTsKKyAgICAgICAgaWYgKG9rICYmIHRyaWFsLnNjb3JlIDwgYmVzdC5zY29yZSkgeworICAgICAgICAgIFZQOEJpdFdyaXRlcldpcGVPdXQoJmJlc3QuYncpOworICAgICAgICAgIGJlc3QgPSB0cmlhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KCZ0cmlhbC5idyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKGZpbHRlcmVkX2FscGhhKTsKKyAgfSBlbHNlIHsKKyAgICBvayA9IEVuY29kZUFscGhhSW50ZXJuYWwoYWxwaGEsIHdpZHRoLCBoZWlnaHQsIG1ldGhvZCwgV0VCUF9GSUxURVJfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlX2xldmVscywgZWZmb3J0X2xldmVsLCBOVUxMLCAmYmVzdCk7CisgIH0KKyAgaWYgKG9rKSB7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIGlmIChzdGF0cyAhPSBOVUxMKSB7CisgICAgICBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgPSBiZXN0LnN0YXRzLmxvc3NsZXNzX2ZlYXR1cmVzOworICAgICAgc3RhdHMtPmhpc3RvZ3JhbV9iaXRzID0gYmVzdC5zdGF0cy5oaXN0b2dyYW1fYml0czsKKyAgICAgIHN0YXRzLT50cmFuc2Zvcm1fYml0cyA9IGJlc3Quc3RhdHMudHJhbnNmb3JtX2JpdHM7CisgICAgICBzdGF0cy0+Y2FjaGVfYml0cyA9IGJlc3Quc3RhdHMuY2FjaGVfYml0czsKKyAgICAgIHN0YXRzLT5wYWxldHRlX3NpemUgPSBiZXN0LnN0YXRzLnBhbGV0dGVfc2l6ZTsKKyAgICAgIHN0YXRzLT5sb3NzbGVzc19zaXplID0gYmVzdC5zdGF0cy5sb3NzbGVzc19zaXplOworICAgICAgc3RhdHMtPmxvc3NsZXNzX2hkcl9zaXplID0gYmVzdC5zdGF0cy5sb3NzbGVzc19oZHJfc2l6ZTsKKyAgICAgIHN0YXRzLT5sb3NzbGVzc19kYXRhX3NpemUgPSBiZXN0LnN0YXRzLmxvc3NsZXNzX2RhdGFfc2l6ZTsKKyAgICB9CisjZWxzZQorICAgICh2b2lkKXN0YXRzOworI2VuZGlmCisgICAgKm91dHB1dF9zaXplID0gVlA4Qml0V3JpdGVyU2l6ZSgmYmVzdC5idyk7CisgICAgKm91dHB1dCA9IFZQOEJpdFdyaXRlckJ1ZigmYmVzdC5idyk7CisgIH0gZWxzZSB7CisgICAgVlA4Qml0V3JpdGVyV2lwZU91dCgmYmVzdC5idyk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IEVuY29kZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBtZXRob2QsIGludCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBlZmZvcnRfbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBjb25zdCBvdXRwdXQsIHNpemVfdCogY29uc3Qgb3V0cHV0X3NpemUpIHsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworCisgIHVpbnQ4X3QqIHF1YW50X2FscGhhID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGRhdGFfc2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICB1aW50NjRfdCBzc2UgPSAwOworICBpbnQgb2sgPSAxOworICBjb25zdCBpbnQgcmVkdWNlX2xldmVscyA9IChxdWFsaXR5IDwgMTAwKTsKKworICAvLyBxdWljayBzYW5pdHkgY2hlY2tzCisgIGFzc2VydCgodWludDY0X3QpZGF0YV9zaXplID09ICh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCk7ICAvLyBhcyBwZXIgc3BlYworICBhc3NlcnQoZW5jICE9IE5VTEwgJiYgcGljICE9IE5VTEwgJiYgcGljLT5hICE9IE5VTEwpOworICBhc3NlcnQob3V0cHV0ICE9IE5VTEwgJiYgb3V0cHV0X3NpemUgIT0gTlVMTCk7CisgIGFzc2VydCh3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCk7CisgIGFzc2VydChwaWMtPmFfc3RyaWRlID49IHdpZHRoKTsKKyAgYXNzZXJ0KGZpbHRlciA+PSBXRUJQX0ZJTFRFUl9OT05FICYmIGZpbHRlciA8PSBXRUJQX0ZJTFRFUl9GQVNUKTsKKworICBpZiAocXVhbGl0eSA8IDAgfHwgcXVhbGl0eSA+IDEwMCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKG1ldGhvZCA8IEFMUEhBX05PX0NPTVBSRVNTSU9OIHx8IG1ldGhvZCA+IEFMUEhBX0xPU1NMRVNTX0NPTVBSRVNTSU9OKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBpZiAobWV0aG9kID09IEFMUEhBX05PX0NPTVBSRVNTSU9OKSB7CisgICAgLy8gRG9uJ3QgZmlsdGVyLCBhcyBmaWx0ZXJpbmcgd2lsbCBtYWtlIG5vIGltcGFjdCBvbiBjb21wcmVzc2VkIHNpemUuCisgICAgZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsKKyAgfQorCisgIHF1YW50X2FscGhhID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIGRhdGFfc2l6ZSk7CisgIGlmIChxdWFudF9hbHBoYSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBFeHRyYWN0IGFscGhhIGRhdGEgKHdpZHRoIHggaGVpZ2h0KSBmcm9tIHJhd19kYXRhIChzdHJpZGUgeCBoZWlnaHQpLgorICBXZWJQQ29weVBsYW5lKHBpYy0+YSwgcGljLT5hX3N0cmlkZSwgcXVhbnRfYWxwaGEsIHdpZHRoLCB3aWR0aCwgaGVpZ2h0KTsKKworICBpZiAocmVkdWNlX2xldmVscykgeyAgLy8gTm8gUXVhbnRpemF0aW9uIHJlcXVpcmVkIGZvciAncXVhbGl0eSA9IDEwMCcuCisgICAgLy8gMTYgYWxwaGEgbGV2ZWxzIGdpdmVzIHF1aXRlIGEgbG93IE1TRSB3LnIudCBvcmlnaW5hbCBhbHBoYSBwbGFuZSBoZW5jZQorICAgIC8vIG1hcHBlZCB0byBtb2RlcmF0ZSBxdWFsaXR5IDcwLiBIZW5jZSBRdWFsaXR5OlswLCA3MF0gLT4gTGV2ZWxzOlsyLCAxNl0KKyAgICAvLyBhbmQgUXVhbGl0eTpdNzAsIDEwMF0gLT4gTGV2ZWxzOl0xNiwgMjU2XS4KKyAgICBjb25zdCBpbnQgYWxwaGFfbGV2ZWxzID0gKHF1YWxpdHkgPD0gNzApID8gKDIgKyBxdWFsaXR5IC8gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKDE2ICsgKHF1YWxpdHkgLSA3MCkgKiA4KTsKKyAgICBvayA9IFF1YW50aXplTGV2ZWxzKHF1YW50X2FscGhhLCB3aWR0aCwgaGVpZ2h0LCBhbHBoYV9sZXZlbHMsICZzc2UpOworICB9CisKKyAgaWYgKG9rKSB7CisgICAgVlA4RmlsdGVyc0luaXQoKTsKKyAgICBvayA9IEFwcGx5RmlsdGVyc0FuZEVuY29kZShxdWFudF9hbHBoYSwgd2lkdGgsIGhlaWdodCwgZGF0YV9zaXplLCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyLCByZWR1Y2VfbGV2ZWxzLCBlZmZvcnRfbGV2ZWwsIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc2l6ZSwgcGljLT5zdGF0cyk7CisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorICAgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsgIC8vIG5lZWQgc3RhdHM/CisgICAgICBwaWMtPnN0YXRzLT5jb2RlZF9zaXplICs9IChpbnQpKCpvdXRwdXRfc2l6ZSk7CisgICAgICBlbmMtPnNzZV9bM10gPSBzc2U7CisgICAgfQorI2VuZGlmCisgIH0KKworICBXZWJQU2FmZUZyZWUocXVhbnRfYWxwaGEpOworICByZXR1cm4gb2s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGxzCisKK3N0YXRpYyBpbnQgQ29tcHJlc3NBbHBoYUpvYih2b2lkKiBhcmcxLCB2b2lkKiBkdW1teSkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSAoVlA4RW5jb2RlciopYXJnMTsKKyAgY29uc3QgV2ViUENvbmZpZyogY29uZmlnID0gZW5jLT5jb25maWdfOworICB1aW50OF90KiBhbHBoYV9kYXRhID0gTlVMTDsKKyAgc2l6ZV90IGFscGhhX3NpemUgPSAwOworICBjb25zdCBpbnQgZWZmb3J0X2xldmVsID0gY29uZmlnLT5tZXRob2Q7ICAvLyBtYXBzIHRvIFswLi42XQorICBjb25zdCBXRUJQX0ZJTFRFUl9UWVBFIGZpbHRlciA9CisgICAgICAoY29uZmlnLT5hbHBoYV9maWx0ZXJpbmcgPT0gMCkgPyBXRUJQX0ZJTFRFUl9OT05FIDoKKyAgICAgIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA9PSAxKSA/IFdFQlBfRklMVEVSX0ZBU1QgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9GSUxURVJfQkVTVDsKKyAgaWYgKCFFbmNvZGVBbHBoYShlbmMsIGNvbmZpZy0+YWxwaGFfcXVhbGl0eSwgY29uZmlnLT5hbHBoYV9jb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGVmZm9ydF9sZXZlbCwgJmFscGhhX2RhdGEsICZhbHBoYV9zaXplKSkgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChhbHBoYV9zaXplICE9ICh1aW50MzJfdClhbHBoYV9zaXplKSB7ICAvLyBTYW5pdHkgY2hlY2suCisgICAgV2ViUFNhZmVGcmVlKGFscGhhX2RhdGEpOworICAgIHJldHVybiAwOworICB9CisgIGVuYy0+YWxwaGFfZGF0YV9zaXplXyA9ICh1aW50MzJfdClhbHBoYV9zaXplOworICBlbmMtPmFscGhhX2RhdGFfID0gYWxwaGFfZGF0YTsKKyAgKHZvaWQpZHVtbXk7CisgIHJldHVybiAxOworfQorCit2b2lkIFZQOEVuY0luaXRBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgZW5jLT5oYXNfYWxwaGFfID0gV2ViUFBpY3R1cmVIYXNUcmFuc3BhcmVuY3koZW5jLT5waWNfKTsKKyAgZW5jLT5hbHBoYV9kYXRhXyA9IE5VTEw7CisgIGVuYy0+YWxwaGFfZGF0YV9zaXplXyA9IDA7CisgIGlmIChlbmMtPnRocmVhZF9sZXZlbF8gPiAwKSB7CisgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKKyAgICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkluaXQod29ya2VyKTsKKyAgICB3b3JrZXItPmRhdGExID0gZW5jOworICAgIHdvcmtlci0+ZGF0YTIgPSBOVUxMOworICAgIHdvcmtlci0+aG9vayA9IENvbXByZXNzQWxwaGFKb2I7CisgIH0KK30KKworaW50IFZQOEVuY1N0YXJ0QWxwaGEoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGlmIChlbmMtPmhhc19hbHBoYV8pIHsKKyAgICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgICAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gJmVuYy0+YWxwaGFfd29ya2VyXzsKKyAgICAgIC8vIE1ha2VzIHN1cmUgd29ya2VyIGlzIGdvb2QgdG8gZ28uCisgICAgICBpZiAoIVdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+UmVzZXQod29ya2VyKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+TGF1bmNoKHdvcmtlcik7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIENvbXByZXNzQWxwaGFKb2IoZW5jLCBOVUxMKTsgICAvLyBqdXN0IGRvIHRoZSBqb2IgcmlnaHQgYXdheQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IFZQOEVuY0ZpbmlzaEFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7CisgICAgaWYgKGVuYy0+dGhyZWFkX2xldmVsXyA+IDApIHsKKyAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgICBpZiAoIVdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+U3luYyh3b3JrZXIpKSByZXR1cm4gMDsgIC8vIGVycm9yCisgICAgfQorICB9CisgIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBlbmMtPnBlcmNlbnRfICsgMjAsICZlbmMtPnBlcmNlbnRfKTsKK30KKworaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgb2sgPSAxOworICBpZiAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgeworICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9ICZlbmMtPmFscGhhX3dvcmtlcl87CisgICAgLy8gZmluaXNoIGFueXRoaW5nIGxlZnQgaW4gZmxpZ2h0CisgICAgb2sgPSBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPlN5bmMod29ya2VyKTsKKyAgICAvLyBzdGlsbCBuZWVkIHRvIGVuZCB0aGUgd29ya2VyLCBldmVuIGlmICFvaworICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKS0+RW5kKHdvcmtlcik7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGVuYy0+YWxwaGFfZGF0YV8pOworICBlbmMtPmFscGhhX2RhdGFfID0gTlVMTDsKKyAgZW5jLT5hbHBoYV9kYXRhX3NpemVfID0gMDsKKyAgZW5jLT5oYXNfYWxwaGFfID0gMDsKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL2FuYWx5c2lzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FuYWx5c2lzX2VuYy5jCnNpbWlsYXJpdHkgaW5kZXggNjAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbmFseXNpcy5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2FuYWx5c2lzX2VuYy5jCmluZGV4IGY0MzU4MDcuLmE0N2ZmN2QgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9hbmFseXNpcy5jCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYW5hbHlzaXNfZW5jLmMKQEAgLTExLDIyICsxMSwxMyBAQAogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgogCi0jaW5jbHVkZSAiLi92cDhlbmNpLmgiCi0jaW5jbHVkZSAiLi9jb3N0LmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKIAogI2RlZmluZSBNQVhfSVRFUlNfS19NRUFOUyAgNgogCkBAIC0zOSw4ICszMCw4IEBACiAgIGNvbnN0IGludCB3ID0gZW5jLT5tYl93XzsKICAgY29uc3QgaW50IGggPSBlbmMtPm1iX2hfOwogICBjb25zdCBpbnQgbWFqb3JpdHlfY250XzNfeF8zX2dyaWQgPSA1OwotICB1aW50OF90KiBjb25zdCB0bXAgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoKHVpbnQ2NF90KXcgKiBoLCBzaXplb2YoKnRtcCkpOwotICBTQl9EQ0hFQ0soKHVpbnQ2NF90KSh3ICogaCkgPT0gKHVpbnQ2NF90KXcgKiBoKTsgICAvLyBubyBvdmVyZmxvdywgYXMgcGVyIHNwZWMKKyAgdWludDhfdCogY29uc3QgdG1wID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHcgKiBoLCBzaXplb2YoKnRtcCkpOworICBhc3NlcnQoKHVpbnQ2NF90KSh3ICogaCkgPT0gKHVpbnQ2NF90KXcgKiBoKTsgICAvLyBubyBvdmVyZmxvdywgYXMgcGVyIHNwZWMKIAogICBpZiAodG1wID09IE5VTEwpIHJldHVybjsKICAgZm9yICh5ID0gMTsgeSA8IGggLSAxOyArK3kpIHsKQEAgLTYwLDYgKzUxLDcgQEAKICAgICAgIGZvciAobiA9IDA7IG4gPCBOVU1fTUJfU0VHTUVOVFM7ICsrbikgewogICAgICAgICBpZiAoY250W25dID49IG1ham9yaXR5X2NudF8zX3hfM19ncmlkKSB7CiAgICAgICAgICAgbWFqb3JpdHlfc2VnID0gbjsKKyAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgfQogICAgICAgdG1wW3ggKyB5ICogd10gPSBtYWpvcml0eV9zZWc7CkBAIC03MSw3ICs2Myw3IEBACiAgICAgICBtYi0+c2VnbWVudF8gPSB0bXBbeCArIHkgKiB3XTsKICAgICB9CiAgIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHRtcCk7CisgIFdlYlBTYWZlRnJlZSh0bXApOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTUsNyArODcsNyBAQAogICAgIH0KICAgfQogICBpZiAobWF4ID09IG1pbikgbWF4ID0gbWluICsgMTsKLSAgU0JfRENIRUNLKG1pZCA8PSBtYXggJiYgbWlkID49IG1pbik7CisgIGFzc2VydChtaWQgPD0gbWF4ICYmIG1pZCA+PSBtaW4pOwogICBmb3IgKG4gPSAwOyBuIDwgbmI7ICsrbikgewogICAgIGNvbnN0IGludCBhbHBoYSA9IDI1NSAqIChjZW50ZXJzW25dIC0gbWlkKSAvIChtYXggLSBtaW4pOwogICAgIGNvbnN0IGludCBiZXRhID0gMjU1ICogKGNlbnRlcnNbbl0gLSBtaW4pIC8gKG1heCAtIG1pbik7CkBAIC0xMTksMjggKzExMSwyOCBAQAogfQogCiBzdGF0aWMgaW50IEdldEFscGhhKGNvbnN0IFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKLSAgaW50IG1heF92YWx1ZSA9IDAsIGxhc3Rfbm9uX3plcm8gPSAxOwotICBpbnQgazsKLSAgaW50IGFscGhhOwotICBmb3IgKGsgPSAwOyBrIDw9IE1BWF9DT0VGRl9USFJFU0g7ICsraykgewotICAgIGNvbnN0IGludCB2YWx1ZSA9IGhpc3RvLT5kaXN0cmlidXRpb25ba107Ci0gICAgaWYgKHZhbHVlID4gMCkgewotICAgICAgaWYgKHZhbHVlID4gbWF4X3ZhbHVlKSBtYXhfdmFsdWUgPSB2YWx1ZTsKLSAgICAgIGxhc3Rfbm9uX3plcm8gPSBrOwotICAgIH0KLSAgfQogICAvLyAnYWxwaGEnIHdpbGwgbGF0ZXIgYmUgY2xpcHBlZCB0byBbMC4uTUFYX0FMUEhBXSByYW5nZSwgY2xhbXBpbmcgb3V0ZXIKICAgLy8gdmFsdWVzIHdoaWNoIGhhcHBlbiB0byBiZSBtb3N0bHkgbm9pc2UuIFRoaXMgbGVhdmVzIHRoZSBtYXhpbXVtIHByZWNpc2lvbgogICAvLyBmb3IgaGFuZGxpbmcgdGhlIHVzZWZ1bCBzbWFsbCB2YWx1ZXMgd2hpY2ggY29udHJpYnV0ZSBtb3N0LgotICBhbHBoYSA9IChtYXhfdmFsdWUgPiAxKSA/IEFMUEhBX1NDQUxFICogbGFzdF9ub25femVybyAvIG1heF92YWx1ZSA6IDA7CisgIGNvbnN0IGludCBtYXhfdmFsdWUgPSBoaXN0by0+bWF4X3ZhbHVlOworICBjb25zdCBpbnQgbGFzdF9ub25femVybyA9IGhpc3RvLT5sYXN0X25vbl96ZXJvOworICBjb25zdCBpbnQgYWxwaGEgPQorICAgICAgKG1heF92YWx1ZSA+IDEpID8gQUxQSEFfU0NBTEUgKiBsYXN0X25vbl96ZXJvIC8gbWF4X3ZhbHVlIDogMDsKICAgcmV0dXJuIGFscGhhOwogfQogCitzdGF0aWMgdm9pZCBJbml0SGlzdG9ncmFtKFZQOEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgaGlzdG8tPm1heF92YWx1ZSA9IDA7CisgIGhpc3RvLT5sYXN0X25vbl96ZXJvID0gMTsKK30KKwogc3RhdGljIHZvaWQgTWVyZ2VIaXN0b2dyYW1zKGNvbnN0IFZQOEhpc3RvZ3JhbSogY29uc3QgaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4SGlzdG9ncmFtKiBjb25zdCBvdXQpIHsKLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPD0gTUFYX0NPRUZGX1RIUkVTSDsgKytpKSB7Ci0gICAgb3V0LT5kaXN0cmlidXRpb25baV0gKz0gaW4tPmRpc3RyaWJ1dGlvbltpXTsKKyAgaWYgKGluLT5tYXhfdmFsdWUgPiBvdXQtPm1heF92YWx1ZSkgeworICAgIG91dC0+bWF4X3ZhbHVlID0gaW4tPm1heF92YWx1ZTsKKyAgfQorICBpZiAoaW4tPmxhc3Rfbm9uX3plcm8gPiBvdXQtPmxhc3Rfbm9uX3plcm8pIHsKKyAgICBvdXQtPmxhc3Rfbm9uX3plcm8gPSBpbi0+bGFzdF9ub25femVybzsKICAgfQogfQogCkBAIC0xNDksNyArMTQxLDExIEBACiAKIHN0YXRpYyB2b2lkIEFzc2lnblNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhbHBoYXNbTUFYX0FMUEhBICsgMV0pIHsKLSAgY29uc3QgaW50IG5iID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgLy8gJ251bV9zZWdtZW50c18nIGlzIHByZXZpb3VzbHkgdmFsaWRhdGVkIGFuZCA8PSBOVU1fTUJfU0VHTUVOVFMsIGJ1dCBhbgorICAvLyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgc3B1cmlvdXMgd2FybmluZyBhYm91dCAnbiArIDEnIGV4Y2VlZGluZworICAvLyBhcnJheSBib3VuZHMgb2YgJ2NlbnRlcnMnIHdpdGggc29tZSBjb21waWxlcnMgKG5vdGljZWQgd2l0aCBnY2MtNC45KS4KKyAgY29uc3QgaW50IG5iID0gKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPCBOVU1fTUJfU0VHTUVOVFMpID8KKyAgICAgICAgICAgICAgICAgZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA6IE5VTV9NQl9TRUdNRU5UUzsKICAgaW50IGNlbnRlcnNbTlVNX01CX1NFR01FTlRTXTsKICAgaW50IHdlaWdodGVkX2F2ZXJhZ2UgPSAwOwogICBpbnQgbWFwW01BWF9BTFBIQSArIDFdOwpAQCAtMTU4LDYgKzE1NCw5IEBACiAgIC8vICdpbnQnIHR5cGUgaXMgb2sgZm9yIGhpc3RvLCBhbmQgd29uJ3Qgb3ZlcmZsb3cKICAgaW50IGFjY3VtW05VTV9NQl9TRUdNRU5UU10sIGRpc3RfYWNjdW1bTlVNX01CX1NFR01FTlRTXTsKIAorICBhc3NlcnQobmIgPj0gMSk7CisgIGFzc2VydChuYiA8PSBOVU1fTUJfU0VHTUVOVFMpOworCiAgIC8vIGJyYWNrZXQgdGhlIGlucHV0CiAgIGZvciAobiA9IDA7IG4gPD0gTUFYX0FMUEhBICYmIGFscGhhc1tuXSA9PSAwOyArK24pIHt9CiAgIG1pbl9hID0gbjsKQEAgLTE2Niw4ICsxNjUsOSBAQAogICByYW5nZV9hID0gbWF4X2EgLSBtaW5fYTsKIAogICAvLyBTcHJlYWQgaW5pdGlhbCBjZW50ZXJzIGV2ZW5seQotICBmb3IgKG4gPSAxLCBrID0gMDsgbiA8IDIgKiBuYjsgbiArPSAyKSB7Ci0gICAgY2VudGVyc1trKytdID0gbWluX2EgKyAobiAqIHJhbmdlX2EpIC8gKDIgKiBuYik7CisgIGZvciAoayA9IDAsIG4gPSAxOyBrIDwgbmI7ICsraywgbiArPSAyKSB7CisgICAgYXNzZXJ0KG4gPCAyICogbmIpOworICAgIGNlbnRlcnNba10gPSBtaW5fYSArIChuICogcmFuZ2VfYSkgLyAoMiAqIG5iKTsKICAgfQogCiAgIGZvciAoayA9IDA7IGsgPCBNQVhfSVRFUlNfS19NRUFOUzsgKytrKSB7ICAgICAvLyBmZXcgaXRlcnMgYXJlIGVub3VnaApAQCAtMTgyLDcgKzE4Miw3IEBACiAgICAgbiA9IDA7ICAgIC8vIHRyYWNrIHRoZSBuZWFyZXN0IGNlbnRlciBmb3IgY3VycmVudCAnYScKICAgICBmb3IgKGEgPSBtaW5fYTsgYSA8PSBtYXhfYTsgKythKSB7CiAgICAgICBpZiAoYWxwaGFzW2FdKSB7Ci0gICAgICAgIHdoaWxlIChuIDwgbmIgLSAxICYmIGFicyhhIC0gY2VudGVyc1tuICsgMV0pIDwgYWJzKGEgLSBjZW50ZXJzW25dKSkgeworICAgICAgICB3aGlsZSAobiArIDEgPCBuYiAmJiBhYnMoYSAtIGNlbnRlcnNbbiArIDFdKSA8IGFicyhhIC0gY2VudGVyc1tuXSkpIHsKICAgICAgICAgICBuKys7CiAgICAgICAgIH0KICAgICAgICAgbWFwW2FdID0gbjsKQEAgLTIzMCwyOCArMjMwLDI2IEBACiAvLyBzdXNjZXB0aWJpbGl0eSBhbmQgc2V0IGJlc3QgbW9kZXMgZm9yIHRoaXMgbWFjcm9ibG9jay4KIC8vIFNlZ21lbnQgYXNzaWdubWVudCBpcyBkb25lIGxhdGVyLgogCi0vLyBOdW1iZXIgb2YgbW9kZXMgdG8gaW5zcGVjdCBmb3IgYWxwaGFfIGV2YWx1YXRpb24uIEZvciBoaWdoLXF1YWxpdHkgc2V0dGluZ3MKLS8vIChtZXRob2QgPj0gRkFTVF9BTkFMWVNJU19NRVRIT0QpIHdlIGRvbid0IG5lZWQgdG8gdGVzdCBhbGwgdGhlIHBvc3NpYmxlIG1vZGVzCi0vLyBkdXJpbmcgdGhlIGFuYWx5c2lzIHBoYXNlLgotI2RlZmluZSBGQVNUX0FOQUxZU0lTX01FVEhPRCA0ICAvLyBtZXRob2QgYWJvdmUgd2hpY2ggd2UgZG8gcGFydGlhbCBhbmFseXNpcworLy8gTnVtYmVyIG9mIG1vZGVzIHRvIGluc3BlY3QgZm9yIGFscGhhXyBldmFsdWF0aW9uLiBXZSBkb24ndCBuZWVkIHRvIHRlc3QgYWxsCisvLyB0aGUgcG9zc2libGUgbW9kZXMgZHVyaW5nIHRoZSBhbmFseXNpcyBwaGFzZTogd2UgcmlzayBmYWxsaW5nIGludG8gYSBsb2NhbAorLy8gb3B0aW11bSwgb3IgYmUgc3ViamVjdCB0byBib3VuZGFyeSBlZmZlY3QKICNkZWZpbmUgTUFYX0lOVFJBMTZfTU9ERSAyCiAjZGVmaW5lIE1BWF9JTlRSQTRfTU9ERSAgMgogI2RlZmluZSBNQVhfVVZfTU9ERSAgICAgIDIKIAogc3RhdGljIGludCBNQkFuYWx5emVCZXN0SW50cmExNk1vZGUoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IGludCBtYXhfbW9kZSA9Ci0gICAgICAoaXQtPmVuY18tPm1ldGhvZF8gPj0gRkFTVF9BTkFMWVNJU19NRVRIT0QpID8gTUFYX0lOVFJBMTZfTU9ERQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9QUkVEX01PREVTOworICBjb25zdCBpbnQgbWF4X21vZGUgPSBNQVhfSU5UUkExNl9NT0RFOwogICBpbnQgbW9kZTsKICAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOwogICBpbnQgYmVzdF9tb2RlID0gMDsKIAogICBWUDhNYWtlTHVtYTE2UHJlZHMoaXQpOwogICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgbWF4X21vZGU7ICsrbW9kZSkgewotICAgIFZQOEhpc3RvZ3JhbSBoaXN0byA9IHsgeyAwIH0gfTsKKyAgICBWUDhIaXN0b2dyYW0gaGlzdG87CiAgICAgaW50IGFscGhhOwogCi0gICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShpdC0+eXV2X2luXyArIFlfT0ZGLAorICAgIEluaXRIaXN0b2dyYW0oJmhpc3RvKTsKKyAgICBWUDhDb2xsZWN0SGlzdG9ncmFtKGl0LT55dXZfaW5fICsgWV9PRkZfRU5DLAogICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdLAogICAgICAgICAgICAgICAgICAgICAgICAgMCwgMTYsICZoaXN0byk7CiAgICAgYWxwaGEgPSBHZXRBbHBoYSgmaGlzdG8pOwpAQCAtMjY0LDI4ICsyNjIsNTAgQEAKICAgcmV0dXJuIGJlc3RfYWxwaGE7CiB9CiAKK3N0YXRpYyBpbnQgRmFzdE1CQW5hbHl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgLy8gRW1waXJpY2FsIGN1dC1vZmYgdmFsdWUsIHNob3VsZCBiZSBhcm91bmQgMTYgKH49YmxvY2sgc2l6ZSkuIFdlIHVzZSB0aGUKKyAgLy8gWzgtMTddIHJhbmdlIGFuZCBmYXZvciBpbnRyYTQgYXQgaGlnaCBxdWFsaXR5LCBpbnRyYTE2IGZvciBsb3cgcXVhbGl0eS4KKyAgY29uc3QgaW50IHEgPSAoaW50KWl0LT5lbmNfLT5jb25maWdfLT5xdWFsaXR5OworICBjb25zdCB1aW50MzJfdCBrVGhyZXNob2xkID0gOCArICgxNyAtIDgpICogcSAvIDEwMDsKKyAgaW50IGs7CisgIHVpbnQzMl90IGRjWzE2XSwgbSwgbTI7CisgIGZvciAoayA9IDA7IGsgPCAxNjsgayArPSA0KSB7CisgICAgVlA4TWVhbjE2eDQoaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMgKyBrICogQlBTLCAmZGNba10pOworICB9CisgIGZvciAobSA9IDAsIG0yID0gMCwgayA9IDA7IGsgPCAxNjsgKytrKSB7CisgICAgbSArPSBkY1trXTsKKyAgICBtMiArPSBkY1trXSAqIGRjW2tdOworICB9CisgIGlmIChrVGhyZXNob2xkICogbTIgPCBtICogbSkgeworICAgIFZQOFNldEludHJhMTZNb2RlKGl0LCAwKTsgICAvLyBEQzE2CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCBtb2Rlc1sxNl0gPSB7IDAgfTsgIC8vIERDNAorICAgIFZQOFNldEludHJhNE1vZGUoaXQsIG1vZGVzKTsKKyAgfQorICByZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBNQkFuYWx5emVCZXN0SW50cmE0TW9kZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXN0X2FscGhhKSB7CiAgIHVpbnQ4X3QgbW9kZXNbMTZdOwotICBjb25zdCBpbnQgbWF4X21vZGUgPQotICAgICAgKGl0LT5lbmNfLT5tZXRob2RfID49IEZBU1RfQU5BTFlTSVNfTUVUSE9EKSA/IE1BWF9JTlRSQTRfTU9ERQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9CTU9ERVM7CisgIGNvbnN0IGludCBtYXhfbW9kZSA9IE1BWF9JTlRSQTRfTU9ERTsKICAgaW50IGk0X2FscGhhOwotICBWUDhIaXN0b2dyYW0gdG90YWxfaGlzdG8gPSB7IHsgMCB9IH07CisgIFZQOEhpc3RvZ3JhbSB0b3RhbF9oaXN0bzsKICAgaW50IGN1cl9oaXN0byA9IDA7CisgIEluaXRIaXN0b2dyYW0oJnRvdGFsX2hpc3RvKTsKIAogICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOwogICBkbyB7CiAgICAgaW50IG1vZGU7CiAgICAgaW50IGJlc3RfbW9kZV9hbHBoYSA9IERFRkFVTFRfQUxQSEE7CiAgICAgVlA4SGlzdG9ncmFtIGhpc3Rvc1syXTsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CiAKICAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOwogICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBtYXhfbW9kZTsgKyttb2RlKSB7CiAgICAgICBpbnQgYWxwaGE7CiAKLSAgICAgIFNiTWVtb3J5U2V0KCZoaXN0b3NbY3VyX2hpc3RvXSwgMCwgc2l6ZW9mKGhpc3Rvc1tjdXJfaGlzdG9dKSk7CisgICAgICBJbml0SGlzdG9ncmFtKCZoaXN0b3NbY3VyX2hpc3RvXSk7CiAgICAgICBWUDhDb2xsZWN0SGlzdG9ncmFtKHNyYywgaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsICZoaXN0b3NbY3VyX2hpc3RvXSk7CiAgICAgICBhbHBoYSA9IEdldEFscGhhKCZoaXN0b3NbY3VyX2hpc3RvXSk7CkBAIC0yOTgsNyArMzE4LDcgQEAKICAgICAvLyBhY2N1bXVsYXRlIGJlc3QgaGlzdG9ncmFtCiAgICAgTWVyZ2VIaXN0b2dyYW1zKCZoaXN0b3NbY3VyX2hpc3RvIF4gMV0sICZ0b3RhbF9oaXN0byk7CiAgICAgLy8gTm90ZTogd2UgcmV1c2UgdGhlIG9yaWdpbmFsIHNhbXBsZXMgZm9yIHByZWRpY3RvcnMKLSAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9pbl8gKyBZX09GRikpOworICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQykpOwogCiAgIGk0X2FscGhhID0gR2V0QWxwaGEoJnRvdGFsX2hpc3RvKTsKICAgaWYgKElTX0JFVFRFUl9BTFBIQShpNF9hbHBoYSwgYmVzdF9hbHBoYSkpIHsKQEAgLTMxMCwyMSArMzMwLDI2IEBACiAKIHN0YXRpYyBpbnQgTUJBbmFseXplQmVzdFVWTW9kZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKICAgaW50IGJlc3RfYWxwaGEgPSBERUZBVUxUX0FMUEhBOworICBpbnQgc21hbGxlc3RfYWxwaGEgPSAwOwogICBpbnQgYmVzdF9tb2RlID0gMDsKLSAgY29uc3QgaW50IG1heF9tb2RlID0KLSAgICAgIChpdC0+ZW5jXy0+bWV0aG9kXyA+PSBGQVNUX0FOQUxZU0lTX01FVEhPRCkgPyBNQVhfVVZfTU9ERQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9QUkVEX01PREVTOworICBjb25zdCBpbnQgbWF4X21vZGUgPSBNQVhfVVZfTU9ERTsKICAgaW50IG1vZGU7CisKICAgVlA4TWFrZUNocm9tYThQcmVkcyhpdCk7CiAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBtYXhfbW9kZTsgKyttb2RlKSB7Ci0gICAgVlA4SGlzdG9ncmFtIGhpc3RvID0geyB7IDAgfSB9OworICAgIFZQOEhpc3RvZ3JhbSBoaXN0bzsKICAgICBpbnQgYWxwaGE7Ci0gICAgVlA4Q29sbGVjdEhpc3RvZ3JhbShpdC0+eXV2X2luXyArIFVfT0ZGLAorICAgIEluaXRIaXN0b2dyYW0oJmhpc3RvKTsKKyAgICBWUDhDb2xsZWN0SGlzdG9ncmFtKGl0LT55dXZfaW5fICsgVV9PRkZfRU5DLAogICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgMTYgKyA0ICsgNCwgJmhpc3RvKTsKICAgICBhbHBoYSA9IEdldEFscGhhKCZoaXN0byk7CiAgICAgaWYgKElTX0JFVFRFUl9BTFBIQShhbHBoYSwgYmVzdF9hbHBoYSkpIHsKICAgICAgIGJlc3RfYWxwaGEgPSBhbHBoYTsKKyAgICB9CisgICAgLy8gVGhlIGJlc3QgcHJlZGljdGlvbiBtb2RlIHRlbmRzIHRvIGJlIHRoZSBvbmUgd2l0aCB0aGUgc21hbGxlc3QgYWxwaGEuCisgICAgaWYgKG1vZGUgPT0gMCB8fCBhbHBoYSA8IHNtYWxsZXN0X2FscGhhKSB7CisgICAgICBzbWFsbGVzdF9hbHBoYSA9IGFscGhhOwogICAgICAgYmVzdF9tb2RlID0gbW9kZTsKICAgICB9CiAgIH0KQEAgLTM0MiwxMyArMzY3LDE3IEBACiAgIFZQOFNldFNraXAoaXQsIDApOyAgICAgICAgIC8vIG5vdCBza2lwcGVkCiAgIFZQOFNldFNlZ21lbnQoaXQsIDApOyAgICAgIC8vIGRlZmF1bHQgc2VnbWVudCwgc3BlYy13aXNlLgogCi0gIGJlc3RfYWxwaGEgPSBNQkFuYWx5emVCZXN0SW50cmExNk1vZGUoaXQpOwotICBpZiAoZW5jLT5tZXRob2RfID49IDUpIHsKLSAgICAvLyBXZSBnbyBhbmQgbWFrZSBhIGZhc3QgZGVjaXNpb24gZm9yIGludHJhNC9pbnRyYTE2LgotICAgIC8vIEl0J3MgdXN1YWxseSBub3QgYSBnb29kIGFuZCBkZWZpbml0aXZlIHBpY2ssIGJ1dCBoZWxwcyBzZWVkaW5nIHRoZSBzdGF0cwotICAgIC8vIGFib3V0IGxldmVsIGJpdC1jb3N0LgotICAgIC8vIFRPRE8oc2thbCk6IGltcHJvdmUgY3JpdGVyaW9uLgotICAgIGJlc3RfYWxwaGEgPSBNQkFuYWx5emVCZXN0SW50cmE0TW9kZShpdCwgYmVzdF9hbHBoYSk7CisgIGlmIChlbmMtPm1ldGhvZF8gPD0gMSkgeworICAgIGJlc3RfYWxwaGEgPSBGYXN0TUJBbmFseXplKGl0KTsKKyAgfSBlbHNlIHsKKyAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhMTZNb2RlKGl0KTsKKyAgICBpZiAoZW5jLT5tZXRob2RfID49IDUpIHsKKyAgICAgIC8vIFdlIGdvIGFuZCBtYWtlIGEgZmFzdCBkZWNpc2lvbiBmb3IgaW50cmE0L2ludHJhMTYuCisgICAgICAvLyBJdCdzIHVzdWFsbHkgbm90IGEgZ29vZCBhbmQgZGVmaW5pdGl2ZSBwaWNrLCBidXQgaGVscHMgc2VlZGluZyB0aGUKKyAgICAgIC8vIHN0YXRzIGFib3V0IGxldmVsIGJpdC1jb3N0LgorICAgICAgLy8gVE9ETyhza2FsKTogaW1wcm92ZSBjcml0ZXJpb24uCisgICAgICBiZXN0X2FscGhhID0gTUJBbmFseXplQmVzdEludHJhNE1vZGUoaXQsIGJlc3RfYWxwaGEpOworICAgIH0KICAgfQogICBiZXN0X3V2X2FscGhhID0gTUJBbmFseXplQmVzdFVWTW9kZShpdCk7CiAKQEAgLTM4OSwzOCArNDE4LDExOCBAQAogICAvLyBEZWZhdWx0IHN1c2NlcHRpYmlsaXRpZXMuCiAgIGVuYy0+ZHFtX1swXS5hbHBoYV8gPSAwOwogICBlbmMtPmRxbV9bMF0uYmV0YV8gPSAwOwotICAvLyBOb3RlOiB3ZSBjYW4ndCBjb21wdXRlIHRoaXMgYWxwaGFfIC8gdXZfYWxwaGFfLgorICAvLyBOb3RlOiB3ZSBjYW4ndCBjb21wdXRlIHRoaXMgYWxwaGFfIC8gdXZfYWxwaGFfIC0+IHNldCB0byBkZWZhdWx0IHZhbHVlLgorICBlbmMtPmFscGhhXyA9IDA7CisgIGVuYy0+dXZfYWxwaGFfID0gMDsKICAgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7CiB9CiAKKy8vIHN0cnVjdCB1c2VkIHRvIGNvbGxlY3Qgam9iIHJlc3VsdAordHlwZWRlZiBzdHJ1Y3QgeworICBXZWJQV29ya2VyIHdvcmtlcjsKKyAgaW50IGFscGhhc1tNQVhfQUxQSEEgKyAxXTsKKyAgaW50IGFscGhhLCB1dl9hbHBoYTsKKyAgVlA4RW5jSXRlcmF0b3IgaXQ7CisgIGludCBkZWx0YV9wcm9ncmVzczsKK30gU2VnbWVudEpvYjsKKworLy8gbWFpbiB3b3JrIGNhbGwKK3N0YXRpYyBpbnQgRG9TZWdtZW50c0pvYih2b2lkKiBhcmcxLCB2b2lkKiBhcmcyKSB7CisgIFNlZ21lbnRKb2IqIGNvbnN0IGpvYiA9IChTZWdtZW50Sm9iKilhcmcxOworICBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQgPSAoVlA4RW5jSXRlcmF0b3IqKWFyZzI7CisgIGludCBvayA9IDE7CisgIGlmICghVlA4SXRlcmF0b3JJc0RvbmUoaXQpKSB7CisgICAgdWludDhfdCB0bXBbMzIgKyBXRUJQX0FMSUdOX0NTVF07CisgICAgdWludDhfdCogY29uc3Qgc2NyYXRjaCA9ICh1aW50OF90KilXRUJQX0FMSUdOKHRtcCk7CisgICAgZG8geworICAgICAgLy8gTGV0J3MgcHJldGVuZCB3ZSBoYXZlIHBlcmZlY3QgbG9zc2xlc3MgcmVjb25zdHJ1Y3Rpb24uCisgICAgICBWUDhJdGVyYXRvckltcG9ydChpdCwgc2NyYXRjaCk7CisgICAgICBNQkFuYWx5emUoaXQsIGpvYi0+YWxwaGFzLCAmam9iLT5hbHBoYSwgJmpvYi0+dXZfYWxwaGEpOworICAgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKGl0LCBqb2ItPmRlbHRhX3Byb2dyZXNzKTsKKyAgICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoaXQpKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIE1lcmdlSm9icyhjb25zdCBTZWdtZW50Sm9iKiBjb25zdCBzcmMsIFNlZ21lbnRKb2IqIGNvbnN0IGRzdCkgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8PSBNQVhfQUxQSEE7ICsraSkgZHN0LT5hbHBoYXNbaV0gKz0gc3JjLT5hbHBoYXNbaV07CisgIGRzdC0+YWxwaGEgKz0gc3JjLT5hbHBoYTsKKyAgZHN0LT51dl9hbHBoYSArPSBzcmMtPnV2X2FscGhhOworfQorCisvLyBpbml0aWFsaXplIHRoZSBqb2Igc3RydWN0IHdpdGggc29tZSBUT0RPcworc3RhdGljIHZvaWQgSW5pdFNlZ21lbnRKb2IoVlA4RW5jb2RlciogY29uc3QgZW5jLCBTZWdtZW50Sm9iKiBjb25zdCBqb2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfcm93LCBpbnQgZW5kX3JvdykgeworICBXZWJQR2V0V29ya2VySW50ZXJmYWNlKCktPkluaXQoJmpvYi0+d29ya2VyKTsKKyAgam9iLT53b3JrZXIuZGF0YTEgPSBqb2I7CisgIGpvYi0+d29ya2VyLmRhdGEyID0gJmpvYi0+aXQ7CisgIGpvYi0+d29ya2VyLmhvb2sgPSBEb1NlZ21lbnRzSm9iOworICBWUDhJdGVyYXRvckluaXQoZW5jLCAmam9iLT5pdCk7CisgIFZQOEl0ZXJhdG9yU2V0Um93KCZqb2ItPml0LCBzdGFydF9yb3cpOworICBWUDhJdGVyYXRvclNldENvdW50RG93bigmam9iLT5pdCwgKGVuZF9yb3cgLSBzdGFydF9yb3cpICogZW5jLT5tYl93Xyk7CisgIG1lbXNldChqb2ItPmFscGhhcywgMCwgc2l6ZW9mKGpvYi0+YWxwaGFzKSk7CisgIGpvYi0+YWxwaGEgPSAwOworICBqb2ItPnV2X2FscGhhID0gMDsKKyAgLy8gb25seSBvbmUgb2YgYm90aCBqb2JzIGNhbiByZWNvcmQgdGhlIHByb2dyZXNzLCBzaW5jZSB3ZSBkb24ndAorICAvLyBleHBlY3QgdGhlIHVzZXIncyBob29rIHRvIGJlIG11bHRpLXRocmVhZCBzYWZlCisgIGpvYi0+ZGVsdGFfcHJvZ3Jlc3MgPSAoc3RhcnRfcm93ID09IDApID8gMjAgOiAwOworfQorCisvLyBtYWluIGVudHJ5IHBvaW50CiBpbnQgVlA4RW5jQW5hbHl6ZShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKICAgaW50IG9rID0gMTsKICAgY29uc3QgaW50IGRvX3NlZ21lbnRzID0KICAgICAgIGVuYy0+Y29uZmlnXy0+ZW11bGF0ZV9qcGVnX3NpemUgfHwgICAvLyBXZSBuZWVkIHRoZSBjb21wbGV4aXR5IGV2YWx1YXRpb24uCiAgICAgICAoZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA+IDEpIHx8Ci0gICAgICAoZW5jLT5tZXRob2RfID09IDApOyAgLy8gZm9yIG1ldGhvZCAwLCB3ZSBuZWVkIHByZWRzX1tdIHRvIGJlIGZpbGxlZC4KLSAgZW5jLT5hbHBoYV8gPSAwOwotICBlbmMtPnV2X2FscGhhXyA9IDA7CisgICAgICAoZW5jLT5tZXRob2RfIDw9IDEpOyAgLy8gZm9yIG1ldGhvZCAwIC0gMSwgd2UgbmVlZCBwcmVkc19bXSB0byBiZSBmaWxsZWQuCiAgIGlmIChkb19zZWdtZW50cykgewotICAgIGludCBhbHBoYXNbTUFYX0FMUEhBICsgMV0gPSB7IDAgfTsKLSAgICBWUDhFbmNJdGVyYXRvciBpdDsKLQotICAgIFZQOEl0ZXJhdG9ySW5pdChlbmMsICZpdCk7Ci0gICAgZG8gewotICAgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0KTsKLSAgICAgIE1CQW5hbHl6ZSgmaXQsIGFscGhhcywgJmVuYy0+YWxwaGFfLCAmZW5jLT51dl9hbHBoYV8pOwotICAgICAgb2sgPSBWUDhJdGVyYXRvclByb2dyZXNzKCZpdCwgMjApOwotICAgICAgLy8gTGV0J3MgcHJldGVuZCB3ZSBoYXZlIHBlcmZlY3QgbG9zc2xlc3MgcmVjb25zdHJ1Y3Rpb24uCi0gICAgfSB3aGlsZSAob2sgJiYgVlA4SXRlcmF0b3JOZXh0KCZpdCwgaXQueXV2X2luXykpOwotICAgIGVuYy0+YWxwaGFfIC89IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwotICAgIGVuYy0+dXZfYWxwaGFfIC89IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOwotICAgIGlmIChvaykgQXNzaWduU2VnbWVudHMoZW5jLCBhbHBoYXMpOworICAgIGNvbnN0IGludCBsYXN0X3JvdyA9IGVuYy0+bWJfaF87CisgICAgLy8gV2UgZ2l2ZSBhIGxpdHRsZSBtb3JlIHRoYW4gYSBoYWxmIHdvcmsgdG8gdGhlIG1haW4gdGhyZWFkLgorICAgIGNvbnN0IGludCBzcGxpdF9yb3cgPSAoOSAqIGxhc3Rfcm93ICsgMTUpID4+IDQ7CisgICAgY29uc3QgaW50IHRvdGFsX21iID0gbGFzdF9yb3cgKiBlbmMtPm1iX3dfOworI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAorICAgIGNvbnN0IGludCBrTWluU3BsaXRSb3cgPSAyOyAgLy8gbWluaW1hbCByb3dzIG5lZWRlZCBmb3IgbXQgdG8gYmUgd29ydGggaXQKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAoZW5jLT50aHJlYWRfbGV2ZWxfID4gMCkgJiYgKHNwbGl0X3JvdyA+PSBrTWluU3BsaXRSb3cpOworI2Vsc2UKKyAgICBjb25zdCBpbnQgZG9fbXQgPSAwOworI2VuZGlmCisgICAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd29ya2VyX2ludGVyZmFjZSA9CisgICAgICAgIFdlYlBHZXRXb3JrZXJJbnRlcmZhY2UoKTsKKyAgICBTZWdtZW50Sm9iIG1haW5fam9iOworICAgIGlmIChkb19tdCkgeworICAgICAgU2VnbWVudEpvYiBzaWRlX2pvYjsKKyAgICAgIC8vIE5vdGUgdGhlIHVzZSBvZiAnJicgaW5zdGVhZCBvZiAnJiYnIGJlY2F1c2Ugd2UgbXVzdCBjYWxsIHRoZSBmdW5jdGlvbnMKKyAgICAgIC8vIG5vIG1hdHRlciB3aGF0LgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIHNwbGl0X3Jvdyk7CisgICAgICBJbml0U2VnbWVudEpvYihlbmMsICZzaWRlX2pvYiwgc3BsaXRfcm93LCBsYXN0X3Jvdyk7CisgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGNhbGwgUmVzZXQoKSBvbiBtYWluX2pvYi53b3JrZXIsIHNpbmNlIHdlJ3JlIGNhbGxpbmcKKyAgICAgIC8vIFdlYlBXb3JrZXJFeGVjdXRlKCkgb24gaXQKKyAgICAgIG9rICY9IHdvcmtlcl9pbnRlcmZhY2UtPlJlc2V0KCZzaWRlX2pvYi53b3JrZXIpOworICAgICAgLy8gbGF1bmNoIHRoZSB0d28gam9icyBpbiBwYXJhbGxlbAorICAgICAgaWYgKG9rKSB7CisgICAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkxhdW5jaCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgd29ya2VyX2ludGVyZmFjZS0+RXhlY3V0ZSgmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgICAgb2sgJj0gd29ya2VyX2ludGVyZmFjZS0+U3luYygmbWFpbl9qb2Iud29ya2VyKTsKKyAgICAgIH0KKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkVuZCgmc2lkZV9qb2Iud29ya2VyKTsKKyAgICAgIGlmIChvaykgTWVyZ2VKb2JzKCZzaWRlX2pvYiwgJm1haW5fam9iKTsgIC8vIG1lcmdlIHJlc3VsdHMgdG9nZXRoZXIKKyAgICB9IGVsc2UgeworICAgICAgLy8gRXZlbiBmb3Igc2luZ2xlLXRocmVhZCBjYXNlLCB3ZSB1c2UgdGhlIGdlbmVyaWMgV29ya2VyIHRvb2xzLgorICAgICAgSW5pdFNlZ21lbnRKb2IoZW5jLCAmbWFpbl9qb2IsIDAsIGxhc3Rfcm93KTsKKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkV4ZWN1dGUoJm1haW5fam9iLndvcmtlcik7CisgICAgICBvayAmPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZtYWluX2pvYi53b3JrZXIpOworICAgIH0KKyAgICB3b3JrZXJfaW50ZXJmYWNlLT5FbmQoJm1haW5fam9iLndvcmtlcik7CisgICAgaWYgKG9rKSB7CisgICAgICBlbmMtPmFscGhhXyA9IG1haW5fam9iLmFscGhhIC8gdG90YWxfbWI7CisgICAgICBlbmMtPnV2X2FscGhhXyA9IG1haW5fam9iLnV2X2FscGhhIC8gdG90YWxfbWI7CisgICAgICBBc3NpZ25TZWdtZW50cyhlbmMsIG1haW5fam9iLmFscGhhcyk7CisgICAgfQogICB9IGVsc2UgeyAgIC8vIFVzZSBvbmx5IG9uZSBkZWZhdWx0IHNlZ21lbnQuCiAgICAgUmVzZXRBbGxNQkluZm8oZW5jKTsKICAgfQogICByZXR1cm4gb2s7CiB9CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfY29zdF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc1NDk2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2Nvc3RfZW5jLmMKQEAgLTAsMCArMSw3OTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbXByb3ZlcyBhIGdpdmVuIHNldCBvZiBiYWNrd2FyZCByZWZlcmVuY2VzIGJ5IGFuYWx5emluZyBpdHMgYml0IGNvc3QuCisvLyBUaGUgYWxnb3JpdGhtIGlzIHNpbWlsYXIgdG8gdGhlIFpvcGZsaSBjb21wcmVzc2lvbiBhbGdvcml0aG0gYnV0IHRhaWxvcmVkIHRvCisvLyBpbWFnZXMuCisvLworLy8gQXV0aG9yOiBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSAic3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgVkFMVUVTX0lOX0JZVEUgMjU2CisKK2V4dGVybiB2b2lkIFZQOExDbGVhckJhY2t3YXJkUmVmcyhWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKTsKK2V4dGVybiBpbnQgVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUoaW50IHhzaXplLCBpbnQgZGlzdCk7CitleHRlcm4gdm9pZCBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpeE9yQ29weSB2KTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBkb3VibGUgYWxwaGFfW1ZBTFVFU19JTl9CWVRFXTsKKyAgZG91YmxlIHJlZF9bVkFMVUVTX0lOX0JZVEVdOworICBkb3VibGUgYmx1ZV9bVkFMVUVTX0lOX0JZVEVdOworICBkb3VibGUgZGlzdGFuY2VfW05VTV9ESVNUQU5DRV9DT0RFU107CisgIGRvdWJsZSogbGl0ZXJhbF87Cit9IENvc3RNb2RlbDsKKworc3RhdGljIHZvaWQgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCisgICAgaW50IG51bV9zeW1ib2xzLCBjb25zdCB1aW50MzJfdCBwb3B1bGF0aW9uX2NvdW50c1tdLCBkb3VibGUgb3V0cHV0W10pIHsKKyAgdWludDMyX3Qgc3VtID0gMDsKKyAgaW50IG5vbnplcm9zID0gMDsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fc3ltYm9sczsgKytpKSB7CisgICAgc3VtICs9IHBvcHVsYXRpb25fY291bnRzW2ldOworICAgIGlmIChwb3B1bGF0aW9uX2NvdW50c1tpXSA+IDApIHsKKyAgICAgICsrbm9uemVyb3M7CisgICAgfQorICB9CisgIGlmIChub256ZXJvcyA8PSAxKSB7CisgICAgbWVtc2V0KG91dHB1dCwgMCwgbnVtX3N5bWJvbHMgKiBzaXplb2YoKm91dHB1dCkpOworICB9IGVsc2UgeworICAgIGNvbnN0IGRvdWJsZSBsb2dzdW0gPSBWUDhMRmFzdExvZzIoc3VtKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX3N5bWJvbHM7ICsraSkgeworICAgICAgb3V0cHV0W2ldID0gbG9nc3VtIC0gVlA4TEZhc3RMb2cyKHBvcHVsYXRpb25fY291bnRzW2ldKTsKKyAgICB9CisgIH0KK30KKworc3RhdGljIGludCBDb3N0TW9kZWxCdWlsZChDb3N0TW9kZWwqIGNvbnN0IG0sIGludCB4c2l6ZSwgaW50IGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgaW50IG9rID0gMDsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChyZWZzKTsKKyAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oY2FjaGVfYml0cyk7CisgIGlmIChoaXN0byA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIC8vIFRoZSBmb2xsb3dpbmcgY29kZSBpcyBzaW1pbGFyIHRvIFZQOExIaXN0b2dyYW1DcmVhdGUgYnV0IGNvbnZlcnRzIHRoZQorICAvLyBkaXN0YW5jZSB0byBwbGFuZSBjb2RlLgorICBWUDhMSGlzdG9ncmFtSW5pdChoaXN0bywgY2FjaGVfYml0cyk7CisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIFZQOExIaXN0b2dyYW1BZGRTaW5nbGVQaXhPckNvcHkoaGlzdG8sIGMuY3VyX3BvcywgVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4c2l6ZSk7CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorCisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGhpc3RvLT5wYWxldHRlX2NvZGVfYml0c18pLAorICAgICAgaGlzdG8tPmxpdGVyYWxfLCBtLT5saXRlcmFsXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLT5yZWRfLCBtLT5yZWRfKTsKKyAgQ29udmVydFBvcHVsYXRpb25Db3VudFRhYmxlVG9CaXRFc3RpbWF0ZXMoCisgICAgICBWQUxVRVNfSU5fQllURSwgaGlzdG8tPmJsdWVfLCBtLT5ibHVlXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgVkFMVUVTX0lOX0JZVEUsIGhpc3RvLT5hbHBoYV8sIG0tPmFscGhhXyk7CisgIENvbnZlcnRQb3B1bGF0aW9uQ291bnRUYWJsZVRvQml0RXN0aW1hdGVzKAorICAgICAgTlVNX0RJU1RBTkNFX0NPREVTLCBoaXN0by0+ZGlzdGFuY2VfLCBtLT5kaXN0YW5jZV8pOworICBvayA9IDE7CisKKyBFcnJvcjoKKyAgVlA4TEZyZWVIaXN0b2dyYW0oaGlzdG8pOworICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0TGl0ZXJhbENvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLCB1aW50MzJfdCB2KSB7CisgIHJldHVybiBtLT5hbHBoYV9bdiA+PiAyNF0gKworICAgICAgICAgbS0+cmVkX1sodiA+PiAxNikgJiAweGZmXSArCisgICAgICAgICBtLT5saXRlcmFsX1sodiA+PiA4KSAmIDB4ZmZdICsKKyAgICAgICAgIG0tPmJsdWVfW3YgJiAweGZmXTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGRvdWJsZSBHZXRDYWNoZUNvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLCB1aW50MzJfdCBpZHgpIHsKKyAgY29uc3QgaW50IGxpdGVyYWxfaWR4ID0gVkFMVUVTX0lOX0JZVEUgKyBOVU1fTEVOR1RIX0NPREVTICsgaWR4OworICByZXR1cm4gbS0+bGl0ZXJhbF9bbGl0ZXJhbF9pZHhdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEdldExlbmd0aENvc3QoY29uc3QgQ29zdE1vZGVsKiBjb25zdCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCkgeworICBpbnQgY29kZSwgZXh0cmFfYml0czsKKyAgVlA4TFByZWZpeEVuY29kZUJpdHMobGVuZ3RoLCAmY29kZSwgJmV4dHJhX2JpdHMpOworICByZXR1cm4gbS0+bGl0ZXJhbF9bVkFMVUVTX0lOX0JZVEUgKyBjb2RlXSArIGV4dHJhX2JpdHM7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0RGlzdGFuY2VDb3N0KGNvbnN0IENvc3RNb2RlbCogY29uc3QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRpc3RhbmNlKSB7CisgIGludCBjb2RlLCBleHRyYV9iaXRzOworICBWUDhMUHJlZml4RW5jb2RlQml0cyhkaXN0YW5jZSwgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgcmV0dXJuIG0tPmRpc3RhbmNlX1tjb2RlXSArIGV4dHJhX2JpdHM7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFkZFNpbmdsZUxpdGVyYWxXaXRoQ29zdE1vZGVsKAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBWUDhMQ29sb3JDYWNoZSogY29uc3QgaGFzaGVycywKKyAgICBjb25zdCBDb3N0TW9kZWwqIGNvbnN0IGNvc3RfbW9kZWwsIGludCBpZHgsIGludCB1c2VfY29sb3JfY2FjaGUsCisgICAgZmxvYXQgcHJldl9jb3N0LCBmbG9hdCogY29uc3QgY29zdCwgdWludDE2X3QqIGNvbnN0IGRpc3RfYXJyYXkpIHsKKyAgZG91YmxlIGNvc3RfdmFsID0gcHJldl9jb3N0OworICBjb25zdCB1aW50MzJfdCBjb2xvciA9IGFyZ2JbaWR4XTsKKyAgY29uc3QgaW50IGl4ID0gdXNlX2NvbG9yX2NhY2hlID8gVlA4TENvbG9yQ2FjaGVDb250YWlucyhoYXNoZXJzLCBjb2xvcikgOiAtMTsKKyAgaWYgKGl4ID49IDApIHsKKyAgICAvLyB1c2VfY29sb3JfY2FjaGUgaXMgdHJ1ZSBhbmQgaGFzaGVycyBjb250YWlucyBjb2xvcgorICAgIGNvbnN0IGRvdWJsZSBtdWwwID0gMC42ODsKKyAgICBjb3N0X3ZhbCArPSBHZXRDYWNoZUNvc3QoY29zdF9tb2RlbCwgaXgpICogbXVsMDsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBkb3VibGUgbXVsMSA9IDAuODI7CisgICAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgVlA4TENvbG9yQ2FjaGVJbnNlcnQoaGFzaGVycywgY29sb3IpOworICAgIGNvc3RfdmFsICs9IEdldExpdGVyYWxDb3N0KGNvc3RfbW9kZWwsIGNvbG9yKSAqIG11bDE7CisgIH0KKyAgaWYgKGNvc3RbaWR4XSA+IGNvc3RfdmFsKSB7CisgICAgY29zdFtpZHhdID0gKGZsb2F0KWNvc3RfdmFsOworICAgIGRpc3RfYXJyYXlbaWR4XSA9IDE7ICAvLyBvbmx5IG9uZSBpcyBpbnNlcnRlZC4KKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29zdE1hbmFnZXIgYW5kIGludGVydmFsIGhhbmRsaW5nCisKKy8vIEVtcGlyaWNhbCB2YWx1ZSB0byBhdm9pZCBoaWdoIG1lbW9yeSBjb25zdW1wdGlvbiBidXQgZ29vZCBmb3IgcGVyZm9ybWFuY2UuCisjZGVmaW5lIENPU1RfQ0FDSEVfSU5URVJWQUxfU0laRV9NQVggNTAwCisKKy8vIFRvIHBlcmZvcm0gYmFja3dhcmQgcmVmZXJlbmNlIGV2ZXJ5IHBpeGVsIGF0IGluZGV4IGluZGV4XyBpcyBjb25zaWRlcmVkIGFuZAorLy8gdGhlIGNvc3QgZm9yIHRoZSBNQVhfTEVOR1RIIGZvbGxvd2luZyBwaXhlbHMgY29tcHV0ZWQuIFRob3NlIGZvbGxvd2luZyBwaXhlbHMKKy8vIGF0IGluZGV4IGluZGV4XyArIGsgKGsgZnJvbSAwIHRvIE1BWF9MRU5HVEgpIGhhdmUgYSBjb3N0IG9mOgorLy8gICAgIGNvc3RfID0gZGlzdGFuY2UgY29zdCBhdCBpbmRleCArIEdldExlbmd0aENvc3QoY29zdF9tb2RlbCwgaykKKy8vIGFuZCB0aGUgbWluaW11bSB2YWx1ZSBpcyBrZXB0LiBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspIGlzIGNhY2hlZCBpbiBhbgorLy8gYXJyYXkgb2Ygc2l6ZSBNQVhfTEVOR1RILgorLy8gSW5zdGVhZCBvZiBwZXJmb3JtaW5nIE1BWF9MRU5HVEggY29tcGFyaXNvbnMgcGVyIHBpeGVsLCB3ZSBrZWVwIHRyYWNrIG9mIHRoZQorLy8gbWluaW1hbCB2YWx1ZXMgdXNpbmcgaW50ZXJ2YWxzIG9mIGNvbnN0YW50IGNvc3QuCisvLyBBbiBpbnRlcnZhbCBpcyBkZWZpbmVkIGJ5IHRoZSBpbmRleF8gb2YgdGhlIHBpeGVsIHRoYXQgZ2VuZXJhdGVkIGl0IGFuZAorLy8gaXMgb25seSB1c2VmdWwgaW4gYSByYW5nZSBvZiBpbmRpY2VzIGZyb20gc3RhcnRfIHRvIGVuZF8gKGV4Y2x1c2l2ZSksIGkuZS4KKy8vIGl0IGNvbnRhaW5zIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBwaXhlbHMgYmV0d2VlbiBzdGFydF8gYW5kIGVuZF8uCisvLyBJbnRlcnZhbHMgYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IGFuZCBvcmRlcmVkIGJ5IHN0YXJ0Xy4gV2hlbiBhIG5ldworLy8gaW50ZXJ2YWwgaGFzIGEgYmV0dGVyIHZhbHVlLCBvbGQgaW50ZXJ2YWxzIGFyZSBzcGxpdCBvciByZW1vdmVkLiBUaGVyZSBhcmUKKy8vIHRoZXJlZm9yZSBubyBvdmVybGFwcGluZyBpbnRlcnZhbHMuCit0eXBlZGVmIHN0cnVjdCBDb3N0SW50ZXJ2YWwgQ29zdEludGVydmFsOworc3RydWN0IENvc3RJbnRlcnZhbCB7CisgIGZsb2F0IGNvc3RfOworICBpbnQgc3RhcnRfOworICBpbnQgZW5kXzsKKyAgaW50IGluZGV4XzsKKyAgQ29zdEludGVydmFsKiBwcmV2aW91c187CisgIENvc3RJbnRlcnZhbCogbmV4dF87Cit9OworCisvLyBUaGUgR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCBrKSBhcmUgY2FjaGVkIGluIGEgQ29zdENhY2hlSW50ZXJ2YWwuCit0eXBlZGVmIHN0cnVjdCB7CisgIGRvdWJsZSBjb3N0XzsKKyAgaW50IHN0YXJ0XzsKKyAgaW50IGVuZF87ICAgICAgIC8vIEV4Y2x1c2l2ZS4KK30gQ29zdENhY2hlSW50ZXJ2YWw7CisKKy8vIFRoaXMgc3RydWN0dXJlIGlzIGluIGNoYXJnZSBvZiBtYW5hZ2luZyBpbnRlcnZhbHMgYW5kIGNvc3RzLgorLy8gSXQgY2FjaGVzIHRoZSBkaWZmZXJlbnQgQ29zdENhY2hlSW50ZXJ2YWwsIGNhY2hlcyB0aGUgZGlmZmVyZW50CisvLyBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspIGluIGNvc3RfY2FjaGVfIGFuZCB0aGUgQ29zdEludGVydmFsJ3MgKHdob3NlCisvLyBjb3VudF8gaXMgbGltaXRlZCBieSBDT1NUX0NBQ0hFX0lOVEVSVkFMX1NJWkVfTUFYKS4KKyNkZWZpbmUgQ09TVF9NQU5BR0VSX01BWF9GUkVFX0xJU1QgMTAKK3R5cGVkZWYgc3RydWN0IHsKKyAgQ29zdEludGVydmFsKiBoZWFkXzsKKyAgaW50IGNvdW50XzsgIC8vIFRoZSBudW1iZXIgb2Ygc3RvcmVkIGludGVydmFscy4KKyAgQ29zdENhY2hlSW50ZXJ2YWwqIGNhY2hlX2ludGVydmFsc187CisgIHNpemVfdCBjYWNoZV9pbnRlcnZhbHNfc2l6ZV87CisgIGRvdWJsZSBjb3N0X2NhY2hlX1tNQVhfTEVOR1RIXTsgIC8vIENvbnRhaW5zIHRoZSBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGspLgorICBmbG9hdCogY29zdHNfOworICB1aW50MTZfdCogZGlzdF9hcnJheV87CisgIC8vIE1vc3Qgb2YgdGhlIHRpbWUsIHdlIG9ubHkgbmVlZCBmZXcgaW50ZXJ2YWxzIC0+IHVzZSBhIGZyZWUtbGlzdCwgdG8gYXZvaWQKKyAgLy8gZnJhZ21lbnRhdGlvbiB3aXRoIHNtYWxsIGFsbG9jcyBpbiBtb3N0IGNvbW1vbiBjYXNlcy4KKyAgQ29zdEludGVydmFsIGludGVydmFsc19bQ09TVF9NQU5BR0VSX01BWF9GUkVFX0xJU1RdOworICBDb3N0SW50ZXJ2YWwqIGZyZWVfaW50ZXJ2YWxzXzsKKyAgLy8gVGhlc2UgYXJlIHJlZ3VsYXJseSBtYWxsb2MnZCByZW1haW5zLiBUaGlzIGxpc3QgY2FuJ3QgZ3JvdyBsYXJnZXIgdGhhbiB0aGFuCisgIC8vIHNpemUgQ09TVF9DQUNIRV9JTlRFUlZBTF9TSVpFX01BWCAtIENPU1RfTUFOQUdFUl9NQVhfRlJFRV9MSVNULCBub3RlLgorICBDb3N0SW50ZXJ2YWwqIHJlY3ljbGVkX2ludGVydmFsc187Cit9IENvc3RNYW5hZ2VyOworCitzdGF0aWMgdm9pZCBDb3N0SW50ZXJ2YWxBZGRUb0ZyZWVMaXN0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IGludGVydmFsKSB7CisgIGludGVydmFsLT5uZXh0XyA9IG1hbmFnZXItPmZyZWVfaW50ZXJ2YWxzXzsKKyAgbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfID0gaW50ZXJ2YWw7Cit9CisKK3N0YXRpYyBpbnQgQ29zdEludGVydmFsSXNJbkZyZWVMaXN0KGNvbnN0IENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29zdEludGVydmFsKiBjb25zdCBpbnRlcnZhbCkgeworICByZXR1cm4gKGludGVydmFsID49ICZtYW5hZ2VyLT5pbnRlcnZhbHNfWzBdICYmCisgICAgICAgICAgaW50ZXJ2YWwgPD0gJm1hbmFnZXItPmludGVydmFsc19bQ09TVF9NQU5BR0VSX01BWF9GUkVFX0xJU1QgLSAxXSk7Cit9CisKK3N0YXRpYyB2b2lkIENvc3RNYW5hZ2VySW5pdEZyZWVMaXN0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyKSB7CisgIGludCBpOworICBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc18gPSBOVUxMOworICBmb3IgKGkgPSAwOyBpIDwgQ09TVF9NQU5BR0VSX01BWF9GUkVFX0xJU1Q7ICsraSkgeworICAgIENvc3RJbnRlcnZhbEFkZFRvRnJlZUxpc3QobWFuYWdlciwgJm1hbmFnZXItPmludGVydmFsc19baV0pOworICB9Cit9CisKK3N0YXRpYyB2b2lkIERlbGV0ZUludGVydmFsTGlzdChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb3N0SW50ZXJ2YWwqIGludGVydmFsKSB7CisgIHdoaWxlIChpbnRlcnZhbCAhPSBOVUxMKSB7CisgICAgY29uc3QgQ29zdEludGVydmFsKiBjb25zdCBuZXh0ID0gaW50ZXJ2YWwtPm5leHRfOworICAgIGlmICghQ29zdEludGVydmFsSXNJbkZyZWVMaXN0KG1hbmFnZXIsIGludGVydmFsKSkgeworICAgICAgV2ViUFNhZmVGcmVlKCh2b2lkKilpbnRlcnZhbCk7CisgICAgfSAgLy8gZWxzZTogZG8gbm90aGluZworICAgIGludGVydmFsID0gbmV4dDsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDb3N0TWFuYWdlckNsZWFyKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyKSB7CisgIGlmIChtYW5hZ2VyID09IE5VTEwpIHJldHVybjsKKworICBXZWJQU2FmZUZyZWUobWFuYWdlci0+Y29zdHNfKTsKKyAgV2ViUFNhZmVGcmVlKG1hbmFnZXItPmNhY2hlX2ludGVydmFsc18pOworCisgIC8vIENsZWFyIHRoZSBpbnRlcnZhbCBsaXN0cy4KKyAgRGVsZXRlSW50ZXJ2YWxMaXN0KG1hbmFnZXIsIG1hbmFnZXItPmhlYWRfKTsKKyAgbWFuYWdlci0+aGVhZF8gPSBOVUxMOworICBEZWxldGVJbnRlcnZhbExpc3QobWFuYWdlciwgbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyk7CisgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBOVUxMOworCisgIC8vIFJlc2V0IHBvaW50ZXJzLCBjb3VudF8gYW5kIGNhY2hlX2ludGVydmFsc19zaXplXy4KKyAgbWVtc2V0KG1hbmFnZXIsIDAsIHNpemVvZigqbWFuYWdlcikpOworICBDb3N0TWFuYWdlckluaXRGcmVlTGlzdChtYW5hZ2VyKTsKK30KKworc3RhdGljIGludCBDb3N0TWFuYWdlckluaXQoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY29uc3QgZGlzdF9hcnJheSwgaW50IHBpeF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvc3RNb2RlbCogY29uc3QgY29zdF9tb2RlbCkgeworICBpbnQgaTsKKyAgY29uc3QgaW50IGNvc3RfY2FjaGVfc2l6ZSA9IChwaXhfY291bnQgPiBNQVhfTEVOR1RIKSA/IE1BWF9MRU5HVEggOiBwaXhfY291bnQ7CisKKyAgbWFuYWdlci0+Y29zdHNfID0gTlVMTDsKKyAgbWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzXyA9IE5VTEw7CisgIG1hbmFnZXItPmhlYWRfID0gTlVMTDsKKyAgbWFuYWdlci0+cmVjeWNsZWRfaW50ZXJ2YWxzXyA9IE5VTEw7CisgIG1hbmFnZXItPmNvdW50XyA9IDA7CisgIG1hbmFnZXItPmRpc3RfYXJyYXlfID0gZGlzdF9hcnJheTsKKyAgQ29zdE1hbmFnZXJJbml0RnJlZUxpc3QobWFuYWdlcik7CisKKyAgLy8gRmlsbCBpbiB0aGUgY29zdF9jYWNoZV8uCisgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXyA9IDE7CisgIG1hbmFnZXItPmNvc3RfY2FjaGVfWzBdID0gR2V0TGVuZ3RoQ29zdChjb3N0X21vZGVsLCAwKTsKKyAgZm9yIChpID0gMTsgaSA8IGNvc3RfY2FjaGVfc2l6ZTsgKytpKSB7CisgICAgbWFuYWdlci0+Y29zdF9jYWNoZV9baV0gPSBHZXRMZW5ndGhDb3N0KGNvc3RfbW9kZWwsIGkpOworICAgIC8vIEdldCB0aGUgbnVtYmVyIG9mIGJvdW5kIGludGVydmFscy4KKyAgICBpZiAobWFuYWdlci0+Y29zdF9jYWNoZV9baV0gIT0gbWFuYWdlci0+Y29zdF9jYWNoZV9baSAtIDFdKSB7CisgICAgICArK21hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXzsKKyAgICB9CisgIH0KKworICAvLyBXaXRoIHRoZSBjdXJyZW50IGNvc3QgbW9kZWwsIHdlIHVzdWFsbHkgaGF2ZSBiZWxvdyAyMCBpbnRlcnZhbHMuCisgIC8vIFRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIHdpdGggYSBjb3N0IG1vZGVsIHdvdWxkIGJlIGlmIGV2ZXJ5IGxlbmd0aCBoYXMgYQorICAvLyBkaWZmZXJlbnQgY29zdCwgaGVuY2UgTUFYX0xFTkdUSCBidXQgdGhhdCBpcyBpbXBvc3NpYmxlIHdpdGggdGhlIGN1cnJlbnQKKyAgLy8gaW1wbGVtZW50YXRpb24gdGhhdCBzcGlyYWxzIGFyb3VuZCBhIHBpeGVsLgorICBhc3NlcnQobWFuYWdlci0+Y2FjaGVfaW50ZXJ2YWxzX3NpemVfIDw9IE1BWF9MRU5HVEgpOworICBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfID0gKENvc3RDYWNoZUludGVydmFsKilXZWJQU2FmZU1hbGxvYygKKyAgICAgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc19zaXplXywgc2l6ZW9mKCptYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfKSk7CisgIGlmIChtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfID09IE5VTEwpIHsKKyAgICBDb3N0TWFuYWdlckNsZWFyKG1hbmFnZXIpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gRmlsbCBpbiB0aGUgY2FjaGVfaW50ZXJ2YWxzXy4KKyAgeworICAgIENvc3RDYWNoZUludGVydmFsKiBjdXIgPSBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfOworCisgICAgLy8gQ29uc2VjdXRpdmUgdmFsdWVzIGluIGNvc3RfY2FjaGVfIGFyZSBjb21wYXJlZCBhbmQgaWYgYSBiaWcgZW5vdWdoCisgICAgLy8gZGlmZmVyZW5jZSBpcyBmb3VuZCwgYSBuZXcgaW50ZXJ2YWwgaXMgY3JlYXRlZCBhbmQgYm91bmRlZC4KKyAgICBjdXItPnN0YXJ0XyA9IDA7CisgICAgY3VyLT5lbmRfID0gMTsKKyAgICBjdXItPmNvc3RfID0gbWFuYWdlci0+Y29zdF9jYWNoZV9bMF07CisgICAgZm9yIChpID0gMTsgaSA8IGNvc3RfY2FjaGVfc2l6ZTsgKytpKSB7CisgICAgICBjb25zdCBkb3VibGUgY29zdF92YWwgPSBtYW5hZ2VyLT5jb3N0X2NhY2hlX1tpXTsKKyAgICAgIGlmIChjb3N0X3ZhbCAhPSBjdXItPmNvc3RfKSB7CisgICAgICAgICsrY3VyOworICAgICAgICAvLyBJbml0aWFsaXplIGFuIGludGVydmFsLgorICAgICAgICBjdXItPnN0YXJ0XyA9IGk7CisgICAgICAgIGN1ci0+Y29zdF8gPSBjb3N0X3ZhbDsKKyAgICAgIH0KKyAgICAgIGN1ci0+ZW5kXyA9IGkgKyAxOworICAgIH0KKyAgfQorCisgIG1hbmFnZXItPmNvc3RzXyA9IChmbG9hdCopV2ViUFNhZmVNYWxsb2MocGl4X2NvdW50LCBzaXplb2YoKm1hbmFnZXItPmNvc3RzXykpOworICBpZiAobWFuYWdlci0+Y29zdHNfID09IE5VTEwpIHsKKyAgICBDb3N0TWFuYWdlckNsZWFyKG1hbmFnZXIpOworICAgIHJldHVybiAwOworICB9CisgIC8vIFNldCB0aGUgaW5pdGlhbCBjb3N0c18gaGlnaCBmb3IgZXZlcnkgcGl4ZWwgYXMgd2Ugd2lsbCBrZWVwIHRoZSBtaW5pbXVtLgorICBmb3IgKGkgPSAwOyBpIDwgcGl4X2NvdW50OyArK2kpIG1hbmFnZXItPmNvc3RzX1tpXSA9IDFlMzhmOworCisgIHJldHVybiAxOworfQorCisvLyBHaXZlbiB0aGUgY29zdCBhbmQgdGhlIHBvc2l0aW9uIHRoYXQgZGVmaW5lIGFuIGludGVydmFsLCB1cGRhdGUgdGhlIGNvc3QgYXQKKy8vIHBpeGVsICdpJyBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIHByZXZpb3VzbHkgY29tcHV0ZWQgdmFsdWUuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBVcGRhdGVDb3N0KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLCBpbnQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uLCBmbG9hdCBjb3N0KSB7CisgIGNvbnN0IGludCBrID0gaSAtIHBvc2l0aW9uOworICBhc3NlcnQoayA+PSAwICYmIGsgPCBNQVhfTEVOR1RIKTsKKworICBpZiAobWFuYWdlci0+Y29zdHNfW2ldID4gY29zdCkgeworICAgIG1hbmFnZXItPmNvc3RzX1tpXSA9IGNvc3Q7CisgICAgbWFuYWdlci0+ZGlzdF9hcnJheV9baV0gPSBrICsgMTsKKyAgfQorfQorCisvLyBHaXZlbiB0aGUgY29zdCBhbmQgdGhlIHBvc2l0aW9uIHRoYXQgZGVmaW5lIGFuIGludGVydmFsLCB1cGRhdGUgdGhlIGNvc3QgZm9yCisvLyBhbGwgdGhlIHBpeGVscyBiZXR3ZWVuICdzdGFydCcgYW5kICdlbmQnIGV4Y2x1ZGVkLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlQ29zdFBlckludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydCwgaW50IGVuZCwgaW50IHBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGNvc3QpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIFVwZGF0ZUNvc3QobWFuYWdlciwgaSwgcG9zaXRpb24sIGNvc3QpOworfQorCisvLyBHaXZlbiB0d28gaW50ZXJ2YWxzLCBtYWtlICdwcmV2JyBiZSB0aGUgcHJldmlvdXMgb25lIG9mICduZXh0JyBpbiAnbWFuYWdlcicuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb25uZWN0SW50ZXJ2YWxzKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3N0SW50ZXJ2YWwqIGNvbnN0IHByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgbmV4dCkgeworICBpZiAocHJldiAhPSBOVUxMKSB7CisgICAgcHJldi0+bmV4dF8gPSBuZXh0OworICB9IGVsc2UgeworICAgIG1hbmFnZXItPmhlYWRfID0gbmV4dDsKKyAgfQorCisgIGlmIChuZXh0ICE9IE5VTEwpIG5leHQtPnByZXZpb3VzXyA9IHByZXY7Cit9CisKKy8vIFBvcCBhbiBpbnRlcnZhbCBpbiB0aGUgbWFuYWdlci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBvcEludGVydmFsKENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBjb25zdCBpbnRlcnZhbCkgeworICBpZiAoaW50ZXJ2YWwgPT0gTlVMTCkgcmV0dXJuOworCisgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgaW50ZXJ2YWwtPnByZXZpb3VzXywgaW50ZXJ2YWwtPm5leHRfKTsKKyAgaWYgKENvc3RJbnRlcnZhbElzSW5GcmVlTGlzdChtYW5hZ2VyLCBpbnRlcnZhbCkpIHsKKyAgICBDb3N0SW50ZXJ2YWxBZGRUb0ZyZWVMaXN0KG1hbmFnZXIsIGludGVydmFsKTsKKyAgfSBlbHNlIHsgIC8vIHJlY3ljbGUgcmVndWxhcmx5IG1hbGxvYydkIGludGVydmFscyB0b28KKyAgICBpbnRlcnZhbC0+bmV4dF8gPSBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfOworICAgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBpbnRlcnZhbDsKKyAgfQorICAtLW1hbmFnZXItPmNvdW50XzsKKyAgYXNzZXJ0KG1hbmFnZXItPmNvdW50XyA+PSAwKTsKK30KKworLy8gVXBkYXRlIHRoZSBjb3N0IGF0IGluZGV4IGkgYnkgZ29pbmcgb3ZlciBhbGwgdGhlIHN0b3JlZCBpbnRlcnZhbHMgdGhhdAorLy8gb3ZlcmxhcCB3aXRoIGkuCisvLyBJZiAnZG9fY2xlYW5faW50ZXJ2YWxzJyBpcyBzZXQgdG8gc29tZXRoaW5nIGRpZmZlcmVudCB0aGFuIDAsIGludGVydmFscyB0aGF0CisvLyBlbmQgYmVmb3JlICdpJyB3aWxsIGJlIHBvcHBlZC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFVwZGF0ZUNvc3RBdEluZGV4KENvc3RNYW5hZ2VyKiBjb25zdCBtYW5hZ2VyLCBpbnQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb19jbGVhbl9pbnRlcnZhbHMpIHsKKyAgQ29zdEludGVydmFsKiBjdXJyZW50ID0gbWFuYWdlci0+aGVhZF87CisKKyAgd2hpbGUgKGN1cnJlbnQgIT0gTlVMTCAmJiBjdXJyZW50LT5zdGFydF8gPD0gaSkgeworICAgIENvc3RJbnRlcnZhbCogY29uc3QgbmV4dCA9IGN1cnJlbnQtPm5leHRfOworICAgIGlmIChjdXJyZW50LT5lbmRfIDw9IGkpIHsKKyAgICAgIGlmIChkb19jbGVhbl9pbnRlcnZhbHMpIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBvdXRkYXRlZCBpbnRlcnZhbCwgcmVtb3ZlIGl0LgorICAgICAgICBQb3BJbnRlcnZhbChtYW5hZ2VyLCBjdXJyZW50KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgVXBkYXRlQ29zdChtYW5hZ2VyLCBpLCBjdXJyZW50LT5pbmRleF8sIGN1cnJlbnQtPmNvc3RfKTsKKyAgICB9CisgICAgY3VycmVudCA9IG5leHQ7CisgIH0KK30KKworLy8gR2l2ZW4gYSBjdXJyZW50IG9ycGhhbiBpbnRlcnZhbCBhbmQgaXRzIHByZXZpb3VzIGludGVydmFsLCBiZWZvcmUKKy8vIGl0IHdhcyBvcnBoYW5lZCAod2hpY2ggY2FuIGJlIE5VTEwpLCBzZXQgaXQgYXQgdGhlIHJpZ2h0IHBsYWNlIGluIHRoZSBsaXN0CisvLyBvZiBpbnRlcnZhbHMgdXNpbmcgdGhlIHN0YXJ0XyBvcmRlcmluZyBhbmQgdGhlIHByZXZpb3VzIGludGVydmFsIGFzIGEgaGludC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFBvc2l0aW9uT3JwaGFuSW50ZXJ2YWwoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29zdEludGVydmFsKiBwcmV2aW91cykgeworICBhc3NlcnQoY3VycmVudCAhPSBOVUxMKTsKKworICBpZiAocHJldmlvdXMgPT0gTlVMTCkgcHJldmlvdXMgPSBtYW5hZ2VyLT5oZWFkXzsKKyAgd2hpbGUgKHByZXZpb3VzICE9IE5VTEwgJiYgY3VycmVudC0+c3RhcnRfIDwgcHJldmlvdXMtPnN0YXJ0XykgeworICAgIHByZXZpb3VzID0gcHJldmlvdXMtPnByZXZpb3VzXzsKKyAgfQorICB3aGlsZSAocHJldmlvdXMgIT0gTlVMTCAmJiBwcmV2aW91cy0+bmV4dF8gIT0gTlVMTCAmJgorICAgICAgICAgcHJldmlvdXMtPm5leHRfLT5zdGFydF8gPCBjdXJyZW50LT5zdGFydF8pIHsKKyAgICBwcmV2aW91cyA9IHByZXZpb3VzLT5uZXh0XzsKKyAgfQorCisgIGlmIChwcmV2aW91cyAhPSBOVUxMKSB7CisgICAgQ29ubmVjdEludGVydmFscyhtYW5hZ2VyLCBjdXJyZW50LCBwcmV2aW91cy0+bmV4dF8pOworICB9IGVsc2UgeworICAgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgY3VycmVudCwgbWFuYWdlci0+aGVhZF8pOworICB9CisgIENvbm5lY3RJbnRlcnZhbHMobWFuYWdlciwgcHJldmlvdXMsIGN1cnJlbnQpOworfQorCisvLyBJbnNlcnQgYW4gaW50ZXJ2YWwgaW4gdGhlIGxpc3QgY29udGFpbmVkIGluIHRoZSBtYW5hZ2VyIGJ5IHN0YXJ0aW5nIGF0CisvLyBpbnRlcnZhbF9pbiBhcyBhIGhpbnQuIFRoZSBpbnRlcnZhbHMgYXJlIHNvcnRlZCBieSBzdGFydF8gdmFsdWUuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBJbnNlcnRJbnRlcnZhbChDb3N0TWFuYWdlciogY29uc3QgbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvc3RJbnRlcnZhbCogY29uc3QgaW50ZXJ2YWxfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjb3N0LCBpbnQgcG9zaXRpb24sIGludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmQpIHsKKyAgQ29zdEludGVydmFsKiBpbnRlcnZhbF9uZXc7CisKKyAgaWYgKHN0YXJ0ID49IGVuZCkgcmV0dXJuOworICBpZiAobWFuYWdlci0+Y291bnRfID49IENPU1RfQ0FDSEVfSU5URVJWQUxfU0laRV9NQVgpIHsKKyAgICAvLyBTZXJpYWxpemUgdGhlIGludGVydmFsIGlmIHdlIGNhbm5vdCBzdG9yZSBpdC4KKyAgICBVcGRhdGVDb3N0UGVySW50ZXJ2YWwobWFuYWdlciwgc3RhcnQsIGVuZCwgcG9zaXRpb24sIGNvc3QpOworICAgIHJldHVybjsKKyAgfQorICBpZiAobWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfICE9IE5VTEwpIHsKKyAgICBpbnRlcnZhbF9uZXcgPSBtYW5hZ2VyLT5mcmVlX2ludGVydmFsc187CisgICAgbWFuYWdlci0+ZnJlZV9pbnRlcnZhbHNfID0gaW50ZXJ2YWxfbmV3LT5uZXh0XzsKKyAgfSBlbHNlIGlmIChtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfICE9IE5VTEwpIHsKKyAgICBpbnRlcnZhbF9uZXcgPSBtYW5hZ2VyLT5yZWN5Y2xlZF9pbnRlcnZhbHNfOworICAgIG1hbmFnZXItPnJlY3ljbGVkX2ludGVydmFsc18gPSBpbnRlcnZhbF9uZXctPm5leHRfOworICB9IGVsc2UgeyAgLy8gbWFsbG9jIGZvciBnb29kCisgICAgaW50ZXJ2YWxfbmV3ID0gKENvc3RJbnRlcnZhbCopV2ViUFNhZmVNYWxsb2MoMSwgc2l6ZW9mKCppbnRlcnZhbF9uZXcpKTsKKyAgICBpZiAoaW50ZXJ2YWxfbmV3ID09IE5VTEwpIHsKKyAgICAgIC8vIFdyaXRlIGRvd24gdGhlIGludGVydmFsIGlmIHdlIGNhbm5vdCBjcmVhdGUgaXQuCisgICAgICBVcGRhdGVDb3N0UGVySW50ZXJ2YWwobWFuYWdlciwgc3RhcnQsIGVuZCwgcG9zaXRpb24sIGNvc3QpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIGludGVydmFsX25ldy0+Y29zdF8gPSBjb3N0OworICBpbnRlcnZhbF9uZXctPmluZGV4XyA9IHBvc2l0aW9uOworICBpbnRlcnZhbF9uZXctPnN0YXJ0XyA9IHN0YXJ0OworICBpbnRlcnZhbF9uZXctPmVuZF8gPSBlbmQ7CisgIFBvc2l0aW9uT3JwaGFuSW50ZXJ2YWwobWFuYWdlciwgaW50ZXJ2YWxfbmV3LCBpbnRlcnZhbF9pbik7CisKKyAgKyttYW5hZ2VyLT5jb3VudF87Cit9CisKKy8vIEdpdmVuIGEgbmV3IGNvc3QgaW50ZXJ2YWwgZGVmaW5lZCBieSBpdHMgc3RhcnQgYXQgcG9zaXRpb24sIGl0cyBsZW5ndGggdmFsdWUKKy8vIGFuZCBkaXN0YW5jZV9jb3N0LCBhZGQgaXRzIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHByZXZpb3VzIGludGVydmFscyBhbmQgY29zdHMuCisvLyBJZiBoYW5kbGluZyB0aGUgaW50ZXJ2YWwgb3Igb25lIG9mIGl0cyBzdWJpbnRlcnZhbHMgYmVjb21lcyB0byBoZWF2eSwgaXRzCisvLyBjb250cmlidXRpb24gaXMgYWRkZWQgdG8gdGhlIGNvc3RzIHJpZ2h0IGF3YXkuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXNoSW50ZXJ2YWwoQ29zdE1hbmFnZXIqIGNvbnN0IG1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlX2Nvc3QsIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuKSB7CisgIHNpemVfdCBpOworICBDb3N0SW50ZXJ2YWwqIGludGVydmFsID0gbWFuYWdlci0+aGVhZF87CisgIENvc3RJbnRlcnZhbCogaW50ZXJ2YWxfbmV4dDsKKyAgY29uc3QgQ29zdENhY2hlSW50ZXJ2YWwqIGNvbnN0IGNvc3RfY2FjaGVfaW50ZXJ2YWxzID0KKyAgICAgIG1hbmFnZXItPmNhY2hlX2ludGVydmFsc187CisgIC8vIElmIHRoZSBpbnRlcnZhbCBpcyBzbWFsbCBlbm91Z2gsIG5vIG5lZWQgdG8gZGVhbCB3aXRoIHRoZSBoZWF2eQorICAvLyBpbnRlcnZhbCBsb2dpYywganVzdCBzZXJpYWxpemUgaXQgcmlnaHQgYXdheS4gVGhpcyBjb25zdGFudCBpcyBlbXBpcmljYWwuCisgIGNvbnN0IGludCBrU2tpcERpc3RhbmNlID0gMTA7CisKKyAgaWYgKGxlbiA8IGtTa2lwRGlzdGFuY2UpIHsKKyAgICBpbnQgajsKKyAgICBmb3IgKGogPSBwb3NpdGlvbjsgaiA8IHBvc2l0aW9uICsgbGVuOyArK2opIHsKKyAgICAgIGNvbnN0IGludCBrID0gaiAtIHBvc2l0aW9uOworICAgICAgZmxvYXQgY29zdF90bXA7CisgICAgICBhc3NlcnQoayA+PSAwICYmIGsgPCBNQVhfTEVOR1RIKTsKKyAgICAgIGNvc3RfdG1wID0gKGZsb2F0KShkaXN0YW5jZV9jb3N0ICsgbWFuYWdlci0+Y29zdF9jYWNoZV9ba10pOworCisgICAgICBpZiAobWFuYWdlci0+Y29zdHNfW2pdID4gY29zdF90bXApIHsKKyAgICAgICAgbWFuYWdlci0+Y29zdHNfW2pdID0gY29zdF90bXA7CisgICAgICAgIG1hbmFnZXItPmRpc3RfYXJyYXlfW2pdID0gayArIDE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPCBtYW5hZ2VyLT5jYWNoZV9pbnRlcnZhbHNfc2l6ZV8gJiYKKyAgICAgICAgICAgICAgY29zdF9jYWNoZV9pbnRlcnZhbHNbaV0uc3RhcnRfIDwgbGVuOworICAgICAgICsraSkgeworICAgIC8vIERlZmluZSB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBpdGggaW50ZXJ2YWwgd2l0aCB0aGUgbmV3IG9uZS4KKyAgICBpbnQgc3RhcnQgPSBwb3NpdGlvbiArIGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLnN0YXJ0XzsKKyAgICBjb25zdCBpbnQgZW5kID0gcG9zaXRpb24gKyAoY29zdF9jYWNoZV9pbnRlcnZhbHNbaV0uZW5kXyA+IGxlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBsZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29zdF9jYWNoZV9pbnRlcnZhbHNbaV0uZW5kXyk7CisgICAgY29uc3QgZmxvYXQgY29zdCA9IChmbG9hdCkoZGlzdGFuY2VfY29zdCArIGNvc3RfY2FjaGVfaW50ZXJ2YWxzW2ldLmNvc3RfKTsKKworICAgIGZvciAoOyBpbnRlcnZhbCAhPSBOVUxMICYmIGludGVydmFsLT5zdGFydF8gPCBlbmQ7CisgICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsX25leHQpIHsKKyAgICAgIGludGVydmFsX25leHQgPSBpbnRlcnZhbC0+bmV4dF87CisKKyAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIHNvbWUgb3ZlcmxhcAorICAgICAgaWYgKHN0YXJ0ID49IGludGVydmFsLT5lbmRfKSBjb250aW51ZTsKKworICAgICAgaWYgKGNvc3QgPj0gaW50ZXJ2YWwtPmNvc3RfKSB7CisgICAgICAgIC8vIFdoZW4gaW50ZXJ2YWxzIGFyZSByZXByZXNlbnRlZCwgdGhlIGxvd2VyLCB0aGUgYmV0dGVyLgorICAgICAgICAvLyBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlsKKyAgICAgICAgLy8gc3RhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tWworICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgIC8vIElmIHdlIGFyZSB3b3JzZSB0aGFuIHdoYXQgd2UgYWxyZWFkeSBoYXZlLCBhZGQgd2hhdGV2ZXIgd2UgaGF2ZSBzbworICAgICAgICAvLyBmYXIgdXAgdG8gaW50ZXJ2YWwuCisgICAgICAgIGNvbnN0IGludCBzdGFydF9uZXcgPSBpbnRlcnZhbC0+ZW5kXzsKKyAgICAgICAgSW5zZXJ0SW50ZXJ2YWwobWFuYWdlciwgaW50ZXJ2YWwsIGNvc3QsIHBvc2l0aW9uLCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0Xyk7CisgICAgICAgIHN0YXJ0ID0gc3RhcnRfbmV3OworICAgICAgICBpZiAoc3RhcnQgPj0gZW5kKSBicmVhazsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGlmIChzdGFydCA8PSBpbnRlcnZhbC0+c3RhcnRfKSB7CisgICAgICAgIGlmIChpbnRlcnZhbC0+ZW5kXyA8PSBlbmQpIHsKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBbLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICBpbnRlcnZhbC0+c3RhcnRfICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gWyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqWworICAgICAgICAgIC8vIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICAvLyBXZSBjYW4gc2FmZWx5IHJlbW92ZSB0aGUgb2xkIGludGVydmFsIGFzIGl0IGlzIGZ1bGx5IGluY2x1ZGVkLgorICAgICAgICAgIFBvcEludGVydmFsKG1hbmFnZXIsIGludGVydmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgWy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICAgaW50ZXJ2YWwtPmVuZF8KKyAgICAgICAgICAvLyBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgICAgLy8gc3RhcnQgICAgICAgICAgICAgICAgICAgICAgIGVuZAorICAgICAgICAgIGludGVydmFsLT5zdGFydF8gPSBlbmQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChlbmQgPCBpbnRlcnZhbC0+ZW5kXykgeworICAgICAgICAgIC8vIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVsKKyAgICAgICAgICAvLyBpbnRlcnZhbC0+c3RhcnRfICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLT5lbmRfCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBbKioqKioqKioqKioqKioqKioqKioqKioqKioqKipbCisgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdGFydCAgICAgICAgICAgICAgICAgICAgICAgZW5kCisgICAgICAgICAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGUgb2xkIGludGVydmFsIGFzIGl0IGZ1bGx5IGNvbnRhaW5zIHRoZSBuZXcgb25lLgorICAgICAgICAgIGNvbnN0IGludCBlbmRfb3JpZ2luYWwgPSBpbnRlcnZhbC0+ZW5kXzsKKyAgICAgICAgICBpbnRlcnZhbC0+ZW5kXyA9IHN0YXJ0OworICAgICAgICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBpbnRlcnZhbC0+Y29zdF8sIGludGVydmFsLT5pbmRleF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgZW5kLCBlbmRfb3JpZ2luYWwpOworICAgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwtPm5leHRfOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bCisgICAgICAgICAgLy8gaW50ZXJ2YWwtPnN0YXJ0XyAgICAgICAgaW50ZXJ2YWwtPmVuZF8KKyAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIFsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlsKKyAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ICAgICAgICAgICAgICAgICAgICAgICBlbmQKKyAgICAgICAgICBpbnRlcnZhbC0+ZW5kXyA9IHN0YXJ0OworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIEluc2VydCB0aGUgcmVtYWluaW5nIGludGVydmFsIGZyb20gc3RhcnQgdG8gZW5kLgorICAgIEluc2VydEludGVydmFsKG1hbmFnZXIsIGludGVydmFsLCBjb3N0LCBwb3NpdGlvbiwgc3RhcnQsIGVuZCk7CisgIH0KK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNIYXNoQ2hhaW5EaXN0YW5jZU9ubHkoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgIHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5KSB7CisgIGludCBpOworICBpbnQgb2sgPSAwOworICBpbnQgY2NfaW5pdCA9IDA7CisgIGNvbnN0IGludCBwaXhfY291bnQgPSB4c2l6ZSAqIHlzaXplOworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgY29uc3Qgc2l6ZV90IGxpdGVyYWxfYXJyYXlfc2l6ZSA9CisgICAgICBzaXplb2YoZG91YmxlKSAqIChOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMgKworICAgICAgICAgICAgICAgICAgICAgICAgKChjYWNoZV9iaXRzID4gMCkgPyAoMSA8PCBjYWNoZV9iaXRzKSA6IDApKTsKKyAgY29uc3Qgc2l6ZV90IGNvc3RfbW9kZWxfc2l6ZSA9IHNpemVvZihDb3N0TW9kZWwpICsgbGl0ZXJhbF9hcnJheV9zaXplOworICBDb3N0TW9kZWwqIGNvbnN0IGNvc3RfbW9kZWwgPQorICAgICAgKENvc3RNb2RlbCopV2ViUFNhZmVDYWxsb2MoMVVMTCwgY29zdF9tb2RlbF9zaXplKTsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKyAgQ29zdE1hbmFnZXIqIGNvc3RfbWFuYWdlciA9CisgICAgICAoQ29zdE1hbmFnZXIqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemVvZigqY29zdF9tYW5hZ2VyKSk7CisgIGludCBvZmZzZXRfcHJldiA9IC0xLCBsZW5fcHJldiA9IC0xOworICBkb3VibGUgb2Zmc2V0X2Nvc3QgPSAtMTsKKyAgaW50IGZpcnN0X29mZnNldF9pc19jb25zdGFudCA9IC0xOyAgLy8gaW5pdGlhbGl6ZWQgd2l0aCAnaW1wb3NzaWJsZScgdmFsdWUKKyAgaW50IHJlYWNoID0gMDsKKworICBpZiAoY29zdF9tb2RlbCA9PSBOVUxMIHx8IGNvc3RfbWFuYWdlciA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGNvc3RfbW9kZWwtPmxpdGVyYWxfID0gKGRvdWJsZSopKGNvc3RfbW9kZWwgKyAxKTsKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghQ29zdE1vZGVsQnVpbGQoY29zdF9tb2RlbCwgeHNpemUsIGNhY2hlX2JpdHMsIHJlZnMpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICghQ29zdE1hbmFnZXJJbml0KGNvc3RfbWFuYWdlciwgZGlzdF9hcnJheSwgcGl4X2NvdW50LCBjb3N0X21vZGVsKSkgeworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBXZSBsb29wIG9uZSBwaXhlbCBhdCBhIHRpbWUsIGJ1dCBzdG9yZSBhbGwgY3VycmVudGx5IGJlc3QgcG9pbnRzIHRvCisgIC8vIG5vbi1wcm9jZXNzZWQgbG9jYXRpb25zIGZyb20gdGhpcyBwb2ludC4KKyAgZGlzdF9hcnJheVswXSA9IDA7CisgIC8vIEFkZCBmaXJzdCBwaXhlbCBhcyBsaXRlcmFsLgorICBBZGRTaW5nbGVMaXRlcmFsV2l0aENvc3RNb2RlbChhcmdiLCAmaGFzaGVycywgY29zdF9tb2RlbCwgMCwgdXNlX2NvbG9yX2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLmYsIGNvc3RfbWFuYWdlci0+Y29zdHNfLCBkaXN0X2FycmF5KTsKKworICBmb3IgKGkgPSAxOyBpIDwgcGl4X2NvdW50OyArK2kpIHsKKyAgICBjb25zdCBmbG9hdCBwcmV2X2Nvc3QgPSBjb3N0X21hbmFnZXItPmNvc3RzX1tpIC0gMV07CisgICAgaW50IG9mZnNldCwgbGVuOworICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBpLCAmb2Zmc2V0LCAmbGVuKTsKKworICAgIC8vIFRyeSBhZGRpbmcgdGhlIHBpeGVsIGFzIGEgbGl0ZXJhbC4KKyAgICBBZGRTaW5nbGVMaXRlcmFsV2l0aENvc3RNb2RlbChhcmdiLCAmaGFzaGVycywgY29zdF9tb2RlbCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VfY29sb3JfY2FjaGUsIHByZXZfY29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0X21hbmFnZXItPmNvc3RzXywgZGlzdF9hcnJheSk7CisKKyAgICAvLyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgbm9uLWxpdGVyYWwuCisgICAgaWYgKGxlbiA+PSAyKSB7CisgICAgICBpZiAob2Zmc2V0ICE9IG9mZnNldF9wcmV2KSB7CisgICAgICAgIGNvbnN0IGludCBjb2RlID0gVlA4TERpc3RhbmNlVG9QbGFuZUNvZGUoeHNpemUsIG9mZnNldCk7CisgICAgICAgIG9mZnNldF9jb3N0ID0gR2V0RGlzdGFuY2VDb3N0KGNvc3RfbW9kZWwsIGNvZGUpOworICAgICAgICBmaXJzdF9vZmZzZXRfaXNfY29uc3RhbnQgPSAxOworICAgICAgICBQdXNoSW50ZXJ2YWwoY29zdF9tYW5hZ2VyLCBwcmV2X2Nvc3QgKyBvZmZzZXRfY29zdCwgaSwgbGVuKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFzc2VydChvZmZzZXRfY29zdCA+PSAwKTsKKyAgICAgICAgYXNzZXJ0KGxlbl9wcmV2ID49IDApOworICAgICAgICBhc3NlcnQoZmlyc3Rfb2Zmc2V0X2lzX2NvbnN0YW50ID09IDAgfHwgZmlyc3Rfb2Zmc2V0X2lzX2NvbnN0YW50ID09IDEpOworICAgICAgICAvLyBJbnN0ZWFkIG9mIGNvbnNpZGVyaW5nIGFsbCBjb250cmlidXRpb25zIGZyb20gYSBwaXhlbCBpIGJ5IGNhbGxpbmc6CisgICAgICAgIC8vICAgICAgICAgUHVzaEludGVydmFsKGNvc3RfbWFuYWdlciwgcHJldl9jb3N0ICsgb2Zmc2V0X2Nvc3QsIGksIGxlbik7CisgICAgICAgIC8vIHdlIG9wdGltaXplIHRoZXNlIGNvbnRyaWJ1dGlvbnMgaW4gY2FzZSBvZmZzZXRfY29zdCBzdGF5cyB0aGUgc2FtZQorICAgICAgICAvLyBmb3IgY29uc2VjdXRpdmUgcGl4ZWxzLiBUaGlzIGRlc2NyaWJlcyBhIHNldCBvZiBwaXhlbHMgc2ltaWxhciB0byBhCisgICAgICAgIC8vIHByZXZpb3VzIHNldCAoZS5nLiBjb25zdGFudCBjb2xvciByZWdpb25zKS4KKyAgICAgICAgaWYgKGZpcnN0X29mZnNldF9pc19jb25zdGFudCkgeworICAgICAgICAgIHJlYWNoID0gaSAtIDEgKyBsZW5fcHJldiAtIDE7CisgICAgICAgICAgZmlyc3Rfb2Zmc2V0X2lzX2NvbnN0YW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpICsgbGVuIC0gMSA+IHJlYWNoKSB7CisgICAgICAgICAgLy8gV2UgY2FuIG9ubHkgYmUgZ28gZnVydGhlciB3aXRoIHRoZSBzYW1lIG9mZnNldCBpZiB0aGUgcHJldmlvdXMKKyAgICAgICAgICAvLyBsZW5ndGggd2FzIG1heGVkLCBoZW5jZSBsZW5fcHJldiA9PSBsZW4gPT0gTUFYX0xFTkdUSC4KKyAgICAgICAgICAvLyBUT0RPKHZyYWJhdWQpLCBidW1wIGkgdG8gdGhlIGVuZCByaWdodCBhd2F5IChpbnNlcnQgY2FjaGUgYW5kCisgICAgICAgICAgLy8gdXBkYXRlIGNvc3QpLgorICAgICAgICAgIC8vIFRPRE8odnJhYmF1ZCksIGNoZWNrIGlmIG9uZSBvZiB0aGUgcG9pbnRzIGluIGJldHdlZW4gZG9lcyBub3QgaGF2ZQorICAgICAgICAgIC8vIGEgbG93ZXIgY29zdC4KKyAgICAgICAgICAvLyBBbHJlYWR5IGNvbnNpZGVyIHRoZSBwaXhlbCBhdCAicmVhY2giIHRvIGFkZCBpbnRlcnZhbHMgdGhhdCBhcmUKKyAgICAgICAgICAvLyBiZXR0ZXIgdGhhbiB3aGF0ZXZlciB3ZSBhZGQuCisgICAgICAgICAgaW50IG9mZnNldF9qLCBsZW5faiA9IDA7CisgICAgICAgICAgaW50IGo7CisgICAgICAgICAgYXNzZXJ0KGxlbiA9PSBNQVhfTEVOR1RIIHx8IGxlbiA9PSBwaXhfY291bnQgLSBpKTsKKyAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBsYXN0IGNvbnNlY3V0aXZlIHBpeGVsIHdpdGhpbiBbaSwgcmVhY2ggKyAxXSB3aXRoCisgICAgICAgICAgLy8gdGhlIHNhbWUgb2Zmc2V0LgorICAgICAgICAgIGZvciAoaiA9IGk7IGogPD0gcmVhY2g7ICsraikgeworICAgICAgICAgICAgVlA4TEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGogKyAxLCAmb2Zmc2V0X2osICZsZW5faik7CisgICAgICAgICAgICBpZiAob2Zmc2V0X2ogIT0gb2Zmc2V0KSB7CisgICAgICAgICAgICAgIFZQOExIYXNoQ2hhaW5GaW5kQ29weShoYXNoX2NoYWluLCBqLCAmb2Zmc2V0X2osICZsZW5faik7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvc3QgYXQgaiAtIDEgYW5kIGouCisgICAgICAgICAgVXBkYXRlQ29zdEF0SW5kZXgoY29zdF9tYW5hZ2VyLCBqIC0gMSwgMCk7CisgICAgICAgICAgVXBkYXRlQ29zdEF0SW5kZXgoY29zdF9tYW5hZ2VyLCBqLCAwKTsKKworICAgICAgICAgIFB1c2hJbnRlcnZhbChjb3N0X21hbmFnZXIsIGNvc3RfbWFuYWdlci0+Y29zdHNfW2ogLSAxXSArIG9mZnNldF9jb3N0LAorICAgICAgICAgICAgICAgICAgICAgICBqLCBsZW5faik7CisgICAgICAgICAgcmVhY2ggPSBqICsgbGVuX2ogLSAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgVXBkYXRlQ29zdEF0SW5kZXgoY29zdF9tYW5hZ2VyLCBpLCAxKTsKKyAgICBvZmZzZXRfcHJldiA9IG9mZnNldDsKKyAgICBsZW5fcHJldiA9IGxlbjsKKyAgfQorCisgIG9rID0gIXJlZnMtPmVycm9yXzsKK0Vycm9yOgorICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7CisgIENvc3RNYW5hZ2VyQ2xlYXIoY29zdF9tYW5hZ2VyKTsKKyAgV2ViUFNhZmVGcmVlKGNvc3RfbW9kZWwpOworICBXZWJQU2FmZUZyZWUoY29zdF9tYW5hZ2VyKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyBXZSBwYWNrIHRoZSBwYXRoIGF0IHRoZSBlbmQgb2YgKmRpc3RfYXJyYXkgYW5kIHJldHVybgorLy8gYSBwb2ludGVyIHRvIHRoaXMgcGFydCBvZiB0aGUgYXJyYXkuIEV4YW1wbGU6CisvLyBkaXN0X2FycmF5ID0gWzF4Mnh4M3gyXSA9PiBwYWNrZWQgWzF4MngxMjMyXSwgY2hvc2VuX3BhdGggPSBbMTIzMl0KK3N0YXRpYyB2b2lkIFRyYWNlQmFja3dhcmRzKHVpbnQxNl90KiBjb25zdCBkaXN0X2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RfYXJyYXlfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90KiogY29uc3QgY2hvc2VuX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGNob3Nlbl9wYXRoX3NpemUpIHsKKyAgdWludDE2X3QqIHBhdGggPSBkaXN0X2FycmF5ICsgZGlzdF9hcnJheV9zaXplOworICB1aW50MTZfdCogY3VyID0gZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIDE7CisgIHdoaWxlIChjdXIgPj0gZGlzdF9hcnJheSkgeworICAgIGNvbnN0IGludCBrID0gKmN1cjsKKyAgICAtLXBhdGg7CisgICAgKnBhdGggPSBrOworICAgIGN1ciAtPSBrOworICB9CisgICpjaG9zZW5fcGF0aCA9IHBhdGg7CisgICpjaG9zZW5fcGF0aF9zaXplID0gKGludCkoZGlzdF9hcnJheSArIGRpc3RfYXJyYXlfc2l6ZSAtIHBhdGgpOworfQorCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGgoCisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBjYWNoZV9iaXRzLAorICAgIGNvbnN0IHVpbnQxNl90KiBjb25zdCBjaG9zZW5fcGF0aCwgaW50IGNob3Nlbl9wYXRoX3NpemUsCisgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgaW50IGl4OworICBpbnQgaSA9IDA7CisgIGludCBvayA9IDA7CisgIGludCBjY19pbml0ID0gMDsKKyAgVlA4TENvbG9yQ2FjaGUgaGFzaGVyczsKKworICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgY2NfaW5pdCA9IFZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cyk7CisgICAgaWYgKCFjY19pbml0KSBnb3RvIEVycm9yOworICB9CisKKyAgVlA4TENsZWFyQmFja3dhcmRSZWZzKHJlZnMpOworICBmb3IgKGl4ID0gMDsgaXggPCBjaG9zZW5fcGF0aF9zaXplOyArK2l4KSB7CisgICAgY29uc3QgaW50IGxlbiA9IGNob3Nlbl9wYXRoW2l4XTsKKyAgICBpZiAobGVuICE9IDEpIHsKKyAgICAgIGludCBrOworICAgICAgY29uc3QgaW50IG9mZnNldCA9IFZQOExIYXNoQ2hhaW5GaW5kT2Zmc2V0KGhhc2hfY2hhaW4sIGkpOworICAgICAgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KG9mZnNldCwgbGVuKSk7CisgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgICAgIGZvciAoayA9IDA7IGsgPCBsZW47ICsraykgeworICAgICAgICAgIFZQOExDb2xvckNhY2hlSW5zZXJ0KCZoYXNoZXJzLCBhcmdiW2kgKyBrXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGkgKz0gbGVuOworICAgIH0gZWxzZSB7CisgICAgICBQaXhPckNvcHkgdjsKKyAgICAgIGNvbnN0IGludCBpZHggPQorICAgICAgICAgIHVzZV9jb2xvcl9jYWNoZSA/IFZQOExDb2xvckNhY2hlQ29udGFpbnMoJmhhc2hlcnMsIGFyZ2JbaV0pIDogLTE7CisgICAgICBpZiAoaWR4ID49IDApIHsKKyAgICAgICAgLy8gdXNlX2NvbG9yX2NhY2hlIGlzIHRydWUgYW5kIGhhc2hlcnMgY29udGFpbnMgYXJnYltpXQorICAgICAgICAvLyBwdXNoIHBpeGVsIGFzIGEgY29sb3IgY2FjaGUgaW5kZXgKKyAgICAgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUNhY2hlSWR4KGlkeCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAodXNlX2NvbG9yX2NhY2hlKSBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltpXSk7CisgICAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVMaXRlcmFsKGFyZ2JbaV0pOworICAgICAgfQorICAgICAgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCB2KTsKKyAgICAgICsraTsKKyAgICB9CisgIH0KKyAgb2sgPSAhcmVmcy0+ZXJyb3JfOworIEVycm9yOgorICBpZiAoY2NfaW5pdCkgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7CisgIHJldHVybiBvazsKK30KKworLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCitleHRlcm4gaW50IFZQOExCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcygKKyAgICBpbnQgeHNpemUsIGludCB5c2l6ZSwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBjYWNoZV9iaXRzLAorICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc19zcmMsIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfZHN0KTsKK2ludCBWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfZHN0KSB7CisgIGludCBvayA9IDA7CisgIGNvbnN0IGludCBkaXN0X2FycmF5X3NpemUgPSB4c2l6ZSAqIHlzaXplOworICB1aW50MTZfdCogY2hvc2VuX3BhdGggPSBOVUxMOworICBpbnQgY2hvc2VuX3BhdGhfc2l6ZSA9IDA7CisgIHVpbnQxNl90KiBkaXN0X2FycmF5ID0KKyAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoZGlzdF9hcnJheV9zaXplLCBzaXplb2YoKmRpc3RfYXJyYXkpKTsKKworICBpZiAoZGlzdF9hcnJheSA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzSGFzaENoYWluRGlzdGFuY2VPbmx5KAorICAgICAgICAgIHhzaXplLCB5c2l6ZSwgYXJnYiwgY2FjaGVfYml0cywgaGFzaF9jaGFpbiwgcmVmc19zcmMsIGRpc3RfYXJyYXkpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBUcmFjZUJhY2t3YXJkcyhkaXN0X2FycmF5LCBkaXN0X2FycmF5X3NpemUsICZjaG9zZW5fcGF0aCwgJmNob3Nlbl9wYXRoX3NpemUpOworICBpZiAoIUJhY2t3YXJkUmVmZXJlbmNlc0hhc2hDaGFpbkZvbGxvd0Nob3NlblBhdGgoCisgICAgICAgICAgYXJnYiwgY2FjaGVfYml0cywgY2hvc2VuX3BhdGgsIGNob3Nlbl9wYXRoX3NpemUsIGhhc2hfY2hhaW4sCisgICAgICAgICAgcmVmc19kc3QpKSB7CisgICAgZ290byBFcnJvcjsKKyAgfQorICBvayA9IDE7CisgRXJyb3I6CisgIFdlYlBTYWZlRnJlZShkaXN0X2FycmF5KTsKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjMwMTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmMKQEAgLTAsMCArMSw5NDMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAic3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNkZWZpbmUgTUlOX0JMT0NLX1NJWkUgMjU2ICAvLyBtaW5pbXVtIGJsb2NrIHNpemUgZm9yIGJhY2t3YXJkIHJlZmVyZW5jZXMKKworI2RlZmluZSBNQVhfRU5UUk9QWSAgICAoMWUzMGYpCisKKy8vIDFNIHdpbmRvdyAoNE0gYnl0ZXMpIG1pbnVzIDEyMCBzcGVjaWFsIGNvZGVzIGZvciBzaG9ydCBkaXN0YW5jZXMuCisjZGVmaW5lIFdJTkRPV19TSVpFICgoMSA8PCBXSU5ET1dfU0laRV9CSVRTKSAtIDEyMCkKKworLy8gTWluaW11bSBudW1iZXIgb2YgcGl4ZWxzIGZvciB3aGljaCBpdCBpcyBjaGVhcGVyIHRvIGVuY29kZSBhCisvLyBkaXN0YW5jZSArIGxlbmd0aCBpbnN0ZWFkIG9mIGVhY2ggcGl4ZWwgYXMgYSBsaXRlcmFsLgorI2RlZmluZSBNSU5fTEVOR1RIIDQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgcGxhbmVfdG9fY29kZV9sdXRbMTI4XSA9IHsKKyA5NiwgICA3MywgIDU1LCAgMzksICAyMywgIDEzLCAgIDUsICAxLCAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgMTAxLCAgNzgsICA1OCwgIDQyLCAgMjYsICAxNiwgICA4LCAgMiwgICAgMCwgICAzLCAgOSwgICAxNywgIDI3LCAgNDMsICA1OSwgIDc5LAorIDEwMiwgIDg2LCAgNjIsICA0NiwgIDMyLCAgMjAsICAxMCwgIDYsICAgIDQsICAgNywgIDExLCAgMjEsICAzMywgIDQ3LCAgNjMsICA4NywKKyAxMDUsICA5MCwgIDcwLCAgNTIsICAzNywgIDI4LCAgMTgsICAxNCwgIDEyLCAgMTUsICAxOSwgIDI5LCAgMzgsICA1MywgIDcxLCAgOTEsCisgMTEwLCAgOTksICA4MiwgIDY2LCAgNDgsICAzNSwgIDMwLCAgMjQsICAyMiwgIDI1LCAgMzEsICAzNiwgIDQ5LCAgNjcsICA4MywgMTAwLAorIDExNSwgMTA4LCAgOTQsICA3NiwgIDY0LCAgNTAsICA0NCwgIDQwLCAgMzQsICA0MSwgIDQ1LCAgNTEsICA2NSwgIDc3LCAgOTUsIDEwOSwKKyAxMTgsIDExMywgMTAzLCAgOTIsICA4MCwgIDY4LCAgNjAsICA1NiwgIDU0LCAgNTcsICA2MSwgIDY5LCAgODEsICA5MywgMTA0LCAxMTQsCisgMTE5LCAxMTYsIDExMSwgMTA2LCAgOTcsICA4OCwgIDg0LCAgNzQsICA3MiwgIDc1LCAgODUsICA4OSwgIDk4LCAxMDcsIDExMiwgMTE3Cit9OworCitleHRlcm4gaW50IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKGludCB4c2l6ZSwgaW50IGRpc3QpOworaW50IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKGludCB4c2l6ZSwgaW50IGRpc3QpIHsKKyAgY29uc3QgaW50IHlvZmZzZXQgPSBkaXN0IC8geHNpemU7CisgIGNvbnN0IGludCB4b2Zmc2V0ID0gZGlzdCAtIHlvZmZzZXQgKiB4c2l6ZTsKKyAgaWYgKHhvZmZzZXQgPD0gOCAmJiB5b2Zmc2V0IDwgOCkgeworICAgIHJldHVybiBwbGFuZV90b19jb2RlX2x1dFt5b2Zmc2V0ICogMTYgKyA4IC0geG9mZnNldF0gKyAxOworICB9IGVsc2UgaWYgKHhvZmZzZXQgPiB4c2l6ZSAtIDggJiYgeW9mZnNldCA8IDcpIHsKKyAgICByZXR1cm4gcGxhbmVfdG9fY29kZV9sdXRbKHlvZmZzZXQgKyAxKSAqIDE2ICsgOCArICh4c2l6ZSAtIHhvZmZzZXQpXSArIDE7CisgIH0KKyAgcmV0dXJuIGRpc3QgKyAxMjA7Cit9CisKKy8vIFJldHVybnMgdGhlIGV4YWN0IGluZGV4IHdoZXJlIGFycmF5MSBhbmQgYXJyYXkyIGFyZSBkaWZmZXJlbnQuIEZvciBhbiBpbmRleAorLy8gaW5mZXJpb3Igb3IgZXF1YWwgdG8gYmVzdF9sZW5fbWF0Y2gsIHRoZSByZXR1cm4gdmFsdWUganVzdCBoYXMgdG8gYmUgc3RyaWN0bHkKKy8vIGluZmVyaW9yIHRvIGJlc3RfbGVuX21hdGNoLiBUaGUgY3VycmVudCBiZWhhdmlvciBpcyB0byByZXR1cm4gMCBpZiB0aGlzIGluZGV4CisvLyBpcyBiZXN0X2xlbl9tYXRjaCwgYW5kIHRoZSBpbmRleCBpdHNlbGYgb3RoZXJ3aXNlLgorLy8gSWYgbm8gdHdvIGVsZW1lbnRzIGFyZSB0aGUgc2FtZSwgaXQgcmV0dXJucyBtYXhfbGltaXQuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IEZpbmRNYXRjaExlbmd0aChjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFycmF5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiZXN0X2xlbl9tYXRjaCwgaW50IG1heF9saW1pdCkgeworICAvLyBCZWZvcmUgJ2V4cGVuc2l2ZScgbGluZWFyIG1hdGNoLCBjaGVjayBpZiB0aGUgdHdvIGFycmF5cyBtYXRjaCBhdCB0aGUKKyAgLy8gY3VycmVudCBiZXN0IGxlbmd0aCBpbmRleC4KKyAgaWYgKGFycmF5MVtiZXN0X2xlbl9tYXRjaF0gIT0gYXJyYXkyW2Jlc3RfbGVuX21hdGNoXSkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIFZQOExWZWN0b3JNaXNtYXRjaChhcnJheTEsIGFycmF5MiwgbWF4X2xpbWl0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBWUDhMQmFja3dhcmRSZWZzCisKK3N0cnVjdCBQaXhPckNvcHlCbG9jayB7CisgIFBpeE9yQ29weUJsb2NrKiBuZXh0XzsgICAvLyBuZXh0IGJsb2NrIChvciBOVUxMKQorICBQaXhPckNvcHkqIHN0YXJ0XzsgICAgICAgLy8gZGF0YSBzdGFydAorICBpbnQgc2l6ZV87ICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzZWQgc2l6ZQorfTsKKworZXh0ZXJuIHZvaWQgVlA4TENsZWFyQmFja3dhcmRSZWZzKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOwordm9pZCBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBhc3NlcnQocmVmcyAhPSBOVUxMKTsKKyAgaWYgKHJlZnMtPnRhaWxfICE9IE5VTEwpIHsKKyAgICAqcmVmcy0+dGFpbF8gPSByZWZzLT5mcmVlX2Jsb2Nrc187ICAvLyByZWN5Y2xlIGFsbCBibG9ja3MgYXQgb25jZQorICB9CisgIHJlZnMtPmZyZWVfYmxvY2tzXyA9IHJlZnMtPnJlZnNfOworICByZWZzLT50YWlsXyA9ICZyZWZzLT5yZWZzXzsKKyAgcmVmcy0+bGFzdF9ibG9ja18gPSBOVUxMOworICByZWZzLT5yZWZzXyA9IE5VTEw7Cit9CisKK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgYXNzZXJ0KHJlZnMgIT0gTlVMTCk7CisgIFZQOExDbGVhckJhY2t3YXJkUmVmcyhyZWZzKTsKKyAgd2hpbGUgKHJlZnMtPmZyZWVfYmxvY2tzXyAhPSBOVUxMKSB7CisgICAgUGl4T3JDb3B5QmxvY2sqIGNvbnN0IG5leHQgPSByZWZzLT5mcmVlX2Jsb2Nrc18tPm5leHRfOworICAgIFdlYlBTYWZlRnJlZShyZWZzLT5mcmVlX2Jsb2Nrc18pOworICAgIHJlZnMtPmZyZWVfYmxvY2tzXyA9IG5leHQ7CisgIH0KK30KKwordm9pZCBWUDhMQmFja3dhcmRSZWZzSW5pdChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLCBpbnQgYmxvY2tfc2l6ZSkgeworICBhc3NlcnQocmVmcyAhPSBOVUxMKTsKKyAgbWVtc2V0KHJlZnMsIDAsIHNpemVvZigqcmVmcykpOworICByZWZzLT50YWlsXyA9ICZyZWZzLT5yZWZzXzsKKyAgcmVmcy0+YmxvY2tfc2l6ZV8gPQorICAgICAgKGJsb2NrX3NpemUgPCBNSU5fQkxPQ0tfU0laRSkgPyBNSU5fQkxPQ0tfU0laRSA6IGJsb2NrX3NpemU7Cit9CisKK1ZQOExSZWZzQ3Vyc29yIFZQOExSZWZzQ3Vyc29ySW5pdChjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIFZQOExSZWZzQ3Vyc29yIGM7CisgIGMuY3VyX2Jsb2NrXyA9IHJlZnMtPnJlZnNfOworICBpZiAocmVmcy0+cmVmc18gIT0gTlVMTCkgeworICAgIGMuY3VyX3BvcyA9IGMuY3VyX2Jsb2NrXy0+c3RhcnRfOworICAgIGMubGFzdF9wb3NfID0gYy5jdXJfcG9zICsgYy5jdXJfYmxvY2tfLT5zaXplXzsKKyAgfSBlbHNlIHsKKyAgICBjLmN1cl9wb3MgPSBOVUxMOworICAgIGMubGFzdF9wb3NfID0gTlVMTDsKKyAgfQorICByZXR1cm4gYzsKK30KKwordm9pZCBWUDhMUmVmc0N1cnNvck5leHRCbG9jayhWUDhMUmVmc0N1cnNvciogY29uc3QgYykgeworICBQaXhPckNvcHlCbG9jayogY29uc3QgYiA9IGMtPmN1cl9ibG9ja18tPm5leHRfOworICBjLT5jdXJfcG9zID0gKGIgPT0gTlVMTCkgPyBOVUxMIDogYi0+c3RhcnRfOworICBjLT5sYXN0X3Bvc18gPSAoYiA9PSBOVUxMKSA/IE5VTEwgOiBiLT5zdGFydF8gKyBiLT5zaXplXzsKKyAgYy0+Y3VyX2Jsb2NrXyA9IGI7Cit9CisKKy8vIENyZWF0ZSBhIG5ldyBibG9jaywgZWl0aGVyIGZyb20gdGhlIGZyZWUgbGlzdCBvciBhbGxvY2F0ZWQKK3N0YXRpYyBQaXhPckNvcHlCbG9jayogQmFja3dhcmRSZWZzTmV3QmxvY2soVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBQaXhPckNvcHlCbG9jayogYiA9IHJlZnMtPmZyZWVfYmxvY2tzXzsKKyAgaWYgKGIgPT0gTlVMTCkgeyAgIC8vIGFsbG9jYXRlIG5ldyBtZW1vcnkgY2h1bmsKKyAgICBjb25zdCBzaXplX3QgdG90YWxfc2l6ZSA9CisgICAgICAgIHNpemVvZigqYikgKyByZWZzLT5ibG9ja19zaXplXyAqIHNpemVvZigqYi0+c3RhcnRfKTsKKyAgICBiID0gKFBpeE9yQ29weUJsb2NrKilXZWJQU2FmZU1hbGxvYygxVUxMLCB0b3RhbF9zaXplKTsKKyAgICBpZiAoYiA9PSBOVUxMKSB7CisgICAgICByZWZzLT5lcnJvcl8gfD0gMTsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBiLT5zdGFydF8gPSAoUGl4T3JDb3B5KikoKHVpbnQ4X3QqKWIgKyBzaXplb2YoKmIpKTsgIC8vIG5vdCBhbHdheXMgYWxpZ25lZAorICB9IGVsc2UgeyAgLy8gcmVjeWNsZSBmcm9tIGZyZWUtbGlzdAorICAgIHJlZnMtPmZyZWVfYmxvY2tzXyA9IGItPm5leHRfOworICB9CisgICpyZWZzLT50YWlsXyA9IGI7CisgIHJlZnMtPnRhaWxfID0gJmItPm5leHRfOworICByZWZzLT5sYXN0X2Jsb2NrXyA9IGI7CisgIGItPm5leHRfID0gTlVMTDsKKyAgYi0+c2l6ZV8gPSAwOworICByZXR1cm4gYjsKK30KKworZXh0ZXJuIHZvaWQgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkgdik7Cit2b2lkIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQoVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkgdikgeworICBQaXhPckNvcHlCbG9jayogYiA9IHJlZnMtPmxhc3RfYmxvY2tfOworICBpZiAoYiA9PSBOVUxMIHx8IGItPnNpemVfID09IHJlZnMtPmJsb2NrX3NpemVfKSB7CisgICAgYiA9IEJhY2t3YXJkUmVmc05ld0Jsb2NrKHJlZnMpOworICAgIGlmIChiID09IE5VTEwpIHJldHVybjsgICAvLyByZWZzLT5lcnJvcl8gaXMgc2V0CisgIH0KKyAgYi0+c3RhcnRfW2ItPnNpemVfKytdID0gdjsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhhc2ggY2hhaW5zCisKK2ludCBWUDhMSGFzaENoYWluSW5pdChWUDhMSGFzaENoYWluKiBjb25zdCBwLCBpbnQgc2l6ZSkgeworICBhc3NlcnQocC0+c2l6ZV8gPT0gMCk7CisgIGFzc2VydChwLT5vZmZzZXRfbGVuZ3RoXyA9PSBOVUxMKTsKKyAgYXNzZXJ0KHNpemUgPiAwKTsKKyAgcC0+b2Zmc2V0X2xlbmd0aF8gPQorICAgICAgKHVpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhzaXplLCBzaXplb2YoKnAtPm9mZnNldF9sZW5ndGhfKSk7CisgIGlmIChwLT5vZmZzZXRfbGVuZ3RoXyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcC0+c2l6ZV8gPSBzaXplOworCisgIHJldHVybiAxOworfQorCit2b2lkIFZQOExIYXNoQ2hhaW5DbGVhcihWUDhMSGFzaENoYWluKiBjb25zdCBwKSB7CisgIGFzc2VydChwICE9IE5VTEwpOworICBXZWJQU2FmZUZyZWUocC0+b2Zmc2V0X2xlbmd0aF8pOworCisgIHAtPnNpemVfID0gMDsKKyAgcC0+b2Zmc2V0X2xlbmd0aF8gPSBOVUxMOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEhBU0hfTVVMVElQTElFUl9ISSAoMHhjNmE0YTc5M1VMTCkKKyNkZWZpbmUgSEFTSF9NVUxUSVBMSUVSX0xPICgweDViZDFlOTk2VUxMKQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2V0UGl4UGFpckhhc2g2NChjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYikgeworICB1aW50MzJfdCBrZXk7CisgIGtleSAgPSAoYXJnYlsxXSAqIEhBU0hfTVVMVElQTElFUl9ISSkgJiAweGZmZmZmZmZmdTsKKyAga2V5ICs9IChhcmdiWzBdICogSEFTSF9NVUxUSVBMSUVSX0xPKSAmIDB4ZmZmZmZmZmZ1OworICBrZXkgPSBrZXkgPj4gKDMyIC0gSEFTSF9CSVRTKTsKKyAgcmV0dXJuIGtleTsKK30KKworLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgaGFzaCBjaGFpbiBsb29rdXBzIHRvIGRvIGZvciBhCisvLyBnaXZlbiBjb21wcmVzc2lvbiBxdWFsaXR5LiBSZXR1cm4gdmFsdWUgaW4gcmFuZ2UgWzgsIDg2XS4KK3N0YXRpYyBpbnQgR2V0TWF4SXRlcnNGb3JRdWFsaXR5KGludCBxdWFsaXR5KSB7CisgIHJldHVybiA4ICsgKHF1YWxpdHkgKiBxdWFsaXR5KSAvIDEyODsKK30KKworc3RhdGljIGludCBHZXRXaW5kb3dTaXplRm9ySGFzaENoYWluKGludCBxdWFsaXR5LCBpbnQgeHNpemUpIHsKKyAgY29uc3QgaW50IG1heF93aW5kb3dfc2l6ZSA9IChxdWFsaXR5ID4gNzUpID8gV0lORE9XX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChxdWFsaXR5ID4gNTApID8gKHhzaXplIDw8IDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocXVhbGl0eSA+IDI1KSA/ICh4c2l6ZSA8PCA2KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHhzaXplIDw8IDQpOworICBhc3NlcnQoeHNpemUgPiAwKTsKKyAgcmV0dXJuIChtYXhfd2luZG93X3NpemUgPiBXSU5ET1dfU0laRSkgPyBXSU5ET1dfU0laRSA6IG1heF93aW5kb3dfc2l6ZTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBNYXhGaW5kQ29weUxlbmd0aChpbnQgbGVuKSB7CisgIHJldHVybiAobGVuIDwgTUFYX0xFTkdUSCkgPyBsZW4gOiBNQVhfTEVOR1RIOworfQorCitpbnQgVlA4TEhhc2hDaGFpbkZpbGwoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBsb3dfZWZmb3J0KSB7CisgIGNvbnN0IGludCBzaXplID0geHNpemUgKiB5c2l6ZTsKKyAgY29uc3QgaW50IGl0ZXJfbWF4ID0gR2V0TWF4SXRlcnNGb3JRdWFsaXR5KHF1YWxpdHkpOworICBjb25zdCB1aW50MzJfdCB3aW5kb3dfc2l6ZSA9IEdldFdpbmRvd1NpemVGb3JIYXNoQ2hhaW4ocXVhbGl0eSwgeHNpemUpOworICBpbnQgcG9zOworICBpbnQgYXJnYl9jb21wOworICB1aW50MzJfdCBiYXNlX3Bvc2l0aW9uOworICBpbnQzMl90KiBoYXNoX3RvX2ZpcnN0X2luZGV4OworICAvLyBUZW1wb3JhcmlseSB1c2UgdGhlIHAtPm9mZnNldF9sZW5ndGhfIGFzIGEgaGFzaCBjaGFpbi4KKyAgaW50MzJfdCogY2hhaW4gPSAoaW50MzJfdCopcC0+b2Zmc2V0X2xlbmd0aF87CisgIGFzc2VydChzaXplID4gMCk7CisgIGFzc2VydChwLT5zaXplXyAhPSAwKTsKKyAgYXNzZXJ0KHAtPm9mZnNldF9sZW5ndGhfICE9IE5VTEwpOworCisgIGlmIChzaXplIDw9IDIpIHsKKyAgICBwLT5vZmZzZXRfbGVuZ3RoX1swXSA9IHAtPm9mZnNldF9sZW5ndGhfW3NpemUgLSAxXSA9IDA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBoYXNoX3RvX2ZpcnN0X2luZGV4ID0KKyAgICAgIChpbnQzMl90KilXZWJQU2FmZU1hbGxvYyhIQVNIX1NJWkUsIHNpemVvZigqaGFzaF90b19maXJzdF9pbmRleCkpOworICBpZiAoaGFzaF90b19maXJzdF9pbmRleCA9PSBOVUxMKSByZXR1cm4gMDsKKworICAvLyBTZXQgdGhlIGludDMyX3QgYXJyYXkgdG8gLTEuCisgIG1lbXNldChoYXNoX3RvX2ZpcnN0X2luZGV4LCAweGZmLCBIQVNIX1NJWkUgKiBzaXplb2YoKmhhc2hfdG9fZmlyc3RfaW5kZXgpKTsKKyAgLy8gRmlsbCB0aGUgY2hhaW4gbGlua2luZyBwaXhlbHMgd2l0aCB0aGUgc2FtZSBoYXNoLgorICBhcmdiX2NvbXAgPSAoYXJnYlswXSA9PSBhcmdiWzFdKTsKKyAgZm9yIChwb3MgPSAwOyBwb3MgPCBzaXplIC0gMjspIHsKKyAgICB1aW50MzJfdCBoYXNoX2NvZGU7CisgICAgY29uc3QgaW50IGFyZ2JfY29tcF9uZXh0ID0gKGFyZ2JbcG9zICsgMV0gPT0gYXJnYltwb3MgKyAyXSk7CisgICAgaWYgKGFyZ2JfY29tcCAmJiBhcmdiX2NvbXBfbmV4dCkgeworICAgICAgLy8gQ29uc2VjdXRpdmUgcGl4ZWxzIHdpdGggdGhlIHNhbWUgY29sb3Igd2lsbCBzaGFyZSB0aGUgc2FtZSBoYXNoLgorICAgICAgLy8gV2UgdGhlcmVmb3JlIHVzZSBhIGRpZmZlcmVudCBoYXNoOiB0aGUgY29sb3IgYW5kIGl0cyByZXBldGl0aW9uCisgICAgICAvLyBsZW5ndGguCisgICAgICB1aW50MzJfdCB0bXBbMl07CisgICAgICB1aW50MzJfdCBsZW4gPSAxOworICAgICAgdG1wWzBdID0gYXJnYltwb3NdOworICAgICAgLy8gRmlndXJlIG91dCBob3cgZmFyIHRoZSBwaXhlbHMgYXJlIHRoZSBzYW1lLgorICAgICAgLy8gVGhlIGxhc3QgcGl4ZWwgaGFzIGEgZGlmZmVyZW50IDY0IGJpdCBoYXNoLCBhcyBpdHMgbmV4dCBwaXhlbCBkb2VzCisgICAgICAvLyBub3QgaGF2ZSB0aGUgc2FtZSBjb2xvciwgc28gd2UganVzdCBuZWVkIHRvIGdldCB0byB0aGUgbGFzdCBwaXhlbCBlcXVhbAorICAgICAgLy8gdG8gaXRzIGZvbGxvd2VyLgorICAgICAgd2hpbGUgKHBvcyArIChpbnQpbGVuICsgMiA8IHNpemUgJiYgYXJnYltwb3MgKyBsZW4gKyAyXSA9PSBhcmdiW3Bvc10pIHsKKyAgICAgICAgKytsZW47CisgICAgICB9CisgICAgICBpZiAobGVuID4gTUFYX0xFTkdUSCkgeworICAgICAgICAvLyBTa2lwIHRoZSBwaXhlbHMgdGhhdCBtYXRjaCBmb3IgZGlzdGFuY2U9MSBhbmQgbGVuZ3RoPk1BWF9MRU5HVEgKKyAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBsaW5rZWQgdG8gdGhlaXIgcHJlZGVjZXNzb3IgYW5kIHdlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gY2hlY2sgdGhhdCBpbiB0aGUgbWFpbiBmb3IgbG9vcCBiZWxvdy4gU2tpcHBpbmcgbWVhbnMgc2V0dGluZyBubworICAgICAgICAvLyBwcmVkZWNlc3NvciBpbiB0aGUgY2hhaW4sIGhlbmNlIC0xLgorICAgICAgICBtZW1zZXQoY2hhaW4gKyBwb3MsIDB4ZmYsIChsZW4gLSBNQVhfTEVOR1RIKSAqIHNpemVvZigqY2hhaW4pKTsKKyAgICAgICAgcG9zICs9IGxlbiAtIE1BWF9MRU5HVEg7CisgICAgICAgIGxlbiA9IE1BWF9MRU5HVEg7CisgICAgICB9CisgICAgICAvLyBQcm9jZXNzIHRoZSByZXN0IG9mIHRoZSBoYXNoIGNoYWluLgorICAgICAgd2hpbGUgKGxlbikgeworICAgICAgICB0bXBbMV0gPSBsZW4tLTsKKyAgICAgICAgaGFzaF9jb2RlID0gR2V0UGl4UGFpckhhc2g2NCh0bXApOworICAgICAgICBjaGFpbltwb3NdID0gaGFzaF90b19maXJzdF9pbmRleFtoYXNoX2NvZGVdOworICAgICAgICBoYXNoX3RvX2ZpcnN0X2luZGV4W2hhc2hfY29kZV0gPSBwb3MrKzsKKyAgICAgIH0KKyAgICAgIGFyZ2JfY29tcCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEp1c3QgbW92ZSBvbmUgcGl4ZWwgZm9yd2FyZC4KKyAgICAgIGhhc2hfY29kZSA9IEdldFBpeFBhaXJIYXNoNjQoYXJnYiArIHBvcyk7CisgICAgICBjaGFpbltwb3NdID0gaGFzaF90b19maXJzdF9pbmRleFtoYXNoX2NvZGVdOworICAgICAgaGFzaF90b19maXJzdF9pbmRleFtoYXNoX2NvZGVdID0gcG9zKys7CisgICAgICBhcmdiX2NvbXAgPSBhcmdiX2NvbXBfbmV4dDsKKyAgICB9CisgIH0KKyAgLy8gUHJvY2VzcyB0aGUgcGVudWx0aW1hdGUgcGl4ZWwuCisgIGNoYWluW3Bvc10gPSBoYXNoX3RvX2ZpcnN0X2luZGV4W0dldFBpeFBhaXJIYXNoNjQoYXJnYiArIHBvcyldOworCisgIFdlYlBTYWZlRnJlZShoYXNoX3RvX2ZpcnN0X2luZGV4KTsKKworICAvLyBGaW5kIHRoZSBiZXN0IG1hdGNoIGludGVydmFsIGF0IGVhY2ggcGl4ZWwsIGRlZmluZWQgYnkgYW4gb2Zmc2V0IHRvIHRoZQorICAvLyBwaXhlbCBhbmQgYSBsZW5ndGguIFRoZSByaWdodC1tb3N0IHBpeGVsIGNhbm5vdCBtYXRjaCBhbnl0aGluZyB0byB0aGUgcmlnaHQKKyAgLy8gKGhlbmNlIGEgYmVzdCBsZW5ndGggb2YgMCkgYW5kIHRoZSBsZWZ0LW1vc3QgcGl4ZWwgbm90aGluZyB0byB0aGUgbGVmdAorICAvLyAoaGVuY2UgYW4gb2Zmc2V0IG9mIDApLgorICBhc3NlcnQoc2l6ZSA+IDIpOworICBwLT5vZmZzZXRfbGVuZ3RoX1swXSA9IHAtPm9mZnNldF9sZW5ndGhfW3NpemUgLSAxXSA9IDA7CisgIGZvciAoYmFzZV9wb3NpdGlvbiA9IHNpemUgLSAyOyBiYXNlX3Bvc2l0aW9uID4gMDspIHsKKyAgICBjb25zdCBpbnQgbWF4X2xlbiA9IE1heEZpbmRDb3B5TGVuZ3RoKHNpemUgLSAxIC0gYmFzZV9wb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc3RhcnQgPSBhcmdiICsgYmFzZV9wb3NpdGlvbjsKKyAgICBpbnQgaXRlciA9IGl0ZXJfbWF4OworICAgIGludCBiZXN0X2xlbmd0aCA9IDA7CisgICAgdWludDMyX3QgYmVzdF9kaXN0YW5jZSA9IDA7CisgICAgdWludDMyX3QgYmVzdF9hcmdiOworICAgIGNvbnN0IGludCBtaW5fcG9zID0KKyAgICAgICAgKGJhc2VfcG9zaXRpb24gPiB3aW5kb3dfc2l6ZSkgPyBiYXNlX3Bvc2l0aW9uIC0gd2luZG93X3NpemUgOiAwOworICAgIGNvbnN0IGludCBsZW5ndGhfbWF4ID0gKG1heF9sZW4gPCAyNTYpID8gbWF4X2xlbiA6IDI1NjsKKyAgICB1aW50MzJfdCBtYXhfYmFzZV9wb3NpdGlvbjsKKworICAgIHBvcyA9IGNoYWluW2Jhc2VfcG9zaXRpb25dOworICAgIGlmICghbG93X2VmZm9ydCkgeworICAgICAgaW50IGN1cnJfbGVuZ3RoOworICAgICAgLy8gSGV1cmlzdGljOiB1c2UgdGhlIGNvbXBhcmlzb24gd2l0aCB0aGUgYWJvdmUgbGluZSBhcyBhbiBpbml0aWFsaXphdGlvbi4KKyAgICAgIGlmIChiYXNlX3Bvc2l0aW9uID49ICh1aW50MzJfdCl4c2l6ZSkgeworICAgICAgICBjdXJyX2xlbmd0aCA9IEZpbmRNYXRjaExlbmd0aChhcmdiX3N0YXJ0IC0geHNpemUsIGFyZ2Jfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfbGVuZ3RoLCBtYXhfbGVuKTsKKyAgICAgICAgaWYgKGN1cnJfbGVuZ3RoID4gYmVzdF9sZW5ndGgpIHsKKyAgICAgICAgICBiZXN0X2xlbmd0aCA9IGN1cnJfbGVuZ3RoOworICAgICAgICAgIGJlc3RfZGlzdGFuY2UgPSB4c2l6ZTsKKyAgICAgICAgfQorICAgICAgICAtLWl0ZXI7CisgICAgICB9CisgICAgICAvLyBIZXVyaXN0aWM6IGNvbXBhcmUgdG8gdGhlIHByZXZpb3VzIHBpeGVsLgorICAgICAgY3Vycl9sZW5ndGggPQorICAgICAgICAgIEZpbmRNYXRjaExlbmd0aChhcmdiX3N0YXJ0IC0gMSwgYXJnYl9zdGFydCwgYmVzdF9sZW5ndGgsIG1heF9sZW4pOworICAgICAgaWYgKGN1cnJfbGVuZ3RoID4gYmVzdF9sZW5ndGgpIHsKKyAgICAgICAgYmVzdF9sZW5ndGggPSBjdXJyX2xlbmd0aDsKKyAgICAgICAgYmVzdF9kaXN0YW5jZSA9IDE7CisgICAgICB9CisgICAgICAtLWl0ZXI7CisgICAgICAvLyBTa2lwIHRoZSBmb3IgbG9vcCBpZiB3ZSBhbHJlYWR5IGhhdmUgdGhlIG1heGltdW0uCisgICAgICBpZiAoYmVzdF9sZW5ndGggPT0gTUFYX0xFTkdUSCkgcG9zID0gbWluX3BvcyAtIDE7CisgICAgfQorICAgIGJlc3RfYXJnYiA9IGFyZ2Jfc3RhcnRbYmVzdF9sZW5ndGhdOworCisgICAgZm9yICg7IHBvcyA+PSBtaW5fcG9zICYmIC0taXRlcjsgcG9zID0gY2hhaW5bcG9zXSkgeworICAgICAgaW50IGN1cnJfbGVuZ3RoOworICAgICAgYXNzZXJ0KGJhc2VfcG9zaXRpb24gPiAodWludDMyX3QpcG9zKTsKKworICAgICAgaWYgKGFyZ2JbcG9zICsgYmVzdF9sZW5ndGhdICE9IGJlc3RfYXJnYikgY29udGludWU7CisKKyAgICAgIGN1cnJfbGVuZ3RoID0gVlA4TFZlY3Rvck1pc21hdGNoKGFyZ2IgKyBwb3MsIGFyZ2Jfc3RhcnQsIG1heF9sZW4pOworICAgICAgaWYgKGJlc3RfbGVuZ3RoIDwgY3Vycl9sZW5ndGgpIHsKKyAgICAgICAgYmVzdF9sZW5ndGggPSBjdXJyX2xlbmd0aDsKKyAgICAgICAgYmVzdF9kaXN0YW5jZSA9IGJhc2VfcG9zaXRpb24gLSBwb3M7CisgICAgICAgIGJlc3RfYXJnYiA9IGFyZ2Jfc3RhcnRbYmVzdF9sZW5ndGhdOworICAgICAgICAvLyBTdG9wIGlmIHdlIGhhdmUgcmVhY2hlZCBhIGdvb2QgZW5vdWdoIGxlbmd0aC4KKyAgICAgICAgaWYgKGJlc3RfbGVuZ3RoID49IGxlbmd0aF9tYXgpIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICAvLyBXZSBoYXZlIHRoZSBiZXN0IG1hdGNoIGJ1dCBpbiBjYXNlIHRoZSB0d28gaW50ZXJ2YWxzIGNvbnRpbnVlIG1hdGNoaW5nCisgICAgLy8gdG8gdGhlIGxlZnQsIHdlIGhhdmUgdGhlIGJlc3QgbWF0Y2hlcyBmb3IgdGhlIGxlZnQtZXh0ZW5kZWQgcGl4ZWxzLgorICAgIG1heF9iYXNlX3Bvc2l0aW9uID0gYmFzZV9wb3NpdGlvbjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgYXNzZXJ0KGJlc3RfbGVuZ3RoIDw9IE1BWF9MRU5HVEgpOworICAgICAgYXNzZXJ0KGJlc3RfZGlzdGFuY2UgPD0gV0lORE9XX1NJWkUpOworICAgICAgcC0+b2Zmc2V0X2xlbmd0aF9bYmFzZV9wb3NpdGlvbl0gPQorICAgICAgICAgIChiZXN0X2Rpc3RhbmNlIDw8IE1BWF9MRU5HVEhfQklUUykgfCAodWludDMyX3QpYmVzdF9sZW5ndGg7CisgICAgICAtLWJhc2VfcG9zaXRpb247CisgICAgICAvLyBTdG9wIGlmIHdlIGRvbid0IGhhdmUgYSBtYXRjaCBvciBpZiB3ZSBhcmUgb3V0IG9mIGJvdW5kcy4KKyAgICAgIGlmIChiZXN0X2Rpc3RhbmNlID09IDAgfHwgYmFzZV9wb3NpdGlvbiA9PSAwKSBicmVhazsKKyAgICAgIC8vIFN0b3AgaWYgd2UgY2Fubm90IGV4dGVuZCB0aGUgbWF0Y2hpbmcgaW50ZXJ2YWxzIHRvIHRoZSBsZWZ0LgorICAgICAgaWYgKGJhc2VfcG9zaXRpb24gPCBiZXN0X2Rpc3RhbmNlIHx8CisgICAgICAgICAgYXJnYltiYXNlX3Bvc2l0aW9uIC0gYmVzdF9kaXN0YW5jZV0gIT0gYXJnYltiYXNlX3Bvc2l0aW9uXSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIFN0b3AgaWYgd2UgYXJlIG1hdGNoaW5nIGF0IGl0cyBsaW1pdCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGEgY2xvc2VyCisgICAgICAvLyBtYXRjaGluZyBpbnRlcnZhbCB3aXRoIHRoZSBzYW1lIG1heGltdW0gbGVuZ3RoLiBUaGVuIGFnYWluLCBpZiB0aGUKKyAgICAgIC8vIG1hdGNoaW5nIGludGVydmFsIGlzIGFzIGNsb3NlIGFzIHBvc3NpYmxlIChiZXN0X2Rpc3RhbmNlID09IDEpLCB3ZSB3aWxsCisgICAgICAvLyBuZXZlciBmaW5kIGFueXRoaW5nIGJldHRlciBzbyBsZXQncyBjb250aW51ZS4KKyAgICAgIGlmIChiZXN0X2xlbmd0aCA9PSBNQVhfTEVOR1RIICYmIGJlc3RfZGlzdGFuY2UgIT0gMSAmJgorICAgICAgICAgIGJhc2VfcG9zaXRpb24gKyBNQVhfTEVOR1RIIDwgbWF4X2Jhc2VfcG9zaXRpb24pIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoYmVzdF9sZW5ndGggPCBNQVhfTEVOR1RIKSB7CisgICAgICAgICsrYmVzdF9sZW5ndGg7CisgICAgICAgIG1heF9iYXNlX3Bvc2l0aW9uID0gYmFzZV9wb3NpdGlvbjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEFkZFNpbmdsZUxpdGVyYWwodWludDMyX3QgcGl4ZWwsIGludCB1c2VfY29sb3JfY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBoYXNoZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIFBpeE9yQ29weSB2OworICBpZiAodXNlX2NvbG9yX2NhY2hlKSB7CisgICAgY29uc3QgdWludDMyX3Qga2V5ID0gVlA4TENvbG9yQ2FjaGVHZXRJbmRleChoYXNoZXJzLCBwaXhlbCk7CisgICAgaWYgKFZQOExDb2xvckNhY2hlTG9va3VwKGhhc2hlcnMsIGtleSkgPT0gcGl4ZWwpIHsKKyAgICAgIHYgPSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChrZXkpOworICAgIH0gZWxzZSB7CisgICAgICB2ID0gUGl4T3JDb3B5Q3JlYXRlTGl0ZXJhbChwaXhlbCk7CisgICAgICBWUDhMQ29sb3JDYWNoZVNldChoYXNoZXJzLCBrZXksIHBpeGVsKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdiA9IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwocGl4ZWwpOworICB9CisgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgdik7Cit9CisKK3N0YXRpYyBpbnQgQmFja3dhcmRSZWZlcmVuY2VzUmxlKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKKyAgaW50IGksIGs7CisgIGNvbnN0IGludCB1c2VfY29sb3JfY2FjaGUgPSAoY2FjaGVfYml0cyA+IDApOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworCisgIGlmICh1c2VfY29sb3JfY2FjaGUgJiYgIVZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIC8vIEFkZCBmaXJzdCBwaXhlbCBhcyBsaXRlcmFsLgorICBBZGRTaW5nbGVMaXRlcmFsKGFyZ2JbMF0sIHVzZV9jb2xvcl9jYWNoZSwgJmhhc2hlcnMsIHJlZnMpOworICBpID0gMTsKKyAgd2hpbGUgKGkgPCBwaXhfY291bnQpIHsKKyAgICBjb25zdCBpbnQgbWF4X2xlbiA9IE1heEZpbmRDb3B5TGVuZ3RoKHBpeF9jb3VudCAtIGkpOworICAgIGNvbnN0IGludCBybGVfbGVuID0gRmluZE1hdGNoTGVuZ3RoKGFyZ2IgKyBpLCBhcmdiICsgaSAtIDEsIDAsIG1heF9sZW4pOworICAgIGNvbnN0IGludCBwcmV2X3Jvd19sZW4gPSAoaSA8IHhzaXplKSA/IDAgOgorICAgICAgICBGaW5kTWF0Y2hMZW5ndGgoYXJnYiArIGksIGFyZ2IgKyBpIC0geHNpemUsIDAsIG1heF9sZW4pOworICAgIGlmIChybGVfbGVuID49IHByZXZfcm93X2xlbiAmJiBybGVfbGVuID49IE1JTl9MRU5HVEgpIHsKKyAgICAgIFZQOExCYWNrd2FyZFJlZnNDdXJzb3JBZGQocmVmcywgUGl4T3JDb3B5Q3JlYXRlQ29weSgxLCBybGVfbGVuKSk7CisgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSB0aGUgY29sb3IgY2FjaGUgaGVyZSBzaW5jZSBpdCBpcyBhbHdheXMgdGhlCisgICAgICAvLyBzYW1lIHBpeGVsIGJlaW5nIGNvcGllZCwgYW5kIHRoYXQgZG9lcyBub3QgY2hhbmdlIHRoZSBjb2xvciBjYWNoZQorICAgICAgLy8gc3RhdGUuCisgICAgICBpICs9IHJsZV9sZW47CisgICAgfSBlbHNlIGlmIChwcmV2X3Jvd19sZW4gPj0gTUlOX0xFTkdUSCkgeworICAgICAgVlA4TEJhY2t3YXJkUmVmc0N1cnNvckFkZChyZWZzLCBQaXhPckNvcHlDcmVhdGVDb3B5KHhzaXplLCBwcmV2X3Jvd19sZW4pKTsKKyAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICAgICAgZm9yIChrID0gMDsgayA8IHByZXZfcm93X2xlbjsgKytrKSB7CisgICAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JbaSArIGtdKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaSArPSBwcmV2X3Jvd19sZW47CisgICAgfSBlbHNlIHsKKyAgICAgIEFkZFNpbmdsZUxpdGVyYWwoYXJnYltpXSwgdXNlX2NvbG9yX2NhY2hlLCAmaGFzaGVycywgcmVmcyk7CisgICAgICBpKys7CisgICAgfQorICB9CisgIGlmICh1c2VfY29sb3JfY2FjaGUpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gIXJlZnMtPmVycm9yXzsKK30KKworc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNMejc3KGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpIHsKKyAgaW50IGk7CisgIGludCBpX2xhc3RfY2hlY2sgPSAtMTsKKyAgaW50IG9rID0gMDsKKyAgaW50IGNjX2luaXQgPSAwOworICBjb25zdCBpbnQgdXNlX2NvbG9yX2NhY2hlID0gKGNhY2hlX2JpdHMgPiAwKTsKKyAgY29uc3QgaW50IHBpeF9jb3VudCA9IHhzaXplICogeXNpemU7CisgIFZQOExDb2xvckNhY2hlIGhhc2hlcnM7CisKKyAgaWYgKHVzZV9jb2xvcl9jYWNoZSkgeworICAgIGNjX2luaXQgPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnMsIGNhY2hlX2JpdHMpOworICAgIGlmICghY2NfaW5pdCkgZ290byBFcnJvcjsKKyAgfQorICBWUDhMQ2xlYXJCYWNrd2FyZFJlZnMocmVmcyk7CisgIGZvciAoaSA9IDA7IGkgPCBwaXhfY291bnQ7KSB7CisgICAgLy8gQWx0ZXJuYXRpdmUjMTogQ29kZSB0aGUgcGl4ZWxzIHN0YXJ0aW5nIGF0ICdpJyB1c2luZyBiYWNrd2FyZCByZWZlcmVuY2UuCisgICAgaW50IG9mZnNldCA9IDA7CisgICAgaW50IGxlbiA9IDA7CisgICAgaW50IGo7CisgICAgVlA4TEhhc2hDaGFpbkZpbmRDb3B5KGhhc2hfY2hhaW4sIGksICZvZmZzZXQsICZsZW4pOworICAgIGlmIChsZW4gPj0gTUlOX0xFTkdUSCkgeworICAgICAgY29uc3QgaW50IGxlbl9pbmkgPSBsZW47CisgICAgICBpbnQgbWF4X3JlYWNoID0gMDsKKyAgICAgIGNvbnN0IGludCBqX21heCA9CisgICAgICAgICAgKGkgKyBsZW5faW5pID49IHBpeF9jb3VudCkgPyBwaXhfY291bnQgLSAxIDogaSArIGxlbl9pbmk7CisgICAgICAvLyBPbmx5IHN0YXJ0IGZyb20gd2hhdCB3ZSBoYXZlIG5vdCBjaGVja2VkIGFscmVhZHkuCisgICAgICBpX2xhc3RfY2hlY2sgPSAoaSA+IGlfbGFzdF9jaGVjaykgPyBpIDogaV9sYXN0X2NoZWNrOworICAgICAgLy8gV2Uga25vdyB0aGUgYmVzdCBtYXRjaCBmb3IgdGhlIGN1cnJlbnQgcGl4ZWwgYnV0IHdlIHRyeSB0byBmaW5kIHRoZQorICAgICAgLy8gYmVzdCBtYXRjaGVzIGZvciB0aGUgY3VycmVudCBwaXhlbCBBTkQgdGhlIG5leHQgb25lIGNvbWJpbmVkLgorICAgICAgLy8gVGhlIG5haXZlIG1ldGhvZCB3b3VsZCB1c2UgdGhlIGludGVydmFsczoKKyAgICAgIC8vIFtpLGkrbGVuKSArIFtpK2xlbiwgbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggYXQgaStsZW4pCisgICAgICAvLyB3aGlsZSB3ZSBjaGVjayBpZiB3ZSBjYW4gdXNlOgorICAgICAgLy8gW2ksaikgKHdoZXJlIGo8PWkrbGVuKSArIFtqLCBsZW5ndGggb2YgYmVzdCBtYXRjaCBhdCBqKQorICAgICAgZm9yIChqID0gaV9sYXN0X2NoZWNrICsgMTsgaiA8PSBqX21heDsgKytqKSB7CisgICAgICAgIGNvbnN0IGludCBsZW5faiA9IFZQOExIYXNoQ2hhaW5GaW5kTGVuZ3RoKGhhc2hfY2hhaW4sIGopOworICAgICAgICBjb25zdCBpbnQgcmVhY2ggPQorICAgICAgICAgICAgaiArIChsZW5faiA+PSBNSU5fTEVOR1RIID8gbGVuX2ogOiAxKTsgIC8vIDEgZm9yIHNpbmdsZSBsaXRlcmFsLgorICAgICAgICBpZiAocmVhY2ggPiBtYXhfcmVhY2gpIHsKKyAgICAgICAgICBsZW4gPSBqIC0gaTsKKyAgICAgICAgICBtYXhfcmVhY2ggPSByZWFjaDsKKyAgICAgICAgICBpZiAobWF4X3JlYWNoID49IHBpeF9jb3VudCkgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgbGVuID0gMTsKKyAgICB9CisgICAgLy8gR28gd2l0aCBsaXRlcmFsIG9yIGJhY2t3YXJkIHJlZmVyZW5jZS4KKyAgICBhc3NlcnQobGVuID4gMCk7CisgICAgaWYgKGxlbiA9PSAxKSB7CisgICAgICBBZGRTaW5nbGVMaXRlcmFsKGFyZ2JbaV0sIHVzZV9jb2xvcl9jYWNoZSwgJmhhc2hlcnMsIHJlZnMpOworICAgIH0gZWxzZSB7CisgICAgICBWUDhMQmFja3dhcmRSZWZzQ3Vyc29yQWRkKHJlZnMsIFBpeE9yQ29weUNyZWF0ZUNvcHkob2Zmc2V0LCBsZW4pKTsKKyAgICAgIGlmICh1c2VfY29sb3JfY2FjaGUpIHsKKyAgICAgICAgZm9yIChqID0gaTsgaiA8IGkgKyBsZW47ICsraikgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2Jbal0pOworICAgICAgfQorICAgIH0KKyAgICBpICs9IGxlbjsKKyAgfQorCisgIG9rID0gIXJlZnMtPmVycm9yXzsKKyBFcnJvcjoKKyAgaWYgKGNjX2luaXQpIFZQOExDb2xvckNhY2hlQ2xlYXIoJmhhc2hlcnMpOworICByZXR1cm4gb2s7Cit9CisKKy8vIENvbXB1dGUgYW4gTFo3NyBieSBmb3JjaW5nIG1hdGNoZXMgdG8gaGFwcGVuIHdpdGhpbiBhIGdpdmVuIGRpc3RhbmNlIGNvc3QuCisvLyBXZSB0aGVyZWZvcmUgbGltaXQgdGhlIGFsZ29yaXRobSB0byB0aGUgbG93ZXN0IDMyIHZhbHVlcyBpbiB0aGUgUGxhbmVDb2RlCisvLyBkZWZpbml0aW9uLgorI2RlZmluZSBXSU5ET1dfT0ZGU0VUU19TSVpFX01BWCAzMgorc3RhdGljIGludCBCYWNrd2FyZFJlZmVyZW5jZXNMejc3Qm94KGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluX2Jlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhhc2hDaGFpbiogaGFzaF9jaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzKSB7CisgIGludCBpOworICBjb25zdCBpbnQgcGl4X2NvdW50ID0geHNpemUgKiB5c2l6ZTsKKyAgdWludDE2X3QqIGNvdW50czsKKyAgaW50IHdpbmRvd19vZmZzZXRzW1dJTkRPV19PRkZTRVRTX1NJWkVfTUFYXSA9IHswfTsKKyAgaW50IHdpbmRvd19vZmZzZXRzX25ld1tXSU5ET1dfT0ZGU0VUU19TSVpFX01BWF0gPSB7MH07CisgIGludCB3aW5kb3dfb2Zmc2V0c19zaXplID0gMDsKKyAgaW50IHdpbmRvd19vZmZzZXRzX25ld19zaXplID0gMDsKKyAgdWludDE2X3QqIGNvbnN0IGNvdW50c19pbmkgPQorICAgICAgKHVpbnQxNl90KilXZWJQU2FmZU1hbGxvYyh4c2l6ZSAqIHlzaXplLCBzaXplb2YoKmNvdW50c19pbmkpKTsKKyAgaW50IGJlc3Rfb2Zmc2V0X3ByZXYgPSAtMSwgYmVzdF9sZW5ndGhfcHJldiA9IC0xOworICBpZiAoY291bnRzX2luaSA9PSBOVUxMKSByZXR1cm4gMDsKKworICAvLyBjb3VudHNbaV0gY291bnRzIGhvdyBtYW55IHRpbWVzIGEgcGl4ZWwgaXMgcmVwZWF0ZWQgc3RhcnRpbmcgYXQgcG9zaXRpb24gaS4KKyAgaSA9IHBpeF9jb3VudCAtIDI7CisgIGNvdW50cyA9IGNvdW50c19pbmkgKyBpOworICBjb3VudHNbMV0gPSAxOworICBmb3IgKDsgaSA+PSAwOyAtLWksIC0tY291bnRzKSB7CisgICAgaWYgKGFyZ2JbaV0gPT0gYXJnYltpICsgMV0pIHsKKyAgICAgIC8vIE1heCBvdXQgdGhlIGNvdW50cyB0byBNQVhfTEVOR1RILgorICAgICAgY291bnRzWzBdID0gY291bnRzWzFdICsgKGNvdW50c1sxXSAhPSBNQVhfTEVOR1RIKTsKKyAgICB9IGVsc2UgeworICAgICAgY291bnRzWzBdID0gMTsKKyAgICB9CisgIH0KKworICAvLyBGaWd1cmUgb3V0IHRoZSB3aW5kb3cgb2Zmc2V0cyBhcm91bmQgYSBwaXhlbC4gVGhleSBhcmUgc3RvcmVkIGluIGEKKyAgLy8gc3BpcmFsaW5nIG9yZGVyIGFyb3VuZCB0aGUgcGl4ZWwgYXMgZGVmaW5lZCBieSBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZS4KKyAgeworICAgIGludCB4LCB5OworICAgIGZvciAoeSA9IDA7IHkgPD0gNjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAtNjsgeCA8PSA2OyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IG9mZnNldCA9IHkgKiB4c2l6ZSArIHg7CisgICAgICAgIGludCBwbGFuZV9jb2RlOworICAgICAgICAvLyBJZ25vcmUgb2Zmc2V0cyB0aGF0IGJyaW5nIHVzIGFmdGVyIHRoZSBwaXhlbC4KKyAgICAgICAgaWYgKG9mZnNldCA8PSAwKSBjb250aW51ZTsKKyAgICAgICAgcGxhbmVfY29kZSA9IFZQOExEaXN0YW5jZVRvUGxhbmVDb2RlKHhzaXplLCBvZmZzZXQpIC0gMTsKKyAgICAgICAgaWYgKHBsYW5lX2NvZGUgPj0gV0lORE9XX09GRlNFVFNfU0laRV9NQVgpIGNvbnRpbnVlOworICAgICAgICB3aW5kb3dfb2Zmc2V0c1twbGFuZV9jb2RlXSA9IG9mZnNldDsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gRm9yIG5hcnJvdyBpbWFnZXMsIG5vdCBhbGwgcGxhbmUgY29kZXMgYXJlIHJlYWNoZWQsIHNvIHJlbW92ZSB0aG9zZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgV0lORE9XX09GRlNFVFNfU0laRV9NQVg7ICsraSkgeworICAgICAgaWYgKHdpbmRvd19vZmZzZXRzW2ldID09IDApIGNvbnRpbnVlOworICAgICAgd2luZG93X29mZnNldHNbd2luZG93X29mZnNldHNfc2l6ZSsrXSA9IHdpbmRvd19vZmZzZXRzW2ldOworICAgIH0KKyAgICAvLyBHaXZlbiBhIHBpeGVsIFAsIGZpbmQgdGhlIG9mZnNldHMgdGhhdCByZWFjaCBwaXhlbHMgdW5yZWFjaGFibGUgZnJvbSBQLTEKKyAgICAvLyB3aXRoIGFueSBvZiB0aGUgb2Zmc2V0cyBpbiB3aW5kb3dfb2Zmc2V0c1tdLgorICAgIGZvciAoaSA9IDA7IGkgPCB3aW5kb3dfb2Zmc2V0c19zaXplOyArK2kpIHsKKyAgICAgIGludCBqOworICAgICAgaW50IGlzX3JlYWNoYWJsZSA9IDA7CisgICAgICBmb3IgKGogPSAwOyBqIDwgd2luZG93X29mZnNldHNfc2l6ZSAmJiAhaXNfcmVhY2hhYmxlOyArK2opIHsKKyAgICAgICAgaXNfcmVhY2hhYmxlIHw9ICh3aW5kb3dfb2Zmc2V0c1tpXSA9PSB3aW5kb3dfb2Zmc2V0c1tqXSArIDEpOworICAgICAgfQorICAgICAgaWYgKCFpc19yZWFjaGFibGUpIHsKKyAgICAgICAgd2luZG93X29mZnNldHNfbmV3W3dpbmRvd19vZmZzZXRzX25ld19zaXplXSA9IHdpbmRvd19vZmZzZXRzW2ldOworICAgICAgICArK3dpbmRvd19vZmZzZXRzX25ld19zaXplOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGhhc2hfY2hhaW4tPm9mZnNldF9sZW5ndGhfWzBdID0gMDsKKyAgZm9yIChpID0gMTsgaSA8IHBpeF9jb3VudDsgKytpKSB7CisgICAgaW50IGluZDsKKyAgICBpbnQgYmVzdF9sZW5ndGggPSBWUDhMSGFzaENoYWluRmluZExlbmd0aChoYXNoX2NoYWluX2Jlc3QsIGkpOworICAgIGludCBiZXN0X29mZnNldDsKKyAgICBpbnQgZG9fY29tcHV0ZSA9IDE7CisKKyAgICBpZiAoYmVzdF9sZW5ndGggPj0gTUFYX0xFTkdUSCkgeworICAgICAgLy8gRG8gbm90IHJlY29tcHV0ZSB0aGUgYmVzdCBtYXRjaCBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBtYXhpbWFsIG9uZSBpbiB0aGUKKyAgICAgIC8vIHdpbmRvdy4KKyAgICAgIGJlc3Rfb2Zmc2V0ID0gVlA4TEhhc2hDaGFpbkZpbmRPZmZzZXQoaGFzaF9jaGFpbl9iZXN0LCBpKTsKKyAgICAgIGZvciAoaW5kID0gMDsgaW5kIDwgd2luZG93X29mZnNldHNfc2l6ZTsgKytpbmQpIHsKKyAgICAgICAgaWYgKGJlc3Rfb2Zmc2V0ID09IHdpbmRvd19vZmZzZXRzW2luZF0pIHsKKyAgICAgICAgICBkb19jb21wdXRlID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9fY29tcHV0ZSkgeworICAgICAgLy8gRmlndXJlIG91dCBpZiB3ZSBzaG91bGQgdXNlIHRoZSBvZmZzZXQvbGVuZ3RoIGZyb20gdGhlIHByZXZpb3VzIHBpeGVsCisgICAgICAvLyBhcyBhbiBpbml0aWFsIGd1ZXNzIGFuZCB0aGVyZWZvcmUgb25seSBpbnNwZWN0IHRoZSBvZmZzZXRzIGluCisgICAgICAvLyB3aW5kb3dfb2Zmc2V0c19uZXdbXS4KKyAgICAgIGNvbnN0IGludCB1c2VfcHJldiA9CisgICAgICAgICAgKGJlc3RfbGVuZ3RoX3ByZXYgPiAxKSAmJiAoYmVzdF9sZW5ndGhfcHJldiA8IE1BWF9MRU5HVEgpOworICAgICAgY29uc3QgaW50IG51bV9pbmQgPQorICAgICAgICAgIHVzZV9wcmV2ID8gd2luZG93X29mZnNldHNfbmV3X3NpemUgOiB3aW5kb3dfb2Zmc2V0c19zaXplOworICAgICAgYmVzdF9sZW5ndGggPSB1c2VfcHJldiA/IGJlc3RfbGVuZ3RoX3ByZXYgLSAxIDogMDsKKyAgICAgIGJlc3Rfb2Zmc2V0ID0gdXNlX3ByZXYgPyBiZXN0X29mZnNldF9wcmV2IDogMDsKKyAgICAgIC8vIEZpbmQgdGhlIGxvbmdlc3QgbWF0Y2ggaW4gYSB3aW5kb3cgYXJvdW5kIHRoZSBwaXhlbC4KKyAgICAgIGZvciAoaW5kID0gMDsgaW5kIDwgbnVtX2luZDsgKytpbmQpIHsKKyAgICAgICAgaW50IGN1cnJfbGVuZ3RoID0gMDsKKyAgICAgICAgaW50IGogPSBpOworICAgICAgICBpbnQgal9vZmZzZXQgPQorICAgICAgICAgICAgdXNlX3ByZXYgPyBpIC0gd2luZG93X29mZnNldHNfbmV3W2luZF0gOiBpIC0gd2luZG93X29mZnNldHNbaW5kXTsKKyAgICAgICAgaWYgKGpfb2Zmc2V0IDwgMCB8fCBhcmdiW2pfb2Zmc2V0XSAhPSBhcmdiW2ldKSBjb250aW51ZTsKKyAgICAgICAgLy8gVGhlIGxvbmdlc3QgbWF0Y2ggaXMgdGhlIHN1bSBvZiBob3cgbWFueSB0aW1lcyBlYWNoIHBpeGVsIGlzCisgICAgICAgIC8vIHJlcGVhdGVkLgorICAgICAgICBkbyB7CisgICAgICAgICAgY29uc3QgaW50IGNvdW50c19qX29mZnNldCA9IGNvdW50c19pbmlbal9vZmZzZXRdOworICAgICAgICAgIGNvbnN0IGludCBjb3VudHNfaiA9IGNvdW50c19pbmlbal07CisgICAgICAgICAgaWYgKGNvdW50c19qX29mZnNldCAhPSBjb3VudHNfaikgeworICAgICAgICAgICAgY3Vycl9sZW5ndGggKz0KKyAgICAgICAgICAgICAgICAoY291bnRzX2pfb2Zmc2V0IDwgY291bnRzX2opID8gY291bnRzX2pfb2Zmc2V0IDogY291bnRzX2o7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgLy8gVGhlIHNhbWUgY29sb3IgaXMgcmVwZWF0ZWQgY291bnRzX3BvcyB0aW1lcyBhdCBqX29mZnNldCBhbmQgai4KKyAgICAgICAgICBjdXJyX2xlbmd0aCArPSBjb3VudHNfal9vZmZzZXQ7CisgICAgICAgICAgal9vZmZzZXQgKz0gY291bnRzX2pfb2Zmc2V0OworICAgICAgICAgIGogKz0gY291bnRzX2pfb2Zmc2V0OworICAgICAgICB9IHdoaWxlIChjdXJyX2xlbmd0aCA8PSBNQVhfTEVOR1RIICYmIGogPCBwaXhfY291bnQgJiYKKyAgICAgICAgICAgICAgICAgYXJnYltqX29mZnNldF0gPT0gYXJnYltqXSk7CisgICAgICAgIGlmIChiZXN0X2xlbmd0aCA8IGN1cnJfbGVuZ3RoKSB7CisgICAgICAgICAgYmVzdF9vZmZzZXQgPQorICAgICAgICAgICAgICB1c2VfcHJldiA/IHdpbmRvd19vZmZzZXRzX25ld1tpbmRdIDogd2luZG93X29mZnNldHNbaW5kXTsKKyAgICAgICAgICBpZiAoY3Vycl9sZW5ndGggPj0gTUFYX0xFTkdUSCkgeworICAgICAgICAgICAgYmVzdF9sZW5ndGggPSBNQVhfTEVOR1RIOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJlc3RfbGVuZ3RoID0gY3Vycl9sZW5ndGg7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KGkgKyBiZXN0X2xlbmd0aCA8PSBwaXhfY291bnQpOworICAgIGFzc2VydChiZXN0X2xlbmd0aCA8PSBNQVhfTEVOR1RIKTsKKyAgICBpZiAoYmVzdF9sZW5ndGggPD0gTUlOX0xFTkdUSCkgeworICAgICAgaGFzaF9jaGFpbi0+b2Zmc2V0X2xlbmd0aF9baV0gPSAwOworICAgICAgYmVzdF9vZmZzZXRfcHJldiA9IDA7CisgICAgICBiZXN0X2xlbmd0aF9wcmV2ID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgaGFzaF9jaGFpbi0+b2Zmc2V0X2xlbmd0aF9baV0gPQorICAgICAgICAgIChiZXN0X29mZnNldCA8PCBNQVhfTEVOR1RIX0JJVFMpIHwgKHVpbnQzMl90KWJlc3RfbGVuZ3RoOworICAgICAgYmVzdF9vZmZzZXRfcHJldiA9IGJlc3Rfb2Zmc2V0OworICAgICAgYmVzdF9sZW5ndGhfcHJldiA9IGJlc3RfbGVuZ3RoOworICAgIH0KKyAgfQorICBoYXNoX2NoYWluLT5vZmZzZXRfbGVuZ3RoX1swXSA9IDA7CisgIFdlYlBTYWZlRnJlZShjb3VudHNfaW5pKTsKKworICByZXR1cm4gQmFja3dhcmRSZWZlcmVuY2VzTHo3Nyh4c2l6ZSwgeXNpemUsIGFyZ2IsIGNhY2hlX2JpdHMsIGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBCYWNrd2FyZFJlZmVyZW5jZXMyRExvY2FsaXR5KGludCB4c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBpZiAoUGl4T3JDb3B5SXNDb3B5KGMuY3VyX3BvcykpIHsKKyAgICAgIGNvbnN0IGludCBkaXN0ID0gYy5jdXJfcG9zLT5hcmdiX29yX2Rpc3RhbmNlOworICAgICAgY29uc3QgaW50IHRyYW5zZm9ybWVkX2Rpc3QgPSBWUDhMRGlzdGFuY2VUb1BsYW5lQ29kZSh4c2l6ZSwgZGlzdCk7CisgICAgICBjLmN1cl9wb3MtPmFyZ2Jfb3JfZGlzdGFuY2UgPSB0cmFuc2Zvcm1lZF9kaXN0OworICAgIH0KKyAgICBWUDhMUmVmc0N1cnNvck5leHQoJmMpOworICB9Cit9CisKKy8vIEV2YWx1YXRlIG9wdGltYWwgY2FjaGUgYml0cyBmb3IgdGhlIGxvY2FsIGNvbG9yIGNhY2hlLgorLy8gVGhlIGlucHV0ICpiZXN0X2NhY2hlX2JpdHMgc2V0cyB0aGUgbWF4aW11bSBjYWNoZSBiaXRzIHRvIHVzZSAocGFzc2luZyAwCisvLyBpbXBsaWVzIGRpc2FibGluZyB0aGUgbG9jYWwgY29sb3IgY2FjaGUpLiBUaGUgbG9jYWwgY29sb3IgY2FjaGUgaXMgYWxzbworLy8gZGlzYWJsZWQgZm9yIHRoZSBsb3dlciAoPD0gMjUpIHF1YWxpdHkuCisvLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBtZW1vcnkgZXJyb3IuCitzdGF0aWMgaW50IENhbGN1bGF0ZUJlc3RDYWNoZVNpemUoY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBiZXN0X2NhY2hlX2JpdHMpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCBjYWNoZV9iaXRzX21heCA9IChxdWFsaXR5IDw9IDI1KSA/IDAgOiAqYmVzdF9jYWNoZV9iaXRzOworICBkb3VibGUgZW50cm9weV9taW4gPSBNQVhfRU5UUk9QWTsKKyAgaW50IGNjX2luaXRbTUFYX0NPTE9SX0NBQ0hFX0JJVFMgKyAxXSA9IHsgMCB9OworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzW01BWF9DT0xPUl9DQUNIRV9CSVRTICsgMV07CisgIFZQOExSZWZzQ3Vyc29yIGMgPSBWUDhMUmVmc0N1cnNvckluaXQocmVmcyk7CisgIFZQOExIaXN0b2dyYW0qIGhpc3Rvc1tNQVhfQ09MT1JfQ0FDSEVfQklUUyArIDFdID0geyBOVUxMIH07CisgIGludCBvayA9IDA7CisKKyAgYXNzZXJ0KGNhY2hlX2JpdHNfbWF4ID49IDAgJiYgY2FjaGVfYml0c19tYXggPD0gTUFYX0NPTE9SX0NBQ0hFX0JJVFMpOworCisgIGlmIChjYWNoZV9iaXRzX21heCA9PSAwKSB7CisgICAgKmJlc3RfY2FjaGVfYml0cyA9IDA7CisgICAgLy8gTG9jYWwgY29sb3IgY2FjaGUgaXMgZGlzYWJsZWQuCisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBBbGxvY2F0ZSBkYXRhLgorICBmb3IgKGkgPSAwOyBpIDw9IGNhY2hlX2JpdHNfbWF4OyArK2kpIHsKKyAgICBoaXN0b3NbaV0gPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oaSk7CisgICAgaWYgKGhpc3Rvc1tpXSA9PSBOVUxMKSBnb3RvIEVycm9yOworICAgIGlmIChpID09IDApIGNvbnRpbnVlOworICAgIGNjX2luaXRbaV0gPSBWUDhMQ29sb3JDYWNoZUluaXQoJmhhc2hlcnNbaV0sIGkpOworICAgIGlmICghY2NfaW5pdFtpXSkgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIEZpbmQgdGhlIGNhY2hlX2JpdHMgZ2l2aW5nIHRoZSBsb3dlc3QgZW50cm9weS4gVGhlIHNlYXJjaCBpcyBkb25lIGluIGEKKyAgLy8gYnJ1dGUtZm9yY2Ugd2F5IGFzIHRoZSBmdW5jdGlvbiAoZW50cm9weSB3LnIudCBjYWNoZV9iaXRzKSBjYW4gYmUKKyAgLy8gYW55dGhpbmcgaW4gcHJhY3RpY2UuCisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIGNvbnN0IFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBwaXggPSAqYXJnYisrOworICAgICAgY29uc3QgdWludDMyX3QgYSA9IChwaXggPj4gMjQpICYgMHhmZjsKKyAgICAgIGNvbnN0IHVpbnQzMl90IHIgPSAocGl4ID4+IDE2KSAmIDB4ZmY7CisgICAgICBjb25zdCB1aW50MzJfdCBnID0gKHBpeCA+PiAgOCkgJiAweGZmOworICAgICAgY29uc3QgdWludDMyX3QgYiA9IChwaXggPj4gIDApICYgMHhmZjsKKyAgICAgIC8vIFRoZSBrZXlzIG9mIHRoZSBjYWNoZXMgY2FuIGJlIGRlcml2ZWQgZnJvbSB0aGUgbG9uZ2VzdCBvbmUuCisgICAgICBpbnQga2V5ID0gVlA4TEhhc2hQaXgocGl4LCAzMiAtIGNhY2hlX2JpdHNfbWF4KTsKKyAgICAgIC8vIERvIG5vdCB1c2UgdGhlIGNvbG9yIGNhY2hlIGZvciBjYWNoZV9iaXRzID0gMC4KKyAgICAgICsraGlzdG9zWzBdLT5ibHVlX1tiXTsKKyAgICAgICsraGlzdG9zWzBdLT5saXRlcmFsX1tnXTsKKyAgICAgICsraGlzdG9zWzBdLT5yZWRfW3JdOworICAgICAgKytoaXN0b3NbMF0tPmFscGhhX1thXTsKKyAgICAgIC8vIERlYWwgd2l0aCBjYWNoZV9iaXRzID4gMC4KKyAgICAgIGZvciAoaSA9IGNhY2hlX2JpdHNfbWF4OyBpID49IDE7IC0taSwga2V5ID4+PSAxKSB7CisgICAgICAgIGlmIChWUDhMQ29sb3JDYWNoZUxvb2t1cCgmaGFzaGVyc1tpXSwga2V5KSA9PSBwaXgpIHsKKyAgICAgICAgICArK2hpc3Rvc1tpXS0+bGl0ZXJhbF9bTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsga2V5XTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBWUDhMQ29sb3JDYWNoZVNldCgmaGFzaGVyc1tpXSwga2V5LCBwaXgpOworICAgICAgICAgICsraGlzdG9zW2ldLT5ibHVlX1tiXTsKKyAgICAgICAgICArK2hpc3Rvc1tpXS0+bGl0ZXJhbF9bZ107CisgICAgICAgICAgKytoaXN0b3NbaV0tPnJlZF9bcl07CisgICAgICAgICAgKytoaXN0b3NbaV0tPmFscGhhX1thXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSBzaG91bGQgY29tcHV0ZSB0aGUgY29udHJpYnV0aW9uIG9mIHRoZSAoZGlzdGFuY2UsbGVuZ3RoKQorICAgICAgLy8gaGlzdG9ncmFtcyBidXQgdGhvc2UgYXJlIHRoZSBzYW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgY2FjaGUgc2l6ZS4KKyAgICAgIC8vIEFzIHRob3NlIGNvbnN0YW50IGNvbnRyaWJ1dGlvbnMgYXJlIGluIHRoZSBlbmQgYWRkZWQgdG8gdGhlIG90aGVyCisgICAgICAvLyBoaXN0b2dyYW0gY29udHJpYnV0aW9ucywgd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlbS4KKyAgICAgIGludCBsZW4gPSBQaXhPckNvcHlMZW5ndGgodik7CisgICAgICB1aW50MzJfdCBhcmdiX3ByZXYgPSAqYXJnYiBeIDB4ZmZmZmZmZmZ1OworICAgICAgLy8gVXBkYXRlIHRoZSBjb2xvciBjYWNoZXMuCisgICAgICBkbyB7CisgICAgICAgIGlmICgqYXJnYiAhPSBhcmdiX3ByZXYpIHsKKyAgICAgICAgICAvLyBFZmZpY2llbmN5OiBpbnNlcnQgb25seSBpZiB0aGUgY29sb3IgY2hhbmdlcy4KKyAgICAgICAgICBpbnQga2V5ID0gVlA4TEhhc2hQaXgoKmFyZ2IsIDMyIC0gY2FjaGVfYml0c19tYXgpOworICAgICAgICAgIGZvciAoaSA9IGNhY2hlX2JpdHNfbWF4OyBpID49IDE7IC0taSwga2V5ID4+PSAxKSB7CisgICAgICAgICAgICBoYXNoZXJzW2ldLmNvbG9yc19ba2V5XSA9ICphcmdiOworICAgICAgICAgIH0KKyAgICAgICAgICBhcmdiX3ByZXYgPSAqYXJnYjsKKyAgICAgICAgfQorICAgICAgICBhcmdiKys7CisgICAgICB9IHdoaWxlICgtLWxlbiAhPSAwKTsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorCisgIGZvciAoaSA9IDA7IGkgPD0gY2FjaGVfYml0c19tYXg7ICsraSkgeworICAgIGNvbnN0IGRvdWJsZSBlbnRyb3B5ID0gVlA4TEhpc3RvZ3JhbUVzdGltYXRlQml0cyhoaXN0b3NbaV0pOworICAgIGlmIChpID09IDAgfHwgZW50cm9weSA8IGVudHJvcHlfbWluKSB7CisgICAgICBlbnRyb3B5X21pbiA9IGVudHJvcHk7CisgICAgICAqYmVzdF9jYWNoZV9iaXRzID0gaTsKKyAgICB9CisgIH0KKyAgb2sgPSAxOworRXJyb3I6CisgIGZvciAoaSA9IDA7IGkgPD0gY2FjaGVfYml0c19tYXg7ICsraSkgeworICAgIGlmIChjY19pbml0W2ldKSBWUDhMQ29sb3JDYWNoZUNsZWFyKCZoYXNoZXJzW2ldKTsKKyAgICBWUDhMRnJlZUhpc3RvZ3JhbShoaXN0b3NbaV0pOworICB9CisgIHJldHVybiBvazsKK30KKworLy8gVXBkYXRlIChpbi1wbGFjZSkgYmFja3dhcmQgcmVmZXJlbmNlcyBmb3Igc3BlY2lmaWVkIGNhY2hlX2JpdHMuCitzdGF0aWMgaW50IEJhY2t3YXJkUmVmc1dpdGhMb2NhbENhY2hlKGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcykgeworICBpbnQgcGl4ZWxfaW5kZXggPSAwOworICBWUDhMQ29sb3JDYWNoZSBoYXNoZXJzOworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICBpZiAoIVZQOExDb2xvckNhY2hlSW5pdCgmaGFzaGVycywgY2FjaGVfYml0cykpIHJldHVybiAwOworCisgIHdoaWxlIChWUDhMUmVmc0N1cnNvck9rKCZjKSkgeworICAgIFBpeE9yQ29weSogY29uc3QgdiA9IGMuY3VyX3BvczsKKyAgICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgICBjb25zdCB1aW50MzJfdCBhcmdiX2xpdGVyYWwgPSB2LT5hcmdiX29yX2Rpc3RhbmNlOworICAgICAgY29uc3QgaW50IGl4ID0gVlA4TENvbG9yQ2FjaGVDb250YWlucygmaGFzaGVycywgYXJnYl9saXRlcmFsKTsKKyAgICAgIGlmIChpeCA+PSAwKSB7CisgICAgICAgIC8vIGhhc2hlcnMgY29udGFpbnMgYXJnYl9saXRlcmFsCisgICAgICAgICp2ID0gUGl4T3JDb3B5Q3JlYXRlQ2FjaGVJZHgoaXgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgVlA4TENvbG9yQ2FjaGVJbnNlcnQoJmhhc2hlcnMsIGFyZ2JfbGl0ZXJhbCk7CisgICAgICB9CisgICAgICArK3BpeGVsX2luZGV4OworICAgIH0gZWxzZSB7CisgICAgICAvLyByZWZzIHdhcyBjcmVhdGVkIHdpdGhvdXQgbG9jYWwgY2FjaGUsIHNvIGl0IGNhbiBub3QgaGF2ZSBjYWNoZSBpbmRleGVzLgorICAgICAgaW50IGs7CisgICAgICBhc3NlcnQoUGl4T3JDb3B5SXNDb3B5KHYpKTsKKyAgICAgIGZvciAoayA9IDA7IGsgPCB2LT5sZW47ICsraykgeworICAgICAgICBWUDhMQ29sb3JDYWNoZUluc2VydCgmaGFzaGVycywgYXJnYltwaXhlbF9pbmRleCsrXSk7CisgICAgICB9CisgICAgfQorICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KKyAgVlA4TENvbG9yQ2FjaGVDbGVhcigmaGFzaGVycyk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgVlA4TEJhY2t3YXJkUmVmcyogR2V0QmFja3dhcmRSZWZlcmVuY2VzTG93RWZmb3J0KAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgaW50KiBjb25zdCBjYWNoZV9iaXRzLCBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfbHo3NykgeworICAqY2FjaGVfYml0cyA9IDA7CisgIGlmICghQmFja3dhcmRSZWZlcmVuY2VzTHo3Nyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAwLCBoYXNoX2NoYWluLCByZWZzX2x6NzcpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgQmFja3dhcmRSZWZlcmVuY2VzMkRMb2NhbGl0eSh3aWR0aCwgcmVmc19sejc3KTsKKyAgcmV0dXJuIHJlZnNfbHo3NzsKK30KKworZXh0ZXJuIGludCBWUDhMQmFja3dhcmRSZWZlcmVuY2VzVHJhY2VCYWNrd2FyZHMoCisgICAgaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLCBpbnQgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLAorICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfc3JjLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX2RzdCk7CitzdGF0aWMgVlA4TEJhY2t3YXJkUmVmcyogR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LAorICAgIGludCBsejc3X3R5cGVzX3RvX3RyeSwgaW50KiBjb25zdCBjYWNoZV9iaXRzLAorICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sIFZQOExCYWNrd2FyZFJlZnMqIGJlc3QsCisgICAgVlA4TEJhY2t3YXJkUmVmcyogd29yc3QpIHsKKyAgY29uc3QgaW50IGNhY2hlX2JpdHNfaW5pdGlhbCA9ICpjYWNoZV9iaXRzOworICBkb3VibGUgYml0X2Nvc3RfYmVzdCA9IC0xOworICBWUDhMSGlzdG9ncmFtKiBoaXN0byA9IE5VTEw7CisgIGludCBsejc3X3R5cGUsIGx6NzdfdHlwZV9iZXN0ID0gMDsKKyAgVlA4TEhhc2hDaGFpbiBoYXNoX2NoYWluX2JveDsKKyAgbWVtc2V0KCZoYXNoX2NoYWluX2JveCwgMCwgc2l6ZW9mKGhhc2hfY2hhaW5fYm94KSk7CisKKyAgaGlzdG8gPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oTUFYX0NPTE9SX0NBQ0hFX0JJVFMpOworICBpZiAoaGlzdG8gPT0gTlVMTCkgZ290byBFcnJvcjsKKworICBmb3IgKGx6NzdfdHlwZSA9IDE7IGx6NzdfdHlwZXNfdG9fdHJ5OworICAgICAgIGx6NzdfdHlwZXNfdG9fdHJ5ICY9IH5sejc3X3R5cGUsIGx6NzdfdHlwZSA8PD0gMSkgeworICAgIGludCByZXMgPSAwOworICAgIGRvdWJsZSBiaXRfY29zdDsKKyAgICBpbnQgY2FjaGVfYml0c190bXAgPSBjYWNoZV9iaXRzX2luaXRpYWw7CisgICAgaWYgKChsejc3X3R5cGVzX3RvX3RyeSAmIGx6NzdfdHlwZSkgPT0gMCkgY29udGludWU7CisgICAgc3dpdGNoIChsejc3X3R5cGUpIHsKKyAgICAgIGNhc2Uga0xaNzdSTEU6CisgICAgICAgIHJlcyA9IEJhY2t3YXJkUmVmZXJlbmNlc1JsZSh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAwLCB3b3JzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrTFo3N1N0YW5kYXJkOgorICAgICAgICAvLyBDb21wdXRlIExaNzcgd2l0aCBubyBjYWNoZSAoMCBiaXRzKSwgYXMgdGhlIGlkZWFsIExaNzcgd2l0aCBhIGNvbG9yCisgICAgICAgIC8vIGNhY2hlIGlzIG5vdCB0aGF0IGRpZmZlcmVudCBpbiBwcmFjdGljZS4KKyAgICAgICAgcmVzID0gQmFja3dhcmRSZWZlcmVuY2VzTHo3Nyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAwLCBoYXNoX2NoYWluLCB3b3JzdCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBrTFo3N0JveDoKKyAgICAgICAgaWYgKCFWUDhMSGFzaENoYWluSW5pdCgmaGFzaF9jaGFpbl9ib3gsIHdpZHRoICogaGVpZ2h0KSkgZ290byBFcnJvcjsKKyAgICAgICAgcmVzID0gQmFja3dhcmRSZWZlcmVuY2VzTHo3N0JveCh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAwLCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYXNoX2NoYWluX2JveCwgd29yc3QpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9CisgICAgaWYgKCFyZXMpIGdvdG8gRXJyb3I7CisKKyAgICAvLyBOZXh0LCB0cnkgd2l0aCBhIGNvbG9yIGNhY2hlIGFuZCB1cGRhdGUgdGhlIHJlZmVyZW5jZXMuCisgICAgaWYgKCFDYWxjdWxhdGVCZXN0Q2FjaGVTaXplKGFyZ2IsIHF1YWxpdHksIHdvcnN0LCAmY2FjaGVfYml0c190bXApKSB7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAoY2FjaGVfYml0c190bXAgPiAwKSB7CisgICAgICBpZiAoIUJhY2t3YXJkUmVmc1dpdGhMb2NhbENhY2hlKGFyZ2IsIGNhY2hlX2JpdHNfdG1wLCB3b3JzdCkpIHsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBLZWVwIHRoZSBiZXN0IGJhY2t3YXJkIHJlZmVyZW5jZXMuCisgICAgVlA4TEhpc3RvZ3JhbUNyZWF0ZShoaXN0bywgd29yc3QsIGNhY2hlX2JpdHNfdG1wKTsKKyAgICBiaXRfY29zdCA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOworICAgIGlmIChsejc3X3R5cGVfYmVzdCA9PSAwIHx8IGJpdF9jb3N0IDwgYml0X2Nvc3RfYmVzdCkgeworICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgdG1wID0gd29yc3Q7CisgICAgICB3b3JzdCA9IGJlc3Q7CisgICAgICBiZXN0ID0gdG1wOworICAgICAgYml0X2Nvc3RfYmVzdCA9IGJpdF9jb3N0OworICAgICAgKmNhY2hlX2JpdHMgPSBjYWNoZV9iaXRzX3RtcDsKKyAgICAgIGx6NzdfdHlwZV9iZXN0ID0gbHo3N190eXBlOworICAgIH0KKyAgfQorICBhc3NlcnQobHo3N190eXBlX2Jlc3QgPiAwKTsKKworICAvLyBJbXByb3ZlIG9uIHNpbXBsZSBMWjc3IGJ1dCBvbmx5IGZvciBoaWdoIHF1YWxpdHkgKFRyYWNlQmFja3dhcmRzIGlzCisgIC8vIGNvc3RseSkuCisgIGlmICgobHo3N190eXBlX2Jlc3QgPT0ga0xaNzdTdGFuZGFyZCB8fCBsejc3X3R5cGVfYmVzdCA9PSBrTFo3N0JveCkgJiYKKyAgICAgIHF1YWxpdHkgPj0gMjUpIHsKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluX3RtcCA9CisgICAgICAgIChsejc3X3R5cGVfYmVzdCA9PSBrTFo3N1N0YW5kYXJkKSA/IGhhc2hfY2hhaW4gOiAmaGFzaF9jaGFpbl9ib3g7CisgICAgaWYgKFZQOExCYWNrd2FyZFJlZmVyZW5jZXNUcmFjZUJhY2t3YXJkcyh3aWR0aCwgaGVpZ2h0LCBhcmdiLCAqY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfY2hhaW5fdG1wLCBiZXN0LCB3b3JzdCkpIHsKKyAgICAgIGRvdWJsZSBiaXRfY29zdF90cmFjZTsKKyAgICAgIFZQOExIaXN0b2dyYW1DcmVhdGUoaGlzdG8sIHdvcnN0LCAqY2FjaGVfYml0cyk7CisgICAgICBiaXRfY29zdF90cmFjZSA9IFZQOExIaXN0b2dyYW1Fc3RpbWF0ZUJpdHMoaGlzdG8pOworICAgICAgaWYgKGJpdF9jb3N0X3RyYWNlIDwgYml0X2Nvc3RfYmVzdCkgYmVzdCA9IHdvcnN0OworICAgIH0KKyAgfQorCisgIEJhY2t3YXJkUmVmZXJlbmNlczJETG9jYWxpdHkod2lkdGgsIGJlc3QpOworCitFcnJvcjoKKyAgVlA4TEhhc2hDaGFpbkNsZWFyKCZoYXNoX2NoYWluX2JveCk7CisgIFZQOExGcmVlSGlzdG9ncmFtKGhpc3RvKTsKKyAgcmV0dXJuIGJlc3Q7Cit9CisKK1ZQOExCYWNrd2FyZFJlZnMqIFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHF1YWxpdHksCisgICAgaW50IGxvd19lZmZvcnQsIGludCBsejc3X3R5cGVzX3RvX3RyeSwgaW50KiBjb25zdCBjYWNoZV9iaXRzLAorICAgIGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMSwKKyAgICBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDIpIHsKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICByZXR1cm4gR2V0QmFja3dhcmRSZWZlcmVuY2VzTG93RWZmb3J0KHdpZHRoLCBoZWlnaHQsIGFyZ2IsIGNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NoYWluLCByZWZzX3RtcDEpOworICB9IGVsc2UgeworICAgIHJldHVybiBHZXRCYWNrd2FyZFJlZmVyZW5jZXMod2lkdGgsIGhlaWdodCwgYXJnYiwgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx6NzdfdHlwZXNfdG9fdHJ5LCBjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmc190bXAxLCByZWZzX3RtcDIpOworICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUyNmZhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaApAQCAtMCwwICsxLDIzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vCisKKyNpZm5kZWYgV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfQkFDS1dBUkRfUkVGRVJFTkNFU19FTkNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBUaGUgbWF4aW11bSBhbGxvd2VkIGxpbWl0IGlzIDExLgorI2RlZmluZSBNQVhfQ09MT1JfQ0FDSEVfQklUUyAxMAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGl4T3JDb3B5CisKK2VudW0gTW9kZSB7CisgIGtMaXRlcmFsLAorICBrQ2FjaGVJZHgsCisgIGtDb3B5LAorICBrTm9uZQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAvLyBtb2RlIGFzIHVpbnQ4X3QgdG8gbWFrZSB0aGUgbWVtb3J5IGxheW91dCB0byBiZSBleGFjdGx5IDggYnl0ZXMuCisgIHVpbnQ4X3QgbW9kZTsKKyAgdWludDE2X3QgbGVuOworICB1aW50MzJfdCBhcmdiX29yX2Rpc3RhbmNlOworfSBQaXhPckNvcHk7CisKK3N0YXRpYyBXRUJQX0lOTElORSBQaXhPckNvcHkgUGl4T3JDb3B5Q3JlYXRlQ29weSh1aW50MzJfdCBkaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBsZW4pIHsKKyAgUGl4T3JDb3B5IHJldHZhbDsKKyAgcmV0dmFsLm1vZGUgPSBrQ29weTsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBkaXN0YW5jZTsKKyAgcmV0dmFsLmxlbiA9IGxlbjsKKyAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIFBpeE9yQ29weSBQaXhPckNvcHlDcmVhdGVDYWNoZUlkeChpbnQgaWR4KSB7CisgIFBpeE9yQ29weSByZXR2YWw7CisgIFNCX0RDSEVDSyhpZHggPj0gMCk7CisgIFNCX0RDSEVDSyhpZHggPCAoMSA8PCBNQVhfQ09MT1JfQ0FDSEVfQklUUykpOworICByZXR2YWwubW9kZSA9IGtDYWNoZUlkeDsKKyAgcmV0dmFsLmFyZ2Jfb3JfZGlzdGFuY2UgPSBpZHg7CisgIHJldHZhbC5sZW4gPSAxOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgUGl4T3JDb3B5IFBpeE9yQ29weUNyZWF0ZUxpdGVyYWwodWludDMyX3QgYXJnYikgeworICBQaXhPckNvcHkgcmV0dmFsOworICByZXR2YWwubW9kZSA9IGtMaXRlcmFsOworICByZXR2YWwuYXJnYl9vcl9kaXN0YW5jZSA9IGFyZ2I7CisgIHJldHZhbC5sZW4gPSAxOworICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeE9yQ29weUlzTGl0ZXJhbChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgcmV0dXJuIChwLT5tb2RlID09IGtMaXRlcmFsKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NhY2hlSWR4KGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCkgeworICByZXR1cm4gKHAtPm1vZGUgPT0ga0NhY2hlSWR4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBQaXhPckNvcHlJc0NvcHkoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiAocC0+bW9kZSA9PSBrQ29weSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMaXRlcmFsKGNvbnN0IFBpeE9yQ29weSogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb21wb25lbnQpIHsKKyAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0xpdGVyYWwpOworICByZXR1cm4gKHAtPmFyZ2Jfb3JfZGlzdGFuY2UgPj4gKGNvbXBvbmVudCAqIDgpKSAmIDB4ZmY7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlMZW5ndGgoY29uc3QgUGl4T3JDb3B5KiBjb25zdCBwKSB7CisgIHJldHVybiBwLT5sZW47Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlDYWNoZUlkeChjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0NhY2hlSWR4KTsKKyAgU0JfRENIRUNLKHAtPmFyZ2Jfb3JfZGlzdGFuY2UgPCAoMVUgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKTsKKyAgcmV0dXJuIHAtPmFyZ2Jfb3JfZGlzdGFuY2U7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQaXhPckNvcHlEaXN0YW5jZShjb25zdCBQaXhPckNvcHkqIGNvbnN0IHApIHsKKyAgU0JfRENIRUNLKHAtPm1vZGUgPT0ga0NvcHkpOworICByZXR1cm4gcC0+YXJnYl9vcl9kaXN0YW5jZTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExIYXNoQ2hhaW4KKworI2RlZmluZSBIQVNIX0JJVFMgMTgKKyNkZWZpbmUgSEFTSF9TSVpFICgxIDw8IEhBU0hfQklUUykKKworLy8gSWYgeW91IGNoYW5nZSB0aGlzLCB5b3UgbmVlZCBNQVhfTEVOR1RIX0JJVFMgKyBXSU5ET1dfU0laRV9CSVRTIDw9IDMyIGFzIGl0CisvLyBpcyB1c2VkIGluIFZQOExIYXNoQ2hhaW4uCisjZGVmaW5lIE1BWF9MRU5HVEhfQklUUyAxMgorI2RlZmluZSBXSU5ET1dfU0laRV9CSVRTIDIwCisvLyBXZSB3YW50IHRoZSBtYXggdmFsdWUgdG8gYmUgYXR0YWluYWJsZSBhbmQgc3RvcmVkIGluIE1BWF9MRU5HVEhfQklUUyBiaXRzLgorI2RlZmluZSBNQVhfTEVOR1RIICgoMSA8PCBNQVhfTEVOR1RIX0JJVFMpIC0gMSkKKyNpZiBNQVhfTEVOR1RIX0JJVFMgKyBXSU5ET1dfU0laRV9CSVRTID4gMzIKKyNlcnJvciAiTUFYX0xFTkdUSF9CSVRTICsgV0lORE9XX1NJWkVfQklUUyA+IDMyIgorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IFZQOExIYXNoQ2hhaW4gVlA4TEhhc2hDaGFpbjsKK3N0cnVjdCBWUDhMSGFzaENoYWluIHsKKyAgLy8gVGhlIDIwIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBjb250YWluIHRoZSBvZmZzZXQgYXQgd2hpY2ggdGhlIGJlc3QgbWF0Y2gKKyAgLy8gaXMgZm91bmQuIFRoZXNlIDIwIGJpdHMgYXJlIHRoZSBsaW1pdCBkZWZpbmVkIGJ5IEdldFdpbmRvd1NpemVGb3JIYXNoQ2hhaW4KKyAgLy8gKHRocm91Z2ggV0lORE9XX1NJWkUgPSAxPDwyMCkuCisgIC8vIFRoZSBsb3dlciAxMiBiaXRzIGNvbnRhaW4gdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2guIFRoZSAxMiBiaXQgbGltaXQgaXMKKyAgLy8gZGVmaW5lZCBpbiBNYXhGaW5kQ29weUxlbmd0aCB3aXRoIE1BWF9MRU5HVEg9NDA5Ni4KKyAgdWludDMyX3QqIG9mZnNldF9sZW5ndGhfOworICAvLyBUaGlzIGlzIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGhhc2hfY2hhaW4gdGhhdCBjYW4gYmUgY29uc3RydWN0ZWQuCisgIC8vIFR5cGljYWxseSB0aGlzIGlzIHRoZSBwaXhlbCBjb3VudCAod2lkdGggeCBoZWlnaHQpIGZvciBhIGdpdmVuIGltYWdlLgorICBpbnQgc2l6ZV87Cit9OworCisvLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCwgdG8gc2V0IHNpemUuCitpbnQgVlA4TEhhc2hDaGFpbkluaXQoVlA4TEhhc2hDaGFpbiogY29uc3QgcCwgaW50IHNpemUpOworLy8gUHJlLWNvbXB1dGUgdGhlIGJlc3QgbWF0Y2hlcyBmb3IgYXJnYi4KK2ludCBWUDhMSGFzaENoYWluRmlsbChWUDhMSGFzaENoYWluKiBjb25zdCBwLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwgaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQpOwordm9pZCBWUDhMSGFzaENoYWluQ2xlYXIoVlA4TEhhc2hDaGFpbiogY29uc3QgcCk7ICAvLyByZWxlYXNlIG1lbW9yeQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExIYXNoQ2hhaW5GaW5kT2Zmc2V0KGNvbnN0IFZQOExIYXNoQ2hhaW4qIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiYXNlX3Bvc2l0aW9uKSB7CisgIHJldHVybiBwLT5vZmZzZXRfbGVuZ3RoX1tiYXNlX3Bvc2l0aW9uXSA+PiBNQVhfTEVOR1RIX0JJVFM7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEhhc2hDaGFpbkZpbmRMZW5ndGgoY29uc3QgVlA4TEhhc2hDaGFpbiogY29uc3QgcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGJhc2VfcG9zaXRpb24pIHsKKyAgcmV0dXJuIHAtPm9mZnNldF9sZW5ndGhfW2Jhc2VfcG9zaXRpb25dICYgKCgxVSA8PCBNQVhfTEVOR1RIX0JJVFMpIC0gMSk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExIYXNoQ2hhaW5GaW5kQ29weShjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiYXNlX3Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgb2Zmc2V0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGxlbmd0aF9wdHIpIHsKKyAgKm9mZnNldF9wdHIgPSBWUDhMSGFzaENoYWluRmluZE9mZnNldChwLCBiYXNlX3Bvc2l0aW9uKTsKKyAgKmxlbmd0aF9wdHIgPSBWUDhMSGFzaENoYWluRmluZExlbmd0aChwLCBiYXNlX3Bvc2l0aW9uKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExCYWNrd2FyZFJlZnMgKGJsb2NrLWJhc2VkIGJhY2t3YXJkLXJlZmVyZW5jZXMgc3RvcmFnZSkKKworLy8gbWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlIGJsb2NrcyB0aGUgaW1hZ2Ugd2lsbCBiZSBzZWdtZW50ZWQgaW50bworI2RlZmluZSBNQVhfUkVGU19CTE9DS19QRVJfSU1BR0UgMTYKKwordHlwZWRlZiBzdHJ1Y3QgUGl4T3JDb3B5QmxvY2sgUGl4T3JDb3B5QmxvY2s7ICAgLy8gZm9yd2FyZCBkZWNsYXJhdGlvbgordHlwZWRlZiBzdHJ1Y3QgVlA4TEJhY2t3YXJkUmVmcyBWUDhMQmFja3dhcmRSZWZzOworCisvLyBDb250YWluZXIgZm9yIGJsb2NrcyBjaGFpbgorc3RydWN0IFZQOExCYWNrd2FyZFJlZnMgeworICBpbnQgYmxvY2tfc2l6ZV87ICAgICAgICAgICAgICAgLy8gY29tbW9uIGJsb2NrLXNpemUKKyAgaW50IGVycm9yXzsgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0byB0cnVlIGlmIHNvbWUgbWVtb3J5IGVycm9yIG9jY3VycmVkCisgIFBpeE9yQ29weUJsb2NrKiByZWZzXzsgICAgICAgICAvLyBsaXN0IG9mIGN1cnJlbnRseSB1c2VkIGJsb2NrcworICBQaXhPckNvcHlCbG9jayoqIHRhaWxfOyAgICAgICAgLy8gZm9yIGxpc3QgcmVjeWNsaW5nCisgIFBpeE9yQ29weUJsb2NrKiBmcmVlX2Jsb2Nrc187ICAvLyBmcmVlLWxpc3QKKyAgUGl4T3JDb3B5QmxvY2sqIGxhc3RfYmxvY2tfOyAgIC8vIHVzZWQgZm9yIGFkZGluZyBuZXcgcmVmcyAoaW50ZXJuYWwpCit9OworCisvLyBJbml0aWFsaXplIHRoZSBvYmplY3QuICdibG9ja19zaXplJyBpcyB0aGUgY29tbW9uIGJsb2NrIHNpemUgdG8gc3RvcmUKKy8vIHJlZmVyZW5jZXMgKHR5cGljYWxseSwgd2lkdGggKiBoZWlnaHQgLyBNQVhfUkVGU19CTE9DS19QRVJfSU1BR0UpLgordm9pZCBWUDhMQmFja3dhcmRSZWZzSW5pdChWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzLCBpbnQgYmxvY2tfc2l6ZSk7CisvLyBSZWxlYXNlIG1lbW9yeSBmb3IgYmFja3dhcmQgcmVmZXJlbmNlcy4KK3ZvaWQgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMpOworCisvLyBDdXJzb3IgZm9yIGl0ZXJhdGluZyBvbiByZWZlcmVuY2VzIGNvbnRlbnQKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gcHVibGljOgorICBQaXhPckNvcHkqIGN1cl9wb3M7ICAgICAgICAgICAvLyBjdXJyZW50IHBvc2l0aW9uCisgIC8vIHByaXZhdGU6CisgIFBpeE9yQ29weUJsb2NrKiBjdXJfYmxvY2tfOyAgIC8vIGN1cnJlbnQgYmxvY2sgaW4gdGhlIHJlZnMgbGlzdAorICBjb25zdCBQaXhPckNvcHkqIGxhc3RfcG9zXzsgICAvLyBzZW50aW5lbCBmb3Igc3dpdGNoaW5nIHRvIG5leHQgYmxvY2sKK30gVlA4TFJlZnNDdXJzb3I7CisKKy8vIFJldHVybnMgYSBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWZlcmVuY2VzIGxpc3QuCitWUDhMUmVmc0N1cnNvciBWUDhMUmVmc0N1cnNvckluaXQoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcyk7CisvLyBSZXR1cm5zIHRydWUgaWYgY3Vyc29yIGlzIHBvaW50aW5nIGF0IGEgdmFsaWQgcG9zaXRpb24uCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOExSZWZzQ3Vyc29yT2soY29uc3QgVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpIHsKKyAgcmV0dXJuIChjLT5jdXJfcG9zICE9IE5VTEwpOworfQorLy8gTW92ZSB0byBuZXh0IGJsb2NrIG9mIHJlZmVyZW5jZXMuIEludGVybmFsLCBub3QgdG8gYmUgY2FsbGVkIGRpcmVjdGx5Lgordm9pZCBWUDhMUmVmc0N1cnNvck5leHRCbG9jayhWUDhMUmVmc0N1cnNvciogY29uc3QgYyk7CisvLyBNb3ZlIHRvIG5leHQgcG9zaXRpb24sIG9yIE5VTEwuIFNob3VsZCBub3QgYmUgY2FsbGVkIGlmICFWUDhMUmVmc0N1cnNvck9rKCkuCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMUmVmc0N1cnNvck5leHQoVlA4TFJlZnNDdXJzb3IqIGNvbnN0IGMpIHsKKyAgU0JfRENIRUNLKGMgIT0gTlVMTCk7CisgIFNCX0RDSEVDSyhWUDhMUmVmc0N1cnNvck9rKGMpKTsKKyAgaWYgKCsrYy0+Y3VyX3BvcyA9PSBjLT5sYXN0X3Bvc18pIFZQOExSZWZzQ3Vyc29yTmV4dEJsb2NrKGMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWFpbiBlbnRyeSBwb2ludHMKKworZW51bSBWUDhMTFo3N1R5cGUgeworICBrTFo3N1N0YW5kYXJkID0gMSwKKyAga0xaNzdSTEUgPSAyLAorICBrTFo3N0JveCA9IDQKK307CisKKy8vIEV2YWx1YXRlcyBiZXN0IHBvc3NpYmxlIGJhY2t3YXJkIHJlZmVyZW5jZXMgZm9yIHNwZWNpZmllZCBxdWFsaXR5LgorLy8gVGhlIGlucHV0IGNhY2hlX2JpdHMgdG8gJ1ZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMnIHNldHMgdGhlIG1heGltdW0gY2FjaGUKKy8vIGJpdHMgdG8gdXNlIChwYXNzaW5nIDAgaW1wbGllcyBkaXNhYmxpbmcgdGhlIGxvY2FsIGNvbG9yIGNhY2hlKS4KKy8vIFRoZSBvcHRpbWFsIGNhY2hlIGJpdHMgaXMgZXZhbHVhdGVkIGFuZCBzZXQgZm9yIHRoZSAqY2FjaGVfYml0cyBwYXJhbWV0ZXIuCisvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiZXN0IG9mIHRoZSB0d28gYmFja3dhcmQgcmVmcyB2aXosCisvLyByZWZzWzBdIG9yIHJlZnNbMV0uCitWUDhMQmFja3dhcmRSZWZzKiBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgdWludDMyX3QqIGNvbnN0IGFyZ2IsIGludCBxdWFsaXR5LAorICAgIGludCBsb3dfZWZmb3J0LCBpbnQgbHo3N190eXBlc190b190cnksIGludCogY29uc3QgY2FjaGVfYml0cywKKyAgICBjb25zdCBWUDhMSGFzaENoYWluKiBjb25zdCBoYXNoX2NoYWluLCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCByZWZzX3RtcDEsCisgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAyKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmICAvLyBXRUJQX0VOQ19CQUNLV0FSRF9SRUZFUkVOQ0VTX0VOQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb25maWdfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2NvbmZpZ19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDQ4Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb25maWdfZW5jLmMKQEAgLTAsMCArMSwxNTIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb2RpbmcgdG9vbHMgY29uZmlndXJhdGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUENvbmZpZworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IFdlYlBDb25maWdJbml0SW50ZXJuYWwoV2ViUENvbmZpZyogY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFByZXNldCBwcmVzZXQsIGZsb2F0IHF1YWxpdHksIGludCB2ZXJzaW9uKSB7CisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiAwOyAgIC8vIGNhbGxlci9zeXN0ZW0gdmVyc2lvbiBtaXNtYXRjaCEKKyAgfQorICBpZiAoY29uZmlnID09IE5VTEwpIHJldHVybiAwOworCisgIGNvbmZpZy0+cXVhbGl0eSA9IHF1YWxpdHk7CisgIGNvbmZpZy0+dGFyZ2V0X3NpemUgPSAwOworICBjb25maWctPnRhcmdldF9QU05SID0gMC47CisgIGNvbmZpZy0+bWV0aG9kID0gNDsKKyAgY29uZmlnLT5zbnNfc3RyZW5ndGggPSA1MDsKKyAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSA2MDsgICAvLyBtaWQtZmlsdGVyaW5nCisgIGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA9IDA7CisgIGNvbmZpZy0+ZmlsdGVyX3R5cGUgPSAxOyAgICAgICAgLy8gZGVmYXVsdDogc3Ryb25nIChzbyBVL1YgaXMgZmlsdGVyZWQgdG9vKQorICBjb25maWctPnBhcnRpdGlvbnMgPSAwOworICBjb25maWctPnNlZ21lbnRzID0gNDsKKyAgY29uZmlnLT5wYXNzID0gMTsKKyAgY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPSAwOworICBjb25maWctPnByZXByb2Nlc3NpbmcgPSAwOworICBjb25maWctPmF1dG9maWx0ZXIgPSAwOworICBjb25maWctPnBhcnRpdGlvbl9saW1pdCA9IDA7CisgIGNvbmZpZy0+YWxwaGFfY29tcHJlc3Npb24gPSAxOworICBjb25maWctPmFscGhhX2ZpbHRlcmluZyA9IDE7CisgIGNvbmZpZy0+YWxwaGFfcXVhbGl0eSA9IDEwMDsKKyAgY29uZmlnLT5sb3NzbGVzcyA9IDA7CisgIGNvbmZpZy0+ZXhhY3QgPSAwOworICBjb25maWctPmltYWdlX2hpbnQgPSBXRUJQX0hJTlRfREVGQVVMVDsKKyAgY29uZmlnLT5lbXVsYXRlX2pwZWdfc2l6ZSA9IDA7CisgIGNvbmZpZy0+dGhyZWFkX2xldmVsID0gMDsKKyAgY29uZmlnLT5sb3dfbWVtb3J5ID0gMDsKKyAgY29uZmlnLT5uZWFyX2xvc3NsZXNzID0gMTAwOworICBjb25maWctPnVzZV9kZWx0YV9wYWxldHRlID0gMDsKKyAgY29uZmlnLT51c2Vfc2hhcnBfeXV2ID0gMDsKKworICAvLyBUT0RPKHNrYWwpOiB0dW5lLgorICBzd2l0Y2ggKHByZXNldCkgeworICAgIGNhc2UgV0VCUF9QUkVTRVRfUElDVFVSRToKKyAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gODA7CisgICAgICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSA0OworICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAzNTsKKyAgICAgIGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmPSB+MjsgICAvLyBubyBkaXRoZXJpbmcKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0VCUF9QUkVTRVRfUEhPVE86CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDgwOworICAgICAgY29uZmlnLT5maWx0ZXJfc2hhcnBuZXNzID0gMzsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMzA7CisgICAgICBjb25maWctPnByZXByb2Nlc3NpbmcgfD0gMjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0VCUF9QUkVTRVRfRFJBV0lORzoKKyAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gMjU7CisgICAgICBjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPSA2OworICAgICAgY29uZmlnLT5maWx0ZXJfc3RyZW5ndGggPSAxMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgV0VCUF9QUkVTRVRfSUNPTjoKKyAgICAgIGNvbmZpZy0+c25zX3N0cmVuZ3RoID0gMDsKKyAgICAgIGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoID0gMDsgICAvLyBkaXNhYmxlIGZpbHRlcmluZyB0byByZXRhaW4gc2hhcnBuZXNzCisgICAgICBjb25maWctPnByZXByb2Nlc3NpbmcgJj0gfjI7ICAgLy8gbm8gZGl0aGVyaW5nCisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX1RFWFQ6CisgICAgICBjb25maWctPnNuc19zdHJlbmd0aCA9IDA7CisgICAgICBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA9IDA7ICAgLy8gZGlzYWJsZSBmaWx0ZXJpbmcgdG8gcmV0YWluIHNoYXJwbmVzcworICAgICAgY29uZmlnLT5wcmVwcm9jZXNzaW5nICY9IH4yOyAgIC8vIG5vIGRpdGhlcmluZworICAgICAgY29uZmlnLT5zZWdtZW50cyA9IDI7CisgICAgICBicmVhazsKKyAgICBjYXNlIFdFQlBfUFJFU0VUX0RFRkFVTFQ6CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBXZWJQVmFsaWRhdGVDb25maWcoY29uZmlnKTsKK30KKworaW50IFdlYlBWYWxpZGF0ZUNvbmZpZyhjb25zdCBXZWJQQ29uZmlnKiBjb25maWcpIHsKKyAgaWYgKGNvbmZpZyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cXVhbGl0eSA8IDAgfHwgY29uZmlnLT5xdWFsaXR5ID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dGFyZ2V0X3NpemUgPCAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dGFyZ2V0X1BTTlIgPCAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+bWV0aG9kIDwgMCB8fCBjb25maWctPm1ldGhvZCA+IDYpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5zZWdtZW50cyA8IDEgfHwgY29uZmlnLT5zZWdtZW50cyA+IDQpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5zbnNfc3RyZW5ndGggPCAwIHx8IGNvbmZpZy0+c25zX3N0cmVuZ3RoID4gMTAwKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+ZmlsdGVyX3N0cmVuZ3RoIDwgMCB8fCBjb25maWctPmZpbHRlcl9zdHJlbmd0aCA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmZpbHRlcl9zaGFycG5lc3MgPCAwIHx8IGNvbmZpZy0+ZmlsdGVyX3NoYXJwbmVzcyA+IDcpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5maWx0ZXJfdHlwZSA8IDAgfHwgY29uZmlnLT5maWx0ZXJfdHlwZSA+IDEpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hdXRvZmlsdGVyIDwgMCB8fCBjb25maWctPmF1dG9maWx0ZXIgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cGFzcyA8IDEgfHwgY29uZmlnLT5wYXNzID4gMTApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5zaG93X2NvbXByZXNzZWQgPCAwIHx8IGNvbmZpZy0+c2hvd19jb21wcmVzc2VkID4gMSkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPnByZXByb2Nlc3NpbmcgPCAwIHx8IGNvbmZpZy0+cHJlcHJvY2Vzc2luZyA+IDcpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5wYXJ0aXRpb25zIDwgMCB8fCBjb25maWctPnBhcnRpdGlvbnMgPiAzKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+cGFydGl0aW9uX2xpbWl0IDwgMCB8fCBjb25maWctPnBhcnRpdGlvbl9saW1pdCA+IDEwMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmFscGhhX2NvbXByZXNzaW9uIDwgMCkgcmV0dXJuIDA7CisgIGlmIChjb25maWctPmFscGhhX2ZpbHRlcmluZyA8IDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5hbHBoYV9xdWFsaXR5IDwgMCB8fCBjb25maWctPmFscGhhX3F1YWxpdHkgPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5sb3NzbGVzcyA8IDAgfHwgY29uZmlnLT5sb3NzbGVzcyA+IDEpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5uZWFyX2xvc3NsZXNzIDwgMCB8fCBjb25maWctPm5lYXJfbG9zc2xlc3MgPiAxMDApIHJldHVybiAwOworICBpZiAoY29uZmlnLT5pbWFnZV9oaW50ID49IFdFQlBfSElOVF9MQVNUKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPCAwIHx8IGNvbmZpZy0+ZW11bGF0ZV9qcGVnX3NpemUgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dGhyZWFkX2xldmVsIDwgMCB8fCBjb25maWctPnRocmVhZF9sZXZlbCA+IDEpIHJldHVybiAwOworICBpZiAoY29uZmlnLT5sb3dfbWVtb3J5IDwgMCB8fCBjb25maWctPmxvd19tZW1vcnkgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+ZXhhY3QgPCAwIHx8IGNvbmZpZy0+ZXhhY3QgPiAxKSByZXR1cm4gMDsKKyAgaWYgKGNvbmZpZy0+dXNlX2RlbHRhX3BhbGV0dGUgPCAwIHx8IGNvbmZpZy0+dXNlX2RlbHRhX3BhbGV0dGUgPiAxKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvbmZpZy0+dXNlX3NoYXJwX3l1diA8IDAgfHwgY29uZmlnLT51c2Vfc2hhcnBfeXV2ID4gMSkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgTUFYX0xFVkVMIDkKKworLy8gTWFwcGluZyBiZXR3ZWVuIC16IGxldmVsIGFuZCAtbSAvIC1xIHBhcmFtZXRlciBzZXR0aW5ncy4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworICB1aW50OF90IG1ldGhvZF87CisgIHVpbnQ4X3QgcXVhbGl0eV87Cit9IGtMb3NzbGVzc1ByZXNldHNbTUFYX0xFVkVMICsgMV0gPSB7CisgIHsgMCwgIDAgfSwgeyAxLCAyMCB9LCB7IDIsIDI1IH0sIHsgMywgMzAgfSwgeyAzLCA1MCB9LAorICB7IDQsIDUwIH0sIHsgNCwgNzUgfSwgeyA0LCA5MCB9LCB7IDUsIDkwIH0sIHsgNiwgMTAwIH0KK307CisKK2ludCBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoV2ViUENvbmZpZyogY29uZmlnLCBpbnQgbGV2ZWwpIHsKKyAgaWYgKGNvbmZpZyA9PSBOVUxMIHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IE1BWF9MRVZFTCkgcmV0dXJuIDA7CisgIGNvbmZpZy0+bG9zc2xlc3MgPSAxOworICBjb25maWctPm1ldGhvZCA9IGtMb3NzbGVzc1ByZXNldHNbbGV2ZWxdLm1ldGhvZF87CisgIGNvbmZpZy0+cXVhbGl0eSA9IGtMb3NzbGVzc1ByZXNldHNbbGV2ZWxdLnF1YWxpdHlfOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTc3YzExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb3N0X2VuYy5jCkBAIC0wLDAgKzEsMzQ2IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQ29zdCB0YWJsZXMgZm9yIGxldmVsIGFuZCBtb2RlcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2Nvc3RfZW5jLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMZXZlbCBjb3N0IHRhYmxlcworCisvLyBGb3IgZWFjaCBnaXZlbiBsZXZlbCwgdGhlIGZvbGxvd2luZyB0YWJsZSBnaXZlcyB0aGUgcGF0dGVybiBvZiBjb250ZXh0cyB0bworLy8gdXNlIGZvciBjb2RpbmcgaXQgKGluIFtdWzBdKSBhcyB3ZWxsIGFzIHRoZSBiaXQgdmFsdWUgdG8gdXNlIGZvciBlYWNoCisvLyBjb250ZXh0IChpbiBbXVsxXSkuCitjb25zdCB1aW50MTZfdCBWUDhMZXZlbENvZGVzW01BWF9WQVJJQUJMRV9MRVZFTF1bMl0gPSB7CisgICAgICAgICAgICAgICAgICB7MHgwMDEsIDB4MDAwfSwgezB4MDA3LCAweDAwMX0sIHsweDAwZiwgMHgwMDV9LAorICB7MHgwMGYsIDB4MDBkfSwgezB4MDMzLCAweDAwM30sIHsweDAzMywgMHgwMDN9LCB7MHgwMzMsIDB4MDIzfSwKKyAgezB4MDMzLCAweDAyM30sIHsweDAzMywgMHgwMjN9LCB7MHgwMzMsIDB4MDIzfSwgezB4MGQzLCAweDAxM30sCisgIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LAorICB7MHgwZDMsIDB4MDEzfSwgezB4MGQzLCAweDAxM30sIHsweDBkMywgMHgwMTN9LCB7MHgwZDMsIDB4MDkzfSwKKyAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sCisgIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LAorICB7MHgwZDMsIDB4MDkzfSwgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwKKyAgezB4MGQzLCAweDA5M30sIHsweDBkMywgMHgwOTN9LCB7MHgwZDMsIDB4MDkzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwKKyAgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sCisgIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LAorICB7MHgxNTMsIDB4MDUzfSwgezB4MTUzLCAweDA1M30sIHsweDE1MywgMHgwNTN9LCB7MHgxNTMsIDB4MTUzfQorfTsKKworc3RhdGljIGludCBWYXJpYWJsZUxldmVsQ29zdChpbnQgbGV2ZWwsIGNvbnN0IHVpbnQ4X3QgcHJvYmFzW05VTV9QUk9CQVNdKSB7CisgIGludCBwYXR0ZXJuID0gVlA4TGV2ZWxDb2Rlc1tsZXZlbCAtIDFdWzBdOworICBpbnQgYml0cyA9IFZQOExldmVsQ29kZXNbbGV2ZWwgLSAxXVsxXTsKKyAgaW50IGNvc3QgPSAwOworICBpbnQgaTsKKyAgZm9yIChpID0gMjsgcGF0dGVybjsgKytpKSB7CisgICAgaWYgKHBhdHRlcm4gJiAxKSB7CisgICAgICBjb3N0ICs9IFZQOEJpdENvc3QoYml0cyAmIDEsIHByb2Jhc1tpXSk7CisgICAgfQorICAgIGJpdHMgPj49IDE7CisgICAgcGF0dGVybiA+Pj0gMTsKKyAgfQorICByZXR1cm4gY29zdDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByZS1jYWxjIGxldmVsIGNvc3RzIG9uY2UgZm9yIGFsbAorCit2b2lkIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhKSB7CisgIGludCBjdHlwZSwgYmFuZCwgY3R4OworCisgIGlmICghcHJvYmEtPmRpcnR5XykgcmV0dXJuOyAgLy8gbm90aGluZyB0byBkby4KKworICBmb3IgKGN0eXBlID0gMDsgY3R5cGUgPCBOVU1fVFlQRVM7ICsrY3R5cGUpIHsKKyAgICBpbnQgbjsKKyAgICBmb3IgKGJhbmQgPSAwOyBiYW5kIDwgTlVNX0JBTkRTOyArK2JhbmQpIHsKKyAgICAgIGZvciAoY3R4ID0gMDsgY3R4IDwgTlVNX0NUWDsgKytjdHgpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcCA9IHByb2JhLT5jb2VmZnNfW2N0eXBlXVtiYW5kXVtjdHhdOworICAgICAgICB1aW50MTZfdCogY29uc3QgdGFibGUgPSBwcm9iYS0+bGV2ZWxfY29zdF9bY3R5cGVdW2JhbmRdW2N0eF07CisgICAgICAgIGNvbnN0IGludCBjb3N0MCA9IChjdHggPiAwKSA/IFZQOEJpdENvc3QoMSwgcFswXSkgOiAwOworICAgICAgICBjb25zdCBpbnQgY29zdF9iYXNlID0gVlA4Qml0Q29zdCgxLCBwWzFdKSArIGNvc3QwOworICAgICAgICBpbnQgdjsKKyAgICAgICAgdGFibGVbMF0gPSBWUDhCaXRDb3N0KDAsIHBbMV0pICsgY29zdDA7CisgICAgICAgIGZvciAodiA9IDE7IHYgPD0gTUFYX1ZBUklBQkxFX0xFVkVMOyArK3YpIHsKKyAgICAgICAgICB0YWJsZVt2XSA9IGNvc3RfYmFzZSArIFZhcmlhYmxlTGV2ZWxDb3N0KHYsIHApOworICAgICAgICB9CisgICAgICAgIC8vIFN0YXJ0aW5nIGF0IGxldmVsIDY3IGFuZCB1cCwgdGhlIHZhcmlhYmxlIHBhcnQgb2YgdGhlIGNvc3QgaXMKKyAgICAgICAgLy8gYWN0dWFsbHkgY29uc3RhbnQuCisgICAgICB9CisgICAgfQorICAgIGZvciAobiA9IDA7IG4gPCAxNjsgKytuKSB7ICAgIC8vIHJlcGxpY2F0ZSBiYW5kcy4gV2UgZG9uJ3QgbmVlZCB0byBzZW50aW5lbC4KKyAgICAgIGZvciAoY3R4ID0gMDsgY3R4IDwgTlVNX0NUWDsgKytjdHgpIHsKKyAgICAgICAgcHJvYmEtPnJlbWFwcGVkX2Nvc3RzX1tjdHlwZV1bbl1bY3R4XSA9CisgICAgICAgICAgICBwcm9iYS0+bGV2ZWxfY29zdF9bY3R5cGVdW1ZQOEVuY0JhbmRzW25dXVtjdHhdOworICAgICAgfQorICAgIH0KKyAgfQorICBwcm9iYS0+ZGlydHlfID0gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1vZGUgY29zdCB0YWJsZXMuCisKKy8vIFRoZXNlIGFyZSB0aGUgZml4ZWQgcHJvYmFiaWxpdGllcyAoaW4gdGhlIGNvZGluZyB0cmVlcykgdHVybmVkIGludG8gYml0LWNvc3QKKy8vIGJ5IGNhbGxpbmcgVlA4Qml0Q29zdCgpLgorY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c1VWWzRdID0geyAzMDIsIDk4NCwgNDM5LCA2NDIgfTsKKy8vIG5vdGU6IHRoZXNlIHZhbHVlcyBpbmNsdWRlIHRoZSBmaXhlZCBWUDhCaXRDb3N0KDEsIDE0NSkgbW9kZSBzZWxlY3Rpb24gY29zdC4KK2NvbnN0IHVpbnQxNl90IFZQOEZpeGVkQ29zdHNJMTZbNF0gPSB7IDY2MywgOTE5LCA4NzIsIDkxOSB9OworY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0k0W05VTV9CTU9ERVNdW05VTV9CTU9ERVNdW05VTV9CTU9ERVNdID0geworICB7IHsgICA0MCwgMTE1MSwgMTcyMywgMTg3NCwgMjEwMywgMjAxOSwgMTYyOCwgMTc3NywgMjIyNiwgMjEzNyB9LAorICAgIHsgIDE5MiwgIDQ2OSwgMTI5NiwgMTMwOCwgMTg0OSwgMTc5NCwgMTc4MSwgMTcwMywgMTcxMywgMTUyMiB9LAorICAgIHsgIDE0MiwgIDkxMCwgIDc2MiwgMTY4NCwgMTg0OSwgMTU3NiwgMTQ2MCwgMTMwNSwgMTgwMSwgMTY1NyB9LAorICAgIHsgIDU1OSwgIDY0MSwgMTM3MCwgIDQyMSwgMTE4MiwgMTU2OSwgMTYxMiwgMTcyNSwgIDg2MywgMTAwNyB9LAorICAgIHsgIDI5OSwgMTA1OSwgMTI1NiwgMTEwOCwgIDYzNiwgMTA2OCwgMTU4MSwgMTg4MywgIDg2OSwgMTE0MiB9LAorICAgIHsgIDI3NywgMTExMSwgIDcwNywgMTM2MiwgMTA4OSwgIDY3MiwgMTYwMywgMTU0MSwgMTU0NSwgMTI5MSB9LAorICAgIHsgIDIxNCwgIDc4MSwgMTYwOSwgMTMwMywgMTYzMiwgMjIyOSwgIDcyNiwgMTU2MCwgMTcxMywgIDkxOCB9LAorICAgIHsgIDE1MiwgMTAzNywgMTA0NiwgMTc1OSwgMTk4MywgMjE3NCwgMTM1OCwgIDc0MiwgMTc0MCwgMTM5MCB9LAorICAgIHsgIDUxMiwgMTA0NiwgMTQyMCwgIDc1MywgIDc1MiwgMTI5NywgMTQ4NiwgMTYxMywgIDQ2MCwgMTIwNyB9LAorICAgIHsgIDQyNCwgIDgyNywgMTM2MiwgIDcxOSwgMTQ2MiwgMTIwMiwgMTE5OSwgMTQ3NiwgMTE5OSwgIDUzOCB9IH0sCisgIHsgeyAgMjQwLCAgNDAyLCAxMTM0LCAxNDkxLCAxNjU5LCAxNTA1LCAxNTE3LCAxNTU1LCAxOTc5LCAyMDk5IH0sCisgICAgeyAgNDY3LCAgMjQyLCAgOTYwLCAxMjMyLCAxNzE0LCAxNjIwLCAxODM0LCAxNTcwLCAxNjc2LCAxMzkxIH0sCisgICAgeyAgNTAwLCAgNDU1LCAgNDYzLCAxNTA3LCAxNjk5LCAxMjgyLCAxNTY0LCAgOTgyLCAyMTE0LCAyMTE0IH0sCisgICAgeyAgNjcyLCAgNjQzLCAxMzcyLCAgMzMxLCAxNTg5LCAxNjY3LCAxNDUzLCAxOTM4LCAgOTk2LCAgODc2IH0sCisgICAgeyAgNDU4LCAgNzgzLCAxMDM3LCAgOTExLCAgNzM4LCAgOTY4LCAxMTY1LCAxNTE4LCAgODU5LCAxMDMzIH0sCisgICAgeyAgNTA0LCAgODE1LCAgNTA0LCAxMTM5LCAxMjE5LCAgNzE5LCAxNTA2LCAxMDg1LCAxMjY4LCAxMjY4IH0sCisgICAgeyAgMzMzLCAgNjMwLCAxNDQ1LCAxMjM5LCAxODgzLCAzNjcyLCAgNzk5LCAxNTQ4LCAxODY1LCAgNTk4IH0sCisgICAgeyAgMzk5LCAgNjQ0LCAgNzQ2LCAxMzQyLCAxODU2LCAxMzUwLCAxNDkzLCAgNjEzLCAxODU1LCAxMDE1IH0sCisgICAgeyAgNjIyLCAgNzQ5LCAxMjA1LCAgNjA4LCAxMDY2LCAxNDA4LCAxMjkwLCAxNDA2LCAgNTQ2LCAgOTcxIH0sCisgICAgeyAgNTAwLCAgNzUzLCAxMDQxLCAgNjY4LCAxMjMwLCAxNjE3LCAxMjk3LCAxNDI1LCAxMzgzLCAgNTIzIH0gfSwKKyAgeyB7ICAzOTQsICA1NTMsICA1MjMsIDE1MDIsIDE1MzYsICA5ODEsIDE2MDgsIDExNDIsIDE2NjYsIDIxODEgfSwKKyAgICB7ICA2NTUsICA0MzAsICAzNzUsIDE0MTEsIDE4NjEsIDEyMjAsIDE2NzcsIDExMzUsIDE5NzgsIDE1NTMgfSwKKyAgICB7ICA2OTAsICA2NDAsICAyNDUsIDE5NTQsIDIwNzAsIDExOTQsIDE1MjgsICA5ODIsIDE5NzIsIDIyMzIgfSwKKyAgICB7ICA1NTksICA4MzQsICA3NDEsICA4NjcsIDExMzEsICA5ODAsIDEyMjUsICA4NTIsIDEwOTIsICA3ODQgfSwKKyAgICB7ICA2OTAsICA4NzUsICA1MTYsICA5NTksICA2NzMsICA4OTQsIDEwNTYsIDExOTAsIDE1MjgsIDExMjYgfSwKKyAgICB7ICA3NDAsICA5NTEsICAzODQsIDEyNzcsIDExNzcsICA0OTIsIDE1NzksIDExNTUsIDE4NDYsIDE1MTMgfSwKKyAgICB7ICAzMjMsICA3NzUsIDEwNjIsIDE3NzYsIDMwNjIsIDEyNzQsICA4MTMsIDExODgsIDEzNzIsICA2NTUgfSwKKyAgICB7ICA0ODgsICA5NzEsICA0ODQsIDE3NjcsIDE1MTUsIDE3NzUsIDExMTUsICA1MDMsIDE1MzksIDE0NjEgfSwKKyAgICB7ICA3NDAsIDEwMDYsICA5OTgsICA3MDksICA4NTEsIDEyMzAsIDEzMzcsICA3ODgsICA3NDEsICA3MjEgfSwKKyAgICB7ICA1MjIsIDEwNzMsICA1NzMsIDEwNDUsIDEzNDYsICA4ODcsIDEwNDYsIDExNDYsIDEyMDMsICA2OTcgfSB9LAorICB7IHsgIDEwNSwgIDg2NCwgMTQ0MiwgMTAwOSwgMTkzNCwgMTg0MCwgMTUxOSwgMTkyMCwgMTY3MywgMTU3OSB9LAorICAgIHsgIDUzNCwgIDMwNSwgMTE5MywgIDY4MywgMTM4OCwgMjE2NCwgMTgwMiwgMTg5NCwgMTI2NCwgMTE3MCB9LAorICAgIHsgIDMwNSwgIDUxOCwgIDg3NywgMTEwOCwgMTQyNiwgMzIxNSwgMTQyNSwgMTA2NCwgMTMyMCwgMTI0MiB9LAorICAgIHsgIDY4MywgIDczMiwgMTkyNywgIDI1NywgMTQ5MywgMjA0OCwgMTg1OCwgMTU1MiwgMTA1NSwgIDk0NyB9LAorICAgIHsgIDM5NCwgIDgxNCwgMTAyNCwgIDY2MCwgIDk1OSwgMTU1NiwgMTI4MiwgMTI4OSwgIDg5MywgMTA0NyB9LAorICAgIHsgIDUyOCwgIDYxNSwgIDk5NiwgIDk0MCwgMTIwMSwgIDYzNSwgMTA5NCwgMjUxNSwgIDgwMywgMTM1OCB9LAorICAgIHsgIDM0NywgIDYxNCwgMTYwOSwgMTE4NywgMzEzMywgMTM0NSwgMTAwNywgMTMzOSwgMTAxNywgIDY2NyB9LAorICAgIHsgIDIxOCwgIDc0MCwgIDg3OCwgMTYwNSwgMzY1MCwgMzY1MCwgMTM0NSwgIDc1OCwgMTM1NywgMTYxNyB9LAorICAgIHsgIDY3MiwgIDc1MCwgMTU0MSwgIDU1OCwgMTI1NywgMTU5OSwgMTg3MCwgMjEzNSwgIDQwMiwgMTA4NyB9LAorICAgIHsgIDU5MiwgIDY4NCwgMTE2MSwgIDQzMCwgMTA5MiwgMTQ5NywgMTQ3NSwgMTQ4OSwgMTA5NSwgIDgyMiB9IH0sCisgIHsgeyAgMjI4LCAxMDU2LCAxMDU5LCAxMzY4LCAgNzUyLCAgOTgyLCAxNTEyLCAxNTE4LCAgOTg3LCAxNzgyIH0sCisgICAgeyAgNDk0LCAgNTE0LCAgODE4LCAgOTQyLCAgOTY1LCAgODkyLCAxNjEwLCAxMzU2LCAxMDQ4LCAxMzYzIH0sCisgICAgeyAgNTEyLCAgNjQ4LCAgNTkxLCAxMDQyLCAgNzYxLCAgOTkxLCAxMTk2LCAxNDU0LCAxMzA5LCAxNDYzIH0sCisgICAgeyAgNjgzLCAgNzQ5LCAxMDQzLCAgNjc2LCAgODQxLCAxMzk2LCAxMTMzLCAxMTM4LCAgNjU0LCAgOTM5IH0sCisgICAgeyAgNjIyLCAxMTAxLCAxMTI2LCAgOTk0LCAgMzYxLCAxMDc3LCAxMjAzLCAxMzE4LCAgODc3LCAxMjE5IH0sCisgICAgeyAgNjMxLCAxMDY4LCAgODU3LCAxNjUwLCAgNjUxLCAgNDc3LCAxNjUwLCAxNDE5LCAgODI4LCAxMTcwIH0sCisgICAgeyAgNTU1LCAgNzI3LCAxMDY4LCAxMzM1LCAzMTI3LCAxMzM5LCAgODIwLCAxMzMxLCAxMDc3LCAgNDI5IH0sCisgICAgeyAgNTA0LCAgODc5LCAgNjI0LCAxMzk4LCAgODg5LCAgODg5LCAxMzkyLCAgODA4LCAgODkxLCAxNDA2IH0sCisgICAgeyAgNjgzLCAxNjAyLCAxMjg5LCAgOTc3LCAgNTc4LCAgOTgzLCAxMjgwLCAxNzA4LCAgNDA2LCAxMTIyIH0sCisgICAgeyAgMzk5LCAgODY1LCAxNDMzLCAxMDcwLCAxMDcyLCAgNzY0LCAgOTY4LCAxNDc3LCAxMjIzLCAgNjc4IH0gfSwKKyAgeyB7ICAzMzMsICA3NjAsICA5MzUsIDE2MzgsIDEwMTAsICA1MjksIDE2NDYsIDE0MTAsIDE0NzIsIDIyMTkgfSwKKyAgICB7ICA1MTIsICA0OTQsICA3NTAsIDExNjAsIDEyMTUsICA2MTAsIDE4NzAsIDE4NjgsIDE2MjgsIDExNjkgfSwKKyAgICB7ICA1NzIsICA2NDYsICA0OTIsIDE5MzQsIDEyMDgsICA2MDMsIDE1ODAsIDEwOTksIDEzOTgsIDE5OTUgfSwKKyAgICB7ICA3ODYsICA3ODksICA5NDIsICA1ODEsIDEwMTgsICA5NTEsIDE1OTksIDEyMDcsICA3MzEsICA3NjggfSwKKyAgICB7ICA2OTAsIDEwMTUsICA2NzIsIDEwNzgsICA1ODIsICA1MDQsIDE2OTMsIDE0MzgsIDExMDgsIDI4OTcgfSwKKyAgICB7ICA3NjgsIDEyNjcsICA1NzEsIDIwMDUsIDEyNDMsICAyNDQsIDI4ODEsIDEzODAsIDE3ODYsIDE0NTMgfSwKKyAgICB7ICA0NTIsICA4OTksIDEyOTMsICA5MDMsIDEzMTEsIDMxMDAsICA0NjUsIDEzMTEsIDEzMTksICA4MTMgfSwKKyAgICB7ICAzOTQsICA5MjcsICA5NDIsIDExMDMsIDEzNTgsIDExMDQsICA5NDYsICA1OTMsIDEzNjMsIDExMDkgfSwKKyAgICB7ICA1NTksIDEwMDUsIDEwMDcsIDEwMTYsICA2NTgsIDExNzMsIDEwMjEsIDExNjQsICA2MjMsIDEwMjggfSwKKyAgICB7ICA1NjQsICA3OTYsICA2MzIsIDEwMDUsIDEwMTQsICA4NjMsIDIzMTYsIDEyNjgsICA5MzgsICA3NjQgfSB9LAorICB7IHsgIDI2NiwgIDYwNiwgMTA5OCwgMTIyOCwgMTQ5NywgMTI0MywgIDk0OCwgMTAzMCwgMTczNCwgMTQ2MSB9LAorICAgIHsgIDM2NiwgIDU4NSwgIDkwMSwgMTA2MCwgMTQwNywgMTI0NywgIDg3NiwgMTEzNCwgMTYyMCwgMTA1NCB9LAorICAgIHsgIDQ1MiwgIDU2NSwgIDU0MiwgMTcyOSwgMTQ3OSwgMTQ3OSwgMTAxNiwgIDg4NiwgMjkzOCwgMTE1MCB9LAorICAgIHsgIDU1NSwgMTA4OCwgMTUzMywgIDk1MCwgMTM1NCwgIDg5NSwgIDgzNCwgMTAxOSwgMTAyMSwgIDQ5NiB9LAorICAgIHsgIDcwNCwgIDgxNSwgMTE5MywgIDk3MSwgIDk3MywgIDY0MCwgMTIxNywgMjIxNCwgIDgzMiwgIDU3OCB9LAorICAgIHsgIDY3MiwgMTI0NSwgIDU3OSwgIDg3MSwgIDg3NSwgIDc3NCwgIDg3MiwgMTI3MywgMTAyNywgIDk0OSB9LAorICAgIHsgIDI5NiwgMTEzNCwgMjA1MCwgMTc4NCwgMTYzNiwgMzQyNSwgIDQ0MiwgMTU1MCwgMjA3NiwgIDcyMiB9LAorICAgIHsgIDM0MiwgIDk4MiwgMTI1OSwgMTg0NiwgMTg0OCwgMTg0OCwgIDYyMiwgIDU2OCwgMTg0NywgMTA1MiB9LAorICAgIHsgIDU1NSwgMTA2NCwgMTMwNCwgIDgyOCwgIDc0NiwgMTM0MywgMTA3NSwgMTMyOSwgMTA3OCwgIDQ5NCB9LAorICAgIHsgIDI4OCwgMTE2NywgMTI4NSwgMTE3NCwgMTYzOSwgMTYzOSwgIDgzMywgMjI1NCwgMTMwNCwgIDUwOSB9IH0sCisgIHsgeyAgMzQyLCAgNzE5LCAgNzY3LCAxODY2LCAxNzU3LCAxMjcwLCAxMjQ2LCAgNTUwLCAxNzQ2LCAyMTUxIH0sCisgICAgeyAgNDgzLCAgNjUzLCAgNjk0LCAxNTA5LCAxNDU5LCAxNDEwLCAxMjE4LCAgNTA3LCAxOTE0LCAxMjY2IH0sCisgICAgeyAgNDg4LCAgNzU3LCAgNDQ3LCAyOTc5LCAxODEzLCAxMjY4LCAxNjU0LCAgNTM5LCAxODQ5LCAyMTA5IH0sCisgICAgeyAgNTIyLCAxMDk3LCAxMDg1LCAgODUxLCAxMzY1LCAxMTExLCAgODUxLCAgOTAxLCAgOTYxLCAgNjA1IH0sCisgICAgeyAgNzA5LCAgNzE2LCAgODQxLCAgNzI4LCAgNzM2LCAgOTQ1LCAgOTQxLCAgODYyLCAyODQ1LCAxMDU3IH0sCisgICAgeyAgNTEyLCAxMzIzLCAgNTAwLCAxMzM2LCAxMDgzLCAgNjgxLCAxMzQyLCAgNzE3LCAxNjA0LCAxMzUwIH0sCisgICAgeyAgNDUyLCAxMTU1LCAxMzcyLCAxOTAwLCAxNTAxLCAzMjkwLCAgMzExLCAgOTQ0LCAxOTE5LCAgOTIyIH0sCisgICAgeyAgNDAzLCAxNTIwLCAgOTc3LCAyMTMyLCAxNzMzLCAzNTIyLCAxMDc2LCAgMjc2LCAzMzM1LCAxNTQ3IH0sCisgICAgeyAgNTU5LCAxMzc0LCAxMTAxLCAgNjE1LCAgNjczLCAyNDYyLCAgOTc0LCAgNzk1LCAgOTg0LCAgOTg0IH0sCisgICAgeyAgNTQ3LCAxMTIyLCAxMDYyLCAgODEyLCAxNDEwLCAgOTUxLCAxMTQwLCAgNjIyLCAxMjY4LCAgNjUxIH0gfSwKKyAgeyB7ICAxNjUsICA5ODIsIDEyMzUsICA5MzgsIDEzMzQsIDEzNjYsIDE2NTksIDE1NzgsICA5NjQsIDE2MTIgfSwKKyAgICB7ICA1OTIsICA0MjIsICA5MjUsICA4NDcsIDExMzksIDExMTIsIDEzODcsIDIwMzYsICA4NjEsIDEwNDEgfSwKKyAgICB7ICA0MDMsICA4MzcsICA3MzIsICA3NzAsICA5NDEsIDE2NTgsIDEyNTAsICA4MDksIDE0MDcsIDE0MDcgfSwKKyAgICB7ICA4OTYsICA4NzQsIDEwNzEsICAzODEsIDE1NjgsIDE3MjIsIDE0MzcsIDIxOTIsICA0ODAsIDEwMzUgfSwKKyAgICB7ICA2NDAsIDEwOTgsIDEwMTIsIDEwMzIsICA2ODQsIDEzODIsIDE1ODEsIDIxMDYsICA0MTYsICA4NjUgfSwKKyAgICB7ICA1NTksIDEwMDUsICA4MTksICA5MTQsICA3MTAsICA3NzAsIDE0MTgsICA5MjAsICA4MzgsIDE0MzUgfSwKKyAgICB7ICA0MTUsIDEyNTgsIDEyNDUsICA4NzAsIDEyNzgsIDMwNjcsICA3NzAsIDEwMjEsIDEyODcsICA1MjIgfSwKKyAgICB7ICA0MDYsICA5OTAsICA2MDEsIDEwMDksIDEyNjUsIDEyNjUsIDEyNjcsICA3NTksIDEwMTcsIDEyNzcgfSwKKyAgICB7ICA5NjgsIDExODIsIDEzMjksICA3ODgsIDEwMzIsIDEyOTIsIDE3MDUsIDE3MTQsICAyMDMsIDE0MDMgfSwKKyAgICB7ICA3MzIsICA4NzcsIDEyNzksICA0NzEsICA5MDEsIDExNjEsIDE1NDUsIDEyOTQsICA3NTUsICA3NTUgfSB9LAorICB7IHsgIDExMSwgIDkzMSwgMTM3OCwgMTE4NSwgMTkzMywgMTY0OCwgMTE0OCwgMTcxNCwgMTg3MywgMTMwNyB9LAorICAgIHsgIDQwNiwgIDQxNCwgMTAzMCwgMTAyMywgMTkxMCwgMTQwNCwgMTMxMywgMTY0NywgMTUwOSwgIDc5MyB9LAorICAgIHsgIDM0MiwgIDY0MCwgIDU3NSwgMTA4OCwgMTI0MSwgMTM0OSwgMTE2MSwgMTM1MCwgMTc1NiwgMTUwMiB9LAorICAgIHsgIDU1OSwgIDc2NiwgMTE4NSwgIDM1NywgMTY4MiwgMTQyOCwgMTMyOSwgMTg5NywgMTIxOSwgIDgwMiB9LAorICAgIHsgIDQ3MywgIDkwOSwgMTE2NCwgIDc3MSwgIDcxOSwgMjUwOCwgMTQyNywgMTQzMiwgIDcyMiwgIDc4MiB9LAorICAgIHsgIDM0MiwgIDg5MiwgIDc4NSwgMTE0NSwgMTE1MCwgIDc5NCwgMTI5NiwgMTU1MCwgIDk3MywgMTA1NyB9LAorICAgIHsgIDIwOCwgMTAzNiwgMTMyNiwgMTM0MywgMTYwNiwgMzM5NSwgIDgxNSwgMTQ1NSwgMTYxOCwgIDcxMiB9LAorICAgIHsgIDIyOCwgIDkyOCwgIDg5MCwgMTA0NiwgMzQ5OSwgMTcxMSwgIDk5NCwgIDgyOSwgMTcyMCwgMTMxOCB9LAorICAgIHsgIDc2OCwgIDcyNCwgMTA1OCwgIDYzNiwgIDk5MSwgMTA3NSwgMTMxOSwgMTMyNCwgIDYxNiwgIDgyNSB9LAorICAgIHsgIDMwNSwgMTE2NywgMTM1OCwgIDg5OSwgMTU4NywgMTU4NywgIDk4NywgMTk4OCwgMTMzMiwgIDUwMSB9IH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciByZXNpZHVhbHMgc3RydWN0IFZQOFJlc2lkdWFsLgorCit2b2lkIFZQOEluaXRSZXNpZHVhbChpbnQgZmlyc3QsIGludCBjb2VmZl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgVlA4RW5jb2RlciogY29uc3QgZW5jLCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIHJlcy0+Y29lZmZfdHlwZSA9IGNvZWZmX3R5cGU7CisgIHJlcy0+cHJvYiAgPSBlbmMtPnByb2JhXy5jb2VmZnNfW2NvZWZmX3R5cGVdOworICByZXMtPnN0YXRzID0gZW5jLT5wcm9iYV8uc3RhdHNfW2NvZWZmX3R5cGVdOworICByZXMtPmNvc3RzID0gZW5jLT5wcm9iYV8ucmVtYXBwZWRfY29zdHNfW2NvZWZmX3R5cGVdOworICByZXMtPmZpcnN0ID0gZmlyc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNb2RlIGNvc3RzCisKK2ludCBWUDhHZXRDb3N0THVtYTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBpbnQxNl90IGxldmVsc1sxNl0pIHsKKyAgY29uc3QgaW50IHggPSAoaXQtPmk0XyAmIDMpLCB5ID0gKGl0LT5pNF8gPj4gMik7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGludCBSID0gMDsKKyAgaW50IGN0eDsKKworICBWUDhJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKKyAgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgIFZQOFNldFJlc2lkdWFsQ29lZmZzKGxldmVscywgJnJlcyk7CisgIFIgKz0gVlA4R2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7CisgIHJldHVybiBSOworfQorCitpbnQgVlA4R2V0Q29zdEx1bWExNihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgVlA4UmVzaWR1YWwgcmVzOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaW50IHgsIHk7CisgIGludCBSID0gMDsKKworICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7ICAgLy8gcmUtaW1wb3J0IHRoZSBub24temVybyBjb250ZXh0CisKKyAgLy8gREMKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7CisgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7CisgIFIgKz0gVlA4R2V0UmVzaWR1YWxDb3N0KGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKKworICAvLyBBQworICBWUDhJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKKyAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKKyAgICAgIFIgKz0gVlA4R2V0UmVzaWR1YWxDb3N0KGN0eCwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IChyZXMubGFzdCA+PSAwKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFI7Cit9CisKK2ludCBWUDhHZXRDb3N0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGludCBjaCwgeCwgeTsKKyAgaW50IFIgPSAwOworCisgIFZQOEl0ZXJhdG9yTnpUb0J5dGVzKGl0KTsgIC8vIHJlLWltcG9ydCB0aGUgbm9uLXplcm8gY29udGV4dAorCisgIFZQOEluaXRSZXNpZHVhbCgwLCAyLCBlbmMsICZyZXMpOworICBmb3IgKGNoID0gMDsgY2ggPD0gMjsgY2ggKz0gMikgeworICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCAyOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+dXZfbGV2ZWxzW2NoICogMiArIHggKyB5ICogMl0sICZyZXMpOworICAgICAgICBSICs9IFZQOEdldFJlc2lkdWFsQ29zdChjdHgsICZyZXMpOworICAgICAgICBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSA9IGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XSA9IChyZXMubGFzdCA+PSAwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFI7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlY29yZGluZyBvZiB0b2tlbiBwcm9iYWJpbGl0aWVzLgorCisvLyBXZSBrZWVwIHRoZSB0YWJsZS1mcmVlIHZhcmlhbnQgYXJvdW5kIGZvciByZWZlcmVuY2UsIGluIGNhc2UuCisjZGVmaW5lIFVTRV9MRVZFTF9DT0RFX1RBQkxFCisKKy8vIFNpbXVsYXRlIGJsb2NrIGNvZGluZywgYnV0IG9ubHkgcmVjb3JkIHN0YXRpc3RpY3MuCisvLyBOb3RlOiBubyBuZWVkIHRvIHJlY29yZCB0aGUgZml4ZWQgcHJvYmFzLgoraW50IFZQOFJlY29yZENvZWZmcyhpbnQgY3R4LCBjb25zdCBWUDhSZXNpZHVhbCogY29uc3QgcmVzKSB7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgLy8gc2hvdWxkIGJlIHN0YXRzW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgcHJvYmFfdCogcyA9IHJlcy0+c3RhdHNbbl1bY3R4XTsKKyAgaWYgKHJlcy0+bGFzdCAgPCAwKSB7CisgICAgVlA4UmVjb3JkU3RhdHMoMCwgcyArIDApOworICAgIHJldHVybiAwOworICB9CisgIHdoaWxlIChuIDw9IHJlcy0+bGFzdCkgeworICAgIGludCB2OworICAgIFZQOFJlY29yZFN0YXRzKDEsIHMgKyAwKTsgIC8vIG9yZGVyIG9mIHJlY29yZCBkb2Vzbid0IG1hdHRlcgorICAgIHdoaWxlICgodiA9IHJlcy0+Y29lZmZzW24rK10pID09IDApIHsKKyAgICAgIFZQOFJlY29yZFN0YXRzKDAsIHMgKyAxKTsKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVswXTsKKyAgICB9CisgICAgVlA4UmVjb3JkU3RhdHMoMSwgcyArIDEpOworICAgIGlmICghVlA4UmVjb3JkU3RhdHMoMnUgPCAodW5zaWduZWQgaW50KSh2ICsgMSksIHMgKyAyKSkgeyAgLy8gdiA9IC0xIG9yIDEKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgdiA9IGFicyh2KTsKKyNpZiAhZGVmaW5lZChVU0VfTEVWRUxfQ09ERV9UQUJMRSkKKyAgICAgIGlmICghVlA4UmVjb3JkU3RhdHModiA+IDQsIHMgKyAzKSkgeworICAgICAgICBpZiAoVlA4UmVjb3JkU3RhdHModiAhPSAyLCBzICsgNCkpCisgICAgICAgICAgVlA4UmVjb3JkU3RhdHModiA9PSA0LCBzICsgNSk7CisgICAgICB9IGVsc2UgaWYgKCFWUDhSZWNvcmRTdGF0cyh2ID4gMTAsIHMgKyA2KSkgeworICAgICAgICBWUDhSZWNvcmRTdGF0cyh2ID4gNiwgcyArIDcpOworICAgICAgfSBlbHNlIGlmICghVlA4UmVjb3JkU3RhdHMoKHYgPj0gMyArICg4IDw8IDIpKSwgcyArIDgpKSB7CisgICAgICAgIFZQOFJlY29yZFN0YXRzKCh2ID49IDMgKyAoOCA8PCAxKSksIHMgKyA5KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZQOFJlY29yZFN0YXRzKCh2ID49IDMgKyAoOCA8PCAzKSksIHMgKyAxMCk7CisgICAgICB9CisjZWxzZQorICAgICAgaWYgKHYgPiBNQVhfVkFSSUFCTEVfTEVWRUwpIHsKKyAgICAgICAgdiA9IE1BWF9WQVJJQUJMRV9MRVZFTDsKKyAgICAgIH0KKworICAgICAgeworICAgICAgICBjb25zdCBpbnQgYml0cyA9IFZQOExldmVsQ29kZXNbdiAtIDFdWzFdOworICAgICAgICBpbnQgcGF0dGVybiA9IFZQOExldmVsQ29kZXNbdiAtIDFdWzBdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgKHBhdHRlcm4gPj49IDEpICE9IDA7ICsraSkgeworICAgICAgICAgIGNvbnN0IGludCBtYXNrID0gMiA8PCBpOworICAgICAgICAgIGlmIChwYXR0ZXJuICYgMSkgVlA4UmVjb3JkU3RhdHMoISEoYml0cyAmIG1hc2spLCBzICsgMyArIGkpOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsyXTsKKyAgICB9CisgIH0KKyAgaWYgKG4gPCAxNikgVlA4UmVjb3JkU3RhdHMoMCwgcyArIDApOworICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvY29zdF9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQyZDgxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9jb3N0X2VuYy5oCkBAIC0wLDAgKzEsODcgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBDb3N0IHRhYmxlcyBmb3IgbGV2ZWwgYW5kIG1vZGVzLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9FTkNfQ09TVF9FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfQ09TVF9FTkNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBPbi10aGUtZmx5IGluZm8gYWJvdXQgdGhlIGN1cnJlbnQgc2V0IG9mIHJlc2lkdWFscy4gSGFuZHkgdG8gYXZvaWQKKy8vIHBhc3NpbmcgemlsbGlvbnMgb2YgcGFyYW1zLgordHlwZWRlZiBzdHJ1Y3QgVlA4UmVzaWR1YWwgVlA4UmVzaWR1YWw7CitzdHJ1Y3QgVlA4UmVzaWR1YWwgeworICBpbnQgZmlyc3Q7CisgIGludCBsYXN0OworICBjb25zdCBpbnQxNl90KiBjb2VmZnM7CisKKyAgaW50IGNvZWZmX3R5cGU7CisgIFByb2JhQXJyYXkqICAgcHJvYjsKKyAgU3RhdHNBcnJheSogICBzdGF0czsKKyAgQ29zdEFycmF5UHRyICBjb3N0czsKK307CisKK3ZvaWQgVlA4SW5pdFJlc2lkdWFsKGludCBmaXJzdCwgaW50IGNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOFJlc2lkdWFsKiBjb25zdCByZXMpOworCitpbnQgVlA4UmVjb3JkQ29lZmZzKGludCBjdHgsIGNvbnN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMpOworCisvLyBSZWNvcmQgcHJvYmEgY29udGV4dCB1c2VkLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSZWNvcmRTdGF0cyhpbnQgYml0LCBwcm9iYV90KiBjb25zdCBzdGF0cykgeworICBwcm9iYV90IHAgPSAqc3RhdHM7CisgIC8vIEFuIG92ZXJmbG93IGlzIGluYm91bmQuIE5vdGUgd2UgaGFuZGxlIHRoaXMgYXQgMHhmZmZlMDAwMHUgaW5zdGVhZCBvZgorICAvLyAweGZmZmYwMDAwdSB0byBtYWtlIHN1cmUgcCArIDF1IGRvZXMgbm90IG92ZXJmbG93LgorICBpZiAocCA+PSAweGZmZmUwMDAwdSkgeworICAgIHAgPSAoKHAgKyAxdSkgPj4gMSkgJiAweDdmZmY3ZmZmdTsgIC8vIC0+IGRpdmlkZSB0aGUgc3RhdHMgYnkgMi4KKyAgfQorICAvLyByZWNvcmQgYml0IGNvdW50IChsb3dlciAxNiBiaXRzKSBhbmQgaW5jcmVtZW50IHRvdGFsIGNvdW50ICh1cHBlciAxNiBiaXRzKS4KKyAgcCArPSAweDAwMDEwMDAwdSArIGJpdDsKKyAgKnN0YXRzID0gcDsKKyAgcmV0dXJuIGJpdDsKK30KKworLy8gQ29zdCBvZiBjb2Rpbmcgb25lIGV2ZW50IHdpdGggcHJvYmFiaWxpdHkgJ3Byb2JhJy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Qml0Q29zdChpbnQgYml0LCB1aW50OF90IHByb2JhKSB7CisgIHJldHVybiAhYml0ID8gVlA4RW50cm9weUNvc3RbcHJvYmFdIDogVlA4RW50cm9weUNvc3RbMjU1IC0gcHJvYmFdOworfQorCisvLyBMZXZlbCBjb3N0IGNhbGN1bGF0aW9ucworZXh0ZXJuIGNvbnN0IHVpbnQxNl90IFZQOExldmVsQ29kZXNbTUFYX1ZBUklBQkxFX0xFVkVMXVsyXTsKK3ZvaWQgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEpOworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMZXZlbENvc3QoY29uc3QgdWludDE2X3QqIGNvbnN0IHRhYmxlLCBpbnQgbGV2ZWwpIHsKKyAgcmV0dXJuIFZQOExldmVsRml4ZWRDb3N0c1tsZXZlbF0KKyAgICAgICArIHRhYmxlWyhsZXZlbCA+IE1BWF9WQVJJQUJMRV9MRVZFTCkgPyBNQVhfVkFSSUFCTEVfTEVWRUwgOiBsZXZlbF07Cit9CisKKy8vIE1vZGUgY29zdHMKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzVVZbNF07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4Rml4ZWRDb3N0c0kxNls0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhGaXhlZENvc3RzSTRbTlVNX0JNT0RFU11bTlVNX0JNT0RFU11bTlVNX0JNT0RFU107CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX0VOQ19DT1NUX0VOQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9maWx0ZXJfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2ZpbHRlcl9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTk4MjE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9maWx0ZXJfZW5jLmMKQEAgLTAsMCArMSwyNDAgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTZWxlY3RpbmcgZmlsdGVyIGxldmVsCisvLworLy8gQXV0aG9yOiBzb21uYXRoQGdvb2dsZS5jb20gKFNvbW5hdGggQmFuZXJqZWUpCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2VuZGlmCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisKKy8vIFRoaXMgdGFibGUgZ2l2ZXMsIGZvciBhIGdpdmVuIHNoYXJwbmVzcywgdGhlIGZpbHRlcmluZyBzdHJlbmd0aCB0byBiZQorLy8gdXNlZCAoYXQgbGVhc3QpIGluIG9yZGVyIHRvIGZpbHRlciBhIGdpdmVuIGVkZ2Ugc3RlcCBkZWx0YS4KKy8vIFRoaXMgaXMgY29uc3RydWN0ZWQgYnkgYnJ1dGUgZm9yY2UgaW5zcGVjdGlvbjogZm9yIGFsbCBkZWx0YSwgd2UgaXRlcmF0ZQorLy8gb3ZlciBhbGwgcG9zc2libGUgZmlsdGVyaW5nIHN0cmVuZ3RoIC8gdGhyZXNoIHVudGlsIG5lZWRzX2ZpbHRlcigpIHJldHVybnMKKy8vIHRydWUuCisjZGVmaW5lIE1BWF9ERUxUQV9TSVpFIDY0CitzdGF0aWMgY29uc3QgdWludDhfdCBrTGV2ZWxzRnJvbURlbHRhWzhdW01BWF9ERUxUQV9TSVpFXSA9IHsKKyAgeyAwLCAgIDEsICAyLCAgMywgIDQsICA1LCAgNiwgIDcsICA4LCAgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwKKyAgICAxNiwgMTcsIDE4LCAxOSwgMjAsIDIxLCAyMiwgMjMsIDI0LCAyNSwgMjYsIDI3LCAyOCwgMjksIDMwLCAzMSwKKyAgICAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywKKyAgICA0OCwgNDksIDUwLCA1MSwgNTIsIDUzLCA1NCwgNTUsIDU2LCA1NywgNTgsIDU5LCA2MCwgNjEsIDYyLCA2MyB9LAorICB7IDAsICAxLCAgMiwgIDMsICA1LCAgNiwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTQsIDE1LCAxNywgMTgsCisgICAgMjAsIDIxLCAyMywgMjQsIDI2LCAyNywgMjksIDMwLCAzMiwgMzMsIDM1LCAzNiwgMzgsIDM5LCA0MSwgNDIsCisgICAgNDQsIDQ1LCA0NywgNDgsIDUwLCA1MSwgNTMsIDU0LCA1NiwgNTcsIDU5LCA2MCwgNjIsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgMywgIDUsICA2LCAgNywgIDgsICA5LCAxMSwgMTIsIDEzLCAxNCwgMTYsIDE3LCAxOSwKKyAgICAyMCwgMjIsIDIzLCAyNSwgMjYsIDI4LCAyOSwgMzEsIDMyLCAzNCwgMzUsIDM3LCAzOCwgNDAsIDQxLCA0MywKKyAgICA0NCwgNDYsIDQ3LCA0OSwgNTAsIDUyLCA1MywgNTUsIDU2LCA1OCwgNTksIDYxLCA2MiwgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICAzLCAgNSwgIDYsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTgsIDE5LAorICAgIDIxLCAyMiwgMjQsIDI1LCAyNywgMjgsIDMwLCAzMSwgMzMsIDM0LCAzNiwgMzcsIDM5LCA0MCwgNDIsIDQzLAorICAgIDQ1LCA0NiwgNDgsIDQ5LCA1MSwgNTIsIDU0LCA1NSwgNTcsIDU4LCA2MCwgNjEsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDMsICA1LCAgNiwgIDcsICA4LCAgOSwgMTEsIDEyLCAxNCwgMTUsIDE3LCAxOCwgMjAsCisgICAgMjEsIDIzLCAyNCwgMjYsIDI3LCAyOSwgMzAsIDMyLCAzMywgMzUsIDM2LCAzOCwgMzksIDQxLCA0MiwgNDQsCisgICAgNDUsIDQ3LCA0OCwgNTAsIDUxLCA1MywgNTQsIDU2LCA1NywgNTksIDYwLCA2MiwgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfSwKKyAgeyAgMCwgIDEsICAyLCAgNCwgIDUsICA3LCAgOCwgIDksIDExLCAxMiwgMTMsIDE1LCAxNiwgMTcsIDE5LCAyMCwKKyAgICAyMiwgMjMsIDI1LCAyNiwgMjgsIDI5LCAzMSwgMzIsIDM0LCAzNSwgMzcsIDM4LCA0MCwgNDEsIDQzLCA0NCwKKyAgICA0NiwgNDcsIDQ5LCA1MCwgNTIsIDUzLCA1NSwgNTYsIDU4LCA1OSwgNjEsIDYyLCA2MywgNjMsIDYzLCA2MywKKyAgICA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MyB9LAorICB7ICAwLCAgMSwgIDIsICA0LCAgNSwgIDcsICA4LCAgOSwgMTEsIDEyLCAxMywgMTUsIDE2LCAxOCwgMTksIDIxLAorICAgIDIyLCAyNCwgMjUsIDI3LCAyOCwgMzAsIDMxLCAzMywgMzQsIDM2LCAzNywgMzksIDQwLCA0MiwgNDMsIDQ1LAorICAgIDQ2LCA0OCwgNDksIDUxLCA1MiwgNTQsIDU1LCA1NywgNTgsIDYwLCA2MSwgNjMsIDYzLCA2MywgNjMsIDYzLAorICAgIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzIH0sCisgIHsgIDAsICAxLCAgMiwgIDQsICA1LCAgNywgIDgsICA5LCAxMSwgMTIsIDE0LCAxNSwgMTcsIDE4LCAyMCwgMjEsCisgICAgMjMsIDI0LCAyNiwgMjcsIDI5LCAzMCwgMzIsIDMzLCAzNSwgMzYsIDM4LCAzOSwgNDEsIDQyLCA0NCwgNDUsCisgICAgNDcsIDQ4LCA1MCwgNTEsIDUzLCA1NCwgNTYsIDU3LCA1OSwgNjAsIDYyLCA2MywgNjMsIDYzLCA2MywgNjMsCisgICAgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMgfQorfTsKKworaW50IFZQOEZpbHRlclN0cmVuZ3RoRnJvbURlbHRhKGludCBzaGFycG5lc3MsIGludCBkZWx0YSkgeworICBjb25zdCBpbnQgcG9zID0gKGRlbHRhIDwgTUFYX0RFTFRBX1NJWkUpID8gZGVsdGEgOiBNQVhfREVMVEFfU0laRSAtIDE7CisgIGFzc2VydChzaGFycG5lc3MgPj0gMCAmJiBzaGFycG5lc3MgPD0gNyk7CisgIHJldHVybiBrTGV2ZWxzRnJvbURlbHRhW3NoYXJwbmVzc11bcG9zXTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBhcmFncmFwaCAxNS40OiBjb21wdXRlIHRoZSBpbm5lci1lZGdlIGZpbHRlcmluZyBzdHJlbmd0aAorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworc3RhdGljIGludCBHZXRJTGV2ZWwoaW50IHNoYXJwbmVzcywgaW50IGxldmVsKSB7CisgIGlmIChzaGFycG5lc3MgPiAwKSB7CisgICAgaWYgKHNoYXJwbmVzcyA+IDQpIHsKKyAgICAgIGxldmVsID4+PSAyOworICAgIH0gZWxzZSB7CisgICAgICBsZXZlbCA+Pj0gMTsKKyAgICB9CisgICAgaWYgKGxldmVsID4gOSAtIHNoYXJwbmVzcykgeworICAgICAgbGV2ZWwgPSA5IC0gc2hhcnBuZXNzOworICAgIH0KKyAgfQorICBpZiAobGV2ZWwgPCAxKSBsZXZlbCA9IDE7CisgIHJldHVybiBsZXZlbDsKK30KKworc3RhdGljIHZvaWQgRG9GaWx0ZXIoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgbGV2ZWwpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IGludCBpbGV2ZWwgPSBHZXRJTGV2ZWwoZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzLCBsZXZlbCk7CisgIGNvbnN0IGludCBsaW1pdCA9IDIgKiBsZXZlbCArIGlsZXZlbDsKKworICB1aW50OF90KiBjb25zdCB5X2RzdCA9IGl0LT55dXZfb3V0Ml8gKyBZX09GRl9FTkM7CisgIHVpbnQ4X3QqIGNvbnN0IHVfZHN0ID0gaXQtPnl1dl9vdXQyXyArIFVfT0ZGX0VOQzsKKyAgdWludDhfdCogY29uc3Qgdl9kc3QgPSBpdC0+eXV2X291dDJfICsgVl9PRkZfRU5DOworCisgIC8vIGNvcHkgY3VycmVudCBibG9jayB0byB5dXZfb3V0Ml8KKyAgbWVtY3B5KHlfZHN0LCBpdC0+eXV2X291dF8sIFlVVl9TSVpFX0VOQyAqIHNpemVvZih1aW50OF90KSk7CisKKyAgaWYgKGVuYy0+ZmlsdGVyX2hkcl8uc2ltcGxlXyA9PSAxKSB7ICAgLy8gc2ltcGxlCisgICAgVlA4U2ltcGxlSEZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCk7CisgICAgVlA4U2ltcGxlVkZpbHRlcjE2aSh5X2RzdCwgQlBTLCBsaW1pdCk7CisgIH0gZWxzZSB7ICAgIC8vIGNvbXBsZXgKKyAgICBjb25zdCBpbnQgaGV2X3RocmVzaCA9IChsZXZlbCA+PSA0MCkgPyAyIDogKGxldmVsID49IDE1KSA/IDEgOiAwOworICAgIFZQOEhGaWx0ZXIxNmkoeV9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgICAgVlA4SEZpbHRlcjhpKHVfZHN0LCB2X2RzdCwgQlBTLCBsaW1pdCwgaWxldmVsLCBoZXZfdGhyZXNoKTsKKyAgICBWUDhWRmlsdGVyMTZpKHlfZHN0LCBCUFMsIGxpbWl0LCBpbGV2ZWwsIGhldl90aHJlc2gpOworICAgIFZQOFZGaWx0ZXI4aSh1X2RzdCwgdl9kc3QsIEJQUywgbGltaXQsIGlsZXZlbCwgaGV2X3RocmVzaCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNTSU0gbWV0cmljIGZvciBvbmUgbWFjcm9ibG9jaworCitzdGF0aWMgZG91YmxlIEdldE1CU1NJTShjb25zdCB1aW50OF90KiB5dXYxLCBjb25zdCB1aW50OF90KiB5dXYyKSB7CisgIGludCB4LCB5OworICBkb3VibGUgc3VtID0gMC47CisKKyAgLy8gY29tcHV0ZSBTU0lNIGluIGEgMTAgeCAxMCB3aW5kb3cKKyAgZm9yICh5ID0gVlA4X1NTSU1fS0VSTkVMOyB5IDwgMTYgLSBWUDhfU1NJTV9LRVJORUw7IHkrKykgeworICAgIGZvciAoeCA9IFZQOF9TU0lNX0tFUk5FTDsgeCA8IDE2IC0gVlA4X1NTSU1fS0VSTkVMOyB4KyspIHsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0Q2xpcHBlZCh5dXYxICsgWV9PRkZfRU5DLCBCUFMsIHl1djIgKyBZX09GRl9FTkMsIEJQUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LCB5LCAxNiwgMTYpOworICAgIH0KKyAgfQorICBmb3IgKHggPSAxOyB4IDwgNzsgeCsrKSB7CisgICAgZm9yICh5ID0gMTsgeSA8IDc7IHkrKykgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHl1djEgKyBVX09GRl9FTkMsIEJQUywgeXV2MiArIFVfT0ZGX0VOQywgQlBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIDgsIDgpOworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHl1djEgKyBWX09GRl9FTkMsIEJQUywgeXV2MiArIFZfT0ZGX0VOQywgQlBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgsIHksIDgsIDgpOworICAgIH0KKyAgfQorICByZXR1cm4gc3VtOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFeHBvc2VkIEFQSXM6IEVuY29kZXIgc2hvdWxkIGNhbGwgdGhlIGZvbGxvd2luZyAzIGZ1bmN0aW9ucyB0byBhZGp1c3QKKy8vIGxvb3AgZmlsdGVyIHN0cmVuZ3RoCisKK3ZvaWQgVlA4SW5pdEZpbHRlcihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICBpZiAoaXQtPmxmX3N0YXRzXyAhPSBOVUxMKSB7CisgICAgaW50IHMsIGk7CisgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgcysrKSB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xGX0xFVkVMUzsgaSsrKSB7CisgICAgICAgICgqaXQtPmxmX3N0YXRzXylbc11baV0gPSAwOworICAgICAgfQorICAgIH0KKyAgICBWUDhTU0lNRHNwSW5pdCgpOworICB9CisjZWxzZQorICAodm9pZClpdDsKKyNlbmRpZgorfQorCit2b2lkIFZQOFN0b3JlRmlsdGVyU3RhdHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgaW50IGQ7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCBpbnQgcyA9IGl0LT5tYl8tPnNlZ21lbnRfOworICBjb25zdCBpbnQgbGV2ZWwwID0gZW5jLT5kcW1fW3NdLmZzdHJlbmd0aF87CisKKyAgLy8gZXhwbG9yZSArLy1xdWFudCByYW5nZSBvZiB2YWx1ZXMgYXJvdW5kIGxldmVsMAorICBjb25zdCBpbnQgZGVsdGFfbWluID0gLWVuYy0+ZHFtX1tzXS5xdWFudF87CisgIGNvbnN0IGludCBkZWx0YV9tYXggPSBlbmMtPmRxbV9bc10ucXVhbnRfOworICBjb25zdCBpbnQgc3RlcF9zaXplID0gKGRlbHRhX21heCAtIGRlbHRhX21pbiA+PSA0KSA/IDQgOiAxOworCisgIGlmIChpdC0+bGZfc3RhdHNfID09IE5VTEwpIHJldHVybjsKKworICAvLyBOT1RFOiBDdXJyZW50bHkgd2UgYXJlIGFwcGx5aW5nIGZpbHRlciBvbmx5IGFjcm9zcyB0aGUgc3VibG9jayBlZGdlcworICAvLyBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgZm9yIHRoYXQuCisgIC8vIDEuIEFwcGx5aW5nIGZpbHRlciBvbiBtYWNybyBibG9jayBlZGdlcyB3aWxsIGNoYW5nZSB0aGUgcGl4ZWxzIGluCisgIC8vIHRoZSBsZWZ0IGFuZCB0b3AgbWFjcm8gYmxvY2tzLiBUaGF0IHdpbGwgYmUgaGFyZCB0byByZXN0b3JlCisgIC8vIDIuIE1hY3JvIEJsb2NrcyBvbiB0aGUgYm90dG9tIGFuZCByaWdodCBhcmUgbm90IHlldCBjb21wcmVzc2VkLiBTbyB3ZQorICAvLyBjYW5ub3QgYXBwbHkgZmlsdGVyIG9uIHRoZSByaWdodCBhbmQgYm90dG9tIG1hY3JvIGJsb2NrIGVkZ2VzLgorICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSAmJiBpdC0+bWJfLT5za2lwXykgcmV0dXJuOworCisgIC8vIEFsd2F5cyB0cnkgZmlsdGVyIGxldmVsICB6ZXJvCisgICgqaXQtPmxmX3N0YXRzXylbc11bMF0gKz0gR2V0TUJTU0lNKGl0LT55dXZfaW5fLCBpdC0+eXV2X291dF8pOworCisgIGZvciAoZCA9IGRlbHRhX21pbjsgZCA8PSBkZWx0YV9tYXg7IGQgKz0gc3RlcF9zaXplKSB7CisgICAgY29uc3QgaW50IGxldmVsID0gbGV2ZWwwICsgZDsKKyAgICBpZiAobGV2ZWwgPD0gMCB8fCBsZXZlbCA+PSBNQVhfTEZfTEVWRUxTKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgRG9GaWx0ZXIoaXQsIGxldmVsKTsKKyAgICAoKml0LT5sZl9zdGF0c18pW3NdW2xldmVsXSArPSBHZXRNQlNTSU0oaXQtPnl1dl9pbl8sIGl0LT55dXZfb3V0Ml8pOworICB9CisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorICAodm9pZClpdDsKKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKK30KKwordm9pZCBWUDhBZGp1c3RGaWx0ZXJTdHJlbmd0aChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKyAgaWYgKGl0LT5sZl9zdGF0c18gIT0gTlVMTCkgeworICAgIGludCBzOworICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7IHMrKykgeworICAgICAgaW50IGksIGJlc3RfbGV2ZWwgPSAwOworICAgICAgLy8gSW1wcm92ZW1lbnQgb3ZlciBmaWx0ZXIgbGV2ZWwgMCBzaG91bGQgYmUgYXQgbGVhc3QgMWUtNSAocmVsYXRpdmVseSkKKyAgICAgIGRvdWJsZSBiZXN0X3YgPSAxLjAwMDAxICogKCppdC0+bGZfc3RhdHNfKVtzXVswXTsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBNQVhfTEZfTEVWRUxTOyBpKyspIHsKKyAgICAgICAgY29uc3QgZG91YmxlIHYgPSAoKml0LT5sZl9zdGF0c18pW3NdW2ldOworICAgICAgICBpZiAodiA+IGJlc3RfdikgeworICAgICAgICAgIGJlc3RfdiA9IHY7CisgICAgICAgICAgYmVzdF9sZXZlbCA9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfID0gYmVzdF9sZXZlbDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisjZW5kaWYgIC8vICFkZWZpbmVkKFdFQlBfUkVEVUNFX1NJWkUpCisgIGlmIChlbmMtPmNvbmZpZ18tPmZpbHRlcl9zdHJlbmd0aCA+IDApIHsKKyAgICBpbnQgbWF4X2xldmVsID0gMDsKKyAgICBpbnQgczsKKyAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyBzKyspIHsKKyAgICAgIFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW3NdOworICAgICAgLy8gdGhpcyAnPj4gMycgYWNjb3VudHMgZm9yIHNvbWUgaW52ZXJzZSBXSFQgc2NhbGluZworICAgICAgY29uc3QgaW50IGRlbHRhID0gKGRxbS0+bWF4X2VkZ2VfICogZHFtLT55Ml8ucV9bMV0pID4+IDM7CisgICAgICBjb25zdCBpbnQgbGV2ZWwgPQorICAgICAgICAgIFZQOEZpbHRlclN0cmVuZ3RoRnJvbURlbHRhKGVuYy0+ZmlsdGVyX2hkcl8uc2hhcnBuZXNzXywgZGVsdGEpOworICAgICAgaWYgKGxldmVsID4gZHFtLT5mc3RyZW5ndGhfKSB7CisgICAgICAgIGRxbS0+ZnN0cmVuZ3RoXyA9IGxldmVsOworICAgICAgfQorICAgICAgaWYgKG1heF9sZXZlbCA8IGRxbS0+ZnN0cmVuZ3RoXykgeworICAgICAgICBtYXhfbGV2ZWwgPSBkcW0tPmZzdHJlbmd0aF87CisgICAgICB9CisgICAgfQorICAgIGVuYy0+ZmlsdGVyX2hkcl8ubGV2ZWxfID0gbWF4X2xldmVsOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2ZyYW1lX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9mcmFtZV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzc2M2JlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9mcmFtZV9lbmMuYwpAQCAtMCwwICsxLDg5NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgZnJhbWUgY29kaW5nIGFuZCBhbmFseXNpcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9jb3N0X2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIgIC8vIFJJRkYgY29uc3RhbnRzCisKKyNkZWZpbmUgU0VHTUVOVF9WSVNVIDAKKyNkZWZpbmUgREVCVUdfU0VBUkNIIDAgICAgLy8gdXNlZnVsIHRvIHRyYWNrIHNlYXJjaCBjb252ZXJnZW5jZQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbXVsdGktcGFzcyBjb252ZXJnZW5jZQorCisjZGVmaW5lIEhFQURFUl9TSVpFX0VTVElNQVRFIChSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4X0ZSQU1FX0hFQURFUl9TSVpFKQorI2RlZmluZSBEUV9MSU1JVCAwLjQgIC8vIGNvbnZlcmdlbmNlIGlzIGNvbnNpZGVyZWQgcmVhY2hlZCBpZiBkcSA8IERRX0xJTUlUCisvLyB3ZSBhbGxvdyAyayBvZiBleHRyYSBoZWFkLXJvb20gaW4gUEFSVElUSU9OMCBsaW1pdC4KKyNkZWZpbmUgUEFSVElUSU9OMF9TSVpFX0xJTUlUICgoVlA4X01BWF9QQVJUSVRJT04wX1NJWkUgLSAyMDQ4VUxMKSA8PCAxMSkKKwordHlwZWRlZiBzdHJ1Y3QgeyAgLy8gc3RydWN0IGZvciBvcmdhbml6aW5nIGNvbnZlcmdlbmNlIGluIGVpdGhlciBzaXplIG9yIFBTTlIKKyAgaW50IGlzX2ZpcnN0OworICBmbG9hdCBkcTsKKyAgZmxvYXQgcSwgbGFzdF9xOworICBkb3VibGUgdmFsdWUsIGxhc3RfdmFsdWU7ICAgLy8gUFNOUiBvciBzaXplCisgIGRvdWJsZSB0YXJnZXQ7CisgIGludCBkb19zaXplX3NlYXJjaDsKK30gUGFzc1N0YXRzOworCitzdGF0aWMgaW50IEluaXRQYXNzU3RhdHMoY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLCBQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgY29uc3QgdWludDY0X3QgdGFyZ2V0X3NpemUgPSAodWludDY0X3QpZW5jLT5jb25maWdfLT50YXJnZXRfc2l6ZTsKKyAgY29uc3QgaW50IGRvX3NpemVfc2VhcmNoID0gKHRhcmdldF9zaXplICE9IDApOworICBjb25zdCBmbG9hdCB0YXJnZXRfUFNOUiA9IGVuYy0+Y29uZmlnXy0+dGFyZ2V0X1BTTlI7CisKKyAgcy0+aXNfZmlyc3QgPSAxOworICBzLT5kcSA9IDEwLmY7CisgIHMtPnEgPSBzLT5sYXN0X3EgPSBlbmMtPmNvbmZpZ18tPnF1YWxpdHk7CisgIHMtPnRhcmdldCA9IGRvX3NpemVfc2VhcmNoID8gKGRvdWJsZSl0YXJnZXRfc2l6ZQorICAgICAgICAgICAgOiAodGFyZ2V0X1BTTlIgPiAwLikgPyB0YXJnZXRfUFNOUgorICAgICAgICAgICAgOiA0MC47ICAgLy8gZGVmYXVsdCwganVzdCBpbiBjYXNlCisgIHMtPnZhbHVlID0gcy0+bGFzdF92YWx1ZSA9IDAuOworICBzLT5kb19zaXplX3NlYXJjaCA9IGRvX3NpemVfc2VhcmNoOworICByZXR1cm4gZG9fc2l6ZV9zZWFyY2g7Cit9CisKK3N0YXRpYyBmbG9hdCBDbGFtcChmbG9hdCB2LCBmbG9hdCBtaW4sIGZsb2F0IG1heCkgeworICByZXR1cm4gKHYgPCBtaW4pID8gbWluIDogKHYgPiBtYXgpID8gbWF4IDogdjsKK30KKworc3RhdGljIGZsb2F0IENvbXB1dGVOZXh0UShQYXNzU3RhdHMqIGNvbnN0IHMpIHsKKyAgZmxvYXQgZHE7CisgIGlmIChzLT5pc19maXJzdCkgeworICAgIGRxID0gKHMtPnZhbHVlID4gcy0+dGFyZ2V0KSA/IC1zLT5kcSA6IHMtPmRxOworICAgIHMtPmlzX2ZpcnN0ID0gMDsKKyAgfSBlbHNlIGlmIChzLT52YWx1ZSAhPSBzLT5sYXN0X3ZhbHVlKSB7CisgICAgY29uc3QgZG91YmxlIHNsb3BlID0gKHMtPnRhcmdldCAtIHMtPnZhbHVlKSAvIChzLT5sYXN0X3ZhbHVlIC0gcy0+dmFsdWUpOworICAgIGRxID0gKGZsb2F0KShzbG9wZSAqIChzLT5sYXN0X3EgLSBzLT5xKSk7CisgIH0gZWxzZSB7CisgICAgZHEgPSAwLjsgIC8vIHdlJ3JlIGRvbmU/IQorICB9CisgIC8vIExpbWl0IHZhcmlhYmxlIHRvIGF2b2lkIGxhcmdlIHN3aW5ncy4KKyAgcy0+ZHEgPSBDbGFtcChkcSwgLTMwLmYsIDMwLmYpOworICBzLT5sYXN0X3EgPSBzLT5xOworICBzLT5sYXN0X3ZhbHVlID0gcy0+dmFsdWU7CisgIHMtPnEgPSBDbGFtcChzLT5xICsgcy0+ZHEsIDAuZiwgMTAwLmYpOworICByZXR1cm4gcy0+cTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRhYmxlcyBmb3IgbGV2ZWwgY29kaW5nCisKK2NvbnN0IHVpbnQ4X3QgVlA4Q2F0M1tdID0geyAxNzMsIDE0OCwgMTQwIH07Citjb25zdCB1aW50OF90IFZQOENhdDRbXSA9IHsgMTc2LCAxNTUsIDE0MCwgMTM1IH07Citjb25zdCB1aW50OF90IFZQOENhdDVbXSA9IHsgMTgwLCAxNTcsIDE0MSwgMTM0LCAxMzAgfTsKK2NvbnN0IHVpbnQ4X3QgVlA4Q2F0NltdID0KKyAgICB7IDI1NCwgMjU0LCAyNDMsIDIzMCwgMTk2LCAxNzcsIDE1MywgMTQwLCAxMzMsIDEzMCwgMTI5IH07CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXNldCB0aGUgc3RhdGlzdGljcyBhYm91dDogbnVtYmVyIG9mIHNraXBzLCB0b2tlbiBwcm9iYSwgbGV2ZWwgY29zdCwuLi4KKworc3RhdGljIHZvaWQgUmVzZXRTdGF0cyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBWUDhDYWxjdWxhdGVMZXZlbENvc3RzKHByb2JhKTsKKyAgcHJvYmEtPm5iX3NraXBfID0gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNraXAgZGVjaXNpb24gcHJvYmFiaWxpdHkKKworI2RlZmluZSBTS0lQX1BST0JBX1RIUkVTSE9MRCAyNTAgIC8vIHZhbHVlIGJlbG93IHdoaWNoIHVzaW5nIHNraXBfcHJvYmEgaXMgT0suCisKK3N0YXRpYyBpbnQgQ2FsY1NraXBQcm9iYSh1aW50NjRfdCBuYiwgdWludDY0X3QgdG90YWwpIHsKKyAgcmV0dXJuIChpbnQpKHRvdGFsID8gKHRvdGFsIC0gbmIpICogMjU1IC8gdG90YWwgOiAyNTUpOworfQorCisvLyBSZXR1cm5zIHRoZSBiaXQtY29zdCBmb3IgY29kaW5nIHRoZSBza2lwIHByb2JhYmlsaXR5Lgorc3RhdGljIGludCBGaW5hbGl6ZVNraXBQcm9iYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBjb25zdCBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgIGNvbnN0IGludCBuYl9ldmVudHMgPSBwcm9iYS0+bmJfc2tpcF87CisgIGludCBzaXplOworICBwcm9iYS0+c2tpcF9wcm9iYV8gPSBDYWxjU2tpcFByb2JhKG5iX2V2ZW50cywgbmJfbWJzKTsKKyAgcHJvYmEtPnVzZV9za2lwX3Byb2JhXyA9IChwcm9iYS0+c2tpcF9wcm9iYV8gPCBTS0lQX1BST0JBX1RIUkVTSE9MRCk7CisgIHNpemUgPSAyNTY7ICAgLy8gJ3VzZV9za2lwX3Byb2JhJyBiaXQKKyAgaWYgKHByb2JhLT51c2Vfc2tpcF9wcm9iYV8pIHsKKyAgICBzaXplICs9ICBuYl9ldmVudHMgKiBWUDhCaXRDb3N0KDEsIHByb2JhLT5za2lwX3Byb2JhXykKKyAgICAgICAgICsgKG5iX21icyAtIG5iX2V2ZW50cykgKiBWUDhCaXRDb3N0KDAsIHByb2JhLT5za2lwX3Byb2JhXyk7CisgICAgc2l6ZSArPSA4ICogMjU2OyAgIC8vIGNvc3Qgb2Ygc2lnbmFsaW5nIHRoZSBza2lwX3Byb2JhXyBpdHNlbGYuCisgIH0KKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIENvbGxlY3Qgc3RhdGlzdGljcyBhbmQgZGVkdWNlIHByb2JhYmlsaXRpZXMgZm9yIG5leHQgY29kaW5nIHBhc3MuCisvLyBSZXR1cm4gdGhlIHRvdGFsIGJpdC1jb3N0IGZvciBjb2RpbmcgdGhlIHByb2JhYmlsaXR5IHVwZGF0ZXMuCitzdGF0aWMgaW50IENhbGNUb2tlblByb2JhKGludCBuYiwgaW50IHRvdGFsKSB7CisgIGFzc2VydChuYiA8PSB0b3RhbCk7CisgIHJldHVybiBuYiA/ICgyNTUgLSBuYiAqIDI1NSAvIHRvdGFsKSA6IDI1NTsKK30KKworLy8gQ29zdCBvZiBjb2RpbmcgJ25iJyAxJ3MgYW5kICd0b3RhbC1uYicgMCdzIHVzaW5nICdwcm9iYScgcHJvYmFiaWxpdHkuCitzdGF0aWMgaW50IEJyYW5jaENvc3QoaW50IG5iLCBpbnQgdG90YWwsIGludCBwcm9iYSkgeworICByZXR1cm4gbmIgKiBWUDhCaXRDb3N0KDEsIHByb2JhKSArICh0b3RhbCAtIG5iKSAqIFZQOEJpdENvc3QoMCwgcHJvYmEpOworfQorCitzdGF0aWMgdm9pZCBSZXNldFRva2VuU3RhdHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgbWVtc2V0KHByb2JhLT5zdGF0c18sIDAsIHNpemVvZihwcm9iYS0+c3RhdHNfKSk7Cit9CisKK3N0YXRpYyBpbnQgRmluYWxpemVUb2tlblByb2JhcyhWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEpIHsKKyAgaW50IGhhc19jaGFuZ2VkID0gMDsKKyAgaW50IHNpemUgPSAwOworICBpbnQgdCwgYiwgYywgcDsKKyAgZm9yICh0ID0gMDsgdCA8IE5VTV9UWVBFUzsgKyt0KSB7CisgICAgZm9yIChiID0gMDsgYiA8IE5VTV9CQU5EUzsgKytiKSB7CisgICAgICBmb3IgKGMgPSAwOyBjIDwgTlVNX0NUWDsgKytjKSB7CisgICAgICAgIGZvciAocCA9IDA7IHAgPCBOVU1fUFJPQkFTOyArK3ApIHsKKyAgICAgICAgICBjb25zdCBwcm9iYV90IHN0YXRzID0gcHJvYmEtPnN0YXRzX1t0XVtiXVtjXVtwXTsKKyAgICAgICAgICBjb25zdCBpbnQgbmIgPSAoc3RhdHMgPj4gMCkgJiAweGZmZmY7CisgICAgICAgICAgY29uc3QgaW50IHRvdGFsID0gKHN0YXRzID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgICAgICBjb25zdCBpbnQgdXBkYXRlX3Byb2JhID0gVlA4Q29lZmZzVXBkYXRlUHJvYmFbdF1bYl1bY11bcF07CisgICAgICAgICAgY29uc3QgaW50IG9sZF9wID0gVlA4Q29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdOworICAgICAgICAgIGNvbnN0IGludCBuZXdfcCA9IENhbGNUb2tlblByb2JhKG5iLCB0b3RhbCk7CisgICAgICAgICAgY29uc3QgaW50IG9sZF9jb3N0ID0gQnJhbmNoQ29zdChuYiwgdG90YWwsIG9sZF9wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZQOEJpdENvc3QoMCwgdXBkYXRlX3Byb2JhKTsKKyAgICAgICAgICBjb25zdCBpbnQgbmV3X2Nvc3QgPSBCcmFuY2hDb3N0KG5iLCB0b3RhbCwgbmV3X3ApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Qml0Q29zdCgxLCB1cGRhdGVfcHJvYmEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgOCAqIDI1NjsKKyAgICAgICAgICBjb25zdCBpbnQgdXNlX25ld19wID0gKG9sZF9jb3N0ID4gbmV3X2Nvc3QpOworICAgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdCh1c2VfbmV3X3AsIHVwZGF0ZV9wcm9iYSk7CisgICAgICAgICAgaWYgKHVzZV9uZXdfcCkgeyAgLy8gb25seSB1c2UgcHJvYmEgdGhhdCBzZWVtIG1lYW5pbmdmdWwgZW5vdWdoLgorICAgICAgICAgICAgcHJvYmEtPmNvZWZmc19bdF1bYl1bY11bcF0gPSBuZXdfcDsKKyAgICAgICAgICAgIGhhc19jaGFuZ2VkIHw9IChuZXdfcCAhPSBvbGRfcCk7CisgICAgICAgICAgICBzaXplICs9IDggKiAyNTY7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2JhLT5jb2VmZnNfW3RdW2JdW2NdW3BdID0gb2xkX3A7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIHByb2JhLT5kaXJ0eV8gPSBoYXNfY2hhbmdlZDsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGaW5hbGl6ZSBTZWdtZW50IHByb2JhYmlsaXR5IGJhc2VkIG9uIHRoZSBjb2RpbmcgdHJlZQorCitzdGF0aWMgaW50IEdldFByb2JhKGludCBhLCBpbnQgYikgeworICBjb25zdCBpbnQgdG90YWwgPSBhICsgYjsKKyAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDI1NSAgICAgLy8gdGhhdCdzIHRoZSBkZWZhdWx0IHByb2JhYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICAgIDogKDI1NSAqIGEgKyB0b3RhbCAvIDIpIC8gdG90YWw7ICAvLyByb3VuZGVkIHByb2JhCit9CisKK3N0YXRpYyB2b2lkIFJlc2V0U2VnbWVudHMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBuOworICBmb3IgKG4gPSAwOyBuIDwgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87ICsrbikgeworICAgIGVuYy0+bWJfaW5mb19bbl0uc2VnbWVudF8gPSAwOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFNldFNlZ21lbnRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAgfTsKKyAgaW50IG47CisKKyAgZm9yIChuID0gMDsgbiA8IGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfOyArK24pIHsKKyAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gJmVuYy0+bWJfaW5mb19bbl07CisgICAgKytwW21iLT5zZWdtZW50X107CisgIH0KKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgIGlmIChlbmMtPnBpY18tPnN0YXRzICE9IE5VTEwpIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgTlVNX01CX1NFR01FTlRTOyArK24pIHsKKyAgICAgIGVuYy0+cGljXy0+c3RhdHMtPnNlZ21lbnRfc2l6ZVtuXSA9IHBbbl07CisgICAgfQorICB9CisjZW5kaWYKKyAgaWYgKGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18gPiAxKSB7CisgICAgdWludDhfdCogY29uc3QgcHJvYmFzID0gZW5jLT5wcm9iYV8uc2VnbWVudHNfOworICAgIHByb2Jhc1swXSA9IEdldFByb2JhKHBbMF0gKyBwWzFdLCBwWzJdICsgcFszXSk7CisgICAgcHJvYmFzWzFdID0gR2V0UHJvYmEocFswXSwgcFsxXSk7CisgICAgcHJvYmFzWzJdID0gR2V0UHJvYmEocFsyXSwgcFszXSk7CisKKyAgICBlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXyA9CisgICAgICAgIChwcm9iYXNbMF0gIT0gMjU1KSB8fCAocHJvYmFzWzFdICE9IDI1NSkgfHwgKHByb2Jhc1syXSAhPSAyNTUpOworICAgIGlmICghZW5jLT5zZWdtZW50X2hkcl8udXBkYXRlX21hcF8pIFJlc2V0U2VnbWVudHMoZW5jKTsKKyAgICBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXyA9CisgICAgICAgIHBbMF0gKiAoVlA4Qml0Q29zdCgwLCBwcm9iYXNbMF0pICsgVlA4Qml0Q29zdCgwLCBwcm9iYXNbMV0pKSArCisgICAgICAgIHBbMV0gKiAoVlA4Qml0Q29zdCgwLCBwcm9iYXNbMF0pICsgVlA4Qml0Q29zdCgxLCBwcm9iYXNbMV0pKSArCisgICAgICAgIHBbMl0gKiAoVlA4Qml0Q29zdCgxLCBwcm9iYXNbMF0pICsgVlA4Qml0Q29zdCgwLCBwcm9iYXNbMl0pKSArCisgICAgICAgIHBbM10gKiAoVlA4Qml0Q29zdCgxLCBwcm9iYXNbMF0pICsgVlA4Qml0Q29zdCgxLCBwcm9iYXNbMl0pKTsKKyAgfSBlbHNlIHsKKyAgICBlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXyA9IDA7CisgICAgZW5jLT5zZWdtZW50X2hkcl8uc2l6ZV8gPSAwOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2VmZmljaWVudCBjb2RpbmcKKworc3RhdGljIGludCBQdXRDb2VmZnMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGN0eCwgY29uc3QgVlA4UmVzaWR1YWwqIHJlcykgeworICBpbnQgbiA9IHJlcy0+Zmlyc3Q7CisgIC8vIHNob3VsZCBiZSBwcm9iW1ZQOEVuY0JhbmRzW25dXSwgYnV0IGl0J3MgZXF1aXZhbGVudCBmb3Igbj0wIG9yIDEKKyAgY29uc3QgdWludDhfdCogcCA9IHJlcy0+cHJvYltuXVtjdHhdOworICBpZiAoIVZQOFB1dEJpdChidywgcmVzLT5sYXN0ID49IDAsIHBbMF0pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB3aGlsZSAobiA8IDE2KSB7CisgICAgY29uc3QgaW50IGMgPSByZXMtPmNvZWZmc1tuKytdOworICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7CisgICAgaW50IHYgPSBzaWduID8gLWMgOiBjOworICAgIGlmICghVlA4UHV0Qml0KGJ3LCB2ICE9IDAsIHBbMV0pKSB7CisgICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVswXTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoIVZQOFB1dEJpdChidywgdiA+IDEsIHBbMl0pKSB7CisgICAgICBwID0gcmVzLT5wcm9iW1ZQOEVuY0JhbmRzW25dXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiA0LCBwWzNdKSkgeworICAgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCB2ICE9IDIsIHBbNF0pKSB7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCB2ID09IDQsIHBbNV0pOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiAxMCwgcFs2XSkpIHsKKyAgICAgICAgaWYgKCFWUDhQdXRCaXQoYncsIHYgPiA2LCBwWzddKSkgeworICAgICAgICAgIFZQOFB1dEJpdChidywgdiA9PSA2LCAxNTkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZQOFB1dEJpdChidywgdiA+PSA5LCAxNjUpOworICAgICAgICAgIFZQOFB1dEJpdChidywgISh2ICYgMSksIDE0NSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGludCBtYXNrOworICAgICAgICBjb25zdCB1aW50OF90KiB0YWI7CisgICAgICAgIGlmICh2IDwgMyArICg4IDw8IDEpKSB7ICAgICAgICAgIC8vIFZQOENhdDMgICgzYikKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDAsIHBbOF0pOworICAgICAgICAgIFZQOFB1dEJpdChidywgMCwgcFs5XSk7CisgICAgICAgICAgdiAtPSAzICsgKDggPDwgMCk7CisgICAgICAgICAgbWFzayA9IDEgPDwgMjsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQzOworICAgICAgICB9IGVsc2UgaWYgKHYgPCAzICsgKDggPDwgMikpIHsgICAvLyBWUDhDYXQ0ICAoNGIpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzhdKTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbOV0pOworICAgICAgICAgIHYgLT0gMyArICg4IDw8IDEpOworICAgICAgICAgIG1hc2sgPSAxIDw8IDM7CisgICAgICAgICAgdGFiID0gVlA4Q2F0NDsKKyAgICAgICAgfSBlbHNlIGlmICh2IDwgMyArICg4IDw8IDMpKSB7ICAgLy8gVlA4Q2F0NSAgKDViKQorICAgICAgICAgIFZQOFB1dEJpdChidywgMSwgcFs4XSk7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAwLCBwWzEwXSk7CisgICAgICAgICAgdiAtPSAzICsgKDggPDwgMik7CisgICAgICAgICAgbWFzayA9IDEgPDwgNDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ1OworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWUDhDYXQ2ICgxMWIpCisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAxLCBwWzhdKTsKKyAgICAgICAgICBWUDhQdXRCaXQoYncsIDEsIHBbMTBdKTsKKyAgICAgICAgICB2IC09IDMgKyAoOCA8PCAzKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAxMDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ2OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgICAgVlA4UHV0Qml0KGJ3LCAhISh2ICYgbWFzayksICp0YWIrKyk7CisgICAgICAgICAgbWFzayA+Pj0gMTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcCA9IHJlcy0+cHJvYltWUDhFbmNCYW5kc1tuXV1bMl07CisgICAgfQorICAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIHNpZ24pOworICAgIGlmIChuID09IDE2IHx8ICFWUDhQdXRCaXQoYncsIG4gPD0gcmVzLT5sYXN0LCBwWzBdKSkgeworICAgICAgcmV0dXJuIDE7ICAgLy8gRU9CCisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBDb2RlUmVzaWR1YWxzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgeCwgeSwgY2g7CisgIFZQOFJlc2lkdWFsIHJlczsKKyAgdWludDY0X3QgcG9zMSwgcG9zMiwgcG9zMzsKKyAgY29uc3QgaW50IGkxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKyAgY29uc3QgaW50IHNlZ21lbnQgPSBpdC0+bWJfLT5zZWdtZW50XzsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisKKyAgVlA4SXRlcmF0b3JOelRvQnl0ZXMoaXQpOworCisgIHBvczEgPSBWUDhCaXRXcml0ZXJQb3MoYncpOworICBpZiAoaTE2KSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDEsIGVuYywgJnJlcyk7CisgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnlfZGNfbGV2ZWxzLCAmcmVzKTsKKyAgICBpdC0+dG9wX256X1s4XSA9IGl0LT5sZWZ0X256X1s4XSA9CisgICAgICBQdXRDb2VmZnMoYncsIGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdLCAmcmVzKTsKKyAgICBWUDhJbml0UmVzaWR1YWwoMSwgMCwgZW5jLCAmcmVzKTsKKyAgfSBlbHNlIHsKKyAgICBWUDhJbml0UmVzaWR1YWwoMCwgMywgZW5jLCAmcmVzKTsKKyAgfQorCisgIC8vIGx1bWEtQUMKKyAgZm9yICh5ID0gMDsgeSA8IDQ7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gpIHsKKyAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1t4XSArIGl0LT5sZWZ0X256X1t5XTsKKyAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2FjX2xldmVsc1t4ICsgeSAqIDRdLCAmcmVzKTsKKyAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gUHV0Q29lZmZzKGJ3LCBjdHgsICZyZXMpOworICAgIH0KKyAgfQorICBwb3MyID0gVlA4Qml0V3JpdGVyUG9zKGJ3KTsKKworICAvLyBVL1YKKyAgVlA4SW5pdFJlc2lkdWFsKDAsIDIsIGVuYywgJnJlcyk7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAyOyBjaCArPSAyKSB7CisgICAgZm9yICh5ID0gMDsgeSA8IDI7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9bNCArIGNoICsgeF0gKyBpdC0+bGVmdF9uel9bNCArIGNoICsgeV07CisgICAgICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT51dl9sZXZlbHNbY2ggKiAyICsgeCArIHkgKiAyXSwgJnJlcyk7CisgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0KKyAgICAgICAgICAgIFB1dENvZWZmcyhidywgY3R4LCAmcmVzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcG9zMyA9IFZQOEJpdFdyaXRlclBvcyhidyk7CisgIGl0LT5sdW1hX2JpdHNfID0gcG9zMiAtIHBvczE7CisgIGl0LT51dl9iaXRzXyA9IHBvczMgLSBwb3MyOworICBpdC0+Yml0X2NvdW50X1tzZWdtZW50XVtpMTZdICs9IGl0LT5sdW1hX2JpdHNfOworICBpdC0+Yml0X2NvdW50X1tzZWdtZW50XVsyXSArPSBpdC0+dXZfYml0c187CisgIFZQOEl0ZXJhdG9yQnl0ZXNUb056KGl0KTsKK30KKworLy8gU2FtZSBhcyBDb2RlUmVzaWR1YWxzLCBidXQgZG9lc24ndCBhY3R1YWxseSB3cml0ZSBhbnl0aGluZy4KKy8vIEluc3RlYWQsIGl0IGp1c3QgcmVjb3JkcyB0aGUgZXZlbnQgZGlzdHJpYnV0aW9uLgorc3RhdGljIHZvaWQgUmVjb3JkUmVzaWR1YWxzKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIGludCB4LCB5LCBjaDsKKyAgVlA4UmVzaWR1YWwgcmVzOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKworICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7CisKKyAgaWYgKGl0LT5tYl8tPnR5cGVfID09IDEpIHsgICAvLyBpMTZ4MTYKKyAgICBWUDhJbml0UmVzaWR1YWwoMCwgMSwgZW5jLCAmcmVzKTsKKyAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9kY19sZXZlbHMsICZyZXMpOworICAgIGl0LT50b3BfbnpfWzhdID0gaXQtPmxlZnRfbnpfWzhdID0KKyAgICAgIFZQOFJlY29yZENvZWZmcyhpdC0+dG9wX256X1s4XSArIGl0LT5sZWZ0X256X1s4XSwgJnJlcyk7CisgICAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIH0gZWxzZSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIH0KKworICAvLyBsdW1hLUFDCisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9IFZQOFJlY29yZENvZWZmcyhjdHgsICZyZXMpOworICAgIH0KKyAgfQorCisgIC8vIFUvVgorICBWUDhJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKKyAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQorICAgICAgICAgICAgVlA4UmVjb3JkQ29lZmZzKGN0eCwgJnJlcyk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgVlA4SXRlcmF0b3JCeXRlc1RvTnooaXQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVG9rZW4gYnVmZmVyCisKKyNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKKworc3RhdGljIGludCBSZWNvcmRUb2tlbnMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBjb25zdCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKSB7CisgIGludCB4LCB5LCBjaDsKKyAgVlA4UmVzaWR1YWwgcmVzOworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKworICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7CisgIGlmIChpdC0+bWJfLT50eXBlXyA9PSAxKSB7ICAgLy8gaTE2eDE2CisgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzhdICsgaXQtPmxlZnRfbnpfWzhdOworICAgIFZQOEluaXRSZXNpZHVhbCgwLCAxLCBlbmMsICZyZXMpOworICAgIFZQOFNldFJlc2lkdWFsQ29lZmZzKHJkLT55X2RjX2xldmVscywgJnJlcyk7CisgICAgaXQtPnRvcF9uel9bOF0gPSBpdC0+bGVmdF9uel9bOF0gPQorICAgICAgICBWUDhSZWNvcmRDb2VmZlRva2VucyhjdHgsICZyZXMsIHRva2Vucyk7CisgICAgVlA4SW5pdFJlc2lkdWFsKDEsIDAsIGVuYywgJnJlcyk7CisgIH0gZWxzZSB7CisgICAgVlA4SW5pdFJlc2lkdWFsKDAsIDMsIGVuYywgJnJlcyk7CisgIH0KKworICAvLyBsdW1hLUFDCisgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgNDsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICBWUDhTZXRSZXNpZHVhbENvZWZmcyhyZC0+eV9hY19sZXZlbHNbeCArIHkgKiA0XSwgJnJlcyk7CisgICAgICBpdC0+dG9wX256X1t4XSA9IGl0LT5sZWZ0X256X1t5XSA9CisgICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAmcmVzLCB0b2tlbnMpOworICAgIH0KKyAgfQorCisgIC8vIFUvVgorICBWUDhJbml0UmVzaWR1YWwoMCwgMiwgZW5jLCAmcmVzKTsKKyAgZm9yIChjaCA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICBmb3IgKHkgPSAwOyB5IDwgMjsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgMjsgKyt4KSB7CisgICAgICAgIGNvbnN0IGludCBjdHggPSBpdC0+dG9wX256X1s0ICsgY2ggKyB4XSArIGl0LT5sZWZ0X256X1s0ICsgY2ggKyB5XTsKKyAgICAgICAgVlA4U2V0UmVzaWR1YWxDb2VmZnMocmQtPnV2X2xldmVsc1tjaCAqIDIgKyB4ICsgeSAqIDJdLCAmcmVzKTsKKyAgICAgICAgaXQtPnRvcF9uel9bNCArIGNoICsgeF0gPSBpdC0+bGVmdF9uel9bNCArIGNoICsgeV0gPQorICAgICAgICAgICAgVlA4UmVjb3JkQ29lZmZUb2tlbnMoY3R4LCAmcmVzLCB0b2tlbnMpOworICAgICAgfQorICAgIH0KKyAgfQorICBWUDhJdGVyYXRvckJ5dGVzVG9OeihpdCk7CisgIHJldHVybiAhdG9rZW5zLT5lcnJvcl87Cit9CisKKyNlbmRpZiAgICAvLyAhRElTQUJMRV9UT0tFTl9CVUZGRVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEV4dHJhSW5mbyBtYXAgLyBEZWJ1ZyBmdW5jdGlvbgorCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQorCisjaWYgU0VHTUVOVF9WSVNVCitzdGF0aWMgdm9pZCBTZXRCbG9jayh1aW50OF90KiBwLCBpbnQgdmFsdWUsIGludCBzaXplKSB7CisgIGludCB5OworICBmb3IgKHkgPSAwOyB5IDwgc2l6ZTsgKyt5KSB7CisgICAgbWVtc2V0KHAsIHZhbHVlLCBzaXplKTsKKyAgICBwICs9IEJQUzsKKyAgfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIFJlc2V0U1NFKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBlbmMtPnNzZV9bMF0gPSAwOworICBlbmMtPnNzZV9bMV0gPSAwOworICBlbmMtPnNzZV9bMl0gPSAwOworICAvLyBOb3RlOiBlbmMtPnNzZV9bM10gaXMgbWFuYWdlZCBieSBhbHBoYS5jCisgIGVuYy0+c3NlX2NvdW50XyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIFN0b3JlU1NFKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgaW4gPSBpdC0+eXV2X2luXzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgb3V0ID0gaXQtPnl1dl9vdXRfOworICAvLyBOb3RlOiBub3QgdG90YWxseSBhY2N1cmF0ZSBhdCBib3VuZGFyeS4gQW5kIGRvZXNuJ3QgaW5jbHVkZSBpbi1sb29wIGZpbHRlci4KKyAgZW5jLT5zc2VfWzBdICs9IFZQOFNTRTE2eDE2KGluICsgWV9PRkZfRU5DLCBvdXQgKyBZX09GRl9FTkMpOworICBlbmMtPnNzZV9bMV0gKz0gVlA4U1NFOHg4KGluICsgVV9PRkZfRU5DLCBvdXQgKyBVX09GRl9FTkMpOworICBlbmMtPnNzZV9bMl0gKz0gVlA4U1NFOHg4KGluICsgVl9PRkZfRU5DLCBvdXQgKyBWX09GRl9FTkMpOworICBlbmMtPnNzZV9jb3VudF8gKz0gMTYgKiAxNjsKK30KKworc3RhdGljIHZvaWQgU3RvcmVTaWRlSW5mbyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IFZQOE1CSW5mbyogY29uc3QgbWIgPSBpdC0+bWJfOworICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworCisgIGlmIChwaWMtPnN0YXRzICE9IE5VTEwpIHsKKyAgICBTdG9yZVNTRShpdCk7CisgICAgZW5jLT5ibG9ja19jb3VudF9bMF0gKz0gKG1iLT50eXBlXyA9PSAwKTsKKyAgICBlbmMtPmJsb2NrX2NvdW50X1sxXSArPSAobWItPnR5cGVfID09IDEpOworICAgIGVuYy0+YmxvY2tfY291bnRfWzJdICs9IChtYi0+c2tpcF8gIT0gMCk7CisgIH0KKworICBpZiAocGljLT5leHRyYV9pbmZvICE9IE5VTEwpIHsKKyAgICB1aW50OF90KiBjb25zdCBpbmZvID0gJnBpYy0+ZXh0cmFfaW5mb1tpdC0+eF8gKyBpdC0+eV8gKiBlbmMtPm1iX3dfXTsKKyAgICBzd2l0Y2ggKHBpYy0+ZXh0cmFfaW5mb190eXBlKSB7CisgICAgICBjYXNlIDE6ICppbmZvID0gbWItPnR5cGVfOyBicmVhazsKKyAgICAgIGNhc2UgMjogKmluZm8gPSBtYi0+c2VnbWVudF87IGJyZWFrOworICAgICAgY2FzZSAzOiAqaW5mbyA9IGVuYy0+ZHFtX1ttYi0+c2VnbWVudF9dLnF1YW50XzsgYnJlYWs7CisgICAgICBjYXNlIDQ6ICppbmZvID0gKG1iLT50eXBlXyA9PSAxKSA/IGl0LT5wcmVkc19bMF0gOiAweGZmOyBicmVhazsKKyAgICAgIGNhc2UgNTogKmluZm8gPSBtYi0+dXZfbW9kZV87IGJyZWFrOworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGNvbnN0IGludCBiID0gKGludCkoKGl0LT5sdW1hX2JpdHNfICsgaXQtPnV2X2JpdHNfICsgNykgPj4gMyk7CisgICAgICAgICppbmZvID0gKGIgPiAyNTUpID8gMjU1IDogYjsgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIDc6ICppbmZvID0gbWItPmFscGhhXzsgYnJlYWs7CisgICAgICBkZWZhdWx0OiAqaW5mbyA9IDA7IGJyZWFrOworICAgIH0KKyAgfQorI2lmIFNFR01FTlRfVklTVSAgLy8gdmlzdWFsaXplIHNlZ21lbnRzIGFuZCBwcmVkaWN0aW9uIG1vZGVzCisgIFNldEJsb2NrKGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQywgbWItPnNlZ21lbnRfICogNjQsIDE2KTsKKyAgU2V0QmxvY2soaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DLCBpdC0+cHJlZHNfWzBdICogNjQsIDgpOworICBTZXRCbG9jayhpdC0+eXV2X291dF8gKyBWX09GRl9FTkMsIG1iLT51dl9tb2RlXyAqIDY0LCA4KTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBSZXNldFNpZGVJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgeworICAgIG1lbXNldChlbmMtPmJsb2NrX2NvdW50XywgMCwgc2l6ZW9mKGVuYy0+YmxvY2tfY291bnRfKSk7CisgIH0KKyAgUmVzZXRTU0UoZW5jKTsKK30KKyNlbHNlICAvLyBkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKK3N0YXRpYyB2b2lkIFJlc2V0U1NFKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICAodm9pZCllbmM7Cit9CitzdGF0aWMgdm9pZCBTdG9yZVNpZGVJbmZvKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKKyAgaWYgKHBpYy0+ZXh0cmFfaW5mbyAhPSBOVUxMKSB7CisgICAgaWYgKGl0LT54XyA9PSAwICYmIGl0LT55XyA9PSAwKSB7ICAgLy8gb25seSBkbyBpdCBvbmNlLCBhdCBzdGFydAorICAgICAgbWVtc2V0KHBpYy0+ZXh0cmFfaW5mbywgMCwKKyAgICAgICAgICAgICBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyAqIHNpemVvZigqcGljLT5leHRyYV9pbmZvKSk7CisgICAgfQorICB9Cit9CisKK3N0YXRpYyB2b2lkIFJlc2V0U2lkZUluZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgICh2b2lkKWl0OworfQorI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisKK3N0YXRpYyBkb3VibGUgR2V0UFNOUih1aW50NjRfdCBtc2UsIHVpbnQ2NF90IHNpemUpIHsKKyAgcmV0dXJuIChtc2UgPiAwICYmIHNpemUgPiAwKSA/IDEwLiAqIGxvZzEwKDI1NS4gKiAyNTUuICogc2l6ZSAvIG1zZSkgOiA5OTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdGF0TG9vcCgpOiBvbmx5IGNvbGxlY3Qgc3RhdGlzdGljcyAobnVtYmVyIG9mIHNraXBzLCB0b2tlbiB1c2FnZSwgLi4uKS4KKy8vICBUaGlzIGlzIHVzZWQgZm9yIGRlY2lkaW5nIG9wdGltYWwgcHJvYmFiaWxpdGllcy4gSXQgYWxzbyBtb2RpZmllcyB0aGUKKy8vICBxdWFudGl6ZXIgdmFsdWUgaWYgc29tZSB0YXJnZXQgKHNpemUsIFBTTlIpIHdhcyBzcGVjaWZpZWQuCisKK3N0YXRpYyB2b2lkIFNldExvb3BQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxKSB7CisgIC8vIE1ha2Ugc3VyZSB0aGUgcXVhbGl0eSBwYXJhbWV0ZXIgaXMgaW5zaWRlIHZhbGlkIGJvdW5kcworICBxID0gQ2xhbXAocSwgMC5mLCAxMDAuZik7CisKKyAgVlA4U2V0U2VnbWVudFBhcmFtcyhlbmMsIHEpOyAgICAgIC8vIHNldHVwIHNlZ21lbnQgcXVhbnRpemF0aW9ucyBhbmQgZmlsdGVycworICBTZXRTZWdtZW50UHJvYmFzKGVuYyk7ICAgICAgICAgICAgLy8gY29tcHV0ZSBzZWdtZW50IHByb2JhYmlsaXRpZXMKKworICBSZXNldFN0YXRzKGVuYyk7CisgIFJlc2V0U1NFKGVuYyk7Cit9CisKK3N0YXRpYyB1aW50NjRfdCBPbmVTdGF0UGFzcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOFJETGV2ZWwgcmRfb3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuYl9tYnMsIGludCBwZXJjZW50X2RlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NTdGF0cyogY29uc3QgcykgeworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgdWludDY0X3Qgc2l6ZSA9IDA7CisgIHVpbnQ2NF90IHNpemVfcDAgPSAwOworICB1aW50NjRfdCBkaXN0b3J0aW9uID0gMDsKKyAgY29uc3QgdWludDY0X3QgcGl4ZWxfY291bnQgPSBuYl9tYnMgKiAzODQ7CisKKyAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKKyAgU2V0TG9vcFBhcmFtcyhlbmMsIHMtPnEpOworICBkbyB7CisgICAgVlA4TW9kZVNjb3JlIGluZm87CisgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0LCBOVUxMKTsKKyAgICBpZiAoVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSkgeworICAgICAgLy8gSnVzdCByZWNvcmQgdGhlIG51bWJlciBvZiBza2lwcyBhbmQgYWN0IGxpa2Ugc2tpcF9wcm9iYSBpcyBub3QgdXNlZC4KKyAgICAgICsrZW5jLT5wcm9iYV8ubmJfc2tpcF87CisgICAgfQorICAgIFJlY29yZFJlc2lkdWFscygmaXQsICZpbmZvKTsKKyAgICBzaXplICs9IGluZm8uUiArIGluZm8uSDsKKyAgICBzaXplX3AwICs9IGluZm8uSDsKKyAgICBkaXN0b3J0aW9uICs9IGluZm8uRDsKKyAgICBpZiAocGVyY2VudF9kZWx0YSAmJiAhVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIHBlcmNlbnRfZGVsdGEpKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoJml0KTsKKyAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCkgJiYgLS1uYl9tYnMgPiAwKTsKKworICBzaXplX3AwICs9IGVuYy0+c2VnbWVudF9oZHJfLnNpemVfOworICBpZiAocy0+ZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICBzaXplICs9IEZpbmFsaXplU2tpcFByb2JhKGVuYyk7CisgICAgc2l6ZSArPSBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7CisgICAgc2l6ZSA9ICgoc2l6ZSArIHNpemVfcDAgKyAxMDI0KSA+PiAxMSkgKyBIRUFERVJfU0laRV9FU1RJTUFURTsKKyAgICBzLT52YWx1ZSA9IChkb3VibGUpc2l6ZTsKKyAgfSBlbHNlIHsKKyAgICBzLT52YWx1ZSA9IEdldFBTTlIoZGlzdG9ydGlvbiwgcGl4ZWxfY291bnQpOworICB9CisgIHJldHVybiBzaXplX3AwOworfQorCitzdGF0aWMgaW50IFN0YXRMb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBpbnQgbWV0aG9kID0gZW5jLT5tZXRob2RfOworICBjb25zdCBpbnQgZG9fc2VhcmNoID0gZW5jLT5kb19zZWFyY2hfOworICBjb25zdCBpbnQgZmFzdF9wcm9iZSA9ICgobWV0aG9kID09IDAgfHwgbWV0aG9kID09IDMpICYmICFkb19zZWFyY2gpOworICBpbnQgbnVtX3Bhc3NfbGVmdCA9IGVuYy0+Y29uZmlnXy0+cGFzczsKKyAgY29uc3QgaW50IHRhc2tfcGVyY2VudCA9IDIwOworICBjb25zdCBpbnQgcGVyY2VudF9wZXJfcGFzcyA9CisgICAgICAodGFza19wZXJjZW50ICsgbnVtX3Bhc3NfbGVmdCAvIDIpIC8gbnVtX3Bhc3NfbGVmdDsKKyAgY29uc3QgaW50IGZpbmFsX3BlcmNlbnQgPSBlbmMtPnBlcmNlbnRfICsgdGFza19wZXJjZW50OworICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9CisgICAgICAobWV0aG9kID49IDMgfHwgZG9fc2VhcmNoKSA/IFJEX09QVF9CQVNJQyA6IFJEX09QVF9OT05FOworICBpbnQgbmJfbWJzID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgIFBhc3NTdGF0cyBzdGF0czsKKworICBJbml0UGFzc1N0YXRzKGVuYywgJnN0YXRzKTsKKyAgUmVzZXRUb2tlblN0YXRzKGVuYyk7CisKKyAgLy8gRmFzdCBtb2RlOiBxdWljayBhbmFseXNpcyBwYXNzIG92ZXIgZmV3IG1icy4gQmV0dGVyIHRoYW4gbm90aGluZy4KKyAgaWYgKGZhc3RfcHJvYmUpIHsKKyAgICBpZiAobWV0aG9kID09IDMpIHsgIC8vIHdlIG5lZWQgbW9yZSBzdGF0cyBmb3IgbWV0aG9kIDMgdG8gYmUgcmVsaWFibGUuCisgICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAxIDogMTAwOworICAgIH0gZWxzZSB7CisgICAgICBuYl9tYnMgPSAobmJfbWJzID4gMjAwKSA/IG5iX21icyA+PiAyIDogNTA7CisgICAgfQorICB9CisKKyAgd2hpbGUgKG51bV9wYXNzX2xlZnQtLSA+IDApIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9wYXNzID0gKGZhYnMoc3RhdHMuZHEpIDw9IERRX0xJTUlUKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnVtX3Bhc3NfbGVmdCA9PSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApOworICAgIGNvbnN0IHVpbnQ2NF90IHNpemVfcDAgPQorICAgICAgICBPbmVTdGF0UGFzcyhlbmMsIHJkX29wdCwgbmJfbWJzLCBwZXJjZW50X3Blcl9wYXNzLCAmc3RhdHMpOworICAgIGlmIChzaXplX3AwID09IDApIHJldHVybiAwOworI2lmIChERUJVR19TRUFSQ0ggPiAwKQorICAgIHByaW50ZigiIyVkIHZhbHVlOiUuMWxmIC0+ICUuMWxmICAgcTolLjJmIC0+ICUuMmZcbiIsCisgICAgICAgICAgIG51bV9wYXNzX2xlZnQsIHN0YXRzLmxhc3RfdmFsdWUsIHN0YXRzLnZhbHVlLCBzdGF0cy5sYXN0X3EsIHN0YXRzLnEpOworI2VuZGlmCisgICAgaWYgKGVuYy0+bWF4X2k0X2hlYWRlcl9iaXRzXyA+IDAgJiYgc2l6ZV9wMCA+IFBBUlRJVElPTjBfU0laRV9MSU1JVCkgeworICAgICAgKytudW1fcGFzc19sZWZ0OworICAgICAgZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID4+PSAxOyAgLy8gc3RyZW5ndGhlbiBoZWFkZXIgYml0IGxpbWl0YXRpb24uLi4KKyAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBzdGFydCBvdmVyCisgICAgfQorICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBJZiBubyB0YXJnZXQgc2l6ZToganVzdCBkbyBzZXZlcmFsIHBhc3Mgd2l0aG91dCBjaGFuZ2luZyAncScKKyAgICBpZiAoZG9fc2VhcmNoKSB7CisgICAgICBDb21wdXRlTmV4dFEoJnN0YXRzKTsKKyAgICAgIGlmIChmYWJzKHN0YXRzLmRxKSA8PSBEUV9MSU1JVCkgYnJlYWs7CisgICAgfQorICB9CisgIGlmICghZG9fc2VhcmNoIHx8ICFzdGF0cy5kb19zaXplX3NlYXJjaCkgeworICAgIC8vIE5lZWQgdG8gZmluYWxpemUgcHJvYmFzIG5vdywgc2luY2UgaXQgd2Fzbid0IGRvbmUgZHVyaW5nIHRoZSBzZWFyY2guCisgICAgRmluYWxpemVTa2lwUHJvYmEoZW5jKTsKKyAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7CisgIH0KKyAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cygmZW5jLT5wcm9iYV8pOyAgLy8gZmluYWxpemUgY29zdHMKKyAgcmV0dXJuIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIGZpbmFsX3BlcmNlbnQsICZlbmMtPnBlcmNlbnRfKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1haW4gbG9vcHMKKy8vCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtBdmVyYWdlQnl0ZXNQZXJNQls4XSA9IHsgNTAsIDI0LCAxNiwgOSwgNywgNSwgMywgMiB9OworCitzdGF0aWMgaW50IFByZUxvb3BJbml0aWFsaXplKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgcDsKKyAgaW50IG9rID0gMTsKKyAgY29uc3QgaW50IGF2ZXJhZ2VfYnl0ZXNfcGVyX01CID0ga0F2ZXJhZ2VCeXRlc1Blck1CW2VuYy0+YmFzZV9xdWFudF8gPj4gNF07CisgIGNvbnN0IGludCBieXRlc19wZXJfcGFydHMgPQorICAgICAgZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8gKiBhdmVyYWdlX2J5dGVzX3Blcl9NQiAvIGVuYy0+bnVtX3BhcnRzXzsKKyAgLy8gSW5pdGlhbGl6ZSB0aGUgYml0LXdyaXRlcnMKKyAgZm9yIChwID0gMDsgb2sgJiYgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgb2sgPSBWUDhCaXRXcml0ZXJJbml0KGVuYy0+cGFydHNfICsgcCwgYnl0ZXNfcGVyX3BhcnRzKTsKKyAgfQorICBpZiAoIW9rKSB7CisgICAgVlA4RW5jRnJlZUJpdFdyaXRlcnMoZW5jKTsgIC8vIG1hbGxvYyBlcnJvciBvY2N1cnJlZAorICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICByZXR1cm4gb2s7Cit9CisKK3N0YXRpYyBpbnQgUG9zdExvb3BGaW5hbGl6ZShWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCBvaykgeworICBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgaWYgKG9rKSB7ICAgICAgLy8gRmluYWxpemUgdGhlIHBhcnRpdGlvbnMsIGNoZWNrIGZvciBleHRyYSBlcnJvcnMuCisgICAgaW50IHA7CisgICAgZm9yIChwID0gMDsgcCA8IGVuYy0+bnVtX3BhcnRzXzsgKytwKSB7CisgICAgICBWUDhCaXRXcml0ZXJGaW5pc2goZW5jLT5wYXJ0c18gKyBwKTsKKyAgICAgIG9rICY9ICFlbmMtPnBhcnRzX1twXS5lcnJvcl87CisgICAgfQorICB9CisKKyAgaWYgKG9rKSB7ICAgICAgLy8gQWxsIGdvb2QuIEZpbmlzaCB1cC4KKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgaWYgKGVuYy0+cGljXy0+c3RhdHMgIT0gTlVMTCkgeyAgLy8gZmluYWxpemUgYnl0ZSBjb3VudGVycy4uLgorICAgICAgaW50IGksIHM7CisgICAgICBmb3IgKGkgPSAwOyBpIDw9IDI7ICsraSkgeworICAgICAgICBmb3IgKHMgPSAwOyBzIDwgTlVNX01CX1NFR01FTlRTOyArK3MpIHsKKyAgICAgICAgICBlbmMtPnJlc2lkdWFsX2J5dGVzX1tpXVtzXSA9IChpbnQpKChpdC0+Yml0X2NvdW50X1tzXVtpXSArIDcpID4+IDMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoaXQpOyAgICAgLy8gLi4uYW5kIHN0b3JlIGZpbHRlciBzdGF0cy4KKyAgfSBlbHNlIHsKKyAgICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkIC0+IG5lZWQgdG8gZG8gc29tZSBtZW1vcnkgY2xlYW51cC4KKyAgICBWUDhFbmNGcmVlQml0V3JpdGVycyhlbmMpOworICB9CisgIHJldHVybiBvazsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBWUDhFbmNMb29wKCk6IGRvZXMgdGhlIGZpbmFsIGJpdHN0cmVhbSBjb2RpbmcuCisKK3N0YXRpYyB2b2lkIFJlc2V0QWZ0ZXJTa2lwKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpZiAoaXQtPm1iXy0+dHlwZV8gPT0gMSkgeworICAgICppdC0+bnpfID0gMDsgIC8vIHJlc2V0IGFsbCBwcmVkaWN0b3JzCisgICAgaXQtPmxlZnRfbnpfWzhdID0gMDsKKyAgfSBlbHNlIHsKKyAgICAqaXQtPm56XyAmPSAoMSA8PCAyNCk7ICAvLyBwcmVzZXJ2ZSB0aGUgZGNfbnogYml0CisgIH0KK30KKworaW50IFZQOEVuY0xvb3AoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIFZQOEVuY0l0ZXJhdG9yIGl0OworICBpbnQgb2sgPSBQcmVMb29wSW5pdGlhbGl6ZShlbmMpOworICBpZiAoIW9rKSByZXR1cm4gMDsKKworICBTdGF0TG9vcChlbmMpOyAgLy8gc3RhdHMtY29sbGVjdGlvbiBsb29wCisKKyAgVlA4SXRlcmF0b3JJbml0KGVuYywgJml0KTsKKyAgVlA4SW5pdEZpbHRlcigmaXQpOworICBkbyB7CisgICAgVlA4TW9kZVNjb3JlIGluZm87CisgICAgY29uc3QgaW50IGRvbnRfdXNlX3NraXAgPSAhZW5jLT5wcm9iYV8udXNlX3NraXBfcHJvYmFfOworICAgIGNvbnN0IFZQOFJETGV2ZWwgcmRfb3B0ID0gZW5jLT5yZF9vcHRfbGV2ZWxfOworCisgICAgVlA4SXRlcmF0b3JJbXBvcnQoJml0LCBOVUxMKTsKKyAgICAvLyBXYXJuaW5nISBvcmRlciBpcyBpbXBvcnRhbnQ6IGZpcnN0IGNhbGwgVlA4RGVjaW1hdGUoKSBhbmQKKyAgICAvLyAqdGhlbiogZGVjaWRlIGhvdyB0byBjb2RlIHRoZSBza2lwIGRlY2lzaW9uIGlmIHRoZXJlJ3Mgb25lLgorICAgIGlmICghVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KSB8fCBkb250X3VzZV9za2lwKSB7CisgICAgICBDb2RlUmVzaWR1YWxzKGl0LmJ3XywgJml0LCAmaW5mbyk7CisgICAgfSBlbHNlIHsgICAvLyByZXNldCBwcmVkaWN0b3JzIGFmdGVyIGEgc2tpcAorICAgICAgUmVzZXRBZnRlclNraXAoJml0KTsKKyAgICB9CisgICAgU3RvcmVTaWRlSW5mbygmaXQpOworICAgIFZQOFN0b3JlRmlsdGVyU3RhdHMoJml0KTsKKyAgICBWUDhJdGVyYXRvckV4cG9ydCgmaXQpOworICAgIG9rID0gVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIDIwKTsKKyAgICBWUDhJdGVyYXRvclNhdmVCb3VuZGFyeSgmaXQpOworICB9IHdoaWxlIChvayAmJiBWUDhJdGVyYXRvck5leHQoJml0KSk7CisKKyAgcmV0dXJuIFBvc3RMb29wRmluYWxpemUoJml0LCBvayk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW5nbGUgcGFzcyB1c2luZyBUb2tlbiBCdWZmZXIuCisKKyNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKKworI2RlZmluZSBNSU5fQ09VTlQgOTYgIC8vIG1pbmltdW0gbnVtYmVyIG9mIG1hY3JvYmxvY2tzIGJlZm9yZSB1cGRhdGluZyBzdGF0cworCitpbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICAvLyBSb3VnaGx5IHJlZnJlc2ggdGhlIHByb2JhIGVpZ2h0IHRpbWVzIHBlciBwYXNzCisgIGludCBtYXhfY291bnQgPSAoZW5jLT5tYl93XyAqIGVuYy0+bWJfaF8pID4+IDM7CisgIGludCBudW1fcGFzc19sZWZ0ID0gZW5jLT5jb25maWdfLT5wYXNzOworICBjb25zdCBpbnQgZG9fc2VhcmNoID0gZW5jLT5kb19zZWFyY2hfOworICBWUDhFbmNJdGVyYXRvciBpdDsKKyAgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2JhID0gJmVuYy0+cHJvYmFfOworICBjb25zdCBWUDhSRExldmVsIHJkX29wdCA9IGVuYy0+cmRfb3B0X2xldmVsXzsKKyAgY29uc3QgdWludDY0X3QgcGl4ZWxfY291bnQgPSBlbmMtPm1iX3dfICogZW5jLT5tYl9oXyAqIDM4NDsKKyAgUGFzc1N0YXRzIHN0YXRzOworICBpbnQgb2s7CisKKyAgSW5pdFBhc3NTdGF0cyhlbmMsICZzdGF0cyk7CisgIG9rID0gUHJlTG9vcEluaXRpYWxpemUoZW5jKTsKKyAgaWYgKCFvaykgcmV0dXJuIDA7CisKKyAgaWYgKG1heF9jb3VudCA8IE1JTl9DT1VOVCkgbWF4X2NvdW50ID0gTUlOX0NPVU5UOworCisgIGFzc2VydChlbmMtPm51bV9wYXJ0c18gPT0gMSk7CisgIGFzc2VydChlbmMtPnVzZV90b2tlbnNfKTsKKyAgYXNzZXJ0KHByb2JhLT51c2Vfc2tpcF9wcm9iYV8gPT0gMCk7CisgIGFzc2VydChyZF9vcHQgPj0gUkRfT1BUX0JBU0lDKTsgICAvLyBvdGhlcndpc2UsIHRva2VuLWJ1ZmZlciB3b24ndCBiZSB1c2VmdWwKKyAgYXNzZXJ0KG51bV9wYXNzX2xlZnQgPiAwKTsKKworICB3aGlsZSAob2sgJiYgbnVtX3Bhc3NfbGVmdC0tID4gMCkgeworICAgIGNvbnN0IGludCBpc19sYXN0X3Bhc3MgPSAoZmFicyhzdGF0cy5kcSkgPD0gRFFfTElNSVQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1fcGFzc19sZWZ0ID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPT0gMCk7CisgICAgdWludDY0X3Qgc2l6ZV9wMCA9IDA7CisgICAgdWludDY0X3QgZGlzdG9ydGlvbiA9IDA7CisgICAgaW50IGNudCA9IG1heF9jb3VudDsKKyAgICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOworICAgIFNldExvb3BQYXJhbXMoZW5jLCBzdGF0cy5xKTsKKyAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICBSZXNldFRva2VuU3RhdHMoZW5jKTsKKyAgICAgIFZQOEluaXRGaWx0ZXIoJml0KTsgIC8vIGRvbid0IGNvbGxlY3Qgc3RhdHMgdW50aWwgbGFzdCBwYXNzICh0b28gY29zdGx5KQorICAgIH0KKyAgICBWUDhUQnVmZmVyQ2xlYXIoJmVuYy0+dG9rZW5zXyk7CisgICAgZG8geworICAgICAgVlA4TW9kZVNjb3JlIGluZm87CisgICAgICBWUDhJdGVyYXRvckltcG9ydCgmaXQsIE5VTEwpOworICAgICAgaWYgKC0tY250IDwgMCkgeworICAgICAgICBGaW5hbGl6ZVRva2VuUHJvYmFzKHByb2JhKTsKKyAgICAgICAgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cyhwcm9iYSk7ICAvLyByZWZyZXNoIGNvc3QgdGFibGVzIGZvciByZC1vcHQKKyAgICAgICAgY250ID0gbWF4X2NvdW50OworICAgICAgfQorICAgICAgVlA4RGVjaW1hdGUoJml0LCAmaW5mbywgcmRfb3B0KTsKKyAgICAgIG9rID0gUmVjb3JkVG9rZW5zKCZpdCwgJmluZm8sICZlbmMtPnRva2Vuc18pOworICAgICAgaWYgKCFvaykgeworICAgICAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgc2l6ZV9wMCArPSBpbmZvLkg7CisgICAgICBkaXN0b3J0aW9uICs9IGluZm8uRDsKKyAgICAgIGlmIChpc19sYXN0X3Bhc3MpIHsKKyAgICAgICAgU3RvcmVTaWRlSW5mbygmaXQpOworICAgICAgICBWUDhTdG9yZUZpbHRlclN0YXRzKCZpdCk7CisgICAgICAgIFZQOEl0ZXJhdG9yRXhwb3J0KCZpdCk7CisgICAgICAgIG9rID0gVlA4SXRlcmF0b3JQcm9ncmVzcygmaXQsIDIwKTsKKyAgICAgIH0KKyAgICAgIFZQOEl0ZXJhdG9yU2F2ZUJvdW5kYXJ5KCZpdCk7CisgICAgfSB3aGlsZSAob2sgJiYgVlA4SXRlcmF0b3JOZXh0KCZpdCkpOworICAgIGlmICghb2spIGJyZWFrOworCisgICAgc2l6ZV9wMCArPSBlbmMtPnNlZ21lbnRfaGRyXy5zaXplXzsKKyAgICBpZiAoc3RhdHMuZG9fc2l6ZV9zZWFyY2gpIHsKKyAgICAgIHVpbnQ2NF90IHNpemUgPSBGaW5hbGl6ZVRva2VuUHJvYmFzKCZlbmMtPnByb2JhXyk7CisgICAgICBzaXplICs9IFZQOEVzdGltYXRlVG9rZW5TaXplKCZlbmMtPnRva2Vuc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90Kilwcm9iYS0+Y29lZmZzXyk7CisgICAgICBzaXplID0gKHNpemUgKyBzaXplX3AwICsgMTAyNCkgPj4gMTE7ICAvLyAtPiBzaXplIGluIGJ5dGVzCisgICAgICBzaXplICs9IEhFQURFUl9TSVpFX0VTVElNQVRFOworICAgICAgc3RhdHMudmFsdWUgPSAoZG91YmxlKXNpemU7CisgICAgfSBlbHNlIHsgIC8vIGNvbXB1dGUgYW5kIHN0b3JlIFBTTlIKKyAgICAgIHN0YXRzLnZhbHVlID0gR2V0UFNOUihkaXN0b3J0aW9uLCBwaXhlbF9jb3VudCk7CisgICAgfQorCisjaWYgKERFQlVHX1NFQVJDSCA+IDApCisgICAgcHJpbnRmKCIjJTJkIG1ldHJpYzolLjFsZiAtPiAlLjFsZiAgIGxhc3RfcT0lLjJsZiBxPSUuMmxmIGRxPSUuMmxmXG4iLAorICAgICAgICAgICBudW1fcGFzc19sZWZ0LCBzdGF0cy5sYXN0X3ZhbHVlLCBzdGF0cy52YWx1ZSwKKyAgICAgICAgICAgc3RhdHMubGFzdF9xLCBzdGF0cy5xLCBzdGF0cy5kcSk7CisjZW5kaWYKKyAgICBpZiAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID4gMCAmJiBzaXplX3AwID4gUEFSVElUSU9OMF9TSVpFX0xJTUlUKSB7CisgICAgICArK251bV9wYXNzX2xlZnQ7CisgICAgICBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18gPj49IDE7ICAvLyBzdHJlbmd0aGVuIGhlYWRlciBiaXQgbGltaXRhdGlvbi4uLgorICAgICAgaWYgKGlzX2xhc3RfcGFzcykgeworICAgICAgICBSZXNldFNpZGVJbmZvKCZpdCk7CisgICAgICB9CisgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hbmQgc3RhcnQgb3ZlcgorICAgIH0KKyAgICBpZiAoaXNfbGFzdF9wYXNzKSB7CisgICAgICBicmVhazsgICAvLyBkb25lCisgICAgfQorICAgIGlmIChkb19zZWFyY2gpIHsKKyAgICAgIENvbXB1dGVOZXh0USgmc3RhdHMpOyAgLy8gQWRqdXN0IHEKKyAgICB9CisgIH0KKyAgaWYgKG9rKSB7CisgICAgaWYgKCFzdGF0cy5kb19zaXplX3NlYXJjaCkgeworICAgICAgRmluYWxpemVUb2tlblByb2JhcygmZW5jLT5wcm9iYV8pOworICAgIH0KKyAgICBvayA9IFZQOEVtaXRUb2tlbnMoJmVuYy0+dG9rZW5zXywgZW5jLT5wYXJ0c18gKyAwLAorICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcHJvYmEtPmNvZWZmc18sIDEpOworICB9CisgIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKGVuYy0+cGljXywgZW5jLT5wZXJjZW50XyArIDIwLCAmZW5jLT5wZXJjZW50Xyk7CisgIHJldHVybiBQb3N0TG9vcEZpbmFsaXplKCZpdCwgb2spOworfQorCisjZWxzZQorCitpbnQgVlA4RW5jVG9rZW5Mb29wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICAodm9pZCllbmM7CisgIHJldHVybiAwOyAgIC8vIHdlIHNob3VsZG4ndCBiZSBoZXJlLgorfQorCisjZW5kaWYgICAgLy8gRElTQUJMRV9UT0tFTl9CVUZGRVIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyZWY2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvaGlzdG9ncmFtX2VuYy5jCkBAIC0wLDAgKzEsMTA0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEF1dGhvcjogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxtYXRoLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBNQVhfQ09TVCAxLmUzOAorCisvLyBOdW1iZXIgb2YgcGFydGl0aW9ucyBmb3IgdGhlIHRocmVlIGRvbWluYW50IChsaXRlcmFsLCByZWQgYW5kIGJsdWUpIHN5bWJvbAorLy8gY29zdHMuCisjZGVmaW5lIE5VTV9QQVJUSVRJT05TIDQKKy8vIFRoZSBzaXplIG9mIHRoZSBiaW4taGFzaCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aHJlZSBkb21pbmFudCBjb3N0cy4KKyNkZWZpbmUgQklOX1NJWkUgKE5VTV9QQVJUSVRJT05TICogTlVNX1BBUlRJVElPTlMgKiBOVU1fUEFSVElUSU9OUykKKy8vIE1heGltdW0gbnVtYmVyIG9mIGhpc3RvZ3JhbXMgYWxsb3dlZCBpbiBncmVlZHkgY29tYmluaW5nIGFsZ29yaXRobS4KKyNkZWZpbmUgTUFYX0hJU1RPX0dSRUVEWSAxMDAKKworc3RhdGljIHZvaWQgSGlzdG9ncmFtQ2xlYXIoVlA4TEhpc3RvZ3JhbSogY29uc3QgcCkgeworICB1aW50MzJfdCogY29uc3QgbGl0ZXJhbCA9IHAtPmxpdGVyYWxfOworICBjb25zdCBpbnQgY2FjaGVfYml0cyA9IHAtPnBhbGV0dGVfY29kZV9iaXRzXzsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBWUDhMR2V0SGlzdG9ncmFtU2l6ZShjYWNoZV9iaXRzKTsKKyAgbWVtc2V0KHAsIDAsIGhpc3RvX3NpemUpOworICBwLT5wYWxldHRlX2NvZGVfYml0c18gPSBjYWNoZV9iaXRzOworICBwLT5saXRlcmFsXyA9IGxpdGVyYWw7Cit9CisKKy8vIFN3YXAgdHdvIGhpc3RvZ3JhbSBwb2ludGVycy4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbVN3YXAoVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IEEsIFZQOExIaXN0b2dyYW0qKiBjb25zdCBCKSB7CisgIFZQOExIaXN0b2dyYW0qIGNvbnN0IHRtcCA9ICpBOworICAqQSA9ICpCOworICAqQiA9IHRtcDsKK30KKworc3RhdGljIHZvaWQgSGlzdG9ncmFtQ29weShjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IGRzdCkgeworICB1aW50MzJfdCogY29uc3QgZHN0X2xpdGVyYWwgPSBkc3QtPmxpdGVyYWxfOworICBjb25zdCBpbnQgZHN0X2NhY2hlX2JpdHMgPSBkc3QtPnBhbGV0dGVfY29kZV9iaXRzXzsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBWUDhMR2V0SGlzdG9ncmFtU2l6ZShkc3RfY2FjaGVfYml0cyk7CisgIGFzc2VydChzcmMtPnBhbGV0dGVfY29kZV9iaXRzXyA9PSBkc3RfY2FjaGVfYml0cyk7CisgIG1lbWNweShkc3QsIHNyYywgaGlzdG9fc2l6ZSk7CisgIGRzdC0+bGl0ZXJhbF8gPSBkc3RfbGl0ZXJhbDsKK30KKworaW50IFZQOExHZXRIaXN0b2dyYW1TaXplKGludCBjYWNoZV9iaXRzKSB7CisgIGNvbnN0IGludCBsaXRlcmFsX3NpemUgPSBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoY2FjaGVfYml0cyk7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0gc2l6ZW9mKFZQOExIaXN0b2dyYW0pICsgc2l6ZW9mKGludCkgKiBsaXRlcmFsX3NpemU7CisgIGFzc2VydCh0b3RhbF9zaXplIDw9IChzaXplX3QpMHg3ZmZmZmZmZik7CisgIHJldHVybiAoaW50KXRvdGFsX3NpemU7Cit9CisKK3ZvaWQgVlA4TEZyZWVIaXN0b2dyYW0oVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pIHsKKyAgV2ViUFNhZmVGcmVlKGhpc3RvKTsKK30KKwordm9pZCBWUDhMRnJlZUhpc3RvZ3JhbVNldChWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBoaXN0bykgeworICBXZWJQU2FmZUZyZWUoaGlzdG8pOworfQorCit2b2lkIFZQOExIaXN0b2dyYW1TdG9yZVJlZnMoY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bykgeworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvLCBjLmN1cl9wb3MsIE5VTEwsIDApOworICAgIFZQOExSZWZzQ3Vyc29yTmV4dCgmYyk7CisgIH0KK30KKwordm9pZCBWUDhMSGlzdG9ncmFtQ3JlYXRlKFZQOExIaXN0b2dyYW0qIGNvbnN0IHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpIHsKKyAgaWYgKHBhbGV0dGVfY29kZV9iaXRzID49IDApIHsKKyAgICBwLT5wYWxldHRlX2NvZGVfYml0c18gPSBwYWxldHRlX2NvZGVfYml0czsKKyAgfQorICBIaXN0b2dyYW1DbGVhcihwKTsKKyAgVlA4TEhpc3RvZ3JhbVN0b3JlUmVmcyhyZWZzLCBwKTsKK30KKwordm9pZCBWUDhMSGlzdG9ncmFtSW5pdChWUDhMSGlzdG9ncmFtKiBjb25zdCBwLCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpIHsKKyAgcC0+cGFsZXR0ZV9jb2RlX2JpdHNfID0gcGFsZXR0ZV9jb2RlX2JpdHM7CisgIEhpc3RvZ3JhbUNsZWFyKHApOworfQorCitWUDhMSGlzdG9ncmFtKiBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oaW50IGNhY2hlX2JpdHMpIHsKKyAgVlA4TEhpc3RvZ3JhbSogaGlzdG8gPSBOVUxMOworICBjb25zdCBpbnQgdG90YWxfc2l6ZSA9IFZQOExHZXRIaXN0b2dyYW1TaXplKGNhY2hlX2JpdHMpOworICB1aW50OF90KiBjb25zdCBtZW1vcnkgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2ModG90YWxfc2l6ZSwgc2l6ZW9mKCptZW1vcnkpKTsKKyAgaWYgKG1lbW9yeSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaGlzdG8gPSAoVlA4TEhpc3RvZ3JhbSopbWVtb3J5OworICAvLyBsaXRlcmFsXyB3b24ndCBuZWNlc3NhcnkgYmUgYWxpZ25lZC4KKyAgaGlzdG8tPmxpdGVyYWxfID0gKHVpbnQzMl90KikobWVtb3J5ICsgc2l6ZW9mKFZQOExIaXN0b2dyYW0pKTsKKyAgVlA4TEhpc3RvZ3JhbUluaXQoaGlzdG8sIGNhY2hlX2JpdHMpOworICByZXR1cm4gaGlzdG87Cit9CisKK1ZQOExIaXN0b2dyYW1TZXQqIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbnQgc2l6ZSwgaW50IGNhY2hlX2JpdHMpIHsKKyAgaW50IGk7CisgIFZQOExIaXN0b2dyYW1TZXQqIHNldDsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBWUDhMR2V0SGlzdG9ncmFtU2l6ZShjYWNoZV9iaXRzKTsKKyAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPQorICAgICAgc2l6ZW9mKCpzZXQpICsgc2l6ZSAqIChzaXplb2YoKnNldC0+aGlzdG9ncmFtcykgKworICAgICAgaGlzdG9fc2l6ZSArIFdFQlBfQUxJR05fQ1NUKTsKKyAgdWludDhfdCogbWVtb3J5ID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtb3J5KSk7CisgIGlmIChtZW1vcnkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgc2V0ID0gKFZQOExIaXN0b2dyYW1TZXQqKW1lbW9yeTsKKyAgbWVtb3J5ICs9IHNpemVvZigqc2V0KTsKKyAgc2V0LT5oaXN0b2dyYW1zID0gKFZQOExIaXN0b2dyYW0qKiltZW1vcnk7CisgIG1lbW9yeSArPSBzaXplICogc2l6ZW9mKCpzZXQtPmhpc3RvZ3JhbXMpOworICBzZXQtPm1heF9zaXplID0gc2l6ZTsKKyAgc2V0LT5zaXplID0gc2l6ZTsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIG1lbW9yeSA9ICh1aW50OF90KilXRUJQX0FMSUdOKG1lbW9yeSk7CisgICAgc2V0LT5oaXN0b2dyYW1zW2ldID0gKFZQOExIaXN0b2dyYW0qKW1lbW9yeTsKKyAgICAvLyBsaXRlcmFsXyB3b24ndCBuZWNlc3NhcnkgYmUgYWxpZ25lZC4KKyAgICBzZXQtPmhpc3RvZ3JhbXNbaV0tPmxpdGVyYWxfID0gKHVpbnQzMl90KikobWVtb3J5ICsgc2l6ZW9mKFZQOExIaXN0b2dyYW0pKTsKKyAgICBWUDhMSGlzdG9ncmFtSW5pdChzZXQtPmhpc3RvZ3JhbXNbaV0sIGNhY2hlX2JpdHMpOworICAgIG1lbW9yeSArPSBoaXN0b19zaXplOworICB9CisgIHJldHVybiBzZXQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29uc3QgZGlzdGFuY2VfbW9kaWZpZXIpKGludCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2VfbW9kaWZpZXJfYXJnMCkgeworICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgKytoaXN0by0+YWxwaGFfW1BpeE9yQ29weUxpdGVyYWwodiwgMyldOworICAgICsraGlzdG8tPnJlZF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAyKV07CisgICAgKytoaXN0by0+bGl0ZXJhbF9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAxKV07CisgICAgKytoaXN0by0+Ymx1ZV9bUGl4T3JDb3B5TGl0ZXJhbCh2LCAwKV07CisgIH0gZWxzZSBpZiAoUGl4T3JDb3B5SXNDYWNoZUlkeCh2KSkgeworICAgIGNvbnN0IGludCBsaXRlcmFsX2l4ID0KKyAgICAgICAgTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsgUGl4T3JDb3B5Q2FjaGVJZHgodik7CisgICAgKytoaXN0by0+bGl0ZXJhbF9bbGl0ZXJhbF9peF07CisgIH0gZWxzZSB7CisgICAgaW50IGNvZGUsIGV4dHJhX2JpdHM7CisgICAgVlA4TFByZWZpeEVuY29kZUJpdHMoUGl4T3JDb3B5TGVuZ3RoKHYpLCAmY29kZSwgJmV4dHJhX2JpdHMpOworICAgICsraGlzdG8tPmxpdGVyYWxfW05VTV9MSVRFUkFMX0NPREVTICsgY29kZV07CisgICAgaWYgKGRpc3RhbmNlX21vZGlmaWVyID09IE5VTEwpIHsKKyAgICAgIFZQOExQcmVmaXhFbmNvZGVCaXRzKFBpeE9yQ29weURpc3RhbmNlKHYpLCAmY29kZSwgJmV4dHJhX2JpdHMpOworICAgIH0gZWxzZSB7CisgICAgICBWUDhMUHJlZml4RW5jb2RlQml0cygKKyAgICAgICAgICBkaXN0YW5jZV9tb2RpZmllcihkaXN0YW5jZV9tb2RpZmllcl9hcmcwLCBQaXhPckNvcHlEaXN0YW5jZSh2KSksCisgICAgICAgICAgJmNvZGUsICZleHRyYV9iaXRzKTsKKyAgICB9CisgICAgKytoaXN0by0+ZGlzdGFuY2VfW2NvZGVdOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyb3B5LXJlbGF0ZWQgZnVuY3Rpb25zLgorCitzdGF0aWMgV0VCUF9JTkxJTkUgZG91YmxlIEJpdHNFbnRyb3B5UmVmaW5lKGNvbnN0IFZQOExCaXRFbnRyb3B5KiBlbnRyb3B5KSB7CisgIGRvdWJsZSBtaXg7CisgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA8IDUpIHsKKyAgICBpZiAoZW50cm9weS0+bm9uemVyb3MgPD0gMSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIFR3byBzeW1ib2xzLCB0aGV5IHdpbGwgYmUgMCBhbmQgMSBpbiBhIEh1ZmZtYW4gY29kZS4KKyAgICAvLyBMZXQncyBtaXggaW4gYSBiaXQgb2YgZW50cm9weSB0byBmYXZvciBnb29kIGNsdXN0ZXJpbmcgd2hlbgorICAgIC8vIGRpc3RyaWJ1dGlvbnMgb2YgdGhlc2UgYXJlIGNvbWJpbmVkLgorICAgIGlmIChlbnRyb3B5LT5ub256ZXJvcyA9PSAyKSB7CisgICAgICByZXR1cm4gMC45OSAqIGVudHJvcHktPnN1bSArIDAuMDEgKiBlbnRyb3B5LT5lbnRyb3B5OworICAgIH0KKyAgICAvLyBObyBtYXR0ZXIgd2hhdCB0aGUgZW50cm9weSBzYXlzLCB3ZSBjYW5ub3QgYmUgYmV0dGVyIHRoYW4gbWluX2xpbWl0CisgICAgLy8gd2l0aCBIdWZmbWFuIGNvZGluZy4gSSBhbSBtaXhpbmcgYSBiaXQgb2YgZW50cm9weSBpbnRvIHRoZQorICAgIC8vIG1pbl9saW1pdCBzaW5jZSBpdCBwcm9kdWNlcyBtdWNoIGJldHRlciAofjAuNSAlKSBjb21wcmVzc2lvbiByZXN1bHRzCisgICAgLy8gcGVyaGFwcyBiZWNhdXNlIG9mIGJldHRlciBlbnRyb3B5IGNsdXN0ZXJpbmcuCisgICAgaWYgKGVudHJvcHktPm5vbnplcm9zID09IDMpIHsKKyAgICAgIG1peCA9IDAuOTU7CisgICAgfSBlbHNlIHsKKyAgICAgIG1peCA9IDAuNzsgIC8vIG5vbnplcm9zID09IDQuCisgICAgfQorICB9IGVsc2UgeworICAgIG1peCA9IDAuNjI3OworICB9CisKKyAgeworICAgIGRvdWJsZSBtaW5fbGltaXQgPSAyICogZW50cm9weS0+c3VtIC0gZW50cm9weS0+bWF4X3ZhbDsKKyAgICBtaW5fbGltaXQgPSBtaXggKiBtaW5fbGltaXQgKyAoMS4wIC0gbWl4KSAqIGVudHJvcHktPmVudHJvcHk7CisgICAgcmV0dXJuIChlbnRyb3B5LT5lbnRyb3B5IDwgbWluX2xpbWl0KSA/IG1pbl9saW1pdCA6IGVudHJvcHktPmVudHJvcHk7CisgIH0KK30KKworZG91YmxlIFZQOExCaXRzRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXksIGludCBuKSB7CisgIFZQOExCaXRFbnRyb3B5IGVudHJvcHk7CisgIFZQOExCaXRzRW50cm9weVVucmVmaW5lZChhcnJheSwgbiwgJmVudHJvcHkpOworCisgIHJldHVybiBCaXRzRW50cm9weVJlZmluZSgmZW50cm9weSk7Cit9CisKK3N0YXRpYyBkb3VibGUgSW5pdGlhbEh1ZmZtYW5Db3N0KHZvaWQpIHsKKyAgLy8gU21hbGwgYmlhcyBiZWNhdXNlIEh1ZmZtYW4gY29kZSBsZW5ndGggaXMgdHlwaWNhbGx5IG5vdCBzdG9yZWQgaW4KKyAgLy8gZnVsbCBsZW5ndGguCisgIHN0YXRpYyBjb25zdCBpbnQga0h1ZmZtYW5Db2RlT2ZIdWZmbWFuQ29kZVNpemUgPSBDT0RFX0xFTkdUSF9DT0RFUyAqIDM7CisgIHN0YXRpYyBjb25zdCBkb3VibGUga1NtYWxsQmlhcyA9IDkuMTsKKyAgcmV0dXJuIGtIdWZmbWFuQ29kZU9mSHVmZm1hbkNvZGVTaXplIC0ga1NtYWxsQmlhczsKK30KKworLy8gRmluYWxpemUgdGhlIEh1ZmZtYW4gY29zdCBiYXNlZCBvbiBzdHJlYWsgbnVtYmVycyBhbmQgbGVuZ3RoIHR5cGUgKDwzIG9yID49MykKK3N0YXRpYyBkb3VibGUgRmluYWxIdWZmbWFuQ29zdChjb25zdCBWUDhMU3RyZWFrcyogY29uc3Qgc3RhdHMpIHsKKyAgLy8gVGhlIGNvbnN0YW50cyBpbiB0aGlzIGZ1bmN0aW9uIGFyZSBleHBlcmltZW50YWwgYW5kIGdvdCByb3VuZGVkIGZyb20KKyAgLy8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzIGluIDEvOCB3aGVuIHN3aXRjaGVkIHRvIDEvMTAyNC4KKyAgZG91YmxlIHJldHZhbCA9IEluaXRpYWxIdWZmbWFuQ29zdCgpOworICAvLyBTZWNvbmQgY29lZmZpY2llbnQ6IE1hbnkgemVyb3MgaW4gdGhlIGhpc3RvZ3JhbSBhcmUgY292ZXJlZCBlZmZpY2llbnRseQorICAvLyBieSBhIHJ1bi1sZW5ndGggZW5jb2RlLiBPcmlnaW5hbGx5IDIvOC4KKyAgcmV0dmFsICs9IHN0YXRzLT5jb3VudHNbMF0gKiAxLjU2MjUgKyAwLjIzNDM3NSAqIHN0YXRzLT5zdHJlYWtzWzBdWzFdOworICAvLyBTZWNvbmQgY29lZmZpY2llbnQ6IENvbnN0YW50IHZhbHVlcyBhcmUgZW5jb2RlZCBsZXNzIGVmZmljaWVudGx5LCBidXQgc3RpbGwKKyAgLy8gUkxFJ2VkLiBPcmlnaW5hbGx5IDYvOC4KKyAgcmV0dmFsICs9IHN0YXRzLT5jb3VudHNbMV0gKiAyLjU3ODEyNSArIDAuNzAzMTI1ICogc3RhdHMtPnN0cmVha3NbMV1bMV07CisgIC8vIDBzIGFyZSB1c3VhbGx5IGVuY29kZWQgbW9yZSBlZmZpY2llbnRseSB0aGFuIG5vbi0wcy4KKyAgLy8gT3JpZ2luYWxseSAxNS84LgorICByZXR2YWwgKz0gMS43OTY4NzUgKiBzdGF0cy0+c3RyZWFrc1swXVswXTsKKyAgLy8gT3JpZ2luYWxseSAyNi84LgorICByZXR2YWwgKz0gMy4yODEyNSAqIHN0YXRzLT5zdHJlYWtzWzFdWzBdOworICByZXR1cm4gcmV0dmFsOworfQorCisvLyBHZXQgdGhlIHN5bWJvbCBlbnRyb3B5IGZvciB0aGUgZGlzdHJpYnV0aW9uICdwb3B1bGF0aW9uJy4KKy8vIFNldCAndHJpdmlhbF9zeW0nLCBpZiB0aGVyZSdzIG9ubHkgb25lIHN5bWJvbCBwcmVzZW50IGluIHRoZSBkaXN0cmlidXRpb24uCitzdGF0aWMgZG91YmxlIFBvcHVsYXRpb25Db3N0KGNvbnN0IHVpbnQzMl90KiBjb25zdCBwb3B1bGF0aW9uLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgdHJpdmlhbF9zeW0pIHsKKyAgVlA4TEJpdEVudHJvcHkgYml0X2VudHJvcHk7CisgIFZQOExTdHJlYWtzIHN0YXRzOworICBWUDhMR2V0RW50cm9weVVucmVmaW5lZChwb3B1bGF0aW9uLCBsZW5ndGgsICZiaXRfZW50cm9weSwgJnN0YXRzKTsKKyAgaWYgKHRyaXZpYWxfc3ltICE9IE5VTEwpIHsKKyAgICAqdHJpdmlhbF9zeW0gPSAoYml0X2VudHJvcHkubm9uemVyb3MgPT0gMSkgPyBiaXRfZW50cm9weS5ub256ZXJvX2NvZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWUDhMX05PTl9UUklWSUFMX1NZTTsKKyAgfQorCisgIHJldHVybiBCaXRzRW50cm9weVJlZmluZSgmYml0X2VudHJvcHkpICsgRmluYWxIdWZmbWFuQ29zdCgmc3RhdHMpOworfQorCisvLyB0cml2aWFsX2F0X2VuZCBpcyAxIGlmIHRoZSB0d28gaGlzdG9ncmFtcyBvbmx5IGhhdmUgb25lIGVsZW1lbnQgdGhhdCBpcworLy8gbm9uLXplcm86IGJvdGggdGhlIHplcm8tdGggb25lLCBvciBib3RoIHRoZSBsYXN0IG9uZS4KK3N0YXRpYyBXRUJQX0lOTElORSBkb3VibGUgR2V0Q29tYmluZWRFbnRyb3B5KGNvbnN0IHVpbnQzMl90KiBjb25zdCBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBpbnQgdHJpdmlhbF9hdF9lbmQpIHsKKyAgVlA4TFN0cmVha3Mgc3RhdHM7CisgIGlmICh0cml2aWFsX2F0X2VuZCkgeworICAgIC8vIFRoaXMgY29uZmlndXJhdGlvbiBpcyBkdWUgdG8gcGFsZXR0aXphdGlvbiB0aGF0IHRyYW5zZm9ybXMgYW4gaW5kZXhlZAorICAgIC8vIHBpeGVsIGludG8gMHhmZjAwMDAwMCB8IChwaXhlbCA8PCA4KSBpbiBWUDhMQnVuZGxlQ29sb3JNYXAuCisgICAgLy8gQml0c0VudHJvcHlSZWZpbmUgaXMgMCBmb3IgaGlzdG9ncmFtcyB3aXRoIG9ubHkgb25lIG5vbi16ZXJvIHZhbHVlLgorICAgIC8vIE9ubHkgRmluYWxIdWZmbWFuQ29zdCBuZWVkcyB0byBiZSBldmFsdWF0ZWQuCisgICAgbWVtc2V0KCZzdGF0cywgMCwgc2l6ZW9mKHN0YXRzKSk7CisgICAgLy8gRGVhbCB3aXRoIHRoZSBub24temVybyB2YWx1ZSBhdCBpbmRleCAwIG9yIGxlbmd0aC0xLgorICAgIHN0YXRzLnN0cmVha3NbMV1bMF0gKz0gMTsKKyAgICAvLyBEZWFsIHdpdGggdGhlIGZvbGxvd2luZy9wcmV2aW91cyB6ZXJvIHN0cmVhay4KKyAgICBzdGF0cy5jb3VudHNbMF0gKz0gMTsKKyAgICBzdGF0cy5zdHJlYWtzWzBdWzFdICs9IGxlbmd0aCAtIDE7CisgICAgcmV0dXJuIEZpbmFsSHVmZm1hbkNvc3QoJnN0YXRzKTsKKyAgfSBlbHNlIHsKKyAgICBWUDhMQml0RW50cm9weSBiaXRfZW50cm9weTsKKyAgICBWUDhMR2V0Q29tYmluZWRFbnRyb3B5VW5yZWZpbmVkKFgsIFksIGxlbmd0aCwgJmJpdF9lbnRyb3B5LCAmc3RhdHMpOworCisgICAgcmV0dXJuIEJpdHNFbnRyb3B5UmVmaW5lKCZiaXRfZW50cm9weSkgKyBGaW5hbEh1ZmZtYW5Db3N0KCZzdGF0cyk7CisgIH0KK30KKworLy8gRXN0aW1hdGVzIHRoZSBFbnRyb3B5ICsgSHVmZm1hbiArIG90aGVyIGJsb2NrIG92ZXJoZWFkIHNpemUgY29zdC4KK2RvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApIHsKKyAgcmV0dXJuCisgICAgICBQb3B1bGF0aW9uQ29zdCgKKyAgICAgICAgICBwLT5saXRlcmFsXywgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKHAtPnBhbGV0dGVfY29kZV9iaXRzXyksIE5VTEwpCisgICAgICArIFBvcHVsYXRpb25Db3N0KHAtPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCBOVUxMKQorICAgICAgKyBQb3B1bGF0aW9uQ29zdChwLT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTEwpCisgICAgICArIFBvcHVsYXRpb25Db3N0KHAtPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTEwpCisgICAgICArIFBvcHVsYXRpb25Db3N0KHAtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTLCBOVUxMKQorICAgICAgKyBWUDhMRXh0cmFDb3N0KHAtPmxpdGVyYWxfICsgTlVNX0xJVEVSQUxfQ09ERVMsIE5VTV9MRU5HVEhfQ09ERVMpCisgICAgICArIFZQOExFeHRyYUNvc3QocC0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVmFyaW91cyBoaXN0b2dyYW0gY29tYmluZS9jb3N0LWV2YWwgZnVuY3Rpb25zCisKK3N0YXRpYyBpbnQgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvc3RfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb3N0KSB7CisgIGNvbnN0IGludCBwYWxldHRlX2NvZGVfYml0cyA9IGEtPnBhbGV0dGVfY29kZV9iaXRzXzsKKyAgaW50IHRyaXZpYWxfYXRfZW5kID0gMDsKKyAgYXNzZXJ0KGEtPnBhbGV0dGVfY29kZV9iaXRzXyA9PSBiLT5wYWxldHRlX2NvZGVfYml0c18pOworICAqY29zdCArPSBHZXRDb21iaW5lZEVudHJvcHkoYS0+bGl0ZXJhbF8sIGItPmxpdGVyYWxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKHBhbGV0dGVfY29kZV9iaXRzKSwgMCk7CisgICpjb3N0ICs9IFZQOExFeHRyYUNvc3RDb21iaW5lZChhLT5saXRlcmFsXyArIE5VTV9MSVRFUkFMX0NPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi0+bGl0ZXJhbF8gKyBOVU1fTElURVJBTF9DT0RFUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTV9MRU5HVEhfQ09ERVMpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgaWYgKGEtPnRyaXZpYWxfc3ltYm9sXyAhPSBWUDhMX05PTl9UUklWSUFMX1NZTSAmJgorICAgICAgYS0+dHJpdmlhbF9zeW1ib2xfID09IGItPnRyaXZpYWxfc3ltYm9sXykgeworICAgIC8vIEEsIFIgYW5kIEIgYXJlIGFsbCAwIG9yIDB4ZmYuCisgICAgY29uc3QgdWludDMyX3QgY29sb3JfYSA9IChhLT50cml2aWFsX3N5bWJvbF8gPj4gMjQpICYgMHhmZjsKKyAgICBjb25zdCB1aW50MzJfdCBjb2xvcl9yID0gKGEtPnRyaXZpYWxfc3ltYm9sXyA+PiAxNikgJiAweGZmOworICAgIGNvbnN0IHVpbnQzMl90IGNvbG9yX2IgPSAoYS0+dHJpdmlhbF9zeW1ib2xfID4+IDApICYgMHhmZjsKKyAgICBpZiAoKGNvbG9yX2EgPT0gMCB8fCBjb2xvcl9hID09IDB4ZmYpICYmCisgICAgICAgIChjb2xvcl9yID09IDAgfHwgY29sb3JfciA9PSAweGZmKSAmJgorICAgICAgICAoY29sb3JfYiA9PSAwIHx8IGNvbG9yX2IgPT0gMHhmZikpIHsKKyAgICAgIHRyaXZpYWxfYXRfZW5kID0gMTsKKyAgICB9CisgIH0KKworICAqY29zdCArPQorICAgICAgR2V0Q29tYmluZWRFbnRyb3B5KGEtPnJlZF8sIGItPnJlZF8sIE5VTV9MSVRFUkFMX0NPREVTLCB0cml2aWFsX2F0X2VuZCk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPQorICAgICAgR2V0Q29tYmluZWRFbnRyb3B5KGEtPmJsdWVfLCBiLT5ibHVlXywgTlVNX0xJVEVSQUxfQ09ERVMsIHRyaXZpYWxfYXRfZW5kKTsKKyAgaWYgKCpjb3N0ID4gY29zdF90aHJlc2hvbGQpIHJldHVybiAwOworCisgICpjb3N0ICs9IEdldENvbWJpbmVkRW50cm9weShhLT5hbHBoYV8sIGItPmFscGhhXywgTlVNX0xJVEVSQUxfQ09ERVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cml2aWFsX2F0X2VuZCk7CisgIGlmICgqY29zdCA+IGNvc3RfdGhyZXNob2xkKSByZXR1cm4gMDsKKworICAqY29zdCArPQorICAgICAgR2V0Q29tYmluZWRFbnRyb3B5KGEtPmRpc3RhbmNlXywgYi0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMsIDApOworICAqY29zdCArPQorICAgICAgVlA4TEV4dHJhQ29zdENvbWJpbmVkKGEtPmRpc3RhbmNlXywgYi0+ZGlzdGFuY2VfLCBOVU1fRElTVEFOQ0VfQ09ERVMpOworICBpZiAoKmNvc3QgPiBjb3N0X3RocmVzaG9sZCkgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIEhpc3RvZ3JhbUFkZChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3Qgb3V0KSB7CisgIFZQOExIaXN0b2dyYW1BZGQoYSwgYiwgb3V0KTsKKyAgb3V0LT50cml2aWFsX3N5bWJvbF8gPSAoYS0+dHJpdmlhbF9zeW1ib2xfID09IGItPnRyaXZpYWxfc3ltYm9sXykKKyAgICAgICAgICAgICAgICAgICAgICAgPyBhLT50cml2aWFsX3N5bWJvbF8KKyAgICAgICAgICAgICAgICAgICAgICAgOiBWUDhMX05PTl9UUklWSUFMX1NZTTsKK30KKworLy8gUGVyZm9ybXMgb3V0ID0gYSArIGIsIGNvbXB1dGluZyB0aGUgY29zdCBDKGErYikgLSBDKGEpIC0gQyhiKSB3aGlsZSBjb21wYXJpbmcKKy8vIHRvIHRoZSB0aHJlc2hvbGQgdmFsdWUgJ2Nvc3RfdGhyZXNob2xkJy4gVGhlIHNjb3JlIHJldHVybmVkIGlzCisvLyAgU2NvcmUgPSBDKGErYikgLSBDKGEpIC0gQyhiKSwgd2hlcmUgQyhhKSArIEMoYikgaXMga25vd24gYW5kIGZpeGVkLgorLy8gU2luY2UgdGhlIHByZXZpb3VzIHNjb3JlIHBhc3NlZCBpcyAnY29zdF90aHJlc2hvbGQnLCB3ZSBvbmx5IG5lZWQgdG8gY29tcGFyZQorLy8gdGhlIHBhcnRpYWwgY29zdCBhZ2FpbnN0ICdjb3N0X3RocmVzaG9sZCArIEMoYSkgKyBDKGIpJyB0byBwb3NzaWJseSBiYWlsLW91dAorLy8gZWFybHkuCitzdGF0aWMgZG91YmxlIEhpc3RvZ3JhbUFkZEV2YWwoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IG91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29zdF90aHJlc2hvbGQpIHsKKyAgZG91YmxlIGNvc3QgPSAwOworICBjb25zdCBkb3VibGUgc3VtX2Nvc3QgPSBhLT5iaXRfY29zdF8gKyBiLT5iaXRfY29zdF87CisgIGNvc3RfdGhyZXNob2xkICs9IHN1bV9jb3N0OworCisgIGlmIChHZXRDb21iaW5lZEhpc3RvZ3JhbUVudHJvcHkoYSwgYiwgY29zdF90aHJlc2hvbGQsICZjb3N0KSkgeworICAgIEhpc3RvZ3JhbUFkZChhLCBiLCBvdXQpOworICAgIG91dC0+Yml0X2Nvc3RfID0gY29zdDsKKyAgICBvdXQtPnBhbGV0dGVfY29kZV9iaXRzXyA9IGEtPnBhbGV0dGVfY29kZV9iaXRzXzsKKyAgfQorCisgIHJldHVybiBjb3N0IC0gc3VtX2Nvc3Q7Cit9CisKKy8vIFNhbWUgYXMgSGlzdG9ncmFtQWRkRXZhbCgpLCBleGNlcHQgdGhhdCB0aGUgcmVzdWx0aW5nIGhpc3RvZ3JhbQorLy8gaXMgbm90IHN0b3JlZC4gT25seSB0aGUgY29zdCBDKGErYikgLSBDKGEpIGlzIGV2YWx1YXRlZC4gV2Ugb21pdAorLy8gdGhlIHRlcm0gQyhiKSB3aGljaCBpcyBjb25zdGFudCBvdmVyIGFsbCB0aGUgZXZhbHVhdGlvbnMuCitzdGF0aWMgZG91YmxlIEhpc3RvZ3JhbUFkZFRocmVzaChjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb3N0X3RocmVzaG9sZCkgeworICBkb3VibGUgY29zdCA9IC1hLT5iaXRfY29zdF87CisgIEdldENvbWJpbmVkSGlzdG9ncmFtRW50cm9weShhLCBiLCBjb3N0X3RocmVzaG9sZCwgJmNvc3QpOworICByZXR1cm4gY29zdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVGhlIHN0cnVjdHVyZSB0byBrZWVwIHRyYWNrIG9mIGNvc3QgcmFuZ2UgZm9yIHRoZSB0aHJlZSBkb21pbmFudCBlbnRyb3B5CisvLyBzeW1ib2xzLgorLy8gVE9ETyhza2FsKTogRXZhbHVhdGUgaWYgZmxvYXQgY2FuIGJlIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIGRvdWJsZSBmb3IKKy8vIHJlcHJlc2VudGluZyB0aGUgZW50cm9weSBjb3N0cy4KK3R5cGVkZWYgc3RydWN0IHsKKyAgZG91YmxlIGxpdGVyYWxfbWF4XzsKKyAgZG91YmxlIGxpdGVyYWxfbWluXzsKKyAgZG91YmxlIHJlZF9tYXhfOworICBkb3VibGUgcmVkX21pbl87CisgIGRvdWJsZSBibHVlX21heF87CisgIGRvdWJsZSBibHVlX21pbl87Cit9IERvbWluYW50Q29zdFJhbmdlOworCitzdGF0aWMgdm9pZCBEb21pbmFudENvc3RSYW5nZUluaXQoRG9taW5hbnRDb3N0UmFuZ2UqIGNvbnN0IGMpIHsKKyAgYy0+bGl0ZXJhbF9tYXhfID0gMC47CisgIGMtPmxpdGVyYWxfbWluXyA9IE1BWF9DT1NUOworICBjLT5yZWRfbWF4XyA9IDAuOworICBjLT5yZWRfbWluXyA9IE1BWF9DT1NUOworICBjLT5ibHVlX21heF8gPSAwLjsKKyAgYy0+Ymx1ZV9taW5fID0gTUFYX0NPU1Q7Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZURvbWluYW50Q29zdFJhbmdlKAorICAgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IGgsIERvbWluYW50Q29zdFJhbmdlKiBjb25zdCBjKSB7CisgIGlmIChjLT5saXRlcmFsX21heF8gPCBoLT5saXRlcmFsX2Nvc3RfKSBjLT5saXRlcmFsX21heF8gPSBoLT5saXRlcmFsX2Nvc3RfOworICBpZiAoYy0+bGl0ZXJhbF9taW5fID4gaC0+bGl0ZXJhbF9jb3N0XykgYy0+bGl0ZXJhbF9taW5fID0gaC0+bGl0ZXJhbF9jb3N0XzsKKyAgaWYgKGMtPnJlZF9tYXhfIDwgaC0+cmVkX2Nvc3RfKSBjLT5yZWRfbWF4XyA9IGgtPnJlZF9jb3N0XzsKKyAgaWYgKGMtPnJlZF9taW5fID4gaC0+cmVkX2Nvc3RfKSBjLT5yZWRfbWluXyA9IGgtPnJlZF9jb3N0XzsKKyAgaWYgKGMtPmJsdWVfbWF4XyA8IGgtPmJsdWVfY29zdF8pIGMtPmJsdWVfbWF4XyA9IGgtPmJsdWVfY29zdF87CisgIGlmIChjLT5ibHVlX21pbl8gPiBoLT5ibHVlX2Nvc3RfKSBjLT5ibHVlX21pbl8gPSBoLT5ibHVlX2Nvc3RfOworfQorCitzdGF0aWMgdm9pZCBVcGRhdGVIaXN0b2dyYW1Db3N0KFZQOExIaXN0b2dyYW0qIGNvbnN0IGgpIHsKKyAgdWludDMyX3QgYWxwaGFfc3ltLCByZWRfc3ltLCBibHVlX3N5bTsKKyAgY29uc3QgZG91YmxlIGFscGhhX2Nvc3QgPQorICAgICAgUG9wdWxhdGlvbkNvc3QoaC0+YWxwaGFfLCBOVU1fTElURVJBTF9DT0RFUywgJmFscGhhX3N5bSk7CisgIGNvbnN0IGRvdWJsZSBkaXN0YW5jZV9jb3N0ID0KKyAgICAgIFBvcHVsYXRpb25Db3N0KGgtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTLCBOVUxMKSArCisgICAgICBWUDhMRXh0cmFDb3N0KGgtPmRpc3RhbmNlXywgTlVNX0RJU1RBTkNFX0NPREVTKTsKKyAgY29uc3QgaW50IG51bV9jb2RlcyA9IFZQOExIaXN0b2dyYW1OdW1Db2RlcyhoLT5wYWxldHRlX2NvZGVfYml0c18pOworICBoLT5saXRlcmFsX2Nvc3RfID0gUG9wdWxhdGlvbkNvc3QoaC0+bGl0ZXJhbF8sIG51bV9jb2RlcywgTlVMTCkgKworICAgICAgICAgICAgICAgICAgICAgVlA4TEV4dHJhQ29zdChoLT5saXRlcmFsXyArIE5VTV9MSVRFUkFMX0NPREVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVU1fTEVOR1RIX0NPREVTKTsKKyAgaC0+cmVkX2Nvc3RfID0gUG9wdWxhdGlvbkNvc3QoaC0+cmVkXywgTlVNX0xJVEVSQUxfQ09ERVMsICZyZWRfc3ltKTsKKyAgaC0+Ymx1ZV9jb3N0XyA9IFBvcHVsYXRpb25Db3N0KGgtPmJsdWVfLCBOVU1fTElURVJBTF9DT0RFUywgJmJsdWVfc3ltKTsKKyAgaC0+Yml0X2Nvc3RfID0gaC0+bGl0ZXJhbF9jb3N0XyArIGgtPnJlZF9jb3N0XyArIGgtPmJsdWVfY29zdF8gKworICAgICAgICAgICAgICAgICBhbHBoYV9jb3N0ICsgZGlzdGFuY2VfY29zdDsKKyAgaWYgKChhbHBoYV9zeW0gfCByZWRfc3ltIHwgYmx1ZV9zeW0pID09IFZQOExfTk9OX1RSSVZJQUxfU1lNKSB7CisgICAgaC0+dHJpdmlhbF9zeW1ib2xfID0gVlA4TF9OT05fVFJJVklBTF9TWU07CisgIH0gZWxzZSB7CisgICAgaC0+dHJpdmlhbF9zeW1ib2xfID0KKyAgICAgICAgKCh1aW50MzJfdClhbHBoYV9zeW0gPDwgMjQpIHwgKHJlZF9zeW0gPDwgMTYpIHwgKGJsdWVfc3ltIDw8IDApOworICB9Cit9CisKK3N0YXRpYyBpbnQgR2V0QmluSWRGb3JFbnRyb3B5KGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgsIGRvdWJsZSB2YWwpIHsKKyAgY29uc3QgZG91YmxlIHJhbmdlID0gbWF4IC0gbWluOworICBpZiAocmFuZ2UgPiAwLikgeworICAgIGNvbnN0IGRvdWJsZSBkZWx0YSA9IHZhbCAtIG1pbjsKKyAgICByZXR1cm4gKGludCkoKE5VTV9QQVJUSVRJT05TIC0gMWUtNikgKiBkZWx0YSAvIHJhbmdlKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgaW50IEdldEhpc3RvQmluSW5kZXgoY29uc3QgVlA4TEhpc3RvZ3JhbSogY29uc3QgaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmFudENvc3RSYW5nZSogY29uc3QgYywgaW50IGxvd19lZmZvcnQpIHsKKyAgaW50IGJpbl9pZCA9IEdldEJpbklkRm9yRW50cm9weShjLT5saXRlcmFsX21pbl8sIGMtPmxpdGVyYWxfbWF4XywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLT5saXRlcmFsX2Nvc3RfKTsKKyAgYXNzZXJ0KGJpbl9pZCA8IE5VTV9QQVJUSVRJT05TKTsKKyAgaWYgKCFsb3dfZWZmb3J0KSB7CisgICAgYmluX2lkID0gYmluX2lkICogTlVNX1BBUlRJVElPTlMKKyAgICAgICAgICAgKyBHZXRCaW5JZEZvckVudHJvcHkoYy0+cmVkX21pbl8sIGMtPnJlZF9tYXhfLCBoLT5yZWRfY29zdF8pOworICAgIGJpbl9pZCA9IGJpbl9pZCAqIE5VTV9QQVJUSVRJT05TCisgICAgICAgICAgICsgR2V0QmluSWRGb3JFbnRyb3B5KGMtPmJsdWVfbWluXywgYy0+Ymx1ZV9tYXhfLCBoLT5ibHVlX2Nvc3RfKTsKKyAgICBhc3NlcnQoYmluX2lkIDwgQklOX1NJWkUpOworICB9CisgIHJldHVybiBiaW5faWQ7Cit9CisKKy8vIENvbnN0cnVjdCB0aGUgaGlzdG9ncmFtcyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCitzdGF0aWMgdm9pZCBIaXN0b2dyYW1CdWlsZCgKKyAgICBpbnQgeHNpemUsIGludCBoaXN0b19iaXRzLCBjb25zdCBWUDhMQmFja3dhcmRSZWZzKiBjb25zdCBiYWNrd2FyZF9yZWZzLAorICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvKSB7CisgIGludCB4ID0gMCwgeSA9IDA7CisgIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKTsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgVlA4TFJlZnNDdXJzb3IgYyA9IFZQOExSZWZzQ3Vyc29ySW5pdChiYWNrd2FyZF9yZWZzKTsKKyAgYXNzZXJ0KGhpc3RvX2JpdHMgPiAwKTsKKyAgd2hpbGUgKFZQOExSZWZzQ3Vyc29yT2soJmMpKSB7CisgICAgY29uc3QgUGl4T3JDb3B5KiBjb25zdCB2ID0gYy5jdXJfcG9zOworICAgIGNvbnN0IGludCBpeCA9ICh5ID4+IGhpc3RvX2JpdHMpICogaGlzdG9feHNpemUgKyAoeCA+PiBoaXN0b19iaXRzKTsKKyAgICBWUDhMSGlzdG9ncmFtQWRkU2luZ2xlUGl4T3JDb3B5KGhpc3RvZ3JhbXNbaXhdLCB2LCBOVUxMLCAwKTsKKyAgICB4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKKyAgICB3aGlsZSAoeCA+PSB4c2l6ZSkgeworICAgICAgeCAtPSB4c2l6ZTsKKyAgICAgICsreTsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorfQorCisvLyBDb3BpZXMgdGhlIGhpc3RvZ3JhbXMgYW5kIGNvbXB1dGVzIGl0cyBiaXRfY29zdC4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUNvcHlBbmRBbmFseXplKAorICAgIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IG9yaWdfaGlzdG8sIFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvKSB7CisgIGludCBpOworICBjb25zdCBpbnQgaGlzdG9fc2l6ZSA9IG9yaWdfaGlzdG8tPnNpemU7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBvcmlnX2hpc3RvZ3JhbXMgPSBvcmlnX2hpc3RvLT5oaXN0b2dyYW1zOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8gPSBvcmlnX2hpc3RvZ3JhbXNbaV07CisgICAgVXBkYXRlSGlzdG9ncmFtQ29zdChoaXN0byk7CisgICAgLy8gQ29weSBoaXN0b2dyYW1zIGZyb20gb3JpZ19oaXN0b1tdIHRvIGltYWdlX2hpc3RvW10uCisgICAgSGlzdG9ncmFtQ29weShoaXN0bywgaGlzdG9ncmFtc1tpXSk7CisgIH0KK30KKworLy8gUGFydGl0aW9uIGhpc3RvZ3JhbXMgdG8gZGlmZmVyZW50IGVudHJvcHkgYmlucyBmb3IgdGhyZWUgZG9taW5hbnQgKGxpdGVyYWwsCisvLyByZWQgYW5kIGJsdWUpIHN5bWJvbCBjb3N0cyBhbmQgY29tcHV0ZSB0aGUgaGlzdG9ncmFtIGFnZ3JlZ2F0ZSBiaXRfY29zdC4KK3N0YXRpYyB2b2lkIEhpc3RvZ3JhbUFuYWx5emVFbnRyb3B5QmluKFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGJpbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCkgeworICBpbnQgaTsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgY29uc3QgaW50IGhpc3RvX3NpemUgPSBpbWFnZV9oaXN0by0+c2l6ZTsKKyAgRG9taW5hbnRDb3N0UmFuZ2UgY29zdF9yYW5nZTsKKyAgRG9taW5hbnRDb3N0UmFuZ2VJbml0KCZjb3N0X3JhbmdlKTsKKworICAvLyBBbmFseXplIHRoZSBkb21pbmFudCAobGl0ZXJhbCwgcmVkIGFuZCBibHVlKSBlbnRyb3B5IGNvc3RzLgorICBmb3IgKGkgPSAwOyBpIDwgaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgVXBkYXRlRG9taW5hbnRDb3N0UmFuZ2UoaGlzdG9ncmFtc1tpXSwgJmNvc3RfcmFuZ2UpOworICB9CisKKyAgLy8gYmluLWhhc2ggaGlzdG9ncmFtcyBvbiB0aHJlZSBvZiB0aGUgZG9taW5hbnQgKGxpdGVyYWwsIHJlZCBhbmQgYmx1ZSkKKyAgLy8gc3ltYm9sIGNvc3RzIGFuZCBzdG9yZSB0aGUgcmVzdWx0aW5nIGJpbl9pZCBmb3IgZWFjaCBoaXN0b2dyYW0uCisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b19zaXplOyArK2kpIHsKKyAgICBiaW5fbWFwW2ldID0gR2V0SGlzdG9CaW5JbmRleChoaXN0b2dyYW1zW2ldLCAmY29zdF9yYW5nZSwgbG93X2VmZm9ydCk7CisgIH0KK30KKworLy8gQ29tcGFjdCBpbWFnZV9oaXN0b1tdIGJ5IG1lcmdpbmcgc29tZSBoaXN0b2dyYW1zIHdpdGggc2FtZSBiaW5faWQgdG9nZXRoZXIgaWYKKy8vIGl0J3MgYWR2YW50YWdlb3VzLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtQ29tYmluZUVudHJvcHlCaW4oVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaGlzdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiBjdXJfY29tYm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgYmluX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaW5fbWFwX3NpemUsIGludCBudW1fYmlucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb21iaW5lX2Nvc3RfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvd19lZmZvcnQpIHsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGhpc3RvZ3JhbXMgPSBpbWFnZV9oaXN0by0+aGlzdG9ncmFtczsKKyAgaW50IGlkeDsKKyAgLy8gV29yayBpbi1wbGFjZTogcHJvY2Vzc2VkIGhpc3RvZ3JhbXMgYXJlIHB1dCBhdCB0aGUgYmVnaW5uaW5nIG9mCisgIC8vIGltYWdlX2hpc3RvW10uIEF0IHRoZSBlbmQsIHdlIGp1c3QgaGF2ZSB0byB0cnVuY2F0ZSB0aGUgYXJyYXkuCisgIGludCBzaXplID0gMDsKKyAgc3RydWN0IHsKKyAgICBpbnQxNl90IGZpcnN0OyAgICAvLyBwb3NpdGlvbiBvZiB0aGUgaGlzdG9ncmFtIHRoYXQgYWNjdW11bGF0ZXMgYWxsCisgICAgICAgICAgICAgICAgICAgICAgLy8gaGlzdG9ncmFtcyB3aXRoIHRoZSBzYW1lIGJpbl9pZAorICAgIHVpbnQxNl90IG51bV9jb21iaW5lX2ZhaWx1cmVzOyAgIC8vIG51bWJlciBvZiBjb21iaW5lIGZhaWx1cmVzIHBlciBiaW5faWQKKyAgfSBiaW5faW5mb1tCSU5fU0laRV07CisKKyAgYXNzZXJ0KG51bV9iaW5zIDw9IEJJTl9TSVpFKTsKKyAgZm9yIChpZHggPSAwOyBpZHggPCBudW1fYmluczsgKytpZHgpIHsKKyAgICBiaW5faW5mb1tpZHhdLmZpcnN0ID0gLTE7CisgICAgYmluX2luZm9baWR4XS5udW1fY29tYmluZV9mYWlsdXJlcyA9IDA7CisgIH0KKworICBmb3IgKGlkeCA9IDA7IGlkeCA8IGJpbl9tYXBfc2l6ZTsgKytpZHgpIHsKKyAgICBjb25zdCBpbnQgYmluX2lkID0gYmluX21hcFtpZHhdOworICAgIGNvbnN0IGludCBmaXJzdCA9IGJpbl9pbmZvW2Jpbl9pZF0uZmlyc3Q7CisgICAgYXNzZXJ0KHNpemUgPD0gaWR4KTsKKyAgICBpZiAoZmlyc3QgPT0gLTEpIHsKKyAgICAgIC8vIGp1c3QgbW92ZSBoaXN0b2dyYW0gI2lkeCB0byBpdHMgZmluYWwgcG9zaXRpb24KKyAgICAgIGhpc3RvZ3JhbXNbc2l6ZV0gPSBoaXN0b2dyYW1zW2lkeF07CisgICAgICBiaW5faW5mb1tiaW5faWRdLmZpcnN0ID0gc2l6ZSsrOworICAgIH0gZWxzZSBpZiAobG93X2VmZm9ydCkgeworICAgICAgSGlzdG9ncmFtQWRkKGhpc3RvZ3JhbXNbaWR4XSwgaGlzdG9ncmFtc1tmaXJzdF0sIGhpc3RvZ3JhbXNbZmlyc3RdKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gdHJ5IHRvIG1lcmdlICNpZHggaW50byAjZmlyc3QgKGJvdGggc2hhcmUgdGhlIHNhbWUgYmluX2lkKQorICAgICAgY29uc3QgZG91YmxlIGJpdF9jb3N0ID0gaGlzdG9ncmFtc1tpZHhdLT5iaXRfY29zdF87CisgICAgICBjb25zdCBkb3VibGUgYml0X2Nvc3RfdGhyZXNoID0gLWJpdF9jb3N0ICogY29tYmluZV9jb3N0X2ZhY3RvcjsKKyAgICAgIGNvbnN0IGRvdWJsZSBjdXJyX2Nvc3RfZGlmZiA9CisgICAgICAgICAgSGlzdG9ncmFtQWRkRXZhbChoaXN0b2dyYW1zW2ZpcnN0XSwgaGlzdG9ncmFtc1tpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2NvbWJvLCBiaXRfY29zdF90aHJlc2gpOworICAgICAgaWYgKGN1cnJfY29zdF9kaWZmIDwgYml0X2Nvc3RfdGhyZXNoKSB7CisgICAgICAgIC8vIFRyeSB0byBtZXJnZSB0d28gaGlzdG9ncmFtcyBvbmx5IGlmIHRoZSBjb21ibyBpcyBhIHRyaXZpYWwgb25lIG9yCisgICAgICAgIC8vIHRoZSB0d28gY2FuZGlkYXRlIGhpc3RvZ3JhbXMgYXJlIGFscmVhZHkgbm9uLXRyaXZpYWwuCisgICAgICAgIC8vIEZvciBzb21lIGltYWdlcywgJ3RyeV9jb21iaW5lJyB0dXJucyBvdXQgdG8gYmUgZmFsc2UgZm9yIGEgbG90IG9mCisgICAgICAgIC8vIGhpc3RvZ3JhbSBwYWlycy4gSW4gdGhhdCBjYXNlLCB3ZSBmYWxsYmFjayB0byBjb21iaW5pbmcKKyAgICAgICAgLy8gaGlzdG9ncmFtcyBhcyB1c3VhbCB0byBhdm9pZCBpbmNyZWFzaW5nIHRoZSBoZWFkZXIgc2l6ZS4KKyAgICAgICAgY29uc3QgaW50IHRyeV9jb21iaW5lID0KKyAgICAgICAgICAgIChjdXJfY29tYm8tPnRyaXZpYWxfc3ltYm9sXyAhPSBWUDhMX05PTl9UUklWSUFMX1NZTSkgfHwKKyAgICAgICAgICAgICgoaGlzdG9ncmFtc1tpZHhdLT50cml2aWFsX3N5bWJvbF8gPT0gVlA4TF9OT05fVFJJVklBTF9TWU0pICYmCisgICAgICAgICAgICAgKGhpc3RvZ3JhbXNbZmlyc3RdLT50cml2aWFsX3N5bWJvbF8gPT0gVlA4TF9OT05fVFJJVklBTF9TWU0pKTsKKyAgICAgICAgY29uc3QgaW50IG1heF9jb21iaW5lX2ZhaWx1cmVzID0gMzI7CisgICAgICAgIGlmICh0cnlfY29tYmluZSB8fAorICAgICAgICAgICAgYmluX2luZm9bYmluX2lkXS5udW1fY29tYmluZV9mYWlsdXJlcyA+PSBtYXhfY29tYmluZV9mYWlsdXJlcykgeworICAgICAgICAgIC8vIG1vdmUgdGhlIChiZXR0ZXIpIG1lcmdlZCBoaXN0b2dyYW0gdG8gaXRzIGZpbmFsIHNsb3QKKyAgICAgICAgICBIaXN0b2dyYW1Td2FwKCZjdXJfY29tYm8sICZoaXN0b2dyYW1zW2ZpcnN0XSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaGlzdG9ncmFtc1tzaXplKytdID0gaGlzdG9ncmFtc1tpZHhdOworICAgICAgICAgICsrYmluX2luZm9bYmluX2lkXS5udW1fY29tYmluZV9mYWlsdXJlczsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgaGlzdG9ncmFtc1tzaXplKytdID0gaGlzdG9ncmFtc1tpZHhdOworICAgICAgfQorICAgIH0KKyAgfQorICBpbWFnZV9oaXN0by0+c2l6ZSA9IHNpemU7CisgIGlmIChsb3dfZWZmb3J0KSB7CisgICAgLy8gZm9yIGxvd19lZmZvcnQgY2FzZSwgdXBkYXRlIHRoZSBmaW5hbCBjb3N0IHdoZW4gZXZlcnl0aGluZyBpcyBtZXJnZWQKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHNpemU7ICsraWR4KSB7CisgICAgICBVcGRhdGVIaXN0b2dyYW1Db3N0KGhpc3RvZ3JhbXNbaWR4XSk7CisgICAgfQorICB9Cit9CisKKy8vIEltcGxlbWVudCBhIExlaG1lciByYW5kb20gbnVtYmVyIGdlbmVyYXRvciB3aXRoIGEgbXVsdGlwbGljYXRpdmUgY29uc3RhbnQgb2YKKy8vIDQ4MjcxIGFuZCBhIG1vZHVsbyBjb25zdGFudCBvZiAyXjMxIC0gMS4KK3N0YXRpYyB1aW50MzJfdCBNeVJhbmQodWludDMyX3QqIGNvbnN0IHNlZWQpIHsKKyAgKnNlZWQgPSAodWludDMyX3QpKCgodWludDY0X3QpKCpzZWVkKSAqIDQ4MjcxdSkgJSAyMTQ3NDgzNjQ3dSk7CisgIGFzc2VydCgqc2VlZCA+IDApOworICByZXR1cm4gKnNlZWQ7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIaXN0b2dyYW0gcGFpcnMgcHJpb3JpdHkgcXVldWUKKworLy8gUGFpciBvZiBoaXN0b2dyYW1zLiBOZWdhdGl2ZSBpZHgxIHZhbHVlIG1lYW5zIHRoYXQgcGFpciBpcyBvdXQtb2YtZGF0ZS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGlkeDE7CisgIGludCBpZHgyOworICBkb3VibGUgY29zdF9kaWZmOworICBkb3VibGUgY29zdF9jb21ibzsKK30gSGlzdG9ncmFtUGFpcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBIaXN0b2dyYW1QYWlyKiBxdWV1ZTsKKyAgaW50IHNpemU7CisgIGludCBtYXhfc2l6ZTsKK30gSGlzdG9RdWV1ZTsKKworc3RhdGljIGludCBIaXN0b1F1ZXVlSW5pdChIaXN0b1F1ZXVlKiBjb25zdCBoaXN0b19xdWV1ZSwgY29uc3QgaW50IG1heF9pbmRleCkgeworICBoaXN0b19xdWV1ZS0+c2l6ZSA9IDA7CisgIC8vIG1heF9pbmRleF4yIGZvciB0aGUgcXVldWUgc2l6ZSBpcyBzYWZlLiBJZiB5b3UgbG9vayBhdAorICAvLyBIaXN0b2dyYW1Db21iaW5lR3JlZWR5LCBhbmQgaW1hZ2luZSB0aGF0IFVwZGF0ZVF1ZXVlRnJvbnQgYWx3YXlzIHB1c2hlcworICAvLyBkYXRhIHRvIHRoZSBxdWV1ZSwgeW91IGluc2VydCBhdCBtb3N0OgorICAvLyAtIG1heF9pbmRleCoobWF4X2luZGV4LTEpLzIgKHRoZSBmaXJzdCB0d28gZm9yIGxvb3BzKQorICAvLyAtIG1heF9pbmRleCAtIDEgaW4gdGhlIGxhc3QgZm9yIGxvb3AgYXQgdGhlIGZpcnN0IGl0ZXJhdGlvbiBvZiB0aGUgd2hpbGUKKyAgLy8gICBsb29wLCBtYXhfaW5kZXggLSAyIGF0IHRoZSBzZWNvbmQgaXRlcmF0aW9uIC4uLiB0aGVyZWZvcmUKKyAgLy8gICBtYXhfaW5kZXgqKG1heF9pbmRleC0xKS8yIG92ZXJhbGwgdG9vCisgIGhpc3RvX3F1ZXVlLT5tYXhfc2l6ZSA9IG1heF9pbmRleCAqIG1heF9pbmRleDsKKyAgLy8gV2UgYWxsb2NhdGUgbWF4X3NpemUgKyAxIGJlY2F1c2UgdGhlIGxhc3QgZWxlbWVudCBhdCBpbmRleCAic2l6ZSIgaXMKKyAgLy8gdXNlZCBhcyB0ZW1wb3JhcnkgZGF0YSAoYW5kIGl0IGNvdWxkIGJlIHVwIHRvIG1heF9zaXplKS4KKyAgaGlzdG9fcXVldWUtPnF1ZXVlID0gKEhpc3RvZ3JhbVBhaXIqKVdlYlBTYWZlTWFsbG9jKAorICAgICAgaGlzdG9fcXVldWUtPm1heF9zaXplICsgMSwgc2l6ZW9mKCpoaXN0b19xdWV1ZS0+cXVldWUpKTsKKyAgcmV0dXJuIGhpc3RvX3F1ZXVlLT5xdWV1ZSAhPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBIaXN0b1F1ZXVlQ2xlYXIoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUpIHsKKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlICE9IE5VTEwpOworICBXZWJQU2FmZUZyZWUoaGlzdG9fcXVldWUtPnF1ZXVlKTsKKyAgaGlzdG9fcXVldWUtPnNpemUgPSAwOworICBoaXN0b19xdWV1ZS0+bWF4X3NpemUgPSAwOworfQorCisvLyBQb3AgYSBzcGVjaWZpYyBwYWlyIGluIHRoZSBxdWV1ZSBieSByZXBsYWNpbmcgaXQgd2l0aCB0aGUgbGFzdCBvbmUKKy8vIGFuZCBzaHJpbmtpbmcgdGhlIHF1ZXVlLgorc3RhdGljIHZvaWQgSGlzdG9RdWV1ZVBvcFBhaXIoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXN0b2dyYW1QYWlyKiBjb25zdCBwYWlyKSB7CisgIGFzc2VydChwYWlyID49IGhpc3RvX3F1ZXVlLT5xdWV1ZSAmJgorICAgICAgICAgcGFpciA8IChoaXN0b19xdWV1ZS0+cXVldWUgKyBoaXN0b19xdWV1ZS0+c2l6ZSkpOworICBhc3NlcnQoaGlzdG9fcXVldWUtPnNpemUgPiAwKTsKKyAgKnBhaXIgPSBoaXN0b19xdWV1ZS0+cXVldWVbaGlzdG9fcXVldWUtPnNpemUgLSAxXTsKKyAgLS1oaXN0b19xdWV1ZS0+c2l6ZTsKK30KKworLy8gQ2hlY2sgd2hldGhlciBhIHBhaXIgaW4gdGhlIHF1ZXVlIHNob3VsZCBiZSB1cGRhdGVkIGFzIGhlYWQgb3Igbm90Lgorc3RhdGljIHZvaWQgSGlzdG9RdWV1ZVVwZGF0ZUhlYWQoSGlzdG9RdWV1ZSogY29uc3QgaGlzdG9fcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXN0b2dyYW1QYWlyKiBjb25zdCBwYWlyKSB7CisgIGFzc2VydChwYWlyLT5jb3N0X2RpZmYgPCAwLik7CisgIGFzc2VydChwYWlyID49IGhpc3RvX3F1ZXVlLT5xdWV1ZSAmJgorICAgICAgICAgcGFpciA8IChoaXN0b19xdWV1ZS0+cXVldWUgKyBoaXN0b19xdWV1ZS0+c2l6ZSkpOworICBhc3NlcnQoaGlzdG9fcXVldWUtPnNpemUgPiAwKTsKKyAgaWYgKHBhaXItPmNvc3RfZGlmZiA8IGhpc3RvX3F1ZXVlLT5xdWV1ZVswXS5jb3N0X2RpZmYpIHsKKyAgICAvLyBSZXBsYWNlIHRoZSBiZXN0IHBhaXIuCisgICAgY29uc3QgSGlzdG9ncmFtUGFpciB0bXAgPSBoaXN0b19xdWV1ZS0+cXVldWVbMF07CisgICAgaGlzdG9fcXVldWUtPnF1ZXVlWzBdID0gKnBhaXI7CisgICAgKnBhaXIgPSB0bXA7CisgIH0KK30KKworLy8gQ3JlYXRlIGEgcGFpciBmcm9tIGluZGljZXMgImlkeDEiIGFuZCAiaWR4MiIgcHJvdmlkZWQgaXRzIGNvc3QKKy8vIGlzIGluZmVyaW9yIHRvICJ0aHJlc2hvbGQiLCBhIG5lZ2F0aXZlIGVudHJvcHkuCisvLyBJdCByZXR1cm5zIHRoZSBjb3N0IG9mIHRoZSBwYWlyLCBvciAwLiBpZiBpdCBzdXBlcmlvciB0byB0aHJlc2hvbGQuCitzdGF0aWMgZG91YmxlIEhpc3RvUXVldWVQdXNoKEhpc3RvUXVldWUqIGNvbnN0IGhpc3RvX3F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcywgaW50IGlkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHgyLCBkb3VibGUgdGhyZXNob2xkKSB7CisgIGNvbnN0IFZQOExIaXN0b2dyYW0qIGgxOworICBjb25zdCBWUDhMSGlzdG9ncmFtKiBoMjsKKyAgSGlzdG9ncmFtUGFpciBwYWlyOworICBkb3VibGUgc3VtX2Nvc3Q7CisKKyAgYXNzZXJ0KHRocmVzaG9sZCA8PSAwLik7CisgIGlmIChpZHgxID4gaWR4MikgeworICAgIGNvbnN0IGludCB0bXAgPSBpZHgyOworICAgIGlkeDIgPSBpZHgxOworICAgIGlkeDEgPSB0bXA7CisgIH0KKyAgcGFpci5pZHgxID0gaWR4MTsKKyAgcGFpci5pZHgyID0gaWR4MjsKKyAgaDEgPSBoaXN0b2dyYW1zW2lkeDFdOworICBoMiA9IGhpc3RvZ3JhbXNbaWR4Ml07CisgIHN1bV9jb3N0ID0gaDEtPmJpdF9jb3N0XyArIGgyLT5iaXRfY29zdF87CisgIHBhaXIuY29zdF9jb21ibyA9IDAuOworICBHZXRDb21iaW5lZEhpc3RvZ3JhbUVudHJvcHkoaDEsIGgyLCBzdW1fY29zdCArIHRocmVzaG9sZCwgJnBhaXIuY29zdF9jb21ibyk7CisgIHBhaXIuY29zdF9kaWZmID0gcGFpci5jb3N0X2NvbWJvIC0gc3VtX2Nvc3Q7CisKKyAgLy8gRG8gbm90IGV2ZW4gY29uc2lkZXIgdGhlIHBhaXIgaWYgaXQgZG9lcyBub3QgaW1wcm92ZSB0aGUgZW50cm9weS4KKyAgaWYgKHBhaXIuY29zdF9kaWZmID49IHRocmVzaG9sZCkgcmV0dXJuIDAuOworCisgIC8vIFdlIGNhbm5vdCBhZGQgbW9yZSBlbGVtZW50cyB0aGFuIHRoZSBjYXBhY2l0eS4KKyAgYXNzZXJ0KGhpc3RvX3F1ZXVlLT5zaXplIDwgaGlzdG9fcXVldWUtPm1heF9zaXplKTsKKyAgaGlzdG9fcXVldWUtPnF1ZXVlW2hpc3RvX3F1ZXVlLT5zaXplKytdID0gcGFpcjsKKyAgSGlzdG9RdWV1ZVVwZGF0ZUhlYWQoaGlzdG9fcXVldWUsICZoaXN0b19xdWV1ZS0+cXVldWVbaGlzdG9fcXVldWUtPnNpemUgLSAxXSk7CisKKyAgcmV0dXJuIHBhaXIuY29zdF9kaWZmOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBDb21iaW5lcyBoaXN0b2dyYW1zIGJ5IGNvbnRpbnVvdXNseSBjaG9vc2luZyB0aGUgb25lIHdpdGggdGhlIGhpZ2hlc3QgY29zdAorLy8gcmVkdWN0aW9uLgorc3RhdGljIGludCBIaXN0b2dyYW1Db21iaW5lR3JlZWR5KFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvKSB7CisgIGludCBvayA9IDA7CisgIGludCBpbWFnZV9oaXN0b19zaXplID0gaW1hZ2VfaGlzdG8tPnNpemU7CisgIGludCBpLCBqOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworICAvLyBJbmRleGVzIG9mIHJlbWFpbmluZyBoaXN0b2dyYW1zLgorICBpbnQqIGNvbnN0IGNsdXN0ZXJzID0KKyAgICAgIChpbnQqKVdlYlBTYWZlTWFsbG9jKGltYWdlX2hpc3RvX3NpemUsIHNpemVvZigqY2x1c3RlcnMpKTsKKyAgLy8gUHJpb3JpdHkgcXVldWUgb2YgaGlzdG9ncmFtIHBhaXJzLgorICBIaXN0b1F1ZXVlIGhpc3RvX3F1ZXVlOworCisgIGlmICghSGlzdG9RdWV1ZUluaXQoJmhpc3RvX3F1ZXVlLCBpbWFnZV9oaXN0b19zaXplKSB8fCBjbHVzdGVycyA9PSBOVUxMKSB7CisgICAgZ290byBFbmQ7CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBjbHVzdGVycyBpbmRleGVzLgorICAgIGNsdXN0ZXJzW2ldID0gaTsKKyAgICBmb3IgKGogPSBpICsgMTsgaiA8IGltYWdlX2hpc3RvX3NpemU7ICsraikgeworICAgICAgLy8gSW5pdGlhbGl6ZSBwb3NpdGlvbnMgYXJyYXkuCisgICAgICBIaXN0b1F1ZXVlUHVzaCgmaGlzdG9fcXVldWUsIGhpc3RvZ3JhbXMsIGksIGosIDAuKTsKKyAgICB9CisgIH0KKworICB3aGlsZSAoaW1hZ2VfaGlzdG9fc2l6ZSA+IDEgJiYgaGlzdG9fcXVldWUuc2l6ZSA+IDApIHsKKyAgICBjb25zdCBpbnQgaWR4MSA9IGhpc3RvX3F1ZXVlLnF1ZXVlWzBdLmlkeDE7CisgICAgY29uc3QgaW50IGlkeDIgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgyOworICAgIEhpc3RvZ3JhbUFkZChoaXN0b2dyYW1zW2lkeDJdLCBoaXN0b2dyYW1zW2lkeDFdLCBoaXN0b2dyYW1zW2lkeDFdKTsKKyAgICBoaXN0b2dyYW1zW2lkeDFdLT5iaXRfY29zdF8gPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5jb3N0X2NvbWJvOworICAgIC8vIFJlbW92ZSBtZXJnZWQgaGlzdG9ncmFtLgorICAgIGZvciAoaSA9IDA7IGkgKyAxIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgICBpZiAoY2x1c3RlcnNbaV0gPj0gaWR4MikgeworICAgICAgICBjbHVzdGVyc1tpXSA9IGNsdXN0ZXJzW2kgKyAxXTsKKyAgICAgIH0KKyAgICB9CisgICAgLS1pbWFnZV9oaXN0b19zaXplOworCisgICAgLy8gUmVtb3ZlIHBhaXJzIGludGVyc2VjdGluZyB0aGUganVzdCBjb21iaW5lZCBiZXN0IHBhaXIuCisgICAgZm9yIChpID0gMDsgaSA8IGhpc3RvX3F1ZXVlLnNpemU7KSB7CisgICAgICBIaXN0b2dyYW1QYWlyKiBjb25zdCBwID0gaGlzdG9fcXVldWUucXVldWUgKyBpOworICAgICAgaWYgKHAtPmlkeDEgPT0gaWR4MSB8fCBwLT5pZHgyID09IGlkeDEgfHwKKyAgICAgICAgICBwLT5pZHgxID09IGlkeDIgfHwgcC0+aWR4MiA9PSBpZHgyKSB7CisgICAgICAgIEhpc3RvUXVldWVQb3BQYWlyKCZoaXN0b19xdWV1ZSwgcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBIaXN0b1F1ZXVlVXBkYXRlSGVhZCgmaGlzdG9fcXVldWUsIHApOworICAgICAgICArK2k7CisgICAgICB9CisgICAgfQorCisgICAgLy8gUHVzaCBuZXcgcGFpcnMgZm9ybWVkIHdpdGggY29tYmluZWQgaGlzdG9ncmFtIHRvIHRoZSBxdWV1ZS4KKyAgICBmb3IgKGkgPSAwOyBpIDwgaW1hZ2VfaGlzdG9fc2l6ZTsgKytpKSB7CisgICAgICBpZiAoY2x1c3RlcnNbaV0gIT0gaWR4MSkgeworICAgICAgICBIaXN0b1F1ZXVlUHVzaCgmaGlzdG9fcXVldWUsIGhpc3RvZ3JhbXMsIGlkeDEsIGNsdXN0ZXJzW2ldLCAwLik7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIE1vdmUgcmVtYWluaW5nIGhpc3RvZ3JhbXMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJyYXkuCisgIGZvciAoaSA9IDA7IGkgPCBpbWFnZV9oaXN0b19zaXplOyArK2kpIHsKKyAgICBpZiAoaSAhPSBjbHVzdGVyc1tpXSkgeyAgLy8gc3dhcCB0aGUgdHdvIGhpc3RvZ3JhbXMKKyAgICAgIEhpc3RvZ3JhbVN3YXAoJmhpc3RvZ3JhbXNbaV0sICZoaXN0b2dyYW1zW2NsdXN0ZXJzW2ldXSk7CisgICAgfQorICB9CisKKyAgaW1hZ2VfaGlzdG8tPnNpemUgPSBpbWFnZV9oaXN0b19zaXplOworICBvayA9IDE7CisKKyBFbmQ6CisgIFdlYlBTYWZlRnJlZShjbHVzdGVycyk7CisgIEhpc3RvUXVldWVDbGVhcigmaGlzdG9fcXVldWUpOworICByZXR1cm4gb2s7Cit9CisKKy8vIFBlcmZvcm0gaGlzdG9ncmFtIGFnZ3JlZ2F0aW9uIHVzaW5nIGEgc3RvY2hhc3RpYyBhcHByb2FjaC4KKy8vICdkb19ncmVlZHknIGlzIHNldCB0byAxIGlmIGEgZ3JlZWR5IGFwcHJvYWNoIG5lZWRzIHRvIGJlIHBlcmZvcm1lZAorLy8gYWZ0ZXJ3YXJkcywgMCBvdGhlcndpc2UuCitzdGF0aWMgaW50IEhpc3RvZ3JhbUNvbWJpbmVTdG9jaGFzdGljKFZQOExIaXN0b2dyYW1TZXQqIGNvbnN0IGltYWdlX2hpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX2NsdXN0ZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBkb19ncmVlZHkpIHsKKyAgaW50IGl0ZXI7CisgIHVpbnQzMl90IHNlZWQgPSAxOworICBpbnQgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKKyAgaW50IGltYWdlX2hpc3RvX3NpemUgPSBpbWFnZV9oaXN0by0+c2l6ZTsKKyAgY29uc3QgaW50IG91dGVyX2l0ZXJzID0gaW1hZ2VfaGlzdG9fc2l6ZTsKKyAgY29uc3QgaW50IG51bV90cmllc19ub19zdWNjZXNzID0gb3V0ZXJfaXRlcnMgLyAyOworICBWUDhMSGlzdG9ncmFtKiogY29uc3QgaGlzdG9ncmFtcyA9IGltYWdlX2hpc3RvLT5oaXN0b2dyYW1zOworICAvLyBQcmlvcml0eSBxdWV1ZSBvZiBoaXN0b2dyYW0gcGFpcnMuIEl0cyBzaXplIG9mICJrQ29zdEhlYXBTaXplU3FydCJeMgorICAvLyBpbXBhY3RzIHRoZSBxdWFsaXR5IG9mIHRoZSBjb21wcmVzc2lvbiBhbmQgdGhlIHNwZWVkOiB0aGUgc21hbGxlciB0aGUKKyAgLy8gZmFzdGVyIGJ1dCB0aGUgd29yc2UgZm9yIHRoZSBjb21wcmVzc2lvbi4KKyAgSGlzdG9RdWV1ZSBoaXN0b19xdWV1ZTsKKyAgY29uc3QgaW50IGtIaXN0b1F1ZXVlU2l6ZVNxcnQgPSAzOworICBpbnQgb2sgPSAwOworCisgIGlmICghSGlzdG9RdWV1ZUluaXQoJmhpc3RvX3F1ZXVlLCBrSGlzdG9RdWV1ZVNpemVTcXJ0KSkgeworICAgIGdvdG8gRW5kOworICB9CisgIC8vIENvbGxhcHNlIHNpbWlsYXIgaGlzdG9ncmFtcyBpbiAnaW1hZ2VfaGlzdG8nLgorICArK21pbl9jbHVzdGVyX3NpemU7CisgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBvdXRlcl9pdGVycyAmJiBpbWFnZV9oaXN0b19zaXplID49IG1pbl9jbHVzdGVyX3NpemUgJiYKKyAgICAgICAgICAgICAgICAgKyt0cmllc193aXRoX25vX3N1Y2Nlc3MgPCBudW1fdHJpZXNfbm9fc3VjY2VzczsKKyAgICAgICArK2l0ZXIpIHsKKyAgICBkb3VibGUgYmVzdF9jb3N0ID0KKyAgICAgICAgKGhpc3RvX3F1ZXVlLnNpemUgPT0gMCkgPyAwLiA6IGhpc3RvX3F1ZXVlLnF1ZXVlWzBdLmNvc3RfZGlmZjsKKyAgICBpbnQgYmVzdF9pZHgxID0gLTEsIGJlc3RfaWR4MiA9IDE7CisgICAgaW50IGo7CisgICAgY29uc3QgdWludDMyX3QgcmFuZF9yYW5nZSA9IChpbWFnZV9oaXN0b19zaXplIC0gMSkgKiBpbWFnZV9oaXN0b19zaXplOworICAgIC8vIGltYWdlX2hpc3RvX3NpemUgLyAyIHdhcyBjaG9zZW4gZW1waXJpY2FsbHkuIExlc3MgbWVhbnMgZmFzdGVyIGJ1dCB3b3JzZQorICAgIC8vIGNvbXByZXNzaW9uLgorICAgIGNvbnN0IGludCBudW1fdHJpZXMgPSBpbWFnZV9oaXN0b19zaXplIC8gMjsKKworICAgIGZvciAoaiA9IDA7IGogPCBudW1fdHJpZXM7ICsraikgeworICAgICAgZG91YmxlIGN1cnJfY29zdDsKKyAgICAgIC8vIENob29zZSB0d28gZGlmZmVyZW50IGhpc3RvZ3JhbXMgYXQgcmFuZG9tIGFuZCB0cnkgdG8gY29tYmluZSB0aGVtLgorICAgICAgY29uc3QgdWludDMyX3QgdG1wID0gTXlSYW5kKCZzZWVkKSAlIHJhbmRfcmFuZ2U7CisgICAgICBjb25zdCB1aW50MzJfdCBpZHgxID0gdG1wIC8gKGltYWdlX2hpc3RvX3NpemUgLSAxKTsKKyAgICAgIHVpbnQzMl90IGlkeDIgPSB0bXAgJSAoaW1hZ2VfaGlzdG9fc2l6ZSAtIDEpOworICAgICAgaWYgKGlkeDIgPj0gaWR4MSkgKytpZHgyOworCisgICAgICAvLyBDYWxjdWxhdGUgY29zdCByZWR1Y3Rpb24gb24gY29tYmluYXRpb24uCisgICAgICBjdXJyX2Nvc3QgPQorICAgICAgICAgIEhpc3RvUXVldWVQdXNoKCZoaXN0b19xdWV1ZSwgaGlzdG9ncmFtcywgaWR4MSwgaWR4MiwgYmVzdF9jb3N0KTsKKyAgICAgIGlmIChjdXJyX2Nvc3QgPCAwKSB7ICAvLyBmb3VuZCBhIGJldHRlciBwYWlyPworICAgICAgICBiZXN0X2Nvc3QgPSBjdXJyX2Nvc3Q7CisgICAgICAgIC8vIEVtcHR5IHRoZSBxdWV1ZSBpZiB3ZSByZWFjaGVkIGZ1bGwgY2FwYWNpdHkuCisgICAgICAgIGlmIChoaXN0b19xdWV1ZS5zaXplID09IGhpc3RvX3F1ZXVlLm1heF9zaXplKSBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhpc3RvX3F1ZXVlLnNpemUgPT0gMCkgY29udGludWU7CisKKyAgICAvLyBNZXJnZSB0aGUgdHdvIGJlc3QgaGlzdG9ncmFtcy4KKyAgICBiZXN0X2lkeDEgPSBoaXN0b19xdWV1ZS5xdWV1ZVswXS5pZHgxOworICAgIGJlc3RfaWR4MiA9IGhpc3RvX3F1ZXVlLnF1ZXVlWzBdLmlkeDI7CisgICAgYXNzZXJ0KGJlc3RfaWR4MSA8IGJlc3RfaWR4Mik7CisgICAgSGlzdG9ncmFtQWRkRXZhbChoaXN0b2dyYW1zW2Jlc3RfaWR4MV0sIGhpc3RvZ3JhbXNbYmVzdF9pZHgyXSwKKyAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbXNbYmVzdF9pZHgxXSwgMCk7CisgICAgLy8gU3dhcCB0aGUgYmVzdF9pZHgyIGhpc3RvZ3JhbSB3aXRoIHRoZSBsYXN0IG9uZSAod2hpY2ggaXMgbm93IHVudXNlZCkuCisgICAgLS1pbWFnZV9oaXN0b19zaXplOworICAgIGlmIChiZXN0X2lkeDIgIT0gaW1hZ2VfaGlzdG9fc2l6ZSkgeworICAgICAgSGlzdG9ncmFtU3dhcCgmaGlzdG9ncmFtc1tpbWFnZV9oaXN0b19zaXplXSwgJmhpc3RvZ3JhbXNbYmVzdF9pZHgyXSk7CisgICAgfQorICAgIGhpc3RvZ3JhbXNbaW1hZ2VfaGlzdG9fc2l6ZV0gPSBOVUxMOworICAgIC8vIFBhcnNlIHRoZSBxdWV1ZSBhbmQgdXBkYXRlIGVhY2ggcGFpciB0aGF0IGRlYWxzIHdpdGggYmVzdF9pZHgxLAorICAgIC8vIGJlc3RfaWR4MiBvciBpbWFnZV9oaXN0b19zaXplLgorICAgIGZvciAoaiA9IDA7IGogPCBoaXN0b19xdWV1ZS5zaXplOykgeworICAgICAgSGlzdG9ncmFtUGFpciogY29uc3QgcCA9IGhpc3RvX3F1ZXVlLnF1ZXVlICsgajsKKyAgICAgIGNvbnN0IGludCBpc19pZHgxX2Jlc3QgPSBwLT5pZHgxID09IGJlc3RfaWR4MSB8fCBwLT5pZHgxID09IGJlc3RfaWR4MjsKKyAgICAgIGNvbnN0IGludCBpc19pZHgyX2Jlc3QgPSBwLT5pZHgyID09IGJlc3RfaWR4MSB8fCBwLT5pZHgyID09IGJlc3RfaWR4MjsKKyAgICAgIGludCBkb19ldmFsID0gMDsKKyAgICAgIC8vIFRoZSBmcm9udCBwYWlyIGNvdWxkIGhhdmUgYmVlbiBkdXBsaWNhdGVkIGJ5IGEgcmFuZG9tIHBpY2sgc28KKyAgICAgIC8vIGNoZWNrIGZvciBpdCBhbGwgdGhlIHRpbWUgbmV2ZXJ0aGVsZXNzLgorICAgICAgaWYgKGlzX2lkeDFfYmVzdCAmJiBpc19pZHgyX2Jlc3QpIHsKKyAgICAgICAgSGlzdG9RdWV1ZVBvcFBhaXIoJmhpc3RvX3F1ZXVlLCBwKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICAvLyBBbnkgcGFpciBjb250YWluaW5nIG9uZSBvZiB0aGUgdHdvIGJlc3QgaW5kaWNlcyBzaG91bGQgb25seSByZWZlciB0bworICAgICAgLy8gYmVzdF9pZHgxLiBJdHMgY29zdCBzaG91bGQgYWxzbyBiZSB1cGRhdGVkLgorICAgICAgaWYgKGlzX2lkeDFfYmVzdCkgeworICAgICAgICBwLT5pZHgxID0gYmVzdF9pZHgxOworICAgICAgICBkb19ldmFsID0gMTsKKyAgICAgIH0gZWxzZSBpZiAoaXNfaWR4Ml9iZXN0KSB7CisgICAgICAgIHAtPmlkeDIgPSBiZXN0X2lkeDE7CisgICAgICAgIGRvX2V2YWwgPSAxOworICAgICAgfQorICAgICAgaWYgKHAtPmlkeDIgPT0gaW1hZ2VfaGlzdG9fc2l6ZSkgeworICAgICAgICAvLyBObyBuZWVkIHRvIHJlLWV2YWx1YXRlIGhlcmUgYXMgaXQgZG9lcyBub3QgaW52b2x2ZSBhIHBhaXIKKyAgICAgICAgLy8gY29udGFpbmluZyBiZXN0X2lkeDEgb3IgYmVzdF9pZHgyLgorICAgICAgICBwLT5pZHgyID0gYmVzdF9pZHgyOworICAgICAgfQorICAgICAgYXNzZXJ0KHAtPmlkeDIgPCBpbWFnZV9oaXN0b19zaXplKTsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5kZXggb3JkZXIgaXMgcmVzcGVjdGVkLgorICAgICAgaWYgKHAtPmlkeDEgPiBwLT5pZHgyKSB7CisgICAgICAgIGNvbnN0IGludCB0bXAgPSBwLT5pZHgyOworICAgICAgICBwLT5pZHgyID0gcC0+aWR4MTsKKyAgICAgICAgcC0+aWR4MSA9IHRtcDsKKyAgICAgIH0KKyAgICAgIGlmIChkb19ldmFsKSB7CisgICAgICAgIC8vIFJlLWV2YWx1YXRlIHRoZSBjb3N0IG9mIGFuIHVwZGF0ZWQgcGFpci4KKyAgICAgICAgR2V0Q29tYmluZWRIaXN0b2dyYW1FbnRyb3B5KGhpc3RvZ3JhbXNbcC0+aWR4MV0sIGhpc3RvZ3JhbXNbcC0+aWR4Ml0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcC0+Y29zdF9kaWZmKTsKKyAgICAgICAgaWYgKHAtPmNvc3RfZGlmZiA+PSAwLikgeworICAgICAgICAgIEhpc3RvUXVldWVQb3BQYWlyKCZoaXN0b19xdWV1ZSwgcCk7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIEhpc3RvUXVldWVVcGRhdGVIZWFkKCZoaXN0b19xdWV1ZSwgcCk7CisgICAgICArK2o7CisgICAgfQorCisgICAgdHJpZXNfd2l0aF9ub19zdWNjZXNzID0gMDsKKyAgfQorICBpbWFnZV9oaXN0by0+c2l6ZSA9IGltYWdlX2hpc3RvX3NpemU7CisgICpkb19ncmVlZHkgPSAoaW1hZ2VfaGlzdG8tPnNpemUgPD0gbWluX2NsdXN0ZXJfc2l6ZSk7CisgIG9rID0gMTsKKworRW5kOgorICBIaXN0b1F1ZXVlQ2xlYXIoJmhpc3RvX3F1ZXVlKTsKKyAgcmV0dXJuIG9rOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlzdG9ncmFtIHJlZmluZW1lbnQKKworLy8gRmluZCB0aGUgYmVzdCAnb3V0JyBoaXN0b2dyYW0gZm9yIGVhY2ggb2YgdGhlICdpbicgaGlzdG9ncmFtcy4KKy8vIE5vdGU6IHdlIGFzc3VtZSB0aGF0IG91dFtdLT5iaXRfY29zdF8gaXMgYWxyZWFkeSB1cC10by1kYXRlLgorc3RhdGljIHZvaWQgSGlzdG9ncmFtUmVtYXAoY29uc3QgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY29uc3Qgc3ltYm9scykgeworICBpbnQgaTsKKyAgVlA4TEhpc3RvZ3JhbSoqIGNvbnN0IGluX2hpc3RvID0gaW4tPmhpc3RvZ3JhbXM7CisgIFZQOExIaXN0b2dyYW0qKiBjb25zdCBvdXRfaGlzdG8gPSBvdXQtPmhpc3RvZ3JhbXM7CisgIGNvbnN0IGludCBpbl9zaXplID0gaW4tPnNpemU7CisgIGNvbnN0IGludCBvdXRfc2l6ZSA9IG91dC0+c2l6ZTsKKyAgaWYgKG91dF9zaXplID4gMSkgeworICAgIGZvciAoaSA9IDA7IGkgPCBpbl9zaXplOyArK2kpIHsKKyAgICAgIGludCBiZXN0X291dCA9IDA7CisgICAgICBkb3VibGUgYmVzdF9iaXRzID0gTUFYX0NPU1Q7CisgICAgICBpbnQgazsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBvdXRfc2l6ZTsgKytrKSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjdXJfYml0cyA9CisgICAgICAgICAgICBIaXN0b2dyYW1BZGRUaHJlc2gob3V0X2hpc3RvW2tdLCBpbl9oaXN0b1tpXSwgYmVzdF9iaXRzKTsKKyAgICAgICAgaWYgKGsgPT0gMCB8fCBjdXJfYml0cyA8IGJlc3RfYml0cykgeworICAgICAgICAgIGJlc3RfYml0cyA9IGN1cl9iaXRzOworICAgICAgICAgIGJlc3Rfb3V0ID0gazsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3ltYm9sc1tpXSA9IGJlc3Rfb3V0OworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBhc3NlcnQob3V0X3NpemUgPT0gMSk7CisgICAgZm9yIChpID0gMDsgaSA8IGluX3NpemU7ICsraSkgeworICAgICAgc3ltYm9sc1tpXSA9IDA7CisgICAgfQorICB9CisKKyAgLy8gUmVjb21wdXRlIGVhY2ggb3V0IGJhc2VkIG9uIHJhdyBhbmQgc3ltYm9scy4KKyAgZm9yIChpID0gMDsgaSA8IG91dF9zaXplOyArK2kpIHsKKyAgICBIaXN0b2dyYW1DbGVhcihvdXRfaGlzdG9baV0pOworICB9CisKKyAgZm9yIChpID0gMDsgaSA8IGluX3NpemU7ICsraSkgeworICAgIGNvbnN0IGludCBpZHggPSBzeW1ib2xzW2ldOworICAgIEhpc3RvZ3JhbUFkZChpbl9oaXN0b1tpXSwgb3V0X2hpc3RvW2lkeF0sIG91dF9oaXN0b1tpZHhdKTsKKyAgfQorfQorCitzdGF0aWMgZG91YmxlIEdldENvbWJpbmVDb3N0RmFjdG9yKGludCBoaXN0b19zaXplLCBpbnQgcXVhbGl0eSkgeworICBkb3VibGUgY29tYmluZV9jb3N0X2ZhY3RvciA9IDAuMTY7CisgIGlmIChxdWFsaXR5IDwgOTApIHsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDI1NikgY29tYmluZV9jb3N0X2ZhY3RvciAvPSAyLjsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDUxMikgY29tYmluZV9jb3N0X2ZhY3RvciAvPSAyLjsKKyAgICBpZiAoaGlzdG9fc2l6ZSA+IDEwMjQpIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgICAgaWYgKHF1YWxpdHkgPD0gNTApIGNvbWJpbmVfY29zdF9mYWN0b3IgLz0gMi47CisgIH0KKyAgcmV0dXJuIGNvbWJpbmVfY29zdF9mYWN0b3I7Cit9CisKK2ludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvX2JpdHMsIGludCBjYWNoZV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBpbWFnZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgdG1wX2hpc3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCogY29uc3QgaGlzdG9ncmFtX3N5bWJvbHMpIHsKKyAgaW50IG9rID0gMDsKKyAgY29uc3QgaW50IGhpc3RvX3hzaXplID0gaGlzdG9fYml0cyA/IFZQOExTdWJTYW1wbGVTaXplKHhzaXplLCBoaXN0b19iaXRzKSA6IDE7CisgIGNvbnN0IGludCBoaXN0b195c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh5c2l6ZSwgaGlzdG9fYml0cykgOiAxOworICBjb25zdCBpbnQgaW1hZ2VfaGlzdG9fcmF3X3NpemUgPSBoaXN0b194c2l6ZSAqIGhpc3RvX3lzaXplOworICBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBvcmlnX2hpc3RvID0KKyAgICAgIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbWFnZV9oaXN0b19yYXdfc2l6ZSwgY2FjaGVfYml0cyk7CisgIC8vIERvbid0IGF0dGVtcHQgbGluZWFyIGJpbi1wYXJ0aXRpb24gaGV1cmlzdGljIGZvcgorICAvLyBoaXN0b2dyYW1zIG9mIHNtYWxsIHNpemVzIChhcyBiaW5fbWFwIHdpbGwgYmUgdmVyeSBzcGFyc2UpIGFuZAorICAvLyBtYXhpbXVtIHF1YWxpdHkgcT09MTAwICh0byBwcmVzZXJ2ZSB0aGUgY29tcHJlc3Npb24gZ2FpbnMgYXQgdGhhdCBsZXZlbCkuCisgIGNvbnN0IGludCBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnMgPSBsb3dfZWZmb3J0ID8gTlVNX1BBUlRJVElPTlMgOiBCSU5fU0laRTsKKyAgY29uc3QgaW50IGVudHJvcHlfY29tYmluZSA9CisgICAgICAob3JpZ19oaXN0by0+c2l6ZSA+IGVudHJvcHlfY29tYmluZV9udW1fYmlucyAqIDIpICYmIChxdWFsaXR5IDwgMTAwKTsKKworICBpZiAob3JpZ19oaXN0byA9PSBOVUxMKSBnb3RvIEVycm9yOworCisgIC8vIENvbnN0cnVjdCB0aGUgaGlzdG9ncmFtcyBmcm9tIGJhY2t3YXJkIHJlZmVyZW5jZXMuCisgIEhpc3RvZ3JhbUJ1aWxkKHhzaXplLCBoaXN0b19iaXRzLCByZWZzLCBvcmlnX2hpc3RvKTsKKyAgLy8gQ29waWVzIHRoZSBoaXN0b2dyYW1zIGFuZCBjb21wdXRlcyBpdHMgYml0X2Nvc3QuCisgIEhpc3RvZ3JhbUNvcHlBbmRBbmFseXplKG9yaWdfaGlzdG8sIGltYWdlX2hpc3RvKTsKKworICBpZiAoZW50cm9weV9jb21iaW5lKSB7CisgICAgY29uc3QgaW50IGJpbl9tYXBfc2l6ZSA9IG9yaWdfaGlzdG8tPnNpemU7CisgICAgLy8gUmV1c2UgaGlzdG9ncmFtX3N5bWJvbHMgc3RvcmFnZS4gQnkgZGVmaW5pdGlvbiwgaXQncyBndWFyYW50ZWVkIHRvIGJlIG9rLgorICAgIHVpbnQxNl90KiBjb25zdCBiaW5fbWFwID0gaGlzdG9ncmFtX3N5bWJvbHM7CisgICAgY29uc3QgZG91YmxlIGNvbWJpbmVfY29zdF9mYWN0b3IgPQorICAgICAgICBHZXRDb21iaW5lQ29zdEZhY3RvcihpbWFnZV9oaXN0b19yYXdfc2l6ZSwgcXVhbGl0eSk7CisKKyAgICBIaXN0b2dyYW1BbmFseXplRW50cm9weUJpbihvcmlnX2hpc3RvLCBiaW5fbWFwLCBsb3dfZWZmb3J0KTsKKyAgICAvLyBDb2xsYXBzZSBoaXN0b2dyYW1zIHdpdGggc2ltaWxhciBlbnRyb3B5LgorICAgIEhpc3RvZ3JhbUNvbWJpbmVFbnRyb3B5QmluKGltYWdlX2hpc3RvLCB0bXBfaGlzdG8sIGJpbl9tYXAsIGJpbl9tYXBfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyb3B5X2NvbWJpbmVfbnVtX2JpbnMsIGNvbWJpbmVfY29zdF9mYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCk7CisgIH0KKworICAvLyBEb24ndCBjb21iaW5lIHRoZSBoaXN0b2dyYW1zIHVzaW5nIHN0b2NoYXN0aWMgYW5kIGdyZWVkeSBoZXVyaXN0aWNzIGZvcgorICAvLyBsb3ctZWZmb3J0IGNvbXByZXNzaW9uIG1vZGUuCisgIGlmICghbG93X2VmZm9ydCB8fCAhZW50cm9weV9jb21iaW5lKSB7CisgICAgY29uc3QgZmxvYXQgeCA9IHF1YWxpdHkgLyAxMDAuZjsKKyAgICAvLyBjdWJpYyByYW1wIGJldHdlZW4gMSBhbmQgTUFYX0hJU1RPX0dSRUVEWToKKyAgICBjb25zdCBpbnQgdGhyZXNob2xkX3NpemUgPSAoaW50KSgxICsgKHggKiB4ICogeCkgKiAoTUFYX0hJU1RPX0dSRUVEWSAtIDEpKTsKKyAgICBpbnQgZG9fZ3JlZWR5OworICAgIGlmICghSGlzdG9ncmFtQ29tYmluZVN0b2NoYXN0aWMoaW1hZ2VfaGlzdG8sIHRocmVzaG9sZF9zaXplLCAmZG9fZ3JlZWR5KSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKGRvX2dyZWVkeSAmJiAhSGlzdG9ncmFtQ29tYmluZUdyZWVkeShpbWFnZV9oaXN0bykpIHsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisKKyAgLy8gVE9ETyh2cmFiYXVkKTogT3B0aW1pemUgSGlzdG9ncmFtUmVtYXAgZm9yIGxvdy1lZmZvcnQgY29tcHJlc3Npb24gbW9kZS4KKyAgLy8gRmluZCB0aGUgb3B0aW1hbCBtYXAgZnJvbSBvcmlnaW5hbCBoaXN0b2dyYW1zIHRvIHRoZSBmaW5hbCBvbmVzLgorICBIaXN0b2dyYW1SZW1hcChvcmlnX2hpc3RvLCBpbWFnZV9oaXN0bywgaGlzdG9ncmFtX3N5bWJvbHMpOworCisgIG9rID0gMTsKKworIEVycm9yOgorICBWUDhMRnJlZUhpc3RvZ3JhbVNldChvcmlnX2hpc3RvKTsKKyAgcmV0dXJuIG9rOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2hpc3RvZ3JhbV9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjlmNDhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCisvLworLy8gTW9kZWxzIHRoZSBoaXN0b2dyYW1zIG9mIGxpdGVyYWwgYW5kIGRpc3RhbmNlIGNvZGVzLgorCisjaWZuZGVmIFdFQlBfRU5DX0hJU1RPR1JBTV9FTkNfSF8KKyNkZWZpbmUgV0VCUF9FTkNfSElTVE9HUkFNX0VOQ19IXworCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvYmFja3dhcmRfcmVmZXJlbmNlc19lbmMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBOb3QgYSB0cml2aWFsIGxpdGVyYWwgc3ltYm9sLgorI2RlZmluZSBWUDhMX05PTl9UUklWSUFMX1NZTSAoMHhmZmZmZmZmZikKKworLy8gQSBzaW1wbGUgY29udGFpbmVyIGZvciBoaXN0b2dyYW1zIG9mIGRhdGEuCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIGxpdGVyYWxfIGNvbnRhaW5zIGdyZWVuIGxpdGVyYWwsIHBhbGV0dGUtY29kZSBhbmQKKyAgLy8gY29weS1sZW5ndGgtcHJlZml4IGhpc3RvZ3JhbQorICB1aW50MzJfdCogbGl0ZXJhbF87ICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBmb3IgbGl0ZXJhbC4KKyAgdWludDMyX3QgcmVkX1tOVU1fTElURVJBTF9DT0RFU107CisgIHVpbnQzMl90IGJsdWVfW05VTV9MSVRFUkFMX0NPREVTXTsKKyAgdWludDMyX3QgYWxwaGFfW05VTV9MSVRFUkFMX0NPREVTXTsKKyAgLy8gQmFja3dhcmQgcmVmZXJlbmNlIHByZWZpeC1jb2RlIGhpc3RvZ3JhbS4KKyAgdWludDMyX3QgZGlzdGFuY2VfW05VTV9ESVNUQU5DRV9DT0RFU107CisgIGludCBwYWxldHRlX2NvZGVfYml0c187CisgIHVpbnQzMl90IHRyaXZpYWxfc3ltYm9sXzsgIC8vIFRydWUsIGlmIGhpc3RvZ3JhbXMgZm9yIFJlZCwgQmx1ZSAmIEFscGhhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpdGVyYWwgc3ltYm9scyBhcmUgc2luZ2xlIHZhbHVlZC4KKyAgZG91YmxlIGJpdF9jb3N0XzsgICAgICAgICAgLy8gY2FjaGVkIHZhbHVlIG9mIGJpdCBjb3N0LgorICBkb3VibGUgbGl0ZXJhbF9jb3N0XzsgICAgICAvLyBDYWNoZWQgdmFsdWVzIG9mIGRvbWluYW50IGVudHJvcHkgY29zdHM6CisgIGRvdWJsZSByZWRfY29zdF87ICAgICAgICAgIC8vIGxpdGVyYWwsIHJlZCAmIGJsdWUuCisgIGRvdWJsZSBibHVlX2Nvc3RfOworfSBWUDhMSGlzdG9ncmFtOworCisvLyBDb2xsZWN0aW9uIG9mIGhpc3RvZ3JhbXMgd2l0aCBmaXhlZCBjYXBhY2l0eSwgYWxsb2NhdGVkIGFzIG9uZQorLy8gYmlnIG1lbW9yeSBjaHVuay4gQ2FuIGJlIGRlc3Ryb3llZCBieSBjYWxsaW5nIFdlYlBTYWZlRnJlZSgpLgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2l6ZTsgICAgICAgICAvLyBudW1iZXIgb2Ygc2xvdHMgY3VycmVudGx5IGluIHVzZQorICBpbnQgbWF4X3NpemU7ICAgICAvLyBtYXhpbXVtIGNhcGFjaXR5CisgIFZQOExIaXN0b2dyYW0qKiBoaXN0b2dyYW1zOworfSBWUDhMSGlzdG9ncmFtU2V0OworCisvLyBDcmVhdGUgdGhlIGhpc3RvZ3JhbS4KKy8vCisvLyBUaGUgaW5wdXQgZGF0YSBpcyB0aGUgUGl4T3JDb3B5IGRhdGEsIHdoaWNoIG1vZGVscyB0aGUgbGl0ZXJhbHMsIHN0b3AKKy8vIGNvZGVzIGFuZCBiYWNrd2FyZCByZWZlcmVuY2VzIChib3RoIGRpc3RhbmNlcyBhbmQgbGVuZ3RocykuICBBbHNvOiBpZgorLy8gcGFsZXR0ZV9jb2RlX2JpdHMgaXMgPj0gMCwgaW5pdGlhbGl6ZSB0aGUgaGlzdG9ncmFtIHdpdGggdGhpcyB2YWx1ZS4KK3ZvaWQgVlA4TEhpc3RvZ3JhbUNyZWF0ZShWUDhMSGlzdG9ncmFtKiBjb25zdCBwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKKworLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoaXN0b2dyYW0gZm9yIGEgZ2l2ZW4gcGFsZXR0ZV9jb2RlX2JpdHMuCitpbnQgVlA4TEdldEhpc3RvZ3JhbVNpemUoaW50IHBhbGV0dGVfY29kZV9iaXRzKTsKKworLy8gU2V0IHRoZSBwYWxldHRlX2NvZGVfYml0cyBhbmQgcmVzZXQgdGhlIHN0YXRzLgordm9pZCBWUDhMSGlzdG9ncmFtSW5pdChWUDhMSGlzdG9ncmFtKiBjb25zdCBwLCBpbnQgcGFsZXR0ZV9jb2RlX2JpdHMpOworCisvLyBDb2xsZWN0IGFsbCB0aGUgcmVmZXJlbmNlcyBpbnRvIGEgaGlzdG9ncmFtICh3aXRob3V0IHJlc2V0KQordm9pZCBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbSogY29uc3QgaGlzdG8pOworCisvLyBGcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgaGlzdG9ncmFtLgordm9pZCBWUDhMRnJlZUhpc3RvZ3JhbShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byk7CisKKy8vIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBoaXN0b2dyYW0gc2V0Lgordm9pZCBWUDhMRnJlZUhpc3RvZ3JhbVNldChWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBoaXN0byk7CisKKy8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIHBvaW50ZXIgdG8gaGlzdG9ncmFtcywgYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZAorLy8gdXNpbmcgJ2NhY2hlX2JpdHMnLiBSZXR1cm4gTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK1ZQOExIaXN0b2dyYW1TZXQqIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldChpbnQgc2l6ZSwgaW50IGNhY2hlX2JpdHMpOworCisvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBoaXN0b2dyYW0gb2JqZWN0IHdpdGggc3BlY2lmaWVkICdjYWNoZV9iaXRzJy4KKy8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KKy8vIFNwZWNpYWwgY2FzZSBvZiBWUDhMQWxsb2NhdGVIaXN0b2dyYW1TZXQsIHdpdGggc2l6ZSBlcXVhbHMgMS4KK1ZQOExIaXN0b2dyYW0qIFZQOExBbGxvY2F0ZUhpc3RvZ3JhbShpbnQgY2FjaGVfYml0cyk7CisKKy8vIEFjY3VtdWxhdGUgYSB0b2tlbiAndicgaW50byBhIGhpc3RvZ3JhbS4KK3ZvaWQgVlA4TEhpc3RvZ3JhbUFkZFNpbmdsZVBpeE9yQ29weShWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICgqY29uc3QgZGlzdGFuY2VfbW9kaWZpZXIpKGludCwgaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGlzdGFuY2VfbW9kaWZpZXJfYXJnMCk7CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TEhpc3RvZ3JhbU51bUNvZGVzKGludCBwYWxldHRlX2NvZGVfYml0cykgeworICByZXR1cm4gTlVNX0xJVEVSQUxfQ09ERVMgKyBOVU1fTEVOR1RIX0NPREVTICsKKyAgICAgICgocGFsZXR0ZV9jb2RlX2JpdHMgPiAwKSA/ICgxIDw8IHBhbGV0dGVfY29kZV9iaXRzKSA6IDApOworfQorCisvLyBCdWlsZHMgdGhlIGhpc3RvZ3JhbSBpbWFnZS4KK2ludCBWUDhMR2V0SGlzdG9JbWFnZVN5bWJvbHMoaW50IHhzaXplLCBpbnQgeXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhpc3RvZ3JhbV9iaXRzLCBpbnQgY2FjaGVfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEhpc3RvZ3JhbVNldCogY29uc3QgaW1hZ2VfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIaXN0b2dyYW0qIGNvbnN0IHRtcF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzKTsKKworLy8gUmV0dXJucyB0aGUgZW50cm9weSBmb3IgdGhlIHN5bWJvbHMgaW4gdGhlIGlucHV0IGFycmF5LgorZG91YmxlIFZQOExCaXRzRW50cm9weShjb25zdCB1aW50MzJfdCogY29uc3QgYXJyYXksIGludCBuKTsKKworLy8gRXN0aW1hdGUgaG93IG1hbnkgYml0cyB0aGUgY29tYmluZWQgZW50cm9weSBvZiBsaXRlcmFscyBhbmQgZGlzdGFuY2UKKy8vIGFwcHJveGltYXRlbHkgbWFwcyB0by4KK2RvdWJsZSBWUDhMSGlzdG9ncmFtRXN0aW1hdGVCaXRzKGNvbnN0IFZQOExIaXN0b2dyYW0qIGNvbnN0IHApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfRU5DX0hJU1RPR1JBTV9FTkNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy9pdGVyYXRvci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9pdGVyYXRvcl9lbmMuYwpzaW1pbGFyaXR5IGluZGV4IDY0JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaXRlcmF0b3IuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9pdGVyYXRvcl9lbmMuYwppbmRleCAyY2QxYmMwLi4xZGY5Y2IwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvaXRlcmF0b3IuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL2l0ZXJhdG9yX2VuYy5jCkBAIC0xMSw3NiArMTEsOTIgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWUDhJdGVyYXRvcgogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdGljIHZvaWQgSW5pdExlZnQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7Ci0gIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBlbmMtPnlfbGVmdF9bLTFdID0gZW5jLT51X2xlZnRfWy0xXSA9IGVuYy0+dl9sZWZ0X1stMV0gPQorICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dl9sZWZ0X1stMV0gPQogICAgICAgKGl0LT55XyA+IDApID8gMTI5IDogMTI3OwotICBTYk1lbW9yeVNldChlbmMtPnlfbGVmdF8sIDEyOSwgMTYpOwotICBTYk1lbW9yeVNldChlbmMtPnVfbGVmdF8sIDEyOSwgOCk7Ci0gIFNiTWVtb3J5U2V0KGVuYy0+dl9sZWZ0XywgMTI5LCA4KTsKKyAgbWVtc2V0KGl0LT55X2xlZnRfLCAxMjksIDE2KTsKKyAgbWVtc2V0KGl0LT51X2xlZnRfLCAxMjksIDgpOworICBtZW1zZXQoaXQtPnZfbGVmdF8sIDEyOSwgOCk7CiAgIGl0LT5sZWZ0X256X1s4XSA9IDA7CisgIGlmIChpdC0+dG9wX2RlcnJfICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoJml0LT5sZWZ0X2RlcnJfLCAwLCBzaXplb2YoaXQtPmxlZnRfZGVycl8pKTsKKyAgfQogfQogCiBzdGF0aWMgdm9pZCBJbml0VG9wKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgewogICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKICAgY29uc3Qgc2l6ZV90IHRvcF9zaXplID0gZW5jLT5tYl93XyAqIDE2OwotICBTYk1lbW9yeVNldChlbmMtPnlfdG9wXywgMTI3LCAyICogdG9wX3NpemUpOwotICBTYk1lbW9yeVNldChlbmMtPm56XywgMCwgZW5jLT5tYl93XyAqIHNpemVvZigqZW5jLT5uel8pKTsKKyAgbWVtc2V0KGVuYy0+eV90b3BfLCAxMjcsIDIgKiB0b3Bfc2l6ZSk7CisgIG1lbXNldChlbmMtPm56XywgMCwgZW5jLT5tYl93XyAqIHNpemVvZigqZW5jLT5uel8pKTsKKyAgaWYgKGVuYy0+dG9wX2RlcnJfICE9IE5VTEwpIHsKKyAgICBtZW1zZXQoZW5jLT50b3BfZGVycl8sIDAsIGVuYy0+bWJfd18gKiBzaXplb2YoKmVuYy0+dG9wX2RlcnJfKSk7CisgIH0KK30KKwordm9pZCBWUDhJdGVyYXRvclNldFJvdyhWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIGludCB5KSB7CisgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBpdC0+eF8gPSAwOworICBpdC0+eV8gPSB5OworICBpdC0+YndfID0gJmVuYy0+cGFydHNfW3kgJiAoZW5jLT5udW1fcGFydHNfIC0gMSldOworICBpdC0+cHJlZHNfID0gZW5jLT5wcmVkc18gKyB5ICogNCAqIGVuYy0+cHJlZHNfd187CisgIGl0LT5uel8gPSBlbmMtPm56XzsKKyAgaXQtPm1iXyA9IGVuYy0+bWJfaW5mb18gKyB5ICogZW5jLT5tYl93XzsKKyAgaXQtPnlfdG9wXyA9IGVuYy0+eV90b3BfOworICBpdC0+dXZfdG9wXyA9IGVuYy0+dXZfdG9wXzsKKyAgSW5pdExlZnQoaXQpOwogfQogCiB2b2lkIFZQOEl0ZXJhdG9yUmVzZXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CiAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpdC0+eF8gPSAwOwotICBpdC0+eV8gPSAwOwotICBpdC0+eV9vZmZzZXRfID0gMDsKLSAgaXQtPnV2X29mZnNldF8gPSAwOwotICBpdC0+bWJfID0gZW5jLT5tYl9pbmZvXzsKLSAgaXQtPnByZWRzXyA9IGVuYy0+cHJlZHNfOwotICBpdC0+bnpfID0gZW5jLT5uel87Ci0gIGl0LT5id18gPSAmZW5jLT5wYXJ0c19bMF07Ci0gIGl0LT5kb25lXyA9IGVuYy0+bWJfd18qIGVuYy0+bWJfaF87CisgIFZQOEl0ZXJhdG9yU2V0Um93KGl0LCAwKTsKKyAgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oaXQsIGVuYy0+bWJfd18gKiBlbmMtPm1iX2hfKTsgIC8vIGRlZmF1bHQKICAgSW5pdFRvcChpdCk7Ci0gIEluaXRMZWZ0KGl0KTsKLSAgU2JNZW1vcnlTZXQoaXQtPmJpdF9jb3VudF8sIDAsIHNpemVvZihpdC0+Yml0X2NvdW50XykpOworICBtZW1zZXQoaXQtPmJpdF9jb3VudF8sIDAsIHNpemVvZihpdC0+Yml0X2NvdW50XykpOwogICBpdC0+ZG9fdHJlbGxpc18gPSAwOwogfQogCit2b2lkIFZQOEl0ZXJhdG9yU2V0Q291bnREb3duKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGNvdW50X2Rvd24pIHsKKyAgaXQtPmNvdW50X2Rvd25fID0gaXQtPmNvdW50X2Rvd24wXyA9IGNvdW50X2Rvd247Cit9CisKK2ludCBWUDhJdGVyYXRvcklzRG9uZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgcmV0dXJuIChpdC0+Y291bnRfZG93bl8gPD0gMCk7Cit9CisKIHZvaWQgVlA4SXRlcmF0b3JJbml0KFZQOEVuY29kZXIqIGNvbnN0IGVuYywgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CiAgIGl0LT5lbmNfID0gZW5jOwotICBpdC0+eV9zdHJpZGVfICA9IGVuYy0+cGljXy0+eV9zdHJpZGU7Ci0gIGl0LT51dl9zdHJpZGVfID0gZW5jLT5waWNfLT51dl9zdHJpZGU7Ci0gIC8vIFRPRE8obGF0ZXIpOiBmb3IgbXVsdGl0aHJlYWRpbmcsIHRoZXNlIHNob3VsZCBiZSBvd25lZCBieSAnaXQnLgotICBpdC0+eXV2X2luXyAgID0gZW5jLT55dXZfaW5fOwotICBpdC0+eXV2X291dF8gID0gZW5jLT55dXZfb3V0XzsKLSAgaXQtPnl1dl9vdXQyXyA9IGVuYy0+eXV2X291dDJfOwotICBpdC0+eXV2X3BfICAgID0gZW5jLT55dXZfcF87CisgIGl0LT55dXZfaW5fICAgPSAodWludDhfdCopV0VCUF9BTElHTihpdC0+eXV2X21lbV8pOworICBpdC0+eXV2X291dF8gID0gaXQtPnl1dl9pbl8gKyBZVVZfU0laRV9FTkM7CisgIGl0LT55dXZfb3V0Ml8gPSBpdC0+eXV2X291dF8gKyBZVVZfU0laRV9FTkM7CisgIGl0LT55dXZfcF8gICAgPSBpdC0+eXV2X291dDJfICsgWVVWX1NJWkVfRU5DOwogICBpdC0+bGZfc3RhdHNfID0gZW5jLT5sZl9zdGF0c187CiAgIGl0LT5wZXJjZW50MF8gPSBlbmMtPnBlcmNlbnRfOworICBpdC0+eV9sZWZ0XyA9ICh1aW50OF90KilXRUJQX0FMSUdOKGl0LT55dXZfbGVmdF9tZW1fICsgMSk7CisgIGl0LT51X2xlZnRfID0gaXQtPnlfbGVmdF8gKyAxNiArIDE2OworICBpdC0+dl9sZWZ0XyA9IGl0LT51X2xlZnRfICsgMTY7CisgIGl0LT50b3BfZGVycl8gPSBlbmMtPnRvcF9kZXJyXzsKICAgVlA4SXRlcmF0b3JSZXNldChpdCk7CiB9CiAKIGludCBWUDhJdGVyYXRvclByb2dyZXNzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IGRlbHRhKSB7CiAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpZiAoZGVsdGEgJiYgZW5jLT5waWNfLT5wcm9ncmVzc19ob29rKSB7Ci0gICAgY29uc3QgaW50IHBlcmNlbnQgPSAoZW5jLT5tYl9oXyA8PSAxKQorICBpZiAoZGVsdGEgJiYgZW5jLT5waWNfLT5wcm9ncmVzc19ob29rICE9IE5VTEwpIHsKKyAgICBjb25zdCBpbnQgZG9uZSA9IGl0LT5jb3VudF9kb3duMF8gLSBpdC0+Y291bnRfZG93bl87CisgICAgY29uc3QgaW50IHBlcmNlbnQgPSAoaXQtPmNvdW50X2Rvd24wXyA8PSAwKQogICAgICAgICAgICAgICAgICAgICAgID8gaXQtPnBlcmNlbnQwXwotICAgICAgICAgICAgICAgICAgICAgIDogaXQtPnBlcmNlbnQwXyArIGRlbHRhICogaXQtPnlfIC8gKGVuYy0+bWJfaF8gLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICA6IGl0LT5wZXJjZW50MF8gKyBkZWx0YSAqIGRvbmUgLyBpdC0+Y291bnRfZG93bjBfOwogICAgIHJldHVybiBXZWJQUmVwb3J0UHJvZ3Jlc3MoZW5jLT5waWNfLCBwZXJjZW50LCAmZW5jLT5wZXJjZW50Xyk7CiAgIH0KICAgcmV0dXJuIDE7CkBAIC05MCw0NyArMTA2LDc0IEBACiAvLyBJbXBvcnQgdGhlIHNvdXJjZSBzYW1wbGVzIGludG8gdGhlIGNhY2hlLiBUYWtlcyBjYXJlIG9mIHJlcGxpY2F0aW5nCiAvLyBib3VuZGFyeSBwaXhlbHMgaWYgbmVjZXNzYXJ5LgogCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE1pblNpemUoaW50IGEsIGludCBiKSB7IHJldHVybiAoYSA8IGIpID8gYSA6IGI7IH0KKwogc3RhdGljIHZvaWQgSW1wb3J0QmxvY2soY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IHcsIGludCBoLCBpbnQgc2l6ZSkgewogICBpbnQgaTsKICAgZm9yIChpID0gMDsgaSA8IGg7ICsraSkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIHNyYywgdyk7CisgICAgbWVtY3B5KGRzdCwgc3JjLCB3KTsKICAgICBpZiAodyA8IHNpemUpIHsKLSAgICAgIFNiTWVtb3J5U2V0KGRzdCArIHcsIGRzdFt3IC0gMV0sIHNpemUgLSB3KTsKKyAgICAgIG1lbXNldChkc3QgKyB3LCBkc3RbdyAtIDFdLCBzaXplIC0gdyk7CiAgICAgfQogICAgIGRzdCArPSBCUFM7CiAgICAgc3JjICs9IHNyY19zdHJpZGU7CiAgIH0KICAgZm9yIChpID0gaDsgaSA8IHNpemU7ICsraSkgewotICAgIFNiTWVtb3J5Q29weShkc3QsIGRzdCAtIEJQUywgc2l6ZSk7CisgICAgbWVtY3B5KGRzdCwgZHN0IC0gQlBTLCBzaXplKTsKICAgICBkc3QgKz0gQlBTOwogICB9CiB9CiAKLXZvaWQgVlA4SXRlcmF0b3JJbXBvcnQoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CitzdGF0aWMgdm9pZCBJbXBvcnRMaW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGxlbiwgaW50IHRvdGFsX2xlbikgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpLCBzcmMgKz0gc3JjX3N0cmlkZSkgZHN0W2ldID0gKnNyYzsKKyAgZm9yICg7IGkgPCB0b3RhbF9sZW47ICsraSkgZHN0W2ldID0gZHN0W2xlbiAtIDFdOworfQorCit2b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgdWludDhfdCogdG1wXzMyKSB7CiAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwogICBjb25zdCBpbnQgeCA9IGl0LT54XywgeSA9IGl0LT55XzsKICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKLSAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IHBpYy0+eSArICh5ICogcGljLT55X3N0cmlkZSArIHgpICogMTY7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBwaWMtPnkgKyAoeSAqIHBpYy0+eV9zdHJpZGUgICsgeCkgKiAxNjsKICAgY29uc3QgdWludDhfdCogY29uc3QgdXNyYyA9IHBpYy0+dSArICh5ICogcGljLT51dl9zdHJpZGUgKyB4KSAqIDg7CiAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHZzcmMgPSBwaWMtPnYgKyAoeSAqIHBpYy0+dXZfc3RyaWRlICsgeCkgKiA4OwotICB1aW50OF90KiBjb25zdCB5ZHN0ID0gaXQtPnl1dl9pbl8gKyBZX09GRjsKLSAgdWludDhfdCogY29uc3QgdWRzdCA9IGl0LT55dXZfaW5fICsgVV9PRkY7Ci0gIHVpbnQ4X3QqIGNvbnN0IHZkc3QgPSBpdC0+eXV2X2luXyArIFZfT0ZGOwotICBpbnQgdyA9IChwaWMtPndpZHRoIC0geCAqIDE2KTsKLSAgaW50IGggPSAocGljLT5oZWlnaHQgLSB5ICogMTYpOworICBjb25zdCBpbnQgdyA9IE1pblNpemUocGljLT53aWR0aCAtIHggKiAxNiwgMTYpOworICBjb25zdCBpbnQgaCA9IE1pblNpemUocGljLT5oZWlnaHQgLSB5ICogMTYsIDE2KTsKKyAgY29uc3QgaW50IHV2X3cgPSAodyArIDEpID4+IDE7CisgIGNvbnN0IGludCB1dl9oID0gKGggKyAxKSA+PiAxOwogCi0gIGlmICh3ID4gMTYpIHcgPSAxNjsKLSAgaWYgKGggPiAxNikgaCA9IDE2OworICBJbXBvcnRCbG9jayh5c3JjLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnl1dl9pbl8gKyBZX09GRl9FTkMsIHcsIGgsIDE2KTsKKyAgSW1wb3J0QmxvY2sodXNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVV9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKKyAgSW1wb3J0QmxvY2sodnNyYywgcGljLT51dl9zdHJpZGUsIGl0LT55dXZfaW5fICsgVl9PRkZfRU5DLCB1dl93LCB1dl9oLCA4KTsKIAotICAvLyBMdW1hIHBsYW5lCi0gIEltcG9ydEJsb2NrKHlzcmMsIHBpYy0+eV9zdHJpZGUsIHlkc3QsIHcsIGgsIDE2KTsKKyAgaWYgKHRtcF8zMiA9PSBOVUxMKSByZXR1cm47CiAKLSAgeyAgIC8vIFUvViBwbGFuZXMKLSAgICBjb25zdCBpbnQgdXZfdyA9ICh3ICsgMSkgPj4gMTsKLSAgICBjb25zdCBpbnQgdXZfaCA9IChoICsgMSkgPj4gMTsKLSAgICBJbXBvcnRCbG9jayh1c3JjLCBwaWMtPnV2X3N0cmlkZSwgdWRzdCwgdXZfdywgdXZfaCwgOCk7Ci0gICAgSW1wb3J0QmxvY2sodnNyYywgcGljLT51dl9zdHJpZGUsIHZkc3QsIHV2X3csIHV2X2gsIDgpOworICAvLyBJbXBvcnQgc291cmNlICh1bmNvbXByZXNzZWQpIHNhbXBsZXMgaW50byBib3VuZGFyeS4KKyAgaWYgKHggPT0gMCkgeworICAgIEluaXRMZWZ0KGl0KTsKKyAgfSBlbHNlIHsKKyAgICBpZiAoeSA9PSAwKSB7CisgICAgICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dl9sZWZ0X1stMV0gPSAxMjc7CisgICAgfSBlbHNlIHsKKyAgICAgIGl0LT55X2xlZnRfWy0xXSA9IHlzcmNbLSAxIC0gcGljLT55X3N0cmlkZV07CisgICAgICBpdC0+dV9sZWZ0X1stMV0gPSB1c3JjWy0gMSAtIHBpYy0+dXZfc3RyaWRlXTsKKyAgICAgIGl0LT52X2xlZnRfWy0xXSA9IHZzcmNbLSAxIC0gcGljLT51dl9zdHJpZGVdOworICAgIH0KKyAgICBJbXBvcnRMaW5lKHlzcmMgLSAxLCBwaWMtPnlfc3RyaWRlLCAgaXQtPnlfbGVmdF8sIGgsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIDEsIHBpYy0+dXZfc3RyaWRlLCBpdC0+dV9sZWZ0XywgdXZfaCwgOCk7CisgICAgSW1wb3J0TGluZSh2c3JjIC0gMSwgcGljLT51dl9zdHJpZGUsIGl0LT52X2xlZnRfLCB1dl9oLCA4KTsKKyAgfQorCisgIGl0LT55X3RvcF8gID0gdG1wXzMyICsgMDsKKyAgaXQtPnV2X3RvcF8gPSB0bXBfMzIgKyAxNjsKKyAgaWYgKHkgPT0gMCkgeworICAgIG1lbXNldCh0bXBfMzIsIDEyNywgMzIgKiBzaXplb2YoKnRtcF8zMikpOworICB9IGVsc2UgeworICAgIEltcG9ydExpbmUoeXNyYyAtIHBpYy0+eV9zdHJpZGUsICAxLCB0bXBfMzIsICAgICAgICAgIHcsICAgMTYpOworICAgIEltcG9ydExpbmUodXNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiwgICAgIHV2X3csIDgpOworICAgIEltcG9ydExpbmUodnNyYyAtIHBpYy0+dXZfc3RyaWRlLCAxLCB0bXBfMzIgKyAxNiArIDgsIHV2X3csIDgpOwogICB9CiB9CiAKQEAgLTE0MCw3ICsxODMsNyBAQAogc3RhdGljIHZvaWQgRXhwb3J0QmxvY2soY29uc3QgdWludDhfdCogc3JjLCB1aW50OF90KiBkc3QsIGludCBkc3Rfc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CiAgIHdoaWxlIChoLS0gPiAwKSB7Ci0gICAgU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCB3KTsKKyAgICBtZW1jcHkoZHN0LCBzcmMsIHcpOwogICAgIGRzdCArPSBkc3Rfc3RyaWRlOwogICAgIHNyYyArPSBCUFM7CiAgIH0KQEAgLTE1MCw5ICsxOTMsOSBAQAogICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKICAgaWYgKGVuYy0+Y29uZmlnXy0+c2hvd19jb21wcmVzc2VkKSB7CiAgICAgY29uc3QgaW50IHggPSBpdC0+eF8sIHkgPSBpdC0+eV87Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGl0LT55dXZfb3V0XyArIFlfT0ZGOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHVzcmMgPSBpdC0+eXV2X291dF8gKyBVX09GRjsKLSAgICBjb25zdCB1aW50OF90KiBjb25zdCB2c3JjID0gaXQtPnl1dl9vdXRfICsgVl9PRkY7CisgICAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCB1c3JjID0gaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DOworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHZzcmMgPSBpdC0+eXV2X291dF8gKyBWX09GRl9FTkM7CiAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYyA9IGVuYy0+cGljXzsKICAgICB1aW50OF90KiBjb25zdCB5ZHN0ID0gcGljLT55ICsgKHkgKiBwaWMtPnlfc3RyaWRlICsgeCkgKiAxNjsKICAgICB1aW50OF90KiBjb25zdCB1ZHN0ID0gcGljLT51ICsgKHkgKiBwaWMtPnV2X3N0cmlkZSArIHgpICogODsKQEAgLTI0Niw0OCArMjg5LDQ0IEBACiAjdW5kZWYgQklUCiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBZHZhbmNlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLCBkb2luZyB0aGUgYm9va2VlcGluZy4KKy8vIEFkdmFuY2UgdG8gdGhlIG5leHQgcG9zaXRpb24sIGRvaW5nIHRoZSBib29ra2VlcGluZy4KIAotaW50IFZQOEl0ZXJhdG9yTmV4dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJsb2NrX3RvX3NhdmUpIHsKK3ZvaWQgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CiAgIFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOwotICBpZiAoYmxvY2tfdG9fc2F2ZSkgewotICAgIGNvbnN0IGludCB4ID0gaXQtPnhfLCB5ID0gaXQtPnlfOwotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHlzcmMgPSBibG9ja190b19zYXZlICsgWV9PRkY7Ci0gICAgY29uc3QgdWludDhfdCogY29uc3QgdXNyYyA9IGJsb2NrX3RvX3NhdmUgKyBVX09GRjsKLSAgICBpZiAoeCA8IGVuYy0+bWJfd18gLSAxKSB7ICAgLy8gbGVmdAotICAgICAgaW50IGk7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgICBlbmMtPnlfbGVmdF9baV0gPSB5c3JjWzE1ICsgaSAqIEJQU107Ci0gICAgICB9Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSB7Ci0gICAgICAgIGVuYy0+dV9sZWZ0X1tpXSA9IHVzcmNbNyArIGkgKiBCUFNdOwotICAgICAgICBlbmMtPnZfbGVmdF9baV0gPSB1c3JjWzE1ICsgaSAqIEJQU107Ci0gICAgICB9Ci0gICAgICAvLyB0b3AtbGVmdCAoYmVmb3JlICd0b3AnISkKLSAgICAgIGVuYy0+eV9sZWZ0X1stMV0gPSBlbmMtPnlfdG9wX1t4ICogMTYgKyAxNV07Ci0gICAgICBlbmMtPnVfbGVmdF9bLTFdID0gZW5jLT51dl90b3BfW3ggKiAxNiArIDAgKyA3XTsKLSAgICAgIGVuYy0+dl9sZWZ0X1stMV0gPSBlbmMtPnV2X3RvcF9beCAqIDE2ICsgOCArIDddOworICBjb25zdCBpbnQgeCA9IGl0LT54XywgeSA9IGl0LT55XzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeXNyYyA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZzcmMgPSBpdC0+eXV2X291dF8gKyBVX09GRl9FTkM7CisgIGlmICh4IDwgZW5jLT5tYl93XyAtIDEpIHsgICAvLyBsZWZ0CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIGl0LT55X2xlZnRfW2ldID0geXNyY1sxNSArIGkgKiBCUFNdOwogICAgIH0KLSAgICBpZiAoeSA8IGVuYy0+bWJfaF8gLSAxKSB7ICAvLyB0b3AKLSAgICAgIFNiTWVtb3J5Q29weShlbmMtPnlfdG9wXyArIHggKiAxNiwgeXNyYyArIDE1ICogQlBTLCAxNik7Ci0gICAgICBTYk1lbW9yeUNvcHkoZW5jLT51dl90b3BfICsgeCAqIDE2LCB1c3JjICsgNyAqIEJQUywgOCArIDgpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgIGl0LT51X2xlZnRfW2ldID0gdXZzcmNbNyArIGkgKiBCUFNdOworICAgICAgaXQtPnZfbGVmdF9baV0gPSB1dnNyY1sxNSArIGkgKiBCUFNdOwogICAgIH0KKyAgICAvLyB0b3AtbGVmdCAoYmVmb3JlICd0b3AnISkKKyAgICBpdC0+eV9sZWZ0X1stMV0gPSBpdC0+eV90b3BfWzE1XTsKKyAgICBpdC0+dV9sZWZ0X1stMV0gPSBpdC0+dXZfdG9wX1swICsgN107CisgICAgaXQtPnZfbGVmdF9bLTFdID0gaXQtPnV2X3RvcF9bOCArIDddOwogICB9CisgIGlmICh5IDwgZW5jLT5tYl9oXyAtIDEpIHsgIC8vIHRvcAorICAgIG1lbWNweShpdC0+eV90b3BfLCB5c3JjICsgMTUgKiBCUFMsIDE2KTsKKyAgICBtZW1jcHkoaXQtPnV2X3RvcF8sIHV2c3JjICsgNyAqIEJQUywgOCArIDgpOworICB9Cit9CiAKLSAgaXQtPm1iXysrOwotICBpdC0+cHJlZHNfICs9IDQ7Ci0gIGl0LT5uel8rKzsKLSAgaXQtPnhfKys7Ci0gIGlmIChpdC0+eF8gPT0gZW5jLT5tYl93XykgewotICAgIGl0LT54XyA9IDA7Ci0gICAgaXQtPnlfKys7Ci0gICAgaXQtPmJ3XyA9ICZlbmMtPnBhcnRzX1tpdC0+eV8gJiAoZW5jLT5udW1fcGFydHNfIC0gMSldOwotICAgIGl0LT5wcmVkc18gPSBlbmMtPnByZWRzXyArIGl0LT55XyAqIDQgKiBlbmMtPnByZWRzX3dfOwotICAgIGl0LT5uel8gPSBlbmMtPm56XzsKLSAgICBJbml0TGVmdChpdCk7CitpbnQgVlA4SXRlcmF0b3JOZXh0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBpZiAoKytpdC0+eF8gPT0gaXQtPmVuY18tPm1iX3dfKSB7CisgICAgVlA4SXRlcmF0b3JTZXRSb3coaXQsICsraXQtPnlfKTsKKyAgfSBlbHNlIHsKKyAgICBpdC0+cHJlZHNfICs9IDQ7CisgICAgaXQtPm1iXyArPSAxOworICAgIGl0LT5uel8gKz0gMTsKKyAgICBpdC0+eV90b3BfICs9IDE2OworICAgIGl0LT51dl90b3BfICs9IDE2OwogICB9Ci0gIHJldHVybiAoMCA8IC0taXQtPmRvbmVfKTsKKyAgcmV0dXJuICgwIDwgLS1pdC0+Y291bnRfZG93bl8pOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjk3LDcgKzMzNiw3IEBACiAgIHVpbnQ4X3QqIHByZWRzID0gaXQtPnByZWRzXzsKICAgaW50IHk7CiAgIGZvciAoeSA9IDA7IHkgPCA0OyArK3kpIHsKLSAgICBTYk1lbW9yeVNldChwcmVkcywgbW9kZSwgNCk7CisgICAgbWVtc2V0KHByZWRzLCBtb2RlLCA0KTsKICAgICBwcmVkcyArPSBpdC0+ZW5jXy0+cHJlZHNfd187CiAgIH0KICAgaXQtPm1iXy0+dHlwZV8gPSAxOwpAQCAtMzA3LDcgKzM0Niw3IEBACiAgIHVpbnQ4X3QqIHByZWRzID0gaXQtPnByZWRzXzsKICAgaW50IHk7CiAgIGZvciAoeSA9IDQ7IHkgPiAwOyAtLXkpIHsKLSAgICBTYk1lbW9yeUNvcHkocHJlZHMsIG1vZGVzLCA0ICogc2l6ZW9mKCptb2RlcykpOworICAgIG1lbWNweShwcmVkcywgbW9kZXMsIDQgKiBzaXplb2YoKm1vZGVzKSk7CiAgICAgcHJlZHMgKz0gaXQtPmVuY18tPnByZWRzX3dfOwogICAgIG1vZGVzICs9IDQ7CiAgIH0KQEAgLTM3NCwxNSArNDEzLDE1IEBACiAKICAgLy8gSW1wb3J0IHRoZSBib3VuZGFyeSBzYW1wbGVzCiAgIGZvciAoaSA9IDA7IGkgPCAxNzsgKytpKSB7ICAgIC8vIGxlZnQKLSAgICBpdC0+aTRfYm91bmRhcnlfW2ldID0gZW5jLT55X2xlZnRfWzE1IC0gaV07CisgICAgaXQtPmk0X2JvdW5kYXJ5X1tpXSA9IGl0LT55X2xlZnRfWzE1IC0gaV07CiAgIH0KICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHsgICAgLy8gdG9wCi0gICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gZW5jLT55X3RvcF9baXQtPnhfICogMTYgKyBpXTsKKyAgICBpdC0+aTRfYm91bmRhcnlfWzE3ICsgaV0gPSBpdC0+eV90b3BfW2ldOwogICB9CiAgIC8vIHRvcC1yaWdodCBzYW1wbGVzIGhhdmUgYSBzcGVjaWFsIGNhc2Ugb24gdGhlIGZhciByaWdodCBvZiB0aGUgcGljdHVyZQogICBpZiAoaXQtPnhfIDwgZW5jLT5tYl93XyAtIDEpIHsKICAgICBmb3IgKGkgPSAxNjsgaSA8IDE2ICsgNDsgKytpKSB7Ci0gICAgICBpdC0+aTRfYm91bmRhcnlfWzE3ICsgaV0gPSBlbmMtPnlfdG9wX1tpdC0+eF8gKiAxNiArIGldOworICAgICAgaXQtPmk0X2JvdW5kYXJ5X1sxNyArIGldID0gaXQtPnlfdG9wX1tpXTsKICAgICB9CiAgIH0gZWxzZSB7ICAgIC8vIGVsc2UsIHJlcGxpY2F0ZSB0aGUgbGFzdCB2YWxpZCBwaXhlbCBmb3VyIHRpbWVzCiAgICAgZm9yIChpID0gMTY7IGkgPCAxNiArIDQ7ICsraSkgewpAQCAtNDIyLDcgKzQ2MSwzIEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9uZWFyX2xvc3NsZXNzX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NDk0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL25lYXJfbG9zc2xlc3NfZW5jLmMKQEAgLTAsMCArMSwxNTYgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBOZWFyLWxvc3NsZXNzIGltYWdlIHByZXByb2Nlc3NpbmcgYWRqdXN0cyBwaXhlbCB2YWx1ZXMgdG8gaGVscAorLy8gY29tcHJlc3NpYmlsaXR5IHdpdGggYSBndWFyYW50ZWUgb2YgbWF4aW11bSBkZXZpYXRpb24gYmV0d2VlbiBvcmlnaW5hbCBhbmQKKy8vIHJlc3VsdGluZyBwaXhlbCB2YWx1ZXMuCisvLworLy8gQXV0aG9yOiBKeXJraSBBbGFrdWlqYWxhIChqeXJraUBnb29nbGUuY29tKQorLy8gQ29udmVydGVkIHRvIEMgYnkgQWxla3NhbmRlciBLcmFtYXJ6IChha3JhbWFyekBnb29nbGUuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzc19jb21tb24uaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGxpX2VuYy5oIgorCisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorCisjZGVmaW5lIE1JTl9ESU1fRk9SX05FQVJfTE9TU0xFU1MgNjQKKyNkZWZpbmUgTUFYX0xJTUlUX0JJVFMgICAgICAgICAgICAgNQorCisvLyBRdWFudGl6ZXMgdGhlIHZhbHVlIHVwIG9yIGRvd24gdG8gYSBtdWx0aXBsZSBvZiAxPDxiaXRzIChvciB0byAyNTUpLAorLy8gY2hvb3NpbmcgdGhlIGNsb3NlciBvbmUsIHJlc29sdmluZyB0aWVzIHVzaW5nIGJhbmtlcnMnIHJvdW5kaW5nLgorc3RhdGljIHVpbnQzMl90IEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQodWludDMyX3QgYSwgaW50IGJpdHMpIHsKKyAgY29uc3QgdWludDMyX3QgbWFzayA9ICgxdSA8PCBiaXRzKSAtIDE7CisgIGNvbnN0IHVpbnQzMl90IGJpYXNlZCA9IGEgKyAobWFzayA+PiAxKSArICgoYSA+PiBiaXRzKSAmIDEpOworICBhc3NlcnQoYml0cyA+IDApOworICBpZiAoYmlhc2VkID4gMHhmZikgcmV0dXJuIDB4ZmY7CisgIHJldHVybiBiaWFzZWQgJiB+bWFzazsKK30KKworLy8gQXBwbGllcyBGaW5kQ2xvc2VzdERpc2NyZXRpemVkIHRvIGFsbCBjaGFubmVscyBvZiBwaXhlbC4KK3N0YXRpYyB1aW50MzJfdCBDbG9zZXN0RGlzY3JldGl6ZWRBcmdiKHVpbnQzMl90IGEsIGludCBiaXRzKSB7CisgIHJldHVybgorICAgICAgKEZpbmRDbG9zZXN0RGlzY3JldGl6ZWQoYSA+PiAyNCwgYml0cykgPDwgMjQpIHwKKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKChhID4+IDE2KSAmIDB4ZmYsIGJpdHMpIDw8IDE2KSB8CisgICAgICAoRmluZENsb3Nlc3REaXNjcmV0aXplZCgoYSA+PiA4KSAmIDB4ZmYsIGJpdHMpIDw8IDgpIHwKKyAgICAgIChGaW5kQ2xvc2VzdERpc2NyZXRpemVkKGEgJiAweGZmLCBiaXRzKSk7Cit9CisKKy8vIENoZWNrcyBpZiBkaXN0YW5jZSBiZXR3ZWVuIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB2YWx1ZXMgb2YgcGl4ZWxzIGEgYW5kIGIKKy8vIGlzIHdpdGhpbiB0aGUgZ2l2ZW4gbGltaXQuCitzdGF0aWMgaW50IElzTmVhcih1aW50MzJfdCBhLCB1aW50MzJfdCBiLCBpbnQgbGltaXQpIHsKKyAgaW50IGs7CisgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPQorICAgICAgICAoaW50KSgoYSA+PiAoayAqIDgpKSAmIDB4ZmYpIC0gKGludCkoKGIgPj4gKGsgKiA4KSkgJiAweGZmKTsKKyAgICBpZiAoZGVsdGEgPj0gbGltaXQgfHwgZGVsdGEgPD0gLWxpbWl0KSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgSXNTbW9vdGgoY29uc3QgdWludDMyX3QqIGNvbnN0IHByZXZfcm93LAorICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgY3Vycl9yb3csCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBuZXh0X3JvdywKKyAgICAgICAgICAgICAgICAgICAgaW50IGl4LCBpbnQgbGltaXQpIHsKKyAgLy8gQ2hlY2sgdGhhdCBhbGwgcGl4ZWxzIGluIDQtY29ubmVjdGVkIG5laWdoYm9yaG9vZCBhcmUgc21vb3RoLgorICByZXR1cm4gKElzTmVhcihjdXJyX3Jvd1tpeF0sIGN1cnJfcm93W2l4IC0gMV0sIGxpbWl0KSAmJgorICAgICAgICAgIElzTmVhcihjdXJyX3Jvd1tpeF0sIGN1cnJfcm93W2l4ICsgMV0sIGxpbWl0KSAmJgorICAgICAgICAgIElzTmVhcihjdXJyX3Jvd1tpeF0sIHByZXZfcm93W2l4XSwgbGltaXQpICYmCisgICAgICAgICAgSXNOZWFyKGN1cnJfcm93W2l4XSwgbmV4dF9yb3dbaXhdLCBsaW1pdCkpOworfQorCisvLyBBZGp1c3RzIHBpeGVsIHZhbHVlcyBvZiBpbWFnZSB3aXRoIGdpdmVuIG1heGltdW0gZXJyb3IuCitzdGF0aWMgdm9pZCBOZWFyTG9zc2xlc3MoaW50IHhzaXplLCBpbnQgeXNpemUsIGNvbnN0IHVpbnQzMl90KiBhcmdiX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCBpbnQgbGltaXRfYml0cywgdWludDMyX3QqIGNvcHlfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiX2RzdCkgeworICBpbnQgeCwgeTsKKyAgY29uc3QgaW50IGxpbWl0ID0gMSA8PCBsaW1pdF9iaXRzOworICB1aW50MzJfdCogcHJldl9yb3cgPSBjb3B5X2J1ZmZlcjsKKyAgdWludDMyX3QqIGN1cnJfcm93ID0gcHJldl9yb3cgKyB4c2l6ZTsKKyAgdWludDMyX3QqIG5leHRfcm93ID0gY3Vycl9yb3cgKyB4c2l6ZTsKKyAgbWVtY3B5KGN1cnJfcm93LCBhcmdiX3NyYywgeHNpemUgKiBzaXplb2YoYXJnYl9zcmNbMF0pKTsKKyAgbWVtY3B5KG5leHRfcm93LCBhcmdiX3NyYyArIHN0cmlkZSwgeHNpemUgKiBzaXplb2YoYXJnYl9zcmNbMF0pKTsKKworICBmb3IgKHkgPSAwOyB5IDwgeXNpemU7ICsreSwgYXJnYl9zcmMgKz0gc3RyaWRlLCBhcmdiX2RzdCArPSB4c2l6ZSkgeworICAgIGlmICh5ID09IDAgfHwgeSA9PSB5c2l6ZSAtIDEpIHsKKyAgICAgIG1lbWNweShhcmdiX2RzdCwgYXJnYl9zcmMsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIG1lbWNweShuZXh0X3JvdywgYXJnYl9zcmMgKyBzdHJpZGUsIHhzaXplICogc2l6ZW9mKGFyZ2Jfc3JjWzBdKSk7CisgICAgICBhcmdiX2RzdFswXSA9IGFyZ2Jfc3JjWzBdOworICAgICAgYXJnYl9kc3RbeHNpemUgLSAxXSA9IGFyZ2Jfc3JjW3hzaXplIC0gMV07CisgICAgICBmb3IgKHggPSAxOyB4IDwgeHNpemUgLSAxOyArK3gpIHsKKyAgICAgICAgaWYgKElzU21vb3RoKHByZXZfcm93LCBjdXJyX3JvdywgbmV4dF9yb3csIHgsIGxpbWl0KSkgeworICAgICAgICAgIGFyZ2JfZHN0W3hdID0gY3Vycl9yb3dbeF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYXJnYl9kc3RbeF0gPSBDbG9zZXN0RGlzY3JldGl6ZWRBcmdiKGN1cnJfcm93W3hdLCBsaW1pdF9iaXRzKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAvLyBUaHJlZS13YXkgc3dhcC4KKyAgICAgIHVpbnQzMl90KiBjb25zdCB0ZW1wID0gcHJldl9yb3c7CisgICAgICBwcmV2X3JvdyA9IGN1cnJfcm93OworICAgICAgY3Vycl9yb3cgPSBuZXh0X3JvdzsKKyAgICAgIG5leHRfcm93ID0gdGVtcDsKKyAgICB9CisgIH0KK30KKworaW50IFZQOEFwcGx5TmVhckxvc3NsZXNzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlLCBpbnQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9kc3QpIHsKKyAgaW50IGk7CisgIGNvbnN0IGludCB4c2l6ZSA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgeXNpemUgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIGNvbnN0IGludCBzdHJpZGUgPSBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgdWludDMyX3QqIGNvbnN0IGNvcHlfYnVmZmVyID0KKyAgICAgICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MoeHNpemUgKiAzLCBzaXplb2YoKmNvcHlfYnVmZmVyKSk7CisgIGNvbnN0IGludCBsaW1pdF9iaXRzID0gVlA4TE5lYXJMb3NzbGVzc0JpdHMocXVhbGl0eSk7CisgIGFzc2VydChhcmdiX2RzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KGxpbWl0X2JpdHMgPiAwKTsKKyAgYXNzZXJ0KGxpbWl0X2JpdHMgPD0gTUFYX0xJTUlUX0JJVFMpOworICBpZiAoY29weV9idWZmZXIgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIC8vIEZvciBzbWFsbCBpY29uIGltYWdlcywgZG9uJ3QgYXR0ZW1wdCB0byBhcHBseSBuZWFyLWxvc3NsZXNzIGNvbXByZXNzaW9uLgorICBpZiAoKHhzaXplIDwgTUlOX0RJTV9GT1JfTkVBUl9MT1NTTEVTUyAmJgorICAgICAgIHlzaXplIDwgTUlOX0RJTV9GT1JfTkVBUl9MT1NTTEVTUykgfHwKKyAgICAgIHlzaXplIDwgMykgeworICAgIGZvciAoaSA9IDA7IGkgPCB5c2l6ZTsgKytpKSB7CisgICAgICBtZW1jcHkoYXJnYl9kc3QgKyBpICogeHNpemUsIHBpY3R1cmUtPmFyZ2IgKyBpICogcGljdHVyZS0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgeHNpemUgKiBzaXplb2YoKmFyZ2JfZHN0KSk7CisgICAgfQorICAgIFdlYlBTYWZlRnJlZShjb3B5X2J1ZmZlcik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBOZWFyTG9zc2xlc3MoeHNpemUsIHlzaXplLCBwaWN0dXJlLT5hcmdiLCBzdHJpZGUsIGxpbWl0X2JpdHMsIGNvcHlfYnVmZmVyLAorICAgICAgICAgICAgICAgYXJnYl9kc3QpOworICBmb3IgKGkgPSBsaW1pdF9iaXRzIC0gMTsgaSAhPSAwOyAtLWkpIHsKKyAgICBOZWFyTG9zc2xlc3MoeHNpemUsIHlzaXplLCBhcmdiX2RzdCwgeHNpemUsIGksIGNvcHlfYnVmZmVyLCBhcmdiX2RzdCk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGNvcHlfYnVmZmVyKTsKKyAgcmV0dXJuIDE7Cit9CisjZWxzZSAgLy8gKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorCisvLyBEZWZpbmUgYSBzdHViIHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmdzLgorZXh0ZXJuIHZvaWQgVlA4TE5lYXJMb3NzbGVzc1N0dWIodm9pZCk7Cit2b2lkIFZQOExOZWFyTG9zc2xlc3NTdHViKHZvaWQpIHt9CisKKyNlbmRpZiAgLy8gKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX2NzcF9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFhNDYxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9jc3BfZW5jLmMKQEAgLTAsMCArMSwxMjEyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdXRpbHMgZm9yIGNvbG9yc3BhY2UgY29udmVyc2lvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yYW5kb21fdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCisvLyBVbmNvbW1lbnQgdG8gZGlzYWJsZSBnYW1tYS1jb21wcmVzc2lvbiBkdXJpbmcgUkdCLT5VL1YgYXZlcmFnaW5nCisjZGVmaW5lIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLyBJZiBkZWZpbmVkLCB1c2UgdGFibGUgdG8gY29tcHV0ZSB4IC8gYWxwaGEuCisjZGVmaW5lIFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFCisKKyNpZmRlZiBXT1JEU19CSUdFTkRJQU4KKyNkZWZpbmUgQUxQSEFfT0ZGU0VUIDAgICAvLyB1aW50MzJfdCAweGZmMDAwMDAwIGlzIDB4ZmYsMDAsMDAsMDAgaW4gbWVtb3J5CisjZWxzZQorI2RlZmluZSBBTFBIQV9PRkZTRVQgMyAgIC8vIHVpbnQzMl90IDB4ZmYwMDAwMDAgaXMgMHgwMCwwMCwwMCxmZiBpbiBtZW1vcnkKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGV0ZWN0aW9uIG9mIG5vbi10cml2aWFsIHRyYW5zcGFyZW5jeQorCisvLyBSZXR1cm5zIHRydWUgaWYgYWxwaGFbXSBoYXMgbm9uLTB4ZmYgdmFsdWVzLgorc3RhdGljIGludCBDaGVja05vbk9wYXF1ZShjb25zdCB1aW50OF90KiBhbHBoYSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zdGVwLCBpbnQgeV9zdGVwKSB7CisgIGlmIChhbHBoYSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgV2ViUEluaXRBbHBoYVByb2Nlc3NpbmcoKTsKKyAgaWYgKHhfc3RlcCA9PSAxKSB7CisgICAgZm9yICg7IGhlaWdodC0tID4gMDsgYWxwaGEgKz0geV9zdGVwKSB7CisgICAgICBpZiAoV2ViUEhhc0FscGhhOGIoYWxwaGEsIHdpZHRoKSkgcmV0dXJuIDE7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoOyBoZWlnaHQtLSA+IDA7IGFscGhhICs9IHlfc3RlcCkgeworICAgICAgaWYgKFdlYlBIYXNBbHBoYTMyYihhbHBoYSwgd2lkdGgpKSByZXR1cm4gMTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIENoZWNraW5nIGZvciB0aGUgcHJlc2VuY2Ugb2Ygbm9uLW9wYXF1ZSBhbHBoYS4KK2ludCBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFwaWN0dXJlLT51c2VfYXJnYikgeworICAgIHJldHVybiBDaGVja05vbk9wYXF1ZShwaWN0dXJlLT5hLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAxLCBwaWN0dXJlLT5hX3N0cmlkZSk7CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IGFscGhhX29mZnNldCA9IEFMUEhBX09GRlNFVDsKKyAgICByZXR1cm4gQ2hlY2tOb25PcGFxdWUoKGNvbnN0IHVpbnQ4X3QqKXBpY3R1cmUtPmFyZ2IgKyBhbHBoYV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUtPndpZHRoLCBwaWN0dXJlLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDQsIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlICogc2l6ZW9mKCpwaWN0dXJlLT5hcmdiKSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBnYW1tYSBjb3JyZWN0aW9uCisKKyNpZiBkZWZpbmVkKFVTRV9HQU1NQV9DT01QUkVTU0lPTikKKworLy8gZ2FtbWEtY29tcGVuc2F0ZXMgbG9zcyBvZiByZXNvbHV0aW9uIGR1cmluZyBjaHJvbWEgc3Vic2FtcGxpbmcKKyNkZWZpbmUga0dhbW1hIDAuODAgICAgICAvLyBmb3Igbm93IHdlIHVzZSBhIGRpZmZlcmVudCBnYW1tYSB2YWx1ZSB0aGFuIGtHYW1tYUYKKyNkZWZpbmUga0dhbW1hRml4IDEyICAgICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIGxpbmVhciB2YWx1ZXMKKyNkZWZpbmUga0dhbW1hU2NhbGUgKCgxIDw8IGtHYW1tYUZpeCkgLSAxKQorI2RlZmluZSBrR2FtbWFUYWJGaXggNyAgIC8vIGZpeGVkLXBvaW50IGZyYWN0aW9uYWwgYml0cyBwcmVjaXNpb24KKyNkZWZpbmUga0dhbW1hVGFiU2NhbGUgKDEgPDwga0dhbW1hVGFiRml4KQorI2RlZmluZSBrR2FtbWFUYWJSb3VuZGVyIChrR2FtbWFUYWJTY2FsZSA+PiAxKQorI2RlZmluZSBrR2FtbWFUYWJTaXplICgxIDw8IChrR2FtbWFGaXggLSBrR2FtbWFUYWJGaXgpKQorCitzdGF0aWMgaW50IGtMaW5lYXJUb0dhbW1hVGFiW2tHYW1tYVRhYlNpemUgKyAxXTsKK3N0YXRpYyB1aW50MTZfdCBrR2FtbWFUb0xpbmVhclRhYlsyNTZdOworc3RhdGljIHZvbGF0aWxlIGludCBrR2FtbWFUYWJsZXNPayA9IDA7CisKK3N0YXRpYyBXRUJQX1RTQU5fSUdOT1JFX0ZVTkNUSU9OIHZvaWQgSW5pdEdhbW1hVGFibGVzKHZvaWQpIHsKKyAgaWYgKCFrR2FtbWFUYWJsZXNPaykgeworICAgIGludCB2OworICAgIGNvbnN0IGRvdWJsZSBzY2FsZSA9IChkb3VibGUpKDEgPDwga0dhbW1hVGFiRml4KSAvIGtHYW1tYVNjYWxlOworICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyAyNTUuOworICAgIGZvciAodiA9IDA7IHYgPD0gMjU1OyArK3YpIHsKKyAgICAgIGtHYW1tYVRvTGluZWFyVGFiW3ZdID0KKyAgICAgICAgICAodWludDE2X3QpKHBvdyhub3JtICogdiwga0dhbW1hKSAqIGtHYW1tYVNjYWxlICsgLjUpOworICAgIH0KKyAgICBmb3IgKHYgPSAwOyB2IDw9IGtHYW1tYVRhYlNpemU7ICsrdikgeworICAgICAga0xpbmVhclRvR2FtbWFUYWJbdl0gPSAoaW50KSgyNTUuICogcG93KHNjYWxlICogdiwgMS4gLyBrR2FtbWEpICsgLjUpOworICAgIH0KKyAgICBrR2FtbWFUYWJsZXNPayA9IDE7CisgIH0KK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdhbW1hVG9MaW5lYXIodWludDhfdCB2KSB7CisgIHJldHVybiBrR2FtbWFUb0xpbmVhclRhYlt2XTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBJbnRlcnBvbGF0ZShpbnQgdikgeworICBjb25zdCBpbnQgdGFiX3BvcyA9IHYgPj4gKGtHYW1tYVRhYkZpeCArIDIpOyAgICAvLyBpbnRlZ2VyIHBhcnQKKyAgY29uc3QgaW50IHggPSB2ICYgKChrR2FtbWFUYWJTY2FsZSA8PCAyKSAtIDEpOyAgLy8gZnJhY3Rpb25hbCBwYXJ0CisgIGNvbnN0IGludCB2MCA9IGtMaW5lYXJUb0dhbW1hVGFiW3RhYl9wb3NdOworICBjb25zdCBpbnQgdjEgPSBrTGluZWFyVG9HYW1tYVRhYlt0YWJfcG9zICsgMV07CisgIGNvbnN0IGludCB5ID0gdjEgKiB4ICsgdjAgKiAoKGtHYW1tYVRhYlNjYWxlIDw8IDIpIC0geCk7ICAgLy8gaW50ZXJwb2xhdGUKKyAgYXNzZXJ0KHRhYl9wb3MgKyAxIDwga0dhbW1hVGFiU2l6ZSArIDEpOworICByZXR1cm4geTsKK30KKworLy8gQ29udmVydCBhIGxpbmVhciB2YWx1ZSAndicgdG8gWVVWX0ZJWCsyIGZpeGVkLXBvaW50IHByZWNpc2lvbgorLy8gVS9WIHZhbHVlLCBzdWl0YWJsZSBmb3IgUkdCVG9VL1YgY2FsbHMuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IExpbmVhclRvR2FtbWEodWludDMyX3QgYmFzZV92YWx1ZSwgaW50IHNoaWZ0KSB7CisgIGNvbnN0IGludCB5ID0gSW50ZXJwb2xhdGUoYmFzZV92YWx1ZSA8PCBzaGlmdCk7ICAgLy8gZmluYWwgdXBsaWZ0ZWQgdmFsdWUKKyAgcmV0dXJuICh5ICsga0dhbW1hVGFiUm91bmRlcikgPj4ga0dhbW1hVGFiRml4OyAgICAvLyBkZXNjYWxlCit9CisKKyNlbHNlCisKK3N0YXRpYyB2b2lkIEluaXRHYW1tYVRhYmxlcyh2b2lkKSB7fQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdhbW1hVG9MaW5lYXIodWludDhfdCB2KSB7IHJldHVybiB2OyB9CitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IExpbmVhclRvR2FtbWEodWludDMyX3QgYmFzZV92YWx1ZSwgaW50IHNoaWZ0KSB7CisgIHJldHVybiAoaW50KShiYXNlX3ZhbHVlIDw8IHNoaWZ0KTsKK30KKworI2VuZGlmICAgIC8vIFVTRV9HQU1NQV9DT01QUkVTU0lPTgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkdCIC0+IFlVViBjb252ZXJzaW9uCisKK3N0YXRpYyBpbnQgUkdCVG9ZKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvWShyLCBnLCBiLCBZVVZfSEFMRikKKyAgICAgICAgICAgICAgICAgICAgICA6IFZQOFJHQlRvWShyLCBnLCBiLCBWUDhSYW5kb21CaXRzKHJnLCBZVVZfRklYKSk7Cit9CisKK3N0YXRpYyBpbnQgUkdCVG9VKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvVShyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgIDogVlA4UkdCVG9VKHIsIGcsIGIsIFZQOFJhbmRvbUJpdHMocmcsIFlVVl9GSVggKyAyKSk7Cit9CisKK3N0YXRpYyBpbnQgUkdCVG9WKGludCByLCBpbnQgZywgaW50IGIsIFZQOFJhbmRvbSogY29uc3QgcmcpIHsKKyAgcmV0dXJuIChyZyA9PSBOVUxMKSA/IFZQOFJHQlRvVihyLCBnLCBiLCBZVVZfSEFMRiA8PCAyKQorICAgICAgICAgICAgICAgICAgICAgIDogVlA4UkdCVG9WKHIsIGcsIGIsIFZQOFJhbmRvbUJpdHMocmcsIFlVVl9GSVggKyAyKSk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaGFycCBSR0ItPllVViBjb252ZXJzaW9uCisKK3N0YXRpYyBjb25zdCBpbnQga051bUl0ZXJhdGlvbnMgPSA0Oworc3RhdGljIGNvbnN0IGludCBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbiA9IDQ7CisKKy8vIFdlIGNvdWxkIHVzZSBTRklYPTAgYW5kIG9ubHkgdWludDhfdCBmb3IgZml4ZWRfeV90LCBidXQgaXQgcHJvZHVjZXMgc29tZQorLy8gYmFuZGluZyBzb21ldGltZXMuIEJldHRlciB1c2UgZXh0cmEgcHJlY2lzaW9uLgorI2RlZmluZSBTRklYIDIgICAgICAgICAgICAgICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIG9mIFJHQiBhbmQgWS9XCit0eXBlZGVmIGludDE2X3QgZml4ZWRfdDsgICAgICAvLyBzaWduZWQgdHlwZSB3aXRoIGV4dHJhIFNGSVggcHJlY2lzaW9uIGZvciBVVgordHlwZWRlZiB1aW50MTZfdCBmaXhlZF95X3Q7ICAgLy8gdW5zaWduZWQgdHlwZSB3aXRoIGV4dHJhIFNGSVggcHJlY2lzaW9uIGZvciBXCisKKyNkZWZpbmUgU0hBTEYgKDEgPDwgU0ZJWCA+PiAxKQorI2RlZmluZSBNQVhfWV9UICgoMjU2IDw8IFNGSVgpIC0gMSkKKyNkZWZpbmUgU1JPVU5ERVIgKDEgPDwgKFlVVl9GSVggKyBTRklYIC0gMSkpCisKKyNpZiBkZWZpbmVkKFVTRV9HQU1NQV9DT01QUkVTU0lPTikKKworLy8gV2UgdXNlIHRhYmxlcyBvZiBkaWZmZXJlbnQgc2l6ZSBhbmQgcHJlY2lzaW9uIGZvciB0aGUgUmVjNzA5IC8gQlQyMDIwCisvLyB0cmFuc2ZlciBmdW5jdGlvbi4KKyNkZWZpbmUga0dhbW1hRiAoMS4vMC40NSkKK3N0YXRpYyB1aW50MzJfdCBrTGluZWFyVG9HYW1tYVRhYlNba0dhbW1hVGFiU2l6ZSArIDJdOworI2RlZmluZSBHQU1NQV9UT19MSU5FQVJfQklUUyAxNAorc3RhdGljIHVpbnQzMl90IGtHYW1tYVRvTGluZWFyVGFiU1tNQVhfWV9UICsgMV07ICAgLy8gc2l6ZSBzY2FsZXMgd2l0aCBZX0ZJWAorc3RhdGljIHZvbGF0aWxlIGludCBrR2FtbWFUYWJsZXNTT2sgPSAwOworCitzdGF0aWMgV0VCUF9UU0FOX0lHTk9SRV9GVU5DVElPTiB2b2lkIEluaXRHYW1tYVRhYmxlc1Modm9pZCkgeworICBhc3NlcnQoMiAqIEdBTU1BX1RPX0xJTkVBUl9CSVRTIDwgMzIpOyAgLy8gd2UgdXNlIHVpbnQzMl90IGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgaWYgKCFrR2FtbWFUYWJsZXNTT2spIHsKKyAgICBpbnQgdjsKKyAgICBjb25zdCBkb3VibGUgbm9ybSA9IDEuIC8gTUFYX1lfVDsKKyAgICBjb25zdCBkb3VibGUgc2NhbGUgPSAxLiAvIGtHYW1tYVRhYlNpemU7CisgICAgY29uc3QgZG91YmxlIGEgPSAwLjA5OTI5NjgyNjgwOTQ0OworICAgIGNvbnN0IGRvdWJsZSB0aHJlc2ggPSAwLjAxODA1Mzk2ODUxMDgwNzsKKyAgICBjb25zdCBkb3VibGUgZmluYWxfc2NhbGUgPSAxIDw8IEdBTU1BX1RPX0xJTkVBUl9CSVRTOworICAgIGZvciAodiA9IDA7IHYgPD0gTUFYX1lfVDsgKyt2KSB7CisgICAgICBjb25zdCBkb3VibGUgZyA9IG5vcm0gKiB2OworICAgICAgZG91YmxlIHZhbHVlOworICAgICAgaWYgKGcgPD0gdGhyZXNoICogNC41KSB7CisgICAgICAgIHZhbHVlID0gZyAvIDQuNTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGRvdWJsZSBhX3JlYyA9IDEuIC8gKDEuICsgYSk7CisgICAgICAgIHZhbHVlID0gcG93KGFfcmVjICogKGcgKyBhKSwga0dhbW1hRik7CisgICAgICB9CisgICAgICBrR2FtbWFUb0xpbmVhclRhYlNbdl0gPSAodWludDMyX3QpKHZhbHVlICogZmluYWxfc2NhbGUgKyAuNSk7CisgICAgfQorICAgIGZvciAodiA9IDA7IHYgPD0ga0dhbW1hVGFiU2l6ZTsgKyt2KSB7CisgICAgICBjb25zdCBkb3VibGUgZyA9IHNjYWxlICogdjsKKyAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgIGlmIChnIDw9IHRocmVzaCkgeworICAgICAgICB2YWx1ZSA9IDQuNSAqIGc7CisgICAgICB9IGVsc2UgeworICAgICAgICB2YWx1ZSA9ICgxLiArIGEpICogcG93KGcsIDEuIC8ga0dhbW1hRikgLSBhOworICAgICAgfQorICAgICAgLy8gd2UgYWxyZWFkeSBpbmNvcnBvcmF0ZSB0aGUgMS8yIHJvdW5kaW5nIGNvbnN0YW50IGhlcmUKKyAgICAgIGtMaW5lYXJUb0dhbW1hVGFiU1t2XSA9CisgICAgICAgICAgKHVpbnQzMl90KShNQVhfWV9UICogdmFsdWUpICsgKDEgPDwgR0FNTUFfVE9fTElORUFSX0JJVFMgPj4gMSk7CisgICAgfQorICAgIC8vIHRvIHByZXZlbnQgc21hbGwgcm91bmRpbmcgZXJyb3JzIHRvIGNhdXNlIHJlYWQtb3ZlcmZsb3c6CisgICAga0xpbmVhclRvR2FtbWFUYWJTW2tHYW1tYVRhYlNpemUgKyAxXSA9IGtMaW5lYXJUb0dhbW1hVGFiU1trR2FtbWFUYWJTaXplXTsKKyAgICBrR2FtbWFUYWJsZXNTT2sgPSAxOworICB9Cit9CisKKy8vIHJldHVybiB2YWx1ZSBoYXMgYSBmaXhlZC1wb2ludCBwcmVjaXNpb24gb2YgR0FNTUFfVE9fTElORUFSX0JJVFMKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHYW1tYVRvTGluZWFyUyhpbnQgdikgeworICByZXR1cm4ga0dhbW1hVG9MaW5lYXJUYWJTW3ZdOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTGluZWFyVG9HYW1tYVModWludDMyX3QgdmFsdWUpIHsKKyAgLy8gJ3ZhbHVlJyBpcyBpbiBHQU1NQV9UT19MSU5FQVJfQklUUyBmcmFjdGlvbmFsIHByZWNpc2lvbgorICBjb25zdCB1aW50MzJfdCB2ID0gdmFsdWUgKiBrR2FtbWFUYWJTaXplOworICBjb25zdCB1aW50MzJfdCB0YWJfcG9zID0gdiA+PiBHQU1NQV9UT19MSU5FQVJfQklUUzsKKyAgLy8gZnJhY3Rpb25hbCBwYXJ0LCBpbiBHQU1NQV9UT19MSU5FQVJfQklUUyBmaXhlZC1wb2ludCBwcmVjaXNpb24KKyAgY29uc3QgdWludDMyX3QgeCA9IHYgLSAodGFiX3BvcyA8PCBHQU1NQV9UT19MSU5FQVJfQklUUyk7ICAvLyBmcmFjdGlvbmFsIHBhcnQKKyAgLy8gdjAgLyB2MSBhcmUgaW4gR0FNTUFfVE9fTElORUFSX0JJVFMgZml4ZWQtcG9pbnQgcHJlY2lzaW9uIChyYW5nZSBbMC4uMV0pCisgIGNvbnN0IHVpbnQzMl90IHYwID0ga0xpbmVhclRvR2FtbWFUYWJTW3RhYl9wb3MgKyAwXTsKKyAgY29uc3QgdWludDMyX3QgdjEgPSBrTGluZWFyVG9HYW1tYVRhYlNbdGFiX3BvcyArIDFdOworICAvLyBGaW5hbCBpbnRlcnBvbGF0aW9uLiBOb3RlIHRoYXQgcm91bmRpbmcgaXMgYWxyZWFkeSBpbmNsdWRlZC4KKyAgY29uc3QgdWludDMyX3QgdjIgPSAodjEgLSB2MCkgKiB4OyAgICAvLyBub3RlOiB2MSA+PSB2MC4KKyAgY29uc3QgdWludDMyX3QgcmVzdWx0ID0gdjAgKyAodjIgPj4gR0FNTUFfVE9fTElORUFSX0JJVFMpOworICByZXR1cm4gcmVzdWx0OworfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBJbml0R2FtbWFUYWJsZXNTKHZvaWQpIHt9CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgR2FtbWFUb0xpbmVhclMoaW50IHYpIHsKKyAgcmV0dXJuICh2IDw8IEdBTU1BX1RPX0xJTkVBUl9CSVRTKSAvIE1BWF9ZX1Q7Cit9CitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTGluZWFyVG9HYW1tYVModWludDMyX3QgdmFsdWUpIHsKKyAgcmV0dXJuIChNQVhfWV9UICogdmFsdWUpID4+IEdBTU1BX1RPX0xJTkVBUl9CSVRTOworfQorCisjZW5kaWYgICAgLy8gVVNFX0dBTU1BX0NPTVBSRVNTSU9OCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB1aW50OF90IGNsaXBfOGIoZml4ZWRfdCB2KSB7CisgIHJldHVybiAoISh2ICYgfjB4ZmYpKSA/ICh1aW50OF90KXYgOiAodiA8IDApID8gMHUgOiAyNTV1OworfQorCitzdGF0aWMgZml4ZWRfeV90IGNsaXBfeShpbnQgeSkgeworICByZXR1cm4gKCEoeSAmIH5NQVhfWV9UKSkgPyAoZml4ZWRfeV90KXkgOiAoeSA8IDApID8gMCA6IE1BWF9ZX1Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBpbnQgUkdCVG9HcmF5KGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IGx1bWEgPSAxMzkzMyAqIHIgKyA0Njg3MSAqIGcgKyA0NzMyICogYiArIFlVVl9IQUxGOworICByZXR1cm4gKGx1bWEgPj4gWVVWX0ZJWCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBTY2FsZURvd24oaW50IGEsIGludCBiLCBpbnQgYywgaW50IGQpIHsKKyAgY29uc3QgdWludDMyX3QgQSA9IEdhbW1hVG9MaW5lYXJTKGEpOworICBjb25zdCB1aW50MzJfdCBCID0gR2FtbWFUb0xpbmVhclMoYik7CisgIGNvbnN0IHVpbnQzMl90IEMgPSBHYW1tYVRvTGluZWFyUyhjKTsKKyAgY29uc3QgdWludDMyX3QgRCA9IEdhbW1hVG9MaW5lYXJTKGQpOworICByZXR1cm4gTGluZWFyVG9HYW1tYVMoKEEgKyBCICsgQyArIEQgKyAyKSA+PiAyKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlVyhjb25zdCBmaXhlZF95X3QqIHNyYywgZml4ZWRfeV90KiBkc3QsIGludCB3KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgUiA9IEdhbW1hVG9MaW5lYXJTKHNyY1swICogdyArIGldKTsKKyAgICBjb25zdCB1aW50MzJfdCBHID0gR2FtbWFUb0xpbmVhclMoc3JjWzEgKiB3ICsgaV0pOworICAgIGNvbnN0IHVpbnQzMl90IEIgPSBHYW1tYVRvTGluZWFyUyhzcmNbMiAqIHcgKyBpXSk7CisgICAgY29uc3QgdWludDMyX3QgWSA9IFJHQlRvR3JheShSLCBHLCBCKTsKKyAgICBkc3RbaV0gPSAoZml4ZWRfeV90KUxpbmVhclRvR2FtbWFTKFkpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFVwZGF0ZUNocm9tYShjb25zdCBmaXhlZF95X3QqIHNyYzEsIGNvbnN0IGZpeGVkX3lfdCogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF90KiBkc3QsIGludCB1dl93KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdXZfdzsgKytpKSB7CisgICAgY29uc3QgaW50IHIgPSBTY2FsZURvd24oc3JjMVswICogdXZfdyArIDBdLCBzcmMxWzAgKiB1dl93ICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMlswICogdXZfdyArIDBdLCBzcmMyWzAgKiB1dl93ICsgMV0pOworICAgIGNvbnN0IGludCBnID0gU2NhbGVEb3duKHNyYzFbMiAqIHV2X3cgKyAwXSwgc3JjMVsyICogdXZfdyArIDFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbMiAqIHV2X3cgKyAwXSwgc3JjMlsyICogdXZfdyArIDFdKTsKKyAgICBjb25zdCBpbnQgYiA9IFNjYWxlRG93bihzcmMxWzQgKiB1dl93ICsgMF0sIHNyYzFbNCAqIHV2X3cgKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyWzQgKiB1dl93ICsgMF0sIHNyYzJbNCAqIHV2X3cgKyAxXSk7CisgICAgY29uc3QgaW50IFcgPSBSR0JUb0dyYXkociwgZywgYik7CisgICAgZHN0WzAgKiB1dl93XSA9IChmaXhlZF90KShyIC0gVyk7CisgICAgZHN0WzEgKiB1dl93XSA9IChmaXhlZF90KShnIC0gVyk7CisgICAgZHN0WzIgKiB1dl93XSA9IChmaXhlZF90KShiIC0gVyk7CisgICAgZHN0ICArPSAxOworICAgIHNyYzEgKz0gMjsKKyAgICBzcmMyICs9IDI7CisgIH0KK30KKworc3RhdGljIHZvaWQgU3RvcmVHcmF5KGNvbnN0IGZpeGVkX3lfdCogcmdiLCBmaXhlZF95X3QqIHksIGludCB3KSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgdzsgKytpKSB7CisgICAgeVtpXSA9IFJHQlRvR3JheShyZ2JbMCAqIHcgKyBpXSwgcmdiWzEgKiB3ICsgaV0sIHJnYlsyICogdyArIGldKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgZml4ZWRfeV90IEZpbHRlcjIoaW50IEEsIGludCBCLCBpbnQgVzApIHsKKyAgY29uc3QgaW50IHYwID0gKEEgKiAzICsgQiArIDIpID4+IDI7CisgIHJldHVybiBjbGlwX3kodjAgKyBXMCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBmaXhlZF95X3QgVXBMaWZ0KHVpbnQ4X3QgYSkgeyAgLy8gOGJpdCAtPiBTRklYCisgIHJldHVybiAoKGZpeGVkX3lfdClhIDw8IFNGSVgpIHwgU0hBTEY7Cit9CisKK3N0YXRpYyB2b2lkIEltcG9ydE9uZVJvdyhjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBiX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGljX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkX3lfdCogY29uc3QgZHN0KSB7CisgIGludCBpOworICBjb25zdCBpbnQgdyA9IChwaWNfd2lkdGggKyAxKSAmIH4xOworICBmb3IgKGkgPSAwOyBpIDwgcGljX3dpZHRoOyArK2kpIHsKKyAgICBjb25zdCBpbnQgb2ZmID0gaSAqIHN0ZXA7CisgICAgZHN0W2kgKyAwICogd10gPSBVcExpZnQocl9wdHJbb2ZmXSk7CisgICAgZHN0W2kgKyAxICogd10gPSBVcExpZnQoZ19wdHJbb2ZmXSk7CisgICAgZHN0W2kgKyAyICogd10gPSBVcExpZnQoYl9wdHJbb2ZmXSk7CisgIH0KKyAgaWYgKHBpY193aWR0aCAmIDEpIHsgIC8vIHJlcGxpY2F0ZSByaWdodG1vc3QgcGl4ZWwKKyAgICBkc3RbcGljX3dpZHRoICsgMCAqIHddID0gZHN0W3BpY193aWR0aCArIDAgKiB3IC0gMV07CisgICAgZHN0W3BpY193aWR0aCArIDEgKiB3XSA9IGRzdFtwaWNfd2lkdGggKyAxICogdyAtIDFdOworICAgIGRzdFtwaWNfd2lkdGggKyAyICogd10gPSBkc3RbcGljX3dpZHRoICsgMiAqIHcgLSAxXTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbnRlcnBvbGF0ZVR3b1Jvd3MoY29uc3QgZml4ZWRfeV90KiBjb25zdCBiZXN0X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogcHJldl91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXhlZF90KiBjdXJfdXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZml4ZWRfdCogbmV4dF91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZF95X3QqIG91dDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWRfeV90KiBvdXQyKSB7CisgIGNvbnN0IGludCB1dl93ID0gdyA+PiAxOworICBjb25zdCBpbnQgbGVuID0gKHcgLSAxKSA+PiAxOyAgIC8vIGxlbmd0aCB0byBmaWx0ZXIKKyAgaW50IGsgPSAzOworICB3aGlsZSAoay0tID4gMCkgeyAgIC8vIHByb2Nlc3MgZWFjaCBSL0cvQiBzZWdtZW50cyBpbiB0dXJuCisgICAgLy8gc3BlY2lhbCBib3VuZGFyeSBjYXNlIGZvciBpPT0wCisgICAgb3V0MVswXSA9IEZpbHRlcjIoY3VyX3V2WzBdLCBwcmV2X3V2WzBdLCBiZXN0X3lbMF0pOworICAgIG91dDJbMF0gPSBGaWx0ZXIyKGN1cl91dlswXSwgbmV4dF91dlswXSwgYmVzdF95W3ddKTsKKworICAgIFdlYlBTaGFycFlVVkZpbHRlclJvdyhjdXJfdXYsIHByZXZfdXYsIGxlbiwgYmVzdF95ICsgMCArIDEsIG91dDEgKyAxKTsKKyAgICBXZWJQU2hhcnBZVVZGaWx0ZXJSb3coY3VyX3V2LCBuZXh0X3V2LCBsZW4sIGJlc3RfeSArIHcgKyAxLCBvdXQyICsgMSk7CisKKyAgICAvLyBzcGVjaWFsIGJvdW5kYXJ5IGNhc2UgZm9yIGkgPT0gdyAtIDEgd2hlbiB3IGlzIGV2ZW4KKyAgICBpZiAoISh3ICYgMSkpIHsKKyAgICAgIG91dDFbdyAtIDFdID0gRmlsdGVyMihjdXJfdXZbdXZfdyAtIDFdLCBwcmV2X3V2W3V2X3cgLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZXN0X3lbdyAtIDEgKyAwXSk7CisgICAgICBvdXQyW3cgLSAxXSA9IEZpbHRlcjIoY3VyX3V2W3V2X3cgLSAxXSwgbmV4dF91dlt1dl93IC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF95W3cgLSAxICsgd10pOworICAgIH0KKyAgICBvdXQxICs9IHc7CisgICAgb3V0MiArPSB3OworICAgIHByZXZfdXYgKz0gdXZfdzsKKyAgICBjdXJfdXYgICs9IHV2X3c7CisgICAgbmV4dF91diArPSB1dl93OworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50OF90IENvbnZlcnRSR0JUb1koaW50IHIsIGludCBnLCBpbnQgYikgeworICBjb25zdCBpbnQgbHVtYSA9IDE2ODM5ICogciArIDMzMDU5ICogZyArIDY0MjAgKiBiICsgU1JPVU5ERVI7CisgIHJldHVybiBjbGlwXzhiKDE2ICsgKGx1bWEgPj4gKFlVVl9GSVggKyBTRklYKSkpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDhfdCBDb252ZXJ0UkdCVG9VKGludCByLCBpbnQgZywgaW50IGIpIHsKKyAgY29uc3QgaW50IHUgPSAgLTk3MTkgKiByIC0gMTkwODEgKiBnICsgMjg4MDAgKiBiICsgU1JPVU5ERVI7CisgIHJldHVybiBjbGlwXzhiKDEyOCArICh1ID4+IChZVVZfRklYICsgU0ZJWCkpKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgQ29udmVydFJHQlRvVihpbnQgciwgaW50IGcsIGludCBiKSB7CisgIGNvbnN0IGludCB2ID0gKzI4ODAwICogciAtIDI0MTE2ICogZyAtICA0Njg0ICogYiArIFNST1VOREVSOworICByZXR1cm4gY2xpcF84YigxMjggKyAodiA+PiAoWVVWX0ZJWCArIFNGSVgpKSk7Cit9CisKK3N0YXRpYyBpbnQgQ29udmVydFdSR0JUb1lVVihjb25zdCBmaXhlZF95X3QqIGJlc3RfeSwgY29uc3QgZml4ZWRfdCogYmVzdF91diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBpbnQgaSwgajsKKyAgdWludDhfdCogZHN0X3kgPSBwaWN0dXJlLT55OworICB1aW50OF90KiBkc3RfdSA9IHBpY3R1cmUtPnU7CisgIHVpbnQ4X3QqIGRzdF92ID0gcGljdHVyZS0+djsKKyAgY29uc3QgZml4ZWRfdCogY29uc3QgYmVzdF91dl9iYXNlID0gYmVzdF91djsKKyAgY29uc3QgaW50IHcgPSAocGljdHVyZS0+d2lkdGggKyAxKSAmIH4xOworICBjb25zdCBpbnQgaCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxKSAmIH4xOworICBjb25zdCBpbnQgdXZfdyA9IHcgPj4gMTsKKyAgY29uc3QgaW50IHV2X2ggPSBoID4+IDE7CisgIGZvciAoYmVzdF91diA9IGJlc3RfdXZfYmFzZSwgaiA9IDA7IGogPCBwaWN0dXJlLT5oZWlnaHQ7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCBwaWN0dXJlLT53aWR0aDsgKytpKSB7CisgICAgICBjb25zdCBpbnQgb2ZmID0gKGkgPj4gMSk7CisgICAgICBjb25zdCBpbnQgVyA9IGJlc3RfeVtpXTsKKyAgICAgIGNvbnN0IGludCByID0gYmVzdF91dltvZmYgKyAwICogdXZfd10gKyBXOworICAgICAgY29uc3QgaW50IGcgPSBiZXN0X3V2W29mZiArIDEgKiB1dl93XSArIFc7CisgICAgICBjb25zdCBpbnQgYiA9IGJlc3RfdXZbb2ZmICsgMiAqIHV2X3ddICsgVzsKKyAgICAgIGRzdF95W2ldID0gQ29udmVydFJHQlRvWShyLCBnLCBiKTsKKyAgICB9CisgICAgYmVzdF95ICs9IHc7CisgICAgYmVzdF91diArPSAoaiAmIDEpICogMyAqIHV2X3c7CisgICAgZHN0X3kgKz0gcGljdHVyZS0+eV9zdHJpZGU7CisgIH0KKyAgZm9yIChiZXN0X3V2ID0gYmVzdF91dl9iYXNlLCBqID0gMDsgaiA8IHV2X2g7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCB1dl93OyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBvZmYgPSBpOworICAgICAgY29uc3QgaW50IHIgPSBiZXN0X3V2W29mZiArIDAgKiB1dl93XTsKKyAgICAgIGNvbnN0IGludCBnID0gYmVzdF91dltvZmYgKyAxICogdXZfd107CisgICAgICBjb25zdCBpbnQgYiA9IGJlc3RfdXZbb2ZmICsgMiAqIHV2X3ddOworICAgICAgZHN0X3VbaV0gPSBDb252ZXJ0UkdCVG9VKHIsIGcsIGIpOworICAgICAgZHN0X3ZbaV0gPSBDb252ZXJ0UkdCVG9WKHIsIGcsIGIpOworICAgIH0KKyAgICBiZXN0X3V2ICs9IDMgKiB1dl93OworICAgIGRzdF91ICs9IHBpY3R1cmUtPnV2X3N0cmlkZTsKKyAgICBkc3RfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGZ1bmN0aW9uCisKKyNkZWZpbmUgU0FGRV9BTExPQyhXLCBILCBUKSAoKFQqKVdlYlBTYWZlTWFsbG9jKChXKSAqIChIKSwgc2l6ZW9mKFQpKSkKKworc3RhdGljIGludCBQcmVwcm9jZXNzQVJHQihjb25zdCB1aW50OF90KiByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZ19wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIC8vIHdlIGV4cGFuZCB0aGUgcmlnaHQvYm90dG9tIGJvcmRlciBpZiBuZWVkZWQKKyAgY29uc3QgaW50IHcgPSAocGljdHVyZS0+d2lkdGggKyAxKSAmIH4xOworICBjb25zdCBpbnQgaCA9IChwaWN0dXJlLT5oZWlnaHQgKyAxKSAmIH4xOworICBjb25zdCBpbnQgdXZfdyA9IHcgPj4gMTsKKyAgY29uc3QgaW50IHV2X2ggPSBoID4+IDE7CisgIHVpbnQ2NF90IHByZXZfZGlmZl95X3N1bSA9IH4wOworICBpbnQgaiwgaXRlcjsKKworICAvLyBUT0RPKHNrYWwpOiBhbGxvY2F0ZSBvbmUgYmlnIG1lbW9yeSBjaHVuay4gQnV0IGZvciBub3csIGl0J3MgZWFzaWVyCisgIC8vIGZvciB2YWxncmluZCBkZWJ1Z2dpbmcgdG8gaGF2ZSBzZXZlcmFsIGNodW5rcy4KKyAgZml4ZWRfeV90KiBjb25zdCB0bXBfYnVmZmVyID0gU0FGRV9BTExPQyh3ICogMywgMiwgZml4ZWRfeV90KTsgICAvLyBzY3JhdGNoCisgIGZpeGVkX3lfdCogY29uc3QgYmVzdF95X2Jhc2UgPSBTQUZFX0FMTE9DKHcsIGgsIGZpeGVkX3lfdCk7CisgIGZpeGVkX3lfdCogY29uc3QgdGFyZ2V0X3lfYmFzZSA9IFNBRkVfQUxMT0ModywgaCwgZml4ZWRfeV90KTsKKyAgZml4ZWRfeV90KiBjb25zdCBiZXN0X3JnYl95ID0gU0FGRV9BTExPQyh3LCAyLCBmaXhlZF95X3QpOworICBmaXhlZF90KiBjb25zdCBiZXN0X3V2X2Jhc2UgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCB1dl9oLCBmaXhlZF90KTsKKyAgZml4ZWRfdCogY29uc3QgdGFyZ2V0X3V2X2Jhc2UgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCB1dl9oLCBmaXhlZF90KTsKKyAgZml4ZWRfdCogY29uc3QgYmVzdF9yZ2JfdXYgPSBTQUZFX0FMTE9DKHV2X3cgKiAzLCAxLCBmaXhlZF90KTsKKyAgZml4ZWRfeV90KiBiZXN0X3kgPSBiZXN0X3lfYmFzZTsKKyAgZml4ZWRfeV90KiB0YXJnZXRfeSA9IHRhcmdldF95X2Jhc2U7CisgIGZpeGVkX3QqIGJlc3RfdXYgPSBiZXN0X3V2X2Jhc2U7CisgIGZpeGVkX3QqIHRhcmdldF91diA9IHRhcmdldF91dl9iYXNlOworICBjb25zdCB1aW50NjRfdCBkaWZmX3lfdGhyZXNob2xkID0gKHVpbnQ2NF90KSgzLjAgKiB3ICogaCk7CisgIGludCBvazsKKworICBpZiAoYmVzdF95X2Jhc2UgPT0gTlVMTCB8fCBiZXN0X3V2X2Jhc2UgPT0gTlVMTCB8fAorICAgICAgdGFyZ2V0X3lfYmFzZSA9PSBOVUxMIHx8IHRhcmdldF91dl9iYXNlID09IE5VTEwgfHwKKyAgICAgIGJlc3RfcmdiX3kgPT0gTlVMTCB8fCBiZXN0X3JnYl91diA9PSBOVUxMIHx8CisgICAgICB0bXBfYnVmZmVyID09IE5VTEwpIHsKKyAgICBvayA9IFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgZ290byBFbmQ7CisgIH0KKyAgYXNzZXJ0KHBpY3R1cmUtPndpZHRoID49IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKTsKKyAgYXNzZXJ0KHBpY3R1cmUtPmhlaWdodCA+PSBrTWluRGltZW5zaW9uSXRlcmF0aXZlQ29udmVyc2lvbik7CisKKyAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKCk7CisKKyAgLy8gSW1wb3J0IFJHQiBzYW1wbGVzIHRvIFcvUkdCIHJlcHJlc2VudGF0aW9uLgorICBmb3IgKGogPSAwOyBqIDwgcGljdHVyZS0+aGVpZ2h0OyBqICs9IDIpIHsKKyAgICBjb25zdCBpbnQgaXNfbGFzdF9yb3cgPSAoaiA9PSBwaWN0dXJlLT5oZWlnaHQgLSAxKTsKKyAgICBmaXhlZF95X3QqIGNvbnN0IHNyYzEgPSB0bXBfYnVmZmVyICsgMCAqIHc7CisgICAgZml4ZWRfeV90KiBjb25zdCBzcmMyID0gdG1wX2J1ZmZlciArIDMgKiB3OworCisgICAgLy8gcHJlcGFyZSB0d28gcm93cyBvZiBpbnB1dAorICAgIEltcG9ydE9uZVJvdyhyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCBwaWN0dXJlLT53aWR0aCwgc3JjMSk7CisgICAgaWYgKCFpc19sYXN0X3JvdykgeworICAgICAgSW1wb3J0T25lUm93KHJfcHRyICsgcmdiX3N0cmlkZSwgZ19wdHIgKyByZ2Jfc3RyaWRlLCBiX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgc3RlcCwgcGljdHVyZS0+d2lkdGgsIHNyYzIpOworICAgIH0gZWxzZSB7CisgICAgICBtZW1jcHkoc3JjMiwgc3JjMSwgMyAqIHcgKiBzaXplb2YoKnNyYzIpKTsKKyAgICB9CisgICAgU3RvcmVHcmF5KHNyYzEsIGJlc3RfeSArIDAsIHcpOworICAgIFN0b3JlR3JheShzcmMyLCBiZXN0X3kgKyB3LCB3KTsKKworICAgIFVwZGF0ZVcoc3JjMSwgdGFyZ2V0X3ksIHcpOworICAgIFVwZGF0ZVcoc3JjMiwgdGFyZ2V0X3kgKyB3LCB3KTsKKyAgICBVcGRhdGVDaHJvbWEoc3JjMSwgc3JjMiwgdGFyZ2V0X3V2LCB1dl93KTsKKyAgICBtZW1jcHkoYmVzdF91diwgdGFyZ2V0X3V2LCAzICogdXZfdyAqIHNpemVvZigqYmVzdF91dikpOworICAgIGJlc3RfeSArPSAyICogdzsKKyAgICBiZXN0X3V2ICs9IDMgKiB1dl93OworICAgIHRhcmdldF95ICs9IDIgKiB3OworICAgIHRhcmdldF91diArPSAzICogdXZfdzsKKyAgICByX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICBnX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICBiX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgfQorCisgIC8vIEl0ZXJhdGUgYW5kIHJlc29sdmUgY2xpcHBpbmcgY29uZmxpY3RzLgorICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwga051bUl0ZXJhdGlvbnM7ICsraXRlcikgeworICAgIGNvbnN0IGZpeGVkX3QqIGN1cl91diA9IGJlc3RfdXZfYmFzZTsKKyAgICBjb25zdCBmaXhlZF90KiBwcmV2X3V2ID0gYmVzdF91dl9iYXNlOworICAgIHVpbnQ2NF90IGRpZmZfeV9zdW0gPSAwOworCisgICAgYmVzdF95ID0gYmVzdF95X2Jhc2U7CisgICAgYmVzdF91diA9IGJlc3RfdXZfYmFzZTsKKyAgICB0YXJnZXRfeSA9IHRhcmdldF95X2Jhc2U7CisgICAgdGFyZ2V0X3V2ID0gdGFyZ2V0X3V2X2Jhc2U7CisgICAgZm9yIChqID0gMDsgaiA8IGg7IGogKz0gMikgeworICAgICAgZml4ZWRfeV90KiBjb25zdCBzcmMxID0gdG1wX2J1ZmZlciArIDAgKiB3OworICAgICAgZml4ZWRfeV90KiBjb25zdCBzcmMyID0gdG1wX2J1ZmZlciArIDMgKiB3OworICAgICAgeworICAgICAgICBjb25zdCBmaXhlZF90KiBjb25zdCBuZXh0X3V2ID0gY3VyX3V2ICsgKChqIDwgaCAtIDIpID8gMyAqIHV2X3cgOiAwKTsKKyAgICAgICAgSW50ZXJwb2xhdGVUd29Sb3dzKGJlc3RfeSwgcHJldl91diwgY3VyX3V2LCBuZXh0X3V2LCB3LCBzcmMxLCBzcmMyKTsKKyAgICAgICAgcHJldl91diA9IGN1cl91djsKKyAgICAgICAgY3VyX3V2ID0gbmV4dF91djsKKyAgICAgIH0KKworICAgICAgVXBkYXRlVyhzcmMxLCBiZXN0X3JnYl95ICsgMCAqIHcsIHcpOworICAgICAgVXBkYXRlVyhzcmMyLCBiZXN0X3JnYl95ICsgMSAqIHcsIHcpOworICAgICAgVXBkYXRlQ2hyb21hKHNyYzEsIHNyYzIsIGJlc3RfcmdiX3V2LCB1dl93KTsKKworICAgICAgLy8gdXBkYXRlIHR3byByb3dzIG9mIFkgYW5kIG9uZSByb3cgb2YgUkdCCisgICAgICBkaWZmX3lfc3VtICs9IFdlYlBTaGFycFlVVlVwZGF0ZVkodGFyZ2V0X3ksIGJlc3RfcmdiX3ksIGJlc3RfeSwgMiAqIHcpOworICAgICAgV2ViUFNoYXJwWVVWVXBkYXRlUkdCKHRhcmdldF91diwgYmVzdF9yZ2JfdXYsIGJlc3RfdXYsIDMgKiB1dl93KTsKKworICAgICAgYmVzdF95ICs9IDIgKiB3OworICAgICAgYmVzdF91diArPSAzICogdXZfdzsKKyAgICAgIHRhcmdldF95ICs9IDIgKiB3OworICAgICAgdGFyZ2V0X3V2ICs9IDMgKiB1dl93OworICAgIH0KKyAgICAvLyB0ZXN0IGV4aXQgY29uZGl0aW9uCisgICAgaWYgKGl0ZXIgPiAwKSB7CisgICAgICBpZiAoZGlmZl95X3N1bSA8IGRpZmZfeV90aHJlc2hvbGQpIGJyZWFrOworICAgICAgaWYgKGRpZmZfeV9zdW0gPiBwcmV2X2RpZmZfeV9zdW0pIGJyZWFrOworICAgIH0KKyAgICBwcmV2X2RpZmZfeV9zdW0gPSBkaWZmX3lfc3VtOworICB9CisgIC8vIGZpbmFsIHJlY29uc3RydWN0aW9uCisgIG9rID0gQ29udmVydFdSR0JUb1lVVihiZXN0X3lfYmFzZSwgYmVzdF91dl9iYXNlLCBwaWN0dXJlKTsKKworIEVuZDoKKyAgV2ViUFNhZmVGcmVlKGJlc3RfeV9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfdXZfYmFzZSk7CisgIFdlYlBTYWZlRnJlZSh0YXJnZXRfeV9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKHRhcmdldF91dl9iYXNlKTsKKyAgV2ViUFNhZmVGcmVlKGJlc3RfcmdiX3kpOworICBXZWJQU2FmZUZyZWUoYmVzdF9yZ2JfdXYpOworICBXZWJQU2FmZUZyZWUodG1wX2J1ZmZlcik7CisgIHJldHVybiBvazsKK30KKyN1bmRlZiBTQUZFX0FMTE9DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAiRmFzdCIgcmVndWxhciBSR0ItPllVVgorCisjZGVmaW5lIFNVTTQocHRyLCBzdGVwKSBMaW5lYXJUb0dhbW1hKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdhbW1hVG9MaW5lYXIoKHB0cilbKHN0ZXApXSkgKyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR2FtbWFUb0xpbmVhcigocHRyKVtyZ2Jfc3RyaWRlXSkgKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHYW1tYVRvTGluZWFyKChwdHIpW3JnYl9zdHJpZGUgKyAoc3RlcCldKSwgMCkgICAgICAgICAgXAorCisjZGVmaW5lIFNVTTIocHRyKSBcCisgICAgTGluZWFyVG9HYW1tYShHYW1tYVRvTGluZWFyKChwdHIpWzBdKSArIEdhbW1hVG9MaW5lYXIoKHB0cilbcmdiX3N0cmlkZV0pLCAxKQorCisjZGVmaW5lIFNVTTJBTFBIQShwdHIpICgocHRyKVswXSArIChwdHIpW3JnYl9zdHJpZGVdKQorI2RlZmluZSBTVU00QUxQSEEocHRyKSAoU1VNMkFMUEhBKHB0cikgKyBTVU0yQUxQSEEoKHB0cikgKyA0KSkKKworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisKK3N0YXRpYyBjb25zdCBpbnQga0FscGhhRml4ID0gMTk7CisvLyBGb2xsb3dpbmcgdGFibGUgaXMgKDEgPDwga0FscGhhRml4KSAvIGEuIFRoZSAodiAqIGtJbnZBbHBoYVthXSkgPj4ga0FscGhhRml4CisvLyBmb3JtdWxhIGlzIHRoZW4gZXF1YWwgdG8gdiAvIGEgaW4gbW9zdCAoOTkuNiUpIGNhc2VzLiBOb3RlIHRoYXQgdGhpcyB0YWJsZQorLy8gYW5kIGNvbnN0YW50IGFyZSBhZGp1c3RlZCB2ZXJ5IHRpZ2h0bHkgdG8gZml0IDMyYiBhcml0aG1ldGljLgorLy8gSW4gcGFydGljdWxhciwgdGhleSB1c2UgdGhlIGZhY3QgdGhhdCB0aGUgb3BlcmFuZHMgZm9yICd2IC8gYScgYXJlIGFjdHVhbGx5CisvLyBkZXJpdmVkIGFzIHYgPSAoYTAucDAgKyBhMS5wMSArIGEyLnAyICsgYTMucDMpIGFuZCBhID0gYTAgKyBhMSArIGEyICsgYTMKKy8vIHdpdGggYWkgaW4gWzAuLjI1NV0gYW5kIHBpIGluIFswLi4xPDxrR2FtbWFGaXgpLiBUaGUgY29uc3RyYWludCB0byBhdm9pZAorLy8gb3ZlcmZsb3cgaXM6IGtHYW1tYUZpeCArIGtBbHBoYUZpeCA8PSAzMS4KK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrSW52QWxwaGFbNCAqIDB4ZmYgKyAxXSA9IHsKKyAgMCwgIC8qIGFscGhhID0gMCAqLworICA1MjQyODgsIDI2MjE0NCwgMTc0NzYyLCAxMzEwNzIsIDEwNDg1NywgODczODEsIDc0ODk4LCA2NTUzNiwKKyAgNTgyNTQsIDUyNDI4LCA0NzY2MiwgNDM2OTAsIDQwMzI5LCAzNzQ0OSwgMzQ5NTIsIDMyNzY4LAorICAzMDg0MCwgMjkxMjcsIDI3NTk0LCAyNjIxNCwgMjQ5NjYsIDIzODMxLCAyMjc5NSwgMjE4NDUsCisgIDIwOTcxLCAyMDE2NCwgMTk0MTgsIDE4NzI0LCAxODA3OCwgMTc0NzYsIDE2OTEyLCAxNjM4NCwKKyAgMTU4ODcsIDE1NDIwLCAxNDk3OSwgMTQ1NjMsIDE0MTY5LCAxMzc5NywgMTM0NDMsIDEzMTA3LAorICAxMjc4NywgMTI0ODMsIDEyMTkyLCAxMTkxNSwgMTE2NTAsIDExMzk3LCAxMTE1NSwgMTA5MjIsCisgIDEwNjk5LCAxMDQ4NSwgMTAyODAsIDEwMDgyLCA5ODkyLCA5NzA5LCA5NTMyLCA5MzYyLAorICA5MTk4LCA5MDM5LCA4ODg2LCA4NzM4LCA4NTk0LCA4NDU2LCA4MzIyLCA4MTkyLAorICA4MDY1LCA3OTQzLCA3ODI1LCA3NzEwLCA3NTk4LCA3NDg5LCA3Mzg0LCA3MjgxLAorICA3MTgyLCA3MDg0LCA2OTkwLCA2ODk4LCA2ODA4LCA2NzIxLCA2NjM2LCA2NTUzLAorICA2NDcyLCA2MzkzLCA2MzE2LCA2MjQxLCA2MTY4LCA2MDk2LCA2MDI2LCA1OTU3LAorICA1ODkwLCA1ODI1LCA1NzYxLCA1Njk4LCA1NjM3LCA1NTc3LCA1NTE4LCA1NDYxLAorICA1NDA1LCA1MzQ5LCA1Mjk1LCA1MjQyLCA1MTkwLCA1MTQwLCA1MDkwLCA1MDQxLAorICA0OTkzLCA0OTQ2LCA0ODk5LCA0ODU0LCA0ODA5LCA0NzY2LCA0NzIzLCA0NjgxLAorICA0NjM5LCA0NTk5LCA0NTU5LCA0NTE5LCA0NDgxLCA0NDQzLCA0NDA1LCA0MzY5LAorICA0MzMyLCA0Mjk3LCA0MjYyLCA0MjI4LCA0MTk0LCA0MTYxLCA0MTI4LCA0MDk2LAorICA0MDY0LCA0MDMyLCA0MDAyLCAzOTcxLCAzOTQyLCAzOTEyLCAzODgzLCAzODU1LAorICAzODI2LCAzNzk5LCAzNzcxLCAzNzQ0LCAzNzE4LCAzNjkyLCAzNjY2LCAzNjQwLAorICAzNjE1LCAzNTkxLCAzNTY2LCAzNTQyLCAzNTE4LCAzNDk1LCAzNDcyLCAzNDQ5LAorICAzNDI2LCAzNDA0LCAzMzgyLCAzMzYwLCAzMzM5LCAzMzE4LCAzMjk3LCAzMjc2LAorICAzMjU2LCAzMjM2LCAzMjE2LCAzMTk2LCAzMTc3LCAzMTU4LCAzMTM5LCAzMTIwLAorICAzMTAyLCAzMDg0LCAzMDY2LCAzMDQ4LCAzMDMwLCAzMDEzLCAyOTk1LCAyOTc4LAorICAyOTYyLCAyOTQ1LCAyOTI4LCAyOTEyLCAyODk2LCAyODgwLCAyODY0LCAyODQ5LAorICAyODMzLCAyODE4LCAyODAzLCAyNzg4LCAyNzc0LCAyNzU5LCAyNzQ0LCAyNzMwLAorICAyNzE2LCAyNzAyLCAyNjg4LCAyNjc0LCAyNjYxLCAyNjQ3LCAyNjM0LCAyNjIxLAorICAyNjA4LCAyNTk1LCAyNTgyLCAyNTcwLCAyNTU3LCAyNTQ1LCAyNTMyLCAyNTIwLAorICAyNTA4LCAyNDk2LCAyNDg0LCAyNDczLCAyNDYxLCAyNDQ5LCAyNDM4LCAyNDI3LAorICAyNDE2LCAyNDA0LCAyMzk0LCAyMzgzLCAyMzcyLCAyMzYxLCAyMzUxLCAyMzQwLAorICAyMzMwLCAyMzE5LCAyMzA5LCAyMjk5LCAyMjg5LCAyMjc5LCAyMjY5LCAyMjU5LAorICAyMjUwLCAyMjQwLCAyMjMxLCAyMjIxLCAyMjEyLCAyMjAyLCAyMTkzLCAyMTg0LAorICAyMTc1LCAyMTY2LCAyMTU3LCAyMTQ4LCAyMTM5LCAyMTMxLCAyMTIyLCAyMTE0LAorICAyMTA1LCAyMDk3LCAyMDg4LCAyMDgwLCAyMDcyLCAyMDY0LCAyMDU2LCAyMDQ4LAorICAyMDQwLCAyMDMyLCAyMDI0LCAyMDE2LCAyMDA4LCAyMDAxLCAxOTkzLCAxOTg1LAorICAxOTc4LCAxOTcxLCAxOTYzLCAxOTU2LCAxOTQ5LCAxOTQxLCAxOTM0LCAxOTI3LAorICAxOTIwLCAxOTEzLCAxOTA2LCAxODk5LCAxODkyLCAxODg1LCAxODc5LCAxODcyLAorICAxODY1LCAxODU5LCAxODUyLCAxODQ2LCAxODM5LCAxODMzLCAxODI2LCAxODIwLAorICAxODE0LCAxODA3LCAxODAxLCAxNzk1LCAxNzg5LCAxNzgzLCAxNzc3LCAxNzcxLAorICAxNzY1LCAxNzU5LCAxNzUzLCAxNzQ3LCAxNzQxLCAxNzM2LCAxNzMwLCAxNzI0LAorICAxNzE4LCAxNzEzLCAxNzA3LCAxNzAyLCAxNjk2LCAxNjkxLCAxNjg1LCAxNjgwLAorICAxNjc1LCAxNjY5LCAxNjY0LCAxNjU5LCAxNjUzLCAxNjQ4LCAxNjQzLCAxNjM4LAorICAxNjMzLCAxNjI4LCAxNjIzLCAxNjE4LCAxNjEzLCAxNjA4LCAxNjAzLCAxNTk4LAorICAxNTkzLCAxNTg4LCAxNTgzLCAxNTc5LCAxNTc0LCAxNTY5LCAxNTY1LCAxNTYwLAorICAxNTU1LCAxNTUxLCAxNTQ2LCAxNTQyLCAxNTM3LCAxNTMzLCAxNTI4LCAxNTI0LAorICAxNTE5LCAxNTE1LCAxNTEwLCAxNTA2LCAxNTAyLCAxNDk3LCAxNDkzLCAxNDg5LAorICAxNDg1LCAxNDgxLCAxNDc2LCAxNDcyLCAxNDY4LCAxNDY0LCAxNDYwLCAxNDU2LAorICAxNDUyLCAxNDQ4LCAxNDQ0LCAxNDQwLCAxNDM2LCAxNDMyLCAxNDI4LCAxNDI0LAorICAxNDIwLCAxNDE2LCAxNDEzLCAxNDA5LCAxNDA1LCAxNDAxLCAxMzk4LCAxMzk0LAorICAxMzkwLCAxMzg3LCAxMzgzLCAxMzc5LCAxMzc2LCAxMzcyLCAxMzY4LCAxMzY1LAorICAxMzYxLCAxMzU4LCAxMzU0LCAxMzUxLCAxMzQ3LCAxMzQ0LCAxMzQwLCAxMzM3LAorICAxMzM0LCAxMzMwLCAxMzI3LCAxMzIzLCAxMzIwLCAxMzE3LCAxMzE0LCAxMzEwLAorICAxMzA3LCAxMzA0LCAxMzAwLCAxMjk3LCAxMjk0LCAxMjkxLCAxMjg4LCAxMjg1LAorICAxMjgxLCAxMjc4LCAxMjc1LCAxMjcyLCAxMjY5LCAxMjY2LCAxMjYzLCAxMjYwLAorICAxMjU3LCAxMjU0LCAxMjUxLCAxMjQ4LCAxMjQ1LCAxMjQyLCAxMjM5LCAxMjM2LAorICAxMjMzLCAxMjMwLCAxMjI3LCAxMjI0LCAxMjIyLCAxMjE5LCAxMjE2LCAxMjEzLAorICAxMjEwLCAxMjA4LCAxMjA1LCAxMjAyLCAxMTk5LCAxMTk3LCAxMTk0LCAxMTkxLAorICAxMTg4LCAxMTg2LCAxMTgzLCAxMTgwLCAxMTc4LCAxMTc1LCAxMTcyLCAxMTcwLAorICAxMTY3LCAxMTY1LCAxMTYyLCAxMTU5LCAxMTU3LCAxMTU0LCAxMTUyLCAxMTQ5LAorICAxMTQ3LCAxMTQ0LCAxMTQyLCAxMTM5LCAxMTM3LCAxMTM0LCAxMTMyLCAxMTI5LAorICAxMTI3LCAxMTI1LCAxMTIyLCAxMTIwLCAxMTE3LCAxMTE1LCAxMTEzLCAxMTEwLAorICAxMTA4LCAxMTA2LCAxMTAzLCAxMTAxLCAxMDk5LCAxMDk2LCAxMDk0LCAxMDkyLAorICAxMDg5LCAxMDg3LCAxMDg1LCAxMDgzLCAxMDgxLCAxMDc4LCAxMDc2LCAxMDc0LAorICAxMDcyLCAxMDY5LCAxMDY3LCAxMDY1LCAxMDYzLCAxMDYxLCAxMDU5LCAxMDU3LAorICAxMDU0LCAxMDUyLCAxMDUwLCAxMDQ4LCAxMDQ2LCAxMDQ0LCAxMDQyLCAxMDQwLAorICAxMDM4LCAxMDM2LCAxMDM0LCAxMDMyLCAxMDMwLCAxMDI4LCAxMDI2LCAxMDI0LAorICAxMDIyLCAxMDIwLCAxMDE4LCAxMDE2LCAxMDE0LCAxMDEyLCAxMDEwLCAxMDA4LAorICAxMDA2LCAxMDA0LCAxMDAyLCAxMDAwLCA5OTgsIDk5NiwgOTk0LCA5OTIsCisgIDk5MSwgOTg5LCA5ODcsIDk4NSwgOTgzLCA5ODEsIDk3OSwgOTc4LAorICA5NzYsIDk3NCwgOTcyLCA5NzAsIDk2OSwgOTY3LCA5NjUsIDk2MywKKyAgOTYxLCA5NjAsIDk1OCwgOTU2LCA5NTQsIDk1MywgOTUxLCA5NDksCisgIDk0OCwgOTQ2LCA5NDQsIDk0MiwgOTQxLCA5MzksIDkzNywgOTM2LAorICA5MzQsIDkzMiwgOTMxLCA5MjksIDkyNywgOTI2LCA5MjQsIDkyMywKKyAgOTIxLCA5MTksIDkxOCwgOTE2LCA5MTQsIDkxMywgOTExLCA5MTAsCisgIDkwOCwgOTA3LCA5MDUsIDkwMywgOTAyLCA5MDAsIDg5OSwgODk3LAorICA4OTYsIDg5NCwgODkzLCA4OTEsIDg5MCwgODg4LCA4ODcsIDg4NSwKKyAgODg0LCA4ODIsIDg4MSwgODc5LCA4NzgsIDg3NiwgODc1LCA4NzMsCisgIDg3MiwgODcwLCA4NjksIDg2OCwgODY2LCA4NjUsIDg2MywgODYyLAorICA4NjAsIDg1OSwgODU4LCA4NTYsIDg1NSwgODUzLCA4NTIsIDg1MSwKKyAgODQ5LCA4NDgsIDg0NiwgODQ1LCA4NDQsIDg0MiwgODQxLCA4NDAsCisgIDgzOCwgODM3LCA4MzYsIDgzNCwgODMzLCA4MzIsIDgzMCwgODI5LAorICA4MjgsIDgyNiwgODI1LCA4MjQsIDgyMywgODIxLCA4MjAsIDgxOSwKKyAgODE3LCA4MTYsIDgxNSwgODE0LCA4MTIsIDgxMSwgODEwLCA4MDksCisgIDgwNywgODA2LCA4MDUsIDgwNCwgODAyLCA4MDEsIDgwMCwgNzk5LAorICA3OTgsIDc5NiwgNzk1LCA3OTQsIDc5MywgNzkxLCA3OTAsIDc4OSwKKyAgNzg4LCA3ODcsIDc4NiwgNzg0LCA3ODMsIDc4MiwgNzgxLCA3ODAsCisgIDc3OSwgNzc3LCA3NzYsIDc3NSwgNzc0LCA3NzMsIDc3MiwgNzcxLAorICA3NjksIDc2OCwgNzY3LCA3NjYsIDc2NSwgNzY0LCA3NjMsIDc2MiwKKyAgNzYwLCA3NTksIDc1OCwgNzU3LCA3NTYsIDc1NSwgNzU0LCA3NTMsCisgIDc1MiwgNzUxLCA3NTAsIDc0OCwgNzQ3LCA3NDYsIDc0NSwgNzQ0LAorICA3NDMsIDc0MiwgNzQxLCA3NDAsIDczOSwgNzM4LCA3MzcsIDczNiwKKyAgNzM1LCA3MzQsIDczMywgNzMyLCA3MzEsIDczMCwgNzI5LCA3MjgsCisgIDcyNywgNzI2LCA3MjUsIDcyNCwgNzIzLCA3MjIsIDcyMSwgNzIwLAorICA3MTksIDcxOCwgNzE3LCA3MTYsIDcxNSwgNzE0LCA3MTMsIDcxMiwKKyAgNzExLCA3MTAsIDcwOSwgNzA4LCA3MDcsIDcwNiwgNzA1LCA3MDQsCisgIDcwMywgNzAyLCA3MDEsIDcwMCwgNjk5LCA2OTksIDY5OCwgNjk3LAorICA2OTYsIDY5NSwgNjk0LCA2OTMsIDY5MiwgNjkxLCA2OTAsIDY4OSwKKyAgNjg4LCA2ODgsIDY4NywgNjg2LCA2ODUsIDY4NCwgNjgzLCA2ODIsCisgIDY4MSwgNjgwLCA2ODAsIDY3OSwgNjc4LCA2NzcsIDY3NiwgNjc1LAorICA2NzQsIDY3MywgNjczLCA2NzIsIDY3MSwgNjcwLCA2NjksIDY2OCwKKyAgNjY3LCA2NjcsIDY2NiwgNjY1LCA2NjQsIDY2MywgNjYyLCA2NjEsCisgIDY2MSwgNjYwLCA2NTksIDY1OCwgNjU3LCA2NTcsIDY1NiwgNjU1LAorICA2NTQsIDY1MywgNjUyLCA2NTIsIDY1MSwgNjUwLCA2NDksIDY0OCwKKyAgNjQ4LCA2NDcsIDY0NiwgNjQ1LCA2NDQsIDY0NCwgNjQzLCA2NDIsCisgIDY0MSwgNjQwLCA2NDAsIDYzOSwgNjM4LCA2MzcsIDYzNywgNjM2LAorICA2MzUsIDYzNCwgNjMzLCA2MzMsIDYzMiwgNjMxLCA2MzAsIDYzMCwKKyAgNjI5LCA2MjgsIDYyNywgNjI3LCA2MjYsIDYyNSwgNjI0LCA2MjQsCisgIDYyMywgNjIyLCA2MjEsIDYyMSwgNjIwLCA2MTksIDYxOCwgNjE4LAorICA2MTcsIDYxNiwgNjE2LCA2MTUsIDYxNCwgNjEzLCA2MTMsIDYxMiwKKyAgNjExLCA2MTEsIDYxMCwgNjA5LCA2MDgsIDYwOCwgNjA3LCA2MDYsCisgIDYwNiwgNjA1LCA2MDQsIDYwNCwgNjAzLCA2MDIsIDYwMSwgNjAxLAorICA2MDAsIDU5OSwgNTk5LCA1OTgsIDU5NywgNTk3LCA1OTYsIDU5NSwKKyAgNTk1LCA1OTQsIDU5MywgNTkzLCA1OTIsIDU5MSwgNTkxLCA1OTAsCisgIDU4OSwgNTg5LCA1ODgsIDU4NywgNTg3LCA1ODYsIDU4NSwgNTg1LAorICA1ODQsIDU4MywgNTgzLCA1ODIsIDU4MSwgNTgxLCA1ODAsIDU3OSwKKyAgNTc5LCA1NzgsIDU3OCwgNTc3LCA1NzYsIDU3NiwgNTc1LCA1NzQsCisgIDU3NCwgNTczLCA1NzIsIDU3MiwgNTcxLCA1NzEsIDU3MCwgNTY5LAorICA1NjksIDU2OCwgNTY4LCA1NjcsIDU2NiwgNTY2LCA1NjUsIDU2NCwKKyAgNTY0LCA1NjMsIDU2MywgNTYyLCA1NjEsIDU2MSwgNTYwLCA1NjAsCisgIDU1OSwgNTU4LCA1NTgsIDU1NywgNTU3LCA1NTYsIDU1NSwgNTU1LAorICA1NTQsIDU1NCwgNTUzLCA1NTMsIDU1MiwgNTUxLCA1NTEsIDU1MCwKKyAgNTUwLCA1NDksIDU0OCwgNTQ4LCA1NDcsIDU0NywgNTQ2LCA1NDYsCisgIDU0NSwgNTQ0LCA1NDQsIDU0MywgNTQzLCA1NDIsIDU0MiwgNTQxLAorICA1NDEsIDU0MCwgNTM5LCA1MzksIDUzOCwgNTM4LCA1MzcsIDUzNywKKyAgNTM2LCA1MzYsIDUzNSwgNTM0LCA1MzQsIDUzMywgNTMzLCA1MzIsCisgIDUzMiwgNTMxLCA1MzEsIDUzMCwgNTMwLCA1MjksIDUyOSwgNTI4LAorICA1MjcsIDUyNywgNTI2LCA1MjYsIDUyNSwgNTI1LCA1MjQsIDUyNCwKKyAgNTIzLCA1MjMsIDUyMiwgNTIyLCA1MjEsIDUyMSwgNTIwLCA1MjAsCisgIDUxOSwgNTE5LCA1MTgsIDUxOCwgNTE3LCA1MTcsIDUxNiwgNTE2LAorICA1MTUsIDUxNSwgNTE0LCA1MTQKK307CisKKy8vIE5vdGUgdGhhdCBMaW5lYXJUb0dhbW1hKCkgZXhwZWN0cyB0aGUgdmFsdWVzIHRvIGJlIHByZW11bHRpcGxpZWQgYnkgNCwKKy8vIHNvIHdlIGluY29ycG9yYXRlIHRoaXMgZmFjdG9yIDQgaW5zaWRlIHRoZSBESVZJREVfQllfQUxQSEEgbWFjcm8gZGlyZWN0bHkuCisjZGVmaW5lIERJVklERV9CWV9BTFBIQShzdW0sIGEpICAoKChzdW0pICoga0ludkFscGhhWyhhKV0pID4+IChrQWxwaGFGaXggLSAyKSkKKworI2Vsc2UKKworI2RlZmluZSBESVZJREVfQllfQUxQSEEoc3VtLCBhKSAoNCAqIChzdW0pIC8gKGEpKQorCisjZW5kaWYgIC8vIFVTRV9JTlZFUlNFX0FMUEhBX1RBQkxFCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgTGluZWFyVG9HYW1tYVdlaWdodGVkKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdG90YWxfYSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdiX3N0cmlkZSkgeworICBjb25zdCB1aW50MzJfdCBzdW0gPQorICAgICAgYV9wdHJbMF0gKiBHYW1tYVRvTGluZWFyKHNyY1swXSkgKworICAgICAgYV9wdHJbc3RlcF0gKiBHYW1tYVRvTGluZWFyKHNyY1tzdGVwXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZV0gKiBHYW1tYVRvTGluZWFyKHNyY1tyZ2Jfc3RyaWRlXSkgKworICAgICAgYV9wdHJbcmdiX3N0cmlkZSArIHN0ZXBdICogR2FtbWFUb0xpbmVhcihzcmNbcmdiX3N0cmlkZSArIHN0ZXBdKTsKKyAgYXNzZXJ0KHRvdGFsX2EgPiAwICYmIHRvdGFsX2EgPD0gNCAqIDB4ZmYpOworI2lmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisgIGFzc2VydCgodWludDY0X3Qpc3VtICoga0ludkFscGhhW3RvdGFsX2FdIDwgKCh1aW50NjRfdCkxIDw8IDMyKSk7CisjZW5kaWYKKyAgcmV0dXJuIExpbmVhclRvR2FtbWEoRElWSURFX0JZX0FMUEhBKHN1bSwgdG90YWxfYSksIDApOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93VG9ZKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhSYW5kb20qIGNvbnN0IHJnKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIGogKz0gc3RlcCkgeworICAgIGRzdF95W2ldID0gUkdCVG9ZKHJfcHRyW2pdLCBnX3B0cltqXSwgYl9wdHJbal0sIHJnKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCQShjb25zdCB1aW50OF90KiBjb25zdCByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICAvLyB3ZSBsb29wIG92ZXIgMngyIGJsb2NrcyBhbmQgcHJvZHVjZSBvbmUgUi9HL0IvQSB2YWx1ZSBmb3IgZWFjaC4KKyAgZm9yIChpID0gMCwgaiA9IDA7IGkgPCAod2lkdGggPj4gMSk7IGkgKz0gMSwgaiArPSAyICogNCwgZHN0ICs9IDQpIHsKKyAgICBjb25zdCB1aW50MzJfdCBhID0gU1VNNEFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNNChyX3B0ciArIGosIDQpOworICAgICAgZyA9IFNVTTQoZ19wdHIgKyBqLCA0KTsKKyAgICAgIGIgPSBTVU00KGJfcHRyICsgaiwgNCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDQsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgNCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCA0LCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorICBpZiAod2lkdGggJiAxKSB7CisgICAgY29uc3QgdWludDMyX3QgYSA9IDJ1ICogU1VNMkFMUEhBKGFfcHRyICsgaik7CisgICAgaW50IHIsIGcsIGI7CisgICAgaWYgKGEgPT0gNCAqIDB4ZmYgfHwgYSA9PSAwKSB7CisgICAgICByID0gU1VNMihyX3B0ciArIGopOworICAgICAgZyA9IFNVTTIoZ19wdHIgKyBqKTsKKyAgICAgIGIgPSBTVU0yKGJfcHRyICsgaik7CisgICAgfSBlbHNlIHsKKyAgICAgIHIgPSBMaW5lYXJUb0dhbW1hV2VpZ2h0ZWQocl9wdHIgKyBqLCBhX3B0ciArIGosIGEsIDAsIHJnYl9zdHJpZGUpOworICAgICAgZyA9IExpbmVhclRvR2FtbWFXZWlnaHRlZChnX3B0ciArIGosIGFfcHRyICsgaiwgYSwgMCwgcmdiX3N0cmlkZSk7CisgICAgICBiID0gTGluZWFyVG9HYW1tYVdlaWdodGVkKGJfcHRyICsgaiwgYV9wdHIgKyBqLCBhLCAwLCByZ2Jfc3RyaWRlKTsKKyAgICB9CisgICAgZHN0WzBdID0gcjsKKyAgICBkc3RbMV0gPSBnOworICAgIGRzdFsyXSA9IGI7CisgICAgZHN0WzNdID0gYTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBY2N1bXVsYXRlUkdCKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBnX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QqIGRzdCwgaW50IHdpZHRoKSB7CisgIGludCBpLCBqOworICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8ICh3aWR0aCA+PiAxKTsgaSArPSAxLCBqICs9IDIgKiBzdGVwLCBkc3QgKz0gNCkgeworICAgIGRzdFswXSA9IFNVTTQocl9wdHIgKyBqLCBzdGVwKTsKKyAgICBkc3RbMV0gPSBTVU00KGdfcHRyICsgaiwgc3RlcCk7CisgICAgZHN0WzJdID0gU1VNNChiX3B0ciArIGosIHN0ZXApOworICB9CisgIGlmICh3aWR0aCAmIDEpIHsKKyAgICBkc3RbMF0gPSBTVU0yKHJfcHRyICsgaik7CisgICAgZHN0WzFdID0gU1VNMihnX3B0ciArIGopOworICAgIGRzdFsyXSA9IFNVTTIoYl9wdHIgKyBqKTsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBDb252ZXJ0Um93c1RvVVYoY29uc3QgdWludDE2X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3RfdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4UmFuZG9tKiBjb25zdCByZykgeworICBpbnQgaTsKKyAgZm9yIChpID0gMDsgaSA8IHdpZHRoOyBpICs9IDEsIHJnYiArPSA0KSB7CisgICAgY29uc3QgaW50IHIgPSByZ2JbMF0sIGcgPSByZ2JbMV0sIGIgPSByZ2JbMl07CisgICAgZHN0X3VbaV0gPSBSR0JUb1UociwgZywgYiwgcmcpOworICAgIGRzdF92W2ldID0gUkdCVG9WKHIsIGcsIGIsIHJnKTsKKyAgfQorfQorCitzdGF0aWMgaW50IEltcG9ydFlVVkFGcm9tUkdCQShjb25zdCB1aW50OF90KiByX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGdfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYl9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCAgICAgICAgIC8vIGJ5dGVzIHBlciBwaXhlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYl9zdHJpZGUsICAgLy8gYnl0ZXMgcGVyIHNjYW5saW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXRoZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgaW50IHk7CisgIGNvbnN0IGludCB3aWR0aCA9IHBpY3R1cmUtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICBjb25zdCBpbnQgaGFzX2FscGhhID0gQ2hlY2tOb25PcGFxdWUoYV9wdHIsIHdpZHRoLCBoZWlnaHQsIHN0ZXAsIHJnYl9zdHJpZGUpOworICBjb25zdCBpbnQgaXNfcmdiID0gKHJfcHRyIDwgYl9wdHIpOyAgLy8gb3RoZXJ3aXNlIGl0J3MgYmdyCisKKyAgcGljdHVyZS0+Y29sb3JzcGFjZSA9IGhhc19hbHBoYSA/IFdFQlBfWVVWNDIwQSA6IFdFQlBfWVVWNDIwOworICBwaWN0dXJlLT51c2VfYXJnYiA9IDA7CisKKyAgLy8gZGlzYWJsZSBzbWFydCBjb252ZXJzaW9uIGlmIHNvdXJjZSBpcyB0b28gc21hbGwgKG92ZXJraWxsKS4KKyAgaWYgKHdpZHRoIDwga01pbkRpbWVuc2lvbkl0ZXJhdGl2ZUNvbnZlcnNpb24gfHwKKyAgICAgIGhlaWdodCA8IGtNaW5EaW1lbnNpb25JdGVyYXRpdmVDb252ZXJzaW9uKSB7CisgICAgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uID0gMDsKKyAgfQorCisgIGlmICghV2ViUFBpY3R1cmVBbGxvY1lVVkEocGljdHVyZSwgd2lkdGgsIGhlaWdodCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoaGFzX2FscGhhKSB7CisgICAgYXNzZXJ0KHN0ZXAgPT0gNCk7CisjaWYgZGVmaW5lZChVU0VfR0FNTUFfQ09NUFJFU1NJT04pICYmIGRlZmluZWQoVVNFX0lOVkVSU0VfQUxQSEFfVEFCTEUpCisgICAgYXNzZXJ0KGtBbHBoYUZpeCArIGtHYW1tYUZpeCA8PSAzMSk7CisjZW5kaWYKKyAgfQorCisgIGlmICh1c2VfaXRlcmF0aXZlX2NvbnZlcnNpb24pIHsKKyAgICBJbml0R2FtbWFUYWJsZXNTKCk7CisgICAgaWYgKCFQcmVwcm9jZXNzQVJHQihyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLCBwaWN0dXJlKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChoYXNfYWxwaGEpIHsKKyAgICAgIFdlYlBFeHRyYWN0QWxwaGEoYV9wdHIsIHJnYl9zdHJpZGUsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUtPmEsIHBpY3R1cmUtPmFfc3RyaWRlKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHdpZHRoICsgMSkgPj4gMTsKKyAgICBpbnQgdXNlX2RzcCA9IChzdGVwID09IDMpOyAgLy8gdXNlIHNwZWNpYWwgZnVuY3Rpb24gaW4gdGhpcyBjYXNlCisgICAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGFjY3VtdWxhdGVkIFIvRy9CIHZhbHVlcyBkdXJpbmcgY29udmVyc2lvbiB0byBVL1YKKyAgICB1aW50MTZfdCogY29uc3QgdG1wX3JnYiA9CisgICAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoNCAqIHV2X3dpZHRoLCBzaXplb2YoKnRtcF9yZ2IpKTsKKyAgICB1aW50OF90KiBkc3RfeSA9IHBpY3R1cmUtPnk7CisgICAgdWludDhfdCogZHN0X3UgPSBwaWN0dXJlLT51OworICAgIHVpbnQ4X3QqIGRzdF92ID0gcGljdHVyZS0+djsKKyAgICB1aW50OF90KiBkc3RfYSA9IHBpY3R1cmUtPmE7CisKKyAgICBWUDhSYW5kb20gYmFzZV9yZzsKKyAgICBWUDhSYW5kb20qIHJnID0gTlVMTDsKKyAgICBpZiAoZGl0aGVyaW5nID4gMC4pIHsKKyAgICAgIFZQOEluaXRSYW5kb20oJmJhc2VfcmcsIGRpdGhlcmluZyk7CisgICAgICByZyA9ICZiYXNlX3JnOworICAgICAgdXNlX2RzcCA9IDA7ICAgLy8gY2FuJ3QgdXNlIGRzcCBpbiB0aGlzIGNhc2UKKyAgICB9CisgICAgV2ViUEluaXRDb252ZXJ0QVJHQlRvWVVWKCk7CisgICAgSW5pdEdhbW1hVGFibGVzKCk7CisKKyAgICBpZiAodG1wX3JnYiA9PSBOVUxMKSByZXR1cm4gMDsgIC8vIG1hbGxvYyBlcnJvcgorCisgICAgLy8gRG93bnNhbXBsZSBZL1UvViBwbGFuZXMsIHR3byByb3dzIGF0IGEgdGltZQorICAgIGZvciAoeSA9IDA7IHkgPCAoaGVpZ2h0ID4+IDEpOyArK3kpIHsKKyAgICAgIGludCByb3dzX2hhdmVfYWxwaGEgPSBoYXNfYWxwaGE7CisgICAgICBpZiAodXNlX2RzcCkgeworICAgICAgICBpZiAoaXNfcmdiKSB7CisgICAgICAgICAgV2ViUENvbnZlcnRSR0IyNFRvWShyX3B0ciwgZHN0X3ksIHdpZHRoKTsKKyAgICAgICAgICBXZWJQQ29udmVydFJHQjI0VG9ZKHJfcHRyICsgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBXZWJQQ29udmVydEJHUjI0VG9ZKGJfcHRyLCBkc3RfeSwgd2lkdGgpOworICAgICAgICAgIFdlYlBDb252ZXJ0QkdSMjRUb1koYl9wdHIgKyByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgd2lkdGgpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHN0ZXAsIGRzdF95LCB3aWR0aCwgcmcpOworICAgICAgICBDb252ZXJ0Um93VG9ZKHJfcHRyICsgcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBnX3B0ciArIHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgYl9wdHIgKyByZ2Jfc3RyaWRlLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGRzdF95ICsgcGljdHVyZS0+eV9zdHJpZGUsIHdpZHRoLCByZyk7CisgICAgICB9CisgICAgICBkc3RfeSArPSAyICogcGljdHVyZS0+eV9zdHJpZGU7CisgICAgICBpZiAoaGFzX2FscGhhKSB7CisgICAgICAgIHJvd3NfaGF2ZV9hbHBoYSAmPSAhV2ViUEV4dHJhY3RBbHBoYShhX3B0ciwgcmdiX3N0cmlkZSwgd2lkdGgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYSwgcGljdHVyZS0+YV9zdHJpZGUpOworICAgICAgICBkc3RfYSArPSAyICogcGljdHVyZS0+YV9zdHJpZGU7CisgICAgICB9CisgICAgICAvLyBDb2xsZWN0IGF2ZXJhZ2VkIFIvRy9CKC9BKQorICAgICAgaWYgKCFyb3dzX2hhdmVfYWxwaGEpIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQihyX3B0ciwgZ19wdHIsIGJfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLCB0bXBfcmdiLCB3aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBY2N1bXVsYXRlUkdCQShyX3B0ciwgZ19wdHIsIGJfcHRyLCBhX3B0ciwgcmdiX3N0cmlkZSwgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfQorICAgICAgLy8gQ29udmVydCB0byBVL1YKKyAgICAgIGlmIChyZyA9PSBOVUxMKSB7CisgICAgICAgIFdlYlBDb252ZXJ0UkdCQTMyVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnZlcnRSb3dzVG9VVih0bXBfcmdiLCBkc3RfdSwgZHN0X3YsIHV2X3dpZHRoLCByZyk7CisgICAgICB9CisgICAgICBkc3RfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBkc3RfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICByX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICAgIGJfcHRyICs9IDIgKiByZ2Jfc3RyaWRlOworICAgICAgZ19wdHIgKz0gMiAqIHJnYl9zdHJpZGU7CisgICAgICBpZiAoaGFzX2FscGhhKSBhX3B0ciArPSAyICogcmdiX3N0cmlkZTsKKyAgICB9CisgICAgaWYgKGhlaWdodCAmIDEpIHsgICAgLy8gZXh0cmEgbGFzdCByb3cKKyAgICAgIGludCByb3dfaGFzX2FscGhhID0gaGFzX2FscGhhOworICAgICAgaWYgKHVzZV9kc3ApIHsKKyAgICAgICAgaWYgKHJfcHRyIDwgYl9wdHIpIHsKKyAgICAgICAgICBXZWJQQ29udmVydFJHQjI0VG9ZKHJfcHRyLCBkc3RfeSwgd2lkdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdlYlBDb252ZXJ0QkdSMjRUb1koYl9wdHIsIGRzdF95LCB3aWR0aCk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENvbnZlcnRSb3dUb1kocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgZHN0X3ksIHdpZHRoLCByZyk7CisgICAgICB9CisgICAgICBpZiAocm93X2hhc19hbHBoYSkgeworICAgICAgICByb3dfaGFzX2FscGhhICY9ICFXZWJQRXh0cmFjdEFscGhhKGFfcHRyLCAwLCB3aWR0aCwgMSwgZHN0X2EsIDApOworICAgICAgfQorICAgICAgLy8gQ29sbGVjdCBhdmVyYWdlZCBSL0cvQigvQSkKKyAgICAgIGlmICghcm93X2hhc19hbHBoYSkgeworICAgICAgICAvLyBDb2xsZWN0IGF2ZXJhZ2VkIFIvRy9CCisgICAgICAgIEFjY3VtdWxhdGVSR0Iocl9wdHIsIGdfcHRyLCBiX3B0ciwgc3RlcCwgLyogcmdiX3N0cmlkZSA9ICovIDAsCisgICAgICAgICAgICAgICAgICAgICAgdG1wX3JnYiwgd2lkdGgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWNjdW11bGF0ZVJHQkEocl9wdHIsIGdfcHRyLCBiX3B0ciwgYV9wdHIsIC8qIHJnYl9zdHJpZGUgPSAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgICB0bXBfcmdiLCB3aWR0aCk7CisgICAgICB9CisgICAgICBpZiAocmcgPT0gTlVMTCkgeworICAgICAgICBXZWJQQ29udmVydFJHQkEzMlRvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDb252ZXJ0Um93c1RvVVYodG1wX3JnYiwgZHN0X3UsIGRzdF92LCB1dl93aWR0aCwgcmcpOworICAgICAgfQorICAgIH0KKyAgICBXZWJQU2FmZUZyZWUodG1wX3JnYik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBTVU00CisjdW5kZWYgU1VNMgorI3VuZGVmIFNVTTRBTFBIQQorI3VuZGVmIFNVTTJBTFBIQQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbCBmb3IgQVJHQi0+WVVWQSBjb252ZXJzaW9uCisKK3N0YXRpYyBpbnQgUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGl0aGVyaW5nLCBpbnQgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uKSB7CisgIGlmIChwaWN0dXJlID09IE5VTEwpIHJldHVybiAwOworICBpZiAocGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9IGVsc2UgaWYgKChjb2xvcnNwYWNlICYgV0VCUF9DU1BfVVZfTUFTSykgIT0gV0VCUF9ZVVY0MjApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOworICB9IGVsc2UgeworICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGFyZ2IgPSAoY29uc3QgdWludDhfdCopcGljdHVyZS0+YXJnYjsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBhID0gYXJnYiArICgwIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCByID0gYXJnYiArICgxIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBnID0gYXJnYiArICgyIF4gQUxQSEFfT0ZGU0VUKTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBiID0gYXJnYiArICgzIF4gQUxQSEFfT0ZGU0VUKTsKKworICAgIHBpY3R1cmUtPmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMDsKKyAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHIsIGcsIGIsIGEsIDQsIDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpdGhlcmluZywgdXNlX2l0ZXJhdGl2ZV9jb252ZXJzaW9uLCBwaWN0dXJlKTsKKyAgfQorfQorCitpbnQgV2ViUFBpY3R1cmVBUkdCVG9ZVVZBRGl0aGVyZWQoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaXRoZXJpbmcpIHsKKyAgcmV0dXJuIFBpY3R1cmVBUkdCVG9ZVVZBKHBpY3R1cmUsIGNvbG9yc3BhY2UsIGRpdGhlcmluZywgMCk7Cit9CisKK2ludCBXZWJQUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsIFdlYlBFbmNDU1AgY29sb3JzcGFjZSkgeworICByZXR1cm4gUGljdHVyZUFSR0JUb1lVVkEocGljdHVyZSwgY29sb3JzcGFjZSwgMC5mLCAwKTsKK30KKworaW50IFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBKFdlYlBQaWN0dXJlKiBwaWN0dXJlKSB7CisgIHJldHVybiBQaWN0dXJlQVJHQlRvWVVWQShwaWN0dXJlLCBXRUJQX1lVVjQyMCwgMC5mLCAxKTsKK30KKy8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CitpbnQgV2ViUFBpY3R1cmVTbWFydEFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgcmV0dXJuIFdlYlBQaWN0dXJlU2hhcnBBUkdCVG9ZVVZBKHBpY3R1cmUpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gY2FsbCBmb3IgWVVWQSAtPiBBUkdCIGNvbnZlcnNpb24KKworaW50IFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKHBpY3R1cmUtPnkgPT0gTlVMTCB8fCBwaWN0dXJlLT51ID09IE5VTEwgfHwgcGljdHVyZS0+diA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVCkgJiYgcGljdHVyZS0+YSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOworICB9CisgIGlmICgocGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0spICE9IFdFQlBfWVVWNDIwKSB7CisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OKTsKKyAgfQorICAvLyBBbGxvY2F0ZSBhIG5ldyBhcmdiIGJ1ZmZlciAoZGlzY2FyZGluZyB0aGUgcHJldmlvdXMgb25lKS4KKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jQVJHQihwaWN0dXJlLCBwaWN0dXJlLT53aWR0aCwgcGljdHVyZS0+aGVpZ2h0KSkgcmV0dXJuIDA7CisgIHBpY3R1cmUtPnVzZV9hcmdiID0gMTsKKworICAvLyBDb252ZXJ0CisgIHsKKyAgICBpbnQgeTsKKyAgICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICAgIGNvbnN0IGludCBhcmdiX3N0cmlkZSA9IDQgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICB1aW50OF90KiBkc3QgPSAodWludDhfdCopcGljdHVyZS0+YXJnYjsKKyAgICBjb25zdCB1aW50OF90ICpjdXJfdSA9IHBpY3R1cmUtPnUsICpjdXJfdiA9IHBpY3R1cmUtPnYsICpjdXJfeSA9IHBpY3R1cmUtPnk7CisgICAgV2ViUFVwc2FtcGxlTGluZVBhaXJGdW5jIHVwc2FtcGxlID0KKyAgICAgICAgV2ViUEdldExpbmVQYWlyQ29udmVydGVyKEFMUEhBX09GRlNFVCA+IDApOworCisgICAgLy8gRmlyc3Qgcm93LCB3aXRoIHJlcGxpY2F0ZWQgdG9wIHNhbXBsZXMuCisgICAgdXBzYW1wbGUoY3VyX3ksIE5VTEwsIGN1cl91LCBjdXJfdiwgY3VyX3UsIGN1cl92LCBkc3QsIE5VTEwsIHdpZHRoKTsKKyAgICBjdXJfeSArPSBwaWN0dXJlLT55X3N0cmlkZTsKKyAgICBkc3QgKz0gYXJnYl9zdHJpZGU7CisgICAgLy8gQ2VudGVyIHJvd3MuCisgICAgZm9yICh5ID0gMTsgeSArIDEgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgdG9wX3UgPSBjdXJfdTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcF92ID0gY3VyX3Y7CisgICAgICBjdXJfdSArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICBjdXJfdiArPSBwaWN0dXJlLT51dl9zdHJpZGU7CisgICAgICB1cHNhbXBsZShjdXJfeSwgY3VyX3kgKyBwaWN0dXJlLT55X3N0cmlkZSwgdG9wX3UsIHRvcF92LCBjdXJfdSwgY3VyX3YsCisgICAgICAgICAgICAgICBkc3QsIGRzdCArIGFyZ2Jfc3RyaWRlLCB3aWR0aCk7CisgICAgICBjdXJfeSArPSAyICogcGljdHVyZS0+eV9zdHJpZGU7CisgICAgICBkc3QgKz0gMiAqIGFyZ2Jfc3RyaWRlOworICAgIH0KKyAgICAvLyBMYXN0IHJvdyAoaWYgbmVlZGVkKSwgd2l0aCByZXBsaWNhdGVkIGJvdHRvbSBzYW1wbGVzLgorICAgIGlmIChoZWlnaHQgPiAxICYmICEoaGVpZ2h0ICYgMSkpIHsKKyAgICAgIHVwc2FtcGxlKGN1cl95LCBOVUxMLCBjdXJfdSwgY3VyX3YsIGN1cl91LCBjdXJfdiwgZHN0LCBOVUxMLCB3aWR0aCk7CisgICAgfQorICAgIC8vIEluc2VydCBhbHBoYSB2YWx1ZXMgaWYgbmVlZGVkLCBpbiByZXBsYWNlbWVudCBmb3IgdGhlIGRlZmF1bHQgMHhmZiBvbmVzLgorICAgIGlmIChwaWN0dXJlLT5jb2xvcnNwYWNlICYgV0VCUF9DU1BfQUxQSEFfQklUKSB7CisgICAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2JfZHN0ID0gcGljdHVyZS0+YXJnYiArIHkgKiBwaWN0dXJlLT5hcmdiX3N0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gcGljdHVyZS0+YSArIHkgKiBwaWN0dXJlLT5hX3N0cmlkZTsKKyAgICAgICAgaW50IHg7CisgICAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgICAgYXJnYl9kc3RbeF0gPSAoYXJnYl9kc3RbeF0gJiAweDAwZmZmZmZmdSkgfCAoKHVpbnQzMl90KXNyY1t4XSA8PCAyNCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBhdXRvbWF0aWMgaW1wb3J0IC8gY29udmVyc2lvbgorCitzdGF0aWMgaW50IEltcG9ydChXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IHN3YXBfcmIsIGludCBpbXBvcnRfYWxwaGEpIHsKKyAgaW50IHk7CisgIC8vIHN3YXBfcmIgLT4gYixnLHIsYSAsICFzd2FwX3JiIC0+IHIsZyxiLGEKKyAgY29uc3QgdWludDhfdCogcl9wdHIgPSByZ2IgKyAoc3dhcF9yYiA/IDIgOiAwKTsKKyAgY29uc3QgdWludDhfdCogZ19wdHIgPSByZ2IgKyAxOworICBjb25zdCB1aW50OF90KiBiX3B0ciA9IHJnYiArIChzd2FwX3JiID8gMCA6IDIpOworICBjb25zdCBpbnQgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKworICBpZiAoIXBpY3R1cmUtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgdWludDhfdCogYV9wdHIgPSBpbXBvcnRfYWxwaGEgPyByZ2IgKyAzIDogTlVMTDsKKyAgICByZXR1cm4gSW1wb3J0WVVWQUZyb21SR0JBKHJfcHRyLCBnX3B0ciwgYl9wdHIsIGFfcHRyLCBzdGVwLCByZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC5mIC8qIG5vIGRpdGhlcmluZyAqLywgMCwgcGljdHVyZSk7CisgIH0KKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKHBpY3R1cmUpKSByZXR1cm4gMDsKKworICBWUDhMRHNwSW5pdCgpOworICBXZWJQSW5pdEFscGhhUHJvY2Vzc2luZygpOworCisgIGlmIChpbXBvcnRfYWxwaGEpIHsKKyAgICAvLyBkc3RbXSBieXRlIG9yZGVyIGlzIHthLHIsZyxifSBmb3IgYmlnLWVuZGlhbiwge2IsZyxyLGF9IGZvciBsaXR0bGUgZW5kaWFuCisgICAgdWludDMyX3QqIGRzdCA9IHBpY3R1cmUtPmFyZ2I7CisgICAgY29uc3QgaW50IGRvX2NvcHkgPSAoQUxQSEFfT0ZGU0VUID09IDMpICYmIHN3YXBfcmI7CisgICAgYXNzZXJ0KHN0ZXAgPT0gNCk7CisgICAgaWYgKGRvX2NvcHkpIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBtZW1jcHkoZHN0LCByZ2IsIHdpZHRoICogNCk7CisgICAgICAgIHJnYiArPSByZ2Jfc3RyaWRlOworICAgICAgICBkc3QgKz0gcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorICAgICAgICAvLyBCR1JBIG9yIFJHQkEgaW5wdXQgb3JkZXIuCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFfcHRyID0gcmdiICsgMzsKKyAgICAgICAgV2ViUFBhY2tBUkdCKGFfcHRyLCByX3B0ciwgZ19wdHIsIGJfcHRyLCB3aWR0aCwgZHN0KTsKKyAgICAgICAgcl9wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgZ19wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgYl9wdHIgKz0gcmdiX3N0cmlkZTsKKyNlbHNlCisgICAgICAgIC8vIFJHQkEgaW5wdXQgb3JkZXIuIE5lZWQgdG8gc3dhcCBSIGFuZCBCLgorICAgICAgICBWUDhMQ29udmVydEJHUkFUb1JHQkEoKGNvbnN0IHVpbnQzMl90KilyZ2IsIHdpZHRoLCAodWludDhfdCopZHN0KTsKKyNlbmRpZgorICAgICAgICByZ2IgKz0gcmdiX3N0cmlkZTsKKyAgICAgICAgZHN0ICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICB1aW50MzJfdCogZHN0ID0gcGljdHVyZS0+YXJnYjsKKyAgICBhc3NlcnQoc3RlcCA+PSAzKTsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIFdlYlBQYWNrUkdCKHJfcHRyLCBnX3B0ciwgYl9wdHIsIHdpZHRoLCBzdGVwLCBkc3QpOworICAgICAgcl9wdHIgKz0gcmdiX3N0cmlkZTsKKyAgICAgIGdfcHRyICs9IHJnYl9zdHJpZGU7CisgICAgICBiX3B0ciArPSByZ2Jfc3RyaWRlOworICAgICAgZHN0ICs9IHBpY3R1cmUtPmFyZ2Jfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUHVibGljIEFQSQorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfQ1NQKQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1IoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQgcmdiX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2IgIT0gTlVMTCkKKyAgICAgICAgICAgICA/IEltcG9ydChwaWN0dXJlLCByZ2IsIHJnYl9zdHJpZGUsIDMsIDEsIDApCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAxKQorICAgICAgICAgICAgIDogMDsKK30KKworCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAxLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworI2VuZGlmICAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKK2ludCBXZWJQUGljdHVyZUltcG9ydFJHQihXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2IsIGludCByZ2Jfc3RyaWRlKSB7CisgIHJldHVybiAocGljdHVyZSAhPSBOVUxMICYmIHJnYiAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYiwgcmdiX3N0cmlkZSwgMywgMCwgMCkKKyAgICAgICAgICAgICA6IDA7Cit9CisKK2ludCBXZWJQUGljdHVyZUltcG9ydFJHQkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYmEsIGludCByZ2JhX3N0cmlkZSkgeworICByZXR1cm4gKHBpY3R1cmUgIT0gTlVMTCAmJiByZ2JhICE9IE5VTEwpCisgICAgICAgICAgICAgPyBJbXBvcnQocGljdHVyZSwgcmdiYSwgcmdiYV9zdHJpZGUsIDQsIDAsIDEpCisgICAgICAgICAgICAgOiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKFdlYlBQaWN0dXJlKiBwaWN0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgcmdiYV9zdHJpZGUpIHsKKyAgcmV0dXJuIChwaWN0dXJlICE9IE5VTEwgJiYgcmdiYSAhPSBOVUxMKQorICAgICAgICAgICAgID8gSW1wb3J0KHBpY3R1cmUsIHJnYmEsIHJnYmFfc3RyaWRlLCA0LCAwLCAwKQorICAgICAgICAgICAgIDogMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGFmYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX2VuYy5jCkBAIC0wLDAgKzEsMzAyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgY2xhc3MgYmFzaXMKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBQaWN0dXJlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IER1bW15V3JpdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHRvIHByZXZlbnQgJ3VudXNlZCB2YXJpYWJsZScgZXJyb3IgbWVzc2FnZS4KKyAgKHZvaWQpZGF0YTsKKyAgKHZvaWQpZGF0YV9zaXplOworICAodm9pZClwaWN0dXJlOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlSW5pdEludGVybmFsKFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBpbnQgdmVyc2lvbikgeworICBpZiAoV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKHZlcnNpb24sIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsgICAvLyBjYWxsZXIvc3lzdGVtIHZlcnNpb24gbWlzbWF0Y2ghCisgIH0KKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIG1lbXNldChwaWN0dXJlLCAwLCBzaXplb2YoKnBpY3R1cmUpKTsKKyAgICBwaWN0dXJlLT53cml0ZXIgPSBEdW1teVdyaXRlcjsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX09LKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlckFSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgcGljdHVyZS0+bWVtb3J5X2FyZ2JfID0gTlVMTDsKKyAgcGljdHVyZS0+YXJnYiA9IE5VTEw7CisgIHBpY3R1cmUtPmFyZ2Jfc3RyaWRlID0gMDsKK30KKworc3RhdGljIHZvaWQgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcllVVkEoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUpIHsKKyAgcGljdHVyZS0+bWVtb3J5XyA9IE5VTEw7CisgIHBpY3R1cmUtPnkgPSBwaWN0dXJlLT51ID0gcGljdHVyZS0+diA9IHBpY3R1cmUtPmEgPSBOVUxMOworICBwaWN0dXJlLT55X3N0cmlkZSA9IHBpY3R1cmUtPnV2X3N0cmlkZSA9IDA7CisgIHBpY3R1cmUtPmFfc3RyaWRlID0gMDsKK30KKwordm9pZCBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVyQVJHQihwaWN0dXJlKTsKKyAgV2ViUFBpY3R1cmVSZXNldEJ1ZmZlcllVVkEocGljdHVyZSk7Cit9CisKK2ludCBXZWJQUGljdHVyZUFsbG9jQVJHQihXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIHZvaWQqIG1lbW9yeTsKKyAgY29uc3QgdWludDY0X3QgYXJnYl9zaXplID0gKHVpbnQ2NF90KXdpZHRoICogaGVpZ2h0OworCisgIGFzc2VydChwaWN0dXJlICE9IE5VTEwpOworCisgIFdlYlBTYWZlRnJlZShwaWN0dXJlLT5tZW1vcnlfYXJnYl8pOworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVyQVJHQihwaWN0dXJlKTsKKworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CisgIC8vIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgbWVtb3J5ID0gV2ViUFNhZmVNYWxsb2MoYXJnYl9zaXplICsgV0VCUF9BTElHTl9DU1QsIHNpemVvZigqcGljdHVyZS0+YXJnYikpOworICBpZiAobWVtb3J5ID09IE5VTEwpIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQorICBwaWN0dXJlLT5tZW1vcnlfYXJnYl8gPSBtZW1vcnk7CisgIHBpY3R1cmUtPmFyZ2IgPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtb3J5KTsKKyAgcGljdHVyZS0+YXJnYl9zdHJpZGUgPSB3aWR0aDsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBXZWJQUGljdHVyZUFsbG9jWVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIGNvbnN0IFdlYlBFbmNDU1AgdXZfY3NwID0KKyAgICAgIChXZWJQRW5jQ1NQKSgoaW50KXBpY3R1cmUtPmNvbG9yc3BhY2UgJiBXRUJQX0NTUF9VVl9NQVNLKTsKKyAgY29uc3QgaW50IGhhc19hbHBoYSA9IChpbnQpcGljdHVyZS0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKKyAgY29uc3QgaW50IHlfc3RyaWRlID0gd2lkdGg7CisgIGNvbnN0IGludCB1dl93aWR0aCA9IChpbnQpKCgoaW50NjRfdCl3aWR0aCArIDEpID4+IDEpOworICBjb25zdCBpbnQgdXZfaGVpZ2h0ID0gKGludCkoKChpbnQ2NF90KWhlaWdodCArIDEpID4+IDEpOworICBjb25zdCBpbnQgdXZfc3RyaWRlID0gdXZfd2lkdGg7CisgIGludCBhX3dpZHRoLCBhX3N0cmlkZTsKKyAgdWludDY0X3QgeV9zaXplLCB1dl9zaXplLCBhX3NpemUsIHRvdGFsX3NpemU7CisgIHVpbnQ4X3QqIG1lbTsKKworICBhc3NlcnQocGljdHVyZSAhPSBOVUxMKTsKKworICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5Xyk7CisgIFdlYlBQaWN0dXJlUmVzZXRCdWZmZXJZVVZBKHBpY3R1cmUpOworCisgIGlmICh1dl9jc3AgIT0gV0VCUF9ZVVY0MjApIHsKKyAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljdHVyZSwgVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT04pOworICB9CisKKyAgLy8gYWxwaGEKKyAgYV93aWR0aCA9IGhhc19hbHBoYSA/IHdpZHRoIDogMDsKKyAgYV9zdHJpZGUgPSBhX3dpZHRoOworICB5X3NpemUgPSAodWludDY0X3QpeV9zdHJpZGUgKiBoZWlnaHQ7CisgIHV2X3NpemUgPSAodWludDY0X3QpdXZfc3RyaWRlICogdXZfaGVpZ2h0OworICBhX3NpemUgPSAgKHVpbnQ2NF90KWFfc3RyaWRlICogaGVpZ2h0OworCisgIHRvdGFsX3NpemUgPSB5X3NpemUgKyBhX3NpemUgKyAyICogdXZfc2l6ZTsKKworICAvLyBTZWN1cml0eSBhbmQgdmFsaWRhdGlvbiBjaGVja3MKKyAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDAgfHwgICAgICAgICAgIC8vIGx1bWEvYWxwaGEgcGFyYW0gZXJyb3IKKyAgICAgIHV2X3dpZHRoIDw9IDAgfHwgdXZfaGVpZ2h0IDw9IDApIHsgICAgIC8vIHUvdiBwYXJhbSBlcnJvcgorICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOworICB9CisgIC8vIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgbWVtID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKHRvdGFsX3NpemUsIHNpemVvZigqbWVtKSk7CisgIGlmIChtZW0gPT0gTlVMTCkgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlkpOworICB9CisKKyAgLy8gRnJvbSBub3cgb24sIHdlJ3JlIGluIHRoZSBjbGVhciwgd2UgY2FuIG5vIGxvbmdlciBmYWlsLi4uCisgIHBpY3R1cmUtPm1lbW9yeV8gPSAodm9pZCopbWVtOworICBwaWN0dXJlLT55X3N0cmlkZSAgPSB5X3N0cmlkZTsKKyAgcGljdHVyZS0+dXZfc3RyaWRlID0gdXZfc3RyaWRlOworICBwaWN0dXJlLT5hX3N0cmlkZSAgPSBhX3N0cmlkZTsKKworICAvLyBUT0RPKHNrYWwpOiB3ZSBjb3VsZCBhbGlnbiB0aGUgeS91L3YgcGxhbmVzIGFuZCBhZGp1c3Qgc3RyaWRlLgorICBwaWN0dXJlLT55ID0gbWVtOworICBtZW0gKz0geV9zaXplOworCisgIHBpY3R1cmUtPnUgPSBtZW07CisgIG1lbSArPSB1dl9zaXplOworICBwaWN0dXJlLT52ID0gbWVtOworICBtZW0gKz0gdXZfc2l6ZTsKKworICBpZiAoYV9zaXplID4gMCkgeworICAgIHBpY3R1cmUtPmEgPSBtZW07CisgICAgbWVtICs9IGFfc2l6ZTsKKyAgfQorICAodm9pZCltZW07ICAvLyBtYWtlcyB0aGUgc3RhdGljIGFuYWx5emVyIGhhcHB5CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSkgeworICBpZiAocGljdHVyZSAhPSBOVUxMKSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgICAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKworICAgIFdlYlBQaWN0dXJlRnJlZShwaWN0dXJlKTsgICAvLyBlcmFzZSBwcmV2aW91cyBidWZmZXIKKworICAgIGlmICghcGljdHVyZS0+dXNlX2FyZ2IpIHsKKyAgICAgIHJldHVybiBXZWJQUGljdHVyZUFsbG9jWVVWQShwaWN0dXJlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFdlYlBQaWN0dXJlQWxsb2NBUkdCKHBpY3R1cmUsIHdpZHRoLCBoZWlnaHQpOworICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKwordm9pZCBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgIT0gTlVMTCkgeworICAgIFdlYlBTYWZlRnJlZShwaWN0dXJlLT5tZW1vcnlfKTsKKyAgICBXZWJQU2FmZUZyZWUocGljdHVyZS0+bWVtb3J5X2FyZ2JfKTsKKyAgICBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhwaWN0dXJlKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gV2ViUE1lbW9yeVdyaXRlcjogV3JpdGUtdG8tbWVtb3J5CisKK3ZvaWQgV2ViUE1lbW9yeVdyaXRlckluaXQoV2ViUE1lbW9yeVdyaXRlciogd3JpdGVyKSB7CisgIHdyaXRlci0+bWVtID0gTlVMTDsKKyAgd3JpdGVyLT5zaXplID0gMDsKKyAgd3JpdGVyLT5tYXhfc2l6ZSA9IDA7Cit9CisKK2ludCBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgdyA9IChXZWJQTWVtb3J5V3JpdGVyKilwaWN0dXJlLT5jdXN0b21fcHRyOworICB1aW50NjRfdCBuZXh0X3NpemU7CisgIGlmICh3ID09IE5VTEwpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorICBuZXh0X3NpemUgPSAodWludDY0X3Qpdy0+c2l6ZSArIGRhdGFfc2l6ZTsKKyAgaWYgKG5leHRfc2l6ZSA+IHctPm1heF9zaXplKSB7CisgICAgdWludDhfdCogbmV3X21lbTsKKyAgICB1aW50NjRfdCBuZXh0X21heF9zaXplID0gMlVMTCAqIHctPm1heF9zaXplOworICAgIGlmIChuZXh0X21heF9zaXplIDwgbmV4dF9zaXplKSBuZXh0X21heF9zaXplID0gbmV4dF9zaXplOworICAgIGlmIChuZXh0X21heF9zaXplIDwgODE5MlVMTCkgbmV4dF9tYXhfc2l6ZSA9IDgxOTJVTEw7CisgICAgbmV3X21lbSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYyhuZXh0X21heF9zaXplLCAxKTsKKyAgICBpZiAobmV3X21lbSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHctPnNpemUgPiAwKSB7CisgICAgICBtZW1jcHkobmV3X21lbSwgdy0+bWVtLCB3LT5zaXplKTsKKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKHctPm1lbSk7CisgICAgdy0+bWVtID0gbmV3X21lbTsKKyAgICAvLyBkb3duLWNhc3QgaXMgb2ssIHRoYW5rcyB0byBXZWJQU2FmZU1hbGxvYworICAgIHctPm1heF9zaXplID0gKHNpemVfdCluZXh0X21heF9zaXplOworICB9CisgIGlmIChkYXRhX3NpemUgPiAwKSB7CisgICAgbWVtY3B5KHctPm1lbSArIHctPnNpemUsIGRhdGEsIGRhdGFfc2l6ZSk7CisgICAgdy0+c2l6ZSArPSBkYXRhX3NpemU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgV2ViUE1lbW9yeVdyaXRlckNsZWFyKFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcikgeworICBpZiAod3JpdGVyICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUod3JpdGVyLT5tZW0pOworICAgIHdyaXRlci0+bWVtID0gTlVMTDsKKyAgICB3cml0ZXItPnNpemUgPSAwOworICAgIHdyaXRlci0+bWF4X3NpemUgPSAwOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTaW1wbGVzdCBoaWdoLWxldmVsIGNhbGxzOgorCit0eXBlZGVmIGludCAoKkltcG9ydGVyKShXZWJQUGljdHVyZSogY29uc3QsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0LCBpbnQpOworCitzdGF0aWMgc2l6ZV90IEVuY29kZShjb25zdCB1aW50OF90KiByZ2JhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICBJbXBvcnRlciBpbXBvcnQsIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCBpbnQgbG9zc2xlc3MsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KSB7CisgIFdlYlBQaWN0dXJlIHBpYzsKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIFdlYlBNZW1vcnlXcml0ZXIgd3J0OworICBpbnQgb2s7CisKKyAgaWYgKG91dHB1dCA9PSBOVUxMKSByZXR1cm4gMDsKKworICBpZiAoIVdlYlBDb25maWdQcmVzZXQoJmNvbmZpZywgV0VCUF9QUkVTRVRfREVGQVVMVCwgcXVhbGl0eV9mYWN0b3IpIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZwaWMpKSB7CisgICAgcmV0dXJuIDA7ICAvLyBzaG91bGRuJ3QgaGFwcGVuLCBleGNlcHQgaWYgc3lzdGVtIGluc3RhbGxhdGlvbiBpcyBicm9rZW4KKyAgfQorCisgIGNvbmZpZy5sb3NzbGVzcyA9ICEhbG9zc2xlc3M7CisgIHBpYy51c2VfYXJnYiA9ICEhbG9zc2xlc3M7CisgIHBpYy53aWR0aCA9IHdpZHRoOworICBwaWMuaGVpZ2h0ID0gaGVpZ2h0OworICBwaWMud3JpdGVyID0gV2ViUE1lbW9yeVdyaXRlOworICBwaWMuY3VzdG9tX3B0ciA9ICZ3cnQ7CisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZ3cnQpOworCisgIG9rID0gaW1wb3J0KCZwaWMsIHJnYmEsIHN0cmlkZSkgJiYgV2ViUEVuY29kZSgmY29uZmlnLCAmcGljKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwaWMpOworICBpZiAoIW9rKSB7CisgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZ3cnQpOworICAgICpvdXRwdXQgPSBOVUxMOworICAgIHJldHVybiAwOworICB9CisgICpvdXRwdXQgPSB3cnQubWVtOworICByZXR1cm4gd3J0LnNpemU7Cit9CisKKyNkZWZpbmUgRU5DT0RFX0ZVTkMoTkFNRSwgSU1QT1JURVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3NpemVfdCBOQU1FKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgdywgaW50IGgsIGludCBicHMsIGZsb2F0IHEsICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIEVuY29kZShpbiwgdywgaCwgYnBzLCBJTVBPUlRFUiwgcSwgMCwgb3V0KTsgICAgICAgICAgICAgICAgICAgIFwKK30KKworRU5DT0RFX0ZVTkMoV2ViUEVuY29kZVJHQiwgV2ViUFBpY3R1cmVJbXBvcnRSR0IpCitFTkNPREVfRlVOQyhXZWJQRW5jb2RlUkdCQSwgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKQorI2lmICFkZWZpbmVkKFdFQlBfUkVEVUNFX0NTUCkKK0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVCR1IsIFdlYlBQaWN0dXJlSW1wb3J0QkdSKQorRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUJHUkEsIFdlYlBQaWN0dXJlSW1wb3J0QkdSQSkKKyNlbmRpZiAgLy8gV0VCUF9SRURVQ0VfQ1NQCisKKyN1bmRlZiBFTkNPREVfRlVOQworCisjZGVmaW5lIExPU1NMRVNTX0RFRkFVTFRfUVVBTElUWSA3MC4KKyNkZWZpbmUgTE9TU0xFU1NfRU5DT0RFX0ZVTkMoTkFNRSwgSU1QT1JURVIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc2l6ZV90IE5BTUUoY29uc3QgdWludDhfdCogaW4sIGludCB3LCBpbnQgaCwgaW50IGJwcywgdWludDhfdCoqIG91dCkgeyAgICAgICBcCisgIHJldHVybiBFbmNvZGUoaW4sIHcsIGgsIGJwcywgSU1QT1JURVIsIExPU1NMRVNTX0RFRkFVTFRfUVVBTElUWSwgMSwgb3V0KTsgIFwKK30KKworTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzUkdCLCBXZWJQUGljdHVyZUltcG9ydFJHQikKK0xPU1NMRVNTX0VOQ09ERV9GVU5DKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEsIFdlYlBQaWN0dXJlSW1wb3J0UkdCQSkKKyNpZiAhZGVmaW5lZChXRUJQX1JFRFVDRV9DU1ApCitMT1NTTEVTU19FTkNPREVfRlVOQyhXZWJQRW5jb2RlTG9zc2xlc3NCR1IsIFdlYlBQaWN0dXJlSW1wb3J0QkdSKQorTE9TU0xFU1NfRU5DT0RFX0ZVTkMoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKQorI2VuZGlmICAvLyBXRUJQX1JFRFVDRV9DU1AKKworI3VuZGVmIExPU1NMRVNTX0VOQ09ERV9GVU5DCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9wc25yX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhMmYwYmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcHNucl9lbmMuYwpAQCAtMCwwICsxLDI1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzIGZvciBtZWFzdXJpbmcgZGlzdG9ydGlvbgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKworI2lmICEoZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpIHx8IGRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkpCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJzcmMvZHNwL2RzcC5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKwordHlwZWRlZiBkb3VibGUgKCpBY2N1bXVsYXRlRnVuYykoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgaW50IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdywgaW50IGgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwtbWluIGRpc3RvcnRpb24KKy8vCisvLyBGb3IgZXZlcnkgcGl4ZWwgaW4gdGhlICpyZWZlcmVuY2UqIHBpY3R1cmUsIHdlIHNlYXJjaCBmb3IgdGhlIGxvY2FsIGJlc3QKKy8vIG1hdGNoIGluIHRoZSBjb21wcmVzc2VkIGltYWdlLiBUaGlzIGlzIG5vdCBhIHN5bW1ldHJpY2FsIG1lYXN1cmUuCisKKyNkZWZpbmUgUkFESVVTIDIgIC8vIHNlYXJjaCByYWRpdXMuIFNob3VsZG4ndCBiZSB0b28gbGFyZ2UuCisKK3N0YXRpYyBkb3VibGUgQWNjdW11bGF0ZUxTSU0oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgIGludCB4LCB5OworICBkb3VibGUgdG90YWxfc3NlID0gMC47CisgIGZvciAoeSA9IDA7IHkgPCBoOyArK3kpIHsKKyAgICBjb25zdCBpbnQgeV8wID0gKHkgLSBSQURJVVMgPCAwKSA/IDAgOiB5IC0gUkFESVVTOworICAgIGNvbnN0IGludCB5XzEgPSAoeSArIFJBRElVUyArIDEgPj0gaCkgPyBoIDogeSArIFJBRElVUyArIDE7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgY29uc3QgaW50IHhfMCA9ICh4IC0gUkFESVVTIDwgMCkgPyAwIDogeCAtIFJBRElVUzsKKyAgICAgIGNvbnN0IGludCB4XzEgPSAoeCArIFJBRElVUyArIDEgPj0gdykgPyB3IDogeCArIFJBRElVUyArIDE7CisgICAgICBkb3VibGUgYmVzdF9zc2UgPSAyNTUuICogMjU1LjsKKyAgICAgIGNvbnN0IGRvdWJsZSB2YWx1ZSA9IChkb3VibGUpcmVmW3kgKiByZWZfc3RyaWRlICsgeF07CisgICAgICBpbnQgaSwgajsKKyAgICAgIGZvciAoaiA9IHlfMDsgaiA8IHlfMTsgKytqKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHMgPSBzcmMgKyBqICogc3JjX3N0cmlkZTsKKyAgICAgICAgZm9yIChpID0geF8wOyBpIDwgeF8xOyArK2kpIHsKKyAgICAgICAgICBjb25zdCBkb3VibGUgZGlmZiA9IHNbaV0gLSB2YWx1ZTsKKyAgICAgICAgICBjb25zdCBkb3VibGUgc3NlID0gZGlmZiAqIGRpZmY7CisgICAgICAgICAgaWYgKHNzZSA8IGJlc3Rfc3NlKSBiZXN0X3NzZSA9IHNzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgdG90YWxfc3NlICs9IGJlc3Rfc3NlOworICAgIH0KKyAgfQorICByZXR1cm4gdG90YWxfc3NlOworfQorI3VuZGVmIFJBRElVUworCitzdGF0aWMgZG91YmxlIEFjY3VtdWxhdGVTU0UoY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIGludCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3LCBpbnQgaCkgeworICBpbnQgeTsKKyAgZG91YmxlIHRvdGFsX3NzZSA9IDAuOworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgdG90YWxfc3NlICs9IFZQOEFjY3VtdWxhdGVTU0Uoc3JjLCByZWYsIHcpOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIHJlZiArPSByZWZfc3RyaWRlOworICB9CisgIHJldHVybiB0b3RhbF9zc2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBkb3VibGUgQWNjdW11bGF0ZVNTSU0oY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBpbnQgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHcsIGludCBoKSB7CisgIGNvbnN0IGludCB3MCA9ICh3IDwgVlA4X1NTSU1fS0VSTkVMKSA/IHcgOiBWUDhfU1NJTV9LRVJORUw7CisgIGNvbnN0IGludCB3MSA9IHcgLSBWUDhfU1NJTV9LRVJORUwgLSAxOworICBjb25zdCBpbnQgaDAgPSAoaCA8IFZQOF9TU0lNX0tFUk5FTCkgPyBoIDogVlA4X1NTSU1fS0VSTkVMOworICBjb25zdCBpbnQgaDEgPSBoIC0gVlA4X1NTSU1fS0VSTkVMIC0gMTsKKyAgaW50IHgsIHk7CisgIGRvdWJsZSBzdW0gPSAwLjsKKyAgZm9yICh5ID0gMDsgeSA8IGgwOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoc3JjLCBzcmNfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIHgsIHksIHcsIGgpOworICAgIH0KKyAgfQorICBmb3IgKDsgeSA8IGgxOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzA7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgICAgZm9yICg7IHggPCB3MTsgKyt4KSB7CisgICAgICBjb25zdCBpbnQgb2ZmMSA9IHggLSBWUDhfU1NJTV9LRVJORUwgKyAoeSAtIFZQOF9TU0lNX0tFUk5FTCkgKiBzcmNfc3RyaWRlOworICAgICAgY29uc3QgaW50IG9mZjIgPSB4IC0gVlA4X1NTSU1fS0VSTkVMICsgKHkgLSBWUDhfU1NJTV9LRVJORUwpICogcmVmX3N0cmlkZTsKKyAgICAgIHN1bSArPSBWUDhTU0lNR2V0KHNyYyArIG9mZjEsIHNyY19zdHJpZGUsIHJlZiArIG9mZjIsIHJlZl9zdHJpZGUpOworICAgIH0KKyAgICBmb3IgKDsgeCA8IHc7ICsreCkgeworICAgICAgc3VtICs9IFZQOFNTSU1HZXRDbGlwcGVkKHNyYywgc3JjX3N0cmlkZSwgcmVmLCByZWZfc3RyaWRlLCB4LCB5LCB3LCBoKTsKKyAgICB9CisgIH0KKyAgZm9yICg7IHkgPCBoOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgICBzdW0gKz0gVlA4U1NJTUdldENsaXBwZWQoc3JjLCBzcmNfc3RyaWRlLCByZWYsIHJlZl9zdHJpZGUsIHgsIHksIHcsIGgpOworICAgIH0KKyAgfQorICByZXR1cm4gc3VtOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGlzdG9ydGlvbgorCisvLyBNYXggdmFsdWUgcmV0dXJuZWQgaW4gY2FzZSBvZiBleGFjdCBzaW1pbGFyaXR5Lgorc3RhdGljIGNvbnN0IGRvdWJsZSBrTWluRGlzdG9ydGlvbl9kQiA9IDk5LjsKKworc3RhdGljIGRvdWJsZSBHZXRQU05SKGRvdWJsZSB2LCBkb3VibGUgc2l6ZSkgeworICByZXR1cm4gKHYgPiAwLiAmJiBzaXplID4gMC4pID8gLTQuMzQyOTQ0OCAqIGxvZyh2IC8gKHNpemUgKiAyNTUgKiAyNTUuKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNaW5EaXN0b3J0aW9uX2RCOworfQorCitzdGF0aWMgZG91YmxlIEdldExvZ1NTSU0oZG91YmxlIHYsIGRvdWJsZSBzaXplKSB7CisgIHYgPSAoc2l6ZSA+IDAuKSA/IHYgLyBzaXplIDogMS47CisgIHJldHVybiAodiA8IDEuKSA/IC0xMC4wICogbG9nMTAoMS4gLSB2KSA6IGtNaW5EaXN0b3J0aW9uX2RCOworfQorCitpbnQgV2ViUFBsYW5lRGlzdG9ydGlvbihjb25zdCB1aW50OF90KiBzcmMsIHNpemVfdCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcmVmLCBzaXplX3QgcmVmX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgc2l6ZV90IHhfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCogZGlzdG9ydGlvbiwgZmxvYXQqIHJlc3VsdCkgeworICB1aW50OF90KiBhbGxvY2F0ZWQgPSBOVUxMOworICBjb25zdCBBY2N1bXVsYXRlRnVuYyBtZXRyaWMgPSAodHlwZSA9PSAwKSA/IEFjY3VtdWxhdGVTU0UgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHlwZSA9PSAxKSA/IEFjY3VtdWxhdGVTU0lNIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2N1bXVsYXRlTFNJTTsKKyAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8CisgICAgICBzcmNfc3RyaWRlIDwgeF9zdGVwICogd2lkdGggfHwgcmVmX3N0cmlkZSA8IHhfc3RlcCAqIHdpZHRoIHx8CisgICAgICByZXN1bHQgPT0gTlVMTCB8fCBkaXN0b3J0aW9uID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFZQOFNTSU1Ec3BJbml0KCk7CisgIGlmICh4X3N0ZXAgIT0gMSkgeyAgIC8vIGV4dHJhY3QgYSBwYWNrZWQgcGxhbmUgaWYgbmVlZGVkCisgICAgaW50IHgsIHk7CisgICAgdWludDhfdCogdG1wMTsKKyAgICB1aW50OF90KiB0bXAyOworICAgIGFsbG9jYXRlZCA9CisgICAgICAgICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiBoZWlnaHQsIHNpemVvZigqYWxsb2NhdGVkKSk7CisgICAgaWYgKGFsbG9jYXRlZCA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICB0bXAxID0gYWxsb2NhdGVkOworICAgIHRtcDIgPSB0bXAxICsgKHNpemVfdCl3aWR0aCAqIGhlaWdodDsKKyAgICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CisgICAgICAgIHRtcDFbeCArIHkgKiB3aWR0aF0gPSBzcmNbeCAqIHhfc3RlcCArIHkgKiBzcmNfc3RyaWRlXTsKKyAgICAgICAgdG1wMlt4ICsgeSAqIHdpZHRoXSA9IHJlZlt4ICogeF9zdGVwICsgeSAqIHJlZl9zdHJpZGVdOworICAgICAgfQorICAgIH0KKyAgICBzcmMgPSB0bXAxOworICAgIHJlZiA9IHRtcDI7CisgIH0KKyAgKmRpc3RvcnRpb24gPSAoZmxvYXQpbWV0cmljKHNyYywgd2lkdGgsIHJlZiwgd2lkdGgsIHdpZHRoLCBoZWlnaHQpOworICBXZWJQU2FmZUZyZWUoYWxsb2NhdGVkKTsKKworICAqcmVzdWx0ID0gKHR5cGUgPT0gMSkgPyAoZmxvYXQpR2V0TG9nU1NJTSgqZGlzdG9ydGlvbiwgKGRvdWJsZSl3aWR0aCAqIGhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogKGZsb2F0KUdldFBTTlIoKmRpc3RvcnRpb24sIChkb3VibGUpd2lkdGggKiBoZWlnaHQpOworICByZXR1cm4gMTsKK30KKworI2lmZGVmIFdPUkRTX0JJR0VORElBTgorI2RlZmluZSBCTFVFX09GRlNFVCAzICAgLy8gdWludDMyX3QgMHgwMDAwMDBmZiBpcyAweDAwLDAwLDAwLGZmIGluIG1lbW9yeQorI2Vsc2UKKyNkZWZpbmUgQkxVRV9PRkZTRVQgMCAgIC8vIHVpbnQzMl90IDB4MDAwMDAwZmYgaXMgMHhmZiwwMCwwMCwwMCBpbiBtZW1vcnkKKyNlbmRpZgorCitpbnQgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIGNvbnN0IFdlYlBQaWN0dXJlKiByZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBmbG9hdCByZXN1bHRzWzVdKSB7CisgIGludCB3LCBoLCBjOworICBpbnQgb2sgPSAwOworICBXZWJQUGljdHVyZSBwMCwgcDE7CisgIGRvdWJsZSB0b3RhbF9zaXplID0gMC4sIHRvdGFsX2Rpc3RvcnRpb24gPSAwLjsKKyAgaWYgKHNyYyA9PSBOVUxMIHx8IHJlZiA9PSBOVUxMIHx8CisgICAgICBzcmMtPndpZHRoICE9IHJlZi0+d2lkdGggfHwgc3JjLT5oZWlnaHQgIT0gcmVmLT5oZWlnaHQgfHwKKyAgICAgIHJlc3VsdHMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisKKyAgVlA4U1NJTURzcEluaXQoKTsKKyAgaWYgKCFXZWJQUGljdHVyZUluaXQoJnAwKSB8fCAhV2ViUFBpY3R1cmVJbml0KCZwMSkpIHJldHVybiAwOworICB3ID0gc3JjLT53aWR0aDsKKyAgaCA9IHNyYy0+aGVpZ2h0OworICBpZiAoIVdlYlBQaWN0dXJlVmlldyhzcmMsIDAsIDAsIHcsIGgsICZwMCkpIGdvdG8gRXJyb3I7CisgIGlmICghV2ViUFBpY3R1cmVWaWV3KHJlZiwgMCwgMCwgdywgaCwgJnAxKSkgZ290byBFcnJvcjsKKworICAvLyBXZSBhbHdheXMgbWVhc3VyZSBkaXN0b3J0aW9uIGluIEFSR0Igc3BhY2UuCisgIGlmIChwMC51c2VfYXJnYiA9PSAwICYmICFXZWJQUGljdHVyZVlVVkFUb0FSR0IoJnAwKSkgZ290byBFcnJvcjsKKyAgaWYgKHAxLnVzZV9hcmdiID09IDAgJiYgIVdlYlBQaWN0dXJlWVVWQVRvQVJHQigmcDEpKSBnb3RvIEVycm9yOworICBmb3IgKGMgPSAwOyBjIDwgNDsgKytjKSB7CisgICAgZmxvYXQgZGlzdG9ydGlvbjsKKyAgICBjb25zdCBzaXplX3Qgc3RyaWRlMCA9IDQgKiAoc2l6ZV90KXAwLmFyZ2Jfc3RyaWRlOworICAgIGNvbnN0IHNpemVfdCBzdHJpZGUxID0gNCAqIChzaXplX3QpcDEuYXJnYl9zdHJpZGU7CisgICAgLy8gcmVzdWx0cyBhcmUgcmVwb3J0ZWQgYXMgQkdSQQorICAgIGNvbnN0IGludCBvZmZzZXQgPSBjIF4gQkxVRV9PRkZTRVQ7CisgICAgaWYgKCFXZWJQUGxhbmVEaXN0b3J0aW9uKChjb25zdCB1aW50OF90KilwMC5hcmdiICsgb2Zmc2V0LCBzdHJpZGUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCopcDEuYXJnYiArIG9mZnNldCwgc3RyaWRlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdywgaCwgNCwgdHlwZSwgJmRpc3RvcnRpb24sIHJlc3VsdHMgKyBjKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgdG90YWxfZGlzdG9ydGlvbiArPSBkaXN0b3J0aW9uOworICAgIHRvdGFsX3NpemUgKz0gdyAqIGg7CisgIH0KKworICByZXN1bHRzWzRdID0gKHR5cGUgPT0gMSkgPyAoZmxvYXQpR2V0TG9nU1NJTSh0b3RhbF9kaXN0b3J0aW9uLCB0b3RhbF9zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoZmxvYXQpR2V0UFNOUih0b3RhbF9kaXN0b3J0aW9uLCB0b3RhbF9zaXplKTsKKyAgb2sgPSAxOworCisgRXJyb3I6CisgIFdlYlBQaWN0dXJlRnJlZSgmcDApOworICBXZWJQUGljdHVyZUZyZWUoJnAxKTsKKyAgcmV0dXJuIG9rOworfQorCisjdW5kZWYgQkxVRV9PRkZTRVQKKworI2Vsc2UgIC8vIGRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQoraW50IFdlYlBQbGFuZURpc3RvcnRpb24oY29uc3QgdWludDhfdCogc3JjLCBzaXplX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHJlZiwgc2l6ZV90IHJlZl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHNpemVfdCB4X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQqIGRpc3RvcnRpb24sIGZsb2F0KiByZXN1bHQpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClzcmNfc3RyaWRlOworICAodm9pZClyZWY7CisgICh2b2lkKXJlZl9zdHJpZGU7CisgICh2b2lkKXdpZHRoOworICAodm9pZCloZWlnaHQ7CisgICh2b2lkKXhfc3RlcDsKKyAgKHZvaWQpdHlwZTsKKyAgaWYgKGRpc3RvcnRpb24gPT0gTlVMTCB8fCByZXN1bHQgPT0gTlVMTCkgcmV0dXJuIDA7CisgICpkaXN0b3J0aW9uID0gMC5mOworICAqcmVzdWx0ID0gMC5mOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbihjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgZmxvYXQgcmVzdWx0c1s1XSkgeworICBpbnQgaTsKKyAgKHZvaWQpc3JjOworICAodm9pZClyZWY7CisgICh2b2lkKXR5cGU7CisgIGlmIChyZXN1bHRzID09IE5VTEwpIHJldHVybiAwOworICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSByZXN1bHRzW2ldID0gMC5mOworICByZXR1cm4gMTsKK30KKworI2VuZGlmICAvLyAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV9yZXNjYWxlX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTZhZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3BpY3R1cmVfcmVzY2FsZV9lbmMuYwpAQCAtMCwwICsxLDMwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFdlYlBQaWN0dXJlIHRvb2xzOiBjb3B5LCBjcm9wLCByZXNjYWxpbmcgYW5kIHZpZXcuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorCisjaWYgIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjZGVmaW5lIEhBTFZFKHgpICgoKHgpICsgMSkgPj4gMSkKKworLy8gR3JhYiB0aGUgJ3NwZWNzJyAod3JpdGVyLCAqb3BhcXVlLCB3aWR0aCwgaGVpZ2h0Li4uKSBmcm9tICdzcmMnIGFuZCBjb3B5IHRoZW0KKy8vIGludG8gJ2RzdCcuIE1hcmsgJ2RzdCcgYXMgbm90IG93bmluZyBhbnkgbWVtb3J5Lgorc3RhdGljIHZvaWQgUGljdHVyZUdyYWJTcGVjcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgIGFzc2VydChzcmMgIT0gTlVMTCAmJiBkc3QgIT0gTlVMTCk7CisgICpkc3QgPSAqc3JjOworICBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhkc3QpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIHRvIGNocm9tYSBzYW1wbGUgcG9zaXRpb24uCitzdGF0aWMgdm9pZCBTbmFwVG9wTGVmdFBvc2l0aW9uKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgbGVmdCwgaW50KiBjb25zdCB0b3ApIHsKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgKmxlZnQgJj0gfjE7CisgICAgKnRvcCAmPSB+MTsKKyAgfQorfQorCisvLyBBZGp1c3QgdG9wLWxlZnQgY29ybmVyIGFuZCB2ZXJpZnkgdGhhdCB0aGUgc3ViLXJlY3RhbmdsZSBpcyB2YWxpZC4KK3N0YXRpYyBpbnQgQWRqdXN0QW5kQ2hlY2tSZWN0YW5nbGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBsZWZ0LCBpbnQqIGNvbnN0IHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFNuYXBUb3BMZWZ0UG9zaXRpb24ocGljLCBsZWZ0LCB0b3ApOworICBpZiAoKCpsZWZ0KSA8IDAgfHwgKCp0b3ApIDwgMCkgcmV0dXJuIDA7CisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKKyAgaWYgKCgqbGVmdCkgKyB3aWR0aCA+IHBpYy0+d2lkdGgpIHJldHVybiAwOworICBpZiAoKCp0b3ApICsgaGVpZ2h0ID4gcGljLT5oZWlnaHQpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworaW50IFdlYlBQaWN0dXJlQ29weShjb25zdCBXZWJQUGljdHVyZSogc3JjLCBXZWJQUGljdHVyZSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChzcmMgPT0gZHN0KSByZXR1cm4gMTsKKworICBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKGRzdCkpIHJldHVybiAwOworCisgIGlmICghc3JjLT51c2VfYXJnYikgeworICAgIFdlYlBDb3B5UGxhbmUoc3JjLT55LCBzcmMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgZHN0LT55LCBkc3QtPnlfc3RyaWRlLCBkc3QtPndpZHRoLCBkc3QtPmhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnUsIHNyYy0+dXZfc3RyaWRlLCBkc3QtPnUsIGRzdC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7CisgICAgV2ViUENvcHlQbGFuZShzcmMtPnYsIHNyYy0+dXZfc3RyaWRlLCBkc3QtPnYsIGRzdC0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgSEFMVkUoZHN0LT53aWR0aCksIEhBTFZFKGRzdC0+aGVpZ2h0KSk7CisgICAgaWYgKGRzdC0+YSAhPSBOVUxMKSAgeworICAgICAgV2ViUENvcHlQbGFuZShzcmMtPmEsIHNyYy0+YV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgIGRzdC0+YSwgZHN0LT5hX3N0cmlkZSwgZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBXZWJQQ29weVBsYW5lKChjb25zdCB1aW50OF90KilzcmMtPmFyZ2IsIDQgKiBzcmMtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKWRzdC0+YXJnYiwgNCAqIGRzdC0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgICAgICAgICA0ICogZHN0LT53aWR0aCwgZHN0LT5oZWlnaHQpOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgaWYgKHBpY3R1cmUgPT0gTlVMTCkgcmV0dXJuIDA7CisgIGlmIChwaWN0dXJlLT51c2VfYXJnYikgeworICAgIHJldHVybiAocGljdHVyZS0+bWVtb3J5X2FyZ2JfID09IE5VTEwpOworICB9CisgIHJldHVybiAocGljdHVyZS0+bWVtb3J5XyA9PSBOVUxMKTsKK30KKworaW50IFdlYlBQaWN0dXJlVmlldyhjb25zdCBXZWJQUGljdHVyZSogc3JjLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogZHN0KSB7CisgIGlmIChzcmMgPT0gTlVMTCB8fCBkc3QgPT0gTlVMTCkgcmV0dXJuIDA7CisKKyAgLy8gdmVyaWZ5IHJlY3RhbmdsZSBwb3NpdGlvbi4KKyAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShzcmMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7CisKKyAgaWYgKHNyYyAhPSBkc3QpIHsgIC8vIGJld2FyZSBvZiBhbGlhc2luZyEgV2UgZG9uJ3Qgd2FudCB0byBsZWFrICdtZW1vcnlfJy4KKyAgICBQaWN0dXJlR3JhYlNwZWNzKHNyYywgZHN0KTsKKyAgfQorICBkc3QtPndpZHRoID0gd2lkdGg7CisgIGRzdC0+aGVpZ2h0ID0gaGVpZ2h0OworICBpZiAoIXNyYy0+dXNlX2FyZ2IpIHsKKyAgICBkc3QtPnkgPSBzcmMtPnkgKyB0b3AgKiBzcmMtPnlfc3RyaWRlICsgbGVmdDsKKyAgICBkc3QtPnUgPSBzcmMtPnUgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKKyAgICBkc3QtPnYgPSBzcmMtPnYgKyAodG9wID4+IDEpICogc3JjLT51dl9zdHJpZGUgKyAobGVmdCA+PiAxKTsKKyAgICBkc3QtPnlfc3RyaWRlID0gc3JjLT55X3N0cmlkZTsKKyAgICBkc3QtPnV2X3N0cmlkZSA9IHNyYy0+dXZfc3RyaWRlOworICAgIGlmIChzcmMtPmEgIT0gTlVMTCkgeworICAgICAgZHN0LT5hID0gc3JjLT5hICsgdG9wICogc3JjLT5hX3N0cmlkZSArIGxlZnQ7CisgICAgICBkc3QtPmFfc3RyaWRlID0gc3JjLT5hX3N0cmlkZTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZHN0LT5hcmdiID0gc3JjLT5hcmdiICsgdG9wICogc3JjLT5hcmdiX3N0cmlkZSArIGxlZnQ7CisgICAgZHN0LT5hcmdiX3N0cmlkZSA9IHNyYy0+YXJnYl9zdHJpZGU7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQaWN0dXJlIGNyb3BwaW5nCisKK2ludCBXZWJQUGljdHVyZUNyb3AoV2ViUFBpY3R1cmUqIHBpYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBXZWJQUGljdHVyZSB0bXA7CisKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgaWYgKCFBZGp1c3RBbmRDaGVja1JlY3RhbmdsZShwaWMsICZsZWZ0LCAmdG9wLCB3aWR0aCwgaGVpZ2h0KSkgcmV0dXJuIDA7CisKKyAgUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOworICB0bXAud2lkdGggPSB3aWR0aDsKKyAgdG1wLmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKKworICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKKyAgICBjb25zdCBpbnQgeV9vZmZzZXQgPSB0b3AgKiBwaWMtPnlfc3RyaWRlICsgbGVmdDsKKyAgICBjb25zdCBpbnQgdXZfb2Zmc2V0ID0gKHRvcCAvIDIpICogcGljLT51dl9zdHJpZGUgKyBsZWZ0IC8gMjsKKyAgICBXZWJQQ29weVBsYW5lKHBpYy0+eSArIHlfb2Zmc2V0LCBwaWMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnksIHRtcC55X3N0cmlkZSwgd2lkdGgsIGhlaWdodCk7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnUgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnUsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7CisgICAgV2ViUENvcHlQbGFuZShwaWMtPnYgKyB1dl9vZmZzZXQsIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgdG1wLnYsIHRtcC51dl9zdHJpZGUsIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSk7CisKKyAgICBpZiAodG1wLmEgIT0gTlVMTCkgeworICAgICAgY29uc3QgaW50IGFfb2Zmc2V0ID0gdG9wICogcGljLT5hX3N0cmlkZSArIGxlZnQ7CisgICAgICBXZWJQQ29weVBsYW5lKHBpYy0+YSArIGFfb2Zmc2V0LCBwaWMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICB0bXAuYSwgdG1wLmFfc3RyaWRlLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKShwaWMtPmFyZ2IgKyB0b3AgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgbGVmdCk7CisgICAgV2ViUENvcHlQbGFuZShzcmMsIHBpYy0+YXJnYl9zdHJpZGUgKiA0LCAodWludDhfdCopdG1wLmFyZ2IsCisgICAgICAgICAgICAgICAgICB0bXAuYXJnYl9zdHJpZGUgKiA0LCB3aWR0aCAqIDQsIGhlaWdodCk7CisgIH0KKyAgV2ViUFBpY3R1cmVGcmVlKHBpYyk7CisgICpwaWMgPSB0bXA7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU2ltcGxlIHBpY3R1cmUgcmVzY2FsZXIKKworc3RhdGljIHZvaWQgUmVzY2FsZVBsYW5lKGNvbnN0IHVpbnQ4X3QqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwgaW50IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlcl90KiBjb25zdCB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMpIHsKKyAgV2ViUFJlc2NhbGVyIHJlc2NhbGVyOworICBpbnQgeSA9IDA7CisgIFdlYlBSZXNjYWxlckluaXQoJnJlc2NhbGVyLCBzcmNfd2lkdGgsIHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgZHN0LCBkc3Rfd2lkdGgsIGRzdF9oZWlnaHQsIGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgbnVtX2NoYW5uZWxzLCB3b3JrKTsKKyAgd2hpbGUgKHkgPCBzcmNfaGVpZ2h0KSB7CisgICAgeSArPSBXZWJQUmVzY2FsZXJJbXBvcnQoJnJlc2NhbGVyLCBzcmNfaGVpZ2h0IC0geSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMgKyB5ICogc3JjX3N0cmlkZSwgc3JjX3N0cmlkZSk7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0KCZyZXNjYWxlcik7CisgIH0KK30KKworc3RhdGljIHZvaWQgQWxwaGFNdWx0aXBseUFSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGludmVyc2UpIHsKKyAgYXNzZXJ0KHBpYy0+YXJnYiAhPSBOVUxMKTsKKyAgV2ViUE11bHRBUkdCUm93cygodWludDhfdCopcGljLT5hcmdiLCBwaWMtPmFyZ2Jfc3RyaWRlICogc2l6ZW9mKCpwaWMtPmFyZ2IpLAorICAgICAgICAgICAgICAgICAgIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0LCBpbnZlcnNlKTsKK30KKworc3RhdGljIHZvaWQgQWxwaGFNdWx0aXBseVkoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywgaW50IGludmVyc2UpIHsKKyAgaWYgKHBpYy0+YSAhPSBOVUxMKSB7CisgICAgV2ViUE11bHRSb3dzKHBpYy0+eSwgcGljLT55X3N0cmlkZSwgcGljLT5hLCBwaWMtPmFfc3RyaWRlLAorICAgICAgICAgICAgICAgICBwaWMtPndpZHRoLCBwaWMtPmhlaWdodCwgaW52ZXJzZSk7CisgIH0KK30KKworaW50IFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgV2ViUFBpY3R1cmUgdG1wOworICBpbnQgcHJldl93aWR0aCwgcHJldl9oZWlnaHQ7CisgIHJlc2NhbGVyX3QqIHdvcms7CisKKyAgaWYgKHBpYyA9PSBOVUxMKSByZXR1cm4gMDsKKyAgcHJldl93aWR0aCA9IHBpYy0+d2lkdGg7CisgIHByZXZfaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGlmICghV2ViUFJlc2NhbGVyR2V0U2NhbGVkRGltZW5zaW9ucygKKyAgICAgICAgICBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgJndpZHRoLCAmaGVpZ2h0KSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgUGljdHVyZUdyYWJTcGVjcyhwaWMsICZ0bXApOworICB0bXAud2lkdGggPSB3aWR0aDsKKyAgdG1wLmhlaWdodCA9IGhlaWdodDsKKyAgaWYgKCFXZWJQUGljdHVyZUFsbG9jKCZ0bXApKSByZXR1cm4gMDsKKworICBpZiAoIXBpYy0+dXNlX2FyZ2IpIHsKKyAgICB3b3JrID0gKHJlc2NhbGVyX3QqKVdlYlBTYWZlTWFsbG9jKDJVTEwgKiB3aWR0aCwgc2l6ZW9mKCp3b3JrKSk7CisgICAgaWYgKHdvcmsgPT0gTlVMTCkgeworICAgICAgV2ViUFBpY3R1cmVGcmVlKCZ0bXApOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIElmIHByZXNlbnQsIHdlIG5lZWQgdG8gcmVzY2FsZSBhbHBoYSBmaXJzdCAoZm9yIEFscGhhTXVsdGlwbHlZKS4KKyAgICBpZiAocGljLT5hICE9IE5VTEwpIHsKKyAgICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgICBSZXNjYWxlUGxhbmUocGljLT5hLCBwcmV2X3dpZHRoLCBwcmV2X2hlaWdodCwgcGljLT5hX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICB0bXAuYSwgd2lkdGgsIGhlaWdodCwgdG1wLmFfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICB9CisKKyAgICAvLyBXZSB0YWtlIHRyYW5zcGFyZW5jeSBpbnRvIGFjY291bnQgb24gdGhlIGx1bWEgcGxhbmUgb25seS4gVGhhdCdzIG5vdAorICAgIC8vIHRvdGFsbHkgZXhhY3QgYmxlbmRpbmcsIGJ1dCBzdGlsbCBpcyBhIGdvb2QgYXBwcm94aW1hdGlvbi4KKyAgICBBbHBoYU11bHRpcGx5WShwaWMsIDApOworICAgIFJlc2NhbGVQbGFuZShwaWMtPnksIHByZXZfd2lkdGgsIHByZXZfaGVpZ2h0LCBwaWMtPnlfc3RyaWRlLAorICAgICAgICAgICAgICAgICB0bXAueSwgd2lkdGgsIGhlaWdodCwgdG1wLnlfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICBBbHBoYU11bHRpcGx5WSgmdG1wLCAxKTsKKworICAgIFJlc2NhbGVQbGFuZShwaWMtPnUsCisgICAgICAgICAgICAgICAgIEhBTFZFKHByZXZfd2lkdGgpLCBIQUxWRShwcmV2X2hlaWdodCksIHBpYy0+dXZfc3RyaWRlLAorICAgICAgICAgICAgICAgICB0bXAudSwKKyAgICAgICAgICAgICAgICAgSEFMVkUod2lkdGgpLCBIQUxWRShoZWlnaHQpLCB0bXAudXZfc3RyaWRlLCB3b3JrLCAxKTsKKyAgICBSZXNjYWxlUGxhbmUocGljLT52LAorICAgICAgICAgICAgICAgICBIQUxWRShwcmV2X3dpZHRoKSwgSEFMVkUocHJldl9oZWlnaHQpLCBwaWMtPnV2X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgdG1wLnYsCisgICAgICAgICAgICAgICAgIEhBTFZFKHdpZHRoKSwgSEFMVkUoaGVpZ2h0KSwgdG1wLnV2X3N0cmlkZSwgd29yaywgMSk7CisgIH0gZWxzZSB7CisgICAgd29yayA9IChyZXNjYWxlcl90KilXZWJQU2FmZU1hbGxvYygyVUxMICogd2lkdGggKiA0LCBzaXplb2YoKndvcmspKTsKKyAgICBpZiAod29yayA9PSBOVUxMKSB7CisgICAgICBXZWJQUGljdHVyZUZyZWUoJnRtcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgLy8gSW4gb3JkZXIgdG8gY29ycmVjdGx5IGludGVycG9sYXRlIGNvbG9ycywgd2UgbmVlZCB0byBhcHBseSB0aGUgYWxwaGEKKyAgICAvLyB3ZWlnaHRpbmcgZmlyc3QgKGJsYWNrLW1hdHRpbmcpLCBzY2FsZSB0aGUgUkdCIHZhbHVlcywgYW5kIHJlbW92ZQorICAgIC8vIHRoZSBwcmVtdWx0aXBsaWNhdGlvbiBhZnRlcndhcmQgKHdoaWxlIHByZXNlcnZpbmcgdGhlIGFscGhhIGNoYW5uZWwpLgorICAgIFdlYlBJbml0QWxwaGFQcm9jZXNzaW5nKCk7CisgICAgQWxwaGFNdWx0aXBseUFSR0IocGljLCAwKTsKKyAgICBSZXNjYWxlUGxhbmUoKGNvbnN0IHVpbnQ4X3QqKXBpYy0+YXJnYiwgcHJldl93aWR0aCwgcHJldl9oZWlnaHQsCisgICAgICAgICAgICAgICAgIHBpYy0+YXJnYl9zdHJpZGUgKiA0LAorICAgICAgICAgICAgICAgICAodWludDhfdCopdG1wLmFyZ2IsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgIHRtcC5hcmdiX3N0cmlkZSAqIDQsCisgICAgICAgICAgICAgICAgIHdvcmssIDQpOworICAgIEFscGhhTXVsdGlwbHlBUkdCKCZ0bXAsIDEpOworICB9CisgIFdlYlBQaWN0dXJlRnJlZShwaWMpOworICBXZWJQU2FmZUZyZWUod29yayk7CisgICpwaWMgPSB0bXA7CisgIHJldHVybiAxOworfQorCisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX1JFRFVDRV9TSVpFKQorCitpbnQgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpIHsKKyAgKHZvaWQpc3JjOworICAodm9pZClkc3Q7CisgIHJldHVybiAwOworfQorCitpbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpIHsKKyAgKHZvaWQpcGljdHVyZTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCkgeworICAodm9pZClzcmM7CisgICh2b2lkKWxlZnQ7CisgICh2b2lkKXRvcDsKKyAgKHZvaWQpd2lkdGg7CisgICh2b2lkKWhlaWdodDsKKyAgKHZvaWQpZHN0OworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljLAorICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgICh2b2lkKXBpYzsKKyAgKHZvaWQpbGVmdDsKKyAgKHZvaWQpdG9wOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICByZXR1cm4gMDsKK30KKworaW50IFdlYlBQaWN0dXJlUmVzY2FsZShXZWJQUGljdHVyZSogcGljLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgKHZvaWQpcGljOworICAodm9pZCl3aWR0aDsKKyAgKHZvaWQpaGVpZ2h0OworICByZXR1cm4gMDsKK30KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9SRURVQ0VfU0laRSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcGljdHVyZV90b29sc19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWRjNmNhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9waWN0dXJlX3Rvb2xzX2VuYy5jCkBAIC0wLDAgKzEsMjc4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gV2ViUFBpY3R1cmUgdG9vbHM6IGFscGhhIGhhbmRsaW5nLCBldGMuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvdnA4aV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZHNwL3l1di5oIgorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgTWFrZUFSR0IzMihpbnQgciwgaW50IGcsIGludCBiKSB7CisgIHJldHVybiAoMHhmZjAwMDAwMHUgfCAociA8PCAxNikgfCAoZyA8PCA4KSB8IGIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyOiBjbGVhbiB1cCBmdWxseSB0cmFuc3BhcmVudCBhcmVhIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5LgorCisjZGVmaW5lIFNJWkUgOAorI2RlZmluZSBTSVpFMiAoU0laRSAvIDIpCitzdGF0aWMgaW50IElzVHJhbnNwYXJlbnRBUkdCQXJlYShjb25zdCB1aW50MzJfdCogcHRyLCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgeworICBpbnQgeSwgeDsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIGZvciAoeCA9IDA7IHggPCBzaXplOyArK3gpIHsKKyAgICAgIGlmIChwdHJbeF0gJiAweGZmMDAwMDAwdSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgICAgcHRyICs9IHN0cmlkZTsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRmxhdHRlbih1aW50OF90KiBwdHIsIGludCB2LCBpbnQgc3RyaWRlLCBpbnQgc2l6ZSkgeworICBpbnQgeTsKKyAgZm9yICh5ID0gMDsgeSA8IHNpemU7ICsreSkgeworICAgIG1lbXNldChwdHIsIHYsIHNpemUpOworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKworc3RhdGljIHZvaWQgRmxhdHRlbkFSR0IodWludDMyX3QqIHB0ciwgdWludDMyX3QgdiwgaW50IHN0cmlkZSwgaW50IHNpemUpIHsKKyAgaW50IHgsIHk7CisgIGZvciAoeSA9IDA7IHkgPCBzaXplOyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgc2l6ZTsgKyt4KSBwdHJbeF0gPSB2OworICAgIHB0ciArPSBzdHJpZGU7CisgIH0KK30KKworLy8gU21vb3RoZW4gdGhlIGx1bWEgY29tcG9uZW50cyBvZiB0cmFuc3BhcmVudCBwaXhlbHMuIFJldHVybiB0cnVlIGlmIHRoZSB3aG9sZQorLy8gYmxvY2sgaXMgdHJhbnNwYXJlbnQuCitzdGF0aWMgaW50IFNtb290aGVuQmxvY2soY29uc3QgdWludDhfdCogYV9wdHIsIGludCBhX3N0cmlkZSwgdWludDhfdCogeV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc3RyaWRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IHN1bSA9IDAsIGNvdW50ID0gMDsKKyAgaW50IHgsIHk7CisgIGNvbnN0IHVpbnQ4X3QqIGFscGhhX3B0ciA9IGFfcHRyOworICB1aW50OF90KiBsdW1hX3B0ciA9IHlfcHRyOworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgaWYgKGFscGhhX3B0clt4XSAhPSAwKSB7CisgICAgICAgICsrY291bnQ7CisgICAgICAgIHN1bSArPSBsdW1hX3B0clt4XTsKKyAgICAgIH0KKyAgICB9CisgICAgYWxwaGFfcHRyICs9IGFfc3RyaWRlOworICAgIGx1bWFfcHRyICs9IHlfc3RyaWRlOworICB9CisgIGlmIChjb3VudCA+IDAgJiYgY291bnQgPCB3aWR0aCAqIGhlaWdodCkgeworICAgIGNvbnN0IHVpbnQ4X3QgYXZnX3U4ID0gKHVpbnQ4X3QpKHN1bSAvIGNvdW50KTsKKyAgICBhbHBoYV9wdHIgPSBhX3B0cjsKKyAgICBsdW1hX3B0ciA9IHlfcHRyOworICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgaWYgKGFscGhhX3B0clt4XSA9PSAwKSBsdW1hX3B0clt4XSA9IGF2Z191ODsKKyAgICAgIH0KKyAgICAgIGFscGhhX3B0ciArPSBhX3N0cmlkZTsKKyAgICAgIGx1bWFfcHRyICs9IHlfc3RyaWRlOworICAgIH0KKyAgfQorICByZXR1cm4gKGNvdW50ID09IDApOworfQorCit2b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhKFdlYlBQaWN0dXJlKiBwaWMpIHsKKyAgaW50IHgsIHksIHcsIGg7CisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuOworICB3ID0gcGljLT53aWR0aCAvIFNJWkU7CisgIGggPSBwaWMtPmhlaWdodCAvIFNJWkU7CisKKyAgLy8gbm90ZTogd2UgaWdub3JlIHRoZSBsZWZ0LW92ZXJzIG9uIHJpZ2h0L2JvdHRvbSwgZXhjZXB0IGZvciBTbW9vdGhlbkJsb2NrKCkuCisgIGlmIChwaWMtPnVzZV9hcmdiKSB7CisgICAgdWludDMyX3QgYXJnYl92YWx1ZSA9IDA7CisgICAgZm9yICh5ID0gMDsgeSA8IGg7ICsreSkgeworICAgICAgaW50IG5lZWRfcmVzZXQgPSAxOworICAgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgb2ZmID0gKHkgKiBwaWMtPmFyZ2Jfc3RyaWRlICsgeCkgKiBTSVpFOworICAgICAgICBpZiAoSXNUcmFuc3BhcmVudEFSR0JBcmVhKHBpYy0+YXJnYiArIG9mZiwgcGljLT5hcmdiX3N0cmlkZSwgU0laRSkpIHsKKyAgICAgICAgICBpZiAobmVlZF9yZXNldCkgeworICAgICAgICAgICAgYXJnYl92YWx1ZSA9IHBpYy0+YXJnYltvZmZdOworICAgICAgICAgICAgbmVlZF9yZXNldCA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIEZsYXR0ZW5BUkdCKHBpYy0+YXJnYiArIG9mZiwgYXJnYl92YWx1ZSwgcGljLT5hcmdiX3N0cmlkZSwgU0laRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmVlZF9yZXNldCA9IDE7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgICAgY29uc3QgaW50IHlfc3RyaWRlID0gcGljLT55X3N0cmlkZTsKKyAgICBjb25zdCBpbnQgdXZfc3RyaWRlID0gcGljLT51dl9zdHJpZGU7CisgICAgY29uc3QgaW50IGFfc3RyaWRlID0gcGljLT5hX3N0cmlkZTsKKyAgICB1aW50OF90KiB5X3B0ciA9IHBpYy0+eTsKKyAgICB1aW50OF90KiB1X3B0ciA9IHBpYy0+dTsKKyAgICB1aW50OF90KiB2X3B0ciA9IHBpYy0+djsKKyAgICBjb25zdCB1aW50OF90KiBhX3B0ciA9IHBpYy0+YTsKKyAgICBpbnQgdmFsdWVzWzNdID0geyAwIH07CisgICAgaWYgKGFfcHRyID09IE5VTEwgfHwgeV9wdHIgPT0gTlVMTCB8fCB1X3B0ciA9PSBOVUxMIHx8IHZfcHRyID09IE5VTEwpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yICh5ID0gMDsgeSArIFNJWkUgPD0gaGVpZ2h0OyB5ICs9IFNJWkUpIHsKKyAgICAgIGludCBuZWVkX3Jlc2V0ID0gMTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyBTSVpFIDw9IHdpZHRoOyB4ICs9IFNJWkUpIHsKKyAgICAgICAgaWYgKFNtb290aGVuQmxvY2soYV9wdHIgKyB4LCBhX3N0cmlkZSwgeV9wdHIgKyB4LCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0laRSwgU0laRSkpIHsKKyAgICAgICAgICBpZiAobmVlZF9yZXNldCkgeworICAgICAgICAgICAgdmFsdWVzWzBdID0geV9wdHJbeF07CisgICAgICAgICAgICB2YWx1ZXNbMV0gPSB1X3B0clt4ID4+IDFdOworICAgICAgICAgICAgdmFsdWVzWzJdID0gdl9wdHJbeCA+PiAxXTsKKyAgICAgICAgICAgIG5lZWRfcmVzZXQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgICBGbGF0dGVuKHlfcHRyICsgeCwgICAgICAgIHZhbHVlc1swXSwgeV9zdHJpZGUsICBTSVpFKTsKKyAgICAgICAgICBGbGF0dGVuKHVfcHRyICsgKHggPj4gMSksIHZhbHVlc1sxXSwgdXZfc3RyaWRlLCBTSVpFMik7CisgICAgICAgICAgRmxhdHRlbih2X3B0ciArICh4ID4+IDEpLCB2YWx1ZXNbMl0sIHV2X3N0cmlkZSwgU0laRTIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG5lZWRfcmVzZXQgPSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoeCA8IHdpZHRoKSB7CisgICAgICAgIFNtb290aGVuQmxvY2soYV9wdHIgKyB4LCBhX3N0cmlkZSwgeV9wdHIgKyB4LCB5X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICB3aWR0aCAtIHgsIFNJWkUpOworICAgICAgfQorICAgICAgYV9wdHIgKz0gU0laRSAqIGFfc3RyaWRlOworICAgICAgeV9wdHIgKz0gU0laRSAqIHlfc3RyaWRlOworICAgICAgdV9wdHIgKz0gU0laRTIgKiB1dl9zdHJpZGU7CisgICAgICB2X3B0ciArPSBTSVpFMiAqIHV2X3N0cmlkZTsKKyAgICB9CisgICAgaWYgKHkgPCBoZWlnaHQpIHsKKyAgICAgIGNvbnN0IGludCBzdWJfaGVpZ2h0ID0gaGVpZ2h0IC0geTsKKyAgICAgIGZvciAoeCA9IDA7IHggKyBTSVpFIDw9IHdpZHRoOyB4ICs9IFNJWkUpIHsKKyAgICAgICAgU21vb3RoZW5CbG9jayhhX3B0ciArIHgsIGFfc3RyaWRlLCB5X3B0ciArIHgsIHlfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgIFNJWkUsIHN1Yl9oZWlnaHQpOworICAgICAgfQorICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICBTbW9vdGhlbkJsb2NrKGFfcHRyICsgeCwgYV9zdHJpZGUsIHlfcHRyICsgeCwgeV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgd2lkdGggLSB4LCBzdWJfaGVpZ2h0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI3VuZGVmIFNJWkUKKyN1bmRlZiBTSVpFMgorCit2b2lkIFdlYlBDbGVhbnVwVHJhbnNwYXJlbnRBcmVhTG9zc2xlc3MoV2ViUFBpY3R1cmUqIGNvbnN0IHBpYykgeworICBpbnQgeCwgeSwgdywgaDsKKyAgdWludDMyX3QqIGFyZ2I7CisgIGFzc2VydChwaWMgIT0gTlVMTCAmJiBwaWMtPnVzZV9hcmdiKTsKKyAgdyA9IHBpYy0+d2lkdGg7CisgIGggPSBwaWMtPmhlaWdodDsKKyAgYXJnYiA9IHBpYy0+YXJnYjsKKworICBmb3IgKHkgPSAwOyB5IDwgaDsgKyt5KSB7CisgICAgZm9yICh4ID0gMDsgeCA8IHc7ICsreCkgeworICAgICAgaWYgKChhcmdiW3hdICYgMHhmZjAwMDAwMCkgPT0gMCkgeworICAgICAgICBhcmdiW3hdID0gMHgwMDAwMDAwMDsKKyAgICAgIH0KKyAgICB9CisgICAgYXJnYiArPSBwaWMtPmFyZ2Jfc3RyaWRlOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCbGVuZCBjb2xvciBhbmQgcmVtb3ZlIHRyYW5zcGFyZW5jeSBpbmZvCisKKyNkZWZpbmUgQkxFTkQoVjAsIFYxLCBBTFBIQSkgXAorICAgICgoKChWMCkgKiAoMjU1IC0gKEFMUEhBKSkgKyAoVjEpICogKEFMUEhBKSkgKiAweDEwMSArIDI1NikgPj4gMTYpCisjZGVmaW5lIEJMRU5EXzEwQklUKFYwLCBWMSwgQUxQSEEpIFwKKyAgICAoKCgoVjApICogKDEwMjAgLSAoQUxQSEEpKSArIChWMSkgKiAoQUxQSEEpKSAqIDB4MTAxICsgMTAyNCkgPj4gMTgpCisKK3ZvaWQgV2ViUEJsZW5kQWxwaGEoV2ViUFBpY3R1cmUqIHBpYywgdWludDMyX3QgYmFja2dyb3VuZF9yZ2IpIHsKKyAgY29uc3QgaW50IHJlZCA9IChiYWNrZ3JvdW5kX3JnYiA+PiAxNikgJiAweGZmOworICBjb25zdCBpbnQgZ3JlZW4gPSAoYmFja2dyb3VuZF9yZ2IgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgYmx1ZSA9IChiYWNrZ3JvdW5kX3JnYiA+PiAwKSAmIDB4ZmY7CisgIGludCB4LCB5OworICBpZiAocGljID09IE5VTEwpIHJldHVybjsKKyAgaWYgKCFwaWMtPnVzZV9hcmdiKSB7CisgICAgY29uc3QgaW50IHV2X3dpZHRoID0gKHBpYy0+d2lkdGggPj4gMSk7ICAvLyBvbWl0IGxhc3QgcGl4ZWwgZHVyaW5nIHUvdiBsb29wCisgICAgY29uc3QgaW50IFkwID0gVlA4UkdCVG9ZKHJlZCwgZ3JlZW4sIGJsdWUsIFlVVl9IQUxGKTsKKyAgICAvLyBWUDhSR0JUb1UvViBleHBlY3RzIHRoZSB1L3YgdmFsdWVzIHN1bW1lZCBvdmVyIGZvdXIgcGl4ZWxzCisgICAgY29uc3QgaW50IFUwID0gVlA4UkdCVG9VKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IFYwID0gVlA4UkdCVG9WKDQgKiByZWQsIDQgKiBncmVlbiwgNCAqIGJsdWUsIDQgKiBZVVZfSEFMRik7CisgICAgY29uc3QgaW50IGhhc19hbHBoYSA9IHBpYy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX0FMUEhBX0JJVDsKKyAgICBpZiAoIWhhc19hbHBoYSB8fCBwaWMtPmEgPT0gTlVMTCkgcmV0dXJuOyAgICAvLyBub3RoaW5nIHRvIGRvCisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIC8vIEx1bWEgYmxlbmRpbmcKKyAgICAgIHVpbnQ4X3QqIGNvbnN0IHlfcHRyID0gcGljLT55ICsgeSAqIHBpYy0+eV9zdHJpZGU7CisgICAgICB1aW50OF90KiBjb25zdCBhX3B0ciA9IHBpYy0+YSArIHkgKiBwaWMtPmFfc3RyaWRlOworICAgICAgZm9yICh4ID0gMDsgeCA8IHBpYy0+d2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCBpbnQgYWxwaGEgPSBhX3B0clt4XTsKKyAgICAgICAgaWYgKGFscGhhIDwgMHhmZikgeworICAgICAgICAgIHlfcHRyW3hdID0gQkxFTkQoWTAsIHlfcHRyW3hdLCBhX3B0clt4XSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIENocm9tYSBibGVuZGluZyBldmVyeSBldmVuIGxpbmUKKyAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgdWludDhfdCogY29uc3QgdSA9IHBpYy0+dSArICh5ID4+IDEpICogcGljLT51dl9zdHJpZGU7CisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHYgPSBwaWMtPnYgKyAoeSA+PiAxKSAqIHBpYy0+dXZfc3RyaWRlOworICAgICAgICB1aW50OF90KiBjb25zdCBhX3B0cjIgPQorICAgICAgICAgICAgKHkgKyAxID09IHBpYy0+aGVpZ2h0KSA/IGFfcHRyIDogYV9wdHIgKyBwaWMtPmFfc3RyaWRlOworICAgICAgICBmb3IgKHggPSAwOyB4IDwgdXZfd2lkdGg7ICsreCkgeworICAgICAgICAgIC8vIEF2ZXJhZ2UgZm91ciBhbHBoYSB2YWx1ZXMgaW50byBhIHNpbmdsZSBibGVuZGluZyB3ZWlnaHQuCisgICAgICAgICAgLy8gVE9ETyhza2FsKTogbWlnaHQgbGVhZCB0byB2aXNpYmxlIGNvbnRvdXJpbmcuIENhbiB3ZSBkbyBiZXR0ZXI/CisgICAgICAgICAgY29uc3QgaW50IGFscGhhID0KKyAgICAgICAgICAgICAgYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyWzIgKiB4ICsgMV0gKworICAgICAgICAgICAgICBhX3B0cjJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDFdOworICAgICAgICAgIHVbeF0gPSBCTEVORF8xMEJJVChVMCwgdVt4XSwgYWxwaGEpOworICAgICAgICAgIHZbeF0gPSBCTEVORF8xMEJJVChWMCwgdlt4XSwgYWxwaGEpOworICAgICAgICB9CisgICAgICAgIGlmIChwaWMtPndpZHRoICYgMSkgeyAgIC8vIHJpZ2h0bW9zdCBwaXhlbAorICAgICAgICAgIGNvbnN0IGludCBhbHBoYSA9IDIgKiAoYV9wdHJbMiAqIHggKyAwXSArIGFfcHRyMlsyICogeCArIDBdKTsKKyAgICAgICAgICB1W3hdID0gQkxFTkRfMTBCSVQoVTAsIHVbeF0sIGFscGhhKTsKKyAgICAgICAgICB2W3hdID0gQkxFTkRfMTBCSVQoVjAsIHZbeF0sIGFscGhhKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbWVtc2V0KGFfcHRyLCAweGZmLCBwaWMtPndpZHRoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgdWludDMyX3QqIGFyZ2IgPSBwaWMtPmFyZ2I7CisgICAgY29uc3QgdWludDMyX3QgYmFja2dyb3VuZCA9IE1ha2VBUkdCMzIocmVkLCBncmVlbiwgYmx1ZSk7CisgICAgZm9yICh5ID0gMDsgeSA8IHBpYy0+aGVpZ2h0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCBwaWMtPndpZHRoOyArK3gpIHsKKyAgICAgICAgY29uc3QgaW50IGFscGhhID0gKGFyZ2JbeF0gPj4gMjQpICYgMHhmZjsKKyAgICAgICAgaWYgKGFscGhhICE9IDB4ZmYpIHsKKyAgICAgICAgICBpZiAoYWxwaGEgPiAwKSB7CisgICAgICAgICAgICBpbnQgciA9IChhcmdiW3hdID4+IDE2KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgZyA9IChhcmdiW3hdID4+ICA4KSAmIDB4ZmY7CisgICAgICAgICAgICBpbnQgYiA9IChhcmdiW3hdID4+ICAwKSAmIDB4ZmY7CisgICAgICAgICAgICByID0gQkxFTkQocmVkLCByLCBhbHBoYSk7CisgICAgICAgICAgICBnID0gQkxFTkQoZ3JlZW4sIGcsIGFscGhhKTsKKyAgICAgICAgICAgIGIgPSBCTEVORChibHVlLCBiLCBhbHBoYSk7CisgICAgICAgICAgICBhcmdiW3hdID0gTWFrZUFSR0IzMihyLCBnLCBiKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXJnYlt4XSA9IGJhY2tncm91bmQ7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBhcmdiICs9IHBpYy0+YXJnYl9zdHJpZGU7CisgICAgfQorICB9Cit9CisKKyN1bmRlZiBCTEVORAorI3VuZGVmIEJMRU5EXzEwQklUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcHJlZGljdG9yX2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OWNkZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ByZWRpY3Rvcl9lbmMuYwpAQCAtMCwwICsxLDc3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEltYWdlIHRyYW5zZm9ybSBtZXRob2RzIGZvciBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcnM6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorLy8gICAgICAgICAgSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaW5jZW50IFJhYmF1ZCAodnJhYmF1ZEBnb29nbGUuY29tKQorCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3MuaCIKKyNpbmNsdWRlICJzcmMvZHNwL2xvc3NsZXNzX2NvbW1vbi5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4bGlfZW5jLmgiCisKKyNkZWZpbmUgTUFYX0RJRkZfQ09TVCAoMWUzMGYpCisKK3N0YXRpYyBjb25zdCBmbG9hdCBrU3BhdGlhbFByZWRpY3RvckJpYXMgPSAxNS5mOworc3RhdGljIGNvbnN0IGludCBrUHJlZExvd0VmZm9ydCA9IDExOworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrQWxwaGEgPSAweGZmMDAwMDAwOworCisvLyBNb3N0bHkgdXNlZCB0byByZWR1Y2UgY29kZSBzaXplICsgcmVhZGFiaWxpdHkKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR2V0TWluKGludCBhLCBpbnQgYikgeyByZXR1cm4gKGEgPiBiKSA/IGIgOiBhOyB9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZXRob2RzIHRvIGNhbGN1bGF0ZSBFbnRyb3B5IChTaGFubm9uKS4KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbChjb25zdCBpbnQgY291bnRzWzI1Nl0sIGludCB3ZWlnaHRfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGV4cF92YWwpIHsKKyAgY29uc3QgaW50IHNpZ25pZmljYW50X3N5bWJvbHMgPSAyNTYgPj4gNDsKKyAgY29uc3QgZG91YmxlIGV4cF9kZWNheV9mYWN0b3IgPSAwLjY7CisgIGRvdWJsZSBiaXRzID0gd2VpZ2h0XzAgKiBjb3VudHNbMF07CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDwgc2lnbmlmaWNhbnRfc3ltYm9sczsgKytpKSB7CisgICAgYml0cyArPSBleHBfdmFsICogKGNvdW50c1tpXSArIGNvdW50c1syNTYgLSBpXSk7CisgICAgZXhwX3ZhbCAqPSBleHBfZGVjYXlfZmFjdG9yOworICB9CisgIHJldHVybiAoZmxvYXQpKC0wLjEgKiBiaXRzKTsKK30KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0U3BhdGlhbEhpc3RvZ3JhbShjb25zdCBpbnQgYWNjdW11bGF0ZWRbNF1bMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHRpbGVbNF1bMjU2XSkgeworICBpbnQgaTsKKyAgZG91YmxlIHJldHZhbCA9IDA7CisgIGZvciAoaSA9IDA7IGkgPCA0OyArK2kpIHsKKyAgICBjb25zdCBkb3VibGUga0V4cFZhbHVlID0gMC45NDsKKyAgICByZXR2YWwgKz0gUHJlZGljdGlvbkNvc3RTcGF0aWFsKHRpbGVbaV0sIDEsIGtFeHBWYWx1ZSk7CisgICAgcmV0dmFsICs9IFZQOExDb21iaW5lZFNoYW5ub25FbnRyb3B5KHRpbGVbaV0sIGFjY3VtdWxhdGVkW2ldKTsKKyAgfQorICByZXR1cm4gKGZsb2F0KXJldHZhbDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVXBkYXRlSGlzdG8oaW50IGhpc3RvX2FyZ2JbNF1bMjU2XSwgdWludDMyX3QgYXJnYikgeworICArK2hpc3RvX2FyZ2JbMF1bYXJnYiA+PiAyNF07CisgICsraGlzdG9fYXJnYlsxXVsoYXJnYiA+PiAxNikgJiAweGZmXTsKKyAgKytoaXN0b19hcmdiWzJdWyhhcmdiID4+IDgpICYgMHhmZl07CisgICsraGlzdG9fYXJnYlszXVthcmdiICYgMHhmZl07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTcGF0aWFsIHRyYW5zZm9ybSBmdW5jdGlvbnMuCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFByZWRpY3RCYXRjaChpbnQgbW9kZSwgaW50IHhfc3RhcnQsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fcGl4ZWxzLCBjb25zdCB1aW50MzJfdCogY3VycmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogdXBwZXIsIHVpbnQzMl90KiBvdXQpIHsKKyAgaWYgKHhfc3RhcnQgPT0gMCkgeworICAgIGlmICh5ID09IDApIHsKKyAgICAgIC8vIEFSR0JfQkxBQ0suCisgICAgICBWUDhMUHJlZGljdG9yc1N1YlswXShjdXJyZW50LCBOVUxMLCAxLCBvdXQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUb3Agb25lLgorICAgICAgVlA4TFByZWRpY3RvcnNTdWJbMl0oY3VycmVudCwgdXBwZXIsIDEsIG91dCk7CisgICAgfQorICAgICsreF9zdGFydDsKKyAgICArK291dDsKKyAgICAtLW51bV9waXhlbHM7CisgIH0KKyAgaWYgKHkgPT0gMCkgeworICAgIC8vIExlZnQgb25lLgorICAgIFZQOExQcmVkaWN0b3JzU3ViWzFdKGN1cnJlbnQgKyB4X3N0YXJ0LCBOVUxMLCBudW1fcGl4ZWxzLCBvdXQpOworICB9IGVsc2UgeworICAgIFZQOExQcmVkaWN0b3JzU3ViW21vZGVdKGN1cnJlbnQgKyB4X3N0YXJ0LCB1cHBlciArIHhfc3RhcnQsIG51bV9waXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0KTsKKyAgfQorfQorCisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRNYXgoaW50IGEsIGludCBiKSB7IHJldHVybiAoYSA8IGIpID8gYiA6IGE7IH0KKworc3RhdGljIGludCBNYXhEaWZmQmV0d2VlblBpeGVscyh1aW50MzJfdCBwMSwgdWludDMyX3QgcDIpIHsKKyAgY29uc3QgaW50IGRpZmZfYSA9IGFicygoaW50KShwMSA+PiAyNCkgLSAoaW50KShwMiA+PiAyNCkpOworICBjb25zdCBpbnQgZGlmZl9yID0gYWJzKChpbnQpKChwMSA+PiAxNikgJiAweGZmKSAtIChpbnQpKChwMiA+PiAxNikgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2cgPSBhYnMoKGludCkoKHAxID4+IDgpICYgMHhmZikgLSAoaW50KSgocDIgPj4gOCkgJiAweGZmKSk7CisgIGNvbnN0IGludCBkaWZmX2IgPSBhYnMoKGludCkocDEgJiAweGZmKSAtIChpbnQpKHAyICYgMHhmZikpOworICByZXR1cm4gR2V0TWF4KEdldE1heChkaWZmX2EsIGRpZmZfciksIEdldE1heChkaWZmX2csIGRpZmZfYikpOworfQorCitzdGF0aWMgaW50IE1heERpZmZBcm91bmRQaXhlbCh1aW50MzJfdCBjdXJyZW50LCB1aW50MzJfdCB1cCwgdWludDMyX3QgZG93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KSB7CisgIGNvbnN0IGludCBkaWZmX3VwID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgdXApOworICBjb25zdCBpbnQgZGlmZl9kb3duID0gTWF4RGlmZkJldHdlZW5QaXhlbHMoY3VycmVudCwgZG93bik7CisgIGNvbnN0IGludCBkaWZmX2xlZnQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCBsZWZ0KTsKKyAgY29uc3QgaW50IGRpZmZfcmlnaHQgPSBNYXhEaWZmQmV0d2VlblBpeGVscyhjdXJyZW50LCByaWdodCk7CisgIHJldHVybiBHZXRNYXgoR2V0TWF4KGRpZmZfdXAsIGRpZmZfZG93biksIEdldE1heChkaWZmX2xlZnQsIGRpZmZfcmlnaHQpKTsKK30KKworc3RhdGljIHVpbnQzMl90IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHVpbnQzMl90IGFyZ2IpIHsKKyAgY29uc3QgdWludDMyX3QgZ3JlZW4gPSAoYXJnYiA+PiA4KSAmIDB4ZmY7CisgIHVpbnQzMl90IHJlZF9ibHVlID0gYXJnYiAmIDB4MDBmZjAwZmZ1OworICByZWRfYmx1ZSArPSAoZ3JlZW4gPDwgMTYpIHwgZ3JlZW47CisgIHJlZF9ibHVlICY9IDB4MDBmZjAwZmZ1OworICByZXR1cm4gKGFyZ2IgJiAweGZmMDBmZjAwdSkgfCByZWRfYmx1ZTsKK30KKworc3RhdGljIHZvaWQgTWF4RGlmZnNGb3JSb3coaW50IHdpZHRoLCBpbnQgc3RyaWRlLCBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IG1heF9kaWZmcywgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgdWludDMyX3QgY3VycmVudCwgdXAsIGRvd24sIGxlZnQsIHJpZ2h0OworICBpbnQgeDsKKyAgaWYgKHdpZHRoIDw9IDIpIHJldHVybjsKKyAgY3VycmVudCA9IGFyZ2JbMF07CisgIHJpZ2h0ID0gYXJnYlsxXTsKKyAgaWYgKHVzZWRfc3VidHJhY3RfZ3JlZW4pIHsKKyAgICBjdXJyZW50ID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoY3VycmVudCk7CisgICAgcmlnaHQgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZChyaWdodCk7CisgIH0KKyAgLy8gbWF4X2RpZmZzWzBdIGFuZCBtYXhfZGlmZnNbd2lkdGggLSAxXSBhcmUgbmV2ZXIgdXNlZC4KKyAgZm9yICh4ID0gMTsgeCA8IHdpZHRoIC0gMTsgKyt4KSB7CisgICAgdXAgPSBhcmdiWy1zdHJpZGUgKyB4XTsKKyAgICBkb3duID0gYXJnYltzdHJpZGUgKyB4XTsKKyAgICBsZWZ0ID0gY3VycmVudDsKKyAgICBjdXJyZW50ID0gcmlnaHQ7CisgICAgcmlnaHQgPSBhcmdiW3ggKyAxXTsKKyAgICBpZiAodXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICAgICAgdXAgPSBBZGRHcmVlblRvQmx1ZUFuZFJlZCh1cCk7CisgICAgICBkb3duID0gQWRkR3JlZW5Ub0JsdWVBbmRSZWQoZG93bik7CisgICAgICByaWdodCA9IEFkZEdyZWVuVG9CbHVlQW5kUmVkKHJpZ2h0KTsKKyAgICB9CisgICAgbWF4X2RpZmZzW3hdID0gTWF4RGlmZkFyb3VuZFBpeGVsKGN1cnJlbnQsIHVwLCBkb3duLCBsZWZ0LCByaWdodCk7CisgIH0KK30KKworLy8gUXVhbnRpemUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgYWN0dWFsIGNvbXBvbmVudCB2YWx1ZSBhbmQgaXRzIHByZWRpY3Rpb24KKy8vIHRvIGEgbXVsdGlwbGUgb2YgcXVhbnRpemF0aW9uLCB3b3JraW5nIG1vZHVsbyAyNTYsIHRha2luZyBjYXJlIG5vdCB0byBjcm9zcworLy8gYSBib3VuZGFyeSAoaW5jbHVzaXZlIHVwcGVyIGxpbWl0KS4KK3N0YXRpYyB1aW50OF90IE5lYXJMb3NzbGVzc0NvbXBvbmVudCh1aW50OF90IHZhbHVlLCB1aW50OF90IHByZWRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBib3VuZGFyeSwgaW50IHF1YW50aXphdGlvbikgeworICBjb25zdCBpbnQgcmVzaWR1YWwgPSAodmFsdWUgLSBwcmVkaWN0KSAmIDB4ZmY7CisgIGNvbnN0IGludCBib3VuZGFyeV9yZXNpZHVhbCA9IChib3VuZGFyeSAtIHByZWRpY3QpICYgMHhmZjsKKyAgY29uc3QgaW50IGxvd2VyID0gcmVzaWR1YWwgJiB+KHF1YW50aXphdGlvbiAtIDEpOworICBjb25zdCBpbnQgdXBwZXIgPSBsb3dlciArIHF1YW50aXphdGlvbjsKKyAgLy8gUmVzb2x2ZSB0aWVzIHRvd2FyZHMgYSB2YWx1ZSBjbG9zZXIgdG8gdGhlIHByZWRpY3Rpb24gKGkuZS4gdG93YXJkcyBsb3dlcgorICAvLyBpZiB2YWx1ZSBjb21lcyBhZnRlciBwcmVkaWN0aW9uIGFuZCB0b3dhcmRzIHVwcGVyIG90aGVyd2lzZSkuCisgIGNvbnN0IGludCBiaWFzID0gKChib3VuZGFyeSAtIHZhbHVlKSAmIDB4ZmYpIDwgYm91bmRhcnlfcmVzaWR1YWw7CisgIGlmIChyZXNpZHVhbCAtIGxvd2VyIDwgdXBwZXIgLSByZXNpZHVhbCArIGJpYXMpIHsKKyAgICAvLyBsb3dlciBpcyBjbG9zZXIgdG8gcmVzaWR1YWwgdGhhbiB1cHBlci4KKyAgICBpZiAocmVzaWR1YWwgPiBib3VuZGFyeV9yZXNpZHVhbCAmJiBsb3dlciA8PSBib3VuZGFyeV9yZXNpZHVhbCkgeworICAgICAgLy8gSGFsdmUgcXVhbnRpemF0aW9uIHN0ZXAgdG8gYXZvaWQgY3Jvc3NpbmcgYm91bmRhcnkuIFRoaXMgbWlkcG9pbnQgaXMKKyAgICAgIC8vIG9uIHRoZSBzYW1lIHNpZGUgb2YgYm91bmRhcnkgYXMgcmVzaWR1YWwgYmVjYXVzZSBtaWRwb2ludCA+PSByZXNpZHVhbAorICAgICAgLy8gKHNpbmNlIGxvd2VyIGlzIGNsb3NlciB0aGFuIHVwcGVyKSBhbmQgcmVzaWR1YWwgaXMgYWJvdmUgdGhlIGJvdW5kYXJ5LgorICAgICAgcmV0dXJuIGxvd2VyICsgKHF1YW50aXphdGlvbiA+PiAxKTsKKyAgICB9CisgICAgcmV0dXJuIGxvd2VyOworICB9IGVsc2UgeworICAgIC8vIHVwcGVyIGlzIGNsb3NlciB0byByZXNpZHVhbCB0aGFuIGxvd2VyLgorICAgIGlmIChyZXNpZHVhbCA8PSBib3VuZGFyeV9yZXNpZHVhbCAmJiB1cHBlciA+IGJvdW5kYXJ5X3Jlc2lkdWFsKSB7CisgICAgICAvLyBIYWx2ZSBxdWFudGl6YXRpb24gc3RlcCB0byBhdm9pZCBjcm9zc2luZyBib3VuZGFyeS4gVGhpcyBtaWRwb2ludCBpcworICAgICAgLy8gb24gdGhlIHNhbWUgc2lkZSBvZiBib3VuZGFyeSBhcyByZXNpZHVhbCBiZWNhdXNlIG1pZHBvaW50IDw9IHJlc2lkdWFsCisgICAgICAvLyAoc2luY2UgdXBwZXIgaXMgY2xvc2VyIHRoYW4gbG93ZXIpIGFuZCByZXNpZHVhbCBpcyBiZWxvdyB0aGUgYm91bmRhcnkuCisgICAgICByZXR1cm4gbG93ZXIgKyAocXVhbnRpemF0aW9uID4+IDEpOworICAgIH0KKyAgICByZXR1cm4gdXBwZXIgJiAweGZmOworICB9Cit9CisKKy8vIFF1YW50aXplIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBhY3R1YWwgcGl4ZWwgdmFsdWUgYW5kCisvLyBpdHMgcHJlZGljdGlvbiB0byBhIG11bHRpcGxlIG9mIGEgcXVhbnRpemF0aW9uIChhIHBvd2VyIG9mIDIsIG5vdCBsYXJnZXIgdGhhbgorLy8gbWF4X3F1YW50aXphdGlvbiB3aGljaCBpcyBhIHBvd2VyIG9mIDIsIHNtYWxsZXIgdGhhbiBtYXhfZGlmZikuIFRha2UgY2FyZSBpZgorLy8gdmFsdWUgYW5kIHByZWRpY3QgaGF2ZSB1bmRlcmdvbmUgc3VidHJhY3QgZ3JlZW4sIHdoaWNoIG1lYW5zIHRoYXQgcmVkIGFuZAorLy8gYmx1ZSBhcmUgcmVwcmVzZW50ZWQgYXMgb2Zmc2V0cyBmcm9tIGdyZWVuLgorI2RlZmluZSBORUFSX0xPU1NMRVNTX0RJRkYoYSwgYikgKHVpbnQ4X3QpKCgoKGludCkoYSkgLSAoaW50KShiKSkpICYgMHhmZikKK3N0YXRpYyB1aW50MzJfdCBOZWFyTG9zc2xlc3ModWludDMyX3QgdmFsdWUsIHVpbnQzMl90IHByZWRpY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfcXVhbnRpemF0aW9uLCBpbnQgbWF4X2RpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGludCBxdWFudGl6YXRpb247CisgIHVpbnQ4X3QgbmV3X2dyZWVuID0gMDsKKyAgdWludDhfdCBncmVlbl9kaWZmID0gMDsKKyAgdWludDhfdCBhLCByLCBnLCBiOworICBpZiAobWF4X2RpZmYgPD0gMikgeworICAgIHJldHVybiBWUDhMU3ViUGl4ZWxzKHZhbHVlLCBwcmVkaWN0KTsKKyAgfQorICBxdWFudGl6YXRpb24gPSBtYXhfcXVhbnRpemF0aW9uOworICB3aGlsZSAocXVhbnRpemF0aW9uID49IG1heF9kaWZmKSB7CisgICAgcXVhbnRpemF0aW9uID4+PSAxOworICB9CisgIGlmICgodmFsdWUgPj4gMjQpID09IDAgfHwgKHZhbHVlID4+IDI0KSA9PSAweGZmKSB7CisgICAgLy8gUHJlc2VydmUgdHJhbnNwYXJlbmN5IG9mIGZ1bGx5IHRyYW5zcGFyZW50IG9yIGZ1bGx5IG9wYXF1ZSBwaXhlbHMuCisgICAgYSA9IE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSA+PiAyNCwgcHJlZGljdCA+PiAyNCk7CisgIH0gZWxzZSB7CisgICAgYSA9IE5lYXJMb3NzbGVzc0NvbXBvbmVudCh2YWx1ZSA+PiAyNCwgcHJlZGljdCA+PiAyNCwgMHhmZiwgcXVhbnRpemF0aW9uKTsKKyAgfQorICBnID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KCh2YWx1ZSA+PiA4KSAmIDB4ZmYsIChwcmVkaWN0ID4+IDgpICYgMHhmZiwgMHhmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24pOworICBpZiAodXNlZF9zdWJ0cmFjdF9ncmVlbikgeworICAgIC8vIFRoZSBncmVlbiBvZmZzZXQgd2lsbCBiZSBhZGRlZCB0byByZWQgYW5kIGJsdWUgY29tcG9uZW50cyBkdXJpbmcgZGVjb2RpbmcKKyAgICAvLyB0byBvYnRhaW4gdGhlIGFjdHVhbCByZWQgYW5kIGJsdWUgdmFsdWVzLgorICAgIG5ld19ncmVlbiA9ICgocHJlZGljdCA+PiA4KSArIGcpICYgMHhmZjsKKyAgICAvLyBUaGUgYW1vdW50IGJ5IHdoaWNoIGdyZWVuIGhhcyBiZWVuIGFkanVzdGVkIGR1cmluZyBxdWFudGl6YXRpb24uIEl0IGlzCisgICAgLy8gc3VidHJhY3RlZCBmcm9tIHJlZCBhbmQgYmx1ZSBmb3IgY29tcGVuc2F0aW9uLCB0byBhdm9pZCBhY2N1bXVsYXRpbmcgdHdvCisgICAgLy8gcXVhbnRpemF0aW9uIGVycm9ycyBpbiB0aGVtLgorICAgIGdyZWVuX2RpZmYgPSBORUFSX0xPU1NMRVNTX0RJRkYobmV3X2dyZWVuLCB2YWx1ZSA+PiA4KTsKKyAgfQorICByID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSA+PiAxNiwgZ3JlZW5fZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZWRpY3QgPj4gMTYpICYgMHhmZiwgMHhmZiAtIG5ld19ncmVlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24pOworICBiID0gTmVhckxvc3NsZXNzQ29tcG9uZW50KE5FQVJfTE9TU0xFU1NfRElGRih2YWx1ZSwgZ3JlZW5fZGlmZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGljdCAmIDB4ZmYsIDB4ZmYgLSBuZXdfZ3JlZW4sIHF1YW50aXphdGlvbik7CisgIHJldHVybiAoKHVpbnQzMl90KWEgPDwgMjQpIHwgKCh1aW50MzJfdClyIDw8IDE2KSB8ICgodWludDMyX3QpZyA8PCA4KSB8IGI7Cit9CisjdW5kZWYgTkVBUl9MT1NTTEVTU19ESUZGCisjZW5kaWYgIC8vIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKworLy8gU3RvcmVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBpeGVsIGFuZCBpdHMgcHJlZGljdGlvbiBpbiAib3V0Ii4KKy8vIEluIGNhc2Ugb2YgYSBsb3NzeSBlbmNvZGluZywgdXBkYXRlcyB0aGUgc291cmNlIGltYWdlIHRvIGF2b2lkIHByb3BhZ2F0aW5nCisvLyB0aGUgZGV2aWF0aW9uIGZ1cnRoZXIgdG8gcGl4ZWxzIHdoaWNoIGRlcGVuZCBvbiB0aGUgY3VycmVudCBwaXhlbCBmb3IgdGhlaXIKKy8vIHByZWRpY3Rpb25zLgorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgR2V0UmVzaWR1YWwoCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCB1aW50MzJfdCogY29uc3QgdXBwZXJfcm93LAorICAgIHVpbnQzMl90KiBjb25zdCBjdXJyZW50X3JvdywgY29uc3QgdWludDhfdCogY29uc3QgbWF4X2RpZmZzLCBpbnQgbW9kZSwKKyAgICBpbnQgeF9zdGFydCwgaW50IHhfZW5kLCBpbnQgeSwgaW50IG1heF9xdWFudGl6YXRpb24sIGludCBleGFjdCwKKyAgICBpbnQgdXNlZF9zdWJ0cmFjdF9ncmVlbiwgdWludDMyX3QqIGNvbnN0IG91dCkgeworICBpZiAoZXhhY3QpIHsKKyAgICBQcmVkaWN0QmF0Y2gobW9kZSwgeF9zdGFydCwgeSwgeF9lbmQgLSB4X3N0YXJ0LCBjdXJyZW50X3JvdywgdXBwZXJfcm93LAorICAgICAgICAgICAgICAgICBvdXQpOworICB9IGVsc2UgeworICAgIGNvbnN0IFZQOExQcmVkaWN0b3JGdW5jIHByZWRfZnVuYyA9IFZQOExQcmVkaWN0b3JzW21vZGVdOworICAgIGludCB4OworICAgIGZvciAoeCA9IHhfc3RhcnQ7IHggPCB4X2VuZDsgKyt4KSB7CisgICAgICB1aW50MzJfdCBwcmVkaWN0OworICAgICAgdWludDMyX3QgcmVzaWR1YWw7CisgICAgICBpZiAoeSA9PSAwKSB7CisgICAgICAgIHByZWRpY3QgPSAoeCA9PSAwKSA/IEFSR0JfQkxBQ0sgOiBjdXJyZW50X3Jvd1t4IC0gMV07ICAvLyBMZWZ0LgorICAgICAgfSBlbHNlIGlmICh4ID09IDApIHsKKyAgICAgICAgcHJlZGljdCA9IHVwcGVyX3Jvd1t4XTsgIC8vIFRvcC4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByZWRpY3QgPSBwcmVkX2Z1bmMoY3VycmVudF9yb3dbeCAtIDFdLCB1cHBlcl9yb3cgKyB4KTsKKyAgICAgIH0KKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgICAgICBpZiAobWF4X3F1YW50aXphdGlvbiA9PSAxIHx8IG1vZGUgPT0gMCB8fCB5ID09IDAgfHwgeSA9PSBoZWlnaHQgLSAxIHx8CisgICAgICAgICAgeCA9PSAwIHx8IHggPT0gd2lkdGggLSAxKSB7CisgICAgICAgIHJlc2lkdWFsID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXNpZHVhbCA9IE5lYXJMb3NzbGVzcyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCwgbWF4X3F1YW50aXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RpZmZzW3hdLCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICAgIGN1cnJlbnRfcm93W3hdID0gVlA4TEFkZFBpeGVscyhwcmVkaWN0LCByZXNpZHVhbCk7CisgICAgICAgIC8vIHggaXMgbmV2ZXIgMCBoZXJlIHNvIHdlIGRvIG5vdCBuZWVkIHRvIHVwZGF0ZSB1cHBlcl9yb3cgbGlrZSBiZWxvdy4KKyAgICAgIH0KKyNlbHNlCisgICAgICAodm9pZCltYXhfZGlmZnM7CisgICAgICAodm9pZCloZWlnaHQ7CisgICAgICAodm9pZCltYXhfcXVhbnRpemF0aW9uOworICAgICAgKHZvaWQpdXNlZF9zdWJ0cmFjdF9ncmVlbjsKKyAgICAgIHJlc2lkdWFsID0gVlA4TFN1YlBpeGVscyhjdXJyZW50X3Jvd1t4XSwgcHJlZGljdCk7CisjZW5kaWYKKyAgICAgIGlmICgoY3VycmVudF9yb3dbeF0gJiBrTWFza0FscGhhKSA9PSAwKSB7CisgICAgICAgIC8vIElmIGFscGhhIGlzIDAsIGNsZWFudXAgUkdCLiBXZSBjYW4gY2hvb3NlIHRoZSBSR0IgdmFsdWVzIG9mIHRoZQorICAgICAgICAvLyByZXNpZHVhbCBmb3IgYmVzdCBjb21wcmVzc2lvbi4gVGhlIHByZWRpY3Rpb24gb2YgYWxwaGEgaXRzZWxmIGNhbiBiZQorICAgICAgICAvLyBub24temVybyBhbmQgbXVzdCBiZSBrZXB0IHRob3VnaC4gV2UgY2hvb3NlIFJHQiBvZiB0aGUgcmVzaWR1YWwgdG8gYmUKKyAgICAgICAgLy8gMC4KKyAgICAgICAgcmVzaWR1YWwgJj0ga01hc2tBbHBoYTsKKyAgICAgICAgLy8gVXBkYXRlIHRoZSBzb3VyY2UgaW1hZ2UuCisgICAgICAgIGN1cnJlbnRfcm93W3hdID0gcHJlZGljdCAmIH5rTWFza0FscGhhOworICAgICAgICAvLyBUaGUgcHJlZGljdGlvbiBmb3IgdGhlIHJpZ2h0bW9zdCBwaXhlbCBpbiBhIHJvdyB1c2VzIHRoZSBsZWZ0bW9zdAorICAgICAgICAvLyBwaXhlbAorICAgICAgICAvLyBpbiB0aGF0IHJvdyBhcyBpdHMgdG9wLXJpZ2h0IGNvbnRleHQgcGl4ZWwuIEhlbmNlIGlmIHdlIGNoYW5nZSB0aGUKKyAgICAgICAgLy8gbGVmdG1vc3QgcGl4ZWwgb2YgY3VycmVudF9yb3csIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZSBtdXN0IGJlCisgICAgICAgIC8vIGFwcGxpZWQKKyAgICAgICAgLy8gdG8gdXBwZXJfcm93IGFzIHdlbGwgd2hlcmUgdG9wLXJpZ2h0IGNvbnRleHQgaXMgYmVpbmcgcmVhZCBmcm9tLgorICAgICAgICBpZiAoeCA9PSAwICYmIHkgIT0gMCkgdXBwZXJfcm93W3dpZHRoXSA9IGN1cnJlbnRfcm93WzBdOworICAgICAgfQorICAgICAgb3V0W3ggLSB4X3N0YXJ0XSA9IHJlc2lkdWFsOworICAgIH0KKyAgfQorfQorCisvLyBSZXR1cm5zIGJlc3QgcHJlZGljdG9yIGFuZCB1cGRhdGVzIHRoZSBhY2N1bXVsYXRlZCBoaXN0b2dyYW0uCisvLyBJZiBtYXhfcXVhbnRpemF0aW9uID4gMSwgYXNzdW1lcyB0aGF0IG5lYXIgbG9zc2xlc3MgcHJvY2Vzc2luZyB3aWxsIGJlCisvLyBhcHBsaWVkLCBxdWFudGl6aW5nIHJlc2lkdWFscyB0byBtdWx0aXBsZXMgb2YgcXVhbnRpemF0aW9uIGxldmVscyB1cCB0bworLy8gbWF4X3F1YW50aXphdGlvbiAodGhlIGFjdHVhbCBxdWFudGl6YXRpb24gbGV2ZWwgZGVwZW5kcyBvbiBzbW9vdGhuZXNzIG5lYXIKKy8vIHRoZSBnaXZlbiBwaXhlbCkuCitzdGF0aWMgaW50IEdldEJlc3RQcmVkaWN0b3JGb3JUaWxlKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwgaW50IGJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2N1bXVsYXRlZFs0XVsyNTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleGFjdCwgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBtb2RlcykgeworICBjb25zdCBpbnQga051bVByZWRNb2RlcyA9IDE0OworICBjb25zdCBpbnQgc3RhcnRfeCA9IHRpbGVfeCA8PCBiaXRzOworICBjb25zdCBpbnQgc3RhcnRfeSA9IHRpbGVfeSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgbWF4X3kgPSBHZXRNaW4odGlsZV9zaXplLCBoZWlnaHQgLSBzdGFydF95KTsKKyAgY29uc3QgaW50IG1heF94ID0gR2V0TWluKHRpbGVfc2l6ZSwgd2lkdGggLSBzdGFydF94KTsKKyAgLy8gV2hldGhlciB0aGVyZSBleGlzdCBjb2x1bW5zIGp1c3Qgb3V0c2lkZSB0aGUgdGlsZS4KKyAgY29uc3QgaW50IGhhdmVfbGVmdCA9IChzdGFydF94ID4gMCk7CisgIC8vIFBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBzdHJpcCBjb3ZlcmluZyB0aGUgdGlsZSBhbmQgYWRqYWNlbnQgY29sdW1ucyBpZgorICAvLyB0aGV5IGV4aXN0LgorICBjb25zdCBpbnQgY29udGV4dF9zdGFydF94ID0gc3RhcnRfeCAtIGhhdmVfbGVmdDsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIGNvbnN0IGludCBjb250ZXh0X3dpZHRoID0gbWF4X3ggKyBoYXZlX2xlZnQgKyAobWF4X3ggPCB3aWR0aCAtIHN0YXJ0X3gpOworI2VuZGlmCisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICAvLyBQcmVkaWN0aW9uIG1vZGVzIG9mIHRoZSBsZWZ0IGFuZCBhYm92ZSBuZWlnaGJvciB0aWxlcy4KKyAgY29uc3QgaW50IGxlZnRfbW9kZSA9ICh0aWxlX3ggPiAwKSA/CisgICAgICAobW9kZXNbdGlsZV95ICogdGlsZXNfcGVyX3JvdyArIHRpbGVfeCAtIDFdID4+IDgpICYgMHhmZiA6IDB4ZmY7CisgIGNvbnN0IGludCBhYm92ZV9tb2RlID0gKHRpbGVfeSA+IDApID8KKyAgICAgIChtb2Rlc1sodGlsZV95IC0gMSkgKiB0aWxlc19wZXJfcm93ICsgdGlsZV94XSA+PiA4KSAmIDB4ZmYgOiAweGZmOworICAvLyBUaGUgd2lkdGggb2YgdXBwZXJfcm93IGFuZCBjdXJyZW50X3JvdyBpcyBvbmUgcGl4ZWwgbGFyZ2VyIHRoYW4gaW1hZ2Ugd2lkdGgKKyAgLy8gdG8gYWxsb3cgdGhlIHRvcCByaWdodCBwaXhlbCB0byBwb2ludCB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93CisgIC8vIHdoZW4gYXQgdGhlIHJpZ2h0IGVkZ2UuCisgIHVpbnQzMl90KiB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7CisgIHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoICsgMTsKKyAgdWludDhfdCogY29uc3QgbWF4X2RpZmZzID0gKHVpbnQ4X3QqKShjdXJyZW50X3JvdyArIHdpZHRoICsgMSk7CisgIGZsb2F0IGJlc3RfZGlmZiA9IE1BWF9ESUZGX0NPU1Q7CisgIGludCBiZXN0X21vZGUgPSAwOworICBpbnQgbW9kZTsKKyAgaW50IGhpc3RvX3N0YWNrXzFbNF1bMjU2XTsKKyAgaW50IGhpc3RvX3N0YWNrXzJbNF1bMjU2XTsKKyAgLy8gTmVlZCBwb2ludGVycyB0byBiZSBhYmxlIHRvIHN3YXAgYXJyYXlzLgorICBpbnQgKCpoaXN0b19hcmdiKVsyNTZdID0gaGlzdG9fc3RhY2tfMTsKKyAgaW50ICgqYmVzdF9oaXN0bylbMjU2XSA9IGhpc3RvX3N0YWNrXzI7CisgIGludCBpLCBqOworICB1aW50MzJfdCByZXNpZHVhbHNbMSA8PCBNQVhfVFJBTlNGT1JNX0JJVFNdOworICBhc3NlcnQoYml0cyA8PSBNQVhfVFJBTlNGT1JNX0JJVFMpOworICBhc3NlcnQobWF4X3ggPD0gKDEgPDwgTUFYX1RSQU5TRk9STV9CSVRTKSk7CisKKyAgZm9yIChtb2RlID0gMDsgbW9kZSA8IGtOdW1QcmVkTW9kZXM7ICsrbW9kZSkgeworICAgIGZsb2F0IGN1cl9kaWZmOworICAgIGludCByZWxhdGl2ZV95OworICAgIG1lbXNldChoaXN0b19hcmdiLCAwLCBzaXplb2YoaGlzdG9fc3RhY2tfMSkpOworICAgIGlmIChzdGFydF95ID4gMCkgeworICAgICAgLy8gUmVhZCB0aGUgcm93IGFib3ZlIHRoZSB0aWxlIHdoaWNoIHdpbGwgYmVjb21lIHRoZSBmaXJzdCB1cHBlcl9yb3cuCisgICAgICAvLyBJbmNsdWRlIGEgcGl4ZWwgdG8gdGhlIGxlZnQgaWYgaXQgZXhpc3RzOyBpbmNsdWRlIGEgcGl4ZWwgdG8gdGhlIHJpZ2h0CisgICAgICAvLyBpbiBhbGwgY2FzZXMgKHdyYXBwaW5nIHRvIHRoZSBsZWZ0bW9zdCBwaXhlbCBvZiB0aGUgbmV4dCByb3cgaWYgaXQgZG9lcworICAgICAgLy8gbm90IGV4aXN0KS4KKyAgICAgIG1lbWNweShjdXJyZW50X3JvdyArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBhcmdiICsgKHN0YXJ0X3kgLSAxKSAqIHdpZHRoICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIHNpemVvZigqYXJnYikgKiAobWF4X3ggKyBoYXZlX2xlZnQgKyAxKSk7CisgICAgfQorICAgIGZvciAocmVsYXRpdmVfeSA9IDA7IHJlbGF0aXZlX3kgPCBtYXhfeTsgKytyZWxhdGl2ZV95KSB7CisgICAgICBjb25zdCBpbnQgeSA9IHN0YXJ0X3kgKyByZWxhdGl2ZV95OworICAgICAgaW50IHJlbGF0aXZlX3g7CisgICAgICB1aW50MzJfdCogdG1wID0gdXBwZXJfcm93OworICAgICAgdXBwZXJfcm93ID0gY3VycmVudF9yb3c7CisgICAgICBjdXJyZW50X3JvdyA9IHRtcDsKKyAgICAgIC8vIFJlYWQgY3VycmVudF9yb3cuIEluY2x1ZGUgYSBwaXhlbCB0byB0aGUgbGVmdCBpZiBpdCBleGlzdHM7IGluY2x1ZGUgYQorICAgICAgLy8gcGl4ZWwgdG8gdGhlIHJpZ2h0IGluIGFsbCBjYXNlcyBleGNlcHQgYXQgdGhlIGJvdHRvbSByaWdodCBjb3JuZXIgb2YKKyAgICAgIC8vIHRoZSBpbWFnZSAod3JhcHBpbmcgdG8gdGhlIGxlZnRtb3N0IHBpeGVsIG9mIHRoZSBuZXh0IHJvdyBpZiBpdCBkb2VzCisgICAgICAvLyBub3QgZXhpc3QgaW4gdGhlIGN1cnJlbnQgcm93KS4KKyAgICAgIG1lbWNweShjdXJyZW50X3JvdyArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICBhcmdiICsgeSAqIHdpZHRoICsgY29udGV4dF9zdGFydF94LAorICAgICAgICAgICAgIHNpemVvZigqYXJnYikgKiAobWF4X3ggKyBoYXZlX2xlZnQgKyAoeSArIDEgPCBoZWlnaHQpKSk7CisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICAgICAgaWYgKG1heF9xdWFudGl6YXRpb24gPiAxICYmIHkgPj0gMSAmJiB5ICsgMSA8IGhlaWdodCkgeworICAgICAgICBNYXhEaWZmc0ZvclJvdyhjb250ZXh0X3dpZHRoLCB3aWR0aCwgYXJnYiArIHkgKiB3aWR0aCArIGNvbnRleHRfc3RhcnRfeCwKKyAgICAgICAgICAgICAgICAgICAgICAgbWF4X2RpZmZzICsgY29udGV4dF9zdGFydF94LCB1c2VkX3N1YnRyYWN0X2dyZWVuKTsKKyAgICAgIH0KKyNlbmRpZgorCisgICAgICBHZXRSZXNpZHVhbCh3aWR0aCwgaGVpZ2h0LCB1cHBlcl9yb3csIGN1cnJlbnRfcm93LCBtYXhfZGlmZnMsIG1vZGUsCisgICAgICAgICAgICAgICAgICBzdGFydF94LCBzdGFydF94ICsgbWF4X3gsIHksIG1heF9xdWFudGl6YXRpb24sIGV4YWN0LAorICAgICAgICAgICAgICAgICAgdXNlZF9zdWJ0cmFjdF9ncmVlbiwgcmVzaWR1YWxzKTsKKyAgICAgIGZvciAocmVsYXRpdmVfeCA9IDA7IHJlbGF0aXZlX3ggPCBtYXhfeDsgKytyZWxhdGl2ZV94KSB7CisgICAgICAgIFVwZGF0ZUhpc3RvKGhpc3RvX2FyZ2IsIHJlc2lkdWFsc1tyZWxhdGl2ZV94XSk7CisgICAgICB9CisgICAgfQorICAgIGN1cl9kaWZmID0gUHJlZGljdGlvbkNvc3RTcGF0aWFsSGlzdG9ncmFtKAorICAgICAgICAoY29uc3QgaW50ICgqKVsyNTZdKWFjY3VtdWxhdGVkLCAoY29uc3QgaW50ICgqKVsyNTZdKWhpc3RvX2FyZ2IpOworICAgIC8vIEZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhci4KKyAgICBpZiAobW9kZSA9PSBsZWZ0X21vZGUpIGN1cl9kaWZmIC09IGtTcGF0aWFsUHJlZGljdG9yQmlhczsKKyAgICBpZiAobW9kZSA9PSBhYm92ZV9tb2RlKSBjdXJfZGlmZiAtPSBrU3BhdGlhbFByZWRpY3RvckJpYXM7CisKKyAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKKyAgICAgIGludCAoKnRtcClbMjU2XSA9IGhpc3RvX2FyZ2I7CisgICAgICBoaXN0b19hcmdiID0gYmVzdF9oaXN0bzsKKyAgICAgIGJlc3RfaGlzdG8gPSB0bXA7CisgICAgICBiZXN0X2RpZmYgPSBjdXJfZGlmZjsKKyAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgIGZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgeworICAgICAgYWNjdW11bGF0ZWRbaV1bal0gKz0gYmVzdF9oaXN0b1tpXVtqXTsKKyAgICB9CisgIH0KKworICByZXR1cm4gYmVzdF9tb2RlOworfQorCisvLyBDb252ZXJ0cyBwaXhlbHMgb2YgdGhlIGltYWdlIHRvIHJlc2lkdWFscyB3aXRoIHJlc3BlY3QgdG8gcHJlZGljdGlvbnMuCisvLyBJZiBtYXhfcXVhbnRpemF0aW9uID4gMSwgYXBwbGllcyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHF1YW50aXppbmcKKy8vIHJlc2lkdWFscyB0byBtdWx0aXBsZXMgb2YgcXVhbnRpemF0aW9uIGxldmVscyB1cCB0byBtYXhfcXVhbnRpemF0aW9uCisvLyAodGhlIGFjdHVhbCBxdWFudGl6YXRpb24gbGV2ZWwgZGVwZW5kcyBvbiBzbW9vdGhuZXNzIG5lYXIgdGhlIGdpdmVuIHBpeGVsKS4KK3N0YXRpYyB2b2lkIENvcHlJbWFnZVdpdGhQcmVkaWN0aW9uKGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaXRzLCB1aW50MzJfdCogY29uc3QgbW9kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYl9zY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCwgaW50IG1heF9xdWFudGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICAvLyBUaGUgd2lkdGggb2YgdXBwZXJfcm93IGFuZCBjdXJyZW50X3JvdyBpcyBvbmUgcGl4ZWwgbGFyZ2VyIHRoYW4gaW1hZ2Ugd2lkdGgKKyAgLy8gdG8gYWxsb3cgdGhlIHRvcCByaWdodCBwaXhlbCB0byBwb2ludCB0byB0aGUgbGVmdG1vc3QgcGl4ZWwgb2YgdGhlIG5leHQgcm93CisgIC8vIHdoZW4gYXQgdGhlIHJpZ2h0IGVkZ2UuCisgIHVpbnQzMl90KiB1cHBlcl9yb3cgPSBhcmdiX3NjcmF0Y2g7CisgIHVpbnQzMl90KiBjdXJyZW50X3JvdyA9IHVwcGVyX3JvdyArIHdpZHRoICsgMTsKKyAgdWludDhfdCogY3VycmVudF9tYXhfZGlmZnMgPSAodWludDhfdCopKGN1cnJlbnRfcm93ICsgd2lkdGggKyAxKTsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgIHVpbnQ4X3QqIGxvd2VyX21heF9kaWZmcyA9IGN1cnJlbnRfbWF4X2RpZmZzICsgd2lkdGg7CisjZW5kaWYKKyAgaW50IHk7CisKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgaW50IHg7CisgICAgdWludDMyX3QqIGNvbnN0IHRtcDMyID0gdXBwZXJfcm93OworICAgIHVwcGVyX3JvdyA9IGN1cnJlbnRfcm93OworICAgIGN1cnJlbnRfcm93ID0gdG1wMzI7CisgICAgbWVtY3B5KGN1cnJlbnRfcm93LCBhcmdiICsgeSAqIHdpZHRoLAorICAgICAgICAgICBzaXplb2YoKmFyZ2IpICogKHdpZHRoICsgKHkgKyAxIDwgaGVpZ2h0KSkpOworCisgICAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAgIFByZWRpY3RCYXRjaChrUHJlZExvd0VmZm9ydCwgMCwgeSwgd2lkdGgsIGN1cnJlbnRfcm93LCB1cHBlcl9yb3csCisgICAgICAgICAgICAgICAgICAgYXJnYiArIHkgKiB3aWR0aCk7CisgICAgfSBlbHNlIHsKKyNpZiAoV0VCUF9ORUFSX0xPU1NMRVNTID09IDEpCisgICAgICBpZiAobWF4X3F1YW50aXphdGlvbiA+IDEpIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBtYXhfZGlmZnMgZm9yIHRoZSBsb3dlciByb3cgbm93LCBiZWNhdXNlIHRoYXQgbmVlZHMgdGhlCisgICAgICAgIC8vIGNvbnRlbnRzIG9mIGFyZ2IgZm9yIHRoZSBjdXJyZW50IHJvdywgd2hpY2ggd2Ugd2lsbCBvdmVyd3JpdGUgd2l0aAorICAgICAgICAvLyByZXNpZHVhbHMgYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUgbmV4dCByb3cuCisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcDggPSBjdXJyZW50X21heF9kaWZmczsKKyAgICAgICAgY3VycmVudF9tYXhfZGlmZnMgPSBsb3dlcl9tYXhfZGlmZnM7CisgICAgICAgIGxvd2VyX21heF9kaWZmcyA9IHRtcDg7CisgICAgICAgIGlmICh5ICsgMiA8IGhlaWdodCkgeworICAgICAgICAgIE1heERpZmZzRm9yUm93KHdpZHRoLCB3aWR0aCwgYXJnYiArICh5ICsgMSkgKiB3aWR0aCwgbG93ZXJfbWF4X2RpZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworICAgICAgICB9CisgICAgICB9CisjZW5kaWYKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3aWR0aDspIHsKKyAgICAgICAgY29uc3QgaW50IG1vZGUgPQorICAgICAgICAgICAgKG1vZGVzWyh5ID4+IGJpdHMpICogdGlsZXNfcGVyX3JvdyArICh4ID4+IGJpdHMpXSA+PiA4KSAmIDB4ZmY7CisgICAgICAgIGludCB4X2VuZCA9IHggKyAoMSA8PCBiaXRzKTsKKyAgICAgICAgaWYgKHhfZW5kID4gd2lkdGgpIHhfZW5kID0gd2lkdGg7CisgICAgICAgIEdldFJlc2lkdWFsKHdpZHRoLCBoZWlnaHQsIHVwcGVyX3JvdywgY3VycmVudF9yb3csIGN1cnJlbnRfbWF4X2RpZmZzLAorICAgICAgICAgICAgICAgICAgICBtb2RlLCB4LCB4X2VuZCwgeSwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4sIGFyZ2IgKyB5ICogd2lkdGggKyB4KTsKKyAgICAgICAgeCA9IHhfZW5kOworICAgICAgfQorICAgIH0KKyAgfQorfQorCisvLyBGaW5kcyB0aGUgYmVzdCBwcmVkaWN0b3IgZm9yIGVhY2ggdGlsZSwgYW5kIGNvbnZlcnRzIHRoZSBpbWFnZSB0byByZXNpZHVhbHMKKy8vIHdpdGggcmVzcGVjdCB0byBwcmVkaWN0aW9ucy4gSWYgbmVhcl9sb3NzbGVzc19xdWFsaXR5IDwgMTAwLCBhcHBsaWVzCisvLyBuZWFyIGxvc3NsZXNzIHByb2Nlc3NpbmcsIHNoYXZpbmcgb2ZmIG1vcmUgYml0cyBvZiByZXNpZHVhbHMgZm9yIGxvd2VyCisvLyBxdWFsaXRpZXMuCit2b2lkIFZQOExSZXNpZHVhbEltYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGNvbnN0IGFyZ2Jfc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGltYWdlLCBpbnQgbmVhcl9sb3NzbGVzc19xdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuKSB7CisgIGNvbnN0IGludCB0aWxlc19wZXJfcm93ID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGJpdHMpOworICBjb25zdCBpbnQgdGlsZXNfcGVyX2NvbCA9IFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgYml0cyk7CisgIGludCB0aWxlX3k7CisgIGludCBoaXN0b1s0XVsyNTZdOworICBjb25zdCBpbnQgbWF4X3F1YW50aXphdGlvbiA9IDEgPDwgVlA4TE5lYXJMb3NzbGVzc0JpdHMobmVhcl9sb3NzbGVzc19xdWFsaXR5KTsKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGlsZXNfcGVyX3JvdyAqIHRpbGVzX3Blcl9jb2w7ICsraSkgeworICAgICAgaW1hZ2VbaV0gPSBBUkdCX0JMQUNLIHwgKGtQcmVkTG93RWZmb3J0IDw8IDgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBtZW1zZXQoaGlzdG8sIDAsIHNpemVvZihoaXN0bykpOworICAgIGZvciAodGlsZV95ID0gMDsgdGlsZV95IDwgdGlsZXNfcGVyX2NvbDsgKyt0aWxlX3kpIHsKKyAgICAgIGludCB0aWxlX3g7CisgICAgICBmb3IgKHRpbGVfeCA9IDA7IHRpbGVfeCA8IHRpbGVzX3Blcl9yb3c7ICsrdGlsZV94KSB7CisgICAgICAgIGNvbnN0IGludCBwcmVkID0gR2V0QmVzdFByZWRpY3RvckZvclRpbGUod2lkdGgsIGhlaWdodCwgdGlsZV94LCB0aWxlX3ksCisgICAgICAgICAgICBiaXRzLCBoaXN0bywgYXJnYl9zY3JhdGNoLCBhcmdiLCBtYXhfcXVhbnRpemF0aW9uLCBleGFjdCwKKyAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4sIGltYWdlKTsKKyAgICAgICAgaW1hZ2VbdGlsZV95ICogdGlsZXNfcGVyX3JvdyArIHRpbGVfeF0gPSBBUkdCX0JMQUNLIHwgKHByZWQgPDwgOCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgQ29weUltYWdlV2l0aFByZWRpY3Rpb24od2lkdGgsIGhlaWdodCwgYml0cywgaW1hZ2UsIGFyZ2Jfc2NyYXRjaCwgYXJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCwgbWF4X3F1YW50aXphdGlvbiwgZXhhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWRfc3VidHJhY3RfZ3JlZW4pOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29sb3IgdHJhbnNmb3JtIGZ1bmN0aW9ucy4KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgTXVsdGlwbGllcnNDbGVhcihWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyA9IDA7CisgIG0tPmdyZWVuX3RvX2JsdWVfID0gMDsKKyAgbS0+cmVkX3RvX2JsdWVfID0gMDsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgQ29sb3JDb2RlVG9NdWx0aXBsaWVycyh1aW50MzJfdCBjb2xvcl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMTXVsdGlwbGllcnMqIGNvbnN0IG0pIHsKKyAgbS0+Z3JlZW5fdG9fcmVkXyAgPSAoY29sb3JfY29kZSA+PiAgMCkgJiAweGZmOworICBtLT5ncmVlbl90b19ibHVlXyA9IChjb2xvcl9jb2RlID4+ICA4KSAmIDB4ZmY7CisgIG0tPnJlZF90b19ibHVlXyAgID0gKGNvbG9yX2NvZGUgPj4gMTYpICYgMHhmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IE11bHRpcGxpZXJzVG9Db2xvckNvZGUoCisgICAgY29uc3QgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBtKSB7CisgIHJldHVybiAweGZmMDAwMDAwdSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5yZWRfdG9fYmx1ZV8pIDw8IDE2KSB8CisgICAgICAgICAoKHVpbnQzMl90KShtLT5ncmVlbl90b19ibHVlXykgPDwgOCkgfAorICAgICAgICAgbS0+Z3JlZW5fdG9fcmVkXzsKK30KKworc3RhdGljIGZsb2F0IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihjb25zdCBpbnQgYWNjdW11bGF0ZWRbMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGNvdW50c1syNTZdKSB7CisgIC8vIEZhdm9yIGxvdyBlbnRyb3B5LCBsb2NhbGx5IGFuZCBnbG9iYWxseS4KKyAgLy8gRmF2b3Igc21hbGwgYWJzb2x1dGUgdmFsdWVzIGZvciBQcmVkaWN0aW9uQ29zdFNwYXRpYWwKKyAgc3RhdGljIGNvbnN0IGRvdWJsZSBrRXhwVmFsdWUgPSAyLjQ7CisgIHJldHVybiBWUDhMQ29tYmluZWRTaGFubm9uRW50cm9weShjb3VudHMsIGFjY3VtdWxhdGVkKSArCisgICAgICAgICBQcmVkaWN0aW9uQ29zdFNwYXRpYWwoY291bnRzLCAzLCBrRXhwVmFsdWUpOworfQorCitzdGF0aWMgZmxvYXQgR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yUmVkKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBncmVlbl90b19yZWQsCisgICAgY29uc3QgaW50IGFjY3VtdWxhdGVkX3JlZF9oaXN0b1syNTZdKSB7CisgIGludCBoaXN0b1syNTZdID0geyAwIH07CisgIGZsb2F0IGN1cl9kaWZmOworCisgIFZQOExDb2xsZWN0Q29sb3JSZWRUcmFuc2Zvcm1zKGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWVuX3RvX3JlZCwgaGlzdG8pOworCisgIGN1cl9kaWZmID0gUHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yKGFjY3VtdWxhdGVkX3JlZF9oaXN0bywgaGlzdG8pOworICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fcmVkID09IHByZXZfeC5ncmVlbl90b19yZWRfKSB7CisgICAgY3VyX2RpZmYgLT0gMzsgIC8vIGZhdm9yIGtlZXBpbmcgdGhlIGFyZWFzIGxvY2FsbHkgc2ltaWxhcgorICB9CisgIGlmICgodWludDhfdClncmVlbl90b19yZWQgPT0gcHJldl95LmdyZWVuX3RvX3JlZF8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKGdyZWVuX3RvX3JlZCA9PSAwKSB7CisgICAgY3VyX2RpZmYgLT0gMzsKKyAgfQorICByZXR1cm4gY3VyX2RpZmY7Cit9CisKK3N0YXRpYyB2b2lkIEdldEJlc3RHcmVlblRvUmVkKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBxdWFsaXR5LAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSwgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBiZXN0X3R4KSB7CisgIGNvbnN0IGludCBrTWF4SXRlcnMgPSA0ICsgKCg3ICogcXVhbGl0eSkgPj4gOCk7ICAvLyBpbiByYW5nZSBbNC4uNl0KKyAgaW50IGdyZWVuX3RvX3JlZF9iZXN0ID0gMDsKKyAgaW50IGl0ZXIsIG9mZnNldDsKKyAgZmxvYXQgYmVzdF9kaWZmID0gR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yUmVkKAorICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICBncmVlbl90b19yZWRfYmVzdCwgYWNjdW11bGF0ZWRfcmVkX2hpc3RvKTsKKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGtNYXhJdGVyczsgKytpdGVyKSB7CisgICAgLy8gQ29sb3JUcmFuc2Zvcm1EZWx0YSBpcyBhIDMuNSBiaXQgZml4ZWQgcG9pbnQsIHNvIDMyIGlzIGVxdWFsIHRvCisgICAgLy8gb25lIGluIGNvbG9yIGNvbXB1dGF0aW9uLiBIYXZpbmcgaW5pdGlhbCBkZWx0YSBoZXJlIGFzIDEgaXMgc3VmZmljaWVudAorICAgIC8vIHRvIGV4cGxvcmUgdGhlIHJhbmdlIG9mICgtMiwgMikuCisgICAgY29uc3QgaW50IGRlbHRhID0gMzIgPj4gaXRlcjsKKyAgICAvLyBUcnkgYSBuZWdhdGl2ZSBhbmQgYSBwb3NpdGl2ZSBkZWx0YSBmcm9tIHRoZSBiZXN0IGtub3duIHZhbHVlLgorICAgIGZvciAob2Zmc2V0ID0gLWRlbHRhOyBvZmZzZXQgPD0gZGVsdGE7IG9mZnNldCArPSAyICogZGVsdGEpIHsKKyAgICAgIGNvbnN0IGludCBncmVlbl90b19yZWRfY3VyID0gb2Zmc2V0ICsgZ3JlZW5fdG9fcmVkX2Jlc3Q7CisgICAgICBjb25zdCBmbG9hdCBjdXJfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvclJlZCgKKyAgICAgICAgICBhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LCBwcmV2X3gsIHByZXZfeSwKKyAgICAgICAgICBncmVlbl90b19yZWRfY3VyLCBhY2N1bXVsYXRlZF9yZWRfaGlzdG8pOworICAgICAgaWYgKGN1cl9kaWZmIDwgYmVzdF9kaWZmKSB7CisgICAgICAgIGJlc3RfZGlmZiA9IGN1cl9kaWZmOworICAgICAgICBncmVlbl90b19yZWRfYmVzdCA9IGdyZWVuX3RvX3JlZF9jdXI7CisgICAgICB9CisgICAgfQorICB9CisgIGJlc3RfdHgtPmdyZWVuX3RvX3JlZF8gPSBncmVlbl90b19yZWRfYmVzdDsKK30KKworc3RhdGljIGZsb2F0IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgY29uc3QgdWludDMyX3QqIGFyZ2IsIGludCBzdHJpZGUsIGludCB0aWxlX3dpZHRoLCBpbnQgdGlsZV9oZWlnaHQsCisgICAgVlA4TE11bHRpcGxpZXJzIHByZXZfeCwgVlA4TE11bHRpcGxpZXJzIHByZXZfeSwKKyAgICBpbnQgZ3JlZW5fdG9fYmx1ZSwgaW50IHJlZF90b19ibHVlLCBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdKSB7CisgIGludCBoaXN0b1syNTZdID0geyAwIH07CisgIGZsb2F0IGN1cl9kaWZmOworCisgIFZQOExDb2xsZWN0Q29sb3JCbHVlVHJhbnNmb3JtcyhhcmdiLCBzdHJpZGUsIHRpbGVfd2lkdGgsIHRpbGVfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlZW5fdG9fYmx1ZSwgcmVkX3RvX2JsdWUsIGhpc3RvKTsKKworICBjdXJfZGlmZiA9IFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvcihhY2N1bXVsYXRlZF9ibHVlX2hpc3RvLCBoaXN0byk7CisgIGlmICgodWludDhfdClncmVlbl90b19ibHVlID09IHByZXZfeC5ncmVlbl90b19ibHVlXykgeworICAgIGN1cl9kaWZmIC09IDM7ICAvLyBmYXZvciBrZWVwaW5nIHRoZSBhcmVhcyBsb2NhbGx5IHNpbWlsYXIKKyAgfQorICBpZiAoKHVpbnQ4X3QpZ3JlZW5fdG9fYmx1ZSA9PSBwcmV2X3kuZ3JlZW5fdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZfeC5yZWRfdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKCh1aW50OF90KXJlZF90b19ibHVlID09IHByZXZfeS5yZWRfdG9fYmx1ZV8pIHsKKyAgICBjdXJfZGlmZiAtPSAzOyAgLy8gZmF2b3Iga2VlcGluZyB0aGUgYXJlYXMgbG9jYWxseSBzaW1pbGFyCisgIH0KKyAgaWYgKGdyZWVuX3RvX2JsdWUgPT0gMCkgeworICAgIGN1cl9kaWZmIC09IDM7CisgIH0KKyAgaWYgKHJlZF90b19ibHVlID09IDApIHsKKyAgICBjdXJfZGlmZiAtPSAzOworICB9CisgIHJldHVybiBjdXJfZGlmZjsKK30KKworI2RlZmluZSBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzIDgKKyNkZWZpbmUga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMgNworc3RhdGljIHZvaWQgR2V0QmVzdEdyZWVuUmVkVG9CbHVlKAorICAgIGNvbnN0IHVpbnQzMl90KiBhcmdiLCBpbnQgc3RyaWRlLCBpbnQgdGlsZV93aWR0aCwgaW50IHRpbGVfaGVpZ2h0LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksIGludCBxdWFsaXR5LAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvWzI1Nl0sCisgICAgVlA4TE11bHRpcGxpZXJzKiBjb25zdCBiZXN0X3R4KSB7CisgIGNvbnN0IGludDhfdCBvZmZzZXRba0dyZWVuUmVkVG9CbHVlTnVtQXhpc11bMl0gPQorICAgICAge3swLCAtMX0sIHswLCAxfSwgey0xLCAwfSwgezEsIDB9LCB7LTEsIC0xfSwgey0xLCAxfSwgezEsIC0xfSwgezEsIDF9fTsKKyAgY29uc3QgaW50OF90IGRlbHRhX2x1dFtrR3JlZW5SZWRUb0JsdWVNYXhJdGVyc10gPSB7IDE2LCAxNiwgOCwgNCwgMiwgMiwgMiB9OworICBjb25zdCBpbnQgaXRlcnMgPQorICAgICAgKHF1YWxpdHkgPCAyNSkgPyAxIDogKHF1YWxpdHkgPiA1MCkgPyBrR3JlZW5SZWRUb0JsdWVNYXhJdGVycyA6IDQ7CisgIGludCBncmVlbl90b19ibHVlX2Jlc3QgPSAwOworICBpbnQgcmVkX3RvX2JsdWVfYmVzdCA9IDA7CisgIGludCBpdGVyOworICAvLyBJbml0aWFsIHZhbHVlIGF0IG9yaWdpbjoKKyAgZmxvYXQgYmVzdF9kaWZmID0gR2V0UHJlZGljdGlvbkNvc3RDcm9zc0NvbG9yQmx1ZSgKKyAgICAgIGFyZ2IsIHN0cmlkZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsIHByZXZfeCwgcHJldl95LAorICAgICAgZ3JlZW5fdG9fYmx1ZV9iZXN0LCByZWRfdG9fYmx1ZV9iZXN0LCBhY2N1bXVsYXRlZF9ibHVlX2hpc3RvKTsKKyAgZm9yIChpdGVyID0gMDsgaXRlciA8IGl0ZXJzOyArK2l0ZXIpIHsKKyAgICBjb25zdCBpbnQgZGVsdGEgPSBkZWx0YV9sdXRbaXRlcl07CisgICAgaW50IGF4aXM7CisgICAgZm9yIChheGlzID0gMDsgYXhpcyA8IGtHcmVlblJlZFRvQmx1ZU51bUF4aXM7ICsrYXhpcykgeworICAgICAgY29uc3QgaW50IGdyZWVuX3RvX2JsdWVfY3VyID0KKyAgICAgICAgICBvZmZzZXRbYXhpc11bMF0gKiBkZWx0YSArIGdyZWVuX3RvX2JsdWVfYmVzdDsKKyAgICAgIGNvbnN0IGludCByZWRfdG9fYmx1ZV9jdXIgPSBvZmZzZXRbYXhpc11bMV0gKiBkZWx0YSArIHJlZF90b19ibHVlX2Jlc3Q7CisgICAgICBjb25zdCBmbG9hdCBjdXJfZGlmZiA9IEdldFByZWRpY3Rpb25Db3N0Q3Jvc3NDb2xvckJsdWUoCisgICAgICAgICAgYXJnYiwgc3RyaWRlLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgZ3JlZW5fdG9fYmx1ZV9jdXIsIHJlZF90b19ibHVlX2N1ciwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0byk7CisgICAgICBpZiAoY3VyX2RpZmYgPCBiZXN0X2RpZmYpIHsKKyAgICAgICAgYmVzdF9kaWZmID0gY3VyX2RpZmY7CisgICAgICAgIGdyZWVuX3RvX2JsdWVfYmVzdCA9IGdyZWVuX3RvX2JsdWVfY3VyOworICAgICAgICByZWRfdG9fYmx1ZV9iZXN0ID0gcmVkX3RvX2JsdWVfY3VyOworICAgICAgfQorICAgICAgaWYgKHF1YWxpdHkgPCAyNSAmJiBpdGVyID09IDQpIHsKKyAgICAgICAgLy8gT25seSBheGlzIGFsaWduZWQgZGlmZnMgZm9yIGxvd2VyIHF1YWxpdHkuCisgICAgICAgIGJyZWFrOyAgLy8gbmV4dCBpdGVyLgorICAgICAgfQorICAgIH0KKyAgICBpZiAoZGVsdGEgPT0gMiAmJiBncmVlbl90b19ibHVlX2Jlc3QgPT0gMCAmJiByZWRfdG9fYmx1ZV9iZXN0ID09IDApIHsKKyAgICAgIC8vIEZ1cnRoZXIgaXRlcmF0aW9ucyB3b3VsZCBub3QgaGVscC4KKyAgICAgIGJyZWFrOyAgLy8gb3V0IG9mIGl0ZXItbG9vcC4KKyAgICB9CisgIH0KKyAgYmVzdF90eC0+Z3JlZW5fdG9fYmx1ZV8gPSBncmVlbl90b19ibHVlX2Jlc3Q7CisgIGJlc3RfdHgtPnJlZF90b19ibHVlXyA9IHJlZF90b19ibHVlX2Jlc3Q7Cit9CisjdW5kZWYga0dyZWVuUmVkVG9CbHVlTWF4SXRlcnMKKyN1bmRlZiBrR3JlZW5SZWRUb0JsdWVOdW1BeGlzCisKK3N0YXRpYyBWUDhMTXVsdGlwbGllcnMgR2V0QmVzdENvbG9yVHJhbnNmb3JtRm9yVGlsZSgKKyAgICBpbnQgdGlsZV94LCBpbnQgdGlsZV95LCBpbnQgYml0cywKKyAgICBWUDhMTXVsdGlwbGllcnMgcHJldl94LAorICAgIFZQOExNdWx0aXBsaWVycyBwcmV2X3ksCisgICAgaW50IHF1YWxpdHksIGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgIGNvbnN0IGludCBhY2N1bXVsYXRlZF9yZWRfaGlzdG9bMjU2XSwKKyAgICBjb25zdCBpbnQgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1syNTZdLAorICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiKSB7CisgIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV95X29mZnNldCA9IHRpbGVfeSAqIG1heF90aWxlX3NpemU7CisgIGNvbnN0IGludCB0aWxlX3hfb2Zmc2V0ID0gdGlsZV94ICogbWF4X3RpbGVfc2l6ZTsKKyAgY29uc3QgaW50IGFsbF94X21heCA9IEdldE1pbih0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgeHNpemUpOworICBjb25zdCBpbnQgYWxsX3lfbWF4ID0gR2V0TWluKHRpbGVfeV9vZmZzZXQgKyBtYXhfdGlsZV9zaXplLCB5c2l6ZSk7CisgIGNvbnN0IGludCB0aWxlX3dpZHRoID0gYWxsX3hfbWF4IC0gdGlsZV94X29mZnNldDsKKyAgY29uc3QgaW50IHRpbGVfaGVpZ2h0ID0gYWxsX3lfbWF4IC0gdGlsZV95X29mZnNldDsKKyAgY29uc3QgdWludDMyX3QqIGNvbnN0IHRpbGVfYXJnYiA9IGFyZ2IgKyB0aWxlX3lfb2Zmc2V0ICogeHNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHRpbGVfeF9vZmZzZXQ7CisgIFZQOExNdWx0aXBsaWVycyBiZXN0X3R4OworICBNdWx0aXBsaWVyc0NsZWFyKCZiZXN0X3R4KTsKKworICBHZXRCZXN0R3JlZW5Ub1JlZCh0aWxlX2FyZ2IsIHhzaXplLCB0aWxlX3dpZHRoLCB0aWxlX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksIHF1YWxpdHksIGFjY3VtdWxhdGVkX3JlZF9oaXN0bywgJmJlc3RfdHgpOworICBHZXRCZXN0R3JlZW5SZWRUb0JsdWUodGlsZV9hcmdiLCB4c2l6ZSwgdGlsZV93aWR0aCwgdGlsZV9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3gsIHByZXZfeSwgcXVhbGl0eSwgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICZiZXN0X3R4KTsKKyAgcmV0dXJuIGJlc3RfdHg7Cit9CisKK3N0YXRpYyB2b2lkIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKGludCB4c2l6ZSwgaW50IHlzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRpbGVfeCwgaW50IHRpbGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfdGlsZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TE11bHRpcGxpZXJzIGNvbG9yX3RyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBhcmdiKSB7CisgIGNvbnN0IGludCB4c2NhbiA9IEdldE1pbihtYXhfdGlsZV9zaXplLCB4c2l6ZSAtIHRpbGVfeCk7CisgIGludCB5c2NhbiA9IEdldE1pbihtYXhfdGlsZV9zaXplLCB5c2l6ZSAtIHRpbGVfeSk7CisgIGFyZ2IgKz0gdGlsZV95ICogeHNpemUgKyB0aWxlX3g7CisgIHdoaWxlICh5c2Nhbi0tID4gMCkgeworICAgIFZQOExUcmFuc2Zvcm1Db2xvcigmY29sb3JfdHJhbnNmb3JtLCBhcmdiLCB4c2Nhbik7CisgICAgYXJnYiArPSB4c2l6ZTsKKyAgfQorfQorCit2b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKSB7CisgIGNvbnN0IGludCBtYXhfdGlsZV9zaXplID0gMSA8PCBiaXRzOworICBjb25zdCBpbnQgdGlsZV94c2l6ZSA9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCBiaXRzKTsKKyAgY29uc3QgaW50IHRpbGVfeXNpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGJpdHMpOworICBpbnQgYWNjdW11bGF0ZWRfcmVkX2hpc3RvWzI1Nl0gPSB7IDAgfTsKKyAgaW50IGFjY3VtdWxhdGVkX2JsdWVfaGlzdG9bMjU2XSA9IHsgMCB9OworICBpbnQgdGlsZV94LCB0aWxlX3k7CisgIFZQOExNdWx0aXBsaWVycyBwcmV2X3gsIHByZXZfeTsKKyAgTXVsdGlwbGllcnNDbGVhcigmcHJldl95KTsKKyAgTXVsdGlwbGllcnNDbGVhcigmcHJldl94KTsKKyAgZm9yICh0aWxlX3kgPSAwOyB0aWxlX3kgPCB0aWxlX3lzaXplOyArK3RpbGVfeSkgeworICAgIGZvciAodGlsZV94ID0gMDsgdGlsZV94IDwgdGlsZV94c2l6ZTsgKyt0aWxlX3gpIHsKKyAgICAgIGludCB5OworICAgICAgY29uc3QgaW50IHRpbGVfeF9vZmZzZXQgPSB0aWxlX3ggKiBtYXhfdGlsZV9zaXplOworICAgICAgY29uc3QgaW50IHRpbGVfeV9vZmZzZXQgPSB0aWxlX3kgKiBtYXhfdGlsZV9zaXplOworICAgICAgY29uc3QgaW50IGFsbF94X21heCA9IEdldE1pbih0aWxlX3hfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgd2lkdGgpOworICAgICAgY29uc3QgaW50IGFsbF95X21heCA9IEdldE1pbih0aWxlX3lfb2Zmc2V0ICsgbWF4X3RpbGVfc2l6ZSwgaGVpZ2h0KTsKKyAgICAgIGNvbnN0IGludCBvZmZzZXQgPSB0aWxlX3kgKiB0aWxlX3hzaXplICsgdGlsZV94OworICAgICAgaWYgKHRpbGVfeSAhPSAwKSB7CisgICAgICAgIENvbG9yQ29kZVRvTXVsdGlwbGllcnMoaW1hZ2Vbb2Zmc2V0IC0gdGlsZV94c2l6ZV0sICZwcmV2X3kpOworICAgICAgfQorICAgICAgcHJldl94ID0gR2V0QmVzdENvbG9yVHJhbnNmb3JtRm9yVGlsZSh0aWxlX3gsIHRpbGVfeSwgYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldl94LCBwcmV2X3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkX3JlZF9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWRfYmx1ZV9oaXN0bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnYik7CisgICAgICBpbWFnZVtvZmZzZXRdID0gTXVsdGlwbGllcnNUb0NvbG9yQ29kZSgmcHJldl94KTsKKyAgICAgIENvcHlUaWxlV2l0aENvbG9yVHJhbnNmb3JtKHdpZHRoLCBoZWlnaHQsIHRpbGVfeF9vZmZzZXQsIHRpbGVfeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfdGlsZV9zaXplLCBwcmV2X3gsIGFyZ2IpOworCisgICAgICAvLyBHYXRoZXIgYWNjdW11bGF0ZWQgaGlzdG9ncmFtIGRhdGEuCisgICAgICBmb3IgKHkgPSB0aWxlX3lfb2Zmc2V0OyB5IDwgYWxsX3lfbWF4OyArK3kpIHsKKyAgICAgICAgaW50IGl4ID0geSAqIHdpZHRoICsgdGlsZV94X29mZnNldDsKKyAgICAgICAgY29uc3QgaW50IGl4X2VuZCA9IGl4ICsgYWxsX3hfbWF4IC0gdGlsZV94X29mZnNldDsKKyAgICAgICAgZm9yICg7IGl4IDwgaXhfZW5kOyArK2l4KSB7CisgICAgICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gYXJnYltpeF07CisgICAgICAgICAgaWYgKGl4ID49IDIgJiYKKyAgICAgICAgICAgICAgcGl4ID09IGFyZ2JbaXggLSAyXSAmJgorICAgICAgICAgICAgICBwaXggPT0gYXJnYltpeCAtIDFdKSB7CisgICAgICAgICAgICBjb250aW51ZTsgIC8vIHJlcGVhdGVkIHBpeGVscyBhcmUgaGFuZGxlZCBieSBiYWNrd2FyZCByZWZlcmVuY2VzCisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpeCA+PSB3aWR0aCArIDIgJiYKKyAgICAgICAgICAgICAgYXJnYltpeCAtIDJdID09IGFyZ2JbaXggLSB3aWR0aCAtIDJdICYmCisgICAgICAgICAgICAgIGFyZ2JbaXggLSAxXSA9PSBhcmdiW2l4IC0gd2lkdGggLSAxXSAmJgorICAgICAgICAgICAgICBwaXggPT0gYXJnYltpeCAtIHdpZHRoXSkgeworICAgICAgICAgICAgY29udGludWU7ICAvLyByZXBlYXRlZCBwaXhlbHMgYXJlIGhhbmRsZWQgYnkgYmFja3dhcmQgcmVmZXJlbmNlcworICAgICAgICAgIH0KKyAgICAgICAgICArK2FjY3VtdWxhdGVkX3JlZF9oaXN0b1socGl4ID4+IDE2KSAmIDB4ZmZdOworICAgICAgICAgICsrYWNjdW11bGF0ZWRfYmx1ZV9oaXN0b1socGl4ID4+IDApICYgMHhmZl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvcXVhbnRfZW5jLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3F1YW50X2VuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMWZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3F1YW50X2VuYy5jCkBAIC0wLDAgKzEsMTM3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgUXVhbnRpemF0aW9uCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vbWF0aF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgYWJzKCkKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKworI2RlZmluZSBET19UUkVMTElTX0k0ICAxCisjZGVmaW5lIERPX1RSRUxMSVNfSTE2IDEgICAvLyBub3QgYSBodWdlIGdhaW4sIGJ1dCBvayBhdCBsb3cgYml0cmF0ZS4KKyNkZWZpbmUgRE9fVFJFTExJU19VViAgMCAgIC8vIGRpc2FibGUgdHJlbGxpcyBmb3IgVVYuIFJpc2t5LiBOb3Qgd29ydGguCisjZGVmaW5lIFVTRV9URElTVE8gMQorCisjZGVmaW5lIE1JRF9BTFBIQSA2NCAgICAgIC8vIG5ldXRyYWwgdmFsdWUgZm9yIHN1c2NlcHRpYmlsaXR5CisjZGVmaW5lIE1JTl9BTFBIQSAzMCAgICAgIC8vIGxvd2VzdCB1c2FibGUgdmFsdWUgZm9yIHN1c2NlcHRpYmlsaXR5CisjZGVmaW5lIE1BWF9BTFBIQSAxMDAgICAgIC8vIGhpZ2hlciBtZWFuaW5nZnVsIHZhbHVlIGZvciBzdXNjZXB0aWJpbGl0eQorCisjZGVmaW5lIFNOU19UT19EUSAwLjkgICAgIC8vIFNjYWxpbmcgY29uc3RhbnQgYmV0d2VlbiB0aGUgc25zIHZhbHVlIGFuZCB0aGUgUVAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG93ZXItbGF3IG1vZHVsYXRpb24uIE11c3QgYmUgc3RyaWN0bHkgbGVzcyB0aGFuIDEuCisKKy8vIG51bWJlciBvZiBub24temVybyBjb2VmZnMgYmVsb3cgd2hpY2ggd2UgY29uc2lkZXIgdGhlIGJsb2NrIHZlcnkgZmxhdAorLy8gKGFuZCBhcHBseSBhIHBlbmFsdHkgdG8gY29tcGxleCBwcmVkaWN0aW9ucykKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfSTE2IDEwICAgICAgLy8gSTE2IG1vZGUKKyNkZWZpbmUgRkxBVE5FU1NfTElNSVRfSTQgIDMgICAgICAgLy8gSTQgbW9kZQorI2RlZmluZSBGTEFUTkVTU19MSU1JVF9VViAgMiAgICAgICAvLyBVViBtb2RlCisjZGVmaW5lIEZMQVRORVNTX1BFTkFMVFkgICAxNDAgICAgIC8vIHJvdWdobHkgfjFiaXQgcGVyIGJsb2NrCisKKyNkZWZpbmUgTVVMVF84QihhLCBiKSAoKChhKSAqIChiKSArIDEyOCkgPj4gOCkKKworI2RlZmluZSBSRF9ESVNUT19NVUxUICAgICAgMjU2ICAvLyBkaXN0b3J0aW9uIG11bHRpcGxpZXIgKGVxdWl2YWxlbnQgb2YgbGFtYmRhKQorCisvLyAjZGVmaW5lIERFQlVHX0JMT0NLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkKERFQlVHX0JMT0NLKQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworc3RhdGljIHZvaWQgUHJpbnRCbG9ja0luZm8oY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgaSwgajsKKyAgY29uc3QgaW50IGlzX2kxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgeV9pbiA9IGl0LT55dXZfaW5fICsgWV9PRkZfRU5DOworICBjb25zdCB1aW50OF90KiBjb25zdCB5X291dCA9IGl0LT55dXZfb3V0XyArIFlfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZfaW4gPSBpdC0+eXV2X2luXyArIFVfT0ZGX0VOQzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgdXZfb3V0ID0gaXQtPnl1dl9vdXRfICsgVV9PRkZfRU5DOworICBwcmludGYoIlNPVVJDRSAvIE9VVFBVVCAvIEFCUyBERUxUQVxuIik7CisgIGZvciAoaiA9IDA7IGogPCAxNjsgKytqKSB7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHlfaW5baSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICAgIik7CisgICAgZm9yIChpID0gMDsgaSA8IDE2OyArK2kpIHByaW50ZigiJTNkICIsIHlfb3V0W2kgKyBqICogQlBTXSk7CisgICAgcHJpbnRmKCIgICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnMoeV9pbltpICsgaiAqIEJQU10gLSB5X291dFtpICsgaiAqIEJQU10pKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigiXG4iKTsgICAvLyBuZXdsaW5lIGJlZm9yZSB0aGUgVS9WIGJsb2NrCisgIGZvciAoaiA9IDA7IGogPCA4OyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9pbltpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9pbltpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHByaW50ZigiJTNkICIsIHV2X291dFtpICsgaiAqIEJQU10pOworICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSBwcmludGYoIiUzZCAiLCB1dl9vdXRbaSArIGogKiBCUFNdKTsKKyAgICBwcmludGYoIiAgICIpOworICAgIGZvciAoaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgIHByaW50ZigiJTFkICIsIGFicyh1dl9vdXRbaSArIGogKiBCUFNdIC0gdXZfaW5baSArIGogKiBCUFNdKSk7CisgICAgfQorICAgIHByaW50ZigiICIpOworICAgIGZvciAoaSA9IDg7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiUxZCAiLCBhYnModXZfb3V0W2kgKyBqICogQlBTXSAtIHV2X2luW2kgKyBqICogQlBTXSkpOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcHJpbnRmKCJcbkQ6JWQgU0Q6JWQgUjolZCBIOiVkIG56OjB4JXggc2NvcmU6JWRcbiIsCisgICAgKGludClyZC0+RCwgKGludClyZC0+U0QsIChpbnQpcmQtPlIsIChpbnQpcmQtPkgsIChpbnQpcmQtPm56LAorICAgIChpbnQpcmQtPnNjb3JlKTsKKyAgaWYgKGlzX2kxNikgeworICAgIHByaW50ZigiTW9kZTogJWRcbiIsIHJkLT5tb2RlX2kxNik7CisgICAgcHJpbnRmKCJ5X2RjX2xldmVsczoiKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkgcHJpbnRmKCIlM2QgIiwgcmQtPnlfZGNfbGV2ZWxzW2ldKTsKKyAgICBwcmludGYoIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJNb2Rlc1sxNl06ICIpOworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSBwcmludGYoIiVkICIsIHJkLT5tb2Rlc19pNFtpXSk7CisgICAgcHJpbnRmKCJcbiIpOworICB9CisgIHByaW50ZigieV9hY19sZXZlbHM6XG4iKTsKKyAgZm9yIChqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICBmb3IgKGkgPSBpc19pMTYgPyAxIDogMDsgaSA8IDE2OyArK2kpIHsKKyAgICAgIHByaW50ZigiJTRkICIsIHJkLT55X2FjX2xldmVsc1tqXVtpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKyAgfQorICBwcmludGYoIlxuIik7CisgIHByaW50ZigidXZfbGV2ZWxzIChtb2RlPSVkKTpcbiIsIHJkLT5tb2RlX3V2KTsKKyAgZm9yIChqID0gMDsgaiA8IDg7ICsraikgeworICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgICBwcmludGYoIiU0ZCAiLCByZC0+dXZfbGV2ZWxzW2pdW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworICB9Cit9CisKKyNlbmRpZiAgIC8vIERFQlVHX0JMT0NLCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IG0sIGludCBNKSB7CisgIHJldHVybiB2IDwgbSA/IG0gOiB2ID4gTSA/IE0gOiB2OworfQorCitzdGF0aWMgY29uc3QgdWludDhfdCBrWmlnemFnWzE2XSA9IHsKKyAgMCwgMSwgNCwgOCwgNSwgMiwgMywgNiwgOSwgMTIsIDEzLCAxMCwgNywgMTEsIDE0LCAxNQorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RjVGFibGVbMTI4XSA9IHsKKyAgNCwgICAgIDUsICAgNiwgICA3LCAgIDgsICAgOSwgIDEwLCAgMTAsCisgIDExLCAgIDEyLCAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE3LAorICAxOCwgICAxOSwgIDIwLCAgMjAsICAyMSwgIDIxLCAgMjIsICAyMiwKKyAgMjMsICAgMjMsICAyNCwgIDI1LCAgMjUsICAyNiwgIDI3LCAgMjgsCisgIDI5LCAgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LAorICAzNywgICAzNywgIDM4LCAgMzksICA0MCwgIDQxLCAgNDIsICA0MywKKyAgNDQsICAgNDUsICA0NiwgIDQ2LCAgNDcsICA0OCwgIDQ5LCAgNTAsCisgIDUxLCAgIDUyLCAgNTMsICA1NCwgIDU1LCAgNTYsICA1NywgIDU4LAorICA1OSwgICA2MCwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjUsICA2NiwKKyAgNjcsICAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsCisgIDc1LCAgIDc2LCAgNzYsICA3NywgIDc4LCAgNzksICA4MCwgIDgxLAorICA4MiwgICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwKKyAgOTEsICAgOTMsICA5NSwgIDk2LCAgOTgsIDEwMCwgMTAxLCAxMDIsCisgIDEwNCwgMTA2LCAxMDgsIDExMCwgMTEyLCAxMTQsIDExNiwgMTE4LAorICAxMjIsIDEyNCwgMTI2LCAxMjgsIDEzMCwgMTMyLCAxMzQsIDEzNiwKKyAgMTM4LCAxNDAsIDE0MywgMTQ1LCAxNDgsIDE1MSwgMTU0LCAxNTcKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBrQWNUYWJsZVsxMjhdID0geworICA0LCAgICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwKKyAgMTIsICAgMTMsICAxNCwgIDE1LCAgMTYsICAxNywgIDE4LCAgMTksCisgIDIwLCAgIDIxLCAgMjIsICAyMywgIDI0LCAgMjUsICAyNiwgIDI3LAorICAyOCwgICAyOSwgIDMwLCAgMzEsICAzMiwgIDMzLCAgMzQsICAzNSwKKyAgMzYsICAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsCisgIDQ0LCAgIDQ1LCAgNDYsICA0NywgIDQ4LCAgNDksICA1MCwgIDUxLAorICA1MiwgICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA2MCwKKyAgNjIsICAgNjQsICA2NiwgIDY4LCAgNzAsICA3MiwgIDc0LCAgNzYsCisgIDc4LCAgIDgwLCAgODIsICA4NCwgIDg2LCAgODgsICA5MCwgIDkyLAorICA5NCwgICA5NiwgIDk4LCAxMDAsIDEwMiwgMTA0LCAxMDYsIDEwOCwKKyAgMTEwLCAxMTIsIDExNCwgMTE2LCAxMTksIDEyMiwgMTI1LCAxMjgsCisgIDEzMSwgMTM0LCAxMzcsIDE0MCwgMTQzLCAxNDYsIDE0OSwgMTUyLAorICAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywgMTcwLCAxNzMsIDE3NywKKyAgMTgxLCAxODUsIDE4OSwgMTkzLCAxOTcsIDIwMSwgMjA1LCAyMDksCisgIDIxMywgMjE3LCAyMjEsIDIyNSwgMjI5LCAyMzQsIDIzOSwgMjQ1LAorICAyNDksIDI1NCwgMjU5LCAyNjQsIDI2OSwgMjc0LCAyNzksIDI4NAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtBY1RhYmxlMlsxMjhdID0geworICA4LCAgICAgOCwgICA5LCAgMTAsICAxMiwgIDEzLCAgMTUsICAxNywKKyAgMTgsICAgMjAsICAyMSwgIDIzLCAgMjQsICAyNiwgIDI3LCAgMjksCisgIDMxLCAgIDMyLCAgMzQsICAzNSwgIDM3LCAgMzgsICA0MCwgIDQxLAorICA0MywgICA0NCwgIDQ2LCAgNDgsICA0OSwgIDUxLCAgNTIsICA1NCwKKyAgNTUsICAgNTcsICA1OCwgIDYwLCAgNjIsICA2MywgIDY1LCAgNjYsCisgIDY4LCAgIDY5LCAgNzEsICA3MiwgIDc0LCAgNzUsICA3NywgIDc5LAorICA4MCwgICA4MiwgIDgzLCAgODUsICA4NiwgIDg4LCAgODksICA5MywKKyAgOTYsICAgOTksIDEwMiwgMTA1LCAxMDgsIDExMSwgMTE0LCAxMTcsCisgIDEyMCwgMTI0LCAxMjcsIDEzMCwgMTMzLCAxMzYsIDEzOSwgMTQyLAorICAxNDUsIDE0OCwgMTUxLCAxNTUsIDE1OCwgMTYxLCAxNjQsIDE2NywKKyAgMTcwLCAxNzMsIDE3NiwgMTc5LCAxODQsIDE4OSwgMTkzLCAxOTgsCisgIDIwMywgMjA3LCAyMTIsIDIxNywgMjIxLCAyMjYsIDIzMCwgMjM1LAorICAyNDAsIDI0NCwgMjQ5LCAyNTQsIDI1OCwgMjYzLCAyNjgsIDI3NCwKKyAgMjgwLCAyODYsIDI5MiwgMjk5LCAzMDUsIDMxMSwgMzE3LCAzMjMsCisgIDMzMCwgMzM2LCAzNDIsIDM0OCwgMzU0LCAzNjIsIDM3MCwgMzc5LAorICAzODUsIDM5MywgNDAxLCA0MDksIDQxNiwgNDI0LCA0MzIsIDQ0MAorfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0JpYXNNYXRyaWNlc1szXVsyXSA9IHsgIC8vIFtsdW1hLWFjLGx1bWEtZGMsY2hyb21hXVtkYyxhY10KKyAgeyA5NiwgMTEwIH0sIHsgOTYsIDEwOCB9LCB7IDExMCwgMTE1IH0KK307CisKKy8vIFNoYXJwZW5pbmcgYnkgKHNsaWdodGx5KSByYWlzaW5nIHRoZSBoaS1mcmVxdWVuY3kgY29lZmZzLgorLy8gSGFjay1pc2ggYnV0IGhlbHBmdWwgZm9yIG1pZC1iaXRyYXRlIHJhbmdlLiBVc2Ugd2l0aCBjYXJlLgorI2RlZmluZSBTSEFSUEVOX0JJVFMgMTEgIC8vIG51bWJlciBvZiBkZXNjYWxpbmcgYml0cyBmb3Igc2hhcnBlbmluZyBiaWFzCitzdGF0aWMgY29uc3QgdWludDhfdCBrRnJlcVNoYXJwZW5pbmdbMTZdID0geworICAwLCAgMzAsIDYwLCA5MCwKKyAgMzAsIDYwLCA5MCwgOTAsCisgIDYwLCA5MCwgOTAsIDkwLAorICA5MCwgOTAsIDkwLCA5MAorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEluaXRpYWxpemUgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMgaW4gVlA4TWF0cml4CisKKy8vIFJldHVybnMgdGhlIGF2ZXJhZ2UgcXVhbnRpemVyCitzdGF0aWMgaW50IEV4cGFuZE1hdHJpeChWUDhNYXRyaXgqIGNvbnN0IG0sIGludCB0eXBlKSB7CisgIGludCBpLCBzdW07CisgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICBjb25zdCBpbnQgaXNfYWNfY29lZmYgPSAoaSA+IDApOworICAgIGNvbnN0IGludCBiaWFzID0ga0JpYXNNYXRyaWNlc1t0eXBlXVtpc19hY19jb2VmZl07CisgICAgbS0+aXFfW2ldID0gKDEgPDwgUUZJWCkgLyBtLT5xX1tpXTsKKyAgICBtLT5iaWFzX1tpXSA9IEJJQVMoYmlhcyk7CisgICAgLy8genRocmVzaF8gaXMgdGhlIGV4YWN0IHZhbHVlIHN1Y2ggdGhhdCBRVUFOVERJVihjb2VmZiwgaVEsIEIpIGlzOgorICAgIC8vICAgKiB6ZXJvIGlmIGNvZWZmIDw9IHp0aHJlc2gKKyAgICAvLyAgICogbm9uLXplcm8gaWYgY29lZmYgPiB6dGhyZXNoCisgICAgbS0+enRocmVzaF9baV0gPSAoKDEgPDwgUUZJWCkgLSAxIC0gbS0+Ymlhc19baV0pIC8gbS0+aXFfW2ldOworICB9CisgIGZvciAoaSA9IDI7IGkgPCAxNjsgKytpKSB7CisgICAgbS0+cV9baV0gPSBtLT5xX1sxXTsKKyAgICBtLT5pcV9baV0gPSBtLT5pcV9bMV07CisgICAgbS0+Ymlhc19baV0gPSBtLT5iaWFzX1sxXTsKKyAgICBtLT56dGhyZXNoX1tpXSA9IG0tPnp0aHJlc2hfWzFdOworICB9CisgIGZvciAoc3VtID0gMCwgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgaWYgKHR5cGUgPT0gMCkgeyAgLy8gd2Ugb25seSB1c2Ugc2hhcnBlbmluZyBmb3IgQUMgbHVtYSBjb2VmZnMKKyAgICAgIG0tPnNoYXJwZW5fW2ldID0gKGtGcmVxU2hhcnBlbmluZ1tpXSAqIG0tPnFfW2ldKSA+PiBTSEFSUEVOX0JJVFM7CisgICAgfSBlbHNlIHsKKyAgICAgIG0tPnNoYXJwZW5fW2ldID0gMDsKKyAgICB9CisgICAgc3VtICs9IG0tPnFfW2ldOworICB9CisgIHJldHVybiAoc3VtICsgOCkgPj4gNDsKK30KKworc3RhdGljIHZvaWQgQ2hlY2tMYW1iZGFWYWx1ZShpbnQqIGNvbnN0IHYpIHsgaWYgKCp2IDwgMSkgKnYgPSAxOyB9CisKK3N0YXRpYyB2b2lkIFNldHVwTWF0cmljZXMoVlA4RW5jb2RlciogZW5jKSB7CisgIGludCBpOworICBjb25zdCBpbnQgdGxhbWJkYV9zY2FsZSA9CisgICAgKGVuYy0+bWV0aG9kXyA+PSA0KSA/IGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICA6IDA7CisgIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSBlbmMtPnNlZ21lbnRfaGRyXy5udW1fc2VnbWVudHNfOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICBWUDhTZWdtZW50SW5mbyogY29uc3QgbSA9ICZlbmMtPmRxbV9baV07CisgICAgY29uc3QgaW50IHEgPSBtLT5xdWFudF87CisgICAgaW50IHFfaTQsIHFfaTE2LCBxX3V2OworICAgIG0tPnkxXy5xX1swXSA9IGtEY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfeTFfZGNfLCAwLCAxMjcpXTsKKyAgICBtLT55MV8ucV9bMV0gPSBrQWNUYWJsZVtjbGlwKHEsICAgICAgICAgICAgICAgICAgMCwgMTI3KV07CisKKyAgICBtLT55Ml8ucV9bMF0gPSBrRGNUYWJsZVsgY2xpcChxICsgZW5jLT5kcV95Ml9kY18sIDAsIDEyNyldICogMjsKKyAgICBtLT55Ml8ucV9bMV0gPSBrQWNUYWJsZTJbY2xpcChxICsgZW5jLT5kcV95Ml9hY18sIDAsIDEyNyldOworCisgICAgbS0+dXZfLnFfWzBdID0ga0RjVGFibGVbY2xpcChxICsgZW5jLT5kcV91dl9kY18sIDAsIDExNyldOworICAgIG0tPnV2Xy5xX1sxXSA9IGtBY1RhYmxlW2NsaXAocSArIGVuYy0+ZHFfdXZfYWNfLCAwLCAxMjcpXTsKKworICAgIHFfaTQgID0gRXhwYW5kTWF0cml4KCZtLT55MV8sIDApOworICAgIHFfaTE2ID0gRXhwYW5kTWF0cml4KCZtLT55Ml8sIDEpOworICAgIHFfdXYgID0gRXhwYW5kTWF0cml4KCZtLT51dl8sIDIpOworCisgICAgbS0+bGFtYmRhX2k0XyAgICAgICAgICA9ICgzICogcV9pNCAqIHFfaTQpID4+IDc7CisgICAgbS0+bGFtYmRhX2kxNl8gICAgICAgICA9ICgzICogcV9pMTYgKiBxX2kxNik7CisgICAgbS0+bGFtYmRhX3V2XyAgICAgICAgICA9ICgzICogcV91diAqIHFfdXYpID4+IDY7CisgICAgbS0+bGFtYmRhX21vZGVfICAgICAgICA9ICgxICogcV9pNCAqIHFfaTQpID4+IDc7CisgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTRfICA9ICg3ICogcV9pNCAqIHFfaTQpID4+IDM7CisgICAgbS0+bGFtYmRhX3RyZWxsaXNfaTE2XyA9IChxX2kxNiAqIHFfaTE2KSA+PiAyOworICAgIG0tPmxhbWJkYV90cmVsbGlzX3V2XyAgPSAocV91diAqIHFfdXYpIDw8IDE7CisgICAgbS0+dGxhbWJkYV8gICAgICAgICAgICA9ICh0bGFtYmRhX3NjYWxlICogcV9pNCkgPj4gNTsKKworICAgIC8vIG5vbmUgb2YgdGhlc2UgY29uc3RhbnRzIHNob3VsZCBiZSA8IDEKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfaTRfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfaTE2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX3V2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+bGFtYmRhX21vZGVfKTsKKyAgICBDaGVja0xhbWJkYVZhbHVlKCZtLT5sYW1iZGFfdHJlbGxpc19pNF8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV90cmVsbGlzX2kxNl8pOworICAgIENoZWNrTGFtYmRhVmFsdWUoJm0tPmxhbWJkYV90cmVsbGlzX3V2Xyk7CisgICAgQ2hlY2tMYW1iZGFWYWx1ZSgmbS0+dGxhbWJkYV8pOworCisgICAgbS0+bWluX2Rpc3RvXyA9IDIwICogbS0+eTFfLnFfWzBdOyAgIC8vIHF1YW50aXphdGlvbi1hd2FyZSBtaW4gZGlzdG8KKyAgICBtLT5tYXhfZWRnZV8gID0gMDsKKworICAgIG0tPmk0X3BlbmFsdHlfID0gMTAwMCAqIHFfaTQgKiBxX2k0OworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBJbml0aWFsaXplIGZpbHRlcmluZyBwYXJhbWV0ZXJzCisKKy8vIFZlcnkgc21hbGwgZmlsdGVyLXN0cmVuZ3RoIHZhbHVlcyBoYXZlIGNsb3NlIHRvIG5vIHZpc3VhbCBlZmZlY3QuIFNvIHdlIGNhbgorLy8gc2F2ZSBhIGxpdHRsZSBkZWNvZGluZy1DUFUgYnkgdHVybmluZyBmaWx0ZXJpbmcgb2ZmIGZvciB0aGVzZS4KKyNkZWZpbmUgRlNUUkVOR1RIX0NVVE9GRiAyCisKK3N0YXRpYyB2b2lkIFNldHVwRmlsdGVyU3RyZW5ndGgoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CisgIGludCBpOworICAvLyBsZXZlbDAgaXMgaW4gWzAuLjUwMF0uIFVzaW5nICctZiA1MCcgYXMgZmlsdGVyX3N0cmVuZ3RoIGlzIG1pZC1maWx0ZXJpbmcuCisgIGNvbnN0IGludCBsZXZlbDAgPSA1ICogZW5jLT5jb25maWdfLT5maWx0ZXJfc3RyZW5ndGg7CisgIGZvciAoaSA9IDA7IGkgPCBOVU1fTUJfU0VHTUVOVFM7ICsraSkgeworICAgIFZQOFNlZ21lbnRJbmZvKiBjb25zdCBtID0gJmVuYy0+ZHFtX1tpXTsKKyAgICAvLyBXZSBmb2N1cyBvbiB0aGUgcXVhbnRpemF0aW9uIG9mIEFDIGNvZWZmcy4KKyAgICBjb25zdCBpbnQgcXN0ZXAgPSBrQWNUYWJsZVtjbGlwKG0tPnF1YW50XywgMCwgMTI3KV0gPj4gMjsKKyAgICBjb25zdCBpbnQgYmFzZV9zdHJlbmd0aCA9CisgICAgICAgIFZQOEZpbHRlclN0cmVuZ3RoRnJvbURlbHRhKGVuYy0+ZmlsdGVyX2hkcl8uc2hhcnBuZXNzXywgcXN0ZXApOworICAgIC8vIFNlZ21lbnRzIHdpdGggbG93ZXIgY29tcGxleGl0eSAoJ2JldGEnKSB3aWxsIGJlIGxlc3MgZmlsdGVyZWQuCisgICAgY29uc3QgaW50IGYgPSBiYXNlX3N0cmVuZ3RoICogbGV2ZWwwIC8gKDI1NiArIG0tPmJldGFfKTsKKyAgICBtLT5mc3RyZW5ndGhfID0gKGYgPCBGU1RSRU5HVEhfQ1VUT0ZGKSA/IDAgOiAoZiA+IDYzKSA/IDYzIDogZjsKKyAgfQorICAvLyBXZSByZWNvcmQgdGhlIGluaXRpYWwgc3RyZW5ndGggKG1haW5seSBmb3IgdGhlIGNhc2Ugb2YgMS1zZWdtZW50IG9ubHkpLgorICBlbmMtPmZpbHRlcl9oZHJfLmxldmVsXyA9IGVuYy0+ZHFtX1swXS5mc3RyZW5ndGhfOworICBlbmMtPmZpbHRlcl9oZHJfLnNpbXBsZV8gPSAoZW5jLT5jb25maWdfLT5maWx0ZXJfdHlwZSA9PSAwKTsKKyAgZW5jLT5maWx0ZXJfaGRyXy5zaGFycG5lc3NfID0gZW5jLT5jb25maWdfLT5maWx0ZXJfc2hhcnBuZXNzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBOb3RlOiBpZiB5b3UgY2hhbmdlIHRoZSB2YWx1ZXMgYmVsb3csIHJlbWVtYmVyIHRoYXQgdGhlIG1heCByYW5nZQorLy8gYWxsb3dlZCBieSB0aGUgc3ludGF4IGZvciBEUV9VViBpcyBbLTE2LDE2XS4KKyNkZWZpbmUgTUFYX0RRX1VWICg2KQorI2RlZmluZSBNSU5fRFFfVVYgKC00KQorCisvLyBXZSB3YW50IHRvIGVtdWxhdGUganBlZy1saWtlIGJlaGF2aW91ciB3aGVyZSB0aGUgZXhwZWN0ZWQgImdvb2QiIHF1YWxpdHkKKy8vIGlzIGFyb3VuZCBxPTc1LiBJbnRlcm5hbGx5LCBvdXIgImdvb2QiIG1pZGRsZSBpcyBhcm91bmQgYz01MC4gU28gd2UKKy8vIG1hcCBhY2NvcmRpbmdseSB1c2luZyBsaW5lYXIgcGllY2Utd2lzZSBmdW5jdGlvbgorc3RhdGljIGRvdWJsZSBRdWFsaXR5VG9Db21wcmVzc2lvbihkb3VibGUgYykgeworICBjb25zdCBkb3VibGUgbGluZWFyX2MgPSAoYyA8IDAuNzUpID8gYyAqICgyLiAvIDMuKSA6IDIuICogYyAtIDEuOworICAvLyBUaGUgZmlsZSBzaXplIHJvdWdobHkgc2NhbGVzIGFzIHBvdyhxdWFudGl6ZXIsIDMuKS4gQWN0dWFsbHksIHRoZQorICAvLyBleHBvbmVudCBpcyBzb21ld2hlcmUgYmV0d2VlbiAyLjggYW5kIDMuMiwgYnV0IHdlJ3JlIG1vc3RseSBpbnRlcmVzdGVkCisgIC8vIGluIHRoZSBtaWQtcXVhbnQgcmFuZ2UuIFNvIHdlIHNjYWxlIHRoZSBjb21wcmVzc2liaWxpdHkgaW52ZXJzZWx5IHRvCisgIC8vIHRoaXMgcG93ZXItbGF3OiBxdWFudCB+PSBjb21wcmVzc2lvbiBeIDEvMy4gVGhpcyBsYXcgaG9sZHMgd2VsbCBmb3IKKyAgLy8gbG93IHF1YW50LiBGaW5lciBtb2RlbGluZyBmb3IgaGlnaC1xdWFudCB3b3VsZCBtYWtlIHVzZSBvZiBrQWNUYWJsZVtdCisgIC8vIG1vcmUgZXhwbGljaXRseS4KKyAgY29uc3QgZG91YmxlIHYgPSBwb3cobGluZWFyX2MsIDEgLyAzLik7CisgIHJldHVybiB2OworfQorCitzdGF0aWMgZG91YmxlIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihkb3VibGUgYywgZG91YmxlIGFscGhhKSB7CisgIC8vIFdlIG1hcCB0aGUgY29tcGxleGl0eSAnYWxwaGEnIGFuZCBxdWFsaXR5IHNldHRpbmcgJ2MnIHRvIGEgY29tcHJlc3Npb24KKyAgLy8gZXhwb25lbnQgZW1waXJpY2FsbHkgbWF0Y2hlZCB0byB0aGUgY29tcHJlc3Npb24gY3VydmUgb2YgbGlianBlZzZiLgorICAvLyBPbiBhdmVyYWdlLCB0aGUgV2ViUCBvdXRwdXQgc2l6ZSB3aWxsIGJlIHJvdWdobHkgc2ltaWxhciB0byB0aGF0IG9mIGEKKyAgLy8gSlBFRyBmaWxlIGNvbXByZXNzZWQgd2l0aCBzYW1lIHF1YWxpdHkgZmFjdG9yLgorICBjb25zdCBkb3VibGUgYW1pbiA9IDAuMzA7CisgIGNvbnN0IGRvdWJsZSBhbWF4ID0gMC44NTsKKyAgY29uc3QgZG91YmxlIGV4cF9taW4gPSAwLjQ7CisgIGNvbnN0IGRvdWJsZSBleHBfbWF4ID0gMC45OworICBjb25zdCBkb3VibGUgc2xvcGUgPSAoZXhwX21pbiAtIGV4cF9tYXgpIC8gKGFtYXggLSBhbWluKTsKKyAgLy8gTGluZWFybHkgaW50ZXJwb2xhdGUgJ2V4cG4nIGZyb20gZXhwX21pbiB0byBleHBfbWF4CisgIC8vIGluIHRoZSBbYW1pbiwgYW1heF0gcmFuZ2UuCisgIGNvbnN0IGRvdWJsZSBleHBuID0gKGFscGhhID4gYW1heCkgPyBleHBfbWluCisgICAgICAgICAgICAgICAgICAgIDogKGFscGhhIDwgYW1pbikgPyBleHBfbWF4CisgICAgICAgICAgICAgICAgICAgIDogZXhwX21heCArIHNsb3BlICogKGFscGhhIC0gYW1pbik7CisgIGNvbnN0IGRvdWJsZSB2ID0gcG93KGMsIGV4cG4pOworICByZXR1cm4gdjsKK30KKworc3RhdGljIGludCBTZWdtZW50c0FyZUVxdWl2YWxlbnQoY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IFMyKSB7CisgIHJldHVybiAoUzEtPnF1YW50XyA9PSBTMi0+cXVhbnRfKSAmJiAoUzEtPmZzdHJlbmd0aF8gPT0gUzItPmZzdHJlbmd0aF8pOworfQorCitzdGF0aWMgdm9pZCBTaW1wbGlmeVNlZ21lbnRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgbWFwW05VTV9NQl9TRUdNRU5UU10gPSB7IDAsIDEsIDIsIDMgfTsKKyAgLy8gJ251bV9zZWdtZW50c18nIGlzIHByZXZpb3VzbHkgdmFsaWRhdGVkIGFuZCA8PSBOVU1fTUJfU0VHTUVOVFMsIGJ1dCBhbgorICAvLyBleHBsaWNpdCBjaGVjayBpcyBuZWVkZWQgdG8gYXZvaWQgYSBzcHVyaW91cyB3YXJuaW5nIGFib3V0ICdpJyBleGNlZWRpbmcKKyAgLy8gYXJyYXkgYm91bmRzIG9mICdkcW1fJyB3aXRoIHNvbWUgY29tcGlsZXJzIChub3RpY2VkIHdpdGggZ2NjLTQuOSkuCisgIGNvbnN0IGludCBudW1fc2VnbWVudHMgPSAoZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA8IE5VTV9NQl9TRUdNRU5UUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGVuYy0+c2VnbWVudF9oZHJfLm51bV9zZWdtZW50c18KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTV9NQl9TRUdNRU5UUzsKKyAgaW50IG51bV9maW5hbF9zZWdtZW50cyA9IDE7CisgIGludCBzMSwgczI7CisgIGZvciAoczEgPSAxOyBzMSA8IG51bV9zZWdtZW50czsgKytzMSkgeyAgICAvLyBmaW5kIHNpbWlsYXIgc2VnbWVudHMKKyAgICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgUzEgPSAmZW5jLT5kcW1fW3MxXTsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIC8vIGNoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBzaW1pbGFyIHNlZ21lbnQKKyAgICBmb3IgKHMyID0gMDsgczIgPCBudW1fZmluYWxfc2VnbWVudHM7ICsrczIpIHsKKyAgICAgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBTMiA9ICZlbmMtPmRxbV9bczJdOworICAgICAgaWYgKFNlZ21lbnRzQXJlRXF1aXZhbGVudChTMSwgUzIpKSB7CisgICAgICAgIGZvdW5kID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG1hcFtzMV0gPSBzMjsKKyAgICBpZiAoIWZvdW5kKSB7CisgICAgICBpZiAobnVtX2ZpbmFsX3NlZ21lbnRzICE9IHMxKSB7CisgICAgICAgIGVuYy0+ZHFtX1tudW1fZmluYWxfc2VnbWVudHNdID0gZW5jLT5kcW1fW3MxXTsKKyAgICAgIH0KKyAgICAgICsrbnVtX2ZpbmFsX3NlZ21lbnRzOworICAgIH0KKyAgfQorICBpZiAobnVtX2ZpbmFsX3NlZ21lbnRzIDwgbnVtX3NlZ21lbnRzKSB7ICAvLyBSZW1hcAorICAgIGludCBpID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CisgICAgd2hpbGUgKGktLSA+IDApIGVuYy0+bWJfaW5mb19baV0uc2VnbWVudF8gPSBtYXBbZW5jLT5tYl9pbmZvX1tpXS5zZWdtZW50X107CisgICAgZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXyA9IG51bV9maW5hbF9zZWdtZW50czsKKyAgICAvLyBSZXBsaWNhdGUgdGhlIHRyYWlsaW5nIHNlZ21lbnQgaW5mb3MgKGl0J3MgbW9zdGx5IGNvc21ldGljcykKKyAgICBmb3IgKGkgPSBudW1fZmluYWxfc2VnbWVudHM7IGkgPCBudW1fc2VnbWVudHM7ICsraSkgeworICAgICAgZW5jLT5kcW1fW2ldID0gZW5jLT5kcW1fW251bV9maW5hbF9zZWdtZW50cyAtIDFdOworICAgIH0KKyAgfQorfQorCit2b2lkIFZQOFNldFNlZ21lbnRQYXJhbXMoVlA4RW5jb2RlciogY29uc3QgZW5jLCBmbG9hdCBxdWFsaXR5KSB7CisgIGludCBpOworICBpbnQgZHFfdXZfYWMsIGRxX3V2X2RjOworICBjb25zdCBpbnQgbnVtX3NlZ21lbnRzID0gZW5jLT5zZWdtZW50X2hkcl8ubnVtX3NlZ21lbnRzXzsKKyAgY29uc3QgZG91YmxlIGFtcCA9IFNOU19UT19EUSAqIGVuYy0+Y29uZmlnXy0+c25zX3N0cmVuZ3RoIC8gMTAwLiAvIDEyOC47CisgIGNvbnN0IGRvdWJsZSBRID0gcXVhbGl0eSAvIDEwMC47CisgIGNvbnN0IGRvdWJsZSBjX2Jhc2UgPSBlbmMtPmNvbmZpZ18tPmVtdWxhdGVfanBlZ19zaXplID8KKyAgICAgIFF1YWxpdHlUb0pQRUdDb21wcmVzc2lvbihRLCBlbmMtPmFscGhhXyAvIDI1NS4pIDoKKyAgICAgIFF1YWxpdHlUb0NvbXByZXNzaW9uKFEpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3NlZ21lbnRzOyArK2kpIHsKKyAgICAvLyBXZSBtb2R1bGF0ZSB0aGUgYmFzZSBjb2VmZmljaWVudCB0byBhY2NvbW1vZGF0ZSBmb3IgdGhlIHF1YW50aXphdGlvbgorICAgIC8vIHN1c2NlcHRpYmlsaXR5IGFuZCBhbGxvdyBkZW5zZXIgc2VnbWVudHMgdG8gYmUgcXVhbnRpemVkIG1vcmUuCisgICAgY29uc3QgZG91YmxlIGV4cG4gPSAxLiAtIGFtcCAqIGVuYy0+ZHFtX1tpXS5hbHBoYV87CisgICAgY29uc3QgZG91YmxlIGMgPSBwb3coY19iYXNlLCBleHBuKTsKKyAgICBjb25zdCBpbnQgcSA9IChpbnQpKDEyNy4gKiAoMS4gLSBjKSk7CisgICAgYXNzZXJ0KGV4cG4gPiAwLik7CisgICAgZW5jLT5kcW1fW2ldLnF1YW50XyA9IGNsaXAocSwgMCwgMTI3KTsKKyAgfQorCisgIC8vIHB1cmVseSBpbmRpY2F0aXZlIGluIHRoZSBiaXRzdHJlYW0gKGV4Y2VwdCBmb3IgdGhlIDEtc2VnbWVudCBjYXNlKQorICBlbmMtPmJhc2VfcXVhbnRfID0gZW5jLT5kcW1fWzBdLnF1YW50XzsKKworICAvLyBmaWxsLWluIHZhbHVlcyBmb3IgdGhlIHVudXNlZCBzZWdtZW50cyAocmVxdWlyZWQgYnkgdGhlIHN5bnRheCkKKyAgZm9yIChpID0gbnVtX3NlZ21lbnRzOyBpIDwgTlVNX01CX1NFR01FTlRTOyArK2kpIHsKKyAgICBlbmMtPmRxbV9baV0ucXVhbnRfID0gZW5jLT5iYXNlX3F1YW50XzsKKyAgfQorCisgIC8vIHV2X2FscGhhXyBpcyBub3JtYWxseSBzcHJlYWQgYXJvdW5kIH42MC4gVGhlIHVzZWZ1bCByYW5nZSBpcworICAvLyB0eXBpY2FsbHkgfjMwIChxdWl0ZSBiYWQpIHRvIH4xMDAgKG9rIHRvIGRlY2ltYXRlIFVWIG1vcmUpLgorICAvLyBXZSBtYXAgaXQgdG8gdGhlIHNhZmUgbWF4aW1hbCByYW5nZSBvZiBNQVgvTUlOX0RRX1VWIGZvciBkcV91di4KKyAgZHFfdXZfYWMgPSAoZW5jLT51dl9hbHBoYV8gLSBNSURfQUxQSEEpICogKE1BWF9EUV9VViAtIE1JTl9EUV9VVikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gKE1BWF9BTFBIQSAtIE1JTl9BTFBIQSk7CisgIC8vIHdlIHJlc2NhbGUgYnkgdGhlIHVzZXItZGVmaW5lZCBzdHJlbmd0aCBvZiBhZGFwdGF0aW9uCisgIGRxX3V2X2FjID0gZHFfdXZfYWMgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMDsKKyAgLy8gYW5kIG1ha2UgaXQgc2FmZS4KKyAgZHFfdXZfYWMgPSBjbGlwKGRxX3V2X2FjLCBNSU5fRFFfVVYsIE1BWF9EUV9VVik7CisgIC8vIFdlIGFsc28gYm9vc3QgdGhlIGRjLXV2LXF1YW50IGEgbGl0dGxlLCBiYXNlZCBvbiBzbnMtc3RyZW5ndGgsIHNpbmNlCisgIC8vIFUvViBjaGFubmVscyBhcmUgcXVpdGUgbW9yZSByZWFjdGl2ZSB0byBoaWdoIHF1YW50cyAoZmxhdCBEQy1ibG9ja3MKKyAgLy8gdGVuZCB0byBhcHBlYXIsIGFuZCBhcmUgdW5wbGVhc2FudCkuCisgIGRxX3V2X2RjID0gLTQgKiBlbmMtPmNvbmZpZ18tPnNuc19zdHJlbmd0aCAvIDEwMDsKKyAgZHFfdXZfZGMgPSBjbGlwKGRxX3V2X2RjLCAtMTUsIDE1KTsgICAvLyA0Yml0LXNpZ25lZCBtYXggYWxsb3dlZAorCisgIGVuYy0+ZHFfeTFfZGNfID0gMDsgICAgICAgLy8gVE9ETyhza2FsKTogZHEtbHVtCisgIGVuYy0+ZHFfeTJfZGNfID0gMDsKKyAgZW5jLT5kcV95Ml9hY18gPSAwOworICBlbmMtPmRxX3V2X2RjXyA9IGRxX3V2X2RjOworICBlbmMtPmRxX3V2X2FjXyA9IGRxX3V2X2FjOworCisgIFNldHVwRmlsdGVyU3RyZW5ndGgoZW5jKTsgICAvLyBpbml0aWFsaXplIHNlZ21lbnRzJyBmaWx0ZXJpbmcsIGV2ZW50dWFsbHkKKworICBpZiAobnVtX3NlZ21lbnRzID4gMSkgU2ltcGxpZnlTZWdtZW50cyhlbmMpOworCisgIFNldHVwTWF0cmljZXMoZW5jKTsgICAgICAgICAvLyBmaW5hbGl6ZSBxdWFudGl6YXRpb24gbWF0cmljZXMKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZvcm0gdGhlIHByZWRpY3Rpb25zIGluIGNhY2hlCisKKy8vIE11c3QgYmUgb3JkZXJlZCB1c2luZyB7RENfUFJFRCwgVE1fUFJFRCwgVl9QUkVELCBIX1BSRUR9IGFzIGluZGV4Citjb25zdCB1aW50MTZfdCBWUDhJMTZNb2RlT2Zmc2V0c1s0XSA9IHsgSTE2REMxNiwgSTE2VE0xNiwgSTE2VkUxNiwgSTE2SEUxNiB9OworY29uc3QgdWludDE2X3QgVlA4VVZNb2RlT2Zmc2V0c1s0XSA9IHsgQzhEQzgsIEM4VE04LCBDOFZFOCwgQzhIRTggfTsKKworLy8gTXVzdCBiZSBpbmRleGVkIHVzaW5nIHtCX0RDX1BSRUQgLT4gQl9IVV9QUkVEfSBhcyBpbmRleAorY29uc3QgdWludDE2X3QgVlA4STRNb2RlT2Zmc2V0c1tOVU1fQk1PREVTXSA9IHsKKyAgSTREQzQsIEk0VE00LCBJNFZFNCwgSTRIRTQsIEk0UkQ0LCBJNFZSNCwgSTRMRDQsIEk0Vkw0LCBJNEhENCwgSTRIVTQKK307CisKK3ZvaWQgVlA4TWFrZUx1bWExNlByZWRzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCkgeworICBjb25zdCB1aW50OF90KiBjb25zdCBsZWZ0ID0gaXQtPnhfID8gaXQtPnlfbGVmdF8gOiBOVUxMOworICBjb25zdCB1aW50OF90KiBjb25zdCB0b3AgPSBpdC0+eV8gPyBpdC0+eV90b3BfIDogTlVMTDsKKyAgVlA4RW5jUHJlZEx1bWExNihpdC0+eXV2X3BfLCBsZWZ0LCB0b3ApOworfQorCit2b2lkIFZQOE1ha2VDaHJvbWE4UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+eF8gPyBpdC0+dV9sZWZ0XyA6IE5VTEw7CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHRvcCA9IGl0LT55XyA/IGl0LT51dl90b3BfIDogTlVMTDsKKyAgVlA4RW5jUHJlZENocm9tYTgoaXQtPnl1dl9wXywgbGVmdCwgdG9wKTsKK30KKwordm9pZCBWUDhNYWtlSW50cmE0UHJlZHMoY29uc3QgVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KSB7CisgIFZQOEVuY1ByZWRMdW1hNChpdC0+eXV2X3BfLCBpdC0+aTRfdG9wXyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWFudGl6ZQorCisvLyBMYXlvdXQ6CisvLyArLS0tLSstLS0tKworLy8gfFlZWVl8VVVWVnwgMAorLy8gfFlZWVl8VVVWVnwgNAorLy8gfFlZWVl8Li4uLnwgOAorLy8gfFlZWVl8Li4uLnwgMTIKKy8vICstLS0tKy0tLS0rCisKK2NvbnN0IHVpbnQxNl90IFZQOFNjYW5bMTZdID0geyAgLy8gTHVtYQorICAwICsgIDAgKiBCUFMsICA0ICsgIDAgKiBCUFMsIDggKyAgMCAqIEJQUywgMTIgKyAgMCAqIEJQUywKKyAgMCArICA0ICogQlBTLCAgNCArICA0ICogQlBTLCA4ICsgIDQgKiBCUFMsIDEyICsgIDQgKiBCUFMsCisgIDAgKyAgOCAqIEJQUywgIDQgKyAgOCAqIEJQUywgOCArICA4ICogQlBTLCAxMiArICA4ICogQlBTLAorICAwICsgMTIgKiBCUFMsICA0ICsgMTIgKiBCUFMsIDggKyAxMiAqIEJQUywgMTIgKyAxMiAqIEJQUywKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBWUDhTY2FuVVZbNCArIDRdID0geworICAwICsgMCAqIEJQUywgICA0ICsgMCAqIEJQUywgMCArIDQgKiBCUFMsICA0ICsgNCAqIEJQUywgICAgLy8gVQorICA4ICsgMCAqIEJQUywgIDEyICsgMCAqIEJQUywgOCArIDQgKiBCUFMsIDEyICsgNCAqIEJQUyAgICAgLy8gVgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3RvcnRpb24gbWVhc3VyZW1lbnQKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRZWzE2XSA9IHsKKyAgMzgsIDMyLCAyMCwgOSwgMzIsIDI4LCAxNywgNywgMjAsIDE3LCAxMCwgNCwgOSwgNywgNCwgMgorfTsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGtXZWlnaHRUcmVsbGlzWzE2XSA9IHsKKyNpZiBVU0VfVERJU1RPID09IDAKKyAgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYKKyNlbHNlCisgIDMwLCAyNywgMTksIDExLAorICAyNywgMjQsIDE3LCAxMCwKKyAgMTksIDE3LCAxMiwgIDgsCisgIDExLCAxMCwgIDgsICA2CisjZW5kaWYKK307CisKKy8vIEluaXQvQ29weSB0aGUgY29tbW9uIGZpZWxkcyBpbiBzY29yZS4KK3N0YXRpYyB2b2lkIEluaXRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IHJkKSB7CisgIHJkLT5EICA9IDA7CisgIHJkLT5TRCA9IDA7CisgIHJkLT5SICA9IDA7CisgIHJkLT5IICA9IDA7CisgIHJkLT5ueiA9IDA7CisgIHJkLT5zY29yZSA9IE1BWF9DT1NUOworfQorCitzdGF0aWMgdm9pZCBDb3B5U2NvcmUoVlA4TW9kZVNjb3JlKiBjb25zdCBkc3QsIGNvbnN0IFZQOE1vZGVTY29yZSogY29uc3Qgc3JjKSB7CisgIGRzdC0+RCAgPSBzcmMtPkQ7CisgIGRzdC0+U0QgPSBzcmMtPlNEOworICBkc3QtPlIgID0gc3JjLT5SOworICBkc3QtPkggID0gc3JjLT5IOworICBkc3QtPm56ID0gc3JjLT5uejsgICAgICAvLyBub3RlIHRoYXQgbnogaXMgbm90IGFjY3VtdWxhdGVkLCBidXQganVzdCBjb3BpZWQuCisgIGRzdC0+c2NvcmUgPSBzcmMtPnNjb3JlOworfQorCitzdGF0aWMgdm9pZCBBZGRTY29yZShWUDhNb2RlU2NvcmUqIGNvbnN0IGRzdCwgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCBzcmMpIHsKKyAgZHN0LT5EICArPSBzcmMtPkQ7CisgIGRzdC0+U0QgKz0gc3JjLT5TRDsKKyAgZHN0LT5SICArPSBzcmMtPlI7CisgIGRzdC0+SCAgKz0gc3JjLT5IOworICBkc3QtPm56IHw9IHNyYy0+bno7ICAgICAvLyBoZXJlLCBuZXcgbnogYml0cyBhcmUgYWNjdW11bGF0ZWQuCisgIGRzdC0+c2NvcmUgKz0gc3JjLT5zY29yZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBlcmZvcm1zIHRyZWxsaXMtb3B0aW1pemVkIHF1YW50aXphdGlvbi4KKworLy8gVHJlbGxpcyBub2RlCit0eXBlZGVmIHN0cnVjdCB7CisgIGludDhfdCBwcmV2OyAgICAgICAgICAgIC8vIGJlc3QgcHJldmlvdXMgbm9kZQorICBpbnQ4X3Qgc2lnbjsgICAgICAgICAgICAvLyBzaWduIG9mIGNvZWZmX2kKKyAgaW50MTZfdCBsZXZlbDsgICAgICAgICAgLy8gbGV2ZWwKK30gTm9kZTsKKworLy8gU2NvcmUgc3RhdGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgc2NvcmVfdCBzY29yZTsgICAgICAgICAgLy8gcGFydGlhbCBSRCBzY29yZQorICBjb25zdCB1aW50MTZfdCogY29zdHM7ICAvLyBzaG9ydGN1dCB0byBjb3N0IHRhYmxlcworfSBTY29yZVN0YXRlOworCisvLyBJZiBhIGNvZWZmaWNpZW50IHdhcyBxdWFudGl6ZWQgdG8gYSB2YWx1ZSBRICh1c2luZyBhIG5ldXRyYWwgYmlhcyksCisvLyB3ZSB0ZXN0IGFsbCBhbHRlcm5hdGUgcG9zc2liaWxpdGllcyBiZXR3ZWVuIFtRLU1JTl9ERUxUQSwgUStNQVhfREVMVEFdCisvLyBXZSBkb24ndCB0ZXN0IG5lZ2F0aXZlIHZhbHVlcyB0aG91Z2guCisjZGVmaW5lIE1JTl9ERUxUQSAwICAgLy8gaG93IG11Y2ggbG93ZXIgbGV2ZWwgdG8gdHJ5CisjZGVmaW5lIE1BWF9ERUxUQSAxICAgLy8gaG93IG11Y2ggaGlnaGVyCisjZGVmaW5lIE5VTV9OT0RFUyAoTUlOX0RFTFRBICsgMSArIE1BWF9ERUxUQSkKKyNkZWZpbmUgTk9ERShuLCBsKSAobm9kZXNbKG4pXVsobCkgKyBNSU5fREVMVEFdKQorI2RlZmluZSBTQ09SRV9TVEFURShuLCBsKSAoc2NvcmVfc3RhdGVzW25dWyhsKSArIE1JTl9ERUxUQV0pCisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNldFJEU2NvcmUoaW50IGxhbWJkYSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICByZC0+c2NvcmUgPSAocmQtPlIgKyByZC0+SCkgKiBsYW1iZGEgKyBSRF9ESVNUT19NVUxUICogKHJkLT5EICsgcmQtPlNEKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHNjb3JlX3QgUkRTY29yZVRyZWxsaXMoaW50IGxhbWJkYSwgc2NvcmVfdCByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcmVfdCBkaXN0b3J0aW9uKSB7CisgIHJldHVybiByYXRlICogbGFtYmRhICsgUkRfRElTVE9fTVVMVCAqIGRpc3RvcnRpb247Cit9CisKK3N0YXRpYyBpbnQgVHJlbGxpc1F1YW50aXplQmxvY2soY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IGluWzE2XSwgaW50MTZfdCBvdXRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3R4MCwgaW50IGNvZWZmX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGFtYmRhKSB7CisgIGNvbnN0IFByb2JhQXJyYXkqIGNvbnN0IHByb2JhcyA9IGVuYy0+cHJvYmFfLmNvZWZmc19bY29lZmZfdHlwZV07CisgIENvc3RBcnJheVB0ciBjb25zdCBjb3N0cyA9CisgICAgICAoQ29zdEFycmF5UHRyKWVuYy0+cHJvYmFfLnJlbWFwcGVkX2Nvc3RzX1tjb2VmZl90eXBlXTsKKyAgY29uc3QgaW50IGZpcnN0ID0gKGNvZWZmX3R5cGUgPT0gMCkgPyAxIDogMDsKKyAgTm9kZSBub2Rlc1sxNl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSBzY29yZV9zdGF0ZXNbMl1bTlVNX05PREVTXTsKKyAgU2NvcmVTdGF0ZSogc3NfY3VyID0gJlNDT1JFX1NUQVRFKDAsIE1JTl9ERUxUQSk7CisgIFNjb3JlU3RhdGUqIHNzX3ByZXYgPSAmU0NPUkVfU1RBVEUoMSwgTUlOX0RFTFRBKTsKKyAgaW50IGJlc3RfcGF0aFszXSA9IHstMSwgLTEsIC0xfTsgICAvLyBzdG9yZSBiZXN0LWxhc3QvYmVzdC1sZXZlbC9iZXN0LXByZXZpb3VzCisgIHNjb3JlX3QgYmVzdF9zY29yZTsKKyAgaW50IG4sIG0sIHAsIGxhc3Q7CisKKyAgeworICAgIHNjb3JlX3QgY29zdDsKKyAgICBjb25zdCBpbnQgdGhyZXNoID0gbXR4LT5xX1sxXSAqIG10eC0+cV9bMV0gLyA0OworICAgIGNvbnN0IGludCBsYXN0X3Byb2JhID0gcHJvYmFzW1ZQOEVuY0JhbmRzW2ZpcnN0XV1bY3R4MF1bMF07CisKKyAgICAvLyBjb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBpbnRlcmVzdGluZyBjb2VmZmljaWVudAorICAgIGxhc3QgPSBmaXJzdCAtIDE7CisgICAgZm9yIChuID0gMTU7IG4gPj0gZmlyc3Q7IC0tbikgeworICAgICAgY29uc3QgaW50IGogPSBrWmlnemFnW25dOworICAgICAgY29uc3QgaW50IGVyciA9IGluW2pdICogaW5bal07CisgICAgICBpZiAoZXJyID4gdGhyZXNoKSB7CisgICAgICAgIGxhc3QgPSBuOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgbmVlZCB0byBnbyBpbnNwZWN0IHVwIHRvIG4gPSAxNiBjb2VmZnMuIFdlIGNhbiBqdXN0IGdvIHVwCisgICAgLy8gdG8gbGFzdCArIDEgKGluY2x1c2l2ZSkgd2l0aG91dCBsb3NpbmcgbXVjaC4KKyAgICBpZiAobGFzdCA8IDE1KSArK2xhc3Q7CisKKyAgICAvLyBjb21wdXRlICdza2lwJyBzY29yZS4gVGhpcyBpcyB0aGUgbWF4IHNjb3JlIG9uZSBjYW4gZG8uCisgICAgY29zdCA9IFZQOEJpdENvc3QoMCwgbGFzdF9wcm9iYSk7CisgICAgYmVzdF9zY29yZSA9IFJEU2NvcmVUcmVsbGlzKGxhbWJkYSwgY29zdCwgMCk7CisKKyAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBub2RlLgorICAgIGZvciAobSA9IC1NSU5fREVMVEE7IG0gPD0gTUFYX0RFTFRBOyArK20pIHsKKyAgICAgIGNvbnN0IHNjb3JlX3QgcmF0ZSA9IChjdHgwID09IDApID8gVlA4Qml0Q29zdCgxLCBsYXN0X3Byb2JhKSA6IDA7CisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIHJhdGUsIDApOworICAgICAgc3NfY3VyW21dLmNvc3RzID0gY29zdHNbZmlyc3RdW2N0eDBdOworICAgIH0KKyAgfQorCisgIC8vIHRyYXZlcnNlIHRyZWxsaXMuCisgIGZvciAobiA9IGZpcnN0OyBuIDw9IGxhc3Q7ICsrbikgeworICAgIGNvbnN0IGludCBqID0ga1ppZ3phZ1tuXTsKKyAgICBjb25zdCB1aW50MzJfdCBRICA9IG10eC0+cV9bal07CisgICAgY29uc3QgdWludDMyX3QgaVEgPSBtdHgtPmlxX1tqXTsKKyAgICBjb25zdCB1aW50MzJfdCBCID0gQklBUygweDAwKTsgICAgIC8vIG5ldXRyYWwgYmlhcworICAgIC8vIG5vdGU6IGl0J3MgaW1wb3J0YW50IHRvIHRha2Ugc2lnbiBvZiB0aGUgX29yaWdpbmFsXyBjb2VmZiwKKyAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNvbnNpZGVyIGxldmVsIDwgMCBhZnRlcndhcmQuCisgICAgY29uc3QgaW50IHNpZ24gPSAoaW5bal0gPCAwKTsKKyAgICBjb25zdCB1aW50MzJfdCBjb2VmZjAgPSAoc2lnbiA/IC1pbltqXSA6IGluW2pdKSArIG10eC0+c2hhcnBlbl9bal07CisgICAgaW50IGxldmVsMCA9IFFVQU5URElWKGNvZWZmMCwgaVEsIEIpOworICAgIGludCB0aHJlc2hfbGV2ZWwgPSBRVUFOVERJVihjb2VmZjAsIGlRLCBCSUFTKDB4ODApKTsKKyAgICBpZiAodGhyZXNoX2xldmVsID4gTUFYX0xFVkVMKSB0aHJlc2hfbGV2ZWwgPSBNQVhfTEVWRUw7CisgICAgaWYgKGxldmVsMCA+IE1BWF9MRVZFTCkgbGV2ZWwwID0gTUFYX0xFVkVMOworCisgICAgeyAgIC8vIFN3YXAgY3VycmVudCBhbmQgcHJldmlvdXMgc2NvcmUgc3RhdGVzCisgICAgICBTY29yZVN0YXRlKiBjb25zdCB0bXAgPSBzc19jdXI7CisgICAgICBzc19jdXIgPSBzc19wcmV2OworICAgICAgc3NfcHJldiA9IHRtcDsKKyAgICB9CisKKyAgICAvLyB0ZXN0IGFsbCBhbHRlcm5hdGUgbGV2ZWwgdmFsdWVzIGFyb3VuZCBsZXZlbDAuCisgICAgZm9yIChtID0gLU1JTl9ERUxUQTsgbSA8PSBNQVhfREVMVEE7ICsrbSkgeworICAgICAgTm9kZSogY29uc3QgY3VyID0gJk5PREUobiwgbSk7CisgICAgICBpbnQgbGV2ZWwgPSBsZXZlbDAgKyBtOworICAgICAgY29uc3QgaW50IGN0eCA9IChsZXZlbCA+IDIpID8gMiA6IGxldmVsOworICAgICAgY29uc3QgaW50IGJhbmQgPSBWUDhFbmNCYW5kc1tuICsgMV07CisgICAgICBzY29yZV90IGJhc2Vfc2NvcmU7CisgICAgICBzY29yZV90IGJlc3RfY3VyX3Njb3JlID0gTUFYX0NPU1Q7CisgICAgICBpbnQgYmVzdF9wcmV2ID0gMDsgICAvLyBkZWZhdWx0LCBpbiBjYXNlCisKKyAgICAgIHNzX2N1clttXS5zY29yZSA9IE1BWF9DT1NUOworICAgICAgc3NfY3VyW21dLmNvc3RzID0gY29zdHNbbiArIDFdW2N0eF07CisgICAgICBpZiAobGV2ZWwgPCAwIHx8IGxldmVsID4gdGhyZXNoX2xldmVsKSB7CisgICAgICAgIC8vIE5vZGUgaXMgZGVhZC4KKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIHsKKyAgICAgICAgLy8gQ29tcHV0ZSBkZWx0YV9lcnJvciA9IGhvdyBtdWNoIGNvZGluZyB0aGlzIGxldmVsIHdpbGwKKyAgICAgICAgLy8gc3VidHJhY3QgdG8gbWF4X2Vycm9yIGFzIGRpc3RvcnRpb24uCisgICAgICAgIC8vIEhlcmUsIGRpc3RvcnRpb24gPSBzdW0gb2YgKHxjb2VmZl9pfCAtIGxldmVsX2kgKiBRX2kpXjIKKyAgICAgICAgY29uc3QgaW50IG5ld19lcnJvciA9IGNvZWZmMCAtIGxldmVsICogUTsKKyAgICAgICAgY29uc3QgaW50IGRlbHRhX2Vycm9yID0KKyAgICAgICAgICAgIGtXZWlnaHRUcmVsbGlzW2pdICogKG5ld19lcnJvciAqIG5ld19lcnJvciAtIGNvZWZmMCAqIGNvZWZmMCk7CisgICAgICAgIGJhc2Vfc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIDAsIGRlbHRhX2Vycm9yKTsKKyAgICAgIH0KKworICAgICAgLy8gSW5zcGVjdCBhbGwgcG9zc2libGUgbm9uLWRlYWQgcHJlZGVjZXNzb3JzLiBSZXRhaW4gb25seSB0aGUgYmVzdCBvbmUuCisgICAgICBmb3IgKHAgPSAtTUlOX0RFTFRBOyBwIDw9IE1BWF9ERUxUQTsgKytwKSB7CisgICAgICAgIC8vIERlYWQgbm9kZXMgKHdpdGggc3NfcHJldltwXS5zY29yZSA+PSBNQVhfQ09TVCkgYXJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gZWxpbWluYXRlZCBzaW5jZSB0aGVpciBzY29yZSBjYW4ndCBiZSBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCBiZXN0LgorICAgICAgICBjb25zdCBzY29yZV90IGNvc3QgPSBWUDhMZXZlbENvc3Qoc3NfcHJldltwXS5jb3N0cywgbGV2ZWwpOworICAgICAgICAvLyBFeGFtaW5lIG5vZGUgYXNzdW1pbmcgaXQncyBhIG5vbi10ZXJtaW5hbCBvbmUuCisgICAgICAgIGNvbnN0IHNjb3JlX3Qgc2NvcmUgPQorICAgICAgICAgICAgYmFzZV9zY29yZSArIHNzX3ByZXZbcF0uc2NvcmUgKyBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGNvc3QsIDApOworICAgICAgICBpZiAoc2NvcmUgPCBiZXN0X2N1cl9zY29yZSkgeworICAgICAgICAgIGJlc3RfY3VyX3Njb3JlID0gc2NvcmU7CisgICAgICAgICAgYmVzdF9wcmV2ID0gcDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gU3RvcmUgYmVzdCBmaW5kaW5nIGluIGN1cnJlbnQgbm9kZS4KKyAgICAgIGN1ci0+c2lnbiA9IHNpZ247CisgICAgICBjdXItPmxldmVsID0gbGV2ZWw7CisgICAgICBjdXItPnByZXYgPSBiZXN0X3ByZXY7CisgICAgICBzc19jdXJbbV0uc2NvcmUgPSBiZXN0X2N1cl9zY29yZTsKKworICAgICAgLy8gTm93LCByZWNvcmQgYmVzdCB0ZXJtaW5hbCBub2RlIChhbmQgdGh1cyBiZXN0IGVudHJ5IGluIHRoZSBncmFwaCkuCisgICAgICBpZiAobGV2ZWwgIT0gMCkgeworICAgICAgICBjb25zdCBzY29yZV90IGxhc3RfcG9zX2Nvc3QgPQorICAgICAgICAgICAgKG4gPCAxNSkgPyBWUDhCaXRDb3N0KDAsIHByb2Jhc1tiYW5kXVtjdHhdWzBdKSA6IDA7CisgICAgICAgIGNvbnN0IHNjb3JlX3QgbGFzdF9wb3Nfc2NvcmUgPSBSRFNjb3JlVHJlbGxpcyhsYW1iZGEsIGxhc3RfcG9zX2Nvc3QsIDApOworICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gYmVzdF9jdXJfc2NvcmUgKyBsYXN0X3Bvc19zY29yZTsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgeworICAgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgICAgICBiZXN0X3BhdGhbMF0gPSBuOyAgICAgICAgICAgICAgICAgICAgIC8vIGJlc3QgZW9iIHBvc2l0aW9uCisgICAgICAgICAgYmVzdF9wYXRoWzFdID0gbTsgICAgICAgICAgICAgICAgICAgICAvLyBiZXN0IG5vZGUgaW5kZXgKKyAgICAgICAgICBiZXN0X3BhdGhbMl0gPSBiZXN0X3ByZXY7ICAgICAgICAgICAgIC8vIGJlc3QgcHJlZGVjZXNzb3IKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIEZyZXNoIHN0YXJ0CisgIG1lbXNldChpbiArIGZpcnN0LCAwLCAoMTYgLSBmaXJzdCkgKiBzaXplb2YoKmluKSk7CisgIG1lbXNldChvdXQgKyBmaXJzdCwgMCwgKDE2IC0gZmlyc3QpICogc2l6ZW9mKCpvdXQpKTsKKyAgaWYgKGJlc3RfcGF0aFswXSA9PSAtMSkgeworICAgIHJldHVybiAwOyAgIC8vIHNraXAhCisgIH0KKworICB7CisgICAgLy8gVW53aW5kIHRoZSBiZXN0IHBhdGguCisgICAgLy8gTm90ZTogYmVzdC1wcmV2IG9uIHRlcm1pbmFsIG5vZGUgaXMgbm90IG5lY2Vzc2FyaWx5IGVxdWFsIHRvIHRoZQorICAgIC8vIGJlc3RfcHJldiBmb3Igbm9uLXRlcm1pbmFsLiBTbyB3ZSBwYXRjaCBiZXN0X3BhdGhbMl0gaW4uCisgICAgaW50IG56ID0gMDsKKyAgICBpbnQgYmVzdF9ub2RlID0gYmVzdF9wYXRoWzFdOworICAgIG4gPSBiZXN0X3BhdGhbMF07CisgICAgTk9ERShuLCBiZXN0X25vZGUpLnByZXYgPSBiZXN0X3BhdGhbMl07ICAgLy8gZm9yY2UgYmVzdC1wcmV2IGZvciB0ZXJtaW5hbAorCisgICAgZm9yICg7IG4gPj0gZmlyc3Q7IC0tbikgeworICAgICAgY29uc3QgTm9kZSogY29uc3Qgbm9kZSA9ICZOT0RFKG4sIGJlc3Rfbm9kZSk7CisgICAgICBjb25zdCBpbnQgaiA9IGtaaWd6YWdbbl07CisgICAgICBvdXRbbl0gPSBub2RlLT5zaWduID8gLW5vZGUtPmxldmVsIDogbm9kZS0+bGV2ZWw7CisgICAgICBueiB8PSBub2RlLT5sZXZlbDsKKyAgICAgIGluW2pdID0gb3V0W25dICogbXR4LT5xX1tqXTsKKyAgICAgIGJlc3Rfbm9kZSA9IG5vZGUtPnByZXY7CisgICAgfQorICAgIHJldHVybiAobnogIT0gMCk7CisgIH0KK30KKworI3VuZGVmIE5PREUKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBlcmZvcm1zOiBkaWZmZXJlbmNlLCB0cmFuc2Zvcm0sIHF1YW50aXplLCBiYWNrLXRyYW5zZm9ybSwgYWRkCisvLyBhbGwgYXQgb25jZS4gT3V0cHV0IGlzIHRoZSByZWNvbnN0cnVjdGVkIGJsb2NrIGluICp5dXZfb3V0LCBhbmQgdGhlCisvLyBxdWFudGl6ZWQgbGV2ZWxzIGluICpsZXZlbHMuCisKK3N0YXRpYyBpbnQgUmVjb25zdHJ1Y3RJbnRyYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1vZGVTY29yZSogY29uc3QgcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUpIHsKKyAgY29uc3QgVlA4RW5jb2RlciogY29uc3QgZW5jID0gaXQtPmVuY187CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJMTZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50IG47CisgIGludDE2X3QgdG1wWzE2XVsxNl0sIGRjX3RtcFsxNl07CisKKyAgZm9yIChuID0gMDsgbiA8IDE2OyBuICs9IDIpIHsKKyAgICBWUDhGVHJhbnNmb3JtMihzcmMgKyBWUDhTY2FuW25dLCByZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0pOworICB9CisgIFZQOEZUcmFuc2Zvcm1XSFQodG1wWzBdLCBkY190bXApOworICBueiB8PSBWUDhFbmNRdWFudGl6ZUJsb2NrV0hUKGRjX3RtcCwgcmQtPnlfZGNfbGV2ZWxzLCAmZHFtLT55Ml8pIDw8IDI0OworCisgIGlmIChET19UUkVMTElTX0kxNiAmJiBpdC0+ZG9fdHJlbGxpc18pIHsKKyAgICBpbnQgeCwgeTsKKyAgICBWUDhJdGVyYXRvck56VG9CeXRlcyhpdCk7CisgICAgZm9yICh5ID0gMCwgbiA9IDA7IHkgPCA0OyArK3kpIHsKKyAgICAgIGZvciAoeCA9IDA7IHggPCA0OyArK3gsICsrbikgeworICAgICAgICBjb25zdCBpbnQgY3R4ID0gaXQtPnRvcF9uel9beF0gKyBpdC0+bGVmdF9uel9beV07CisgICAgICAgIGNvbnN0IGludCBub25femVybyA9CisgICAgICAgICAgICBUcmVsbGlzUXVhbnRpemVCbG9jayhlbmMsIHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCBjdHgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHFtLT55MV8sIGRxbS0+bGFtYmRhX3RyZWxsaXNfaTE2Xyk7CisgICAgICAgIGl0LT50b3BfbnpfW3hdID0gaXQtPmxlZnRfbnpfW3ldID0gbm9uX3plcm87CisgICAgICAgIHJkLT55X2FjX2xldmVsc1tuXVswXSA9IDA7CisgICAgICAgIG56IHw9IG5vbl96ZXJvIDw8IG47CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7CisgICAgICAvLyBaZXJvLW91dCB0aGUgZmlyc3QgY29lZmYsIHNvIHRoYXQ6IGEpIG56IGlzIGNvcnJlY3QgYmVsb3csIGFuZAorICAgICAgLy8gYikgZmluZGluZyAnbGFzdCcgbm9uLXplcm8gY29lZmZzIGluIFNldFJlc2lkdWFsQ29lZmZzKCkgaXMgc2ltcGxpZmllZC4KKyAgICAgIHRtcFtuXVswXSA9IHRtcFtuICsgMV1bMF0gPSAwOworICAgICAgbnogfD0gVlA4RW5jUXVhbnRpemUyQmxvY2tzKHRtcFtuXSwgcmQtPnlfYWNfbGV2ZWxzW25dLCAmZHFtLT55MV8pIDw8IG47CisgICAgICBhc3NlcnQocmQtPnlfYWNfbGV2ZWxzW24gKyAwXVswXSA9PSAwKTsKKyAgICAgIGFzc2VydChyZC0+eV9hY19sZXZlbHNbbiArIDFdWzBdID09IDApOworICAgIH0KKyAgfQorCisgIC8vIFRyYW5zZm9ybSBiYWNrCisgIFZQOFRyYW5zZm9ybVdIVChkY190bXAsIHRtcFswXSk7CisgIGZvciAobiA9IDA7IG4gPCAxNjsgbiArPSAyKSB7CisgICAgVlA4SVRyYW5zZm9ybShyZWYgKyBWUDhTY2FuW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuW25dLCAxKTsKKyAgfQorCisgIHJldHVybiBuejsKK30KKworc3RhdGljIGludCBSZWNvbnN0cnVjdEludHJhNChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgbGV2ZWxzWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCB5dXZfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZSkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEk0TW9kZU9mZnNldHNbbW9kZV07CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50MTZfdCB0bXBbMTZdOworCisgIFZQOEZUcmFuc2Zvcm0oc3JjLCByZWYsIHRtcCk7CisgIGlmIChET19UUkVMTElTX0k0ICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGNvbnN0IGludCB4ID0gaXQtPmk0XyAmIDMsIHkgPSBpdC0+aTRfID4+IDI7CisgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfW3hdICsgaXQtPmxlZnRfbnpfW3ldOworICAgIG56ID0gVHJlbGxpc1F1YW50aXplQmxvY2soZW5jLCB0bXAsIGxldmVscywgY3R4LCAzLCAmZHFtLT55MV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcW0tPmxhbWJkYV90cmVsbGlzX2k0Xyk7CisgIH0gZWxzZSB7CisgICAgbnogPSBWUDhFbmNRdWFudGl6ZUJsb2NrKHRtcCwgbGV2ZWxzLCAmZHFtLT55MV8pOworICB9CisgIFZQOElUcmFuc2Zvcm0ocmVmLCB0bXAsIHl1dl9vdXQsIDApOworICByZXR1cm4gbno7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEQy1lcnJvciBkaWZmdXNpb24KKworLy8gRGlmZnVzaW9uIHdlaWdodHMuIFdlIHVuZGVyLWNvcnJlY3QgYSBiaXQgKDE1LzE2dGggb2YgdGhlIGVycm9yIGlzIGFjdHVhbGx5CisvLyBkaWZmdXNlZCkgdG8gYXZvaWQgJ3JhaW5ib3cnIGNoZXNzYm9hcmQgcGF0dGVybiBvZiBibG9ja3MgYXQgcX49MC4KKyNkZWZpbmUgQzEgNyAgICAvLyBmcmFjdGlvbiBvZiBlcnJvciBzZW50IHRvIHRoZSA0eDQgYmxvY2sgYmVsb3cKKyNkZWZpbmUgQzIgOCAgICAvLyBmcmFjdGlvbiBvZiBlcnJvciBzZW50IHRvIHRoZSA0eDQgYmxvY2sgb24gdGhlIHJpZ2h0CisjZGVmaW5lIERTSElGVCA0CisjZGVmaW5lIERTQ0FMRSAxICAgLy8gc3RvcmFnZSBkZXNjYWxpbmcsIG5lZWRlZCB0byBtYWtlIHRoZSBlcnJvciBmaXQgaW50OF90CisKKy8vIFF1YW50aXplIGFzIHVzdWFsLCBidXQgYWxzbyBjb21wdXRlIGFuZCByZXR1cm4gdGhlIHF1YW50aXphdGlvbiBlcnJvci4KKy8vIEVycm9yIGlzIGFscmVhZHkgZGl2aWRlZCBieSBEU0hJRlQuCitzdGF0aWMgaW50IFF1YW50aXplU2luZ2xlKGludDE2X3QqIGNvbnN0IHYsIGNvbnN0IFZQOE1hdHJpeCogY29uc3QgbXR4KSB7CisgIGludCBWID0gKnY7CisgIGNvbnN0IGludCBzaWduID0gKFYgPCAwKTsKKyAgaWYgKHNpZ24pIFYgPSAtVjsKKyAgaWYgKFYgPiAoaW50KW10eC0+enRocmVzaF9bMF0pIHsKKyAgICBjb25zdCBpbnQgcVYgPSBRVUFOVERJVihWLCBtdHgtPmlxX1swXSwgbXR4LT5iaWFzX1swXSkgKiBtdHgtPnFfWzBdOworICAgIGNvbnN0IGludCBlcnIgPSAoViAtIHFWKTsKKyAgICAqdiA9IHNpZ24gPyAtcVYgOiBxVjsKKyAgICByZXR1cm4gKHNpZ24gPyAtZXJyIDogZXJyKSA+PiBEU0NBTEU7CisgIH0KKyAgKnYgPSAwOworICByZXR1cm4gKHNpZ24gPyAtViA6IFYpID4+IERTQ0FMRTsKK30KKworc3RhdGljIHZvaWQgQ29ycmVjdERDVmFsdWVzKGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhNYXRyaXgqIGNvbnN0IG10eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IHRtcFtdWzE2XSwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICAvLyAgICAgICAgIHwgdG9wWzBdIHwgdG9wWzFdCisgIC8vIC0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLQorICAvLyBsZWZ0WzBdIHwgdG1wWzBdICAgdG1wWzFdICA8LT4gICBlcnIwIGVycjEKKyAgLy8gbGVmdFsxXSB8IHRtcFsyXSAgIHRtcFszXSAgICAgICAgZXJyMiBlcnIzCisgIC8vCisgIC8vIEZpbmFsIGVycm9ycyB7ZXJyMSxlcnIyLGVycjN9IGFyZSBwcmVzZXJ2ZWQgYW5kIGxhdGVyIHJlc3RvcmVkCisgIC8vIGFzIHRvcFtdL2xlZnRbXSBvbiB0aGUgbmV4dCBibG9jay4KKyAgaW50IGNoOworICBmb3IgKGNoID0gMDsgY2ggPD0gMTsgKytjaCkgeworICAgIGNvbnN0IGludDhfdCogY29uc3QgdG9wID0gaXQtPnRvcF9kZXJyX1tpdC0+eF9dW2NoXTsKKyAgICBjb25zdCBpbnQ4X3QqIGNvbnN0IGxlZnQgPSBpdC0+bGVmdF9kZXJyX1tjaF07CisgICAgaW50MTZfdCAoKiBjb25zdCBjKVsxNl0gPSAmdG1wW2NoICogNF07CisgICAgaW50IGVycjAsIGVycjEsIGVycjIsIGVycjM7CisgICAgY1swXVswXSArPSAoQzEgKiB0b3BbMF0gKyBDMiAqIGxlZnRbMF0pID4+IChEU0hJRlQgLSBEU0NBTEUpOworICAgIGVycjAgPSBRdWFudGl6ZVNpbmdsZSgmY1swXVswXSwgbXR4KTsKKyAgICBjWzFdWzBdICs9IChDMSAqIHRvcFsxXSArIEMyICogZXJyMCkgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMSA9IFF1YW50aXplU2luZ2xlKCZjWzFdWzBdLCBtdHgpOworICAgIGNbMl1bMF0gKz0gKEMxICogZXJyMCArIEMyICogbGVmdFsxXSkgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMiA9IFF1YW50aXplU2luZ2xlKCZjWzJdWzBdLCBtdHgpOworICAgIGNbM11bMF0gKz0gKEMxICogZXJyMSArIEMyICogZXJyMikgPj4gKERTSElGVCAtIERTQ0FMRSk7CisgICAgZXJyMyA9IFF1YW50aXplU2luZ2xlKCZjWzNdWzBdLCBtdHgpOworICAgIC8vIGVycm9yICdlcnInIGlzIGJvdW5kZWQgYnkgbXR4LT5xX1swXSB3aGljaCBpcyAxMzIgYXQgbWF4LiBIZW5jZQorICAgIC8vIGVyciA+PiBEU0NBTEUgd2lsbCBmaXQgaW4gYW4gaW50OF90IHR5cGUgaWYgRFNDQUxFPj0xLgorICAgIGFzc2VydChhYnMoZXJyMSkgPD0gMTI3ICYmIGFicyhlcnIyKSA8PSAxMjcgJiYgYWJzKGVycjMpIDw9IDEyNyk7CisgICAgcmQtPmRlcnJbY2hdWzBdID0gKGludDhfdCllcnIxOworICAgIHJkLT5kZXJyW2NoXVsxXSA9IChpbnQ4X3QpZXJyMjsKKyAgICByZC0+ZGVycltjaF1bMl0gPSAoaW50OF90KWVycjM7CisgIH0KK30KKworc3RhdGljIHZvaWQgU3RvcmVEaWZmdXNpb25FcnJvcnMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBpbnQgY2g7CisgIGZvciAoY2ggPSAwOyBjaCA8PSAxOyArK2NoKSB7CisgICAgaW50OF90KiBjb25zdCB0b3AgPSBpdC0+dG9wX2RlcnJfW2l0LT54X11bY2hdOworICAgIGludDhfdCogY29uc3QgbGVmdCA9IGl0LT5sZWZ0X2RlcnJfW2NoXTsKKyAgICBsZWZ0WzBdID0gcmQtPmRlcnJbY2hdWzBdOyAgICAgICAgICAgIC8vIHJlc3RvcmUgZXJyMQorICAgIGxlZnRbMV0gPSAzICogcmQtPmRlcnJbY2hdWzJdID4+IDI7ICAgLy8gICAgIC4uLiAzLzR0aCBvZiBlcnIzCisgICAgdG9wWzBdICA9IHJkLT5kZXJyW2NoXVsxXTsgICAgICAgICAgICAvLyAgICAgLi4uIGVycjIKKyAgICB0b3BbMV0gID0gcmQtPmRlcnJbY2hdWzJdIC0gbGVmdFsxXTsgIC8vICAgICAuLi4gMS80dGggb2YgZXJyMy4KKyAgfQorfQorCisjdW5kZWYgQzEKKyN1bmRlZiBDMgorI3VuZGVmIERTSElGVAorI3VuZGVmIERTQ0FMRQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IFJlY29uc3RydWN0VVYoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBWUDhNb2RlU2NvcmUqIGNvbnN0IHJkLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHl1dl9vdXQsIGludCBtb2RlKSB7CisgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYyA9IGl0LT5lbmNfOworICBjb25zdCB1aW50OF90KiBjb25zdCByZWYgPSBpdC0+eXV2X3BfICsgVlA4VVZNb2RlT2Zmc2V0c1ttb2RlXTsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmZW5jLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgaW50IG56ID0gMDsKKyAgaW50IG47CisgIGludDE2X3QgdG1wWzhdWzE2XTsKKworICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7CisgICAgVlA4RlRyYW5zZm9ybTIoc3JjICsgVlA4U2NhblVWW25dLCByZWYgKyBWUDhTY2FuVVZbbl0sIHRtcFtuXSk7CisgIH0KKyAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgQ29ycmVjdERDVmFsdWVzKGl0LCAmZHFtLT51dl8sIHRtcCwgcmQpOworCisgIGlmIChET19UUkVMTElTX1VWICYmIGl0LT5kb190cmVsbGlzXykgeworICAgIGludCBjaCwgeCwgeTsKKyAgICBmb3IgKGNoID0gMCwgbiA9IDA7IGNoIDw9IDI7IGNoICs9IDIpIHsKKyAgICAgIGZvciAoeSA9IDA7IHkgPCAyOyArK3kpIHsKKyAgICAgICAgZm9yICh4ID0gMDsgeCA8IDI7ICsreCwgKytuKSB7CisgICAgICAgICAgY29uc3QgaW50IGN0eCA9IGl0LT50b3BfbnpfWzQgKyBjaCArIHhdICsgaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldOworICAgICAgICAgIGNvbnN0IGludCBub25femVybyA9CisgICAgICAgICAgICAgIFRyZWxsaXNRdWFudGl6ZUJsb2NrKGVuYywgdG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCBjdHgsIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcW0tPnV2XywgZHFtLT5sYW1iZGFfdHJlbGxpc191dl8pOworICAgICAgICAgIGl0LT50b3BfbnpfWzQgKyBjaCArIHhdID0gaXQtPmxlZnRfbnpfWzQgKyBjaCArIHldID0gbm9uX3plcm87CisgICAgICAgICAgbnogfD0gbm9uX3plcm8gPDwgbjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKG4gPSAwOyBuIDwgODsgbiArPSAyKSB7CisgICAgICBueiB8PSBWUDhFbmNRdWFudGl6ZTJCbG9ja3ModG1wW25dLCByZC0+dXZfbGV2ZWxzW25dLCAmZHFtLT51dl8pIDw8IG47CisgICAgfQorICB9CisKKyAgZm9yIChuID0gMDsgbiA8IDg7IG4gKz0gMikgeworICAgIFZQOElUcmFuc2Zvcm0ocmVmICsgVlA4U2NhblVWW25dLCB0bXBbbl0sIHl1dl9vdXQgKyBWUDhTY2FuVVZbbl0sIDEpOworICB9CisgIHJldHVybiAobnogPDwgMTYpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUkQtb3B0IGRlY2lzaW9uLiBSZWNvbnN0cnVjdCBlYWNoIG1vZGVzLCBldmFsdWUgZGlzdG9ydGlvbiBhbmQgYml0LWNvc3QuCisvLyBQaWNrIHRoZSBtb2RlIGlzIGxvd2VyIFJELWNvc3QgPSBSYXRlICsgbGFtYmRhICogRGlzdG9ydGlvbi4KKworc3RhdGljIHZvaWQgU3RvcmVNYXhEZWx0YShWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtLCBjb25zdCBpbnQxNl90IERDc1sxNl0pIHsKKyAgLy8gV2UgbG9vayBhdCB0aGUgZmlyc3QgdGhyZWUgQUMgY29lZmZpY2llbnRzIHRvIGRldGVybWluZSB3aGF0IGlzIHRoZSBhdmVyYWdlCisgIC8vIGRlbHRhIGJldHdlZW4gZWFjaCBzdWItNHg0IGJsb2NrLgorICBjb25zdCBpbnQgdjAgPSBhYnMoRENzWzFdKTsKKyAgY29uc3QgaW50IHYxID0gYWJzKERDc1syXSk7CisgIGNvbnN0IGludCB2MiA9IGFicyhEQ3NbNF0pOworICBpbnQgbWF4X3YgPSAodjEgPiB2MCkgPyB2MSA6IHYwOworICBtYXhfdiA9ICh2MiA+IG1heF92KSA/IHYyIDogbWF4X3Y7CisgIGlmIChtYXhfdiA+IGRxbS0+bWF4X2VkZ2VfKSBkcW0tPm1heF9lZGdlXyA9IG1heF92OworfQorCitzdGF0aWMgdm9pZCBTd2FwTW9kZVNjb3JlKFZQOE1vZGVTY29yZSoqIGEsIFZQOE1vZGVTY29yZSoqIGIpIHsKKyAgVlA4TW9kZVNjb3JlKiBjb25zdCB0bXAgPSAqYTsKKyAgKmEgPSAqYjsKKyAgKmIgPSB0bXA7Cit9CisKK3N0YXRpYyB2b2lkIFN3YXBQdHIodWludDhfdCoqIGEsIHVpbnQ4X3QqKiBiKSB7CisgIHVpbnQ4X3QqIGNvbnN0IHRtcCA9ICphOworICAqYSA9ICpiOworICAqYiA9IHRtcDsKK30KKworc3RhdGljIHZvaWQgU3dhcE91dChWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpIHsKKyAgU3dhcFB0cigmaXQtPnl1dl9vdXRfLCAmaXQtPnl1dl9vdXQyXyk7Cit9CisKK3N0YXRpYyBzY29yZV90IElzRmxhdChjb25zdCBpbnQxNl90KiBsZXZlbHMsIGludCBudW1fYmxvY2tzLCBzY29yZV90IHRocmVzaCkgeworICBzY29yZV90IHNjb3JlID0gMDsKKyAgd2hpbGUgKG51bV9ibG9ja3MtLSA+IDApIHsgICAgICAvLyBUT0RPKHNrYWwpOiByZWZpbmUgcG9zaXRpb25hbCBzY29yaW5nPworICAgIGludCBpOworICAgIGZvciAoaSA9IDE7IGkgPCAxNjsgKytpKSB7ICAgIC8vIG9taXQgREMsIHdlJ3JlIG9ubHkgaW50ZXJlc3RlZCBpbiBBQworICAgICAgc2NvcmUgKz0gKGxldmVsc1tpXSAhPSAwKTsKKyAgICAgIGlmIChzY29yZSA+IHRocmVzaCkgcmV0dXJuIDA7CisgICAgfQorICAgIGxldmVscyArPSAxNjsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgUGlja0Jlc3RJbnRyYTE2KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiByZCkgeworICBjb25zdCBpbnQga051bUJsb2NrcyA9IDE2OworICBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX2kxNl87CisgIGNvbnN0IGludCB0bGFtYmRhID0gZHFtLT50bGFtYmRhXzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBZX09GRl9FTkM7CisgIFZQOE1vZGVTY29yZSByZF90bXA7CisgIFZQOE1vZGVTY29yZSogcmRfY3VyID0gJnJkX3RtcDsKKyAgVlA4TW9kZVNjb3JlKiByZF9iZXN0ID0gcmQ7CisgIGludCBtb2RlOworCisgIHJkLT5tb2RlX2kxNiA9IC0xOworICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOyAgLy8gc2NyYXRjaCBidWZmZXIKKyAgICByZF9jdXItPm1vZGVfaTE2ID0gbW9kZTsKKworICAgIC8vIFJlY29uc3RydWN0CisgICAgcmRfY3VyLT5ueiA9IFJlY29uc3RydWN0SW50cmExNihpdCwgcmRfY3VyLCB0bXBfZHN0LCBtb2RlKTsKKworICAgIC8vIE1lYXN1cmUgUkQtc2NvcmUKKyAgICByZF9jdXItPkQgPSBWUDhTU0UxNngxNihzcmMsIHRtcF9kc3QpOworICAgIHJkX2N1ci0+U0QgPQorICAgICAgICB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG8xNngxNihzcmMsIHRtcF9kc3QsIGtXZWlnaHRZKSkgOiAwOworICAgIHJkX2N1ci0+SCA9IFZQOEZpeGVkQ29zdHNJMTZbbW9kZV07CisgICAgcmRfY3VyLT5SID0gVlA4R2V0Q29zdEx1bWExNihpdCwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA+IDAgJiYKKyAgICAgICAgSXNGbGF0KHJkX2N1ci0+eV9hY19sZXZlbHNbMF0sIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX0kxNikpIHsKKyAgICAgIC8vIHBlbmFsdHkgdG8gYXZvaWQgZmxhdCBhcmVhIHRvIGJlIG1pc3ByZWRpY3RlZCBieSBjb21wbGV4IG1vZGUKKyAgICAgIHJkX2N1ci0+UiArPSBGTEFUTkVTU19QRU5BTFRZICoga051bUJsb2NrczsKKyAgICB9CisKKyAgICAvLyBTaW5jZSB3ZSBhbHdheXMgZXhhbWluZSBJbnRyYTE2IGZpcnN0LCB3ZSBjYW4gb3ZlcndyaXRlICpyZCBkaXJlY3RseS4KKyAgICBTZXRSRFNjb3JlKGxhbWJkYSwgcmRfY3VyKTsKKyAgICBpZiAobW9kZSA9PSAwIHx8IHJkX2N1ci0+c2NvcmUgPCByZF9iZXN0LT5zY29yZSkgeworICAgICAgU3dhcE1vZGVTY29yZSgmcmRfY3VyLCAmcmRfYmVzdCk7CisgICAgICBTd2FwT3V0KGl0KTsKKyAgICB9CisgIH0KKyAgaWYgKHJkX2Jlc3QgIT0gcmQpIHsKKyAgICBtZW1jcHkocmQsIHJkX2Jlc3QsIHNpemVvZigqcmQpKTsKKyAgfQorICBTZXRSRFNjb3JlKGRxbS0+bGFtYmRhX21vZGVfLCByZCk7ICAgLy8gZmluYWxpemUgc2NvcmUgZm9yIG1vZGUgZGVjaXNpb24uCisgIFZQOFNldEludHJhMTZNb2RlKGl0LCByZC0+bW9kZV9pMTYpOworCisgIC8vIHdlIGhhdmUgYSBibG9ja3kgbWFjcm9ibG9jayAob25seSBEQ3MgYXJlIG5vbi16ZXJvKSB3aXRoIGZhaXJseSBoaWdoCisgIC8vIGRpc3RvcnRpb24sIHJlY29yZCBtYXggZGVsdGEgc28gd2UgY2FuIGxhdGVyIGFkanVzdCB0aGUgbWluaW1hbCBmaWx0ZXJpbmcKKyAgLy8gc3RyZW5ndGggbmVlZGVkIHRvIHNtb290aCB0aGVzZSBibG9ja3Mgb3V0LgorICBpZiAoKHJkLT5ueiAmIDB4MTAwZmZmZikgPT0gMHgxMDAwMDAwICYmIHJkLT5EID4gZHFtLT5taW5fZGlzdG9fKSB7CisgICAgU3RvcmVNYXhEZWx0YShkcW0sIHJkLT55X2RjX2xldmVscyk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gcmV0dXJuIHRoZSBjb3N0IGFycmF5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cnJvdW5kaW5nIHByZWRpY3Rpb24gbW9kZXMuCitzdGF0aWMgY29uc3QgdWludDE2X3QqIEdldENvc3RNb2RlSTQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgbW9kZXNbMTZdKSB7CisgIGNvbnN0IGludCBwcmVkc193ID0gaXQtPmVuY18tPnByZWRzX3dfOworICBjb25zdCBpbnQgeCA9IChpdC0+aTRfICYgMyksIHkgPSBpdC0+aTRfID4+IDI7CisgIGNvbnN0IGludCBsZWZ0ID0gKHggPT0gMCkgPyBpdC0+cHJlZHNfW3kgKiBwcmVkc193IC0gMV0gOiBtb2Rlc1tpdC0+aTRfIC0gMV07CisgIGNvbnN0IGludCB0b3AgPSAoeSA9PSAwKSA/IGl0LT5wcmVkc19bLXByZWRzX3cgKyB4XSA6IG1vZGVzW2l0LT5pNF8gLSA0XTsKKyAgcmV0dXJuIFZQOEZpeGVkQ29zdHNJNFt0b3BdW2xlZnRdOworfQorCitzdGF0aWMgaW50IFBpY2tCZXN0SW50cmE0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgVlA4U2VnbWVudEluZm8qIGNvbnN0IGRxbSA9ICZlbmMtPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICBjb25zdCBpbnQgbGFtYmRhID0gZHFtLT5sYW1iZGFfaTRfOworICBjb25zdCBpbnQgdGxhbWJkYSA9IGRxbS0+dGxhbWJkYV87CisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYzAgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgdWludDhfdCogY29uc3QgYmVzdF9ibG9ja3MgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DOworICBpbnQgdG90YWxfaGVhZGVyX2JpdHMgPSAwOworICBWUDhNb2RlU2NvcmUgcmRfYmVzdDsKKworICBpZiAoZW5jLT5tYXhfaTRfaGVhZGVyX2JpdHNfID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIEluaXRTY29yZSgmcmRfYmVzdCk7CisgIHJkX2Jlc3QuSCA9IDIxMTsgIC8vICcyMTEnIGlzIHRoZSB2YWx1ZSBvZiBWUDhCaXRDb3N0KDAsIDE0NSkKKyAgU2V0UkRTY29yZShkcW0tPmxhbWJkYV9tb2RlXywgJnJkX2Jlc3QpOworICBWUDhJdGVyYXRvclN0YXJ0STQoaXQpOworICBkbyB7CisgICAgY29uc3QgaW50IGtOdW1CbG9ja3MgPSAxOworICAgIFZQOE1vZGVTY29yZSByZF9pNDsKKyAgICBpbnQgbW9kZTsKKyAgICBpbnQgYmVzdF9tb2RlID0gLTE7CisgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gc3JjMCArIFZQOFNjYW5baXQtPmk0X107CisgICAgY29uc3QgdWludDE2X3QqIGNvbnN0IG1vZGVfY29zdHMgPSBHZXRDb3N0TW9kZUk0KGl0LCByZC0+bW9kZXNfaTQpOworICAgIHVpbnQ4X3QqIGJlc3RfYmxvY2sgPSBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X107CisgICAgdWludDhfdCogdG1wX2RzdCA9IGl0LT55dXZfcF8gKyBJNFRNUDsgICAgLy8gc2NyYXRjaCBidWZmZXIuCisKKyAgICBJbml0U2NvcmUoJnJkX2k0KTsKKyAgICBWUDhNYWtlSW50cmE0UHJlZHMoaXQpOworICAgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fQk1PREVTOyArK21vZGUpIHsKKyAgICAgIFZQOE1vZGVTY29yZSByZF90bXA7CisgICAgICBpbnQxNl90IHRtcF9sZXZlbHNbMTZdOworCisgICAgICAvLyBSZWNvbnN0cnVjdAorICAgICAgcmRfdG1wLm56ID0KKyAgICAgICAgICBSZWNvbnN0cnVjdEludHJhNChpdCwgdG1wX2xldmVscywgc3JjLCB0bXBfZHN0LCBtb2RlKSA8PCBpdC0+aTRfOworCisgICAgICAvLyBDb21wdXRlIFJELXNjb3JlCisgICAgICByZF90bXAuRCA9IFZQOFNTRTR4NChzcmMsIHRtcF9kc3QpOworICAgICAgcmRfdG1wLlNEID0KKyAgICAgICAgICB0bGFtYmRhID8gTVVMVF84Qih0bGFtYmRhLCBWUDhURGlzdG80eDQoc3JjLCB0bXBfZHN0LCBrV2VpZ2h0WSkpCisgICAgICAgICAgICAgICAgICA6IDA7CisgICAgICByZF90bXAuSCA9IG1vZGVfY29zdHNbbW9kZV07CisKKyAgICAgIC8vIEFkZCBmbGF0bmVzcyBwZW5hbHR5CisgICAgICBpZiAobW9kZSA+IDAgJiYgSXNGbGF0KHRtcF9sZXZlbHMsIGtOdW1CbG9ja3MsIEZMQVRORVNTX0xJTUlUX0k0KSkgeworICAgICAgICByZF90bXAuUiA9IEZMQVRORVNTX1BFTkFMVFkgKiBrTnVtQmxvY2tzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmRfdG1wLlIgPSAwOworICAgICAgfQorCisgICAgICAvLyBlYXJseS1vdXQgY2hlY2sKKyAgICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdG1wKTsKKyAgICAgIGlmIChiZXN0X21vZGUgPj0gMCAmJiByZF90bXAuc2NvcmUgPj0gcmRfaTQuc2NvcmUpIGNvbnRpbnVlOworCisgICAgICAvLyBmaW5pc2ggY29tcHV0aW5nIHNjb3JlCisgICAgICByZF90bXAuUiArPSBWUDhHZXRDb3N0THVtYTQoaXQsIHRtcF9sZXZlbHMpOworICAgICAgU2V0UkRTY29yZShsYW1iZGEsICZyZF90bXApOworCisgICAgICBpZiAoYmVzdF9tb2RlIDwgMCB8fCByZF90bXAuc2NvcmUgPCByZF9pNC5zY29yZSkgeworICAgICAgICBDb3B5U2NvcmUoJnJkX2k0LCAmcmRfdG1wKTsKKyAgICAgICAgYmVzdF9tb2RlID0gbW9kZTsKKyAgICAgICAgU3dhcFB0cigmdG1wX2RzdCwgJmJlc3RfYmxvY2spOworICAgICAgICBtZW1jcHkocmRfYmVzdC55X2FjX2xldmVsc1tpdC0+aTRfXSwgdG1wX2xldmVscywKKyAgICAgICAgICAgICAgIHNpemVvZihyZF9iZXN0LnlfYWNfbGV2ZWxzW2l0LT5pNF9dKSk7CisgICAgICB9CisgICAgfQorICAgIFNldFJEU2NvcmUoZHFtLT5sYW1iZGFfbW9kZV8sICZyZF9pNCk7CisgICAgQWRkU2NvcmUoJnJkX2Jlc3QsICZyZF9pNCk7CisgICAgaWYgKHJkX2Jlc3Quc2NvcmUgPj0gcmQtPnNjb3JlKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdG90YWxfaGVhZGVyX2JpdHMgKz0gKGludClyZF9pNC5IOyAgIC8vIDwtIGVxdWFsIHRvIG1vZGVfY29zdHNbYmVzdF9tb2RlXTsKKyAgICBpZiAodG90YWxfaGVhZGVyX2JpdHMgPiBlbmMtPm1heF9pNF9oZWFkZXJfYml0c18pIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBDb3B5IHNlbGVjdGVkIHNhbXBsZXMgaWYgbm90IGluIHRoZSByaWdodCBwbGFjZSBhbHJlYWR5LgorICAgIGlmIChiZXN0X2Jsb2NrICE9IGJlc3RfYmxvY2tzICsgVlA4U2NhbltpdC0+aTRfXSkgeworICAgICAgVlA4Q29weTR4NChiZXN0X2Jsb2NrLCBiZXN0X2Jsb2NrcyArIFZQOFNjYW5baXQtPmk0X10pOworICAgIH0KKyAgICByZC0+bW9kZXNfaTRbaXQtPmk0X10gPSBiZXN0X21vZGU7CisgICAgaXQtPnRvcF9uel9baXQtPmk0XyAmIDNdID0gaXQtPmxlZnRfbnpfW2l0LT5pNF8gPj4gMl0gPSAocmRfaTQubnogPyAxIDogMCk7CisgIH0gd2hpbGUgKFZQOEl0ZXJhdG9yUm90YXRlSTQoaXQsIGJlc3RfYmxvY2tzKSk7CisKKyAgLy8gZmluYWxpemUgc3RhdGUKKyAgQ29weVNjb3JlKHJkLCAmcmRfYmVzdCk7CisgIFZQOFNldEludHJhNE1vZGUoaXQsIHJkLT5tb2Rlc19pNCk7CisgIFN3YXBPdXQoaXQpOworICBtZW1jcHkocmQtPnlfYWNfbGV2ZWxzLCByZF9iZXN0LnlfYWNfbGV2ZWxzLCBzaXplb2YocmQtPnlfYWNfbGV2ZWxzKSk7CisgIHJldHVybiAxOyAgIC8vIHNlbGVjdCBpbnRyYTR4NCBvdmVyIGludHJhMTZ4MTYKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQgUGlja0Jlc3RVVihWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgY29uc3QgaW50IGtOdW1CbG9ja3MgPSA4OworICBjb25zdCBWUDhTZWdtZW50SW5mbyogY29uc3QgZHFtID0gJml0LT5lbmNfLT5kcW1fW2l0LT5tYl8tPnNlZ21lbnRfXTsKKyAgY29uc3QgaW50IGxhbWJkYSA9IGRxbS0+bGFtYmRhX3V2XzsKKyAgY29uc3QgdWludDhfdCogY29uc3Qgc3JjID0gaXQtPnl1dl9pbl8gKyBVX09GRl9FTkM7CisgIHVpbnQ4X3QqIHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgVV9PRkZfRU5DOyAgLy8gc2NyYXRjaCBidWZmZXIKKyAgdWludDhfdCogZHN0MCA9IGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQzsKKyAgdWludDhfdCogZHN0ID0gZHN0MDsKKyAgVlA4TW9kZVNjb3JlIHJkX2Jlc3Q7CisgIGludCBtb2RlOworCisgIHJkLT5tb2RlX3V2ID0gLTE7CisgIEluaXRTY29yZSgmcmRfYmVzdCk7CisgIGZvciAobW9kZSA9IDA7IG1vZGUgPCBOVU1fUFJFRF9NT0RFUzsgKyttb2RlKSB7CisgICAgVlA4TW9kZVNjb3JlIHJkX3V2OworCisgICAgLy8gUmVjb25zdHJ1Y3QKKyAgICByZF91di5ueiA9IFJlY29uc3RydWN0VVYoaXQsICZyZF91diwgdG1wX2RzdCwgbW9kZSk7CisKKyAgICAvLyBDb21wdXRlIFJELXNjb3JlCisgICAgcmRfdXYuRCAgPSBWUDhTU0UxNng4KHNyYywgdG1wX2RzdCk7CisgICAgcmRfdXYuU0QgPSAwOyAgICAvLyBub3QgY2FsbGluZyBURGlzdG8gaGVyZTogaXQgdGVuZHMgdG8gZmxhdHRlbiBhcmVhcy4KKyAgICByZF91di5IICA9IFZQOEZpeGVkQ29zdHNVVlttb2RlXTsKKyAgICByZF91di5SICA9IFZQOEdldENvc3RVVihpdCwgJnJkX3V2KTsKKyAgICBpZiAobW9kZSA+IDAgJiYgSXNGbGF0KHJkX3V2LnV2X2xldmVsc1swXSwga051bUJsb2NrcywgRkxBVE5FU1NfTElNSVRfVVYpKSB7CisgICAgICByZF91di5SICs9IEZMQVRORVNTX1BFTkFMVFkgKiBrTnVtQmxvY2tzOworICAgIH0KKworICAgIFNldFJEU2NvcmUobGFtYmRhLCAmcmRfdXYpOworICAgIGlmIChtb2RlID09IDAgfHwgcmRfdXYuc2NvcmUgPCByZF9iZXN0LnNjb3JlKSB7CisgICAgICBDb3B5U2NvcmUoJnJkX2Jlc3QsICZyZF91dik7CisgICAgICByZC0+bW9kZV91diA9IG1vZGU7CisgICAgICBtZW1jcHkocmQtPnV2X2xldmVscywgcmRfdXYudXZfbGV2ZWxzLCBzaXplb2YocmQtPnV2X2xldmVscykpOworICAgICAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgeworICAgICAgICBtZW1jcHkocmQtPmRlcnIsIHJkX3V2LmRlcnIsIHNpemVvZihyZF91di5kZXJyKSk7CisgICAgICB9CisgICAgICBTd2FwUHRyKCZkc3QsICZ0bXBfZHN0KTsKKyAgICB9CisgIH0KKyAgVlA4U2V0SW50cmFVVk1vZGUoaXQsIHJkLT5tb2RlX3V2KTsKKyAgQWRkU2NvcmUocmQsICZyZF9iZXN0KTsKKyAgaWYgKGRzdCAhPSBkc3QwKSB7ICAgLy8gY29weSAxNng4IGJsb2NrIGlmIG5lZWRlZAorICAgIFZQOENvcHkxNng4KGRzdCwgZHN0MCk7CisgIH0KKyAgaWYgKGl0LT50b3BfZGVycl8gIT0gTlVMTCkgeyAgLy8gc3RvcmUgZGlmZnVzaW9uIGVycm9ycyBmb3IgbmV4dCBibG9jaworICAgIFN0b3JlRGlmZnVzaW9uRXJyb3JzKGl0LCByZCk7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZpbmFsIHJlY29uc3RydWN0aW9uIGFuZCBxdWFudGl6YXRpb24uCisKK3N0YXRpYyB2b2lkIFNpbXBsZVF1YW50aXplKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCkgeworICBjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMgPSBpdC0+ZW5jXzsKKyAgY29uc3QgaW50IGlzX2kxNiA9IChpdC0+bWJfLT50eXBlXyA9PSAxKTsKKyAgaW50IG56ID0gMDsKKworICBpZiAoaXNfaTE2KSB7CisgICAgbnogPSBSZWNvbnN0cnVjdEludHJhMTYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMsIGl0LT5wcmVkc19bMF0pOworICB9IGVsc2UgeworICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7CisgICAgZG8geworICAgICAgY29uc3QgaW50IG1vZGUgPQorICAgICAgICAgIGl0LT5wcmVkc19bKGl0LT5pNF8gJiAzKSArIChpdC0+aTRfID4+IDIpICogZW5jLT5wcmVkc193X107CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICB1aW50OF90KiBjb25zdCBkc3QgPSBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMgKyBWUDhTY2FuW2l0LT5pNF9dOworICAgICAgVlA4TWFrZUludHJhNFByZWRzKGl0KTsKKyAgICAgIG56IHw9IFJlY29uc3RydWN0SW50cmE0KGl0LCByZC0+eV9hY19sZXZlbHNbaXQtPmk0X10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbW9kZSkgPDwgaXQtPmk0XzsKKyAgICB9IHdoaWxlIChWUDhJdGVyYXRvclJvdGF0ZUk0KGl0LCBpdC0+eXV2X291dF8gKyBZX09GRl9FTkMpKTsKKyAgfQorCisgIG56IHw9IFJlY29uc3RydWN0VVYoaXQsIHJkLCBpdC0+eXV2X291dF8gKyBVX09GRl9FTkMsIGl0LT5tYl8tPnV2X21vZGVfKTsKKyAgcmQtPm56ID0gbno7Cit9CisKKy8vIFJlZmluZSBpbnRyYTE2L2ludHJhNCBzdWItbW9kZXMgYmFzZWQgb24gZGlzdG9ydGlvbiBvbmx5IChub3QgcmF0ZSkuCitzdGF0aWMgdm9pZCBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0cnlfYm90aF9tb2RlcywgaW50IHJlZmluZV91dl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOE1vZGVTY29yZSogY29uc3QgcmQpIHsKKyAgc2NvcmVfdCBiZXN0X3Njb3JlID0gTUFYX0NPU1Q7CisgIGludCBueiA9IDA7CisgIGludCBtb2RlOworICBpbnQgaXNfaTE2ID0gdHJ5X2JvdGhfbW9kZXMgfHwgKGl0LT5tYl8tPnR5cGVfID09IDEpOworCisgIGNvbnN0IFZQOFNlZ21lbnRJbmZvKiBjb25zdCBkcW0gPSAmaXQtPmVuY18tPmRxbV9baXQtPm1iXy0+c2VnbWVudF9dOworICAvLyBTb21lIGVtcGlyaWMgY29uc3RhbnRzLCBvZiBhcHByb3hpbWF0ZSBvcmRlciBvZiBtYWduaXR1ZGUuCisgIGNvbnN0IGludCBsYW1iZGFfZF9pMTYgPSAxMDY7CisgIGNvbnN0IGludCBsYW1iZGFfZF9pNCA9IDExOworICBjb25zdCBpbnQgbGFtYmRhX2RfdXYgPSAxMjA7CisgIHNjb3JlX3Qgc2NvcmVfaTQgPSBkcW0tPmk0X3BlbmFsdHlfOworICBzY29yZV90IGk0X2JpdF9zdW0gPSAwOworICBjb25zdCBzY29yZV90IGJpdF9saW1pdCA9IHRyeV9ib3RoX21vZGVzID8gaXQtPmVuY18tPm1iX2hlYWRlcl9saW1pdF8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1BWF9DT1NUOyAgLy8gbm8gZWFybHktb3V0IGFsbG93ZWQKKworICBpZiAoaXNfaTE2KSB7ICAgLy8gRmlyc3QsIGV2YWx1YXRlIEludHJhMTYgZGlzdG9ydGlvbgorICAgIGludCBiZXN0X21vZGUgPSAtMTsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQzsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOEkxNk1vZGVPZmZzZXRzW21vZGVdOworICAgICAgY29uc3Qgc2NvcmVfdCBzY29yZSA9IChzY29yZV90KVZQOFNTRTE2eDE2KHNyYywgcmVmKSAqIFJEX0RJU1RPX01VTFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWUDhGaXhlZENvc3RzSTE2W21vZGVdICogbGFtYmRhX2RfaTE2OworICAgICAgaWYgKG1vZGUgPiAwICYmIFZQOEZpeGVkQ29zdHNJMTZbbW9kZV0gPiBiaXRfbGltaXQpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc2NvcmUgPCBiZXN0X3Njb3JlKSB7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIGJlc3Rfc2NvcmUgPSBzY29yZTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U2V0SW50cmExNk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgICAgLy8gd2UnbGwgcmVjb25zdHJ1Y3QgbGF0ZXIsIGlmIGkxNiBtb2RlIGFjdHVhbGx5IGdldHMgc2VsZWN0ZWQKKyAgfQorCisgIC8vIE5leHQsIGV2YWx1YXRlIEludHJhNAorICBpZiAodHJ5X2JvdGhfbW9kZXMgfHwgIWlzX2kxNikgeworICAgIC8vIFdlIGRvbid0IGV2YWx1YXRlIHRoZSByYXRlIGhlcmUsIGJ1dCBqdXN0IGFjY291bnQgZm9yIGl0IHRocm91Z2ggYQorICAgIC8vIGNvbnN0YW50IHBlbmFsdHkgKGk0IG1vZGUgdXN1YWxseSBuZWVkcyBtb3JlIGJpdHMgY29tcGFyZWQgdG8gaTE2KS4KKyAgICBpc19pMTYgPSAwOworICAgIFZQOEl0ZXJhdG9yU3RhcnRJNChpdCk7CisgICAgZG8geworICAgICAgaW50IGJlc3RfaTRfbW9kZSA9IC0xOworICAgICAgc2NvcmVfdCBiZXN0X2k0X3Njb3JlID0gTUFYX0NPU1Q7CisgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFlfT0ZGX0VOQyArIFZQOFNjYW5baXQtPmk0X107CisgICAgICBjb25zdCB1aW50MTZfdCogY29uc3QgbW9kZV9jb3N0cyA9IEdldENvc3RNb2RlSTQoaXQsIHJkLT5tb2Rlc19pNCk7CisKKyAgICAgIFZQOE1ha2VJbnRyYTRQcmVkcyhpdCk7CisgICAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX0JNT0RFUzsgKyttb2RlKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHJlZiA9IGl0LT55dXZfcF8gKyBWUDhJNE1vZGVPZmZzZXRzW21vZGVdOworICAgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFNHg0KHNyYywgcmVmKSAqIFJEX0RJU1RPX01VTFQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1vZGVfY29zdHNbbW9kZV0gKiBsYW1iZGFfZF9pNDsKKyAgICAgICAgaWYgKHNjb3JlIDwgYmVzdF9pNF9zY29yZSkgeworICAgICAgICAgIGJlc3RfaTRfbW9kZSA9IG1vZGU7CisgICAgICAgICAgYmVzdF9pNF9zY29yZSA9IHNjb3JlOworICAgICAgICB9CisgICAgICB9CisgICAgICBpNF9iaXRfc3VtICs9IG1vZGVfY29zdHNbYmVzdF9pNF9tb2RlXTsKKyAgICAgIHJkLT5tb2Rlc19pNFtpdC0+aTRfXSA9IGJlc3RfaTRfbW9kZTsKKyAgICAgIHNjb3JlX2k0ICs9IGJlc3RfaTRfc2NvcmU7CisgICAgICBpZiAoc2NvcmVfaTQgPj0gYmVzdF9zY29yZSB8fCBpNF9iaXRfc3VtID4gYml0X2xpbWl0KSB7CisgICAgICAgIC8vIEludHJhNCB3b24ndCBiZSBiZXR0ZXIgdGhhbiBJbnRyYTE2LiBCYWlsIG91dCBhbmQgcGljayBJbnRyYTE2LgorICAgICAgICBpc19pMTYgPSAxOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7ICAvLyByZWNvbnN0cnVjdCBwYXJ0aWFsIGJsb2NrIGluc2lkZSB5dXZfb3V0Ml8gYnVmZmVyCisgICAgICAgIHVpbnQ4X3QqIGNvbnN0IHRtcF9kc3QgPSBpdC0+eXV2X291dDJfICsgWV9PRkZfRU5DICsgVlA4U2NhbltpdC0+aTRfXTsKKyAgICAgICAgbnogfD0gUmVjb25zdHJ1Y3RJbnRyYTQoaXQsIHJkLT55X2FjX2xldmVsc1tpdC0+aTRfXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCB0bXBfZHN0LCBiZXN0X2k0X21vZGUpIDw8IGl0LT5pNF87CisgICAgICB9CisgICAgfSB3aGlsZSAoVlA4SXRlcmF0b3JSb3RhdGVJNChpdCwgaXQtPnl1dl9vdXQyXyArIFlfT0ZGX0VOQykpOworICB9CisKKyAgLy8gRmluYWwgcmVjb25zdHJ1Y3Rpb24sIGRlcGVuZGluZyBvbiB3aGljaCBtb2RlIGlzIHNlbGVjdGVkLgorICBpZiAoIWlzX2kxNikgeworICAgIFZQOFNldEludHJhNE1vZGUoaXQsIHJkLT5tb2Rlc19pNCk7CisgICAgU3dhcE91dChpdCk7CisgICAgYmVzdF9zY29yZSA9IHNjb3JlX2k0OworICB9IGVsc2UgeworICAgIG56ID0gUmVjb25zdHJ1Y3RJbnRyYTE2KGl0LCByZCwgaXQtPnl1dl9vdXRfICsgWV9PRkZfRU5DLCBpdC0+cHJlZHNfWzBdKTsKKyAgfQorCisgIC8vIC4uLiBhbmQgVVYhCisgIGlmIChyZWZpbmVfdXZfbW9kZSkgeworICAgIGludCBiZXN0X21vZGUgPSAtMTsKKyAgICBzY29yZV90IGJlc3RfdXZfc2NvcmUgPSBNQVhfQ09TVDsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMgPSBpdC0+eXV2X2luXyArIFVfT0ZGX0VOQzsKKyAgICBmb3IgKG1vZGUgPSAwOyBtb2RlIDwgTlVNX1BSRURfTU9ERVM7ICsrbW9kZSkgeworICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcmVmID0gaXQtPnl1dl9wXyArIFZQOFVWTW9kZU9mZnNldHNbbW9kZV07CisgICAgICBjb25zdCBzY29yZV90IHNjb3JlID0gVlA4U1NFMTZ4OChzcmMsIHJlZikgKiBSRF9ESVNUT19NVUxUCisgICAgICAgICAgICAgICAgICAgICAgICAgICsgVlA4Rml4ZWRDb3N0c1VWW21vZGVdICogbGFtYmRhX2RfdXY7CisgICAgICBpZiAoc2NvcmUgPCBiZXN0X3V2X3Njb3JlKSB7CisgICAgICAgIGJlc3RfbW9kZSA9IG1vZGU7CisgICAgICAgIGJlc3RfdXZfc2NvcmUgPSBzY29yZTsKKyAgICAgIH0KKyAgICB9CisgICAgVlA4U2V0SW50cmFVVk1vZGUoaXQsIGJlc3RfbW9kZSk7CisgIH0KKyAgbnogfD0gUmVjb25zdHJ1Y3RVVihpdCwgcmQsIGl0LT55dXZfb3V0XyArIFVfT0ZGX0VOQywgaXQtPm1iXy0+dXZfbW9kZV8pOworCisgIHJkLT5ueiA9IG56OworICByZC0+c2NvcmUgPSBiZXN0X3Njb3JlOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cnkgcG9pbnQKKworaW50IFZQOERlY2ltYXRlKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgVlA4TW9kZVNjb3JlKiBjb25zdCByZCwKKyAgICAgICAgICAgICAgICBWUDhSRExldmVsIHJkX29wdCkgeworICBpbnQgaXNfc2tpcHBlZDsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGl0LT5lbmNfLT5tZXRob2RfOworCisgIEluaXRTY29yZShyZCk7CisKKyAgLy8gV2UgY2FuIHBlcmZvcm0gcHJlZGljdGlvbnMgZm9yIEx1bWExNngxNiBhbmQgQ2hyb21hOHg4IGFscmVhZHkuCisgIC8vIEx1bWE0eDQgcHJlZGljdGlvbnMgbmVlZHMgdG8gYmUgZG9uZSBhcy13ZS1nby4KKyAgVlA4TWFrZUx1bWExNlByZWRzKGl0KTsKKyAgVlA4TWFrZUNocm9tYThQcmVkcyhpdCk7CisKKyAgaWYgKHJkX29wdCA+IFJEX09QVF9OT05FKSB7CisgICAgaXQtPmRvX3RyZWxsaXNfID0gKHJkX29wdCA+PSBSRF9PUFRfVFJFTExJU19BTEwpOworICAgIFBpY2tCZXN0SW50cmExNihpdCwgcmQpOworICAgIGlmIChtZXRob2QgPj0gMikgeworICAgICAgUGlja0Jlc3RJbnRyYTQoaXQsIHJkKTsKKyAgICB9CisgICAgUGlja0Jlc3RVVihpdCwgcmQpOworICAgIGlmIChyZF9vcHQgPT0gUkRfT1BUX1RSRUxMSVMpIHsgICAvLyBmaW5pc2ggb2ZmIHdpdGggdHJlbGxpcy1vcHRpbSBub3cKKyAgICAgIGl0LT5kb190cmVsbGlzXyA9IDE7CisgICAgICBTaW1wbGVRdWFudGl6ZShpdCwgcmQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgaGV1cmlzdGljYWxseSBkZWNpZGVkIGludHJhMTYgLyBpbnRyYTQuCisgICAgLy8gRm9yIG1ldGhvZCA+PSAyLCBwaWNrIHRoZSBiZXN0IGludHJhNC9pbnRyYTE2IGJhc2VkIG9uIFNTRSAofnRhZCBzbG93ZXIpLgorICAgIC8vIEZvciBtZXRob2QgPD0gMSwgd2UgZG9uJ3QgcmUtZXhhbWluZSB0aGUgZGVjaXNpb24gYnV0IGp1c3QgZ28gYWhlYWQgd2l0aAorICAgIC8vIHF1YW50aXphdGlvbi9yZWNvbnN0cnVjdGlvbi4KKyAgICBSZWZpbmVVc2luZ0Rpc3RvcnRpb24oaXQsIChtZXRob2QgPj0gMiksIChtZXRob2QgPj0gMSksIHJkKTsKKyAgfQorICBpc19za2lwcGVkID0gKHJkLT5ueiA9PSAwKTsKKyAgVlA4U2V0U2tpcChpdCwgaXNfc2tpcHBlZCk7CisgIHJldHVybiBpc19za2lwcGVkOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3N5bnRheC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9zeW50YXhfZW5jLmMKc2ltaWxhcml0eSBpbmRleCA3NiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3N5bnRheC5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3N5bnRheF9lbmMuYwppbmRleCBhNGU5NGU1Li5hOWU1YTZjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvc3ludGF4LmMKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy9zeW50YXhfZW5jLmMKQEAgLTExLDIwICsxMSwxMiBAQAogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQogI2luY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCiAKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgotI2luY2x1ZGUgIi4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIiAgLy8gUklGRiBjb25zdGFudHMKLSNpbmNsdWRlICIuLi93ZWJwL211eF90eXBlcy5oIiAgICAgICAgIC8vIEFMUEhBX0ZMQUcKLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIiAgLy8gUklGRiBjb25zdGFudHMKKyNpbmNsdWRlICJzcmMvd2VicC9tdXhfdHlwZXMuaCIgICAgICAgICAvLyBBTFBIQV9GTEFHCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSGVscGVyIGZ1bmN0aW9ucwpAQCAtNDgsNyArNDAsNyBAQAogICB1aW50OF90IHJpZmZbUklGRl9IRUFERVJfU0laRV0gPSB7CiAgICAgJ1InLCAnSScsICdGJywgJ0YnLCAwLCAwLCAwLCAwLCAnVycsICdFJywgJ0InLCAnUCcKICAgfTsKLSAgU0JfRENIRUNLKHJpZmZfc2l6ZSA9PSAodWludDMyX3QpcmlmZl9zaXplKTsKKyAgYXNzZXJ0KHJpZmZfc2l6ZSA9PSAodWludDMyX3QpcmlmZl9zaXplKTsKICAgUHV0TEUzMihyaWZmICsgVEFHX1NJWkUsICh1aW50MzJfdClyaWZmX3NpemUpOwogICBpZiAoIXBpYy0+d3JpdGVyKHJpZmYsIHNpemVvZihyaWZmKSwgcGljKSkgewogICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKQEAgLTYzLDkgKzU1LDkgQEAKICAgfTsKICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCi0gIFNCX0RDSEVDSyhJc1ZQOFhOZWVkZWQoZW5jKSk7Ci0gIFNCX0RDSEVDSyhwaWMtPndpZHRoID49IDEgJiYgcGljLT5oZWlnaHQgPj0gMSk7Ci0gIFNCX0RDSEVDSyhwaWMtPndpZHRoIDw9IE1BWF9DQU5WQVNfU0laRSAmJiBwaWMtPmhlaWdodCA8PSBNQVhfQ0FOVkFTX1NJWkUpOworICBhc3NlcnQoSXNWUDhYTmVlZGVkKGVuYykpOworICBhc3NlcnQocGljLT53aWR0aCA+PSAxICYmIHBpYy0+aGVpZ2h0ID49IDEpOworICBhc3NlcnQocGljLT53aWR0aCA8PSBNQVhfQ0FOVkFTX1NJWkUgJiYgcGljLT5oZWlnaHQgPD0gTUFYX0NBTlZBU19TSVpFKTsKIAogICBpZiAoZW5jLT5oYXNfYWxwaGFfKSB7CiAgICAgZmxhZ3MgfD0gQUxQSEFfRkxBRzsKQEAgLTg3LDcgKzc5LDcgQEAKICAgICAnQScsICdMJywgJ1AnLCAnSCcKICAgfTsKIAotICBTQl9EQ0hFQ0soZW5jLT5oYXNfYWxwaGFfKTsKKyAgYXNzZXJ0KGVuYy0+aGFzX2FscGhhXyk7CiAKICAgLy8gQWxwaGEgY2h1bmsgaGVhZGVyLgogICBQdXRMRTMyKGFscGhhX2NodW5rX2hkciArIFRBR19TSVpFLCBlbmMtPmFscGhhX2RhdGFfc2l6ZV8pOwpAQCAtMTEyLDcgKzEwNCw3IEBACiAgIHVpbnQ4X3QgdnA4X2NodW5rX2hkcltDSFVOS19IRUFERVJfU0laRV0gPSB7CiAgICAgJ1YnLCAnUCcsICc4JywgJyAnCiAgIH07Ci0gIFNCX0RDSEVDSyh2cDhfc2l6ZSA9PSAodWludDMyX3QpdnA4X3NpemUpOworICBhc3NlcnQodnA4X3NpemUgPT0gKHVpbnQzMl90KXZwOF9zaXplKTsKICAgUHV0TEUzMih2cDhfY2h1bmtfaGRyICsgVEFHX1NJWkUsICh1aW50MzJfdCl2cDhfc2l6ZSk7CiAgIGlmICghcGljLT53cml0ZXIodnA4X2NodW5rX2hkciwgc2l6ZW9mKHZwOF9jaHVua19oZHIpLCBwaWMpKSB7CiAgICAgcmV0dXJuIFZQOF9FTkNfRVJST1JfQkFEX1dSSVRFOwpAQCAtMTk0LDggKzE4Niw4IEBACiAvLyBTZWdtZW50YXRpb24gaGVhZGVyCiBzdGF0aWMgdm9pZCBQdXRTZWdtZW50SGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBjb25zdCBWUDhTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5zZWdtZW50X2hkcl87Ci0gIGNvbnN0IFZQOFByb2JhKiBjb25zdCBwcm9iYSA9ICZlbmMtPnByb2JhXzsKKyAgY29uc3QgVlA4RW5jU2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+c2VnbWVudF9oZHJfOworICBjb25zdCBWUDhFbmNQcm9iYSogY29uc3QgcHJvYmEgPSAmZW5jLT5wcm9iYV87CiAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCAoaGRyLT5udW1fc2VnbWVudHNfID4gMSkpKSB7CiAgICAgLy8gV2UgYWx3YXlzICd1cGRhdGUnIHRoZSBxdWFudCBhbmQgZmlsdGVyIHN0cmVuZ3RoIHZhbHVlcwogICAgIGNvbnN0IGludCB1cGRhdGVfZGF0YSA9IDE7CkBAIC0yMDUsMTYgKzE5NywxNiBAQAogICAgICAgLy8gd2UgYWx3YXlzIHVzZSBhYnNvbHV0ZSB2YWx1ZXMsIG5vdCByZWxhdGl2ZSBvbmVzCiAgICAgICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAxKTsgICAvLyAoc2VnbWVudF9mZWF0dXJlX21vZGUgPSAxLiBQYXJhZ3JhcGggOS4zLikKICAgICAgIGZvciAocyA9IDA7IHMgPCBOVU1fTUJfU0VHTUVOVFM7ICsrcykgewotICAgICAgICBWUDhQdXRTaWduZWRWYWx1ZShidywgZW5jLT5kcW1fW3NdLnF1YW50XywgNyk7CisgICAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFtX1tzXS5xdWFudF8sIDcpOwogICAgICAgfQogICAgICAgZm9yIChzID0gMDsgcyA8IE5VTV9NQl9TRUdNRU5UUzsgKytzKSB7Ci0gICAgICAgIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxbV9bc10uZnN0cmVuZ3RoXywgNik7CisgICAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFtX1tzXS5mc3RyZW5ndGhfLCA2KTsKICAgICAgIH0KICAgICB9CiAgICAgaWYgKGhkci0+dXBkYXRlX21hcF8pIHsKICAgICAgIGZvciAocyA9IDA7IHMgPCAzOyArK3MpIHsKICAgICAgICAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIChwcm9iYS0+c2VnbWVudHNfW3NdICE9IDI1NXUpKSkgewotICAgICAgICAgIFZQOFB1dFZhbHVlKGJ3LCBwcm9iYS0+c2VnbWVudHNfW3NdLCA4KTsKKyAgICAgICAgICBWUDhQdXRCaXRzKGJ3LCBwcm9iYS0+c2VnbWVudHNfW3NdLCA4KTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTIyMywyMCArMjE1LDIwIEBACiAKIC8vIEZpbHRlcmluZyBwYXJhbWV0ZXJzIGhlYWRlcgogc3RhdGljIHZvaWQgUHV0RmlsdGVySGVhZGVyKFZQOEJpdFdyaXRlciogY29uc3QgYncsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVlA4RmlsdGVySGVhZGVyKiBjb25zdCBoZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWUDhFbmNGaWx0ZXJIZWFkZXIqIGNvbnN0IGhkcikgewogICBjb25zdCBpbnQgdXNlX2xmX2RlbHRhID0gKGhkci0+aTR4NF9sZl9kZWx0YV8gIT0gMCk7CiAgIFZQOFB1dEJpdFVuaWZvcm0oYncsIGhkci0+c2ltcGxlXyk7Ci0gIFZQOFB1dFZhbHVlKGJ3LCBoZHItPmxldmVsXywgNik7Ci0gIFZQOFB1dFZhbHVlKGJ3LCBoZHItPnNoYXJwbmVzc18sIDMpOworICBWUDhQdXRCaXRzKGJ3LCBoZHItPmxldmVsXywgNik7CisgIFZQOFB1dEJpdHMoYncsIGhkci0+c2hhcnBuZXNzXywgMyk7CiAgIGlmIChWUDhQdXRCaXRVbmlmb3JtKGJ3LCB1c2VfbGZfZGVsdGEpKSB7CiAgICAgLy8gJzAnIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBpNHg0X2xmX2RlbHRhXyBhdCBmcmFtZSAjMC4KICAgICBjb25zdCBpbnQgbmVlZF91cGRhdGUgPSAoaGRyLT5pNHg0X2xmX2RlbHRhXyAhPSAwKTsKICAgICBpZiAoVlA4UHV0Qml0VW5pZm9ybShidywgbmVlZF91cGRhdGUpKSB7CiAgICAgICAvLyB3ZSBkb24ndCB1c2UgcmVmX2xmX2RlbHRhID0+IGVtaXQgZm91ciAwIGJpdHMKLSAgICAgIFZQOFB1dFZhbHVlKGJ3LCAwLCA0KTsKKyAgICAgIFZQOFB1dEJpdHMoYncsIDAsIDQpOwogICAgICAgLy8gd2UgdXNlIG1vZGVfbGZfZGVsdGEgZm9yIGk0eDQKLSAgICAgIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBoZHItPmk0eDRfbGZfZGVsdGFfLCA2KTsKLSAgICAgIFZQOFB1dFZhbHVlKGJ3LCAwLCAzKTsgICAgLy8gYWxsIG90aGVycyB1bnVzZWQKKyAgICAgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGhkci0+aTR4NF9sZl9kZWx0YV8sIDYpOworICAgICAgVlA4UHV0Qml0cyhidywgMCwgMyk7ICAgIC8vIGFsbCBvdGhlcnMgdW51c2VkCiAgICAgfQogICB9CiB9CkBAIC0yNDQsMTIgKzIzNiwxMiBAQAogLy8gTm9taW5hbCBxdWFudGl6YXRpb24gcGFyYW1ldGVycwogc3RhdGljIHZvaWQgUHV0UXVhbnQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZQOEVuY29kZXIqIGNvbnN0IGVuYykgewotICBWUDhQdXRWYWx1ZShidywgZW5jLT5iYXNlX3F1YW50XywgNyk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kxX2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kyX2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3kyX2FjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3V2X2RjXywgNCk7Ci0gIFZQOFB1dFNpZ25lZFZhbHVlKGJ3LCBlbmMtPmRxX3V2X2FjXywgNCk7CisgIFZQOFB1dEJpdHMoYncsIGVuYy0+YmFzZV9xdWFudF8sIDcpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3kxX2RjXywgNCk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfeTJfZGNfLCA0KTsKKyAgVlA4UHV0U2lnbmVkQml0cyhidywgZW5jLT5kcV95Ml9hY18sIDQpOworICBWUDhQdXRTaWduZWRCaXRzKGJ3LCBlbmMtPmRxX3V2X2RjXywgNCk7CisgIFZQOFB1dFNpZ25lZEJpdHMoYncsIGVuYy0+ZHFfdXZfYWNfLCA0KTsKIH0KIAogLy8gUGFydGl0aW9uIHNpemVzCkBAIC0yNzEsNjAgKzI2MywyMyBAQAogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLQotI2RlZmluZSBLVFJBSUxFUl9TSVpFIDgKLQotc3RhdGljIGludCBXcml0ZUV4dGVuc2lvbnMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIHVpbnQ4X3QgYnVmZmVyW0tUUkFJTEVSX1NJWkVdOwotICBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3ID0gJmVuYy0+YndfOwotICBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOwotCi0gIC8vIExheWVyIChieXRlcyAwLi4zKQotICBQdXRMRTI0KGJ1ZmZlciArIDAsIGVuYy0+bGF5ZXJfZGF0YV9zaXplXyk7Ci0gIGJ1ZmZlclszXSA9IGVuYy0+cGljXy0+Y29sb3JzcGFjZSAmIFdFQlBfQ1NQX1VWX01BU0s7Ci0gIGlmIChlbmMtPmxheWVyX2RhdGFfc2l6ZV8gPiAwKSB7Ci0gICAgU0JfRENIRUNLKGVuYy0+dXNlX2xheWVyXyk7Ci0gICAgLy8gYXBwZW5kIGxheWVyIGRhdGEgdG8gbGFzdCBwYXJ0aXRpb24KLSAgICBpZiAoIVZQOEJpdFdyaXRlckFwcGVuZCgmZW5jLT5wYXJ0c19bZW5jLT5udW1fcGFydHNfIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5sYXllcl9kYXRhXywgZW5jLT5sYXllcl9kYXRhX3NpemVfKSkgewotICAgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpYywgVlA4X0VOQ19FUlJPUl9CSVRTVFJFQU1fT1VUX09GX01FTU9SWSk7Ci0gICAgfQotICB9Ci0KLSAgYnVmZmVyW0tUUkFJTEVSX1NJWkUgLSAxXSA9IDB4MDE7ICAvLyBtYXJrZXIKLSAgaWYgKCFWUDhCaXRXcml0ZXJBcHBlbmQoYncsIGJ1ZmZlciwgS1RSQUlMRVJfU0laRSkpIHsKLSAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JJVFNUUkVBTV9PVVRfT0ZfTUVNT1JZKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotI2VuZGlmICAgIC8qIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTICovCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBzaXplX3QgR2VuZXJhdGVQYXJ0aXRpb24wKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworc3RhdGljIGludCBHZW5lcmF0ZVBhcnRpdGlvbjAoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CiAgIFZQOEJpdFdyaXRlciogY29uc3QgYncgPSAmZW5jLT5id187CiAgIGNvbnN0IGludCBtYl9zaXplID0gZW5jLT5tYl93XyAqIGVuYy0+bWJfaF87CiAgIHVpbnQ2NF90IHBvczEsIHBvczIsIHBvczM7Ci0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgY29uc3QgaW50IG5lZWRfZXh0ZW5zaW9ucyA9IGVuYy0+dXNlX2xheWVyXzsKLSNlbmRpZgogCiAgIHBvczEgPSBWUDhCaXRXcml0ZXJQb3MoYncpOwotICBWUDhCaXRXcml0ZXJJbml0KGJ3LCBtYl9zaXplICogNyAvIDgpOyAgICAgICAgLy8gfjcgYml0cyBwZXIgbWFjcm9ibG9jawotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIFZQOFB1dEJpdFVuaWZvcm0oYncsIG5lZWRfZXh0ZW5zaW9ucyk7ICAgLy8gZXh0ZW5zaW9ucwotI2Vsc2UKKyAgaWYgKCFWUDhCaXRXcml0ZXJJbml0KGJ3LCBtYl9zaXplICogNyAvIDgpKSB7ICAgICAgICAvLyB+NyBiaXRzIHBlciBtYWNyb2Jsb2NrCisgICAgcmV0dXJuIFdlYlBFbmNvZGluZ1NldEVycm9yKGVuYy0+cGljXywgVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZKTsKKyAgfQogICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBjb2xvcnNwYWNlCi0jZW5kaWYKICAgVlA4UHV0Qml0VW5pZm9ybShidywgMCk7ICAgLy8gY2xhbXAgdHlwZQogCiAgIFB1dFNlZ21lbnRIZWFkZXIoYncsIGVuYyk7CiAgIFB1dEZpbHRlckhlYWRlcihidywgJmVuYy0+ZmlsdGVyX2hkcl8pOwotICBWUDhQdXRWYWx1ZShidywgZW5jLT5udW1fcGFydHNfID09IDggPyAzIDoKLSAgICAgICAgICAgICAgICAgIGVuYy0+bnVtX3BhcnRzXyA9PSA0ID8gMiA6Ci0gICAgICAgICAgICAgICAgICBlbmMtPm51bV9wYXJ0c18gPT0gMiA/IDEgOiAwLCAyKTsKKyAgVlA4UHV0Qml0cyhidywgZW5jLT5udW1fcGFydHNfID09IDggPyAzIDoKKyAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDQgPyAyIDoKKyAgICAgICAgICAgICAgICAgZW5jLT5udW1fcGFydHNfID09IDIgPyAxIDogMCwgMik7CiAgIFB1dFF1YW50KGJ3LCBlbmMpOwogICBWUDhQdXRCaXRVbmlmb3JtKGJ3LCAwKTsgICAvLyBubyBwcm9iYSB1cGRhdGUKICAgVlA4V3JpdGVQcm9iYXMoYncsICZlbmMtPnByb2JhXyk7CkBAIC0zMzIsMjEgKzI4NywyMyBAQAogICBWUDhDb2RlSW50cmFNb2RlcyhlbmMpOwogICBWUDhCaXRXcml0ZXJGaW5pc2goYncpOwogCi0jaWZkZWYgV0VCUF9FWFBFUklNRU5UQUxfRkVBVFVSRVMKLSAgaWYgKG5lZWRfZXh0ZW5zaW9ucyAmJiAhV3JpdGVFeHRlbnNpb25zKGVuYykpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotI2VuZGlmCi0KICAgcG9zMyA9IFZQOEJpdFdyaXRlclBvcyhidyk7CiAKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCiAgIGlmIChlbmMtPnBpY18tPnN0YXRzKSB7CiAgICAgZW5jLT5waWNfLT5zdGF0cy0+aGVhZGVyX2J5dGVzWzBdID0gKGludCkoKHBvczIgLSBwb3MxICsgNykgPj4gMyk7CiAgICAgZW5jLT5waWNfLT5zdGF0cy0+aGVhZGVyX2J5dGVzWzFdID0gKGludCkoKHBvczMgLSBwb3MyICsgNykgPj4gMyk7CiAgICAgZW5jLT5waWNfLT5zdGF0cy0+YWxwaGFfZGF0YV9zaXplID0gKGludCllbmMtPmFscGhhX2RhdGFfc2l6ZV87Ci0gICAgZW5jLT5waWNfLT5zdGF0cy0+bGF5ZXJfZGF0YV9zaXplID0gKGludCllbmMtPmxheWVyX2RhdGFfc2l6ZV87CiAgIH0KLSAgcmV0dXJuICFidy0+ZXJyb3JfOworI2Vsc2UKKyAgKHZvaWQpcG9zMTsKKyAgKHZvaWQpcG9zMjsKKyAgKHZvaWQpcG9zMzsKKyNlbmRpZgorICBpZiAoYnctPmVycm9yXykgeworICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihlbmMtPnBpY18sIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgIH0KKyAgcmV0dXJuIDE7CiB9CiAKIHZvaWQgVlA4RW5jRnJlZUJpdFdyaXRlcnMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7CkBAIC0zNjgsNyArMzI1LDggQEAKICAgaW50IHA7CiAKICAgLy8gUGFydGl0aW9uICMwIHdpdGggaGVhZGVyIGFuZCBwYXJ0aXRpb24gc2l6ZXMKLSAgb2sgPSAhIUdlbmVyYXRlUGFydGl0aW9uMChlbmMpOworICBvayA9IEdlbmVyYXRlUGFydGl0aW9uMChlbmMpOworICBpZiAoIW9rKSByZXR1cm4gMDsKIAogICAvLyBDb21wdXRlIFZQOCBzaXplCiAgIHZwOF9zaXplID0gVlA4X0ZSQU1FX0hFQURFUl9TSVpFICsKQEAgLTQxMCw4ICszNjgsNyBAQAogICBmb3IgKHAgPSAwOyBwIDwgZW5jLT5udW1fcGFydHNfOyArK3ApIHsKICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWYgPSBWUDhCaXRXcml0ZXJCdWYoZW5jLT5wYXJ0c18gKyBwKTsKICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IFZQOEJpdFdyaXRlclNpemUoZW5jLT5wYXJ0c18gKyBwKTsKLSAgICBpZiAoc2l6ZSkKLSAgICAgIG9rID0gb2sgJiYgcGljLT53cml0ZXIoYnVmLCBzaXplLCBwaWMpOworICAgIGlmIChzaXplKSBvayA9IG9rICYmIHBpYy0+d3JpdGVyKGJ1Ziwgc2l6ZSwgcGljKTsKICAgICBWUDhCaXRXcml0ZXJXaXBlT3V0KGVuYy0+cGFydHNfICsgcCk7ICAgIC8vIHdpbGwgZnJlZSB0aGUgaW50ZXJuYWwgYnVmZmVyLgogICAgIG9rID0gb2sgJiYgV2ViUFJlcG9ydFByb2dyZXNzKHBpYywgZW5jLT5wZXJjZW50XyArIHBlcmNlbnRfcGVyX3BhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYy0+cGVyY2VudF8pOwpAQCAtNDI5LDYgKzM4NiwzIEBACiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy90b2tlbl9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdG9rZW5fZW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyNjI0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdG9rZW5fZW5jLmMKQEAgLTAsMCArMSwyNjggQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQYWdpbmF0ZWQgdG9rZW4gYnVmZmVyCisvLworLy8gIEEgJ3Rva2VuJyBpcyBhIGJpdCB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwcm9iYWJpbGl0eSwgZWl0aGVyIGZpeGVkCisvLyBvciBhIGxhdGVyLXRvLWJlLWRldGVybWluZWQgYWZ0ZXIgc3RhdGlzdGljcyBoYXZlIGJlZW4gY29sbGVjdGVkLgorLy8gRm9yIGR5bmFtaWMgcHJvYmFiaWxpdHksIHdlIGp1c3QgcmVjb3JkIHRoZSBzbG90IGlkIChpZHgpIGZvciB0aGUgcHJvYmFiaWxpdHkKKy8vIHZhbHVlIGluIHRoZSBmaW5hbCBwcm9iYWJpbGl0eSBhcnJheSAodWludDhfdCogcHJvYmFzIGluIFZQOEVtaXRUb2tlbnMpLgorLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisKKyNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKKworLy8gd2UgdXNlIHBhZ2VzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG1lbWNweSgpCisjZGVmaW5lIE1JTl9QQUdFX1NJWkUgODE5MiAgICAgICAgICAvLyBtaW5pbXVtIG51bWJlciBvZiB0b2tlbiBwZXIgcGFnZQorI2RlZmluZSBGSVhFRF9QUk9CQV9CSVQgKDF1IDw8IDE0KQorCit0eXBlZGVmIHVpbnQxNl90IHRva2VuX3Q7ICAvLyBiaXQgIzE1OiBiaXQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCAjMTQ6IGZsYWdzIGZvciBjb25zdGFudCBwcm9iYSBvciBpZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdHMgIzAuLjEzOiBzbG90IG9yIGNvbnN0YW50IHByb2JhCitzdHJ1Y3QgVlA4VG9rZW5zIHsKKyAgVlA4VG9rZW5zKiBuZXh0XzsgICAgICAgIC8vIHBvaW50ZXIgdG8gbmV4dCBwYWdlCit9OworLy8gVG9rZW4gZGF0YSBpcyBsb2NhdGVkIGluIG1lbW9yeSBqdXN0IGFmdGVyIHRoZSBuZXh0XyBmaWVsZC4KKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byByZXR1cm4gdGhlaXIgYWRkcmVzcyBhbmQgaGlkZSB0aGUgdHJpY2suCisjZGVmaW5lIFRPS0VOX0RBVEEocCkgKChjb25zdCB0b2tlbl90KikmKHApWzFdKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIsIGludCBwYWdlX3NpemUpIHsKKyAgYi0+dG9rZW5zXyA9IE5VTEw7CisgIGItPnBhZ2VzXyA9IE5VTEw7CisgIGItPmxhc3RfcGFnZV8gPSAmYi0+cGFnZXNfOworICBiLT5sZWZ0XyA9IDA7CisgIGItPnBhZ2Vfc2l6ZV8gPSAocGFnZV9zaXplIDwgTUlOX1BBR0VfU0laRSkgPyBNSU5fUEFHRV9TSVpFIDogcGFnZV9zaXplOworICBiLT5lcnJvcl8gPSAwOworfQorCit2b2lkIFZQOFRCdWZmZXJDbGVhcihWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgIGlmIChiICE9IE5VTEwpIHsKKyAgICBWUDhUb2tlbnMqIHAgPSBiLT5wYWdlc187CisgICAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgICAgVlA4VG9rZW5zKiBjb25zdCBuZXh0ID0gcC0+bmV4dF87CisgICAgICBXZWJQU2FmZUZyZWUocCk7CisgICAgICBwID0gbmV4dDsKKyAgICB9CisgICAgVlA4VEJ1ZmZlckluaXQoYiwgYi0+cGFnZV9zaXplXyk7CisgIH0KK30KKworc3RhdGljIGludCBUQnVmZmVyTmV3UGFnZShWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgIFZQOFRva2VucyogcGFnZSA9IE5VTEw7CisgIGlmICghYi0+ZXJyb3JfKSB7CisgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBzaXplb2YoKnBhZ2UpICsgYi0+cGFnZV9zaXplXyAqIHNpemVvZih0b2tlbl90KTsKKyAgICBwYWdlID0gKFZQOFRva2VucyopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZSk7CisgIH0KKyAgaWYgKHBhZ2UgPT0gTlVMTCkgeworICAgIGItPmVycm9yXyA9IDE7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcGFnZS0+bmV4dF8gPSBOVUxMOworCisgICpiLT5sYXN0X3BhZ2VfID0gcGFnZTsKKyAgYi0+bGFzdF9wYWdlXyA9ICZwYWdlLT5uZXh0XzsKKyAgYi0+bGVmdF8gPSBiLT5wYWdlX3NpemVfOworICBiLT50b2tlbnNfID0gKHRva2VuX3QqKVRPS0VOX0RBVEEocGFnZSk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIFRPS0VOX0lEKHQsIGIsIGN0eCkgXAorICAgIChOVU1fUFJPQkFTICogKChjdHgpICsgTlVNX0NUWCAqICgoYikgKyBOVU1fQkFORFMgKiAodCkpKSkKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEFkZFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsIHVpbnQzMl90IGJpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcm9iYV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmFfdCogY29uc3Qgc3RhdHMpIHsKKyAgYXNzZXJ0KHByb2JhX2lkeCA8IEZJWEVEX1BST0JBX0JJVCk7CisgIGFzc2VydChiaXQgPD0gMSk7CisgIGlmIChiLT5sZWZ0XyA+IDAgfHwgVEJ1ZmZlck5ld1BhZ2UoYikpIHsKKyAgICBjb25zdCBpbnQgc2xvdCA9IC0tYi0+bGVmdF87CisgICAgYi0+dG9rZW5zX1tzbG90XSA9IChiaXQgPDwgMTUpIHwgcHJvYmFfaWR4OworICB9CisgIFZQOFJlY29yZFN0YXRzKGJpdCwgc3RhdHMpOworICByZXR1cm4gYml0OworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBBZGRDb25zdGFudFRva2VuKFZQOFRCdWZmZXIqIGNvbnN0IGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJpdCwgdWludDMyX3QgcHJvYmEpIHsKKyAgYXNzZXJ0KHByb2JhIDwgMjU2KTsKKyAgYXNzZXJ0KGJpdCA8PSAxKTsKKyAgaWYgKGItPmxlZnRfID4gMCB8fCBUQnVmZmVyTmV3UGFnZShiKSkgeworICAgIGNvbnN0IGludCBzbG90ID0gLS1iLT5sZWZ0XzsKKyAgICBiLT50b2tlbnNfW3Nsb3RdID0gKGJpdCA8PCAxNSkgfCBGSVhFRF9QUk9CQV9CSVQgfCBwcm9iYTsKKyAgfQorfQorCitpbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgY29uc3Qgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKSB7CisgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvZWZmcyA9IHJlcy0+Y29lZmZzOworICBjb25zdCBpbnQgY29lZmZfdHlwZSA9IHJlcy0+Y29lZmZfdHlwZTsKKyAgY29uc3QgaW50IGxhc3QgPSByZXMtPmxhc3Q7CisgIGludCBuID0gcmVzLT5maXJzdDsKKyAgdWludDMyX3QgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIG4sIGN0eCk7CisgIC8vIHNob3VsZCBiZSBzdGF0c1tWUDhFbmNCYW5kc1tuXV0sIGJ1dCBpdCdzIGVxdWl2YWxlbnQgZm9yIG49MCBvciAxCisgIHByb2JhX3QqIHMgPSByZXMtPnN0YXRzW25dW2N0eF07CisgIGlmICghQWRkVG9rZW4odG9rZW5zLCBsYXN0ID49IDAsIGJhc2VfaWQgKyAwLCBzICsgMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHdoaWxlIChuIDwgMTYpIHsKKyAgICBjb25zdCBpbnQgYyA9IGNvZWZmc1tuKytdOworICAgIGNvbnN0IGludCBzaWduID0gYyA8IDA7CisgICAgY29uc3QgdWludDMyX3QgdiA9IHNpZ24gPyAtYyA6IGM7CisgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgIT0gMCwgYmFzZV9pZCArIDEsIHMgKyAxKSkgeworICAgICAgYmFzZV9pZCA9IFRPS0VOX0lEKGNvZWZmX3R5cGUsIFZQOEVuY0JhbmRzW25dLCAwKTsgIC8vIGN0eD0wCisgICAgICBzID0gcmVzLT5zdGF0c1tWUDhFbmNCYW5kc1tuXV1bMF07CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxLCBiYXNlX2lkICsgMiwgcyArIDIpKSB7CisgICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIDEpOyAgLy8gY3R4PTEKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsxXTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiA0LCBiYXNlX2lkICsgMywgcyArIDMpKSB7CisgICAgICAgIGlmIChBZGRUb2tlbih0b2tlbnMsIHYgIT0gMiwgYmFzZV9pZCArIDQsIHMgKyA0KSkgeworICAgICAgICAgIEFkZFRva2VuKHRva2VucywgdiA9PSA0LCBiYXNlX2lkICsgNSwgcyArIDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgaWYgKCFBZGRUb2tlbih0b2tlbnMsIHYgPiAxMCwgYmFzZV9pZCArIDYsIHMgKyA2KSkgeworICAgICAgICBpZiAoIUFkZFRva2VuKHRva2VucywgdiA+IDYsIGJhc2VfaWQgKyA3LCBzICsgNykpIHsKKyAgICAgICAgICBBZGRDb25zdGFudFRva2VuKHRva2VucywgdiA9PSA2LCAxNTkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZENvbnN0YW50VG9rZW4odG9rZW5zLCB2ID49IDksIDE2NSk7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEodiAmIDEpLCAxNDUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBpbnQgbWFzazsKKyAgICAgICAgY29uc3QgdWludDhfdCogdGFiOworICAgICAgICB1aW50MzJfdCByZXNpZHVlID0gdiAtIDM7CisgICAgICAgIGlmIChyZXNpZHVlIDwgKDggPDwgMSkpIHsgICAgICAgICAgLy8gVlA4Q2F0MyAgKDNiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyA5LCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAwKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAyOworICAgICAgICAgIHRhYiA9IFZQOENhdDM7CisgICAgICAgIH0gZWxzZSBpZiAocmVzaWR1ZSA8ICg4IDw8IDIpKSB7ICAgLy8gVlA4Q2F0NCAgKDRiKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMCwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDEsIGJhc2VfaWQgKyA5LCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAxKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAzOworICAgICAgICAgIHRhYiA9IFZQOENhdDQ7CisgICAgICAgIH0gZWxzZSBpZiAocmVzaWR1ZSA8ICg4IDw8IDMpKSB7ICAgLy8gVlA4Q2F0NSAgKDViKQorICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDgsIHMgKyA4KTsKKyAgICAgICAgICBBZGRUb2tlbih0b2tlbnMsIDAsIGJhc2VfaWQgKyAxMCwgcyArIDkpOworICAgICAgICAgIHJlc2lkdWUgLT0gKDggPDwgMik7CisgICAgICAgICAgbWFzayA9IDEgPDwgNDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ1OworICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWUDhDYXQ2ICgxMWIpCisgICAgICAgICAgQWRkVG9rZW4odG9rZW5zLCAxLCBiYXNlX2lkICsgOCwgcyArIDgpOworICAgICAgICAgIEFkZFRva2VuKHRva2VucywgMSwgYmFzZV9pZCArIDEwLCBzICsgOSk7CisgICAgICAgICAgcmVzaWR1ZSAtPSAoOCA8PCAzKTsKKyAgICAgICAgICBtYXNrID0gMSA8PCAxMDsKKyAgICAgICAgICB0YWIgPSBWUDhDYXQ2OworICAgICAgICB9CisgICAgICAgIHdoaWxlIChtYXNrKSB7CisgICAgICAgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsICEhKHJlc2lkdWUgJiBtYXNrKSwgKnRhYisrKTsKKyAgICAgICAgICBtYXNrID4+PSAxOworICAgICAgICB9CisgICAgICB9CisgICAgICBiYXNlX2lkID0gVE9LRU5fSUQoY29lZmZfdHlwZSwgVlA4RW5jQmFuZHNbbl0sIDIpOyAgLy8gY3R4PTIKKyAgICAgIHMgPSByZXMtPnN0YXRzW1ZQOEVuY0JhbmRzW25dXVsyXTsKKyAgICB9CisgICAgQWRkQ29uc3RhbnRUb2tlbih0b2tlbnMsIHNpZ24sIDEyOCk7CisgICAgaWYgKG4gPT0gMTYgfHwgIUFkZFRva2VuKHRva2VucywgbiA8PSBsYXN0LCBiYXNlX2lkICsgMCwgcyArIDApKSB7CisgICAgICByZXR1cm4gMTsgICAvLyBFT0IKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKyN1bmRlZiBUT0tFTl9JRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRmluYWwgY29kaW5nIHBhc3MsIHdpdGgga25vd24gcHJvYmFiaWxpdGllcworCitpbnQgVlA4RW1pdFRva2VucyhWUDhUQnVmZmVyKiBjb25zdCBiLCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzLCBpbnQgZmluYWxfcGFzcykgeworICBjb25zdCBWUDhUb2tlbnMqIHAgPSBiLT5wYWdlc187CisgIGFzc2VydCghYi0+ZXJyb3JfKTsKKyAgd2hpbGUgKHAgIT0gTlVMTCkgeworICAgIGNvbnN0IFZQOFRva2VucyogY29uc3QgbmV4dCA9IHAtPm5leHRfOworICAgIGNvbnN0IGludCBOID0gKG5leHQgPT0gTlVMTCkgPyBiLT5sZWZ0XyA6IDA7CisgICAgaW50IG4gPSBiLT5wYWdlX3NpemVfOworICAgIGNvbnN0IHRva2VuX3QqIGNvbnN0IHRva2VucyA9IFRPS0VOX0RBVEEocCk7CisgICAgd2hpbGUgKG4tLSA+IE4pIHsKKyAgICAgIGNvbnN0IHRva2VuX3QgdG9rZW4gPSB0b2tlbnNbbl07CisgICAgICBjb25zdCBpbnQgYml0ID0gKHRva2VuID4+IDE1KSAmIDE7CisgICAgICBpZiAodG9rZW4gJiBGSVhFRF9QUk9CQV9CSVQpIHsKKyAgICAgICAgVlA4UHV0Qml0KGJ3LCBiaXQsIHRva2VuICYgMHhmZnUpOyAgLy8gY29uc3RhbnQgcHJvYmEKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFZQOFB1dEJpdChidywgYml0LCBwcm9iYXNbdG9rZW4gJiAweDNmZmZ1XSk7CisgICAgICB9CisgICAgfQorICAgIGlmIChmaW5hbF9wYXNzKSBXZWJQU2FmZUZyZWUoKHZvaWQqKXApOworICAgIHAgPSBuZXh0OworICB9CisgIGlmIChmaW5hbF9wYXNzKSBiLT5wYWdlc18gPSBOVUxMOworICByZXR1cm4gMTsKK30KKworLy8gU2l6ZSBlc3RpbWF0aW9uCitzaXplX3QgVlA4RXN0aW1hdGVUb2tlblNpemUoVlA4VEJ1ZmZlciogY29uc3QgYiwgY29uc3QgdWludDhfdCogY29uc3QgcHJvYmFzKSB7CisgIHNpemVfdCBzaXplID0gMDsKKyAgY29uc3QgVlA4VG9rZW5zKiBwID0gYi0+cGFnZXNfOworICBhc3NlcnQoIWItPmVycm9yXyk7CisgIHdoaWxlIChwICE9IE5VTEwpIHsKKyAgICBjb25zdCBWUDhUb2tlbnMqIGNvbnN0IG5leHQgPSBwLT5uZXh0XzsKKyAgICBjb25zdCBpbnQgTiA9IChuZXh0ID09IE5VTEwpID8gYi0+bGVmdF8gOiAwOworICAgIGludCBuID0gYi0+cGFnZV9zaXplXzsKKyAgICBjb25zdCB0b2tlbl90KiBjb25zdCB0b2tlbnMgPSBUT0tFTl9EQVRBKHApOworICAgIHdoaWxlIChuLS0gPiBOKSB7CisgICAgICBjb25zdCB0b2tlbl90IHRva2VuID0gdG9rZW5zW25dOworICAgICAgY29uc3QgaW50IGJpdCA9IHRva2VuICYgKDEgPDwgMTUpOworICAgICAgaWYgKHRva2VuICYgRklYRURfUFJPQkFfQklUKSB7CisgICAgICAgIHNpemUgKz0gVlA4Qml0Q29zdChiaXQsIHRva2VuICYgMHhmZnUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZSArPSBWUDhCaXRDb3N0KGJpdCwgcHJvYmFzW3Rva2VuICYgMHgzZmZmdV0pOworICAgICAgfQorICAgIH0KKyAgICBwID0gbmV4dDsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2Vsc2UgICAgIC8vIERJU0FCTEVfVE9LRU5fQlVGRkVSCisKK3ZvaWQgVlA4VEJ1ZmZlckluaXQoVlA4VEJ1ZmZlciogY29uc3QgYiwgaW50IHBhZ2Vfc2l6ZSkgeworICAodm9pZCliOworICAodm9pZClwYWdlX3NpemU7Cit9Cit2b2lkIFZQOFRCdWZmZXJDbGVhcihWUDhUQnVmZmVyKiBjb25zdCBiKSB7CisgICh2b2lkKWI7Cit9CisKKyNlbmRpZiAgICAvLyAhRElTQUJMRV9UT0tFTl9CVUZGRVIKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3RyZWUuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdHJlZV9lbmMuYwpzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvdHJlZS5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3RyZWVfZW5jLmMKaW5kZXggMzFkZjcxZi4uYWZiMDU0MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3RyZWUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3RyZWVfZW5jLmMKQEAgLTcsMjAgKzcsMTUgQEAKIC8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vCi0vLyBUb2tlbiBwcm9iYWJpbGl0aWVzCisvLyBDb2Rpbmcgb2YgdG9rZW4gcHJvYmFiaWxpdGllcywgaW50cmEgbW9kZXMgYW5kIHNlZ21lbnRzLgogLy8KIC8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCiAKLSNpbmNsdWRlICIuL3ZwOGVuY2kuaCIKLQogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2VuZGlmCiAKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRGVmYXVsdCBwcm9iYWJpbGl0aWVzCkBAIC0yOCw3ICsyMyw2IEBACiAvLyBQYXJhZ3JhcGggMTMuNQogY29uc3QgdWludDhfdAogICBWUDhDb2VmZnNQcm9iYTBbTlVNX1RZUEVTXVtOVU1fQkFORFNdW05VTV9DVFhdW05VTV9QUk9CQVNdID0gewotICAvLyBnZW5lcmVhdGVkIHVzaW5nIHZwOF9kZWZhdWx0X2NvZWZfcHJvYnMoKSBpbiBlbnRyb3B5LmM6MTI5CiAgIHsgeyB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCiAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0sCiAgICAgICB7IDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4LCAxMjgsIDEyOCwgMTI4IH0KQEAgLTE2NCwxMCArMTU4LDEwIEBACiB9OwogCiB2b2lkIFZQOERlZmF1bHRQcm9iYXMoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOFByb2JhKiBjb25zdCBwcm9iYXMgPSAmZW5jLT5wcm9iYV87CisgIFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMgPSAmZW5jLT5wcm9iYV87CiAgIHByb2Jhcy0+dXNlX3NraXBfcHJvYmFfID0gMDsKLSAgU2JNZW1vcnlTZXQocHJvYmFzLT5zZWdtZW50c18sIDI1NXUsIHNpemVvZihwcm9iYXMtPnNlZ21lbnRzXykpOwotICBTYk1lbW9yeUNvcHkocHJvYmFzLT5jb2VmZnNfLCBWUDhDb2VmZnNQcm9iYTAsIHNpemVvZihWUDhDb2VmZnNQcm9iYTApKTsKKyAgbWVtc2V0KHByb2Jhcy0+c2VnbWVudHNfLCAyNTV1LCBzaXplb2YocHJvYmFzLT5zZWdtZW50c18pKTsKKyAgbWVtY3B5KHByb2Jhcy0+Y29lZmZzXywgVlA4Q29lZmZzUHJvYmEwLCBzaXplb2YoVlA4Q29lZmZzUHJvYmEwKSk7CiAgIC8vIE5vdGU6IHdlIGNvdWxkIGhhcmQtY29kZSB0aGUgbGV2ZWxfY29zdHNfIGNvcnJlc3BvbmRpbmcgdG8gVlA4Q29lZmZzUHJvYmEwLAogICAvLyBidXQgdGhhdCdzIH4xMWsgb2Ygc3RhdGljIGRhdGEuIEJldHRlciBjYWxsIFZQOENhbGN1bGF0ZUxldmVsQ29zdHMoKSBsYXRlci4KICAgcHJvYmFzLT5kaXJ0eV8gPSAxOwpAQCAtMzI1LDcgKzMxOSw3IEBACiAgIFZQOEVuY0l0ZXJhdG9yIGl0OwogICBWUDhJdGVyYXRvckluaXQoZW5jLCAmaXQpOwogICBkbyB7Ci0gICAgY29uc3QgVlA4TUJJbmZvKiBtYiA9IGl0Lm1iXzsKKyAgICBjb25zdCBWUDhNQkluZm8qIGNvbnN0IG1iID0gaXQubWJfOwogICAgIGNvbnN0IHVpbnQ4X3QqIHByZWRzID0gaXQucHJlZHNfOwogICAgIGlmIChlbmMtPnNlZ21lbnRfaGRyXy51cGRhdGVfbWFwXykgewogICAgICAgUHV0U2VnbWVudChidywgbWItPnNlZ21lbnRfLCBlbmMtPnByb2JhXy5zZWdtZW50c18pOwpAQCAtMzUwLDcgKzM0NCw3IEBACiAgICAgICB9CiAgICAgfQogICAgIFB1dFVWTW9kZShidywgbWItPnV2X21vZGVfKTsKLSAgfSB3aGlsZSAoVlA4SXRlcmF0b3JOZXh0KCZpdCwgMCkpOworICB9IHdoaWxlIChWUDhJdGVyYXRvck5leHQoJml0KSk7CiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OTIsNyArNDg2LDcgQEAKICAgfQogfTsKIAotdm9pZCBWUDhXcml0ZVByb2JhcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCBWUDhQcm9iYSogY29uc3QgcHJvYmFzKSB7Cit2b2lkIFZQOFdyaXRlUHJvYmFzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IFZQOEVuY1Byb2JhKiBjb25zdCBwcm9iYXMpIHsKICAgaW50IHQsIGIsIGMsIHA7CiAgIGZvciAodCA9IDA7IHQgPCBOVU1fVFlQRVM7ICsrdCkgewogICAgIGZvciAoYiA9IDA7IGIgPCBOVU1fQkFORFM7ICsrYikgewpAQCAtNTAxLDE3ICs0OTUsMTQgQEAKICAgICAgICAgICBjb25zdCB1aW50OF90IHAwID0gcHJvYmFzLT5jb2VmZnNfW3RdW2JdW2NdW3BdOwogICAgICAgICAgIGNvbnN0IGludCB1cGRhdGUgPSAocDAgIT0gVlA4Q29lZmZzUHJvYmEwW3RdW2JdW2NdW3BdKTsKICAgICAgICAgICBpZiAoVlA4UHV0Qml0KGJ3LCB1cGRhdGUsIFZQOENvZWZmc1VwZGF0ZVByb2JhW3RdW2JdW2NdW3BdKSkgewotICAgICAgICAgICAgVlA4UHV0VmFsdWUoYncsIHAwLCA4KTsKKyAgICAgICAgICAgIFZQOFB1dEJpdHMoYncsIHAwLCA4KTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KICAgaWYgKFZQOFB1dEJpdFVuaWZvcm0oYncsIHByb2Jhcy0+dXNlX3NraXBfcHJvYmFfKSkgewotICAgIFZQOFB1dFZhbHVlKGJ3LCBwcm9iYXMtPnNraXBfcHJvYmFfLCA4KTsKKyAgICBWUDhQdXRCaXRzKGJ3LCBwcm9iYXMtPnNraXBfcHJvYmFfLCA4KTsKICAgfQogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhlbmNpLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGlfZW5jLmgKc2ltaWxhcml0eSBpbmRleCA2MyUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3ZwOGVuY2kuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhpX2VuYy5oCmluZGV4IGZlMzcxNDAuLjY0ZGJmYTQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL2VuYy92cDhlbmNpLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhpX2VuYy5oCkBAIC0xMSwyMSArMTEsMjAgQEAKIC8vCiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCi0jaWZuZGVmIFdFQlBfRU5DX1ZQOEVOQ0lfSF8KLSNkZWZpbmUgV0VCUF9FTkNfVlA4RU5DSV9IXworI2lmbmRlZiBXRUJQX0VOQ19WUDhJX0VOQ19IXworI2RlZmluZSBXRUJQX0VOQ19WUDhJX0VOQ19IXwogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgPHN0cmluZy5oPiAgICAgLy8gZm9yIG1lbWNweSgpCiAjZW5kaWYKLSNpbmNsdWRlICIuLi93ZWJwL2VuY29kZS5oIgotI2luY2x1ZGUgIi4uL2RzcC9kc3AuaCIKLSNpbmNsdWRlICIuLi91dGlscy9iaXRfd3JpdGVyLmgiCi0jaW5jbHVkZSAiLi4vdXRpbHMvdGhyZWFkLmgiCisjaW5jbHVkZSAic3JjL2RlYy9jb21tb25fZGVjLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy90aHJlYWRfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIApAQCAtMzMsMzYgKzMyLDExIEBACiAvLyBWYXJpb3VzIGRlZmluZXMgYW5kIGVudW1zCiAKIC8vIHZlcnNpb24gbnVtYmVycwotI2RlZmluZSBFTkNfTUFKX1ZFUlNJT04gMAotI2RlZmluZSBFTkNfTUlOX1ZFUlNJT04gMwotI2RlZmluZSBFTkNfUkVWX1ZFUlNJT04gMQorI2RlZmluZSBFTkNfTUFKX1ZFUlNJT04gMQorI2RlZmluZSBFTkNfTUlOX1ZFUlNJT04gMAorI2RlZmluZSBFTkNfUkVWX1ZFUlNJT04gMAogCi0vLyBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzCi1lbnVtIHsgQl9EQ19QUkVEID0gMCwgICAvLyA0eDQgbW9kZXMKLSAgICAgICBCX1RNX1BSRUQgPSAxLAotICAgICAgIEJfVkVfUFJFRCA9IDIsCi0gICAgICAgQl9IRV9QUkVEID0gMywKLSAgICAgICBCX1JEX1BSRUQgPSA0LAotICAgICAgIEJfVlJfUFJFRCA9IDUsCi0gICAgICAgQl9MRF9QUkVEID0gNiwKLSAgICAgICBCX1ZMX1BSRUQgPSA3LAotICAgICAgIEJfSERfUFJFRCA9IDgsCi0gICAgICAgQl9IVV9QUkVEID0gOSwKLSAgICAgICBOVU1fQk1PREVTID0gQl9IVV9QUkVEICsgMSAtIEJfRENfUFJFRCwgIC8vID0gMTAKLQotICAgICAgIC8vIEx1bWExNiBvciBVViBtb2RlcwotICAgICAgIERDX1BSRUQgPSBCX0RDX1BSRUQsIFZfUFJFRCA9IEJfVkVfUFJFRCwKLSAgICAgICBIX1BSRUQgPSBCX0hFX1BSRUQsIFRNX1BSRUQgPSBCX1RNX1BSRUQsCi0gICAgICAgTlVNX1BSRURfTU9ERVMgPSA0Ci0gICAgIH07Ci0KLWVudW0geyBOVU1fTUJfU0VHTUVOVFMgPSA0LAotICAgICAgIE1BWF9OVU1fUEFSVElUSU9OUyA9IDgsCi0gICAgICAgTlVNX1RZUEVTID0gNCwgICAvLyAwOiBpMTYtQUMsICAxOiBpMTYtREMsICAyOmNocm9tYS1BQywgIDM6aTQtQUMKLSAgICAgICBOVU1fQkFORFMgPSA4LAotICAgICAgIE5VTV9DVFggPSAzLAotICAgICAgIE5VTV9QUk9CQVMgPSAxMSwKLSAgICAgICBNQVhfTEZfTEVWRUxTID0gNjQsICAgICAgIC8vIE1heGltdW0gbG9vcCBmaWx0ZXIgbGV2ZWwKK2VudW0geyBNQVhfTEZfTEVWRUxTID0gNjQsICAgICAgIC8vIE1heGltdW0gbG9vcCBmaWx0ZXIgbGV2ZWwKICAgICAgICBNQVhfVkFSSUFCTEVfTEVWRUwgPSA2NywgIC8vIGxhc3QgKGluY2x1c2l2ZSkgbGV2ZWwgd2l0aCB2YXJpYWJsZSBjb3N0CiAgICAgICAgTUFYX0xFVkVMID0gMjA0NyAgICAgICAgICAvLyBtYXggbGV2ZWwgKG5vdGU6IG1heCBjb2RhYmxlIGlzIDIwNDcgKyA2NykKICAgICAgfTsKQEAgLTc0LDExOCArNDgsODMgQEAKICAgUkRfT1BUX1RSRUxMSVNfQUxMID0gMyAgIC8vIHRyZWxsaXMtcXVhbnQgZm9yIGV2ZXJ5IHNjb3JpbmcgKG11Y2ggc2xvd2VyKQogfSBWUDhSRExldmVsOwogCi0vLyBZVVYtY2FjaGUgcGFyYW1ldGVycy4gQ2FjaGUgaXMgMTYtcGl4ZWxzIHdpZGUuCi0vLyBUaGUgb3JpZ2luYWwgb3IgcmVjb25zdHJ1Y3RlZCBzYW1wbGVzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBWUDhTY2FuW10KKy8vIFlVVi1jYWNoZSBwYXJhbWV0ZXJzLiBDYWNoZSBpcyAzMi1ieXRlcyB3aWRlICg9IG9uZSBjYWNoZWxpbmUpLgorLy8gVGhlIG9yaWdpbmFsIG9yIHJlY29uc3RydWN0ZWQgc2FtcGxlcyBjYW4gYmUgYWNjZXNzZWQgdXNpbmcgVlA4U2NhbltdLgogLy8gVGhlIHByZWRpY3RlZCBibG9ja3MgY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIG9mZnNldHMgdG8geXV2X3BfIGFuZAotLy8gdGhlIGFycmF5cyBWUDgqTW9kZU9mZnNldHNbXTsKLS8vICAgICAgICAgKy0tLS0rICAgICAgWVVWIFNhbXBsZXMgYXJlYS4gU2VlIFZQOFNjYW5bXSBmb3IgYWNjZXNzaW5nIHRoZSBibG9ja3MuCi0vLyAgWV9PRkYgIHxZWVlZfCA8LSBvcmlnaW5hbCBzYW1wbGVzICAoZW5jLT55dXZfaW5fKQotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gIFVfT0ZGICB8VVVWVnwgVl9PRkYgICg9VV9PRkYgKyA4KQotLy8gICAgICAgICB8VVVWVnwKLS8vICAgICAgICAgKy0tLS0rCi0vLyAgWV9PRkYgIHxZWVlZfCA8LSBjb21wcmVzc2VkL2RlY29kZWQgc2FtcGxlcyAgKCd5dXZfb3V0XycpCi0vLyAgICAgICAgIHxZWVlZfCAgICBUaGVyZSBhcmUgdHdvIGJ1ZmZlcnMgbGlrZSB0aGlzICgneXV2X291dF8nLyd5dXZfb3V0Ml8nKQotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgVV9PRkYgIHxVVVZWfCBWX09GRgotLy8gICAgICAgICB8VVVWVnwKLS8vICAgICAgICAgIHgyIChmb3IgeXV2X291dDJfKQotLy8gICAgICAgICArLS0tLSsgICAgIFByZWRpY3Rpb24gYXJlYSAoJ3l1dl9wXycsIHNpemUgPSBQUkVEX1NJWkUpCi0vLyBJMTZEQzE2IHxZWVlZfCAgSW50cmExNiBwcmVkaWN0aW9ucyAoMTZ4MTYgYmxvY2sgZWFjaCkKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vIEkxNlRNMTYgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyBJMTZWRTE2IHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gSTE2SEUxNiB8WVlZWXwKLS8vICAgICAgICAgfFlZWVl8Ci0vLyAgICAgICAgIHxZWVlZfAotLy8gICAgICAgICB8WVlZWXwKLS8vICAgICAgICAgKy0tLS0rICBDaHJvbWEgVS9WIHByZWRpY3Rpb25zICgxNng4IGJsb2NrIGVhY2gpCi0vLyBDOERDOCAgIHxVVVZWfAotLy8gICAgICAgICB8VVVWVnwKLS8vIEM4VE04ICAgfFVVVlZ8Ci0vLyAgICAgICAgIHxVVVZWfAotLy8gQzhWRTggICB8VVVWVnwKLS8vICAgICAgICAgfFVVVlZ8Ci0vLyBDOEhFOCAgIHxVVVZWfAotLy8gICAgICAgICB8VVVWVnwKLS8vICAgICAgICAgKy0tLS0rICBJbnRyYSA0eDQgcHJlZGljdGlvbnMgKDR4NCBibG9jayBlYWNoKQotLy8gICAgICAgICB8WVlZWXwgSTREQzQgSTRUTTQgSTRWRTQgSTRIRTQKLS8vICAgICAgICAgfFlZWVl8IEk0UkQ0IEk0VlI0IEk0TEQ0IEk0Vkw0Ci0vLyAgICAgICAgIHxZWS4ufCBJNEhENCBJNEhVNCBJNFRNUAotLy8gICAgICAgICArLS0tLSsKLSNkZWZpbmUgQlBTICAgICAgIDE2ICAgLy8gdGhpcyBpcyB0aGUgY29tbW9uIHN0cmlkZQotI2RlZmluZSBZX1NJWkUgICAoQlBTICogMTYpCi0jZGVmaW5lIFVWX1NJWkUgIChCUFMgKiA4KQotI2RlZmluZSBZVVZfU0laRSAoWV9TSVpFICsgVVZfU0laRSkKLSNkZWZpbmUgUFJFRF9TSVpFICg2ICogMTYgKiBCUFMgKyAxMiAqIEJQUykKLSNkZWZpbmUgWV9PRkYgICAgKDApCi0jZGVmaW5lIFVfT0ZGICAgIChZX1NJWkUpCi0jZGVmaW5lIFZfT0ZGICAgIChVX09GRiArIDgpCi0jZGVmaW5lIEFMSUdOX0NTVCAxNQotI2RlZmluZSBET19BTElHTihQVFIpICgodWludHB0cl90KSgoUFRSKSArIEFMSUdOX0NTVCkgJiB+QUxJR05fQ1NUKQorLy8gdGhlIGFycmF5cyBWUDgqTW9kZU9mZnNldHNbXS4KKy8vICogWVVWIFNhbXBsZXMgYXJlYSAoeXV2X2luXy95dXZfb3V0Xy95dXZfb3V0Ml8pCisvLyAgIChzZWUgVlA4U2NhbltdIGZvciBhY2Nlc3NpbmcgdGhlIGJsb2NrcywgYWxvbmcgd2l0aAorLy8gICBZX09GRl9FTkMvVV9PRkZfRU5DL1ZfT0ZGX0VOQyk6CisvLyAgICAgICAgICAgICArLS0tLSstLS0tKworLy8gIFlfT0ZGX0VOQyAgfFlZWVl8VVVWVnwKKy8vICBVX09GRl9FTkMgIHxZWVlZfFVVVlZ8CisvLyAgVl9PRkZfRU5DICB8WVlZWXwuLi4ufCA8LSAyNSUgd2FzdGVkIFUvViBhcmVhCisvLyAgICAgICAgICAgICB8WVlZWXwuLi4ufAorLy8gICAgICAgICAgICAgKy0tLS0rLS0tLSsKKy8vICogUHJlZGljdGlvbiBhcmVhICgneXV2X3BfJywgc2l6ZSA9IFBSRURfU0laRV9FTkMpCisvLyAgIEludHJhMTYgcHJlZGljdGlvbnMgKDE2eDE2IGJsb2NrIGVhY2gsIHR3byBwZXIgcm93KToKKy8vICAgICAgICAgfEkxNkRDMTZ8STE2VE0xNnwKKy8vICAgICAgICAgfEkxNlZFMTZ8STE2SEUxNnwKKy8vICAgQ2hyb21hIFUvViBwcmVkaWN0aW9ucyAoMTZ4OCBibG9jayBlYWNoLCB0d28gcGVyIHJvdyk6CisvLyAgICAgICAgIHxDOERDOHxDOFRNOHwKKy8vICAgICAgICAgfEM4VkU4fEM4SEU4fAorLy8gICBJbnRyYSA0eDQgcHJlZGljdGlvbnMgKDR4NCBibG9jayBlYWNoKQorLy8gICAgICAgICB8STREQzQgSTRUTTQgSTRWRTQgSTRIRTR8STRSRDQgSTRWUjQgSTRMRDQgSTRWTDR8CisvLyAgICAgICAgIHxJNEhENCBJNEhVNCBJNFRNUCAuLi4uLnwuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnwgPC0gfjMxJSB3YXN0ZWQKKyNkZWZpbmUgWVVWX1NJWkVfRU5DIChCUFMgKiAxNikKKyNkZWZpbmUgUFJFRF9TSVpFX0VOQyAoMzIgKiBCUFMgKyAxNiAqIEJQUyArIDggKiBCUFMpICAgLy8gSTE2K0Nocm9tYStJNCBwcmVkcworI2RlZmluZSBZX09GRl9FTkMgICAgKDApCisjZGVmaW5lIFVfT0ZGX0VOQyAgICAoMTYpCisjZGVmaW5lIFZfT0ZGX0VOQyAgICAoMTYgKyA4KQogCi1leHRlcm4gY29uc3QgaW50IFZQOFNjYW5bMTYgKyA0ICsgNF07ICAgICAgICAgICAvLyBpbiBxdWFudC5jCi1leHRlcm4gY29uc3QgaW50IFZQOFVWTW9kZU9mZnNldHNbNF07ICAgICAgICAgICAvLyBpbiBhbmFseXplLmMKLWV4dGVybiBjb25zdCBpbnQgVlA4STE2TW9kZU9mZnNldHNbNF07Ci1leHRlcm4gY29uc3QgaW50IFZQOEk0TW9kZU9mZnNldHNbTlVNX0JNT0RFU107CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4U2NhblsxNl07CitleHRlcm4gY29uc3QgdWludDE2X3QgVlA4VVZNb2RlT2Zmc2V0c1s0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhJMTZNb2RlT2Zmc2V0c1s0XTsKK2V4dGVybiBjb25zdCB1aW50MTZfdCBWUDhJNE1vZGVPZmZzZXRzW05VTV9CTU9ERVNdOwogCiAvLyBMYXlvdXQgb2YgcHJlZGljdGlvbiBibG9ja3MKIC8vIGludHJhIDE2eDE2CiAjZGVmaW5lIEkxNkRDMTYgKDAgKiAxNiAqIEJQUykKLSNkZWZpbmUgSTE2VE0xNiAoMSAqIDE2ICogQlBTKQotI2RlZmluZSBJMTZWRTE2ICgyICogMTYgKiBCUFMpCi0jZGVmaW5lIEkxNkhFMTYgKDMgKiAxNiAqIEJQUykKKyNkZWZpbmUgSTE2VE0xNiAoSTE2REMxNiArIDE2KQorI2RlZmluZSBJMTZWRTE2ICgxICogMTYgKiBCUFMpCisjZGVmaW5lIEkxNkhFMTYgKEkxNlZFMTYgKyAxNikKIC8vIGNocm9tYSA4eDgsIHR3byBVL1YgYmxvY2tzIHNpZGUgYnkgc2lkZSAoaGVuY2U6IDE2eDggZWFjaCkKLSNkZWZpbmUgQzhEQzggKDQgKiAxNiAqIEJQUykKLSNkZWZpbmUgQzhUTTggKDQgKiAxNiAqIEJQUyArIDggKiBCUFMpCi0jZGVmaW5lIEM4VkU4ICg1ICogMTYgKiBCUFMpCi0jZGVmaW5lIEM4SEU4ICg1ICogMTYgKiBCUFMgKyA4ICogQlBTKQorI2RlZmluZSBDOERDOCAoMiAqIDE2ICogQlBTKQorI2RlZmluZSBDOFRNOCAoQzhEQzggKyAxICogMTYpCisjZGVmaW5lIEM4VkU4ICgyICogMTYgKiBCUFMgKyA4ICogQlBTKQorI2RlZmluZSBDOEhFOCAoQzhWRTggKyAxICogMTYpCiAvLyBpbnRyYSA0eDQKLSNkZWZpbmUgSTREQzQgKDYgKiAxNiAqIEJQUyArICAwKQotI2RlZmluZSBJNFRNNCAoNiAqIDE2ICogQlBTICsgIDQpCi0jZGVmaW5lIEk0VkU0ICg2ICogMTYgKiBCUFMgKyAgOCkKLSNkZWZpbmUgSTRIRTQgKDYgKiAxNiAqIEJQUyArIDEyKQotI2RlZmluZSBJNFJENCAoNiAqIDE2ICogQlBTICsgNCAqIEJQUyArICAwKQotI2RlZmluZSBJNFZSNCAoNiAqIDE2ICogQlBTICsgNCAqIEJQUyArICA0KQotI2RlZmluZSBJNExENCAoNiAqIDE2ICogQlBTICsgNCAqIEJQUyArICA4KQotI2RlZmluZSBJNFZMNCAoNiAqIDE2ICogQlBTICsgNCAqIEJQUyArIDEyKQotI2RlZmluZSBJNEhENCAoNiAqIDE2ICogQlBTICsgOCAqIEJQUyArICAwKQotI2RlZmluZSBJNEhVNCAoNiAqIDE2ICogQlBTICsgOCAqIEJQUyArICA0KQotI2RlZmluZSBJNFRNUCAoNiAqIDE2ICogQlBTICsgOCAqIEJQUyArICA4KQorI2RlZmluZSBJNERDNCAoMyAqIDE2ICogQlBTICsgIDApCisjZGVmaW5lIEk0VE00IChJNERDNCArICA0KQorI2RlZmluZSBJNFZFNCAoSTREQzQgKyAgOCkKKyNkZWZpbmUgSTRIRTQgKEk0REM0ICsgMTIpCisjZGVmaW5lIEk0UkQ0IChJNERDNCArIDE2KQorI2RlZmluZSBJNFZSNCAoSTREQzQgKyAyMCkKKyNkZWZpbmUgSTRMRDQgKEk0REM0ICsgMjQpCisjZGVmaW5lIEk0Vkw0IChJNERDNCArIDI4KQorI2RlZmluZSBJNEhENCAoMyAqIDE2ICogQlBTICsgNCAqIEJQUykKKyNkZWZpbmUgSTRIVTQgKEk0SEQ0ICsgNCkKKyNkZWZpbmUgSTRUTVAgKEk0SEQ0ICsgOCkKIAogdHlwZWRlZiBpbnQ2NF90IHNjb3JlX3Q7ICAgICAvLyB0eXBlIHVzZWQgZm9yIHNjb3JlcywgcmF0ZSwgZGlzdG9ydGlvbgorLy8gTm90ZSB0aGF0IE1BWF9DT1NUIGlzIG5vdCB0aGUgbWF4aW11bSBhbGxvd2VkIGJ5IHNpemVvZihzY29yZV90KSwKKy8vIGluIG9yZGVyIHRvIGFsbG93IG92ZXJmbG93aW5nIGNvbXB1dGF0aW9ucy4KICNkZWZpbmUgTUFYX0NPU1QgKChzY29yZV90KTB4N2ZmZmZmZmZmZmZmZmZMTCkKIAogI2RlZmluZSBRRklYIDE3CiAjZGVmaW5lIEJJQVMoYikgICgoYikgPDwgKFFGSVggLSA4KSkKIC8vIEZ1biBmYWN0OiB0aGlzIGlzIHRoZSBfb25seV8gbGluZSB3aGVyZSB3ZSdyZSBhY3R1YWxseSBiZWluZyBsb3NzeSBhbmQKIC8vIGRpc2NhcmRpbmcgYml0cy4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgUVVBTlRESVYoaW50IG4sIGludCBpUSwgaW50IEIpIHsKLSAgcmV0dXJuIChuICogaVEgKyBCKSA+PiBRRklYOworc3RhdGljIFdFQlBfSU5MSU5FIGludCBRVUFOVERJVih1aW50MzJfdCBuLCB1aW50MzJfdCBpUSwgdWludDMyX3QgQikgeworICByZXR1cm4gKGludCkoKG4gKiBpUSArIEIpID4+IFFGSVgpOwogfQogCi0vLyBzaXplIG9mIGhpc3RvZ3JhbSB1c2VkIGJ5IENvbGxlY3RIaXN0b2dyYW0uCi0jZGVmaW5lIE1BWF9DT0VGRl9USFJFU0ggICAzMQotdHlwZWRlZiBzdHJ1Y3QgVlA4SGlzdG9ncmFtIFZQOEhpc3RvZ3JhbTsKLXN0cnVjdCBWUDhIaXN0b2dyYW0gewotICAvLyBUT0RPKHNrYWwpOiB3ZSBvbmx5IG5lZWQgdG8gc3RvcmUgdGhlIG1heF92YWx1ZSBhbmQgbGFzdF9ub25femVybyBhY3R1YWxseS4KLSAgaW50IGRpc3RyaWJ1dGlvbltNQVhfQ09FRkZfVEhSRVNIICsgMV07Ci19OwotCiAvLyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyB0byByZW1vdmUgdG9rZW4tYnVmZmVyIGNvZGU6CiAvLyAjZGVmaW5lIERJU0FCTEVfVE9LRU5fQlVGRkVSCiAKKy8vIHF1YWxpdHkgYmVsb3cgd2hpY2ggZXJyb3ItZGlmZnVzaW9uIGlzIGVuYWJsZWQKKyNkZWZpbmUgRVJST1JfRElGRlVTSU9OX1FVQUxJVFkgOTgKKwogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEhlYWRlcnMKIApAQCAtMTkzLDYgKzEzMiw4IEBACiB0eXBlZGVmIHVpbnQ4X3QgUHJvYmFBcnJheVtOVU1fQ1RYXVtOVU1fUFJPQkFTXTsKIHR5cGVkZWYgcHJvYmFfdCBTdGF0c0FycmF5W05VTV9DVFhdW05VTV9QUk9CQVNdOwogdHlwZWRlZiB1aW50MTZfdCBDb3N0QXJyYXlbTlVNX0NUWF1bTUFYX1ZBUklBQkxFX0xFVkVMICsgMV07Cit0eXBlZGVmIGNvbnN0IHVpbnQxNl90KiAoKkNvc3RBcnJheVB0cilbTlVNX0NUWF07ICAgLy8gZm9yIGVhc3kgY2FzdGluZwordHlwZWRlZiBjb25zdCB1aW50MTZfdCogQ29zdEFycmF5TWFwWzE2XVtOVU1fQ1RYXTsKIHR5cGVkZWYgZG91YmxlIExGU3RhdHNbTlVNX01CX1NFR01FTlRTXVtNQVhfTEZfTEVWRUxTXTsgIC8vIGZpbHRlciBzdGF0cwogCiB0eXBlZGVmIHN0cnVjdCBWUDhFbmNvZGVyIFZQOEVuY29kZXI7CkBAIC0yMDMsMTkgKzE0NCwyMCBAQAogICBpbnQgdXBkYXRlX21hcF87ICAgICAgICAvLyB3aGV0aGVyIHRvIHVwZGF0ZSB0aGUgc2VnbWVudCBtYXAgb3Igbm90LgogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGJlIDAgaWYgdGhlcmUncyBvbmx5IDEgc2VnbWVudC4KICAgaW50IHNpemVfOyAgICAgICAgICAgICAgLy8gYml0LWNvc3QgZm9yIHRyYW5zbWl0dGluZyB0aGUgc2VnbWVudCBtYXAKLX0gVlA4U2VnbWVudEhlYWRlcjsKK30gVlA4RW5jU2VnbWVudEhlYWRlcjsKIAogLy8gU3RydWN0IGNvbGxlY3RpbmcgYWxsIGZyYW1lLXBlcnNpc3RlbnQgcHJvYmFiaWxpdGllcy4KIHR5cGVkZWYgc3RydWN0IHsKICAgdWludDhfdCBzZWdtZW50c19bM107ICAgICAvLyBwcm9iYWJpbGl0aWVzIGZvciBzZWdtZW50IHRyZWUKICAgdWludDhfdCBza2lwX3Byb2JhXzsgICAgICAvLyBmaW5hbCBwcm9iYWJpbGl0eSBvZiBiZWluZyBza2lwcGVkLgotICBQcm9iYUFycmF5IGNvZWZmc19bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgICAgIC8vIDkyNCBieXRlcworICBQcm9iYUFycmF5IGNvZWZmc19bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgICAgIC8vIDEwNTYgYnl0ZXMKICAgU3RhdHNBcnJheSBzdGF0c19bTlVNX1RZUEVTXVtOVU1fQkFORFNdOyAgICAgICAvLyA0MjI0IGJ5dGVzCi0gIENvc3RBcnJheSBsZXZlbF9jb3N0X1tOVU1fVFlQRVNdW05VTV9CQU5EU107ICAgLy8gMTEuNGsKKyAgQ29zdEFycmF5IGxldmVsX2Nvc3RfW05VTV9UWVBFU11bTlVNX0JBTkRTXTsgICAvLyAxMzA1NiBieXRlcworICBDb3N0QXJyYXlNYXAgcmVtYXBwZWRfY29zdHNfW05VTV9UWVBFU107ICAgICAgIC8vIDE1MzYgYnl0ZXMKICAgaW50IGRpcnR5XzsgICAgICAgICAgICAgICAvLyBpZiB0cnVlLCBuZWVkIHRvIGNhbGwgVlA4Q2FsY3VsYXRlTGV2ZWxDb3N0cygpCiAgIGludCB1c2Vfc2tpcF9wcm9iYV87ICAgICAgLy8gTm90ZTogd2UgYWx3YXlzIHVzZSBza2lwX3Byb2JhIGZvciBub3cuCiAgIGludCBuYl9za2lwXzsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHNraXBwZWQgYmxvY2tzCi19IFZQOFByb2JhOworfSBWUDhFbmNQcm9iYTsKIAogLy8gRmlsdGVyIHBhcmFtZXRlcnMuIE5vdCBhY3R1YWxseSB1c2VkIGluIHRoZSBjb2RlICh3ZSBkb24ndCBwZXJmb3JtCiAvLyB0aGUgaW4tbG9vcCBmaWx0ZXJpbmcpLCBidXQgZmlsbGVkIGZyb20gdXNlcidzIGNvbmZpZwpAQCAtMjI0LDcgKzE2Niw3IEBACiAgIGludCBsZXZlbF87ICAgICAgICAgICAgICAvLyBiYXNlIGZpbHRlciBsZXZlbCBbMC4uNjNdCiAgIGludCBzaGFycG5lc3NfOyAgICAgICAgICAvLyBbMC4uN10KICAgaW50IGk0eDRfbGZfZGVsdGFfOyAgICAgIC8vIGRlbHRhIGZpbHRlciBsZXZlbCBmb3IgaTR4NCByZWxhdGl2ZSB0byBpMTZ4MTYKLX0gVlA4RmlsdGVySGVhZGVyOworfSBWUDhFbmNGaWx0ZXJIZWFkZXI7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBJbmZvcm1hdGlvbnMgYWJvdXQgdGhlIG1hY3JvYmxvY2tzLgpAQCAtMjQxLDggKzE4Myw4IEBACiB0eXBlZGVmIHN0cnVjdCBWUDhNYXRyaXggewogICB1aW50MTZfdCBxX1sxNl07ICAgICAgICAvLyBxdWFudGl6ZXIgc3RlcHMKICAgdWludDE2X3QgaXFfWzE2XTsgICAgICAgLy8gcmVjaXByb2NhbHMsIGZpeGVkIHBvaW50LgotICB1aW50MTZfdCBiaWFzX1sxNl07ICAgICAvLyByb3VuZGluZyBiaWFzCi0gIHVpbnQxNl90IHp0aHJlc2hfWzE2XTsgIC8vIHZhbHVlIHVuZGVyIHdoaWNoIGEgY29lZmZpY2llbnQgaXMgemVyb2VkCisgIHVpbnQzMl90IGJpYXNfWzE2XTsgICAgIC8vIHJvdW5kaW5nIGJpYXMKKyAgdWludDMyX3QgenRocmVzaF9bMTZdOyAgLy8gdmFsdWUgYmVsb3cgd2hpY2ggYSBjb2VmZmljaWVudCBpcyB6ZXJvZWQKICAgdWludDE2X3Qgc2hhcnBlbl9bMTZdOyAgLy8gZnJlcXVlbmN5IGJvb3N0ZXJzIGZvciBzbGlnaHQgc2hhcnBlbmluZwogfSBWUDhNYXRyaXg7CiAKQEAgLTI1MywxNiArMTk1LDI0IEBACiAgIGludCBiZXRhXzsgICAgICAgLy8gZmlsdGVyLXN1c2NlcHRpYmlsaXR5LCByYW5nZSBbMCwyNTVdLgogICBpbnQgcXVhbnRfOyAgICAgIC8vIGZpbmFsIHNlZ21lbnQgcXVhbnRpemVyLgogICBpbnQgZnN0cmVuZ3RoXzsgIC8vIGZpbmFsIGluLWxvb3AgZmlsdGVyaW5nIHN0cmVuZ3RoCisgIGludCBtYXhfZWRnZV87ICAgLy8gbWF4IGVkZ2UgZGVsdGEgKGZvciBmaWx0ZXJpbmcgc3RyZW5ndGgpCisgIGludCBtaW5fZGlzdG9fOyAgLy8gbWluaW11bSBkaXN0b3J0aW9uIHJlcXVpcmVkIHRvIHRyaWdnZXIgZmlsdGVyaW5nIHJlY29yZAogICAvLyByZWFjdGl2aXRpZXMKICAgaW50IGxhbWJkYV9pMTZfLCBsYW1iZGFfaTRfLCBsYW1iZGFfdXZfOwogICBpbnQgbGFtYmRhX21vZGVfLCBsYW1iZGFfdHJlbGxpc18sIHRsYW1iZGFfOwogICBpbnQgbGFtYmRhX3RyZWxsaXNfaTE2XywgbGFtYmRhX3RyZWxsaXNfaTRfLCBsYW1iZGFfdHJlbGxpc191dl87CisKKyAgLy8gbGFtYmRhIHZhbHVlcyBmb3IgZGlzdG9ydGlvbi1iYXNlZCBldmFsdWF0aW9uCisgIHNjb3JlX3QgaTRfcGVuYWx0eV87ICAgLy8gcGVuYWx0eSBmb3IgdXNpbmcgSW50cmE0CiB9IFZQOFNlZ21lbnRJbmZvOwogCi0vLyBIYW5keSB0cmFuc2NpZW50IHN0cnVjdCB0byBhY2N1bXVsYXRlIHNjb3JlIGFuZCBpbmZvIGR1cmluZyBSRC1vcHRpbWl6YXRpb24KK3R5cGVkZWYgaW50OF90IERFcnJvclsyIC8qIHUvdiAqL11bMiAvKiB0b3Agb3IgbGVmdCAqL107CisKKy8vIEhhbmR5IHRyYW5zaWVudCBzdHJ1Y3QgdG8gYWNjdW11bGF0ZSBzY29yZSBhbmQgaW5mbyBkdXJpbmcgUkQtb3B0aW1pemF0aW9uCiAvLyBhbmQgbW9kZSBldmFsdWF0aW9uLgogdHlwZWRlZiBzdHJ1Y3QgewotICBzY29yZV90IEQsIFNELCBSLCBzY29yZTsgICAgLy8gRGlzdG9ydGlvbiwgc3BlY3RyYWwgZGlzdG9ydGlvbiwgcmF0ZSwgc2NvcmUuCisgIHNjb3JlX3QgRCwgU0Q7ICAgICAgICAgICAgICAvLyBEaXN0b3J0aW9uLCBzcGVjdHJhbCBkaXN0b3J0aW9uCisgIHNjb3JlX3QgSCwgUiwgc2NvcmU7ICAgICAgICAvLyBoZWFkZXIgYml0cywgcmF0ZSwgc2NvcmUuCiAgIGludDE2X3QgeV9kY19sZXZlbHNbMTZdOyAgICAvLyBRdWFudGl6ZWQgbGV2ZWxzIGZvciBsdW1hLURDLCBsdW1hLUFDLCBjaHJvbWEuCiAgIGludDE2X3QgeV9hY19sZXZlbHNbMTZdWzE2XTsKICAgaW50MTZfdCB1dl9sZXZlbHNbNCArIDRdWzE2XTsKQEAgLTI3MCwxOCArMjIwLDE3IEBACiAgIHVpbnQ4X3QgbW9kZXNfaTRbMTZdOyAgICAgICAvLyBtb2RlIG51bWJlcnMgZm9yIGludHJhNCBwcmVkaWN0aW9ucwogICBpbnQgbW9kZV91djsgICAgICAgICAgICAgICAgLy8gbW9kZSBudW1iZXIgb2YgY2hyb21hIHByZWRpY3Rpb24KICAgdWludDMyX3Qgbno7ICAgICAgICAgICAgICAgIC8vIG5vbi16ZXJvIGJsb2NrcworICBpbnQ4X3QgZGVyclsyXVszXTsgICAgICAgICAgLy8gREMgZGlmZnVzaW9uIGVycm9ycyBmb3IgVS9WIGZvciBibG9ja3MgIzEvMi8zCiB9IFZQOE1vZGVTY29yZTsKIAogLy8gSXRlcmF0b3Igc3RydWN0dXJlIHRvIGl0ZXJhdGUgdGhyb3VnaCBtYWNyb2Jsb2NrcywgcG9pbnRpbmcgdG8gdGhlCiAvLyByaWdodCBuZWlnaGJvdXJpbmcgZGF0YSAoc2FtcGxlcywgcHJlZGljdGlvbnMsIGNvbnRleHRzLCAuLi4pCiB0eXBlZGVmIHN0cnVjdCB7CiAgIGludCB4XywgeV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgbWFjcm9ibG9jawotICBpbnQgeV9vZmZzZXRfLCB1dl9vZmZzZXRfOyAgICAgICAvLyBvZmZzZXQgdG8gdGhlIGx1bWEgLyBjaHJvbWEgcGxhbmVzCi0gIGludCB5X3N0cmlkZV8sIHV2X3N0cmlkZV87ICAgICAgIC8vIHJlc3BlY3RpdmUgc3RyaWRlcwotICB1aW50OF90KiAgICAgIHl1dl9pbl87ICAgICAgICAgICAvLyBib3Jyb3dlZCBmcm9tIGVuY18gKGZvciBub3cpCi0gIHVpbnQ4X3QqICAgICAgeXV2X291dF87ICAgICAgICAgIC8vICcnCi0gIHVpbnQ4X3QqICAgICAgeXV2X291dDJfOyAgICAgICAgIC8vICcnCi0gIHVpbnQ4X3QqICAgICAgeXV2X3BfOyAgICAgICAgICAgIC8vICcnCisgIHVpbnQ4X3QqICAgICAgeXV2X2luXzsgICAgICAgICAgIC8vIGlucHV0IHNhbXBsZXMKKyAgdWludDhfdCogICAgICB5dXZfb3V0XzsgICAgICAgICAgLy8gb3V0cHV0IHNhbXBsZXMKKyAgdWludDhfdCogICAgICB5dXZfb3V0Ml87ICAgICAgICAgLy8gc2Vjb25kYXJ5IGJ1ZmZlciBzd2FwcGVkIHdpdGggeXV2X291dF8uCisgIHVpbnQ4X3QqICAgICAgeXV2X3BfOyAgICAgICAgICAgIC8vIHNjcmF0Y2ggYnVmZmVyIGZvciBwcmVkaWN0aW9uCiAgIFZQOEVuY29kZXIqICAgZW5jXzsgICAgICAgICAgICAgIC8vIGJhY2stcG9pbnRlcgogICBWUDhNQkluZm8qICAgIG1iXzsgICAgICAgICAgICAgICAvLyBjdXJyZW50IG1hY3JvYmxvY2sKICAgVlA4Qml0V3JpdGVyKiBid187ICAgICAgICAgICAgICAgLy8gY3VycmVudCBiaXQtd3JpdGVyCkBAIC0yOTcsMjQgKzI0Niw0NyBAQAogICB1aW50NjRfdCAgICAgIHV2X2JpdHNfOyAgICAgICAgICAvLyBtYWNyb2Jsb2NrIGJpdC1jb3N0IGZvciBjaHJvbWEKICAgTEZTdGF0cyogICAgICBsZl9zdGF0c187ICAgICAgICAgLy8gZmlsdGVyIHN0YXRzIChib3Jyb3dlZCBmcm9tIGVuY18pCiAgIGludCAgICAgICAgICAgZG9fdHJlbGxpc187ICAgICAgIC8vIGlmIHRydWUsIHBlcmZvcm0gZXh0cmEgbGV2ZWwgb3B0aW1pc2F0aW9uCi0gIGludCAgICAgICAgICAgZG9uZV87ICAgICAgICAgICAgIC8vIHRydWUgd2hlbiBzY2FuIGlzIGZpbmlzaGVkCisgIGludCAgICAgICAgICAgY291bnRfZG93bl87ICAgICAgIC8vIG51bWJlciBvZiBtYiBzdGlsbCB0byBiZSBwcm9jZXNzZWQKKyAgaW50ICAgICAgICAgICBjb3VudF9kb3duMF87ICAgICAgLy8gc3RhcnRpbmcgY291bnRlciB2YWx1ZSAoZm9yIHByb2dyZXNzKQogICBpbnQgICAgICAgICAgIHBlcmNlbnQwXzsgICAgICAgICAvLyBzYXZlZCBpbml0aWFsIHByb2dyZXNzIHBlcmNlbnQKKworICBERXJyb3IgICAgICAgIGxlZnRfZGVycl87ICAgICAgICAvLyBsZWZ0IGVycm9yIGRpZmZ1c2lvbiAodS92KQorICBERXJyb3IgICAgICAgKnRvcF9kZXJyXzsgICAgICAgICAvLyB0b3AgZGlmZnVzaW9uIGVycm9yIC0gTlVMTCBpZiBkaXNhYmxlZAorCisgIHVpbnQ4X3QqIHlfbGVmdF87ICAgIC8vIGxlZnQgbHVtYSBzYW1wbGVzIChhZGRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDE1KS4KKyAgdWludDhfdCogdV9sZWZ0XzsgICAgLy8gbGVmdCB1IHNhbXBsZXMgKGFkZHJlc3NhYmxlIGZyb20gaW5kZXggLTEgdG8gNykKKyAgdWludDhfdCogdl9sZWZ0XzsgICAgLy8gbGVmdCB2IHNhbXBsZXMgKGFkZHJlc3NhYmxlIGZyb20gaW5kZXggLTEgdG8gNykKKworICB1aW50OF90KiB5X3RvcF87ICAgICAvLyB0b3AgbHVtYSBzYW1wbGVzIGF0IHBvc2l0aW9uICd4XycKKyAgdWludDhfdCogdXZfdG9wXzsgICAgLy8gdG9wIHUvdiBzYW1wbGVzIGF0IHBvc2l0aW9uICd4XycsIHBhY2tlZCBhcyAxNiBieXRlcworCisgIC8vIG1lbW9yeSBmb3Igc3RvcmluZyB5L3Uvdl9sZWZ0XworICB1aW50OF90IHl1dl9sZWZ0X21lbV9bMTcgKyAxNiArIDE2ICsgOCArIFdFQlBfQUxJR05fQ1NUXTsKKyAgLy8gbWVtb3J5IGZvciB5dXZfKgorICB1aW50OF90IHl1dl9tZW1fWzMgKiBZVVZfU0laRV9FTkMgKyBQUkVEX1NJWkVfRU5DICsgV0VCUF9BTElHTl9DU1RdOwogfSBWUDhFbmNJdGVyYXRvcjsKIAogICAvLyBpbiBpdGVyYXRvci5jCi0vLyBtdXN0IGJlIGNhbGxlZCBmaXJzdC4KKy8vIG11c3QgYmUgY2FsbGVkIGZpcnN0CiB2b2lkIFZQOEl0ZXJhdG9ySW5pdChWUDhFbmNvZGVyKiBjb25zdCBlbmMsIFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7Ci0vLyByZXN0YXJ0IGEgc2Nhbi4KKy8vIHJlc3RhcnQgYSBzY2FuCiB2b2lkIFZQOEl0ZXJhdG9yUmVzZXQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKLS8vIGltcG9ydCBzYW1wbGVzIGZyb20gc291cmNlCi12b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KGNvbnN0IFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyByZXNldCBpdGVyYXRvciBwb3NpdGlvbiB0byByb3cgJ3knCit2b2lkIFZQOEl0ZXJhdG9yU2V0Um93KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgaW50IHkpOworLy8gc2V0IGNvdW50IGRvd24gKD1udW1iZXIgb2YgaXRlcmF0aW9ucyB0byBnbykKK3ZvaWQgVlA4SXRlcmF0b3JTZXRDb3VudERvd24oVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LCBpbnQgY291bnRfZG93bik7CisvLyByZXR1cm4gdHJ1ZSBpZiBpdGVyYXRpb24gaXMgZmluaXNoZWQKK2ludCBWUDhJdGVyYXRvcklzRG9uZShjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOworLy8gSW1wb3J0IHVuY29tcHJlc3NlZCBzYW1wbGVzIGZyb20gc291cmNlLgorLy8gSWYgdG1wXzMyIGlzIG5vdCBOVUxMLCBpbXBvcnQgYm91bmRhcnkgc2FtcGxlcyB0b28uCisvLyB0bXBfMzIgaXMgYSAzMi1ieXRlcyBzY3JhdGNoIGJ1ZmZlciB0aGF0IG11c3QgYmUgYWxpZ25lZCBpbiBtZW1vcnkuCit2b2lkIFZQOEl0ZXJhdG9ySW1wb3J0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCwgdWludDhfdCogdG1wXzMyKTsKIC8vIGV4cG9ydCBkZWNpbWF0ZWQgc2FtcGxlcwogdm9pZCBWUDhJdGVyYXRvckV4cG9ydChjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQpOwotLy8gZ28gdG8gbmV4dCBtYWNyb2Jsb2NrLiBSZXR1cm5zICFkb25lXy4gSWYgKmJsb2NrX3RvX3NhdmUgaXMgbm9uLW51bGwsIHdpbGwKLS8vIHNhdmUgdGhlIGJvdW5kYXJ5IHZhbHVlcyB0byB0b3BfL2xlZnRfIGFycmF5cy4gYmxvY2tfdG9fc2F2ZSBjYW4gYmUKLS8vIGl0LT55dXZfb3V0XyBvciBpdC0+eXV2X2luXy4KLWludCBWUDhJdGVyYXRvck5leHQoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBibG9ja190b19zYXZlKTsKKy8vIGdvIHRvIG5leHQgbWFjcm9ibG9jay4gUmV0dXJucyBmYWxzZSBpZiBub3QgZmluaXNoZWQuCitpbnQgVlA4SXRlcmF0b3JOZXh0KFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CisvLyBzYXZlIHRoZSB5dXZfb3V0XyBib3VuZGFyeSB2YWx1ZXMgdG8gdG9wXy9sZWZ0XyBhcnJheXMgZm9yIG5leHQgaXRlcmF0aW9ucy4KK3ZvaWQgVlA4SXRlcmF0b3JTYXZlQm91bmRhcnkoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKIC8vIFJlcG9ydCBwcm9ncmVzc2lvbiBiYXNlZCBvbiBtYWNyb2Jsb2NrIHJvd3MuIFJldHVybiAwIGZvciB1c2VyLWFib3J0IHJlcXVlc3QuCiBpbnQgVlA4SXRlcmF0b3JQcm9ncmVzcyhjb25zdCBWUDhFbmNJdGVyYXRvciogY29uc3QgaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmluYWxfZGVsdGFfcGVyY2VudCk7CkBAIC0zNDUsMTIgKzMxNywxNCBAQAogICBWUDhUb2tlbnMqIHBhZ2VzXzsgICAgICAgIC8vIGZpcnN0IHBhZ2UKICAgVlA4VG9rZW5zKiogbGFzdF9wYWdlXzsgICAvLyBsYXN0IHBhZ2UKICAgdWludDE2X3QqIHRva2Vuc187ICAgICAgICAvLyBzZXQgdG8gKCpsYXN0X3BhZ2VfKS0+dG9rZW5zXwotICBpbnQgbGVmdF87ICAgICAgICAgIC8vIGhvdyBtYW55IGZyZWUgdG9rZW5zIGxlZnQgYmVmb3JlIHRoZSBwYWdlIGlzIGZ1bGwuCisgIGludCBsZWZ0XzsgICAgICAgICAgICAgICAgLy8gaG93IG1hbnkgZnJlZSB0b2tlbnMgbGVmdCBiZWZvcmUgdGhlIHBhZ2UgaXMgZnVsbAorICBpbnQgcGFnZV9zaXplXzsgICAgICAgICAgIC8vIG51bWJlciBvZiB0b2tlbnMgcGVyIHBhZ2UKICNlbmRpZgogICBpbnQgZXJyb3JfOyAgICAgICAgIC8vIHRydWUgaW4gY2FzZSBvZiBtYWxsb2MgZXJyb3IKIH0gVlA4VEJ1ZmZlcjsKIAotdm9pZCBWUDhUQnVmZmVySW5pdChWUDhUQnVmZmVyKiBjb25zdCBiKTsgICAgLy8gaW5pdGlhbGl6ZSBhbiBlbXB0eSBidWZmZXIKKy8vIGluaXRpYWxpemUgYW4gZW1wdHkgYnVmZmVyCit2b2lkIFZQOFRCdWZmZXJJbml0KFZQOFRCdWZmZXIqIGNvbnN0IGIsIGludCBwYWdlX3NpemUpOwogdm9pZCBWUDhUQnVmZmVyQ2xlYXIoVlA4VEJ1ZmZlciogY29uc3QgYik7ICAgLy8gZGUtYWxsb2NhdGUgcGFnZXMgbWVtb3J5CiAKICNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKQEAgLTM2MSwxMiArMzM1LDExIEBACiAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBwcm9iYXMsIGludCBmaW5hbF9wYXNzKTsKIAogLy8gcmVjb3JkIHRoZSBjb2Rpbmcgb2YgY29lZmZpY2llbnRzIHdpdGhvdXQga25vd2luZyB0aGUgcHJvYmFiaWxpdGllcyB5ZXQKLWludCBWUDhSZWNvcmRDb2VmZlRva2VucyhpbnQgY3R4LCBpbnQgY29lZmZfdHlwZSwgaW50IGZpcnN0LCBpbnQgbGFzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb25zdCBjb2VmZnMsCitpbnQgVlA4UmVjb3JkQ29lZmZUb2tlbnMoaW50IGN0eCwgY29uc3Qgc3RydWN0IFZQOFJlc2lkdWFsKiBjb25zdCByZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4VEJ1ZmZlciogY29uc3QgdG9rZW5zKTsKIAotLy8gdW51c2VkIGZvciBub3cKLXZvaWQgVlA4VG9rZW5Ub1N0YXRzKGNvbnN0IFZQOFRCdWZmZXIqIGNvbnN0IGIsIHByb2JhX3QqIGNvbnN0IHN0YXRzKTsKKy8vIEVzdGltYXRlIHRoZSBmaW5hbCBjb2RlZCBzaXplIGdpdmVuIGEgc2V0IG9mICdwcm9iYXMnLgorc2l6ZV90IFZQOEVzdGltYXRlVG9rZW5TaXplKFZQOFRCdWZmZXIqIGNvbnN0IGIsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHByb2Jhcyk7CiAKICNlbmRpZiAgLy8gIURJU0FCTEVfVE9LRU5fQlVGRkVSCiAKQEAgLTM3OCw4ICszNTEsOCBAQAogICBXZWJQUGljdHVyZSogcGljXzsgICAgICAgICAgICAvLyBpbnB1dCAvIG91dHB1dCBwaWN0dXJlCiAKICAgLy8gaGVhZGVycwotICBWUDhGaWx0ZXJIZWFkZXIgICBmaWx0ZXJfaGRyXzsgICAgIC8vIGZpbHRlcmluZyBpbmZvcm1hdGlvbgotICBWUDhTZWdtZW50SGVhZGVyICBzZWdtZW50X2hkcl87ICAgIC8vIHNlZ21lbnQgaW5mb3JtYXRpb24KKyAgVlA4RW5jRmlsdGVySGVhZGVyICAgZmlsdGVyX2hkcl87ICAgICAvLyBmaWx0ZXJpbmcgaW5mb3JtYXRpb24KKyAgVlA4RW5jU2VnbWVudEhlYWRlciAgc2VnbWVudF9oZHJfOyAgICAvLyBzZWdtZW50IGluZm9ybWF0aW9uCiAKICAgaW50IHByb2ZpbGVfOyAgICAgICAgICAgICAgICAgICAgICAvLyBWUDgncyBwcm9maWxlLCBkZWR1Y2VkIGZyb20gQ29uZmlnLgogCkBAIC00MDMsMTIgKzM3Niw2IEBACiAgIHVpbnQzMl90IGFscGhhX2RhdGFfc2l6ZV87CiAgIFdlYlBXb3JrZXIgYWxwaGFfd29ya2VyXzsKIAotICAvLyBlbmhhbmNlbWVudCBsYXllcgotICBpbnQgdXNlX2xheWVyXzsKLSAgVlA4Qml0V3JpdGVyIGxheWVyX2J3XzsKLSAgdWludDhfdCogbGF5ZXJfZGF0YV87Ci0gIHNpemVfdCBsYXllcl9kYXRhX3NpemVfOwotCiAgIC8vIHF1YW50aXphdGlvbiBpbmZvIChvbmUgc2V0IG9mIERDL0FDIGRlcXVhbnQgZmFjdG9yIHBlciBzZWdtZW50KQogICBWUDhTZWdtZW50SW5mbyBkcW1fW05VTV9NQl9TRUdNRU5UU107CiAgIGludCBiYXNlX3F1YW50XzsgICAgICAgICAgICAgICAgIC8vIG5vbWluYWwgcXVhbnRpemVyIHZhbHVlLiBPbmx5IHVzZWQKQEAgLTQyMSwxNyArMzg4LDE4IEBACiAgIGludCBkcV91dl9kY18sIGRxX3V2X2FjXzsKIAogICAvLyBwcm9iYWJpbGl0aWVzIGFuZCBzdGF0aXN0aWNzCi0gIFZQOFByb2JhIHByb2JhXzsKLSAgdWludDY0X3Qgc3NlX1s0XTsgICAgICAgIC8vIHN1bSBvZiBZL1UvVi9BIHNxdWFyZWQgZXJyb3JzIGZvciBhbGwgbWFjcm9ibG9ja3MKLSAgdWludDY0X3Qgc3NlX2NvdW50XzsgICAgIC8vIHBpeGVsIGNvdW50IGZvciB0aGUgc3NlX1tdIHN0YXRzCi0gIGludCAgICAgIGNvZGVkX3NpemVfOwotICBpbnQgICAgICByZXNpZHVhbF9ieXRlc19bM11bNF07Ci0gIGludCAgICAgIGJsb2NrX2NvdW50X1szXTsKKyAgVlA4RW5jUHJvYmEgcHJvYmFfOworICB1aW50NjRfdCAgICBzc2VfWzRdOyAgICAgIC8vIHN1bSBvZiBZL1UvVi9BIHNxdWFyZWQgZXJyb3JzIGZvciBhbGwgbWFjcm9ibG9ja3MKKyAgdWludDY0X3QgICAgc3NlX2NvdW50XzsgICAvLyBwaXhlbCBjb3VudCBmb3IgdGhlIHNzZV9bXSBzdGF0cworICBpbnQgICAgICAgICBjb2RlZF9zaXplXzsKKyAgaW50ICAgICAgICAgcmVzaWR1YWxfYnl0ZXNfWzNdWzRdOworICBpbnQgICAgICAgICBibG9ja19jb3VudF9bM107CiAKICAgLy8gcXVhbGl0eS9zcGVlZCBzZXR0aW5ncwogICBpbnQgbWV0aG9kXzsgICAgICAgICAgICAgICAvLyAwPWZhc3Rlc3QsIDY9YmVzdC9zbG93ZXN0LgogICBWUDhSRExldmVsIHJkX29wdF9sZXZlbF87ICAvLyBEZWR1Y2VkIGZyb20gbWV0aG9kXy4KICAgaW50IG1heF9pNF9oZWFkZXJfYml0c187ICAgLy8gcGFydGl0aW9uICMwIHNhZmVuZXNzIGZhY3RvcgorICBpbnQgbWJfaGVhZGVyX2xpbWl0XzsgICAgICAvLyByb3VnaCBsaW1pdCBmb3IgaGVhZGVyIGJpdHMgcGVyIE1CCiAgIGludCB0aHJlYWRfbGV2ZWxfOyAgICAgICAgIC8vIGRlcml2ZWQgZnJvbSBjb25maWctPnRocmVhZF9sZXZlbAogICBpbnQgZG9fc2VhcmNoXzsgICAgICAgICAgICAvLyBkZXJpdmVkIGZyb20gY29uZmlnLT50YXJnZXRfWFhYCiAgIGludCB1c2VfdG9rZW5zXzsgICAgICAgICAgIC8vIGlmIHRydWUsIHVzZSB0b2tlbiBidWZmZXIKQEAgLTQ0MCwxOCArNDA4LDExIEBACiAgIFZQOE1CSW5mbyogbWJfaW5mb187ICAgLy8gY29udGV4dHVhbCBtYWNyb2Jsb2NrIGluZm9zIChtYl93XyArIDEpCiAgIHVpbnQ4X3QqICAgcHJlZHNfOyAgICAgLy8gcHJlZGljdGlvbnMgbW9kZXM6ICg0Km1iX3crMSkgKiAoNCptYl9oKzEpCiAgIHVpbnQzMl90KiAgbnpfOyAgICAgICAgLy8gbm9uLXplcm8gYml0IGNvbnRleHQ6IG1iX3crMQotICB1aW50OF90KiAgIHl1dl9pbl87ICAgIC8vIGlucHV0IHNhbXBsZXMKLSAgdWludDhfdCogICB5dXZfb3V0XzsgICAvLyBvdXRwdXQgc2FtcGxlcwotICB1aW50OF90KiAgIHl1dl9vdXQyXzsgIC8vIHNlY29uZGFyeSBzY3JhdGNoIG91dC1idWZmZXIuIHN3YXBwZWQgd2l0aCB5dXZfb3V0Xy4KLSAgdWludDhfdCogICB5dXZfcF87ICAgICAvLyBzY3JhdGNoIGJ1ZmZlciBmb3IgcHJlZGljdGlvbgotICB1aW50OF90ICAgKnlfdG9wXzsgICAgIC8vIHRvcCBsdW1hIHNhbXBsZXMuCi0gIHVpbnQ4X3QgICAqdXZfdG9wXzsgICAgLy8gdG9wIHUvdiBzYW1wbGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFUgYW5kIFYgYXJlIHBhY2tlZCBpbnRvIDE2IHBpeGVscyAoOCBVICsgOCBWKQotICB1aW50OF90ICAgKnlfbGVmdF87ICAgIC8vIGxlZnQgbHVtYSBzYW1wbGVzIChhZHJlc3NhYmxlIGZyb20gaW5kZXggLTEgdG8gMTUpLgotICB1aW50OF90ICAgKnVfbGVmdF87ICAgIC8vIGxlZnQgdSBzYW1wbGVzIChhZHJlc3NhYmxlIGZyb20gaW5kZXggLTEgdG8gNykKLSAgdWludDhfdCAgICp2X2xlZnRfOyAgICAvLyBsZWZ0IHYgc2FtcGxlcyAoYWRyZXNzYWJsZSBmcm9tIGluZGV4IC0xIHRvIDcpCi0KLSAgTEZTdGF0cyAgICpsZl9zdGF0c187ICAvLyBhdXRvZmlsdGVyIHN0YXRzIChpZiBOVUxMLCBhdXRvZmlsdGVyIGlzIG9mZikKKyAgdWludDhfdCogICB5X3RvcF87ICAgICAvLyB0b3AgbHVtYSBzYW1wbGVzLgorICB1aW50OF90KiAgIHV2X3RvcF87ICAgIC8vIHRvcCB1L3Ygc2FtcGxlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVIGFuZCBWIGFyZSBwYWNrZWQgaW50byAxNiBieXRlcyAoOCBVICsgOCBWKQorICBMRlN0YXRzKiAgIGxmX3N0YXRzXzsgIC8vIGF1dG9maWx0ZXIgc3RhdHMgKGlmIE5VTEwsIGF1dG9maWx0ZXIgaXMgb2ZmKQorICBERXJyb3IqICAgIHRvcF9kZXJyXzsgIC8vIGRpZmZ1c2lvbiBlcnJvciAoTlVMTCBpZiBkaXNhYmxlZCkKIH07CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NjQsNyArNDI1LDcgQEAKIC8vIFJlc2V0IHRoZSB0b2tlbiBwcm9iYWJpbGl0aWVzIHRvIHRoZWlyIGluaXRpYWwgKGRlZmF1bHQpIHZhbHVlcwogdm9pZCBWUDhEZWZhdWx0UHJvYmFzKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7CiAvLyBXcml0ZSB0aGUgdG9rZW4gcHJvYmFiaWxpdGllcwotdm9pZCBWUDhXcml0ZVByb2JhcyhWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBjb25zdCBWUDhQcm9iYSogY29uc3QgcHJvYmFzKTsKK3ZvaWQgVlA4V3JpdGVQcm9iYXMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgY29uc3QgVlA4RW5jUHJvYmEqIGNvbnN0IHByb2Jhcyk7CiAvLyBXcml0ZXMgdGhlIHBhcnRpdGlvbiAjMCBtb2RlcyAodGhhdCBpczogYWxsIGludHJhIG1vZGVzKQogdm9pZCBWUDhDb2RlSW50cmFNb2RlcyhWUDhFbmNvZGVyKiBjb25zdCBlbmMpOwogCkBAIC00NzcsNyArNDM4LDYgQEAKIHZvaWQgVlA4RW5jRnJlZUJpdFdyaXRlcnMoVlA4RW5jb2RlciogY29uc3QgZW5jKTsKIAogICAvLyBpbiBmcmFtZS5jCi1leHRlcm4gY29uc3QgdWludDhfdCBWUDhFbmNCYW5kc1sxNiArIDFdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q2F0M1tdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q2F0NFtdOwogZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgVlA4Q2F0NVtdOwpAQCAtNTIyLDM0ICs0ODIsMzkgQEAKIGludCBWUDhFbmNGaW5pc2hBbHBoYShWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgIC8vIGZpbmFsaXplIGNvbXByZXNzZWQgZGF0YQogaW50IFZQOEVuY0RlbGV0ZUFscGhhKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgLy8gZGVsZXRlIGNvbXByZXNzZWQgZGF0YQogCi0gIC8vIGluIGxheWVyLmMKLXZvaWQgVlA4RW5jSW5pdExheWVyKFZQOEVuY29kZXIqIGNvbnN0IGVuYyk7ICAgICAvLyBpbml0IGV2ZXJ5dGhpbmcKLXZvaWQgVlA4RW5jQ29kZUxheWVyQmxvY2soVlA4RW5jSXRlcmF0b3IqIGl0KTsgICAvLyBjb2RlIG9uZSBtb3JlIG1hY3JvYmxvY2sKLWludCBWUDhFbmNGaW5pc2hMYXllcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpOyAgICAvLyBmaW5hbGl6ZSBjb2RpbmcKLXZvaWQgVlA4RW5jRGVsZXRlTGF5ZXIoVlA4RW5jb2RlciogZW5jKTsgICAgICAgICAvLyByZWNsYWltIG1lbW9yeQotCi0gIC8vIGluIGZpbHRlci5jCi0KLS8vIFNTSU0gdXRpbHMKLXR5cGVkZWYgc3RydWN0IHsKLSAgZG91YmxlIHcsIHhtLCB5bSwgeHhtLCB4eW0sIHl5bTsKLX0gRGlzdG9TdGF0czsKLXZvaWQgVlA4U1NJTUFkZFN0YXRzKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHNyYywgRGlzdG9TdGF0cyogY29uc3QgZHN0KTsKLXZvaWQgVlA4U1NJTUFjY3VtdWxhdGVQbGFuZShjb25zdCB1aW50OF90KiBzcmMxLCBpbnQgc3RyaWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMyLCBpbnQgc3RyaWRlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVywgaW50IEgsIERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLWRvdWJsZSBWUDhTU0lNR2V0KGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLWRvdWJsZSBWUDhTU0lNR2V0U3F1YXJlZEVycm9yKGNvbnN0IERpc3RvU3RhdHMqIGNvbnN0IHN0YXRzKTsKLQogLy8gYXV0b2ZpbHRlcgogdm9pZCBWUDhJbml0RmlsdGVyKFZQOEVuY0l0ZXJhdG9yKiBjb25zdCBpdCk7CiB2b2lkIFZQOFN0b3JlRmlsdGVyU3RhdHMoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKIHZvaWQgVlA4QWRqdXN0RmlsdGVyU3RyZW5ndGgoVlA4RW5jSXRlcmF0b3IqIGNvbnN0IGl0KTsKIAorLy8gcmV0dXJucyB0aGUgYXBwcm94aW1hdGUgZmlsdGVyaW5nIHN0cmVuZ3RoIG5lZWRlZCB0byBzbW9vdGggYSBlZGdlCisvLyBzdGVwIG9mICdkZWx0YScsIGdpdmVuIGEgc2hhcnBuZXNzIHBhcmFtZXRlciAnc2hhcnBuZXNzJy4KK2ludCBWUDhGaWx0ZXJTdHJlbmd0aEZyb21EZWx0YShpbnQgc2hhcnBuZXNzLCBpbnQgZGVsdGEpOworCisgIC8vIG1pc2MgdXRpbHMgZm9yIHBpY3R1cmVfKi5jOgorCisvLyBSZW1vdmUgcmVmZXJlbmNlIHRvIHRoZSBBUkdCL1lVVkEgYnVmZmVyIChkb2Vzbid0IGZyZWUgYW55dGhpbmcpLgordm9pZCBXZWJQUGljdHVyZVJlc2V0QnVmZmVycyhXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7CisKKy8vIEFsbG9jYXRlcyBBUkdCIGJ1ZmZlciBvZiBnaXZlbiBkaW1lbnNpb24gKHByZXZpb3VzIG9uZSBpcyBhbHdheXMgZnJlZSdkKS4KKy8vIFByZXNlcnZlcyB0aGUgWVVWKEEpIGJ1ZmZlci4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHBhcmFtLAorLy8gb3V0LW9mLW1lbW9yeSkuCitpbnQgV2ViUFBpY3R1cmVBbGxvY0FSR0IoV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIEFsbG9jYXRlcyBZVVZBIGJ1ZmZlciBvZiBnaXZlbiBkaW1lbnNpb24gKHByZXZpb3VzIG9uZSBpcyBhbHdheXMgZnJlZSdkKS4KKy8vIFVzZXMgcGljdHVyZS0+Y3NwIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGFscGhhIGJ1ZmZlciBpcyBuZWVkZWQuCisvLyBQcmVzZXJ2ZXMgdGhlIEFSR0IgYnVmZmVyLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHBhcmFtLCBvdXQtb2YtbWVtb3J5KS4KK2ludCBXZWJQUGljdHVyZUFsbG9jWVVWQShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8gQ2xlYW4tdXAgdGhlIFJHQiBzYW1wbGVzIHVuZGVyIGZ1bGx5IHRyYW5zcGFyZW50IGFyZWEsIHRvIGhlbHAgbG9zc2xlc3MKKy8vIGNvbXByZXNzaWJpbGl0eSAobm8gZ3VhcmFudGVlLCB0aG91Z2gpLiBBc3N1bWVzIHRoYXQgcGljLT51c2VfYXJnYiBpcyB0cnVlLgordm9pZCBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYUxvc3NsZXNzKFdlYlBQaWN0dXJlKiBjb25zdCBwaWMpOworCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAgIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCi0jZW5kaWYgIC8qIFdFQlBfRU5DX1ZQOEVOQ0lfSF8gKi8KKyNlbmRpZiAgLyogV0VCUF9FTkNfVlA4SV9FTkNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bF9lbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvdnA4bF9lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWZhNzMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhsX2VuYy5jCkBAIC0wLDAgKzEsMTkxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIG1haW4gZW50cnkgZm9yIHRoZSBsb3NzbGVzcyBlbmNvZGVyLgorLy8KKy8vIEF1dGhvcjogVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisvLworCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vYXNzZXJ0X3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvZW5jL2JhY2t3YXJkX3JlZmVyZW5jZXNfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy9oaXN0b2dyYW1fZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhpX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvdnA4bGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2RzcC9sb3NzbGVzcy5oIgorI2luY2x1ZGUgInNyYy9kc3AvbG9zc2xlc3NfY29tbW9uLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisKKy8vIE1heGltdW0gbnVtYmVyIG9mIGhpc3RvZ3JhbSBpbWFnZXMgKHN1Yi1ibG9ja3MpLgorI2RlZmluZSBNQVhfSFVGRl9JTUFHRV9TSVpFICAgICAgIDI2MDAKKworLy8gUGFsZXR0ZSByZW9yZGVyaW5nIGZvciBzbWFsbGVyIHN1bSBvZiBkZWx0YXMgKGFuZCBmb3Igc21hbGxlciBzdG9yYWdlKS4KKworc3RhdGljIGludCBQYWxldHRlQ29tcGFyZUNvbG9yc0ZvclFzb3J0KGNvbnN0IHZvaWQqIHAxLCBjb25zdCB2b2lkKiBwMikgeworICBjb25zdCB1aW50MzJfdCBhID0gV2ViUE1lbVRvVWludDMyKCh1aW50OF90KilwMSk7CisgIGNvbnN0IHVpbnQzMl90IGIgPSBXZWJQTWVtVG9VaW50MzIoKHVpbnQ4X3QqKXAyKTsKKyAgYXNzZXJ0KGEgIT0gYik7CisgIHJldHVybiAoYSA8IGIpID8gLTEgOiAxOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgUGFsZXR0ZUNvbXBvbmVudERpc3RhbmNlKHVpbnQzMl90IHYpIHsKKyAgcmV0dXJuICh2IDw9IDEyOCkgPyB2IDogKDI1NiAtIHYpOworfQorCisvLyBDb21wdXRlcyBhIHZhbHVlIHRoYXQgaXMgcmVsYXRlZCB0byB0aGUgZW50cm9weSBjcmVhdGVkIGJ5IHRoZQorLy8gcGFsZXR0ZSBlbnRyeSBkaWZmLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgbGFzdCAmIDB4ZmYgaXMgYSBuby1vcGVyYXRpb24gaW4gdGhlIG5leHQgc3RhdGVtZW50LCBidXQKKy8vIHJlbW92ZWQgYnkgbW9zdCBjb21waWxlcnMgYW5kIGlzIGhlcmUgb25seSBmb3IgcmVndWxhcml0eSBvZiB0aGUgY29kZS4KK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBQYWxldHRlQ29sb3JEaXN0YW5jZSh1aW50MzJfdCBjb2wxLCB1aW50MzJfdCBjb2wyKSB7CisgIGNvbnN0IHVpbnQzMl90IGRpZmYgPSBWUDhMU3ViUGl4ZWxzKGNvbDEsIGNvbDIpOworICBjb25zdCBpbnQga01vcmVXZWlnaHRGb3JSR0JUaGFuRm9yQWxwaGEgPSA5OworICB1aW50MzJfdCBzY29yZTsKKyAgc2NvcmUgPSAgUGFsZXR0ZUNvbXBvbmVudERpc3RhbmNlKChkaWZmID4+ICAwKSAmIDB4ZmYpOworICBzY29yZSArPSBQYWxldHRlQ29tcG9uZW50RGlzdGFuY2UoKGRpZmYgPj4gIDgpICYgMHhmZik7CisgIHNjb3JlICs9IFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSgoZGlmZiA+PiAxNikgJiAweGZmKTsKKyAgc2NvcmUgKj0ga01vcmVXZWlnaHRGb3JSR0JUaGFuRm9yQWxwaGE7CisgIHNjb3JlICs9IFBhbGV0dGVDb21wb25lbnREaXN0YW5jZSgoZGlmZiA+PiAyNCkgJiAweGZmKTsKKyAgcmV0dXJuIHNjb3JlOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBTd2FwQ29sb3IodWludDMyX3QqIGNvbnN0IGNvbDEsIHVpbnQzMl90KiBjb25zdCBjb2wyKSB7CisgIGNvbnN0IHVpbnQzMl90IHRtcCA9ICpjb2wxOworICAqY29sMSA9ICpjb2wyOworICAqY29sMiA9IHRtcDsKK30KKworc3RhdGljIHZvaWQgR3JlZWR5TWluaW1pemVEZWx0YXModWludDMyX3QgcGFsZXR0ZVtdLCBpbnQgbnVtX2NvbG9ycykgeworICAvLyBGaW5kIGdyZWVkaWx5IGFsd2F5cyB0aGUgY2xvc2VzdCBjb2xvciBvZiB0aGUgcHJlZGljdGVkIGNvbG9yIHRvIG1pbmltaXplCisgIC8vIGRlbHRhcyBpbiB0aGUgcGFsZXR0ZS4gVGhpcyByZWR1Y2VzIHN0b3JhZ2UgbmVlZHMgc2luY2UgdGhlCisgIC8vIHBhbGV0dGUgaXMgc3RvcmVkIHdpdGggZGVsdGEgZW5jb2RpbmcuCisgIHVpbnQzMl90IHByZWRpY3QgPSAweDAwMDAwMDAwOworICBpbnQgaSwgazsKKyAgZm9yIChpID0gMDsgaSA8IG51bV9jb2xvcnM7ICsraSkgeworICAgIGludCBiZXN0X2l4ID0gaTsKKyAgICB1aW50MzJfdCBiZXN0X3Njb3JlID0gfjBVOworICAgIGZvciAoayA9IGk7IGsgPCBudW1fY29sb3JzOyArK2spIHsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGN1cl9zY29yZSA9IFBhbGV0dGVDb2xvckRpc3RhbmNlKHBhbGV0dGVba10sIHByZWRpY3QpOworICAgICAgaWYgKGJlc3Rfc2NvcmUgPiBjdXJfc2NvcmUpIHsKKyAgICAgICAgYmVzdF9zY29yZSA9IGN1cl9zY29yZTsKKyAgICAgICAgYmVzdF9peCA9IGs7CisgICAgICB9CisgICAgfQorICAgIFN3YXBDb2xvcigmcGFsZXR0ZVtiZXN0X2l4XSwgJnBhbGV0dGVbaV0pOworICAgIHByZWRpY3QgPSBwYWxldHRlW2ldOworICB9Cit9CisKKy8vIFRoZSBwYWxldHRlIGhhcyBiZWVuIHNvcnRlZCBieSBhbHBoYS4gVGhpcyBmdW5jdGlvbiBjaGVja3MgaWYgdGhlIG90aGVyCisvLyBjb21wb25lbnRzIG9mIHRoZSBwYWxldHRlIGhhdmUgYSBtb25vdG9uaWMgZGV2ZWxvcG1lbnQgd2l0aCByZWdhcmRzIHRvCisvLyBwb3NpdGlvbiBpbiB0aGUgcGFsZXR0ZS4gSWYgYWxsIGhhdmUgbW9ub3RvbmljIGRldmVsb3BtZW50LCB0aGVyZSBpcworLy8gbm8gYmVuZWZpdCB0byByZS1vcmdhbml6ZSB0aGVtIGdyZWVkaWx5LiBBIG1vbm90b25pYyBkZXZlbG9wbWVudAorLy8gd291bGQgYmUgc3BvdHRlZCBpbiBncmVlbi1vbmx5IHNpdHVhdGlvbnMgKGxpa2UgbG9zc3kgYWxwaGEpIG9yIGdyYXktc2NhbGUKKy8vIGltYWdlcy4KK3N0YXRpYyBpbnQgUGFsZXR0ZUhhc05vbk1vbm90b25vdXNEZWx0YXModWludDMyX3QgcGFsZXR0ZVtdLCBpbnQgbnVtX2NvbG9ycykgeworICB1aW50MzJfdCBwcmVkaWN0ID0gMHgwMDAwMDA7CisgIGludCBpOworICB1aW50OF90IHNpZ25fZm91bmQgPSAweDAwOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbG9yczsgKytpKSB7CisgICAgY29uc3QgdWludDMyX3QgZGlmZiA9IFZQOExTdWJQaXhlbHMocGFsZXR0ZVtpXSwgcHJlZGljdCk7CisgICAgY29uc3QgdWludDhfdCByZCA9IChkaWZmID4+IDE2KSAmIDB4ZmY7CisgICAgY29uc3QgdWludDhfdCBnZCA9IChkaWZmID4+ICA4KSAmIDB4ZmY7CisgICAgY29uc3QgdWludDhfdCBiZCA9IChkaWZmID4+ICAwKSAmIDB4ZmY7CisgICAgaWYgKHJkICE9IDB4MDApIHsKKyAgICAgIHNpZ25fZm91bmQgfD0gKHJkIDwgMHg4MCkgPyAxIDogMjsKKyAgICB9CisgICAgaWYgKGdkICE9IDB4MDApIHsKKyAgICAgIHNpZ25fZm91bmQgfD0gKGdkIDwgMHg4MCkgPyA4IDogMTY7CisgICAgfQorICAgIGlmIChiZCAhPSAweDAwKSB7CisgICAgICBzaWduX2ZvdW5kIHw9IChiZCA8IDB4ODApID8gNjQgOiAxMjg7CisgICAgfQorICAgIHByZWRpY3QgPSBwYWxldHRlW2ldOworICB9CisgIHJldHVybiAoc2lnbl9mb3VuZCAmIChzaWduX2ZvdW5kIDw8IDEpKSAhPSAwOyAgLy8gdHdvIGNvbnNlcXVlbnQgc2lnbnMuCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBQYWxldHRlCisKKy8vIElmIG51bWJlciBvZiBjb2xvcnMgaW4gdGhlIGltYWdlIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBNQVhfUEFMRVRURV9TSVpFLAorLy8gY3JlYXRlcyBhIHBhbGV0dGUgYW5kIHJldHVybnMgdHJ1ZSwgZWxzZSByZXR1cm5zIGZhbHNlLgorc3RhdGljIGludCBBbmFseXplQW5kQ3JlYXRlUGFsZXR0ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcGFsZXR0ZVtNQVhfUEFMRVRURV9TSVpFXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBwYWxldHRlX3NpemUpIHsKKyAgY29uc3QgaW50IG51bV9jb2xvcnMgPSBXZWJQR2V0Q29sb3JQYWxldHRlKHBpYywgcGFsZXR0ZSk7CisgIGlmIChudW1fY29sb3JzID4gTUFYX1BBTEVUVEVfU0laRSkgeworICAgICpwYWxldHRlX3NpemUgPSAwOworICAgIHJldHVybiAwOworICB9CisgICpwYWxldHRlX3NpemUgPSBudW1fY29sb3JzOworICBxc29ydChwYWxldHRlLCBudW1fY29sb3JzLCBzaXplb2YoKnBhbGV0dGUpLCBQYWxldHRlQ29tcGFyZUNvbG9yc0ZvclFzb3J0KTsKKyAgaWYgKCFsb3dfZWZmb3J0ICYmIFBhbGV0dGVIYXNOb25Nb25vdG9ub3VzRGVsdGFzKHBhbGV0dGUsIG51bV9jb2xvcnMpKSB7CisgICAgR3JlZWR5TWluaW1pemVEZWx0YXMocGFsZXR0ZSwgbnVtX2NvbG9ycyk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFRoZXNlIGZpdmUgbW9kZXMgYXJlIGV2YWx1YXRlZCBhbmQgdGhlaXIgcmVzcGVjdGl2ZSBlbnRyb3B5IGlzIGNvbXB1dGVkLgordHlwZWRlZiBlbnVtIHsKKyAga0RpcmVjdCA9IDAsCisgIGtTcGF0aWFsID0gMSwKKyAga1N1YkdyZWVuID0gMiwKKyAga1NwYXRpYWxTdWJHcmVlbiA9IDMsCisgIGtQYWxldHRlID0gNCwKKyAga051bUVudHJvcHlJeCA9IDUKK30gRW50cm9weUl4OworCit0eXBlZGVmIGVudW0geworICBrSGlzdG9BbHBoYSA9IDAsCisgIGtIaXN0b0FscGhhUHJlZCwKKyAga0hpc3RvR3JlZW4sCisgIGtIaXN0b0dyZWVuUHJlZCwKKyAga0hpc3RvUmVkLAorICBrSGlzdG9SZWRQcmVkLAorICBrSGlzdG9CbHVlLAorICBrSGlzdG9CbHVlUHJlZCwKKyAga0hpc3RvUmVkU3ViR3JlZW4sCisgIGtIaXN0b1JlZFByZWRTdWJHcmVlbiwKKyAga0hpc3RvQmx1ZVN1YkdyZWVuLAorICBrSGlzdG9CbHVlUHJlZFN1YkdyZWVuLAorICBrSGlzdG9QYWxldHRlLAorICBrSGlzdG9Ub3RhbCAgLy8gTXVzdCBiZSBsYXN0LgorfSBIaXN0b0l4OworCitzdGF0aWMgdm9pZCBBZGRTaW5nbGVTdWJHcmVlbihpbnQgcCwgdWludDMyX3QqIGNvbnN0IHIsIHVpbnQzMl90KiBjb25zdCBiKSB7CisgIGNvbnN0IGludCBncmVlbiA9IHAgPj4gODsgIC8vIFRoZSB1cHBlciBiaXRzIGFyZSBtYXNrZWQgYXdheSBsYXRlci4KKyAgKytyWygocCA+PiAxNikgLSBncmVlbikgJiAweGZmXTsKKyAgKytiWygocCA+PiAgMCkgLSBncmVlbikgJiAweGZmXTsKK30KKworc3RhdGljIHZvaWQgQWRkU2luZ2xlKHVpbnQzMl90IHAsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGEsIHVpbnQzMl90KiBjb25zdCByLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBnLCB1aW50MzJfdCogY29uc3QgYikgeworICArK2FbKHAgPj4gMjQpICYgMHhmZl07CisgICsrclsocCA+PiAxNikgJiAweGZmXTsKKyAgKytnWyhwID4+ICA4KSAmIDB4ZmZdOworICArK2JbKHAgPj4gIDApICYgMHhmZl07Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBIYXNoUGl4KHVpbnQzMl90IHBpeCkgeworICAvLyBOb3RlIHRoYXQgbWFza2luZyB3aXRoIDB4ZmZmZmZmZmZ1IGlzIGZvciBwcmV2ZW50aW5nIGFuCisgIC8vICd1bnNpZ25lZCBpbnQgb3ZlcmZsb3cnIHdhcm5pbmcuIERvZXNuJ3QgaW1wYWN0IHRoZSBjb21waWxlZCBjb2RlLgorICByZXR1cm4gKCgoKHVpbnQ2NF90KXBpeCArIChwaXggPj4gMTkpKSAqIDB4MzljNWZiYTd1bGwpICYgMHhmZmZmZmZmZnUpID4+IDI0OworfQorCitzdGF0aWMgaW50IEFuYWx5emVFbnRyb3B5KGNvbnN0IHVpbnQzMl90KiBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBhcmdiX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9wYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFsZXR0ZV9zaXplLCBpbnQgdHJhbnNmb3JtX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJvcHlJeCogY29uc3QgbWluX2VudHJvcHlfaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvKSB7CisgIC8vIEFsbG9jYXRlIGhpc3RvZ3JhbSBzZXQgd2l0aCBjYWNoZV9iaXRzID0gMC4KKyAgdWludDMyX3QqIGhpc3RvOworCisgIGlmICh1c2VfcGFsZXR0ZSAmJiBwYWxldHRlX3NpemUgPD0gMTYpIHsKKyAgICAvLyBJbiB0aGUgY2FzZSBvZiBzbWFsbCBwYWxldHRlcywgd2UgcGFjayAyLCA0IG9yIDggcGl4ZWxzIHRvZ2V0aGVyLiBJbgorICAgIC8vIHByYWN0aWNlLCBzbWFsbCBwYWxldHRlcyBhcmUgYmV0dGVyIHRoYW4gYW55IG90aGVyIHRyYW5zZm9ybS4KKyAgICAqbWluX2VudHJvcHlfaXggPSBrUGFsZXR0ZTsKKyAgICAqcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID0gMTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBoaXN0byA9ICh1aW50MzJfdCopV2ViUFNhZmVDYWxsb2Moa0hpc3RvVG90YWwsIHNpemVvZigqaGlzdG8pICogMjU2KTsKKyAgaWYgKGhpc3RvICE9IE5VTEwpIHsKKyAgICBpbnQgaSwgeCwgeTsKKyAgICBjb25zdCB1aW50MzJfdCogcHJldl9yb3cgPSBOVUxMOworICAgIGNvbnN0IHVpbnQzMl90KiBjdXJyX3JvdyA9IGFyZ2I7CisgICAgdWludDMyX3QgcGl4X3ByZXYgPSBhcmdiWzBdOyAgLy8gU2tpcCB0aGUgZmlyc3QgcGl4ZWwuCisgICAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICBjb25zdCB1aW50MzJfdCBwaXggPSBjdXJyX3Jvd1t4XTsKKyAgICAgICAgY29uc3QgdWludDMyX3QgcGl4X2RpZmYgPSBWUDhMU3ViUGl4ZWxzKHBpeCwgcGl4X3ByZXYpOworICAgICAgICBwaXhfcHJldiA9IHBpeDsKKyAgICAgICAgaWYgKChwaXhfZGlmZiA9PSAwKSB8fCAocHJldl9yb3cgIT0gTlVMTCAmJiBwaXggPT0gcHJldl9yb3dbeF0pKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQWRkU2luZ2xlKHBpeCwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9BbHBoYSAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvUmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9HcmVlbiAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQmx1ZSAqIDI1Nl0pOworICAgICAgICBBZGRTaW5nbGUocGl4X2RpZmYsCisgICAgICAgICAgICAgICAgICAmaGlzdG9ba0hpc3RvQWxwaGFQcmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9SZWRQcmVkICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9HcmVlblByZWQgKiAyNTZdLAorICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0JsdWVQcmVkICogMjU2XSk7CisgICAgICAgIEFkZFNpbmdsZVN1YkdyZWVuKHBpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b1JlZFN1YkdyZWVuICogMjU2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b0JsdWVTdWJHcmVlbiAqIDI1Nl0pOworICAgICAgICBBZGRTaW5nbGVTdWJHcmVlbihwaXhfZGlmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmhpc3RvW2tIaXN0b1JlZFByZWRTdWJHcmVlbiAqIDI1Nl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZoaXN0b1trSGlzdG9CbHVlUHJlZFN1YkdyZWVuICogMjU2XSk7CisgICAgICAgIHsKKyAgICAgICAgICAvLyBBcHByb3hpbWF0ZSB0aGUgcGFsZXR0ZSBieSB0aGUgZW50cm9weSBvZiB0aGUgbXVsdGlwbGljYXRpdmUgaGFzaC4KKyAgICAgICAgICBjb25zdCB1aW50MzJfdCBoYXNoID0gSGFzaFBpeChwaXgpOworICAgICAgICAgICsraGlzdG9ba0hpc3RvUGFsZXR0ZSAqIDI1NiArIGhhc2hdOworICAgICAgICB9CisgICAgICB9CisgICAgICBwcmV2X3JvdyA9IGN1cnJfcm93OworICAgICAgY3Vycl9yb3cgKz0gYXJnYl9zdHJpZGU7CisgICAgfQorICAgIHsKKyAgICAgIGRvdWJsZSBlbnRyb3B5X2NvbXBba0hpc3RvVG90YWxdOworICAgICAgZG91YmxlIGVudHJvcHlba051bUVudHJvcHlJeF07CisgICAgICBpbnQgazsKKyAgICAgIGludCBsYXN0X21vZGVfdG9fYW5hbHl6ZSA9IHVzZV9wYWxldHRlID8ga1BhbGV0dGUgOiBrU3BhdGlhbFN1YkdyZWVuOworICAgICAgaW50IGo7CisgICAgICAvLyBMZXQncyBhZGQgb25lIHplcm8gdG8gdGhlIHByZWRpY3RlZCBoaXN0b2dyYW1zLiBUaGUgemVyb3MgYXJlIHJlbW92ZWQKKyAgICAgIC8vIHRvbyBlZmZpY2llbnRseSBieSB0aGUgcGl4X2RpZmYgPT0gMCBjb21wYXJpc29uLCBhdCBsZWFzdCBvbmUgb2YgdGhlCisgICAgICAvLyB6ZXJvcyBpcyBsaWtlbHkgdG8gZXhpc3QuCisgICAgICArK2hpc3RvW2tIaXN0b1JlZFByZWRTdWJHcmVlbiAqIDI1Nl07CisgICAgICArK2hpc3RvW2tIaXN0b0JsdWVQcmVkU3ViR3JlZW4gKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9SZWRQcmVkICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvR3JlZW5QcmVkICogMjU2XTsKKyAgICAgICsraGlzdG9ba0hpc3RvQmx1ZVByZWQgKiAyNTZdOworICAgICAgKytoaXN0b1trSGlzdG9BbHBoYVByZWQgKiAyNTZdOworCisgICAgICBmb3IgKGogPSAwOyBqIDwga0hpc3RvVG90YWw7ICsraikgeworICAgICAgICBlbnRyb3B5X2NvbXBbal0gPSBWUDhMQml0c0VudHJvcHkoJmhpc3RvW2ogKiAyNTZdLCAyNTYpOworICAgICAgfQorICAgICAgZW50cm9weVtrRGlyZWN0XSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYV0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9SZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvR3JlZW5dICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvQmx1ZV07CisgICAgICBlbnRyb3B5W2tTcGF0aWFsXSA9IGVudHJvcHlfY29tcFtrSGlzdG9BbHBoYVByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvUmVkUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9HcmVlblByZWRdICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvQmx1ZVByZWRdOworICAgICAgZW50cm9weVtrU3ViR3JlZW5dID0gZW50cm9weV9jb21wW2tIaXN0b0FscGhhXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b1JlZFN1YkdyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0dyZWVuXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVTdWJHcmVlbl07CisgICAgICBlbnRyb3B5W2tTcGF0aWFsU3ViR3JlZW5dID0gZW50cm9weV9jb21wW2tIaXN0b0FscGhhUHJlZF0gKworICAgICAgICAgIGVudHJvcHlfY29tcFtrSGlzdG9SZWRQcmVkU3ViR3JlZW5dICsKKyAgICAgICAgICBlbnRyb3B5X2NvbXBba0hpc3RvR3JlZW5QcmVkXSArCisgICAgICAgICAgZW50cm9weV9jb21wW2tIaXN0b0JsdWVQcmVkU3ViR3JlZW5dOworICAgICAgZW50cm9weVtrUGFsZXR0ZV0gPSBlbnRyb3B5X2NvbXBba0hpc3RvUGFsZXR0ZV07CisKKyAgICAgIC8vIFdoZW4gaW5jbHVkaW5nIHRyYW5zZm9ybXMsIHRoZXJlIGlzIGFuIG92ZXJoZWFkIGluIGJpdHMgZnJvbQorICAgICAgLy8gc3RvcmluZyB0aGVtLiBUaGlzIG92ZXJoZWFkIGlzIHNtYWxsIGJ1dCBtYXR0ZXJzIGZvciBzbWFsbCBpbWFnZXMuCisgICAgICAvLyBGb3Igc3BhdGlhbCwgdGhlcmUgYXJlIDE0IHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgIGVudHJvcHlba1NwYXRpYWxdICs9IFZQOExTdWJTYW1wbGVTaXplKHdpZHRoLCB0cmFuc2Zvcm1fYml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCB0cmFuc2Zvcm1fYml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEZhc3RMb2cyKDE0KTsKKyAgICAgIC8vIEZvciBjb2xvciB0cmFuc2Zvcm1zOiAyNCBhcyBvbmx5IDMgY2hhbm5lbHMgYXJlIGNvbnNpZGVyZWQgaW4gYQorICAgICAgLy8gQ29sb3JUcmFuc2Zvcm1FbGVtZW50LgorICAgICAgZW50cm9weVtrU3BhdGlhbFN1YkdyZWVuXSArPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgdHJhbnNmb3JtX2JpdHMpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCB0cmFuc2Zvcm1fYml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMRmFzdExvZzIoMjQpOworICAgICAgLy8gRm9yIHBhbGV0dGVzLCBhZGQgdGhlIGNvc3Qgb2Ygc3RvcmluZyB0aGUgcGFsZXR0ZS4KKyAgICAgIC8vIFdlIGVtcGlyaWNhbGx5IGVzdGltYXRlIHRoZSBjb3N0IG9mIGEgY29tcHJlc3NlZCBlbnRyeSBhcyA4IGJpdHMuCisgICAgICAvLyBUaGUgcGFsZXR0ZSBpcyBkaWZmZXJlbnRpYWwtY29kZWQgd2hlbiBjb21wcmVzc2VkIGhlbmNlIGEgbXVjaAorICAgICAgLy8gbG93ZXIgY29zdCB0aGFuIHNpemVvZih1aW50MzJfdCkqOC4KKyAgICAgIGVudHJvcHlba1BhbGV0dGVdICs9IHBhbGV0dGVfc2l6ZSAqIDg7CisKKyAgICAgICptaW5fZW50cm9weV9peCA9IGtEaXJlY3Q7CisgICAgICBmb3IgKGsgPSBrRGlyZWN0ICsgMTsgayA8PSBsYXN0X21vZGVfdG9fYW5hbHl6ZTsgKytrKSB7CisgICAgICAgIGlmIChlbnRyb3B5WyptaW5fZW50cm9weV9peF0gPiBlbnRyb3B5W2tdKSB7CisgICAgICAgICAgKm1pbl9lbnRyb3B5X2l4ID0gKEVudHJvcHlJeClrOworICAgICAgICB9CisgICAgICB9CisgICAgICBhc3NlcnQoKGludCkqbWluX2VudHJvcHlfaXggPD0gbGFzdF9tb2RlX3RvX2FuYWx5emUpOworICAgICAgKnJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IDE7CisgICAgICAvLyBMZXQncyBjaGVjayBpZiB0aGUgaGlzdG9ncmFtIG9mIHRoZSBjaG9zZW4gZW50cm9weSBtb2RlIGhhcworICAgICAgLy8gbm9uLXplcm8gcmVkIGFuZCBibHVlIHZhbHVlcy4gSWYgYWxsIGFyZSB6ZXJvLCB3ZSBjYW4gbGF0ZXIgc2tpcAorICAgICAgLy8gdGhlIGNyb3NzIGNvbG9yIG9wdGltaXphdGlvbi4KKyAgICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0hpc3RvUGFpcnNbNV1bMl0gPSB7CisgICAgICAgICAgeyBrSGlzdG9SZWQsIGtIaXN0b0JsdWUgfSwKKyAgICAgICAgICB7IGtIaXN0b1JlZFByZWQsIGtIaXN0b0JsdWVQcmVkIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWRTdWJHcmVlbiwga0hpc3RvQmx1ZVN1YkdyZWVuIH0sCisgICAgICAgICAgeyBrSGlzdG9SZWRQcmVkU3ViR3JlZW4sIGtIaXN0b0JsdWVQcmVkU3ViR3JlZW4gfSwKKyAgICAgICAgICB7IGtIaXN0b1JlZCwga0hpc3RvQmx1ZSB9CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCByZWRfaGlzdG8gPQorICAgICAgICAgICAgJmhpc3RvWzI1NiAqIGtIaXN0b1BhaXJzWyptaW5fZW50cm9weV9peF1bMF1dOworICAgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgYmx1ZV9oaXN0byA9CisgICAgICAgICAgICAmaGlzdG9bMjU2ICoga0hpc3RvUGFpcnNbKm1pbl9lbnRyb3B5X2l4XVsxXV07CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgIGlmICgocmVkX2hpc3RvW2ldIHwgYmx1ZV9oaXN0b1tpXSkgIT0gMCkgeworICAgICAgICAgICAgKnJlZF9hbmRfYmx1ZV9hbHdheXNfemVybyA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgV2ViUFNhZmVGcmVlKGhpc3RvKTsKKyAgICByZXR1cm4gMTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgaW50IEdldEhpc3RvQml0cyhpbnQgbWV0aG9kLCBpbnQgdXNlX3BhbGV0dGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAvLyBNYWtlIHRpbGUgc2l6ZSBhIGZ1bmN0aW9uIG9mIGVuY29kaW5nIG1ldGhvZCAoUmFuZ2U6IDAgdG8gNikuCisgIGludCBoaXN0b19iaXRzID0gKHVzZV9wYWxldHRlID8gOSA6IDcpIC0gbWV0aG9kOworICB3aGlsZSAoMSkgeworICAgIGNvbnN0IGludCBodWZmX2ltYWdlX3NpemUgPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgaGlzdG9fYml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIGhpc3RvX2JpdHMpOworICAgIGlmIChodWZmX2ltYWdlX3NpemUgPD0gTUFYX0hVRkZfSU1BR0VfU0laRSkgYnJlYWs7CisgICAgKytoaXN0b19iaXRzOworICB9CisgIHJldHVybiAoaGlzdG9fYml0cyA8IE1JTl9IVUZGTUFOX0JJVFMpID8gTUlOX0hVRkZNQU5fQklUUyA6CisgICAgICAgICAoaGlzdG9fYml0cyA+IE1BWF9IVUZGTUFOX0JJVFMpID8gTUFYX0hVRkZNQU5fQklUUyA6IGhpc3RvX2JpdHM7Cit9CisKK3N0YXRpYyBpbnQgR2V0VHJhbnNmb3JtQml0cyhpbnQgbWV0aG9kLCBpbnQgaGlzdG9fYml0cykgeworICBjb25zdCBpbnQgbWF4X3RyYW5zZm9ybV9iaXRzID0gKG1ldGhvZCA8IDQpID8gNiA6IChtZXRob2QgPiA0KSA/IDQgOiA1OworICBjb25zdCBpbnQgcmVzID0KKyAgICAgIChoaXN0b19iaXRzID4gbWF4X3RyYW5zZm9ybV9iaXRzKSA/IG1heF90cmFuc2Zvcm1fYml0cyA6IGhpc3RvX2JpdHM7CisgIGFzc2VydChyZXMgPD0gTUFYX1RSQU5TRk9STV9CSVRTKTsKKyAgcmV0dXJuIHJlczsKK30KKworLy8gU2V0IG9mIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBpbiBlYWNoIGl0ZXJhdGlvbiBvZiB0aGUgY3J1bmNoZXIuCisjZGVmaW5lIENSVU5DSF9DT05GSUdTX0xaNzdfTUFYIDIKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IGVudHJvcHlfaWR4XzsKKyAgaW50IGx6NzdzX3R5cGVzX3RvX3RyeV9bQ1JVTkNIX0NPTkZJR1NfTFo3N19NQVhdOworICBpbnQgbHo3N3NfdHlwZXNfdG9fdHJ5X3NpemVfOworfSBDcnVuY2hDb25maWc7CisKKyNkZWZpbmUgQ1JVTkNIX0NPTkZJR1NfTUFYIGtOdW1FbnRyb3B5SXgKKworc3RhdGljIGludCBFbmNvZGVyQW5hbHl6ZShWUDhMRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDcnVuY2hDb25maWcgY3J1bmNoX2NvbmZpZ3NbQ1JVTkNIX0NPTkZJR1NfTUFYXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBjcnVuY2hfY29uZmlnc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHJlZF9hbmRfYmx1ZV9hbHdheXNfemVybykgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZyA9IGVuYy0+Y29uZmlnXzsKKyAgY29uc3QgaW50IG1ldGhvZCA9IGNvbmZpZy0+bWV0aG9kOworICBjb25zdCBpbnQgbG93X2VmZm9ydCA9IChjb25maWctPm1ldGhvZCA9PSAwKTsKKyAgaW50IGk7CisgIGludCB1c2VfcGFsZXR0ZTsKKyAgaW50IG5fbHo3N3M7CisgIGFzc2VydChwaWMgIT0gTlVMTCAmJiBwaWMtPmFyZ2IgIT0gTlVMTCk7CisKKyAgdXNlX3BhbGV0dGUgPQorICAgICAgQW5hbHl6ZUFuZENyZWF0ZVBhbGV0dGUocGljLCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5wYWxldHRlXywgJmVuYy0+cGFsZXR0ZV9zaXplXyk7CisKKyAgLy8gRW1waXJpY2FsIGJpdCBzaXplcy4KKyAgZW5jLT5oaXN0b19iaXRzXyA9IEdldEhpc3RvQml0cyhtZXRob2QsIHVzZV9wYWxldHRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpYy0+d2lkdGgsIHBpYy0+aGVpZ2h0KTsKKyAgZW5jLT50cmFuc2Zvcm1fYml0c18gPSBHZXRUcmFuc2Zvcm1CaXRzKG1ldGhvZCwgZW5jLT5oaXN0b19iaXRzXyk7CisKKyAgaWYgKGxvd19lZmZvcnQpIHsKKyAgICAvLyBBbmFseXplRW50cm9weSBpcyBzb21ld2hhdCBzbG93LgorICAgIGNydW5jaF9jb25maWdzWzBdLmVudHJvcHlfaWR4XyA9IHVzZV9wYWxldHRlID8ga1BhbGV0dGUgOiBrU3BhdGlhbFN1YkdyZWVuOworICAgIG5fbHo3N3MgPSAxOworICAgICpjcnVuY2hfY29uZmlnc19zaXplID0gMTsKKyAgfSBlbHNlIHsKKyAgICBFbnRyb3B5SXggbWluX2VudHJvcHlfaXg7CisgICAgLy8gVHJ5IG91dCBtdWx0aXBsZSBMWjc3IG9uIGltYWdlcyB3aXRoIGZldyBjb2xvcnMuCisgICAgbl9sejc3cyA9IChlbmMtPnBhbGV0dGVfc2l6ZV8gPiAwICYmIGVuYy0+cGFsZXR0ZV9zaXplXyA8PSAxNikgPyAyIDogMTsKKyAgICBpZiAoIUFuYWx5emVFbnRyb3B5KHBpYy0+YXJnYiwgd2lkdGgsIGhlaWdodCwgcGljLT5hcmdiX3N0cmlkZSwgdXNlX3BhbGV0dGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbmMtPnBhbGV0dGVfc2l6ZV8sIGVuYy0+dHJhbnNmb3JtX2JpdHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgJm1pbl9lbnRyb3B5X2l4LCByZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKG1ldGhvZCA9PSA2ICYmIGNvbmZpZy0+cXVhbGl0eSA9PSAxMDApIHsKKyAgICAgIC8vIEdvIGJydXRlIGZvcmNlIG9uIGFsbCB0cmFuc2Zvcm1zLgorICAgICAgKmNydW5jaF9jb25maWdzX3NpemUgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IGtOdW1FbnRyb3B5SXg7ICsraSkgeworICAgICAgICBpZiAoaSAhPSBrUGFsZXR0ZSB8fCB1c2VfcGFsZXR0ZSkgeworICAgICAgICAgIGFzc2VydCgqY3J1bmNoX2NvbmZpZ3Nfc2l6ZSA8IENSVU5DSF9DT05GSUdTX01BWCk7CisgICAgICAgICAgY3J1bmNoX2NvbmZpZ3NbKCpjcnVuY2hfY29uZmlnc19zaXplKSsrXS5lbnRyb3B5X2lkeF8gPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE9ubHkgY2hvb3NlIHRoZSBndWVzc2VkIGJlc3QgdHJhbnNmb3JtLgorICAgICAgKmNydW5jaF9jb25maWdzX3NpemUgPSAxOworICAgICAgY3J1bmNoX2NvbmZpZ3NbMF0uZW50cm9weV9pZHhfID0gbWluX2VudHJvcHlfaXg7CisgICAgfQorICB9CisgIC8vIEZpbGwgaW4gdGhlIGRpZmZlcmVudCBMWjc3cy4KKyAgYXNzZXJ0KG5fbHo3N3MgPD0gQ1JVTkNIX0NPTkZJR1NfTFo3N19NQVgpOworICBmb3IgKGkgPSAwOyBpIDwgKmNydW5jaF9jb25maWdzX3NpemU7ICsraSkgeworICAgIGludCBqOworICAgIGZvciAoaiA9IDA7IGogPCBuX2x6NzdzOyArK2opIHsKKyAgICAgIGNydW5jaF9jb25maWdzW2ldLmx6NzdzX3R5cGVzX3RvX3RyeV9bal0gPQorICAgICAgICAgIChqID09IDApID8ga0xaNzdTdGFuZGFyZCB8IGtMWjc3UkxFIDoga0xaNzdCb3g7CisgICAgfQorICAgIGNydW5jaF9jb25maWdzW2ldLmx6NzdzX3R5cGVzX3RvX3RyeV9zaXplXyA9IG5fbHo3N3M7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRW5jb2RlckluaXQoVlA4TEVuY29kZXIqIGNvbnN0IGVuYykgeworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGNvbnN0IGludCBwaXhfY250ID0gd2lkdGggKiBoZWlnaHQ7CisgIC8vIHdlIHJvdW5kIHRoZSBibG9jayBzaXplIHVwLCBzbyB3ZSdyZSBndWFyYW50ZWVkIHRvIGhhdmUKKyAgLy8gYXQgbW9zdCBNQVhfUkVGU19CTE9DS19QRVJfSU1BR0UgYmxvY2tzIHVzZWQ6CisgIGNvbnN0IGludCByZWZzX2Jsb2NrX3NpemUgPSAocGl4X2NudCAtIDEpIC8gTUFYX1JFRlNfQkxPQ0tfUEVSX0lNQUdFICsgMTsKKyAgaW50IGk7CisgIGlmICghVlA4TEhhc2hDaGFpbkluaXQoJmVuYy0+aGFzaF9jaGFpbl8sIHBpeF9jbnQpKSByZXR1cm4gMDsKKworICBmb3IgKGkgPSAwOyBpIDwgMzsgKytpKSBWUDhMQmFja3dhcmRSZWZzSW5pdCgmZW5jLT5yZWZzX1tpXSwgcmVmc19ibG9ja19zaXplKTsKKworICByZXR1cm4gMTsKK30KKworLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBpbnQgR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcygKKyAgICBjb25zdCBWUDhMSGlzdG9ncmFtU2V0KiBjb25zdCBoaXN0b2dyYW1faW1hZ2UsCisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGVzKSB7CisgIGludCBpLCBrOworICBpbnQgb2sgPSAwOworICB1aW50NjRfdCB0b3RhbF9sZW5ndGhfc2l6ZSA9IDA7CisgIHVpbnQ4X3QqIG1lbV9idWYgPSBOVUxMOworICBjb25zdCBpbnQgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSBoaXN0b2dyYW1faW1hZ2UtPnNpemU7CisgIGludCBtYXhfbnVtX3N5bWJvbHMgPSAwOworICB1aW50OF90KiBidWZfcmxlID0gTlVMTDsKKyAgSHVmZm1hblRyZWUqIGh1ZmZfdHJlZSA9IE5VTEw7CisKKyAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBoaXN0b2dyYW1zIGFuZCBnZXQgdGhlIGFnZ3JlZ2F0ZSBudW1iZXIgb2YgY29kZXMgdXNlZC4KKyAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICBjb25zdCBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1tpXTsKKyAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGNvZGVzID0gJmh1ZmZtYW5fY29kZXNbNSAqIGldOworICAgIGZvciAoayA9IDA7IGsgPCA1OyArK2spIHsKKyAgICAgIGNvbnN0IGludCBudW1fc3ltYm9scyA9CisgICAgICAgICAgKGsgPT0gMCkgPyBWUDhMSGlzdG9ncmFtTnVtQ29kZXMoaGlzdG8tPnBhbGV0dGVfY29kZV9iaXRzXykgOgorICAgICAgICAgIChrID09IDQpID8gTlVNX0RJU1RBTkNFX0NPREVTIDogMjU2OworICAgICAgY29kZXNba10ubnVtX3N5bWJvbHMgPSBudW1fc3ltYm9sczsKKyAgICAgIHRvdGFsX2xlbmd0aF9zaXplICs9IG51bV9zeW1ib2xzOworICAgIH0KKyAgfQorCisgIC8vIEFsbG9jYXRlIGFuZCBTZXQgSHVmZm1hbiBjb2Rlcy4KKyAgeworICAgIHVpbnQxNl90KiBjb2RlczsKKyAgICB1aW50OF90KiBsZW5ndGhzOworICAgIG1lbV9idWYgPSAodWludDhfdCopV2ViUFNhZmVDYWxsb2ModG90YWxfbGVuZ3RoX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmxlbmd0aHMpICsgc2l6ZW9mKCpjb2RlcykpOworICAgIGlmIChtZW1fYnVmID09IE5VTEwpIGdvdG8gRW5kOworCisgICAgY29kZXMgPSAodWludDE2X3QqKW1lbV9idWY7CisgICAgbGVuZ3RocyA9ICh1aW50OF90KikmY29kZXNbdG90YWxfbGVuZ3RoX3NpemVdOworICAgIGZvciAoaSA9IDA7IGkgPCA1ICogaGlzdG9ncmFtX2ltYWdlX3NpemU7ICsraSkgeworICAgICAgY29uc3QgaW50IGJpdF9sZW5ndGggPSBodWZmbWFuX2NvZGVzW2ldLm51bV9zeW1ib2xzOworICAgICAgaHVmZm1hbl9jb2Rlc1tpXS5jb2RlcyA9IGNvZGVzOworICAgICAgaHVmZm1hbl9jb2Rlc1tpXS5jb2RlX2xlbmd0aHMgPSBsZW5ndGhzOworICAgICAgY29kZXMgKz0gYml0X2xlbmd0aDsKKyAgICAgIGxlbmd0aHMgKz0gYml0X2xlbmd0aDsKKyAgICAgIGlmIChtYXhfbnVtX3N5bWJvbHMgPCBiaXRfbGVuZ3RoKSB7CisgICAgICAgIG1heF9udW1fc3ltYm9scyA9IGJpdF9sZW5ndGg7CisgICAgICB9CisgICAgfQorICB9CisKKyAgYnVmX3JsZSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBtYXhfbnVtX3N5bWJvbHMpOworICBodWZmX3RyZWUgPSAoSHVmZm1hblRyZWUqKVdlYlBTYWZlTWFsbG9jKDNVTEwgKiBtYXhfbnVtX3N5bWJvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpodWZmX3RyZWUpKTsKKyAgaWYgKGJ1Zl9ybGUgPT0gTlVMTCB8fCBodWZmX3RyZWUgPT0gTlVMTCkgZ290byBFbmQ7CisKKyAgLy8gQ3JlYXRlIEh1ZmZtYW4gdHJlZXMuCisgIGZvciAoaSA9IDA7IGkgPCBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzWzUgKiBpXTsKKyAgICBWUDhMSGlzdG9ncmFtKiBjb25zdCBoaXN0byA9IGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1tpXTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmxpdGVyYWxfLCAxNSwgYnVmX3JsZSwgaHVmZl90cmVlLCBjb2RlcyArIDApOworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+cmVkXywgMTUsIGJ1Zl9ybGUsIGh1ZmZfdHJlZSwgY29kZXMgKyAxKTsKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG8tPmJsdWVfLCAxNSwgYnVmX3JsZSwgaHVmZl90cmVlLCBjb2RlcyArIDIpOworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+YWxwaGFfLCAxNSwgYnVmX3JsZSwgaHVmZl90cmVlLCBjb2RlcyArIDMpOworICAgIFZQOExDcmVhdGVIdWZmbWFuVHJlZShoaXN0by0+ZGlzdGFuY2VfLCAxNSwgYnVmX3JsZSwgaHVmZl90cmVlLCBjb2RlcyArIDQpOworICB9CisgIG9rID0gMTsKKyBFbmQ6CisgIFdlYlBTYWZlRnJlZShodWZmX3RyZWUpOworICBXZWJQU2FmZUZyZWUoYnVmX3JsZSk7CisgIGlmICghb2spIHsKKyAgICBXZWJQU2FmZUZyZWUobWVtX2J1Zik7CisgICAgbWVtc2V0KGh1ZmZtYW5fY29kZXMsIDAsIDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSAqIHNpemVvZigqaHVmZm1hbl9jb2RlcykpOworICB9CisgIHJldHVybiBvazsKK30KKworc3RhdGljIHZvaWQgU3RvcmVIdWZmbWFuVHJlZU9mSHVmZm1hblRyZWVUb0JpdE1hc2soCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IHVpbnQ4X3QqIGNvZGVfbGVuZ3RoX2JpdGRlcHRoKSB7CisgIC8vIFJGQyAxOTUxIHdpbGwgY2FsbSB5b3UgZG93biBpZiB5b3UgYXJlIHdvcnJpZWQgYWJvdXQgdGhpcyBmdW5ueSBzZXF1ZW5jZS4KKyAgLy8gVGhpcyBzZXF1ZW5jZSBpcyB0dW5lZCBmcm9tIHRoYXQsIGJ1dCBtb3JlIHdlaWdodGVkIGZvciBsb3dlciBzeW1ib2wgY291bnQsCisgIC8vIGFuZCBtb3JlIHNwaWtpbmcgaGlzdG9ncmFtcy4KKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0b3JhZ2VPcmRlcltDT0RFX0xFTkdUSF9DT0RFU10gPSB7CisgICAgMTcsIDE4LCAwLCAxLCAyLCAzLCA0LCA1LCAxNiwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNQorICB9OworICBpbnQgaTsKKyAgLy8gVGhyb3cgYXdheSB0cmFpbGluZyB6ZXJvczoKKyAgaW50IGNvZGVzX3RvX3N0b3JlID0gQ09ERV9MRU5HVEhfQ09ERVM7CisgIGZvciAoOyBjb2Rlc190b19zdG9yZSA+IDQ7IC0tY29kZXNfdG9fc3RvcmUpIHsKKyAgICBpZiAoY29kZV9sZW5ndGhfYml0ZGVwdGhba1N0b3JhZ2VPcmRlcltjb2Rlc190b19zdG9yZSAtIDFdXSAhPSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgVlA4TFB1dEJpdHMoYncsIGNvZGVzX3RvX3N0b3JlIC0gNCwgNCk7CisgIGZvciAoaSA9IDA7IGkgPCBjb2Rlc190b19zdG9yZTsgKytpKSB7CisgICAgVlA4TFB1dEJpdHMoYncsIGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2tTdG9yYWdlT3JkZXJbaV1dLCAzKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKAorICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7CisgIGludCBrOworICBpbnQgY291bnQgPSAwOworICBmb3IgKGsgPSAwOyBrIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9sczsgKytrKSB7CisgICAgaWYgKGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2tdICE9IDApIHsKKyAgICAgICsrY291bnQ7CisgICAgICBpZiAoY291bnQgPiAxKSByZXR1cm47CisgICAgfQorICB9CisgIGZvciAoayA9IDA7IGsgPCBodWZmbWFuX2NvZGUtPm51bV9zeW1ib2xzOyArK2spIHsKKyAgICBodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1trXSA9IDA7CisgICAgaHVmZm1hbl9jb2RlLT5jb2Rlc1trXSA9IDA7CisgIH0KK30KKworc3RhdGljIHZvaWQgU3RvcmVIdWZmbWFuVHJlZVRvQml0TWFzaygKKyAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICBjb25zdCBIdWZmbWFuVHJlZVRva2VuKiBjb25zdCB0b2tlbnMsIGNvbnN0IGludCBudW1fdG9rZW5zLAorICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgaHVmZm1hbl9jb2RlKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX3Rva2VuczsgKytpKSB7CisgICAgY29uc3QgaW50IGl4ID0gdG9rZW5zW2ldLmNvZGU7CisgICAgY29uc3QgaW50IGV4dHJhX2JpdHMgPSB0b2tlbnNbaV0uZXh0cmFfYml0czsKKyAgICBWUDhMUHV0Qml0cyhidywgaHVmZm1hbl9jb2RlLT5jb2Rlc1tpeF0sIGh1ZmZtYW5fY29kZS0+Y29kZV9sZW5ndGhzW2l4XSk7CisgICAgc3dpdGNoIChpeCkgeworICAgICAgY2FzZSAxNjoKKyAgICAgICAgVlA4TFB1dEJpdHMoYncsIGV4dHJhX2JpdHMsIDIpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgMTc6CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBleHRyYV9iaXRzLCAzKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDE4OgorICAgICAgICBWUDhMUHV0Qml0cyhidywgZXh0cmFfYml0cywgNyk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCisvLyAnaHVmZl90cmVlJyBhbmQgJ3Rva2VucycgYXJlIHByZS1hbGxvYWN0ZWQgYnVmZmVycy4KK3N0YXRpYyB2b2lkIFN0b3JlRnVsbEh1ZmZtYW5Db2RlKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSkgeworICB1aW50OF90IGNvZGVfbGVuZ3RoX2JpdGRlcHRoW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICB1aW50MTZfdCBjb2RlX2xlbmd0aF9iaXRkZXB0aF9zeW1ib2xzW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICBjb25zdCBpbnQgbWF4X3Rva2VucyA9IHRyZWUtPm51bV9zeW1ib2xzOworICBpbnQgbnVtX3Rva2VuczsKKyAgSHVmZm1hblRyZWVDb2RlIGh1ZmZtYW5fY29kZTsKKyAgaHVmZm1hbl9jb2RlLm51bV9zeW1ib2xzID0gQ09ERV9MRU5HVEhfQ09ERVM7CisgIGh1ZmZtYW5fY29kZS5jb2RlX2xlbmd0aHMgPSBjb2RlX2xlbmd0aF9iaXRkZXB0aDsKKyAgaHVmZm1hbl9jb2RlLmNvZGVzID0gY29kZV9sZW5ndGhfYml0ZGVwdGhfc3ltYm9sczsKKworICBWUDhMUHV0Qml0cyhidywgMCwgMSk7CisgIG51bV90b2tlbnMgPSBWUDhMQ3JlYXRlQ29tcHJlc3NlZEh1ZmZtYW5UcmVlKHRyZWUsIHRva2VucywgbWF4X3Rva2Vucyk7CisgIHsKKyAgICB1aW50MzJfdCBoaXN0b2dyYW1bQ09ERV9MRU5HVEhfQ09ERVNdID0geyAwIH07CisgICAgdWludDhfdCBidWZfcmxlW0NPREVfTEVOR1RIX0NPREVTXSA9IHsgMCB9OworICAgIGludCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fdG9rZW5zOyArK2kpIHsKKyAgICAgICsraGlzdG9ncmFtW3Rva2Vuc1tpXS5jb2RlXTsKKyAgICB9CisKKyAgICBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaGlzdG9ncmFtLCA3LCBidWZfcmxlLCBodWZmX3RyZWUsICZodWZmbWFuX2NvZGUpOworICB9CisKKyAgU3RvcmVIdWZmbWFuVHJlZU9mSHVmZm1hblRyZWVUb0JpdE1hc2soYncsIGNvZGVfbGVuZ3RoX2JpdGRlcHRoKTsKKyAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbCgmaHVmZm1hbl9jb2RlKTsKKyAgeworICAgIGludCB0cmFpbGluZ196ZXJvX2JpdHMgPSAwOworICAgIGludCB0cmltbWVkX2xlbmd0aCA9IG51bV90b2tlbnM7CisgICAgaW50IHdyaXRlX3RyaW1tZWRfbGVuZ3RoOworICAgIGludCBsZW5ndGg7CisgICAgaW50IGkgPSBudW1fdG9rZW5zOworICAgIHdoaWxlIChpLS0gPiAwKSB7CisgICAgICBjb25zdCBpbnQgaXggPSB0b2tlbnNbaV0uY29kZTsKKyAgICAgIGlmIChpeCA9PSAwIHx8IGl4ID09IDE3IHx8IGl4ID09IDE4KSB7CisgICAgICAgIC0tdHJpbW1lZF9sZW5ndGg7ICAgLy8gZGlzY291bnQgdHJhaWxpbmcgemVyb3MKKyAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IGNvZGVfbGVuZ3RoX2JpdGRlcHRoW2l4XTsKKyAgICAgICAgaWYgKGl4ID09IDE3KSB7CisgICAgICAgICAgdHJhaWxpbmdfemVyb19iaXRzICs9IDM7CisgICAgICAgIH0gZWxzZSBpZiAoaXggPT0gMTgpIHsKKyAgICAgICAgICB0cmFpbGluZ196ZXJvX2JpdHMgKz0gNzsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIHdyaXRlX3RyaW1tZWRfbGVuZ3RoID0gKHRyaW1tZWRfbGVuZ3RoID4gMSAmJiB0cmFpbGluZ196ZXJvX2JpdHMgPiAxMik7CisgICAgbGVuZ3RoID0gd3JpdGVfdHJpbW1lZF9sZW5ndGggPyB0cmltbWVkX2xlbmd0aCA6IG51bV90b2tlbnM7CisgICAgVlA4TFB1dEJpdHMoYncsIHdyaXRlX3RyaW1tZWRfbGVuZ3RoLCAxKTsKKyAgICBpZiAod3JpdGVfdHJpbW1lZF9sZW5ndGgpIHsKKyAgICAgIGlmICh0cmltbWVkX2xlbmd0aCA9PSAyKSB7CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCAwLCAzICsgMik7ICAgICAvLyBuYml0cGFpcnM9MSwgdHJpbW1lZF9sZW5ndGg9MgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IG5iaXRzID0gQml0c0xvZzJGbG9vcih0cmltbWVkX2xlbmd0aCAtIDIpOworICAgICAgICBjb25zdCBpbnQgbmJpdHBhaXJzID0gbmJpdHMgLyAyICsgMTsKKyAgICAgICAgYXNzZXJ0KHRyaW1tZWRfbGVuZ3RoID4gMik7CisgICAgICAgIGFzc2VydChuYml0cGFpcnMgLSAxIDwgOCk7CisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBuYml0cGFpcnMgLSAxLCAzKTsKKyAgICAgICAgVlA4TFB1dEJpdHMoYncsIHRyaW1tZWRfbGVuZ3RoIC0gMiwgbmJpdHBhaXJzICogMik7CisgICAgICB9CisgICAgfQorICAgIFN0b3JlSHVmZm1hblRyZWVUb0JpdE1hc2soYncsIHRva2VucywgbGVuZ3RoLCAmaHVmZm1hbl9jb2RlKTsKKyAgfQorfQorCisvLyAnaHVmZl90cmVlJyBhbmQgJ3Rva2VucycgYXJlIHByZS1hbGxvYWN0ZWQgYnVmZmVycy4KK3N0YXRpYyB2b2lkIFN0b3JlSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIGNvbnN0IHRva2VucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGUpIHsKKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzeW1ib2xzWzJdID0geyAwLCAwIH07CisgIGNvbnN0IGludCBrTWF4Qml0cyA9IDg7CisgIGNvbnN0IGludCBrTWF4U3ltYm9sID0gMSA8PCBrTWF4Qml0czsKKworICAvLyBDaGVjayB3aGV0aGVyIGl0J3MgYSBzbWFsbCB0cmVlLgorICBmb3IgKGkgPSAwOyBpIDwgaHVmZm1hbl9jb2RlLT5udW1fc3ltYm9scyAmJiBjb3VudCA8IDM7ICsraSkgeworICAgIGlmIChodWZmbWFuX2NvZGUtPmNvZGVfbGVuZ3Roc1tpXSAhPSAwKSB7CisgICAgICBpZiAoY291bnQgPCAyKSBzeW1ib2xzW2NvdW50XSA9IGk7CisgICAgICArK2NvdW50OworICAgIH0KKyAgfQorCisgIGlmIChjb3VudCA9PSAwKSB7ICAgLy8gZW1pdCBtaW5pbWFsIHRyZWUgZm9yIGVtcHR5IGNhc2VzCisgICAgLy8gYml0czogc21hbGwgdHJlZSBtYXJrZXI6IDEsIGNvdW50LTE6IDAsIGxhcmdlIDgtYml0IGNvZGU6IDAsIGNvZGU6IDAKKyAgICBWUDhMUHV0Qml0cyhidywgMHgwMSwgNCk7CisgIH0gZWxzZSBpZiAoY291bnQgPD0gMiAmJiBzeW1ib2xzWzBdIDwga01heFN5bWJvbCAmJiBzeW1ib2xzWzFdIDwga01heFN5bWJvbCkgeworICAgIFZQOExQdXRCaXRzKGJ3LCAxLCAxKTsgIC8vIFNtYWxsIHRyZWUgbWFya2VyIHRvIGVuY29kZSAxIG9yIDIgc3ltYm9scy4KKyAgICBWUDhMUHV0Qml0cyhidywgY291bnQgLSAxLCAxKTsKKyAgICBpZiAoc3ltYm9sc1swXSA8PSAxKSB7CisgICAgICBWUDhMUHV0Qml0cyhidywgMCwgMSk7ICAvLyBDb2RlIGJpdCBmb3Igc21hbGwgKDEgYml0KSBzeW1ib2wgdmFsdWUuCisgICAgICBWUDhMUHV0Qml0cyhidywgc3ltYm9sc1swXSwgMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCAxLCAxKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCBzeW1ib2xzWzBdLCA4KTsKKyAgICB9CisgICAgaWYgKGNvdW50ID09IDIpIHsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCBzeW1ib2xzWzFdLCA4KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgU3RvcmVGdWxsSHVmZm1hbkNvZGUoYncsIGh1ZmZfdHJlZSwgdG9rZW5zLCBodWZmbWFuX2NvZGUpOworICB9Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFdyaXRlSHVmZm1hbkNvZGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGVfaW5kZXgpIHsKKyAgY29uc3QgaW50IGRlcHRoID0gY29kZS0+Y29kZV9sZW5ndGhzW2NvZGVfaW5kZXhdOworICBjb25zdCBpbnQgc3ltYm9sID0gY29kZS0+Y29kZXNbY29kZV9pbmRleF07CisgIFZQOExQdXRCaXRzKGJ3LCBzeW1ib2wsIGRlcHRoKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgV3JpdGVIdWZmbWFuQ29kZVdpdGhFeHRyYUJpdHMoCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsCisgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlLAorICAgIGludCBjb2RlX2luZGV4LAorICAgIGludCBiaXRzLAorICAgIGludCBuX2JpdHMpIHsKKyAgY29uc3QgaW50IGRlcHRoID0gY29kZS0+Y29kZV9sZW5ndGhzW2NvZGVfaW5kZXhdOworICBjb25zdCBpbnQgc3ltYm9sID0gY29kZS0+Y29kZXNbY29kZV9pbmRleF07CisgIFZQOExQdXRCaXRzKGJ3LCAoYml0cyA8PCBkZXB0aCkgfCBzeW1ib2wsIGRlcHRoICsgbl9iaXRzKTsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFN0b3JlSW1hZ2VUb0JpdE1hc2soCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCB3aWR0aCwgaW50IGhpc3RvX2JpdHMsCisgICAgY29uc3QgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmcywKKyAgICBjb25zdCB1aW50MTZfdCogaGlzdG9ncmFtX3N5bWJvbHMsCisgICAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBodWZmbWFuX2NvZGVzKSB7CisgIGNvbnN0IGludCBoaXN0b194c2l6ZSA9IGhpc3RvX2JpdHMgPyBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgaGlzdG9fYml0cykgOiAxOworICBjb25zdCBpbnQgdGlsZV9tYXNrID0gKGhpc3RvX2JpdHMgPT0gMCkgPyAwIDogLSgxIDw8IGhpc3RvX2JpdHMpOworICAvLyB4IGFuZCB5IHRyYWNlIHRoZSBwb3NpdGlvbiBpbiB0aGUgaW1hZ2UuCisgIGludCB4ID0gMDsKKyAgaW50IHkgPSAwOworICBpbnQgdGlsZV94ID0geCAmIHRpbGVfbWFzazsKKyAgaW50IHRpbGVfeSA9IHkgJiB0aWxlX21hc2s7CisgIGludCBoaXN0b2dyYW1faXggPSBoaXN0b2dyYW1fc3ltYm9sc1swXTsKKyAgY29uc3QgSHVmZm1hblRyZWVDb2RlKiBjb2RlcyA9IGh1ZmZtYW5fY29kZXMgKyA1ICogaGlzdG9ncmFtX2l4OworICBWUDhMUmVmc0N1cnNvciBjID0gVlA4TFJlZnNDdXJzb3JJbml0KHJlZnMpOworICB3aGlsZSAoVlA4TFJlZnNDdXJzb3JPaygmYykpIHsKKyAgICBjb25zdCBQaXhPckNvcHkqIGNvbnN0IHYgPSBjLmN1cl9wb3M7CisgICAgaWYgKCh0aWxlX3ggIT0gKHggJiB0aWxlX21hc2spKSB8fCAodGlsZV95ICE9ICh5ICYgdGlsZV9tYXNrKSkpIHsKKyAgICAgIHRpbGVfeCA9IHggJiB0aWxlX21hc2s7CisgICAgICB0aWxlX3kgPSB5ICYgdGlsZV9tYXNrOworICAgICAgaGlzdG9ncmFtX2l4ID0gaGlzdG9ncmFtX3N5bWJvbHNbKHkgPj4gaGlzdG9fYml0cykgKiBoaXN0b194c2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeCA+PiBoaXN0b19iaXRzKV07CisgICAgICBjb2RlcyA9IGh1ZmZtYW5fY29kZXMgKyA1ICogaGlzdG9ncmFtX2l4OworICAgIH0KKyAgICBpZiAoUGl4T3JDb3B5SXNMaXRlcmFsKHYpKSB7CisgICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBvcmRlcltdID0geyAxLCAyLCAwLCAzIH07CisgICAgICBpbnQgazsKKyAgICAgIGZvciAoayA9IDA7IGsgPCA0OyArK2spIHsKKyAgICAgICAgY29uc3QgaW50IGNvZGUgPSBQaXhPckNvcHlMaXRlcmFsKHYsIG9yZGVyW2tdKTsKKyAgICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMgKyBrLCBjb2RlKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgaWYgKFBpeE9yQ29weUlzQ2FjaGVJZHgodikpIHsKKyAgICAgIGNvbnN0IGludCBjb2RlID0gUGl4T3JDb3B5Q2FjaGVJZHgodik7CisgICAgICBjb25zdCBpbnQgbGl0ZXJhbF9peCA9IDI1NiArIE5VTV9MRU5HVEhfQ09ERVMgKyBjb2RlOworICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMsIGxpdGVyYWxfaXgpOworICAgIH0gZWxzZSB7CisgICAgICBpbnQgYml0cywgbl9iaXRzOworICAgICAgaW50IGNvZGU7CisKKyAgICAgIGNvbnN0IGludCBkaXN0YW5jZSA9IFBpeE9yQ29weURpc3RhbmNlKHYpOworICAgICAgVlA4TFByZWZpeEVuY29kZSh2LT5sZW4sICZjb2RlLCAmbl9iaXRzLCAmYml0cyk7CisgICAgICBXcml0ZUh1ZmZtYW5Db2RlV2l0aEV4dHJhQml0cyhidywgY29kZXMsIDI1NiArIGNvZGUsIGJpdHMsIG5fYml0cyk7CisKKyAgICAgIC8vIERvbid0IHdyaXRlIHRoZSBkaXN0YW5jZSB3aXRoIHRoZSBleHRyYSBiaXRzIGNvZGUgc2luY2UKKyAgICAgIC8vIHRoZSBkaXN0YW5jZSBjYW4gYmUgdXAgdG8gMTggYml0cyBvZiBleHRyYSBiaXRzLCBhbmQgdGhlIHByZWZpeAorICAgICAgLy8gMTUgYml0cywgdG90YWxpbmcgdG8gMzMsIGFuZCBvdXIgUHV0Qml0cyBvbmx5IHN1cHBvcnRzIHVwIHRvIDMyIGJpdHMuCisgICAgICBWUDhMUHJlZml4RW5jb2RlKGRpc3RhbmNlLCAmY29kZSwgJm5fYml0cywgJmJpdHMpOworICAgICAgV3JpdGVIdWZmbWFuQ29kZShidywgY29kZXMgKyA0LCBjb2RlKTsKKyAgICAgIFZQOExQdXRCaXRzKGJ3LCBiaXRzLCBuX2JpdHMpOworICAgIH0KKyAgICB4ICs9IFBpeE9yQ29weUxlbmd0aCh2KTsKKyAgICB3aGlsZSAoeCA+PSB3aWR0aCkgeworICAgICAgeCAtPSB3aWR0aDsKKyAgICAgICsreTsKKyAgICB9CisgICAgVlA4TFJlZnNDdXJzb3JOZXh0KCZjKTsKKyAgfQorICByZXR1cm4gYnctPmVycm9yXyA/IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSA6IFZQOF9FTkNfT0s7Cit9CisKKy8vIFNwZWNpYWwgY2FzZSBvZiBFbmNvZGVJbWFnZUludGVybmFsKCkgZm9yIGNhY2hlLWJpdHM9MCwgaGlzdG9fYml0cz0zMQorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEVuY29kZUltYWdlTm9IdWZmbWFuKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJhY2t3YXJkUmVmcyogY29uc3QgcmVmc190bXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCYWNrd2FyZFJlZnMqIGNvbnN0IHJlZnNfdG1wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHksIGludCBsb3dfZWZmb3J0KSB7CisgIGludCBpOworICBpbnQgbWF4X3Rva2VucyA9IDA7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIFZQOExCYWNrd2FyZFJlZnMqIHJlZnM7CisgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucyA9IE5VTEw7CisgIEh1ZmZtYW5UcmVlQ29kZSBodWZmbWFuX2NvZGVzWzVdID0geyB7IDAsIE5VTEwsIE5VTEwgfSB9OworICBjb25zdCB1aW50MTZfdCBoaXN0b2dyYW1fc3ltYm9sc1sxXSA9IHsgMCB9OyAgICAvLyBvbmx5IG9uZSB0cmVlLCBvbmUgc3ltYm9sCisgIGludCBjYWNoZV9iaXRzID0gMDsKKyAgVlA4TEhpc3RvZ3JhbVNldCogaGlzdG9ncmFtX2ltYWdlID0gTlVMTDsKKyAgSHVmZm1hblRyZWUqIGNvbnN0IGh1ZmZfdHJlZSA9IChIdWZmbWFuVHJlZSopV2ViUFNhZmVNYWxsb2MoCisgICAgICAgIDNVTEwgKiBDT0RFX0xFTkdUSF9DT0RFUywgc2l6ZW9mKCpodWZmX3RyZWUpKTsKKyAgaWYgKGh1ZmZfdHJlZSA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCisgIGlmICghVlA4TEhhc2hDaGFpbkZpbGwoaGFzaF9jaGFpbiwgcXVhbGl0eSwgYXJnYiwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfZWZmb3J0KSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIHJlZnMgPSBWUDhMR2V0QmFja3dhcmRSZWZlcmVuY2VzKHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMWjc3U3RhbmRhcmQgfCBrTFo3N1JMRSwgJmNhY2hlX2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfY2hhaW4sIHJlZnNfdG1wMSwgcmVmc190bXAyKTsKKyAgaWYgKHJlZnMgPT0gTlVMTCkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisgIGhpc3RvZ3JhbV9pbWFnZSA9IFZQOExBbGxvY2F0ZUhpc3RvZ3JhbVNldCgxLCBjYWNoZV9iaXRzKTsKKyAgaWYgKGhpc3RvZ3JhbV9pbWFnZSA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBCdWlsZCBoaXN0b2dyYW0gaW1hZ2UgYW5kIHN5bWJvbHMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorICBWUDhMSGlzdG9ncmFtU3RvcmVSZWZzKHJlZnMsIGhpc3RvZ3JhbV9pbWFnZS0+aGlzdG9ncmFtc1swXSk7CisKKyAgLy8gQ3JlYXRlIEh1ZmZtYW4gYml0IGxlbmd0aHMgYW5kIGNvZGVzIGZvciBlYWNoIGhpc3RvZ3JhbSBpbWFnZS4KKyAgYXNzZXJ0KGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZSA9PSAxKTsKKyAgaWYgKCFHZXRIdWZmQml0TGVuZ3Roc0FuZENvZGVzKGhpc3RvZ3JhbV9pbWFnZSwgaHVmZm1hbl9jb2RlcykpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIE5vIGNvbG9yIGNhY2hlLCBubyBIdWZmbWFuIGltYWdlLgorICBWUDhMUHV0Qml0cyhidywgMCwgMSk7CisKKyAgLy8gRmluZCBtYXhpbXVtIG51bWJlciBvZiBzeW1ib2xzIGZvciB0aGUgaHVmZm1hbiB0cmVlLXNldC4KKyAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkgeworICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICBpZiAobWF4X3Rva2VucyA8IGNvZGVzLT5udW1fc3ltYm9scykgeworICAgICAgbWF4X3Rva2VucyA9IGNvZGVzLT5udW1fc3ltYm9sczsKKyAgICB9CisgIH0KKworICB0b2tlbnMgPSAoSHVmZm1hblRyZWVUb2tlbiopV2ViUFNhZmVNYWxsb2MobWF4X3Rva2Vucywgc2l6ZW9mKCp0b2tlbnMpKTsKKyAgaWYgKHRva2VucyA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICAvLyBTdG9yZSBIdWZmbWFuIGNvZGVzLgorICBmb3IgKGkgPSAwOyBpIDwgNTsgKytpKSB7CisgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOworICAgIFN0b3JlSHVmZm1hbkNvZGUoYncsIGh1ZmZfdHJlZSwgdG9rZW5zLCBjb2Rlcyk7CisgICAgQ2xlYXJIdWZmbWFuVHJlZUlmT25seU9uZVN5bWJvbChjb2Rlcyk7CisgIH0KKworICAvLyBTdG9yZSBhY3R1YWwgbGl0ZXJhbHMuCisgIGVyciA9IFN0b3JlSW1hZ2VUb0JpdE1hc2soYncsIHdpZHRoLCAwLCByZWZzLCBoaXN0b2dyYW1fc3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuX2NvZGVzKTsKKworIEVycm9yOgorICBXZWJQU2FmZUZyZWUodG9rZW5zKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZfdHJlZSk7CisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZSk7CisgIFdlYlBTYWZlRnJlZShodWZmbWFuX2NvZGVzWzBdLmNvZGVzKTsKKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEVuY29kZUltYWdlSW50ZXJuYWwoCisgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGNvbnN0IHVpbnQzMl90KiBjb25zdCBhcmdiLAorICAgIFZQOExIYXNoQ2hhaW4qIGNvbnN0IGhhc2hfY2hhaW4sIFZQOExCYWNrd2FyZFJlZnMgcmVmc19hcnJheVszXSwgaW50IHdpZHRoLAorICAgIGludCBoZWlnaHQsIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwgaW50IHVzZV9jYWNoZSwKKyAgICBjb25zdCBDcnVuY2hDb25maWcqIGNvbnN0IGNvbmZpZywgaW50KiBjYWNoZV9iaXRzLCBpbnQgaGlzdG9ncmFtX2JpdHMsCisgICAgc2l6ZV90IGluaXRfYnl0ZV9wb3NpdGlvbiwgaW50KiBjb25zdCBoZHJfc2l6ZSwgaW50KiBjb25zdCBkYXRhX3NpemUpIHsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgdWludDMyX3QgaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSA9CisgICAgICBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgaGlzdG9ncmFtX2JpdHMpICoKKyAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgaGlzdG9ncmFtX2JpdHMpOworICBWUDhMSGlzdG9ncmFtU2V0KiBoaXN0b2dyYW1faW1hZ2UgPSBOVUxMOworICBWUDhMSGlzdG9ncmFtKiB0bXBfaGlzdG8gPSBOVUxMOworICBpbnQgaGlzdG9ncmFtX2ltYWdlX3NpemUgPSAwOworICBzaXplX3QgYml0X2FycmF5X3NpemUgPSAwOworICBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlID0gKEh1ZmZtYW5UcmVlKilXZWJQU2FmZU1hbGxvYygKKyAgICAgIDNVTEwgKiBDT0RFX0xFTkdUSF9DT0RFUywgc2l6ZW9mKCpodWZmX3RyZWUpKTsKKyAgSHVmZm1hblRyZWVUb2tlbiogdG9rZW5zID0gTlVMTDsKKyAgSHVmZm1hblRyZWVDb2RlKiBodWZmbWFuX2NvZGVzID0gTlVMTDsKKyAgVlA4TEJhY2t3YXJkUmVmcyogcmVmc19iZXN0OworICBWUDhMQmFja3dhcmRSZWZzKiByZWZzX3RtcDsKKyAgdWludDE2X3QqIGNvbnN0IGhpc3RvZ3JhbV9zeW1ib2xzID0KKyAgICAgICh1aW50MTZfdCopV2ViUFNhZmVNYWxsb2MoaGlzdG9ncmFtX2ltYWdlX3h5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpoaXN0b2dyYW1fc3ltYm9scykpOworICBpbnQgbHo3N3NfaWR4OworICBWUDhMQml0V3JpdGVyIGJ3X2luaXQgPSAqYncsIGJ3X2Jlc3Q7CisgIGludCBoZHJfc2l6ZV90bXA7CisgIGFzc2VydChoaXN0b2dyYW1fYml0cyA+PSBNSU5fSFVGRk1BTl9CSVRTKTsKKyAgYXNzZXJ0KGhpc3RvZ3JhbV9iaXRzIDw9IE1BWF9IVUZGTUFOX0JJVFMpOworICBhc3NlcnQoaGRyX3NpemUgIT0gTlVMTCk7CisgIGFzc2VydChkYXRhX3NpemUgIT0gTlVMTCk7CisKKyAgaWYgKGhpc3RvZ3JhbV9zeW1ib2xzID09IE5VTEwpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGlmICh1c2VfY2FjaGUpIHsKKyAgICAvLyBJZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gemVybywgaXQgaGFzIGJlZW4gc2V0IGR1cmluZyB0aGUKKyAgICAvLyBwYWxldHRlIGFuYWx5c2lzLgorICAgIGlmICgqY2FjaGVfYml0cyA9PSAwKSAqY2FjaGVfYml0cyA9IE1BWF9DT0xPUl9DQUNIRV9CSVRTOworICB9IGVsc2UgeworICAgICpjYWNoZV9iaXRzID0gMDsKKyAgfQorICAvLyAnYmVzdF9yZWZzJyBpcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBiZXN0IGJhY2t3YXJkIHJlZnMgYW5kIHBvaW50cyB0byBvbmUKKyAgLy8gb2YgcmVmc19hcnJheVswXSBvciByZWZzX2FycmF5WzFdLgorICAvLyBDYWxjdWxhdGUgYmFja3dhcmQgcmVmZXJlbmNlcyBmcm9tIEFSR0IgaW1hZ2UuCisgIGlmIChodWZmX3RyZWUgPT0gTlVMTCB8fAorICAgICAgIVZQOExIYXNoQ2hhaW5GaWxsKGhhc2hfY2hhaW4sIHF1YWxpdHksIGFyZ2IsIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG93X2VmZm9ydCkgfHwKKyAgICAgICFWUDhMQml0V3JpdGVySW5pdCgmYndfYmVzdCwgMCkgfHwKKyAgICAgIChjb25maWctPmx6NzdzX3R5cGVzX3RvX3RyeV9zaXplXyA+IDEgJiYKKyAgICAgICAhVlA4TEJpdFdyaXRlckNsb25lKGJ3LCAmYndfYmVzdCkpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKyAgZm9yIChsejc3c19pZHggPSAwOyBsejc3c19pZHggPCBjb25maWctPmx6NzdzX3R5cGVzX3RvX3RyeV9zaXplXzsKKyAgICAgICArK2x6NzdzX2lkeCkgeworICAgIHJlZnNfYmVzdCA9IFZQOExHZXRCYWNrd2FyZFJlZmVyZW5jZXMoCisgICAgICAgIHdpZHRoLCBoZWlnaHQsIGFyZ2IsIHF1YWxpdHksIGxvd19lZmZvcnQsCisgICAgICAgIGNvbmZpZy0+bHo3N3NfdHlwZXNfdG9fdHJ5X1tsejc3c19pZHhdLCBjYWNoZV9iaXRzLCBoYXNoX2NoYWluLAorICAgICAgICAmcmVmc19hcnJheVswXSwgJnJlZnNfYXJyYXlbMV0pOworICAgIGlmIChyZWZzX2Jlc3QgPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgLy8gS2VlcCB0aGUgYmVzdCByZWZlcmVuY2VzIGFzaWRlIGFuZCB1c2UgdGhlIG90aGVyIGVsZW1lbnQgZnJvbSB0aGUgZmlyc3QKKyAgICAvLyB0d28gYXMgYSB0ZW1wb3JhcnkgZm9yIGxhdGVyIHVzYWdlLgorICAgIHJlZnNfdG1wID0gJnJlZnNfYXJyYXlbcmVmc19iZXN0ID09ICZyZWZzX2FycmF5WzBdID8gMSA6IDBdOworCisgICAgaGlzdG9ncmFtX2ltYWdlID0KKyAgICAgICAgVlA4TEFsbG9jYXRlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZV94eXNpemUsICpjYWNoZV9iaXRzKTsKKyAgICB0bXBfaGlzdG8gPSBWUDhMQWxsb2NhdGVIaXN0b2dyYW0oKmNhY2hlX2JpdHMpOworICAgIGlmIChoaXN0b2dyYW1faW1hZ2UgPT0gTlVMTCB8fCB0bXBfaGlzdG8gPT0gTlVMTCkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisKKyAgICAvLyBCdWlsZCBoaXN0b2dyYW0gaW1hZ2UgYW5kIHN5bWJvbHMgZnJvbSBiYWNrd2FyZCByZWZlcmVuY2VzLgorICAgIGlmICghVlA4TEdldEhpc3RvSW1hZ2VTeW1ib2xzKHdpZHRoLCBoZWlnaHQsIHJlZnNfYmVzdCwgcXVhbGl0eSwgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fYml0cywgKmNhY2hlX2JpdHMsIGhpc3RvZ3JhbV9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBfaGlzdG8sIGhpc3RvZ3JhbV9zeW1ib2xzKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgLy8gQ3JlYXRlIEh1ZmZtYW4gYml0IGxlbmd0aHMgYW5kIGNvZGVzIGZvciBlYWNoIGhpc3RvZ3JhbSBpbWFnZS4KKyAgICBoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA9IGhpc3RvZ3JhbV9pbWFnZS0+c2l6ZTsKKyAgICBiaXRfYXJyYXlfc2l6ZSA9IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsKKyAgICBodWZmbWFuX2NvZGVzID0gKEh1ZmZtYW5UcmVlQ29kZSopV2ViUFNhZmVDYWxsb2MoYml0X2FycmF5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaHVmZm1hbl9jb2RlcykpOworICAgIC8vIE5vdGU6IHNvbWUgaGlzdG9ncmFtX2ltYWdlIGVudHJpZXMgbWF5IHBvaW50IHRvIHRtcF9oaXN0b3NbXSwgc28gdGhlCisgICAgLy8gbGF0dGVyIG5lZWQgdG8gb3V0bGl2ZSB0aGUgZm9sbG93aW5nIGNhbGwgdG8gR2V0SHVmZkJpdExlbmd0aHNBbmRDb2RlcygpLgorICAgIGlmIChodWZmbWFuX2NvZGVzID09IE5VTEwgfHwKKyAgICAgICAgIUdldEh1ZmZCaXRMZW5ndGhzQW5kQ29kZXMoaGlzdG9ncmFtX2ltYWdlLCBodWZmbWFuX2NvZGVzKSkgeworICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgLy8gRnJlZSBjb21iaW5lZCBoaXN0b2dyYW1zLgorICAgIFZQOExGcmVlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZSk7CisgICAgaGlzdG9ncmFtX2ltYWdlID0gTlVMTDsKKworICAgIC8vIEZyZWUgc2NyYXRjaCBoaXN0b2dyYW1zLgorICAgIFZQOExGcmVlSGlzdG9ncmFtKHRtcF9oaXN0byk7CisgICAgdG1wX2hpc3RvID0gTlVMTDsKKworICAgIC8vIENvbG9yIENhY2hlIHBhcmFtZXRlcnMuCisgICAgaWYgKCpjYWNoZV9iaXRzID4gMCkgeworICAgICAgVlA4TFB1dEJpdHMoYncsIDEsIDEpOworICAgICAgVlA4TFB1dEJpdHMoYncsICpjYWNoZV9iaXRzLCA0KTsKKyAgICB9IGVsc2UgeworICAgICAgVlA4TFB1dEJpdHMoYncsIDAsIDEpOworICAgIH0KKworICAgIC8vIEh1ZmZtYW4gaW1hZ2UgKyBtZXRhIGh1ZmZtYW4uCisgICAgeworICAgICAgY29uc3QgaW50IHdyaXRlX2hpc3RvZ3JhbV9pbWFnZSA9IChoaXN0b2dyYW1faW1hZ2Vfc2l6ZSA+IDEpOworICAgICAgVlA4TFB1dEJpdHMoYncsIHdyaXRlX2hpc3RvZ3JhbV9pbWFnZSwgMSk7CisgICAgICBpZiAod3JpdGVfaGlzdG9ncmFtX2ltYWdlKSB7CisgICAgICAgIHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW1fYXJnYiA9CisgICAgICAgICAgICAodWludDMyX3QqKVdlYlBTYWZlTWFsbG9jKGhpc3RvZ3JhbV9pbWFnZV94eXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqaGlzdG9ncmFtX2FyZ2IpKTsKKyAgICAgICAgaW50IG1heF9pbmRleCA9IDA7CisgICAgICAgIHVpbnQzMl90IGk7CisgICAgICAgIGlmIChoaXN0b2dyYW1fYXJnYiA9PSBOVUxMKSB7CisgICAgICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGhpc3RvZ3JhbV9pbWFnZV94eXNpemU7ICsraSkgeworICAgICAgICAgIGNvbnN0IGludCBzeW1ib2xfaW5kZXggPSBoaXN0b2dyYW1fc3ltYm9sc1tpXSAmIDB4ZmZmZjsKKyAgICAgICAgICBoaXN0b2dyYW1fYXJnYltpXSA9IChzeW1ib2xfaW5kZXggPDwgOCk7CisgICAgICAgICAgaWYgKHN5bWJvbF9pbmRleCA+PSBtYXhfaW5kZXgpIHsKKyAgICAgICAgICAgIG1heF9pbmRleCA9IHN5bWJvbF9pbmRleCArIDE7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGhpc3RvZ3JhbV9pbWFnZV9zaXplID0gbWF4X2luZGV4OworCisgICAgICAgIFZQOExQdXRCaXRzKGJ3LCBoaXN0b2dyYW1fYml0cyAtIDIsIDMpOworICAgICAgICBlcnIgPSBFbmNvZGVJbWFnZU5vSHVmZm1hbigKKyAgICAgICAgICAgIGJ3LCBoaXN0b2dyYW1fYXJnYiwgaGFzaF9jaGFpbiwgcmVmc190bXAsICZyZWZzX2FycmF5WzJdLAorICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGhpc3RvZ3JhbV9iaXRzKSwKKyAgICAgICAgICAgIFZQOExTdWJTYW1wbGVTaXplKGhlaWdodCwgaGlzdG9ncmFtX2JpdHMpLCBxdWFsaXR5LCBsb3dfZWZmb3J0KTsKKyAgICAgICAgV2ViUFNhZmVGcmVlKGhpc3RvZ3JhbV9hcmdiKTsKKyAgICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0KKworICAgIC8vIFN0b3JlIEh1ZmZtYW4gY29kZXMuCisgICAgeworICAgICAgaW50IGk7CisgICAgICBpbnQgbWF4X3Rva2VucyA9IDA7CisgICAgICAvLyBGaW5kIG1heGltdW0gbnVtYmVyIG9mIHN5bWJvbHMgZm9yIHRoZSBodWZmbWFuIHRyZWUtc2V0LgorICAgICAgZm9yIChpID0gMDsgaSA8IDUgKiBoaXN0b2dyYW1faW1hZ2Vfc2l6ZTsgKytpKSB7CisgICAgICAgIEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgY29kZXMgPSAmaHVmZm1hbl9jb2Rlc1tpXTsKKyAgICAgICAgaWYgKG1heF90b2tlbnMgPCBjb2Rlcy0+bnVtX3N5bWJvbHMpIHsKKyAgICAgICAgICBtYXhfdG9rZW5zID0gY29kZXMtPm51bV9zeW1ib2xzOworICAgICAgICB9CisgICAgICB9CisgICAgICB0b2tlbnMgPSAoSHVmZm1hblRyZWVUb2tlbiopV2ViUFNhZmVNYWxsb2MobWF4X3Rva2Vucywgc2l6ZW9mKCp0b2tlbnMpKTsKKyAgICAgIGlmICh0b2tlbnMgPT0gTlVMTCkgeworICAgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICB9CisgICAgICBmb3IgKGkgPSAwOyBpIDwgNSAqIGhpc3RvZ3JhbV9pbWFnZV9zaXplOyArK2kpIHsKKyAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCBjb2RlcyA9ICZodWZmbWFuX2NvZGVzW2ldOworICAgICAgICBTdG9yZUh1ZmZtYW5Db2RlKGJ3LCBodWZmX3RyZWUsIHRva2VucywgY29kZXMpOworICAgICAgICBDbGVhckh1ZmZtYW5UcmVlSWZPbmx5T25lU3ltYm9sKGNvZGVzKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gU3RvcmUgYWN0dWFsIGxpdGVyYWxzLgorICAgIGhkcl9zaXplX3RtcCA9IChpbnQpKFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgLSBpbml0X2J5dGVfcG9zaXRpb24pOworICAgIGVyciA9IFN0b3JlSW1hZ2VUb0JpdE1hc2soYncsIHdpZHRoLCBoaXN0b2dyYW1fYml0cywgcmVmc19iZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX3N5bWJvbHMsIGh1ZmZtYW5fY29kZXMpOworICAgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIHNtYWxsZXN0IGltYWdlIHNvIGZhci4KKyAgICBpZiAobHo3N3NfaWR4ID09IDAgfHwKKyAgICAgICAgVlA4TEJpdFdyaXRlck51bUJ5dGVzKGJ3KSA8IFZQOExCaXRXcml0ZXJOdW1CeXRlcygmYndfYmVzdCkpIHsKKyAgICAgICpoZHJfc2l6ZSA9IGhkcl9zaXplX3RtcDsKKyAgICAgICpkYXRhX3NpemUgPQorICAgICAgICAgIChpbnQpKFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgLSBpbml0X2J5dGVfcG9zaXRpb24gLSAqaGRyX3NpemUpOworICAgICAgVlA4TEJpdFdyaXRlclN3YXAoYncsICZid19iZXN0KTsKKyAgICB9CisgICAgLy8gUmVzZXQgdGhlIGJpdCB3cml0ZXIgZm9yIHRoZSBmb2xsb3dpbmcgaXRlcmF0aW9uIGlmIGFueS4KKyAgICBpZiAoY29uZmlnLT5sejc3c190eXBlc190b190cnlfc2l6ZV8gPiAxKSBWUDhMQml0V3JpdGVyUmVzZXQoJmJ3X2luaXQsIGJ3KTsKKyAgICBXZWJQU2FmZUZyZWUodG9rZW5zKTsKKyAgICB0b2tlbnMgPSBOVUxMOworICAgIGlmIChodWZmbWFuX2NvZGVzICE9IE5VTEwpIHsKKyAgICAgIFdlYlBTYWZlRnJlZShodWZmbWFuX2NvZGVzLT5jb2Rlcyk7CisgICAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcyk7CisgICAgICBodWZmbWFuX2NvZGVzID0gTlVMTDsKKyAgICB9CisgIH0KKyAgVlA4TEJpdFdyaXRlclN3YXAoYncsICZid19iZXN0KTsKKworIEVycm9yOgorICBXZWJQU2FmZUZyZWUodG9rZW5zKTsKKyAgV2ViUFNhZmVGcmVlKGh1ZmZfdHJlZSk7CisgIFZQOExGcmVlSGlzdG9ncmFtU2V0KGhpc3RvZ3JhbV9pbWFnZSk7CisgIFZQOExGcmVlSGlzdG9ncmFtKHRtcF9oaXN0byk7CisgIGlmIChodWZmbWFuX2NvZGVzICE9IE5VTEwpIHsKKyAgICBXZWJQU2FmZUZyZWUoaHVmZm1hbl9jb2Rlcy0+Y29kZXMpOworICAgIFdlYlBTYWZlRnJlZShodWZmbWFuX2NvZGVzKTsKKyAgfQorICBXZWJQU2FmZUZyZWUoaGlzdG9ncmFtX3N5bWJvbHMpOworICBWUDhMQml0V3JpdGVyV2lwZU91dCgmYndfYmVzdCk7CisgIHJldHVybiBlcnI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUcmFuc2Zvcm1zCisKK3N0YXRpYyB2b2lkIEFwcGx5U3VidHJhY3RHcmVlbihWUDhMRW5jb2RlciogY29uc3QgZW5jLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgVlA4TFB1dEJpdHMoYncsIFRSQU5TRk9STV9QUkVTRU5ULCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIFNVQlRSQUNUX0dSRUVOLCAyKTsKKyAgVlA4TFN1YnRyYWN0R3JlZW5Gcm9tQmx1ZUFuZFJlZChlbmMtPmFyZ2JfLCB3aWR0aCAqIGhlaWdodCk7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseVByZWRpY3RGaWx0ZXIoY29uc3QgVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcXVhbGl0eSwgaW50IGxvd19lZmZvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VkX3N1YnRyYWN0X2dyZWVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICBjb25zdCBpbnQgcHJlZF9iaXRzID0gZW5jLT50cmFuc2Zvcm1fYml0c187CisgIGNvbnN0IGludCB0cmFuc2Zvcm1fd2lkdGggPSBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgcHJlZF9iaXRzKTsKKyAgY29uc3QgaW50IHRyYW5zZm9ybV9oZWlnaHQgPSBWUDhMU3ViU2FtcGxlU2l6ZShoZWlnaHQsIHByZWRfYml0cyk7CisgIC8vIHdlIGRpc2FibGUgbmVhci1sb3NzbGVzcyBxdWFudGl6YXRpb24gaWYgcGFsZXR0ZSBpcyB1c2VkLgorICBjb25zdCBpbnQgbmVhcl9sb3NzbGVzc19zdHJlbmd0aCA9IGVuYy0+dXNlX3BhbGV0dGVfID8gMTAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZW5jLT5jb25maWdfLT5uZWFyX2xvc3NsZXNzOworCisgIFZQOExSZXNpZHVhbEltYWdlKHdpZHRoLCBoZWlnaHQsIHByZWRfYml0cywgbG93X2VmZm9ydCwgZW5jLT5hcmdiXywKKyAgICAgICAgICAgICAgICAgICAgZW5jLT5hcmdiX3NjcmF0Y2hfLCBlbmMtPnRyYW5zZm9ybV9kYXRhXywKKyAgICAgICAgICAgICAgICAgICAgbmVhcl9sb3NzbGVzc19zdHJlbmd0aCwgZW5jLT5jb25maWdfLT5leGFjdCwKKyAgICAgICAgICAgICAgICAgICAgdXNlZF9zdWJ0cmFjdF9ncmVlbik7CisgIFZQOExQdXRCaXRzKGJ3LCBUUkFOU0ZPUk1fUFJFU0VOVCwgMSk7CisgIFZQOExQdXRCaXRzKGJ3LCBQUkVESUNUT1JfVFJBTlNGT1JNLCAyKTsKKyAgYXNzZXJ0KHByZWRfYml0cyA+PSAyKTsKKyAgVlA4TFB1dEJpdHMoYncsIHByZWRfYml0cyAtIDIsIDMpOworICByZXR1cm4gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oCisgICAgICBidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sIChWUDhMSGFzaENoYWluKikmZW5jLT5oYXNoX2NoYWluXywKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1swXSwgIC8vIGNhc3QgY29uc3QgYXdheQorICAgICAgKFZQOExCYWNrd2FyZFJlZnMqKSZlbmMtPnJlZnNfWzFdLCB0cmFuc2Zvcm1fd2lkdGgsIHRyYW5zZm9ybV9oZWlnaHQsCisgICAgICBxdWFsaXR5LCBsb3dfZWZmb3J0KTsKK30KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEFwcGx5Q3Jvc3NDb2xvckZpbHRlcihjb25zdCBWUDhMRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBxdWFsaXR5LCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IGNjb2xvcl90cmFuc2Zvcm1fYml0cyA9IGVuYy0+dHJhbnNmb3JtX2JpdHNfOworICBjb25zdCBpbnQgdHJhbnNmb3JtX3dpZHRoID0gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGNjb2xvcl90cmFuc2Zvcm1fYml0cyk7CisgIGNvbnN0IGludCB0cmFuc2Zvcm1faGVpZ2h0ID0gVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBjY29sb3JfdHJhbnNmb3JtX2JpdHMpOworCisgIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKHdpZHRoLCBoZWlnaHQsIGNjb2xvcl90cmFuc2Zvcm1fYml0cywgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5hcmdiXywgZW5jLT50cmFuc2Zvcm1fZGF0YV8pOworICBWUDhMUHV0Qml0cyhidywgVFJBTlNGT1JNX1BSRVNFTlQsIDEpOworICBWUDhMUHV0Qml0cyhidywgQ1JPU1NfQ09MT1JfVFJBTlNGT1JNLCAyKTsKKyAgYXNzZXJ0KGNjb2xvcl90cmFuc2Zvcm1fYml0cyA+PSAyKTsKKyAgVlA4TFB1dEJpdHMoYncsIGNjb2xvcl90cmFuc2Zvcm1fYml0cyAtIDIsIDMpOworICByZXR1cm4gRW5jb2RlSW1hZ2VOb0h1ZmZtYW4oCisgICAgICBidywgZW5jLT50cmFuc2Zvcm1fZGF0YV8sIChWUDhMSGFzaENoYWluKikmZW5jLT5oYXNoX2NoYWluXywKKyAgICAgIChWUDhMQmFja3dhcmRSZWZzKikmZW5jLT5yZWZzX1swXSwgIC8vIGNhc3QgY29uc3QgYXdheQorICAgICAgKFZQOExCYWNrd2FyZFJlZnMqKSZlbmMtPnJlZnNfWzFdLCB0cmFuc2Zvcm1fd2lkdGgsIHRyYW5zZm9ybV9oZWlnaHQsCisgICAgICBxdWFsaXR5LCBsb3dfZWZmb3J0KTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFdyaXRlUmlmZkhlYWRlcihjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmlmZl9zaXplLCBzaXplX3QgdnA4bF9zaXplKSB7CisgIHVpbnQ4X3QgcmlmZltSSUZGX0hFQURFUl9TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhMX1NJR05BVFVSRV9TSVpFXSA9IHsKKyAgICAnUicsICdJJywgJ0YnLCAnRicsIDAsIDAsIDAsIDAsICdXJywgJ0UnLCAnQicsICdQJywKKyAgICAnVicsICdQJywgJzgnLCAnTCcsIDAsIDAsIDAsIDAsIFZQOExfTUFHSUNfQllURSwKKyAgfTsKKyAgUHV0TEUzMihyaWZmICsgVEFHX1NJWkUsICh1aW50MzJfdClyaWZmX3NpemUpOworICBQdXRMRTMyKHJpZmYgKyBSSUZGX0hFQURFUl9TSVpFICsgVEFHX1NJWkUsICh1aW50MzJfdCl2cDhsX3NpemUpOworICBpZiAoIXBpYy0+d3JpdGVyKHJpZmYsIHNpemVvZihyaWZmKSwgcGljKSkgeworICAgIHJldHVybiBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKKyAgfQorICByZXR1cm4gVlA4X0VOQ19PSzsKK30KKworc3RhdGljIGludCBXcml0ZUltYWdlU2l6ZShjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoIC0gMTsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0IC0gMTsKKyAgYXNzZXJ0KHdpZHRoIDwgV0VCUF9NQVhfRElNRU5TSU9OICYmIGhlaWdodCA8IFdFQlBfTUFYX0RJTUVOU0lPTik7CisKKyAgVlA4TFB1dEJpdHMoYncsIHdpZHRoLCBWUDhMX0lNQUdFX1NJWkVfQklUUyk7CisgIFZQOExQdXRCaXRzKGJ3LCBoZWlnaHQsIFZQOExfSU1BR0VfU0laRV9CSVRTKTsKKyAgcmV0dXJuICFidy0+ZXJyb3JfOworfQorCitzdGF0aWMgaW50IFdyaXRlUmVhbEFscGhhQW5kVmVyc2lvbihWUDhMQml0V3JpdGVyKiBjb25zdCBidywgaW50IGhhc19hbHBoYSkgeworICBWUDhMUHV0Qml0cyhidywgaGFzX2FscGhhLCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIFZQOExfVkVSU0lPTiwgVlA4TF9WRVJTSU9OX0JJVFMpOworICByZXR1cm4gIWJ3LT5lcnJvcl87Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBXcml0ZUltYWdlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogY29uc3QgY29kZWRfc2l6ZSkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCB1aW50OF90KiBjb25zdCB3ZWJwbGxfZGF0YSA9IFZQOExCaXRXcml0ZXJGaW5pc2goYncpOworICBjb25zdCBzaXplX3Qgd2VicGxsX3NpemUgPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpOworICBjb25zdCBzaXplX3QgdnA4bF9zaXplID0gVlA4TF9TSUdOQVRVUkVfU0laRSArIHdlYnBsbF9zaXplOworICBjb25zdCBzaXplX3QgcGFkID0gdnA4bF9zaXplICYgMTsKKyAgY29uc3Qgc2l6ZV90IHJpZmZfc2l6ZSA9IFRBR19TSVpFICsgQ0hVTktfSEVBREVSX1NJWkUgKyB2cDhsX3NpemUgKyBwYWQ7CisKKyAgZXJyID0gV3JpdGVSaWZmSGVhZGVyKHBpYywgcmlmZl9zaXplLCB2cDhsX3NpemUpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisKKyAgaWYgKCFwaWMtPndyaXRlcih3ZWJwbGxfZGF0YSwgd2VicGxsX3NpemUsIHBpYykpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKHBhZCkgeworICAgIGNvbnN0IHVpbnQ4X3QgcGFkX2J5dGVbMV0gPSB7IDAgfTsKKyAgICBpZiAoIXBpYy0+d3JpdGVyKHBhZF9ieXRlLCAxLCBwaWMpKSB7CisgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX0JBRF9XUklURTsKKyAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorICB9CisgICpjb2RlZF9zaXplID0gQ0hVTktfSEVBREVSX1NJWkUgKyByaWZmX3NpemU7CisgIHJldHVybiBWUDhfRU5DX09LOworCisgRXJyb3I6CisgIHJldHVybiBlcnI7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIENsZWFyVHJhbnNmb3JtQnVmZmVyKFZQOExFbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgV2ViUFNhZmVGcmVlKGVuYy0+dHJhbnNmb3JtX21lbV8pOworICBlbmMtPnRyYW5zZm9ybV9tZW1fID0gTlVMTDsKKyAgZW5jLT50cmFuc2Zvcm1fbWVtX3NpemVfID0gMDsKK30KKworLy8gQWxsb2NhdGVzIHRoZSBtZW1vcnkgZm9yIGFyZ2IgKFcgeCBIKSBidWZmZXIsIDIgcm93cyBvZiBjb250ZXh0IGZvcgorLy8gcHJlZGljdGlvbiBhbmQgdHJhbnNmb3JtIGRhdGEuCisvLyBGbGFncyBpbmZsdWVuY2luZyB0aGUgbWVtb3J5IGFsbG9jYXRlZDoKKy8vICBlbmMtPnRyYW5zZm9ybV9iaXRzXworLy8gIGVuYy0+dXNlX3ByZWRpY3RfLCBlbmMtPnVzZV9jcm9zc19jb2xvcl8KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihWUDhMRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCB1aW50NjRfdCBpbWFnZV9zaXplID0gd2lkdGggKiBoZWlnaHQ7CisgIC8vIFZQOExSZXNpZHVhbEltYWdlIG5lZWRzIHJvb20gZm9yIDIgc2NhbmxpbmVzIG9mIHVpbnQzMiBwaXhlbHMgd2l0aCBhbiBleHRyYQorICAvLyBwaXhlbCBpbiBlYWNoLCBwbHVzIDIgcmVndWxhciBzY2FubGluZXMgb2YgYnl0ZXMuCisgIC8vIFRPRE8oc2thbCk6IENsZWFuIHVwIGJ5IHVzaW5nIGFyaXRobWV0aWMgaW4gYnl0ZXMgaW5zdGVhZCBvZiB3b3Jkcy4KKyAgY29uc3QgdWludDY0X3QgYXJnYl9zY3JhdGNoX3NpemUgPQorICAgICAgZW5jLT51c2VfcHJlZGljdF8KKyAgICAgICAgICA/ICh3aWR0aCArIDEpICogMiArCisgICAgICAgICAgICAod2lkdGggKiAyICsgc2l6ZW9mKHVpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKHVpbnQzMl90KQorICAgICAgICAgIDogMDsKKyAgY29uc3QgdWludDY0X3QgdHJhbnNmb3JtX2RhdGFfc2l6ZSA9CisgICAgICAoZW5jLT51c2VfcHJlZGljdF8gfHwgZW5jLT51c2VfY3Jvc3NfY29sb3JfKQorICAgICAgICAgID8gVlA4TFN1YlNhbXBsZVNpemUod2lkdGgsIGVuYy0+dHJhbnNmb3JtX2JpdHNfKSAqCisgICAgICAgICAgICAgICAgVlA4TFN1YlNhbXBsZVNpemUoaGVpZ2h0LCBlbmMtPnRyYW5zZm9ybV9iaXRzXykKKyAgICAgICAgICA6IDA7CisgIGNvbnN0IHVpbnQ2NF90IG1heF9hbGlnbm1lbnRfaW5fd29yZHMgPQorICAgICAgKFdFQlBfQUxJR05fQ1NUICsgc2l6ZW9mKHVpbnQzMl90KSAtIDEpIC8gc2l6ZW9mKHVpbnQzMl90KTsKKyAgY29uc3QgdWludDY0X3QgbWVtX3NpemUgPQorICAgICAgaW1hZ2Vfc2l6ZSArIG1heF9hbGlnbm1lbnRfaW5fd29yZHMgKworICAgICAgYXJnYl9zY3JhdGNoX3NpemUgKyBtYXhfYWxpZ25tZW50X2luX3dvcmRzICsKKyAgICAgIHRyYW5zZm9ybV9kYXRhX3NpemU7CisgIHVpbnQzMl90KiBtZW0gPSBlbmMtPnRyYW5zZm9ybV9tZW1fOworICBpZiAobWVtID09IE5VTEwgfHwgbWVtX3NpemUgPiBlbmMtPnRyYW5zZm9ybV9tZW1fc2l6ZV8pIHsKKyAgICBDbGVhclRyYW5zZm9ybUJ1ZmZlcihlbmMpOworICAgIG1lbSA9ICh1aW50MzJfdCopV2ViUFNhZmVNYWxsb2MobWVtX3NpemUsIHNpemVvZigqbWVtKSk7CisgICAgaWYgKG1lbSA9PSBOVUxMKSB7CisgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBlbmMtPnRyYW5zZm9ybV9tZW1fID0gbWVtOworICAgIGVuYy0+dHJhbnNmb3JtX21lbV9zaXplXyA9IChzaXplX3QpbWVtX3NpemU7CisgICAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJOb25lOworICB9CisgIGVuYy0+YXJnYl8gPSBtZW07CisgIG1lbSA9ICh1aW50MzJfdCopV0VCUF9BTElHTihtZW0gKyBpbWFnZV9zaXplKTsKKyAgZW5jLT5hcmdiX3NjcmF0Y2hfID0gbWVtOworICBtZW0gPSAodWludDMyX3QqKVdFQlBfQUxJR04obWVtICsgYXJnYl9zY3JhdGNoX3NpemUpOworICBlbmMtPnRyYW5zZm9ybV9kYXRhXyA9IG1lbTsKKworICBlbmMtPmN1cnJlbnRfd2lkdGhfID0gd2lkdGg7CisgRXJyb3I6CisgIHJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBNYWtlSW5wdXRJbWFnZUNvcHkoVlA4TEVuY29kZXIqIGNvbnN0IGVuYykgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSA9IGVuYy0+cGljXzsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisgIGNvbnN0IGludCBoZWlnaHQgPSBwaWN0dXJlLT5oZWlnaHQ7CisgIGludCB5OworICBlcnIgPSBBbGxvY2F0ZVRyYW5zZm9ybUJ1ZmZlcihlbmMsIHdpZHRoLCBoZWlnaHQpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHJldHVybiBlcnI7CisgIGlmIChlbmMtPmFyZ2JfY29udGVudF8gPT0ga0VuY29kZXJBUkdCKSByZXR1cm4gVlA4X0VOQ19PSzsKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgbWVtY3B5KGVuYy0+YXJnYl8gKyB5ICogd2lkdGgsCisgICAgICAgICAgIHBpY3R1cmUtPmFyZ2IgKyB5ICogcGljdHVyZS0+YXJnYl9zdHJpZGUsCisgICAgICAgICAgIHdpZHRoICogc2l6ZW9mKCplbmMtPmFyZ2JfKSk7CisgIH0KKyAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJBUkdCOworICBhc3NlcnQoZW5jLT5jdXJyZW50X3dpZHRoXyA9PSB3aWR0aCk7CisgIHJldHVybiBWUDhfRU5DX09LOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFNlYXJjaENvbG9yTm9JZHgoY29uc3QgdWludDMyX3Qgc29ydGVkW10sIHVpbnQzMl90IGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaSkgeworICBpbnQgbG93ID0gMDsKKyAgaWYgKHNvcnRlZFtsb3ddID09IGNvbG9yKSByZXR1cm4gbG93OyAgLy8gbG9vcCBpbnZhcmlhbnQ6IHNvcnRlZFtsb3ddICE9IGNvbG9yCisgIHdoaWxlICgxKSB7CisgICAgY29uc3QgaW50IG1pZCA9IChsb3cgKyBoaSkgPj4gMTsKKyAgICBpZiAoc29ydGVkW21pZF0gPT0gY29sb3IpIHsKKyAgICAgIHJldHVybiBtaWQ7CisgICAgfSBlbHNlIGlmIChzb3J0ZWRbbWlkXSA8IGNvbG9yKSB7CisgICAgICBsb3cgPSBtaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgIGhpID0gbWlkOworICAgIH0KKyAgfQorfQorCisjZGVmaW5lIEFQUExZX1BBTEVUVEVfR1JFRURZX01BWCA0CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBTZWFyY2hDb2xvckdyZWVkeShjb25zdCB1aW50MzJfdCBwYWxldHRlW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhbGV0dGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2xvcikgeworICAodm9pZClwYWxldHRlX3NpemU7CisgIGFzc2VydChwYWxldHRlX3NpemUgPCBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVgpOworICBhc3NlcnQoMyA9PSBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVggLSAxKTsKKyAgaWYgKGNvbG9yID09IHBhbGV0dGVbMF0pIHJldHVybiAwOworICBpZiAoY29sb3IgPT0gcGFsZXR0ZVsxXSkgcmV0dXJuIDE7CisgIGlmIChjb2xvciA9PSBwYWxldHRlWzJdKSByZXR1cm4gMjsKKyAgcmV0dXJuIDM7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBBcHBseVBhbGV0dGVIYXNoMCh1aW50MzJfdCBjb2xvcikgeworICAvLyBGb2N1cyBvbiB0aGUgZ3JlZW4gY29sb3IuCisgIHJldHVybiAoY29sb3IgPj4gOCkgJiAweGZmOworfQorCisjZGVmaW5lIFBBTEVUVEVfSU5WX1NJWkVfQklUUyAxMQorI2RlZmluZSBQQUxFVFRFX0lOVl9TSVpFICgxIDw8IFBBTEVUVEVfSU5WX1NJWkVfQklUUykKKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEFwcGx5UGFsZXR0ZUhhc2gxKHVpbnQzMl90IGNvbG9yKSB7CisgIC8vIEZvcmdldCBhYm91dCBhbHBoYS4KKyAgcmV0dXJuICgodWludDMyX3QpKChjb2xvciAmIDB4MDBmZmZmZmZ1KSAqIDQyMjIyNDQwNzF1bGwpKSA+PgorICAgICAgICAgKDMyIC0gUEFMRVRURV9JTlZfU0laRV9CSVRTKTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEFwcGx5UGFsZXR0ZUhhc2gyKHVpbnQzMl90IGNvbG9yKSB7CisgIC8vIEZvcmdldCBhYm91dCBhbHBoYS4KKyAgcmV0dXJuICgodWludDMyX3QpKChjb2xvciAmIDB4MDBmZmZmZmZ1KSAqICgoMXVsbCA8PCAzMSkgLSAxKSkpID4+CisgICAgICAgICAoMzIgLSBQQUxFVFRFX0lOVl9TSVpFX0JJVFMpOworfQorCisvLyBTb3J0IHBhbGV0dGUgaW4gaW5jcmVhc2luZyBvcmRlciBhbmQgcHJlcGFyZSBhbiBpbnZlcnNlIG1hcHBpbmcgYXJyYXkuCitzdGF0aWMgdm9pZCBQcmVwYXJlTWFwVG9QYWxldHRlKGNvbnN0IHVpbnQzMl90IHBhbGV0dGVbXSwgaW50IG51bV9jb2xvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNvcnRlZFtdLCB1aW50MzJfdCBpZHhfbWFwW10pIHsKKyAgaW50IGk7CisgIG1lbWNweShzb3J0ZWQsIHBhbGV0dGUsIG51bV9jb2xvcnMgKiBzaXplb2YoKnNvcnRlZCkpOworICBxc29ydChzb3J0ZWQsIG51bV9jb2xvcnMsIHNpemVvZigqc29ydGVkKSwgUGFsZXR0ZUNvbXBhcmVDb2xvcnNGb3JRc29ydCk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY29sb3JzOyArK2kpIHsKKyAgICBpZHhfbWFwW1NlYXJjaENvbG9yTm9JZHgoc29ydGVkLCBwYWxldHRlW2ldLCBudW1fY29sb3JzKV0gPSBpOworICB9Cit9CisKKy8vIFVzZSAxIHBpeGVsIGNhY2hlIGZvciBBUkdCIHBpeGVscy4KKyNkZWZpbmUgQVBQTFlfUEFMRVRURV9GT1IoQ09MT1JfSU5ERVgpIGRvIHsgICAgICAgICBcCisgIHVpbnQzMl90IHByZXZfcGl4ID0gcGFsZXR0ZVswXTsgICAgICAgICAgICAgICAgICAgXAorICB1aW50MzJfdCBwcmV2X2lkeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZm9yICh5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDMyX3QgcGl4ID0gc3JjW3hdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChwaXggIT0gcHJldl9waXgpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByZXZfaWR4ID0gQ09MT1JfSU5ERVg7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmV2X3BpeCA9IHBpeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICB0bXBfcm93W3hdID0gcHJldl9pZHg7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBWUDhMQnVuZGxlQ29sb3JNYXAodG1wX3Jvdywgd2lkdGgsIHhiaXRzLCBkc3QpOyBcCisgICAgc3JjICs9IHNyY19zdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSBkc3Rfc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9IHdoaWxlICgwKQorCisvLyBSZW1hcCBhcmdiIHZhbHVlcyBpbiBzcmNbXSB0byBwYWNrZWQgcGFsZXR0ZXMgZW50cmllcyBpbiBkc3RbXQorLy8gdXNpbmcgJ3JvdycgYXMgYSB0ZW1wb3JhcnkgYnVmZmVyIG9mIHNpemUgJ3dpZHRoJy4KKy8vIFdlIGFzc3VtZSB0aGF0IGFsbCBzcmNbXSB2YWx1ZXMgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIHBhbGV0dGUuCisvLyBOb3RlOiBzcmNbXSBjYW4gYmUgdGhlIHNhbWUgYXMgZHN0W10KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBBcHBseVBhbGV0dGUoY29uc3QgdWludDMyX3QqIHNyYywgdWludDMyX3Qgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGRzdCwgdWludDMyX3QgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIHBhbGV0dGUsIGludCBwYWxldHRlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHhiaXRzKSB7CisgIC8vIFRPRE8oc2thbCk6IHRoaXMgdG1wIGJ1ZmZlciBpcyBub3QgbmVlZGVkIGlmIFZQOExCdW5kbGVDb2xvck1hcCgpIGNhbiBiZQorICAvLyBtYWRlIHRvIHdvcmsgaW4tcGxhY2UuCisgIHVpbnQ4X3QqIGNvbnN0IHRtcF9yb3cgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2Mod2lkdGgsIHNpemVvZigqdG1wX3JvdykpOworICBpbnQgeCwgeTsKKworICBpZiAodG1wX3JvdyA9PSBOVUxMKSByZXR1cm4gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworCisgIGlmIChwYWxldHRlX3NpemUgPCBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVgpIHsKKyAgICBBUFBMWV9QQUxFVFRFX0ZPUihTZWFyY2hDb2xvckdyZWVkeShwYWxldHRlLCBwYWxldHRlX3NpemUsIHBpeCkpOworICB9IGVsc2UgeworICAgIGludCBpLCBqOworICAgIHVpbnQxNl90IGJ1ZmZlcltQQUxFVFRFX0lOVl9TSVpFXTsKKyAgICB1aW50MzJfdCAoKmNvbnN0IGhhc2hfZnVuY3Rpb25zW10pKHVpbnQzMl90KSA9IHsKKyAgICAgICAgQXBwbHlQYWxldHRlSGFzaDAsIEFwcGx5UGFsZXR0ZUhhc2gxLCBBcHBseVBhbGV0dGVIYXNoMgorICAgIH07CisKKyAgICAvLyBUcnkgdG8gZmluZCBhIHBlcmZlY3QgaGFzaCBmdW5jdGlvbiBhYmxlIHRvIGdvIGZyb20gYSBjb2xvciB0byBhbiBpbmRleAorICAgIC8vIHdpdGhpbiAxIDw8IFBBTEVUVEVfSU5WX1NJWkVfQklUUyBpbiBvcmRlciB0byBidWlsZCBhIGhhc2ggbWFwIHRvIGdvCisgICAgLy8gZnJvbSBjb2xvciB0byBpbmRleCBpbiBwYWxldHRlLgorICAgIGZvciAoaSA9IDA7IGkgPCAzOyArK2kpIHsKKyAgICAgIGludCB1c2VfTFVUID0gMTsKKyAgICAgIC8vIFNldCBlYWNoIGVsZW1lbnQgaW4gYnVmZmVyIHRvIG1heCB1aW50MTZfdC4KKyAgICAgIG1lbXNldChidWZmZXIsIDB4ZmYsIHNpemVvZihidWZmZXIpKTsKKyAgICAgIGZvciAoaiA9IDA7IGogPCBwYWxldHRlX3NpemU7ICsraikgeworICAgICAgICBjb25zdCB1aW50MzJfdCBpbmQgPSBoYXNoX2Z1bmN0aW9uc1tpXShwYWxldHRlW2pdKTsKKyAgICAgICAgaWYgKGJ1ZmZlcltpbmRdICE9IDB4ZmZmZnUpIHsKKyAgICAgICAgICB1c2VfTFVUID0gMDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBidWZmZXJbaW5kXSA9IGo7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmICh1c2VfTFVUKSBicmVhazsKKyAgICB9CisKKyAgICBpZiAoaSA9PSAwKSB7CisgICAgICBBUFBMWV9QQUxFVFRFX0ZPUihidWZmZXJbQXBwbHlQYWxldHRlSGFzaDAocGl4KV0pOworICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7CisgICAgICBBUFBMWV9QQUxFVFRFX0ZPUihidWZmZXJbQXBwbHlQYWxldHRlSGFzaDEocGl4KV0pOworICAgIH0gZWxzZSBpZiAoaSA9PSAyKSB7CisgICAgICBBUFBMWV9QQUxFVFRFX0ZPUihidWZmZXJbQXBwbHlQYWxldHRlSGFzaDIocGl4KV0pOworICAgIH0gZWxzZSB7CisgICAgICB1aW50MzJfdCBpZHhfbWFwW01BWF9QQUxFVFRFX1NJWkVdOworICAgICAgdWludDMyX3QgcGFsZXR0ZV9zb3J0ZWRbTUFYX1BBTEVUVEVfU0laRV07CisgICAgICBQcmVwYXJlTWFwVG9QYWxldHRlKHBhbGV0dGUsIHBhbGV0dGVfc2l6ZSwgcGFsZXR0ZV9zb3J0ZWQsIGlkeF9tYXApOworICAgICAgQVBQTFlfUEFMRVRURV9GT1IoCisgICAgICAgICAgaWR4X21hcFtTZWFyY2hDb2xvck5vSWR4KHBhbGV0dGVfc29ydGVkLCBwaXgsIHBhbGV0dGVfc2l6ZSldKTsKKyAgICB9CisgIH0KKyAgV2ViUFNhZmVGcmVlKHRtcF9yb3cpOworICByZXR1cm4gVlA4X0VOQ19PSzsKK30KKyN1bmRlZiBBUFBMWV9QQUxFVFRFX0ZPUgorI3VuZGVmIFBBTEVUVEVfSU5WX1NJWkVfQklUUworI3VuZGVmIFBBTEVUVEVfSU5WX1NJWkUKKyN1bmRlZiBBUFBMWV9QQUxFVFRFX0dSRUVEWV9NQVgKKworLy8gTm90ZTogRXhwZWN0cyAiZW5jLT5wYWxldHRlXyIgdG8gYmUgc2V0IHByb3Blcmx5Lgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIE1hcEltYWdlRnJvbVBhbGV0dGUoVlA4TEVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbl9wbGFjZSkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljID0gZW5jLT5waWNfOworICBjb25zdCBpbnQgd2lkdGggPSBwaWMtPndpZHRoOworICBjb25zdCBpbnQgaGVpZ2h0ID0gcGljLT5oZWlnaHQ7CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwYWxldHRlID0gZW5jLT5wYWxldHRlXzsKKyAgY29uc3QgdWludDMyX3QqIHNyYyA9IGluX3BsYWNlID8gZW5jLT5hcmdiXyA6IHBpYy0+YXJnYjsKKyAgY29uc3QgaW50IHNyY19zdHJpZGUgPSBpbl9wbGFjZSA/IGVuYy0+Y3VycmVudF93aWR0aF8gOiBwaWMtPmFyZ2Jfc3RyaWRlOworICBjb25zdCBpbnQgcGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOworICBpbnQgeGJpdHM7CisKKyAgLy8gUmVwbGFjZSBlYWNoIGlucHV0IHBpeGVsIGJ5IGNvcnJlc3BvbmRpbmcgcGFsZXR0ZSBpbmRleC4KKyAgLy8gVGhpcyBpcyBkb25lIGxpbmUgYnkgbGluZS4KKyAgaWYgKHBhbGV0dGVfc2l6ZSA8PSA0KSB7CisgICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDIpID8gMyA6IDI7CisgIH0gZWxzZSB7CisgICAgeGJpdHMgPSAocGFsZXR0ZV9zaXplIDw9IDE2KSA/IDEgOiAwOworICB9CisKKyAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCBWUDhMU3ViU2FtcGxlU2l6ZSh3aWR0aCwgeGJpdHMpLCBoZWlnaHQpOworICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIHJldHVybiBlcnI7CisKKyAgZXJyID0gQXBwbHlQYWxldHRlKHNyYywgc3JjX3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgIGVuYy0+YXJnYl8sIGVuYy0+Y3VycmVudF93aWR0aF8sCisgICAgICAgICAgICAgICAgICAgICBwYWxldHRlLCBwYWxldHRlX3NpemUsIHdpZHRoLCBoZWlnaHQsIHhiaXRzKTsKKyAgZW5jLT5hcmdiX2NvbnRlbnRfID0ga0VuY29kZXJQYWxldHRlOworICByZXR1cm4gZXJyOworfQorCisvLyBTYXZlIHBhbGV0dGVfW10gdG8gYml0c3RyZWFtLgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEVuY29kZVBhbGV0dGUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYykgeworICBpbnQgaTsKKyAgdWludDMyX3QgdG1wX3BhbGV0dGVbTUFYX1BBTEVUVEVfU0laRV07CisgIGNvbnN0IGludCBwYWxldHRlX3NpemUgPSBlbmMtPnBhbGV0dGVfc2l6ZV87CisgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwYWxldHRlID0gZW5jLT5wYWxldHRlXzsKKyAgVlA4TFB1dEJpdHMoYncsIFRSQU5TRk9STV9QUkVTRU5ULCAxKTsKKyAgVlA4TFB1dEJpdHMoYncsIENPTE9SX0lOREVYSU5HX1RSQU5TRk9STSwgMik7CisgIGFzc2VydChwYWxldHRlX3NpemUgPj0gMSAmJiBwYWxldHRlX3NpemUgPD0gTUFYX1BBTEVUVEVfU0laRSk7CisgIFZQOExQdXRCaXRzKGJ3LCBwYWxldHRlX3NpemUgLSAxLCA4KTsKKyAgZm9yIChpID0gcGFsZXR0ZV9zaXplIC0gMTsgaSA+PSAxOyAtLWkpIHsKKyAgICB0bXBfcGFsZXR0ZVtpXSA9IFZQOExTdWJQaXhlbHMocGFsZXR0ZVtpXSwgcGFsZXR0ZVtpIC0gMV0pOworICB9CisgIHRtcF9wYWxldHRlWzBdID0gcGFsZXR0ZVswXTsKKyAgcmV0dXJuIEVuY29kZUltYWdlTm9IdWZmbWFuKGJ3LCB0bXBfcGFsZXR0ZSwgJmVuYy0+aGFzaF9jaGFpbl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jLT5yZWZzX1swXSwgJmVuYy0+cmVmc19bMV0sIHBhbGV0dGVfc2l6ZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwIC8qIHF1YWxpdHkgKi8sIGxvd19lZmZvcnQpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEVuY29kZXIKKworc3RhdGljIFZQOExFbmNvZGVyKiBWUDhMRW5jb2Rlck5ldyhjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlKSB7CisgIFZQOExFbmNvZGVyKiBjb25zdCBlbmMgPSAoVlA4TEVuY29kZXIqKVdlYlBTYWZlQ2FsbG9jKDFVTEwsIHNpemVvZigqZW5jKSk7CisgIGlmIChlbmMgPT0gTlVMTCkgeworICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWSk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgZW5jLT5jb25maWdfID0gY29uZmlnOworICBlbmMtPnBpY18gPSBwaWN0dXJlOworICBlbmMtPmFyZ2JfY29udGVudF8gPSBrRW5jb2Rlck5vbmU7CisKKyAgVlA4TEVuY0RzcEluaXQoKTsKKworICByZXR1cm4gZW5jOworfQorCitzdGF0aWMgdm9pZCBWUDhMRW5jb2RlckRlbGV0ZShWUDhMRW5jb2RlciogZW5jKSB7CisgIGlmIChlbmMgIT0gTlVMTCkgeworICAgIGludCBpOworICAgIFZQOExIYXNoQ2hhaW5DbGVhcigmZW5jLT5oYXNoX2NoYWluXyk7CisgICAgZm9yIChpID0gMDsgaSA8IDM7ICsraSkgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKCZlbmMtPnJlZnNfW2ldKTsKKyAgICBDbGVhclRyYW5zZm9ybUJ1ZmZlcihlbmMpOworICAgIFdlYlBTYWZlRnJlZShlbmMpOworICB9Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNYWluIGNhbGwKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWdfOworICBjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZV87CisgIFZQOExCaXRXcml0ZXIqIGJ3XzsKKyAgVlA4TEVuY29kZXIqIGVuY187CisgIGludCB1c2VfY2FjaGVfOworICBDcnVuY2hDb25maWcgY3J1bmNoX2NvbmZpZ3NfW0NSVU5DSF9DT05GSUdTX01BWF07CisgIGludCBudW1fY3J1bmNoX2NvbmZpZ3NfOworICBpbnQgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvXzsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyXzsKKyAgV2ViUEF1eFN0YXRzKiBzdGF0c187Cit9IFN0cmVhbUVuY29kZUNvbnRleHQ7CisKK3N0YXRpYyBpbnQgRW5jb2RlU3RyZWFtSG9vayh2b2lkKiBpbnB1dCwgdm9pZCogZGF0YTIpIHsKKyAgU3RyZWFtRW5jb2RlQ29udGV4dCogY29uc3QgcGFyYW1zID0gKFN0cmVhbUVuY29kZUNvbnRleHQqKWlucHV0OworICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWcgPSBwYXJhbXMtPmNvbmZpZ187CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWN0dXJlID0gcGFyYW1zLT5waWN0dXJlXzsKKyAgVlA4TEJpdFdyaXRlciogY29uc3QgYncgPSBwYXJhbXMtPmJ3XzsKKyAgVlA4TEVuY29kZXIqIGNvbnN0IGVuYyA9IHBhcmFtcy0+ZW5jXzsKKyAgY29uc3QgaW50IHVzZV9jYWNoZSA9IHBhcmFtcy0+dXNlX2NhY2hlXzsKKyAgY29uc3QgQ3J1bmNoQ29uZmlnKiBjb25zdCBjcnVuY2hfY29uZmlncyA9IHBhcmFtcy0+Y3J1bmNoX2NvbmZpZ3NfOworICBjb25zdCBpbnQgbnVtX2NydW5jaF9jb25maWdzID0gcGFyYW1zLT5udW1fY3J1bmNoX2NvbmZpZ3NfOworICBjb25zdCBpbnQgcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID0gcGFyYW1zLT5yZWRfYW5kX2JsdWVfYWx3YXlzX3plcm9fOworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBhcmFtcy0+c3RhdHNfOworI2VuZGlmCisgIFdlYlBFbmNvZGluZ0Vycm9yIGVyciA9IFZQOF9FTkNfT0s7CisgIGNvbnN0IGludCBxdWFsaXR5ID0gKGludCljb25maWctPnF1YWxpdHk7CisgIGNvbnN0IGludCBsb3dfZWZmb3J0ID0gKGNvbmZpZy0+bWV0aG9kID09IDApOworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKyAgY29uc3QgaW50IHdpZHRoID0gcGljdHVyZS0+d2lkdGg7CisjZW5kaWYKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpY3R1cmUtPmhlaWdodDsKKyAgY29uc3Qgc2l6ZV90IGJ5dGVfcG9zaXRpb24gPSBWUDhMQml0V3JpdGVyTnVtQnl0ZXMoYncpOworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKyAgaW50IHVzZV9uZWFyX2xvc3NsZXNzID0gMDsKKyNlbmRpZgorICBpbnQgaGRyX3NpemUgPSAwOworICBpbnQgZGF0YV9zaXplID0gMDsKKyAgaW50IHVzZV9kZWx0YV9wYWxldHRlID0gMDsKKyAgaW50IGlkeDsKKyAgc2l6ZV90IGJlc3Rfc2l6ZSA9IDA7CisgIFZQOExCaXRXcml0ZXIgYndfaW5pdCA9ICpidywgYndfYmVzdDsKKyAgKHZvaWQpZGF0YTI7CisKKyAgaWYgKCFWUDhMQml0V3JpdGVySW5pdCgmYndfYmVzdCwgMCkgfHwKKyAgICAgIChudW1fY3J1bmNoX2NvbmZpZ3MgPiAxICYmICFWUDhMQml0V3JpdGVyQ2xvbmUoYncsICZid19iZXN0KSkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2NydW5jaF9jb25maWdzOyArK2lkeCkgeworICAgIGNvbnN0IGludCBlbnRyb3B5X2lkeCA9IGNydW5jaF9jb25maWdzW2lkeF0uZW50cm9weV9pZHhfOworICAgIGVuYy0+dXNlX3BhbGV0dGVfID0gKGVudHJvcHlfaWR4ID09IGtQYWxldHRlKTsKKyAgICBlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8gPQorICAgICAgICAoZW50cm9weV9pZHggPT0ga1N1YkdyZWVuKSB8fCAoZW50cm9weV9pZHggPT0ga1NwYXRpYWxTdWJHcmVlbik7CisgICAgZW5jLT51c2VfcHJlZGljdF8gPQorICAgICAgICAoZW50cm9weV9pZHggPT0ga1NwYXRpYWwpIHx8IChlbnRyb3B5X2lkeCA9PSBrU3BhdGlhbFN1YkdyZWVuKTsKKyAgICBpZiAobG93X2VmZm9ydCkgeworICAgICAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgZW5jLT51c2VfY3Jvc3NfY29sb3JfID0gcmVkX2FuZF9ibHVlX2Fsd2F5c196ZXJvID8gMCA6IGVuYy0+dXNlX3ByZWRpY3RfOworICAgIH0KKyAgICAvLyBSZXNldCBhbnkgcGFyYW1ldGVyIGluIHRoZSBlbmNvZGVyIHRoYXQgaXMgc2V0IGluIHRoZSBwcmV2aW91cyBpdGVyYXRpb24uCisgICAgZW5jLT5jYWNoZV9iaXRzXyA9IDA7CisgICAgVlA4TEJhY2t3YXJkUmVmc0NsZWFyKCZlbmMtPnJlZnNfWzBdKTsKKyAgICBWUDhMQmFja3dhcmRSZWZzQ2xlYXIoJmVuYy0+cmVmc19bMV0pOworCisjaWYgKFdFQlBfTkVBUl9MT1NTTEVTUyA9PSAxKQorICAgIC8vIEFwcGx5IG5lYXItbG9zc2xlc3MgcHJlcHJvY2Vzc2luZy4KKyAgICB1c2VfbmVhcl9sb3NzbGVzcyA9IChjb25maWctPm5lYXJfbG9zc2xlc3MgPCAxMDApICYmICFlbmMtPnVzZV9wYWxldHRlXyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIWVuYy0+dXNlX3ByZWRpY3RfOworICAgIGlmICh1c2VfbmVhcl9sb3NzbGVzcykgeworICAgICAgZXJyID0gQWxsb2NhdGVUcmFuc2Zvcm1CdWZmZXIoZW5jLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIGlmICgoZW5jLT5hcmdiX2NvbnRlbnRfICE9IGtFbmNvZGVyTmVhckxvc3NsZXNzKSAmJgorICAgICAgICAgICFWUDhBcHBseU5lYXJMb3NzbGVzcyhwaWN0dXJlLCBjb25maWctPm5lYXJfbG9zc2xlc3MsIGVuYy0+YXJnYl8pKSB7CisgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgZ290byBFcnJvcjsKKyAgICAgIH0KKyAgICAgIGVuYy0+YXJnYl9jb250ZW50XyA9IGtFbmNvZGVyTmVhckxvc3NsZXNzOworICAgIH0gZWxzZSB7CisgICAgICBlbmMtPmFyZ2JfY29udGVudF8gPSBrRW5jb2Rlck5vbmU7CisgICAgfQorI2Vsc2UKKyAgICBlbmMtPmFyZ2JfY29udGVudF8gPSBrRW5jb2Rlck5vbmU7CisjZW5kaWYKKworICAgIC8vIEVuY29kZSBwYWxldHRlCisgICAgaWYgKGVuYy0+dXNlX3BhbGV0dGVfKSB7CisgICAgICBlcnIgPSBFbmNvZGVQYWxldHRlKGJ3LCBsb3dfZWZmb3J0LCBlbmMpOworICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgZXJyID0gTWFwSW1hZ2VGcm9tUGFsZXR0ZShlbmMsIHVzZV9kZWx0YV9wYWxldHRlKTsKKyAgICAgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgZ290byBFcnJvcjsKKyAgICAgIC8vIElmIHVzaW5nIGEgY29sb3IgY2FjaGUsIGRvIG5vdCBoYXZlIGl0IGJpZ2dlciB0aGFuIHRoZSBudW1iZXIgb2YKKyAgICAgIC8vIGNvbG9ycy4KKyAgICAgIGlmICh1c2VfY2FjaGUgJiYgZW5jLT5wYWxldHRlX3NpemVfIDwgKDEgPDwgTUFYX0NPTE9SX0NBQ0hFX0JJVFMpKSB7CisgICAgICAgIGVuYy0+Y2FjaGVfYml0c18gPSBCaXRzTG9nMkZsb29yKGVuYy0+cGFsZXR0ZV9zaXplXykgKyAxOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIXVzZV9kZWx0YV9wYWxldHRlKSB7CisgICAgICAvLyBJbiBjYXNlIGltYWdlIGlzIG5vdCBwYWNrZWQuCisgICAgICBpZiAoZW5jLT5hcmdiX2NvbnRlbnRfICE9IGtFbmNvZGVyTmVhckxvc3NsZXNzICYmCisgICAgICAgICAgZW5jLT5hcmdiX2NvbnRlbnRfICE9IGtFbmNvZGVyUGFsZXR0ZSkgeworICAgICAgICBlcnIgPSBNYWtlSW5wdXRJbWFnZUNvcHkoZW5jKTsKKyAgICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgfQorCisgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgLy8gQXBwbHkgdHJhbnNmb3JtcyBhbmQgd3JpdGUgdHJhbnNmb3JtIGRhdGEuCisKKyAgICAgIGlmIChlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8pIHsKKyAgICAgICAgQXBwbHlTdWJ0cmFjdEdyZWVuKGVuYywgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBidyk7CisgICAgICB9CisKKyAgICAgIGlmIChlbmMtPnVzZV9wcmVkaWN0XykgeworICAgICAgICBlcnIgPSBBcHBseVByZWRpY3RGaWx0ZXIoZW5jLCBlbmMtPmN1cnJlbnRfd2lkdGhfLCBoZWlnaHQsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dfZWZmb3J0LCBlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8sIGJ3KTsKKyAgICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgfQorCisgICAgICBpZiAoZW5jLT51c2VfY3Jvc3NfY29sb3JfKSB7CisgICAgICAgIGVyciA9IEFwcGx5Q3Jvc3NDb2xvckZpbHRlcihlbmMsIGVuYy0+Y3VycmVudF93aWR0aF8sIGhlaWdodCwgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvd19lZmZvcnQsIGJ3KTsKKyAgICAgICAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworICAgICAgfQorICAgIH0KKworICAgIFZQOExQdXRCaXRzKGJ3LCAhVFJBTlNGT1JNX1BSRVNFTlQsIDEpOyAgLy8gTm8gbW9yZSB0cmFuc2Zvcm1zLgorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEVuY29kZSBhbmQgd3JpdGUgdGhlIHRyYW5zZm9ybWVkIGltYWdlLgorICAgIGVyciA9IEVuY29kZUltYWdlSW50ZXJuYWwoYncsIGVuYy0+YXJnYl8sICZlbmMtPmhhc2hfY2hhaW5fLCBlbmMtPnJlZnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jLT5jdXJyZW50X3dpZHRoXywgaGVpZ2h0LCBxdWFsaXR5LCBsb3dfZWZmb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlX2NhY2hlLCAmY3J1bmNoX2NvbmZpZ3NbaWR4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmMtPmNhY2hlX2JpdHNfLCBlbmMtPmhpc3RvX2JpdHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZV9wb3NpdGlvbiwgJmhkcl9zaXplLCAmZGF0YV9zaXplKTsKKyAgICBpZiAoZXJyICE9IFZQOF9FTkNfT0spIGdvdG8gRXJyb3I7CisKKyAgICAvLyBJZiB3ZSBhcmUgYmV0dGVyIHRoYW4gd2hhdCB3ZSBhbHJlYWR5IGhhdmUuCisgICAgaWYgKGlkeCA9PSAwIHx8IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidykgPCBiZXN0X3NpemUpIHsKKyAgICAgIGJlc3Rfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7CisgICAgICAvLyBTdG9yZSB0aGUgQml0V3JpdGVyLgorICAgICAgVlA4TEJpdFdyaXRlclN3YXAoYncsICZid19iZXN0KTsKKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgICAvLyBVcGRhdGUgdGhlIHN0YXRzLgorICAgICAgaWYgKHN0YXRzICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzID0gMDsKKyAgICAgICAgaWYgKGVuYy0+dXNlX3ByZWRpY3RfKSBzdGF0cy0+bG9zc2xlc3NfZmVhdHVyZXMgfD0gMTsKKyAgICAgICAgaWYgKGVuYy0+dXNlX2Nyb3NzX2NvbG9yXykgc3RhdHMtPmxvc3NsZXNzX2ZlYXR1cmVzIHw9IDI7CisgICAgICAgIGlmIChlbmMtPnVzZV9zdWJ0cmFjdF9ncmVlbl8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSA0OworICAgICAgICBpZiAoZW5jLT51c2VfcGFsZXR0ZV8pIHN0YXRzLT5sb3NzbGVzc19mZWF0dXJlcyB8PSA4OworICAgICAgICBzdGF0cy0+aGlzdG9ncmFtX2JpdHMgPSBlbmMtPmhpc3RvX2JpdHNfOworICAgICAgICBzdGF0cy0+dHJhbnNmb3JtX2JpdHMgPSBlbmMtPnRyYW5zZm9ybV9iaXRzXzsKKyAgICAgICAgc3RhdHMtPmNhY2hlX2JpdHMgPSBlbmMtPmNhY2hlX2JpdHNfOworICAgICAgICBzdGF0cy0+cGFsZXR0ZV9zaXplID0gZW5jLT5wYWxldHRlX3NpemVfOworICAgICAgICBzdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IChpbnQpKGJlc3Rfc2l6ZSAtIGJ5dGVfcG9zaXRpb24pOworICAgICAgICBzdGF0cy0+bG9zc2xlc3NfaGRyX3NpemUgPSBoZHJfc2l6ZTsKKyAgICAgICAgc3RhdHMtPmxvc3NsZXNzX2RhdGFfc2l6ZSA9IGRhdGFfc2l6ZTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICAvLyBSZXNldCB0aGUgYml0IHdyaXRlciBmb3IgdGhlIGZvbGxvd2luZyBpdGVyYXRpb24gaWYgYW55LgorICAgIGlmIChudW1fY3J1bmNoX2NvbmZpZ3MgPiAxKSBWUDhMQml0V3JpdGVyUmVzZXQoJmJ3X2luaXQsIGJ3KTsKKyAgfQorICBWUDhMQml0V3JpdGVyU3dhcCgmYndfYmVzdCwgYncpOworCitFcnJvcjoKKyAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJmJ3X2Jlc3QpOworICBwYXJhbXMtPmVycl8gPSBlcnI7CisgIC8vIFRoZSBob29rIHNob3VsZCByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KKyAgcmV0dXJuIChlcnIgPT0gVlA4X0VOQ19PSyk7Cit9CisKK1dlYlBFbmNvZGluZ0Vycm9yIFZQOExFbmNvZGVTdHJlYW0oY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYndfbWFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9jYWNoZSkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnIgPSBWUDhfRU5DX09LOworICBWUDhMRW5jb2RlciogY29uc3QgZW5jX21haW4gPSBWUDhMRW5jb2Rlck5ldyhjb25maWcsIHBpY3R1cmUpOworICBWUDhMRW5jb2RlciogZW5jX3NpZGUgPSBOVUxMOworICBDcnVuY2hDb25maWcgY3J1bmNoX2NvbmZpZ3NbQ1JVTkNIX0NPTkZJR1NfTUFYXTsKKyAgaW50IG51bV9jcnVuY2hfY29uZmlnc19tYWluLCBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSA9IDA7CisgIGludCBpZHg7CisgIGludCByZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8gPSAwOworICBXZWJQV29ya2VyIHdvcmtlcl9tYWluLCB3b3JrZXJfc2lkZTsKKyAgU3RyZWFtRW5jb2RlQ29udGV4dCBwYXJhbXNfbWFpbiwgcGFyYW1zX3NpZGU7CisgIC8vIFRoZSBtYWluIHRocmVhZCB1c2VzIHBpY3R1cmUtPnN0YXRzLCB0aGUgc2lkZSB0aHJlYWQgdXNlcyBzdGF0c19zaWRlLgorICBXZWJQQXV4U3RhdHMgc3RhdHNfc2lkZTsKKyAgVlA4TEJpdFdyaXRlciBid19zaWRlOworICBjb25zdCBXZWJQV29ya2VySW50ZXJmYWNlKiBjb25zdCB3b3JrZXJfaW50ZXJmYWNlID0gV2ViUEdldFdvcmtlckludGVyZmFjZSgpOworICBpbnQgb2tfbWFpbjsKKworICAvLyBBbmFseXplIGltYWdlIChlbnRyb3B5LCBudW1fcGFsZXR0ZXMgZXRjKQorICBpZiAoZW5jX21haW4gPT0gTlVMTCB8fAorICAgICAgIUVuY29kZXJBbmFseXplKGVuY19tYWluLCBjcnVuY2hfY29uZmlncywgJm51bV9jcnVuY2hfY29uZmlnc19tYWluLAorICAgICAgICAgICAgICAgICAgICAgICZyZWRfYW5kX2JsdWVfYWx3YXlzX3plcm8pIHx8CisgICAgICAhRW5jb2RlckluaXQoZW5jX21haW4pIHx8ICFWUDhMQml0V3JpdGVySW5pdCgmYndfc2lkZSwgMCkpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIC8vIFNwbGl0IHRoZSBjb25maWdzIGJldHdlZW4gdGhlIG1haW4gYW5kIHNpZGUgdGhyZWFkcyAoaWYgYW55KS4KKyAgaWYgKGNvbmZpZy0+dGhyZWFkX2xldmVsID4gMCkgeworICAgIG51bV9jcnVuY2hfY29uZmlnc19zaWRlID0gbnVtX2NydW5jaF9jb25maWdzX21haW4gLyAyOworICAgIGZvciAoaWR4ID0gMDsgaWR4IDwgbnVtX2NydW5jaF9jb25maWdzX3NpZGU7ICsraWR4KSB7CisgICAgICBwYXJhbXNfc2lkZS5jcnVuY2hfY29uZmlnc19baWR4XSA9CisgICAgICAgICAgY3J1bmNoX2NvbmZpZ3NbbnVtX2NydW5jaF9jb25maWdzX21haW4gLSBudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgaWR4XTsKKyAgICB9CisgICAgcGFyYW1zX3NpZGUubnVtX2NydW5jaF9jb25maWdzXyA9IG51bV9jcnVuY2hfY29uZmlnc19zaWRlOworICB9CisgIG51bV9jcnVuY2hfY29uZmlnc19tYWluIC09IG51bV9jcnVuY2hfY29uZmlnc19zaWRlOworICBmb3IgKGlkeCA9IDA7IGlkeCA8IG51bV9jcnVuY2hfY29uZmlnc19tYWluOyArK2lkeCkgeworICAgIHBhcmFtc19tYWluLmNydW5jaF9jb25maWdzX1tpZHhdID0gY3J1bmNoX2NvbmZpZ3NbaWR4XTsKKyAgfQorICBwYXJhbXNfbWFpbi5udW1fY3J1bmNoX2NvbmZpZ3NfID0gbnVtX2NydW5jaF9jb25maWdzX21haW47CisKKyAgLy8gRmlsbCBpbiB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIHRocmVhZCB3b3JrZXJzLgorICB7CisgICAgY29uc3QgaW50IHBhcmFtc19zaXplID0gKG51bV9jcnVuY2hfY29uZmlnc19zaWRlID4gMCkgPyAyIDogMTsKKyAgICBmb3IgKGlkeCA9IDA7IGlkeCA8IHBhcmFtc19zaXplOyArK2lkeCkgeworICAgICAgLy8gQ3JlYXRlIHRoZSBwYXJhbWV0ZXJzIGZvciBlYWNoIHdvcmtlci4KKyAgICAgIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9IChpZHggPT0gMCkgPyAmd29ya2VyX21haW4gOiAmd29ya2VyX3NpZGU7CisgICAgICBTdHJlYW1FbmNvZGVDb250ZXh0KiBjb25zdCBwYXJhbSA9CisgICAgICAgICAgKGlkeCA9PSAwKSA/ICZwYXJhbXNfbWFpbiA6ICZwYXJhbXNfc2lkZTsKKyAgICAgIHBhcmFtLT5jb25maWdfID0gY29uZmlnOworICAgICAgcGFyYW0tPnBpY3R1cmVfID0gcGljdHVyZTsKKyAgICAgIHBhcmFtLT51c2VfY2FjaGVfID0gdXNlX2NhY2hlOworICAgICAgcGFyYW0tPnJlZF9hbmRfYmx1ZV9hbHdheXNfemVyb18gPSByZWRfYW5kX2JsdWVfYWx3YXlzX3plcm87CisgICAgICBpZiAoaWR4ID09IDApIHsKKyAgICAgICAgcGFyYW0tPnN0YXRzXyA9IHBpY3R1cmUtPnN0YXRzOworICAgICAgICBwYXJhbS0+YndfID0gYndfbWFpbjsKKyAgICAgICAgcGFyYW0tPmVuY18gPSBlbmNfbWFpbjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmFtLT5zdGF0c18gPSAocGljdHVyZS0+c3RhdHMgPT0gTlVMTCkgPyBOVUxMIDogJnN0YXRzX3NpZGU7CisgICAgICAgIC8vIENyZWF0ZSBhIHNpZGUgYml0IHdyaXRlci4KKyAgICAgICAgaWYgKCFWUDhMQml0V3JpdGVyQ2xvbmUoYndfbWFpbiwgJmJ3X3NpZGUpKSB7CisgICAgICAgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgICAgICAgIGdvdG8gRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgcGFyYW0tPmJ3XyA9ICZid19zaWRlOworICAgICAgICAvLyBDcmVhdGUgYSBzaWRlIGVuY29kZXIuCisgICAgICAgIGVuY19zaWRlID0gVlA4TEVuY29kZXJOZXcoY29uZmlnLCBwaWN0dXJlKTsKKyAgICAgICAgaWYgKGVuY19zaWRlID09IE5VTEwgfHwgIUVuY29kZXJJbml0KGVuY19zaWRlKSkgeworICAgICAgICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICAgICAgICBnb3RvIEVycm9yOworICAgICAgICB9CisgICAgICAgIC8vIENvcHkgdGhlIHZhbHVlcyB0aGF0IHdlcmUgY29tcHV0ZWQgZm9yIHRoZSBtYWluIGVuY29kZXIuCisgICAgICAgIGVuY19zaWRlLT5oaXN0b19iaXRzXyA9IGVuY19tYWluLT5oaXN0b19iaXRzXzsKKyAgICAgICAgZW5jX3NpZGUtPnRyYW5zZm9ybV9iaXRzXyA9IGVuY19tYWluLT50cmFuc2Zvcm1fYml0c187CisgICAgICAgIGVuY19zaWRlLT5wYWxldHRlX3NpemVfID0gZW5jX21haW4tPnBhbGV0dGVfc2l6ZV87CisgICAgICAgIG1lbWNweShlbmNfc2lkZS0+cGFsZXR0ZV8sIGVuY19tYWluLT5wYWxldHRlXywKKyAgICAgICAgICAgICAgIHNpemVvZihlbmNfbWFpbi0+cGFsZXR0ZV8pKTsKKyAgICAgICAgcGFyYW0tPmVuY18gPSBlbmNfc2lkZTsKKyAgICAgIH0KKyAgICAgIC8vIENyZWF0ZSB0aGUgd29ya2Vycy4KKyAgICAgIHdvcmtlcl9pbnRlcmZhY2UtPkluaXQod29ya2VyKTsKKyAgICAgIHdvcmtlci0+ZGF0YTEgPSBwYXJhbTsKKyAgICAgIHdvcmtlci0+ZGF0YTIgPSBOVUxMOworICAgICAgd29ya2VyLT5ob29rID0gRW5jb2RlU3RyZWFtSG9vazsKKyAgICB9CisgIH0KKworICAvLyBTdGFydCB0aGUgc2Vjb25kIHRocmVhZCBpZiBuZWVkZWQuCisgIGlmIChudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSAhPSAwKSB7CisgICAgaWYgKCF3b3JrZXJfaW50ZXJmYWNlLT5SZXNldCgmd29ya2VyX3NpZGUpKSB7CisgICAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyNpZiAhZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCisgICAgLy8gVGhpcyBsaW5lIGlzIGhlcmUgYW5kIG5vdCBpbiB0aGUgcGFyYW0gaW5pdGlhbGl6YXRpb24gYWJvdmUgdG8gcmVtb3ZlIGEKKyAgICAvLyBDbGFuZyBzdGF0aWMgYW5hbHl6ZXIgd2FybmluZy4KKyAgICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgICAgbWVtY3B5KCZzdGF0c19zaWRlLCBwaWN0dXJlLT5zdGF0cywgc2l6ZW9mKHN0YXRzX3NpZGUpKTsKKyAgICB9CisjZW5kaWYKKyAgICAvLyBUaGlzIGxpbmUgaXMgb25seSB1c2VmdWwgdG8gcmVtb3ZlIGEgQ2xhbmcgc3RhdGljIGFuYWx5emVyIHdhcm5pbmcuCisgICAgcGFyYW1zX3NpZGUuZXJyXyA9IFZQOF9FTkNfT0s7CisgICAgd29ya2VyX2ludGVyZmFjZS0+TGF1bmNoKCZ3b3JrZXJfc2lkZSk7CisgIH0KKyAgLy8gRXhlY3V0ZSB0aGUgbWFpbiB0aHJlYWQuCisgIHdvcmtlcl9pbnRlcmZhY2UtPkV4ZWN1dGUoJndvcmtlcl9tYWluKTsKKyAgb2tfbWFpbiA9IHdvcmtlcl9pbnRlcmZhY2UtPlN5bmMoJndvcmtlcl9tYWluKTsKKyAgd29ya2VyX2ludGVyZmFjZS0+RW5kKCZ3b3JrZXJfbWFpbik7CisgIGlmIChudW1fY3J1bmNoX2NvbmZpZ3Nfc2lkZSAhPSAwKSB7CisgICAgLy8gV2FpdCBmb3IgdGhlIHNlY29uZCB0aHJlYWQuCisgICAgY29uc3QgaW50IG9rX3NpZGUgPSB3b3JrZXJfaW50ZXJmYWNlLT5TeW5jKCZ3b3JrZXJfc2lkZSk7CisgICAgd29ya2VyX2ludGVyZmFjZS0+RW5kKCZ3b3JrZXJfc2lkZSk7CisgICAgaWYgKCFva19tYWluIHx8ICFva19zaWRlKSB7CisgICAgICBlcnIgPSBva19tYWluID8gcGFyYW1zX3NpZGUuZXJyXyA6IHBhcmFtc19tYWluLmVycl87CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgICBpZiAoVlA4TEJpdFdyaXRlck51bUJ5dGVzKCZid19zaWRlKSA8IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhid19tYWluKSkgeworICAgICAgVlA4TEJpdFdyaXRlclN3YXAoYndfbWFpbiwgJmJ3X3NpZGUpOworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgICAgIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgICAgIG1lbWNweShwaWN0dXJlLT5zdGF0cywgJnN0YXRzX3NpZGUsIHNpemVvZigqcGljdHVyZS0+c3RhdHMpKTsKKyAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoIW9rX21haW4pIHsKKyAgICAgIGVyciA9IHBhcmFtc19tYWluLmVycl87CisgICAgICBnb3RvIEVycm9yOworICAgIH0KKyAgfQorCitFcnJvcjoKKyAgVlA4TEJpdFdyaXRlcldpcGVPdXQoJmJ3X3NpZGUpOworICBWUDhMRW5jb2RlckRlbGV0ZShlbmNfbWFpbik7CisgIFZQOExFbmNvZGVyRGVsZXRlKGVuY19zaWRlKTsKKyAgcmV0dXJuIGVycjsKK30KKworI3VuZGVmIENSVU5DSF9DT05GSUdTX01BWAorI3VuZGVmIENSVU5DSF9DT05GSUdTX0xaNzdfTUFYCisKK2ludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgaW50IGhhc19hbHBoYTsKKyAgc2l6ZV90IGNvZGVkX3NpemU7CisgIGludCBwZXJjZW50ID0gMDsKKyAgaW50IGluaXRpYWxfc2l6ZTsKKyAgV2ViUEVuY29kaW5nRXJyb3IgZXJyID0gVlA4X0VOQ19PSzsKKyAgVlA4TEJpdFdyaXRlciBidzsKKworICBpZiAocGljdHVyZSA9PSBOVUxMKSByZXR1cm4gMDsKKworICBpZiAoY29uZmlnID09IE5VTEwgfHwgcGljdHVyZS0+YXJnYiA9PSBOVUxMKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9OVUxMX1BBUkFNRVRFUjsKKyAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBlcnIpOworICAgIHJldHVybiAwOworICB9CisKKyAgd2lkdGggPSBwaWN0dXJlLT53aWR0aDsKKyAgaGVpZ2h0ID0gcGljdHVyZS0+aGVpZ2h0OworICAvLyBJbml0aWFsaXplIEJpdFdyaXRlciB3aXRoIHNpemUgY29ycmVzcG9uZGluZyB0byAxNiBicHAgdG8gcGhvdG8gaW1hZ2VzIGFuZAorICAvLyA4IGJwcCBmb3IgZ3JhcGhpY2FsIGltYWdlcy4KKyAgaW5pdGlhbF9zaXplID0gKGNvbmZpZy0+aW1hZ2VfaGludCA9PSBXRUJQX0hJTlRfR1JBUEgpID8KKyAgICAgIHdpZHRoICogaGVpZ2h0IDogd2lkdGggKiBoZWlnaHQgKiAyOworICBpZiAoIVZQOExCaXRXcml0ZXJJbml0KCZidywgaW5pdGlhbF9zaXplKSkgeworICAgIGVyciA9IFZQOF9FTkNfRVJST1JfT1VUX09GX01FTU9SWTsKKyAgICBnb3RvIEVycm9yOworICB9CisKKyAgaWYgKCFXZWJQUmVwb3J0UHJvZ3Jlc3MocGljdHVyZSwgMSwgJnBlcmNlbnQpKSB7CisgVXNlckFib3J0OgorICAgIGVyciA9IFZQOF9FTkNfRVJST1JfVVNFUl9BQk9SVDsKKyAgICBnb3RvIEVycm9yOworICB9CisgIC8vIFJlc2V0IHN0YXRzIChmb3IgcHVyZSBsb3NzbGVzcyBjb2RpbmcpCisgIGlmIChwaWN0dXJlLT5zdGF0cyAhPSBOVUxMKSB7CisgICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IHBpY3R1cmUtPnN0YXRzOworICAgIG1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworICAgIHN0YXRzLT5QU05SWzBdID0gOTkuZjsKKyAgICBzdGF0cy0+UFNOUlsxXSA9IDk5LmY7CisgICAgc3RhdHMtPlBTTlJbMl0gPSA5OS5mOworICAgIHN0YXRzLT5QU05SWzNdID0gOTkuZjsKKyAgICBzdGF0cy0+UFNOUls0XSA9IDk5LmY7CisgIH0KKworICAvLyBXcml0ZSBpbWFnZSBzaXplLgorICBpZiAoIVdyaXRlSW1hZ2VTaXplKHBpY3R1cmUsICZidykpIHsKKyAgICBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgICAgZ290byBFcnJvcjsKKyAgfQorCisgIGhhc19hbHBoYSA9IFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KHBpY3R1cmUpOworICAvLyBXcml0ZSB0aGUgbm9uLXRyaXZpYWwgQWxwaGEgZmxhZyBhbmQgbG9zc2xlc3MgdmVyc2lvbi4KKyAgaWYgKCFXcml0ZVJlYWxBbHBoYUFuZFZlcnNpb24oJmJ3LCBoYXNfYWxwaGEpKSB7CisgICAgZXJyID0gVlA4X0VOQ19FUlJPUl9PVVRfT0ZfTUVNT1JZOworICAgIGdvdG8gRXJyb3I7CisgIH0KKworICBpZiAoIVdlYlBSZXBvcnRQcm9ncmVzcyhwaWN0dXJlLCA1LCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OworCisgIC8vIEVuY29kZSBtYWluIGltYWdlIHN0cmVhbS4KKyAgZXJyID0gVlA4TEVuY29kZVN0cmVhbShjb25maWcsIHBpY3R1cmUsICZidywgMSAvKnVzZV9jYWNoZSovKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDkwLCAmcGVyY2VudCkpIGdvdG8gVXNlckFib3J0OworCisgIC8vIEZpbmlzaCB0aGUgUklGRiBjaHVuay4KKyAgZXJyID0gV3JpdGVJbWFnZShwaWN0dXJlLCAmYncsICZjb2RlZF9zaXplKTsKKyAgaWYgKGVyciAhPSBWUDhfRU5DX09LKSBnb3RvIEVycm9yOworCisgIGlmICghV2ViUFJlcG9ydFByb2dyZXNzKHBpY3R1cmUsIDEwMCwgJnBlcmNlbnQpKSBnb3RvIFVzZXJBYm9ydDsKKworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKKyAgLy8gU2F2ZSBzaXplLgorICBpZiAocGljdHVyZS0+c3RhdHMgIT0gTlVMTCkgeworICAgIHBpY3R1cmUtPnN0YXRzLT5jb2RlZF9zaXplICs9IChpbnQpY29kZWRfc2l6ZTsKKyAgICBwaWN0dXJlLT5zdGF0cy0+bG9zc2xlc3Nfc2l6ZSA9IChpbnQpY29kZWRfc2l6ZTsKKyAgfQorI2VuZGlmCisKKyAgaWYgKHBpY3R1cmUtPmV4dHJhX2luZm8gIT0gTlVMTCkgeworICAgIGNvbnN0IGludCBtYl93ID0gKHdpZHRoICsgMTUpID4+IDQ7CisgICAgY29uc3QgaW50IG1iX2ggPSAoaGVpZ2h0ICsgMTUpID4+IDQ7CisgICAgbWVtc2V0KHBpY3R1cmUtPmV4dHJhX2luZm8sIDAsIG1iX3cgKiBtYl9oICogc2l6ZW9mKCpwaWN0dXJlLT5leHRyYV9pbmZvKSk7CisgIH0KKworIEVycm9yOgorICBpZiAoYncuZXJyb3JfKSBlcnIgPSBWUDhfRU5DX0VSUk9SX09VVF9PRl9NRU1PUlk7CisgIFZQOExCaXRXcml0ZXJXaXBlT3V0KCZidyk7CisgIGlmIChlcnIgIT0gVlA4X0VOQ19PSykgeworICAgIFdlYlBFbmNvZGluZ1NldEVycm9yKHBpY3R1cmUsIGVycik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3ZwOGxpX2VuYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhsaV9lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOThhNGEwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2VuYy92cDhsaV9lbmMuaApAQCAtMCwwICsxLDExOCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIExvc3NsZXNzIGVuY29kZXI6IGludGVybmFsIGhlYWRlci4KKy8vCisvLyBBdXRob3I6IFZpa2FzIEFyb3JhICh2aWthYXMuYXJvcmFAZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfRU5DX1ZQOExJX0VOQ19IXworI2RlZmluZSBXRUJQX0VOQ19WUDhMSV9FTkNfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyNpbmNsdWRlICJzcmMvd2VicC9jb25maWcuaCIKKyNlbmRpZgorLy8gRWl0aGVyIFdFQlBfTkVBUl9MT1NTTEVTUyBpcyBkZWZpbmVkIGFzIDAgaW4gY29uZmlnLmggd2hlbiBjb21waWxpbmcgdG8KKy8vIGRpc2FibGUgbmVhci1sb3NzbGVzcywgb3IgaXQgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorI2lmbmRlZiBXRUJQX05FQVJfTE9TU0xFU1MKKyNkZWZpbmUgV0VCUF9ORUFSX0xPU1NMRVNTIDEKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2VuYy9iYWNrd2FyZF9yZWZlcmVuY2VzX2VuYy5oIgorI2luY2x1ZGUgInNyYy9lbmMvaGlzdG9ncmFtX2VuYy5oIgorI2luY2x1ZGUgInNyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZW5jb2RlLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIG1heGltdW0gdmFsdWUgb2YgdHJhbnNmb3JtX2JpdHNfIGluIFZQOExFbmNvZGVyLgorI2RlZmluZSBNQVhfVFJBTlNGT1JNX0JJVFMgNgorCit0eXBlZGVmIGVudW0geworICBrRW5jb2Rlck5vbmUgPSAwLAorICBrRW5jb2RlckFSR0IsCisgIGtFbmNvZGVyTmVhckxvc3NsZXNzLAorICBrRW5jb2RlclBhbGV0dGUKK30gVlA4TEVuY29kZXJBUkdCQ29udGVudDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBjb25zdCBXZWJQQ29uZmlnKiBjb25maWdfOyAgICAgIC8vIHVzZXIgY29uZmlndXJhdGlvbiBhbmQgcGFyYW1ldGVycworICBjb25zdCBXZWJQUGljdHVyZSogcGljXzsgICAgICAgIC8vIGlucHV0IHBpY3R1cmUuCisKKyAgdWludDMyX3QqIGFyZ2JfOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtZWQgYXJnYiBpbWFnZSBkYXRhLgorICBWUDhMRW5jb2RlckFSR0JDb250ZW50IGFyZ2JfY29udGVudF87ICAvLyBDb250ZW50IHR5cGUgb2YgdGhlIGFyZ2IgYnVmZmVyLgorICB1aW50MzJfdCogYXJnYl9zY3JhdGNoXzsgICAgICAgICAgICAgICAvLyBTY3JhdGNoIG1lbW9yeSBmb3IgYXJnYiByb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2VkIGZvciBwcmVkaWN0aW9uKS4KKyAgdWludDMyX3QqIHRyYW5zZm9ybV9kYXRhXzsgICAgICAgICAgICAgLy8gU2NyYXRjaCBtZW1vcnkgZm9yIHRyYW5zZm9ybSBkYXRhLgorICB1aW50MzJfdCogdHJhbnNmb3JtX21lbV87ICAgICAgICAgICAgICAvLyBDdXJyZW50bHkgYWxsb2NhdGVkIG1lbW9yeS4KKyAgc2l6ZV90ICAgIHRyYW5zZm9ybV9tZW1fc2l6ZV87ICAgICAgICAgLy8gQ3VycmVudGx5IGFsbG9jYXRlZCBtZW1vcnkgc2l6ZS4KKworICBpbnQgICAgICAgY3VycmVudF93aWR0aF87ICAgICAgIC8vIENvcnJlc3BvbmRzIHRvIHBhY2tlZCBpbWFnZSB3aWR0aC4KKworICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBxdWFsaXR5IHBhcmFtZXRlci4KKyAgaW50IGhpc3RvX2JpdHNfOworICBpbnQgdHJhbnNmb3JtX2JpdHNfOyAgICAvLyA8PSBNQVhfVFJBTlNGT1JNX0JJVFMuCisgIGludCBjYWNoZV9iaXRzXzsgICAgICAgIC8vIElmIGVxdWFsIHRvIDAsIGRvbid0IHVzZSBjb2xvciBjYWNoZS4KKworICAvLyBFbmNvZGluZyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MuCisgIGludCB1c2VfY3Jvc3NfY29sb3JfOworICBpbnQgdXNlX3N1YnRyYWN0X2dyZWVuXzsKKyAgaW50IHVzZV9wcmVkaWN0XzsKKyAgaW50IHVzZV9wYWxldHRlXzsKKyAgaW50IHBhbGV0dGVfc2l6ZV87CisgIHVpbnQzMl90IHBhbGV0dGVfW01BWF9QQUxFVFRFX1NJWkVdOworCisgIC8vIFNvbWUgJ3NjcmF0Y2gnIChwb3RlbnRpYWxseSBsYXJnZSkgb2JqZWN0cy4KKyAgc3RydWN0IFZQOExCYWNrd2FyZFJlZnMgcmVmc19bM107ICAvLyBCYWNrd2FyZCBSZWZzIGFycmF5IGZvciB0ZW1wb3Jhcmllcy4KKyAgVlA4TEhhc2hDaGFpbiBoYXNoX2NoYWluXzsgICAgICAgICAvLyBIYXNoQ2hhaW4gZGF0YSBmb3IgY29uc3RydWN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFja3dhcmQgcmVmZXJlbmNlcy4KK30gVlA4TEVuY29kZXI7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdCBwdWJsaWMuCisKKy8vIEVuY29kZXMgdGhlIHBpY3R1cmUuCisvLyBSZXR1cm5zIDAgaWYgY29uZmlnIG9yIHBpY3R1cmUgaXMgTlVMTCBvciBwaWN0dXJlIGRvZXNuJ3QgaGF2ZSB2YWxpZCBhcmdiCisvLyBpbnB1dC4KK2ludCBWUDhMRW5jb2RlSW1hZ2UoY29uc3QgV2ViUENvbmZpZyogY29uc3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSk7CisKKy8vIEVuY29kZXMgdGhlIG1haW4gaW1hZ2Ugc3RyZWFtIHVzaW5nIHRoZSBzdXBwbGllZCBiaXQgd3JpdGVyLgorLy8gSWYgJ3VzZV9jYWNoZScgaXMgZmFsc2UsIGRpc2FibGVzIHRoZSB1c2Ugb2YgY29sb3IgY2FjaGUuCitXZWJQRW5jb2RpbmdFcnJvciBWUDhMRW5jb2RlU3RyZWFtKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpY3R1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdXNlX2NhY2hlKTsKKworI2lmIChXRUJQX05FQVJfTE9TU0xFU1MgPT0gMSkKKy8vIGluIG5lYXJfbG9zc2xlc3MuYworLy8gTmVhciBsb3NzbGVzcyBwcmVwcm9jZXNzaW5nIGluIFJHQiBjb2xvci1zcGFjZS4KK2ludCBWUDhBcHBseU5lYXJMb3NzbGVzcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwgaW50IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2JfZHN0KTsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW1hZ2UgdHJhbnNmb3JtcyBpbiBwcmVkaWN0b3IuYy4KKwordm9pZCBWUDhMUmVzaWR1YWxJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBiaXRzLCBpbnQgbG93X2VmZm9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGNvbnN0IGFyZ2IsIHVpbnQzMl90KiBjb25zdCBhcmdiX3NjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBpbWFnZSwgaW50IG5lYXJfbG9zc2xlc3MsIGludCBleGFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZWRfc3VidHJhY3RfZ3JlZW4pOworCit2b2lkIFZQOExDb2xvclNwYWNlVHJhbnNmb3JtKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHMsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgYXJnYiwgdWludDMyX3QqIGltYWdlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfRU5DX1ZQOExJX0VOQ19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3dlYnBlbmMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9lbmMvd2VicF9lbmMuYwpzaW1pbGFyaXR5IGluZGV4IDY1JQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9lbmMvd2VicGVuYy5jCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3dlYnBfZW5jLmMKaW5kZXggYWU0ZmIzYi4uZDU1ODY1MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvZW5jL3dlYnBlbmMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvZW5jL3dlYnBfZW5jLmMKQEAgLTEyLDggKzEyLDEwIEBACiAvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL21hdGhfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGxpYl9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKICNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yMSwxNiArMjMsMTMgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjZW5kaWYKIAotI2luY2x1ZGUgIi4vdnA4ZW5jaS5oIgotI2luY2x1ZGUgIi4vdnA4bGkuaCIKLSNpbmNsdWRlICIuLi91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy9lbmMvY29zdF9lbmMuaCIKKyNpbmNsdWRlICJzcmMvZW5jL3ZwOGlfZW5jLmgiCisjaW5jbHVkZSAic3JjL2VuYy92cDhsaV9lbmMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKIAogLy8gI2RlZmluZSBQUklOVF9NRU1PUllfSU5GTwogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQogI2lmZGVmIFBSSU5UX01FTU9SWV9JTkZPCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNlbmRpZgpAQCAtNDIsNDMgKzQxLDE4IEBACiB9CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBXZWJQUGljdHVyZQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIGludCBEdW1teVdyaXRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgewotICAvLyBUaGUgZm9sbG93aW5nIGFyZSB0byBwcmV2ZW50ICd1bnVzZWQgdmFyaWFibGUnIGVycm9yIG1lc3NhZ2UuCi0gICh2b2lkKWRhdGE7Ci0gICh2b2lkKWRhdGFfc2l6ZTsKLSAgKHZvaWQpcGljdHVyZTsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSogcGljdHVyZSwgaW50IHZlcnNpb24pIHsKLSAgaWYgKFdFQlBfQUJJX0lTX0lOQ09NUEFUSUJMRSh2ZXJzaW9uLCBXRUJQX0VOQ09ERVJfQUJJX1ZFUlNJT04pKSB7Ci0gICAgcmV0dXJuIDA7ICAgLy8gY2FsbGVyL3N5c3RlbSB2ZXJzaW9uIG1pc21hdGNoIQotICB9Ci0gIGlmIChwaWN0dXJlICE9IE5VTEwpIHsKLSAgICBTYk1lbW9yeVNldChwaWN0dXJlLCAwLCBzaXplb2YoKnBpY3R1cmUpKTsKLSAgICBwaWN0dXJlLT53cml0ZXIgPSBEdW1teVdyaXRlcjsKLSAgICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWN0dXJlLCBWUDhfRU5DX09LKTsKLSAgfQotICByZXR1cm4gMTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFZQOEVuY29kZXIKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXRpYyB2b2lkIFJlc2V0U2VnbWVudEhlYWRlcihWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKLSAgVlA4U2VnbWVudEhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+c2VnbWVudF9oZHJfOworICBWUDhFbmNTZWdtZW50SGVhZGVyKiBjb25zdCBoZHIgPSAmZW5jLT5zZWdtZW50X2hkcl87CiAgIGhkci0+bnVtX3NlZ21lbnRzXyA9IGVuYy0+Y29uZmlnXy0+c2VnbWVudHM7CiAgIGhkci0+dXBkYXRlX21hcF8gID0gKGhkci0+bnVtX3NlZ21lbnRzXyA+IDEpOwogICBoZHItPnNpemVfID0gMDsKIH0KIAogc3RhdGljIHZvaWQgUmVzZXRGaWx0ZXJIZWFkZXIoVlA4RW5jb2RlciogY29uc3QgZW5jKSB7Ci0gIFZQOEZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+ZmlsdGVyX2hkcl87CisgIFZQOEVuY0ZpbHRlckhlYWRlciogY29uc3QgaGRyID0gJmVuYy0+ZmlsdGVyX2hkcl87CiAgIGhkci0+c2ltcGxlXyA9IDE7CiAgIGhkci0+bGV2ZWxfID0gMDsKICAgaGRyLT5zaGFycG5lc3NfID0gMDsKQEAgLTEwOCwxMSArODIsMTMgQEAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCiAvLyBkeW5hbWljIHByb2JhICAgICB8IH4gfCB4IHwgeCB8IHggfCB4IHwgeCB8IHggfAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKLS8vIGZhc3QgbW9kZSBhbmFseXNpc3wgICB8ICAgfCAgIHwgICB8IHggfCB4IHwgeCB8CisvLyBmYXN0IG1vZGUgYW5hbHlzaXN8W3hdfFt4XXwgICB8ICAgfCB4IHwgeCB8IHggfAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKIC8vIGJhc2ljIHJkLW9wdCAgICAgIHwgICB8ICAgfCAgIHwgeCB8IHggfCB4IHwgeCB8CiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKwotLy8gZGlzdG8tc2NvcmUgaTQvMTYgfCAgIHwgICB8IHggfCAgIHwgICB8ICAgfCAgIHwKKy8vIGRpc3RvLXJlZmluZSBpNC8xNnwgeCB8IHggfCB4IHwgICB8ICAgfCAgIHwgICB8CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKworLy8gZGlzdG8tcmVmaW5lIHV2ICAgfCAgIHwgeCB8IHggfCAgIHwgICB8ICAgfCAgIHwKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rCiAvLyByZC1vcHQgaTQvMTYgICAgICB8ICAgfCAgIHwgfiB8IHggfCB4IHwgeCB8IHggfAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLSstLS0rLS0tKy0tLSstLS0rLS0tKy0tLSsKQEAgLTEzNiwxMiArMTEyLDE2IEBACiAgICAgICAyNTYgKiAxNiAqIDE2ICogICAgICAgICAgICAgICAgIC8vIHVwcGVyIGJvdW5kOiB1cCB0byAxNmJpdCBwZXIgNHg0IGJsb2NrCiAgICAgICAobGltaXQgKiBsaW1pdCkgLyAoMTAwICogMTAwKTsgIC8vIC4uLiBtb2R1bGF0ZWQgd2l0aCBhIHF1YWRyYXRpYyBjdXJ2ZS4KIAorICAvLyBwYXJ0aXRpb24wID0gNTEyayBtYXguCisgIGVuYy0+bWJfaGVhZGVyX2xpbWl0XyA9CisgICAgICAoc2NvcmVfdCkyNTYgKiA1MTAgKiA4ICogMTAyNCAvIChlbmMtPm1iX3dfICogZW5jLT5tYl9oXyk7CisKICAgZW5jLT50aHJlYWRfbGV2ZWxfID0gY29uZmlnLT50aHJlYWRfbGV2ZWw7CiAKICAgZW5jLT5kb19zZWFyY2hfID0gKGNvbmZpZy0+dGFyZ2V0X3NpemUgPiAwIHx8IGNvbmZpZy0+dGFyZ2V0X1BTTlIgPiAwKTsKICAgaWYgKCFjb25maWctPmxvd19tZW1vcnkpIHsKICNpZiAhZGVmaW5lZChESVNBQkxFX1RPS0VOX0JVRkZFUikKLSAgICBlbmMtPnVzZV90b2tlbnNfID0gKG1ldGhvZCA+PSAzKSAmJiAhZW5jLT5kb19zZWFyY2hfOworICAgIGVuYy0+dXNlX3Rva2Vuc18gPSAoZW5jLT5yZF9vcHRfbGV2ZWxfID49IFJEX09QVF9CQVNJQyk7ICAvLyBuZWVkIHJkIHN0YXRzCiAjZW5kaWYKICAgICBpZiAoZW5jLT51c2VfdG9rZW5zXykgewogICAgICAgZW5jLT5udW1fcGFydHNfID0gMTsgICAvLyBkb2Vzbid0IHdvcmsgd2l0aCBtdWx0aS1wYXJ0aXRpb24KQEAgLTE1Miw3NSArMTMyLDc0IEBACiAvLyBNZW1vcnkgc2NhbGluZyB3aXRoIGRpbWVuc2lvbnM6CiAvLyAgbWVtb3J5IChieXRlcykgfj0gMi4yNSAqIHcgKyAwLjA2MjUgKiB3ICogaAogLy8KLS8vIFR5cGljYWwgbWVtb3J5IGZvb3RwcmludCAoNzY4eDUxMCBwaWN0dXJlKQotLy8gTWVtb3J5IHVzZWQ6Ci0vLyAgICAgICAgICAgICAgZW5jb2RlcjogMzM5MTkKLS8vICAgICAgICAgIGJsb2NrIGNhY2hlOiAyODgwCi0vLyAgICAgICAgICAgICAgICAgaW5mbzogMzA3MgotLy8gICAgICAgICAgICAgICAgcHJlZHM6IDI0ODk3Ci0vLyAgICAgICAgICB0b3Agc2FtcGxlczogMTYyMwotLy8gICAgICAgICAgICAgbm9uLXplcm86IDE5NgotLy8gICAgICAgICAgICAgbGYtc3RhdHM6IDIwNDgKLS8vICAgICAgICAgICAgICAgIHRvdGFsOiA2ODYzNQotLy8gVHJhbnNjaWVudCBvYmplY3Qgc2l6ZXM6Ci0vLyAgICAgICBWUDhFbmNJdGVyYXRvcjogMzUyCi0vLyAgICAgICAgIFZQOE1vZGVTY29yZTogOTEyCi0vLyAgICAgICBWUDhTZWdtZW50SW5mbzogNTMyCi0vLyAgICAgICAgICAgICBWUDhQcm9iYTogMzEwMzIKKy8vIFR5cGljYWwgbWVtb3J5IGZvb3RwcmludCAoNjE0eDQ0MCBwaWN0dXJlKQorLy8gICAgICAgICAgICAgIGVuY29kZXI6IDIyMTExCisvLyAgICAgICAgICAgICAgICAgaW5mbzogNDM2OAorLy8gICAgICAgICAgICAgICAgcHJlZHM6IDE3NzQxCisvLyAgICAgICAgICB0b3Agc2FtcGxlczogMTI2MworLy8gICAgICAgICAgICAgbm9uLXplcm86IDE3NQorLy8gICAgICAgICAgICAgbGYtc3RhdHM6IDAKKy8vICAgICAgICAgICAgICAgIHRvdGFsOiA0NTY1OAorLy8gVHJhbnNpZW50IG9iamVjdCBzaXplczoKKy8vICAgICAgIFZQOEVuY0l0ZXJhdG9yOiAzMzYwCisvLyAgICAgICAgIFZQOE1vZGVTY29yZTogODcyCisvLyAgICAgICBWUDhTZWdtZW50SW5mbzogNzMyCisvLyAgICAgICAgICBWUDhFbmNQcm9iYTogMTgzNTIKIC8vICAgICAgICAgICAgICBMRlN0YXRzOiAyMDQ4Ci0vLyBQaWN0dXJlIHNpemUgKHl1dik6IDU4OTgyNAorLy8gUGljdHVyZSBzaXplICh5dXYpOiA0MTkzMjgKIAogc3RhdGljIFZQOEVuY29kZXIqIEluaXRWUDhFbmNvZGVyKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSkgeworICBWUDhFbmNvZGVyKiBlbmM7CiAgIGNvbnN0IGludCB1c2VfZmlsdGVyID0KICAgICAgIChjb25maWctPmZpbHRlcl9zdHJlbmd0aCA+IDApIHx8IChjb25maWctPmF1dG9maWx0ZXIgPiAwKTsKICAgY29uc3QgaW50IG1iX3cgPSAocGljdHVyZS0+d2lkdGggKyAxNSkgPj4gNDsKICAgY29uc3QgaW50IG1iX2ggPSAocGljdHVyZS0+aGVpZ2h0ICsgMTUpID4+IDQ7CiAgIGNvbnN0IGludCBwcmVkc193ID0gNCAqIG1iX3cgKyAxOwogICBjb25zdCBpbnQgcHJlZHNfaCA9IDQgKiBtYl9oICsgMTsKLSAgY29uc3Qgc2l6ZV90IHByZWRzX3NpemUgPSBwcmVkc193ICogcHJlZHNfaCAqIHNpemVvZih1aW50OF90KTsKKyAgY29uc3Qgc2l6ZV90IHByZWRzX3NpemUgPSBwcmVkc193ICogcHJlZHNfaCAqIHNpemVvZigqZW5jLT5wcmVkc18pOwogICBjb25zdCBpbnQgdG9wX3N0cmlkZSA9IG1iX3cgKiAxNjsKLSAgY29uc3Qgc2l6ZV90IG56X3NpemUgPSAobWJfdyArIDEpICogc2l6ZW9mKHVpbnQzMl90KTsKLSAgY29uc3Qgc2l6ZV90IGNhY2hlX3NpemUgPSAoMyAqIFlVVl9TSVpFICsgUFJFRF9TSVpFKSAqIHNpemVvZih1aW50OF90KTsKLSAgY29uc3Qgc2l6ZV90IGluZm9fc2l6ZSA9IG1iX3cgKiBtYl9oICogc2l6ZW9mKFZQOE1CSW5mbyk7Ci0gIGNvbnN0IHNpemVfdCBzYW1wbGVzX3NpemUgPSAoMiAqIHRvcF9zdHJpZGUgKyAgICAgICAgIC8vIHRvcC1sdW1hL3UvdgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICsgMTYgKyAxNiArIDggKyAxICsgICAvLyBsZWZ0IHkvdS92Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAqIEFMSUdOX0NTVCkgICAgICAgICAgIC8vIGFsaWduIGFsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHVpbnQ4X3QpOworICBjb25zdCBzaXplX3Qgbnpfc2l6ZSA9IChtYl93ICsgMSkgKiBzaXplb2YoKmVuYy0+bnpfKSArIFdFQlBfQUxJR05fQ1NUOworICBjb25zdCBzaXplX3QgaW5mb19zaXplID0gbWJfdyAqIG1iX2ggKiBzaXplb2YoKmVuYy0+bWJfaW5mb18pOworICBjb25zdCBzaXplX3Qgc2FtcGxlc19zaXplID0KKyAgICAgIDIgKiB0b3Bfc3RyaWRlICogc2l6ZW9mKCplbmMtPnlfdG9wXykgIC8vIHRvcC1sdW1hL3UvdgorICAgICAgKyBXRUJQX0FMSUdOX0NTVDsgICAgICAgICAgICAgICAgICAgICAgLy8gYWxpZ24gYWxsCiAgIGNvbnN0IHNpemVfdCBsZl9zdGF0c19zaXplID0KLSAgICAgIGNvbmZpZy0+YXV0b2ZpbHRlciA/IHNpemVvZihMRlN0YXRzKSArIEFMSUdOX0NTVCA6IDA7Ci0gIFZQOEVuY29kZXIqIGVuYzsKKyAgICAgIGNvbmZpZy0+YXV0b2ZpbHRlciA/IHNpemVvZigqZW5jLT5sZl9zdGF0c18pICsgV0VCUF9BTElHTl9DU1QgOiAwOworICBjb25zdCBzaXplX3QgdG9wX2RlcnJfc2l6ZSA9CisgICAgICAoY29uZmlnLT5xdWFsaXR5IDw9IEVSUk9SX0RJRkZVU0lPTl9RVUFMSVRZIHx8IGNvbmZpZy0+cGFzcyA+IDEpID8KKyAgICAgICAgICBtYl93ICogc2l6ZW9mKCplbmMtPnRvcF9kZXJyXykgOiAwOwogICB1aW50OF90KiBtZW07Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemUgPSAodWludDY0X3Qpc2l6ZW9mKFZQOEVuY29kZXIpICAgLy8gbWFpbiBzdHJ1Y3QKLSAgICAgICAgICAgICAgICAgICAgICArIEFMSUdOX0NTVCAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSBhbGlnbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICArIGNhY2hlX3NpemUgICAgICAgICAgICAgICAgICAgICAvLyB3b3JraW5nIGNhY2hlcwotICAgICAgICAgICAgICAgICAgICAgICsgaW5mb19zaXplICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZGVzIGluZm8KLSAgICAgICAgICAgICAgICAgICAgICArIHByZWRzX3NpemUgICAgICAgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG1vZGVzCi0gICAgICAgICAgICAgICAgICAgICAgKyBzYW1wbGVzX3NpemUgICAgICAgICAgICAgICAgICAgLy8gdG9wL2xlZnQgc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICsgbnpfc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZWZmIGNvbnRleHQgYml0cwotICAgICAgICAgICAgICAgICAgICAgICsgbGZfc3RhdHNfc2l6ZTsgICAgICAgICAgICAgICAgIC8vIGF1dG9maWx0ZXIgc3RhdHMKKyAgY29uc3QgdWludDY0X3Qgc2l6ZSA9ICh1aW50NjRfdClzaXplb2YoKmVuYykgICAvLyBtYWluIHN0cnVjdAorICAgICAgICAgICAgICAgICAgICAgICsgV0VCUF9BTElHTl9DU1QgICAgICAgICAgIC8vIGNhY2hlIGFsaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICsgaW5mb19zaXplICAgICAgICAgICAgICAgIC8vIG1vZGVzIGluZm8KKyAgICAgICAgICAgICAgICAgICAgICArIHByZWRzX3NpemUgICAgICAgICAgICAgICAvLyBwcmVkaWN0aW9uIG1vZGVzCisgICAgICAgICAgICAgICAgICAgICAgKyBzYW1wbGVzX3NpemUgICAgICAgICAgICAgLy8gdG9wL2xlZnQgc2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICsgdG9wX2RlcnJfc2l6ZSAgICAgICAgICAgIC8vIHRvcCBkaWZmdXNpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICArIG56X3NpemUgICAgICAgICAgICAgICAgICAvLyBjb2VmZiBjb250ZXh0IGJpdHMKKyAgICAgICAgICAgICAgICAgICAgICArIGxmX3N0YXRzX3NpemU7ICAgICAgICAgICAvLyBhdXRvZmlsdGVyIHN0YXRzCiAKICNpZmRlZiBQUklOVF9NRU1PUllfSU5GTwogICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgcHJpbnRmKCJNZW1vcnkgdXNlZDpcbiIKICAgICAgICAgICIgICAgICAgICAgICAgZW5jb2RlcjogJWxkXG4iCi0gICAgICAgICAiICAgICAgICAgYmxvY2sgY2FjaGU6ICVsZFxuIgogICAgICAgICAgIiAgICAgICAgICAgICAgICBpbmZvOiAlbGRcbiIKICAgICAgICAgICIgICAgICAgICAgICAgICBwcmVkczogJWxkXG4iCiAgICAgICAgICAiICAgICAgICAgdG9wIHNhbXBsZXM6ICVsZFxuIgorICAgICAgICAgIiAgICAgICB0b3AgZGlmZnVzaW9uOiAlbGRcbiIKICAgICAgICAgICIgICAgICAgICAgICBub24temVybzogJWxkXG4iCiAgICAgICAgICAiICAgICAgICAgICAgbGYtc3RhdHM6ICVsZFxuIgogICAgICAgICAgIiAgICAgICAgICAgICAgIHRvdGFsOiAlbGRcbiIsCi0gICAgICAgICBzaXplb2YoVlA4RW5jb2RlcikgKyBBTElHTl9DU1QsIGNhY2hlX3NpemUsIGluZm9fc2l6ZSwKLSAgICAgICAgIHByZWRzX3NpemUsIHNhbXBsZXNfc2l6ZSwgbnpfc2l6ZSwgbGZfc3RhdHNfc2l6ZSwgc2l6ZSk7Ci0gIHByaW50ZigiVHJhbnNjaWVudCBvYmplY3Qgc2l6ZXM6XG4iCisgICAgICAgICBzaXplb2YoKmVuYykgKyBXRUJQX0FMSUdOX0NTVCwgaW5mb19zaXplLAorICAgICAgICAgcHJlZHNfc2l6ZSwgc2FtcGxlc19zaXplLCB0b3BfZGVycl9zaXplLCBuel9zaXplLCBsZl9zdGF0c19zaXplLCBzaXplKTsKKyAgcHJpbnRmKCJUcmFuc2llbnQgb2JqZWN0IHNpemVzOlxuIgogICAgICAgICAgIiAgICAgIFZQOEVuY0l0ZXJhdG9yOiAlbGRcbiIKICAgICAgICAgICIgICAgICAgIFZQOE1vZGVTY29yZTogJWxkXG4iCiAgICAgICAgICAiICAgICAgVlA4U2VnbWVudEluZm86ICVsZFxuIgotICAgICAgICAgIiAgICAgICAgICAgIFZQOFByb2JhOiAlbGRcbiIKKyAgICAgICAgICIgICAgICAgICBWUDhFbmNQcm9iYTogJWxkXG4iCiAgICAgICAgICAiICAgICAgICAgICAgIExGU3RhdHM6ICVsZFxuIiwKICAgICAgICAgIHNpemVvZihWUDhFbmNJdGVyYXRvciksIHNpemVvZihWUDhNb2RlU2NvcmUpLAotICAgICAgICAgc2l6ZW9mKFZQOFNlZ21lbnRJbmZvKSwgc2l6ZW9mKFZQOFByb2JhKSwKKyAgICAgICAgIHNpemVvZihWUDhTZWdtZW50SW5mbyksIHNpemVvZihWUDhFbmNQcm9iYSksCiAgICAgICAgICBzaXplb2YoTEZTdGF0cykpOwogICBwcmludGYoIlBpY3R1cmUgc2l6ZSAoeXV2KTogJWxkXG4iLAogICAgICAgICAgbWJfdyAqIG1iX2ggKiAzODQgKiBzaXplb2YodWludDhfdCkpOwpAQCAtMjMyLDQxICsyMTEsMjkgQEAKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBlbmMgPSAoVlA4RW5jb2RlciopbWVtOwotICBtZW0gPSAodWludDhfdCopRE9fQUxJR04obWVtICsgc2l6ZW9mKCplbmMpKTsKLSAgU2JNZW1vcnlTZXQoZW5jLCAwLCBzaXplb2YoKmVuYykpOworICBtZW0gPSAodWludDhfdCopV0VCUF9BTElHTihtZW0gKyBzaXplb2YoKmVuYykpOworICBtZW1zZXQoZW5jLCAwLCBzaXplb2YoKmVuYykpOwogICBlbmMtPm51bV9wYXJ0c18gPSAxIDw8IGNvbmZpZy0+cGFydGl0aW9uczsKICAgZW5jLT5tYl93XyA9IG1iX3c7CiAgIGVuYy0+bWJfaF8gPSBtYl9oOwogICBlbmMtPnByZWRzX3dfID0gcHJlZHNfdzsKLSAgZW5jLT55dXZfaW5fID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IFlVVl9TSVpFOwotICBlbmMtPnl1dl9vdXRfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IFlVVl9TSVpFOwotICBlbmMtPnl1dl9vdXQyXyA9ICh1aW50OF90KiltZW07Ci0gIG1lbSArPSBZVVZfU0laRTsKLSAgZW5jLT55dXZfcF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gUFJFRF9TSVpFOwogICBlbmMtPm1iX2luZm9fID0gKFZQOE1CSW5mbyopbWVtOwogICBtZW0gKz0gaW5mb19zaXplOwotICBlbmMtPnByZWRzXyA9ICgodWludDhfdCopbWVtKSArIDEgKyBlbmMtPnByZWRzX3dfOwotICBtZW0gKz0gcHJlZHNfdyAqIHByZWRzX2ggKiBzaXplb2YodWludDhfdCk7Ci0gIGVuYy0+bnpfID0gMSArICh1aW50MzJfdCopbWVtOworICBlbmMtPnByZWRzXyA9IG1lbSArIDEgKyBlbmMtPnByZWRzX3dfOworICBtZW0gKz0gcHJlZHNfc2l6ZTsKKyAgZW5jLT5uel8gPSAxICsgKHVpbnQzMl90KilXRUJQX0FMSUdOKG1lbSk7CiAgIG1lbSArPSBuel9zaXplOwotICBlbmMtPmxmX3N0YXRzXyA9IGxmX3N0YXRzX3NpemUgPyAoTEZTdGF0cyopRE9fQUxJR04obWVtKSA6IE5VTEw7CisgIGVuYy0+bGZfc3RhdHNfID0gbGZfc3RhdHNfc2l6ZSA/IChMRlN0YXRzKilXRUJQX0FMSUdOKG1lbSkgOiBOVUxMOwogICBtZW0gKz0gbGZfc3RhdHNfc2l6ZTsKIAogICAvLyB0b3Agc2FtcGxlcyAoYWxsIDE2LWFsaWduZWQpCi0gIG1lbSA9ICh1aW50OF90KilET19BTElHTihtZW0pOwotICBlbmMtPnlfdG9wXyA9ICh1aW50OF90KiltZW07CisgIG1lbSA9ICh1aW50OF90KilXRUJQX0FMSUdOKG1lbSk7CisgIGVuYy0+eV90b3BfID0gbWVtOwogICBlbmMtPnV2X3RvcF8gPSBlbmMtPnlfdG9wXyArIHRvcF9zdHJpZGU7CiAgIG1lbSArPSAyICogdG9wX3N0cmlkZTsKLSAgbWVtID0gKHVpbnQ4X3QqKURPX0FMSUdOKG1lbSArIDEpOwotICBlbmMtPnlfbGVmdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gMTYgKyAxNjsKLSAgZW5jLT51X2xlZnRfID0gKHVpbnQ4X3QqKW1lbTsKLSAgbWVtICs9IDE2OwotICBlbmMtPnZfbGVmdF8gPSAodWludDhfdCopbWVtOwotICBtZW0gKz0gODsKKyAgZW5jLT50b3BfZGVycl8gPSB0b3BfZGVycl9zaXplID8gKERFcnJvciopbWVtIDogTlVMTDsKKyAgbWVtICs9IHRvcF9kZXJyX3NpemU7CisgIGFzc2VydChtZW0gPD0gKHVpbnQ4X3QqKWVuYyArIHNpemUpOwogCiAgIGVuYy0+Y29uZmlnXyA9IGNvbmZpZzsKICAgZW5jLT5wcm9maWxlXyA9IHVzZV9maWx0ZXIgPyAoKGNvbmZpZy0+ZmlsdGVyX3R5cGUgPT0gMSkgPyAwIDogMSkgOiAyOwpAQCAtMjc5LDEzICsyNDYsMTUgQEAKICAgUmVzZXRTZWdtZW50SGVhZGVyKGVuYyk7CiAgIFJlc2V0RmlsdGVySGVhZGVyKGVuYyk7CiAgIFJlc2V0Qm91bmRhcnlQcmVkaWN0aW9ucyhlbmMpOwotCisgIFZQOEVuY0RzcENvc3RJbml0KCk7CiAgIFZQOEVuY0luaXRBbHBoYShlbmMpOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gIFZQOEVuY0luaXRMYXllcihlbmMpOwotI2VuZGlmCiAKLSAgVlA4VEJ1ZmZlckluaXQoJmVuYy0+dG9rZW5zXyk7CisgIC8vIGxvd2VyIHF1YWxpdHkgbWVhbnMgc21hbGxlciBvdXRwdXQgLT4gd2UgbW9kdWxhdGUgYSBsaXR0bGUgdGhlIHBhZ2UKKyAgLy8gc2l6ZSBiYXNlZCBvbiBxdWFsaXR5LiBUaGlzIGlzIGp1c3QgYSBjcnVkZSAxcnN0LW9yZGVyIHByZWRpY3Rpb24uCisgIHsKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDEuZiArIGNvbmZpZy0+cXVhbGl0eSAqIDUuZiAvIDEwMC5mOyAgLy8gaW4gWzEsNl0KKyAgICBWUDhUQnVmZmVySW5pdCgmZW5jLT50b2tlbnNfLCAoaW50KShtYl93ICogbWJfaCAqIDQgKiBzY2FsZSkpOworICB9CiAgIHJldHVybiBlbmM7CiB9CiAKQEAgLTI5MywxOSArMjYyLDE3IEBACiAgIGludCBvayA9IDE7CiAgIGlmIChlbmMgIT0gTlVMTCkgewogICAgIG9rID0gVlA4RW5jRGVsZXRlQWxwaGEoZW5jKTsKLSNpZmRlZiBXRUJQX0VYUEVSSU1FTlRBTF9GRUFUVVJFUwotICAgIFZQOEVuY0RlbGV0ZUxheWVyKGVuYyk7Ci0jZW5kaWYKICAgICBWUDhUQnVmZmVyQ2xlYXIoJmVuYy0+dG9rZW5zXyk7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGVuYyk7CisgICAgV2ViUFNhZmVGcmVlKGVuYyk7CiAgIH0KICAgcmV0dXJuIG9rOwogfQogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCisjaWYgIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQogc3RhdGljIGRvdWJsZSBHZXRQU05SKHVpbnQ2NF90IGVyciwgdWludDY0X3Qgc2l6ZSkgewotICByZXR1cm4gZXJyID8gMTAuICogbG9nMTAoMjU1LiAqIDI1NS4gKiBzaXplIC8gZXJyKSA6IDk5LjsKKyAgcmV0dXJuIChlcnIgPiAwICYmIHNpemUgPiAwKSA/IDEwLiAqIGxvZzEwKDI1NS4gKiAyNTUuICogc2l6ZSAvIGVycikgOiA5OS47CiB9CiAKIHN0YXRpYyB2b2lkIEZpbmFsaXplUFNOUihjb25zdCBWUDhFbmNvZGVyKiBjb25zdCBlbmMpIHsKQEAgLTMxOCw4ICsyODUsMTAgQEAKICAgc3RhdHMtPlBTTlJbM10gPSAoZmxvYXQpR2V0UFNOUihzc2VbMF0gKyBzc2VbMV0gKyBzc2VbMl0sIHNpemUgKiAzIC8gMik7CiAgIHN0YXRzLT5QU05SWzRdID0gKGZsb2F0KUdldFBTTlIoc3NlWzNdLCBzaXplKTsKIH0KKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQogCiBzdGF0aWMgdm9pZCBTdG9yZVN0YXRzKFZQOEVuY29kZXIqIGNvbnN0IGVuYykgeworI2lmICFkZWZpbmVkKFdFQlBfRElTQUJMRV9TVEFUUykKICAgV2ViUEF1eFN0YXRzKiBjb25zdCBzdGF0cyA9IGVuYy0+cGljXy0+c3RhdHM7CiAgIGlmIChzdGF0cyAhPSBOVUxMKSB7CiAgICAgaW50IGksIHM7CkBAIC0zMzYsMTMgKzMwNSwxNSBAQAogICAgICAgc3RhdHMtPmJsb2NrX2NvdW50W2ldID0gZW5jLT5ibG9ja19jb3VudF9baV07CiAgICAgfQogICB9CisjZWxzZSAgLy8gZGVmaW5lZChXRUJQX0RJU0FCTEVfU1RBVFMpCiAgIFdlYlBSZXBvcnRQcm9ncmVzcyhlbmMtPnBpY18sIDEwMCwgJmVuYy0+cGVyY2VudF8pOyAgLy8gZG9uZSEKKyNlbmRpZiAgLy8gIWRlZmluZWQoV0VCUF9ESVNBQkxFX1NUQVRTKQogfQogCiBpbnQgV2ViUEVuY29kaW5nU2V0RXJyb3IoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcikgewotICBTQl9EQ0hFQ0soKGludCllcnJvciA8IFZQOF9FTkNfRVJST1JfTEFTVCk7Ci0gIFNCX0RDSEVDSygoaW50KWVycm9yID49IFZQOF9FTkNfT0spOworICBhc3NlcnQoKGludCllcnJvciA8IFZQOF9FTkNfRVJST1JfTEFTVCk7CisgIGFzc2VydCgoaW50KWVycm9yID49IFZQOF9FTkNfT0spOwogICAoKFdlYlBQaWN0dXJlKilwaWMpLT5lcnJvcl9jb2RlID0gZXJyb3I7CiAgIHJldHVybiAwOwogfQpAQCAtMzYzLDI2ICszMzQsNTAgQEAKIAogaW50IFdlYlBFbmNvZGUoY29uc3QgV2ViUENvbmZpZyogY29uZmlnLCBXZWJQUGljdHVyZSogcGljKSB7CiAgIGludCBvayA9IDA7CisgIGlmIChwaWMgPT0gTlVMTCkgcmV0dXJuIDA7CiAKLSAgaWYgKHBpYyA9PSBOVUxMKQotICAgIHJldHVybiAwOwogICBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfT0spOyAgLy8gYWxsIG9rIHNvIGZhcgotICBpZiAoY29uZmlnID09IE5VTEwpICAvLyBiYWQgcGFyYW1zCisgIGlmIChjb25maWcgPT0gTlVMTCkgeyAgLy8gYmFkIHBhcmFtcwogICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfTlVMTF9QQVJBTUVURVIpOwotICBpZiAoIVdlYlBWYWxpZGF0ZUNvbmZpZyhjb25maWcpKQorICB9CisgIGlmICghV2ViUFZhbGlkYXRlQ29uZmlnKGNvbmZpZykpIHsKICAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTik7Ci0gIGlmIChwaWMtPndpZHRoIDw9IDAgfHwgcGljLT5oZWlnaHQgPD0gMCkKKyAgfQorICBpZiAocGljLT53aWR0aCA8PSAwIHx8IHBpYy0+aGVpZ2h0IDw9IDApIHsKICAgICByZXR1cm4gV2ViUEVuY29kaW5nU2V0RXJyb3IocGljLCBWUDhfRU5DX0VSUk9SX0JBRF9ESU1FTlNJT04pOwotICBpZiAocGljLT53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBwaWMtPmhlaWdodCA+IFdFQlBfTUFYX0RJTUVOU0lPTikKKyAgfQorICBpZiAocGljLT53aWR0aCA+IFdFQlBfTUFYX0RJTUVOU0lPTiB8fCBwaWMtPmhlaWdodCA+IFdFQlBfTUFYX0RJTUVOU0lPTikgewogICAgIHJldHVybiBXZWJQRW5jb2RpbmdTZXRFcnJvcihwaWMsIFZQOF9FTkNfRVJST1JfQkFEX0RJTUVOU0lPTik7CisgIH0KIAotICBpZiAocGljLT5zdGF0cyAhPSBOVUxMKSBTYk1lbW9yeVNldChwaWMtPnN0YXRzLCAwLCBzaXplb2YoKnBpYy0+c3RhdHMpKTsKKyAgaWYgKHBpYy0+c3RhdHMgIT0gTlVMTCkgbWVtc2V0KHBpYy0+c3RhdHMsIDAsIHNpemVvZigqcGljLT5zdGF0cykpOwogCiAgIGlmICghY29uZmlnLT5sb3NzbGVzcykgewogICAgIFZQOEVuY29kZXIqIGVuYyA9IE5VTEw7Ci0gICAgaWYgKHBpYy0+eSA9PSBOVUxMIHx8IHBpYy0+dSA9PSBOVUxMIHx8IHBpYy0+diA9PSBOVUxMKSB7CisKKyAgICBpZiAocGljLT51c2VfYXJnYiB8fCBwaWMtPnkgPT0gTlVMTCB8fCBwaWMtPnUgPT0gTlVMTCB8fCBwaWMtPnYgPT0gTlVMTCkgewogICAgICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgWVVWQSBzYW1wbGVzLgotICAgICAgaWYgKCFXZWJQUGljdHVyZUFSR0JUb1lVVkEocGljLCBXRUJQX1lVVjQyMCkpIHJldHVybiAwOworICAgICAgaWYgKGNvbmZpZy0+dXNlX3NoYXJwX3l1diB8fCAoY29uZmlnLT5wcmVwcm9jZXNzaW5nICYgNCkpIHsKKyAgICAgICAgaWYgKCFXZWJQUGljdHVyZVNoYXJwQVJHQlRvWVVWQShwaWMpKSB7CisgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGRpdGhlcmluZyA9IDAuZjsKKyAgICAgICAgaWYgKGNvbmZpZy0+cHJlcHJvY2Vzc2luZyAmIDIpIHsKKyAgICAgICAgICBjb25zdCBmbG9hdCB4ID0gY29uZmlnLT5xdWFsaXR5IC8gMTAwLmY7CisgICAgICAgICAgY29uc3QgZmxvYXQgeDIgPSB4ICogeDsKKyAgICAgICAgICAvLyBzbG93bHkgZGVjcmVhc2luZyBmcm9tIG1heCBkaXRoZXJpbmcgYXQgbG93IHF1YWxpdHkgKHEtPjApCisgICAgICAgICAgLy8gdG8gMC41IGRpdGhlcmluZyBhbXBsaXR1ZGUgYXQgaGlnaCBxdWFsaXR5IChxLT4xMDApCisgICAgICAgICAgZGl0aGVyaW5nID0gMS4wZiArICgwLjVmIC0gMS4wZikgKiB4MiAqIHgyOworICAgICAgICB9CisgICAgICAgIGlmICghV2ViUFBpY3R1cmVBUkdCVG9ZVVZBRGl0aGVyZWQocGljLCBXRUJQX1lVVjQyMCwgZGl0aGVyaW5nKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjb25maWctPmV4YWN0KSB7CisgICAgICBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShwaWMpOwogICAgIH0KIAogICAgIGVuYyA9IEluaXRWUDhFbmNvZGVyKGNvbmZpZywgcGljKTsKQEAgLTM5OCw5ICszOTMsNiBAQAogICAgICAgb2sgPSBvayAmJiBWUDhFbmNUb2tlbkxvb3AoZW5jKTsKICAgICB9CiAgICAgb2sgPSBvayAmJiBWUDhFbmNGaW5pc2hBbHBoYShlbmMpOwotI2lmZGVmIFdFQlBfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTCi0gICAgb2sgPSBvayAmJiBWUDhFbmNGaW5pc2hMYXllcihlbmMpOwotI2VuZGlmCiAKICAgICBvayA9IG9rICYmIFZQOEVuY1dyaXRlKGVuYyk7CiAgICAgU3RvcmVTdGF0cyhlbmMpOwpAQCAtNDE0LDEyICs0MDYsMTIgQEAKICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIGlmICghY29uZmlnLT5leGFjdCkgeworICAgICAgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWFMb3NzbGVzcyhwaWMpOworICAgIH0KKwogICAgIG9rID0gVlA4TEVuY29kZUltYWdlKGNvbmZpZywgcGljKTsgIC8vIFNldHMgcGljLT5lcnJvciBpbiBjYXNlIG9mIHByb2JsZW0uCiAgIH0KIAogICByZXR1cm4gb2s7CiB9Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzNiYjZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnAucGMuaW4KQEAgLTAsMCArMSwxMSBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IGxpYndlYnAKK0Rlc2NyaXB0aW9uOiBMaWJyYXJ5IGZvciB0aGUgV2ViUCBncmFwaGljcyBmb3JtYXQKK1ZlcnNpb246IEBQQUNLQUdFX1ZFUlNJT05ACitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQorTGliczogLUwke2xpYmRpcn0gLWx3ZWJwCitMaWJzLnByaXZhdGU6IC1sbSBAUFRIUkVBRF9DRkxBR1NAIEBQVEhSRUFEX0xJQlNACmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5yYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NTQxMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbGlid2VicC5yYwpAQCAtMCwwICsxLDQxIEBACisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIDEsMCwwLDAKKyBQUk9EVUNUVkVSU0lPTiAxLDAsMCwwCisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDFMCisjZWxzZQorIEZJTEVGTEFHUyAweDBMCisjZW5kaWYKKyBGSUxFT1MgMHg0MDAwNEwKKyBGSUxFVFlQRSAweDJMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIkdvb2dsZSwgSW5jLiIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAibGlid2VicCBETEwiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImxpYndlYnAuZGxsIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxOCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImxpYndlYnAuZGxsIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIldlYlAgSW1hZ2UgQ29kZWMiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5wYy5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWY2NDdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnBjLmluCkBAIC0wLDAgKzEsMTEgQEAKK3ByZWZpeD1AcHJlZml4QAorZXhlY19wcmVmaXg9QGV4ZWNfcHJlZml4QAorbGliZGlyPUBsaWJkaXJACitpbmNsdWRlZGlyPUBpbmNsdWRlZGlyQAorCitOYW1lOiBsaWJ3ZWJwZGVjb2RlcgorRGVzY3JpcHRpb246IExpYnJhcnkgZm9yIHRoZSBXZWJQIGdyYXBoaWNzIGZvcm1hdCAoZGVjb2RlIG9ubHkpCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0KK0xpYnM6IC1MJHtsaWJkaXJ9IC1sd2VicGRlY29kZXIKK0xpYnMucHJpdmF0ZTogLWxtIEBQVEhSRUFEX0NGTEFHU0AgQFBUSFJFQURfTElCU0AKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5yYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9saWJ3ZWJwZGVjb2Rlci5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTJkZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL2xpYndlYnBkZWNvZGVyLnJjCkBAIC0wLDAgKzEsNDEgQEAKKyNkZWZpbmUgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2luY2x1ZGUgIndpbnJlcy5oIgorI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKworVlNfVkVSU0lPTl9JTkZPIFZFUlNJT05JTkZPCisgRklMRVZFUlNJT04gMSwwLDAsMAorIFBST0RVQ1RWRVJTSU9OIDEsMCwwLDAKKyBGSUxFRkxBR1NNQVNLIDB4M2ZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4MUwKKyNlbHNlCisgRklMRUZMQUdTIDB4MEwKKyNlbmRpZgorIEZJTEVPUyAweDQwMDA0TAorIEZJTEVUWVBFIDB4MkwKKyBGSUxFU1VCVFlQRSAweDBMCitCRUdJTgorICAgIEJMT0NLICJTdHJpbmdGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiMDQwOTA0YjAiCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAiR29vZ2xlLCBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIkZpbGVEZXNjcmlwdGlvbiIsICJsaWJ3ZWJwZGVjb2RlciBETEwiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImxpYndlYnBkZWNvZGVyLmRsbCIKKyAgICAgICAgICAgIFZBTFVFICJMZWdhbENvcHlyaWdodCIsICJDb3B5cmlnaHQgKEMpIDIwMTgiCisgICAgICAgICAgICBWQUxVRSAiT3JpZ2luYWxGaWxlbmFtZSIsICJsaWJ3ZWJwZGVjb2Rlci5kbGwiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiV2ViUCBJbWFnZSBEZWNvZGVyIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgIjEuMC4wIgorICAgICAgICBFTkQKKyAgICBFTkQKKyAgICBCTE9DSyAiVmFyRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMHg0MDksIDEyMDAKKyAgICBFTkQKK0VORAorCisjZW5kaWYgICAgLy8gRW5nbGlzaCAoVW5pdGVkIFN0YXRlcykgcmVzb3VyY2VzCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDdiY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDIyIEBACitBTV9DUFBGTEFHUyArPSAtSSQodG9wX2J1aWxkZGlyKSAtSSQodG9wX3NyY2RpcikKK2xpYl9MVExJQlJBUklFUyA9IGxpYndlYnBtdXgubGEKKworbGlid2VicG11eF9sYV9TT1VSQ0VTID0KK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBhbmltX2VuY29kZS5jCitsaWJ3ZWJwbXV4X2xhX1NPVVJDRVMgKz0gYW5pbWkuaAorbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IG11eGVkaXQuYworbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IG11eGkuaAorbGlid2VicG11eF9sYV9TT1VSQ0VTICs9IG11eGludGVybmFsLmMKK2xpYndlYnBtdXhfbGFfU09VUkNFUyArPSBtdXhyZWFkLmMKKworbGlid2VicG11eGluY2x1ZGVfSEVBREVSUyA9CitsaWJ3ZWJwbXV4aW5jbHVkZV9IRUFERVJTICs9IC4uL3dlYnAvbXV4LmgKK2xpYndlYnBtdXhpbmNsdWRlX0hFQURFUlMgKz0gLi4vd2VicC9tdXhfdHlwZXMuaAorbGlid2VicG11eGluY2x1ZGVfSEVBREVSUyArPSAuLi93ZWJwL3R5cGVzLmgKK25vaW5zdF9IRUFERVJTID0KK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCisKK2xpYndlYnBtdXhfbGFfTElCQUREID0gLi4vbGlid2VicC5sYQorbGlid2VicG11eF9sYV9MREZMQUdTID0gLW5vLXVuZGVmaW5lZCAtdmVyc2lvbi1pbmZvIDM6MjowIC1sbQorbGlid2VicG11eGluY2x1ZGVkaXIgPSAkKGluY2x1ZGVkaXIpL3dlYnAKK3BrZ2NvbmZpZ19EQVRBID0gbGlid2VicG11eC5wYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltX2VuY29kZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltX2VuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZTk5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1fZW5jb2RlLmMKQEAgLTAsMCArMSwxNTgxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIEFuaW1FbmNvZGVyIGltcGxlbWVudGF0aW9uLgorLy8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4gICAgLy8gZm9yIHBvdygpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4gIC8vIGZvciBhYnMoKQorCisjaW5jbHVkZSAic3JjL211eC9hbmltaS5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2VuY29kZS5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9tdXguaCIKKworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSIDwgMTkwMAorI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKKyNlbmRpZgorCisjZGVmaW5lIEVSUk9SX1NUUl9NQVhfTEVOR1RIIDEwMAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50ZXJuYWwgc3RydWN0cy4KKworLy8gU3RvcmVzIGZyYW1lIHJlY3RhbmdsZSBkaW1lbnNpb25zLgordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgeF9vZmZzZXRfLCB5X29mZnNldF8sIHdpZHRoXywgaGVpZ2h0XzsKK30gRnJhbWVSZWN0YW5nbGU7CisKKy8vIFVzZWQgdG8gc3RvcmUgdHdvIGNhbmRpZGF0ZXMgb2YgZW5jb2RlZCBkYXRhIGZvciBhbiBhbmltYXRpb24gZnJhbWUuIE9uZSBvZgorLy8gdGhlIHR3byB3aWxsIGJlIGNob3NlbiBsYXRlci4KK3R5cGVkZWYgc3RydWN0IHsKKyAgV2ViUE11eEZyYW1lSW5mbyBzdWJfZnJhbWVfOyAgLy8gRW5jb2RlZCBmcmFtZSByZWN0YW5nbGUuCisgIFdlYlBNdXhGcmFtZUluZm8ga2V5X2ZyYW1lXzsgIC8vIEVuY29kZWQgZnJhbWUgaWYgaXQgaXMgYSBrZXktZnJhbWUuCisgIGludCBpc19rZXlfZnJhbWVfOyAgICAgICAgICAgIC8vIFRydWUgaWYgJ2tleV9mcmFtZScgaGFzIGJlZW4gY2hvc2VuLgorfSBFbmNvZGVkRnJhbWU7CisKK3N0cnVjdCBXZWJQQW5pbUVuY29kZXIgeworICBjb25zdCBpbnQgY2FudmFzX3dpZHRoXzsgICAgICAgICAgICAgICAgICAvLyBDYW52YXMgd2lkdGguCisgIGNvbnN0IGludCBjYW52YXNfaGVpZ2h0XzsgICAgICAgICAgICAgICAgIC8vIENhbnZhcyBoZWlnaHQuCisgIGNvbnN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgb3B0aW9uc187ICAgIC8vIEdsb2JhbCBlbmNvZGluZyBvcHRpb25zLgorCisgIEZyYW1lUmVjdGFuZ2xlIHByZXZfcmVjdF87ICAgICAgICAgIC8vIFByZXZpb3VzIFdlYlAgZnJhbWUgcmVjdGFuZ2xlLgorICBXZWJQQ29uZmlnIGxhc3RfY29uZmlnXzsgICAgICAgICAgICAvLyBDYWNoZWQgaW4gY2FzZSBhIHJlLWVuY29kZSBpcyBuZWVkZWQuCisgIFdlYlBDb25maWcgbGFzdF9jb25maWdfcmV2ZXJzZWRfOyAgIC8vIElmICdsYXN0X2NvbmZpZ18nIHVzZXMgbG9zc2xlc3MsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjb25maWcgdXNlcyBsb3NzeSBhbmQgdmljZSB2ZXJzYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25seSB2YWxpZCBpZiAnb3B0aW9uc18uYWxsb3dfbWl4ZWQnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRydWUuCisKKyAgV2ViUFBpY3R1cmUqIGN1cnJfY2FudmFzXzsgICAgICAgICAgLy8gT25seSBwb2ludGVyOyB3ZSBkb24ndCBvd24gbWVtb3J5LgorCisgIC8vIENhbnZhcyBidWZmZXJzLgorICBXZWJQUGljdHVyZSBjdXJyX2NhbnZhc19jb3B5XzsgICAgICAvLyBQb3NzaWJseSBtb2RpZmllZCBjdXJyZW50IGNhbnZhcy4KKyAgaW50IGN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfOyAgICAgLy8gVHJ1ZSBpZiBwaXhlbHMgaW4gJ2N1cnJfY2FudmFzX2NvcHlfJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXIgZnJvbSB0aG9zZSBpbiAnY3Vycl9jYW52YXNfJy4KKworICBXZWJQUGljdHVyZSBwcmV2X2NhbnZhc187ICAgICAgICAgICAvLyBQcmV2aW91cyBjYW52YXMuCisgIFdlYlBQaWN0dXJlIHByZXZfY2FudmFzX2Rpc3Bvc2VkXzsgIC8vIFByZXZpb3VzIGNhbnZhcyBkaXNwb3NlZCB0byBiYWNrZ3JvdW5kLgorCisgIC8vIEVuY29kZWQgZGF0YS4KKyAgRW5jb2RlZEZyYW1lKiBlbmNvZGVkX2ZyYW1lc187ICAgICAgLy8gQXJyYXkgb2YgZW5jb2RlZCBmcmFtZXMuCisgIHNpemVfdCBzaXplXzsgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGFsbG9jYXRlZCBmcmFtZXMuCisgIHNpemVfdCBzdGFydF87ICAgICAgICAgICAgLy8gRnJhbWUgc3RhcnQgaW5kZXguCisgIHNpemVfdCBjb3VudF87ICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHZhbGlkIGZyYW1lcy4KKyAgc2l6ZV90IGZsdXNoX2NvdW50XzsgICAgICAvLyBJZiA+MCwgJ2ZsdXNoX2NvdW50JyBmcmFtZXMgc3RhcnRpbmcgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICdzdGFydCcgYXJlIHJlYWR5IHRvIGJlIGFkZGVkIHRvIG11eC4KKworICAvLyBrZXktZnJhbWUgcmVsYXRlZC4KKyAgaW50NjRfdCBiZXN0X2RlbHRhXzsgICAgICAvLyBtaW4oY2FudmFzIHNpemUgLSBmcmFtZSBzaXplKSBvdmVyIHRoZSBmcmFtZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuIGJlIG5lZ2F0aXZlIGluIGNlcnRhaW4gY2FzZXMgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNwYXJlbnQgcGl4ZWxzIGluIGEgZnJhbWUuCisgIGludCBrZXlmcmFtZV87ICAgICAgICAgICAgLy8gSW5kZXggb2Ygc2VsZWN0ZWQga2V5LWZyYW1lIHJlbGF0aXZlIHRvICdzdGFydF8nLgorICBpbnQgY291bnRfc2luY2Vfa2V5X2ZyYW1lXzsgICAgIC8vIEZyYW1lcyBzZWVuIHNpbmNlIHRoZSBsYXN0IGtleS1mcmFtZS4KKworICBpbnQgZmlyc3RfdGltZXN0YW1wXzsgICAgICAgICAgIC8vIFRpbWVzdGFtcCBvZiB0aGUgZmlyc3QgZnJhbWUuCisgIGludCBwcmV2X3RpbWVzdGFtcF87ICAgICAgICAgICAgLy8gVGltZXN0YW1wIG9mIHRoZSBsYXN0IGFkZGVkIGZyYW1lLgorICBpbnQgcHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXzsgIC8vIFRydWUgaWYgaXQncyBub3QgeWV0IGRlY2lkZWQgaWYgcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZSB3b3VsZCBiZSBhIHN1Yi1mcmFtZSBvciBhIGtleS1mcmFtZS4KKworICAvLyBNaXNjLgorICBpbnQgaXNfZmlyc3RfZnJhbWVfOyAgLy8gVHJ1ZSBpZiBmaXJzdCBmcmFtZSBpcyB5ZXQgdG8gYmUgYWRkZWQvYmVpbmcgYWRkZWQuCisgIGludCBnb3RfbnVsbF9mcmFtZV87ICAvLyBUcnVlIGlmIFdlYlBBbmltRW5jb2RlckFkZCgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoIGEgTlVMTCBmcmFtZS4KKworICBzaXplX3QgaW5fZnJhbWVfY291bnRfOyAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMgcHJvY2Vzc2VkIHNvIGZhci4KKyAgc2l6ZV90IG91dF9mcmFtZV9jb3VudF87ICAvLyBOdW1iZXIgb2YgZnJhbWVzIGFkZGVkIHRvIG11eCBzbyBmYXIuIFRoaXMgbWF5IGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlmZmVyZW50IGZyb20gJ2luX2ZyYW1lX2NvdW50XycgZHVlIHRvIG1lcmdpbmcuCisKKyAgV2ViUE11eCogbXV4XzsgICAgICAgIC8vIE11eGVyIHRvIGFzc2VtYmxlIHRoZSBXZWJQIGJpdHN0cmVhbS4KKyAgY2hhciBlcnJvcl9zdHJfW0VSUk9SX1NUUl9NQVhfTEVOR1RIXTsgIC8vIEVycm9yIHN0cmluZy4gRW1wdHkgaWYgbm8gZXJyb3IuCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBXZWJQQW5pbUVuY29kZXIgb2JqZWN0LgorCisjZGVmaW5lIERFTFRBX0lORklOSVRZICAgICAgKDFVTEwgPDwgMzIpCisjZGVmaW5lIEtFWUZSQU1FX05PTkUgICAgICAgKC0xKQorCisvLyBSZXNldCB0aGUgY291bnRlcnMgaW4gdGhlIFdlYlBBbmltRW5jb2Rlci4KK3N0YXRpYyB2b2lkIFJlc2V0Q291bnRlcnMoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgZW5jLT5zdGFydF8gPSAwOworICBlbmMtPmNvdW50XyA9IDA7CisgIGVuYy0+Zmx1c2hfY291bnRfID0gMDsKKyAgZW5jLT5iZXN0X2RlbHRhXyA9IERFTFRBX0lORklOSVRZOworICBlbmMtPmtleWZyYW1lXyA9IEtFWUZSQU1FX05PTkU7Cit9CisKK3N0YXRpYyB2b2lkIERpc2FibGVLZXlmcmFtZXMoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogY29uc3QgZW5jX29wdGlvbnMpIHsKKyAgZW5jX29wdGlvbnMtPmttYXggPSBJTlRfTUFYOworICBlbmNfb3B0aW9ucy0+a21pbiA9IGVuY19vcHRpb25zLT5rbWF4IC0gMTsKK30KKworI2RlZmluZSBNQVhfQ0FDSEVEX0ZSQU1FUyAzMAorCitzdGF0aWMgdm9pZCBTYW5pdGl6ZUVuY29kZXJPcHRpb25zKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqIGNvbnN0IGVuY19vcHRpb25zKSB7CisgIGludCBwcmludF93YXJuaW5nID0gZW5jX29wdGlvbnMtPnZlcmJvc2U7CisKKyAgaWYgKGVuY19vcHRpb25zLT5taW5pbWl6ZV9zaXplKSB7CisgICAgRGlzYWJsZUtleWZyYW1lcyhlbmNfb3B0aW9ucyk7CisgIH0KKworICBpZiAoZW5jX29wdGlvbnMtPmttYXggPT0gMSkgeyAgLy8gQWxsIGZyYW1lcyB3aWxsIGJlIGtleS1mcmFtZXMuCisgICAgZW5jX29wdGlvbnMtPmttaW4gPSAwOworICAgIGVuY19vcHRpb25zLT5rbWF4ID0gMDsKKyAgICByZXR1cm47CisgIH0gZWxzZSBpZiAoZW5jX29wdGlvbnMtPmttYXggPD0gMCkgeworICAgIERpc2FibGVLZXlmcmFtZXMoZW5jX29wdGlvbnMpOworICAgIHByaW50X3dhcm5pbmcgPSAwOworICB9CisKKyAgaWYgKGVuY19vcHRpb25zLT5rbWluID49IGVuY19vcHRpb25zLT5rbWF4KSB7CisgICAgZW5jX29wdGlvbnMtPmttaW4gPSBlbmNfb3B0aW9ucy0+a21heCAtIDE7CisgICAgaWYgKHByaW50X3dhcm5pbmcpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiV0FSTklORzogU2V0dGluZyBrbWluID0gJWQsIHNvIHRoYXQga21pbiA8IGttYXguXG4iLAorICAgICAgICAgICAgICBlbmNfb3B0aW9ucy0+a21pbik7CisgICAgfQorICB9IGVsc2UgeworICAgIGNvbnN0IGludCBrbWluX2xpbWl0ID0gZW5jX29wdGlvbnMtPmttYXggLyAyICsgMTsKKyAgICBpZiAoZW5jX29wdGlvbnMtPmttaW4gPCBrbWluX2xpbWl0ICYmIGttaW5fbGltaXQgPCBlbmNfb3B0aW9ucy0+a21heCkgeworICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgZW5jLmtleWZyYW1lICsga21pbiA+PSBrbWF4IGlzIGFsd2F5cyB0cnVlLiBTbywgd2UKKyAgICAgIC8vIGNhbiBmbHVzaCBhbGwgdGhlIGZyYW1lcyBpbiB0aGUgJ2NvdW50X3NpbmNlX2tleV9mcmFtZSA9PSBrbWF4JyBjYXNlLgorICAgICAgZW5jX29wdGlvbnMtPmttaW4gPSBrbWluX2xpbWl0OworICAgICAgaWYgKHByaW50X3dhcm5pbmcpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgIldBUk5JTkc6IFNldHRpbmcga21pbiA9ICVkLCBzbyB0aGF0IGttaW4gPj0ga21heCAvIDIgKyAxLlxuIiwKKyAgICAgICAgICAgICAgICBlbmNfb3B0aW9ucy0+a21pbik7CisgICAgICB9CisgICAgfQorICB9CisgIC8vIExpbWl0IHRoZSBtYXggbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSBhbGxvY2F0ZWQuCisgIGlmIChlbmNfb3B0aW9ucy0+a21heCAtIGVuY19vcHRpb25zLT5rbWluID4gTUFYX0NBQ0hFRF9GUkFNRVMpIHsKKyAgICBlbmNfb3B0aW9ucy0+a21pbiA9IGVuY19vcHRpb25zLT5rbWF4IC0gTUFYX0NBQ0hFRF9GUkFNRVM7CisgICAgaWYgKHByaW50X3dhcm5pbmcpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAiV0FSTklORzogU2V0dGluZyBrbWluID0gJWQsIHNvIHRoYXQga21heCAtIGttaW4gPD0gJWQuXG4iLAorICAgICAgICAgICAgICBlbmNfb3B0aW9ucy0+a21pbiwgTUFYX0NBQ0hFRF9GUkFNRVMpOworICAgIH0KKyAgfQorICBhc3NlcnQoZW5jX29wdGlvbnMtPmttaW4gPCBlbmNfb3B0aW9ucy0+a21heCk7Cit9CisKKyN1bmRlZiBNQVhfQ0FDSEVEX0ZSQU1FUworCitzdGF0aWMgdm9pZCBEZWZhdWx0RW5jb2Rlck9wdGlvbnMoV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogY29uc3QgZW5jX29wdGlvbnMpIHsKKyAgZW5jX29wdGlvbnMtPmFuaW1fcGFyYW1zLmxvb3BfY291bnQgPSAwOworICBlbmNfb3B0aW9ucy0+YW5pbV9wYXJhbXMuYmdjb2xvciA9IDB4ZmZmZmZmZmY7ICAvLyBXaGl0ZS4KKyAgZW5jX29wdGlvbnMtPm1pbmltaXplX3NpemUgPSAwOworICBEaXNhYmxlS2V5ZnJhbWVzKGVuY19vcHRpb25zKTsKKyAgZW5jX29wdGlvbnMtPmFsbG93X21peGVkID0gMDsKKyAgZW5jX29wdGlvbnMtPnZlcmJvc2UgPSAwOworfQorCitpbnQgV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbChXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBlbmNfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhYmlfdmVyc2lvbikgeworICBpZiAoZW5jX29wdGlvbnMgPT0gTlVMTCB8fAorICAgICAgV0VCUF9BQklfSVNfSU5DT01QQVRJQkxFKGFiaV92ZXJzaW9uLCBXRUJQX01VWF9BQklfVkVSU0lPTikpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBEZWZhdWx0RW5jb2Rlck9wdGlvbnMoZW5jX29wdGlvbnMpOworICByZXR1cm4gMTsKK30KKworLy8gVGhpcyBzdGFydGluZyB2YWx1ZSBpcyBtb3JlIGZpdCB0byBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYUxvc3NsZXNzKCkuCisjZGVmaW5lIFRSQU5TUEFSRU5UX0NPTE9SICAgMHgwMDAwMDAwMAorCitzdGF0aWMgdm9pZCBDbGVhclJlY3RhbmdsZShXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgaW50IGo7CisgIGZvciAoaiA9IHRvcDsgaiA8IHRvcCArIGhlaWdodDsgKytqKSB7CisgICAgdWludDMyX3QqIGNvbnN0IGRzdCA9IHBpY3R1cmUtPmFyZ2IgKyBqICogcGljdHVyZS0+YXJnYl9zdHJpZGU7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gbGVmdDsgaSA8IGxlZnQgKyB3aWR0aDsgKytpKSB7CisgICAgICBkc3RbaV0gPSBUUkFOU1BBUkVOVF9DT0xPUjsKKyAgICB9CisgIH0KK30KKworc3RhdGljIHZvaWQgV2ViUFV0aWxDbGVhclBpYyhXZWJQUGljdHVyZSogY29uc3QgcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QpIHsKKyAgaWYgKHJlY3QgIT0gTlVMTCkgeworICAgIENsZWFyUmVjdGFuZ2xlKHBpY3R1cmUsIHJlY3QtPnhfb2Zmc2V0XywgcmVjdC0+eV9vZmZzZXRfLAorICAgICAgICAgICAgICAgICAgIHJlY3QtPndpZHRoXywgcmVjdC0+aGVpZ2h0Xyk7CisgIH0gZWxzZSB7CisgICAgQ2xlYXJSZWN0YW5nbGUocGljdHVyZSwgMCwgMCwgcGljdHVyZS0+d2lkdGgsIHBpY3R1cmUtPmhlaWdodCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgTWFya05vRXJyb3IoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMpIHsKKyAgZW5jLT5lcnJvcl9zdHJfWzBdID0gJ1wwJzsgIC8vIEVtcHR5IHN0cmluZy4KK30KKworc3RhdGljIHZvaWQgTWFya0Vycm9yKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLCBjb25zdCBjaGFyKiBzdHIpIHsKKyAgaWYgKHNucHJpbnRmKGVuYy0+ZXJyb3Jfc3RyXywgRVJST1JfU1RSX01BWF9MRU5HVEgsICIlcy4iLCBzdHIpIDwgMCkgeworICAgIGFzc2VydCgwKTsgIC8vIEZJWCBNRSEKKyAgfQorfQorCitzdGF0aWMgdm9pZCBNYXJrRXJyb3IyKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsIGludCBlcnJvcl9jb2RlKSB7CisgIGlmIChzbnByaW50ZihlbmMtPmVycm9yX3N0cl8sIEVSUk9SX1NUUl9NQVhfTEVOR1RILCAiJXM6ICVkLiIsIHN0ciwKKyAgICAgICAgICAgICAgIGVycm9yX2NvZGUpIDwgMCkgeworICAgIGFzc2VydCgwKTsgIC8vIEZJWCBNRSEKKyAgfQorfQorCitXZWJQQW5pbUVuY29kZXIqIFdlYlBBbmltRW5jb2Rlck5ld0ludGVybmFsKAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogZW5jX29wdGlvbnMsCisgICAgaW50IGFiaV92ZXJzaW9uKSB7CisgIFdlYlBBbmltRW5jb2RlciogZW5jOworCisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUoYWJpX3ZlcnNpb24sIFdFQlBfTVVYX0FCSV9WRVJTSU9OKSkgeworICAgIHJldHVybiBOVUxMOworICB9CisgIGlmICh3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwIHx8CisgICAgICAod2lkdGggKiAodWludDY0X3QpaGVpZ2h0KSA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgZW5jID0gKFdlYlBBbmltRW5jb2RlciopV2ViUFNhZmVDYWxsb2MoMSwgc2l6ZW9mKCplbmMpKTsKKyAgaWYgKGVuYyA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgLy8gc2FuaXR5IGluaXRzLCBzbyB3ZSBjYW4gY2FsbCBXZWJQQW5pbUVuY29kZXJEZWxldGUoKToKKyAgZW5jLT5lbmNvZGVkX2ZyYW1lc18gPSBOVUxMOworICBlbmMtPm11eF8gPSBOVUxMOworICBNYXJrTm9FcnJvcihlbmMpOworCisgIC8vIERpbWVuc2lvbnMgYW5kIG9wdGlvbnMuCisgICooaW50KikmZW5jLT5jYW52YXNfd2lkdGhfID0gd2lkdGg7CisgICooaW50KikmZW5jLT5jYW52YXNfaGVpZ2h0XyA9IGhlaWdodDsKKyAgaWYgKGVuY19vcHRpb25zICE9IE5VTEwpIHsKKyAgICAqKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqKSZlbmMtPm9wdGlvbnNfID0gKmVuY19vcHRpb25zOworICAgIFNhbml0aXplRW5jb2Rlck9wdGlvbnMoKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqKSZlbmMtPm9wdGlvbnNfKTsKKyAgfSBlbHNlIHsKKyAgICBEZWZhdWx0RW5jb2Rlck9wdGlvbnMoKFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqKSZlbmMtPm9wdGlvbnNfKTsKKyAgfQorCisgIC8vIENhbnZhcyBidWZmZXJzLgorICBpZiAoIVdlYlBQaWN0dXJlSW5pdCgmZW5jLT5jdXJyX2NhbnZhc19jb3B5XykgfHwKKyAgICAgICFXZWJQUGljdHVyZUluaXQoJmVuYy0+cHJldl9jYW52YXNfKSB8fAorICAgICAgIVdlYlBQaWN0dXJlSW5pdCgmZW5jLT5wcmV2X2NhbnZhc19kaXNwb3NlZF8pKSB7CisgICAgZ290byBFcnI7CisgIH0KKyAgZW5jLT5jdXJyX2NhbnZhc19jb3B5Xy53aWR0aCA9IHdpZHRoOworICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfLmhlaWdodCA9IGhlaWdodDsKKyAgZW5jLT5jdXJyX2NhbnZhc19jb3B5Xy51c2VfYXJnYiA9IDE7CisgIGlmICghV2ViUFBpY3R1cmVBbGxvYygmZW5jLT5jdXJyX2NhbnZhc19jb3B5XykgfHwKKyAgICAgICFXZWJQUGljdHVyZUNvcHkoJmVuYy0+Y3Vycl9jYW52YXNfY29weV8sICZlbmMtPnByZXZfY2FudmFzXykgfHwKKyAgICAgICFXZWJQUGljdHVyZUNvcHkoJmVuYy0+Y3Vycl9jYW52YXNfY29weV8sICZlbmMtPnByZXZfY2FudmFzX2Rpc3Bvc2VkXykpIHsKKyAgICBnb3RvIEVycjsKKyAgfQorICBXZWJQVXRpbENsZWFyUGljKCZlbmMtPnByZXZfY2FudmFzXywgTlVMTCk7CisgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPSAxOworCisgIC8vIEVuY29kZWQgZnJhbWVzLgorICBSZXNldENvdW50ZXJzKGVuYyk7CisgIC8vIE5vdGU6IG9uZSBleHRyYSBzdG9yYWdlIGlzIGZvciB0aGUgcHJldmlvdXMgZnJhbWUuCisgIGVuYy0+c2l6ZV8gPSBlbmMtPm9wdGlvbnNfLmttYXggLSBlbmMtPm9wdGlvbnNfLmttaW4gKyAxOworICAvLyBXZSBuZWVkIHNwYWNlIGZvciBhdCBsZWFzdCAyIGZyYW1lcy4gQnV0IHdoZW4ga21pbiwga21heCBhcmUgYm90aCB6ZXJvLAorICAvLyBlbmMtPnNpemVfIHdpbGwgYmUgMS4gU28gd2UgaGFuZGxlIHRoYXQgc3BlY2lhbCBjYXNlIGJlbG93LgorICBpZiAoZW5jLT5zaXplXyA8IDIpIGVuYy0+c2l6ZV8gPSAyOworICBlbmMtPmVuY29kZWRfZnJhbWVzXyA9CisgICAgICAoRW5jb2RlZEZyYW1lKilXZWJQU2FmZUNhbGxvYyhlbmMtPnNpemVfLCBzaXplb2YoKmVuYy0+ZW5jb2RlZF9mcmFtZXNfKSk7CisgIGlmIChlbmMtPmVuY29kZWRfZnJhbWVzXyA9PSBOVUxMKSBnb3RvIEVycjsKKworICBlbmMtPm11eF8gPSBXZWJQTXV4TmV3KCk7CisgIGlmIChlbmMtPm11eF8gPT0gTlVMTCkgZ290byBFcnI7CisKKyAgZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfID0gMDsKKyAgZW5jLT5maXJzdF90aW1lc3RhbXBfID0gMDsKKyAgZW5jLT5wcmV2X3RpbWVzdGFtcF8gPSAwOworICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAwOworICBlbmMtPmlzX2ZpcnN0X2ZyYW1lXyA9IDE7CisgIGVuYy0+Z290X251bGxfZnJhbWVfID0gMDsKKworICByZXR1cm4gZW5jOyAgLy8gQWxsIE9LLgorCisgRXJyOgorICBXZWJQQW5pbUVuY29kZXJEZWxldGUoZW5jKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIFJlbGVhc2UgdGhlIGRhdGEgY29udGFpbmVkIGJ5ICdlbmNvZGVkX2ZyYW1lJy4KK3N0YXRpYyB2b2lkIEZyYW1lUmVsZWFzZShFbmNvZGVkRnJhbWUqIGNvbnN0IGVuY29kZWRfZnJhbWUpIHsKKyAgaWYgKGVuY29kZWRfZnJhbWUgIT0gTlVMTCkgeworICAgIFdlYlBEYXRhQ2xlYXIoJmVuY29kZWRfZnJhbWUtPnN1Yl9mcmFtZV8uYml0c3RyZWFtKTsKKyAgICBXZWJQRGF0YUNsZWFyKCZlbmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWVfLmJpdHN0cmVhbSk7CisgICAgbWVtc2V0KGVuY29kZWRfZnJhbWUsIDAsIHNpemVvZigqZW5jb2RlZF9mcmFtZSkpOworICB9Cit9CisKK3ZvaWQgV2ViUEFuaW1FbmNvZGVyRGVsZXRlKFdlYlBBbmltRW5jb2RlciogZW5jKSB7CisgIGlmIChlbmMgIT0gTlVMTCkgeworICAgIFdlYlBQaWN0dXJlRnJlZSgmZW5jLT5jdXJyX2NhbnZhc19jb3B5Xyk7CisgICAgV2ViUFBpY3R1cmVGcmVlKCZlbmMtPnByZXZfY2FudmFzXyk7CisgICAgV2ViUFBpY3R1cmVGcmVlKCZlbmMtPnByZXZfY2FudmFzX2Rpc3Bvc2VkXyk7CisgICAgaWYgKGVuYy0+ZW5jb2RlZF9mcmFtZXNfICE9IE5VTEwpIHsKKyAgICAgIHNpemVfdCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGVuYy0+c2l6ZV87ICsraSkgeworICAgICAgICBGcmFtZVJlbGVhc2UoJmVuYy0+ZW5jb2RlZF9mcmFtZXNfW2ldKTsKKyAgICAgIH0KKyAgICAgIFdlYlBTYWZlRnJlZShlbmMtPmVuY29kZWRfZnJhbWVzXyk7CisgICAgfQorICAgIFdlYlBNdXhEZWxldGUoZW5jLT5tdXhfKTsKKyAgICBXZWJQU2FmZUZyZWUoZW5jKTsKKyAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRnJhbWUgYWRkaXRpb24uCisKKy8vIFJldHVybnMgY2FjaGVkIGZyYW1lIGF0IHRoZSBnaXZlbiAncG9zaXRpb24nLgorc3RhdGljIEVuY29kZWRGcmFtZSogR2V0RnJhbWUoY29uc3QgV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24pIHsKKyAgYXNzZXJ0KGVuYy0+c3RhcnRfICsgcG9zaXRpb24gPCBlbmMtPnNpemVfKTsKKyAgcmV0dXJuICZlbmMtPmVuY29kZWRfZnJhbWVzX1tlbmMtPnN0YXJ0XyArIHBvc2l0aW9uXTsKK30KKwordHlwZWRlZiBpbnQgKCpDb21wYXJlUGl4ZWxzRnVuYykoY29uc3QgdWludDMyX3QqLCBpbnQsIGNvbnN0IHVpbnQzMl90KiwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBpbnQpOworCisvLyBSZXR1cm5zIHRydWUgaWYgJ2xlbmd0aCcgbnVtYmVyIG9mIHBpeGVscyBpbiAnc3JjJyBhbmQgJ2RzdCcgYXJlIGVxdWFsLAorLy8gYXNzdW1pbmcgdGhlIGdpdmVuIHN0ZXAgc2l6ZXMgYmV0d2VlbiBwaXhlbHMuCisvLyAnbWF4X2FsbG93ZWRfZGlmZicgaXMgdW51c2VkIGFuZCBvbmx5IHRoZXJlIHRvIGFsbG93IGZ1bmN0aW9uIHBvaW50ZXIgdXNlLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBDb21wYXJlUGl4ZWxzTG9zc2xlc3MoY29uc3QgdWludDMyX3QqIHNyYywgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbmd0aCwgaW50IG1heF9hbGxvd2VkX2RpZmYpIHsKKyAgKHZvaWQpbWF4X2FsbG93ZWRfZGlmZjsKKyAgYXNzZXJ0KGxlbmd0aCA+IDApOworICB3aGlsZSAobGVuZ3RoLS0gPiAwKSB7CisgICAgaWYgKCpzcmMgIT0gKmRzdCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNyYyArPSBzcmNfc3RlcDsKKyAgICBkc3QgKz0gZHN0X3N0ZXA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIEhlbHBlciB0byBjaGVjayBpZiBlYWNoIGNoYW5uZWwgaW4gJ3NyYycgYW5kICdkc3QnIGlzIGF0IG1vc3Qgb2ZmIGJ5CisvLyAnbWF4X2FsbG93ZWRfZGlmZicuCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFBpeGVsc0FyZVNpbWlsYXIodWludDMyX3Qgc3JjLCB1aW50MzJfdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9hbGxvd2VkX2RpZmYpIHsKKyAgY29uc3QgaW50IHNyY19hID0gKHNyYyA+PiAyNCkgJiAweGZmOworICBjb25zdCBpbnQgc3JjX3IgPSAoc3JjID4+IDE2KSAmIDB4ZmY7CisgIGNvbnN0IGludCBzcmNfZyA9IChzcmMgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgc3JjX2IgPSAoc3JjID4+IDApICYgMHhmZjsKKyAgY29uc3QgaW50IGRzdF9hID0gKGRzdCA+PiAyNCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X3IgPSAoZHN0ID4+IDE2KSAmIDB4ZmY7CisgIGNvbnN0IGludCBkc3RfZyA9IChkc3QgPj4gOCkgJiAweGZmOworICBjb25zdCBpbnQgZHN0X2IgPSAoZHN0ID4+IDApICYgMHhmZjsKKworICByZXR1cm4gKHNyY19hID09IGRzdF9hKSAmJgorICAgICAgICAgKGFicyhzcmNfciAtIGRzdF9yKSAqIGRzdF9hIDw9IChtYXhfYWxsb3dlZF9kaWZmICogMjU1KSkgJiYKKyAgICAgICAgIChhYnMoc3JjX2cgLSBkc3RfZykgKiBkc3RfYSA8PSAobWF4X2FsbG93ZWRfZGlmZiAqIDI1NSkpICYmCisgICAgICAgICAoYWJzKHNyY19iIC0gZHN0X2IpICogZHN0X2EgPD0gKG1heF9hbGxvd2VkX2RpZmYgKiAyNTUpKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmICdsZW5ndGgnIG51bWJlciBvZiBwaXhlbHMgaW4gJ3NyYycgYW5kICdkc3QnIGFyZSB3aXRoaW4gYW4KKy8vIGVycm9yIGJvdW5kLCBhc3N1bWluZyB0aGUgZ2l2ZW4gc3RlcCBzaXplcyBiZXR3ZWVuIHBpeGVscy4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQ29tcGFyZVBpeGVsc0xvc3N5KGNvbnN0IHVpbnQzMl90KiBzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsIGludCBtYXhfYWxsb3dlZF9kaWZmKSB7CisgIGFzc2VydChsZW5ndGggPiAwKTsKKyAgd2hpbGUgKGxlbmd0aC0tID4gMCkgeworICAgIGlmICghUGl4ZWxzQXJlU2ltaWxhcigqc3JjLCAqZHN0LCBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHNyYyArPSBzcmNfc3RlcDsKKyAgICBkc3QgKz0gZHN0X3N0ZXA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgSXNFbXB0eVJlY3QoY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QpIHsKKyAgcmV0dXJuIChyZWN0LT53aWR0aF8gPT0gMCkgfHwgKHJlY3QtPmhlaWdodF8gPT0gMCk7Cit9CisKK3N0YXRpYyBpbnQgUXVhbGl0eVRvTWF4RGlmZihmbG9hdCBxdWFsaXR5KSB7CisgIGNvbnN0IGRvdWJsZSB2YWwgPSBwb3cocXVhbGl0eSAvIDEwMC4sIDAuNSk7CisgIGNvbnN0IGRvdWJsZSBtYXhfZGlmZiA9IDMxICogKDEgLSB2YWwpICsgMSAqIHZhbDsKKyAgcmV0dXJuIChpbnQpKG1heF9kaWZmICsgMC41KTsKK30KKworLy8gQXNzdW1lcyB0aGF0IGFuIGluaXRpYWwgdmFsaWQgZ3Vlc3Mgb2YgY2hhbmdlIHJlY3RhbmdsZSAncmVjdCcgaXMgcGFzc2VkLgorc3RhdGljIHZvaWQgTWluaW1pemVDaGFuZ2VSZWN0YW5nbGUoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sb3NzbGVzcywgZmxvYXQgcXVhbGl0eSkgeworICBpbnQgaSwgajsKKyAgY29uc3QgQ29tcGFyZVBpeGVsc0Z1bmMgY29tcGFyZV9waXhlbHMgPQorICAgICAgaXNfbG9zc2xlc3MgPyBDb21wYXJlUGl4ZWxzTG9zc2xlc3MgOiBDb21wYXJlUGl4ZWxzTG9zc3k7CisgIGNvbnN0IGludCBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5ID0gUXVhbGl0eVRvTWF4RGlmZihxdWFsaXR5KTsKKyAgY29uc3QgaW50IG1heF9hbGxvd2VkX2RpZmYgPSBpc19sb3NzbGVzcyA/IDAgOiBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5OworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGFzc2VydChzcmMtPndpZHRoID09IGRzdC0+d2lkdGggJiYgc3JjLT5oZWlnaHQgPT0gZHN0LT5oZWlnaHQpOworICBhc3NlcnQocmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfIDw9IGRzdC0+d2lkdGgpOworICBhc3NlcnQocmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XyA8PSBkc3QtPmhlaWdodCk7CisKKyAgLy8gTGVmdCBib3VuZGFyeS4KKyAgZm9yIChpID0gcmVjdC0+eF9vZmZzZXRfOyBpIDwgcmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfOyArK2kpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2FyZ2IgPQorICAgICAgICAmc3JjLT5hcmdiW3JlY3QtPnlfb2Zmc2V0XyAqIHNyYy0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0X2FyZ2IgPQorICAgICAgICAmZHN0LT5hcmdiW3JlY3QtPnlfb2Zmc2V0XyAqIGRzdC0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICBpZiAoY29tcGFyZV9waXhlbHMoc3JjX2FyZ2IsIHNyYy0+YXJnYl9zdHJpZGUsIGRzdF9hcmdiLCBkc3QtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5oZWlnaHRfLCBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgLS1yZWN0LT53aWR0aF87ICAvLyBSZWR1bmRhbnQgY29sdW1uLgorICAgICAgKytyZWN0LT54X29mZnNldF87CisgICAgfSBlbHNlIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAocmVjdC0+d2lkdGhfID09IDApIGdvdG8gTm9DaGFuZ2U7CisKKyAgLy8gUmlnaHQgYm91bmRhcnkuCisgIGZvciAoaSA9IHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXyAtIDE7IGkgPj0gcmVjdC0+eF9vZmZzZXRfOyAtLWkpIHsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3Qgc3JjX2FyZ2IgPQorICAgICAgICAmc3JjLT5hcmdiW3JlY3QtPnlfb2Zmc2V0XyAqIHNyYy0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICBjb25zdCB1aW50MzJfdCogY29uc3QgZHN0X2FyZ2IgPQorICAgICAgICAmZHN0LT5hcmdiW3JlY3QtPnlfb2Zmc2V0XyAqIGRzdC0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICBpZiAoY29tcGFyZV9waXhlbHMoc3JjX2FyZ2IsIHNyYy0+YXJnYl9zdHJpZGUsIGRzdF9hcmdiLCBkc3QtPmFyZ2Jfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5oZWlnaHRfLCBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgLS1yZWN0LT53aWR0aF87ICAvLyBSZWR1bmRhbnQgY29sdW1uLgorICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHJlY3QtPndpZHRoXyA9PSAwKSBnb3RvIE5vQ2hhbmdlOworCisgIC8vIFRvcCBib3VuZGFyeS4KKyAgZm9yIChqID0gcmVjdC0+eV9vZmZzZXRfOyBqIDwgcmVjdC0+eV9vZmZzZXRfICsgcmVjdC0+aGVpZ2h0XzsgKytqKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19hcmdiID0KKyAgICAgICAgJnNyYy0+YXJnYltqICogc3JjLT5hcmdiX3N0cmlkZSArIHJlY3QtPnhfb2Zmc2V0X107CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdF9hcmdiID0KKyAgICAgICAgJmRzdC0+YXJnYltqICogZHN0LT5hcmdiX3N0cmlkZSArIHJlY3QtPnhfb2Zmc2V0X107CisgICAgaWYgKGNvbXBhcmVfcGl4ZWxzKHNyY19hcmdiLCAxLCBkc3RfYXJnYiwgMSwgcmVjdC0+d2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgLS1yZWN0LT5oZWlnaHRfOyAgLy8gUmVkdW5kYW50IHJvdy4KKyAgICAgICsrcmVjdC0+eV9vZmZzZXRfOworICAgIH0gZWxzZSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYgKHJlY3QtPmhlaWdodF8gPT0gMCkgZ290byBOb0NoYW5nZTsKKworICAvLyBCb3R0b20gYm91bmRhcnkuCisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF8gLSAxOyBqID49IHJlY3QtPnlfb2Zmc2V0XzsgLS1qKSB7CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IHNyY19hcmdiID0KKyAgICAgICAgJnNyYy0+YXJnYltqICogc3JjLT5hcmdiX3N0cmlkZSArIHJlY3QtPnhfb2Zmc2V0X107CisgICAgY29uc3QgdWludDMyX3QqIGNvbnN0IGRzdF9hcmdiID0KKyAgICAgICAgJmRzdC0+YXJnYltqICogZHN0LT5hcmdiX3N0cmlkZSArIHJlY3QtPnhfb2Zmc2V0X107CisgICAgaWYgKGNvbXBhcmVfcGl4ZWxzKHNyY19hcmdiLCAxLCBkc3RfYXJnYiwgMSwgcmVjdC0+d2lkdGhfLAorICAgICAgICAgICAgICAgICAgICAgICBtYXhfYWxsb3dlZF9kaWZmKSkgeworICAgICAgLS1yZWN0LT5oZWlnaHRfOyAgLy8gUmVkdW5kYW50IHJvdy4KKyAgICB9IGVsc2UgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGlmIChyZWN0LT5oZWlnaHRfID09IDApIGdvdG8gTm9DaGFuZ2U7CisKKyAgaWYgKElzRW1wdHlSZWN0KHJlY3QpKSB7CisgTm9DaGFuZ2U6CisgICAgcmVjdC0+eF9vZmZzZXRfID0gMDsKKyAgICByZWN0LT55X29mZnNldF8gPSAwOworICAgIHJlY3QtPndpZHRoXyA9IDA7CisgICAgcmVjdC0+aGVpZ2h0XyA9IDA7CisgIH0KK30KKworLy8gU25hcCByZWN0YW5nbGUgdG8gZXZlbiBvZmZzZXRzIChhbmQgYWRqdXN0IGRpbWVuc2lvbnMgaWYgbmVlZGVkKS4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFNuYXBUb0V2ZW5PZmZzZXRzKEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0KSB7CisgIHJlY3QtPndpZHRoXyArPSAocmVjdC0+eF9vZmZzZXRfICYgMSk7CisgIHJlY3QtPmhlaWdodF8gKz0gKHJlY3QtPnlfb2Zmc2V0XyAmIDEpOworICByZWN0LT54X29mZnNldF8gJj0gfjE7CisgIHJlY3QtPnlfb2Zmc2V0XyAmPSB+MTsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgc2hvdWxkX3RyeV87ICAgICAgICAgICAgICAgLy8gU2hvdWxkIHRyeSB0aGlzIHNldCBvZiBwYXJhbWV0ZXJzLgorICBpbnQgZW1wdHlfcmVjdF9hbGxvd2VkXzsgICAgICAgLy8gRnJhbWUgd2l0aCBlbXB0eSByZWN0YW5nbGUgY2FuIGJlIHNraXBwZWQuCisgIEZyYW1lUmVjdGFuZ2xlIHJlY3RfbGxfOyAgICAgICAvLyBGcmFtZSByZWN0YW5nbGUgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorICBXZWJQUGljdHVyZSBzdWJfZnJhbWVfbGxfOyAgICAgLy8gU3ViLWZyYW1lIHBpYyBmb3IgbG9zc2xlc3MgY29tcHJlc3Npb24uCisgIEZyYW1lUmVjdGFuZ2xlIHJlY3RfbG9zc3lfOyAgICAvLyBGcmFtZSByZWN0YW5nbGUgZm9yIGxvc3N5IGNvbXByZXNzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ291bGQgYmUgc21hbGxlciB0aGFuIHJlY3RfbGxfIGFzIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBzbWFsbCBkaWZmcyBjYW4gYmUgaWdub3JlZC4KKyAgV2ViUFBpY3R1cmUgc3ViX2ZyYW1lX2xvc3N5XzsgIC8vIFN1Yi1mcmFtZSBwaWMgZm9yIGxvc3NsZXNzIGNvbXByZXNzaW9uLgorfSBTdWJGcmFtZVBhcmFtczsKKworc3RhdGljIGludCBTdWJGcmFtZVBhcmFtc0luaXQoU3ViRnJhbWVQYXJhbXMqIGNvbnN0IHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaG91bGRfdHJ5LCBpbnQgZW1wdHlfcmVjdF9hbGxvd2VkKSB7CisgIHBhcmFtcy0+c2hvdWxkX3RyeV8gPSBzaG91bGRfdHJ5OworICBwYXJhbXMtPmVtcHR5X3JlY3RfYWxsb3dlZF8gPSBlbXB0eV9yZWN0X2FsbG93ZWQ7CisgIGlmICghV2ViUFBpY3R1cmVJbml0KCZwYXJhbXMtPnN1Yl9mcmFtZV9sbF8pIHx8CisgICAgICAhV2ViUFBpY3R1cmVJbml0KCZwYXJhbXMtPnN1Yl9mcmFtZV9sb3NzeV8pKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFN1YkZyYW1lUGFyYW1zRnJlZShTdWJGcmFtZVBhcmFtcyogY29uc3QgcGFyYW1zKSB7CisgIFdlYlBQaWN0dXJlRnJlZSgmcGFyYW1zLT5zdWJfZnJhbWVfbGxfKTsKKyAgV2ViUFBpY3R1cmVGcmVlKCZwYXJhbXMtPnN1Yl9mcmFtZV9sb3NzeV8pOworfQorCisvLyBHaXZlbiBwcmV2aW91cyBhbmQgY3VycmVudCBjYW52YXMsIHBpY2tzIHRoZSBvcHRpbWFsIHJlY3RhbmdsZSBmb3IgdGhlCisvLyBjdXJyZW50IGZyYW1lIGJhc2VkIG9uICdpc19sb3NzbGVzcycgYW5kIG90aGVyIHBhcmFtZXRlcnMuIEFzc3VtZXMgdGhhdCB0aGUKKy8vIGluaXRpYWwgZ3Vlc3MgJ3JlY3QnIGlzIHZhbGlkLgorc3RhdGljIGludCBHZXRTdWJSZWN0KGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMsIGludCBpc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2ZpcnN0X2ZyYW1lLCBpbnQgZW1wdHlfcmVjdF9hbGxvd2VkLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpc19sb3NzbGVzcywgZmxvYXQgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3Qgc3ViX2ZyYW1lKSB7CisgIGlmICghaXNfa2V5X2ZyYW1lIHx8IGlzX2ZpcnN0X2ZyYW1lKSB7ICAvLyBPcHRpbWl6ZSBmcmFtZSByZWN0YW5nbGUuCisgICAgLy8gTm90ZTogVGhpcyBiZWhhdmVzIGFzIGV4cGVjdGVkIGZvciBmaXJzdCBmcmFtZSwgYXMgJ3ByZXZfY2FudmFzJyBpcworICAgIC8vIGluaXRpYWxpemVkIHRvIGEgZnVsbHkgdHJhbnNwYXJlbnQgY2FudmFzIGluIHRoZSBiZWdpbm5pbmcuCisgICAgTWluaW1pemVDaGFuZ2VSZWN0YW5nbGUocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2xvc3NsZXNzLCBxdWFsaXR5KTsKKyAgfQorCisgIGlmIChJc0VtcHR5UmVjdChyZWN0KSkgeworICAgIGlmIChlbXB0eV9yZWN0X2FsbG93ZWQpIHsgIC8vIE5vIG5lZWQgdG8gZ2V0ICdzdWJfZnJhbWUnLgorICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgLy8gRm9yY2UgYSAxeDEgcmVjdGFuZ2xlLgorICAgICAgcmVjdC0+d2lkdGhfID0gMTsKKyAgICAgIHJlY3QtPmhlaWdodF8gPSAxOworICAgICAgYXNzZXJ0KHJlY3QtPnhfb2Zmc2V0XyA9PSAwKTsKKyAgICAgIGFzc2VydChyZWN0LT55X29mZnNldF8gPT0gMCk7CisgICAgfQorICB9CisKKyAgU25hcFRvRXZlbk9mZnNldHMocmVjdCk7CisgIHJldHVybiBXZWJQUGljdHVyZVZpZXcoY3Vycl9jYW52YXMsIHJlY3QtPnhfb2Zmc2V0XywgcmVjdC0+eV9vZmZzZXRfLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPndpZHRoXywgcmVjdC0+aGVpZ2h0Xywgc3ViX2ZyYW1lKTsKK30KKworLy8gUGlja3Mgb3B0aW1hbCBmcmFtZSByZWN0YW5nbGUgZm9yIGJvdGggbG9zc2xlc3MgYW5kIGxvc3N5IGNvbXByZXNzaW9uLiBUaGUKKy8vIGluaXRpYWwgZ3Vlc3MgZm9yIGZyYW1lIHJlY3RhbmdsZXMgd2lsbCBiZSB0aGUgZnVsbCBjYW52YXMuCitzdGF0aWMgaW50IEdldFN1YlJlY3RzKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzLCBpbnQgaXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfZmlyc3RfZnJhbWUsIGZsb2F0IHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgIFN1YkZyYW1lUGFyYW1zKiBjb25zdCBwYXJhbXMpIHsKKyAgLy8gTG9zc2xlc3MgZnJhbWUgcmVjdGFuZ2xlLgorICBwYXJhbXMtPnJlY3RfbGxfLnhfb2Zmc2V0XyA9IDA7CisgIHBhcmFtcy0+cmVjdF9sbF8ueV9vZmZzZXRfID0gMDsKKyAgcGFyYW1zLT5yZWN0X2xsXy53aWR0aF8gPSBjdXJyX2NhbnZhcy0+d2lkdGg7CisgIHBhcmFtcy0+cmVjdF9sbF8uaGVpZ2h0XyA9IGN1cnJfY2FudmFzLT5oZWlnaHQ7CisgIGlmICghR2V0U3ViUmVjdChwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsIGlzX2tleV9mcmFtZSwgaXNfZmlyc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgICBwYXJhbXMtPmVtcHR5X3JlY3RfYWxsb3dlZF8sIDEsIHF1YWxpdHksCisgICAgICAgICAgICAgICAgICAmcGFyYW1zLT5yZWN0X2xsXywgJnBhcmFtcy0+c3ViX2ZyYW1lX2xsXykpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICAvLyBMb3NzeSBmcmFtZSByZWN0YW5nbGUuCisgIHBhcmFtcy0+cmVjdF9sb3NzeV8gPSBwYXJhbXMtPnJlY3RfbGxfOyAgLy8gc2VlZCB3aXRoIGxvc3NsZXNzIHJlY3QuCisgIHJldHVybiBHZXRTdWJSZWN0KHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgaXNfa2V5X2ZyYW1lLCBpc19maXJzdF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5lbXB0eV9yZWN0X2FsbG93ZWRfLCAwLCBxdWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLT5yZWN0X2xvc3N5XywgJnBhcmFtcy0+c3ViX2ZyYW1lX2xvc3N5Xyk7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgY2xpcChpbnQgdiwgaW50IG1pbl92LCBpbnQgbWF4X3YpIHsKKyAgcmV0dXJuICh2IDwgbWluX3YpID8gbWluX3YgOiAodiA+IG1heF92KSA/IG1heF92IDogdjsKK30KKworaW50IFdlYlBBbmltRW5jb2RlclJlZmluZVJlY3QoCisgICAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLCBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMsCisgICAgaW50IGlzX2xvc3NsZXNzLCBmbG9hdCBxdWFsaXR5LCBpbnQqIGNvbnN0IHhfb2Zmc2V0LCBpbnQqIGNvbnN0IHlfb2Zmc2V0LAorICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KSB7CisgIEZyYW1lUmVjdGFuZ2xlIHJlY3Q7CisgIGNvbnN0IGludCByaWdodCA9IGNsaXAoKnhfb2Zmc2V0ICsgKndpZHRoLCAwLCBjdXJyX2NhbnZhcy0+d2lkdGgpOworICBjb25zdCBpbnQgbGVmdCA9IGNsaXAoKnhfb2Zmc2V0LCAwLCBjdXJyX2NhbnZhcy0+d2lkdGggLSAxKTsKKyAgY29uc3QgaW50IGJvdHRvbSA9IGNsaXAoKnlfb2Zmc2V0ICsgKmhlaWdodCwgMCwgY3Vycl9jYW52YXMtPmhlaWdodCk7CisgIGNvbnN0IGludCB0b3AgPSBjbGlwKCp5X29mZnNldCwgMCwgY3Vycl9jYW52YXMtPmhlaWdodCAtIDEpOworICBpZiAocHJldl9jYW52YXMgPT0gTlVMTCB8fCBjdXJyX2NhbnZhcyA9PSBOVUxMIHx8CisgICAgICBwcmV2X2NhbnZhcy0+d2lkdGggIT0gY3Vycl9jYW52YXMtPndpZHRoIHx8CisgICAgICBwcmV2X2NhbnZhcy0+aGVpZ2h0ICE9IGN1cnJfY2FudmFzLT5oZWlnaHQgfHwKKyAgICAgICFwcmV2X2NhbnZhcy0+dXNlX2FyZ2IgfHwgIWN1cnJfY2FudmFzLT51c2VfYXJnYikgeworICAgIHJldHVybiAwOworICB9CisgIHJlY3QueF9vZmZzZXRfID0gbGVmdDsKKyAgcmVjdC55X29mZnNldF8gPSB0b3A7CisgIHJlY3Qud2lkdGhfID0gY2xpcChyaWdodCAtIGxlZnQsIDAsIGN1cnJfY2FudmFzLT53aWR0aCAtIHJlY3QueF9vZmZzZXRfKTsKKyAgcmVjdC5oZWlnaHRfID0gY2xpcChib3R0b20gLSB0b3AsIDAsIGN1cnJfY2FudmFzLT5oZWlnaHQgLSByZWN0Lnlfb2Zmc2V0Xyk7CisgIE1pbmltaXplQ2hhbmdlUmVjdGFuZ2xlKHByZXZfY2FudmFzLCBjdXJyX2NhbnZhcywgJnJlY3QsIGlzX2xvc3NsZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFsaXR5KTsKKyAgU25hcFRvRXZlbk9mZnNldHMoJnJlY3QpOworICAqeF9vZmZzZXQgPSByZWN0Lnhfb2Zmc2V0XzsKKyAgKnlfb2Zmc2V0ID0gcmVjdC55X29mZnNldF87CisgICp3aWR0aCA9IHJlY3Qud2lkdGhfOworICAqaGVpZ2h0ID0gcmVjdC5oZWlnaHRfOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgRGlzcG9zZUZyYW1lUmVjdGFuZ2xlKGludCBkaXNwb3NlX21ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMpIHsKKyAgYXNzZXJ0KHJlY3QgIT0gTlVMTCk7CisgIGlmIChkaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQpIHsKKyAgICBXZWJQVXRpbENsZWFyUGljKGN1cnJfY2FudmFzLCByZWN0KTsKKyAgfQorfQorCitzdGF0aWMgdWludDMyX3QgUmVjdEFyZWEoY29uc3QgRnJhbWVSZWN0YW5nbGUqIGNvbnN0IHJlY3QpIHsKKyAgcmV0dXJuICh1aW50MzJfdClyZWN0LT53aWR0aF8gKiByZWN0LT5oZWlnaHRfOworfQorCitzdGF0aWMgaW50IElzTG9zc2xlc3NCbGVuZGluZ1Bvc3NpYmxlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0KSB7CisgIGludCBpLCBqOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXyA8PSBkc3QtPndpZHRoKTsKKyAgYXNzZXJ0KHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF8gPD0gZHN0LT5oZWlnaHQpOworICBmb3IgKGogPSByZWN0LT55X29mZnNldF87IGogPCByZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfOyArK2opIHsKKyAgICBmb3IgKGkgPSByZWN0LT54X29mZnNldF87IGkgPCByZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF87ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3Qgc3JjX3BpeGVsID0gc3JjLT5hcmdiW2ogKiBzcmMtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgICBjb25zdCB1aW50MzJfdCBkc3RfcGl4ZWwgPSBkc3QtPmFyZ2JbaiAqIGRzdC0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGRzdF9hbHBoYSA9IGRzdF9waXhlbCA+PiAyNDsKKyAgICAgIGlmIChkc3RfYWxwaGEgIT0gMHhmZiAmJiBzcmNfcGl4ZWwgIT0gZHN0X3BpeGVsKSB7CisgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgaWYgd2UgdXNlIGJsZW5kaW5nLCB3ZSBjYW4ndCBhdHRhaW4gdGhlIGRlc2lyZWQKKyAgICAgICAgLy8gJ2RzdF9waXhlbCcgdmFsdWUgZm9yIHRoaXMgcGl4ZWwuIFNvLCBibGVuZGluZyBpcyBub3QgcG9zc2libGUuCisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBJc0xvc3N5QmxlbmRpbmdQb3NzaWJsZShjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eSkgeworICBjb25zdCBpbnQgbWF4X2FsbG93ZWRfZGlmZl9sb3NzeSA9IFF1YWxpdHlUb01heERpZmYocXVhbGl0eSk7CisgIGludCBpLCBqOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KHJlY3QtPnhfb2Zmc2V0XyArIHJlY3QtPndpZHRoXyA8PSBkc3QtPndpZHRoKTsKKyAgYXNzZXJ0KHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF8gPD0gZHN0LT5oZWlnaHQpOworICBmb3IgKGogPSByZWN0LT55X29mZnNldF87IGogPCByZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfOyArK2opIHsKKyAgICBmb3IgKGkgPSByZWN0LT54X29mZnNldF87IGkgPCByZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF87ICsraSkgeworICAgICAgY29uc3QgdWludDMyX3Qgc3JjX3BpeGVsID0gc3JjLT5hcmdiW2ogKiBzcmMtPmFyZ2Jfc3RyaWRlICsgaV07CisgICAgICBjb25zdCB1aW50MzJfdCBkc3RfcGl4ZWwgPSBkc3QtPmFyZ2JbaiAqIGRzdC0+YXJnYl9zdHJpZGUgKyBpXTsKKyAgICAgIGNvbnN0IHVpbnQzMl90IGRzdF9hbHBoYSA9IGRzdF9waXhlbCA+PiAyNDsKKyAgICAgIGlmIChkc3RfYWxwaGEgIT0gMHhmZiAmJgorICAgICAgICAgICFQaXhlbHNBcmVTaW1pbGFyKHNyY19waXhlbCwgZHN0X3BpeGVsLCBtYXhfYWxsb3dlZF9kaWZmX2xvc3N5KSkgeworICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIGlmIHdlIHVzZSBibGVuZGluZywgd2UgY2FuJ3QgYXR0YWluIHRoZSBkZXNpcmVkCisgICAgICAgIC8vICdkc3RfcGl4ZWwnIHZhbHVlIGZvciB0aGlzIHBpeGVsLiBTbywgYmxlbmRpbmcgaXMgbm90IHBvc3NpYmxlLgorICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIEZvciBwaXhlbHMgaW4gJ3JlY3QnLCByZXBsYWNlIHRob3NlIHBpeGVscyBpbiAnZHN0JyB0aGF0IGFyZSBzYW1lIGFzICdzcmMnIGJ5CisvLyB0cmFuc3BhcmVudCBwaXhlbHMuCisvLyBSZXR1cm5zIHRydWUgaWYgYXQgbGVhc3Qgb25lIHBpeGVsIGdldHMgbW9kaWZpZWQuCitzdGF0aWMgaW50IEluY3JlYXNlVHJhbnNwYXJlbmN5KGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlKiBjb25zdCByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgZHN0KSB7CisgIGludCBpLCBqOworICBpbnQgbW9kaWZpZWQgPSAwOworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwgJiYgcmVjdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGZvciAoaiA9IHJlY3QtPnlfb2Zmc2V0XzsgaiA8IHJlY3QtPnlfb2Zmc2V0XyArIHJlY3QtPmhlaWdodF87ICsraikgeworICAgIGNvbnN0IHVpbnQzMl90KiBjb25zdCBwc3JjID0gc3JjLT5hcmdiICsgaiAqIHNyYy0+YXJnYl9zdHJpZGU7CisgICAgdWludDMyX3QqIGNvbnN0IHBkc3QgPSBkc3QtPmFyZ2IgKyBqICogZHN0LT5hcmdiX3N0cmlkZTsKKyAgICBmb3IgKGkgPSByZWN0LT54X29mZnNldF87IGkgPCByZWN0LT54X29mZnNldF8gKyByZWN0LT53aWR0aF87ICsraSkgeworICAgICAgaWYgKHBzcmNbaV0gPT0gcGRzdFtpXSAmJiBwZHN0W2ldICE9IFRSQU5TUEFSRU5UX0NPTE9SKSB7CisgICAgICAgIHBkc3RbaV0gPSBUUkFOU1BBUkVOVF9DT0xPUjsKKyAgICAgICAgbW9kaWZpZWQgPSAxOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gbW9kaWZpZWQ7Cit9CisKKyN1bmRlZiBUUkFOU1BBUkVOVF9DT0xPUgorCisvLyBSZXBsYWNlIHNpbWlsYXIgYmxvY2tzIG9mIHBpeGVscyBieSBhICdzZWUtdGhyb3VnaCcgdHJhbnNwYXJlbnQgYmxvY2sKKy8vIHdpdGggdW5pZm9ybSBhdmVyYWdlIGNvbG9yLgorLy8gQXNzdW1lcyBsb3NzeSBjb21wcmVzc2lvbiBpcyBiZWluZyB1c2VkLgorLy8gUmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBwaXhlbCBnZXRzIG1vZGlmaWVkLgorc3RhdGljIGludCBGbGF0dGVuU2ltaWxhckJsb2Nrcyhjb25zdCBXZWJQUGljdHVyZSogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCwgZmxvYXQgcXVhbGl0eSkgeworICBjb25zdCBpbnQgbWF4X2FsbG93ZWRfZGlmZl9sb3NzeSA9IFF1YWxpdHlUb01heERpZmYocXVhbGl0eSk7CisgIGludCBpLCBqOworICBpbnQgbW9kaWZpZWQgPSAwOworICBjb25zdCBpbnQgYmxvY2tfc2l6ZSA9IDg7CisgIGNvbnN0IGludCB5X3N0YXJ0ID0gKHJlY3QtPnlfb2Zmc2V0XyArIGJsb2NrX3NpemUpICYgfihibG9ja19zaXplIC0gMSk7CisgIGNvbnN0IGludCB5X2VuZCA9IChyZWN0LT55X29mZnNldF8gKyByZWN0LT5oZWlnaHRfKSAmIH4oYmxvY2tfc2l6ZSAtIDEpOworICBjb25zdCBpbnQgeF9zdGFydCA9IChyZWN0LT54X29mZnNldF8gKyBibG9ja19zaXplKSAmIH4oYmxvY2tfc2l6ZSAtIDEpOworICBjb25zdCBpbnQgeF9lbmQgPSAocmVjdC0+eF9vZmZzZXRfICsgcmVjdC0+d2lkdGhfKSAmIH4oYmxvY2tfc2l6ZSAtIDEpOworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwgJiYgcmVjdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+d2lkdGggPT0gZHN0LT53aWR0aCAmJiBzcmMtPmhlaWdodCA9PSBkc3QtPmhlaWdodCk7CisgIGFzc2VydCgoYmxvY2tfc2l6ZSAmIChibG9ja19zaXplIC0gMSkpID09IDApOyAgLy8gbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggYmxvY2sgYW5kIGNvdW50IHNpbWlsYXIgcGl4ZWxzLgorICBmb3IgKGogPSB5X3N0YXJ0OyBqIDwgeV9lbmQ7IGogKz0gYmxvY2tfc2l6ZSkgeworICAgIGZvciAoaSA9IHhfc3RhcnQ7IGkgPCB4X2VuZDsgaSArPSBibG9ja19zaXplKSB7CisgICAgICBpbnQgY250ID0gMDsKKyAgICAgIGludCBhdmdfciA9IDAsIGF2Z19nID0gMCwgYXZnX2IgPSAwOworICAgICAgaW50IHgsIHk7CisgICAgICBjb25zdCB1aW50MzJfdCogY29uc3QgcHNyYyA9IHNyYy0+YXJnYiArIGogKiBzcmMtPmFyZ2Jfc3RyaWRlICsgaTsKKyAgICAgIHVpbnQzMl90KiBjb25zdCBwZHN0ID0gZHN0LT5hcmdiICsgaiAqIGRzdC0+YXJnYl9zdHJpZGUgKyBpOworICAgICAgZm9yICh5ID0gMDsgeSA8IGJsb2NrX3NpemU7ICsreSkgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgYmxvY2tfc2l6ZTsgKyt4KSB7CisgICAgICAgICAgY29uc3QgdWludDMyX3Qgc3JjX3BpeGVsID0gcHNyY1t4ICsgeSAqIHNyYy0+YXJnYl9zdHJpZGVdOworICAgICAgICAgIGNvbnN0IGludCBhbHBoYSA9IHNyY19waXhlbCA+PiAyNDsKKyAgICAgICAgICBpZiAoYWxwaGEgPT0gMHhmZiAmJgorICAgICAgICAgICAgICBQaXhlbHNBcmVTaW1pbGFyKHNyY19waXhlbCwgcGRzdFt4ICsgeSAqIGRzdC0+YXJnYl9zdHJpZGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hbGxvd2VkX2RpZmZfbG9zc3kpKSB7CisgICAgICAgICAgICArK2NudDsKKyAgICAgICAgICAgIGF2Z19yICs9IChzcmNfcGl4ZWwgPj4gMTYpICYgMHhmZjsKKyAgICAgICAgICAgIGF2Z19nICs9IChzcmNfcGl4ZWwgPj4gOCkgJiAweGZmOworICAgICAgICAgICAgYXZnX2IgKz0gKHNyY19waXhlbCA+PiAwKSAmIDB4ZmY7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvLyBJZiB3ZSBoYXZlIGEgZnVsbHkgc2ltaWxhciBibG9jaywgd2UgcmVwbGFjZSBpdCB3aXRoIGFuCisgICAgICAvLyBhdmVyYWdlIHRyYW5zcGFyZW50IGJsb2NrLiBUaGlzIGNvbXByZXNzZXMgYmV0dGVyIGluIGxvc3N5IG1vZGUuCisgICAgICBpZiAoY250ID09IGJsb2NrX3NpemUgKiBibG9ja19zaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvbG9yID0gKDB4MDAgICAgICAgICAgPDwgMjQpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGF2Z19yIC8gY250KSA8PCAxNikgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYXZnX2cgLyBjbnQpIDw8ICA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChhdmdfYiAvIGNudCkgPDwgIDApOworICAgICAgICBmb3IgKHkgPSAwOyB5IDwgYmxvY2tfc2l6ZTsgKyt5KSB7CisgICAgICAgICAgZm9yICh4ID0gMDsgeCA8IGJsb2NrX3NpemU7ICsreCkgeworICAgICAgICAgICAgcGRzdFt4ICsgeSAqIGRzdC0+YXJnYl9zdHJpZGVdID0gY29sb3I7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1vZGlmaWVkID0gMTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG1vZGlmaWVkOworfQorCitzdGF0aWMgaW50IEVuY29kZUZyYW1lKGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywgV2ViUFBpY3R1cmUqIGNvbnN0IHBpYywKKyAgICAgICAgICAgICAgICAgICAgICAgV2ViUE1lbW9yeVdyaXRlciogY29uc3QgbWVtb3J5KSB7CisgIHBpYy0+dXNlX2FyZ2IgPSAxOworICBwaWMtPndyaXRlciA9IFdlYlBNZW1vcnlXcml0ZTsKKyAgcGljLT5jdXN0b21fcHRyID0gbWVtb3J5OworICBpZiAoIVdlYlBFbmNvZGUoY29uZmlnLCBwaWMpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8vIFN0cnVjdCByZXByZXNlbnRpbmcgYSBjYW5kaWRhdGUgZW5jb2RlZCBmcmFtZSBpbmNsdWRpbmcgaXRzIG1ldGFkYXRhLgordHlwZWRlZiBzdHJ1Y3QgeworICBXZWJQTWVtb3J5V3JpdGVyICBtZW1fOworICBXZWJQTXV4RnJhbWVJbmZvICBpbmZvXzsKKyAgRnJhbWVSZWN0YW5nbGUgICAgcmVjdF87CisgIGludCAgICAgICAgICAgICAgIGV2YWx1YXRlXzsgIC8vIFRydWUgaWYgdGhpcyBjYW5kaWRhdGUgc2hvdWxkIGJlIGV2YWx1YXRlZC4KK30gQ2FuZGlkYXRlOworCisvLyBHZW5lcmF0ZXMgYSBjYW5kaWRhdGUgZW5jb2RlZCBmcmFtZSBnaXZlbiBhIHBpY3R1cmUgYW5kIG1ldGFkYXRhLgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIEVuY29kZUNhbmRpZGF0ZShXZWJQUGljdHVyZSogY29uc3Qgc3ViX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVJlY3RhbmdsZSogY29uc3QgcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUENvbmZpZyogY29uc3QgZW5jb2Rlcl9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VfYmxlbmRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbmRpZGF0ZSogY29uc3QgY2FuZGlkYXRlKSB7CisgIFdlYlBDb25maWcgY29uZmlnID0gKmVuY29kZXJfY29uZmlnOworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlID0gVlA4X0VOQ19PSzsKKyAgYXNzZXJ0KGNhbmRpZGF0ZSAhPSBOVUxMKTsKKyAgbWVtc2V0KGNhbmRpZGF0ZSwgMCwgc2l6ZW9mKCpjYW5kaWRhdGUpKTsKKworICAvLyBTZXQgZnJhbWUgcmVjdCBhbmQgaW5mby4KKyAgY2FuZGlkYXRlLT5yZWN0XyA9ICpyZWN0OworICBjYW5kaWRhdGUtPmluZm9fLmlkID0gV0VCUF9DSFVOS19BTk1GOworICBjYW5kaWRhdGUtPmluZm9fLnhfb2Zmc2V0ID0gcmVjdC0+eF9vZmZzZXRfOworICBjYW5kaWRhdGUtPmluZm9fLnlfb2Zmc2V0ID0gcmVjdC0+eV9vZmZzZXRfOworICBjYW5kaWRhdGUtPmluZm9fLmRpc3Bvc2VfbWV0aG9kID0gV0VCUF9NVVhfRElTUE9TRV9OT05FOyAgLy8gU2V0IGxhdGVyLgorICBjYW5kaWRhdGUtPmluZm9fLmJsZW5kX21ldGhvZCA9CisgICAgICB1c2VfYmxlbmRpbmcgPyBXRUJQX01VWF9CTEVORCA6IFdFQlBfTVVYX05PX0JMRU5EOworICBjYW5kaWRhdGUtPmluZm9fLmR1cmF0aW9uID0gMDsgIC8vIFNldCBpbiBuZXh0IGNhbGwgdG8gV2ViUEFuaW1FbmNvZGVyQWRkKCkuCisKKyAgLy8gRW5jb2RlIHBpY3R1cmUuCisgIFdlYlBNZW1vcnlXcml0ZXJJbml0KCZjYW5kaWRhdGUtPm1lbV8pOworCisgIGlmICghY29uZmlnLmxvc3NsZXNzICYmIHVzZV9ibGVuZGluZykgeworICAgIC8vIERpc2FibGUgZmlsdGVyaW5nIHRvIGF2b2lkIGJsb2NraW5lc3MgaW4gcmVjb25zdHJ1Y3RlZCBmcmFtZXMgYXQgdGhlCisgICAgLy8gdGltZSBvZiBkZWNvZGluZy4KKyAgICBjb25maWcuYXV0b2ZpbHRlciA9IDA7CisgICAgY29uZmlnLmZpbHRlcl9zdHJlbmd0aCA9IDA7CisgIH0KKyAgaWYgKCFFbmNvZGVGcmFtZSgmY29uZmlnLCBzdWJfZnJhbWUsICZjYW5kaWRhdGUtPm1lbV8pKSB7CisgICAgZXJyb3JfY29kZSA9IHN1Yl9mcmFtZS0+ZXJyb3JfY29kZTsKKyAgICBnb3RvIEVycjsKKyAgfQorCisgIGNhbmRpZGF0ZS0+ZXZhbHVhdGVfID0gMTsKKyAgcmV0dXJuIGVycm9yX2NvZGU7CisKKyBFcnI6CisgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmY2FuZGlkYXRlLT5tZW1fKTsKKyAgcmV0dXJuIGVycm9yX2NvZGU7Cit9CisKK3N0YXRpYyB2b2lkIENvcHlDdXJyZW50Q2FudmFzKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jKSB7CisgIGlmIChlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfKSB7CisgICAgV2ViUENvcHlQaXhlbHMoZW5jLT5jdXJyX2NhbnZhc18sICZlbmMtPmN1cnJfY2FudmFzX2NvcHlfKTsKKyAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfLnByb2dyZXNzX2hvb2sgPSBlbmMtPmN1cnJfY2FudmFzXy0+cHJvZ3Jlc3NfaG9vazsKKyAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfLnVzZXJfZGF0YSA9IGVuYy0+Y3Vycl9jYW52YXNfLT51c2VyX2RhdGE7CisgICAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9IDA7CisgIH0KK30KKworZW51bSB7CisgIExMX0RJU1BfTk9ORSA9IDAsCisgIExMX0RJU1BfQkcsCisgIExPU1NZX0RJU1BfTk9ORSwKKyAgTE9TU1lfRElTUF9CRywKKyAgQ0FORElEQVRFX0NPVU5UCit9OworCisjZGVmaW5lIE1JTl9DT0xPUlNfTE9TU1kgICAgIDMxICAvLyBEb24ndCB0cnkgbG9zc3kgYmVsb3cgdGhpcyB0aHJlc2hvbGQuCisjZGVmaW5lIE1BWF9DT0xPUlNfTE9TU0xFU1MgMTk0ICAvLyBEb24ndCB0cnkgbG9zc2xlc3MgYWJvdmUgdGhpcyB0aHJlc2hvbGQuCisKKy8vIEdlbmVyYXRlcyBjYW5kaWRhdGVzIGZvciBhIGdpdmVuIGRpc3Bvc2UgbWV0aG9kIGdpdmVuIHByZS1maWxsZWQgc3ViLWZyYW1lCisvLyAncGFyYW1zJy4KK3N0YXRpYyBXZWJQRW5jb2RpbmdFcnJvciBHZW5lcmF0ZUNhbmRpZGF0ZXMoCisgICAgV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsIENhbmRpZGF0ZSBjYW5kaWRhdGVzW0NBTkRJREFURV9DT1VOVF0sCisgICAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kLCBpbnQgaXNfbG9zc2xlc3MsIGludCBpc19rZXlfZnJhbWUsCisgICAgU3ViRnJhbWVQYXJhbXMqIGNvbnN0IHBhcmFtcywKKyAgICBjb25zdCBXZWJQQ29uZmlnKiBjb25zdCBjb25maWdfbGwsIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZ19sb3NzeSkgeworICBXZWJQRW5jb2RpbmdFcnJvciBlcnJvcl9jb2RlID0gVlA4X0VOQ19PSzsKKyAgY29uc3QgaW50IGlzX2Rpc3Bvc2Vfbm9uZSA9IChkaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX05PTkUpOworICBDYW5kaWRhdGUqIGNvbnN0IGNhbmRpZGF0ZV9sbCA9CisgICAgICBpc19kaXNwb3NlX25vbmUgPyAmY2FuZGlkYXRlc1tMTF9ESVNQX05PTkVdIDogJmNhbmRpZGF0ZXNbTExfRElTUF9CR107CisgIENhbmRpZGF0ZSogY29uc3QgY2FuZGlkYXRlX2xvc3N5ID0gaXNfZGlzcG9zZV9ub25lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmY2FuZGlkYXRlc1tMT1NTWV9ESVNQX05PTkVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmY2FuZGlkYXRlc1tMT1NTWV9ESVNQX0JHXTsKKyAgV2ViUFBpY3R1cmUqIGNvbnN0IGN1cnJfY2FudmFzID0gJmVuYy0+Y3Vycl9jYW52YXNfY29weV87CisgIGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhcyA9CisgICAgICBpc19kaXNwb3NlX25vbmUgPyAmZW5jLT5wcmV2X2NhbnZhc18gOiAmZW5jLT5wcmV2X2NhbnZhc19kaXNwb3NlZF87CisgIGludCB1c2VfYmxlbmRpbmdfbGwsIHVzZV9ibGVuZGluZ19sb3NzeTsKKyAgaW50IGV2YWx1YXRlX2xsLCBldmFsdWF0ZV9sb3NzeTsKKworICBDb3B5Q3VycmVudENhbnZhcyhlbmMpOworICB1c2VfYmxlbmRpbmdfbGwgPQorICAgICAgIWlzX2tleV9mcmFtZSAmJgorICAgICAgSXNMb3NzbGVzc0JsZW5kaW5nUG9zc2libGUocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCAmcGFyYW1zLT5yZWN0X2xsXyk7CisgIHVzZV9ibGVuZGluZ19sb3NzeSA9CisgICAgICAhaXNfa2V5X2ZyYW1lICYmCisgICAgICBJc0xvc3N5QmxlbmRpbmdQb3NzaWJsZShwcmV2X2NhbnZhcywgY3Vycl9jYW52YXMsICZwYXJhbXMtPnJlY3RfbG9zc3lfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2xvc3N5LT5xdWFsaXR5KTsKKworICAvLyBQaWNrIGNhbmRpZGF0ZXMgdG8gYmUgdHJpZWQuCisgIGlmICghZW5jLT5vcHRpb25zXy5hbGxvd19taXhlZCkgeworICAgIGV2YWx1YXRlX2xsID0gaXNfbG9zc2xlc3M7CisgICAgZXZhbHVhdGVfbG9zc3kgPSAhaXNfbG9zc2xlc3M7CisgIH0gZWxzZSBpZiAoZW5jLT5vcHRpb25zXy5taW5pbWl6ZV9zaXplKSB7CisgICAgZXZhbHVhdGVfbGwgPSAxOworICAgIGV2YWx1YXRlX2xvc3N5ID0gMTsKKyAgfSBlbHNlIHsgIC8vIFVzZSBhIGhldXJpc3RpYyBmb3IgdHJ5aW5nIGxvc3NsZXNzIGFuZC9vciBsb3NzeSBjb21wcmVzc2lvbi4KKyAgICBjb25zdCBpbnQgbnVtX2NvbG9ycyA9IFdlYlBHZXRDb2xvclBhbGV0dGUoJnBhcmFtcy0+c3ViX2ZyYW1lX2xsXywgTlVMTCk7CisgICAgZXZhbHVhdGVfbGwgPSAobnVtX2NvbG9ycyA8IE1BWF9DT0xPUlNfTE9TU0xFU1MpOworICAgIGV2YWx1YXRlX2xvc3N5ID0gKG51bV9jb2xvcnMgPj0gTUlOX0NPTE9SU19MT1NTWSk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBjYW5kaWRhdGVzLgorICBpZiAoZXZhbHVhdGVfbGwpIHsKKyAgICBDb3B5Q3VycmVudENhbnZhcyhlbmMpOworICAgIGlmICh1c2VfYmxlbmRpbmdfbGwpIHsKKyAgICAgIGVuYy0+Y3Vycl9jYW52YXNfY29weV9tb2RpZmllZF8gPQorICAgICAgICAgIEluY3JlYXNlVHJhbnNwYXJlbmN5KHByZXZfY2FudmFzLCAmcGFyYW1zLT5yZWN0X2xsXywgY3Vycl9jYW52YXMpOworICAgIH0KKyAgICBlcnJvcl9jb2RlID0gRW5jb2RlQ2FuZGlkYXRlKCZwYXJhbXMtPnN1Yl9mcmFtZV9sbF8sICZwYXJhbXMtPnJlY3RfbGxfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2xsLCB1c2VfYmxlbmRpbmdfbGwsIGNhbmRpZGF0ZV9sbCk7CisgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgcmV0dXJuIGVycm9yX2NvZGU7CisgIH0KKyAgaWYgKGV2YWx1YXRlX2xvc3N5KSB7CisgICAgQ29weUN1cnJlbnRDYW52YXMoZW5jKTsKKyAgICBpZiAodXNlX2JsZW5kaW5nX2xvc3N5KSB7CisgICAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0KKyAgICAgICAgICBGbGF0dGVuU2ltaWxhckJsb2NrcyhwcmV2X2NhbnZhcywgJnBhcmFtcy0+cmVjdF9sb3NzeV8sIGN1cnJfY2FudmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sb3NzeS0+cXVhbGl0eSk7CisgICAgfQorICAgIGVycm9yX2NvZGUgPQorICAgICAgICBFbmNvZGVDYW5kaWRhdGUoJnBhcmFtcy0+c3ViX2ZyYW1lX2xvc3N5XywgJnBhcmFtcy0+cmVjdF9sb3NzeV8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdfbG9zc3ksIHVzZV9ibGVuZGluZ19sb3NzeSwgY2FuZGlkYXRlX2xvc3N5KTsKKyAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSByZXR1cm4gZXJyb3JfY29kZTsKKyAgICBlbmMtPmN1cnJfY2FudmFzX2NvcHlfbW9kaWZpZWRfID0gMTsKKyAgfQorICByZXR1cm4gZXJyb3JfY29kZTsKK30KKworI3VuZGVmIE1JTl9DT0xPUlNfTE9TU1kKKyN1bmRlZiBNQVhfQ09MT1JTX0xPU1NMRVNTCisKK3N0YXRpYyB2b2lkIEdldEVuY29kZWREYXRhKGNvbnN0IFdlYlBNZW1vcnlXcml0ZXIqIGNvbnN0IG1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCBlbmNvZGVkX2RhdGEpIHsKKyAgZW5jb2RlZF9kYXRhLT5ieXRlcyA9IG1lbW9yeS0+bWVtOworICBlbmNvZGVkX2RhdGEtPnNpemUgID0gbWVtb3J5LT5zaXplOworfQorCisvLyBTZXRzIGRpc3Bvc2UgbWV0aG9kIG9mIHRoZSBwcmV2aW91cyBmcmFtZSB0byBiZSAnZGlzcG9zZV9tZXRob2QnLgorc3RhdGljIHZvaWQgU2V0UHJldmlvdXNEaXNwb3NlTWV0aG9kKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhBbmltRGlzcG9zZSBkaXNwb3NlX21ldGhvZCkgeworICBjb25zdCBzaXplX3QgcG9zaXRpb24gPSBlbmMtPmNvdW50XyAtIDI7CisgIEVuY29kZWRGcmFtZSogY29uc3QgcHJldl9lbmNfZnJhbWUgPSBHZXRGcmFtZShlbmMsIHBvc2l0aW9uKTsKKyAgYXNzZXJ0KGVuYy0+Y291bnRfID49IDIpOyAgLy8gQXMgY3VycmVudCBhbmQgcHJldmlvdXMgZnJhbWVzIGFyZSBpbiBlbmMuCisKKyAgaWYgKGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXykgeworICAgIGFzc2VydChkaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX05PTkUpOworICAgIHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmRpc3Bvc2VfbWV0aG9kID0gZGlzcG9zZV9tZXRob2Q7CisgICAgcHJldl9lbmNfZnJhbWUtPmtleV9mcmFtZV8uZGlzcG9zZV9tZXRob2QgPSBkaXNwb3NlX21ldGhvZDsKKyAgfSBlbHNlIHsKKyAgICBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBwcmV2X2luZm8gPSBwcmV2X2VuY19mcmFtZS0+aXNfa2V5X2ZyYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJnByZXZfZW5jX2ZyYW1lLT5rZXlfZnJhbWVfCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmcHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV87CisgICAgcHJldl9pbmZvLT5kaXNwb3NlX21ldGhvZCA9IGRpc3Bvc2VfbWV0aG9kOworICB9Cit9CisKK3N0YXRpYyBpbnQgSW5jcmVhc2VQcmV2aW91c0R1cmF0aW9uKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLCBpbnQgZHVyYXRpb24pIHsKKyAgY29uc3Qgc2l6ZV90IHBvc2l0aW9uID0gZW5jLT5jb3VudF8gLSAxOworICBFbmNvZGVkRnJhbWUqIGNvbnN0IHByZXZfZW5jX2ZyYW1lID0gR2V0RnJhbWUoZW5jLCBwb3NpdGlvbik7CisgIGludCBuZXdfZHVyYXRpb247CisKKyAgYXNzZXJ0KGVuYy0+Y291bnRfID49IDEpOworICBhc3NlcnQocHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gPT0KKyAgICAgICAgIHByZXZfZW5jX2ZyYW1lLT5rZXlfZnJhbWVfLmR1cmF0aW9uKTsKKyAgYXNzZXJ0KHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uID09CisgICAgICAgICAocHJldl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uZHVyYXRpb24gJiAoTUFYX0RVUkFUSU9OIC0gMSkpKTsKKyAgYXNzZXJ0KGR1cmF0aW9uID09IChkdXJhdGlvbiAmIChNQVhfRFVSQVRJT04gLSAxKSkpOworCisgIG5ld19kdXJhdGlvbiA9IHByZXZfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLmR1cmF0aW9uICsgZHVyYXRpb247CisgIGlmIChuZXdfZHVyYXRpb24gPj0gTUFYX0RVUkFUSU9OKSB7ICAvLyBTcGVjaWFsIGNhc2UuCisgICAgLy8gU2VwYXJhdGUgb3V0IHByZXZpb3VzIGZyYW1lIGZyb20gZWFybGllciBtZXJnZWQgZnJhbWVzIHRvIGF2b2lkIG92ZXJmbG93LgorICAgIC8vIFdlIGFkZCBhIDF4MSB0cmFuc3BhcmVudCBmcmFtZSBmb3IgdGhlIHByZXZpb3VzIGZyYW1lLCB3aXRoIGJsZW5kaW5nIG9uLgorICAgIGNvbnN0IEZyYW1lUmVjdGFuZ2xlIHJlY3QgPSB7IDAsIDAsIDEsIDEgfTsKKyAgICBjb25zdCB1aW50OF90IGxvc3NsZXNzXzF4MV9ieXRlc1tdID0geworICAgICAgMHg1MiwgMHg0OSwgMHg0NiwgMHg0NiwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NywgMHg0NSwgMHg0MiwgMHg1MCwKKyAgICAgIDB4NTYsIDB4NTAsIDB4MzgsIDB4NGMsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MmYsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgICAweDEwLCAweDg4LCAweDg4LCAweDA4CisgICAgfTsKKyAgICBjb25zdCBXZWJQRGF0YSBsb3NzbGVzc18xeDEgPSB7CisgICAgICAgIGxvc3NsZXNzXzF4MV9ieXRlcywgc2l6ZW9mKGxvc3NsZXNzXzF4MV9ieXRlcykKKyAgICB9OworICAgIGNvbnN0IHVpbnQ4X3QgbG9zc3lfMXgxX2J5dGVzW10gPSB7CisgICAgICAweDUyLCAweDQ5LCAweDQ2LCAweDQ2LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDU3LCAweDQ1LCAweDQyLCAweDUwLAorICAgICAgMHg1NiwgMHg1MCwgMHgzOCwgMHg1OCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDEsIDB4NGMsIDB4NTAsIDB4NDgsIDB4MDIsIDB4MDAsCisgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDU2LCAweDUwLCAweDM4LCAweDIwLCAweDE4LCAweDAwLCAweDAwLCAweDAwLAorICAgICAgMHgzMCwgMHgwMSwgMHgwMCwgMHg5ZCwgMHgwMSwgMHgyYSwgMHgwMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKKyAgICAgIDB4MzQsIDB4MjUsIDB4YTQsIDB4MDAsIDB4MDMsIDB4NzAsIDB4MDAsIDB4ZmUsIDB4ZmIsIDB4ZmQsIDB4NTAsIDB4MDAKKyAgICB9OworICAgIGNvbnN0IFdlYlBEYXRhIGxvc3N5XzF4MSA9IHsgbG9zc3lfMXgxX2J5dGVzLCBzaXplb2YobG9zc3lfMXgxX2J5dGVzKSB9OworICAgIGNvbnN0IGludCBjYW5fdXNlX2xvc3NsZXNzID0KKyAgICAgICAgKGVuYy0+bGFzdF9jb25maWdfLmxvc3NsZXNzIHx8IGVuYy0+b3B0aW9uc18uYWxsb3dfbWl4ZWQpOworICAgIEVuY29kZWRGcmFtZSogY29uc3QgY3Vycl9lbmNfZnJhbWUgPSBHZXRGcmFtZShlbmMsIGVuYy0+Y291bnRfKTsKKyAgICBjdXJyX2VuY19mcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDA7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uaWQgPSBXRUJQX0NIVU5LX0FOTUY7CisgICAgY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8ueF9vZmZzZXQgPSAwOworICAgIGN1cnJfZW5jX2ZyYW1lLT5zdWJfZnJhbWVfLnlfb2Zmc2V0ID0gMDsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kaXNwb3NlX21ldGhvZCA9IFdFQlBfTVVYX0RJU1BPU0VfTk9ORTsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5ibGVuZF9tZXRob2QgPSBXRUJQX01VWF9CTEVORDsKKyAgICBjdXJyX2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiA9IGR1cmF0aW9uOworICAgIGlmICghV2ViUERhdGFDb3B5KGNhbl91c2VfbG9zc2xlc3MgPyAmbG9zc2xlc3NfMXgxIDogJmxvc3N5XzF4MSwKKyAgICAgICAgICAgICAgICAgICAgICAmY3Vycl9lbmNfZnJhbWUtPnN1Yl9mcmFtZV8uYml0c3RyZWFtKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICsrZW5jLT5jb3VudF87CisgICAgKytlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV87CisgICAgZW5jLT5mbHVzaF9jb3VudF8gPSBlbmMtPmNvdW50XyAtIDE7CisgICAgZW5jLT5wcmV2X2NhbmRpZGF0ZV91bmRlY2lkZWRfID0gMDsKKyAgICBlbmMtPnByZXZfcmVjdF8gPSByZWN0OworICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlZ3VsYXIgY2FzZS4KKyAgICAvLyBJbmNyZWFzZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMgZnJhbWUgYnkgJ2R1cmF0aW9uJy4KKyAgICBwcmV2X2VuY19mcmFtZS0+c3ViX2ZyYW1lXy5kdXJhdGlvbiA9IG5ld19kdXJhdGlvbjsKKyAgICBwcmV2X2VuY19mcmFtZS0+a2V5X2ZyYW1lXy5kdXJhdGlvbiA9IG5ld19kdXJhdGlvbjsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gUGljayB0aGUgY2FuZGlkYXRlIGVuY29kZWQgZnJhbWUgd2l0aCBzbWFsbGVzdCBzaXplIGFuZCByZWxlYXNlIG90aGVyCisvLyBjYW5kaWRhdGVzLgorLy8gVE9ETyhsYXRlcik6IFBlcmhhcHMgYSByb3VnaCBTU0lNL1BTTlIgcHJvZHVjZWQgYnkgdGhlIGVuY29kZXIgc2hvdWxkCisvLyBhbHNvIGJlIGEgY3JpdGVyaWEsIGluIGFkZGl0aW9uIHRvIHNpemVzLgorc3RhdGljIHZvaWQgUGlja0Jlc3RDYW5kaWRhdGUoV2ViUEFuaW1FbmNvZGVyKiBjb25zdCBlbmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5kaWRhdGUqIGNvbnN0IGNhbmRpZGF0ZXMsIGludCBpc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmNvZGVkRnJhbWUqIGNvbnN0IGVuY29kZWRfZnJhbWUpIHsKKyAgaW50IGk7CisgIGludCBiZXN0X2lkeCA9IC0xOworICBzaXplX3QgYmVzdF9zaXplID0gfjA7CisgIGZvciAoaSA9IDA7IGkgPCBDQU5ESURBVEVfQ09VTlQ7ICsraSkgeworICAgIGlmIChjYW5kaWRhdGVzW2ldLmV2YWx1YXRlXykgeworICAgICAgY29uc3Qgc2l6ZV90IGNhbmRpZGF0ZV9zaXplID0gY2FuZGlkYXRlc1tpXS5tZW1fLnNpemU7CisgICAgICBpZiAoY2FuZGlkYXRlX3NpemUgPCBiZXN0X3NpemUpIHsKKyAgICAgICAgYmVzdF9pZHggPSBpOworICAgICAgICBiZXN0X3NpemUgPSBjYW5kaWRhdGVfc2l6ZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgYXNzZXJ0KGJlc3RfaWR4ICE9IC0xKTsKKyAgZm9yIChpID0gMDsgaSA8IENBTkRJREFURV9DT1VOVDsgKytpKSB7CisgICAgaWYgKGNhbmRpZGF0ZXNbaV0uZXZhbHVhdGVfKSB7CisgICAgICBpZiAoaSA9PSBiZXN0X2lkeCkgeworICAgICAgICBXZWJQTXV4RnJhbWVJbmZvKiBjb25zdCBkc3QgPSBpc19rZXlfZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmZW5jb2RlZF9mcmFtZS0+a2V5X2ZyYW1lXworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICZlbmNvZGVkX2ZyYW1lLT5zdWJfZnJhbWVfOworICAgICAgICAqZHN0ID0gY2FuZGlkYXRlc1tpXS5pbmZvXzsKKyAgICAgICAgR2V0RW5jb2RlZERhdGEoJmNhbmRpZGF0ZXNbaV0ubWVtXywgJmRzdC0+Yml0c3RyZWFtKTsKKyAgICAgICAgaWYgKCFpc19rZXlfZnJhbWUpIHsKKyAgICAgICAgICAvLyBOb3RlOiBQcmV2aW91cyBkaXNwb3NlIG1ldGhvZCBvbmx5IG1hdHRlcnMgZm9yIG5vbi1rZXlmcmFtZXMuCisgICAgICAgICAgLy8gQWxzbywgd2UgZG9uJ3Qgd2FudCB0byBtb2RpZnkgcHJldmlvdXMgZGlzcG9zZSBtZXRob2QgdGhhdCB3YXMKKyAgICAgICAgICAvLyBzZWxlY3RlZCB3aGVuIGEgbm9uIGtleS1mcmFtZSB3YXMgYXNzdW1lZC4KKyAgICAgICAgICBjb25zdCBXZWJQTXV4QW5pbURpc3Bvc2UgcHJldl9kaXNwb3NlX21ldGhvZCA9CisgICAgICAgICAgICAgIChiZXN0X2lkeCA9PSBMTF9ESVNQX05PTkUgfHwgYmVzdF9pZHggPT0gTE9TU1lfRElTUF9OT05FKQorICAgICAgICAgICAgICAgICAgPyBXRUJQX01VWF9ESVNQT1NFX05PTkUKKyAgICAgICAgICAgICAgICAgIDogV0VCUF9NVVhfRElTUE9TRV9CQUNLR1JPVU5EOworICAgICAgICAgIFNldFByZXZpb3VzRGlzcG9zZU1ldGhvZChlbmMsIHByZXZfZGlzcG9zZV9tZXRob2QpOworICAgICAgICB9CisgICAgICAgIGVuYy0+cHJldl9yZWN0XyA9IGNhbmRpZGF0ZXNbaV0ucmVjdF87ICAvLyBzYXZlIGZvciBuZXh0IGZyYW1lLgorICAgICAgfSBlbHNlIHsKKyAgICAgICAgV2ViUE1lbW9yeVdyaXRlckNsZWFyKCZjYW5kaWRhdGVzW2ldLm1lbV8pOworICAgICAgICBjYW5kaWRhdGVzW2ldLmV2YWx1YXRlXyA9IDA7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKy8vIERlcGVuZGluZyBvbiB0aGUgY29uZmlndXJhdGlvbiwgdHJpZXMgZGlmZmVyZW50IGNvbXByZXNzaW9ucworLy8gKGxvc3N5L2xvc3NsZXNzKSwgZGlzcG9zZSBtZXRob2RzLCBibGVuZGluZyBtZXRob2RzIGV0YyB0byBlbmNvZGUgdGhlIGN1cnJlbnQKKy8vIGZyYW1lIGFuZCBvdXRwdXRzIHRoZSBiZXN0IG9uZSBpbiAnZW5jb2RlZF9mcmFtZScuCisvLyAnZnJhbWVfc2tpcHBlZCcgd2lsbCBiZSBzZXQgdG8gdHJ1ZSBpZiB0aGlzIGZyYW1lIHNob3VsZCBhY3R1YWxseSBiZSBza2lwcGVkLgorc3RhdGljIFdlYlBFbmNvZGluZ0Vycm9yIFNldEZyYW1lKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXNfa2V5X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuY29kZWRGcmFtZSogY29uc3QgZW5jb2RlZF9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IGZyYW1lX3NraXBwZWQpIHsKKyAgaW50IGk7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yX2NvZGUgPSBWUDhfRU5DX09LOworICBjb25zdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMgPSAmZW5jLT5jdXJyX2NhbnZhc19jb3B5XzsKKyAgY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzID0gJmVuYy0+cHJldl9jYW52YXNfOworICBDYW5kaWRhdGUgY2FuZGlkYXRlc1tDQU5ESURBVEVfQ09VTlRdOworICBjb25zdCBpbnQgaXNfbG9zc2xlc3MgPSBjb25maWctPmxvc3NsZXNzOworICBjb25zdCBpbnQgY29uc2lkZXJfbG9zc2xlc3MgPSBpc19sb3NzbGVzcyB8fCBlbmMtPm9wdGlvbnNfLmFsbG93X21peGVkOworICBjb25zdCBpbnQgY29uc2lkZXJfbG9zc3kgPSAhaXNfbG9zc2xlc3MgfHwgZW5jLT5vcHRpb25zXy5hbGxvd19taXhlZDsKKyAgY29uc3QgaW50IGlzX2ZpcnN0X2ZyYW1lID0gZW5jLT5pc19maXJzdF9mcmFtZV87CisKKyAgLy8gRmlyc3QgZnJhbWUgY2Fubm90IGJlIHNraXBwZWQgYXMgdGhlcmUgaXMgbm8gJ3ByZXZpb3VzIGZyYW1lJyB0byBtZXJnZSBpdAorICAvLyB0by4gU28sIGVtcHR5IHJlY3RhbmdsZSBpcyBub3QgYWxsb3dlZCBmb3IgdGhlIGZpcnN0IGZyYW1lLgorICBjb25zdCBpbnQgZW1wdHlfcmVjdF9hbGxvd2VkX25vbmUgPSAhaXNfZmlyc3RfZnJhbWU7CisKKyAgLy8gRXZlbiBpZiB0aGVyZSBpcyBleGFjdCBwaXhlbCBtYXRjaCBiZXR3ZWVuICdkaXNwb3NlZCBwcmV2aW91cyBjYW52YXMnIGFuZAorICAvLyAnY3VycmVudCBjYW52YXMnLCB3ZSBjYW4ndCBza2lwIGN1cnJlbnQgZnJhbWUsIGFzIHRoZXJlIG1heSBub3QgYmUgZXhhY3QKKyAgLy8gcGl4ZWwgbWF0Y2ggYmV0d2VlbiAncHJldmlvdXMgY2FudmFzJyBhbmQgJ2N1cnJlbnQgY2FudmFzJy4gU28sIHdlIGRvbid0CisgIC8vIGFsbG93IGVtcHR5IHJlY3RhbmdsZSBpbiB0aGlzIGNhc2UuCisgIGNvbnN0IGludCBlbXB0eV9yZWN0X2FsbG93ZWRfYmcgPSAwOworCisgIC8vIElmIGN1cnJlbnQgZnJhbWUgaXMgYSBrZXktZnJhbWUsIGRpc3Bvc2UgbWV0aG9kIG9mIHByZXZpb3VzIGZyYW1lIGRvZXNuJ3QKKyAgLy8gbWF0dGVyLCBzbyB3ZSBkb24ndCB0cnkgZGlzcG9zZSB0byBiYWNrZ3JvdW5kLgorICAvLyBBbHNvLCBpZiBrZXktZnJhbWUgaW5zZXJ0aW9uIGlzIG9uLCBhbmQgcHJldmlvdXMgZnJhbWUgY291bGQgYmUgcGlja2VkIGFzCisgIC8vIGVpdGhlciBhIHN1Yi1mcmFtZSBvciBhIGtleS1mcmFtZSwgdGhlbiB3ZSBjYW4ndCBiZSBzdXJlIGFib3V0IHdoYXQgZnJhbWUKKyAgLy8gcmVjdGFuZ2xlIHdvdWxkIGJlIGRpc3Bvc2VkLiBJbiB0aGF0IGNhc2UgdG9vLCB3ZSBkb24ndCB0cnkgZGlzcG9zZSB0bworICAvLyBiYWNrZ3JvdW5kLgorICBjb25zdCBpbnQgZGlzcG9zZV9iZ19wb3NzaWJsZSA9CisgICAgICAhaXNfa2V5X2ZyYW1lICYmICFlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF87CisKKyAgU3ViRnJhbWVQYXJhbXMgZGlzcG9zZV9ub25lX3BhcmFtczsKKyAgU3ViRnJhbWVQYXJhbXMgZGlzcG9zZV9iZ19wYXJhbXM7CisKKyAgV2ViUENvbmZpZyBjb25maWdfbGwgPSAqY29uZmlnOworICBXZWJQQ29uZmlnIGNvbmZpZ19sb3NzeSA9ICpjb25maWc7CisgIGNvbmZpZ19sbC5sb3NzbGVzcyA9IDE7CisgIGNvbmZpZ19sb3NzeS5sb3NzbGVzcyA9IDA7CisgIGVuYy0+bGFzdF9jb25maWdfID0gKmNvbmZpZzsKKyAgZW5jLT5sYXN0X2NvbmZpZ19yZXZlcnNlZF8gPSBjb25maWctPmxvc3NsZXNzID8gY29uZmlnX2xvc3N5IDogY29uZmlnX2xsOworICAqZnJhbWVfc2tpcHBlZCA9IDA7CisKKyAgaWYgKCFTdWJGcmFtZVBhcmFtc0luaXQoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMsIDEsIGVtcHR5X3JlY3RfYWxsb3dlZF9ub25lKSB8fAorICAgICAgIVN1YkZyYW1lUGFyYW1zSW5pdCgmZGlzcG9zZV9iZ19wYXJhbXMsIDAsIGVtcHR5X3JlY3RfYWxsb3dlZF9iZykpIHsKKyAgICByZXR1cm4gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047CisgIH0KKworICBtZW1zZXQoY2FuZGlkYXRlcywgMCwgc2l6ZW9mKGNhbmRpZGF0ZXMpKTsKKworICAvLyBDaGFuZ2UtcmVjdGFuZ2xlIGFzc3VtaW5nIHByZXZpb3VzIGZyYW1lIHdhcyBESVNQT1NFX05PTkUuCisgIGlmICghR2V0U3ViUmVjdHMocHJldl9jYW52YXMsIGN1cnJfY2FudmFzLCBpc19rZXlfZnJhbWUsIGlzX2ZpcnN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbmZpZ19sb3NzeS5xdWFsaXR5LCAmZGlzcG9zZV9ub25lX3BhcmFtcykpIHsKKyAgICBlcnJvcl9jb2RlID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047CisgICAgZ290byBFcnI7CisgIH0KKworICBpZiAoKGNvbnNpZGVyX2xvc3NsZXNzICYmIElzRW1wdHlSZWN0KCZkaXNwb3NlX25vbmVfcGFyYW1zLnJlY3RfbGxfKSkgfHwKKyAgICAgIChjb25zaWRlcl9sb3NzeSAmJiBJc0VtcHR5UmVjdCgmZGlzcG9zZV9ub25lX3BhcmFtcy5yZWN0X2xvc3N5XykpKSB7CisgICAgLy8gRG9uJ3QgZW5jb2RlIHRoZSBmcmFtZSBhdCBhbGwuIEluc3RlYWQsIHRoZSBkdXJhdGlvbiBvZiB0aGUgcHJldmlvdXMKKyAgICAvLyBmcmFtZSB3aWxsIGJlIGluY3JlYXNlZCBsYXRlci4KKyAgICBhc3NlcnQoZW1wdHlfcmVjdF9hbGxvd2VkX25vbmUpOworICAgICpmcmFtZV9za2lwcGVkID0gMTsKKyAgICBnb3RvIEVuZDsKKyAgfQorCisgIGlmIChkaXNwb3NlX2JnX3Bvc3NpYmxlKSB7CisgICAgLy8gQ2hhbmdlLXJlY3RhbmdsZSBhc3N1bWluZyBwcmV2aW91cyBmcmFtZSB3YXMgRElTUE9TRV9CQUNLR1JPVU5ELgorICAgIFdlYlBQaWN0dXJlKiBjb25zdCBwcmV2X2NhbnZhc19kaXNwb3NlZCA9ICZlbmMtPnByZXZfY2FudmFzX2Rpc3Bvc2VkXzsKKyAgICBXZWJQQ29weVBpeGVscyhwcmV2X2NhbnZhcywgcHJldl9jYW52YXNfZGlzcG9zZWQpOworICAgIERpc3Bvc2VGcmFtZVJlY3RhbmdsZShXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQsICZlbmMtPnByZXZfcmVjdF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfY2FudmFzX2Rpc3Bvc2VkKTsKKworICAgIGlmICghR2V0U3ViUmVjdHMocHJldl9jYW52YXNfZGlzcG9zZWQsIGN1cnJfY2FudmFzLCBpc19rZXlfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICBpc19maXJzdF9mcmFtZSwgY29uZmlnX2xvc3N5LnF1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAmZGlzcG9zZV9iZ19wYXJhbXMpKSB7CisgICAgICBlcnJvcl9jb2RlID0gVlA4X0VOQ19FUlJPUl9JTlZBTElEX0NPTkZJR1VSQVRJT047CisgICAgICBnb3RvIEVycjsKKyAgICB9CisgICAgYXNzZXJ0KCFJc0VtcHR5UmVjdCgmZGlzcG9zZV9iZ19wYXJhbXMucmVjdF9sbF8pKTsKKyAgICBhc3NlcnQoIUlzRW1wdHlSZWN0KCZkaXNwb3NlX2JnX3BhcmFtcy5yZWN0X2xvc3N5XykpOworCisgICAgaWYgKGVuYy0+b3B0aW9uc18ubWluaW1pemVfc2l6ZSkgeyAgLy8gVHJ5IGJvdGggZGlzcG9zZSBtZXRob2RzLgorICAgICAgZGlzcG9zZV9iZ19wYXJhbXMuc2hvdWxkX3RyeV8gPSAxOworICAgICAgZGlzcG9zZV9ub25lX3BhcmFtcy5zaG91bGRfdHJ5XyA9IDE7CisgICAgfSBlbHNlIGlmICgoaXNfbG9zc2xlc3MgJiYKKyAgICAgICAgICAgICAgICBSZWN0QXJlYSgmZGlzcG9zZV9iZ19wYXJhbXMucmVjdF9sbF8pIDwKKyAgICAgICAgICAgICAgICAgICAgUmVjdEFyZWEoJmRpc3Bvc2Vfbm9uZV9wYXJhbXMucmVjdF9sbF8pKSB8fAorICAgICAgICAgICAgICAgKCFpc19sb3NzbGVzcyAmJgorICAgICAgICAgICAgICAgIFJlY3RBcmVhKCZkaXNwb3NlX2JnX3BhcmFtcy5yZWN0X2xvc3N5XykgPAorICAgICAgICAgICAgICAgICAgICBSZWN0QXJlYSgmZGlzcG9zZV9ub25lX3BhcmFtcy5yZWN0X2xvc3N5XykpKSB7CisgICAgICBkaXNwb3NlX2JnX3BhcmFtcy5zaG91bGRfdHJ5XyA9IDE7ICAvLyBQaWNrIERJU1BPU0VfQkFDS0dST1VORC4KKyAgICAgIGRpc3Bvc2Vfbm9uZV9wYXJhbXMuc2hvdWxkX3RyeV8gPSAwOworICAgIH0KKyAgfQorCisgIGlmIChkaXNwb3NlX25vbmVfcGFyYW1zLnNob3VsZF90cnlfKSB7CisgICAgZXJyb3JfY29kZSA9IEdlbmVyYXRlQ2FuZGlkYXRlcygKKyAgICAgICAgZW5jLCBjYW5kaWRhdGVzLCBXRUJQX01VWF9ESVNQT1NFX05PTkUsIGlzX2xvc3NsZXNzLCBpc19rZXlfZnJhbWUsCisgICAgICAgICZkaXNwb3NlX25vbmVfcGFyYW1zLCAmY29uZmlnX2xsLCAmY29uZmlnX2xvc3N5KTsKKyAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVycjsKKyAgfQorCisgIGlmIChkaXNwb3NlX2JnX3BhcmFtcy5zaG91bGRfdHJ5XykgeworICAgIGFzc2VydCghZW5jLT5pc19maXJzdF9mcmFtZV8pOworICAgIGFzc2VydChkaXNwb3NlX2JnX3Bvc3NpYmxlKTsKKyAgICBlcnJvcl9jb2RlID0gR2VuZXJhdGVDYW5kaWRhdGVzKAorICAgICAgICBlbmMsIGNhbmRpZGF0ZXMsIFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCwgaXNfbG9zc2xlc3MsIGlzX2tleV9mcmFtZSwKKyAgICAgICAgJmRpc3Bvc2VfYmdfcGFyYW1zLCAmY29uZmlnX2xsLCAmY29uZmlnX2xvc3N5KTsKKyAgICBpZiAoZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKSBnb3RvIEVycjsKKyAgfQorCisgIFBpY2tCZXN0Q2FuZGlkYXRlKGVuYywgY2FuZGlkYXRlcywgaXNfa2V5X2ZyYW1lLCBlbmNvZGVkX2ZyYW1lKTsKKworICBnb3RvIEVuZDsKKworIEVycjoKKyAgZm9yIChpID0gMDsgaSA8IENBTkRJREFURV9DT1VOVDsgKytpKSB7CisgICAgaWYgKGNhbmRpZGF0ZXNbaV0uZXZhbHVhdGVfKSB7CisgICAgICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJmNhbmRpZGF0ZXNbaV0ubWVtXyk7CisgICAgfQorICB9CisKKyBFbmQ6CisgIFN1YkZyYW1lUGFyYW1zRnJlZSgmZGlzcG9zZV9ub25lX3BhcmFtcyk7CisgIFN1YkZyYW1lUGFyYW1zRnJlZSgmZGlzcG9zZV9iZ19wYXJhbXMpOworICByZXR1cm4gZXJyb3JfY29kZTsKK30KKworLy8gQ2FsY3VsYXRlIHRoZSBwZW5hbHR5IGluY3VycmVkIGlmIHdlIGVuY29kZSBnaXZlbiBmcmFtZSBhcyBhIGtleSBmcmFtZQorLy8gaW5zdGVhZCBvZiBhIHN1Yi1mcmFtZS4KK3N0YXRpYyBpbnQ2NF90IEtleUZyYW1lUGVuYWx0eShjb25zdCBFbmNvZGVkRnJhbWUqIGNvbnN0IGVuY29kZWRfZnJhbWUpIHsKKyAgcmV0dXJuICgoaW50NjRfdCllbmNvZGVkX2ZyYW1lLT5rZXlfZnJhbWVfLmJpdHN0cmVhbS5zaXplIC0KKyAgICAgICAgICBlbmNvZGVkX2ZyYW1lLT5zdWJfZnJhbWVfLmJpdHN0cmVhbS5zaXplKTsKK30KKworc3RhdGljIGludCBDYWNoZUZyYW1lKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBDb25maWcqIGNvbnN0IGNvbmZpZykgeworICBpbnQgb2sgPSAwOworICBpbnQgZnJhbWVfc2tpcHBlZCA9IDA7CisgIFdlYlBFbmNvZGluZ0Vycm9yIGVycm9yX2NvZGUgPSBWUDhfRU5DX09LOworICBjb25zdCBzaXplX3QgcG9zaXRpb24gPSBlbmMtPmNvdW50XzsKKyAgRW5jb2RlZEZyYW1lKiBjb25zdCBlbmNvZGVkX2ZyYW1lID0gR2V0RnJhbWUoZW5jLCBwb3NpdGlvbik7CisKKyAgKytlbmMtPmNvdW50XzsKKworICBpZiAoZW5jLT5pc19maXJzdF9mcmFtZV8pIHsgIC8vIEFkZCB0aGlzIGFzIGEga2V5LWZyYW1lLgorICAgIGVycm9yX2NvZGUgPSBTZXRGcmFtZShlbmMsIGNvbmZpZywgMSwgZW5jb2RlZF9mcmFtZSwgJmZyYW1lX3NraXBwZWQpOworICAgIGlmIChlcnJvcl9jb2RlICE9IFZQOF9FTkNfT0spIGdvdG8gRW5kOworICAgIGFzc2VydChmcmFtZV9za2lwcGVkID09IDApOyAgLy8gRmlyc3QgZnJhbWUgY2FuJ3QgYmUgc2tpcHBlZCwgZXZlbiBpZiBlbXB0eS4KKyAgICBhc3NlcnQocG9zaXRpb24gPT0gMCAmJiBlbmMtPmNvdW50XyA9PSAxKTsKKyAgICBlbmNvZGVkX2ZyYW1lLT5pc19rZXlfZnJhbWVfID0gMTsKKyAgICBlbmMtPmZsdXNoX2NvdW50XyA9IDA7CisgICAgZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfID0gMDsKKyAgICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAwOworICB9IGVsc2UgeworICAgICsrZW5jLT5jb3VudF9zaW5jZV9rZXlfZnJhbWVfOworICAgIGlmIChlbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV8gPD0gZW5jLT5vcHRpb25zXy5rbWluKSB7CisgICAgICAvLyBBZGQgdGhpcyBhcyBhIGZyYW1lIHJlY3RhbmdsZS4KKyAgICAgIGVycm9yX2NvZGUgPSBTZXRGcmFtZShlbmMsIGNvbmZpZywgMCwgZW5jb2RlZF9mcmFtZSwgJmZyYW1lX3NraXBwZWQpOworICAgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFbmQ7CisgICAgICBpZiAoZnJhbWVfc2tpcHBlZCkgZ290byBTa2lwOworICAgICAgZW5jb2RlZF9mcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDA7CisgICAgICBlbmMtPmZsdXNoX2NvdW50XyA9IGVuYy0+Y291bnRfIC0gMTsKKyAgICAgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIGludDY0X3QgY3Vycl9kZWx0YTsKKyAgICAgIEZyYW1lUmVjdGFuZ2xlIHByZXZfcmVjdF9rZXksIHByZXZfcmVjdF9zdWI7CisKKyAgICAgIC8vIEFkZCB0aGlzIGFzIGEgZnJhbWUgcmVjdGFuZ2xlIHRvIGVuYy4KKyAgICAgIGVycm9yX2NvZGUgPSBTZXRGcmFtZShlbmMsIGNvbmZpZywgMCwgZW5jb2RlZF9mcmFtZSwgJmZyYW1lX3NraXBwZWQpOworICAgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFbmQ7CisgICAgICBpZiAoZnJhbWVfc2tpcHBlZCkgZ290byBTa2lwOworICAgICAgcHJldl9yZWN0X3N1YiA9IGVuYy0+cHJldl9yZWN0XzsKKworCisgICAgICAvLyBBZGQgdGhpcyBhcyBhIGtleS1mcmFtZSB0byBlbmMsIHRvby4KKyAgICAgIGVycm9yX2NvZGUgPSBTZXRGcmFtZShlbmMsIGNvbmZpZywgMSwgZW5jb2RlZF9mcmFtZSwgJmZyYW1lX3NraXBwZWQpOworICAgICAgaWYgKGVycm9yX2NvZGUgIT0gVlA4X0VOQ19PSykgZ290byBFbmQ7CisgICAgICBhc3NlcnQoZnJhbWVfc2tpcHBlZCA9PSAwKTsgIC8vIEtleS1mcmFtZSBjYW5ub3QgYmUgYW4gZW1wdHkgcmVjdGFuZ2xlLgorICAgICAgcHJldl9yZWN0X2tleSA9IGVuYy0+cHJldl9yZWN0XzsKKworICAgICAgLy8gQW5hbHl6ZSBzaXplIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byB2YXJpYW50cy4KKyAgICAgIGN1cnJfZGVsdGEgPSBLZXlGcmFtZVBlbmFsdHkoZW5jb2RlZF9mcmFtZSk7CisgICAgICBpZiAoY3Vycl9kZWx0YSA8PSBlbmMtPmJlc3RfZGVsdGFfKSB7ICAvLyBQaWNrIHRoaXMgYXMgdGhlIGtleS1mcmFtZS4KKyAgICAgICAgaWYgKGVuYy0+a2V5ZnJhbWVfICE9IEtFWUZSQU1FX05PTkUpIHsKKyAgICAgICAgICBFbmNvZGVkRnJhbWUqIGNvbnN0IG9sZF9rZXlmcmFtZSA9IEdldEZyYW1lKGVuYywgZW5jLT5rZXlmcmFtZV8pOworICAgICAgICAgIGFzc2VydChvbGRfa2V5ZnJhbWUtPmlzX2tleV9mcmFtZV8pOworICAgICAgICAgIG9sZF9rZXlmcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZW5jb2RlZF9mcmFtZS0+aXNfa2V5X2ZyYW1lXyA9IDE7CisgICAgICAgIGVuYy0+cHJldl9jYW5kaWRhdGVfdW5kZWNpZGVkXyA9IDE7CisgICAgICAgIGVuYy0+a2V5ZnJhbWVfID0gKGludClwb3NpdGlvbjsKKyAgICAgICAgZW5jLT5iZXN0X2RlbHRhXyA9IGN1cnJfZGVsdGE7CisgICAgICAgIGVuYy0+Zmx1c2hfY291bnRfID0gZW5jLT5jb3VudF8gLSAxOyAgLy8gV2UgY2FuIGZsdXNoIHByZXZpb3VzIGZyYW1lcy4KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGVuY29kZWRfZnJhbWUtPmlzX2tleV9mcmFtZV8gPSAwOworICAgICAgICBlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8gPSAwOworICAgICAgfQorICAgICAgLy8gTm90ZTogV2UgbmVlZCAnPj0nIGJlbG93IGJlY2F1c2Ugd2hlbiBrbWluIGFuZCBrbWF4IGFyZSBib3RoIHplcm8sCisgICAgICAvLyBjb3VudF9zaW5jZV9rZXlfZnJhbWUgd2lsbCBhbHdheXMgYmUgPiBrbWF4LgorICAgICAgaWYgKGVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXyA+PSBlbmMtPm9wdGlvbnNfLmttYXgpIHsKKyAgICAgICAgZW5jLT5mbHVzaF9jb3VudF8gPSBlbmMtPmNvdW50XyAtIDE7CisgICAgICAgIGVuYy0+Y291bnRfc2luY2Vfa2V5X2ZyYW1lXyA9IDA7CisgICAgICAgIGVuYy0+a2V5ZnJhbWVfID0gS0VZRlJBTUVfTk9ORTsKKyAgICAgICAgZW5jLT5iZXN0X2RlbHRhXyA9IERFTFRBX0lORklOSVRZOworICAgICAgfQorICAgICAgaWYgKCFlbmMtPnByZXZfY2FuZGlkYXRlX3VuZGVjaWRlZF8pIHsKKyAgICAgICAgZW5jLT5wcmV2X3JlY3RfID0KKyAgICAgICAgICAgIGVuY29kZWRfZnJhbWUtPmlzX2tleV9mcmFtZV8gPyBwcmV2X3JlY3Rfa2V5IDogcHJldl9yZWN0X3N1YjsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBVcGRhdGUgcHJldmlvdXMgdG8gcHJldmlvdXMgYW5kIHByZXZpb3VzIGNhbnZhc2VzIGZvciBuZXh0IGNhbGwuCisgIFdlYlBDb3B5UGl4ZWxzKGVuYy0+Y3Vycl9jYW52YXNfLCAmZW5jLT5wcmV2X2NhbnZhc18pOworICBlbmMtPmlzX2ZpcnN0X2ZyYW1lXyA9IDA7CisKKyBTa2lwOgorICBvayA9IDE7CisgICsrZW5jLT5pbl9mcmFtZV9jb3VudF87CisKKyBFbmQ6CisgIGlmICghb2sgfHwgZnJhbWVfc2tpcHBlZCkgeworICAgIEZyYW1lUmVsZWFzZShlbmNvZGVkX2ZyYW1lKTsKKyAgICAvLyBXZSByZXNldCBzb21lIGNvdW50ZXJzLCBhcyB0aGUgZnJhbWUgYWRkaXRpb24gZmFpbGVkL3dhcyBza2lwcGVkLgorICAgIC0tZW5jLT5jb3VudF87CisgICAgaWYgKCFlbmMtPmlzX2ZpcnN0X2ZyYW1lXykgLS1lbmMtPmNvdW50X3NpbmNlX2tleV9mcmFtZV87CisgICAgaWYgKCFvaykgeworICAgICAgTWFya0Vycm9yMihlbmMsICJFUlJPUiBhZGRpbmcgZnJhbWUuIFdlYlBFbmNvZGluZ0Vycm9yIiwgZXJyb3JfY29kZSk7CisgICAgfQorICB9CisgIGVuYy0+Y3Vycl9jYW52YXNfLT5lcnJvcl9jb2RlID0gZXJyb3JfY29kZTsgICAvLyByZXBvcnQgZXJyb3JfY29kZQorICBhc3NlcnQob2sgfHwgZXJyb3JfY29kZSAhPSBWUDhfRU5DX09LKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IEZsdXNoRnJhbWVzKFdlYlBBbmltRW5jb2RlciogY29uc3QgZW5jKSB7CisgIHdoaWxlIChlbmMtPmZsdXNoX2NvdW50XyA+IDApIHsKKyAgICBXZWJQTXV4RXJyb3IgZXJyOworICAgIEVuY29kZWRGcmFtZSogY29uc3QgY3VyciA9IEdldEZyYW1lKGVuYywgMCk7CisgICAgY29uc3QgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgaW5mbyA9CisgICAgICAgIGN1cnItPmlzX2tleV9mcmFtZV8gPyAmY3Vyci0+a2V5X2ZyYW1lXyA6ICZjdXJyLT5zdWJfZnJhbWVfOworICAgIGFzc2VydChlbmMtPm11eF8gIT0gTlVMTCk7CisgICAgZXJyID0gV2ViUE11eFB1c2hGcmFtZShlbmMtPm11eF8sIGluZm8sIDEpOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIE1hcmtFcnJvcjIoZW5jLCAiRVJST1IgYWRkaW5nIGZyYW1lLiBXZWJQTXV4RXJyb3IiLCBlcnIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChlbmMtPm9wdGlvbnNfLnZlcmJvc2UpIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiSU5GTzogQWRkZWQgZnJhbWUuIG9mZnNldDolZCwlZCBkaXNwb3NlOiVkIGJsZW5kOiVkXG4iLAorICAgICAgICAgICAgICBpbmZvLT54X29mZnNldCwgaW5mby0+eV9vZmZzZXQsIGluZm8tPmRpc3Bvc2VfbWV0aG9kLAorICAgICAgICAgICAgICBpbmZvLT5ibGVuZF9tZXRob2QpOworICAgIH0KKyAgICArK2VuYy0+b3V0X2ZyYW1lX2NvdW50XzsKKyAgICBGcmFtZVJlbGVhc2UoY3Vycik7CisgICAgKytlbmMtPnN0YXJ0XzsKKyAgICAtLWVuYy0+Zmx1c2hfY291bnRfOworICAgIC0tZW5jLT5jb3VudF87CisgICAgaWYgKGVuYy0+a2V5ZnJhbWVfICE9IEtFWUZSQU1FX05PTkUpIC0tZW5jLT5rZXlmcmFtZV87CisgIH0KKworICBpZiAoZW5jLT5jb3VudF8gPT0gMSAmJiBlbmMtPnN0YXJ0XyAhPSAwKSB7CisgICAgLy8gTW92ZSBlbmMtPnN0YXJ0IHRvIGluZGV4IDAuCisgICAgY29uc3QgaW50IGVuY19zdGFydF90bXAgPSAoaW50KWVuYy0+c3RhcnRfOworICAgIEVuY29kZWRGcmFtZSB0ZW1wID0gZW5jLT5lbmNvZGVkX2ZyYW1lc19bMF07CisgICAgZW5jLT5lbmNvZGVkX2ZyYW1lc19bMF0gPSBlbmMtPmVuY29kZWRfZnJhbWVzX1tlbmNfc3RhcnRfdG1wXTsKKyAgICBlbmMtPmVuY29kZWRfZnJhbWVzX1tlbmNfc3RhcnRfdG1wXSA9IHRlbXA7CisgICAgRnJhbWVSZWxlYXNlKCZlbmMtPmVuY29kZWRfZnJhbWVzX1tlbmNfc3RhcnRfdG1wXSk7CisgICAgZW5jLT5zdGFydF8gPSAwOworICB9CisgIHJldHVybiAxOworfQorCisjdW5kZWYgREVMVEFfSU5GSU5JVFkKKyN1bmRlZiBLRVlGUkFNRV9OT05FCisKK2ludCBXZWJQQW5pbUVuY29kZXJBZGQoV2ViUEFuaW1FbmNvZGVyKiBlbmMsIFdlYlBQaWN0dXJlKiBmcmFtZSwgaW50IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUENvbmZpZyogZW5jb2Rlcl9jb25maWcpIHsKKyAgV2ViUENvbmZpZyBjb25maWc7CisgIGludCBvazsKKworICBpZiAoZW5jID09IE5VTEwpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNYXJrTm9FcnJvcihlbmMpOworCisgIGlmICghZW5jLT5pc19maXJzdF9mcmFtZV8pIHsKKyAgICAvLyBNYWtlIHN1cmUgdGltZXN0YW1wcyBhcmUgbm9uLWRlY3JlYXNpbmcgKGludGVnZXIgd3JhcC1hcm91bmQgaXMgT0spLgorICAgIGNvbnN0IHVpbnQzMl90IHByZXZfZnJhbWVfZHVyYXRpb24gPQorICAgICAgICAodWludDMyX3QpdGltZXN0YW1wIC0gZW5jLT5wcmV2X3RpbWVzdGFtcF87CisgICAgaWYgKHByZXZfZnJhbWVfZHVyYXRpb24gPj0gTUFYX0RVUkFUSU9OKSB7CisgICAgICBpZiAoZnJhbWUgIT0gTlVMTCkgeworICAgICAgICBmcmFtZS0+ZXJyb3JfY29kZSA9IFZQOF9FTkNfRVJST1JfSU5WQUxJRF9DT05GSUdVUkFUSU9OOworICAgICAgfQorICAgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SIGFkZGluZyBmcmFtZTogdGltZXN0YW1wcyBtdXN0IGJlIG5vbi1kZWNyZWFzaW5nIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCFJbmNyZWFzZVByZXZpb3VzRHVyYXRpb24oZW5jLCAoaW50KXByZXZfZnJhbWVfZHVyYXRpb24pKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgZW5jLT5maXJzdF90aW1lc3RhbXBfID0gdGltZXN0YW1wOworICB9CisKKyAgaWYgKGZyYW1lID09IE5VTEwpIHsgIC8vIFNwZWNpYWw6IGxhc3QgY2FsbC4KKyAgICBlbmMtPmdvdF9udWxsX2ZyYW1lXyA9IDE7CisgICAgZW5jLT5wcmV2X3RpbWVzdGFtcF8gPSB0aW1lc3RhbXA7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoZnJhbWUtPndpZHRoICE9IGVuYy0+Y2FudmFzX3dpZHRoXyB8fAorICAgICAgZnJhbWUtPmhlaWdodCAhPSBlbmMtPmNhbnZhc19oZWlnaHRfKSB7CisgICAgZnJhbWUtPmVycm9yX2NvZGUgPSBWUDhfRU5DX0VSUk9SX0lOVkFMSURfQ09ORklHVVJBVElPTjsKKyAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1IgYWRkaW5nIGZyYW1lOiBJbnZhbGlkIGZyYW1lIGRpbWVuc2lvbnMiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghZnJhbWUtPnVzZV9hcmdiKSB7ICAvLyBDb252ZXJ0IGZyYW1lIGZyb20gWVVWKEEpIHRvIEFSR0IuCisgICAgaWYgKGVuYy0+b3B0aW9uc18udmVyYm9zZSkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiBDb252ZXJ0aW5nIGZyYW1lIGZyb20gWVVWKEEpIHRvIEFSR0IgZm9ybWF0OyAiCisgICAgICAgICAgICAgICJ0aGlzIGluY3VycyBhIHNtYWxsIGxvc3MuXG4iKTsKKyAgICB9CisgICAgaWYgKCFXZWJQUGljdHVyZVlVVkFUb0FSR0IoZnJhbWUpKSB7CisgICAgICBNYXJrRXJyb3IoZW5jLCAiRVJST1IgY29udmVydGluZyBmcmFtZSBmcm9tIFlVVihBKSB0byBBUkdCIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoZW5jb2Rlcl9jb25maWcgIT0gTlVMTCkgeworICAgIGlmICghV2ViUFZhbGlkYXRlQ29uZmlnKGVuY29kZXJfY29uZmlnKSkgeworICAgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SIGFkZGluZyBmcmFtZTogSW52YWxpZCBXZWJQQ29uZmlnIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uZmlnID0gKmVuY29kZXJfY29uZmlnOworICB9IGVsc2UgeworICAgIFdlYlBDb25maWdJbml0KCZjb25maWcpOworICAgIGNvbmZpZy5sb3NzbGVzcyA9IDE7CisgIH0KKyAgYXNzZXJ0KGVuYy0+Y3Vycl9jYW52YXNfID09IE5VTEwpOworICBlbmMtPmN1cnJfY2FudmFzXyA9IGZyYW1lOyAgLy8gU3RvcmUgcmVmZXJlbmNlLgorICBhc3NlcnQoZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9PSAxKTsKKyAgQ29weUN1cnJlbnRDYW52YXMoZW5jKTsKKworICBvayA9IENhY2hlRnJhbWUoZW5jLCAmY29uZmlnKSAmJiBGbHVzaEZyYW1lcyhlbmMpOworCisgIGVuYy0+Y3Vycl9jYW52YXNfID0gTlVMTDsKKyAgZW5jLT5jdXJyX2NhbnZhc19jb3B5X21vZGlmaWVkXyA9IDE7CisgIGlmIChvaykgeworICAgIGVuYy0+cHJldl90aW1lc3RhbXBfID0gdGltZXN0YW1wOworICB9CisgIHJldHVybiBvazsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJpdHN0cmVhbSBhc3NlbWJseS4KKworc3RhdGljIGludCBEZWNvZGVGcmFtZU9udG9DYW52YXMoY29uc3QgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogY29uc3QgY2FudmFzKSB7CisgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBpbWFnZSA9ICZmcmFtZS0+Yml0c3RyZWFtOworICBXZWJQUGljdHVyZSBzdWJfaW1hZ2U7CisgIFdlYlBEZWNvZGVyQ29uZmlnIGNvbmZpZzsKKyAgV2ViUEluaXREZWNvZGVyQ29uZmlnKCZjb25maWcpOworICBXZWJQVXRpbENsZWFyUGljKGNhbnZhcywgTlVMTCk7CisgIGlmIChXZWJQR2V0RmVhdHVyZXMoaW1hZ2UtPmJ5dGVzLCBpbWFnZS0+c2l6ZSwgJmNvbmZpZy5pbnB1dCkgIT0KKyAgICAgIFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIVdlYlBQaWN0dXJlVmlldyhjYW52YXMsIGZyYW1lLT54X29mZnNldCwgZnJhbWUtPnlfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuaW5wdXQud2lkdGgsIGNvbmZpZy5pbnB1dC5oZWlnaHQsICZzdWJfaW1hZ2UpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29uZmlnLm91dHB1dC5pc19leHRlcm5hbF9tZW1vcnkgPSAxOworICBjb25maWcub3V0cHV0LmNvbG9yc3BhY2UgPSBNT0RFX0JHUkE7CisgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnJnYmEgPSAodWludDhfdCopc3ViX2ltYWdlLmFyZ2I7CisgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnN0cmlkZSA9IHN1Yl9pbWFnZS5hcmdiX3N0cmlkZSAqIDQ7CisgIGNvbmZpZy5vdXRwdXQudS5SR0JBLnNpemUgPSBjb25maWcub3V0cHV0LnUuUkdCQS5zdHJpZGUgKiBzdWJfaW1hZ2UuaGVpZ2h0OworCisgIGlmIChXZWJQRGVjb2RlKGltYWdlLT5ieXRlcywgaW1hZ2UtPnNpemUsICZjb25maWcpICE9IFZQOF9TVEFUVVNfT0spIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGcmFtZVRvRnVsbENhbnZhcyhXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCBmdWxsX2ltYWdlKSB7CisgIFdlYlBQaWN0dXJlKiBjb25zdCBjYW52YXNfYnVmID0gJmVuYy0+Y3Vycl9jYW52YXNfY29weV87CisgIFdlYlBNZW1vcnlXcml0ZXIgbWVtMSwgbWVtMjsKKyAgV2ViUE1lbW9yeVdyaXRlckluaXQoJm1lbTEpOworICBXZWJQTWVtb3J5V3JpdGVySW5pdCgmbWVtMik7CisKKyAgaWYgKCFEZWNvZGVGcmFtZU9udG9DYW52YXMoZnJhbWUsIGNhbnZhc19idWYpKSBnb3RvIEVycjsKKyAgaWYgKCFFbmNvZGVGcmFtZSgmZW5jLT5sYXN0X2NvbmZpZ18sIGNhbnZhc19idWYsICZtZW0xKSkgZ290byBFcnI7CisgIEdldEVuY29kZWREYXRhKCZtZW0xLCBmdWxsX2ltYWdlKTsKKworICBpZiAoZW5jLT5vcHRpb25zXy5hbGxvd19taXhlZCkgeworICAgIGlmICghRW5jb2RlRnJhbWUoJmVuYy0+bGFzdF9jb25maWdfcmV2ZXJzZWRfLCBjYW52YXNfYnVmLCAmbWVtMikpIGdvdG8gRXJyOworICAgIGlmIChtZW0yLnNpemUgPCBtZW0xLnNpemUpIHsKKyAgICAgIEdldEVuY29kZWREYXRhKCZtZW0yLCBmdWxsX2ltYWdlKTsKKyAgICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbWVtMSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFdlYlBNZW1vcnlXcml0ZXJDbGVhcigmbWVtMik7CisgICAgfQorICB9CisgIHJldHVybiAxOworCisgRXJyOgorICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJm1lbTEpOworICBXZWJQTWVtb3J5V3JpdGVyQ2xlYXIoJm1lbTIpOworICByZXR1cm4gMDsKK30KKworLy8gQ29udmVydCBhIHNpbmdsZS1mcmFtZSBhbmltYXRpb24gdG8gYSBub24tYW5pbWF0ZWQgaW1hZ2UgaWYgYXBwcm9wcmlhdGUuCisvLyBUT0RPKHVydmFuZyk6IENhbiB3ZSBwaWNrIG9uZSBvZiB0aGUgdHdvIGhldXJpc3RpY2FsbHkgKGJhc2VkIG9uIGZyYW1lCisvLyByZWN0YW5nbGUgYW5kL29yIHByZXNlbmNlIG9mIGFscGhhKT8KK3N0YXRpYyBXZWJQTXV4RXJyb3IgT3B0aW1pemVTaW5nbGVGcmFtZShXZWJQQW5pbUVuY29kZXIqIGNvbnN0IGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3Qgd2VicF9kYXRhKSB7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9PSzsKKyAgaW50IGNhbnZhc193aWR0aCwgY2FudmFzX2hlaWdodDsKKyAgV2ViUE11eEZyYW1lSW5mbyBmcmFtZTsKKyAgV2ViUERhdGEgZnVsbF9pbWFnZTsKKyAgV2ViUERhdGEgd2VicF9kYXRhMjsKKyAgV2ViUE11eCogY29uc3QgbXV4ID0gV2ViUE11eENyZWF0ZSh3ZWJwX2RhdGEsIDApOworICBpZiAobXV4ID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgYXNzZXJ0KGVuYy0+b3V0X2ZyYW1lX2NvdW50XyA9PSAxKTsKKyAgV2ViUERhdGFJbml0KCZmcmFtZS5iaXRzdHJlYW0pOworICBXZWJQRGF0YUluaXQoJmZ1bGxfaW1hZ2UpOworICBXZWJQRGF0YUluaXQoJndlYnBfZGF0YTIpOworCisgIGVyciA9IFdlYlBNdXhHZXRGcmFtZShtdXgsIDEsICZmcmFtZSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRW5kOworICBpZiAoZnJhbWUuaWQgIT0gV0VCUF9DSFVOS19BTk1GKSBnb3RvIEVuZDsgIC8vIE5vbi1hbmltYXRpb246IG5vdGhpbmcgdG8gZG8uCisgIGVyciA9IFdlYlBNdXhHZXRDYW52YXNTaXplKG11eCwgJmNhbnZhc193aWR0aCwgJmNhbnZhc19oZWlnaHQpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVuZDsKKyAgaWYgKCFGcmFtZVRvRnVsbENhbnZhcyhlbmMsICZmcmFtZSwgJmZ1bGxfaW1hZ2UpKSB7CisgICAgZXJyID0gV0VCUF9NVVhfQkFEX0RBVEE7CisgICAgZ290byBFbmQ7CisgIH0KKyAgZXJyID0gV2ViUE11eFNldEltYWdlKG11eCwgJmZ1bGxfaW1hZ2UsIDEpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVuZDsKKyAgZXJyID0gV2ViUE11eEFzc2VtYmxlKG11eCwgJndlYnBfZGF0YTIpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVuZDsKKworICBpZiAod2VicF9kYXRhMi5zaXplIDwgd2VicF9kYXRhLT5zaXplKSB7ICAvLyBQaWNrICd3ZWJwX2RhdGEyJyBpZiBzbWFsbGVyLgorICAgIFdlYlBEYXRhQ2xlYXIod2VicF9kYXRhKTsKKyAgICAqd2VicF9kYXRhID0gd2VicF9kYXRhMjsKKyAgICBXZWJQRGF0YUluaXQoJndlYnBfZGF0YTIpOworICB9CisKKyBFbmQ6CisgIFdlYlBEYXRhQ2xlYXIoJmZyYW1lLmJpdHN0cmVhbSk7CisgIFdlYlBEYXRhQ2xlYXIoJmZ1bGxfaW1hZ2UpOworICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIFdlYlBEYXRhQ2xlYXIoJndlYnBfZGF0YTIpOworICByZXR1cm4gZXJyOworfQorCitpbnQgV2ViUEFuaW1FbmNvZGVyQXNzZW1ibGUoV2ViUEFuaW1FbmNvZGVyKiBlbmMsIFdlYlBEYXRhKiB3ZWJwX2RhdGEpIHsKKyAgV2ViUE11eCogbXV4OworICBXZWJQTXV4RXJyb3IgZXJyOworCisgIGlmIChlbmMgPT0gTlVMTCkgeworICAgIHJldHVybiAwOworICB9CisgIE1hcmtOb0Vycm9yKGVuYyk7CisKKyAgaWYgKHdlYnBfZGF0YSA9PSBOVUxMKSB7CisgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SIGFzc2VtYmxpbmc6IE5VTEwgaW5wdXQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChlbmMtPmluX2ZyYW1lX2NvdW50XyA9PSAwKSB7CisgICAgTWFya0Vycm9yKGVuYywgIkVSUk9SOiBObyBmcmFtZXMgdG8gYXNzZW1ibGUiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghZW5jLT5nb3RfbnVsbF9mcmFtZV8gJiYgZW5jLT5pbl9mcmFtZV9jb3VudF8gPiAxICYmIGVuYy0+Y291bnRfID4gMCkgeworICAgIC8vIHNldCBkdXJhdGlvbiBvZiB0aGUgbGFzdCBmcmFtZSB0byBiZSBhdmcgb2YgZHVyYXRpb25zIG9mIHByZXZpb3VzIGZyYW1lcy4KKyAgICBjb25zdCBkb3VibGUgZGVsdGFfdGltZSA9CisgICAgICAgICh1aW50MzJfdCllbmMtPnByZXZfdGltZXN0YW1wXyAtIGVuYy0+Zmlyc3RfdGltZXN0YW1wXzsKKyAgICBjb25zdCBpbnQgYXZlcmFnZV9kdXJhdGlvbiA9IChpbnQpKGRlbHRhX3RpbWUgLyAoZW5jLT5pbl9mcmFtZV9jb3VudF8gLSAxKSk7CisgICAgaWYgKCFJbmNyZWFzZVByZXZpb3VzRHVyYXRpb24oZW5jLCBhdmVyYWdlX2R1cmF0aW9uKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgLy8gRmx1c2ggYW55IHJlbWFpbmluZyBmcmFtZXMuCisgIGVuYy0+Zmx1c2hfY291bnRfID0gZW5jLT5jb3VudF87CisgIGlmICghRmx1c2hGcmFtZXMoZW5jKSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8gU2V0IGRlZmluaXRpdmUgY2FudmFzIHNpemUuCisgIG11eCA9IGVuYy0+bXV4XzsKKyAgZXJyID0gV2ViUE11eFNldENhbnZhc1NpemUobXV4LCBlbmMtPmNhbnZhc193aWR0aF8sIGVuYy0+Y2FudmFzX2hlaWdodF8pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICBlcnIgPSBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKG11eCwgJmVuYy0+b3B0aW9uc18uYW5pbV9wYXJhbXMpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKworICAvLyBBc3NlbWJsZSBpbnRvIGEgV2ViUCBiaXRzdHJlYW0uCisgIGVyciA9IFdlYlBNdXhBc3NlbWJsZShtdXgsIHdlYnBfZGF0YSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIGlmIChlbmMtPm91dF9mcmFtZV9jb3VudF8gPT0gMSkgeworICAgIGVyciA9IE9wdGltaXplU2luZ2xlRnJhbWUoZW5jLCB3ZWJwX2RhdGEpOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICB9CisgIHJldHVybiAxOworCisgRXJyOgorICBNYXJrRXJyb3IyKGVuYywgIkVSUk9SIGFzc2VtYmxpbmcgV2ViUCIsIGVycik7CisgIHJldHVybiAwOworfQorCitjb25zdCBjaGFyKiBXZWJQQW5pbUVuY29kZXJHZXRFcnJvcihXZWJQQW5pbUVuY29kZXIqIGVuYykgeworICBpZiAoZW5jID09IE5VTEwpIHJldHVybiBOVUxMOworICByZXR1cm4gZW5jLT5lcnJvcl9zdHJfOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltaS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9hbmltaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ODk5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2FuaW1pLmgKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEludGVybmFsIGhlYWRlciBmb3IgYW5pbWF0aW9uIHJlbGF0ZWQgZnVuY3Rpb25zLgorLy8KKy8vIEF1dGhvcjogSHVpIFN1IChodWlzdUBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfTVVYX0FOSU1JX0hfCisjZGVmaW5lIFdFQlBfTVVYX0FOSU1JX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC9tdXguaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBQaWNrcyB0aGUgb3B0aW1hbCByZWN0YW5nbGUgYmV0d2VlbiB0d28gcGljdHVyZXMsIHN0YXJ0aW5nIHdpdGggaW5pdGlhbAorLy8gdmFsdWVzIG9mIG9mZnNldHMgYW5kIGRpbWVuc2lvbnMgdGhhdCBhcmUgcGFzc2VkIGluLiBUaGUgaW5pdGlhbAorLy8gdmFsdWVzIHdpbGwgYmUgY2xpcHBlZCwgaWYgbmVjZXNzYXJ5LCB0byBtYWtlIHN1cmUgdGhlIHJlY3RhbmdsZSBpcworLy8gd2l0aGluIHRoZSBjYW52YXMuICJ1c2VfYXJnYiIgbXVzdCBiZSB0cnVlIGZvciBib3RoIHBpY3R1cmVzLgorLy8gUGFyYW1ldGVyczoKKy8vICAgcHJldl9jYW52YXMsIGN1cnJfY2FudmFzIC0gKGluKSB0d28gaW5wdXQgcGljdHVyZXMgdG8gY29tcGFyZS4KKy8vICAgaXNfbG9zc2xlc3MsIHF1YWxpdHkgLSAoaW4pIGVuY29kaW5nIHNldHRpbmdzLgorLy8gICB4X29mZnNldCwgeV9vZmZzZXQsIHdpZHRoLCBoZWlnaHQgLSAoaW4vb3V0KSByZWN0YW5nbGUgYmV0d2VlbiB0aGUgdHdvCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IHBpY3R1cmVzLgorLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCitpbnQgV2ViUEFuaW1FbmNvZGVyUmVmaW5lUmVjdCgKKyAgICBjb25zdCBzdHJ1Y3QgV2ViUFBpY3R1cmUqIGNvbnN0IHByZXZfY2FudmFzLAorICAgIGNvbnN0IHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgY3Vycl9jYW52YXMsCisgICAgaW50IGlzX2xvc3NsZXNzLCBmbG9hdCBxdWFsaXR5LCBpbnQqIGNvbnN0IHhfb2Zmc2V0LCBpbnQqIGNvbnN0IHlfb2Zmc2V0LAorICAgIGludCogY29uc3Qgd2lkdGgsIGludCogY29uc3QgaGVpZ2h0KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfTVVYX0FOSU1JX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucGMuaW4gYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2ZmFjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5wYy5pbgpAQCAtMCwwICsxLDEyIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAKKworTmFtZTogbGlid2VicG11eAorRGVzY3JpcHRpb246IExpYnJhcnkgZm9yIG1hbmlwdWxhdGluZyB0aGUgV2ViUCBncmFwaGljcyBmb3JtYXQgY29udGFpbmVyCitWZXJzaW9uOiBAUEFDS0FHRV9WRVJTSU9OQAorUmVxdWlyZXM6IGxpYndlYnAgPj0gMC4yLjAKK0NmbGFnczogLUkke2luY2x1ZGVkaXJ9CitMaWJzOiAtTCR7bGliZGlyfSAtbHdlYnBtdXgKK0xpYnMucHJpdmF0ZTogLWxtCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L2xpYndlYnBtdXgucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3ZDVmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbGlid2VicG11eC5yYwpAQCAtMCwwICsxLDQxIEBACisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKyNpbmNsdWRlICJ3aW5yZXMuaCIKKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisKKyNpZiAhZGVmaW5lZChBRlhfUkVTT1VSQ0VfRExMKSB8fCBkZWZpbmVkKEFGWF9UQVJHX0VOVSkKK0xBTkdVQUdFIExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIDEsMCwwLDAKKyBQUk9EVUNUVkVSU0lPTiAxLDAsMCwwCisgRklMRUZMQUdTTUFTSyAweDNmTAorI2lmZGVmIF9ERUJVRworIEZJTEVGTEFHUyAweDFMCisjZWxzZQorIEZJTEVGTEFHUyAweDBMCisjZW5kaWYKKyBGSUxFT1MgMHg0MDAwNEwKKyBGSUxFVFlQRSAweDJMCisgRklMRVNVQlRZUEUgMHgwTAorQkVHSU4KKyAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgQkVHSU4KKyAgICAgICAgQkxPQ0sgIjA0MDkwNGIwIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIkNvbXBhbnlOYW1lIiwgIkdvb2dsZSwgSW5jLiIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAibGlid2VicG11eCBETEwiCisgICAgICAgICAgICBWQUxVRSAiRmlsZVZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgImxpYndlYnBtdXguZGxsIgorICAgICAgICAgICAgVkFMVUUgIkxlZ2FsQ29weXJpZ2h0IiwgIkNvcHlyaWdodCAoQykgMjAxOCIKKyAgICAgICAgICAgIFZBTFVFICJPcmlnaW5hbEZpbGVuYW1lIiwgImxpYndlYnBtdXguZGxsIgorICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3ROYW1lIiwgIldlYlAgSW1hZ2UgTXV4ZXIiCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdFZlcnNpb24iLCAiMS4wLjAiCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4ZWRpdC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhlZGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwMjdiMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4ZWRpdC5jCkBAIC0wLDAgKzEsNjU3IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gU2V0IGFuZCBkZWxldGUgQVBJcyBmb3IgbXV4LgorLy8KKy8vIEF1dGhvcnM6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisvLyAgICAgICAgICBWaWthcyAodmlrYXNhQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlICJzcmMvbXV4L211eGkuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgYSBtdXggb2JqZWN0LgorCitzdGF0aWMgdm9pZCBNdXhJbml0KFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBtZW1zZXQobXV4LCAwLCBzaXplb2YoKm11eCkpOworICBtdXgtPmNhbnZhc193aWR0aF8gPSAwOyAgICAgLy8ganVzdCB0byBiZSBleHBsaWNpdAorICBtdXgtPmNhbnZhc19oZWlnaHRfID0gMDsKK30KKworV2ViUE11eCogV2ViUE5ld0ludGVybmFsKGludCB2ZXJzaW9uKSB7CisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgV2ViUE11eCogY29uc3QgbXV4ID0gKFdlYlBNdXgqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemVvZihXZWJQTXV4KSk7CisgICAgaWYgKG11eCAhPSBOVUxMKSBNdXhJbml0KG11eCk7CisgICAgcmV0dXJuIG11eDsKKyAgfQorfQorCisvLyBEZWxldGUgYWxsIGltYWdlcyBpbiAnd3BpX2xpc3QnLgorc3RhdGljIHZvaWQgRGVsZXRlQWxsSW1hZ2VzKFdlYlBNdXhJbWFnZSoqIGNvbnN0IHdwaV9saXN0KSB7CisgIHdoaWxlICgqd3BpX2xpc3QgIT0gTlVMTCkgeworICAgICp3cGlfbGlzdCA9IE11eEltYWdlRGVsZXRlKCp3cGlfbGlzdCk7CisgIH0KK30KKworc3RhdGljIHZvaWQgTXV4UmVsZWFzZShXZWJQTXV4KiBjb25zdCBtdXgpIHsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKyAgRGVsZXRlQWxsSW1hZ2VzKCZtdXgtPmltYWdlc18pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+dnA4eF8pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+aWNjcF8pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+YW5pbV8pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+ZXhpZl8pOworICBDaHVua0xpc3REZWxldGUoJm11eC0+eG1wXyk7CisgIENodW5rTGlzdERlbGV0ZSgmbXV4LT51bmtub3duXyk7Cit9CisKK3ZvaWQgV2ViUE11eERlbGV0ZShXZWJQTXV4KiBtdXgpIHsKKyAgaWYgKG11eCAhPSBOVUxMKSB7CisgICAgTXV4UmVsZWFzZShtdXgpOworICAgIFdlYlBTYWZlRnJlZShtdXgpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgbWV0aG9kKHMpLgorCisvLyBIYW5keSBNQUNSTywgbWFrZXMgTXV4U2V0KCkgdmVyeSBzeW1tZXRyaWMgdG8gTXV4R2V0KCkuCisjZGVmaW5lIFNXSVRDSF9JRF9MSVNUKElOREVYLCBMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpZiAoaWR4ID09IChJTkRFWCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlcnIgPSBDaHVua0Fzc2lnbkRhdGEoJmNodW5rLCBkYXRhLCBjb3B5X2RhdGEsIHRhZyk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGVyciA9PSBXRUJQX01VWF9PSykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZXJyID0gQ2h1bmtTZXROdGgoJmNodW5rLCAoTElTVCksIG50aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgTXV4U2V0KFdlYlBNdXgqIGNvbnN0IG11eCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSwgaW50IGNvcHlfZGF0YSkgeworICBXZWJQQ2h1bmsgY2h1bms7CisgIFdlYlBNdXhFcnJvciBlcnIgPSBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIGNvbnN0IENIVU5LX0lOREVYIGlkeCA9IENodW5rR2V0SW5kZXhGcm9tVGFnKHRhZyk7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGFzc2VydCghSXNXUEkoa0NodW5rc1tpZHhdLmlkKSk7CisKKyAgQ2h1bmtJbml0KCZjaHVuayk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9WUDhYLCAgICAmbXV4LT52cDh4Xyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9JQ0NQLCAgICAmbXV4LT5pY2NwXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9BTklNLCAgICAmbXV4LT5hbmltXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9FWElGLCAgICAmbXV4LT5leGlmXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9YTVAsICAgICAmbXV4LT54bXBfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX1VOS05PV04sICZtdXgtPnVua25vd25fKTsKKyAgcmV0dXJuIGVycjsKK30KKyN1bmRlZiBTV0lUQ0hfSURfTElTVAorCisvLyBDcmVhdGUgZGF0YSBmb3IgZnJhbWUgZ2l2ZW4gaW1hZ2UgZGF0YSwgb2Zmc2V0cyBhbmQgZHVyYXRpb24uCitzdGF0aWMgV2ViUE11eEVycm9yIENyZWF0ZUZyYW1lRGF0YSgKKyAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGluZm8sCisgICAgV2ViUERhdGEqIGNvbnN0IGZyYW1lKSB7CisgIHVpbnQ4X3QqIGZyYW1lX2J5dGVzOworICBjb25zdCBzaXplX3QgZnJhbWVfc2l6ZSA9IGtDaHVua3NbSURYX0FOTUZdLnNpemU7CisKKyAgYXNzZXJ0KHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICYmIGluZm8tPmR1cmF0aW9uID49IDApOworICBhc3NlcnQoaW5mby0+ZGlzcG9zZV9tZXRob2QgPT0gKGluZm8tPmRpc3Bvc2VfbWV0aG9kICYgMSkpOworICAvLyBOb3RlOiBhc3NlcnRpb24gb24gdXBwZXIgYm91bmRzIGlzIGRvbmUgaW4gUHV0TEUyNCgpLgorCisgIGZyYW1lX2J5dGVzID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIGZyYW1lX3NpemUpOworICBpZiAoZnJhbWVfYnl0ZXMgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKworICBQdXRMRTI0KGZyYW1lX2J5dGVzICsgMCwgaW5mby0+eF9vZmZzZXQgLyAyKTsKKyAgUHV0TEUyNChmcmFtZV9ieXRlcyArIDMsIGluZm8tPnlfb2Zmc2V0IC8gMik7CisKKyAgUHV0TEUyNChmcmFtZV9ieXRlcyArIDYsIHdpZHRoIC0gMSk7CisgIFB1dExFMjQoZnJhbWVfYnl0ZXMgKyA5LCBoZWlnaHQgLSAxKTsKKyAgUHV0TEUyNChmcmFtZV9ieXRlcyArIDEyLCBpbmZvLT5kdXJhdGlvbik7CisgIGZyYW1lX2J5dGVzWzE1XSA9CisgICAgICAoaW5mby0+YmxlbmRfbWV0aG9kID09IFdFQlBfTVVYX05PX0JMRU5EID8gMiA6IDApIHwKKyAgICAgIChpbmZvLT5kaXNwb3NlX21ldGhvZCA9PSBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQgPyAxIDogMCk7CisKKyAgZnJhbWUtPmJ5dGVzID0gZnJhbWVfYnl0ZXM7CisgIGZyYW1lLT5zaXplID0gZnJhbWVfc2l6ZTsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLyBPdXRwdXRzIGltYWdlIGRhdGEgZ2l2ZW4gYSBiaXRzdHJlYW0uIFRoZSBiaXRzdHJlYW0gY2FuIGVpdGhlciBiZSBhCisvLyBzaW5nbGUtaW1hZ2UgV2ViUCBmaWxlIG9yIHJhdyBWUDgvVlA4TCBkYXRhLgorLy8gQWxzbyBvdXRwdXRzICdpc19sb3NzbGVzcycgdG8gYmUgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYml0c3RyZWFtIGlzIGxvc3NsZXNzLgorc3RhdGljIFdlYlBNdXhFcnJvciBHZXRJbWFnZURhdGEoY29uc3QgV2ViUERhdGEqIGNvbnN0IGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjb25zdCBpbWFnZSwgV2ViUERhdGEqIGNvbnN0IGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBpc19sb3NzbGVzcykgeworICBXZWJQRGF0YUluaXQoYWxwaGEpOyAgLy8gRGVmYXVsdDogbm8gYWxwaGEuCisgIGlmIChiaXRzdHJlYW0tPnNpemUgPCBUQUdfU0laRSB8fAorICAgICAgbWVtY21wKGJpdHN0cmVhbS0+Ynl0ZXMsICJSSUZGIiwgVEFHX1NJWkUpKSB7CisgICAgLy8gSXQgaXMgTk9UIHdlYnAgZmlsZSBkYXRhLiBSZXR1cm4gaW5wdXQgZGF0YSBhcyBpcy4KKyAgICAqaW1hZ2UgPSAqYml0c3RyZWFtOworICB9IGVsc2UgeworICAgIC8vIEl0IGlzIHdlYnAgZmlsZSBkYXRhLiBFeHRyYWN0IGltYWdlIGRhdGEgZnJvbSBpdC4KKyAgICBjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaTsKKyAgICBXZWJQTXV4KiBjb25zdCBtdXggPSBXZWJQTXV4Q3JlYXRlKGJpdHN0cmVhbSwgMCk7CisgICAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisgICAgd3BpID0gbXV4LT5pbWFnZXNfOworICAgIGFzc2VydCh3cGkgIT0gTlVMTCAmJiB3cGktPmltZ18gIT0gTlVMTCk7CisgICAgKmltYWdlID0gd3BpLT5pbWdfLT5kYXRhXzsKKyAgICBpZiAod3BpLT5hbHBoYV8gIT0gTlVMTCkgeworICAgICAgKmFscGhhID0gd3BpLT5hbHBoYV8tPmRhdGFfOworICAgIH0KKyAgICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIH0KKyAgKmlzX2xvc3NsZXNzID0gVlA4TENoZWNrU2lnbmF0dXJlKGltYWdlLT5ieXRlcywgaW1hZ2UtPnNpemUpOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgRGVsZXRlQ2h1bmtzKFdlYlBDaHVuayoqIGNodW5rX2xpc3QsIHVpbnQzMl90IHRhZykgeworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfTk9UX0ZPVU5EOworICBhc3NlcnQoY2h1bmtfbGlzdCk7CisgIHdoaWxlICgqY2h1bmtfbGlzdCkgeworICAgIFdlYlBDaHVuayogY29uc3QgY2h1bmsgPSAqY2h1bmtfbGlzdDsKKyAgICBpZiAoY2h1bmstPnRhZ18gPT0gdGFnKSB7CisgICAgICAqY2h1bmtfbGlzdCA9IENodW5rRGVsZXRlKGNodW5rKTsKKyAgICAgIGVyciA9IFdFQlBfTVVYX09LOworICAgIH0gZWxzZSB7CisgICAgICBjaHVua19saXN0ID0gJmNodW5rLT5uZXh0XzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGVycjsKK30KKworc3RhdGljIFdlYlBNdXhFcnJvciBNdXhEZWxldGVBbGxOYW1lZERhdGEoV2ViUE11eCogY29uc3QgbXV4LCB1aW50MzJfdCB0YWcpIHsKKyAgY29uc3QgV2ViUENodW5rSWQgaWQgPSBDaHVua0dldElkRnJvbVRhZyh0YWcpOworICBhc3NlcnQobXV4ICE9IE5VTEwpOworICBpZiAoSXNXUEkoaWQpKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgcmV0dXJuIERlbGV0ZUNodW5rcyhNdXhHZXRDaHVua0xpc3RGcm9tSWQobXV4LCBpZCksIHRhZyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBTZXQgQVBJKHMpLgorCitXZWJQTXV4RXJyb3IgV2ViUE11eFNldENodW5rKFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBEYXRhKiBjaHVua19kYXRhLCBpbnQgY29weV9kYXRhKSB7CisgIHVpbnQzMl90IHRhZzsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMIHx8IGNodW5rX2RhdGEgPT0gTlVMTCB8fAorICAgICAgY2h1bmtfZGF0YS0+Ynl0ZXMgPT0gTlVMTCB8fCBjaHVua19kYXRhLT5zaXplID4gTUFYX0NIVU5LX1BBWUxPQUQpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorICB0YWcgPSBDaHVua0dldFRhZ0Zyb21Gb3VyQ0MoZm91cmNjKTsKKworICAvLyBEZWxldGUgZXhpc3RpbmcgY2h1bmsocykgd2l0aCB0aGUgc2FtZSAnZm91cmNjJy4KKyAgZXJyID0gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwgdGFnKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSyAmJiBlcnIgIT0gV0VCUF9NVVhfTk9UX0ZPVU5EKSByZXR1cm4gZXJyOworCisgIC8vIEFkZCB0aGUgZ2l2ZW4gY2h1bmsuCisgIHJldHVybiBNdXhTZXQobXV4LCB0YWcsIDEsIGNodW5rX2RhdGEsIGNvcHlfZGF0YSk7Cit9CisKKy8vIENyZWF0ZXMgYSBjaHVuayBmcm9tIGdpdmVuICdkYXRhJyBhbmQgc2V0cyBpdCBhcyAxc3QgY2h1bmsgaW4gJ2NodW5rX2xpc3QnLgorc3RhdGljIFdlYlBNdXhFcnJvciBBZGREYXRhVG9DaHVua0xpc3QoCisgICAgY29uc3QgV2ViUERhdGEqIGNvbnN0IGRhdGEsIGludCBjb3B5X2RhdGEsIHVpbnQzMl90IHRhZywKKyAgICBXZWJQQ2h1bmsqKiBjaHVua19saXN0KSB7CisgIFdlYlBDaHVuayBjaHVuazsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgQ2h1bmtJbml0KCZjaHVuayk7CisgIGVyciA9IENodW5rQXNzaWduRGF0YSgmY2h1bmssIGRhdGEsIGNvcHlfZGF0YSwgdGFnKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgIGVyciA9IENodW5rU2V0TnRoKCZjaHVuaywgY2h1bmtfbGlzdCwgMSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICByZXR1cm4gV0VCUF9NVVhfT0s7CisgRXJyOgorICBDaHVua1JlbGVhc2UoJmNodW5rKTsKKyAgcmV0dXJuIGVycjsKK30KKworLy8gRXh0cmFjdHMgaW1hZ2UgJiBhbHBoYSBkYXRhIGZyb20gdGhlIGdpdmVuIGJpdHN0cmVhbSBhbmQgdGhlbiBzZXRzIHdwaS5hbHBoYV8KKy8vIGFuZCB3cGkuaW1nXyBhcHByb3ByaWF0ZWx5Lgorc3RhdGljIFdlYlBNdXhFcnJvciBTZXRBbHBoYUFuZEltYWdlQ2h1bmtzKAorICAgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBiaXRzdHJlYW0sIGludCBjb3B5X2RhdGEsIFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIGludCBpc19sb3NzbGVzcyA9IDA7CisgIFdlYlBEYXRhIGltYWdlLCBhbHBoYTsKKyAgV2ViUE11eEVycm9yIGVyciA9IEdldEltYWdlRGF0YShiaXRzdHJlYW0sICZpbWFnZSwgJmFscGhhLCAmaXNfbG9zc2xlc3MpOworICBjb25zdCBpbnQgaW1hZ2VfdGFnID0KKyAgICAgIGlzX2xvc3NsZXNzID8ga0NodW5rc1tJRFhfVlA4TF0udGFnIDoga0NodW5rc1tJRFhfVlA4XS50YWc7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChhbHBoYS5ieXRlcyAhPSBOVUxMKSB7CisgICAgZXJyID0gQWRkRGF0YVRvQ2h1bmtMaXN0KCZhbHBoYSwgY29weV9kYXRhLCBrQ2h1bmtzW0lEWF9BTFBIQV0udGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3BpLT5hbHBoYV8pOworICAgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIH0KKyAgZXJyID0gQWRkRGF0YVRvQ2h1bmtMaXN0KCZpbWFnZSwgY29weV9kYXRhLCBpbWFnZV90YWcsICZ3cGktPmltZ18pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICByZXR1cm4gTXV4SW1hZ2VGaW5hbGl6ZSh3cGkpID8gV0VCUF9NVVhfT0sgOiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eFNldEltYWdlKFdlYlBNdXgqIG11eCwgY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSkgeworICBXZWJQTXV4SW1hZ2Ugd3BpOworICBXZWJQTXV4RXJyb3IgZXJyOworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGlmIChtdXggPT0gTlVMTCB8fCBiaXRzdHJlYW0gPT0gTlVMTCB8fCBiaXRzdHJlYW0tPmJ5dGVzID09IE5VTEwgfHwKKyAgICAgIGJpdHN0cmVhbS0+c2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpZiAobXV4LT5pbWFnZXNfICE9IE5VTEwpIHsKKyAgICAvLyBPbmx5IG9uZSAnc2ltcGxlIGltYWdlJyBjYW4gYmUgYWRkZWQgaW4gbXV4LiBTbywgcmVtb3ZlIHByZXNlbnQgaW1hZ2VzLgorICAgIERlbGV0ZUFsbEltYWdlcygmbXV4LT5pbWFnZXNfKTsKKyAgfQorCisgIE11eEltYWdlSW5pdCgmd3BpKTsKKyAgZXJyID0gU2V0QWxwaGFBbmRJbWFnZUNodW5rcyhiaXRzdHJlYW0sIGNvcHlfZGF0YSwgJndwaSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIC8vIEFkZCB0aGlzIFdlYlBNdXhJbWFnZSB0byBtdXguCisgIGVyciA9IE11eEltYWdlUHVzaCgmd3BpLCAmbXV4LT5pbWFnZXNfKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisKKyAgLy8gQWxsIGlzIHdlbGwuCisgIHJldHVybiBXRUJQX01VWF9PSzsKKworIEVycjogIC8vIFNvbWV0aGluZyBiYWQgaGFwcGVuZWQuCisgIE11eEltYWdlUmVsZWFzZSgmd3BpKTsKKyAgcmV0dXJuIGVycjsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhQdXNoRnJhbWUoV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSkgeworICBXZWJQTXV4SW1hZ2Ugd3BpOworICBXZWJQTXV4RXJyb3IgZXJyOworICBjb25zdCBXZWJQRGF0YSogY29uc3QgYml0c3RyZWFtID0gJmluZm8tPmJpdHN0cmVhbTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAobXV4ID09IE5VTEwgfHwgaW5mbyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICBpZiAoaW5mby0+aWQgIT0gV0VCUF9DSFVOS19BTk1GKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICBpZiAoYml0c3RyZWFtLT5ieXRlcyA9PSBOVUxMIHx8IGJpdHN0cmVhbS0+c2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpZiAobXV4LT5pbWFnZXNfICE9IE5VTEwpIHsKKyAgICBjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IGltYWdlID0gbXV4LT5pbWFnZXNfOworICAgIGNvbnN0IHVpbnQzMl90IGltYWdlX2lkID0gKGltYWdlLT5oZWFkZXJfICE9IE5VTEwpID8KKyAgICAgICAgQ2h1bmtHZXRJZEZyb21UYWcoaW1hZ2UtPmhlYWRlcl8tPnRhZ18pIDogV0VCUF9DSFVOS19JTUFHRTsKKyAgICBpZiAoaW1hZ2VfaWQgIT0gaW5mby0+aWQpIHsKKyAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOyAgLy8gQ29uZmxpY3RpbmcgZnJhbWUgdHlwZXMuCisgICAgfQorICB9CisKKyAgTXV4SW1hZ2VJbml0KCZ3cGkpOworICBlcnIgPSBTZXRBbHBoYUFuZEltYWdlQ2h1bmtzKGJpdHN0cmVhbSwgY29weV9kYXRhLCAmd3BpKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgIGFzc2VydCh3cGkuaW1nXyAhPSBOVUxMKTsgIC8vIEFzIFNldEFscGhhQW5kSW1hZ2VDaHVua3MoKSB3YXMgc3VjY2Vzc2Z1bC4KKworICB7CisgICAgV2ViUERhdGEgZnJhbWU7CisgICAgY29uc3QgdWludDMyX3QgdGFnID0ga0NodW5rc1tJRFhfQU5NRl0udGFnOworICAgIFdlYlBNdXhGcmFtZUluZm8gdG1wID0gKmluZm87CisgICAgdG1wLnhfb2Zmc2V0ICY9IH4xOyAgLy8gU25hcCBvZmZzZXRzIHRvIGV2ZW4uCisgICAgdG1wLnlfb2Zmc2V0ICY9IH4xOworICAgIGlmICh0bXAueF9vZmZzZXQgPCAwIHx8IHRtcC54X29mZnNldCA+PSBNQVhfUE9TSVRJT05fT0ZGU0VUIHx8CisgICAgICAgIHRtcC55X29mZnNldCA8IDAgfHwgdG1wLnlfb2Zmc2V0ID49IE1BWF9QT1NJVElPTl9PRkZTRVQgfHwKKyAgICAgICAgKHRtcC5kdXJhdGlvbiA8IDAgfHwgdG1wLmR1cmF0aW9uID49IE1BWF9EVVJBVElPTikgfHwKKyAgICAgICAgdG1wLmRpc3Bvc2VfbWV0aG9kICE9ICh0bXAuZGlzcG9zZV9tZXRob2QgJiAxKSkgeworICAgICAgZXJyID0gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKyAgICBlcnIgPSBDcmVhdGVGcmFtZURhdGEod3BpLndpZHRoXywgd3BpLmhlaWdodF8sICZ0bXAsICZmcmFtZSk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgICAgLy8gQWRkIGZyYW1lIGNodW5rICh3aXRoIGNvcHlfZGF0YSA9IDEpLgorICAgIGVyciA9IEFkZERhdGFUb0NodW5rTGlzdCgmZnJhbWUsIDEsIHRhZywgJndwaS5oZWFkZXJfKTsKKyAgICBXZWJQRGF0YUNsZWFyKCZmcmFtZSk7ICAvLyBmcmFtZSBvd25lZCBieSB3cGkuaGVhZGVyXyBub3cuCisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgZ290byBFcnI7CisgIH0KKworICAvLyBBZGQgdGhpcyBXZWJQTXV4SW1hZ2UgdG8gbXV4LgorICBlcnIgPSBNdXhJbWFnZVB1c2goJndwaSwgJm11eC0+aW1hZ2VzXyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIC8vIEFsbCBpcyB3ZWxsLgorICByZXR1cm4gV0VCUF9NVVhfT0s7CisKKyBFcnI6ICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICBNdXhJbWFnZVJlbGVhc2UoJndwaSk7CisgIHJldHVybiBlcnI7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4U2V0QW5pbWF0aW9uUGFyYW1zKFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpIHsKKyAgV2ViUE11eEVycm9yIGVycjsKKyAgdWludDhfdCBkYXRhW0FOSU1fQ0hVTktfU0laRV07CisgIGNvbnN0IFdlYlBEYXRhIGFuaW0gPSB7IGRhdGEsIEFOSU1fQ0hVTktfU0laRSB9OworCisgIGlmIChtdXggPT0gTlVMTCB8fCBwYXJhbXMgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIGlmIChwYXJhbXMtPmxvb3BfY291bnQgPCAwIHx8IHBhcmFtcy0+bG9vcF9jb3VudCA+PSBNQVhfTE9PUF9DT1VOVCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLy8gRGVsZXRlIGFueSBleGlzdGluZyBBTklNIGNodW5rKHMpLgorICBlcnIgPSBNdXhEZWxldGVBbGxOYW1lZERhdGEobXV4LCBrQ2h1bmtzW0lEWF9BTklNXS50YWcpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LICYmIGVyciAhPSBXRUJQX01VWF9OT1RfRk9VTkQpIHJldHVybiBlcnI7CisKKyAgLy8gU2V0IHRoZSBhbmltYXRpb24gcGFyYW1ldGVycy4KKyAgUHV0TEUzMihkYXRhLCBwYXJhbXMtPmJnY29sb3IpOworICBQdXRMRTE2KGRhdGEgKyA0LCBwYXJhbXMtPmxvb3BfY291bnQpOworICByZXR1cm4gTXV4U2V0KG11eCwga0NodW5rc1tJRFhfQU5JTV0udGFnLCAxLCAmYW5pbSwgMSk7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4U2V0Q2FudmFzU2l6ZShXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIGlmIChtdXggPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmICh3aWR0aCA8IDAgfHwgaGVpZ2h0IDwgMCB8fAorICAgICAgd2lkdGggPiBNQVhfQ0FOVkFTX1NJWkUgfHwgaGVpZ2h0ID4gTUFYX0NBTlZBU19TSVpFKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgaWYgKHdpZHRoICogKHVpbnQ2NF90KWhlaWdodCA+PSBNQVhfSU1BR0VfQVJFQSkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmICgod2lkdGggKiBoZWlnaHQpID09IDAgJiYgKHdpZHRoIHwgaGVpZ2h0KSAhPSAwKSB7CisgICAgLy8gb25lIG9mIHdpZHRoIC8gaGVpZ2h0IGlzIHplcm8sIGJ1dCBub3QgYm90aCAtPiBpbnZhbGlkIQorICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIC8vIElmIHdlIGFscmVhZHkgYXNzZW1ibGVkIGEgVlA4WCBjaHVuaywgaW52YWxpZGF0ZSBpdC4KKyAgZXJyID0gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwga0NodW5rc1tJRFhfVlA4WF0udGFnKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSyAmJiBlcnIgIT0gV0VCUF9NVVhfTk9UX0ZPVU5EKSByZXR1cm4gZXJyOworCisgIG11eC0+Y2FudmFzX3dpZHRoXyA9IHdpZHRoOworICBtdXgtPmNhbnZhc19oZWlnaHRfID0gaGVpZ2h0OworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWxldGUgQVBJKHMpLgorCitXZWJQTXV4RXJyb3IgV2ViUE11eERlbGV0ZUNodW5rKFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0pIHsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgcmV0dXJuIE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIENodW5rR2V0VGFnRnJvbUZvdXJDQyhmb3VyY2MpKTsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhEZWxldGVGcmFtZShXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCkgeworICBpZiAobXV4ID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICByZXR1cm4gTXV4SW1hZ2VEZWxldGVOdGgoJm11eC0+aW1hZ2VzXywgbnRoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEFzc2VtYmx5IG9mIHRoZSBXZWJQIFJJRkYgZmlsZS4KKworc3RhdGljIFdlYlBNdXhFcnJvciBHZXRGcmFtZUluZm8oCisgICAgY29uc3QgV2ViUENodW5rKiBjb25zdCBmcmFtZV9jaHVuaywKKyAgICBpbnQqIGNvbnN0IHhfb2Zmc2V0LCBpbnQqIGNvbnN0IHlfb2Zmc2V0LCBpbnQqIGNvbnN0IGR1cmF0aW9uKSB7CisgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhID0gJmZyYW1lX2NodW5rLT5kYXRhXzsKKyAgY29uc3Qgc2l6ZV90IGV4cGVjdGVkX2RhdGFfc2l6ZSA9IEFOTUZfQ0hVTktfU0laRTsKKyAgYXNzZXJ0KGZyYW1lX2NodW5rLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZyk7CisgIGFzc2VydChmcmFtZV9jaHVuayAhPSBOVUxMKTsKKyAgaWYgKGRhdGEtPnNpemUgIT0gZXhwZWN0ZWRfZGF0YV9zaXplKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICAqeF9vZmZzZXQgPSAyICogR2V0TEUyNChkYXRhLT5ieXRlcyArIDApOworICAqeV9vZmZzZXQgPSAyICogR2V0TEUyNChkYXRhLT5ieXRlcyArIDMpOworICAqZHVyYXRpb24gPSBHZXRMRTI0KGRhdGEtPmJ5dGVzICsgMTIpOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK3N0YXRpYyBXZWJQTXV4RXJyb3IgR2V0SW1hZ2VJbmZvKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCB4X29mZnNldCwgaW50KiBjb25zdCB5X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3QgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgeworICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGZyYW1lX2NodW5rID0gd3BpLT5oZWFkZXJfOworICBXZWJQTXV4RXJyb3IgZXJyOworICBhc3NlcnQod3BpICE9IE5VTEwpOworICBhc3NlcnQoZnJhbWVfY2h1bmsgIT0gTlVMTCk7CisKKyAgLy8gR2V0IG9mZnNldHMgYW5kIGR1cmF0aW9uIGZyb20gQU5NRiBjaHVuay4KKyAgZXJyID0gR2V0RnJhbWVJbmZvKGZyYW1lX2NodW5rLCB4X29mZnNldCwgeV9vZmZzZXQsIGR1cmF0aW9uKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBHZXQgd2lkdGggYW5kIGhlaWdodCBmcm9tIFZQOC9WUDhMIGNodW5rLgorICBpZiAod2lkdGggIT0gTlVMTCkgKndpZHRoID0gd3BpLT53aWR0aF87CisgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IHdwaS0+aGVpZ2h0XzsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLyBSZXR1cm5zIHRoZSB0aWdodGVzdCBkaW1lbnNpb24gZm9yIHRoZSBjYW52YXMgY29uc2lkZXJpbmcgdGhlIGltYWdlIGxpc3QuCitzdGF0aWMgV2ViUE11eEVycm9yIEdldEFkanVzdGVkQ2FudmFzU2l6ZShjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHdpZHRoLCBpbnQqIGNvbnN0IGhlaWdodCkgeworICBXZWJQTXV4SW1hZ2UqIHdwaSA9IE5VTEw7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGFzc2VydCh3aWR0aCAhPSBOVUxMICYmIGhlaWdodCAhPSBOVUxMKTsKKworICB3cGkgPSBtdXgtPmltYWdlc187CisgIGFzc2VydCh3cGkgIT0gTlVMTCk7CisgIGFzc2VydCh3cGktPmltZ18gIT0gTlVMTCk7CisKKyAgaWYgKHdwaS0+bmV4dF8gIT0gTlVMTCkgeworICAgIGludCBtYXhfeCA9IDAsIG1heF95ID0gMDsKKyAgICAvLyBpZiB3ZSBoYXZlIGEgY2hhaW4gb2Ygd3BpJ3MsIGhlYWRlcl8gaXMgbmVjZXNzYXJpbHkgc2V0CisgICAgYXNzZXJ0KHdwaS0+aGVhZGVyXyAhPSBOVUxMKTsKKyAgICAvLyBBZ2dyZWdhdGUgdGhlIGJvdW5kaW5nIGJveCBmb3IgYW5pbWF0aW9uIGZyYW1lcy4KKyAgICBmb3IgKDsgd3BpICE9IE5VTEw7IHdwaSA9IHdwaS0+bmV4dF8pIHsKKyAgICAgIGludCB4X29mZnNldCA9IDAsIHlfb2Zmc2V0ID0gMCwgZHVyYXRpb24gPSAwLCB3ID0gMCwgaCA9IDA7CisgICAgICBjb25zdCBXZWJQTXV4RXJyb3IgZXJyID0gR2V0SW1hZ2VJbmZvKHdwaSwgJnhfb2Zmc2V0LCAmeV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkdXJhdGlvbiwgJncsICZoKTsKKyAgICAgIGNvbnN0IGludCBtYXhfeF9wb3MgPSB4X29mZnNldCArIHc7CisgICAgICBjb25zdCBpbnQgbWF4X3lfcG9zID0geV9vZmZzZXQgKyBoOworICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgICAgIGFzc2VydCh4X29mZnNldCA8IE1BWF9QT1NJVElPTl9PRkZTRVQpOworICAgICAgYXNzZXJ0KHlfb2Zmc2V0IDwgTUFYX1BPU0lUSU9OX09GRlNFVCk7CisKKyAgICAgIGlmIChtYXhfeF9wb3MgPiBtYXhfeCkgbWF4X3ggPSBtYXhfeF9wb3M7CisgICAgICBpZiAobWF4X3lfcG9zID4gbWF4X3kpIG1heF95ID0gbWF4X3lfcG9zOworICAgIH0KKyAgICAqd2lkdGggPSBtYXhfeDsKKyAgICAqaGVpZ2h0ID0gbWF4X3k7CisgIH0gZWxzZSB7CisgICAgLy8gRm9yIGEgc2luZ2xlIGltYWdlLCBjYW52YXMgZGltZW5zaW9ucyBhcmUgc2FtZSBhcyBpbWFnZSBkaW1lbnNpb25zLgorICAgICp3aWR0aCA9IHdwaS0+d2lkdGhfOworICAgICpoZWlnaHQgPSB3cGktPmhlaWdodF87CisgIH0KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLyBWUDhYIGZvcm1hdDoKKy8vIFRvdGFsIFNpemUgOiAxMCwKKy8vIEZsYWdzICA6IDQgYnl0ZXMsCisvLyBXaWR0aCAgOiAzIGJ5dGVzLAorLy8gSGVpZ2h0IDogMyBieXRlcy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgQ3JlYXRlVlA4WENodW5rKFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBXZWJQTXV4RXJyb3IgZXJyID0gV0VCUF9NVVhfT0s7CisgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgaW50IHdpZHRoID0gMDsKKyAgaW50IGhlaWdodCA9IDA7CisgIHVpbnQ4X3QgZGF0YVtWUDhYX0NIVU5LX1NJWkVdOworICBjb25zdCBXZWJQRGF0YSB2cDh4ID0geyBkYXRhLCBWUDhYX0NIVU5LX1NJWkUgfTsKKyAgY29uc3QgV2ViUE11eEltYWdlKiBpbWFnZXMgPSBOVUxMOworCisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGltYWdlcyA9IG11eC0+aW1hZ2VzXzsgIC8vIEZpcnN0IGltYWdlLgorICBpZiAoaW1hZ2VzID09IE5VTEwgfHwgaW1hZ2VzLT5pbWdfID09IE5VTEwgfHwKKyAgICAgIGltYWdlcy0+aW1nXy0+ZGF0YV8uYnl0ZXMgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLy8gSWYgVlA4WCBjaHVuayhzKSBpcyhhcmUpIGFscmVhZHkgcHJlc2VudCwgcmVtb3ZlIHRoZW0gKGFuZCBsYXRlciBhZGQgbmV3CisgIC8vIFZQOFggY2h1bmsgd2l0aCB1cGRhdGVkIGZsYWdzKS4KKyAgZXJyID0gTXV4RGVsZXRlQWxsTmFtZWREYXRhKG11eCwga0NodW5rc1tJRFhfVlA4WF0udGFnKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSyAmJiBlcnIgIT0gV0VCUF9NVVhfTk9UX0ZPVU5EKSByZXR1cm4gZXJyOworCisgIC8vIFNldCBmbGFncy4KKyAgaWYgKG11eC0+aWNjcF8gIT0gTlVMTCAmJiBtdXgtPmljY3BfLT5kYXRhXy5ieXRlcyAhPSBOVUxMKSB7CisgICAgZmxhZ3MgfD0gSUNDUF9GTEFHOworICB9CisgIGlmIChtdXgtPmV4aWZfICE9IE5VTEwgJiYgbXV4LT5leGlmXy0+ZGF0YV8uYnl0ZXMgIT0gTlVMTCkgeworICAgIGZsYWdzIHw9IEVYSUZfRkxBRzsKKyAgfQorICBpZiAobXV4LT54bXBfICE9IE5VTEwgJiYgbXV4LT54bXBfLT5kYXRhXy5ieXRlcyAhPSBOVUxMKSB7CisgICAgZmxhZ3MgfD0gWE1QX0ZMQUc7CisgIH0KKyAgaWYgKGltYWdlcy0+aGVhZGVyXyAhPSBOVUxMKSB7CisgICAgaWYgKGltYWdlcy0+aGVhZGVyXy0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpIHsKKyAgICAgIC8vIFRoaXMgaXMgYW4gaW1hZ2Ugd2l0aCBhbmltYXRpb24uCisgICAgICBmbGFncyB8PSBBTklNQVRJT05fRkxBRzsKKyAgICB9CisgIH0KKyAgaWYgKE11eEltYWdlQ291bnQoaW1hZ2VzLCBXRUJQX0NIVU5LX0FMUEhBKSA+IDApIHsKKyAgICBmbGFncyB8PSBBTFBIQV9GTEFHOyAgLy8gU29tZSBpbWFnZXMgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLgorICB9CisKKyAgZXJyID0gR2V0QWRqdXN0ZWRDYW52YXNTaXplKG11eCwgJndpZHRoLCAmaGVpZ2h0KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICBpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlmICh3aWR0aCA+IE1BWF9DQU5WQVNfU0laRSB8fCBoZWlnaHQgPiBNQVhfQ0FOVkFTX1NJWkUpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfQorCisgIGlmIChtdXgtPmNhbnZhc193aWR0aF8gIT0gMCB8fCBtdXgtPmNhbnZhc19oZWlnaHRfICE9IDApIHsKKyAgICBpZiAod2lkdGggPiBtdXgtPmNhbnZhc193aWR0aF8gfHwgaGVpZ2h0ID4gbXV4LT5jYW52YXNfaGVpZ2h0XykgeworICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgfQorICAgIHdpZHRoID0gbXV4LT5jYW52YXNfd2lkdGhfOworICAgIGhlaWdodCA9IG11eC0+Y2FudmFzX2hlaWdodF87CisgIH0KKworICBpZiAoZmxhZ3MgPT0gMCAmJiBtdXgtPnVua25vd25fID09IE5VTEwpIHsKKyAgICAvLyBGb3Igc2ltcGxlIGZpbGUgZm9ybWF0LCBWUDhYIGNodW5rIHNob3VsZCBub3QgYmUgYWRkZWQuCisgICAgcmV0dXJuIFdFQlBfTVVYX09LOworICB9CisKKyAgaWYgKE11eEhhc0FscGhhKGltYWdlcykpIHsKKyAgICAvLyBUaGlzIG1lYW5zIHNvbWUgZnJhbWVzIGV4cGxpY2l0bHkvaW1wbGljaXRseSBjb250YWluIGFscGhhLgorICAgIC8vIE5vdGU6IFRoaXMgJ2ZsYWdzJyB1cGRhdGUgbXVzdCBOT1QgYmUgZG9uZSBmb3IgYSBsb3NzbGVzcyBpbWFnZQorICAgIC8vIHdpdGhvdXQgYSBWUDhYIGNodW5rIQorICAgIGZsYWdzIHw9IEFMUEhBX0ZMQUc7CisgIH0KKworICBQdXRMRTMyKGRhdGEgKyAwLCBmbGFncyk7ICAgLy8gVlA4WCBjaHVuayBmbGFncy4KKyAgUHV0TEUyNChkYXRhICsgNCwgd2lkdGggLSAxKTsgICAvLyBjYW52YXMgd2lkdGguCisgIFB1dExFMjQoZGF0YSArIDcsIGhlaWdodCAtIDEpOyAgLy8gY2FudmFzIGhlaWdodC4KKworICByZXR1cm4gTXV4U2V0KG11eCwga0NodW5rc1tJRFhfVlA4WF0udGFnLCAxLCAmdnA4eCwgMSk7Cit9CisKKy8vIENsZWFucyB1cCAnbXV4JyBieSByZW1vdmluZyBhbnkgdW5uZWNlc3NhcnkgY2h1bmtzLgorc3RhdGljIFdlYlBNdXhFcnJvciBNdXhDbGVhbnVwKFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBpbnQgbnVtX2ZyYW1lczsKKyAgaW50IG51bV9hbmltX2NodW5rczsKKworICAvLyBJZiB3ZSBoYXZlIGFuIGltYWdlIHdpdGggYSBzaW5nbGUgZnJhbWUsIGFuZCBpdHMgcmVjdGFuZ2xlCisgIC8vIGNvdmVycyB0aGUgd2hvbGUgY2FudmFzLCBjb252ZXJ0IGl0IHRvIGEgbm9uLWFuaW1hdGVkIGltYWdlCisgIC8vICh0byBhdm9pZCB3cml0aW5nIEFOTUYgY2h1bmsgdW5uZWNlc3NhcmlseSkuCisgIFdlYlBNdXhFcnJvciBlcnIgPSBXZWJQTXV4TnVtQ2h1bmtzKG11eCwga0NodW5rc1tJRFhfQU5NRl0uaWQsICZudW1fZnJhbWVzKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKG51bV9mcmFtZXMgPT0gMSkgeworICAgIFdlYlBNdXhJbWFnZSogZnJhbWUgPSBOVUxMOworICAgIGVyciA9IE11eEltYWdlR2V0TnRoKChjb25zdCBXZWJQTXV4SW1hZ2UqKikmbXV4LT5pbWFnZXNfLCAxLCAmZnJhbWUpOworICAgIGFzc2VydChlcnIgPT0gV0VCUF9NVVhfT0spOyAgLy8gV2Uga25vdyB0aGF0IG9uZSBmcmFtZSBkb2VzIGV4aXN0LgorICAgIGFzc2VydChmcmFtZSAhPSBOVUxMKTsKKyAgICBpZiAoZnJhbWUtPmhlYWRlcl8gIT0gTlVMTCAmJgorICAgICAgICAoKG11eC0+Y2FudmFzX3dpZHRoXyA9PSAwICYmIG11eC0+Y2FudmFzX2hlaWdodF8gPT0gMCkgfHwKKyAgICAgICAgIChmcmFtZS0+d2lkdGhfID09IG11eC0+Y2FudmFzX3dpZHRoXyAmJgorICAgICAgICAgIGZyYW1lLT5oZWlnaHRfID09IG11eC0+Y2FudmFzX2hlaWdodF8pKSkgeworICAgICAgYXNzZXJ0KGZyYW1lLT5oZWFkZXJfLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZyk7CisgICAgICBDaHVua0RlbGV0ZShmcmFtZS0+aGVhZGVyXyk7ICAvLyBSZW1vdmVzIEFOTUYgY2h1bmsuCisgICAgICBmcmFtZS0+aGVhZGVyXyA9IE5VTEw7CisgICAgICBudW1fZnJhbWVzID0gMDsKKyAgICB9CisgIH0KKyAgLy8gUmVtb3ZlIEFOSU0gY2h1bmsgaWYgdGhpcyBpcyBhIG5vbi1hbmltYXRlZCBpbWFnZS4KKyAgZXJyID0gV2ViUE11eE51bUNodW5rcyhtdXgsIGtDaHVua3NbSURYX0FOSU1dLmlkLCAmbnVtX2FuaW1fY2h1bmtzKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgaWYgKG51bV9hbmltX2NodW5rcyA+PSAxICYmIG51bV9mcmFtZXMgPT0gMCkgeworICAgIGVyciA9IE11eERlbGV0ZUFsbE5hbWVkRGF0YShtdXgsIGtDaHVua3NbSURYX0FOSU1dLnRhZyk7CisgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKy8vIFRvdGFsIHNpemUgb2YgYSBsaXN0IG9mIGltYWdlcy4KK3N0YXRpYyBzaXplX3QgSW1hZ2VMaXN0RGlza1NpemUoY29uc3QgV2ViUE11eEltYWdlKiB3cGlfbGlzdCkgeworICBzaXplX3Qgc2l6ZSA9IDA7CisgIHdoaWxlICh3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgc2l6ZSArPSBNdXhJbWFnZURpc2tTaXplKHdwaV9saXN0KTsKKyAgICB3cGlfbGlzdCA9IHdwaV9saXN0LT5uZXh0XzsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLy8gV3JpdGUgb3V0IHRoZSBnaXZlbiBsaXN0IG9mIGltYWdlcyBpbnRvICdkc3QnLgorc3RhdGljIHVpbnQ4X3QqIEltYWdlTGlzdEVtaXQoY29uc3QgV2ViUE11eEltYWdlKiB3cGlfbGlzdCwgdWludDhfdCogZHN0KSB7CisgIHdoaWxlICh3cGlfbGlzdCAhPSBOVUxMKSB7CisgICAgZHN0ID0gTXV4SW1hZ2VFbWl0KHdwaV9saXN0LCBkc3QpOworICAgIHdwaV9saXN0ID0gd3BpX2xpc3QtPm5leHRfOworICB9CisgIHJldHVybiBkc3Q7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4QXNzZW1ibGUoV2ViUE11eCogbXV4LCBXZWJQRGF0YSogYXNzZW1ibGVkX2RhdGEpIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICB1aW50OF90KiBkYXRhID0gTlVMTDsKKyAgdWludDhfdCogZHN0ID0gTlVMTDsKKyAgV2ViUE11eEVycm9yIGVycjsKKworICBpZiAoYXNzZW1ibGVkX2RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIC8vIENsZWFuIHVwIHJldHVybmVkIGRhdGEsIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgIG1lbXNldChhc3NlbWJsZWRfZGF0YSwgMCwgc2l6ZW9mKCphc3NlbWJsZWRfZGF0YSkpOworCisgIGlmIChtdXggPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisKKyAgLy8gRmluYWxpemUgbXV4LgorICBlcnIgPSBNdXhDbGVhbnVwKG11eCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGVyciA9IENyZWF0ZVZQOFhDaHVuayhtdXgpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEFsbG9jYXRlIGRhdGEuCisgIHNpemUgPSBDaHVua0xpc3REaXNrU2l6ZShtdXgtPnZwOHhfKSArIENodW5rTGlzdERpc2tTaXplKG11eC0+aWNjcF8pCisgICAgICAgKyBDaHVua0xpc3REaXNrU2l6ZShtdXgtPmFuaW1fKSArIEltYWdlTGlzdERpc2tTaXplKG11eC0+aW1hZ2VzXykKKyAgICAgICArIENodW5rTGlzdERpc2tTaXplKG11eC0+ZXhpZl8pICsgQ2h1bmtMaXN0RGlza1NpemUobXV4LT54bXBfKQorICAgICAgICsgQ2h1bmtMaXN0RGlza1NpemUobXV4LT51bmtub3duXykgKyBSSUZGX0hFQURFUl9TSVpFOworCisgIGRhdGEgPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZSk7CisgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisKKyAgLy8gRW1pdCBoZWFkZXIgJiBjaHVua3MuCisgIGRzdCA9IE11eEVtaXRSaWZmSGVhZGVyKGRhdGEsIHNpemUpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+dnA4eF8sIGRzdCk7CisgIGRzdCA9IENodW5rTGlzdEVtaXQobXV4LT5pY2NwXywgZHN0KTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPmFuaW1fLCBkc3QpOworICBkc3QgPSBJbWFnZUxpc3RFbWl0KG11eC0+aW1hZ2VzXywgZHN0KTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPmV4aWZfLCBkc3QpOworICBkc3QgPSBDaHVua0xpc3RFbWl0KG11eC0+eG1wXywgZHN0KTsKKyAgZHN0ID0gQ2h1bmtMaXN0RW1pdChtdXgtPnVua25vd25fLCBkc3QpOworICBhc3NlcnQoZHN0ID09IGRhdGEgKyBzaXplKTsKKworICAvLyBWYWxpZGF0ZSBtdXguCisgIGVyciA9IE11eFZhbGlkYXRlKG11eCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHsKKyAgICBXZWJQU2FmZUZyZWUoZGF0YSk7CisgICAgZGF0YSA9IE5VTEw7CisgICAgc2l6ZSA9IDA7CisgIH0KKworICAvLyBGaW5hbGl6ZSBkYXRhLgorICBhc3NlbWJsZWRfZGF0YS0+Ynl0ZXMgPSBkYXRhOworICBhc3NlbWJsZWRfZGF0YS0+c2l6ZSA9IHNpemU7CisKKyAgcmV0dXJuIGVycjsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFlMWU5NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aS5oCkBAIC0wLDAgKzEsMjMwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gSW50ZXJuYWwgaGVhZGVyIGZvciBtdXggbGlicmFyeS4KKy8vCisvLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpZm5kZWYgV0VCUF9NVVhfTVVYSV9IXworI2RlZmluZSBXRUJQX01VWF9NVVhJX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJzcmMvZGVjL3ZwOGlfZGVjLmgiCisjaW5jbHVkZSAic3JjL2RlYy92cDhsaV9kZWMuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9tdXguaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGVmaW5lcyBhbmQgY29uc3RhbnRzLgorCisjZGVmaW5lIE1VWF9NQUpfVkVSU0lPTiAxCisjZGVmaW5lIE1VWF9NSU5fVkVSU0lPTiAwCisjZGVmaW5lIE1VWF9SRVZfVkVSU0lPTiAwCisKKy8vIENodW5rIG9iamVjdC4KK3R5cGVkZWYgc3RydWN0IFdlYlBDaHVuayBXZWJQQ2h1bms7CitzdHJ1Y3QgV2ViUENodW5rIHsKKyAgdWludDMyX3QgICAgICAgIHRhZ187CisgIGludCAgICAgICAgICAgICBvd25lcl87ICAvLyBUcnVlIGlmICpkYXRhXyBtZW1vcnkgaXMgb3duZWQgaW50ZXJuYWxseS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZQOFgsIEFOSU0sIGFuZCBvdGhlciBpbnRlcm5hbGx5IGNyZWF0ZWQgY2h1bmtzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIEFOTUYgYXJlIGFsd2F5cyBvd25lZC4KKyAgV2ViUERhdGEgICAgICAgIGRhdGFfOworICBXZWJQQ2h1bmsqICAgICAgbmV4dF87Cit9OworCisvLyBNdXhJbWFnZSBvYmplY3QuIFN0b3JlIGEgZnVsbCBXZWJQIGltYWdlIChpbmNsdWRpbmcgQU5NRiBjaHVuaywgQUxQSAorLy8gY2h1bmsgYW5kIFZQOC9WUDhMIGNodW5rKSwKK3R5cGVkZWYgc3RydWN0IFdlYlBNdXhJbWFnZSBXZWJQTXV4SW1hZ2U7CitzdHJ1Y3QgV2ViUE11eEltYWdlIHsKKyAgV2ViUENodW5rKiAgaGVhZGVyXzsgICAgICAvLyBDb3JyZXNwb25kcyB0byBXRUJQX0NIVU5LX0FOTUYuCisgIFdlYlBDaHVuayogIGFscGhhXzsgICAgICAgLy8gQ29ycmVzcG9uZHMgdG8gV0VCUF9DSFVOS19BTFBIQS4KKyAgV2ViUENodW5rKiAgaW1nXzsgICAgICAgICAvLyBDb3JyZXNwb25kcyB0byBXRUJQX0NIVU5LX0lNQUdFLgorICBXZWJQQ2h1bmsqICB1bmtub3duXzsgICAgIC8vIENvcnJlc3BvbmRzIHRvIFdFQlBfQ0hVTktfVU5LTk9XTi4KKyAgaW50ICAgICAgICAgd2lkdGhfOworICBpbnQgICAgICAgICBoZWlnaHRfOworICBpbnQgICAgICAgICBoYXNfYWxwaGFfOyAgIC8vIFRocm91Z2ggQUxQSCBjaHVuayBvciBhcyBwYXJ0IG9mIFZQOEwuCisgIGludCAgICAgICAgIGlzX3BhcnRpYWxfOyAgLy8gVHJ1ZSBpZiBvbmx5IHNvbWUgb2YgdGhlIGNodW5rcyBhcmUgZmlsbGVkLgorICBXZWJQTXV4SW1hZ2UqIG5leHRfOworfTsKKworLy8gTWFpbiBtdXggb2JqZWN0LiBTdG9yZXMgZGF0YSBjaHVua3MuCitzdHJ1Y3QgV2ViUE11eCB7CisgIFdlYlBNdXhJbWFnZSogICBpbWFnZXNfOworICBXZWJQQ2h1bmsqICAgICAgaWNjcF87CisgIFdlYlBDaHVuayogICAgICBleGlmXzsKKyAgV2ViUENodW5rKiAgICAgIHhtcF87CisgIFdlYlBDaHVuayogICAgICBhbmltXzsKKyAgV2ViUENodW5rKiAgICAgIHZwOHhfOworCisgIFdlYlBDaHVuayogICAgICB1bmtub3duXzsKKyAgaW50ICAgICAgICAgICAgIGNhbnZhc193aWR0aF87CisgIGludCAgICAgICAgICAgICBjYW52YXNfaGVpZ2h0XzsKK307CisKKy8vIENIVU5LX0lOREVYIGVudW06IHVzZWQgZm9yIGluZGV4aW5nIHdpdGhpbiAna0NodW5rcycgKGRlZmluZWQgYmVsb3cpIG9ubHkuCisvLyBOb3RlOiB0aGUgcmVhc29uIGZvciBoYXZpbmcgdHdvIGVudW1zICgnV2ViUENodW5rSWQnIGFuZCAnQ0hVTktfSU5ERVgnKSBpcyB0bworLy8gYWxsb3cgdHdvIGRpZmZlcmVudCBjaHVua3MgdG8gaGF2ZSB0aGUgc2FtZSBpZCAoZS5nLiBXZWJQQ2h1bmtJZAorLy8gJ1dFQlBfQ0hVTktfSU1BR0UnIGNhbiBjb3JyZXNwb25kIHRvIENIVU5LX0lOREVYICdJRFhfVlA4JyBvciAnSURYX1ZQOEwnKS4KK3R5cGVkZWYgZW51bSB7CisgIElEWF9WUDhYID0gMCwKKyAgSURYX0lDQ1AsCisgIElEWF9BTklNLAorICBJRFhfQU5NRiwKKyAgSURYX0FMUEhBLAorICBJRFhfVlA4LAorICBJRFhfVlA4TCwKKyAgSURYX0VYSUYsCisgIElEWF9YTVAsCisgIElEWF9VTktOT1dOLAorCisgIElEWF9OSUwsCisgIElEWF9MQVNUX0NIVU5LCit9IENIVU5LX0lOREVYOworCisjZGVmaW5lIE5JTF9UQUcgMHgwMDAwMDAwMHUgIC8vIFRvIHNpZ25hbCB2b2lkIGNodW5rLgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQzMl90ICAgICAgdGFnOworICBXZWJQQ2h1bmtJZCAgIGlkOworICB1aW50MzJfdCAgICAgIHNpemU7Cit9IENodW5rSW5mbzsKKworZXh0ZXJuIGNvbnN0IENodW5rSW5mbyBrQ2h1bmtzW0lEWF9MQVNUX0NIVU5LXTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIG9iamVjdCBtYW5hZ2VtZW50LgorCisvLyBJbml0aWFsaXplLgordm9pZCBDaHVua0luaXQoV2ViUENodW5rKiBjb25zdCBjaHVuayk7CisKKy8vIEdldCBjaHVuayBpbmRleCBmcm9tIGNodW5rIHRhZy4gUmV0dXJucyBJRFhfVU5LTk9XTiBpZiBub3QgZm91bmQuCitDSFVOS19JTkRFWCBDaHVua0dldEluZGV4RnJvbVRhZyh1aW50MzJfdCB0YWcpOworCisvLyBHZXQgY2h1bmsgaWQgZnJvbSBjaHVuayB0YWcuIFJldHVybnMgV0VCUF9DSFVOS19VTktOT1dOIGlmIG5vdCBmb3VuZC4KK1dlYlBDaHVua0lkIENodW5rR2V0SWRGcm9tVGFnKHVpbnQzMl90IHRhZyk7CisKKy8vIENvbnZlcnQgYSBmb3VyY2Mgc3RyaW5nIHRvIGEgdGFnLgordWludDMyX3QgQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGNvbnN0IGNoYXIgZm91cmNjWzRdKTsKKworLy8gR2V0IGNodW5rIGluZGV4IGZyb20gZm91cmNjLiBSZXR1cm5zIElEWF9VTktOT1dOIGlmIGdpdmVuIGZvdXJjYyBpcyB1bmtub3duLgorQ0hVTktfSU5ERVggQ2h1bmtHZXRJbmRleEZyb21Gb3VyQ0MoY29uc3QgY2hhciBmb3VyY2NbNF0pOworCisvLyBTZWFyY2ggZm9yIG50aCBjaHVuayB3aXRoIGdpdmVuICd0YWcnIGluIHRoZSBjaHVuayBsaXN0LgorLy8gbnRoID0gMCBtZWFucyAibGFzdCBvZiB0aGUgbGlzdCIuCitXZWJQQ2h1bmsqIENodW5rU2VhcmNoTGlzdChXZWJQQ2h1bmsqIGZpcnN0LCB1aW50MzJfdCBudGgsIHVpbnQzMl90IHRhZyk7CisKKy8vIEZpbGwgdGhlIGNodW5rIHdpdGggdGhlIGdpdmVuIGRhdGEuCitXZWJQTXV4RXJyb3IgQ2h1bmtBc3NpZ25EYXRhKFdlYlBDaHVuayogY2h1bmssIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29weV9kYXRhLCB1aW50MzJfdCB0YWcpOworCisvLyBTZXRzICdjaHVuaycgYXQgbnRoIHBvc2l0aW9uIGluIHRoZSAnY2h1bmtfbGlzdCcuCisvLyBudGggPSAwIGhhcyB0aGUgc3BlY2lhbCBtZWFuaW5nICJsYXN0IG9mIHRoZSBsaXN0Ii4KKy8vIE9uIHN1Y2Nlc3Mgb3duZXJzaGlwIGlzIHRyYW5zZmVycmVkIGZyb20gJ2NodW5rJyB0byB0aGUgJ2NodW5rX2xpc3QnLgorV2ViUE11eEVycm9yIENodW5rU2V0TnRoKFdlYlBDaHVuayogY2h1bmssIFdlYlBDaHVuayoqIGNodW5rX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnRoKTsKKworLy8gUmVsZWFzZXMgY2h1bmsgYW5kIHJldHVybnMgY2h1bmstPm5leHRfLgorV2ViUENodW5rKiBDaHVua1JlbGVhc2UoV2ViUENodW5rKiBjb25zdCBjaHVuayk7CisKKy8vIERlbGV0ZXMgZ2l2ZW4gY2h1bmsgJiByZXR1cm5zIGNodW5rLT5uZXh0Xy4KK1dlYlBDaHVuayogQ2h1bmtEZWxldGUoV2ViUENodW5rKiBjb25zdCBjaHVuayk7CisKKy8vIERlbGV0ZXMgYWxsIGNodW5rcyBpbiB0aGUgZ2l2ZW4gY2h1bmsgbGlzdC4KK3ZvaWQgQ2h1bmtMaXN0RGVsZXRlKFdlYlBDaHVuayoqIGNvbnN0IGNodW5rX2xpc3QpOworCisvLyBSZXR1cm5zIHNpemUgb2YgdGhlIGNodW5rIGluY2x1ZGluZyBjaHVuayBoZWFkZXIgYW5kIHBhZGRpbmcgYnl0ZSAoaWYgYW55KS4KK3N0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgU2l6ZVdpdGhQYWRkaW5nKHNpemVfdCBjaHVua19zaXplKSB7CisgIHJldHVybiBDSFVOS19IRUFERVJfU0laRSArICgoY2h1bmtfc2l6ZSArIDEpICYgfjFVKTsKK30KKworLy8gU2l6ZSBvZiBhIGNodW5rIGluY2x1ZGluZyBoZWFkZXIgYW5kIHBhZGRpbmcuCitzdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IENodW5rRGlza1NpemUoY29uc3QgV2ViUENodW5rKiBjaHVuaykgeworICBjb25zdCBzaXplX3QgZGF0YV9zaXplID0gY2h1bmstPmRhdGFfLnNpemU7CisgIFNCX0RDSEVDSyhkYXRhX3NpemUgPCBNQVhfQ0hVTktfUEFZTE9BRCk7CisgIHJldHVybiBTaXplV2l0aFBhZGRpbmcoZGF0YV9zaXplKTsKK30KKworLy8gVG90YWwgc2l6ZSBvZiBhIGxpc3Qgb2YgY2h1bmtzLgorc2l6ZV90IENodW5rTGlzdERpc2tTaXplKGNvbnN0IFdlYlBDaHVuayogY2h1bmtfbGlzdCk7CisKKy8vIFdyaXRlIG91dCB0aGUgZ2l2ZW4gbGlzdCBvZiBjaHVua3MgaW50byAnZHN0Jy4KK3VpbnQ4X3QqIENodW5rTGlzdEVtaXQoY29uc3QgV2ViUENodW5rKiBjaHVua19saXN0LCB1aW50OF90KiBkc3QpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2Ugb2JqZWN0IG1hbmFnZW1lbnQuCisKKy8vIEluaXRpYWxpemUuCit2b2lkIE11eEltYWdlSW5pdChXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSk7CisKKy8vIFJlbGVhc2VzIGltYWdlICd3cGknIGFuZCByZXR1cm5zIHdwaS0+bmV4dC4KK1dlYlBNdXhJbWFnZSogTXV4SW1hZ2VSZWxlYXNlKFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKTsKKworLy8gRGVsZXRlIGltYWdlICd3cGknIGFuZCByZXR1cm4gdGhlIG5leHQgaW1hZ2UgaW4gdGhlIGxpc3Qgb3IgTlVMTC4KKy8vICd3cGknIGNhbiBiZSBOVUxMLgorV2ViUE11eEltYWdlKiBNdXhJbWFnZURlbGV0ZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSk7CisKKy8vIENvdW50IG51bWJlciBvZiBpbWFnZXMgbWF0Y2hpbmcgdGhlIGdpdmVuIHRhZyBpZCBpbiB0aGUgJ3dwaV9saXN0Jy4KKy8vIElmIGlkID09IFdFQlBfQ0hVTktfTklMLCBhbGwgaW1hZ2VzIHdpbGwgYmUgbWF0Y2hlZC4KK2ludCBNdXhJbWFnZUNvdW50KGNvbnN0IFdlYlBNdXhJbWFnZSogd3BpX2xpc3QsIFdlYlBDaHVua0lkIGlkKTsKKworLy8gVXBkYXRlIHdpZHRoL2hlaWdodC9oYXNfYWxwaGEgaW5mbyBmcm9tIGNodW5rcyB3aXRoaW4gd3BpLgorLy8gQWxzbyByZW1vdmUgQUxQSCBjaHVuayBpZiBub3QgbmVlZGVkLgoraW50IE11eEltYWdlRmluYWxpemUoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpOworCisvLyBDaGVjayBpZiBnaXZlbiBJRCBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSByZWxhdGVkIGNodW5rLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBJc1dQSShXZWJQQ2h1bmtJZCBpZCkgeworICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBXRUJQX0NIVU5LX0FOTUY6CisgICAgY2FzZSBXRUJQX0NIVU5LX0FMUEhBOgorICAgIGNhc2UgV0VCUF9DSFVOS19JTUFHRTogIHJldHVybiAxOworICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gMDsKKyAgfQorfQorCisvLyBQdXNoZXMgJ3dwaScgYXQgdGhlIGVuZCBvZiAnd3BpX2xpc3QnLgorV2ViUE11eEVycm9yIE11eEltYWdlUHVzaChjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaSwgV2ViUE11eEltYWdlKiogd3BpX2xpc3QpOworCisvLyBEZWxldGUgbnRoIGltYWdlIGluIHRoZSBpbWFnZSBsaXN0LgorV2ViUE11eEVycm9yIE11eEltYWdlRGVsZXRlTnRoKFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0LCB1aW50MzJfdCBudGgpOworCisvLyBHZXQgbnRoIGltYWdlIGluIHRoZSBpbWFnZSBsaXN0LgorV2ViUE11eEVycm9yIE11eEltYWdlR2V0TnRoKGNvbnN0IFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0LCB1aW50MzJfdCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEltYWdlKiogd3BpKTsKKworLy8gVG90YWwgc2l6ZSBvZiB0aGUgZ2l2ZW4gaW1hZ2UuCitzaXplX3QgTXV4SW1hZ2VEaXNrU2l6ZShjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSk7CisKKy8vIFdyaXRlIG91dCB0aGUgZ2l2ZW4gaW1hZ2UgaW50byAnZHN0Jy4KK3VpbnQ4X3QqIE11eEltYWdlRW1pdChjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwgdWludDhfdCogZHN0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhlbHBlciBtZXRob2RzIGZvciBtdXguCisKKy8vIENoZWNrcyBpZiB0aGUgZ2l2ZW4gaW1hZ2UgbGlzdCBjb250YWlucyBhdCBsZWFzdCBvbmUgaW1hZ2Ugd2l0aCBhbHBoYS4KK2ludCBNdXhIYXNBbHBoYShjb25zdCBXZWJQTXV4SW1hZ2UqIGltYWdlcyk7CisKKy8vIFdyaXRlIG91dCBSSUZGIGhlYWRlciBpbnRvICdkYXRhJywgZ2l2ZW4gdG90YWwgZGF0YSBzaXplICdzaXplJy4KK3VpbnQ4X3QqIE11eEVtaXRSaWZmSGVhZGVyKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHNpemVfdCBzaXplKTsKKworLy8gUmV0dXJucyB0aGUgbGlzdCB3aGVyZSBjaHVuayB3aXRoIGdpdmVuIElEIGlzIHRvIGJlIGluc2VydGVkIGluIG11eC4KK1dlYlBDaHVuayoqIE11eEdldENodW5rTGlzdEZyb21JZChjb25zdCBXZWJQTXV4KiBtdXgsIFdlYlBDaHVua0lkIGlkKTsKKworLy8gVmFsaWRhdGVzIHRoZSBnaXZlbiBtdXggb2JqZWN0LgorV2ViUE11eEVycm9yIE11eFZhbGlkYXRlKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX01VWF9NVVhJX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGludGVybmFsLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvbXV4L211eGludGVybmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxMjIyYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4aW50ZXJuYWwuYwpAQCAtMCwwICsxLDU1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEludGVybmFsIG9iamVjdHMgYW5kIHV0aWxzIGZvciBtdXguCisvLworLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvbXV4L211eGkuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworI2RlZmluZSBVTkRFRklORURfQ0hVTktfU0laRSAoKHVpbnQzMl90KSgtMSkpCisKK2NvbnN0IENodW5rSW5mbyBrQ2h1bmtzW10gPSB7CisgIHsgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJ1gnKSwgIFdFQlBfQ0hVTktfVlA4WCwgICAgVlA4WF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ0knLCAnQycsICdDJywgJ1AnKSwgIFdFQlBfQ0hVTktfSUNDUCwgICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnQScsICdOJywgJ0knLCAnTScpLCAgV0VCUF9DSFVOS19BTklNLCAgICBBTklNX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnQScsICdOJywgJ00nLCAnRicpLCAgV0VCUF9DSFVOS19BTk1GLCAgICBBTk1GX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnQScsICdMJywgJ1AnLCAnSCcpLCAgV0VCUF9DSFVOS19BTFBIQSwgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdWJywgJ1AnLCAnOCcsICcgJyksICBXRUJQX0NIVU5LX0lNQUdFLCAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJ0wnKSwgIFdFQlBfQ0hVTktfSU1BR0UsICAgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKyAgeyBNS0ZPVVJDQygnRScsICdYJywgJ0knLCAnRicpLCAgV0VCUF9DSFVOS19FWElGLCAgICBVTkRFRklORURfQ0hVTktfU0laRSB9LAorICB7IE1LRk9VUkNDKCdYJywgJ00nLCAnUCcsICcgJyksICBXRUJQX0NIVU5LX1hNUCwgICAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0sCisgIHsgTklMX1RBRywgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfQ0hVTktfVU5LTk9XTiwgVU5ERUZJTkVEX0NIVU5LX1NJWkUgfSwKKworICB7IE5JTF9UQUcsICAgICAgICAgICAgICAgICAgICAgICBXRUJQX0NIVU5LX05JTCwgICAgIFVOREVGSU5FRF9DSFVOS19TSVpFIH0KK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBXZWJQR2V0TXV4VmVyc2lvbih2b2lkKSB7CisgIHJldHVybiAoTVVYX01BSl9WRVJTSU9OIDw8IDE2KSB8IChNVVhfTUlOX1ZFUlNJT04gPDwgOCkgfCBNVVhfUkVWX1ZFUlNJT047Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWZlIG9mIGEgY2h1bmsgb2JqZWN0LgorCit2b2lkIENodW5rSW5pdChXZWJQQ2h1bmsqIGNvbnN0IGNodW5rKSB7CisgIGFzc2VydChjaHVuayk7CisgIG1lbXNldChjaHVuaywgMCwgc2l6ZW9mKCpjaHVuaykpOworICBjaHVuay0+dGFnXyA9IE5JTF9UQUc7Cit9CisKK1dlYlBDaHVuayogQ2h1bmtSZWxlYXNlKFdlYlBDaHVuayogY29uc3QgY2h1bmspIHsKKyAgV2ViUENodW5rKiBuZXh0OworICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIGlmIChjaHVuay0+b3duZXJfKSB7CisgICAgV2ViUERhdGFDbGVhcigmY2h1bmstPmRhdGFfKTsKKyAgfQorICBuZXh0ID0gY2h1bmstPm5leHRfOworICBDaHVua0luaXQoY2h1bmspOworICByZXR1cm4gbmV4dDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENodW5rIG1pc2MgbWV0aG9kcy4KKworQ0hVTktfSU5ERVggQ2h1bmtHZXRJbmRleEZyb21UYWcodWludDMyX3QgdGFnKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBrQ2h1bmtzW2ldLnRhZyAhPSBOSUxfVEFHOyArK2kpIHsKKyAgICBpZiAodGFnID09IGtDaHVua3NbaV0udGFnKSByZXR1cm4gKENIVU5LX0lOREVYKWk7CisgIH0KKyAgcmV0dXJuIElEWF9VTktOT1dOOworfQorCitXZWJQQ2h1bmtJZCBDaHVua0dldElkRnJvbVRhZyh1aW50MzJfdCB0YWcpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGtDaHVua3NbaV0udGFnICE9IE5JTF9UQUc7ICsraSkgeworICAgIGlmICh0YWcgPT0ga0NodW5rc1tpXS50YWcpIHJldHVybiBrQ2h1bmtzW2ldLmlkOworICB9CisgIHJldHVybiBXRUJQX0NIVU5LX1VOS05PV047Cit9CisKK3VpbnQzMl90IENodW5rR2V0VGFnRnJvbUZvdXJDQyhjb25zdCBjaGFyIGZvdXJjY1s0XSkgeworICByZXR1cm4gTUtGT1VSQ0MoZm91cmNjWzBdLCBmb3VyY2NbMV0sIGZvdXJjY1syXSwgZm91cmNjWzNdKTsKK30KKworQ0hVTktfSU5ERVggQ2h1bmtHZXRJbmRleEZyb21Gb3VyQ0MoY29uc3QgY2hhciBmb3VyY2NbNF0pIHsKKyAgY29uc3QgdWludDMyX3QgdGFnID0gQ2h1bmtHZXRUYWdGcm9tRm91ckNDKGZvdXJjYyk7CisgIHJldHVybiBDaHVua0dldEluZGV4RnJvbVRhZyh0YWcpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgc2VhcmNoIG1ldGhvZHMuCisKKy8vIFJldHVybnMgbmV4dCBjaHVuayBpbiB0aGUgY2h1bmsgbGlzdCB3aXRoIHRoZSBnaXZlbiB0YWcuCitzdGF0aWMgV2ViUENodW5rKiBDaHVua1NlYXJjaE5leHRJbkxpc3QoV2ViUENodW5rKiBjaHVuaywgdWludDMyX3QgdGFnKSB7CisgIHdoaWxlIChjaHVuayAhPSBOVUxMICYmIGNodW5rLT50YWdfICE9IHRhZykgeworICAgIGNodW5rID0gY2h1bmstPm5leHRfOworICB9CisgIHJldHVybiBjaHVuazsKK30KKworV2ViUENodW5rKiBDaHVua1NlYXJjaExpc3QoV2ViUENodW5rKiBmaXJzdCwgdWludDMyX3QgbnRoLCB1aW50MzJfdCB0YWcpIHsKKyAgdWludDMyX3QgaXRlciA9IG50aDsKKyAgZmlyc3QgPSBDaHVua1NlYXJjaE5leHRJbkxpc3QoZmlyc3QsIHRhZyk7CisgIGlmIChmaXJzdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICB3aGlsZSAoLS1pdGVyICE9IDApIHsKKyAgICBXZWJQQ2h1bmsqIG5leHRfY2h1bmsgPSBDaHVua1NlYXJjaE5leHRJbkxpc3QoZmlyc3QtPm5leHRfLCB0YWcpOworICAgIGlmIChuZXh0X2NodW5rID09IE5VTEwpIGJyZWFrOworICAgIGZpcnN0ID0gbmV4dF9jaHVuazsKKyAgfQorICByZXR1cm4gKChudGggPiAwKSAmJiAoaXRlciA+IDApKSA/IE5VTEwgOiBmaXJzdDsKK30KKworLy8gT3V0cHV0cyBhIHBvaW50ZXIgdG8gJ3ByZXZfY2h1bmstPm5leHRfJywKKy8vICAgd2hlcmUgJ3ByZXZfY2h1bmsnIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBjaHVuayBhdCBwb3NpdGlvbiAobnRoIC0gMSkuCisvLyBSZXR1cm5zIHRydWUgaWYgbnRoIGNodW5rIHdhcyBmb3VuZC4KK3N0YXRpYyBpbnQgQ2h1bmtTZWFyY2hMaXN0VG9TZXQoV2ViUENodW5rKiogY2h1bmtfbGlzdCwgdWludDMyX3QgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmsqKiogY29uc3QgbG9jYXRpb24pIHsKKyAgdWludDMyX3QgY291bnQgPSAwOworICBhc3NlcnQoY2h1bmtfbGlzdCAhPSBOVUxMKTsKKyAgKmxvY2F0aW9uID0gY2h1bmtfbGlzdDsKKworICB3aGlsZSAoKmNodW5rX2xpc3QgIT0gTlVMTCkgeworICAgIFdlYlBDaHVuayogY29uc3QgY3VyX2NodW5rID0gKmNodW5rX2xpc3Q7CisgICAgKytjb3VudDsKKyAgICBpZiAoY291bnQgPT0gbnRoKSByZXR1cm4gMTsgIC8vIEZvdW5kLgorICAgIGNodW5rX2xpc3QgPSAmY3VyX2NodW5rLT5uZXh0XzsKKyAgICAqbG9jYXRpb24gPSBjaHVua19saXN0OworICB9CisKKyAgLy8gKmNodW5rX2xpc3QgaXMgb2sgdG8gYmUgTlVMTCBpZiBhZGRpbmcgYXQgbGFzdCBsb2NhdGlvbi4KKyAgcmV0dXJuIChudGggPT0gMCB8fCAoY291bnQgPT0gbnRoIC0gMSkpID8gMSA6IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDaHVuayB3cml0ZXIgbWV0aG9kcy4KKworV2ViUE11eEVycm9yIENodW5rQXNzaWduRGF0YShXZWJQQ2h1bmsqIGNodW5rLCBjb25zdCBXZWJQRGF0YSogY29uc3QgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSwgdWludDMyX3QgdGFnKSB7CisgIC8vIEZvciBpbnRlcm5hbGx5IGFsbG9jYXRlZCBjaHVua3MsIGFsd2F5cyBjb3B5IGRhdGEgJiBtYWtlIGl0IG93bmVyIG9mIGRhdGEuCisgIGlmICh0YWcgPT0ga0NodW5rc1tJRFhfVlA4WF0udGFnIHx8IHRhZyA9PSBrQ2h1bmtzW0lEWF9BTklNXS50YWcpIHsKKyAgICBjb3B5X2RhdGEgPSAxOworICB9CisKKyAgQ2h1bmtSZWxlYXNlKGNodW5rKTsKKworICBpZiAoZGF0YSAhPSBOVUxMKSB7CisgICAgaWYgKGNvcHlfZGF0YSkgeyAgICAgICAgLy8gQ29weSBkYXRhLgorICAgICAgaWYgKCFXZWJQRGF0YUNvcHkoZGF0YSwgJmNodW5rLT5kYXRhXykpIHJldHVybiBXRUJQX01VWF9NRU1PUllfRVJST1I7CisgICAgICBjaHVuay0+b3duZXJfID0gMTsgICAgLy8gQ2h1bmsgaXMgb3duZXIgb2YgZGF0YS4KKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAvLyBEb24ndCBjb3B5IGRhdGEuCisgICAgICBjaHVuay0+ZGF0YV8gPSAqZGF0YTsKKyAgICB9CisgIH0KKyAgY2h1bmstPnRhZ18gPSB0YWc7CisgIHJldHVybiBXRUJQX01VWF9PSzsKK30KKworV2ViUE11eEVycm9yIENodW5rU2V0TnRoKFdlYlBDaHVuayogY2h1bmssIFdlYlBDaHVuayoqIGNodW5rX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbnRoKSB7CisgIFdlYlBDaHVuayogbmV3X2NodW5rOworCisgIGlmICghQ2h1bmtTZWFyY2hMaXN0VG9TZXQoY2h1bmtfbGlzdCwgbnRoLCAmY2h1bmtfbGlzdCkpIHsKKyAgICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworICB9CisKKyAgbmV3X2NodW5rID0gKFdlYlBDaHVuayopV2ViUFNhZmVNYWxsb2MoMVVMTCwgc2l6ZW9mKCpuZXdfY2h1bmspKTsKKyAgaWYgKG5ld19jaHVuayA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworICAqbmV3X2NodW5rID0gKmNodW5rOworICBjaHVuay0+b3duZXJfID0gMDsKKyAgbmV3X2NodW5rLT5uZXh0XyA9ICpjaHVua19saXN0OworICAqY2h1bmtfbGlzdCA9IG5ld19jaHVuazsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgZGVsZXRpb24gbWV0aG9kKHMpLgorCitXZWJQQ2h1bmsqIENodW5rRGVsZXRlKFdlYlBDaHVuayogY29uc3QgY2h1bmspIHsKKyAgV2ViUENodW5rKiBjb25zdCBuZXh0ID0gQ2h1bmtSZWxlYXNlKGNodW5rKTsKKyAgV2ViUFNhZmVGcmVlKGNodW5rKTsKKyAgcmV0dXJuIG5leHQ7Cit9CisKK3ZvaWQgQ2h1bmtMaXN0RGVsZXRlKFdlYlBDaHVuayoqIGNvbnN0IGNodW5rX2xpc3QpIHsKKyAgd2hpbGUgKCpjaHVua19saXN0ICE9IE5VTEwpIHsKKyAgICAqY2h1bmtfbGlzdCA9IENodW5rRGVsZXRlKCpjaHVua19saXN0KTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgc2VyaWFsaXphdGlvbiBtZXRob2RzLgorCitzdGF0aWMgdWludDhfdCogQ2h1bmtFbWl0KGNvbnN0IFdlYlBDaHVuayogY29uc3QgY2h1bmssIHVpbnQ4X3QqIGRzdCkgeworICBjb25zdCBzaXplX3QgY2h1bmtfc2l6ZSA9IGNodW5rLT5kYXRhXy5zaXplOworICBhc3NlcnQoY2h1bmspOworICBhc3NlcnQoY2h1bmstPnRhZ18gIT0gTklMX1RBRyk7CisgIFB1dExFMzIoZHN0ICsgMCwgY2h1bmstPnRhZ18pOworICBQdXRMRTMyKGRzdCArIFRBR19TSVpFLCAodWludDMyX3QpY2h1bmtfc2l6ZSk7CisgIGFzc2VydChjaHVua19zaXplID09ICh1aW50MzJfdCljaHVua19zaXplKTsKKyAgbWVtY3B5KGRzdCArIENIVU5LX0hFQURFUl9TSVpFLCBjaHVuay0+ZGF0YV8uYnl0ZXMsIGNodW5rX3NpemUpOworICBpZiAoY2h1bmtfc2l6ZSAmIDEpCisgICAgZHN0W0NIVU5LX0hFQURFUl9TSVpFICsgY2h1bmtfc2l6ZV0gPSAwOyAgLy8gQWRkIHBhZGRpbmcuCisgIHJldHVybiBkc3QgKyBDaHVua0Rpc2tTaXplKGNodW5rKTsKK30KKwordWludDhfdCogQ2h1bmtMaXN0RW1pdChjb25zdCBXZWJQQ2h1bmsqIGNodW5rX2xpc3QsIHVpbnQ4X3QqIGRzdCkgeworICB3aGlsZSAoY2h1bmtfbGlzdCAhPSBOVUxMKSB7CisgICAgZHN0ID0gQ2h1bmtFbWl0KGNodW5rX2xpc3QsIGRzdCk7CisgICAgY2h1bmtfbGlzdCA9IGNodW5rX2xpc3QtPm5leHRfOworICB9CisgIHJldHVybiBkc3Q7Cit9CisKK3NpemVfdCBDaHVua0xpc3REaXNrU2l6ZShjb25zdCBXZWJQQ2h1bmsqIGNodW5rX2xpc3QpIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICB3aGlsZSAoY2h1bmtfbGlzdCAhPSBOVUxMKSB7CisgICAgc2l6ZSArPSBDaHVua0Rpc2tTaXplKGNodW5rX2xpc3QpOworICAgIGNodW5rX2xpc3QgPSBjaHVua19saXN0LT5uZXh0XzsKKyAgfQorICByZXR1cm4gc2l6ZTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIExpZmUgb2YgYSBNdXhJbWFnZSBvYmplY3QuCisKK3ZvaWQgTXV4SW1hZ2VJbml0KFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpKSB7CisgIGFzc2VydCh3cGkpOworICBtZW1zZXQod3BpLCAwLCBzaXplb2YoKndwaSkpOworfQorCitXZWJQTXV4SW1hZ2UqIE11eEltYWdlUmVsZWFzZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBXZWJQTXV4SW1hZ2UqIG5leHQ7CisgIGlmICh3cGkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgIENodW5rRGVsZXRlKHdwaS0+aGVhZGVyXyk7CisgIENodW5rRGVsZXRlKHdwaS0+YWxwaGFfKTsKKyAgQ2h1bmtEZWxldGUod3BpLT5pbWdfKTsKKyAgQ2h1bmtMaXN0RGVsZXRlKCZ3cGktPnVua25vd25fKTsKKworICBuZXh0ID0gd3BpLT5uZXh0XzsKKyAgTXV4SW1hZ2VJbml0KHdwaSk7CisgIHJldHVybiBuZXh0OworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2Ugc2VhcmNoIG1ldGhvZHMuCisKKy8vIEdldCBhIHJlZmVyZW5jZSB0byBhcHByb3ByaWF0ZSBjaHVuayBsaXN0IHdpdGhpbiBhbiBpbWFnZSBnaXZlbiBjaHVuayB0YWcuCitzdGF0aWMgV2ViUENodW5rKiogR2V0Q2h1bmtMaXN0RnJvbUlkKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJZCBpZCkgeworICBhc3NlcnQod3BpICE9IE5VTEwpOworICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSBXRUJQX0NIVU5LX0FOTUY6ICByZXR1cm4gKFdlYlBDaHVuayoqKSZ3cGktPmhlYWRlcl87CisgICAgY2FzZSBXRUJQX0NIVU5LX0FMUEhBOiByZXR1cm4gKFdlYlBDaHVuayoqKSZ3cGktPmFscGhhXzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfSU1BR0U6IHJldHVybiAoV2ViUENodW5rKiopJndwaS0+aW1nXzsKKyAgICBkZWZhdWx0OiByZXR1cm4gTlVMTDsKKyAgfQorfQorCitpbnQgTXV4SW1hZ2VDb3VudChjb25zdCBXZWJQTXV4SW1hZ2UqIHdwaV9saXN0LCBXZWJQQ2h1bmtJZCBpZCkgeworICBpbnQgY291bnQgPSAwOworICBjb25zdCBXZWJQTXV4SW1hZ2UqIGN1cnJlbnQ7CisgIGZvciAoY3VycmVudCA9IHdwaV9saXN0OyBjdXJyZW50ICE9IE5VTEw7IGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0XykgeworICAgIGlmIChpZCA9PSBXRUJQX0NIVU5LX05JTCkgeworICAgICAgKytjb3VudDsgIC8vIFNwZWNpYWwgY2FzZTogY291bnQgYWxsIGltYWdlcy4KKyAgICB9IGVsc2UgeworICAgICAgY29uc3QgV2ViUENodW5rKiBjb25zdCB3cGlfY2h1bmsgPSAqR2V0Q2h1bmtMaXN0RnJvbUlkKGN1cnJlbnQsIGlkKTsKKyAgICAgIGlmICh3cGlfY2h1bmsgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBXZWJQQ2h1bmtJZCB3cGlfY2h1bmtfaWQgPSBDaHVua0dldElkRnJvbVRhZyh3cGlfY2h1bmstPnRhZ18pOworICAgICAgICBpZiAod3BpX2NodW5rX2lkID09IGlkKSArK2NvdW50OyAgLy8gQ291bnQgaW1hZ2VzIHdpdGggYSBtYXRjaGluZyAnaWQnLgorICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gY291bnQ7Cit9CisKKy8vIE91dHB1dHMgYSBwb2ludGVyIHRvICdwcmV2X3dwaS0+bmV4dF8nLAorLy8gICB3aGVyZSAncHJldl93cGknIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBpbWFnZSBhdCBwb3NpdGlvbiAobnRoIC0gMSkuCisvLyBSZXR1cm5zIHRydWUgaWYgbnRoIGltYWdlIHdhcyBmb3VuZC4KK3N0YXRpYyBpbnQgU2VhcmNoSW1hZ2VUb0dldE9yRGVsZXRlKFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0LCB1aW50MzJfdCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4SW1hZ2UqKiogY29uc3QgbG9jYXRpb24pIHsKKyAgdWludDMyX3QgY291bnQgPSAwOworICBhc3NlcnQod3BpX2xpc3QpOworICAqbG9jYXRpb24gPSB3cGlfbGlzdDsKKworICBpZiAobnRoID09IDApIHsKKyAgICBudGggPSBNdXhJbWFnZUNvdW50KCp3cGlfbGlzdCwgV0VCUF9DSFVOS19OSUwpOworICAgIGlmIChudGggPT0gMCkgcmV0dXJuIDA7ICAvLyBOb3QgZm91bmQuCisgIH0KKworICB3aGlsZSAoKndwaV9saXN0ICE9IE5VTEwpIHsKKyAgICBXZWJQTXV4SW1hZ2UqIGNvbnN0IGN1cl93cGkgPSAqd3BpX2xpc3Q7CisgICAgKytjb3VudDsKKyAgICBpZiAoY291bnQgPT0gbnRoKSByZXR1cm4gMTsgIC8vIEZvdW5kLgorICAgIHdwaV9saXN0ID0gJmN1cl93cGktPm5leHRfOworICAgICpsb2NhdGlvbiA9IHdwaV9saXN0OworICB9CisgIHJldHVybiAwOyAgLy8gTm90IGZvdW5kLgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2Ugd3JpdGVyIG1ldGhvZHMuCisKK1dlYlBNdXhFcnJvciBNdXhJbWFnZVB1c2goY29uc3QgV2ViUE11eEltYWdlKiB3cGksIFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0KSB7CisgIFdlYlBNdXhJbWFnZSogbmV3X3dwaTsKKworICB3aGlsZSAoKndwaV9saXN0ICE9IE5VTEwpIHsKKyAgICBXZWJQTXV4SW1hZ2UqIGNvbnN0IGN1cl93cGkgPSAqd3BpX2xpc3Q7CisgICAgaWYgKGN1cl93cGktPm5leHRfID09IE5VTEwpIGJyZWFrOworICAgIHdwaV9saXN0ID0gJmN1cl93cGktPm5leHRfOworICB9CisKKyAgbmV3X3dwaSA9IChXZWJQTXV4SW1hZ2UqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemVvZigqbmV3X3dwaSkpOworICBpZiAobmV3X3dwaSA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfTUVNT1JZX0VSUk9SOworICAqbmV3X3dwaSA9ICp3cGk7CisgIG5ld193cGktPm5leHRfID0gTlVMTDsKKworICBpZiAoKndwaV9saXN0ICE9IE5VTEwpIHsKKyAgICAoKndwaV9saXN0KS0+bmV4dF8gPSBuZXdfd3BpOworICB9IGVsc2UgeworICAgICp3cGlfbGlzdCA9IG5ld193cGk7CisgIH0KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2UgZGVsZXRpb24gbWV0aG9kcy4KKworV2ViUE11eEltYWdlKiBNdXhJbWFnZURlbGV0ZShXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICAvLyBEZWxldGUgdGhlIGNvbXBvbmVudHMgb2Ygd3BpLiBJZiB3cGkgaXMgTlVMTCB0aGlzIGlzIGEgbm9vcC4KKyAgV2ViUE11eEltYWdlKiBjb25zdCBuZXh0ID0gTXV4SW1hZ2VSZWxlYXNlKHdwaSk7CisgIFdlYlBTYWZlRnJlZSh3cGkpOworICByZXR1cm4gbmV4dDsKK30KKworV2ViUE11eEVycm9yIE11eEltYWdlRGVsZXRlTnRoKFdlYlBNdXhJbWFnZSoqIHdwaV9saXN0LCB1aW50MzJfdCBudGgpIHsKKyAgYXNzZXJ0KHdwaV9saXN0KTsKKyAgaWYgKCFTZWFyY2hJbWFnZVRvR2V0T3JEZWxldGUod3BpX2xpc3QsIG50aCwgJndwaV9saXN0KSkgeworICAgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIH0KKyAgKndwaV9saXN0ID0gTXV4SW1hZ2VEZWxldGUoKndwaV9saXN0KTsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2UgcmVhZGVyIG1ldGhvZHMuCisKK1dlYlBNdXhFcnJvciBNdXhJbWFnZUdldE50aChjb25zdCBXZWJQTXV4SW1hZ2UqKiB3cGlfbGlzdCwgdWludDMyX3QgbnRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhJbWFnZSoqIHdwaSkgeworICBhc3NlcnQod3BpX2xpc3QpOworICBhc3NlcnQod3BpKTsKKyAgaWYgKCFTZWFyY2hJbWFnZVRvR2V0T3JEZWxldGUoKFdlYlBNdXhJbWFnZSoqKXdwaV9saXN0LCBudGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXZWJQTXV4SW1hZ2UqKiopJndwaV9saXN0KSkgeworICAgIHJldHVybiBXRUJQX01VWF9OT1RfRk9VTkQ7CisgIH0KKyAgKndwaSA9IChXZWJQTXV4SW1hZ2UqKSp3cGlfbGlzdDsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTXV4SW1hZ2Ugc2VyaWFsaXphdGlvbiBtZXRob2RzLgorCisvLyBTaXplIG9mIGFuIGltYWdlLgorc2l6ZV90IE11eEltYWdlRGlza1NpemUoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgc2l6ZV90IHNpemUgPSAwOworICBpZiAod3BpLT5oZWFkZXJfICE9IE5VTEwpIHNpemUgKz0gQ2h1bmtEaXNrU2l6ZSh3cGktPmhlYWRlcl8pOworICBpZiAod3BpLT5hbHBoYV8gIT0gTlVMTCkgc2l6ZSArPSBDaHVua0Rpc2tTaXplKHdwaS0+YWxwaGFfKTsKKyAgaWYgKHdwaS0+aW1nXyAhPSBOVUxMKSBzaXplICs9IENodW5rRGlza1NpemUod3BpLT5pbWdfKTsKKyAgaWYgKHdwaS0+dW5rbm93bl8gIT0gTlVMTCkgc2l6ZSArPSBDaHVua0xpc3REaXNrU2l6ZSh3cGktPnVua25vd25fKTsKKyAgcmV0dXJuIHNpemU7Cit9CisKKy8vIFNwZWNpYWwgY2FzZSBhcyBBTk1GIGNodW5rIGVuY2Fwc3VsYXRlcyBvdGhlciBpbWFnZSBjaHVua3MuCitzdGF0aWMgdWludDhfdCogQ2h1bmtFbWl0U3BlY2lhbChjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbF9zaXplLCB1aW50OF90KiBkc3QpIHsKKyAgY29uc3Qgc2l6ZV90IGhlYWRlcl9zaXplID0gaGVhZGVyLT5kYXRhXy5zaXplOworICBjb25zdCBzaXplX3Qgb2Zmc2V0X3RvX25leHQgPSB0b3RhbF9zaXplIC0gQ0hVTktfSEVBREVSX1NJWkU7CisgIGFzc2VydChoZWFkZXItPnRhZ18gPT0ga0NodW5rc1tJRFhfQU5NRl0udGFnKTsKKyAgUHV0TEUzMihkc3QgKyAwLCBoZWFkZXItPnRhZ18pOworICBQdXRMRTMyKGRzdCArIFRBR19TSVpFLCAodWludDMyX3Qpb2Zmc2V0X3RvX25leHQpOworICBhc3NlcnQoaGVhZGVyX3NpemUgPT0gKHVpbnQzMl90KWhlYWRlcl9zaXplKTsKKyAgbWVtY3B5KGRzdCArIENIVU5LX0hFQURFUl9TSVpFLCBoZWFkZXItPmRhdGFfLmJ5dGVzLCBoZWFkZXJfc2l6ZSk7CisgIGlmIChoZWFkZXJfc2l6ZSAmIDEpIHsKKyAgICBkc3RbQ0hVTktfSEVBREVSX1NJWkUgKyBoZWFkZXJfc2l6ZV0gPSAwOyAgLy8gQWRkIHBhZGRpbmcuCisgIH0KKyAgcmV0dXJuIGRzdCArIENodW5rRGlza1NpemUoaGVhZGVyKTsKK30KKwordWludDhfdCogTXV4SW1hZ2VFbWl0KGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLCB1aW50OF90KiBkc3QpIHsKKyAgLy8gT3JkZXJpbmcgb2YgY2h1bmtzIHRvIGJlIGVtaXR0ZWQgaXMgc3RyaWN0bHkgYXMgZm9sbG93czoKKyAgLy8gMS4gQU5NRiBjaHVuayAoaWYgcHJlc2VudCkuCisgIC8vIDIuIEFMUEggY2h1bmsgKGlmIHByZXNlbnQpLgorICAvLyAzLiBWUDgvVlA4TCBjaHVuay4KKyAgYXNzZXJ0KHdwaSk7CisgIGlmICh3cGktPmhlYWRlcl8gIT0gTlVMTCkgeworICAgIGRzdCA9IENodW5rRW1pdFNwZWNpYWwod3BpLT5oZWFkZXJfLCBNdXhJbWFnZURpc2tTaXplKHdwaSksIGRzdCk7CisgIH0KKyAgaWYgKHdwaS0+YWxwaGFfICE9IE5VTEwpIGRzdCA9IENodW5rRW1pdCh3cGktPmFscGhhXywgZHN0KTsKKyAgaWYgKHdwaS0+aW1nXyAhPSBOVUxMKSBkc3QgPSBDaHVua0VtaXQod3BpLT5pbWdfLCBkc3QpOworICBpZiAod3BpLT51bmtub3duXyAhPSBOVUxMKSBkc3QgPSBDaHVua0xpc3RFbWl0KHdwaS0+dW5rbm93bl8sIGRzdCk7CisgIHJldHVybiBkc3Q7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgbWV0aG9kcyBmb3IgbXV4LgorCitpbnQgTXV4SGFzQWxwaGEoY29uc3QgV2ViUE11eEltYWdlKiBpbWFnZXMpIHsKKyAgd2hpbGUgKGltYWdlcyAhPSBOVUxMKSB7CisgICAgaWYgKGltYWdlcy0+aGFzX2FscGhhXykgcmV0dXJuIDE7CisgICAgaW1hZ2VzID0gaW1hZ2VzLT5uZXh0XzsKKyAgfQorICByZXR1cm4gMDsKK30KKwordWludDhfdCogTXV4RW1pdFJpZmZIZWFkZXIodWludDhfdCogY29uc3QgZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgUHV0TEUzMihkYXRhICsgMCwgTUtGT1VSQ0MoJ1InLCAnSScsICdGJywgJ0YnKSk7CisgIFB1dExFMzIoZGF0YSArIFRBR19TSVpFLCAodWludDMyX3Qpc2l6ZSAtIENIVU5LX0hFQURFUl9TSVpFKTsKKyAgYXNzZXJ0KHNpemUgPT0gKHVpbnQzMl90KXNpemUpOworICBQdXRMRTMyKGRhdGEgKyBUQUdfU0laRSArIENIVU5LX1NJWkVfQllURVMsIE1LRk9VUkNDKCdXJywgJ0UnLCAnQicsICdQJykpOworICByZXR1cm4gZGF0YSArIFJJRkZfSEVBREVSX1NJWkU7Cit9CisKK1dlYlBDaHVuayoqIE11eEdldENodW5rTGlzdEZyb21JZChjb25zdCBXZWJQTXV4KiBtdXgsIFdlYlBDaHVua0lkIGlkKSB7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIFdFQlBfQ0hVTktfVlA4WDogICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT52cDh4XzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfSUNDUDogICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT5pY2NwXzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfQU5JTTogICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT5hbmltXzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfRVhJRjogICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT5leGlmXzsKKyAgICBjYXNlIFdFQlBfQ0hVTktfWE1QOiAgICAgcmV0dXJuIChXZWJQQ2h1bmsqKikmbXV4LT54bXBfOworICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICByZXR1cm4gKFdlYlBDaHVuayoqKSZtdXgtPnVua25vd25fOworICB9Cit9CisKK3N0YXRpYyBpbnQgSXNOb3RDb21wYXRpYmxlKGludCBmZWF0dXJlLCBpbnQgbnVtX2l0ZW1zKSB7CisgIHJldHVybiAoZmVhdHVyZSAhPSAwKSAhPSAobnVtX2l0ZW1zID4gMCk7Cit9CisKKyNkZWZpbmUgTk9fRkxBRyAoKFdlYlBGZWF0dXJlRmxhZ3MpMCkKKworLy8gVGVzdCBiYXNpYyBjb25zdHJhaW50czoKKy8vIHJldHJpZXZhbCwgbWF4aW11bSBudW1iZXIgb2YgY2h1bmtzIGJ5IGluZGV4ICh1c2UgLTEgdG8gc2tpcCkKKy8vIGFuZCBmZWF0dXJlIGluY29tcGF0aWJpbGl0eSAodXNlIE5PX0ZMQUcgdG8gc2tpcCkuCisvLyBPbiBzdWNjZXNzIHJldHVybnMgV0VCUF9NVVhfT0sgYW5kIHN0b3JlcyB0aGUgY2h1bmsgY291bnQgaW4gKm51bS4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgVmFsaWRhdGVDaHVuayhjb25zdCBXZWJQTXV4KiBjb25zdCBtdXgsIENIVU5LX0lOREVYIGlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRmVhdHVyZUZsYWdzIGZlYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdnA4eF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQqIG51bSkgeworICBjb25zdCBXZWJQTXV4RXJyb3IgZXJyID0KKyAgICAgIFdlYlBNdXhOdW1DaHVua3MobXV4LCBrQ2h1bmtzW2lkeF0uaWQsIG51bSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGlmIChtYXggPiAtMSAmJiAqbnVtID4gbWF4KSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgaWYgKGZlYXR1cmUgIT0gTk9fRkxBRyAmJiBJc05vdENvbXBhdGlibGUodnA4eF9mbGFncyAmIGZlYXR1cmUsICpudW0pKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitXZWJQTXV4RXJyb3IgTXV4VmFsaWRhdGUoY29uc3QgV2ViUE11eCogY29uc3QgbXV4KSB7CisgIGludCBudW1faWNjcDsKKyAgaW50IG51bV9leGlmOworICBpbnQgbnVtX3htcDsKKyAgaW50IG51bV9hbmltOworICBpbnQgbnVtX2ZyYW1lczsKKyAgaW50IG51bV92cDh4OworICBpbnQgbnVtX2ltYWdlczsKKyAgaW50IG51bV9hbHBoYTsKKyAgdWludDMyX3QgZmxhZ3M7CisgIFdlYlBNdXhFcnJvciBlcnI7CisKKyAgLy8gVmVyaWZ5IG11eCBpcyBub3QgTlVMTC4KKyAgaWYgKG11eCA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICAvLyBWZXJpZnkgbXV4IGhhcyBhdCBsZWFzdCBvbmUgaW1hZ2UuCisgIGlmIChtdXgtPmltYWdlc18gPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisKKyAgZXJyID0gV2ViUE11eEdldEZlYXR1cmVzKG11eCwgJmZsYWdzKTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKworICAvLyBBdCBtb3N0IG9uZSBjb2xvciBwcm9maWxlIGNodW5rLgorICBlcnIgPSBWYWxpZGF0ZUNodW5rKG11eCwgSURYX0lDQ1AsIElDQ1BfRkxBRywgZmxhZ3MsIDEsICZudW1faWNjcCk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgLy8gQXQgbW9zdCBvbmUgRVhJRiBtZXRhZGF0YS4KKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9FWElGLCBFWElGX0ZMQUcsIGZsYWdzLCAxLCAmbnVtX2V4aWYpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEF0IG1vc3Qgb25lIFhNUCBtZXRhZGF0YS4KKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9YTVAsIFhNUF9GTEFHLCBmbGFncywgMSwgJm51bV94bXApOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEFuaW1hdGlvbjogQU5JTUFUSU9OX0ZMQUcsIEFOSU0gY2h1bmsgYW5kIEFOTUYgY2h1bmsocykgYXJlIGNvbnNpc3RlbnQuCisgIC8vIEF0IG1vc3Qgb25lIEFOSU0gY2h1bmsuCisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfQU5JTSwgTk9fRkxBRywgZmxhZ3MsIDEsICZudW1fYW5pbSk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisgIGVyciA9IFZhbGlkYXRlQ2h1bmsobXV4LCBJRFhfQU5NRiwgTk9fRkxBRywgZmxhZ3MsIC0xLCAmbnVtX2ZyYW1lcyk7CisgIGlmIChlcnIgIT0gV0VCUF9NVVhfT0spIHJldHVybiBlcnI7CisKKyAgeworICAgIGNvbnN0IGludCBoYXNfYW5pbWF0aW9uID0gISEoZmxhZ3MgJiBBTklNQVRJT05fRkxBRyk7CisgICAgaWYgKGhhc19hbmltYXRpb24gJiYgKG51bV9hbmltID09IDAgfHwgbnVtX2ZyYW1lcyA9PSAwKSkgeworICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgfQorICAgIGlmICghaGFzX2FuaW1hdGlvbiAmJiAobnVtX2FuaW0gPT0gMSB8fCBudW1fZnJhbWVzID4gMCkpIHsKKyAgICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgIH0KKyAgICBpZiAoIWhhc19hbmltYXRpb24pIHsKKyAgICAgIGNvbnN0IFdlYlBNdXhJbWFnZSogaW1hZ2VzID0gbXV4LT5pbWFnZXNfOworICAgICAgLy8gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGltYWdlLgorICAgICAgaWYgKGltYWdlcyA9PSBOVUxMIHx8IGltYWdlcy0+bmV4dF8gIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICAgIH0KKyAgICAgIC8vIFNpemUgbXVzdCBtYXRjaC4KKyAgICAgIGlmIChtdXgtPmNhbnZhc193aWR0aF8gPiAwKSB7CisgICAgICAgIGlmIChpbWFnZXMtPndpZHRoXyAhPSBtdXgtPmNhbnZhc193aWR0aF8gfHwKKyAgICAgICAgICAgIGltYWdlcy0+aGVpZ2h0XyAhPSBtdXgtPmNhbnZhc19oZWlnaHRfKSB7CisgICAgICAgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBWZXJpZnkgZWl0aGVyIFZQOFggY2h1bmsgaXMgcHJlc2VudCBPUiB0aGVyZSBpcyBvbmx5IG9uZSBlbGVtIGluCisgIC8vIG11eC0+aW1hZ2VzXy4KKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9WUDhYLCBOT19GTEFHLCBmbGFncywgMSwgJm51bV92cDh4KTsKKyAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgZXJyID0gVmFsaWRhdGVDaHVuayhtdXgsIElEWF9WUDgsIE5PX0ZMQUcsIGZsYWdzLCAtMSwgJm51bV9pbWFnZXMpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAobnVtX3ZwOHggPT0gMCAmJiBudW1faW1hZ2VzICE9IDEpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworCisgIC8vIEFMUEhBX0ZMQUcgJiBhbHBoYSBjaHVuayhzKSBhcmUgY29uc2lzdGVudC4KKyAgLy8gTm90ZTogQUxQSEFfRkxBRyBjYW4gYmUgc2V0IHdoZW4gdGhlcmUgaXMgYWN0dWFsbHkgbm8gQWxwaGEgZGF0YSBwcmVzZW50LgorICBpZiAoTXV4SGFzQWxwaGEobXV4LT5pbWFnZXNfKSkgeworICAgIGlmIChudW1fdnA4eCA+IDApIHsKKyAgICAgIC8vIFZQOFggY2h1bmsgaXMgcHJlc2VudCwgc28gaXQgc2hvdWxkIGNvbnRhaW4gQUxQSEFfRkxBRy4KKyAgICAgIGlmICghKGZsYWdzICYgQUxQSEFfRkxBRykpIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICAgIH0gZWxzZSB7CisgICAgICAvLyBWUDhYIGNodW5rIGlzIG5vdCBwcmVzZW50LCBzbyBBTFBIIGNodW5rcyBzaG91bGQgTk9UIGJlIHByZXNlbnQgZWl0aGVyLgorICAgICAgZXJyID0gV2ViUE11eE51bUNodW5rcyhtdXgsIFdFQlBfQ0hVTktfQUxQSEEsICZudW1fYWxwaGEpOworICAgICAgaWYgKGVyciAhPSBXRUJQX01VWF9PSykgcmV0dXJuIGVycjsKKyAgICAgIGlmIChudW1fYWxwaGEgPiAwKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgICB9CisgIH0KKworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKKyN1bmRlZiBOT19GTEFHCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4cmVhZC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL211eC9tdXhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI1NTI4NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy9tdXgvbXV4cmVhZC5jCkBAIC0wLDAgKzEsNTM5IEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVhZCBBUElzIGZvciBtdXguCisvLworLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKy8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgInNyYy9tdXgvbXV4aS5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIG1ldGhvZChzKS4KKworLy8gSGFuZHkgTUFDUk8uCisjZGVmaW5lIFNXSVRDSF9JRF9MSVNUKElOREVYLCBMSVNUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChpZHggPT0gKElOREVYKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgV2ViUENodW5rKiBjb25zdCBjaHVuayA9IENodW5rU2VhcmNoTGlzdCgoTElTVCksIG50aCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2h1bmtzWyhJTkRFWCldLnRhZyk7ICAgICBcCisgICAgaWYgKGNodW5rKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAqZGF0YSA9IGNodW5rLT5kYXRhXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gV0VCUF9NVVhfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RhdGljIFdlYlBNdXhFcnJvciBNdXhHZXQoY29uc3QgV2ViUE11eCogY29uc3QgbXV4LCBDSFVOS19JTkRFWCBpZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBudGgsIFdlYlBEYXRhKiBjb25zdCBkYXRhKSB7CisgIGFzc2VydChtdXggIT0gTlVMTCk7CisgIGFzc2VydCghSXNXUEkoa0NodW5rc1tpZHhdLmlkKSk7CisgIFdlYlBEYXRhSW5pdChkYXRhKTsKKworICBTV0lUQ0hfSURfTElTVChJRFhfVlA4WCwgbXV4LT52cDh4Xyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9JQ0NQLCBtdXgtPmljY3BfKTsKKyAgU1dJVENIX0lEX0xJU1QoSURYX0FOSU0sIG11eC0+YW5pbV8pOworICBTV0lUQ0hfSURfTElTVChJRFhfRVhJRiwgbXV4LT5leGlmXyk7CisgIFNXSVRDSF9JRF9MSVNUKElEWF9YTVAsIG11eC0+eG1wXyk7CisgIGFzc2VydChpZHggIT0gSURYX1VOS05PV04pOworICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworfQorI3VuZGVmIFNXSVRDSF9JRF9MSVNUCisKKy8vIEZpbGwgdGhlIGNodW5rIHdpdGggdGhlIGdpdmVuIGRhdGEgKGluY2x1ZGVzIGNodW5rIGhlYWRlciBieXRlcyksIGFmdGVyIHNvbWUKKy8vIHZlcmlmaWNhdGlvbnMuCitzdGF0aWMgV2ViUE11eEVycm9yIENodW5rVmVyaWZ5QW5kQXNzaWduKFdlYlBDaHVuayogY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByaWZmX3NpemUsIGludCBjb3B5X2RhdGEpIHsKKyAgdWludDMyX3QgY2h1bmtfc2l6ZTsKKyAgV2ViUERhdGEgY2h1bmtfZGF0YTsKKworICAvLyBTYW5pdHkgY2hlY2tzLgorICBpZiAoZGF0YV9zaXplIDwgQ0hVTktfSEVBREVSX1NJWkUpIHJldHVybiBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEE7CisgIGNodW5rX3NpemUgPSBHZXRMRTMyKGRhdGEgKyBUQUdfU0laRSk7CisKKyAgeworICAgIGNvbnN0IHNpemVfdCBjaHVua19kaXNrX3NpemUgPSBTaXplV2l0aFBhZGRpbmcoY2h1bmtfc2l6ZSk7CisgICAgaWYgKGNodW5rX2Rpc2tfc2l6ZSA+IHJpZmZfc2l6ZSkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICAgIGlmIChjaHVua19kaXNrX3NpemUgPiBkYXRhX3NpemUpIHJldHVybiBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEE7CisgIH0KKworICAvLyBEYXRhIGFzc2lnbm1lbnQuCisgIGNodW5rX2RhdGEuYnl0ZXMgPSBkYXRhICsgQ0hVTktfSEVBREVSX1NJWkU7CisgIGNodW5rX2RhdGEuc2l6ZSA9IGNodW5rX3NpemU7CisgIHJldHVybiBDaHVua0Fzc2lnbkRhdGEoY2h1bmssICZjaHVua19kYXRhLCBjb3B5X2RhdGEsIEdldExFMzIoZGF0YSArIDApKTsKK30KKworaW50IE11eEltYWdlRmluYWxpemUoV2ViUE11eEltYWdlKiBjb25zdCB3cGkpIHsKKyAgY29uc3QgV2ViUENodW5rKiBjb25zdCBpbWcgPSB3cGktPmltZ187CisgIGNvbnN0IFdlYlBEYXRhKiBjb25zdCBpbWFnZSA9ICZpbWctPmRhdGFfOworICBjb25zdCBpbnQgaXNfbG9zc2xlc3MgPSAoaW1nLT50YWdfID09IGtDaHVua3NbSURYX1ZQOExdLnRhZyk7CisgIGludCB3LCBoOworICBpbnQgdnA4bF9oYXNfYWxwaGEgPSAwOworICBjb25zdCBpbnQgb2sgPSBpc19sb3NzbGVzcyA/CisgICAgICBWUDhMR2V0SW5mbyhpbWFnZS0+Ynl0ZXMsIGltYWdlLT5zaXplLCAmdywgJmgsICZ2cDhsX2hhc19hbHBoYSkgOgorICAgICAgVlA4R2V0SW5mbyhpbWFnZS0+Ynl0ZXMsIGltYWdlLT5zaXplLCBpbWFnZS0+c2l6ZSwgJncsICZoKTsKKyAgYXNzZXJ0KGltZyAhPSBOVUxMKTsKKyAgaWYgKG9rKSB7CisgICAgLy8gSWdub3JlIEFMUEggY2h1bmsgYWNjb21wYW55aW5nIFZQOEwuCisgICAgaWYgKGlzX2xvc3NsZXNzICYmICh3cGktPmFscGhhXyAhPSBOVUxMKSkgeworICAgICAgQ2h1bmtEZWxldGUod3BpLT5hbHBoYV8pOworICAgICAgd3BpLT5hbHBoYV8gPSBOVUxMOworICAgIH0KKyAgICB3cGktPndpZHRoXyA9IHc7CisgICAgd3BpLT5oZWlnaHRfID0gaDsKKyAgICB3cGktPmhhc19hbHBoYV8gPSB2cDhsX2hhc19hbHBoYSB8fCAod3BpLT5hbHBoYV8gIT0gTlVMTCk7CisgIH0KKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgaW50IE11eEltYWdlUGFyc2UoY29uc3QgV2ViUENodW5rKiBjb25zdCBjaHVuaywgaW50IGNvcHlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSkgeworICBjb25zdCB1aW50OF90KiBieXRlcyA9IGNodW5rLT5kYXRhXy5ieXRlczsKKyAgc2l6ZV90IHNpemUgPSBjaHVuay0+ZGF0YV8uc2l6ZTsKKyAgY29uc3QgdWludDhfdCogY29uc3QgbGFzdCA9IGJ5dGVzICsgc2l6ZTsKKyAgV2ViUENodW5rIHN1YmNodW5rOworICBzaXplX3Qgc3ViY2h1bmtfc2l6ZTsKKyAgQ2h1bmtJbml0KCZzdWJjaHVuayk7CisKKyAgYXNzZXJ0KGNodW5rLT50YWdfID09IGtDaHVua3NbSURYX0FOTUZdLnRhZyk7CisgIGFzc2VydCghd3BpLT5pc19wYXJ0aWFsXyk7CisKKyAgLy8gQU5NRi4KKyAgeworICAgIGNvbnN0IHNpemVfdCBoZHJfc2l6ZSA9IEFOTUZfQ0hVTktfU0laRTsKKyAgICBjb25zdCBXZWJQRGF0YSB0ZW1wID0geyBieXRlcywgaGRyX3NpemUgfTsKKyAgICAvLyBFYWNoIG9mIEFOTUYgY2h1bmsgY29udGFpbiBhIGhlYWRlciBhdCB0aGUgYmVnaW5uaW5nLiBTbywgaXRzIHNpemUgc2hvdWxkCisgICAgLy8gYmUgYXQgbGVhc3QgJ2hkcl9zaXplJy4KKyAgICBpZiAoc2l6ZSA8IGhkcl9zaXplKSBnb3RvIEZhaWw7CisgICAgQ2h1bmtBc3NpZ25EYXRhKCZzdWJjaHVuaywgJnRlbXAsIGNvcHlfZGF0YSwgY2h1bmstPnRhZ18pOworICB9CisgIENodW5rU2V0TnRoKCZzdWJjaHVuaywgJndwaS0+aGVhZGVyXywgMSk7CisgIHdwaS0+aXNfcGFydGlhbF8gPSAxOyAgLy8gV2FpdGluZyBmb3IgQUxQSCBhbmQvb3IgVlA4L1ZQOEwgY2h1bmtzLgorCisgIC8vIFJlc3Qgb2YgdGhlIGNodW5rcy4KKyAgc3ViY2h1bmtfc2l6ZSA9IENodW5rRGlza1NpemUoJnN1YmNodW5rKSAtIENIVU5LX0hFQURFUl9TSVpFOworICBieXRlcyArPSBzdWJjaHVua19zaXplOworICBzaXplIC09IHN1YmNodW5rX3NpemU7CisKKyAgd2hpbGUgKGJ5dGVzICE9IGxhc3QpIHsKKyAgICBDaHVua0luaXQoJnN1YmNodW5rKTsKKyAgICBpZiAoQ2h1bmtWZXJpZnlBbmRBc3NpZ24oJnN1YmNodW5rLCBieXRlcywgc2l6ZSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weV9kYXRhKSAhPSBXRUJQX01VWF9PSykgeworICAgICAgZ290byBGYWlsOworICAgIH0KKyAgICBzd2l0Y2ggKENodW5rR2V0SWRGcm9tVGFnKHN1YmNodW5rLnRhZ18pKSB7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfQUxQSEE6CisgICAgICAgIGlmICh3cGktPmFscGhhXyAhPSBOVUxMKSBnb3RvIEZhaWw7ICAvLyBDb25zZWN1dGl2ZSBBTFBIIGNodW5rcy4KKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZzdWJjaHVuaywgJndwaS0+YWxwaGFfLCAxKSAhPSBXRUJQX01VWF9PSykgZ290byBGYWlsOworICAgICAgICB3cGktPmlzX3BhcnRpYWxfID0gMTsgIC8vIFdhaXRpbmcgZm9yIGEgVlA4IGNodW5rLgorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV0VCUF9DSFVOS19JTUFHRToKKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZzdWJjaHVuaywgJndwaS0+aW1nXywgMSkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRmFpbDsKKyAgICAgICAgaWYgKCFNdXhJbWFnZUZpbmFsaXplKHdwaSkpIGdvdG8gRmFpbDsKKyAgICAgICAgd3BpLT5pc19wYXJ0aWFsXyA9IDA7ICAvLyB3cGkgaXMgY29tcGxldGVseSBmaWxsZWQuCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXRUJQX0NIVU5LX1VOS05PV046CisgICAgICAgIGlmICh3cGktPmlzX3BhcnRpYWxfKSBnb3RvIEZhaWw7ICAvLyBFbmNvdW50ZXJlZCBhbiB1bmtub3duIGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgc29tZSBpbWFnZSBjaHVua3MuCisgICAgICAgIGlmIChDaHVua1NldE50aCgmc3ViY2h1bmssICZ3cGktPnVua25vd25fLCAwKSAhPSBXRUJQX01VWF9PSykgZ290byBGYWlsOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGdvdG8gRmFpbDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHN1YmNodW5rX3NpemUgPSBDaHVua0Rpc2tTaXplKCZzdWJjaHVuayk7CisgICAgYnl0ZXMgKz0gc3ViY2h1bmtfc2l6ZTsKKyAgICBzaXplIC09IHN1YmNodW5rX3NpemU7CisgIH0KKyAgaWYgKHdwaS0+aXNfcGFydGlhbF8pIGdvdG8gRmFpbDsKKyAgcmV0dXJuIDE7CisKKyBGYWlsOgorICBDaHVua1JlbGVhc2UoJnN1YmNodW5rKTsKKyAgcmV0dXJuIDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDcmVhdGUgYSBtdXggb2JqZWN0IGZyb20gV2ViUC1SSUZGIGRhdGEuCisKK1dlYlBNdXgqIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChjb25zdCBXZWJQRGF0YSogYml0c3RyZWFtLCBpbnQgY29weV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJzaW9uKSB7CisgIHNpemVfdCByaWZmX3NpemU7CisgIHVpbnQzMl90IHRhZzsKKyAgY29uc3QgdWludDhfdCogZW5kOworICBXZWJQTXV4KiBtdXggPSBOVUxMOworICBXZWJQTXV4SW1hZ2UqIHdwaSA9IE5VTEw7CisgIGNvbnN0IHVpbnQ4X3QqIGRhdGE7CisgIHNpemVfdCBzaXplOworICBXZWJQQ2h1bmsgY2h1bms7CisgIENodW5rSW5pdCgmY2h1bmspOworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGlmIChXRUJQX0FCSV9JU19JTkNPTVBBVElCTEUodmVyc2lvbiwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pKSB7CisgICAgcmV0dXJuIE5VTEw7ICAvLyB2ZXJzaW9uIG1pc21hdGNoCisgIH0KKyAgaWYgKGJpdHN0cmVhbSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKworICBkYXRhID0gYml0c3RyZWFtLT5ieXRlczsKKyAgc2l6ZSA9IGJpdHN0cmVhbS0+c2l6ZTsKKworICBpZiAoZGF0YSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKKyAgaWYgKHNpemUgPCBSSUZGX0hFQURFUl9TSVpFKSByZXR1cm4gTlVMTDsKKyAgaWYgKEdldExFMzIoZGF0YSArIDApICE9IE1LRk9VUkNDKCdSJywgJ0knLCAnRicsICdGJykgfHwKKyAgICAgIEdldExFMzIoZGF0YSArIENIVU5LX0hFQURFUl9TSVpFKSAhPSBNS0ZPVVJDQygnVycsICdFJywgJ0InLCAnUCcpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBtdXggPSBXZWJQTXV4TmV3KCk7CisgIGlmIChtdXggPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisKKyAgaWYgKHNpemUgPCBSSUZGX0hFQURFUl9TSVpFICsgVEFHX1NJWkUpIGdvdG8gRXJyOworCisgIHRhZyA9IEdldExFMzIoZGF0YSArIFJJRkZfSEVBREVSX1NJWkUpOworICBpZiAodGFnICE9IGtDaHVua3NbSURYX1ZQOF0udGFnICYmCisgICAgICB0YWcgIT0ga0NodW5rc1tJRFhfVlA4TF0udGFnICYmCisgICAgICB0YWcgIT0ga0NodW5rc1tJRFhfVlA4WF0udGFnKSB7CisgICAgZ290byBFcnI7ICAvLyBGaXJzdCBjaHVuayBzaG91bGQgYmUgVlA4LCBWUDhMIG9yIFZQOFguCisgIH0KKworICByaWZmX3NpemUgPSBTaXplV2l0aFBhZGRpbmcoR2V0TEUzMihkYXRhICsgVEFHX1NJWkUpKTsKKyAgaWYgKHJpZmZfc2l6ZSA+IE1BWF9DSFVOS19QQVlMT0FEIHx8IHJpZmZfc2l6ZSA+IHNpemUpIHsKKyAgICBnb3RvIEVycjsKKyAgfSBlbHNlIHsKKyAgICBpZiAocmlmZl9zaXplIDwgc2l6ZSkgeyAgLy8gUmVkdW5kYW50IGRhdGEgYWZ0ZXIgbGFzdCBjaHVuay4KKyAgICAgIHNpemUgPSByaWZmX3NpemU7ICAvLyBUbyBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVhZCBhbnkgZGF0YSBiZXlvbmQgbXV4X3NpemUuCisgICAgfQorICB9CisKKyAgZW5kID0gZGF0YSArIHNpemU7CisgIGRhdGEgKz0gUklGRl9IRUFERVJfU0laRTsKKyAgc2l6ZSAtPSBSSUZGX0hFQURFUl9TSVpFOworCisgIHdwaSA9IChXZWJQTXV4SW1hZ2UqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIHNpemVvZigqd3BpKSk7CisgIGlmICh3cGkgPT0gTlVMTCkgZ290byBFcnI7CisgIE11eEltYWdlSW5pdCh3cGkpOworCisgIC8vIExvb3Agb3ZlciBjaHVua3MuCisgIHdoaWxlIChkYXRhICE9IGVuZCkgeworICAgIHNpemVfdCBkYXRhX3NpemU7CisgICAgV2ViUENodW5rSWQgaWQ7CisgICAgV2ViUENodW5rKiogY2h1bmtfbGlzdDsKKyAgICBpZiAoQ2h1bmtWZXJpZnlBbmRBc3NpZ24oJmNodW5rLCBkYXRhLCBzaXplLCByaWZmX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcHlfZGF0YSkgIT0gV0VCUF9NVVhfT0spIHsKKyAgICAgIGdvdG8gRXJyOworICAgIH0KKyAgICBkYXRhX3NpemUgPSBDaHVua0Rpc2tTaXplKCZjaHVuayk7CisgICAgaWQgPSBDaHVua0dldElkRnJvbVRhZyhjaHVuay50YWdfKTsKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfQUxQSEE6CisgICAgICAgIGlmICh3cGktPmFscGhhXyAhPSBOVUxMKSBnb3RvIEVycjsgIC8vIENvbnNlY3V0aXZlIEFMUEggY2h1bmtzLgorICAgICAgICBpZiAoQ2h1bmtTZXROdGgoJmNodW5rLCAmd3BpLT5hbHBoYV8sIDEpICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgICAgICAgd3BpLT5pc19wYXJ0aWFsXyA9IDE7ICAvLyBXYWl0aW5nIGZvciBhIFZQOCBjaHVuay4KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdFQlBfQ0hVTktfSU1BR0U6CisgICAgICAgIGlmIChDaHVua1NldE50aCgmY2h1bmssICZ3cGktPmltZ18sIDEpICE9IFdFQlBfTVVYX09LKSBnb3RvIEVycjsKKyAgICAgICAgaWYgKCFNdXhJbWFnZUZpbmFsaXplKHdwaSkpIGdvdG8gRXJyOworICAgICAgICB3cGktPmlzX3BhcnRpYWxfID0gMDsgIC8vIHdwaSBpcyBjb21wbGV0ZWx5IGZpbGxlZC4KKyBQdXNoSW1hZ2U6CisgICAgICAgIC8vIEFkZCB0aGlzIHRvIG11eC0+aW1hZ2VzXyBsaXN0LgorICAgICAgICBpZiAoTXV4SW1hZ2VQdXNoKHdwaSwgJm11eC0+aW1hZ2VzXykgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICAgICAgICBNdXhJbWFnZUluaXQod3BpKTsgIC8vIFJlc2V0IGZvciByZWFkaW5nIG5leHQgaW1hZ2UuCisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXRUJQX0NIVU5LX0FOTUY6CisgICAgICAgIGlmICh3cGktPmlzX3BhcnRpYWxfKSBnb3RvIEVycjsgIC8vIFByZXZpb3VzIHdwaSBpcyBzdGlsbCBpbmNvbXBsZXRlLgorICAgICAgICBpZiAoIU11eEltYWdlUGFyc2UoJmNodW5rLCBjb3B5X2RhdGEsIHdwaSkpIGdvdG8gRXJyOworICAgICAgICBDaHVua1JlbGVhc2UoJmNodW5rKTsKKyAgICAgICAgZ290byBQdXNoSW1hZ2U7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDogIC8vIEEgbm9uLWltYWdlIGNodW5rLgorICAgICAgICBpZiAod3BpLT5pc19wYXJ0aWFsXykgZ290byBFcnI7ICAvLyBFbmNvdW50ZXJlZCBhIG5vbi1pbWFnZSBjaHVuayBiZWZvcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0dGluZyBhbGwgY2h1bmtzIG9mIGFuIGltYWdlLgorICAgICAgICBjaHVua19saXN0ID0gTXV4R2V0Q2h1bmtMaXN0RnJvbUlkKG11eCwgaWQpOyAgLy8gTGlzdCB0byBhZGQgdGhpcyBjaHVuay4KKyAgICAgICAgaWYgKENodW5rU2V0TnRoKCZjaHVuaywgY2h1bmtfbGlzdCwgMCkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworICAgICAgICBpZiAoaWQgPT0gV0VCUF9DSFVOS19WUDhYKSB7ICAvLyBncmFiIGdsb2JhbCBzcGVjcworICAgICAgICAgIG11eC0+Y2FudmFzX3dpZHRoXyA9IEdldExFMjQoZGF0YSArIDEyKSArIDE7CisgICAgICAgICAgbXV4LT5jYW52YXNfaGVpZ2h0XyA9IEdldExFMjQoZGF0YSArIDE1KSArIDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRhdGEgKz0gZGF0YV9zaXplOworICAgIHNpemUgLT0gZGF0YV9zaXplOworICAgIENodW5rSW5pdCgmY2h1bmspOworICB9CisKKyAgLy8gSW5jb21wbGV0ZSBpbWFnZS4KKyAgaWYgKHdwaS0+aXNfcGFydGlhbF8pIGdvdG8gRXJyOworCisgIC8vIFZhbGlkYXRlIG11eCBpZiBjb21wbGV0ZS4KKyAgaWYgKE11eFZhbGlkYXRlKG11eCkgIT0gV0VCUF9NVVhfT0spIGdvdG8gRXJyOworCisgIE11eEltYWdlRGVsZXRlKHdwaSk7CisgIHJldHVybiBtdXg7ICAvLyBBbGwgT0s7CisKKyBFcnI6ICAvLyBTb21ldGhpbmcgYmFkIGhhcHBlbmVkLgorICBDaHVua1JlbGVhc2UoJmNodW5rKTsKKyAgTXV4SW1hZ2VEZWxldGUod3BpKTsKKyAgV2ViUE11eERlbGV0ZShtdXgpOworICByZXR1cm4gTlVMTDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEdldCBBUEkocykuCisKKy8vIFZhbGlkYXRlcyB0aGF0IHRoZSBnaXZlbiBtdXggaGFzIGEgc2luZ2xlIGltYWdlLgorc3RhdGljIFdlYlBNdXhFcnJvciBWYWxpZGF0ZUZvclNpbmdsZUltYWdlKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCkgeworICBjb25zdCBpbnQgbnVtX2ltYWdlcyA9IE11eEltYWdlQ291bnQobXV4LT5pbWFnZXNfLCBXRUJQX0NIVU5LX0lNQUdFKTsKKyAgY29uc3QgaW50IG51bV9mcmFtZXMgPSBNdXhJbWFnZUNvdW50KG11eC0+aW1hZ2VzXywgV0VCUF9DSFVOS19BTk1GKTsKKworICBpZiAobnVtX2ltYWdlcyA9PSAwKSB7CisgICAgLy8gTm8gaW1hZ2VzIGluIG11eC4KKyAgICByZXR1cm4gV0VCUF9NVVhfTk9UX0ZPVU5EOworICB9IGVsc2UgaWYgKG51bV9pbWFnZXMgPT0gMSAmJiBudW1fZnJhbWVzID09IDApIHsKKyAgICAvLyBWYWxpZCBjYXNlIChzaW5nbGUgaW1hZ2UpLgorICAgIHJldHVybiBXRUJQX01VWF9PSzsKKyAgfSBlbHNlIHsKKyAgICAvLyBGcmFtZSBjYXNlIE9SIGFuIGludmFsaWQgbXV4LgorICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9Cit9CisKKy8vIEdldCB0aGUgY2FudmFzIHdpZHRoLCBoZWlnaHQgYW5kIGZsYWdzIGFmdGVyIHZhbGlkYXRpbmcgdGhhdCBWUDhYL1ZQOC9WUDhMCisvLyBjaHVuayBhbmQgY2FudmFzIHNpemUgYXJlIHZhbGlkLgorc3RhdGljIFdlYlBNdXhFcnJvciBNdXhHZXRDYW52YXNJbmZvKGNvbnN0IFdlYlBNdXgqIGNvbnN0IG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgdWludDMyX3QqIGZsYWdzKSB7CisgIGludCB3LCBoOworICB1aW50MzJfdCBmID0gMDsKKyAgV2ViUERhdGEgZGF0YTsKKyAgYXNzZXJ0KG11eCAhPSBOVUxMKTsKKworICAvLyBDaGVjayBpZiBWUDhYIGNodW5rIGlzIHByZXNlbnQuCisgIGlmIChNdXhHZXQobXV4LCBJRFhfVlA4WCwgMSwgJmRhdGEpID09IFdFQlBfTVVYX09LKSB7CisgICAgaWYgKGRhdGEuc2l6ZSA8IFZQOFhfQ0hVTktfU0laRSkgcmV0dXJuIFdFQlBfTVVYX0JBRF9EQVRBOworICAgIGYgPSBHZXRMRTMyKGRhdGEuYnl0ZXMgKyAwKTsKKyAgICB3ID0gR2V0TEUyNChkYXRhLmJ5dGVzICsgNCkgKyAxOworICAgIGggPSBHZXRMRTI0KGRhdGEuYnl0ZXMgKyA3KSArIDE7CisgIH0gZWxzZSB7CisgICAgY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGkgPSBtdXgtPmltYWdlc187CisgICAgLy8gR3JhYiB1c2VyLWZvcmNlZCBjYW52YXMgc2l6ZSBhcyBkZWZhdWx0LgorICAgIHcgPSBtdXgtPmNhbnZhc193aWR0aF87CisgICAgaCA9IG11eC0+Y2FudmFzX2hlaWdodF87CisgICAgaWYgKHcgPT0gMCAmJiBoID09IDAgJiYgVmFsaWRhdGVGb3JTaW5nbGVJbWFnZShtdXgpID09IFdFQlBfTVVYX09LKSB7CisgICAgICAvLyBzaW5nbGUgaW1hZ2UgYW5kIG5vdCBmb3JjZWQgY2FudmFzIHNpemUgPT4gdXNlIGRpbWVuc2lvbiBvZiBmaXJzdCBmcmFtZQorICAgICAgYXNzZXJ0KHdwaSAhPSBOVUxMKTsKKyAgICAgIHcgPSB3cGktPndpZHRoXzsKKyAgICAgIGggPSB3cGktPmhlaWdodF87CisgICAgfQorICAgIGlmICh3cGkgIT0gTlVMTCkgeworICAgICAgaWYgKHdwaS0+aGFzX2FscGhhXykgZiB8PSBBTFBIQV9GTEFHOworICAgIH0KKyAgfQorICBpZiAodyAqICh1aW50NjRfdCloID49IE1BWF9JTUFHRV9BUkVBKSByZXR1cm4gV0VCUF9NVVhfQkFEX0RBVEE7CisKKyAgaWYgKHdpZHRoICE9IE5VTEwpICp3aWR0aCA9IHc7CisgIGlmIChoZWlnaHQgIT0gTlVMTCkgKmhlaWdodCA9IGg7CisgIGlmIChmbGFncyAhPSBOVUxMKSAqZmxhZ3MgPSBmOworICByZXR1cm4gV0VCUF9NVVhfT0s7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4R2V0Q2FudmFzU2l6ZShjb25zdCBXZWJQTXV4KiBtdXgsIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIGlmIChtdXggPT0gTlVMTCB8fCB3aWR0aCA9PSBOVUxMIHx8IGhlaWdodCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKyAgcmV0dXJuIE11eEdldENhbnZhc0luZm8obXV4LCB3aWR0aCwgaGVpZ2h0LCBOVUxMKTsKK30KKworV2ViUE11eEVycm9yIFdlYlBNdXhHZXRGZWF0dXJlcyhjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90KiBmbGFncykgeworICBpZiAobXV4ID09IE5VTEwgfHwgZmxhZ3MgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIHJldHVybiBNdXhHZXRDYW52YXNJbmZvKG11eCwgTlVMTCwgTlVMTCwgZmxhZ3MpOworfQorCitzdGF0aWMgdWludDhfdCogRW1pdFZQOFhDaHVuayh1aW50OF90KiBjb25zdCBkc3QsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIHVpbnQzMl90IGZsYWdzKSB7CisgIGNvbnN0IHNpemVfdCB2cDh4X3NpemUgPSBDSFVOS19IRUFERVJfU0laRSArIFZQOFhfQ0hVTktfU0laRTsKKyAgYXNzZXJ0KHdpZHRoID49IDEgJiYgaGVpZ2h0ID49IDEpOworICBhc3NlcnQod2lkdGggPD0gTUFYX0NBTlZBU19TSVpFICYmIGhlaWdodCA8PSBNQVhfQ0FOVkFTX1NJWkUpOworICBhc3NlcnQod2lkdGggKiAodWludDY0X3QpaGVpZ2h0IDwgTUFYX0lNQUdFX0FSRUEpOworICBQdXRMRTMyKGRzdCwgTUtGT1VSQ0MoJ1YnLCAnUCcsICc4JywgJ1gnKSk7CisgIFB1dExFMzIoZHN0ICsgVEFHX1NJWkUsIFZQOFhfQ0hVTktfU0laRSk7CisgIFB1dExFMzIoZHN0ICsgQ0hVTktfSEVBREVSX1NJWkUsIGZsYWdzKTsKKyAgUHV0TEUyNChkc3QgKyBDSFVOS19IRUFERVJfU0laRSArIDQsIHdpZHRoIC0gMSk7CisgIFB1dExFMjQoZHN0ICsgQ0hVTktfSEVBREVSX1NJWkUgKyA3LCBoZWlnaHQgLSAxKTsKKyAgcmV0dXJuIGRzdCArIHZwOHhfc2l6ZTsKK30KKworLy8gQXNzZW1ibGUgYSBzaW5nbGUgaW1hZ2UgV2ViUCBiaXRzdHJlYW0gZnJvbSAnd3BpJy4KK3N0YXRpYyBXZWJQTXV4RXJyb3IgU3ludGhlc2l6ZUJpdHN0cmVhbShjb25zdCBXZWJQTXV4SW1hZ2UqIGNvbnN0IHdwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogY29uc3QgYml0c3RyZWFtKSB7CisgIHVpbnQ4X3QqIGRzdDsKKworICAvLyBBbGxvY2F0ZSBkYXRhLgorICBjb25zdCBpbnQgbmVlZF92cDh4ID0gKHdwaS0+YWxwaGFfICE9IE5VTEwpOworICBjb25zdCBzaXplX3QgdnA4eF9zaXplID0gbmVlZF92cDh4ID8gQ0hVTktfSEVBREVSX1NJWkUgKyBWUDhYX0NIVU5LX1NJWkUgOiAwOworICBjb25zdCBzaXplX3QgYWxwaGFfc2l6ZSA9IG5lZWRfdnA4eCA/IENodW5rRGlza1NpemUod3BpLT5hbHBoYV8pIDogMDsKKyAgLy8gTm90ZTogTm8gbmVlZCB0byBvdXRwdXQgQU5NRiBjaHVuayBmb3IgYSBzaW5nbGUgaW1hZ2UuCisgIGNvbnN0IHNpemVfdCBzaXplID0gUklGRl9IRUFERVJfU0laRSArIHZwOHhfc2l6ZSArIGFscGhhX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgIENodW5rRGlza1NpemUod3BpLT5pbWdfKTsKKyAgdWludDhfdCogY29uc3QgZGF0YSA9ICh1aW50OF90KilXZWJQU2FmZU1hbGxvYygxVUxMLCBzaXplKTsKKyAgaWYgKGRhdGEgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX01FTU9SWV9FUlJPUjsKKworICAvLyBNYWluIFJJRkYgaGVhZGVyLgorICBkc3QgPSBNdXhFbWl0UmlmZkhlYWRlcihkYXRhLCBzaXplKTsKKworICBpZiAobmVlZF92cDh4KSB7CisgICAgZHN0ID0gRW1pdFZQOFhDaHVuayhkc3QsIHdwaS0+d2lkdGhfLCB3cGktPmhlaWdodF8sIEFMUEhBX0ZMQUcpOyAgLy8gVlA4WC4KKyAgICBkc3QgPSBDaHVua0xpc3RFbWl0KHdwaS0+YWxwaGFfLCBkc3QpOyAgICAgICAvLyBBTFBILgorICB9CisKKyAgLy8gQml0c3RyZWFtLgorICBkc3QgPSBDaHVua0xpc3RFbWl0KHdwaS0+aW1nXywgZHN0KTsKKyAgYXNzZXJ0KGRzdCA9PSBkYXRhICsgc2l6ZSk7CisKKyAgLy8gT3V0cHV0LgorICBiaXRzdHJlYW0tPmJ5dGVzID0gZGF0YTsKKyAgYml0c3RyZWFtLT5zaXplID0gc2l6ZTsKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEdldENodW5rKGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBjaHVua19kYXRhKSB7CisgIENIVU5LX0lOREVYIGlkeDsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IGZvdXJjYyA9PSBOVUxMIHx8IGNodW5rX2RhdGEgPT0gTlVMTCkgeworICAgIHJldHVybiBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UOworICB9CisgIGlkeCA9IENodW5rR2V0SW5kZXhGcm9tRm91ckNDKGZvdXJjYyk7CisgIGlmIChJc1dQSShrQ2h1bmtzW2lkeF0uaWQpKSB7ICAgICAvLyBBbiBpbWFnZSBjaHVuay4KKyAgICByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKyAgfSBlbHNlIGlmIChpZHggIT0gSURYX1VOS05PV04pIHsgIC8vIEEga25vd24gY2h1bmsgdHlwZS4KKyAgICByZXR1cm4gTXV4R2V0KG11eCwgaWR4LCAxLCBjaHVua19kYXRhKTsKKyAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFuIHVua25vd24gY2h1bmsgdHlwZS4KKyAgICBjb25zdCBXZWJQQ2h1bmsqIGNvbnN0IGNodW5rID0KKyAgICAgICAgQ2h1bmtTZWFyY2hMaXN0KG11eC0+dW5rbm93bl8sIDEsIENodW5rR2V0VGFnRnJvbUZvdXJDQyhmb3VyY2MpKTsKKyAgICBpZiAoY2h1bmsgPT0gTlVMTCkgcmV0dXJuIFdFQlBfTVVYX05PVF9GT1VORDsKKyAgICAqY2h1bmtfZGF0YSA9IGNodW5rLT5kYXRhXzsKKyAgICByZXR1cm4gV0VCUF9NVVhfT0s7CisgIH0KK30KKworc3RhdGljIFdlYlBNdXhFcnJvciBNdXhHZXRJbWFnZUludGVybmFsKGNvbnN0IFdlYlBNdXhJbWFnZSogY29uc3Qgd3BpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBNdXhGcmFtZUluZm8qIGNvbnN0IGluZm8pIHsKKyAgLy8gU2V0IHNvbWUgZGVmYXVsdHMgZm9yIHVucmVsYXRlZCBmaWVsZHMuCisgIGluZm8tPnhfb2Zmc2V0ID0gMDsKKyAgaW5mby0+eV9vZmZzZXQgPSAwOworICBpbmZvLT5kdXJhdGlvbiA9IDE7CisgIGluZm8tPmRpc3Bvc2VfbWV0aG9kID0gV0VCUF9NVVhfRElTUE9TRV9OT05FOworICBpbmZvLT5ibGVuZF9tZXRob2QgPSBXRUJQX01VWF9CTEVORDsKKyAgLy8gRXh0cmFjdCBkYXRhIGZvciByZWxhdGVkIGZpZWxkcy4KKyAgaW5mby0+aWQgPSBDaHVua0dldElkRnJvbVRhZyh3cGktPmltZ18tPnRhZ18pOworICByZXR1cm4gU3ludGhlc2l6ZUJpdHN0cmVhbSh3cGksICZpbmZvLT5iaXRzdHJlYW0pOworfQorCitzdGF0aWMgV2ViUE11eEVycm9yIE11eEdldEZyYW1lSW50ZXJuYWwoY29uc3QgV2ViUE11eEltYWdlKiBjb25zdCB3cGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUE11eEZyYW1lSW5mbyogY29uc3QgZnJhbWUpIHsKKyAgY29uc3QgaW50IGlzX2ZyYW1lID0gKHdwaS0+aGVhZGVyXy0+dGFnXyA9PSBrQ2h1bmtzW0lEWF9BTk1GXS50YWcpOworICBjb25zdCBXZWJQRGF0YSogZnJhbWVfZGF0YTsKKyAgaWYgKCFpc19mcmFtZSkgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIGFzc2VydCh3cGktPmhlYWRlcl8gIT0gTlVMTCk7ICAvLyBBbHJlYWR5IGNoZWNrZWQgYnkgV2ViUE11eEdldEZyYW1lKCkuCisgIC8vIEdldCBmcmFtZSBjaHVuay4KKyAgZnJhbWVfZGF0YSA9ICZ3cGktPmhlYWRlcl8tPmRhdGFfOworICBpZiAoZnJhbWVfZGF0YS0+c2l6ZSA8IGtDaHVua3NbSURYX0FOTUZdLnNpemUpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgLy8gRXh0cmFjdCBpbmZvLgorICBmcmFtZS0+eF9vZmZzZXQgPSAyICogR2V0TEUyNChmcmFtZV9kYXRhLT5ieXRlcyArIDApOworICBmcmFtZS0+eV9vZmZzZXQgPSAyICogR2V0TEUyNChmcmFtZV9kYXRhLT5ieXRlcyArIDMpOworICB7CisgICAgY29uc3QgdWludDhfdCBiaXRzID0gZnJhbWVfZGF0YS0+Ynl0ZXNbMTVdOworICAgIGZyYW1lLT5kdXJhdGlvbiA9IEdldExFMjQoZnJhbWVfZGF0YS0+Ynl0ZXMgKyAxMik7CisgICAgZnJhbWUtPmRpc3Bvc2VfbWV0aG9kID0KKyAgICAgICAgKGJpdHMgJiAxKSA/IFdFQlBfTVVYX0RJU1BPU0VfQkFDS0dST1VORCA6IFdFQlBfTVVYX0RJU1BPU0VfTk9ORTsKKyAgICBmcmFtZS0+YmxlbmRfbWV0aG9kID0gKGJpdHMgJiAyKSA/IFdFQlBfTVVYX05PX0JMRU5EIDogV0VCUF9NVVhfQkxFTkQ7CisgIH0KKyAgZnJhbWUtPmlkID0gQ2h1bmtHZXRJZEZyb21UYWcod3BpLT5oZWFkZXJfLT50YWdfKTsKKyAgcmV0dXJuIFN5bnRoZXNpemVCaXRzdHJlYW0od3BpLCAmZnJhbWUtPmJpdHN0cmVhbSk7Cit9CisKK1dlYlBNdXhFcnJvciBXZWJQTXV4R2V0RnJhbWUoCisgICAgY29uc3QgV2ViUE11eCogbXV4LCB1aW50MzJfdCBudGgsIFdlYlBNdXhGcmFtZUluZm8qIGZyYW1lKSB7CisgIFdlYlBNdXhFcnJvciBlcnI7CisgIFdlYlBNdXhJbWFnZSogd3BpOworCisgIC8vIFNhbml0eSBjaGVja3MuCisgIGlmIChtdXggPT0gTlVMTCB8fCBmcmFtZSA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICAvLyBHZXQgdGhlIG50aCBXZWJQTXV4SW1hZ2UuCisgIGVyciA9IE11eEltYWdlR2V0TnRoKChjb25zdCBXZWJQTXV4SW1hZ2UqKikmbXV4LT5pbWFnZXNfLCBudGgsICZ3cGkpOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworCisgIC8vIEdldCBmcmFtZSBpbmZvLgorICBpZiAod3BpLT5oZWFkZXJfID09IE5VTEwpIHsKKyAgICByZXR1cm4gTXV4R2V0SW1hZ2VJbnRlcm5hbCh3cGksIGZyYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTXV4R2V0RnJhbWVJbnRlcm5hbCh3cGksIGZyYW1lKTsKKyAgfQorfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcyhjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKSB7CisgIFdlYlBEYXRhIGFuaW07CisgIFdlYlBNdXhFcnJvciBlcnI7CisKKyAgaWYgKG11eCA9PSBOVUxMIHx8IHBhcmFtcyA9PSBOVUxMKSByZXR1cm4gV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVDsKKworICBlcnIgPSBNdXhHZXQobXV4LCBJRFhfQU5JTSwgMSwgJmFuaW0pOworICBpZiAoZXJyICE9IFdFQlBfTVVYX09LKSByZXR1cm4gZXJyOworICBpZiAoYW5pbS5zaXplIDwga0NodW5rc1tXRUJQX0NIVU5LX0FOSU1dLnNpemUpIHJldHVybiBXRUJQX01VWF9CQURfREFUQTsKKyAgcGFyYW1zLT5iZ2NvbG9yID0gR2V0TEUzMihhbmltLmJ5dGVzKTsKKyAgcGFyYW1zLT5sb29wX2NvdW50ID0gR2V0TEUxNihhbmltLmJ5dGVzICsgNCk7CisKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLyBHZXQgY2h1bmsgaW5kZXggZnJvbSBjaHVuayBpZC4gUmV0dXJucyBJRFhfTklMIGlmIG5vdCBmb3VuZC4KK3N0YXRpYyBDSFVOS19JTkRFWCBDaHVua0dldEluZGV4RnJvbUlkKFdlYlBDaHVua0lkIGlkKSB7CisgIGludCBpOworICBmb3IgKGkgPSAwOyBrQ2h1bmtzW2ldLmlkICE9IFdFQlBfQ0hVTktfTklMOyArK2kpIHsKKyAgICBpZiAoaWQgPT0ga0NodW5rc1tpXS5pZCkgcmV0dXJuIChDSFVOS19JTkRFWClpOworICB9CisgIHJldHVybiBJRFhfTklMOworfQorCisvLyBDb3VudCBudW1iZXIgb2YgY2h1bmtzIG1hdGNoaW5nICd0YWcnIGluIHRoZSAnY2h1bmtfbGlzdCcuCisvLyBJZiB0YWcgPT0gTklMX1RBRywgYW55IHRhZyB3aWxsIGJlIG1hdGNoZWQuCitzdGF0aWMgaW50IENvdW50Q2h1bmtzKGNvbnN0IFdlYlBDaHVuayogY29uc3QgY2h1bmtfbGlzdCwgdWludDMyX3QgdGFnKSB7CisgIGludCBjb3VudCA9IDA7CisgIGNvbnN0IFdlYlBDaHVuayogY3VycmVudDsKKyAgZm9yIChjdXJyZW50ID0gY2h1bmtfbGlzdDsgY3VycmVudCAhPSBOVUxMOyBjdXJyZW50ID0gY3VycmVudC0+bmV4dF8pIHsKKyAgICBpZiAodGFnID09IE5JTF9UQUcgfHwgY3VycmVudC0+dGFnXyA9PSB0YWcpIHsKKyAgICAgIGNvdW50Kys7ICAvLyBDb3VudCBjaHVua3Mgd2hvc2UgdGFncyBtYXRjaC4KKyAgICB9CisgIH0KKyAgcmV0dXJuIGNvdW50OworfQorCitXZWJQTXV4RXJyb3IgV2ViUE11eE51bUNodW5rcyhjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJZCBpZCwgaW50KiBudW1fZWxlbWVudHMpIHsKKyAgaWYgKG11eCA9PSBOVUxMIHx8IG51bV9lbGVtZW50cyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQ7CisgIH0KKworICBpZiAoSXNXUEkoaWQpKSB7CisgICAgKm51bV9lbGVtZW50cyA9IE11eEltYWdlQ291bnQobXV4LT5pbWFnZXNfLCBpZCk7CisgIH0gZWxzZSB7CisgICAgV2ViUENodW5rKiBjb25zdCogY2h1bmtfbGlzdCA9IE11eEdldENodW5rTGlzdEZyb21JZChtdXgsIGlkKTsKKyAgICBjb25zdCBDSFVOS19JTkRFWCBpZHggPSBDaHVua0dldEluZGV4RnJvbUlkKGlkKTsKKyAgICAqbnVtX2VsZW1lbnRzID0gQ291bnRDaHVua3MoKmNodW5rX2xpc3QsIGtDaHVua3NbaWR4XS50YWcpOworICB9CisKKyAgcmV0dXJuIFdFQlBfTVVYX09LOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYjBmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw1MSBAQAorQU1fQ1BQRkxBR1MgKz0gLUkkKHRvcF9idWlsZGRpcikgLUkkKHRvcF9zcmNkaXIpCitub2luc3RfTFRMSUJSQVJJRVMgPSBsaWJ3ZWJwdXRpbHMubGEKKworaWYgQlVJTERfTElCV0VCUERFQ09ERVIKKyAgbm9pbnN0X0xUTElCUkFSSUVTICs9IGxpYndlYnB1dGlsc2RlY29kZS5sYQorZW5kaWYKKworY29tbW9uX0hFQURFUlMgPSAuLi93ZWJwL3R5cGVzLmgKK2NvbW1vbmRpciA9ICQoaW5jbHVkZWRpcikvd2VicAorCitub2luc3RfSEVBREVSUyA9Citub2luc3RfSEVBREVSUyArPSAuLi9kc3AvZHNwLmgKK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZGVjb2RlLmgKK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZW5jb2RlLmgKK25vaW5zdF9IRUFERVJTICs9IC4uL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oCisKK0NPTU1PTl9TT1VSQ0VTID0KK0NPTU1PTl9TT1VSQ0VTICs9IGJpdF9yZWFkZXJfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gYml0X3JlYWRlcl91dGlscy5oCitDT01NT05fU09VUkNFUyArPSBiaXRfcmVhZGVyX2lubF91dGlscy5oCitDT01NT05fU09VUkNFUyArPSBjb2xvcl9jYWNoZV91dGlscy5jCitDT01NT05fU09VUkNFUyArPSBjb2xvcl9jYWNoZV91dGlscy5oCitDT01NT05fU09VUkNFUyArPSBlbmRpYW5faW5sX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IGZpbHRlcnNfdXRpbHMuYworQ09NTU9OX1NPVVJDRVMgKz0gZmlsdGVyc191dGlscy5oCitDT01NT05fU09VUkNFUyArPSBodWZmbWFuX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IGh1ZmZtYW5fdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gcXVhbnRfbGV2ZWxzX2RlY191dGlscy5jCitDT01NT05fU09VUkNFUyArPSBxdWFudF9sZXZlbHNfZGVjX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHJlc2NhbGVyX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHJlc2NhbGVyX3V0aWxzLmgKK0NPTU1PTl9TT1VSQ0VTICs9IHJhbmRvbV91dGlscy5jCitDT01NT05fU09VUkNFUyArPSByYW5kb21fdXRpbHMuaAorQ09NTU9OX1NPVVJDRVMgKz0gdGhyZWFkX3V0aWxzLmMKK0NPTU1PTl9TT1VSQ0VTICs9IHRocmVhZF91dGlscy5oCitDT01NT05fU09VUkNFUyArPSB1dGlscy5jCitDT01NT05fU09VUkNFUyArPSB1dGlscy5oCisKK0VOQ19TT1VSQ0VTID0KK0VOQ19TT1VSQ0VTICs9IGJpdF93cml0ZXJfdXRpbHMuYworRU5DX1NPVVJDRVMgKz0gYml0X3dyaXRlcl91dGlscy5oCitFTkNfU09VUkNFUyArPSBodWZmbWFuX2VuY29kZV91dGlscy5jCitFTkNfU09VUkNFUyArPSBodWZmbWFuX2VuY29kZV91dGlscy5oCitFTkNfU09VUkNFUyArPSBxdWFudF9sZXZlbHNfdXRpbHMuYworRU5DX1NPVVJDRVMgKz0gcXVhbnRfbGV2ZWxzX3V0aWxzLmgKKworbGlid2VicHV0aWxzX2xhX1NPVVJDRVMgPSAkKENPTU1PTl9TT1VSQ0VTKSAkKEVOQ19TT1VSQ0VTKQorCitpZiBCVUlMRF9MSUJXRUJQREVDT0RFUgorICBsaWJ3ZWJwdXRpbHNkZWNvZGVfbGFfU09VUkNFUyA9ICQoQ09NTU9OX1NPVVJDRVMpCitlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl9pbmxfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjUwYTNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfaW5sX3V0aWxzLmgKQEAgLTAsMCArMSwxOTIgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGVjaWZpYyBpbmxpbmVkIG1ldGhvZHMgZm9yIGJvb2xlYW4gZGVjb2RlciBbVlA4R2V0Qml0KCkgLi4uXQorLy8gVGhpcyBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCBieSB0aGUgLmMgc291cmNlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdG8gY2FsbAorLy8gdGhlc2UgbWV0aG9kcy4KKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfQklUX1JFQURFUl9JTkxfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19CSVRfUkVBREVSX0lOTF9VVElMU19IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RyaW5nLmg+ICAvLyBmb3IgbWVtY3B5CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZXJpdmVkIHR5cGUgbGJpdF90ID0gbmF0dXJhbCB0eXBlIGZvciBtZW1vcnkgSS9PCisKKyNpZiAgIChCSVRTID4gMzIpCit0eXBlZGVmIHVpbnQ2NF90IGxiaXRfdDsKKyNlbGlmIChCSVRTID4gMTYpCit0eXBlZGVmIHVpbnQzMl90IGxiaXRfdDsKKyNlbGlmIChCSVRTID4gIDgpCit0eXBlZGVmIHVpbnQxNl90IGxiaXRfdDsKKyNlbHNlCit0eXBlZGVmIHVpbnQ4X3QgbGJpdF90OworI2VuZGlmCisKK2V4dGVybiBjb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XTsKK2V4dGVybiBjb25zdCB1aW50OF90IGtWUDhOZXdSYW5nZVsxMjhdOworCisvLyBzcGVjaWFsIGNhc2UgZm9yIHRoZSB0YWlsIGJ5dGUtcmVhZGluZwordm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIElubGluZWQgY3JpdGljYWwgZnVuY3Rpb25zCisKKy8vIG1ha2VzIHN1cmUgYnItPnZhbHVlXyBoYXMgYXQgbGVhc3QgQklUUyBiaXRzIHdvcnRoIG9mIGRhdGEKK3N0YXRpYyBXRUJQX1VCU0FOX0lHTk9SRV9VTkRFRiBXRUJQX0lOTElORQordm9pZCBWUDhMb2FkTmV3Qnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgeworICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKKyAgLy8gUmVhZCAnQklUUycgYml0cyBhdCBhIHRpbWUgaWYgcG9zc2libGUuCisgIGlmIChici0+YnVmXyA8IGJyLT5idWZfbWF4XykgeworICAgIC8vIGNvbnZlcnQgbWVtb3J5IHR5cGUgdG8gcmVnaXN0ZXIgdHlwZSAod2l0aCBzb21lIHplcm8naW5nISkKKyAgICBiaXRfdCBiaXRzOworI2lmIGRlZmluZWQoV0VCUF9VU0VfTUlQUzMyKQorICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugb2YgdW4tYWxpZ25lZCByZWFkLgorICAgIGxiaXRfdCBpbl9iaXRzOworICAgIGxiaXRfdCogcF9idWZfID0gKGxiaXRfdCopYnItPmJ1Zl87CisgICAgX19hc21fXyB2b2xhdGlsZSgKKyAgICAgICIuc2V0ICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICIuc2V0ICAgYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICIuc2V0ICAgbWFjcm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgICJ1bHcgICAgJVtpbl9iaXRzXSwgMCglW3BfYnVmX10pICAgICAgICAgXG5cdCIKKyAgICAgICIuc2V0ICAgcG9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG5cdCIKKyAgICAgIDogW2luX2JpdHNdIj1yIihpbl9iaXRzKQorICAgICAgOiBbcF9idWZfXSJyIihwX2J1Zl8pCisgICAgICA6ICJtZW1vcnkiLCAiYXQiCisgICAgKTsKKyNlbHNlCisgICAgbGJpdF90IGluX2JpdHM7CisgICAgU2JNZW1vcnlDb3B5KCZpbl9iaXRzLCBici0+YnVmXywgc2l6ZW9mKGluX2JpdHMpKTsKKyNlbmRpZgorICAgIGJyLT5idWZfICs9IEJJVFMgPj4gMzsKKyNpZiAhZGVmaW5lZChXT1JEU19CSUdFTkRJQU4pCisjaWYgKEJJVFMgPiAzMikKKyAgICBiaXRzID0gQlN3YXA2NChpbl9iaXRzKTsKKyAgICBiaXRzID4+PSA2NCAtIEJJVFM7CisjZWxpZiAoQklUUyA+PSAyNCkKKyAgICBiaXRzID0gQlN3YXAzMihpbl9iaXRzKTsKKyAgICBiaXRzID4+PSAoMzIgLSBCSVRTKTsKKyNlbGlmIChCSVRTID09IDE2KQorICAgIGJpdHMgPSBCU3dhcDE2KGluX2JpdHMpOworI2Vsc2UgICAvLyBCSVRTID09IDgKKyAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7CisjZW5kaWYgIC8vIEJJVFMgPiAzMgorI2Vsc2UgICAgLy8gV09SRFNfQklHRU5ESUFOCisgICAgYml0cyA9IChiaXRfdClpbl9iaXRzOworICAgIGlmIChCSVRTICE9IDggKiBzaXplb2YoYml0X3QpKSBiaXRzID4+PSAoOCAqIHNpemVvZihiaXRfdCkgLSBCSVRTKTsKKyNlbmRpZgorICAgIGJyLT52YWx1ZV8gPSBiaXRzIHwgKGJyLT52YWx1ZV8gPDwgQklUUyk7CisgICAgYnItPmJpdHNfICs9IEJJVFM7CisgIH0gZWxzZSB7CisgICAgVlA4TG9hZEZpbmFsQnl0ZXMoYnIpOyAgICAvLyBubyBuZWVkIHRvIGJlIGlubGluZWQKKyAgfQorfQorCisvLyBSZWFkIGEgYml0IHdpdGggcHJvYmEgJ3Byb2InLiBTcGVlZC1jcml0aWNhbCBmdW5jdGlvbiEKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0Qml0KFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCBwcm9iKSB7CisgIC8vIERvbid0IG1vdmUgdGhpcyBkZWNsYXJhdGlvbiEgSXQgbWFrZXMgYSBiaWcgc3BlZWQgZGlmZmVyZW5jZSB0byBzdG9yZQorICAvLyAncmFuZ2UnICpiZWZvcmUqIGNhbGxpbmcgVlA4TG9hZE5ld0J5dGVzKCksIGV2ZW4gaWYgdGhpcyBmdW5jdGlvbiBkb2Vzbid0CisgIC8vIGFsdGVyIGJyLT5yYW5nZV8gdmFsdWUuCisgIHJhbmdlX3QgcmFuZ2UgPSBici0+cmFuZ2VfOworICBpZiAoYnItPmJpdHNfIDwgMCkgeworICAgIFZQOExvYWROZXdCeXRlcyhicik7CisgIH0KKyAgeworICAgIGNvbnN0IGludCBwb3MgPSBici0+Yml0c187CisgICAgY29uc3QgcmFuZ2VfdCBzcGxpdCA9IChyYW5nZSAqIHByb2IpID4+IDg7CisgICAgY29uc3QgcmFuZ2VfdCB2YWx1ZSA9IChyYW5nZV90KShici0+dmFsdWVfID4+IHBvcyk7CisgICAgY29uc3QgaW50IGJpdCA9ICh2YWx1ZSA+IHNwbGl0KTsKKyAgICBpZiAoYml0KSB7CisgICAgICByYW5nZSAtPSBzcGxpdDsKKyAgICAgIGJyLT52YWx1ZV8gLT0gKGJpdF90KShzcGxpdCArIDEpIDw8IHBvczsKKyAgICB9IGVsc2UgeworICAgICAgcmFuZ2UgPSBzcGxpdCArIDE7CisgICAgfQorICAgIHsKKyAgICAgIGNvbnN0IGludCBzaGlmdCA9IDcgXiBCaXRzTG9nMkZsb29yKHJhbmdlKTsKKyAgICAgIHJhbmdlIDw8PSBzaGlmdDsKKyAgICAgIGJyLT5iaXRzXyAtPSBzaGlmdDsKKyAgICB9CisgICAgYnItPnJhbmdlXyA9IHJhbmdlIC0gMTsKKyAgICByZXR1cm4gYml0OworICB9Cit9CisKKy8vIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBWUDhHZXRCaXQoKSBmb3IgcHJvYj0weDgwIChub3RlIHNoaWZ0IGlzIGFsd2F5cyAxIGhlcmUpCitzdGF0aWMgV0VCUF9VQlNBTl9JR05PUkVfVU5TSUdORURfT1ZFUkZMT1cgV0VCUF9JTkxJTkUKK2ludCBWUDhHZXRTaWduZWQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHYpIHsKKyAgaWYgKGJyLT5iaXRzXyA8IDApIHsKKyAgICBWUDhMb2FkTmV3Qnl0ZXMoYnIpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgcG9zID0gYnItPmJpdHNfOworICAgIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSBici0+cmFuZ2VfID4+IDE7CisgICAgY29uc3QgcmFuZ2VfdCB2YWx1ZSA9IChyYW5nZV90KShici0+dmFsdWVfID4+IHBvcyk7CisgICAgY29uc3QgaW50MzJfdCBtYXNrID0gKGludDMyX3QpKHNwbGl0IC0gdmFsdWUpID4+IDMxOyAgLy8gLTEgb3IgMAorICAgIGJyLT5iaXRzXyAtPSAxOworICAgIGJyLT5yYW5nZV8gKz0gbWFzazsKKyAgICBici0+cmFuZ2VfIHw9IDE7CisgICAgYnItPnZhbHVlXyAtPSAoYml0X3QpKChzcGxpdCArIDEpICYgbWFzaykgPDwgcG9zOworICAgIHJldHVybiAodiBeIG1hc2spIC0gbWFzazsKKyAgfQorfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IFZQOEdldEJpdEFsdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgcHJvYikgeworICAvLyBEb24ndCBtb3ZlIHRoaXMgZGVjbGFyYXRpb24hIEl0IG1ha2VzIGEgYmlnIHNwZWVkIGRpZmZlcmVuY2UgdG8gc3RvcmUKKyAgLy8gJ3JhbmdlJyAqYmVmb3JlKiBjYWxsaW5nIFZQOExvYWROZXdCeXRlcygpLCBldmVuIGlmIHRoaXMgZnVuY3Rpb24gZG9lc24ndAorICAvLyBhbHRlciBici0+cmFuZ2VfIHZhbHVlLgorICByYW5nZV90IHJhbmdlID0gYnItPnJhbmdlXzsKKyAgaWYgKGJyLT5iaXRzXyA8IDApIHsKKyAgICBWUDhMb2FkTmV3Qnl0ZXMoYnIpOworICB9CisgIHsKKyAgICBjb25zdCBpbnQgcG9zID0gYnItPmJpdHNfOworICAgIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAocmFuZ2UgKiBwcm9iKSA+PiA4OworICAgIGNvbnN0IHJhbmdlX3QgdmFsdWUgPSAocmFuZ2VfdCkoYnItPnZhbHVlXyA+PiBwb3MpOworICAgIGludCBiaXQ7ICAvLyBEb24ndCB1c2UgJ2NvbnN0IGludCBiaXQgPSAodmFsdWUgPiBzcGxpdCk7IiwgaXQncyBzbG93ZXIuCisgICAgaWYgKHZhbHVlID4gc3BsaXQpIHsKKyAgICAgIHJhbmdlIC09IHNwbGl0ICsgMTsKKyAgICAgIGJyLT52YWx1ZV8gLT0gKGJpdF90KShzcGxpdCArIDEpIDw8IHBvczsKKyAgICAgIGJpdCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgIHJhbmdlID0gc3BsaXQ7CisgICAgICBiaXQgPSAwOworICAgIH0KKyAgICBpZiAocmFuZ2UgPD0gKHJhbmdlX3QpMHg3ZSkgeworICAgICAgY29uc3QgaW50IHNoaWZ0ID0ga1ZQOExvZzJSYW5nZVtyYW5nZV07CisgICAgICByYW5nZSA9IGtWUDhOZXdSYW5nZVtyYW5nZV07CisgICAgICBici0+Yml0c18gLT0gc2hpZnQ7CisgICAgfQorICAgIGJyLT5yYW5nZV8gPSByYW5nZTsKKyAgICByZXR1cm4gYml0OworICB9Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAgLy8gV0VCUF9VVElMU19CSVRfUkVBREVSX0lOTF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF9yZWFkZXJfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdiYmU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8vIENvcHlyaWdodCAyMDEwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBCb29sZWFuIGRlY29kZXIgbm9uLWlubGluZWQgbWV0aG9kcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy91dGlscy9iaXRfcmVhZGVyX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4Qml0UmVhZGVyCisKK3ZvaWQgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CisgIGJyLT5idWZfICAgICA9IHN0YXJ0OworICBici0+YnVmX2VuZF8gPSBzdGFydCArIHNpemU7CisgIGJyLT5idWZfbWF4XyA9CisgICAgICAoc2l6ZSA+PSBzaXplb2YobGJpdF90KSkgPyBzdGFydCArIHNpemUgLSBzaXplb2YobGJpdF90KSArIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXJ0OworfQorCit2b2lkIFZQOEluaXRCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwgc2l6ZV90IHNpemUpIHsKKyAgYXNzZXJ0KGJyICE9IE5VTEwpOworICBhc3NlcnQoc3RhcnQgIT0gTlVMTCk7CisgIGFzc2VydChzaXplIDwgKDF1IDw8IDMxKSk7ICAgLy8gbGltaXQgZW5zdXJlZCBieSBmb3JtYXQgYW5kIHVwc3RyZWFtIGNoZWNrcworICBici0+cmFuZ2VfICAgPSAyNTUgLSAxOworICBici0+dmFsdWVfICAgPSAwOworICBici0+Yml0c18gICAgPSAtODsgICAvLyB0byBsb2FkIHRoZSB2ZXJ5IGZpcnN0IDhiaXRzCisgIGJyLT5lb2ZfICAgICA9IDA7CisgIFZQOEJpdFJlYWRlclNldEJ1ZmZlcihiciwgc3RhcnQsIHNpemUpOworICBWUDhMb2FkTmV3Qnl0ZXMoYnIpOworfQorCit2b2lkIFZQOFJlbWFwQml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHB0cmRpZmZfdCBvZmZzZXQpIHsKKyAgaWYgKGJyLT5idWZfICE9IE5VTEwpIHsKKyAgICBici0+YnVmXyArPSBvZmZzZXQ7CisgICAgYnItPmJ1Zl9lbmRfICs9IG9mZnNldDsKKyAgICBici0+YnVmX21heF8gKz0gb2Zmc2V0OworICB9Cit9CisKK2NvbnN0IHVpbnQ4X3Qga1ZQOExvZzJSYW5nZVsxMjhdID0geworICAgICA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAwCit9OworCisvLyByYW5nZSA9ICgocmFuZ2UgLSAxKSA8PCBrVlA4TG9nMlJhbmdlW3JhbmdlXSkgKyAxCitjb25zdCB1aW50OF90IGtWUDhOZXdSYW5nZVsxMjhdID0geworICAxMjcsIDEyNywgMTkxLCAxMjcsIDE1OSwgMTkxLCAyMjMsIDEyNywKKyAgMTQzLCAxNTksIDE3NSwgMTkxLCAyMDcsIDIyMywgMjM5LCAxMjcsCisgIDEzNSwgMTQzLCAxNTEsIDE1OSwgMTY3LCAxNzUsIDE4MywgMTkxLAorICAxOTksIDIwNywgMjE1LCAyMjMsIDIzMSwgMjM5LCAyNDcsIDEyNywKKyAgMTMxLCAxMzUsIDEzOSwgMTQzLCAxNDcsIDE1MSwgMTU1LCAxNTksCisgIDE2MywgMTY3LCAxNzEsIDE3NSwgMTc5LCAxODMsIDE4NywgMTkxLAorICAxOTUsIDE5OSwgMjAzLCAyMDcsIDIxMSwgMjE1LCAyMTksIDIyMywKKyAgMjI3LCAyMzEsIDIzNSwgMjM5LCAyNDMsIDI0NywgMjUxLCAxMjcsCisgIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLAorICAxNDUsIDE0NywgMTQ5LCAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwKKyAgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLCAxNzUsCisgIDE3NywgMTc5LCAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLAorICAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLCAyMDUsIDIwNywKKyAgMjA5LCAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsCisgIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzUsIDIzNywgMjM5LAorICAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDEyNworfTsKKwordm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGFzc2VydChiciAhPSBOVUxMICYmIGJyLT5idWZfICE9IE5VTEwpOworICAvLyBPbmx5IHJlYWQgOGJpdHMgYXQgYSB0aW1lCisgIGlmIChici0+YnVmXyA8IGJyLT5idWZfZW5kXykgeworICAgIGJyLT5iaXRzXyArPSA4OworICAgIGJyLT52YWx1ZV8gPSAoYml0X3QpKCpici0+YnVmXysrKSB8IChici0+dmFsdWVfIDw8IDgpOworICB9IGVsc2UgaWYgKCFici0+ZW9mXykgeworICAgIGJyLT52YWx1ZV8gPDw9IDg7CisgICAgYnItPmJpdHNfICs9IDg7CisgICAgYnItPmVvZl8gPSAxOworICB9IGVsc2UgeworICAgIGJyLT5iaXRzXyA9IDA7ICAvLyBUaGlzIGlzIHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2l0aCBzaGlmdHMuCisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpZ2hlci1sZXZlbCBjYWxscworCit1aW50MzJfdCBWUDhHZXRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgeworICB1aW50MzJfdCB2ID0gMDsKKyAgd2hpbGUgKGJpdHMtLSA+IDApIHsKKyAgICB2IHw9IFZQOEdldEJpdChiciwgMHg4MCkgPDwgYml0czsKKyAgfQorICByZXR1cm4gdjsKK30KKworaW50MzJfdCBWUDhHZXRTaWduZWRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgeworICBjb25zdCBpbnQgdmFsdWUgPSBWUDhHZXRWYWx1ZShiciwgYml0cyk7CisgIHJldHVybiBWUDhHZXQoYnIpID8gLXZhbHVlIDogdmFsdWU7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWUDhMQml0UmVhZGVyCisKKyNkZWZpbmUgVlA4TF9MT0c4X1dCSVRTIDQgIC8vIE51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgVlA4TF9XQklUUyBiaXRzLgorCisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9NX0FSTSkgfHwgZGVmaW5lZChfX2FhcmNoNjRfXykgfHwgXAorICAgIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX01fSVg4NikgfHwgXAorICAgIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpCisjZGVmaW5lIFZQOExfVVNFX0ZBU1RfTE9BRAorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrQml0TWFza1tWUDhMX01BWF9OVU1fQklUX1JFQUQgKyAxXSA9IHsKKyAgMCwKKyAgMHgwMDAwMDEsIDB4MDAwMDAzLCAweDAwMDAwNywgMHgwMDAwMGYsCisgIDB4MDAwMDFmLCAweDAwMDAzZiwgMHgwMDAwN2YsIDB4MDAwMGZmLAorICAweDAwMDFmZiwgMHgwMDAzZmYsIDB4MDAwN2ZmLCAweDAwMGZmZiwKKyAgMHgwMDFmZmYsIDB4MDAzZmZmLCAweDAwN2ZmZiwgMHgwMGZmZmYsCisgIDB4MDFmZmZmLCAweDAzZmZmZiwgMHgwN2ZmZmYsIDB4MGZmZmZmLAorICAweDFmZmZmZiwgMHgzZmZmZmYsIDB4N2ZmZmZmLCAweGZmZmZmZgorfTsKKwordm9pZCBWUDhMSW5pdEJpdFJlYWRlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKKyAgc2l6ZV90IGk7CisgIHZwOGxfdmFsX3QgdmFsdWUgPSAwOworICBhc3NlcnQoYnIgIT0gTlVMTCk7CisgIGFzc2VydChzdGFydCAhPSBOVUxMKTsKKyAgYXNzZXJ0KGxlbmd0aCA8IDB4ZmZmZmZmZjh1KTsgICAvLyBjYW4ndCBoYXBwZW4gd2l0aCBhIFJJRkYgY2h1bmsuCisKKyAgYnItPmxlbl8gPSBsZW5ndGg7CisgIGJyLT52YWxfID0gMDsKKyAgYnItPmJpdF9wb3NfID0gMDsKKyAgYnItPmVvc18gPSAwOworCisgIGlmIChsZW5ndGggPiBzaXplb2YoYnItPnZhbF8pKSB7CisgICAgbGVuZ3RoID0gc2l6ZW9mKGJyLT52YWxfKTsKKyAgfQorICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICB2YWx1ZSB8PSAodnA4bF92YWxfdClzdGFydFtpXSA8PCAoOCAqIGkpOworICB9CisgIGJyLT52YWxfID0gdmFsdWU7CisgIGJyLT5wb3NfID0gbGVuZ3RoOworICBici0+YnVmXyA9IHN0YXJ0OworfQorCit2b2lkIFZQOExCaXRSZWFkZXJTZXRCdWZmZXIoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QgYnVmLCBzaXplX3QgbGVuKSB7CisgIGFzc2VydChiciAhPSBOVUxMKTsKKyAgYXNzZXJ0KGJ1ZiAhPSBOVUxMKTsKKyAgYXNzZXJ0KGxlbiA8IDB4ZmZmZmZmZjh1KTsgICAvLyBjYW4ndCBoYXBwZW4gd2l0aCBhIFJJRkYgY2h1bmsuCisgIGJyLT5idWZfID0gYnVmOworICBici0+bGVuXyA9IGxlbjsKKyAgLy8gcG9zXyA+IGxlbl8gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJhbSBlcnJvci4KKyAgYnItPmVvc18gPSAoYnItPnBvc18gPiBici0+bGVuXykgfHwgVlA4TElzRW5kT2ZTdHJlYW0oYnIpOworfQorCitzdGF0aWMgdm9pZCBWUDhMU2V0RW5kT2ZTdHJlYW0oVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKKyAgYnItPmVvc18gPSAxOworICBici0+Yml0X3Bvc18gPSAwOyAgLy8gVG8gYXZvaWQgdW5kZWZpbmVkIGJlaGF2aW91ciB3aXRoIHNoaWZ0cy4KK30KKworLy8gSWYgbm90IGF0IEVPUywgcmVsb2FkIHVwIHRvIFZQOExfTEJJVFMgYnl0ZS1ieS1ieXRlCitzdGF0aWMgdm9pZCBTaGlmdEJ5dGVzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIHdoaWxlIChici0+Yml0X3Bvc18gPj0gOCAmJiBici0+cG9zXyA8IGJyLT5sZW5fKSB7CisgICAgYnItPnZhbF8gPj49IDg7CisgICAgYnItPnZhbF8gfD0gKCh2cDhsX3ZhbF90KWJyLT5idWZfW2JyLT5wb3NfXSkgPDwgKFZQOExfTEJJVFMgLSA4KTsKKyAgICArK2JyLT5wb3NfOworICAgIGJyLT5iaXRfcG9zXyAtPSA4OworICB9CisgIGlmIChWUDhMSXNFbmRPZlN0cmVhbShicikpIHsKKyAgICBWUDhMU2V0RW5kT2ZTdHJlYW0oYnIpOworICB9Cit9CisKK3ZvaWQgVlA4TERvRmlsbEJpdFdpbmRvdyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBhc3NlcnQoYnItPmJpdF9wb3NfID49IFZQOExfV0JJVFMpOworI2lmIGRlZmluZWQoVlA4TF9VU0VfRkFTVF9MT0FEKQorICBpZiAoYnItPnBvc18gKyBzaXplb2YoYnItPnZhbF8pIDwgYnItPmxlbl8pIHsKKyAgICBici0+dmFsXyA+Pj0gVlA4TF9XQklUUzsKKyAgICBici0+Yml0X3Bvc18gLT0gVlA4TF9XQklUUzsKKyAgICBici0+dmFsXyB8PSAodnA4bF92YWxfdClIVG9MRTMyKFdlYlBNZW1Ub1VpbnQzMihici0+YnVmXyArIGJyLT5wb3NfKSkgPDwKKyAgICAgICAgICAgICAgICAoVlA4TF9MQklUUyAtIFZQOExfV0JJVFMpOworICAgIGJyLT5wb3NfICs9IFZQOExfTE9HOF9XQklUUzsKKyAgICByZXR1cm47CisgIH0KKyNlbmRpZgorICBTaGlmdEJ5dGVzKGJyKTsgICAgICAgLy8gU2xvdyBwYXRoLgorfQorCit1aW50MzJfdCBWUDhMUmVhZEJpdHMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIsIGludCBuX2JpdHMpIHsKKyAgYXNzZXJ0KG5fYml0cyA+PSAwKTsKKyAgLy8gRmxhZyBhbiBlcnJvciBpZiBlbmRfb2Zfc3RyZWFtIG9yIG5fYml0cyBpcyBtb3JlIHRoYW4gYWxsb3dlZCBsaW1pdC4KKyAgaWYgKCFici0+ZW9zXyAmJiBuX2JpdHMgPD0gVlA4TF9NQVhfTlVNX0JJVF9SRUFEKSB7CisgICAgY29uc3QgdWludDMyX3QgdmFsID0gVlA4TFByZWZldGNoQml0cyhicikgJiBrQml0TWFza1tuX2JpdHNdOworICAgIGNvbnN0IGludCBuZXdfYml0cyA9IGJyLT5iaXRfcG9zXyArIG5fYml0czsKKyAgICBici0+Yml0X3Bvc18gPSBuZXdfYml0czsKKyAgICBTaGlmdEJ5dGVzKGJyKTsKKyAgICByZXR1cm4gdmFsOworICB9IGVsc2UgeworICAgIFZQOExTZXRFbmRPZlN0cmVhbShicik7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfcmVhZGVyX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTRmZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3JlYWRlcl91dGlscy5oCkBAIC0wLDAgKzEsMTgwIEBACisvLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQm9vbGVhbiBkZWNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKy8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19CSVRfUkVBREVSX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfQklUX1JFQURFUl9VVElMU19IXworCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gX2J5dGVzd2FwX3Vsb25nCisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBUaGUgQm9vbGVhbiBkZWNvZGVyIG5lZWRzIHRvIG1haW50YWluIGluZmluaXRlIHByZWNpc2lvbiBvbiB0aGUgdmFsdWVfIGZpZWxkLgorLy8gSG93ZXZlciwgc2luY2UgcmFuZ2VfIGlzIG9ubHkgOGJpdCwgd2Ugb25seSBuZWVkIGFuIGFjdGl2ZSB3aW5kb3cgb2YgOCBiaXRzCisvLyBmb3IgdmFsdWVfLiBMZWZ0IGJpdHMgKE1TQikgZ2V0cyB6ZXJvZWQgYW5kIHNoaWZ0ZWQgYXdheSB3aGVuIHZhbHVlXyBmYWxscworLy8gYmVsb3cgMTI4LCByYW5nZV8gaXMgdXBkYXRlZCwgYW5kIGZyZXNoIGJpdHMgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gYXJlCisvLyBicm91Z2h0IGluIGFzIExTQi4gVG8gYXZvaWQgcmVhZGluZyB0aGUgZnJlc2ggYml0cyBvbmUgYnkgb25lIChzbG93KSwgd2UKKy8vIGNhY2hlIEJJVFMgb2YgdGhlbSBhaGVhZC4gVGhlIHRvdGFsIG9mIChCSVRTICsgOCkgYml0cyBtdXN0IGZpdCBpbnRvIGEKKy8vIG5hdHVyYWwgcmVnaXN0ZXIgKHdpdGggdHlwZSBiaXRfdCkuIFRvIGZldGNoIEJJVFMgYml0cyBmcm9tIGJpdHN0cmVhbSB3ZQorLy8gdXNlIGEgdHlwZSBsYml0X3QuCisvLworLy8gQklUUyBjYW4gYmUgYW55IG11bHRpcGxlIG9mIDggZnJvbSA4IHRvIDU2IChpbmNsdXNpdmUpLgorLy8gUGljayB2YWx1ZXMgdGhhdCBmaXQgbmF0dXJhbCByZWdpc3RlciBzaXplLgorCisjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfTV9JWDg2KSAgICAgIC8vIHg4NiAzMmJpdAorI2RlZmluZSBCSVRTIDI0CisjZWxpZiBkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KSAgIC8vIHg4NiA2NGJpdAorI2RlZmluZSBCSVRTIDU2CisjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSAgICAgIC8vIEFSTQorI2RlZmluZSBCSVRTIDI0CisjZWxpZiBkZWZpbmVkKF9fYWFyY2g2NF9fKSAgICAgICAgICAgICAgICAgICAgIC8vIEFSTSA2NGJpdAorI2RlZmluZSBCSVRTIDU2CisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1JUFMKKyNkZWZpbmUgQklUUyAyNAorI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHQKKyNkZWZpbmUgQklUUyAyNAorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZXJpdmVkIHR5cGVzIGFuZCBjb25zdGFudHM6CisvLyAgIGJpdF90ID0gbmF0dXJhbCByZWdpc3RlciB0eXBlIGZvciBzdG9yaW5nICd2YWx1ZV8nICh3aGljaCBpcyBCSVRTKzggYml0cykKKy8vICAgcmFuZ2VfdCA9IHJlZ2lzdGVyIGZvciAncmFuZ2VfJyAod2hpY2ggaXMgOGJpdHMgb25seSkKKworI2lmIChCSVRTID4gMjQpCit0eXBlZGVmIHVpbnQ2NF90IGJpdF90OworI2Vsc2UKK3R5cGVkZWYgdWludDMyX3QgYml0X3Q7CisjZW5kaWYKKwordHlwZWRlZiB1aW50MzJfdCByYW5nZV90OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQml0cmVhZGVyCisKK3R5cGVkZWYgc3RydWN0IFZQOEJpdFJlYWRlciBWUDhCaXRSZWFkZXI7CitzdHJ1Y3QgVlA4Qml0UmVhZGVyIHsKKyAgLy8gYm9vbGVhbiBkZWNvZGVyICAoa2VlcCB0aGUgZmllbGQgb3JkZXJpbmcgYXMgaXMhKQorICBiaXRfdCB2YWx1ZV87ICAgICAgICAgICAgICAgLy8gY3VycmVudCB2YWx1ZQorICByYW5nZV90IHJhbmdlXzsgICAgICAgICAgICAgLy8gY3VycmVudCByYW5nZSBtaW51cyAxLiBJbiBbMTI3LCAyNTRdIGludGVydmFsLgorICBpbnQgYml0c187ICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHZhbGlkIGJpdHMgbGVmdAorICAvLyByZWFkIGJ1ZmZlcgorICBjb25zdCB1aW50OF90KiBidWZfOyAgICAgICAgLy8gbmV4dCBieXRlIHRvIGJlIHJlYWQKKyAgY29uc3QgdWludDhfdCogYnVmX2VuZF87ICAgIC8vIGVuZCBvZiByZWFkIGJ1ZmZlcgorICBjb25zdCB1aW50OF90KiBidWZfbWF4XzsgICAgLy8gbWF4IHBhY2tlZC1yZWFkIHBvc2l0aW9uIG9uIGJ1ZmZlcgorICBpbnQgZW9mXzsgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBpbnB1dCBpcyBleGhhdXN0ZWQKK307CisKKy8vIEluaXRpYWxpemUgdGhlIGJpdCByZWFkZXIgYW5kIHRoZSBib29sZWFuIGRlY29kZXIuCit2b2lkIFZQOEluaXRCaXRSZWFkZXIoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwgc2l6ZV90IHNpemUpOworLy8gU2V0cyB0aGUgd29ya2luZyByZWFkIGJ1ZmZlci4KK3ZvaWQgVlA4Qml0UmVhZGVyU2V0QnVmZmVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwgc2l6ZV90IHNpemUpOworCisvLyBVcGRhdGUgaW50ZXJuYWwgcG9pbnRlcnMgdG8gZGlzcGxhY2UgdGhlIGJ5dGUgYnVmZmVyIGJ5IHRoZQorLy8gcmVsYXRpdmUgb2Zmc2V0ICdvZmZzZXQnLgordm9pZCBWUDhSZW1hcEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBwdHJkaWZmX3Qgb2Zmc2V0KTsKKworLy8gcmV0dXJuIHRoZSBuZXh0IHZhbHVlIG1hZGUgb2YgJ251bV9iaXRzJyBiaXRzCit1aW50MzJfdCBWUDhHZXRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbnVtX2JpdHMpOworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFZQOEdldChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIHJldHVybiBWUDhHZXRWYWx1ZShiciwgMSk7Cit9CisKKy8vIHJldHVybiB0aGUgbmV4dCB2YWx1ZSB3aXRoIHNpZ24tZXh0ZW5zaW9uLgoraW50MzJfdCBWUDhHZXRTaWduZWRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbnVtX2JpdHMpOworCisvLyBiaXRfcmVhZGVyX2lubC5oIHdpbGwgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKKy8vICAgc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpCisvLyAgIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0U2lnbmVkKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2KQorLy8gYW5kIHNob3VsZCBiZSBpbmNsdWRlZCBieSB0aGUgLmMgZmlsZXMgdGhhdCBhY3R1YWxseSBuZWVkIHRoZW0uCisvLyBUaGlzIGlzIHRvIGF2b2lkIHJlY29tcGlsaW5nIHRoZSB3aG9sZSBsaWJyYXJ5IHdoZW5ldmVyIHRoaXMgZmlsZSBpcyB0b3VjaGVkLAorLy8gYW5kIGFsc28gYWxsb3dpbmcgcGxhdGZvcm0tc3BlY2lmaWMgYWQtaG9jIGhhY2tzLgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQml0cmVhZGVyIGZvciBsb3NzbGVzcyBmb3JtYXQKKworLy8gbWF4aW11bSBudW1iZXIgb2YgYml0cyAoaW5jbHVzaXZlKSB0aGUgYml0LXJlYWRlciBjYW4gaGFuZGxlOgorI2RlZmluZSBWUDhMX01BWF9OVU1fQklUX1JFQUQgMjQKKworI2RlZmluZSBWUDhMX0xCSVRTIDY0ICAvLyBOdW1iZXIgb2YgYml0cyBwcmVmZXRjaGVkICg9IGJpdC1zaXplIG9mIHZwOGxfdmFsX3QpLgorI2RlZmluZSBWUDhMX1dCSVRTIDMyICAvLyBNaW5pbXVtIG51bWJlciBvZiBieXRlcyByZWFkeSBhZnRlciBWUDhMRmlsbEJpdFdpbmRvdy4KKwordHlwZWRlZiB1aW50NjRfdCB2cDhsX3ZhbF90OyAgLy8gcmlnaHQgbm93LCB0aGlzIGJpdC1yZWFkZXIgY2FuIG9ubHkgdXNlIDY0Yml0LgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHZwOGxfdmFsX3QgICAgIHZhbF87ICAgICAgICAvLyBwcmUtZmV0Y2hlZCBiaXRzCisgIGNvbnN0IHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBpbnB1dCBieXRlIGJ1ZmZlcgorICBzaXplX3QgICAgICAgICBsZW5fOyAgICAgICAgLy8gYnVmZmVyIGxlbmd0aAorICBzaXplX3QgICAgICAgICBwb3NfOyAgICAgICAgLy8gYnl0ZSBwb3NpdGlvbiBpbiBidWZfCisgIGludCAgICAgICAgICAgIGJpdF9wb3NfOyAgICAvLyBjdXJyZW50IGJpdC1yZWFkaW5nIHBvc2l0aW9uIGluIHZhbF8KKyAgaW50ICAgICAgICAgICAgZW9zXzsgICAgICAgIC8vIHRydWUgaWYgYSBiaXQgd2FzIHJlYWQgcGFzdCB0aGUgZW5kIG9mIGJ1ZmZlcgorfSBWUDhMQml0UmVhZGVyOworCit2b2lkIFZQOExJbml0Qml0UmVhZGVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7CisKKy8vICBTZXRzIGEgbmV3IGRhdGEgYnVmZmVyLgordm9pZCBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CisKKy8vIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJpdHMgZnJvbSByZWFkIGJ1ZmZlci4KKy8vIEZsYWdzIGFuIGVycm9yIGluIGNhc2UgZW5kX29mX3N0cmVhbSBvciBuX2JpdHMgaXMgbW9yZSB0aGFuIHRoZSBhbGxvd2VkIGxpbWl0CisvLyBvZiBWUDhMX01BWF9OVU1fQklUX1JFQUQgKGluY2x1c2l2ZSkuCisvLyBGbGFncyBlb3NfIGlmIHRoaXMgcmVhZCBhdHRlbXB0IGlzIGdvaW5nIHRvIGNyb3NzIHRoZSByZWFkIGJ1ZmZlci4KK3VpbnQzMl90IFZQOExSZWFkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG5fYml0cyk7CisKKy8vIFJldHVybiB0aGUgcHJlZmV0Y2hlZCBiaXRzLCBzbyB0aGV5IGNhbiBiZSBsb29rZWQgdXAuCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFByZWZldGNoQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICByZXR1cm4gKHVpbnQzMl90KShici0+dmFsXyA+PiAoYnItPmJpdF9wb3NfICYgKFZQOExfTEJJVFMgLSAxKSkpOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgd2FzIGFuIGF0dGVtcHQgYXQgcmVhZGluZyBiaXQgcGFzdCB0aGUgZW5kIG9mCisvLyB0aGUgYnVmZmVyLiBEb2Vzbid0IHNldCBici0+ZW9zXyBmbGFnLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSXNFbmRPZlN0cmVhbShjb25zdCBWUDhMQml0UmVhZGVyKiBjb25zdCBicikgeworICBTQl9EQ0hFQ0soYnItPnBvc18gPD0gYnItPmxlbl8pOworICByZXR1cm4gYnItPmVvc18gfHwgKChici0+cG9zXyA9PSBici0+bGVuXykgJiYgKGJyLT5iaXRfcG9zXyA+IFZQOExfTEJJVFMpKTsKK30KKworLy8gRm9yIGp1bXBpbmcgb3ZlciBhIG51bWJlciBvZiBiaXRzIGluIHRoZSBiaXQgc3RyZWFtIHdoZW4gYWNjZXNzZWQgd2l0aAorLy8gVlA4TFByZWZldGNoQml0cyBhbmQgVlA4TEZpbGxCaXRXaW5kb3cuCisvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgKm5vdCogc2V0IGJyLT5lb3NfLCBzaW5jZSBpdCdzIHNwZWVkLWNyaXRpY2FsLgorLy8gVXNlIHdpdGggZXh0cmVtZSBjYXJlIQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgVlA4TFNldEJpdFBvcyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IHZhbCkgeworICBici0+Yml0X3Bvc18gPSB2YWw7Cit9CisKKy8vIEFkdmFuY2VzIHRoZSByZWFkIGJ1ZmZlciBieSA0IGJ5dGVzIHRvIG1ha2Ugcm9vbSBmb3IgcmVhZGluZyBuZXh0IDMyIGJpdHMuCisvLyBTcGVlZCBjcml0aWNhbCwgYnV0IGluZnJlcXVlbnQgcGFydCBvZiB0aGUgY29kZSBjYW4gYmUgbm9uLWlubGluZWQuCitleHRlcm4gdm9pZCBWUDhMRG9GaWxsQml0V2luZG93KFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKTsKK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExGaWxsQml0V2luZG93KFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyKSB7CisgIGlmIChici0+Yml0X3Bvc18gPj0gVlA4TF9XQklUUykgVlA4TERvRmlsbEJpdFdpbmRvdyhicik7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9SRUFERVJfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9iaXRfd3JpdGVyX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Zjg3MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5jCkBAIC0wLDAgKzEsMzUyIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gQml0IHdyaXRpbmcgYW5kIGJvb2xlYW4gY29kZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorLy8gICAgICAgICBWaWthcyBBcm9yYSAodmlrYWFzLmFyb3JhQGdtYWlsLmNvbSkKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtY3B5KCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaCIKKyNpbmNsdWRlICJzcmMvdXRpbHMvZW5kaWFuX2lubF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4Qml0V3JpdGVyCisKK3N0YXRpYyBpbnQgQml0V3JpdGVyUmVzaXplKFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7CisgIHVpbnQ4X3QqIG5ld19idWY7CisgIHNpemVfdCBuZXdfc2l6ZTsKKyAgY29uc3QgdWludDY0X3QgbmVlZGVkX3NpemVfNjRiID0gKHVpbnQ2NF90KWJ3LT5wb3NfICsgZXh0cmFfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IG5lZWRlZF9zaXplID0gKHNpemVfdCluZWVkZWRfc2l6ZV82NGI7CisgIGlmIChuZWVkZWRfc2l6ZV82NGIgIT0gbmVlZGVkX3NpemUpIHsKKyAgICBidy0+ZXJyb3JfID0gMTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAobmVlZGVkX3NpemUgPD0gYnctPm1heF9wb3NfKSByZXR1cm4gMTsKKyAgLy8gSWYgdGhlIGZvbGxvd2luZyBsaW5lIHdyYXBzIG92ZXIgMzJiaXQsIHRoZSB0ZXN0IGp1c3QgYWZ0ZXIgd2lsbCBjYXRjaCBpdC4KKyAgbmV3X3NpemUgPSAyICogYnctPm1heF9wb3NfOworICBpZiAobmV3X3NpemUgPCBuZWVkZWRfc2l6ZSkgbmV3X3NpemUgPSBuZWVkZWRfc2l6ZTsKKyAgaWYgKG5ld19zaXplIDwgMTAyNCkgbmV3X3NpemUgPSAxMDI0OworICBuZXdfYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIG5ld19zaXplKTsKKyAgaWYgKG5ld19idWYgPT0gTlVMTCkgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChidy0+cG9zXyA+IDApIHsKKyAgICBhc3NlcnQoYnctPmJ1Zl8gIT0gTlVMTCk7CisgICAgbWVtY3B5KG5ld19idWYsIGJ3LT5idWZfLCBidy0+cG9zXyk7CisgIH0KKyAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgYnctPmJ1Zl8gPSBuZXdfYnVmOworICBidy0+bWF4X3Bvc18gPSBuZXdfc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIEZsdXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgaW50IHMgPSA4ICsgYnctPm5iX2JpdHNfOworICBjb25zdCBpbnQzMl90IGJpdHMgPSBidy0+dmFsdWVfID4+IHM7CisgIGFzc2VydChidy0+bmJfYml0c18gPj0gMCk7CisgIGJ3LT52YWx1ZV8gLT0gYml0cyA8PCBzOworICBidy0+bmJfYml0c18gLT0gODsKKyAgaWYgKChiaXRzICYgMHhmZikgIT0gMHhmZikgeworICAgIHNpemVfdCBwb3MgPSBidy0+cG9zXzsKKyAgICBpZiAoIUJpdFdyaXRlclJlc2l6ZShidywgYnctPnJ1bl8gKyAxKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoYml0cyAmIDB4MTAwKSB7ICAvLyBvdmVyZmxvdyAtPiBwcm9wYWdhdGUgY2Fycnkgb3ZlciBwZW5kaW5nIDB4ZmYncworICAgICAgaWYgKHBvcyA+IDApIGJ3LT5idWZfW3BvcyAtIDFdKys7CisgICAgfQorICAgIGlmIChidy0+cnVuXyA+IDApIHsKKyAgICAgIGNvbnN0IGludCB2YWx1ZSA9IChiaXRzICYgMHgxMDApID8gMHgwMCA6IDB4ZmY7CisgICAgICBmb3IgKDsgYnctPnJ1bl8gPiAwOyAtLWJ3LT5ydW5fKSBidy0+YnVmX1twb3MrK10gPSB2YWx1ZTsKKyAgICB9CisgICAgYnctPmJ1Zl9bcG9zKytdID0gYml0czsKKyAgICBidy0+cG9zXyA9IHBvczsKKyAgfSBlbHNlIHsKKyAgICBidy0+cnVuXysrOyAgIC8vIGRlbGF5IHdyaXRpbmcgb2YgYnl0ZXMgMHhmZiwgcGVuZGluZyBldmVudHVhbCBjYXJyeS4KKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcmVub3JtYWxpemF0aW9uCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGtOb3JtWzEyOF0gPSB7ICAvLyByZW5vcm1fc2l6ZXNbaV0gPSA4IC0gbG9nMihpKQorICAgICA3LCA2LCA2LCA1LCA1LCA1LCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAwCit9OworCisvLyByYW5nZSA9ICgocmFuZ2UgKyAxKSA8PCBrVlA4TG9nMlJhbmdlW3JhbmdlXSkgLSAxCitzdGF0aWMgY29uc3QgdWludDhfdCBrTmV3UmFuZ2VbMTI4XSA9IHsKKyAgMTI3LCAxMjcsIDE5MSwgMTI3LCAxNTksIDE5MSwgMjIzLCAxMjcsIDE0MywgMTU5LCAxNzUsIDE5MSwgMjA3LCAyMjMsIDIzOSwKKyAgMTI3LCAxMzUsIDE0MywgMTUxLCAxNTksIDE2NywgMTc1LCAxODMsIDE5MSwgMTk5LCAyMDcsIDIxNSwgMjIzLCAyMzEsIDIzOSwKKyAgMjQ3LCAxMjcsIDEzMSwgMTM1LCAxMzksIDE0MywgMTQ3LCAxNTEsIDE1NSwgMTU5LCAxNjMsIDE2NywgMTcxLCAxNzUsIDE3OSwKKyAgMTgzLCAxODcsIDE5MSwgMTk1LCAxOTksIDIwMywgMjA3LCAyMTEsIDIxNSwgMjE5LCAyMjMsIDIyNywgMjMxLCAyMzUsIDIzOSwKKyAgMjQzLCAyNDcsIDI1MSwgMTI3LCAxMjksIDEzMSwgMTMzLCAxMzUsIDEzNywgMTM5LCAxNDEsIDE0MywgMTQ1LCAxNDcsIDE0OSwKKyAgMTUxLCAxNTMsIDE1NSwgMTU3LCAxNTksIDE2MSwgMTYzLCAxNjUsIDE2NywgMTY5LCAxNzEsIDE3MywgMTc1LCAxNzcsIDE3OSwKKyAgMTgxLCAxODMsIDE4NSwgMTg3LCAxODksIDE5MSwgMTkzLCAxOTUsIDE5NywgMTk5LCAyMDEsIDIwMywgMjA1LCAyMDcsIDIwOSwKKyAgMjExLCAyMTMsIDIxNSwgMjE3LCAyMTksIDIyMSwgMjIzLCAyMjUsIDIyNywgMjI5LCAyMzEsIDIzMywgMjM1LCAyMzcsIDIzOSwKKyAgMjQxLCAyNDMsIDI0NSwgMjQ3LCAyNDksIDI1MSwgMjUzLCAxMjcKK307CisKK2ludCBWUDhQdXRCaXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCwgaW50IHByb2IpIHsKKyAgY29uc3QgaW50IHNwbGl0ID0gKGJ3LT5yYW5nZV8gKiBwcm9iKSA+PiA4OworICBpZiAoYml0KSB7CisgICAgYnctPnZhbHVlXyArPSBzcGxpdCArIDE7CisgICAgYnctPnJhbmdlXyAtPSBzcGxpdCArIDE7CisgIH0gZWxzZSB7CisgICAgYnctPnJhbmdlXyA9IHNwbGl0OworICB9CisgIGlmIChidy0+cmFuZ2VfIDwgMTI3KSB7ICAgLy8gZW1pdCAnc2hpZnQnIGJpdHMgb3V0IGFuZCByZW5vcm1hbGl6ZQorICAgIGNvbnN0IGludCBzaGlmdCA9IGtOb3JtW2J3LT5yYW5nZV9dOworICAgIGJ3LT5yYW5nZV8gPSBrTmV3UmFuZ2VbYnctPnJhbmdlX107CisgICAgYnctPnZhbHVlXyA8PD0gc2hpZnQ7CisgICAgYnctPm5iX2JpdHNfICs9IHNoaWZ0OworICAgIGlmIChidy0+bmJfYml0c18gPiAwKSBGbHVzaChidyk7CisgIH0KKyAgcmV0dXJuIGJpdDsKK30KKworaW50IFZQOFB1dEJpdFVuaWZvcm0oVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCkgeworICBjb25zdCBpbnQgc3BsaXQgPSBidy0+cmFuZ2VfID4+IDE7CisgIGlmIChiaXQpIHsKKyAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKKyAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKKyAgfSBlbHNlIHsKKyAgICBidy0+cmFuZ2VfID0gc3BsaXQ7CisgIH0KKyAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsKKyAgICBidy0+cmFuZ2VfID0ga05ld1JhbmdlW2J3LT5yYW5nZV9dOworICAgIGJ3LT52YWx1ZV8gPDw9IDE7CisgICAgYnctPm5iX2JpdHNfICs9IDE7CisgICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIEZsdXNoKGJ3KTsKKyAgfQorICByZXR1cm4gYml0OworfQorCit2b2lkIFZQOFB1dEJpdHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgdWludDMyX3QgdmFsdWUsIGludCBuYl9iaXRzKSB7CisgIHVpbnQzMl90IG1hc2s7CisgIGFzc2VydChuYl9iaXRzID4gMCAmJiBuYl9iaXRzIDwgMzIpOworICBmb3IgKG1hc2sgPSAxdSA8PCAobmJfYml0cyAtIDEpOyBtYXNrOyBtYXNrID4+PSAxKSB7CisgICAgVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgJiBtYXNrKTsKKyAgfQorfQorCit2b2lkIFZQOFB1dFNpZ25lZEJpdHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cykgeworICBpZiAoIVZQOFB1dEJpdFVuaWZvcm0oYncsIHZhbHVlICE9IDApKSByZXR1cm47CisgIGlmICh2YWx1ZSA8IDApIHsKKyAgICBWUDhQdXRCaXRzKGJ3LCAoKC12YWx1ZSkgPDwgMSkgfCAxLCBuYl9iaXRzICsgMSk7CisgIH0gZWxzZSB7CisgICAgVlA4UHV0Qml0cyhidywgdmFsdWUgPDwgMSwgbmJfYml0cyArIDEpOworICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7CisgIGJ3LT5yYW5nZV8gICA9IDI1NSAtIDE7CisgIGJ3LT52YWx1ZV8gICA9IDA7CisgIGJ3LT5ydW5fICAgICA9IDA7CisgIGJ3LT5uYl9iaXRzXyA9IC04OworICBidy0+cG9zXyAgICAgPSAwOworICBidy0+bWF4X3Bvc18gPSAwOworICBidy0+ZXJyb3JfICAgPSAwOworICBidy0+YnVmXyAgICAgPSBOVUxMOworICByZXR1cm4gKGV4cGVjdGVkX3NpemUgPiAwKSA/IEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSkgOiAxOworfQorCit1aW50OF90KiBWUDhCaXRXcml0ZXJGaW5pc2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgeworICBWUDhQdXRCaXRzKGJ3LCAwLCA5IC0gYnctPm5iX2JpdHNfKTsKKyAgYnctPm5iX2JpdHNfID0gMDsgICAvLyBwYWQgd2l0aCB6ZXJvZXMKKyAgRmx1c2goYncpOworICByZXR1cm4gYnctPmJ1Zl87Cit9CisKK2ludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgYXNzZXJ0KGRhdGEgIT0gTlVMTCk7CisgIGlmIChidy0+bmJfYml0c18gIT0gLTgpIHJldHVybiAwOyAgIC8vIEZsdXNoKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkCisgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBzaXplKSkgcmV0dXJuIDA7CisgIG1lbWNweShidy0+YnVmXyArIGJ3LT5wb3NfLCBkYXRhLCBzaXplKTsKKyAgYnctPnBvc18gKz0gc2l6ZTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVlA4Qml0V3JpdGVyV2lwZU91dChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGlmIChidyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVlA4TEJpdFdyaXRlcgorCisvLyBUaGlzIGlzIHRoZSBtaW5pbXVtIGFtb3VudCBvZiBzaXplIHRoZSBtZW1vcnkgYnVmZmVyIGlzIGd1YXJhbnRlZWQgdG8gZ3JvdworLy8gd2hlbiBleHRyYSBzcGFjZSBpcyBuZWVkZWQuCisjZGVmaW5lIE1JTl9FWFRSQV9TSVpFICAoMzI3NjhVTEwpCisKKy8vIFJldHVybnMgMSBvbiBzdWNjZXNzLgorc3RhdGljIGludCBWUDhMQml0V3JpdGVyUmVzaXplKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXh0cmFfc2l6ZSkgeworICB1aW50OF90KiBhbGxvY2F0ZWRfYnVmOworICBzaXplX3QgYWxsb2NhdGVkX3NpemU7CisgIGNvbnN0IHNpemVfdCBtYXhfYnl0ZXMgPSBidy0+ZW5kXyAtIGJ3LT5idWZfOworICBjb25zdCBzaXplX3QgY3VycmVudF9zaXplID0gYnctPmN1cl8gLSBidy0+YnVmXzsKKyAgY29uc3QgdWludDY0X3Qgc2l6ZV9yZXF1aXJlZF82NGIgPSAodWludDY0X3QpY3VycmVudF9zaXplICsgZXh0cmFfc2l6ZTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfcmVxdWlyZWQgPSAoc2l6ZV90KXNpemVfcmVxdWlyZWRfNjRiOworICBpZiAoc2l6ZV9yZXF1aXJlZCAhPSBzaXplX3JlcXVpcmVkXzY0YikgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChtYXhfYnl0ZXMgPiAwICYmIHNpemVfcmVxdWlyZWQgPD0gbWF4X2J5dGVzKSByZXR1cm4gMTsKKyAgYWxsb2NhdGVkX3NpemUgPSAoMyAqIG1heF9ieXRlcykgPj4gMTsKKyAgaWYgKGFsbG9jYXRlZF9zaXplIDwgc2l6ZV9yZXF1aXJlZCkgYWxsb2NhdGVkX3NpemUgPSBzaXplX3JlcXVpcmVkOworICAvLyBtYWtlIGFsbG9jYXRlZCBzaXplIG11bHRpcGxlIG9mIDFrCisgIGFsbG9jYXRlZF9zaXplID0gKCgoYWxsb2NhdGVkX3NpemUgPj4gMTApICsgMSkgPDwgMTApOworICBhbGxvY2F0ZWRfYnVmID0gKHVpbnQ4X3QqKVdlYlBTYWZlTWFsbG9jKDFVTEwsIGFsbG9jYXRlZF9zaXplKTsKKyAgaWYgKGFsbG9jYXRlZF9idWYgPT0gTlVMTCkgeworICAgIGJ3LT5lcnJvcl8gPSAxOworICAgIHJldHVybiAwOworICB9CisgIGlmIChjdXJyZW50X3NpemUgPiAwKSB7CisgICAgbWVtY3B5KGFsbG9jYXRlZF9idWYsIGJ3LT5idWZfLCBjdXJyZW50X3NpemUpOworICB9CisgIFdlYlBTYWZlRnJlZShidy0+YnVmXyk7CisgIGJ3LT5idWZfID0gYWxsb2NhdGVkX2J1ZjsKKyAgYnctPmN1cl8gPSBidy0+YnVmXyArIGN1cnJlbnRfc2l6ZTsKKyAgYnctPmVuZF8gPSBidy0+YnVmXyArIGFsbG9jYXRlZF9zaXplOworICByZXR1cm4gMTsKK30KKworaW50IFZQOExCaXRXcml0ZXJJbml0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LCBzaXplX3QgZXhwZWN0ZWRfc2l6ZSkgeworICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgcmV0dXJuIFZQOExCaXRXcml0ZXJSZXNpemUoYncsIGV4cGVjdGVkX3NpemUpOworfQorCitpbnQgVlA4TEJpdFdyaXRlckNsb25lKGNvbnN0IFZQOExCaXRXcml0ZXIqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgZHN0KSB7CisgIGNvbnN0IHNpemVfdCBjdXJyZW50X3NpemUgPSBzcmMtPmN1cl8gLSBzcmMtPmJ1Zl87CisgIGFzc2VydChzcmMtPmN1cl8gPj0gc3JjLT5idWZfICYmIHNyYy0+Y3VyXyA8PSBzcmMtPmVuZF8pOworICBpZiAoIVZQOExCaXRXcml0ZXJSZXNpemUoZHN0LCBjdXJyZW50X3NpemUpKSByZXR1cm4gMDsKKyAgbWVtY3B5KGRzdC0+YnVmXywgc3JjLT5idWZfLCBjdXJyZW50X3NpemUpOworICBkc3QtPmJpdHNfID0gc3JjLT5iaXRzXzsKKyAgZHN0LT51c2VkXyA9IHNyYy0+dXNlZF87CisgIGRzdC0+ZXJyb3JfID0gc3JjLT5lcnJvcl87CisgIHJldHVybiAxOworfQorCit2b2lkIFZQOExCaXRXcml0ZXJXaXBlT3V0KFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIGlmIChidyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGJ3LT5idWZfKTsKKyAgICBtZW1zZXQoYncsIDAsIHNpemVvZigqYncpKTsKKyAgfQorfQorCit2b2lkIFZQOExCaXRXcml0ZXJSZXNldChjb25zdCBWUDhMQml0V3JpdGVyKiBjb25zdCBid19pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgYnctPmJpdHNfID0gYndfaW5pdC0+Yml0c187CisgIGJ3LT51c2VkXyA9IGJ3X2luaXQtPnVzZWRfOworICBidy0+Y3VyXyA9IGJ3LT5idWZfICsgKGJ3X2luaXQtPmN1cl8gLSBid19pbml0LT5idWZfKTsKKyAgYXNzZXJ0KGJ3LT5jdXJfIDw9IGJ3LT5lbmRfKTsKKyAgYnctPmVycm9yXyA9IGJ3X2luaXQtPmVycm9yXzsKK30KKwordm9pZCBWUDhMQml0V3JpdGVyU3dhcChWUDhMQml0V3JpdGVyKiBjb25zdCBzcmMsIFZQOExCaXRXcml0ZXIqIGNvbnN0IGRzdCkgeworICBjb25zdCBWUDhMQml0V3JpdGVyIHRtcCA9ICpzcmM7CisgICpzcmMgPSAqZHN0OworICAqZHN0ID0gdG1wOworfQorCit2b2lkIFZQOExQdXRCaXRzRmx1c2hCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIC8vIElmIG5lZWRlZCwgbWFrZSBzb21lIHJvb20gYnkgZmx1c2hpbmcgc29tZSBiaXRzIG91dC4KKyAgaWYgKGJ3LT5jdXJfICsgVlA4TF9XUklURVJfQllURVMgPiBidy0+ZW5kXykgeworICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAoYnctPmVuZF8gLSBidy0+YnVmXykgKyBNSU5fRVhUUkFfU0laRTsKKyAgICBpZiAoZXh0cmFfc2l6ZSAhPSAoc2l6ZV90KWV4dHJhX3NpemUgfHwKKyAgICAgICAgIVZQOExCaXRXcml0ZXJSZXNpemUoYncsIChzaXplX3QpZXh0cmFfc2l6ZSkpIHsKKyAgICAgIGJ3LT5jdXJfID0gYnctPmJ1Zl87CisgICAgICBidy0+ZXJyb3JfID0gMTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgKih2cDhsX3d0eXBlX3QqKWJ3LT5jdXJfID0gKHZwOGxfd3R5cGVfdClXU1dBUCgodnA4bF93dHlwZV90KWJ3LT5iaXRzXyk7CisgIGJ3LT5jdXJfICs9IFZQOExfV1JJVEVSX0JZVEVTOworICBidy0+Yml0c18gPj49IFZQOExfV1JJVEVSX0JJVFM7CisgIGJ3LT51c2VkXyAtPSBWUDhMX1dSSVRFUl9CSVRTOworfQorCit2b2lkIFZQOExQdXRCaXRzSW50ZXJuYWwoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHVpbnQzMl90IGJpdHMsIGludCBuX2JpdHMpIHsKKyAgYXNzZXJ0KG5fYml0cyA8PSAzMik7CisgIC8vIFRoYXQncyB0aGUgbWF4IHdlIGNhbiBoYW5kbGU6CisgIGFzc2VydChzaXplb2YodnA4bF93dHlwZV90KSA9PSAyKTsKKyAgaWYgKG5fYml0cyA+IDApIHsKKyAgICB2cDhsX2F0eXBlX3QgbGJpdHMgPSBidy0+Yml0c187CisgICAgaW50IHVzZWQgPSBidy0+dXNlZF87CisgICAgLy8gU3BlY2lhbCBjYXNlIG9mIG92ZXJmbG93IGhhbmRsaW5nIGZvciAzMmJpdCBhY2N1bXVsYXRvciAoMi1zdGVwcyBmbHVzaCkuCisjaWYgVlA4TF9XUklURVJfQklUUyA9PSAxNgorICAgIGlmICh1c2VkICsgbl9iaXRzID49IFZQOExfV1JJVEVSX01BWF9CSVRTKSB7CisgICAgICAvLyBGaWxsIHVwIGFsbCB0aGUgVlA4TF9XUklURVJfTUFYX0JJVFMgc28gaXQgY2FuIGJlIGZsdXNoZWQgb3V0IGJlbG93LgorICAgICAgY29uc3QgaW50IHNoaWZ0ID0gVlA4TF9XUklURVJfTUFYX0JJVFMgLSB1c2VkOworICAgICAgbGJpdHMgfD0gKHZwOGxfYXR5cGVfdCliaXRzIDw8IHVzZWQ7CisgICAgICB1c2VkID0gVlA4TF9XUklURVJfTUFYX0JJVFM7CisgICAgICBuX2JpdHMgLT0gc2hpZnQ7CisgICAgICBiaXRzID4+PSBzaGlmdDsKKyAgICAgIGFzc2VydChuX2JpdHMgPD0gVlA4TF9XUklURVJfTUFYX0JJVFMpOworICAgIH0KKyNlbmRpZgorICAgIC8vIElmIG5lZWRlZCwgbWFrZSBzb21lIHJvb20gYnkgZmx1c2hpbmcgc29tZSBiaXRzIG91dC4KKyAgICB3aGlsZSAodXNlZCA+PSBWUDhMX1dSSVRFUl9CSVRTKSB7CisgICAgICBpZiAoYnctPmN1cl8gKyBWUDhMX1dSSVRFUl9CWVRFUyA+IGJ3LT5lbmRfKSB7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGV4dHJhX3NpemUgPSAoYnctPmVuZF8gLSBidy0+YnVmXykgKyBNSU5fRVhUUkFfU0laRTsKKyAgICAgICAgaWYgKGV4dHJhX3NpemUgIT0gKHNpemVfdClleHRyYV9zaXplIHx8CisgICAgICAgICAgICAhVlA4TEJpdFdyaXRlclJlc2l6ZShidywgKHNpemVfdClleHRyYV9zaXplKSkgeworICAgICAgICAgIGJ3LT5jdXJfID0gYnctPmJ1Zl87CisgICAgICAgICAgYnctPmVycm9yXyA9IDE7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICB9CisgICAgICAqKHZwOGxfd3R5cGVfdCopYnctPmN1cl8gPSAodnA4bF93dHlwZV90KVdTV0FQKCh2cDhsX3d0eXBlX3QpbGJpdHMpOworICAgICAgYnctPmN1cl8gKz0gVlA4TF9XUklURVJfQllURVM7CisgICAgICBsYml0cyA+Pj0gVlA4TF9XUklURVJfQklUUzsKKyAgICAgIHVzZWQgLT0gVlA4TF9XUklURVJfQklUUzsKKyAgICB9CisgICAgYnctPmJpdHNfID0gbGJpdHMgfCAoKHZwOGxfYXR5cGVfdCliaXRzIDw8IHVzZWQpOworICAgIGJ3LT51c2VkXyA9IHVzZWQgKyBuX2JpdHM7CisgIH0KK30KKwordWludDhfdCogVlA4TEJpdFdyaXRlckZpbmlzaChWUDhMQml0V3JpdGVyKiBjb25zdCBidykgeworICAvLyBmbHVzaCBsZWZ0b3ZlciBiaXRzCisgIGlmIChWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoYnctPnVzZWRfICsgNykgPj4gMykpIHsKKyAgICB3aGlsZSAoYnctPnVzZWRfID4gMCkgeworICAgICAgKmJ3LT5jdXJfKysgPSAodWludDhfdClidy0+Yml0c187CisgICAgICBidy0+Yml0c18gPj49IDg7CisgICAgICBidy0+dXNlZF8gLT0gODsKKyAgICB9CisgICAgYnctPnVzZWRfID0gMDsKKyAgfQorICByZXR1cm4gYnctPmJ1Zl87Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvYml0X3dyaXRlcl91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2Y1OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2JpdF93cml0ZXJfdXRpbHMuaApAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX0JJVF9XUklURVJfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19CSVRfV1JJVEVSX1VUSUxTX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCaXQtd3JpdGluZworCit0eXBlZGVmIHN0cnVjdCBWUDhCaXRXcml0ZXIgVlA4Qml0V3JpdGVyOworc3RydWN0IFZQOEJpdFdyaXRlciB7CisgIGludDMyX3QgIHJhbmdlXzsgICAgICAvLyByYW5nZS0xCisgIGludDMyX3QgIHZhbHVlXzsKKyAgaW50ICAgICAgcnVuXzsgICAgICAgIC8vIG51bWJlciBvZiBvdXRzdGFuZGluZyBiaXRzCisgIGludCAgICAgIG5iX2JpdHNfOyAgICAvLyBudW1iZXIgb2YgcGVuZGluZyBiaXRzCisgIHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIuIFJlLWFsbG9jYXRlZCByZWd1bGFybHkuIE5vdCBvd25lZC4KKyAgc2l6ZV90ICAgcG9zXzsKKyAgc2l6ZV90ICAgbWF4X3Bvc187CisgIGludCAgICAgIGVycm9yXzsgICAgICAvLyB0cnVlIGluIGNhc2Ugb2YgZXJyb3IKK307CisKKy8vIEluaXRpYWxpemUgdGhlIG9iamVjdC4gQWxsb2NhdGVzIHNvbWUgaW5pdGlhbCBtZW1vcnkgYmFzZWQgb24gZXhwZWN0ZWRfc2l6ZS4KK2ludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKKy8vIEZpbmFsaXplIHRoZSBiaXRzdHJlYW0gY29kaW5nLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgordWludDhfdCogVlA4Qml0V3JpdGVyRmluaXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpOworLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBtZW1vcnkgYW5kIHplcm9lcyB0aGUgb2JqZWN0LiBOb3QgYSBtYW5kYXRvcnkgY2FsbC4KKy8vIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgZXJyb3IsIHdoZW4gdGhlIGludGVybmFsIGJ1ZmZlciBoYXNuJ3QgYmVlbiBncmFiYmVkIQordm9pZCBWUDhCaXRXcml0ZXJXaXBlT3V0KFZQOEJpdFdyaXRlciogY29uc3QgYncpOworCitpbnQgVlA4UHV0Qml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQsIGludCBwcm9iKTsKK2ludCBWUDhQdXRCaXRVbmlmb3JtKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQpOwordm9pZCBWUDhQdXRCaXRzKFZQOEJpdFdyaXRlciogY29uc3QgYncsIHVpbnQzMl90IHZhbHVlLCBpbnQgbmJfYml0cyk7Cit2b2lkIFZQOFB1dFNpZ25lZEJpdHMoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cyk7CisKKy8vIEFwcGVuZHMgc29tZSBieXRlcyB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLiBEYXRhIGlzIGNvcGllZC4KK2ludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisvLyByZXR1cm4gYXBwcm94aW1hdGUgd3JpdGUgcG9zaXRpb24gKGluIGJpdHMpCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgVlA4Qml0V3JpdGVyUG9zKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKKyAgY29uc3QgdWludDY0X3QgbmJfYml0cyA9IDggKyBidy0+bmJfYml0c187ICAgLy8gYnctPm5iX2JpdHNfIGlzIDw9IDAsIG5vdGUKKyAgcmV0dXJuIChidy0+cG9zXyArIGJ3LT5ydW5fKSAqIDggKyBuYl9iaXRzOworfQorCisvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QqIFZQOEJpdFdyaXRlckJ1Zihjb25zdCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIHJldHVybiBidy0+YnVmXzsKK30KKy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlci4KK3N0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgVlA4Qml0V3JpdGVyU2l6ZShjb25zdCBWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIHJldHVybiBidy0+cG9zXzsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFZQOExCaXRXcml0ZXIKKworI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpICAgLy8gNjRiaXQKK3R5cGVkZWYgdWludDY0X3QgdnA4bF9hdHlwZV90OyAgIC8vIGFjY3VtdWxhdG9yIHR5cGUKK3R5cGVkZWYgdWludDMyX3QgdnA4bF93dHlwZV90OyAgIC8vIHdyaXRpbmcgdHlwZQorI2RlZmluZSBXU1dBUCBIVG9MRTMyCisjZGVmaW5lIFZQOExfV1JJVEVSX0JZVEVTICAgIDQgICAvLyBzaXplb2YodnA4bF93dHlwZV90KQorI2RlZmluZSBWUDhMX1dSSVRFUl9CSVRTICAgICAzMiAgLy8gOCAqIHNpemVvZih2cDhsX3d0eXBlX3QpCisjZGVmaW5lIFZQOExfV1JJVEVSX01BWF9CSVRTIDY0ICAvLyA4ICogc2l6ZW9mKHZwOGxfYXR5cGVfdCkKKyNlbHNlCit0eXBlZGVmIHVpbnQzMl90IHZwOGxfYXR5cGVfdDsKK3R5cGVkZWYgdWludDE2X3QgdnA4bF93dHlwZV90OworI2RlZmluZSBXU1dBUCBIVG9MRTE2CisjZGVmaW5lIFZQOExfV1JJVEVSX0JZVEVTICAgIDIKKyNkZWZpbmUgVlA4TF9XUklURVJfQklUUyAgICAgMTYKKyNkZWZpbmUgVlA4TF9XUklURVJfTUFYX0JJVFMgMzIKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCB7CisgIHZwOGxfYXR5cGVfdCBiaXRzXzsgICAvLyBiaXQgYWNjdW11bGF0b3IKKyAgaW50ICAgICAgICAgIHVzZWRfOyAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgaW4gYWNjdW11bGF0b3IKKyAgdWludDhfdCogICAgIGJ1Zl87ICAgIC8vIHN0YXJ0IG9mIGJ1ZmZlcgorICB1aW50OF90KiAgICAgY3VyXzsgICAgLy8gY3VycmVudCB3cml0ZSBwb3NpdGlvbgorICB1aW50OF90KiAgICAgZW5kXzsgICAgLy8gZW5kIG9mIGJ1ZmZlcgorCisgIC8vIEFmdGVyIGFsbCBiaXRzIGFyZSB3cml0dGVuIChWUDhMQml0V3JpdGVyRmluaXNoKCkpLCB0aGUgY2FsbGVyIG11c3Qgb2JzZXJ2ZQorICAvLyB0aGUgc3RhdGUgb2YgZXJyb3JfLiBBIHZhbHVlIG9mIDEgaW5kaWNhdGVzIHRoYXQgYSBtZW1vcnkgYWxsb2NhdGlvbgorICAvLyBmYWlsdXJlIGhhcyBoYXBwZW5lZCBkdXJpbmcgYml0IHdyaXRpbmcuIEEgdmFsdWUgb2YgMCBpbmRpY2F0ZXMgc3VjY2Vzc2Z1bAorICAvLyB3cml0aW5nIG9mIGJpdHMuCisgIGludCBlcnJvcl87Cit9IFZQOExCaXRXcml0ZXI7CisKK3N0YXRpYyBXRUJQX0lOTElORSBzaXplX3QgVlA4TEJpdFdyaXRlck51bUJ5dGVzKGNvbnN0IFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7CisgIHJldHVybiAoYnctPmN1cl8gLSBidy0+YnVmXykgKyAoKGJ3LT51c2VkXyArIDcpID4+IDMpOworfQorCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCitpbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK2ludCBWUDhMQml0V3JpdGVyQ2xvbmUoY29uc3QgVlA4TEJpdFdyaXRlciogY29uc3Qgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICBWUDhMQml0V3JpdGVyKiBjb25zdCBkc3QpOworLy8gRmluYWxpemUgdGhlIGJpdHN0cmVhbSBjb2RpbmcuIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBidWZmZXIuCit1aW50OF90KiBWUDhMQml0V3JpdGVyRmluaXNoKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKy8vIFJlbGVhc2UgYW55IHBlbmRpbmcgbWVtb3J5IGFuZCB6ZXJvZXMgdGhlIG9iamVjdC4KK3ZvaWQgVlA4TEJpdFdyaXRlcldpcGVPdXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncpOworLy8gUmVzZXRzIHRoZSBjdXJzb3Igb2YgdGhlIEJpdFdyaXRlciBidyB0byB3aGVuIGl0IHdhcyBsaWtlIGluIGJ3X2luaXQuCit2b2lkIFZQOExCaXRXcml0ZXJSZXNldChjb25zdCBWUDhMQml0V3JpdGVyKiBjb25zdCBid19pbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgVlA4TEJpdFdyaXRlciogY29uc3QgYncpOworLy8gU3dhcHMgdGhlIG1lbW9yeSBoZWxkIGJ5IHR3byBCaXRXcml0ZXJzLgordm9pZCBWUDhMQml0V3JpdGVyU3dhcChWUDhMQml0V3JpdGVyKiBjb25zdCBzcmMsIFZQOExCaXRXcml0ZXIqIGNvbnN0IGRzdCk7CisKKy8vIEludGVybmFsIGZ1bmN0aW9uIGZvciBWUDhMUHV0Qml0cyBmbHVzaGluZyAzMiBiaXRzIGZyb20gdGhlIHdyaXR0ZW4gc3RhdGUuCit2b2lkIFZQOExQdXRCaXRzRmx1c2hCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KTsKKworLy8gUHV0Qml0cyBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGluIHRoZSAxNiBiaXQgdnA4bF93dHlwZV90IGNhc2UuCit2b2lkIFZQOExQdXRCaXRzSW50ZXJuYWwoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHVpbnQzMl90IGJpdHMsIGludCBuX2JpdHMpOworCisvLyBUaGlzIGZ1bmN0aW9uIHdyaXRlcyBiaXRzIGludG8gYnl0ZXMgaW4gaW5jcmVhc2luZyBhZGRyZXNzZXMgKGxpdHRsZSBlbmRpYW4pLAorLy8gYW5kIHdpdGhpbiBhIGJ5dGUgbGVhc3Qtc2lnbmlmaWNhbnQtYml0IGZpcnN0LgorLy8gVGhpcyBmdW5jdGlvbiBjYW4gd3JpdGUgdXAgdG8gMzIgYml0cyBpbiBvbmUgZ28sIGJ1dCBWUDhMQml0UmVhZGVyIGNhbiBvbmx5CisvLyByZWFkIDI0IGJpdHMgbWF4IChWUDhMX01BWF9OVU1fQklUX1JFQUQpLgorLy8gVlA4TEJpdFdyaXRlcidzIGVycm9yXyBmbGFnIGlzIHNldCBpbiBjYXNlIG9mICBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExQdXRCaXRzKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYml0cywgaW50IG5fYml0cykgeworICBpZiAoc2l6ZW9mKHZwOGxfd3R5cGVfdCkgPT0gNCkgeworICAgIGlmIChuX2JpdHMgPiAwKSB7CisgICAgICBpZiAoYnctPnVzZWRfID49IDMyKSB7CisgICAgICAgIFZQOExQdXRCaXRzRmx1c2hCaXRzKGJ3KTsKKyAgICAgIH0KKyAgICAgIGJ3LT5iaXRzXyB8PSAodnA4bF9hdHlwZV90KWJpdHMgPDwgYnctPnVzZWRfOworICAgICAgYnctPnVzZWRfICs9IG5fYml0czsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgVlA4TFB1dEJpdHNJbnRlcm5hbChidywgYml0cywgbl9iaXRzKTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19CSVRfV1JJVEVSX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9jb2xvcl9jYWNoZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmMKaW5kZXggYTlhMGQyYS4uZWU1NDgxMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvY29sb3JfY2FjaGVfdXRpbHMuYwpAQCAtMTIsNDEgKzEyLDQ0IEBACiAvLyBBdXRob3I6IEp5cmtpIEFsYWt1aWphbGEgKGp5cmtpQGdvb2dsZS5jb20pCiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL2Fzc2VydF9wb2VtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkbGliX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogI2Vsc2UKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KICNlbmRpZgotCi0jaW5jbHVkZSAiLi9jb2xvcl9jYWNoZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVlA4TENvbG9yQ2FjaGUuCiAKIGludCBWUDhMQ29sb3JDYWNoZUluaXQoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjLCBpbnQgaGFzaF9iaXRzKSB7CiAgIGNvbnN0IGludCBoYXNoX3NpemUgPSAxIDw8IGhhc2hfYml0czsKLSAgU0JfRENIRUNLKGNjICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soaGFzaF9iaXRzID4gMCk7CisgIGFzc2VydChjYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGhhc2hfYml0cyA+IDApOwogICBjYy0+Y29sb3JzXyA9ICh1aW50MzJfdCopV2ViUFNhZmVDYWxsb2MoKHVpbnQ2NF90KWhhc2hfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqY2MtPmNvbG9yc18pKTsKICAgaWYgKGNjLT5jb2xvcnNfID09IE5VTEwpIHJldHVybiAwOwogICBjYy0+aGFzaF9zaGlmdF8gPSAzMiAtIGhhc2hfYml0czsKKyAgY2MtPmhhc2hfYml0c18gPSBoYXNoX2JpdHM7CiAgIHJldHVybiAxOwogfQogCiB2b2lkIFZQOExDb2xvckNhY2hlQ2xlYXIoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNjKSB7CiAgIGlmIChjYyAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKGNjLT5jb2xvcnNfKTsKKyAgICBXZWJQU2FmZUZyZWUoY2MtPmNvbG9yc18pOwogICAgIGNjLT5jb2xvcnNfID0gTlVMTDsKICAgfQogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQordm9pZCBWUDhMQ29sb3JDYWNoZUNvcHkoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBkc3QpIHsKKyAgYXNzZXJ0KHNyYyAhPSBOVUxMKTsKKyAgYXNzZXJ0KGRzdCAhPSBOVUxMKTsKKyAgYXNzZXJ0KHNyYy0+aGFzaF9iaXRzXyA9PSBkc3QtPmhhc2hfYml0c18pOworICBtZW1jcHkoZHN0LT5jb2xvcnNfLCBzcmMtPmNvbG9yc18sCisgICAgICAgICAoKHNpemVfdCkxdSA8PCBkc3QtPmhhc2hfYml0c18pICogc2l6ZW9mKCpkc3QtPmNvbG9yc18pKTsKIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvY29sb3JfY2FjaGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oCmluZGV4IDQ4NzZiZDQuLjQ0Y2FjOGMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2NvbG9yX2NhY2hlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2NvbG9yX2NhY2hlX3V0aWxzLmgKQEAgLTEyLDQ4ICsxMiw2MiBAQAogLy8gQXV0aG9yczogSnlya2kgQWxha3VpamFsYSAoanlya2lAZ29vZ2xlLmNvbSkKIC8vICAgICAgICAgIFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCiAKLSNpZm5kZWYgV0VCUF9VVElMU19DT0xPUl9DQUNIRV9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0NPTE9SX0NBQ0hFX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCisjaWZuZGVmIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19DT0xPUl9DQUNIRV9VVElMU19IXwogCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNlbmRpZgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIAogLy8gTWFpbiBjb2xvciBjYWNoZSBzdHJ1Y3QuCiB0eXBlZGVmIHN0cnVjdCB7CiAgIHVpbnQzMl90ICpjb2xvcnNfOyAgLy8gY29sb3IgZW50cmllcwotICBpbnQgaGFzaF9zaGlmdF87ICAgIC8vIEhhc2ggc2hpZnQ6IDMyIC0gaGFzaF9iaXRzLgorICBpbnQgaGFzaF9zaGlmdF87ICAgIC8vIEhhc2ggc2hpZnQ6IDMyIC0gaGFzaF9iaXRzXy4KKyAgaW50IGhhc2hfYml0c187CiB9IFZQOExDb2xvckNhY2hlOwogCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga0hhc2hNdWwgPSAweDFlMzVhN2JkOworc3RhdGljIGNvbnN0IHVpbnQ2NF90IGtIYXNoTXVsID0gMHgxZTM1YTdiZHVsbDsKKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhMSGFzaFBpeCh1aW50MzJfdCBhcmdiLCBpbnQgc2hpZnQpIHsKKyAgcmV0dXJuIChpbnQpKCgoYXJnYiAqIGtIYXNoTXVsKSAmIDB4ZmZmZmZmZmZ1KSA+PiBzaGlmdCk7Cit9CiAKIHN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhMQ29sb3JDYWNoZUxvb2t1cCgKICAgICBjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsIHVpbnQzMl90IGtleSkgewotICBTQl9EQ0hFQ0soa2V5IDw9ICh+MFUgPj4gY2MtPmhhc2hfc2hpZnRfKSk7CisgIFNCX0RDSEVDSygoa2V5ID4+IGNjLT5oYXNoX2JpdHNfKSA9PSAwdSk7CiAgIHJldHVybiBjYy0+Y29sb3JzX1trZXldOwogfQogCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMQ29sb3JDYWNoZVNldChjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBrZXksIHVpbnQzMl90IGFyZ2IpIHsKKyAgU0JfRENIRUNLKChrZXkgPj4gY2MtPmhhc2hfYml0c18pID09IDB1KTsKKyAgY2MtPmNvbG9yc19ba2V5XSA9IGFyZ2I7Cit9CisKIHN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExDb2xvckNhY2hlSW5zZXJ0KGNvbnN0IFZQOExDb2xvckNhY2hlKiBjb25zdCBjYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFyZ2IpIHsKLSAgY29uc3QgdWludDMyX3Qga2V5ID0gKGtIYXNoTXVsICogYXJnYikgPj4gY2MtPmhhc2hfc2hpZnRfOworICBjb25zdCBpbnQga2V5ID0gVlA4TEhhc2hQaXgoYXJnYiwgY2MtPmhhc2hfc2hpZnRfKTsKICAgY2MtPmNvbG9yc19ba2V5XSA9IGFyZ2I7CiB9CiAKIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TENvbG9yQ2FjaGVHZXRJbmRleChjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgewotICByZXR1cm4gKGtIYXNoTXVsICogYXJnYikgPj4gY2MtPmhhc2hfc2hpZnRfOworICByZXR1cm4gVlA4TEhhc2hQaXgoYXJnYiwgY2MtPmhhc2hfc2hpZnRfKTsKIH0KIAorLy8gUmV0dXJuIHRoZSBrZXkgaWYgY2MgY29udGFpbnMgYXJnYiwgYW5kIC0xIG90aGVyd2lzZS4KIHN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4TENvbG9yQ2FjaGVDb250YWlucyhjb25zdCBWUDhMQ29sb3JDYWNoZSogY29uc3QgY2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYXJnYikgewotICBjb25zdCB1aW50MzJfdCBrZXkgPSAoa0hhc2hNdWwgKiBhcmdiKSA+PiBjYy0+aGFzaF9zaGlmdF87Ci0gIHJldHVybiBjYy0+Y29sb3JzX1trZXldID09IGFyZ2I7CisgIGNvbnN0IGludCBrZXkgPSBWUDhMSGFzaFBpeChhcmdiLCBjYy0+aGFzaF9zaGlmdF8pOworICByZXR1cm4gKGNjLT5jb2xvcnNfW2tleV0gPT0gYXJnYikgPyBrZXkgOiAtMTsKIH0KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTYyLDEzICs3NiwxNiBAQAogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KIGludCBWUDhMQ29sb3JDYWNoZUluaXQoVlA4TENvbG9yQ2FjaGUqIGNvbnN0IGNvbG9yX2NhY2hlLCBpbnQgaGFzaF9iaXRzKTsKIAordm9pZCBWUDhMQ29sb3JDYWNoZUNvcHkoY29uc3QgVlA4TENvbG9yQ2FjaGUqIGNvbnN0IHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIFZQOExDb2xvckNhY2hlKiBjb25zdCBkc3QpOworCiAvLyBEZWxldGUgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHRvIGNvbG9yIGNhY2hlLgogdm9pZCBWUDhMQ29sb3JDYWNoZUNsZWFyKFZQOExDb2xvckNhY2hlKiBjb25zdCBjb2xvcl9jYWNoZSk7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgogCi0jZW5kaWYgIC8vIFdFQlBfVVRJTFNfQ09MT1JfQ0FDSEVfSF8KKyNlbmRpZiAgLy8gV0VCUF9VVElMU19DT0xPUl9DQUNIRV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2VuZGlhbl9pbmxfdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhOWZiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9lbmRpYW5faW5sX3V0aWxzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBFbmRpYW4gcmVsYXRlZCBmdW5jdGlvbnMuCisKKyNpZm5kZWYgV0VCUF9VVElMU19FTkRJQU5fSU5MX1VUSUxTX0hfCisjZGVmaW5lIFdFQlBfVVRJTFNfRU5ESUFOX0lOTF9VVElMU19IXworCisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSAic3RhcmJvYXJkL2J5dGVfc3dhcC5oIgorI2VuZGlmCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjaW5jbHVkZSAic3JjL3dlYnAvY29uZmlnLmgiCisjZW5kaWYKKworI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmIGRlZmluZWQoV09SRFNfQklHRU5ESUFOKQorI2RlZmluZSBIVG9MRTMyIEJTd2FwMzIKKyNkZWZpbmUgSFRvTEUxNiBCU3dhcDE2CisjZWxzZQorI2RlZmluZSBIVG9MRTMyKHgpICh4KQorI2RlZmluZSBIVG9MRTE2KHgpICh4KQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChIQVZFX0NPTkZJR19IKQorI2lmIExPQ0FMX0dDQ19QUkVSRVEoNCw4KSB8fCBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9ic3dhcDE2KQorI2RlZmluZSBIQVZFX0JVSUxUSU5fQlNXQVAxNgorI2VuZGlmCisjaWYgTE9DQUxfR0NDX1BSRVJFUSg0LDMpIHx8IF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Jzd2FwMzIpCisjZGVmaW5lIEhBVkVfQlVJTFRJTl9CU1dBUDMyCisjZW5kaWYKKyNpZiBMT0NBTF9HQ0NfUFJFUkVRKDQsMykgfHwgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fYnN3YXA2NCkKKyNkZWZpbmUgSEFWRV9CVUlMVElOX0JTV0FQNjQKKyNlbmRpZgorI2VuZGlmICAvLyAhSEFWRV9DT05GSUdfSAorCitzdGF0aWMgV0VCUF9JTkxJTkUgdWludDE2X3QgQlN3YXAxNih1aW50MTZfdCB4KSB7CisjaWYgZGVmaW5lZChTVEFSQk9BUkQpCisgIHJldHVybiBTYkJ5dGVTd2FwVTE2KHgpOworI2Vsc2UKKyNpZiBkZWZpbmVkKEhBVkVfQlVJTFRJTl9CU1dBUDE2KQorICByZXR1cm4gX19idWlsdGluX2Jzd2FwMTYoeCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gX2J5dGVzd2FwX3VzaG9ydCh4KTsKKyNlbHNlCisgIC8vIGdjYyB3aWxsIHJlY29nbml6ZSBhICdyb3J3ICQ4LCAuLi4nIGhlcmU6CisgIHJldHVybiAoeCA+PiA4KSB8ICgoeCAmIDB4ZmYpIDw8IDgpOworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVAxNgorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEJTd2FwMzIodWludDMyX3QgeCkgeworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICByZXR1cm4gU2JCeXRlU3dhcFUzMih4KTsKKyNlbHNlCisjaWYgZGVmaW5lZChXRUJQX1VTRV9NSVBTMzJfUjIpCisgIHVpbnQzMl90IHJldDsKKyAgX19hc21fXyB2b2xhdGlsZSAoCisgICAgIndzYmggICAlW3JldF0sICVbeF0gICAgICAgICAgXG5cdCIKKyAgICAicm90ciAgICVbcmV0XSwgJVtyZXRdLCAgMTYgICBcblx0IgorICAgIDogW3JldF0iPXIiKHJldCkKKyAgICA6IFt4XSJyIih4KQorICApOworICByZXR1cm4gcmV0OworI2VsaWYgZGVmaW5lZChIQVZFX0JVSUxUSU5fQlNXQVAzMikKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDMyKHgpOworI2VsaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQorICB1aW50MzJfdCBzd2FwcGVkX2J5dGVzOworICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcCAlMCIgOiAiPXIiKHN3YXBwZWRfYnl0ZXMpIDogIjAiKHgpKTsKKyAgcmV0dXJuIHN3YXBwZWRfYnl0ZXM7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICByZXR1cm4gKHVpbnQzMl90KV9ieXRlc3dhcF91bG9uZyh4KTsKKyNlbHNlCisgIHJldHVybiAoeCA+PiAyNCkgfCAoKHggPj4gOCkgJiAweGZmMDApIHwgKCh4IDw8IDgpICYgMHhmZjAwMDApIHwgKHggPDwgMjQpOworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVAzMgorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ2NF90IEJTd2FwNjQodWludDY0X3QgeCkgeworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorICByZXR1cm4gU2JCeXRlU3dhcFU2NCh4KTsKKyNlbHNlCisjaWYgZGVmaW5lZChIQVZFX0JVSUxUSU5fQlNXQVA2NCkKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDY0KHgpOworI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorICB1aW50NjRfdCBzd2FwcGVkX2J5dGVzOworICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcHEgJTAiIDogIj1yIihzd2FwcGVkX2J5dGVzKSA6ICIwIih4KSk7CisgIHJldHVybiBzd2FwcGVkX2J5dGVzOworI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyAgcmV0dXJuICh1aW50NjRfdClfYnl0ZXN3YXBfdWludDY0KHgpOworI2Vsc2UgIC8vIGdlbmVyaWMgY29kZSBmb3Igc3dhcHBpbmcgNjQtYml0IHZhbHVlcyAoc3VnZ2VzdGVkIGJ5IGJkYkApCisgIHggPSAoKHggJiAweGZmZmZmZmZmMDAwMDAwMDB1bGwpID4+IDMyKSB8ICgoeCAmIDB4MDAwMDAwMDBmZmZmZmZmZnVsbCkgPDwgMzIpOworICB4ID0gKCh4ICYgMHhmZmZmMDAwMGZmZmYwMDAwdWxsKSA+PiAxNikgfCAoKHggJiAweDAwMDBmZmZmMDAwMGZmZmZ1bGwpIDw8IDE2KTsKKyAgeCA9ICgoeCAmIDB4ZmYwMGZmMDBmZjAwZmYwMHVsbCkgPj4gIDgpIHwgKCh4ICYgMHgwMGZmMDBmZjAwZmYwMGZmdWxsKSA8PCAgOCk7CisgIHJldHVybiB4OworI2VuZGlmICAvLyBIQVZFX0JVSUxUSU5fQlNXQVA2NAorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKK30KKworI2VuZGlmICAvLyBXRUJQX1VUSUxTX0VORElBTl9JTkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYzJjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBmaWx0ZXIgZXN0aW1hdGlvbgorLy8KKy8vIEF1dGhvcjogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKKworI2luY2x1ZGUgInNyYy91dGlscy9maWx0ZXJzX3V0aWxzLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBRdWljayBlc3RpbWF0ZSBvZiBhIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIGZpbHRlciBtb2RlIHRvIHRyeS4KKworI2RlZmluZSBTTUFYIDE2CisjZGVmaW5lIFNESUZGKGEsIGIpIChhYnMoKGEpIC0gKGIpKSA+PiA0KSAgIC8vIFNjb3JpbmcgZGlmZiwgaW4gWzAuLlNNQVgpCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgR3JhZGllbnRQcmVkaWN0b3IodWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykgeworICBjb25zdCBpbnQgZyA9IGEgKyBiIC0gYzsKKyAgcmV0dXJuICgoZyAmIH4weGZmKSA9PSAwKSA/IGcgOiAoZyA8IDApID8gMCA6IDI1NTsgIC8vIGNsaXAgdG8gOGJpdAorfQorCitXRUJQX0ZJTFRFUl9UWVBFIFdlYlBFc3RpbWF0ZUJlc3RGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgaW50IGksIGo7CisgIGludCBiaW5zW1dFQlBfRklMVEVSX0xBU1RdW1NNQVhdOworICBtZW1zZXQoYmlucywgMCwgc2l6ZW9mKGJpbnMpKTsKKworICAvLyBXZSBvbmx5IHNhbXBsZSBldmVyeSBvdGhlciBwaXhlbHMuIFRoYXQncyBlbm91Z2guCisgIGZvciAoaiA9IDI7IGogPCBoZWlnaHQgLSAxOyBqICs9IDIpIHsKKyAgICBjb25zdCB1aW50OF90KiBjb25zdCBwID0gZGF0YSArIGogKiBzdHJpZGU7CisgICAgaW50IG1lYW4gPSBwWzBdOworICAgIGZvciAoaSA9IDI7IGkgPCB3aWR0aCAtIDE7IGkgKz0gMikgeworICAgICAgY29uc3QgaW50IGRpZmYwID0gU0RJRkYocFtpXSwgbWVhbik7CisgICAgICBjb25zdCBpbnQgZGlmZjEgPSBTRElGRihwW2ldLCBwW2kgLSAxXSk7CisgICAgICBjb25zdCBpbnQgZGlmZjIgPSBTRElGRihwW2ldLCBwW2kgLSB3aWR0aF0pOworICAgICAgY29uc3QgaW50IGdyYWRfcHJlZCA9CisgICAgICAgICAgR3JhZGllbnRQcmVkaWN0b3IocFtpIC0gMV0sIHBbaSAtIHdpZHRoXSwgcFtpIC0gd2lkdGggLSAxXSk7CisgICAgICBjb25zdCBpbnQgZGlmZjMgPSBTRElGRihwW2ldLCBncmFkX3ByZWQpOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9OT05FXVtkaWZmMF0gPSAxOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9IT1JJWk9OVEFMXVtkaWZmMV0gPSAxOworICAgICAgYmluc1tXRUJQX0ZJTFRFUl9WRVJUSUNBTF1bZGlmZjJdID0gMTsKKyAgICAgIGJpbnNbV0VCUF9GSUxURVJfR1JBRElFTlRdW2RpZmYzXSA9IDE7CisgICAgICBtZWFuID0gKDMgKiBtZWFuICsgcFtpXSArIDIpID4+IDI7CisgICAgfQorICB9CisgIHsKKyAgICBpbnQgZmlsdGVyOworICAgIFdFQlBfRklMVEVSX1RZUEUgYmVzdF9maWx0ZXIgPSBXRUJQX0ZJTFRFUl9OT05FOworICAgIGludCBiZXN0X3Njb3JlID0gMHg3ZmZmZmZmZjsKKyAgICBmb3IgKGZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7IGZpbHRlciA8IFdFQlBfRklMVEVSX0xBU1Q7ICsrZmlsdGVyKSB7CisgICAgICBpbnQgc2NvcmUgPSAwOworICAgICAgZm9yIChpID0gMDsgaSA8IFNNQVg7ICsraSkgeworICAgICAgICBpZiAoYmluc1tmaWx0ZXJdW2ldID4gMCkgeworICAgICAgICAgIHNjb3JlICs9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzY29yZSA8IGJlc3Rfc2NvcmUpIHsKKyAgICAgICAgYmVzdF9zY29yZSA9IHNjb3JlOworICAgICAgICBiZXN0X2ZpbHRlciA9IChXRUJQX0ZJTFRFUl9UWVBFKWZpbHRlcjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJlc3RfZmlsdGVyOworICB9Cit9CisKKyN1bmRlZiBTTUFYCisjdW5kZWYgU0RJRkYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9maWx0ZXJzX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGYyZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvZmlsdGVyc191dGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCisvLworLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfRklMVEVSU19VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0ZJTFRFUlNfVVRJTFNfSF8KKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBGYXN0IGVzdGltYXRlIG9mIGEgcG90ZW50aWFsbHkgZ29vZCBmaWx0ZXIuCitXRUJQX0ZJTFRFUl9UWVBFIFdlYlBFc3RpbWF0ZUJlc3RGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19GSUxURVJTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuX2VuY29kZS5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmMKaW5kZXggYjY2ZGQ0MS4uNmYzYjFiYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl9lbmNvZGVfdXRpbHMuYwpAQCAtMTEsMTggKzExLDEyIEBACiAvLwogLy8gRW50cm9weSBlbmNvZGluZyAoSHVmZm1hbikgZm9yIHdlYnAgbG9zc2xlc3MuCiAKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9odWZmbWFuX2VuY29kZS5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3V0aWxzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvZm9ybWF0X2NvbnN0YW50cy5oIgogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVXRpbCBmdW5jdGlvbiB0byBvcHRpbWl6ZSB0aGUgc3ltYm9sIG1hcCBmb3IgUkxFIGNvZGluZwpAQCAtMzMsMTQgKzI3LDE0IEBACiB9CiAKIC8vIENoYW5nZSB0aGUgcG9wdWxhdGlvbiBjb3VudHMgaW4gYSB3YXkgdGhhdCB0aGUgY29uc2VxdWVudAotLy8gSHVmbWFubiB0cmVlIGNvbXByZXNzaW9uLCBlc3BlY2lhbGx5IGl0cyBSTEUtcGFydCwgZ2l2ZSBzbWFsbGVyIG91dHB1dC4KLXN0YXRpYyBpbnQgT3B0aW1pemVIdWZmbWFuRm9yUmxlKGludCBsZW5ndGgsIGludCogY29uc3QgY291bnRzKSB7Ci0gIHVpbnQ4X3QqIGdvb2RfZm9yX3JsZTsKKy8vIEh1ZmZtYW4gdHJlZSBjb21wcmVzc2lvbiwgZXNwZWNpYWxseSBpdHMgUkxFLXBhcnQsIGdpdmUgc21hbGxlciBvdXRwdXQuCitzdGF0aWMgdm9pZCBPcHRpbWl6ZUh1ZmZtYW5Gb3JSbGUoaW50IGxlbmd0aCwgdWludDhfdCogY29uc3QgZ29vZF9mb3JfcmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjb25zdCBjb3VudHMpIHsKICAgLy8gMSkgTGV0J3MgbWFrZSB0aGUgSHVmZm1hbiBjb2RlIG1vcmUgY29tcGF0aWJsZSB3aXRoIHJsZSBlbmNvZGluZy4KICAgaW50IGk7CiAgIGZvciAoOyBsZW5ndGggPj0gMDsgLS1sZW5ndGgpIHsKICAgICBpZiAobGVuZ3RoID09IDApIHsKLSAgICAgIHJldHVybiAxOyAgLy8gQWxsIHplcm9zLgorICAgICAgcmV0dXJuOyAgLy8gQWxsIHplcm9zLgogICAgIH0KICAgICBpZiAoY291bnRzW2xlbmd0aCAtIDFdICE9IDApIHsKICAgICAgIC8vIE5vdyBjb3VudHNbMC4ubGVuZ3RoIC0gMV0gZG9lcyBub3QgaGF2ZSB0cmFpbGluZyB6ZXJvcy4KQEAgLTQ5LDE1ICs0MywxMSBAQAogICB9CiAgIC8vIDIpIExldCdzIG1hcmsgYWxsIHBvcHVsYXRpb24gY291bnRzIHRoYXQgYWxyZWFkeSBjYW4gYmUgZW5jb2RlZAogICAvLyB3aXRoIGFuIHJsZSBjb2RlLgotICBnb29kX2Zvcl9ybGUgPSAodWludDhfdCopU2JNZW1vcnlDYWxsb2MobGVuZ3RoLCAxKTsKLSAgaWYgKGdvb2RfZm9yX3JsZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KICAgewogICAgIC8vIExldCdzIG5vdCBzcG9pbCBhbnkgb2YgdGhlIGV4aXN0aW5nIGdvb2QgcmxlIGNvZGVzLgogICAgIC8vIE1hcmsgYW55IHNlcSBvZiAwJ3MgdGhhdCBpcyBsb25nZXIgYXMgNSBhcyBhIGdvb2RfZm9yX3JsZS4KICAgICAvLyBNYXJrIGFueSBzZXEgb2Ygbm9uLTAncyB0aGF0IGlzIGxvbmdlciBhcyA3IGFzIGEgZ29vZF9mb3JfcmxlLgotICAgIGludCBzeW1ib2wgPSBjb3VudHNbMF07CisgICAgdWludDMyX3Qgc3ltYm9sID0gY291bnRzWzBdOwogICAgIGludCBzdHJpZGUgPSAwOwogICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGggKyAxOyArK2kpIHsKICAgICAgIGlmIChpID09IGxlbmd0aCB8fCBjb3VudHNbaV0gIT0gc3ltYm9sKSB7CkBAIC03OSwxNyArNjksMTcgQEAKICAgfQogICAvLyAzKSBMZXQncyByZXBsYWNlIHRob3NlIHBvcHVsYXRpb24gY291bnRzIHRoYXQgbGVhZCB0byBtb3JlIHJsZSBjb2Rlcy4KICAgewotICAgIGludCBzdHJpZGUgPSAwOwotICAgIGludCBsaW1pdCA9IGNvdW50c1swXTsKLSAgICBpbnQgc3VtID0gMDsKKyAgICB1aW50MzJfdCBzdHJpZGUgPSAwOworICAgIHVpbnQzMl90IGxpbWl0ID0gY291bnRzWzBdOworICAgIHVpbnQzMl90IHN1bSA9IDA7CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aCArIDE7ICsraSkgewogICAgICAgaWYgKGkgPT0gbGVuZ3RoIHx8IGdvb2RfZm9yX3JsZVtpXSB8fAogICAgICAgICAgIChpICE9IDAgJiYgZ29vZF9mb3JfcmxlW2kgLSAxXSkgfHwKICAgICAgICAgICAhVmFsdWVzU2hvdWxkQmVDb2xsYXBzZWRUb1N0cmlkZUF2ZXJhZ2UoY291bnRzW2ldLCBsaW1pdCkpIHsKICAgICAgICAgaWYgKHN0cmlkZSA+PSA0IHx8IChzdHJpZGUgPj0gMyAmJiBzdW0gPT0gMCkpIHsKLSAgICAgICAgICBpbnQgazsKKyAgICAgICAgICB1aW50MzJfdCBrOwogICAgICAgICAgIC8vIFRoZSBzdHJpZGUgbXVzdCBlbmQsIGNvbGxhcHNlIHdoYXQgd2UgaGF2ZSwgaWYgd2UgaGF2ZSBlbm91Z2ggKDQpLgotICAgICAgICAgIGludCBjb3VudCA9IChzdW0gKyBzdHJpZGUgLyAyKSAvIHN0cmlkZTsKKyAgICAgICAgICB1aW50MzJfdCBjb3VudCA9IChzdW0gKyBzdHJpZGUgLyAyKSAvIHN0cmlkZTsKICAgICAgICAgICBpZiAoY291bnQgPCAxKSB7CiAgICAgICAgICAgICBjb3VudCA9IDE7CiAgICAgICAgICAgfQpAQCAtMTI1LDE3ICsxMTUsOCBAQAogICAgICAgfQogICAgIH0KICAgfQotICBTYk1lbW9yeURlYWxsb2NhdGUoZ29vZF9mb3JfcmxlKTsKLSAgcmV0dXJuIDE7CiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IHRvdGFsX2NvdW50XzsKLSAgaW50IHZhbHVlXzsKLSAgaW50IHBvb2xfaW5kZXhfbGVmdF87Ci0gIGludCBwb29sX2luZGV4X3JpZ2h0XzsKLX0gSHVmZm1hblRyZWU7Ci0KIC8vIEEgY29tcGFyZXIgZnVuY3Rpb24gZm9yIHR3byBIdWZmbWFuIHRyZWVzOiBzb3J0cyBmaXJzdCBieSAndG90YWwgY291bnQnCiAvLyAobW9yZSBjb21lcyBmaXJzdCksIGFuZCB0aGVuIGJ5ICd2YWx1ZScgKG1vcmUgY29tZXMgZmlyc3QpLgogc3RhdGljIGludCBDb21wYXJlSHVmZm1hblRyZWVzKGNvbnN0IHZvaWQqIHB0cjEsIGNvbnN0IHZvaWQqIHB0cjIpIHsKQEAgLTE0Niw3ICsxMjcsNyBAQAogICB9IGVsc2UgaWYgKHQxLT50b3RhbF9jb3VudF8gPCB0Mi0+dG90YWxfY291bnRfKSB7CiAgICAgcmV0dXJuIDE7CiAgIH0gZWxzZSB7Ci0gICAgU0JfRENIRUNLKHQxLT52YWx1ZV8gIT0gdDItPnZhbHVlXyk7CisgICAgYXNzZXJ0KHQxLT52YWx1ZV8gIT0gdDItPnZhbHVlXyk7CiAgICAgcmV0dXJuICh0MS0+dmFsdWVfIDwgdDItPnZhbHVlXykgPyAtMSA6IDE7CiAgIH0KIH0KQEAgLTE4MSwxMiArMTYyLDEyIEBACiAvLyB3ZSBhcmUgbm90IHBsYW5uaW5nIHRvIHVzZSB0aGlzIHdpdGggZXh0cmVtZWx5IGxvbmcgYmxvY2tzLgogLy8KIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0h1ZmZtYW5fY29kaW5nCi1zdGF0aWMgaW50IEdlbmVyYXRlT3B0aW1hbFRyZWUoY29uc3QgaW50KiBjb25zdCBoaXN0b2dyYW0sIGludCBoaXN0b2dyYW1fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJlZV9kZXB0aF9saW1pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiaXRfZGVwdGhzKSB7Ci0gIGludCBjb3VudF9taW47CitzdGF0aWMgdm9pZCBHZW5lcmF0ZU9wdGltYWxUcmVlKGNvbnN0IHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaXN0b2dyYW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWUqIHRyZWUsIGludCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBiaXRfZGVwdGhzKSB7CisgIHVpbnQzMl90IGNvdW50X21pbjsKICAgSHVmZm1hblRyZWUqIHRyZWVfcG9vbDsKLSAgSHVmZm1hblRyZWUqIHRyZWU7CiAgIGludCB0cmVlX3NpemVfb3JpZyA9IDA7CiAgIGludCBpOwogCkBAIC0xOTcsMjIgKzE3OCwxNiBAQAogICB9CiAKICAgaWYgKHRyZWVfc2l6ZV9vcmlnID09IDApIHsgICAvLyBwcmV0dHkgb3B0aW1hbCBhbHJlYWR5IQotICAgIHJldHVybiAxOworICAgIHJldHVybjsKICAgfQogCi0gIC8vIDMgKiB0cmVlX3NpemUgaXMgZW5vdWdoIHRvIGNvdmVyIGFsbCB0aGUgbm9kZXMgcmVwcmVzZW50aW5nIGEKLSAgLy8gcG9wdWxhdGlvbiBhbmQgYWxsIHRoZSBpbnNlcnRlZCBub2RlcyBjb21iaW5pbmcgdHdvIGV4aXN0aW5nIG5vZGVzLgotICAvLyBUaGUgdHJlZSBwb29sIG5lZWRzIDIgKiAodHJlZV9zaXplX29yaWcgLSAxKSBlbnRpdGllcywgYW5kIHRoZQotICAvLyB0cmVlIG5lZWRzIGV4YWN0bHkgdHJlZV9zaXplX29yaWcgZW50aXRpZXMuCi0gIHRyZWUgPSAoSHVmZm1hblRyZWUqKVdlYlBTYWZlTWFsbG9jKDNVTEwgKiB0cmVlX3NpemVfb3JpZywgc2l6ZW9mKCp0cmVlKSk7Ci0gIGlmICh0cmVlID09IE5VTEwpIHJldHVybiAwOwogICB0cmVlX3Bvb2wgPSB0cmVlICsgdHJlZV9zaXplX29yaWc7CiAKICAgLy8gRm9yIGJsb2NrIHNpemVzIHdpdGggbGVzcyB0aGFuIDY0ayBzeW1ib2xzIHdlIG5ldmVyIG5lZWQgdG8gZG8gYQogICAvLyBzZWNvbmQgaXRlcmF0aW9uIG9mIHRoaXMgbG9vcC4KICAgLy8gSWYgd2UgYWN0dWFsbHkgc3RhcnQgcnVubmluZyBpbnNpZGUgdGhpcyBsb29wIGEgbG90LCB3ZSB3b3VsZCBwZXJoYXBzCiAgIC8vIGJlIGJldHRlciBvZmYgd2l0aCB0aGUgS2F0YWphaW5lbiBhbGdvcml0aG0uCi0gIFNCX0RDSEVDSyh0cmVlX3NpemVfb3JpZyA8PSAoMSA8PCAodHJlZV9kZXB0aF9saW1pdCAtIDEpKSk7CisgIGFzc2VydCh0cmVlX3NpemVfb3JpZyA8PSAoMSA8PCAodHJlZV9kZXB0aF9saW1pdCAtIDEpKSk7CiAgIGZvciAoY291bnRfbWluID0gMTsgOyBjb3VudF9taW4gKj0gMikgewogICAgIGludCB0cmVlX3NpemUgPSB0cmVlX3NpemVfb3JpZzsKICAgICAvLyBXZSBuZWVkIHRvIHBhY2sgdGhlIEh1ZmZtYW4gdHJlZSBpbiB0cmVlX2RlcHRoX2xpbWl0IGJpdHMuCkBAIC0yMjEsNyArMTk2LDcgQEAKICAgICBpbnQgajsKICAgICBmb3IgKGogPSAwOyBqIDwgaGlzdG9ncmFtX3NpemU7ICsraikgewogICAgICAgaWYgKGhpc3RvZ3JhbVtqXSAhPSAwKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb3VudCA9CisgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvdW50ID0KICAgICAgICAgICAgIChoaXN0b2dyYW1bal0gPCBjb3VudF9taW4pID8gY291bnRfbWluIDogaGlzdG9ncmFtW2pdOwogICAgICAgICB0cmVlW2lkeF0udG90YWxfY291bnRfID0gY291bnQ7CiAgICAgICAgIHRyZWVbaWR4XS52YWx1ZV8gPSBqOwpAQCAtMjMyLDEyICsyMDcsMTIgQEAKICAgICB9CiAKICAgICAvLyBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlLgotICAgIFNiU3lzdGVtU29ydCh0cmVlLCB0cmVlX3NpemUsIHNpemVvZigqdHJlZSksIENvbXBhcmVIdWZmbWFuVHJlZXMpOworICAgIHFzb3J0KHRyZWUsIHRyZWVfc2l6ZSwgc2l6ZW9mKCp0cmVlKSwgQ29tcGFyZUh1ZmZtYW5UcmVlcyk7CiAKICAgICBpZiAodHJlZV9zaXplID4gMSkgeyAgLy8gTm9ybWFsIGNhc2UuCiAgICAgICBpbnQgdHJlZV9wb29sX3NpemUgPSAwOwogICAgICAgd2hpbGUgKHRyZWVfc2l6ZSA+IDEpIHsgIC8vIEZpbmlzaCB3aGVuIHdlIGhhdmUgb25seSBvbmUgcm9vdC4KLSAgICAgICAgaW50IGNvdW50OworICAgICAgICB1aW50MzJfdCBjb3VudDsKICAgICAgICAgdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplKytdID0gdHJlZVt0cmVlX3NpemUgLSAxXTsKICAgICAgICAgdHJlZV9wb29sW3RyZWVfcG9vbF9zaXplKytdID0gdHJlZVt0cmVlX3NpemUgLSAyXTsKICAgICAgICAgY291bnQgPSB0cmVlX3Bvb2xbdHJlZV9wb29sX3NpemUgLSAxXS50b3RhbF9jb3VudF8gKwpAQCAtMjUxLDcgKzIyNiw3IEBACiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBTYk1lbW9yeU1vdmUodHJlZSArIChrICsgMSksIHRyZWUgKyBrLCAodHJlZV9zaXplIC0gaykgKiBzaXplb2YoKnRyZWUpKTsKKyAgICAgICAgICBtZW1tb3ZlKHRyZWUgKyAoayArIDEpLCB0cmVlICsgaywgKHRyZWVfc2l6ZSAtIGspICogc2l6ZW9mKCp0cmVlKSk7CiAgICAgICAgICAgdHJlZVtrXS50b3RhbF9jb3VudF8gPSBjb3VudDsKICAgICAgICAgICB0cmVlW2tdLnZhbHVlXyA9IC0xOwogCkBAIC0yNzgsOCArMjUzLDYgQEAKICAgICAgIH0KICAgICB9CiAgIH0KLSAgU2JNZW1vcnlEZWFsbG9jYXRlKHRyZWUpOwotICByZXR1cm4gMTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI4OCw3ICsyNjEsNyBAQAogc3RhdGljIEh1ZmZtYW5UcmVlVG9rZW4qIENvZGVSZXBlYXRlZFZhbHVlcyhpbnQgcmVwZXRpdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQgcHJldl92YWx1ZSkgewotICBTQl9EQ0hFQ0sodmFsdWUgPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOworICBhc3NlcnQodmFsdWUgPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpOwogICBpZiAodmFsdWUgIT0gcHJldl92YWx1ZSkgewogICAgIHRva2Vucy0+Y29kZSA9IHZhbHVlOwogICAgIHRva2Vucy0+ZXh0cmFfYml0cyA9IDA7CkBAIC0zNTcsNyArMzMwLDcgQEAKICAgY29uc3QgaW50IGRlcHRoX3NpemUgPSB0cmVlLT5udW1fc3ltYm9sczsKICAgaW50IHByZXZfdmFsdWUgPSA4OyAgLy8gOCBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBmb3IgcmxlLgogICBpbnQgaSA9IDA7Ci0gIFNCX0RDSEVDSyh0b2tlbnMgIT0gTlVMTCk7CisgIGFzc2VydCh0b2tlbnMgIT0gTlVMTCk7CiAgIHdoaWxlIChpIDwgZGVwdGhfc2l6ZSkgewogICAgIGNvbnN0IGludCB2YWx1ZSA9IHRyZWUtPmNvZGVfbGVuZ3Roc1tpXTsKICAgICBpbnQgayA9IGkgKyAxOwpAQCAtMzcxLDcgKzM0NCw3IEBACiAgICAgICBwcmV2X3ZhbHVlID0gdmFsdWU7CiAgICAgfQogICAgIGkgKz0gcnVuczsKLSAgICBTQl9EQ0hFQ0sodG9rZW5zIDw9IGVuZGluZ190b2tlbik7CisgICAgYXNzZXJ0KHRva2VucyA8PSBlbmRpbmdfdG9rZW4pOwogICB9CiAgICh2b2lkKWVuZGluZ190b2tlbjsgICAgLy8gc3VwcHJlc3MgJ3VudXNlZCB2YXJpYWJsZScgd2FybmluZwogICByZXR1cm4gKGludCkodG9rZW5zIC0gc3RhcnRpbmdfdG9rZW4pOwpAQCAtNDA1LDExICszNzgsMTEgQEAKICAgdWludDMyX3QgbmV4dF9jb2RlW01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV07CiAgIGludCBkZXB0aF9jb3VudFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCArIDFdID0geyAwIH07CiAKLSAgU0JfRENIRUNLKHRyZWUgIT0gTlVMTCk7CisgIGFzc2VydCh0cmVlICE9IE5VTEwpOwogICBsZW4gPSB0cmVlLT5udW1fc3ltYm9sczsKICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgY29uc3QgaW50IGNvZGVfbGVuZ3RoID0gdHJlZS0+Y29kZV9sZW5ndGhzW2ldOwotICAgIFNCX0RDSEVDSyhjb2RlX2xlbmd0aCA8PSBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCk7CisgICAgYXNzZXJ0KGNvZGVfbGVuZ3RoIDw9IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKTsKICAgICArK2RlcHRoX2NvdW50W2NvZGVfbGVuZ3RoXTsKICAgfQogICBkZXB0aF9jb3VudFswXSA9IDA7ICAvLyBpZ25vcmUgdW51c2VkIHN5bWJvbApAQCAtNDMwLDE3ICs0MDMsMTUgQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBNYWluIGVudHJ5IHBvaW50CiAKLWludCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaW50KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpIHsKLSAgY29uc3QgaW50IG51bV9zeW1ib2xzID0gdHJlZS0+bnVtX3N5bWJvbHM7Ci0gIGlmICghT3B0aW1pemVIdWZmbWFuRm9yUmxlKG51bV9zeW1ib2xzLCBoaXN0b2dyYW0pKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgaWYgKCFHZW5lcmF0ZU9wdGltYWxUcmVlKGhpc3RvZ3JhbSwgbnVtX3N5bWJvbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX2RlcHRoX2xpbWl0LCB0cmVlLT5jb2RlX2xlbmd0aHMpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KK3ZvaWQgVlA4TENyZWF0ZUh1ZmZtYW5UcmVlKHVpbnQzMl90KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgYnVmX3JsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlKiBjb25zdCBodWZmX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IGh1ZmZfY29kZSkgeworICBjb25zdCBpbnQgbnVtX3N5bWJvbHMgPSBodWZmX2NvZGUtPm51bV9zeW1ib2xzOworICBtZW1zZXQoYnVmX3JsZSwgMCwgbnVtX3N5bWJvbHMgKiBzaXplb2YoKmJ1Zl9ybGUpKTsKKyAgT3B0aW1pemVIdWZmbWFuRm9yUmxlKG51bV9zeW1ib2xzLCBidWZfcmxlLCBoaXN0b2dyYW0pOworICBHZW5lcmF0ZU9wdGltYWxUcmVlKGhpc3RvZ3JhbSwgbnVtX3N5bWJvbHMsIGh1ZmZfdHJlZSwgdHJlZV9kZXB0aF9saW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBodWZmX2NvZGUtPmNvZGVfbGVuZ3Rocyk7CiAgIC8vIENyZWF0ZSB0aGUgYWN0dWFsIGJpdCBjb2RlcyBmb3IgdGhlIGJpdCBsZW5ndGhzLgotICBDb252ZXJ0Qml0RGVwdGhzVG9TeW1ib2xzKHRyZWUpOwotICByZXR1cm4gMTsKKyAgQ29udmVydEJpdERlcHRoc1RvU3ltYm9scyhodWZmX2NvZGUpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbl9lbmNvZGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggNjIlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX2VuY29kZV91dGlscy5oCmluZGV4IDBiODFmNDcuLjNlNjc2M2MgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW5fZW5jb2RlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fZW5jb2RlX3V0aWxzLmgKQEAgLTExLDEyICsxMSwxMiBAQAogLy8KIC8vIEVudHJvcHkgZW5jb2RpbmcgKEh1ZmZtYW4pIGZvciB3ZWJwIGxvc3NsZXNzCiAKLSNpZm5kZWYgV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX0hfCisjaWZuZGVmIFdFQlBfVVRJTFNfSFVGRk1BTl9FTkNPREVfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9VVElMU19IXwogCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKQEAgLTMzLDE3ICszMywyOCBAQAogICB1aW50MTZfdCogY29kZXM7ICAgICAgICAgLy8gU3ltYm9sIENvZGVzLgogfSBIdWZmbWFuVHJlZUNvZGU7CiAKKy8vIFN0cnVjdCB0byByZXByZXNlbnQgdGhlIEh1ZmZtYW4gdHJlZS4KK3R5cGVkZWYgc3RydWN0IHsKKyAgdWludDMyX3QgdG90YWxfY291bnRfOyAgIC8vIFN5bWJvbCBmcmVxdWVuY3kuCisgIGludCB2YWx1ZV87ICAgICAgICAgICAgICAvLyBTeW1ib2wgdmFsdWUuCisgIGludCBwb29sX2luZGV4X2xlZnRfOyAgICAvLyBJbmRleCBmb3IgdGhlIGxlZnQgc3ViLXRyZWUuCisgIGludCBwb29sX2luZGV4X3JpZ2h0XzsgICAvLyBJbmRleCBmb3IgdGhlIHJpZ2h0IHN1Yi10cmVlLgorfSBIdWZmbWFuVHJlZTsKKwogLy8gVHVybiB0aGUgSHVmZm1hbiB0cmVlIGludG8gYSB0b2tlbiBzZXF1ZW5jZS4KIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0b2tlbnMgdXNlZC4KIGludCBWUDhMQ3JlYXRlQ29tcHJlc3NlZEh1ZmZtYW5UcmVlKGNvbnN0IEh1ZmZtYW5UcmVlQ29kZSogY29uc3QgdHJlZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UcmVlVG9rZW4qIHRva2VucywgaW50IG1heF90b2tlbnMpOwogCiAvLyBDcmVhdGUgYW4gb3B0aW1pemVkIHRyZWUsIGFuZCB0b2tlbml6ZSBpdC4KLWludCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUoaW50KiBjb25zdCBoaXN0b2dyYW0sIGludCB0cmVlX2RlcHRoX2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZUNvZGUqIGNvbnN0IHRyZWUpOworLy8gJ2J1Zl9ybGUnIGFuZCAnaHVmZl90cmVlJyBhcmUgcHJlLWFsbG9jYXRlZCBhbmQgdGhlICd0cmVlJyBpcyB0aGUgY29uc3RydWN0ZWQKKy8vIGh1ZmZtYW4gY29kZSB0cmVlLgordm9pZCBWUDhMQ3JlYXRlSHVmZm1hblRyZWUodWludDMyX3QqIGNvbnN0IGhpc3RvZ3JhbSwgaW50IHRyZWVfZGVwdGhfbGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBidWZfcmxlLCBIdWZmbWFuVHJlZSogY29uc3QgaHVmZl90cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hblRyZWVDb2RlKiBjb25zdCB0cmVlKTsKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfQogI2VuZGlmCiAKLSNlbmRpZiAgLy8gV0VCUF9VVElMU19IVUZGTUFOX0VOQ09ERV9IXworI2VuZGlmICAvLyBXRUJQX1VUSUxTX0hVRkZNQU5fRU5DT0RFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY5OTYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL2h1ZmZtYW5fdXRpbHMuYwpAQCAtMCwwICsxLDIyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIFV0aWxpdGllcyBmb3IgYnVpbGRpbmcgYW5kIGxvb2tpbmcgdXAgSHVmZm1hbiB0cmVlcy4KKy8vCisvLyBBdXRob3I6IFVydmFuZyBKb3NoaSAodXJ2YW5nQGdvb2dsZS5jb20pCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJzcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorI2luY2x1ZGUgInNyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaCIKKworLy8gSHVmZm1hbiBkYXRhIHJlYWQgdmlhIERlY29kZUltYWdlU3RyZWFtIGlzIHJlcHJlc2VudGVkIGluIHR3byAocmVkIGFuZCBncmVlbikKKy8vIGJ5dGVzLgorI2RlZmluZSBNQVhfSFRSRUVfR1JPVVBTICAgIDB4MTAwMDAKKworSFRyZWVHcm91cCogVlA4TEh0cmVlR3JvdXBzTmV3KGludCBudW1faHRyZWVfZ3JvdXBzKSB7CisgIEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3VwcyA9CisgICAgICAoSFRyZWVHcm91cCopV2ViUFNhZmVNYWxsb2MobnVtX2h0cmVlX2dyb3Vwcywgc2l6ZW9mKCpodHJlZV9ncm91cHMpKTsKKyAgaWYgKGh0cmVlX2dyb3VwcyA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgYXNzZXJ0KG51bV9odHJlZV9ncm91cHMgPD0gTUFYX0hUUkVFX0dST1VQUyk7CisgIHJldHVybiBodHJlZV9ncm91cHM7Cit9CisKK3ZvaWQgVlA4TEh0cmVlR3JvdXBzRnJlZShIVHJlZUdyb3VwKiBjb25zdCBodHJlZV9ncm91cHMpIHsKKyAgaWYgKGh0cmVlX2dyb3VwcyAhPSBOVUxMKSB7CisgICAgV2ViUFNhZmVGcmVlKGh0cmVlX2dyb3Vwcyk7CisgIH0KK30KKworLy8gUmV0dXJucyByZXZlcnNlKHJldmVyc2Uoa2V5LCBsZW4pICsgMSwgbGVuKSwgd2hlcmUgcmV2ZXJzZShrZXksIGxlbikgaXMgdGhlCisvLyBiaXQtd2lzZSByZXZlcnNhbCBvZiB0aGUgbGVuIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2Yga2V5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldE5leHRLZXkodWludDMyX3Qga2V5LCBpbnQgbGVuKSB7CisgIHVpbnQzMl90IHN0ZXAgPSAxIDw8IChsZW4gLSAxKTsKKyAgd2hpbGUgKGtleSAmIHN0ZXApIHsKKyAgICBzdGVwID4+PSAxOworICB9CisgIHJldHVybiBzdGVwID8gKGtleSAmIChzdGVwIC0gMSkpICsgc3RlcCA6IGtleTsKK30KKworLy8gU3RvcmVzIGNvZGUgaW4gdGFibGVbMF0sIHRhYmxlW3N0ZXBdLCB0YWJsZVsyKnN0ZXBdLCAuLi4sIHRhYmxlW2VuZF0uCisvLyBBc3N1bWVzIHRoYXQgZW5kIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgb2Ygc3RlcC4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFJlcGxpY2F0ZVZhbHVlKEh1ZmZtYW5Db2RlKiB0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHVmZm1hbkNvZGUgY29kZSkgeworICBhc3NlcnQoZW5kICUgc3RlcCA9PSAwKTsKKyAgZG8geworICAgIGVuZCAtPSBzdGVwOworICAgIHRhYmxlW2VuZF0gPSBjb2RlOworICB9IHdoaWxlIChlbmQgPiAwKTsKK30KKworLy8gUmV0dXJucyB0aGUgdGFibGUgd2lkdGggb2YgdGhlIG5leHQgMm5kIGxldmVsIHRhYmxlLiBjb3VudCBpcyB0aGUgaGlzdG9ncmFtCisvLyBvZiBiaXQgbGVuZ3RocyBmb3IgdGhlIHJlbWFpbmluZyBzeW1ib2xzLCBsZW4gaXMgdGhlIGNvZGUgbGVuZ3RoIG9mIHRoZSBuZXh0CisvLyBwcm9jZXNzZWQgc3ltYm9sCitzdGF0aWMgV0VCUF9JTkxJTkUgaW50IE5leHRUYWJsZUJpdFNpemUoY29uc3QgaW50KiBjb25zdCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgcm9vdF9iaXRzKSB7CisgIGludCBsZWZ0ID0gMSA8PCAobGVuIC0gcm9vdF9iaXRzKTsKKyAgd2hpbGUgKGxlbiA8IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIKSB7CisgICAgbGVmdCAtPSBjb3VudFtsZW5dOworICAgIGlmIChsZWZ0IDw9IDApIGJyZWFrOworICAgICsrbGVuOworICAgIGxlZnQgPDw9IDE7CisgIH0KKyAgcmV0dXJuIGxlbiAtIHJvb3RfYml0czsKK30KKworLy8gc29ydGVkW2NvZGVfbGVuZ3Roc19zaXplXSBpcyBhIHByZS1hbGxvY2F0ZWQgYXJyYXkgZm9yIHNvcnRpbmcgc3ltYm9scworLy8gYnkgY29kZSBsZW5ndGguCitzdGF0aWMgaW50IEJ1aWxkSHVmZm1hblRhYmxlKEh1ZmZtYW5Db2RlKiBjb25zdCByb290X3RhYmxlLCBpbnQgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZV9sZW5ndGhzW10sIGludCBjb2RlX2xlbmd0aHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3Qgc29ydGVkW10pIHsKKyAgSHVmZm1hbkNvZGUqIHRhYmxlID0gcm9vdF90YWJsZTsgIC8vIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlCisgIGludCB0b3RhbF9zaXplID0gMSA8PCByb290X2JpdHM7ICAvLyB0b3RhbCBzaXplIHJvb3QgdGFibGUgKyAybmQgbGV2ZWwgdGFibGUKKyAgaW50IGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY29kZSBsZW5ndGgKKyAgaW50IHN5bWJvbDsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bWJvbCBpbmRleCBpbiBvcmlnaW5hbCBvciBzb3J0ZWQgdGFibGUKKyAgLy8gbnVtYmVyIG9mIGNvZGVzIG9mIGVhY2ggbGVuZ3RoOgorICBpbnQgY291bnRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OworICAvLyBvZmZzZXRzIGluIHNvcnRlZCB0YWJsZSBmb3IgZWFjaCBsZW5ndGg6CisgIGludCBvZmZzZXRbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXTsKKworICBhc3NlcnQoY29kZV9sZW5ndGhzX3NpemUgIT0gMCk7CisgIGFzc2VydChjb2RlX2xlbmd0aHMgIT0gTlVMTCk7CisgIGFzc2VydChyb290X3RhYmxlICE9IE5VTEwpOworICBhc3NlcnQocm9vdF9iaXRzID4gMCk7CisKKyAgLy8gQnVpbGQgaGlzdG9ncmFtIG9mIGNvZGUgbGVuZ3Rocy4KKyAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKKyAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiBNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSCkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgICsrY291bnRbY29kZV9sZW5ndGhzW3N5bWJvbF1dOworICB9CisKKyAgLy8gRXJyb3IsIGFsbCBjb2RlIGxlbmd0aHMgYXJlIHplcm9zLgorICBpZiAoY291bnRbMF0gPT0gY29kZV9sZW5ndGhzX3NpemUpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vIEdlbmVyYXRlIG9mZnNldHMgaW50byBzb3J0ZWQgc3ltYm9sIHRhYmxlIGJ5IGNvZGUgbGVuZ3RoLgorICBvZmZzZXRbMV0gPSAwOworICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWF9BTExPV0VEX0NPREVfTEVOR1RIOyArK2xlbikgeworICAgIGlmIChjb3VudFtsZW5dID4gKDEgPDwgbGVuKSkgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIG9mZnNldFtsZW4gKyAxXSA9IG9mZnNldFtsZW5dICsgY291bnRbbGVuXTsKKyAgfQorCisgIC8vIFNvcnQgc3ltYm9scyBieSBsZW5ndGgsIGJ5IHN5bWJvbCBvcmRlciB3aXRoaW4gZWFjaCBsZW5ndGguCisgIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7CisgICAgY29uc3QgaW50IHN5bWJvbF9jb2RlX2xlbmd0aCA9IGNvZGVfbGVuZ3Roc1tzeW1ib2xdOworICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IDApIHsKKyAgICAgIHNvcnRlZFtvZmZzZXRbc3ltYm9sX2NvZGVfbGVuZ3RoXSsrXSA9IHN5bWJvbDsKKyAgICB9CisgIH0KKworICAvLyBTcGVjaWFsIGNhc2UgY29kZSB3aXRoIG9ubHkgb25lIHZhbHVlLgorICBpZiAob2Zmc2V0W01BWF9BTExPV0VEX0NPREVfTEVOR1RIXSA9PSAxKSB7CisgICAgSHVmZm1hbkNvZGUgY29kZTsKKyAgICBjb2RlLmJpdHMgPSAwOworICAgIGNvZGUudmFsdWUgPSAodWludDE2X3Qpc29ydGVkWzBdOworICAgIFJlcGxpY2F0ZVZhbHVlKHRhYmxlLCAxLCB0b3RhbF9zaXplLCBjb2RlKTsKKyAgICByZXR1cm4gdG90YWxfc2l6ZTsKKyAgfQorCisgIHsKKyAgICBpbnQgc3RlcDsgICAgICAgICAgICAgIC8vIHN0ZXAgc2l6ZSB0byByZXBsaWNhdGUgdmFsdWVzIGluIGN1cnJlbnQgdGFibGUKKyAgICB1aW50MzJfdCBsb3cgPSAtMTsgICAgIC8vIGxvdyBiaXRzIGZvciBjdXJyZW50IHJvb3QgZW50cnkKKyAgICB1aW50MzJfdCBtYXNrID0gdG90YWxfc2l6ZSAtIDE7ICAgIC8vIG1hc2sgZm9yIGxvdyBiaXRzCisgICAgdWludDMyX3Qga2V5ID0gMDsgICAgICAvLyByZXZlcnNlZCBwcmVmaXggY29kZQorICAgIGludCBudW1fbm9kZXMgPSAxOyAgICAgLy8gbnVtYmVyIG9mIEh1ZmZtYW4gdHJlZSBub2RlcworICAgIGludCBudW1fb3BlbiA9IDE7ICAgICAgLy8gbnVtYmVyIG9mIG9wZW4gYnJhbmNoZXMgaW4gY3VycmVudCB0cmVlIGxldmVsCisgICAgaW50IHRhYmxlX2JpdHMgPSByb290X2JpdHM7ICAgICAgICAvLyBrZXkgbGVuZ3RoIG9mIGN1cnJlbnQgdGFibGUKKyAgICBpbnQgdGFibGVfc2l6ZSA9IDEgPDwgdGFibGVfYml0czsgIC8vIHNpemUgb2YgY3VycmVudCB0YWJsZQorICAgIHN5bWJvbCA9IDA7CisgICAgLy8gRmlsbCBpbiByb290IHRhYmxlLgorICAgIGZvciAobGVuID0gMSwgc3RlcCA9IDI7IGxlbiA8PSByb290X2JpdHM7ICsrbGVuLCBzdGVwIDw8PSAxKSB7CisgICAgICBudW1fb3BlbiA8PD0gMTsKKyAgICAgIG51bV9ub2RlcyArPSBudW1fb3BlbjsKKyAgICAgIG51bV9vcGVuIC09IGNvdW50W2xlbl07CisgICAgICBpZiAobnVtX29wZW4gPCAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgZm9yICg7IGNvdW50W2xlbl0gPiAwOyAtLWNvdW50W2xlbl0pIHsKKyAgICAgICAgSHVmZm1hbkNvZGUgY29kZTsKKyAgICAgICAgY29kZS5iaXRzID0gKHVpbnQ4X3QpbGVuOworICAgICAgICBjb2RlLnZhbHVlID0gKHVpbnQxNl90KXNvcnRlZFtzeW1ib2wrK107CisgICAgICAgIFJlcGxpY2F0ZVZhbHVlKCZ0YWJsZVtrZXldLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTsKKyAgICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmlsbCBpbiAybmQgbGV2ZWwgdGFibGVzIGFuZCBhZGQgcG9pbnRlcnMgdG8gcm9vdCB0YWJsZS4KKyAgICBmb3IgKGxlbiA9IHJvb3RfYml0cyArIDEsIHN0ZXAgPSAyOyBsZW4gPD0gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEg7CisgICAgICAgICArK2xlbiwgc3RlcCA8PD0gMSkgeworICAgICAgbnVtX29wZW4gPDw9IDE7CisgICAgICBudW1fbm9kZXMgKz0gbnVtX29wZW47CisgICAgICBudW1fb3BlbiAtPSBjb3VudFtsZW5dOworICAgICAgaWYgKG51bV9vcGVuIDwgMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBjb3VudFtsZW5dID4gMDsgLS1jb3VudFtsZW5dKSB7CisgICAgICAgIEh1ZmZtYW5Db2RlIGNvZGU7CisgICAgICAgIGlmICgoa2V5ICYgbWFzaykgIT0gbG93KSB7CisgICAgICAgICAgdGFibGUgKz0gdGFibGVfc2l6ZTsKKyAgICAgICAgICB0YWJsZV9iaXRzID0gTmV4dFRhYmxlQml0U2l6ZShjb3VudCwgbGVuLCByb290X2JpdHMpOworICAgICAgICAgIHRhYmxlX3NpemUgPSAxIDw8IHRhYmxlX2JpdHM7CisgICAgICAgICAgdG90YWxfc2l6ZSArPSB0YWJsZV9zaXplOworICAgICAgICAgIGxvdyA9IGtleSAmIG1hc2s7CisgICAgICAgICAgcm9vdF90YWJsZVtsb3ddLmJpdHMgPSAodWludDhfdCkodGFibGVfYml0cyArIHJvb3RfYml0cyk7CisgICAgICAgICAgcm9vdF90YWJsZVtsb3ddLnZhbHVlID0gKHVpbnQxNl90KSgodGFibGUgLSByb290X3RhYmxlKSAtIGxvdyk7CisgICAgICAgIH0KKyAgICAgICAgY29kZS5iaXRzID0gKHVpbnQ4X3QpKGxlbiAtIHJvb3RfYml0cyk7CisgICAgICAgIGNvZGUudmFsdWUgPSAodWludDE2X3Qpc29ydGVkW3N5bWJvbCsrXTsKKyAgICAgICAgUmVwbGljYXRlVmFsdWUoJnRhYmxlW2tleSA+PiByb290X2JpdHNdLCBzdGVwLCB0YWJsZV9zaXplLCBjb2RlKTsKKyAgICAgICAga2V5ID0gR2V0TmV4dEtleShrZXksIGxlbik7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgdHJlZSBpcyBmdWxsLgorICAgIGlmIChudW1fbm9kZXMgIT0gMiAqIG9mZnNldFtNQVhfQUxMT1dFRF9DT0RFX0xFTkdUSF0gLSAxKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KKworLy8gTWF4aW11bSBjb2RlX2xlbmd0aHNfc2l6ZSBpcyAyMzI4IChyZWFjaGVkIGZvciAxMS1iaXQgY29sb3JfY2FjaGVfYml0cykuCisvLyBNb3JlIGNvbW1vbmx5LCB0aGUgdmFsdWUgaXMgYXJvdW5kIH4yODAuCisjZGVmaW5lIE1BWF9DT0RFX0xFTkdUSFNfU0laRSBcCisgICgoMSA8PCBNQVhfQ0FDSEVfQklUUykgKyBOVU1fTElURVJBTF9DT0RFUyArIE5VTV9MRU5HVEhfQ09ERVMpCisvLyBDdXQtb2ZmIHZhbHVlIGZvciBzd2l0Y2hpbmcgYmV0d2VlbiBoZWFwIGFuZCBzdGFjayBhbGxvY2F0aW9uLgorI2RlZmluZSBTT1JURURfU0laRV9DVVRPRkYgNTEyCitpbnQgVlA4TEJ1aWxkSHVmZm1hblRhYmxlKEh1ZmZtYW5Db2RlKiBjb25zdCByb290X3RhYmxlLCBpbnQgcm9vdF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY29kZV9sZW5ndGhzW10sIGludCBjb2RlX2xlbmd0aHNfc2l6ZSkgeworICBpbnQgdG90YWxfc2l6ZTsKKyAgYXNzZXJ0KGNvZGVfbGVuZ3Roc19zaXplIDw9IE1BWF9DT0RFX0xFTkdUSFNfU0laRSk7CisgIGlmIChjb2RlX2xlbmd0aHNfc2l6ZSA8PSBTT1JURURfU0laRV9DVVRPRkYpIHsKKyAgICAvLyB1c2UgbG9jYWwgc3RhY2stYWxsb2NhdGVkIGFycmF5LgorICAgIHVpbnQxNl90IHNvcnRlZFtTT1JURURfU0laRV9DVVRPRkZdOworICAgIHRvdGFsX3NpemUgPSBCdWlsZEh1ZmZtYW5UYWJsZShyb290X3RhYmxlLCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVfbGVuZ3RocywgY29kZV9sZW5ndGhzX3NpemUsIHNvcnRlZCk7CisgIH0gZWxzZSB7ICAgLy8gcmFyZSBjYXNlLiBVc2UgaGVhcCBhbGxvY2F0aW9uLgorICAgIHVpbnQxNl90KiBjb25zdCBzb3J0ZWQgPQorICAgICAgICAodWludDE2X3QqKVdlYlBTYWZlTWFsbG9jKGNvZGVfbGVuZ3Roc19zaXplLCBzaXplb2YoKnNvcnRlZCkpOworICAgIGlmIChzb3J0ZWQgPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgdG90YWxfc2l6ZSA9IEJ1aWxkSHVmZm1hblRhYmxlKHJvb3RfdGFibGUsIHJvb3RfYml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZV9sZW5ndGhzLCBjb2RlX2xlbmd0aHNfc2l6ZSwgc29ydGVkKTsKKyAgICBXZWJQU2FmZUZyZWUoc29ydGVkKTsKKyAgfQorICByZXR1cm4gdG90YWxfc2l6ZTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9odWZmbWFuX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMWM3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvaHVmZm1hbl91dGlscy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGFuZCBsb29raW5nIHVwIEh1ZmZtYW4gdHJlZXMuCisvLworLy8gQXV0aG9yOiBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfSFVGRk1BTl9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX0hVRkZNQU5fVVRJTFNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIEhVRkZNQU5fVEFCTEVfQklUUyAgICAgIDgKKyNkZWZpbmUgSFVGRk1BTl9UQUJMRV9NQVNLICAgICAgKCgxIDw8IEhVRkZNQU5fVEFCTEVfQklUUykgLSAxKQorCisjZGVmaW5lIExFTkdUSFNfVEFCTEVfQklUUyAgICAgIDcKKyNkZWZpbmUgTEVOR1RIU19UQUJMRV9NQVNLICAgICAgKCgxIDw8IExFTkdUSFNfVEFCTEVfQklUUykgLSAxKQorCisKKy8vIEh1ZmZtYW4gbG9va3VwIHRhYmxlIGVudHJ5Cit0eXBlZGVmIHN0cnVjdCB7CisgIHVpbnQ4X3QgYml0czsgICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoaXMgc3ltYm9sCisgIHVpbnQxNl90IHZhbHVlOyAgIC8vIHN5bWJvbCB2YWx1ZSBvciB0YWJsZSBvZmZzZXQKK30gSHVmZm1hbkNvZGU7CisKKy8vIGxvbmcgdmVyc2lvbiBmb3IgaG9sZGluZyAzMmIgdmFsdWVzCit0eXBlZGVmIHN0cnVjdCB7CisgIGludCBiaXRzOyAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIHVzZWQgZm9yIHRoaXMgc3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAvLyBvciBhbiBpbXBvc3NpYmxlIHZhbHVlIGlmIG5vdCBhIGxpdGVyYWwgY29kZS4KKyAgdWludDMyX3QgdmFsdWU7ICAgLy8gMzJiIHBhY2tlZCBBUkdCIHZhbHVlIGlmIGxpdGVyYWwsCisgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vbi1saXRlcmFsIHN5bWJvbCBvdGhlcndpc2UKK30gSHVmZm1hbkNvZGUzMjsKKworI2RlZmluZSBIVUZGTUFOX1BBQ0tFRF9CSVRTIDYKKyNkZWZpbmUgSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRSAoMXUgPDwgSFVGRk1BTl9QQUNLRURfQklUUykKKworLy8gSHVmZm1hbiB0YWJsZSBncm91cC4KKy8vIEluY2x1ZGVzIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSBmb2xsb3dpbmcgY2FzZXM6CisvLyAgLSBpc190cml2aWFsX2xpdGVyYWw6IG9uZSBjb21tb24gbGl0ZXJhbCBiYXNlIGZvciBSRUQvQkxVRS9BTFBIQSAobm90IEdSRUVOKQorLy8gIC0gaXNfdHJpdmlhbF9jb2RlOiBvbmx5IDEgY29kZSAobm8gYml0IGlzIHJlYWQgZnJvbSBiaXRzdHJlYW0pCisvLyAgLSB1c2VfcGFja2VkX3RhYmxlOiBmZXcgZW5vdWdoIGxpdGVyYWwgc3ltYm9scywgc28gYWxsIHRoZSBiaXQgY29kZXMKKy8vICAgIGNhbiBmaXQgaW50byBhIHNtYWxsIGxvb2stdXAgdGFibGUgcGFja2VkX3RhYmxlW10KKy8vIFRoZSBjb21tb24gbGl0ZXJhbCBiYXNlLCBpZiBhcHBsaWNhYmxlLCBpcyBzdG9yZWQgaW4gJ2xpdGVyYWxfYXJiJy4KK3R5cGVkZWYgc3RydWN0IEhUcmVlR3JvdXAgSFRyZWVHcm91cDsKK3N0cnVjdCBIVHJlZUdyb3VwIHsKKyAgSHVmZm1hbkNvZGUqIGh0cmVlc1tIVUZGTUFOX0NPREVTX1BFUl9NRVRBX0NPREVdOworICBpbnQgICAgICBpc190cml2aWFsX2xpdGVyYWw7ICAvLyBUcnVlLCBpZiBodWZmbWFuIHRyZWVzIGZvciBSZWQsIEJsdWUgJiBBbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2xzIGFyZSB0cml2aWFsIChoYXZlIGEgc2luZ2xlIGNvZGUpLgorICB1aW50MzJfdCBsaXRlcmFsX2FyYjsgICAgICAgICAvLyBJZiBpc190cml2aWFsX2xpdGVyYWwgaXMgdHJ1ZSwgdGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQVJHQiB2YWx1ZSBvZiB0aGUgcGl4ZWwsIHdpdGggR3JlZW4gY2hhbm5lbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWluZyBzZXQgdG8gemVyby4KKyAgaW50IGlzX3RyaXZpYWxfY29kZTsgICAgICAgICAgLy8gdHJ1ZSBpZiBpc190cml2aWFsX2xpdGVyYWwgd2l0aCBvbmx5IG9uZSBjb2RlCisgIGludCB1c2VfcGFja2VkX3RhYmxlOyAgICAgICAgIC8vIHVzZSBwYWNrZWQgdGFibGUgYmVsb3cgZm9yIHNob3J0IGxpdGVyYWwgY29kZQorICAvLyB0YWJsZSBtYXBwaW5nIGlucHV0IGJpdHMgdG8gYSBwYWNrZWQgdmFsdWVzLCBvciBlc2NhcGUgY2FzZSB0byBsaXRlcmFsIGNvZGUKKyAgSHVmZm1hbkNvZGUzMiBwYWNrZWRfdGFibGVbSFVGRk1BTl9QQUNLRURfVEFCTEVfU0laRV07Cit9OworCisvLyBDcmVhdGVzIHRoZSBpbnN0YW5jZSBvZiBIVHJlZUdyb3VwIHdpdGggc3BlY2lmaWVkIG51bWJlciBvZiB0cmVlLWdyb3Vwcy4KK0hUcmVlR3JvdXAqIFZQOExIdHJlZUdyb3Vwc05ldyhpbnQgbnVtX2h0cmVlX2dyb3Vwcyk7CisKKy8vIFJlbGVhc2VzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBIVHJlZUdyb3VwLgordm9pZCBWUDhMSHRyZWVHcm91cHNGcmVlKEhUcmVlR3JvdXAqIGNvbnN0IGh0cmVlX2dyb3Vwcyk7CisKKy8vIEJ1aWxkcyBIdWZmbWFuIGxvb2t1cCB0YWJsZSBhc3N1bWluZyBjb2RlIGxlbmd0aHMgYXJlIGluIHN5bWJvbCBvcmRlci4KKy8vIFRoZSAnY29kZV9sZW5ndGhzJyBpcyBwcmUtYWxsb2NhdGVkIHRlbXBvcmFyeSBtZW1vcnkgYnVmZmVyIHVzZWQgZm9yIGNyZWF0aW5nCisvLyB0aGUgaHVmZm1hbiB0YWJsZS4KKy8vIFJldHVybnMgYnVpbHQgdGFibGUgc2l6ZSBvciAwIGluIGNhc2Ugb2YgZXJyb3IgKGludmFsaWQgdHJlZSBvcgorLy8gbWVtb3J5IGVycm9yKS4KK2ludCBWUDhMQnVpbGRIdWZmbWFuVGFibGUoSHVmZm1hbkNvZGUqIGNvbnN0IHJvb3RfdGFibGUsIGludCByb290X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2RlX2xlbmd0aHNbXSwgaW50IGNvZGVfbGVuZ3Roc19zaXplKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIFdFQlBfVVRJTFNfSFVGRk1BTl9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3F1YW50X2xldmVsc19kZWNfdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgxOGE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmMKQEAgLTAsMCArMSwyODUgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBJbXBsZW1lbnQgZ3JhZGllbnQgc21vb3RoaW5nOiB3ZSByZXBsYWNlIGEgY3VycmVudCBhbHBoYSB2YWx1ZSBieSBpdHMKKy8vIHN1cnJvdW5kaW5nIGF2ZXJhZ2UgaWYgaXQncyBjbG9zZSBlbm91Z2ggKHRoYXQgaXM6IHRoZSBjaGFuZ2Ugd2lsbCBiZSBsZXNzCisvLyB0aGFuIHRoZSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdHdvIHF1YW50aXplZCBsZXZlbCkuCisvLyBXZSB1c2Ugc2xpZGluZyB3aW5kb3cgZm9yIGNvbXB1dGluZyB0aGUgMmQgbW92aW5nIGF2ZXJhZ2UuCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtc2V0CisKKyNpbmNsdWRlICJzcmMvdXRpbHMvdXRpbHMuaCIKKworLy8gI2RlZmluZSBVU0VfRElUSEVSSU5HICAgLy8gdW5jb21tZW50IHRvIGVuYWJsZSBvcmRlcmVkIGRpdGhlcmluZyAobm90IHZpdGFsKQorCisjZGVmaW5lIEZJWCAxNiAgICAgLy8gZml4LXBvaW50IHByZWNpc2lvbiBmb3IgYXZlcmFnaW5nCisjZGVmaW5lIExGSVggMiAgICAgLy8gZXh0cmEgcHJlY2lzaW9uIGZvciBsb29rLXVwIHRhYmxlCisjZGVmaW5lIExVVF9TSVpFICgoMSA8PCAoOCArIExGSVgpKSAtIDEpICAvLyBsb29rLXVwIHRhYmxlIHNpemUKKworI2lmIGRlZmluZWQoVVNFX0RJVEhFUklORykKKworI2RlZmluZSBERklYIDQgICAgICAgICAgIC8vIGV4dHJhIHByZWNpc2lvbiBmb3Igb3JkZXJlZCBkaXRoZXJpbmcKKyNkZWZpbmUgRFNJWkUgNCAgICAgICAgICAvLyBkaXRoZXJpbmcgc2l6ZSAobXVzdCBiZSBhIHBvd2VyIG9mIHR3bykKKy8vIGNmLiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09yZGVyZWRfZGl0aGVyaW5nCitzdGF0aWMgY29uc3QgdWludDhfdCBrT3JkZXJlZERpdGhlcltEU0laRV1bRFNJWkVdID0geworICB7ICAwLCAgOCwgIDIsIDEwIH0sICAgICAvLyBjb2VmZmljaWVudHMgYXJlIGluIERGSVggZml4ZWQtcG9pbnQgcHJlY2lzaW9uCisgIHsgMTIsICA0LCAxNCwgIDYgfSwKKyAgeyAgMywgMTEsICAxLCAgOSB9LAorICB7IDE1LCAgNywgMTMsICA1IH0KK307CisKKyNlbHNlCisjZGVmaW5lIERGSVggMAorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgaW50IHdpZHRoXywgaGVpZ2h0XzsgIC8vIGRpbWVuc2lvbgorICBpbnQgc3RyaWRlXzsgICAgICAgICAgLy8gc3RyaWRlIGluIGJ5dGVzCisgIGludCByb3dfOyAgICAgICAgICAgICAvLyBjdXJyZW50IGlucHV0IHJvdyBiZWluZyBwcm9jZXNzZWQKKyAgdWludDhfdCogc3JjXzsgICAgICAgIC8vIGlucHV0IHBvaW50ZXIKKyAgdWludDhfdCogZHN0XzsgICAgICAgIC8vIG91dHB1dCBwb2ludGVyCisKKyAgaW50IHJhZGl1c187ICAgICAgICAgIC8vIGZpbHRlciByYWRpdXMgKD1kZWxheSkKKyAgaW50IHNjYWxlXzsgICAgICAgICAgIC8vIG5vcm1hbGl6YXRpb24gZmFjdG9yLCBpbiBGSVggYml0cyBwcmVjaXNpb24KKworICB2b2lkKiBtZW1fOyAgICAgICAgICAgLy8gYWxsIG1lbW9yeQorCisgIC8vIHZhcmlvdXMgc2NyYXRjaCBidWZmZXJzCisgIHVpbnQxNl90KiBzdGFydF87CisgIHVpbnQxNl90KiBjdXJfOworICB1aW50MTZfdCogZW5kXzsKKyAgdWludDE2X3QqIHRvcF87CisgIHVpbnQxNl90KiBhdmVyYWdlXzsKKworICAvLyBpbnB1dCBsZXZlbHMgZGlzdHJpYnV0aW9uCisgIGludCBudW1fbGV2ZWxzXzsgICAgICAgLy8gbnVtYmVyIG9mIHF1YW50aXplZCBsZXZlbHMKKyAgaW50IG1pbl8sIG1heF87ICAgICAgICAvLyBtaW4gYW5kIG1heCBsZXZlbCB2YWx1ZXMKKyAgaW50IG1pbl9sZXZlbF9kaXN0XzsgICAvLyBzbWFsbGVzdCBkaXN0YW5jZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZSBsZXZlbHMKKworICBpbnQxNl90KiBjb3JyZWN0aW9uXzsgIC8vIHNpemUgPSAxICsgMipMVVRfU0laRSAgLT4gfjRrIG1lbW9yeQorfSBTbW9vdGhQYXJhbXM7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ0xJUF84Yl9NQVNLIChpbnQpKH4wVSA8PCAoOCArIERGSVgpKQorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQ4X3QgY2xpcF84YihpbnQgdikgeworICByZXR1cm4gKCEodiAmIENMSVBfOGJfTUFTSykpID8gKHVpbnQ4X3QpKHYgPj4gREZJWCkgOiAodiA8IDApID8gMHUgOiAyNTV1OworfQorI3VuZGVmIENMSVBfOGJfTUFTSworCisvLyB2ZXJ0aWNhbCBhY2N1bXVsYXRpb24KK3N0YXRpYyB2b2lkIFZGaWx0ZXIoU21vb3RoUGFyYW1zKiBjb25zdCBwKSB7CisgIGNvbnN0IHVpbnQ4X3QqIHNyYyA9IHAtPnNyY187CisgIGNvbnN0IGludCB3ID0gcC0+d2lkdGhfOworICB1aW50MTZfdCogY29uc3QgY3VyID0gcC0+Y3VyXzsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IHRvcCA9IHAtPnRvcF87CisgIHVpbnQxNl90KiBjb25zdCBvdXQgPSBwLT5lbmRfOworICB1aW50MTZfdCBzdW0gPSAwOyAgICAgICAgICAgICAgIC8vIGFsbCBhcml0aG1ldGljIGlzIG1vZHVsbyAxNmJpdAorICBpbnQgeDsKKworICBmb3IgKHggPSAwOyB4IDwgdzsgKyt4KSB7CisgICAgdWludDE2X3QgbmV3X3ZhbHVlOworICAgIHN1bSArPSBzcmNbeF07CisgICAgbmV3X3ZhbHVlID0gdG9wW3hdICsgc3VtOworICAgIG91dFt4XSA9IG5ld192YWx1ZSAtIGN1clt4XTsgIC8vIHZlcnRpY2FsIHN1bSBvZiAncicgcGl4ZWxzLgorICAgIGN1clt4XSA9IG5ld192YWx1ZTsKKyAgfQorICAvLyBtb3ZlIGlucHV0IHBvaW50ZXJzIG9uZSByb3cgZG93bgorICBwLT50b3BfID0gcC0+Y3VyXzsKKyAgcC0+Y3VyXyArPSB3OworICBpZiAocC0+Y3VyXyA9PSBwLT5lbmRfKSBwLT5jdXJfID0gcC0+c3RhcnRfOyAgLy8gcm9sbC1vdmVyCisgIC8vIFdlIHJlcGxpY2F0ZSBlZGdlcywgYXMgaXQncyBzb21ld2hhdCBlYXNpZXIgYXMgYSBib3VuZGFyeSBjb25kaXRpb24uCisgIC8vIFRoYXQncyB3aHkgd2UgZG9uJ3QgdXBkYXRlIHRoZSAnc3JjJyBwb2ludGVyIG9uIHRvcC9ib3R0b20gYXJlYToKKyAgaWYgKHAtPnJvd18gPj0gMCAmJiBwLT5yb3dfIDwgcC0+aGVpZ2h0XyAtIDEpIHsKKyAgICBwLT5zcmNfICs9IHAtPnN0cmlkZV87CisgIH0KK30KKworLy8gaG9yaXpvbnRhbCBhY2N1bXVsYXRpb24uIFdlIHVzZSBtaXJyb3IgcmVwbGljYXRpb24gb2YgbWlzc2luZyBwaXhlbHMsIGFzIGl0J3MKKy8vIGEgbGl0dGxlIGVhc2llciB0byBpbXBsZW1lbnQgKHN1cnByaXNpbmdseSkuCitzdGF0aWMgdm9pZCBIRmlsdGVyKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBjb25zdCB1aW50MTZfdCogY29uc3QgaW4gPSBwLT5lbmRfOworICB1aW50MTZfdCogY29uc3Qgb3V0ID0gcC0+YXZlcmFnZV87CisgIGNvbnN0IHVpbnQzMl90IHNjYWxlID0gcC0+c2NhbGVfOworICBjb25zdCBpbnQgdyA9IHAtPndpZHRoXzsKKyAgY29uc3QgaW50IHIgPSBwLT5yYWRpdXNfOworCisgIGludCB4OworICBmb3IgKHggPSAwOyB4IDw9IHI7ICsreCkgeyAgIC8vIGxlZnQgbWlycm9yaW5nCisgICAgY29uc3QgdWludDE2X3QgZGVsdGEgPSBpblt4ICsgciAtIDFdICsgaW5bciAtIHhdOworICAgIG91dFt4XSA9IChkZWx0YSAqIHNjYWxlKSA+PiBGSVg7CisgIH0KKyAgZm9yICg7IHggPCB3IC0gcjsgKyt4KSB7ICAgICAvLyBidWxrIG1pZGRsZSBydW4KKyAgICBjb25zdCB1aW50MTZfdCBkZWx0YSA9IGluW3ggKyByXSAtIGluW3ggLSByIC0gMV07CisgICAgb3V0W3hdID0gKGRlbHRhICogc2NhbGUpID4+IEZJWDsKKyAgfQorICBmb3IgKDsgeCA8IHc7ICsreCkgeyAgICAgICAgIC8vIHJpZ2h0IG1pcnJvcmluZworICAgIGNvbnN0IHVpbnQxNl90IGRlbHRhID0KKyAgICAgICAgMiAqIGluW3cgLSAxXSAtIGluWzIgKiB3IC0gMiAtIHIgLSB4XSAtIGluW3ggLSByIC0gMV07CisgICAgb3V0W3hdID0gKGRlbHRhICogc2NhbGUpID4+IEZJWDsKKyAgfQorfQorCisvLyBlbWl0IG9uZSBmaWx0ZXJlZCBvdXRwdXQgcm93CitzdGF0aWMgdm9pZCBBcHBseUZpbHRlcihTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgdWludDE2X3QqIGNvbnN0IGF2ZXJhZ2UgPSBwLT5hdmVyYWdlXzsKKyAgY29uc3QgaW50IHcgPSBwLT53aWR0aF87CisgIGNvbnN0IGludDE2X3QqIGNvbnN0IGNvcnJlY3Rpb24gPSBwLT5jb3JyZWN0aW9uXzsKKyNpZiBkZWZpbmVkKFVTRV9ESVRIRVJJTkcpCisgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRpdGhlciA9IGtPcmRlcmVkRGl0aGVyW3AtPnJvd18gJSBEU0laRV07CisjZW5kaWYKKyAgdWludDhfdCogY29uc3QgZHN0ID0gcC0+ZHN0XzsKKyAgaW50IHg7CisgIGZvciAoeCA9IDA7IHggPCB3OyArK3gpIHsKKyAgICBjb25zdCBpbnQgdiA9IGRzdFt4XTsKKyAgICBpZiAodiA8IHAtPm1heF8gJiYgdiA+IHAtPm1pbl8pIHsKKyAgICAgIGNvbnN0IGludCBjID0gKHYgPDwgREZJWCkgKyBjb3JyZWN0aW9uW2F2ZXJhZ2VbeF0gLSAodiA8PCBMRklYKV07CisjaWYgZGVmaW5lZChVU0VfRElUSEVSSU5HKQorICAgICAgZHN0W3hdID0gY2xpcF84YihjICsgZGl0aGVyW3ggJSBEU0laRV0pOworI2Vsc2UKKyAgICAgIGRzdFt4XSA9IGNsaXBfOGIoYyk7CisjZW5kaWYKKyAgICB9CisgIH0KKyAgcC0+ZHN0XyArPSBwLT5zdHJpZGVfOyAgLy8gYWR2YW5jZSBvdXRwdXQgcG9pbnRlcgorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW5pdGlhbGl6ZSBjb3JyZWN0aW9uIHRhYmxlCisKK3N0YXRpYyB2b2lkIEluaXRDb3JyZWN0aW9uTFVUKGludDE2X3QqIGNvbnN0IGx1dCwgaW50IG1pbl9kaXN0KSB7CisgIC8vIFRoZSBjb3JyZWN0aW9uIGN1cnZlIGlzOgorICAvLyAgIGYoeCkgPSB4IGZvciB4IDw9IHRocmVzaG9sZDIKKyAgLy8gICBmKHgpID0gMCBmb3IgeCA+PSB0aHJlc2hvbGQxCisgIC8vIGFuZCBhIGxpbmVhciBpbnRlcnBvbGF0aW9uIGZvciByYW5nZSB4PVt0aHJlc2hvbGQyLCB0aHJlc2hvbGQxXQorICAvLyAoYWxvbmcgd2l0aCBmKC14KSA9IC1mKHgpIHN5bW1ldHJ5KS4KKyAgLy8gTm90ZSB0aGF0OiB0aHJlc2hvbGQyID0gMy80ICogdGhyZXNob2xkMQorICBjb25zdCBpbnQgdGhyZXNob2xkMSA9IG1pbl9kaXN0IDw8IExGSVg7CisgIGNvbnN0IGludCB0aHJlc2hvbGQyID0gKDMgKiB0aHJlc2hvbGQxKSA+PiAyOworICBjb25zdCBpbnQgbWF4X3RocmVzaG9sZCA9IHRocmVzaG9sZDIgPDwgREZJWDsKKyAgY29uc3QgaW50IGRlbHRhID0gdGhyZXNob2xkMSAtIHRocmVzaG9sZDI7CisgIGludCBpOworICBmb3IgKGkgPSAxOyBpIDw9IExVVF9TSVpFOyArK2kpIHsKKyAgICBpbnQgYyA9IChpIDw9IHRocmVzaG9sZDIpID8gKGkgPDwgREZJWCkKKyAgICAgICAgICA6IChpIDwgdGhyZXNob2xkMSkgPyBtYXhfdGhyZXNob2xkICogKHRocmVzaG9sZDEgLSBpKSAvIGRlbHRhCisgICAgICAgICAgOiAwOworICAgIGMgPj49IExGSVg7CisgICAgbHV0WytpXSA9ICtjOworICAgIGx1dFstaV0gPSAtYzsKKyAgfQorICBsdXRbMF0gPSAwOworfQorCitzdGF0aWMgdm9pZCBDb3VudExldmVscyhTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgaW50IGksIGosIGxhc3RfbGV2ZWw7CisgIHVpbnQ4X3QgdXNlZF9sZXZlbHNbMjU2XSA9IHsgMCB9OworICBjb25zdCB1aW50OF90KiBkYXRhID0gcC0+c3JjXzsKKyAgcC0+bWluXyA9IDI1NTsKKyAgcC0+bWF4XyA9IDA7CisgIGZvciAoaiA9IDA7IGogPCBwLT5oZWlnaHRfOyArK2opIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgcC0+d2lkdGhfOyArK2kpIHsKKyAgICAgIGNvbnN0IGludCB2ID0gZGF0YVtpXTsKKyAgICAgIGlmICh2IDwgcC0+bWluXykgcC0+bWluXyA9IHY7CisgICAgICBpZiAodiA+IHAtPm1heF8pIHAtPm1heF8gPSB2OworICAgICAgdXNlZF9sZXZlbHNbdl0gPSAxOworICAgIH0KKyAgICBkYXRhICs9IHAtPnN0cmlkZV87CisgIH0KKyAgLy8gQ29tcHV0ZSB0aGUgbWluaW51bSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBub24temVybyBsZXZlbHMuCisgIHAtPm1pbl9sZXZlbF9kaXN0XyA9IHAtPm1heF8gLSBwLT5taW5fOworICBsYXN0X2xldmVsID0gLTE7CisgIGZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgIGlmICh1c2VkX2xldmVsc1tpXSkgeworICAgICAgKytwLT5udW1fbGV2ZWxzXzsKKyAgICAgIGlmIChsYXN0X2xldmVsID49IDApIHsKKyAgICAgICAgY29uc3QgaW50IGxldmVsX2Rpc3QgPSBpIC0gbGFzdF9sZXZlbDsKKyAgICAgICAgaWYgKGxldmVsX2Rpc3QgPCBwLT5taW5fbGV2ZWxfZGlzdF8pIHsKKyAgICAgICAgICBwLT5taW5fbGV2ZWxfZGlzdF8gPSBsZXZlbF9kaXN0OworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0X2xldmVsID0gaTsKKyAgICB9CisgIH0KK30KKworLy8gSW5pdGlhbGl6ZSBhbGwgcGFyYW1zLgorc3RhdGljIGludCBJbml0UGFyYW1zKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgcmFkaXVzLCBTbW9vdGhQYXJhbXMqIGNvbnN0IHApIHsKKyAgY29uc3QgaW50IFIgPSAyICogcmFkaXVzICsgMTsgIC8vIHRvdGFsIHNpemUgb2YgdGhlIGtlcm5lbAorCisgIGNvbnN0IHNpemVfdCBzaXplX3NjcmF0Y2hfbSA9IChSICsgMSkgKiB3aWR0aCAqIHNpemVvZigqcC0+c3RhcnRfKTsKKyAgY29uc3Qgc2l6ZV90IHNpemVfbSA9ICB3aWR0aCAqIHNpemVvZigqcC0+YXZlcmFnZV8pOworICBjb25zdCBzaXplX3Qgc2l6ZV9sdXQgPSAoMSArIDIgKiBMVVRfU0laRSkgKiBzaXplb2YoKnAtPmNvcnJlY3Rpb25fKTsKKyAgY29uc3Qgc2l6ZV90IHRvdGFsX3NpemUgPSBzaXplX3NjcmF0Y2hfbSArIHNpemVfbSArIHNpemVfbHV0OworICB1aW50OF90KiBtZW0gPSAodWludDhfdCopV2ViUFNhZmVNYWxsb2MoMVUsIHRvdGFsX3NpemUpOworCisgIGlmIChtZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgIHAtPm1lbV8gPSAodm9pZCopbWVtOworCisgIHAtPnN0YXJ0XyA9ICh1aW50MTZfdCopbWVtOworICBwLT5jdXJfID0gcC0+c3RhcnRfOworICBwLT5lbmRfID0gcC0+c3RhcnRfICsgUiAqIHdpZHRoOworICBwLT50b3BfID0gcC0+ZW5kXyAtIHdpZHRoOworICBtZW1zZXQocC0+dG9wXywgMCwgd2lkdGggKiBzaXplb2YoKnAtPnRvcF8pKTsKKyAgbWVtICs9IHNpemVfc2NyYXRjaF9tOworCisgIHAtPmF2ZXJhZ2VfID0gKHVpbnQxNl90KiltZW07CisgIG1lbSArPSBzaXplX207CisKKyAgcC0+d2lkdGhfID0gd2lkdGg7CisgIHAtPmhlaWdodF8gPSBoZWlnaHQ7CisgIHAtPnN0cmlkZV8gPSBzdHJpZGU7CisgIHAtPnNyY18gPSBkYXRhOworICBwLT5kc3RfID0gZGF0YTsKKyAgcC0+cmFkaXVzXyA9IHJhZGl1czsKKyAgcC0+c2NhbGVfID0gKDEgPDwgKEZJWCArIExGSVgpKSAvIChSICogUik7ICAvLyBub3JtYWxpemF0aW9uIGNvbnN0YW50CisgIHAtPnJvd18gPSAtcmFkaXVzOworCisgIC8vIGFuYWx5emUgdGhlIGlucHV0IGRpc3RyaWJ1dGlvbiBzbyB3ZSBjYW4gYmVzdC1maXQgdGhlIHRocmVzaG9sZAorICBDb3VudExldmVscyhwKTsKKworICAvLyBjb3JyZWN0aW9uIHRhYmxlCisgIHAtPmNvcnJlY3Rpb25fID0gKChpbnQxNl90KiltZW0pICsgTFVUX1NJWkU7CisgIEluaXRDb3JyZWN0aW9uTFVUKHAtPmNvcnJlY3Rpb25fLCBwLT5taW5fbGV2ZWxfZGlzdF8pOworCisgIHJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBDbGVhbnVwUGFyYW1zKFNtb290aFBhcmFtcyogY29uc3QgcCkgeworICBXZWJQU2FmZUZyZWUocC0+bWVtXyk7Cit9CisKK2ludCBXZWJQRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVuZ3RoKSB7CisgIGNvbnN0IGludCByYWRpdXMgPSA0ICogc3RyZW5ndGggLyAxMDA7CisgIGlmIChzdHJlbmd0aCA8IDAgfHwgc3RyZW5ndGggPiAxMDApIHJldHVybiAwOworICBpZiAoZGF0YSA9PSBOVUxMIHx8IHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHJldHVybiAwOyAgLy8gYmFkIHBhcmFtcworICBpZiAocmFkaXVzID4gMCkgeworICAgIFNtb290aFBhcmFtcyBwOworICAgIG1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKyAgICBpZiAoIUluaXRQYXJhbXMoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCByYWRpdXMsICZwKSkgcmV0dXJuIDA7CisgICAgaWYgKHAubnVtX2xldmVsc18gPiAyKSB7CisgICAgICBmb3IgKDsgcC5yb3dfIDwgcC5oZWlnaHRfOyArK3Aucm93XykgeworICAgICAgICBWRmlsdGVyKCZwKTsgIC8vIGFjY3VtdWxhdGUgYXZlcmFnZSBvZiBpbnB1dAorICAgICAgICAvLyBOZWVkIHRvIHdhaXQgZmV3IHJvd3MgaW4gb3JkZXIgdG8gcHJpbWUgdGhlIGZpbHRlciwKKyAgICAgICAgLy8gYmVmb3JlIGVtaXR0aW5nIHNvbWUgb3V0cHV0LgorICAgICAgICBpZiAocC5yb3dfID49IHAucmFkaXVzXykgeworICAgICAgICAgIEhGaWx0ZXIoJnApOworICAgICAgICAgIEFwcGx5RmlsdGVyKCZwKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBDbGVhbnVwUGFyYW1zKCZwKTsKKyAgfQorICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfZGVjX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlY191dGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBBbHBoYSBwbGFuZSBkZS1xdWFudGl6YXRpb24gdXRpbGl0eQorLy8KKy8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19ERUNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX1VUSUxTX0hfCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIEFwcGx5IHBvc3QtcHJvY2Vzc2luZyB0byBpbnB1dCAnZGF0YScgb2Ygc2l6ZSAnd2lkdGgneCdoZWlnaHQnIGFzc3VtaW5nIHRoYXQKKy8vIHRoZSBzb3VyY2Ugd2FzIHF1YW50aXplZCB0byBhIHJlZHVjZWQgbnVtYmVyIG9mIGxldmVscy4gJ3N0cmlkZScgaXMgaW4gYnl0ZXMuCisvLyBTdHJlbmd0aCBpcyBpbiBbMC4uMTAwXSBhbmQgY29udHJvbHMgdGhlIGFtb3VudCBvZiBkaXRoZXJpbmcgYXBwbGllZC4KKy8vIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiBlcnJvciAoZGF0YSBpcyBOVUxMLCBpbnZhbGlkIHBhcmFtZXRlcnMsCisvLyBtYWxsb2MgZmFpbHVyZSwgLi4uKS4KK2ludCBXZWJQRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmVuZ3RoKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfUVVBTlRfTEVWRUxTX0RFQ19VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuYwppbmRleCAyZmI2MTBiLi5kNjVhZDNjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHMuYworKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmMKQEAgLTEyLDE3ICsxMiw5IEBACiAvLwogLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKIAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbHNlCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jZW5kaWYKIAotI2luY2x1ZGUgIi4vcXVhbnRfbGV2ZWxzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgorI2luY2x1ZGUgInNyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaCIKIAogI2RlZmluZSBOVU1fU1lNQk9MUyAgICAgMjU2CiAKQEAgLTc2LDggKzY4LDggQEAKICAgLy8gRml4ZWQgdmFsdWVzLiBXb24ndCBiZSBjaGFuZ2VkLgogICBxX2xldmVsW21pbl9zXSA9IDA7CiAgIHFfbGV2ZWxbbWF4X3NdID0gbnVtX2xldmVscyAtIDE7Ci0gIFNCX0RDSEVDSyhpbnZfcV9sZXZlbFswXSA9PSBtaW5fcyk7Ci0gIFNCX0RDSEVDSyhpbnZfcV9sZXZlbFtudW1fbGV2ZWxzIC0gMV0gPT0gbWF4X3MpOworICBhc3NlcnQoaW52X3FfbGV2ZWxbMF0gPT0gbWluX3MpOworICBhc3NlcnQoaW52X3FfbGV2ZWxbbnVtX2xldmVscyAtIDFdID09IG1heF9zKTsKIAogICAvLyBrLU1lYW5zIGl0ZXJhdGlvbnMuCiAgIGZvciAoaXRlciA9IDA7IGl0ZXIgPCBNQVhfSVRFUjsgKytpdGVyKSB7CkBAIC0xNDYsNiArMTM4LDMgQEAKICAgcmV0dXJuIDE7CiB9CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9xdWFudF9sZXZlbHNfdXRpbHMuaAppbmRleCAyZDkwODI4Li43NWRmMmJhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcXVhbnRfbGV2ZWxzX3V0aWxzLmgKQEAgLTExLDE0ICsxMSwxNCBAQAogLy8KIC8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKIAotI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXwotI2RlZmluZSBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19IXworI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19VVElMU19IXwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCisjaW5jbHVkZSAic3JjL3dlYnAvdHlwZXMuaCIKIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYKIApAQCAtMjksOCArMjksOCBAQAogaW50IFF1YW50aXplTGV2ZWxzKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG51bV9sZXZlbHMsCiAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGNvbnN0IHNzZSk7CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLyogV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfSF8gKi8KKyNlbmRpZiAgLyogV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGQyNmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3JhbmRvbV91dGlscy5jCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQc2V1ZG8tcmFuZG9tIHV0aWxpdGllcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgInNyYy91dGlscy9yYW5kb21fdXRpbHMuaCIKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gMzFiLXJhbmdlIHZhbHVlcworc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSYW5kb21UYWJsZVtWUDhfUkFORE9NX1RBQkxFX1NJWkVdID0geworICAweDBkZTE1MjMwLCAweDAzYjMxODg2LCAweDc3NWZhY2NiLCAweDFjODg2MjZhLCAweDY4Mzg1YzU1LCAweDE0YjNiODI4LAorICAweDRhODVmZWY4LCAweDQ5ZGRiODRiLCAweDY0ZmNmMzk3LCAweDVjNTUwMjg5LCAweDRhMjkwMDAwLCAweDBkN2VjMWRhLAorICAweDU5NDBiN2FiLCAweDU0OTI1NzdkLCAweDRlMTljYTcyLCAweDM4ZDM4YzY5LCAweDBjMDFlZTY1LCAweDMyYTE3NTVmLAorICAweDU0MzdmNjUyLCAweDVhYmIyYzMyLCAweDBmYWE1N2IxLCAweDczZjUzM2U3LCAweDY4NWZlZWRhLCAweDc1NjNjY2UyLAorICAweDZlOTkwZTgzLCAweDQ3MzBhN2VkLCAweDRmYzBkOWM2LCAweDQ5NmIxNTNjLCAweDRmMTQwM2ZhLCAweDU0MWFmYjBjLAorICAweDczOTkwYjMyLCAweDI2ZDdjYjFjLCAweDZmY2MzNzA2LCAweDJjYmI3N2Q4LCAweDc1NzYyZjJhLCAweDY0MjVjY2RkLAorICAweDI0YjM1NDYxLCAweDBhN2Q4NzE1LCAweDIyMDQxNGE4LCAweDE0MWViZjY3LCAweDU2YjQxNTgzLCAweDczZTUwMmUzLAorICAweDQ0Y2FiMTZmLCAweDI4MjY0ZDQyLCAweDczYmFhZWZiLCAweDBhNTBlYmVkLCAweDFkNmFiNmZiLCAweDBkM2FkNDBiLAorICAweDM1ZGIzYjY4LCAweDJiMDgxZTgzLCAweDc3Y2U2Yjk1LCAweDUxODFlNWYwLCAweDc4ODUzYmJjLCAweDAwOWY5NDk0LAorICAweDI3ZTVlZDNjCit9OworCit2b2lkIFZQOEluaXRSYW5kb20oVlA4UmFuZG9tKiBjb25zdCByZywgZmxvYXQgZGl0aGVyaW5nKSB7CisgIG1lbWNweShyZy0+dGFiXywga1JhbmRvbVRhYmxlLCBzaXplb2YocmctPnRhYl8pKTsKKyAgcmctPmluZGV4MV8gPSAwOworICByZy0+aW5kZXgyXyA9IDMxOworICByZy0+YW1wXyA9IChkaXRoZXJpbmcgPCAwLjApID8gMAorICAgICAgICAgICA6IChkaXRoZXJpbmcgPiAxLjApID8gKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKQorICAgICAgICAgICA6ICh1aW50MzJfdCkoKDEgPDwgVlA4X1JBTkRPTV9ESVRIRVJfRklYKSAqIGRpdGhlcmluZyk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yYW5kb21fdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQ1ZDQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3JhbmRvbV91dGlscy5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBQc2V1ZG8tcmFuZG9tIHV0aWxpdGllcworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19SQU5ET01fVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19SQU5ET01fVVRJTFNfSF8KKworI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNlbHNlCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjZW5kaWYKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgVlA4X1JBTkRPTV9ESVRIRVJfRklYIDggICAvLyBmaXhlZC1wb2ludCBwcmVjaXNpb24gZm9yIGRpdGhlcmluZworI2RlZmluZSBWUDhfUkFORE9NX1RBQkxFX1NJWkUgNTUKKwordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQgaW5kZXgxXywgaW5kZXgyXzsKKyAgdWludDMyX3QgdGFiX1tWUDhfUkFORE9NX1RBQkxFX1NJWkVdOworICBpbnQgYW1wXzsKK30gVlA4UmFuZG9tOworCisvLyBJbml0aWFsaXplcyByYW5kb20gZ2VuZXJhdG9yIHdpdGggYW4gYW1wbGl0dWRlICdkaXRoZXJpbmcnIGluIHJhbmdlIFswLi4xXS4KK3ZvaWQgVlA4SW5pdFJhbmRvbShWUDhSYW5kb20qIGNvbnN0IHJnLCBmbG9hdCBkaXRoZXJpbmcpOworCisvLyBSZXR1cm5zIGEgY2VudGVyZWQgcHNldWRvLXJhbmRvbSBudW1iZXIgd2l0aCAnbnVtX2JpdHMnIGFtcGxpdHVkZS4KKy8vICh1c2VzIEQuS251dGgncyBEaWZmZXJlbmNlLWJhc2VkIHJhbmRvbSBnZW5lcmF0b3IpLgorLy8gJ2FtcCcgaXMgaW4gVlA4X1JBTkRPTV9ESVRIRVJfRklYIGZpeGVkLXBvaW50IHByZWNpc2lvbi4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4UmFuZG9tQml0czIoVlA4UmFuZG9tKiBjb25zdCByZywgaW50IG51bV9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW1wKSB7CisgIGludCBkaWZmOworICBTQl9EQ0hFQ0sobnVtX2JpdHMgKyBWUDhfUkFORE9NX0RJVEhFUl9GSVggPD0gMzEpOworICBkaWZmID0gcmctPnRhYl9bcmctPmluZGV4MV9dIC0gcmctPnRhYl9bcmctPmluZGV4Ml9dOworICBpZiAoZGlmZiA8IDApIGRpZmYgKz0gKDF1IDw8IDMxKTsKKyAgcmctPnRhYl9bcmctPmluZGV4MV9dID0gZGlmZjsKKyAgaWYgKCsrcmctPmluZGV4MV8gPT0gVlA4X1JBTkRPTV9UQUJMRV9TSVpFKSByZy0+aW5kZXgxXyA9IDA7CisgIGlmICgrK3JnLT5pbmRleDJfID09IFZQOF9SQU5ET01fVEFCTEVfU0laRSkgcmctPmluZGV4Ml8gPSAwOworICAvLyBzaWduLWV4dGVuZCwgMC1jZW50ZXIKKyAgZGlmZiA9IChpbnQpKCh1aW50MzJfdClkaWZmIDw8IDEpID4+ICgzMiAtIG51bV9iaXRzKTsKKyAgZGlmZiA9IChkaWZmICogYW1wKSA+PiBWUDhfUkFORE9NX0RJVEhFUl9GSVg7ICAvLyByZXN0cmljdCByYW5nZQorICBkaWZmICs9IDEgPDwgKG51bV9iaXRzIC0gMSk7ICAgICAgICAgICAgICAgICAgIC8vIHNoaWZ0IGJhY2sgdG8gMC41LWNlbnRlcgorICByZXR1cm4gZGlmZjsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhSYW5kb21CaXRzKFZQOFJhbmRvbSogY29uc3QgcmcsIGludCBudW1fYml0cykgeworICByZXR1cm4gVlA4UmFuZG9tQml0czIocmcsIG51bV9iaXRzLCByZy0+YW1wXyk7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX1JBTkRPTV9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvcmVzY2FsZXJfdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGUyZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmMKQEAgLTAsMCArMSwxNDggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBSZXNjYWxpbmcgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgInNyYy9kc3AvZHNwLmgiCisjaW5jbHVkZSAic3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgiCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgV2ViUFJlc2NhbGVySW5pdChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogY29uc3QgZHN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfd2lkdGgsIGludCBkc3RfaGVpZ2h0LCBpbnQgZHN0X3N0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCByZXNjYWxlcl90KiBjb25zdCB3b3JrKSB7CisgIGNvbnN0IGludCB4X2FkZCA9IHNyY193aWR0aCwgeF9zdWIgPSBkc3Rfd2lkdGg7CisgIGNvbnN0IGludCB5X2FkZCA9IHNyY19oZWlnaHQsIHlfc3ViID0gZHN0X2hlaWdodDsKKyAgd3JrLT54X2V4cGFuZCA9IChzcmNfd2lkdGggPCBkc3Rfd2lkdGgpOworICB3cmstPnlfZXhwYW5kID0gKHNyY19oZWlnaHQgPCBkc3RfaGVpZ2h0KTsKKyAgd3JrLT5zcmNfd2lkdGggPSBzcmNfd2lkdGg7CisgIHdyay0+c3JjX2hlaWdodCA9IHNyY19oZWlnaHQ7CisgIHdyay0+ZHN0X3dpZHRoID0gZHN0X3dpZHRoOworICB3cmstPmRzdF9oZWlnaHQgPSBkc3RfaGVpZ2h0OworICB3cmstPnNyY195ID0gMDsKKyAgd3JrLT5kc3RfeSA9IDA7CisgIHdyay0+ZHN0ID0gZHN0OworICB3cmstPmRzdF9zdHJpZGUgPSBkc3Rfc3RyaWRlOworICB3cmstPm51bV9jaGFubmVscyA9IG51bV9jaGFubmVsczsKKworICAvLyBmb3IgJ3hfZXhwYW5kJywgd2UgdXNlIGJpbGluZWFyIGludGVycG9sYXRpb24KKyAgd3JrLT54X2FkZCA9IHdyay0+eF9leHBhbmQgPyAoeF9zdWIgLSAxKSA6IHhfYWRkOworICB3cmstPnhfc3ViID0gd3JrLT54X2V4cGFuZCA/ICh4X2FkZCAtIDEpIDogeF9zdWI7CisgIGlmICghd3JrLT54X2V4cGFuZCkgeyAgLy8gZnhfc2NhbGUgaXMgbm90IHVzZWQgb3RoZXJ3aXNlCisgICAgd3JrLT5meF9zY2FsZSA9IFdFQlBfUkVTQ0FMRVJfRlJBQygxLCB3cmstPnhfc3ViKTsKKyAgfQorICAvLyB2ZXJ0aWNhbCBzY2FsaW5nIHBhcmFtZXRlcnMKKyAgd3JrLT55X2FkZCA9IHdyay0+eV9leHBhbmQgPyB5X2FkZCAtIDEgOiB5X2FkZDsKKyAgd3JrLT55X3N1YiA9IHdyay0+eV9leHBhbmQgPyB5X3N1YiAtIDEgOiB5X3N1YjsKKyAgd3JrLT55X2FjY3VtID0gd3JrLT55X2V4cGFuZCA/IHdyay0+eV9zdWIgOiB3cmstPnlfYWRkOworICBpZiAoIXdyay0+eV9leHBhbmQpIHsKKyAgICAvLyBUaGlzIGlzIFdFQlBfUkVTQ0FMRVJfRlJBQyhkc3RfaGVpZ2h0LCB4X2FkZCAqIHlfYWRkKSB3aXRob3V0IHRoZSBjYXN0LgorICAgIC8vIEl0cyB2YWx1ZSBpcyA8PSBXRUJQX1JFU0NBTEVSX09ORSwgYmVjYXVzZSBkc3RfaGVpZ2h0IDw9IHdyay0+eV9hZGQsIGFuZAorICAgIC8vIHdyay0+eF9hZGQgPj0gMTsKKyAgICBjb25zdCB1aW50NjRfdCByYXRpbyA9CisgICAgICAgICh1aW50NjRfdClkc3RfaGVpZ2h0ICogV0VCUF9SRVNDQUxFUl9PTkUgLyAod3JrLT54X2FkZCAqIHdyay0+eV9hZGQpOworICAgIGlmIChyYXRpbyAhPSAodWludDMyX3QpcmF0aW8pIHsKKyAgICAgIC8vIFdoZW4gcmF0aW8gPT0gV0VCUF9SRVNDQUxFUl9PTkUsIHdlIGNhbid0IHJlcHJlc2VudCB0aGUgcmF0aW8gd2l0aCB0aGUKKyAgICAgIC8vIGN1cnJlbnQgZml4ZWQtcG9pbnQgcHJlY2lzaW9uLiBUaGlzIGhhcHBlbnMgd2hlbiBzcmNfaGVpZ2h0ID09CisgICAgICAvLyB3cmstPnlfYWRkICh3aGljaCA9PSBzcmNfaGVpZ2h0KSwgYW5kIHdyay0+eF9hZGQgPT0gMS4KKyAgICAgIC8vID0+IFdlIHNwZWNpYWwtY2FzZSBmeHlfc2NhbGUgPSAwLCBpbiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coKS4KKyAgICAgIHdyay0+Znh5X3NjYWxlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgd3JrLT5meHlfc2NhbGUgPSAodWludDMyX3QpcmF0aW87CisgICAgfQorICAgIHdyay0+Znlfc2NhbGUgPSBXRUJQX1JFU0NBTEVSX0ZSQUMoMSwgd3JrLT55X3N1Yik7CisgIH0gZWxzZSB7CisgICAgd3JrLT5meV9zY2FsZSA9IFdFQlBfUkVTQ0FMRVJfRlJBQygxLCB3cmstPnhfYWRkKTsKKyAgICAvLyB3cmstPmZ4eV9zY2FsZSBpcyB1bnVzZWQgaGVyZS4KKyAgfQorICB3cmstPmlyb3cgPSB3b3JrOworICB3cmstPmZyb3cgPSB3b3JrICsgbnVtX2NoYW5uZWxzICogZHN0X3dpZHRoOworICBtZW1zZXQod29yaywgMCwgMiAqIGRzdF93aWR0aCAqIG51bV9jaGFubmVscyAqIHNpemVvZigqd29yaykpOworCisgIFdlYlBSZXNjYWxlckRzcEluaXQoKTsKK30KKworaW50IFdlYlBSZXNjYWxlckdldFNjYWxlZERpbWVuc2lvbnMoaW50IHNyY193aWR0aCwgaW50IHNyY19oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHNjYWxlZF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY29uc3Qgc2NhbGVkX2hlaWdodCkgeworICBhc3NlcnQoc2NhbGVkX3dpZHRoICE9IE5VTEwpOworICBhc3NlcnQoc2NhbGVkX2hlaWdodCAhPSBOVUxMKTsKKyAgeworICAgIGludCB3aWR0aCA9ICpzY2FsZWRfd2lkdGg7CisgICAgaW50IGhlaWdodCA9ICpzY2FsZWRfaGVpZ2h0OworCisgICAgLy8gaWYgd2lkdGggaXMgdW5zcGVjaWZpZWQsIHNjYWxlIG9yaWdpbmFsIHByb3BvcnRpb25hbGx5IHRvIGhlaWdodCByYXRpby4KKyAgICBpZiAod2lkdGggPT0gMCkgeworICAgICAgd2lkdGggPQorICAgICAgICAgIChpbnQpKCgodWludDY0X3Qpc3JjX3dpZHRoICogaGVpZ2h0ICsgc3JjX2hlaWdodCAvIDIpIC8gc3JjX2hlaWdodCk7CisgICAgfQorICAgIC8vIGlmIGhlaWdodCBpcyB1bnNwZWNpZmllZCwgc2NhbGUgb3JpZ2luYWwgcHJvcG9ydGlvbmFsbHkgdG8gd2lkdGggcmF0aW8uCisgICAgaWYgKGhlaWdodCA9PSAwKSB7CisgICAgICBoZWlnaHQgPQorICAgICAgICAgIChpbnQpKCgodWludDY0X3Qpc3JjX2hlaWdodCAqIHdpZHRoICsgc3JjX3dpZHRoIC8gMikgLyBzcmNfd2lkdGgpOworICAgIH0KKyAgICAvLyBDaGVjayBpZiB0aGUgb3ZlcmFsbCBkaW1lbnNpb25zIHN0aWxsIG1ha2Ugc2Vuc2UuCisgICAgaWYgKHdpZHRoIDw9IDAgfHwgaGVpZ2h0IDw9IDApIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgICpzY2FsZWRfd2lkdGggPSB3aWR0aDsKKyAgICAqc2NhbGVkX2hlaWdodCA9IGhlaWdodDsKKyAgICByZXR1cm4gMTsKKyAgfQorfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gYWxsLWluLW9uZSBjYWxscworCitpbnQgV2ViUFJlc2NhbGVOZWVkZWRMaW5lcyhjb25zdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IG1heF9udW1fbGluZXMpIHsKKyAgY29uc3QgaW50IG51bV9saW5lcyA9ICh3cmstPnlfYWNjdW0gKyB3cmstPnlfc3ViIC0gMSkgLyB3cmstPnlfc3ViOworICByZXR1cm4gKG51bV9saW5lcyA+IG1heF9udW1fbGluZXMpID8gbWF4X251bV9saW5lcyA6IG51bV9saW5lczsKK30KKworaW50IFdlYlBSZXNjYWxlckltcG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaywgaW50IG51bV9saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc3JjLCBpbnQgc3JjX3N0cmlkZSkgeworICBpbnQgdG90YWxfaW1wb3J0ZWQgPSAwOworICB3aGlsZSAodG90YWxfaW1wb3J0ZWQgPCBudW1fbGluZXMgJiYgIVdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQod3JrKSkgeworICAgIGlmICh3cmstPnlfZXhwYW5kKSB7CisgICAgICByZXNjYWxlcl90KiBjb25zdCB0bXAgPSB3cmstPmlyb3c7CisgICAgICB3cmstPmlyb3cgPSB3cmstPmZyb3c7CisgICAgICB3cmstPmZyb3cgPSB0bXA7CisgICAgfQorICAgIFdlYlBSZXNjYWxlckltcG9ydFJvdyh3cmssIHNyYyk7CisgICAgaWYgKCF3cmstPnlfZXhwYW5kKSB7ICAgICAvLyBBY2N1bXVsYXRlIHRoZSBjb250cmlidXRpb24gb2YgdGhlIG5ldyByb3cuCisgICAgICBpbnQgeDsKKyAgICAgIGZvciAoeCA9IDA7IHggPCB3cmstPm51bV9jaGFubmVscyAqIHdyay0+ZHN0X3dpZHRoOyArK3gpIHsKKyAgICAgICAgd3JrLT5pcm93W3hdICs9IHdyay0+ZnJvd1t4XTsKKyAgICAgIH0KKyAgICB9CisgICAgKyt3cmstPnNyY195OworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgICsrdG90YWxfaW1wb3J0ZWQ7CisgICAgd3JrLT55X2FjY3VtIC09IHdyay0+eV9zdWI7CisgIH0KKyAgcmV0dXJuIHRvdGFsX2ltcG9ydGVkOworfQorCitpbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKKyAgaW50IHRvdGFsX2V4cG9ydGVkID0gMDsKKyAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7CisgICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKKyAgICArK3RvdGFsX2V4cG9ydGVkOworICB9CisgIHJldHVybiB0b3RhbF9leHBvcnRlZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3Jlc2NhbGVyX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg5MGU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy9yZXNjYWxlcl91dGlscy5oCkBAIC0wLDAgKzEsMTAxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gUmVzY2FsaW5nIGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZm5kZWYgV0VCUF9VVElMU19SRVNDQUxFUl9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX1JFU0NBTEVSX1VUSUxTX0hfCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgInNyYy93ZWJwL3R5cGVzLmgiCisKKyNkZWZpbmUgV0VCUF9SRVNDQUxFUl9SRklYIDMyICAgLy8gZml4ZWQtcG9pbnQgcHJlY2lzaW9uIGZvciBtdWx0aXBsaWVzCisjZGVmaW5lIFdFQlBfUkVTQ0FMRVJfT05FICgxdWxsIDw8IFdFQlBfUkVTQ0FMRVJfUkZJWCkKKyNkZWZpbmUgV0VCUF9SRVNDQUxFUl9GUkFDKHgsIHkpIFwKKyAgICAoKHVpbnQzMl90KSgoKHVpbnQ2NF90KSh4KSA8PCBXRUJQX1JFU0NBTEVSX1JGSVgpIC8gKHkpKSkKKworLy8gU3RydWN0dXJlIHVzZWQgZm9yIG9uLXRoZS1mbHkgcmVzY2FsaW5nCit0eXBlZGVmIHVpbnQzMl90IHJlc2NhbGVyX3Q7ICAgLy8gdHlwZSBmb3Igc2lkZS1idWZmZXIKK3R5cGVkZWYgc3RydWN0IFdlYlBSZXNjYWxlciBXZWJQUmVzY2FsZXI7CitzdHJ1Y3QgV2ViUFJlc2NhbGVyIHsKKyAgaW50IHhfZXhwYW5kOyAgICAgICAgICAgICAgIC8vIHRydWUgaWYgd2UncmUgZXhwYW5kaW5nIGluIHRoZSB4IGRpcmVjdGlvbgorICBpbnQgeV9leHBhbmQ7ICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiB3ZSdyZSBleHBhbmRpbmcgaW4gdGhlIHkgZGlyZWN0aW9uCisgIGludCBudW1fY2hhbm5lbHM7ICAgICAgICAgICAvLyBieXRlcyB0byBqdW1wIGJldHdlZW4gcGl4ZWxzCisgIHVpbnQzMl90IGZ4X3NjYWxlOyAgICAgICAgICAvLyBmaXhlZC1wb2ludCBzY2FsaW5nIGZhY3RvcnMKKyAgdWludDMyX3QgZnlfc2NhbGU7ICAgICAgICAgIC8vICcnCisgIHVpbnQzMl90IGZ4eV9zY2FsZTsgICAgICAgICAvLyAnJworICBpbnQgeV9hY2N1bTsgICAgICAgICAgICAgICAgLy8gdmVydGljYWwgYWNjdW11bGF0b3IKKyAgaW50IHlfYWRkLCB5X3N1YjsgICAgICAgICAgIC8vIHZlcnRpY2FsIGluY3JlbWVudHMKKyAgaW50IHhfYWRkLCB4X3N1YjsgICAgICAgICAgIC8vIGhvcml6b250YWwgaW5jcmVtZW50cworICBpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyAgLy8gc291cmNlIGRpbWVuc2lvbnMKKyAgaW50IGRzdF93aWR0aCwgZHN0X2hlaWdodDsgIC8vIGRlc3RpbmF0aW9uIGRpbWVuc2lvbnMKKyAgaW50IHNyY195LCBkc3RfeTsgICAgICAgICAgIC8vIHJvdyBjb3VudGVycyBmb3IgaW5wdXQgYW5kIG91dHB1dAorICB1aW50OF90KiBkc3Q7CisgIGludCBkc3Rfc3RyaWRlOworICByZXNjYWxlcl90KiBpcm93LCAqZnJvdzsgICAgLy8gd29yayBidWZmZXIKK307CisKKy8vIEluaXRpYWxpemUgYSByZXNjYWxlciBnaXZlbiBzY3JhdGNoIGFyZWEgJ3dvcmsnIGFuZCBkaW1lbnNpb25zIG9mIHNyYyAmIGRzdC4KK3ZvaWQgV2ViUFJlc2NhbGVySW5pdChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3dpZHRoLCBpbnQgZHN0X2hlaWdodCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICByZXNjYWxlcl90KiBjb25zdCB3b3JrKTsKKworLy8gSWYgZWl0aGVyICdzY2FsZWRfd2lkdGgnIG9yICdzY2FsZWRfaGVpZ2h0JyAoYnV0IG5vdCBib3RoKSBpcyAwIHRoZSB2YWx1ZQorLy8gd2lsbCBiZSBjYWxjdWxhdGVkIHByZXNlcnZpbmcgdGhlIGFzcGVjdCByYXRpbywgb3RoZXJ3aXNlIHRoZSB2YWx1ZXMgYXJlCisvLyBsZWZ0IHVubW9kaWZpZWQuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBlaXRoZXIgdmFsdWUgaXMgMCBhZnRlcgorLy8gcGVyZm9ybWluZyB0aGUgc2NhbGluZyBjYWxjdWxhdGlvbi4KK2ludCBXZWJQUmVzY2FsZXJHZXRTY2FsZWREaW1lbnNpb25zKGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb25zdCBzY2FsZWRfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvbnN0IHNjYWxlZF9oZWlnaHQpOworCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgaW5wdXQgbGluZXMgbmVlZGVkIG5leHQgdG8gcHJvZHVjZSBvbmUgb3V0cHV0IGxpbmUsCisvLyBjb25zaWRlcmluZyB0aGF0IHRoZSBtYXhpbXVtIGF2YWlsYWJsZSBpbnB1dCBsaW5lcyBhcmUgJ21heF9udW1fbGluZXMnLgoraW50IFdlYlBSZXNjYWxlTmVlZGVkTGluZXMoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfbnVtX2xpbmVzKTsKKworLy8gSW1wb3J0IG11bHRpcGxlIHJvd3Mgb3ZlciBhbGwgY2hhbm5lbHMsIHVudGlsIGF0IGxlYXN0IG9uZSByb3cgaXMgcmVhZHkgdG8KKy8vIGJlIGV4cG9ydGVkLiBSZXR1cm5zIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGxpbmVzIHRoYXQgd2VyZSBpbXBvcnRlZC4KK2ludCBXZWJQUmVzY2FsZXJJbXBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwgaW50IG51bV9yb3dzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlKTsKKworLy8gRXhwb3J0IGFzIG1hbnkgcm93cyBhcyBwb3NzaWJsZS4gUmV0dXJuIHRoZSBudW1iZXJzIG9mIHJvd3Mgd3JpdHRlbi4KK2ludCBXZWJQUmVzY2FsZXJFeHBvcnQoV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcik7CisKKy8vIFJldHVybiB0cnVlIGlmIGlucHV0IGlzIGZpbmlzaGVkCitzdGF0aWMgV0VCUF9JTkxJTkUKK2ludCBXZWJQUmVzY2FsZXJJbnB1dERvbmUoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgeworICByZXR1cm4gKHJlc2NhbGVyLT5zcmNfeSA+PSByZXNjYWxlci0+c3JjX2hlaWdodCk7Cit9CisvLyBSZXR1cm4gdHJ1ZSBpZiBvdXRwdXQgaXMgZmluaXNoZWQKK3N0YXRpYyBXRUJQX0lOTElORQoraW50IFdlYlBSZXNjYWxlck91dHB1dERvbmUoY29uc3QgV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlcikgeworICByZXR1cm4gKHJlc2NhbGVyLT5kc3RfeSA+PSByZXNjYWxlci0+ZHN0X2hlaWdodCk7Cit9CisKKy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBwZW5kaW5nIG91dHB1dCByb3dzIHJlYWR5Lgorc3RhdGljIFdFQlBfSU5MSU5FCitpbnQgV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChjb25zdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7CisgIHJldHVybiAhV2ViUFJlc2NhbGVyT3V0cHV0RG9uZShyZXNjYWxlcikgJiYgKHJlc2NhbGVyLT55X2FjY3VtIDw9IDApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9VVElMU19SRVNDQUxFUl9VVElMU19IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3RocmVhZF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNTJiNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBNdWx0aS10aHJlYWRlZCB3b3JrZXIKKy8vCisvLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+ICAgLy8gZm9yIG1lbXNldCgpCisjaW5jbHVkZSAic3JjL3V0aWxzL3RocmVhZF91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisKKyNpZiBkZWZpbmVkKF9XSU4zMikKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KK3R5cGVkZWYgSEFORExFIHB0aHJlYWRfdDsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiBwdGhyZWFkX211dGV4X3Q7CisKKyNpZiBfV0lOMzJfV0lOTlQgPj0gMHgwNjAwICAvLyBXaW5kb3dzIFZpc3RhIC8gU2VydmVyIDIwMDggb3IgZ3JlYXRlcgorI2RlZmluZSBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKK3R5cGVkZWYgQ09ORElUSU9OX1ZBUklBQkxFIHB0aHJlYWRfY29uZF90OworI2Vsc2UKK3R5cGVkZWYgc3RydWN0IHsKKyAgSEFORExFIHdhaXRpbmdfc2VtXzsKKyAgSEFORExFIHJlY2VpdmVkX3NlbV87CisgIEhBTkRMRSBzaWduYWxfZXZlbnRfOworfSBwdGhyZWFkX2NvbmRfdDsKKyNlbmRpZiAgLy8gX1dJTjMyX1dJTk5UID49IDB4NjAwCisKKyNpZm5kZWYgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04KKyNkZWZpbmUgV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QIDEKKyNkZWZpbmUgV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oeCkgeAorI2VuZGlmCisKKyNpZiAhV0lOQVBJX0ZBTUlMWV9QQVJUSVRJT04oV0lOQVBJX1BBUlRJVElPTl9ERVNLVE9QKQorI2RlZmluZSBVU0VfQ1JFQVRFX1RIUkVBRAorI2VuZGlmCisKKyNlbHNlICAvLyAhX1dJTjMyCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNlbmRpZiAgLy8gX1dJTjMyCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgcHRocmVhZF9tdXRleF90IG11dGV4XzsKKyAgcHRocmVhZF9jb25kX3QgIGNvbmRpdGlvbl87CisgIHB0aHJlYWRfdCAgICAgICB0aHJlYWRfOworfSBXZWJQV29ya2VySW1wbDsKKworI2lmIGRlZmluZWQoX1dJTjMyKQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2ltcGxpc3RpYyBwdGhyZWFkIGVtdWxhdGlvbiBsYXllcgorCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorCisvLyBfYmVnaW50aHJlYWRleCByZXF1aXJlcyBfX3N0ZGNhbGwKKyNkZWZpbmUgVEhSRUFERk4gdW5zaWduZWQgaW50IF9fc3RkY2FsbAorI2RlZmluZSBUSFJFQURfUkVUVVJOKHZhbCkgKHVuc2lnbmVkIGludCkoKERXT1JEX1BUUil2YWwpCisKKyNpZiBfV0lOMzJfV0lOTlQgPj0gMHgwNTAxICAvLyBXaW5kb3dzIFhQIG9yIGdyZWF0ZXIKKyNkZWZpbmUgV2FpdEZvclNpbmdsZU9iamVjdChvYmosIHRpbWVvdXQpIFwKKyAgV2FpdEZvclNpbmdsZU9iamVjdEV4KG9iaiwgdGltZW91dCwgRkFMU0UgLypiQWxlcnRhYmxlKi8pCisjZW5kaWYKKworc3RhdGljIGludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIGNvbnN0IHRocmVhZCwgY29uc3Qgdm9pZCogYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IChfX3N0ZGNhbGwgKnN0YXJ0KSh2b2lkKiksIHZvaWQqIGFyZykgeworICAodm9pZClhdHRyOworI2lmZGVmIFVTRV9DUkVBVEVfVEhSRUFECisgICp0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgICAvKiBscFRocmVhZEF0dHJpYnV0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIGR3U3RhY2tTaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogZHdTdGFja1NpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgIC8qIGxwVGhyZWFkSWQgKi8KKyNlbHNlCisgICp0aHJlYWQgPSAocHRocmVhZF90KV9iZWdpbnRocmVhZGV4KE5VTEwsICAgLyogdm9pZCAqc2VjdXJpdHkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAvKiB1bnNpZ25lZCBzdGFja19zaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgaW5pdGZsYWcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7ICAvKiB1bnNpZ25lZCAqdGhyZGFkZHIgKi8KKyNlbmRpZgorICBpZiAoKnRocmVhZCA9PSBOVUxMKSByZXR1cm4gMTsKKyAgU2V0VGhyZWFkUHJpb3JpdHkoKnRocmVhZCwgVEhSRUFEX1BSSU9SSVRZX0FCT1ZFX05PUk1BTCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkKiogdmFsdWVfcHRyKSB7CisgICh2b2lkKXZhbHVlX3B0cjsKKyAgcmV0dXJuIChXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpICE9IFdBSVRfT0JKRUNUXzAgfHwKKyAgICAgICAgICBDbG9zZUhhbmRsZSh0aHJlYWQpID09IDApOworfQorCisvLyBNdXRleAorc3RhdGljIGludCBwdGhyZWFkX211dGV4X2luaXQocHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCwgdm9pZCogbXV0ZXhhdHRyKSB7CisgICh2b2lkKW11dGV4YXR0cjsKKyNpZiBfV0lOMzJfV0lOTlQgPj0gMHgwNjAwICAvLyBXaW5kb3dzIFZpc3RhIC8gU2VydmVyIDIwMDggb3IgZ3JlYXRlcgorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uRXgobXV0ZXgsIDAgLypkd1NwaW5Db3VudCovLCAwIC8qRmxhZ3MqLyk7CisjZWxzZQorICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKKyNlbmRpZgorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX211dGV4X2xvY2socHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgeworICBFbnRlckNyaXRpY2FsU2VjdGlvbihtdXRleCk7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKKyAgTGVhdmVDcml0aWNhbFNlY3Rpb24obXV0ZXgpOworICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90KiBjb25zdCBtdXRleCkgeworICBEZWxldGVDcml0aWNhbFNlY3Rpb24obXV0ZXgpOworICByZXR1cm4gMDsKK30KKworLy8gQ29uZGl0aW9uCitzdGF0aWMgaW50IHB0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKKyAgaW50IG9rID0gMTsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgKHZvaWQpY29uZGl0aW9uOworI2Vsc2UKKyAgb2sgJj0gKENsb3NlSGFuZGxlKGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fKSAhPSAwKTsKKyAgb2sgJj0gKENsb3NlSGFuZGxlKGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXykgIT0gMCk7CisgIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnNpZ25hbF9ldmVudF8pICE9IDApOworI2VuZGlmCisgIHJldHVybiAhb2s7Cit9CisKK3N0YXRpYyBpbnQgcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbiwgdm9pZCogY29uZF9hdHRyKSB7CisgICh2b2lkKWNvbmRfYXR0cjsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgSW5pdGlhbGl6ZUNvbmRpdGlvblZhcmlhYmxlKGNvbmRpdGlvbik7CisjZWxzZQorICBjb25kaXRpb24tPndhaXRpbmdfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKKyAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIDAsIDEsIE5VTEwpOworICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOworICBpZiAoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPT0gTlVMTCB8fAorICAgICAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID09IE5VTEwgfHwKKyAgICAgIGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XyA9PSBOVUxMKSB7CisgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koY29uZGl0aW9uKTsKKyAgICByZXR1cm4gMTsKKyAgfQorI2VuZGlmCisgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IHB0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QqIGNvbnN0IGNvbmRpdGlvbikgeworICBpbnQgb2sgPSAxOworI2lmZGVmIFVTRV9XSU5ET1dTX0NPTkRJVElPTl9WQVJJQUJMRQorICBXYWtlQ29uZGl0aW9uVmFyaWFibGUoY29uZGl0aW9uKTsKKyNlbHNlCisgIGlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+d2FpdGluZ19zZW1fLCAwKSA9PSBXQUlUX09CSkVDVF8wKSB7CisgICAgLy8gYSB0aHJlYWQgaXMgd2FpdGluZyBpbiBwdGhyZWFkX2NvbmRfd2FpdDogYWxsb3cgaXQgdG8gYmUgbm90aWZpZWQKKyAgICBvayA9IFNldEV2ZW50KGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50Xyk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgZXZlbnQgaXMgY29uc3VtZWQgc28gdGhlIHNpZ25hbGVyIGNhbm5vdCBjb25zdW1lCisgICAgLy8gdGhlIGV2ZW50IHZpYSBpdHMgb3duIHB0aHJlYWRfY29uZF93YWl0LgorICAgIG9rICY9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXywgSU5GSU5JVEUpICE9CisgICAgICAgICAgIFdBSVRfT0JKRUNUXzApOworICB9CisjZW5kaWYKKyAgcmV0dXJuICFvazsKK30KKworc3RhdGljIGludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7CisgIGludCBvazsKKyNpZmRlZiBVU0VfV0lORE9XU19DT05ESVRJT05fVkFSSUFCTEUKKyAgb2sgPSBTbGVlcENvbmRpdGlvblZhcmlhYmxlQ1MoY29uZGl0aW9uLCBtdXRleCwgSU5GSU5JVEUpOworI2Vsc2UKKyAgLy8gbm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uc3VtZXIgYXZhaWxhYmxlIHNvIHRoZSBzaWduYWwgaXNuJ3QgZHJvcHBlZCBpbgorICAvLyBwdGhyZWFkX2NvbmRfc2lnbmFsCisgIGlmICghUmVsZWFzZVNlbWFwaG9yZShjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMSwgTlVMTCkpIHJldHVybiAxOworICAvLyBub3cgdW5sb2NrIHRoZSBtdXRleCBzbyBwdGhyZWFkX2NvbmRfc2lnbmFsIG1heSBiZSBpc3N1ZWQKKyAgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpOworICBvayA9IChXYWl0Rm9yU2luZ2xlT2JqZWN0KGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XywgSU5GSU5JVEUpID09CisgICAgICAgIFdBSVRfT0JKRUNUXzApOworICBvayAmPSBSZWxlYXNlU2VtYXBob3JlKGNvbmRpdGlvbi0+cmVjZWl2ZWRfc2VtXywgMSwgTlVMTCk7CisgIHB0aHJlYWRfbXV0ZXhfbG9jayhtdXRleCk7CisjZW5kaWYKKyAgcmV0dXJuICFvazsKK30KKworI2Vsc2UgIC8vICFfV0lOMzIKKyMgZGVmaW5lIFRIUkVBREZOIHZvaWQqCisjIGRlZmluZSBUSFJFQURfUkVUVVJOKHZhbCkgdmFsCisjZW5kaWYgIC8vIF9XSU4zMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgVEhSRUFERk4gVGhyZWFkTG9vcCh2b2lkKiBwdHIpIHsKKyAgV2ViUFdvcmtlciogY29uc3Qgd29ya2VyID0gKFdlYlBXb3JrZXIqKXB0cjsKKyAgV2ViUFdvcmtlckltcGwqIGNvbnN0IGltcGwgPSAoV2ViUFdvcmtlckltcGwqKXdvcmtlci0+aW1wbF87CisgIGludCBkb25lID0gMDsKKyAgd2hpbGUgKCFkb25lKSB7CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpbXBsLT5tdXRleF8pOworICAgIHdoaWxlICh3b3JrZXItPnN0YXR1c18gPT0gT0spIHsgICAvLyB3YWl0IGluIGlkbGluZyBtb2RlCisgICAgICBwdGhyZWFkX2NvbmRfd2FpdCgmaW1wbC0+Y29uZGl0aW9uXywgJmltcGwtPm11dGV4Xyk7CisgICAgfQorICAgIGlmICh3b3JrZXItPnN0YXR1c18gPT0gV09SSykgeworICAgICAgV2ViUEdldFdvcmtlckludGVyZmFjZSgpLT5FeGVjdXRlKHdvcmtlcik7CisgICAgICB3b3JrZXItPnN0YXR1c18gPSBPSzsKKyAgICB9IGVsc2UgaWYgKHdvcmtlci0+c3RhdHVzXyA9PSBOT1RfT0spIHsgICAvLyBmaW5pc2ggdGhlIHdvcmtlcgorICAgICAgZG9uZSA9IDE7CisgICAgfQorICAgIC8vIHNpZ25hbCB0byB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSdyZSBkb25lIChmb3IgU3luYygpKQorICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJmltcGwtPmNvbmRpdGlvbl8pOworICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbXBsLT5tdXRleF8pOworICB9CisgIHJldHVybiBUSFJFQURfUkVUVVJOKE5VTEwpOyAgICAvLyBUaHJlYWQgaXMgZmluaXNoZWQKK30KKworLy8gbWFpbiB0aHJlYWQgc3RhdGUgY29udHJvbAorc3RhdGljIHZvaWQgQ2hhbmdlU3RhdGUoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyLCBXZWJQV29ya2VyU3RhdHVzIG5ld19zdGF0dXMpIHsKKyAgLy8gTm8tb3Agd2hlbiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBzdGF0ZSBvbiBhIHRocmVhZCB0aGF0IGRpZG4ndCBjb21lIHVwLgorICAvLyBDaGVja2luZyBzdGF0dXNfIHdpdGhvdXQgYWNxdWlyaW5nIHRoZSBsb2NrIGZpcnN0IHdvdWxkIHJlc3VsdCBpbiBhIGRhdGEKKyAgLy8gcmFjZS4KKyAgV2ViUFdvcmtlckltcGwqIGNvbnN0IGltcGwgPSAoV2ViUFdvcmtlckltcGwqKXdvcmtlci0+aW1wbF87CisgIGlmIChpbXBsID09IE5VTEwpIHJldHVybjsKKworICBwdGhyZWFkX211dGV4X2xvY2soJmltcGwtPm11dGV4Xyk7CisgIGlmICh3b3JrZXItPnN0YXR1c18gPj0gT0spIHsKKyAgICAvLyB3YWl0IGZvciB0aGUgd29ya2VyIHRvIGZpbmlzaAorICAgIHdoaWxlICh3b3JrZXItPnN0YXR1c18gIT0gT0spIHsKKyAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZpbXBsLT5jb25kaXRpb25fLCAmaW1wbC0+bXV0ZXhfKTsKKyAgICB9CisgICAgLy8gYXNzaWduIG5ldyBzdGF0dXMgYW5kIHJlbGVhc2UgdGhlIHdvcmtpbmcgdGhyZWFkIGlmIG5lZWRlZAorICAgIGlmIChuZXdfc3RhdHVzICE9IE9LKSB7CisgICAgICB3b3JrZXItPnN0YXR1c18gPSBuZXdfc3RhdHVzOworICAgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmaW1wbC0+Y29uZGl0aW9uXyk7CisgICAgfQorICB9CisgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZpbXBsLT5tdXRleF8pOworfQorCisjZW5kaWYgIC8vIFdFQlBfVVNFX1RIUkVBRAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBJbml0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworICBtZW1zZXQod29ya2VyLCAwLCBzaXplb2YoKndvcmtlcikpOworICB3b3JrZXItPnN0YXR1c18gPSBOT1RfT0s7Cit9CisKK3N0YXRpYyBpbnQgU3luYyhXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyNpZmRlZiBXRUJQX1VTRV9USFJFQUQKKyAgQ2hhbmdlU3RhdGUod29ya2VyLCBPSyk7CisjZW5kaWYKKyAgYXNzZXJ0KHdvcmtlci0+c3RhdHVzXyA8PSBPSyk7CisgIHJldHVybiAhd29ya2VyLT5oYWRfZXJyb3I7Cit9CisKK3N0YXRpYyBpbnQgUmVzZXQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisgIGludCBvayA9IDE7CisgIHdvcmtlci0+aGFkX2Vycm9yID0gMDsKKyAgaWYgKHdvcmtlci0+c3RhdHVzXyA8IE9LKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgICAgV2ViUFdvcmtlckltcGwqIGNvbnN0IGltcGwgPQorICAgICAgICAoV2ViUFdvcmtlckltcGwqKVdlYlBTYWZlQ2FsbG9jKDEsIHNpemVvZihXZWJQV29ya2VySW1wbCkpOworICAgIHdvcmtlci0+aW1wbF8gPSAodm9pZCopaW1wbDsKKyAgICBpZiAod29ya2VyLT5pbXBsXyA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKHB0aHJlYWRfbXV0ZXhfaW5pdCgmaW1wbC0+bXV0ZXhfLCBOVUxMKSkgeworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgaWYgKHB0aHJlYWRfY29uZF9pbml0KCZpbXBsLT5jb25kaXRpb25fLCBOVUxMKSkgeworICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZpbXBsLT5tdXRleF8pOworICAgICAgZ290byBFcnJvcjsKKyAgICB9CisgICAgcHRocmVhZF9tdXRleF9sb2NrKCZpbXBsLT5tdXRleF8pOworICAgIG9rID0gIXB0aHJlYWRfY3JlYXRlKCZpbXBsLT50aHJlYWRfLCBOVUxMLCBUaHJlYWRMb29wLCB3b3JrZXIpOworICAgIGlmIChvaykgd29ya2VyLT5zdGF0dXNfID0gT0s7CisgICAgcHRocmVhZF9tdXRleF91bmxvY2soJmltcGwtPm11dGV4Xyk7CisgICAgaWYgKCFvaykgeworICAgICAgcHRocmVhZF9tdXRleF9kZXN0cm95KCZpbXBsLT5tdXRleF8pOworICAgICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koJmltcGwtPmNvbmRpdGlvbl8pOworIEVycm9yOgorICAgICAgV2ViUFNhZmVGcmVlKGltcGwpOworICAgICAgd29ya2VyLT5pbXBsXyA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisjZWxzZQorICAgIHdvcmtlci0+c3RhdHVzXyA9IE9LOworI2VuZGlmCisgIH0gZWxzZSBpZiAod29ya2VyLT5zdGF0dXNfID4gT0spIHsKKyAgICBvayA9IFN5bmMod29ya2VyKTsKKyAgfQorICBhc3NlcnQoIW9rIHx8ICh3b3JrZXItPnN0YXR1c18gPT0gT0spKTsKKyAgcmV0dXJuIG9rOworfQorCitzdGF0aWMgdm9pZCBFeGVjdXRlKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgeworICBpZiAod29ya2VyLT5ob29rICE9IE5VTEwpIHsKKyAgICB3b3JrZXItPmhhZF9lcnJvciB8PSAhd29ya2VyLT5ob29rKHdvcmtlci0+ZGF0YTEsIHdvcmtlci0+ZGF0YTIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIExhdW5jaChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKKyNpZmRlZiBXRUJQX1VTRV9USFJFQUQKKyAgQ2hhbmdlU3RhdGUod29ya2VyLCBXT1JLKTsKKyNlbHNlCisgIEV4ZWN1dGUod29ya2VyKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBFbmQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7CisjaWZkZWYgV0VCUF9VU0VfVEhSRUFECisgIGlmICh3b3JrZXItPmltcGxfICE9IE5VTEwpIHsKKyAgICBXZWJQV29ya2VySW1wbCogY29uc3QgaW1wbCA9IChXZWJQV29ya2VySW1wbCopd29ya2VyLT5pbXBsXzsKKyAgICBDaGFuZ2VTdGF0ZSh3b3JrZXIsIE5PVF9PSyk7CisgICAgcHRocmVhZF9qb2luKGltcGwtPnRocmVhZF8sIE5VTEwpOworICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmaW1wbC0+bXV0ZXhfKTsKKyAgICBwdGhyZWFkX2NvbmRfZGVzdHJveSgmaW1wbC0+Y29uZGl0aW9uXyk7CisgICAgV2ViUFNhZmVGcmVlKGltcGwpOworICAgIHdvcmtlci0+aW1wbF8gPSBOVUxMOworICB9CisjZWxzZQorICB3b3JrZXItPnN0YXR1c18gPSBOT1RfT0s7CisgIGFzc2VydCh3b3JrZXItPmltcGxfID09IE5VTEwpOworI2VuZGlmCisgIGFzc2VydCh3b3JrZXItPnN0YXR1c18gPT0gTk9UX09LKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIFdlYlBXb3JrZXJJbnRlcmZhY2UgZ193b3JrZXJfaW50ZXJmYWNlID0geworICBJbml0LCBSZXNldCwgU3luYywgTGF1bmNoLCBFeGVjdXRlLCBFbmQKK307CisKK2ludCBXZWJQU2V0V29ya2VySW50ZXJmYWNlKGNvbnN0IFdlYlBXb3JrZXJJbnRlcmZhY2UqIGNvbnN0IHdpbnRlcmZhY2UpIHsKKyAgaWYgKHdpbnRlcmZhY2UgPT0gTlVMTCB8fAorICAgICAgd2ludGVyZmFjZS0+SW5pdCA9PSBOVUxMIHx8IHdpbnRlcmZhY2UtPlJlc2V0ID09IE5VTEwgfHwKKyAgICAgIHdpbnRlcmZhY2UtPlN5bmMgPT0gTlVMTCB8fCB3aW50ZXJmYWNlLT5MYXVuY2ggPT0gTlVMTCB8fAorICAgICAgd2ludGVyZmFjZS0+RXhlY3V0ZSA9PSBOVUxMIHx8IHdpbnRlcmZhY2UtPkVuZCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZ193b3JrZXJfaW50ZXJmYWNlID0gKndpbnRlcmZhY2U7CisgIHJldHVybiAxOworfQorCitjb25zdCBXZWJQV29ya2VySW50ZXJmYWNlKiBXZWJQR2V0V29ya2VySW50ZXJmYWNlKHZvaWQpIHsKKyAgcmV0dXJuICZnX3dvcmtlcl9pbnRlcmZhY2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdGhyZWFkX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhZTZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy90aHJlYWRfdXRpbHMuaApAQCAtMCwwICsxLDkwIEBACisvLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTXVsdGktdGhyZWFkZWQgd29ya2VyCisvLworLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKKworI2lmbmRlZiBXRUJQX1VUSUxTX1RIUkVBRF9VVElMU19IXworI2RlZmluZSBXRUJQX1VUSUxTX1RIUkVBRF9VVElMU19IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vIFN0YXRlIG9mIHRoZSB3b3JrZXIgdGhyZWFkIG9iamVjdAordHlwZWRlZiBlbnVtIHsKKyAgTk9UX09LID0gMCwgICAvLyBvYmplY3QgaXMgdW51c2FibGUKKyAgT0ssICAgICAgICAgICAvLyByZWFkeSB0byB3b3JrCisgIFdPUksgICAgICAgICAgLy8gYnVzeSBmaW5pc2hpbmcgdGhlIGN1cnJlbnQgdGFzaworfSBXZWJQV29ya2VyU3RhdHVzOworCisvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYnkgdGhlIHdvcmtlciB0aHJlYWQuIFRha2VzIHR3byBvcGFxdWUgcG9pbnRlcnMgYXMKKy8vIGFyZ3VtZW50cyAoZGF0YTEgYW5kIGRhdGEyKSwgYW5kIHNob3VsZCByZXR1cm4gZmFsc2UgaW4gY2FzZSBvZiBlcnJvci4KK3R5cGVkZWYgaW50ICgqV2ViUFdvcmtlckhvb2spKHZvaWQqLCB2b2lkKik7CisKKy8vIFN5bmNocm9uaXphdGlvbiBvYmplY3QgdXNlZCB0byBsYXVuY2ggam9iIGluIHRoZSB3b3JrZXIgdGhyZWFkCit0eXBlZGVmIHN0cnVjdCB7CisgIHZvaWQqIGltcGxfOyAgICAgICAgICAgIC8vIHBsYXRmb3JtLWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiB3b3JrZXIgZGV0YWlscworICBXZWJQV29ya2VyU3RhdHVzIHN0YXR1c187CisgIFdlYlBXb3JrZXJIb29rIGhvb2s7ICAgIC8vIGhvb2sgdG8gY2FsbAorICB2b2lkKiBkYXRhMTsgICAgICAgICAgICAvLyBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCisgIHZvaWQqIGRhdGEyOyAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCisgIGludCBoYWRfZXJyb3I7ICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBjYWxsIHRvICdob29rJworfSBXZWJQV29ya2VyOworCisvLyBUaGUgaW50ZXJmYWNlIGZvciBhbGwgdGhyZWFkLXdvcmtlciByZWxhdGVkIGZ1bmN0aW9ucy4gQWxsIHRoZXNlIGZ1bmN0aW9ucworLy8gbXVzdCBiZSBpbXBsZW1lbnRlZC4KK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gTXVzdCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kLgorICB2b2lkICgqSW5pdCkoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gTXVzdCBiZSBjYWxsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb2JqZWN0IGFuZCBzcGF3biB0aGUgdGhyZWFkLiBSZS1lbnRyYW50LgorICAvLyBXaWxsIHBvdGVudGlhbGx5IGxhdW5jaCB0aGUgdGhyZWFkLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCisgIGludCAoKlJlc2V0KShXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOworICAvLyBNYWtlcyBzdXJlIHRoZSBwcmV2aW91cyB3b3JrIGlzIGZpbmlzaGVkLiBSZXR1cm5zIHRydWUgaWYgd29ya2VyLT5oYWRfZXJyb3IKKyAgLy8gd2FzIG5vdCBzZXQgYW5kIG5vIGVycm9yIGNvbmRpdGlvbiB3YXMgdHJpZ2dlcmVkIGJ5IHRoZSB3b3JraW5nIHRocmVhZC4KKyAgaW50ICgqU3luYykoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKKyAgLy8gVHJpZ2dlcnMgdGhlIHRocmVhZCB0byBjYWxsIGhvb2soKSB3aXRoIGRhdGExIGFuZCBkYXRhMiBhcmd1bWVudHMuIFRoZXNlCisgIC8vIGhvb2svZGF0YTEvZGF0YTIgdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJlZm9yZSBjYWxsaW5nIHRoaXMKKyAgLy8gZnVuY3Rpb24sIGJ1dCBub3QgYmUgY2hhbmdlZCBhZnRlcndhcmQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBTeW5jKCkuCisgIHZvaWQgKCpMYXVuY2gpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBMYXVuY2goKSBleGNlcHQgdGhhdCBpdCBjYWxscyB0aGUKKyAgLy8gaG9vayBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIGEgdGhyZWFkLiBDb252ZW5pZW50IHRvIGJ5cGFzcyB0aGUgdGhyZWFkCisgIC8vIG1lY2hhbmlzbSB3aGlsZSBzdGlsbCB1c2luZyB0aGUgV2ViUFdvcmtlciBzdHJ1Y3RzLiBTeW5jKCkgbXVzdAorICAvLyBzdGlsbCBiZSBjYWxsZWQgYWZ0ZXJ3YXJkIChmb3IgZXJyb3IgcmVwb3J0aW5nKS4KKyAgdm9pZCAoKkV4ZWN1dGUpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7CisgIC8vIEtpbGwgdGhlIHRocmVhZCBhbmQgdGVybWluYXRlIHRoZSBvYmplY3QuIFRvIHVzZSB0aGUgb2JqZWN0IGFnYWluLCBvbmUKKyAgLy8gbXVzdCBjYWxsIFJlc2V0KCkgYWdhaW4uCisgIHZvaWQgKCpFbmQpKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Cit9IFdlYlBXb3JrZXJJbnRlcmZhY2U7CisKKy8vIEluc3RhbGwgYSBuZXcgc2V0IG9mIHRocmVhZGluZyBmdW5jdGlvbnMsIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRzLiBUaGlzCisvLyBzaG91bGQgYmUgZG9uZSBiZWZvcmUgYW55IHdvcmtlcnMgYXJlIHN0YXJ0ZWQsIGkuZS4sIGJlZm9yZSBhbnkgZW5jb2Rpbmcgb3IKKy8vIGRlY29kaW5nIHRha2VzIHBsYWNlLiBUaGUgY29udGVudHMgb2YgdGhlIGludGVyZmFjZSBzdHJ1Y3QgYXJlIGNvcGllZCwgaXQKKy8vIGlzIHNhZmUgdG8gZnJlZSB0aGUgY29ycmVzcG9uZGluZyBtZW1vcnkgYWZ0ZXIgdGhpcyBjYWxsLiBUaGlzIGZ1bmN0aW9uIGlzCisvLyBub3QgdGhyZWFkLXNhZmUuIFJldHVybiBmYWxzZSBpbiBjYXNlIG9mIGludmFsaWQgcG9pbnRlciBvciBtZXRob2RzLgorV0VCUF9FWFRFUk4gaW50IFdlYlBTZXRXb3JrZXJJbnRlcmZhY2UoCisgICAgY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogY29uc3Qgd2ludGVyZmFjZSk7CisKKy8vIFJldHJpZXZlIHRoZSBjdXJyZW50bHkgc2V0IHRocmVhZCB3b3JrZXIgaW50ZXJmYWNlLgorV0VCUF9FWFRFUk4gY29uc3QgV2ViUFdvcmtlckludGVyZmFjZSogV2ViUEdldFdvcmtlckludGVyZmFjZSh2b2lkKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9ICAgIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8qIFdFQlBfVVRJTFNfVEhSRUFEX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjQ4NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvdXRpbHMvdXRpbHMuYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucworLy8KKy8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9hc3NlcnRfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisjZWxzZQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gZm9yIG1lbWNweSgpCisjZW5kaWYKKyNpbmNsdWRlICJzcmMvd2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9lbmNvZGUuaCIKKyNpbmNsdWRlICJzcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiICAvLyBmb3IgTUFYX1BBTEVUVEVfU0laRQorI2luY2x1ZGUgInNyYy91dGlscy9jb2xvcl9jYWNoZV91dGlscy5oIgorI2luY2x1ZGUgInNyYy91dGlscy91dGlscy5oIgorCisvLyBJZiBQUklOVF9NRU1fSU5GTyBpcyBkZWZpbmVkLCBleHRyYSBpbmZvIChsaWtlIHRvdGFsIG1lbW9yeSB1c2VkLCBudW1iZXIgb2YKKy8vIGFsbG9jL2ZyZWUgZXRjKSBpcyBwcmludGVkLiBGb3IgZGVidWdnaW5nL3R1bmluZyBwdXJwb3NlIG9ubHkgKGl0J3Mgc2xvdywKKy8vIGFuZCBub3QgbXVsdGktdGhyZWFkIHNhZmUhKS4KKy8vIEFuIGludGVyZXN0aW5nIGFsdGVybmF0aXZlIGlzIHZhbGdyaW5kJ3MgJ21hc3NpZicgdG9vbDoKKy8vICAgIGh0dHA6Ly92YWxncmluZC5vcmcvZG9jcy9tYW51YWwvbXMtbWFudWFsLmh0bWwKKy8vIEhlcmUgaXMgYW4gZXhhbXBsZSBjb21tYW5kIGxpbmU6CisvKiAgICB2YWxncmluZCAtLXRvb2w9bWFzc2lmIC0tbWFzc2lmLW91dC1maWxlPW1hc3NpZi5vdXQgXAorICAgICAgICAgICAgICAgLS1zdGFja3M9eWVzIC0tYWxsb2MtZm49V2ViUFNhZmVNYWxsb2MgLS1hbGxvYy1mbj1XZWJQU2FmZUNhbGxvYworICAgICAgbXNfcHJpbnQgbWFzc2lmLm91dAorKi8KKy8vIEluIGFkZGl0aW9uOgorLy8gKiBpZiBQUklOVF9NRU1fVFJBRkZJQyBpcyBkZWZpbmVkLCBhbGwgdGhlIGRldGFpbHMgb2YgdGhlIG1hbGxvYy9mcmVlIGN5Y2xlcworLy8gICBhcmUgcHJpbnRlZC4KKy8vICogaWYgTUFMTE9DX0ZBSUxfQVQgaXMgZGVmaW5lZCwgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCB2YXJpYWJsZQorLy8gICAkTUFMTE9DX0ZBSUxfQVQgaXMgdXNlZCB0byBzaW11bGF0ZSBhIG1lbW9yeSBlcnJvciB3aGVuIGNhbGxvYyBvciBtYWxsb2MKKy8vICAgaXMgY2FsbGVkIGZvciB0aGUgbnRoIHRpbWUuIEV4YW1wbGUgdXNhZ2U6CisvLyAgIGV4cG9ydCBNQUxMT0NfRkFJTF9BVD01MCAmJiAuL2V4YW1wbGVzL2N3ZWJwIGlucHV0LnBuZworLy8gKiBpZiBNQUxMT0NfTElNSVQgaXMgZGVmaW5lZCwgdGhlIGdsb2JhbCBlbnZpcm9ubWVudCB2YXJpYWJsZSAkTUFMTE9DX0xJTUlUCisvLyAgIHNldHMgdGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSAoaW4gYnl0ZXMpIG1hZGUgYXZhaWxhYmxlIHRvIGxpYndlYnAuCisvLyAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZW11bGF0ZSBlbnZpcm9ubWVudCB3aXRoIHZlcnkgbGltaXRlZCBtZW1vcnkuCisvLyAgIEV4YW1wbGU6IGV4cG9ydCBNQUxMT0NfTElNSVQ9NjQwMDAwMDAgJiYgLi9leGFtcGxlcy9kd2VicCBwaWN0dXJlLndlYnAKKworLy8gI2RlZmluZSBQUklOVF9NRU1fSU5GTworLy8gI2RlZmluZSBQUklOVF9NRU1fVFJBRkZJQworLy8gI2RlZmluZSBNQUxMT0NfRkFJTF9BVAorLy8gI2RlZmluZSBNQUxMT0NfTElNSVQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENoZWNrZWQgbWVtb3J5IGFsbG9jYXRpb24KKworI2lmIGRlZmluZWQoUFJJTlRfTUVNX0lORk8pCisKKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZgorCitzdGF0aWMgaW50IG51bV9tYWxsb2NfY2FsbHMgPSAwOworc3RhdGljIGludCBudW1fY2FsbG9jX2NhbGxzID0gMDsKK3N0YXRpYyBpbnQgbnVtX2ZyZWVfY2FsbHMgPSAwOworc3RhdGljIGludCBjb3VudGRvd25fdG9fZmFpbCA9IDA7ICAgICAvLyAwID0gb2ZmCisKK3R5cGVkZWYgc3RydWN0IE1lbUJsb2NrIE1lbUJsb2NrOworc3RydWN0IE1lbUJsb2NrIHsKKyAgdm9pZCogcHRyXzsKKyAgc2l6ZV90IHNpemVfOworICBNZW1CbG9jayogbmV4dF87Cit9OworCitzdGF0aWMgTWVtQmxvY2sqIGFsbF9ibG9ja3MgPSBOVUxMOworc3RhdGljIHNpemVfdCB0b3RhbF9tZW0gPSAwOworc3RhdGljIHNpemVfdCB0b3RhbF9tZW1fYWxsb2NhdGVkID0gMDsKK3N0YXRpYyBzaXplX3QgaGlnaF93YXRlcl9tYXJrID0gMDsKK3N0YXRpYyBzaXplX3QgbWVtX2xpbWl0ID0gMDsKKworc3RhdGljIGludCBleGl0X3JlZ2lzdGVyZWQgPSAwOworCitzdGF0aWMgdm9pZCBQcmludE1lbUluZm8odm9pZCkgeworICBmcHJpbnRmKHN0ZGVyciwgIlxuTUVNT1JZIElORk86XG4iKTsKKyAgZnByaW50ZihzdGRlcnIsICJudW0gY2FsbHMgdG86IG1hbGxvYyA9ICU0ZFxuIiwgbnVtX21hbGxvY19jYWxscyk7CisgIGZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgICBjYWxsb2MgPSAlNGRcbiIsIG51bV9jYWxsb2NfY2FsbHMpOworICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICAgICAgZnJlZSAgID0gJTRkXG4iLCBudW1fZnJlZV9jYWxscyk7CisgIGZwcmludGYoc3RkZXJyLCAidG90YWxfbWVtOiAldVxuIiwgKHVpbnQzMl90KXRvdGFsX21lbSk7CisgIGZwcmludGYoc3RkZXJyLCAidG90YWxfbWVtIGFsbG9jYXRlZDogJXVcbiIsICh1aW50MzJfdCl0b3RhbF9tZW1fYWxsb2NhdGVkKTsKKyAgZnByaW50ZihzdGRlcnIsICJoaWdoLXdhdGVyIG1hcms6ICV1XG4iLCAodWludDMyX3QpaGlnaF93YXRlcl9tYXJrKTsKKyAgd2hpbGUgKGFsbF9ibG9ja3MgIT0gTlVMTCkgeworICAgIE1lbUJsb2NrKiBiID0gYWxsX2Jsb2NrczsKKyAgICBhbGxfYmxvY2tzID0gYi0+bmV4dF87CisgICAgZnJlZShiKTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBJbmNyZW1lbnQoaW50KiBjb25zdCB2KSB7CisgIGlmICghZXhpdF9yZWdpc3RlcmVkKSB7CisjaWYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgICB7CisgICAgICBjb25zdCBjaGFyKiBjb25zdCBtYWxsb2NfZmFpbF9hdF9zdHIgPSBnZXRlbnYoIk1BTExPQ19GQUlMX0FUIik7CisgICAgICBpZiAobWFsbG9jX2ZhaWxfYXRfc3RyICE9IE5VTEwpIHsKKyAgICAgICAgY291bnRkb3duX3RvX2ZhaWwgPSBhdG9pKG1hbGxvY19mYWlsX2F0X3N0cik7CisgICAgICB9CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChNQUxMT0NfTElNSVQpCisgICAgeworICAgICAgY29uc3QgY2hhciogY29uc3QgbWFsbG9jX2xpbWl0X3N0ciA9IGdldGVudigiTUFMTE9DX0xJTUlUIik7CisgICAgICBpZiAobWFsbG9jX2xpbWl0X3N0ciAhPSBOVUxMKSB7CisgICAgICAgIG1lbV9saW1pdCA9IGF0b2kobWFsbG9jX2xpbWl0X3N0cik7CisgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgKHZvaWQpY291bnRkb3duX3RvX2ZhaWw7CisgICAgKHZvaWQpbWVtX2xpbWl0OworICAgIGF0ZXhpdChQcmludE1lbUluZm8pOworICAgIGV4aXRfcmVnaXN0ZXJlZCA9IDE7CisgIH0KKyAgKysqdjsKK30KKworc3RhdGljIHZvaWQgQWRkTWVtKHZvaWQqIHB0ciwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgTWVtQmxvY2sqIGNvbnN0IGIgPSAoTWVtQmxvY2sqKW1hbGxvYyhzaXplb2YoKmIpKTsKKyAgICBpZiAoYiA9PSBOVUxMKSBhYm9ydCgpOworICAgIGItPm5leHRfID0gYWxsX2Jsb2NrczsKKyAgICBhbGxfYmxvY2tzID0gYjsKKyAgICBiLT5wdHJfID0gcHRyOworICAgIGItPnNpemVfID0gc2l6ZTsKKyAgICB0b3RhbF9tZW0gKz0gc2l6ZTsKKyAgICB0b3RhbF9tZW1fYWxsb2NhdGVkICs9IHNpemU7CisjaWYgZGVmaW5lZChQUklOVF9NRU1fVFJBRkZJQykKKyNpZiBkZWZpbmVkKE1BTExPQ19GQUlMX0FUKQorICAgIGZwcmludGYoc3RkZXJyLCAiZmFpbC1jb3VudDogJTVkIFttZW09JXVdXG4iLAorICAgICAgICAgICAgbnVtX21hbGxvY19jYWxscyArIG51bV9jYWxsb2NfY2FsbHMsICh1aW50MzJfdCl0b3RhbF9tZW0pOworI2Vsc2UKKyAgICBmcHJpbnRmKHN0ZGVyciwgIk1lbTogJXUgKCsldSlcbiIsICh1aW50MzJfdCl0b3RhbF9tZW0sICh1aW50MzJfdClzaXplKTsKKyNlbmRpZgorI2VuZGlmCisgICAgaWYgKHRvdGFsX21lbSA+IGhpZ2hfd2F0ZXJfbWFyaykgaGlnaF93YXRlcl9tYXJrID0gdG90YWxfbWVtOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFN1Yk1lbSh2b2lkKiBwdHIpIHsKKyAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgTWVtQmxvY2sqKiBiID0gJmFsbF9ibG9ja3M7CisgICAgLy8gSW5lZmZpY2llbnQgc2VhcmNoLCBidXQgdGhhdCdzIGp1c3QgZm9yIGRlYnVnZ2luZy4KKyAgICB3aGlsZSAoKmIgIT0gTlVMTCAmJiAoKmIpLT5wdHJfICE9IHB0cikgYiA9ICYoKmIpLT5uZXh0XzsKKyAgICBpZiAoKmIgPT0gTlVMTCkgeworICAgICAgZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIHBvaW50ZXIgZnJlZSEgKCVwKVxuIiwgcHRyKTsKKyAgICAgIGFib3J0KCk7CisgICAgfQorICAgIHsKKyAgICAgIE1lbUJsb2NrKiBjb25zdCBibG9jayA9ICpiOworICAgICAgKmIgPSBibG9jay0+bmV4dF87CisgICAgICB0b3RhbF9tZW0gLT0gYmxvY2stPnNpemVfOworI2lmIGRlZmluZWQoUFJJTlRfTUVNX1RSQUZGSUMpCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIk1lbTogJXUgKC0ldSlcbiIsCisgICAgICAgICAgICAgICh1aW50MzJfdCl0b3RhbF9tZW0sICh1aW50MzJfdClibG9jay0+c2l6ZV8pOworI2VuZGlmCisgICAgICBmcmVlKGJsb2NrKTsKKyAgICB9CisgIH0KK30KKworI2Vsc2UKKyNkZWZpbmUgSW5jcmVtZW50KHYpIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBBZGRNZW0ocCwgcykgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIFN1Yk1lbShwKSAgICBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorCisvLyBSZXR1cm5zIDAgaW4gY2FzZSBvZiBvdmVyZmxvdyBvZiBubWVtYiAqIHNpemUuCitzdGF0aWMgaW50IENoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgeworICBjb25zdCB1aW50NjRfdCB0b3RhbF9zaXplID0gbm1lbWIgKiBzaXplOworICBpZiAobm1lbWIgPT0gMCkgcmV0dXJuIDE7CisgIGlmICgodWludDY0X3Qpc2l6ZSA+IFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkgLyBubWVtYikgcmV0dXJuIDA7CisgIGlmICh0b3RhbF9zaXplICE9IChzaXplX3QpdG90YWxfc2l6ZSkgcmV0dXJuIDA7CisjaWYgZGVmaW5lZChQUklOVF9NRU1fSU5GTykgJiYgZGVmaW5lZChNQUxMT0NfRkFJTF9BVCkKKyAgaWYgKGNvdW50ZG93bl90b19mYWlsID4gMCAmJiAtLWNvdW50ZG93bl90b19mYWlsID09IDApIHsKKyAgICByZXR1cm4gMDsgICAgLy8gZmFrZSBmYWlsIQorICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKE1BTExPQ19MSU1JVCkKKyAgaWYgKG1lbV9saW1pdCA+IDApIHsKKyAgICBjb25zdCB1aW50NjRfdCBuZXdfdG90YWxfbWVtID0gKHVpbnQ2NF90KXRvdGFsX21lbSArIHRvdGFsX3NpemU7CisgICAgaWYgKG5ld190b3RhbF9tZW0gIT0gKHNpemVfdCluZXdfdG90YWxfbWVtIHx8CisgICAgICAgIG5ld190b3RhbF9tZW0gPiBtZW1fbGltaXQpIHsKKyAgICAgIHJldHVybiAwOyAgIC8vIGZha2UgZmFpbCEKKyAgICB9CisgIH0KKyNlbmRpZgorCisgIHJldHVybiAxOworfQorCit2b2lkKiBXZWJQU2FmZU1hbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogcHRyOworICBJbmNyZW1lbnQoJm51bV9tYWxsb2NfY2FsbHMpOworICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7CisgIGFzc2VydChubWVtYiAqIHNpemUgPiAwKTsKKyAgcHRyID0gbWFsbG9jKChzaXplX3QpKG5tZW1iICogc2l6ZSkpOworICBBZGRNZW0ocHRyLCAoc2l6ZV90KShubWVtYiAqIHNpemUpKTsKKyAgcmV0dXJuIHB0cjsKK30KKwordm9pZCogV2ViUFNhZmVDYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7CisgIHZvaWQqIHB0cjsKKyAgSW5jcmVtZW50KCZudW1fY2FsbG9jX2NhbGxzKTsKKyAgaWYgKCFDaGVja1NpemVBcmd1bWVudHNPdmVyZmxvdyhubWVtYiwgc2l6ZSkpIHJldHVybiBOVUxMOworICBhc3NlcnQobm1lbWIgKiBzaXplID4gMCk7CisgIHB0ciA9IGNhbGxvYygoc2l6ZV90KW5tZW1iLCBzaXplKTsKKyAgQWRkTWVtKHB0ciwgKHNpemVfdCkobm1lbWIgKiBzaXplKSk7CisgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgV2ViUFNhZmVGcmVlKHZvaWQqIGNvbnN0IHB0cikgeworICBpZiAocHRyICE9IE5VTEwpIHsKKyAgICBJbmNyZW1lbnQoJm51bV9mcmVlX2NhbGxzKTsKKyAgICBTdWJNZW0ocHRyKTsKKyAgfQorICBmcmVlKHB0cik7Cit9CisKKy8vIFB1YmxpYyBBUEkgZnVuY3Rpb24uCit2b2lkIFdlYlBGcmVlKHZvaWQqIHB0cikgeworICBmcmVlKHB0cik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQgV2ViUENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjX3N0cmlkZSA+PSB3aWR0aCAmJiBkc3Rfc3RyaWRlID49IHdpZHRoKTsKKyAgd2hpbGUgKGhlaWdodC0tID4gMCkgeworICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgIHNyYyArPSBzcmNfc3RyaWRlOworICAgIGRzdCArPSBkc3Rfc3RyaWRlOworICB9Cit9CisKK3ZvaWQgV2ViUENvcHlQaXhlbHMoY29uc3QgV2ViUFBpY3R1cmUqIGNvbnN0IHNyYywgV2ViUFBpY3R1cmUqIGNvbnN0IGRzdCkgeworICBhc3NlcnQoc3JjICE9IE5VTEwgJiYgZHN0ICE9IE5VTEwpOworICBhc3NlcnQoc3JjLT53aWR0aCA9PSBkc3QtPndpZHRoICYmIHNyYy0+aGVpZ2h0ID09IGRzdC0+aGVpZ2h0KTsKKyAgYXNzZXJ0KHNyYy0+dXNlX2FyZ2IgJiYgZHN0LT51c2VfYXJnYik7CisgIFdlYlBDb3B5UGxhbmUoKHVpbnQ4X3QqKXNyYy0+YXJnYiwgNCAqIHNyYy0+YXJnYl9zdHJpZGUsICh1aW50OF90Kilkc3QtPmFyZ2IsCisgICAgICAgICAgICAgICAgNCAqIGRzdC0+YXJnYl9zdHJpZGUsIDQgKiBzcmMtPndpZHRoLCBzcmMtPmhlaWdodCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQ09MT1JfSEFTSF9TSVpFICAgICAgICAgKE1BWF9QQUxFVFRFX1NJWkUgKiA0KQorI2RlZmluZSBDT0xPUl9IQVNIX1JJR0hUX1NISUZUICAyMiAgLy8gMzIgLSBsb2cyKENPTE9SX0hBU0hfU0laRSkuCisKK2ludCBXZWJQR2V0Q29sb3JQYWxldHRlKGNvbnN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsIHVpbnQzMl90KiBjb25zdCBwYWxldHRlKSB7CisgIGludCBpOworICBpbnQgeCwgeTsKKyAgaW50IG51bV9jb2xvcnMgPSAwOworICB1aW50OF90IGluX3VzZVtDT0xPUl9IQVNIX1NJWkVdID0geyAwIH07CisgIHVpbnQzMl90IGNvbG9yc1tDT0xPUl9IQVNIX1NJWkVdOworICBjb25zdCB1aW50MzJfdCogYXJnYiA9IHBpYy0+YXJnYjsKKyAgY29uc3QgaW50IHdpZHRoID0gcGljLT53aWR0aDsKKyAgY29uc3QgaW50IGhlaWdodCA9IHBpYy0+aGVpZ2h0OworICB1aW50MzJfdCBsYXN0X3BpeCA9IH5hcmdiWzBdOyAgIC8vIHNvIHdlJ3JlIHN1cmUgdGhhdCBsYXN0X3BpeCAhPSBhcmdiWzBdCisgIGFzc2VydChwaWMgIT0gTlVMTCk7CisgIGFzc2VydChwaWMtPnVzZV9hcmdiKTsKKworICBmb3IgKHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKKyAgICBmb3IgKHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgaW50IGtleTsKKyAgICAgIGlmIChhcmdiW3hdID09IGxhc3RfcGl4KSB7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgbGFzdF9waXggPSBhcmdiW3hdOworICAgICAga2V5ID0gVlA4TEhhc2hQaXgobGFzdF9waXgsIENPTE9SX0hBU0hfUklHSFRfU0hJRlQpOworICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCFpbl91c2Vba2V5XSkgeworICAgICAgICAgIGNvbG9yc1trZXldID0gbGFzdF9waXg7CisgICAgICAgICAgaW5fdXNlW2tleV0gPSAxOworICAgICAgICAgICsrbnVtX2NvbG9yczsKKyAgICAgICAgICBpZiAobnVtX2NvbG9ycyA+IE1BWF9QQUxFVFRFX1NJWkUpIHsKKyAgICAgICAgICAgIHJldHVybiBNQVhfUEFMRVRURV9TSVpFICsgMTsgIC8vIEV4YWN0IGNvdW50IG5vdCBuZWVkZWQuCisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNvbG9yc1trZXldID09IGxhc3RfcGl4KSB7CisgICAgICAgICAgYnJlYWs7ICAvLyBUaGUgY29sb3IgaXMgYWxyZWFkeSB0aGVyZS4KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTb21lIG90aGVyIGNvbG9yIHNpdHMgaGVyZSwgc28gZG8gbGluZWFyIGNvbmZsaWN0IHJlc29sdXRpb24uCisgICAgICAgICAgKytrZXk7CisgICAgICAgICAga2V5ICY9IChDT0xPUl9IQVNIX1NJWkUgLSAxKTsgIC8vIEtleSBtYXNrLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGFyZ2IgKz0gcGljLT5hcmdiX3N0cmlkZTsKKyAgfQorCisgIGlmIChwYWxldHRlICE9IE5VTEwpIHsgIC8vIEZpbGwgdGhlIGNvbG9ycyBpbnRvIHBhbGV0dGUuCisgICAgbnVtX2NvbG9ycyA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IENPTE9SX0hBU0hfU0laRTsgKytpKSB7CisgICAgICBpZiAoaW5fdXNlW2ldKSB7CisgICAgICAgIHBhbGV0dGVbbnVtX2NvbG9yc10gPSBjb2xvcnNbaV07CisgICAgICAgICsrbnVtX2NvbG9yczsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9jb2xvcnM7Cit9CisKKyN1bmRlZiBDT0xPUl9IQVNIX1NJWkUKKyN1bmRlZiBDT0xPUl9IQVNIX1JJR0hUX1NISUZUCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBkZWZpbmVkKFdFQlBfTkVFRF9MT0dfVEFCTEVfOEJJVCkKK2NvbnN0IHVpbnQ4X3QgV2ViUExvZ1RhYmxlOGJpdFsyNTZdID0geyAgIC8vIDMxIF4gY2x6KGkpCisgIDAsIDAsIDEsIDEsIDIsIDIsIDIsIDIsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsIDYsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsCisgIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcKK307CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy91dGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3V0aWxzL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjliOWFmNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy91dGlscy91dGlscy5oCkBAIC0wLDAgKzEsMTg2IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gTWlzYy4gY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCisvLworLy8gQXV0aG9yczogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCisvLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfVVRJTFNfVVRJTFNfSF8KKyNkZWZpbmUgV0VCUF9VVElMU19VVElMU19IXworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgInNyYy93ZWJwL2NvbmZpZy5oIgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2Vsc2UKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAic3JjL2RzcC9kc3AuaCIKKyNpbmNsdWRlICJzcmMvd2VicC90eXBlcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZW1vcnkgYWxsb2NhdGlvbgorCisvLyBUaGlzIGlzIHRoZSBtYXhpbXVtIG1lbW9yeSBhbW91bnQgdGhhdCBsaWJ3ZWJwIHdpbGwgZXZlciB0cnkgdG8gYWxsb2NhdGUuCisjaWZuZGVmIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkKKyNpZiBTSVpFX01BWCA+ICgxVUxMIDw8IDM0KQorI2RlZmluZSBXRUJQX01BWF9BTExPQ0FCTEVfTUVNT1JZICgxVUxMIDw8IDM0KQorI2Vsc2UKKy8vIEZvciAzMi1iaXQgdGFyZ2V0cyBrZWVwIHRoaXMgYmVsb3cgSU5UX01BWCB0byBhdm9pZCB2YWxncmluZCB3YXJuaW5ncy4KKyNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoKDFVTEwgPDwgMzEpIC0gKDEgPDwgMTYpKQorI2VuZGlmCisjZW5kaWYgIC8vIFdFQlBfTUFYX0FMTE9DQUJMRV9NRU1PUlkKKworLy8gc2l6ZS1jaGVja2luZyBzYWZlIG1hbGxvYy9jYWxsb2M6IHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgdG9vCisvLyBsYXJnZSwgb3IgcmV0dXJuIE5VTEwuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlc2UgZm9yIGNvbnN0cnVjdHMgbGlrZQorLy8gbWFsbG9jKHNpemVvZihmb28pKSwgYnV0IG9ubHkgaWYgdGhlcmUncyBwaWN0dXJlLWRlcGVuZGVudCBzaXplIGludm9sdmVkCisvLyBzb21ld2hlcmUgKGxpa2U6IG1hbGxvYyhudW1fcGl4ZWxzICogc2l6ZW9mKCpzb21ldGhpbmcpKSkuIFRoYXQncyB3aHkgdGhpcworLy8gc2FmZSBtYWxsb2MoKSBib3Jyb3dzIHRoZSBzaWduYXR1cmUgZnJvbSBjYWxsb2MoKSwgcG9pbnRpbmcgYXQgdGhlIGRhbmdlcm91cworLy8gdW5kZXJseWluZyBtdWx0aXBseSBpbnZvbHZlZC4KK1dFQlBfRVhURVJOIHZvaWQqIFdlYlBTYWZlTWFsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7CisvLyBOb3RlIHRoYXQgV2ViUFNhZmVDYWxsb2MoKSBleHBlY3RzIHRoZSBzZWNvbmQgYXJndW1lbnQgdHlwZSB0byBiZSAnc2l6ZV90JworLy8gaW4gb3JkZXIgdG8gZmF2b3IgdGhlICJjYWxsb2MobnVtX2Zvbywgc2l6ZW9mKGZvbykpIiBwYXR0ZXJuLgorV0VCUF9FWFRFUk4gdm9pZCogV2ViUFNhZmVDYWxsb2ModWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKTsKKworLy8gQ29tcGFuaW9uIGRlYWxsb2NhdGlvbiBmdW5jdGlvbiB0byB0aGUgYWJvdmUgYWxsb2NhdGlvbnMuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBTYWZlRnJlZSh2b2lkKiBjb25zdCBwdHIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQWxpZ25tZW50CisKKyNkZWZpbmUgV0VCUF9BTElHTl9DU1QgMzEKKyNkZWZpbmUgV0VCUF9BTElHTihQVFIpICgoKHVpbnRwdHJfdCkoUFRSKSArIFdFQlBfQUxJR05fQ1NUKSAmIH5XRUJQX0FMSUdOX0NTVCkKKworI2lmICFkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZgorCisvLyBtZW1jcHkoKSBpcyB0aGUgc2FmZSB3YXkgb2YgbW92aW5nIHBvdGVudGlhbGx5IHVuYWxpZ25lZCAzMmIgbWVtb3J5Lgorc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IFdlYlBNZW1Ub1VpbnQzMihjb25zdCB1aW50OF90KiBjb25zdCBwdHIpIHsKKyAgdWludDMyX3QgQTsKKyAgU2JNZW1vcnlDb3B5KCZBLCBwdHIsIHNpemVvZihBKSk7CisgIHJldHVybiBBOworfQorc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgV2ViUFVpbnQzMlRvTWVtKHVpbnQ4X3QqIGNvbnN0IHB0ciwgdWludDMyX3QgdmFsKSB7CisgIFNiTWVtb3J5Q29weShwdHIsICZ2YWwsIHNpemVvZih2YWwpKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJlYWRpbmcvd3JpdGluZyBkYXRhLgorCisvLyBSZWFkIDE2LCAyNCBvciAzMiBiaXRzIHN0b3JlZCBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRMRTE2KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIChpbnQpKGRhdGFbMF0gPDwgMCkgfCAoZGF0YVsxXSA8PCA4KTsKK30KKworc3RhdGljIFdFQlBfSU5MSU5FIGludCBHZXRMRTI0KGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIEdldExFMTYoZGF0YSkgfCAoZGF0YVsyXSA8PCAxNik7Cit9CisKK3N0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBHZXRMRTMyKGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGRhdGEpIHsKKyAgcmV0dXJuIEdldExFMTYoZGF0YSkgfCAoKHVpbnQzMl90KUdldExFMTYoZGF0YSArIDIpIDw8IDE2KTsKK30KKworLy8gU3RvcmUgMTYsIDI0IG9yIDMyIGJpdHMgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMTYodWludDhfdCogY29uc3QgZGF0YSwgaW50IHZhbCkgeworICBTQl9EQ0hFQ0sodmFsIDwgKDEgPDwgMTYpKTsKKyAgZGF0YVswXSA9ICh2YWwgPj4gMCk7CisgIGRhdGFbMV0gPSAodmFsID4+IDgpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTI0KHVpbnQ4X3QqIGNvbnN0IGRhdGEsIGludCB2YWwpIHsKKyAgU0JfRENIRUNLKHZhbCA8ICgxIDw8IDI0KSk7CisgIFB1dExFMTYoZGF0YSwgdmFsICYgMHhmZmZmKTsKKyAgZGF0YVsyXSA9ICh2YWwgPj4gMTYpOworfQorCitzdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBQdXRMRTMyKHVpbnQ4X3QqIGNvbnN0IGRhdGEsIHVpbnQzMl90IHZhbCkgeworICBQdXRMRTE2KGRhdGEsIChpbnQpKHZhbCAmIDB4ZmZmZikpOworICBQdXRMRTE2KGRhdGEgKyAyLCAoaW50KSh2YWwgPj4gMTYpKTsKK30KKworLy8gUmV0dXJucyAzMSBeIGNseihuKSA9IGxvZzIobikuIFRoaXMgaXMgdGhlIGRlZmF1bHQgQy1pbXBsZW1lbnRhdGlvbiwgZWl0aGVyCisvLyBiYXNlZCBvbiB0YWJsZSBvciBub3QuIENhbiBiZSB1c2VkIGFzIGZhbGxiYWNrIGlmIGNseigpIGlzIG5vdCBhdmFpbGFibGUuCisjZGVmaW5lIFdFQlBfTkVFRF9MT0dfVEFCTEVfOEJJVAorZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgV2ViUExvZ1RhYmxlOGJpdFsyNTZdOworc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQTG9nMkZsb29yQyh1aW50MzJfdCBuKSB7CisgIGludCBsb2dfdmFsdWUgPSAwOworICB3aGlsZSAobiA+PSAyNTYpIHsKKyAgICBsb2dfdmFsdWUgKz0gODsKKyAgICBuID4+PSA4OworICB9CisgIHJldHVybiBsb2dfdmFsdWUgKyBXZWJQTG9nVGFibGU4Yml0W25dOworfQorCisvLyBSZXR1cm5zIChpbnQpZmxvb3IobG9nMihuKSkuIG4gbXVzdCBiZSA+IDAuCisvLyB1c2UgR05VIGJ1aWx0aW5zIHdoZXJlIGF2YWlsYWJsZS4KKyNpZiAhZGVmaW5lZChTVEFSQk9BUkQpICYmIGRlZmluZWQoX19HTlVDX18pICYmIFwKKyAgICAoKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkgfHwgX19HTlVDX18gPj0gNCkKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7CisgIHJldHVybiAzMSBeIF9fYnVpbHRpbl9jbHoobik7Cit9CisjZWxpZiAhZGVmaW5lZChTVEFSQk9BUkQpICYmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID4gMTMxMCAmJiBcCisgICAgICAoZGVmaW5lZChfTV9YNjQpIHx8IGRlZmluZWQoX01fSVg4NikpCisjaW5jbHVkZSA8aW50cmluLmg+CisjcHJhZ21hIGludHJpbnNpYyhfQml0U2NhblJldmVyc2UpCisKK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgQml0c0xvZzJGbG9vcih1aW50MzJfdCBuKSB7CisgIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc2V0X2JpdDsKKyAgX0JpdFNjYW5SZXZlcnNlKCZmaXJzdF9zZXRfYml0LCBuKTsKKyAgcmV0dXJuIGZpcnN0X3NldF9iaXQ7Cit9CisjZWxzZSAgIC8vIGRlZmF1bHQ6IHVzZSB0aGUgQy12ZXJzaW9uLgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBCaXRzTG9nMkZsb29yKHVpbnQzMl90IG4pIHsgcmV0dXJuIFdlYlBMb2cyRmxvb3JDKG4pOyB9CisjZW5kaWYKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFBpeGVsIGNvcHlpbmcuCisKK3N0cnVjdCBXZWJQUGljdHVyZTsKKworLy8gQ29weSB3aWR0aCB4IGhlaWdodCBwaXhlbHMgZnJvbSAnc3JjJyB0byAnZHN0JyBob25vcmluZyB0aGUgc3RyaWRlcy4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUENvcHlQbGFuZShjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGRzdCwgaW50IGRzdF9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworLy8gQ29weSBBUkdCIHBpeGVscyBmcm9tICdzcmMnIHRvICdkc3QnIGhvbm9yaW5nIHN0cmlkZXMuICdzcmMnIGFuZCAnZHN0JyBhcmUKKy8vIGFzc3VtZWQgdG8gYmUgYWxyZWFkeSBhbGxvY2F0ZWQgYW5kIHVzaW5nIEFSR0IgZGF0YS4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUENvcHlQaXhlbHMoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBXZWJQUGljdHVyZSogY29uc3QgZHN0KTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuaXF1ZSBjb2xvcnMuCisKKy8vIFJldHVybnMgY291bnQgb2YgdW5pcXVlIGNvbG9ycyBpbiAncGljJywgYXNzdW1pbmcgcGljLT51c2VfYXJnYiBpcyB0cnVlLgorLy8gSWYgdGhlIHVuaXF1ZSBjb2xvciBjb3VudCBpcyBtb3JlIHRoYW4gTUFYX1BBTEVUVEVfU0laRSwgcmV0dXJucworLy8gTUFYX1BBTEVUVEVfU0laRSsxLgorLy8gSWYgJ3BhbGV0dGUnIGlzIG5vdCBOVUxMIGFuZCBudW1iZXIgb2YgdW5pcXVlIGNvbG9ycyBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KKy8vIE1BWF9QQUxFVFRFX1NJWkUsIGFsc28gb3V0cHV0cyB0aGUgYWN0dWFsIHVuaXF1ZSBjb2xvcnMgaW50byAncGFsZXR0ZScuCisvLyBOb3RlOiAncGFsZXR0ZScgaXMgYXNzdW1lZCB0byBiZSBhbiBhcnJheSBhbHJlYWR5IGFsbG9jYXRlZCB3aXRoIGF0IGxlYXN0CisvLyBNQVhfUEFMRVRURV9TSVpFIGVsZW1lbnRzLgorV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRDb2xvclBhbGV0dGUoY29uc3Qgc3RydWN0IFdlYlBQaWN0dXJlKiBjb25zdCBwaWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY29uc3QgcGFsZXR0ZSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1VUSUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlY29kZS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVjb2RlLmgKc2ltaWxhcml0eSBpbmRleCA4MSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZWNvZGUuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZGVjb2RlLmgKaW5kZXggMWQ5OGI4Yy4uMjE2NWU5NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZWNvZGUuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZWNvZGUuaApAQCAtMTYsMTEgKzE2LDExIEBACiAKICNpbmNsdWRlICIuL3R5cGVzLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OIDB4MDIwMSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKyNkZWZpbmUgV0VCUF9ERUNPREVSX0FCSV9WRVJTSU9OIDB4MDIwOCAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKIAogLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKIC8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCkBAIC0zNiw1NCArMzYsNTcgQEAKIAogLy8gUmV0dXJuIHRoZSBkZWNvZGVyJ3MgdmVyc2lvbiBudW1iZXIsIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZyA4Yml0cyBmb3IKIC8vIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RGVjb2RlclZlcnNpb24odm9pZCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOwogCiAvLyBSZXRyaWV2ZSBiYXNpYyBoZWFkZXIgaW5mb3JtYXRpb246IHdpZHRoLCBoZWlnaHQuCi0vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgYWxzbyB2YWxpZGF0ZSB0aGUgaGVhZGVyIGFuZCByZXR1cm4gMCBpbgotLy8gY2FzZSBvZiBmb3JtYXR0aW5nIGVycm9yLgorLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGFsc28gdmFsaWRhdGUgdGhlIGhlYWRlciwgcmV0dXJuaW5nIHRydWUgb24gc3VjY2VzcywKKy8vIGZhbHNlIG90aGVyd2lzZS4gJyp3aWR0aCcgYW5kICcqaGVpZ2h0JyBhcmUgb25seSB2YWxpZCBvbiBzdWNjZXNzZnVsIHJldHVybi4KIC8vIFBvaW50ZXJzICd3aWR0aCcgYW5kICdoZWlnaHQnIGNhbiBiZSBwYXNzZWQgTlVMTCBpZiBkZWVtZWQgaXJyZWxldmFudC4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldEluZm8oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwogCiAvLyBEZWNvZGVzIFdlYlAgaW1hZ2VzIHBvaW50ZWQgdG8gYnkgJ2RhdGEnIGFuZCByZXR1cm5zIFJHQkEgc2FtcGxlcywgYWxvbmcKIC8vIHdpdGggdGhlIGRpbWVuc2lvbnMgaW4gKndpZHRoIGFuZCAqaGVpZ2h0LiBUaGUgb3JkZXJpbmcgb2Ygc2FtcGxlcyBpbgogLy8gbWVtb3J5IGlzIFIsIEcsIEIsIEEsIFIsIEcsIEIsIEEuLi4gaW4gc2NhbiBvcmRlciAoZW5kaWFuLWluZGVwZW5kZW50KS4KLS8vIFRoZSByZXR1cm5lZCBwb2ludGVyIHNob3VsZCBiZSBkZWxldGVkIGNhbGxpbmcgZnJlZSgpLgorLy8gVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIGJlIGRlbGV0ZWQgY2FsbGluZyBXZWJQRnJlZSgpLgogLy8gUmV0dXJucyBOVUxMIGluIGNhc2Ugb2YgZXJyb3IuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVJHQkEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwogCiAvLyBTYW1lIGFzIFdlYlBEZWNvZGVSR0JBLCBidXQgcmV0dXJuaW5nIEEsIFIsIEcsIEIsIEEsIFIsIEcsIEIuLi4gb3JkZXJlZCBkYXRhLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVBUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZUFSR0IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKIAogLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCQSwgYnV0IHJldHVybmluZyBCLCBHLCBSLCBBLCBCLCBHLCBSLCBBLi4uIG9yZGVyZWQgZGF0YS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVCR1JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CiAKIC8vIFNhbWUgYXMgV2ViUERlY29kZVJHQkEsIGJ1dCByZXR1cm5pbmcgUiwgRywgQiwgUiwgRywgQi4uLiBvcmRlcmVkIGRhdGEuCiAvLyBJZiB0aGUgYml0c3RyZWFtIGNvbnRhaW5zIHRyYW5zcGFyZW5jeSwgaXQgaXMgaWdub3JlZC4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKIAogLy8gU2FtZSBhcyBXZWJQRGVjb2RlUkdCLCBidXQgcmV0dXJuaW5nIEIsIEcsIFIsIEIsIEcsIFIuLi4gb3JkZXJlZCBkYXRhLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVCR1IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVCR1IoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwogCiAKIC8vIERlY29kZSBXZWJQIGltYWdlcyBwb2ludGVkIHRvIGJ5ICdkYXRhJyB0byBZJ1VWIGZvcm1hdCgqKS4gVGhlIHBvaW50ZXIKIC8vIHJldHVybmVkIGlzIHRoZSBZIHNhbXBsZXMgYnVmZmVyLiBVcG9uIHJldHVybiwgKnUgYW5kICp2IHdpbGwgcG9pbnQgdG8KLS8vIHRoZSBVIGFuZCBWIGNocm9tYSBkYXRhLiBUaGVzZSBVIGFuZCBWIGJ1ZmZlcnMgbmVlZCBOT1QgYmUgZnJlZWQoKSdkLAotLy8gdW5saWtlIHRoZSByZXR1cm5lZCBZIGx1bWEgb25lLiBUaGUgZGltZW5zaW9uIG9mIHRoZSBVIGFuZCBWIHBsYW5lcwotLy8gYXJlIGJvdGggKCp3aWR0aCArIDEpIC8gMiBhbmQgKCpoZWlnaHQgKyAxKS8gMi4KKy8vIHRoZSBVIGFuZCBWIGNocm9tYSBkYXRhLiBUaGVzZSBVIGFuZCBWIGJ1ZmZlcnMgbmVlZCBOT1QgYmUgcGFzc2VkIHRvCisvLyBXZWJQRnJlZSgpLCB1bmxpa2UgdGhlIHJldHVybmVkIFkgbHVtYSBvbmUuIFRoZSBkaW1lbnNpb24gb2YgdGhlIFUgYW5kIFYKKy8vIHBsYW5lcyBhcmUgYm90aCAoKndpZHRoICsgMSkgLyAyIGFuZCAoKmhlaWdodCArIDEpLyAyLgogLy8gVXBvbiByZXR1cm4sIHRoZSBZIGJ1ZmZlciBoYXMgYSBzdHJpZGUgcmV0dXJuZWQgYXMgJypzdHJpZGUnLCB3aGlsZSBVIGFuZCBWCiAvLyBoYXZlIGEgY29tbW9uIHN0cmlkZSByZXR1cm5lZCBhcyAnKnV2X3N0cmlkZScuCiAvLyBSZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGVycm9yLgogLy8gKCopIEFsc28gbmFtZWQgWSdDYkNyLiBTZWU6IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvWUNiQ3IKLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlWVVWKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiB1LCB1aW50OF90KiogdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSk7CitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlWVVWKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogdSwgdWludDhfdCoqIHYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RyaWRlLCBpbnQqIHV2X3N0cmlkZSk7CisKKy8vIFJlbGVhc2VzIG1lbW9yeSByZXR1cm5lZCBieSB0aGUgV2ViUERlY29kZSooKSBmdW5jdGlvbnMgYWJvdmUuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBGcmVlKHZvaWQqIHB0cik7CiAKIC8vIFRoZXNlIGZpdmUgZnVuY3Rpb25zIGFyZSB2YXJpYW50cyBvZiB0aGUgYWJvdmUgb25lcywgdGhhdCBkZWNvZGUgdGhlIGltYWdlCiAvLyBkaXJlY3RseSBpbnRvIGEgcHJlLWFsbG9jYXRlZCBidWZmZXIgJ291dHB1dF9idWZmZXInLiBUaGUgbWF4aW11bSBzdG9yYWdlCkBAIC05MywyMiArOTYsMjIgQEAKIC8vIFRoZSBwYXJhbWV0ZXIgJ291dHB1dF9zdHJpZGUnIHNwZWNpZmllcyB0aGUgZGlzdGFuY2UgKGluIGJ5dGVzKQogLy8gYmV0d2VlbiBzY2FubGluZXMuIEhlbmNlLCBvdXRwdXRfYnVmZmVyX3NpemUgaXMgZXhwZWN0ZWQgdG8gYmUgYXQgbGVhc3QKIC8vIG91dHB1dF9zdHJpZGUgeCBwaWN0dXJlLWhlaWdodC4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlUkdCQUludG8oCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCQUludG8oCiAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKICAgICB1aW50OF90KiBvdXRwdXRfYnVmZmVyLCBzaXplX3Qgb3V0cHV0X2J1ZmZlcl9zaXplLCBpbnQgb3V0cHV0X3N0cmlkZSk7Ci1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZUFSR0JJbnRvKAorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUERlY29kZUFSR0JJbnRvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOwotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBEZWNvZGVCR1JBSW50bygKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVCR1JBSW50bygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKIAogLy8gUkdCIGFuZCBCR1IgdmFyaWFudHMuIEhlcmUgdG9vIHRoZSB0cmFuc3BhcmVuY3kgaW5mb3JtYXRpb24sIGlmIHByZXNlbnQsCiAvLyB3aWxsIGJlIGRyb3BwZWQgYW5kIGlnbm9yZWQuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUERlY29kZVJHQkludG8oCitXRUJQX0VYVEVSTiB1aW50OF90KiBXZWJQRGVjb2RlUkdCSW50bygKICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAogICAgIHVpbnQ4X3QqIG91dHB1dF9idWZmZXIsIHNpemVfdCBvdXRwdXRfYnVmZmVyX3NpemUsIGludCBvdXRwdXRfc3RyaWRlKTsKLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlQkdSSW50bygKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVCR1JJbnRvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOwogCkBAIC0xMTksNyArMTIyLDcgQEAKIC8vICd1X3NpemUnIGFuZCAndl9zaXplJyByZXNwZWN0aXZlbHkuCiAvLyBQb2ludGVyIHRvIHRoZSBsdW1hIHBsYW5lICgnKmx1bWEnKSBpcyByZXR1cm5lZCBvciBOVUxMIGlmIGFuIGVycm9yIG9jY3VycmVkCiAvLyBkdXJpbmcgZGVjb2RpbmcgKG9yIGJlY2F1c2Ugc29tZSBidWZmZXJzIHdlcmUgZm91bmQgdG8gYmUgdG9vIHNtYWxsKS4KLVdFQlBfRVhURVJOKHVpbnQ4X3QqKSBXZWJQRGVjb2RlWVVWSW50bygKK1dFQlBfRVhURVJOIHVpbnQ4X3QqIFdlYlBEZWNvZGVZVVZJbnRvKAogICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCiAgICAgdWludDhfdCogbHVtYSwgc2l6ZV90IGx1bWFfc2l6ZSwgaW50IGx1bWFfc3RyaWRlLAogICAgIHVpbnQ4X3QqIHUsIHNpemVfdCB1X3NpemUsIGludCB1X3N0cmlkZSwKQEAgLTE5NCw3ICsxOTcsMTAgQEAKIHN0cnVjdCBXZWJQRGVjQnVmZmVyIHsKICAgV0VCUF9DU1BfTU9ERSBjb2xvcnNwYWNlOyAgLy8gQ29sb3JzcGFjZS4KICAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgICAgLy8gRGltZW5zaW9ucy4KLSAgaW50IGlzX2V4dGVybmFsX21lbW9yeTsgICAgLy8gSWYgdHJ1ZSwgJ2ludGVybmFsX21lbW9yeScgcG9pbnRlciBpcyBub3QgdXNlZC4KKyAgaW50IGlzX2V4dGVybmFsX21lbW9yeTsgICAgLy8gSWYgbm9uLXplcm8sICdpbnRlcm5hbF9tZW1vcnknIHBvaW50ZXIgaXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQuIElmIHZhbHVlIGlzICcyJyBvciBtb3JlLCB0aGUgZXh0ZXJuYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5IGlzIGNvbnNpZGVyZWQgJ3Nsb3cnIGFuZCBtdWx0aXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWFkL3dyaXRlIHdpbGwgYmUgYXZvaWRlZC4KICAgdW5pb24gewogICAgIFdlYlBSR0JBQnVmZmVyIFJHQkE7CiAgICAgV2ViUFlVVkFCdWZmZXIgWVVWQTsKQEAgLTIwMiwxMiArMjA4LDEyIEBACiAgIHVpbnQzMl90ICAgICAgIHBhZFs0XTsgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogCiAgIHVpbnQ4X3QqIHByaXZhdGVfbWVtb3J5OyAgIC8vIEludGVybmFsbHkgYWxsb2NhdGVkIG1lbW9yeSAob25seSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzX2V4dGVybmFsX21lbW9yeSBpcyBmYWxzZSkuIFNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpc19leHRlcm5hbF9tZW1vcnkgaXMgMCkuIFNob3VsZCBub3QgYmUgdXNlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlcm5hbGx5LCBidXQgYWNjZXNzZWQgdmlhIHRoZSBidWZmZXIgdW5pb24uCiB9OwogCiAvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oaW50KSBXZWJQSW5pdERlY0J1ZmZlckludGVybmFsKFdlYlBEZWNCdWZmZXIqLCBpbnQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBJbml0RGVjQnVmZmVySW50ZXJuYWwoV2ViUERlY0J1ZmZlciosIGludCk7CiAKIC8vIEluaXRpYWxpemUgdGhlIHN0cnVjdHVyZSBhcyBlbXB0eS4gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB1c2UuCiAvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaApAQCAtMjE3LDcgKzIyMyw3IEBACiAKIC8vIEZyZWUgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlci4gTXVzdCBhbHdheXMgYmUgY2FsbGVkIGxhc3QuCiAvLyBOb3RlOiBkb2Vzbid0IGZyZWUgdGhlICdidWZmZXInIHN0cnVjdHVyZSBpdHNlbGYuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpOworV0VCUF9FWFRFUk4gdm9pZCBXZWJQRnJlZURlY0J1ZmZlcihXZWJQRGVjQnVmZmVyKiBidWZmZXIpOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRW51bWVyYXRpb24gb2YgdGhlIHN0YXR1cyBjb2RlcwpAQCAtMjQyLDE5ICsyNDgsMTkgQEAKIC8vIHBpY3R1cmUgaXMgb25seSBwYXJ0aWFsbHkgZGVjb2RlZCwgcGVuZGluZyBhZGRpdGlvbmFsIGlucHV0LgogLy8gQ29kZSBleGFtcGxlOgogLy8KLS8vICAgV2ViUEluaXREZWNCdWZmZXIoJmJ1ZmZlcik7Ci0vLyAgIGJ1ZmZlci5jb2xvcnNwYWNlID0gbW9kZTsKKy8vICAgV2ViUEluaXREZWNCdWZmZXIoJm91dHB1dF9idWZmZXIpOworLy8gICBvdXRwdXRfYnVmZmVyLmNvbG9yc3BhY2UgPSBtb2RlOwogLy8gICAuLi4KLS8vICAgV2ViUElEZWNvZGVyKiBpZGVjID0gV2ViUElOZXdEZWNvZGVyKCZidWZmZXIpOwotLy8gICB3aGlsZSAoaGFzX21vcmVfZGF0YSkgewotLy8gICAgIC8vIC4uLiAoZ2V0IGFkZGl0aW9uYWwgZGF0YSkKKy8vICAgV2ViUElEZWNvZGVyKiBpZGVjID0gV2ViUElOZXdEZWNvZGVyKCZvdXRwdXRfYnVmZmVyKTsKKy8vICAgd2hpbGUgKGFkZGl0aW9uYWxfZGF0YV9pc19hdmFpbGFibGUpIHsKKy8vICAgICAvLyAuLi4gKGdldCBhZGRpdGlvbmFsIGRhdGEgaW4gc29tZSBuZXdfZGF0YVtdIGJ1ZmZlcikKIC8vICAgICBzdGF0dXMgPSBXZWJQSUFwcGVuZChpZGVjLCBuZXdfZGF0YSwgbmV3X2RhdGFfc2l6ZSk7Ci0vLyAgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX1NVU1BFTkRFRCB8fAotLy8gICAgICAgYnJlYWs7CisvLyAgICAgaWYgKHN0YXR1cyAhPSBWUDhfU1RBVFVTX09LICYmIHN0YXR1cyAhPSBWUDhfU1RBVFVTX1NVU1BFTkRFRCkgeworLy8gICAgICAgYnJlYWs7ICAgIC8vIGFuIGVycm9yIG9jY3VycmVkLgogLy8gICAgIH0KIC8vCiAvLyAgICAgLy8gVGhlIGFib3ZlIGNhbGwgZGVjb2RlcyB0aGUgY3VycmVudCBhdmFpbGFibGUgYnVmZmVyLgotLy8gICAgIC8vIFBhcnQgb2YgdGhlIGltYWdlIGNhbiBub3cgYmUgcmVmcmVzaGVkIGJ5IGNhbGxpbmcgdG8KKy8vICAgICAvLyBQYXJ0IG9mIHRoZSBpbWFnZSBjYW4gbm93IGJlIHJlZnJlc2hlZCBieSBjYWxsaW5nCiAvLyAgICAgLy8gV2ViUElEZWNHZXRSR0IoKS9XZWJQSURlY0dldFlVVkEoKSBldGMuCiAvLyAgIH0KIC8vICAgV2ViUElEZWxldGUoaWRlYyk7CkBAIC0yNjYsMTIgKzI3MiwxMiBAQAogLy8gdGhhdCBvZiB0aGUgcmV0dXJuZWQgV2ViUElEZWNvZGVyIG9iamVjdC4KIC8vIFRoZSBzdXBwbGllZCAnb3V0cHV0X2J1ZmZlcicgY29udGVudCBNVVNUIE5PVCBiZSBjaGFuZ2VkIGJldHdlZW4gY2FsbHMgdG8KIC8vIFdlYlBJQXBwZW5kKCkgb3IgV2ViUElVcGRhdGUoKSB1bmxlc3MgJ291dHB1dF9idWZmZXIuaXNfZXh0ZXJuYWxfbWVtb3J5JyBpcwotLy8gc2V0IHRvIDEuIEluIHN1Y2ggYSBjYXNlLCBpdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcG9pbnRlcnMsIHNpemUgYW5kCisvLyBub3Qgc2V0IHRvIDAuIEluIHN1Y2ggYSBjYXNlLCBpdCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgcG9pbnRlcnMsIHNpemUgYW5kCiAvLyBzdHJpZGUgb2Ygb3V0cHV0X2J1ZmZlci51LlJHQkEgb3Igb3V0cHV0X2J1ZmZlci51LllVVkEsIHByb3ZpZGVkIHRoZXkgcmVtYWluCiAvLyB3aXRoaW4gdmFsaWQgYm91bmRzLgogLy8gQWxsIG90aGVyIGZpZWxkcyBvZiBXZWJQRGVjQnVmZmVyIE1VU1QgcmVtYWluIGNvbnN0YW50IGJldHdlZW4gY2FsbHMuCiAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElOZXdEZWNvZGVyKFdlYlBEZWNCdWZmZXIqIG91dHB1dF9idWZmZXIpOworV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSU5ld0RlY29kZXIoV2ViUERlY0J1ZmZlciogb3V0cHV0X2J1ZmZlcik7CiAKIC8vIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBhbiBpbmNyZW1lbnRhbC1kZWNvZGVyIG9iamVjdCwgd2hpY2gKIC8vIHdpbGwgb3V0cHV0IHRoZSBSR0IvQSBzYW1wbGVzIHNwZWNpZmllZCBieSAnY3NwJyBpbnRvIGEgcHJlYWxsb2NhdGVkCkBAIC0yODMsNyArMjg5LDcgQEAKIC8vIGNvbG9yc3BhY2UgJ2NzcCcgaXMgdGFrZW4gaW50byBhY2NvdW50IGZvciBhbGxvY2F0aW5nIHRoaXMgYnVmZmVyLiBBbGwgb3RoZXIKIC8vIHBhcmFtZXRlcnMgYXJlIGlnbm9yZWQuCiAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCBvciBpZiBzb21lIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1JHQigKK1dFQlBfRVhURVJOIFdlYlBJRGVjb2RlciogV2ViUElOZXdSR0IoCiAgICAgV0VCUF9DU1BfTU9ERSBjc3AsCiAgICAgdWludDhfdCogb3V0cHV0X2J1ZmZlciwgc2l6ZV90IG91dHB1dF9idWZmZXJfc2l6ZSwgaW50IG91dHB1dF9zdHJpZGUpOwogCkBAIC0yOTgsNyArMzA0LDcgQEAKIC8vIEluIHRoaXMgY2FzZSwgdGhlIG91dHB1dCBidWZmZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFsbG9jYXRlZCAodXNpbmcKIC8vIE1PREVfWVVWQSkgd2hlbiBkZWNvZGluZyBzdGFydHMuIEFsbCBwYXJhbWV0ZXJzIGFyZSB0aGVuIGlnbm9yZWQuCiAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIG9yIGlmIGEgcGFyYW1ldGVyIGlzIGludmFsaWQuCi1XRUJQX0VYVEVSTihXZWJQSURlY29kZXIqKSBXZWJQSU5ld1lVVkEoCitXRUJQX0VYVEVSTiBXZWJQSURlY29kZXIqIFdlYlBJTmV3WVVWQSgKICAgICB1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCiAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAogICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSwKQEAgLTMwNiwxOSArMzEyLDE5IEBACiAKIC8vIERlcHJlY2F0ZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUsIHdpdGhvdXQgdGhlIGFscGhhIHBsYW5lLgogLy8gS2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLVdFQlBfRVhURVJOKFdlYlBJRGVjb2RlciopIFdlYlBJTmV3WVVWKAorV0VCUF9FWFRFUk4gV2ViUElEZWNvZGVyKiBXZWJQSU5ld1lVVigKICAgICB1aW50OF90KiBsdW1hLCBzaXplX3QgbHVtYV9zaXplLCBpbnQgbHVtYV9zdHJpZGUsCiAgICAgdWludDhfdCogdSwgc2l6ZV90IHVfc2l6ZSwgaW50IHVfc3RyaWRlLAogICAgIHVpbnQ4X3QqIHYsIHNpemVfdCB2X3NpemUsIGludCB2X3N0cmlkZSk7CiAKIC8vIERlbGV0ZXMgdGhlIFdlYlBJRGVjb2RlciBvYmplY3QgYW5kIGFzc29jaWF0ZWQgbWVtb3J5LiBNdXN0IGFsd2F5cyBiZSBjYWxsZWQKIC8vIGlmIFdlYlBJTmV3RGVjb2RlciwgV2ViUElOZXdSR0Igb3IgV2ViUElOZXdZVVYgc3VjY2VlZGVkLgotV0VCUF9FWFRFUk4odm9pZCkgV2ViUElEZWxldGUoV2ViUElEZWNvZGVyKiBpZGVjKTsKK1dFQlBfRVhURVJOIHZvaWQgV2ViUElEZWxldGUoV2ViUElEZWNvZGVyKiBpZGVjKTsKIAogLy8gQ29waWVzIGFuZCBkZWNvZGVzIHRoZSBuZXh0IGF2YWlsYWJsZSBkYXRhLiBSZXR1cm5zIFZQOF9TVEFUVVNfT0sgd2hlbgogLy8gdGhlIGltYWdlIGlzIHN1Y2Nlc3NmdWxseSBkZWNvZGVkLiBSZXR1cm5zIFZQOF9TVEFUVVNfU1VTUEVOREVEIHdoZW4gbW9yZQogLy8gZGF0YSBpcyBleHBlY3RlZC4gUmV0dXJucyBlcnJvciBpbiBvdGhlciBjYXNlcy4KLVdFQlBfRVhURVJOKFZQOFN0YXR1c0NvZGUpIFdlYlBJQXBwZW5kKAorV0VCUF9FWFRFUk4gVlA4U3RhdHVzQ29kZSBXZWJQSUFwcGVuZCgKICAgICBXZWJQSURlY29kZXIqIGlkZWMsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpOwogCiAvLyBBIHZhcmlhbnQgb2YgdGhlIGFib3ZlIGZ1bmN0aW9uIHRvIGJlIHVzZWQgd2hlbiBkYXRhIGJ1ZmZlciBjb250YWlucwpAQCAtMzI2LDcgKzMzMiw3IEBACiAvLyB0byB0aGUgaW50ZXJuYWwgbWVtb3J5LgogLy8gTm90ZSB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgJ2RhdGEnIHBvaW50ZXIgY2FuIGNoYW5nZSBiZXR3ZWVuIGNhbGxzIHRvCiAvLyBXZWJQSVVwZGF0ZSwgZm9yIGluc3RhbmNlIHdoZW4gdGhlIGRhdGEgYnVmZmVyIGlzIHJlc2l6ZWQgdG8gZml0IGxhcmdlciBkYXRhLgotV0VCUF9FWFRFUk4oVlA4U3RhdHVzQ29kZSkgV2ViUElVcGRhdGUoCitXRUJQX0VYVEVSTiBWUDhTdGF0dXNDb2RlIFdlYlBJVXBkYXRlKAogICAgIFdlYlBJRGVjb2RlciogaWRlYywgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7CiAKIC8vIFJldHVybnMgdGhlIFJHQi9BIGltYWdlIGRlY29kZWQgc28gZmFyLiBSZXR1cm5zIE5VTEwgaWYgb3V0cHV0IHBhcmFtcwpAQCAtMzM0LDE1ICszNDAsMTYgQEAKIC8vIHNwZWNpZmllZCBkdXJpbmcgY2FsbCB0byBXZWJQSU5ld0RlY29kZXIoKSBvciBXZWJQSU5ld1JHQigpLgogLy8gKmxhc3RfeSBpcyB0aGUgaW5kZXggb2YgbGFzdCBkZWNvZGVkIHJvdyBpbiByYXN0ZXIgc2NhbiBvcmRlci4gU29tZSBwb2ludGVycwogLy8gKCpsYXN0X3ksICp3aWR0aCBldGMuKSBjYW4gYmUgTlVMTCBpZiBjb3JyZXNwb25kaW5nIGluZm9ybWF0aW9uIGlzIG5vdAotLy8gbmVlZGVkLgotV0VCUF9FWFRFUk4odWludDhfdCopIFdlYlBJRGVjR2V0UkdCKAorLy8gbmVlZGVkLiBUaGUgdmFsdWVzIGluIHRoZXNlIHBvaW50ZXJzIGFyZSBvbmx5IHZhbGlkIG9uIHN1Y2Nlc3NmdWwgKG5vbi1OVUxMKQorLy8gcmV0dXJuLgorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUElEZWNHZXRSR0IoCiAgICAgY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxhc3RfeSwKICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBzdHJpZGUpOwogCiAvLyBTYW1lIGFzIGFib3ZlIGZ1bmN0aW9uIHRvIGdldCBhIFlVVkEgaW1hZ2UuIFJldHVybnMgcG9pbnRlciB0byB0aGUgbHVtYQogLy8gcGxhbmUgb3IgTlVMTCBpbiBjYXNlIG9mIGVycm9yLiBJZiB0aGVyZSBpcyBubyBhbHBoYSBpbmZvcm1hdGlvbgogLy8gdGhlIGFscGhhIHBvaW50ZXIgJyphJyB3aWxsIGJlIHJldHVybmVkIE5VTEwuCi1XRUJQX0VYVEVSTih1aW50OF90KikgV2ViUElEZWNHZXRZVVZBKAorV0VCUF9FWFRFUk4gdWludDhfdCogV2ViUElEZWNHZXRZVVZBKAogICAgIGNvbnN0IFdlYlBJRGVjb2RlciogaWRlYywgaW50KiBsYXN0X3ksCiAgICAgdWludDhfdCoqIHUsIHVpbnQ4X3QqKiB2LCB1aW50OF90KiogYSwKICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCwgaW50KiBzdHJpZGUsIGludCogdXZfc3RyaWRlLCBpbnQqIGFfc3RyaWRlKTsKQEAgLTM2Miw3ICszNjksNyBAQAogLy8gUmV0dXJucyBOVUxMIGluIGNhc2UgdGhlIGluY3JlbWVudGFsIGRlY29kZXIgb2JqZWN0IGlzIGluIGFuIGludmFsaWQgc3RhdGUuCiAvLyBPdGhlcndpc2UgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uIFRoaXMgc3RydWN0dXJlCiAvLyBpcyByZWFkLW9ubHksIHRpZWQgdG8gV2ViUElEZWNvZGVyJ3MgbGlmZXNwYW4gYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi1XRUJQX0VYVEVSTihjb25zdCBXZWJQRGVjQnVmZmVyKikgV2ViUElEZWNvZGVkQXJlYSgKK1dFQlBfRVhURVJOIGNvbnN0IFdlYlBEZWNCdWZmZXIqIFdlYlBJRGVjb2RlZEFyZWEoCiAgICAgY29uc3QgV2ViUElEZWNvZGVyKiBpZGVjLCBpbnQqIGxlZnQsIGludCogdG9wLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CiAKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00MDQsMTggKzQxMSwxMyBAQAogICBpbnQgaGVpZ2h0OyAgICAgICAgIC8vIEhlaWdodCBpbiBwaXhlbHMsIGFzIHJlYWQgZnJvbSB0aGUgYml0c3RyZWFtLgogICBpbnQgaGFzX2FscGhhOyAgICAgIC8vIFRydWUgaWYgdGhlIGJpdHN0cmVhbSBjb250YWlucyBhbiBhbHBoYSBjaGFubmVsLgogICBpbnQgaGFzX2FuaW1hdGlvbjsgIC8vIFRydWUgaWYgdGhlIGJpdHN0cmVhbSBpcyBhbiBhbmltYXRpb24uCisgIGludCBmb3JtYXQ7ICAgICAgICAgLy8gMCA9IHVuZGVmaW5lZCAoL21peGVkKSwgMSA9IGxvc3N5LCAyID0gbG9zc2xlc3MKIAotICAvLyBVbnVzZWQgZm9yIG5vdzoKLSAgaW50IGJpdHN0cmVhbV92ZXJzaW9uOyAgICAgICAgLy8gc2hvdWxkIGJlIDAgZm9yIG5vdy4gVE9ETyhsYXRlcikKLSAgaW50IG5vX2luY3JlbWVudGFsX2RlY29kaW5nOyAgLy8gaWYgdHJ1ZSwgdXNpbmcgaW5jcmVtZW50YWwgZGVjb2RpbmcgaXMgbm90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29tbWVuZGVkLgotICBpbnQgcm90YXRlOyAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGxhdGVyKQotICBpbnQgdXZfc2FtcGxpbmc7ICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgMCBmb3Igbm93LiBUT0RPKGxhdGVyKQotICB1aW50MzJfdCBwYWRbMl07ICAgICAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdWludDMyX3QgcGFkWzVdOyAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKIH07CiAKIC8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQR2V0RmVhdHVyZXNJbnRlcm5hbCgKK1dFQlBfRVhURVJOIFZQOFN0YXR1c0NvZGUgV2ViUEdldEZlYXR1cmVzSW50ZXJuYWwoCiAgICAgY29uc3QgdWludDhfdCosIHNpemVfdCwgV2ViUEJpdHN0cmVhbUZlYXR1cmVzKiwgaW50KTsKIAogLy8gUmV0cmlldmUgZmVhdHVyZXMgZnJvbSB0aGUgYml0c3RyZWFtLiBUaGUgKmZlYXR1cmVzIHN0cnVjdHVyZSBpcyBmaWxsZWQKQEAgLTQ0MSwxMSArNDQzLDExIEBACiAgIGludCB1c2Vfc2NhbGluZzsgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIHNjYWxpbmcgaXMgYXBwbGllZCBfYWZ0ZXJ3YXJkXwogICBpbnQgc2NhbGVkX3dpZHRoLCBzY2FsZWRfaGVpZ2h0OyAgICAvLyBmaW5hbCByZXNvbHV0aW9uCiAgIGludCB1c2VfdGhyZWFkczsgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRydWUsIHVzZSBtdWx0aS10aHJlYWRlZCBkZWNvZGluZworICBpbnQgZGl0aGVyaW5nX3N0cmVuZ3RoOyAgICAgICAgICAgICAvLyBkaXRoZXJpbmcgc3RyZW5ndGggKDA9T2ZmLCAxMDA9ZnVsbCkKKyAgaW50IGZsaXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxpcCBvdXRwdXQgdmVydGljYWxseQorICBpbnQgYWxwaGFfZGl0aGVyaW5nX3N0cmVuZ3RoOyAgICAgICAvLyBhbHBoYSBkaXRoZXJpbmcgc3RyZW5ndGggaW4gWzAuLjEwMF0KIAotICAvLyBVbnVzZWQgZm9yIG5vdzoKLSAgaW50IGZvcmNlX3JvdGF0aW9uOyAgICAgICAgICAgICAgICAgLy8gZm9yY2VkIHJvdGF0aW9uICh0byBiZSBhcHBsaWVkIF9sYXN0XykKLSAgaW50IG5vX2VuaGFuY2VtZW50OyAgICAgICAgICAgICAgICAgLy8gaWYgdHJ1ZSwgZGlzY2FyZCBlbmhhbmNlbWVudCBsYXllcgotICB1aW50MzJfdCBwYWRbNl07ICAgICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgICAgICAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiB9OwogCiAvLyBNYWluIG9iamVjdCBzdG9yaW5nIHRoZSBjb25maWd1cmF0aW9uIGZvciBhZHZhbmNlZCBkZWNvZGluZy4KQEAgLTQ1Niw3ICs0NTgsNyBAQAogfTsKIAogLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKGludCkgV2ViUEluaXREZWNvZGVyQ29uZmlnSW50ZXJuYWwoV2ViUERlY29kZXJDb25maWcqLCBpbnQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBJbml0RGVjb2RlckNvbmZpZ0ludGVybmFsKFdlYlBEZWNvZGVyQ29uZmlnKiwgaW50KTsKIAogLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlndXJhdGlvbiBhcyBlbXB0eS4gVGhpcyBmdW5jdGlvbiBtdXN0IGFsd2F5cyBiZQogLy8gY2FsbGVkIGZpcnN0LCB1bmxlc3MgV2ViUEdldEZlYXR1cmVzKCkgaXMgdG8gYmUgY2FsbGVkLgpAQCAtNDcwLDIwICs0NzIsMjIgQEAKIC8vIHBhcmFtZXRlciwgaW4gd2hpY2ggY2FzZSB0aGUgZmVhdHVyZXMgd2lsbCBiZSBwYXJzZWQgYW5kIHN0b3JlZCBpbnRvCiAvLyBjb25maWctPmlucHV0LiBPdGhlcndpc2UsICdkYXRhJyBjYW4gYmUgTlVMTCBhbmQgbm8gcGFyc2luZyB3aWxsIG9jY3VyLgogLy8gTm90ZSB0aGF0ICdjb25maWcnIGNhbiBiZSBOVUxMIHRvbywgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgY29uZmlndXJhdGlvbgotLy8gaXMgdXNlZC4KKy8vIGlzIHVzZWQuIElmICdjb25maWcnIGlzIG5vdCBOVUxMLCBpdCBtdXN0IG91dGxpdmUgdGhlIFdlYlBJRGVjb2RlciBvYmplY3QKKy8vIGFzIHNvbWUgcmVmZXJlbmNlcyB0byBpdHMgZmllbGRzIHdpbGwgYmUgdXNlZC4gTm8gaW50ZXJuYWwgY29weSBvZiAnY29uZmlnJworLy8gaXMgbWFkZS4KIC8vIFRoZSByZXR1cm4gV2ViUElEZWNvZGVyIG9iamVjdCBtdXN0IGFsd2F5cyBiZSBkZWxldGVkIGNhbGxpbmcgV2ViUElEZWxldGUoKS4KIC8vIFJldHVybnMgTlVMTCBpbiBjYXNlIG9mIGVycm9yIChhbmQgY29uZmlnLT5zdGF0dXMgd2lsbCB0aGVuIHJlZmxlY3QKLS8vIHRoZSBlcnJvciBjb25kaXRpb24pLgotV0VCUF9FWFRFUk4oV2ViUElEZWNvZGVyKikgV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOworLy8gdGhlIGVycm9yIGNvbmRpdGlvbiwgaWYgYXZhaWxhYmxlKS4KK1dFQlBfRVhURVJOIFdlYlBJRGVjb2RlciogV2ViUElEZWNvZGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZyk7CiAKIC8vIE5vbi1pbmNyZW1lbnRhbCB2ZXJzaW9uLiBUaGlzIHZlcnNpb24gZGVjb2RlcyB0aGUgZnVsbCBkYXRhIGF0IG9uY2UsIHRha2luZwogLy8gJ2NvbmZpZycgaW50byBhY2NvdW50LiBSZXR1cm5zIGRlY29kaW5nIHN0YXR1cyAod2hpY2ggc2hvdWxkIGJlIFZQOF9TVEFUVVNfT0sKLS8vIGlmIHRoZSBkZWNvZGluZyB3YXMgc3VjY2Vzc2Z1bCkuCi1XRUJQX0VYVEVSTihWUDhTdGF0dXNDb2RlKSBXZWJQRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEZWNvZGVyQ29uZmlnKiBjb25maWcpOworLy8gaWYgdGhlIGRlY29kaW5nIHdhcyBzdWNjZXNzZnVsKS4gTm90ZSB0aGF0ICdjb25maWcnIGNhbm5vdCBiZSBOVUxMLgorV0VCUF9FWFRFUk4gVlA4U3RhdHVzQ29kZSBXZWJQRGVjb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUERlY29kZXJDb25maWcqIGNvbmZpZyk7CiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIH0gICAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2RlbXV4LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZW11eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWQ2NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9kZW11eC5oCkBAIC0wLDAgKzEsMzYzIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKKy8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQorLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAorLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5CisvLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRGVtdXggQVBJLgorLy8gRW5hYmxlcyBleHRyYWN0aW9uIG9mIGltYWdlIGFuZCBleHRlbmRlZCBmb3JtYXQgZGF0YSBmcm9tIFdlYlAgZmlsZXMuCisKKy8vIENvZGUgRXhhbXBsZTogRGVtdXhpbmcgV2ViUCBkYXRhIHRvIGV4dHJhY3QgYWxsIHRoZSBmcmFtZXMsIElDQyBwcm9maWxlCisvLyBhbmQgRVhJRi9YTVAgbWV0YWRhdGEuCisvKgorICBXZWJQRGVtdXhlciogZGVtdXggPSBXZWJQRGVtdXgoJndlYnBfZGF0YSk7CisKKyAgdWludDMyX3Qgd2lkdGggPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19XSURUSCk7CisgIHVpbnQzMl90IGhlaWdodCA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCk7CisgIC8vIC4uLiAoR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBmZWF0dXJlcyBwcmVzZW50IGluIHRoZSBXZWJQIGZpbGUpLgorICB1aW50MzJfdCBmbGFncyA9IFdlYlBEZW11eEdldEkoZGVtdXgsIFdFQlBfRkZfRk9STUFUX0ZMQUdTKTsKKworICAvLyAuLi4gKEl0ZXJhdGUgb3ZlciBhbGwgZnJhbWVzKS4KKyAgV2ViUEl0ZXJhdG9yIGl0ZXI7CisgIGlmIChXZWJQRGVtdXhHZXRGcmFtZShkZW11eCwgMSwgJml0ZXIpKSB7CisgICAgZG8geworICAgICAgLy8gLi4uIChDb25zdW1lICdpdGVyJzsgZS5nLiBEZWNvZGUgJ2l0ZXIuZnJhZ21lbnQnIHdpdGggV2ViUERlY29kZSgpLAorICAgICAgLy8gLi4uIGFuZCBnZXQgb3RoZXIgZnJhbWUgcHJvcGVydGllcyBsaWtlIHdpZHRoLCBoZWlnaHQsIG9mZnNldHMgZXRjLgorICAgICAgLy8gLi4uIHNlZSAnc3RydWN0IFdlYlBJdGVyYXRvcicgYmVsb3cgZm9yIG1vcmUgaW5mbykuCisgICAgfSB3aGlsZSAoV2ViUERlbXV4TmV4dEZyYW1lKCZpdGVyKSk7CisgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZpdGVyKTsKKyAgfQorCisgIC8vIC4uLiAoRXh0cmFjdCBtZXRhZGF0YSkuCisgIFdlYlBDaHVua0l0ZXJhdG9yIGNodW5rX2l0ZXI7CisgIGlmIChmbGFncyAmIElDQ1BfRkxBRykgV2ViUERlbXV4R2V0Q2h1bmsoZGVtdXgsICJJQ0NQIiwgMSwgJmNodW5rX2l0ZXIpOworICAvLyAuLi4gKENvbnN1bWUgdGhlIElDQyBwcm9maWxlIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgaWYgKGZsYWdzICYgRVhJRl9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIkVYSUYiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgRVhJRiBtZXRhZGF0YSBpbiAnY2h1bmtfaXRlci5jaHVuaycpLgorICBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigmY2h1bmtfaXRlcik7CisgIGlmIChmbGFncyAmIFhNUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIlhNUCAiLCAxLCAmY2h1bmtfaXRlcik7CisgIC8vIC4uLiAoQ29uc3VtZSB0aGUgWE1QIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCisgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKKyAgV2ViUERlbXV4RGVsZXRlKGRlbXV4KTsKKyovCisKKyNpZm5kZWYgV0VCUF9XRUJQX0RFTVVYX0hfCisjZGVmaW5lIFdFQlBfV0VCUF9ERU1VWF9IXworCisjaW5jbHVkZSAiLi9kZWNvZGUuaCIgICAgIC8vIGZvciBXRUJQX0NTUF9NT0RFCisjaW5jbHVkZSAiLi9tdXhfdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04gMHgwMTA3ICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQorCisvLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAorLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KKy8vIHR5cGVkZWYgZW51bSBXZWJQRGVtdXhTdGF0ZSBXZWJQRGVtdXhTdGF0ZTsKKy8vIHR5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSBXZWJQRm9ybWF0RmVhdHVyZTsKK3R5cGVkZWYgc3RydWN0IFdlYlBEZW11eGVyIFdlYlBEZW11eGVyOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEl0ZXJhdG9yIFdlYlBJdGVyYXRvcjsKK3R5cGVkZWYgc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIFdlYlBDaHVua0l0ZXJhdG9yOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1JbmZvIFdlYlBBbmltSW5mbzsKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltRGVjb2Rlck9wdGlvbnMgV2ViUEFuaW1EZWNvZGVyT3B0aW9uczsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gUmV0dXJucyB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGRlbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZworLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgorV0VCUF9FWFRFUk4gaW50IFdlYlBHZXREZW11eFZlcnNpb24odm9pZCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWZlIG9mIGEgRGVtdXggb2JqZWN0CisKK3R5cGVkZWYgZW51bSBXZWJQRGVtdXhTdGF0ZSB7CisgIFdFQlBfREVNVVhfUEFSU0VfRVJST1IgICAgPSAtMSwgIC8vIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcuCisgIFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIgPSAgMCwgIC8vIE5vdCBlbm91Z2ggZGF0YSB0byBwYXJzZSBmdWxsIGhlYWRlci4KKyAgV0VCUF9ERU1VWF9QQVJTRURfSEVBREVSICA9ICAxLCAgLy8gSGVhZGVyIHBhcnNpbmcgY29tcGxldGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgbWF5IGJlIGF2YWlsYWJsZS4KKyAgV0VCUF9ERU1VWF9ET05FICAgICAgICAgICA9ICAyICAgLy8gRW50aXJlIGZpbGUgaGFzIGJlZW4gcGFyc2VkLgorfSBXZWJQRGVtdXhTdGF0ZTsKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOIFdlYlBEZW11eGVyKiBXZWJQRGVtdXhJbnRlcm5hbCgKKyAgICBjb25zdCBXZWJQRGF0YSosIGludCwgV2ViUERlbXV4U3RhdGUqLCBpbnQpOworCisvLyBQYXJzZXMgdGhlIGZ1bGwgV2ViUCBmaWxlIGdpdmVuIGJ5ICdkYXRhJy4gRm9yIHNpbmdsZSBpbWFnZXMgdGhlIFdlYlAgZmlsZQorLy8gaGVhZGVyIGFsb25lIG9yIHRoZSBmaWxlIGhlYWRlciBhbmQgdGhlIGNodW5rIGhlYWRlciBtYXkgYmUgYWJzZW50LgorLy8gUmV0dXJucyBhIFdlYlBEZW11eGVyIG9iamVjdCBvbiBzdWNjZXNzZnVsIHBhcnNlLCBOVUxMIG90aGVyd2lzZS4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQRGVtdXhlciogV2ViUERlbXV4KGNvbnN0IFdlYlBEYXRhKiBkYXRhKSB7CisgIHJldHVybiBXZWJQRGVtdXhJbnRlcm5hbChkYXRhLCAwLCBOVUxMLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gUGFyc2VzIHRoZSBwb3NzaWJseSBpbmNvbXBsZXRlIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuCisvLyBJZiAnc3RhdGUnIGlzIG5vbi1OVUxMIGl0IHdpbGwgYmUgc2V0IHRvIGluZGljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIGRlbXV4ZXIuCisvLyBSZXR1cm5zIE5VTEwgaW4gY2FzZSBvZiBlcnJvciBvciBpZiB0aGVyZSBpc24ndCBlbm91Z2ggZGF0YSB0byBzdGFydCBwYXJzaW5nOworLy8gYW5kIGEgV2ViUERlbXV4ZXIgb2JqZWN0IG9uIHN1Y2Nlc3NmdWwgcGFyc2UuCisvLyBOb3RlIHRoYXQgV2ViUERlbXV4ZXIga2VlcHMgaW50ZXJuYWwgcG9pbnRlcnMgdG8gJ2RhdGEnIG1lbW9yeSBzZWdtZW50LgorLy8gSWYgdGhpcyBkYXRhIGlzIHZvbGF0aWxlLCB0aGUgZGVtdXhlciBvYmplY3Qgc2hvdWxkIGJlIGRlbGV0ZWQgKGJ5IGNhbGxpbmcKKy8vIFdlYlBEZW11eERlbGV0ZSgpKSBhbmQgV2ViUERlbXV4UGFydGlhbCgpIGNhbGxlZCBhZ2FpbiBvbiB0aGUgbmV3IGRhdGEuCisvLyBUaGlzIGlzIHVzdWFsbHkgYW4gaW5leHBlbnNpdmUgb3BlcmF0aW9uLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBEZW11eGVyKiBXZWJQRGVtdXhQYXJ0aWFsKAorICAgIGNvbnN0IFdlYlBEYXRhKiBkYXRhLCBXZWJQRGVtdXhTdGF0ZSogc3RhdGUpIHsKKyAgcmV0dXJuIFdlYlBEZW11eEludGVybmFsKGRhdGEsIDEsIHN0YXRlLCBXRUJQX0RFTVVYX0FCSV9WRVJTSU9OKTsKK30KKworLy8gRnJlZXMgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnZG11eCcuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBEZW11eERlbGV0ZShXZWJQRGVtdXhlciogZG11eCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEYXRhL2luZm9ybWF0aW9uIGV4dHJhY3Rpb24uCisKK3R5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSB7CisgIFdFQlBfRkZfRk9STUFUX0ZMQUdTLCAgICAgIC8vIGJpdC13aXNlIGNvbWJpbmF0aW9uIG9mIFdlYlBGZWF0dXJlRmxhZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgJ1ZQOFgnIGNodW5rIChpZiBwcmVzZW50KS4KKyAgV0VCUF9GRl9DQU5WQVNfV0lEVEgsCisgIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCwKKyAgV0VCUF9GRl9MT09QX0NPVU5ULCAgICAgICAgLy8gb25seSByZWxldmFudCBmb3IgYW5pbWF0ZWQgZmlsZQorICBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IsICAvLyBpZGVtLgorICBXRUJQX0ZGX0ZSQU1FX0NPVU5UICAgICAgICAvLyBOdW1iZXIgb2YgZnJhbWVzIHByZXNlbnQgaW4gdGhlIGRlbXV4IG9iamVjdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIHBhcnRpYWwgZGVtdXgsIHRoaXMgaXMgdGhlIG51bWJlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBmcmFtZXMgc2VlbiBzbyBmYXIsIHdpdGggdGhlIGxhc3QgZnJhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG9zc2libHkgYmVpbmcgcGFydGlhbC4KK30gV2ViUEZvcm1hdEZlYXR1cmU7CisKKy8vIEdldCB0aGUgJ2ZlYXR1cmUnIHZhbHVlIGZyb20gdGhlICdkbXV4Jy4KKy8vIE5PVEU6IHZhbHVlcyBhcmUgb25seSB2YWxpZCBpZiBXZWJQRGVtdXgoKSB3YXMgdXNlZCBvciBXZWJQRGVtdXhQYXJ0aWFsKCkKKy8vIHJldHVybmVkIGEgc3RhdGUgPiBXRUJQX0RFTVVYX1BBUlNJTkdfSEVBREVSLgorLy8gSWYgJ2ZlYXR1cmUnIGlzIFdFQlBfRkZfRk9STUFUX0ZMQUdTLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgYSBiaXQtd2lzZQorLy8gY29tYmluYXRpb24gb2YgV2ViUEZlYXR1cmVGbGFncyB2YWx1ZXMuCisvLyBJZiAnZmVhdHVyZScgaXMgV0VCUF9GRl9MT09QX0NPVU5ULCBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IsIHRoZSByZXR1cm5lZAorLy8gdmFsdWUgaXMgb25seSBtZWFuaW5nZnVsIGlmIHRoZSBiaXRzdHJlYW0gaXMgYW5pbWF0ZWQuCitXRUJQX0VYVEVSTiB1aW50MzJfdCBXZWJQRGVtdXhHZXRJKAorICAgIGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBXZWJQRm9ybWF0RmVhdHVyZSBmZWF0dXJlKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZyYW1lIGl0ZXJhdGlvbi4KKworc3RydWN0IFdlYlBJdGVyYXRvciB7CisgIGludCBmcmFtZV9udW07CisgIGludCBudW1fZnJhbWVzOyAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFdFQlBfRkZfRlJBTUVfQ09VTlQuCisgIGludCB4X29mZnNldCwgeV9vZmZzZXQ7ICAvLyBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIGNhbnZhcy4KKyAgaW50IHdpZHRoLCBoZWlnaHQ7ICAgICAgIC8vIGRpbWVuc2lvbnMgb2YgdGhpcyBmcmFtZS4KKyAgaW50IGR1cmF0aW9uOyAgICAgICAgICAgIC8vIGRpc3BsYXkgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2Q7ICAvLyBkaXNwb3NlIG1ldGhvZCBmb3IgdGhlIGZyYW1lLgorICBpbnQgY29tcGxldGU7ICAgLy8gdHJ1ZSBpZiAnZnJhZ21lbnQnIGNvbnRhaW5zIGEgZnVsbCBmcmFtZS4gcGFydGlhbCBpbWFnZXMKKyAgICAgICAgICAgICAgICAgIC8vIG1heSBzdGlsbCBiZSBkZWNvZGVkIHdpdGggdGhlIFdlYlAgaW5jcmVtZW50YWwgZGVjb2Rlci4KKyAgV2ViUERhdGEgZnJhZ21lbnQ7ICAvLyBUaGUgZnJhbWUgZ2l2ZW4gYnkgJ2ZyYW1lX251bScuIE5vdGUgZm9yIGhpc3RvcmljYWwKKyAgICAgICAgICAgICAgICAgICAgICAvLyByZWFzb25zIHRoaXMgaXMgY2FsbGVkIGEgZnJhZ21lbnQuCisgIGludCBoYXNfYWxwaGE7ICAgICAgLy8gVHJ1ZSBpZiB0aGUgZnJhbWUgY29udGFpbnMgdHJhbnNwYXJlbmN5LgorICBXZWJQTXV4QW5pbUJsZW5kIGJsZW5kX21ldGhvZDsgIC8vIEJsZW5kIG9wZXJhdGlvbiBmb3IgdGhlIGZyYW1lLgorCisgIHVpbnQzMl90IHBhZFsyXTsgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UuCisgIHZvaWQqIHByaXZhdGVfOyAgICAgICAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCit9OworCisvLyBSZXRyaWV2ZXMgZnJhbWUgJ2ZyYW1lX251bWJlcicgZnJvbSAnZG11eCcuCisvLyAnaXRlci0+ZnJhZ21lbnQnIHBvaW50cyB0byB0aGUgZnJhbWUgb24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KKy8vIFNldHRpbmcgJ2ZyYW1lX251bWJlcicgZXF1YWwgdG8gMCB3aWxsIHJldHVybiB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgaW1hZ2UuCisvLyBSZXR1cm5zIGZhbHNlIGlmICdkbXV4JyBpcyBOVUxMIG9yIGZyYW1lICdmcmFtZV9udW1iZXInIGlzIG5vdCBwcmVzZW50LgorLy8gQ2FsbCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCisvLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgJ2l0ZXInLgorV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eEdldEZyYW1lKAorICAgIGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBpbnQgZnJhbWVfbnVtYmVyLCBXZWJQSXRlcmF0b3IqIGl0ZXIpOworCisvLyBTZXRzICdpdGVyLT5mcmFnbWVudCcgdG8gcG9pbnQgdG8gdGhlIG5leHQgKCdpdGVyLT5mcmFtZV9udW0nICsgMSkgb3IKKy8vIHByZXZpb3VzICgnaXRlci0+ZnJhbWVfbnVtJyAtIDEpIGZyYW1lLiBUaGVzZSBmdW5jdGlvbnMgZG8gbm90IGxvb3AuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eE5leHRGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOworV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eFByZXZGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOworCisvLyBSZWxlYXNlcyBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnaXRlcicuCisvLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gV2ViUERlbXV4R2V0Q2h1bmsoKSBvbiB0aGUgc2FtZQorLy8gaXRlci4gQWxzbywgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAorLy8gV2ViUERlbXV4RGVsZXRlKCkuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBEZW11eFJlbGVhc2VJdGVyYXRvcihXZWJQSXRlcmF0b3IqIGl0ZXIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ2h1bmsgaXRlcmF0aW9uLgorCitzdHJ1Y3QgV2ViUENodW5rSXRlcmF0b3IgeworICAvLyBUaGUgY3VycmVudCBhbmQgdG90YWwgbnVtYmVyIG9mIGNodW5rcyB3aXRoIHRoZSBmb3VyY2MgZ2l2ZW4gdG8KKyAgLy8gV2ViUERlbXV4R2V0Q2h1bmsoKS4KKyAgaW50IGNodW5rX251bTsKKyAgaW50IG51bV9jaHVua3M7CisgIFdlYlBEYXRhIGNodW5rOyAgICAvLyBUaGUgcGF5bG9hZCBvZiB0aGUgY2h1bmsuCisKKyAgdWludDMyX3QgcGFkWzZdOyAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorICB2b2lkKiBwcml2YXRlXzsKK307CisKKy8vIFJldHJpZXZlcyB0aGUgJ2NodW5rX251bWJlcicgaW5zdGFuY2Ugb2YgdGhlIGNodW5rIHdpdGggaWQgJ2ZvdXJjYycgZnJvbQorLy8gJ2RtdXgnLgorLy8gJ2ZvdXJjYycgaXMgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuayB0byByZXR1cm4sCisvLyBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiLCBldGMuCisvLyBTZXR0aW5nICdjaHVua19udW1iZXInIGVxdWFsIHRvIDAgd2lsbCByZXR1cm4gdGhlIGxhc3QgY2h1bmsgaW4gYSBzZXQuCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNodW5rIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UuIEltYWdlIHJlbGF0ZWQgY2h1bmsKKy8vIHBheWxvYWRzIGFyZSBhY2Nlc3NlZCB0aHJvdWdoIFdlYlBEZW11eEdldEZyYW1lKCkgYW5kIHJlbGF0ZWQgZnVuY3Rpb25zLgorLy8gQ2FsbCBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcigpIHdoZW4gdXNlIG9mIHRoZSBpdGVyYXRvciBpcyBjb21wbGV0ZS4KKy8vIE5PVEU6ICdkbXV4JyBtdXN0IHBlcnNpc3QgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgaXRlcmF0b3IuCitXRUJQX0VYVEVSTiBpbnQgV2ViUERlbXV4R2V0Q2h1bmsoY29uc3QgV2ViUERlbXV4ZXIqIGRtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmb3VyY2NbNF0sIGludCBjaHVua19udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUENodW5rSXRlcmF0b3IqIGl0ZXIpOworCisvLyBTZXRzICdpdGVyLT5jaHVuaycgdG8gcG9pbnQgdG8gdGhlIG5leHQgKCdpdGVyLT5jaHVua19udW0nICsgMSkgb3IgcHJldmlvdXMKKy8vICgnaXRlci0+Y2h1bmtfbnVtJyAtIDEpIGNodW5rLiBUaGVzZSBmdW5jdGlvbnMgZG8gbm90IGxvb3AuCisvLyBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBEZW11eE5leHRDaHVuayhXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7CitXRUJQX0VYVEVSTiBpbnQgV2ViUERlbXV4UHJldkNodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgorLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAorLy8gV2ViUERlbXV4RGVsZXRlKCkuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFdlYlBBbmltRGVjb2RlciBBUEkKKy8vCisvLyBUaGlzIEFQSSBhbGxvd3MgZGVjb2RpbmcgKHBvc3NpYmx5KSBhbmltYXRlZCBXZWJQIGltYWdlcy4KKy8vCisvLyBDb2RlIEV4YW1wbGU6CisvKgorICBXZWJQQW5pbURlY29kZXJPcHRpb25zIGRlY19vcHRpb25zOworICBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdCgmZGVjX29wdGlvbnMpOworICAvLyBUdW5lICdkZWNfb3B0aW9ucycgYXMgbmVlZGVkLgorICBXZWJQQW5pbURlY29kZXIqIGRlYyA9IFdlYlBBbmltRGVjb2Rlck5ldyh3ZWJwX2RhdGEsICZkZWNfb3B0aW9ucyk7CisgIFdlYlBBbmltSW5mbyBhbmltX2luZm87CisgIFdlYlBBbmltRGVjb2RlckdldEluZm8oZGVjLCAmYW5pbV9pbmZvKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGFuaW1faW5mby5sb29wX2NvdW50OyArK2kpIHsKKyAgICB3aGlsZSAoV2ViUEFuaW1EZWNvZGVySGFzTW9yZUZyYW1lcyhkZWMpKSB7CisgICAgICB1aW50OF90KiBidWY7CisgICAgICBpbnQgdGltZXN0YW1wOworICAgICAgV2ViUEFuaW1EZWNvZGVyR2V0TmV4dChkZWMsICZidWYsICZ0aW1lc3RhbXApOworICAgICAgLy8gLi4uIChSZW5kZXIgJ2J1ZicgYmFzZWQgb24gJ3RpbWVzdGFtcCcpLgorICAgICAgLy8gLi4uIChEbyBOT1QgZnJlZSAnYnVmJywgYXMgaXQgaXMgb3duZWQgYnkgJ2RlYycpLgorICAgIH0KKyAgICBXZWJQQW5pbURlY29kZXJSZXNldChkZWMpOworICB9CisgIGNvbnN0IFdlYlBEZW11eGVyKiBkZW11eGVyID0gV2ViUEFuaW1EZWNvZGVyR2V0RGVtdXhlcihkZWMpOworICAvLyAuLi4gKERvIHNvbWV0aGluZyB1c2luZyAnZGVtdXhlcic7IGUuZy4gZ2V0IEVYSUYvWE1QL0lDQyBkYXRhKS4KKyAgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKGRlYyk7CisqLworCit0eXBlZGVmIHN0cnVjdCBXZWJQQW5pbURlY29kZXIgV2ViUEFuaW1EZWNvZGVyOyAgLy8gTWFpbiBvcGFxdWUgb2JqZWN0LgorCisvLyBHbG9iYWwgb3B0aW9ucy4KK3N0cnVjdCBXZWJQQW5pbURlY29kZXJPcHRpb25zIHsKKyAgLy8gT3V0cHV0IGNvbG9yc3BhY2UuIE9ubHkgdGhlIGZvbGxvd2luZyBtb2RlcyBhcmUgc3VwcG9ydGVkOgorICAvLyBNT0RFX1JHQkEsIE1PREVfQkdSQSwgTU9ERV9yZ2JBIGFuZCBNT0RFX2JnckEuCisgIFdFQlBfQ1NQX01PREUgY29sb3JfbW9kZTsKKyAgaW50IHVzZV90aHJlYWRzOyAgICAgICAgICAgLy8gSWYgdHJ1ZSwgdXNlIG11bHRpLXRocmVhZGVkIGRlY29kaW5nLgorICB1aW50MzJfdCBwYWRkaW5nWzddOyAgICAgICAvLyBQYWRkaW5nIGZvciBsYXRlciB1c2UuCit9OworCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludC4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbURlY29kZXJPcHRpb25zSW5pdEludGVybmFsKAorICAgIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqLCBpbnQpOworCisvLyBTaG91bGQgYWx3YXlzIGJlIGNhbGxlZCwgdG8gaW5pdGlhbGl6ZSBhIGZyZXNoIFdlYlBBbmltRGVjb2Rlck9wdGlvbnMKKy8vIHN0cnVjdHVyZSBiZWZvcmUgbW9kaWZpY2F0aW9uLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgdmVyc2lvbiBtaXNtYXRjaC4KKy8vIFdlYlBBbmltRGVjb2Rlck9wdGlvbnNJbml0KCkgbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlCisvLyAnZGVjX29wdGlvbnMnIG9iamVjdC4KK3N0YXRpYyBXRUJQX0lOTElORSBpbnQgV2ViUEFuaW1EZWNvZGVyT3B0aW9uc0luaXQoCisgICAgV2ViUEFuaW1EZWNvZGVyT3B0aW9ucyogZGVjX29wdGlvbnMpIHsKKyAgcmV0dXJuIFdlYlBBbmltRGVjb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoZGVjX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludC4KK1dFQlBfRVhURVJOIFdlYlBBbmltRGVjb2RlciogV2ViUEFuaW1EZWNvZGVyTmV3SW50ZXJuYWwoCisgICAgY29uc3QgV2ViUERhdGEqLCBjb25zdCBXZWJQQW5pbURlY29kZXJPcHRpb25zKiwgaW50KTsKKworLy8gQ3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBXZWJQQW5pbURlY29kZXIgb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgd2VicF9kYXRhIC0gKGluKSBXZWJQIGJpdHN0cmVhbS4gVGhpcyBzaG91bGQgcmVtYWluIHVuY2hhbmdlZCBkdXJpbmcgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgbGlmZXRpbWUgb2YgdGhlIG91dHB1dCBXZWJQQW5pbURlY29kZXIgb2JqZWN0LgorLy8gICBkZWNfb3B0aW9ucyAtIChpbikgZGVjb2Rpbmcgb3B0aW9ucy4gQ2FuIGJlIHBhc3NlZCBOVUxMIHRvIGNob29zZQorLy8gICAgICAgICAgICAgICAgICAgICAgcmVhc29uYWJsZSBkZWZhdWx0cyAoaW4gcGFydGljdWxhciwgY29sb3IgbW9kZSBNT0RFX1JHQkEKKy8vICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgcGlja2VkKS4KKy8vIFJldHVybnM6CisvLyAgIEEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBXZWJQQW5pbURlY29kZXIgb2JqZWN0LCBvciBOVUxMIGluIGNhc2Ugb2YKKy8vICAgcGFyc2luZyBlcnJvciwgaW52YWxpZCBvcHRpb24gb3IgbWVtb3J5IGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBBbmltRGVjb2RlciogV2ViUEFuaW1EZWNvZGVyTmV3KAorICAgIGNvbnN0IFdlYlBEYXRhKiB3ZWJwX2RhdGEsIGNvbnN0IFdlYlBBbmltRGVjb2Rlck9wdGlvbnMqIGRlY19vcHRpb25zKSB7CisgIHJldHVybiBXZWJQQW5pbURlY29kZXJOZXdJbnRlcm5hbCh3ZWJwX2RhdGEsIGRlY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9ERU1VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIEdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYW5pbWF0aW9uLi4KK3N0cnVjdCBXZWJQQW5pbUluZm8geworICB1aW50MzJfdCBjYW52YXNfd2lkdGg7CisgIHVpbnQzMl90IGNhbnZhc19oZWlnaHQ7CisgIHVpbnQzMl90IGxvb3BfY291bnQ7CisgIHVpbnQzMl90IGJnY29sb3I7CisgIHVpbnQzMl90IGZyYW1lX2NvdW50OworICB1aW50MzJfdCBwYWRbNF07ICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCit9OworCisvLyBHZXQgZ2xvYmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhbmltYXRpb24uCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20uCisvLyAgIGluZm8gLSAob3V0KSBnbG9iYWwgaW5mb3JtYXRpb24gZmV0Y2hlZCBmcm9tIHRoZSBhbmltYXRpb24uCisvLyBSZXR1cm5zOgorLy8gICBUcnVlIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1EZWNvZGVyR2V0SW5mbyhjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBBbmltSW5mbyogaW5mbyk7CisKKy8vIEZldGNoIHRoZSBuZXh0IGZyYW1lIGZyb20gJ2RlYycgYmFzZWQgb24gb3B0aW9ucyBzdXBwbGllZCB0bworLy8gV2ViUEFuaW1EZWNvZGVyTmV3KCkuIFRoaXMgd2lsbCBiZSBhIGZ1bGx5IHJlY29uc3RydWN0ZWQgY2FudmFzIG9mIHNpemUKKy8vICdjYW52YXNfd2lkdGggKiA0ICogY2FudmFzX2hlaWdodCcsIGFuZCBub3QganVzdCB0aGUgZnJhbWUgc3ViLXJlY3RhbmdsZS4gVGhlCisvLyByZXR1cm5lZCBidWZmZXIgJ2J1ZicgaXMgdmFsaWQgb25seSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbURlY29kZXJHZXROZXh0KCksIFdlYlBBbmltRGVjb2RlclJlc2V0KCkgb3IgV2ViUEFuaW1EZWNvZGVyRGVsZXRlKCkuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4vb3V0KSBkZWNvZGVyIGluc3RhbmNlIGZyb20gd2hpY2ggdGhlIG5leHQgZnJhbWUgaXMgdG8gYmUgZmV0Y2hlZC4KKy8vICAgYnVmIC0gKG91dCkgZGVjb2RlZCBmcmFtZS4KKy8vICAgdGltZXN0YW1wIC0gKG91dCkgdGltZXN0YW1wIG9mIHRoZSBmcmFtZSBpbiBtaWxsaXNlY29uZHMuCisvLyBSZXR1cm5zOgorLy8gICBGYWxzZSBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUgTlVMTCwgb3IgaWYgdGhlcmUgaXMgYSBwYXJzaW5nIG9yCisvLyAgIGRlY29kaW5nIGVycm9yLCBvciBpZiB0aGVyZSBhcmUgbm8gbW9yZSBmcmFtZXMuIE90aGVyd2lzZSwgcmV0dXJucyB0cnVlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRGVjb2RlckdldE5leHQoV2ViUEFuaW1EZWNvZGVyKiBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiogYnVmLCBpbnQqIHRpbWVzdGFtcCk7CisKKy8vIENoZWNrIGlmIHRoZXJlIGFyZSBtb3JlIGZyYW1lcyBsZWZ0IHRvIGRlY29kZS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGRlYyAtIChpbikgZGVjb2RlciBpbnN0YW5jZSB0byBiZSBjaGVja2VkLgorLy8gUmV0dXJuczoKKy8vICAgVHJ1ZSBpZiAnZGVjJyBpcyBub3QgTlVMTCBhbmQgc29tZSBmcmFtZXMgYXJlIHlldCB0byBiZSBkZWNvZGVkLgorLy8gICBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UuCitXRUJQX0VYVEVSTiBpbnQgV2ViUEFuaW1EZWNvZGVySGFzTW9yZUZyYW1lcyhjb25zdCBXZWJQQW5pbURlY29kZXIqIGRlYyk7CisKKy8vIFJlc2V0cyB0aGUgV2ViUEFuaW1EZWNvZGVyIG9iamVjdCwgc28gdGhhdCBuZXh0IGNhbGwgdG8KKy8vIFdlYlBBbmltRGVjb2RlckdldE5leHQoKSB3aWxsIHJlc3RhcnQgZGVjb2RpbmcgZnJvbSAxc3QgZnJhbWUuIFRoaXMgd291bGQgYmUKKy8vIGhlbHBmdWwgd2hlbiBhbGwgZnJhbWVzIG5lZWQgdG8gYmUgZGVjb2RlZCBtdWx0aXBsZSB0aW1lcyAoZS5nLgorLy8gaW5mby5sb29wX2NvdW50IHRpbWVzKSB3aXRob3V0IGRlc3Ryb3lpbmcgYW5kIHJlY3JlYXRpbmcgdGhlICdkZWMnIG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGRlYyAtIChpbi9vdXQpIGRlY29kZXIgaW5zdGFuY2UgdG8gYmUgcmVzZXQKK1dFQlBfRVhURVJOIHZvaWQgV2ViUEFuaW1EZWNvZGVyUmVzZXQoV2ViUEFuaW1EZWNvZGVyKiBkZWMpOworCisvLyBHcmFiIHRoZSBpbnRlcm5hbCBkZW11eGVyIG9iamVjdC4KKy8vIEdldHRpbmcgdGhlIGRlbXV4ZXIgb2JqZWN0IGNhbiBiZSB1c2VmdWwgaWYgb25lIHdhbnRzIHRvIHVzZSBvcGVyYXRpb25zIG9ubHkKKy8vIGF2YWlsYWJsZSB0aHJvdWdoIGRlbXV4ZXI7IGUuZy4gdG8gZ2V0IFhNUC9FWElGL0lDQyBtZXRhZGF0YS4gVGhlIHJldHVybmVkCisvLyBkZW11eGVyIG9iamVjdCBpcyBvd25lZCBieSAnZGVjJyBhbmQgaXMgdmFsaWQgb25seSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbURlY29kZXJEZWxldGUoKS4KKy8vCisvLyBQYXJhbWV0ZXJzOgorLy8gICBkZWMgLSAoaW4pIGRlY29kZXIgaW5zdGFuY2UgZnJvbSB3aGljaCB0aGUgZGVtdXhlciBvYmplY3QgaXMgdG8gYmUgZmV0Y2hlZC4KK1dFQlBfRVhURVJOIGNvbnN0IFdlYlBEZW11eGVyKiBXZWJQQW5pbURlY29kZXJHZXREZW11eGVyKAorICAgIGNvbnN0IFdlYlBBbmltRGVjb2RlciogZGVjKTsKKworLy8gRGVsZXRlcyB0aGUgV2ViUEFuaW1EZWNvZGVyIG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGRlYyAtIChpbi9vdXQpIGRlY29kZXIgaW5zdGFuY2UgdG8gYmUgZGVsZXRlZAorV0VCUF9FWFRFUk4gdm9pZCBXZWJQQW5pbURlY29kZXJEZWxldGUoV2ViUEFuaW1EZWNvZGVyKiBkZWMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gICAgLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAgLyogV0VCUF9XRUJQX0RFTVVYX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2VuY29kZS5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZW5jb2RlLmgKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9lbmNvZGUuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvZW5jb2RlLmgKaW5kZXggNDdkOWQ5MS4uN2VjMzU0MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9lbmNvZGUuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9lbmNvZGUuaApAQCAtMTYsMTEgKzE2LDExIEBACiAKICNpbmNsdWRlICIuL3R5cGVzLmgiCiAKLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCisjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNkZWZpbmUgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OIDB4MDIwMSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKKyNkZWZpbmUgV0VCUF9FTkNPREVSX0FCSV9WRVJTSU9OIDB4MDIwZSAgICAvLyBNQUpPUig4YikgKyBNSU5PUig4YikKIAogLy8gTm90ZTogZm9yd2FyZCBkZWNsYXJpbmcgZW51bWVyYXRpb25zIGlzIG5vdCBhbGxvd2VkIGluIChzdHJpY3QpIEMgYW5kIEMrKywKIC8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCkBAIC0zNSw0NSArMzUsNDggQEAKIAogLy8gUmV0dXJuIHRoZSBlbmNvZGVyJ3MgdmVyc2lvbiBudW1iZXIsIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZyA4Yml0cyBmb3IKIC8vIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQR2V0RW5jb2RlclZlcnNpb24odm9pZCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUEdldEVuY29kZXJWZXJzaW9uKHZvaWQpOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gT25lLXN0b3Atc2hvcCBjYWxsISBObyBxdWVzdGlvbnMgYXNrZWQ6CiAKIC8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGNvbXByZXNzZWQgZGF0YSAocG9pbnRlZCB0byBieSAqb3V0cHV0KSwgb3IgMCBpZgogLy8gYW4gZXJyb3Igb2NjdXJyZWQuIFRoZSBjb21wcmVzc2VkIGRhdGEgbXVzdCBiZSByZWxlYXNlZCBieSB0aGUgY2FsbGVyCi0vLyB1c2luZyB0aGUgY2FsbCAnU2JNZW1vcnlEZWFsbG9jYXRlKCpvdXRwdXQpJy4KKy8vIHVzaW5nIHRoZSBjYWxsICdXZWJQRnJlZSgqb3V0cHV0KScuCiAvLyBUaGVzZSBmdW5jdGlvbnMgY29tcHJlc3MgdXNpbmcgdGhlIGxvc3N5IGZvcm1hdCwgYW5kIHRoZSBxdWFsaXR5X2ZhY3RvcgogLy8gY2FuIGdvIGZyb20gMCAoc21hbGxlciBvdXRwdXQsIGxvd2VyIHF1YWxpdHkpIHRvIDEwMCAoYmVzdCBxdWFsaXR5LAogLy8gbGFyZ2VyIG91dHB1dCkuCi1XRUJQX0VYVEVSTihzaXplX3QpIFdlYlBFbmNvZGVSR0IoY29uc3QgdWludDhfdCogcmdiLAorV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVSR0IoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVCR1IoY29uc3QgdWludDhfdCogYmdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOworV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUJHUihjb25zdCB1aW50OF90KiBiZ3IsCitXRUJQX0VYVEVSTiBzaXplX3QgV2ViUEVuY29kZUJHUkEoY29uc3QgdWludDhfdCogYmdyYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUJHUkEoY29uc3QgdWludDhfdCogYmdyYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwgdWludDhfdCoqIG91dHB1dCk7CiAKIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlLCBidXQgY29tcHJlc3NpbmcgaW4gYQogLy8gbG9zc2xlc3MgbWFubmVyLiBGaWxlcyBhcmUgdXN1YWxseSBsYXJnZXIgdGhhbiBsb3NzeSBmb3JtYXQsIGJ1dCB3aWxsCiAvLyBub3Qgc3VmZmVyIGFueSBjb21wcmVzc2lvbiBsb3NzLgotV0VCUF9FWFRFUk4oc2l6ZV90KSBXZWJQRW5jb2RlTG9zc2xlc3NSR0IoY29uc3QgdWludDhfdCogcmdiLAorV0VCUF9FWFRFUk4gc2l6ZV90IFdlYlBFbmNvZGVMb3NzbGVzc1JHQihjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CitXRUJQX0VYVEVSTiBzaXplX3QgV2ViUEVuY29kZUxvc3NsZXNzQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKGNvbnN0IHVpbnQ4X3QqIHJnYmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzQkdSKGNvbnN0IHVpbnQ4X3QqIGJnciwKK1dFQlBfRVhURVJOIHNpemVfdCBXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKGNvbnN0IHVpbnQ4X3QqIGJncmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzUkdCQShjb25zdCB1aW50OF90KiByZ2JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKLVdFQlBfRVhURVJOKHNpemVfdCkgV2ViUEVuY29kZUxvc3NsZXNzQkdSQShjb25zdCB1aW50OF90KiBiZ3JhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90Kiogb3V0cHV0KTsKKworLy8gUmVsZWFzZXMgbWVtb3J5IHJldHVybmVkIGJ5IHRoZSBXZWJQRW5jb2RlKigpIGZ1bmN0aW9ucyBhYm92ZS4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUEZyZWUodm9pZCogcHRyKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIENvZGluZyBwYXJhbWV0ZXJzCkBAIC05MCwxMiArOTMsMTUgQEAKIC8vIENvbXByZXNzaW9uIHBhcmFtZXRlcnMuCiBzdHJ1Y3QgV2ViUENvbmZpZyB7CiAgIGludCBsb3NzbGVzczsgICAgICAgICAgIC8vIExvc3NsZXNzIGVuY29kaW5nICgwPWxvc3N5KGRlZmF1bHQpLCAxPWxvc3NsZXNzKS4KLSAgZmxvYXQgcXVhbGl0eTsgICAgICAgICAgLy8gYmV0d2VlbiAwIChzbWFsbGVzdCBmaWxlKSBhbmQgMTAwIChiaWdnZXN0KQorICBmbG9hdCBxdWFsaXR5OyAgICAgICAgICAvLyBiZXR3ZWVuIDAgYW5kIDEwMC4gRm9yIGxvc3N5LCAwIGdpdmVzIHRoZSBzbWFsbGVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCAxMDAgdGhlIGxhcmdlc3QuIEZvciBsb3NzbGVzcywgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgaXMgdGhlIGFtb3VudCBvZiBlZmZvcnQgcHV0IGludG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXByZXNzaW9uOiAwIGlzIHRoZSBmYXN0ZXN0IGJ1dCBnaXZlcyBsYXJnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlsZXMgY29tcGFyZWQgdG8gdGhlIHNsb3dlc3QsIGJ1dCBiZXN0LCAxMDAuCiAgIGludCBtZXRob2Q7ICAgICAgICAgICAgIC8vIHF1YWxpdHkvc3BlZWQgdHJhZGUtb2ZmICgwPWZhc3QsIDY9c2xvd2VyLWJldHRlcikKIAogICBXZWJQSW1hZ2VIaW50IGltYWdlX2hpbnQ7ICAvLyBIaW50IGZvciBpbWFnZSB0eXBlIChsb3NzbGVzcyBvbmx5IGZvciBub3cpLgogCi0gIC8vIFBhcmFtZXRlcnMgcmVsYXRlZCB0byBsb3NzeSBjb21wcmVzc2lvbiBvbmx5OgogICBpbnQgdGFyZ2V0X3NpemU7ICAgICAgICAvLyBpZiBub24temVybywgc2V0IHRoZSBkZXNpcmVkIHRhcmdldCBzaXplIGluIGJ5dGVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlICdjb21wcmVzc2lvbicgcGFyYW1ldGVyLgogICBmbG9hdCB0YXJnZXRfUFNOUjsgICAgICAvLyBpZiBub24temVybywgc3BlY2lmaWVzIHRoZSBtaW5pbWFsIGRpc3RvcnRpb24gdG8KQEAgLTExNyw3ICsxMjMsOCBAQAogCiAgIGludCBzaG93X2NvbXByZXNzZWQ7ICAgIC8vIGlmIHRydWUsIGV4cG9ydCB0aGUgY29tcHJlc3NlZCBwaWN0dXJlIGJhY2suCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluLWxvb3AgZmlsdGVyaW5nIGlzIG5vdCBhcHBsaWVkLgotICBpbnQgcHJlcHJvY2Vzc2luZzsgICAgICAvLyBwcmVwcm9jZXNzaW5nIGZpbHRlciAoMD1ub25lLCAxPXNlZ21lbnQtc21vb3RoKQorICBpbnQgcHJlcHJvY2Vzc2luZzsgICAgICAvLyBwcmVwcm9jZXNzaW5nIGZpbHRlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMD1ub25lLCAxPXNlZ21lbnQtc21vb3RoLCAyPXBzZXVkby1yYW5kb20gZGl0aGVyaW5nCiAgIGludCBwYXJ0aXRpb25zOyAgICAgICAgIC8vIGxvZzIobnVtYmVyIG9mIHRva2VuIHBhcnRpdGlvbnMpIGluIFswLi4zXS4gRGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gMCBmb3IgZWFzaWVyIHByb2dyZXNzaXZlIGRlY29kaW5nLgogICBpbnQgcGFydGl0aW9uX2xpbWl0OyAgICAvLyBxdWFsaXR5IGRlZ3JhZGF0aW9uIGFsbG93ZWQgdG8gZml0IHRoZSA1MTJrIGxpbWl0CkBAIC0xMzAsNyArMTM3LDE3IEBACiAgIGludCB0aHJlYWRfbGV2ZWw7ICAgICAgIC8vIElmIG5vbi16ZXJvLCB0cnkgYW5kIHVzZSBtdWx0aS10aHJlYWRlZCBlbmNvZGluZy4KICAgaW50IGxvd19tZW1vcnk7ICAgICAgICAgLy8gSWYgc2V0LCByZWR1Y2UgbWVtb3J5IHVzYWdlIChidXQgaW5jcmVhc2UgQ1BVIHVzZSkuCiAKLSAgdWludDMyX3QgcGFkWzVdOyAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCisgIGludCBuZWFyX2xvc3NsZXNzOyAgICAgIC8vIE5lYXIgbG9zc2xlc3MgZW5jb2RpbmcgWzAgPSBtYXggbG9zcyAuLiAxMDAgPSBvZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGRlZmF1bHQpXS4KKyAgaW50IGV4YWN0OyAgICAgICAgICAgICAgLy8gaWYgbm9uLXplcm8sIHByZXNlcnZlIHRoZSBleGFjdCBSR0IgdmFsdWVzIHVuZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zcGFyZW50IGFyZWEuIE90aGVyd2lzZSwgZGlzY2FyZCB0aGlzIGludmlzaWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSR0IgaW5mb3JtYXRpb24gZm9yIGJldHRlciBjb21wcmVzc2lvbi4gVGhlIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgaXMgMC4KKworICBpbnQgdXNlX2RlbHRhX3BhbGV0dGU7ICAvLyByZXNlcnZlZCBmb3IgZnV0dXJlIGxvc3NsZXNzIGZlYXR1cmUKKyAgaW50IHVzZV9zaGFycF95dXY7ICAgICAgLy8gaWYgbmVlZGVkLCB1c2Ugc2hhcnAgKGFuZCBzbG93KSBSR0ItPllVViBjb252ZXJzaW9uCisKKyAgdWludDMyX3QgcGFkWzJdOyAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiB9OwogCiAvLyBFbnVtZXJhdGUgc29tZSBwcmVkZWZpbmVkIHNldHRpbmdzIGZvciBXZWJQQ29uZmlnLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUKQEAgLTE0NSw3ICsxNjIsNyBAQAogfSBXZWJQUHJlc2V0OwogCiAvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oaW50KSBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqLCBXZWJQUHJlc2V0LCBmbG9hdCwgaW50KTsKK1dFQlBfRVhURVJOIGludCBXZWJQQ29uZmlnSW5pdEludGVybmFsKFdlYlBDb25maWcqLCBXZWJQUHJlc2V0LCBmbG9hdCwgaW50KTsKIAogLy8gU2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQsIHRvIGluaXRpYWxpemUgYSBmcmVzaCBXZWJQQ29uZmlnIHN0cnVjdHVyZSBiZWZvcmUKIC8vIG1vZGlmaWNhdGlvbi4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHZlcnNpb24gbWlzbWF0Y2guIFdlYlBDb25maWdJbml0KCkKQEAgLTE2NiwxMyArMTgzLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQlBfRU5DT0RFUl9BQklfVkVSU0lPTik7CiB9CiAKKy8vIEFjdGl2YXRlIHRoZSBsb3NzbGVzcyBjb21wcmVzc2lvbiBtb2RlIHdpdGggdGhlIGRlc2lyZWQgZWZmaWNpZW5jeSBsZXZlbAorLy8gYmV0d2VlbiAwIChmYXN0ZXN0LCBsb3dlc3QgY29tcHJlc3Npb24pIGFuZCA5IChzbG93ZXIsIGJlc3QgY29tcHJlc3Npb24pLgorLy8gQSBnb29kIGRlZmF1bHQgbGV2ZWwgaXMgJzYnLCBwcm92aWRpbmcgYSBmYWlyIHRyYWRlb2ZmIGJldHdlZW4gY29tcHJlc3Npb24KKy8vIHNwZWVkIGFuZCBmaW5hbCBjb21wcmVzc2VkIHNpemUuCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgb3ZlcndyaXRlIHNldmVyYWwgZmllbGRzIGZyb20gY29uZmlnOiAnbWV0aG9kJywgJ3F1YWxpdHknCisvLyBhbmQgJ2xvc3NsZXNzJy4gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIHBhcmFtZXRlciBlcnJvci4KK1dFQlBfRVhURVJOIGludCBXZWJQQ29uZmlnTG9zc2xlc3NQcmVzZXQoV2ViUENvbmZpZyogY29uZmlnLCBpbnQgbGV2ZWwpOworCiAvLyBSZXR1cm5zIHRydWUgaWYgJ2NvbmZpZycgaXMgbm9uLU5VTEwgYW5kIGFsbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlCiAvLyB3aXRoaW4gdGhlaXIgdmFsaWQgcmFuZ2VzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKTsKK1dFQlBfRVhURVJOIGludCBXZWJQVmFsaWRhdGVDb25maWcoY29uc3QgV2ViUENvbmZpZyogY29uZmlnKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIElucHV0IC8gT3V0cHV0Ci0vLyBTdHJ1Y3R1cmUgZm9yIHN0b3JpbmcgYXV4aWxpYXJ5IHN0YXRpc3RpY3MgKG1vc3RseSBmb3IgbG9zc3kgZW5jb2RpbmcpLgorLy8gU3RydWN0dXJlIGZvciBzdG9yaW5nIGF1eGlsaWFyeSBzdGF0aXN0aWNzLgogCiBzdHJ1Y3QgV2ViUEF1eFN0YXRzIHsKICAgaW50IGNvZGVkX3NpemU7ICAgICAgICAgLy8gZmluYWwgc2l6ZQpAQCAtMTk4LDggKzIyMywxMCBAQAogICBpbnQgY2FjaGVfYml0czsgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBiaXRzIGZvciBjb2xvciBjYWNoZSBsb29rdXAKICAgaW50IHBhbGV0dGVfc2l6ZTsgICAgICAgICAgICAvLyBudW1iZXIgb2YgY29sb3IgaW4gcGFsZXR0ZSwgaWYgdXNlZAogICBpbnQgbG9zc2xlc3Nfc2l6ZTsgICAgICAgICAgIC8vIGZpbmFsIGxvc3NsZXNzIHNpemUKKyAgaW50IGxvc3NsZXNzX2hkcl9zaXplOyAgICAgICAvLyBsb3NzbGVzcyBoZWFkZXIgKHRyYW5zZm9ybSwgaHVmZm1hbiBldGMpIHNpemUKKyAgaW50IGxvc3NsZXNzX2RhdGFfc2l6ZTsgICAgICAvLyBsb3NzbGVzcyBpbWFnZSBkYXRhIHNpemUKIAotICB1aW50MzJfdCBwYWRbNF07ICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgdWludDMyX3QgcGFkWzJdOyAgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiB9OwogCiAvLyBTaWduYXR1cmUgZm9yIG91dHB1dCBmdW5jdGlvbi4gU2hvdWxkIHJldHVybiB0cnVlIGlmIHdyaXRpbmcgd2FzIHN1Y2Nlc3NmdWwuCkBAIC0yMTgsMTMgKzI0NSwxNiBAQAogfTsKIAogLy8gVGhlIGZvbGxvd2luZyBtdXN0IGJlIGNhbGxlZCBmaXJzdCBiZWZvcmUgYW55IHVzZS4KLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcik7CitXRUJQX0VYVEVSTiB2b2lkIFdlYlBNZW1vcnlXcml0ZXJJbml0KFdlYlBNZW1vcnlXcml0ZXIqIHdyaXRlcik7CiAKKy8vIFRoZSBmb2xsb3dpbmcgbXVzdCBiZSBjYWxsZWQgdG8gZGVhbGxvY2F0ZSB3cml0ZXItPm1lbSBtZW1vcnkuIFRoZSAnd3JpdGVyJworLy8gb2JqZWN0IGl0c2VsZiBpcyBub3QgZGVhbGxvY2F0ZWQuCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBNZW1vcnlXcml0ZXJDbGVhcihXZWJQTWVtb3J5V3JpdGVyKiB3cml0ZXIpOwogLy8gVGhlIGN1c3RvbSB3cml0ZXIgdG8gYmUgdXNlZCB3aXRoIFdlYlBNZW1vcnlXcml0ZXIgYXMgY3VzdG9tX3B0ci4gVXBvbgogLy8gY29tcGxldGlvbiwgd3JpdGVyLm1lbSBhbmQgd3JpdGVyLnNpemUgd2lsbCBob2xkIHRoZSBjb2RlZCBkYXRhLgotLy8gd3JpdGVyLm1lbSBtdXN0IGJlIGZyZWVkIHVzaW5nIHRoZSBjYWxsICdTYk1lbW9yeURlYWxsb2NhdGUod3JpdGVyLm1lbSknLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKKy8vIHdyaXRlci5tZW0gbXVzdCBiZSBmcmVlZCBieSBjYWxsaW5nIFdlYlBNZW1vcnlXcml0ZXJDbGVhci4KK1dFQlBfRVhURVJOIGludCBXZWJQTWVtb3J5V3JpdGUoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBQcm9ncmVzcyBob29rLCBjYWxsZWQgZnJvbSB0aW1lIHRvIHRpbWUgdG8gcmVwb3J0IHByb2dyZXNzLiBJdCBjYW4gcmV0dXJuCiAvLyBmYWxzZSB0byByZXF1ZXN0IGFuIGFib3J0IG9mIHRoZSBlbmNvZGluZyBwcm9jZXNzLCBvciB0cnVlIG90aGVyd2lzZSBpZgpAQCAtMjM0LDE2ICsyNjQsOSBAQAogLy8gQ29sb3Igc3BhY2VzLgogdHlwZWRlZiBlbnVtIFdlYlBFbmNDU1AgewogICAvLyBjaHJvbWEgc2FtcGxpbmcKLSAgV0VCUF9ZVVY0MjAgPSAwLCAgIC8vIDQ6MjowCi0gIFdFQlBfWVVWNDIyID0gMSwgICAvLyA0OjI6MgotICBXRUJQX1lVVjQ0NCA9IDIsICAgLy8gNDo0OjQKLSAgV0VCUF9ZVVY0MDAgPSAzLCAgIC8vIGdyYXlzY2FsZQotICBXRUJQX0NTUF9VVl9NQVNLID0gMywgICAvLyBiaXQtbWFzayB0byBnZXQgdGhlIFVWIHNhbXBsaW5nIGZhY3RvcnMKLSAgLy8gYWxwaGEgY2hhbm5lbCB2YXJpYW50cwotICBXRUJQX1lVVjQyMEEgPSA0LAotICBXRUJQX1lVVjQyMkEgPSA1LAotICBXRUJQX1lVVjQ0NEEgPSA2LAotICBXRUJQX1lVVjQwMEEgPSA3LCAgIC8vIGdyYXlzY2FsZSArIGFscGhhCisgIFdFQlBfWVVWNDIwICA9IDAsICAgICAgICAvLyA0OjI6MAorICBXRUJQX1lVVjQyMEEgPSA0LCAgICAgICAgLy8gYWxwaGEgY2hhbm5lbCB2YXJpYW50CisgIFdFQlBfQ1NQX1VWX01BU0sgPSAzLCAgICAvLyBiaXQtbWFzayB0byBnZXQgdGhlIFVWIHNhbXBsaW5nIGZhY3RvcnMKICAgV0VCUF9DU1BfQUxQSEFfQklUID0gNCAgIC8vIGJpdCB0aGF0IGlzIHNldCBpZiBhbHBoYSBpcyBwcmVzZW50CiB9IFdlYlBFbmNDU1A7CiAKQEAgLTMyMiwyMSArMzQ1LDE5IEBACiAKICAgdWludDMyX3QgcGFkM1szXTsgICAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCiAKLSAgLy8gVW51c2VkIGZvciBub3c6IG9yaWdpbmFsIHNhbXBsZXMgKGZvciBub24tWVVWNDIwIG1vZGVzKQotICB1aW50OF90ICp1MCwgKnYwOwotICBpbnQgdXYwX3N0cmlkZTsKLQotICB1aW50MzJfdCBwYWQ0WzddOyAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKKyAgLy8gVW51c2VkIGZvciBub3cKKyAgdWludDhfdCAqcGFkNCwgKnBhZDU7CisgIHVpbnQzMl90IHBhZDZbOF07ICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQogCiAgIC8vIFBSSVZBVEUgRklFTERTCiAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgIHZvaWQqIG1lbW9yeV87ICAgICAgICAgIC8vIHJvdyBjaHVuayBvZiBtZW1vcnkgZm9yIHl1dmEgcGxhbmVzCiAgIHZvaWQqIG1lbW9yeV9hcmdiXzsgICAgIC8vIGFuZCBmb3IgYXJnYiB0b28uCi0gIHZvaWQqIHBhZDVbMl07ICAgICAgICAgIC8vIHBhZGRpbmcgZm9yIGxhdGVyIHVzZQorICB2b2lkKiBwYWQ3WzJdOyAgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKIH07CiAKIC8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW5pdEludGVybmFsKFdlYlBQaWN0dXJlKiwgaW50KTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUluaXRJbnRlcm5hbChXZWJQUGljdHVyZSosIGludCk7CiAKIC8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmUuIFJldHVybnMgZmFsc2UgaW4gY2FzZQogLy8gb2YgdmVyc2lvbiBtaXNtYXRjaC4gV2ViUFBpY3R1cmVJbml0KCkgbXVzdCBoYXZlIHN1Y2NlZWRlZCBiZWZvcmUgdXNpbmcgdGhlCkBAIC0zNTMsMjYgKzM3NCw0MSBAQAogLy8gQWxsb2NhdGUgeS91L3YgYnVmZmVycyBhcyBwZXIgY29sb3JzcGFjZS93aWR0aC9oZWlnaHQgc3BlY2lmaWNhdGlvbi4KIC8vIE5vdGUhIFRoaXMgZnVuY3Rpb24gd2lsbCBmcmVlIHRoZSBwcmV2aW91cyBidWZmZXIgaWYgbmVlZGVkLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVBbGxvYyhXZWJQUGljdHVyZSogcGljdHVyZSk7CiAKIC8vIFJlbGVhc2UgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgV2ViUFBpY3R1cmVBbGxvYygpIG9yIFdlYlBQaWN0dXJlSW1wb3J0KigpLgogLy8gTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBfbm90XyBmcmVlIHRoZSBtZW1vcnkgdXNlZCBieSB0aGUgJ3BpY3R1cmUnCiAvLyBvYmplY3QgaXRzZWxmLgogLy8gQmVzaWRlcyBtZW1vcnkgKHdoaWNoIGlzIHJlY2xhaW1lZCkgYWxsIG90aGVyIGZpZWxkcyBvZiAncGljdHVyZScgYXJlCiAvLyBwcmVzZXJ2ZWQuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworV0VCUF9FWFRFUk4gdm9pZCBXZWJQUGljdHVyZUZyZWUoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBDb3B5IHRoZSBwaXhlbHMgb2YgKnNyYyBpbnRvICpkc3QsIHVzaW5nIFdlYlBQaWN0dXJlQWxsb2MuIFVwb24gcmV0dXJuLCAqZHN0CiAvLyB3aWxsIGZ1bGx5IG93biB0aGUgY29waWVkIHBpeGVscyAodGhpcyBpcyBub3QgYSB2aWV3KS4gVGhlICdkc3QnIHBpY3R1cmUgbmVlZAogLy8gbm90IGJlIGluaXRpYWxpemVkIGFzIGl0cyBjb250ZW50IGlzIG92ZXJ3cml0dGVuLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUNvcHkoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywgV2ViUFBpY3R1cmUqIGRzdCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVDb3B5KGNvbnN0IFdlYlBQaWN0dXJlKiBzcmMsIFdlYlBQaWN0dXJlKiBkc3QpOwogCi0vLyBDb21wdXRlIFBTTlIsIFNTSU0gb3IgTFNJTSBkaXN0b3J0aW9uIG1ldHJpYyBiZXR3ZWVuIHR3byBwaWN0dXJlcy4KLS8vIFJlc3VsdCBpcyBpbiBkQiwgc3RvcmVzIGluIHJlc3VsdFtdIGluIHRoZSBZL1UvVi9BbHBoYS9BbGwgb3JkZXIuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKHNyYyBhbmQgcmVmIGRvbid0IGhhdmUgc2FtZSBkaW1lbnNpb24sIC4uLikKKy8vIENvbXB1dGUgdGhlIHNpbmdsZSBkaXN0b3J0aW9uIGZvciBwYWNrZWQgcGxhbmVzIG9mIHNhbXBsZXMuCisvLyAnc3JjJyB3aWxsIGJlIGNvbXBhcmVkIHRvICdyZWYnLCBhbmQgdGhlIHJhdyBkaXN0b3J0aW9uIHN0b3JlZCBpbnRvCisvLyAnKmRpc3RvcnRpb24nLiBUaGUgcmVmaW5lZCBtZXRyaWMgKGxvZyhNU0UpLCBsb2coMSAtIHNzaW0pLC4uLicgd2lsbCBiZQorLy8gc3RvcmVkIGluICcqcmVzdWx0Jy4KKy8vICd4X3N0ZXAnIGlzIHRoZSBob3Jpem9udGFsIHN0cmlkZSAoaW4gYnl0ZXMpIGJldHdlZW4gc2FtcGxlcy4KKy8vICdzcmMvcmVmX3N0cmlkZScgaXMgdGhlIGJ5dGUgZGlzdGFuY2UgYmV0d2VlbiByb3dzLgorLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChiYWQgcGFyYW1ldGVyLCBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvciwgLi4uKS4KK1dFQlBfRVhURVJOIGludCBXZWJQUGxhbmVEaXN0b3J0aW9uKGNvbnN0IHVpbnQ4X3QqIHNyYywgc2l6ZV90IHNyY19zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiByZWYsIHNpemVfdCByZWZfc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHhfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCAgIC8vIDAgPSBQU05SLCAxID0gU1NJTSwgMiA9IExTSU0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkaXN0b3J0aW9uLCBmbG9hdCogcmVzdWx0KTsKKworLy8gQ29tcHV0ZSBQU05SLCBTU0lNIG9yIExTSU0gZGlzdG9ydGlvbiBtZXRyaWMgYmV0d2VlbiB0d28gcGljdHVyZXMuIFJlc3VsdHMKKy8vIGFyZSBpbiBkQiwgc3RvcmVkIGluIHJlc3VsdFtdIGluIHRoZSBCL0cvUi9BL0FsbCBvcmRlci4gVGhlIGRpc3RvcnRpb24gaXMKKy8vIGFsd2F5cyBwZXJmb3JtZWQgdXNpbmcgQVJHQiBzYW1wbGVzLiBIZW5jZSBpZiB0aGUgaW5wdXQgaXMgWVVWKEEpLCB0aGUKKy8vIHBpY3R1cmUgd2lsbCBiZSBpbnRlcm5hbGx5IGNvbnZlcnRlZCB0byBBUkdCIChqdXN0IGZvciB0aGUgbWVhc3VyZW1lbnQpLgogLy8gV2FybmluZzogdGhpcyBmdW5jdGlvbiBpcyByYXRoZXIgQ1BVLWludGVuc2l2ZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVEaXN0b3J0aW9uKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlRGlzdG9ydGlvbigKICAgICBjb25zdCBXZWJQUGljdHVyZSogc3JjLCBjb25zdCBXZWJQUGljdHVyZSogcmVmLAogICAgIGludCBtZXRyaWNfdHlwZSwgICAgICAgICAgIC8vIDAgPSBQU05SLCAxID0gU1NJTSwgMiA9IExTSU0KICAgICBmbG9hdCByZXN1bHRbNV0pOwpAQCAtMzg1LDggKzQyMSw4IEBACiAvLyBtdXN0IGJlIGZ1bGx5IGJlIGNvbXByaXNlZCBpbnNpZGUgdGhlICdzcmMnIHNvdXJjZSBwaWN0dXJlLiBJZiB0aGUgc291cmNlCiAvLyBwaWN0dXJlIHVzZXMgdGhlIFlVVjQyMCBjb2xvcnNwYWNlLCB0aGUgdG9wIGFuZCBsZWZ0IGNvb3JkaW5hdGVzIHdpbGwgYmUKIC8vIHNuYXBwZWQgdG8gZXZlbiB2YWx1ZXMuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQ3JvcChXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKIC8vIEV4dHJhY3RzIGEgdmlldyBmcm9tICdzcmMnIHBpY3R1cmUgaW50byAnZHN0Jy4gVGhlIHJlY3RhbmdsZSBmb3IgdGhlIHZpZXcKIC8vIGlzIGRlZmluZWQgYnkgdGhlIHRvcC1sZWZ0IGNvcm5lciBwaXhlbCBjb29yZGluYXRlcyAobGVmdCwgdG9wKSBhcyB3ZWxsCkBAIC0zOTksNjcgKzQzNSw5MSBAQAogLy8gd2l0aCBXZWJQUGljdHVyZUluaXQoKSBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSAnc3JjJywgc2luY2UgaXRzIGNvbnRlbnQgd2lsbAogLy8gYmUgb3ZlcndyaXR0ZW4uCiAvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3Igb3IgaW52YWxpZCBwYXJhbWV0ZXJzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQUGljdHVyZSogZHN0KTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZVZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlZnQsIGludCB0b3AsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUFBpY3R1cmUqIGRzdCk7CiAKIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgJ3BpY3R1cmUnIGlzIGFjdHVhbGx5IGEgdmlldyBhbmQgdGhlcmVmb3JlIGRvZXMKIC8vIG5vdCBvd24gdGhlIG1lbW9yeSBmb3IgcGl4ZWxzLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUlzVmlldyhjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVJc1ZpZXcoY29uc3QgV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBSZXNjYWxlIGEgcGljdHVyZSB0byBuZXcgZGltZW5zaW9uIHdpZHRoIHggaGVpZ2h0LgotLy8gTm93IGdhbW1hIGNvcnJlY3Rpb24gaXMgYXBwbGllZC4KKy8vIElmIGVpdGhlciAnd2lkdGgnIG9yICdoZWlnaHQnIChidXQgbm90IGJvdGgpIGlzIDAgdGhlIGNvcnJlc3BvbmRpbmcKKy8vIGRpbWVuc2lvbiB3aWxsIGJlIGNhbGN1bGF0ZWQgcHJlc2VydmluZyB0aGUgYXNwZWN0IHJhdGlvLgorLy8gTm8gZ2FtbWEgY29ycmVjdGlvbiBpcyBhcHBsaWVkLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChpbnZhbGlkIHBhcmFtZXRlciBvciBpbnN1ZmZpY2llbnQgbWVtb3J5KS4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVSZXNjYWxlKFdlYlBQaWN0dXJlKiBwaWMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVSZXNjYWxlKFdlYlBQaWN0dXJlKiBwaWMsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CiAKIC8vIENvbG9yc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbiB0byBpbXBvcnQgUkdCIHNhbXBsZXMuCiAvLyBQcmV2aW91cyBidWZmZXIgd2lsbCBiZSBmcmVlJ2QsIGlmIGFueS4KIC8vICpyZ2IgYnVmZmVyIHNob3VsZCBoYXZlIGEgc2l6ZSBvZiBhdCBsZWFzdCBoZWlnaHQgKiByZ2Jfc3RyaWRlLgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRSR0IoCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0IoCiAgICAgV2ViUFBpY3R1cmUqIHBpY3R1cmUsIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50IHJnYl9zdHJpZGUpOwogLy8gU2FtZSwgYnV0IGZvciBSR0JBIGJ1ZmZlci4KLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRSR0JBKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0UkdCQSgKICAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogcmdiYSwgaW50IHJnYmFfc3RyaWRlKTsKIC8vIFNhbWUsIGJ1dCBmb3IgUkdCQSBidWZmZXIuIEltcG9ydHMgdGhlIFJHQiBkaXJlY3QgZnJvbSB0aGUgMzItYml0IGZvcm1hdAogLy8gaW5wdXQgYnVmZmVyIGlnbm9yaW5nIHRoZSBhbHBoYSBjaGFubmVsLiBBdm9pZHMgbmVlZGluZyB0byBjb3B5IHRoZSBkYXRhCiAvLyB0byBhIHRlbXBvcmFyeSAyNC1iaXQgUkdCIGJ1ZmZlciB0byBpbXBvcnQgdGhlIFJHQiBvbmx5LgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUltcG9ydFJHQlgoCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVJbXBvcnRSR0JYKAogICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiByZ2J4LCBpbnQgcmdieF9zdHJpZGUpOwogCiAvLyBWYXJpYW50cyBvZiB0aGUgYWJvdmUsIGJ1dCB0YWtpbmcgQkdSKEF8WCkgaW5wdXQuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSW1wb3J0QkdSKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSKAogICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBjb25zdCB1aW50OF90KiBiZ3IsIGludCBiZ3Jfc3RyaWRlKTsKLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRCR1JBKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSQSgKICAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogYmdyYSwgaW50IGJncmFfc3RyaWRlKTsKLVdFQlBfRVhURVJOKGludCkgV2ViUFBpY3R1cmVJbXBvcnRCR1JYKAorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlSW1wb3J0QkdSWCgKICAgICBXZWJQUGljdHVyZSogcGljdHVyZSwgY29uc3QgdWludDhfdCogYmdyeCwgaW50IGJncnhfc3RyaWRlKTsKIAotLy8gQ29udmVydHMgcGljdHVyZS0+YXJnYiBkYXRhIHRvIHRoZSBZVVZBIGZvcm1hdCBzcGVjaWZpZWQgYnkgJ2NvbG9yc3BhY2UnLgorLy8gQ29udmVydHMgcGljdHVyZS0+YXJnYiBkYXRhIHRvIHRoZSBZVVY0MjBBIGZvcm1hdC4gVGhlICdjb2xvcnNwYWNlJworLy8gcGFyYW1ldGVyIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSBlcXVhbCB0byBXRUJQX1lVVjQyMC4KIC8vIFVwb24gcmV0dXJuLCBwaWN0dXJlLT51c2VfYXJnYiBpcyBzZXQgdG8gZmFsc2UuIFRoZSBwcmVzZW5jZSBvZiByZWFsCiAvLyBub24tb3BhcXVlIHRyYW5zcGFyZW50IHZhbHVlcyBpcyBkZXRlY3RlZCwgYW5kICdjb2xvcnNwYWNlJyB3aWxsIGJlCiAvLyBhZGp1c3RlZCBhY2NvcmRpbmdseS4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGxvc3N5LgogLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQUGljdHVyZUFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UpOworV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY0NTUCAvKmNvbG9yc3BhY2UgPSBXRUJQX1lVVjQyMCovKTsKKworLy8gU2FtZSBhcyBXZWJQUGljdHVyZUFSR0JUb1lVVkEoKSwgYnV0IHRoZSBjb252ZXJzaW9uIGlzIGRvbmUgdXNpbmcKKy8vIHBzZXVkby1yYW5kb20gZGl0aGVyaW5nIHdpdGggYSBzdHJlbmd0aCAnZGl0aGVyaW5nJyBiZXR3ZWVuCisvLyAwLjAgKG5vIGRpdGhlcmluZykgYW5kIDEuMCAobWF4aW11bSBkaXRoZXJpbmcpLiBUaGlzIGlzIHVzZWZ1bAorLy8gZm9yIHBob3RvZ3JhcGhpYyBwaWN0dXJlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBQaWN0dXJlQVJHQlRvWVVWQURpdGhlcmVkKAorICAgIFdlYlBQaWN0dXJlKiBwaWN0dXJlLCBXZWJQRW5jQ1NQIGNvbG9yc3BhY2UsIGZsb2F0IGRpdGhlcmluZyk7CisKKy8vIFBlcmZvcm1zICdzaGFycCcgUkdCQS0+WVVWQTQyMCBkb3duc2FtcGxpbmcgYW5kIGNvbG9yc3BhY2UgY29udmVyc2lvbi4KKy8vIERvd25zYW1wbGluZyBpcyBoYW5kbGVkIHdpdGggZXh0cmEgY2FyZSBpbiBjYXNlIG9mIGNvbG9yIGNsaXBwaW5nLiBUaGlzCisvLyBtZXRob2QgaXMgcm91Z2hseSAyeCBzbG93ZXIgdGhhbiBXZWJQUGljdHVyZUFSR0JUb1lVVkEoKSBidXQgcHJvZHVjZXMgYmV0dGVyCisvLyBhbmQgc2hhcnBlciBZVVYgcmVwcmVzZW50YXRpb24uCisvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVTaGFycEFSR0JUb1lVVkEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOworLy8ga2VwdCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZVNtYXJ0QVJHQlRvWVVWQShXZWJQUGljdHVyZSogcGljdHVyZSk7CiAKIC8vIENvbnZlcnRzIHBpY3R1cmUtPnl1diB0byBwaWN0dXJlLT5hcmdiIGFuZCBzZXRzIHBpY3R1cmUtPnVzZV9hcmdiIHRvIHRydWUuCi0vLyBUaGUgaW5wdXQgZm9ybWF0IG11c3QgYmUgWVVWXzQyMCBvciBZVVZfNDIwQS4KLS8vIE5vdGUgdGhhdCB0aGUgdXNlIG9mIHRoaXMgbWV0aG9kIGlzIGRpc2NvdXJhZ2VkIGlmIG9uZSBoYXMgYWNjZXNzIHRvIHRoZQotLy8gcmF3IEFSR0Igc2FtcGxlcywgc2luY2UgdXNpbmcgWVVWNDIwIGlzIGNvbXBhcmF0aXZlbHkgbG9zc3kuIEFsc28sIHRoZQotLy8gY29udmVyc2lvbiBmcm9tIFlVVjQyMCB0byBBUkdCIGluY3VycyBhIHNtYWxsIGxvc3MgdG9vLgorLy8gVGhlIGlucHV0IGZvcm1hdCBtdXN0IGJlIFlVVl80MjAgb3IgWVVWXzQyMEEuIFRoZSBjb252ZXJzaW9uIGZyb20gWVVWNDIwIHRvCisvLyBBUkdCIGluY3VycyBhIHNtYWxsIGxvc3MgdG9vLgorLy8gTm90ZSB0aGF0IHRoZSB1c2Ugb2YgdGhpcyBjb2xvcnNwYWNlIGlzIGRpc2NvdXJhZ2VkIGlmIG9uZSBoYXMgYWNjZXNzIHRvIHRoZQorLy8gcmF3IEFSR0Igc2FtcGxlcywgc2luY2UgdXNpbmcgWVVWNDIwIGlzIGNvbXBhcmF0aXZlbHkgbG9zc3kuCiAvLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlWVVWQVRvQVJHQihXZWJQUGljdHVyZSogcGljdHVyZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUFBpY3R1cmVZVVZBVG9BUkdCKFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAotLy8gSGVscGVyIGZ1bmN0aW9uOiBnaXZlbiBhIHdpZHRoIHggaGVpZ2h0IHBsYW5lIG9mIFlVVihBKSBzYW1wbGVzCi0vLyAod2l0aCBzdHJpZGUgJ3N0cmlkZScpLCBjbGVhbi11cCB0aGUgWVVWIHNhbXBsZXMgdW5kZXIgZnVsbHkgdHJhbnNwYXJlbnQKLS8vIGFyZWEsIHRvIGhlbHAgY29tcHJlc3NpYmlsaXR5IChubyBndWFyYW50ZWUsIHRob3VnaCkuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQQ2xlYW51cFRyYW5zcGFyZW50QXJlYShXZWJQUGljdHVyZSogcGljdHVyZSk7CisvLyBIZWxwZXIgZnVuY3Rpb246IGdpdmVuIGEgd2lkdGggeCBoZWlnaHQgcGxhbmUgb2YgUkdCQSBvciBZVVYoQSkgc2FtcGxlcworLy8gY2xlYW4tdXAgb3Igc21vb3RoZW4gdGhlIFlVViBvciBSR0Igc2FtcGxlcyB1bmRlciBmdWxseSB0cmFuc3BhcmVudCBhcmVhLAorLy8gdG8gaGVscCBjb21wcmVzc2liaWxpdHkgKG5vIGd1YXJhbnRlZSwgdGhvdWdoKS4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUENsZWFudXBUcmFuc3BhcmVudEFyZWEoV2ViUFBpY3R1cmUqIHBpY3R1cmUpOwogCiAvLyBTY2FuIHRoZSBwaWN0dXJlICdwaWN0dXJlJyBmb3IgdGhlIHByZXNlbmNlIG9mIG5vbiBmdWxseSBvcGFxdWUgYWxwaGEgdmFsdWVzLgogLy8gUmV0dXJucyB0cnVlIGluIHN1Y2ggY2FzZS4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgKGluZGljYXRpbmcgdGhhdCB0aGUKIC8vIGFscGhhIHBsYW5lIGNhbiBiZSBpZ25vcmVkIGFsdG9nZXRoZXIgZS5nLikuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBQaWN0dXJlSGFzVHJhbnNwYXJlbmN5KGNvbnN0IFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKK1dFQlBfRVhURVJOIGludCBXZWJQUGljdHVyZUhhc1RyYW5zcGFyZW5jeShjb25zdCBXZWJQUGljdHVyZSogcGljdHVyZSk7CisKKy8vIFJlbW92ZSB0aGUgdHJhbnNwYXJlbmN5IGluZm9ybWF0aW9uIChpZiBwcmVzZW50KSBieSBibGVuZGluZyB0aGUgY29sb3Igd2l0aAorLy8gdGhlIGJhY2tncm91bmQgY29sb3IgJ2JhY2tncm91bmRfcmdiJyAoc3BlY2lmaWVkIGFzIDI0Yml0IFJHQiB0cmlwbGV0KS4KKy8vIEFmdGVyIHRoaXMgY2FsbCwgYWxsIGFscGhhIHZhbHVlcyBhcmUgcmVzZXQgdG8gMHhmZi4KK1dFQlBfRVhURVJOIHZvaWQgV2ViUEJsZW5kQWxwaGEoV2ViUFBpY3R1cmUqIHBpYywgdWludDMyX3QgYmFja2dyb3VuZF9yZ2IpOwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWFpbiBjYWxsCkBAIC00NzQsMTEgKzUzNCwxMSBAQAogLy8gdGhlIGZvcm1lciBmb3IgbG9zc3kgZW5jb2RpbmcsIGFuZCB0aGUgbGF0dGVyIGZvciBsb3NzbGVzcyBlbmNvZGluZwogLy8gKHdoZW4gY29uZmlnLmxvc3NsZXNzIGlzIHRydWUpLiBBdXRvbWF0aWMgY29udmVyc2lvbiBmcm9tIG9uZSBmb3JtYXQgdG8KIC8vIGFub3RoZXIgaXMgcHJvdmlkZWQgYnV0IHRoZXkgYm90aCBpbmN1ciBzb21lIGxvc3MuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBFbmNvZGUoY29uc3QgV2ViUENvbmZpZyogY29uZmlnLCBXZWJQUGljdHVyZSogcGljdHVyZSk7CitXRUJQX0VYVEVSTiBpbnQgV2ViUEVuY29kZShjb25zdCBXZWJQQ29uZmlnKiBjb25maWcsIFdlYlBQaWN0dXJlKiBwaWN0dXJlKTsKIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKKyNpZmRlZiBfX2NwbHVzcGx1cwogfSAgICAvLyBleHRlcm4gIkMiCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAppbmRleCA0YzA0YjUwLi4zMjlmYzhhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2Zvcm1hdF9jb25zdGFudHMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9mb3JtYXRfY29uc3RhbnRzLmgKQEAgLTE1LDcgKzE1LDcgQEAKICNkZWZpbmUgV0VCUF9XRUJQX0ZPUk1BVF9DT05TVEFOVFNfSF8KIAogLy8gQ3JlYXRlIGZvdXJjYyBvZiB0aGUgY2h1bmsgZnJvbSB0aGUgY2h1bmsgdGFnIGNoYXJhY3RlcnMuCi0jZGVmaW5lIE1LRk9VUkNDKGEsIGIsIGMsIGQpICgodWludDMyX3QpKGEpIHwgKGIpIDw8IDggfCAoYykgPDwgMTYgfCAoZCkgPDwgMjQpCisjZGVmaW5lIE1LRk9VUkNDKGEsIGIsIGMsIGQpICgoYSkgfCAoYikgPDwgOCB8IChjKSA8PCAxNiB8ICh1aW50MzJfdCkoZCkgPDwgMjQpCiAKIC8vIFZQOCByZWxhdGVkIGNvbnN0YW50cy4KICNkZWZpbmUgVlA4X1NJR05BVFVSRSAweDlkMDEyYSAgICAgICAgICAgICAgLy8gU2lnbmF0dXJlIGluIFZQOCBkYXRhLgpAQCAtNzIsMTQgKzcyLDEzIEBACiAjZGVmaW5lIFJJRkZfSEVBREVSX1NJWkUgICAxMiAgICAvLyBTaXplIG9mIHRoZSBSSUZGIGhlYWRlciAoIlJJRkZubm5uV0VCUCIpLgogI2RlZmluZSBBTk1GX0NIVU5LX1NJWkUgICAgMTYgICAgLy8gU2l6ZSBvZiBhbiBBTk1GIGNodW5rLgogI2RlZmluZSBBTklNX0NIVU5LX1NJWkUgICAgNiAgICAgLy8gU2l6ZSBvZiBhbiBBTklNIGNodW5rLgotI2RlZmluZSBGUkdNX0NIVU5LX1NJWkUgICAgNiAgICAgLy8gU2l6ZSBvZiBhIEZSR00gY2h1bmsuCiAjZGVmaW5lIFZQOFhfQ0hVTktfU0laRSAgICAxMCAgICAvLyBTaXplIG9mIGEgVlA4WCBjaHVuay4KIAogI2RlZmluZSBNQVhfQ0FOVkFTX1NJWkUgICAgICgxIDw8IDI0KSAgICAgLy8gMjQtYml0IG1heCBmb3IgVlA4WCB3aWR0aC9oZWlnaHQuCiAjZGVmaW5lIE1BWF9JTUFHRV9BUkVBICAgICAgKDFVTEwgPDwgMzIpICAvLyAzMi1iaXQgbWF4IGZvciB3aWR0aCB4IGhlaWdodC4KICNkZWZpbmUgTUFYX0xPT1BfQ09VTlQgICAgICAoMSA8PCAxNikgICAgIC8vIG1heGltdW0gdmFsdWUgZm9yIGxvb3AtY291bnQKICNkZWZpbmUgTUFYX0RVUkFUSU9OICAgICAgICAoMSA8PCAyNCkgICAgIC8vIG1heGltdW0gZHVyYXRpb24KLSNkZWZpbmUgTUFYX1BPU0lUSU9OX09GRlNFVCAoMSA8PCAyNCkgICAgIC8vIG1heGltdW0gZnJhbWUvZnJhZ21lbnQgeC95IG9mZnNldAorI2RlZmluZSBNQVhfUE9TSVRJT05fT0ZGU0VUICgxIDw8IDI0KSAgICAgLy8gbWF4aW11bSBmcmFtZSB4L3kgb2Zmc2V0CiAKIC8vIE1heGltdW0gY2h1bmsgcGF5bG9hZCBpcyBzdWNoIHRoYXQgYWRkaW5nIHRoZSBoZWFkZXIgYW5kIHBhZGRpbmcgd29uJ3QKIC8vIG92ZXJmbG93IGEgdWludDMyX3QuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXguaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3NyYy93ZWJwL211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YmI0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXguaApAQCAtMCwwICsxLDUzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCisvLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKKy8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKKy8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQorLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICBSSUZGIGNvbnRhaW5lciBtYW5pcHVsYXRpb24gYW5kIGVuY29kaW5nIGZvciBXZWJQIGltYWdlcy4KKy8vCisvLyBBdXRob3JzOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQorLy8gICAgICAgICAgVmlrYXMgKHZpa2FzYUBnb29nbGUuY29tKQorCisjaWZuZGVmIFdFQlBfV0VCUF9NVVhfSF8KKyNkZWZpbmUgV0VCUF9XRUJQX01VWF9IXworCisjaW5jbHVkZSAiLi9tdXhfdHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIFdFQlBfTVVYX0FCSV9WRVJTSU9OIDB4MDEwOCAgICAgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXggQVBJCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIG1hbmlwdWxhdGlvbiBvZiBXZWJQIGNvbnRhaW5lciBpbWFnZXMgY29udGFpbmluZyBmZWF0dXJlcworLy8gbGlrZSBjb2xvciBwcm9maWxlLCBtZXRhZGF0YSwgYW5pbWF0aW9uLgorLy8KKy8vIENvZGUgRXhhbXBsZSMxOiBDcmVhdGUgYSBXZWJQTXV4IG9iamVjdCB3aXRoIGltYWdlIGRhdGEsIGNvbG9yIHByb2ZpbGUgYW5kCisvLyBYTVAgbWV0YWRhdGEuCisvKgorICBpbnQgY29weV9kYXRhID0gMDsKKyAgV2ViUE11eCogbXV4ID0gV2ViUE11eE5ldygpOworICAvLyAuLi4gKFByZXBhcmUgaW1hZ2UgZGF0YSkuCisgIFdlYlBNdXhTZXRJbWFnZShtdXgsICZpbWFnZSwgY29weV9kYXRhKTsKKyAgLy8gLi4uIChQcmVwYXJlIElDQ1AgY29sb3IgcHJvZmlsZSBkYXRhKS4KKyAgV2ViUE11eFNldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUsIGNvcHlfZGF0YSk7CisgIC8vIC4uLiAoUHJlcGFyZSBYTVAgbWV0YWRhdGEpLgorICBXZWJQTXV4U2V0Q2h1bmsobXV4LCAiWE1QICIsICZ4bXAsIGNvcHlfZGF0YSk7CisgIC8vIEdldCBkYXRhIGZyb20gbXV4IGluIFdlYlAgUklGRiBmb3JtYXQuCisgIFdlYlBNdXhBc3NlbWJsZShtdXgsICZvdXRwdXRfZGF0YSk7CisgIFdlYlBNdXhEZWxldGUobXV4KTsKKyAgLy8gLi4uIChDb25zdW1lIG91dHB1dF9kYXRhOyBlLmcuIHdyaXRlIG91dHB1dF9kYXRhLmJ5dGVzIHRvIGZpbGUpLgorICBXZWJQRGF0YUNsZWFyKCZvdXRwdXRfZGF0YSk7CisqLworCisvLyBDb2RlIEV4YW1wbGUjMjogR2V0IGltYWdlIGFuZCBjb2xvciBwcm9maWxlIGRhdGEgZnJvbSBhIFdlYlAgZmlsZS4KKy8qCisgIGludCBjb3B5X2RhdGEgPSAwOworICAvLyAuLi4gKFJlYWQgZGF0YSBmcm9tIGZpbGUpLgorICBXZWJQTXV4KiBtdXggPSBXZWJQTXV4Q3JlYXRlKCZkYXRhLCBjb3B5X2RhdGEpOworICBXZWJQTXV4R2V0RnJhbWUobXV4LCAxLCAmaW1hZ2UpOworICAvLyAuLi4gKENvbnN1bWUgaW1hZ2U7IGUuZy4gY2FsbCBXZWJQRGVjb2RlKCkgdG8gZGVjb2RlIHRoZSBkYXRhKS4KKyAgV2ViUE11eEdldENodW5rKG11eCwgIklDQ1AiLCAmaWNjX3Byb2ZpbGUpOworICAvLyAuLi4gKENvbnN1bWUgaWNjX2RhdGEpLgorICBXZWJQTXV4RGVsZXRlKG11eCk7CisgIGZyZWUoZGF0YSk7CisqLworCisvLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAorLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KKy8vIHR5cGVkZWYgZW51bSBXZWJQTXV4RXJyb3IgV2ViUE11eEVycm9yOworLy8gdHlwZWRlZiBlbnVtIFdlYlBDaHVua0lkIFdlYlBDaHVua0lkOwordHlwZWRlZiBzdHJ1Y3QgV2ViUE11eCBXZWJQTXV4OyAgIC8vIG1haW4gb3BhcXVlIG9iamVjdC4KK3R5cGVkZWYgc3RydWN0IFdlYlBNdXhGcmFtZUluZm8gV2ViUE11eEZyYW1lSW5mbzsKK3R5cGVkZWYgc3RydWN0IFdlYlBNdXhBbmltUGFyYW1zIFdlYlBNdXhBbmltUGFyYW1zOwordHlwZWRlZiBzdHJ1Y3QgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBXZWJQQW5pbUVuY29kZXJPcHRpb25zOworCisvLyBFcnJvciBjb2RlcwordHlwZWRlZiBlbnVtIFdlYlBNdXhFcnJvciB7CisgIFdFQlBfTVVYX09LICAgICAgICAgICAgICAgICA9ICAxLAorICBXRUJQX01VWF9OT1RfRk9VTkQgICAgICAgICAgPSAgMCwKKyAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAgID0gLTEsCisgIFdFQlBfTVVYX0JBRF9EQVRBICAgICAgICAgICA9IC0yLAorICBXRUJQX01VWF9NRU1PUllfRVJST1IgICAgICAgPSAtMywKKyAgV0VCUF9NVVhfTk9UX0VOT1VHSF9EQVRBICAgID0gLTQKK30gV2ViUE11eEVycm9yOworCisvLyBJRHMgZm9yIGRpZmZlcmVudCB0eXBlcyBvZiBjaHVua3MuCit0eXBlZGVmIGVudW0gV2ViUENodW5rSWQgeworICBXRUJQX0NIVU5LX1ZQOFgsICAgICAgICAvLyBWUDhYCisgIFdFQlBfQ0hVTktfSUNDUCwgICAgICAgIC8vIElDQ1AKKyAgV0VCUF9DSFVOS19BTklNLCAgICAgICAgLy8gQU5JTQorICBXRUJQX0NIVU5LX0FOTUYsICAgICAgICAvLyBBTk1GCisgIFdFQlBfQ0hVTktfREVQUkVDQVRFRCwgIC8vIChkZXByZWNhdGVkIGZyb20gRlJHTSkKKyAgV0VCUF9DSFVOS19BTFBIQSwgICAgICAgLy8gQUxQSAorICBXRUJQX0NIVU5LX0lNQUdFLCAgICAgICAvLyBWUDgvVlA4TAorICBXRUJQX0NIVU5LX0VYSUYsICAgICAgICAvLyBFWElGCisgIFdFQlBfQ0hVTktfWE1QLCAgICAgICAgIC8vIFhNUAorICBXRUJQX0NIVU5LX1VOS05PV04sICAgICAvLyBPdGhlciBjaHVua3MuCisgIFdFQlBfQ0hVTktfTklMCit9IFdlYlBDaHVua0lkOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgbXV4IGxpYnJhcnksIHBhY2tlZCBpbiBoZXhhZGVjaW1hbCB1c2luZworLy8gOGJpdHMgZm9yIGVhY2ggb2YgbWFqb3IvbWlub3IvcmV2aXNpb24uIEUuZzogdjIuNS43IGlzIDB4MDIwNTA3LgorV0VCUF9FWFRFUk4gaW50IFdlYlBHZXRNdXhWZXJzaW9uKHZvaWQpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTGlmZSBvZiBhIE11eCBvYmplY3QKKworLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKK1dFQlBfRVhURVJOIFdlYlBNdXgqIFdlYlBOZXdJbnRlcm5hbChpbnQpOworCisvLyBDcmVhdGVzIGFuIGVtcHR5IG11eCBvYmplY3QuCisvLyBSZXR1cm5zOgorLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZW1wdHkgbXV4IG9iamVjdC4KKy8vICAgT3IgTlVMTCBpbiBjYXNlIG9mIG1lbW9yeSBlcnJvci4KK3N0YXRpYyBXRUJQX0lOTElORSBXZWJQTXV4KiBXZWJQTXV4TmV3KHZvaWQpIHsKKyAgcmV0dXJuIFdlYlBOZXdJbnRlcm5hbChXRUJQX01VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vIERlbGV0ZXMgdGhlIG11eCBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gYmUgZGVsZXRlZAorV0VCUF9FWFRFUk4gdm9pZCBXZWJQTXV4RGVsZXRlKFdlYlBNdXgqIG11eCk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNdXggY3JlYXRpb24uCisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50CitXRUJQX0VYVEVSTiBXZWJQTXV4KiBXZWJQTXV4Q3JlYXRlSW50ZXJuYWwoY29uc3QgV2ViUERhdGEqLCBpbnQsIGludCk7CisKKy8vIENyZWF0ZXMgYSBtdXggb2JqZWN0IGZyb20gcmF3IGRhdGEgZ2l2ZW4gaW4gV2ViUCBSSUZGIGZvcm1hdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGJpdHN0cmVhbSAtIChpbikgdGhlIGJpdHN0cmVhbSBkYXRhIGluIFdlYlAgUklGRiBmb3JtYXQKKy8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKKy8vICAgICAgICAgICAgICAgb2JqZWN0IGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KKy8vIFJldHVybnM6CisvLyAgIEEgcG9pbnRlciB0byB0aGUgbXV4IG9iamVjdCBjcmVhdGVkIGZyb20gZ2l2ZW4gZGF0YSAtIG9uIHN1Y2Nlc3MuCisvLyAgIE5VTEwgLSBJbiBjYXNlIG9mIGludmFsaWQgZGF0YSBvciBtZW1vcnkgZXJyb3IuCitzdGF0aWMgV0VCUF9JTkxJTkUgV2ViUE11eCogV2ViUE11eENyZWF0ZShjb25zdCBXZWJQRGF0YSogYml0c3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSkgeworICByZXR1cm4gV2ViUE11eENyZWF0ZUludGVybmFsKGJpdHN0cmVhbSwgY29weV9kYXRhLCBXRUJQX01VWF9BQklfVkVSU0lPTik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOb24taW1hZ2UgY2h1bmtzLgorCisvLyBOb3RlOiBPbmx5IG5vbi1pbWFnZSByZWxhdGVkIGNodW5rcyBzaG91bGQgYmUgbWFuYWdlZCB0aHJvdWdoIGNodW5rIEFQSXMuCisvLyAoSW1hZ2UgcmVsYXRlZCBjaHVua3MgYXJlOiAiQU5NRiIsICJWUDggIiwgIlZQOEwiIGFuZCAiQUxQSCIpLgorLy8gVG8gYWRkLCBnZXQgYW5kIGRlbGV0ZSBpbWFnZXMsIHVzZSBXZWJQTXV4U2V0SW1hZ2UoKSwgV2ViUE11eFB1c2hGcmFtZSgpLAorLy8gV2ViUE11eEdldEZyYW1lKCkgYW5kIFdlYlBNdXhEZWxldGVGcmFtZSgpLgorCisvLyBBZGRzIGEgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBhbmQgZGF0YSAnY2h1bmtfZGF0YScgaW4gdGhlIG11eCBvYmplY3QuCisvLyBBbnkgZXhpc3RpbmcgY2h1bmsocykgd2l0aCB0aGUgc2FtZSBpZCB3aWxsIGJlIHJlbW92ZWQuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gd2hpY2ggdGhlIGNodW5rIGlzIHRvIGJlIGFkZGVkCisvLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBnaXZlbiBjaHVuazsKKy8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KKy8vICAgY2h1bmtfZGF0YSAtIChpbikgdGhlIGNodW5rIGRhdGEgdG8gYmUgYWRkZWQKKy8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKKy8vICAgICAgICAgICAgICAgb2JqZWN0IGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXgsIGZvdXJjYyBvciBjaHVua19kYXRhIGlzIE5VTEwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGZvdXJjYyBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSBjaHVuay4KKy8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4U2V0Q2h1bmsoCisgICAgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwgY29uc3QgV2ViUERhdGEqIGNodW5rX2RhdGEsCisgICAgaW50IGNvcHlfZGF0YSk7CisKKy8vIEdldHMgYSByZWZlcmVuY2UgdG8gdGhlIGRhdGEgb2YgdGhlIGNodW5rIHdpdGggaWQgJ2ZvdXJjYycgaW4gdGhlIG11eCBvYmplY3QuCisvLyBUaGUgY2FsbGVyIHNob3VsZCBOT1QgZnJlZSB0aGUgcmV0dXJuZWQgZGF0YS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGNodW5rIGRhdGEgaXMgdG8gYmUgZmV0Y2hlZAorLy8gICBmb3VyY2MgLSAoaW4pIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bms7CisvLyAgICAgICAgICAgICAgICAgZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiBldGMuCisvLyAgIGNodW5rX2RhdGEgLSAob3V0KSByZXR1cm5lZCBjaHVuayBkYXRhCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCisvLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIElmIG11eCBkb2VzIG5vdCBjb250YWluIGEgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gaWQuCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4R2V0Q2h1bmsoCisgICAgY29uc3QgV2ViUE11eCogbXV4LCBjb25zdCBjaGFyIGZvdXJjY1s0XSwgV2ViUERhdGEqIGNodW5rX2RhdGEpOworCisvLyBEZWxldGVzIHRoZSBjaHVuayB3aXRoIHRoZSBnaXZlbiAnZm91cmNjJyBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGNodW5rIGlzIHRvIGJlIGRlbGV0ZWQKKy8vICAgZm91cmNjIC0gKGluKSBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGNodW5rOworLy8gICAgICAgICAgICAgICAgIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIgZXRjLgorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmb3VyY2MgaXMgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgZm91cmNjIGNvcnJlc3BvbmRzIHRvIGFuIGltYWdlIGNodW5rLgorLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiBtdXggZG9lcyBub3QgY29udGFpbiBhIGNodW5rIHdpdGggdGhlIGdpdmVuIGZvdXJjYy4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhEZWxldGVDaHVuaygKKyAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEltYWdlcy4KKworLy8gRW5jYXBzdWxhdGVzIGRhdGEgYWJvdXQgYSBzaW5nbGUgZnJhbWUuCitzdHJ1Y3QgV2ViUE11eEZyYW1lSW5mbyB7CisgIFdlYlBEYXRhICAgIGJpdHN0cmVhbTsgIC8vIGltYWdlIGRhdGE6IGNhbiBiZSBhIHJhdyBWUDgvVlA4TCBiaXRzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBzaW5nbGUtaW1hZ2UgV2ViUCBmaWxlLgorICBpbnQgICAgICAgICB4X29mZnNldDsgICAvLyB4LW9mZnNldCBvZiB0aGUgZnJhbWUuCisgIGludCAgICAgICAgIHlfb2Zmc2V0OyAgIC8vIHktb2Zmc2V0IG9mIHRoZSBmcmFtZS4KKyAgaW50ICAgICAgICAgZHVyYXRpb247ICAgLy8gZHVyYXRpb24gb2YgdGhlIGZyYW1lIChpbiBtaWxsaXNlY29uZHMpLgorCisgIFdlYlBDaHVua0lkIGlkOyAgICAgICAgIC8vIGZyYW1lIHR5cGU6IHNob3VsZCBiZSBvbmUgb2YgV0VCUF9DSFVOS19BTk1GCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIFdFQlBfQ0hVTktfSU1BR0UKKyAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kOyAgLy8gRGlzcG9zYWwgbWV0aG9kIGZvciB0aGUgZnJhbWUuCisgIFdlYlBNdXhBbmltQmxlbmQgICBibGVuZF9tZXRob2Q7ICAgIC8vIEJsZW5kIG9wZXJhdGlvbiBmb3IgdGhlIGZyYW1lLgorICB1aW50MzJfdCAgICBwYWRbMV07ICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKK307CisKKy8vIFNldHMgdGhlIChub24tYW5pbWF0ZWQpIGltYWdlIGluIHRoZSBtdXggb2JqZWN0LgorLy8gTm90ZTogQW55IGV4aXN0aW5nIGltYWdlcyAoaW5jbHVkaW5nIGZyYW1lcykgd2lsbCBiZSByZW1vdmVkLgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGluIHdoaWNoIHRoZSBpbWFnZSBpcyB0byBiZSBzZXQKKy8vICAgYml0c3RyZWFtIC0gKGluKSBjYW4gYmUgYSByYXcgVlA4L1ZQOEwgYml0c3RyZWFtIG9yIGEgc2luZ2xlLWltYWdlCisvLyAgICAgICAgICAgICAgIFdlYlAgZmlsZSAobm9uLWFuaW1hdGVkKQorLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAorLy8gICAgICAgICAgICAgICBvYmplY3QgYW5kIHZhbHVlIDAgaW5kaWNhdGVzIGRhdGEgd2lsbCBOT1QgYmUgY29waWVkLgorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMIG9yIGJpdHN0cmVhbSBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhTZXRJbWFnZSgKKyAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBEYXRhKiBiaXRzdHJlYW0sIGludCBjb3B5X2RhdGEpOworCisvLyBBZGRzIGEgZnJhbWUgYXQgdGhlIGVuZCBvZiB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGVzOiAoMSkgZnJhbWUuaWQgc2hvdWxkIGJlIFdFQlBfQ0hVTktfQU5NRgorLy8gICAgICAgICgyKSBGb3Igc2V0dGluZyBhIG5vbi1hbmltYXRlZCBpbWFnZSwgdXNlIFdlYlBNdXhTZXRJbWFnZSgpIGluc3RlYWQuCisvLyAgICAgICAgKDMpIFR5cGUgb2YgZnJhbWUgYmVpbmcgcHVzaGVkIG11c3QgYmUgc2FtZSBhcyB0aGUgZnJhbWVzIGluIG11eC4KKy8vICAgICAgICAoNCkgQXMgV2ViUCBvbmx5IHN1cHBvcnRzIGV2ZW4gb2Zmc2V0cywgYW55IG9kZCBvZmZzZXQgd2lsbCBiZSBzbmFwcGVkCisvLyAgICAgICAgICAgIHRvIGFuIGV2ZW4gbG9jYXRpb24gdXNpbmc6IG9mZnNldCAmPSB+MQorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IHRvIHdoaWNoIHRoZSBmcmFtZSBpcyB0byBiZSBhZGRlZAorLy8gICBmcmFtZSAtIChpbikgZnJhbWUgZGF0YS4KKy8vICAgY29weV9kYXRhIC0gKGluKSB2YWx1ZSAxIGluZGljYXRlcyBnaXZlbiBkYXRhIFdJTEwgYmUgY29waWVkIHRvIHRoZSBtdXgKKy8vICAgICAgICAgICAgICAgb2JqZWN0IGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZnJhbWUgaXMgTlVMTAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgY29udGVudCBvZiAnZnJhbWUnIGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eFB1c2hGcmFtZSgKKyAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBNdXhGcmFtZUluZm8qIGZyYW1lLCBpbnQgY29weV9kYXRhKTsKKworLy8gR2V0cyB0aGUgbnRoIGZyYW1lIGZyb20gdGhlIG11eCBvYmplY3QuCisvLyBUaGUgY29udGVudCBvZiAnZnJhbWUtPmJpdHN0cmVhbScgaXMgYWxsb2NhdGVkIHVzaW5nIG1hbGxvYygpLCBhbmQgTk9UCisvLyBvd25lZCBieSB0aGUgJ211eCcgb2JqZWN0LiBJdCBNVVNUIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIgYnkgY2FsbGluZworLy8gV2ViUERhdGFDbGVhcigpLgorLy8gbnRoPTAgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIC0gbGFzdCBwb3NpdGlvbi4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGluZm8gaXMgdG8gYmUgZmV0Y2hlZAorLy8gICBudGggLSAoaW4pIGluZGV4IG9mIHRoZSBmcmFtZSBpbiB0aGUgbXV4IG9iamVjdAorLy8gICBmcmFtZSAtIChvdXQpIGRhdGEgb2YgdGhlIHJldHVybmVkIGZyYW1lCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IG9yIGZyYW1lIGlzIE5VTEwuCisvLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIGlmIHRoZXJlIGFyZSBsZXNzIHRoYW4gbnRoIGZyYW1lcyBpbiB0aGUgbXV4IG9iamVjdC4KKy8vICAgV0VCUF9NVVhfQkFEX0RBVEEgLSBpZiBudGggZnJhbWUgY2h1bmsgaW4gbXV4IGlzIGludmFsaWQuCisvLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eEdldEZyYW1lKAorICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgdWludDMyX3QgbnRoLCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSk7CisKKy8vIERlbGV0ZXMgYSBmcmFtZSBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gbnRoPTAgaGFzIGEgc3BlY2lhbCBtZWFuaW5nIC0gbGFzdCBwb3NpdGlvbi4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIGEgZnJhbWUgaXMgdG8gYmUgZGVsZXRlZAorLy8gICBudGggLSAoaW4pIFRoZSBwb3NpdGlvbiBmcm9tIHdoaWNoIHRoZSBmcmFtZSBpcyB0byBiZSBkZWxldGVkCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IGlzIE5VTEwuCisvLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIElmIHRoZXJlIGFyZSBsZXNzIHRoYW4gbnRoIGZyYW1lcyBpbiB0aGUgbXV4IG9iamVjdAorLy8gICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgZGVsZXRpb24uCisvLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIFdlYlBNdXhFcnJvciBXZWJQTXV4RGVsZXRlRnJhbWUoV2ViUE11eCogbXV4LCB1aW50MzJfdCBudGgpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQW5pbWF0aW9uLgorCisvLyBBbmltYXRpb24gcGFyYW1ldGVycy4KK3N0cnVjdCBXZWJQTXV4QW5pbVBhcmFtcyB7CisgIHVpbnQzMl90IGJnY29sb3I7ICAvLyBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBjYW52YXMgc3RvcmVkIChpbiBNU0Igb3JkZXIpIGFzOgorICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAwMCB0byAwNzogQWxwaGEuCisgICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDA4IHRvIDE1OiBSZWQuCisgICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDE2IHRvIDIzOiBHcmVlbi4KKyAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMjQgdG8gMzE6IEJsdWUuCisgIGludCBsb29wX2NvdW50OyAgICAvLyBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHRoZSBhbmltYXRpb24gWzAgPSBpbmZpbml0ZV0uCit9OworCisvLyBTZXRzIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycyBpbiB0aGUgbXV4IG9iamVjdC4gQW55IGV4aXN0aW5nIEFOSU0gY2h1bmtzCisvLyB3aWxsIGJlIHJlbW92ZWQuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgaW4gd2hpY2ggQU5JTSBjaHVuayBpcyB0byBiZSBzZXQvYWRkZWQKKy8vICAgcGFyYW1zIC0gKGluKSBhbmltYXRpb24gcGFyYW1ldGVycy4KKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgcGFyYW1zIGlzIE5VTEwuCisvLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcygKKyAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpOworCisvLyBHZXRzIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBtdXggb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgdG8gYmUgZmV0Y2hlZAorLy8gICBwYXJhbXMgLSAob3V0KSBhbmltYXRpb24gcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgQU5JTSBjaHVuaworLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBwYXJhbXMgaXMgTlVMTC4KKy8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gaWYgQU5JTSBjaHVuayBpcyBub3QgcHJlc2VudCBpbiBtdXggb2JqZWN0LgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eEdldEFuaW1hdGlvblBhcmFtcygKKyAgICBjb25zdCBXZWJQTXV4KiBtdXgsIFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTWlzYyBVdGlsaXRpZXMuCisKKy8vIFNldHMgdGhlIGNhbnZhcyBzaXplIGZvciB0aGUgbXV4IG9iamVjdC4gVGhlIHdpZHRoIGFuZCBoZWlnaHQgY2FuIGJlCisvLyBzcGVjaWZpZWQgZXhwbGljaXRseSBvciBsZWZ0IGFzIHplcm8gKDAsIDApLgorLy8gKiBXaGVuIHdpZHRoIGFuZCBoZWlnaHQgYXJlIHNwZWNpZmllZCBleHBsaWNpdGx5LCB0aGVuIHRoaXMgZnJhbWUgYm91bmQgaXMKKy8vICAgZW5mb3JjZWQgZHVyaW5nIHN1YnNlcXVlbnQgY2FsbHMgdG8gV2ViUE11eEFzc2VtYmxlKCkgYW5kIGFuIGVycm9yIGlzCisvLyAgIHJlcG9ydGVkIGlmIGFueSBhbmltYXRlZCBmcmFtZSBkb2VzIG5vdCBjb21wbGV0ZWx5IGZpdCB3aXRoaW4gdGhlIGNhbnZhcy4KKy8vICogV2hlbiB1bnNwZWNpZmllZCAoMCwgMCksIHRoZSBjb25zdHJ1Y3RlZCBjYW52YXMgd2lsbCBnZXQgdGhlIGZyYW1lIGJvdW5kcworLy8gICBmcm9tIHRoZSBib3VuZGluZy1ib3ggb3ZlciBhbGwgZnJhbWVzIGFmdGVyIGNhbGxpbmcgV2ViUE11eEFzc2VtYmxlKCkuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCB0byB3aGljaCB0aGUgY2FudmFzIHNpemUgaXMgdG8gYmUgc2V0CisvLyAgIHdpZHRoIC0gKGluKSBjYW52YXMgd2lkdGgKKy8vICAgaGVpZ2h0IC0gKGluKSBjYW52YXMgaGVpZ2h0CisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4IGlzIE5VTEw7IG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCBvciBoZWlnaHQgYXJlIGludmFsaWQgb3Igb3V0IG9mIGJvdW5kcworLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eFNldENhbnZhc1NpemUoV2ViUE11eCogbXV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKy8vIEdldHMgdGhlIGNhbnZhcyBzaXplIGZyb20gdGhlIG11eCBvYmplY3QuCisvLyBOb3RlOiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIFZQOFggY2h1bmssIGlmIHByZXNlbnQsIGlzIHVwLXRvLWRhdGUuCisvLyBUaGF0IGlzLCB0aGUgbXV4IG9iamVjdCBoYXNuJ3QgYmVlbiBtb2RpZmllZCBzaW5jZSB0aGUgbGFzdCBjYWxsIHRvCisvLyBXZWJQTXV4QXNzZW1ibGUoKSBvciBXZWJQTXV4Q3JlYXRlKCkuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjYW52YXMgc2l6ZSBpcyB0byBiZSBmZXRjaGVkCisvLyAgIHdpZHRoIC0gKG91dCkgY2FudmFzIHdpZHRoCisvLyAgIGhlaWdodCAtIChvdXQpIGNhbnZhcyBoZWlnaHQKKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXgsIHdpZHRoIG9yIGhlaWdodCBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIFZQOFgvVlA4L1ZQOEwgY2h1bmsgb3IgY2FudmFzIHNpemUgaXMgaW52YWxpZC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRDYW52YXNTaXplKGNvbnN0IFdlYlBNdXgqIG11eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7CisKKy8vIEdldHMgdGhlIGZlYXR1cmUgZmxhZ3MgZnJvbSB0aGUgbXV4IG9iamVjdC4KKy8vIE5vdGU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgVlA4WCBjaHVuaywgaWYgcHJlc2VudCwgaXMgdXAtdG8tZGF0ZS4KKy8vIFRoYXQgaXMsIHRoZSBtdXggb2JqZWN0IGhhc24ndCBiZWVuIG1vZGlmaWVkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8KKy8vIFdlYlBNdXhBc3NlbWJsZSgpIG9yIFdlYlBNdXhDcmVhdGUoKS4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIG11eCAtIChpbikgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGZlYXR1cmVzIGFyZSB0byBiZSBmZXRjaGVkCisvLyAgIGZsYWdzIC0gKG91dCkgdGhlIGZsYWdzIHNwZWNpZnlpbmcgd2hpY2ggZmVhdHVyZXMgYXJlIHByZXNlbnQgaW4gdGhlCisvLyAgICAgICAgICAgbXV4IG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIE9SIG9mIHZhcmlvdXMgZmxhZyB2YWx1ZXMuCisvLyAgICAgICAgICAgRW51bSAnV2ViUEZlYXR1cmVGbGFncycgY2FuIGJlIHVzZWQgdG8gdGVzdCBpbmRpdmlkdWFsIGZsYWcgdmFsdWVzLgorLy8gUmV0dXJuczoKKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmbGFncyBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIFZQOFgvVlA4L1ZQOEwgY2h1bmsgb3IgY2FudmFzIHNpemUgaXMgaW52YWxpZC4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhHZXRGZWF0dXJlcyhjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBmbGFncyk7CisKKy8vIEdldHMgbnVtYmVyIG9mIGNodW5rcyB3aXRoIHRoZSBnaXZlbiAnaWQnIGluIHRoZSBtdXggb2JqZWN0LgorLy8gUGFyYW1ldGVyczoKKy8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgaW5mbyBpcyB0byBiZSBmZXRjaGVkCisvLyAgIGlkIC0gKGluKSBjaHVuayBpZCBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGNodW5rCisvLyAgIG51bV9lbGVtZW50cyAtIChvdXQpIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZ2l2ZW4gY2h1bmsgaWQKKy8vIFJldHVybnM6CisvLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXgsIG9yIG51bV9lbGVtZW50cyBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCitXRUJQX0VYVEVSTiBXZWJQTXV4RXJyb3IgV2ViUE11eE51bUNodW5rcyhjb25zdCBXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQQ2h1bmtJZCBpZCwgaW50KiBudW1fZWxlbWVudHMpOworCisvLyBBc3NlbWJsZXMgYWxsIGNodW5rcyBpbiBXZWJQIFJJRkYgZm9ybWF0IGFuZCByZXR1cm5zIGluICdhc3NlbWJsZWRfZGF0YScuCisvLyBUaGlzIGZ1bmN0aW9uIGFsc28gdmFsaWRhdGVzIHRoZSBtdXggb2JqZWN0LgorLy8gTm90ZTogVGhlIGNvbnRlbnQgb2YgJ2Fzc2VtYmxlZF9kYXRhJyB3aWxsIGJlIGlnbm9yZWQgYW5kIG92ZXJ3cml0dGVuLgorLy8gQWxzbywgdGhlIGNvbnRlbnQgb2YgJ2Fzc2VtYmxlZF9kYXRhJyBpcyBhbGxvY2F0ZWQgdXNpbmcgbWFsbG9jKCksIGFuZCBOT1QKKy8vIG93bmVkIGJ5IHRoZSAnbXV4JyBvYmplY3QuIEl0IE1VU1QgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIGNhbGxlciBieSBjYWxsaW5nCisvLyBXZWJQRGF0YUNsZWFyKCkuIEl0J3MgYWx3YXlzIHNhZmUgdG8gY2FsbCBXZWJQRGF0YUNsZWFyKCkgdXBvbiByZXR1cm4sCisvLyBldmVuIGluIGNhc2Ugb2YgZXJyb3IuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3Qgd2hvc2UgY2h1bmtzIGFyZSB0byBiZSBhc3NlbWJsZWQKKy8vICAgYXNzZW1ibGVkX2RhdGEgLSAob3V0KSBhc3NlbWJsZWQgV2ViUCBkYXRhCisvLyBSZXR1cm5zOgorLy8gICBXRUJQX01VWF9CQURfREFUQSAtIGlmIG11eCBvYmplY3QgaXMgaW52YWxpZC4KKy8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBhc3NlbWJsZWRfZGF0YSBpcyBOVUxMLgorLy8gICBXRUJQX01VWF9NRU1PUllfRVJST1IgLSBvbiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKy8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgorV0VCUF9FWFRFUk4gV2ViUE11eEVycm9yIFdlYlBNdXhBc3NlbWJsZShXZWJQTXV4KiBtdXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBhc3NlbWJsZWRfZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJQQW5pbUVuY29kZXIgQVBJCisvLworLy8gVGhpcyBBUEkgYWxsb3dzIGVuY29kaW5nIChwb3NzaWJseSkgYW5pbWF0ZWQgV2ViUCBpbWFnZXMuCisvLworLy8gQ29kZSBFeGFtcGxlOgorLyoKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyBlbmNfb3B0aW9uczsKKyAgV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoJmVuY19vcHRpb25zKTsKKyAgLy8gVHVuZSAnZW5jX29wdGlvbnMnIGFzIG5lZWRlZC4KKyAgV2ViUEFuaW1FbmNvZGVyKiBlbmMgPSBXZWJQQW5pbUVuY29kZXJOZXcod2lkdGgsIGhlaWdodCwgJmVuY19vcHRpb25zKTsKKyAgd2hpbGUoPHRoZXJlIGFyZSBtb3JlIGZyYW1lcz4pIHsKKyAgICBXZWJQQ29uZmlnIGNvbmZpZzsKKyAgICBXZWJQQ29uZmlnSW5pdCgmY29uZmlnKTsKKyAgICAvLyBUdW5lICdjb25maWcnIGFzIG5lZWRlZC4KKyAgICBXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCBmcmFtZSwgdGltZXN0YW1wX21zLCAmY29uZmlnKTsKKyAgfQorICBXZWJQQW5pbUVuY29kZXJBZGQoZW5jLCBOVUxMLCB0aW1lc3RhbXBfbXMsIE5VTEwpOworICBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShlbmMsIHdlYnBfZGF0YSk7CisgIFdlYlBBbmltRW5jb2RlckRlbGV0ZShlbmMpOworICAvLyBXcml0ZSB0aGUgJ3dlYnBfZGF0YScgdG8gYSBmaWxlLCBvciByZS1tdXggaXQgZnVydGhlci4KKyovCisKK3R5cGVkZWYgc3RydWN0IFdlYlBBbmltRW5jb2RlciBXZWJQQW5pbUVuY29kZXI7ICAvLyBNYWluIG9wYXF1ZSBvYmplY3QuCisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLiBEZWZpbmVkIGluIGVuY29kZS5oLgorc3RydWN0IFdlYlBQaWN0dXJlOworc3RydWN0IFdlYlBDb25maWc7CisKKy8vIEdsb2JhbCBvcHRpb25zLgorc3RydWN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMgeworICBXZWJQTXV4QW5pbVBhcmFtcyBhbmltX3BhcmFtczsgIC8vIEFuaW1hdGlvbiBwYXJhbWV0ZXJzLgorICBpbnQgbWluaW1pemVfc2l6ZTsgICAgLy8gSWYgdHJ1ZSwgbWluaW1pemUgdGhlIG91dHB1dCBzaXplIChzbG93KS4gSW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzYWJsZXMga2V5LWZyYW1lIGluc2VydGlvbi4KKyAgaW50IGttaW47CisgIGludCBrbWF4OyAgICAgICAgICAgICAvLyBNaW5pbXVtIGFuZCBtYXhpbXVtIGRpc3RhbmNlIGJldHdlZW4gY29uc2VjdXRpdmUga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmcmFtZXMgaW4gdGhlIG91dHB1dC4gVGhlIGxpYnJhcnkgbWF5IGluc2VydCBzb21lIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIGFzIG5lZWRlZCB0byBzYXRpc2Z5IHRoaXMgY3JpdGVyaWEuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlc2UgY29uZGl0aW9ucyBzaG91bGQgaG9sZDoga21heCA+IGttaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBrbWluID49IGttYXggLyAyICsgMS4gQWxzbywgaWYga21heCA8PSAwLCB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBrZXktZnJhbWUgaW5zZXJ0aW9uIGlzIGRpc2FibGVkOyBhbmQgaWYga21heCA9PSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBhbGwgZnJhbWVzIHdpbGwgYmUga2V5LWZyYW1lcyAoa21pbiB2YWx1ZSBkb2VzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgbWF0dGVyIGZvciB0aGVzZSBzcGVjaWFsIGNhc2VzKS4KKyAgaW50IGFsbG93X21peGVkOyAgICAgIC8vIElmIHRydWUsIHVzZSBtaXhlZCBjb21wcmVzc2lvbiBtb2RlOyBtYXkgY2hvb3NlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBlaXRoZXIgbG9zc3kgYW5kIGxvc3NsZXNzIGZvciBlYWNoIGZyYW1lLgorICBpbnQgdmVyYm9zZTsgICAgICAgICAgLy8gSWYgdHJ1ZSwgcHJpbnQgaW5mbyBhbmQgd2FybmluZyBtZXNzYWdlcyB0byBzdGRlcnIuCisKKyAgdWludDMyX3QgcGFkZGluZ1s0XTsgIC8vIFBhZGRpbmcgZm9yIGxhdGVyIHVzZS4KK307CisKKy8vIEludGVybmFsLCB2ZXJzaW9uLWNoZWNrZWQsIGVudHJ5IHBvaW50LgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRW5jb2Rlck9wdGlvbnNJbml0SW50ZXJuYWwoCisgICAgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyosIGludCk7CisKKy8vIFNob3VsZCBhbHdheXMgYmUgY2FsbGVkLCB0byBpbml0aWFsaXplIGEgZnJlc2ggV2ViUEFuaW1FbmNvZGVyT3B0aW9ucworLy8gc3RydWN0dXJlIGJlZm9yZSBtb2RpZmljYXRpb24uIFJldHVybnMgZmFsc2UgaW4gY2FzZSBvZiB2ZXJzaW9uIG1pc21hdGNoLgorLy8gV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXQoKSBtdXN0IGhhdmUgc3VjY2VlZGVkIGJlZm9yZSB1c2luZyB0aGUKKy8vICdlbmNfb3B0aW9ucycgb2JqZWN0Lgorc3RhdGljIFdFQlBfSU5MSU5FIGludCBXZWJQQW5pbUVuY29kZXJPcHRpb25zSW5pdCgKKyAgICBXZWJQQW5pbUVuY29kZXJPcHRpb25zKiBlbmNfb3B0aW9ucykgeworICByZXR1cm4gV2ViUEFuaW1FbmNvZGVyT3B0aW9uc0luaXRJbnRlcm5hbChlbmNfb3B0aW9ucywgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludC4KK1dFQlBfRVhURVJOIFdlYlBBbmltRW5jb2RlciogV2ViUEFuaW1FbmNvZGVyTmV3SW50ZXJuYWwoCisgICAgaW50LCBpbnQsIGNvbnN0IFdlYlBBbmltRW5jb2Rlck9wdGlvbnMqLCBpbnQpOworCisvLyBDcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIFdlYlBBbmltRW5jb2RlciBvYmplY3QuCisvLyBQYXJhbWV0ZXJzOgorLy8gICB3aWR0aC9oZWlnaHQgLSAoaW4pIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBhbmltYXRpb24uCisvLyAgIGVuY19vcHRpb25zIC0gKGluKSBlbmNvZGluZyBvcHRpb25zOyBjYW4gYmUgcGFzc2VkIE5VTEwgdG8gcGljaworLy8gICAgICAgICAgICAgICAgICAgICAgcmVhc29uYWJsZSBkZWZhdWx0cy4KKy8vIFJldHVybnM6CisvLyAgIEEgcG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBXZWJQQW5pbUVuY29kZXIgb2JqZWN0LgorLy8gICBPciBOVUxMIGluIGNhc2Ugb2YgbWVtb3J5IGVycm9yLgorc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBBbmltRW5jb2RlciogV2ViUEFuaW1FbmNvZGVyTmV3KAorICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgY29uc3QgV2ViUEFuaW1FbmNvZGVyT3B0aW9ucyogZW5jX29wdGlvbnMpIHsKKyAgcmV0dXJuIFdlYlBBbmltRW5jb2Rlck5ld0ludGVybmFsKHdpZHRoLCBoZWlnaHQsIGVuY19vcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOworfQorCisvLyBPcHRpbWl6ZSB0aGUgZ2l2ZW4gZnJhbWUgZm9yIFdlYlAsIGVuY29kZSBpdCBhbmQgYWRkIGl0IHRvIHRoZQorLy8gV2ViUEFuaW1FbmNvZGVyIG9iamVjdC4KKy8vIFRoZSBsYXN0IGNhbGwgdG8gJ1dlYlBBbmltRW5jb2RlckFkZCcgc2hvdWxkIGJlIHdpdGggZnJhbWUgPSBOVUxMLCB3aGljaAorLy8gaW5kaWNhdGVzIHRoYXQgbm8gbW9yZSBmcmFtZXMgYXJlIHRvIGJlIGFkZGVkLiBUaGlzIGNhbGwgaXMgYWxzbyB1c2VkIHRvCisvLyBkZXRlcm1pbmUgdGhlIGR1cmF0aW9uIG9mIHRoZSBsYXN0IGZyYW1lLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZW5jIC0gKGluL291dCkgb2JqZWN0IHRvIHdoaWNoIHRoZSBmcmFtZSBpcyB0byBiZSBhZGRlZC4KKy8vICAgZnJhbWUgLSAoaW4vb3V0KSBmcmFtZSBkYXRhIGluIEFSR0Igb3IgWVVWKEEpIGZvcm1hdC4gSWYgaXQgaXMgaW4gWVVWKEEpCisvLyAgICAgICAgICAgZm9ybWF0LCBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBBUkdCLCB3aGljaCBpbmN1cnMgYSBzbWFsbCBsb3NzLgorLy8gICB0aW1lc3RhbXBfbXMgLSAoaW4pIHRpbWVzdGFtcCBvZiB0aGlzIGZyYW1lIGluIG1pbGxpc2Vjb25kcy4KKy8vICAgICAgICAgICAgICAgICAgICAgICBEdXJhdGlvbiBvZiBhIGZyYW1lIHdvdWxkIGJlIGNhbGN1bGF0ZWQgYXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG9mIG5leHQgZnJhbWUgLSB0aW1lc3RhbXAgb2YgdGhpcyBmcmFtZSIuCisvLyAgICAgICAgICAgICAgICAgICAgICAgSGVuY2UsIHRpbWVzdGFtcHMgc2hvdWxkIGJlIGluIG5vbi1kZWNyZWFzaW5nIG9yZGVyLgorLy8gICBjb25maWcgLSAoaW4pIGVuY29kaW5nIG9wdGlvbnM7IGNhbiBiZSBwYXNzZWQgTlVMTCB0byBwaWNrCisvLyAgICAgICAgICAgIHJlYXNvbmFibGUgZGVmYXVsdHMuCisvLyBSZXR1cm5zOgorLy8gICBPbiBlcnJvciwgcmV0dXJucyBmYWxzZSBhbmQgZnJhbWUtPmVycm9yX2NvZGUgaXMgc2V0IGFwcHJvcHJpYXRlbHkuCisvLyAgIE90aGVyd2lzZSwgcmV0dXJucyB0cnVlLgorV0VCUF9FWFRFUk4gaW50IFdlYlBBbmltRW5jb2RlckFkZCgKKyAgICBXZWJQQW5pbUVuY29kZXIqIGVuYywgc3RydWN0IFdlYlBQaWN0dXJlKiBmcmFtZSwgaW50IHRpbWVzdGFtcF9tcywKKyAgICBjb25zdCBzdHJ1Y3QgV2ViUENvbmZpZyogY29uZmlnKTsKKworLy8gQXNzZW1ibGUgYWxsIGZyYW1lcyBhZGRlZCBzbyBmYXIgaW50byBhIFdlYlAgYml0c3RyZWFtLgorLy8gVGhpcyBjYWxsIHNob3VsZCBiZSBwcmVjZWRlZCBieSAgYSBjYWxsIHRvICdXZWJQQW5pbUVuY29kZXJBZGQnIHdpdGgKKy8vIGZyYW1lID0gTlVMTDsgaWYgbm90LCB0aGUgZHVyYXRpb24gb2YgdGhlIGxhc3QgZnJhbWUgd2lsbCBiZSBpbnRlcm5hbGx5CisvLyBlc3RpbWF0ZWQuCisvLyBQYXJhbWV0ZXJzOgorLy8gICBlbmMgLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCB0aGUgZnJhbWVzIGFyZSB0byBiZSBhc3NlbWJsZWQuCisvLyAgIHdlYnBfZGF0YSAtIChvdXQpIGdlbmVyYXRlZCBXZWJQIGJpdHN0cmVhbS4KKy8vIFJldHVybnM6CisvLyAgIFRydWUgb24gc3VjY2Vzcy4KK1dFQlBfRVhURVJOIGludCBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZShXZWJQQW5pbUVuY29kZXIqIGVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRGF0YSogd2VicF9kYXRhKTsKKworLy8gR2V0IGVycm9yIHN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb3N0IHJlY2VudCBjYWxsIHVzaW5nICdlbmMnLiBUaGUKKy8vIHJldHVybmVkIHN0cmluZyBpcyBvd25lZCBieSAnZW5jJyBhbmQgaXMgdmFsaWQgb25seSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvCisvLyBXZWJQQW5pbUVuY29kZXJBZGQoKSBvciBXZWJQQW5pbUVuY29kZXJBc3NlbWJsZSgpIG9yIFdlYlBBbmltRW5jb2RlckRlbGV0ZSgpLgorLy8gUGFyYW1ldGVyczoKKy8vICAgZW5jIC0gKGluL291dCkgb2JqZWN0IGZyb20gd2hpY2ggdGhlIGVycm9yIHN0cmluZyBpcyB0byBiZSBmZXRjaGVkLgorLy8gUmV0dXJuczoKKy8vICAgTlVMTCBpZiAnZW5jJyBpcyBOVUxMLiBPdGhlcndpc2UsIHJldHVybnMgdGhlIGVycm9yIHN0cmluZyBpZiB0aGUgbGFzdCBjYWxsCisvLyAgIHRvICdlbmMnIGhhZCBhbiBlcnJvciwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZSBsYXN0IGNhbGwgd2FzIGEgc3VjY2Vzcy4KK1dFQlBfRVhURVJOIGNvbnN0IGNoYXIqIFdlYlBBbmltRW5jb2RlckdldEVycm9yKFdlYlBBbmltRW5jb2RlciogZW5jKTsKKworLy8gRGVsZXRlcyB0aGUgV2ViUEFuaW1FbmNvZGVyIG9iamVjdC4KKy8vIFBhcmFtZXRlcnM6CisvLyAgIGVuYyAtIChpbi9vdXQpIG9iamVjdCB0byBiZSBkZWxldGVkCitXRUJQX0VYVEVSTiB2b2lkIFdlYlBBbmltRW5jb2RlckRlbGV0ZShXZWJQQW5pbUVuY29kZXIqIGVuYyk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAgICAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmICAvKiBXRUJQX1dFQlBfTVVYX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL211eF90eXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4X3R5cGVzLmgKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXhfdHlwZXMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvbXV4X3R5cGVzLmgKaW5kZXggN2M3YWJhYy4uMGViZDA2ZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXhfdHlwZXMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC9tdXhfdHlwZXMuaApAQCAtMjMsNyArMjMsNyBAQAogI2VuZGlmCiAjaW5jbHVkZSAiLi90eXBlcy5oIgogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiBleHRlcm4gIkMiIHsKICNlbmRpZgogCkBAIC0zMSwxNiArMzEsMTggQEAKIC8vIHRoZSB0eXBlcyBhcmUgbGVmdCBoZXJlIGZvciByZWZlcmVuY2UuCiAvLyB0eXBlZGVmIGVudW0gV2ViUEZlYXR1cmVGbGFncyBXZWJQRmVhdHVyZUZsYWdzOwogLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhBbmltRGlzcG9zZSBXZWJQTXV4QW5pbURpc3Bvc2U7CisvLyB0eXBlZGVmIGVudW0gV2ViUE11eEFuaW1CbGVuZCBXZWJQTXV4QW5pbUJsZW5kOwogdHlwZWRlZiBzdHJ1Y3QgV2ViUERhdGEgV2ViUERhdGE7CiAKIC8vIFZQOFggRmVhdHVyZSBGbGFncy4KIHR5cGVkZWYgZW51bSBXZWJQRmVhdHVyZUZsYWdzIHsKLSAgRlJBR01FTlRTX0ZMQUcgID0gMHgwMDAwMDAwMSwKICAgQU5JTUFUSU9OX0ZMQUcgID0gMHgwMDAwMDAwMiwKICAgWE1QX0ZMQUcgICAgICAgID0gMHgwMDAwMDAwNCwKICAgRVhJRl9GTEFHICAgICAgID0gMHgwMDAwMDAwOCwKICAgQUxQSEFfRkxBRyAgICAgID0gMHgwMDAwMDAxMCwKLSAgSUNDUF9GTEFHICAgICAgID0gMHgwMDAwMDAyMAorICBJQ0NQX0ZMQUcgICAgICAgPSAweDAwMDAwMDIwLAorCisgIEFMTF9WQUxJRF9GTEFHUyA9IDB4MDAwMDAwM2UKIH0gV2ViUEZlYXR1cmVGbGFnczsKIAogLy8gRGlzcG9zZSBtZXRob2QgKGFuaW1hdGlvbiBvbmx5KS4gSW5kaWNhdGVzIGhvdyB0aGUgYXJlYSB1c2VkIGJ5IHRoZSBjdXJyZW50CkBAIC01MCw2ICs1MiwxMyBAQAogICBXRUJQX01VWF9ESVNQT1NFX0JBQ0tHUk9VTkQgIC8vIERpc3Bvc2UgdG8gYmFja2dyb3VuZCBjb2xvci4KIH0gV2ViUE11eEFuaW1EaXNwb3NlOwogCisvLyBCbGVuZCBvcGVyYXRpb24gKGFuaW1hdGlvbiBvbmx5KS4gSW5kaWNhdGVzIGhvdyB0cmFuc3BhcmVudCBwaXhlbHMgb2YgdGhlCisvLyBjdXJyZW50IGZyYW1lIGFyZSBibGVuZGVkIHdpdGggdGhvc2Ugb2YgdGhlIHByZXZpb3VzIGNhbnZhcy4KK3R5cGVkZWYgZW51bSBXZWJQTXV4QW5pbUJsZW5kIHsKKyAgV0VCUF9NVVhfQkxFTkQsICAgICAgICAgICAgICAvLyBCbGVuZC4KKyAgV0VCUF9NVVhfTk9fQkxFTkQgICAgICAgICAgICAvLyBEbyBub3QgYmxlbmQuCit9IFdlYlBNdXhBbmltQmxlbmQ7CisKIC8vIERhdGEgdHlwZSB1c2VkIHRvIGRlc2NyaWJlICdyYXcnIGRhdGEsIGUuZy4sIGNodW5rIGRhdGEKIC8vIChJQ0MgcHJvZmlsZSwgbWV0YWRhdGEpIGFuZCBXZWJQIGNvbXByZXNzZWQgaW1hZ2UgZGF0YS4KIHN0cnVjdCBXZWJQRGF0YSB7CkBAIC04Nyw3ICs5Niw3IEBACiAgIHJldHVybiAxOwogfQogCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQorI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAgIC8vIGV4dGVybiAiQyIKICNlbmRpZgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL3R5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zcmMvd2VicC90eXBlcy5oCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvdHlwZXMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvdHlwZXMuaAppbmRleCA0NTcyMDYzLi4xMjczOGZhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL3R5cGVzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3JjL3dlYnAvdHlwZXMuaApAQCAtMTUsNiArMTUsNyBAQAogI2RlZmluZSBXRUJQX1dFQlBfVFlQRVNfSF8KIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKICNkZWZpbmUgV0VCUF9JTkxJTkUgU0JfQ19JTkxJTkUKICNlbHNlCkBAIC0yMiwxMCArMjMsMTEgQEAKIAogI2lmbmRlZiBfTVNDX1ZFUgogI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaWZkZWYgX19TVFJJQ1RfQU5TSV9fCi0jZGVmaW5lIFdFQlBfSU5MSU5FCi0jZWxzZSAgLyogX19TVFJJQ1RfQU5TSV9fICovCisjaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSB8fCBcCisgICAgKGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMKQogI2RlZmluZSBXRUJQX0lOTElORSBpbmxpbmUKKyNlbHNlCisjZGVmaW5lIFdFQlBfSU5MSU5FCiAjZW5kaWYKICNlbHNlCiB0eXBlZGVmIHNpZ25lZCAgIGNoYXIgaW50OF90OwpAQCAtNDMsNyArNDUsMTEgQEAKICNpZm5kZWYgV0VCUF9FWFRFUk4KIC8vIFRoaXMgZXhwbGljaXRseSBtYXJrcyBsaWJyYXJ5IGZ1bmN0aW9ucyBhbmQgYWxsb3dzIGZvciBjaGFuZ2luZyB0aGUKIC8vIHNpZ25hdHVyZSBmb3IgZS5nLiwgV2luZG93cyBETEwgYnVpbGRzLgotI2RlZmluZSBXRUJQX0VYVEVSTih0eXBlKSBleHRlcm4gdHlwZQorIyBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSA0CisjICBkZWZpbmUgV0VCUF9FWFRFUk4gZXh0ZXJuIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKKyMgZWxzZQorIyAgZGVmaW5lIFdFQlBfRVhURVJOIGV4dGVybgorIyBlbmRpZiAgLyogX19HTlVDX18gPj0gNCAqLwogI2VuZGlmICAvKiBXRUJQX0VYVEVSTiAqLwogCiAvLyBNYWNybyB0byBjaGVjayBBQkkgY29tcGF0aWJpbGl0eSAoc2FtZSBtYWpvciByZXZpc2lvbiBudW1iZXIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL1JFQURNRSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNWMwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL1JFQURNRQpAQCAtMCwwICsxLDU2IEBACitCdWlsZGluZzoKKz09PT09PT09PQorCitKTkkgU1dJRyBiaW5kaW5nczoKKy0tLS0tLS0tLS0tLS0tLS0tLQorICQgZ2NjIC1zaGFyZWQgLWZQSUMgLWZuby1zdHJpY3QtYWxpYXNpbmcgLU8yIFwKKyAgICAgICAtSS9wYXRoL3RvL3lvdXIvamRrL2luY2x1ZGVzIFwKKyAgICAgICBsaWJ3ZWJwX2phdmFfd3JhcC5jIFwKKyAgICAgICAtbHdlYnAgXAorICAgICAgIC1vIGxpYndlYnBfam5pLnNvCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJFR0lOIFBTRVVETyBFWEFNUExFCitpbXBvcnQgY29tLmdvb2dsZS53ZWJwLmxpYndlYnA7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK3B1YmxpYyBjbGFzcyBsaWJ3ZWJwX2puaV9leGFtcGxlIHsKKyAgc3RhdGljIHsKKyAgICBTeXN0ZW0ubG9hZExpYnJhcnkoIndlYnBfam5pIik7CisgIH0KKworICAvKioKKyAgICogdXNhZ2U6IGphdmEgLWNwIGxpYndlYnAuamFyOi4gbGlid2VicF9qbmlfZXhhbXBsZQorICAgKi8KKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgeworICAgIGZpbmFsIGludCB2ZXJzaW9uID0gbGlid2VicC5XZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImxpYndlYnAgdmVyc2lvbjogIiArIEludGVnZXIudG9IZXhTdHJpbmcodmVyc2lvbikpOworCisgICAgU3lzdGVtLm91dC5wcmludGxuKCJsaWJ3ZWJwIG1ldGhvZHM6Iik7CisgICAgZmluYWwgTWV0aG9kW10gbGlid2VicE1ldGhvZHMgPSBsaWJ3ZWJwLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kcygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlid2VicE1ldGhvZHMubGVuZ3RoOyBpKyspIHsKKyAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaWJ3ZWJwTWV0aG9kc1tpXSk7CisgICAgfQorICB9Cit9CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKKworICQgamF2YWMgLWNwIGxpYndlYnAuamFyIGxpYndlYnBfam5pX2V4YW1wbGUuamF2YQorICQgamF2YSAtRGphdmEubGlicmFyeS5wYXRoPS4gLWNwIGxpYndlYnAuamFyOi4gbGlid2VicF9qbmlfZXhhbXBsZQorCitQeXRob24gU1dJRyBiaW5kaW5nczoKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICQgcHl0aG9uIHNldHVwLnB5IGJ1aWxkX2V4dAorICQgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwgLS1wcmVmaXg9cHlsb2NhbAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCRUdJTiBQU0VVRE8gRVhBTVBMRQoraW1wb3J0IGdsb2IKK2ltcG9ydCBzeXMKK3N5cy5wYXRoLmFwcGVuZChnbG9iLmdsb2IoJ3B5bG9jYWwvbGliL3B5dGhvbiovc2l0ZS1wYWNrYWdlcycpWzBdKQorCitmcm9tIGNvbS5nb29nbGUud2VicCBpbXBvcnQgbGlid2VicAorcHJpbnQgImxpYndlYnAgZGVjb2RlciB2ZXJzaW9uOiAleCIgJSBsaWJ3ZWJwLldlYlBHZXREZWNvZGVyVmVyc2lvbigpCisKK3ByaW50ICJsaWJ3ZWJwIGF0dHJpYnV0ZXM6IgorZm9yIGF0dHIgaW4gZGlyKGxpYndlYnApOiBwcmludCBhdHRyCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFTkQgUFNFVURPIEVYQU1QTEUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5nbyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjIwNWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLmdvCkBAIC0wLDAgKzEsNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitwYWNrYWdlIGxpYndlYnAKKworaW1wb3J0IF8gInJ1bnRpbWUvY2dvIgoraW1wb3J0ICJ1bnNhZmUiCisKK3R5cGUgXyB1bnNhZmUuUG9pbnRlcgorCit0eXBlIF9zd2lnX2ZucHRyICpieXRlCit0eXBlIF9zd2lnX21lbWJlcnB0ciAqYnl0ZQorCisvL2V4dGVybiBsaWJ3ZWJwU3dpZ0Nnb2NhbGwKK2Z1bmMgU3dpZ0Nnb2NhbGwoKQorCisvL2V4dGVybiBsaWJ3ZWJwU3dpZ0Nnb2NhbGxEb25lCitmdW5jIFN3aWdDZ29jYWxsRG9uZSgpCisKKy8vZXh0ZXJuIGxpYndlYnBTd2lnQ2dvY2FsbEJhY2sKK2Z1bmMgU3dpZ0Nnb2NhbGxCYWNrKCkKKworLy9leHRlcm4gbGlid2VicFN3aWdDZ29jYWxsQmFja0RvbmUKK2Z1bmMgU3dpZ0Nnb2NhbGxCYWNrRG9uZSgpCisKK2Z1bmMgV2ViUEdldERlY29kZXJWZXJzaW9uKCkgaW50CitmdW5jIFdyYXBwZWRfV2ViUEdldEluZm8oc3RyaW5nLCBbXWludCwgW11pbnQpIGludAorCisvLyBXZWJQR2V0SW5mbyBoYXMgMiBvdXRwdXQgcGFyYW1ldGVycywgcHJvdmlkZSBhIHZlcnNpb24gaW4gdGhlIG1vcmUgbmF0dXJhbAorLy8gZ28gaWRpb206CitmdW5jIFdlYlBHZXRJbmZvKHdlYnAgW11ieXRlKSAob2sgYm9vbCwgd2lkdGggaW50LCBoZWlnaHQgaW50KSB7CisJdyA6PSBbXWludHswfQorCWggOj0gW11pbnR7MH0KKwlvayA9IFdyYXBwZWRfV2ViUEdldEluZm8oc3RyaW5nKHdlYnApLCB3LCBoKSAhPSAwCisJd2lkdGggPSB3WzBdCisJaGVpZ2h0ID0gaFswXQorCXJldHVybgorfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLmphciBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5qYXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjNTAyYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicC5qYXIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjExZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAucHkKQEAgLTAsMCArMSwxOTggQEAKKyMgVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHIChodHRwOi8vd3d3LnN3aWcub3JnKS4KKyMgVmVyc2lvbiAyLjAuNAorIworIyBEbyBub3QgbWFrZSBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkKKyMgdGhlIFNXSUcgaW50ZXJmYWNlIGZpbGUgaW5zdGVhZC4KKworCisKK2Zyb20gc3lzIGltcG9ydCB2ZXJzaW9uX2luZm8KK2lmIHZlcnNpb25faW5mbyA+PSAoMiw2LDApOgorICAgIGRlZiBzd2lnX2ltcG9ydF9oZWxwZXIoKToKKyAgICAgICAgZnJvbSBvcy5wYXRoIGltcG9ydCBkaXJuYW1lCisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgZnAgPSBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZwLCBwYXRobmFtZSwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUoJ19saWJ3ZWJwJywgW2Rpcm5hbWUoX19maWxlX18pXSkKKyAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgaW1wb3J0IF9saWJ3ZWJwCisgICAgICAgICAgICByZXR1cm4gX2xpYndlYnAKKyAgICAgICAgaWYgZnAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgX21vZCA9IGltcC5sb2FkX21vZHVsZSgnX2xpYndlYnAnLCBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gX21vZAorICAgIF9saWJ3ZWJwID0gc3dpZ19pbXBvcnRfaGVscGVyKCkKKyAgICBkZWwgc3dpZ19pbXBvcnRfaGVscGVyCitlbHNlOgorICAgIGltcG9ydCBfbGlid2VicAorZGVsIHZlcnNpb25faW5mbwordHJ5OgorICAgIF9zd2lnX3Byb3BlcnR5ID0gcHJvcGVydHkKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcGFzcyAjIFB5dGhvbiA8IDIuMiBkb2Vzbid0IGhhdmUgJ3Byb3BlcnR5Jy4KK2RlZiBfc3dpZ19zZXRhdHRyX25vbmR5bmFtaWMoc2VsZixjbGFzc190eXBlLG5hbWUsdmFsdWUsc3RhdGljPTEpOgorICAgIGlmIChuYW1lID09ICJ0aGlzb3duIik6IHJldHVybiBzZWxmLnRoaXMub3duKHZhbHVlKQorICAgIGlmIChuYW1lID09ICJ0aGlzIik6CisgICAgICAgIGlmIHR5cGUodmFsdWUpLl9fbmFtZV9fID09ICdTd2lnUHlPYmplY3QnOgorICAgICAgICAgICAgc2VsZi5fX2RpY3RfX1tuYW1lXSA9IHZhbHVlCisgICAgICAgICAgICByZXR1cm4KKyAgICBtZXRob2QgPSBjbGFzc190eXBlLl9fc3dpZ19zZXRtZXRob2RzX18uZ2V0KG5hbWUsTm9uZSkKKyAgICBpZiBtZXRob2Q6IHJldHVybiBtZXRob2Qoc2VsZix2YWx1ZSkKKyAgICBpZiAobm90IHN0YXRpYyk6CisgICAgICAgIHNlbGYuX19kaWN0X19bbmFtZV0gPSB2YWx1ZQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJZb3UgY2Fubm90IGFkZCBhdHRyaWJ1dGVzIHRvICVzIiAlIHNlbGYpCisKK2RlZiBfc3dpZ19zZXRhdHRyKHNlbGYsY2xhc3NfdHlwZSxuYW1lLHZhbHVlKToKKyAgICByZXR1cm4gX3N3aWdfc2V0YXR0cl9ub25keW5hbWljKHNlbGYsY2xhc3NfdHlwZSxuYW1lLHZhbHVlLDApCisKK2RlZiBfc3dpZ19nZXRhdHRyKHNlbGYsY2xhc3NfdHlwZSxuYW1lKToKKyAgICBpZiAobmFtZSA9PSAidGhpc293biIpOiByZXR1cm4gc2VsZi50aGlzLm93bigpCisgICAgbWV0aG9kID0gY2xhc3NfdHlwZS5fX3N3aWdfZ2V0bWV0aG9kc19fLmdldChuYW1lLE5vbmUpCisgICAgaWYgbWV0aG9kOiByZXR1cm4gbWV0aG9kKHNlbGYpCisgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKworZGVmIF9zd2lnX3JlcHIoc2VsZik6CisgICAgdHJ5OiBzdHJ0aGlzID0gInByb3h5IG9mICIgKyBzZWxmLnRoaXMuX19yZXByX18oKQorICAgIGV4Y2VwdDogc3RydGhpcyA9ICIiCisgICAgcmV0dXJuICI8JXMuJXM7ICVzID4iICUgKHNlbGYuX19jbGFzc19fLl9fbW9kdWxlX18sIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzdHJ0aGlzLCkKKwordHJ5OgorICAgIF9vYmplY3QgPSBvYmplY3QKKyAgICBfbmV3Y2xhc3MgPSAxCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgY2xhc3MgX29iamVjdCA6IHBhc3MKKyAgICBfbmV3Y2xhc3MgPSAwCisKKworCitkZWYgV2ViUEdldERlY29kZXJWZXJzaW9uKCk6CisgICIiIldlYlBHZXREZWNvZGVyVmVyc2lvbigpIC0+IGludCIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUEdldERlY29kZXJWZXJzaW9uKCkKKworZGVmIFdlYlBHZXRJbmZvKCphcmdzKToKKyAgIiIiV2ViUEdldEluZm8odWludDhfdCBkYXRhKSAtPiAod2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBHZXRJbmZvKCphcmdzKQorCitkZWYgV2ViUERlY29kZVJHQigqYXJncyk6CisgICIiIldlYlBEZWNvZGVSR0IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZVJHQigqYXJncykKKworZGVmIFdlYlBEZWNvZGVSR0JBKCphcmdzKToKKyAgIiIiV2ViUERlY29kZVJHQkEodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZVJHQkEoKmFyZ3MpCisKK2RlZiBXZWJQRGVjb2RlQVJHQigqYXJncyk6CisgICIiIldlYlBEZWNvZGVBUkdCKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkiIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLldlYlBEZWNvZGVBUkdCKCphcmdzKQorCitkZWYgV2ViUERlY29kZUJHUigqYXJncyk6CisgICIiIldlYlBEZWNvZGVCR1IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZUJHUigqYXJncykKKworZGVmIFdlYlBEZWNvZGVCR1JBKCphcmdzKToKKyAgIiIiV2ViUERlY29kZUJHUkEodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSIiIgorICByZXR1cm4gX2xpYndlYnAuV2ViUERlY29kZUJHUkEoKmFyZ3MpCisKK2RlZiBXZWJQR2V0RW5jb2RlclZlcnNpb24oKToKKyAgIiIiV2ViUEdldEVuY29kZXJWZXJzaW9uKCkgLT4gaW50IiIiCisgIHJldHVybiBfbGlid2VicC5XZWJQR2V0RW5jb2RlclZlcnNpb24oKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlUkdCKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVSR0IoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVCR1IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUJHUigqYXJncykKKworZGVmIHdyYXBfV2ViUEVuY29kZVJHQkEoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZVJHQkEoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVCR1JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVCR1JBKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCphcmdzKQorCitkZWYgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKCphcmdzKToKKyAgIiIicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIiIiCisgIHJldHVybiBfbGlid2VicC53cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEoKmFyZ3MpCisKK2RlZiB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEoKmFyZ3MpOgorICAiIiJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4iIiIKKyAgcmV0dXJuIF9saWJ3ZWJwLndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgqYXJncykKK19VTlVTRUQgPSAxCisKK2RlZiBXZWJQRW5jb2RlUkdCKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik6CisgICIiIldlYlBFbmNvZGVSR0IodWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIC0+IGxvc3N5X3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZVJHQigKKyAgICAgIHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvcikKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVSR0JBKHJnYiwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik6CisgICIiIldlYlBFbmNvZGVSR0JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSAtPiBsb3NzeV93ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVSR0JBKAorICAgICAgcmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKQorICBpZiBsZW4od2VicFswXSkgPT0gMDoKKyAgICByZXR1cm4gTm9uZQorICByZXR1cm4gd2VicFswXQorCitkZWYgV2ViUEVuY29kZUJHUihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlQkdSKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIGZsb2F0IHF1YWxpdHlfZmFjdG9yKSAtPiBsb3NzeV93ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVCR1IoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCisKK2RlZiBXZWJQRW5jb2RlQkdSQShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpOgorICAiIiJXZWJQRW5jb2RlQkdSQSh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF9XZWJQRW5jb2RlQkdSQSgKKyAgICAgIHJnYiwgX1VOVVNFRCwgX1VOVVNFRCwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3RvcikKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc1JHQihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiIldlYlBFbmNvZGVMb3NzbGVzc1JHQih1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQihyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIC0+IGxvc3NsZXNzX3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQShyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc0JHUihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiIldlYlBFbmNvZGVMb3NzbGVzc0JHUih1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSAtPiBsb3NzbGVzc193ZWJwIiIiCisgIHdlYnAgPSB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUihyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworZGVmIFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpOgorICAiIiJXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKHVpbnQ4X3QgcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIC0+IGxvc3NsZXNzX3dlYnAiIiIKKyAgd2VicCA9IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQShyZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSkKKyAgaWYgbGVuKHdlYnBbMF0pID09IDA6CisgICAgcmV0dXJuIE5vbmUKKyAgcmV0dXJuIHdlYnBbMF0KKworIyBUaGlzIGZpbGUgaXMgY29tcGF0aWJsZSB3aXRoIGJvdGggY2xhc3NpYyBhbmQgbmV3LXN0eWxlIGNsYXNzZXMuCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnN3aWcgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnAuc3dpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzc0OGI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwLnN3aWcKQEAgLTAsMCArMSw0MzUgQEAKKy8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuCisvLworLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQorLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCisvLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCisvLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKKy8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBsaWJ3ZWJwIHN3aWcgaW50ZXJmYWNlIGRlZmluaXRpb24KKy8vCisvLyBBdXRob3I6IEphbWVzIFplcm4gKGp6ZXJuQGdvb2dsZS5jb20pCisKKy8qCisgIEdvIGJpbmRpbmdzOgorICAkIHN3aWcgLWdvIFwKKyAgICAgICAgIC1vdXRkaXIgLiBcCisgICAgICAgICAtbyBsaWJ3ZWJwX2dvX3dyYXAuYyBsaWJ3ZWJwLnN3aWcKKworICBKYXZhIGJpbmRpbmdzOgorICAkIG1rZGlyIC1wIGphdmEvY29tL2dvb2dsZS93ZWJwCisgICQgc3dpZyAtamF2YSBcCisgICAgICAgICAtcGFja2FnZSBjb20uZ29vZ2xlLndlYnAgXAorICAgICAgICAgLW91dGRpciBqYXZhL2NvbS9nb29nbGUvd2VicCBcCisgICAgICAgICAtbyBsaWJ3ZWJwX2phdmFfd3JhcC5jIGxpYndlYnAuc3dpZworCisgIFB5dGhvbiBiaW5kaW5nczoKKyAgJCBzd2lnIC1weXRob24gXAorICAgICAgICAgLW91dGRpciAuIFwKKyAgICAgICAgIC1vIGxpYndlYnBfcHl0aG9uX3dyYXAuYyBsaWJ3ZWJwLnN3aWcKKyovCisKKyNpZmRlZiBTV0lHUFlUSE9OCislbW9kdWxlKHBhY2thZ2U9ImNvbS5nb29nbGUud2VicCIpIGxpYndlYnAKKyNlbHNlCislbW9kdWxlIGxpYndlYnAKKyNlbmRpZiAgLyogU1dJR1BZVEhPTiAqLworCislaW5jbHVkZSAiY29uc3RyYWludHMuaSIKKyVpbmNsdWRlICJ0eXBlbWFwcy5pIgorCisjaWZkZWYgU1dJR0dPCislYXBwbHkgKGNoYXIqIFNUUklORywgc2l6ZV90IExFTkdUSCkgeyAoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgfQorCislcmVuYW1lKHdyYXBwZWRfV2ViUEdldEluZm8pIFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKKyNlbmRpZiAgLyogU1dJR0dPICovCisKKyNpZmRlZiBTV0lHSkFWQQorJWluY2x1ZGUgImFycmF5c19qYXZhLmkiOworJWluY2x1ZGUgImVudW1zLnN3ZyIgLypOQjogcmVxdWlyZXMgSkRLLTEuNSsKKyAgICAgICAgICAgICAgICAgICAgICAgU2VlOiBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzEuMy9KYXZhLmh0bWwjZW51bWVyYXRpb25zICovCisKKy8vIG1hcCB1aW50OF90KiBzdWNoIHRoYXQgYSBieXRlW10gaXMgdXNlZAorJXsKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCislfQorLy8gZnJvbSBhcnJheXNfamF2YS5pIChzaWduZWQgY2hhcikKK0pBVkFfQVJSQVlTX0RFQ0wodWludDhfdCwgamJ5dGUsIEJ5dGUsIFVpbnQ4KQorSkFWQV9BUlJBWVNfSU1QTCh1aW50OF90LCBqYnl0ZSwgQnl0ZSwgVWludDgpCitKQVZBX0FSUkFZU19UWVBFTUFQUyh1aW50OF90LCBieXRlLCBqYnl0ZSwgVWludDgsICJbQiIpCislYXBwbHkgdWludDhfdFtdIHsgdWludDhfdCogfQorI2VuZGlmICAvKiBTV0lHSkFWQSAqLworCisjaWZkZWYgU1dJR1BZVEhPTgorJWFwcGx5IChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHsgKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUpIH0KKyV0eXBlbWFwKG91dCkgdWludDhfdCogeworICAkcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopJDEsCisgICAgICAoJDEgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCIkc3ltbmFtZSIsIGFyZzMsIGFyZzQpKTsKK30KKworJXR5cGVtYXAgKGluKSBjb25zdCB1aW50OF90KiByZ2IgKFB5X2J1ZmZlciByZ2JfYnVmZmVyKSB7CisgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcigkaW5wdXQsIChjb25zdCB2b2lkKiopKCYkMSksICZ1bnVzZWQpOworICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKCRpbnB1dCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgImluIG1ldGhvZCAnJHN5bW5hbWUnLCBhcmd1bWVudCAkYXJnbnVtIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgIH0KKyAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcigkaW5wdXQsICZyZ2JfYnVmZmVyLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJpbiBtZXRob2QgJyRzeW1uYW1lJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICB9CisgICQxID0gKCQxX2x0eXBlKXJnYl9idWZmZXIuYnVmOworfQorCisldHlwZW1hcChmcmVlYXJnKSBjb25zdCB1aW50OF90KiByZ2IgeworICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyJGFyZ251bSk7Cit9CisKKyVkZWZpbmUgREVDT0RFX0FVVE9ET0MoZnVuYykKKyVmZWF0dXJlKCJhdXRvZG9jIiwgI2Z1bmMgIih1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIikgZnVuYzsKKyVlbmRkZWYKKworJWZlYXR1cmUoImF1dG9kb2MiLCAiMSIpOworREVDT0RFX0FVVE9ET0MoV2ViUERlY29kZVJHQik7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlUkdCQSk7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlQVJHQik7CitERUNPREVfQVVUT0RPQyhXZWJQRGVjb2RlQkdSKTsKK0RFQ09ERV9BVVRPRE9DKFdlYlBEZWNvZGVCR1JBKTsKKyVmZWF0dXJlKCJhdXRvZG9jIiwgIldlYlBHZXRJbmZvKHVpbnQ4X3QgZGF0YSkgLT4gKHdpZHRoLCBoZWlnaHQpIikgV2ViUEdldEluZm87CisjZW5kaWYgIC8qIFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERlY29kZXIgc3BlY2lmaWMKKworJWFwcGx5IGludCogT1VUUFVUIHsgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQgfQorCitpbnQgV2ViUEdldERlY29kZXJWZXJzaW9uKHZvaWQpOworaW50IFdlYlBHZXRJbmZvKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisjaWYgZGVmaW5lZChTV0lHSkFWQSkgfHwgZGVmaW5lZChTV0lHUFlUSE9OKQorCisvLyBmcmVlIHRoZSBidWZmZXIgcmV0dXJuZWQgYnkgdGhlc2UgZnVuY3Rpb25zIGFmdGVyIGNvcHlpbmcgaW50bworLy8gdGhlIG5hdGl2ZSB0eXBlCislbmV3b2JqZWN0IFdlYlBEZWNvZGVSR0I7CislbmV3b2JqZWN0IFdlYlBEZWNvZGVSR0JBOworJW5ld29iamVjdCBXZWJQRGVjb2RlQVJHQjsKKyVuZXdvYmplY3QgV2ViUERlY29kZUJHUjsKKyVuZXdvYmplY3QgV2ViUERlY29kZUJHUkE7CisldHlwZW1hcChuZXdmcmVlKSB1aW50OF90KiAiZnJlZSgkMSk7IgorCit1aW50OF90KiBXZWJQRGVjb2RlUkdCKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogd2lkdGgsIGludCogaGVpZ2h0KTsKK3VpbnQ4X3QqIFdlYlBEZWNvZGVSR0JBKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Cit1aW50OF90KiBXZWJQRGVjb2RlQVJHQihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOwordWludDhfdCogV2ViUERlY29kZUJHUihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCk7Cit1aW50OF90KiBXZWJQRGVjb2RlQkdSQShjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB3aWR0aCwgaW50KiBoZWlnaHQpOworCisjZW5kaWYgIC8qIFNXSUdKQVZBIHx8IFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEVuY29kZXIgc3BlY2lmaWMKKworI2lmIGRlZmluZWQoU1dJR0pBVkEpIHx8IGRlZmluZWQoU1dJR1BZVEhPTikKKworaW50IFdlYlBHZXRFbmNvZGVyVmVyc2lvbih2b2lkKTsKKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXcmFwcGVyIGNvZGUgYWRkaXRpb25zCisKKyV7CisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorJX0KKworI2lmZGVmIFNXSUdKQVZBCisleworI2RlZmluZSBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkgXAorICAgIChyZXN1bHQgPyAoamludClSZXR1cm5lZEJ1ZmZlclNpemUoX19GVU5DVElPTl9fLCBhcmczLCBhcmc0KSA6IDApCislfQorI2VuZGlmICAvKiBTV0lHSkFWQSAqLworCisjaWYgZGVmaW5lZChTV0lHSkFWQSkgfHwgZGVmaW5lZChTV0lHUFlUSE9OKQorJXsKK3N0YXRpYyBzaXplX3QgUmV0dXJuZWRCdWZmZXJTaXplKAorICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uLCBpbnQqIHdpZHRoLCBpbnQqIGhlaWdodCkgeworICBzdGF0aWMgY29uc3Qgc3RydWN0IHNpemVtYXAgeworICAgIGNvbnN0IGNoYXIqIGZ1bmN0aW9uOworICAgIGludCBzaXplX211bHRpcGxpZXI7CisgIH0gc2l6ZV9tYXBbXSA9IHsKKyNpZmRlZiBTV0lHSkFWQQorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZVJHQiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUiIsICAzIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorI2lmZGVmIFNXSUdQWVRIT04KKyAgICB7ICJXZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlUkdCQSIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQVJHQiIsIDQgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJXZWJQRGVjb2RlQkdSQSIsIDQgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlUkdCQSIsIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIDEgfSwKKyNlbmRpZgorICAgIHsgTlVMTCwgMCB9CisgIH07CisgIGNvbnN0IHN0cnVjdCBzaXplbWFwKiBwOworICBzaXplX3Qgc2l6ZSA9IDA7CisKKyAgZm9yIChwID0gc2l6ZV9tYXA7IHAtPmZ1bmN0aW9uOyArK3ApIHsKKyAgICBpZiAoIXN0cmNtcChmdW5jdGlvbiwgcC0+ZnVuY3Rpb24pKSB7CisgICAgICBzaXplID0gKndpZHRoICogKmhlaWdodCAqIHAtPnNpemVfbXVsdGlwbGllcjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorJX0KKworJXsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUZ1bmN0aW9uKShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLCB1aW50OF90Kiogb3V0cHV0KTsKK3R5cGVkZWYgc2l6ZV90ICgqV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXRwdXQpOworCitzdGF0aWMgdWludDhfdCogRW5jb2RlTG9zc3koY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBxdWFsaXR5X2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJQRW5jb2RlRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPQorICAgICAgZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAmb3V0cHV0KTsKKyAgLy8gdGhlIHZhbHVlcyBvZiBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkgUmV0dXJuZWRCdWZmZXJTaXplKCkKKyAgLy8gYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzbGVzcyhjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVMb3NzbGVzc0Z1bmN0aW9uIGVuY2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0cHV0X3NpemUsIGludCogdW51c2VkKSB7CisgIHVpbnQ4X3QqIG91dHB1dCA9IE5VTEw7CisgIGNvbnN0IHNpemVfdCBpbWFnZV9zaXplID0gZW5jZm4ocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIHRoZSBmb2xsb3dpbmcgdHdvIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYnkKKyAgLy8gUmV0dXJuZWRCdWZmZXJTaXplKCkgYXMgJ3dpZHRoJyBhbmQgJ2hlaWdodCcgaW4gdGhlIHNpemUgY2FsY3VsYXRpb24uCisgICpvdXRwdXRfc2l6ZSA9IGltYWdlX3NpemU7CisgICp1bnVzZWQgPSAxOworICByZXR1cm4gaW1hZ2Vfc2l6ZSA/IG91dHB1dCA6IE5VTEw7Cit9CislfQorCisjZW5kaWYgIC8qIFNXSUdKQVZBIHx8IFNXSUdQWVRIT04gKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGxpYndlYnAvZW5jb2RlIHdyYXBwZXIgZnVuY3Rpb25zCisKKyNpZiBkZWZpbmVkKFNXSUdKQVZBKSB8fCBkZWZpbmVkKFNXSUdQWVRIT04pCisKKyVhcHBseSBpbnQqIElOUFVUIHsgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIgfQorJWFwcGx5IGludCogT1VUUFVUIHsgaW50KiBvdXRwdXRfc2l6ZSB9CisKKy8vIGZyZWUgdGhlIGJ1ZmZlciByZXR1cm5lZCBieSB0aGVzZSBmdW5jdGlvbnMgYWZ0ZXIgY29weWluZyBpbnRvCisvLyB0aGUgbmF0aXZlIHR5cGUKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlUkdCOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVCR1I7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZVJHQkE7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZUJHUkE7CislbmV3b2JqZWN0IHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUjsKKyVuZXdvYmplY3Qgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBOworJW5ld29iamVjdCB3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkE7CisKKyNpZmRlZiBTV0lHSkFWQQorLy8gVGhlcmUncyBubyByZWFzb24gdG8gY2FsbCB0aGVzZSBkaXJlY3RseQorJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlUkdCICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUJHUiAicHJpdmF0ZSI7CislamF2YW1ldGhvZG1vZGlmaWVycyB3cmFwX1dlYlBFbmNvZGVSR0JBICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUJHUkEgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IgInByaXZhdGUiOworJWphdmFtZXRob2Rtb2RpZmllcnMgd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBICJwcml2YXRlIjsKKyVqYXZhbWV0aG9kbW9kaWZpZXJzIHdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSAicHJpdmF0ZSI7CisjZW5kaWYgIC8qIFNXSUdKQVZBICovCisKKyNpZmRlZiBTV0lHUFlUSE9OCisvLyBUaGlzIGF1dG9kb2Mgd2lsbCBzZXJ2ZSBhcyBhIGNhdGNoLWFsbCBmb3Igd3JhcF8qLgorJWZlYXR1cmUoImF1dG9kb2MiLCAicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIik7CisjZW5kaWYKKworJWlubGluZSAleworLy8gQ2hhbmdlcyB0aGUgcmV0dXJuIHR5cGUgb2YgV2ViUEVuY29kZSogdG8gbW9yZSBjbG9zZWx5IG1hdGNoIERlY29kZSouCisvLyBUaGlzIGFsc28gbWFrZXMgaXQgZWFzaWVyIHRvIHdyYXAgdGhlIG91dHB1dCBidWZmZXIgaW4gYSBuYXRpdmUgdHlwZSByYXRoZXIKKy8vIHRoYW4gZGVhbGluZyB3aXRoIHRoZSByZXR1cm4gcG9pbnRlci4KKy8vIFRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgYXJlIHRvIGFsbG93IHJldXNlIG9mIFJldHVybmVkQnVmZmVyU2l6ZSgpLAorLy8gdW51c2VkMiBhbmQgb3V0cHV0X3NpemUgd2lsbCBiZSB1c2VkIGluIHRoaXMgY2FzZS4KKyNkZWZpbmUgTE9TU1lfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwgZmxvYXQgcXVhbGl0eV9mYWN0b3IpIHsgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc3kocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlUkdCQSkKK0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZUJHUkEpCisKKyN1bmRlZiBMT1NTWV9XUkFQUEVSCisKKyNkZWZpbmUgTE9TU0xFU1NfV1JBUFBFUihGVU5DKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHVpbnQ4X3QqIHdyYXBfIyNGVU5DKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHJnYiwgaW50KiB1bnVzZWQxLCBpbnQqIHVudXNlZDIsIGludCogb3V0cHV0X3NpemUsIFwKKyAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRW5jb2RlTG9zc2xlc3MocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRlVOQywgb3V0cHV0X3NpemUsIHVudXNlZDIpOyAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKworTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCQSkKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKworI3VuZGVmIExPU1NMRVNTX1dSQVBQRVIKKworJX0KKworI2VuZGlmICAvKiBTV0lHSkFWQSB8fCBTV0lHUFlUSE9OICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMYW5ndWFnZSBzcGVjaWZpYworCisjaWZkZWYgU1dJR0dPCislaW5zZXJ0KGdvX3dyYXBwZXIpICV7CisKKy8vIFdlYlBHZXRJbmZvIGhhcyAyIG91dHB1dCBwYXJhbWV0ZXJzLCBwcm92aWRlIGEgdmVyc2lvbiBpbiB0aGUgbW9yZSBuYXR1cmFsCisvLyBnbyBpZGlvbToKK2Z1bmMgV2ViUEdldEluZm8od2VicCBbXWJ5dGUpIChvayBib29sLCB3aWR0aCBpbnQsIGhlaWdodCBpbnQpIHsKKyAgICB3IDo9IFtdaW50ezB9CisgICAgaCA6PSBbXWludHswfQorICAgIG9rID0gV3JhcHBlZF9XZWJQR2V0SW5mbyhzdHJpbmcod2VicCksIHcsIGgpICE9IDAKKyAgICB3aWR0aCA9IHdbMF0KKyAgICBoZWlnaHQgPSBoWzBdCisgICAgcmV0dXJuCit9CisKKyV9CisjZW5kaWYgIC8qIFNXSUdHTyAqLworCisjaWZkZWYgU1dJR0pBVkEKKyV7CisvKiBXb3JrIGFyb3VuZCBicm9rZW4gZ2NqIGpuaS5oICovCisjaWZkZWYgX19HQ0pfSk5JX0hfXworIyB1bmRlZiBKTklFWFBPUlQKKyMgZGVmaW5lIEpOSUVYUE9SVAorIyB1bmRlZiBKTklDQUxMCisjIGRlZmluZSBKTklDQUxMCisjZW5kaWYKKyV9CisKKyVwcmFnbWEoamF2YSkgbW9kdWxlY29kZT0leworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5VU0VEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgaW50IG91dHB1dFNpemVbXSA9IHsgMCB9OworJX0KKworCislZGVmaW5lIENBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoZnVuYykKKyVwcmFnbWEoamF2YSkgbW9kdWxlY29kZT0leworICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBmdW5jKAorICAgICAgYnl0ZVtdIHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeworICAgIHJldHVybiB3cmFwXyMjZnVuYygKKyAgICAgICAgcmdiLCBVTlVTRUQsIFVOVVNFRCwgb3V0cHV0U2l6ZSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBxdWFsaXR5X2ZhY3Rvcik7CisgIH0KKyV9CislZW5kZGVmCisKKyVkZWZpbmUgQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihmdW5jKQorJXByYWdtYShqYXZhKSBtb2R1bGVjb2RlPSV7CisgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZ1bmMoCisgICAgICBieXRlW10gcmdiLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKKyAgICByZXR1cm4gd3JhcF8jI2Z1bmMoCisgICAgICAgIHJnYiwgVU5VU0VELCBVTlVTRUQsIG91dHB1dFNpemUsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk7CisgIH0KKyV9CislZW5kZGVmCisKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQikKK0NBTExfRU5DT0RFX0xPU1NZX1dSQVBQRVIoV2ViUEVuY29kZVJHQkEpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1JBKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0IpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQkEpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUikKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSQSkKKyNlbmRpZiAgLyogU1dJR0pBVkEgKi8KKworI2lmZGVmIFNXSUdQWVRIT04KKyVweXRob25jb2RlICV7CitfVU5VU0VEID0gMQorJX0KKworJWRlZmluZSBDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKGZ1bmMpCislcHl0aG9uY29kZSAleworZGVmIGZ1bmMocmdiLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHF1YWxpdHlfZmFjdG9yKToKKyAgIiIiZnVuYyh1aW50OF90IHJnYiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgLT4gbG9zc3lfd2VicCIiIgorICB3ZWJwID0gd3JhcF8jI2Z1bmMoCisgICAgICByZ2IsIF9VTlVTRUQsIF9VTlVTRUQsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCislfQorJWVuZGRlZgorCislZGVmaW5lIENBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoZnVuYykKKyVweXRob25jb2RlICV7CitkZWYgZnVuYyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSk6CisgICIiImZ1bmModWludDhfdCByZ2IsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgLT4gbG9zc2xlc3Nfd2VicCIiIgorICB3ZWJwID0gd3JhcF8jI2Z1bmMocmdiLCBfVU5VU0VELCBfVU5VU0VELCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUpCisgIGlmIGxlbih3ZWJwWzBdKSA9PSAwOgorICAgIHJldHVybiBOb25lCisgIHJldHVybiB3ZWJwWzBdCislfQorJWVuZGRlZgorCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitDQUxMX0VOQ09ERV9MT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSKQorQ0FMTF9FTkNPREVfTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKK0NBTExfRU5DT0RFX0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzUkdCKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorQ0FMTF9FTkNPREVfTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1IpCitDQUxMX0VOQ09ERV9MT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc0JHUkEpCisjZW5kaWYgIC8qIFNXSUdQWVRIT04gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nYy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2djLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjdmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nYy5jCkBAIC0wLDAgKzEsNTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBUaGlzIGZpbGUgc2hvdWxkIGJlIGNvbXBpbGVkIHdpdGggNmMvOGMuICAqLworI3ByYWdtYSBkeW5pbXBvcnQgXyBfICJsaWJ3ZWJwX2dvLnNvIgorCisjaW5jbHVkZSAicnVudGltZS5oIgorI2luY2x1ZGUgImNnb2NhbGwuaCIKKworI2lmZGVmIF82NEJJVAorI2RlZmluZSBTV0lHX1BBUk1fU0laRSA4CisjZWxzZQorI2RlZmluZSBTV0lHX1BBUk1fU0laRSA0CisjZW5kaWYKKworI3ByYWdtYSBkeW5pbXBvcnQgX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uIF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbiAiIgorZXh0ZXJuIHZvaWQgKCpfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24pKHZvaWQqKTsKK3N0YXRpYyB2b2lkICgqeF93cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbikodm9pZCopID0gX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uOworCit2b2lkCivCt1dlYlBHZXREZWNvZGVyVmVyc2lvbihzdHJ1Y3QgeworICB1aW50OCB4W1NXSUdfUEFSTV9TSVpFXTsKK30gcCkKKworeworICBydW50aW1lwrdjZ29jYWxsKHhfd3JhcF9XZWJQR2V0RGVjb2RlclZlcnNpb24sICZwKTsKK30KKworCisKKyNwcmFnbWEgZHluaW1wb3J0IF93cmFwX3dyYXBwZWRfV2ViUEdldEluZm8gX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbyAiIgorZXh0ZXJuIHZvaWQgKCpfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvKSh2b2lkKik7CitzdGF0aWMgdm9pZCAoKnhfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvKSh2b2lkKikgPSBfd3JhcF93cmFwcGVkX1dlYlBHZXRJbmZvOworCit2b2lkCivCt1dyYXBwZWRfV2ViUEdldEluZm8oc3RydWN0IHsKKyAgdWludDggeFsoMiAqIFNXSUdfUEFSTV9TSVpFKSArICgzICogU1dJR19QQVJNX1NJWkUpICsgKDMgKiBTV0lHX1BBUk1fU0laRSkgKyBTV0lHX1BBUk1fU0laRV07Cit9IHApCisKK3sKKyAgcnVudGltZcK3Y2dvY2FsbCh4X3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbywgJnApOworfQorCisKKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2dvX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nb193cmFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxZDUyMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9nb193cmFwLmMKQEAgLTAsMCArMSwyNzQgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC4xMAorICoKKyAqIFRoaXMgZmlsZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgZWFzaWx5IHJlYWRhYmxlIGFuZCBjb250YWlucyBhIG51bWJlciBvZgorICogY29kaW5nIGNvbnZlbnRpb25zIGRlc2lnbmVkIHRvIGltcHJvdmUgcG9ydGFiaWxpdHkgYW5kIGVmZmljaWVuY3kuIERvIG5vdCBtYWtlCisgKiBjaGFuZ2VzIHRvIHRoaXMgZmlsZSB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLS1tb2RpZnkgdGhlIFNXSUcKKyAqIGludGVyZmFjZSBmaWxlIGluc3RlYWQuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBTV0lHTU9EVUxFIGxpYndlYnAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGdlbmVyaWMgU1dJRyBsYWJlbHMgZm9yIG1ldGhvZC92YXJpYWJsZQorICogIGRlY2xhcmF0aW9ucy9hdHRyaWJ1dGVzLCBhbmQgb3RoZXIgY29tcGlsZXIgZGVwZW5kZW50IGxhYmVscy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBjb3JyZWN0bHkgaW1wbGVtZW50IHRoZSBDKysgc3RhbmRhcmQgKi8KKyNpZm5kZWYgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBpZiBkZWZpbmVkKF9fU1VOUFJPX0NDKSAmJiAoX19TVU5QUk9fQ0MgPD0gMHg1NjApCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbGlmIGRlZmluZWQoX19IUF9hQ0MpCisvKiBOZWVkZWQgZXZlbiB3aXRoIGBhQ0MgLUFBJyB3aGVuIGBhQ0MgLVYnIHJlcG9ydHMgSFAgQU5TSSBDKysgQjM5MTBCIEEuMDMuNTUgKi8KKy8qIElmIHdlIGZpbmQgYSBtYXhpbXVtIHZlcnNpb24gdGhhdCByZXF1aXJlcyB0aGlzLCB0aGUgdGVzdCB3b3VsZCBiZSBfX0hQX2FDQyA8PSAzNTUwMCBmb3IgQS4wMy41NSAqLworIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxzZQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbmxpbmUgYXR0cmlidXRlICovCisjaWZuZGVmIFNXSUdJTkxJTkUKKyMgaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgKGRlZmluZWQoX19HTlVDX18pICYmICFkZWZpbmVkKF9fU1RSSUNUX0FOU0lfXykpCisjICAgZGVmaW5lIFNXSUdJTkxJTkUgaW5saW5lCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR0lOTElORQorIyBlbmRpZgorI2VuZGlmCisKKy8qIGF0dHJpYnV0ZSByZWNvZ25pc2VkIGJ5IHNvbWUgY29tcGlsZXJzIHRvIGF2b2lkICd1bnVzZWQnIHdhcm5pbmdzICovCisjaWZuZGVmIFNXSUdVTlVTRUQKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgICBpZiAhKGRlZmluZWQoX19jcGx1c3BsdXMpKSB8fCAoX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpKQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VECisjICAgZW5kaWYKKyMgZWxpZiBkZWZpbmVkKF9fSUNDKQorIyAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHX01TQ19VTlNVUFBSRVNTXzQ1MDUKKyMgaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgICBwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUwNSkgLyogdW5yZWZlcmVuY2VkIGxvY2FsIGZ1bmN0aW9uIGhhcyBiZWVuIHJlbW92ZWQgKi8KKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdVTlVTRURQQVJNCisjIGlmZGVmIF9fY3BsdXNwbHVzCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkgcCBTV0lHVU5VU0VECisjIGVuZGlmCisjZW5kaWYKKworLyogaW50ZXJuYWwgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTgorIyBkZWZpbmUgU1dJR0lOVEVSTiBzdGF0aWMgU1dJR1VOVVNFRAorI2VuZGlmCisKKy8qIGludGVybmFsIGlubGluZSBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOSU5MSU5FCisjIGRlZmluZSBTV0lHSU5URVJOSU5MSU5FIFNXSUdJTlRFUk4gU1dJR0lOTElORQorI2VuZGlmCisKKy8qIGV4cG9ydGluZyBtZXRob2RzICovCisjaWYgKF9fR05VQ19fID49IDQpIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID49IDQpCisjICBpZm5kZWYgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgICBkZWZpbmUgR0NDX0hBU0NMQVNTVklTSUJJTElUWQorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdFWFBPUlQKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgaWYgZGVmaW5lZChTVEFUSUNfTElOS0VEKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbmRpZgorIyBlbHNlCisjICAgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZKQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQKKyMgICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGNhbGxpbmcgY29udmVudGlvbnMgZm9yIFdpbmRvd3MgKi8KKyNpZm5kZWYgU1dJR1NURENBTEwKKyMgaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19XSU4zMl9fKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCisjICAgZGVmaW5lIFNXSUdTVERDQUxMIF9fc3RkY2FsbAorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdTVERDQUxMCisjIGVuZGlmCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgQyBzdGFuZGFyZCBydW50aW1lIGZ1bmN0aW9ucyAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIG1ldGhvZHMgaW4gdGhlIHN0YW5kYXJkIEMrKyBsaWJyYXJ5ICovCisjaWYgIWRlZmluZWQoU1dJR19OT19TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisKKwordHlwZWRlZiBsb25nIGxvbmcgaW50Z287Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1aW50Z287CisKKworCit0eXBlZGVmIHN0cnVjdCB7IGNoYXIgKnA7IGludGdvIG47IH0gX2dvc3RyaW5nXzsKK3R5cGVkZWYgc3RydWN0IHsgdm9pZCogYXJyYXk7IGludGdvIGxlbjsgaW50Z28gY2FwOyB9IF9nb3NsaWNlXzsKKworCisKKworI2RlZmluZSBzd2lnZ29fc2l6ZV9hc3NlcnRfZXEoeCwgeSwgbmFtZSkgdHlwZWRlZiBjaGFyIG5hbWVbKHgteSkqKHgteSkqLTIrMV07CisjZGVmaW5lIHN3aWdnb19zaXplX2Fzc2VydCh0LCBuKSBzd2lnZ29fc2l6ZV9hc3NlcnRfZXEoc2l6ZW9mKHQpLCBuLCBzd2lnZ29fc2l6ZW9mXyMjdCMjX2lzX25vdF8jI24pCisKK3N3aWdnb19zaXplX2Fzc2VydChjaGFyLCAxKQorc3dpZ2dvX3NpemVfYXNzZXJ0KHNob3J0LCAyKQorc3dpZ2dvX3NpemVfYXNzZXJ0KGludCwgNCkKK3R5cGVkZWYgbG9uZyBsb25nIHN3aWdnb19sb25nX2xvbmc7Citzd2lnZ29fc2l6ZV9hc3NlcnQoc3dpZ2dvX2xvbmdfbG9uZywgOCkKK3N3aWdnb19zaXplX2Fzc2VydChmbG9hdCwgNCkKK3N3aWdnb19zaXplX2Fzc2VydChkb3VibGUsIDgpCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK2V4dGVybiB2b2lkIGNyb3NzY2FsbDIodm9pZCAoKmZuKSh2b2lkICosIGludCksIHZvaWQgKiwgaW50KTsKK2V4dGVybiB2b2lkIF9jZ29fYWxsb2NhdGUodm9pZCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX2Nnb19wYW5pYyh2b2lkICosIGludCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCAqX3N3aWdfZ29hbGxvY2F0ZShzaXplX3QgbGVuKSB7CisgIHN0cnVjdCB7CisgICAgc2l6ZV90IGxlbjsKKyAgICB2b2lkICpyZXQ7CisgIH0gYTsKKyAgYS5sZW4gPSBsZW47CisgIGNyb3NzY2FsbDIoX2Nnb19hbGxvY2F0ZSwgJmEsIChpbnQpIHNpemVvZiBhKTsKKyAgcmV0dXJuIGEucmV0OworfQorCitzdGF0aWMgdm9pZCBfc3dpZ19nb3BhbmljKGNvbnN0IGNoYXIgKnApIHsKKyAgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpwOworICB9IGE7CisgIGEucCA9IHA7CisgIGNyb3NzY2FsbDIoX2Nnb19wYW5pYywgJmEsIChpbnQpIHNpemVvZiBhKTsKK30KKworCisKKworc3RhdGljIF9nb3N0cmluZ18gX3N3aWdfbWFrZWdvc3RyaW5nKGNvbnN0IGNoYXIgKnAsIHNpemVfdCBsKSB7CisgIF9nb3N0cmluZ18gcmV0OworICByZXQucCA9IChjaGFyKilfc3dpZ19nb2FsbG9jYXRlKGwgKyAxKTsKKyAgbWVtY3B5KHJldC5wLCBwLCBsKTsKKyAgcmV0Lm4gPSBsOworICByZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNXSUdfY29udHJhY3RfYXNzZXJ0KGV4cHIsIG1zZykgXAorICBpZiAoIShleHByKSkgeyBfc3dpZ19nb3BhbmljKG1zZyk7IH0gZWxzZQorCisKKyNkZWZpbmUgU1dJR19leGNlcHRpb24oY29kZSwgbXNnKSBfc3dpZ19nb3BhbmljKG1zZykKKworCisjaW5jbHVkZSAid2VicC9kZWNvZGUuaCIKKyNpbmNsdWRlICJ3ZWJwL2VuY29kZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3ZvaWQKK193cmFwX1dlYlBHZXREZWNvZGVyVmVyc2lvbih2b2lkICpzd2lnX3YpCit7CisgIGludCByZXN1bHQ7CisKKyAgc3RydWN0IHN3aWdhcmdzIHsKKyAgICBsb25nIDogMDsKKyAgICBpbnRnbyByZXN1bHQ7CisgIH0gKnN3aWdfYSA9IChzdHJ1Y3Qgc3dpZ2FyZ3MgKikgc3dpZ192OworCisKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RGVjb2RlclZlcnNpb24oKTsKKyAgc3dpZ19hLT5yZXN1bHQgPSByZXN1bHQ7Cit9CisKKwordm9pZAorX3dyYXBfd3JhcHBlZF9XZWJQR2V0SW5mbyh2b2lkICpzd2lnX3YpCit7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzdWx0OworCisgIHN0cnVjdCBzd2lnYXJncyB7CisgICAgX2dvc3RyaW5nXyBhcmcxOworICAgIF9nb3NsaWNlXyBhcmczOworICAgIF9nb3NsaWNlXyBhcmc0OworICAgIGxvbmcgOiAwOworICAgIGludGdvIHJlc3VsdDsKKyAgfSAqc3dpZ19hID0gKHN0cnVjdCBzd2lnYXJncyAqKSBzd2lnX3Y7CisKKworICBhcmcxID0gKHVpbnQ4X3QgKilzd2lnX2EtPmFyZzEucDsKKyAgYXJnMiA9IChzaXplX3Qpc3dpZ19hLT5hcmcxLm47CisKKyAgeworICAgIGlmIChzd2lnX2EtPmFyZzMubGVuID09IDApIHsKKyAgICAgIF9zd2lnX2dvcGFuaWMoImFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICB9CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgfQorICB7CisgICAgaWYgKHN3aWdfYS0+YXJnNC5sZW4gPT0gMCkgeworICAgICAgX3N3aWdfZ29wYW5pYygiYXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0SW5mbygodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBzd2lnX2EtPnJlc3VsdCA9IHJlc3VsdDsKKyAgeworICAgIGludCogYSA9IChpbnQgKikgc3dpZ19hLT5hcmczLmFycmF5OworICAgIGFbMF0gPSB0ZW1wMzsKKyAgfQorICB7CisgICAgaW50KiBhID0gKGludCAqKSBzd2lnX2EtPmFyZzQuYXJyYXk7CisgICAgYVswXSA9IHRlbXA0OworICB9CisKKworfQorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9qYXZhX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9qYXZhX3dyYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGQ0YjEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9saWJ3ZWJwX2phdmFfd3JhcC5jCkBAIC0wLDAgKzEsMTc2NSBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBTV0lHIChodHRwOi8vd3d3LnN3aWcub3JnKS4KKyAqIFZlcnNpb24gMi4wLjQKKyAqCisgKiBUaGlzIGZpbGUgaXMgbm90IGludGVuZGVkIHRvIGJlIGVhc2lseSByZWFkYWJsZSBhbmQgY29udGFpbnMgYSBudW1iZXIgb2YKKyAqIGNvZGluZyBjb252ZW50aW9ucyBkZXNpZ25lZCB0byBpbXByb3ZlIHBvcnRhYmlsaXR5IGFuZCBlZmZpY2llbmN5LiBEbyBub3QgbWFrZQorICogY2hhbmdlcyB0byB0aGlzIGZpbGUgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy0tbW9kaWZ5IHRoZSBTV0lHCisgKiBpbnRlcmZhY2UgZmlsZSBpbnN0ZWFkLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBTV0lHSkFWQQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIFRoaXMgc2VjdGlvbiBjb250YWlucyBnZW5lcmljIFNXSUcgbGFiZWxzIGZvciBtZXRob2QvdmFyaWFibGUKKyAqICBkZWNsYXJhdGlvbnMvYXR0cmlidXRlcywgYW5kIG90aGVyIGNvbXBpbGVyIGRlcGVuZGVudCBsYWJlbHMuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB0ZW1wbGF0ZSB3b3JrYXJvdW5kIGZvciBjb21waWxlcnMgdGhhdCBjYW5ub3QgY29ycmVjdGx5IGltcGxlbWVudCB0aGUgQysrIHN0YW5kYXJkICovCisjaWZuZGVmIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IKKyMgaWYgZGVmaW5lZChfX1NVTlBST19DQykgJiYgKF9fU1VOUFJPX0NDIDw9IDB4NTYwKQorIyAgZGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdGVtcGxhdGUKKyMgZWxpZiBkZWZpbmVkKF9fSFBfYUNDKQorLyogTmVlZGVkIGV2ZW4gd2l0aCBgYUNDIC1BQScgd2hlbiBgYUNDIC1WJyByZXBvcnRzIEhQIEFOU0kgQysrIEIzOTEwQiBBLjAzLjU1ICovCisvKiBJZiB3ZSBmaW5kIGEgbWF4aW11bSB2ZXJzaW9uIHRoYXQgcmVxdWlyZXMgdGhpcywgdGhlIHRlc3Qgd291bGQgYmUgX19IUF9hQ0MgPD0gMzU1MDAgZm9yIEEuMDMuNTUgKi8KKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsc2UKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGVuZGlmCisjZW5kaWYKKworLyogaW5saW5lIGF0dHJpYnV0ZSAqLworI2lmbmRlZiBTV0lHSU5MSU5FCisjIGlmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX1NUUklDVF9BTlNJX18pKQorIyAgIGRlZmluZSBTV0lHSU5MSU5FIGlubGluZQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdJTkxJTkUKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBhdHRyaWJ1dGUgcmVjb2duaXNlZCBieSBzb21lIGNvbXBpbGVycyB0byBhdm9pZCAndW51c2VkJyB3YXJuaW5ncyAqLworI2lmbmRlZiBTV0lHVU5VU0VECisjIGlmIGRlZmluZWQoX19HTlVDX18pCisjICAgaWYgIShkZWZpbmVkKF9fY3BsdXNwbHVzKSkgfHwgKF9fR05VQ19fID4gMyB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KSkKKyMgICAgIGRlZmluZSBTV0lHVU5VU0VEIF9fYXR0cmlidXRlX18gKChfX3VudXNlZF9fKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRAorIyAgIGVuZGlmCisjIGVsaWYgZGVmaW5lZChfX0lDQykKKyMgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR19NU0NfVU5TVVBQUkVTU180NTA1CisjIGlmIGRlZmluZWQoX01TQ19WRVIpCisjICAgcHJhZ21hIHdhcm5pbmcoZGlzYWJsZSA6IDQ1MDUpIC8qIHVucmVmZXJlbmNlZCBsb2NhbCBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHVU5VU0VEUEFSTQorIyBpZmRlZiBfX2NwbHVzcGx1cworIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRURQQVJNKHApIHAgU1dJR1VOVVNFRAorIyBlbmRpZgorI2VuZGlmCisKKy8qIGludGVybmFsIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk4KKyMgZGVmaW5lIFNXSUdJTlRFUk4gc3RhdGljIFNXSUdVTlVTRUQKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBpbmxpbmUgU1dJRyBtZXRob2QgKi8KKyNpZm5kZWYgU1dJR0lOVEVSTklOTElORQorIyBkZWZpbmUgU1dJR0lOVEVSTklOTElORSBTV0lHSU5URVJOIFNXSUdJTkxJTkUKKyNlbmRpZgorCisvKiBleHBvcnRpbmcgbWV0aG9kcyAqLworI2lmIChfX0dOVUNfXyA+PSA0KSB8fCAoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSA0KQorIyAgaWZuZGVmIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgICAgZGVmaW5lIEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBTV0lHRVhQT1JUCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGlmIGRlZmluZWQoU1RBVElDX0xJTktFRCkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdFWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgZW5kaWYKKyMgZWxzZQorIyAgIGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoR0NDX0hBU0NMQVNTVklTSUJJTElUWSkKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUCisjICAgZW5kaWYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBjYWxsaW5nIGNvbnZlbnRpb25zIGZvciBXaW5kb3dzICovCisjaWZuZGVmIFNXSUdTVERDQUxMCisjIGlmIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fV0lOMzJfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTCBfX3N0ZGNhbGwKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHU1REQ0FMTAorIyBlbmRpZgorI2VuZGlmCisKKy8qIERlYWwgd2l0aCBNaWNyb3NvZnQncyBhdHRlbXB0IGF0IGRlcHJlY2F0aW5nIEMgc3RhbmRhcmQgcnVudGltZSBmdW5jdGlvbnMgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBtZXRob2RzIGluIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSAqLworI2lmICFkZWZpbmVkKFNXSUdfTk9fU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpICYmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURSkKKyMgZGVmaW5lIF9TQ0xfU0VDVVJFX05PX0RFUFJFQ0FURQorI2VuZGlmCisKKworCisvKiBGaXggZm9yIGpsb25nIG9uIHNvbWUgdmVyc2lvbnMgb2YgZ2NjIG9uIFdpbmRvd3MgKi8KKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQorICB0eXBlZGVmIGxvbmcgbG9uZyBfX2ludDY0OworI2VuZGlmCisKKy8qIEZpeCBmb3Igamxvbmcgb24gNjQtYml0IHg4NiBTb2xhcmlzICovCisjaWYgZGVmaW5lZChfX3g4Nl82NCkKKyMgaWZkZWYgX0xQNjQKKyMgICB1bmRlZiBfTFA2NAorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworCisvKiBTdXBwb3J0IGZvciB0aHJvd2luZyBKYXZhIGV4Y2VwdGlvbnMgKi8KK3R5cGVkZWYgZW51bSB7CisgIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IgPSAxLAorICBTV0lHX0phdmFJT0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhUnVudGltZUV4Y2VwdGlvbiwKKyAgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhQXJpdGhtZXRpY0V4Y2VwdGlvbiwKKyAgU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLAorICBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwKKyAgU1dJR19KYXZhRGlyZWN0b3JQdXJlVmlydHVhbCwKKyAgU1dJR19KYXZhVW5rbm93bkVycm9yCit9IFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzOworCit0eXBlZGVmIHN0cnVjdCB7CisgIFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzIGNvZGU7CisgIGNvbnN0IGNoYXIgKmphdmFfZXhjZXB0aW9uOworfSBTV0lHX0phdmFFeGNlcHRpb25zX3Q7CisKKworc3RhdGljIHZvaWQgU1dJR1VOVVNFRCBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihKTklFbnYgKmplbnYsIFNXSUdfSmF2YUV4Y2VwdGlvbkNvZGVzIGNvZGUsIGNvbnN0IGNoYXIgKm1zZykgeworICBqY2xhc3MgZXhjZXA7CisgIHN0YXRpYyBjb25zdCBTV0lHX0phdmFFeGNlcHRpb25zX3QgamF2YV9leGNlcHRpb25zW10gPSB7CisgICAgeyBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiamF2YS9sYW5nL091dE9mTWVtb3J5RXJyb3IiIH0sCisgICAgeyBTV0lHX0phdmFJT0V4Y2VwdGlvbiwgImphdmEvaW8vSU9FeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFSdW50aW1lRXhjZXB0aW9uLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiamF2YS9sYW5nL0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFBcml0aG1ldGljRXhjZXB0aW9uLCAiamF2YS9sYW5nL0FyaXRobWV0aWNFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sICJqYXZhL2xhbmcvSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIiB9LAorICAgIHsgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJqYXZhL2xhbmcvTnVsbFBvaW50ZXJFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFEaXJlY3RvclB1cmVWaXJ0dWFsLCAiamF2YS9sYW5nL1J1bnRpbWVFeGNlcHRpb24iIH0sCisgICAgeyBTV0lHX0phdmFVbmtub3duRXJyb3IsICAiamF2YS9sYW5nL1Vua25vd25FcnJvciIgfSwKKyAgICB7IChTV0lHX0phdmFFeGNlcHRpb25Db2RlcykwLCAgImphdmEvbGFuZy9Vbmtub3duRXJyb3IiIH0KKyAgfTsKKyAgY29uc3QgU1dJR19KYXZhRXhjZXB0aW9uc190ICpleGNlcHRfcHRyID0gamF2YV9leGNlcHRpb25zOworCisgIHdoaWxlIChleGNlcHRfcHRyLT5jb2RlICE9IGNvZGUgJiYgZXhjZXB0X3B0ci0+Y29kZSkKKyAgICBleGNlcHRfcHRyKys7CisKKyAgKCpqZW52KS0+RXhjZXB0aW9uQ2xlYXIoamVudik7CisgIGV4Y2VwID0gKCpqZW52KS0+RmluZENsYXNzKGplbnYsIGV4Y2VwdF9wdHItPmphdmFfZXhjZXB0aW9uKTsKKyAgaWYgKGV4Y2VwKQorICAgICgqamVudiktPlRocm93TmV3KGplbnYsIGV4Y2VwLCBtc2cpOworfQorCisKKy8qIENvbnRyYWN0IHN1cHBvcnQgKi8KKworI2RlZmluZSBTV0lHX2NvbnRyYWN0X2Fzc2VydChudWxscmV0dXJuLCBleHByLCBtc2cpIGlmICghKGV4cHIpKSB7U1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBtc2cpOyByZXR1cm4gbnVsbHJldHVybjsgfSBlbHNlCisKKy8qICBFcnJvcnMgaW4gU1dJRyAqLworI2RlZmluZSAgU1dJR19Vbmtub3duRXJyb3IgICAgICAgICAtMQorI2RlZmluZSAgU1dJR19JT0Vycm9yICAgICAgICAgICAgICAtMgorI2RlZmluZSAgU1dJR19SdW50aW1lRXJyb3IgICAgICAgICAtMworI2RlZmluZSAgU1dJR19JbmRleEVycm9yICAgICAgICAgICAtNAorI2RlZmluZSAgU1dJR19UeXBlRXJyb3IgICAgICAgICAgICAtNQorI2RlZmluZSAgU1dJR19EaXZpc2lvbkJ5WmVybyAgICAgICAtNgorI2RlZmluZSAgU1dJR19PdmVyZmxvd0Vycm9yICAgICAgICAtNworI2RlZmluZSAgU1dJR19TeW50YXhFcnJvciAgICAgICAgICAtOAorI2RlZmluZSAgU1dJR19WYWx1ZUVycm9yICAgICAgICAgICAtOQorI2RlZmluZSAgU1dJR19TeXN0ZW1FcnJvciAgICAgICAgICAtMTAKKyNkZWZpbmUgIFNXSUdfQXR0cmlidXRlRXJyb3IgICAgICAgLTExCisjZGVmaW5lICBTV0lHX01lbW9yeUVycm9yICAgICAgICAgIC0xMgorI2RlZmluZSAgU1dJR19OdWxsUmVmZXJlbmNlRXJyb3IgICAtMTMKKworCisKKworU1dJR0lOVEVSTiB2b2lkIFNXSUdfSmF2YUV4Y2VwdGlvbihKTklFbnYgKmplbnYsIGludCBjb2RlLCBjb25zdCBjaGFyICptc2cpIHsKKyAgU1dJR19KYXZhRXhjZXB0aW9uQ29kZXMgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFVbmtub3duRXJyb3I7CisgIHN3aXRjaChjb2RlKSB7CisgIGNhc2UgU1dJR19NZW1vcnlFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19JT0Vycm9yOgorICAgIGV4Y2VwdGlvbl9jb2RlID0gU1dJR19KYXZhSU9FeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeXN0ZW1FcnJvcjoKKyAgY2FzZSBTV0lHX1J1bnRpbWVFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YVJ1bnRpbWVFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19PdmVyZmxvd0Vycm9yOgorICBjYXNlIFNXSUdfSW5kZXhFcnJvcjoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19EaXZpc2lvbkJ5WmVybzoKKyAgICBleGNlcHRpb25fY29kZSA9IFNXSUdfSmF2YUFyaXRobWV0aWNFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeW50YXhFcnJvcjoKKyAgY2FzZSBTV0lHX1ZhbHVlRXJyb3I6CisgIGNhc2UgU1dJR19UeXBlRXJyb3I6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb247CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19Vbmtub3duRXJyb3I6CisgIGRlZmF1bHQ6CisgICAgZXhjZXB0aW9uX2NvZGUgPSBTV0lHX0phdmFVbmtub3duRXJyb3I7CisgICAgYnJlYWs7CisgIH0KKyAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgZXhjZXB0aW9uX2NvZGUsIG1zZyk7Cit9CisKKworI2lmIGRlZmluZWQoU1dJR19OT0lOQ0xVREUpIHx8IGRlZmluZWQoU1dJR19OT0FSUkFZUykKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblNjaGFyIChKTklFbnYgKmplbnYsIGpieXRlICoqamFyciwgc2lnbmVkIGNoYXIgKipjYXJyLCBqYnl0ZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRTY2hhciAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgc2lnbmVkIGNoYXIgKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpOworamJ5dGVBcnJheSBTV0lHX0phdmFBcnJheU91dFNjaGFyIChKTklFbnYgKmplbnYsIHNpZ25lZCBjaGFyICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqKmphcnIsIHVuc2lnbmVkIGNoYXIgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWNoYXIgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCB1bnNpZ25lZCBjaGFyICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Citqc2hvcnRBcnJheSBTV0lHX0phdmFBcnJheU91dFVjaGFyIChKTklFbnYgKmplbnYsIHVuc2lnbmVkIGNoYXIgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluU2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICoqamFyciwgc2hvcnQgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2hvcnQgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCBzaG9ydCAqY2FyciwganNob3J0QXJyYXkgaW5wdXQpOworanNob3J0QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRTaG9ydCAoSk5JRW52ICpqZW52LCBzaG9ydCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Vc2hvcnQgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIHVuc2lnbmVkIHNob3J0ICoqY2FyciwgamludEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVc2hvcnQgKEpOSUVudiAqamVudiwgamludCAqamFyciwgdW5zaWduZWQgc2hvcnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7CitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVc2hvcnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgc2hvcnQgKnJlc3VsdCwganNpemUgc3opOworCisKK2ludCBTV0lHX0phdmFBcnJheUluSW50IChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCBpbnQgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dEludCAoSk5JRW52ICpqZW52LCBqaW50ICpqYXJyLCBpbnQgKmNhcnIsIGppbnRBcnJheSBpbnB1dCk7CitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRJbnQgKEpOSUVudiAqamVudiwgaW50ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJblVpbnQgKEpOSUVudiAqamVudiwgamxvbmcgKipqYXJyLCB1bnNpZ25lZCBpbnQgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50IChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBpbnQgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpOworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgaW50ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJbkxvbmcgKEpOSUVudiAqamVudiwgamludCAqKmphcnIsIGxvbmcgKipjYXJyLCBqaW50QXJyYXkgaW5wdXQpOwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmcgKEpOSUVudiAqamVudiwgamludCAqamFyciwgbG9uZyAqY2FyciwgamludEFycmF5IGlucHV0KTsKK2ppbnRBcnJheSBTV0lHX0phdmFBcnJheU91dExvbmcgKEpOSUVudiAqamVudiwgbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIHVuc2lnbmVkIGxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqamFyciwgdW5zaWduZWQgbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7CitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0VWxvbmcgKEpOSUVudiAqamVudiwgdW5zaWduZWQgbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5Mb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIGpsb25nICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCk7Cit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0TG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKmphcnIsIGpsb25nICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KTsKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRMb25nbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworaW50IFNXSUdfSmF2YUFycmF5SW5GbG9hdCAoSk5JRW52ICpqZW52LCBqZmxvYXQgKipqYXJyLCBmbG9hdCAqKmNhcnIsIGpmbG9hdEFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRGbG9hdCAoSk5JRW52ICpqZW52LCBqZmxvYXQgKmphcnIsIGZsb2F0ICpjYXJyLCBqZmxvYXRBcnJheSBpbnB1dCk7CitqZmxvYXRBcnJheSBTV0lHX0phdmFBcnJheU91dEZsb2F0IChKTklFbnYgKmplbnYsIGZsb2F0ICpyZXN1bHQsIGpzaXplIHN6KTsKKworCitpbnQgU1dJR19KYXZhQXJyYXlJbkRvdWJsZSAoSk5JRW52ICpqZW52LCBqZG91YmxlICoqamFyciwgZG91YmxlICoqY2FyciwgamRvdWJsZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXREb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqamFyciwgZG91YmxlICpjYXJyLCBqZG91YmxlQXJyYXkgaW5wdXQpOworamRvdWJsZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0RG91YmxlIChKTklFbnYgKmplbnYsIGRvdWJsZSAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworI2Vsc2UKKworCisvKiBzaWduZWQgY2hhcltdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluU2NoYXIgKEpOSUVudiAqamVudiwgamJ5dGUgKipqYXJyLCBzaWduZWQgY2hhciAqKmNhcnIsIGpieXRlQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6OworICBpZiAoIWlucHV0KSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJudWxsIGFycmF5Iik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgICpqYXJyID0gKCpqZW52KS0+R2V0Qnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChzaWduZWQgY2hhciopIGNhbGxvYyhzeiwgc2l6ZW9mKHNpZ25lZCBjaGFyKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHNpZ25lZCBjaGFyKSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0U2NoYXIgKEpOSUVudiAqamVudiwgamJ5dGUgKmphcnIsIHNpZ25lZCBjaGFyICpjYXJyLCBqYnl0ZUFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpieXRlKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pieXRlQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRTY2hhciAoSk5JRW52ICpqZW52LCBzaWduZWQgY2hhciAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqYnl0ZSAqYXJyOworICBpbnQgaTsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3Qnl0ZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpieXRlKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIHVuc2lnbmVkIGNoYXJbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJblVjaGFyIChKTklFbnYgKmplbnYsIGpzaG9ydCAqKmphcnIsIHVuc2lnbmVkIGNoYXIgKipjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9ICh1bnNpZ25lZCBjaGFyKikgY2FsbG9jKHN6LCBzaXplb2YodW5zaWduZWQgY2hhcikpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBjaGFyKSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0VWNoYXIgKEpOSUVudiAqamVudiwganNob3J0ICpqYXJyLCB1bnNpZ25lZCBjaGFyICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqc2hvcnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pzaG9ydEFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWNoYXIgKEpOSUVudiAqamVudiwgdW5zaWduZWQgY2hhciAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqc2hvcnQgKmFycjsKKyAgaW50IGk7CisgIGpzaG9ydEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdTaG9ydEFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRTaG9ydEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqc2hvcnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlU2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKy8qIHNob3J0W10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5TaG9ydCAoSk5JRW52ICpqZW52LCBqc2hvcnQgKipqYXJyLCBzaG9ydCAqKmNhcnIsIGpzaG9ydEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldFNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHNob3J0KikgY2FsbG9jKHN6LCBzaXplb2Yoc2hvcnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAoc2hvcnQpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRTaG9ydCAoSk5JRW52ICpqZW52LCBqc2hvcnQgKmphcnIsIHNob3J0ICpjYXJyLCBqc2hvcnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqc2hvcnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2pzaG9ydEFycmF5IFNXSUdfSmF2YUFycmF5T3V0U2hvcnQgKEpOSUVudiAqamVudiwgc2hvcnQgKnJlc3VsdCwganNpemUgc3opIHsKKyAganNob3J0ICphcnI7CisgIGludCBpOworICBqc2hvcnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3U2hvcnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0U2hvcnRBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoanNob3J0KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZVNob3J0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiB1bnNpZ25lZCBzaG9ydFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVXNob3J0IChKTklFbnYgKmplbnYsIGppbnQgKipqYXJyLCB1bnNpZ25lZCBzaG9ydCAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAodW5zaWduZWQgc2hvcnQqKSBjYWxsb2Moc3osIHNpemVvZih1bnNpZ25lZCBzaG9ydCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBzaG9ydCkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVzaG9ydCAoSk5JRW52ICpqZW52LCBqaW50ICpqYXJyLCB1bnNpZ25lZCBzaG9ydCAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVc2hvcnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgc2hvcnQgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamludCAqYXJyOworICBpbnQgaTsKKyAgamludEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdJbnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGppbnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiBpbnRbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkludCAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgaW50ICoqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChpbnQqKSBjYWxsb2Moc3osIHNpemVvZihpbnQpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAoaW50KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0SW50IChKTklFbnYgKmplbnYsIGppbnQgKmphcnIsIGludCAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRJbnQgKEpOSUVudiAqamVudiwgaW50ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGppbnQgKmFycjsKKyAgaW50IGk7CisgIGppbnRBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3SW50QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqaW50KXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogdW5zaWduZWQgaW50W10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5VaW50IChKTklFbnYgKmplbnYsIGpsb25nICoqamFyciwgdW5zaWduZWQgaW50ICoqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVuc2lnbmVkIGludCopIGNhbGxvYyhzeiwgc2l6ZW9mKHVuc2lnbmVkIGludCkpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9ICh1bnNpZ25lZCBpbnQpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50IChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBpbnQgKmNhcnIsIGpsb25nQXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamxvbmcpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUxvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamxvbmdBcnJheSBTV0lHX0phdmFBcnJheU91dFVpbnQgKEpOSUVudiAqamVudiwgdW5zaWduZWQgaW50ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpsb25nICphcnI7CisgIGludCBpOworICBqbG9uZ0FycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdMb25nQXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamxvbmcpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogbG9uZ1tdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluTG9uZyAoSk5JRW52ICpqZW52LCBqaW50ICoqamFyciwgbG9uZyAqKmNhcnIsIGppbnRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRJbnRBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAobG9uZyopIGNhbGxvYyhzeiwgc2l6ZW9mKGxvbmcpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAobG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmcgKEpOSUVudiAqamVudiwgamludCAqamFyciwgbG9uZyAqY2FyciwgamludEFycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGppbnQpY2FycltpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUludEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqaW50QXJyYXkgU1dJR19KYXZhQXJyYXlPdXRMb25nIChKTklFbnYgKmplbnYsIGxvbmcgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamludCAqYXJyOworICBpbnQgaTsKKyAgamludEFycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdJbnRBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0SW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGppbnQpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiB1bnNpZ25lZCBsb25nW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5VbG9uZyAoSk5JRW52ICpqZW52LCBqbG9uZyAqKmphcnIsIHVuc2lnbmVkIGxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAodW5zaWduZWQgbG9uZyopIGNhbGxvYyhzeiwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKyAgaWYgKCEqY2FycikgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU91dE9mTWVtb3J5RXJyb3IsICJhcnJheSBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgICgqY2FycilbaV0gPSAodW5zaWduZWQgbG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dFVsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCB1bnNpZ25lZCBsb25nICpjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBqYXJyW2ldID0gKGpsb25nKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgamFyciwgMCk7Cit9CisKK2psb25nQXJyYXkgU1dJR19KYXZhQXJyYXlPdXRVbG9uZyAoSk5JRW52ICpqZW52LCB1bnNpZ25lZCBsb25nICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpsb25nICphcnI7CisgIGludCBpOworICBqbG9uZ0FycmF5IGpyZXN1bHQgPSAoKmplbnYpLT5OZXdMb25nQXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamxvbmcpcmVzdWx0W2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogamxvbmdbXSBzdXBwb3J0ICovCitpbnQgU1dJR19KYXZhQXJyYXlJbkxvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICoqamFyciwgamxvbmcgKipjYXJyLCBqbG9uZ0FycmF5IGlucHV0KSB7CisgIGludCBpOworICBqc2l6ZSBzejsKKyAgaWYgKCFpbnB1dCkgeworICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAibnVsbCBhcnJheSIpOworICAgIHJldHVybiAwOworICB9CisgIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICAqamFyciA9ICgqamVudiktPkdldExvbmdBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoamxvbmcqKSBjYWxsb2Moc3osIHNpemVvZihqbG9uZykpOworICBpZiAoISpjYXJyKSB7CisgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhT3V0T2ZNZW1vcnlFcnJvciwgImFycmF5IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgIHJldHVybiAwOworICB9CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgKCpjYXJyKVtpXSA9IChqbG9uZykoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dExvbmdsb25nIChKTklFbnYgKmplbnYsIGpsb25nICpqYXJyLCBqbG9uZyAqY2FyciwgamxvbmdBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqbG9uZyljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlTG9uZ0FycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqbG9uZ0FycmF5IFNXSUdfSmF2YUFycmF5T3V0TG9uZ2xvbmcgKEpOSUVudiAqamVudiwgamxvbmcgKnJlc3VsdCwganNpemUgc3opIHsKKyAgamxvbmcgKmFycjsKKyAgaW50IGk7CisgIGpsb25nQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0xvbmdBcnJheShqZW52LCBzeik7CisgIGlmICghanJlc3VsdCkKKyAgICByZXR1cm4gTlVMTDsKKyAgYXJyID0gKCpqZW52KS0+R2V0TG9uZ0FycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgMCk7CisgIGlmICghYXJyKQorICAgIHJldHVybiBOVUxMOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGFycltpXSA9IChqbG9uZylyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VMb25nQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCBhcnIsIDApOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisvKiBmbG9hdFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluRmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICoqamFyciwgZmxvYXQgKipjYXJyLCBqZmxvYXRBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRGbG9hdEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIDApOworICBpZiAoISpqYXJyKQorICAgIHJldHVybiAwOworICAqY2FyciA9IChmbG9hdCopIGNhbGxvYyhzeiwgc2l6ZW9mKGZsb2F0KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGZsb2F0KSgqamFycilbaV07CisgIHJldHVybiAxOworfQorCit2b2lkIFNXSUdfSmF2YUFycmF5QXJnb3V0RmxvYXQgKEpOSUVudiAqamVudiwgamZsb2F0ICpqYXJyLCBmbG9hdCAqY2FyciwgamZsb2F0QXJyYXkgaW5wdXQpIHsKKyAgaW50IGk7CisgIGpzaXplIHN6ID0gKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgaW5wdXQpOworICBmb3IgKGk9MDsgaTxzejsgaSsrKQorICAgIGphcnJbaV0gPSAoamZsb2F0KWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqZmxvYXRBcnJheSBTV0lHX0phdmFBcnJheU91dEZsb2F0IChKTklFbnYgKmplbnYsIGZsb2F0ICpyZXN1bHQsIGpzaXplIHN6KSB7CisgIGpmbG9hdCAqYXJyOworICBpbnQgaTsKKyAgamZsb2F0QXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0Zsb2F0QXJyYXkoamVudiwgc3opOworICBpZiAoIWpyZXN1bHQpCisgICAgcmV0dXJuIE5VTEw7CisgIGFyciA9ICgqamVudiktPkdldEZsb2F0QXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpmbG9hdClyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoamVudiwganJlc3VsdCwgYXJyLCAwKTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworLyogZG91YmxlW10gc3VwcG9ydCAqLworaW50IFNXSUdfSmF2YUFycmF5SW5Eb3VibGUgKEpOSUVudiAqamVudiwgamRvdWJsZSAqKmphcnIsIGRvdWJsZSAqKmNhcnIsIGpkb3VibGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCAwKTsKKyAgaWYgKCEqamFycikKKyAgICByZXR1cm4gMDsKKyAgKmNhcnIgPSAoZG91YmxlKikgY2FsbG9jKHN6LCBzaXplb2YoZG91YmxlKSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKGRvdWJsZSkoKmphcnIpW2ldOworICByZXR1cm4gMTsKK30KKwordm9pZCBTV0lHX0phdmFBcnJheUFyZ291dERvdWJsZSAoSk5JRW52ICpqZW52LCBqZG91YmxlICpqYXJyLCBkb3VibGUgKmNhcnIsIGpkb3VibGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqZG91YmxlKWNhcnJbaV07CisgICgqamVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGlucHV0LCBqYXJyLCAwKTsKK30KKworamRvdWJsZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0RG91YmxlIChKTklFbnYgKmplbnYsIGRvdWJsZSAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqZG91YmxlICphcnI7CisgIGludCBpOworICBqZG91YmxlQXJyYXkganJlc3VsdCA9ICgqamVudiktPk5ld0RvdWJsZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXREb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIDApOworICBpZiAoIWFycikKKyAgICByZXR1cm4gTlVMTDsKKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICBhcnJbaV0gPSAoamRvdWJsZSlyZXN1bHRbaV07CisgICgqamVudiktPlJlbGVhc2VEb3VibGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKyNlbmRpZgorCisKKyNpbmNsdWRlICJ3ZWJwL3R5cGVzLmgiCisKKworaW50IFNXSUdfSmF2YUFycmF5SW5VaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqKmphcnIsIHVpbnQ4X3QgKipjYXJyLCBqYnl0ZUFycmF5IGlucHV0KTsKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgdWludDhfdCAqY2FyciwgamJ5dGVBcnJheSBpbnB1dCk7CitqYnl0ZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWludDggKEpOSUVudiAqamVudiwgdWludDhfdCAqcmVzdWx0LCBqc2l6ZSBzeik7CisKKworLyogdWludDhfdFtdIHN1cHBvcnQgKi8KK2ludCBTV0lHX0phdmFBcnJheUluVWludDggKEpOSUVudiAqamVudiwgamJ5dGUgKipqYXJyLCB1aW50OF90ICoqY2FyciwgamJ5dGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3o7CisgIGlmICghaW5wdXQpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgIm51bGwgYXJyYXkiKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzeiA9ICgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGlucHV0KTsKKyAgKmphcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBpbnB1dCwgMCk7CisgIGlmICghKmphcnIpCisgICAgcmV0dXJuIDA7CisgICpjYXJyID0gKHVpbnQ4X3QqKSBjYWxsb2Moc3osIHNpemVvZih1aW50OF90KSk7CisgIGlmICghKmNhcnIpIHsKKyAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFPdXRPZk1lbW9yeUVycm9yLCAiYXJyYXkgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZm9yIChpPTA7IGk8c3o7IGkrKykKKyAgICAoKmNhcnIpW2ldID0gKHVpbnQ4X3QpKCpqYXJyKVtpXTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OCAoSk5JRW52ICpqZW52LCBqYnl0ZSAqamFyciwgdWludDhfdCAqY2FyciwgamJ5dGVBcnJheSBpbnB1dCkgeworICBpbnQgaTsKKyAganNpemUgc3ogPSAoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBpbnB1dCk7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgamFycltpXSA9IChqYnl0ZSljYXJyW2ldOworICAoKmplbnYpLT5SZWxlYXNlQnl0ZUFycmF5RWxlbWVudHMoamVudiwgaW5wdXQsIGphcnIsIDApOworfQorCitqYnl0ZUFycmF5IFNXSUdfSmF2YUFycmF5T3V0VWludDggKEpOSUVudiAqamVudiwgdWludDhfdCAqcmVzdWx0LCBqc2l6ZSBzeikgeworICBqYnl0ZSAqYXJyOworICBpbnQgaTsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gKCpqZW52KS0+TmV3Qnl0ZUFycmF5KGplbnYsIHN6KTsKKyAgaWYgKCFqcmVzdWx0KQorICAgIHJldHVybiBOVUxMOworICBhcnIgPSAoKmplbnYpLT5HZXRCeXRlQXJyYXlFbGVtZW50cyhqZW52LCBqcmVzdWx0LCAwKTsKKyAgaWYgKCFhcnIpCisgICAgcmV0dXJuIE5VTEw7CisgIGZvciAoaT0wOyBpPHN6OyBpKyspCisgICAgYXJyW2ldID0gKGpieXRlKXJlc3VsdFtpXTsKKyAgKCpqZW52KS0+UmVsZWFzZUJ5dGVBcnJheUVsZW1lbnRzKGplbnYsIGpyZXN1bHQsIGFyciwgMCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKworI2RlZmluZSBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkgXAorICAgIChyZXN1bHQgPyAoamludClSZXR1cm5lZEJ1ZmZlclNpemUoX19GVU5DVElPTl9fLCBhcmczLCBhcmc0KSA6IDApCisKKworc3RhdGljIHNpemVfdCBSZXR1cm5lZEJ1ZmZlclNpemUoCisgICAgY29uc3QgY2hhciogZnVuY3Rpb24sIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2l6ZW1hcCB7CisgICAgY29uc3QgY2hhciogZnVuY3Rpb247CisgICAgaW50IHNpemVfbXVsdGlwbGllcjsKKyAgfSBzaXplX21hcFtdID0geworI2lmZGVmIFNXSUdKQVZBCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUFSR0IiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisjaWZkZWYgU1dJR1BZVEhPTgorICAgIHsgIldlYlBEZWNvZGVSR0IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVCR1IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKyAgY29uc3Qgc3RydWN0IHNpemVtYXAqIHA7CisgIHNpemVfdCBzaXplID0gMDsKKworICBmb3IgKHAgPSBzaXplX21hcDsgcC0+ZnVuY3Rpb247ICsrcCkgeworICAgIGlmICghc3RyY21wKGZ1bmN0aW9uLCBwLT5mdW5jdGlvbikpIHsKKyAgICAgIHNpemUgPSAqd2lkdGggKiAqaGVpZ2h0ICogcC0+c2l6ZV9tdWx0aXBsaWVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlTG9zc2xlc3NGdW5jdGlvbikoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzeShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVGdW5jdGlvbiBlbmNmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dHB1dF9zaXplLCBpbnQqIHVudXNlZCkgeworICB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBjb25zdCBzaXplX3QgaW1hZ2Vfc2l6ZSA9CisgICAgICBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieSBSZXR1cm5lZEJ1ZmZlclNpemUoKQorICAvLyBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworc3RhdGljIHVpbnQ4X3QqIEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPSBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJm91dHB1dCk7CisgIC8vIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieQorICAvLyBSZXR1cm5lZEJ1ZmZlclNpemUoKSBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworCisvLyBDaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBXZWJQRW5jb2RlKiB0byBtb3JlIGNsb3NlbHkgbWF0Y2ggRGVjb2RlKi4KKy8vIFRoaXMgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gd3JhcCB0aGUgb3V0cHV0IGJ1ZmZlciBpbiBhIG5hdGl2ZSB0eXBlIHJhdGhlcgorLy8gdGhhbiBkZWFsaW5nIHdpdGggdGhlIHJldHVybiBwb2ludGVyLgorLy8gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdG8gYWxsb3cgcmV1c2Ugb2YgUmV0dXJuZWRCdWZmZXJTaXplKCksCisvLyB1bnVzZWQyIGFuZCBvdXRwdXRfc2l6ZSB3aWxsIGJlIHVzZWQgaW4gdGhpcyBjYXNlLgorI2RlZmluZSBMT1NTWV9XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeyAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzeShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKKworI3VuZGVmIExPU1NZX1dSQVBQRVIKKworI2RlZmluZSBMT1NTTEVTU19XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzbGVzcyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKQorCisjdW5kZWYgTE9TU0xFU1NfV1JBUFBFUgorCisKKworLyogV29yayBhcm91bmQgYnJva2VuIGdjaiBqbmkuaCAqLworI2lmZGVmIF9fR0NKX0pOSV9IX18KKyMgdW5kZWYgSk5JRVhQT1JUCisjIGRlZmluZSBKTklFWFBPUlQKKyMgdW5kZWYgSk5JQ0FMTAorIyBkZWZpbmUgSk5JQ0FMTAorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitTV0lHRVhQT1JUIGppbnQgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBHZXREZWNvZGVyVmVyc2lvbihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzKSB7CisgIGppbnQganJlc3VsdCA9IDAgOworICBpbnQgcmVzdWx0OworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgIGpyZXN1bHQgPSAoamludClyZXN1bHQ7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUEdldEluZm8oSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamxvbmcgamFyZzIsIGppbnRBcnJheSBqYXJnMywgamludEFycmF5IGphcmc0KSB7CisgIGppbnQganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgamJ5dGUgKmphcnIxIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlc3VsdDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAoaW50KVdlYlBHZXRJbmZvKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSAoamludClyZXN1bHQ7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGpsb25nIGphcmcyLCBqaW50QXJyYXkgamFyZzMsIGppbnRBcnJheSBqYXJnNCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wMyA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoc2l6ZV90KWphcmcyOworICB7CisgICAgaWYgKCFqYXJnMykgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmczKSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzMgPSAmdGVtcDM7CisgIH0KKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDM7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzMsIDAsIDEsICZqdmFsdWUpOworICB9CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGpsb25nIGphcmcyLCBqaW50QXJyYXkgamFyZzMsIGppbnRBcnJheSBqYXJnNCkgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wMyA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoc2l6ZV90KWphcmcyOworICB7CisgICAgaWYgKCFqYXJnMykgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhTnVsbFBvaW50ZXJFeGNlcHRpb24sICJhcnJheSBudWxsIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYgKCgqamVudiktPkdldEFycmF5TGVuZ3RoKGplbnYsIGphcmczKSA9PSAwKSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uLCAiQXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IDEgZWxlbWVudCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGFyZzMgPSAmdGVtcDM7CisgIH0KKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQVJHQihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVBUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUJHUihKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXAzOworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmczLCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSQShKTklFbnYgKmplbnYsIGpjbGFzcyBqY2xzLCBqYnl0ZUFycmF5IGphcmcxLCBqbG9uZyBqYXJnMiwgamludEFycmF5IGphcmczLCBqaW50QXJyYXkgamFyZzQpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDMgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKHNpemVfdClqYXJnMjsKKyAgeworICAgIGlmICghamFyZzMpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnMykgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmczID0gJnRlbXAzOworICB9CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wMzsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnMywgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamludCBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUEdldEVuY29kZXJWZXJzaW9uKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMpIHsKKyAgamludCBqcmVzdWx0ID0gMCA7CisgIGludCByZXN1bHQ7CisKKyAgKHZvaWQpamVudjsKKyAgKHZvaWQpamNsczsKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAganJlc3VsdCA9IChqaW50KXJlc3VsdDsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlUkdCKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3LCBqZmxvYXQgamFyZzgpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIGFyZzggPSAoZmxvYXQpamFyZzg7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3LCBqZmxvYXQgamFyZzgpIHsKKyAgamJ5dGVBcnJheSBqcmVzdWx0ID0gMCA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgZmxvYXQgYXJnOCA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIGFyZzggPSAoZmxvYXQpamFyZzg7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcsYXJnOCk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVCR1JBKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNywgamZsb2F0IGphcmc4KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICBhcmc4ID0gKGZsb2F0KWphcmc4OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICBqcmVzdWx0ID0gU1dJR19KYXZhQXJyYXlPdXRVaW50OChqZW52LCByZXN1bHQsIEZpbGxNZUluQXNTaXplQ2Fubm90QmVEZXRlcm1pbmVkQXV0b21hdGljYWxseSk7CisgIFNXSUdfSmF2YUFycmF5QXJnb3V0VWludDgoamVudiwgamFycjEsIGFyZzEsIGphcmcxKTsKKyAgeworICAgIGppbnQganZhbHVlID0gKGppbnQpdGVtcDQ7CisgICAgKCpqZW52KS0+U2V0SW50QXJyYXlSZWdpb24oamVudiwgamFyZzQsIDAsIDEsICZqdmFsdWUpOworICB9CisgIGZyZWUoYXJnMSk7CisKKworCisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIGpyZXN1bHQ7Cit9CisKKworU1dJR0VYUE9SVCBqYnl0ZUFycmF5IEpOSUNBTEwgSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAganJlc3VsdCA9IFNXSUdfSmF2YUFycmF5T3V0VWludDgoamVudiwgcmVzdWx0LCBGaWxsTWVJbkFzU2l6ZUNhbm5vdEJlRGV0ZXJtaW5lZEF1dG9tYXRpY2FsbHkpOworICBTV0lHX0phdmFBcnJheUFyZ291dFVpbnQ4KGplbnYsIGphcnIxLCBhcmcxLCBqYXJnMSk7CisgIHsKKyAgICBqaW50IGp2YWx1ZSA9IChqaW50KXRlbXA0OworICAgICgqamVudiktPlNldEludEFycmF5UmVnaW9uKGplbnYsIGphcmc0LCAwLCAxLCAmanZhbHVlKTsKKyAgfQorICBmcmVlKGFyZzEpOworCisKKworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiBqcmVzdWx0OworfQorCisKK1NXSUdFWFBPUlQgamJ5dGVBcnJheSBKTklDQUxMIEphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSKEpOSUVudiAqamVudiwgamNsYXNzIGpjbHMsIGpieXRlQXJyYXkgamFyZzEsIGppbnQgamFyZzIsIGppbnQgamFyZzMsIGppbnRBcnJheSBqYXJnNCwgamludCBqYXJnNSwgamludCBqYXJnNiwgamludCBqYXJnNykgeworICBqYnl0ZUFycmF5IGpyZXN1bHQgPSAwIDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBqYnl0ZSAqamFycjEgOworICBpbnQgdGVtcDQgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICAodm9pZClqZW52OworICAodm9pZClqY2xzOworICBpZiAoIVNXSUdfSmF2YUFycmF5SW5VaW50OChqZW52LCAmamFycjEsICZhcmcxLCBqYXJnMSkpIHJldHVybiAwOworICBhcmcyID0gKGludCAqKSZqYXJnMjsKKyAgYXJnMyA9IChpbnQgKikmamFyZzM7CisgIHsKKyAgICBpZiAoIWphcmc0KSB7CisgICAgICBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbihqZW52LCBTV0lHX0phdmFOdWxsUG9pbnRlckV4Y2VwdGlvbiwgImFycmF5IG51bGwiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoKCpqZW52KS0+R2V0QXJyYXlMZW5ndGgoamVudiwgamFyZzQpID09IDApIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24sICJBcnJheSBtdXN0IGNvbnRhaW4gYXQgbGVhc3QgMSBlbGVtZW50Iik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgYXJnNCA9ICZ0ZW1wNDsKKyAgfQorICBhcmc1ID0gKGludClqYXJnNTsKKyAgYXJnNiA9IChpbnQpamFyZzY7CisgIGFyZzcgPSAoaW50KWphcmc3OworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCitTV0lHRVhQT1JUIGpieXRlQXJyYXkgSk5JQ0FMTCBKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc0JHUkEoSk5JRW52ICpqZW52LCBqY2xhc3MgamNscywgamJ5dGVBcnJheSBqYXJnMSwgamludCBqYXJnMiwgamludCBqYXJnMywgamludEFycmF5IGphcmc0LCBqaW50IGphcmc1LCBqaW50IGphcmc2LCBqaW50IGphcmc3KSB7CisgIGpieXRlQXJyYXkganJlc3VsdCA9IDAgOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGpieXRlICpqYXJyMSA7CisgIGludCB0ZW1wNCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgICh2b2lkKWplbnY7CisgICh2b2lkKWpjbHM7CisgIGlmICghU1dJR19KYXZhQXJyYXlJblVpbnQ4KGplbnYsICZqYXJyMSwgJmFyZzEsIGphcmcxKSkgcmV0dXJuIDA7CisgIGFyZzIgPSAoaW50ICopJmphcmcyOworICBhcmczID0gKGludCAqKSZqYXJnMzsKKyAgeworICAgIGlmICghamFyZzQpIHsKKyAgICAgIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uKGplbnYsIFNXSUdfSmF2YU51bGxQb2ludGVyRXhjZXB0aW9uLCAiYXJyYXkgbnVsbCIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICgoKmplbnYpLT5HZXRBcnJheUxlbmd0aChqZW52LCBqYXJnNCkgPT0gMCkgeworICAgICAgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24oamVudiwgU1dJR19KYXZhSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiwgIkFycmF5IG11c3QgY29udGFpbiBhdCBsZWFzdCAxIGVsZW1lbnQiKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBhcmc0ID0gJnRlbXA0OworICB9CisgIGFyZzUgPSAoaW50KWphcmc1OworICBhcmc2ID0gKGludClqYXJnNjsKKyAgYXJnNyA9IChpbnQpamFyZzc7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyk7CisgIGpyZXN1bHQgPSBTV0lHX0phdmFBcnJheU91dFVpbnQ4KGplbnYsIHJlc3VsdCwgRmlsbE1lSW5Bc1NpemVDYW5ub3RCZURldGVybWluZWRBdXRvbWF0aWNhbGx5KTsKKyAgU1dJR19KYXZhQXJyYXlBcmdvdXRVaW50OChqZW52LCBqYXJyMSwgYXJnMSwgamFyZzEpOworICB7CisgICAgamludCBqdmFsdWUgPSAoamludCl0ZW1wNDsKKyAgICAoKmplbnYpLT5TZXRJbnRBcnJheVJlZ2lvbihqZW52LCBqYXJnNCwgMCwgMSwgJmp2YWx1ZSk7CisgIH0KKyAgZnJlZShhcmcxKTsKKworCisKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4ganJlc3VsdDsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfcHl0aG9uX3dyYXAuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvbGlid2VicF9weXRob25fd3JhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWY4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC9zd2lnL2xpYndlYnBfcHl0aG9uX3dyYXAuYwpAQCAtMCwwICsxLDUzOTggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRyAoaHR0cDovL3d3dy5zd2lnLm9yZykuCisgKiBWZXJzaW9uIDIuMC40CisgKgorICogVGhpcyBmaWxlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBlYXNpbHkgcmVhZGFibGUgYW5kIGNvbnRhaW5zIGEgbnVtYmVyIG9mCisgKiBjb2RpbmcgY29udmVudGlvbnMgZGVzaWduZWQgdG8gaW1wcm92ZSBwb3J0YWJpbGl0eSBhbmQgZWZmaWNpZW5jeS4gRG8gbm90IG1ha2UKKyAqIGNoYW5nZXMgdG8gdGhpcyBmaWxlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmctLW1vZGlmeSB0aGUgU1dJRworICogaW50ZXJmYWNlIGZpbGUgaW5zdGVhZC4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgU1dJR1BZVEhPTgorI2RlZmluZSBTV0lHX1BZVEhPTl9ESVJFQ1RPUl9OT19WVEFCTEUKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZ2VuZXJpYyBTV0lHIGxhYmVscyBmb3IgbWV0aG9kL3ZhcmlhYmxlCisgKiAgZGVjbGFyYXRpb25zL2F0dHJpYnV0ZXMsIGFuZCBvdGhlciBjb21waWxlciBkZXBlbmRlbnQgbGFiZWxzLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgY29tcGlsZXJzIHRoYXQgY2Fubm90IGNvcnJlY3RseSBpbXBsZW1lbnQgdGhlIEMrKyBzdGFuZGFyZCAqLworI2lmbmRlZiBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SCisjIGlmIGRlZmluZWQoX19TVU5QUk9fQ0MpICYmIChfX1NVTlBST19DQyA8PSAweDU2MCkKKyMgIGRlZmluZSBTV0lHVEVNUExBVEVESVNBTUJJR1VBVE9SIHRlbXBsYXRlCisjIGVsaWYgZGVmaW5lZChfX0hQX2FDQykKKy8qIE5lZWRlZCBldmVuIHdpdGggYGFDQyAtQUEnIHdoZW4gYGFDQyAtVicgcmVwb3J0cyBIUCBBTlNJIEMrKyBCMzkxMEIgQS4wMy41NSAqLworLyogSWYgd2UgZmluZCBhIG1heGltdW0gdmVyc2lvbiB0aGF0IHJlcXVpcmVzIHRoaXMsIHRoZSB0ZXN0IHdvdWxkIGJlIF9fSFBfYUNDIDw9IDM1NTAwIGZvciBBLjAzLjU1ICovCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0ZW1wbGF0ZQorIyBlbHNlCisjICBkZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUgorIyBlbmRpZgorI2VuZGlmCisKKy8qIGlubGluZSBhdHRyaWJ1dGUgKi8KKyNpZm5kZWYgU1dJR0lOTElORQorIyBpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCAoZGVmaW5lZChfX0dOVUNfXykgJiYgIWRlZmluZWQoX19TVFJJQ1RfQU5TSV9fKSkKKyMgICBkZWZpbmUgU1dJR0lOTElORSBpbmxpbmUKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHSU5MSU5FCisjIGVuZGlmCisjZW5kaWYKKworLyogYXR0cmlidXRlIHJlY29nbmlzZWQgYnkgc29tZSBjb21waWxlcnMgdG8gYXZvaWQgJ3VudXNlZCcgd2FybmluZ3MgKi8KKyNpZm5kZWYgU1dJR1VOVVNFRAorIyBpZiBkZWZpbmVkKF9fR05VQ19fKQorIyAgIGlmICEoZGVmaW5lZChfX2NwbHVzcGx1cykpIHx8IChfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkpCisjICAgICBkZWZpbmUgU1dJR1VOVVNFRCBfX2F0dHJpYnV0ZV9fICgoX191bnVzZWRfXykpCisjICAgZWxzZQorIyAgICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgICBlbmRpZgorIyBlbGlmIGRlZmluZWQoX19JQ0MpCisjICAgZGVmaW5lIFNXSUdVTlVTRUQgX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorIyBlbHNlCisjICAgZGVmaW5lIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFNXSUdfTVNDX1VOU1VQUFJFU1NfNDUwNQorIyBpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyAgIHByYWdtYSB3YXJuaW5nKGRpc2FibGUgOiA0NTA1KSAvKiB1bnJlZmVyZW5jZWQgbG9jYWwgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCAqLworIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR1VOVVNFRFBBUk0KKyMgaWZkZWYgX19jcGx1c3BsdXMKKyMgICBkZWZpbmUgU1dJR1VOVVNFRFBBUk0ocCkKKyMgZWxzZQorIyAgIGRlZmluZSBTV0lHVU5VU0VEUEFSTShwKSBwIFNXSUdVTlVTRUQKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBpbnRlcm5hbCBTV0lHIG1ldGhvZCAqLworI2lmbmRlZiBTV0lHSU5URVJOCisjIGRlZmluZSBTV0lHSU5URVJOIHN0YXRpYyBTV0lHVU5VU0VECisjZW5kaWYKKworLyogaW50ZXJuYWwgaW5saW5lIFNXSUcgbWV0aG9kICovCisjaWZuZGVmIFNXSUdJTlRFUk5JTkxJTkUKKyMgZGVmaW5lIFNXSUdJTlRFUk5JTkxJTkUgU1dJR0lOVEVSTiBTV0lHSU5MSU5FCisjZW5kaWYKKworLyogZXhwb3J0aW5nIG1ldGhvZHMgKi8KKyNpZiAoX19HTlVDX18gPj0gNCkgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gNCkKKyMgIGlmbmRlZiBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICAgIGRlZmluZSBHQ0NfSEFTQ0xBU1NWSVNJQklMSVRZCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR0VYUE9SVAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBpZiBkZWZpbmVkKFNUQVRJQ19MSU5LRUQpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVsc2UKKyMgICAgIGRlZmluZSBTV0lHRVhQT1JUIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgIGVuZGlmCisjIGVsc2UKKyMgICBpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKEdDQ19IQVNDTEFTU1ZJU0lCSUxJVFkpCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVCBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyMgICBlbHNlCisjICAgICBkZWZpbmUgU1dJR0VYUE9SVAorIyAgIGVuZGlmCisjIGVuZGlmCisjZW5kaWYKKworLyogY2FsbGluZyBjb252ZW50aW9ucyBmb3IgV2luZG93cyAqLworI2lmbmRlZiBTV0lHU1REQ0FMTAorIyBpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgICBkZWZpbmUgU1dJR1NURENBTEwgX19zdGRjYWxsCisjIGVsc2UKKyMgICBkZWZpbmUgU1dJR1NURENBTEwKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBEZWFsIHdpdGggTWljcm9zb2Z0J3MgYXR0ZW1wdCBhdCBkZXByZWNhdGluZyBDIHN0YW5kYXJkIHJ1bnRpbWUgZnVuY3Rpb25zICovCisjaWYgIWRlZmluZWQoU1dJR19OT19DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSkgJiYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFKQorIyBkZWZpbmUgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFCisjZW5kaWYKKworLyogRGVhbCB3aXRoIE1pY3Jvc29mdCdzIGF0dGVtcHQgYXQgZGVwcmVjYXRpbmcgbWV0aG9kcyBpbiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkgKi8KKyNpZiAhZGVmaW5lZChTV0lHX05PX1NDTF9TRUNVUkVfTk9fREVQUkVDQVRFKSAmJiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUpCisjIGRlZmluZSBfU0NMX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCisKKworLyogUHl0aG9uLmggaGFzIHRvIGFwcGVhciBmaXJzdCAqLworI2luY2x1ZGUgPFB5dGhvbi5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogc3dpZ3J1bi5zd2cKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZ2VuZXJpYyBDIEFQSSBTV0lHIHJ1bnRpbWUgc3VwcG9ydCBmb3IgcG9pbnRlcgorICogdHlwZSBjaGVja2luZy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIFRoaXMgc2hvdWxkIG9ubHkgYmUgaW5jcmVtZW50ZWQgd2hlbiBlaXRoZXIgdGhlIGxheW91dCBvZiBzd2lnX3R5cGVfaW5mbyBjaGFuZ2VzLAorICAgb3IgZm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlIHJ1bnRpbWUgY2hhbmdlcyBpbmNvbXBhdGlibHkgKi8KKyNkZWZpbmUgU1dJR19SVU5USU1FX1ZFUlNJT04gIjQiCisKKy8qIGRlZmluZSBTV0lHX1RZUEVfVEFCTEVfTkFNRSBhcyAiU1dJR19UWVBFX1RBQkxFIiAqLworI2lmZGVmIFNXSUdfVFlQRV9UQUJMRQorIyBkZWZpbmUgU1dJR19RVU9URV9TVFJJTkcoeCkgI3gKKyMgZGVmaW5lIFNXSUdfRVhQQU5EX0FORF9RVU9URV9TVFJJTkcoeCkgU1dJR19RVU9URV9TVFJJTkcoeCkKKyMgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRV9OQU1FIFNXSUdfRVhQQU5EX0FORF9RVU9URV9TVFJJTkcoU1dJR19UWVBFX1RBQkxFKQorI2Vsc2UKKyMgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRV9OQU1FCisjZW5kaWYKKworLyoKKyAgWW91IGNhbiB1c2UgdGhlIFNXSUdSVU5USU1FIGFuZCBTV0lHUlVOVElNRUlOTElORSBtYWNyb3MgZm9yCisgIGNyZWF0aW5nIGEgc3RhdGljIG9yIGR5bmFtaWMgbGlicmFyeSBmcm9tIHRoZSBTV0lHIHJ1bnRpbWUgY29kZS4KKyAgSW4gOTkuOSUgb2YgdGhlIGNhc2VzLCBTV0lHIGp1c3QgbmVlZHMgdG8gZGVjbGFyZSB0aGVtIGFzICdzdGF0aWMnLgorCisgIEJ1dCBvbmx5IGRvIHRoaXMgaWYgc3RyaWN0bHkgbmVjZXNzYXJ5LCBpZSwgaWYgeW91IGhhdmUgcHJvYmxlbXMKKyAgd2l0aCB5b3VyIGNvbXBpbGVyIG9yIHN1Y2hsaWtlLgorKi8KKworI2lmbmRlZiBTV0lHUlVOVElNRQorIyBkZWZpbmUgU1dJR1JVTlRJTUUgU1dJR0lOVEVSTgorI2VuZGlmCisKKyNpZm5kZWYgU1dJR1JVTlRJTUVJTkxJTkUKKyMgZGVmaW5lIFNXSUdSVU5USU1FSU5MSU5FIFNXSUdSVU5USU1FIFNXSUdJTkxJTkUKKyNlbmRpZgorCisvKiAgR2VuZXJpYyBidWZmZXIgc2l6ZSAqLworI2lmbmRlZiBTV0lHX0JVRkZFUl9TSVpFCisjIGRlZmluZSBTV0lHX0JVRkZFUl9TSVpFIDEwMjQKKyNlbmRpZgorCisvKiBGbGFncyBmb3IgcG9pbnRlciBjb252ZXJzaW9ucyAqLworI2RlZmluZSBTV0lHX1BPSU5URVJfRElTT1dOICAgICAgICAweDEKKyNkZWZpbmUgU1dJR19DQVNUX05FV19NRU1PUlkgICAgICAgMHgyCisKKy8qIEZsYWdzIGZvciBuZXcgcG9pbnRlciBvYmplY3RzICovCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9PV04gICAgICAgICAgIDB4MQorCisKKy8qCisgICBGbGFncy9tZXRob2RzIGZvciByZXR1cm5pbmcgc3RhdGVzLgorCisgICBUaGUgU1dJRyBjb252ZXJzaW9uIG1ldGhvZHMsIGFzIENvbnZlcnRQdHIsIHJldHVybiBhbiBpbnRlZ2VyCisgICB0aGF0IHRlbGxzIGlmIHRoZSBjb252ZXJzaW9uIHdhcyBzdWNjZXNzZnVsIG9yIG5vdC4gQW5kIGlmIG5vdCwKKyAgIGFuIGVycm9yIGNvZGUgY2FuIGJlIHJldHVybmVkIChzZWUgc3dpZ2Vycm9ycy5zd2cgZm9yIHRoZSBjb2RlcykuCisKKyAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3Jvcy9mbGFncyB0byBzZXQgb3IgcHJvY2VzcyB0aGUgcmV0dXJuaW5nCisgICBzdGF0ZXMuCisKKyAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCBjb2RlIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyB3YXMgdXN1YWxseSB3cml0dGVuOgorCisgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIob2JqLHZwdHIsdHkuZmxhZ3MpICE9IC0xKSB7CisgICAgICAgLy8gc3VjY2VzcyBjb2RlCisgICAgIH0gZWxzZSB7CisgICAgICAgLy9mYWlsIGNvZGUKKyAgICAgfQorCisgICBOb3cgeW91IGNhbiBiZSBtb3JlIGV4cGxpY2l0OgorCisgICAgaW50IHJlcyA9IFNXSUdfQ29udmVydFB0cihvYmosdnB0cix0eS5mbGFncyk7CisgICAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgICAvLyBzdWNjZXNzIGNvZGUKKyAgICB9IGVsc2UgeworICAgICAgLy8gZmFpbCBjb2RlCisgICAgfQorCisgICB3aGljaCBpcyB0aGUgc2FtZSByZWFsbHksIGJ1dCBub3cgeW91IGNhbiBhbHNvIGRvCisKKyAgICBUeXBlICpwdHI7CisgICAgaW50IHJlcyA9IFNXSUdfQ29udmVydFB0cihvYmosKHZvaWQgKiopKCZwdHIpLHR5LmZsYWdzKTsKKyAgICBpZiAoU1dJR19Jc09LKHJlcykpIHsKKyAgICAgIC8vIHN1Y2Nlc3MgY29kZQorICAgICAgaWYgKFNXSUdfSXNOZXdPYmoocmVzKSB7CisgICAgICAgIC4uLgorICAgICAgICBkZWxldGUgKnB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC4uLgorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBmYWlsIGNvZGUKKyAgICB9CisKKyAgIEkuZS4sIG5vdyBTV0lHX0NvbnZlcnRQdHIgY2FuIHJldHVybiBuZXcgb2JqZWN0cyBhbmQgeW91IGNhbgorICAgaWRlbnRpZnkgdGhlIGNhc2UgYW5kIHRha2UgY2FyZSBvZiB0aGUgZGVhbGxvY2F0aW9uLiBPZiBjb3Vyc2UgdGhhdAorICAgYWxzbyByZXF1aXJlcyBTV0lHX0NvbnZlcnRQdHIgdG8gcmV0dXJuIG5ldyByZXN1bHQgdmFsdWVzLCBzdWNoIGFzCisKKyAgICAgIGludCBTV0lHX0NvbnZlcnRQdHIob2JqLCBwdHIsLi4uKSB7CisgICAgICAgIGlmICg8b2JqIGlzIG9rPikgeworICAgICAgICAgIGlmICg8bmVlZCBuZXcgb2JqZWN0PikgeworICAgICAgICAgICAgKnB0ciA9IDxwdHIgdG8gbmV3IGFsbG9jYXRlZCBvYmplY3Q+OworICAgICAgICAgICAgcmV0dXJuIFNXSUdfTkVXT0JKOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqcHRyID0gPHB0ciB0byBvbGQgb2JqZWN0PjsKKyAgICAgICAgICAgIHJldHVybiBTV0lHX09MRE9CSjsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIFNXSUdfQkFET0JKOworICAgICAgICB9CisgICAgICB9CisKKyAgIE9mIGNvdXJzZSwgcmV0dXJuaW5nIHRoZSBwbGFpbiAnMChzdWNjZXNzKS8tMShmYWlsKScgc3RpbGwgd29ya3MsIGJ1dCB5b3UgY2FuIGJlCisgICBtb3JlIGV4cGxpY2l0IGJ5IHJldHVybmluZyBTV0lHX0JBRE9CSiwgU1dJR19FUlJPUiBvciBhbnkgb2YgdGhlCisgICBTV0lHIGVycm9ycyBjb2RlLgorCisgICBGaW5hbGx5LCBpZiB0aGUgU1dJR19DQVNUUkFOS19NT0RFIGlzIGVuYWJsZWQsIHRoZSByZXN1bHQgY29kZQorICAgYWxsb3dzIHRvIHJldHVybiB0aGUgJ2Nhc3QgcmFuaycsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzCisKKyAgICAgICBpbnQgZm9vZChkb3VibGUpCisgICAgICAgaW50IGZvb2koaW50KTsKKworICAgYW5kIHlvdSBjYWxsCisKKyAgICAgIGZvb2QoMSkgICAvLyBjYXN0IHJhbmsgJzEnICAoMSAtPiAxLjApCisgICAgICBmb29pKDEpICAgLy8gY2FzdCByYW5rICcwJworCisgICBqdXN0IHVzZSB0aGUgU1dJR19BZGRDYXN0KCkvU1dJR19DaGVja1N0YXRlKCkKKyovCisKKyNkZWZpbmUgU1dJR19PSyAgICAgICAgICAgICAgICAgICAgKDApCisjZGVmaW5lIFNXSUdfRVJST1IgICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgU1dJR19Jc09LKHIpICAgICAgICAgICAgICAgKHIgPj0gMCkKKyNkZWZpbmUgU1dJR19BcmdFcnJvcihyKSAgICAgICAgICAgKChyICE9IFNXSUdfRVJST1IpID8gciA6IFNXSUdfVHlwZUVycm9yKQorCisvKiBUaGUgQ2FzdFJhbmtMaW1pdCBzYXlzIGhvdyBtYW55IGJpdHMgYXJlIHVzZWQgZm9yIHRoZSBjYXN0IHJhbmsgKi8KKyNkZWZpbmUgU1dJR19DQVNUUkFOS0xJTUlUICAgICAgICAgKDEgPDwgOCkKKy8qIFRoZSBOZXdNYXNrIGRlbm90ZXMgdGhlIG9iamVjdCB3YXMgY3JlYXRlZCAodXNpbmcgbmV3L21hbGxvYykgKi8KKyNkZWZpbmUgU1dJR19ORVdPQkpNQVNLICAgICAgICAgICAgKFNXSUdfQ0FTVFJBTktMSU1JVCAgPDwgMSkKKy8qIFRoZSBUbXBNYXNrIGlzIGZvciBpbi9vdXQgdHlwZW1hcHMgdGhhdCB1c2UgdGVtcG9yYWwgb2JqZWN0cyAqLworI2RlZmluZSBTV0lHX1RNUE9CSk1BU0sgICAgICAgICAgICAoU1dJR19ORVdPQkpNQVNLIDw8IDEpCisvKiBTaW1wbGUgcmV0dXJuaW5nIHZhbHVlcyAqLworI2RlZmluZSBTV0lHX0JBRE9CSiAgICAgICAgICAgICAgICAoU1dJR19FUlJPUikKKyNkZWZpbmUgU1dJR19PTERPQkogICAgICAgICAgICAgICAgKFNXSUdfT0spCisjZGVmaW5lIFNXSUdfTkVXT0JKICAgICAgICAgICAgICAgIChTV0lHX09LIHwgU1dJR19ORVdPQkpNQVNLKQorI2RlZmluZSBTV0lHX1RNUE9CSiAgICAgICAgICAgICAgICAoU1dJR19PSyB8IFNXSUdfVE1QT0JKTUFTSykKKy8qIENoZWNrLCBhZGQgYW5kIGRlbCBtYXNrIG1ldGhvZHMgKi8KKyNkZWZpbmUgU1dJR19BZGROZXdNYXNrKHIpICAgICAgICAgKFNXSUdfSXNPSyhyKSA/IChyIHwgU1dJR19ORVdPQkpNQVNLKSA6IHIpCisjZGVmaW5lIFNXSUdfRGVsTmV3TWFzayhyKSAgICAgICAgIChTV0lHX0lzT0socikgPyAociAmIH5TV0lHX05FV09CSk1BU0spIDogcikKKyNkZWZpbmUgU1dJR19Jc05ld09iaihyKSAgICAgICAgICAgKFNXSUdfSXNPSyhyKSAmJiAociAmIFNXSUdfTkVXT0JKTUFTSykpCisjZGVmaW5lIFNXSUdfQWRkVG1wTWFzayhyKSAgICAgICAgIChTV0lHX0lzT0socikgPyAociB8IFNXSUdfVE1QT0JKTUFTSykgOiByKQorI2RlZmluZSBTV0lHX0RlbFRtcE1hc2socikgICAgICAgICAoU1dJR19Jc09LKHIpID8gKHIgJiB+U1dJR19UTVBPQkpNQVNLKSA6IHIpCisjZGVmaW5lIFNXSUdfSXNUbXBPYmoocikgICAgICAgICAgIChTV0lHX0lzT0socikgJiYgKHIgJiBTV0lHX1RNUE9CSk1BU0spKQorCisvKiBDYXN0LVJhbmsgTW9kZSAqLworI2lmIGRlZmluZWQoU1dJR19DQVNUUkFOS19NT0RFKQorIyAgaWZuZGVmIFNXSUdfVHlwZVJhbmsKKyMgICAgZGVmaW5lIFNXSUdfVHlwZVJhbmsgICAgICAgICAgICAgdW5zaWduZWQgbG9uZworIyAgZW5kaWYKKyMgIGlmbmRlZiBTV0lHX01BWENBU1RSQU5LICAgICAgICAgICAgLyogRGVmYXVsdCBjYXN0IGFsbG93ZWQgKi8KKyMgICAgZGVmaW5lIFNXSUdfTUFYQ0FTVFJBTksgICAgICAgICAgKDIpCisjICBlbmRpZgorIyAgZGVmaW5lIFNXSUdfQ0FTVFJBTktNQVNLICAgICAgICAgICgoU1dJR19DQVNUUkFOS0xJTUlUKSAtMSkKKyMgIGRlZmluZSBTV0lHX0Nhc3RSYW5rKHIpICAgICAgICAgICAociAmIFNXSUdfQ0FTVFJBTktNQVNLKQorU1dJR0lOVEVSTklOTElORSBpbnQgU1dJR19BZGRDYXN0KGludCByKSB7CisgIHJldHVybiBTV0lHX0lzT0socikgPyAoKFNXSUdfQ2FzdFJhbmsocikgPCBTV0lHX01BWENBU1RSQU5LKSA/IChyICsgMSkgOiBTV0lHX0VSUk9SKSA6IHI7Cit9CitTV0lHSU5URVJOSU5MSU5FIGludCBTV0lHX0NoZWNrU3RhdGUoaW50IHIpIHsKKyAgcmV0dXJuIFNXSUdfSXNPSyhyKSA/IFNXSUdfQ2FzdFJhbmsocikgKyAxIDogMDsKK30KKyNlbHNlIC8qIG5vIGNhc3QtcmFuayBtb2RlICovCisjICBkZWZpbmUgU1dJR19BZGRDYXN0CisjICBkZWZpbmUgU1dJR19DaGVja1N0YXRlKHIpIChTV0lHX0lzT0socikgPyAxIDogMCkKKyNlbmRpZgorCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIHZvaWQgKigqc3dpZ19jb252ZXJ0ZXJfZnVuYykodm9pZCAqLCBpbnQgKik7Cit0eXBlZGVmIHN0cnVjdCBzd2lnX3R5cGVfaW5mbyAqKCpzd2lnX2R5Y2FzdF9mdW5jKSh2b2lkICoqKTsKKworLyogU3RydWN0dXJlIHRvIHN0b3JlIGluZm9ybWF0aW9uIG9uIG9uZSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBzd2lnX3R5cGVfaW5mbyB7CisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKm5hbWU7ICAgICAgICAgICAgICAgICAvKiBtYW5nbGVkIG5hbWUgb2YgdGhpcyB0eXBlICovCisgIGNvbnN0IGNoYXIgICAgICAgICAgICAgKnN0cjsgICAgICAgICAgICAgICAgICAvKiBodW1hbiByZWFkYWJsZSBuYW1lIG9mIHRoaXMgdHlwZSAqLworICBzd2lnX2R5Y2FzdF9mdW5jICAgICAgICBkY2FzdDsgICAgICAgICAgICAgICAgLyogZHluYW1pYyBjYXN0IGZ1bmN0aW9uIGRvd24gYSBoaWVyYXJjaHkgKi8KKyAgc3RydWN0IHN3aWdfY2FzdF9pbmZvICAqY2FzdDsgICAgICAgICAgICAgICAgIC8qIGxpbmtlZCBsaXN0IG9mIHR5cGVzIHRoYXQgY2FuIGNhc3QgaW50byB0aGlzIHR5cGUgKi8KKyAgdm9pZCAgICAgICAgICAgICAgICAgICAqY2xpZW50ZGF0YTsgICAgICAgICAgIC8qIGxhbmd1YWdlIHNwZWNpZmljIHR5cGUgZGF0YSAqLworICBpbnQgICAgICAgICAgICAgICAgICAgIG93bmRhdGE7ICAgICAgICAgICAgICAgLyogZmxhZyBpZiB0aGUgc3RydWN0dXJlIG93bnMgdGhlIGNsaWVudGRhdGEgKi8KK30gc3dpZ190eXBlX2luZm87CisKKy8qIFN0cnVjdHVyZSB0byBzdG9yZSBhIHR5cGUgYW5kIGNvbnZlcnNpb24gZnVuY3Rpb24gdXNlZCBmb3IgY2FzdGluZyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3dpZ19jYXN0X2luZm8geworICBzd2lnX3R5cGVfaW5mbyAgICAgICAgICp0eXBlOyAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byB0eXBlIHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGlzIHR5cGUgKi8KKyAgc3dpZ19jb252ZXJ0ZXJfZnVuYyAgICAgY29udmVydGVyOyAgICAgICAgICAgIC8qIGZ1bmN0aW9uIHRvIGNhc3QgdGhlIHZvaWQgcG9pbnRlcnMgKi8KKyAgc3RydWN0IHN3aWdfY2FzdF9pbmZvICAqbmV4dDsgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gbmV4dCBjYXN0IGluIGxpbmtlZCBsaXN0ICovCisgIHN0cnVjdCBzd2lnX2Nhc3RfaW5mbyAgKnByZXY7ICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyBjYXN0ICovCit9IHN3aWdfY2FzdF9pbmZvOworCisvKiBTdHJ1Y3R1cmUgdXNlZCB0byBzdG9yZSBtb2R1bGUgaW5mb3JtYXRpb24KKyAqIEVhY2ggbW9kdWxlIGdlbmVyYXRlcyBvbmUgc3RydWN0dXJlIGxpa2UgdGhpcywgYW5kIHRoZSBydW50aW1lIGNvbGxlY3RzCisgKiBhbGwgb2YgdGhlc2Ugc3RydWN0dXJlcyBhbmQgc3RvcmVzIHRoZW0gaW4gYSBjaXJjdWxhcmx5IGxpbmtlZCBsaXN0LiovCit0eXBlZGVmIHN0cnVjdCBzd2lnX21vZHVsZV9pbmZvIHsKKyAgc3dpZ190eXBlX2luZm8gICAgICAgICAqKnR5cGVzOyAgICAgICAgICAgICAgIC8qIEFycmF5IG9mIHBvaW50ZXJzIHRvIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZXMgdGhhdCBhcmUgaW4gdGhpcyBtb2R1bGUgKi8KKyAgc2l6ZV90ICAgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB0eXBlcyBpbiB0aGlzIG1vZHVsZSAqLworICBzdHJ1Y3Qgc3dpZ19tb2R1bGVfaW5mbyAqbmV4dDsgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byBuZXh0IGVsZW1lbnQgaW4gY2lyY3VsYXJseSBsaW5rZWQgbGlzdCAqLworICBzd2lnX3R5cGVfaW5mbyAgICAgICAgICoqdHlwZV9pbml0aWFsOyAgICAgICAgLyogQXJyYXkgb2YgaW5pdGlhbGx5IGdlbmVyYXRlZCB0eXBlIHN0cnVjdHVyZXMgKi8KKyAgc3dpZ19jYXN0X2luZm8gICAgICAgICAqKmNhc3RfaW5pdGlhbDsgICAgICAgIC8qIEFycmF5IG9mIGluaXRpYWxseSBnZW5lcmF0ZWQgY2FzdGluZyBzdHJ1Y3R1cmVzICovCisgIHZvaWQgICAgICAgICAgICAgICAgICAgICpjbGllbnRkYXRhOyAgICAgICAgICAvKiBMYW5ndWFnZSBzcGVjaWZpYyBtb2R1bGUgZGF0YSAqLworfSBzd2lnX21vZHVsZV9pbmZvOworCisvKgorICBDb21wYXJlIHR3byB0eXBlIG5hbWVzIHNraXBwaW5nIHRoZSBzcGFjZSBjaGFyYWN0ZXJzLCB0aGVyZWZvcmUKKyAgImNoYXIqIiA9PSAiY2hhciAqIiBhbmQgIkNsYXNzPGludD4iID09ICJDbGFzczxpbnQgPiIsIGV0Yy4KKworICBSZXR1cm4gMCB3aGVuIHRoZSB0d28gbmFtZSB0eXBlcyBhcmUgZXF1aXZhbGVudCwgYXMgaW4KKyAgc3RybmNtcCwgYnV0IHNraXBwaW5nICcgJy4KKyovCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfVHlwZU5hbWVDb21wKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpsMSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmYyLCBjb25zdCBjaGFyICpsMikgeworICBmb3IgKDsoZjEgIT0gbDEpICYmIChmMiAhPSBsMik7ICsrZjEsICsrZjIpIHsKKyAgICB3aGlsZSAoKCpmMSA9PSAnICcpICYmIChmMSAhPSBsMSkpICsrZjE7CisgICAgd2hpbGUgKCgqZjIgPT0gJyAnKSAmJiAoZjIgIT0gbDIpKSArK2YyOworICAgIGlmICgqZjEgIT0gKmYyKSByZXR1cm4gKCpmMSA+ICpmMikgPyAxIDogLTE7CisgIH0KKyAgcmV0dXJuIChpbnQpKChsMSAtIGYxKSAtIChsMiAtIGYyKSk7Cit9CisKKy8qCisgIENoZWNrIHR5cGUgZXF1aXZhbGVuY2UgaW4gYSBuYW1lIGxpc3QgbGlrZSA8bmFtZTE+fDxuYW1lMj58Li4uCisgIFJldHVybiAwIGlmIG5vdCBlcXVhbCwgMSBpZiBlcXVhbAorKi8KK1NXSUdSVU5USU1FIGludAorU1dJR19UeXBlRXF1aXYoY29uc3QgY2hhciAqbmIsIGNvbnN0IGNoYXIgKnRiKSB7CisgIGludCBlcXVpdiA9IDA7CisgIGNvbnN0IGNoYXIqIHRlID0gdGIgKyBzdHJsZW4odGIpOworICBjb25zdCBjaGFyKiBuZSA9IG5iOworICB3aGlsZSAoIWVxdWl2ICYmICpuZSkgeworICAgIGZvciAobmIgPSBuZTsgKm5lOyArK25lKSB7CisgICAgICBpZiAoKm5lID09ICd8JykgYnJlYWs7CisgICAgfQorICAgIGVxdWl2ID0gKFNXSUdfVHlwZU5hbWVDb21wKG5iLCBuZSwgdGIsIHRlKSA9PSAwKSA/IDEgOiAwOworICAgIGlmICgqbmUpICsrbmU7CisgIH0KKyAgcmV0dXJuIGVxdWl2OworfQorCisvKgorICBDaGVjayB0eXBlIGVxdWl2YWxlbmNlIGluIGEgbmFtZSBsaXN0IGxpa2UgPG5hbWUxPnw8bmFtZTI+fC4uLgorICBSZXR1cm4gMCBpZiBlcXVhbCwgLTEgaWYgbmIgPCB0YiwgMSBpZiBuYiA+IHRiCisqLworU1dJR1JVTlRJTUUgaW50CitTV0lHX1R5cGVDb21wYXJlKGNvbnN0IGNoYXIgKm5iLCBjb25zdCBjaGFyICp0YikgeworICBpbnQgZXF1aXYgPSAwOworICBjb25zdCBjaGFyKiB0ZSA9IHRiICsgc3RybGVuKHRiKTsKKyAgY29uc3QgY2hhciogbmUgPSBuYjsKKyAgd2hpbGUgKCFlcXVpdiAmJiAqbmUpIHsKKyAgICBmb3IgKG5iID0gbmU7ICpuZTsgKytuZSkgeworICAgICAgaWYgKCpuZSA9PSAnfCcpIGJyZWFrOworICAgIH0KKyAgICBlcXVpdiA9IChTV0lHX1R5cGVOYW1lQ29tcChuYiwgbmUsIHRiLCB0ZSkgPT0gMCkgPyAxIDogMDsKKyAgICBpZiAoKm5lKSArK25lOworICB9CisgIHJldHVybiBlcXVpdjsKK30KKworCisvKgorICBDaGVjayB0aGUgdHlwZW5hbWUKKyovCitTV0lHUlVOVElNRSBzd2lnX2Nhc3RfaW5mbyAqCitTV0lHX1R5cGVDaGVjayhjb25zdCBjaGFyICpjLCBzd2lnX3R5cGVfaW5mbyAqdHkpIHsKKyAgaWYgKHR5KSB7CisgICAgc3dpZ19jYXN0X2luZm8gKml0ZXIgPSB0eS0+Y2FzdDsKKyAgICB3aGlsZSAoaXRlcikgeworICAgICAgaWYgKHN0cmNtcChpdGVyLT50eXBlLT5uYW1lLCBjKSA9PSAwKSB7CisgICAgICAgIGlmIChpdGVyID09IHR5LT5jYXN0KQorICAgICAgICAgIHJldHVybiBpdGVyOworICAgICAgICAvKiBNb3ZlIGl0ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbGlua2VkIGxpc3QgKi8KKyAgICAgICAgaXRlci0+cHJldi0+bmV4dCA9IGl0ZXItPm5leHQ7CisgICAgICAgIGlmIChpdGVyLT5uZXh0KQorICAgICAgICAgIGl0ZXItPm5leHQtPnByZXYgPSBpdGVyLT5wcmV2OworICAgICAgICBpdGVyLT5uZXh0ID0gdHktPmNhc3Q7CisgICAgICAgIGl0ZXItPnByZXYgPSAwOworICAgICAgICBpZiAodHktPmNhc3QpIHR5LT5jYXN0LT5wcmV2ID0gaXRlcjsKKyAgICAgICAgdHktPmNhc3QgPSBpdGVyOworICAgICAgICByZXR1cm4gaXRlcjsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSBpdGVyLT5uZXh0OworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyoKKyAgSWRlbnRpY2FsIHRvIFNXSUdfVHlwZUNoZWNrLCBleGNlcHQgc3RyY21wIGlzIHJlcGxhY2VkIHdpdGggYSBwb2ludGVyIGNvbXBhcmlzb24KKyovCitTV0lHUlVOVElNRSBzd2lnX2Nhc3RfaW5mbyAqCitTV0lHX1R5cGVDaGVja1N0cnVjdChzd2lnX3R5cGVfaW5mbyAqZnJvbSwgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIGlmICh0eSkgeworICAgIHN3aWdfY2FzdF9pbmZvICppdGVyID0gdHktPmNhc3Q7CisgICAgd2hpbGUgKGl0ZXIpIHsKKyAgICAgIGlmIChpdGVyLT50eXBlID09IGZyb20pIHsKKyAgICAgICAgaWYgKGl0ZXIgPT0gdHktPmNhc3QpCisgICAgICAgICAgcmV0dXJuIGl0ZXI7CisgICAgICAgIC8qIE1vdmUgaXRlciB0byB0aGUgdG9wIG9mIHRoZSBsaW5rZWQgbGlzdCAqLworICAgICAgICBpdGVyLT5wcmV2LT5uZXh0ID0gaXRlci0+bmV4dDsKKyAgICAgICAgaWYgKGl0ZXItPm5leHQpCisgICAgICAgICAgaXRlci0+bmV4dC0+cHJldiA9IGl0ZXItPnByZXY7CisgICAgICAgIGl0ZXItPm5leHQgPSB0eS0+Y2FzdDsKKyAgICAgICAgaXRlci0+cHJldiA9IDA7CisgICAgICAgIGlmICh0eS0+Y2FzdCkgdHktPmNhc3QtPnByZXYgPSBpdGVyOworICAgICAgICB0eS0+Y2FzdCA9IGl0ZXI7CisgICAgICAgIHJldHVybiBpdGVyOworICAgICAgfQorICAgICAgaXRlciA9IGl0ZXItPm5leHQ7CisgICAgfQorICB9CisgIHJldHVybiAwOworfQorCisvKgorICBDYXN0IGEgcG9pbnRlciB1cCBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyovCitTV0lHUlVOVElNRUlOTElORSB2b2lkICoKK1NXSUdfVHlwZUNhc3Qoc3dpZ19jYXN0X2luZm8gKnR5LCB2b2lkICpwdHIsIGludCAqbmV3bWVtb3J5KSB7CisgIHJldHVybiAoKCF0eSkgfHwgKCF0eS0+Y29udmVydGVyKSkgPyBwdHIgOiAoKnR5LT5jb252ZXJ0ZXIpKHB0ciwgbmV3bWVtb3J5KTsKK30KKworLyoKKyAgIER5bmFtaWMgcG9pbnRlciBjYXN0aW5nLiBEb3duIGFuIGluaGVyaXRhbmNlIGhpZXJhcmNoeQorKi8KK1NXSUdSVU5USU1FIHN3aWdfdHlwZV9pbmZvICoKK1NXSUdfVHlwZUR5bmFtaWNDYXN0KHN3aWdfdHlwZV9pbmZvICp0eSwgdm9pZCAqKnB0cikgeworICBzd2lnX3R5cGVfaW5mbyAqbGFzdHR5ID0gdHk7CisgIGlmICghdHkgfHwgIXR5LT5kY2FzdCkgcmV0dXJuIHR5OworICB3aGlsZSAodHkgJiYgKHR5LT5kY2FzdCkpIHsKKyAgICB0eSA9ICgqdHktPmRjYXN0KShwdHIpOworICAgIGlmICh0eSkgbGFzdHR5ID0gdHk7CisgIH0KKyAgcmV0dXJuIGxhc3R0eTsKK30KKworLyoKKyAgUmV0dXJuIHRoZSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHR5cGUKKyovCitTV0lHUlVOVElNRUlOTElORSBjb25zdCBjaGFyICoKK1NXSUdfVHlwZU5hbWUoY29uc3Qgc3dpZ190eXBlX2luZm8gKnR5KSB7CisgIHJldHVybiB0eS0+bmFtZTsKK30KKworLyoKKyAgUmV0dXJuIHRoZSBwcmV0dHkgbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0eXBlLAorICB0aGF0IGlzIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgaW4gYSBmb3JtIHByZXNlbnRhYmxlIHRvIHRoZSB1c2VyLgorKi8KK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19UeXBlUHJldHR5TmFtZShjb25zdCBzd2lnX3R5cGVfaW5mbyAqdHlwZSkgeworICAvKiBUaGUgInN0ciIgZmllbGQgY29udGFpbnMgdGhlIGVxdWl2YWxlbnQgcHJldHR5IG5hbWVzIG9mIHRoZQorICAgICB0eXBlLCBzZXBhcmF0ZWQgYnkgdmVydGljYWwtYmFyIGNoYXJhY3RlcnMuICBXZSBjaG9vc2UKKyAgICAgdG8gcHJpbnQgdGhlIGxhc3QgbmFtZSwgYXMgaXQgaXMgb2Z0ZW4gKD8pIHRoZSBtb3N0CisgICAgIHNwZWNpZmljLiAqLworICBpZiAoIXR5cGUpIHJldHVybiBOVUxMOworICBpZiAodHlwZS0+c3RyICE9IE5VTEwpIHsKKyAgICBjb25zdCBjaGFyICpsYXN0X25hbWUgPSB0eXBlLT5zdHI7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBmb3IgKHMgPSB0eXBlLT5zdHI7ICpzOyBzKyspCisgICAgICBpZiAoKnMgPT0gJ3wnKSBsYXN0X25hbWUgPSBzKzE7CisgICAgcmV0dXJuIGxhc3RfbmFtZTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuIHR5cGUtPm5hbWU7Cit9CisKKy8qCisgICBTZXQgdGhlIGNsaWVudGRhdGEgZmllbGQgZm9yIGEgdHlwZQorKi8KK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfVHlwZUNsaWVudERhdGEoc3dpZ190eXBlX2luZm8gKnRpLCB2b2lkICpjbGllbnRkYXRhKSB7CisgIHN3aWdfY2FzdF9pbmZvICpjYXN0ID0gdGktPmNhc3Q7CisgIC8qIGlmICh0aS0+Y2xpZW50ZGF0YSA9PSBjbGllbnRkYXRhKSByZXR1cm47ICovCisgIHRpLT5jbGllbnRkYXRhID0gY2xpZW50ZGF0YTsKKworICB3aGlsZSAoY2FzdCkgeworICAgIGlmICghY2FzdC0+Y29udmVydGVyKSB7CisgICAgICBzd2lnX3R5cGVfaW5mbyAqdGMgPSBjYXN0LT50eXBlOworICAgICAgaWYgKCF0Yy0+Y2xpZW50ZGF0YSkgeworICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKHRjLCBjbGllbnRkYXRhKTsKKyAgICAgIH0KKyAgICB9CisgICAgY2FzdCA9IGNhc3QtPm5leHQ7CisgIH0KK30KK1NXSUdSVU5USU1FIHZvaWQKK1NXSUdfVHlwZU5ld0NsaWVudERhdGEoc3dpZ190eXBlX2luZm8gKnRpLCB2b2lkICpjbGllbnRkYXRhKSB7CisgIFNXSUdfVHlwZUNsaWVudERhdGEodGksIGNsaWVudGRhdGEpOworICB0aS0+b3duZGF0YSA9IDE7Cit9CisKKy8qCisgIFNlYXJjaCBmb3IgYSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUgb25seSBieSBtYW5nbGVkIG5hbWUKKyAgU2VhcmNoIGlzIGEgTyhsb2cgI3R5cGVzKQorCisgIFdlIHN0YXJ0IHNlYXJjaGluZyBhdCBtb2R1bGUgc3RhcnQsIGFuZCBmaW5pc2ggc2VhcmNoaW5nIHdoZW4gc3RhcnQgPT0gZW5kLgorICBOb3RlOiBpZiBzdGFydCA9PSBlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24sIHdlIGdvIGFsbCB0aGUgd2F5IGFyb3VuZAorICB0aGUgY2lyY3VsYXIgbGlzdC4KKyovCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX01hbmdsZWRUeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGVfaW5mbyAqc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ19tb2R1bGVfaW5mbyAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgc3dpZ19tb2R1bGVfaW5mbyAqaXRlciA9IHN0YXJ0OworICBkbyB7CisgICAgaWYgKGl0ZXItPnNpemUpIHsKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCBsID0gMDsKKyAgICAgIHJlZ2lzdGVyIHNpemVfdCByID0gaXRlci0+c2l6ZSAtIDE7CisgICAgICBkbyB7CisgICAgICAgIC8qIHNpbmNlIGwrciA+PSAwLCB3ZSBjYW4gKD4+IDEpIGluc3RlYWQgKC8gMikgKi8KKyAgICAgICAgcmVnaXN0ZXIgc2l6ZV90IGkgPSAobCArIHIpID4+IDE7CisgICAgICAgIGNvbnN0IGNoYXIgKmluYW1lID0gaXRlci0+dHlwZXNbaV0tPm5hbWU7CisgICAgICAgIGlmIChpbmFtZSkgeworICAgICAgICAgIHJlZ2lzdGVyIGludCBjb21wYXJlID0gc3RyY21wKG5hbWUsIGluYW1lKTsKKyAgICAgICAgICBpZiAoY29tcGFyZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+dHlwZXNbaV07CisgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlIDwgMCkgeworICAgICAgICAgICAgaWYgKGkpIHsKKyAgICAgICAgICAgICAgciA9IGkgLSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfSBlbHNlIGlmIChjb21wYXJlID4gMCkgeworICAgICAgICAgICAgbCA9IGkgKyAxOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBicmVhazsgLyogc2hvdWxkIG5ldmVyIGhhcHBlbiAqLworICAgICAgICB9CisgICAgICB9IHdoaWxlIChsIDw9IHIpOworICAgIH0KKyAgICBpdGVyID0gaXRlci0+bmV4dDsKKyAgfSB3aGlsZSAoaXRlciAhPSBlbmQpOworICByZXR1cm4gMDsKK30KKworLyoKKyAgU2VhcmNoIGZvciBhIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBmb3IgZWl0aGVyIGEgbWFuZ2xlZCBuYW1lIG9yIGEgaHVtYW4gcmVhZGFibGUgbmFtZS4KKyAgSXQgZmlyc3Qgc2VhcmNoZXMgdGhlIG1hbmdsZWQgbmFtZXMgb2YgdGhlIHR5cGVzLCB3aGljaCBpcyBhIE8obG9nICN0eXBlcykKKyAgSWYgYSB0eXBlIGlzIG5vdCBmb3VuZCBpdCB0aGVuIHNlYXJjaGVzIHRoZSBodW1hbiByZWFkYWJsZSBuYW1lcywgd2hpY2ggaXMgTygjdHlwZXMpLgorCisgIFdlIHN0YXJ0IHNlYXJjaGluZyBhdCBtb2R1bGUgc3RhcnQsIGFuZCBmaW5pc2ggc2VhcmNoaW5nIHdoZW4gc3RhcnQgPT0gZW5kLgorICBOb3RlOiBpZiBzdGFydCA9PSBlbmQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZnVuY3Rpb24sIHdlIGdvIGFsbCB0aGUgd2F5IGFyb3VuZAorICB0aGUgY2lyY3VsYXIgbGlzdC4KKyovCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX1R5cGVRdWVyeU1vZHVsZShzd2lnX21vZHVsZV9pbmZvICpzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgIHN3aWdfbW9kdWxlX2luZm8gKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgLyogU1RFUCAxOiBTZWFyY2ggdGhlIG5hbWUgZmllbGQgdXNpbmcgYmluYXJ5IHNlYXJjaCAqLworICBzd2lnX3R5cGVfaW5mbyAqcmV0ID0gU1dJR19NYW5nbGVkVHlwZVF1ZXJ5TW9kdWxlKHN0YXJ0LCBlbmQsIG5hbWUpOworICBpZiAocmV0KSB7CisgICAgcmV0dXJuIHJldDsKKyAgfSBlbHNlIHsKKyAgICAvKiBTVEVQIDI6IElmIHRoZSB0eXBlIGhhc24ndCBiZWVuIGZvdW5kLCBkbyBhIGNvbXBsZXRlIHNlYXJjaAorICAgICAgIG9mIHRoZSBzdHIgZmllbGQgKHRoZSBodW1hbiByZWFkYWJsZSBuYW1lKSAqLworICAgIHN3aWdfbW9kdWxlX2luZm8gKml0ZXIgPSBzdGFydDsKKyAgICBkbyB7CisgICAgICByZWdpc3RlciBzaXplX3QgaSA9IDA7CisgICAgICBmb3IgKDsgaSA8IGl0ZXItPnNpemU7ICsraSkgeworICAgICAgICBpZiAoaXRlci0+dHlwZXNbaV0tPnN0ciAmJiAoU1dJR19UeXBlRXF1aXYoaXRlci0+dHlwZXNbaV0tPnN0ciwgbmFtZSkpKQorICAgICAgICAgIHJldHVybiBpdGVyLT50eXBlc1tpXTsKKyAgICAgIH0KKyAgICAgIGl0ZXIgPSBpdGVyLT5uZXh0OworICAgIH0gd2hpbGUgKGl0ZXIgIT0gZW5kKTsKKyAgfQorCisgIC8qIG5laXRoZXIgZm91bmQgYSBtYXRjaCAqLworICByZXR1cm4gMDsKK30KKworLyoKKyAgIFBhY2sgYmluYXJ5IGRhdGEgaW50byBhIHN0cmluZworKi8KK1NXSUdSVU5USU1FIGNoYXIgKgorU1dJR19QYWNrRGF0YShjaGFyICpjLCB2b2lkICpwdHIsIHNpemVfdCBzeikgeworICBzdGF0aWMgY29uc3QgY2hhciBoZXhbMTddID0gIjAxMjM0NTY3ODlhYmNkZWYiOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICp1ID0gKHVuc2lnbmVkIGNoYXIgKikgcHRyOworICByZWdpc3RlciBjb25zdCB1bnNpZ25lZCBjaGFyICpldSA9ICB1ICsgc3o7CisgIGZvciAoOyB1ICE9IGV1OyArK3UpIHsKKyAgICByZWdpc3RlciB1bnNpZ25lZCBjaGFyIHV1ID0gKnU7CisgICAgKihjKyspID0gaGV4Wyh1dSAmIDB4ZjApID4+IDRdOworICAgICooYysrKSA9IGhleFt1dSAmIDB4Zl07CisgIH0KKyAgcmV0dXJuIGM7Cit9CisKKy8qCisgICBVbnBhY2sgYmluYXJ5IGRhdGEgZnJvbSBhIHN0cmluZworKi8KK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19VbnBhY2tEYXRhKGNvbnN0IGNoYXIgKmMsIHZvaWQgKnB0ciwgc2l6ZV90IHN6KSB7CisgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgKnUgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7CisgIHJlZ2lzdGVyIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmV1ID0gdSArIHN6OworICBmb3IgKDsgdSAhPSBldTsgKyt1KSB7CisgICAgcmVnaXN0ZXIgY2hhciBkID0gKihjKyspOworICAgIHJlZ2lzdGVyIHVuc2lnbmVkIGNoYXIgdXU7CisgICAgaWYgKChkID49ICcwJykgJiYgKGQgPD0gJzknKSkKKyAgICAgIHV1ID0gKChkIC0gJzAnKSA8PCA0KTsKKyAgICBlbHNlIGlmICgoZCA+PSAnYScpICYmIChkIDw9ICdmJykpCisgICAgICB1dSA9ICgoZCAtICgnYSctMTApKSA8PCA0KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKGNoYXIgKikgMDsKKyAgICBkID0gKihjKyspOworICAgIGlmICgoZCA+PSAnMCcpICYmIChkIDw9ICc5JykpCisgICAgICB1dSB8PSAoZCAtICcwJyk7CisgICAgZWxzZSBpZiAoKGQgPj0gJ2EnKSAmJiAoZCA8PSAnZicpKQorICAgICAgdXUgfD0gKGQgLSAoJ2EnLTEwKSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIChjaGFyICopIDA7CisgICAgKnUgPSB1dTsKKyAgfQorICByZXR1cm4gYzsKK30KKworLyoKKyAgIFBhY2sgJ3ZvaWQgKicgaW50byBhIHN0cmluZyBidWZmZXIuCisqLworU1dJR1JVTlRJTUUgY2hhciAqCitTV0lHX1BhY2tWb2lkUHRyKGNoYXIgKmJ1ZmYsIHZvaWQgKnB0ciwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGJzeikgeworICBjaGFyICpyID0gYnVmZjsKKyAgaWYgKCgyKnNpemVvZih2b2lkICopICsgMikgPiBic3opIHJldHVybiAwOworICAqKHIrKykgPSAnXyc7CisgIHIgPSBTV0lHX1BhY2tEYXRhKHIsJnB0cixzaXplb2Yodm9pZCAqKSk7CisgIGlmIChzdHJsZW4obmFtZSkgKyAxID4gKGJzeiAtIChyIC0gYnVmZikpKSByZXR1cm4gMDsKKyAgc3RyY3B5KHIsbmFtZSk7CisgIHJldHVybiBidWZmOworfQorCitTV0lHUlVOVElNRSBjb25zdCBjaGFyICoKK1NXSUdfVW5wYWNrVm9pZFB0cihjb25zdCBjaGFyICpjLCB2b2lkICoqcHRyLCBjb25zdCBjaGFyICpuYW1lKSB7CisgIGlmICgqYyAhPSAnXycpIHsKKyAgICBpZiAoc3RyY21wKGMsIk5VTEwiKSA9PSAwKSB7CisgICAgICAqcHRyID0gKHZvaWQgKikgMDsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfVW5wYWNrRGF0YSgrK2MscHRyLHNpemVvZih2b2lkICopKTsKK30KKworU1dJR1JVTlRJTUUgY2hhciAqCitTV0lHX1BhY2tEYXRhTmFtZShjaGFyICpidWZmLCB2b2lkICpwdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGJzeikgeworICBjaGFyICpyID0gYnVmZjsKKyAgc2l6ZV90IGxuYW1lID0gKG5hbWUgPyBzdHJsZW4obmFtZSkgOiAwKTsKKyAgaWYgKCgyKnN6ICsgMiArIGxuYW1lKSA+IGJzeikgcmV0dXJuIDA7CisgICoocisrKSA9ICdfJzsKKyAgciA9IFNXSUdfUGFja0RhdGEocixwdHIsc3opOworICBpZiAobG5hbWUpIHsKKyAgICBzdHJuY3B5KHIsbmFtZSxsbmFtZSsxKTsKKyAgfSBlbHNlIHsKKyAgICAqciA9IDA7CisgIH0KKyAgcmV0dXJuIGJ1ZmY7Cit9CisKK1NXSUdSVU5USU1FIGNvbnN0IGNoYXIgKgorU1dJR19VbnBhY2tEYXRhTmFtZShjb25zdCBjaGFyICpjLCB2b2lkICpwdHIsIHNpemVfdCBzeiwgY29uc3QgY2hhciAqbmFtZSkgeworICBpZiAoKmMgIT0gJ18nKSB7CisgICAgaWYgKHN0cmNtcChjLCJOVUxMIikgPT0gMCkgeworICAgICAgbWVtc2V0KHB0ciwwLHN6KTsKKyAgICAgIHJldHVybiBuYW1lOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfVW5wYWNrRGF0YSgrK2MscHRyLHN6KTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogIEVycm9ycyBpbiBTV0lHICovCisjZGVmaW5lICBTV0lHX1Vua25vd25FcnJvciAgICAgICAgIC0xCisjZGVmaW5lICBTV0lHX0lPRXJyb3IgICAgICAgICAgICAgIC0yCisjZGVmaW5lICBTV0lHX1J1bnRpbWVFcnJvciAgICAgICAgIC0zCisjZGVmaW5lICBTV0lHX0luZGV4RXJyb3IgICAgICAgICAgIC00CisjZGVmaW5lICBTV0lHX1R5cGVFcnJvciAgICAgICAgICAgIC01CisjZGVmaW5lICBTV0lHX0RpdmlzaW9uQnlaZXJvICAgICAgIC02CisjZGVmaW5lICBTV0lHX092ZXJmbG93RXJyb3IgICAgICAgIC03CisjZGVmaW5lICBTV0lHX1N5bnRheEVycm9yICAgICAgICAgIC04CisjZGVmaW5lICBTV0lHX1ZhbHVlRXJyb3IgICAgICAgICAgIC05CisjZGVmaW5lICBTV0lHX1N5c3RlbUVycm9yICAgICAgICAgIC0xMAorI2RlZmluZSAgU1dJR19BdHRyaWJ1dGVFcnJvciAgICAgICAtMTEKKyNkZWZpbmUgIFNXSUdfTWVtb3J5RXJyb3IgICAgICAgICAgLTEyCisjZGVmaW5lICBTV0lHX051bGxSZWZlcmVuY2VFcnJvciAgIC0xMworCisKKworLyogQ29tcGF0aWJpbGl0eSBtYWNyb3MgZm9yIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorCisjZGVmaW5lIFB5Q2xhc3NfQ2hlY2sob2JqKSBQeU9iamVjdF9Jc0luc3RhbmNlKG9iaiwgKFB5T2JqZWN0ICopJlB5VHlwZV9UeXBlKQorI2RlZmluZSBQeUludF9DaGVjayh4KSBQeUxvbmdfQ2hlY2soeCkKKyNkZWZpbmUgUHlJbnRfQXNMb25nKHgpIFB5TG9uZ19Bc0xvbmcoeCkKKyNkZWZpbmUgUHlJbnRfRnJvbUxvbmcoeCkgUHlMb25nX0Zyb21Mb25nKHgpCisjZGVmaW5lIFB5U3RyaW5nX0NoZWNrKG5hbWUpIFB5Qnl0ZXNfQ2hlY2sobmFtZSkKKyNkZWZpbmUgUHlTdHJpbmdfRnJvbVN0cmluZyh4KSBQeVVuaWNvZGVfRnJvbVN0cmluZyh4KQorI2RlZmluZSBQeVN0cmluZ19Gb3JtYXQoZm10LCBhcmdzKSAgUHlVbmljb2RlX0Zvcm1hdChmbXQsIGFyZ3MpCisjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nKHN0cikgUHlCeXRlc19Bc1N0cmluZyhzdHIpCisjZGVmaW5lIFB5U3RyaW5nX1NpemUoc3RyKSBQeUJ5dGVzX1NpemUoc3RyKQorI2RlZmluZSBQeVN0cmluZ19JbnRlcm5Gcm9tU3RyaW5nKGtleSkgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoa2V5KQorI2RlZmluZSBQeV9UUEZMQUdTX0hBVkVfQ0xBU1MgUHlfVFBGTEFHU19CQVNFVFlQRQorI2RlZmluZSBQeVN0cmluZ19BU19TVFJJTkcoeCkgUHlVbmljb2RlX0FTX1NUUklORyh4KQorI2RlZmluZSBfUHlMb25nX0Zyb21Tc2l6ZV90KHgpIFB5TG9uZ19Gcm9tU3NpemVfdCh4KQorCisjZW5kaWYKKworI2lmbmRlZiBQeV9UWVBFCisjICBkZWZpbmUgUHlfVFlQRShvcCkgKChvcCktPm9iX3R5cGUpCisjZW5kaWYKKworLyogU1dJRyBBUElzIGZvciBjb21wYXRpYmlsaXR5IG9mIGJvdGggUHl0aG9uIDIgJiAzICovCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQgUHlVbmljb2RlX0Zyb21Gb3JtYXQKKyNlbHNlCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQgUHlTdHJpbmdfRnJvbUZvcm1hdAorI2VuZGlmCisKKworLyogV2FybmluZzogVGhpcyBmdW5jdGlvbiB3aWxsIGFsbG9jYXRlIGEgbmV3IHN0cmluZyBpbiBQeXRob24gMywKKyAqIHNvIHBsZWFzZSBjYWxsIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoeCkgdG8gZnJlZSB0aGUgc3BhY2UuCisgKi8KK1NXSUdJTlRFUk4gY2hhcioKK1NXSUdfUHl0aG9uX3N0cl9Bc0NoYXIoUHlPYmplY3QgKnN0cikKK3sKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIGNoYXIgKmNzdHI7CisgIGNoYXIgKm5ld3N0cjsKKyAgUHlfc3NpemVfdCBsZW47CisgIHN0ciA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcoc3RyKTsKKyAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUoc3RyLCAmY3N0ciwgJmxlbik7CisgIG5ld3N0ciA9IChjaGFyICopIG1hbGxvYyhsZW4rMSk7CisgIG1lbWNweShuZXdzdHIsIGNzdHIsIGxlbisxKTsKKyAgUHlfWERFQ1JFRihzdHIpOworICByZXR1cm4gbmV3c3RyOworI2Vsc2UKKyAgcmV0dXJuIFB5U3RyaW5nX0FzU3RyaW5nKHN0cik7CisjZW5kaWYKK30KKworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyMgIGRlZmluZSBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHgpIGZyZWUoICh2b2lkKikgKHgpICkKKyNlbHNlCisjICBkZWZpbmUgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh4KQorI2VuZGlmCisKKworU1dJR0lOVEVSTiBQeU9iamVjdCoKK1NXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcihjb25zdCBjaGFyICpjKQoreworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgcmV0dXJuIFB5VW5pY29kZV9Gcm9tU3RyaW5nKGMpOworI2Vsc2UKKyAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYyk7CisjZW5kaWYKK30KKworLyogQWRkIFB5T1Nfc25wcmludGYgZm9yIG9sZCBQeXRob25zICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisjIGlmIGRlZmluZWQoX01TQ19WRVIpIHx8IGRlZmluZWQoX19CT1JMQU5EQ19fKSB8fCBkZWZpbmVkKF9XQVRDT00pCisjICBkZWZpbmUgUHlPU19zbnByaW50ZiBfc25wcmludGYKKyMgZWxzZQorIyAgZGVmaW5lIFB5T1Nfc25wcmludGYgc25wcmludGYKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBBIGNydWRlIFB5U3RyaW5nX0Zyb21Gb3JtYXQgaW1wbGVtZW50YXRpb24gZm9yIG9sZCBQeXRob25zICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisKKyNpZm5kZWYgU1dJR19QWUJVRkZFUl9TSVpFCisjIGRlZmluZSBTV0lHX1BZQlVGRkVSX1NJWkUgMTAyNAorI2VuZGlmCisKK3N0YXRpYyBQeU9iamVjdCAqCitQeVN0cmluZ19Gcm9tRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CisgIHZhX2xpc3QgYXA7CisgIGNoYXIgYnVmW1NXSUdfUFlCVUZGRVJfU0laRSAqIDJdOworICBpbnQgcmVzOworICB2YV9zdGFydChhcCwgZm10KTsKKyAgcmVzID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZtdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gKHJlcyA8IDAgfHwgcmVzID49IChpbnQpc2l6ZW9mKGJ1ZikpID8gMCA6IFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsKK30KKyNlbmRpZgorCisvKiBBZGQgUHlPYmplY3RfRGVsIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMTA2MDAwMAorIyBkZWZpbmUgUHlPYmplY3RfRGVsKG9wKSBQeU1lbV9ERUwoKG9wKSkKKyNlbmRpZgorI2lmbmRlZiBQeU9iamVjdF9ERUwKKyMgZGVmaW5lIFB5T2JqZWN0X0RFTCBQeU9iamVjdF9EZWwKKyNlbmRpZgorCisvKiBBIGNydWRlIFB5RXhjX1N0b3BJdGVyYXRpb24gZXhjZXB0aW9uIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorIyBpZm5kZWYgUHlFeGNfU3RvcEl0ZXJhdGlvbgorIyAgZGVmaW5lIFB5RXhjX1N0b3BJdGVyYXRpb24gUHlFeGNfUnVudGltZUVycm9yCisjIGVuZGlmCisjIGlmbmRlZiBQeU9iamVjdF9HZW5lcmljR2V0QXR0cgorIyAgZGVmaW5lIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvKiBQeV9Ob3RJbXBsZW1lbnRlZCBpcyBkZWZpbmVkIGluIDIuMSBhbmQgdXAuICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDEwMDAwCisjIGlmbmRlZiBQeV9Ob3RJbXBsZW1lbnRlZAorIyAgZGVmaW5lIFB5X05vdEltcGxlbWVudGVkIFB5RXhjX1J1bnRpbWVFcnJvcgorIyBlbmRpZgorI2VuZGlmCisKKy8qIEEgY3J1ZGUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplIGltcGxlbWVudGF0aW9uIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAxMDAwMAorIyBpZm5kZWYgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplCisjICBkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9iaiwgcywgbGVuKSB7KnMgPSBQeVN0cmluZ19Bc1N0cmluZyhvYmopOyAqbGVuID0gKnMgPyBzdHJsZW4oKnMpIDogMDt9CisjIGVuZGlmCisjZW5kaWYKKworLyogUHlTZXF1ZW5jZV9TaXplIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAwMDAwMAorIyBpZm5kZWYgUHlTZXF1ZW5jZV9TaXplCisjICBkZWZpbmUgUHlTZXF1ZW5jZV9TaXplIFB5U2VxdWVuY2VfTGVuZ3RoCisjIGVuZGlmCisjZW5kaWYKKworLyogUHlCb29sX0Zyb21Mb25nIGZvciBvbGQgUHl0aG9ucyAqLworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAzMDAwMAorc3RhdGljCitQeU9iamVjdCAqUHlCb29sX0Zyb21Mb25nKGxvbmcgb2spCit7CisgIFB5T2JqZWN0ICpyZXN1bHQgPSBvayA/IFB5X1RydWUgOiBQeV9GYWxzZTsKKyAgUHlfSU5DUkVGKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyogUHlfc3NpemVfdCBmb3Igb2xkIFB5dGhvbnMgKi8KKy8qIFRoaXMgY29kZSBpcyBhcyByZWNvbW1lbmRlZCBieTogKi8KKy8qIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDM1My8jY29udmVyc2lvbi1ndWlkZWxpbmVzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwICYmICFkZWZpbmVkKFBZX1NTSVpFX1RfTUlOKQordHlwZWRlZiBpbnQgUHlfc3NpemVfdDsKKyMgZGVmaW5lIFBZX1NTSVpFX1RfTUFYIElOVF9NQVgKKyMgZGVmaW5lIFBZX1NTSVpFX1RfTUlOIElOVF9NSU4KK3R5cGVkZWYgaW5xdWlyeSBsZW5mdW5jOwordHlwZWRlZiBpbnRhcmdmdW5jIHNzaXplYXJnZnVuYzsKK3R5cGVkZWYgaW50aW50YXJnZnVuYyBzc2l6ZXNzaXplYXJnZnVuYzsKK3R5cGVkZWYgaW50b2JqYXJncHJvYyBzc2l6ZW9iamFyZ3Byb2M7Cit0eXBlZGVmIGludGludG9iamFyZ3Byb2Mgc3NpemVzc2l6ZW9iamFyZ3Byb2M7Cit0eXBlZGVmIGdldHJlYWRidWZmZXJwcm9jIHJlYWRidWZmZXJwcm9jOwordHlwZWRlZiBnZXR3cml0ZWJ1ZmZlcnByb2Mgd3JpdGVidWZmZXJwcm9jOwordHlwZWRlZiBnZXRzZWdjb3VudHByb2Mgc2VnY291bnRwcm9jOwordHlwZWRlZiBnZXRjaGFyYnVmZmVycHJvYyBjaGFyYnVmZmVycHJvYzsKK3N0YXRpYyBsb25nIFB5TnVtYmVyX0FzU3NpemVfdCAoUHlPYmplY3QgKngsIHZvaWQgKlNXSUdVTlVTRURQQVJNKGV4YykpCit7CisgIGxvbmcgcmVzdWx0ID0gMDsKKyAgUHlPYmplY3QgKmkgPSBQeU51bWJlcl9JbnQoeCk7CisgIGlmIChpKSB7CisgICAgcmVzdWx0ID0gUHlJbnRfQXNMb25nKGkpOworICAgIFB5X0RFQ1JFRihpKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNDAwMDAKKyNkZWZpbmUgUHlfVklTSVQob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAob3ApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGludCB2cmV0ID0gdmlzaXQoKG9wKSwgYXJnKTsgICAgICAgICAgICAgIFwKKyAgICAgIGlmICh2cmV0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHZyZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDMwMDAwCit0eXBlZGVmIHN0cnVjdCB7CisgIFB5VHlwZU9iamVjdCB0eXBlOworICBQeU51bWJlck1ldGhvZHMgYXNfbnVtYmVyOworICBQeU1hcHBpbmdNZXRob2RzIGFzX21hcHBpbmc7CisgIFB5U2VxdWVuY2VNZXRob2RzIGFzX3NlcXVlbmNlOworICBQeUJ1ZmZlclByb2NzIGFzX2J1ZmZlcjsKKyAgUHlPYmplY3QgKm5hbWUsICpzbG90czsKK30gUHlIZWFwVHlwZU9iamVjdDsKKyNlbmRpZgorCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDMwMDAwCit0eXBlZGVmIGRlc3RydWN0b3IgZnJlZWZ1bmM7CisjZW5kaWYKKworI2lmICgoUFlfTUFKT1JfVkVSU0lPTiA9PSAyICYmIFBZX01JTk9SX1ZFUlNJT04gPiA2KSB8fCBcCisgICAgIChQWV9NQUpPUl9WRVJTSU9OID09IDMgJiYgUFlfTUlOT1JfVkVSU0lPTiA+IDApIHx8IFwKKyAgICAgKFBZX01BSk9SX1ZFUlNJT04gPiAzKSkKKyMgZGVmaW5lIFNXSUdQWV9VU0VfQ0FQU1VMRQorIyBkZWZpbmUgU1dJR1BZX0NBUFNVTEVfTkFNRSAoKGNoYXIqKSJzd2lnX3J1bnRpbWVfZGF0YSIgU1dJR19SVU5USU1FX1ZFUlNJT04gIi50eXBlX3BvaW50ZXJfY2Fwc3VsZSIgU1dJR19UWVBFX1RBQkxFX05BTUUpCisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAyMDAwMAorI2RlZmluZSBQeURlc2NyX1RZUEUoeCkgKCgoUHlEZXNjck9iamVjdCAqKSh4KSktPmRfdHlwZSkKKyNkZWZpbmUgUHlEZXNjcl9OQU1FKHgpICgoKFB5RGVzY3JPYmplY3QgKikoeCkpLT5kX25hbWUpCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGVycm9yIG1hbmlwdWxhdGlvbgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworU1dJR1JVTlRJTUUgUHlPYmplY3QqCitTV0lHX1B5dGhvbl9FcnJvclR5cGUoaW50IGNvZGUpIHsKKyAgUHlPYmplY3QqIHR5cGUgPSAwOworICBzd2l0Y2goY29kZSkgeworICBjYXNlIFNXSUdfTWVtb3J5RXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX01lbW9yeUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfSU9FcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfSU9FcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1J1bnRpbWVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfUnVudGltZUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfSW5kZXhFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfSW5kZXhFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1R5cGVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfVHlwZUVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfRGl2aXNpb25CeVplcm86CisgICAgdHlwZSA9IFB5RXhjX1plcm9EaXZpc2lvbkVycm9yOworICAgIGJyZWFrOworICBjYXNlIFNXSUdfT3ZlcmZsb3dFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfT3ZlcmZsb3dFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1N5bnRheEVycm9yOgorICAgIHR5cGUgPSBQeUV4Y19TeW50YXhFcnJvcjsKKyAgICBicmVhazsKKyAgY2FzZSBTV0lHX1ZhbHVlRXJyb3I6CisgICAgdHlwZSA9IFB5RXhjX1ZhbHVlRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19TeXN0ZW1FcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfU3lzdGVtRXJyb3I7CisgICAgYnJlYWs7CisgIGNhc2UgU1dJR19BdHRyaWJ1dGVFcnJvcjoKKyAgICB0eXBlID0gUHlFeGNfQXR0cmlidXRlRXJyb3I7CisgICAgYnJlYWs7CisgIGRlZmF1bHQ6CisgICAgdHlwZSA9IFB5RXhjX1J1bnRpbWVFcnJvcjsKKyAgfQorICByZXR1cm4gdHlwZTsKK30KKworCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1B5dGhvbl9BZGRFcnJvck1zZyhjb25zdCBjaGFyKiBtZXNnKQoreworICBQeU9iamVjdCAqdHlwZSA9IDA7CisgIFB5T2JqZWN0ICp2YWx1ZSA9IDA7CisgIFB5T2JqZWN0ICp0cmFjZWJhY2sgPSAwOworCisgIGlmIChQeUVycl9PY2N1cnJlZCgpKSBQeUVycl9GZXRjaCgmdHlwZSwgJnZhbHVlLCAmdHJhY2ViYWNrKTsKKyAgaWYgKHZhbHVlKSB7CisgICAgY2hhciAqdG1wOworICAgIFB5T2JqZWN0ICpvbGRfc3RyID0gUHlPYmplY3RfU3RyKHZhbHVlKTsKKyAgICBQeUVycl9DbGVhcigpOworICAgIFB5X1hJTkNSRUYodHlwZSk7CisKKyAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSwgbWVzZyk7CisgICAgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myh0bXApOworICAgIFB5X0RFQ1JFRihvbGRfc3RyKTsKKyAgICBQeV9ERUNSRUYodmFsdWUpOworICB9IGVsc2UgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsIG1lc2cpOworICB9Cit9CisKKyNpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX05PX1RIUkVBRFMpCisjICBpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRFMpCisjICAgIHVuZGVmIFNXSUdfUFlUSE9OX1RIUkVBRFMKKyMgIGVuZGlmCisjZW5kaWYKKyNpZiBkZWZpbmVkKFNXSUdfUFlUSE9OX1RIUkVBRFMpIC8qIFRocmVhZGluZyBzdXBwb3J0IGlzIGVuYWJsZWQgKi8KKyMgIGlmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1VTRV9HSUwpICYmICFkZWZpbmVkKFNXSUdfUFlUSE9OX05PX1VTRV9HSUwpCisjICAgIGlmIChQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDMwMDAwKSAvKiBGb3IgMi4zIG9yIGxhdGVyLCB1c2UgdGhlIFB5R0lMU3RhdGUgY2FsbHMgKi8KKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVVNFX0dJTAorIyAgICBlbmRpZgorIyAgZW5kaWYKKyMgIGlmIGRlZmluZWQoU1dJR19QWVRIT05fVVNFX0dJTCkgLyogVXNlIFB5R0lMU3RhdGUgdGhyZWFkcyBjYWxscyAqLworIyAgICBpZm5kZWYgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTCisjICAgICBkZWZpbmUgU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTICBQeUV2YWxfSW5pdFRocmVhZHMoKQorIyAgICBlbmRpZgorIyAgICBpZmRlZiBfX2NwbHVzcGx1cyAvKiBDKysgY29kZSAqLworICAgICAgIGNsYXNzIFNXSUdfUHl0aG9uX1RocmVhZF9CbG9jayB7CisgICAgICAgICBib29sIHN0YXR1czsKKyAgICAgICAgIFB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CisgICAgICAgcHVibGljOgorICAgICAgICAgdm9pZCBlbmQoKSB7IGlmIChzdGF0dXMpIHsgUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsgc3RhdHVzID0gZmFsc2U7fSB9CisgICAgICAgICBTV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2soKSA6IHN0YXR1cyh0cnVlKSwgc3RhdGUoUHlHSUxTdGF0ZV9FbnN1cmUoKSkge30KKyAgICAgICAgIH5TV0lHX1B5dGhvbl9UaHJlYWRfQmxvY2soKSB7IGVuZCgpOyB9CisgICAgICAgfTsKKyAgICAgICBjbGFzcyBTV0lHX1B5dGhvbl9UaHJlYWRfQWxsb3cgeworICAgICAgICAgYm9vbCBzdGF0dXM7CisgICAgICAgICBQeVRocmVhZFN0YXRlICpzYXZlOworICAgICAgIHB1YmxpYzoKKyAgICAgICAgIHZvaWQgZW5kKCkgeyBpZiAoc3RhdHVzKSB7IFB5RXZhbF9SZXN0b3JlVGhyZWFkKHNhdmUpOyBzdGF0dXMgPSBmYWxzZTsgfX0KKyAgICAgICAgIFNXSUdfUHl0aG9uX1RocmVhZF9BbGxvdygpIDogc3RhdHVzKHRydWUpLCBzYXZlKFB5RXZhbF9TYXZlVGhyZWFkKCkpIHt9CisgICAgICAgICB+U1dJR19QeXRob25fVGhyZWFkX0FsbG93KCkgeyBlbmQoKTsgfQorICAgICAgIH07CisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSyAgIFNXSUdfUHl0aG9uX1RocmVhZF9CbG9jayBfc3dpZ190aHJlYWRfYmxvY2sKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSyAgICAgX3N3aWdfdGhyZWFkX2Jsb2NrLmVuZCgpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9BTExPVyAgIFNXSUdfUHl0aG9uX1RocmVhZF9BbGxvdyBfc3dpZ190aHJlYWRfYWxsb3cKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVyAgICAgX3N3aWdfdGhyZWFkX2FsbG93LmVuZCgpCisjICAgIGVsc2UgLyogQyBjb2RlICovCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSyAgIFB5R0lMU3RhdGVfU1RBVEUgX3N3aWdfdGhyZWFkX2Jsb2NrID0gUHlHSUxTdGF0ZV9FbnN1cmUoKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLICAgICBQeUdJTFN0YXRlX1JlbGVhc2UoX3N3aWdfdGhyZWFkX2Jsb2NrKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cgICBQeVRocmVhZFN0YXRlICpfc3dpZ190aHJlYWRfYWxsb3cgPSBQeUV2YWxfU2F2ZVRocmVhZCgpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQUxMT1cgICAgIFB5RXZhbF9SZXN0b3JlVGhyZWFkKF9zd2lnX3RocmVhZF9hbGxvdykKKyMgICAgZW5kaWYKKyMgIGVsc2UgLyogT2xkIHRocmVhZCB3YXksIG5vdCBpbXBsZW1lbnRlZCwgdXNlciBtdXN0IHByb3ZpZGUgaXQgKi8KKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fSU5JVElBTElaRV9USFJFQURTKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9JTklUSUFMSVpFX1RIUkVBRFMKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0JMT0NLKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sKKyMgICAgZW5kaWYKKyMgICAgaWYgIWRlZmluZWQoU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSykKKyMgICAgICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSworIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQUxMT1cpCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9BTExPVworIyAgICBlbmRpZgorIyAgICBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9USFJFQURfRU5EX0FMTE9XKQorIyAgICAgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0FMTE9XCisjICAgIGVuZGlmCisjICBlbmRpZgorI2Vsc2UgLyogTm8gdGhyZWFkIHN1cHBvcnQgKi8KKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9JTklUSUFMSVpFX1RIUkVBRFMKKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0sKKyMgIGRlZmluZSBTV0lHX1BZVEhPTl9USFJFQURfRU5EX0JMT0NLCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0JFR0lOX0FMTE9XCisjICBkZWZpbmUgU1dJR19QWVRIT05fVEhSRUFEX0VORF9BTExPVworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQeXRob24gQVBJIHBvcnRpb24gdGhhdCBnb2VzIGludG8gdGhlIHJ1bnRpbWUKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvbnN0YW50IGRlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ29uc3RhbnQgVHlwZXMgKi8KKyNkZWZpbmUgU1dJR19QWV9QT0lOVEVSIDQKKyNkZWZpbmUgU1dJR19QWV9CSU5BUlkgIDUKKworLyogQ29uc3RhbnQgaW5mb3JtYXRpb24gc3RydWN0dXJlICovCit0eXBlZGVmIHN0cnVjdCBzd2lnX2NvbnN0X2luZm8geworICBpbnQgdHlwZTsKKyAgY2hhciAqbmFtZTsKKyAgbG9uZyBsdmFsdWU7CisgIGRvdWJsZSBkdmFsdWU7CisgIHZvaWQgICAqcHZhbHVlOworICBzd2lnX3R5cGVfaW5mbyAqKnB0eXBlOworfSBzd2lnX2NvbnN0X2luZm87CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFdyYXBwZXIgb2YgUHlJbnN0YW5jZU1ldGhvZF9OZXcoKSB1c2VkIGluIFB5dGhvbiAzCisgKiBJdCBpcyBleHBvcnRlZCB0byB0aGUgZ2VuZXJhdGVkIG1vZHVsZSwgdXNlZCBmb3IgLWZhc3Rwcm94eQorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCitTV0lHUlVOVElNRSBQeU9iamVjdCogU1dJR19QeUluc3RhbmNlTWV0aG9kX05ldyhQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICpmdW5jKQoreworICByZXR1cm4gUHlJbnN0YW5jZU1ldGhvZF9OZXcoZnVuYyk7Cit9CisjZWxzZQorU1dJR1JVTlRJTUUgUHlPYmplY3QqIFNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXcoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oZnVuYykpCit7CisgIHJldHVybiBOVUxMOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHB5cnVuLnN3ZworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyB0aGUgcnVudGltZSBzdXBwb3J0IGZvciBQeXRob24gbW9kdWxlcworICogYW5kIGluY2x1ZGVzIGNvZGUgZm9yIG1hbmFnaW5nIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHBvaW50ZXIKKyAqIHR5cGUgY2hlY2tpbmcuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ29tbW9uIFNXSUcgQVBJICovCisKKy8qIGZvciByYXcgcG9pbnRlcnMgKi8KKyNkZWZpbmUgU1dJR19QeXRob25fQ29udmVydFB0cihvYmosIHBwdHIsIHR5cGUsIGZsYWdzKSAgU1dJR19QeXRob25fQ29udmVydFB0ckFuZE93bihvYmosIHBwdHIsIHR5cGUsIGZsYWdzLCAwKQorI2RlZmluZSBTV0lHX0NvbnZlcnRQdHIob2JqLCBwcHRyLCB0eXBlLCBmbGFncykgICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MpCisjZGVmaW5lIFNXSUdfQ29udmVydFB0ckFuZE93bihvYmoscHB0cix0eXBlLGZsYWdzLG93bikgIFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJBbmRPd24ob2JqLCBwcHRyLCB0eXBlLCBmbGFncywgb3duKQorCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisjZGVmaW5lIFNXSUdfTmV3UG9pbnRlck9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooc2VsZiwgcHRyLCB0eXBlLCBmbGFncykKKyNlbHNlCisjZGVmaW5lIFNXSUdfTmV3UG9pbnRlck9iaihwdHIsIHR5cGUsIGZsYWdzKSAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCBmbGFncykKKyNlbmRpZgorCisjZGVmaW5lIFNXSUdfSW50ZXJuYWxOZXdQb2ludGVyT2JqKHB0ciwgdHlwZSwgZmxhZ3MpICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCBmbGFncykKKworI2RlZmluZSBTV0lHX0NoZWNrSW1wbGljaXQodHkpICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9DaGVja0ltcGxpY2l0KHR5KQorI2RlZmluZSBTV0lHX0FjcXVpcmVQdHIocHRyLCBzcmMpICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9BY3F1aXJlUHRyKHB0ciwgc3JjKQorI2RlZmluZSBzd2lnX293bnR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQKKworLyogZm9yIHJhdyBwYWNrZWQgZGF0YSAqLworI2RlZmluZSBTV0lHX0NvbnZlcnRQYWNrZWQob2JqLCBwdHIsIHN6LCB0eSkgICAgICAgICAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UGFja2VkKG9iaiwgcHRyLCBzeiwgdHkpCisjZGVmaW5lIFNXSUdfTmV3UGFja2VkT2JqKHB0ciwgc3osIHR5cGUpICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BhY2tlZE9iaihwdHIsIHN6LCB0eXBlKQorCisvKiBmb3IgY2xhc3Mgb3Igc3RydWN0IHBvaW50ZXJzICovCisjZGVmaW5lIFNXSUdfQ29udmVydEluc3RhbmNlKG9iaiwgcHB0ciwgdHlwZSwgZmxhZ3MpICAgIFNXSUdfQ29udmVydFB0cihvYmosIHBwdHIsIHR5cGUsIGZsYWdzKQorI2RlZmluZSBTV0lHX05ld0luc3RhbmNlT2JqKHB0ciwgdHlwZSwgZmxhZ3MpICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmoocHRyLCB0eXBlLCBmbGFncykKKworLyogZm9yIEMgb3IgQysrIGZ1bmN0aW9uIHBvaW50ZXJzICovCisjZGVmaW5lIFNXSUdfQ29udmVydEZ1bmN0aW9uUHRyKG9iaiwgcHB0ciwgdHlwZSkgICAgICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRGdW5jdGlvblB0cihvYmosIHBwdHIsIHR5cGUpCisjZGVmaW5lIFNXSUdfTmV3RnVuY3Rpb25QdHJPYmoocHRyLCB0eXBlKSAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX05ld1BvaW50ZXJPYmooTlVMTCwgcHRyLCB0eXBlLCAwKQorCisvKiBmb3IgQysrIG1lbWJlciBwb2ludGVycywgaWUsIG1lbWJlciBtZXRob2RzICovCisjZGVmaW5lIFNXSUdfQ29udmVydE1lbWJlcihvYmosIHB0ciwgc3osIHR5KSAgICAgICAgICAgIFNXSUdfUHl0aG9uX0NvbnZlcnRQYWNrZWQob2JqLCBwdHIsIHN6LCB0eSkKKyNkZWZpbmUgU1dJR19OZXdNZW1iZXJPYmoocHRyLCBzeiwgdHlwZSkgICAgICAgICAgICAgICAgU1dJR19QeXRob25fTmV3UGFja2VkT2JqKHB0ciwgc3osIHR5cGUpCisKKworLyogUnVudGltZSBBUEkgKi8KKworI2RlZmluZSBTV0lHX0dldE1vZHVsZShjbGllbnRkYXRhKSAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9HZXRNb2R1bGUoKQorI2RlZmluZSBTV0lHX1NldE1vZHVsZShjbGllbnRkYXRhLCBwb2ludGVyKSAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRNb2R1bGUocG9pbnRlcikKKyNkZWZpbmUgU1dJR19OZXdDbGllbnREYXRhKG9iaikgICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5Q2xpZW50RGF0YV9OZXcob2JqKQorCisjZGVmaW5lIFNXSUdfU2V0RXJyb3JPYmogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX1NldEVycm9yT2JqCisjZGVmaW5lIFNXSUdfU2V0RXJyb3JNc2cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX1NldEVycm9yTXNnCisjZGVmaW5lIFNXSUdfRXJyb3JUeXBlKGNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNXSUdfUHl0aG9uX0Vycm9yVHlwZShjb2RlKQorI2RlZmluZSBTV0lHX0Vycm9yKGNvZGUsIG1zZykgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9TZXRFcnJvck1zZyhTV0lHX0Vycm9yVHlwZShjb2RlKSwgbXNnKQorI2RlZmluZSBTV0lHX2ZhaWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZhaWwKKworCisvKiBSdW50aW1lIEFQSSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiBFcnJvciBtYW5pcHVsYXRpb24gKi8KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRFcnJvck9iaihQeU9iamVjdCAqZXJydHlwZSwgUHlPYmplY3QgKm9iaikgeworICBTV0lHX1BZVEhPTl9USFJFQURfQkVHSU5fQkxPQ0s7CisgIFB5RXJyX1NldE9iamVjdChlcnJ0eXBlLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKKyAgU1dJR19QWVRIT05fVEhSRUFEX0VORF9CTE9DSzsKK30KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRFcnJvck1zZyhQeU9iamVjdCAqZXJydHlwZSwgY29uc3QgY2hhciAqbXNnKSB7CisgIFNXSUdfUFlUSE9OX1RIUkVBRF9CRUdJTl9CTE9DSzsKKyAgUHlFcnJfU2V0U3RyaW5nKGVycnR5cGUsIChjaGFyICopIG1zZyk7CisgIFNXSUdfUFlUSE9OX1RIUkVBRF9FTkRfQkxPQ0s7Cit9CisKKyNkZWZpbmUgU1dJR19QeXRob25fUmFpc2Uob2JqLCB0eXBlLCBkZXNjKSAgU1dJR19QeXRob25fU2V0RXJyb3JPYmooU1dJR19QeXRob25fRXhjZXB0aW9uVHlwZShkZXNjKSwgb2JqKQorCisvKiBTZXQgYSBjb25zdGFudCB2YWx1ZSAqLworCisjaWYgZGVmaW5lZChTV0lHUFlUSE9OX0JVSUxUSU4pCisKK1NXSUdJTlRFUk4gdm9pZAorU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2woUHlPYmplY3QgKnNlcSwgY29uc3QgY2hhciAqa2V5KSB7CisgIFB5T2JqZWN0ICpzID0gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZyhrZXkpOworICBQeUxpc3RfQXBwZW5kKHNlcSwgcyk7CisgIFB5X0RFQ1JFRihzKTsKK30KKworU1dJR0lOVEVSTiB2b2lkCitTV0lHX1B5dGhvbl9TZXRDb25zdGFudChQeU9iamVjdCAqZCwgUHlPYmplY3QgKnB1YmxpY19pbnRlcmZhY2UsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvYmopIHsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIgKiluYW1lLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKKyAgaWYgKHB1YmxpY19pbnRlcmZhY2UpCisgICAgU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2wocHVibGljX2ludGVyZmFjZSwgbmFtZSk7Cit9CisKKyNlbHNlCisKK1NXSUdJTlRFUk4gdm9pZAorU1dJR19QeXRob25fU2V0Q29uc3RhbnQoUHlPYmplY3QgKmQsIGNvbnN0IGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvYmopIHsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgKGNoYXIgKiluYW1lLCBvYmopOworICBQeV9ERUNSRUYob2JqKTsKK30KKworI2VuZGlmCisKKy8qIEFwcGVuZCBhIHZhbHVlIHRvIHRoZSByZXN1bHQgb2JqICovCisKK1NXSUdJTlRFUk4gUHlPYmplY3QqCitTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQoUHlPYmplY3QqIHJlc3VsdCwgUHlPYmplY3QqIG9iaikgeworI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX09VVFBVVF9UVVBMRSkKKyAgaWYgKCFyZXN1bHQpIHsKKyAgICByZXN1bHQgPSBvYmo7CisgIH0gZWxzZSBpZiAocmVzdWx0ID09IFB5X05vbmUpIHsKKyAgICBQeV9ERUNSRUYocmVzdWx0KTsKKyAgICByZXN1bHQgPSBvYmo7CisgIH0gZWxzZSB7CisgICAgaWYgKCFQeUxpc3RfQ2hlY2socmVzdWx0KSkgeworICAgICAgUHlPYmplY3QgKm8yID0gcmVzdWx0OworICAgICAgcmVzdWx0ID0gUHlMaXN0X05ldygxKTsKKyAgICAgIFB5TGlzdF9TZXRJdGVtKHJlc3VsdCwgMCwgbzIpOworICAgIH0KKyAgICBQeUxpc3RfQXBwZW5kKHJlc3VsdCxvYmopOworICAgIFB5X0RFQ1JFRihvYmopOworICB9CisgIHJldHVybiByZXN1bHQ7CisjZWxzZQorICBQeU9iamVjdCogICBvMjsKKyAgUHlPYmplY3QqICAgbzM7CisgIGlmICghcmVzdWx0KSB7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgaWYgKHJlc3VsdCA9PSBQeV9Ob25lKSB7CisgICAgUHlfREVDUkVGKHJlc3VsdCk7CisgICAgcmVzdWx0ID0gb2JqOworICB9IGVsc2UgeworICAgIGlmICghUHlUdXBsZV9DaGVjayhyZXN1bHQpKSB7CisgICAgICBvMiA9IHJlc3VsdDsKKyAgICAgIHJlc3VsdCA9IFB5VHVwbGVfTmV3KDEpOworICAgICAgUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIDAsIG8yKTsKKyAgICB9CisgICAgbzMgPSBQeVR1cGxlX05ldygxKTsKKyAgICBQeVR1cGxlX1NFVF9JVEVNKG8zLCAwLCBvYmopOworICAgIG8yID0gcmVzdWx0OworICAgIHJlc3VsdCA9IFB5U2VxdWVuY2VfQ29uY2F0KG8yLCBvMyk7CisgICAgUHlfREVDUkVGKG8yKTsKKyAgICBQeV9ERUNSRUYobzMpOworICB9CisgIHJldHVybiByZXN1bHQ7CisjZW5kaWYKK30KKworLyogVW5wYWNrIHRoZSBhcmd1bWVudCB0dXBsZSAqLworCitTV0lHSU5URVJOIGludAorU1dJR19QeXRob25fVW5wYWNrVHVwbGUoUHlPYmplY3QgKmFyZ3MsIGNvbnN0IGNoYXIgKm5hbWUsIFB5X3NzaXplX3QgbWluLCBQeV9zc2l6ZV90IG1heCwgUHlPYmplY3QgKipvYmpzKQoreworICBpZiAoIWFyZ3MpIHsKKyAgICBpZiAoIW1pbiAmJiAhbWF4KSB7CisgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIiVzIGV4cGVjdGVkICVzJWQgYXJndW1lbnRzLCBnb3Qgbm9uZSIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgKGludCltaW4pOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIGlmICghUHlUdXBsZV9DaGVjayhhcmdzKSkgeworICAgIGlmIChtaW4gPD0gMSAmJiBtYXggPj0gMSkgeworICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICBvYmpzWzBdID0gYXJnczsKKyAgICAgIGZvciAoaSA9IDE7IGkgPCBtYXg7ICsraSkgeworICAgICAgICBvYmpzW2ldID0gMDsKKyAgICAgIH0KKyAgICAgIHJldHVybiAyOworICAgIH0KKyAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfU3lzdGVtRXJyb3IsICJVbnBhY2tUdXBsZSgpIGFyZ3VtZW50IGxpc3QgaXMgbm90IGEgdHVwbGUiKTsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZWdpc3RlciBQeV9zc2l6ZV90IGwgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOworICAgIGlmIChsIDwgbWluKSB7CisgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiJXMgZXhwZWN0ZWQgJXMlZCBhcmd1bWVudHMsIGdvdCAlZCIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgKG1pbiA9PSBtYXggPyAiIiA6ICJhdCBsZWFzdCAiKSwgKGludCltaW4sIChpbnQpbCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgaWYgKGwgPiBtYXgpIHsKKyAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICIlcyBleHBlY3RlZCAlcyVkIGFyZ3VtZW50cywgZ290ICVkIiwKKyAgICAgICAgICAgICAgICAgICBuYW1lLCAobWluID09IG1heCA/ICIiIDogImF0IG1vc3QgIiksIChpbnQpbWF4LCAoaW50KWwpOworICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlZ2lzdGVyIGludCBpOworICAgICAgZm9yIChpID0gMDsgaSA8IGw7ICsraSkgeworICAgICAgICBvYmpzW2ldID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKTsKKyAgICAgIH0KKyAgICAgIGZvciAoOyBsIDwgbWF4OyArK2wpIHsKKyAgICAgICAgb2Jqc1tsXSA9IDA7CisgICAgICB9CisgICAgICByZXR1cm4gaSArIDE7CisgICAgfQorICB9Cit9CisKKy8qIEEgZnVuY3RvciBpcyBhIGZ1bmN0aW9uIG9iamVjdCB3aXRoIG9uZSBzaW5nbGUgb2JqZWN0IGFyZ3VtZW50ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorI2RlZmluZSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihmdW5jdG9yLCBvYmopICAgICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb25PYmpBcmdzKGZ1bmN0b3IsIG9iaiwgTlVMTCk7CisjZWxzZQorI2RlZmluZSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihmdW5jdG9yLCBvYmopICAgICAgICAgICBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuY3RvciwgIk8iLCBvYmopOworI2VuZGlmCisKKy8qCisgIEhlbHBlciBmb3Igc3RhdGljIHBvaW50ZXIgaW5pdGlhbGl6YXRpb24gZm9yIGJvdGggQyBhbmQgQysrIGNvZGUsIGZvciBleGFtcGxlCisgIHN0YXRpYyBQeU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUihNeVZhcikgPSBOZXdTb21ldGhpbmcoLi4uKTsKKyovCisjaWZkZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgU1dJR19TVEFUSUNfUE9JTlRFUih2YXIpICB2YXIKKyNlbHNlCisjZGVmaW5lIFNXSUdfU1RBVElDX1BPSU5URVIodmFyKSAgdmFyID0gMDsgaWYgKCF2YXIpIHZhcgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBQb2ludGVyIGRlY2xhcmF0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogRmxhZ3MgZm9yIG5ldyBwb2ludGVyIG9iamVjdHMgKi8KKyNkZWZpbmUgU1dJR19QT0lOVEVSX05PU0hBRE9XICAgICAgIChTV0lHX1BPSU5URVJfT1dOICAgICAgPDwgMSkKKyNkZWZpbmUgU1dJR19QT0lOVEVSX05FVyAgICAgICAgICAgIChTV0lHX1BPSU5URVJfTk9TSEFET1cgfCBTV0lHX1BPSU5URVJfT1dOKQorCisjZGVmaW5lIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WICAoU1dJR19QT0lOVEVSX0RJU09XTiAgIDw8IDEpCisKKyNkZWZpbmUgU1dJR19CVUlMVElOX1RQX0lOSVQgICAgICAgIChTV0lHX1BPSU5URVJfT1dOIDw8IDIpCisjZGVmaW5lIFNXSUdfQlVJTFRJTl9JTklUICAgICAgICAgICAoU1dJR19CVUlMVElOX1RQX0lOSVQgfCBTV0lHX1BPSU5URVJfT1dOKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qICBIb3cgdG8gYWNjZXNzIFB5X05vbmUgKi8KKyNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZChfX1dJTjMyX18pIHx8IGRlZmluZWQoX19DWUdXSU5fXykKKyMgIGlmbmRlZiBTV0lHX1BZVEhPTl9OT19CVUlMRF9OT05FCisjICAgIGlmbmRlZiBTV0lHX1BZVEhPTl9CVUlMRF9OT05FCisjICAgICAgZGVmaW5lIFNXSUdfUFlUSE9OX0JVSUxEX05PTkUKKyMgICAgZW5kaWYKKyMgIGVuZGlmCisjZW5kaWYKKworI2lmZGVmIFNXSUdfUFlUSE9OX0JVSUxEX05PTkUKKyMgIGlmZGVmIFB5X05vbmUKKyMgICB1bmRlZiBQeV9Ob25lCisjICAgZGVmaW5lIFB5X05vbmUgU1dJR19QeV9Ob25lKCkKKyMgIGVuZGlmCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitfU1dJR19QeV9Ob25lKHZvaWQpCit7CisgIFB5T2JqZWN0ICpub25lID0gUHlfQnVpbGRWYWx1ZSgoY2hhciopIiIpOworICBQeV9ERUNSRUYobm9uZSk7CisgIHJldHVybiBub25lOworfQorU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeV9Ob25lKHZvaWQpCit7CisgIHN0YXRpYyBQeU9iamVjdCAqU1dJR19TVEFUSUNfUE9JTlRFUihub25lKSA9IF9TV0lHX1B5X05vbmUoKTsKKyAgcmV0dXJuIG5vbmU7Cit9CisjZW5kaWYKKworLyogVGhlIHB5dGhvbiB2b2lkIHJldHVybiB2YWx1ZSAqLworCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitTV0lHX1B5X1ZvaWQodm9pZCkKK3sKKyAgUHlPYmplY3QgKm5vbmUgPSBQeV9Ob25lOworICBQeV9JTkNSRUYobm9uZSk7CisgIHJldHVybiBub25lOworfQorCisvKiBTd2lnUHlDbGllbnREYXRhICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgUHlPYmplY3QgKmtsYXNzOworICBQeU9iamVjdCAqbmV3cmF3OworICBQeU9iamVjdCAqbmV3YXJnczsKKyAgUHlPYmplY3QgKmRlc3Ryb3k7CisgIGludCBkZWxhcmdzOworICBpbnQgaW1wbGljaXRjb252OworICBQeVR5cGVPYmplY3QgKnB5dHlwZTsKK30gU3dpZ1B5Q2xpZW50RGF0YTsKKworU1dJR1JVTlRJTUVJTkxJTkUgaW50CitTV0lHX1B5dGhvbl9DaGVja0ltcGxpY2l0KHN3aWdfdHlwZV9pbmZvICp0eSkKK3sKKyAgU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSA9IChTd2lnUHlDbGllbnREYXRhICopdHktPmNsaWVudGRhdGE7CisgIHJldHVybiBkYXRhID8gZGF0YS0+aW1wbGljaXRjb252IDogMDsKK30KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorU1dJR19QeXRob25fRXhjZXB0aW9uVHlwZShzd2lnX3R5cGVfaW5mbyAqZGVzYykgeworICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gZGVzYyA/IChTd2lnUHlDbGllbnREYXRhICopIGRlc2MtPmNsaWVudGRhdGEgOiAwOworICBQeU9iamVjdCAqa2xhc3MgPSBkYXRhID8gZGF0YS0+a2xhc3MgOiAwOworICByZXR1cm4gKGtsYXNzID8ga2xhc3MgOiBQeUV4Y19SdW50aW1lRXJyb3IpOworfQorCisKK1NXSUdSVU5USU1FIFN3aWdQeUNsaWVudERhdGEgKgorU3dpZ1B5Q2xpZW50RGF0YV9OZXcoUHlPYmplY3QqIG9iaikKK3sKKyAgaWYgKCFvYmopIHsKKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gKFN3aWdQeUNsaWVudERhdGEgKiltYWxsb2Moc2l6ZW9mKFN3aWdQeUNsaWVudERhdGEpKTsKKyAgICAvKiB0aGUga2xhc3MgZWxlbWVudCAqLworICAgIGRhdGEtPmtsYXNzID0gb2JqOworICAgIFB5X0lOQ1JFRihkYXRhLT5rbGFzcyk7CisgICAgLyogdGhlIG5ld3JhdyBtZXRob2QgYW5kIG5ld2FyZ3MgYXJndW1lbnRzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IHJhdyBpbnN0YW5jZSAqLworICAgIGlmIChQeUNsYXNzX0NoZWNrKG9iaikpIHsKKyAgICAgIGRhdGEtPm5ld3JhdyA9IDA7CisgICAgICBkYXRhLT5uZXdhcmdzID0gb2JqOworICAgICAgUHlfSU5DUkVGKG9iaik7CisgICAgfSBlbHNlIHsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwKQorICAgICAgZGF0YS0+bmV3cmF3ID0gMDsKKyNlbHNlCisgICAgICBkYXRhLT5uZXdyYXcgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRhdGEtPmtsYXNzLCAoY2hhciAqKSJfX25ld19fIik7CisjZW5kaWYKKyAgICAgIGlmIChkYXRhLT5uZXdyYXcpIHsKKyAgICAgICAgUHlfSU5DUkVGKGRhdGEtPm5ld3Jhdyk7CisgICAgICAgIGRhdGEtPm5ld2FyZ3MgPSBQeVR1cGxlX05ldygxKTsKKyAgICAgICAgUHlUdXBsZV9TZXRJdGVtKGRhdGEtPm5ld2FyZ3MsIDAsIG9iaik7CisgICAgICB9IGVsc2UgeworICAgICAgICBkYXRhLT5uZXdhcmdzID0gb2JqOworICAgICAgfQorICAgICAgUHlfSU5DUkVGKGRhdGEtPm5ld2FyZ3MpOworICAgIH0KKyAgICAvKiB0aGUgZGVzdHJveSBtZXRob2QsIGFrYSBhcyB0aGUgQysrIGRlbGV0ZSBtZXRob2QgKi8KKyAgICBkYXRhLT5kZXN0cm95ID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhkYXRhLT5rbGFzcywgKGNoYXIgKikiX19zd2lnX2Rlc3Ryb3lfXyIpOworICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgZGF0YS0+ZGVzdHJveSA9IDA7CisgICAgfQorICAgIGlmIChkYXRhLT5kZXN0cm95KSB7CisgICAgICBpbnQgZmxhZ3M7CisgICAgICBQeV9JTkNSRUYoZGF0YS0+ZGVzdHJveSk7CisgICAgICBmbGFncyA9IFB5Q0Z1bmN0aW9uX0dFVF9GTEFHUyhkYXRhLT5kZXN0cm95KTsKKyNpZmRlZiBNRVRIX08KKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAhKGZsYWdzICYgKE1FVEhfTykpOworI2Vsc2UKKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAwOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgIGRhdGEtPmRlbGFyZ3MgPSAwOworICAgIH0KKyAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAwOworICAgIGRhdGEtPnB5dHlwZSA9IDA7CisgICAgcmV0dXJuIGRhdGE7CisgIH0KK30KKworU1dJR1JVTlRJTUUgdm9pZAorU3dpZ1B5Q2xpZW50RGF0YV9EZWwoU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSkgeworICBQeV9YREVDUkVGKGRhdGEtPm5ld3Jhdyk7CisgIFB5X1hERUNSRUYoZGF0YS0+bmV3YXJncyk7CisgIFB5X1hERUNSRUYoZGF0YS0+ZGVzdHJveSk7Cit9CisKKy8qID09PT09PT09PT09PT09PSBTd2lnUHlPYmplY3QgPT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBQeU9iamVjdF9IRUFECisgIHZvaWQgKnB0cjsKKyAgc3dpZ190eXBlX2luZm8gKnR5OworICBpbnQgb3duOworICBQeU9iamVjdCAqbmV4dDsKKyNpZmRlZiBTV0lHUFlUSE9OX0JVSUxUSU4KKyAgUHlPYmplY3QgKmRpY3Q7CisjZW5kaWYKK30gU3dpZ1B5T2JqZWN0OworCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfbG9uZyhTd2lnUHlPYmplY3QgKnYpCit7CisgIHJldHVybiBQeUxvbmdfRnJvbVZvaWRQdHIodi0+cHRyKTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X2Zvcm1hdChjb25zdCBjaGFyKiBmbXQsIFN3aWdQeU9iamVjdCAqdikKK3sKKyAgUHlPYmplY3QgKnJlcyA9IE5VTEw7CisgIFB5T2JqZWN0ICphcmdzID0gUHlUdXBsZV9OZXcoMSk7CisgIGlmIChhcmdzKSB7CisgICAgaWYgKFB5VHVwbGVfU2V0SXRlbShhcmdzLCAwLCBTd2lnUHlPYmplY3RfbG9uZyh2KSkgPT0gMCkgeworICAgICAgUHlPYmplY3QgKm9mbXQgPSBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIoZm10KTsKKyAgICAgIGlmIChvZm10KSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgICAgICByZXMgPSBQeVVuaWNvZGVfRm9ybWF0KG9mbXQsYXJncyk7CisjZWxzZQorICAgICAgICByZXMgPSBQeVN0cmluZ19Gb3JtYXQob2ZtdCxhcmdzKTsKKyNlbmRpZgorICAgICAgICBQeV9ERUNSRUYob2ZtdCk7CisgICAgICB9CisgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9vY3QoU3dpZ1B5T2JqZWN0ICp2KQoreworICByZXR1cm4gU3dpZ1B5T2JqZWN0X2Zvcm1hdCgiJW8iLHYpOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfaGV4KFN3aWdQeU9iamVjdCAqdikKK3sKKyAgcmV0dXJuIFN3aWdQeU9iamVjdF9mb3JtYXQoIiV4Iix2KTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfcmVwcihTd2lnUHlPYmplY3QgKnYpCisjZWxzZQorU3dpZ1B5T2JqZWN0X3JlcHIoU3dpZ1B5T2JqZWN0ICp2LCBQeU9iamVjdCAqYXJncykKKyNlbmRpZgoreworICBjb25zdCBjaGFyICpuYW1lID0gU1dJR19UeXBlUHJldHR5TmFtZSh2LT50eSk7CisgIFB5T2JqZWN0ICpyZXByID0gU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQoIjxTd2lnIE9iamVjdCBvZiB0eXBlICclcycgYXQgJXA+IiwgbmFtZSwgKHZvaWQgKil2KTsKKyAgaWYgKHYtPm5leHQpIHsKKyMgaWZkZWYgTUVUSF9OT0FSR1MKKyAgICBQeU9iamVjdCAqbnJlcCA9IFN3aWdQeU9iamVjdF9yZXByKChTd2lnUHlPYmplY3QgKil2LT5uZXh0KTsKKyMgZWxzZQorICAgIFB5T2JqZWN0ICpucmVwID0gU3dpZ1B5T2JqZWN0X3JlcHIoKFN3aWdQeU9iamVjdCAqKXYtPm5leHQsIGFyZ3MpOworIyBlbmRpZgorIyBpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgUHlPYmplY3QgKmpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQocmVwciwgbnJlcCk7CisgICAgUHlfRGVjUmVmKHJlcHIpOworICAgIFB5X0RlY1JlZihucmVwKTsKKyAgICByZXByID0gam9pbmVkOworIyBlbHNlCisgICAgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZyZXByLG5yZXApOworIyBlbmRpZgorICB9CisgIHJldHVybiByZXByOworfQorCitTV0lHUlVOVElNRSBpbnQKK1N3aWdQeU9iamVjdF9wcmludChTd2lnUHlPYmplY3QgKnYsIEZJTEUgKmZwLCBpbnQgU1dJR1VOVVNFRFBBUk0oZmxhZ3MpKQoreworICBjaGFyICpzdHI7CisjaWZkZWYgTUVUSF9OT0FSR1MKKyAgUHlPYmplY3QgKnJlcHIgPSBTd2lnUHlPYmplY3RfcmVwcih2KTsKKyNlbHNlCisgIFB5T2JqZWN0ICpyZXByID0gU3dpZ1B5T2JqZWN0X3JlcHIodiwgTlVMTCk7CisjZW5kaWYKKyAgaWYgKHJlcHIpIHsKKyAgICBzdHIgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKHJlcHIpOworICAgIGZwdXRzKHN0ciwgZnApOworICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTMoc3RyKTsKKyAgICBQeV9ERUNSRUYocmVwcik7CisgICAgcmV0dXJuIDA7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDE7CisgIH0KK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X3N0cihTd2lnUHlPYmplY3QgKnYpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICByZXR1cm4gU1dJR19QYWNrVm9pZFB0cihyZXN1bHQsIHYtPnB0ciwgdi0+dHktPm5hbWUsIHNpemVvZihyZXN1bHQpKSA/CisgICAgU1dJR19QeXRob25fc3RyX0Zyb21DaGFyKHJlc3VsdCkgOiAwOworfQorCitTV0lHUlVOVElNRSBpbnQKK1N3aWdQeU9iamVjdF9jb21wYXJlKFN3aWdQeU9iamVjdCAqdiwgU3dpZ1B5T2JqZWN0ICp3KQoreworICB2b2lkICppID0gdi0+cHRyOworICB2b2lkICpqID0gdy0+cHRyOworICByZXR1cm4gKGkgPCBqKSA/IC0xIDogKChpID4gaikgPyAxIDogMCk7Cit9CisKKy8qIEFkZGVkIGZvciBQeXRob24gMy54LCB3b3VsZCBpdCBhbHNvIGJlIHVzZWZ1bCBmb3IgUHl0aG9uIDIueD8gKi8KK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlKFN3aWdQeU9iamVjdCAqdiwgU3dpZ1B5T2JqZWN0ICp3LCBpbnQgb3ApCit7CisgIFB5T2JqZWN0KiByZXM7CisgIGlmKCBvcCAhPSBQeV9FUSAmJiBvcCAhPSBQeV9ORSApIHsKKyAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOworICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKKyAgfQorICByZXMgPSBQeUJvb2xfRnJvbUxvbmcoIChTd2lnUHlPYmplY3RfY29tcGFyZSh2LCB3KT09MCkgPT0gKG9wID09IFB5X0VRKSA/IDEgOiAwKTsKKyAgcmV0dXJuIHJlczsKK30KKworCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqIFN3aWdQeU9iamVjdF9UeXBlT25jZSh2b2lkKTsKKworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorc3RhdGljIHN3aWdfdHlwZV9pbmZvICpTd2lnUHlPYmplY3Rfc3R5cGUgPSAwOworU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5T2JqZWN0X3R5cGUodm9pZCkgeworICAgIFN3aWdQeUNsaWVudERhdGEgKmNkOworICAgIGFzc2VydChTd2lnUHlPYmplY3Rfc3R5cGUpOworICAgIGNkID0gKFN3aWdQeUNsaWVudERhdGEqKSBTd2lnUHlPYmplY3Rfc3R5cGUtPmNsaWVudGRhdGE7CisgICAgYXNzZXJ0KGNkKTsKKyAgICBhc3NlcnQoY2QtPnB5dHlwZSk7CisgICAgcmV0dXJuIGNkLT5weXR5cGU7Cit9CisjZWxzZQorU1dJR1JVTlRJTUUgUHlUeXBlT2JqZWN0KgorU3dpZ1B5T2JqZWN0X3R5cGUodm9pZCkgeworICBzdGF0aWMgUHlUeXBlT2JqZWN0ICpTV0lHX1NUQVRJQ19QT0lOVEVSKHR5cGUpID0gU3dpZ1B5T2JqZWN0X1R5cGVPbmNlKCk7CisgIHJldHVybiB0eXBlOworfQorI2VuZGlmCisKK1NXSUdSVU5USU1FSU5MSU5FIGludAorU3dpZ1B5T2JqZWN0X0NoZWNrKFB5T2JqZWN0ICpvcCkgeworI2lmZGVmIFNXSUdQWVRIT05fQlVJTFRJTgorICBQeVR5cGVPYmplY3QgKnRhcmdldF90cCA9IFN3aWdQeU9iamVjdF90eXBlKCk7CisgIGlmIChQeVR5cGVfSXNTdWJ0eXBlKG9wLT5vYl90eXBlLCB0YXJnZXRfdHApKQorICAgIHJldHVybiAxOworICByZXR1cm4gKHN0cmNtcChvcC0+b2JfdHlwZS0+dHBfbmFtZSwgIlN3aWdQeU9iamVjdCIpID09IDApOworI2Vsc2UKKyAgcmV0dXJuIChQeV9UWVBFKG9wKSA9PSBTd2lnUHlPYmplY3RfdHlwZSgpKQorICAgIHx8IChzdHJjbXAoUHlfVFlQRShvcCktPnRwX25hbWUsIlN3aWdQeU9iamVjdCIpID09IDApOworI2VuZGlmCit9CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1N3aWdQeU9iamVjdF9OZXcodm9pZCAqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBvd24pOworCitTV0lHUlVOVElNRSB2b2lkCitTd2lnUHlPYmplY3RfZGVhbGxvYyhQeU9iamVjdCAqdikKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKSB2OworICBQeU9iamVjdCAqbmV4dCA9IHNvYmotPm5leHQ7CisgIGlmIChzb2JqLT5vd24gPT0gU1dJR19QT0lOVEVSX09XTikgeworICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IHNvYmotPnR5OworICAgIFN3aWdQeUNsaWVudERhdGEgKmRhdGEgPSB0eSA/IChTd2lnUHlDbGllbnREYXRhICopIHR5LT5jbGllbnRkYXRhIDogMDsKKyAgICBQeU9iamVjdCAqZGVzdHJveSA9IGRhdGEgPyBkYXRhLT5kZXN0cm95IDogMDsKKyAgICBpZiAoZGVzdHJveSkgeworICAgICAgLyogZGVzdHJveSBpcyBhbHdheXMgYSBWQVJBUkdTIG1ldGhvZCAqLworICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgIGlmIChkYXRhLT5kZWxhcmdzKSB7CisgICAgICAgIC8qIHdlIG5lZWQgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IG9iamVjdCB0byBjYXJyeSB0aGUgZGVzdHJveSBvcGVyYXRpb24gKi8KKyAgICAgICAgUHlPYmplY3QgKnRtcCA9IFN3aWdQeU9iamVjdF9OZXcoc29iai0+cHRyLCB0eSwgMCk7CisgICAgICAgIHJlcyA9IFNXSUdfUHl0aG9uX0NhbGxGdW5jdG9yKGRlc3Ryb3ksIHRtcCk7CisgICAgICAgIFB5X0RFQ1JFRih0bXApOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlDRnVuY3Rpb24gbWV0aCA9IFB5Q0Z1bmN0aW9uX0dFVF9GVU5DVElPTihkZXN0cm95KTsKKyAgICAgICAgUHlPYmplY3QgKm1zZWxmID0gUHlDRnVuY3Rpb25fR0VUX1NFTEYoZGVzdHJveSk7CisgICAgICAgIHJlcyA9ICgoKm1ldGgpKG1zZWxmLCB2KSk7CisgICAgICB9CisgICAgICBQeV9YREVDUkVGKHJlcyk7CisgICAgfQorI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1NJTEVOVF9NRU1MRUFLKQorICAgIGVsc2UgeworICAgICAgY29uc3QgY2hhciAqbmFtZSA9IFNXSUdfVHlwZVByZXR0eU5hbWUodHkpOworICAgICAgcHJpbnRmKCJzd2lnL3B5dGhvbiBkZXRlY3RlZCBhIG1lbW9yeSBsZWFrIG9mIHR5cGUgJyVzJywgbm8gZGVzdHJ1Y3RvciBmb3VuZC5cbiIsIChuYW1lID8gbmFtZSA6ICJ1bmtub3duIikpOworICAgIH0KKyNlbmRpZgorICB9CisgIFB5X1hERUNSRUYobmV4dCk7CisgIFB5T2JqZWN0X0RFTCh2KTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QqCitTd2lnUHlPYmplY3RfYXBwZW5kKFB5T2JqZWN0KiB2LCBQeU9iamVjdCogbmV4dCkKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gKFN3aWdQeU9iamVjdCAqKSB2OworI2lmbmRlZiBNRVRIX08KKyAgUHlPYmplY3QgKnRtcCA9IDA7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShuZXh0LChjaGFyICopIk86YXBwZW5kIiwgJnRtcCkpIHJldHVybiBOVUxMOworICBuZXh0ID0gdG1wOworI2VuZGlmCisgIGlmICghU3dpZ1B5T2JqZWN0X0NoZWNrKG5leHQpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc29iai0+bmV4dCA9IG5leHQ7CisgIFB5X0lOQ1JFRihuZXh0KTsKKyAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCoKKyNpZmRlZiBNRVRIX05PQVJHUworU3dpZ1B5T2JqZWN0X25leHQoUHlPYmplY3QqIHYpCisjZWxzZQorU3dpZ1B5T2JqZWN0X25leHQoUHlPYmplY3QqIHYsIFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShhcmdzKSkKKyNlbmRpZgoreworICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopIHY7CisgIGlmIChzb2JqLT5uZXh0KSB7CisgICAgUHlfSU5DUkVGKHNvYmotPm5leHQpOworICAgIHJldHVybiBzb2JqLT5uZXh0OworICB9IGVsc2UgeworICAgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKKyAgfQorfQorCitTV0lHSU5URVJOIFB5T2JqZWN0KgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfZGlzb3duKFB5T2JqZWN0ICp2KQorI2Vsc2UKK1N3aWdQeU9iamVjdF9kaXNvd24oUHlPYmplY3QqIHYsIFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShhcmdzKSkKKyNlbmRpZgoreworICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopdjsKKyAgc29iai0+b3duID0gMDsKKyAgcmV0dXJuIFNXSUdfUHlfVm9pZCgpOworfQorCitTV0lHSU5URVJOIFB5T2JqZWN0KgorI2lmZGVmIE1FVEhfTk9BUkdTCitTd2lnUHlPYmplY3RfYWNxdWlyZShQeU9iamVjdCAqdikKKyNlbHNlCitTd2lnUHlPYmplY3RfYWNxdWlyZShQeU9iamVjdCogdiwgUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKGFyZ3MpKQorI2VuZGlmCit7CisgIFN3aWdQeU9iamVjdCAqc29iaiA9IChTd2lnUHlPYmplY3QgKil2OworICBzb2JqLT5vd24gPSBTV0lHX1BPSU5URVJfT1dOOworICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7Cit9CisKK1NXSUdJTlRFUk4gUHlPYmplY3QqCitTd2lnUHlPYmplY3Rfb3duKFB5T2JqZWN0ICp2LCBQeU9iamVjdCAqYXJncykKK3sKKyAgUHlPYmplY3QgKnZhbCA9IDA7CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMCkKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikifE86b3duIiwmdmFsKSkKKyNlbHNlCisgIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgKGNoYXIgKikib3duIiwgMCwgMSwgJnZhbCkpCisjZW5kaWYKKyAgICB7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBTd2lnUHlPYmplY3QgKnNvYmogPSAoU3dpZ1B5T2JqZWN0ICopdjsKKyAgICAgIFB5T2JqZWN0ICpvYmogPSBQeUJvb2xfRnJvbUxvbmcoc29iai0+b3duKTsKKyAgICAgIGlmICh2YWwpIHsKKyNpZmRlZiBNRVRIX05PQVJHUworICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHZhbCkpIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfYWNxdWlyZSh2KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfZGlzb3duKHYpOworICAgICAgICB9CisjZWxzZQorICAgICAgICBpZiAoUHlPYmplY3RfSXNUcnVlKHZhbCkpIHsKKyAgICAgICAgICBTd2lnUHlPYmplY3RfYWNxdWlyZSh2LGFyZ3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFN3aWdQeU9iamVjdF9kaXNvd24odixhcmdzKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICB9CisgICAgICByZXR1cm4gb2JqOworICAgIH0KK30KKworI2lmZGVmIE1FVEhfTworc3RhdGljIFB5TWV0aG9kRGVmCitzd2lnb2JqZWN0X21ldGhvZHNbXSA9IHsKKyAgeyhjaGFyICopImRpc293biIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2Rpc293biwgIE1FVEhfTk9BUkdTLCAgKGNoYXIgKikicmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9hY3F1aXJlLCBNRVRIX05PQVJHUywgIChjaGFyICopImFxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJvd24iLCAgICAgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9vd24sICAgICBNRVRIX1ZBUkFSR1MsIChjaGFyICopInJldHVybnMvc2V0cyBvd25lcnNoaXAgb2YgdGhlIHBvaW50ZXIifSwKKyAgeyhjaGFyICopImFwcGVuZCIsICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X2FwcGVuZCwgIE1FVEhfTywgICAgICAgKGNoYXIgKikiYXBwZW5kcyBhbm90aGVyICd0aGlzJyBvYmplY3QifSwKKyAgeyhjaGFyICopIm5leHQiLCAgICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X25leHQsICAgIE1FVEhfTk9BUkdTLCAgKGNoYXIgKikicmV0dXJucyB0aGUgbmV4dCAndGhpcycgb2JqZWN0In0sCisgIHsoY2hhciAqKSJfX3JlcHJfXyIsKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9yZXByLCAgICBNRVRIX05PQVJHUywgIChjaGFyICopInJldHVybnMgb2JqZWN0IHJlcHJlc2VudGF0aW9uIn0sCisgIHswLCAwLCAwLCAwfQorfTsKKyNlbHNlCitzdGF0aWMgUHlNZXRob2REZWYKK3N3aWdvYmplY3RfbWV0aG9kc1tdID0geworICB7KGNoYXIgKikiZGlzb3duIiwgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfZGlzb3duLCAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikicmVsZWFzZXMgb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIn0sCisgIHsoY2hhciAqKSJhY3F1aXJlIiwgKFB5Q0Z1bmN0aW9uKVN3aWdQeU9iamVjdF9hY3F1aXJlLCBNRVRIX1ZBUkFSR1MsICAoY2hhciAqKSJhcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikib3duIiwgICAgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3Rfb3duLCAgICAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikicmV0dXJucy9zZXRzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciJ9LAorICB7KGNoYXIgKikiYXBwZW5kIiwgIChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfYXBwZW5kLCAgTUVUSF9WQVJBUkdTLCAgKGNoYXIgKikiYXBwZW5kcyBhbm90aGVyICd0aGlzJyBvYmplY3QifSwKKyAgeyhjaGFyICopIm5leHQiLCAgICAoUHlDRnVuY3Rpb24pU3dpZ1B5T2JqZWN0X25leHQsICAgIE1FVEhfVkFSQVJHUywgIChjaGFyICopInJldHVybnMgdGhlIG5leHQgJ3RoaXMnIG9iamVjdCJ9LAorICB7KGNoYXIgKikiX19yZXByX18iLChQeUNGdW5jdGlvbilTd2lnUHlPYmplY3RfcmVwciwgICBNRVRIX1ZBUkFSR1MsICAoY2hhciAqKSJyZXR1cm5zIG9iamVjdCByZXByZXNlbnRhdGlvbiJ9LAorICB7MCwgMCwgMCwgMH0KK307CisjZW5kaWYKKworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorU1dJR0lOVEVSTiBQeU9iamVjdCAqCitTd2lnUHlPYmplY3RfZ2V0YXR0cihTd2lnUHlPYmplY3QgKnNvYmosY2hhciAqbmFtZSkKK3sKKyAgcmV0dXJuIFB5X0ZpbmRNZXRob2Qoc3dpZ29iamVjdF9tZXRob2RzLCAoUHlPYmplY3QgKilzb2JqLCBuYW1lKTsKK30KKyNlbmRpZgorCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqCitTd2lnUHlPYmplY3RfVHlwZU9uY2Uodm9pZCkgeworICBzdGF0aWMgY2hhciBzd2lnb2JqZWN0X2RvY1tdID0gIlN3aWcgb2JqZWN0IGNhcnJpZXMgYSBDL0MrKyBpbnN0YW5jZSBwb2ludGVyIjsKKworICBzdGF0aWMgUHlOdW1iZXJNZXRob2RzIFN3aWdQeU9iamVjdF9hc19udW1iZXIgPSB7CisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9hZGQqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfc3VidHJhY3QqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfbXVsdGlwbHkqLworICAgIC8qIG5iX2RpdmlkZSByZW1vdmVkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9kaXZpZGUqLworI2VuZGlmCisgICAgKGJpbmFyeWZ1bmMpMCwgLypuYl9yZW1haW5kZXIqLworICAgIChiaW5hcnlmdW5jKTAsIC8qbmJfZGl2bW9kKi8KKyAgICAodGVybmFyeWZ1bmMpMCwvKm5iX3Bvd2VyKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX25lZ2F0aXZlKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX3Bvc2l0aXZlKi8KKyAgICAodW5hcnlmdW5jKTAsICAvKm5iX2Fic29sdXRlKi8KKyAgICAoaW5xdWlyeSkwLCAgICAvKm5iX25vbnplcm8qLworICAgIDAsICAgICAgICAgICAgIC8qbmJfaW52ZXJ0Ki8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX2xzaGlmdCovCisgICAgMCwgICAgICAgICAgICAgLypuYl9yc2hpZnQqLworICAgIDAsICAgICAgICAgICAgIC8qbmJfYW5kKi8KKyAgICAwLCAgICAgICAgICAgICAvKm5iX3hvciovCisgICAgMCwgICAgICAgICAgICAgLypuYl9vciovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgMCwgICAvKm5iX2NvZXJjZSovCisjZW5kaWYKKyAgICAodW5hcnlmdW5jKVN3aWdQeU9iamVjdF9sb25nLCAvKm5iX2ludCovCisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDAwMDAwCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3RfbG9uZywgLypuYl9sb25nKi8KKyNlbHNlCisgICAgMCwgLypuYl9yZXNlcnZlZCovCisjZW5kaWYKKyAgICAodW5hcnlmdW5jKTAsICAgICAgICAgICAgICAgICAvKm5iX2Zsb2F0Ki8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMDAwMDAKKyAgICAodW5hcnlmdW5jKVN3aWdQeU9iamVjdF9vY3QsICAvKm5iX29jdCovCisgICAgKHVuYXJ5ZnVuYylTd2lnUHlPYmplY3RfaGV4LCAgLypuYl9oZXgqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMCAvKiAzLjAgKi8KKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAvKiBuYl9pbnBsYWNlX2FkZCAtPiBuYl9pbmRleCwgbmJfaW5wbGFjZV9kaXZpZGUgcmVtb3ZlZCAqLworI2VsaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjA1MDAwMCAvKiAyLjUuMCAqLworICAgIDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAgLyogbmJfaW5wbGFjZV9hZGQgLT4gbmJfaW5kZXggKi8KKyNlbGlmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAgLyogMi4yLjAgKi8KKyAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCAvKiBuYl9pbnBsYWNlX2FkZCAtPiBuYl9pbnBsYWNlX3RydWVfZGl2aWRlICovCisjZWxpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDAwMDAwIC8qIDIuMC4wICovCisgICAgMCwwLDAsMCwwLDAsMCwwLDAsMCwwIC8qIG5iX2lucGxhY2VfYWRkIC0+IG5iX2lucGxhY2Vfb3IgKi8KKyNlbmRpZgorICB9OworCisgIHN0YXRpYyBQeVR5cGVPYmplY3Qgc3dpZ3B5b2JqZWN0X3R5cGU7CisgIHN0YXRpYyBpbnQgdHlwZV9pbml0ID0gMDsKKyAgaWYgKCF0eXBlX2luaXQpIHsKKyAgICBjb25zdCBQeVR5cGVPYmplY3QgdG1wID0geworICAgICAgLyogUHlPYmplY3QgaGVhZGVyIGNoYW5nZWQgaW4gUHl0aG9uIDMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKKyNlbHNlCisgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb2Jfc2l6ZSAqLworI2VuZGlmCisgICAgICAoY2hhciAqKSJTd2lnUHlPYmplY3QiLCAgICAgICAgICAgICAgIC8qIHRwX25hbWUgKi8KKyAgICAgIHNpemVvZihTd2lnUHlPYmplY3QpLCAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZW1zaXplICovCisgICAgICAoZGVzdHJ1Y3RvcilTd2lnUHlPYmplY3RfZGVhbGxvYywgICAgIC8qIHRwX2RlYWxsb2MgKi8KKyAgICAgIChwcmludGZ1bmMpU3dpZ1B5T2JqZWN0X3ByaW50LCAgICAgICAgLyogdHBfcHJpbnQgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyAgICAgIChnZXRhdHRyZnVuYylTd2lnUHlPYmplY3RfZ2V0YXR0ciwgICAgLyogdHBfZ2V0YXR0ciAqLworI2Vsc2UKKyAgICAgIChnZXRhdHRyZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0ciAqLworI2VuZGlmCisgICAgICAoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgMCwgLyogdHBfcmVzZXJ2ZWQgaW4gMy4wLjEsIHRwX2NvbXBhcmUgaW4gMy4wLjAgYnV0IG5vdCB1c2VkICovCisjZWxzZQorICAgICAgKGNtcGZ1bmMpU3dpZ1B5T2JqZWN0X2NvbXBhcmUsICAgICAgICAvKiB0cF9jb21wYXJlICovCisjZW5kaWYKKyAgICAgIChyZXByZnVuYylTd2lnUHlPYmplY3RfcmVwciwgICAgICAgICAgLyogdHBfcmVwciAqLworICAgICAgJlN3aWdQeU9iamVjdF9hc19udW1iZXIsICAgICAgICAgICAgICAvKiB0cF9hc19udW1iZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbWFwcGluZyAqLworICAgICAgKGhhc2hmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9oYXNoICovCisgICAgICAodGVybmFyeWZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KKyAgICAgIChyZXByZnVuYylTd2lnUHlPYmplY3Rfc3RyLCAgICAgICAgICAgLyogdHBfc3RyICovCisgICAgICBQeU9iamVjdF9HZW5lcmljR2V0QXR0ciwgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX2J1ZmZlciAqLworICAgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgICAgc3dpZ29iamVjdF9kb2MsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdHJhdmVyc2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2xlYXIgKi8KKyAgICAgIChyaWNoY21wZnVuYylTd2lnUHlPYmplY3RfcmljaGNvbXBhcmUsLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3RvZmZzZXQgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDIwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKyAgICAgIHN3aWdvYmplY3RfbWV0aG9kcywgICAgICAgICAgICAgICAgICAgLyogdHBfbWV0aG9kcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Rlc2NyX3NldCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2luaXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZyZWUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXNfZ2MgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbXJvICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhY2hlICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3N1YmNsYXNzZXMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfd2Vha2xpc3QgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb24gKi8KKyNlbmRpZgorI2lmZGVmIENPVU5UX0FMTE9DUworICAgICAgMCwwLDAsMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAtPiB0cF9uZXh0ICovCisjZW5kaWYKKyAgICB9OworICAgIHN3aWdweW9iamVjdF90eXBlID0gdG1wOworICAgIHR5cGVfaW5pdCA9IDE7CisjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAyMDIwMDAwCisgICAgc3dpZ3B5b2JqZWN0X3R5cGUub2JfdHlwZSA9ICZQeVR5cGVfVHlwZTsKKyNlbHNlCisgICAgaWYgKFB5VHlwZV9SZWFkeSgmc3dpZ3B5b2JqZWN0X3R5cGUpIDwgMCkKKyAgICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0KKyAgcmV0dXJuICZzd2lncHlvYmplY3RfdHlwZTsKK30KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU3dpZ1B5T2JqZWN0X05ldyh2b2lkICpwdHIsIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IG93bikKK3sKKyAgU3dpZ1B5T2JqZWN0ICpzb2JqID0gUHlPYmplY3RfTkVXKFN3aWdQeU9iamVjdCwgU3dpZ1B5T2JqZWN0X3R5cGUoKSk7CisgIGlmIChzb2JqKSB7CisgICAgc29iai0+cHRyICA9IHB0cjsKKyAgICBzb2JqLT50eSAgID0gdHk7CisgICAgc29iai0+b3duICA9IG93bjsKKyAgICBzb2JqLT5uZXh0ID0gMDsKKyAgfQorICByZXR1cm4gKFB5T2JqZWN0ICopc29iajsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIEltcGxlbWVudHMgYSBzaW1wbGUgU3dpZyBQYWNrZWQgdHlwZSwgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIHN0cmluZworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICBQeU9iamVjdF9IRUFECisgIHZvaWQgKnBhY2s7CisgIHN3aWdfdHlwZV9pbmZvICp0eTsKKyAgc2l6ZV90IHNpemU7Cit9IFN3aWdQeVBhY2tlZDsKKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlQYWNrZWRfcHJpbnQoU3dpZ1B5UGFja2VkICp2LCBGSUxFICpmcCwgaW50IFNXSUdVTlVTRURQQVJNKGZsYWdzKSkKK3sKKyAgY2hhciByZXN1bHRbU1dJR19CVUZGRVJfU0laRV07CisgIGZwdXRzKCI8U3dpZyBQYWNrZWQgIiwgZnApOworICBpZiAoU1dJR19QYWNrRGF0YU5hbWUocmVzdWx0LCB2LT5wYWNrLCB2LT5zaXplLCAwLCBzaXplb2YocmVzdWx0KSkpIHsKKyAgICBmcHV0cygiYXQgIiwgZnApOworICAgIGZwdXRzKHJlc3VsdCwgZnApOworICB9CisgIGZwdXRzKHYtPnR5LT5uYW1lLGZwKTsKKyAgZnB1dHMoIj4iLCBmcCk7CisgIHJldHVybiAwOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfcmVwcihTd2lnUHlQYWNrZWQgKnYpCit7CisgIGNoYXIgcmVzdWx0W1NXSUdfQlVGRkVSX1NJWkVdOworICBpZiAoU1dJR19QYWNrRGF0YU5hbWUocmVzdWx0LCB2LT5wYWNrLCB2LT5zaXplLCAwLCBzaXplb2YocmVzdWx0KSkpIHsKKyAgICByZXR1cm4gU1dJR19QeXRob25fc3RyX0Zyb21Gb3JtYXQoIjxTd2lnIFBhY2tlZCBhdCAlcyVzPiIsIHJlc3VsdCwgdi0+dHktPm5hbWUpOworICB9IGVsc2UgeworICAgIHJldHVybiBTV0lHX1B5dGhvbl9zdHJfRnJvbUZvcm1hdCgiPFN3aWcgUGFja2VkICVzPiIsIHYtPnR5LT5uYW1lKTsKKyAgfQorfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfc3RyKFN3aWdQeVBhY2tlZCAqdikKK3sKKyAgY2hhciByZXN1bHRbU1dJR19CVUZGRVJfU0laRV07CisgIGlmIChTV0lHX1BhY2tEYXRhTmFtZShyZXN1bHQsIHYtPnBhY2ssIHYtPnNpemUsIDAsIHNpemVvZihyZXN1bHQpKSl7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tRm9ybWF0KCIlcyVzIiwgcmVzdWx0LCB2LT50eS0+bmFtZSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcih2LT50eS0+bmFtZSk7CisgIH0KK30KKworU1dJR1JVTlRJTUUgaW50CitTd2lnUHlQYWNrZWRfY29tcGFyZShTd2lnUHlQYWNrZWQgKnYsIFN3aWdQeVBhY2tlZCAqdykKK3sKKyAgc2l6ZV90IGkgPSB2LT5zaXplOworICBzaXplX3QgaiA9IHctPnNpemU7CisgIGludCBzID0gKGkgPCBqKSA/IC0xIDogKChpID4gaikgPyAxIDogMCk7CisgIHJldHVybiBzID8gcyA6IHN0cm5jbXAoKGNoYXIgKil2LT5wYWNrLCAoY2hhciAqKXctPnBhY2ssIDIqdi0+c2l6ZSk7Cit9CisKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCogU3dpZ1B5UGFja2VkX1R5cGVPbmNlKHZvaWQpOworCitTV0lHUlVOVElNRSBQeVR5cGVPYmplY3QqCitTd2lnUHlQYWNrZWRfdHlwZSh2b2lkKSB7CisgIHN0YXRpYyBQeVR5cGVPYmplY3QgKlNXSUdfU1RBVElDX1BPSU5URVIodHlwZSkgPSBTd2lnUHlQYWNrZWRfVHlwZU9uY2UoKTsKKyAgcmV0dXJuIHR5cGU7Cit9CisKK1NXSUdSVU5USU1FSU5MSU5FIGludAorU3dpZ1B5UGFja2VkX0NoZWNrKFB5T2JqZWN0ICpvcCkgeworICByZXR1cm4gKChvcCktPm9iX3R5cGUgPT0gU3dpZ1B5UGFja2VkX1R5cGVPbmNlKCkpCisgICAgfHwgKHN0cmNtcCgob3ApLT5vYl90eXBlLT50cF9uYW1lLCJTd2lnUHlQYWNrZWQiKSA9PSAwKTsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU3dpZ1B5UGFja2VkX2RlYWxsb2MoUHlPYmplY3QgKnYpCit7CisgIGlmIChTd2lnUHlQYWNrZWRfQ2hlY2sodikpIHsKKyAgICBTd2lnUHlQYWNrZWQgKnNvYmogPSAoU3dpZ1B5UGFja2VkICopIHY7CisgICAgZnJlZShzb2JqLT5wYWNrKTsKKyAgfQorICBQeU9iamVjdF9ERUwodik7Cit9CisKK1NXSUdSVU5USU1FIFB5VHlwZU9iamVjdCoKK1N3aWdQeVBhY2tlZF9UeXBlT25jZSh2b2lkKSB7CisgIHN0YXRpYyBjaGFyIHN3aWdwYWNrZWRfZG9jW10gPSAiU3dpZyBvYmplY3QgY2FycmllcyBhIEMvQysrIGluc3RhbmNlIHBvaW50ZXIiOworICBzdGF0aWMgUHlUeXBlT2JqZWN0IHN3aWdweXBhY2tlZF90eXBlOworICBzdGF0aWMgaW50IHR5cGVfaW5pdCA9IDA7CisgIGlmICghdHlwZV9pbml0KSB7CisgICAgY29uc3QgUHlUeXBlT2JqZWN0IHRtcCA9IHsKKyAgICAgIC8qIFB5T2JqZWN0IGhlYWRlciBjaGFuZ2VkIGluIFB5dGhvbiAzICovCisjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorI2Vsc2UKKyAgICAgIFB5T2JqZWN0X0hFQURfSU5JVChOVUxMKQorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvYl9zaXplICovCisjZW5kaWYKKyAgICAgIChjaGFyICopIlN3aWdQeVBhY2tlZCIsICAgICAgICAgICAgICAgLyogdHBfbmFtZSAqLworICAgICAgc2l6ZW9mKFN3aWdQeVBhY2tlZCksICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KKyAgICAgIChkZXN0cnVjdG9yKVN3aWdQeVBhY2tlZF9kZWFsbG9jLCAgICAgLyogdHBfZGVhbGxvYyAqLworICAgICAgKHByaW50ZnVuYylTd2lnUHlQYWNrZWRfcHJpbnQsICAgICAgICAvKiB0cF9wcmludCAqLworICAgICAgKGdldGF0dHJmdW5jKTAsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCisgICAgICAoc2V0YXR0cmZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHIgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgICAgMCwgLyogdHBfcmVzZXJ2ZWQgaW4gMy4wLjEgKi8KKyNlbHNlCisgICAgICAoY21wZnVuYylTd2lnUHlQYWNrZWRfY29tcGFyZSwgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KKyNlbmRpZgorICAgICAgKHJlcHJmdW5jKVN3aWdQeVBhY2tlZF9yZXByLCAgICAgICAgICAvKiB0cF9yZXByICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX251bWJlciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCisgICAgICAoaGFzaGZ1bmMpMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2hhc2ggKi8KKyAgICAgICh0ZXJuYXJ5ZnVuYykwLCAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FsbCAqLworICAgICAgKHJlcHJmdW5jKVN3aWdQeVBhY2tlZF9zdHIsICAgICAgICAgICAvKiB0cF9zdHIgKi8KKyAgICAgIFB5T2JqZWN0X0dlbmVyaWNHZXRBdHRyLCAgICAgICAgICAgICAgLyogdHBfZ2V0YXR0cm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0cm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCisgICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgICBzd2lncGFja2VkX2RvYywgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RvYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yaWNoY29tcGFyZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMjAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlciAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZXRob2RzICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21lbWJlcnMgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3RvZmZzZXQgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uZXcgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pc19nYyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNlcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tcm8gKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfY2FjaGUgKi8KKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc3ViY2xhc3NlcyAqLworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF93ZWFrbGlzdCAqLworI2VuZGlmCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMAorICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZWwgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwNjAwMDAKKyAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfdmVyc2lvbiAqLworI2VuZGlmCisjaWZkZWYgQ09VTlRfQUxMT0NTCisgICAgICAwLDAsMCwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jIC0+IHRwX25leHQgKi8KKyNlbmRpZgorICAgIH07CisgICAgc3dpZ3B5cGFja2VkX3R5cGUgPSB0bXA7CisgICAgdHlwZV9pbml0ID0gMTsKKyNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwMjAwMDAKKyAgICBzd2lncHlwYWNrZWRfdHlwZS5vYl90eXBlID0gJlB5VHlwZV9UeXBlOworI2Vsc2UKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZzd2lncHlwYWNrZWRfdHlwZSkgPCAwKQorICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgfQorICByZXR1cm4gJnN3aWdweXBhY2tlZF90eXBlOworfQorCitTV0lHUlVOVElNRSBQeU9iamVjdCAqCitTd2lnUHlQYWNrZWRfTmV3KHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHN3aWdfdHlwZV9pbmZvICp0eSkKK3sKKyAgU3dpZ1B5UGFja2VkICpzb2JqID0gUHlPYmplY3RfTkVXKFN3aWdQeVBhY2tlZCwgU3dpZ1B5UGFja2VkX3R5cGUoKSk7CisgIGlmIChzb2JqKSB7CisgICAgdm9pZCAqcGFjayA9IG1hbGxvYyhzaXplKTsKKyAgICBpZiAocGFjaykgeworICAgICAgbWVtY3B5KHBhY2ssIHB0ciwgc2l6ZSk7CisgICAgICBzb2JqLT5wYWNrID0gcGFjazsKKyAgICAgIHNvYmotPnR5ICAgPSB0eTsKKyAgICAgIHNvYmotPnNpemUgPSBzaXplOworICAgIH0gZWxzZSB7CisgICAgICBQeU9iamVjdF9ERUwoKFB5T2JqZWN0ICopIHNvYmopOworICAgICAgc29iaiA9IDA7CisgICAgfQorICB9CisgIHJldHVybiAoUHlPYmplY3QgKikgc29iajsKK30KKworU1dJR1JVTlRJTUUgc3dpZ190eXBlX2luZm8gKgorU3dpZ1B5UGFja2VkX1VucGFja0RhdGEoUHlPYmplY3QgKm9iaiwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKyAgaWYgKFN3aWdQeVBhY2tlZF9DaGVjayhvYmopKSB7CisgICAgU3dpZ1B5UGFja2VkICpzb2JqID0gKFN3aWdQeVBhY2tlZCAqKW9iajsKKyAgICBpZiAoc29iai0+c2l6ZSAhPSBzaXplKSByZXR1cm4gMDsKKyAgICBtZW1jcHkocHRyLCBzb2JqLT5wYWNrLCBzaXplKTsKKyAgICByZXR1cm4gc29iai0+dHk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIDA7CisgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHBvaW50ZXJzL2RhdGEgbWFuaXB1bGF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitTV0lHUlVOVElNRUlOTElORSBQeU9iamVjdCAqCitfU1dJR19UaGlzKHZvaWQpCit7CisgICAgcmV0dXJuIFNXSUdfUHl0aG9uX3N0cl9Gcm9tQ2hhcigidGhpcyIpOworfQorCitzdGF0aWMgUHlPYmplY3QgKnN3aWdfdGhpcyA9IE5VTEw7CisKK1NXSUdSVU5USU1FIFB5T2JqZWN0ICoKK1NXSUdfVGhpcyh2b2lkKQoreworICBpZiAoc3dpZ190aGlzID09IE5VTEwpCisgICAgc3dpZ190aGlzID0gX1NXSUdfVGhpcygpOworICByZXR1cm4gc3dpZ190aGlzOworfQorCisvKiAjZGVmaW5lIFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMgKi8KKworLyogVE9ETzogSSBkb24ndCBrbm93IGhvdyB0byBpbXBsZW1lbnQgdGhlIGZhc3QgZ2V0c2V0IGluIFB5dGhvbiAzIHJpZ2h0IG5vdyAqLworI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisjZGVmaW5lIFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMKKyNlbmRpZgorCitTV0lHUlVOVElNRSBTd2lnUHlPYmplY3QgKgorU1dJR19QeXRob25fR2V0U3dpZ1RoaXMoUHlPYmplY3QgKnB5b2JqKQoreworICBQeU9iamVjdCAqb2JqOworCisgIGlmIChTd2lnUHlPYmplY3RfQ2hlY2socHlvYmopKQorICAgIHJldHVybiAoU3dpZ1B5T2JqZWN0ICopIHB5b2JqOworCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgICh2b2lkKW9iajsKKyMgaWZkZWYgUHlXZWFrcmVmX0NoZWNrUHJveHkKKyAgaWYgKFB5V2Vha3JlZl9DaGVja1Byb3h5KHB5b2JqKSkgeworICAgIHB5b2JqID0gUHlXZWFrcmVmX0dFVF9PQkpFQ1QocHlvYmopOworICAgIGlmIChweW9iaiAmJiBTd2lnUHlPYmplY3RfQ2hlY2socHlvYmopKQorICAgICAgcmV0dXJuIChTd2lnUHlPYmplY3QqKSBweW9iajsKKyAgfQorIyBlbmRpZgorICByZXR1cm4gTlVMTDsKKyNlbHNlCisKKyAgb2JqID0gMDsKKworI2lmICghZGVmaW5lZChTV0lHX1BZVEhPTl9TTE9XX0dFVFNFVF9USElTKSAmJiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAzMDAwMCkpCisgIGlmIChQeUluc3RhbmNlX0NoZWNrKHB5b2JqKSkgeworICAgIG9iaiA9IF9QeUluc3RhbmNlX0xvb2t1cChweW9iaiwgU1dJR19UaGlzKCkpOworICB9IGVsc2UgeworICAgIFB5T2JqZWN0ICoqZGljdHB0ciA9IF9QeU9iamVjdF9HZXREaWN0UHRyKHB5b2JqKTsKKyAgICBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICAgICBQeU9iamVjdCAqZGljdCA9ICpkaWN0cHRyOworICAgICAgb2JqID0gZGljdCA/IFB5RGljdF9HZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpKSA6IDA7CisgICAgfSBlbHNlIHsKKyNpZmRlZiBQeVdlYWtyZWZfQ2hlY2tQcm94eQorICAgICAgaWYgKFB5V2Vha3JlZl9DaGVja1Byb3h5KHB5b2JqKSkgeworICAgICAgICBQeU9iamVjdCAqd29iaiA9IFB5V2Vha3JlZl9HRVRfT0JKRUNUKHB5b2JqKTsKKyAgICAgICAgcmV0dXJuIHdvYmogPyBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyh3b2JqKSA6IDA7CisgICAgICB9CisjZW5kaWYKKyAgICAgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHIocHlvYmosU1dJR19UaGlzKCkpOworICAgICAgaWYgKG9iaikgeworICAgICAgICBQeV9ERUNSRUYob2JqKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSBQeUVycl9DbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbHNlCisgIG9iaiA9IFB5T2JqZWN0X0dldEF0dHIocHlvYmosU1dJR19UaGlzKCkpOworICBpZiAob2JqKSB7CisgICAgUHlfREVDUkVGKG9iaik7CisgIH0gZWxzZSB7CisgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIFB5RXJyX0NsZWFyKCk7CisgICAgcmV0dXJuIDA7CisgIH0KKyNlbmRpZgorICBpZiAob2JqICYmICFTd2lnUHlPYmplY3RfQ2hlY2sob2JqKSkgeworICAgIC8qIGEgUHlPYmplY3QgaXMgY2FsbGVkICd0aGlzJywgdHJ5IHRvIGdldCB0aGUgJ3JlYWwgdGhpcycKKyAgICAgICBTd2lnUHlPYmplY3QgZnJvbSBpdCAqLworICAgIHJldHVybiBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhvYmopOworICB9CisgIHJldHVybiAoU3dpZ1B5T2JqZWN0ICopb2JqOworI2VuZGlmCit9CisKKy8qIEFjcXVpcmUgYSBwb2ludGVyIHZhbHVlICovCisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQWNxdWlyZVB0cihQeU9iamVjdCAqb2JqLCBpbnQgb3duKSB7CisgIGlmIChvd24gPT0gU1dJR19QT0lOVEVSX09XTikgeworICAgIFN3aWdQeU9iamVjdCAqc29iaiA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9iaik7CisgICAgaWYgKHNvYmopIHsKKyAgICAgIGludCBvbGRvd24gPSBzb2JqLT5vd247CisgICAgICBzb2JqLT5vd24gPSBvd247CisgICAgICByZXR1cm4gb2xkb3duOworICAgIH0KKyAgfQorICByZXR1cm4gMDsKK30KKworLyogQ29udmVydCBhIHBvaW50ZXIgdmFsdWUgKi8KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Db252ZXJ0UHRyQW5kT3duKFB5T2JqZWN0ICpvYmosIHZvaWQgKipwdHIsIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzLCBpbnQgKm93bikgeworICBpbnQgcmVzOworICBTd2lnUHlPYmplY3QgKnNvYmo7CisKKyAgaWYgKCFvYmopCisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIGlmIChvYmogPT0gUHlfTm9uZSkgeworICAgIGlmIChwdHIpCisgICAgICAqcHRyID0gMDsKKyAgICByZXR1cm4gU1dJR19PSzsKKyAgfQorCisgIHJlcyA9IFNXSUdfRVJST1I7CisKKyAgc29iaiA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9iaik7CisgIGlmIChvd24pCisgICAgKm93biA9IDA7CisgIHdoaWxlIChzb2JqKSB7CisgICAgdm9pZCAqdnB0ciA9IHNvYmotPnB0cjsKKyAgICBpZiAodHkpIHsKKyAgICAgIHN3aWdfdHlwZV9pbmZvICp0byA9IHNvYmotPnR5OworICAgICAgaWYgKHRvID09IHR5KSB7CisgICAgICAgIC8qIG5vIHR5cGUgY2FzdCBuZWVkZWQgKi8KKyAgICAgICAgaWYgKHB0cikgKnB0ciA9IHZwdHI7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpZ19jYXN0X2luZm8gKnRjID0gU1dJR19UeXBlQ2hlY2sodG8tPm5hbWUsdHkpOworICAgICAgICBpZiAoIXRjKSB7CisgICAgICAgICAgc29iaiA9IChTd2lnUHlPYmplY3QgKilzb2JqLT5uZXh0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgIGludCBuZXdtZW1vcnkgPSAwOworICAgICAgICAgICAgKnB0ciA9IFNXSUdfVHlwZUNhc3QodGMsdnB0ciwmbmV3bWVtb3J5KTsKKyAgICAgICAgICAgIGlmIChuZXdtZW1vcnkgPT0gU1dJR19DQVNUX05FV19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgYXNzZXJ0KG93bik7IC8qIGJhZGx5IGZvcm1lZCB0eXBlbWFwIHdoaWNoIHdpbGwgbGVhZCB0byBhIG1lbW9yeSBsZWFrIC0gaXQgbXVzdCBzZXQgYW5kIHVzZSBvd24gdG8gZGVsZXRlICpwdHIgKi8KKyAgICAgICAgICAgICAgaWYgKG93bikKKyAgICAgICAgICAgICAgICAqb3duID0gKm93biB8IFNXSUdfQ0FTVF9ORVdfTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBpZiAocHRyKSAqcHRyID0gdnB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBpZiAoc29iaikgeworICAgIGlmIChvd24pCisgICAgICAqb3duID0gKm93biB8IHNvYmotPm93bjsKKyAgICBpZiAoZmxhZ3MgJiBTV0lHX1BPSU5URVJfRElTT1dOKSB7CisgICAgICBzb2JqLT5vd24gPSAwOworICAgIH0KKyAgICByZXMgPSBTV0lHX09LOworICB9IGVsc2UgeworICAgIGlmIChmbGFncyAmIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WKSB7CisgICAgICBTd2lnUHlDbGllbnREYXRhICpkYXRhID0gdHkgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSB0eS0+Y2xpZW50ZGF0YSA6IDA7CisgICAgICBpZiAoZGF0YSAmJiAhZGF0YS0+aW1wbGljaXRjb252KSB7CisgICAgICAgIFB5T2JqZWN0ICprbGFzcyA9IGRhdGEtPmtsYXNzOworICAgICAgICBpZiAoa2xhc3MpIHsKKyAgICAgICAgICBQeU9iamVjdCAqaW1wY29udjsKKyAgICAgICAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAxOyAvKiBhdm9pZCByZWN1cnNpb24gYW5kIGNhbGwgJ2V4cGxpY2l0JyBjb25zdHJ1Y3RvcnMqLworICAgICAgICAgIGltcGNvbnYgPSBTV0lHX1B5dGhvbl9DYWxsRnVuY3RvcihrbGFzcywgb2JqKTsKKyAgICAgICAgICBkYXRhLT5pbXBsaWNpdGNvbnYgPSAwOworICAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICAgICAgaW1wY29udiA9IDA7CisgICAgICAgICAgfQorICAgICAgICAgIGlmIChpbXBjb252KSB7CisgICAgICAgICAgICBTd2lnUHlPYmplY3QgKmlvYmogPSBTV0lHX1B5dGhvbl9HZXRTd2lnVGhpcyhpbXBjb252KTsKKyAgICAgICAgICAgIGlmIChpb2JqKSB7CisgICAgICAgICAgICAgIHZvaWQgKnZwdHI7CisgICAgICAgICAgICAgIHJlcyA9IFNXSUdfUHl0aG9uX0NvbnZlcnRQdHJBbmRPd24oKFB5T2JqZWN0Kilpb2JqLCAmdnB0ciwgdHksIDAsIDApOworICAgICAgICAgICAgICBpZiAoU1dJR19Jc09LKHJlcykpIHsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAqcHRyID0gdnB0cjsKKyAgICAgICAgICAgICAgICAgIC8qIHRyYW5zZmVyIHRoZSBvd25lcnNoaXAgdG8gJ3B0cicgKi8KKyAgICAgICAgICAgICAgICAgIGlvYmotPm93biA9IDA7CisgICAgICAgICAgICAgICAgICByZXMgPSBTV0lHX0FkZENhc3QocmVzKTsKKyAgICAgICAgICAgICAgICAgIHJlcyA9IFNXSUdfQWRkTmV3TWFzayhyZXMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXMgPSBTV0lHX0FkZENhc3QocmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFB5X0RFQ1JFRihpbXBjb252KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworLyogQ29udmVydCBhIGZ1bmN0aW9uIHB0ciB2YWx1ZSAqLworCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0NvbnZlcnRGdW5jdGlvblB0cihQeU9iamVjdCAqb2JqLCB2b2lkICoqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHkpIHsKKyAgaWYgKCFQeUNGdW5jdGlvbl9DaGVjayhvYmopKSB7CisgICAgcmV0dXJuIFNXSUdfQ29udmVydFB0cihvYmosIHB0ciwgdHksIDApOworICB9IGVsc2UgeworICAgIHZvaWQgKnZwdHIgPSAwOworCisgICAgLyogaGVyZSB3ZSBnZXQgdGhlIG1ldGhvZCBwb2ludGVyIGZvciBjYWxsYmFja3MgKi8KKyAgICBjb25zdCBjaGFyICpkb2MgPSAoKChQeUNGdW5jdGlvbk9iamVjdCAqKW9iaikgLT4gbV9tbCAtPiBtbF9kb2MpOworICAgIGNvbnN0IGNoYXIgKmRlc2MgPSBkb2MgPyBzdHJzdHIoZG9jLCAic3dpZ19wdHI6ICIpIDogMDsKKyAgICBpZiAoZGVzYykKKyAgICAgIGRlc2MgPSB0eSA/IFNXSUdfVW5wYWNrVm9pZFB0cihkZXNjICsgMTAsICZ2cHRyLCB0eS0+bmFtZSkgOiAwOworICAgIGlmICghZGVzYykKKyAgICAgIHJldHVybiBTV0lHX0VSUk9SOworICAgIGlmICh0eSkgeworICAgICAgc3dpZ19jYXN0X2luZm8gKnRjID0gU1dJR19UeXBlQ2hlY2soZGVzYyx0eSk7CisgICAgICBpZiAodGMpIHsKKyAgICAgICAgaW50IG5ld21lbW9yeSA9IDA7CisgICAgICAgICpwdHIgPSBTV0lHX1R5cGVDYXN0KHRjLHZwdHIsJm5ld21lbW9yeSk7CisgICAgICAgIGFzc2VydCghbmV3bWVtb3J5KTsgLyogbmV3bWVtb3J5IGhhbmRsaW5nIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTV0lHX0VSUk9SOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAqcHRyID0gdnB0cjsKKyAgICB9CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0KK30KKworLyogQ29udmVydCBhIHBhY2tlZCB2YWx1ZSB2YWx1ZSAqLworCitTV0lHUlVOVElNRSBpbnQKK1NXSUdfUHl0aG9uX0NvbnZlcnRQYWNrZWQoUHlPYmplY3QgKm9iaiwgdm9pZCAqcHRyLCBzaXplX3Qgc3osIHN3aWdfdHlwZV9pbmZvICp0eSkgeworICBzd2lnX3R5cGVfaW5mbyAqdG8gPSBTd2lnUHlQYWNrZWRfVW5wYWNrRGF0YShvYmosIHB0ciwgc3opOworICBpZiAoIXRvKSByZXR1cm4gU1dJR19FUlJPUjsKKyAgaWYgKHR5KSB7CisgICAgaWYgKHRvICE9IHR5KSB7CisgICAgICAvKiBjaGVjayB0eXBlIGNhc3Q/ICovCisgICAgICBzd2lnX2Nhc3RfaW5mbyAqdGMgPSBTV0lHX1R5cGVDaGVjayh0by0+bmFtZSx0eSk7CisgICAgICBpZiAoIXRjKSByZXR1cm4gU1dJR19FUlJPUjsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFNXSUdfT0s7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDcmVhdGUgYSBuZXcgcG9pbnRlciBvYmplY3QKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvYmplY3QsIHdpdGhvdXQgY2FsbGluZyBfX2luaXRfXywgYW5kIHNldCB0aGUKKyAgJ3RoaXMnIGF0dHJpYnV0ZS4KKyovCisKK1NXSUdSVU5USU1FIFB5T2JqZWN0KgorU1dJR19QeXRob25fTmV3U2hhZG93SW5zdGFuY2UoU3dpZ1B5Q2xpZW50RGF0YSAqZGF0YSwgUHlPYmplY3QgKnN3aWdfdGhpcykKK3sKKyNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMCkKKyAgUHlPYmplY3QgKmluc3QgPSAwOworICBQeU9iamVjdCAqbmV3cmF3ID0gZGF0YS0+bmV3cmF3OworICBpZiAobmV3cmF3KSB7CisgICAgaW5zdCA9IFB5T2JqZWN0X0NhbGwobmV3cmF3LCBkYXRhLT5uZXdhcmdzLCBOVUxMKTsKKyAgICBpZiAoaW5zdCkgeworI2lmICFkZWZpbmVkKFNXSUdfUFlUSE9OX1NMT1dfR0VUU0VUX1RISVMpCisgICAgICBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihpbnN0KTsKKyAgICAgIGlmIChkaWN0cHRyICE9IE5VTEwpIHsKKyAgICAgICAgUHlPYmplY3QgKmRpY3QgPSAqZGljdHB0cjsKKyAgICAgICAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgICAgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICAgICAgKmRpY3RwdHIgPSBkaWN0OworICAgICAgICAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgICAgICB9CisgICAgICB9CisjZWxzZQorICAgICAgUHlPYmplY3QgKmtleSA9IFNXSUdfVGhpcygpOworICAgICAgUHlPYmplY3RfU2V0QXR0cihpbnN0LCBrZXksIHN3aWdfdGhpcyk7CisjZW5kaWYKKyAgICB9CisgIH0gZWxzZSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorICAgIGluc3QgPSBQeUJhc2VPYmplY3RfVHlwZS50cF9uZXcoKFB5VHlwZU9iamVjdCopIGRhdGEtPm5ld2FyZ3MsIFB5X05vbmUsIFB5X05vbmUpOworICAgIFB5T2JqZWN0X1NldEF0dHIoaW5zdCwgU1dJR19UaGlzKCksIHN3aWdfdGhpcyk7CisgICAgUHlfVFlQRShpbnN0KS0+dHBfZmxhZ3MgJj0gflB5X1RQRkxBR1NfVkFMSURfVkVSU0lPTl9UQUc7CisjZWxzZQorICAgIFB5T2JqZWN0ICpkaWN0ID0gUHlEaWN0X05ldygpOworICAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgIGluc3QgPSBQeUluc3RhbmNlX05ld1JhdyhkYXRhLT5uZXdhcmdzLCBkaWN0KTsKKyAgICBQeV9ERUNSRUYoZGljdCk7CisjZW5kaWYKKyAgfQorICByZXR1cm4gaW5zdDsKKyNlbHNlCisjaWYgKFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMTAwMDApCisgIFB5T2JqZWN0ICppbnN0OworICBQeU9iamVjdCAqZGljdCA9IFB5RGljdF9OZXcoKTsKKyAgUHlEaWN0X1NldEl0ZW0oZGljdCwgU1dJR19UaGlzKCksIHN3aWdfdGhpcyk7CisgIGluc3QgPSBQeUluc3RhbmNlX05ld1JhdyhkYXRhLT5uZXdhcmdzLCBkaWN0KTsKKyAgUHlfREVDUkVGKGRpY3QpOworICByZXR1cm4gKFB5T2JqZWN0ICopIGluc3Q7CisjZWxzZQorICBQeUluc3RhbmNlT2JqZWN0ICppbnN0ID0gUHlPYmplY3RfTkVXKFB5SW5zdGFuY2VPYmplY3QsICZQeUluc3RhbmNlX1R5cGUpOworICBpZiAoaW5zdCA9PSBOVUxMKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgaW5zdC0+aW5fY2xhc3MgPSAoUHlDbGFzc09iamVjdCAqKWRhdGEtPm5ld2FyZ3M7CisgIFB5X0lOQ1JFRihpbnN0LT5pbl9jbGFzcyk7CisgIGluc3QtPmluX2RpY3QgPSBQeURpY3RfTmV3KCk7CisgIGlmIChpbnN0LT5pbl9kaWN0ID09IE5VTEwpIHsKKyAgICBQeV9ERUNSRUYoaW5zdCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyNpZmRlZiBQeV9UUEZMQUdTX0hBVkVfV0VBS1JFRlMKKyAgaW5zdC0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOworI2VuZGlmCisjaWZkZWYgUHlfVFBGTEFHU19HQworICBQeU9iamVjdF9HQ19Jbml0KGluc3QpOworI2VuZGlmCisgIFB5RGljdF9TZXRJdGVtKGluc3QtPmluX2RpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICByZXR1cm4gKFB5T2JqZWN0ICopIGluc3Q7CisjZW5kaWYKKyNlbmRpZgorfQorCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1B5dGhvbl9TZXRTd2lnVGhpcyhQeU9iamVjdCAqaW5zdCwgUHlPYmplY3QgKnN3aWdfdGhpcykKK3sKKyBQeU9iamVjdCAqZGljdDsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMCkgJiYgIWRlZmluZWQoU1dJR19QWVRIT05fU0xPV19HRVRTRVRfVEhJUykKKyBQeU9iamVjdCAqKmRpY3RwdHIgPSBfUHlPYmplY3RfR2V0RGljdFB0cihpbnN0KTsKKyBpZiAoZGljdHB0ciAhPSBOVUxMKSB7CisgICBkaWN0ID0gKmRpY3RwdHI7CisgICBpZiAoZGljdCA9PSBOVUxMKSB7CisgICAgIGRpY3QgPSBQeURpY3RfTmV3KCk7CisgICAgICpkaWN0cHRyID0gZGljdDsKKyAgIH0KKyAgIFB5RGljdF9TZXRJdGVtKGRpY3QsIFNXSUdfVGhpcygpLCBzd2lnX3RoaXMpOworICAgcmV0dXJuOworIH0KKyNlbmRpZgorIGRpY3QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGluc3QsIChjaGFyKikiX19kaWN0X18iKTsKKyBQeURpY3RfU2V0SXRlbShkaWN0LCBTV0lHX1RoaXMoKSwgc3dpZ190aGlzKTsKKyBQeV9ERUNSRUYoZGljdCk7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqCitTV0lHX1B5dGhvbl9Jbml0U2hhZG93SW5zdGFuY2UoUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKm9ialsyXTsKKyAgaWYgKCFTV0lHX1B5dGhvbl9VbnBhY2tUdXBsZShhcmdzLChjaGFyKikic3dpZ2luaXQiLCAyLCAyLCBvYmopKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgU3dpZ1B5T2JqZWN0ICpzdGhpcyA9IFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzKG9ialswXSk7CisgICAgaWYgKHN0aGlzKSB7CisgICAgICBTd2lnUHlPYmplY3RfYXBwZW5kKChQeU9iamVjdCopIHN0aGlzLCBvYmpbMV0pOworICAgIH0gZWxzZSB7CisgICAgICBTV0lHX1B5dGhvbl9TZXRTd2lnVGhpcyhvYmpbMF0sIG9ialsxXSk7CisgICAgfQorICAgIHJldHVybiBTV0lHX1B5X1ZvaWQoKTsKKyAgfQorfQorCisvKiBDcmVhdGUgYSBuZXcgcG9pbnRlciBvYmplY3QgKi8KKworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeXRob25fTmV3UG9pbnRlck9iaihQeU9iamVjdCAqc2VsZiwgdm9pZCAqcHRyLCBzd2lnX3R5cGVfaW5mbyAqdHlwZSwgaW50IGZsYWdzKSB7CisgIFN3aWdQeUNsaWVudERhdGEgKmNsaWVudGRhdGE7CisgIFB5T2JqZWN0ICogcm9iajsKKyAgaW50IG93bjsKKworICBpZiAoIXB0cikKKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisKKyAgY2xpZW50ZGF0YSA9IHR5cGUgPyAoU3dpZ1B5Q2xpZW50RGF0YSAqKSh0eXBlLT5jbGllbnRkYXRhKSA6IDA7CisgIG93biA9IChmbGFncyAmIFNXSUdfUE9JTlRFUl9PV04pID8gU1dJR19QT0lOVEVSX09XTiA6IDA7CisgIGlmIChjbGllbnRkYXRhICYmIGNsaWVudGRhdGEtPnB5dHlwZSkgeworICAgIFN3aWdQeU9iamVjdCAqbmV3b2JqOworICAgIGlmIChmbGFncyAmIFNXSUdfQlVJTFRJTl9UUF9JTklUKSB7CisgICAgICBuZXdvYmogPSAoU3dpZ1B5T2JqZWN0Kikgc2VsZjsKKyAgICAgIGlmIChuZXdvYmotPnB0cikgeworICAgICAgICBQeU9iamVjdCAqbmV4dF9zZWxmID0gY2xpZW50ZGF0YS0+cHl0eXBlLT50cF9hbGxvYyhjbGllbnRkYXRhLT5weXR5cGUsIDApOworICAgICAgICB3aGlsZSAobmV3b2JqLT5uZXh0KQorICAgICAgICAgIG5ld29iaiA9IChTd2lnUHlPYmplY3QgKikgbmV3b2JqLT5uZXh0OworICAgICAgICBuZXdvYmotPm5leHQgPSBuZXh0X3NlbGY7CisgICAgICAgIG5ld29iaiA9IChTd2lnUHlPYmplY3QgKiluZXh0X3NlbGY7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG5ld29iaiA9IFB5T2JqZWN0X05ldyhTd2lnUHlPYmplY3QsIGNsaWVudGRhdGEtPnB5dHlwZSk7CisgICAgfQorICAgIGlmIChuZXdvYmopIHsKKyAgICAgIG5ld29iai0+cHRyID0gcHRyOworICAgICAgbmV3b2JqLT50eSA9IHR5cGU7CisgICAgICBuZXdvYmotPm93biA9IG93bjsKKyAgICAgIG5ld29iai0+bmV4dCA9IDA7CisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgICAgICBuZXdvYmotPmRpY3QgPSAwOworI2VuZGlmCisgICAgICByZXR1cm4gKFB5T2JqZWN0KikgbmV3b2JqOworICAgIH0KKyAgICByZXR1cm4gU1dJR19QeV9Wb2lkKCk7CisgIH0KKworICBhc3NlcnQoIShmbGFncyAmIFNXSUdfQlVJTFRJTl9UUF9JTklUKSk7CisKKyAgcm9iaiA9IFN3aWdQeU9iamVjdF9OZXcocHRyLCB0eXBlLCBvd24pOworICBpZiAoY2xpZW50ZGF0YSAmJiAhKGZsYWdzICYgU1dJR19QT0lOVEVSX05PU0hBRE9XKSkgeworICAgIFB5T2JqZWN0ICppbnN0ID0gU1dJR19QeXRob25fTmV3U2hhZG93SW5zdGFuY2UoY2xpZW50ZGF0YSwgcm9iaik7CisgICAgaWYgKGluc3QpIHsKKyAgICAgIFB5X0RFQ1JFRihyb2JqKTsKKyAgICAgIHJvYmogPSBpbnN0OworICAgIH0KKyAgfQorICByZXR1cm4gcm9iajsKK30KKworLyogQ3JlYXRlIGEgbmV3IHBhY2tlZCBvYmplY3QgKi8KKworU1dJR1JVTlRJTUVJTkxJTkUgUHlPYmplY3QgKgorU1dJR19QeXRob25fTmV3UGFja2VkT2JqKHZvaWQgKnB0ciwgc2l6ZV90IHN6LCBzd2lnX3R5cGVfaW5mbyAqdHlwZSkgeworICByZXR1cm4gcHRyID8gU3dpZ1B5UGFja2VkX05ldygodm9pZCAqKSBwdHIsIHN6LCB0eXBlKSA6IFNXSUdfUHlfVm9pZCgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSoKKyAqICBHZXQgdHlwZSBsaXN0CisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZmRlZiBTV0lHX0xJTktfUlVOVElNRQordm9pZCAqU1dJR19SZXR1cm5HbG9iYWxUeXBlTGlzdCh2b2lkICopOworI2VuZGlmCisKK1NXSUdSVU5USU1FIHN3aWdfbW9kdWxlX2luZm8gKgorU1dJR19QeXRob25fR2V0TW9kdWxlKHZvaWQpIHsKKyAgc3RhdGljIHZvaWQgKnR5cGVfcG9pbnRlciA9ICh2b2lkICopMDsKKyAgLyogZmlyc3QgY2hlY2sgaWYgbW9kdWxlIGFscmVhZHkgY3JlYXRlZCAqLworICBpZiAoIXR5cGVfcG9pbnRlcikgeworI2lmZGVmIFNXSUdfTElOS19SVU5USU1FCisgICAgdHlwZV9wb2ludGVyID0gU1dJR19SZXR1cm5HbG9iYWxUeXBlTGlzdCgodm9pZCAqKTApOworI2Vsc2UKKyMgaWZkZWYgU1dJR1BZX1VTRV9DQVBTVUxFCisgICAgdHlwZV9wb2ludGVyID0gUHlDYXBzdWxlX0ltcG9ydChTV0lHUFlfQ0FQU1VMRV9OQU1FLCAwKTsKKyMgZWxzZQorICAgIHR5cGVfcG9pbnRlciA9IFB5Q09iamVjdF9JbXBvcnQoKGNoYXIqKSJzd2lnX3J1bnRpbWVfZGF0YSIgU1dJR19SVU5USU1FX1ZFUlNJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopInR5cGVfcG9pbnRlciIgU1dJR19UWVBFX1RBQkxFX05BTUUpOworIyBlbmRpZgorICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgICAgdHlwZV9wb2ludGVyID0gKHZvaWQgKikwOworICAgIH0KKyNlbmRpZgorICB9CisgIHJldHVybiAoc3dpZ19tb2R1bGVfaW5mbyAqKSB0eXBlX3BvaW50ZXI7Cit9CisKKyNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMgorLyogUHlNb2R1bGVfQWRkT2JqZWN0IGZ1bmN0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIFB5dGhvbiAyLjAuICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uCisgICBpcyBjb3BpZWQgb3V0IG9mIFB5dGhvbi9tb2RzdXBwb3J0LmMgaW4gcHl0aG9uIHZlcnNpb24gMi4zLjQgKi8KK1NXSUdJTlRFUk4gaW50CitQeU1vZHVsZV9BZGRPYmplY3QoUHlPYmplY3QgKm0sIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICpvKQoreworICBQeU9iamVjdCAqZGljdDsKKyAgaWYgKCFQeU1vZHVsZV9DaGVjayhtKSkgeworICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICJQeU1vZHVsZV9BZGRPYmplY3QoKSBuZWVkcyBtb2R1bGUgYXMgZmlyc3QgYXJnIik7CisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIH0KKyAgaWYgKCFvKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgIlB5TW9kdWxlX0FkZE9iamVjdCgpIG5lZWRzIG5vbi1OVUxMIHZhbHVlIik7CisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIH0KKworICBkaWN0ID0gUHlNb2R1bGVfR2V0RGljdChtKTsKKyAgaWYgKGRpY3QgPT0gTlVMTCkgeworICAgIC8qIEludGVybmFsIGVycm9yIC0tIG1vZHVsZXMgbXVzdCBoYXZlIGEgZGljdCEgKi8KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJtb2R1bGUgJyVzJyBoYXMgbm8gX19kaWN0X18iLAorICAgICAgICAgICAgICAgICBQeU1vZHVsZV9HZXROYW1lKG0pKTsKKyAgICByZXR1cm4gU1dJR19FUlJPUjsKKyAgfQorICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoZGljdCwgbmFtZSwgbykpCisgICAgcmV0dXJuIFNXSUdfRVJST1I7CisgIFB5X0RFQ1JFRihvKTsKKyAgcmV0dXJuIFNXSUdfT0s7Cit9CisjZW5kaWYKKworU1dJR1JVTlRJTUUgdm9pZAorI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorU1dJR19QeXRob25fRGVzdHJveU1vZHVsZShQeU9iamVjdCAqb2JqKQorI2Vsc2UKK1NXSUdfUHl0aG9uX0Rlc3Ryb3lNb2R1bGUodm9pZCAqdnB0cikKKyNlbmRpZgoreworI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorICBzd2lnX21vZHVsZV9pbmZvICpzd2lnX21vZHVsZSA9IChzd2lnX21vZHVsZV9pbmZvICopIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG9iaiwgU1dJR1BZX0NBUFNVTEVfTkFNRSk7CisjZWxzZQorICBzd2lnX21vZHVsZV9pbmZvICpzd2lnX21vZHVsZSA9IChzd2lnX21vZHVsZV9pbmZvICopIHZwdHI7CisjZW5kaWYKKyAgc3dpZ190eXBlX2luZm8gKip0eXBlcyA9IHN3aWdfbW9kdWxlLT50eXBlczsKKyAgc2l6ZV90IGk7CisgIGZvciAoaSA9MDsgaSA8IHN3aWdfbW9kdWxlLT5zaXplOyArK2kpIHsKKyAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSB0eXBlc1tpXTsKKyAgICBpZiAodHktPm93bmRhdGEpIHsKKyAgICAgIFN3aWdQeUNsaWVudERhdGEgKmRhdGEgPSAoU3dpZ1B5Q2xpZW50RGF0YSAqKSB0eS0+Y2xpZW50ZGF0YTsKKyAgICAgIGlmIChkYXRhKSBTd2lnUHlDbGllbnREYXRhX0RlbChkYXRhKTsKKyAgICB9CisgIH0KKyAgUHlfREVDUkVGKFNXSUdfVGhpcygpKTsKKyAgc3dpZ190aGlzID0gTlVMTDsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fU2V0TW9kdWxlKHN3aWdfbW9kdWxlX2luZm8gKnN3aWdfbW9kdWxlKSB7CisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorIC8qIEFkZCBhIGR1bW15IG1vZHVsZSBvYmplY3QgaW50byBzeXMubW9kdWxlcyAqLworICBQeU9iamVjdCAqbW9kdWxlID0gUHlJbXBvcnRfQWRkTW9kdWxlKChjaGFyKikic3dpZ19ydW50aW1lX2RhdGEiIFNXSUdfUlVOVElNRV9WRVJTSU9OKTsKKyNlbHNlCisgIHN0YXRpYyBQeU1ldGhvZERlZiBzd2lnX2VtcHR5X3J1bnRpbWVfbWV0aG9kX3RhYmxlW10gPSB7IHtOVUxMLCBOVUxMLCAwLCBOVUxMfSB9OyAvKiBTZW50aW5lbCAqLworICBQeU9iamVjdCAqbW9kdWxlID0gUHlfSW5pdE1vZHVsZSgoY2hhciopInN3aWdfcnVudGltZV9kYXRhIiBTV0lHX1JVTlRJTUVfVkVSU0lPTiwgc3dpZ19lbXB0eV9ydW50aW1lX21ldGhvZF90YWJsZSk7CisjZW5kaWYKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgUHlPYmplY3QgKnBvaW50ZXIgPSBQeUNhcHN1bGVfTmV3KCh2b2lkICopIHN3aWdfbW9kdWxlLCBTV0lHUFlfQ0FQU1VMRV9OQU1FLCBTV0lHX1B5dGhvbl9EZXN0cm95TW9kdWxlKTsKKyAgaWYgKHBvaW50ZXIgJiYgbW9kdWxlKSB7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgKGNoYXIqKSJ0eXBlX3BvaW50ZXJfY2Fwc3VsZSIgU1dJR19UWVBFX1RBQkxFX05BTUUsIHBvaW50ZXIpOworICB9IGVsc2UgeworICAgIFB5X1hERUNSRUYocG9pbnRlcik7CisgIH0KKyNlbHNlCisgIFB5T2JqZWN0ICpwb2ludGVyID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKCh2b2lkICopIHN3aWdfbW9kdWxlLCBTV0lHX1B5dGhvbl9EZXN0cm95TW9kdWxlKTsKKyAgaWYgKHBvaW50ZXIgJiYgbW9kdWxlKSB7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG1vZHVsZSwgKGNoYXIqKSJ0eXBlX3BvaW50ZXIiIFNXSUdfVFlQRV9UQUJMRV9OQU1FLCBwb2ludGVyKTsKKyAgfSBlbHNlIHsKKyAgICBQeV9YREVDUkVGKHBvaW50ZXIpOworICB9CisjZW5kaWYKK30KKworLyogVGhlIHB5dGhvbiBjYWNoZWQgdHlwZSBxdWVyeSAqLworU1dJR1JVTlRJTUUgUHlPYmplY3QgKgorU1dJR19QeXRob25fVHlwZUNhY2hlKHZvaWQpIHsKKyAgc3RhdGljIFB5T2JqZWN0ICpTV0lHX1NUQVRJQ19QT0lOVEVSKGNhY2hlKSA9IFB5RGljdF9OZXcoKTsKKyAgcmV0dXJuIGNhY2hlOworfQorCitTV0lHUlVOVElNRSBzd2lnX3R5cGVfaW5mbyAqCitTV0lHX1B5dGhvbl9UeXBlUXVlcnkoY29uc3QgY2hhciAqdHlwZSkKK3sKKyAgUHlPYmplY3QgKmNhY2hlID0gU1dJR19QeXRob25fVHlwZUNhY2hlKCk7CisgIFB5T2JqZWN0ICprZXkgPSBTV0lHX1B5dGhvbl9zdHJfRnJvbUNoYXIodHlwZSk7CisgIFB5T2JqZWN0ICpvYmogPSBQeURpY3RfR2V0SXRlbShjYWNoZSwga2V5KTsKKyAgc3dpZ190eXBlX2luZm8gKmRlc2NyaXB0b3I7CisgIGlmIChvYmopIHsKKyNpZmRlZiBTV0lHUFlfVVNFX0NBUFNVTEUKKyAgICBkZXNjcmlwdG9yID0gKHN3aWdfdHlwZV9pbmZvICopIFB5Q2Fwc3VsZV9HZXRQb2ludGVyKG9iaiwgTlVMTCk7CisjZWxzZQorICAgIGRlc2NyaXB0b3IgPSAoc3dpZ190eXBlX2luZm8gKikgUHlDT2JqZWN0X0FzVm9pZFB0cihvYmopOworI2VuZGlmCisgIH0gZWxzZSB7CisgICAgc3dpZ19tb2R1bGVfaW5mbyAqc3dpZ19tb2R1bGUgPSBTV0lHX1B5dGhvbl9HZXRNb2R1bGUoKTsKKyAgICBkZXNjcmlwdG9yID0gU1dJR19UeXBlUXVlcnlNb2R1bGUoc3dpZ19tb2R1bGUsIHN3aWdfbW9kdWxlLCB0eXBlKTsKKyAgICBpZiAoZGVzY3JpcHRvcikgeworI2lmZGVmIFNXSUdQWV9VU0VfQ0FQU1VMRQorICAgICAgb2JqID0gUHlDYXBzdWxlX05ldygodm9pZCopIGRlc2NyaXB0b3IsIE5VTEwsIE5VTEwpOworI2Vsc2UKKyAgICAgIG9iaiA9IFB5Q09iamVjdF9Gcm9tVm9pZFB0cihkZXNjcmlwdG9yLCBOVUxMKTsKKyNlbmRpZgorICAgICAgUHlEaWN0X1NldEl0ZW0oY2FjaGUsIGtleSwgb2JqKTsKKyAgICAgIFB5X0RFQ1JFRihvYmopOworICAgIH0KKyAgfQorICBQeV9ERUNSRUYoa2V5KTsKKyAgcmV0dXJuIGRlc2NyaXB0b3I7Cit9CisKKy8qCisgICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CisqLworI2RlZmluZSBTV0lHX1BPSU5URVJfRVhDRVBUSU9OICAwCisjZGVmaW5lIFNXSUdfYXJnX2ZhaWwoYXJnKSAgICAgIFNXSUdfUHl0aG9uX0FyZ0ZhaWwoYXJnKQorI2RlZmluZSBTV0lHX011c3RHZXRQdHIocCwgdHlwZSwgYXJnbnVtLCBmbGFncykgIFNXSUdfUHl0aG9uX011c3RHZXRQdHIocCwgdHlwZSwgYXJnbnVtLCBmbGFncykKKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9BZGRFcnJNZXNnKGNvbnN0IGNoYXIqIG1lc2csIGludCBpbmZyb250KQoreworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIFB5T2JqZWN0ICp0eXBlID0gMDsKKyAgICBQeU9iamVjdCAqdmFsdWUgPSAwOworICAgIFB5T2JqZWN0ICp0cmFjZWJhY2sgPSAwOworICAgIFB5RXJyX0ZldGNoKCZ0eXBlLCAmdmFsdWUsICZ0cmFjZWJhY2spOworICAgIGlmICh2YWx1ZSkgeworICAgICAgY2hhciAqdG1wOworICAgICAgUHlPYmplY3QgKm9sZF9zdHIgPSBQeU9iamVjdF9TdHIodmFsdWUpOworICAgICAgUHlfWElOQ1JFRih0eXBlKTsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICBpZiAoaW5mcm9udCkgeworICAgICAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgbWVzZywgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBQeUVycl9Gb3JtYXQodHlwZSwgIiVzICVzIiwgdG1wID0gU1dJR19QeXRob25fc3RyX0FzQ2hhcihvbGRfc3RyKSwgbWVzZyk7CisgICAgICB9CisgICAgICBTV0lHX1B5dGhvbl9zdHJfRGVsRm9yUHkzKHRtcCk7CisgICAgICBQeV9ERUNSRUYob2xkX3N0cik7CisgICAgfQorICAgIHJldHVybiAxOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9Cit9CisKK1NXSUdSVU5USU1FIGludAorU1dJR19QeXRob25fQXJnRmFpbChpbnQgYXJnbnVtKQoreworICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgeworICAgIC8qIGFkZCBpbmZvcm1hdGlvbiBhYm91dCBmYWlsaW5nIGFyZ3VtZW50ICovCisgICAgY2hhciBtZXNnWzI1Nl07CisgICAgUHlPU19zbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJhcmd1bWVudCBudW1iZXIgJWQ6IiwgYXJnbnVtKTsKKyAgICByZXR1cm4gU1dJR19QeXRob25fQWRkRXJyTWVzZyhtZXNnLCAxKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gMDsKKyAgfQorfQorCitTV0lHUlVOVElNRUlOTElORSBjb25zdCBjaGFyICoKK1N3aWdQeU9iamVjdF9HZXREZXNjKFB5T2JqZWN0ICpzZWxmKQoreworICBTd2lnUHlPYmplY3QgKnYgPSAoU3dpZ1B5T2JqZWN0ICopc2VsZjsKKyAgc3dpZ190eXBlX2luZm8gKnR5ID0gdiA/IHYtPnR5IDogMDsKKyAgcmV0dXJuIHR5ID8gdHktPnN0ciA6IChjaGFyKikiIjsKK30KKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19QeXRob25fVHlwZUVycm9yKGNvbnN0IGNoYXIgKnR5cGUsIFB5T2JqZWN0ICpvYmopCit7CisgIGlmICh0eXBlKSB7CisjaWYgZGVmaW5lZChTV0lHX0NPQkpFQ1RfVFlQRVMpCisgICAgaWYgKG9iaiAmJiBTd2lnUHlPYmplY3RfQ2hlY2sob2JqKSkgeworICAgICAgY29uc3QgY2hhciAqb3R5cGUgPSAoY29uc3QgY2hhciAqKSBTd2lnUHlPYmplY3RfR2V0RGVzYyhvYmopOworICAgICAgaWYgKG90eXBlKSB7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhICclcycgaXMgZXhwZWN0ZWQsICdTd2lnUHlPYmplY3QoJXMpJyBpcyByZWNlaXZlZCIsCisgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvdHlwZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKm90eXBlID0gKG9iaiA/IG9iai0+b2JfdHlwZS0+dHBfbmFtZSA6IDApOworICAgICAgaWYgKG90eXBlKSB7CisgICAgICAgIFB5T2JqZWN0ICpzdHIgPSBQeU9iamVjdF9TdHIob2JqKTsKKyAgICAgICAgY29uc3QgY2hhciAqY3N0ciA9IHN0ciA/IFNXSUdfUHl0aG9uX3N0cl9Bc0NoYXIoc3RyKSA6IDA7CisgICAgICAgIGlmIChjc3RyKSB7CisgICAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgImEgJyVzJyBpcyBleHBlY3RlZCwgJyVzKCVzKScgaXMgcmVjZWl2ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBvdHlwZSwgY3N0cik7CisgICAgICAgICAgU1dJR19QeXRob25fc3RyX0RlbEZvclB5Myhjc3RyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYSAnJXMnIGlzIGV4cGVjdGVkLCAnJXMnIGlzIHJlY2VpdmVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgb3R5cGUpOworICAgICAgICB9CisgICAgICAgIFB5X1hERUNSRUYoc3RyKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiYSAnJXMnIGlzIGV4cGVjdGVkIiwgdHlwZSk7CisgIH0gZWxzZSB7CisgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgInVuZXhwZWN0ZWQgdHlwZSBpcyByZWNlaXZlZCIpOworICB9Cit9CisKKworLyogQ29udmVydCBhIHBvaW50ZXIgdmFsdWUsIHNpZ25hbCBhbiBleGNlcHRpb24gb24gYSB0eXBlIG1pc21hdGNoICovCitTV0lHUlVOVElNRSB2b2lkICoKK1NXSUdfUHl0aG9uX011c3RHZXRQdHIoUHlPYmplY3QgKm9iaiwgc3dpZ190eXBlX2luZm8gKnR5LCBpbnQgU1dJR1VOVVNFRFBBUk0oYXJnbnVtKSwgaW50IGZsYWdzKSB7CisgIHZvaWQgKnJlc3VsdDsKKyAgaWYgKFNXSUdfUHl0aG9uX0NvbnZlcnRQdHIob2JqLCAmcmVzdWx0LCB0eSwgZmxhZ3MpID09IC0xKSB7CisgICAgUHlFcnJfQ2xlYXIoKTsKKyNpZiBTV0lHX1BPSU5URVJfRVhDRVBUSU9OCisgICAgaWYgKGZsYWdzKSB7CisgICAgICBTV0lHX1B5dGhvbl9UeXBlRXJyb3IoU1dJR19UeXBlUHJldHR5TmFtZSh0eSksIG9iaik7CisgICAgICBTV0lHX1B5dGhvbl9BcmdGYWlsKGFyZ251bSk7CisgICAgfQorI2VuZGlmCisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworU1dJR1JVTlRJTUUgaW50CitTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0cihQeU9iamVjdCAqb2JqLCBQeU9iamVjdCAqbmFtZSwgUHlPYmplY3QgKnZhbHVlKSB7CisgIFB5VHlwZU9iamVjdCAqdHAgPSBvYmotPm9iX3R5cGU7CisgIFB5T2JqZWN0ICpkZXNjcjsKKyAgUHlPYmplY3QgKmVuY29kZWRfbmFtZTsKKyAgZGVzY3JzZXRmdW5jIGY7CisgIGludCByZXM7CisKKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisgIGlmIChQeVN0cmluZ19DaGVjayhuYW1lKSkgeworICAgIG5hbWUgPSBQeVVuaWNvZGVfRGVjb2RlKFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpLCBQeVN0cmluZ19TaXplKG5hbWUpLCBOVUxMLCBOVUxMKTsKKyAgICBpZiAoIW5hbWUpCisgICAgICByZXR1cm4gLTE7CisgIH0gZWxzZSBpZiAoIVB5VW5pY29kZV9DaGVjayhuYW1lKSkKKyNlbHNlCisgIGlmICghUHlTdHJpbmdfQ2hlY2sobmFtZSkpCisjZW5kaWYKKyAgeworICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwgbmFtZS0+b2JfdHlwZS0+dHBfbmFtZSk7CisgICAgcmV0dXJuIC0xOworICB9IGVsc2UgeworICAgIFB5X0lOQ1JFRihuYW1lKTsKKyAgfQorCisgIGlmICghdHAtPnRwX2RpY3QpIHsKKyAgICBpZiAoUHlUeXBlX1JlYWR5KHRwKSA8IDApCisgICAgICBnb3RvIGRvbmU7CisgIH0KKworICByZXMgPSAtMTsKKyAgZGVzY3IgPSBfUHlUeXBlX0xvb2t1cCh0cCwgbmFtZSk7CisgIGYgPSBOVUxMOworICBpZiAoZGVzY3IgIT0gTlVMTCkKKyAgICBmID0gZGVzY3ItPm9iX3R5cGUtPnRwX2Rlc2NyX3NldDsKKyAgaWYgKCFmKSB7CisgICAgaWYgKFB5U3RyaW5nX0NoZWNrKG5hbWUpKSB7CisgICAgICBlbmNvZGVkX25hbWUgPSBuYW1lOworICAgICAgUHlfSU5DUkVGKG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBlbmNvZGVkX25hbWUgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKG5hbWUpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS4yMDBzJyIsIHRwLT50cF9uYW1lLCBQeVN0cmluZ19Bc1N0cmluZyhlbmNvZGVkX25hbWUpKTsKKyAgICBQeV9ERUNSRUYoZW5jb2RlZF9uYW1lKTsKKyAgfSBlbHNlIHsKKyAgICByZXMgPSBmKGRlc2NyLCBvYmosIHZhbHVlKTsKKyAgfQorCisgIGRvbmU6CisgIFB5X0RFQ1JFRihuYW1lKTsKKyAgcmV0dXJuIHJlczsKK30KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKworI2RlZmluZSBTV0lHX2V4Y2VwdGlvbl9mYWlsKGNvZGUsIG1zZykgZG8geyBTV0lHX0Vycm9yKGNvZGUsIG1zZyk7IFNXSUdfZmFpbDsgfSB3aGlsZSgwKQorCisjZGVmaW5lIFNXSUdfY29udHJhY3RfYXNzZXJ0KGV4cHIsIG1zZykgaWYgKCEoZXhwcikpIHsgU1dJR19FcnJvcihTV0lHX1J1bnRpbWVFcnJvciwgbXNnKTsgU1dJR19mYWlsOyB9IGVsc2UKKworCisKKyAgI2RlZmluZSBTV0lHX2V4Y2VwdGlvbihjb2RlLCBtc2cpIGRvIHsgU1dJR19FcnJvcihjb2RlLCBtc2cpOyBTV0lHX2ZhaWw7OyB9IHdoaWxlKDApCisKKworLyogLS0tLS0tLS0gVFlQRVMgVEFCTEUgKEJFR0lOKSAtLS0tLS0tLSAqLworCisjZGVmaW5lIFNXSUdUWVBFX3BfY2hhciBzd2lnX3R5cGVzWzBdCisjZGVmaW5lIFNXSUdUWVBFX3BfaW50IHN3aWdfdHlwZXNbMV0KKyNkZWZpbmUgU1dJR1RZUEVfcF91aW50OF90IHN3aWdfdHlwZXNbMl0KK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyAqc3dpZ190eXBlc1s0XTsKK3N0YXRpYyBzd2lnX21vZHVsZV9pbmZvIHN3aWdfbW9kdWxlID0ge3N3aWdfdHlwZXMsIDMsIDAsIDAsIDAsIDB9OworI2RlZmluZSBTV0lHX1R5cGVRdWVyeShuYW1lKSBTV0lHX1R5cGVRdWVyeU1vZHVsZSgmc3dpZ19tb2R1bGUsICZzd2lnX21vZHVsZSwgbmFtZSkKKyNkZWZpbmUgU1dJR19NYW5nbGVkVHlwZVF1ZXJ5KG5hbWUpIFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZSgmc3dpZ19tb2R1bGUsICZzd2lnX21vZHVsZSwgbmFtZSkKKworLyogLS0tLS0tLS0gVFlQRVMgVEFCTEUgKEVORCkgLS0tLS0tLS0gKi8KKworI2lmIChQWV9WRVJTSU9OX0hFWCA8PSAweDAyMDAwMDAwKQorIyBpZiAhZGVmaW5lZChTV0lHX1BZVEhPTl9DTEFTU0lDKQorIyAgZXJyb3IgIlRoaXMgcHl0aG9uIHZlcnNpb24gcmVxdWlyZXMgc3dpZyB0byBiZSBydW4gd2l0aCB0aGUgJy1jbGFzc2ljJyBvcHRpb24iCisjIGVuZGlmCisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICBAKHRhcmdldCk6PSBfbGlid2VicC5zbworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyMgIGRlZmluZSBTV0lHX2luaXQgICAgUHlJbml0X19saWJ3ZWJwCisKKyNlbHNlCisjICBkZWZpbmUgU1dJR19pbml0ICAgIGluaXRfbGlid2VicAorCisjZW5kaWYKKyNkZWZpbmUgU1dJR19uYW1lICAgICJfbGlid2VicCIKKworI2RlZmluZSBTV0lHVkVSU0lPTiAweDAyMDAwNAorI2RlZmluZSBTV0lHX1ZFUlNJT04gU1dJR1ZFUlNJT04KKworCisjZGVmaW5lIFNXSUdfYXNfdm9pZHB0cihhKSAodm9pZCAqKSgoY29uc3Qgdm9pZCAqKShhKSkKKyNkZWZpbmUgU1dJR19hc192b2lkcHRycHRyKGEpICgodm9pZClTV0lHX2FzX3ZvaWRwdHIoKmEpLCh2b2lkKiopKGEpKQorCisKKyAgI2RlZmluZSBTV0lHX0Zyb21fbG9uZyAgIFB5SW50X0Zyb21Mb25nCisKKworU1dJR0lOVEVSTklOTElORSBQeU9iamVjdCAqCitTV0lHX0Zyb21faW50ICAoaW50IHZhbHVlKQoreworICByZXR1cm4gU1dJR19Gcm9tX2xvbmcgICh2YWx1ZSk7Cit9CisKKworU1dJR0lOVEVSTiBzd2lnX3R5cGVfaW5mbyoKK1NXSUdfcGNoYXJfZGVzY3JpcHRvcih2b2lkKQoreworICBzdGF0aWMgaW50IGluaXQgPSAwOworICBzdGF0aWMgc3dpZ190eXBlX2luZm8qIGluZm8gPSAwOworICBpZiAoIWluaXQpIHsKKyAgICBpbmZvID0gU1dJR19UeXBlUXVlcnkoIl9wX2NoYXIiKTsKKyAgICBpbml0ID0gMTsKKyAgfQorICByZXR1cm4gaW5mbzsKK30KKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc0NoYXJQdHJBbmRTaXplKFB5T2JqZWN0ICpvYmosIGNoYXIqKiBjcHRyLCBzaXplX3QqIHBzaXplLCBpbnQgKmFsbG9jKQoreworI2lmIFBZX1ZFUlNJT05fSEVYPj0weDAzMDAwMDAwCisgIGlmIChQeVVuaWNvZGVfQ2hlY2sob2JqKSkKKyNlbHNlCisgIGlmIChQeVN0cmluZ19DaGVjayhvYmopKQorI2VuZGlmCisgIHsKKyAgICBjaGFyICpjc3RyOyBQeV9zc2l6ZV90IGxlbjsKKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgIGlmICghYWxsb2MgJiYgY3B0cikgeworICAgICAgICAvKiBXZSBjYW4ndCBhbGxvdyBjb252ZXJ0aW5nIHdpdGhvdXQgYWxsb2NhdGlvbiwgc2luY2UgdGhlIGludGVybmFsCisgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIG9mIHN0cmluZyBpbiBQeXRob24gMyBpcyBVQ1MtMi9VQ1MtNCBidXQgd2UgcmVxdWlyZQorICAgICAgICAgICBhIFVURi04IHJlcHJlc2VudGF0aW9uLgorICAgICAgICAgICBUT0RPKGJoeSkgTW9yZSBkZXRhaWxlZCBleHBsYW5hdGlvbiAqLworICAgICAgICByZXR1cm4gU1dJR19SdW50aW1lRXJyb3I7CisgICAgfQorICAgIG9iaiA9IFB5VW5pY29kZV9Bc1VURjhTdHJpbmcob2JqKTsKKyAgICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYmosICZjc3RyLCAmbGVuKTsKKyAgICBpZihhbGxvYykgKmFsbG9jID0gU1dJR19ORVdPQko7CisjZWxzZQorICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYmosICZjc3RyLCAmbGVuKTsKKyNlbmRpZgorICAgIGlmIChjcHRyKSB7CisgICAgICBpZiAoYWxsb2MpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgSW4gcHl0aG9uIHRoZSB1c2VyIHNob3VsZCBub3QgYmUgYWJsZSB0byBtb2RpZnkgdGhlIGlubmVyCisgICAgICAgICAgIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVG8gd2FycmFudHkgdGhhdCwgaWYgeW91IGRlZmluZQorICAgICAgICAgICBTV0lHX1BZVEhPTl9TQUZFX0NTVFJJTkdTLCBhIG5ldy9jb3B5IG9mIHRoZSBweXRob24gc3RyaW5nCisgICAgICAgICAgIGJ1ZmZlciBpcyBhbHdheXMgcmV0dXJuZWQuCisKKyAgICAgICAgICAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMganVzdCB0byByZXR1cm4gdGhlIHBvaW50ZXIgdmFsdWUsCisgICAgICAgICAgIHNvLCBiZSBjYXJlZnVsLgorICAgICAgICAqLworI2lmIGRlZmluZWQoU1dJR19QWVRIT05fU0FGRV9DU1RSSU5HUykKKyAgICAgICAgaWYgKCphbGxvYyAhPSBTV0lHX09MRE9CSikKKyNlbHNlCisgICAgICAgIGlmICgqYWxsb2MgPT0gU1dJR19ORVdPQkopCisjZW5kaWYKKyAgICAgICAgICB7CisgICAgICAgICAgICAqY3B0ciA9IChjaGFyICopbWVtY3B5KChjaGFyICopbWFsbG9jKChsZW4gKyAxKSpzaXplb2YoY2hhcikpLCBjc3RyLCBzaXplb2YoY2hhcikqKGxlbiArIDEpKTsKKyAgICAgICAgICAgICphbGxvYyA9IFNXSUdfTkVXT0JKOworICAgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgKmNwdHIgPSBjc3RyOworICAgICAgICAgICphbGxvYyA9IFNXSUdfT0xET0JKOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAjaWYgUFlfVkVSU0lPTl9IRVg+PTB4MDMwMDAwMDAKKyAgICAgICAgYXNzZXJ0KDApOyAvKiBTaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSBpbiBQeXRob24gMyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgKmNwdHIgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKG9iaik7CisgICAgICB9CisgICAgfQorICAgIGlmIChwc2l6ZSkgKnBzaXplID0gbGVuICsgMTsKKyNpZiBQWV9WRVJTSU9OX0hFWD49MHgwMzAwMDAwMAorICAgIFB5X1hERUNSRUYob2JqKTsKKyNlbmRpZgorICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgeworICAgIHN3aWdfdHlwZV9pbmZvKiBwY2hhcl9kZXNjcmlwdG9yID0gU1dJR19wY2hhcl9kZXNjcmlwdG9yKCk7CisgICAgaWYgKHBjaGFyX2Rlc2NyaXB0b3IpIHsKKyAgICAgIHZvaWQqIHZwdHIgPSAwOworICAgICAgaWYgKFNXSUdfQ29udmVydFB0cihvYmosICZ2cHRyLCBwY2hhcl9kZXNjcmlwdG9yLCAwKSA9PSBTV0lHX09LKSB7CisgICAgICAgIGlmIChjcHRyKSAqY3B0ciA9IChjaGFyICopIHZwdHI7CisgICAgICAgIGlmIChwc2l6ZSkgKnBzaXplID0gdnB0ciA/IChzdHJsZW4oKGNoYXIgKil2cHRyKSArIDEpIDogMDsKKyAgICAgICAgaWYgKGFsbG9jKSAqYWxsb2MgPSBTV0lHX09MRE9CSjsKKyAgICAgICAgcmV0dXJuIFNXSUdfT0s7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBTV0lHX1R5cGVFcnJvcjsKK30KKworCitTV0lHSU5URVJOIGludAorU1dJR19Bc1ZhbF9kb3VibGUgKFB5T2JqZWN0ICpvYmosIGRvdWJsZSAqdmFsKQoreworICBpbnQgcmVzID0gU1dJR19UeXBlRXJyb3I7CisgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOworICAgIHJldHVybiBTV0lHX09LOworICB9IGVsc2UgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICBkb3VibGUgdiA9IFB5TG9uZ19Bc0RvdWJsZShvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgIH0KKyNpZmRlZiBTV0lHX1BZVEhPTl9DQVNUX01PREUKKyAgeworICAgIGludCBkaXNwYXRjaCA9IDA7CisgICAgZG91YmxlIGQgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gZDsKKyAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gpIHsKKyAgICAgIGxvbmcgdiA9IFB5TG9uZ19Bc0xvbmcob2JqKTsKKyAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX0FkZENhc3QoU1dJR19PSykpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gcmVzOworfQorCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisKKyNpbmNsdWRlIDxtYXRoLmg+CisKKworU1dJR0lOVEVSTklOTElORSBpbnQKK1NXSUdfQ2FuQ2FzdEFzSW50ZWdlcihkb3VibGUgKmQsIGRvdWJsZSBtaW4sIGRvdWJsZSBtYXgpIHsKKyAgZG91YmxlIHggPSAqZDsKKyAgaWYgKChtaW4gPD0geCAmJiB4IDw9IG1heCkpIHsKKyAgIGRvdWJsZSBmeCA9IGZsb29yKHgpOworICAgZG91YmxlIGN4ID0gY2VpbCh4KTsKKyAgIGRvdWJsZSByZCA9ICAoKHggLSBmeCkgPCAwLjUpID8gZnggOiBjeDsgLyogc2ltcGxlIHJpbnQgKi8KKyAgIGlmICgoZXJybm8gPT0gRURPTSkgfHwgKGVycm5vID09IEVSQU5HRSkpIHsKKyAgICAgZXJybm8gPSAwOworICAgfSBlbHNlIHsKKyAgICAgZG91YmxlIHN1bW0sIHJlcHMsIGRpZmY7CisgICAgIGlmIChyZCA8IHgpIHsKKyAgICAgICBkaWZmID0geCAtIHJkOworICAgICB9IGVsc2UgaWYgKHJkID4geCkgeworICAgICAgIGRpZmYgPSByZCAtIHg7CisgICAgIH0gZWxzZSB7CisgICAgICAgcmV0dXJuIDE7CisgICAgIH0KKyAgICAgc3VtbSA9IHJkICsgeDsKKyAgICAgcmVwcyA9IGRpZmYvc3VtbTsKKyAgICAgaWYgKHJlcHMgPCA4KkRCTF9FUFNJTE9OKSB7CisgICAgICAgKmQgPSByZDsKKyAgICAgICByZXR1cm4gMTsKKyAgICAgfQorICAgfQorICB9CisgIHJldHVybiAwOworfQorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX3Vuc2lnbmVkX1NTX2xvbmcgKFB5T2JqZWN0ICpvYmosIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKyAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcob2JqKTsKKyAgICBpZiAodiA+PSAwKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX09LOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0KKyAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2sob2JqKSkgeworICAgIHVuc2lnbmVkIGxvbmcgdiA9IFB5TG9uZ19Bc1Vuc2lnbmVkTG9uZyhvYmopOworICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgeworICAgICAgaWYgKHZhbCkgKnZhbCA9IHY7CisgICAgICByZXR1cm4gU1dJR19PSzsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgIH0KKyNpZmRlZiBTV0lHX1BZVEhPTl9DQVNUX01PREUKKyAgeworICAgIGludCBkaXNwYXRjaCA9IDA7CisgICAgdW5zaWduZWQgbG9uZyB2ID0gUHlMb25nX0FzVW5zaWduZWRMb25nKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CisgICAgfSBlbHNlIHsKKyAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgfQorICAgIGlmICghZGlzcGF0Y2gpIHsKKyAgICAgIGRvdWJsZSBkOworICAgICAgaW50IHJlcyA9IFNXSUdfQWRkQ2FzdChTV0lHX0FzVmFsX2RvdWJsZSAob2JqLCZkKSk7CisgICAgICBpZiAoU1dJR19Jc09LKHJlcykgJiYgU1dJR19DYW5DYXN0QXNJbnRlZ2VyKCZkLCAwLCBVTE9OR19NQVgpKSB7CisgICAgICAgIGlmICh2YWwpICp2YWwgPSAodW5zaWduZWQgbG9uZykoZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgfQorICB9CisjZW5kaWYKKyAgcmV0dXJuIFNXSUdfVHlwZUVycm9yOworfQorCisKK1NXSUdJTlRFUk5JTkxJTkUgaW50CitTV0lHX0FzVmFsX3NpemVfdCAoUHlPYmplY3QgKiBvYmosIHNpemVfdCAqdmFsKQoreworICB1bnNpZ25lZCBsb25nIHY7CisgIGludCByZXMgPSBTV0lHX0FzVmFsX3Vuc2lnbmVkX1NTX2xvbmcgKG9iaiwgdmFsID8gJnYgOiAwKTsKKyAgaWYgKFNXSUdfSXNPSyhyZXMpICYmIHZhbCkgKnZhbCA9IChzaXplX3QpKHYpOworICByZXR1cm4gcmVzOworfQorCisKKyNpbmNsdWRlICJ3ZWJwL2RlY29kZS5oIgorI2luY2x1ZGUgIndlYnAvZW5jb2RlLmgiCisKKworc3RhdGljIHNpemVfdCBSZXR1cm5lZEJ1ZmZlclNpemUoCisgICAgY29uc3QgY2hhciogZnVuY3Rpb24sIGludCogd2lkdGgsIGludCogaGVpZ2h0KSB7CisgIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2l6ZW1hcCB7CisgICAgY29uc3QgY2hhciogZnVuY3Rpb247CisgICAgaW50IHNpemVfbXVsdGlwbGllcjsKKyAgfSBzaXplX21hcFtdID0geworI2lmZGVmIFNXSUdKQVZBCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlUkdCIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfV2ViUERlY29kZUFSR0IiLCA0IH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV9XZWJQRGVjb2RlQkdSIiwgIDMgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX1dlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIkphdmFfY29tX2dvb2dsZV93ZWJwX2xpYndlYnBKTklfd3JhcF8xV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJKYXZhX2NvbV9nb29nbGVfd2VicF9saWJ3ZWJwSk5JX3dyYXBfMVdlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAiSmF2YV9jb21fZ29vZ2xlX3dlYnBfbGlid2VicEpOSV93cmFwXzFXZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisjaWZkZWYgU1dJR1BZVEhPTgorICAgIHsgIldlYlBEZWNvZGVSR0IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVSR0JBIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVBUkdCIiwgNCB9LAorICAgIHsgIldlYlBEZWNvZGVCR1IiLCAgMyB9LAorICAgIHsgIldlYlBEZWNvZGVCR1JBIiwgNCB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZVJHQiIsICAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiwgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUJHUkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0IiLCAgMSB9LAorICAgIHsgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSIiwgIDEgfSwKKyAgICB7ICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCAxIH0sCisgICAgeyAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiwgMSB9LAorI2VuZGlmCisgICAgeyBOVUxMLCAwIH0KKyAgfTsKKyAgY29uc3Qgc3RydWN0IHNpemVtYXAqIHA7CisgIHNpemVfdCBzaXplID0gMDsKKworICBmb3IgKHAgPSBzaXplX21hcDsgcC0+ZnVuY3Rpb247ICsrcCkgeworICAgIGlmICghc3RyY21wKGZ1bmN0aW9uLCBwLT5mdW5jdGlvbikpIHsKKyAgICAgIHNpemUgPSAqd2lkdGggKiAqaGVpZ2h0ICogcC0+c2l6ZV9tdWx0aXBsaWVyOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHNpemU7Cit9CisKKwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlRnVuY3Rpb24pKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcXVhbGl0eV9mYWN0b3IsIHVpbnQ4X3QqKiBvdXRwdXQpOwordHlwZWRlZiBzaXplX3QgKCpXZWJQRW5jb2RlTG9zc2xlc3NGdW5jdGlvbikoY29uc3QgdWludDhfdCogcmdiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCoqIG91dHB1dCk7CisKK3N0YXRpYyB1aW50OF90KiBFbmNvZGVMb3NzeShjb25zdCB1aW50OF90KiByZ2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHF1YWxpdHlfZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBFbmNvZGVGdW5jdGlvbiBlbmNmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dHB1dF9zaXplLCBpbnQqIHVudXNlZCkgeworICB1aW50OF90KiBvdXRwdXQgPSBOVUxMOworICBjb25zdCBzaXplX3QgaW1hZ2Vfc2l6ZSA9CisgICAgICBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICZvdXRwdXQpOworICAvLyB0aGUgdmFsdWVzIG9mIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieSBSZXR1cm5lZEJ1ZmZlclNpemUoKQorICAvLyBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworc3RhdGljIHVpbnQ4X3QqIEVuY29kZUxvc3NsZXNzKGNvbnN0IHVpbnQ4X3QqIHJnYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViUEVuY29kZUxvc3NsZXNzRnVuY3Rpb24gZW5jZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfc2l6ZSwgaW50KiB1bnVzZWQpIHsKKyAgdWludDhfdCogb3V0cHV0ID0gTlVMTDsKKyAgY29uc3Qgc2l6ZV90IGltYWdlX3NpemUgPSBlbmNmbihyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgJm91dHB1dCk7CisgIC8vIHRoZSB2YWx1ZXMgb2YgdGhlIGZvbGxvd2luZyB0d28gd2lsbCBiZSBpbnRlcnByZXRlZCBieQorICAvLyBSZXR1cm5lZEJ1ZmZlclNpemUoKSBhcyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBpbiB0aGUgc2l6ZSBjYWxjdWxhdGlvbi4KKyAgKm91dHB1dF9zaXplID0gaW1hZ2Vfc2l6ZTsKKyAgKnVudXNlZCA9IDE7CisgIHJldHVybiBpbWFnZV9zaXplID8gb3V0cHV0IDogTlVMTDsKK30KKworCisvLyBDaGFuZ2VzIHRoZSByZXR1cm4gdHlwZSBvZiBXZWJQRW5jb2RlKiB0byBtb3JlIGNsb3NlbHkgbWF0Y2ggRGVjb2RlKi4KKy8vIFRoaXMgYWxzbyBtYWtlcyBpdCBlYXNpZXIgdG8gd3JhcCB0aGUgb3V0cHV0IGJ1ZmZlciBpbiBhIG5hdGl2ZSB0eXBlIHJhdGhlcgorLy8gdGhhbiBkZWFsaW5nIHdpdGggdGhlIHJldHVybiBwb2ludGVyLgorLy8gVGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdG8gYWxsb3cgcmV1c2Ugb2YgUmV0dXJuZWRCdWZmZXJTaXplKCksCisvLyB1bnVzZWQyIGFuZCBvdXRwdXRfc2l6ZSB3aWxsIGJlIHVzZWQgaW4gdGhpcyBjYXNlLgorI2RlZmluZSBMT1NTWV9XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCBmbG9hdCBxdWFsaXR5X2ZhY3RvcikgeyAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzeShyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgcXVhbGl0eV9mYWN0b3IsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVCR1IpCitMT1NTWV9XUkFQUEVSKFdlYlBFbmNvZGVSR0JBKQorTE9TU1lfV1JBUFBFUihXZWJQRW5jb2RlQkdSQSkKKworI3VuZGVmIExPU1NZX1dSQVBQRVIKKworI2RlZmluZSBMT1NTTEVTU19XUkFQUEVSKEZVTkMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdWludDhfdCogd3JhcF8jI0ZVTkMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWludDhfdCogcmdiLCBpbnQqIHVudXNlZDEsIGludCogdW51c2VkMiwgaW50KiBvdXRwdXRfc2l6ZSwgXAorICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFbmNvZGVMb3NzbGVzcyhyZ2IsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBGVU5DLCBvdXRwdXRfc2l6ZSwgdW51c2VkMik7ICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCitMT1NTTEVTU19XUkFQUEVSKFdlYlBFbmNvZGVMb3NzbGVzc1JHQikKK0xPU1NMRVNTX1dSQVBQRVIoV2ViUEVuY29kZUxvc3NsZXNzQkdSKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NSR0JBKQorTE9TU0xFU1NfV1JBUFBFUihXZWJQRW5jb2RlTG9zc2xlc3NCR1JBKQorCisjdW5kZWYgTE9TU0xFU1NfV1JBUFBFUgorCisKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmICFkZWZpbmVkKFNXSUdfTk9fTExPTkdfTUFYKQorIyBpZiAhZGVmaW5lZChMTE9OR19NQVgpICYmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQgKF9fTE9OR19MT05HX01BWF9fKQorIyAgIGRlZmluZSBMTE9OR19NQVggX19MT05HX0xPTkdfTUFYX18KKyMgICBkZWZpbmUgTExPTkdfTUlOICgtTExPTkdfTUFYIC0gMUxMKQorIyAgIGRlZmluZSBVTExPTkdfTUFYIChMTE9OR19NQVggKiAyVUxMICsgMVVMTCkKKyMgZW5kaWYKKyNlbmRpZgorCisKK1NXSUdJTlRFUk4gaW50CitTV0lHX0FzVmFsX2xvbmcgKFB5T2JqZWN0ICpvYmosIGxvbmcqIHZhbCkKK3sKKyAgaWYgKFB5SW50X0NoZWNrKG9iaikpIHsKKyAgICBpZiAodmFsKSAqdmFsID0gUHlJbnRfQXNMb25nKG9iaik7CisgICAgcmV0dXJuIFNXSUdfT0s7CisgIH0gZWxzZSBpZiAoUHlMb25nX0NoZWNrKG9iaikpIHsKKyAgICBsb25nIHYgPSBQeUxvbmdfQXNMb25nKG9iaik7CisgICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gdjsKKyAgICAgIHJldHVybiBTV0lHX09LOworICAgIH0gZWxzZSB7CisgICAgICBQeUVycl9DbGVhcigpOworICAgIH0KKyAgfQorI2lmZGVmIFNXSUdfUFlUSE9OX0NBU1RfTU9ERQorICB7CisgICAgaW50IGRpc3BhdGNoID0gMDsKKyAgICBsb25nIHYgPSBQeUludF9Bc0xvbmcob2JqKTsKKyAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgIGlmICh2YWwpICp2YWwgPSB2OworICAgICAgcmV0dXJuIFNXSUdfQWRkQ2FzdChTV0lHX09LKTsKKyAgICB9IGVsc2UgeworICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICB9CisgICAgaWYgKCFkaXNwYXRjaCkgeworICAgICAgZG91YmxlIGQ7CisgICAgICBpbnQgcmVzID0gU1dJR19BZGRDYXN0KFNXSUdfQXNWYWxfZG91YmxlIChvYmosJmQpKTsKKyAgICAgIGlmIChTV0lHX0lzT0socmVzKSAmJiBTV0lHX0NhbkNhc3RBc0ludGVnZXIoJmQsIExPTkdfTUlOLCBMT05HX01BWCkpIHsKKyAgICAgICAgaWYgKHZhbCkgKnZhbCA9IChsb25nKShkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgIH0KKyAgICB9CisgIH0KKyNlbmRpZgorICByZXR1cm4gU1dJR19UeXBlRXJyb3I7Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNWYWxfaW50IChQeU9iamVjdCAqIG9iaiwgaW50ICp2YWwpCit7CisgIGxvbmcgdjsKKyAgaW50IHJlcyA9IFNXSUdfQXNWYWxfbG9uZyAob2JqLCAmdik7CisgIGlmIChTV0lHX0lzT0socmVzKSkgeworICAgIGlmICgodiA8IElOVF9NSU4gfHwgdiA+IElOVF9NQVgpKSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gKGludCkodik7CisgICAgfQorICB9CisgIHJldHVybiByZXM7Cit9CisKKworU1dJR0lOVEVSTiBpbnQKK1NXSUdfQXNWYWxfZmxvYXQgKFB5T2JqZWN0ICogb2JqLCBmbG9hdCAqdmFsKQoreworICBkb3VibGUgdjsKKyAgaW50IHJlcyA9IFNXSUdfQXNWYWxfZG91YmxlIChvYmosICZ2KTsKKyAgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CisgICAgaWYgKCh2IDwgLUZMVF9NQVggfHwgdiA+IEZMVF9NQVgpKSB7CisgICAgICByZXR1cm4gU1dJR19PdmVyZmxvd0Vycm9yOworICAgIH0gZWxzZSB7CisgICAgICBpZiAodmFsKSAqdmFsID0gKGZsb2F0KSh2KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIGludCByZXN1bHQ7CisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiOldlYlBHZXREZWNvZGVyVmVyc2lvbiIpKSBTV0lHX2ZhaWw7CisgIHJlc3VsdCA9IChpbnQpV2ViUEdldERlY29kZXJWZXJzaW9uKCk7CisgIHJlc3VsdG9iaiA9IFNXSUdfRnJvbV9pbnQoKGludCkocmVzdWx0KSk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQR2V0SW5mbyhQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIGludCByZXN1bHQ7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQR2V0SW5mbyIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQR2V0SW5mbyIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAoaW50KVdlYlBHZXRJbmZvKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHJlc3VsdG9iaiA9IFNXSUdfRnJvbV9pbnQoKGludCkocmVzdWx0KSk7CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfV2ViUERlY29kZVJHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZVJHQiIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiMSIiIG9mIHR5cGUgJyIgInVpbnQ4X3QgY29uc3QgKiIiJyIpOworICB9CisgIGFyZzEgPSAodWludDhfdCAqKShidWYxKTsKKyAgYXJnMiA9IChzaXplX3QpKHNpemUxIC0gMSk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopV2ViUERlY29kZVJHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVSR0JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgcmVzMSA7CisgIGNoYXIgKmJ1ZjEgPSAwIDsKKyAgc2l6ZV90IHNpemUxID0gMCA7CisgIGludCBhbGxvYzEgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSBTV0lHX1RNUE9CSiA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQRGVjb2RlUkdCQSIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVSR0JBKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiV2ViUERlY29kZVJHQkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVBUkdCKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgc2l6ZV90IGFyZzIgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgcmVzMSA7CisgIGNoYXIgKmJ1ZjEgPSAwIDsKKyAgc2l6ZV90IHNpemUxID0gMCA7CisgIGludCBhbGxvYzEgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSBTV0lHX1RNUE9CSiA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgdWludDhfdCAqcmVzdWx0ID0gMCA7CisKKyAgYXJnMyA9ICZ0ZW1wMzsKKyAgYXJnNCA9ICZ0ZW1wNDsKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsKGNoYXIgKikiTzpXZWJQRGVjb2RlQVJHQiIsJm9iajApKSBTV0lHX2ZhaWw7CisgIHJlczEgPSBTV0lHX0FzQ2hhclB0ckFuZFNpemUob2JqMCwgJmJ1ZjEsICZzaXplMSwgJmFsbG9jMSk7CisgIGlmICghU1dJR19Jc09LKHJlczEpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKHJlczEpLCAiaW4gbWV0aG9kICciICJXZWJQRGVjb2RlQVJHQiIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVBUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCk7CisgIHsKKyAgICByZXN1bHRvYmogPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKKyAgICAgIChjb25zdCBjaGFyKilyZXN1bHQsCisgICAgICAocmVzdWx0ID09IE5VTEwpID8gMCA6IFJldHVybmVkQnVmZmVyU2l6ZSgiV2ViUERlY29kZUFSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzMykpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnMykpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXMzKSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmczKSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoYWxsb2MxID09IFNXSUdfTkVXT0JKKSBmcmVlKChjaGFyKilidWYxKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX1dlYlBEZWNvZGVCR1IoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBzaXplX3QgYXJnMiA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCByZXMxIDsKKyAgY2hhciAqYnVmMSA9IDAgOworICBzaXplX3Qgc2l6ZTEgPSAwIDsKKyAgaW50IGFsbG9jMSA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmczID0gJnRlbXAzOworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPOldlYlBEZWNvZGVCR1IiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjEiIiBvZiB0eXBlICciICJ1aW50OF90IGNvbnN0ICoiIiciKTsKKyAgfQorICBhcmcxID0gKHVpbnQ4X3QgKikoYnVmMSk7CisgIGFyZzIgPSAoc2l6ZV90KShzaXplMSAtIDEpOworICByZXN1bHQgPSAodWludDhfdCAqKVdlYlBEZWNvZGVCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJXZWJQRGVjb2RlQkdSIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQRGVjb2RlQkdSQShQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIHNpemVfdCBhcmcyIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IHJlczEgOworICBjaGFyICpidWYxID0gMCA7CisgIHNpemVfdCBzaXplMSA9IDAgOworICBpbnQgYWxsb2MxID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gU1dJR19UTVBPQkogOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzMgPSAmdGVtcDM7CisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk86V2ViUERlY29kZUJHUkEiLCZvYmowKSkgU1dJR19mYWlsOworICByZXMxID0gU1dJR19Bc0NoYXJQdHJBbmRTaXplKG9iajAsICZidWYxLCAmc2l6ZTEsICZhbGxvYzEpOworICBpZiAoIVNXSUdfSXNPSyhyZXMxKSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihyZXMxKSwgImluIG1ldGhvZCAnIiAiV2ViUERlY29kZUJHUkEiICInLCBhcmd1bWVudCAiICIxIiIgb2YgdHlwZSAnIiAidWludDhfdCBjb25zdCAqIiInIik7CisgIH0KKyAgYXJnMSA9ICh1aW50OF90ICopKGJ1ZjEpOworICBhcmcyID0gKHNpemVfdCkoc2l6ZTEgLSAxKTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKilXZWJQRGVjb2RlQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIldlYlBEZWNvZGVCR1JBIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczMpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzMpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzMykgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnMyksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgaWYgKGFsbG9jMSA9PSBTV0lHX05FV09CSikgZnJlZSgoY2hhciopYnVmMSk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIGlmIChhbGxvYzEgPT0gU1dJR19ORVdPQkopIGZyZWUoKGNoYXIqKWJ1ZjEpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF9XZWJQR2V0RW5jb2RlclZlcnNpb24oUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgaW50IHJlc3VsdDsKKworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSI6V2ViUEdldEVuY29kZXJWZXJzaW9uIikpIFNXSUdfZmFpbDsKKyAgcmVzdWx0ID0gKGludClXZWJQR2V0RW5jb2RlclZlcnNpb24oKTsKKyAgcmVzdWx0b2JqID0gU1dJR19Gcm9tX2ludCgoaW50KShyZXN1bHQpKTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZVJHQihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBQeV9idWZmZXIgcmdiX2J1ZmZlcjEgOworICBpbnQgdGVtcDIgOworICBpbnQgcmVzMiA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IDAgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHZhbDUgOworICBpbnQgZWNvZGU1ID0gMCA7CisgIGludCB2YWw2IDsKKyAgaW50IGVjb2RlNiA9IDAgOworICBpbnQgdmFsNyA7CisgIGludCBlY29kZTcgPSAwIDsKKyAgZmxvYXQgdmFsOCA7CisgIGludCBlY29kZTggPSAwIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMSA9IDAgOworICBQeU9iamVjdCAqIG9iajIgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmozID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNCA9IDAgOworICBQeU9iamVjdCAqIG9iajUgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo2ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PT086d3JhcF9XZWJQRW5jb2RlUkdCIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVSR0InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0IiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCIiAiJywgYXJndW1lbnQgIiAiOCIiIG9mIHR5cGUgJyIgImZsb2F0IiInIik7CisgIH0KKyAgYXJnOCA9IChmbG9hdCkodmFsOCk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlUkdCKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVSR0IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUJHUihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIGZsb2F0IGFyZzggOworICBQeV9idWZmZXIgcmdiX2J1ZmZlcjEgOworICBpbnQgdGVtcDIgOworICBpbnQgcmVzMiA9IDAgOworICBpbnQgdGVtcDMgOworICBpbnQgcmVzMyA9IDAgOworICBpbnQgdGVtcDQgOworICBpbnQgcmVzNCA9IFNXSUdfVE1QT0JKIDsKKyAgaW50IHZhbDUgOworICBpbnQgZWNvZGU1ID0gMCA7CisgIGludCB2YWw2IDsKKyAgaW50IGVjb2RlNiA9IDAgOworICBpbnQgdmFsNyA7CisgIGludCBlY29kZTcgPSAwIDsKKyAgZmxvYXQgdmFsOCA7CisgIGludCBlY29kZTggPSAwIDsKKyAgUHlPYmplY3QgKiBvYmowID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMSA9IDAgOworICBQeU9iamVjdCAqIG9iajIgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmozID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNCA9IDAgOworICBQeU9iamVjdCAqIG9iajUgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo2ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PT086d3JhcF9XZWJQRW5jb2RlQkdSIiwmb2JqMCwmb2JqMSwmb2JqMiwmb2JqMywmb2JqNCwmb2JqNSwmb2JqNikpIFNXSUdfZmFpbDsKKyAgeworICAgIC8vIE5COiB3aXRoIFB5dGhvbiA8IDIuNiB0aGUgb2xkIHN0eWxlIGJ1ZmZlciBwcm90b2NvbCBtYXkgYmUgdXNlZDoKKyAgICAvLyBQeV9zc2l6ZV90IHVudXNlZDsKKyAgICAvLyBQeU9iamVjdF9Bc1JlYWRCdWZmZXIob2JqMCwgKGNvbnN0IHZvaWQqKikoJmFyZzEpLCAmdW51c2VkKTsKKyAgICBpZiAoIVB5T2JqZWN0X0NoZWNrQnVmZmVyKG9iajApKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVCR1InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiMiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMiA9IChpbnQpKHZhbCk7CisgICAgYXJnMiA9ICZ0ZW1wMjsKKyAgICByZXMyID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczMgPSBTV0lHX0NvbnZlcnRQdHIob2JqMixTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzMpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoyLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1IiICInLCBhcmd1bWVudCAiICI2IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNiA9IChpbnQpKHZhbDYpOworICBlY29kZTcgPSBTV0lHX0FzVmFsX2ludChvYmo1LCAmdmFsNyk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNykpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU3KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSIiAiJywgYXJndW1lbnQgIiAiOCIiIG9mIHR5cGUgJyIgImZsb2F0IiInIik7CisgIH0KKyAgYXJnOCA9IChmbG9hdCkodmFsOCk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlQkdSKCh1aW50OF90IGNvbnN0ICopYXJnMSxhcmcyLGFyZzMsYXJnNCxhcmc1LGFyZzYsYXJnNyxhcmc4KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVCR1IiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZVJHQkEoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZVJHQkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1LCZvYmo2KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZVJHQkEnLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZVJHQkEiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVSR0JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlUkdCQSIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZVJHQkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZVJHQkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUJHUkEoUHlPYmplY3QgKlNXSUdVTlVTRURQQVJNKHNlbGYpLCBQeU9iamVjdCAqYXJncykgeworICBQeU9iamVjdCAqcmVzdWx0b2JqID0gMDsKKyAgdWludDhfdCAqYXJnMSA9ICh1aW50OF90ICopIDAgOworICBpbnQgKmFyZzIgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzMgPSAoaW50ICopIDAgOworICBpbnQgKmFyZzQgPSAoaW50ICopIDAgOworICBpbnQgYXJnNSA7CisgIGludCBhcmc2IDsKKyAgaW50IGFyZzcgOworICBmbG9hdCBhcmc4IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIGZsb2F0IHZhbDggOworICBpbnQgZWNvZGU4ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNiA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT09POndyYXBfV2ViUEVuY29kZUJHUkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1LCZvYmo2KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUkEnLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUJHUkEnLCB1bmFibGUgdG8gZ2V0IGJ1ZmZlciB2aWV3Iik7CisgICAgfQorICAgIGFyZzEgPSAodWludDhfdCAqKXJnYl9idWZmZXIxLmJ1ZjsKKyAgfQorICBpZiAoIShTV0lHX0lzT0soKHJlczIgPSBTV0lHX0NvbnZlcnRQdHIob2JqMSxTV0lHX2FzX3ZvaWRwdHJwdHIoJmFyZzIpLFNXSUdUWVBFX3BfaW50LDApKSkpKSB7CisgICAgaW50IHZhbDsKKyAgICBpbnQgZWNvZGUgPSBTV0lHX0FzVmFsX2ludChvYmoxLCAmdmFsKTsKKyAgICBpZiAoIVNXSUdfSXNPSyhlY29kZSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUJHUkEiICInLCBhcmd1bWVudCAiICI1IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNSA9IChpbnQpKHZhbDUpOworICBlY29kZTYgPSBTV0lHX0FzVmFsX2ludChvYmo0LCAmdmFsNik7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNikpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU2KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVCR1JBIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgZWNvZGU4ID0gU1dJR19Bc1ZhbF9mbG9hdChvYmo2LCAmdmFsOCk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlOCkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU4KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlQkdSQSIgIicsIGFyZ3VtZW50ICIgIjgiIiBvZiB0eXBlICciICJmbG9hdCIiJyIpOworICB9CisgIGFyZzggPSAoZmxvYXQpKHZhbDgpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUJHUkEoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3LGFyZzgpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUJHUkEiLCBhcmczLCBhcmc0KSk7CisgIH0KKyAgaWYgKFNXSUdfSXNUbXBPYmoocmVzNCkpIHsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX0Zyb21faW50KCgqYXJnNCkpKTsKKyAgfSBlbHNlIHsKKyAgICBpbnQgbmV3X2ZsYWdzID0gU1dJR19Jc05ld09iaihyZXM0KSA/IChTV0lHX1BPSU5URVJfT1dOIHwgIDAgKSA6ICAwIDsKKyAgICByZXN1bHRvYmogPSBTV0lHX1B5dGhvbl9BcHBlbmRPdXRwdXQocmVzdWx0b2JqLCBTV0lHX05ld1BvaW50ZXJPYmooKHZvaWQqKShhcmc0KSwgU1dJR1RZUEVfcF9pbnQsIG5ld19mbGFncykpOworICB9CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIGZyZWUocmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdG9iajsKK2ZhaWw6CisgIHsKKyAgICBQeUJ1ZmZlcl9SZWxlYXNlKCZyZ2JfYnVmZmVyMSk7CisgIH0KKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMikpIGZyZWUoKGNoYXIqKWFyZzIpOworICBpZiAoU1dJR19Jc05ld09iaihyZXMzKSkgZnJlZSgoY2hhciopYXJnMyk7CisgIHJldHVybiBOVUxMOworfQorCisKK1NXSUdJTlRFUk4gUHlPYmplY3QgKl93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsJm9iajAsJm9iajEsJm9iajIsJm9iajMsJm9iajQsJm9iajUpKSBTV0lHX2ZhaWw7CisgIHsKKyAgICAvLyBOQjogd2l0aCBQeXRob24gPCAyLjYgdGhlIG9sZCBzdHlsZSBidWZmZXIgcHJvdG9jb2wgbWF5IGJlIHVzZWQ6CisgICAgLy8gUHlfc3NpemVfdCB1bnVzZWQ7CisgICAgLy8gUHlPYmplY3RfQXNSZWFkQnVmZmVyKG9iajAsIChjb25zdCB2b2lkKiopKCZhcmcxKSwgJnVudXNlZCk7CisgICAgaWYgKCFQeU9iamVjdF9DaGVja0J1ZmZlcihvYmowKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0InLCBhcmd1bWVudCAxIgorICAgICAgICAiIGRvZXMgbm90IHN1cHBvcnQgdGhlIGJ1ZmZlciBpbnRlcmZhY2UiKTsKKyAgICB9CisgICAgaWYgKFB5T2JqZWN0X0dldEJ1ZmZlcihvYmowLCAmcmdiX2J1ZmZlcjEsIFB5QlVGX1NJTVBMRSkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19SdW50aW1lRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjIiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDIgPSAoaW50KSh2YWwpOworICAgIGFyZzIgPSAmdGVtcDI7CisgICAgcmVzMiA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMzID0gU1dJR19Db252ZXJ0UHRyKG9iajIsU1dJR19hc192b2lkcHRycHRyKCZhcmczKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMiwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIgIicsIGFyZ3VtZW50ICIgIjMiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgICB9CisgICAgdGVtcDMgPSAoaW50KSh2YWwpOworICAgIGFyZzMgPSAmdGVtcDM7CisgICAgcmVzMyA9IFNXSUdfQWRkVG1wTWFzayhlY29kZSk7CisgIH0KKyAgZWNvZGU1ID0gU1dJR19Bc1ZhbF9pbnQob2JqMywgJnZhbDUpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTUpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNSksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNiIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzYgPSAoaW50KSh2YWw2KTsKKyAgZWNvZGU3ID0gU1dJR19Bc1ZhbF9pbnQob2JqNSwgJnZhbDcpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTcpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNyksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiAiJywgYXJndW1lbnQgIiAiNyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzcgPSAoaW50KSh2YWw3KTsKKyAgcmVzdWx0ID0gKHVpbnQ4X3QgKil3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQigodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCIiwgYXJnMywgYXJnNCkpOworICB9CisgIGlmIChTV0lHX0lzVG1wT2JqKHJlczQpKSB7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19Gcm9tX2ludCgoKmFyZzQpKSk7CisgIH0gZWxzZSB7CisgICAgaW50IG5ld19mbGFncyA9IFNXSUdfSXNOZXdPYmoocmVzNCkgPyAoU1dJR19QT0lOVEVSX09XTiB8ICAwICkgOiAgMCA7CisgICAgcmVzdWx0b2JqID0gU1dJR19QeXRob25fQXBwZW5kT3V0cHV0KHJlc3VsdG9iaiwgU1dJR19OZXdQb2ludGVyT2JqKCh2b2lkKikoYXJnNCksIFNXSUdUWVBFX3BfaW50LCBuZXdfZmxhZ3MpKTsKKyAgfQorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICBmcmVlKHJlc3VsdCk7CisgIHJldHVybiByZXN1bHRvYmo7CitmYWlsOgorICB7CisgICAgUHlCdWZmZXJfUmVsZWFzZSgmcmdiX2J1ZmZlcjEpOworICB9CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczIpKSBmcmVlKChjaGFyKilhcmcyKTsKKyAgaWYgKFNXSUdfSXNOZXdPYmoocmVzMykpIGZyZWUoKGNoYXIqKWFyZzMpOworICByZXR1cm4gTlVMTDsKK30KKworCitTV0lHSU5URVJOIFB5T2JqZWN0ICpfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUihQeU9iamVjdCAqU1dJR1VOVVNFRFBBUk0oc2VsZiksIFB5T2JqZWN0ICphcmdzKSB7CisgIFB5T2JqZWN0ICpyZXN1bHRvYmogPSAwOworICB1aW50OF90ICphcmcxID0gKHVpbnQ4X3QgKikgMCA7CisgIGludCAqYXJnMiA9IChpbnQgKikgMCA7CisgIGludCAqYXJnMyA9IChpbnQgKikgMCA7CisgIGludCAqYXJnNCA9IChpbnQgKikgMCA7CisgIGludCBhcmc1IDsKKyAgaW50IGFyZzYgOworICBpbnQgYXJnNyA7CisgIFB5X2J1ZmZlciByZ2JfYnVmZmVyMSA7CisgIGludCB0ZW1wMiA7CisgIGludCByZXMyID0gMCA7CisgIGludCB0ZW1wMyA7CisgIGludCByZXMzID0gMCA7CisgIGludCB0ZW1wNCA7CisgIGludCByZXM0ID0gU1dJR19UTVBPQkogOworICBpbnQgdmFsNSA7CisgIGludCBlY29kZTUgPSAwIDsKKyAgaW50IHZhbDYgOworICBpbnQgZWNvZGU2ID0gMCA7CisgIGludCB2YWw3IDsKKyAgaW50IGVjb2RlNyA9IDAgOworICBQeU9iamVjdCAqIG9iajAgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoxID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMiA9IDAgOworICBQeU9iamVjdCAqIG9iajMgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo0ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqNSA9IDAgOworICB1aW50OF90ICpyZXN1bHQgPSAwIDsKKworICBhcmc0ID0gJnRlbXA0OworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywoY2hhciAqKSJPT09PT086d3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSJywgYXJndW1lbnQgMSIKKyAgICAgICAgIiBkb2VzIG5vdCBzdXBwb3J0IHRoZSBidWZmZXIgaW50ZXJmYWNlIik7CisgICAgfQorICAgIGlmIChQeU9iamVjdF9HZXRCdWZmZXIob2JqMCwgJnJnYl9idWZmZXIxLCBQeUJVRl9TSU1QTEUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfUnVudGltZUVycm9yLAorICAgICAgICAiaW4gbWV0aG9kICd3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUicsIHVuYWJsZSB0byBnZXQgYnVmZmVyIHZpZXciKTsKKyAgICB9CisgICAgYXJnMSA9ICh1aW50OF90ICopcmdiX2J1ZmZlcjEuYnVmOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMiA9IFNXSUdfQ29udmVydFB0cihvYmoxLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMiksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajEsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IiICInLCBhcmd1bWVudCAiICIzIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAzID0gKGludCkodmFsKTsKKyAgICBhcmczID0gJnRlbXAzOworICAgIHJlczMgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGVjb2RlNSA9IFNXSUdfQXNWYWxfaW50KG9iajMsICZ2YWw1KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU1KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjUiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc1ID0gKGludCkodmFsNSk7CisgIGVjb2RlNiA9IFNXSUdfQXNWYWxfaW50KG9iajQsICZ2YWw2KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU2KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTYpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIgIicsIGFyZ3VtZW50ICIgIjciIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc3ID0gKGludCkodmFsNyk7CisgIHJlc3VsdCA9ICh1aW50OF90ICopd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1IoKHVpbnQ4X3QgY29uc3QgKilhcmcxLGFyZzIsYXJnMyxhcmc0LGFyZzUsYXJnNixhcmc3KTsKKyAgeworICAgIHJlc3VsdG9iaiA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAorICAgICAgKGNvbnN0IGNoYXIqKXJlc3VsdCwKKyAgICAgIChyZXN1bHQgPT0gTlVMTCkgPyAwIDogUmV0dXJuZWRCdWZmZXJTaXplKCJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQScsIGFyZ3VtZW50IDEiCisgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iajAsICZyZ2JfYnVmZmVyMSwgUHlCVUZfU0lNUExFKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiMyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMyA9IChpbnQpKHZhbCk7CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgICByZXMzID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBlY29kZTUgPSBTV0lHX0FzVmFsX2ludChvYmozLCAmdmFsNSk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU1KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NSR0JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiICInLCBhcmd1bWVudCAiICI3IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNyA9IChpbnQpKHZhbDcpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCQSIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworU1dJR0lOVEVSTiBQeU9iamVjdCAqX3dyYXBfd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBKFB5T2JqZWN0ICpTV0lHVU5VU0VEUEFSTShzZWxmKSwgUHlPYmplY3QgKmFyZ3MpIHsKKyAgUHlPYmplY3QgKnJlc3VsdG9iaiA9IDA7CisgIHVpbnQ4X3QgKmFyZzEgPSAodWludDhfdCAqKSAwIDsKKyAgaW50ICphcmcyID0gKGludCAqKSAwIDsKKyAgaW50ICphcmczID0gKGludCAqKSAwIDsKKyAgaW50ICphcmc0ID0gKGludCAqKSAwIDsKKyAgaW50IGFyZzUgOworICBpbnQgYXJnNiA7CisgIGludCBhcmc3IDsKKyAgUHlfYnVmZmVyIHJnYl9idWZmZXIxIDsKKyAgaW50IHRlbXAyIDsKKyAgaW50IHJlczIgPSAwIDsKKyAgaW50IHRlbXAzIDsKKyAgaW50IHJlczMgPSAwIDsKKyAgaW50IHRlbXA0IDsKKyAgaW50IHJlczQgPSBTV0lHX1RNUE9CSiA7CisgIGludCB2YWw1IDsKKyAgaW50IGVjb2RlNSA9IDAgOworICBpbnQgdmFsNiA7CisgIGludCBlY29kZTYgPSAwIDsKKyAgaW50IHZhbDcgOworICBpbnQgZWNvZGU3ID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMCA9IDAgOworICBQeU9iamVjdCAqIG9iajEgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmoyID0gMCA7CisgIFB5T2JqZWN0ICogb2JqMyA9IDAgOworICBQeU9iamVjdCAqIG9iajQgPSAwIDsKKyAgUHlPYmplY3QgKiBvYmo1ID0gMCA7CisgIHVpbnQ4X3QgKnJlc3VsdCA9IDAgOworCisgIGFyZzQgPSAmdGVtcDQ7CisgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLChjaGFyICopIk9PT09PTzp3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiLCZvYmowLCZvYmoxLCZvYmoyLCZvYmozLCZvYmo0LCZvYmo1KSkgU1dJR19mYWlsOworICB7CisgICAgLy8gTkI6IHdpdGggUHl0aG9uIDwgMi42IHRoZSBvbGQgc3R5bGUgYnVmZmVyIHByb3RvY29sIG1heSBiZSB1c2VkOgorICAgIC8vIFB5X3NzaXplX3QgdW51c2VkOworICAgIC8vIFB5T2JqZWN0X0FzUmVhZEJ1ZmZlcihvYmowLCAoY29uc3Qgdm9pZCoqKSgmYXJnMSksICZ1bnVzZWQpOworICAgIGlmICghUHlPYmplY3RfQ2hlY2tCdWZmZXIob2JqMCkpIHsKKyAgICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19UeXBlRXJyb3IsCisgICAgICAgICJpbiBtZXRob2QgJ3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQScsIGFyZ3VtZW50IDEiCisgICAgICAgICIgZG9lcyBub3Qgc3VwcG9ydCB0aGUgYnVmZmVyIGludGVyZmFjZSIpOworICAgIH0KKyAgICBpZiAoUHlPYmplY3RfR2V0QnVmZmVyKG9iajAsICZyZ2JfYnVmZmVyMSwgUHlCVUZfU0lNUExFKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1J1bnRpbWVFcnJvciwKKyAgICAgICAgImluIG1ldGhvZCAnd3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBJywgdW5hYmxlIHRvIGdldCBidWZmZXIgdmlldyIpOworICAgIH0KKyAgICBhcmcxID0gKHVpbnQ4X3QgKilyZ2JfYnVmZmVyMS5idWY7CisgIH0KKyAgaWYgKCEoU1dJR19Jc09LKChyZXMyID0gU1dJR19Db252ZXJ0UHRyKG9iajEsU1dJR19hc192b2lkcHRycHRyKCZhcmcyKSxTV0lHVFlQRV9wX2ludCwwKSkpKSkgeworICAgIGludCB2YWw7CisgICAgaW50IGVjb2RlID0gU1dJR19Bc1ZhbF9pbnQob2JqMSwgJnZhbCk7CisgICAgaWYgKCFTV0lHX0lzT0soZWNvZGUpKSB7CisgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGUpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiICInLCBhcmd1bWVudCAiICIyIiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgICAgfQorICAgIHRlbXAyID0gKGludCkodmFsKTsKKyAgICBhcmcyID0gJnRlbXAyOworICAgIHJlczIgPSBTV0lHX0FkZFRtcE1hc2soZWNvZGUpOworICB9CisgIGlmICghKFNXSUdfSXNPSygocmVzMyA9IFNXSUdfQ29udmVydFB0cihvYmoyLFNXSUdfYXNfdm9pZHB0cnB0cigmYXJnMyksU1dJR1RZUEVfcF9pbnQsMCkpKSkpIHsKKyAgICBpbnQgdmFsOworICAgIGludCBlY29kZSA9IFNXSUdfQXNWYWxfaW50KG9iajIsICZ2YWwpOworICAgIGlmICghU1dJR19Jc09LKGVjb2RlKSkgeworICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlKSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiMyIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICAgIH0KKyAgICB0ZW1wMyA9IChpbnQpKHZhbCk7CisgICAgYXJnMyA9ICZ0ZW1wMzsKKyAgICByZXMzID0gU1dJR19BZGRUbXBNYXNrKGVjb2RlKTsKKyAgfQorICBlY29kZTUgPSBTV0lHX0FzVmFsX2ludChvYmozLCAmdmFsNSk7CisgIGlmICghU1dJR19Jc09LKGVjb2RlNSkpIHsKKyAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfQXJnRXJyb3IoZWNvZGU1KSwgImluIG1ldGhvZCAnIiAid3JhcF9XZWJQRW5jb2RlTG9zc2xlc3NCR1JBIiAiJywgYXJndW1lbnQgIiAiNSIiIG9mIHR5cGUgJyIgImludCIiJyIpOworICB9CisgIGFyZzUgPSAoaW50KSh2YWw1KTsKKyAgZWNvZGU2ID0gU1dJR19Bc1ZhbF9pbnQob2JqNCwgJnZhbDYpOworICBpZiAoIVNXSUdfSXNPSyhlY29kZTYpKSB7CisgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX0FyZ0Vycm9yKGVjb2RlNiksICJpbiBtZXRob2QgJyIgIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIgIicsIGFyZ3VtZW50ICIgIjYiIiBvZiB0eXBlICciICJpbnQiIiciKTsKKyAgfQorICBhcmc2ID0gKGludCkodmFsNik7CisgIGVjb2RlNyA9IFNXSUdfQXNWYWxfaW50KG9iajUsICZ2YWw3KTsKKyAgaWYgKCFTV0lHX0lzT0soZWNvZGU3KSkgeworICAgIFNXSUdfZXhjZXB0aW9uX2ZhaWwoU1dJR19BcmdFcnJvcihlY29kZTcpLCAiaW4gbWV0aG9kICciICJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUkEiICInLCBhcmd1bWVudCAiICI3IiIgb2YgdHlwZSAnIiAiaW50IiInIik7CisgIH0KKyAgYXJnNyA9IChpbnQpKHZhbDcpOworICByZXN1bHQgPSAodWludDhfdCAqKXdyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSgodWludDhfdCBjb25zdCAqKWFyZzEsYXJnMixhcmczLGFyZzQsYXJnNSxhcmc2LGFyZzcpOworICB7CisgICAgcmVzdWx0b2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAoY29uc3QgY2hhciopcmVzdWx0LAorICAgICAgKHJlc3VsdCA9PSBOVUxMKSA/IDAgOiBSZXR1cm5lZEJ1ZmZlclNpemUoIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIGFyZzMsIGFyZzQpKTsKKyAgfQorICBpZiAoU1dJR19Jc1RtcE9iaihyZXM0KSkgeworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfRnJvbV9pbnQoKCphcmc0KSkpOworICB9IGVsc2UgeworICAgIGludCBuZXdfZmxhZ3MgPSBTV0lHX0lzTmV3T2JqKHJlczQpID8gKFNXSUdfUE9JTlRFUl9PV04gfCAgMCApIDogIDAgOworICAgIHJlc3VsdG9iaiA9IFNXSUdfUHl0aG9uX0FwcGVuZE91dHB1dChyZXN1bHRvYmosIFNXSUdfTmV3UG9pbnRlck9iaigodm9pZCopKGFyZzQpLCBTV0lHVFlQRV9wX2ludCwgbmV3X2ZsYWdzKSk7CisgIH0KKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgZnJlZShyZXN1bHQpOworICByZXR1cm4gcmVzdWx0b2JqOworZmFpbDoKKyAgeworICAgIFB5QnVmZmVyX1JlbGVhc2UoJnJnYl9idWZmZXIxKTsKKyAgfQorICBpZiAoU1dJR19Jc05ld09iaihyZXMyKSkgZnJlZSgoY2hhciopYXJnMik7CisgIGlmIChTV0lHX0lzTmV3T2JqKHJlczMpKSBmcmVlKChjaGFyKilhcmczKTsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKworc3RhdGljIFB5TWV0aG9kRGVmIFN3aWdNZXRob2RzW10gPSB7CisgICAgICAgICB7IChjaGFyICopIlNXSUdfUHlJbnN0YW5jZU1ldGhvZF9OZXciLCAoUHlDRnVuY3Rpb24pU1dJR19QeUluc3RhbmNlTWV0aG9kX05ldywgTUVUSF9PLCBOVUxMfSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUEdldERlY29kZXJWZXJzaW9uIiwgX3dyYXBfV2ViUEdldERlY29kZXJWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXREZWNvZGVyVmVyc2lvbigpIC0+IGludCJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQR2V0SW5mbyIsIF93cmFwX1dlYlBHZXRJbmZvLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXRJbmZvKHVpbnQ4X3QgZGF0YSkgLT4gKHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBEZWNvZGVSR0IiLCBfd3JhcF9XZWJQRGVjb2RlUkdCLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVSR0IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlUkdCQSIsIF93cmFwX1dlYlBEZWNvZGVSR0JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVSR0JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUERlY29kZUFSR0IiLCBfd3JhcF9XZWJQRGVjb2RlQVJHQiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJXZWJQRGVjb2RlQVJHQih1aW50OF90IGRhdGEpIC0+IChyZ2IsIHdpZHRoLCBoZWlnaHQpIn0sCisgICAgICAgICB7IChjaGFyICopIldlYlBEZWNvZGVCR1IiLCBfd3JhcF9XZWJQRGVjb2RlQkdSLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVCR1IodWludDhfdCBkYXRhKSAtPiAocmdiLCB3aWR0aCwgaGVpZ2h0KSJ9LAorICAgICAgICAgeyAoY2hhciAqKSJXZWJQRGVjb2RlQkdSQSIsIF93cmFwX1dlYlBEZWNvZGVCR1JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBEZWNvZGVCR1JBKHVpbnQ4X3QgZGF0YSkgLT4gKHJnYiwgd2lkdGgsIGhlaWdodCkifSwKKyAgICAgICAgIHsgKGNoYXIgKikiV2ViUEdldEVuY29kZXJWZXJzaW9uIiwgX3dyYXBfV2ViUEdldEVuY29kZXJWZXJzaW9uLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopIldlYlBHZXRFbmNvZGVyVmVyc2lvbigpIC0+IGludCJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVSR0IiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVSR0IsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUJHUiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUJHUiwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgKGNoYXIgKikid3JhcF9XZWJQRW5jb2RlUkdCQSIsIF93cmFwX3dyYXBfV2ViUEVuY29kZVJHQkEsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUJHUkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVCR1JBLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzUkdCLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc0JHUiIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSLCBNRVRIX1ZBUkFSR1MsIChjaGFyICopInByaXZhdGUsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LiJ9LAorICAgICAgICAgeyAoY2hhciAqKSJ3cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEiLCBfd3JhcF93cmFwX1dlYlBFbmNvZGVMb3NzbGVzc1JHQkEsIE1FVEhfVkFSQVJHUywgKGNoYXIgKikicHJpdmF0ZSwgZG8gbm90IGNhbGwgZGlyZWN0bHkuIn0sCisgICAgICAgICB7IChjaGFyICopIndyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSIsIF93cmFwX3dyYXBfV2ViUEVuY29kZUxvc3NsZXNzQkdSQSwgTUVUSF9WQVJBUkdTLCAoY2hhciAqKSJwcml2YXRlLCBkbyBub3QgY2FsbCBkaXJlY3RseS4ifSwKKyAgICAgICAgIHsgTlVMTCwgTlVMTCwgMCwgTlVMTCB9Cit9OworCisKKy8qIC0tLS0tLS0tIFRZUEUgQ09OVkVSU0lPTiBBTkQgRVFVSVZBTEVOQ0UgUlVMRVMgKEJFR0lOKSAtLS0tLS0tLSAqLworCitzdGF0aWMgc3dpZ190eXBlX2luZm8gX3N3aWd0X19wX2NoYXIgPSB7Il9wX2NoYXIiLCAiY2hhciAqIiwgMCwgMCwgKHZvaWQqKTAsIDB9Oworc3RhdGljIHN3aWdfdHlwZV9pbmZvIF9zd2lndF9fcF9pbnQgPSB7Il9wX2ludCIsICJpbnQgKiIsIDAsIDAsICh2b2lkKikwLCAwfTsKK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyBfc3dpZ3RfX3BfdWludDhfdCA9IHsiX3BfdWludDhfdCIsICJ1aW50OF90ICoiLCAwLCAwLCAodm9pZCopMCwgMH07CisKK3N0YXRpYyBzd2lnX3R5cGVfaW5mbyAqc3dpZ190eXBlX2luaXRpYWxbXSA9IHsKKyAgJl9zd2lndF9fcF9jaGFyLAorICAmX3N3aWd0X19wX2ludCwKKyAgJl9zd2lndF9fcF91aW50OF90LAorfTsKKworc3RhdGljIHN3aWdfY2FzdF9pbmZvIF9zd2lnY19fcF9jaGFyW10gPSB7ICB7Jl9zd2lndF9fcF9jaGFyLCAwLCAwLCAwfSx7MCwgMCwgMCwgMH19Oworc3RhdGljIHN3aWdfY2FzdF9pbmZvIF9zd2lnY19fcF9pbnRbXSA9IHsgIHsmX3N3aWd0X19wX2ludCwgMCwgMCwgMH0sezAsIDAsIDAsIDB9fTsKK3N0YXRpYyBzd2lnX2Nhc3RfaW5mbyBfc3dpZ2NfX3BfdWludDhfdFtdID0geyAgeyZfc3dpZ3RfX3BfdWludDhfdCwgMCwgMCwgMH0sezAsIDAsIDAsIDB9fTsKKworc3RhdGljIHN3aWdfY2FzdF9pbmZvICpzd2lnX2Nhc3RfaW5pdGlhbFtdID0geworICBfc3dpZ2NfX3BfY2hhciwKKyAgX3N3aWdjX19wX2ludCwKKyAgX3N3aWdjX19wX3VpbnQ4X3QsCit9OworCisKKy8qIC0tLS0tLS0tIFRZUEUgQ09OVkVSU0lPTiBBTkQgRVFVSVZBTEVOQ0UgUlVMRVMgKEVORCkgLS0tLS0tLS0gKi8KKworc3RhdGljIHN3aWdfY29uc3RfaW5mbyBzd2lnX2NvbnN0X3RhYmxlW10gPSB7Cit7MCwgMCwgMCwgMC4wLCAwLCAwfX07CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVHlwZSBpbml0aWFsaXphdGlvbjoKKyAqIFRoaXMgcHJvYmxlbSBpcyB0b3VnaCBieSB0aGUgcmVxdWlyZW1lbnQgdGhhdCBubyBkeW5hbWljCisgKiBtZW1vcnkgaXMgdXNlZC4gQWxzbywgc2luY2Ugc3dpZ190eXBlX2luZm8gc3RydWN0dXJlcyBzdG9yZSBwb2ludGVycyB0bworICogc3dpZ19jYXN0X2luZm8gc3RydWN0dXJlcyBhbmQgc3dpZ19jYXN0X2luZm8gc3RydWN0dXJlcyBzdG9yZSBwb2ludGVycyBiYWNrCisgKiB0byBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzLCB3ZSBuZWVkIHNvbWUgbG9va3VwIGNvZGUgYXQgaW5pdGlhbGl6YXRpb24uCisgKiBUaGUgaWRlYSBpcyB0aGF0IHN3aWcgZ2VuZXJhdGVzIGFsbCB0aGUgc3RydWN0dXJlcyB0aGF0IGFyZSBuZWVkZWQuCisgKiBUaGUgcnVudGltZSB0aGVuIGNvbGxlY3RzIHRoZXNlIHBhcnRpYWxseSBmaWxsZWQgc3RydWN0dXJlcy4KKyAqIFRoZSBTV0lHX0luaXRpYWxpemVNb2R1bGUgZnVuY3Rpb24gdGFrZXMgdGhlc2UgaW5pdGlhbCBhcnJheXMgb3V0IG9mCisgKiBzd2lnX21vZHVsZSwgYW5kIGRvZXMgYWxsIHRoZSBsb29rdXAsIGZpbGxpbmcgaW4gdGhlIHN3aWdfbW9kdWxlLnR5cGVzCisgKiBhcnJheSB3aXRoIHRoZSBjb3JyZWN0IGRhdGEgYW5kIGxpbmtpbmcgdGhlIGNvcnJlY3Qgc3dpZ19jYXN0X2luZm8KKyAqIHN0cnVjdHVyZXMgdG9nZXRoZXIuCisgKgorICogVGhlIGdlbmVyYXRlZCBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmVzIGFyZSBhc3NpZ25lZCBzdGF0aWNseSB0byBhbiBpbml0aWFsCisgKiBhcnJheS4gV2UganVzdCBsb29wIHRocm91Z2ggdGhhdCBhcnJheSwgYW5kIGhhbmRsZSBlYWNoIHR5cGUgaW5kaXZpZHVhbGx5LgorICogRmlyc3Qgd2UgbG9va3VwIGlmIHRoaXMgdHlwZSBoYXMgYmVlbiBhbHJlYWR5IGxvYWRlZCwgYW5kIGlmIHNvLCB1c2UgdGhlCisgKiBsb2FkZWQgc3RydWN0dXJlIGluc3RlYWQgb2YgdGhlIGdlbmVyYXRlZCBvbmUuIFRoZW4gd2UgaGF2ZSB0byBmaWxsIGluIHRoZQorICogY2FzdCBsaW5rZWQgbGlzdC4gVGhlIGNhc3QgZGF0YSBpcyBpbml0aWFsbHkgc3RvcmVkIGluIHNvbWV0aGluZyBsaWtlIGEKKyAqIHR3by1kaW1lbnNpb25hbCBhcnJheS4gRWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSB0eXBlICh0aGVyZSBhcmUgdGhlIHNhbWUKKyAqIG51bWJlciBvZiByb3dzIGFzIHRoZXJlIGFyZSBpbiB0aGUgc3dpZ190eXBlX2luaXRpYWwgYXJyYXkpLiBFYWNoIGVudHJ5IGluCisgKiBhIGNvbHVtbiBpcyBvbmUgb2YgdGhlIHN3aWdfY2FzdF9pbmZvIHN0cnVjdHVyZXMgZm9yIHRoYXQgdHlwZS4KKyAqIFRoZSBjYXN0X2luaXRpYWwgYXJyYXkgaXMgYWN0dWFsbHkgYW4gYXJyYXkgb2YgYXJyYXlzLCBiZWNhdXNlIGVhY2ggcm93IGhhcworICogYSB2YXJpYWJsZSBudW1iZXIgb2YgY29sdW1ucy4gU28gdG8gYWN0dWFsbHkgYnVpbGQgdGhlIGNhc3QgbGlua2VkIGxpc3QsCisgKiB3ZSBmaW5kIHRoZSBhcnJheSBvZiBjYXN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIHR5cGUsIGFuZCBsb29wIHRocm91Z2ggaXQKKyAqIGFkZGluZyB0aGUgY2FzdHMgdG8gdGhlIGxpc3QuIFRoZSBvbmUgbGFzdCB0cmljayB3ZSBuZWVkIHRvIGRvIGlzIG1ha2luZworICogc3VyZSB0aGUgdHlwZSBwb2ludGVyIGluIHRoZSBzd2lnX2Nhc3RfaW5mbyBzdHJ1Y3QgaXMgY29ycmVjdC4KKyAqCisgKiBGaXJzdCBvZmYsIHdlIGxvb2t1cCB0aGUgY2FzdC0+dHlwZSBuYW1lIHRvIHNlZSBpZiBpdCBpcyBhbHJlYWR5IGxvYWRlZC4KKyAqIFRoZXJlIGFyZSB0aHJlZSBjYXNlcyB0byBoYW5kbGU6CisgKiAgMSkgSWYgdGhlIGNhc3QtPnR5cGUgaGFzIGFscmVhZHkgYmVlbiBsb2FkZWQgQU5EIHRoZSB0eXBlIHdlIGFyZSBhZGRpbmcKKyAqICAgICBjYXN0aW5nIGluZm8gdG8gaGFzIG5vdCBiZWVuIGxvYWRlZCAoaXQgaXMgaW4gdGhpcyBtb2R1bGUpLCBUSEVOIHdlCisgKiAgICAgcmVwbGFjZSB0aGUgY2FzdC0+dHlwZSBwb2ludGVyIHdpdGggdGhlIHR5cGUgcG9pbnRlciB0aGF0IGhhcyBhbHJlYWR5CisgKiAgICAgYmVlbiBsb2FkZWQuCisgKiAgMikgSWYgQk9USCB0eXBlcyAodGhlIG9uZSB3ZSBhcmUgYWRkaW5nIGNhc3RpbmcgaW5mbyB0bywgYW5kIHRoZQorICogICAgIGNhc3QtPnR5cGUpIGFyZSBsb2FkZWQsIFRIRU4gdGhlIGNhc3QgaW5mbyBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZCBieQorICogICAgIHRoZSBwcmV2aW91cyBtb2R1bGUgc28gd2UganVzdCBpZ25vcmUgaXQuCisgKiAgMykgRmluYWxseSwgaWYgY2FzdC0+dHlwZSBoYXMgbm90IGFscmVhZHkgYmVlbiBsb2FkZWQsIHRoZW4gd2UgYWRkIHRoYXQKKyAqICAgICBzd2lnX2Nhc3RfaW5mbyB0byB0aGUgbGlua2VkIGxpc3QgKGJlY2F1c2UgdGhlIGNhc3QtPnR5cGUpIHBvaW50ZXIgd2lsbAorICogICAgIGJlIGNvcnJlY3QuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2lmIDAKK30gLyogYy1tb2RlICovCisjZW5kaWYKKyNlbmRpZgorCisjaWYgMAorI2RlZmluZSBTV0lHUlVOVElNRV9ERUJVRworI2VuZGlmCisKKworU1dJR1JVTlRJTUUgdm9pZAorU1dJR19Jbml0aWFsaXplTW9kdWxlKHZvaWQgKmNsaWVudGRhdGEpIHsKKyAgc2l6ZV90IGk7CisgIHN3aWdfbW9kdWxlX2luZm8gKm1vZHVsZV9oZWFkLCAqaXRlcjsKKyAgaW50IGZvdW5kLCBpbml0OworCisgIGNsaWVudGRhdGEgPSBjbGllbnRkYXRhOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgY2lyY3VsYXIgbGlzdCBoYXMgYmVlbiBzZXR1cCwgaWYgbm90LCBzZXQgaXQgdXAgKi8KKyAgaWYgKHN3aWdfbW9kdWxlLm5leHQ9PTApIHsKKyAgICAvKiBJbml0aWFsaXplIHRoZSBzd2lnX21vZHVsZSAqLworICAgIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbCA9IHN3aWdfdHlwZV9pbml0aWFsOworICAgIHN3aWdfbW9kdWxlLmNhc3RfaW5pdGlhbCA9IHN3aWdfY2FzdF9pbml0aWFsOworICAgIHN3aWdfbW9kdWxlLm5leHQgPSAmc3dpZ19tb2R1bGU7CisgICAgaW5pdCA9IDE7CisgIH0gZWxzZSB7CisgICAgaW5pdCA9IDA7CisgIH0KKworICAvKiBUcnkgYW5kIGxvYWQgYW55IGFscmVhZHkgY3JlYXRlZCBtb2R1bGVzICovCisgIG1vZHVsZV9oZWFkID0gU1dJR19HZXRNb2R1bGUoY2xpZW50ZGF0YSk7CisgIGlmICghbW9kdWxlX2hlYWQpIHsKKyAgICAvKiBUaGlzIGlzIHRoZSBmaXJzdCBtb2R1bGUgbG9hZGVkIGZvciB0aGlzIGludGVycHJldGVyICovCisgICAgLyogc28gc2V0IHRoZSBzd2lnIG1vZHVsZSBpbnRvIHRoZSBpbnRlcnByZXRlciAqLworICAgIFNXSUdfU2V0TW9kdWxlKGNsaWVudGRhdGEsICZzd2lnX21vZHVsZSk7CisgICAgbW9kdWxlX2hlYWQgPSAmc3dpZ19tb2R1bGU7CisgIH0gZWxzZSB7CisgICAgLyogdGhlIGludGVycHJldGVyIGhhcyBsb2FkZWQgYSBTV0lHIG1vZHVsZSwgYnV0IGhhcyBpdCBsb2FkZWQgdGhpcyBvbmU/ICovCisgICAgZm91bmQ9MDsKKyAgICBpdGVyPW1vZHVsZV9oZWFkOworICAgIGRvIHsKKyAgICAgIGlmIChpdGVyPT0mc3dpZ19tb2R1bGUpIHsKKyAgICAgICAgZm91bmQ9MTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpdGVyPWl0ZXItPm5leHQ7CisgICAgfSB3aGlsZSAoaXRlciE9IG1vZHVsZV9oZWFkKTsKKworICAgIC8qIGlmIHRoZSBpcyBmb3VuZCBpbiB0aGUgbGlzdCwgdGhlbiBhbGwgaXMgZG9uZSBhbmQgd2UgbWF5IGxlYXZlICovCisgICAgaWYgKGZvdW5kKSByZXR1cm47CisgICAgLyogb3RoZXJ3aXNlIHdlIG11c3QgYWRkIG91dCBtb2R1bGUgaW50byB0aGUgbGlzdCAqLworICAgIHN3aWdfbW9kdWxlLm5leHQgPSBtb2R1bGVfaGVhZC0+bmV4dDsKKyAgICBtb2R1bGVfaGVhZC0+bmV4dCA9ICZzd2lnX21vZHVsZTsKKyAgfQorCisgIC8qIFdoZW4gbXVsdGlwbGUgaW50ZXJwZXRlcnMgYXJlIHVzZWQsIGEgbW9kdWxlIGNvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGluCisgICAgICAgYSBkaWZmZXJlbnQgaW50ZXJwcmV0ZXIsIGJ1dCBub3QgeWV0IGhhdmUgYSBwb2ludGVyIGluIHRoaXMgaW50ZXJwcmV0ZXIuCisgICAgICAgSW4gdGhpcyBjYXNlLCB3ZSBkbyBub3Qgd2FudCB0byBjb250aW51ZSBhZGRpbmcgdHlwZXMuLi4gZXZlcnl0aGluZyBzaG91bGQgYmUKKyAgICAgICBzZXQgdXAgYWxyZWFkeSAqLworICBpZiAoaW5pdCA9PSAwKSByZXR1cm47CisKKyAgLyogTm93IHdvcmsgb24gZmlsbGluZyBpbiBzd2lnX21vZHVsZS50eXBlcyAqLworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBzaXplICVkXG4iLCBzd2lnX21vZHVsZS5zaXplKTsKKyNlbmRpZgorICBmb3IgKGkgPSAwOyBpIDwgc3dpZ19tb2R1bGUuc2l6ZTsgKytpKSB7CisgICAgc3dpZ190eXBlX2luZm8gKnR5cGUgPSAwOworICAgIHN3aWdfdHlwZV9pbmZvICpyZXQ7CisgICAgc3dpZ19jYXN0X2luZm8gKmNhc3Q7CisKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiB0eXBlICVkICVzXG4iLCBpLCBzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPm5hbWUpOworI2VuZGlmCisKKyAgICAvKiBpZiB0aGVyZSBpcyBhbm90aGVyIG1vZHVsZSBhbHJlYWR5IGxvYWRlZCAqLworICAgIGlmIChzd2lnX21vZHVsZS5uZXh0ICE9ICZzd2lnX21vZHVsZSkgeworICAgICAgdHlwZSA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeU1vZHVsZShzd2lnX21vZHVsZS5uZXh0LCAmc3dpZ19tb2R1bGUsIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+bmFtZSk7CisgICAgfQorICAgIGlmICh0eXBlKSB7CisgICAgICAvKiBPdmVyd3JpdGUgY2xpZW50ZGF0YSBmaWVsZCAqLworI2lmZGVmIFNXSUdSVU5USU1FX0RFQlVHCisgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogZm91bmQgdHlwZSAlc1xuIiwgdHlwZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgIGlmIChzd2lnX21vZHVsZS50eXBlX2luaXRpYWxbaV0tPmNsaWVudGRhdGEpIHsKKyAgICAgICAgdHlwZS0+Y2xpZW50ZGF0YSA9IHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+Y2xpZW50ZGF0YTsKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogZm91bmQgYW5kIG92ZXJ3cml0ZSB0eXBlICVzIFxuIiwgdHlwZS0+bmFtZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgdHlwZSA9IHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXTsKKyAgICB9CisKKyAgICAvKiBJbnNlcnQgY2FzdGluZyB0eXBlcyAqLworICAgIGNhc3QgPSBzd2lnX21vZHVsZS5jYXN0X2luaXRpYWxbaV07CisgICAgd2hpbGUgKGNhc3QtPnR5cGUpIHsKKyAgICAgIC8qIERvbid0IG5lZWQgdG8gYWRkIGluZm9ybWF0aW9uIGFscmVhZHkgaW4gdGhlIGxpc3QgKi8KKyAgICAgIHJldCA9IDA7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBsb29rIGNhc3QgJXNcbiIsIGNhc3QtPnR5cGUtPm5hbWUpOworI2VuZGlmCisgICAgICBpZiAoc3dpZ19tb2R1bGUubmV4dCAhPSAmc3dpZ19tb2R1bGUpIHsKKyAgICAgICAgcmV0ID0gU1dJR19NYW5nbGVkVHlwZVF1ZXJ5TW9kdWxlKHN3aWdfbW9kdWxlLm5leHQsICZzd2lnX21vZHVsZSwgY2FzdC0+dHlwZS0+bmFtZSk7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgaWYgKHJldCkgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGZvdW5kIGNhc3QgJXNcbiIsIHJldC0+bmFtZSk7CisjZW5kaWYKKyAgICAgIH0KKyAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gc3dpZ19tb2R1bGUudHlwZV9pbml0aWFsW2ldKSB7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgICBwcmludGYoIlNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogc2tpcCBvbGQgdHlwZSAlc1xuIiwgcmV0LT5uYW1lKTsKKyNlbmRpZgorICAgICAgICAgIGNhc3QtPnR5cGUgPSByZXQ7CisgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvKiBDaGVjayBmb3IgY2FzdGluZyBhbHJlYWR5IGluIHRoZSBsaXN0ICovCisgICAgICAgICAgc3dpZ19jYXN0X2luZm8gKm9jYXN0ID0gU1dJR19UeXBlQ2hlY2socmV0LT5uYW1lLCB0eXBlKTsKKyNpZmRlZiBTV0lHUlVOVElNRV9ERUJVRworICAgICAgICAgIGlmIChvY2FzdCkgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IHNraXAgb2xkIGNhc3QgJXNcbiIsIHJldC0+bmFtZSk7CisjZW5kaWYKKyAgICAgICAgICBpZiAoIW9jYXN0KSByZXQgPSAwOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIGlmICghcmV0KSB7CisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgICAgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IGFkZGluZyBjYXN0ICVzXG4iLCBjYXN0LT50eXBlLT5uYW1lKTsKKyNlbmRpZgorICAgICAgICBpZiAodHlwZS0+Y2FzdCkgeworICAgICAgICAgIHR5cGUtPmNhc3QtPnByZXYgPSBjYXN0OworICAgICAgICAgIGNhc3QtPm5leHQgPSB0eXBlLT5jYXN0OworICAgICAgICB9CisgICAgICAgIHR5cGUtPmNhc3QgPSBjYXN0OworICAgICAgfQorICAgICAgY2FzdCsrOworICAgIH0KKyAgICAvKiBTZXQgZW50cnkgaW4gbW9kdWxlcy0+dHlwZXMgYXJyYXkgZXF1YWwgdG8gdGhlIHR5cGUgKi8KKyAgICBzd2lnX21vZHVsZS50eXBlc1tpXSA9IHR5cGU7CisgIH0KKyAgc3dpZ19tb2R1bGUudHlwZXNbaV0gPSAwOworCisjaWZkZWYgU1dJR1JVTlRJTUVfREVCVUcKKyAgcHJpbnRmKCIqKioqIFNXSUdfSW5pdGlhbGl6ZU1vZHVsZTogQ2FzdCBMaXN0ICoqKioqKlxuIik7CisgIGZvciAoaSA9IDA7IGkgPCBzd2lnX21vZHVsZS5zaXplOyArK2kpIHsKKyAgICBpbnQgaiA9IDA7CisgICAgc3dpZ19jYXN0X2luZm8gKmNhc3QgPSBzd2lnX21vZHVsZS5jYXN0X2luaXRpYWxbaV07CisgICAgcHJpbnRmKCJTV0lHX0luaXRpYWxpemVNb2R1bGU6IHR5cGUgJWQgJXNcbiIsIGksIHN3aWdfbW9kdWxlLnR5cGVfaW5pdGlhbFtpXS0+bmFtZSk7CisgICAgd2hpbGUgKGNhc3QtPnR5cGUpIHsKKyAgICAgIHByaW50ZigiU1dJR19Jbml0aWFsaXplTW9kdWxlOiBjYXN0IHR5cGUgJXNcbiIsIGNhc3QtPnR5cGUtPm5hbWUpOworICAgICAgY2FzdCsrOworICAgICAgKytqOworICAgIH0KKyAgICBwcmludGYoIi0tLS0gVG90YWwgY2FzdHM6ICVkXG4iLGopOworICB9CisgIHByaW50ZigiKioqKiBTV0lHX0luaXRpYWxpemVNb2R1bGU6IENhc3QgTGlzdCAqKioqKipcbiIpOworI2VuZGlmCit9CisKKy8qIFRoaXMgZnVuY3Rpb24gd2lsbCBwcm9wYWdhdGUgdGhlIGNsaWVudGRhdGEgZmllbGQgb2YgdHlwZSB0bworKiBhbnkgbmV3IHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgaW50byB0aGUgbGlzdAorKiBvZiBlcXVpdmFsZW50IHR5cGVzLiAgSXQgaXMgbGlrZSBjYWxsaW5nCisqIFNXSUdfVHlwZUNsaWVudERhdGEodHlwZSwgY2xpZW50ZGF0YSkgYSBzZWNvbmQgdGltZS4KKyovCitTV0lHUlVOVElNRSB2b2lkCitTV0lHX1Byb3BhZ2F0ZUNsaWVudERhdGEodm9pZCkgeworICBzaXplX3QgaTsKKyAgc3dpZ19jYXN0X2luZm8gKmVxdWl2OworICBzdGF0aWMgaW50IGluaXRfcnVuID0gMDsKKworICBpZiAoaW5pdF9ydW4pIHJldHVybjsKKyAgaW5pdF9ydW4gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBzd2lnX21vZHVsZS5zaXplOyBpKyspIHsKKyAgICBpZiAoc3dpZ19tb2R1bGUudHlwZXNbaV0tPmNsaWVudGRhdGEpIHsKKyAgICAgIGVxdWl2ID0gc3dpZ19tb2R1bGUudHlwZXNbaV0tPmNhc3Q7CisgICAgICB3aGlsZSAoZXF1aXYpIHsKKyAgICAgICAgaWYgKCFlcXVpdi0+Y29udmVydGVyKSB7CisgICAgICAgICAgaWYgKGVxdWl2LT50eXBlICYmICFlcXVpdi0+dHlwZS0+Y2xpZW50ZGF0YSkKKyAgICAgICAgICBTV0lHX1R5cGVDbGllbnREYXRhKGVxdWl2LT50eXBlLCBzd2lnX21vZHVsZS50eXBlc1tpXS0+Y2xpZW50ZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgZXF1aXYgPSBlcXVpdi0+bmV4dDsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaWYgMAoreworICAvKiBjLW1vZGUgKi8KKyNlbmRpZgorfQorI2VuZGlmCisKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgLyogUHl0aG9uLXNwZWNpZmljIFNXSUcgQVBJICovCisjZGVmaW5lIFNXSUdfbmV3dmFybGluaygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTV0lHX1B5dGhvbl9uZXd2YXJsaW5rKCkKKyNkZWZpbmUgU1dJR19hZGR2YXJsaW5rKHAsIG5hbWUsIGdldF9hdHRyLCBzZXRfYXR0cikgIFNXSUdfUHl0aG9uX2FkZHZhcmxpbmsocCwgbmFtZSwgZ2V0X2F0dHIsIHNldF9hdHRyKQorI2RlZmluZSBTV0lHX0luc3RhbGxDb25zdGFudHMoZCwgY29uc3RhbnRzKSAgICAgICAgICAgU1dJR19QeXRob25fSW5zdGFsbENvbnN0YW50cyhkLCBjb25zdGFudHMpCisKKyAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICogZ2xvYmFsIHZhcmlhYmxlIHN1cHBvcnQgY29kZS4KKyAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICB0eXBlZGVmIHN0cnVjdCBzd2lnX2dsb2JhbHZhciB7CisgICAgY2hhciAgICAgICAqbmFtZTsgICAgICAgICAgICAgICAgICAvKiBOYW1lIG9mIGdsb2JhbCB2YXJpYWJsZSAqLworICAgIFB5T2JqZWN0ICooKmdldF9hdHRyKSh2b2lkKTsgICAgICAgLyogUmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlICovCisgICAgaW50ICAgICAgICgqc2V0X2F0dHIpKFB5T2JqZWN0ICopOyAvKiBTZXQgdGhlIHZhbHVlICovCisgICAgc3RydWN0IHN3aWdfZ2xvYmFsdmFyICpuZXh0OworICB9IHN3aWdfZ2xvYmFsdmFyOworCisgIHR5cGVkZWYgc3RydWN0IHN3aWdfdmFybGlua29iamVjdCB7CisgICAgUHlPYmplY3RfSEVBRAorICAgIHN3aWdfZ2xvYmFsdmFyICp2YXJzOworICB9IHN3aWdfdmFybGlua29iamVjdDsKKworICBTV0lHSU5URVJOIFB5T2JqZWN0ICoKKyAgc3dpZ192YXJsaW5rX3JlcHIoc3dpZ192YXJsaW5rb2JqZWN0ICpTV0lHVU5VU0VEUEFSTSh2KSkgeworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgICByZXR1cm4gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIjxTd2lnIGdsb2JhbCB2YXJpYWJsZXM+Iik7CisjZWxzZQorICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKCI8U3dpZyBnbG9iYWwgdmFyaWFibGVzPiIpOworI2VuZGlmCisgIH0KKworICBTV0lHSU5URVJOIFB5T2JqZWN0ICoKKyAgc3dpZ192YXJsaW5rX3N0cihzd2lnX3ZhcmxpbmtvYmplY3QgKnYpIHsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgUHlPYmplY3QgKnN0ciA9IFB5VW5pY29kZV9JbnRlcm5Gcm9tU3RyaW5nKCIoIik7CisgICAgUHlPYmplY3QgKnRhaWw7CisgICAgUHlPYmplY3QgKmpvaW5lZDsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyOworICAgIGZvciAodmFyID0gdi0+dmFyczsgdmFyOyB2YXI9dmFyLT5uZXh0KSB7CisgICAgICB0YWlsID0gUHlVbmljb2RlX0Zyb21TdHJpbmcodmFyLT5uYW1lKTsKKyAgICAgIGpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQoc3RyLCB0YWlsKTsKKyAgICAgIFB5X0RlY1JlZihzdHIpOworICAgICAgUHlfRGVjUmVmKHRhaWwpOworICAgICAgc3RyID0gam9pbmVkOworICAgICAgaWYgKHZhci0+bmV4dCkgeworICAgICAgICB0YWlsID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIiwgIik7CisgICAgICAgIGpvaW5lZCA9IFB5VW5pY29kZV9Db25jYXQoc3RyLCB0YWlsKTsKKyAgICAgICAgUHlfRGVjUmVmKHN0cik7CisgICAgICAgIFB5X0RlY1JlZih0YWlsKTsKKyAgICAgICAgc3RyID0gam9pbmVkOworICAgICAgfQorICAgIH0KKyAgICB0YWlsID0gUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcoIikiKTsKKyAgICBqb2luZWQgPSBQeVVuaWNvZGVfQ29uY2F0KHN0ciwgdGFpbCk7CisgICAgUHlfRGVjUmVmKHN0cik7CisgICAgUHlfRGVjUmVmKHRhaWwpOworICAgIHN0ciA9IGpvaW5lZDsKKyNlbHNlCisgICAgUHlPYmplY3QgKnN0ciA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoIigiKTsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyOworICAgIGZvciAodmFyID0gdi0+dmFyczsgdmFyOyB2YXI9dmFyLT5uZXh0KSB7CisgICAgICBQeVN0cmluZ19Db25jYXRBbmREZWwoJnN0cixQeVN0cmluZ19Gcm9tU3RyaW5nKHZhci0+bmFtZSkpOworICAgICAgaWYgKHZhci0+bmV4dCkgUHlTdHJpbmdfQ29uY2F0QW5kRGVsKCZzdHIsUHlTdHJpbmdfRnJvbVN0cmluZygiLCAiKSk7CisgICAgfQorICAgIFB5U3RyaW5nX0NvbmNhdEFuZERlbCgmc3RyLFB5U3RyaW5nX0Zyb21TdHJpbmcoIikiKSk7CisjZW5kaWYKKyAgICByZXR1cm4gc3RyOworICB9CisKKyAgU1dJR0lOVEVSTiBpbnQKKyAgc3dpZ192YXJsaW5rX3ByaW50KHN3aWdfdmFybGlua29iamVjdCAqdiwgRklMRSAqZnAsIGludCBTV0lHVU5VU0VEUEFSTShmbGFncykpIHsKKyAgICBjaGFyICp0bXA7CisgICAgUHlPYmplY3QgKnN0ciA9IHN3aWdfdmFybGlua19zdHIodik7CisgICAgZnByaW50ZihmcCwiU3dpZyBnbG9iYWwgdmFyaWFibGVzICIpOworICAgIGZwcmludGYoZnAsIiVzXG4iLCB0bXAgPSBTV0lHX1B5dGhvbl9zdHJfQXNDaGFyKHN0cikpOworICAgIFNXSUdfUHl0aG9uX3N0cl9EZWxGb3JQeTModG1wKTsKKyAgICBQeV9ERUNSRUYoc3RyKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFNXSUdJTlRFUk4gdm9pZAorICBzd2lnX3ZhcmxpbmtfZGVhbGxvYyhzd2lnX3ZhcmxpbmtvYmplY3QgKnYpIHsKKyAgICBzd2lnX2dsb2JhbHZhciAqdmFyID0gdi0+dmFyczsKKyAgICB3aGlsZSAodmFyKSB7CisgICAgICBzd2lnX2dsb2JhbHZhciAqbiA9IHZhci0+bmV4dDsKKyAgICAgIGZyZWUodmFyLT5uYW1lKTsKKyAgICAgIGZyZWUodmFyKTsKKyAgICAgIHZhciA9IG47CisgICAgfQorICB9CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIHN3aWdfdmFybGlua19nZXRhdHRyKHN3aWdfdmFybGlua29iamVjdCAqdiwgY2hhciAqbikgeworICAgIFB5T2JqZWN0ICpyZXMgPSBOVUxMOworICAgIHN3aWdfZ2xvYmFsdmFyICp2YXIgPSB2LT52YXJzOworICAgIHdoaWxlICh2YXIpIHsKKyAgICAgIGlmIChzdHJjbXAodmFyLT5uYW1lLG4pID09IDApIHsKKyAgICAgICAgcmVzID0gKCp2YXItPmdldF9hdHRyKSgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHZhciA9IHZhci0+bmV4dDsKKyAgICB9CisgICAgaWYgKHJlcyA9PSBOVUxMICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTmFtZUVycm9yLCJVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlIik7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICBTV0lHSU5URVJOIGludAorICBzd2lnX3Zhcmxpbmtfc2V0YXR0cihzd2lnX3ZhcmxpbmtvYmplY3QgKnYsIGNoYXIgKm4sIFB5T2JqZWN0ICpwKSB7CisgICAgaW50IHJlcyA9IDE7CisgICAgc3dpZ19nbG9iYWx2YXIgKnZhciA9IHYtPnZhcnM7CisgICAgd2hpbGUgKHZhcikgeworICAgICAgaWYgKHN0cmNtcCh2YXItPm5hbWUsbikgPT0gMCkgeworICAgICAgICByZXMgPSAoKnZhci0+c2V0X2F0dHIpKHApOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIHZhciA9IHZhci0+bmV4dDsKKyAgICB9CisgICAgaWYgKHJlcyA9PSAxICYmICFQeUVycl9PY2N1cnJlZCgpKSB7CisgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfTmFtZUVycm9yLCJVbmtub3duIEMgZ2xvYmFsIHZhcmlhYmxlIik7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICBTV0lHSU5URVJOIFB5VHlwZU9iamVjdCoKKyAgc3dpZ192YXJsaW5rX3R5cGUodm9pZCkgeworICAgIHN0YXRpYyBjaGFyIHZhcmxpbmtfX2RvY19fW10gPSAiU3dpZyB2YXIgbGluayBvYmplY3QiOworICAgIHN0YXRpYyBQeVR5cGVPYmplY3QgdmFybGlua190eXBlOworICAgIHN0YXRpYyBpbnQgdHlwZV9pbml0ID0gMDsKKyAgICBpZiAoIXR5cGVfaW5pdCkgeworICAgICAgY29uc3QgUHlUeXBlT2JqZWN0IHRtcCA9IHsKKyAgICAgICAgLyogUHlPYmplY3QgaGVhZGVyIGNoYW5nZWQgaW4gUHl0aG9uIDMgKi8KKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVChOVUxMLCAwKQorI2Vsc2UKKyAgICAgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9iX3NpemUgKi8KKyNlbmRpZgorICAgICAgICAoY2hhciAqKSJzd2lndmFybGluayIsICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCisgICAgICAgIHNpemVvZihzd2lnX3ZhcmxpbmtvYmplY3QpLCAgICAgICAgIC8qIHRwX2Jhc2ljc2l6ZSAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVtc2l6ZSAqLworICAgICAgICAoZGVzdHJ1Y3Rvcikgc3dpZ192YXJsaW5rX2RlYWxsb2MsICAvKiB0cF9kZWFsbG9jICovCisgICAgICAgIChwcmludGZ1bmMpIHN3aWdfdmFybGlua19wcmludCwgICAgIC8qIHRwX3ByaW50ICovCisgICAgICAgIChnZXRhdHRyZnVuYykgc3dpZ192YXJsaW5rX2dldGF0dHIsIC8qIHRwX2dldGF0dHIgKi8KKyAgICAgICAgKHNldGF0dHJmdW5jKSBzd2lnX3Zhcmxpbmtfc2V0YXR0ciwgLyogdHBfc2V0YXR0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jb21wYXJlICovCisgICAgICAgIChyZXByZnVuYykgc3dpZ192YXJsaW5rX3JlcHIsICAgICAgIC8qIHRwX3JlcHIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX3NlcXVlbmNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FzX21hcHBpbmcgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jYWxsICovCisgICAgICAgIChyZXByZnVuYykgc3dpZ192YXJsaW5rX3N0ciwgICAgICAgIC8qIHRwX3N0ciAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zZXRhdHRybyAqLworICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19idWZmZXIgKi8KKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZmxhZ3MgKi8KKyAgICAgICAgdmFybGlua19fZG9jX18sICAgICAgICAgICAgICAgICAgICAgLyogdHBfZG9jICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMjAyMDAwMAorICAgICAgICAwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsIC8qIHRwX2l0ZXIgLT4gdHBfd2Vha2xpc3QgKi8KKyNlbmRpZgorI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDIwMzAwMDAKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVsICovCisjZW5kaWYKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAyMDYwMDAwCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3ZlcnNpb24gKi8KKyNlbmRpZgorI2lmZGVmIENPVU5UX0FMTE9DUworICAgICAgICAwLDAsMCwwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hbGxvYyAtPiB0cF9uZXh0ICovCisjZW5kaWYKKyAgICAgIH07CisgICAgICB2YXJsaW5rX3R5cGUgPSB0bXA7CisgICAgICB0eXBlX2luaXQgPSAxOworI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjAyMDAwMAorICAgICAgdmFybGlua190eXBlLm9iX3R5cGUgPSAmUHlUeXBlX1R5cGU7CisjZWxzZQorICAgICAgaWYgKFB5VHlwZV9SZWFkeSgmdmFybGlua190eXBlKSA8IDApCisgICAgICByZXR1cm4gTlVMTDsKKyNlbmRpZgorICAgIH0KKyAgICByZXR1cm4gJnZhcmxpbmtfdHlwZTsKKyAgfQorCisgIC8qIENyZWF0ZSBhIHZhcmlhYmxlIGxpbmtpbmcgb2JqZWN0IGZvciB1c2UgbGF0ZXIgKi8KKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIFNXSUdfUHl0aG9uX25ld3Zhcmxpbmsodm9pZCkgeworICAgIHN3aWdfdmFybGlua29iamVjdCAqcmVzdWx0ID0gUHlPYmplY3RfTkVXKHN3aWdfdmFybGlua29iamVjdCwgc3dpZ192YXJsaW5rX3R5cGUoKSk7CisgICAgaWYgKHJlc3VsdCkgeworICAgICAgcmVzdWx0LT52YXJzID0gMDsKKyAgICB9CisgICAgcmV0dXJuICgoUHlPYmplY3QqKSByZXN1bHQpOworICB9CisKKyAgU1dJR0lOVEVSTiB2b2lkCisgIFNXSUdfUHl0aG9uX2FkZHZhcmxpbmsoUHlPYmplY3QgKnAsIGNoYXIgKm5hbWUsIFB5T2JqZWN0ICooKmdldF9hdHRyKSh2b2lkKSwgaW50ICgqc2V0X2F0dHIpKFB5T2JqZWN0ICpwKSkgeworICAgIHN3aWdfdmFybGlua29iamVjdCAqdiA9IChzd2lnX3ZhcmxpbmtvYmplY3QgKikgcDsKKyAgICBzd2lnX2dsb2JhbHZhciAqZ3YgPSAoc3dpZ19nbG9iYWx2YXIgKikgbWFsbG9jKHNpemVvZihzd2lnX2dsb2JhbHZhcikpOworICAgIGlmIChndikgeworICAgICAgc2l6ZV90IHNpemUgPSBzdHJsZW4obmFtZSkrMTsKKyAgICAgIGd2LT5uYW1lID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisgICAgICBpZiAoZ3YtPm5hbWUpIHsKKyAgICAgICAgc3RybmNweShndi0+bmFtZSxuYW1lLHNpemUpOworICAgICAgICBndi0+Z2V0X2F0dHIgPSBnZXRfYXR0cjsKKyAgICAgICAgZ3YtPnNldF9hdHRyID0gc2V0X2F0dHI7CisgICAgICAgIGd2LT5uZXh0ID0gdi0+dmFyczsKKyAgICAgIH0KKyAgICB9CisgICAgdi0+dmFycyA9IGd2OworICB9CisKKyAgU1dJR0lOVEVSTiBQeU9iamVjdCAqCisgIFNXSUdfZ2xvYmFscyh2b2lkKSB7CisgICAgc3RhdGljIFB5T2JqZWN0ICpfU1dJR19nbG9iYWxzID0gMDsKKyAgICBpZiAoIV9TV0lHX2dsb2JhbHMpIF9TV0lHX2dsb2JhbHMgPSBTV0lHX25ld3ZhcmxpbmsoKTsKKyAgICByZXR1cm4gX1NXSUdfZ2xvYmFsczsKKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAqIGNvbnN0YW50cy9tZXRob2RzIG1hbmlwdWxhdGlvbgorICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgIC8qIEluc3RhbGwgQ29uc3RhbnRzICovCisgIFNXSUdJTlRFUk4gdm9pZAorICBTV0lHX1B5dGhvbl9JbnN0YWxsQ29uc3RhbnRzKFB5T2JqZWN0ICpkLCBzd2lnX2NvbnN0X2luZm8gY29uc3RhbnRzW10pIHsKKyAgICBQeU9iamVjdCAqb2JqID0gMDsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBjb25zdGFudHNbaV0udHlwZTsgKytpKSB7CisgICAgICBzd2l0Y2goY29uc3RhbnRzW2ldLnR5cGUpIHsKKyAgICAgIGNhc2UgU1dJR19QWV9QT0lOVEVSOgorICAgICAgICBvYmogPSBTV0lHX0ludGVybmFsTmV3UG9pbnRlck9iaihjb25zdGFudHNbaV0ucHZhbHVlLCAqKGNvbnN0YW50c1tpXSkucHR5cGUsMCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTV0lHX1BZX0JJTkFSWToKKyAgICAgICAgb2JqID0gU1dJR19OZXdQYWNrZWRPYmooY29uc3RhbnRzW2ldLnB2YWx1ZSwgY29uc3RhbnRzW2ldLmx2YWx1ZSwgKihjb25zdGFudHNbaV0ucHR5cGUpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgICBvYmogPSAwOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChvYmopIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgY29uc3RhbnRzW2ldLm5hbWUsIG9iaik7CisgICAgICAgIFB5X0RFQ1JFRihvYmopOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyAgLyogRml4IFN3aWdNZXRob2RzIHRvIGNhcnJ5IHRoZSBjYWxsYmFjayBwdHJzIHdoZW4gbmVlZGVkICovCisgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICBTV0lHSU5URVJOIHZvaWQKKyAgU1dJR19QeXRob25fRml4TWV0aG9kcyhQeU1ldGhvZERlZiAqbWV0aG9kcywKKyAgICBzd2lnX2NvbnN0X2luZm8gKmNvbnN0X3RhYmxlLAorICAgIHN3aWdfdHlwZV9pbmZvICoqdHlwZXMsCisgICAgc3dpZ190eXBlX2luZm8gKip0eXBlc19pbml0aWFsKSB7CisgICAgc2l6ZV90IGk7CisgICAgZm9yIChpID0gMDsgbWV0aG9kc1tpXS5tbF9uYW1lOyArK2kpIHsKKyAgICAgIGNvbnN0IGNoYXIgKmMgPSBtZXRob2RzW2ldLm1sX2RvYzsKKyAgICAgIGlmIChjICYmIChjID0gc3Ryc3RyKGMsICJzd2lnX3B0cjogIikpKSB7CisgICAgICAgIGludCBqOworICAgICAgICBzd2lnX2NvbnN0X2luZm8gKmNpID0gMDsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGMgKyAxMDsKKyAgICAgICAgZm9yIChqID0gMDsgY29uc3RfdGFibGVbal0udHlwZTsgKytqKSB7CisgICAgICAgICAgaWYgKHN0cm5jbXAoY29uc3RfdGFibGVbal0ubmFtZSwgbmFtZSwKKyAgICAgICAgICAgICAgc3RybGVuKGNvbnN0X3RhYmxlW2pdLm5hbWUpKSA9PSAwKSB7CisgICAgICAgICAgICBjaSA9ICYoY29uc3RfdGFibGVbal0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjaSkgeworICAgICAgICAgIHZvaWQgKnB0ciA9IChjaS0+dHlwZSA9PSBTV0lHX1BZX1BPSU5URVIpID8gY2ktPnB2YWx1ZSA6IDA7CisgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgc2l6ZV90IHNoaWZ0ID0gKGNpLT5wdHlwZSkgLSB0eXBlczsKKyAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IHR5cGVzX2luaXRpYWxbc2hpZnRdOworICAgICAgICAgICAgc2l6ZV90IGxkb2MgPSAoYyAtIG1ldGhvZHNbaV0ubWxfZG9jKTsKKyAgICAgICAgICAgIHNpemVfdCBscHRyID0gc3RybGVuKHR5LT5uYW1lKSsyKnNpemVvZih2b2lkKikrMjsKKyAgICAgICAgICAgIGNoYXIgKm5kb2MgPSAoY2hhciopbWFsbG9jKGxkb2MgKyBscHRyICsgMTApOworICAgICAgICAgICAgaWYgKG5kb2MpIHsKKyAgICAgICAgICAgICAgY2hhciAqYnVmZiA9IG5kb2M7CisgICAgICAgICAgICAgIHN0cm5jcHkoYnVmZiwgbWV0aG9kc1tpXS5tbF9kb2MsIGxkb2MpOworICAgICAgICAgICAgICBidWZmICs9IGxkb2M7CisgICAgICAgICAgICAgIHN0cm5jcHkoYnVmZiwgInN3aWdfcHRyOiAiLCAxMCk7CisgICAgICAgICAgICAgIGJ1ZmYgKz0gMTA7CisgICAgICAgICAgICAgIFNXSUdfUGFja1ZvaWRQdHIoYnVmZiwgcHRyLCB0eS0+bmFtZSwgbHB0cik7CisgICAgICAgICAgICAgIG1ldGhvZHNbaV0ubWxfZG9jID0gbmRvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qCisgKiAgUGFydGlhbCBJbml0IG1ldGhvZAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgorCitTV0lHRVhQT1JUCisjaWYgUFlfVkVSU0lPTl9IRVggPj0gMHgwMzAwMDAwMAorUHlPYmplY3QqCisjZWxzZQordm9pZAorI2VuZGlmCitTV0lHX2luaXQodm9pZCkgeworICBQeU9iamVjdCAqbSwgKmQsICptZDsKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIHN0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgU1dJR19tb2R1bGUgPSB7CisjIGlmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMjAwMDAKKyAgICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCisjIGVsc2UKKyAgICB7CisgICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKyAgICAgIE5VTEwsIC8qIG1faW5pdCAqLworICAgICAgMCwgICAgLyogbV9pbmRleCAqLworICAgICAgTlVMTCwgLyogbV9jb3B5ICovCisgICAgfSwKKyMgZW5kaWYKKyAgICAoY2hhciAqKSBTV0lHX25hbWUsCisgICAgTlVMTCwKKyAgICAtMSwKKyAgICBTd2lnTWV0aG9kcywKKyAgICBOVUxMLAorICAgIE5VTEwsCisgICAgTlVMTCwKKyAgICBOVUxMCisgIH07CisjZW5kaWYKKworI2lmIGRlZmluZWQoU1dJR1BZVEhPTl9CVUlMVElOKQorICBzdGF0aWMgU3dpZ1B5Q2xpZW50RGF0YSBTd2lnUHlPYmplY3RfY2xpZW50ZGF0YSA9IHsKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwCisgIH07CisgIHN0YXRpYyBQeUdldFNldERlZiB0aGlzX2dldHNldF9kZWYgPSB7CisgICAgKGNoYXIgKikidGhpcyIsICZTd2lnUHlCdWlsdGluX1RoaXNDbG9zdXJlLCBOVUxMLCBOVUxMLCBOVUxMCisgIH07CisgIHN0YXRpYyBTd2lnUHlHZXRTZXQgdGhpc293bl9nZXRzZXRfY2xvc3VyZSA9IHsKKyAgICAoUHlDRnVuY3Rpb24pIFN3aWdQeU9iamVjdF9vd24sCisgICAgKFB5Q0Z1bmN0aW9uKSBTd2lnUHlPYmplY3Rfb3duCisgIH07CisgIHN0YXRpYyBQeUdldFNldERlZiB0aGlzb3duX2dldHNldF9kZWYgPSB7CisgICAgKGNoYXIgKikidGhpc293biIsIFN3aWdQeUJ1aWx0aW5fR2V0dGVyQ2xvc3VyZSwgU3dpZ1B5QnVpbHRpbl9TZXR0ZXJDbG9zdXJlLCBOVUxMLCAmdGhpc293bl9nZXRzZXRfY2xvc3VyZQorICB9OworICBQeU9iamVjdCAqbWV0YXR5cGVfYXJnczsKKyAgUHlUeXBlT2JqZWN0ICpidWlsdGluX3B5dHlwZTsKKyAgaW50IGJ1aWx0aW5fYmFzZV9jb3VudDsKKyAgc3dpZ190eXBlX2luZm8gKmJ1aWx0aW5fYmFzZXR5cGU7CisgIFB5T2JqZWN0ICp0dXBsZTsKKyAgUHlHZXRTZXREZXNjck9iamVjdCAqc3RhdGljX2dldHNldDsKKyAgUHlUeXBlT2JqZWN0ICptZXRhdHlwZTsKKyAgU3dpZ1B5Q2xpZW50RGF0YSAqY2Q7CisgIFB5T2JqZWN0ICpwdWJsaWNfaW50ZXJmYWNlLCAqcHVibGljX3N5bWJvbDsKKyAgUHlPYmplY3QgKnRoaXNfZGVzY3I7CisgIFB5T2JqZWN0ICp0aGlzb3duX2Rlc2NyOworICBpbnQgaTsKKworICAodm9pZClidWlsdGluX3B5dHlwZTsKKyAgKHZvaWQpYnVpbHRpbl9iYXNlX2NvdW50OworICAodm9pZClidWlsdGluX2Jhc2V0eXBlOworICAodm9pZCl0dXBsZTsKKyAgKHZvaWQpc3RhdGljX2dldHNldDsKKworICAvKiBtZXRhdHlwZSBpcyB1c2VkIHRvIGltcGxlbWVudCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4gKi8KKyAgbWV0YXR5cGVfYXJncyA9IFB5X0J1aWxkVmFsdWUoIihzKE8pe30pIiwgIlN3aWdQeU9iamVjdFR5cGUiLCAmUHlUeXBlX1R5cGUpOworICBhc3NlcnQobWV0YXR5cGVfYXJncyk7CisgIG1ldGF0eXBlID0gKFB5VHlwZU9iamVjdCAqKSBQeVR5cGVfVHlwZS50cF9jYWxsKChQeU9iamVjdCAqKSAmUHlUeXBlX1R5cGUsIG1ldGF0eXBlX2FyZ3MsIE5VTEwpOworICBhc3NlcnQobWV0YXR5cGUpOworICBQeV9ERUNSRUYobWV0YXR5cGVfYXJncyk7CisgIG1ldGF0eXBlLT50cF9zZXRhdHRybyA9IChzZXRhdHRyb2Z1bmMpICZTd2lnUHlPYmplY3RUeXBlX3NldGF0dHJvOworICBhc3NlcnQoUHlUeXBlX1JlYWR5KG1ldGF0eXBlKSA+PSAwKTsKKyNlbmRpZgorCisgIC8qIEZpeCBTd2lnTWV0aG9kcyB0byBjYXJyeSB0aGUgY2FsbGJhY2sgcHRycyB3aGVuIG5lZWRlZCAqLworICBTV0lHX1B5dGhvbl9GaXhNZXRob2RzKFN3aWdNZXRob2RzLCBzd2lnX2NvbnN0X3RhYmxlLCBzd2lnX3R5cGVzLCBzd2lnX3R5cGVfaW5pdGlhbCk7CisKKyNpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgIG0gPSBQeU1vZHVsZV9DcmVhdGUoJlNXSUdfbW9kdWxlKTsKKyNlbHNlCisgIG0gPSBQeV9Jbml0TW9kdWxlKChjaGFyICopIFNXSUdfbmFtZSwgU3dpZ01ldGhvZHMpOworI2VuZGlmCisgIG1kID0gZCA9IFB5TW9kdWxlX0dldERpY3QobSk7CisKKyAgU1dJR19Jbml0aWFsaXplTW9kdWxlKDApOworCisjaWZkZWYgU1dJR1BZVEhPTl9CVUlMVElOCisgIFN3aWdQeU9iamVjdF9zdHlwZSA9IFNXSUdfTWFuZ2xlZFR5cGVRdWVyeSgiX3BfU3dpZ1B5T2JqZWN0Iik7CisgIGFzc2VydChTd2lnUHlPYmplY3Rfc3R5cGUpOworICBjZCA9IChTd2lnUHlDbGllbnREYXRhKikgU3dpZ1B5T2JqZWN0X3N0eXBlLT5jbGllbnRkYXRhOworICBpZiAoIWNkKSB7CisgICAgU3dpZ1B5T2JqZWN0X3N0eXBlLT5jbGllbnRkYXRhID0gJlN3aWdQeU9iamVjdF9jbGllbnRkYXRhOworICAgIFN3aWdQeU9iamVjdF9jbGllbnRkYXRhLnB5dHlwZSA9IFN3aWdQeU9iamVjdF9UeXBlT25jZSgpOworICB9IGVsc2UgaWYgKFN3aWdQeU9iamVjdF9UeXBlT25jZSgpLT50cF9iYXNpY3NpemUgIT0gY2QtPnB5dHlwZS0+dHBfYmFzaWNzaXplKSB7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkltcG9ydCBlcnJvcjogYXR0ZW1wdGVkIHRvIGxvYWQgdHdvIGluY29tcGF0aWJsZSBzd2lnLWdlbmVyYXRlZCBtb2R1bGVzLiIpOworIyBpZiBQWV9WRVJTSU9OX0hFWCA+PSAweDAzMDAwMDAwCisgICAgcmV0dXJuIE5VTEw7CisjIGVsc2UKKyAgICByZXR1cm47CisjIGVuZGlmCisgIH0KKworICAvKiBBbGwgb2JqZWN0cyBoYXZlIGEgJ3RoaXMnIGF0dHJpYnV0ZSAqLworICB0aGlzX2Rlc2NyID0gUHlEZXNjcl9OZXdHZXRTZXQoU3dpZ1B5T2JqZWN0X3R5cGUoKSwgJnRoaXNfZ2V0c2V0X2RlZik7CisgICh2b2lkKXRoaXNfZGVzY3I7CisKKyAgLyogQWxsIG9iamVjdHMgaGF2ZSBhICd0aGlzb3duJyBhdHRyaWJ1dGUgKi8KKyAgdGhpc293bl9kZXNjciA9IFB5RGVzY3JfTmV3R2V0U2V0KFN3aWdQeU9iamVjdF90eXBlKCksICZ0aGlzb3duX2dldHNldF9kZWYpOworICAodm9pZCl0aGlzb3duX2Rlc2NyOworCisgIHB1YmxpY19pbnRlcmZhY2UgPSBQeUxpc3RfTmV3KDApOworICBwdWJsaWNfc3ltYm9sID0gMDsKKyAgKHZvaWQpcHVibGljX3N5bWJvbDsKKworICBQeURpY3RfU2V0SXRlbVN0cmluZyhtZCwgIl9fYWxsX18iLCBwdWJsaWNfaW50ZXJmYWNlKTsKKyAgUHlfREVDUkVGKHB1YmxpY19pbnRlcmZhY2UpOworICBmb3IgKGkgPSAwOyBTd2lnTWV0aG9kc1tpXS5tbF9uYW1lICE9IE5VTEw7ICsraSkKKyAgU3dpZ1B5QnVpbHRpbl9BZGRQdWJsaWNTeW1ib2wocHVibGljX2ludGVyZmFjZSwgU3dpZ01ldGhvZHNbaV0ubWxfbmFtZSk7CisgIGZvciAoaSA9IDA7IHN3aWdfY29uc3RfdGFibGVbaV0ubmFtZSAhPSAwOyArK2kpCisgIFN3aWdQeUJ1aWx0aW5fQWRkUHVibGljU3ltYm9sKHB1YmxpY19pbnRlcmZhY2UsIHN3aWdfY29uc3RfdGFibGVbaV0ubmFtZSk7CisjZW5kaWYKKworICBTV0lHX0luc3RhbGxDb25zdGFudHMoZCxzd2lnX2NvbnN0X3RhYmxlKTsKKworI2lmIFBZX1ZFUlNJT05fSEVYID49IDB4MDMwMDAwMDAKKyAgcmV0dXJuIG07CisjZWxzZQorICByZXR1cm47CisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvc3dpZy9zZXR1cC5weSBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvc2V0dXAucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzYmZlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3N3aWcvc2V0dXAucHkKQEAgLTAsMCArMSw0MCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIiIiZGlzdHV0aWxzIHNjcmlwdCBmb3IgbGlid2VicCBweXRob24gbW9kdWxlLiIiIgorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBzZXR1cAorZnJvbSBkaXN0dXRpbHMuZXh0ZW5zaW9uIGltcG9ydCBFeHRlbnNpb24KK2ltcG9ydCBvcworaW1wb3J0IHNodXRpbAoraW1wb3J0IHRlbXBmaWxlCisKK3RtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorcGFja2FnZSA9ICJjb20uZ29vZ2xlLndlYnAiCitwYWNrYWdlX3BhdGggPSBvcy5wYXRoLmpvaW4odG1wZGlyLCAqcGFja2FnZS5zcGxpdCgiLiIpKQorb3MubWFrZWRpcnMocGFja2FnZV9wYXRoKQorCisjIENyZWF0ZSBfX2luaXRfLnB5IGZpbGVzIGFsb25nIHRoZSBwYWNrYWdlIHBhdGguCitpbml0cHlfcGF0aCA9IHRtcGRpcgorZm9yIGQgaW4gcGFja2FnZS5zcGxpdCgiLiIpOgorICBpbml0cHlfcGF0aCA9IG9zLnBhdGguam9pbihpbml0cHlfcGF0aCwgZCkKKyAgb3Blbihvcy5wYXRoLmpvaW4oaW5pdHB5X3BhdGgsICJfX2luaXRfXy5weSIpLCAidyIpLmNsb3NlKCkKKworc2h1dGlsLmNvcHkyKCJsaWJ3ZWJwLnB5IiwgcGFja2FnZV9wYXRoKQorc2V0dXAobmFtZT0ibGlid2VicCIsCisgICAgICB2ZXJzaW9uPSIwLjAiLAorICAgICAgZGVzY3JpcHRpb249ImxpYndlYnAgcHl0aG9uIHdyYXBwZXIiLAorICAgICAgbG9uZ19kZXNjcmlwdGlvbj0iUHJvdmlkZXMgYWNjZXNzIHRvICdzaW1wbGUnIGxpYndlYnAgZGVjb2RlIGludGVyZmFjZSIsCisgICAgICBsaWNlbnNlPSJCU0QiLAorICAgICAgdXJsPSJodHRwOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3NwZWVkL3dlYnAiLAorICAgICAgZXh0X3BhY2thZ2U9cGFja2FnZSwKKyAgICAgIGV4dF9tb2R1bGVzPVtFeHRlbnNpb24oIl9saWJ3ZWJwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJsaWJ3ZWJwX3B5dGhvbl93cmFwLmMiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzPVsid2VicCJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgICBdLAorICAgICAgcGFja2FnZV9kaXI9eyIiOiB0bXBkaXJ9LAorICAgICAgcGFja2FnZXM9WyJjb20iLCAiY29tLmdvb2dsZSIsICJjb20uZ29vZ2xlLndlYnAiXSwKKyAgICAgIHB5X21vZHVsZXM9W3BhY2thZ2UgKyAiLmxpYndlYnAiXSwKKyAgICAgKQorCitzaHV0aWwucm10cmVlKHRtcGRpcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ2ZGVlMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfcmVhZGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJvb2xlYW4gZGVjb2RlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpbmNsdWRlICIuL2JpdF9yZWFkZXIuaCIKLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotI2RlZmluZSBNSyhYKSAoKChyYW5nZV90KShYKSA8PCAoQklUUykpIHwgKE1BU0spKQotI2Vsc2UKLSNkZWZpbmUgTUsoWCkgKChyYW5nZV90KShYKSkKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4Qml0UmVhZGVyCi0KLXZvaWQgVlA4SW5pdEJpdFJlYWRlcihWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHN0YXJ0LCBjb25zdCB1aW50OF90KiBjb25zdCBlbmQpIHsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3RhcnQgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhzdGFydCA8PSBlbmQpOwotICBici0+cmFuZ2VfICAgPSBNSygyNTUgLSAxKTsKLSAgYnItPmJ1Zl8gICAgID0gc3RhcnQ7Ci0gIGJyLT5idWZfZW5kXyA9IGVuZDsKLSAgYnItPnZhbHVlXyAgID0gMDsKLSAgYnItPmJpdHNfICAgID0gLTg7ICAgLy8gdG8gbG9hZCB0aGUgdmVyeSBmaXJzdCA4Yml0cwotICBici0+ZW9mXyAgICAgPSAwOwotfQotCi1jb25zdCB1aW50OF90IGtWUDhMb2cyUmFuZ2VbMTI4XSA9IHsKLSAgICAgNywgNiwgNiwgNSwgNSwgNSwgNSwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLSAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgMAotfTsKLQotLy8gcmFuZ2UgPSAocmFuZ2UgPDwga1ZQOExvZzJSYW5nZVtyYW5nZV0pICsgdHJhaWxpbmcgMSdzCi1jb25zdCByYW5nZV90IGtWUDhOZXdSYW5nZVsxMjhdID0gewotICBNSygxMjcpLCBNSygxMjcpLCBNSygxOTEpLCBNSygxMjcpLCBNSygxNTkpLCBNSygxOTEpLCBNSygyMjMpLCBNSygxMjcpLAotICBNSygxNDMpLCBNSygxNTkpLCBNSygxNzUpLCBNSygxOTEpLCBNSygyMDcpLCBNSygyMjMpLCBNSygyMzkpLCBNSygxMjcpLAotICBNSygxMzUpLCBNSygxNDMpLCBNSygxNTEpLCBNSygxNTkpLCBNSygxNjcpLCBNSygxNzUpLCBNSygxODMpLCBNSygxOTEpLAotICBNSygxOTkpLCBNSygyMDcpLCBNSygyMTUpLCBNSygyMjMpLCBNSygyMzEpLCBNSygyMzkpLCBNSygyNDcpLCBNSygxMjcpLAotICBNSygxMzEpLCBNSygxMzUpLCBNSygxMzkpLCBNSygxNDMpLCBNSygxNDcpLCBNSygxNTEpLCBNSygxNTUpLCBNSygxNTkpLAotICBNSygxNjMpLCBNSygxNjcpLCBNSygxNzEpLCBNSygxNzUpLCBNSygxNzkpLCBNSygxODMpLCBNSygxODcpLCBNSygxOTEpLAotICBNSygxOTUpLCBNSygxOTkpLCBNSygyMDMpLCBNSygyMDcpLCBNSygyMTEpLCBNSygyMTUpLCBNSygyMTkpLCBNSygyMjMpLAotICBNSygyMjcpLCBNSygyMzEpLCBNSygyMzUpLCBNSygyMzkpLCBNSygyNDMpLCBNSygyNDcpLCBNSygyNTEpLCBNSygxMjcpLAotICBNSygxMjkpLCBNSygxMzEpLCBNSygxMzMpLCBNSygxMzUpLCBNSygxMzcpLCBNSygxMzkpLCBNSygxNDEpLCBNSygxNDMpLAotICBNSygxNDUpLCBNSygxNDcpLCBNSygxNDkpLCBNSygxNTEpLCBNSygxNTMpLCBNSygxNTUpLCBNSygxNTcpLCBNSygxNTkpLAotICBNSygxNjEpLCBNSygxNjMpLCBNSygxNjUpLCBNSygxNjcpLCBNSygxNjkpLCBNSygxNzEpLCBNSygxNzMpLCBNSygxNzUpLAotICBNSygxNzcpLCBNSygxNzkpLCBNSygxODEpLCBNSygxODMpLCBNSygxODUpLCBNSygxODcpLCBNSygxODkpLCBNSygxOTEpLAotICBNSygxOTMpLCBNSygxOTUpLCBNSygxOTcpLCBNSygxOTkpLCBNSygyMDEpLCBNSygyMDMpLCBNSygyMDUpLCBNSygyMDcpLAotICBNSygyMDkpLCBNSygyMTEpLCBNSygyMTMpLCBNSygyMTUpLCBNSygyMTcpLCBNSygyMTkpLCBNSygyMjEpLCBNSygyMjMpLAotICBNSygyMjUpLCBNSygyMjcpLCBNSygyMjkpLCBNSygyMzEpLCBNSygyMzMpLCBNSygyMzUpLCBNSygyMzcpLCBNSygyMzkpLAotICBNSygyNDEpLCBNSygyNDMpLCBNSygyNDUpLCBNSygyNDcpLCBNSygyNDkpLCBNSygyNTEpLCBNSygyNTMpLCBNSygxMjcpCi19OwotCi0jdW5kZWYgTUsKLQotdm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0gIFNCX0RDSEVDSyhiciAhPSBOVUxMICYmIGJyLT5idWZfICE9IE5VTEwpOwotICAvLyBPbmx5IHJlYWQgOGJpdHMgYXQgYSB0aW1lCi0gIGlmIChici0+YnVmXyA8IGJyLT5idWZfZW5kXykgewotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICAgIGJyLT52YWx1ZV8gfD0gKGJpdF90KSgqYnItPmJ1Zl8rKykgPDwgKChCSVRTKSAtIDggLSBici0+Yml0c18pOwotI2Vsc2UKLSAgICBici0+dmFsdWVfID0gKGJpdF90KSgqYnItPmJ1Zl8rKykgfCAoYnItPnZhbHVlXyA8PCA4KTsKLSNlbmRpZgotICAgIGJyLT5iaXRzXyArPSA4OwotICB9IGVsc2UgaWYgKCFici0+ZW9mXykgewotI2lmZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gICAgLy8gVGhlc2UgYXJlIG5vdCBzdHJpY3RseSBuZWVkZWQsIGJ1dCBpdCBtYWtlcyB0aGUgYmVoYXZpb3VyCi0gICAgLy8gY29uc2lzdGVudCBmb3IgYm90aCBVU0VfUklHSFRfSlVTVElGWSBhbmQgIVVTRV9SSUdIVF9KVVNUSUZZLgotICAgIGJyLT52YWx1ZV8gPDw9IDg7Ci0gICAgYnItPmJpdHNfICs9IDg7Ci0jZW5kaWYKLSAgICBici0+ZW9mXyA9IDE7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhpZ2hlci1sZXZlbCBjYWxscwotCi11aW50MzJfdCBWUDhHZXRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgewotICB1aW50MzJfdCB2ID0gMDsKLSAgd2hpbGUgKGJpdHMtLSA+IDApIHsKLSAgICB2IHw9IFZQOEdldEJpdChiciwgMHg4MCkgPDwgYml0czsKLSAgfQotICByZXR1cm4gdjsKLX0KLQotaW50MzJfdCBWUDhHZXRTaWduZWRWYWx1ZShWUDhCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgYml0cykgewotICBjb25zdCBpbnQgdmFsdWUgPSBWUDhHZXRWYWx1ZShiciwgYml0cyk7Ci0gIHJldHVybiBWUDhHZXQoYnIpID8gLXZhbHVlIDogdmFsdWU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQml0UmVhZGVyCi0KLSNkZWZpbmUgTUFYX05VTV9CSVRfUkVBRCAyNQotCi0jZGVmaW5lIExCSVRTIDY0ICAgICAgLy8gTnVtYmVyIG9mIGJpdHMgcHJlZmV0Y2hlZC4KLSNkZWZpbmUgV0JJVFMgMzIgICAgICAvLyBNaW5pbXVtIG51bWJlciBvZiBieXRlcyBuZWVkZWQgYWZ0ZXIgVlA4TEZpbGxCaXRXaW5kb3cuCi0jZGVmaW5lIExPRzhfV0JJVFMgNCAgLy8gTnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzdG9yZSBXQklUUyBiaXRzLgotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga0JpdE1hc2tbTUFYX05VTV9CSVRfUkVBRF0gPSB7Ci0gIDAsIDEsIDMsIDcsIDE1LCAzMSwgNjMsIDEyNywgMjU1LCA1MTEsIDEwMjMsIDIwNDcsIDQwOTUsIDgxOTEsIDE2MzgzLCAzMjc2NywKLSAgNjU1MzUsIDEzMTA3MSwgMjYyMTQzLCA1MjQyODcsIDEwNDg1NzUsIDIwOTcxNTEsIDQxOTQzMDMsIDgzODg2MDcsIDE2Nzc3MjE1Ci19OwotCi12b2lkIFZQOExJbml0Qml0UmVhZGVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgaTsKLSAgU0JfRENIRUNLKGJyICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3RhcnQgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhsZW5ndGggPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgotCi0gIGJyLT5idWZfID0gc3RhcnQ7Ci0gIGJyLT5sZW5fID0gbGVuZ3RoOwotICBici0+dmFsXyA9IDA7Ci0gIGJyLT5wb3NfID0gMDsKLSAgYnItPmJpdF9wb3NfID0gMDsKLSAgYnItPmVvc18gPSAwOwotICBici0+ZXJyb3JfID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IHNpemVvZihici0+dmFsXykgJiYgaSA8IGJyLT5sZW5fOyArK2kpIHsKLSAgICBici0+dmFsXyB8PSAoKHZwOGxfdmFsX3QpYnItPmJ1Zl9bYnItPnBvc19dKSA8PCAoOCAqIGkpOwotICAgICsrYnItPnBvc187Ci0gIH0KLX0KLQotdm9pZCBWUDhMQml0UmVhZGVyU2V0QnVmZmVyKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGJ1Ziwgc2l6ZV90IGxlbikgewotICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhidWYgIT0gTlVMTCk7Ci0gIFNCX0RDSEVDSyhsZW4gPCAweGZmZmZmZmY4dSk7ICAgLy8gY2FuJ3QgaGFwcGVuIHdpdGggYSBSSUZGIGNodW5rLgotICBici0+ZW9zXyA9IChici0+cG9zXyA+PSBsZW4pOwotICBici0+YnVmXyA9IGJ1ZjsKLSAgYnItPmxlbl8gPSBsZW47Ci19Ci0KLS8vIElmIG5vdCBhdCBFT1MsIHJlbG9hZCB1cCB0byBMQklUUyBieXRlLWJ5LWJ5dGUKLXN0YXRpYyB2b2lkIFNoaWZ0Qnl0ZXMoVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgd2hpbGUgKGJyLT5iaXRfcG9zXyA+PSA4ICYmIGJyLT5wb3NfIDwgYnItPmxlbl8pIHsKLSAgICBici0+dmFsXyA+Pj0gODsKLSAgICBici0+dmFsXyB8PSAoKHZwOGxfdmFsX3QpYnItPmJ1Zl9bYnItPnBvc19dKSA8PCAoTEJJVFMgLSA4KTsKLSAgICArK2JyLT5wb3NfOwotICAgIGJyLT5iaXRfcG9zXyAtPSA4OwotICB9Ci19Ci0KLXZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpIHsKLSAgaWYgKGJyLT5iaXRfcG9zXyA+PSBXQklUUykgewotI2lmIChkZWZpbmVkKF9feDg2XzY0X18pIHx8IGRlZmluZWQoX01fWDY0KSkKLSAgICBpZiAoYnItPnBvc18gKyBzaXplb2YoYnItPnZhbF8pIDwgYnItPmxlbl8pIHsKLSAgICAgIGJyLT52YWxfID4+PSBXQklUUzsKLSAgICAgIGJyLT5iaXRfcG9zXyAtPSBXQklUUzsKLSAgICAgIC8vIFRoZSBleHByZXNzaW9uIGJlbG93IG5lZWRzIGEgbGl0dGxlLWVuZGlhbiBhcmNoIHRvIHdvcmsgY29ycmVjdGx5LgotICAgICAgLy8gVGhpcyBnaXZlcyBhIGxhcmdlIHNwZWVkdXAgZm9yIGRlY29kaW5nIHNwZWVkLgotICAgICAgYnItPnZhbF8gfD0gKihjb25zdCB2cDhsX3ZhbF90KikoYnItPmJ1Zl8gKyBici0+cG9zXykgPDwgKExCSVRTIC0gV0JJVFMpOwotICAgICAgYnItPnBvc18gKz0gTE9HOF9XQklUUzsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0jZW5kaWYKLSAgICBTaGlmdEJ5dGVzKGJyKTsgICAgICAgLy8gU2xvdyBwYXRoLgotICAgIGlmIChici0+cG9zXyA9PSBici0+bGVuXyAmJiBici0+Yml0X3Bvc18gPT0gTEJJVFMpIHsKLSAgICAgIGJyLT5lb3NfID0gMTsKLSAgICB9Ci0gIH0KLX0KLQotdWludDMyX3QgVlA4TFJlYWRCaXRzKFZQOExCaXRSZWFkZXIqIGNvbnN0IGJyLCBpbnQgbl9iaXRzKSB7Ci0gIFNCX0RDSEVDSyhuX2JpdHMgPj0gMCk7Ci0gIC8vIEZsYWcgYW4gZXJyb3IgaWYgZW5kX29mX3N0cmVhbSBvciBuX2JpdHMgaXMgbW9yZSB0aGFuIGFsbG93ZWQgbGltaXQuCi0gIGlmICghYnItPmVvc18gJiYgbl9iaXRzIDwgTUFYX05VTV9CSVRfUkVBRCkgewotICAgIGNvbnN0IHVpbnQzMl90IHZhbCA9Ci0gICAgICAgICh1aW50MzJfdCkoYnItPnZhbF8gPj4gYnItPmJpdF9wb3NfKSAmIGtCaXRNYXNrW25fYml0c107Ci0gICAgY29uc3QgaW50IG5ld19iaXRzID0gYnItPmJpdF9wb3NfICsgbl9iaXRzOwotICAgIGJyLT5iaXRfcG9zXyA9IG5ld19iaXRzOwotICAgIC8vIElmIHRoaXMgcmVhZCBpcyBnb2luZyB0byBjcm9zcyB0aGUgcmVhZCBidWZmZXIsIHNldCB0aGUgZW9zIGZsYWcuCi0gICAgaWYgKGJyLT5wb3NfID09IGJyLT5sZW5fKSB7Ci0gICAgICBpZiAobmV3X2JpdHMgPj0gTEJJVFMpIHsKLSAgICAgICAgYnItPmVvc18gPSAxOwotICAgICAgfQotICAgIH0KLSAgICBTaGlmdEJ5dGVzKGJyKTsKLSAgICByZXR1cm4gdmFsOwotICB9IGVsc2UgewotICAgIGJyLT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3JlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTY4YjViLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF9yZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQm9vbGVhbiBkZWNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLS8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZm5kZWYgV0VCUF9VVElMU19CSVRfUkVBREVSX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfQklUX1JFQURFUl9IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2J5dGVfc3dhcC5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBfYnl0ZXN3YXBfdWxvbmcKLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPiAgLy8gRm9yIG1lbWNweQotI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBUaGUgQm9vbGVhbiBkZWNvZGVyIG5lZWRzIHRvIG1haW50YWluIGluZmluaXRlIHByZWNpc2lvbiBvbiB0aGUgdmFsdWVfIGZpZWxkLgotLy8gSG93ZXZlciwgc2luY2UgcmFuZ2VfIGlzIG9ubHkgOGJpdCwgd2Ugb25seSBuZWVkIGFuIGFjdGl2ZSB3aW5kb3cgb2YgOCBiaXRzCi0vLyBmb3IgdmFsdWVfLiBMZWZ0IGJpdHMgKE1TQikgZ2V0cyB6ZXJvZWQgYW5kIHNoaWZ0ZWQgYXdheSB3aGVuIHZhbHVlXyBmYWxscwotLy8gYmVsb3cgMTI4LCByYW5nZV8gaXMgdXBkYXRlZCwgYW5kIGZyZXNoIGJpdHMgcmVhZCBmcm9tIHRoZSBiaXRzdHJlYW0gYXJlCi0vLyBicm91Z2h0IGluIGFzIExTQi4KLS8vIFRvIGF2b2lkIHJlYWRpbmcgdGhlIGZyZXNoIGJpdHMgb25lIGJ5IG9uZSAoc2xvdyksIHdlIGNhY2hlIGEgZmV3IG9mIHRoZW0KLS8vIGFoZWFkIChhY3R1YWxseSwgd2UgY2FjaGUgQklUUyBvZiB0aGVtIGFoZWFkLiBTZWUgYmVsb3cpLiBUaGVyZSdzIHR3bwotLy8gc3RyYXRlZ2llcyByZWdhcmRpbmcgaG93IHRvIHNoaWZ0IHRoZXNlIGxvb2tlZC1haGVhZCBmcmVzaCBiaXRzIGludG8gdGhlCi0vLyA4Yml0IHdpbmRvdyBvZiB2YWx1ZV86IGVpdGhlciB3ZSBzaGlmdCB0aGVtIGluLCB3aGlsZSBrZWVwaW5nIHRoZSBwb3NpdGlvbiBvZgotLy8gdGhlIHdpbmRvdyBmaXhlZC4gT3Igd2Ugc2xpZGUgdGhlIHdpbmRvdyB0byB0aGUgcmlnaHQgd2hpbGUga2VlcGluZyB0aGUgY2FjaGUKLS8vIGJpdHMgYXQgYSBmaXhlZCwgcmlnaHQtanVzdGlmaWVkLCBwb3NpdGlvbi4KLS8vCi0vLyAgRXhhbXBsZSwgZm9yIEJJVFM9MTY6IGhlcmUgaXMgdGhlIGNvbnRlbnQgb2YgdmFsdWVfIGZvciBib3RoIHN0cmF0ZWdpZXM6Ci0vLwotLy8gICAgICAgICAgIVVTRV9SSUdIVF9KVVNUSUZZICAgICAgICAgICAgfHwgICAgICAgIFVTRV9SSUdIVF9KVVNUSUZZCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotLy8gICA8LSA4YiAtPjwtIDhiIC0+PC0gQklUUyBiaXRzICAtPiAgICAgfHwgIDwtIDhiKzNiIC0+PC0gOGIgLT48LSAxMyBiaXRzIC0+Ci0vLyAgIFt1bnVzZWRdW3ZhbHVlX11bY2FjaGVkIGJpdHNdWzBdICAgICB8fCAgW3VudXNlZC4uLl1bdmFsdWVfXVtjYWNoZWQgYml0c10KLS8vICBbLi4uLi4uLi4wMHZ2dnZ2dkJCQkJCQkJCQkJCQkIwMDBdTFNCIHx8IFsuLi4uLi4uLi4uLjAwdnZ2dnZ2QkJCQkJCQkJCQkJCQl0KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0vLyBBZnRlciBjYWxsaW5nIFZQOFNoaWZ0KCksIHdoZXJlIHdlIG5lZWQgdG8gc2hpZnQgYXdheSB0d28gemVyb3M6Ci0vLyAgWy4uLi4uLi4udnZ2dnZ2dnZCQkJCQkJCQkJCQjAwMDAwXUxTQiB8fCBbLi4uLi4uLi4uLi4uLnZ2dnZ2dnZ2QkJCQkJCQkJCQkJdCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotLy8gSnVzdCBiZWZvcmUgd2UgbmVlZCB0byBjYWxsIFZQOExvYWROZXdCeXRlcygpLCB0aGUgc2l0dWF0aW9uIGlzOgotLy8gIFsuLi4uLi4uLnZ2dnZ2djAwMDAwMDAwMDAwMDAwMDAwMF1MU0IgfHwgWy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4udnZ2dnZ2XQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLS8vIEFuZCBqdXN0IGFmdGVyIGNhbGxpbmcgVlA4TG9hZE5ld0J5dGVzKCk6Ci0vLyAgWy4uLi4uLi4udnZ2dnZ2dnZCQkJCQkJCQkJCQkJCQkJCXUxTQiB8fCBbLi4uLi4uLi52dnZ2dnZ2dkJCQkJCQkJCQkJCQkJCQkJdCi0vLwotLy8gLT4gd2UncmUgYmFjayB0byBoZWlnaHQgYWN0aXZlICd2YWx1ZV8nIGJpdHMgKG1hcmtlZCAndicpIGFuZCBCSVRTIGNhY2hlZAotLy8gYml0cyAobWFya2VkICdCJykKLS8vCi0vLyBUaGUgcmlnaHQtanVzdGlmeSBzdHJhdGVneSB0ZW5kcyB0byB1c2UgbGVzcyBzaGlmdHMgYW5kIGlzIG9mdGVuIGZhc3Rlci4KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJJVFMgY2FuIGJlIGFueSBtdWx0aXBsZSBvZiA4IGZyb20gOCB0byA1NiAoaW5jbHVzaXZlKS4KLS8vIFBpY2sgdmFsdWVzIHRoYXQgZml0IG5hdHVyYWwgcmVnaXN0ZXIgc2l6ZS4KLQotI2lmICFkZWZpbmVkKFdFQlBfUkVGRVJFTkNFX0lNUExFTUVOVEFUSU9OKQotCi0jZGVmaW5lIFVTRV9SSUdIVF9KVVNUSUZZCi0KLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9NX0lYODYpICAgICAgLy8geDg2IDMyYml0Ci0jZGVmaW5lIEJJVFMgMTYKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfTV9YNjQpICAgLy8geDg2IDY0Yml0Ci0jZGVmaW5lIEJJVFMgNTYKLSNlbGlmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfTV9BUk0pICAgICAgLy8gQVJNCi0jZGVmaW5lIEJJVFMgMjQKLSNlbHNlICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdAotI2RlZmluZSBCSVRTIDI0Ci0jZW5kaWYKLQotI2Vsc2UgICAgIC8vIHJlZmVyZW5jZSBjaG9pY2VzCi0KLSNkZWZpbmUgVVNFX1JJR0hUX0pVU1RJRlkKLSNkZWZpbmUgQklUUyA4Ci0KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVyaXZlZCB0eXBlcyBhbmQgY29uc3RhbnRzCi0KLS8vIGJpdF90ID0gbmF0dXJhbCByZWdpc3RlciB0eXBlCi0vLyBsYml0X3QgPSBuYXR1cmFsIHR5cGUgZm9yIG1lbW9yeSBJL08KLQotI2lmIChCSVRTID4gMzIpCi10eXBlZGVmIHVpbnQ2NF90IGJpdF90OwotdHlwZWRlZiB1aW50NjRfdCBsYml0X3Q7Ci0jZWxpZiAoQklUUyA9PSAzMikKLXR5cGVkZWYgdWludDY0X3QgYml0X3Q7Ci10eXBlZGVmIHVpbnQzMl90IGxiaXRfdDsKLSNlbGlmIChCSVRTID09IDI0KQotdHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKLXR5cGVkZWYgdWludDMyX3QgbGJpdF90OwotI2VsaWYgKEJJVFMgPT0gMTYpCi10eXBlZGVmIHVpbnQzMl90IGJpdF90OwotdHlwZWRlZiB1aW50MTZfdCBsYml0X3Q7Ci0jZWxzZQotdHlwZWRlZiB1aW50MzJfdCBiaXRfdDsKLXR5cGVkZWYgdWludDhfdCBsYml0X3Q7Ci0jZW5kaWYKLQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotdHlwZWRlZiBiaXRfdCByYW5nZV90OyAgICAgLy8gdHlwZSBmb3Igc3RvcmluZyByYW5nZV8KLSNkZWZpbmUgTUFTSyAoKCgoYml0X3QpMSkgPDwgKEJJVFMpKSAtIDEpCi0jZWxzZQotdHlwZWRlZiB1aW50MzJfdCByYW5nZV90OyAgLy8gcmFuZ2VfIG9ubHkgdXNlcyA4Yml0cyBoZXJlLiBObyBuZWVkIGZvciBiaXRfdC4KLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQml0cmVhZGVyCi0KLXR5cGVkZWYgc3RydWN0IFZQOEJpdFJlYWRlciBWUDhCaXRSZWFkZXI7Ci1zdHJ1Y3QgVlA4Qml0UmVhZGVyIHsKLSAgY29uc3QgdWludDhfdCogYnVmXzsgICAgICAgIC8vIG5leHQgYnl0ZSB0byBiZSByZWFkCi0gIGNvbnN0IHVpbnQ4X3QqIGJ1Zl9lbmRfOyAgICAvLyBlbmQgb2YgcmVhZCBidWZmZXIKLSAgaW50IGVvZl87ICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgaW5wdXQgaXMgZXhoYXVzdGVkCi0KLSAgLy8gYm9vbGVhbiBkZWNvZGVyCi0gIHJhbmdlX3QgcmFuZ2VfOyAgICAgICAgICAgIC8vIGN1cnJlbnQgcmFuZ2UgbWludXMgMS4gSW4gWzEyNywgMjU0XSBpbnRlcnZhbC4KLSAgYml0X3QgdmFsdWVfOyAgICAgICAgICAgICAgLy8gY3VycmVudCB2YWx1ZQotICBpbnQgYml0c187ICAgICAgICAgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgYml0cyBsZWZ0Ci19OwotCi0vLyBJbml0aWFsaXplIHRoZSBiaXQgcmVhZGVyIGFuZCB0aGUgYm9vbGVhbiBkZWNvZGVyLgotdm9pZCBWUDhJbml0Qml0UmVhZGVyKFZQOEJpdFJlYWRlciogY29uc3QgYnIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IGVuZCk7Ci0KLS8vIHJldHVybiB0aGUgbmV4dCB2YWx1ZSBtYWRlIG9mICdudW1fYml0cycgYml0cwotdWludDMyX3QgVlA4R2V0VmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKLXN0YXRpYyBXRUJQX0lOTElORSB1aW50MzJfdCBWUDhHZXQoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotICByZXR1cm4gVlA4R2V0VmFsdWUoYnIsIDEpOwotfQotCi0vLyByZXR1cm4gdGhlIG5leHQgdmFsdWUgd2l0aCBzaWduLWV4dGVuc2lvbi4KLWludDMyX3QgVlA4R2V0U2lnbmVkVmFsdWUoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKTsKLQotLy8gUmVhZCBhIGJpdCB3aXRoIHByb2JhICdwcm9iJy4gU3BlZWQtY3JpdGljYWwgZnVuY3Rpb24hCi1leHRlcm4gY29uc3QgdWludDhfdCBrVlA4TG9nMlJhbmdlWzEyOF07Ci1leHRlcm4gY29uc3QgcmFuZ2VfdCBrVlA4TmV3UmFuZ2VbMTI4XTsKLQotdm9pZCBWUDhMb2FkRmluYWxCeXRlcyhWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKTsgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB0aGUgdGFpbAotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhMb2FkTmV3Qnl0ZXMoVlA4Qml0UmVhZGVyKiBjb25zdCBicikgewotICBTQl9EQ0hFQ0soYnIgIT0gTlVMTCAmJiBici0+YnVmXyAhPSBOVUxMKTsKLSAgLy8gUmVhZCAnQklUUycgYml0cyBhdCBhIHRpbWUgaWYgcG9zc2libGUuCi0gIGlmIChici0+YnVmXyArIHNpemVvZihsYml0X3QpIDw9IGJyLT5idWZfZW5kXykgewotICAgIC8vIGNvbnZlcnQgbWVtb3J5IHR5cGUgdG8gcmVnaXN0ZXIgdHlwZSAod2l0aCBzb21lIHplcm8naW5nISkKLSAgICBiaXRfdCBiaXRzOwotICAgIGxiaXRfdCBpbl9iaXRzID0gKihsYml0X3QqKWJyLT5idWZfOwotICAgIGJyLT5idWZfICs9IChCSVRTKSA+PiAzOwotI2lmICFkZWZpbmVkKF9fQklHX0VORElBTl9fKQotI2lmIChCSVRTID4gMzIpCi0vLyBnY2MgNC4zIGhhcyBidWlsdGluIGZ1bmN0aW9ucyBmb3Igc3dhcDMyL3N3YXA2NAotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotICAgIGJpdHMgPSBTYkJ5dGVTd2FwVTY0KGluX2JpdHMpOwotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgXAotICAgICAgICAgICAoX19HTlVDX18gPiA0IHx8IChfX0dOVUNfXyA9PSA0ICYmIF9fR05VQ19NSU5PUl9fID49IDMpKQotICAgIGJpdHMgPSAoYml0X3QpX19idWlsdGluX2Jzd2FwNjQoaW5fYml0cyk7Ci0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgIGJpdHMgPSAoYml0X3QpX2J5dGVzd2FwX3VpbnQ2NChpbl9iaXRzKTsKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLSAgICBfX2FzbV9fIHZvbGF0aWxlKCJic3dhcHEgJTAiIDogIj1yIihiaXRzKSA6ICIwIihpbl9iaXRzKSk7Ci0jZWxzZSAgLy8gZ2VuZXJpYyBjb2RlIGZvciBzd2FwcGluZyA2NC1iaXQgdmFsdWVzIChzdWdnZXN0ZWQgYnkgYmRiQCkKLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmZmZmZmZmYwMDAwMDAwMHVsbCkgPj4gMzIpIHwKLSAgICAgICAgICAgKChiaXRzICYgMHgwMDAwMDAwMGZmZmZmZmZmdWxsKSA8PCAzMik7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmZmZjAwMDBmZmZmMDAwMHVsbCkgPj4gMTYpIHwKLSAgICAgICAgICAgKChiaXRzICYgMHgwMDAwZmZmZjAwMDBmZmZmdWxsKSA8PCAxNik7Ci0gICAgYml0cyA9ICgoYml0cyAmIDB4ZmYwMGZmMDBmZjAwZmYwMHVsbCkgPj4gOCkgfAotICAgICAgICAgICAoKGJpdHMgJiAweDAwZmYwMGZmMDBmZjAwZmZ1bGwpIDw8IDgpOwotI2VuZGlmCi0gICAgYml0cyA+Pj0gNjQgLSBCSVRTOwotI2VsaWYgKEJJVFMgPj0gMjQpCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0gICAgYml0cyA9IFNiQnl0ZVN3YXBVMzIoaW5fYml0cyk7Ci0jZWxpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0gICAgX19hc21fXyB2b2xhdGlsZSgiYnN3YXAgJWswIiA6ICI9ciIoaW5fYml0cykgOiAiMCIoaW5fYml0cykpOwotICAgIGJpdHMgPSAoYml0X3QpaW5fYml0czsgICAvLyAyNGIvMzJiIC0+IDMyYi82NGIgemVyby1leHRlbnNpb24KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpCi0gICAgYml0cyA9IChiaXRfdClfYnl0ZXN3YXBfdWxvbmcoaW5fYml0cyk7Ci0jZWxzZQotICAgIGJpdHMgPSAoYml0X3QpKGluX2JpdHMgPj4gMjQpIHwgKChpbl9iaXRzID4+IDgpICYgMHhmZjAwKQotICAgICAgICAgfCAoKGluX2JpdHMgPDwgOCkgJiAweGZmMDAwMCkgIHwgKGluX2JpdHMgPDwgMjQpOwotI2VuZGlmICAvLyB4ODYKLSAgICBiaXRzID4+PSAoMzIgLSBCSVRTKTsKLSNlbGlmIChCSVRTID09IDE2KQotICAgIC8vIGdjYyB3aWxsIHJlY29nbml6ZSBhICdyb3J3ICQ4LCAuLi4nIGhlcmU6Ci0gICAgYml0cyA9IChiaXRfdCkoaW5fYml0cyA+PiA4KSB8ICgoaW5fYml0cyAmIDB4ZmYpIDw8IDgpOwotI2Vsc2UgICAvLyBCSVRTID09IDgKLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0jZW5kaWYKLSNlbHNlICAgIC8vIEJJR19FTkRJQU4KLSAgICBiaXRzID0gKGJpdF90KWluX2JpdHM7Ci0gICAgaWYgKEJJVFMgIT0gOCAqIHNpemVvZihiaXRfdCkpIGJpdHMgPj49ICg4ICogc2l6ZW9mKGJpdF90KSAtIEJJVFMpOwotI2VuZGlmCi0jaWZuZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gICAgYnItPnZhbHVlXyB8PSBiaXRzIDw8ICgtYnItPmJpdHNfKTsKLSNlbHNlCi0gICAgYnItPnZhbHVlXyA9IGJpdHMgfCAoYnItPnZhbHVlXyA8PCAoQklUUykpOwotI2VuZGlmCi0gICAgYnItPmJpdHNfICs9IChCSVRTKTsKLSAgfSBlbHNlIHsKLSAgICBWUDhMb2FkRmluYWxCeXRlcyhicik7ICAgIC8vIG5vIG5lZWQgdG8gYmUgaW5saW5lZAotICB9Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4Qml0VXBkYXRlKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIHJhbmdlX3Qgc3BsaXQpIHsKLSAgaWYgKGJyLT5iaXRzXyA8IDApIHsgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgbGVhc3QgQklUUyBiaXRzIGluICd2YWx1ZV8nCi0gICAgVlA4TG9hZE5ld0J5dGVzKGJyKTsKLSAgfQotI2lmbmRlZiBVU0VfUklHSFRfSlVTVElGWQotICBzcGxpdCB8PSAoTUFTSyk7Ci0gIGlmIChici0+dmFsdWVfID4gc3BsaXQpIHsKLSAgICBici0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgICBici0+dmFsdWVfIC09IHNwbGl0ICsgMTsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICBici0+cmFuZ2VfID0gc3BsaXQ7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSNlbHNlCi0gIHsKLSAgICBjb25zdCBpbnQgcG9zID0gYnItPmJpdHNfOwotICAgIGNvbnN0IHJhbmdlX3QgdmFsdWUgPSAocmFuZ2VfdCkoYnItPnZhbHVlXyA+PiBwb3MpOwotICAgIGlmICh2YWx1ZSA+IHNwbGl0KSB7Ci0gICAgICBici0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgICAgIGJyLT52YWx1ZV8gLT0gKGJpdF90KShzcGxpdCArIDEpIDw8IHBvczsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBici0+cmFuZ2VfID0gc3BsaXQ7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLSNlbmRpZgotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgdm9pZCBWUDhTaGlmdChWUDhCaXRSZWFkZXIqIGNvbnN0IGJyKSB7Ci0jaWZuZGVmIFVTRV9SSUdIVF9KVVNUSUZZCi0gIC8vIHJhbmdlXyBpcyBpbiBbMC4uMTI3XSBpbnRlcnZhbCBoZXJlLgotICBjb25zdCBiaXRfdCBpZHggPSBici0+cmFuZ2VfID4+IChCSVRTKTsKLSAgY29uc3QgaW50IHNoaWZ0ID0ga1ZQOExvZzJSYW5nZVtpZHhdOwotICBici0+cmFuZ2VfID0ga1ZQOE5ld1JhbmdlW2lkeF07Ci0gIGJyLT52YWx1ZV8gPDw9IHNoaWZ0OwotICBici0+Yml0c18gLT0gc2hpZnQ7Ci0jZWxzZQotICBjb25zdCBpbnQgc2hpZnQgPSBrVlA4TG9nMlJhbmdlW2JyLT5yYW5nZV9dOwotICBTQl9EQ0hFQ0soYnItPnJhbmdlXyA8IChyYW5nZV90KTEyOCk7Ci0gIGJyLT5yYW5nZV8gPSBrVlA4TmV3UmFuZ2VbYnItPnJhbmdlX107Ci0gIGJyLT5iaXRzXyAtPSBzaGlmdDsKLSNlbmRpZgotfQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBWUDhHZXRCaXQoVlA4Qml0UmVhZGVyKiBjb25zdCBiciwgaW50IHByb2IpIHsKLSNpZm5kZWYgVVNFX1JJR0hUX0pVU1RJRlkKLSAgLy8gSXQncyBpbXBvcnRhbnQgdG8gYXZvaWQgZ2VuZXJhdGluZyBhIDY0Yml0IHggNjRiaXQgbXVsdGlwbHkgaGVyZS4KLSAgLy8gV2UganVzdCBuZWVkIGFuIDhiIHggOGIgYWZ0ZXIgYWxsLgotICBjb25zdCByYW5nZV90IHNwbGl0ID0KLSAgICAgIChyYW5nZV90KSgodWludDMyX3QpKGJyLT5yYW5nZV8gPj4gKEJJVFMpKSAqIHByb2IpIDw8ICgoQklUUykgLSA4KTsKLSAgY29uc3QgaW50IGJpdCA9IFZQOEJpdFVwZGF0ZShiciwgc3BsaXQpOwotICBpZiAoYnItPnJhbmdlXyA8PSAoKChyYW5nZV90KTB4N2UgPDwgKEJJVFMpKSB8IChNQVNLKSkpIHsKLSAgICBWUDhTaGlmdChicik7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLSNlbHNlCi0gIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAoYnItPnJhbmdlXyAqIHByb2IpID4+IDg7Ci0gIGNvbnN0IGludCBiaXQgPSBWUDhCaXRVcGRhdGUoYnIsIHNwbGl0KTsKLSAgaWYgKGJyLT5yYW5nZV8gPD0gKHJhbmdlX3QpMHg3ZSkgewotICAgIFZQOFNoaWZ0KGJyKTsKLSAgfQotICByZXR1cm4gYml0OwotI2VuZGlmCi19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgVlA4R2V0U2lnbmVkKFZQOEJpdFJlYWRlciogY29uc3QgYnIsIGludCB2KSB7Ci0gIGNvbnN0IHJhbmdlX3Qgc3BsaXQgPSAoYnItPnJhbmdlXyA+PiAxKTsKLSAgY29uc3QgaW50IGJpdCA9IFZQOEJpdFVwZGF0ZShiciwgc3BsaXQpOwotICBWUDhTaGlmdChicik7Ci0gIHJldHVybiBiaXQgPyAtdiA6IHY7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJpdHJlYWRlciBmb3IgbG9zc2xlc3MgZm9ybWF0Ci0KLXR5cGVkZWYgdWludDY0X3QgdnA4bF92YWxfdDsgIC8vIHJpZ2h0IG5vdywgdGhpcyBiaXQtcmVhZGVyIGNhbiBvbmx5IHVzZSA2NGJpdC4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB2cDhsX3ZhbF90ICAgICB2YWxfOyAgICAgICAgLy8gcHJlLWZldGNoZWQgYml0cwotICBjb25zdCB1aW50OF90KiBidWZfOyAgICAgICAgLy8gaW5wdXQgYnl0ZSBidWZmZXIKLSAgc2l6ZV90ICAgICAgICAgbGVuXzsgICAgICAgIC8vIGJ1ZmZlciBsZW5ndGgKLSAgc2l6ZV90ICAgICAgICAgcG9zXzsgICAgICAgIC8vIGJ5dGUgcG9zaXRpb24gaW4gYnVmXwotICBpbnQgICAgICAgICAgICBiaXRfcG9zXzsgICAgLy8gY3VycmVudCBiaXQtcmVhZGluZyBwb3NpdGlvbiBpbiB2YWxfCi0gIGludCAgICAgICAgICAgIGVvc187ICAgICAgICAvLyBiaXRzdHJlYW0gaXMgZmluaXNoZWQKLSAgaW50ICAgICAgICAgICAgZXJyb3JfOyAgICAgIC8vIGFuIGVycm9yIG9jY3VycmVkIChidWZmZXIgb3ZlcmZsb3cgYXR0ZW1wdC4uLikKLX0gVlA4TEJpdFJlYWRlcjsKLQotdm9pZCBWUDhMSW5pdEJpdFJlYWRlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3Qgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpOwotCi0vLyAgU2V0cyBhIG5ldyBkYXRhIGJ1ZmZlci4KLXZvaWQgVlA4TEJpdFJlYWRlclNldEJ1ZmZlcihWUDhMQml0UmVhZGVyKiBjb25zdCBiciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwotCi0vLyBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGZyb20gUmVhZCBCdWZmZXIuCi0vLyBGbGFncyBhbiBlcnJvciBpbiBjYXNlIGVuZF9vZl9zdHJlYW0gb3Igbl9iaXRzIGlzIG1vcmUgdGhhbiBhbGxvd2VkIGxpbWl0LgotLy8gRmxhZ3MgZW9zIGlmIHRoaXMgcmVhZCBhdHRlbXB0IGlzIGdvaW5nIHRvIGNyb3NzIHRoZSByZWFkIGJ1ZmZlci4KLXVpbnQzMl90IFZQOExSZWFkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG5fYml0cyk7Ci0KLS8vIFJldHVybiB0aGUgcHJlZmV0Y2hlZCBiaXRzLCBzbyB0aGV5IGNhbiBiZSBsb29rZWQgdXAuCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDMyX3QgVlA4TFByZWZldGNoQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBicikgewotICByZXR1cm4gKHVpbnQzMl90KShici0+dmFsXyA+PiBici0+Yml0X3Bvc18pOwotfQotCi0vLyBEaXNjYXJkICdudW1fYml0cycgYml0cyBmcm9tIHRoZSBjYWNoZS4KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFZQOExEaXNjYXJkQml0cyhWUDhMQml0UmVhZGVyKiBjb25zdCBiciwgaW50IG51bV9iaXRzKSB7Ci0gIGJyLT5iaXRfcG9zXyArPSBudW1fYml0czsKLX0KLQotLy8gQWR2YW5jZXMgdGhlIFJlYWQgYnVmZmVyIGJ5IDQgYnl0ZXMgdG8gbWFrZSByb29tIGZvciByZWFkaW5nIG5leHQgMzIgYml0cy4KLXZvaWQgVlA4TEZpbGxCaXRXaW5kb3coVlA4TEJpdFJlYWRlciogY29uc3QgYnIpOwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9SRUFERVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlMWNkMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9iaXRfd3JpdGVyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIEJpdCB3cml0aW5nIGFuZCBib29sZWFuIGNvZGVyCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLS8vICAgICAgICAgVmlrYXMgQXJvcmEgKHZpa2Fhcy5hcm9yYUBnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4gICAvLyBmb3IgbWVtY3B5KCkKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi9iaXRfd3JpdGVyLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVlA4Qml0V3JpdGVyCi0KLXN0YXRpYyBpbnQgQml0V3JpdGVyUmVzaXplKFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7Ci0gIHVpbnQ4X3QqIG5ld19idWY7Ci0gIHNpemVfdCBuZXdfc2l6ZTsKLSAgY29uc3QgdWludDY0X3QgbmVlZGVkX3NpemVfNjRiID0gKHVpbnQ2NF90KWJ3LT5wb3NfICsgZXh0cmFfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IG5lZWRlZF9zaXplID0gKHNpemVfdCluZWVkZWRfc2l6ZV82NGI7Ci0gIGlmIChuZWVkZWRfc2l6ZV82NGIgIT0gbmVlZGVkX3NpemUpIHsKLSAgICBidy0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAobmVlZGVkX3NpemUgPD0gYnctPm1heF9wb3NfKSByZXR1cm4gMTsKLSAgLy8gSWYgdGhlIGZvbGxvd2luZyBsaW5lIHdyYXBzIG92ZXIgMzJiaXQsIHRoZSB0ZXN0IGp1c3QgYWZ0ZXIgd2lsbCBjYXRjaCBpdC4KLSAgbmV3X3NpemUgPSAyICogYnctPm1heF9wb3NfOwotICBpZiAobmV3X3NpemUgPCBuZWVkZWRfc2l6ZSkgbmV3X3NpemUgPSBuZWVkZWRfc2l6ZTsKLSAgaWYgKG5ld19zaXplIDwgMTAyNCkgbmV3X3NpemUgPSAxMDI0OwotICBuZXdfYnVmID0gKHVpbnQ4X3QqKVNiTWVtb3J5QWxsb2NhdGUobmV3X3NpemUpOwotICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7Ci0gICAgYnctPmVycm9yXyA9IDE7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgU2JNZW1vcnlDb3B5KG5ld19idWYsIGJ3LT5idWZfLCBidy0+cG9zXyk7Ci0gIFNiTWVtb3J5RGVhbGxvY2F0ZShidy0+YnVmXyk7Ci0gIGJ3LT5idWZfID0gbmV3X2J1ZjsKLSAgYnctPm1heF9wb3NfID0gbmV3X3NpemU7Ci0gIHJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBrRmx1c2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBjb25zdCBpbnQgcyA9IDggKyBidy0+bmJfYml0c187Ci0gIGNvbnN0IGludDMyX3QgYml0cyA9IGJ3LT52YWx1ZV8gPj4gczsKLSAgU0JfRENIRUNLKGJ3LT5uYl9iaXRzXyA+PSAwKTsKLSAgYnctPnZhbHVlXyAtPSBiaXRzIDw8IHM7Ci0gIGJ3LT5uYl9iaXRzXyAtPSA4OwotICBpZiAoKGJpdHMgJiAweGZmKSAhPSAweGZmKSB7Ci0gICAgc2l6ZV90IHBvcyA9IGJ3LT5wb3NfOwotICAgIGlmICghQml0V3JpdGVyUmVzaXplKGJ3LCBidy0+cnVuXyArIDEpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChiaXRzICYgMHgxMDApIHsgIC8vIG92ZXJmbG93IC0+IHByb3BhZ2F0ZSBjYXJyeSBvdmVyIHBlbmRpbmcgMHhmZidzCi0gICAgICBpZiAocG9zID4gMCkgYnctPmJ1Zl9bcG9zIC0gMV0rKzsKLSAgICB9Ci0gICAgaWYgKGJ3LT5ydW5fID4gMCkgewotICAgICAgY29uc3QgaW50IHZhbHVlID0gKGJpdHMgJiAweDEwMCkgPyAweDAwIDogMHhmZjsKLSAgICAgIGZvciAoOyBidy0+cnVuXyA+IDA7IC0tYnctPnJ1bl8pIGJ3LT5idWZfW3BvcysrXSA9IHZhbHVlOwotICAgIH0KLSAgICBidy0+YnVmX1twb3MrK10gPSBiaXRzOwotICAgIGJ3LT5wb3NfID0gcG9zOwotICB9IGVsc2UgewotICAgIGJ3LT5ydW5fKys7ICAgLy8gZGVsYXkgd3JpdGluZyBvZiBieXRlcyAweGZmLCBwZW5kaW5nIGV2ZW50dWFsIGNhcnJ5LgotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyByZW5vcm1hbGl6YXRpb24KLQotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05vcm1bMTI4XSA9IHsgIC8vIHJlbm9ybV9zaXplc1tpXSA9IDggLSBsb2cyKGkpCi0gICAgIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gIDAKLX07Ci0KLS8vIHJhbmdlID0gKChyYW5nZSArIDEpIDw8IGtWUDhMb2cyUmFuZ2VbcmFuZ2VdKSAtIDEKLXN0YXRpYyBjb25zdCB1aW50OF90IGtOZXdSYW5nZVsxMjhdID0gewotICAxMjcsIDEyNywgMTkxLCAxMjcsIDE1OSwgMTkxLCAyMjMsIDEyNywgMTQzLCAxNTksIDE3NSwgMTkxLCAyMDcsIDIyMywgMjM5LAotICAxMjcsIDEzNSwgMTQzLCAxNTEsIDE1OSwgMTY3LCAxNzUsIDE4MywgMTkxLCAxOTksIDIwNywgMjE1LCAyMjMsIDIzMSwgMjM5LAotICAyNDcsIDEyNywgMTMxLCAxMzUsIDEzOSwgMTQzLCAxNDcsIDE1MSwgMTU1LCAxNTksIDE2MywgMTY3LCAxNzEsIDE3NSwgMTc5LAotICAxODMsIDE4NywgMTkxLCAxOTUsIDE5OSwgMjAzLCAyMDcsIDIxMSwgMjE1LCAyMTksIDIyMywgMjI3LCAyMzEsIDIzNSwgMjM5LAotICAyNDMsIDI0NywgMjUxLCAxMjcsIDEyOSwgMTMxLCAxMzMsIDEzNSwgMTM3LCAxMzksIDE0MSwgMTQzLCAxNDUsIDE0NywgMTQ5LAotICAxNTEsIDE1MywgMTU1LCAxNTcsIDE1OSwgMTYxLCAxNjMsIDE2NSwgMTY3LCAxNjksIDE3MSwgMTczLCAxNzUsIDE3NywgMTc5LAotICAxODEsIDE4MywgMTg1LCAxODcsIDE4OSwgMTkxLCAxOTMsIDE5NSwgMTk3LCAxOTksIDIwMSwgMjAzLCAyMDUsIDIwNywgMjA5LAotICAyMTEsIDIxMywgMjE1LCAyMTcsIDIxOSwgMjIxLCAyMjMsIDIyNSwgMjI3LCAyMjksIDIzMSwgMjMzLCAyMzUsIDIzNywgMjM5LAotICAyNDEsIDI0MywgMjQ1LCAyNDcsIDI0OSwgMjUxLCAyNTMsIDEyNwotfTsKLQotaW50IFZQOFB1dEJpdChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgYml0LCBpbnQgcHJvYikgewotICBjb25zdCBpbnQgc3BsaXQgPSAoYnctPnJhbmdlXyAqIHByb2IpID4+IDg7Ci0gIGlmIChiaXQpIHsKLSAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKLSAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgfSBlbHNlIHsKLSAgICBidy0+cmFuZ2VfID0gc3BsaXQ7Ci0gIH0KLSAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsgICAvLyBlbWl0ICdzaGlmdCcgYml0cyBvdXQgYW5kIHJlbm9ybWFsaXplCi0gICAgY29uc3QgaW50IHNoaWZ0ID0ga05vcm1bYnctPnJhbmdlX107Ci0gICAgYnctPnJhbmdlXyA9IGtOZXdSYW5nZVtidy0+cmFuZ2VfXTsKLSAgICBidy0+dmFsdWVfIDw8PSBzaGlmdDsKLSAgICBidy0+bmJfYml0c18gKz0gc2hpZnQ7Ci0gICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIGtGbHVzaChidyk7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotaW50IFZQOFB1dEJpdFVuaWZvcm0oVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IGJpdCkgewotICBjb25zdCBpbnQgc3BsaXQgPSBidy0+cmFuZ2VfID4+IDE7Ci0gIGlmIChiaXQpIHsKLSAgICBidy0+dmFsdWVfICs9IHNwbGl0ICsgMTsKLSAgICBidy0+cmFuZ2VfIC09IHNwbGl0ICsgMTsKLSAgfSBlbHNlIHsKLSAgICBidy0+cmFuZ2VfID0gc3BsaXQ7Ci0gIH0KLSAgaWYgKGJ3LT5yYW5nZV8gPCAxMjcpIHsKLSAgICBidy0+cmFuZ2VfID0ga05ld1JhbmdlW2J3LT5yYW5nZV9dOwotICAgIGJ3LT52YWx1ZV8gPDw9IDE7Ci0gICAgYnctPm5iX2JpdHNfICs9IDE7Ci0gICAgaWYgKGJ3LT5uYl9iaXRzXyA+IDApIGtGbHVzaChidyk7Ci0gIH0KLSAgcmV0dXJuIGJpdDsKLX0KLQotdm9pZCBWUDhQdXRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKSB7Ci0gIGludCBtYXNrOwotICBmb3IgKG1hc2sgPSAxIDw8IChuYl9iaXRzIC0gMSk7IG1hc2s7IG1hc2sgPj49IDEpCi0gICAgVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgJiBtYXNrKTsKLX0KLQotdm9pZCBWUDhQdXRTaWduZWRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKSB7Ci0gIGlmICghVlA4UHV0Qml0VW5pZm9ybShidywgdmFsdWUgIT0gMCkpCi0gICAgcmV0dXJuOwotICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgVlA4UHV0VmFsdWUoYncsICgoLXZhbHVlKSA8PCAxKSB8IDEsIG5iX2JpdHMgKyAxKTsKLSAgfSBlbHNlIHsKLSAgICBWUDhQdXRWYWx1ZShidywgdmFsdWUgPDwgMSwgbmJfYml0cyArIDEpOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7Ci0gIGJ3LT5yYW5nZV8gICA9IDI1NSAtIDE7Ci0gIGJ3LT52YWx1ZV8gICA9IDA7Ci0gIGJ3LT5ydW5fICAgICA9IDA7Ci0gIGJ3LT5uYl9iaXRzXyA9IC04OwotICBidy0+cG9zXyAgICAgPSAwOwotICBidy0+bWF4X3Bvc18gPSAwOwotICBidy0+ZXJyb3JfICAgPSAwOwotICBidy0+YnVmXyAgICAgPSBOVUxMOwotICByZXR1cm4gKGV4cGVjdGVkX3NpemUgPiAwKSA/IEJpdFdyaXRlclJlc2l6ZShidywgZXhwZWN0ZWRfc2l6ZSkgOiAxOwotfQotCi11aW50OF90KiBWUDhCaXRXcml0ZXJGaW5pc2goVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBWUDhQdXRWYWx1ZShidywgMCwgOSAtIGJ3LT5uYl9iaXRzXyk7Ci0gIGJ3LT5uYl9iaXRzXyA9IDA7ICAgLy8gcGFkIHdpdGggemVyb2VzCi0gIGtGbHVzaChidyk7Ci0gIHJldHVybiBidy0+YnVmXzsKLX0KLQotaW50IFZQOEJpdFdyaXRlckFwcGVuZChWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICBTQl9EQ0hFQ0soZGF0YSk7Ci0gIGlmIChidy0+bmJfYml0c18gIT0gLTgpIHJldHVybiAwOyAgIC8vIGtGbHVzaCgpIG11c3QgaGF2ZSBiZWVuIGNhbGxlZAotICBpZiAoIUJpdFdyaXRlclJlc2l6ZShidywgc2l6ZSkpIHJldHVybiAwOwotICBTYk1lbW9yeUNvcHkoYnctPmJ1Zl8gKyBidy0+cG9zXywgZGF0YSwgc2l6ZSk7Ci0gIGJ3LT5wb3NfICs9IHNpemU7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIFZQOEJpdFdyaXRlcldpcGVPdXQoVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoYncpIHsKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoYnctPmJ1Zl8pOwotICAgIFNiTWVtb3J5U2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7Ci0gIH0KLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZQOExCaXRXcml0ZXIKLQotLy8gUmV0dXJucyAxIG9uIHN1Y2Nlc3MuCi1zdGF0aWMgaW50IFZQOExCaXRXcml0ZXJSZXNpemUoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHRyYV9zaXplKSB7Ci0gIHVpbnQ4X3QqIGFsbG9jYXRlZF9idWY7Ci0gIHNpemVfdCBhbGxvY2F0ZWRfc2l6ZTsKLSAgY29uc3Qgc2l6ZV90IGN1cnJlbnRfc2l6ZSA9IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhidyk7Ci0gIGNvbnN0IHVpbnQ2NF90IHNpemVfcmVxdWlyZWRfNjRiID0gKHVpbnQ2NF90KWN1cnJlbnRfc2l6ZSArIGV4dHJhX3NpemU7Ci0gIGNvbnN0IHNpemVfdCBzaXplX3JlcXVpcmVkID0gKHNpemVfdClzaXplX3JlcXVpcmVkXzY0YjsKLSAgaWYgKHNpemVfcmVxdWlyZWQgIT0gc2l6ZV9yZXF1aXJlZF82NGIpIHsKLSAgICBidy0+ZXJyb3JfID0gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoYnctPm1heF9ieXRlc18gPiAwICYmIHNpemVfcmVxdWlyZWQgPD0gYnctPm1heF9ieXRlc18pIHJldHVybiAxOwotICBhbGxvY2F0ZWRfc2l6ZSA9ICgzICogYnctPm1heF9ieXRlc18pID4+IDE7Ci0gIGlmIChhbGxvY2F0ZWRfc2l6ZSA8IHNpemVfcmVxdWlyZWQpIGFsbG9jYXRlZF9zaXplID0gc2l6ZV9yZXF1aXJlZDsKLSAgLy8gbWFrZSBhbGxvY2F0ZWQgc2l6ZSBtdWx0aXBsZSBvZiAxawotICBhbGxvY2F0ZWRfc2l6ZSA9ICgoKGFsbG9jYXRlZF9zaXplID4+IDEwKSArIDEpIDw8IDEwKTsKLSAgYWxsb2NhdGVkX2J1ZiA9ICh1aW50OF90KilTYk1lbW9yeUFsbG9jYXRlKGFsbG9jYXRlZF9zaXplKTsKLSAgaWYgKGFsbG9jYXRlZF9idWYgPT0gTlVMTCkgewotICAgIGJ3LT5lcnJvcl8gPSAxOwotICAgIHJldHVybiAwOwotICB9Ci0gIFNiTWVtb3J5Q29weShhbGxvY2F0ZWRfYnVmLCBidy0+YnVmXywgY3VycmVudF9zaXplKTsKLSAgU2JNZW1vcnlEZWFsbG9jYXRlKGJ3LT5idWZfKTsKLSAgYnctPmJ1Zl8gPSBhbGxvY2F0ZWRfYnVmOwotICBidy0+bWF4X2J5dGVzXyA9IGFsbG9jYXRlZF9zaXplOwotICBTYk1lbW9yeVNldChhbGxvY2F0ZWRfYnVmICsgY3VycmVudF9zaXplLCAwLCBhbGxvY2F0ZWRfc2l6ZSAtIGN1cnJlbnRfc2l6ZSk7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKSB7Ci0gIFNiTWVtb3J5U2V0KGJ3LCAwLCBzaXplb2YoKmJ3KSk7Ci0gIHJldHVybiBWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCBleHBlY3RlZF9zaXplKTsKLX0KLQotdm9pZCBWUDhMQml0V3JpdGVyRGVzdHJveShWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICBpZiAoYncgIT0gTlVMTCkgewotICAgIFNiTWVtb3J5RGVhbGxvY2F0ZShidy0+YnVmXyk7Ci0gICAgU2JNZW1vcnlTZXQoYncsIDAsIHNpemVvZigqYncpKTsKLSAgfQotfQotCi12b2lkIFZQOExXcml0ZUJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBuX2JpdHMsIHVpbnQzMl90IGJpdHMpIHsKLSAgaWYgKG5fYml0cyA8IDEpIHJldHVybjsKLSNpZiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykKLSAgLy8gVGVjaG5pY2FsbHksIHRoaXMgYnJhbmNoIG9mIHRoZSBjb2RlIGNhbiB3cml0ZSB1cCB0byAyNSBiaXRzIGF0IGEgdGltZSwKLSAgLy8gYnV0IGluIHByZWZpeCBlbmNvZGluZywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBpcyAxOCBhdCBhIHRpbWUuCi0gIHsKLSAgICB1aW50OF90KiBjb25zdCBwID0gJmJ3LT5idWZfW2J3LT5iaXRfcG9zXyA+PiAzXTsKLSAgICB1aW50MzJfdCB2ID0gKihjb25zdCB1aW50MzJfdCopcDsKLSAgICB2IHw9IGJpdHMgPDwgKGJ3LT5iaXRfcG9zXyAmIDcpOwotICAgICoodWludDMyX3QqKXAgPSB2OwotICAgIGJ3LT5iaXRfcG9zXyArPSBuX2JpdHM7Ci0gIH0KLSNlbHNlICAvLyBCSUdfRU5ESUFOCi0gIHsKLSAgICB1aW50OF90KiBwID0gJmJ3LT5idWZfW2J3LT5iaXRfcG9zXyA+PiAzXTsKLSAgICBjb25zdCBpbnQgYml0c19yZXNlcnZlZF9pbl9maXJzdF9ieXRlID0gYnctPmJpdF9wb3NfICYgNzsKLSAgICBjb25zdCBpbnQgYml0c19sZWZ0X3RvX3dyaXRlID0gbl9iaXRzIC0gOCArIGJpdHNfcmVzZXJ2ZWRfaW5fZmlyc3RfYnl0ZTsKLSAgICAvLyBpbXBsaWNpdCAmIDB4ZmYgaXMgYXNzdW1lZCBmb3IgdWludDhfdCBhcml0aG1ldGljcwotICAgICpwKysgfD0gYml0cyA8PCBiaXRzX3Jlc2VydmVkX2luX2ZpcnN0X2J5dGU7Ci0gICAgYml0cyA+Pj0gOCAtIGJpdHNfcmVzZXJ2ZWRfaW5fZmlyc3RfYnl0ZTsKLSAgICBpZiAoYml0c19sZWZ0X3RvX3dyaXRlID49IDEpIHsKLSAgICAgICpwKysgPSBiaXRzOwotICAgICAgYml0cyA+Pj0gODsKLSAgICAgIGlmIChiaXRzX2xlZnRfdG9fd3JpdGUgPj0gOSkgewotICAgICAgICAqcCsrID0gYml0czsKLSAgICAgICAgYml0cyA+Pj0gODsKLSAgICAgIH0KLSAgICB9Ci0gICAgU0JfRENIRUNLKG5fYml0cyA8PSAyNSk7Ci0gICAgKnAgPSBiaXRzOwotICAgIGJ3LT5iaXRfcG9zXyArPSBuX2JpdHM7Ci0gIH0KLSNlbmRpZgotICBpZiAoKGJ3LT5iaXRfcG9zXyA+PiAzKSA+IChidy0+bWF4X2J5dGVzXyAtIDgpKSB7Ci0gICAgY29uc3QgdWludDY0X3QgZXh0cmFfc2l6ZSA9IDMyNzY4VUxMICsgYnctPm1heF9ieXRlc187Ci0gICAgaWYgKGV4dHJhX3NpemUgIT0gKHNpemVfdClleHRyYV9zaXplIHx8Ci0gICAgICAgICFWUDhMQml0V3JpdGVyUmVzaXplKGJ3LCAoc2l6ZV90KWV4dHJhX3NpemUpKSB7Ci0gICAgICBidy0+Yml0X3Bvc18gPSAwOwotICAgICAgYnctPmVycm9yXyA9IDE7Ci0gICAgfQotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvYml0X3dyaXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmIwOTVjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2JpdF93cml0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gQml0IHdyaXRpbmcgYW5kIGJvb2xlYW4gY29kZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfQklUX1dSSVRFUl9IXwotI2RlZmluZSBXRUJQX1VUSUxTX0JJVF9XUklURVJfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCaXQtd3JpdGluZwotCi10eXBlZGVmIHN0cnVjdCBWUDhCaXRXcml0ZXIgVlA4Qml0V3JpdGVyOwotc3RydWN0IFZQOEJpdFdyaXRlciB7Ci0gIGludDMyX3QgIHJhbmdlXzsgICAgICAvLyByYW5nZS0xCi0gIGludDMyX3QgIHZhbHVlXzsKLSAgaW50ICAgICAgcnVuXzsgICAgICAgIC8vIG51bWJlciBvZiBvdXRzdGFuZGluZyBiaXRzCi0gIGludCAgICAgIG5iX2JpdHNfOyAgICAvLyBudW1iZXIgb2YgcGVuZGluZyBiaXRzCi0gIHVpbnQ4X3QqIGJ1Zl87ICAgICAgICAvLyBpbnRlcm5hbCBidWZmZXIuIFJlLWFsbG9jYXRlZCByZWd1bGFybHkuIE5vdCBvd25lZC4KLSAgc2l6ZV90ICAgcG9zXzsKLSAgc2l6ZV90ICAgbWF4X3Bvc187Ci0gIGludCAgICAgIGVycm9yXzsgICAgICAvLyB0cnVlIGluIGNhc2Ugb2YgZXJyb3IKLX07Ci0KLS8vIEluaXRpYWxpemUgdGhlIG9iamVjdC4gQWxsb2NhdGVzIHNvbWUgaW5pdGlhbCBtZW1vcnkgYmFzZWQgb24gZXhwZWN0ZWRfc2l6ZS4KLWludCBWUDhCaXRXcml0ZXJJbml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKLS8vIEZpbmFsaXplIHRoZSBiaXRzdHJlYW0gY29kaW5nLiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLgotdWludDhfdCogVlA4Qml0V3JpdGVyRmluaXNoKFZQOEJpdFdyaXRlciogY29uc3QgYncpOwotLy8gUmVsZWFzZSBhbnkgcGVuZGluZyBtZW1vcnkgYW5kIHplcm9lcyB0aGUgb2JqZWN0LiBOb3QgYSBtYW5kYXRvcnkgY2FsbC4KLS8vIE9ubHkgdXNlZnVsIGluIGNhc2Ugb2YgZXJyb3IsIHdoZW4gdGhlIGludGVybmFsIGJ1ZmZlciBoYXNuJ3QgYmVlbiBncmFiYmVkIQotdm9pZCBWUDhCaXRXcml0ZXJXaXBlT3V0KFZQOEJpdFdyaXRlciogY29uc3QgYncpOwotCi1pbnQgVlA4UHV0Qml0KFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQsIGludCBwcm9iKTsKLWludCBWUDhQdXRCaXRVbmlmb3JtKFZQOEJpdFdyaXRlciogY29uc3QgYncsIGludCBiaXQpOwotdm9pZCBWUDhQdXRWYWx1ZShWUDhCaXRXcml0ZXIqIGNvbnN0IGJ3LCBpbnQgdmFsdWUsIGludCBuYl9iaXRzKTsKLXZvaWQgVlA4UHV0U2lnbmVkVmFsdWUoVlA4Qml0V3JpdGVyKiBjb25zdCBidywgaW50IHZhbHVlLCBpbnQgbmJfYml0cyk7Ci0KLS8vIEFwcGVuZHMgc29tZSBieXRlcyB0byB0aGUgaW50ZXJuYWwgYnVmZmVyLiBEYXRhIGlzIGNvcGllZC4KLWludCBWUDhCaXRXcml0ZXJBcHBlbmQoVlA4Qml0V3JpdGVyKiBjb25zdCBidywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOwotCi0vLyByZXR1cm4gYXBwcm94aW1hdGUgd3JpdGUgcG9zaXRpb24gKGluIGJpdHMpCi1zdGF0aWMgV0VCUF9JTkxJTkUgdWludDY0X3QgVlA4Qml0V3JpdGVyUG9zKGNvbnN0IFZQOEJpdFdyaXRlciogY29uc3QgYncpIHsKLSAgcmV0dXJuICh1aW50NjRfdCkoYnctPnBvc18gKyBidy0+cnVuXykgKiA4ICsgOCArIGJ3LT5uYl9iaXRzXzsKLX0KLQotLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGludGVybmFsIGJ1ZmZlci4KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBWUDhCaXRXcml0ZXJCdWYoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gYnctPmJ1Zl87Ci19Ci0vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBidWZmZXIuCi1zdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOEJpdFdyaXRlclNpemUoY29uc3QgVlA4Qml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gYnctPnBvc187Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWUDhMQml0V3JpdGVyCi0vLyBUT0RPKHZpa2FzYSk6IFZQOExCaXRXcml0ZXIgaXMgY29waWVkIGFzLWlzIGZyb20gbG9zc2xlc3MgY29kZS4gVGhlcmUncyBzY29wZQotLy8gb2YgcmUtdXNpbmcgVlA4Qml0V3JpdGVyLiBXaWxsIGV2YWx1YXRlIG9uY2UgYmFzaWMgbG9zc2xlc3MgZW5jb2RlciBpcwotLy8gaW1wbGVtZW50ZWQuCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCogYnVmXzsKLSAgc2l6ZV90IGJpdF9wb3NfOwotICBzaXplX3QgbWF4X2J5dGVzXzsKLQotICAvLyBBZnRlciBhbGwgYml0cyBhcmUgd3JpdHRlbiwgdGhlIGNhbGxlciBtdXN0IG9ic2VydmUgdGhlIHN0YXRlIG9mCi0gIC8vIGVycm9yXy4gQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGF0IGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZQotICAvLyBoYXMgaGFwcGVuZWQgZHVyaW5nIGJpdCB3cml0aW5nLiBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHN1Y2Nlc3NmdWwKLSAgLy8gd3JpdGluZyBvZiBiaXRzLgotICBpbnQgZXJyb3JfOwotfSBWUDhMQml0V3JpdGVyOwotCi1zdGF0aWMgV0VCUF9JTkxJTkUgc2l6ZV90IFZQOExCaXRXcml0ZXJOdW1CeXRlcyhWUDhMQml0V3JpdGVyKiBjb25zdCBidykgewotICByZXR1cm4gKGJ3LT5iaXRfcG9zXyArIDcpID4+IDM7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB1aW50OF90KiBWUDhMQml0V3JpdGVyRmluaXNoKFZQOExCaXRXcml0ZXIqIGNvbnN0IGJ3KSB7Ci0gIHJldHVybiBidy0+YnVmXzsKLX0KLQotLy8gUmV0dXJucyAwIGluIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi1pbnQgVlA4TEJpdFdyaXRlckluaXQoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIHNpemVfdCBleHBlY3RlZF9zaXplKTsKLQotdm9pZCBWUDhMQml0V3JpdGVyRGVzdHJveShWUDhMQml0V3JpdGVyKiBjb25zdCBidyk7Ci0KLS8vIFRoaXMgZnVuY3Rpb24gd3JpdGVzIGJpdHMgaW50byBieXRlcyBpbiBpbmNyZWFzaW5nIGFkZHJlc3NlcywgYW5kIHdpdGhpbgotLy8gYSBieXRlIGxlYXN0LXNpZ25pZmljYW50LWJpdCBmaXJzdC4KLS8vCi0vLyBUaGUgZnVuY3Rpb24gY2FuIHdyaXRlIHVwIHRvIDE2IGJpdHMgaW4gb25lIGdvIHdpdGggV3JpdGVCaXRzCi0vLyBFeGFtcGxlOiBsZXQncyBhc3N1bWUgdGhhdCAzIGJpdHMgKFJzIGJlbG93KSBoYXZlIGJlZW4gd3JpdHRlbiBhbHJlYWR5OgotLy8KLS8vIEJZVEUtMCAgICAgQllURSsxICAgICAgIEJZVEUrMgotLy8KLS8vIDAwMDAgMFJSUiAgICAwMDAwIDAwMDAgICAgMDAwMCAwMDAwCi0vLwotLy8gTm93LCB3ZSBjb3VsZCB3cml0ZSA1IG9yIGxlc3MgYml0cyBpbiBNU0IgYnkganVzdCBzaWZ0aW5nIGJ5IDMKLS8vIGFuZCBPUidpbmcgdG8gQllURS0wLgotLy8KLS8vIEZvciBuIGJpdHMsIHdlIHRha2UgdGhlIGxhc3QgNSBieXRlcywgT1IgdGhhdCB3aXRoIGhpZ2ggYml0cyBpbiBCWVRFLTAsCi0vLyBhbmQgbG9jYXRlIHRoZSByZXN0IGluIEJZVEUrMSBhbmQgQllURSsyLgotLy8KLS8vIFZQOExCaXRXcml0ZXIncyBlcnJvcl8gZmxhZyBpcyBzZXQgaW4gY2FzZSBvZiAgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi12b2lkIFZQOExXcml0ZUJpdHMoVlA4TEJpdFdyaXRlciogY29uc3QgYncsIGludCBuX2JpdHMsIHVpbnQzMl90IGJpdHMpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX0JJVF9XUklURVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYzZjZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9maWx0ZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFNwYXRpYWwgcHJlZGljdGlvbiB1c2luZyB2YXJpb3VzIGZpbHRlcnMKLS8vCi0vLyBBdXRob3I6IFVydmFuZyAodXJ2YW5nQGdvb2dsZS5jb20pCi0KLSNpbmNsdWRlICIuL2ZpbHRlcnMuaCIKLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGVscGZ1bCBtYWNyby4KLQotIyBkZWZpbmUgU0FOSVRZX0NIRUNLKGluLCBvdXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0soaW4gIT0gTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0sob3V0ICE9IE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0sod2lkdGggPiAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0soaGVpZ2h0ID4gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBTQl9EQ0hFQ0soc3RyaWRlID49IHdpZHRoKTsKLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHJlZGljdExpbmUoY29uc3QgdWludDhfdCogc3JjLCBjb25zdCB1aW50OF90KiBwcmVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZHN0LCBpbnQgbGVuZ3RoLCBpbnQgaW52ZXJzZSkgewotICBpbnQgaTsKLSAgaWYgKGludmVyc2UpIHsKLSAgICBmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIGRzdFtpXSA9IHNyY1tpXSArIHByZWRbaV07Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSBkc3RbaV0gPSBzcmNbaV0gLSBwcmVkW2ldOwotICB9Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIb3Jpem9udGFsIGZpbHRlci4KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9Ib3Jpem9udGFsRmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7Ci0gIGludCBoOwotICBjb25zdCB1aW50OF90KiBwcmVkcyA9IChpbnZlcnNlID8gb3V0IDogaW4pOwotICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7Ci0KLSAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KLSAgZm9yIChoID0gMDsgaCA8IGhlaWdodDsgKytoKSB7Ci0gICAgLy8gTGVmdG1vc3QgcGl4ZWwgaXMgcHJlZGljdGVkIGZyb20gYWJvdmUgKGV4Y2VwdCBmb3IgdG9wbW9zdCBzY2FubGluZSkuCi0gICAgaWYgKGggPT0gMCkgewotICAgICAgb3V0WzBdID0gaW5bMF07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFByZWRpY3RMaW5lKGluLCBwcmVkcyAtIHN0cmlkZSwgb3V0LCAxLCBpbnZlcnNlKTsKLSAgICB9Ci0gICAgUHJlZGljdExpbmUoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKLSAgICBwcmVkcyArPSBzdHJpZGU7Ci0gICAgaW4gKz0gc3RyaWRlOwotICAgIG91dCArPSBzdHJpZGU7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgSG9yaXpvbnRhbEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIGZpbHRlcmVkX2RhdGEpIHsKLSAgRG9Ib3Jpem9udGFsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgZmlsdGVyZWRfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEhvcml6b250YWxVbmZpbHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogZGF0YSkgewotICBEb0hvcml6b250YWxGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAxLCBkYXRhKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFZlcnRpY2FsIGZpbHRlci4KLQotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgRG9WZXJ0aWNhbEZpbHRlcihjb25zdCB1aW50OF90KiBpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW52ZXJzZSwgdWludDhfdCogb3V0KSB7Ci0gIGludCBoOwotICBjb25zdCB1aW50OF90KiBwcmVkcyA9IChpbnZlcnNlID8gb3V0IDogaW4pOwotICBTQU5JVFlfQ0hFQ0soaW4sIG91dCk7Ci0KLSAgLy8gVmVyeSBmaXJzdCB0b3AtbGVmdCBwaXhlbCBpcyBjb3BpZWQuCi0gIG91dFswXSA9IGluWzBdOwotICAvLyBSZXN0IG9mIHRvcCBzY2FuLWxpbmUgaXMgbGVmdC1wcmVkaWN0ZWQuCi0gIFByZWRpY3RMaW5lKGluICsgMSwgcHJlZHMsIG91dCArIDEsIHdpZHRoIC0gMSwgaW52ZXJzZSk7Ci0KLSAgLy8gRmlsdGVyIGxpbmUtYnktbGluZS4KLSAgZm9yIChoID0gMTsgaCA8IGhlaWdodDsgKytoKSB7Ci0gICAgaW4gKz0gc3RyaWRlOwotICAgIG91dCArPSBzdHJpZGU7Ci0gICAgUHJlZGljdExpbmUoaW4sIHByZWRzLCBvdXQsIHdpZHRoLCBpbnZlcnNlKTsKLSAgICBwcmVkcyArPSBzdHJpZGU7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgVmVydGljYWxGaWx0ZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgdWludDhfdCogZmlsdGVyZWRfZGF0YSkgewotICBEb1ZlcnRpY2FsRmlsdGVyKGRhdGEsIHdpZHRoLCBoZWlnaHQsIHN0cmlkZSwgMCwgZmlsdGVyZWRfZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFZlcnRpY2FsVW5maWx0ZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlLCB1aW50OF90KiBkYXRhKSB7Ci0gIERvVmVydGljYWxGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAxLCBkYXRhKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdyYWRpZW50IGZpbHRlci4KLQotc3RhdGljIFdFQlBfSU5MSU5FIGludCBHcmFkaWVudFByZWRpY3Rvcih1aW50OF90IGEsIHVpbnQ4X3QgYiwgdWludDhfdCBjKSB7Ci0gIGNvbnN0IGludCBnID0gYSArIGIgLSBjOwotICByZXR1cm4gKChnICYgfjB4ZmYpID09IDApID8gZyA6IChnIDwgMCkgPyAwIDogMjU1OyAgLy8gY2xpcCB0byA4Yml0Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORQotdm9pZCBEb0dyYWRpZW50RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGluLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHN0cmlkZSwgaW50IGludmVyc2UsIHVpbnQ4X3QqIG91dCkgewotICBjb25zdCB1aW50OF90KiBwcmVkcyA9IChpbnZlcnNlID8gb3V0IDogaW4pOwotICBpbnQgaDsKLSAgU0FOSVRZX0NIRUNLKGluLCBvdXQpOwotCi0gIC8vIGxlZnQgcHJlZGljdGlvbiBmb3IgdG9wIHNjYW4tbGluZQotICBvdXRbMF0gPSBpblswXTsKLSAgUHJlZGljdExpbmUoaW4gKyAxLCBwcmVkcywgb3V0ICsgMSwgd2lkdGggLSAxLCBpbnZlcnNlKTsKLQotICAvLyBGaWx0ZXIgbGluZS1ieS1saW5lLgotICBmb3IgKGggPSAxOyBoIDwgaGVpZ2h0OyArK2gpIHsKLSAgICBpbnQgdzsKLSAgICBwcmVkcyArPSBzdHJpZGU7Ci0gICAgaW4gKz0gc3RyaWRlOwotICAgIG91dCArPSBzdHJpZGU7Ci0gICAgLy8gbGVmdG1vc3QgcGl4ZWw6IHByZWRpY3QgZnJvbSBhYm92ZS4KLSAgICBQcmVkaWN0TGluZShpbiwgcHJlZHMgLSBzdHJpZGUsIG91dCwgMSwgaW52ZXJzZSk7Ci0gICAgZm9yICh3ID0gMTsgdyA8IHdpZHRoOyArK3cpIHsKLSAgICAgIGNvbnN0IGludCBwcmVkID0gR3JhZGllbnRQcmVkaWN0b3IocHJlZHNbdyAtIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkc1t3IC0gc3RyaWRlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZHNbdyAtIHN0cmlkZSAtIDFdKTsKLSAgICAgIG91dFt3XSA9IGluW3ddICsgKGludmVyc2UgPyBwcmVkIDogLXByZWQpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBHcmFkaWVudEZpbHRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLCB1aW50OF90KiBmaWx0ZXJlZF9kYXRhKSB7Ci0gIERvR3JhZGllbnRGaWx0ZXIoZGF0YSwgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCAwLCBmaWx0ZXJlZF9kYXRhKTsKLX0KLQotc3RhdGljIHZvaWQgR3JhZGllbnRVbmZpbHRlcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsIHVpbnQ4X3QqIGRhdGEpIHsKLSAgRG9HcmFkaWVudEZpbHRlcihkYXRhLCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIDEsIGRhdGEpOwotfQotCi0jdW5kZWYgU0FOSVRZX0NIRUNLCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBRdWljayBlc3RpbWF0ZSBvZiBhIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIGZpbHRlciBtb2RlIHRvIHRyeS4KLQotI2RlZmluZSBTTUFYIDE2Ci0jZGVmaW5lIFNESUZGKGEsIGIpIChhYnMoKGEpIC0gKGIpKSA+PiA0KSAgIC8vIFNjb3JpbmcgZGlmZiwgaW4gWzAuLlNNQVgpCi0KLVdFQlBfRklMVEVSX1RZUEUgRXN0aW1hdGVCZXN0RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUpIHsKLSAgaW50IGksIGo7Ci0gIGludCBiaW5zW1dFQlBfRklMVEVSX0xBU1RdW1NNQVhdOwotICBTYk1lbW9yeVNldChiaW5zLCAwLCBzaXplb2YoYmlucykpOwotCi0gIC8vIFdlIG9ubHkgc2FtcGxlIGV2ZXJ5IG90aGVyIHBpeGVscy4gVGhhdCdzIGVub3VnaC4KLSAgZm9yIChqID0gMjsgaiA8IGhlaWdodCAtIDE7IGogKz0gMikgewotICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHAgPSBkYXRhICsgaiAqIHN0cmlkZTsKLSAgICBpbnQgbWVhbiA9IHBbMF07Ci0gICAgZm9yIChpID0gMjsgaSA8IHdpZHRoIC0gMTsgaSArPSAyKSB7Ci0gICAgICBjb25zdCBpbnQgZGlmZjAgPSBTRElGRihwW2ldLCBtZWFuKTsKLSAgICAgIGNvbnN0IGludCBkaWZmMSA9IFNESUZGKHBbaV0sIHBbaSAtIDFdKTsKLSAgICAgIGNvbnN0IGludCBkaWZmMiA9IFNESUZGKHBbaV0sIHBbaSAtIHdpZHRoXSk7Ci0gICAgICBjb25zdCBpbnQgZ3JhZF9wcmVkID0KLSAgICAgICAgICBHcmFkaWVudFByZWRpY3RvcihwW2kgLSAxXSwgcFtpIC0gd2lkdGhdLCBwW2kgLSB3aWR0aCAtIDFdKTsKLSAgICAgIGNvbnN0IGludCBkaWZmMyA9IFNESUZGKHBbaV0sIGdyYWRfcHJlZCk7Ci0gICAgICBiaW5zW1dFQlBfRklMVEVSX05PTkVdW2RpZmYwXSA9IDE7Ci0gICAgICBiaW5zW1dFQlBfRklMVEVSX0hPUklaT05UQUxdW2RpZmYxXSA9IDE7Ci0gICAgICBiaW5zW1dFQlBfRklMVEVSX1ZFUlRJQ0FMXVtkaWZmMl0gPSAxOwotICAgICAgYmluc1tXRUJQX0ZJTFRFUl9HUkFESUVOVF1bZGlmZjNdID0gMTsKLSAgICAgIG1lYW4gPSAoMyAqIG1lYW4gKyBwW2ldICsgMikgPj4gMjsKLSAgICB9Ci0gIH0KLSAgewotICAgIFdFQlBfRklMVEVSX1RZUEUgZmlsdGVyLCBiZXN0X2ZpbHRlciA9IFdFQlBfRklMVEVSX05PTkU7Ci0gICAgaW50IGJlc3Rfc2NvcmUgPSAweDdmZmZmZmZmOwotICAgIGZvciAoZmlsdGVyID0gV0VCUF9GSUxURVJfTk9ORTsgZmlsdGVyIDwgV0VCUF9GSUxURVJfTEFTVDsgKytmaWx0ZXIpIHsKLSAgICAgIGludCBzY29yZSA9IDA7Ci0gICAgICBmb3IgKGkgPSAwOyBpIDwgU01BWDsgKytpKSB7Ci0gICAgICAgIGlmIChiaW5zW2ZpbHRlcl1baV0gPiAwKSB7Ci0gICAgICAgICAgc2NvcmUgKz0gaTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKHNjb3JlIDwgYmVzdF9zY29yZSkgewotICAgICAgICBiZXN0X3Njb3JlID0gc2NvcmU7Ci0gICAgICAgIGJlc3RfZmlsdGVyID0gZmlsdGVyOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYmVzdF9maWx0ZXI7Ci0gIH0KLX0KLQotI3VuZGVmIFNNQVgKLSN1bmRlZiBTRElGRgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBXZWJQRmlsdGVyRnVuYyBXZWJQRmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXSA9IHsKLSAgTlVMTCwgICAgICAgICAgICAgIC8vIFdFQlBfRklMVEVSX05PTkUKLSAgSG9yaXpvbnRhbEZpbHRlciwgIC8vIFdFQlBfRklMVEVSX0hPUklaT05UQUwKLSAgVmVydGljYWxGaWx0ZXIsICAgIC8vIFdFQlBfRklMVEVSX1ZFUlRJQ0FMCi0gIEdyYWRpZW50RmlsdGVyICAgICAvLyBXRUJQX0ZJTFRFUl9HUkFESUVOVAotfTsKLQotY29uc3QgV2ViUFVuZmlsdGVyRnVuYyBXZWJQVW5maWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdID0gewotICBOVUxMLCAgICAgICAgICAgICAgICAvLyBXRUJQX0ZJTFRFUl9OT05FCi0gIEhvcml6b250YWxVbmZpbHRlciwgIC8vIFdFQlBfRklMVEVSX0hPUklaT05UQUwKLSAgVmVydGljYWxVbmZpbHRlciwgICAgLy8gV0VCUF9GSUxURVJfVkVSVElDQUwKLSAgR3JhZGllbnRVbmZpbHRlciAgICAgLy8gV0VCUF9GSUxURVJfR1JBRElFTlQKLX07Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvZmlsdGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjVmYTE2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2ZpbHRlcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBTcGF0aWFsIHByZWRpY3Rpb24gdXNpbmcgdmFyaW91cyBmaWx0ZXJzCi0vLwotLy8gQXV0aG9yOiBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfRklMVEVSU19IXwotI2RlZmluZSBXRUJQX1VUSUxTX0ZJTFRFUlNfSF8KLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEZpbHRlcnMuCi10eXBlZGVmIGVudW0gewotICBXRUJQX0ZJTFRFUl9OT05FID0gMCwKLSAgV0VCUF9GSUxURVJfSE9SSVpPTlRBTCwKLSAgV0VCUF9GSUxURVJfVkVSVElDQUwsCi0gIFdFQlBfRklMVEVSX0dSQURJRU5ULAotICBXRUJQX0ZJTFRFUl9MQVNUID0gV0VCUF9GSUxURVJfR1JBRElFTlQgKyAxLCAgLy8gZW5kIG1hcmtlcgotICBXRUJQX0ZJTFRFUl9CRVNULAotICBXRUJQX0ZJTFRFUl9GQVNUCi19IFdFQlBfRklMVEVSX1RZUEU7Ci0KLXR5cGVkZWYgdm9pZCAoKldlYlBGaWx0ZXJGdW5jKShjb25zdCB1aW50OF90KiBpbiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJpZGUsIHVpbnQ4X3QqIG91dCk7Ci10eXBlZGVmIHZvaWQgKCpXZWJQVW5maWx0ZXJGdW5jKShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhKTsKLQotLy8gRmlsdGVyIHRoZSBnaXZlbiBkYXRhIHVzaW5nIHRoZSBnaXZlbiBwcmVkaWN0b3IuCi0vLyAnaW4nIGNvcnJlc3BvbmRzIHRvIGEgMi1kaW1lbnNpb25hbCBwaXhlbCBhcnJheSBvZiBzaXplIChzdHJpZGUgKiBoZWlnaHQpCi0vLyBpbiByYXN0ZXIgb3JkZXIuCi0vLyAnc3RyaWRlJyBpcyBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW4gbGluZSAod2l0aCBwb3NzaWJsZSBwYWRkaW5nKS4KLS8vICdvdXQnIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkLgotZXh0ZXJuIGNvbnN0IFdlYlBGaWx0ZXJGdW5jIFdlYlBGaWx0ZXJzW1dFQlBfRklMVEVSX0xBU1RdOwotCi0vLyBJbi1wbGFjZSByZWNvbnN0cnVjdCB0aGUgb3JpZ2luYWwgZGF0YSBmcm9tIHRoZSBnaXZlbiBmaWx0ZXJlZCBkYXRhLgotZXh0ZXJuIGNvbnN0IFdlYlBVbmZpbHRlckZ1bmMgV2ViUFVuZmlsdGVyc1tXRUJQX0ZJTFRFUl9MQVNUXTsKLQotLy8gRmFzdCBlc3RpbWF0ZSBvZiBhIHBvdGVudGlhbGx5IGdvb2QgZmlsdGVyLgotZXh0ZXJuIFdFQlBfRklMVEVSX1RZUEUgRXN0aW1hdGVCZXN0RmlsdGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19GSUxURVJTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmMgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2Yjg4M2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvaHVmZm1hbi5jCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIGFuZCBsb29raW5nIHVwIEh1ZmZtYW4gdHJlZXMuCi0vLwotLy8gQXV0aG9yOiBVcnZhbmcgSm9zaGkgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKLSNlbHNlCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4vaHVmZm1hbi5oIgotI2luY2x1ZGUgIi4uL3V0aWxzL3V0aWxzLmgiCi0jaW5jbHVkZSAiLi4vd2VicC9mb3JtYXRfY29uc3RhbnRzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIE5PTl9FWElTVEVOVF9TWU1CT0wgKC0xKQotCi1zdGF0aWMgdm9pZCBUcmVlTm9kZUluaXQoSHVmZm1hblRyZWVOb2RlKiBjb25zdCBub2RlKSB7Ci0gIG5vZGUtPmNoaWxkcmVuXyA9IC0xOyAgIC8vIG1lYW5zOiAndW5hc3NpZ25lZCBzbyBmYXInCi19Ci0KLXN0YXRpYyBpbnQgTm9kZUlzRW1wdHkoY29uc3QgSHVmZm1hblRyZWVOb2RlKiBjb25zdCBub2RlKSB7Ci0gIHJldHVybiAobm9kZS0+Y2hpbGRyZW5fIDwgMCk7Ci19Ci0KLXN0YXRpYyBpbnQgSXNGdWxsKGNvbnN0IEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlKSB7Ci0gIHJldHVybiAodHJlZS0+bnVtX25vZGVzXyA9PSB0cmVlLT5tYXhfbm9kZXNfKTsKLX0KLQotc3RhdGljIHZvaWQgQXNzaWduQ2hpbGRyZW4oSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IG5vZGUpIHsKLSAgSHVmZm1hblRyZWVOb2RlKiBjb25zdCBjaGlsZHJlbiA9IHRyZWUtPnJvb3RfICsgdHJlZS0+bnVtX25vZGVzXzsKLSAgbm9kZS0+Y2hpbGRyZW5fID0gKGludCkoY2hpbGRyZW4gLSBub2RlKTsKLSAgU0JfRENIRUNLKGNoaWxkcmVuIC0gbm9kZSA9PSAoaW50KShjaGlsZHJlbiAtIG5vZGUpKTsKLSAgdHJlZS0+bnVtX25vZGVzXyArPSAyOwotICBUcmVlTm9kZUluaXQoY2hpbGRyZW4gKyAwKTsKLSAgVHJlZU5vZGVJbml0KGNoaWxkcmVuICsgMSk7Ci19Ci0KLXN0YXRpYyBpbnQgVHJlZUluaXQoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsIGludCBudW1fbGVhdmVzKSB7Ci0gIFNCX0RDSEVDSyh0cmVlICE9IE5VTEwpOwotICBpZiAobnVtX2xlYXZlcyA9PSAwKSByZXR1cm4gMDsKLSAgLy8gV2UgYWxsb2NhdGUgbWF4aW11bSBwb3NzaWJsZSBub2RlcyBpbiB0aGUgdHJlZSBhdCBvbmNlLgotICAvLyBOb3RlIHRoYXQgYSBIdWZmbWFuIHRyZWUgaXMgYSBmdWxsIGJpbmFyeSB0cmVlOyBhbmQgaW4gYSBmdWxsIGJpbmFyeSB0cmVlCi0gIC8vIHdpdGggTCBsZWF2ZXMsIHRoZSB0b3RhbCBudW1iZXIgb2Ygbm9kZXMgTiA9IDIgKiBMIC0gMS4KLSAgdHJlZS0+bWF4X25vZGVzXyA9IDIgKiBudW1fbGVhdmVzIC0gMTsKLSAgdHJlZS0+cm9vdF8gPSAoSHVmZm1hblRyZWVOb2RlKilXZWJQU2FmZU1hbGxvYygodWludDY0X3QpdHJlZS0+bWF4X25vZGVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnRyZWUtPnJvb3RfKSk7Ci0gIGlmICh0cmVlLT5yb290XyA9PSBOVUxMKSByZXR1cm4gMDsKLSAgVHJlZU5vZGVJbml0KHRyZWUtPnJvb3RfKTsgIC8vIEluaXRpYWxpemUgcm9vdC4KLSAgdHJlZS0+bnVtX25vZGVzXyA9IDE7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIEh1ZmZtYW5UcmVlUmVsZWFzZShIdWZmbWFuVHJlZSogY29uc3QgdHJlZSkgewotICBpZiAodHJlZSAhPSBOVUxMKSB7Ci0gICAgU2JNZW1vcnlEZWFsbG9jYXRlKHRyZWUtPnJvb3RfKTsKLSAgICB0cmVlLT5yb290XyA9IE5VTEw7Ci0gICAgdHJlZS0+bWF4X25vZGVzXyA9IDA7Ci0gICAgdHJlZS0+bnVtX25vZGVzXyA9IDA7Ci0gIH0KLX0KLQotaW50IEh1ZmZtYW5Db2RlTGVuZ3Roc1RvQ29kZXMoY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZV9sZW5ndGhzX3NpemUsIGludCogY29uc3QgaHVmZl9jb2RlcykgewotICBpbnQgc3ltYm9sOwotICBpbnQgY29kZV9sZW47Ci0gIGludCBjb2RlX2xlbmd0aF9oaXN0W01BWF9BTExPV0VEX0NPREVfTEVOR1RIICsgMV0gPSB7IDAgfTsKLSAgaW50IGN1cnJfY29kZTsKLSAgaW50IG5leHRfY29kZXNbTUFYX0FMTE9XRURfQ09ERV9MRU5HVEggKyAxXSA9IHsgMCB9OwotICBpbnQgbWF4X2NvZGVfbGVuZ3RoID0gMDsKLQotICBTQl9EQ0hFQ0soY29kZV9sZW5ndGhzICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soY29kZV9sZW5ndGhzX3NpemUgPiAwKTsKLSAgU0JfRENIRUNLKGh1ZmZfY29kZXMgIT0gTlVMTCk7Ci0KLSAgLy8gQ2FsY3VsYXRlIG1heCBjb2RlIGxlbmd0aC4KLSAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKLSAgICBpZiAoY29kZV9sZW5ndGhzW3N5bWJvbF0gPiBtYXhfY29kZV9sZW5ndGgpIHsKLSAgICAgIG1heF9jb2RlX2xlbmd0aCA9IGNvZGVfbGVuZ3Roc1tzeW1ib2xdOwotICAgIH0KLSAgfQotICBpZiAobWF4X2NvZGVfbGVuZ3RoID4gTUFYX0FMTE9XRURfQ09ERV9MRU5HVEgpIHJldHVybiAwOwotCi0gIC8vIENhbGN1bGF0ZSBjb2RlIGxlbmd0aCBoaXN0b2dyYW0uCi0gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7Ci0gICAgKytjb2RlX2xlbmd0aF9oaXN0W2NvZGVfbGVuZ3Roc1tzeW1ib2xdXTsKLSAgfQotICBjb2RlX2xlbmd0aF9oaXN0WzBdID0gMDsKLQotICAvLyBDYWxjdWxhdGUgdGhlIGluaXRpYWwgdmFsdWVzIG9mICduZXh0X2NvZGVzJyBmb3IgZWFjaCBjb2RlIGxlbmd0aC4KLSAgLy8gbmV4dF9jb2Rlc1tjb2RlX2xlbl0gZGVub3RlcyB0aGUgY29kZSB0byBiZSBhc3NpZ25lZCB0byB0aGUgbmV4dCBzeW1ib2wKLSAgLy8gb2YgY29kZSBsZW5ndGggJ2NvZGVfbGVuJy4KLSAgY3Vycl9jb2RlID0gMDsKLSAgbmV4dF9jb2Rlc1swXSA9IC0xOyAgLy8gVW51c2VkLCBhcyBjb2RlIGxlbmd0aCA9IDAgaW1wbGllcyBjb2RlIGRvZXNuJ3QgZXhpc3QuCi0gIGZvciAoY29kZV9sZW4gPSAxOyBjb2RlX2xlbiA8PSBtYXhfY29kZV9sZW5ndGg7ICsrY29kZV9sZW4pIHsKLSAgICBjdXJyX2NvZGUgPSAoY3Vycl9jb2RlICsgY29kZV9sZW5ndGhfaGlzdFtjb2RlX2xlbiAtIDFdKSA8PCAxOwotICAgIG5leHRfY29kZXNbY29kZV9sZW5dID0gY3Vycl9jb2RlOwotICB9Ci0KLSAgLy8gR2V0IHN5bWJvbHMuCi0gIGZvciAoc3ltYm9sID0gMDsgc3ltYm9sIDwgY29kZV9sZW5ndGhzX3NpemU7ICsrc3ltYm9sKSB7Ci0gICAgaWYgKGNvZGVfbGVuZ3Roc1tzeW1ib2xdID4gMCkgewotICAgICAgaHVmZl9jb2Rlc1tzeW1ib2xdID0gbmV4dF9jb2Rlc1tjb2RlX2xlbmd0aHNbc3ltYm9sXV0rKzsKLSAgICB9IGVsc2UgewotICAgICAgaHVmZl9jb2Rlc1tzeW1ib2xdID0gTk9OX0VYSVNURU5UX1NZTUJPTDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyBpbnQgVHJlZUFkZFN5bWJvbChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3ltYm9sLCBpbnQgY29kZSwgaW50IGNvZGVfbGVuZ3RoKSB7Ci0gIEh1ZmZtYW5UcmVlTm9kZSogbm9kZSA9IHRyZWUtPnJvb3RfOwotICBjb25zdCBIdWZmbWFuVHJlZU5vZGUqIGNvbnN0IG1heF9ub2RlID0gdHJlZS0+cm9vdF8gKyB0cmVlLT5tYXhfbm9kZXNfOwotICB3aGlsZSAoY29kZV9sZW5ndGgtLSA+IDApIHsKLSAgICBpZiAobm9kZSA+PSBtYXhfbm9kZSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGlmIChOb2RlSXNFbXB0eShub2RlKSkgewotICAgICAgaWYgKElzRnVsbCh0cmVlKSkgcmV0dXJuIDA7ICAgIC8vIGVycm9yOiB0b28gbWFueSBzeW1ib2xzLgotICAgICAgQXNzaWduQ2hpbGRyZW4odHJlZSwgbm9kZSk7Ci0gICAgfSBlbHNlIGlmIChIdWZmbWFuVHJlZU5vZGVJc0xlYWYobm9kZSkpIHsKLSAgICAgIHJldHVybiAwOyAgLy8gbGVhZiBpcyBhbHJlYWR5IG9jY3VwaWVkLgotICAgIH0KLSAgICBub2RlICs9IG5vZGUtPmNoaWxkcmVuXyArICgoY29kZSA+PiBjb2RlX2xlbmd0aCkgJiAxKTsKLSAgfQotICBpZiAoTm9kZUlzRW1wdHkobm9kZSkpIHsKLSAgICBub2RlLT5jaGlsZHJlbl8gPSAwOyAgICAgIC8vIHR1cm4gbmV3bHkgY3JlYXRlZCBub2RlIGludG8gYSBsZWFmLgotICB9IGVsc2UgaWYgKCFIdWZmbWFuVHJlZU5vZGVJc0xlYWYobm9kZSkpIHsKLSAgICByZXR1cm4gMDsgICAvLyB0cnlpbmcgdG8gYXNzaWduIGEgc3ltYm9sIHRvIGFscmVhZHkgdXNlZCBjb2RlLgotICB9Ci0gIG5vZGUtPnN5bWJvbF8gPSBzeW1ib2w7ICAvLyBBZGQgc3ltYm9sIGluIHRoaXMgbm9kZS4KLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBIdWZmbWFuVHJlZUJ1aWxkSW1wbGljaXQoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZV9sZW5ndGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29kZV9sZW5ndGhzX3NpemUpIHsKLSAgaW50IHN5bWJvbDsKLSAgaW50IG51bV9zeW1ib2xzID0gMDsKLSAgaW50IHJvb3Rfc3ltYm9sID0gMDsKLQotICBTQl9EQ0hFQ0sodHJlZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGNvZGVfbGVuZ3RocyAhPSBOVUxMKTsKLQotICAvLyBGaW5kIG91dCBudW1iZXIgb2Ygc3ltYm9scyBhbmQgdGhlIHJvb3Qgc3ltYm9sLgotICBmb3IgKHN5bWJvbCA9IDA7IHN5bWJvbCA8IGNvZGVfbGVuZ3Roc19zaXplOyArK3N5bWJvbCkgewotICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IDApIHsKLSAgICAgIC8vIE5vdGU6IGNvZGUgbGVuZ3RoID0gMCBpbmRpY2F0ZXMgbm9uLWV4aXN0ZW50IHN5bWJvbC4KLSAgICAgICsrbnVtX3N5bWJvbHM7Ci0gICAgICByb290X3N5bWJvbCA9IHN5bWJvbDsKLSAgICB9Ci0gIH0KLQotICAvLyBJbml0aWFsaXplIHRoZSB0cmVlLiBXaWxsIGZhaWwgZm9yIG51bV9zeW1ib2xzID0gMAotICBpZiAoIVRyZWVJbml0KHRyZWUsIG51bV9zeW1ib2xzKSkgcmV0dXJuIDA7Ci0KLSAgLy8gQnVpbGQgdHJlZS4KLSAgaWYgKG51bV9zeW1ib2xzID09IDEpIHsgIC8vIFRyaXZpYWwgY2FzZS4KLSAgICBjb25zdCBpbnQgbWF4X3N5bWJvbCA9IGNvZGVfbGVuZ3Roc19zaXplOwotICAgIGlmIChyb290X3N5bWJvbCA8IDAgfHwgcm9vdF9zeW1ib2wgPj0gbWF4X3N5bWJvbCkgewotICAgICAgSHVmZm1hblRyZWVSZWxlYXNlKHRyZWUpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBUcmVlQWRkU3ltYm9sKHRyZWUsIHJvb3Rfc3ltYm9sLCAwLCAwKTsKLSAgfSBlbHNlIHsgIC8vIE5vcm1hbCBjYXNlLgotICAgIGludCBvayA9IDA7Ci0KLSAgICAvLyBHZXQgSHVmZm1hbiBjb2RlcyBmcm9tIHRoZSBjb2RlIGxlbmd0aHMuCi0gICAgaW50KiBjb25zdCBjb2RlcyA9Ci0gICAgICAgIChpbnQqKVdlYlBTYWZlTWFsbG9jKCh1aW50NjRfdCljb2RlX2xlbmd0aHNfc2l6ZSwgc2l6ZW9mKCpjb2RlcykpOwotICAgIGlmIChjb2RlcyA9PSBOVUxMKSBnb3RvIEVuZDsKLQotICAgIGlmICghSHVmZm1hbkNvZGVMZW5ndGhzVG9Db2Rlcyhjb2RlX2xlbmd0aHMsIGNvZGVfbGVuZ3Roc19zaXplLCBjb2RlcykpIHsKLSAgICAgIGdvdG8gRW5kOwotICAgIH0KLQotICAgIC8vIEFkZCBzeW1ib2xzIG9uZS1ieS1vbmUuCi0gICAgZm9yIChzeW1ib2wgPSAwOyBzeW1ib2wgPCBjb2RlX2xlbmd0aHNfc2l6ZTsgKytzeW1ib2wpIHsKLSAgICAgIGlmIChjb2RlX2xlbmd0aHNbc3ltYm9sXSA+IDApIHsKLSAgICAgICAgaWYgKCFUcmVlQWRkU3ltYm9sKHRyZWUsIHN5bWJvbCwgY29kZXNbc3ltYm9sXSwgY29kZV9sZW5ndGhzW3N5bWJvbF0pKSB7Ci0gICAgICAgICAgZ290byBFbmQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb2sgPSAxOwotIEVuZDoKLSAgICBTYk1lbW9yeURlYWxsb2NhdGUoY29kZXMpOwotICAgIG9rID0gb2sgJiYgSXNGdWxsKHRyZWUpOwotICAgIGlmICghb2spIEh1ZmZtYW5UcmVlUmVsZWFzZSh0cmVlKTsKLSAgICByZXR1cm4gb2s7Ci0gIH0KLX0KLQotaW50IEh1ZmZtYW5UcmVlQnVpbGRFeHBsaWNpdChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3QgY29kZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogY29uc3Qgc3ltYm9scywgaW50IG1heF9zeW1ib2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fc3ltYm9scykgewotICBpbnQgb2sgPSAwOwotICBpbnQgaTsKLQotICBTQl9EQ0hFQ0sodHJlZSAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGNvZGVfbGVuZ3RocyAhPSBOVUxMKTsKLSAgU0JfRENIRUNLKGNvZGVzICE9IE5VTEwpOwotICBTQl9EQ0hFQ0soc3ltYm9scyAhPSBOVUxMKTsKLQotICAvLyBJbml0aWFsaXplIHRoZSB0cmVlLiBXaWxsIGZhaWwgaWYgbnVtX3N5bWJvbHMgPSAwLgotICBpZiAoIVRyZWVJbml0KHRyZWUsIG51bV9zeW1ib2xzKSkgcmV0dXJuIDA7Ci0KLSAgLy8gQWRkIHN5bWJvbHMgb25lLWJ5LW9uZS4KLSAgZm9yIChpID0gMDsgaSA8IG51bV9zeW1ib2xzOyArK2kpIHsKLSAgICBpZiAoY29kZXNbaV0gIT0gTk9OX0VYSVNURU5UX1NZTUJPTCkgewotICAgICAgaWYgKHN5bWJvbHNbaV0gPCAwIHx8IHN5bWJvbHNbaV0gPj0gbWF4X3N5bWJvbCkgewotICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLSAgICAgIGlmICghVHJlZUFkZFN5bWJvbCh0cmVlLCBzeW1ib2xzW2ldLCBjb2Rlc1tpXSwgY29kZV9sZW5ndGhzW2ldKSkgewotICAgICAgICBnb3RvIEVuZDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgb2sgPSAxOwotIEVuZDoKLSAgb2sgPSBvayAmJiBJc0Z1bGwodHJlZSk7Ci0gIGlmICghb2spIEh1ZmZtYW5UcmVlUmVsZWFzZSh0cmVlKTsKLSAgcmV0dXJuIG9rOwotfQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL2h1ZmZtYW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ1OWI3ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9odWZmbWFuLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVXRpbGl0aWVzIGZvciBidWlsZGluZyBhbmQgbG9va2luZyB1cCBIdWZmbWFuIHRyZWVzLgotLy8KLS8vIEF1dGhvcjogVXJ2YW5nIEpvc2hpICh1cnZhbmdAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX0hVRkZNQU5fSF8KLSNkZWZpbmUgV0VCUF9VVElMU19IVUZGTUFOX0hfCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jZWxzZQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2VuZGlmCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8gQSBub2RlIG9mIGEgSHVmZm1hbiB0cmVlLgotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgc3ltYm9sXzsKLSAgaW50IGNoaWxkcmVuXzsgIC8vIGRlbHRhIG9mZnNldCB0byBib3RoIGNoaWxkcmVuIChjb250aWd1b3VzKSBvciAwIGlmIGxlYWYuCi19IEh1ZmZtYW5UcmVlTm9kZTsKLQotLy8gSHVmZm1hbiBUcmVlLgotdHlwZWRlZiBzdHJ1Y3QgSHVmZm1hblRyZWUgSHVmZm1hblRyZWU7Ci1zdHJ1Y3QgSHVmZm1hblRyZWUgewotICBIdWZmbWFuVHJlZU5vZGUqIHJvb3RfOyAgIC8vIGFsbCB0aGUgbm9kZXMsIHN0YXJ0aW5nIGF0IHJvb3QuCi0gIGludCBtYXhfbm9kZXNfOyAgICAgICAgICAgLy8gbWF4IG51bWJlciBvZiBub2RlcwotICBpbnQgbnVtX25vZGVzXzsgICAgICAgICAgIC8vIG51bWJlciBvZiBjdXJyZW50bHkgb2NjdXBpZWQgbm9kZXMKLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbm9kZSBpcyBhIGxlYWYgb2YgdGhlIEh1ZmZtYW4gdHJlZS4KLXN0YXRpYyBXRUJQX0lOTElORSBpbnQgSHVmZm1hblRyZWVOb2RlSXNMZWFmKAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogY29uc3Qgbm9kZSkgewotICByZXR1cm4gKG5vZGUtPmNoaWxkcmVuXyA9PSAwKTsKLX0KLQotLy8gR28gZG93biBvbmUgbGV2ZWwuIE1vc3QgY3JpdGljYWwgZnVuY3Rpb24uICdyaWdodF9jaGlsZCcgbXVzdCBiZSAwIG9yIDEuCi1zdGF0aWMgV0VCUF9JTkxJTkUgY29uc3QgSHVmZm1hblRyZWVOb2RlKiBIdWZmbWFuVHJlZU5leHROb2RlKAotICAgIGNvbnN0IEh1ZmZtYW5UcmVlTm9kZSogbm9kZSwgaW50IHJpZ2h0X2NoaWxkKSB7Ci0gIHJldHVybiBub2RlICsgbm9kZS0+Y2hpbGRyZW5fICsgcmlnaHRfY2hpbGQ7Ci19Ci0KLS8vIFJlbGVhc2VzIHRoZSBub2RlcyBvZiB0aGUgSHVmZm1hbiB0cmVlLgotLy8gTm90ZTogSXQgZG9lcyBOT1QgZnJlZSAndHJlZScgaXRzZWxmLgotdm9pZCBIdWZmbWFuVHJlZVJlbGVhc2UoSHVmZm1hblRyZWUqIGNvbnN0IHRyZWUpOwotCi0vLyBCdWlsZHMgSHVmZm1hbiB0cmVlIGFzc3VtaW5nIGNvZGUgbGVuZ3RocyBhcmUgaW1wbGljaXRseSBpbiBzeW1ib2wgb3JkZXIuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGludmFsaWQgdHJlZSBvciBtZW1vcnkgZXJyb3IpLgotaW50IEh1ZmZtYW5UcmVlQnVpbGRJbXBsaWNpdChIdWZmbWFuVHJlZSogY29uc3QgdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlX2xlbmd0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2xlbmd0aHNfc2l6ZSk7Ci0KLS8vIEJ1aWxkIGEgSHVmZm1hbiB0cmVlIHdpdGggZXhwbGljaXRseSBnaXZlbiBsaXN0cyBvZiBjb2RlIGxlbmd0aHMsIGNvZGVzCi0vLyBhbmQgc3ltYm9scy4gVmVyaWZpZXMgdGhhdCBhbGwgc3ltYm9scyBhZGRlZCBhcmUgc21hbGxlciB0aGFuIG1heF9zeW1ib2wuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgYW4gaW52YWxpZCBzeW1ib2wsIGludmFsaWQgdHJlZSBvciBtZW1vcnkgZXJyb3IuCi1pbnQgSHVmZm1hblRyZWVCdWlsZEV4cGxpY2l0KEh1ZmZtYW5UcmVlKiBjb25zdCB0cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBjb2RlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBjb25zdCBzeW1ib2xzLCBpbnQgbWF4X3N5bWJvbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9zeW1ib2xzKTsKLQotLy8gVXRpbGl0eTogY29udmVydHMgSHVmZm1hbiBjb2RlIGxlbmd0aHMgdG8gY29ycmVzcG9uZGluZyBIdWZmbWFuIGNvZGVzLgotLy8gJ2h1ZmZfY29kZXMnIHNob3VsZCBiZSBwcmUtYWxsb2NhdGVkLgotLy8gUmV0dXJucyBmYWxzZSBpbiBjYXNlIG9mIGVycm9yIChtZW1vcnkgYWxsb2NhdGlvbiwgaW52YWxpZCBjb2RlcykuCi1pbnQgSHVmZm1hbkNvZGVMZW5ndGhzVG9Db2Rlcyhjb25zdCBpbnQqIGNvbnN0IGNvZGVfbGVuZ3RocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlX2xlbmd0aHNfc2l6ZSwgaW50KiBjb25zdCBodWZmX2NvZGVzKTsKLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvLyBXRUJQX1VUSUxTX0hVRkZNQU5fSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuYyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDkzNTk0Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9xdWFudF9sZXZlbHNfZGVjLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gVE9ETyhza2FsKTogaW1wbGVtZW50IGdyYWRpZW50IHNtb290aGluZy4KLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaW5jbHVkZSAiLi9xdWFudF9sZXZlbHNfZGVjLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi1pbnQgRGVxdWFudGl6ZUxldmVscyh1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgaWYgKGRhdGEgPT0gTlVMTCB8fCB3aWR0aCA8PSAwIHx8IGhlaWdodCA8PSAwKSByZXR1cm4gMDsKLSAgKHZvaWQpZGF0YTsKLSAgKHZvaWQpd2lkdGg7Ci0gICh2b2lkKWhlaWdodDsKLSAgcmV0dXJuIDE7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcXVhbnRfbGV2ZWxzX2RlYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODkxMDY3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3F1YW50X2xldmVsc19kZWMuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBBbHBoYSBwbGFuZSBkZS1xdWFudGl6YXRpb24gdXRpbGl0eQotLy8KLS8vIEF1dGhvcjogIFZpa2FzIEFyb3JhICh2aWthc2FAZ29vZ2xlLmNvbSkKLQotI2lmbmRlZiBXRUJQX1VUSUxTX1FVQU5UX0xFVkVMU19ERUNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfCi0KLSNpbmNsdWRlICIuLi93ZWJwL3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vLyBBcHBseSBwb3N0LXByb2Nlc3NpbmcgdG8gaW5wdXQgJ2RhdGEnIG9mIHNpemUgJ3dpZHRoJ3gnaGVpZ2h0JyBhc3N1bWluZwotLy8gdGhhdCB0aGUgc291cmNlIHdhcyBxdWFudGl6ZWQgdG8gYSByZWR1Y2VkIG51bWJlciBvZiBsZXZlbHMuCi0vLyBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IgKGRhdGEgaXMgTlVMTCwgaW52YWxpZCBwYXJhbWV0ZXJzLCAuLi4pLgotaW50IERlcXVhbnRpemVMZXZlbHModWludDhfdCogY29uc3QgZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAgLyogV0VCUF9VVElMU19RVUFOVF9MRVZFTFNfREVDX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkZGMyOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5jCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBSZXNjYWxpbmcgZnVuY3Rpb25zCi0vLwotLy8gQXV0aG9yOiBTa2FsIChwYXNjYWwubWFzc2ltaW5vQGdtYWlsLmNvbSkKLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgIi4vcmVzY2FsZXIuaCIKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNkZWZpbmUgUkZJWCAzMAotI2RlZmluZSBNVUxUX0ZJWCh4LCB5KSAoKChpbnQ2NF90KSh4KSAqICh5KSArICgxIDw8IChSRklYIC0gMSkpKSA+PiBSRklYKQotCi12b2lkIFdlYlBSZXNjYWxlckluaXQoV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssIGludCBzcmNfd2lkdGgsIGludCBzcmNfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGNvbnN0IGRzdCwgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdHJpZGUsIGludCBudW1fY2hhbm5lbHMsIGludCB4X2FkZCwgaW50IHhfc3ViLAotICAgICAgICAgICAgICAgICAgICAgIGludCB5X2FkZCwgaW50IHlfc3ViLCBpbnQzMl90KiBjb25zdCB3b3JrKSB7Ci0gIHdyay0+eF9leHBhbmQgPSAoc3JjX3dpZHRoIDwgZHN0X3dpZHRoKTsKLSAgd3JrLT5zcmNfd2lkdGggPSBzcmNfd2lkdGg7Ci0gIHdyay0+c3JjX2hlaWdodCA9IHNyY19oZWlnaHQ7Ci0gIHdyay0+ZHN0X3dpZHRoID0gZHN0X3dpZHRoOwotICB3cmstPmRzdF9oZWlnaHQgPSBkc3RfaGVpZ2h0OwotICB3cmstPmRzdCA9IGRzdDsKLSAgd3JrLT5kc3Rfc3RyaWRlID0gZHN0X3N0cmlkZTsKLSAgd3JrLT5udW1fY2hhbm5lbHMgPSBudW1fY2hhbm5lbHM7Ci0gIC8vIGZvciAneF9leHBhbmQnLCB3ZSB1c2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbgotICB3cmstPnhfYWRkID0gd3JrLT54X2V4cGFuZCA/ICh4X3N1YiAtIDEpIDogeF9hZGQgLSB4X3N1YjsKLSAgd3JrLT54X3N1YiA9IHdyay0+eF9leHBhbmQgPyAoeF9hZGQgLSAxKSA6IHhfc3ViOwotICB3cmstPnlfYWNjdW0gPSB5X2FkZDsKLSAgd3JrLT55X2FkZCA9IHlfYWRkOwotICB3cmstPnlfc3ViID0geV9zdWI7Ci0gIHdyay0+Znhfc2NhbGUgPSAoMSA8PCBSRklYKSAvIHhfc3ViOwotICB3cmstPmZ5X3NjYWxlID0gKDEgPDwgUkZJWCkgLyB5X3N1YjsKLSAgd3JrLT5meHlfc2NhbGUgPSB3cmstPnhfZXhwYW5kID8KLSAgICAgICgoaW50NjRfdClkc3RfaGVpZ2h0IDw8IFJGSVgpIC8gKHhfc3ViICogc3JjX2hlaWdodCkgOgotICAgICAgKChpbnQ2NF90KWRzdF9oZWlnaHQgPDwgUkZJWCkgLyAoeF9hZGQgKiBzcmNfaGVpZ2h0KTsKLSAgd3JrLT5pcm93ID0gd29yazsKLSAgd3JrLT5mcm93ID0gd29yayArIG51bV9jaGFubmVscyAqIGRzdF93aWR0aDsKLX0KLQotdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBjb25zdCBzcmMsIGludCBjaGFubmVsKSB7Ci0gIGNvbnN0IGludCB4X3N0cmlkZSA9IHdyay0+bnVtX2NoYW5uZWxzOwotICBjb25zdCBpbnQgeF9vdXRfbWF4ID0gd3JrLT5kc3Rfd2lkdGggKiB3cmstPm51bV9jaGFubmVsczsKLSAgaW50IHhfaW4gPSBjaGFubmVsOwotICBpbnQgeF9vdXQ7Ci0gIGludCBhY2N1bSA9IDA7Ci0gIGlmICghd3JrLT54X2V4cGFuZCkgewotICAgIGludCBzdW0gPSAwOwotICAgIGZvciAoeF9vdXQgPSBjaGFubmVsOyB4X291dCA8IHhfb3V0X21heDsgeF9vdXQgKz0geF9zdHJpZGUpIHsKLSAgICAgIGFjY3VtICs9IHdyay0+eF9hZGQ7Ci0gICAgICBmb3IgKDsgYWNjdW0gPiAwOyBhY2N1bSAtPSB3cmstPnhfc3ViKSB7Ci0gICAgICAgIHN1bSArPSBzcmNbeF9pbl07Ci0gICAgICAgIHhfaW4gKz0geF9zdHJpZGU7Ci0gICAgICB9Ci0gICAgICB7ICAgICAgICAvLyBFbWl0IG5leHQgaG9yaXpvbnRhbCBwaXhlbC4KLSAgICAgICAgY29uc3QgaW50MzJfdCBiYXNlID0gc3JjW3hfaW5dOwotICAgICAgICBjb25zdCBpbnQzMl90IGZyYWMgPSBiYXNlICogKC1hY2N1bSk7Ci0gICAgICAgIHhfaW4gKz0geF9zdHJpZGU7Ci0gICAgICAgIHdyay0+ZnJvd1t4X291dF0gPSAoc3VtICsgYmFzZSkgKiB3cmstPnhfc3ViIC0gZnJhYzsKLSAgICAgICAgLy8gZnJlc2ggZnJhY3Rpb25hbCBzdGFydCBmb3IgbmV4dCBwaXhlbAotICAgICAgICBzdW0gPSAoaW50KU1VTFRfRklYKGZyYWMsIHdyay0+Znhfc2NhbGUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsgICAgICAgIC8vIHNpbXBsZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uCi0gICAgaW50IGxlZnQgPSBzcmNbY2hhbm5lbF0sIHJpZ2h0ID0gc3JjW2NoYW5uZWxdOwotICAgIGZvciAoeF9vdXQgPSBjaGFubmVsOyB4X291dCA8IHhfb3V0X21heDsgeF9vdXQgKz0geF9zdHJpZGUpIHsKLSAgICAgIGlmIChhY2N1bSA8IDApIHsKLSAgICAgICAgbGVmdCA9IHJpZ2h0OwotICAgICAgICB4X2luICs9IHhfc3RyaWRlOwotICAgICAgICByaWdodCA9IHNyY1t4X2luXTsKLSAgICAgICAgYWNjdW0gKz0gd3JrLT54X2FkZDsKLSAgICAgIH0KLSAgICAgIHdyay0+ZnJvd1t4X291dF0gPSByaWdodCAqIHdyay0+eF9hZGQgKyAobGVmdCAtIHJpZ2h0KSAqIGFjY3VtOwotICAgICAgYWNjdW0gLT0gd3JrLT54X3N1YjsKLSAgICB9Ci0gIH0KLSAgLy8gQWNjdW11bGF0ZSB0aGUgbmV3IHJvdydzIGNvbnRyaWJ1dGlvbgotICBmb3IgKHhfb3V0ID0gY2hhbm5lbDsgeF9vdXQgPCB4X291dF9tYXg7IHhfb3V0ICs9IHhfc3RyaWRlKSB7Ci0gICAgd3JrLT5pcm93W3hfb3V0XSArPSB3cmstPmZyb3dbeF9vdXRdOwotICB9Ci19Ci0KLXVpbnQ4X3QqIFdlYlBSZXNjYWxlckV4cG9ydFJvdyhXZWJQUmVzY2FsZXIqIGNvbnN0IHdyaykgewotICBpZiAod3JrLT55X2FjY3VtIDw9IDApIHsKLSAgICBpbnQgeF9vdXQ7Ci0gICAgdWludDhfdCogY29uc3QgZHN0ID0gd3JrLT5kc3Q7Ci0gICAgaW50MzJfdCogY29uc3QgaXJvdyA9IHdyay0+aXJvdzsKLSAgICBjb25zdCBpbnQzMl90KiBjb25zdCBmcm93ID0gd3JrLT5mcm93OwotICAgIGNvbnN0IGludCB5c2NhbGUgPSB3cmstPmZ5X3NjYWxlICogKC13cmstPnlfYWNjdW0pOwotICAgIGNvbnN0IGludCB4X291dF9tYXggPSB3cmstPmRzdF93aWR0aCAqIHdyay0+bnVtX2NoYW5uZWxzOwotCi0gICAgZm9yICh4X291dCA9IDA7IHhfb3V0IDwgeF9vdXRfbWF4OyArK3hfb3V0KSB7Ci0gICAgICBjb25zdCBpbnQgZnJhYyA9IChpbnQpTVVMVF9GSVgoZnJvd1t4X291dF0sIHlzY2FsZSk7Ci0gICAgICBjb25zdCBpbnQgdiA9IChpbnQpTVVMVF9GSVgoaXJvd1t4X291dF0gLSBmcmFjLCB3cmstPmZ4eV9zY2FsZSk7Ci0gICAgICBkc3RbeF9vdXRdID0gKCEodiAmIH4weGZmKSkgPyB2IDogKHYgPCAwKSA/IDAgOiAyNTU7Ci0gICAgICBpcm93W3hfb3V0XSA9IGZyYWM7ICAgLy8gbmV3IGZyYWN0aW9uYWwgc3RhcnQKLSAgICB9Ci0gICAgd3JrLT55X2FjY3VtICs9IHdyay0+eV9hZGQ7Ci0gICAgd3JrLT5kc3QgKz0gd3JrLT5kc3Rfc3RyaWRlOwotICAgIHJldHVybiBkc3Q7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotI3VuZGVmIE1VTFRfRklYCi0jdW5kZWYgUkZJWAotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gYWxsLWluLW9uZSBjYWxscwotCi1pbnQgV2ViUFJlc2NhbGVySW1wb3J0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgbnVtX2xpbmVzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzcmMsIGludCBzcmNfc3RyaWRlKSB7Ci0gIGludCB0b3RhbF9pbXBvcnRlZCA9IDA7Ci0gIHdoaWxlICh0b3RhbF9pbXBvcnRlZCA8IG51bV9saW5lcyAmJiB3cmstPnlfYWNjdW0gPiAwKSB7Ci0gICAgaW50IGNoYW5uZWw7Ci0gICAgZm9yIChjaGFubmVsID0gMDsgY2hhbm5lbCA8IHdyay0+bnVtX2NoYW5uZWxzOyArK2NoYW5uZWwpIHsKLSAgICAgIFdlYlBSZXNjYWxlckltcG9ydFJvdyh3cmssIHNyYywgY2hhbm5lbCk7Ci0gICAgfQotICAgIHNyYyArPSBzcmNfc3RyaWRlOwotICAgICsrdG90YWxfaW1wb3J0ZWQ7Ci0gICAgd3JrLT55X2FjY3VtIC09IHdyay0+eV9zdWI7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX2ltcG9ydGVkOwotfQotCi1pbnQgV2ViUFJlc2NhbGVyRXhwb3J0KFdlYlBSZXNjYWxlciogY29uc3QgcmVzY2FsZXIpIHsKLSAgaW50IHRvdGFsX2V4cG9ydGVkID0gMDsKLSAgd2hpbGUgKFdlYlBSZXNjYWxlckhhc1BlbmRpbmdPdXRwdXQocmVzY2FsZXIpKSB7Ci0gICAgV2ViUFJlc2NhbGVyRXhwb3J0Um93KHJlc2NhbGVyKTsKLSAgICArK3RvdGFsX2V4cG9ydGVkOwotICB9Ci0gIHJldHVybiB0b3RhbF9leHBvcnRlZDsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLX0gICAgLy8gZXh0ZXJuICJDIgotI2VuZGlmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5oIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvcmVzY2FsZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVkY2U0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy9yZXNjYWxlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFJlc2NhbGluZyBmdW5jdGlvbnMKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfUkVTQ0FMRVJfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19SRVNDQUxFUl9IXwotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2luY2x1ZGUgIi4uL3dlYnAvdHlwZXMuaCIKLQotLy8gU3RydWN0dXJlIHVzZWQgZm9yIG9uLXRoZS1mbHkgcmVzY2FsaW5nCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGludCB4X2V4cGFuZDsgICAgICAgICAgICAgICAvLyB0cnVlIGlmIHdlJ3JlIGV4cGFuZGluZyBpbiB0aGUgeCBkaXJlY3Rpb24KLSAgaW50IG51bV9jaGFubmVsczsgICAgICAgICAgIC8vIGJ5dGVzIHRvIGp1bXAgYmV0d2VlbiBwaXhlbHMKLSAgaW50IGZ5X3NjYWxlLCBmeF9zY2FsZTsgICAgIC8vIGZpeGVkLXBvaW50IHNjYWxpbmcgZmFjdG9yCi0gIGludDY0X3QgZnh5X3NjYWxlOyAgICAgICAgICAvLyAnJwotICAvLyB3ZSBuZWVkIGhwZWwtcHJlY2lzZSBhZGQvc3ViIGluY3JlbWVudHMsIGZvciB0aGUgZG93bnNhbXBsZWQgVS9WIHBsYW5lcy4KLSAgaW50IHlfYWNjdW07ICAgICAgICAgICAgICAgIC8vIHZlcnRpY2FsIGFjY3VtdWxhdG9yCi0gIGludCB5X2FkZCwgeV9zdWI7ICAgICAgICAgICAvLyB2ZXJ0aWNhbCBpbmNyZW1lbnRzIChhZGQgfj0gc3JjLCBzdWIgfj0gZHN0KQotICBpbnQgeF9hZGQsIHhfc3ViOyAgICAgICAgICAgLy8gaG9yaXpvbnRhbCBpbmNyZW1lbnRzIChhZGQgfj0gc3JjLCBzdWIgfj0gZHN0KQotICBpbnQgc3JjX3dpZHRoLCBzcmNfaGVpZ2h0OyAgLy8gc291cmNlIGRpbWVuc2lvbnMKLSAgaW50IGRzdF93aWR0aCwgZHN0X2hlaWdodDsgIC8vIGRlc3RpbmF0aW9uIGRpbWVuc2lvbnMKLSAgdWludDhfdCogZHN0OwotICBpbnQgZHN0X3N0cmlkZTsKLSAgaW50MzJfdCogaXJvdywgKmZyb3c7ICAgICAgIC8vIHdvcmsgYnVmZmVyCi19IFdlYlBSZXNjYWxlcjsKLQotLy8gSW5pdGlhbGl6ZSBhIHJlc2NhbGVyIGdpdmVuIHNjcmF0Y2ggYXJlYSAnd29yaycgYW5kIGRpbWVuc2lvbnMgb2Ygc3JjICYgZHN0Lgotdm9pZCBXZWJQUmVzY2FsZXJJbml0KFdlYlBSZXNjYWxlciogY29uc3Qgd3JrLCBpbnQgc3JjX3dpZHRoLCBpbnQgc3JjX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBjb25zdCBkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF93aWR0aCwgaW50IGRzdF9oZWlnaHQsIGludCBkc3Rfc3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHhfYWRkLCBpbnQgeF9zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IHlfYWRkLCBpbnQgeV9zdWIsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogY29uc3Qgd29yayk7Ci0KLS8vIEltcG9ydCBhIHJvdyBvZiBkYXRhIGFuZCBzYXZlIGl0cyBjb250cmlidXRpb24gaW4gdGhlIHJlc2NhbGVyLgotLy8gJ2NoYW5uZWwnIGRlbm90ZXMgdGhlIGNoYW5uZWwgbnVtYmVyIHRvIGJlIGltcG9ydGVkLgotdm9pZCBXZWJQUmVzY2FsZXJJbXBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCByZXNjYWxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0IHNyYywgaW50IGNoYW5uZWwpOwotCi0vLyBJbXBvcnQgbXVsdGlwbGUgcm93cyBvdmVyIGFsbCBjaGFubmVscywgdW50aWwgYXQgbGVhc3Qgb25lIHJvdyBpcyByZWFkeSB0bwotLy8gYmUgZXhwb3J0ZWQuIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgbGluZXMgdGhhdCB3ZXJlIGltcG9ydGVkLgotaW50IFdlYlBSZXNjYWxlckltcG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyLCBpbnQgbnVtX3Jvd3MsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyYywgaW50IHNyY19zdHJpZGUpOwotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBwZW5kaW5nIG91dHB1dCByb3dzIHJlYWR5Lgotc3RhdGljIFdFQlBfSU5MSU5FCi1pbnQgV2ViUFJlc2NhbGVySGFzUGVuZGluZ091dHB1dChjb25zdCBXZWJQUmVzY2FsZXIqIGNvbnN0IHJlc2NhbGVyKSB7Ci0gIHJldHVybiAocmVzY2FsZXItPnlfYWNjdW0gPD0gMCk7Ci19Ci0KLS8vIEV4cG9ydCBvbmUgcm93IGZyb20gcmVzY2FsZXIuIFJldHVybnMgdGhlIHBvaW50ZXIgd2hlcmUgb3V0cHV0IHdhcyB3cml0dGVuLAotLy8gb3IgTlVMTCBpZiBubyByb3cgd2FzIHBlbmRpbmcuCi11aW50OF90KiBXZWJQUmVzY2FsZXJFeHBvcnRSb3coV2ViUFJlc2NhbGVyKiBjb25zdCB3cmspOwotCi0vLyBFeHBvcnQgYXMgbWFueSByb3dzIGFzIHBvc3NpYmxlLiBSZXR1cm4gdGhlIG51bWJlcnMgb2Ygcm93cyB3cml0dGVuLgotaW50IFdlYlBSZXNjYWxlckV4cG9ydChXZWJQUmVzY2FsZXIqIGNvbnN0IHdyayk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfUkVTQ0FMRVJfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3RocmVhZC5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NDAzYTguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTEgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE11bHRpLXRocmVhZGVkIHdvcmtlcgotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLQotI2lmIGRlZmluZWQoU1RBUkJPQVJEKQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCi0jZWxzZQotI2luY2x1ZGUgPHN0cmluZy5oPiAgIC8vIGZvciBTYk1lbW9yeVNldCgpCi0jZW5kaWYKLSNpbmNsdWRlICIuL3RocmVhZC5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzaW1wbGlzdGljIHB0aHJlYWQgZW11bGF0aW9uIGxheWVyCi0KLSNpbmNsdWRlIDxwcm9jZXNzLmg+Ci0KLS8vIF9iZWdpbnRocmVhZGV4IHJlcXVpcmVzIF9fc3RkY2FsbAotI2RlZmluZSBUSFJFQURGTiB1bnNpZ25lZCBpbnQgX19zdGRjYWxsCi0jZGVmaW5lIFRIUkVBRF9SRVRVUk4odmFsKSAodW5zaWduZWQgaW50KSgoRFdPUkRfUFRSKXZhbCkKLQotc3RhdGljIGludCBwdGhyZWFkX2NyZWF0ZShwdGhyZWFkX3QqIGNvbnN0IHRocmVhZCwgY29uc3Qgdm9pZCogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IChfX3N0ZGNhbGwgKnN0YXJ0KSh2b2lkKiksIHZvaWQqIGFyZykgewotICAodm9pZClhdHRyOwotICAqdGhyZWFkID0gKHB0aHJlYWRfdClfYmVnaW50aHJlYWRleChOVUxMLCAgIC8qIHZvaWQgKnNlY3VyaXR5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgLyogdW5zaWduZWQgc3RhY2tfc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgIC8qIHVuc2lnbmVkIGluaXRmbGFnICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOyAgLyogdW5zaWduZWQgKnRocmRhZGRyICovCi0gIGlmICgqdGhyZWFkID09IE5VTEwpIHJldHVybiAxOwotICBTZXRUaHJlYWRQcmlvcml0eSgqdGhyZWFkLCBUSFJFQURfUFJJT1JJVFlfQUJPVkVfTk9STUFMKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9qb2luKHB0aHJlYWRfdCB0aHJlYWQsIHZvaWQqKiB2YWx1ZV9wdHIpIHsKLSAgKHZvaWQpdmFsdWVfcHRyOwotICByZXR1cm4gKFdhaXRGb3JTaW5nbGVPYmplY3QodGhyZWFkLCBJTkZJTklURSkgIT0gV0FJVF9PQkpFQ1RfMCB8fAotICAgICAgICAgIENsb3NlSGFuZGxlKHRocmVhZCkgPT0gMCk7Ci19Ci0KLS8vIE11dGV4Ci1zdGF0aWMgaW50IHB0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4LCB2b2lkKiBtdXRleGF0dHIpIHsKLSAgKHZvaWQpbXV0ZXhhdHRyOwotICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9sb2NrKHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKLSAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIExlYXZlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHRocmVhZF9tdXRleF9kZXN0cm95KHB0aHJlYWRfbXV0ZXhfdCogY29uc3QgbXV0ZXgpIHsKLSAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKG11dGV4KTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIENvbmRpdGlvbgotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfZGVzdHJveShwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uKSB7Ci0gIGludCBvayA9IDE7Ci0gIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPndhaXRpbmdfc2VtXykgIT0gMCk7Ci0gIG9rICY9IChDbG9zZUhhbmRsZShjb25kaXRpb24tPnJlY2VpdmVkX3NlbV8pICE9IDApOwotICBvayAmPSAoQ2xvc2VIYW5kbGUoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKSAhPSAwKTsKLSAgcmV0dXJuICFvazsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uLCB2b2lkKiBjb25kX2F0dHIpIHsKLSAgKHZvaWQpY29uZF9hdHRyOwotICBjb25kaXRpb24tPndhaXRpbmdfc2VtXyA9IENyZWF0ZVNlbWFwaG9yZShOVUxMLCAwLCAxLCBOVUxMKTsKLSAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID0gQ3JlYXRlU2VtYXBob3JlKE5VTEwsIDAsIDEsIE5VTEwpOwotICBjb25kaXRpb24tPnNpZ25hbF9ldmVudF8gPSBDcmVhdGVFdmVudChOVUxMLCBGQUxTRSwgRkFMU0UsIE5VTEwpOwotICBpZiAoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8gPT0gTlVMTCB8fAotICAgICAgY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fID09IE5VTEwgfHwKLSAgICAgIGNvbmRpdGlvbi0+c2lnbmFsX2V2ZW50XyA9PSBOVUxMKSB7Ci0gICAgcHRocmVhZF9jb25kX2Rlc3Ryb3koY29uZGl0aW9uKTsKLSAgICByZXR1cm4gMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfc2lnbmFsKHB0aHJlYWRfY29uZF90KiBjb25zdCBjb25kaXRpb24pIHsKLSAgaW50IG9rID0gMTsKLSAgaWYgKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT53YWl0aW5nX3NlbV8sIDApID09IFdBSVRfT0JKRUNUXzApIHsKLSAgICAvLyBhIHRocmVhZCBpcyB3YWl0aW5nIGluIHB0aHJlYWRfY29uZF93YWl0OiBhbGxvdyBpdCB0byBiZSBub3RpZmllZAotICAgIG9rID0gU2V0RXZlbnQoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfKTsKLSAgICAvLyB3YWl0IHVudGlsIHRoZSBldmVudCBpcyBjb25zdW1lZCBzbyB0aGUgc2lnbmFsZXIgY2Fubm90IGNvbnN1bWUKLSAgICAvLyB0aGUgZXZlbnQgdmlhIGl0cyBvd24gcHRocmVhZF9jb25kX3dhaXQuCi0gICAgb2sgJj0gKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fLCBJTkZJTklURSkgIT0KLSAgICAgICAgICAgV0FJVF9PQkpFQ1RfMCk7Ci0gIH0KLSAgcmV0dXJuICFvazsKLX0KLQotc3RhdGljIGludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCogY29uc3QgY29uZGl0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdGhyZWFkX211dGV4X3QqIGNvbnN0IG11dGV4KSB7Ci0gIGludCBvazsKLSAgLy8gbm90ZSB0aGF0IHRoZXJlIGlzIGEgY29uc3VtZXIgYXZhaWxhYmxlIHNvIHRoZSBzaWduYWwgaXNuJ3QgZHJvcHBlZCBpbgotICAvLyBwdGhyZWFkX2NvbmRfc2lnbmFsCi0gIGlmICghUmVsZWFzZVNlbWFwaG9yZShjb25kaXRpb24tPndhaXRpbmdfc2VtXywgMSwgTlVMTCkpCi0gICAgcmV0dXJuIDE7Ci0gIC8vIG5vdyB1bmxvY2sgdGhlIG11dGV4IHNvIHB0aHJlYWRfY29uZF9zaWduYWwgbWF5IGJlIGlzc3VlZAotICBwdGhyZWFkX211dGV4X3VubG9jayhtdXRleCk7Ci0gIG9rID0gKFdhaXRGb3JTaW5nbGVPYmplY3QoY29uZGl0aW9uLT5zaWduYWxfZXZlbnRfLCBJTkZJTklURSkgPT0KLSAgICAgICAgV0FJVF9PQkpFQ1RfMCk7Ci0gIG9rICY9IFJlbGVhc2VTZW1hcGhvcmUoY29uZGl0aW9uLT5yZWNlaXZlZF9zZW1fLCAxLCBOVUxMKTsKLSAgcHRocmVhZF9tdXRleF9sb2NrKG11dGV4KTsKLSAgcmV0dXJuICFvazsKLX0KLQotI2Vsc2UgIC8vIF9XSU4zMgotIyBkZWZpbmUgVEhSRUFERk4gdm9pZCoKLSMgZGVmaW5lIFRIUkVBRF9SRVRVUk4odmFsKSB2YWwKLSNlbmRpZgotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgVEhSRUFERk4gV2ViUFdvcmtlclRocmVhZExvb3Aodm9pZCAqcHRyKSB7ICAgIC8vIHRocmVhZCBsb29wCi0gIFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlciA9IChXZWJQV29ya2VyKilwdHI7Ci0gIGludCBkb25lID0gMDsKLSAgd2hpbGUgKCFkb25lKSB7Ci0gICAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gICAgd2hpbGUgKHdvcmtlci0+c3RhdHVzXyA9PSBPSykgeyAgIC8vIHdhaXQgaW4gaWRsaW5nIG1vZGUKLSAgICAgIHB0aHJlYWRfY29uZF93YWl0KCZ3b3JrZXItPmNvbmRpdGlvbl8sICZ3b3JrZXItPm11dGV4Xyk7Ci0gICAgfQotICAgIGlmICh3b3JrZXItPnN0YXR1c18gPT0gV09SSykgewotICAgICAgaWYgKHdvcmtlci0+aG9vaykgewotICAgICAgICB3b3JrZXItPmhhZF9lcnJvciB8PSAhd29ya2VyLT5ob29rKHdvcmtlci0+ZGF0YTEsIHdvcmtlci0+ZGF0YTIpOwotICAgICAgfQotICAgICAgd29ya2VyLT5zdGF0dXNfID0gT0s7Ci0gICAgfSBlbHNlIGlmICh3b3JrZXItPnN0YXR1c18gPT0gTk9UX09LKSB7ICAgLy8gZmluaXNoIHRoZSB3b3JrZXIKLSAgICAgIGRvbmUgPSAxOwotICAgIH0KLSAgICAvLyBzaWduYWwgdG8gdGhlIG1haW4gdGhyZWFkIHRoYXQgd2UncmUgZG9uZSAoZm9yIFN5bmMoKSkKLSAgICBwdGhyZWFkX2NvbmRfc2lnbmFsKCZ3b3JrZXItPmNvbmRpdGlvbl8pOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gIH0KLSAgcmV0dXJuIFRIUkVBRF9SRVRVUk4oTlVMTCk7ICAgIC8vIFRocmVhZCBpcyBmaW5pc2hlZAotfQotCi0vLyBtYWluIHRocmVhZCBzdGF0ZSBjb250cm9sCi1zdGF0aWMgdm9pZCBXZWJQV29ya2VyQ2hhbmdlU3RhdGUoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBXb3JrZXJTdGF0dXMgbmV3X3N0YXR1cykgewotICAvLyBuby1vcCB3aGVuIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHN0YXRlIG9uIGEgdGhyZWFkIHRoYXQgZGlkbid0IGNvbWUgdXAKLSAgaWYgKHdvcmtlci0+c3RhdHVzXyA8IE9LKSByZXR1cm47Ci0KLSAgcHRocmVhZF9tdXRleF9sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0gIC8vIHdhaXQgZm9yIHRoZSB3b3JrZXIgdG8gZmluaXNoCi0gIHdoaWxlICh3b3JrZXItPnN0YXR1c18gIT0gT0spIHsKLSAgICBwdGhyZWFkX2NvbmRfd2FpdCgmd29ya2VyLT5jb25kaXRpb25fLCAmd29ya2VyLT5tdXRleF8pOwotICB9Ci0gIC8vIGFzc2lnbiBuZXcgc3RhdHVzIGFuZCByZWxlYXNlIHRoZSB3b3JraW5nIHRocmVhZCBpZiBuZWVkZWQKLSAgaWYgKG5ld19zdGF0dXMgIT0gT0spIHsKLSAgICB3b3JrZXItPnN0YXR1c18gPSBuZXdfc3RhdHVzOwotICAgIHB0aHJlYWRfY29uZF9zaWduYWwoJndvcmtlci0+Y29uZGl0aW9uXyk7Ci0gIH0KLSAgcHRocmVhZF9tdXRleF91bmxvY2soJndvcmtlci0+bXV0ZXhfKTsKLX0KLQotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgV2ViUFdvcmtlckluaXQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0gIFNiTWVtb3J5U2V0KHdvcmtlciwgMCwgc2l6ZW9mKCp3b3JrZXIpKTsKLSAgd29ya2VyLT5zdGF0dXNfID0gTk9UX09LOwotfQotCi1pbnQgV2ViUFdvcmtlclN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0jaWZkZWYgV0VCUF9VU0VfVEhSRUFECi0gIFdlYlBXb3JrZXJDaGFuZ2VTdGF0ZSh3b3JrZXIsIE9LKTsKLSNlbmRpZgotICBTQl9EQ0hFQ0sod29ya2VyLT5zdGF0dXNfIDw9IE9LKTsKLSAgcmV0dXJuICF3b3JrZXItPmhhZF9lcnJvcjsKLX0KLQotaW50IFdlYlBXb3JrZXJSZXNldChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpIHsKLSAgaW50IG9rID0gMTsKLSAgd29ya2VyLT5oYWRfZXJyb3IgPSAwOwotICBpZiAod29ya2VyLT5zdGF0dXNfIDwgT0spIHsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBpZiAocHRocmVhZF9tdXRleF9pbml0KCZ3b3JrZXItPm11dGV4XywgTlVMTCkgfHwKLSAgICAgICAgcHRocmVhZF9jb25kX2luaXQoJndvcmtlci0+Y29uZGl0aW9uXywgTlVMTCkpIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBwdGhyZWFkX211dGV4X2xvY2soJndvcmtlci0+bXV0ZXhfKTsKLSAgICBvayA9ICFwdGhyZWFkX2NyZWF0ZSgmd29ya2VyLT50aHJlYWRfLCBOVUxMLCBXZWJQV29ya2VyVGhyZWFkTG9vcCwgd29ya2VyKTsKLSAgICBpZiAob2spIHdvcmtlci0+c3RhdHVzXyA9IE9LOwotICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZ3b3JrZXItPm11dGV4Xyk7Ci0jZWxzZQotICAgIHdvcmtlci0+c3RhdHVzXyA9IE9LOwotI2VuZGlmCi0gIH0gZWxzZSBpZiAod29ya2VyLT5zdGF0dXNfID4gT0spIHsKLSAgICBvayA9IFdlYlBXb3JrZXJTeW5jKHdvcmtlcik7Ci0gIH0KLSAgU0JfRENIRUNLKCFvayB8fCAod29ya2VyLT5zdGF0dXNfID09IE9LKSk7Ci0gIHJldHVybiBvazsKLX0KLQotdm9pZCBXZWJQV29ya2VyTGF1bmNoKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcikgewotI2lmZGVmIFdFQlBfVVNFX1RIUkVBRAotICBXZWJQV29ya2VyQ2hhbmdlU3RhdGUod29ya2VyLCBXT1JLKTsKLSNlbHNlCi0gIGlmICh3b3JrZXItPmhvb2spCi0gICAgd29ya2VyLT5oYWRfZXJyb3IgfD0gIXdvcmtlci0+aG9vayh3b3JrZXItPmRhdGExLCB3b3JrZXItPmRhdGEyKTsKLSNlbmRpZgotfQotCi12b2lkIFdlYlBXb3JrZXJFbmQoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKSB7Ci0gIGlmICh3b3JrZXItPnN0YXR1c18gPj0gT0spIHsKLSNpZmRlZiBXRUJQX1VTRV9USFJFQUQKLSAgICBXZWJQV29ya2VyQ2hhbmdlU3RhdGUod29ya2VyLCBOT1RfT0spOwotICAgIHB0aHJlYWRfam9pbih3b3JrZXItPnRocmVhZF8sIE5VTEwpOwotICAgIHB0aHJlYWRfbXV0ZXhfZGVzdHJveSgmd29ya2VyLT5tdXRleF8pOwotICAgIHB0aHJlYWRfY29uZF9kZXN0cm95KCZ3b3JrZXItPmNvbmRpdGlvbl8pOwotI2Vsc2UKLSAgICB3b3JrZXItPnN0YXR1c18gPSBOT1RfT0s7Ci0jZW5kaWYKLSAgfQotICBTQl9EQ0hFQ0sod29ya2VyLT5zdGF0dXNfID09IE5PVF9PSyk7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdGhyZWFkLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy90aHJlYWQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhNjFhNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy90aHJlYWQuaAorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDExIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBNdWx0aS10aHJlYWRlZCB3b3JrZXIKLS8vCi0vLyBBdXRob3I6IFNrYWwgKHBhc2NhbC5tYXNzaW1pbm9AZ21haWwuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfVEhSRUFEX0hfCi0jZGVmaW5lIFdFQlBfVVRJTFNfVEhSRUFEX0hfCi0KLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLSNpZiBXRUJQX1VTRV9USFJFQUQKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotCi0jaW5jbHVkZSA8d2luZG93cy5oPgotdHlwZWRlZiBIQU5ETEUgcHRocmVhZF90OwotdHlwZWRlZiBDUklUSUNBTF9TRUNUSU9OIHB0aHJlYWRfbXV0ZXhfdDsKLXR5cGVkZWYgc3RydWN0IHsKLSAgSEFORExFIHdhaXRpbmdfc2VtXzsKLSAgSEFORExFIHJlY2VpdmVkX3NlbV87Ci0gIEhBTkRMRSBzaWduYWxfZXZlbnRfOwotfSBwdGhyZWFkX2NvbmRfdDsKLQotI2Vsc2UKLQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLQotI2VuZGlmICAgIC8qIF9XSU4zMiAqLwotI2VuZGlmICAgIC8qIFdFQlBfVVNFX1RIUkVBRCAqLwotCi0vLyBTdGF0ZSBvZiB0aGUgd29ya2VyIHRocmVhZCBvYmplY3QKLXR5cGVkZWYgZW51bSB7Ci0gIE5PVF9PSyA9IDAsICAgLy8gb2JqZWN0IGlzIHVudXNhYmxlCi0gIE9LLCAgICAgICAgICAgLy8gcmVhZHkgdG8gd29yawotICBXT1JLICAgICAgICAgIC8vIGJ1c3kgZmluaXNoaW5nIHRoZSBjdXJyZW50IHRhc2sKLX0gV2ViUFdvcmtlclN0YXR1czsKLQotLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJ5IHRoZSB3b3JrZXIgdGhyZWFkLiBUYWtlcyB0d28gb3BhcXVlIHBvaW50ZXJzIGFzCi0vLyBhcmd1bWVudHMgKGRhdGExIGFuZCBkYXRhMiksIGFuZCBzaG91bGQgcmV0dXJuIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi10eXBlZGVmIGludCAoKldlYlBXb3JrZXJIb29rKSh2b2lkKiwgdm9pZCopOwotCi0vLyBTeW5jaHJvbml6ZSBvYmplY3QgdXNlZCB0byBsYXVuY2ggam9iIGluIHRoZSB3b3JrZXIgdGhyZWFkCi10eXBlZGVmIHN0cnVjdCB7Ci0jaWYgV0VCUF9VU0VfVEhSRUFECi0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleF87Ci0gIHB0aHJlYWRfY29uZF90ICBjb25kaXRpb25fOwotICBwdGhyZWFkX3QgICAgICAgdGhyZWFkXzsKLSNlbmRpZgotICBXZWJQV29ya2VyU3RhdHVzIHN0YXR1c187Ci0gIFdlYlBXb3JrZXJIb29rIGhvb2s7ICAgIC8vIGhvb2sgdG8gY2FsbAotICB2b2lkKiBkYXRhMTsgICAgICAgICAgICAvLyBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCi0gIHZvaWQqIGRhdGEyOyAgICAgICAgICAgIC8vIHNlY29uZCBhcmd1bWVudCBwYXNzZWQgdG8gJ2hvb2snCi0gIGludCBoYWRfZXJyb3I7ICAgICAgICAgIC8vIHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBjYWxsIHRvICdob29rJwotfSBXZWJQV29ya2VyOwotCi0vLyBNdXN0IGJlIGNhbGxlZCBmaXJzdCwgYmVmb3JlIGFueSBvdGhlciBtZXRob2QuCi12b2lkIFdlYlBXb3JrZXJJbml0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0vLyBNdXN0IGJlIGNhbGxlZCB0byBpbml0aWFsaXplIHRoZSBvYmplY3QgYW5kIHNwYXduIHRoZSB0aHJlYWQuIFJlLWVudHJhbnQuCi0vLyBXaWxsIHBvdGVudGlhbGx5IGxhdW5jaCB0aGUgdGhyZWFkLiBSZXR1cm5zIGZhbHNlIGluIGNhc2Ugb2YgZXJyb3IuCi1pbnQgV2ViUFdvcmtlclJlc2V0KFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0vLyBNYWtlcyBzdXJlIHRoZSBwcmV2aW91cyB3b3JrIGlzIGZpbmlzaGVkLiBSZXR1cm5zIHRydWUgaWYgd29ya2VyLT5oYWRfZXJyb3IKLS8vIHdhcyBub3Qgc2V0IGFuZCBubyBlcnJvciBjb25kaXRpb24gd2FzIHRyaWdnZXJlZCBieSB0aGUgd29ya2luZyB0aHJlYWQuCi1pbnQgV2ViUFdvcmtlclN5bmMoV2ViUFdvcmtlciogY29uc3Qgd29ya2VyKTsKLS8vIFRyaWdnZXJzIHRoZSB0aHJlYWQgdG8gY2FsbCBob29rKCkgd2l0aCBkYXRhMSBhbmQgZGF0YTIgYXJndW1lbnQuIFRoZXNlCi0vLyBob29rL2RhdGExL2RhdGEyIGNhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24sCi0vLyBidXQgbm90IGJlIGNoYW5nZWQgYWZ0ZXJ3YXJkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gV2ViUFdvcmtlclN5bmMoKS4KLXZvaWQgV2ViUFdvcmtlckxhdW5jaChXZWJQV29ya2VyKiBjb25zdCB3b3JrZXIpOwotLy8gS2lsbCB0aGUgdGhyZWFkIGFuZCB0ZXJtaW5hdGUgdGhlIG9iamVjdC4gVG8gdXNlIHRoZSBvYmplY3QgYWdhaW4sIG9uZQotLy8gbXVzdCBjYWxsIFdlYlBXb3JrZXJSZXNldCgpIGFnYWluLgotdm9pZCBXZWJQV29ya2VyRW5kKFdlYlBXb3JrZXIqIGNvbnN0IHdvcmtlcik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfVVRJTFNfVEhSRUFEX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5jIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvdXRpbHMvdXRpbHMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk2OTdjMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlCi0vLyB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgQ09QWUlORyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UKLS8vIHRyZWUuIEFuIGFkZGl0aW9uYWwgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBncmFudCBjYW4gYmUgZm91bmQKLS8vIGluIHRoZSBmaWxlIFBBVEVOVFMuIEFsbCBjb250cmlidXRpbmcgcHJvamVjdCBhdXRob3JzIG1heQotLy8gYmUgZm91bmQgaW4gdGhlIEFVVEhPUlMgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIE1pc2MuIGNvbW1vbiB1dGlsaXR5IGZ1bmN0aW9ucwotLy8KLS8vIEF1dGhvcjogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0KLSNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgotI2Vsc2UKLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNlbmRpZgotI2luY2x1ZGUgIi4vdXRpbHMuaCIKLQotI2lmIGRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoY19wbHVzcGx1cykKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDaGVja2VkIG1lbW9yeSBhbGxvY2F0aW9uCi0KLS8vIFJldHVybnMgMCBpbiBjYXNlIG9mIG92ZXJmbG93IG9mIG5tZW1iICogc2l6ZS4KLXN0YXRpYyBpbnQgQ2hlY2tTaXplQXJndW1lbnRzT3ZlcmZsb3codWludDY0X3Qgbm1lbWIsIHNpemVfdCBzaXplKSB7Ci0gIGNvbnN0IHVpbnQ2NF90IHRvdGFsX3NpemUgPSBubWVtYiAqIHNpemU7Ci0gIGlmIChubWVtYiA9PSAwKSByZXR1cm4gMTsKLSAgaWYgKCh1aW50NjRfdClzaXplID4gV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAvIG5tZW1iKSByZXR1cm4gMDsKLSAgaWYgKHRvdGFsX3NpemUgIT0gKHNpemVfdCl0b3RhbF9zaXplKSByZXR1cm4gMDsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQqIFdlYlBTYWZlTWFsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7Ci0gIFNCX0RDSEVDSyhubWVtYiAqIHNpemUgPiAwKTsKLSAgcmV0dXJuIFNiTWVtb3J5QWxsb2NhdGUoKHNpemVfdCkobm1lbWIgKiBzaXplKSk7Ci19Ci0KLXZvaWQqIFdlYlBTYWZlQ2FsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSkgewotICBpZiAoIUNoZWNrU2l6ZUFyZ3VtZW50c092ZXJmbG93KG5tZW1iLCBzaXplKSkgcmV0dXJuIE5VTEw7Ci0gIFNCX0RDSEVDSyhubWVtYiAqIHNpemUgPiAwKTsKLSAgcmV0dXJuIFNiTWVtb3J5Q2FsbG9jKChzaXplX3Qpbm1lbWIsIHNpemUpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3V0aWxzLmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC91dGlscy91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjVjMzM5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3V0aWxzL3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gTWlzYy4gY29tbW9uIHV0aWxpdHkgZnVuY3Rpb25zCi0vLwotLy8gQXV0aG9yczogU2thbCAocGFzY2FsLm1hc3NpbWlub0BnbWFpbC5jb20pCi0vLyAgICAgICAgICBVcnZhbmcgKHVydmFuZ0Bnb29nbGUuY29tKQotCi0jaWZuZGVmIFdFQlBfVVRJTFNfVVRJTFNfSF8KLSNkZWZpbmUgV0VCUF9VVElMU19VVElMU19IXwotCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2Vsc2UKLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSAiLi4vd2VicC90eXBlcy5oIgotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lbW9yeSBhbGxvY2F0aW9uCi0KLS8vIFRoaXMgaXMgdGhlIG1heGltdW0gbWVtb3J5IGFtb3VudCB0aGF0IGxpYndlYnAgd2lsbCBldmVyIHRyeSB0byBhbGxvY2F0ZS4KLSNkZWZpbmUgV0VCUF9NQVhfQUxMT0NBQkxFX01FTU9SWSAoMVVMTCA8PCA0MCkKLQotLy8gc2l6ZS1jaGVja2luZyBzYWZlIG1hbGxvYy9jYWxsb2M6IHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgdG9vCi0vLyBsYXJnZSwgb3IgcmV0dXJuIE5VTEwuIFlvdSBkb24ndCBuZWVkIHRvIGNhbGwgdGhlc2UgZm9yIGNvbnN0cnVjdHMgbGlrZQotLy8gbWFsbG9jKHNpemVvZihmb28pKSwgYnV0IG9ubHkgaWYgdGhlcmUncyBwaWN0dXJlLWRlcGVuZGVudCBzaXplIGludm9sdmVkCi0vLyBzb21ld2hlcmUgKGxpa2U6IG1hbGxvYyhudW1fcGl4ZWxzICogc2l6ZW9mKCpzb21ldGhpbmcpKSkuIFRoYXQncyB3aHkgdGhpcwotLy8gc2FmZSBtYWxsb2MoKSBib3Jyb3dzIHRoZSBzaWduYXR1cmUgZnJvbSBtYWxsb2MoKSwgcG9pbnRpbmcgYXQgdGhlIGRhbmdlcm91cwotLy8gdW5kZXJseWluZyBtdWx0aXBseSBpbnZvbHZlZC4KLXZvaWQqIFdlYlBTYWZlTWFsbG9jKHVpbnQ2NF90IG5tZW1iLCBzaXplX3Qgc2l6ZSk7Ci0vLyBOb3RlIHRoYXQgV2ViUFNhZmVDYWxsb2MoKSBleHBlY3RzIHRoZSBzZWNvbmQgYXJndW1lbnQgdHlwZSB0byBiZSAnc2l6ZV90JwotLy8gaW4gb3JkZXIgdG8gZmF2b3IgdGhlICJTYk1lbW9yeUNhbGxvYyhudW1fZm9vLCBzaXplb2YoZm9vKSkiIHBhdHRlcm4uCi12b2lkKiBXZWJQU2FmZUNhbGxvYyh1aW50NjRfdCBubWVtYiwgc2l6ZV90IHNpemUpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmVhZGluZy93cml0aW5nIGRhdGEuCi0KLS8vIFJlYWQgMTYsIDI0IG9yIDMyIGJpdHMgc3RvcmVkIGluIGxpdHRsZS1lbmRpYW4gb3JkZXIuCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMTYoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gKGludCkoZGF0YVswXSA8PCAwKSB8IChkYXRhWzFdIDw8IDgpOwotfQotCi1zdGF0aWMgV0VCUF9JTkxJTkUgaW50IEdldExFMjQoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gR2V0TEUxNihkYXRhKSB8IChkYXRhWzJdIDw8IDE2KTsKLX0KLQotc3RhdGljIFdFQlBfSU5MSU5FIHVpbnQzMl90IEdldExFMzIoY29uc3QgdWludDhfdCogY29uc3QgZGF0YSkgewotICByZXR1cm4gKHVpbnQzMl90KUdldExFMTYoZGF0YSkgfCAoR2V0TEUxNihkYXRhICsgMikgPDwgMTYpOwotfQotCi0vLyBTdG9yZSAxNiwgMjQgb3IgMzIgYml0cyBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgotc3RhdGljIFdFQlBfSU5MSU5FIHZvaWQgUHV0TEUxNih1aW50OF90KiBjb25zdCBkYXRhLCBpbnQgdmFsKSB7Ci0gIFNCX0RDSEVDSyh2YWwgPCAoMSA8PCAxNikpOwotICBkYXRhWzBdID0gKHZhbCA+PiAwKTsKLSAgZGF0YVsxXSA9ICh2YWwgPj4gOCk7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMjQodWludDhfdCogY29uc3QgZGF0YSwgaW50IHZhbCkgewotICBTQl9EQ0hFQ0sodmFsIDwgKDEgPDwgMjQpKTsKLSAgUHV0TEUxNihkYXRhLCB2YWwgJiAweGZmZmYpOwotICBkYXRhWzJdID0gKHZhbCA+PiAxNik7Ci19Ci0KLXN0YXRpYyBXRUJQX0lOTElORSB2b2lkIFB1dExFMzIodWludDhfdCogY29uc3QgZGF0YSwgdWludDMyX3QgdmFsKSB7Ci0gIFB1dExFMTYoZGF0YSwgKGludCkodmFsICYgMHhmZmZmKSk7Ci0gIFB1dExFMTYoZGF0YSArIDIsIChpbnQpKHZhbCA+PiAxNikpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChjX3BsdXNwbHVzKQotfSAgICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmICAvKiBXRUJQX1VUSUxTX1VUSUxTX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlbXV4LmggYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwL2RlbXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2Q1ZDYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9kZW11eC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZQotLy8gdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIENPUFlJTkcgZmlsZSBpbiB0aGUgcm9vdCBvZiB0aGUgc291cmNlCi0vLyB0cmVlLiBBbiBhZGRpdGlvbmFsIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgZ3JhbnQgY2FuIGJlIGZvdW5kCi0vLyBpbiB0aGUgZmlsZSBQQVRFTlRTLiBBbGwgY29udHJpYnV0aW5nIHByb2plY3QgYXV0aG9ycyBtYXkKLS8vIGJlIGZvdW5kIGluIHRoZSBBVVRIT1JTIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyBEZW11eCBBUEkuCi0vLyBFbmFibGVzIGV4dHJhY3Rpb24gb2YgaW1hZ2UgYW5kIGV4dGVuZGVkIGZvcm1hdCBkYXRhIGZyb20gV2ViUCBmaWxlcy4KLQotLy8gQ29kZSBFeGFtcGxlOiBEZW11eGluZyBXZWJQIGRhdGEgdG8gZXh0cmFjdCBhbGwgdGhlIGZyYW1lcywgSUNDIHByb2ZpbGUKLS8vIGFuZCBFWElGL1hNUCBtZXRhZGF0YS4KLS8vCi0vLyAgIFdlYlBEZW11eGVyKiBkZW11eCA9IFdlYlBEZW11eCgmd2VicF9kYXRhKTsKLS8vCi0vLyAgIHVpbnQzMl90IHdpZHRoID0gV2ViUERlbXV4R2V0SShkZW11eCwgV0VCUF9GRl9DQU5WQVNfV0lEVEgpOwotLy8gICB1aW50MzJfdCBoZWlnaHQgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0NBTlZBU19IRUlHSFQpOwotLy8gICAvLyAuLi4gKEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmVhdHVyZXMgcHJlc2VudCBpbiB0aGUgV2ViUCBmaWxlKS4KLS8vICAgdWludDMyX3QgZmxhZ3MgPSBXZWJQRGVtdXhHZXRJKGRlbXV4LCBXRUJQX0ZGX0ZPUk1BVF9GTEFHUyk7Ci0vLwotLy8gICAvLyAuLi4gKEl0ZXJhdGUgb3ZlciBhbGwgZnJhbWVzKS4KLS8vICAgV2ViUEl0ZXJhdG9yIGl0ZXI7Ci0vLyAgIGlmIChXZWJQRGVtdXhHZXRGcmFtZShkZW11eCwgMSwgJml0ZXIpKSB7Ci0vLyAgICAgZG8gewotLy8gICAgICAgLy8gLi4uIChDb25zdW1lICdpdGVyJzsgZS5nLiBEZWNvZGUgJ2l0ZXIuZnJhZ21lbnQnIHdpdGggV2ViUERlY29kZSgpLAotLy8gICAgICAgLy8gLi4uIGFuZCBnZXQgb3RoZXIgZnJhbWUgcHJvcGVydGllcyBsaWtlIHdpZHRoLCBoZWlnaHQsIG9mZnNldHMgZXRjLgotLy8gICAgICAgLy8gLi4uIHNlZSAnc3RydWN0IFdlYlBJdGVyYXRvcicgYmVsb3cgZm9yIG1vcmUgaW5mbykuCi0vLyAgICAgfSB3aGlsZSAoV2ViUERlbXV4TmV4dEZyYW1lKCZpdGVyKSk7Ci0vLyAgICAgV2ViUERlbXV4UmVsZWFzZUl0ZXJhdG9yKCZpdGVyKTsKLS8vICAgfQotLy8KLS8vICAgLy8gLi4uIChFeHRyYWN0IG1ldGFkYXRhKS4KLS8vICAgV2ViUENodW5rSXRlcmF0b3IgY2h1bmtfaXRlcjsKLS8vICAgaWYgKGZsYWdzICYgSUNDUF9GTEFHKSBXZWJQRGVtdXhHZXRDaHVuayhkZW11eCwgIklDQ1AiLCAxLCAmY2h1bmtfaXRlcik7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSB0aGUgSUNDIHByb2ZpbGUgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KLS8vICAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOwotLy8gICBpZiAoZmxhZ3MgJiBFWElGX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiRVhJRiIsIDEsICZjaHVua19pdGVyKTsKLS8vICAgLy8gLi4uIChDb25zdW1lIHRoZSBFWElGIG1ldGFkYXRhIGluICdjaHVua19pdGVyLmNodW5rJykuCi0vLyAgIFdlYlBEZW11eFJlbGVhc2VDaHVua0l0ZXJhdG9yKCZjaHVua19pdGVyKTsKLS8vICAgaWYgKGZsYWdzICYgWE1QX0ZMQUcpIFdlYlBEZW11eEdldENodW5rKGRlbXV4LCAiWE1QICIsIDEsICZjaHVua19pdGVyKTsKLS8vICAgLy8gLi4uIChDb25zdW1lIHRoZSBYTVAgbWV0YWRhdGEgaW4gJ2NodW5rX2l0ZXIuY2h1bmsnKS4KLS8vICAgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoJmNodW5rX2l0ZXIpOwotLy8gICBXZWJQRGVtdXhEZWxldGUoZGVtdXgpOwotCi0jaWZuZGVmIFdFQlBfV0VCUF9ERU1VWF9IXwotI2RlZmluZSBXRUJQX1dFQlBfREVNVVhfSF8KLQotI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04gMHgwMTAwICAgIC8vIE1BSk9SKDhiKSArIE1JTk9SKDhiKQotCi0vLyBOb3RlOiBmb3J3YXJkIGRlY2xhcmluZyBlbnVtZXJhdGlvbnMgaXMgbm90IGFsbG93ZWQgaW4gKHN0cmljdCkgQyBhbmQgQysrLAotLy8gdGhlIHR5cGVzIGFyZSBsZWZ0IGhlcmUgZm9yIHJlZmVyZW5jZS4KLS8vIHR5cGVkZWYgZW51bSBXZWJQRGVtdXhTdGF0ZSBXZWJQRGVtdXhTdGF0ZTsKLS8vIHR5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSBXZWJQRm9ybWF0RmVhdHVyZTsKLXR5cGVkZWYgc3RydWN0IFdlYlBEZW11eGVyIFdlYlBEZW11eGVyOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUEl0ZXJhdG9yIFdlYlBJdGVyYXRvcjsKLXR5cGVkZWYgc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIFdlYlBDaHVua0l0ZXJhdG9yOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGVtdXggbGlicmFyeSwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nCi0vLyA4Yml0cyBmb3IgZWFjaCBvZiBtYWpvci9taW5vci9yZXZpc2lvbi4gRS5nOiB2Mi41LjcgaXMgMHgwMjA1MDcuCi1XRUJQX0VYVEVSTihpbnQpIFdlYlBHZXREZW11eFZlcnNpb24odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMaWZlIG9mIGEgRGVtdXggb2JqZWN0Ci0KLXR5cGVkZWYgZW51bSBXZWJQRGVtdXhTdGF0ZSB7Ci0gIFdFQlBfREVNVVhfUEFSU0lOR19IRUFERVIsICAvLyBOb3QgZW5vdWdoIGRhdGEgdG8gcGFyc2UgZnVsbCBoZWFkZXIuCi0gIFdFQlBfREVNVVhfUEFSU0VEX0hFQURFUiwgICAvLyBIZWFkZXIgcGFyc2luZyBjb21wbGV0ZSwgZGF0YSBtYXkgYmUgYXZhaWxhYmxlLgotICBXRUJQX0RFTVVYX0RPTkUgICAgICAgICAgICAgLy8gRW50aXJlIGZpbGUgaGFzIGJlZW4gcGFyc2VkLgotfSBXZWJQRGVtdXhTdGF0ZTsKLQotLy8gSW50ZXJuYWwsIHZlcnNpb24tY2hlY2tlZCwgZW50cnkgcG9pbnQKLVdFQlBfRVhURVJOKFdlYlBEZW11eGVyKikgV2ViUERlbXV4SW50ZXJuYWwoCi0gICAgY29uc3QgV2ViUERhdGEqLCBpbnQsIFdlYlBEZW11eFN0YXRlKiwgaW50KTsKLQotLy8gUGFyc2VzIHRoZSBmdWxsIFdlYlAgZmlsZSBnaXZlbiBieSAnZGF0YScuCi0vLyBSZXR1cm5zIGEgV2ViUERlbXV4ZXIgb2JqZWN0IG9uIHN1Y2Nlc3NmdWwgcGFyc2UsIE5VTEwgb3RoZXJ3aXNlLgotc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBEZW11eGVyKiBXZWJQRGVtdXgoY29uc3QgV2ViUERhdGEqIGRhdGEpIHsKLSAgcmV0dXJuIFdlYlBEZW11eEludGVybmFsKGRhdGEsIDAsIE5VTEwsIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBQYXJzZXMgdGhlIHBvc3NpYmx5IGluY29tcGxldGUgV2ViUCBmaWxlIGdpdmVuIGJ5ICdkYXRhJy4KLS8vIElmICdzdGF0ZScgaXMgbm9uLU5VTEwgaXQgd2lsbCBiZSBzZXQgdG8gaW5kaWNhdGUgdGhlIHN0YXR1cyBvZiB0aGUgZGVtdXhlci4KLS8vIFJldHVybnMgYSBXZWJQRGVtdXhlciBvYmplY3Qgb24gc3VjY2Vzc2Z1bCBwYXJzZSwgTlVMTCBvdGhlcndpc2UuCi1zdGF0aWMgV0VCUF9JTkxJTkUgV2ViUERlbXV4ZXIqIFdlYlBEZW11eFBhcnRpYWwoCi0gICAgY29uc3QgV2ViUERhdGEqIGRhdGEsIFdlYlBEZW11eFN0YXRlKiBzdGF0ZSkgewotICByZXR1cm4gV2ViUERlbXV4SW50ZXJuYWwoZGF0YSwgMSwgc3RhdGUsIFdFQlBfREVNVVhfQUJJX1ZFUlNJT04pOwotfQotCi0vLyBGcmVlcyBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoICdkbXV4Jy4KLVdFQlBfRVhURVJOKHZvaWQpIFdlYlBEZW11eERlbGV0ZShXZWJQRGVtdXhlciogZG11eCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEYXRhL2luZm9ybWF0aW9uIGV4dHJhY3Rpb24uCi0KLXR5cGVkZWYgZW51bSBXZWJQRm9ybWF0RmVhdHVyZSB7Ci0gIFdFQlBfRkZfRk9STUFUX0ZMQUdTLCAgLy8gRXh0ZW5kZWQgZm9ybWF0IGZsYWdzIHByZXNlbnQgaW4gdGhlICdWUDhYJyBjaHVuay4KLSAgV0VCUF9GRl9DQU5WQVNfV0lEVEgsCi0gIFdFQlBfRkZfQ0FOVkFTX0hFSUdIVCwKLSAgV0VCUF9GRl9MT09QX0NPVU5ULAotICBXRUJQX0ZGX0JBQ0tHUk9VTkRfQ09MT1IsCi0gIFdFQlBfRkZfRlJBTUVfQ09VTlQgICAgLy8gTnVtYmVyIG9mIGZyYW1lcyBwcmVzZW50IGluIHRoZSBkZW11eCBvYmplY3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBhIHBhcnRpYWwgZGVtdXgsIHRoaXMgaXMgdGhlIG51bWJlciBvZgotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBzZWVuIHNvIGZhciwgd2l0aCB0aGUgbGFzdCBmcmFtZSBwb3NzaWJseQotICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlaW5nIHBhcnRpYWwuCi19IFdlYlBGb3JtYXRGZWF0dXJlOwotCi0vLyBHZXQgdGhlICdmZWF0dXJlJyB2YWx1ZSBmcm9tIHRoZSAnZG11eCcuCi0vLyBOT1RFOiB2YWx1ZXMgYXJlIG9ubHkgdmFsaWQgaWYgV2ViUERlbXV4KCkgd2FzIHVzZWQgb3IgV2ViUERlbXV4UGFydGlhbCgpCi0vLyByZXR1cm5lZCBhIHN0YXRlID4gV0VCUF9ERU1VWF9QQVJTSU5HX0hFQURFUi4KLVdFQlBfRVhURVJOKHVpbnQzMl90KSBXZWJQRGVtdXhHZXRJKAotICAgIGNvbnN0IFdlYlBEZW11eGVyKiBkbXV4LCBXZWJQRm9ybWF0RmVhdHVyZSBmZWF0dXJlKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZyYW1lIGl0ZXJhdGlvbi4KLQotc3RydWN0IFdlYlBJdGVyYXRvciB7Ci0gIGludCBmcmFtZV9udW07Ci0gIGludCBudW1fZnJhbWVzOyAgICAgICAgICAvLyBlcXVpdmFsZW50IHRvIFdFQlBfRkZfRlJBTUVfQ09VTlQuCi0gIGludCBmcmFnbWVudF9udW07Ci0gIGludCBudW1fZnJhZ21lbnRzOwotICBpbnQgeF9vZmZzZXQsIHlfb2Zmc2V0OyAgLy8gb2Zmc2V0IHJlbGF0aXZlIHRvIHRoZSBjYW52YXMuCi0gIGludCB3aWR0aCwgaGVpZ2h0OyAgICAgICAvLyBkaW1lbnNpb25zIG9mIHRoaXMgZnJhbWUgb3IgZnJhZ21lbnQuCi0gIGludCBkdXJhdGlvbjsgICAgICAgICAgICAvLyBkaXNwbGF5IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgV2ViUE11eEFuaW1EaXNwb3NlIGRpc3Bvc2VfbWV0aG9kOyAgLy8gZGlzcG9zZSBtZXRob2QgZm9yIHRoZSBmcmFtZS4KLSAgaW50IGNvbXBsZXRlOyAgIC8vIHRydWUgaWYgJ2ZyYWdtZW50JyBjb250YWlucyBhIGZ1bGwgZnJhbWUuIHBhcnRpYWwgaW1hZ2VzCi0gICAgICAgICAgICAgICAgICAvLyBtYXkgc3RpbGwgYmUgZGVjb2RlZCB3aXRoIHRoZSBXZWJQIGluY3JlbWVudGFsIGRlY29kZXIuCi0gIFdlYlBEYXRhIGZyYWdtZW50OyAgLy8gVGhlIGZyYW1lIG9yIGZyYWdtZW50IGdpdmVuIGJ5ICdmcmFtZV9udW0nIGFuZAotICAgICAgICAgICAgICAgICAgICAgIC8vICdmcmFnbWVudF9udW0nLgotCi0gIHVpbnQzMl90IHBhZFs0XTsgICAgICAgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UuCi0gIHZvaWQqIHByaXZhdGVfOyAgICAgICAgICAvLyBmb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi19OwotCi0vLyBSZXRyaWV2ZXMgZnJhbWUgJ2ZyYW1lX251bWJlcicgZnJvbSAnZG11eCcuCi0vLyAnaXRlci0+ZnJhZ21lbnQnIHBvaW50cyB0byB0aGUgZmlyc3QgZnJhZ21lbnQgb24gcmV0dXJuIGZyb20gdGhpcyBmdW5jdGlvbi4KLS8vIEluZGl2aWR1YWwgZnJhZ21lbnRzIG1heSBiZSBleHRyYWN0ZWQgdXNpbmcgV2ViUERlbXV4U2V0RnJhZ21lbnQoKS4KLS8vIFNldHRpbmcgJ2ZyYW1lX251bWJlcicgZXF1YWwgdG8gMCB3aWxsIHJldHVybiB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgaW1hZ2UuCi0vLyBSZXR1cm5zIGZhbHNlIGlmICdkbXV4JyBpcyBOVUxMIG9yIGZyYW1lICdmcmFtZV9udW1iZXInIGlzIG5vdCBwcmVzZW50LgotLy8gQ2FsbCBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCi0vLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgJ2l0ZXInLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhHZXRGcmFtZSgKLSAgICBjb25zdCBXZWJQRGVtdXhlciogZG11eCwgaW50IGZyYW1lX251bWJlciwgV2ViUEl0ZXJhdG9yKiBpdGVyKTsKLQotLy8gU2V0cyAnaXRlci0+ZnJhZ21lbnQnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+ZnJhbWVfbnVtJyArIDEpIG9yCi0vLyBwcmV2aW91cyAoJ2l0ZXItPmZyYW1lX251bScgLSAxKSBmcmFtZS4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4TmV4dEZyYW1lKFdlYlBJdGVyYXRvciogaXRlcik7Ci1XRUJQX0VYVEVSTihpbnQpIFdlYlBEZW11eFByZXZGcmFtZShXZWJQSXRlcmF0b3IqIGl0ZXIpOwotCi0vLyBTZXRzICdpdGVyLT5mcmFnbWVudCcgdG8gcmVmbGVjdCBmcmFnbWVudCBudW1iZXIgJ2ZyYWdtZW50X251bScuCi0vLyBSZXR1cm5zIHRydWUgaWYgZnJhZ21lbnQgJ2ZyYWdtZW50X251bScgaXMgcHJlc2VudCwgZmFsc2Ugb3RoZXJ3aXNlLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhTZWxlY3RGcmFnbWVudChXZWJQSXRlcmF0b3IqIGl0ZXIsIGludCBmcmFnbWVudF9udW0pOwotCi0vLyBSZWxlYXNlcyBhbnkgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCAnaXRlcicuCi0vLyBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gV2ViUERlbXV4R2V0Q2h1bmsoKSBvbiB0aGUgc2FtZQotLy8gaXRlci4gQWxzbywgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAotLy8gV2ViUERlbXV4RGVsZXRlKCkuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhSZWxlYXNlSXRlcmF0b3IoV2ViUEl0ZXJhdG9yKiBpdGVyKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENodW5rIGl0ZXJhdGlvbi4KLQotc3RydWN0IFdlYlBDaHVua0l0ZXJhdG9yIHsKLSAgLy8gVGhlIGN1cnJlbnQgYW5kIHRvdGFsIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZm91cmNjIGdpdmVuIHRvCi0gIC8vIFdlYlBEZW11eEdldENodW5rKCkuCi0gIGludCBjaHVua19udW07Ci0gIGludCBudW1fY2h1bmtzOwotICBXZWJQRGF0YSBjaHVuazsgICAgLy8gVGhlIHBheWxvYWQgb2YgdGhlIGNodW5rLgotCi0gIHVpbnQzMl90IHBhZFs2XTsgICAvLyBwYWRkaW5nIGZvciBsYXRlciB1c2UKLSAgdm9pZCogcHJpdmF0ZV87Ci19OwotCi0vLyBSZXRyaWV2ZXMgdGhlICdjaHVua19udW1iZXInIGluc3RhbmNlIG9mIHRoZSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGZyb20KLS8vICdkbXV4Jy4KLS8vICdmb3VyY2MnIGlzIGEgY2hhcmFjdGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIGZvdXJjYyBvZiB0aGUgY2h1bmsgdG8gcmV0dXJuLAotLy8gZS5nLiwgIklDQ1AiLCAiWE1QICIsICJFWElGIiwgZXRjLgotLy8gU2V0dGluZyAnY2h1bmtfbnVtYmVyJyBlcXVhbCB0byAwIHdpbGwgcmV0dXJuIHRoZSBsYXN0IGNodW5rIGluIGEgc2V0LgotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaHVuayBpcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlLiBJbWFnZSByZWxhdGVkIGNodW5rCi0vLyBwYXlsb2FkcyBhcmUgYWNjZXNzZWQgdGhyb3VnaCBXZWJQRGVtdXhHZXRGcmFtZSgpIGFuZCByZWxhdGVkIGZ1bmN0aW9ucy4KLS8vIENhbGwgV2ViUERlbXV4UmVsZWFzZUNodW5rSXRlcmF0b3IoKSB3aGVuIHVzZSBvZiB0aGUgaXRlcmF0b3IgaXMgY29tcGxldGUuCi0vLyBOT1RFOiAnZG11eCcgbXVzdCBwZXJzaXN0IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGl0ZXJhdG9yLgotV0VCUF9FWFRFUk4oaW50KSBXZWJQRGVtdXhHZXRDaHVuayhjb25zdCBXZWJQRGVtdXhlciogZG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBmb3VyY2NbNF0sIGludCBjaHVua19udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKLQotLy8gU2V0cyAnaXRlci0+Y2h1bmsnIHRvIHBvaW50IHRvIHRoZSBuZXh0ICgnaXRlci0+Y2h1bmtfbnVtJyArIDEpIG9yIHByZXZpb3VzCi0vLyAoJ2l0ZXItPmNodW5rX251bScgLSAxKSBjaHVuay4gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCBsb29wLgotLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4TmV4dENodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKLVdFQlBfRVhURVJOKGludCkgV2ViUERlbXV4UHJldkNodW5rKFdlYlBDaHVua0l0ZXJhdG9yKiBpdGVyKTsKLQotLy8gUmVsZWFzZXMgYW55IG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggJ2l0ZXInLgotLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGFzc29jaWF0ZWQgV2ViUERlbXV4ZXIgd2l0aAotLy8gV2ViUERlbXV4RGVsZXRlKCkuCi1XRUJQX0VYVEVSTih2b2lkKSBXZWJQRGVtdXhSZWxlYXNlQ2h1bmtJdGVyYXRvcihXZWJQQ2h1bmtJdGVyYXRvciogaXRlcik7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9ERU1VWF9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXguaCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnAvbXV4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YzdkYzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicC9tdXguaAorKysgL2Rldi9udWxsCkBAIC0xLDM1NyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UKLS8vIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBDT1BZSU5HIGZpbGUgaW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZQotLy8gdHJlZS4gQW4gYWRkaXRpb25hbCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGdyYW50IGNhbiBiZSBmb3VuZAotLy8gaW4gdGhlIGZpbGUgUEFURU5UUy4gQWxsIGNvbnRyaWJ1dGluZyBwcm9qZWN0IGF1dGhvcnMgbWF5Ci0vLyBiZSBmb3VuZCBpbiB0aGUgQVVUSE9SUyBmaWxlIGluIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLwotLy8gIFJJRkYgY29udGFpbmVyIG1hbmlwdWxhdGlvbiBmb3IgV0VCUCBpbWFnZXMuCi0vLwotLy8gQXV0aG9yczogVXJ2YW5nICh1cnZhbmdAZ29vZ2xlLmNvbSkKLS8vICAgICAgICAgIFZpa2FzICh2aWthc2FAZ29vZ2xlLmNvbSkKLQotLy8gVGhpcyBBUEkgYWxsb3dzIG1hbmlwdWxhdGlvbiBvZiBXZWJQIGNvbnRhaW5lciBpbWFnZXMgY29udGFpbmluZyBmZWF0dXJlcwotLy8gbGlrZSBjb2xvciBwcm9maWxlLCBtZXRhZGF0YSwgYW5pbWF0aW9uIGFuZCBmcmFnbWVudGVkIGltYWdlcy4KLS8vCi0vLyBDb2RlIEV4YW1wbGUjMTogQ3JlYXRpbmcgYSBNVVggd2l0aCBpbWFnZSBkYXRhLCBjb2xvciBwcm9maWxlIGFuZCBYTVAKLS8vIG1ldGFkYXRhLgotLy8KLS8vICAgaW50IGNvcHlfZGF0YSA9IDA7Ci0vLyAgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhOZXcoKTsKLS8vICAgLy8gLi4uIChQcmVwYXJlIGltYWdlIGRhdGEpLgotLy8gICBXZWJQTXV4U2V0SW1hZ2UobXV4LCAmaW1hZ2UsIGNvcHlfZGF0YSk7Ci0vLyAgIC8vIC4uLiAoUHJlcGFyZSBJQ0NQIGNvbG9yIHByb2ZpbGUgZGF0YSkuCi0vLyAgIFdlYlBNdXhTZXRDaHVuayhtdXgsICJJQ0NQIiwgJmljY19wcm9maWxlLCBjb3B5X2RhdGEpOwotLy8gICAvLyAuLi4gKFByZXBhcmUgWE1QIG1ldGFkYXRhKS4KLS8vICAgV2ViUE11eFNldENodW5rKG11eCwgIlhNUCAiLCAmeG1wLCBjb3B5X2RhdGEpOwotLy8gICAvLyBHZXQgZGF0YSBmcm9tIG11eCBpbiBXZWJQIFJJRkYgZm9ybWF0LgotLy8gICBXZWJQTXV4QXNzZW1ibGUobXV4LCAmb3V0cHV0X2RhdGEpOwotLy8gICBXZWJQTXV4RGVsZXRlKG11eCk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBvdXRwdXRfZGF0YTsgZS5nLiB3cml0ZSBvdXRwdXRfZGF0YS5ieXRlcyB0byBmaWxlKS4KLS8vICAgV2ViUERhdGFDbGVhcigmb3V0cHV0X2RhdGEpOwotLy8KLS8vIENvZGUgRXhhbXBsZSMyOiBHZXQgaW1hZ2UgYW5kIGNvbG9yIHByb2ZpbGUgZGF0YSBmcm9tIGEgV2ViUCBmaWxlLgotLy8KLS8vICAgaW50IGNvcHlfZGF0YSA9IDA7Ci0vLyAgIC8vIC4uLiAoUmVhZCBkYXRhIGZyb20gZmlsZSkuCi0vLyAgIFdlYlBNdXgqIG11eCA9IFdlYlBNdXhDcmVhdGUoJmRhdGEsIGNvcHlfZGF0YSk7Ci0vLyAgIFdlYlBNdXhHZXRGcmFtZShtdXgsIDEsICZpbWFnZSk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBpbWFnZTsgZS5nLiBjYWxsIFdlYlBEZWNvZGUoKSB0byBkZWNvZGUgdGhlIGRhdGEpLgotLy8gICBXZWJQTXV4R2V0Q2h1bmsobXV4LCAiSUNDUCIsICZpY2NfcHJvZmlsZSk7Ci0vLyAgIC8vIC4uLiAoQ29uc3VtZSBpY2NfZGF0YSkuCi0vLyAgIFdlYlBNdXhEZWxldGUobXV4KTsKLS8vICAgZnJlZShkYXRhKTsKLQotI2lmbmRlZiBXRUJQX1dFQlBfTVVYX0hfCi0jZGVmaW5lIFdFQlBfV0VCUF9NVVhfSF8KLQotI2luY2x1ZGUgIi4vbXV4X3R5cGVzLmgiCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0jZGVmaW5lIFdFQlBfTVVYX0FCSV9WRVJTSU9OIDB4MDEwMCAgICAgICAgLy8gTUFKT1IoOGIpICsgTUlOT1IoOGIpCi0KLS8vIE5vdGU6IGZvcndhcmQgZGVjbGFyaW5nIGVudW1lcmF0aW9ucyBpcyBub3QgYWxsb3dlZCBpbiAoc3RyaWN0KSBDIGFuZCBDKyssCi0vLyB0aGUgdHlwZXMgYXJlIGxlZnQgaGVyZSBmb3IgcmVmZXJlbmNlLgotLy8gdHlwZWRlZiBlbnVtIFdlYlBNdXhFcnJvciBXZWJQTXV4RXJyb3I7Ci0vLyB0eXBlZGVmIGVudW0gV2ViUENodW5rSWQgV2ViUENodW5rSWQ7Ci10eXBlZGVmIHN0cnVjdCBXZWJQTXV4IFdlYlBNdXg7ICAgLy8gbWFpbiBvcGFxdWUgb2JqZWN0LgotdHlwZWRlZiBzdHJ1Y3QgV2ViUE11eEZyYW1lSW5mbyBXZWJQTXV4RnJhbWVJbmZvOwotdHlwZWRlZiBzdHJ1Y3QgV2ViUE11eEFuaW1QYXJhbXMgV2ViUE11eEFuaW1QYXJhbXM7Ci0KLS8vIEVycm9yIGNvZGVzCi10eXBlZGVmIGVudW0gV2ViUE11eEVycm9yIHsKLSAgV0VCUF9NVVhfT0sgICAgICAgICAgICAgICAgID0gIDEsCi0gIFdFQlBfTVVYX05PVF9GT1VORCAgICAgICAgICA9ICAwLAotICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UICAgPSAtMSwKLSAgV0VCUF9NVVhfQkFEX0RBVEEgICAgICAgICAgID0gLTIsCi0gIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAgICAgICA9IC0zLAotICBXRUJQX01VWF9OT1RfRU5PVUdIX0RBVEEgICAgPSAtNAotfSBXZWJQTXV4RXJyb3I7Ci0KLS8vIElEcyBmb3IgZGlmZmVyZW50IHR5cGVzIG9mIGNodW5rcy4KLXR5cGVkZWYgZW51bSBXZWJQQ2h1bmtJZCB7Ci0gIFdFQlBfQ0hVTktfVlA4WCwgICAgIC8vIFZQOFgKLSAgV0VCUF9DSFVOS19JQ0NQLCAgICAgLy8gSUNDUAotICBXRUJQX0NIVU5LX0FOSU0sICAgICAvLyBBTklNCi0gIFdFQlBfQ0hVTktfQU5NRiwgICAgIC8vIEFOTUYKLSAgV0VCUF9DSFVOS19GUkdNLCAgICAgLy8gRlJHTQotICBXRUJQX0NIVU5LX0FMUEhBLCAgICAvLyBBTFBICi0gIFdFQlBfQ0hVTktfSU1BR0UsICAgIC8vIFZQOC9WUDhMCi0gIFdFQlBfQ0hVTktfRVhJRiwgICAgIC8vIEVYSUYKLSAgV0VCUF9DSFVOS19YTVAsICAgICAgLy8gWE1QCi0gIFdFQlBfQ0hVTktfVU5LTk9XTiwgIC8vIE90aGVyIGNodW5rcy4KLSAgV0VCUF9DSFVOS19OSUwKLX0gV2ViUENodW5rSWQ7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBtdXggbGlicmFyeSwgcGFja2VkIGluIGhleGFkZWNpbWFsIHVzaW5nCi0vLyA4Yml0cyBvciBlYWNoIG9mIG1ham9yL21pbm9yL3JldmlzaW9uLiBFLmc6IHYyLjUuNyBpcyAweDAyMDUwNy4KLVdFQlBfRVhURVJOKGludCkgV2ViUEdldE11eFZlcnNpb24odm9pZCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMaWZlIG9mIGEgTXV4IG9iamVjdAotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oV2ViUE11eCopIFdlYlBOZXdJbnRlcm5hbChpbnQpOwotCi0vLyBDcmVhdGVzIGFuIGVtcHR5IG11eCBvYmplY3QuCi0vLyBSZXR1cm5zOgotLy8gICBBIHBvaW50ZXIgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgZW1wdHkgbXV4IG9iamVjdC4KLXN0YXRpYyBXRUJQX0lOTElORSBXZWJQTXV4KiBXZWJQTXV4TmV3KHZvaWQpIHsKLSAgcmV0dXJuIFdlYlBOZXdJbnRlcm5hbChXRUJQX01VWF9BQklfVkVSU0lPTik7Ci19Ci0KLS8vIERlbGV0ZXMgdGhlIG11eCBvYmplY3QuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgdG8gYmUgZGVsZXRlZAotV0VCUF9FWFRFUk4odm9pZCkgV2ViUE11eERlbGV0ZShXZWJQTXV4KiBtdXgpOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTXV4IGNyZWF0aW9uLgotCi0vLyBJbnRlcm5hbCwgdmVyc2lvbi1jaGVja2VkLCBlbnRyeSBwb2ludAotV0VCUF9FWFRFUk4oV2ViUE11eCopIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChjb25zdCBXZWJQRGF0YSosIGludCwgaW50KTsKLQotLy8gQ3JlYXRlcyBhIG11eCBvYmplY3QgZnJvbSByYXcgZGF0YSBnaXZlbiBpbiBXZWJQIFJJRkYgZm9ybWF0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgYml0c3RyZWFtIC0gKGluKSB0aGUgYml0c3RyZWFtIGRhdGEgaW4gV2ViUCBSSUZGIGZvcm1hdAotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBBIHBvaW50ZXIgdG8gdGhlIG11eCBvYmplY3QgY3JlYXRlZCBmcm9tIGdpdmVuIGRhdGEgLSBvbiBzdWNjZXNzLgotLy8gICBOVUxMIC0gSW4gY2FzZSBvZiBpbnZhbGlkIGRhdGEgb3IgbWVtb3J5IGVycm9yLgotc3RhdGljIFdFQlBfSU5MSU5FIFdlYlBNdXgqIFdlYlBNdXhDcmVhdGUoY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3B5X2RhdGEpIHsKLSAgcmV0dXJuIFdlYlBNdXhDcmVhdGVJbnRlcm5hbChiaXRzdHJlYW0sIGNvcHlfZGF0YSwgV0VCUF9NVVhfQUJJX1ZFUlNJT04pOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9uLWltYWdlIGNodW5rcy4KLQotLy8gTm90ZTogT25seSBub24taW1hZ2UgcmVsYXRlZCBjaHVua3Mgc2hvdWxkIGJlIG1hbmFnZWQgdGhyb3VnaCBjaHVuayBBUElzLgotLy8gKEltYWdlIHJlbGF0ZWQgY2h1bmtzIGFyZTogIkFOTUYiLCAiRlJHTSIsICJWUDggIiwgIlZQOEwiIGFuZCAiQUxQSCIpLgotLy8gVG8gYWRkLCBnZXQgYW5kIGRlbGV0ZSBpbWFnZXMsIHVzZSBBUElzIFdlYlBNdXhTZXRJbWFnZSgpLAotLy8gV2ViUE11eFB1c2hGcmFtZSgpLCBXZWJQTXV4R2V0RnJhbWUoKSBhbmQgV2ViUE11eERlbGV0ZUZyYW1lKCkuCi0KLS8vIEFkZHMgYSBjaHVuayB3aXRoIGlkICdmb3VyY2MnIGFuZCBkYXRhICdjaHVua19kYXRhJyBpbiB0aGUgbXV4IG9iamVjdC4KLS8vIEFueSBleGlzdGluZyBjaHVuayhzKSB3aXRoIHRoZSBzYW1lIGlkIHdpbGwgYmUgcmVtb3ZlZC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgY2h1bmsgaXMgdG8gYmUgYWRkZWQKLS8vICAgZm91cmNjIC0gKGluKSBhIGNoYXJhY3RlciBhcnJheSBjb250YWluaW5nIHRoZSBmb3VyY2Mgb2YgdGhlIGdpdmVuIGNodW5rOwotLy8gICAgICAgICAgICAgICAgIGUuZy4sICJJQ0NQIiwgIlhNUCAiLCAiRVhJRiIgZXRjLgotLy8gICBjaHVua19kYXRhIC0gKGluKSB0aGUgY2h1bmsgZGF0YSB0byBiZSBhZGRlZAotLy8gICBjb3B5X2RhdGEgLSAoaW4pIHZhbHVlIDEgaW5kaWNhdGVzIGdpdmVuIGRhdGEgV0lMTCBiZSBjb3BpZWQgdG8gdGhlIG11eAotLy8gICAgICAgICAgICAgICBhbmQgdmFsdWUgMCBpbmRpY2F0ZXMgZGF0YSB3aWxsIE5PVCBiZSBjb3BpZWQuCi0vLyBSZXR1cm5zOgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhTZXRDaHVuaygKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IGNoYXIgZm91cmNjWzRdLCBjb25zdCBXZWJQRGF0YSogY2h1bmtfZGF0YSwKLSAgICBpbnQgY29weV9kYXRhKTsKLQotLy8gR2V0cyBhIHJlZmVyZW5jZSB0byB0aGUgZGF0YSBvZiB0aGUgY2h1bmsgd2l0aCBpZCAnZm91cmNjJyBpbiB0aGUgbXV4IG9iamVjdC4KLS8vIFRoZSBjYWxsZXIgc2hvdWxkIE5PVCBmcmVlIHRoZSByZXR1cm5lZCBkYXRhLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY2h1bmsgZGF0YSBpcyB0byBiZSBmZXRjaGVkCi0vLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKLS8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KLS8vICAgY2h1bmtfZGF0YSAtIChvdXQpIHJldHVybmVkIGNodW5rIGRhdGEKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgbXV4LCBmb3VyY2Mgb3IgY2h1bmtfZGF0YSBpcyBOVUxMCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiBmb3VyY2MgY29ycmVzcG9uZHMgdG8gYW4gaW1hZ2UgY2h1bmsuCi0vLyAgIFdFQlBfTVVYX05PVF9GT1VORCAtIElmIG11eCBkb2VzIG5vdCBjb250YWluIGEgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gaWQuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eEdldENodW5rKAotICAgIGNvbnN0IFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0sIFdlYlBEYXRhKiBjaHVua19kYXRhKTsKLQotLy8gRGVsZXRlcyB0aGUgY2h1bmsgd2l0aCB0aGUgZ2l2ZW4gJ2ZvdXJjYycgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBjaHVuayBpcyB0byBiZSBkZWxldGVkCi0vLyAgIGZvdXJjYyAtIChpbikgYSBjaGFyYWN0ZXIgYXJyYXkgY29udGFpbmluZyB0aGUgZm91cmNjIG9mIHRoZSBjaHVuazsKLS8vICAgICAgICAgICAgICAgICBlLmcuLCAiSUNDUCIsICJYTVAgIiwgIkVYSUYiIGV0Yy4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZm91cmNjIGlzIE5VTEwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIGZvdXJjYyBjb3JyZXNwb25kcyB0byBhbiBpbWFnZSBjaHVuay4KLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gSWYgbXV4IGRvZXMgbm90IGNvbnRhaW4gYSBjaHVuayB3aXRoIHRoZSBnaXZlbiBmb3VyY2MuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eERlbGV0ZUNodW5rKAotICAgIFdlYlBNdXgqIG11eCwgY29uc3QgY2hhciBmb3VyY2NbNF0pOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSW1hZ2VzLgotCi0vLyBFbmNhcHN1bGF0ZXMgZGF0YSBhYm91dCBhIHNpbmdsZSBmcmFtZS9mcmFnbWVudC4KLXN0cnVjdCBXZWJQTXV4RnJhbWVJbmZvIHsKLSAgV2ViUERhdGEgICAgYml0c3RyZWFtOyAgLy8gaW1hZ2UgZGF0YTogY2FuIGVpdGhlciBiZSBhIHJhdyBWUDgvVlA4TCBiaXRzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgYSBzaW5nbGUtaW1hZ2UgV2ViUCBmaWxlLgotICBpbnQgICAgICAgICB4X29mZnNldDsgICAvLyB4LW9mZnNldCBvZiB0aGUgZnJhbWUuCi0gIGludCAgICAgICAgIHlfb2Zmc2V0OyAgIC8vIHktb2Zmc2V0IG9mIHRoZSBmcmFtZS4KLSAgaW50ICAgICAgICAgZHVyYXRpb247ICAgLy8gZHVyYXRpb24gb2YgdGhlIGZyYW1lIChpbiBtaWxsaXNlY29uZHMpLgotCi0gIFdlYlBDaHVua0lkIGlkOyAgICAgICAgIC8vIGZyYW1lIHR5cGU6IHNob3VsZCBiZSBvbmUgb2YgV0VCUF9DSFVOS19BTk1GLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXRUJQX0NIVU5LX0ZSR00gb3IgV0VCUF9DSFVOS19JTUFHRQotICBXZWJQTXV4QW5pbURpc3Bvc2UgZGlzcG9zZV9tZXRob2Q7ICAvLyBEaXNwb3NhbCBtZXRob2QgZm9yIHRoZSBmcmFtZS4KLSAgdWludDMyX3QgICAgcGFkWzJdOyAgICAgLy8gcGFkZGluZyBmb3IgbGF0ZXIgdXNlCi19OwotCi0vLyBTZXRzIHRoZSAobm9uLWFuaW1hdGVkIGFuZCBub24tZnJhZ21lbnRlZCkgaW1hZ2UgaW4gdGhlIG11eCBvYmplY3QuCi0vLyBOb3RlOiBBbnkgZXhpc3RpbmcgaW1hZ2VzIChpbmNsdWRpbmcgZnJhbWVzL2ZyYWdtZW50cykgd2lsbCBiZSByZW1vdmVkLgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluL291dCkgb2JqZWN0IGluIHdoaWNoIHRoZSBpbWFnZSBpcyB0byBiZSBzZXQKLS8vICAgYml0c3RyZWFtIC0gKGluKSBjYW4gZWl0aGVyIGJlIGEgcmF3IFZQOC9WUDhMIGJpdHN0cmVhbSBvciBhIHNpbmdsZS1pbWFnZQotLy8gICAgICAgICAgICAgICBXZWJQIGZpbGUgKG5vbi1hbmltYXRlZCBhbmQgbm9uLWZyYWdtZW50ZWQpCi0vLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4Ci0vLyAgICAgICAgICAgICAgIGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggaXMgTlVMTCBvciBiaXRzdHJlYW0gaXMgTlVMTC4KLS8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eFNldEltYWdlKAotICAgIFdlYlBNdXgqIG11eCwgY29uc3QgV2ViUERhdGEqIGJpdHN0cmVhbSwgaW50IGNvcHlfZGF0YSk7Ci0KLS8vIEFkZHMgYSBmcmFtZSBhdCB0aGUgZW5kIG9mIHRoZSBtdXggb2JqZWN0LgotLy8gTm90ZXM6ICgxKSBmcmFtZS5pZCBzaG91bGQgYmUgb25lIG9mIFdFQlBfQ0hVTktfQU5NRiBvciBXRUJQX0NIVU5LX0ZSR00KLS8vICAgICAgICAoMikgRm9yIHNldHRpbmcgYSBub24tYW5pbWF0ZWQgbm9uLWZyYWdtZW50ZWQgaW1hZ2UsIHVzZQotLy8gICAgICAgICAgICBXZWJQTXV4U2V0SW1hZ2UoKSBpbnN0ZWFkLgotLy8gICAgICAgICgzKSBUeXBlIG9mIGZyYW1lIGJlaW5nIHB1c2hlZCBtdXN0IGJlIHNhbWUgYXMgdGhlIGZyYW1lcyBpbiBtdXguCi0vLyAgICAgICAgKDQpIEFzIFdlYlAgb25seSBzdXBwb3J0cyBldmVuIG9mZnNldHMsIGFueSBvZGQgb2Zmc2V0IHdpbGwgYmUgc25hcHBlZAotLy8gICAgICAgICAgICB0byBhbiBldmVuIGxvY2F0aW9uIHVzaW5nOiBvZmZzZXQgJj0gfjEKLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB0byB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgYWRkZWQKLS8vICAgZnJhbWUgLSAoaW4pIGZyYW1lIGRhdGEuCi0vLyAgIGNvcHlfZGF0YSAtIChpbikgdmFsdWUgMSBpbmRpY2F0ZXMgZ2l2ZW4gZGF0YSBXSUxMIGJlIGNvcGllZCB0byB0aGUgbXV4Ci0vLyAgICAgICAgICAgICAgIGFuZCB2YWx1ZSAwIGluZGljYXRlcyBkYXRhIHdpbGwgTk9UIGJlIGNvcGllZC4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZnJhbWUgaXMgTlVMTAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgY29udGVudCBvZiAnZnJhbWUnIGlzIGludmFsaWQuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhQdXNoRnJhbWUoCi0gICAgV2ViUE11eCogbXV4LCBjb25zdCBXZWJQTXV4RnJhbWVJbmZvKiBmcmFtZSwgaW50IGNvcHlfZGF0YSk7Ci0KLS8vIEdldHMgdGhlIG50aCBmcmFtZSBmcm9tIHRoZSBtdXggb2JqZWN0LgotLy8gVGhlIGNvbnRlbnQgb2YgJ2ZyYW1lLT5iaXRzdHJlYW0nIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAotLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKLS8vIFdlYlBEYXRhQ2xlYXIoKS4KLS8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBpbmZvIGlzIHRvIGJlIGZldGNoZWQKLS8vICAgbnRoIC0gKGluKSBpbmRleCBvZiB0aGUgZnJhbWUgaW4gdGhlIG11eCBvYmplY3QKLS8vICAgZnJhbWUgLSAob3V0KSBkYXRhIG9mIHRoZSByZXR1cm5lZCBmcmFtZQotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBvciBmcmFtZSBpcyBOVUxMLgotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QuCi0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbnRoIGZyYW1lIGNodW5rIGluIG11eCBpcyBpbnZhbGlkLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhHZXRGcmFtZSgKLSAgICBjb25zdCBXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCwgV2ViUE11eEZyYW1lSW5mbyogZnJhbWUpOwotCi0vLyBEZWxldGVzIGEgZnJhbWUgZnJvbSB0aGUgbXV4IG9iamVjdC4KLS8vIG50aD0wIGhhcyBhIHNwZWNpYWwgbWVhbmluZyAtIGxhc3QgcG9zaXRpb24uCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4vb3V0KSBvYmplY3QgZnJvbSB3aGljaCBhIGZyYW1lIGlzIHRvIGJlIGRlbGV0ZWQKLS8vICAgbnRoIC0gKGluKSBUaGUgcG9zaXRpb24gZnJvbSB3aGljaCB0aGUgZnJhbWUgaXMgdG8gYmUgZGVsZXRlZAotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIG11eCBpcyBOVUxMLgotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBJZiB0aGVyZSBhcmUgbGVzcyB0aGFuIG50aCBmcmFtZXMgaW4gdGhlIG11eCBvYmplY3QKLS8vICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlbGV0aW9uLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhEZWxldGVGcmFtZShXZWJQTXV4KiBtdXgsIHVpbnQzMl90IG50aCk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbmltYXRpb24uCi0KLS8vIEFuaW1hdGlvbiBwYXJhbWV0ZXJzLgotc3RydWN0IFdlYlBNdXhBbmltUGFyYW1zIHsKLSAgdWludDMyX3QgYmdjb2xvcjsgIC8vIEJhY2tncm91bmQgY29sb3Igb2YgdGhlIGNhbnZhcyBzdG9yZWQgKGluIE1TQiBvcmRlcikgYXM6Ci0gICAgICAgICAgICAgICAgICAgICAvLyBCaXRzIDAwIHRvIDA3OiBBbHBoYS4KLSAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMDggdG8gMTU6IFJlZC4KLSAgICAgICAgICAgICAgICAgICAgIC8vIEJpdHMgMTYgdG8gMjM6IEdyZWVuLgotICAgICAgICAgICAgICAgICAgICAgLy8gQml0cyAyNCB0byAzMTogQmx1ZS4KLSAgaW50IGxvb3BfY291bnQ7ICAgIC8vIE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGFuaW1hdGlvbiBbMCA9IGluZmluaXRlXS4KLX07Ci0KLS8vIFNldHMgdGhlIGFuaW1hdGlvbiBwYXJhbWV0ZXJzIGluIHRoZSBtdXggb2JqZWN0LiBBbnkgZXhpc3RpbmcgQU5JTSBjaHVua3MKLS8vIHdpbGwgYmUgcmVtb3ZlZC4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCBpbiB3aGljaCBBTklNIGNodW5rIGlzIHRvIGJlIHNldC9hZGRlZAotLy8gICBwYXJhbXMgLSAoaW4pIGFuaW1hdGlvbiBwYXJhbWV0ZXJzLgotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGVpdGhlciBtdXggb3IgcGFyYW1zIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfTUVNT1JZX0VSUk9SIC0gb24gbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IuCi0vLyAgIFdFQlBfTVVYX09LIC0gb24gc3VjY2Vzcy4KLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eFNldEFuaW1hdGlvblBhcmFtcygKLSAgICBXZWJQTXV4KiBtdXgsIGNvbnN0IFdlYlBNdXhBbmltUGFyYW1zKiBwYXJhbXMpOwotCi0vLyBHZXRzIHRoZSBhbmltYXRpb24gcGFyYW1ldGVycyBmcm9tIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgYW5pbWF0aW9uIHBhcmFtZXRlcnMgdG8gYmUgZmV0Y2hlZAotLy8gICBwYXJhbXMgLSAob3V0KSBhbmltYXRpb24gcGFyYW1ldGVycyBleHRyYWN0ZWQgZnJvbSB0aGUgQU5JTSBjaHVuawotLy8gUmV0dXJuczoKLS8vICAgV0VCUF9NVVhfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGVpdGhlciBvZiBtdXggb3IgcGFyYW1zIGlzIE5VTEwKLS8vICAgV0VCUF9NVVhfTk9UX0ZPVU5EIC0gaWYgQU5JTSBjaHVuayBpcyBub3QgcHJlc2VudCBpbiBtdXggb2JqZWN0LgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhHZXRBbmltYXRpb25QYXJhbXMoCi0gICAgY29uc3QgV2ViUE11eCogbXV4LCBXZWJQTXV4QW5pbVBhcmFtcyogcGFyYW1zKTsKLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1pc2MgVXRpbGl0aWVzLgotCi0vLyBHZXRzIHRoZSBmZWF0dXJlIGZsYWdzIGZyb20gdGhlIG11eCBvYmplY3QuCi0vLyBQYXJhbWV0ZXJzOgotLy8gICBtdXggLSAoaW4pIG9iamVjdCBmcm9tIHdoaWNoIHRoZSBmZWF0dXJlcyBhcmUgdG8gYmUgZmV0Y2hlZAotLy8gICBmbGFncyAtIChvdXQpIHRoZSBmbGFncyBzcGVjaWZ5aW5nIHdoaWNoIGZlYXR1cmVzIGFyZSBwcmVzZW50IGluIHRoZQotLy8gICAgICAgICAgIG11eCBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBPUiBvZiB2YXJpb3VzIGZsYWcgdmFsdWVzLgotLy8gICAgICAgICAgIEVudW0gJ1dlYlBGZWF0dXJlRmxhZ3MnIGNhbiBiZSB1c2VkIHRvIHRlc3QgaW5kaXZpZHVhbCBmbGFnIHZhbHVlcy4KLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBtdXggb3IgZmxhZ3MgaXMgTlVMTAotLy8gICBXRUJQX01VWF9OT1RfRk9VTkQgLSBpZiBWUDhYIGNodW5rIGlzIG5vdCBwcmVzZW50IGluIG11eCBvYmplY3QuCi0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgVlA4WCBjaHVuayBpbiBtdXggaXMgaW52YWxpZC4KLS8vICAgV0VCUF9NVVhfT0sgLSBvbiBzdWNjZXNzLgotV0VCUF9FWFRFUk4oV2ViUE11eEVycm9yKSBXZWJQTXV4R2V0RmVhdHVyZXMoY29uc3QgV2ViUE11eCogbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZsYWdzKTsKLQotLy8gR2V0cyBudW1iZXIgb2YgY2h1bmtzIGhhdmluZyB0YWcgdmFsdWUgdGFnIGluIHRoZSBtdXggb2JqZWN0LgotLy8gUGFyYW1ldGVyczoKLS8vICAgbXV4IC0gKGluKSBvYmplY3QgZnJvbSB3aGljaCB0aGUgaW5mbyBpcyB0byBiZSBmZXRjaGVkCi0vLyAgIGlkIC0gKGluKSBjaHVuayBpZCBzcGVjaWZ5aW5nIHRoZSB0eXBlIG9mIGNodW5rCi0vLyAgIG51bV9lbGVtZW50cyAtIChvdXQpIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGUgZ2l2ZW4gY2h1bmsgaWQKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0lOVkFMSURfQVJHVU1FTlQgLSBpZiBlaXRoZXIgbXV4LCBvciBudW1fZWxlbWVudHMgaXMgTlVMTAotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MuCi1XRUJQX0VYVEVSTihXZWJQTXV4RXJyb3IpIFdlYlBNdXhOdW1DaHVua3MoY29uc3QgV2ViUE11eCogbXV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBDaHVua0lkIGlkLCBpbnQqIG51bV9lbGVtZW50cyk7Ci0KLS8vIEFzc2VtYmxlcyBhbGwgY2h1bmtzIGluIFdlYlAgUklGRiBmb3JtYXQgYW5kIHJldHVybnMgaW4gJ2Fzc2VtYmxlZF9kYXRhJy4KLS8vIFRoaXMgZnVuY3Rpb24gYWxzbyB2YWxpZGF0ZXMgdGhlIG11eCBvYmplY3QuCi0vLyBOb3RlOiBUaGUgY29udGVudCBvZiAnYXNzZW1ibGVkX2RhdGEnIHdpbGwgYmUgaWdub3JlZCBhbmQgb3ZlcndyaXR0ZW4uCi0vLyBBbHNvLCB0aGUgY29udGVudCBvZiAnYXNzZW1ibGVkX2RhdGEnIGlzIGFsbG9jYXRlZCB1c2luZyBtYWxsb2MoKSwgYW5kIE5PVAotLy8gb3duZWQgYnkgdGhlICdtdXgnIG9iamVjdC4gSXQgTVVTVCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgY2FsbGVyIGJ5IGNhbGxpbmcKLS8vIFdlYlBEYXRhQ2xlYXIoKS4KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgIG11eCAtIChpbi9vdXQpIG9iamVjdCB3aG9zZSBjaHVua3MgYXJlIHRvIGJlIGFzc2VtYmxlZAotLy8gICBhc3NlbWJsZWRfZGF0YSAtIChvdXQpIGFzc2VtYmxlZCBXZWJQIGRhdGEKLS8vIFJldHVybnM6Ci0vLyAgIFdFQlBfTVVYX0JBRF9EQVRBIC0gaWYgbXV4IG9iamVjdCBpcyBpbnZhbGlkLgotLy8gICBXRUJQX01VWF9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZWl0aGVyIG11eCwgb3V0cHV0X2RhdGEgb3Igb3V0cHV0X3NpemUgaXMKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwuCi0vLyAgIFdFQlBfTVVYX01FTU9SWV9FUlJPUiAtIG9uIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgotLy8gICBXRUJQX01VWF9PSyAtIG9uIHN1Y2Nlc3MKLVdFQlBfRVhURVJOKFdlYlBNdXhFcnJvcikgV2ViUE11eEFzc2VtYmxlKFdlYlBNdXgqIG11eCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYlBEYXRhKiBhc3NlbWJsZWRfZGF0YSk7Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKGNfcGx1c3BsdXMpCi19ICAgIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCi0jZW5kaWYgIC8qIFdFQlBfV0VCUF9NVVhfSF8gKi8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXguaHRtbCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDg3M2E5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy9pbmRleC5odG1sCkBAIC0wLDAgKzEsNzUgQEAKKzwhRE9DVFlQRSBodG1sPgorPGh0bWwgbGFuZz0iZW4iPgorCis8aGVhZD4KKyAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgorICA8dGl0bGU+c2ltcGxlIEphdmFzY3JpcHQgV2ViUCBkZWNvZGluZyBkZW1vPC90aXRsZT4KKyAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorICAgIHZhciBNb2R1bGUgPSB7CisgICAgICBub0luaXRpYWxSdW4gOiB0cnVlCisgICAgfTsKKyAgPC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4vd2VicC5qcyI+PC9zY3JpcHQ+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKworJ3VzZSBzdHJpY3QnOworCisvLyBtYWluIHdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBkZWNvZGluZyBhIFdlYlAgaW50byBhIGNhbnZhcyBvYmplY3QKK3ZhciBXZWJwVG9DYW52YXM7CisKK2Z1bmN0aW9uIGluaXQoKSB7CisgIFdlYnBUb0NhbnZhcyA9IE1vZHVsZS5jd3JhcCgnV2VicFRvU0RMJywgJ251bWJlcicsIFsnYXJyYXknLCAnbnVtYmVyJ10pOworfQord2luZG93Lm9ubG9hZCA9IGluaXQ7CisKK2Z1bmN0aW9uIGRlY29kZSh3ZWJwX2RhdGEsIGNhbnZhc19pZCkgeworICAvLyBnZXQgdGhlIGNhbnZhcyB0byBkZWNvZGUgaW50bworICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2FudmFzX2lkKTsKKyAgaWYgKGNhbnZhcyA9PSBudWxsKSByZXR1cm47CisgIC8vIGNsZWFyIHByZXZpb3VzIHBpY3R1cmUgKGlmIGFueSkKKyAgTW9kdWxlLmNhbnZhcyA9IGNhbnZhczsKKyAgY2FudmFzLmdldENvbnRleHQoJzJkJykuY2xlYXJSZWN0KDAsIDAsIGNhbnZhcy53aWR0aCwgY2FudmFzLmhlaWdodCk7CisgIC8vIGRlY29kZSBhbmQgbWVhc3VyZSB0aW1pbmcKKyAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoKTsKKyAgdmFyIHJldCA9IFdlYnBUb0NhbnZhcyh3ZWJwX2RhdGEsIHdlYnBfZGF0YS5sZW5ndGgpOworICB2YXIgZW5kID0gbmV3IERhdGUoKTsKKyAgdmFyIHNwZWVkX3Jlc3VsdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aW1pbmcnKTsKKyAgLy8gZGlzcGxheSB0aW1pbmcgcmVzdWx0CisgIGlmIChzcGVlZF9yZXN1bHQgIT0gbnVsbCkgeworICAgIHZhciBkZWNvZGVfdGltZSA9IGVuZCAtIHN0YXJ0OworICAgIHNwZWVkX3Jlc3VsdC5pbm5lckhUTUwgPSAnPHA+ZGVjb2RpbmcgdGltZTogJyArIGRlY29kZV90aW1lICsnIG1zLjwvcD4nOworICB9Cit9CisKK2Z1bmN0aW9uIGxvYWRmaWxlKGZpbGVuYW1lLCBjYW52YXNfaWQpIHsKKyAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICB4aHIub3BlbignR0VUJywgZmlsZW5hbWUpOworICB4aHIucmVzcG9uc2VUeXBlID0gJ2FycmF5YnVmZmVyJzsKKyAgeGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkgeworICAgIGlmICh4aHIucmVhZHlTdGF0ZSA9PSA0ICYmIHhoci5zdGF0dXMgPT0gMjAwKSB7CisgICAgICB2YXIgd2VicF9kYXRhID0gbmV3IFVpbnQ4QXJyYXkoeGhyLnJlc3BvbnNlKTsKKyAgICAgIGRlY29kZSh3ZWJwX2RhdGEsIGNhbnZhc19pZCk7CisgICAgfQorICB9OworICB4aHIuc2VuZCgpOworfQorICA8L3NjcmlwdD4KKzwvaGVhZD4KKworPGJvZHk+CisgIDxwPgorICAgIDxzdHJvbmc+V2ViUCBpbiBKYXZhU2NyaXB0IGRlbW88L3N0cm9uZz4gLQorICA8L3A+CisgIDxwPgorICAgIFdlYlAgZGVjb2RlciBpbiBKYXZhU2NyaXB0LCB1c2luZyBsaWJ3ZWJwIGNvbXBpbGVkIHdpdGgKKyAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va3JpcGtlbi9lbXNjcmlwdGVuL3dpa2kiPkVtc2NyaXB0ZW48L2E+LgorICA8L3A+CisgIDxwIGlkPSJpbWFnZV9idXR0b25zIj4KKyAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0idGVzdCBpbWFnZSEiIG5hbWU9Ii4vdGVzdF93ZWJwX2pzLndlYnAiCisgICAgICAgICAgIG9uY2xpY2s9ImxvYWRmaWxlKHRoaXMubmFtZSwgJ291dHB1dF9jYW52YXMnKSI+CisgIDwvcD4KKyAgPHAgaWQ9InRpbWluZyI+VGltaW5nOiBOL0E8L3A+CisgIDxjYW52YXMgaWQ9Im91dHB1dF9jYW52YXMiPllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGNhbnZhczwvY2FudmFzPgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4X3dhc20uaHRtbCBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvaW5kZXhfd2FzbS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3N2MyMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL2luZGV4X3dhc20uaHRtbApAQCAtMCwwICsxLDkwIEBACis8IURPQ1RZUEUgaHRtbD4KKzxodG1sIGxhbmc9ImVuIj4KKworPGhlYWQ+CisgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4KKyAgPHRpdGxlPnNpbXBsZSBKYXZhc2NyaXB0IFdlYlAgZGVjb2RpbmcgZGVtbywgdXNpbmcgV2ViLUFzc2VtYmx5IChXQVNNKTwvdGl0bGU+CisgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICB2YXIgTW9kdWxlID0geworICAgICAgbm9Jbml0aWFsUnVuIDogdHJ1ZQorICAgIH07CisgIDwvc2NyaXB0PgorICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisKKyd1c2Ugc3RyaWN0JzsKKworLy8gbWFpbiB3cmFwcGVyIGZvciB0aGUgZnVuY3Rpb24gZGVjb2RpbmcgYSBXZWJQIGludG8gYSBjYW52YXMgb2JqZWN0Cit2YXIgV2VicFRvQ2FudmFzOworCitmdW5jdGlvbiBpbml0KCkgeworICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgIHhoci5vcGVuKCdHRVQnLCAnd2VicF93YXNtLndhc20nLCB0cnVlKTsKKyAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHsKKyAgICBNb2R1bGUud2FzbUJpbmFyeSA9IHhoci5yZXNwb25zZTsKKyAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CisgICAgc2NyaXB0LnNyYyA9ICJ3ZWJwX3dhc20uanMiOworICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2NyaXB0KTsKKyAgfTsKKyAgeGhyLnNlbmQobnVsbCk7Cit9Cit3aW5kb3cub25sb2FkID0gaW5pdDsKKworZnVuY3Rpb24gZGVjb2RlKHdlYnBfZGF0YSwgY2FudmFzX2lkKSB7CisgIHZhciByZXN1bHQ7CisgIGlmIChNb2R1bGVbImFzbSJdICE9IHVuZGVmaW5lZCkgeworICAgIC8vIHdyYXBwZXIgZm9yIHRoZSBmdW5jdGlvbiBkZWNvZGluZyBhIFdlYlAgaW50byBhIGNhbnZhcyBvYmplY3QKKyAgICBXZWJwVG9DYW52YXMgPSBNb2R1bGUuY3dyYXAoJ1dlYnBUb1NETCcsICdudW1iZXInLCBbJ2FycmF5JywgJ251bWJlciddKTsKKyAgICAvLyBnZXQgdGhlIGNhbnZhcyB0byBkZWNvZGUgaW50bworICAgIHZhciBjYW52YXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYW52YXNfaWQpOworICAgIGlmIChjYW52YXMgPT0gbnVsbCkgcmV0dXJuOworICAgIC8vIGNsZWFyIHByZXZpb3VzIHBpY3R1cmUgKGlmIGFueSkKKyAgICBNb2R1bGUuY2FudmFzID0gY2FudmFzOworICAgIGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpLmNsZWFyUmVjdCgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpOworICAgIC8vIGRlY29kZSBhbmQgbWVhc3VyZSB0aW1pbmcKKyAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSgpOworICAgIHZhciByZXQgPSBXZWJwVG9DYW52YXMod2VicF9kYXRhLCB3ZWJwX2RhdGEubGVuZ3RoKTsKKyAgICB2YXIgZW5kID0gbmV3IERhdGUoKTsKKyAgICB2YXIgZGVjb2RlX3RpbWUgPSBlbmQgLSBzdGFydDsKKyAgICByZXN1bHQgPSAnZGVjb2RpbmcgdGltZTogJyArIGRlY29kZV90aW1lICsnIG1zLic7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0ID0gIldBU00gbW9kdWxlIG5vdCBmaW5pc2hlZCBsb2FkaW5nISBQbGVhc2UgcmV0cnkiOworICB9CisgIC8vIGRpc3BsYXkgdGltaW5nIHJlc3VsdAorICB2YXIgc3BlZWRfcmVzdWx0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RpbWluZycpOworICBpZiAoc3BlZWRfcmVzdWx0ICE9IG51bGwpIHsKKyAgICBzcGVlZF9yZXN1bHQuaW5uZXJIVE1MID0gJzxwPicrIHJlc3VsdCArICc8L3A+JzsKKyAgfQorfQorCitmdW5jdGlvbiBsb2FkZmlsZShmaWxlbmFtZSwgY2FudmFzX2lkKSB7CisgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgeGhyLm9wZW4oJ0dFVCcsIGZpbGVuYW1lKTsKKyAgeGhyLnJlc3BvbnNlVHlwZSA9ICdhcnJheWJ1ZmZlcic7CisgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKKyAgICBpZiAoeGhyLnJlYWR5U3RhdGUgPT0gNCAmJiB4aHIuc3RhdHVzID09IDIwMCkgeworICAgICAgdmFyIHdlYnBfZGF0YSA9IG5ldyBVaW50OEFycmF5KHhoci5yZXNwb25zZSk7CisgICAgICBkZWNvZGUod2VicF9kYXRhLCBjYW52YXNfaWQpOworICAgIH0KKyAgfTsKKyAgeGhyLnNlbmQoKTsKK30KKyAgPC9zY3JpcHQ+Cis8L2hlYWQ+CisKKzxib2R5PgorICA8cD4KKyAgICA8c3Ryb25nPldlYlAgZGVtbyB1c2luZyBXZWItQXNzZW1ibHk8L3N0cm9uZz4gLQorICA8L3A+CisgIDxwPgorICAgIFdBU00gdmVyc2lvbiBvZiB0aGUgV2ViUCBkZWNvZGVyLCB1c2luZyBsaWJ3ZWJwIGNvbXBpbGVkIHdpdGgKKyAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va3JpcGtlbi9lbXNjcmlwdGVuL3dpa2kiPkVtc2NyaXB0ZW48L2E+LgorICA8L3A+CisgIDxwIGlkPSJpbWFnZV9idXR0b25zIj4KKyAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0idGVzdCBpbWFnZSEiCisgICAgICAgICAgIG9uY2xpY2s9ImxvYWRmaWxlKCcuL3Rlc3Rfd2VicF93YXNtLndlYnAnLCAnb3V0cHV0X2NhbnZhcycpIj4KKyAgPC9wPgorICA8cCBpZD0idGltaW5nIj5UaW1pbmc6IE4vQTwvcD4KKyAgPGNhbnZhcyBpZD0ib3V0cHV0X2NhbnZhcyI+WW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgY2FudmFzPC9jYW52YXM+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF9qcy53ZWJwIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfanMud2VicApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzk4ZjU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2xpYndlYnAvd2VicF9qcy90ZXN0X3dlYnBfanMud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF93YXNtLndlYnAgYi9zcmMvdGhpcmRfcGFydHkvbGlid2VicC93ZWJwX2pzL3Rlc3Rfd2VicF93YXNtLndlYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc5OGY1NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9saWJ3ZWJwL3dlYnBfanMvdGVzdF93ZWJwX3dhc20ud2VicApCaW5hcnkgZmlsZXMgZGlmZmVyCg==